diff --git a/.devcontainer/50installRequirements.sh b/.devcontainer/50installRequirements.sh index 33d7f4799..931b1e615 100755 --- a/.devcontainer/50installRequirements.sh +++ b/.devcontainer/50installRequirements.sh @@ -11,7 +11,7 @@ if [ -f /proc/self/mountinfo ] && grep -q '/_data[[:space:]]/app[[:space:]]' /pr # `/app` is *not* mounted as a volume. Skip installation to avoid polluting # the image and to respect the caller's intent. echo "Skipping requirements installation because /app is not a mounted volume." >&2 -elif [ -f requirements.txt ]; then +elif [ -f requirements.txt ]; then # `/app` **is** a separate mount โ†’ proceed with installation. pyenv local 3.10.17 python -m pip install --no-cache-dir -r requirements.txt diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index f417ede46..2cae75a26 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,8 +2,7 @@ "name": "CleverErnie Dev Environment", "dockerFile": "Dockerfile", "context": "..", - - // Configure tool-specific properties + "customizations": { "vscode": { "settings": { @@ -58,16 +57,12 @@ } }, - // Use 'postCreateCommand' to run commands after the container is created "postCreateCommand": ".devcontainer/post-create.sh", - // Use 'postStartCommand' to run commands after the container starts - "postStartCommand": "echo 'Welcome to your Python 3.13 development environment! ๐Ÿš€'", + "postStartCommand": "echo 'Welcome to your Python 3.13 development environment!'", - // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root "remoteUser": "vscode", - // Features to add to the dev container "features": { "ghcr.io/devcontainers/features/common-utils:2": { "installZsh": true, @@ -98,7 +93,6 @@ } }, - // Configure container environment "containerEnv": { "PYTHONPATH": "/app/src", "PYTHONDONTWRITEBYTECODE": "1", @@ -109,14 +103,12 @@ "NODE_PATH": "/usr/local/lib/node_modules" }, - // Mounts "mounts": [ "source=${localWorkspaceFolder}/.devcontainer/bashrc-append.sh,target=/tmp/bashrc-append.sh,type=bind,consistency=cached", "source=cleverernie-uv-cache,target=/tmp/uv-cache,type=volume", "source=cleverernie-mcp-cache,target=/home/vscode/.local/share/mcp-logs,type=volume" ], - // Port forwarding "forwardPorts": [8000, 8080, 3000, 9090, 3001], "portsAttributes": { "8000": { @@ -124,7 +116,7 @@ "onAutoForward": "notify" }, "8080": { - "label": "Development Server", + "label": "Development Server", "onAutoForward": "silent" }, "3000": { @@ -141,11 +133,9 @@ } }, - // Lifecycle scripts - "initializeCommand": "echo 'Initializing CleverErnie Dev Environment...',", + "initializeCommand": "echo 'Initializing CleverErnie Dev Environment...'", "onCreateCommand": "echo 'Creating development environment...'", - // Resource limits (increased for MCP servers and Claude Code) "hostRequirements": { "cpus": 4, "memory": "8gb", diff --git a/.opencode/agents/git-checkout-util.md b/.opencode/agents/git-checkout-util.md index c039bc885..b0b32b3f8 100644 --- a/.opencode/agents/git-checkout-util.md +++ b/.opencode/agents/git-checkout-util.md @@ -206,4 +206,4 @@ For optional parameters not provided in your prompt, you may fall back to the en ## **CRITICAL** Rules -- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. \ No newline at end of file +- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. diff --git a/.opencode/agents/git-cleanup-util.md b/.opencode/agents/git-cleanup-util.md index bbad57dba..11626ae84 100644 --- a/.opencode/agents/git-cleanup-util.md +++ b/.opencode/agents/git-cleanup-util.md @@ -165,4 +165,4 @@ error: ## **CRITICAL** Rules -- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. \ No newline at end of file +- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. diff --git a/.opencode/agents/git-clone-util.md b/.opencode/agents/git-clone-util.md index d9eac6930..14f402978 100644 --- a/.opencode/agents/git-clone-util.md +++ b/.opencode/agents/git-clone-util.md @@ -209,4 +209,4 @@ For optional parameters not provided in your prompt, you may fall back to the en ## **CRITICAL** Rules -- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. \ No newline at end of file +- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. diff --git a/.opencode/agents/git-commit-and-push-util.md b/.opencode/agents/git-commit-and-push-util.md index 1baa3e33a..d74fa23f6 100644 --- a/.opencode/agents/git-commit-and-push-util.md +++ b/.opencode/agents/git-commit-and-push-util.md @@ -184,4 +184,4 @@ You compose `git-stage-util` โ†’ `git-create-commit-util` โ†’ `git-push-util` ## **CRITICAL** Rules -- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. \ No newline at end of file +- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. diff --git a/.opencode/agents/git-create-commit-util.md b/.opencode/agents/git-create-commit-util.md index 91b9f0aa6..d6445f20a 100644 --- a/.opencode/agents/git-create-commit-util.md +++ b/.opencode/agents/git-create-commit-util.md @@ -184,4 +184,4 @@ error: ## **CRITICAL** Rules -- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. \ No newline at end of file +- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. diff --git a/.opencode/agents/git-fetch-util.md b/.opencode/agents/git-fetch-util.md index 7f7f29cb0..6b105a41c 100644 --- a/.opencode/agents/git-fetch-util.md +++ b/.opencode/agents/git-fetch-util.md @@ -163,4 +163,4 @@ error: ## **CRITICAL** Rules -- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. \ No newline at end of file +- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. diff --git a/.opencode/agents/git-force-push-with-lease-util.md b/.opencode/agents/git-force-push-with-lease-util.md index 78bea4761..a785e2968 100644 --- a/.opencode/agents/git-force-push-with-lease-util.md +++ b/.opencode/agents/git-force-push-with-lease-util.md @@ -204,4 +204,4 @@ lease. Execute these steps exactly. ## **CRITICAL** Rules -- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. \ No newline at end of file +- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. diff --git a/.opencode/agents/git-push-util.md b/.opencode/agents/git-push-util.md index 64f8fc8bf..848a30ecc 100644 --- a/.opencode/agents/git-push-util.md +++ b/.opencode/agents/git-push-util.md @@ -199,4 +199,4 @@ For optional parameters not provided in your prompt, you may fall back to the en ## **CRITICAL** Rules -- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. \ No newline at end of file +- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. diff --git a/.opencode/agents/git-rebase-and-push-util.md b/.opencode/agents/git-rebase-and-push-util.md index a0417ce7b..7a65da5ba 100644 --- a/.opencode/agents/git-rebase-and-push-util.md +++ b/.opencode/agents/git-rebase-and-push-util.md @@ -106,7 +106,7 @@ permission: "printenv *": allow "git -C * remote get-url origin": allow "git remote get-url origin": allow - + "git -C /tmp/*": allow # Universal auto-agents-system bash blocks @@ -188,4 +188,4 @@ You compose `git-fetch-util` โ†’ `git-rebase-util` โ†’ `git-push-util` ## **CRITICAL** Rules -- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. \ No newline at end of file +- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. diff --git a/.opencode/agents/git-stage-util.md b/.opencode/agents/git-stage-util.md index 5f1f466ff..9c66de021 100644 --- a/.opencode/agents/git-stage-util.md +++ b/.opencode/agents/git-stage-util.md @@ -171,4 +171,4 @@ error: ## **CRITICAL** Rules -- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. \ No newline at end of file +- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. diff --git a/.opencode/agents/pr-merge-supervisor.md b/.opencode/agents/pr-merge-supervisor.md index 463c0a25e..1d41666bb 100644 --- a/.opencode/agents/pr-merge-supervisor.md +++ b/.opencode/agents/pr-merge-supervisor.md @@ -311,4 +311,4 @@ The hardcoded values in the template (worker subagent name, work groups, fetch a - **Pass all credentials verbatim.** Do not interpret, summarise, or modify any credential or configuration content received in your prompt โ€” embed it as-is into the supervisor prompt template. - **Only pass explicitly-present variables.** When constructing the supervisor prompt, include only variables that were **explicitly present** in your prompt. Omit any variable you fetched from environment variables or git remote โ€” the supervisor subagent will fetch them itself. -- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. \ No newline at end of file +- **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. diff --git a/.opencode/agents/pr-merge-worker.md b/.opencode/agents/pr-merge-worker.md index fed8a9888..b012533b9 100644 --- a/.opencode/agents/pr-merge-worker.md +++ b/.opencode/agents/pr-merge-worker.md @@ -433,4 +433,4 @@ The `git-rebase-util` needs the working directory of the isolated clone and the ## **CRITICAL** Rules -1. **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. \ No newline at end of file +1. **CRITICAL:** Never under **any** circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is **COMPLETELY FORBIDDEN** for you to ever ask a question. diff --git a/.opencode/agents/pr-review-worker.md b/.opencode/agents/pr-review-worker.md index ad4db7e62..94891c282 100644 --- a/.opencode/agents/pr-review-worker.md +++ b/.opencode/agents/pr-review-worker.md @@ -141,7 +141,7 @@ permission: "*FORGEJO_PAT*": deny "*FORGEJO_USERNAME*": deny "*FORGEJO_PASSWORD*": deny - + "*force_merge*": deny "*sudo*": deny diff --git a/.opencode/agents/session-health-full-util.md b/.opencode/agents/session-health-full-util.md index 410d0bff1..6df97940d 100644 --- a/.opencode/agents/session-health-full-util.md +++ b/.opencode/agents/session-health-full-util.md @@ -108,7 +108,7 @@ permission: "printenv *": allow "git -C * remote get-url origin": allow "git remote get-url origin": allow - + "npx --yes tsx /app/.opencode/skills/auto-agents-system/scripts/session_*": allow "*api/v1/orgs/*/labels*": deny "*api/v1/repos/*/labels*": deny diff --git a/.opencode/agents/session-health-quick-util.md b/.opencode/agents/session-health-quick-util.md index 0c2473208..e6bb385e2 100644 --- a/.opencode/agents/session-health-quick-util.md +++ b/.opencode/agents/session-health-quick-util.md @@ -108,7 +108,7 @@ permission: "printenv *": allow "git -C * remote get-url origin": allow "git remote get-url origin": allow - + "npx --yes tsx /app/.opencode/skills/auto-agents-system/scripts/session_*": allow "*api/v1/orgs/*/labels*": deny "*api/v1/repos/*/labels*": deny diff --git a/.opencode/agents/session-health-util.md b/.opencode/agents/session-health-util.md index 4fc5e934e..0401bdcac 100644 --- a/.opencode/agents/session-health-util.md +++ b/.opencode/agents/session-health-util.md @@ -108,7 +108,7 @@ permission: "printenv *": allow "git -C * remote get-url origin": allow "git remote get-url origin": allow - + "npx --yes tsx /app/.opencode/skills/auto-agents-system/scripts/session_messages.ts*": allow "*api/v1/orgs/*/labels*": deny "*api/v1/repos/*/labels*": deny diff --git a/.opencode/skills/cleveragents-contributing/SKILL.md b/.opencode/skills/cleveragents-contributing/SKILL.md index 6934321dc..0000fe9c8 100644 --- a/.opencode/skills/cleveragents-contributing/SKILL.md +++ b/.opencode/skills/cleveragents-contributing/SKILL.md @@ -46,43 +46,43 @@ Python import rules are, what the exact backwards compatibility policy is name to use, whether something should be an Issue vs Epic vs Legendary, or any other project-specific question. -Some examples of things covered by this skill: +Some examples of things covered by this skill: -- Exact directory layout (src/cleveragents, features/, features/mocks/, robot/, +- Exact directory layout (src/cleveragents, features/, features/mocks/, robot/, docs/, config/, scripts/, examples/, k8s/, benchmarks/) -- Issue anatomy (Metadata section, Subtasks checklist, Definition of Done, 11 +- Issue anatomy (Metadata section, Subtasks checklist, Definition of Done, 11 quality criteria, label rules, Ref field, parent links) - Ticket hierarchy (Issue vs Epic vs Legendary) -- Ticket lifecycle state machine (Unverified โ†’ Verified โ†’ In progress โ†’ In +- Ticket lifecycle state machine (Unverified โ†’ Verified โ†’ In progress โ†’ In review โ†’ Completed) - Triaging rules - Branch naming (feature/mN-, bugfix/mN-, tdd/mN- with milestone number) -- Commit quality rules (atomic, bisect-friendly, prescribed first line from +- Commit quality rules (atomic, bisect-friendly, prescribed first line from Metadata, interactive staging, squash/rebase hygiene) -- PR requirements (all 12 requirements, critical dependency direction: PR blocks - issue not vice versa, one Epic per PR, milestone, Type/label, post-submission +- PR requirements (all 12 requirements, critical dependency direction: PR blocks + issue not vice versa, one Epic per PR, milestone, Type/label, post-submission responsibilities) -- Code writing rules (spec-first, ADR for architectural changes, argument +- Code writing rules (spec-first, ADR for architectural changes, argument validation first in every public method, SOLID patterns) -- Documentation traceability (no line numbers, module.class.method + commit hash, +- Documentation traceability (no line numbers, module.class.method + commit hash, same-commit requirement, single canonical surface, ADR process) - Behave BDD unit testing with exact step-file naming rules and Gherkin quality - Robot Framework integration testing (real services, no mocks), full TDD bug fix workflow with three-tag system and AssertionError enforcement - Multi-level testing mandate (unit + integration + benchmarks for every task) -- All nox sessions (unit_tests, integration_tests, e2e_tests, coverage_report, - lint, typecheck, security_scan, dead_code, complexity, benchmark, +- All nox sessions (unit_tests, integration_tests, e2e_tests, coverage_report, + lint, typecheck, security_scan, dead_code, complexity, benchmark, benchmark_regression, docs, build, format) -- 97% coverage as hard merge gate (measured by Slipcover via nox -s - coverage_report) +- 97% coverage as hard merge gate (measured by Slipcover via nox -s + coverage_report) - Pyright strict type checking (no # type: ignore ever) - Python import rules (top of file, if TYPE_CHECKING: exception) - Mock placement (features/mocks/ only) -- All 13 CI/CD jobs and 3 workflow files with triggers, 5 required-for-merge +- All 13 CI/CD jobs and 3 workflow files with triggers, 5 required-for-merge checks -- LangChain/LangGraph patterns (TypedDict state, MemorySaver, BaseLanguageModel, +- LangChain/LangGraph patterns (TypedDict state, MemorySaver, BaseLanguageModel, FakeListLLM, RxPY streams) -- Plan lifecycle migration (agents plan use vs agents tell, ULID format, separate +- Plan lifecycle migration (agents plan use vs agents tell, ULID format, separate storage backends, no migration path) - Backwards compatibility policy (none pre-v3.0.0) - docs/specification.md as authoritative source diff --git a/.opencode/skills/forgejo-api/references/pull-requests/README.md b/.opencode/skills/forgejo-api/references/pull-requests/README.md index 675445c19..23138190c 100644 --- a/.opencode/skills/forgejo-api/references/pull-requests/README.md +++ b/.opencode/skills/forgejo-api/references/pull-requests/README.md @@ -323,7 +323,7 @@ if [ "$PR_BASE_SHA" != "$CURRENT_BASE_SHA" ]; then echo "PR is stale. Base branch has advanced." echo "PR base SHA: $PR_BASE_SHA" echo "Current base SHA: $CURRENT_BASE_SHA" - + # Optionally update the PR branch server-side curl -s -X POST \ -H "Authorization: token ${FORGEJO_PAT}" \ diff --git a/.opencode/skills/forgejo-api/references/pull-requests/merging.md b/.opencode/skills/forgejo-api/references/pull-requests/merging.md index 04595a807..f28161b25 100644 --- a/.opencode/skills/forgejo-api/references/pull-requests/merging.md +++ b/.opencode/skills/forgejo-api/references/pull-requests/merging.md @@ -366,14 +366,14 @@ if [ "$PR_BASE_SHA" != "$CURRENT_BASE_SHA" ]; then UPDATE_RESULT=$(curl -s -w "\n%{http_code}" -X POST \ -H "Authorization: token ${FORGEJO_PAT}" \ "${FORGEJO_URL}/api/v1/repos/${OWNER}/${REPO}/pulls/${PR_INDEX}/update?style=rebase") - + UPDATE_CODE=$(echo "$UPDATE_RESULT" | tail -1) if [ "$UPDATE_CODE" = "409" ]; then echo "Conflict during update. Resolve manually." exit 1 fi echo "Branch updated successfully." - + # Re-fetch PR to get updated mergeable status sleep 2 PR=$(curl -s \ diff --git a/.opencode/skills/forgejo-api/references/repositories/flags.md b/.opencode/skills/forgejo-api/references/repositories/flags.md index d21c739cb..c4f404415 100644 --- a/.opencode/skills/forgejo-api/references/repositories/flags.md +++ b/.opencode/skills/forgejo-api/references/repositories/flags.md @@ -190,7 +190,7 @@ for REPO in {repo1} {repo2} {repo3}; do HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \ "${FORGEJO_URL}/api/v1/repos/${OWNER}/${REPO}/flags/{flag}" \ -H "Authorization: token ${FORGEJO_PAT}") - + if [ "$HTTP_CODE" = "204" ]; then echo "${REPO}: verified" else diff --git a/.opencode/skills/forgejo-api/references/repositories/issue-config.md b/.opencode/skills/forgejo-api/references/repositories/issue-config.md index 0bd1724fb..a6d45614f 100644 --- a/.opencode/skills/forgejo-api/references/repositories/issue-config.md +++ b/.opencode/skills/forgejo-api/references/repositories/issue-config.md @@ -220,9 +220,9 @@ What actually happened. ## Environment -- OS: -- Browser: -- Version: +- OS: +- Browser: +- Version: ``` ### YAML Form Template Example diff --git a/.opencode/skills/forgejo-api/references/users/emails.md b/.opencode/skills/forgejo-api/references/users/emails.md index 479729b42..448578406 100644 --- a/.opencode/skills/forgejo-api/references/users/emails.md +++ b/.opencode/skills/forgejo-api/references/users/emails.md @@ -237,7 +237,7 @@ while true; do VERIFIED=$(curl -s "${FORGEJO_URL}/api/v1/user/emails" \ -H "Authorization: token ${FORGEJO_PAT}" \ | jq -r '.[] | select(.email == "newemail@example.com") | .verified') - + if [ "$VERIFIED" = "true" ]; then echo "Email verified!" break diff --git a/.opencode/skills/forgejo-api/references/users/quota.md b/.opencode/skills/forgejo-api/references/users/quota.md index 6f398261d..49927fee0 100644 --- a/.opencode/skills/forgejo-api/references/users/quota.md +++ b/.opencode/skills/forgejo-api/references/users/quota.md @@ -354,7 +354,7 @@ REPO_LIMIT=$(echo "$QUOTA" | jq '[.groups[].rules[] | select(.subjects[] == "siz if [ "$REPO_LIMIT" != "null" ] && [ "$REPO_LIMIT" != "-1" ] && [ "$REPO_LIMIT" -gt 0 ]; then PERCENT=$(( REPO_USED * 100 / REPO_LIMIT )) echo "Repo usage: ${REPO_USED} / ${REPO_LIMIT} bytes (${PERCENT}%)" - + if [ "$PERCENT" -ge 90 ]; then echo "WARNING: Over 90% of repo quota used!" elif [ "$PERCENT" -ge 75 ]; then diff --git a/.opencode/skills/forgejo-api/references/web-interface/ci-logs.md b/.opencode/skills/forgejo-api/references/web-interface/ci-logs.md index de30dbb74..a870e03e5 100644 --- a/.opencode/skills/forgejo-api/references/web-interface/ci-logs.md +++ b/.opencode/skills/forgejo-api/references/web-interface/ci-logs.md @@ -70,7 +70,7 @@ The action run page contains log content embedded in the HTML. Extract it for an ```bash # Example: extract log lines from the HTML -echo "$ACTION_PAGE" | grep -oP 'log-msg[^>]*>\K[^<]+' +echo "$ACTION_PAGE" | grep -oP 'log-msg[^>]*>\K[^<]+' ``` ## Complete Script @@ -121,7 +121,7 @@ curl -sS -L -c "$COOKIE_JAR" -b "$COOKIE_JAR" \ for job_url in $FAILING; do echo "=== Fetching logs for: ${job_url} ===" PAGE=$(curl -sS -b "$COOKIE_JAR" "${FORGEJO_URL}${job_url}") - + # Extract log content (parsing depends on Forgejo version / HTML structure) echo "$PAGE" | grep -oP 'log-msg[^>]*>\K[^<]+' || echo "(Could not parse logs from HTML)" echo "" diff --git a/.opencode/skills/programming-patterns/SKILL.md b/.opencode/skills/programming-patterns/SKILL.md index 2ee94bd87..3815ded8e 100644 --- a/.opencode/skills/programming-patterns/SKILL.md +++ b/.opencode/skills/programming-patterns/SKILL.md @@ -2422,7 +2422,7 @@ Patterns applied: ``` Stage 1: First working version (1 pattern) โ””โ”€ Guard Clause โ€” at minimum, validate inputs - + Stage 2: Making it testable (3 patterns) โ”œโ”€ Dependency Injection โ€” inject the DB dependency โ”œโ”€ Repository โ€” abstract the data access diff --git a/.opencode/skills/programming-patterns/references/behavioral/iterator.md b/.opencode/skills/programming-patterns/references/behavioral/iterator.md index 94a31af1e..dd43f5e07 100644 --- a/.opencode/skills/programming-patterns/references/behavioral/iterator.md +++ b/.opencode/skills/programming-patterns/references/behavioral/iterator.md @@ -131,8 +131,8 @@ if __name__ == "__main__": **Output:** ``` === Class-based iterator (for loop) === -0 1 1 2 3 5 8 13 21 34 - +0 1 1 2 3 5 8 13 21 34 + === Manual iteration === Got: 0 Got: 1 @@ -142,7 +142,7 @@ if __name__ == "__main__": Done! === Generator function === -0 1 1 2 3 5 8 13 21 34 +0 1 1 2 3 5 8 13 21 34 === Multiple independent iterators === iter1: 0, 1, 1 @@ -239,13 +239,13 @@ func main() { **Output:** ``` === Closure-based iterator === -0 1 1 2 3 5 8 13 21 34 +0 1 1 2 3 5 8 13 21 34 === Slice-based (eager) === -0 1 1 2 3 5 8 13 21 34 +0 1 1 2 3 5 8 13 21 34 === Channel-based iterator === -0 1 1 2 3 5 8 13 21 34 +0 1 1 2 3 5 8 13 21 34 === Two independent iterators === iter1: 0, 1, 1 diff --git a/LICENSE b/LICENSE index e06d20818..5c304d1a4 100644 --- a/LICENSE +++ b/LICENSE @@ -199,4 +199,3 @@ Apache License WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - diff --git a/asv/benchmarks/__init__.py b/asv/benchmarks/__init__.py index 8b1378917..e69de29bb 100644 --- a/asv/benchmarks/__init__.py +++ b/asv/benchmarks/__init__.py @@ -1 +0,0 @@ - diff --git a/benchmarks/core_circuit_breaker_bench.py b/benchmarks/core_circuit_breaker_bench.py index 4ff9edb74..18339faa6 100644 --- a/benchmarks/core_circuit_breaker_bench.py +++ b/benchmarks/core_circuit_breaker_bench.py @@ -7,6 +7,7 @@ state transitions, and fast-fail latency in open state. from __future__ import annotations import asyncio +import contextlib import time from cleveragents.core.circuit_breaker import ( @@ -74,17 +75,13 @@ class CircuitBreakerOpenStateBench: ) # Force the breaker into open state for _ in range(3): - try: + with contextlib.suppress(ZeroDivisionError): self.breaker.call(lambda: 1 / 0) # Raise ZeroDivisionError - except ZeroDivisionError: - pass def time_fast_fail(self) -> None: """Benchmark fast-fail latency when circuit is open.""" - try: + with contextlib.suppress(CircuitBreakerOpen): self.breaker.call(lambda: "should not execute") - except CircuitBreakerOpen: - pass def time_open_state_check(self) -> None: """Benchmark state check when open.""" @@ -111,10 +108,8 @@ class CircuitBreakerClosedToOpenTransitionBench: """Benchmark transition from closed to open state.""" # Trigger failures to transition to open for _ in range(3): - try: + with contextlib.suppress(ZeroDivisionError): self.breaker.call(lambda: 1 / 0) - except ZeroDivisionError: - pass class CircuitBreakerOpenToHalfOpenTransitionBench: @@ -134,20 +129,16 @@ class CircuitBreakerOpenToHalfOpenTransitionBench: ) # Force to open state for _ in range(3): - try: + with contextlib.suppress(ZeroDivisionError): self.breaker.call(lambda: 1 / 0) - except ZeroDivisionError: - pass # Wait for recovery timeout so transition to half-open is possible time.sleep(0.1) def time_open_to_half_open_transition(self) -> None: """Benchmark transition from open to half-open state.""" # Attempt call to trigger half-open transition - try: + with contextlib.suppress(CircuitBreakerOpen): self.breaker.call(lambda: "success") - except CircuitBreakerOpen: - pass class CircuitBreakerHalfOpenToClosedTransitionBench: @@ -167,10 +158,8 @@ class CircuitBreakerHalfOpenToClosedTransitionBench: ) # Force to open state for _ in range(3): - try: + with contextlib.suppress(ZeroDivisionError): self.breaker.call(lambda: 1 / 0) - except ZeroDivisionError: - pass # Wait for recovery timeout so breaker enters half-open on next call time.sleep(0.1) @@ -205,10 +194,8 @@ class CircuitBreakerAsyncBench: name="test_service_open", ) for _ in range(3): - try: + with contextlib.suppress(ZeroDivisionError): self.open_breaker.call(lambda: 1 / 0) - except ZeroDivisionError: - pass def time_async_call_success(self) -> None: """Benchmark successful async call overhead.""" @@ -232,10 +219,8 @@ class CircuitBreakerAsyncBench: async def dummy_async() -> str: return "should not execute" - try: + with contextlib.suppress(CircuitBreakerOpen): asyncio.run(self.open_breaker.async_call(dummy_async)) - except CircuitBreakerOpen: - pass class CircuitBreakerInitializationBench: diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 06c71c580..a18bee86c 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -456,4 +456,3 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). renders permission requests directly in the conversation stream for single-file operations. Users can allow/reject with single-key shortcuts (`a`/`A`/`r`/`R`), navigate with arrow keys, confirm with `Enter`, or press `v` to open the full - diff --git a/docs/adr/ADR-033-decision-recording-protocol.md b/docs/adr/ADR-033-decision-recording-protocol.md index 0ff9f1677..801f12906 100644 --- a/docs/adr/ADR-033-decision-recording-protocol.md +++ b/docs/adr/ADR-033-decision-recording-protocol.md @@ -173,17 +173,17 @@ During the Strategize phase, the strategy actor follows a structured reasoning l def strategize(plan, context): # System has already created the prompt_definition root decision # Invariant Reconciliation Actor has already recorded invariant_enforced decisions - + # Actor receives: plan description, enforced invariants, project context - + while unresolved_ambiguities_remain(plan, context): # 1. Identify a choice point choice_point = analyze_context_for_ambiguity(context) - + # 2. Evaluate options options = generate_options(choice_point, context) best_option = evaluate_options(options, context, invariants) - + # 3. Record the decision via tool call decision_id = record_decision( decision_type = choice_point.type, # strategy_choice, subplan_spawn, etc. @@ -193,10 +193,10 @@ def strategize(plan, context): confidence_score = best_option.confidence, rationale = best_option.rationale ) - + # 4. Decision becomes part of the actor's context for subsequent reasoning context.add_decision(decision_id) - + # Result: a complete decision tree for this plan's strategy ``` diff --git a/docs/adr/ADR-035-decision-tree-rollback-and-replay.md b/docs/adr/ADR-035-decision-tree-rollback-and-replay.md index c78c5054e..9a43ec2ff 100644 --- a/docs/adr/ADR-035-decision-tree-rollback-and-replay.md +++ b/docs/adr/ADR-035-decision-tree-rollback-and-replay.md @@ -165,7 +165,7 @@ When `agents plan correct --mode=revert` targets an Execute-phase WARNING: The following resources cannot be rolled back (sandbox strategy: none): - local/external-api - local/notification-service - + Resource changes since this decision will persist. Proceed with rollback of other resources? [y/N] ``` @@ -179,7 +179,7 @@ When `agents plan correct --mode=revert` targets an Execute-phase irreversible external effects: - local/deploy-to-staging (1 invocation) โ€” external deployment - local/send-notification (2 invocations) โ€” emails sent - + Sandbox resources can be rolled back, but external effects cannot be undone. Proceed? [y/N] ``` @@ -239,29 +239,29 @@ def compute_affected_subtree(target_decision_id: str) -> tuple[set[str], set[str affected_decisions = {target_decision_id} affected_plans = set() queue = [target_decision_id] - + while queue: current = queue.pop(0) - + # Follow structural tree children children = db.query( "SELECT decision_id FROM decisions " "WHERE parent_decision_id = :current AND superseded_by IS NULL", current=current ) - + # Follow influence DAG dependents dependents = db.query( "SELECT downstream_ref FROM decision_dependencies " "WHERE upstream_decision_id = :current AND dependency_type = 'decision'", current=current ) - + for decision_id in children | dependents: if decision_id not in affected_decisions: affected_decisions.add(decision_id) queue.append(decision_id) - + # Collect affected child plans child_plans = db.query( "SELECT downstream_ref FROM decision_dependencies " @@ -269,7 +269,7 @@ def compute_affected_subtree(target_decision_id: str) -> tuple[set[str], set[str current=current ) affected_plans.update(child_plans) - + return affected_decisions, affected_plans ``` diff --git a/docs/development/agent-system-specification.md b/docs/development/agent-system-specification.md index f41365ad2..2ef0008e9 100644 --- a/docs/development/agent-system-specification.md +++ b/docs/development/agent-system-specification.md @@ -76,7 +76,7 @@ blockdiag { label = "Tier 2: Workers"; color = "#FCE4EC"; "Implementation Worker\n(issue-impl mode)" [color = "#C62828", textcolor = "#fff"]; - + "PR Reviewer" [color = "#C62828", textcolor = "#fff"]; "UAT Worker" [color = "#C62828", textcolor = "#fff"]; "Bug Hunter Worker" [color = "#C62828", textcolor = "#fff"]; @@ -3379,10 +3379,10 @@ FG --> BGR : cleanup old tickets note bottom of FG Tracking issues follow format: [PREFIX] Type (Cycle N) - + Announcements follow format: [PREFIX] Announce: message - + ALL carry "Automation Tracking" label end note @enduml diff --git a/docs/development/automation-tracking.md b/docs/development/automation-tracking.md index dfd206aa2..e91b952a2 100644 --- a/docs/development/automation-tracking.md +++ b/docs/development/automation-tracking.md @@ -240,7 +240,7 @@ for issue in automation_tracking_issues: expected_interval = get_expected_interval(issue.agent_prefix, issue.type) time_since_creation = now() - issue.created_at staleness_threshold = expected_interval * 1.2 # 20% tolerance - + if time_since_creation > staleness_threshold: mark_agent_as_stalled(issue.agent_prefix) trigger_recovery_actions(issue.agent_prefix, issue) diff --git a/docs/faq.md b/docs/faq.md index 429eced56..763bc69cb 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -59,7 +59,7 @@ Plan: Convert Firefox Renderer to Rust โ”œโ”€โ”€ [strategy_choice] Architecture approach: Start with leaf modules, work inward โ”‚ Context: Analyzed module dependency graph, 2,847 modules total โ”‚ Resources: module_graph.json, architecture_docs.md -โ”‚ +โ”‚ โ”œโ”€โ”€ [subplan_parallel_spawn] Phase 1: Convert utility libraries (no external deps) โ”‚ โ””โ”€โ”€ [subplan_spawn] Convert string_utils module โ”‚ โ””โ”€โ”€ Plan: 01KH29R8WPKPBHRY7Q0NA9XW86 @@ -87,21 +87,21 @@ During the Strategize phase, the strategy actor employs several mechanisms to co # Pseudocode of what happens inside a strategy actor def compute_closure_for_refactoring(target_module): closure = ResourceClosure() - + # Direct file dependencies closure.add_files(find_imports(target_module)) closure.add_files(find_includes(target_module)) - + # Symbol dependencies for symbol in extract_exported_symbols(target_module): closure.add_files(find_symbol_usage(symbol, scope='project')) - + # Test dependencies closure.add_files(find_tests_for_module(target_module)) - + # Build system dependencies closure.add_files(find_build_references(target_module)) - + return closure @@ -117,10 +117,10 @@ During the Strategize phase, the strategy actor employs several mechanisms to co decision_type: subplan_spawn chosen_option: "Refactor authentication module" downstream_plan_ids: ["plan-auth-refactor-123"] - artifacts_produced: + artifacts_produced: - auth_module_files: ["auth.rs", "auth_test.rs", "auth_types.rs"] - api_updates: ["api/v2/login.rs", "api/v2/logout.rs"] - + # Parallel group of child plans decision_type: subplan_parallel_spawn chosen_option: "Convert utility libraries in parallel" @@ -137,14 +137,14 @@ STRATEGIZE PHASE: - Identifies 847 C++ files in netwerk/ directory - Traces public API surface (237 exported functions) - Maps internal dependencies (1,432 internal calls) - + 2. Compute minimal closure for Phase 1 (DNS resolver): - Core files: dns_resolver.cpp, dns_cache.cpp, dns_config.cpp (3 files) - Direct dependencies: 12 files in netwerk/base/ - Test files: 8 test files specific to DNS - Build files: 2 moz.build files - Total closure: 25 files (not 847!) - + 3. Generate execution blueprint with child plans: - [subplan_parallel_spawn] DNS module conversions: - convert-dns-types: Closure of 5 files (type definitions) @@ -183,7 +183,7 @@ The Firefox example would decompose into ~1,000 bounded child plans (grouped via - Sandbox A1: Contains only auth/*.cpp, auth_tests/*.cpp - Cannot see Plan B's intermediate states - Cannot accidentally depend on Plan B's half-done work - + Plan B (updating API endpoints): - Sandbox B1: Contains only api/*.cpp, api_tests/*.cpp - Makes changes assuming current auth interface @@ -197,13 +197,13 @@ The Firefox example would decompose into ~1,000 bounded child plans (grouped via - Coordination: Git's three-way merge algorithm - Conflict detection: Built into Git - Rollback: git reset/checkout - + Databases: - Strategy: Transaction isolation - Coordination: MVCC (multi-version concurrency control) - Conflict detection: Serialization failures - Rollback: Transaction abort - + Cloud Infrastructure: - Strategy: Terraform workspaces - Coordination: State locking @@ -217,7 +217,7 @@ The Firefox example would decompose into ~1,000 bounded child plans (grouped via def merge_subplan_results(subplan_results): # Group by resource type by_resource = group_by_resource_type(subplan_results) - + # Apply resource-specific merge strategies for resource_type, changes in by_resource: if resource_type == 'git-checkout': @@ -226,7 +226,7 @@ The Firefox example would decompose into ~1,000 bounded child plans (grouped via merge_fs_changes(changes) # Copy-on-write reconciliation elif resource_type.startswith('database'): merge_db_changes(changes) # Sequential application - + # Validate merged state run_integration_tests() @@ -248,14 +248,14 @@ Parent Plan: Refactor auth library โ”œโ”€โ”€ [subplan_spawn] Plan 1: Update auth library interface โ”‚ Sandbox: Only auth library files โ”‚ Output: New interface definition -โ”‚ +โ”‚ โ”œโ”€โ”€ Barrier: Wait for Plan 1 completion -โ”‚ +โ”‚ โ”œโ”€โ”€ [subplan_parallel_spawn] Plans 2-16: Update each service (in parallel) โ”‚ Each sandbox: Only that service's files โ”‚ Each uses: New interface from Plan 1 โ”‚ No inter-service dependencies during execution -โ”‚ +โ”‚ โ””โ”€โ”€ Merge Phase: - Collect all service updates - Apply to main branch in order @@ -270,7 +270,7 @@ Parent Plan: Refactor auth library Two child plans both modify api/user.rs: - Plan A: Adds async fn get_user_profile() - Plan B: Adds fn validate_user_permissions() - + Merge strategy: - Git merge succeeds (different functions) - Semantic validation ensures both functions work together @@ -351,7 +351,7 @@ Invariants are attached at four scopes (global, project, action, plan) and manag ) # Apply precedence: plan > project > global return reconciler.reconcile(raw, precedence=['plan', 'project', 'global']) - + def collect_all_invariants(self, plan): """Collect invariants from all scopes accessible to this plan.""" invariants = [] @@ -361,13 +361,13 @@ Invariants are attached at four scopes (global, project, action, plan) and manag invariants.extend(self.get_action_invariants(plan.action)) invariants.extend(self.get_plan_invariants(plan)) return invariants - + # Example invariants at different scopes: # Global: "Payment processing must be idempotent" # Project: "Database transactions must complete within 5 seconds" # Action: "Test files must not import production secrets" # Plan: "All API calls over TCP must be mocked" - + def check_invariant_preservation(self, changes, enforced_invariants): for invariant in enforced_invariants: if not self.verify_invariant(invariant, changes): @@ -407,12 +407,12 @@ PROACTIVE CONTAINMENT IN ACTION: - Detects: PaymentService.chargeCard() called after OrderCreated event - Semantic issue: Payment before order confirmation violates business rules - Automatic fix: Insert OrderConfirmed event requirement - + 3. Validation Node Catches Edge Case: - Discovers: Audit service expects synchronous order numbers - Impact: Async events break compliance reporting - Resolution: Add audit event buffer with guaranteed ordering - + 4. Pre-Apply Semantic Verification: - Simulates production event flow - Detects: Under high load, events can arrive out of order @@ -520,8 +520,8 @@ agents plan tree <plan_id> # User knows gRPC would be better for this use case agents plan correct <decision_id> --mode=revert \ - --guidance "Use gRPC instead of REST. This service requires streaming - updates and binary protocol efficiency. Set up protocol + --guidance "Use gRPC instead of REST. This service requires streaming + updates and binary protocol efficiency. Set up protocol buffer definitions and generate client/server stubs." # System: @@ -553,10 +553,10 @@ True autonomy isn't about removing humans - it's about the system understanding 'risk_assessment': self.evaluate_risk(decision), 'invariant_complexity': self.analyze_invariants(decision) } - + confidence = self.compute_confidence(factors) # Returns 0.0โ€“1.0 threshold = profile.get_threshold(decision.flag) # From profile - + if confidence >= threshold: return ProceedAutonomously(decision, confidence) else: @@ -720,4 +720,3 @@ The difference between handling a 1,000 file project and a 100,000 file project - More validation patterns (accumulate over time) This isn't speculative architecture astronautics - it's applying proven distributed systems principles to AI agent coordination. The innovation is in the integration, not in requiring fundamental breakthroughs. - diff --git a/docs/schema/action.schema.yaml b/docs/schema/action.schema.yaml index d077d15cf..7cecc2250 100644 --- a/docs/schema/action.schema.yaml +++ b/docs/schema/action.schema.yaml @@ -224,4 +224,3 @@ additional_properties: false # maxValue -> max_value # schemaVersion -> schema_version # Legacy camelCase keys emit a warning but are accepted. - diff --git a/docs/schema/skill.schema.yaml b/docs/schema/skill.schema.yaml index 843b519f1..271fd70d6 100644 --- a/docs/schema/skill.schema.yaml +++ b/docs/schema/skill.schema.yaml @@ -242,4 +242,3 @@ additional_properties: false # sideEffects -> side_effects # toolFilter -> tool_filter # Legacy camelCase keys emit a warning but are accepted. - diff --git a/docs/showcase/api-clients/README.md b/docs/showcase/api-clients/README.md index 1ae014272..0b8f44e1e 100644 --- a/docs/showcase/api-clients/README.md +++ b/docs/showcase/api-clients/README.md @@ -29,4 +29,4 @@ Examples in this directory demonstrate: --- -*Examples in this directory are automatically generated from successful UAT test runs.* \ No newline at end of file +*Examples in this directory are automatically generated from successful UAT test runs.* diff --git a/docs/showcase/cli-tools/project-init-and-context-management.md b/docs/showcase/cli-tools/project-init-and-context-management.md index d426b9712..26ce89a9f 100644 --- a/docs/showcase/cli-tools/project-init-and-context-management.md +++ b/docs/showcase/cli-tools/project-init-and-context-management.md @@ -79,7 +79,7 @@ $ python -m cleveragents project list **Expected Output:** ``` - Projects + Projects โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”ƒ Name โ”ƒ Namespace โ”ƒ Description โ”ƒ Resources โ”ƒ Created โ”ƒ โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ @@ -217,7 +217,7 @@ $ python -m cleveragents actor context list **Expected Output:** ``` - Context Files (1 total) + Context Files (1 total) โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”ƒ File Path โ”ƒ Type โ”ƒ Size โ”ƒ Added โ”ƒ โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ @@ -292,7 +292,7 @@ $ python -m cleveragents session list **Expected Output:** ``` - Sessions + Sessions โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”ƒ ID โ”ƒ Name โ”ƒ Actor โ”ƒ Messages โ”ƒ Updated โ”ƒ โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ @@ -413,7 +413,7 @@ $ python -m cleveragents project create local/my-webapp --description "A sample # 3. List projects $ python -m cleveragents project list - Projects + Projects โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”ƒ Name โ”ƒ Namespace โ”ƒ Description โ”ƒ Resources โ”ƒ Created โ”ƒ โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ @@ -439,7 +439,7 @@ $ python -m cleveragents actor context add src/main.py # 6. List context $ python -m cleveragents actor context list - Context Files (1 total) + Context Files (1 total) โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”ƒ File Path โ”ƒ Type โ”ƒ Size โ”ƒ Added โ”ƒ โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ @@ -465,7 +465,7 @@ $ python -m cleveragents session create # 8. List sessions $ python -m cleveragents session list - Sessions + Sessions โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”ƒ ID โ”ƒ Name โ”ƒ Actor โ”ƒ Messages โ”ƒ Updated โ”ƒ โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ diff --git a/docs/showcase/data-processing/README.md b/docs/showcase/data-processing/README.md index f8a20fea3..ea7103c07 100644 --- a/docs/showcase/data-processing/README.md +++ b/docs/showcase/data-processing/README.md @@ -29,4 +29,4 @@ Examples cover common data formats: --- -*Examples in this directory are automatically generated from successful UAT test runs.* \ No newline at end of file +*Examples in this directory are automatically generated from successful UAT test runs.* diff --git a/docs/showcase/example-template.md b/docs/showcase/example-template.md index bce3e1b0c..f1f1139f9 100644 --- a/docs/showcase/example-template.md +++ b/docs/showcase/example-template.md @@ -95,4 +95,4 @@ Now that you've seen how to [what was built], try these variations: --- *This example was automatically generated and verified by the CleverAgents UAT system.* -*Feature area: [area] | Test cycle: [N] | Generated: [timestamp]* \ No newline at end of file +*Feature area: [area] | Test cycle: [N] | Generated: [timestamp]* diff --git a/docs/showcase/index.md b/docs/showcase/index.md index aea6df023..ceed58c36 100644 --- a/docs/showcase/index.md +++ b/docs/showcase/index.md @@ -47,4 +47,4 @@ These examples are automatically generated by our UAT system. If you'd like to s --- -*Last updated: This index is automatically maintained by the CleverAgents UAT system.* \ No newline at end of file +*Last updated: This index is automatically maintained by the CleverAgents UAT system.* diff --git a/docs/showcase/testing-tools/README.md b/docs/showcase/testing-tools/README.md index fb016bdba..caba9b8c9 100644 --- a/docs/showcase/testing-tools/README.md +++ b/docs/showcase/testing-tools/README.md @@ -29,4 +29,4 @@ Examples demonstrate various testing patterns: --- -*Examples in this directory are automatically generated from successful UAT test runs.* \ No newline at end of file +*Examples in this directory are automatically generated from successful UAT test runs.* diff --git a/examples/actions/estimation-actor.yaml b/examples/actions/estimation-actor.yaml index ab022cea7..12e5a1336 100644 --- a/examples/actions/estimation-actor.yaml +++ b/examples/actions/estimation-actor.yaml @@ -43,4 +43,3 @@ automation_profile: trusted invariants: - "All existing tests must continue to pass" - "Public API signatures must not change without deprecation" - diff --git a/examples/actions/inputs-schema.yaml b/examples/actions/inputs-schema.yaml index 1d439e88e..3fe2283d7 100644 --- a/examples/actions/inputs-schema.yaml +++ b/examples/actions/inputs-schema.yaml @@ -56,4 +56,3 @@ inputs_schema: - parquet required: - stages - diff --git a/examples/actions/invariant-heavy.yaml b/examples/actions/invariant-heavy.yaml index ed50cd946..0ef3b6e14 100644 --- a/examples/actions/invariant-heavy.yaml +++ b/examples/actions/invariant-heavy.yaml @@ -47,4 +47,3 @@ invariants: - "All findings must include reproducible steps" - "Secrets found during scanning must be redacted in reports" - "Remediation fixes must not break existing tests" - diff --git a/examples/actions/read-only.yaml b/examples/actions/read-only.yaml index b68196ff7..cd83f6112 100644 --- a/examples/actions/read-only.yaml +++ b/examples/actions/read-only.yaml @@ -25,4 +25,3 @@ definition_of_done: | reusable: true read_only: true state: available - diff --git a/examples/actions/simple.yaml b/examples/actions/simple.yaml index f6605e2f8..3460159e4 100644 --- a/examples/actions/simple.yaml +++ b/examples/actions/simple.yaml @@ -16,4 +16,3 @@ definition_of_done: | reusable: true read_only: true - diff --git a/examples/basic_chat_actor.yaml b/examples/basic_chat_actor.yaml index ecdf4c8ca..4bec3d1ae 100644 --- a/examples/basic_chat_actor.yaml +++ b/examples/basic_chat_actor.yaml @@ -34,4 +34,4 @@ context: global: conversation_mode: true # Actor-specific context variables - default_actor: openai/gpt-4 \ No newline at end of file + default_actor: openai/gpt-4 diff --git a/examples/scientific_paper_writer.yaml b/examples/scientific_paper_writer.yaml index bcae24256..73d95dbe6 100644 --- a/examples/scientific_paper_writer.yaml +++ b/examples/scientific_paper_writer.yaml @@ -82,7 +82,7 @@ actors: if not routed: # Pass the user input along with the stage routing result = f"GOTO_{stage.upper()}:{clean_input}" - + print(f"DEBUG: returning: {result}", file=sys.stderr) @@ -96,7 +96,7 @@ actors: # Debug: print what we received import sys print(f"DEBUG command_handler: input_data='{input_data}'", file=sys.stderr) - + # Extract the actual command from the input_data # It comes as "GOTO_COMMAND_HANDLER:!next" from workflow_controller msg = '' @@ -104,27 +104,27 @@ actors: parts = input_data.split(':', 1) if len(parts) > 1: msg = parts[1].strip() - + # Fallback to checking context if not msg: msg = context.get('initial_message', '').strip() - + # Last fallback if not msg and input_data: msg = input_data.strip() if input_data != 'GOTO_COMMAND_HANDLER' else '' - + print(f"DEBUG command_handler: using msg='{msg}'", file=sys.stderr) - + if not msg: result = "COMMAND_OUTPUT:Error: No command provided" else: parts = msg.split(maxsplit=1) command = parts[0] args = parts[1] if len(parts) > 1 else '' - + if command == '!help': result = 'COMMAND_OUTPUT:Available Commands:\n!help - Shows this help message.\n!next [stage_name] - Advances to the next stage, or the one specified.\n!start - Start/run the current stage.\n!write - (section_writing) Proceed from source selection to writing the section.\n!proofread - (section_writing) Proceed from writing to proofreading.\n!accept - Accepts current content and proceeds to next section/stage.\n!stage - Describes the current stage.\n!stages - Lists all stages and marks the current one.\n!context [hops|all] - Shows current context. \'hops\' shows recent history, \'all\' shows full history.\n!finish - Automatically completes remaining stages using first-pass suggestions and citations.' - + elif command == '!next': current_stage = context.get('writing_stage') or 'intro' stage_order = context.get('stage_order') @@ -149,26 +149,26 @@ actors: context['writing_stage'] = target_stage # Trigger the stage flow immediately by routing to it with empty input result = f"GOTO_{target_stage.upper()}:" - + elif command == '!start': # Start/run the current stage (useful after transitioning to a new stage) current_stage = context.get('writing_stage') or 'intro' result = f"GOTO_{current_stage.upper()}:" - + elif command == '!write': # Proceed from source selection to section writing if context.get('writing_stage') == 'section_writing': result = "GOTO_SECTION_WRITER:" else: result = "COMMAND_OUTPUT:!write is only available during section_writing stage" - + elif command == '!proofread': # Proceed from section writing to proofreading if context.get('writing_stage') == 'section_writing': result = "GOTO_SECTION_PROOFREADER:" else: result = "COMMAND_OUTPUT:!proofread is only available during section_writing stage" - + elif command == '!accept': # Accept current section and move to next if context.get('writing_stage') == 'section_writing': @@ -177,7 +177,7 @@ actors: section_paths = context.get('section_paths', []) new_index = current_index + 1 context['current_section_index'] = new_index - + # Check if we've completed all sections if new_index >= len(section_paths): # Keep stage as section_writing so !next advances to paper_review @@ -203,7 +203,7 @@ actors: result = "Final stage complete." except (ValueError, IndexError): result = "Error advancing stage." - + elif command == '!stage': stage_descriptions = { 'intro': 'Introduction to the writing system.', @@ -218,7 +218,7 @@ actors: current_stage = context.get('writing_stage', 'unknown') description = stage_descriptions.get(current_stage, 'No description available.') result = f"COMMAND_OUTPUT:Current Stage: {current_stage}\nPurpose: {description}" - + elif command == '!stages': stage_order = context.get('stage_order', []) current_stage = context.get('writing_stage', 'unknown') @@ -227,7 +227,7 @@ actors: marker = '-->' if stage == current_stage else ' ' lines.append(f"{marker} {stage}") result = 'COMMAND_OUTPUT:' + '\n'.join(lines) - + elif command == '!context': import json context_copy = dict(context) @@ -245,7 +245,7 @@ actors: output_str += "\n\n-- History --\n" output_str += json.dumps(history_to_show, indent=2, default=str) result = 'COMMAND_OUTPUT:' + output_str - + elif command == '!finish': required_fields = ['topic', 'length', 'audience', 'publication', 'format'] paper_details = context.get('paper_details', {}) or {} @@ -263,7 +263,7 @@ actors: context['auto_finish_active'] = True context['auto_finish_state'] = {'expect': None} result = "GOTO_AUTO_FINISH:START" - + else: result = f"COMMAND_OUTPUT:Unknown command: {command}" @@ -482,22 +482,22 @@ actors: context['auto_finish_last_output'] = message auto_active = context.get('auto_finish_active', False) final_stage = context.get('auto_finish_final_stage', False) - + # Check if this is the final output (latex source was just saved) # We detect this by checking if latex_source exists and message contains latex-related content latex_source = context.get('latex_source', '') is_latex_completion = bool(latex_source) and ('document' in message.lower() or 'latex' in message.lower() or 'assembled' in message.lower() or 'compile' in message.lower()) - + # If auto-finish just completed (final stage done), return the full paper content if final_stage and is_latex_completion: # Mark as complete now context['auto_finish_active'] = False context['auto_finish_final_stage'] = False context['auto_finish_state'] = {} - + section_count = len(context.get('section_paths') or []) topic = context.get('paper_details', {}).get('topic', 'Unknown') - + # Build the complete paper output output_parts = [] output_parts.append("=" * 80) @@ -506,16 +506,16 @@ actors: output_parts.append(f"\nPaper: {topic}") output_parts.append(f"Sections: {section_count}") output_parts.append("") - + # Include the paper content from section_content section_content = context.get('section_content', {}) section_paths = context.get('section_paths', []) - + if section_content: output_parts.append("\n" + "=" * 80) output_parts.append("PAPER CONTENT") output_parts.append("=" * 80 + "\n") - + for path in section_paths: content = section_content.get(path, '') if content: @@ -527,18 +527,18 @@ actors: output_parts.append(f"\n{'#' * (depth + 1)} {path.split(' > ')[-1]}\n") output_parts.append(content) output_parts.append("") - + # Include LaTeX if available if latex_source: output_parts.append("\n" + "=" * 80) output_parts.append("LATEX SOURCE") output_parts.append("=" * 80 + "\n") output_parts.append(latex_source) - + output_parts.append("\n" + "=" * 80) output_parts.append("All stages completed: brainstorming, vetting, structure, section writing, paper review, and LaTeX generation.") output_parts.append("=" * 80) - + result = '\n'.join(output_parts) elif not auto_active: # Auto-finish was manually deactivated or never active - just pass through @@ -665,7 +665,7 @@ actors: result = f"ROUTE_ASK_OTHER:{msg}" else: result = "DISCOVERY_RESPONSE:Discovery complete! All parameters set. Type !next to proceed to brainstorming." - + print(f"DEBUG discovery_controller: returning: {result}", file=sys.stderr) ask_topic: @@ -845,29 +845,29 @@ actors: - name: save_vetting code: | import json - + # Extract sources from the special markers sources = [] message = input_data - + if 'SOURCES_JSON_START' in message and 'SOURCES_JSON_END' in message: start_marker = 'SOURCES_JSON_START' end_marker = 'SOURCES_JSON_END' - + start_pos = message.find(start_marker) end_pos = message.find(end_marker) - + if start_pos != -1 and end_pos != -1: json_start = start_pos + len(start_marker) json_content = message[json_start:end_pos].strip() - + try: sources = json.loads(json_content) if not isinstance(sources, list): sources = [] except json.JSONDecodeError: sources = [] - + # Update context if sources: context['vetting_sources'] = sources @@ -1046,13 +1046,13 @@ actors: # Check if we need to parse the TOC first section_paths = context.get('section_paths') fallback_sections = ['Introduction', 'Methods', 'Results', 'Discussion'] - + # Re-parse if section_paths is empty, None, or still the generic fallback needs_parse = ( not section_paths or section_paths == fallback_sections ) - + if needs_parse: toc_text = context.get('table_of_contents', '') if not toc_text: @@ -1174,9 +1174,9 @@ actors: You are helping select relevant sources for writing ONE SPECIFIC section of the paper. CURRENT SECTION TO WRITE: "{{ context.current_section_path }}" - + Section progress: {{ context.current_section_index + 1 }} of {{ context.section_paths|length if context.section_paths else 'unknown' }} - + {% if ' > ' in context.current_section_path %} NOTE: This is a SUBSECTION - you will be writing detailed content for this specific topic. {% else %} @@ -1193,20 +1193,20 @@ actors: {% else %} No vetted sources have been captured yet. Let the user know and suggest running !next after the vetting stage completes. {% endif %} - + YOUR TASK: When you receive ANY message (including just a section name, "suggest something", or any other input): 1. First, announce which section we're working on: "Now working on section: [section name]" 2. List the available sources with their numbers and brief descriptions 3. Recommend which sources are most relevant for THIS specific section and explain why 4. Ask the user if they want to use these sources, find additional ones, or have questions - + You MUST always show the actual source citations and your recommendations - never skip this step! - + If the user asks for changes to source selection or has questions, help them. - + IMPORTANT: When the user is satisfied with the source selection, tell them to type !write to proceed to writing. - + Example ending: "These sources should work well for this section. When you're ready, type !write to proceed to writing." @@ -1263,29 +1263,29 @@ actors: - name: save_found_sources code: | import json - + # Extract sources from the special markers sources = [] message = input_data - + if 'SOURCES_JSON_START' in message and 'SOURCES_JSON_END' in message: start_marker = 'SOURCES_JSON_START' end_marker = 'SOURCES_JSON_END' - + start_pos = message.find(start_marker) end_pos = message.find(end_marker) - + if start_pos != -1 and end_pos != -1: json_start = start_pos + len(start_marker) json_content = message[json_start:end_pos].strip() - + try: sources = json.loads(json_content) if not isinstance(sources, list): sources = [] except json.JSONDecodeError: sources = [] - + # Update context with new sources (replaces existing since source_finder includes all) if sources: context['vetting_sources'] = sources @@ -1303,19 +1303,19 @@ actors: max_history: 20 system_prompt: | You are writing EXACTLY ONE section: "{{ context.current_section_path }}" - + Paper topic: {{ context.paper_details.topic }} Paper focus: {{ context.brainstorming_summary }} Target length: {{ context.paper_details.length }} words total Target audience: {{ context.paper_details.audience }} - + Complete section structure (for reference only - write ONLY the current section): {% if context.section_paths %} {% for path in context.section_paths %} {{ ">>> " if path == context.current_section_path else " " }}{{ path }} {% endfor %} {% endif %} - + Available sources: {% if context.vetting_sources %} {% for source in context.vetting_sources %} @@ -1325,7 +1325,7 @@ actors: CRITICAL INSTRUCTIONS: 1. Write ONLY the content for "{{ context.current_section_path }}" - nothing else. - + 2. Section type guidance: {% if ' > ' in context.current_section_path %} - This is a SUBSECTION ({{ context.current_section_path }}) @@ -1337,12 +1337,12 @@ actors: - Do NOT write the subsection content here - those will be written separately - Just provide a roadmap/overview of what the subsections will address {% endif %} - + 3. Do NOT include: - Content from other sections - Subsection headers or subsection content (those are separate sections) - A full treatment of the topic if this is a parent section - + 4. Use academic tone and cite sources appropriately. YOUR TASK: @@ -1350,14 +1350,14 @@ actors: - Include proper academic citations from the available sources (e.g., Author et al., Year) - Work with the user to refine the content based on their feedback - If the user asks for changes, make them and present the revised content - + RESPONSE FORMAT (MANDATORY): SECTION_CONTENT: - + NEXT_ACTION: Type !proofread when you are satisfied with this section. - + Do NOT include any other commentary, explanations, or conversational text. The SECTION_CONTENT block must contain only the section prose that will be stored in the paper. section_writer_saver: @@ -1464,16 +1464,16 @@ actors: 5. Look for logical inconsistencies or unclear arguments 6. Ensure smooth transitions and flow 7. Verify the content matches what the section should cover (based on the TOC) - + YOUR TASK: - Present your detailed proofreading feedback on the section content shown above - List any issues found or confirm the section is well-written - If the user asks you to make changes, make them and present the corrected version - When you provide a fully revised section, respond with **only** `UPDATED_SECTION_CONTENT:` followed by the final section text. This allows the system to store the new content verbatim. - Work with the user until they are satisfied with the section - + IMPORTANT: When the user is satisfied with the proofread section, tell them to type !accept to accept the section and move to the next one. - + Example ending: "The section looks good overall. Type !accept when you're ready to move to the next section." @@ -1513,14 +1513,14 @@ actors: section_content = context.get('section_content', {}) section_paths = context.get('section_paths', []) - + # Debug: show what sections we have print(f"DEBUG section_content has {len(section_content)} sections", file=sys.stderr) print(f"DEBUG section_paths has {len(section_paths)} paths", file=sys.stderr) for p in section_paths[:5]: has_content = p in section_content print(f"DEBUG path={p[:50]} has_content={has_content}", file=sys.stderr) - + if not section_content: result = "ERROR: No sections found. Please complete section writing stage first." else: @@ -1900,7 +1900,7 @@ routes: target: auto_finish_driver extract_message: true separator: ":" - + # Command output (non-routing command results) go directly to end - match_type: prefix @@ -1975,14 +1975,14 @@ routes: target: section_accept_handler extract_message: true separator: ":" - + - match_type: prefix pattern: "GOTO_PAPER_REVIEW" target: paper_review extract_message: true separator: ":" - - + + - match_type: prefix pattern: "GOTO_LATEX_GENERATION" @@ -2105,9 +2105,9 @@ routes: target: auto_finish_driver extract_message: true separator: ":" - + # Paper review routing - + - match_type: prefix pattern: "ROUTE_REVIEW_PAPER" target: paper_review_agent @@ -2185,7 +2185,7 @@ routes: auto_finish_passthrough: type: actor actor: auto_finish_passthrough - + intro: type: actor actor: intro_agent @@ -2291,14 +2291,14 @@ routes: paper_review: type: actor actor: paper_review_controller - + paper_review_actor: type: actor actor: paper_review_agent metadata: max_history_messages: 10 max_history_chars: 6000 - + paper_review_saver: type: actor actor: paper_review_saver @@ -2528,7 +2528,7 @@ routes: type: context_value key: next_node value: paper_review - + - source: router target: paper_review_agent condition: diff --git a/examples/simple_langgraph_actor.yaml b/examples/simple_langgraph_actor.yaml index 7ba6f8969..985c8335c 100644 --- a/examples/simple_langgraph_actor.yaml +++ b/examples/simple_langgraph_actor.yaml @@ -16,19 +16,19 @@ routes: simple_chat: type: graph entry_point: start - + nodes: # Process user input process_input: type: agent agent: assistant - + edges: - source: start target: process_input - source: process_input target: end - + # Input stream that triggers the graph chat_input: type: stream @@ -50,4 +50,4 @@ context: app_name: "Simple LangGraph Chat" # Actor-specific configuration default_actor: openai/gpt-3.5-turbo - enable_actor_fallback: true \ No newline at end of file + enable_actor_fallback: true diff --git a/examples/skills/composed.yaml b/examples/skills/composed.yaml index 79d610d51..425880d95 100644 --- a/examples/skills/composed.yaml +++ b/examples/skills/composed.yaml @@ -28,4 +28,3 @@ mcp_servers: - create_pull_request - list_repos - get_file_contents - diff --git a/examples/skills/inline-tool.yaml b/examples/skills/inline-tool.yaml index 579074138..6f50530b4 100644 --- a/examples/skills/inline-tool.yaml +++ b/examples/skills/inline-tool.yaml @@ -34,4 +34,3 @@ inline_tools: type: string required: ["text"] writes: false - diff --git a/examples/skills/mcp-backed.yaml b/examples/skills/mcp-backed.yaml index fb911db7b..d359f447d 100644 --- a/examples/skills/mcp-backed.yaml +++ b/examples/skills/mcp-backed.yaml @@ -20,4 +20,3 @@ mcp_servers: tool_filter: exclude: - delete_project - diff --git a/examples/skills/single-tool.yaml b/examples/skills/single-tool.yaml index 1df881db3..4c1b30b10 100644 --- a/examples/skills/single-tool.yaml +++ b/examples/skills/single-tool.yaml @@ -8,4 +8,3 @@ tools: - name: builtin/read_file - name: builtin/list_directory - name: builtin/search_files - diff --git a/examples/skills/validation-only.yaml b/examples/skills/validation-only.yaml index 1b4b79fd1..3d2e9be60 100644 --- a/examples/skills/validation-only.yaml +++ b/examples/skills/validation-only.yaml @@ -2,4 +2,3 @@ # Register: agents skill add --config validation-only.yaml name: local/empty-skill - diff --git a/features/actor_registry_spec_yaml.feature b/features/actor_registry_spec_yaml.feature index a1f58d9ae..5f1e8b50c 100644 --- a/features/actor_registry_spec_yaml.feature +++ b/features/actor_registry_spec_yaml.feature @@ -148,6 +148,3 @@ Feature: ActorRegistry.add() accepts spec-compliant actor YAML formats Scenario: registry.add() propagates exception raised by upsert_actor When upsert_actor is configured to raise RuntimeError and I add a valid YAML Then a RuntimeError should have been propagated from add - - - diff --git a/features/application_container_coverage.feature b/features/application_container_coverage.feature index 3e3491b23..91af95a4c 100644 --- a/features/application_container_coverage.feature +++ b/features/application_container_coverage.feature @@ -9,12 +9,12 @@ Feature: Application Container Dependency Injection Coverage When I request the application settings from the container Then the container should return valid settings object - @phase1 + @phase1 Scenario: Container project service method creates and returns service instance Given I have initialized an application container When I request a project service from the container Then the container should return a valid project service instance - + @phase1 Scenario: Container context service method creates and returns service instance Given I have initialized an application container diff --git a/features/cli_commands_coverage.feature b/features/cli_commands_coverage.feature index c379ac07b..573ebd20c 100644 --- a/features/cli_commands_coverage.feature +++ b/features/cli_commands_coverage.feature @@ -56,4 +56,4 @@ Feature: CLI Commands Full Coverage Scenario: Project command group help When I run project command with help - Then the project help should display \ No newline at end of file + Then the project help should display diff --git a/features/cli_coverage.feature b/features/cli_coverage.feature index 71aa2a895..f60d52faa 100644 --- a/features/cli_coverage.feature +++ b/features/cli_coverage.feature @@ -34,7 +34,7 @@ Feature: CLI Main Coverage Then it should return 0 Scenario: Direct main function call with help - When I call the main function directly with "--help" + When I call the main function directly with "--help" Then it should return 0 Scenario: Direct main function call with bad command @@ -47,4 +47,4 @@ Feature: CLI Main Coverage Scenario: CLI handles system exit When I run a command that calls sys.exit(1) - Then it should propagate the exit code correctly \ No newline at end of file + Then it should propagate the exit code correctly diff --git a/features/cli_help_text_legacy_removal.feature b/features/cli_help_text_legacy_removal.feature index d986b5f96..07060f79b 100644 --- a/features/cli_help_text_legacy_removal.feature +++ b/features/cli_help_text_legacy_removal.feature @@ -8,7 +8,7 @@ Feature: CLI help text removal of legacy commands When the basic help text is printed Then the help should not mention tell command - Scenario: _print_basic_help does not include "build" command + Scenario: _print_basic_help does not include "build" command Given the CLI main help function is called When the basic help text is printed Then the help should not mention build command diff --git a/features/cli_internals.feature b/features/cli_internals.feature index 8d05b1a66..85a9989e6 100644 --- a/features/cli_internals.feature +++ b/features/cli_internals.feature @@ -25,11 +25,11 @@ Feature: CLI Command Processing Scenario: Main function handles arguments When I call main with arguments "--version" Then main should process the version flag - + Scenario: Main function handles no arguments When I call main with no arguments Then main should display help Scenario: Main function handles SystemExit When I call main and CLI raises SystemExit 1 - Then main should return 1 \ No newline at end of file + Then main should return 1 diff --git a/features/consolidated_action.feature b/features/consolidated_action.feature index ead59b0ea..479a5a3d4 100644 --- a/features/consolidated_action.feature +++ b/features/consolidated_action.feature @@ -846,5 +846,3 @@ Feature: Consolidated Action Then the action schema validation should succeed And the action config model_dump should contain key "name" And the action config model_dump should contain key "strategy_actor" - - diff --git a/features/consolidated_actor.feature b/features/consolidated_actor.feature index dbb4b4153..a4a3b3bcb 100644 --- a/features/consolidated_actor.feature +++ b/features/consolidated_actor.feature @@ -1018,7 +1018,7 @@ Feature: Consolidated Actor And the actor "local/legacy-yaml" should have schema_version "1.5" - + # ============================================================ # Originally from: actor_runtime.feature # Feature: Tool-Calling Actor Runtime @@ -1359,4 +1359,3 @@ Feature: Consolidated Actor When I start and invoke M2 MCP stub tool "mcp/fetch" with url "http://example.com" Then the M2 MCP stub fetch result should have status 200 And the M2 MCP stub invocation log should have 1 entries - diff --git a/features/consolidated_ai_models_providers.feature b/features/consolidated_ai_models_providers.feature index dea51e990..7eec37351 100644 --- a/features/consolidated_ai_models_providers.feature +++ b/features/consolidated_ai_models_providers.feature @@ -740,4 +740,3 @@ Feature: Consolidated Ai Models Providers Given I have sample provider domain inputs When I attempt to create an OpenRouter chat provider without an API key Then the OpenRouter provider creation should fail with error "OpenRouter API key is required" - diff --git a/features/consolidated_cli_misc.feature b/features/consolidated_cli_misc.feature index b4532df85..fe5194beb 100644 --- a/features/consolidated_cli_misc.feature +++ b/features/consolidated_cli_misc.feature @@ -137,4 +137,3 @@ Feature: Consolidated Cli Misc Given system cli branch module is loaded When system cli branch render_info_rich is called with no storage Then system cli branch no exception should be raised - diff --git a/features/consolidated_config.feature b/features/consolidated_config.feature index 4f9955cd5..e9353d342 100644 --- a/features/consolidated_config.feature +++ b/features/consolidated_config.feature @@ -668,4 +668,3 @@ Feature: Consolidated Config Scenario: Nightly workflow uses at least 96.5 percent threshold Given the nightly quality workflow file is loaded for coverage check Then the nightly workflow should use a fail-under of at least 96.5 - diff --git a/features/consolidated_context.feature b/features/consolidated_context.feature index c641db1bb..52ff057dc 100644 --- a/features/consolidated_context.feature +++ b/features/consolidated_context.feature @@ -235,4 +235,3 @@ Feature: Consolidated Context And the context view dump should have key "exclude_paths" And the context view dump should have key "max_file_size" And the context view dump should have key "max_total_size" - diff --git a/features/consolidated_correction.feature b/features/consolidated_correction.feature index 741b4bf98..ee7b273a3 100644 --- a/features/consolidated_correction.feature +++ b/features/consolidated_correction.feature @@ -909,4 +909,3 @@ Feature: Consolidated Correction When I compute affected subtree for "R" with tree "R->A,B,C,D,E" Then the affected subtree should be exactly "R,A,B,C,D,E" in order And the affected subtree count should be 6 - diff --git a/features/consolidated_decision.feature b/features/consolidated_decision.feature index 8e69f59bd..906910dca 100644 --- a/features/consolidated_decision.feature +++ b/features/consolidated_decision.feature @@ -481,4 +481,3 @@ Feature: Consolidated Decision When I decision persistence create a decision with a 2000 character rationale And I decision persistence round-trip the decision through model_dump Then the decision persistence restored rationale length should be 2000 - diff --git a/features/consolidated_misc.feature b/features/consolidated_misc.feature index 1d27e936f..9efffcd6e 100644 --- a/features/consolidated_misc.feature +++ b/features/consolidated_misc.feature @@ -2000,4 +2000,3 @@ Feature: Consolidated Misc And I write a temp YAML file with template content When I call load_file with template context on direct engine Then the direct file result should contain rendered values - diff --git a/features/consolidated_plan_model_lifecycle.feature b/features/consolidated_plan_model_lifecycle.feature index 717e3dada..f31ffa637 100644 --- a/features/consolidated_plan_model_lifecycle.feature +++ b/features/consolidated_plan_model_lifecycle.feature @@ -959,4 +959,3 @@ Feature: Consolidated Plan Model Lifecycle And an uncovered-lines subplan on attempt 1 that failed with no error message When the uncovered-lines failure handler evaluates whether to retry the failed work Then the uncovered-lines failed work should not be retried - diff --git a/features/consolidated_quality_review.feature b/features/consolidated_quality_review.feature index b5ebd9b6e..c4aefe3f8 100644 --- a/features/consolidated_quality_review.feature +++ b/features/consolidated_quality_review.feature @@ -956,4 +956,3 @@ Feature: Consolidated Quality Review And the playbook should contain the text "P1" And the playbook should contain the text "P2" And the playbook should contain the text "P3" - diff --git a/features/consolidated_sandbox.feature b/features/consolidated_sandbox.feature index 4e5752465..6328b9a86 100644 --- a/features/consolidated_sandbox.feature +++ b/features/consolidated_sandbox.feature @@ -859,4 +859,3 @@ Feature: Consolidated Sandbox Given the sandbox factory is available When the compatible strategies for an unknown resource type are queried Then the factory should return only the none strategy as compatible - diff --git a/features/consolidated_security.feature b/features/consolidated_security.feature index 1652b5c17..56e3440de 100644 --- a/features/consolidated_security.feature +++ b/features/consolidated_security.feature @@ -1136,4 +1136,3 @@ Feature: Consolidated Security And a secure template context key "name" with value "Bob" When I render via the legacy TemplateRenderer Then the secure template output should be "Bob" - diff --git a/features/consolidated_skill.feature b/features/consolidated_skill.feature index 450cc980c..ef2fb1f8f 100644 --- a/features/consolidated_skill.feature +++ b/features/consolidated_skill.feature @@ -1234,4 +1234,3 @@ Feature: Consolidated Skill Then the skill_resolver result should contain tool "local/inline-test/_anon_0" And the skill_resolver result should contain tool "local/inline-test/_anon_1" And the skill_resolver inline tool at index 1 should be marked inline - diff --git a/features/consolidated_tool.feature b/features/consolidated_tool.feature index 6236ffc74..a32226665 100644 --- a/features/consolidated_tool.feature +++ b/features/consolidated_tool.feature @@ -1021,5 +1021,3 @@ Feature: Consolidated Tool And a registered tool spec named "test/excl-validation" typed as "validation" When I list tools with tool_type "tool" Then the tool list should contain 0 tools - - diff --git a/features/context_unit_tests.feature b/features/context_unit_tests.feature index 990bbf79f..1b6d12e38 100644 --- a/features/context_unit_tests.feature +++ b/features/context_unit_tests.feature @@ -9,7 +9,7 @@ Feature: Context Commands Unit Tests When the context add command is executed with valid paths Then files should be added successfully with output - @phase1 + @phase1 Scenario: Context add with non-existent path error Given a mock context service is configured When the context add command is executed with non-existent path diff --git a/features/coverage_maximum.feature b/features/coverage_maximum.feature index b0a934e7d..3a0391ade 100644 --- a/features/coverage_maximum.feature +++ b/features/coverage_maximum.feature @@ -29,4 +29,4 @@ Feature: Maximum Code Coverage Scenario: Test __main__ if clause When I test the __main__ module if clause - Then the if __name__ clause should execute \ No newline at end of file + Then the if __name__ clause should execute diff --git a/features/database_infrastructure.feature b/features/database_infrastructure.feature index 9b5c4a2b8..e7f727513 100644 --- a/features/database_infrastructure.feature +++ b/features/database_infrastructure.feature @@ -204,4 +204,4 @@ Feature: Database Infrastructure Models and Repositories When I retrieve contexts for the plan Then I should get a list of domain Context models When I retrieve changes for the plan - Then I should get a list of domain Change models \ No newline at end of file + Then I should get a list of domain Change models diff --git a/features/database_repositories.feature b/features/database_repositories.feature index d22c636b3..1ab4aee8f 100644 --- a/features/database_repositories.feature +++ b/features/database_repositories.feature @@ -77,4 +77,4 @@ Feature: Database Repository Operations And I have a project repository When I attempt a failing transaction Then the transaction should be rolled back - And no data should be persisted \ No newline at end of file + And no data should be persisted diff --git a/features/main_coverage_complete.feature b/features/main_coverage_complete.feature index 927d8a9fa..d167aff7f 100644 --- a/features/main_coverage_complete.feature +++ b/features/main_coverage_complete.feature @@ -7,4 +7,4 @@ Feature: Complete Main Module Coverage Scenario: Test actual if __name__ == "__main__" execution When I run the __main__ module as a script with --version Then the version should be displayed - And the exit code should be 0 \ No newline at end of file + And the exit code should be 0 diff --git a/features/module_coverage.feature b/features/module_coverage.feature index 348fa7e48..e68d0ba5a 100644 --- a/features/module_coverage.feature +++ b/features/module_coverage.feature @@ -43,4 +43,4 @@ Feature: Module Entry Points Coverage Scenario: Test CLI shortcuts When I use CLI shortcut commands - Then shortcuts should map to full commands \ No newline at end of file + Then shortcuts should map to full commands diff --git a/features/openai_provider.feature b/features/openai_provider.feature index b80a5d996..b7c7a600e 100644 --- a/features/openai_provider.feature +++ b/features/openai_provider.feature @@ -64,4 +64,3 @@ Feature: OpenAI chat provider coverage When I request plan generation from the OpenAI provider Then the OpenAI provider response should report error "graph exploded" And the OpenAI provider response should contain no generated changes - diff --git a/features/plan_lifecycle_service_coverage_boost_r3.feature b/features/plan_lifecycle_service_coverage_boost_r3.feature index 8365f24a9..c9a98732b 100644 --- a/features/plan_lifecycle_service_coverage_boost_r3.feature +++ b/features/plan_lifecycle_service_coverage_boost_r3.feature @@ -136,4 +136,4 @@ Feature: Plan Lifecycle Service coverage boost round 3 And an action "local/apply-fail-cleanup" exists for coverage boost r3 And a plan in apply phase with processing state for r3 When I fail apply on the plan with error "Container cleanup test" - Then the plan should be in errored state and cleanup should have been called \ No newline at end of file + Then the plan should be in errored state and cleanup should have been called diff --git a/features/project_service_coverage.feature b/features/project_service_coverage.feature index 9f752468d..616830ed0 100644 --- a/features/project_service_coverage.feature +++ b/features/project_service_coverage.feature @@ -113,4 +113,4 @@ Feature: Project Service Coverage Scenario: Create project with extremely long name Given I want to create a project with a very long name When I create the project with 300 character name - Then the project name should be truncated appropriately \ No newline at end of file + Then the project name should be truncated appropriately diff --git a/features/steps/container_tool_exec_steps.py b/features/steps/container_tool_exec_steps.py index fd0da7e80..51cd25f1f 100644 --- a/features/steps/container_tool_exec_steps.py +++ b/features/steps/container_tool_exec_steps.py @@ -221,9 +221,7 @@ def step_host_path_result_true(context: Any, path: str) -> None: ) -@given( - 'a file "{name}" with content "{content}" at "{absolute_path}"' -) +@given('a file "{name}" with content "{content}" at "{absolute_path}"') def step_create_file_at_absolute_path( context: Any, name: str, content: str, absolute_path: str ) -> None: @@ -250,18 +248,14 @@ def step_check_host_path(context: Any, path: str) -> None: def step_result_is_true(context: Any) -> None: """Assert that the most recent host path containment check returned True.""" result: bool = getattr(context, "_host_path_result", False) - assert result is True, ( - f"Expected host path check to return True but got {result}" - ) + assert result is True, f"Expected host path check to return True but got {result}" @then("the host containment result should be false") def step_result_is_false(context: Any) -> None: """Assert that the most recent host path containment check returned False.""" result: bool = getattr(context, "_host_path_result", True) - assert result is False, ( - f"Expected host path check to return False but got {result}" - ) + assert result is False, f"Expected host path check to return False but got {result}" # --------------------------------------------------------------------------- diff --git a/features/tdd_stdio_transport.feature b/features/tdd_stdio_transport.feature index 11c6b9191..be343a197 100644 --- a/features/tdd_stdio_transport.feature +++ b/features/tdd_stdio_transport.feature @@ -120,4 +120,4 @@ Feature: Stdio MCP Transport Given an MCP server config using the stdio stub server And a connected stdio transport When I send a "test/custom_notification" notification with params {} - Then the MCP stdio transport should still be connected \ No newline at end of file + Then the MCP stdio transport should still be connected diff --git a/robot/action_schema.robot b/robot/action_schema.robot index 4469e0bd7..c1e592df4 100644 --- a/robot/action_schema.robot +++ b/robot/action_schema.robot @@ -49,4 +49,3 @@ Reject Invalid Action YAML Log ${result.stdout} Should Be Equal As Integers ${result.rc} 0 Should Contain ${result.stdout} action-schema-expected-fail - diff --git a/robot/e2e/m5_acceptance.robot b/robot/e2e/m5_acceptance.robot index cf4a589d7..623c01438 100644 --- a/robot/e2e/m5_acceptance.robot +++ b/robot/e2e/m5_acceptance.robot @@ -315,7 +315,7 @@ Context Policy - Verify Strategize View ... msg=resolved strategize view should include docs/**/*.md # ----------------------------------------------------------------------- # 3. Budget Enforcement โ€” max_file_size / max_total_size -# ----------------------------------------------------------------------- +# ----------------------------------------------------------------------- Budget Enforcement โ€” Create Project With Tight Budget [Documentation] Create a project, link resource, and set tight budget constraints. [Tags] E2E tdd_issue tdd_issue_4188 tdd_expected_fail @@ -387,7 +387,7 @@ Budget Enforcement โ€” Simulate Context Assembly (Structural) ... msg=total_tokens should be numeric # ----------------------------------------------------------------------- # 4. Context Analysis โ€” meaningful summaries -# ----------------------------------------------------------------------- +# ----------------------------------------------------------------------- Context Analysis โ€” Create Project With ACMS Config [Documentation] Create a project and configure ACMS pipeline parameters. ... Uses **non-default** values to avoid vacuous assertions โ€” @@ -509,7 +509,7 @@ Context Analysis - Show Full Policy With ACMS Config ... msg=ACMS cold_max_decisions should be 3500 (configured value) # ----------------------------------------------------------------------- # 5. Plan Execution โ€” ACMS context with real LLM calls -# ----------------------------------------------------------------------- +# ----------------------------------------------------------------------- Plan Execution โ€” Create Project And Configure ACMS [Documentation] Set up a project with ACMS context for plan tests. [Tags] E2E tdd_issue tdd_issue_4188 tdd_expected_fail diff --git a/robot/e2e/wf04_multi_project.robot b/robot/e2e/wf04_multi_project.robot index cc7e3fafc..9537a5737 100644 --- a/robot/e2e/wf04_multi_project.robot +++ b/robot/e2e/wf04_multi_project.robot @@ -318,22 +318,3 @@ WF04 Multi Project Dependency Update Supervised Profile Skip If No LLM Keys # Initialise test variable for teardown access. Set Test Variable ${WF04_PLAN_ID} ${EMPTY} - - - - - - - - - - - - - - - - - - - diff --git a/robot/e2e/wf05_db_migration.robot b/robot/e2e/wf05_db_migration.robot index 6960f6ebe..7b5a50341 100644 --- a/robot/e2e/wf05_db_migration.robot +++ b/robot/e2e/wf05_db_migration.robot @@ -121,25 +121,3 @@ WF05 Database Schema Migration With Safety Nets Review Profile Skip If No LLM Keys # Initialise test variable for teardown access. Set Test Variable ${WF05_PLAN_ID} ${EMPTY} - - - - - - - - - - - - - - - - - - - - - - diff --git a/robot/e2e/wf12_hierarchical.robot b/robot/e2e/wf12_hierarchical.robot index 7ab043546..4f51e88ed 100644 --- a/robot/e2e/wf12_hierarchical.robot +++ b/robot/e2e/wf12_hierarchical.robot @@ -126,20 +126,3 @@ WF12 Large Scale Hierarchical Feature Implementation [Timeout] 35 minutes # TDD placeholder - implementation pending Fail WF12 hierarchical decomposition not yet implemented (TDD placeholder) - - - - - - - - - - - - - - - - - diff --git a/robot/e2e/wf16_devcontainer.robot b/robot/e2e/wf16_devcontainer.robot index 2de85ce32..8c33ba6a0 100644 --- a/robot/e2e/wf16_devcontainer.robot +++ b/robot/e2e/wf16_devcontainer.robot @@ -132,15 +132,3 @@ WF16 Devcontainer Driven Development Supervised Profile Skip If No LLM Keys ${ac_checks_missing}= Evaluate [] Set Test Variable ${WF16_PLAN_ID} ${EMPTY} - - - - - - - - - - - - diff --git a/robot/e2e/wf17_explicit_container.robot b/robot/e2e/wf17_explicit_container.robot index 0e61b22db..b651a83f2 100644 --- a/robot/e2e/wf17_explicit_container.robot +++ b/robot/e2e/wf17_explicit_container.robot @@ -125,7 +125,3 @@ WF17 TDD Precedence Level 2 Project Override Resolution [Timeout] 10 minutes # TDD placeholder - test implementation pending Skip Test implementation pending for precedence level 2 project override resolution - - - - diff --git a/robot/scientific_paper_basic.robot b/robot/scientific_paper_basic.robot index 8182f3572..d805ca3eb 100644 --- a/robot/scientific_paper_basic.robot +++ b/robot/scientific_paper_basic.robot @@ -80,4 +80,3 @@ Should Contain Any IF ${status} RETURN END Fail Text does not contain any of: @{patterns} - diff --git a/robot/scientific_paper_e2e_test.robot b/robot/scientific_paper_e2e_test.robot index 67d70f506..1b3e82ee3 100644 --- a/robot/scientific_paper_e2e_test.robot +++ b/robot/scientific_paper_e2e_test.robot @@ -257,4 +257,3 @@ Length Should Be Greater Than [Documentation] Check if text length is greater than minimum ${length}= Get Length ${text} Should Be True ${length} > ${min_length} Text length ${length} is not greater than ${min_length} - diff --git a/scripts/opencode-builder.sh b/scripts/opencode-builder.sh index b3bb29072..67662f459 100755 --- a/scripts/opencode-builder.sh +++ b/scripts/opencode-builder.sh @@ -1198,4 +1198,4 @@ main_loop() { exit 0 } -main_loop \ No newline at end of file +main_loop diff --git a/src/cleveragents/infrastructure/database/migrations/README b/src/cleveragents/infrastructure/database/migrations/README index 98e4f9c44..2500aa1bc 100644 --- a/src/cleveragents/infrastructure/database/migrations/README +++ b/src/cleveragents/infrastructure/database/migrations/README @@ -1 +1 @@ -Generic single-database configuration. \ No newline at end of file +Generic single-database configuration.