@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
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Install Surface Shadowing rule (#2873, epic #2866 Phase 4a — governed by
|
|
4
|
+
* `.gsd/phase/feat-2873-cross-scope-shadowing/40-design.md`).
|
|
5
|
+
*
|
|
6
|
+
* One code, W028, surfacing `install-shadow-report.cts`'s `ShadowReport` as
|
|
7
|
+
* a `/gsd-health` diagnostic — the design doc's row #4 ("one diagnostic,
|
|
8
|
+
* severity WARNING, same projection" as the install-time report). WARNING
|
|
9
|
+
* severity, ADVISE remedy with `risk: NONE`: shadowing is never auto-fixable
|
|
10
|
+
* (there is no single correct scope to remove) so this is advisory only,
|
|
11
|
+
* mirroring `agent-install.cts`'s W010 shape.
|
|
12
|
+
*
|
|
13
|
+
* Reaches OUTSIDE the planning snapshot the same way `agent-install.cts`
|
|
14
|
+
* does for W010: `resolveRuntime(cwd)` (`runtime-slash.cjs`) resolves the
|
|
15
|
+
* runtime id from `process.env.GSD_RUNTIME` / `config.runtime` / the
|
|
16
|
+
* `'claude'` default (never throws), using `snapshot.cwd`
|
|
17
|
+
* (`planning-snapshot.cts`'s `buildPlanningSnapshot` — `path.resolve(cwd)`)
|
|
18
|
+
* as the project directory. `buildShadowReport` is then called with that
|
|
19
|
+
* `cwd` so the local scope resolves against the project actually being
|
|
20
|
+
* health-checked, while `home` is left un-injected so the resolver defaults
|
|
21
|
+
* to `os.homedir()` — the real machine, same production call shape the
|
|
22
|
+
* installer uses.
|
|
23
|
+
*
|
|
24
|
+
* `check(snapshot)` degrades to `[]` (never throws) whenever there is
|
|
25
|
+
* nothing installable to report: `buildShadowReport` itself already
|
|
26
|
+
* degrades an unresolvable runtime (`configHome.kind === 'none'`, e.g.
|
|
27
|
+
* vscode — design row #7) to `reason: RESOLVER_UNAVAILABLE`, which
|
|
28
|
+
* `renderShadowReport` renders as `[]`; the try/catch around both calls
|
|
29
|
+
* below additionally absorbs any other unexpected throw (design row D5),
|
|
30
|
+
* since this rule is advisory and must never make `/gsd-health` itself
|
|
31
|
+
* fail.
|
|
32
|
+
*
|
|
33
|
+
* Design: .gsd/phase/feat-2873-cross-scope-shadowing/40-design.md
|
|
34
|
+
*
|
|
35
|
+
* ADR-457 build-at-publish: source in
|
|
36
|
+
* src/health-diagnostic-rules/install-surface-shadowing.cts, compiled to
|
|
37
|
+
* gsd-core/bin/lib/health-diagnostic-rules/install-surface-shadowing.cjs
|
|
38
|
+
* (gitignored).
|
|
39
|
+
*/
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
41
|
+
const healthDiagnosticMod = require("../health-diagnostic-types.cjs");
|
|
42
|
+
const { SEVERITY, adviseRemedy } = healthDiagnosticMod;
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
44
|
+
const installShadowReportMod = require("../install-shadow-report.cjs");
|
|
45
|
+
const { buildShadowReport, renderShadowReport } = installShadowReportMod;
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
47
|
+
const runtimeSlashMod = require("../runtime-slash.cjs");
|
|
48
|
+
const { resolveRuntime } = runtimeSlashMod;
|
|
49
|
+
const package_identity_cjs_1 = require("../package-identity.cjs");
|
|
50
|
+
/**
|
|
51
|
+
* `check(snapshot)` for W028 — see module header for the degrade-to-`[]`
|
|
52
|
+
* cases and the runtime-resolution mechanism reused from `agent-install.cts`.
|
|
53
|
+
*/
|
|
54
|
+
function checkInstallSurfaceShadowing(snapshot) {
|
|
55
|
+
let lines;
|
|
56
|
+
let runtime;
|
|
57
|
+
try {
|
|
58
|
+
runtime = resolveRuntime(snapshot.cwd);
|
|
59
|
+
const report = buildShadowReport(runtime, { cwd: snapshot.cwd });
|
|
60
|
+
// `renderShadowReport` returns `[]` for every reason other than
|
|
61
|
+
// SCOPE_SHADOWED (design rows #1, #2, #6, #7, #8, #11), and sanitizes
|
|
62
|
+
// every `declaredRuntime` it interpolates via `sanitizeForRender`
|
|
63
|
+
// internally (`install-shadow-report.cts`) — this rule's `message`
|
|
64
|
+
// reuses that render path rather than re-sanitizing, so the
|
|
65
|
+
// sanitize-at-the-render-seam guarantee (design row #13) holds here too.
|
|
66
|
+
// Trigger names are already SAFE_STEM-gated upstream
|
|
67
|
+
// (`installed-surface-resolver.cts`'s `deriveStemsForKindEntry`) before
|
|
68
|
+
// they ever reach a rendered line — no re-gating needed here either.
|
|
69
|
+
lines = renderShadowReport(report);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Advisory rule: an unresolvable runtime, a `configHome.kind === 'none'`
|
|
73
|
+
// runtime, or any other unexpected failure degrades to "no finding",
|
|
74
|
+
// never a thrown exception that would break `/gsd-health` itself
|
|
75
|
+
// (design row D5).
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
if (lines.length === 0)
|
|
79
|
+
return [];
|
|
80
|
+
return [
|
|
81
|
+
{
|
|
82
|
+
code: 'W028',
|
|
83
|
+
severity: SEVERITY.WARNING,
|
|
84
|
+
message: lines.join(' '),
|
|
85
|
+
remedy: adviseRemedy(`Review install scopes for ${runtime}: npx ${package_identity_cjs_1.PACKAGE_NAME}@latest`),
|
|
86
|
+
},
|
|
87
|
+
];
|
|
88
|
+
}
|
|
89
|
+
const RULES = [
|
|
90
|
+
{
|
|
91
|
+
code: 'W028',
|
|
92
|
+
severity: SEVERITY.WARNING,
|
|
93
|
+
description: 'A GSD-owned install scope shadows another on this machine',
|
|
94
|
+
repairable: false,
|
|
95
|
+
check: checkInstallSurfaceShadowing,
|
|
96
|
+
},
|
|
97
|
+
];
|
|
98
|
+
module.exports = { RULES };
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Health Diagnostic — Milestone archive + root hygiene rules (Phase 11,
|
|
4
|
+
* #3309, ADR-3180 §8.2/§8.3/§8.5).
|
|
5
|
+
*
|
|
6
|
+
* Group: "Milestone archive + root hygiene" (design doc, "Rule table
|
|
7
|
+
* organization" table) — W018, W019.
|
|
8
|
+
*
|
|
9
|
+
* Ported behavior-preserving from `cmdValidateHealth`
|
|
10
|
+
* (`src/verify.cts:2301-2354`), the exact call sites for W018/W019.
|
|
11
|
+
*
|
|
12
|
+
* Design: .gsd/phase/refactor-3309-health-diagnostic-rule-table/40-design.md
|
|
13
|
+
*
|
|
14
|
+
* ADR-457 build-at-publish: source in
|
|
15
|
+
* src/health-diagnostic-rules/milestone-archive-hygiene.cts, compiled to
|
|
16
|
+
* gsd-core/bin/lib/health-diagnostic-rules/milestone-archive-hygiene.cjs
|
|
17
|
+
* (gitignored).
|
|
18
|
+
*/
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
20
|
+
const healthDiagnosticMod = require("../health-diagnostic-types.cjs");
|
|
21
|
+
const { SEVERITY, REMEDY_ACTION, REMEDY_RISK, adviseRemedy } = healthDiagnosticMod;
|
|
22
|
+
const artifacts_cjs_1 = require("../artifacts.cjs");
|
|
23
|
+
// ─── W018 — MILESTONES.md missing archived milestone(s) (verify.cts:2301-2335) ──
|
|
24
|
+
//
|
|
25
|
+
// Condition: `snapshot.milestoneArchiveStatus.value.archivedVersions` (list of
|
|
26
|
+
// versions with a `.planning/milestones/<ver>-ROADMAP.md` snapshot file) minus
|
|
27
|
+
// `.documentedVersions` (list of `## <version>` headings already present in
|
|
28
|
+
// MILESTONES.md) — versions present in the archive but not documented in the
|
|
29
|
+
// registry. ONE aggregate `Diagnostic` listing every missing version, exactly
|
|
30
|
+
// mirroring the original's single `addIssue` call
|
|
31
|
+
// (`verify.cts:2321-2330`, `` `MILESTONES.md missing ${missingFromRegistry.length}
|
|
32
|
+
// archived milestone(s): ${missingFromRegistry.join(', ')}` ``) — the original
|
|
33
|
+
// computes the FULL list first (`missingFromRegistry`), then fires exactly one
|
|
34
|
+
// `addIssue` after the loop, not once per version. No diagnostic at all if the
|
|
35
|
+
// archive dir has zero recognized `-ROADMAP.md` snapshots (mirrors the
|
|
36
|
+
// original's `if (archivedVersions.length > 0)` guard) or if nothing is
|
|
37
|
+
// missing.
|
|
38
|
+
function checkW018(snapshot) {
|
|
39
|
+
const { archivedVersions, documentedVersions } = snapshot.milestoneArchiveStatus.value;
|
|
40
|
+
if (archivedVersions.length === 0)
|
|
41
|
+
return [];
|
|
42
|
+
const documented = new Set(documentedVersions);
|
|
43
|
+
const missingFromRegistry = archivedVersions.filter((ver) => !documented.has(ver));
|
|
44
|
+
if (missingFromRegistry.length === 0)
|
|
45
|
+
return [];
|
|
46
|
+
return [
|
|
47
|
+
{
|
|
48
|
+
code: 'W018',
|
|
49
|
+
severity: SEVERITY.WARNING,
|
|
50
|
+
message: `MILESTONES.md missing ${missingFromRegistry.length} archived milestone(s): ${missingFromRegistry.join(', ')}`,
|
|
51
|
+
remedy: {
|
|
52
|
+
action: REMEDY_ACTION.BACKFILL_MILESTONES,
|
|
53
|
+
risk: REMEDY_RISK.NONE,
|
|
54
|
+
args: {},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
// ─── W019 — Unrecognized .planning/ root file (verify.cts:2337-2354) ───────
|
|
60
|
+
//
|
|
61
|
+
// Condition: for each filename in `snapshot.planningRootFiles.value` ending in
|
|
62
|
+
// `.md`, call `isCanonicalPlanningFile(filename)` (bare basename, not a path —
|
|
63
|
+
// `src/artifacts.cts:43`); flag any that return false. One `Diagnostic` PER
|
|
64
|
+
// unrecognized file (array return), mirroring the original's `addIssue` call
|
|
65
|
+
// INSIDE the `for` loop (`verify.cts:2343-2349`) — unlike W018 this is not an
|
|
66
|
+
// aggregate. Fix text copied verbatim from `verify.cts:2347`.
|
|
67
|
+
function checkW019(snapshot) {
|
|
68
|
+
const diagnostics = [];
|
|
69
|
+
for (const filename of snapshot.planningRootFiles.value) {
|
|
70
|
+
if (!filename.endsWith('.md'))
|
|
71
|
+
continue;
|
|
72
|
+
if ((0, artifacts_cjs_1.isCanonicalPlanningFile)(filename))
|
|
73
|
+
continue;
|
|
74
|
+
diagnostics.push({
|
|
75
|
+
code: 'W019',
|
|
76
|
+
severity: SEVERITY.WARNING,
|
|
77
|
+
message: `Unrecognized .planning/ file: ${filename} — not a canonical GSD artifact`,
|
|
78
|
+
remedy: adviseRemedy('Move to .planning/milestones/ archive subdir or delete if stale. See templates/README.md for the canonical artifact list.'),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return diagnostics;
|
|
82
|
+
}
|
|
83
|
+
// ─── Exports ────────────────────────────────────────────────────────────────
|
|
84
|
+
const RULES = [
|
|
85
|
+
{
|
|
86
|
+
code: 'W018',
|
|
87
|
+
severity: SEVERITY.WARNING,
|
|
88
|
+
description: 'MILESTONES.md missing entry for archived milestone snapshot',
|
|
89
|
+
repairable: true,
|
|
90
|
+
check: checkW018,
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
code: 'W019',
|
|
94
|
+
severity: SEVERITY.WARNING,
|
|
95
|
+
description: 'Unrecognized .planning/ root file — not a canonical GSD artifact',
|
|
96
|
+
repairable: false,
|
|
97
|
+
check: checkW019,
|
|
98
|
+
},
|
|
99
|
+
];
|
|
100
|
+
module.exports = { RULES };
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Health Diagnostic — Phase directory structure rules (Phase 11, #3309,
|
|
4
|
+
* ADR-3180 §8.2/§8.3/§8.5).
|
|
5
|
+
*
|
|
6
|
+
* Group: "Phase directory structure" (design doc, "Rule table organization"
|
|
7
|
+
* table) — W005, W023, I001, W009.
|
|
8
|
+
*
|
|
9
|
+
* Ported behavior-preserving from `cmdValidateHealth`
|
|
10
|
+
* (`src/verify.cts:1893-1990`, the exact call sites for W005/W023/I001/W009),
|
|
11
|
+
* with two disclosed fidelity reductions forced by `PlanningSnapshot`'s
|
|
12
|
+
* current shape (see each rule's own comment below):
|
|
13
|
+
*
|
|
14
|
+
* - I001 cannot name the individual unsummarized PLAN filename (`snapshot.
|
|
15
|
+
* phases.value[i]` exposes only `planCount`/`summaryCount`, not per-plan
|
|
16
|
+
* filenames) — this rule reports a coarser per-PHASE message instead.
|
|
17
|
+
* - W023's original "described" list called `determinePhaseStatus`
|
|
18
|
+
* (`commands.cts:154`), a SIX-way status string ('Not Started'/'Planned'/
|
|
19
|
+
* 'In Progress'/'Executed'/'Needs Review'/'Complete') computed from its own
|
|
20
|
+
* raw `readdirSync` + `*-VERIFICATION.md` frontmatter read of `phaseDir`.
|
|
21
|
+
* This rule cannot re-run that raw read (§8.1 rule 1 forbids ambient I/O in
|
|
22
|
+
* `check`), so `derivePhaseStatusLabel` below reconstructs the same
|
|
23
|
+
* six-way label from fields `PlanningSnapshot` already exposes —
|
|
24
|
+
* `PhaseSnapshot.planCount`/`summaryCount` (the plan/no-plan and
|
|
25
|
+
* in-progress/planned branches, identical inputs to the original) and
|
|
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`.
|
|
37
|
+
*
|
|
38
|
+
* W009's original message interpolates `${slash('plan-phase')}`
|
|
39
|
+
* (`verify.cts:1982`, ``Re-run ${slash('plan-phase')} with --research to
|
|
40
|
+
* regenerate``), a per-project runtime-resolved value (`formatGsdSlash`,
|
|
41
|
+
* `src/runtime-slash.cts`) this rule's `(snapshot) => Diagnostic[]`
|
|
42
|
+
* signature has no access to. Hardcodes the canonical `/gsd-plan-phase`
|
|
43
|
+
* hyphen form instead, mirroring the sibling "config.json validation"
|
|
44
|
+
* group's W016 rule (`src/health-diagnostic-rules/config-validation.cts`),
|
|
45
|
+
* which hardcodes `/gsd-ai-integration-phase` the same way for the
|
|
46
|
+
* identical reason.
|
|
47
|
+
*
|
|
48
|
+
* Design: .gsd/phase/refactor-3309-health-diagnostic-rule-table/40-design.md
|
|
49
|
+
*
|
|
50
|
+
* ADR-457 build-at-publish: source in
|
|
51
|
+
* src/health-diagnostic-rules/phase-structure.cts, compiled to
|
|
52
|
+
* gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs (gitignored).
|
|
53
|
+
*/
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
55
|
+
const healthDiagnosticMod = require("../health-diagnostic-types.cjs");
|
|
56
|
+
const { SEVERITY, adviseRemedy } = healthDiagnosticMod;
|
|
57
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
58
|
+
const validateMod = require("../validate.cjs");
|
|
59
|
+
const { phaseDirNameRe } = validateMod;
|
|
60
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
61
|
+
const phaseIdMod = require("../phase-id.cjs");
|
|
62
|
+
const { extractPhaseToken, normalizePhaseName, comparePhaseNum } = phaseIdMod;
|
|
63
|
+
// ─── W005 — phase directory doesn't follow NN-name format (verify.cts:1893-1902) ─
|
|
64
|
+
function checkW005(snapshot) {
|
|
65
|
+
const diagnostics = [];
|
|
66
|
+
for (const name of snapshot.phaseDirs.value) {
|
|
67
|
+
if (!name.match(phaseDirNameRe)) {
|
|
68
|
+
diagnostics.push({
|
|
69
|
+
code: 'W005',
|
|
70
|
+
severity: SEVERITY.WARNING,
|
|
71
|
+
message: `Phase directory "${name}" doesn't follow NN-name format`,
|
|
72
|
+
remedy: adviseRemedy('Rename to match pattern (e.g., 01-setup)'),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return diagnostics;
|
|
77
|
+
}
|
|
78
|
+
// ─── W023 — phase directories collide on normalized key (verify.cts:1904-1950) ─
|
|
79
|
+
//
|
|
80
|
+
// Groups `snapshot.phaseDirs.value` by `normalizePhaseName(extractPhaseToken(name))`
|
|
81
|
+
// — the exact same two owners (`phase-id.cjs`) the original `verify.cts:1917-1918`
|
|
82
|
+
// call site uses, relocated verbatim rather than reimplemented. Sorted with
|
|
83
|
+
// `comparePhaseNum` + a `localeCompare` tiebreak, mirroring
|
|
84
|
+
// `verify.cts:1930-1932`'s deterministic-output rationale. See the file-level
|
|
85
|
+
// comment for the disclosed "described" fidelity reduction.
|
|
86
|
+
/**
|
|
87
|
+
* Reconstruct `commands.cts:154`'s `determinePhaseStatus` six-way label from
|
|
88
|
+
* fields `PhaseSnapshot` already exposes (no ambient I/O, no new snapshot
|
|
89
|
+
* field — see file-level comment). `complete`/`verificationStatus` come from
|
|
90
|
+
* `isPhaseComplete`'s §7.4 disk-strict routing of the same `*-VERIFICATION.md`
|
|
91
|
+
* file the original raw read targeted.
|
|
92
|
+
*/
|
|
93
|
+
function derivePhaseStatusLabel(planCount, summaryCount, complete, verificationStatus) {
|
|
94
|
+
if (planCount === 0)
|
|
95
|
+
return 'Not Started';
|
|
96
|
+
if (summaryCount < planCount && summaryCount > 0)
|
|
97
|
+
return 'In Progress';
|
|
98
|
+
if (summaryCount < planCount)
|
|
99
|
+
return 'Planned';
|
|
100
|
+
// summaryCount >= planCount > 0 — verification-gated, same as the original's
|
|
101
|
+
// post-count fall-through.
|
|
102
|
+
if (complete)
|
|
103
|
+
return 'Complete';
|
|
104
|
+
if (verificationStatus === 'human_needed')
|
|
105
|
+
return 'Needs Review';
|
|
106
|
+
// gaps_found / stale / missing / unknown all land here, same as the
|
|
107
|
+
// original's "verification exists but unrecognized" and "no verification
|
|
108
|
+
// file" branches both returning 'Executed'.
|
|
109
|
+
return 'Executed';
|
|
110
|
+
}
|
|
111
|
+
function checkW023(snapshot) {
|
|
112
|
+
const groups = new Map();
|
|
113
|
+
for (const name of snapshot.phaseDirs.value) {
|
|
114
|
+
const token = extractPhaseToken(name);
|
|
115
|
+
const key = normalizePhaseName(token);
|
|
116
|
+
const list = groups.get(key);
|
|
117
|
+
if (list)
|
|
118
|
+
list.push(name);
|
|
119
|
+
else
|
|
120
|
+
groups.set(key, [name]);
|
|
121
|
+
}
|
|
122
|
+
const phaseByDir = new Map(snapshot.phases.value.map((p) => [p.dir, p]));
|
|
123
|
+
const diagnostics = [];
|
|
124
|
+
for (const [key, dirs] of groups) {
|
|
125
|
+
if (dirs.length < 2)
|
|
126
|
+
continue;
|
|
127
|
+
const described = dirs
|
|
128
|
+
.slice()
|
|
129
|
+
.sort((a, b) => comparePhaseNum(a, b) || String(a).localeCompare(String(b)))
|
|
130
|
+
.map((d) => {
|
|
131
|
+
const phase = phaseByDir.get(d);
|
|
132
|
+
const plans = phase ? phase.planCount : 0;
|
|
133
|
+
const summaries = phase ? phase.summaryCount : 0;
|
|
134
|
+
const complete = phase ? phase.complete : false;
|
|
135
|
+
const verificationStatus = phase ? phase.verificationStatus : 'missing';
|
|
136
|
+
const status = derivePhaseStatusLabel(plans, summaries, complete, verificationStatus);
|
|
137
|
+
return `${d} (${status})`;
|
|
138
|
+
})
|
|
139
|
+
.join(', ');
|
|
140
|
+
diagnostics.push({
|
|
141
|
+
code: 'W023',
|
|
142
|
+
severity: SEVERITY.WARNING,
|
|
143
|
+
message: `Phase directories collide on normalized key "${key}": ${described}`,
|
|
144
|
+
remedy: adviseRemedy('Inspect each directory; rename or remove the duplicate so only one directory maps to this phase key'),
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
return diagnostics;
|
|
148
|
+
}
|
|
149
|
+
// ─── I001 — plan(s) without a matching SUMMARY.md (verify.cts:1952-1965) ───
|
|
150
|
+
//
|
|
151
|
+
// GENUINE FIDELITY GAP (see file-level comment): the original is PER-PLAN
|
|
152
|
+
// (`${e.name}/${plan} has no SUMMARY.md`, `plan` an individual PLAN.md
|
|
153
|
+
// filename from `findUnsummarizedPlans`). `PlanningSnapshot`'s
|
|
154
|
+
// `phases.value[i]` carries only `planCount`/`summaryCount` NUMBERS per
|
|
155
|
+
// phase — no per-plan filenames — so this rule cannot name which plan lacks
|
|
156
|
+
// a summary without reading the phase directory directly inside `check`
|
|
157
|
+
// (forbidden by §8.1 rule 1). This rule instead reports one coarser
|
|
158
|
+
// per-PHASE diagnostic naming the deficit count, not the individual
|
|
159
|
+
// filename(s).
|
|
160
|
+
function checkI001(snapshot) {
|
|
161
|
+
const diagnostics = [];
|
|
162
|
+
for (const phase of snapshot.phases.value) {
|
|
163
|
+
const deficit = phase.planCount - phase.summaryCount;
|
|
164
|
+
if (deficit > 0) {
|
|
165
|
+
diagnostics.push({
|
|
166
|
+
code: 'I001',
|
|
167
|
+
severity: SEVERITY.INFO,
|
|
168
|
+
message: `Phase ${phase.dir} has ${deficit} plan(s) without a matching summary`,
|
|
169
|
+
remedy: adviseRemedy('May be in progress'),
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return diagnostics;
|
|
174
|
+
}
|
|
175
|
+
// ─── W009 — Validation Architecture in RESEARCH.md but no VALIDATION.md ────
|
|
176
|
+
// (verify.cts:1967-1990)
|
|
177
|
+
function checkW009(snapshot) {
|
|
178
|
+
const diagnostics = [];
|
|
179
|
+
for (const entry of snapshot.researchValidationStatus.value) {
|
|
180
|
+
if (entry.hasValidationArchitecture && !entry.hasValidationMd) {
|
|
181
|
+
diagnostics.push({
|
|
182
|
+
code: 'W009',
|
|
183
|
+
severity: SEVERITY.WARNING,
|
|
184
|
+
message: `Phase ${entry.dir}: has Validation Architecture in RESEARCH.md but no VALIDATION.md`,
|
|
185
|
+
remedy: adviseRemedy('Re-run /gsd-plan-phase with --research to regenerate'),
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return diagnostics;
|
|
190
|
+
}
|
|
191
|
+
// ─── Exports ────────────────────────────────────────────────────────────────
|
|
192
|
+
const RULES = [
|
|
193
|
+
{
|
|
194
|
+
code: 'W005',
|
|
195
|
+
severity: SEVERITY.WARNING,
|
|
196
|
+
description: 'Phase directory naming mismatch',
|
|
197
|
+
repairable: false,
|
|
198
|
+
check: checkW005,
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
code: 'W023',
|
|
202
|
+
severity: SEVERITY.WARNING,
|
|
203
|
+
description: 'Phase directories collide on normalized key',
|
|
204
|
+
repairable: false,
|
|
205
|
+
check: checkW023,
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
code: 'I001',
|
|
209
|
+
severity: SEVERITY.INFO,
|
|
210
|
+
description: 'Plan without SUMMARY (may be in progress)',
|
|
211
|
+
repairable: false,
|
|
212
|
+
check: checkI001,
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
code: 'W009',
|
|
216
|
+
severity: SEVERITY.WARNING,
|
|
217
|
+
description: 'Phase has Validation Architecture in RESEARCH.md but no VALIDATION.md',
|
|
218
|
+
repairable: false,
|
|
219
|
+
check: checkW009,
|
|
220
|
+
},
|
|
221
|
+
];
|
|
222
|
+
module.exports = { RULES };
|