@opengsd/gsd-core 1.10.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 +12 -1
- package/agents/gsd-debugger.md +1 -1
- package/agents/gsd-doc-synthesizer.md +2 -4
- package/agents/gsd-dom-verifier.md +169 -0
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-executor.md +22 -14
- package/agents/gsd-framework-selector.md +1 -3
- package/agents/gsd-intel-updater.md +1 -1
- package/agents/gsd-mempalace-curator.md +5 -3
- package/agents/gsd-pattern-mapper.md +11 -0
- package/agents/gsd-phase-researcher.md +23 -2
- package/agents/gsd-plan-checker.md +50 -53
- package/agents/gsd-planner.md +50 -50
- 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-user-profiler.md +3 -0
- package/agents/gsd-verifier.md +13 -4
- package/bin/install.js +1448 -1103
- package/commands/gsd/code-review.md +1 -1
- package/commands/gsd/discuss-phase.md +1 -1
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/import.md +1 -1
- package/commands/gsd/map-codebase.md +1 -1
- package/commands/gsd/mempalace-capture.md +1 -1
- package/commands/gsd/mempalace-recall.md +1 -1
- package/commands/gsd/new-milestone.md +1 -1
- package/commands/gsd/quick.md +9 -5
- package/commands/gsd/review-backlog.md +2 -1
- package/commands/gsd/verify-work.md +1 -1
- package/gsd-core/bin/gsd-tools.cjs +1035 -138
- package/gsd-core/bin/lib/active-workstream-store.cjs +146 -22
- package/gsd-core/bin/lib/adr-parser.cjs +13 -7
- package/gsd-core/bin/lib/agent-install-check.cjs +392 -32
- package/gsd-core/bin/lib/api-coverage.cjs +33 -14
- package/gsd-core/bin/lib/artifacts.cjs +5 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +32 -15
- package/gsd-core/bin/lib/audit-command-router.cjs +9 -2
- package/gsd-core/bin/lib/audit.cjs +1026 -268
- package/gsd-core/bin/lib/broken-windows.cjs +306 -28
- package/gsd-core/bin/lib/capability-consent.cjs +149 -15
- package/gsd-core/bin/lib/capability-lifecycle.cjs +45 -0
- package/gsd-core/bin/lib/capability-lock.cjs +10 -4
- package/gsd-core/bin/lib/capability-registry.cjs +845 -130
- package/gsd-core/bin/lib/capability-source.cjs +92 -0
- package/gsd-core/bin/lib/capability-state.cjs +18 -3
- package/gsd-core/bin/lib/capability-trust.cjs +444 -25
- package/gsd-core/bin/lib/capability-validator.cjs +700 -40
- package/gsd-core/bin/lib/capability-writer.cjs +3 -2
- package/gsd-core/bin/lib/check-command-router.cjs +216 -42
- package/gsd-core/bin/lib/claude-orchestration.cjs +56 -3
- 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 +735 -0
- package/gsd-core/bin/lib/command-aliases.cjs +22 -0
- package/gsd-core/bin/lib/command-arg-projection.cjs +144 -14
- package/gsd-core/bin/lib/command-roster.cjs +44 -1
- package/gsd-core/bin/lib/command-routing-hub.cjs +31 -2
- package/gsd-core/bin/lib/commands.cjs +1172 -108
- package/gsd-core/bin/lib/commonjs-marker.cjs +12 -6
- package/gsd-core/bin/lib/complexity-trigger.cjs +1192 -0
- package/gsd-core/bin/lib/config-loader.cjs +187 -23
- package/gsd-core/bin/lib/config.cjs +102 -3
- package/gsd-core/bin/lib/configuration.cjs +129 -37
- package/gsd-core/bin/lib/core-utils.cjs +208 -33
- package/gsd-core/bin/lib/decisions.cjs +23 -0
- 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/fallow-runner.cjs +20 -44
- package/gsd-core/bin/lib/frontmatter.cjs +899 -229
- package/gsd-core/bin/lib/gap-checker.cjs +95 -10
- package/gsd-core/bin/lib/git-base-branch.cjs +276 -39
- package/gsd-core/bin/lib/gsd2-import.cjs +10 -1
- package/gsd-core/bin/lib/health-diagnostic-rules/agent-install.cjs +101 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/config-validation.cjs +348 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +149 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/install-surface-shadowing.cjs +98 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/milestone-archive-hygiene.cjs +100 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +222 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +268 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/root-existence.cjs +161 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +303 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +187 -0
- package/gsd-core/bin/lib/health-diagnostic-types.cjs +68 -0
- package/gsd-core/bin/lib/health-diagnostic.cjs +451 -0
- package/gsd-core/bin/lib/host-integration.cjs +39 -6
- package/gsd-core/bin/lib/host-runtime-detection.cjs +134 -0
- package/gsd-core/bin/lib/init-command-router.cjs +118 -21
- package/gsd-core/bin/lib/init.cjs +439 -168
- package/gsd-core/bin/lib/install-effort-resolver.cjs +73 -30
- package/gsd-core/bin/lib/install-engine.cjs +811 -259
- package/gsd-core/bin/lib/install-fs-adapter.cjs +262 -0
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +235 -0
- package/gsd-core/bin/lib/install-profiles.cjs +212 -61
- package/gsd-core/bin/lib/install-scope.cjs +270 -0
- package/gsd-core/bin/lib/install-shadow-report.cjs +385 -0
- package/gsd-core/bin/lib/installed-surface-resolver.cjs +381 -0
- 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 +148 -38
- package/gsd-core/bin/lib/intel.cjs +101 -26
- package/gsd-core/bin/lib/io.cjs +170 -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-sectionizer.cjs +2 -1
- package/gsd-core/bin/lib/markdown-table.cjs +183 -22
- package/gsd-core/bin/lib/milestone-lock.cjs +248 -0
- package/gsd-core/bin/lib/milestone.cjs +842 -73
- package/gsd-core/bin/lib/model-catalog.cjs +232 -16
- package/gsd-core/bin/lib/model-resolver.cjs +193 -68
- package/gsd-core/bin/lib/normalize-test-command.cjs +1 -1
- package/gsd-core/bin/lib/onboard-projection.cjs +5 -1
- package/gsd-core/bin/lib/pattern.cjs +122 -0
- package/gsd-core/bin/lib/phase-estimation.cjs +18 -9
- package/gsd-core/bin/lib/phase-id.cjs +514 -40
- package/gsd-core/bin/lib/phase-lifecycle.cjs +52 -19
- package/gsd-core/bin/lib/phase-locator.cjs +262 -34
- package/gsd-core/bin/lib/phase.cjs +1038 -214
- package/gsd-core/bin/lib/plan-dependency-graph.cjs +72 -1
- package/gsd-core/bin/lib/plan-document.cjs +263 -0
- package/gsd-core/bin/lib/plan-drift-guard.cjs +120 -0
- package/gsd-core/bin/lib/plan-scan.cjs +98 -3
- 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-scope.cjs +31 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +894 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +112 -6
- package/gsd-core/bin/lib/probe-core.cjs +5 -2
- package/gsd-core/bin/lib/profile-output.cjs +1 -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 +766 -0
- package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +11 -6
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +22 -13
- package/gsd-core/bin/lib/review-lane-invocation.cjs +30 -0
- package/gsd-core/bin/lib/review-lane-runner.cjs +421 -66
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +13 -18
- package/gsd-core/bin/lib/roadmap-command-router.cjs +59 -11
- package/gsd-core/bin/lib/roadmap-parser.cjs +1006 -184
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +37 -10
- package/gsd-core/bin/lib/roadmap.cjs +442 -96
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +702 -52
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +14 -2
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +459 -55
- package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +3 -2
- package/gsd-core/bin/lib/runtime-homes.cjs +69 -3
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +402 -58
- package/gsd-core/bin/lib/runtime-identity.cjs +234 -0
- package/gsd-core/bin/lib/runtime-name-policy.cjs +3 -1
- package/gsd-core/bin/lib/runtime-slash.cjs +96 -8
- package/gsd-core/bin/lib/security.cjs +104 -5
- package/gsd-core/bin/lib/shell-command-projection.cjs +342 -7
- package/gsd-core/bin/lib/smart-entry.cjs +133 -23
- package/gsd-core/bin/lib/spec-section.cjs +12 -7
- package/gsd-core/bin/lib/state-command-router.cjs +52 -19
- package/gsd-core/bin/lib/state-contract.cjs +359 -0
- package/gsd-core/bin/lib/state-document.cjs +338 -8
- package/gsd-core/bin/lib/state-md-schema.cjs +221 -0
- package/gsd-core/bin/lib/state-transition.cjs +846 -176
- package/gsd-core/bin/lib/state.cjs +2589 -369
- package/gsd-core/bin/lib/surface.cjs +33 -11
- 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/text-lines.cjs +80 -0
- package/gsd-core/bin/lib/token-scanner.cjs +76 -0
- package/gsd-core/bin/lib/uat-predicate.cjs +67 -23
- package/gsd-core/bin/lib/uat.cjs +1761 -167
- package/gsd-core/bin/lib/ui-consideration-probe.cjs +9 -1
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +157 -0
- package/gsd-core/bin/lib/ui-safety-gate.cjs +51 -12
- package/gsd-core/bin/lib/unusable-input.cjs +37 -0
- package/gsd-core/bin/lib/update-context.cjs +8 -2
- package/gsd-core/bin/lib/user-artifact-staging.cjs +705 -0
- package/gsd-core/bin/lib/validate-command-router.cjs +2 -2
- package/gsd-core/bin/lib/validate.cjs +20 -6
- package/gsd-core/bin/lib/vendor/README.md +75 -0
- package/gsd-core/bin/lib/vendor/js-yaml.cjs +3014 -0
- package/gsd-core/bin/lib/vendor/re2js.cjs +6480 -0
- package/gsd-core/bin/lib/vendor/re2js.d.cts +938 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +272 -9
- package/gsd-core/bin/lib/verify-command-grounding.cjs +846 -0
- package/gsd-core/bin/lib/verify.cjs +453 -918
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +53 -32
- package/gsd-core/bin/lib/workstream-inventory.cjs +63 -10
- package/gsd-core/bin/lib/workstream-name-policy.cjs +25 -4
- package/gsd-core/bin/lib/workstream.cjs +2 -2
- package/gsd-core/bin/lib/worktree-base-ref.cjs +66 -12
- package/gsd-core/bin/lib/worktree-safety.cjs +341 -18
- package/gsd-core/bin/shared/config-defaults.manifest.json +8 -1
- package/gsd-core/bin/shared/config-schema.manifest.json +12 -1
- 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 +44 -26
- 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 +39 -21
- package/gsd-core/references/context-budget.md +1 -1
- package/gsd-core/references/decimal-phase-calculation.md +5 -5
- package/gsd-core/references/dispatch-isolation-gate.md +138 -0
- package/gsd-core/references/doc-conflict-engine.md +1 -1
- package/gsd-core/references/edge-probe.md +8 -0
- package/gsd-core/references/execute-mvp-tdd.md +4 -6
- package/gsd-core/references/execute-phase-between-wave-reset.md +15 -14
- package/gsd-core/references/execute-phase-context-guard.md +1 -1
- package/gsd-core/references/execute-phase-response-language.md +1 -1
- package/gsd-core/references/execute-phase-wave-guard.md +17 -11
- 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 +5 -4
- package/gsd-core/references/gsd-run-resolver.md +1 -1
- package/gsd-core/references/loop-hook-dispatch.md +61 -2
- package/gsd-core/references/model-profiles.md +12 -4
- package/gsd-core/references/mvp-concepts.md +9 -9
- 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-guidance.md +3 -9
- package/gsd-core/references/planner-human-verify-mode.md +15 -1
- package/gsd-core/references/planner-preconditions.md +1 -1
- package/gsd-core/references/planner-reviews.md +1 -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 +44 -13
- package/gsd-core/references/reviewer-instances.md +31 -0
- package/gsd-core/references/revision-loop.md +1 -1
- package/gsd-core/references/runtime-aware-dispatch.md +1 -1
- package/gsd-core/references/specless-probe-fallback.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 +5 -5
- package/gsd-core/references/verifier-phase-gates.md +192 -0
- package/gsd-core/references/verify-command-path-resolvability.md +42 -0
- package/gsd-core/references/verify-mvp-mode.md +2 -2
- package/gsd-core/references/workstream-flag.md +33 -17
- 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/discussion-log.md +1 -1
- package/gsd-core/templates/phase-prompt.md +5 -4
- package/gsd-core/templates/state.md +11 -4
- package/gsd-core/templates/verification-report.md +9 -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 +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 +13 -20
- 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 +11 -27
- package/gsd-core/workflows/check-todos.md +1 -1
- package/gsd-core/workflows/cleanup.md +64 -5
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +14 -4
- package/gsd-core/workflows/code-review-fix.md +38 -11
- package/gsd-core/workflows/code-review.md +159 -52
- package/gsd-core/workflows/complete-milestone.md +151 -23
- package/gsd-core/workflows/debug.md +12 -8
- package/gsd-core/workflows/diagnose-issues.md +47 -15
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/chain.md +5 -8
- package/gsd-core/workflows/discuss-phase/modes/default.md +1 -1
- 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 +4 -3
- 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 +27 -2
- package/gsd-core/workflows/eval-review.md +7 -14
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +142 -15
- 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 +77 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +24 -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 +72 -100
- package/gsd-core/workflows/execute-plan.md +52 -15
- package/gsd-core/workflows/explore.md +131 -4
- package/gsd-core/workflows/extract-learnings.md +1 -1
- package/gsd-core/workflows/fast.md +10 -2
- package/gsd-core/workflows/forensics.md +1 -1
- package/gsd-core/workflows/graduation.md +5 -5
- package/gsd-core/workflows/health.md +76 -10
- package/gsd-core/workflows/import.md +18 -15
- package/gsd-core/workflows/inbox.md +4 -5
- package/gsd-core/workflows/ingest-docs.md +49 -16
- 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 +8 -5
- package/gsd-core/workflows/new-milestone.md +22 -29
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +1 -1
- package/gsd-core/workflows/new-project.md +26 -40
- package/gsd-core/workflows/new-workspace.md +1 -1
- package/gsd-core/workflows/next.md +14 -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 +162 -59
- package/gsd-core/workflows/plan-review-convergence.md +96 -11
- 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 +61 -18
- package/gsd-core/workflows/quick/steps/discussion-phase.md +1 -3
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +5 -7
- package/gsd-core/workflows/quick/steps/quick-verification.md +28 -9
- package/gsd-core/workflows/quick/steps/research-phase.md +4 -6
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +3 -3
- package/gsd-core/workflows/quick.md +55 -44
- 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 +219 -20
- package/gsd-core/workflows/scan.md +1 -1
- package/gsd-core/workflows/secure-phase.md +3 -3
- package/gsd-core/workflows/session-report.md +2 -1
- package/gsd-core/workflows/settings-advanced.md +7 -9
- package/gsd-core/workflows/settings-integrations.md +64 -31
- package/gsd-core/workflows/settings.md +69 -7
- package/gsd-core/workflows/ship.md +116 -50
- 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 +53 -13
- 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 +64 -9
- package/gsd-core/workflows/thread.md +11 -7
- package/gsd-core/workflows/transition.md +49 -14
- package/gsd-core/workflows/ui-phase.md +15 -21
- package/gsd-core/workflows/ui-review.md +8 -12
- package/gsd-core/workflows/ultraplan-phase.md +5 -13
- package/gsd-core/workflows/undo.md +8 -16
- package/gsd-core/workflows/update.md +7 -11
- package/gsd-core/workflows/validate-phase.md +3 -3
- 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 +66 -25
- package/hooks/dist/gsd-agent-isolation-guard.js +158 -30
- package/hooks/dist/gsd-check-update-worker.js +56 -13
- package/hooks/dist/gsd-check-update.js +19 -1
- 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 +2 -3
- 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 +83 -3
- package/hooks/dist/gsd-cursor-subagent-stop.js +6 -3
- 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 +37 -27
- package/hooks/dist/gsd-read-guard.js +16 -7
- package/hooks/dist/gsd-read-injection-scanner.js +55 -32
- package/hooks/dist/gsd-session-state.sh +1 -0
- package/hooks/dist/gsd-statusline.js +231 -24
- package/hooks/dist/gsd-update-banner.js +22 -1
- 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 +162 -46
- 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-cmd.js +92 -59
- package/hooks/dist/lib/git-probe.js +84 -0
- package/hooks/dist/lib/hook-exit.js +81 -0
- package/hooks/dist/lib/injection-patterns.js +45 -0
- package/hooks/dist/lib/isolation-deny-reason.js +39 -0
- package/hooks/dist/lib/isolation-sentinel.js +9 -0
- package/hooks/dist/managed-hooks-registry.cjs +3 -0
- package/hooks/gsd-agent-isolation-guard.js +158 -30
- package/hooks/gsd-check-update-worker.js +56 -13
- package/hooks/gsd-check-update.js +19 -1
- 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 +2 -3
- package/hooks/gsd-cursor-session-start.js +2 -1
- package/hooks/gsd-cursor-stop.js +2 -1
- package/hooks/gsd-cursor-subagent-start.js +83 -3
- package/hooks/gsd-cursor-subagent-stop.js +6 -3
- 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 +37 -27
- package/hooks/gsd-read-guard.js +16 -7
- package/hooks/gsd-read-injection-scanner.js +55 -32
- package/hooks/gsd-session-state.sh +1 -0
- package/hooks/gsd-statusline.js +231 -24
- package/hooks/gsd-update-banner.js +22 -1
- 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 +162 -46
- 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-cmd.js +92 -59
- package/hooks/lib/git-probe.js +84 -0
- package/hooks/lib/hook-exit.js +81 -0
- package/hooks/lib/injection-patterns.js +45 -0
- package/hooks/lib/isolation-deny-reason.js +39 -0
- package/hooks/lib/isolation-sentinel.js +9 -0
- package/hooks/managed-hooks-registry.cjs +3 -0
- package/package.json +28 -11
- package/pi/gsd.cjs +19 -5
- package/scripts/base64-scan.sh +74 -12
- package/scripts/baselines/planning-prompt-drift-baseline.json +4 -0
- package/scripts/baselines/planning-snapshot-bypass-baseline.json +12 -0
- package/scripts/baselines/unreachable-guard-drift-baseline.json +4 -0
- package/scripts/build-hooks.js +5 -0
- package/scripts/changeset/lint.cjs +60 -5
- package/scripts/check-alias-drift.cjs +7 -43
- package/scripts/check-contract-drift.cjs +297 -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 +64 -14
- package/scripts/ci-timeout-report.cjs +230 -0
- package/scripts/command-contract-helpers.cjs +903 -1
- package/scripts/docs-guard-registry.cjs +396 -0
- package/scripts/gen-adr-index.cjs +728 -38
- package/scripts/gen-capability-registry.cjs +11 -21
- package/scripts/gen-context-index.cjs +2 -11
- 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-health-docs.cjs +390 -0
- package/scripts/gen-hooks-cli-exit.cjs +239 -0
- package/scripts/gen-install-tree-fixtures.cjs +2 -2
- package/scripts/gen-inventory-manifest.cjs +50 -4
- package/scripts/gen-loop-host-contract.cjs +138 -25
- package/scripts/gen-registry.cjs +3 -14
- 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/alias-drift-families.cjs +46 -0
- package/scripts/lib/ci-job-timing.cjs +72 -0
- package/scripts/lib/cli-exit.cjs +546 -44
- package/scripts/lib/drift-scan.cjs +308 -0
- package/scripts/lib/exit-code-registry.cjs +98 -0
- package/scripts/lib/ndjson-reporter.cjs +119 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +1 -26
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +4 -0
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +3 -0
- package/scripts/lint-canary-version-leak.cjs +73 -0
- package/scripts/lint-command-contract.cjs +96 -13
- package/scripts/lint-completion-predicate-drift.cjs +933 -0
- package/scripts/lint-completion-ratio-drift.cjs +214 -0
- package/scripts/lint-default-flip-documentation.cjs +193 -0
- 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 +38 -0
- package/scripts/lint-eslint-glob-coverage.cjs +340 -0
- package/scripts/{lint-fix-has-regression-test.cjs → lint-fix-has-regression-tests.cjs} +12 -6
- package/scripts/lint-frontmatter-scalar-broad-grep.cjs +237 -0
- package/scripts/lint-health-diagnostic-rule-table.cjs +461 -0
- package/scripts/lint-hooks-runtime-build-seam.cjs +262 -0
- package/scripts/lint-milestone-window-drift.cjs +468 -0
- package/scripts/lint-mutation-test-derivation-drift.cjs +86 -0
- package/scripts/lint-phase-enumeration-drift.cjs +492 -0
- package/scripts/lint-plan-count-drift.cjs +318 -0
- package/scripts/lint-planning-artifact-writer-drift.cjs +398 -0
- package/scripts/lint-planning-prompt-drift.cjs +471 -0
- package/scripts/lint-planning-snapshot-bypass-drift.cjs +544 -0
- package/scripts/lint-regression-test-names.cjs +15 -13
- package/scripts/lint-removed-but-needed.cjs +488 -0
- 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-field-drift.cjs +805 -0
- package/scripts/lint-state-write-path-drift.cjs +950 -0
- package/scripts/lint-test-file-count.allowlist.json +137 -8
- package/scripts/lint-test-file-count.cjs +25 -3
- package/scripts/lint-unreachable-guard-drift.cjs +830 -0
- package/scripts/lint-vendored-deps.cjs +297 -0
- package/scripts/mutation-matrix.cjs +599 -50
- package/scripts/pr-changed-files.cjs +63 -0
- package/scripts/pr-template-policy.cjs +14 -4
- package/scripts/prompt-injection-scan.sh +100 -14
- package/scripts/require-issue-link-policy.cjs +192 -0
- package/scripts/secret-scan.sh +75 -13
- package/scripts/select-docs-guards.cjs +56 -0
- package/scripts/sync-runtime-launcher.cjs +24 -7
- package/skills/gsd-autonomous/SKILL.md +0 -1
- package/skills/gsd-code-review/SKILL.md +1 -1
- package/skills/gsd-discuss-phase/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -2
- package/skills/gsd-import/SKILL.md +1 -1
- package/skills/gsd-map-codebase/SKILL.md +1 -1
- package/skills/gsd-mempalace-capture/SKILL.md +1 -1
- package/skills/gsd-mempalace-recall/SKILL.md +1 -1
- package/skills/gsd-new-milestone/SKILL.md +1 -1
- package/skills/gsd-next/SKILL.md +0 -1
- package/skills/gsd-plan-phase/SKILL.md +0 -1
- package/skills/gsd-progress/SKILL.md +0 -1
- package/skills/gsd-quick/SKILL.md +9 -5
- package/skills/gsd-review-backlog/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +0 -1
- package/skills/gsd-verify-work/SKILL.md +1 -1
- package/vscode/package.json +1 -1
- package/bin/lib/ui-safety-gate.cjs +0 -107
- package/gsd-core/workflows/discovery-phase.md +0 -298
- package/gsd-core/workflows/plan-milestone-gaps.md +0 -281
- package/gsd-core/workflows/verify-phase.md +0 -574
- package/scripts/affected-tests-lib.cjs +0 -554
- package/scripts/lint-allow-test-rule-refs.cjs +0 -162
- package/scripts/lint-emitted-drift-ack.cjs +0 -344
- package/scripts/run-affected-tests.cjs +0 -7
- package/scripts/run-tests.cjs +0 -1051
|
@@ -611,6 +611,14 @@ exports.ROADMAP_COMMAND_ALIASES = [
|
|
|
611
611
|
"subcommand": "analyze",
|
|
612
612
|
"mutation": false
|
|
613
613
|
},
|
|
614
|
+
{
|
|
615
|
+
"canonical": "roadmap.milestone-scope",
|
|
616
|
+
"aliases": [
|
|
617
|
+
"roadmap milestone-scope"
|
|
618
|
+
],
|
|
619
|
+
"subcommand": "milestone-scope",
|
|
620
|
+
"mutation": false
|
|
621
|
+
},
|
|
614
622
|
{
|
|
615
623
|
"canonical": "roadmap.get-phase",
|
|
616
624
|
"aliases": [
|
|
@@ -684,6 +692,20 @@ exports.NON_FAMILY_COMMAND_ALIASES = [
|
|
|
684
692
|
"aliases": [],
|
|
685
693
|
"mutation": true
|
|
686
694
|
},
|
|
695
|
+
{
|
|
696
|
+
"canonical": "commit-docs-guard.disable",
|
|
697
|
+
"aliases": [
|
|
698
|
+
"commit-docs-guard disable"
|
|
699
|
+
],
|
|
700
|
+
"mutation": true
|
|
701
|
+
},
|
|
702
|
+
{
|
|
703
|
+
"canonical": "commit-docs-guard.enable",
|
|
704
|
+
"aliases": [
|
|
705
|
+
"commit-docs-guard enable"
|
|
706
|
+
],
|
|
707
|
+
"mutation": true
|
|
708
|
+
},
|
|
687
709
|
{
|
|
688
710
|
"canonical": "commit-to-subrepo",
|
|
689
711
|
"aliases": [],
|
|
@@ -2,41 +2,171 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Command Argument Projection Module (ADR-457 build-at-publish: the
|
|
4
4
|
* hand-written bin/lib/command-arg-projection.cjs collapsed to a TypeScript
|
|
5
|
-
* source of truth).
|
|
6
|
-
*
|
|
5
|
+
* source of truth).
|
|
6
|
+
*
|
|
7
|
+
* ADR-3473 §8.4 ("failure is a value"): `parseNamedArgs` is now strict and
|
|
8
|
+
* returns a `Result` instead of silently accepting unrecognized or stray
|
|
9
|
+
* positional tokens. See .gsd/phase/feat-3884-failure-is-a-value/40-design.md
|
|
10
|
+
* for the full behavior table (A1-A18) and negative-space section (N1-N8).
|
|
7
11
|
*
|
|
8
12
|
* Shared helpers for command-family adapters to project argv tokens into
|
|
9
13
|
* typed named values and multi-word segments.
|
|
10
14
|
*/
|
|
11
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.isFlagToken = isFlagToken;
|
|
12
17
|
exports.parseNamedArgs = parseNamedArgs;
|
|
18
|
+
exports.parseNamedArgsOrExit = parseNamedArgsOrExit;
|
|
13
19
|
exports.parseMultiwordArg = parseMultiwordArg;
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
21
|
+
const io = require("./io.cjs");
|
|
22
|
+
const { ERROR_REASON, formatDiagnosticToken } = io;
|
|
23
|
+
// ─── Internal helpers ─────────────────────────────────────────────────────────
|
|
24
|
+
function isPlainObject(v) {
|
|
25
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
26
|
+
}
|
|
14
27
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
28
|
+
* ADR-3473 Decision 2: both ends of this seam are gsd-core's own source, so a
|
|
29
|
+
* malformed spec (a stale call site still using the legacy
|
|
30
|
+
* `parseNamedArgs(args, valueFlags, booleanFlags)` shape, or a missing spec
|
|
31
|
+
* entirely) is an internal invariant violation, not user input — it throws
|
|
32
|
+
* loudly instead of destructuring `undefined` off a Result.
|
|
33
|
+
*/
|
|
34
|
+
function assertValidSpec(spec) {
|
|
35
|
+
if (!isPlainObject(spec)) {
|
|
36
|
+
throw new TypeError('parseNamedArgs: spec must be an object of shape ' +
|
|
37
|
+
'{ valueFlags?: string[], booleanFlags?: string[], positionals: number | "rest" }. ' +
|
|
38
|
+
'Received a missing, array, or non-object value — this is the legacy ' +
|
|
39
|
+
'parseNamedArgs(args, valueFlags, booleanFlags) call shape, retired by ADR-3473 §8.4.');
|
|
40
|
+
}
|
|
41
|
+
const positionals = spec.positionals;
|
|
42
|
+
const positionalsValid = positionals === 'rest' ||
|
|
43
|
+
(typeof positionals === 'number' && Number.isInteger(positionals) && positionals >= 0);
|
|
44
|
+
if (!positionalsValid) {
|
|
45
|
+
throw new TypeError('parseNamedArgs: spec.positionals must be a non-negative integer or the literal "rest" ' +
|
|
46
|
+
`— received ${JSON.stringify(positionals)}.`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Single predicate reused for both extraction (a value beginning with a
|
|
50
|
+
// single `-` is a value, not a flag) and validation (negative space N5).
|
|
51
|
+
// Exported for init-command-router's #3865 --phase alias normalization,
|
|
52
|
+
// which needs the same flag-shape test before deciding whether args[2] is a
|
|
53
|
+
// phase positional or a flag token.
|
|
54
|
+
function isFlagToken(tok) {
|
|
55
|
+
return tok.startsWith('--');
|
|
56
|
+
}
|
|
57
|
+
// ─── parseNamedArgs ───────────────────────────────────────────────────────────
|
|
58
|
+
/**
|
|
59
|
+
* Project argv tokens into typed named values, then strictly validate every
|
|
60
|
+
* token past the caller's declared positional boundary.
|
|
61
|
+
*
|
|
62
|
+
* Extraction (unchanged semantics, #312): first occurrence wins; a value
|
|
63
|
+
* flag whose next token is absent or starts with `--` yields `null` (this is
|
|
64
|
+
* NOT a validation error — see the value-flag branch below); boolean flags
|
|
65
|
+
* and optional-value flags (`optionalValueFlags`, #2932's `--wave` shape) are
|
|
66
|
+
* presence tests. Kept as a single first-index Map so the flag loops don't
|
|
67
|
+
* each re-scan argv — O(argv + flags) instead of O(flags * argv).
|
|
68
|
+
*
|
|
69
|
+
* Validation (skipped entirely when `positionals === 'rest'`): a single
|
|
70
|
+
* left-to-right cursor walk from `spec.positionals`, per the design doc's
|
|
71
|
+
* Kernighan's Law note — debuggable over clever, never a set-difference.
|
|
18
72
|
*/
|
|
19
|
-
function parseNamedArgs(args,
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
73
|
+
function parseNamedArgs(args, spec) {
|
|
74
|
+
assertValidSpec(spec);
|
|
75
|
+
const valueFlags = spec.valueFlags ?? [];
|
|
76
|
+
const booleanFlags = spec.booleanFlags ?? [];
|
|
77
|
+
const optionalValueFlags = spec.optionalValueFlags ?? [];
|
|
23
78
|
const firstIndex = new Map();
|
|
24
79
|
for (let i = 0; i < args.length; i++) {
|
|
25
80
|
if (!firstIndex.has(args[i]))
|
|
26
81
|
firstIndex.set(args[i], i);
|
|
27
82
|
}
|
|
28
|
-
const
|
|
83
|
+
const data = {};
|
|
29
84
|
for (const flag of valueFlags) {
|
|
30
85
|
const idx = firstIndex.has(`--${flag}`) ? firstIndex.get(`--${flag}`) : -1;
|
|
31
|
-
|
|
32
|
-
idx !== -1 && args[idx + 1] !== undefined && !args[idx + 1]
|
|
86
|
+
data[flag] =
|
|
87
|
+
idx !== -1 && args[idx + 1] !== undefined && !isFlagToken(args[idx + 1])
|
|
33
88
|
? args[idx + 1]
|
|
34
89
|
: null;
|
|
35
90
|
}
|
|
36
91
|
for (const flag of booleanFlags) {
|
|
37
|
-
|
|
92
|
+
data[flag] = firstIndex.has(`--${flag}`);
|
|
93
|
+
}
|
|
94
|
+
// Optional-value flags (#2932: `--wave`-shaped) — presence-only, exactly
|
|
95
|
+
// like booleanFlags. The value (if any) is deliberately not surfaced here;
|
|
96
|
+
// see the NamedArgSpec.optionalValueFlags JSDoc.
|
|
97
|
+
for (const flag of optionalValueFlags) {
|
|
98
|
+
data[flag] = firstIndex.has(`--${flag}`);
|
|
99
|
+
}
|
|
100
|
+
if (spec.positionals === 'rest') {
|
|
101
|
+
return { ok: true, data };
|
|
102
|
+
}
|
|
103
|
+
const valueFlagSet = new Set(valueFlags);
|
|
104
|
+
const booleanFlagSet = new Set(booleanFlags);
|
|
105
|
+
const optionalValueFlagSet = new Set(optionalValueFlags);
|
|
106
|
+
const flagList = [
|
|
107
|
+
...valueFlags.map((f) => `--${f} <value>`),
|
|
108
|
+
...booleanFlags.map((f) => `--${f}`),
|
|
109
|
+
...optionalValueFlags.map((f) => `--${f} [value]`),
|
|
110
|
+
];
|
|
111
|
+
let i = spec.positionals;
|
|
112
|
+
while (i < args.length) {
|
|
113
|
+
const tok = args[i];
|
|
114
|
+
if (isFlagToken(tok)) {
|
|
115
|
+
const name = tok.slice(2);
|
|
116
|
+
if (valueFlagSet.has(name)) {
|
|
117
|
+
// A value flag whose next token is absent or flag-shaped resolves to
|
|
118
|
+
// `null` in `data` (see the extraction loop above) — this is NOT an
|
|
119
|
+
// error (#3180/behavior-lock: emptyPrdValueIsFalsyAndTreatedAsAbsent,
|
|
120
|
+
// section-manifest-init-facts.test.cjs "flag-shaped value"). Advance
|
|
121
|
+
// by 1 so the following flag token is validated on its own merits on
|
|
122
|
+
// the next iteration.
|
|
123
|
+
const next = args[i + 1];
|
|
124
|
+
i += next !== undefined && !isFlagToken(next) ? 2 : 1;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (booleanFlagSet.has(name)) {
|
|
128
|
+
i += 1;
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (optionalValueFlagSet.has(name)) {
|
|
132
|
+
const next = args[i + 1];
|
|
133
|
+
i += next !== undefined && !isFlagToken(next) ? 2 : 1;
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const reason = flagList.length > 0
|
|
137
|
+
? `unknown flag ${formatDiagnosticToken(tok)}; accepted: ${flagList.join(', ')}`
|
|
138
|
+
: `unknown flag ${formatDiagnosticToken(tok)}; this command accepts no flags`;
|
|
139
|
+
return { ok: false, kind: 'InvalidArgs', arg: tok, reason, exitReason: ERROR_REASON.USAGE };
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
ok: false,
|
|
143
|
+
kind: 'InvalidArgs',
|
|
144
|
+
arg: tok,
|
|
145
|
+
reason: `unexpected positional argument ${formatDiagnosticToken(tok)}`,
|
|
146
|
+
exitReason: ERROR_REASON.USAGE,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
return { ok: true, data };
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Thin projection over `parseNamedArgs`: on `ok:false` it calls
|
|
153
|
+
* `fail(result.reason, result.exitReason)` and then throws.
|
|
154
|
+
*
|
|
155
|
+
* The trailing throw exists for two reasons: (1) TypeScript's control-flow
|
|
156
|
+
* analysis needs a `never`-returning path so callers can destructure the
|
|
157
|
+
* return value without a null check; (2) it is a fail-closed backstop — the
|
|
158
|
+
* `fail` callbacks in this repo are `never`-returning at runtime (`io.error`
|
|
159
|
+
* calls `process.exit(1)`) but are typed `void`, so if a caller ever passes a
|
|
160
|
+
* `fail` that actually returns, this still halts instead of falling through
|
|
161
|
+
* with a half-built `ParsedNamedArgs`.
|
|
162
|
+
*/
|
|
163
|
+
function parseNamedArgsOrExit(args, spec, fail) {
|
|
164
|
+
const result = parseNamedArgs(args, spec);
|
|
165
|
+
if (!result.ok) {
|
|
166
|
+
fail(result.reason, result.exitReason);
|
|
167
|
+
throw new Error(`parseNamedArgsOrExit: fail() returned instead of exiting (arg: ${result.arg})`);
|
|
38
168
|
}
|
|
39
|
-
return result;
|
|
169
|
+
return result.data;
|
|
40
170
|
}
|
|
41
171
|
/**
|
|
42
172
|
* Collect all tokens after --flag until the next --flag or end of args.
|
|
@@ -1,14 +1,57 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
/**
|
|
3
6
|
* Command Roster Module
|
|
4
7
|
*
|
|
5
8
|
* Read-only helper for discovering canonical commands/gsd command stems and
|
|
6
9
|
* applying the shared GSD slash-command namespace transform.
|
|
7
10
|
*/
|
|
11
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
12
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
13
|
+
// #2874 (ADR-58 cleanup phase): readGsdCommandNames is reached from
|
|
14
|
+
// installRuntimeArtifacts's call tree (skillsKind's stage() closure reads it
|
|
15
|
+
// for cross-referencing), but COMMANDS_DIR (below) is resolved by walking up
|
|
16
|
+
// from THIS MODULE'S OWN compiled __dirname to locate the GSD PACKAGE'S OWN
|
|
17
|
+
// commands/gsd/ source tree — not anything under the install destination.
|
|
18
|
+
// This is the exact same "package's own source, not the destination" case
|
|
19
|
+
// findInstallSourceRoot/findAgentsSourceRoot document in
|
|
20
|
+
// runtime-artifact-layout.cts's Step 2 (see that comment and
|
|
21
|
+
// install-fs-adapter.cts's module doc, "DELIBERATELY NOT ROUTED" section):
|
|
22
|
+
// an injected destination adapter's store starts empty and is never seeded
|
|
23
|
+
// with the real package's own on-disk layout, so routing this read through
|
|
24
|
+
// installFs() would make a fake-adapter install either silently return `[]`
|
|
25
|
+
// (via the ENOENT swallow below) or resolve wrong stems — never loudly fail,
|
|
26
|
+
// and never see the real package tree either way. This directory read
|
|
27
|
+
// therefore deliberately stays on real `node:fs`, unrouted — same rule,
|
|
28
|
+
// applied consistently, not an inconsistency with the routed staging calls
|
|
29
|
+
// elsewhere in this call tree. `readCmdNames` in
|
|
30
|
+
// scripts/fix-slash-commands.cjs also uses real `node:fs` directly (that
|
|
31
|
+
// script lives outside src/ and is also a standalone CLI tool), so its
|
|
32
|
+
// directory-read logic is reimplemented here against real fs instead of
|
|
33
|
+
// delegated to, keeping the pure regex/transform helpers below delegated as
|
|
34
|
+
// before.
|
|
8
35
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
9
36
|
const slashCommandTransformer = require('../../../scripts/fix-slash-commands.cjs');
|
|
37
|
+
// Mirrors scripts/fix-slash-commands.cjs's own `COMMANDS_DIR` computation
|
|
38
|
+
// (`path.join(__dirname, '..', 'commands', 'gsd')` from repo-root/scripts) —
|
|
39
|
+
// same target directory, resolved from this module's own compiled location
|
|
40
|
+
// (repo-root/gsd-core/bin/lib) instead, so the walk-up depth differs.
|
|
41
|
+
const COMMANDS_DIR = node_path_1.default.join(__dirname, '..', '..', '..', 'commands', 'gsd');
|
|
10
42
|
function readGsdCommandNames() {
|
|
11
|
-
|
|
43
|
+
try {
|
|
44
|
+
return node_fs_1.default.readdirSync(COMMANDS_DIR)
|
|
45
|
+
.filter((f) => f.endsWith('.md'))
|
|
46
|
+
.map((f) => f.replace(/\.md$/, ''));
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
// Only swallow the missing-directory case — mirrors readCmdNames' own
|
|
50
|
+
// contract (scripts/fix-slash-commands.cjs).
|
|
51
|
+
if (err instanceof Error && err.code !== 'ENOENT')
|
|
52
|
+
throw err;
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
12
55
|
}
|
|
13
56
|
module.exports = {
|
|
14
57
|
readGsdCommandNames,
|
|
@@ -19,8 +19,16 @@
|
|
|
19
19
|
* Invariants:
|
|
20
20
|
* - Hub always routes through CJS handlers. There is no SDK path (#175).
|
|
21
21
|
* - Hub never prints to stdout/stderr, never calls process.exit.
|
|
22
|
-
* - Hub never throws
|
|
23
|
-
* { ok: false, kind: 'HandlerFailure', message, cause }.
|
|
22
|
+
* - Hub never throws for an ordinary handler exception — those are caught
|
|
23
|
+
* and converted to { ok: false, kind: 'HandlerFailure', message, cause }.
|
|
24
|
+
* - EXCEPTION (ADR-3889): a thrown ExitError (the process-exit seam in
|
|
25
|
+
* src/cli-exit.cts, e.g. from io.cts's error()) is deliberately
|
|
26
|
+
* RE-THROWN, never converted — the throwing handler has already written
|
|
27
|
+
* its own stderr and is terminating with a specific exit code; wrapping
|
|
28
|
+
* it as a HandlerFailure would re-derive a generic message from
|
|
29
|
+
* ExitError's constructor default and print a second, wrong stderr line.
|
|
30
|
+
* It propagates through every caller up to the runMain() at the CLI
|
|
31
|
+
* entrypoint, the only place ExitError is meant to be caught.
|
|
24
32
|
* - The kind taxonomy is closed. Callers switch on ERROR_KINDS values.
|
|
25
33
|
* - Each error variant carries ONLY its own typed payload (#176).
|
|
26
34
|
* No cross-variant `message`/`details` escape hatches.
|
|
@@ -33,6 +41,9 @@ const event_cjs_1 = require("./observability/event.cjs");
|
|
|
33
41
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
34
42
|
const observabilityLogger = require("./observability/logger.cjs");
|
|
35
43
|
const { createNoOpLogger } = observabilityLogger;
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
45
|
+
const cliExitModule = require("./cli-exit.cjs");
|
|
46
|
+
const { ExitError } = cliExitModule;
|
|
36
47
|
// ─── Error kind constants ─────────────────────────────────────────────────────
|
|
37
48
|
/**
|
|
38
49
|
* Closed error-kind enum. Export as a frozen object so callers can switch on
|
|
@@ -233,6 +244,24 @@ function createHub({ cjsRegistry, manifest, logger } = {}) {
|
|
|
233
244
|
result = _dispatch(req);
|
|
234
245
|
}
|
|
235
246
|
catch (err) {
|
|
247
|
+
// ADR-3889: a handler that calls io.cts's error() (or otherwise throws
|
|
248
|
+
// ExitError directly) is deliberately terminating the CLI with a
|
|
249
|
+
// specific exit code and a stderr write it has ALREADY performed
|
|
250
|
+
// itself. Swallowing that into a HandlerFailure and re-deriving a
|
|
251
|
+
// message from err.message (ExitError's generic "process exit N"
|
|
252
|
+
// constructor default, since error() passes no message) would both
|
|
253
|
+
// duplicate the stderr output and discard the real exit code — this
|
|
254
|
+
// was invisible before ADR-3889 because io.cts's error() called
|
|
255
|
+
// process.exit() directly, which this try/catch could never observe
|
|
256
|
+
// (a process.exit() call terminates synchronously; it does not throw
|
|
257
|
+
// and unwind through here). Re-throwing preserves that same
|
|
258
|
+
// non-observability now that the termination mechanism is a throw:
|
|
259
|
+
// it propagates past this hub, past every non-family-router caller,
|
|
260
|
+
// up to the runMain() at the CLI entrypoint, which is the ONLY place
|
|
261
|
+
// ExitError is meant to be caught.
|
|
262
|
+
if (err instanceof ExitError) {
|
|
263
|
+
throw err;
|
|
264
|
+
}
|
|
236
265
|
if (err instanceof Error) {
|
|
237
266
|
result = makeHandlerFailure(err.message, err);
|
|
238
267
|
}
|