@opengsd/gsd-core 1.14.0 → 1.16.0
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.opencode/plugins/gsd-core.js +85 -5
- package/README.ja-JP.md +3 -3
- package/README.ko-KR.md +3 -3
- package/README.pt-BR.md +3 -3
- package/README.zh-CN.md +3 -3
- package/agents/gsd-code-fixer.compact.md +7 -6
- package/agents/gsd-code-fixer.md +9 -8
- package/agents/gsd-code-reviewer.compact.md +5 -3
- package/agents/gsd-code-reviewer.md +8 -6
- package/agents/gsd-debug-session-manager.compact.md +17 -2
- package/agents/gsd-debug-session-manager.md +17 -2
- package/agents/gsd-debugger.md +3 -3
- package/agents/gsd-eval-auditor.compact.md +1 -1
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-executor.md +17 -12
- package/agents/gsd-intel-updater.compact.md +1 -1
- package/agents/gsd-intel-updater.md +1 -1
- package/agents/gsd-mempalace-curator.md +2 -2
- package/agents/gsd-phase-researcher.md +19 -11
- package/agents/gsd-plan-checker.md +15 -9
- package/agents/gsd-planner.md +15 -11
- package/agents/gsd-project-researcher.compact.md +1 -1
- package/agents/gsd-project-researcher.md +1 -1
- package/agents/gsd-research-synthesizer.compact.md +1 -1
- package/agents/gsd-research-synthesizer.md +1 -1
- package/agents/gsd-ui-auditor.compact.md +21 -30
- package/agents/gsd-ui-auditor.md +166 -37
- package/agents/gsd-ui-researcher.compact.md +1 -1
- package/agents/gsd-ui-researcher.md +1 -1
- package/agents/gsd-verifier.md +37 -14
- package/bin/install.js +764 -287
- package/commands/gsd/add-tests.md +6 -1
- package/commands/gsd/ai-integration-phase.md +6 -1
- package/commands/gsd/audit-fix.md +5 -0
- package/commands/gsd/audit-milestone.md +6 -1
- package/commands/gsd/autonomous.md +7 -2
- package/commands/gsd/capture.md +9 -5
- package/commands/gsd/code-review.md +7 -2
- package/commands/gsd/complete-milestone.md +4 -0
- package/commands/gsd/config.md +7 -3
- package/commands/gsd/debug.md +11 -7
- package/commands/gsd/discuss-phase.md +7 -3
- package/commands/gsd/docs-update.md +12 -7
- package/commands/gsd/eval-review.md +6 -1
- package/commands/gsd/execute-phase.md +12 -7
- package/commands/gsd/extract-learnings.md +5 -0
- package/commands/gsd/fast.md +4 -0
- package/commands/gsd/forensics.md +5 -1
- package/commands/gsd/graphify.md +10 -6
- package/commands/gsd/health.md +5 -0
- package/commands/gsd/help.md +7 -2
- package/commands/gsd/import.md +7 -3
- package/commands/gsd/inbox.md +5 -0
- package/commands/gsd/ingest-docs.md +5 -1
- package/commands/gsd/manager.md +6 -1
- package/commands/gsd/map-codebase.md +7 -3
- package/commands/gsd/mempalace-capture.md +12 -4
- package/commands/gsd/mempalace-recall.md +5 -1
- package/commands/gsd/milestone-summary.md +5 -1
- package/commands/gsd/mvp-phase.md +8 -3
- package/commands/gsd/new-milestone.md +6 -1
- package/commands/gsd/new-project.md +5 -0
- package/commands/gsd/next.md +6 -1
- package/commands/gsd/ns-context.md +4 -0
- package/commands/gsd/ns-ideate.md +4 -0
- package/commands/gsd/ns-manage.md +4 -0
- package/commands/gsd/ns-project.md +4 -0
- package/commands/gsd/ns-review.md +4 -0
- package/commands/gsd/ns-workflow.md +4 -0
- package/commands/gsd/onboard.md +6 -1
- package/commands/gsd/pause-work.md +5 -1
- package/commands/gsd/phase.md +8 -4
- package/commands/gsd/plan-phase.md +6 -1
- package/commands/gsd/plan-review-convergence.md +11 -7
- package/commands/gsd/pr-branch.md +4 -0
- package/commands/gsd/profile-user.md +5 -1
- package/commands/gsd/progress.md +7 -2
- package/commands/gsd/quick-batch.md +21 -9
- package/commands/gsd/quick.md +12 -7
- package/commands/gsd/review.md +7 -4
- package/commands/gsd/secure-phase.md +6 -1
- package/commands/gsd/ship.md +5 -0
- package/commands/gsd/sketch.md +7 -2
- package/commands/gsd/spec-phase.md +5 -1
- package/commands/gsd/spike.md +8 -3
- package/commands/gsd/surface.md +5 -1
- package/commands/gsd/thread.md +4 -0
- package/commands/gsd/ui-phase.md +6 -1
- package/commands/gsd/ui-review.md +6 -1
- package/commands/gsd/ultraplan-phase.md +5 -1
- package/commands/gsd/undo.md +5 -1
- package/commands/gsd/update.md +6 -2
- package/commands/gsd/validate-phase.md +6 -1
- package/commands/gsd/verify-work.md +6 -1
- package/commands/gsd/workspace.md +7 -3
- package/gsd-core/bin/gsd-tools.cjs +477 -78
- package/gsd-core/bin/lib/active-workstream-store.cjs +15 -0
- package/gsd-core/bin/lib/adr-parser.cjs +3 -1
- package/gsd-core/bin/lib/agent-install-check.cjs +4 -1
- package/gsd-core/bin/lib/audit.cjs +144 -42
- package/gsd-core/bin/lib/broken-windows.cjs +13 -13
- package/gsd-core/bin/lib/capability-activation.cjs +9 -4
- package/gsd-core/bin/lib/capability-registry.cjs +197 -222
- package/gsd-core/bin/lib/capability-validator.cjs +16 -1
- package/gsd-core/bin/lib/check-auto-mode.cjs +35 -0
- package/gsd-core/bin/lib/check-command-router.cjs +164 -1625
- package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +13 -2
- package/gsd-core/bin/lib/cli-exit.cjs +12 -0
- package/gsd-core/bin/lib/codex-agent-toml.cjs +32 -33
- package/gsd-core/bin/lib/command-aliases.cjs +7 -0
- package/gsd-core/bin/lib/command-routing-hub.cjs +48 -1
- package/gsd-core/bin/lib/commands.cjs +343 -207
- package/gsd-core/bin/lib/complexity-trigger.cjs +8 -7
- package/gsd-core/bin/lib/config-loader.cjs +65 -4
- package/gsd-core/bin/lib/config.cjs +76 -19
- package/gsd-core/bin/lib/core-utils.cjs +6 -1
- package/gsd-core/bin/lib/coverage.cjs +4 -8
- package/gsd-core/bin/lib/decision-coverage-support.cjs +259 -0
- package/gsd-core/bin/lib/decisions.cjs +30 -14
- package/gsd-core/bin/lib/drift.cjs +177 -42
- package/gsd-core/bin/lib/frontmatter-fence.cjs +90 -0
- package/gsd-core/bin/lib/frontmatter-splice.cjs +494 -0
- package/gsd-core/bin/lib/frontmatter.cjs +426 -234
- package/gsd-core/bin/lib/gap-checker.cjs +72 -29
- package/gsd-core/bin/lib/gate-api-coverage-verify-pre.cjs +381 -0
- package/gsd-core/bin/lib/gate-args.cjs +53 -0
- package/gsd-core/bin/lib/gate-codebase-drift.cjs +285 -0
- package/gsd-core/bin/lib/gate-config.cjs +46 -0
- package/gsd-core/bin/lib/gate-context-drift.cjs +141 -0
- package/gsd-core/bin/lib/gate-decision-coverage-plan.cjs +169 -0
- package/gsd-core/bin/lib/gate-decision-coverage-verify.cjs +126 -0
- package/gsd-core/bin/lib/gate-evaluation-scope.cjs +555 -0
- package/gsd-core/bin/lib/gate-evidence.cjs +138 -0
- package/gsd-core/bin/lib/gate-exit.cjs +27 -0
- package/gsd-core/bin/lib/gate-gap-analysis-plan-post.cjs +61 -0
- package/gsd-core/bin/lib/gate-phase-context.cjs +170 -0
- package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +1 -1
- package/gsd-core/bin/lib/gate-predicate.cjs +165 -0
- package/gsd-core/bin/lib/gate-prohibition-enforcement.cjs +94 -0
- package/gsd-core/bin/lib/gate-schema-drift.cjs +165 -0
- package/gsd-core/bin/lib/gate-tdd-red-evidence.cjs +100 -0
- package/gsd-core/bin/lib/gate-tdd-review-checkpoint.cjs +182 -0
- package/gsd-core/bin/lib/gate-ui-plan.cjs +86 -0
- package/gsd-core/bin/lib/gate-ui-safety.cjs +80 -0
- package/gsd-core/bin/lib/gate-verdict.cjs +64 -0
- package/gsd-core/bin/lib/gate-verify-command-paths.cjs +78 -0
- package/gsd-core/bin/lib/gate-verify-failure-directions.cjs +41 -0
- package/gsd-core/bin/lib/graphify.cjs +10 -2
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +43 -47
- package/gsd-core/bin/lib/health-diagnostic.cjs +45 -8
- package/gsd-core/bin/lib/host-runtime-detection.cjs +9 -0
- package/gsd-core/bin/lib/init.cjs +364 -132
- package/gsd-core/bin/lib/install-engine.cjs +30 -33
- package/gsd-core/bin/lib/install-profiles.cjs +7 -4
- package/gsd-core/bin/lib/installer-migrations.cjs +8 -1
- package/gsd-core/bin/lib/io.cjs +122 -3
- package/gsd-core/bin/lib/loop-resolver.cjs +95 -0
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +75 -1
- package/gsd-core/bin/lib/milestone.cjs +37 -6
- package/gsd-core/bin/lib/model-resolver.cjs +171 -62
- package/gsd-core/bin/lib/observability/event.cjs +1 -1
- package/gsd-core/bin/lib/observability/logger.cjs +46 -1
- package/gsd-core/bin/lib/pattern.cjs +10 -0
- package/gsd-core/bin/lib/phase-command-router.cjs +20 -5
- package/gsd-core/bin/lib/phase-estimation.cjs +5 -4
- package/gsd-core/bin/lib/phase-id-card.cjs +32 -0
- package/gsd-core/bin/lib/phase-id-display.cjs +78 -0
- package/gsd-core/bin/lib/phase-id.cjs +110 -8
- package/gsd-core/bin/lib/phase-lifecycle.cjs +9 -2
- package/gsd-core/bin/lib/phase-locator.cjs +29 -10
- package/gsd-core/bin/lib/phase-status.cjs +360 -0
- package/gsd-core/bin/lib/phase.cjs +489 -88
- package/gsd-core/bin/lib/plan-document.cjs +142 -20
- package/gsd-core/bin/lib/plan-drift-guard.cjs +5 -0
- package/gsd-core/bin/lib/planning-document.cjs +692 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +60 -9
- package/gsd-core/bin/lib/planning-snapshot.cjs +18 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +83 -55
- package/gsd-core/bin/lib/pr-branch-patterns.cjs +57 -0
- package/gsd-core/bin/lib/pristine-baseline.cjs +10 -0
- package/gsd-core/bin/lib/probe-core.cjs +7 -1
- package/gsd-core/bin/lib/profile-output.cjs +6 -3
- package/gsd-core/bin/lib/prohibition-enforcement.cjs +0 -55
- package/gsd-core/bin/lib/project-root.cjs +41 -2
- package/gsd-core/bin/lib/quick-batch-command-router.cjs +35 -9
- package/gsd-core/bin/lib/quick-batch-dispatch.cjs +11 -8
- package/gsd-core/bin/lib/real-home-guard.cjs +9 -1
- package/gsd-core/bin/lib/report-parser.cjs +269 -0
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +10 -30
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +2 -2
- package/gsd-core/bin/lib/roadmap-command-router.cjs +25 -19
- package/gsd-core/bin/lib/roadmap-parser.cjs +242 -15
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +1653 -65
- package/gsd-core/bin/lib/roadmap.cjs +405 -88
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +373 -187
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +5 -2
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +57 -1
- package/gsd-core/bin/lib/runtime-homes.cjs +14 -7
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +522 -624
- package/gsd-core/bin/lib/runtime-name-policy.cjs +246 -21
- package/gsd-core/bin/lib/runtime-slash.cjs +47 -30
- package/gsd-core/bin/lib/shell-command-projection.cjs +47 -8
- package/gsd-core/bin/lib/smart-entry.cjs +19 -3
- package/gsd-core/bin/lib/stale-bake-guard.cjs +32 -48
- package/gsd-core/bin/lib/state-contract.cjs +15 -18
- package/gsd-core/bin/lib/state-document.cjs +100 -22
- package/gsd-core/bin/lib/state-transition.cjs +39 -2
- package/gsd-core/bin/lib/state.cjs +256 -105
- package/gsd-core/bin/lib/surface.cjs +19 -2
- package/gsd-core/bin/lib/tdd-red-evidence.cjs +48 -79
- package/gsd-core/bin/lib/uat-predicate.cjs +359 -38
- package/gsd-core/bin/lib/uat.cjs +432 -7
- package/gsd-core/bin/lib/ui-consideration-probe.cjs +15 -2
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +167 -40
- package/gsd-core/bin/lib/undo-commit-selection.cjs +131 -0
- package/gsd-core/bin/lib/vendor/README.md +31 -9
- package/gsd-core/bin/lib/vendor/saxes.cjs +1934 -0
- package/gsd-core/bin/lib/vendor/saxes.cjs.LICENSE.txt +92 -0
- package/gsd-core/bin/lib/vendor/tap-parser.cjs +8927 -0
- package/gsd-core/bin/lib/vendor/tap-parser.cjs.LICENSE.txt +152 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +1378 -274
- package/gsd-core/bin/lib/verify-command-grounding.cjs +46 -2
- package/gsd-core/bin/lib/verify-command-router.cjs +18 -7
- package/gsd-core/bin/lib/verify.cjs +357 -531
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +14 -6
- package/gsd-core/bin/lib/workstream-inventory.cjs +31 -21
- package/gsd-core/bin/lib/workstream-name-policy.cjs +31 -1
- package/gsd-core/bin/lib/workstream.cjs +11 -2
- package/gsd-core/bin/lib/worktree-base-ref.cjs +482 -73
- package/gsd-core/bin/lib/worktree-safety.cjs +784 -51
- package/gsd-core/bin/shared/config-defaults.manifest.json +8 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +5 -0
- package/gsd-core/references/autonomous-smart-discuss.md +2 -1
- package/gsd-core/references/autonomous-ui-design-contract.md +3 -3
- package/gsd-core/references/checkpoints.md +5 -3
- package/gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json +28 -3
- package/gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json +37 -4
- package/gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json +28 -3
- package/gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json +28 -3
- package/gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json +37 -4
- package/gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json +37 -4
- package/gsd-core/references/edge-probe.md +195 -21
- package/gsd-core/references/execute-mvp-tdd.md +5 -10
- package/gsd-core/references/execute-phase-between-wave-reset.md +10 -6
- package/gsd-core/references/execute-phase-response-language.md +1 -1
- package/gsd-core/references/execute-phase-wave-guard.md +22 -11
- package/gsd-core/references/gsd-run-resolver.md +1 -1
- package/gsd-core/references/loop-hook-dispatch.md +7 -1
- package/gsd-core/references/model-profiles.md +1 -1
- package/gsd-core/references/offer-next.md +1 -1
- package/gsd-core/references/phase-argument-parsing.md +9 -7
- package/gsd-core/references/phase-id-convention.md +28 -0
- package/gsd-core/references/planner-gap-closure.md +2 -0
- package/gsd-core/references/planner-load-graph-context.md +24 -13
- package/gsd-core/references/planner-verify-command-grounding.md +14 -0
- package/gsd-core/references/planning-config.md +12 -3
- package/gsd-core/references/spidr-splitting.md +1 -1
- package/gsd-core/references/tdd.md +37 -8
- package/gsd-core/references/ui-consideration-probe.md +10 -5
- package/gsd-core/references/verifier-phase-gates.md +5 -2
- package/gsd-core/references/verify-command-path-resolvability.md +10 -2
- package/gsd-core/references/verify-mvp-mode.md +2 -2
- package/gsd-core/references/workstream-flag.md +33 -3
- package/gsd-core/references/worktree-path-safety.md +321 -0
- package/gsd-core/templates/README.md +1 -1
- package/gsd-core/templates/UAT.md +17 -1
- package/gsd-core/templates/config.json +2 -11
- package/gsd-core/templates/verification-report.md +1 -1
- package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
- package/gsd-core/workflows/add-backlog.md +1 -1
- package/gsd-core/workflows/add-phase.md +8 -7
- package/gsd-core/workflows/add-tests.md +4 -3
- package/gsd-core/workflows/add-todo.md +6 -5
- package/gsd-core/workflows/ai-integration-phase.md +13 -4
- package/gsd-core/workflows/audit-fix.md +1 -1
- package/gsd-core/workflows/audit-milestone.md +4 -3
- package/gsd-core/workflows/audit-uat.md +1 -1
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +9 -18
- package/gsd-core/workflows/autonomous.md +43 -23
- package/gsd-core/workflows/check-todos.md +7 -6
- package/gsd-core/workflows/cleanup.md +2 -2
- package/gsd-core/workflows/code-review/steps/dispatch-fix.md +4 -3
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +20 -13
- package/gsd-core/workflows/code-review-fix.md +112 -25
- package/gsd-core/workflows/code-review.md +146 -135
- package/gsd-core/workflows/complete-milestone/detail/elaboration.md +4 -3
- package/gsd-core/workflows/complete-milestone.md +13 -8
- package/gsd-core/workflows/debug.md +32 -7
- package/gsd-core/workflows/diagnose-issues.md +3 -2
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/chain.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions.md +4 -3
- package/gsd-core/workflows/discuss-phase.md +4 -3
- package/gsd-core/workflows/do.md +2 -2
- package/gsd-core/workflows/docs-update.md +6 -5
- package/gsd-core/workflows/edit-phase.md +4 -3
- package/gsd-core/workflows/eval-review.md +14 -5
- package/gsd-core/workflows/execute-phase/detail/elaboration.md +2 -2
- package/gsd-core/workflows/execute-phase/steps/code-review-disposition.md +1019 -0
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +15 -4
- package/gsd-core/workflows/execute-phase/steps/completion-reconciliation.md +10 -7
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +37 -3
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +3 -1
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +2 -2
- package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +46 -9
- package/gsd-core/workflows/execute-phase/steps/protected-branch.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/ready-wave-gate.md +37 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/regression-gate.md +2 -0
- package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/threat-id-gate.md +28 -0
- package/gsd-core/workflows/execute-phase/steps/verify-phase-goal.md +187 -0
- package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +2 -3
- package/gsd-core/workflows/execute-phase/steps/worktree-base-check.md +25 -0
- package/gsd-core/workflows/execute-phase.md +96 -178
- package/gsd-core/workflows/execute-plan.md +18 -23
- package/gsd-core/workflows/explore.md +4 -4
- package/gsd-core/workflows/extract-learnings.md +4 -2
- package/gsd-core/workflows/fast.md +1 -1
- package/gsd-core/workflows/forensics.md +1 -1
- package/gsd-core/workflows/graduation.md +1 -1
- package/gsd-core/workflows/health.md +3 -2
- package/gsd-core/workflows/help/modes/full.compact.md +3 -3
- package/gsd-core/workflows/help/modes/full.md +5 -5
- package/gsd-core/workflows/help/modes/topic.md +15 -5
- package/gsd-core/workflows/import.md +4 -3
- package/gsd-core/workflows/inbox.md +2 -2
- package/gsd-core/workflows/ingest-docs.md +3 -3
- package/gsd-core/workflows/insert-phase.md +4 -3
- package/gsd-core/workflows/list-seeds.md +1 -1
- package/gsd-core/workflows/list-workspaces.md +1 -1
- package/gsd-core/workflows/manager.md +6 -4
- package/gsd-core/workflows/map-codebase.md +5 -4
- package/gsd-core/workflows/milestone-summary.md +3 -2
- package/gsd-core/workflows/mvp-phase.md +14 -14
- package/gsd-core/workflows/new-milestone.md +11 -11
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +3 -3
- package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +1 -1
- package/gsd-core/workflows/new-project.md +7 -7
- package/gsd-core/workflows/new-workspace.md +2 -2
- package/gsd-core/workflows/next.md +1 -1
- package/gsd-core/workflows/note.md +1 -1
- package/gsd-core/workflows/onboard.md +1 -1
- package/gsd-core/workflows/pause-work.md +2 -2
- package/gsd-core/workflows/plan-phase/detail/elaboration.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +17 -5
- package/gsd-core/workflows/plan-phase/steps/closed-phase-gate.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +23 -5
- package/gsd-core/workflows/plan-phase.md +50 -24
- package/gsd-core/workflows/plan-review-convergence.md +21 -5
- package/gsd-core/workflows/plant-seed.md +62 -20
- package/gsd-core/workflows/pr-branch.md +113 -13
- package/gsd-core/workflows/profile-user.md +2 -2
- package/gsd-core/workflows/progress.md +19 -49
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +27 -0
- package/gsd-core/workflows/quick/steps/quick-verification.md +4 -4
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +30 -11
- package/gsd-core/workflows/quick-batch/steps/batch-init.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/completion.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/merge-wave.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/planner-wave.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/research-phase.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/resume-mode.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/verification-wave.md +9 -3
- package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +1 -1
- package/gsd-core/workflows/quick-batch.md +15 -10
- package/gsd-core/workflows/quick.md +62 -39
- package/gsd-core/workflows/reapply-patches.md +9 -3
- package/gsd-core/workflows/remove-phase.md +3 -2
- package/gsd-core/workflows/remove-workspace.md +2 -2
- package/gsd-core/workflows/resume-project.md +3 -2
- package/gsd-core/workflows/review.md +33 -17
- package/gsd-core/workflows/scan.md +3 -2
- package/gsd-core/workflows/secure-phase.md +13 -13
- package/gsd-core/workflows/settings-advanced.md +30 -10
- package/gsd-core/workflows/settings-integrations.md +2 -3
- package/gsd-core/workflows/settings.md +4 -4
- package/gsd-core/workflows/ship.md +14 -13
- package/gsd-core/workflows/sketch-wrap-up.md +1 -1
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/smart-entry.md +2 -2
- package/gsd-core/workflows/spec-phase.md +15 -5
- package/gsd-core/workflows/spike-wrap-up.md +1 -1
- package/gsd-core/workflows/spike.md +1 -1
- package/gsd-core/workflows/stats.md +1 -1
- package/gsd-core/workflows/sync-skills.md +5 -5
- package/gsd-core/workflows/thread.md +2 -2
- package/gsd-core/workflows/transition.md +13 -23
- package/gsd-core/workflows/ui-phase.md +48 -11
- package/gsd-core/workflows/ui-review.md +21 -6
- package/gsd-core/workflows/ultraplan-phase.md +3 -2
- package/gsd-core/workflows/undo.md +339 -20
- package/gsd-core/workflows/update.md +7 -7
- package/gsd-core/workflows/validate-phase.md +12 -13
- package/gsd-core/workflows/verify-work/detail/elaboration.md +43 -3
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +1 -1
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +5 -3
- package/gsd-core/workflows/verify-work.md +129 -55
- package/hooks/dist/gsd-agent-isolation-guard.js +32 -0
- package/hooks/dist/gsd-check-update-worker.js +8 -0
- package/hooks/dist/gsd-check-update.js +8 -0
- package/hooks/dist/gsd-context-monitor.js +31 -8
- package/hooks/dist/gsd-cursor-subagent-start.js +8 -0
- package/hooks/dist/gsd-secret-read-guard.js +161 -4
- package/hooks/dist/gsd-statusline.js +85 -20
- package/hooks/dist/gsd-update-banner.js +8 -0
- package/hooks/dist/gsd-validate-commit.sh +63 -4
- package/hooks/dist/gsd-windsurf-pre-write.js +11 -2
- package/hooks/dist/gsd-workflow-guard.js +5 -4
- package/hooks/dist/gsd-worktree-path-guard.js +6 -2
- package/hooks/dist/lib/cli-exit.js +12 -0
- package/hooks/dist/lib/git-probe.js +17 -1
- package/hooks/dist/lib/isolation-sentinel.js +2 -2
- package/hooks/gsd-agent-isolation-guard.js +32 -0
- package/hooks/gsd-check-update-worker.js +8 -0
- package/hooks/gsd-check-update.js +8 -0
- package/hooks/gsd-context-monitor.js +31 -8
- package/hooks/gsd-cursor-subagent-start.js +8 -0
- package/hooks/gsd-secret-read-guard.js +161 -4
- package/hooks/gsd-statusline.js +85 -20
- package/hooks/gsd-update-banner.js +8 -0
- package/hooks/gsd-validate-commit.sh +63 -4
- package/hooks/gsd-windsurf-pre-write.js +11 -2
- package/hooks/gsd-workflow-guard.js +5 -4
- package/hooks/gsd-worktree-path-guard.js +6 -2
- package/hooks/hooks.json +5 -5
- package/hooks/lib/cli-exit.js +12 -0
- package/hooks/lib/git-probe.js +17 -1
- package/hooks/lib/isolation-sentinel.js +2 -2
- package/package.json +22 -4
- package/scripts/build-hooks.js +15 -6
- package/scripts/changeset/parse.cjs +52 -4
- package/scripts/check-contract-drift.cjs +127 -11
- package/scripts/ci-timeout-report.cjs +770 -4
- package/scripts/command-contract-helpers.cjs +15 -8
- package/scripts/docs-guard-registry.cjs +34 -0
- package/scripts/gen-features.cjs +13 -8
- package/scripts/gen-hooks-cli-exit.cjs +12 -28
- package/scripts/gen-loop-host-contract.cjs +79 -1
- package/scripts/gen-platform-conformance-tier.cjs +187 -1
- package/scripts/gen-plugin-skills.cjs +87 -1
- package/scripts/gen-research-agents.cjs +24 -31
- package/scripts/gen-scripts-cli-exit.cjs +30 -3
- package/scripts/gen-test-timings.cjs +32 -7
- package/scripts/lib/cli-exit.cjs +12 -0
- package/scripts/lib/macos-conformance-tier.generated.cjs +34 -2
- package/scripts/lib/ndjson-reporter.cjs +31 -5
- package/scripts/lib/platform-conformance-tier.generated.cjs +45 -5
- package/scripts/lib/registration-ledger-preload.cjs +155 -0
- package/scripts/lib/vendor-bundle.cjs +59 -0
- package/scripts/lib/vendor-licenses/saxes-6.0.0.txt +64 -0
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
- package/scripts/lint-completion-predicate-drift.cjs +18 -19
- package/scripts/lint-descriptions.cjs +7 -3
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +38 -1
- package/scripts/lint-eslint-glob-coverage.allowlist.json +20 -0
- package/scripts/lint-frontmatter-fence-drift.cjs +313 -0
- package/scripts/lint-frontmatter-scalar-broad-grep.cjs +122 -16
- package/scripts/lint-phase-arg-assignment.cjs +257 -0
- package/scripts/lint-phase-enumeration-drift.cjs +12 -8
- package/scripts/lint-phase-id-drift.cjs +319 -5
- package/scripts/lint-planning-document-positive-control.cjs +329 -0
- package/scripts/lint-pr-branch-pattern-drift.cjs +148 -0
- package/scripts/lint-response-language-coverage.cjs +3 -0
- package/scripts/lint-retired-runtime-name.cjs +619 -0
- package/scripts/lint-skill-deps.cjs +7 -3
- package/scripts/lint-state-write-path-drift.cjs +93 -0
- package/scripts/lint-test-file-count.allowlist.json +38 -9
- package/scripts/lint-test-file-count.cjs +34 -1
- package/scripts/lint-vendored-deps.cjs +41 -5
- package/scripts/lint-workflow-shellcheck-baseline.json +25 -10
- package/scripts/mutation-matrix.cjs +50 -5
- package/scripts/prompt-injection-scan.sh +4 -0
- package/scripts/release-tarball-smoke.cjs +194 -1
- package/scripts/require-issue-link-policy.cjs +6 -2
- package/scripts/sync-runtime-launcher.cjs +184 -2
- package/scripts/verify-npm-publish.cjs +76 -20
- package/skills/gsd-add-tests/SKILL.md +6 -1
- package/skills/gsd-ai-integration-phase/SKILL.md +6 -1
- package/skills/gsd-audit-fix/SKILL.md +5 -0
- package/skills/gsd-audit-milestone/SKILL.md +6 -1
- package/skills/gsd-autonomous/SKILL.md +7 -2
- package/skills/gsd-capture/SKILL.md +9 -5
- package/skills/gsd-code-review/SKILL.md +7 -2
- package/skills/gsd-complete-milestone/SKILL.md +4 -0
- package/skills/gsd-config/SKILL.md +8 -4
- package/skills/gsd-debug/SKILL.md +11 -7
- package/skills/gsd-discuss-phase/SKILL.md +7 -3
- package/skills/gsd-docs-update/SKILL.md +12 -7
- package/skills/gsd-eval-review/SKILL.md +6 -1
- package/skills/gsd-execute-phase/SKILL.md +12 -7
- package/skills/gsd-extract-learnings/SKILL.md +5 -0
- package/skills/gsd-fast/SKILL.md +4 -0
- package/skills/gsd-forensics/SKILL.md +5 -1
- package/skills/gsd-graphify/SKILL.md +10 -6
- package/skills/gsd-health/SKILL.md +5 -0
- package/skills/gsd-help/SKILL.md +7 -2
- package/skills/gsd-import/SKILL.md +7 -3
- package/skills/gsd-inbox/SKILL.md +5 -0
- package/skills/gsd-ingest-docs/SKILL.md +5 -1
- package/skills/gsd-manager/SKILL.md +6 -1
- package/skills/gsd-map-codebase/SKILL.md +7 -3
- package/skills/gsd-mempalace-capture/SKILL.md +12 -4
- package/skills/gsd-mempalace-recall/SKILL.md +5 -1
- package/skills/gsd-milestone-summary/SKILL.md +5 -1
- package/skills/gsd-mvp-phase/SKILL.md +8 -3
- package/skills/gsd-new-milestone/SKILL.md +6 -1
- package/skills/gsd-new-project/SKILL.md +5 -0
- package/skills/gsd-next/SKILL.md +6 -1
- package/skills/gsd-ns-context/SKILL.md +4 -0
- package/skills/gsd-ns-ideate/SKILL.md +4 -0
- package/skills/gsd-ns-manage/SKILL.md +4 -0
- package/skills/gsd-ns-project/SKILL.md +4 -0
- package/skills/gsd-ns-review/SKILL.md +4 -0
- package/skills/gsd-ns-workflow/SKILL.md +4 -0
- package/skills/gsd-onboard/SKILL.md +6 -1
- package/skills/gsd-pause-work/SKILL.md +5 -1
- package/skills/gsd-phase/SKILL.md +8 -4
- package/skills/gsd-plan-phase/SKILL.md +6 -1
- package/skills/gsd-plan-review-convergence/SKILL.md +10 -6
- package/skills/gsd-pr-branch/SKILL.md +4 -0
- package/skills/gsd-profile-user/SKILL.md +5 -1
- package/skills/gsd-progress/SKILL.md +7 -2
- package/skills/gsd-quick/SKILL.md +16 -10
- package/skills/gsd-quick-batch/SKILL.md +21 -9
- package/skills/gsd-review/SKILL.md +7 -4
- package/skills/gsd-review-backlog/SKILL.md +3 -2
- package/skills/gsd-secure-phase/SKILL.md +6 -1
- package/skills/gsd-ship/SKILL.md +5 -0
- package/skills/gsd-sketch/SKILL.md +7 -2
- package/skills/gsd-spec-phase/SKILL.md +5 -1
- package/skills/gsd-spike/SKILL.md +8 -3
- package/skills/gsd-surface/SKILL.md +5 -1
- package/skills/gsd-thread/SKILL.md +4 -0
- package/skills/gsd-ui-phase/SKILL.md +6 -1
- package/skills/gsd-ui-review/SKILL.md +6 -1
- package/skills/gsd-ultraplan-phase/SKILL.md +5 -1
- package/skills/gsd-undo/SKILL.md +5 -1
- package/skills/gsd-update/SKILL.md +6 -2
- package/skills/gsd-validate-phase/SKILL.md +6 -1
- package/skills/gsd-verify-work/SKILL.md +6 -1
- package/skills/gsd-workspace/SKILL.md +7 -3
- package/skills/gsd-workstreams/SKILL.md +6 -6
- package/vscode/package.json +1 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GateVerdict — the value a gate module returns instead of printing (#5139, epic #5056,
|
|
4
|
+
* ADR-5057 §4 first bullet, design D1).
|
|
5
|
+
*
|
|
6
|
+
* A gate module decides; the command router formats. A gate imports no io module and performs no
|
|
7
|
+
* direct console/stdout/stderr write (ESLint-enforced) — it returns one of two shapes:
|
|
8
|
+
*
|
|
9
|
+
* - `GateVerdict` the gate reached an answer. `outcome` names it, `block` is the gate's
|
|
10
|
+
* own blocking decision (set explicitly by each arm, never derived from
|
|
11
|
+
* `outcome`), and `payload` is the exact ordered object the router
|
|
12
|
+
* serializes (insertion order is the wire order).
|
|
13
|
+
* - `GateUsageFailure` the caller invoked the gate wrongly (missing argument, escaping path).
|
|
14
|
+
* The router turns it into `error(message, code)`.
|
|
15
|
+
*
|
|
16
|
+
* Pure: no I/O, no imports.
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.GATE_FAILURE_CODE = void 0;
|
|
20
|
+
exports.gateVerdict = gateVerdict;
|
|
21
|
+
exports.gateUnreadable = gateUnreadable;
|
|
22
|
+
exports.gateUsageFailure = gateUsageFailure;
|
|
23
|
+
exports.isGateUsageFailure = isGateUsageFailure;
|
|
24
|
+
/**
|
|
25
|
+
* The `GateUsageFailure.failure.code` values a gate module produces. A gate module may not import
|
|
26
|
+
* `./io.cjs` (whose `ERROR_REASON` owns these wire strings), so it names them here; the router
|
|
27
|
+
* hands the code straight to `error()`. Values are pinned equal to `ERROR_REASON.USAGE` /
|
|
28
|
+
* `ERROR_REASON.SDK_MISSING_ARG` / `ERROR_REASON.UNKNOWN` by the cutover-equivalence goldens and
|
|
29
|
+
* the parity test in tests/check-router-cutover-equivalence.test.cjs.
|
|
30
|
+
*
|
|
31
|
+
* `UNKNOWN` is the reason `error()` records when its caller names none: the drift verbs' usage
|
|
32
|
+
* failures never named one (#5219), and the JSON diagnostic's `reason` and the exit-contract v2
|
|
33
|
+
* status (UNKNOWN is FAIL, 1; SDK_MISSING_ARG is USAGE, 64) are observable, so they keep it.
|
|
34
|
+
*/
|
|
35
|
+
exports.GATE_FAILURE_CODE = Object.freeze({
|
|
36
|
+
USAGE: 'usage',
|
|
37
|
+
SDK_MISSING_ARG: 'sdk_missing_arg',
|
|
38
|
+
UNKNOWN: 'unknown',
|
|
39
|
+
});
|
|
40
|
+
/**
|
|
41
|
+
* Build a verdict. `payload` is copied (insertion order preserved) and the copy frozen, so a
|
|
42
|
+
* verdict cannot be mutated after the gate returned it.
|
|
43
|
+
*/
|
|
44
|
+
function gateVerdict(outcome, block, payload) {
|
|
45
|
+
return { outcome, block, payload: Object.freeze({ ...payload }) };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Build the verdict for evidence that could not be read. `block` is the gate's own policy for that
|
|
49
|
+
* arm (unchanged by this outcome); the exit status is derived from the outcome, never from `block`.
|
|
50
|
+
*/
|
|
51
|
+
function gateUnreadable(block, payload) {
|
|
52
|
+
return gateVerdict('unreadable', block, payload);
|
|
53
|
+
}
|
|
54
|
+
/** Build a usage failure: exactly `{ failure: { code, message } }`. */
|
|
55
|
+
function gateUsageFailure(code, message) {
|
|
56
|
+
return { failure: { code, message } };
|
|
57
|
+
}
|
|
58
|
+
/** Narrow a `GateResult` (or any value) to a `GateUsageFailure`. */
|
|
59
|
+
function isGateUsageFailure(result) {
|
|
60
|
+
if (result === null || typeof result !== 'object')
|
|
61
|
+
return false;
|
|
62
|
+
const failure = result.failure;
|
|
63
|
+
return typeof failure === 'object' && failure !== null;
|
|
64
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `check verify-command-paths` as a gate module (#5139, epic #5056, ADR-5057 §4 first bullet,
|
|
4
|
+
* #2401): it returns a `GateResult`; the command router formats it. Imports no io module and
|
|
5
|
+
* performs no direct console/stdout/stderr write (ESLint-enforced).
|
|
6
|
+
*
|
|
7
|
+
* Probes every `<automated>` verify command declared in a phase's `-PLAN.md` files against the
|
|
8
|
+
* filesystem WITHOUT executing anything — see `verify-command-grounding.cts` for the recognizer
|
|
9
|
+
* contract.
|
|
10
|
+
*
|
|
11
|
+
* Argv after the verb: `<phase>` | `--dir <plan-dir>`.
|
|
12
|
+
*
|
|
13
|
+
* `--dir` (#4767) names a directory holding `-PLAN.md` files directly, for plans that live outside
|
|
14
|
+
* `.planning/phases/` (quick mode's `.planning/quick/<id>/`). It is resolved against the project
|
|
15
|
+
* root AND CONTAINED WITHIN IT — an absolute or climbing `--dir` that lands outside the root is
|
|
16
|
+
* `unresolvable`, never read — then probed exactly as a phase directory is; `projectRoot` stays the
|
|
17
|
+
* project root in both forms. `--dir <value>` is the only accepted spelling: `--dir=<value>`
|
|
18
|
+
* yields no `dir` flag and falls through to the no-argument arm, as does an empty value (both are
|
|
19
|
+
* `partitionPredicateArgs` behaviour, inherited and unchanged).
|
|
20
|
+
*
|
|
21
|
+
* When the phase cannot be resolved (or `--dir` escapes the root, or neither is given) the gate
|
|
22
|
+
* returns a non-throwing degraded payload (status/commands/counts zeroed, `readError` populated)
|
|
23
|
+
* rather than a usage failure — the plan-checker parses this result and must be able to tell
|
|
24
|
+
* "nothing to report" from "could not look", which a thrown error would collapse.
|
|
25
|
+
*
|
|
26
|
+
* Containment is decided on the resolved target (ADR-4650: the probe's reads follow symlinks).
|
|
27
|
+
* RESIDUAL, stated rather than left to be rediscovered: this is check-then-use, so a symlink
|
|
28
|
+
* planted at the resolved path BETWEEN the containment check and the reads inside the probe would
|
|
29
|
+
* be followed. A link already in place when the command runs IS refused. Closing the window needs
|
|
30
|
+
* O_NOFOLLOW/dirfd semantics inside the ADR-4650 predicate — a wider change than this gate.
|
|
31
|
+
*/
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.evaluateVerifyCommandPaths = evaluateVerifyCommandPaths;
|
|
34
|
+
const gate_verdict_cjs_1 = require("./gate-verdict.cjs");
|
|
35
|
+
const gate_args_cjs_1 = require("./gate-args.cjs");
|
|
36
|
+
const gate_phase_context_cjs_1 = require("./gate-phase-context.cjs");
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
38
|
+
const verifyCommandGroundingMod = require("./verify-command-grounding.cjs");
|
|
39
|
+
const { probePhaseVerifyCommands } = verifyCommandGroundingMod;
|
|
40
|
+
function evaluateVerifyCommandPaths(input) {
|
|
41
|
+
const { projectDir } = input;
|
|
42
|
+
const { flags, positionals } = (0, gate_args_cjs_1.partitionPredicateArgs)(input.args);
|
|
43
|
+
const dirFlag = typeof flags['dir'] === 'string' ? flags['dir'] : '';
|
|
44
|
+
// First non-flag positional: `--raw` (valueless) lands in positionals too, and its position
|
|
45
|
+
// relative to the phase argument is the caller's choice.
|
|
46
|
+
const phase = positionals.find(p => !p.startsWith('--')) ?? '';
|
|
47
|
+
if (!phase && !dirFlag) {
|
|
48
|
+
return (0, gate_phase_context_cjs_1.unresolvableProbeVerdict)('verify-command-paths requires a phase argument or --dir: check verify-command-paths <phase> | --dir <plan-dir>');
|
|
49
|
+
}
|
|
50
|
+
let phaseDir = '';
|
|
51
|
+
if (dirFlag) {
|
|
52
|
+
// `--dir` is CALLER-SUPPLIED: contain it before it reaches the reads in the probe. Read the
|
|
53
|
+
// value the predicate RETURNED; never re-derive the path. An escape degrades to the same
|
|
54
|
+
// non-throwing payload the unresolvable-phase arm emits.
|
|
55
|
+
const contained = (0, gate_phase_context_cjs_1.resolveContainedPath)(dirFlag, projectDir);
|
|
56
|
+
if ((0, gate_verdict_cjs_1.isGateUsageFailure)(contained)) {
|
|
57
|
+
return (0, gate_phase_context_cjs_1.unresolvableProbeVerdict)(`--dir resolves outside the project root: ${dirFlag}`);
|
|
58
|
+
}
|
|
59
|
+
phaseDir = contained;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const located = (0, gate_phase_context_cjs_1.resolvePhaseDir)(projectDir, phase);
|
|
63
|
+
if (located.kind === 'unreadable') {
|
|
64
|
+
return (0, gate_phase_context_cjs_1.unresolvableProbeVerdict)(`could not read the phase directory for phase ${phase}: ${located.reason}`);
|
|
65
|
+
}
|
|
66
|
+
if (located.kind === 'found')
|
|
67
|
+
phaseDir = located.value;
|
|
68
|
+
}
|
|
69
|
+
if (!phaseDir) {
|
|
70
|
+
return (0, gate_phase_context_cjs_1.unresolvableProbeVerdict)(`could not resolve phase directory for phase ${phase}`);
|
|
71
|
+
}
|
|
72
|
+
const probed = probePhaseVerifyCommands({ phaseDir, projectRoot: projectDir });
|
|
73
|
+
const blocked = probed.counts.blocker > 0;
|
|
74
|
+
// A probe that could not look (`unresolvable`) is `unreadable`: never a pass, exit UNAVAILABLE (#5170).
|
|
75
|
+
if (!blocked && probed.status === 'unresolvable')
|
|
76
|
+
return (0, gate_verdict_cjs_1.gateUnreadable)(false, { ...probed });
|
|
77
|
+
return (0, gate_verdict_cjs_1.gateVerdict)(blocked ? 'block' : 'pass', blocked, { ...probed });
|
|
78
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `check verify-failure-directions` as a gate module (#5139, epic #5056, ADR-5057 §4 first bullet,
|
|
4
|
+
* #3172): it returns a `GateResult`; the command router formats it. Imports no io module and
|
|
5
|
+
* performs no direct console/stdout/stderr write (ESLint-enforced).
|
|
6
|
+
*
|
|
7
|
+
* Probes every `<automated>` verify command declared in a phase's `-PLAN.md` files for a stated
|
|
8
|
+
* `<fails_when>` failing direction — see `verify-command-grounding.cts` for the recognizer
|
|
9
|
+
* contract.
|
|
10
|
+
*
|
|
11
|
+
* Argv after the verb: `<phase>`. When the phase is missing or cannot be resolved to a directory
|
|
12
|
+
* the gate returns a non-throwing degraded payload (status/commands/counts zeroed, `readError`
|
|
13
|
+
* populated) rather than a usage failure — the plan-checker parses this result and must be able to
|
|
14
|
+
* tell "nothing to report" from "could not look".
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.evaluateVerifyFailureDirections = evaluateVerifyFailureDirections;
|
|
18
|
+
const gate_verdict_cjs_1 = require("./gate-verdict.cjs");
|
|
19
|
+
const gate_phase_context_cjs_1 = require("./gate-phase-context.cjs");
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
21
|
+
const verifyCommandGroundingMod = require("./verify-command-grounding.cjs");
|
|
22
|
+
const { probePhaseFailingDirections } = verifyCommandGroundingMod;
|
|
23
|
+
function evaluateVerifyFailureDirections(input) {
|
|
24
|
+
const phase = input.args[0] || '';
|
|
25
|
+
if (!phase) {
|
|
26
|
+
return (0, gate_phase_context_cjs_1.unresolvableProbeVerdict)('verify-failure-directions requires a phase argument: check verify-failure-directions <phase>');
|
|
27
|
+
}
|
|
28
|
+
const located = (0, gate_phase_context_cjs_1.resolvePhaseDir)(input.projectDir, phase);
|
|
29
|
+
if (located.kind === 'unreadable') {
|
|
30
|
+
return (0, gate_phase_context_cjs_1.unresolvableProbeVerdict)(`could not read the phase directory for phase ${phase}: ${located.reason}`);
|
|
31
|
+
}
|
|
32
|
+
if (located.kind === 'none') {
|
|
33
|
+
return (0, gate_phase_context_cjs_1.unresolvableProbeVerdict)(`could not resolve phase directory for phase ${phase}`);
|
|
34
|
+
}
|
|
35
|
+
const probed = probePhaseFailingDirections({ phaseDir: located.value });
|
|
36
|
+
const blocked = probed.counts.blocker > 0;
|
|
37
|
+
// A probe that could not look (`unresolvable`) is `unreadable`: never a pass, exit UNAVAILABLE (#5170).
|
|
38
|
+
if (!blocked && probed.status === 'unresolvable')
|
|
39
|
+
return (0, gate_verdict_cjs_1.gateUnreadable)(false, { ...probed });
|
|
40
|
+
return (0, gate_verdict_cjs_1.gateVerdict)(blocked ? 'block' : 'pass', blocked, { ...probed });
|
|
41
|
+
}
|
|
@@ -445,14 +445,17 @@ function graphifyStatus(cwd) {
|
|
|
445
445
|
return disabledResponse();
|
|
446
446
|
const { graphPath, configured } = resolveGraphLocation(cwd, planningDir);
|
|
447
447
|
if (!node_fs_1.default.existsSync(graphPath)) {
|
|
448
|
-
return { exists: false, message: configured
|
|
448
|
+
return { exists: false, graph_path: graphPath, message: configured
|
|
449
449
|
? `Configured graph not found at ${graphPath}. Set graphify.graph_path or run /gsd:graphify build.`
|
|
450
450
|
: 'No graph built yet. Run graphify build to create one.' };
|
|
451
451
|
}
|
|
452
452
|
const stat = node_fs_1.default.statSync(graphPath);
|
|
453
453
|
const graph = safeReadJson(graphPath);
|
|
454
454
|
if (!graph) {
|
|
455
|
-
|
|
455
|
+
// Still surface graph_path (#4836 Minor 1): callers gate on `exists`, not
|
|
456
|
+
// on this outcome, so without it they'd fall through to the CLI-first
|
|
457
|
+
// branch with no --graph value to substitute for the <graph> placeholder.
|
|
458
|
+
return { error: 'Failed to parse graph.json', graph_path: graphPath };
|
|
456
459
|
}
|
|
457
460
|
const STALE_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
458
461
|
const age = Date.now() - stat.mtimeMs;
|
|
@@ -482,6 +485,11 @@ function graphifyStatus(cwd) {
|
|
|
482
485
|
(lastBuildAutoUpdate.status === 'failed' || lastBuildAutoUpdate.status === 'running');
|
|
483
486
|
return {
|
|
484
487
|
exists: true,
|
|
488
|
+
// The absolute location the whole graphify surface reads, already resolved
|
|
489
|
+
// through `graphify.graph_path` (#1825). Callers that shell out to the
|
|
490
|
+
// graphify CLI pass this as `--graph` so the umbrella override is honoured
|
|
491
|
+
// there too, instead of re-deriving `.planning/graphs/graph.json` (#4836).
|
|
492
|
+
graph_path: graphPath,
|
|
485
493
|
last_build: stat.mtime.toISOString(),
|
|
486
494
|
node_count: (graph.nodes || []).length,
|
|
487
495
|
edge_count: (graph.edges || graph.links || []).length,
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* ADR-3180 §8.2/§8.3/§8.5).
|
|
5
5
|
*
|
|
6
6
|
* Group: "Phase directory structure" (design doc, "Rule table organization"
|
|
7
|
-
* table) — W005, W023, I001, W009.
|
|
7
|
+
* table) — W005, W023, I001, W009, and W030 (#5118).
|
|
8
8
|
*
|
|
9
9
|
* Ported behavior-preserving from `cmdValidateHealth`
|
|
10
10
|
* (`src/verify.cts:1893-1990`, the exact call sites for W005/W023/I001/W009),
|
|
@@ -15,25 +15,14 @@
|
|
|
15
15
|
* phases.value[i]` exposes only `planCount`/`summaryCount`, not per-plan
|
|
16
16
|
* filenames) — this rule reports a coarser per-PHASE message instead.
|
|
17
17
|
* - W023's original "described" list called `determinePhaseStatus`
|
|
18
|
-
* (`commands.cts:154
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* `
|
|
23
|
-
*
|
|
24
|
-
* `
|
|
25
|
-
*
|
|
26
|
-
* `PhaseSnapshot.complete`/`verificationStatus` (`isPhaseComplete`'s own
|
|
27
|
-
* §7.4 disk-strict routing of the SAME `*-VERIFICATION.md` file) for the
|
|
28
|
-
* verification-gated branches. This is a disclosed fidelity reduction, not
|
|
29
|
-
* a byte-for-byte guarantee: `verificationStatus` is the DIFFERENT,
|
|
30
|
-
* `readVerificationStatus`-routed vocabulary ('passed'/'gaps_found'/
|
|
31
|
-
* 'human_needed'/'stale'/'unknown'/'missing') and can disagree with a raw
|
|
32
|
-
* frontmatter re-read in edge cases (e.g. a stale-but-frontmatter-"passed"
|
|
33
|
-
* VERIFICATION.md routes to 'stale', not 'passed', under §7.4's staleness
|
|
34
|
-
* handling — this rule reports 'Executed' there, not 'Complete'). No new
|
|
35
|
-
* ambient I/O and no new `PlanningSnapshot` field were needed — every input
|
|
36
|
-
* was already on `PhaseSnapshot`.
|
|
18
|
+
* (`commands.cts:154`, since deleted, #5060). The label now comes from the
|
|
19
|
+
* Phase Status Module's pure ladder (`phaseStatusFromFacts` +
|
|
20
|
+
* `toDisplayLabel`, `../phase-status.cjs`) over the same `PhaseSnapshot`
|
|
21
|
+
* facts this rule already had — `planCount`/`summaryCount`,
|
|
22
|
+
* `complete`/`verificationStatus` (`isPhaseComplete`'s §7.4 disk-strict
|
|
23
|
+
* routing of the SAME `*-VERIFICATION.md` file). §8.1 rule 1 (no ambient
|
|
24
|
+
* I/O in `check`) still holds: the module's ladder is a pure function of
|
|
25
|
+
* facts already on the snapshot, no new I/O or snapshot field is needed.
|
|
37
26
|
*
|
|
38
27
|
* W009's original message interpolates `${slash('plan-phase')}`
|
|
39
28
|
* (`verify.cts:1982`, ``Re-run ${slash('plan-phase')} with --research to
|
|
@@ -66,6 +55,8 @@ const { isPhaseDirName } = validateMod;
|
|
|
66
55
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
67
56
|
const phaseIdMod = require("../phase-id.cjs");
|
|
68
57
|
const { extractPhaseToken, normalizePhaseName, comparePhaseNum } = phaseIdMod;
|
|
58
|
+
// #5060: the Phase Status Module owns the status-label ladder.
|
|
59
|
+
const phase_status_cjs_1 = require("../phase-status.cjs");
|
|
69
60
|
// ─── W005 — phase directory doesn't follow NN-name format (verify.cts:1893-1902) ─
|
|
70
61
|
function checkW005(snapshot) {
|
|
71
62
|
const diagnostics = [];
|
|
@@ -89,31 +80,6 @@ function checkW005(snapshot) {
|
|
|
89
80
|
// `comparePhaseNum` + a `localeCompare` tiebreak, mirroring
|
|
90
81
|
// `verify.cts:1930-1932`'s deterministic-output rationale. See the file-level
|
|
91
82
|
// comment for the disclosed "described" fidelity reduction.
|
|
92
|
-
/**
|
|
93
|
-
* Reconstruct `commands.cts:154`'s `determinePhaseStatus` six-way label from
|
|
94
|
-
* fields `PhaseSnapshot` already exposes (no ambient I/O, no new snapshot
|
|
95
|
-
* field — see file-level comment). `complete`/`verificationStatus` come from
|
|
96
|
-
* `isPhaseComplete`'s §7.4 disk-strict routing of the same `*-VERIFICATION.md`
|
|
97
|
-
* file the original raw read targeted.
|
|
98
|
-
*/
|
|
99
|
-
function derivePhaseStatusLabel(planCount, summaryCount, complete, verificationStatus) {
|
|
100
|
-
if (planCount === 0)
|
|
101
|
-
return 'Not Started';
|
|
102
|
-
if (summaryCount < planCount && summaryCount > 0)
|
|
103
|
-
return 'In Progress';
|
|
104
|
-
if (summaryCount < planCount)
|
|
105
|
-
return 'Planned';
|
|
106
|
-
// summaryCount >= planCount > 0 — verification-gated, same as the original's
|
|
107
|
-
// post-count fall-through.
|
|
108
|
-
if (complete)
|
|
109
|
-
return 'Complete';
|
|
110
|
-
if (verificationStatus === 'human_needed')
|
|
111
|
-
return 'Needs Review';
|
|
112
|
-
// gaps_found / stale / missing / unknown all land here, same as the
|
|
113
|
-
// original's "verification exists but unrecognized" and "no verification
|
|
114
|
-
// file" branches both returning 'Executed'.
|
|
115
|
-
return 'Executed';
|
|
116
|
-
}
|
|
117
83
|
function checkW023(snapshot) {
|
|
118
84
|
const groups = new Map();
|
|
119
85
|
for (const name of snapshot.phaseDirs.value) {
|
|
@@ -138,8 +104,8 @@ function checkW023(snapshot) {
|
|
|
138
104
|
const plans = phase ? phase.planCount : 0;
|
|
139
105
|
const summaries = phase ? phase.summaryCount : 0;
|
|
140
106
|
const complete = phase ? phase.complete : false;
|
|
141
|
-
const verificationStatus = phase ? phase.verificationStatus :
|
|
142
|
-
const status =
|
|
107
|
+
const verificationStatus = phase ? phase.verificationStatus : null;
|
|
108
|
+
const status = (0, phase_status_cjs_1.toDisplayLabel)((0, phase_status_cjs_1.phaseStatusFromFacts)({ planCount: plans, summaryCount: summaries, complete, verificationStatus }), { pendingWord: 'Not Started' });
|
|
143
109
|
return `${d} (${status})`;
|
|
144
110
|
})
|
|
145
111
|
.join(', ');
|
|
@@ -194,6 +160,29 @@ function checkW009(snapshot) {
|
|
|
194
160
|
}
|
|
195
161
|
return diagnostics;
|
|
196
162
|
}
|
|
163
|
+
// ─── W030 — verification report status outside the closed set (#5118) ─────
|
|
164
|
+
//
|
|
165
|
+
// `isPhaseComplete` absorbs an out-of-set report `status` (its no-throw
|
|
166
|
+
// contract) and the snapshot carries the typed error's file and message. A
|
|
167
|
+
// diagnostics surface must survive the defect it diagnoses, so health reports
|
|
168
|
+
// the file instead of failing with `verification_status_invalid` like the
|
|
169
|
+
// query surfaces do: `validate health` (exit 0) lists each such report as one
|
|
170
|
+
// W030 finding, built from the error the snapshot carries.
|
|
171
|
+
function checkW030(snapshot) {
|
|
172
|
+
const diagnostics = [];
|
|
173
|
+
for (const phase of snapshot.phases.value) {
|
|
174
|
+
const invalid = phase.verificationStatusError;
|
|
175
|
+
if (!invalid)
|
|
176
|
+
continue;
|
|
177
|
+
diagnostics.push({
|
|
178
|
+
code: 'W030',
|
|
179
|
+
severity: SEVERITY.WARNING,
|
|
180
|
+
message: `Phase ${phase.dir}: ${invalid.message}`,
|
|
181
|
+
remedy: adviseRemedy('Set the report frontmatter `status` to one of passed | gaps_found | human_needed, or delete the report and re-run the phase verification'),
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
return diagnostics;
|
|
185
|
+
}
|
|
197
186
|
// ─── Exports ────────────────────────────────────────────────────────────────
|
|
198
187
|
const RULES = [
|
|
199
188
|
{
|
|
@@ -224,5 +213,12 @@ const RULES = [
|
|
|
224
213
|
repairable: false,
|
|
225
214
|
check: checkW009,
|
|
226
215
|
},
|
|
216
|
+
{
|
|
217
|
+
code: 'W030',
|
|
218
|
+
severity: SEVERITY.WARNING,
|
|
219
|
+
description: 'Phase verification report status is outside the closed set',
|
|
220
|
+
repairable: false,
|
|
221
|
+
check: checkW030,
|
|
222
|
+
},
|
|
227
223
|
];
|
|
228
224
|
module.exports = { RULES };
|
|
@@ -95,6 +95,10 @@ const RULES = [
|
|
|
95
95
|
*/
|
|
96
96
|
const CONSISTENCY_RULES = [
|
|
97
97
|
...roadmapDiskConsistencyMod.RULES.filter((r) => ['W006', 'W007'].includes(r.code)),
|
|
98
|
+
// #5118: W030 (a verification report status outside the closed set) is
|
|
99
|
+
// REUSED too — the snapshot carries the error, and a diagnostics surface
|
|
100
|
+
// reports it as a finding instead of failing on the defect it diagnoses.
|
|
101
|
+
...phaseStructureMod.RULES.filter((r) => r.code === 'W030'),
|
|
98
102
|
...consistencyMod.RULES,
|
|
99
103
|
];
|
|
100
104
|
// ─── Repair-handler runtime dependencies ───────────────────────────────────
|
|
@@ -112,7 +116,7 @@ const roadmapParserMod = require("./roadmap-parser.cjs");
|
|
|
112
116
|
const { getMilestoneInfo } = roadmapParserMod;
|
|
113
117
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
114
118
|
const stateMod = require("./state.cjs");
|
|
115
|
-
const { writeStateMd } = stateMod;
|
|
119
|
+
const { writeStateMd, assertVerificationReportsReadable } = stateMod;
|
|
116
120
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
117
121
|
const frontmatter = require("./frontmatter.cjs");
|
|
118
122
|
const { extractFrontmatter } = frontmatter;
|
|
@@ -149,7 +153,7 @@ function evaluateRules(snapshot) {
|
|
|
149
153
|
return evaluateRuleTable(RULES, snapshot);
|
|
150
154
|
}
|
|
151
155
|
/**
|
|
152
|
-
* Evaluate `CONSISTENCY_RULES` (W006/W007 + C001-C004) against `snapshot` —
|
|
156
|
+
* Evaluate `CONSISTENCY_RULES` (W006/W007/W030 + C001-C004) against `snapshot` —
|
|
153
157
|
* `validate.consistency`'s evaluator entry point, mirroring `evaluateRules`
|
|
154
158
|
* exactly but over the smaller, command-specific rule subset.
|
|
155
159
|
*/
|
|
@@ -258,12 +262,6 @@ function runRepairAction(cwd, action, paths) {
|
|
|
258
262
|
}
|
|
259
263
|
case REMEDY_ACTION.REGENERATE_STATE: {
|
|
260
264
|
const extraDetails = [];
|
|
261
|
-
if (node_fs_1.default.existsSync(statePath)) {
|
|
262
|
-
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
263
|
-
const backupPath = `${statePath}.bak-${timestamp}`;
|
|
264
|
-
node_fs_1.default.copyFileSync(statePath, backupPath);
|
|
265
|
-
extraDetails.push({ action: 'backupState', success: true, path: backupPath });
|
|
266
|
-
}
|
|
267
265
|
const milestone = getMilestoneInfo(cwd).value;
|
|
268
266
|
const projectRef = node_path_1.default
|
|
269
267
|
.relative(cwd, node_path_1.default.join(rootBase, 'PROJECT.md'))
|
|
@@ -286,6 +284,17 @@ function runRepairAction(cwd, action, paths) {
|
|
|
286
284
|
// STATE.md that had no parseable frontmatter — which is the usual
|
|
287
285
|
// reason this repair fires.
|
|
288
286
|
const priorState = node_fs_1.default.existsSync(statePath) ? ((0, shell_command_projection_cjs_1.platformReadSync)(statePath) ?? '') : '';
|
|
287
|
+
// #5118: the write below rebuilds the STATE frontmatter from every
|
|
288
|
+
// phase's report and throws on a `status` outside the closed set.
|
|
289
|
+
// `applyRepairs` validates ONCE, before the run's first write
|
|
290
|
+
// (`assertVerificationReportsReadable`), so this handler is only reached
|
|
291
|
+
// over readable reports and no earlier repair has written.
|
|
292
|
+
if (node_fs_1.default.existsSync(statePath)) {
|
|
293
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
294
|
+
const backupPath = `${statePath}.bak-${timestamp}`;
|
|
295
|
+
node_fs_1.default.copyFileSync(statePath, backupPath);
|
|
296
|
+
extraDetails.push({ action: 'backupState', success: true, path: backupPath });
|
|
297
|
+
}
|
|
289
298
|
writeStateMd(statePath, stateContent, rebuildStateTransaction({
|
|
290
299
|
snapshot: extractFrontmatter(priorState, statePath),
|
|
291
300
|
}), cwd);
|
|
@@ -381,6 +390,23 @@ function applyRepairs(cwd, diagnostics, repair, backfill) {
|
|
|
381
390
|
const refused = [];
|
|
382
391
|
const details = [];
|
|
383
392
|
const paths = repairPaths(cwd);
|
|
393
|
+
// #5118 (no write before the error): a requested REGENERATE_STATE rewrites
|
|
394
|
+
// STATE.md from every phase's report and throws on one whose `status` is
|
|
395
|
+
// outside the closed set — but other repairs in the SAME run (config,
|
|
396
|
+
// MILESTONES.md) may be ordered before it and would already have written.
|
|
397
|
+
// Validate once, before the run's first write; on a refusal no repair in the
|
|
398
|
+
// run is applied (each is reported failed — the dispatcher's exit-0 shape;
|
|
399
|
+
// the defect itself is W030) and the tree is untouched.
|
|
400
|
+
const regenerateRequested = repair && diagnostics.some((d) => d.remedy.action === REMEDY_ACTION.REGENERATE_STATE && d.remedy.risk !== REMEDY_RISK.DESTRUCTIVE);
|
|
401
|
+
let abortMessage = null;
|
|
402
|
+
if (regenerateRequested) {
|
|
403
|
+
try {
|
|
404
|
+
assertVerificationReportsReadable('', cwd);
|
|
405
|
+
}
|
|
406
|
+
catch (err) {
|
|
407
|
+
abortMessage = err instanceof Error ? err.message : String(err);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
384
410
|
for (const diagnostic of diagnostics) {
|
|
385
411
|
const { remedy, code } = diagnostic;
|
|
386
412
|
if (remedy.action === REMEDY_ACTION.ADVISE)
|
|
@@ -398,6 +424,17 @@ function applyRepairs(cwd, diagnostics, repair, backfill) {
|
|
|
398
424
|
});
|
|
399
425
|
continue;
|
|
400
426
|
}
|
|
427
|
+
if (abortMessage !== null) {
|
|
428
|
+
details.push({
|
|
429
|
+
code,
|
|
430
|
+
action: remedy.action,
|
|
431
|
+
success: false,
|
|
432
|
+
error: remedy.action === REMEDY_ACTION.REGENERATE_STATE
|
|
433
|
+
? abortMessage
|
|
434
|
+
: `not applied: the run stopped before its first write — ${abortMessage}`,
|
|
435
|
+
});
|
|
436
|
+
continue;
|
|
437
|
+
}
|
|
401
438
|
try {
|
|
402
439
|
const outcome = runRepairAction(cwd, remedy.action, paths);
|
|
403
440
|
if (outcome.extraDetails) {
|
|
@@ -24,6 +24,7 @@ exports.resolveReportedRuntime = resolveReportedRuntime;
|
|
|
24
24
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
25
25
|
const node_path_1 = __importDefault(require("node:path"));
|
|
26
26
|
const runtime_slash_cjs_1 = require("./runtime-slash.cjs");
|
|
27
|
+
const runtime_name_policy_cjs_1 = require("./runtime-name-policy.cjs");
|
|
27
28
|
const update_context_cjs_1 = require("./update-context.cjs");
|
|
28
29
|
Object.defineProperty(exports, "CODEX_CONFIG_MARKER", { enumerable: true, get: function () { return update_context_cjs_1.CODEX_CONFIG_MARKER; } });
|
|
29
30
|
// Codex sandbox env vars set by the shell tool / Seatbelt child-process spawn.
|
|
@@ -127,6 +128,14 @@ function resolveReportedRuntimeUnsafe(projectDir, deps) {
|
|
|
127
128
|
const explicit = (0, runtime_slash_cjs_1.resolveExplicitRuntime)(projectDir, deps?.env ?? process.env);
|
|
128
129
|
if (explicit)
|
|
129
130
|
return explicit;
|
|
131
|
+
// #4717: the per-install marker names the runtime that owns THIS tree — a
|
|
132
|
+
// stronger signal than host sniffing, which misreports every session on a
|
|
133
|
+
// multi-runtime machine (e.g. a globally exported CODEX_HOME makes a Claude
|
|
134
|
+
// Code session read as codex). Marker-less trees (dev/source, pre-#2297
|
|
135
|
+
// installs) fall through to host detection unchanged.
|
|
136
|
+
const marker = (0, runtime_name_policy_cjs_1.resolveRuntimeNameFromCandidates)((0, runtime_slash_cjs_1.readInstallRuntimeMarker)());
|
|
137
|
+
if (marker)
|
|
138
|
+
return marker;
|
|
130
139
|
const detected = detectHostRuntime(deps);
|
|
131
140
|
if (detected.runtime)
|
|
132
141
|
return detected.runtime;
|