@moretea-labs/forge 1.5.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +120 -0
- package/CHANGELOG.md +36 -0
- package/CLAUDE.md +120 -0
- package/CODE_OF_CONDUCT.md +23 -0
- package/CONTRIBUTING.md +77 -0
- package/LICENSE +22 -0
- package/NOTICE +9 -0
- package/README.en.md +5 -0
- package/README.es.md +12 -0
- package/README.fr.md +12 -0
- package/README.ja.md +12 -0
- package/README.md +132 -0
- package/README.zh-CN.md +84 -0
- package/SECURITY.md +50 -0
- package/SKILL.md +431 -0
- package/SUPPORT.md +31 -0
- package/THIRD_PARTY_NOTICES.md +18 -0
- package/agents/openai.yaml +4 -0
- package/assets/AGENTS.md +68 -0
- package/assets/CLAUDE.md +68 -0
- package/assets/branding/README.md +10 -0
- package/assets/branding/forge-controller-flow.mmd +8 -0
- package/assets/hooks/AGENTS.md +75 -0
- package/assets/hooks/CLAUDE.md +75 -0
- package/assets/hooks/anti-simplification.sh +12 -0
- package/assets/hooks/changelog-guard.sh +80 -0
- package/assets/hooks/codex.hooks.template.json +60 -0
- package/assets/hooks/first-principles-guard.sh +72 -0
- package/assets/hooks/hook-input.sh +618 -0
- package/assets/hooks/lib/session-state.sh +106 -0
- package/assets/hooks/lib/workflow-state.sh +1730 -0
- package/assets/hooks/post-bash.sh +215 -0
- package/assets/hooks/post-edit-guard.sh +256 -0
- package/assets/hooks/post-tool-observer.sh +99 -0
- package/assets/hooks/pre-edit-guard.sh +240 -0
- package/assets/hooks/prompt-guard.sh +1077 -0
- package/assets/hooks/run-hook.sh +67 -0
- package/assets/hooks/security-sentinel.sh +115 -0
- package/assets/hooks/session-start-context.sh +593 -0
- package/assets/hooks/settings.template.json +60 -0
- package/assets/hooks/stop-orchestrator.sh +171 -0
- package/assets/hooks/subagent-return-channel-guard.sh +107 -0
- package/assets/hooks/worktree-guard.sh +39 -0
- package/assets/initializer-question-pack.v1.json +132 -0
- package/assets/initializer-question-pack.v1.schema.json +46 -0
- package/assets/initializer-question-pack.v2.json +174 -0
- package/assets/initializer-question-pack.v3.json +206 -0
- package/assets/initializer-question-pack.v3.schema.json +92 -0
- package/assets/initializer-question-pack.v4.json +557 -0
- package/assets/initializer-question-pack.v4.schema.json +169 -0
- package/assets/partials/01-header.partial.md +10 -0
- package/assets/partials/02-iron-rules.partial.md +30 -0
- package/assets/partials/03-philosophy.partial.md +32 -0
- package/assets/partials/04-project-structure.partial.md +56 -0
- package/assets/partials/05-workflow.partial.md +79 -0
- package/assets/partials/06-cloudflare.partial.md +20 -0
- package/assets/partials/07-footer.partial.md +38 -0
- package/assets/partials/08-orchestration.partial.md +49 -0
- package/assets/partials/09-compact-instructions.partial.md +11 -0
- package/assets/partials/_assembly-order.md +40 -0
- package/assets/partials-agents/01-header.partial.md +8 -0
- package/assets/partials-agents/02-operating-mode.partial.md +44 -0
- package/assets/partials-agents/03-orchestration.partial.md +45 -0
- package/assets/partials-agents/04-task-protocol.partial.md +69 -0
- package/assets/partials-agents/05-coding-constraints.partial.md +20 -0
- package/assets/partials-agents/06-quality-safety.partial.md +23 -0
- package/assets/partials-agents/07-cloudflare.partial.md +9 -0
- package/assets/partials-agents/08-deep-docs.partial.md +32 -0
- package/assets/plan-map.json +301 -0
- package/assets/plugin-registry.v1.json +8 -0
- package/assets/project-structures/ai-native-collaborative-editor.txt +25 -0
- package/assets/project-structures/ai-native-product-copilot.txt +21 -0
- package/assets/project-structures/ai-native-runtime-console.txt +25 -0
- package/assets/project-structures/ai-native-sidecar-kernel.txt +19 -0
- package/assets/project-structures/astro-ssr.txt +25 -0
- package/assets/project-structures/expo-nativewind.txt +52 -0
- package/assets/project-structures/monorepo.txt +63 -0
- package/assets/project-structures/remix.txt +50 -0
- package/assets/project-structures/tanstack-start-workers.txt +51 -0
- package/assets/project-structures/vite-tanstack.txt +58 -0
- package/assets/reference-configs/AGENTS.md +13 -0
- package/assets/reference-configs/CLAUDE.md +13 -0
- package/assets/reference-configs/agentic-development-flow.md +94 -0
- package/assets/reference-configs/ai-workflows.md +14 -0
- package/assets/reference-configs/changelog-versioning.md +13 -0
- package/assets/reference-configs/coding-standards.md +14 -0
- package/assets/reference-configs/development-protocol.md +21 -0
- package/assets/reference-configs/document-generation.md +38 -0
- package/assets/reference-configs/evaluator-rubric.md +19 -0
- package/assets/reference-configs/external-tooling.md +374 -0
- package/assets/reference-configs/git-strategy.md +14 -0
- package/assets/reference-configs/global-working-rules.md +64 -0
- package/assets/reference-configs/handoff-protocol.md +38 -0
- package/assets/reference-configs/harness-overview.md +124 -0
- package/assets/reference-configs/heartbeat-triage.md +57 -0
- package/assets/reference-configs/hook-operations.md +96 -0
- package/assets/reference-configs/release-deploy.md +40 -0
- package/assets/reference-configs/spa-day-protocol.md +14 -0
- package/assets/reference-configs/sprint-contracts.md +89 -0
- package/assets/reference-configs/workflow-orchestration.md +14 -0
- package/assets/skill-hooks.json +41 -0
- package/assets/skill-version.json +189 -0
- package/assets/skills/claude-review/SKILL.md +231 -0
- package/assets/skills/codex-review/SKILL.md +103 -0
- package/assets/templates/AGENTS.md +13 -0
- package/assets/templates/CLAUDE.md +13 -0
- package/assets/templates/architecture.template.md +80 -0
- package/assets/templates/brief.template.md +38 -0
- package/assets/templates/contract.template.md +104 -0
- package/assets/templates/decisions.template.md +85 -0
- package/assets/templates/factor-factory/factor-backtest-report.template.md +36 -0
- package/assets/templates/factor-factory/factor-hypothesis.template.md +30 -0
- package/assets/templates/factor-factory/factor-registry.template.json +5 -0
- package/assets/templates/gitignore.template +53 -0
- package/assets/templates/guides/metro-esm-gotchas.template.md +46 -0
- package/assets/templates/helpers/architecture-event.ts +822 -0
- package/assets/templates/helpers/architecture-queue.sh +647 -0
- package/assets/templates/helpers/archive-architecture-request.sh +244 -0
- package/assets/templates/helpers/archive-workflow.sh +295 -0
- package/assets/templates/helpers/capability-config.ts +394 -0
- package/assets/templates/helpers/capability-resolver.ts +505 -0
- package/assets/templates/helpers/capture-plan.sh +335 -0
- package/assets/templates/helpers/check-agent-tooling.sh +1533 -0
- package/assets/templates/helpers/check-architecture-sync.sh +287 -0
- package/assets/templates/helpers/check-brain-manifest.sh +255 -0
- package/assets/templates/helpers/check-context-files.sh +49 -0
- package/assets/templates/helpers/check-deploy-sql-order.sh +117 -0
- package/assets/templates/helpers/check-skill-version.ts +193 -0
- package/assets/templates/helpers/check-task-sync.sh +65 -0
- package/assets/templates/helpers/check-task-workflow.sh +1002 -0
- package/assets/templates/helpers/codex-handoff-resume.sh +269 -0
- package/assets/templates/helpers/context-contract-sync.sh +516 -0
- package/assets/templates/helpers/contract-run.ts +465 -0
- package/assets/templates/helpers/contract-worktree.sh +725 -0
- package/assets/templates/helpers/ensure-task-workflow.sh +1218 -0
- package/assets/templates/helpers/harness-trace-grade.sh +150 -0
- package/assets/templates/helpers/heartbeat-triage.sh +361 -0
- package/assets/templates/helpers/inspect-project-state.ts +280 -0
- package/assets/templates/helpers/maintenance-triage.sh +167 -0
- package/assets/templates/helpers/migrate-project-template.sh +54 -0
- package/assets/templates/helpers/migrate-workflow-docs.ts +413 -0
- package/assets/templates/helpers/new-plan.sh +183 -0
- package/assets/templates/helpers/new-spec.sh +50 -0
- package/assets/templates/helpers/new-sprint.sh +49 -0
- package/assets/templates/helpers/plan-to-todo.sh +799 -0
- package/assets/templates/helpers/prepare-codex-handoff.sh +203 -0
- package/assets/templates/helpers/prepare-handoff.sh +81 -0
- package/assets/templates/helpers/refresh-current-status.sh +469 -0
- package/assets/templates/helpers/select-agent-context-blocks.sh +66 -0
- package/assets/templates/helpers/ship-worktrees.sh +561 -0
- package/assets/templates/helpers/sprint-backlog.sh +837 -0
- package/assets/templates/helpers/summarize-failures.sh +125 -0
- package/assets/templates/helpers/switch-plan.sh +153 -0
- package/assets/templates/helpers/sync-brain-docs.sh +381 -0
- package/assets/templates/helpers/verify-contract.sh +705 -0
- package/assets/templates/helpers/verify-sprint.sh +680 -0
- package/assets/templates/helpers/workflow-contract.ts +202 -0
- package/assets/templates/helpers/workstream-sync.sh +263 -0
- package/assets/templates/implementation-notes.template.md +37 -0
- package/assets/templates/packages.template.md +45 -0
- package/assets/templates/plan.template.md +77 -0
- package/assets/templates/prd.template.md +165 -0
- package/assets/templates/research.template.md +25 -0
- package/assets/templates/review.template.md +78 -0
- package/assets/templates/spec.template.md +31 -0
- package/assets/templates/sprint.template.md +69 -0
- package/assets/templates/tech-stack.template.md +57 -0
- package/assets/versions.json +77 -0
- package/assets/workflow-contract.v1.json +671 -0
- package/bin/forge-desktop-helper.mjs +204 -0
- package/bin/forge-hook.mjs +32 -0
- package/bin/forge-runtime-service.mjs +34 -0
- package/bin/forge-runtime.mjs +30 -0
- package/bin/forge.mjs +32 -0
- package/docs/CHANGELOG.md +978 -0
- package/docs/README.md +72 -0
- package/docs/README.zh-CN.md +58 -0
- package/docs/architecture/chatgpt-handoff-facade.md +393 -0
- package/docs/architecture/current/README.md +158 -0
- package/docs/architecture/current/approved-target-architecture.zh-CN.md +1501 -0
- package/docs/architecture/current/architecture-invariants.md +331 -0
- package/docs/architecture/current/automation-and-schedule-engine.md +453 -0
- package/docs/architecture/current/codegraph-context-provider.md +226 -0
- package/docs/architecture/current/control-plane-authority-inventory.md +82 -0
- package/docs/architecture/current/controller-repository-decoupling.md +148 -0
- package/docs/architecture/current/dispatch-and-agent-strategy.md +354 -0
- package/docs/architecture/current/entity-model.md +619 -0
- package/docs/architecture/current/external-plugin-governance.md +396 -0
- package/docs/architecture/current/failure-recovery.md +471 -0
- package/docs/architecture/current/governance.md +213 -0
- package/docs/architecture/current/human-interaction-plane.md +87 -0
- package/docs/architecture/current/implementation-status.md +128 -0
- package/docs/architecture/current/job-and-run-lifecycle.md +413 -0
- package/docs/architecture/current/local-workspace-target-grants.md +70 -0
- package/docs/architecture/current/migration-roadmap.md +105 -0
- package/docs/architecture/current/multi-repository-execution.md +371 -0
- package/docs/architecture/current/operations-runbook.md +45 -0
- package/docs/architecture/current/peer-supercontroller-runtime.md +32 -0
- package/docs/architecture/current/personal-assistant-plugin-baseline.md +207 -0
- package/docs/architecture/current/repository-access-modes.md +102 -0
- package/docs/architecture/current/route-policy.md +15 -0
- package/docs/architecture/current/route-session-concurrency.md +85 -0
- package/docs/architecture/current/runtime-architecture-simplification.md +214 -0
- package/docs/architecture/current/runtime-directory-map.md +49 -0
- package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +85 -0
- package/docs/architecture/current/scheduler-and-resource-claims.md +432 -0
- package/docs/architecture/current/session-aware-execution-and-authorization.md +77 -0
- package/docs/architecture/current/system-overview.md +144 -0
- package/docs/architecture/current/target-requirements-traceability.md +202 -0
- package/docs/architecture/current/thin-harness-governance-policy.md +32 -0
- package/docs/architecture/current/thin-harness-v1.md +313 -0
- package/docs/architecture/current/verification-and-release-gates.md +391 -0
- package/docs/architecture/decisions/20260801-controller-home-sqlite-state.md +100 -0
- package/docs/architecture/decisions/20260803-canonical-skill-surface.md +40 -0
- package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +53 -0
- package/docs/architecture/diagrams/.gitkeep +1 -0
- package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +186 -0
- package/docs/architecture/domains/.gitkeep +0 -0
- package/docs/architecture/domains/public-surface.md +30 -0
- package/docs/architecture/domains/runtime-harness.md +33 -0
- package/docs/architecture/domains/verification.md +33 -0
- package/docs/architecture/domains/workflow-engine.md +30 -0
- package/docs/architecture/global-hook-runtime.md +162 -0
- package/docs/architecture/history.md +38 -0
- package/docs/architecture/index.md +114 -0
- package/docs/architecture/ios-semantic-automation-provider-v2.md +166 -0
- package/docs/architecture/modules/.gitkeep +0 -0
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +24 -0
- package/docs/architecture/requests/.gitkeep +1 -0
- package/docs/architecture/requests/archive/2026/20260528-154740-ai-hooks-ai-hooks-hook-input-sh.md +59 -0
- package/docs/architecture/requests/archive/2026/20260528-154816-assets-hooks-assets-hooks-hook-input-sh.md +59 -0
- package/docs/architecture/requests/archive/2026/20260528-161851-ai-harness-workflow-contract-json-ai-harness-workflow-contract-json.md +59 -0
- package/docs/architecture/requests/archive/2026/20260528-161853-scripts-check-task-workflow-sh-scripts-check-task-workflow-sh.md +59 -0
- package/docs/architecture/requests/archive/2026/20260528-161911-assets-workflow-contract-v1-json-assets-workflow-contract-v1-json.md +59 -0
- package/docs/architecture/requests/archive/2026/20260528-222416-ai-hooks-ai-hooks-hook-input-sh.md +59 -0
- package/docs/architecture/requests/archive/2026/20260528-222444-ai-hooks-ai-hooks-pre-edit-guard-sh.md +59 -0
- package/docs/architecture/requests/archive/2026/20260528-222457-ai-hooks-ai-hooks-pre-edit-guard-sh.md +59 -0
- package/docs/architecture/requests/archive/2026/20260528-222648-ai-hooks-ai-hooks-pre-edit-guard-sh.md +59 -0
- package/docs/architecture/requests/archive/2026/20260528-222705-ai-hooks-ai-hooks-worktree-guard-sh.md +59 -0
- package/docs/architecture/requests/archive/2026/20260528-222726-ai-hooks-ai-hooks-prompt-guard-sh.md +59 -0
- package/docs/architecture/requests/archive/2026/20260528-222727-ai-hooks-ai-hooks-prompt-guard-sh.md +59 -0
- package/docs/architecture/requests/archive/2026/20260528-224736-ai-hooks-ai-hooks-hook-input-sh.md +59 -0
- package/docs/architecture/requests/archive/2026/20260528-233259-ai-hooks-ai-hooks-prompt-guard-sh.md +59 -0
- package/docs/architecture/requests/archive/2026/20260528-233335-assets-hooks-assets-hooks-prompt-guard-sh.md +59 -0
- package/docs/architecture/requests/archive/2026/20260528-233456-ai-hooks-ai-hooks-prompt-guard-sh.md +59 -0
- package/docs/architecture/requests/archive/2026/20260528-233457-assets-hooks-assets-hooks-prompt-guard-sh.md +59 -0
- package/docs/architecture/requests/archive/2026/20260528-233637-ai-hooks-ai-hooks-prompt-guard-sh.md +59 -0
- package/docs/architecture/requests/archive/2026/20260528-233638-assets-hooks-assets-hooks-prompt-guard-sh.md +59 -0
- package/docs/architecture/requests/archive/2026/20260529-000322-root-package-json.md +59 -0
- package/docs/architecture/requests/archive/2026/20260529-004238-ai-hooks-ai-hooks-lib-workflow-state-sh.md +59 -0
- package/docs/architecture/requests/archive/2026/20260529-020654-ai-harness-policy-json-ai-harness-policy-json.md +63 -0
- package/docs/architecture/requests/archive/2026/20260529-094236-ai-hooks-ai-hooks-prompt-guard-sh.md +60 -0
- package/docs/architecture/requests/archive/2026/20260529-094323-assets-hooks-assets-hooks-prompt-guard-sh.md +60 -0
- package/docs/architecture/requests/archive/2026/20260529-094331-ai-hooks-ai-hooks-prompt-guard-sh.md +60 -0
- package/docs/architecture/requests/archive/2026/20260529-094339-assets-hooks-assets-hooks-prompt-guard-sh.md +60 -0
- package/docs/architecture/requests/archive/2026/20260529-094430-assets-hooks-assets-hooks-session-start-context-sh.md +60 -0
- package/docs/architecture/requests/archive/2026/20260529-094446-ai-hooks-ai-hooks-session-start-context-sh.md +60 -0
- package/docs/architecture/requests/archive/2026/20260613-002040-runtime-harness-hook-adapters.md +68 -0
- package/docs/architecture/requests/archive/2026/root.md +68 -0
- package/docs/architecture/requests/archive/2026/runtime-harness-hook-adapters.md +76 -0
- package/docs/architecture/requests/archive/2026/verification-evals-checks.md +68 -0
- package/docs/architecture/requests/archive/2026/workflow-engine-contract-assets.md +69 -0
- package/docs/architecture/reviews/2026-07-11-access-surface-review.md +99 -0
- package/docs/architecture/snapshots/.gitkeep +1 -0
- package/docs/forge-autonomous-goal-loop.md +7 -0
- package/docs/forge-chatgpt-browser-engine.md +11 -0
- package/docs/forge-chatgpt-mcp-setup.md +239 -0
- package/docs/forge-chatgpt-supervised-automation.md +11 -0
- package/docs/forge-github-issue-launcher.md +7 -0
- package/docs/forge-plugin-management.md +95 -0
- package/docs/forge-provider-configuration.md +7 -0
- package/docs/forge-runtime-self-healing-loop.md +7 -0
- package/docs/images/forge-banner-cn.svg +1 -0
- package/docs/images/forge-banner.svg +1 -0
- package/docs/images/forge-controller-flow.svg +1 -0
- package/docs/images/image.png +0 -0
- package/docs/images/repo-harness-gptpro-cn.png +0 -0
- package/docs/images/repo-harness-gptpro.png +0 -0
- package/docs/images/repo-harness-hook-carrot.png +0 -0
- package/docs/operations/chatgpt-personal-assistant-runtime.md +83 -0
- package/docs/operations/checkout-route-integrity.md +22 -0
- package/docs/operations/controller-browser-plugin.md +299 -0
- package/docs/operations/controller-desktop-plugin.md +112 -0
- package/docs/operations/controller-performance-and-502.md +126 -0
- package/docs/operations/controller-reliability-runbook.md +134 -0
- package/docs/operations/environment-hardening.md +50 -0
- package/docs/operations/features.md +45 -0
- package/docs/operations/features.zh-CN.md +45 -0
- package/docs/operations/github-repository.md +60 -0
- package/docs/operations/gmail-assistant-routines.md +186 -0
- package/docs/operations/homebrew.md +26 -0
- package/docs/operations/local-system-assistant.md +46 -0
- package/docs/operations/local-system-assistant.zh-CN.md +46 -0
- package/docs/operations/mcp-tool-exposure.md +58 -0
- package/docs/operations/mobile-intents-shortcuts.md +117 -0
- package/docs/operations/open-source-release-hygiene.md +31 -0
- package/docs/operations/personal-assistant-operator-guide.md +61 -0
- package/docs/operations/platform-support.md +62 -0
- package/docs/operations/platform-support.zh-CN.md +61 -0
- package/docs/operations/provider-configuration.md +31 -0
- package/docs/operations/releasing.md +86 -0
- package/docs/operations/releasing.zh-CN.md +86 -0
- package/docs/operations/route-session-concurrency-baseline.json +893 -0
- package/docs/operations/route-session-concurrency-baseline.md +94 -0
- package/docs/operations/runtime-performance-diagnostics.md +14 -0
- package/docs/operations/sqlite-control-plane-recovery.md +65 -0
- package/docs/operations/standalone-disaster-recovery.md +136 -0
- package/docs/operations/troubleshooting.md +72 -0
- package/docs/operations/troubleshooting.zh-CN.md +70 -0
- package/docs/public-usage-guide.md +33 -0
- package/docs/public-usage-guide.zh-CN.md +33 -0
- package/docs/tutorials/01-install-and-start.md +93 -0
- package/docs/tutorials/01-install-and-start.zh-CN.md +93 -0
- package/docs/tutorials/02-connect-chatgpt.md +82 -0
- package/docs/tutorials/02-connect-chatgpt.zh-CN.md +80 -0
- package/docs/tutorials/03-first-repository-task.md +57 -0
- package/docs/tutorials/03-first-repository-task.zh-CN.md +57 -0
- package/docs/tutorials/README.md +13 -0
- package/docs/tutorials/README.zh-CN.md +13 -0
- package/docs/wiki/Architecture.md +85 -0
- package/docs/wiki/Core-Concepts.md +27 -0
- package/docs/wiki/Home.md +36 -0
- package/docs/wiki/Implementation.md +172 -0
- package/docs/wiki/Installation.md +50 -0
- package/docs/wiki/Integrations.md +29 -0
- package/docs/wiki/Operations.md +26 -0
- package/docs/wiki/Quick-Start.md +46 -0
- package/docs/wiki/Releases-and-Upgrades.md +34 -0
- package/docs/wiki/Runtime-Architecture.md +50 -0
- package/docs/wiki/Security-Model.md +31 -0
- package/docs/wiki/Troubleshooting.md +38 -0
- package/docs/wiki/Work-Lifecycle.md +31 -0
- package/docs/wiki/_Sidebar.md +21 -0
- package/install.ps1 +48 -0
- package/install.sh +66 -0
- package/package.json +156 -0
- package/scripts/activate-source-baseline.ts +335 -0
- package/scripts/architecture-event.ts +822 -0
- package/scripts/architecture-queue.sh +647 -0
- package/scripts/archive-architecture-request.sh +244 -0
- package/scripts/archive-workflow.sh +295 -0
- package/scripts/assemble-template.ts +1172 -0
- package/scripts/benchmark-controller-hotpath.ts +212 -0
- package/scripts/benchmark-controller-round2.ts +139 -0
- package/scripts/benchmark-ios-agent-device.ts +514 -0
- package/scripts/benchmark-route-session-concurrency.ts +714 -0
- package/scripts/benchmark-thin-harness-gateway-ab.ts +632 -0
- package/scripts/benchmark-thin-harness-mcp-e2e.ts +479 -0
- package/scripts/benchmark-thin-harness.ts +251 -0
- package/scripts/bootstrap-runtime-maintenance-recovery.sh +183 -0
- package/scripts/canary-global-hook.sh +263 -0
- package/scripts/capability-config.ts +394 -0
- package/scripts/capability-resolver.ts +505 -0
- package/scripts/capture-plan.sh +335 -0
- package/scripts/check-agent-tooling.sh +1549 -0
- package/scripts/check-architecture-sync.sh +373 -0
- package/scripts/check-brain-manifest.sh +255 -0
- package/scripts/check-ci.sh +16 -0
- package/scripts/check-context-files.sh +49 -0
- package/scripts/check-deploy-sql-order.sh +117 -0
- package/scripts/check-mcp-compatibility.ts +93 -0
- package/scripts/check-npm-release.sh +32 -0
- package/scripts/check-open-source-tracked-surface.sh +146 -0
- package/scripts/check-package-identity.mjs +117 -0
- package/scripts/check-platform-support.mjs +79 -0
- package/scripts/check-public-docs.sh +105 -0
- package/scripts/check-public-release-surface.sh +19 -0
- package/scripts/check-release-published.sh +57 -0
- package/scripts/check-release-readiness.sh +43 -0
- package/scripts/check-release-version.mjs +74 -0
- package/scripts/check-runtime-architecture.mjs +593 -0
- package/scripts/check-runtime-env.mjs +89 -0
- package/scripts/check-skill-version.ts +193 -0
- package/scripts/check-tarball-install-smoke.sh +66 -0
- package/scripts/check-task-sync.sh +65 -0
- package/scripts/check-task-workflow.sh +1002 -0
- package/scripts/check-third-party-notices.mjs +36 -0
- package/scripts/codex-handoff-resume.sh +269 -0
- package/scripts/complete-control-plane-cutover.ts +126 -0
- package/scripts/context-contract-sync.sh +516 -0
- package/scripts/contract-run.ts +465 -0
- package/scripts/contract-worktree.sh +725 -0
- package/scripts/controller-ngrok-rotation.sh +678 -0
- package/scripts/create-project-dirs.sh +282 -0
- package/scripts/ensure-codegraph.sh +16 -0
- package/scripts/ensure-task-workflow.sh +1218 -0
- package/scripts/export-requirement-portfolio.ts +28 -0
- package/scripts/factor-lab-check.sh +73 -0
- package/scripts/factor-lab-new.sh +96 -0
- package/scripts/factor-lab-promote.sh +86 -0
- package/scripts/factor-lab-reject.sh +68 -0
- package/scripts/harness-trace-grade.sh +150 -0
- package/scripts/heartbeat-triage.sh +361 -0
- package/scripts/hook-dispatch-diet-report.ts +234 -0
- package/scripts/hook-shim.sh +93 -0
- package/scripts/init-project.sh +505 -0
- package/scripts/initializer-question-pack.ts +200 -0
- package/scripts/inspect-project-state.ts +280 -0
- package/scripts/install-desktop-operator-registration.ts +45 -0
- package/scripts/install-standalone-recovery.ts +74 -0
- package/scripts/lib/AGENTS.md +13 -0
- package/scripts/lib/CLAUDE.md +13 -0
- package/scripts/lib/controller-home-env.sh +69 -0
- package/scripts/lib/project-init-lib.sh +2759 -0
- package/scripts/load-standalone-recovery.sh +17 -0
- package/scripts/loop-engine-cutover-gate.ts +324 -0
- package/scripts/maintenance-triage.sh +167 -0
- package/scripts/migrate-project-template.sh +1189 -0
- package/scripts/migrate-requirement-portfolio.ts +86 -0
- package/scripts/migrate-workflow-docs.ts +413 -0
- package/scripts/new-plan.sh +183 -0
- package/scripts/new-spec.sh +50 -0
- package/scripts/new-sprint.sh +49 -0
- package/scripts/open-source-audit-allowlist.txt +46 -0
- package/scripts/package-source-archive.sh +147 -0
- package/scripts/plan-to-todo.sh +799 -0
- package/scripts/prepare-codex-handoff.sh +203 -0
- package/scripts/prepare-handoff.sh +81 -0
- package/scripts/public-release-files.txt +39 -0
- package/scripts/public-release.ts +174 -0
- package/scripts/publish-release-tarball.sh +27 -0
- package/scripts/refresh-current-status.sh +469 -0
- package/scripts/refresh-ios-physical-runtime.ts +196 -0
- package/scripts/repair-executable-modes.ts +8 -0
- package/scripts/rollout-all-registered-repos.sh +7 -0
- package/scripts/route-nl-vs-ts-eval.ts +679 -0
- package/scripts/run-bun-test-file.ts +182 -0
- package/scripts/run-governed-gate.ts +140 -0
- package/scripts/run-mobile-monitor-bridge.ts +71 -0
- package/scripts/run-skill-evals.ts +1022 -0
- package/scripts/run-skill-hook.ts +244 -0
- package/scripts/run-supervised-command.ts +24 -0
- package/scripts/run-tests-portable.sh +20 -0
- package/scripts/select-agent-context-blocks.sh +66 -0
- package/scripts/setup-plugins.sh +43 -0
- package/scripts/ship-worktrees.sh +561 -0
- package/scripts/smoke-browser-cdp-bridge.ts +93 -0
- package/scripts/smoke-chatgpt-supervised-automation.ts +208 -0
- package/scripts/smoke-ios-physical-device.ts +114 -0
- package/scripts/smoke-mcp-http-runtime.ts +216 -0
- package/scripts/smoke-mcp-tool-surface.ts +117 -0
- package/scripts/smoke-runtime-recovery.ts +220 -0
- package/scripts/smoke-schedule-engine.ts +283 -0
- package/scripts/sprint-backlog.sh +837 -0
- package/scripts/stage-runtime-release.ts +38 -0
- package/scripts/summarize-failures.sh +125 -0
- package/scripts/switch-plan.sh +153 -0
- package/scripts/sync-brain-docs.sh +381 -0
- package/scripts/sync-codex-installed-copies.sh +183 -0
- package/scripts/test-governance.ts +75 -0
- package/scripts/verify-contract.sh +705 -0
- package/scripts/verify-forge-runtime.sh +31 -0
- package/scripts/verify-sprint.sh +680 -0
- package/scripts/windows-paths.d.mts +7 -0
- package/scripts/windows-paths.mjs +28 -0
- package/scripts/workflow-contract.ts +206 -0
- package/scripts/workstream-sync.sh +263 -0
- package/src/cli/agent-jobs/executable-resolver.ts +289 -0
- package/src/cli/agent-jobs/executor-health.ts +252 -0
- package/src/cli/agent-jobs/integration.ts +963 -0
- package/src/cli/agent-jobs/job-manager.ts +2030 -0
- package/src/cli/agent-jobs/types.ts +219 -0
- package/src/cli/agent-jobs/worker-lifecycle.ts +288 -0
- package/src/cli/chatgpt-browser/bind-server.ts +504 -0
- package/src/cli/chatgpt-browser/binding.ts +140 -0
- package/src/cli/chatgpt-browser/bridge-extension.ts +221 -0
- package/src/cli/chatgpt-browser/bridge-provider.ts +268 -0
- package/src/cli/chatgpt-browser/engine.ts +569 -0
- package/src/cli/chatgpt-browser/file-policy.ts +158 -0
- package/src/cli/chatgpt-browser/native-provider.ts +553 -0
- package/src/cli/chatgpt-browser/oracle-provider.ts +437 -0
- package/src/cli/chatgpt-browser/prompt-assembler.ts +29 -0
- package/src/cli/chatgpt-browser/session-store.ts +301 -0
- package/src/cli/chatgpt-browser/types.ts +172 -0
- package/src/cli/commands/adopt-plan.ts +186 -0
- package/src/cli/commands/brain-root.ts +132 -0
- package/src/cli/commands/brain.ts +609 -0
- package/src/cli/commands/capability-context.ts +613 -0
- package/src/cli/commands/chatgpt.ts +424 -0
- package/src/cli/commands/controller.ts +680 -0
- package/src/cli/commands/docs.ts +103 -0
- package/src/cli/commands/doctor.ts +476 -0
- package/src/cli/commands/global-runtime.ts +323 -0
- package/src/cli/commands/hook.ts +34 -0
- package/src/cli/commands/init-hook.ts +870 -0
- package/src/cli/commands/init.ts +829 -0
- package/src/cli/commands/install.ts +86 -0
- package/src/cli/commands/mcp.ts +315 -0
- package/src/cli/commands/migrate.ts +154 -0
- package/src/cli/commands/plugin.ts +74 -0
- package/src/cli/commands/prompt-guard-decision.ts +238 -0
- package/src/cli/commands/recovery.ts +667 -0
- package/src/cli/commands/repository.ts +224 -0
- package/src/cli/commands/run.ts +23 -0
- package/src/cli/commands/runtime.ts +191 -0
- package/src/cli/commands/security.ts +440 -0
- package/src/cli/commands/status.ts +137 -0
- package/src/cli/commands/tools.ts +167 -0
- package/src/cli/controller/check-runner.ts +1022 -0
- package/src/cli/controller/codex-continuation.ts +153 -0
- package/src/cli/controller/completion-backlog.ts +380 -0
- package/src/cli/controller/completion-orchestrator.ts +1807 -0
- package/src/cli/controller/completion-target.ts +96 -0
- package/src/cli/controller/composite-operations.ts +196 -0
- package/src/cli/controller/composite-result.ts +130 -0
- package/src/cli/controller/context-pack.ts +652 -0
- package/src/cli/controller/execution-completion.ts +175 -0
- package/src/cli/controller/execution-policy.ts +392 -0
- package/src/cli/controller/governance.ts +594 -0
- package/src/cli/controller/issue-store.ts +1421 -0
- package/src/cli/controller/launch-agents.ts +410 -0
- package/src/cli/controller/legacy-issue-cutover.ts +415 -0
- package/src/cli/controller/lifecycle-authority.ts +16 -0
- package/src/cli/controller/migrated-issue-decision.ts +237 -0
- package/src/cli/controller/operational-plan.ts +226 -0
- package/src/cli/controller/postcondition.ts +134 -0
- package/src/cli/controller/progress.ts +656 -0
- package/src/cli/controller/project-state.ts +147 -0
- package/src/cli/controller/requirement-portfolio-export.ts +146 -0
- package/src/cli/controller/requirement-portfolio-migration.ts +613 -0
- package/src/cli/controller/run-evidence.ts +43 -0
- package/src/cli/controller/runtime-config.ts +92 -0
- package/src/cli/controller/stuck-state-migration.ts +396 -0
- package/src/cli/controller/task-ledger.ts +632 -0
- package/src/cli/controller/task-status-resolver.ts +403 -0
- package/src/cli/controller/types.ts +273 -0
- package/src/cli/controller/work-mode.ts +186 -0
- package/src/cli/controller/worklog.ts +201 -0
- package/src/cli/diagnostic-entry.ts +39 -0
- package/src/cli/editing/edit-session.ts +1606 -0
- package/src/cli/editing/executable-modes.ts +70 -0
- package/src/cli/github/github.ts +274 -0
- package/src/cli/github/plugin.ts +345 -0
- package/src/cli/github/session.ts +104 -0
- package/src/cli/hook/prompt-guard-decision.ts +238 -0
- package/src/cli/hook/prompt-intents.ts +534 -0
- package/src/cli/hook/route-registry.ts +107 -0
- package/src/cli/hook/runtime.ts +303 -0
- package/src/cli/hook/state-snapshot.ts +388 -0
- package/src/cli/hook-entry.ts +51 -0
- package/src/cli/index.ts +574 -0
- package/src/cli/installer/managed-entries.ts +78 -0
- package/src/cli/installer/shared.ts +65 -0
- package/src/cli/installer/targets/claude.ts +136 -0
- package/src/cli/installer/targets/codex.ts +174 -0
- package/src/cli/installer/targets/registry.ts +28 -0
- package/src/cli/installer/types.ts +72 -0
- package/src/cli/local-bridge/connector-freshness.ts +529 -0
- package/src/cli/local-bridge/console-view-models.ts +324 -0
- package/src/cli/local-bridge/dashboard.ts +1312 -0
- package/src/cli/local-bridge/facade-api.ts +1877 -0
- package/src/cli/local-bridge/job-store.ts +1451 -0
- package/src/cli/local-bridge/mobile-intents.ts +344 -0
- package/src/cli/local-bridge/mobile-monitor.ts +209 -0
- package/src/cli/local-bridge/server.ts +3183 -0
- package/src/cli/local-bridge/types.ts +176 -0
- package/src/cli/mcp/access-mode.ts +132 -0
- package/src/cli/mcp/access-tools.ts +387 -0
- package/src/cli/mcp/audit.ts +32 -0
- package/src/cli/mcp/auth.ts +402 -0
- package/src/cli/mcp/instructions.ts +33 -0
- package/src/cli/mcp/legacy-context.ts +16 -0
- package/src/cli/mcp/legacy-tool-service.ts +5516 -0
- package/src/cli/mcp/multi-repository.ts +423 -0
- package/src/cli/mcp/oauth.ts +226 -0
- package/src/cli/mcp/paths.ts +134 -0
- package/src/cli/mcp/policy.ts +230 -0
- package/src/cli/mcp/proxy-env.ts +62 -0
- package/src/cli/mcp/readiness-projection.ts +24 -0
- package/src/cli/mcp/redaction.ts +21 -0
- package/src/cli/mcp/repo.ts +24 -0
- package/src/cli/mcp/repository-tools.ts +1295 -0
- package/src/cli/mcp/server.ts +341 -0
- package/src/cli/mcp/setup.ts +793 -0
- package/src/cli/mcp/tool-capability-cache.ts +87 -0
- package/src/cli/mcp/tools.ts +9 -0
- package/src/cli/mcp/toolset-names.ts +70 -0
- package/src/cli/mcp/toolset-selection.ts +41 -0
- package/src/cli/mcp/toolset.ts +300 -0
- package/src/cli/mcp/transports/AGENTS.md +39 -0
- package/src/cli/mcp/transports/CLAUDE.md +39 -0
- package/src/cli/mcp/transports/http.ts +1234 -0
- package/src/cli/mcp/transports/session-registry.ts +428 -0
- package/src/cli/mcp/transports/stdio.ts +8 -0
- package/src/cli/mcp/types.ts +41 -0
- package/src/cli/mcp/umbrella-tools.ts +117 -0
- package/src/cli/repo-adoption/reclaim-runtime.ts +681 -0
- package/src/cli/repositories/branch-name-policy.ts +57 -0
- package/src/cli/repositories/command-classifier.ts +600 -0
- package/src/cli/repositories/command-executor.ts +1066 -0
- package/src/cli/repositories/command-normalization.ts +53 -0
- package/src/cli/repositories/command-scope.ts +264 -0
- package/src/cli/repositories/controller-home.ts +88 -0
- package/src/cli/repositories/entity-migration.ts +199 -0
- package/src/cli/repositories/ephemeral-workspace.ts +62 -0
- package/src/cli/repositories/git-command-executor.ts +301 -0
- package/src/cli/repositories/goal-registry.ts +239 -0
- package/src/cli/repositories/identity.ts +64 -0
- package/src/cli/repositories/local-project-onboarding.ts +539 -0
- package/src/cli/repositories/locks.ts +262 -0
- package/src/cli/repositories/registry.ts +1057 -0
- package/src/cli/repositories/runtime-storage.ts +411 -0
- package/src/cli/repositories/safe-patch.ts +421 -0
- package/src/cli/repositories/selected-path-actions.ts +341 -0
- package/src/cli/repositories/structured-git.ts +257 -0
- package/src/cli/repositories/types.ts +155 -0
- package/src/cli/repositories/umbrella.ts +134 -0
- package/src/cli/repositories/workbench.ts +140 -0
- package/src/cli/repositories/worktree-storage.ts +137 -0
- package/src/cli/repository/inspector.ts +637 -0
- package/src/cli/repository/session-cache.ts +453 -0
- package/src/cli/runtime/helper-runner.ts +172 -0
- package/src/cli/runtime-invocation.ts +318 -0
- package/src/cli/tools/codegraph.ts +676 -0
- package/src/cli/v81-entry.ts +29 -0
- package/src/core/adoption/gitignore-plan.ts +127 -0
- package/src/core/adoption/helper-wrapper-plan.ts +159 -0
- package/src/core/adoption/manifest-templates.ts +60 -0
- package/src/core/adoption/modes.ts +7 -0
- package/src/core/adoption/operations.ts +126 -0
- package/src/core/adoption/plan.ts +149 -0
- package/src/core/adoption/render.ts +70 -0
- package/src/core/adoption/rollback.ts +62 -0
- package/src/core/adoption/summary.ts +43 -0
- package/src/core/adoption/workflow-contract-asset.ts +14 -0
- package/src/core/adoption/workflow-contract-plan.ts +31 -0
- package/src/effects/fs-transaction.ts +540 -0
- package/src/effects/git-executable.ts +59 -0
- package/src/effects/managed-block.ts +86 -0
- package/src/effects/path-safety.ts +47 -0
- package/src/effects/process-runner.ts +192 -0
- package/src/runtime/assistant/action-proposals.ts +279 -0
- package/src/runtime/assistant/intent.ts +395 -0
- package/src/runtime/assistant/model-provider.ts +460 -0
- package/src/runtime/assistant/openapi.ts +223 -0
- package/src/runtime/assistant/policy.ts +89 -0
- package/src/runtime/assistant/readiness.ts +258 -0
- package/src/runtime/assistant/routine-runtime.ts +477 -0
- package/src/runtime/assistant/schedule-binding.ts +171 -0
- package/src/runtime/assistant/standing-grants.ts +375 -0
- package/src/runtime/assistant/store.ts +243 -0
- package/src/runtime/assistant/types.ts +135 -0
- package/src/runtime/context/codegraph-read-provider.ts +347 -0
- package/src/runtime/context/codegraph-sidecar.cjs +207 -0
- package/src/runtime/control-plane/dispatch-priority.ts +67 -0
- package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +151 -0
- package/src/runtime/control-plane/execution/execution-identity.ts +456 -0
- package/src/runtime/control-plane/execution/session-store.ts +175 -0
- package/src/runtime/control-plane/execution/validation.ts +117 -0
- package/src/runtime/control-plane/execution/verification-evidence.ts +191 -0
- package/src/runtime/control-plane/execution/work-handle-store.ts +225 -0
- package/src/runtime/control-plane/execution/work-prepare-request-store.ts +159 -0
- package/src/runtime/control-plane/execution/work-task-receipt.ts +445 -0
- package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +821 -0
- package/src/runtime/control-plane/facade/capability-registry.ts +279 -0
- package/src/runtime/control-plane/facade/check-normalization.ts +233 -0
- package/src/runtime/control-plane/facade/codex-delegation.ts +196 -0
- package/src/runtime/control-plane/facade/controller-session-store.ts +199 -0
- package/src/runtime/control-plane/facade/facade-result.ts +41 -0
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +177 -0
- package/src/runtime/control-plane/facade/goal-workloop.ts +1216 -0
- package/src/runtime/control-plane/facade/handoff-inbox-store.ts +221 -0
- package/src/runtime/control-plane/facade/index.ts +16 -0
- package/src/runtime/control-plane/facade/operation-digest.ts +528 -0
- package/src/runtime/control-plane/facade/plan-contract-store.ts +403 -0
- package/src/runtime/control-plane/facade/policy-gate.ts +149 -0
- package/src/runtime/control-plane/facade/requirement-board.ts +280 -0
- package/src/runtime/control-plane/facade/self-healing-loop.ts +555 -0
- package/src/runtime/control-plane/facade/suggested-actions.ts +108 -0
- package/src/runtime/control-plane/facade/types.ts +729 -0
- package/src/runtime/control-plane/facade/work-admission-policy.ts +93 -0
- package/src/runtime/control-plane/facade/work-continuation.ts +104 -0
- package/src/runtime/control-plane/facade/work-contract-store.ts +1118 -0
- package/src/runtime/control-plane/facade/work-task-projection.ts +66 -0
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +365 -0
- package/src/runtime/control-plane/global-scheduler/scheduler.ts +920 -0
- package/src/runtime/control-plane/global-scheduler/wake-signal.ts +89 -0
- package/src/runtime/control-plane/goal-loop/config-facade.ts +700 -0
- package/src/runtime/control-plane/goal-loop/config-store.ts +570 -0
- package/src/runtime/control-plane/goal-loop/config-types.ts +213 -0
- package/src/runtime/control-plane/goal-loop/executor-router.ts +109 -0
- package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +149 -0
- package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +304 -0
- package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +1001 -0
- package/src/runtime/control-plane/goal-loop/handoff-packet.ts +160 -0
- package/src/runtime/control-plane/goal-loop/index.ts +13 -0
- package/src/runtime/control-plane/goal-loop/local-tools.ts +290 -0
- package/src/runtime/control-plane/goal-loop/policy-gates.ts +203 -0
- package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +93 -0
- package/src/runtime/control-plane/goal-loop/provider-registry.ts +545 -0
- package/src/runtime/control-plane/goal-loop/types.ts +378 -0
- package/src/runtime/control-plane/governance/access-policy.ts +147 -0
- package/src/runtime/control-plane/governance/authorization.ts +195 -0
- package/src/runtime/control-plane/governance/external-effects.ts +43 -0
- package/src/runtime/control-plane/launcher/thin-launcher.ts +97 -0
- package/src/runtime/control-plane/persistence/metadata-payload-policy.ts +53 -0
- package/src/runtime/control-plane/persistence/requirement-store.ts +241 -0
- package/src/runtime/control-plane/persistence/sqlite-store.ts +539 -0
- package/src/runtime/control-plane/release-retention.ts +447 -0
- package/src/runtime/control-plane/repo-actor/actor.ts +181 -0
- package/src/runtime/control-plane/repo-actor/registry.ts +20 -0
- package/src/runtime/control-plane/routing/index.ts +1 -0
- package/src/runtime/control-plane/routing/route-policy.ts +379 -0
- package/src/runtime/control-plane/runtime-cleanup.ts +727 -0
- package/src/runtime/control-plane/runtime-generation.ts +509 -0
- package/src/runtime/control-plane/runtime-pid-ownership.ts +11 -0
- package/src/runtime/control-plane/runtime-status-client.ts +90 -0
- package/src/runtime/control-plane/startup-recovery.ts +198 -0
- package/src/runtime/diagnostics/connectivity-observability.ts +475 -0
- package/src/runtime/diagnostics/mcp-timing.ts +64 -0
- package/src/runtime/diagnostics/performance.ts +379 -0
- package/src/runtime/diagnostics/process-facade.ts +350 -0
- package/src/runtime/diagnostics/read-only-tool.ts +226 -0
- package/src/runtime/evidence/artifact-store.ts +154 -0
- package/src/runtime/evidence/event-ledger.ts +80 -0
- package/src/runtime/evidence/evidence-store.ts +68 -0
- package/src/runtime/evidence/process-check-receipt.ts +43 -0
- package/src/runtime/evidence/result-store.ts +209 -0
- package/src/runtime/evidence/sensitive-output.ts +353 -0
- package/src/runtime/execution/jobs/child-reference.ts +124 -0
- package/src/runtime/execution/jobs/legacy-adapter.ts +22 -0
- package/src/runtime/execution/jobs/receipt-recovery.ts +119 -0
- package/src/runtime/execution/jobs/receipt-store.ts +243 -0
- package/src/runtime/execution/jobs/store.ts +737 -0
- package/src/runtime/execution/jobs/timeouts.ts +109 -0
- package/src/runtime/execution/jobs/types.ts +230 -0
- package/src/runtime/execution/jobs/wait.ts +45 -0
- package/src/runtime/execution/process-runtime/canary.ts +26 -0
- package/src/runtime/execution/process-runtime/check-facade.ts +272 -0
- package/src/runtime/execution/process-runtime/check-receipt.ts +185 -0
- package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +60 -0
- package/src/runtime/execution/process-runtime/command-facade.ts +321 -0
- package/src/runtime/execution/process-runtime/gc.ts +171 -0
- package/src/runtime/execution/process-runtime/index.ts +9 -0
- package/src/runtime/execution/process-runtime/interactive-admission.ts +23 -0
- package/src/runtime/execution/process-runtime/process-runner-entry.ts +466 -0
- package/src/runtime/execution/process-runtime/resource-claims.ts +440 -0
- package/src/runtime/execution/process-runtime/runtime.ts +1816 -0
- package/src/runtime/execution/process-runtime/store.ts +687 -0
- package/src/runtime/execution/process-runtime/types.ts +352 -0
- package/src/runtime/execution/thin-harness/async-process.ts +181 -0
- package/src/runtime/execution/thin-harness/batch-executor.ts +671 -0
- package/src/runtime/execution/thin-harness/execution-router.ts +700 -0
- package/src/runtime/execution/thin-harness/fast-executor.ts +1263 -0
- package/src/runtime/execution/thin-harness/fast-receipt.ts +235 -0
- package/src/runtime/execution/thin-harness/fingerprint-worker.ts +191 -0
- package/src/runtime/execution/thin-harness/index.ts +13 -0
- package/src/runtime/execution/thin-harness/latency-trace.ts +107 -0
- package/src/runtime/execution/thin-harness/lightweight-lanes.ts +745 -0
- package/src/runtime/execution/thin-harness/mutation-gate.ts +578 -0
- package/src/runtime/execution/thin-harness/proposal-store.ts +409 -0
- package/src/runtime/execution/thin-harness/request-ledger.ts +595 -0
- package/src/runtime/execution/thin-harness/search-worker.ts +114 -0
- package/src/runtime/execution/thin-harness/types.ts +313 -0
- package/src/runtime/execution/thin-harness/workspace-savepoint.ts +333 -0
- package/src/runtime/execution/workers/executor.ts +687 -0
- package/src/runtime/execution/workers/ownership.ts +94 -0
- package/src/runtime/execution/workers/worker-entry.ts +277 -0
- package/src/runtime/gateway/mcp/execution-tools.ts +2009 -0
- package/src/runtime/gateway/mcp/persisted-check-process.ts +255 -0
- package/src/runtime/gateway/mcp/process-tools.ts +230 -0
- package/src/runtime/gateway/mcp/resource-policy.ts +195 -0
- package/src/runtime/gateway/mcp/router.ts +1088 -0
- package/src/runtime/gateway/mcp/runtime-tools.ts +5994 -0
- package/src/runtime/gateway/mcp/work-validation-reconciler.ts +219 -0
- package/src/runtime/health/evaluator.ts +474 -0
- package/src/runtime/health/index.ts +2 -0
- package/src/runtime/health/operational-view.ts +198 -0
- package/src/runtime/maintenance/cleanup.ts +419 -0
- package/src/runtime/model-clients/deepseek-adapter.ts +312 -0
- package/src/runtime/model-clients/index.ts +2 -0
- package/src/runtime/model-clients/types.ts +101 -0
- package/src/runtime/observability/gateway-contention-metrics.ts +129 -0
- package/src/runtime/observability/route-session-benchmark.ts +110 -0
- package/src/runtime/personal-assistant/gmail-triage-manager.ts +231 -0
- package/src/runtime/personal-assistant/reporting-runtime.ts +344 -0
- package/src/runtime/personal-assistant/triage-runtime.ts +748 -0
- package/src/runtime/plugins/app-store-connect-adapter.ts +868 -0
- package/src/runtime/plugins/browser-adapter.ts +2812 -0
- package/src/runtime/plugins/browser-automation-service.ts +46 -0
- package/src/runtime/plugins/browser-handoff-host.ts +304 -0
- package/src/runtime/plugins/browser-handoff.ts +371 -0
- package/src/runtime/plugins/browser-macos-bridge.ts +865 -0
- package/src/runtime/plugins/browser-node-bridge-host.ts +64 -0
- package/src/runtime/plugins/browser-node-bridge.ts +249 -0
- package/src/runtime/plugins/desktop-adapter.ts +374 -0
- package/src/runtime/plugins/desktop-operator-registration.ts +418 -0
- package/src/runtime/plugins/errors.ts +39 -0
- package/src/runtime/plugins/execution-origin.ts +26 -0
- package/src/runtime/plugins/external-adapter.ts +322 -0
- package/src/runtime/plugins/external-registration.ts +308 -0
- package/src/runtime/plugins/external-unix-socket-probe.cjs +79 -0
- package/src/runtime/plugins/external-unix-socket.ts +238 -0
- package/src/runtime/plugins/first-party-registry.ts +37 -0
- package/src/runtime/plugins/github-adapter.ts +266 -0
- package/src/runtime/plugins/gmail-adapter.ts +729 -0
- package/src/runtime/plugins/google-calendar-adapter.ts +468 -0
- package/src/runtime/plugins/google-shared.ts +578 -0
- package/src/runtime/plugins/google-tasks-adapter.ts +535 -0
- package/src/runtime/plugins/interaction-session.ts +252 -0
- package/src/runtime/plugins/ios/agent-device-capabilities.ts +258 -0
- package/src/runtime/plugins/ios/agent-device-failures.ts +95 -0
- package/src/runtime/plugins/ios/agent-device-provider.ts +63 -0
- package/src/runtime/plugins/ios/agent-device-typed-provider.ts +268 -0
- package/src/runtime/plugins/ios/app-adapters.ts +122 -0
- package/src/runtime/plugins/ios-adapter.ts +509 -0
- package/src/runtime/plugins/ios-agent-device.ts +2311 -0
- package/src/runtime/plugins/ios-physical-device.ts +955 -0
- package/src/runtime/plugins/local-system-adapter.ts +1016 -0
- package/src/runtime/plugins/macos-capability-broker.ts +73 -0
- package/src/runtime/plugins/managed-process-adapter.ts +366 -0
- package/src/runtime/plugins/resend-adapter.ts +506 -0
- package/src/runtime/plugins/store.ts +1025 -0
- package/src/runtime/plugins/types.ts +138 -0
- package/src/runtime/projections/controller-context.ts +596 -0
- package/src/runtime/projections/git-status-sampler.ts +84 -0
- package/src/runtime/projections/invalidation.ts +250 -0
- package/src/runtime/projections/materialized-view.ts +694 -0
- package/src/runtime/recovery/actions.ts +158 -0
- package/src/runtime/recovery/audit.ts +38 -0
- package/src/runtime/recovery/classifier.ts +163 -0
- package/src/runtime/recovery/index.ts +9 -0
- package/src/runtime/recovery/local-jobs-repair.ts +393 -0
- package/src/runtime/recovery/maintenance-executor.ts +822 -0
- package/src/runtime/recovery/patch-handoff.ts +50 -0
- package/src/runtime/recovery/probe.ts +308 -0
- package/src/runtime/recovery/store.ts +35 -0
- package/src/runtime/recovery/types.ts +175 -0
- package/src/runtime/release/identity.ts +101 -0
- package/src/runtime/release/release-gate.ts +137 -0
- package/src/runtime/resources/claims/conflicts.ts +205 -0
- package/src/runtime/resources/index.ts +1 -0
- package/src/runtime/resources/leases/store.ts +539 -0
- package/src/runtime/resources/leases/types.ts +50 -0
- package/src/runtime/resources/ownership.ts +72 -0
- package/src/runtime/root/controller-services.ts +42 -0
- package/src/runtime/root/entry.ts +70 -0
- package/src/runtime/root/gateway-adapter.ts +46 -0
- package/src/runtime/root/local-bridge.ts +72 -0
- package/src/runtime/root/mcp-transport.ts +198 -0
- package/src/runtime/root/ownership.ts +94 -0
- package/src/runtime/root/readiness.ts +69 -0
- package/src/runtime/root/release-manifest.ts +147 -0
- package/src/runtime/root/release-materialize.ts +509 -0
- package/src/runtime/root/release-store.ts +236 -0
- package/src/runtime/root/runtime.ts +318 -0
- package/src/runtime/root/scheduler.ts +58 -0
- package/src/runtime/root/service-runner-entry.ts +20 -0
- package/src/runtime/root/service-runner.ts +69 -0
- package/src/runtime/root/service.ts +291 -0
- package/src/runtime/root/status.ts +127 -0
- package/src/runtime/root/types.ts +112 -0
- package/src/runtime/root/write-fence.ts +309 -0
- package/src/runtime/safe-tooling/browser-safe.ts +133 -0
- package/src/runtime/safe-tooling/external-filesystem.ts +304 -0
- package/src/runtime/safe-tooling/google-credential-store.ts +95 -0
- package/src/runtime/safe-tooling/google-oauth-broker.ts +286 -0
- package/src/runtime/safe-tooling/index.ts +11 -0
- package/src/runtime/safe-tooling/ios-development.ts +1039 -0
- package/src/runtime/safe-tooling/job-summary.ts +361 -0
- package/src/runtime/safe-tooling/plugin-summary.ts +53 -0
- package/src/runtime/safe-tooling/resend-oauth.ts +387 -0
- package/src/runtime/safe-tooling/review-artifacts.ts +133 -0
- package/src/runtime/safe-tooling/types.ts +103 -0
- package/src/runtime/safe-tooling/workspace-auth.ts +116 -0
- package/src/runtime/shared/bounded-child-supervisor.ts +235 -0
- package/src/runtime/shared/idempotent-retry.ts +128 -0
- package/src/runtime/shared/json-files.ts +43 -0
- package/src/runtime/shared/local-bridge-surface.ts +231 -0
- package/src/runtime/shared/managed-env.ts +154 -0
- package/src/runtime/shared/node-ts-loader.mjs +50 -0
- package/src/runtime/shared/process-environment.ts +97 -0
- package/src/runtime/shared/process-identity.ts +72 -0
- package/src/runtime/shared/process-tree.ts +227 -0
- package/src/runtime/shared/response-budget.ts +246 -0
- package/src/runtime/standalone-recovery/core.ts +2275 -0
- package/src/runtime/standalone-recovery/entry.ts +686 -0
- package/src/runtime/standalone-recovery/http-transport.ts +317 -0
- package/src/runtime/standalone-recovery/installer.ts +747 -0
- package/src/runtime/standalone-recovery/release.ts +241 -0
- package/src/runtime/watchdog/workflow-watchdog.ts +118 -0
- package/src/runtime/workflow/campaigns/cleanup.ts +263 -0
- package/src/runtime/workflow/campaigns/engine.ts +112 -0
- package/src/runtime/workflow/campaigns/normalize.ts +100 -0
- package/src/runtime/workflow/campaigns/review.ts +315 -0
- package/src/runtime/workflow/campaigns/store.ts +526 -0
- package/src/runtime/workflow/campaigns/supervisor.ts +112 -0
- package/src/runtime/workflow/campaigns/types.ts +290 -0
- package/src/runtime/workflow/campaigns/workspace-agent.ts +155 -0
- package/src/runtime/workflow/campaigns/workspace.ts +200 -0
- package/src/runtime/workflow/findings/store.ts +165 -0
- package/src/runtime/workflow/findings/types.ts +36 -0
- package/src/runtime/workflow/portfolio/engine.ts +20 -0
- package/src/runtime/workflow/portfolio/store.ts +185 -0
- package/src/runtime/workflow/portfolio/types.ts +29 -0
- package/src/runtime/workflow/schedules/engine.ts +620 -0
- package/src/runtime/workflow/schedules/settlement.ts +144 -0
- package/src/runtime/workflow/schedules/store.ts +417 -0
- package/src/runtime/workflow/schedules/types.ts +124 -0
- package/src/runtime/workspace-targets/index.ts +24 -0
- package/src/runtime/workspace-targets/target-grant.ts +721 -0
- package/src/testing/test-governance.ts +626 -0
- package/src/version.ts +21 -0
|
@@ -0,0 +1,1077 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Prompt Guard Hook — UserPromptSubmit
|
|
3
|
+
# Shell layer: filesystem authority (plan/contract/worktree state), capture
|
|
4
|
+
# side effects, and host-safe rendering. All prompt-text intent classification
|
|
5
|
+
# lives in the TypeScript engine behind `prompt-guard-decide`, which receives
|
|
6
|
+
# {"prompt": ...} on stdin plus PROMPT_GUARD_*_STATE env vars and returns a
|
|
7
|
+
# single-line verdict JSON (action + intent facts + derived strings).
|
|
8
|
+
#
|
|
9
|
+
# Prompt-layer plan/spec/contract gates are advisory: they explain the next
|
|
10
|
+
# workflow step and exit 0. PreToolUse keeps path/scope and private-surface
|
|
11
|
+
# safety authoritative while plan-state guidance defaults to advisory.
|
|
12
|
+
# Done-claim gates stay blocking only when they verify real failed or missing
|
|
13
|
+
# evidence rather than workflow ceremony.
|
|
14
|
+
|
|
15
|
+
set -eo pipefail
|
|
16
|
+
|
|
17
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
18
|
+
# shellcheck source=/dev/null
|
|
19
|
+
. "$SCRIPT_DIR/hook-input.sh"
|
|
20
|
+
# shellcheck source=/dev/null
|
|
21
|
+
. "$SCRIPT_DIR/lib/workflow-state.sh"
|
|
22
|
+
# shellcheck source=/dev/null
|
|
23
|
+
. "$SCRIPT_DIR/lib/session-state.sh"
|
|
24
|
+
|
|
25
|
+
# --- Filesystem/worktree helpers (shell-owned authority) ---
|
|
26
|
+
|
|
27
|
+
prompt_matches_worktree_record() {
|
|
28
|
+
local worktree_path="$1"
|
|
29
|
+
local branch_name="$2"
|
|
30
|
+
local path_base
|
|
31
|
+
|
|
32
|
+
[[ -n "$worktree_path" ]] || return 1
|
|
33
|
+
if printf '%s' "$PROMPT_INTENT_TEXT" | grep -Fq "$worktree_path"; then
|
|
34
|
+
return 0
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
path_base="$(basename "$worktree_path")"
|
|
38
|
+
if [[ -n "$path_base" ]] && printf '%s' "$PROMPT_INTENT_TEXT" | grep -Fq "$path_base"; then
|
|
39
|
+
return 0
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
if [[ -n "$branch_name" ]] && printf '%s' "$PROMPT_INTENT_TEXT" | grep -Fq "$branch_name"; then
|
|
43
|
+
return 0
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
return 1
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
prompt_linked_worktree_target() {
|
|
50
|
+
git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 1
|
|
51
|
+
git worktree list --porcelain >/dev/null 2>&1 || return 1
|
|
52
|
+
|
|
53
|
+
local current worktree_path branch_name line real_path active_plan
|
|
54
|
+
current="$(pwd -P)"
|
|
55
|
+
worktree_path=""
|
|
56
|
+
branch_name=""
|
|
57
|
+
|
|
58
|
+
while IFS= read -r line || [[ -n "$line" ]]; do
|
|
59
|
+
if [[ -z "$line" ]]; then
|
|
60
|
+
if [[ -n "$worktree_path" ]]; then
|
|
61
|
+
real_path="$(cd "$worktree_path" 2>/dev/null && pwd -P || true)"
|
|
62
|
+
active_plan="$(cat "$worktree_path/.ai/harness/active-plan" 2>/dev/null | xargs || true)"
|
|
63
|
+
if [[ -n "$real_path" && "$real_path" != "$current" ]] \
|
|
64
|
+
&& [[ -n "$active_plan" && -f "$worktree_path/$active_plan" ]] \
|
|
65
|
+
&& prompt_matches_worktree_record "$worktree_path" "$branch_name"; then
|
|
66
|
+
printf '%s' "$worktree_path"
|
|
67
|
+
return 0
|
|
68
|
+
fi
|
|
69
|
+
fi
|
|
70
|
+
worktree_path=""
|
|
71
|
+
branch_name=""
|
|
72
|
+
continue
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
case "$line" in
|
|
76
|
+
worktree\ *)
|
|
77
|
+
worktree_path="${line#worktree }"
|
|
78
|
+
;;
|
|
79
|
+
branch\ *)
|
|
80
|
+
branch_name="${line#branch }"
|
|
81
|
+
branch_name="${branch_name#refs/heads/}"
|
|
82
|
+
;;
|
|
83
|
+
esac
|
|
84
|
+
done < <(git worktree list --porcelain 2>/dev/null || true)
|
|
85
|
+
|
|
86
|
+
if [[ -n "$worktree_path" ]]; then
|
|
87
|
+
real_path="$(cd "$worktree_path" 2>/dev/null && pwd -P || true)"
|
|
88
|
+
active_plan="$(cat "$worktree_path/.ai/harness/active-plan" 2>/dev/null | xargs || true)"
|
|
89
|
+
if [[ -n "$real_path" && "$real_path" != "$current" ]] \
|
|
90
|
+
&& [[ -n "$active_plan" && -f "$worktree_path/$active_plan" ]] \
|
|
91
|
+
&& prompt_matches_worktree_record "$worktree_path" "$branch_name"; then
|
|
92
|
+
printf '%s' "$worktree_path"
|
|
93
|
+
return 0
|
|
94
|
+
fi
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
return 1
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
active_plan_marker_problem() {
|
|
101
|
+
local marker_file marker_plan owner current
|
|
102
|
+
|
|
103
|
+
current="$(pwd -P)"
|
|
104
|
+
if [[ -f "$ACTIVE_WORKTREE_MARKER" ]]; then
|
|
105
|
+
owner="$(cat "$ACTIVE_WORKTREE_MARKER" 2>/dev/null | xargs)"
|
|
106
|
+
if [[ -n "$owner" && "$owner" != "$current" ]]; then
|
|
107
|
+
printf 'active plan marker belongs to a different worktree: %s' "$owner"
|
|
108
|
+
return 0
|
|
109
|
+
fi
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
for marker_file in "$ACTIVE_PLAN_MARKER" "$LEGACY_ACTIVE_PLAN_MARKER"; do
|
|
113
|
+
[[ -f "$marker_file" ]] || continue
|
|
114
|
+
marker_plan="$(cat "$marker_file" 2>/dev/null | xargs)"
|
|
115
|
+
if [[ -n "$marker_plan" && ! -f "$marker_plan" ]]; then
|
|
116
|
+
printf 'stale active plan marker points to missing plan: %s' "$marker_plan"
|
|
117
|
+
return 0
|
|
118
|
+
fi
|
|
119
|
+
done
|
|
120
|
+
|
|
121
|
+
return 1
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
plan_evidence_contract_error() {
|
|
125
|
+
local file="$1"
|
|
126
|
+
local section=""
|
|
127
|
+
local missing=0
|
|
128
|
+
|
|
129
|
+
section="$(awk '
|
|
130
|
+
BEGIN { in_section = 0 }
|
|
131
|
+
/^## Evidence Contract[[:space:]]*$/ { in_section = 1; next }
|
|
132
|
+
in_section && /^## / { exit }
|
|
133
|
+
in_section { print }
|
|
134
|
+
' "$file")"
|
|
135
|
+
|
|
136
|
+
if [[ -z "$(printf '%s' "$section" | tr -d '[:space:]')" ]]; then
|
|
137
|
+
echo "missing ## Evidence Contract section"
|
|
138
|
+
return 1
|
|
139
|
+
fi
|
|
140
|
+
|
|
141
|
+
local label line value
|
|
142
|
+
for label in "State/progress path" "Verification evidence" "Evaluator rubric" "Stop condition" "Rollback surface"; do
|
|
143
|
+
line="$(printf '%s\n' "$section" | grep -Ei "^[[:space:]]*-[[:space:]]*(\\*\\*)?${label}(\\*\\*)?[[:space:]]*:" | head -1 || true)"
|
|
144
|
+
if [[ -z "$line" ]]; then
|
|
145
|
+
echo "missing field: ${label}"
|
|
146
|
+
missing=1
|
|
147
|
+
continue
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
value="${line#*:}"
|
|
151
|
+
value="$(printf '%s' "$value" | sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//')"
|
|
152
|
+
if [[ -z "$value" ]] || printf '%s' "$value" | grep -Eiq '^(tbd|todo|n/a|none|unknown|\.\.\.)$'; then
|
|
153
|
+
echo "field has no concrete value: ${label}"
|
|
154
|
+
missing=1
|
|
155
|
+
fi
|
|
156
|
+
done
|
|
157
|
+
|
|
158
|
+
[[ "$missing" -eq 0 ]]
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
# Strip host-injected context blocks so worktree matching sees the user's
|
|
162
|
+
# words. The TypeScript engine performs the same strip for classification.
|
|
163
|
+
strip_prompt_context_blocks() {
|
|
164
|
+
awk '
|
|
165
|
+
/^[[:space:]]*<(skill|environment_context|INSTRUCTIONS|system|developer|app-context|collaboration_mode|apps_instructions|skills_instructions|plugins_instructions)[^>]*>[[:space:]]*$/ {
|
|
166
|
+
skip = 1
|
|
167
|
+
next
|
|
168
|
+
}
|
|
169
|
+
/^[[:space:]]*<\/(skill|environment_context|INSTRUCTIONS|system|developer|app-context|collaboration_mode|apps_instructions|skills_instructions|plugins_instructions)>[[:space:]]*$/ {
|
|
170
|
+
skip = 0
|
|
171
|
+
next
|
|
172
|
+
}
|
|
173
|
+
skip { next }
|
|
174
|
+
{ print }
|
|
175
|
+
'
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
prompt_intent_text() {
|
|
179
|
+
local stripped
|
|
180
|
+
stripped="$(printf '%s\n' "$PROMPT_TEXT" | strip_prompt_context_blocks | sed -E '/^[[:space:]]*$/d')"
|
|
181
|
+
if [[ -n "$(printf '%s' "$stripped" | tr -d '[:space:]')" ]]; then
|
|
182
|
+
printf '%s' "$stripped"
|
|
183
|
+
else
|
|
184
|
+
printf '%s' "$PROMPT_TEXT"
|
|
185
|
+
fi
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
# --- Decision engine invocation ---
|
|
189
|
+
|
|
190
|
+
prompt_guard_decision_command() {
|
|
191
|
+
local source_cli source_hook_cli
|
|
192
|
+
source_cli="$(cd "$SCRIPT_DIR/../.." 2>/dev/null && pwd)/src/cli/index.ts"
|
|
193
|
+
source_hook_cli="$(cd "$SCRIPT_DIR/../.." 2>/dev/null && pwd)/src/cli/hook-entry.ts"
|
|
194
|
+
|
|
195
|
+
if [[ -n "${FORGE_HOOK_CLI:-}" && -f "${FORGE_HOOK_CLI:-}" ]] && command -v bun >/dev/null 2>&1; then
|
|
196
|
+
bun "$FORGE_HOOK_CLI" prompt-guard-decide
|
|
197
|
+
return $?
|
|
198
|
+
fi
|
|
199
|
+
|
|
200
|
+
if [[ -n "${FORGE_CLI:-}" && -f "${FORGE_CLI:-}" ]] && command -v bun >/dev/null 2>&1; then
|
|
201
|
+
bun "$FORGE_CLI" prompt-guard-decide
|
|
202
|
+
return $?
|
|
203
|
+
fi
|
|
204
|
+
|
|
205
|
+
if [[ -f "$source_hook_cli" ]] && command -v bun >/dev/null 2>&1; then
|
|
206
|
+
bun "$source_hook_cli" prompt-guard-decide
|
|
207
|
+
return $?
|
|
208
|
+
fi
|
|
209
|
+
|
|
210
|
+
if [[ -n "${HOOK_REPO_ROOT:-}" && -f "$HOOK_REPO_ROOT/src/cli/hook-entry.ts" ]] && command -v bun >/dev/null 2>&1; then
|
|
211
|
+
bun "$HOOK_REPO_ROOT/src/cli/hook-entry.ts" prompt-guard-decide
|
|
212
|
+
return $?
|
|
213
|
+
fi
|
|
214
|
+
|
|
215
|
+
if command -v forge-hook >/dev/null 2>&1; then
|
|
216
|
+
forge-hook prompt-guard-decide
|
|
217
|
+
return $?
|
|
218
|
+
fi
|
|
219
|
+
|
|
220
|
+
if command -v forge >/dev/null 2>&1; then
|
|
221
|
+
forge prompt-guard-decide
|
|
222
|
+
return $?
|
|
223
|
+
fi
|
|
224
|
+
|
|
225
|
+
if [[ -f "$source_cli" ]] && command -v bun >/dev/null 2>&1; then
|
|
226
|
+
bun "$source_cli" prompt-guard-decide
|
|
227
|
+
return $?
|
|
228
|
+
fi
|
|
229
|
+
|
|
230
|
+
return 127
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
prompt_guard_refresh_state() {
|
|
234
|
+
prompt_guard_spec_state="missing"
|
|
235
|
+
prompt_guard_plan_state="none"
|
|
236
|
+
prompt_guard_pending_state="none"
|
|
237
|
+
prompt_guard_worktree_state="current"
|
|
238
|
+
prompt_guard_contract_state="missing"
|
|
239
|
+
prompt_guard_contract_path_state="missing"
|
|
240
|
+
prompt_guard_evidence_state="unchecked"
|
|
241
|
+
|
|
242
|
+
active_plan=""
|
|
243
|
+
plan_status=""
|
|
244
|
+
marker_problem=""
|
|
245
|
+
linked_worktree=""
|
|
246
|
+
contract_file=""
|
|
247
|
+
evidence_error=""
|
|
248
|
+
|
|
249
|
+
if [ -f "docs/spec.md" ]; then
|
|
250
|
+
prompt_guard_spec_state="present"
|
|
251
|
+
fi
|
|
252
|
+
|
|
253
|
+
active_plan="$(get_active_plan || true)"
|
|
254
|
+
if [ -n "$active_plan" ] && [ -f "$active_plan" ]; then
|
|
255
|
+
plan_status="$(get_plan_status "$active_plan")"
|
|
256
|
+
case "$plan_status" in
|
|
257
|
+
Draft) prompt_guard_plan_state="draft" ;;
|
|
258
|
+
Annotating) prompt_guard_plan_state="annotating" ;;
|
|
259
|
+
Approved) prompt_guard_plan_state="approved" ;;
|
|
260
|
+
Executing) prompt_guard_plan_state="executing" ;;
|
|
261
|
+
*) prompt_guard_plan_state="unknown" ;;
|
|
262
|
+
esac
|
|
263
|
+
|
|
264
|
+
if [ -n "$(derive_contract_path "$active_plan" || true)" ]; then
|
|
265
|
+
prompt_guard_contract_path_state="present"
|
|
266
|
+
fi
|
|
267
|
+
|
|
268
|
+
if ! evidence_error="$(plan_evidence_contract_error "$active_plan")"; then
|
|
269
|
+
prompt_guard_evidence_state="incomplete"
|
|
270
|
+
else
|
|
271
|
+
prompt_guard_evidence_state="complete"
|
|
272
|
+
fi
|
|
273
|
+
else
|
|
274
|
+
marker_problem="$(active_plan_marker_problem || true)"
|
|
275
|
+
if [[ "$marker_problem" == *"different worktree"* ]]; then
|
|
276
|
+
prompt_guard_plan_state="foreign_worktree"
|
|
277
|
+
prompt_guard_worktree_state="foreign_marker"
|
|
278
|
+
elif [[ -n "$marker_problem" ]]; then
|
|
279
|
+
prompt_guard_plan_state="stale_marker"
|
|
280
|
+
fi
|
|
281
|
+
fi
|
|
282
|
+
|
|
283
|
+
if workflow_pending_orchestration_is_fresh; then
|
|
284
|
+
prompt_guard_pending_state="fresh"
|
|
285
|
+
elif [ -s "$(workflow_pending_orchestration_file)" ]; then
|
|
286
|
+
prompt_guard_pending_state="stale"
|
|
287
|
+
fi
|
|
288
|
+
|
|
289
|
+
linked_worktree="$(prompt_linked_worktree_target || true)"
|
|
290
|
+
if [[ -n "$linked_worktree" ]]; then
|
|
291
|
+
prompt_guard_worktree_state="linked_target"
|
|
292
|
+
fi
|
|
293
|
+
|
|
294
|
+
contract_file="$(workflow_active_contract || true)"
|
|
295
|
+
if [[ -n "$contract_file" && -f "$contract_file" ]]; then
|
|
296
|
+
prompt_guard_contract_state="present"
|
|
297
|
+
fi
|
|
298
|
+
|
|
299
|
+
export PROMPT_GUARD_SPEC_STATE="$prompt_guard_spec_state"
|
|
300
|
+
export PROMPT_GUARD_PLAN_STATE="$prompt_guard_plan_state"
|
|
301
|
+
export PROMPT_GUARD_PENDING_STATE="$prompt_guard_pending_state"
|
|
302
|
+
export PROMPT_GUARD_WORKTREE_STATE="$prompt_guard_worktree_state"
|
|
303
|
+
export PROMPT_GUARD_CONTRACT_STATE="$prompt_guard_contract_state"
|
|
304
|
+
export PROMPT_GUARD_CONTRACT_PATH_STATE="$prompt_guard_contract_path_state"
|
|
305
|
+
export PROMPT_GUARD_EVIDENCE_STATE="$prompt_guard_evidence_state"
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
# PG_ENGINE_STATE: ok | unavailable (no runtime) | legacy (CLI predates the
|
|
309
|
+
# prompt protocol). Both degraded states fall back to advisory-only handling.
|
|
310
|
+
PG_ENGINE_STATE="ok"
|
|
311
|
+
|
|
312
|
+
prompt_guard_engine_parse() {
|
|
313
|
+
local verdict="$1"
|
|
314
|
+
local key value tsv
|
|
315
|
+
|
|
316
|
+
# Values are tab-free by construction (the engine collapses title
|
|
317
|
+
# whitespace), so KEY<TAB>VALUE lines assign safely without eval.
|
|
318
|
+
if command -v jq >/dev/null 2>&1; then
|
|
319
|
+
tsv="$(printf '%s' "$verdict" | jq -r '
|
|
320
|
+
["PG_ACTION", .action],
|
|
321
|
+
["PG_INTENT", .intent],
|
|
322
|
+
["PG_DONE_OUTCOME", .derived.done_outcome],
|
|
323
|
+
["PG_PLAN_START_TITLE", .derived.plan_start_title],
|
|
324
|
+
["PG_PLAN_START_SLUG", .derived.plan_start_slug],
|
|
325
|
+
["PG_PENDING_KIND", .derived.pending_kind],
|
|
326
|
+
(.facts | to_entries[] | ["PG_FACT_" + (.key|ascii_upcase), (.value|tostring)])
|
|
327
|
+
| @tsv
|
|
328
|
+
')"
|
|
329
|
+
else
|
|
330
|
+
# The verdict only exists when a bun-backed CLI ran, so bun is available.
|
|
331
|
+
tsv="$(VERDICT_JSON="$verdict" bun -e '
|
|
332
|
+
const v = JSON.parse(process.env.VERDICT_JSON ?? "{}");
|
|
333
|
+
const rows = [
|
|
334
|
+
["PG_ACTION", v.action],
|
|
335
|
+
["PG_INTENT", v.intent],
|
|
336
|
+
["PG_DONE_OUTCOME", v.derived.done_outcome],
|
|
337
|
+
["PG_PLAN_START_TITLE", v.derived.plan_start_title],
|
|
338
|
+
["PG_PLAN_START_SLUG", v.derived.plan_start_slug],
|
|
339
|
+
["PG_PENDING_KIND", v.derived.pending_kind],
|
|
340
|
+
];
|
|
341
|
+
for (const [k, val] of Object.entries(v.facts)) {
|
|
342
|
+
rows.push(["PG_FACT_" + k.toUpperCase(), String(val)]);
|
|
343
|
+
}
|
|
344
|
+
console.log(rows.map((r) => r.join("\t")).join("\n"));
|
|
345
|
+
')"
|
|
346
|
+
fi
|
|
347
|
+
|
|
348
|
+
while IFS=$'\t' read -r key value; do
|
|
349
|
+
[[ "$key" =~ ^PG_[A-Z_]+$ ]] || continue
|
|
350
|
+
printf -v "$key" '%s' "$value"
|
|
351
|
+
done <<< "$tsv"
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
prompt_guard_engine_call() {
|
|
355
|
+
local payload output status
|
|
356
|
+
|
|
357
|
+
if command -v jq >/dev/null 2>&1; then
|
|
358
|
+
payload="$(jq -nc --arg prompt "$PROMPT_TEXT" '{prompt:$prompt}')"
|
|
359
|
+
else
|
|
360
|
+
payload="{\"prompt\":\"$(hook_json_escape "$PROMPT_TEXT")\"}"
|
|
361
|
+
fi
|
|
362
|
+
|
|
363
|
+
if output="$(printf '%s' "$payload" | prompt_guard_decision_command)"; then
|
|
364
|
+
:
|
|
365
|
+
else
|
|
366
|
+
status=$?
|
|
367
|
+
if [[ "$status" -eq 127 ]]; then
|
|
368
|
+
PG_ENGINE_STATE="unavailable"
|
|
369
|
+
return 0
|
|
370
|
+
fi
|
|
371
|
+
echo "[PromptGuard] Decision engine unavailable or failed."
|
|
372
|
+
hook_structured_error \
|
|
373
|
+
"PromptGuard" \
|
|
374
|
+
"Prompt guard decision engine failed." \
|
|
375
|
+
"Install forge or run from the source checkout so the TypeScript decision engine is available." \
|
|
376
|
+
"missing_artifact"
|
|
377
|
+
exit 2
|
|
378
|
+
fi
|
|
379
|
+
|
|
380
|
+
output="$(printf '%s\n' "$output" | head -n1)"
|
|
381
|
+
if [[ "$output" != \{* ]] || ! printf '%s' "$output" | grep -q '"protocol"'; then
|
|
382
|
+
PG_ENGINE_STATE="legacy"
|
|
383
|
+
return 0
|
|
384
|
+
fi
|
|
385
|
+
|
|
386
|
+
prompt_guard_engine_parse "$output"
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
pg_fact() {
|
|
390
|
+
local name="$1"
|
|
391
|
+
local var="PG_FACT_${name}"
|
|
392
|
+
[[ "${!var:-0}" == "1" ]]
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
# --- Side effects and hints (driven by engine facts) ---
|
|
396
|
+
|
|
397
|
+
emit_pending_orchestration_discussion() {
|
|
398
|
+
local active_plan_local kind source_ref source_arg
|
|
399
|
+
workflow_pending_orchestration_is_fresh || return 0
|
|
400
|
+
active_plan_local="$(get_active_plan || true)"
|
|
401
|
+
[[ -z "$active_plan_local" || ! -f "$active_plan_local" ]] || return 0
|
|
402
|
+
pg_fact PLAN_DISCUSSION_CONTINUATION || return 0
|
|
403
|
+
kind="$(workflow_pending_orchestration_field kind 2>/dev/null || true)"
|
|
404
|
+
source_ref="$(workflow_pending_orchestration_field source_ref 2>/dev/null || true)"
|
|
405
|
+
source_arg=""
|
|
406
|
+
[[ -n "$source_ref" ]] && source_arg=" --source-ref <source-ref>"
|
|
407
|
+
|
|
408
|
+
echo "[PlanDiscussionGate] Pending plan/orchestration discussion is still open; continuing discussion, not implementation."
|
|
409
|
+
echo "[PlanDiscussionGate] $(workflow_pending_orchestration_summary)"
|
|
410
|
+
echo "[PlanDiscussionGate] When the decision is complete, capture the final plan body before editing implementation files:"
|
|
411
|
+
echo " printf '%s\n' '<decision-complete plan body>' | bash scripts/capture-plan.sh --slug <slug> --title <title> --status Draft --source ${kind:-host-plan} --orchestration-kind ${kind:-host-plan} --route planning${source_arg}"
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
emit_pending_orchestration_capture_gate() {
|
|
415
|
+
local kind source_ref source_arg
|
|
416
|
+
workflow_pending_orchestration_is_fresh || return 1
|
|
417
|
+
kind="$(workflow_pending_orchestration_field kind 2>/dev/null || true)"
|
|
418
|
+
source_ref="$(workflow_pending_orchestration_field source_ref 2>/dev/null || true)"
|
|
419
|
+
source_arg=""
|
|
420
|
+
[[ -n "$source_ref" ]] && source_arg=" --source-ref <source-ref>"
|
|
421
|
+
echo "[PlanCaptureGate] Implementation requested while a pending plan/orchestration discussion has not been captured."
|
|
422
|
+
echo "[PlanCaptureGate] $(workflow_pending_orchestration_summary)"
|
|
423
|
+
echo "[PlanCaptureGate] Capture the final plan body first; if implementation is already approved, use --status Approved --execute:"
|
|
424
|
+
echo " printf '%s\n' '<approved plan body>' | bash scripts/capture-plan.sh --slug <slug> --title <title> --status Approved --source ${kind:-host-plan} --orchestration-kind ${kind:-host-plan} --route planning --execute${source_arg}"
|
|
425
|
+
return 0
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
maybe_start_plan_workflow() {
|
|
429
|
+
pg_fact THINK_PLAN_START || return 0
|
|
430
|
+
|
|
431
|
+
if [[ ! -x "scripts/ensure-task-workflow.sh" ]]; then
|
|
432
|
+
echo "[PlanStartGate] Think/plan intent detected, but scripts/ensure-task-workflow.sh is missing. Continue with planning and capture manually."
|
|
433
|
+
return 0
|
|
434
|
+
fi
|
|
435
|
+
|
|
436
|
+
local slug title before_latest after_latest draft_plan kind source_ref start_output
|
|
437
|
+
slug="${PG_PLAN_START_SLUG:-think-plan-$(date +%H%M%S)}"
|
|
438
|
+
title="${PG_PLAN_START_TITLE:-Planning Session}"
|
|
439
|
+
before_latest="$(get_latest_plan || true)"
|
|
440
|
+
kind="${PG_PENDING_KIND:-forge-plan}"
|
|
441
|
+
source_ref="$title"
|
|
442
|
+
echo "[PlanStartGate] Think/plan intent detected. Starting independent file-backed Draft plan workflow."
|
|
443
|
+
if ! start_output="$(bash "scripts/ensure-task-workflow.sh" --new-plan --slug "$slug" --title "$title" 2>&1)"; then
|
|
444
|
+
printf '%s\n' "$start_output"
|
|
445
|
+
return 0
|
|
446
|
+
fi
|
|
447
|
+
printf '%s\n' "$start_output"
|
|
448
|
+
after_latest="$(get_latest_plan || true)"
|
|
449
|
+
draft_plan=""
|
|
450
|
+
if [[ -n "$after_latest" && "$after_latest" != "$before_latest" ]]; then
|
|
451
|
+
draft_plan="$after_latest"
|
|
452
|
+
fi
|
|
453
|
+
workflow_write_pending_orchestration "$kind" "${HOOK_HOST:-unknown}" "$slug" "$draft_plan" "$source_ref" "plans/plan-*.md"
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
extract_embedded_approved_plan_body() {
|
|
457
|
+
if ! pg_fact EMBEDDED_APPROVED_PLAN && pg_fact PLAN_SHAPED_MARKDOWN; then
|
|
458
|
+
printf '%s\n' "$PROMPT_INTENT_TEXT"
|
|
459
|
+
return 0
|
|
460
|
+
fi
|
|
461
|
+
|
|
462
|
+
printf '%s\n' "$PROMPT_INTENT_TEXT" | awk '
|
|
463
|
+
BEGIN { found = 0 }
|
|
464
|
+
!found {
|
|
465
|
+
line = $0
|
|
466
|
+
lower = tolower(line)
|
|
467
|
+
if (lower ~ /^[[:space:]]*(please[[:space:]]+)?implement[[:space:]]+this[[:space:]]+plan[[:space:]]*:/) {
|
|
468
|
+
found = 1
|
|
469
|
+
colon = index(line, ":")
|
|
470
|
+
rest = substr(line, colon + 1)
|
|
471
|
+
sub(/^[[:space:]]+/, "", rest)
|
|
472
|
+
if (length(rest) > 0) {
|
|
473
|
+
print rest
|
|
474
|
+
}
|
|
475
|
+
next
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
found { print }
|
|
479
|
+
'
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
derive_embedded_approved_plan_title() {
|
|
483
|
+
local body="$1"
|
|
484
|
+
local title
|
|
485
|
+
title="$(printf '%s\n' "$body" | awk '
|
|
486
|
+
/^#[[:space:]]*Plan:[[:space:]]*/ {
|
|
487
|
+
sub(/^#[[:space:]]*Plan:[[:space:]]*/, "")
|
|
488
|
+
print
|
|
489
|
+
exit
|
|
490
|
+
}
|
|
491
|
+
/^#[[:space:]]+/ {
|
|
492
|
+
sub(/^#[[:space:]]+/, "")
|
|
493
|
+
print
|
|
494
|
+
exit
|
|
495
|
+
}
|
|
496
|
+
' | sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//' | head -1)"
|
|
497
|
+
if [[ -z "$title" ]]; then
|
|
498
|
+
title="Approved Plan"
|
|
499
|
+
fi
|
|
500
|
+
printf '%s' "$title" | cut -c 1-96
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
normalize_plan_slug() {
|
|
504
|
+
printf '%s' "$1" | tr '[:upper:]' '[:lower:]' | sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//; s/-{2,}/-/g'
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
maybe_capture_embedded_approved_plan() {
|
|
508
|
+
pg_fact EMBEDDED_APPROVED_PLAN || pg_fact PLAN_SHAPED_MARKDOWN || return 0
|
|
509
|
+
|
|
510
|
+
if [[ ! -x "scripts/capture-plan.sh" ]]; then
|
|
511
|
+
echo "[PlanCaptureGate] Embedded approved plan detected, but scripts/capture-plan.sh is missing."
|
|
512
|
+
hook_structured_error \
|
|
513
|
+
"PlanCaptureGate" \
|
|
514
|
+
"Embedded approved plan detected but scripts/capture-plan.sh is missing." \
|
|
515
|
+
"Install workflow helpers before executing an embedded approved plan." \
|
|
516
|
+
"missing_artifact"
|
|
517
|
+
exit 2
|
|
518
|
+
fi
|
|
519
|
+
|
|
520
|
+
local body title slug capture_output
|
|
521
|
+
body="$(extract_embedded_approved_plan_body)"
|
|
522
|
+
if [[ -z "$(printf '%s' "$body" | tr -d '[:space:]')" ]]; then
|
|
523
|
+
echo "[PlanCaptureGate] Embedded approved plan marker has no plan body."
|
|
524
|
+
hook_structured_error \
|
|
525
|
+
"PlanCaptureGate" \
|
|
526
|
+
"PLEASE IMPLEMENT THIS PLAN was provided without a plan body." \
|
|
527
|
+
"Paste the approved plan body after the marker so scripts/capture-plan.sh can store and project it." \
|
|
528
|
+
"missing_artifact"
|
|
529
|
+
exit 2
|
|
530
|
+
fi
|
|
531
|
+
|
|
532
|
+
title="$(derive_embedded_approved_plan_title "$body")"
|
|
533
|
+
slug="$(normalize_plan_slug "$title")"
|
|
534
|
+
if [[ -z "$slug" ]]; then
|
|
535
|
+
slug="approved-plan-$(date +%H%M%S)"
|
|
536
|
+
fi
|
|
537
|
+
|
|
538
|
+
echo "[PlanCaptureGate] Embedded approved plan detected. Capturing and projecting before implementation."
|
|
539
|
+
if ! capture_output="$(printf '%s\n' "$body" | bash "scripts/capture-plan.sh" --slug "$slug" --title "$title" --status Approved --source user-approved-plan --route planning --execute 2>&1)"; then
|
|
540
|
+
printf '%s\n' "$capture_output"
|
|
541
|
+
hook_structured_error \
|
|
542
|
+
"PlanCaptureGate" \
|
|
543
|
+
"Embedded approved plan capture failed." \
|
|
544
|
+
"Fix the capture-plan.sh or plan-to-todo.sh error before editing implementation files." \
|
|
545
|
+
"state_violation"
|
|
546
|
+
exit 2
|
|
547
|
+
fi
|
|
548
|
+
printf '%s\n' "$capture_output"
|
|
549
|
+
exit 0
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
emit_agentic_packaging_hint() {
|
|
553
|
+
if pg_fact AGENTIC_PACKAGING; then
|
|
554
|
+
echo "[AgenticDevRoute] Reusable workflow packaging intent detected."
|
|
555
|
+
echo "[AgenticDevRoute] Suggested route: forge-autoplan after user authorization; hook will not plan or create assets."
|
|
556
|
+
fi
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
resolve_codegraph_bin() {
|
|
560
|
+
if [[ -x "node_modules/.bin/codegraph" ]]; then
|
|
561
|
+
printf '%s\n' "node_modules/.bin/codegraph"
|
|
562
|
+
return 0
|
|
563
|
+
fi
|
|
564
|
+
|
|
565
|
+
command -v codegraph 2>/dev/null || return 1
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
run_codegraph_init_command() {
|
|
569
|
+
local codegraph_bin status cursor_dir_existed cursor_rules_dir_existed cursor_rule_existed
|
|
570
|
+
codegraph_bin="$(resolve_codegraph_bin)" || return 127
|
|
571
|
+
|
|
572
|
+
cursor_dir_existed=false
|
|
573
|
+
cursor_rules_dir_existed=false
|
|
574
|
+
cursor_rule_existed=false
|
|
575
|
+
[[ -d ".cursor" ]] && cursor_dir_existed=true
|
|
576
|
+
[[ -d ".cursor/rules" ]] && cursor_rules_dir_existed=true
|
|
577
|
+
[[ -e ".cursor/rules/codegraph.mdc" ]] && cursor_rule_existed=true
|
|
578
|
+
|
|
579
|
+
set +e
|
|
580
|
+
CODEGRAPH_NO_DAEMON=1 "$codegraph_bin" init -i .
|
|
581
|
+
status=$?
|
|
582
|
+
set -e
|
|
583
|
+
|
|
584
|
+
if [[ "$cursor_rule_existed" == "false" && -f ".cursor/rules/codegraph.mdc" ]]; then
|
|
585
|
+
rm -f ".cursor/rules/codegraph.mdc"
|
|
586
|
+
[[ "$cursor_rules_dir_existed" == "false" ]] && rmdir ".cursor/rules" 2>/dev/null || true
|
|
587
|
+
[[ "$cursor_dir_existed" == "false" ]] && rmdir ".cursor" 2>/dev/null || true
|
|
588
|
+
fi
|
|
589
|
+
|
|
590
|
+
return "$status"
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
ensure_codegraph_index_for_route() {
|
|
594
|
+
local output status
|
|
595
|
+
|
|
596
|
+
[[ -f ".codegraph/codegraph.db" ]] && return 0
|
|
597
|
+
|
|
598
|
+
output="$(run_codegraph_init_command 2>&1)"
|
|
599
|
+
status=$?
|
|
600
|
+
|
|
601
|
+
if [[ "$status" -eq 0 && -f ".codegraph/codegraph.db" ]]; then
|
|
602
|
+
echo "[CodegraphRoute] Initialized missing CodeGraph index before routing hint."
|
|
603
|
+
elif [[ "$status" -ne 127 ]]; then
|
|
604
|
+
echo "[CodegraphRoute] CodeGraph index init skipped or failed; run codegraph init -i . if structural tools are unavailable."
|
|
605
|
+
fi
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
emit_codegraph_route_hint() {
|
|
609
|
+
local session_key session_file=".claude/.session-id"
|
|
610
|
+
|
|
611
|
+
mkdir -p .claude
|
|
612
|
+
session_key="$(session_state_resolve_key "$session_file" "${1:-}")"
|
|
613
|
+
|
|
614
|
+
if session_state_codegraph_used "$session_key" || session_state_codegraph_nudged "$session_key"; then
|
|
615
|
+
return 0
|
|
616
|
+
fi
|
|
617
|
+
|
|
618
|
+
if pg_fact CODEGRAPH_ROUTE; then
|
|
619
|
+
ensure_codegraph_index_for_route || true
|
|
620
|
+
echo "[CodegraphRoute] Structural code-navigation intent detected. Prefer CodeGraph context/search/callers/impact before grep/read when available."
|
|
621
|
+
session_state_mark_codegraph_nudged "$session_key" || true
|
|
622
|
+
elif pg_fact NONTRIVIAL_CODE_TASK; then
|
|
623
|
+
echo "[CodegraphRoute] Structural code-navigation intent detected. Prefer CodeGraph context/search/callers/impact before grep/read when available."
|
|
624
|
+
session_state_mark_codegraph_nudged "$session_key" || true
|
|
625
|
+
fi
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
emit_waza_route_hint() {
|
|
629
|
+
if pg_fact AGENTIC_PACKAGING; then
|
|
630
|
+
return
|
|
631
|
+
fi
|
|
632
|
+
|
|
633
|
+
if pg_fact THINK_PLAN_START; then
|
|
634
|
+
echo "[WazaRoute] Planning intent detected. Default route: Waza /think."
|
|
635
|
+
return
|
|
636
|
+
fi
|
|
637
|
+
|
|
638
|
+
# /health needs a health/audit/diagnostic verb plus a tooling noun (joint
|
|
639
|
+
# condition lives in the TypeScript classifier); reviews fall to /check.
|
|
640
|
+
if pg_fact HEALTH_ROUTE; then
|
|
641
|
+
echo "[WazaRoute] Agent workflow/tooling intent detected. Default route: Waza /health."
|
|
642
|
+
return
|
|
643
|
+
fi
|
|
644
|
+
|
|
645
|
+
if pg_fact REVIEW_RELEASE; then
|
|
646
|
+
echo "[WazaRoute] Review/release intent detected. Default route: Waza /check."
|
|
647
|
+
emit_external_acceptance_prompt review
|
|
648
|
+
emit_cross_review_hint merge
|
|
649
|
+
fi
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
# Cross-review advisory: nudge the agent to consider an independent second
|
|
653
|
+
# opinion from a different-vendor model. Advisory only (echo, exit 0); the agent
|
|
654
|
+
# decides whether to act. Host-aware: in Codex suggest claude-review, otherwise
|
|
655
|
+
# (Claude) suggest codex-review. On Codex the dispatcher swallows success stdout,
|
|
656
|
+
# so this primarily surfaces on the Claude host; the Codex-side availability note
|
|
657
|
+
# is delivered once by session-start-context.sh.
|
|
658
|
+
emit_cross_review_hint() {
|
|
659
|
+
local skill peer
|
|
660
|
+
if [ "${HOOK_HOST:-claude}" = "codex" ]; then
|
|
661
|
+
skill="claude-review"; peer="Claude"
|
|
662
|
+
else
|
|
663
|
+
skill="codex-review"; peer="Codex"
|
|
664
|
+
fi
|
|
665
|
+
case "${1:-}" in
|
|
666
|
+
merge)
|
|
667
|
+
echo "[CrossReview] Pre-merge moment — consider an independent ${peer} review of the diff via ${skill}: a different training distribution has non-overlapping blind spots. Skip if the change is trivial."
|
|
668
|
+
;;
|
|
669
|
+
debug)
|
|
670
|
+
echo "[CrossReview] Hard bug — ${skill} can give an independent ${peer} root-cause diagnosis. Agreeing diagnoses raise confidence; divergence shows where to dig."
|
|
671
|
+
;;
|
|
672
|
+
esac
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
emit_external_acceptance_prompt() {
|
|
676
|
+
local mode="${1:-review}"
|
|
677
|
+
local expected_reviewer expected_source command active_plan_local contract_file_local review_file checks_file
|
|
678
|
+
|
|
679
|
+
expected_reviewer="$(workflow_external_acceptance_expected_reviewer)"
|
|
680
|
+
expected_source="$(workflow_external_acceptance_expected_source "$expected_reviewer")"
|
|
681
|
+
if [ "$expected_source" = "claude-review" ]; then
|
|
682
|
+
command="/claude-review"
|
|
683
|
+
else
|
|
684
|
+
command="codex-review"
|
|
685
|
+
fi
|
|
686
|
+
|
|
687
|
+
active_plan_local="$(get_active_plan || true)"
|
|
688
|
+
contract_file_local="$(workflow_active_contract || true)"
|
|
689
|
+
review_file="$(workflow_active_review || true)"
|
|
690
|
+
checks_file="$(workflow_checks_file)"
|
|
691
|
+
|
|
692
|
+
echo "[ExternalAcceptance] Review/release intent detected. Start peer acceptance in parallel with local /check."
|
|
693
|
+
echo "[ExternalAcceptance] Mode: $mode"
|
|
694
|
+
echo "[ExternalAcceptance] Current active plan: ${active_plan_local:-"(none)"}"
|
|
695
|
+
echo "[ExternalAcceptance] Current contract: ${contract_file_local:-"(none)"}"
|
|
696
|
+
echo "[ExternalAcceptance] Current review: ${review_file:-tasks/reviews/<slug>.review.md}"
|
|
697
|
+
echo "[ExternalAcceptance] Current checks: $checks_file"
|
|
698
|
+
echo "[ExternalAcceptance] Peer reviewer: $expected_reviewer via $command"
|
|
699
|
+
echo "[ExternalAcceptance] Diff scope for peer: branch diff against target, staged diff, unstaged diff, and untracked files."
|
|
700
|
+
cat <<EOF_EXTERNAL_ACCEPTANCE
|
|
701
|
+
[ExternalAcceptance] Prompt to send with $command:
|
|
702
|
+
Review the current sprint for acceptance only. Do not run /check. Do not edit files. Do not write files. Inspect the diff scope, contract, review evidence, and checks evidence, then return only a Markdown block that can be pasted into ${review_file:-tasks/reviews/<slug>.review.md}.
|
|
703
|
+
|
|
704
|
+
## External Acceptance Advice
|
|
705
|
+
> **External Acceptance**: pass
|
|
706
|
+
> **External Reviewer**: $expected_reviewer
|
|
707
|
+
> **External Source**: $expected_source
|
|
708
|
+
> **External Started**: YYYY-MM-DDTHH:MM:SS+0800
|
|
709
|
+
> **External Completed**: YYYY-MM-DDTHH:MM:SS+0800
|
|
710
|
+
|
|
711
|
+
- P1 blockers: none
|
|
712
|
+
- P2 advisories:
|
|
713
|
+
- Acceptance checklist: pass
|
|
714
|
+
|
|
715
|
+
If the peer CLI is unavailable, record **External Acceptance**: unavailable and include the failure reason. That does not satisfy the completion gate unless a Manual Override: line with a concrete reason is also recorded.
|
|
716
|
+
EOF_EXTERNAL_ACCEPTANCE
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
# --- Action rendering ---
|
|
720
|
+
# Plan/spec/contract prompt gates are advisory (exit 0): pre-edit-guard.sh
|
|
721
|
+
# enforces the same state deterministically at the edit boundary. Done-claim
|
|
722
|
+
# gates keep blocking because they verify file-backed completion evidence.
|
|
723
|
+
|
|
724
|
+
render_prompt_guard_action() {
|
|
725
|
+
local action="$1"
|
|
726
|
+
|
|
727
|
+
case "$action" in
|
|
728
|
+
allow|done_gate)
|
|
729
|
+
return 0
|
|
730
|
+
;;
|
|
731
|
+
spec_block)
|
|
732
|
+
echo "[SpecGuard] Advisory: docs/spec.md is missing. Create stable product truth before implementation."
|
|
733
|
+
echo "[SpecGuard] Run bash scripts/new-spec.sh and capture stable product intent; implementation edits without a spec are blocked at the edit layer."
|
|
734
|
+
exit 0
|
|
735
|
+
;;
|
|
736
|
+
stale_active_plan_advice)
|
|
737
|
+
clear_active_plan
|
|
738
|
+
echo "[PlanStatusGuard] Advisory: ${marker_problem}; cleared stale active markers. Capture or switch to an approved plan before editing implementation files."
|
|
739
|
+
exit 0
|
|
740
|
+
;;
|
|
741
|
+
plan_capture_pending_advice)
|
|
742
|
+
emit_pending_orchestration_capture_gate || true
|
|
743
|
+
exit 0
|
|
744
|
+
;;
|
|
745
|
+
worktree_execution_advice)
|
|
746
|
+
echo "[WorktreeExecutionGate] Active plan is in linked worktree: $linked_worktree"
|
|
747
|
+
echo "[WorktreeExecutionGate] Continue from that worktree instead of recapturing a plan:"
|
|
748
|
+
echo " cd \"$linked_worktree\""
|
|
749
|
+
exit 0
|
|
750
|
+
;;
|
|
751
|
+
plan_capture_missing_active_advice)
|
|
752
|
+
echo "[PlanCaptureGate] Approval detected before an active plan artifact exists."
|
|
753
|
+
echo "[PlanCaptureGate] Let the agent run the approved-plan capture path now:"
|
|
754
|
+
echo " git status --short --branch -uall"
|
|
755
|
+
echo " printf '%s\n' '<approved plan body>' | bash scripts/capture-plan.sh --slug <slug> --title <title> --status Approved --source waza-think --route planning --execute"
|
|
756
|
+
exit 0
|
|
757
|
+
;;
|
|
758
|
+
plan_status_no_active_block)
|
|
759
|
+
echo "[PlanStatusGuard] Advisory: No active plan found in plans/. Implementation edits will be blocked at the edit layer until a plan is captured."
|
|
760
|
+
echo "[PlanStatusGuard] Capture the approved planning output with: bash scripts/capture-plan.sh --slug <slug> --title <title> --status Approved --execute"
|
|
761
|
+
echo "[PlanStatusGuard] If there is no captured planning output yet, run: bash scripts/ensure-task-workflow.sh --slug <slug> --title <title>"
|
|
762
|
+
exit 0
|
|
763
|
+
;;
|
|
764
|
+
plan_capture_draft_advice)
|
|
765
|
+
echo "[PlanCaptureGate] Approval detected for $plan_status plan: $active_plan"
|
|
766
|
+
echo "[PlanCaptureGate] Recapture the exact approved plan body with --status Approved --execute, or mark this plan Approved and run:"
|
|
767
|
+
echo " bash scripts/plan-to-todo.sh --plan $active_plan"
|
|
768
|
+
exit 0
|
|
769
|
+
;;
|
|
770
|
+
plan_status_not_approved_block)
|
|
771
|
+
echo "[PlanStatusGuard] Advisory: plan status is '$plan_status' in $active_plan. Complete the annotation cycle and move the plan to Approved; implementation edits are blocked at the edit layer until then."
|
|
772
|
+
exit 0
|
|
773
|
+
;;
|
|
774
|
+
evidence_contract_block)
|
|
775
|
+
echo "[EvidenceContractGuard] Advisory: plan Evidence Contract is incomplete in $active_plan:"
|
|
776
|
+
printf '%s\n' "$evidence_error"
|
|
777
|
+
echo "[EvidenceContractGuard] Fill ## Evidence Contract with state/progress path, verification evidence, evaluator rubric, stop condition, and rollback surface before implementation."
|
|
778
|
+
exit 0
|
|
779
|
+
;;
|
|
780
|
+
plan_execution_scaffold_advice)
|
|
781
|
+
echo "[PlanExecutionGate] Approval detected for approved plan: $active_plan"
|
|
782
|
+
echo "[PlanExecutionGate] Create the sprint contract/review/notes before implementation:"
|
|
783
|
+
echo " bash scripts/plan-to-todo.sh --plan $active_plan"
|
|
784
|
+
exit 0
|
|
785
|
+
;;
|
|
786
|
+
contract_missing_block)
|
|
787
|
+
echo "[ContractGuard] Advisory: missing active sprint contract for $active_plan."
|
|
788
|
+
echo "[ContractGuard] Run bash scripts/plan-to-todo.sh --plan $active_plan to create the contract/review/notes scaffold before implementation."
|
|
789
|
+
exit 0
|
|
790
|
+
;;
|
|
791
|
+
done_missing_active_plan)
|
|
792
|
+
echo "[ContractGuard] Done intent detected, but no active plan found. Complete plan workflow first."
|
|
793
|
+
hook_structured_error \
|
|
794
|
+
"ContractGuard" \
|
|
795
|
+
"Done intent detected without an active plan." \
|
|
796
|
+
"Finish the plan workflow and ensure plans/ contains the active plan before marking work done." \
|
|
797
|
+
"state_violation"
|
|
798
|
+
exit 2
|
|
799
|
+
;;
|
|
800
|
+
done_contract_path_missing)
|
|
801
|
+
echo "[ContractGuard] Could not derive contract path from plan: $active_plan"
|
|
802
|
+
hook_structured_error \
|
|
803
|
+
"ContractGuard" \
|
|
804
|
+
"Could not derive a contract path from $active_plan." \
|
|
805
|
+
"Rename the plan to plan-<timestamp>-<slug>.md so the matching contract can be resolved." \
|
|
806
|
+
"missing_artifact"
|
|
807
|
+
exit 2
|
|
808
|
+
;;
|
|
809
|
+
done_missing_contract)
|
|
810
|
+
echo "[ContractGuard] Missing task contract: $contract_file"
|
|
811
|
+
hook_structured_error \
|
|
812
|
+
"ContractGuard" \
|
|
813
|
+
"Missing task contract $contract_file." \
|
|
814
|
+
"Create the contract or regenerate tasks from the active plan before marking work done." \
|
|
815
|
+
"missing_artifact"
|
|
816
|
+
exit 2
|
|
817
|
+
;;
|
|
818
|
+
done_evidence_contract_block)
|
|
819
|
+
echo "[EvidenceContractGuard] Plan Evidence Contract is incomplete in $active_plan:"
|
|
820
|
+
printf '%s\n' "$evidence_error"
|
|
821
|
+
hook_structured_error \
|
|
822
|
+
"EvidenceContractGuard" \
|
|
823
|
+
"Done intent detected without a complete plan Evidence Contract." \
|
|
824
|
+
"Fill ## Evidence Contract with state/progress path, verification evidence, evaluator rubric, stop condition, and rollback surface before marking work done." \
|
|
825
|
+
"quality_gate"
|
|
826
|
+
exit 2
|
|
827
|
+
;;
|
|
828
|
+
*)
|
|
829
|
+
echo "[PromptGuard] Unknown decision action: $action"
|
|
830
|
+
hook_structured_error \
|
|
831
|
+
"PromptGuard" \
|
|
832
|
+
"Unknown prompt guard decision action: $action." \
|
|
833
|
+
"Fix the TypeScript prompt guard decision table before continuing." \
|
|
834
|
+
"state_violation"
|
|
835
|
+
exit 2
|
|
836
|
+
;;
|
|
837
|
+
esac
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
emit_workflow_file_guards() {
|
|
841
|
+
if [ -f "tasks/todos.md" ] && has_changes "tasks/todos.md"; then
|
|
842
|
+
echo "[PlanGuard] tasks/todos.md has been modified. Read annotations and update the plan. Do not implement yet."
|
|
843
|
+
fi
|
|
844
|
+
|
|
845
|
+
if [ -f "tasks/lessons.md" ] && has_changes "tasks/lessons.md"; then
|
|
846
|
+
echo "[LessonGuard] tasks/lessons.md has updates. Review prevention rules before coding."
|
|
847
|
+
fi
|
|
848
|
+
|
|
849
|
+
local changed_research
|
|
850
|
+
changed_research="$(has_changes_glob '^docs/researches/.*\.md$' || true)"
|
|
851
|
+
if [ -n "$changed_research" ]; then
|
|
852
|
+
echo "[ResearchGuard] ${changed_research} updated. Review research deeply before planning or implementation."
|
|
853
|
+
fi
|
|
854
|
+
|
|
855
|
+
local changed_plan
|
|
856
|
+
changed_plan="$(has_changes_glob '^plans/plan-.*\.md$' || true)"
|
|
857
|
+
if [ -n "$changed_plan" ]; then
|
|
858
|
+
echo "[AnnotationGuard] ${changed_plan} has annotations. Process all notes and revise. Do not implement yet."
|
|
859
|
+
fi
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
# --- Main flow ---
|
|
863
|
+
|
|
864
|
+
PROMPT_TEXT="$(hook_get_prompt "${1:-}")"
|
|
865
|
+
PROMPT_INTENT_TEXT="$(prompt_intent_text)"
|
|
866
|
+
|
|
867
|
+
prompt_guard_refresh_state
|
|
868
|
+
prompt_guard_engine_call
|
|
869
|
+
|
|
870
|
+
if [[ "$PG_ENGINE_STATE" != "ok" ]]; then
|
|
871
|
+
if [[ "$PG_ENGINE_STATE" == "legacy" ]]; then
|
|
872
|
+
echo "[PromptGuard] Advisory: the installed forge CLI predates the prompt-verdict protocol; prompt intent gates are degraded to advisory for this prompt."
|
|
873
|
+
echo "[PromptGuard] Refresh the CLI with: bun add -g forge@latest && forge install. Fallback: npx -y forge install."
|
|
874
|
+
else
|
|
875
|
+
echo "[PromptGuard] Advisory: prompt-guard decision engine is unavailable (forge CLI or bun not found); prompt intent gates are degraded to advisory for this prompt."
|
|
876
|
+
echo "[PromptGuard] Edit-layer plan guidance remains advisory; path, conflict, destructive, remote, and evidence guards remain authoritative. Install the forge CLI to restore richer prompt decisions."
|
|
877
|
+
fi
|
|
878
|
+
emit_workflow_file_guards
|
|
879
|
+
exit 0
|
|
880
|
+
fi
|
|
881
|
+
|
|
882
|
+
emit_agentic_packaging_hint
|
|
883
|
+
emit_waza_route_hint
|
|
884
|
+
emit_codegraph_route_hint
|
|
885
|
+
emit_pending_orchestration_discussion
|
|
886
|
+
|
|
887
|
+
implement_intent=0
|
|
888
|
+
pg_fact IMPLEMENT && implement_intent=1
|
|
889
|
+
done_intent=0
|
|
890
|
+
pg_fact DONE && done_intent=1
|
|
891
|
+
plan_start_intent=0
|
|
892
|
+
pg_fact PLAN_START && plan_start_intent=1
|
|
893
|
+
|
|
894
|
+
plan_research_ready=1
|
|
895
|
+
if [ "$plan_start_intent" -eq 1 ]; then
|
|
896
|
+
if ! has_research_for_new_plan; then
|
|
897
|
+
latest_plan="$(get_latest_plan || true)"
|
|
898
|
+
if [[ -n "$latest_plan" ]]; then
|
|
899
|
+
plan_research_ready=0
|
|
900
|
+
echo "[ResearchGate] Advisory: docs/researches/*.md is missing or older than $latest_plan; skipping automatic Draft plan creation."
|
|
901
|
+
echo "[ResearchGate] Add or update a docs/researches/ report with fresh findings before creating the next plan."
|
|
902
|
+
else
|
|
903
|
+
echo "[ResearchGate] WARNING: no docs/researches/*.md report exists yet. Consider creating one with current findings before drafting the plan."
|
|
904
|
+
echo " 首次创建计划:建议先写 docs/researches/<date-topic>.md,但不阻塞。"
|
|
905
|
+
fi
|
|
906
|
+
fi
|
|
907
|
+
fi
|
|
908
|
+
|
|
909
|
+
if [ "$implement_intent" -eq 0 ] && [ "$done_intent" -eq 0 ]; then
|
|
910
|
+
if [ "$plan_start_intent" -eq 1 ] && [ "$plan_research_ready" -eq 0 ]; then
|
|
911
|
+
echo "[PlanStartGate] Skipping automatic Draft plan workflow until research is refreshed."
|
|
912
|
+
else
|
|
913
|
+
maybe_start_plan_workflow
|
|
914
|
+
fi
|
|
915
|
+
fi
|
|
916
|
+
|
|
917
|
+
if [ "$implement_intent" -eq 0 ]; then
|
|
918
|
+
emit_workflow_file_guards
|
|
919
|
+
fi
|
|
920
|
+
|
|
921
|
+
if [ "$implement_intent" -eq 1 ]; then
|
|
922
|
+
if [ "$PG_ACTION" = "spec_block" ]; then
|
|
923
|
+
render_prompt_guard_action "$PG_ACTION"
|
|
924
|
+
fi
|
|
925
|
+
|
|
926
|
+
maybe_capture_embedded_approved_plan
|
|
927
|
+
|
|
928
|
+
prompt_guard_refresh_state
|
|
929
|
+
prompt_guard_engine_call
|
|
930
|
+
render_prompt_guard_action "$PG_ACTION"
|
|
931
|
+
fi
|
|
932
|
+
|
|
933
|
+
if [ "$done_intent" -eq 1 ]; then
|
|
934
|
+
render_prompt_guard_action "$PG_ACTION"
|
|
935
|
+
|
|
936
|
+
if [ -f "scripts/verify-contract.sh" ]; then
|
|
937
|
+
# --read-only: hook-driven verification must not rewrite the contract Status
|
|
938
|
+
# header, otherwise a transient failure (e.g. flaky `bun test`) dirties the
|
|
939
|
+
# worktree and chains into worktree-guard on the next prompt.
|
|
940
|
+
if ! bash "scripts/verify-contract.sh" --contract "$contract_file" --strict --read-only; then
|
|
941
|
+
echo "[ContractGuard] Contract verification failed: $contract_file"
|
|
942
|
+
hook_structured_error \
|
|
943
|
+
"ContractGuard" \
|
|
944
|
+
"Contract verification failed for $contract_file." \
|
|
945
|
+
"Resolve the failing exit criteria in the contract before marking work done." \
|
|
946
|
+
"contract_failure"
|
|
947
|
+
exit 2
|
|
948
|
+
fi
|
|
949
|
+
else
|
|
950
|
+
echo "[ContractGuard] verify-contract.sh not found at scripts/verify-contract.sh (degraded mode: skipping strict verification)."
|
|
951
|
+
fi
|
|
952
|
+
|
|
953
|
+
review_file="$(workflow_active_review || true)"
|
|
954
|
+
if [ -z "$review_file" ] || [ ! -f "$review_file" ]; then
|
|
955
|
+
echo "[ReviewGuard] Missing sprint review: ${review_file:-tasks/reviews/<slug>.review.md}"
|
|
956
|
+
hook_structured_error \
|
|
957
|
+
"ReviewGuard" \
|
|
958
|
+
"Done intent detected without a sprint review artifact." \
|
|
959
|
+
"Run Waza /check after verification and record its evaluator recommendation in tasks/reviews/<slug>.review.md before marking work done." \
|
|
960
|
+
"quality_gate"
|
|
961
|
+
exit 2
|
|
962
|
+
fi
|
|
963
|
+
|
|
964
|
+
if ! workflow_review_recommends_pass "$review_file"; then
|
|
965
|
+
echo "[ReviewGuard] Sprint review does not recommend pass: $review_file"
|
|
966
|
+
hook_structured_error \
|
|
967
|
+
"ReviewGuard" \
|
|
968
|
+
"Sprint review is missing a passing recommendation." \
|
|
969
|
+
"Run Waza /check with fresh verification evidence and record a pass recommendation before marking work done." \
|
|
970
|
+
"quality_gate"
|
|
971
|
+
exit 2
|
|
972
|
+
fi
|
|
973
|
+
|
|
974
|
+
external_status="$(workflow_external_acceptance_status "$review_file")"
|
|
975
|
+
IFS=$'\t' read -r external_state external_reviewer external_source external_message <<< "$external_status"
|
|
976
|
+
if [ "$external_state" != "pass" ] && [ "$external_state" != "manual_override" ]; then
|
|
977
|
+
echo "[ExternalAcceptanceGuard] ${external_message:-External acceptance is missing.}"
|
|
978
|
+
hook_structured_error \
|
|
979
|
+
"ExternalAcceptanceGuard" \
|
|
980
|
+
"${external_message:-External acceptance is missing from $review_file.}" \
|
|
981
|
+
"Run peer acceptance via $(workflow_external_acceptance_expected_source) and record ## External Acceptance Advice in $review_file before marking work done." \
|
|
982
|
+
"quality_gate"
|
|
983
|
+
exit 2
|
|
984
|
+
fi
|
|
985
|
+
|
|
986
|
+
checks_file="$(workflow_checks_file)"
|
|
987
|
+
if [ ! -f "$checks_file" ]; then
|
|
988
|
+
echo "[EvidenceGuard] Missing structured checks file: $checks_file"
|
|
989
|
+
hook_structured_error \
|
|
990
|
+
"EvidenceGuard" \
|
|
991
|
+
"Done intent detected without structured verification evidence." \
|
|
992
|
+
"Run the relevant checks so .ai/harness/checks/latest.json exists before marking work done." \
|
|
993
|
+
"quality_gate"
|
|
994
|
+
exit 2
|
|
995
|
+
fi
|
|
996
|
+
|
|
997
|
+
if ! checks_error="$(workflow_checks_pass "$checks_file" "$contract_file" "$review_file")"; then
|
|
998
|
+
echo "[EvidenceGuard] $checks_error"
|
|
999
|
+
hook_structured_error \
|
|
1000
|
+
"EvidenceGuard" \
|
|
1001
|
+
"$checks_error" \
|
|
1002
|
+
"Run bash scripts/verify-sprint.sh so .ai/harness/checks/latest.json records a passing current sprint verification." \
|
|
1003
|
+
"quality_gate"
|
|
1004
|
+
exit 2
|
|
1005
|
+
fi
|
|
1006
|
+
|
|
1007
|
+
task_state="$(workflow_plan_task_state "$active_plan")"
|
|
1008
|
+
IFS=$'\t' read -r total_tasks done_tasks next_task <<< "$task_state"
|
|
1009
|
+
remaining_tasks=$(( ${total_tasks:-0} - ${done_tasks:-0} ))
|
|
1010
|
+
if [ "${remaining_tasks:-0}" -gt 0 ]; then
|
|
1011
|
+
echo "[ArchiveGuard] Done intent detected but active plan still has $remaining_tasks unchecked item(s). Refusing to auto-archive."
|
|
1012
|
+
hook_structured_error \
|
|
1013
|
+
"ArchiveGuard" \
|
|
1014
|
+
"Done intent with $remaining_tasks unchecked active-plan task(s)." \
|
|
1015
|
+
"Finish the remaining Task Breakdown item: ${next_task:-see $active_plan}." \
|
|
1016
|
+
"state_violation"
|
|
1017
|
+
exit 2
|
|
1018
|
+
fi
|
|
1019
|
+
|
|
1020
|
+
if workflow_is_linked_worktree; then
|
|
1021
|
+
next_action="$(workflow_next_action)"
|
|
1022
|
+
next_stage="$(printf '%s\n' "$next_action" | cut -f1)"
|
|
1023
|
+
next_command="$(printf '%s\n' "$next_action" | cut -f2)"
|
|
1024
|
+
next_message="$(printf '%s\n' "$next_action" | cut -f3-)"
|
|
1025
|
+
[[ "${next_command:-}" == "-" ]] && next_command=""
|
|
1026
|
+
echo "[WorkflowNextAction] Done quality gates passed for $active_plan."
|
|
1027
|
+
echo "[WorkflowNextAction] ${next_message:-Finish this contract worktree.}"
|
|
1028
|
+
if [ -n "${next_command:-}" ]; then
|
|
1029
|
+
echo "[WorkflowNextAction] ${next_command}"
|
|
1030
|
+
fi
|
|
1031
|
+
exit 0
|
|
1032
|
+
fi
|
|
1033
|
+
|
|
1034
|
+
if [ ! -x scripts/archive-workflow.sh ]; then
|
|
1035
|
+
echo "[AutoArchive] scripts/archive-workflow.sh is missing or not executable. Skipping auto-archive."
|
|
1036
|
+
hook_structured_error \
|
|
1037
|
+
"AutoArchive" \
|
|
1038
|
+
"scripts/archive-workflow.sh is missing or not executable." \
|
|
1039
|
+
"Install the workflow helper before relying on auto-archive." \
|
|
1040
|
+
"missing_artifact"
|
|
1041
|
+
exit 1
|
|
1042
|
+
fi
|
|
1043
|
+
|
|
1044
|
+
outcome="${PG_DONE_OUTCOME:-Completed}"
|
|
1045
|
+
echo "[AutoArchive] All quality gates passed. Archiving $active_plan as outcome=$outcome"
|
|
1046
|
+
if ! archive_output="$(bash scripts/archive-workflow.sh --plan "$active_plan" --outcome "$outcome" 2>&1)"; then
|
|
1047
|
+
printf '%s\n' "$archive_output"
|
|
1048
|
+
hook_structured_error \
|
|
1049
|
+
"AutoArchive" \
|
|
1050
|
+
"Automatic archive failed for $active_plan." \
|
|
1051
|
+
"Run bash scripts/archive-workflow.sh --plan $active_plan --outcome $outcome and resolve the error." \
|
|
1052
|
+
"contract_failure"
|
|
1053
|
+
exit 1
|
|
1054
|
+
fi
|
|
1055
|
+
printf '%s\n' "$archive_output"
|
|
1056
|
+
fi
|
|
1057
|
+
|
|
1058
|
+
if pg_fact SPA_DAY; then
|
|
1059
|
+
if [ -f "docs/reference-configs/handoff-protocol.md" ]; then
|
|
1060
|
+
echo "[HarnessMaintenance] Follow docs/reference-configs/handoff-protocol.md and sprint-contracts.md when consolidating workflow rules."
|
|
1061
|
+
else
|
|
1062
|
+
echo "[HarnessMaintenance] harness protocol docs missing. Add docs/reference-configs/handoff-protocol.md."
|
|
1063
|
+
fi
|
|
1064
|
+
fi
|
|
1065
|
+
|
|
1066
|
+
# --- TDD/BDD Context Injection ---
|
|
1067
|
+
# Exclusion logic (diagnostic/review/consultation prompts that merely mention
|
|
1068
|
+
# bugs must not trigger fix advice) lives in the TypeScript classifier.
|
|
1069
|
+
if pg_fact TDD_BUG_FIX_ADVICE; then
|
|
1070
|
+
echo "[TDD] Bug-fix intent detected. Reproduce with a failing test first."
|
|
1071
|
+
echo " 检测到修复请求:先写失败测试复现问题,再重写实现。"
|
|
1072
|
+
emit_cross_review_hint debug
|
|
1073
|
+
fi
|
|
1074
|
+
if pg_fact BDD_FEATURE_ADVICE; then
|
|
1075
|
+
echo "[BDD] Feature intent detected. Define Given-When-Then acceptance scenarios first."
|
|
1076
|
+
echo " 检测到新功能请求:先定义 Given-When-Then 验收场景。"
|
|
1077
|
+
fi
|