@opengsd/gsd-core 1.11.0 → 1.12.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/agents/gsd-code-fixer.md +1 -1
- package/agents/gsd-debug-session-manager.md +1 -1
- package/agents/gsd-debugger.md +1 -1
- package/agents/gsd-dom-verifier.md +169 -0
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-executor.md +17 -9
- package/agents/gsd-framework-selector.md +1 -3
- package/agents/gsd-intel-updater.md +1 -1
- package/agents/gsd-mempalace-curator.md +0 -1
- package/agents/gsd-pattern-mapper.md +11 -0
- package/agents/gsd-phase-researcher.md +3 -1
- package/agents/gsd-plan-checker.md +15 -55
- package/agents/gsd-planner.md +6 -4
- package/agents/gsd-project-researcher.md +1 -1
- package/agents/gsd-research-synthesizer.md +2 -2
- package/agents/gsd-roadmapper.md +15 -11
- package/agents/gsd-ui-checker.md +63 -4
- package/agents/gsd-ui-researcher.md +41 -3
- package/agents/gsd-verifier.md +1 -1
- package/bin/install.js +609 -134
- package/commands/gsd/discuss-phase.md +1 -1
- package/commands/gsd/import.md +1 -1
- package/commands/gsd/quick.md +8 -4
- package/gsd-core/bin/gsd-tools.cjs +567 -51
- package/gsd-core/bin/lib/active-workstream-store.cjs +8 -0
- package/gsd-core/bin/lib/adr-parser.cjs +13 -7
- package/gsd-core/bin/lib/agent-install-check.cjs +162 -0
- package/gsd-core/bin/lib/api-coverage.cjs +30 -9
- package/gsd-core/bin/lib/artifacts.cjs +2 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +30 -11
- package/gsd-core/bin/lib/audit.cjs +163 -41
- package/gsd-core/bin/lib/broken-windows.cjs +306 -28
- package/gsd-core/bin/lib/capability-lock.cjs +10 -4
- package/gsd-core/bin/lib/capability-registry.cjs +336 -95
- package/gsd-core/bin/lib/capability-state.cjs +18 -3
- package/gsd-core/bin/lib/capability-validator.cjs +205 -18
- package/gsd-core/bin/lib/check-command-router.cjs +145 -5
- package/gsd-core/bin/lib/cli-exit.cjs +496 -10
- package/gsd-core/bin/lib/code-review-depth.cjs +288 -0
- package/gsd-core/bin/lib/codex-agent-toml.cjs +410 -4
- package/gsd-core/bin/lib/command-arg-projection.cjs +144 -14
- package/gsd-core/bin/lib/command-routing-hub.cjs +31 -2
- package/gsd-core/bin/lib/commands.cjs +543 -44
- package/gsd-core/bin/lib/complexity-trigger.cjs +26 -6
- package/gsd-core/bin/lib/config-loader.cjs +118 -29
- package/gsd-core/bin/lib/config.cjs +92 -2
- package/gsd-core/bin/lib/configuration.cjs +129 -37
- package/gsd-core/bin/lib/core-utils.cjs +84 -7
- package/gsd-core/bin/lib/edge-probe.cjs +9 -1
- package/gsd-core/bin/lib/estimate-cli.cjs +55 -11
- package/gsd-core/bin/lib/exit-code-registry.cjs +98 -0
- package/gsd-core/bin/lib/frontmatter.cjs +840 -305
- package/gsd-core/bin/lib/gap-checker.cjs +27 -3
- package/gsd-core/bin/lib/git-base-branch.cjs +174 -39
- package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +7 -3
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +6 -3
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +22 -8
- package/gsd-core/bin/lib/health-diagnostic.cjs +23 -3
- package/gsd-core/bin/lib/host-integration.cjs +39 -6
- package/gsd-core/bin/lib/init-command-router.cjs +118 -21
- package/gsd-core/bin/lib/init.cjs +120 -41
- package/gsd-core/bin/lib/install-engine.cjs +68 -3
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +33 -1
- package/gsd-core/bin/lib/install-profiles.cjs +78 -4
- package/gsd-core/bin/lib/installer-migration-report.cjs +3 -0
- package/gsd-core/bin/lib/installer-migrations/010-antigravity-retire-confighome-artifacts.cjs +169 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +10 -7
- package/gsd-core/bin/lib/intel.cjs +101 -26
- package/gsd-core/bin/lib/io.cjs +160 -15
- package/gsd-core/bin/lib/learnings.cjs +85 -14
- package/gsd-core/bin/lib/legacy-cleanup.cjs +8 -2
- package/gsd-core/bin/lib/markdown-table.cjs +52 -4
- package/gsd-core/bin/lib/milestone.cjs +90 -5
- package/gsd-core/bin/lib/model-catalog.cjs +177 -19
- package/gsd-core/bin/lib/model-resolver.cjs +10 -28
- package/gsd-core/bin/lib/onboard-projection.cjs +5 -1
- package/gsd-core/bin/lib/phase-estimation.cjs +17 -8
- package/gsd-core/bin/lib/phase-id.cjs +70 -4
- package/gsd-core/bin/lib/phase-lifecycle.cjs +24 -16
- package/gsd-core/bin/lib/phase-locator.cjs +138 -17
- package/gsd-core/bin/lib/phase.cjs +405 -84
- package/gsd-core/bin/lib/plan-document.cjs +263 -0
- package/gsd-core/bin/lib/plan-scan.cjs +13 -2
- package/gsd-core/bin/lib/planning-command-router.cjs +61 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +1168 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +18 -14
- package/gsd-core/bin/lib/planning-workspace.cjs +56 -0
- package/gsd-core/bin/lib/probe-core.cjs +4 -1
- package/gsd-core/bin/lib/profile-pipeline-command-router.cjs +50 -7
- package/gsd-core/bin/lib/profile-pipeline.cjs +6 -3
- package/gsd-core/bin/lib/real-home-guard.cjs +419 -0
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +71 -45
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +9 -9
- package/gsd-core/bin/lib/roadmap-command-router.cjs +45 -31
- package/gsd-core/bin/lib/roadmap-parser.cjs +79 -16
- package/gsd-core/bin/lib/roadmap.cjs +74 -19
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +96 -8
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +34 -1
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +287 -55
- package/gsd-core/bin/lib/runtime-identity.cjs +234 -0
- package/gsd-core/bin/lib/runtime-slash.cjs +72 -2
- package/gsd-core/bin/lib/shell-command-projection.cjs +71 -8
- package/gsd-core/bin/lib/smart-entry.cjs +12 -22
- package/gsd-core/bin/lib/spec-section.cjs +12 -7
- package/gsd-core/bin/lib/state-command-router.cjs +47 -18
- package/gsd-core/bin/lib/state-contract.cjs +359 -0
- package/gsd-core/bin/lib/state-document.cjs +186 -0
- package/gsd-core/bin/lib/state-md-schema.cjs +221 -0
- package/gsd-core/bin/lib/state-transition.cjs +517 -101
- package/gsd-core/bin/lib/state.cjs +946 -163
- package/gsd-core/bin/lib/surface.cjs +10 -2
- package/gsd-core/bin/lib/task-command-router.cjs +111 -1
- package/gsd-core/bin/lib/task-content-resolution.cjs +368 -0
- package/gsd-core/bin/lib/teams-status.cjs +4 -1
- package/gsd-core/bin/lib/uat-predicate.cjs +58 -20
- package/gsd-core/bin/lib/uat.cjs +1376 -125
- package/gsd-core/bin/lib/ui-consideration-probe.cjs +9 -1
- package/gsd-core/bin/lib/ui-safety-gate.cjs +37 -7
- package/gsd-core/bin/lib/unusable-input.cjs +13 -0
- package/gsd-core/bin/lib/validate-command-router.cjs +2 -2
- package/gsd-core/bin/lib/vendor/README.md +43 -5
- package/gsd-core/bin/lib/vendor/js-yaml.cjs +3014 -0
- package/gsd-core/bin/lib/verification.cjs +14 -1
- package/gsd-core/bin/lib/verify-command-grounding.cjs +846 -0
- package/gsd-core/bin/lib/verify.cjs +95 -40
- package/gsd-core/bin/lib/workstream-name-policy.cjs +25 -4
- package/gsd-core/bin/lib/worktree-base-ref.cjs +66 -12
- package/gsd-core/bin/lib/worktree-safety.cjs +177 -21
- package/gsd-core/bin/shared/config-defaults.manifest.json +7 -1
- package/gsd-core/bin/shared/config-schema.manifest.json +5 -0
- package/gsd-core/bin/shared/exit-codes.json +8 -0
- package/gsd-core/bin/shared/exit-codes.sh +20 -0
- package/gsd-core/bin/shared/model-catalog.json +8 -1
- package/gsd-core/references/agent-contracts.md +3 -2
- package/gsd-core/references/api-coverage.md +24 -2
- package/gsd-core/references/autonomous-smart-discuss.md +3 -3
- package/gsd-core/references/checkpoints.md +37 -19
- package/gsd-core/references/decimal-phase-calculation.md +5 -5
- package/gsd-core/references/edge-probe.md +8 -0
- package/gsd-core/references/execute-mvp-tdd.md +1 -3
- package/gsd-core/references/execute-phase-between-wave-reset.md +9 -12
- package/gsd-core/references/execute-phase-wave-guard.md +11 -9
- package/gsd-core/references/failing-direction.md +78 -0
- package/gsd-core/references/gate-prompts.md +1 -1
- package/gsd-core/references/git-integration.md +5 -5
- package/gsd-core/references/git-planning-commit.md +3 -3
- package/gsd-core/references/gsd-run-resolver.md +1 -1
- package/gsd-core/references/loop-hook-dispatch.md +22 -0
- package/gsd-core/references/model-profiles.md +1 -1
- package/gsd-core/references/nyquist-compliance.md +74 -0
- package/gsd-core/references/offer-next.md +3 -5
- package/gsd-core/references/phase-argument-parsing.md +3 -3
- package/gsd-core/references/planner-failing-direction.md +53 -0
- package/gsd-core/references/planner-human-verify-mode.md +15 -1
- package/gsd-core/references/planner-revision.md +1 -1
- package/gsd-core/references/planner-verify-command-grounding.md +17 -0
- package/gsd-core/references/planning-config.md +37 -8
- package/gsd-core/references/reviewer-instances.md +31 -0
- package/gsd-core/references/runtime-aware-dispatch.md +1 -1
- package/gsd-core/references/tdd.md +1 -3
- package/gsd-core/references/ui-brand.md +65 -21
- package/gsd-core/references/ui-consideration-probe.md +1 -1
- package/gsd-core/references/universal-anti-patterns.md +2 -2
- package/gsd-core/references/verify-command-path-resolvability.md +42 -0
- package/gsd-core/references/verify-mvp-mode.md +1 -1
- package/gsd-core/references/workstream-flag.md +11 -11
- package/gsd-core/templates/README.md +1 -1
- package/gsd-core/templates/SECURITY.md +3 -3
- package/gsd-core/templates/UI-SPEC.md +25 -3
- package/gsd-core/templates/VALIDATION.md +3 -3
- package/gsd-core/templates/phase-prompt.md +3 -0
- package/gsd-core/templates/state.md +7 -0
- 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 +3 -3
- package/gsd-core/workflows/add-tests.md +3 -8
- package/gsd-core/workflows/add-todo.md +1 -1
- package/gsd-core/workflows/ai-integration-phase.md +4 -9
- package/gsd-core/workflows/audit-fix.md +12 -3
- package/gsd-core/workflows/audit-milestone.md +9 -9
- package/gsd-core/workflows/audit-uat.md +17 -2
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +2 -2
- package/gsd-core/workflows/autonomous.md +10 -26
- package/gsd-core/workflows/check-todos.md +1 -1
- package/gsd-core/workflows/cleanup.md +2 -2
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +1 -1
- package/gsd-core/workflows/code-review-fix.md +1 -1
- package/gsd-core/workflows/code-review.md +121 -40
- package/gsd-core/workflows/complete-milestone.md +15 -10
- package/gsd-core/workflows/debug.md +5 -3
- package/gsd-core/workflows/diagnose-issues.md +12 -6
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/chain.md +3 -7
- package/gsd-core/workflows/discuss-phase/modes/text.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +1 -3
- package/gsd-core/workflows/discuss-phase-assumptions.md +2 -2
- package/gsd-core/workflows/discuss-phase.md +1 -1
- package/gsd-core/workflows/do.md +3 -6
- package/gsd-core/workflows/docs-update.md +5 -4
- package/gsd-core/workflows/edit-phase.md +1 -1
- package/gsd-core/workflows/eval-review.md +4 -9
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +113 -11
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +1 -1
- 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 +22 -4
- package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +2 -2
- package/gsd-core/workflows/execute-phase/steps/protected-branch.md +21 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +2 -2
- package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +39 -0
- package/gsd-core/workflows/execute-phase.md +38 -54
- package/gsd-core/workflows/execute-plan.md +17 -12
- package/gsd-core/workflows/explore.md +1 -1
- package/gsd-core/workflows/extract-learnings.md +1 -1
- package/gsd-core/workflows/fast.md +2 -2
- package/gsd-core/workflows/forensics.md +1 -1
- package/gsd-core/workflows/graduation.md +5 -5
- package/gsd-core/workflows/health.md +3 -6
- package/gsd-core/workflows/import.md +14 -11
- package/gsd-core/workflows/inbox.md +4 -5
- package/gsd-core/workflows/ingest-docs.md +44 -11
- package/gsd-core/workflows/insert-phase.md +5 -5
- package/gsd-core/workflows/list-seeds.md +5 -3
- package/gsd-core/workflows/list-workspaces.md +1 -1
- package/gsd-core/workflows/manager.md +12 -23
- package/gsd-core/workflows/map-codebase.md +1 -1
- package/gsd-core/workflows/milestone-summary.md +1 -1
- package/gsd-core/workflows/mvp-phase.md +2 -2
- package/gsd-core/workflows/new-milestone.md +9 -21
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +1 -1
- package/gsd-core/workflows/new-project.md +12 -26
- package/gsd-core/workflows/new-workspace.md +1 -1
- package/gsd-core/workflows/next.md +2 -2
- package/gsd-core/workflows/pause-work.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +2 -4
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +3 -3
- package/gsd-core/workflows/plan-phase.md +121 -42
- package/gsd-core/workflows/plan-review-convergence.md +46 -9
- package/gsd-core/workflows/plant-seed.md +2 -2
- package/gsd-core/workflows/pr-branch.md +187 -51
- package/gsd-core/workflows/profile-user.md +16 -14
- package/gsd-core/workflows/progress.md +27 -12
- package/gsd-core/workflows/quick/steps/discussion-phase.md +1 -3
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +1 -3
- package/gsd-core/workflows/quick/steps/quick-verification.md +2 -4
- package/gsd-core/workflows/quick/steps/research-phase.md +2 -4
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +3 -3
- package/gsd-core/workflows/quick.md +20 -29
- package/gsd-core/workflows/remove-phase.md +4 -4
- package/gsd-core/workflows/remove-workspace.md +2 -2
- package/gsd-core/workflows/resume-project.md +8 -12
- package/gsd-core/workflows/review.md +193 -15
- package/gsd-core/workflows/scan.md +1 -1
- package/gsd-core/workflows/secure-phase.md +2 -2
- package/gsd-core/workflows/settings-advanced.md +7 -9
- package/gsd-core/workflows/settings-integrations.md +64 -31
- package/gsd-core/workflows/settings.md +3 -5
- package/gsd-core/workflows/ship.md +12 -6
- package/gsd-core/workflows/sketch-wrap-up.md +11 -17
- package/gsd-core/workflows/sketch.md +12 -18
- package/gsd-core/workflows/smart-entry.md +3 -5
- package/gsd-core/workflows/spec-phase.md +23 -1
- package/gsd-core/workflows/spike-wrap-up.md +7 -11
- package/gsd-core/workflows/spike.md +20 -31
- package/gsd-core/workflows/stats.md +2 -2
- package/gsd-core/workflows/sync-skills.md +1 -1
- package/gsd-core/workflows/thread.md +11 -7
- package/gsd-core/workflows/transition.md +5 -5
- package/gsd-core/workflows/ui-phase.md +10 -16
- package/gsd-core/workflows/ui-review.md +6 -10
- package/gsd-core/workflows/ultraplan-phase.md +5 -13
- package/gsd-core/workflows/undo.md +8 -16
- package/gsd-core/workflows/update.md +6 -10
- package/gsd-core/workflows/validate-phase.md +2 -2
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +25 -1
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +1 -1
- package/gsd-core/workflows/verify-work.md +57 -18
- package/hooks/dist/gsd-agent-isolation-guard.js +77 -38
- package/hooks/dist/gsd-config-reload.js +18 -12
- package/hooks/dist/gsd-context-monitor.js +19 -10
- package/hooks/dist/gsd-cursor-post-tool.js +3 -1
- package/hooks/dist/gsd-cursor-pre-tool.js +3 -1
- package/hooks/dist/gsd-cursor-session-start.js +2 -1
- package/hooks/dist/gsd-cursor-stop.js +2 -1
- package/hooks/dist/gsd-cursor-subagent-start.js +28 -23
- package/hooks/dist/gsd-cursor-subagent-stop.js +3 -1
- package/hooks/dist/gsd-ensure-canonical-path.js +2 -1
- package/hooks/dist/gsd-graphify-update.sh +22 -18
- package/hooks/dist/gsd-node-runner.sh +76 -0
- package/hooks/dist/gsd-phase-boundary.sh +1 -0
- package/hooks/dist/gsd-prompt-guard.js +16 -7
- package/hooks/dist/gsd-read-guard.js +16 -7
- package/hooks/dist/gsd-read-injection-scanner.js +17 -8
- package/hooks/dist/gsd-session-state.sh +1 -0
- package/hooks/dist/gsd-statusline.js +215 -26
- package/hooks/dist/gsd-validate-commit.sh +80 -6
- package/hooks/dist/gsd-windsurf-pre-command.js +16 -11
- package/hooks/dist/gsd-windsurf-pre-write.js +22 -13
- package/hooks/dist/gsd-workflow-guard.js +34 -16
- package/hooks/dist/gsd-worktree-path-guard.js +36 -21
- package/hooks/dist/gsd-write-guard.js +35 -25
- package/hooks/dist/lib/cli-exit.js +560 -0
- package/hooks/dist/lib/exit-code-registry.js +98 -0
- package/hooks/dist/lib/git-probe.js +84 -0
- package/hooks/dist/lib/hook-exit.js +81 -0
- package/hooks/dist/managed-hooks-registry.cjs +3 -0
- package/hooks/gsd-agent-isolation-guard.js +77 -38
- package/hooks/gsd-config-reload.js +18 -12
- package/hooks/gsd-context-monitor.js +19 -10
- package/hooks/gsd-cursor-post-tool.js +3 -1
- package/hooks/gsd-cursor-pre-tool.js +3 -1
- package/hooks/gsd-cursor-session-start.js +2 -1
- package/hooks/gsd-cursor-stop.js +2 -1
- package/hooks/gsd-cursor-subagent-start.js +28 -23
- package/hooks/gsd-cursor-subagent-stop.js +3 -1
- package/hooks/gsd-ensure-canonical-path.js +2 -1
- package/hooks/gsd-graphify-update.sh +22 -18
- package/hooks/gsd-node-runner.sh +76 -0
- package/hooks/gsd-phase-boundary.sh +1 -0
- package/hooks/gsd-prompt-guard.js +16 -7
- package/hooks/gsd-read-guard.js +16 -7
- package/hooks/gsd-read-injection-scanner.js +17 -8
- package/hooks/gsd-session-state.sh +1 -0
- package/hooks/gsd-statusline.js +215 -26
- package/hooks/gsd-validate-commit.sh +80 -6
- package/hooks/gsd-windsurf-pre-command.js +16 -11
- package/hooks/gsd-windsurf-pre-write.js +22 -13
- package/hooks/gsd-workflow-guard.js +34 -16
- package/hooks/gsd-worktree-path-guard.js +36 -21
- package/hooks/gsd-write-guard.js +35 -25
- package/hooks/lib/cli-exit.js +560 -0
- package/hooks/lib/exit-code-registry.js +98 -0
- package/hooks/lib/git-probe.js +84 -0
- package/hooks/lib/hook-exit.js +81 -0
- package/hooks/managed-hooks-registry.cjs +3 -0
- package/package.json +12 -7
- package/scripts/base64-scan.sh +74 -12
- package/scripts/build-hooks.js +5 -0
- package/scripts/check-glossary-refs.cjs +77 -15
- package/scripts/check-mutation-score-ratchet.cjs +156 -0
- package/scripts/ci-check-job-near-cap.cjs +49 -0
- package/scripts/ci-pr-mergeability.cjs +262 -0
- package/scripts/ci-test-scope.cjs +45 -12
- package/scripts/ci-timeout-report.cjs +230 -0
- package/scripts/docs-guard-registry.cjs +396 -0
- package/scripts/gen-capability-registry.cjs +8 -6
- package/scripts/gen-exit-code-docs.cjs +318 -0
- package/scripts/gen-exit-code-registry.cjs +891 -0
- package/scripts/gen-features.cjs +836 -0
- package/scripts/gen-hooks-cli-exit.cjs +239 -0
- package/scripts/gen-install-tree-fixtures.cjs +2 -2
- package/scripts/gen-loop-host-contract.cjs +134 -1
- package/scripts/gen-scripts-cli-exit.cjs +185 -0
- package/scripts/gen-state-md-docs.cjs +727 -0
- package/scripts/{test-failure-reasons.cjs → gsd-test-gate-reasons.cjs} +6 -0
- package/scripts/lib/ci-job-timing.cjs +72 -0
- package/scripts/lib/cli-exit.cjs +546 -44
- package/scripts/lib/drift-scan.cjs +32 -2
- package/scripts/lib/exit-code-registry.cjs +98 -0
- package/scripts/lib/ndjson-reporter.cjs +119 -0
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
- package/scripts/lint-docs-guard-registration.cjs +495 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +193 -0
- package/scripts/lint-eslint-glob-coverage.allowlist.json +4 -0
- package/scripts/{lint-fix-has-regression-test.cjs → lint-fix-has-regression-tests.cjs} +12 -6
- package/scripts/lint-health-diagnostic-rule-table.cjs +65 -8
- package/scripts/lint-mutation-test-derivation-drift.cjs +86 -0
- package/scripts/lint-phase-enumeration-drift.cjs +21 -8
- package/scripts/lint-planning-prompt-drift.cjs +38 -1
- package/scripts/lint-removed-but-needed.cjs +184 -16
- package/scripts/lint-seam-enforcement.cjs +182 -0
- package/scripts/lint-slug-derivation-drift.cjs +921 -0
- package/scripts/lint-source-test-name-collision.cjs +241 -0
- package/scripts/lint-state-write-path-drift.cjs +337 -432
- package/scripts/lint-test-file-count.allowlist.json +122 -4
- package/scripts/lint-test-file-count.cjs +25 -3
- package/scripts/lint-unreachable-guard-drift.cjs +51 -64
- package/scripts/lint-vendored-deps.cjs +208 -35
- package/scripts/mutation-matrix.cjs +599 -50
- package/scripts/prompt-injection-scan.sh +75 -14
- package/scripts/secret-scan.sh +75 -13
- package/scripts/select-docs-guards.cjs +56 -0
- package/scripts/sync-runtime-launcher.cjs +22 -3
- package/skills/gsd-discuss-phase/SKILL.md +1 -1
- package/skills/gsd-import/SKILL.md +1 -1
- package/skills/gsd-quick/SKILL.md +8 -4
- package/vscode/package.json +1 -1
- package/bin/lib/ui-safety-gate.cjs +0 -109
- package/scripts/lint-emitted-drift-ack.cjs +0 -344
- package/scripts/state-write-path-drift-baseline.json +0 -19
|
@@ -29,7 +29,7 @@ const roadmapParserMod = require("./roadmap-parser.cjs");
|
|
|
29
29
|
const { getMilestoneInfo, extractCurrentMilestone } = roadmapParserMod;
|
|
30
30
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
31
31
|
const phaseLocatorMod = require("./phase-locator.cjs");
|
|
32
|
-
const { listMilestonePhaseDirs } = phaseLocatorMod;
|
|
32
|
+
const { listMilestonePhaseDirs, listAllPhaseDirs } = phaseLocatorMod;
|
|
33
33
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
34
34
|
const verificationMod = require("./verification.cjs");
|
|
35
35
|
const { isPhaseComplete } = verificationMod;
|
|
@@ -666,21 +666,25 @@ function buildPlanningRootFilesField(cwd) {
|
|
|
666
666
|
* `phaseDirs` cannot). An absent `phases/` root is a real empty, not a
|
|
667
667
|
* failure (mirrors `listMilestonePhaseDirs`'s own treatment); a present but
|
|
668
668
|
* unreadable root degrades to `UNREADABLE` with an empty list.
|
|
669
|
+
*
|
|
670
|
+
* #3882 (ADR-3473 §8.3): delegates the actual disk scan to
|
|
671
|
+
* `listAllPhaseDirs(phasesDir, {includeSentinels: true})` — that function is
|
|
672
|
+
* the sole owner of "readdirSync the phases/ root, map to dir names, handle
|
|
673
|
+
* absent-vs-unreadable"; this field is one more consumer of that scan, not a
|
|
674
|
+
* second implementation of it. The two functions previously duplicated the
|
|
675
|
+
* same readdirSync + filter + map + absent/unreadable handling, which is
|
|
676
|
+
* exactly the defect class ADR-3473 §8.3 forbids.
|
|
677
|
+
*
|
|
678
|
+
* The RE-SORT below is deliberate, not leftover duplication:
|
|
679
|
+
* `listAllPhaseDirs` orders its `value` by `comparePhaseNum` (numeric phase
|
|
680
|
+
* order — its own documented contract), but `allPhaseDirNames`'s existing,
|
|
681
|
+
* externally-observable order is plain lexicographic `.sort()`, and W007's
|
|
682
|
+
* consumers depend on that order today. Re-sorting here preserves that
|
|
683
|
+
* contract without forking the underlying scan.
|
|
669
684
|
*/
|
|
670
685
|
function buildAllPhaseDirNamesField(phasesDir) {
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
try {
|
|
674
|
-
const value = node_fs_1.default
|
|
675
|
-
.readdirSync(phasesDir, { withFileTypes: true })
|
|
676
|
-
.filter((e) => e.isDirectory())
|
|
677
|
-
.map((e) => e.name)
|
|
678
|
-
.sort();
|
|
679
|
-
return { value, scope: SCOPE.COMPLETE };
|
|
680
|
-
}
|
|
681
|
-
catch {
|
|
682
|
-
return { value: [], scope: SCOPE.UNREADABLE };
|
|
683
|
-
}
|
|
686
|
+
const { value, scope } = listAllPhaseDirs(phasesDir, { includeSentinels: true });
|
|
687
|
+
return { value: value.slice().sort(), scope };
|
|
684
688
|
}
|
|
685
689
|
/**
|
|
686
690
|
* Resolve `archivedPhaseTokens` — every phase-number token belonging to a
|
|
@@ -120,6 +120,61 @@ function planningDir(cwd, ws, project) {
|
|
|
120
120
|
function planningRoot(cwd) {
|
|
121
121
|
return node_path_1.default.join(cwd, '.planning');
|
|
122
122
|
}
|
|
123
|
+
/**
|
|
124
|
+
* #3972: the ONE owner of "is this planning scope opted out of worktrees?" —
|
|
125
|
+
* the effective `workflow.use_worktrees === false` read every
|
|
126
|
+
* isolation-deciding surface must share (config-get's merged view is the
|
|
127
|
+
* contract). Ladder: the scoped config's OWN key wins (planningDir is
|
|
128
|
+
* project- and workstream-aware); otherwise the flat root's key, but only
|
|
129
|
+
* under the GSD_WORKSTREAM env gate — config-get deliberately does NOT
|
|
130
|
+
* inherit root under GSD_PROJECT alone, and this read must not diverge
|
|
131
|
+
* (#3963). Strict `=== false` (never coerced); any read failure degrades to
|
|
132
|
+
* "not opted out" (worktrees on — the fail-safe direction: the guard keeps
|
|
133
|
+
* enforcing). Direct file reads only — never loadConfig, which normalizes
|
|
134
|
+
* and rewrites config on paths that back sentinel writes.
|
|
135
|
+
*/
|
|
136
|
+
function worktreesOptedOut(cwd) {
|
|
137
|
+
// #3972 review: the WHOLE body is guarded — planningDir/planningRoot
|
|
138
|
+
// themselves throw on a GSD_PROJECT/GSD_WORKSTREAM value containing path
|
|
139
|
+
// separators or `..`, and this contract ("any failure degrades to not
|
|
140
|
+
// opted out — worktrees on, keep enforcing") must hold for that shape too.
|
|
141
|
+
try {
|
|
142
|
+
return worktreesOptedOutUnguarded(cwd);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function worktreesOptedOutUnguarded(cwd) {
|
|
149
|
+
const readCfg = (p) => {
|
|
150
|
+
try {
|
|
151
|
+
return JSON.parse(String(node_fs_1.default.readFileSync(p, 'utf8')));
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
const ownKey = (cfg) => {
|
|
158
|
+
if (cfg === null || typeof cfg !== 'object')
|
|
159
|
+
return { present: false, value: undefined };
|
|
160
|
+
const wf = cfg.workflow;
|
|
161
|
+
if (wf === null || typeof wf !== 'object' || Array.isArray(wf))
|
|
162
|
+
return { present: false, value: undefined };
|
|
163
|
+
const wfRec = wf;
|
|
164
|
+
return Object.prototype.hasOwnProperty.call(wfRec, 'use_worktrees')
|
|
165
|
+
? { present: true, value: wfRec['use_worktrees'] }
|
|
166
|
+
: { present: false, value: undefined };
|
|
167
|
+
};
|
|
168
|
+
const scoped = ownKey(readCfg(node_path_1.default.join(planningDir(cwd), 'config.json')));
|
|
169
|
+
if (scoped.present)
|
|
170
|
+
return scoped.value === false;
|
|
171
|
+
if (process.env['GSD_WORKSTREAM']) {
|
|
172
|
+
const root = ownKey(readCfg(node_path_1.default.join(planningRoot(cwd), 'config.json')));
|
|
173
|
+
if (root.present)
|
|
174
|
+
return root.value === false;
|
|
175
|
+
}
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
123
178
|
// Sorted list of workstream directory names under `<root>/.planning/workstreams`,
|
|
124
179
|
// or `[]` when the project is flat (no workstreams dir). Single source of truth
|
|
125
180
|
// for the "workstream mode" detection shared by the #1912/#2028 fail-safe guards
|
|
@@ -431,6 +486,7 @@ function findContextMdIn(absDirOrFiles) {
|
|
|
431
486
|
}
|
|
432
487
|
}
|
|
433
488
|
module.exports = {
|
|
489
|
+
worktreesOptedOut,
|
|
434
490
|
createPlanningWorkspace,
|
|
435
491
|
createSharedPointerAdapter,
|
|
436
492
|
createSessionScopedPointerAdapter,
|
|
@@ -43,6 +43,9 @@ exports.projectTruths = projectTruths;
|
|
|
43
43
|
exports.dispositionForUnverifiableTruth = dispositionForUnverifiableTruth;
|
|
44
44
|
exports.runProbeCli = runProbeCli;
|
|
45
45
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
47
|
+
const cliExitModule = require("./cli-exit.cjs");
|
|
48
|
+
const { ExitError } = cliExitModule;
|
|
46
49
|
/** The LOCKED set of valid lifecycle statuses (the re-cut: no covered/backstop). */
|
|
47
50
|
exports.VALID_STATUS = ['resolved', 'dismissed', 'unresolved'];
|
|
48
51
|
function errMessage(e) {
|
|
@@ -497,7 +500,7 @@ function runProbeCli(analyze, options) {
|
|
|
497
500
|
const readFile = options.readFile ?? ((p) => node_fs_1.default.readFileSync(p, 'utf8'));
|
|
498
501
|
const write = options.write ?? ((s) => { process.stdout.write(s); });
|
|
499
502
|
const writeErr = options.writeErr ?? ((s) => { process.stderr.write(s); });
|
|
500
|
-
const exit = options.exit ?? ((code) => {
|
|
503
|
+
const exit = options.exit ?? ((code) => { throw new ExitError(code); });
|
|
501
504
|
const reqPath = argv[2];
|
|
502
505
|
const resPath = argv[3];
|
|
503
506
|
if (!reqPath) {
|
|
@@ -13,12 +13,55 @@
|
|
|
13
13
|
* Async note: cmdExtractMessages and cmdProfileSample are async functions.
|
|
14
14
|
* dispatchCapabilityCommand (gsd-tools.cjs:366-371) explicitly errors if a
|
|
15
15
|
* router returns a Promise. Therefore these router functions call the async
|
|
16
|
-
* function WITHOUT await and WITHOUT returning the Promise
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
16
|
+
* function WITHOUT await and WITHOUT returning the Promise; the event loop
|
|
17
|
+
* drains once the returned promise settles. Since ADR-3889 (#3910), the
|
|
18
|
+
* pipeline functions terminate by THROWING ExitError (never process.exit()
|
|
19
|
+
* directly), so a rejection surfacing here can carry either a genuine error
|
|
20
|
+
* OR a declared ExitError termination — the `.catch()` below must
|
|
21
|
+
* distinguish them: an ExitError sets process.exitCode directly (mirroring
|
|
22
|
+
* cli-exit.cjs's own runMain, the only other place ExitError is caught),
|
|
23
|
+
* while any other rejection is surfaced via the `error()` callback exactly
|
|
24
|
+
* as before. Calling `error(exitErr.message)` for an ExitError would be
|
|
25
|
+
* wrong on two counts: it discards the real exit code (error() always
|
|
26
|
+
* terminates at 1) and it re-derives a message from ExitError's generic
|
|
27
|
+
* "process exit N" constructor default rather than the (already emitted, or
|
|
28
|
+
* intentionally absent) stderr output the throwing call site controls.
|
|
20
29
|
*/
|
|
21
|
-
const { ERROR_REASON } = require('./io.cjs');
|
|
30
|
+
const { ERROR_REASON, getJsonErrorMode } = require('./io.cjs');
|
|
31
|
+
const { ExitError } = require('./cli-exit.cjs');
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Interpret a rejection from a fire-and-forget async pipeline call: an
|
|
35
|
+
* ExitError sets process.exitCode (and, for a non-zero code carrying a user
|
|
36
|
+
* message, writes it to stderr) exactly like runMain does; anything else
|
|
37
|
+
* reproduces io.cjs's error() stderr output byte-for-byte and sets
|
|
38
|
+
* process.exitCode directly instead of calling error() itself.
|
|
39
|
+
*
|
|
40
|
+
* error() (src/io.cts) is `never`-typed: it always throws ExitError(1) after
|
|
41
|
+
* writing to stderr. Calling it from inside this `.catch()` callback would
|
|
42
|
+
* throw from a detached promise chain that nothing awaits or re-catches —
|
|
43
|
+
* an unhandled promise rejection that Node (>=15, this repo's
|
|
44
|
+
* engines.node >= 24 default is --unhandled-rejections=throw) dumps as a
|
|
45
|
+
* raw stack trace on top of the clean line error() already wrote. Writing
|
|
46
|
+
* the same bytes directly and setting process.exitCode = 1 in place gets
|
|
47
|
+
* the identical observable stderr + exit code without ever throwing here.
|
|
48
|
+
*/
|
|
49
|
+
function _handlePipelineRejection(e, error) {
|
|
50
|
+
void error;
|
|
51
|
+
if (e instanceof ExitError) {
|
|
52
|
+
if (e.hasUserMessage && e.code !== 0) process.stderr.write(`${e.message}\n`);
|
|
53
|
+
process.exitCode = e.code;
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const message = e && e.message ? e.message : String(e);
|
|
57
|
+
if (getJsonErrorMode()) {
|
|
58
|
+
const payload = JSON.stringify({ ok: false, reason: ERROR_REASON.UNKNOWN, message }) + '\n';
|
|
59
|
+
process.stderr.write(payload);
|
|
60
|
+
} else {
|
|
61
|
+
process.stderr.write('Error: ' + message + '\n');
|
|
62
|
+
}
|
|
63
|
+
process.exitCode = 1;
|
|
64
|
+
}
|
|
22
65
|
|
|
23
66
|
// ─── Pipeline phase commands ───────────────────────────────────────────────────
|
|
24
67
|
|
|
@@ -51,7 +94,7 @@ function routeExtractMessages({ args, cwd, raw, error, _pipeline }) {
|
|
|
51
94
|
// The function ends with output() or process.exit(); the event loop will drain.
|
|
52
95
|
void cwd;
|
|
53
96
|
p.cmdExtractMessages(projectArg, { sessionId, limit }, raw, sessionsPath)
|
|
54
|
-
.catch(e => {
|
|
97
|
+
.catch(e => { _handlePipelineRejection(e, error); });
|
|
55
98
|
}
|
|
56
99
|
|
|
57
100
|
function routeProfileSample({ args, cwd, raw, error, _pipeline }) {
|
|
@@ -67,7 +110,7 @@ function routeProfileSample({ args, cwd, raw, error, _pipeline }) {
|
|
|
67
110
|
const maxChars = maxCharsIdx !== -1 ? parseInt(args[maxCharsIdx + 1], 10) : 500;
|
|
68
111
|
// cmdProfileSample is async — do NOT return the Promise.
|
|
69
112
|
p.cmdProfileSample(sessionsPath, { limit, maxPerProject, maxChars }, raw)
|
|
70
|
-
.catch(e => {
|
|
113
|
+
.catch(e => { _handlePipelineRejection(e, error); });
|
|
71
114
|
}
|
|
72
115
|
|
|
73
116
|
// ─── Output phase commands ─────────────────────────────────────────────────────
|
|
@@ -22,6 +22,9 @@ const node_readline_1 = __importDefault(require("node:readline"));
|
|
|
22
22
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
23
23
|
const ioModule = require("./io.cjs");
|
|
24
24
|
const { output, error, reapStaleTempFiles, ensureGsdTempDir, GSD_TEMP_DIR } = ioModule;
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
26
|
+
const cliExitModule = require("./cli-exit.cjs");
|
|
27
|
+
const { ExitError } = cliExitModule;
|
|
25
28
|
// ─── Session I/O Helpers ──────────────────────────────────────────────────────
|
|
26
29
|
function getSessionsDir(overridePath) {
|
|
27
30
|
const dir = overridePath || node_path_1.default.join(node_os_1.default.homedir(), '.claude', 'projects');
|
|
@@ -250,7 +253,7 @@ function cmdScanSessions(overridePath, options, raw) {
|
|
|
250
253
|
}
|
|
251
254
|
}
|
|
252
255
|
process.stdout.write(`\nTotal: ${projects.length} projects\n`);
|
|
253
|
-
|
|
256
|
+
throw new ExitError(0);
|
|
254
257
|
}
|
|
255
258
|
}
|
|
256
259
|
async function cmdExtractMessages(projectArg, options, raw, overridePath) {
|
|
@@ -376,11 +379,11 @@ async function cmdExtractMessages(projectArg, options, raw, overridePath) {
|
|
|
376
379
|
};
|
|
377
380
|
if (sessionsSkipped > 0 && sessionsProcessed > 0) {
|
|
378
381
|
process.stdout.write(JSON.stringify(result, null, 2));
|
|
379
|
-
|
|
382
|
+
throw new ExitError(2);
|
|
380
383
|
}
|
|
381
384
|
else if (sessionsProcessed === 0 && sessionsSkipped > 0) {
|
|
382
385
|
process.stdout.write(JSON.stringify(result, null, 2));
|
|
383
|
-
|
|
386
|
+
throw new ExitError(1);
|
|
384
387
|
}
|
|
385
388
|
else {
|
|
386
389
|
output(result, raw, undefined);
|