@opengsd/gsd-core 1.11.0 → 1.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.opencode/plugins/gsd-core.js +12 -0
- package/agents/gsd-code-fixer.md +1 -1
- package/agents/gsd-debug-session-manager.md +1 -1
- package/agents/gsd-debugger.md +1 -1
- package/agents/gsd-dom-verifier.md +169 -0
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-executor.md +78 -42
- package/agents/gsd-framework-selector.md +1 -3
- package/agents/gsd-intel-updater.md +1 -1
- package/agents/gsd-mempalace-curator.md +0 -1
- package/agents/gsd-pattern-mapper.md +11 -0
- package/agents/gsd-phase-researcher.md +3 -1
- package/agents/gsd-plan-checker.md +91 -112
- package/agents/gsd-planner.md +20 -4
- package/agents/gsd-project-researcher.md +1 -1
- package/agents/gsd-research-synthesizer.md +2 -2
- package/agents/gsd-roadmapper.md +15 -11
- package/agents/gsd-ui-checker.md +82 -7
- package/agents/gsd-ui-researcher.md +70 -3
- package/agents/gsd-verifier.md +24 -2
- package/bin/install.js +847 -200
- 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/ns-workflow.md +2 -1
- package/commands/gsd/phase.md +1 -1
- package/commands/gsd/quick-batch.md +105 -0
- package/commands/gsd/quick.md +8 -4
- package/commands/gsd/surface.md +18 -8
- package/gsd-core/bin/gsd-tools.cjs +761 -100
- package/gsd-core/bin/lib/active-workstream-store.cjs +8 -0
- package/gsd-core/bin/lib/adr-parser.cjs +13 -7
- package/gsd-core/bin/lib/agent-install-check.cjs +162 -0
- package/gsd-core/bin/lib/api-coverage.cjs +30 -9
- package/gsd-core/bin/lib/artifacts.cjs +2 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +30 -11
- package/gsd-core/bin/lib/audit.cjs +163 -41
- package/gsd-core/bin/lib/broken-windows.cjs +306 -28
- package/gsd-core/bin/lib/capability-activation.cjs +27 -0
- package/gsd-core/bin/lib/capability-lock.cjs +10 -4
- package/gsd-core/bin/lib/capability-registry.cjs +785 -144
- package/gsd-core/bin/lib/capability-state.cjs +25 -4
- package/gsd-core/bin/lib/capability-validator.cjs +321 -18
- package/gsd-core/bin/lib/capability-writer.cjs +14 -4
- package/gsd-core/bin/lib/check-command-router.cjs +229 -6
- package/gsd-core/bin/lib/claude-orchestration.cjs +10 -25
- package/gsd-core/bin/lib/cli-exit.cjs +496 -10
- package/gsd-core/bin/lib/clusters.cjs +1 -0
- package/gsd-core/bin/lib/code-review-depth.cjs +288 -0
- package/gsd-core/bin/lib/codex-agent-toml.cjs +410 -4
- package/gsd-core/bin/lib/command-aliases.cjs +16 -0
- package/gsd-core/bin/lib/command-arg-projection.cjs +144 -14
- package/gsd-core/bin/lib/command-routing-hub.cjs +31 -2
- package/gsd-core/bin/lib/commands.cjs +877 -54
- package/gsd-core/bin/lib/complexity-trigger.cjs +26 -6
- package/gsd-core/bin/lib/config-loader.cjs +121 -29
- package/gsd-core/bin/lib/config.cjs +92 -2
- package/gsd-core/bin/lib/configuration.cjs +129 -37
- package/gsd-core/bin/lib/core-utils.cjs +118 -14
- package/gsd-core/bin/lib/decisions.cjs +213 -1
- package/gsd-core/bin/lib/edge-probe.cjs +23 -2
- 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/file-overlap-partitioner.cjs +74 -0
- package/gsd-core/bin/lib/frontmatter.cjs +975 -326
- package/gsd-core/bin/lib/gap-checker.cjs +41 -8
- package/gsd-core/bin/lib/git-base-branch.cjs +182 -39
- package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +7 -3
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +8 -2
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +60 -14
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +75 -22
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +22 -8
- package/gsd-core/bin/lib/health-diagnostic.cjs +23 -3
- package/gsd-core/bin/lib/host-integration.cjs +96 -11
- package/gsd-core/bin/lib/init-command-router.cjs +132 -21
- package/gsd-core/bin/lib/init.cjs +252 -56
- package/gsd-core/bin/lib/install-engine.cjs +252 -15
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +78 -1
- package/gsd-core/bin/lib/install-profiles.cjs +100 -18
- package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
- package/gsd-core/bin/lib/installer-migrations/010-antigravity-retire-confighome-artifacts.cjs +169 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +10 -7
- package/gsd-core/bin/lib/intel.cjs +101 -26
- package/gsd-core/bin/lib/io.cjs +195 -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/loop-resolver.cjs +14 -8
- package/gsd-core/bin/lib/markdown-table.cjs +175 -4
- package/gsd-core/bin/lib/milestone.cjs +112 -7
- package/gsd-core/bin/lib/model-catalog.cjs +177 -19
- package/gsd-core/bin/lib/model-resolver.cjs +10 -28
- package/gsd-core/bin/lib/onboard-projection.cjs +5 -1
- package/gsd-core/bin/lib/phase-command-router.cjs +13 -6
- package/gsd-core/bin/lib/phase-estimation.cjs +17 -8
- package/gsd-core/bin/lib/phase-id.cjs +321 -13
- package/gsd-core/bin/lib/phase-lifecycle.cjs +24 -16
- package/gsd-core/bin/lib/phase-locator.cjs +138 -17
- package/gsd-core/bin/lib/phase.cjs +1175 -115
- package/gsd-core/bin/lib/plan-document.cjs +273 -0
- package/gsd-core/bin/lib/plan-scan.cjs +13 -2
- package/gsd-core/bin/lib/planning-command-router.cjs +61 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +1168 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +165 -34
- package/gsd-core/bin/lib/planning-workspace.cjs +159 -28
- package/gsd-core/bin/lib/probe-core.cjs +4 -1
- package/gsd-core/bin/lib/profile-pipeline-command-router.cjs +50 -7
- package/gsd-core/bin/lib/profile-pipeline.cjs +6 -3
- package/gsd-core/bin/lib/quick-batch-command-router.cjs +285 -0
- package/gsd-core/bin/lib/quick-batch-dispatch.cjs +250 -0
- package/gsd-core/bin/lib/quick-batch.cjs +840 -0
- package/gsd-core/bin/lib/real-home-guard.cjs +419 -0
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +71 -45
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +62 -14
- package/gsd-core/bin/lib/review-lane-invocation.cjs +73 -1
- package/gsd-core/bin/lib/review-lane-runner.cjs +136 -10
- package/gsd-core/bin/lib/roadmap-command-router.cjs +45 -31
- package/gsd-core/bin/lib/roadmap-parser.cjs +577 -41
- package/gsd-core/bin/lib/roadmap.cjs +248 -64
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +329 -41
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +16 -17
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +320 -109
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +487 -83
- package/gsd-core/bin/lib/runtime-identity.cjs +234 -0
- package/gsd-core/bin/lib/runtime-slash.cjs +72 -2
- package/gsd-core/bin/lib/shell-command-projection.cjs +75 -8
- package/gsd-core/bin/lib/smart-entry.cjs +19 -31
- package/gsd-core/bin/lib/spec-section.cjs +12 -7
- package/gsd-core/bin/lib/state-command-router.cjs +47 -18
- package/gsd-core/bin/lib/state-contract.cjs +359 -0
- package/gsd-core/bin/lib/state-document.cjs +216 -5
- package/gsd-core/bin/lib/state-md-schema.cjs +231 -0
- package/gsd-core/bin/lib/state-transition.cjs +850 -145
- package/gsd-core/bin/lib/state.cjs +1629 -287
- package/gsd-core/bin/lib/surface.cjs +33 -10
- 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/tdd-red-evidence.cjs +133 -0
- package/gsd-core/bin/lib/teams-status.cjs +4 -1
- package/gsd-core/bin/lib/uat-predicate.cjs +58 -20
- package/gsd-core/bin/lib/uat.cjs +2542 -387
- package/gsd-core/bin/lib/ui-consideration-probe.cjs +9 -1
- package/gsd-core/bin/lib/ui-safety-gate.cjs +37 -7
- package/gsd-core/bin/lib/unusable-input.cjs +13 -0
- package/gsd-core/bin/lib/update-context.cjs +6 -2
- package/gsd-core/bin/lib/validate-command-router.cjs +2 -2
- package/gsd-core/bin/lib/validate.cjs +230 -12
- package/gsd-core/bin/lib/vendor/README.md +43 -5
- package/gsd-core/bin/lib/vendor/js-yaml.cjs +3014 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +287 -13
- package/gsd-core/bin/lib/verify-command-grounding.cjs +846 -0
- package/gsd-core/bin/lib/verify-command-router.cjs +1 -0
- package/gsd-core/bin/lib/verify.cjs +441 -56
- package/gsd-core/bin/lib/workstream-inventory.cjs +20 -2
- package/gsd-core/bin/lib/workstream-name-policy.cjs +25 -4
- package/gsd-core/bin/lib/worktree-base-ref.cjs +66 -12
- package/gsd-core/bin/lib/worktree-safety.cjs +185 -21
- package/gsd-core/bin/shared/config-defaults.manifest.json +7 -1
- package/gsd-core/bin/shared/config-schema.manifest.json +13 -0
- package/gsd-core/bin/shared/exit-codes.json +8 -0
- package/gsd-core/bin/shared/exit-codes.sh +20 -0
- package/gsd-core/bin/shared/model-catalog.json +8 -1
- package/gsd-core/bin/verify-reapply-patches.cjs +70 -3
- package/gsd-core/references/agent-contracts.md +6 -5
- package/gsd-core/references/api-coverage.md +24 -2
- package/gsd-core/references/autonomous-smart-discuss.md +3 -3
- package/gsd-core/references/checkpoints.md +37 -19
- package/gsd-core/references/decimal-phase-calculation.md +5 -5
- package/gsd-core/references/edge-probe.md +17 -5
- package/gsd-core/references/execute-mvp-tdd.md +18 -18
- package/gsd-core/references/execute-phase-between-wave-reset.md +9 -12
- package/gsd-core/references/execute-phase-response-language.md +6 -0
- package/gsd-core/references/execute-phase-wave-guard.md +11 -9
- package/gsd-core/references/executor-examples.md +42 -0
- package/gsd-core/references/failing-direction.md +78 -0
- package/gsd-core/references/few-shot-examples/plan-checker.md +15 -15
- package/gsd-core/references/gate-prompts.md +1 -1
- package/gsd-core/references/git-integration.md +5 -5
- package/gsd-core/references/git-planning-commit.md +3 -3
- package/gsd-core/references/gsd-run-resolver.md +1 -1
- package/gsd-core/references/loop-hook-dispatch.md +22 -0
- package/gsd-core/references/model-profiles.md +1 -1
- package/gsd-core/references/mvp-concepts.md +2 -2
- 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/plan-checker-examples.md +41 -0
- package/gsd-core/references/planner-antipatterns.md +25 -0
- package/gsd-core/references/planner-chunked.md +5 -1
- package/gsd-core/references/planner-coupling.md +42 -0
- package/gsd-core/references/planner-failing-direction.md +53 -0
- package/gsd-core/references/planner-human-verify-mode.md +15 -1
- package/gsd-core/references/planner-quick-batch.md +71 -0
- package/gsd-core/references/planner-reviews.md +47 -0
- package/gsd-core/references/planner-revision.md +76 -3
- package/gsd-core/references/planner-verify-command-grounding.md +17 -0
- package/gsd-core/references/planning-config.md +39 -9
- package/gsd-core/references/response-language-directive.md +9 -0
- package/gsd-core/references/reviewer-instances.md +31 -0
- package/gsd-core/references/revision-loop.md +118 -11
- package/gsd-core/references/runtime-aware-dispatch.md +1 -1
- package/gsd-core/references/tdd.md +15 -12
- package/gsd-core/references/ui-brand.md +65 -21
- package/gsd-core/references/ui-consideration-probe.md +1 -1
- package/gsd-core/references/universal-anti-patterns.md +2 -2
- package/gsd-core/references/verifier-evidence-gate.md +160 -0
- package/gsd-core/references/verify-command-path-resolvability.md +42 -0
- package/gsd-core/references/verify-mvp-mode.md +1 -1
- package/gsd-core/references/workstream-flag.md +11 -11
- package/gsd-core/templates/README.md +1 -1
- package/gsd-core/templates/SECURITY.md +3 -3
- package/gsd-core/templates/UI-SPEC.md +25 -3
- package/gsd-core/templates/VALIDATION.md +3 -3
- package/gsd-core/templates/phase-prompt.md +7 -0
- package/gsd-core/templates/state.md +7 -0
- package/gsd-core/templates/verification-report.md +5 -0
- package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
- package/gsd-core/workflows/add-backlog.md +3 -1
- package/gsd-core/workflows/add-phase.md +5 -3
- package/gsd-core/workflows/add-tests.md +4 -9
- package/gsd-core/workflows/add-todo.md +2 -2
- package/gsd-core/workflows/ai-integration-phase.md +5 -10
- package/gsd-core/workflows/analyze-dependencies.md +2 -0
- package/gsd-core/workflows/audit-fix.md +14 -3
- package/gsd-core/workflows/audit-milestone.md +11 -9
- package/gsd-core/workflows/audit-uat.md +19 -2
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +2 -2
- package/gsd-core/workflows/autonomous.md +12 -26
- package/gsd-core/workflows/check-todos.md +2 -2
- package/gsd-core/workflows/cleanup.md +3 -3
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +16 -14
- package/gsd-core/workflows/code-review-fix.md +3 -1
- package/gsd-core/workflows/code-review.md +192 -69
- package/gsd-core/workflows/complete-milestone.md +28 -14
- package/gsd-core/workflows/debug.md +6 -4
- package/gsd-core/workflows/diagnose-issues.md +17 -7
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +3 -1
- package/gsd-core/workflows/discuss-phase/modes/all.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/analyze.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/auto.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/batch.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/chain.md +5 -7
- package/gsd-core/workflows/discuss-phase/modes/default.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/power.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/text.md +3 -1
- package/gsd-core/workflows/discuss-phase/templates/context.md +2 -0
- package/gsd-core/workflows/discuss-phase/templates/discussion-log.md +2 -0
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +1 -3
- package/gsd-core/workflows/discuss-phase-assumptions.md +3 -3
- package/gsd-core/workflows/discuss-phase-power.md +2 -0
- package/gsd-core/workflows/discuss-phase.md +2 -2
- package/gsd-core/workflows/do.md +46 -19
- package/gsd-core/workflows/docs-update.md +6 -5
- package/gsd-core/workflows/edit-phase.md +3 -1
- package/gsd-core/workflows/eval-review.md +5 -10
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +3 -1
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +129 -11
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +29 -5
- 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 +4 -2
- package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +25 -0
- package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +39 -0
- package/gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md +2 -0
- package/gsd-core/workflows/execute-phase.md +68 -66
- package/gsd-core/workflows/execute-plan.md +25 -20
- package/gsd-core/workflows/explore.md +3 -1
- package/gsd-core/workflows/extract-learnings.md +3 -1
- package/gsd-core/workflows/fast.md +8 -2
- package/gsd-core/workflows/forensics.md +3 -1
- package/gsd-core/workflows/graduation.md +6 -6
- package/gsd-core/workflows/health.md +4 -7
- package/gsd-core/workflows/help/modes/brief.md +2 -0
- package/gsd-core/workflows/help/modes/default.md +2 -0
- package/gsd-core/workflows/help/modes/full.md +12 -0
- package/gsd-core/workflows/help/modes/topic.md +2 -0
- package/gsd-core/workflows/help.md +2 -0
- package/gsd-core/workflows/import.md +17 -14
- package/gsd-core/workflows/inbox.md +5 -6
- package/gsd-core/workflows/ingest-docs.md +45 -12
- package/gsd-core/workflows/insert-phase.md +7 -5
- package/gsd-core/workflows/list-phase-assumptions.md +2 -0
- package/gsd-core/workflows/list-seeds.md +7 -3
- package/gsd-core/workflows/list-workspaces.md +3 -1
- package/gsd-core/workflows/manager.md +15 -26
- package/gsd-core/workflows/map-codebase.md +3 -1
- package/gsd-core/workflows/milestone-summary.md +3 -1
- package/gsd-core/workflows/mvp-phase.md +3 -3
- package/gsd-core/workflows/new-milestone.md +10 -22
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +1 -1
- package/gsd-core/workflows/new-project.md +17 -29
- package/gsd-core/workflows/new-workspace.md +2 -2
- package/gsd-core/workflows/next.md +4 -2
- package/gsd-core/workflows/node-repair.md +2 -0
- package/gsd-core/workflows/note.md +2 -0
- package/gsd-core/workflows/onboard.md +1 -1
- package/gsd-core/workflows/pause-work.md +20 -5
- 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 +100 -18
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +4 -4
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +12 -3
- package/gsd-core/workflows/plan-phase.md +251 -54
- package/gsd-core/workflows/plan-review-convergence.md +148 -19
- package/gsd-core/workflows/plant-seed.md +3 -3
- package/gsd-core/workflows/pr-branch.md +195 -51
- package/gsd-core/workflows/profile-user.md +17 -15
- package/gsd-core/workflows/progress/steps/forensic-audit.md +1 -1
- package/gsd-core/workflows/progress.md +52 -15
- package/gsd-core/workflows/quick/steps/discussion-phase.md +1 -3
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +38 -5
- package/gsd-core/workflows/quick/steps/quick-verification.md +2 -4
- package/gsd-core/workflows/quick/steps/research-phase.md +5 -7
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +3 -3
- package/gsd-core/workflows/quick-batch/steps/batch-init.md +55 -0
- package/gsd-core/workflows/quick-batch/steps/completion.md +65 -0
- package/gsd-core/workflows/quick-batch/steps/merge-wave.md +100 -0
- package/gsd-core/workflows/quick-batch/steps/plan-checker-loop.md +147 -0
- package/gsd-core/workflows/quick-batch/steps/planner-wave.md +158 -0
- package/gsd-core/workflows/quick-batch/steps/research-phase.md +95 -0
- package/gsd-core/workflows/quick-batch/steps/resume-mode.md +49 -0
- package/gsd-core/workflows/quick-batch/steps/verification-wave.md +73 -0
- package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +169 -0
- package/gsd-core/workflows/quick-batch.md +203 -0
- package/gsd-core/workflows/quick.md +33 -32
- package/gsd-core/workflows/reapply-patches.md +2 -0
- package/gsd-core/workflows/remove-phase.md +6 -4
- package/gsd-core/workflows/remove-workspace.md +3 -3
- package/gsd-core/workflows/resume-project.md +14 -14
- package/gsd-core/workflows/review.md +404 -21
- package/gsd-core/workflows/scan.md +3 -1
- package/gsd-core/workflows/section-manifest.json +12 -0
- package/gsd-core/workflows/secure-phase.md +3 -3
- package/gsd-core/workflows/session-report.md +2 -0
- package/gsd-core/workflows/settings-advanced.md +9 -9
- package/gsd-core/workflows/settings-integrations.md +66 -32
- package/gsd-core/workflows/settings.md +4 -6
- package/gsd-core/workflows/ship.md +22 -16
- package/gsd-core/workflows/sketch-wrap-up.md +13 -17
- package/gsd-core/workflows/sketch.md +13 -19
- package/gsd-core/workflows/smart-entry.md +4 -6
- package/gsd-core/workflows/spec-phase.md +31 -4
- package/gsd-core/workflows/spike-wrap-up.md +9 -11
- package/gsd-core/workflows/spike.md +21 -32
- package/gsd-core/workflows/stats.md +4 -2
- package/gsd-core/workflows/sync-skills.md +13 -5
- package/gsd-core/workflows/thread.md +13 -7
- package/gsd-core/workflows/transition.md +7 -5
- package/gsd-core/workflows/ui-phase.md +36 -21
- package/gsd-core/workflows/ui-review.md +7 -11
- package/gsd-core/workflows/ultraplan-phase.md +7 -13
- package/gsd-core/workflows/undo.md +9 -17
- package/gsd-core/workflows/update.md +47 -48
- 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 +106 -21
- package/hooks/dist/gsd-agent-isolation-guard.js +77 -38
- package/hooks/dist/gsd-check-update-worker.js +19 -2
- package/hooks/dist/gsd-config-reload.js +18 -12
- package/hooks/dist/gsd-context-monitor.js +302 -22
- package/hooks/dist/gsd-cursor-post-tool.js +3 -1
- package/hooks/dist/gsd-cursor-pre-tool.js +3 -1
- package/hooks/dist/gsd-cursor-session-start.js +2 -1
- package/hooks/dist/gsd-cursor-stop.js +2 -1
- package/hooks/dist/gsd-cursor-subagent-start.js +28 -23
- package/hooks/dist/gsd-cursor-subagent-stop.js +3 -1
- package/hooks/dist/gsd-ensure-canonical-path.js +2 -1
- package/hooks/dist/gsd-graphify-update.sh +22 -18
- package/hooks/dist/gsd-node-runner.sh +77 -0
- package/hooks/dist/gsd-phase-boundary.sh +1 -0
- package/hooks/dist/gsd-prompt-guard.js +46 -12
- package/hooks/dist/gsd-read-guard.js +18 -7
- package/hooks/dist/gsd-read-injection-scanner.js +22 -13
- package/hooks/dist/gsd-secret-read-guard.js +1079 -0
- package/hooks/dist/gsd-session-state.sh +1 -0
- package/hooks/dist/gsd-statusline.js +222 -29
- package/hooks/dist/gsd-validate-commit.sh +523 -12
- 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 +36 -17
- 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 +210 -1
- 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 +36 -6
- package/hooks/dist/managed-hooks-registry.cjs +4 -0
- package/hooks/gsd-agent-isolation-guard.js +77 -38
- package/hooks/gsd-check-update-worker.js +19 -2
- package/hooks/gsd-config-reload.js +18 -12
- package/hooks/gsd-context-monitor.js +302 -22
- package/hooks/gsd-cursor-post-tool.js +3 -1
- package/hooks/gsd-cursor-pre-tool.js +3 -1
- package/hooks/gsd-cursor-session-start.js +2 -1
- package/hooks/gsd-cursor-stop.js +2 -1
- package/hooks/gsd-cursor-subagent-start.js +28 -23
- package/hooks/gsd-cursor-subagent-stop.js +3 -1
- package/hooks/gsd-ensure-canonical-path.js +2 -1
- package/hooks/gsd-graphify-update.sh +22 -18
- package/hooks/gsd-node-runner.sh +77 -0
- package/hooks/gsd-phase-boundary.sh +1 -0
- package/hooks/gsd-prompt-guard.js +46 -12
- package/hooks/gsd-read-guard.js +18 -7
- package/hooks/gsd-read-injection-scanner.js +22 -13
- package/hooks/gsd-secret-read-guard.js +1079 -0
- package/hooks/gsd-session-state.sh +1 -0
- package/hooks/gsd-statusline.js +222 -29
- package/hooks/gsd-validate-commit.sh +523 -12
- package/hooks/gsd-windsurf-pre-command.js +16 -11
- package/hooks/gsd-windsurf-pre-write.js +22 -13
- package/hooks/gsd-workflow-guard.js +36 -17
- package/hooks/gsd-worktree-path-guard.js +36 -21
- package/hooks/gsd-write-guard.js +35 -25
- package/hooks/hooks.json +6 -0
- package/hooks/lib/cli-exit.js +560 -0
- package/hooks/lib/exit-code-registry.js +98 -0
- package/hooks/lib/git-cmd.js +210 -1
- package/hooks/lib/git-probe.js +84 -0
- package/hooks/lib/hook-exit.js +81 -0
- package/hooks/lib/injection-patterns.js +36 -6
- package/hooks/managed-hooks-registry.cjs +4 -0
- package/package.json +14 -9
- package/scripts/base64-scan.sh +74 -12
- package/scripts/build-hooks.js +12 -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 +52 -12
- package/scripts/ci-timeout-report.cjs +230 -0
- package/scripts/docs-guard-registry.cjs +406 -0
- package/scripts/gen-capability-registry.cjs +8 -6
- package/scripts/gen-exit-code-docs.cjs +318 -0
- package/scripts/gen-exit-code-registry.cjs +891 -0
- package/scripts/gen-features.cjs +836 -0
- package/scripts/gen-hooks-cli-exit.cjs +239 -0
- package/scripts/gen-install-tree-fixtures.cjs +2 -2
- package/scripts/gen-loop-host-contract.cjs +189 -4
- package/scripts/gen-scripts-cli-exit.cjs +185 -0
- package/scripts/gen-state-md-docs.cjs +727 -0
- package/scripts/{test-failure-reasons.cjs → gsd-test-gate-reasons.cjs} +6 -0
- package/scripts/lib/ci-job-timing.cjs +72 -0
- package/scripts/lib/cli-exit.cjs +546 -44
- package/scripts/lib/drift-scan.cjs +32 -2
- package/scripts/lib/exit-code-registry.cjs +98 -0
- package/scripts/lib/ndjson-reporter.cjs +119 -0
- package/scripts/lib/shellcheck-fetch.cjs +247 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -6
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
- package/scripts/lint-docs-guard-registration.cjs +495 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +198 -0
- package/scripts/lint-eslint-glob-coverage.allowlist.json +4 -0
- package/scripts/{lint-fix-has-regression-test.cjs → lint-fix-has-regression-tests.cjs} +12 -6
- package/scripts/lint-health-diagnostic-rule-table.cjs +65 -8
- package/scripts/lint-mutation-test-derivation-drift.cjs +86 -0
- package/scripts/lint-phase-enumeration-drift.cjs +45 -14
- package/scripts/lint-phase-id-drift.cjs +133 -8
- package/scripts/lint-planning-prompt-drift.cjs +38 -1
- package/scripts/lint-portable-grep.cjs +176 -0
- package/scripts/lint-removed-but-needed.cjs +184 -16
- package/scripts/lint-response-language-coverage.cjs +524 -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-write-path-drift.cjs +337 -432
- package/scripts/lint-test-file-count.allowlist.json +124 -4
- package/scripts/lint-test-file-count.cjs +25 -3
- package/scripts/lint-unreachable-guard-drift.cjs +51 -64
- package/scripts/lint-vendored-deps.cjs +208 -35
- package/scripts/lint-workflow-shellcheck-baseline.json +1027 -0
- package/scripts/lint-workflow-shellcheck.cjs +614 -0
- package/scripts/mutation-matrix.cjs +599 -50
- package/scripts/npm-audit-baseline.cjs +376 -0
- package/scripts/prompt-injection-scan.sh +83 -14
- package/scripts/require-issue-link-policy.cjs +16 -1
- package/scripts/secret-scan.sh +75 -13
- package/scripts/select-docs-guards.cjs +56 -0
- package/scripts/sync-runtime-launcher.cjs +22 -3
- package/skills/gsd-discuss-phase/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -1
- package/skills/gsd-import/SKILL.md +1 -1
- package/skills/gsd-ns-workflow/SKILL.md +1 -0
- package/skills/gsd-phase/SKILL.md +1 -1
- package/skills/gsd-quick/SKILL.md +8 -4
- package/skills/gsd-quick-batch/SKILL.md +105 -0
- package/skills/gsd-surface/SKILL.md +18 -8
- package/vscode/package.json +1 -1
- package/bin/lib/ui-safety-gate.cjs +0 -109
- package/scripts/lint-emitted-drift-ack.cjs +0 -344
- package/scripts/state-write-path-drift-baseline.json +0 -19
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* docs-guard-registry.cjs — the sole source of truth for which doc-reading
|
|
6
|
+
* test files the docs-guard lane must run.
|
|
7
|
+
*
|
|
8
|
+
* ## Why this is its own module, not a `scripts/ci-test-scope.cjs` RULE
|
|
9
|
+
*
|
|
10
|
+
* A prior version of this PR added a `docs guards` RULE to `RULES` in
|
|
11
|
+
* scripts/ci-test-scope.cjs, on the theory that classify()'s `!codeChanged`
|
|
12
|
+
* normalization (which zeroes fullMatrix/targeted_tests/windows_tests for
|
|
13
|
+
* docs-only diffs) made the RULE inert to classify()'s scope decision.
|
|
14
|
+
*
|
|
15
|
+
* That is true for docs-ONLY diffs and FALSE for MIXED docs+code diffs:
|
|
16
|
+
* `codeChanged` is true whenever ANY changed file is product/pipeline code,
|
|
17
|
+
* so the normalization never runs, and every one of this registry's test
|
|
18
|
+
* files joined `targeted_tests` for every mixed PR. Probed on that version:
|
|
19
|
+
* `node scripts/ci-test-scope.cjs --files "docs/a.md src/semver.cts"`
|
|
20
|
+
* returned 25 targeted_tests, vs. 3 on `origin/next` — an unstated blowup
|
|
21
|
+
* of the scoped/targeted lane on every mixed docs+code PR.
|
|
22
|
+
*
|
|
23
|
+
* Root cause: `RULES` answers "given these changed files, what should
|
|
24
|
+
* test.yml run" for the MAIN scoped-lane pipeline. The docs-guard registry
|
|
25
|
+
* is a LANE MANIFEST for a completely different consumer (the `docs-lint`
|
|
26
|
+
* job in .github/workflows/docs-required.yml, gated on a `docs_changed`
|
|
27
|
+
* step output). Putting a lane manifest inside a scope-classification rule
|
|
28
|
+
* set was the defect; extracting it here removes any path by which it can
|
|
29
|
+
* influence classify() at all.
|
|
30
|
+
*
|
|
31
|
+
* ## Who reads this
|
|
32
|
+
*
|
|
33
|
+
* - .github/workflows/docs-required.yml (`docs-lint` job) — derives the
|
|
34
|
+
* PER-PR-SELECTED subset of this registry from scripts/select-docs-guards.cjs,
|
|
35
|
+
* which is itself driven by this module's DOCS_GUARD_TESTS map. This job has
|
|
36
|
+
* no `paths:` filter, so it always reports a status and can supply the
|
|
37
|
+
* already-required `docs-lint` context; a dedicated `paths:`-filtered
|
|
38
|
+
* workflow cannot be made required without hanging non-docs PRs forever.
|
|
39
|
+
* - scripts/lint-docs-guard-registration.cjs — derives its registration
|
|
40
|
+
* lint's comparison set from this module (so a docs-reading test file
|
|
41
|
+
* that is neither registered here nor exempted fails the lint).
|
|
42
|
+
* - scripts/select-docs-guards.cjs — the pure selector that maps a PR's
|
|
43
|
+
* changed docs/ paths to the subset of this registry that actually needs
|
|
44
|
+
* to run (#3753 follow-up: a flat "run everything" list is disproportionate
|
|
45
|
+
* for a single-file docs typo fix).
|
|
46
|
+
*
|
|
47
|
+
* ## Registry shape (#3753 follow-up)
|
|
48
|
+
*
|
|
49
|
+
* `DOCS_GUARD_TESTS` is a MAP from test file path to the array of docs/
|
|
50
|
+
* paths it actually reads, so a changed-docs-file can be resolved to the
|
|
51
|
+
* narrow subset of guards that read it, instead of always running the
|
|
52
|
+
* entire registry. Each value is a non-empty array of PATTERNS:
|
|
53
|
+
*
|
|
54
|
+
* - a plain path (e.g. `'docs/AGENTS.md'`) matches that exact file only;
|
|
55
|
+
* - a trailing-slash path (e.g. `'docs/adr/'`) matches any changed path
|
|
56
|
+
* under that directory prefix — use this for a test that walks or
|
|
57
|
+
* `readdirSync`s a whole docs/ subdirectory;
|
|
58
|
+
* - the sentinel `'*'` means "run on ANY docs/ change" — reserved for a
|
|
59
|
+
* test that cannot be resolved to a narrower set of paths (the path is
|
|
60
|
+
* computed, looped over an unresolvable variable, or the test walks
|
|
61
|
+
* docs/ generally). Conservative fallback: when in doubt, use `'*'`,
|
|
62
|
+
* never a guessed-narrow path — a false negative here (a guard that
|
|
63
|
+
* silently stops running) is exactly the #3753 defect class this
|
|
64
|
+
* registry exists to prevent.
|
|
65
|
+
*
|
|
66
|
+
* `DOCS_GUARD_TEST_FILES` (derived: `Object.keys(DOCS_GUARD_TESTS)`) is kept
|
|
67
|
+
* as a flat array export so the registration lint and its parity test
|
|
68
|
+
* continue to consume a plain file list without needing to know about the
|
|
69
|
+
* map shape.
|
|
70
|
+
*
|
|
71
|
+
* ## Adding a docs guard
|
|
72
|
+
*
|
|
73
|
+
* Add the test file's path (relative to the repo root, `tests/<file>`) as a
|
|
74
|
+
* key in DOCS_GUARD_TESTS below, with the docs/ paths it reads as the value
|
|
75
|
+
* (or `['*']` if that cannot be resolved narrowly). Do not duplicate this
|
|
76
|
+
* list anywhere else — a second, independently maintained list is exactly
|
|
77
|
+
* the #3753 defect class (10 registered-but-not-run guards, silently
|
|
78
|
+
* drifted) this registry exists to prevent from recurring.
|
|
79
|
+
*
|
|
80
|
+
* Sorted alphabetically by basename for unambiguous diffs.
|
|
81
|
+
*/
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Duplicate of scripts/run-tests.cjs:50's `SUITES` array. That array is not
|
|
85
|
+
* exported by run-tests.cjs (module.exports there is deliberately narrow;
|
|
86
|
+
* run-tests.cjs's own behavior is intentional and out of scope for this
|
|
87
|
+
* registry to alter), so it cannot be imported directly without changing a
|
|
88
|
+
* shared, behavior-locked file.
|
|
89
|
+
*
|
|
90
|
+
* Why this must exist at all: `run-tests.cjs`'s `selectExplicitFiles`
|
|
91
|
+
* (scripts/run-tests.cjs:651) treats any registry entry that EQUALS a
|
|
92
|
+
* SUITES member (e.g. `all`, `unit`) as a suite selector, not a filename —
|
|
93
|
+
* so a typo in DOCS_GUARD_TESTS matching a suite name would silently run
|
|
94
|
+
* the ENTIRE suite inside the required `docs-lint` job instead of erroring.
|
|
95
|
+
* `assertNoSuiteCollision` below rejects that at the registry boundary
|
|
96
|
+
* instead.
|
|
97
|
+
*
|
|
98
|
+
* Divergence risk: if run-tests.cjs's real SUITES list ever changes and this
|
|
99
|
+
* copy is not updated, this check could under- or over-reject. That risk is
|
|
100
|
+
* covered by a parity test (tests/ci-docs-guard-registry.test.cjs) that
|
|
101
|
+
* drives run-tests.cjs's own exported `selectExplicitFiles` behaviorally —
|
|
102
|
+
* for every token here it asserts run-tests.cjs treats it as a suite
|
|
103
|
+
* selector (never "file not found"), and for a control non-member it
|
|
104
|
+
* asserts the opposite — so a real divergence fails that test rather than
|
|
105
|
+
* silently drifting.
|
|
106
|
+
*/
|
|
107
|
+
const RUN_TESTS_SUITES = ['all', 'unit', 'integration', 'install', 'security', 'slow', 'qa'];
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Normalize a registry entry EXACTLY the way scripts/run-tests.cjs's
|
|
111
|
+
* `splitFileList` (:617-625) normalizes a requested token before its SUITES
|
|
112
|
+
* check (:651): strip a leading `tests/` and normalize `\`->`/`. Without this,
|
|
113
|
+
* comparing RAW registry keys (which all carry the `tests/` prefix by
|
|
114
|
+
* convention) against RUN_TESTS_SUITES misses the realistic typo `'tests/all'`
|
|
115
|
+
* entirely — proven by probe: `assertNoSuiteCollision(['tests/all'])` did not
|
|
116
|
+
* throw, and `selectExplicitFiles(allFiles, 'tests/all')` selected all 824
|
|
117
|
+
* files (the whole suite) inside the required docs-lint job.
|
|
118
|
+
*
|
|
119
|
+
* @param {string} t
|
|
120
|
+
* @returns {string}
|
|
121
|
+
*/
|
|
122
|
+
function normalizeForSuiteCheck(t) {
|
|
123
|
+
return t.replace(/\\/g, '/').replace(/^tests\//, '');
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Reject any docs-guard registry entry that collides with a run-tests.cjs
|
|
128
|
+
* suite token (see RUN_TESTS_SUITES doc comment above). Throws with every
|
|
129
|
+
* offending entry named, rather than failing on only the first. Compares
|
|
130
|
+
* entries AFTER normalizeForSuiteCheck, mirroring run-tests.cjs's own
|
|
131
|
+
* splitFileList normalization, so a `tests/`-prefixed or backslash-spelled
|
|
132
|
+
* entry that would collide post-normalization is caught here too.
|
|
133
|
+
*
|
|
134
|
+
* @param {string[]} tests
|
|
135
|
+
*/
|
|
136
|
+
function assertNoSuiteCollision(tests) {
|
|
137
|
+
const collisions = tests.filter((t) => RUN_TESTS_SUITES.includes(normalizeForSuiteCheck(t)));
|
|
138
|
+
if (collisions.length > 0) {
|
|
139
|
+
throw new Error(
|
|
140
|
+
'docs-guard-registry: DOCS_GUARD_TESTS entry collides with a run-tests.cjs SUITES token ' +
|
|
141
|
+
`(${collisions.join(', ')}) — scripts/run-tests.cjs:651's selectExplicitFiles treats a ` +
|
|
142
|
+
'registry entry that equals a suite name as a suite selector, not a filename, so this ' +
|
|
143
|
+
'would silently run the entire suite instead of the intended file(s). Fix the registry entry.',
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Map from docs-guard test file to the docs/ path patterns it reads. See
|
|
150
|
+
* this module's header comment for pattern semantics (exact / trailing-slash
|
|
151
|
+
* dir-prefix / `'*'` sentinel). Every value here was derived by reading the
|
|
152
|
+
* test file's actual read call(s) — not guessed — per #3753's own lesson: an
|
|
153
|
+
* unresolvable read is recorded as `'*'`, never a narrowed guess.
|
|
154
|
+
*/
|
|
155
|
+
const DOCS_GUARD_TESTS = {
|
|
156
|
+
'tests/adr-15-progress-converge.test.cjs': [
|
|
157
|
+
'docs/COMMANDS.md',
|
|
158
|
+
'docs/how-to/run-phases-autonomously.md',
|
|
159
|
+
],
|
|
160
|
+
// Walks docs/adr/ as a directory (builds/reads docs/adr/README.md and
|
|
161
|
+
// fixture ADRs throughout) and separately reads docs/contributor-standards.md.
|
|
162
|
+
'tests/adr-index-gate.test.cjs': ['docs/adr/', 'docs/contributor-standards.md'],
|
|
163
|
+
|
|
164
|
+
// Walks docs/features/ as a directory (the fragment corpus) and asserts the
|
|
165
|
+
// committed docs/FEATURES.md equals the generated projection of it (#3840).
|
|
166
|
+
'tests/features-index-gate.test.cjs': ['docs/features/', 'docs/FEATURES.md'],
|
|
167
|
+
'tests/agent-classification-parity.test.cjs': ['docs/AGENTS.md', 'docs/INVENTORY.md'],
|
|
168
|
+
// #3683: pins the learnings feature section's agreement with the canonical
|
|
169
|
+
// artifact registry (reads docs/FEATURES.md around the extract-learnings
|
|
170
|
+
// entry).
|
|
171
|
+
'tests/learnings.test.cjs': ['docs/FEATURES.md'],
|
|
172
|
+
'tests/analyze-dependencies.test.cjs': ['docs/COMMANDS.md'],
|
|
173
|
+
'tests/autonomous-converge.test.cjs': [
|
|
174
|
+
'docs/COMMANDS.md',
|
|
175
|
+
'docs/how-to/run-phases-autonomously.md',
|
|
176
|
+
],
|
|
177
|
+
'tests/capability-matrix-sync.test.cjs': ['docs/reference/capability-matrix.md'],
|
|
178
|
+
'tests/capability-registry.test.cjs': [
|
|
179
|
+
'docs/tutorials/build-your-first-capability.md',
|
|
180
|
+
'docs/tutorials/install-your-first-capability.md',
|
|
181
|
+
'docs/reference/capability-manifest.md',
|
|
182
|
+
],
|
|
183
|
+
'tests/claude-md.test.cjs': ['docs/COMMANDS.md'],
|
|
184
|
+
'tests/claude-orchestration.test.cjs': ['docs/explanation/claude-orchestration-capability.md'],
|
|
185
|
+
'tests/command-contract.test.cjs': [
|
|
186
|
+
'docs/INVENTORY.md',
|
|
187
|
+
'docs/ja-JP/INVENTORY.md',
|
|
188
|
+
'docs/ko-KR/INVENTORY.md',
|
|
189
|
+
'docs/zh-CN/INVENTORY.md',
|
|
190
|
+
'docs/pt-BR/INVENTORY.md',
|
|
191
|
+
],
|
|
192
|
+
// uncoveredFiles(...) scans 'docs' as a generic coverage-scan root
|
|
193
|
+
// (commit-files-pathspec.test.cjs:1618) — cannot be resolved to specific
|
|
194
|
+
// files without re-deriving the scan's own file-discovery logic.
|
|
195
|
+
'tests/commit-files-pathspec.test.cjs': ['*'],
|
|
196
|
+
'tests/config-field-docs.test.cjs': ['docs/CONFIGURATION.md'],
|
|
197
|
+
'tests/config.test.cjs': ['docs/CONFIGURATION.md'],
|
|
198
|
+
'tests/context-index-sync.test.cjs': ['docs/CONTEXT-INDEX.json'],
|
|
199
|
+
'tests/context-predicates-query.test.cjs': ['docs/contributor-standards.md'],
|
|
200
|
+
// SCAN_DIRS includes 'docs' and recursively walks every .md file under it
|
|
201
|
+
// (context7-tool-name-parity.test.cjs:31-38) — a generic tree walk, not a
|
|
202
|
+
// fixed file set.
|
|
203
|
+
'tests/context7-tool-name-parity.test.cjs': ['*'],
|
|
204
|
+
'tests/contributor-standards.test.cjs': ['docs/contributor-standards.md'],
|
|
205
|
+
'tests/cursor-reviewer.test.cjs': [
|
|
206
|
+
'docs/COMMANDS.md',
|
|
207
|
+
'docs/FEATURES.md',
|
|
208
|
+
'docs/ja-JP/COMMANDS.md',
|
|
209
|
+
'docs/ja-JP/FEATURES.md',
|
|
210
|
+
'docs/ko-KR/COMMANDS.md',
|
|
211
|
+
'docs/ko-KR/FEATURES.md',
|
|
212
|
+
],
|
|
213
|
+
'tests/discuss-all-flag.test.cjs': ['docs/COMMANDS.md'],
|
|
214
|
+
'tests/discuss-mode.test.cjs': ['docs/workflow-discuss-mode.md'],
|
|
215
|
+
// Walks docs/*.md and every docs/<locale>/*.md dir dynamically
|
|
216
|
+
// (docs-parity-live-registry.test.cjs:42, 428) — deliberately generic.
|
|
217
|
+
'tests/docs-parity-live-registry.test.cjs': ['*'],
|
|
218
|
+
// #3839: pins every hook-table Event cell in the five locales' ARCHITECTURE
|
|
219
|
+
// and INVENTORY files against src/runtime-hooks-surface.cts registrations.
|
|
220
|
+
'tests/docs-hooks-table-parity.test.cjs': [
|
|
221
|
+
'docs/ARCHITECTURE.md',
|
|
222
|
+
'docs/INVENTORY.md',
|
|
223
|
+
'docs/ja-JP/ARCHITECTURE.md',
|
|
224
|
+
'docs/ja-JP/INVENTORY.md',
|
|
225
|
+
'docs/zh-CN/ARCHITECTURE.md',
|
|
226
|
+
'docs/zh-CN/INVENTORY.md',
|
|
227
|
+
'docs/ko-KR/ARCHITECTURE.md',
|
|
228
|
+
'docs/ko-KR/INVENTORY.md',
|
|
229
|
+
'docs/pt-BR/ARCHITECTURE.md',
|
|
230
|
+
'docs/pt-BR/INVENTORY.md',
|
|
231
|
+
],
|
|
232
|
+
'tests/docs-state-md-locale-parity.test.cjs': [
|
|
233
|
+
'docs/reference/state-md.md',
|
|
234
|
+
'docs/ja-JP/reference/state-md.md',
|
|
235
|
+
'docs/zh-CN/reference/state-md.md',
|
|
236
|
+
'docs/ko-KR/reference/state-md.md',
|
|
237
|
+
'docs/pt-BR/reference/state-md.md',
|
|
238
|
+
],
|
|
239
|
+
'tests/drift-detection.test.cjs': ['docs/CONFIGURATION.md', 'docs/AGENTS.md'],
|
|
240
|
+
'tests/edge-probe-docs-fixtures.test.cjs': ['docs/adr/550-spec-phase-probe-contract.md'],
|
|
241
|
+
'tests/edit-phase.test.cjs': [
|
|
242
|
+
'docs/INVENTORY.md',
|
|
243
|
+
'docs/INVENTORY-MANIFEST.json',
|
|
244
|
+
'docs/COMMANDS.md',
|
|
245
|
+
],
|
|
246
|
+
'tests/effort-surface-axis.test.cjs': ['docs/reference/host-integration-capability-matrix.md'],
|
|
247
|
+
'tests/execute-phase-active-flags.test.cjs': [
|
|
248
|
+
'docs/reference/host-integration-capability-matrix.md',
|
|
249
|
+
],
|
|
250
|
+
'tests/execute-phase-wave.test.cjs': ['docs/COMMANDS.md'],
|
|
251
|
+
// #3913 (ADR-3889 terminal phase): reads the generated docs/reference/exit-codes.md
|
|
252
|
+
// (content invariants, F1/F3) and docs/README.md (F4, the index link).
|
|
253
|
+
'tests/exit-code-registry.test.cjs': ['docs/reference/exit-codes.md', 'docs/README.md'],
|
|
254
|
+
'tests/external-job-waiting.test.cjs': ['docs/reference/planning-artifacts.md'],
|
|
255
|
+
// Rows 8/9 (negative controls) read real docs/registries/eos.json and
|
|
256
|
+
// docs/adr/0001-dispatch-policy-module.md and assert on their EXACT
|
|
257
|
+
// committed content (an entry's name field, ADR-0001's H1 title) as a
|
|
258
|
+
// sanity check before mutating an overlay fixture — a content edit to
|
|
259
|
+
// either file changes the string this test asserts on.
|
|
260
|
+
'tests/fragment-single-edit-propagation.install.test.cjs': [
|
|
261
|
+
'docs/registries/eos.json',
|
|
262
|
+
'docs/adr/0001-dispatch-policy-module.md',
|
|
263
|
+
],
|
|
264
|
+
// Seeds a temp fixture copy of these five files (never mutates the real
|
|
265
|
+
// tree) to exercise scripts/gen-state-md-docs.cjs's marked-region splicing
|
|
266
|
+
// against them — #3873 (ADR-3473 §8.8), rows 10-22/27. Read for fixture
|
|
267
|
+
// seeding, so a content edit to any of them (e.g. renaming a landmark
|
|
268
|
+
// heading/string a hostile-input test targets) can change this test's
|
|
269
|
+
// fixture assumptions.
|
|
270
|
+
'tests/gen-state-md-docs.test.cjs': [
|
|
271
|
+
'docs/reference/state-md.md',
|
|
272
|
+
'docs/ja-JP/reference/state-md.md',
|
|
273
|
+
'docs/zh-CN/reference/state-md.md',
|
|
274
|
+
'docs/ko-KR/reference/state-md.md',
|
|
275
|
+
'docs/pt-BR/reference/state-md.md',
|
|
276
|
+
],
|
|
277
|
+
'tests/gsd-write-guard.test.cjs': ['docs/USER-GUIDE.md'],
|
|
278
|
+
'tests/host-integration-descriptors.test.cjs': [
|
|
279
|
+
'docs/reference/host-integration-capability-matrix.md',
|
|
280
|
+
],
|
|
281
|
+
'tests/install.test.cjs': ['docs/AGENTS.md', 'docs/INVENTORY.md', 'docs/INVENTORY-MANIFEST.json'],
|
|
282
|
+
// SOURCE_DIRS includes 'docs' and walks it recursively for every .md file
|
|
283
|
+
// (intel.test.cjs:1223-1228) — a generic tree walk.
|
|
284
|
+
'tests/intel.test.cjs': ['*'],
|
|
285
|
+
'tests/inventory-headings-countfree.test.cjs': ['docs/INVENTORY.md'],
|
|
286
|
+
'tests/inventory-manifest-sync.test.cjs': ['docs/INVENTORY.md', 'docs/INVENTORY-MANIFEST.json'],
|
|
287
|
+
'tests/kilo-upgrades.test.cjs': ['docs/how-to/connect-gsd-mcp-server.md'],
|
|
288
|
+
'tests/live-config-guard.test.cjs': ['docs/TESTING-SUITES.md'],
|
|
289
|
+
// #3726: pins the `milestone complete` synopsis (English + four localized
|
|
290
|
+
// mirrors), the `--confirm` flag row and the guard-override instructions —
|
|
291
|
+
// `type: Fixed` exempts that PR from the docs-required lint, so this is the
|
|
292
|
+
// only gate on that prose.
|
|
293
|
+
'tests/milestone.test.cjs': [
|
|
294
|
+
'docs/CLI-TOOLS.md',
|
|
295
|
+
'docs/COMMANDS.md',
|
|
296
|
+
'docs/ja-JP/CLI-TOOLS.md',
|
|
297
|
+
'docs/ko-KR/CLI-TOOLS.md',
|
|
298
|
+
'docs/pt-BR/CLI-TOOLS.md',
|
|
299
|
+
'docs/zh-CN/CLI-TOOLS.md',
|
|
300
|
+
],
|
|
301
|
+
'tests/model-catalog-runtime-defaults.test.cjs': ['docs/CONFIGURATION.md'],
|
|
302
|
+
// Scans every git-tracked file in the whole repo via `git ls-files`
|
|
303
|
+
// (no-pending-3212-markers.test.cjs:37-46), which includes all of docs/ —
|
|
304
|
+
// cannot be resolved to a fixed docs/ path set.
|
|
305
|
+
'tests/no-pending-3212-markers.test.cjs': ['*'],
|
|
306
|
+
'tests/phase6-capability-docs.test.cjs': ['docs/how-to/develop-a-capability.md', 'docs/README.md'],
|
|
307
|
+
'tests/phase6-review-capabilities.test.cjs': [
|
|
308
|
+
'docs/reference/review-verification-capabilities.md',
|
|
309
|
+
'docs/how-to/develop-a-capability.md',
|
|
310
|
+
'docs/README.md',
|
|
311
|
+
],
|
|
312
|
+
'tests/plan-checker-coupling.test.cjs': ['docs/AGENTS.md'],
|
|
313
|
+
'tests/plan-phase-drift-guard.test.cjs': [
|
|
314
|
+
'docs/CONFIGURATION.md',
|
|
315
|
+
'docs/COMMANDS.md',
|
|
316
|
+
'docs/USER-GUIDE.md',
|
|
317
|
+
'docs/ARCHITECTURE.md',
|
|
318
|
+
'docs/INVENTORY.md',
|
|
319
|
+
'docs/INVENTORY-MANIFEST.json',
|
|
320
|
+
],
|
|
321
|
+
'tests/plan-phase-stall-detection.test.cjs': ['docs/CONFIGURATION.md'],
|
|
322
|
+
'tests/plan-review-convergence.test.cjs': [
|
|
323
|
+
'docs/CONFIGURATION.md',
|
|
324
|
+
'docs/USER-GUIDE.md',
|
|
325
|
+
'docs/ARCHITECTURE.md',
|
|
326
|
+
],
|
|
327
|
+
'tests/planner-estimate-emission.test.cjs': ['docs/reference/plan-md.md', 'docs/CONFIGURATION.md'],
|
|
328
|
+
'tests/precondition-element.test.cjs': ['docs/reference/plan-md.md'],
|
|
329
|
+
'tests/product-name-purity.test.cjs': [
|
|
330
|
+
'docs/README.md',
|
|
331
|
+
'docs/zh-CN/README.md',
|
|
332
|
+
'docs/ko-KR/README.md',
|
|
333
|
+
'docs/ja-JP/README.md',
|
|
334
|
+
'docs/pt-BR/README.md',
|
|
335
|
+
],
|
|
336
|
+
'tests/progress-forensic.test.cjs': ['docs/COMMANDS.md'],
|
|
337
|
+
'tests/repo-layout.test.cjs': ['docs/contributing/bootstrap.md'],
|
|
338
|
+
// Reads REQ-LANG-04 and runs every form it offers an author through the
|
|
339
|
+
// matcher that enforces it, so a reword of the requirement alone is exactly
|
|
340
|
+
// the change this guard must run on (#2529). Both paths are named because
|
|
341
|
+
// #3840 made docs/FEATURES.md a generated projection: the requirement's
|
|
342
|
+
// source is the fragment, and an edit there that is not regenerated would
|
|
343
|
+
// otherwise reach this guard through neither path.
|
|
344
|
+
'tests/response-language-coverage.test.cjs': [
|
|
345
|
+
'docs/FEATURES.md',
|
|
346
|
+
'docs/features/response-language-config.md',
|
|
347
|
+
],
|
|
348
|
+
'tests/reversibility-tagging.test.cjs': ['docs/reference/plan-md.md'],
|
|
349
|
+
'tests/reviewer-docs-parity.test.cjs': [
|
|
350
|
+
'docs/COMMANDS.md',
|
|
351
|
+
'docs/ja-JP/COMMANDS.md',
|
|
352
|
+
'docs/ko-KR/COMMANDS.md',
|
|
353
|
+
'docs/pt-BR/COMMANDS.md',
|
|
354
|
+
'docs/zh-CN/COMMANDS.md',
|
|
355
|
+
'docs/FEATURES.md',
|
|
356
|
+
'docs/ja-JP/FEATURES.md',
|
|
357
|
+
'docs/ko-KR/FEATURES.md',
|
|
358
|
+
'docs/pt-BR/FEATURES.md',
|
|
359
|
+
'docs/zh-CN/FEATURES.md',
|
|
360
|
+
],
|
|
361
|
+
'tests/runtime-converters.test.cjs': ['docs/CONFIGURATION.md'],
|
|
362
|
+
'tests/secure-phase.test.cjs': ['docs/CONFIGURATION.md'],
|
|
363
|
+
'tests/security-dead-exports.regression.test.cjs': ['docs/FEATURES.md'],
|
|
364
|
+
'tests/security.test.cjs': ['docs/INVENTORY-MANIFEST.json'],
|
|
365
|
+
// Walks docs/ recursively (todos-done-rename-guard.test.cjs:19-22
|
|
366
|
+
// SCAN_DIRS) looking for stale references — a generic tree walk.
|
|
367
|
+
'tests/todos-done-rename-guard.test.cjs': ['*'],
|
|
368
|
+
'tests/tracer-bullet.test.cjs': [
|
|
369
|
+
'docs/COMMANDS.md',
|
|
370
|
+
'docs/reference/plan-md.md',
|
|
371
|
+
'docs/how-to/plan-a-phase.md',
|
|
372
|
+
'docs/AGENTS.md',
|
|
373
|
+
],
|
|
374
|
+
'tests/ui-spec-inventory-provenance.test.cjs': [
|
|
375
|
+
'docs/FEATURES.md',
|
|
376
|
+
'docs/how-to/design-a-ui-phase.md',
|
|
377
|
+
'docs/ja-JP/FEATURES.md',
|
|
378
|
+
'docs/ja-JP/how-to/design-a-ui-phase.md',
|
|
379
|
+
'docs/zh-CN/FEATURES.md',
|
|
380
|
+
'docs/zh-CN/how-to/design-a-ui-phase.md',
|
|
381
|
+
'docs/ko-KR/FEATURES.md',
|
|
382
|
+
'docs/ko-KR/how-to/design-a-ui-phase.md',
|
|
383
|
+
'docs/pt-BR/how-to/design-a-ui-phase.md',
|
|
384
|
+
],
|
|
385
|
+
'tests/verifier-behavior-unverified.test.cjs': ['docs/reference/planning-artifacts.md'],
|
|
386
|
+
'tests/verifier-coincidental-reliance.test.cjs': ['docs/AGENTS.md'],
|
|
387
|
+
'tests/verify.test.cjs': ['docs/reference/plan-md.md'],
|
|
388
|
+
'tests/workflow-fragments.test.cjs': ['docs/reference/workflow-fragments.md'],
|
|
389
|
+
};
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Flat file-list view of DOCS_GUARD_TESTS, kept for consumers (the
|
|
393
|
+
* registration lint and its parity test) that only need "which test files
|
|
394
|
+
* are registered", not their per-file docs path patterns.
|
|
395
|
+
*/
|
|
396
|
+
const DOCS_GUARD_TEST_FILES = Object.keys(DOCS_GUARD_TESTS);
|
|
397
|
+
|
|
398
|
+
assertNoSuiteCollision(DOCS_GUARD_TEST_FILES);
|
|
399
|
+
|
|
400
|
+
module.exports = {
|
|
401
|
+
DOCS_GUARD_TESTS,
|
|
402
|
+
DOCS_GUARD_TEST_FILES,
|
|
403
|
+
RUN_TESTS_SUITES,
|
|
404
|
+
assertNoSuiteCollision,
|
|
405
|
+
normalizeForSuiteCheck,
|
|
406
|
+
};
|
|
@@ -33,8 +33,8 @@ const CONFIG_SCHEMA_PATH = path.join(ROOT, 'gsd-core', 'bin', 'shared', 'config-
|
|
|
33
33
|
// registry generator and the loop-host-contract generator share one source of truth.
|
|
34
34
|
const { LOOP_HOST_CONTRACT } = require('../gsd-core/bin/lib/loop-host-contract.cjs');
|
|
35
35
|
|
|
36
|
-
// Wired-
|
|
37
|
-
const {
|
|
36
|
+
// Wired-kinds helper — per point, which hook kinds the render-hooks call sites' dispatch text covers.
|
|
37
|
+
const { getWiredKinds } = require('./gen-loop-host-contract.cjs');
|
|
38
38
|
|
|
39
39
|
// Capability validator — shared runtime-callable module extracted per ADR-1244 D2.
|
|
40
40
|
const capValidator = require('../gsd-core/bin/lib/capability-validator.cjs');
|
|
@@ -419,9 +419,11 @@ function loadAndValidate(centralKeys, capabilitiesDir, centralPatterns) {
|
|
|
419
419
|
return { capMap, errors, warnings };
|
|
420
420
|
}
|
|
421
421
|
|
|
422
|
-
// Compute wired points ONCE before iterating capabilities so
|
|
423
|
-
// scan is not repeated per-capability. ROOT is the repo root
|
|
424
|
-
|
|
422
|
+
// Compute wired points + covered kinds ONCE before iterating capabilities so
|
|
423
|
+
// the filesystem scan is not repeated per-capability. ROOT is the repo root
|
|
424
|
+
// (defined at top of file). #3606: the kinds map carries, per point, which
|
|
425
|
+
// hook kinds the call sites' dispatch text actually covers.
|
|
426
|
+
const wiredKinds = getWiredKinds(ROOT);
|
|
425
427
|
|
|
426
428
|
const folderEntries = fs.readdirSync(resolvedCapDir, { withFileTypes: true })
|
|
427
429
|
.filter((e) => e.isDirectory())
|
|
@@ -459,7 +461,7 @@ function loadAndValidate(centralKeys, capabilitiesDir, centralPatterns) {
|
|
|
459
461
|
}
|
|
460
462
|
|
|
461
463
|
// Gen-time wired guard: reject hooks that declare a valid point with no call site.
|
|
462
|
-
const wiredErrors = validateHooksWired(cap,
|
|
464
|
+
const wiredErrors = validateHooksWired(cap, wiredKinds);
|
|
463
465
|
if (wiredErrors.length > 0) {
|
|
464
466
|
for (const e of wiredErrors) errors.push(folderId + '/capability.json: ' + e);
|
|
465
467
|
continue;
|