@opengsd/gsd-core 1.14.0 → 1.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.opencode/plugins/gsd-core.js +85 -5
- package/README.ja-JP.md +3 -3
- package/README.ko-KR.md +3 -3
- package/README.pt-BR.md +3 -3
- package/README.zh-CN.md +3 -3
- package/agents/gsd-code-fixer.compact.md +7 -6
- package/agents/gsd-code-fixer.md +9 -8
- package/agents/gsd-code-reviewer.compact.md +5 -3
- package/agents/gsd-code-reviewer.md +8 -6
- package/agents/gsd-debug-session-manager.compact.md +17 -2
- package/agents/gsd-debug-session-manager.md +17 -2
- package/agents/gsd-debugger.md +3 -3
- package/agents/gsd-eval-auditor.compact.md +1 -1
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-executor.md +17 -12
- package/agents/gsd-intel-updater.compact.md +1 -1
- package/agents/gsd-intel-updater.md +1 -1
- package/agents/gsd-mempalace-curator.md +2 -2
- package/agents/gsd-phase-researcher.md +19 -11
- package/agents/gsd-plan-checker.md +15 -9
- package/agents/gsd-planner.md +15 -11
- package/agents/gsd-project-researcher.compact.md +1 -1
- package/agents/gsd-project-researcher.md +1 -1
- package/agents/gsd-research-synthesizer.compact.md +1 -1
- package/agents/gsd-research-synthesizer.md +1 -1
- package/agents/gsd-ui-auditor.compact.md +21 -30
- package/agents/gsd-ui-auditor.md +166 -37
- package/agents/gsd-ui-researcher.compact.md +1 -1
- package/agents/gsd-ui-researcher.md +1 -1
- package/agents/gsd-verifier.md +37 -14
- package/bin/install.js +764 -287
- package/commands/gsd/add-tests.md +6 -1
- package/commands/gsd/ai-integration-phase.md +6 -1
- package/commands/gsd/audit-fix.md +5 -0
- package/commands/gsd/audit-milestone.md +6 -1
- package/commands/gsd/autonomous.md +7 -2
- package/commands/gsd/capture.md +9 -5
- package/commands/gsd/code-review.md +7 -2
- package/commands/gsd/complete-milestone.md +4 -0
- package/commands/gsd/config.md +7 -3
- package/commands/gsd/debug.md +11 -7
- package/commands/gsd/discuss-phase.md +7 -3
- package/commands/gsd/docs-update.md +12 -7
- package/commands/gsd/eval-review.md +6 -1
- package/commands/gsd/execute-phase.md +12 -7
- package/commands/gsd/extract-learnings.md +5 -0
- package/commands/gsd/fast.md +4 -0
- package/commands/gsd/forensics.md +5 -1
- package/commands/gsd/graphify.md +10 -6
- package/commands/gsd/health.md +5 -0
- package/commands/gsd/help.md +7 -2
- package/commands/gsd/import.md +7 -3
- package/commands/gsd/inbox.md +5 -0
- package/commands/gsd/ingest-docs.md +5 -1
- package/commands/gsd/manager.md +6 -1
- package/commands/gsd/map-codebase.md +7 -3
- package/commands/gsd/mempalace-capture.md +12 -4
- package/commands/gsd/mempalace-recall.md +5 -1
- package/commands/gsd/milestone-summary.md +5 -1
- package/commands/gsd/mvp-phase.md +8 -3
- package/commands/gsd/new-milestone.md +6 -1
- package/commands/gsd/new-project.md +5 -0
- package/commands/gsd/next.md +6 -1
- package/commands/gsd/ns-context.md +4 -0
- package/commands/gsd/ns-ideate.md +4 -0
- package/commands/gsd/ns-manage.md +4 -0
- package/commands/gsd/ns-project.md +4 -0
- package/commands/gsd/ns-review.md +4 -0
- package/commands/gsd/ns-workflow.md +4 -0
- package/commands/gsd/onboard.md +6 -1
- package/commands/gsd/pause-work.md +5 -1
- package/commands/gsd/phase.md +8 -4
- package/commands/gsd/plan-phase.md +6 -1
- package/commands/gsd/plan-review-convergence.md +11 -7
- package/commands/gsd/pr-branch.md +4 -0
- package/commands/gsd/profile-user.md +5 -1
- package/commands/gsd/progress.md +7 -2
- package/commands/gsd/quick-batch.md +21 -9
- package/commands/gsd/quick.md +12 -7
- package/commands/gsd/review.md +7 -4
- package/commands/gsd/secure-phase.md +6 -1
- package/commands/gsd/ship.md +5 -0
- package/commands/gsd/sketch.md +7 -2
- package/commands/gsd/spec-phase.md +5 -1
- package/commands/gsd/spike.md +8 -3
- package/commands/gsd/surface.md +5 -1
- package/commands/gsd/thread.md +4 -0
- package/commands/gsd/ui-phase.md +6 -1
- package/commands/gsd/ui-review.md +6 -1
- package/commands/gsd/ultraplan-phase.md +5 -1
- package/commands/gsd/undo.md +5 -1
- package/commands/gsd/update.md +6 -2
- package/commands/gsd/validate-phase.md +6 -1
- package/commands/gsd/verify-work.md +6 -1
- package/commands/gsd/workspace.md +7 -3
- package/gsd-core/bin/gsd-tools.cjs +477 -78
- package/gsd-core/bin/lib/active-workstream-store.cjs +15 -0
- package/gsd-core/bin/lib/adr-parser.cjs +3 -1
- package/gsd-core/bin/lib/agent-install-check.cjs +4 -1
- package/gsd-core/bin/lib/audit.cjs +144 -42
- package/gsd-core/bin/lib/broken-windows.cjs +13 -13
- package/gsd-core/bin/lib/capability-activation.cjs +9 -4
- package/gsd-core/bin/lib/capability-registry.cjs +197 -222
- package/gsd-core/bin/lib/capability-validator.cjs +16 -1
- package/gsd-core/bin/lib/check-auto-mode.cjs +35 -0
- package/gsd-core/bin/lib/check-command-router.cjs +164 -1625
- package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +13 -2
- package/gsd-core/bin/lib/cli-exit.cjs +12 -0
- package/gsd-core/bin/lib/codex-agent-toml.cjs +32 -33
- package/gsd-core/bin/lib/command-aliases.cjs +7 -0
- package/gsd-core/bin/lib/command-routing-hub.cjs +48 -1
- package/gsd-core/bin/lib/commands.cjs +343 -207
- package/gsd-core/bin/lib/complexity-trigger.cjs +8 -7
- package/gsd-core/bin/lib/config-loader.cjs +65 -4
- package/gsd-core/bin/lib/config.cjs +76 -19
- package/gsd-core/bin/lib/core-utils.cjs +6 -1
- package/gsd-core/bin/lib/coverage.cjs +4 -8
- package/gsd-core/bin/lib/decision-coverage-support.cjs +259 -0
- package/gsd-core/bin/lib/decisions.cjs +30 -14
- package/gsd-core/bin/lib/drift.cjs +177 -42
- package/gsd-core/bin/lib/frontmatter-fence.cjs +90 -0
- package/gsd-core/bin/lib/frontmatter-splice.cjs +494 -0
- package/gsd-core/bin/lib/frontmatter.cjs +426 -234
- package/gsd-core/bin/lib/gap-checker.cjs +72 -29
- package/gsd-core/bin/lib/gate-api-coverage-verify-pre.cjs +381 -0
- package/gsd-core/bin/lib/gate-args.cjs +53 -0
- package/gsd-core/bin/lib/gate-codebase-drift.cjs +285 -0
- package/gsd-core/bin/lib/gate-config.cjs +46 -0
- package/gsd-core/bin/lib/gate-context-drift.cjs +141 -0
- package/gsd-core/bin/lib/gate-decision-coverage-plan.cjs +169 -0
- package/gsd-core/bin/lib/gate-decision-coverage-verify.cjs +126 -0
- package/gsd-core/bin/lib/gate-evaluation-scope.cjs +555 -0
- package/gsd-core/bin/lib/gate-evidence.cjs +138 -0
- package/gsd-core/bin/lib/gate-exit.cjs +27 -0
- package/gsd-core/bin/lib/gate-gap-analysis-plan-post.cjs +61 -0
- package/gsd-core/bin/lib/gate-phase-context.cjs +170 -0
- package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +1 -1
- package/gsd-core/bin/lib/gate-predicate.cjs +165 -0
- package/gsd-core/bin/lib/gate-prohibition-enforcement.cjs +94 -0
- package/gsd-core/bin/lib/gate-schema-drift.cjs +165 -0
- package/gsd-core/bin/lib/gate-tdd-red-evidence.cjs +100 -0
- package/gsd-core/bin/lib/gate-tdd-review-checkpoint.cjs +182 -0
- package/gsd-core/bin/lib/gate-ui-plan.cjs +86 -0
- package/gsd-core/bin/lib/gate-ui-safety.cjs +80 -0
- package/gsd-core/bin/lib/gate-verdict.cjs +64 -0
- package/gsd-core/bin/lib/gate-verify-command-paths.cjs +78 -0
- package/gsd-core/bin/lib/gate-verify-failure-directions.cjs +41 -0
- package/gsd-core/bin/lib/graphify.cjs +10 -2
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +43 -47
- package/gsd-core/bin/lib/health-diagnostic.cjs +45 -8
- package/gsd-core/bin/lib/host-runtime-detection.cjs +9 -0
- package/gsd-core/bin/lib/init.cjs +364 -132
- package/gsd-core/bin/lib/install-engine.cjs +30 -33
- package/gsd-core/bin/lib/install-profiles.cjs +7 -4
- package/gsd-core/bin/lib/installer-migrations.cjs +8 -1
- package/gsd-core/bin/lib/io.cjs +122 -3
- package/gsd-core/bin/lib/loop-resolver.cjs +95 -0
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +75 -1
- package/gsd-core/bin/lib/milestone.cjs +37 -6
- package/gsd-core/bin/lib/model-resolver.cjs +171 -62
- package/gsd-core/bin/lib/observability/event.cjs +1 -1
- package/gsd-core/bin/lib/observability/logger.cjs +46 -1
- package/gsd-core/bin/lib/pattern.cjs +10 -0
- package/gsd-core/bin/lib/phase-command-router.cjs +20 -5
- package/gsd-core/bin/lib/phase-estimation.cjs +5 -4
- package/gsd-core/bin/lib/phase-id-card.cjs +32 -0
- package/gsd-core/bin/lib/phase-id-display.cjs +78 -0
- package/gsd-core/bin/lib/phase-id.cjs +110 -8
- package/gsd-core/bin/lib/phase-lifecycle.cjs +9 -2
- package/gsd-core/bin/lib/phase-locator.cjs +29 -10
- package/gsd-core/bin/lib/phase-status.cjs +360 -0
- package/gsd-core/bin/lib/phase.cjs +489 -88
- package/gsd-core/bin/lib/plan-document.cjs +142 -20
- package/gsd-core/bin/lib/plan-drift-guard.cjs +5 -0
- package/gsd-core/bin/lib/planning-document.cjs +692 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +60 -9
- package/gsd-core/bin/lib/planning-snapshot.cjs +18 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +83 -55
- package/gsd-core/bin/lib/pr-branch-patterns.cjs +57 -0
- package/gsd-core/bin/lib/pristine-baseline.cjs +10 -0
- package/gsd-core/bin/lib/probe-core.cjs +7 -1
- package/gsd-core/bin/lib/profile-output.cjs +6 -3
- package/gsd-core/bin/lib/prohibition-enforcement.cjs +0 -55
- package/gsd-core/bin/lib/project-root.cjs +41 -2
- package/gsd-core/bin/lib/quick-batch-command-router.cjs +35 -9
- package/gsd-core/bin/lib/quick-batch-dispatch.cjs +11 -8
- package/gsd-core/bin/lib/real-home-guard.cjs +9 -1
- package/gsd-core/bin/lib/report-parser.cjs +269 -0
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +10 -30
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +2 -2
- package/gsd-core/bin/lib/roadmap-command-router.cjs +25 -19
- package/gsd-core/bin/lib/roadmap-parser.cjs +242 -15
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +1653 -65
- package/gsd-core/bin/lib/roadmap.cjs +405 -88
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +373 -187
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +5 -2
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +57 -1
- package/gsd-core/bin/lib/runtime-homes.cjs +14 -7
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +522 -624
- package/gsd-core/bin/lib/runtime-name-policy.cjs +246 -21
- package/gsd-core/bin/lib/runtime-slash.cjs +47 -30
- package/gsd-core/bin/lib/shell-command-projection.cjs +47 -8
- package/gsd-core/bin/lib/smart-entry.cjs +19 -3
- package/gsd-core/bin/lib/stale-bake-guard.cjs +32 -48
- package/gsd-core/bin/lib/state-contract.cjs +15 -18
- package/gsd-core/bin/lib/state-document.cjs +100 -22
- package/gsd-core/bin/lib/state-transition.cjs +39 -2
- package/gsd-core/bin/lib/state.cjs +256 -105
- package/gsd-core/bin/lib/surface.cjs +19 -2
- package/gsd-core/bin/lib/tdd-red-evidence.cjs +48 -79
- package/gsd-core/bin/lib/uat-predicate.cjs +359 -38
- package/gsd-core/bin/lib/uat.cjs +432 -7
- package/gsd-core/bin/lib/ui-consideration-probe.cjs +15 -2
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +167 -40
- package/gsd-core/bin/lib/undo-commit-selection.cjs +131 -0
- package/gsd-core/bin/lib/vendor/README.md +31 -9
- package/gsd-core/bin/lib/vendor/saxes.cjs +1934 -0
- package/gsd-core/bin/lib/vendor/saxes.cjs.LICENSE.txt +92 -0
- package/gsd-core/bin/lib/vendor/tap-parser.cjs +8927 -0
- package/gsd-core/bin/lib/vendor/tap-parser.cjs.LICENSE.txt +152 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +1378 -274
- package/gsd-core/bin/lib/verify-command-grounding.cjs +46 -2
- package/gsd-core/bin/lib/verify-command-router.cjs +18 -7
- package/gsd-core/bin/lib/verify.cjs +357 -531
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +14 -6
- package/gsd-core/bin/lib/workstream-inventory.cjs +31 -21
- package/gsd-core/bin/lib/workstream-name-policy.cjs +31 -1
- package/gsd-core/bin/lib/workstream.cjs +11 -2
- package/gsd-core/bin/lib/worktree-base-ref.cjs +482 -73
- package/gsd-core/bin/lib/worktree-safety.cjs +784 -51
- package/gsd-core/bin/shared/config-defaults.manifest.json +8 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +5 -0
- package/gsd-core/references/autonomous-smart-discuss.md +2 -1
- package/gsd-core/references/autonomous-ui-design-contract.md +3 -3
- package/gsd-core/references/checkpoints.md +5 -3
- package/gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json +28 -3
- package/gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json +37 -4
- package/gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json +28 -3
- package/gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json +28 -3
- package/gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json +37 -4
- package/gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json +37 -4
- package/gsd-core/references/edge-probe.md +195 -21
- package/gsd-core/references/execute-mvp-tdd.md +5 -10
- package/gsd-core/references/execute-phase-between-wave-reset.md +10 -6
- package/gsd-core/references/execute-phase-response-language.md +1 -1
- package/gsd-core/references/execute-phase-wave-guard.md +22 -11
- package/gsd-core/references/gsd-run-resolver.md +1 -1
- package/gsd-core/references/loop-hook-dispatch.md +7 -1
- package/gsd-core/references/model-profiles.md +1 -1
- package/gsd-core/references/offer-next.md +1 -1
- package/gsd-core/references/phase-argument-parsing.md +9 -7
- package/gsd-core/references/phase-id-convention.md +28 -0
- package/gsd-core/references/planner-gap-closure.md +2 -0
- package/gsd-core/references/planner-load-graph-context.md +24 -13
- package/gsd-core/references/planner-verify-command-grounding.md +14 -0
- package/gsd-core/references/planning-config.md +12 -3
- package/gsd-core/references/spidr-splitting.md +1 -1
- package/gsd-core/references/tdd.md +37 -8
- package/gsd-core/references/ui-consideration-probe.md +10 -5
- package/gsd-core/references/verifier-phase-gates.md +5 -2
- package/gsd-core/references/verify-command-path-resolvability.md +10 -2
- package/gsd-core/references/verify-mvp-mode.md +2 -2
- package/gsd-core/references/workstream-flag.md +33 -3
- package/gsd-core/references/worktree-path-safety.md +321 -0
- package/gsd-core/templates/README.md +1 -1
- package/gsd-core/templates/UAT.md +17 -1
- package/gsd-core/templates/config.json +2 -11
- package/gsd-core/templates/verification-report.md +1 -1
- package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
- package/gsd-core/workflows/add-backlog.md +1 -1
- package/gsd-core/workflows/add-phase.md +8 -7
- package/gsd-core/workflows/add-tests.md +4 -3
- package/gsd-core/workflows/add-todo.md +6 -5
- package/gsd-core/workflows/ai-integration-phase.md +13 -4
- package/gsd-core/workflows/audit-fix.md +1 -1
- package/gsd-core/workflows/audit-milestone.md +4 -3
- package/gsd-core/workflows/audit-uat.md +1 -1
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +9 -18
- package/gsd-core/workflows/autonomous.md +43 -23
- package/gsd-core/workflows/check-todos.md +7 -6
- package/gsd-core/workflows/cleanup.md +2 -2
- package/gsd-core/workflows/code-review/steps/dispatch-fix.md +4 -3
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +20 -13
- package/gsd-core/workflows/code-review-fix.md +112 -25
- package/gsd-core/workflows/code-review.md +146 -135
- package/gsd-core/workflows/complete-milestone/detail/elaboration.md +4 -3
- package/gsd-core/workflows/complete-milestone.md +13 -8
- package/gsd-core/workflows/debug.md +32 -7
- package/gsd-core/workflows/diagnose-issues.md +3 -2
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/chain.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions.md +4 -3
- package/gsd-core/workflows/discuss-phase.md +4 -3
- package/gsd-core/workflows/do.md +2 -2
- package/gsd-core/workflows/docs-update.md +6 -5
- package/gsd-core/workflows/edit-phase.md +4 -3
- package/gsd-core/workflows/eval-review.md +14 -5
- package/gsd-core/workflows/execute-phase/detail/elaboration.md +2 -2
- package/gsd-core/workflows/execute-phase/steps/code-review-disposition.md +1019 -0
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +15 -4
- package/gsd-core/workflows/execute-phase/steps/completion-reconciliation.md +10 -7
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +37 -3
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +3 -1
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +2 -2
- package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +46 -9
- package/gsd-core/workflows/execute-phase/steps/protected-branch.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/ready-wave-gate.md +37 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/regression-gate.md +2 -0
- package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/threat-id-gate.md +28 -0
- package/gsd-core/workflows/execute-phase/steps/verify-phase-goal.md +187 -0
- package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +2 -3
- package/gsd-core/workflows/execute-phase/steps/worktree-base-check.md +25 -0
- package/gsd-core/workflows/execute-phase.md +96 -178
- package/gsd-core/workflows/execute-plan.md +18 -23
- package/gsd-core/workflows/explore.md +4 -4
- package/gsd-core/workflows/extract-learnings.md +4 -2
- package/gsd-core/workflows/fast.md +1 -1
- package/gsd-core/workflows/forensics.md +1 -1
- package/gsd-core/workflows/graduation.md +1 -1
- package/gsd-core/workflows/health.md +3 -2
- package/gsd-core/workflows/help/modes/full.compact.md +3 -3
- package/gsd-core/workflows/help/modes/full.md +5 -5
- package/gsd-core/workflows/help/modes/topic.md +15 -5
- package/gsd-core/workflows/import.md +4 -3
- package/gsd-core/workflows/inbox.md +2 -2
- package/gsd-core/workflows/ingest-docs.md +3 -3
- package/gsd-core/workflows/insert-phase.md +4 -3
- package/gsd-core/workflows/list-seeds.md +1 -1
- package/gsd-core/workflows/list-workspaces.md +1 -1
- package/gsd-core/workflows/manager.md +6 -4
- package/gsd-core/workflows/map-codebase.md +5 -4
- package/gsd-core/workflows/milestone-summary.md +3 -2
- package/gsd-core/workflows/mvp-phase.md +14 -14
- package/gsd-core/workflows/new-milestone.md +11 -11
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +3 -3
- package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +1 -1
- package/gsd-core/workflows/new-project.md +7 -7
- package/gsd-core/workflows/new-workspace.md +2 -2
- package/gsd-core/workflows/next.md +1 -1
- package/gsd-core/workflows/note.md +1 -1
- package/gsd-core/workflows/onboard.md +1 -1
- package/gsd-core/workflows/pause-work.md +2 -2
- package/gsd-core/workflows/plan-phase/detail/elaboration.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +17 -5
- package/gsd-core/workflows/plan-phase/steps/closed-phase-gate.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +23 -5
- package/gsd-core/workflows/plan-phase.md +50 -24
- package/gsd-core/workflows/plan-review-convergence.md +21 -5
- package/gsd-core/workflows/plant-seed.md +62 -20
- package/gsd-core/workflows/pr-branch.md +113 -13
- package/gsd-core/workflows/profile-user.md +2 -2
- package/gsd-core/workflows/progress.md +19 -49
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +27 -0
- package/gsd-core/workflows/quick/steps/quick-verification.md +4 -4
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +30 -11
- package/gsd-core/workflows/quick-batch/steps/batch-init.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/completion.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/merge-wave.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/planner-wave.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/research-phase.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/resume-mode.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/verification-wave.md +9 -3
- package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +1 -1
- package/gsd-core/workflows/quick-batch.md +15 -10
- package/gsd-core/workflows/quick.md +62 -39
- package/gsd-core/workflows/reapply-patches.md +9 -3
- package/gsd-core/workflows/remove-phase.md +3 -2
- package/gsd-core/workflows/remove-workspace.md +2 -2
- package/gsd-core/workflows/resume-project.md +3 -2
- package/gsd-core/workflows/review.md +33 -17
- package/gsd-core/workflows/scan.md +3 -2
- package/gsd-core/workflows/secure-phase.md +13 -13
- package/gsd-core/workflows/settings-advanced.md +30 -10
- package/gsd-core/workflows/settings-integrations.md +2 -3
- package/gsd-core/workflows/settings.md +4 -4
- package/gsd-core/workflows/ship.md +14 -13
- package/gsd-core/workflows/sketch-wrap-up.md +1 -1
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/smart-entry.md +2 -2
- package/gsd-core/workflows/spec-phase.md +15 -5
- package/gsd-core/workflows/spike-wrap-up.md +1 -1
- package/gsd-core/workflows/spike.md +1 -1
- package/gsd-core/workflows/stats.md +1 -1
- package/gsd-core/workflows/sync-skills.md +5 -5
- package/gsd-core/workflows/thread.md +2 -2
- package/gsd-core/workflows/transition.md +13 -23
- package/gsd-core/workflows/ui-phase.md +48 -11
- package/gsd-core/workflows/ui-review.md +21 -6
- package/gsd-core/workflows/ultraplan-phase.md +3 -2
- package/gsd-core/workflows/undo.md +339 -20
- package/gsd-core/workflows/update.md +7 -7
- package/gsd-core/workflows/validate-phase.md +12 -13
- package/gsd-core/workflows/verify-work/detail/elaboration.md +43 -3
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +1 -1
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +5 -3
- package/gsd-core/workflows/verify-work.md +129 -55
- package/hooks/dist/gsd-agent-isolation-guard.js +32 -0
- package/hooks/dist/gsd-check-update-worker.js +8 -0
- package/hooks/dist/gsd-check-update.js +8 -0
- package/hooks/dist/gsd-context-monitor.js +31 -8
- package/hooks/dist/gsd-cursor-subagent-start.js +8 -0
- package/hooks/dist/gsd-secret-read-guard.js +161 -4
- package/hooks/dist/gsd-statusline.js +85 -20
- package/hooks/dist/gsd-update-banner.js +8 -0
- package/hooks/dist/gsd-validate-commit.sh +63 -4
- package/hooks/dist/gsd-windsurf-pre-write.js +11 -2
- package/hooks/dist/gsd-workflow-guard.js +5 -4
- package/hooks/dist/gsd-worktree-path-guard.js +6 -2
- package/hooks/dist/lib/cli-exit.js +12 -0
- package/hooks/dist/lib/git-probe.js +17 -1
- package/hooks/dist/lib/isolation-sentinel.js +2 -2
- package/hooks/gsd-agent-isolation-guard.js +32 -0
- package/hooks/gsd-check-update-worker.js +8 -0
- package/hooks/gsd-check-update.js +8 -0
- package/hooks/gsd-context-monitor.js +31 -8
- package/hooks/gsd-cursor-subagent-start.js +8 -0
- package/hooks/gsd-secret-read-guard.js +161 -4
- package/hooks/gsd-statusline.js +85 -20
- package/hooks/gsd-update-banner.js +8 -0
- package/hooks/gsd-validate-commit.sh +63 -4
- package/hooks/gsd-windsurf-pre-write.js +11 -2
- package/hooks/gsd-workflow-guard.js +5 -4
- package/hooks/gsd-worktree-path-guard.js +6 -2
- package/hooks/hooks.json +5 -5
- package/hooks/lib/cli-exit.js +12 -0
- package/hooks/lib/git-probe.js +17 -1
- package/hooks/lib/isolation-sentinel.js +2 -2
- package/package.json +22 -4
- package/scripts/build-hooks.js +15 -6
- package/scripts/changeset/parse.cjs +52 -4
- package/scripts/check-contract-drift.cjs +127 -11
- package/scripts/ci-timeout-report.cjs +770 -4
- package/scripts/command-contract-helpers.cjs +15 -8
- package/scripts/docs-guard-registry.cjs +34 -0
- package/scripts/gen-features.cjs +13 -8
- package/scripts/gen-hooks-cli-exit.cjs +12 -28
- package/scripts/gen-loop-host-contract.cjs +79 -1
- package/scripts/gen-platform-conformance-tier.cjs +187 -1
- package/scripts/gen-plugin-skills.cjs +87 -1
- package/scripts/gen-research-agents.cjs +24 -31
- package/scripts/gen-scripts-cli-exit.cjs +30 -3
- package/scripts/gen-test-timings.cjs +32 -7
- package/scripts/lib/cli-exit.cjs +12 -0
- package/scripts/lib/macos-conformance-tier.generated.cjs +34 -2
- package/scripts/lib/ndjson-reporter.cjs +31 -5
- package/scripts/lib/platform-conformance-tier.generated.cjs +45 -5
- package/scripts/lib/registration-ledger-preload.cjs +155 -0
- package/scripts/lib/vendor-bundle.cjs +59 -0
- package/scripts/lib/vendor-licenses/saxes-6.0.0.txt +64 -0
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
- package/scripts/lint-completion-predicate-drift.cjs +18 -19
- package/scripts/lint-descriptions.cjs +7 -3
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +38 -1
- package/scripts/lint-eslint-glob-coverage.allowlist.json +20 -0
- package/scripts/lint-frontmatter-fence-drift.cjs +313 -0
- package/scripts/lint-frontmatter-scalar-broad-grep.cjs +122 -16
- package/scripts/lint-phase-arg-assignment.cjs +257 -0
- package/scripts/lint-phase-enumeration-drift.cjs +12 -8
- package/scripts/lint-phase-id-drift.cjs +319 -5
- package/scripts/lint-planning-document-positive-control.cjs +329 -0
- package/scripts/lint-pr-branch-pattern-drift.cjs +148 -0
- package/scripts/lint-response-language-coverage.cjs +3 -0
- package/scripts/lint-retired-runtime-name.cjs +619 -0
- package/scripts/lint-skill-deps.cjs +7 -3
- package/scripts/lint-state-write-path-drift.cjs +93 -0
- package/scripts/lint-test-file-count.allowlist.json +38 -9
- package/scripts/lint-test-file-count.cjs +34 -1
- package/scripts/lint-vendored-deps.cjs +41 -5
- package/scripts/lint-workflow-shellcheck-baseline.json +25 -10
- package/scripts/mutation-matrix.cjs +50 -5
- package/scripts/prompt-injection-scan.sh +4 -0
- package/scripts/release-tarball-smoke.cjs +194 -1
- package/scripts/require-issue-link-policy.cjs +6 -2
- package/scripts/sync-runtime-launcher.cjs +184 -2
- package/scripts/verify-npm-publish.cjs +76 -20
- package/skills/gsd-add-tests/SKILL.md +6 -1
- package/skills/gsd-ai-integration-phase/SKILL.md +6 -1
- package/skills/gsd-audit-fix/SKILL.md +5 -0
- package/skills/gsd-audit-milestone/SKILL.md +6 -1
- package/skills/gsd-autonomous/SKILL.md +7 -2
- package/skills/gsd-capture/SKILL.md +9 -5
- package/skills/gsd-code-review/SKILL.md +7 -2
- package/skills/gsd-complete-milestone/SKILL.md +4 -0
- package/skills/gsd-config/SKILL.md +8 -4
- package/skills/gsd-debug/SKILL.md +11 -7
- package/skills/gsd-discuss-phase/SKILL.md +7 -3
- package/skills/gsd-docs-update/SKILL.md +12 -7
- package/skills/gsd-eval-review/SKILL.md +6 -1
- package/skills/gsd-execute-phase/SKILL.md +12 -7
- package/skills/gsd-extract-learnings/SKILL.md +5 -0
- package/skills/gsd-fast/SKILL.md +4 -0
- package/skills/gsd-forensics/SKILL.md +5 -1
- package/skills/gsd-graphify/SKILL.md +10 -6
- package/skills/gsd-health/SKILL.md +5 -0
- package/skills/gsd-help/SKILL.md +7 -2
- package/skills/gsd-import/SKILL.md +7 -3
- package/skills/gsd-inbox/SKILL.md +5 -0
- package/skills/gsd-ingest-docs/SKILL.md +5 -1
- package/skills/gsd-manager/SKILL.md +6 -1
- package/skills/gsd-map-codebase/SKILL.md +7 -3
- package/skills/gsd-mempalace-capture/SKILL.md +12 -4
- package/skills/gsd-mempalace-recall/SKILL.md +5 -1
- package/skills/gsd-milestone-summary/SKILL.md +5 -1
- package/skills/gsd-mvp-phase/SKILL.md +8 -3
- package/skills/gsd-new-milestone/SKILL.md +6 -1
- package/skills/gsd-new-project/SKILL.md +5 -0
- package/skills/gsd-next/SKILL.md +6 -1
- package/skills/gsd-ns-context/SKILL.md +4 -0
- package/skills/gsd-ns-ideate/SKILL.md +4 -0
- package/skills/gsd-ns-manage/SKILL.md +4 -0
- package/skills/gsd-ns-project/SKILL.md +4 -0
- package/skills/gsd-ns-review/SKILL.md +4 -0
- package/skills/gsd-ns-workflow/SKILL.md +4 -0
- package/skills/gsd-onboard/SKILL.md +6 -1
- package/skills/gsd-pause-work/SKILL.md +5 -1
- package/skills/gsd-phase/SKILL.md +8 -4
- package/skills/gsd-plan-phase/SKILL.md +6 -1
- package/skills/gsd-plan-review-convergence/SKILL.md +10 -6
- package/skills/gsd-pr-branch/SKILL.md +4 -0
- package/skills/gsd-profile-user/SKILL.md +5 -1
- package/skills/gsd-progress/SKILL.md +7 -2
- package/skills/gsd-quick/SKILL.md +16 -10
- package/skills/gsd-quick-batch/SKILL.md +21 -9
- package/skills/gsd-review/SKILL.md +7 -4
- package/skills/gsd-review-backlog/SKILL.md +3 -2
- package/skills/gsd-secure-phase/SKILL.md +6 -1
- package/skills/gsd-ship/SKILL.md +5 -0
- package/skills/gsd-sketch/SKILL.md +7 -2
- package/skills/gsd-spec-phase/SKILL.md +5 -1
- package/skills/gsd-spike/SKILL.md +8 -3
- package/skills/gsd-surface/SKILL.md +5 -1
- package/skills/gsd-thread/SKILL.md +4 -0
- package/skills/gsd-ui-phase/SKILL.md +6 -1
- package/skills/gsd-ui-review/SKILL.md +6 -1
- package/skills/gsd-ultraplan-phase/SKILL.md +5 -1
- package/skills/gsd-undo/SKILL.md +5 -1
- package/skills/gsd-update/SKILL.md +6 -2
- package/skills/gsd-validate-phase/SKILL.md +6 -1
- package/skills/gsd-verify-work/SKILL.md +6 -1
- package/skills/gsd-workspace/SKILL.md +7 -3
- package/skills/gsd-workstreams/SKILL.md +6 -6
- package/vscode/package.json +1 -1
|
@@ -14,7 +14,9 @@ module.exports = {
|
|
|
14
14
|
"tests/assumption-delta-checkpoint-e2e.test.cjs",
|
|
15
15
|
"tests/assumption-delta.test.cjs",
|
|
16
16
|
"tests/audit-command-cutover.test.cjs",
|
|
17
|
+
"tests/audit-workstream-layouts.test.cjs",
|
|
17
18
|
"tests/augment-upgrades.test.cjs",
|
|
19
|
+
"tests/blocking-guard-budget-parity.test.cjs",
|
|
18
20
|
"tests/broken-windows.test.cjs",
|
|
19
21
|
"tests/capability-cli.test.cjs",
|
|
20
22
|
"tests/capability-command-dispatch.test.cjs",
|
|
@@ -27,10 +29,13 @@ module.exports = {
|
|
|
27
29
|
"tests/capability-source.test.cjs",
|
|
28
30
|
"tests/capability-state.test.cjs",
|
|
29
31
|
"tests/changeset-new.test.cjs",
|
|
32
|
+
"tests/check-contract-drift.test.cjs",
|
|
30
33
|
"tests/check-env.test.cjs",
|
|
31
34
|
"tests/check-gap-analysis-plan-post-e2e.test.cjs",
|
|
32
35
|
"tests/check-glossary-refs.test.cjs",
|
|
33
36
|
"tests/check-predicate.test.cjs",
|
|
37
|
+
"tests/check-router-cutover-equivalence.test.cjs",
|
|
38
|
+
"tests/check-router-gate-boundaries.test.cjs",
|
|
34
39
|
"tests/check-tdd-review-checkpoint-e2e.test.cjs",
|
|
35
40
|
"tests/check-ui-safety-gate.test.cjs",
|
|
36
41
|
"tests/check-update-config-dir.test.cjs",
|
|
@@ -42,6 +47,7 @@ module.exports = {
|
|
|
42
47
|
"tests/claude-md.test.cjs",
|
|
43
48
|
"tests/cline-install.test.cjs",
|
|
44
49
|
"tests/close-phase-todos-padded-resolves.test.cjs",
|
|
50
|
+
"tests/code-review-fix-pipeline-regression.test.cjs",
|
|
45
51
|
"tests/code-review-pipeline-regression.test.cjs",
|
|
46
52
|
"tests/code-review-tier3-files-override-scoping.test.cjs",
|
|
47
53
|
"tests/code-review.test.cjs",
|
|
@@ -51,7 +57,7 @@ module.exports = {
|
|
|
51
57
|
"tests/codex-config.test.cjs",
|
|
52
58
|
"tests/codex-inherit-smoke.test.cjs",
|
|
53
59
|
"tests/command-routing-hub.test.cjs",
|
|
54
|
-
"tests/commands.test.cjs",
|
|
60
|
+
"tests/commands.platform.test.cjs",
|
|
55
61
|
"tests/commit-files-deletion.test.cjs",
|
|
56
62
|
"tests/commit-files-pathspec.test.cjs",
|
|
57
63
|
"tests/commonjs-marker.test.cjs",
|
|
@@ -61,16 +67,21 @@ module.exports = {
|
|
|
61
67
|
"tests/config-get-default.test.cjs",
|
|
62
68
|
"tests/config-loader.test.cjs",
|
|
63
69
|
"tests/config-schema.property.test.cjs",
|
|
64
|
-
"tests/config.test.cjs",
|
|
70
|
+
"tests/config.platform.test.cjs",
|
|
71
|
+
"tests/configured-entrypoint-validation.test.cjs",
|
|
72
|
+
"tests/context-drift.test.cjs",
|
|
65
73
|
"tests/copilot-install.test.cjs",
|
|
66
74
|
"tests/copilot-upgrades.test.cjs",
|
|
67
75
|
"tests/core-utils.test.cjs",
|
|
68
76
|
"tests/cursor-hook-workspace-roots.test.cjs",
|
|
69
77
|
"tests/cursor-hooks.test.cjs",
|
|
70
78
|
"tests/cursor-subagent-isolation.test.cjs",
|
|
79
|
+
"tests/debug-session-management.test.cjs",
|
|
71
80
|
"tests/dispatch-identity.test.cjs",
|
|
72
81
|
"tests/dispatcher.test.cjs",
|
|
73
82
|
"tests/drift-detection.test.cjs",
|
|
83
|
+
"tests/drift-whole-change-set.test.cjs",
|
|
84
|
+
"tests/effort-local-install.test.cjs",
|
|
74
85
|
"tests/effort-surface-axis.test.cjs",
|
|
75
86
|
"tests/effort-sync-installed-runtime.test.cjs",
|
|
76
87
|
"tests/emitted-ack-trailer.test.cjs",
|
|
@@ -92,6 +103,16 @@ module.exports = {
|
|
|
92
103
|
"tests/features-index-gate.test.cjs",
|
|
93
104
|
"tests/frontmatter.test.cjs",
|
|
94
105
|
"tests/gap-checker.property.test.cjs",
|
|
106
|
+
"tests/gate-api-coverage-verify-pre-escape.test.cjs",
|
|
107
|
+
"tests/gate-consumer-exit-awareness.test.cjs",
|
|
108
|
+
"tests/gate-decision-coverage-verify-stderr.test.cjs",
|
|
109
|
+
"tests/gate-exit.test.cjs",
|
|
110
|
+
"tests/gate-tdd-red-evidence-containment.test.cjs",
|
|
111
|
+
"tests/gate-tdd-review-checkpoint-hardening.test.cjs",
|
|
112
|
+
"tests/gate-tdd-review-checkpoint.unit.test.cjs",
|
|
113
|
+
"tests/gate-ui-plan.unit.test.cjs",
|
|
114
|
+
"tests/gate-ui-safety.unit.test.cjs",
|
|
115
|
+
"tests/gate-verify-command-paths.unit.test.cjs",
|
|
95
116
|
"tests/gemini-runtime-removed.test.cjs",
|
|
96
117
|
"tests/gen-context-index.test.cjs",
|
|
97
118
|
"tests/gen-health-docs.test.cjs",
|
|
@@ -107,6 +128,7 @@ module.exports = {
|
|
|
107
128
|
"tests/gsd-mcp-server-bin.test.cjs",
|
|
108
129
|
"tests/gsd-statusline.test.cjs",
|
|
109
130
|
"tests/gsd-validate-commit-crash-policy.test.cjs",
|
|
131
|
+
"tests/gsd-validate-commit-sigpipe.test.cjs",
|
|
110
132
|
"tests/gsd-write-guard.test.cjs",
|
|
111
133
|
"tests/health-diagnostic-rules/config-validation.test.cjs",
|
|
112
134
|
"tests/health-diagnostic-rules/worktree-health.test.cjs",
|
|
@@ -114,12 +136,12 @@ module.exports = {
|
|
|
114
136
|
"tests/helpers-cleanup.test.cjs",
|
|
115
137
|
"tests/helpers-process-isolation.test.cjs",
|
|
116
138
|
"tests/hermes-skills-migration.test.cjs",
|
|
139
|
+
"tests/hook-activation-probe.test.cjs",
|
|
117
140
|
"tests/hooks-commonjs-marker.test.cjs",
|
|
118
141
|
"tests/hooks-crash-policy.test.cjs",
|
|
119
142
|
"tests/hooks-opt-in.test.cjs",
|
|
120
143
|
"tests/host-integration.test.cjs",
|
|
121
144
|
"tests/init-manager.test.cjs",
|
|
122
|
-
"tests/init.test.cjs",
|
|
123
145
|
"tests/install-minimal-hooks.test.cjs",
|
|
124
146
|
"tests/install-nested-layout.test.cjs",
|
|
125
147
|
"tests/install-path-detection.test.cjs",
|
|
@@ -141,6 +163,8 @@ module.exports = {
|
|
|
141
163
|
"tests/kimi-agent-converter.test.cjs",
|
|
142
164
|
"tests/kimi-upgrades.test.cjs",
|
|
143
165
|
"tests/kimi-variant-disambiguation.test.cjs",
|
|
166
|
+
"tests/launcher-homes-derivation.test.cjs",
|
|
167
|
+
"tests/lint-phase-arg-assignment.test.cjs",
|
|
144
168
|
"tests/lint-workflow-shellcheck-fetch.test.cjs",
|
|
145
169
|
"tests/live-config-guard.test.cjs",
|
|
146
170
|
"tests/lockfile-cve-audit.test.cjs",
|
|
@@ -165,6 +189,7 @@ module.exports = {
|
|
|
165
189
|
"tests/no-unbounded-dirname-walk.rule.test.cjs",
|
|
166
190
|
"tests/no-unbounded-spawn.test.cjs",
|
|
167
191
|
"tests/no-unguarded-nonportable-exec.rule.test.cjs",
|
|
192
|
+
"tests/node-compile-cache.test.cjs",
|
|
168
193
|
"tests/npm-audit-baseline.test.cjs",
|
|
169
194
|
"tests/npm-integrity-gate.test.cjs",
|
|
170
195
|
"tests/nsegment-phase-grammar.test.cjs",
|
|
@@ -180,7 +205,7 @@ module.exports = {
|
|
|
180
205
|
"tests/phase-completion-single-owner.test.cjs",
|
|
181
206
|
"tests/phase-estimation.test.cjs",
|
|
182
207
|
"tests/phase-locator.test.cjs",
|
|
183
|
-
"tests/phase.test.cjs",
|
|
208
|
+
"tests/phase.platform.test.cjs",
|
|
184
209
|
"tests/phase6-capstone-conformance.test.cjs",
|
|
185
210
|
"tests/pi-config-dir-env-override.test.cjs",
|
|
186
211
|
"tests/plan-count-single-owner.test.cjs",
|
|
@@ -207,6 +232,7 @@ module.exports = {
|
|
|
207
232
|
"tests/profile-pipeline.test.cjs",
|
|
208
233
|
"tests/prohibition-enforcement.test.cjs",
|
|
209
234
|
"tests/project-root.test.cjs",
|
|
235
|
+
"tests/quick-batch-command-router.stdin.test.cjs",
|
|
210
236
|
"tests/quick-batch.test.cjs",
|
|
211
237
|
"tests/quick-branching.test.cjs",
|
|
212
238
|
"tests/quick-research.test.cjs",
|
|
@@ -231,16 +257,20 @@ module.exports = {
|
|
|
231
257
|
"tests/reviewer-step-dispatch.test.cjs",
|
|
232
258
|
"tests/revision-remediation-binding.test.cjs",
|
|
233
259
|
"tests/roadmap-parser.test.cjs",
|
|
260
|
+
"tests/roadmap-upgrade-bracket.test.cjs",
|
|
234
261
|
"tests/roadmap.test.cjs",
|
|
262
|
+
"tests/run-tests-accounting.test.cjs",
|
|
235
263
|
"tests/run-tests-harness.test.cjs",
|
|
236
264
|
"tests/run-tests-temp-root.test.cjs",
|
|
237
265
|
"tests/run-with-timeout.test.cjs",
|
|
238
266
|
"tests/runtime-artifact-layout-surface.test.cjs",
|
|
239
267
|
"tests/runtime-artifact-layout.test.cjs",
|
|
240
268
|
"tests/runtime-converters.test.cjs",
|
|
269
|
+
"tests/runtime-descriptor-owner.test.cjs",
|
|
241
270
|
"tests/runtime-homes-descriptor-drive.test.cjs",
|
|
242
271
|
"tests/runtime-identity.test.cjs",
|
|
243
272
|
"tests/runtime-launcher-parity.test.cjs",
|
|
273
|
+
"tests/schema-drift.test.cjs",
|
|
244
274
|
"tests/security.test.cjs",
|
|
245
275
|
"tests/settings-jsonc.test.cjs",
|
|
246
276
|
"tests/sh-hook-paths.test.cjs",
|
|
@@ -248,20 +278,30 @@ module.exports = {
|
|
|
248
278
|
"tests/shell-command-projection-dispatch.test.cjs",
|
|
249
279
|
"tests/shell-command-projection-path-sep.test.cjs",
|
|
250
280
|
"tests/ship-notes-wedged-pr.test.cjs",
|
|
281
|
+
"tests/shipped-reference-cites.test.cjs",
|
|
251
282
|
"tests/skill-manifest.test.cjs",
|
|
252
283
|
"tests/slug-derivation-drift-guard.test.cjs",
|
|
253
284
|
"tests/state-todos-render.test.cjs",
|
|
254
|
-
"tests/state.test.cjs",
|
|
285
|
+
"tests/state.platform.test.cjs",
|
|
255
286
|
"tests/teams-status.test.cjs",
|
|
287
|
+
"tests/test-gate-watch-mode.test.cjs",
|
|
256
288
|
"tests/todos-workstream-scope.test.cjs",
|
|
289
|
+
"tests/uat-complete-session.test.cjs",
|
|
290
|
+
"tests/ui-auditor-screenshot-block.test.cjs",
|
|
291
|
+
"tests/ui-interaction-capture.test.cjs",
|
|
292
|
+
"tests/undo-commit-selection-4465.test.cjs",
|
|
293
|
+
"tests/undo-commit-selection.test.cjs",
|
|
257
294
|
"tests/unreachable-guard-drift.test.cjs",
|
|
258
295
|
"tests/unreachable-shell-guard.test.cjs",
|
|
259
296
|
"tests/unusable-input.test.cjs",
|
|
260
297
|
"tests/update-custom-backup.test.cjs",
|
|
261
298
|
"tests/user-artifact-staging.test.cjs",
|
|
299
|
+
"tests/verification-append-audit.test.cjs",
|
|
262
300
|
"tests/verification-status.test.cjs",
|
|
263
301
|
"tests/verify-archive-dirs-live-path.test.cjs",
|
|
264
302
|
"tests/verify-command-grounding.test.cjs",
|
|
303
|
+
"tests/verify-lifecycle-writes-e2e.test.cjs",
|
|
304
|
+
"tests/verify-work-auto-transition.test.cjs",
|
|
265
305
|
"tests/verify.test.cjs",
|
|
266
306
|
"tests/windsurf-hooks-bridge.test.cjs",
|
|
267
307
|
"tests/workflow-guard.test.cjs",
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Registration ledger preload for scripts/run-tests.cjs (#4031).
|
|
4
|
+
//
|
|
5
|
+
// Why this exists. The runner passes `--test-force-exit` to every chunk (the
|
|
6
|
+
// Windows post-test hang backstop, #1051/#869). Under process isolation each
|
|
7
|
+
// test file's child streams its results to the `node --test` parent over a
|
|
8
|
+
// pipe, and a force-exit can end the parent while bytes of that pipe are still
|
|
9
|
+
// unread (nodejs/node#64833). The reporters never see the lost tail, so the
|
|
10
|
+
// run printed a smaller pass count and exited 0: a test that executed and
|
|
11
|
+
// passed (or failed) was indistinguishable from one that never existed.
|
|
12
|
+
//
|
|
13
|
+
// The parent cannot know what it did not receive, so the count of results the
|
|
14
|
+
// child produced has to come from the child, over a channel that does not
|
|
15
|
+
// share the pipe: this module is loaded into each test-file child with
|
|
16
|
+
// `--require` (`--test` forwards it to the file children) and counts the leaf
|
|
17
|
+
// `test:pass` / `test:fail` events the child's own reporter hands to the V8
|
|
18
|
+
// serializer that frames them onto that pipe, keyed by the `file` each event
|
|
19
|
+
// carries. When the child exits it appends one line per file to the file named
|
|
20
|
+
// by GSD_RUN_TESTS_LEDGER_FILE. The runner compares that per-file count with
|
|
21
|
+
// the leaf results its ndjson reporter actually received
|
|
22
|
+
// (analyzeChunkAccounting in run-tests.cjs) and fails the chunk when
|
|
23
|
+
// registered > reported.
|
|
24
|
+
//
|
|
25
|
+
// Why it taps the serializer and does NOT wrap `test()` / `it()`. node:test
|
|
26
|
+
// stamps every test with the location of the code that called it
|
|
27
|
+
// (`getCallerLocation()` in lib/internal/test_runner/harness.js) and reports
|
|
28
|
+
// that as the event's `file`. A wrapper around `test` is a JS frame between the
|
|
29
|
+
// test file and node:test, so every event would report THIS file as its
|
|
30
|
+
// location: spec-reporter failure locations would point here and no result
|
|
31
|
+
// could be matched back to its test file. Counting at the serializer adds no
|
|
32
|
+
// frame to the call and counts exactly what is put on the pipe, so the count
|
|
33
|
+
// and the parent's report are compared like for like: a skipped or todo test,
|
|
34
|
+
// a skipped suite and a test name/only filter need no special case
|
|
35
|
+
// (an excluded test emits no event on either side).
|
|
36
|
+
//
|
|
37
|
+
// Blind spots, stated plainly: a child that emits nothing counts 0 (no loss is
|
|
38
|
+
// visible); a SIGKILLed child never runs the `exit` handler below, so it leaves no
|
|
39
|
+
// ledger line; a file the parent reported but the ledger never saw is not flagged
|
|
40
|
+
// per file; and the whole count depends on node:test's child reporter framing its
|
|
41
|
+
// events through v8.DefaultSerializer.prototype.writeValue (true on Node 24). If a
|
|
42
|
+
// Node change moves that, every count becomes 0: the runner then fails a chunk whose
|
|
43
|
+
// ledger counted 0 while its reporter received results (analyzeChunkAccounting,
|
|
44
|
+
// `ledgerCountedNothing`), and tests/run-tests-accounting.test.cjs pins the hook.
|
|
45
|
+
//
|
|
46
|
+
// Inert unless it is inside a test-file child (NODE_TEST_CONTEXT is set by
|
|
47
|
+
// `node --test` for those, not for the runner parent), so requiring it anywhere
|
|
48
|
+
// else is a no-op. There it does two things: it makes the child's stdout pipe
|
|
49
|
+
// blocking (blockChildStdout: this is what stops `--test-force-exit` from
|
|
50
|
+
// discarding queued results, the loss this accounting exists to detect), and,
|
|
51
|
+
// when a ledger path was supplied, counts results. Never throws into the code it
|
|
52
|
+
// observes.
|
|
53
|
+
|
|
54
|
+
const fs = require('fs');
|
|
55
|
+
const path = require('path');
|
|
56
|
+
const { DefaultSerializer } = require('v8');
|
|
57
|
+
|
|
58
|
+
const RESULT_TYPES = new Set(['test:pass', 'test:fail']);
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* The file a reporter event counts toward, or null when the event is not a leaf test result the
|
|
62
|
+
* runner's ndjson reporter would record (anything but a pass/fail, a suite, an event with no file).
|
|
63
|
+
* analyzeChunkAccounting applies the same three conditions to the events it reads back.
|
|
64
|
+
*/
|
|
65
|
+
function resultFileOf(item) {
|
|
66
|
+
if (item === null || typeof item !== 'object' || !RESULT_TYPES.has(item.type)) return null;
|
|
67
|
+
const data = item.data;
|
|
68
|
+
if (data === null || typeof data !== 'object' || typeof data.file !== 'string') return null;
|
|
69
|
+
if (data.details && data.details.type === 'suite') return null;
|
|
70
|
+
return data.file;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* One spelling for every ledger line: the real path. node reports a result's `file` already resolved
|
|
75
|
+
* through symlinks (macOS /var -> /private/var), while a zero-result child's only name is process.argv[1],
|
|
76
|
+
* as given, so without this the two kinds of line disagree on the same file. Best-effort: a path that cannot
|
|
77
|
+
* be resolved keeps its absolute spelling (analyzeChunkAccounting normalizes both sides again regardless).
|
|
78
|
+
*/
|
|
79
|
+
function canonicalPath(file) {
|
|
80
|
+
const absolute = path.resolve(file);
|
|
81
|
+
try {
|
|
82
|
+
return fs.realpathSync.native(absolute);
|
|
83
|
+
} catch {
|
|
84
|
+
return absolute;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function install(ledgerPath,serializerPrototype = DefaultSerializer.prototype) {
|
|
89
|
+
const counts = new Map(); // file -> leaf results handed to the serializer
|
|
90
|
+
|
|
91
|
+
const original = serializerPrototype.writeValue;
|
|
92
|
+
serializerPrototype.writeValue = function writeValueCountingResults(value) {
|
|
93
|
+
try {
|
|
94
|
+
const file = resultFileOf(value);
|
|
95
|
+
if (file !== null) counts.set(file, (counts.get(file) || 0) + 1);
|
|
96
|
+
} catch {
|
|
97
|
+
// Counting must never change what is serialized.
|
|
98
|
+
}
|
|
99
|
+
return Reflect.apply(original, this, arguments);
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
process.on('exit', () => {
|
|
103
|
+
try {
|
|
104
|
+
// A child that produced no result still records itself (count 0), so the runner can tell
|
|
105
|
+
// "the preload ran and saw nothing" from "the preload never ran".
|
|
106
|
+
if (counts.size === 0 && process.argv[1]) counts.set(process.argv[1], 0);
|
|
107
|
+
const lines = [];
|
|
108
|
+
for (const [file, count] of counts) {
|
|
109
|
+
lines.push(JSON.stringify({ type: 'registered', file: canonicalPath(file), count }));
|
|
110
|
+
}
|
|
111
|
+
fs.appendFileSync(ledgerPath, `${lines.join('\n')}\n`);
|
|
112
|
+
} catch {
|
|
113
|
+
// Best-effort: the ledger is a diagnostic channel and must never change
|
|
114
|
+
// the exit status of the test file it observes.
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Make the test-file child's stdout (the pipe its results travel to the `node --test` parent on)
|
|
121
|
+
* blocking, so every frame it wrote has reached the OS when the child exits.
|
|
122
|
+
*
|
|
123
|
+
* Why: the runner passes `--test-force-exit`, and node forwards it to each file child. A forced
|
|
124
|
+
* child calls process.exit() as soon as its root test ends; its stdout is a non-blocking pipe on
|
|
125
|
+
* POSIX, so frames still queued in the Socket are discarded and the parent never receives those
|
|
126
|
+
* results (nodejs/node#64833; the fix proposed there, nodejs/node#64875, does exactly this with
|
|
127
|
+
* `_handle.setBlocking(true)` at force-exit). Measured on Node 24.18 / Linux with 20 files x 300
|
|
128
|
+
* tests, `--test-force-exit --test-concurrency=8`: 5039-5139 of 6000 results reported without
|
|
129
|
+
* this, 6000 of 6000 with it (and 6000 without force-exit). Doing it at load time rather than at
|
|
130
|
+
* exit means nothing is ever queued. The Windows hang guard that force-exit exists for (#1051)
|
|
131
|
+
* is untouched. Best-effort: a stdout with no pipe handle (a file, a TTY) is left alone.
|
|
132
|
+
*/
|
|
133
|
+
function blockChildStdout(stdout) {
|
|
134
|
+
try {
|
|
135
|
+
const target = stdout === undefined ? process.stdout : stdout;
|
|
136
|
+
const handle = target && target._handle;
|
|
137
|
+
if (handle && typeof handle.setBlocking === 'function') {
|
|
138
|
+
handle.setBlocking(true);
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
} catch {
|
|
142
|
+
// Never throw into the test file this observes.
|
|
143
|
+
}
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Inside a test-file child only (NODE_TEST_CONTEXT is set by `node --test` for those, not for the
|
|
148
|
+
// runner parent): the blocking stdout needs no ledger path; the ledger count needs one.
|
|
149
|
+
if (process.env.NODE_TEST_CONTEXT) {
|
|
150
|
+
blockChildStdout();
|
|
151
|
+
const ledgerPath = process.env.GSD_RUN_TESTS_LEDGER_FILE;
|
|
152
|
+
if (ledgerPath) install(ledgerPath);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
module.exports = { install, resultFileOf, blockChildStdout };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('node:fs');
|
|
4
|
+
const path = require('node:path');
|
|
5
|
+
const { isBuiltin } = require('node:module');
|
|
6
|
+
const { buildSync } = require('esbuild');
|
|
7
|
+
|
|
8
|
+
/** Rebuild locked upstream code without edits; installed trees need no node_modules. */
|
|
9
|
+
function buildVendorBundle(root, entry) {
|
|
10
|
+
const result = buildSync({
|
|
11
|
+
absWorkingDir: root,
|
|
12
|
+
entryPoints: [entry],
|
|
13
|
+
bundle: true,
|
|
14
|
+
platform: 'node',
|
|
15
|
+
format: 'cjs',
|
|
16
|
+
target: 'node24',
|
|
17
|
+
write: false,
|
|
18
|
+
metafile: true,
|
|
19
|
+
legalComments: 'inline',
|
|
20
|
+
banner: { js: '// Generated from locked npm dependencies by lint-vendored-deps.cjs --fix. Do not edit.' },
|
|
21
|
+
});
|
|
22
|
+
for (const output of Object.values(result.metafile.outputs)) {
|
|
23
|
+
for (const imported of output.imports) {
|
|
24
|
+
if (imported.external && !isBuiltin(imported.path)) {
|
|
25
|
+
throw new Error(`Vendor bundle has an external dependency: ${imported.path}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const packages = new Map();
|
|
30
|
+
for (const input of Object.keys(result.metafile.inputs)) {
|
|
31
|
+
let dir = path.dirname(path.resolve(root, input));
|
|
32
|
+
while (dir !== root && dir !== path.dirname(dir)) {
|
|
33
|
+
const manifest = path.join(dir, 'package.json');
|
|
34
|
+
if (fs.existsSync(manifest)) {
|
|
35
|
+
const pkg = JSON.parse(fs.readFileSync(manifest, 'utf8'));
|
|
36
|
+
if (pkg.name && pkg.version) {
|
|
37
|
+
const licenses = fs.readdirSync(dir).filter((name) => /^(licen[sc]e|copying|notice)(\.|$)/i.test(name)).sort();
|
|
38
|
+
// saxes 6.0.0 omits its LICENSE from npm; preserve the exact tagged
|
|
39
|
+
// upstream file (https://github.com/lddubeau/saxes/blob/v6.0.0/LICENSE).
|
|
40
|
+
const supplemental = path.join(__dirname, 'vendor-licenses', `${pkg.name}-${pkg.version}.txt`);
|
|
41
|
+
if (licenses.length === 0 && !fs.existsSync(supplemental)) throw new Error(`Missing upstream license: ${pkg.name}`);
|
|
42
|
+
packages.set(`${pkg.name}@${pkg.version}`, [
|
|
43
|
+
`${pkg.name}@${pkg.version} (package metadata: ${pkg.license})`,
|
|
44
|
+
...licenses.map((name) => `${name}:\n${fs.readFileSync(path.join(dir, name), 'utf8')}`),
|
|
45
|
+
...(licenses.length === 0 ? [fs.readFileSync(supplemental, 'utf8')] : []),
|
|
46
|
+
].join('\n\n'));
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
dir = path.dirname(dir);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
code: result.outputFiles[0].contents,
|
|
55
|
+
notices: Buffer.from([...packages.keys()].sort().map((name) => packages.get(name)).join('\n\n---\n\n') + '\n'),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
module.exports = { buildVendorBundle };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
The ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) Contributors
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
7
|
+
copyright notice and this permission notice appear in all copies.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
10
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
11
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
12
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
13
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
14
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
|
|
15
|
+
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
16
|
+
|
|
17
|
+
====
|
|
18
|
+
|
|
19
|
+
The following license is the one that governed sax, from which saxes
|
|
20
|
+
was forked. Isaac Schlueter is not *directly* involved with saxes so
|
|
21
|
+
don't go bugging him for saxes issues.
|
|
22
|
+
|
|
23
|
+
The ISC License
|
|
24
|
+
|
|
25
|
+
Copyright (c) Isaac Z. Schlueter and Contributors
|
|
26
|
+
|
|
27
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
28
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
29
|
+
copyright notice and this permission notice appear in all copies.
|
|
30
|
+
|
|
31
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
32
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
33
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
34
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
35
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
36
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
|
|
37
|
+
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
38
|
+
|
|
39
|
+
====
|
|
40
|
+
|
|
41
|
+
`String.fromCodePoint` by Mathias Bynens is no longer used, but it can
|
|
42
|
+
still be found in old commits. It was once used according to terms of
|
|
43
|
+
MIT License, as follows:
|
|
44
|
+
|
|
45
|
+
Copyright Mathias Bynens <https://mathiasbynens.be/>
|
|
46
|
+
|
|
47
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
48
|
+
a copy of this software and associated documentation files (the
|
|
49
|
+
"Software"), to deal in the Software without restriction, including
|
|
50
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
51
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
52
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
53
|
+
the following conditions:
|
|
54
|
+
|
|
55
|
+
The above copyright notice and this permission notice shall be
|
|
56
|
+
included in all copies or substantial portions of the Software.
|
|
57
|
+
|
|
58
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
59
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
60
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
61
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
62
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
63
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
64
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@@ -805,17 +805,17 @@ const OWNER_FILE = path.join('src', 'verification.cts');
|
|
|
805
805
|
// one (the owner consumes plan counts, never the reverse). Left as its
|
|
806
806
|
// own, differently-scoped answer, per design's "Rejected" list item 1.
|
|
807
807
|
//
|
|
808
|
-
// - `buildWorkstreamInventory` (src/workstream-inventory-builder.cts) —
|
|
809
|
-
// PURE, I/O-free projection
|
|
810
|
-
//
|
|
811
|
-
// `summariesMeetPlans = summaryCount >= planCount && planCount > 0`
|
|
812
|
-
// answers "are all plans summarized?" (combined with the caller-supplied
|
|
813
|
-
// verification verdict for its own `status` projection) — it cannot call
|
|
808
|
+
// - `buildWorkstreamInventory` (src/workstream-inventory-builder.cts) —
|
|
809
|
+
// formerly exempted here (a PURE, I/O-free projection that hand-rolled
|
|
810
|
+
// `summaryCount >= planCount && planCount > 0` locally, unable to call
|
|
814
811
|
// the I/O-bound `isPhaseComplete` without breaking its "No I/O. No
|
|
815
|
-
// async." contract
|
|
816
|
-
//
|
|
817
|
-
//
|
|
818
|
-
//
|
|
812
|
+
// async." contract). #5060 (Phase Status Module, epic #5056) gave this
|
|
813
|
+
// exact "pure function over pre-collected facts" shape a real owner —
|
|
814
|
+
// `phaseStatusFromFacts` (`src/phase-status.cts`) — which is itself
|
|
815
|
+
// import-free at load time and does no I/O, so this function now calls
|
|
816
|
+
// it instead of re-deriving the comparison locally. The local textual
|
|
817
|
+
// shapes this guard matches are gone; the exemption entry was removed
|
|
818
|
+
// rather than left dead.
|
|
819
819
|
//
|
|
820
820
|
// - `buildPhaseCompletionProjection` (src/init.cts) — MIGRATED onto
|
|
821
821
|
// `isPhaseComplete` for `phase_complete`/`verification_status` (shape
|
|
@@ -832,17 +832,17 @@ const OWNER_FILE = path.join('src', 'verification.cts');
|
|
|
832
832
|
//
|
|
833
833
|
// SHAPE (d) reuses this exact map (`findScanPhasePlansCompletedReadDrift`
|
|
834
834
|
// takes the same `exemptFunctions` set every other shape's finder does). The
|
|
835
|
-
//
|
|
835
|
+
// entries above were entered for shapes (a)/(b)/(c); of them, only
|
|
836
836
|
// `scanPhasePlans` (src/plan-scan.cts) also legitimately reads its OWN
|
|
837
837
|
// `completed` field for shape (d)'s purposes (building the return value it
|
|
838
838
|
// itself defines — not a call-then-read of another `scanPhasePlans(`
|
|
839
|
-
// invocation). `isPhaseComplete
|
|
840
|
-
//
|
|
841
|
-
//
|
|
842
|
-
//
|
|
843
|
-
//
|
|
844
|
-
//
|
|
845
|
-
//
|
|
839
|
+
// invocation). `isPhaseComplete` and `buildPhaseCompletionProjection` do not
|
|
840
|
+
// read `.completed` off a `scanPhasePlans(` call result at all (verified by
|
|
841
|
+
// direct inspection of each function's body as of this guard's shape-(d)
|
|
842
|
+
// addition — they consume `planCount`/`summaryCount`/`summaryFiles`, never
|
|
843
|
+
// `.completed`), so their presence in this map exempts nothing NEW for shape
|
|
844
|
+
// (d); they are listed here only because the map is shared. As of this
|
|
845
|
+
// addition, a whole-repo
|
|
846
846
|
// scan found ZERO live shape-(d) sites needing a fresh exemption entry — the
|
|
847
847
|
// one real instance this shape exists to catch (`cmdStateSync`,
|
|
848
848
|
// src/state.cts) was fixed by routing through `isPhaseComplete` rather than
|
|
@@ -852,7 +852,6 @@ const OWNER_FILE = path.join('src', 'verification.cts');
|
|
|
852
852
|
const FUNCTION_SCOPED_EXEMPTIONS = new Map([
|
|
853
853
|
[OWNER_FILE, new Set(['isPhaseComplete'])],
|
|
854
854
|
[path.join('src', 'plan-scan.cts'), new Set(['scanPhasePlans'])],
|
|
855
|
-
[path.join('src', 'workstream-inventory-builder.cts'), new Set(['buildWorkstreamInventory'])],
|
|
856
855
|
[path.join('src', 'init.cts'), new Set(['buildPhaseCompletionProjection'])],
|
|
857
856
|
]);
|
|
858
857
|
|
|
@@ -16,6 +16,9 @@
|
|
|
16
16
|
const fs = require('fs');
|
|
17
17
|
const path = require('path');
|
|
18
18
|
const { ExitError, runMain } = require('./lib/cli-exit.cjs');
|
|
19
|
+
// The one frontmatter fence owner (src/frontmatter-fence.cts, built by build:lib).
|
|
20
|
+
// This dev-time script runs after the build (`npm run lint:descriptions`, the tests).
|
|
21
|
+
const { locateFrontmatterFence } = require('../gsd-core/bin/lib/frontmatter-fence.cjs');
|
|
19
22
|
|
|
20
23
|
const MAX_LENGTH = 100;
|
|
21
24
|
const COMMANDS_DIR = path.join(__dirname, '..', 'commands', 'gsd');
|
|
@@ -25,9 +28,10 @@ const COMMANDS_DIR = path.join(__dirname, '..', 'commands', 'gsd');
|
|
|
25
28
|
* Returns null if no description is found.
|
|
26
29
|
*/
|
|
27
30
|
function parseDescription(content) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
// The block is the one the one fence owner finds (found while implementing #5105).
|
|
32
|
+
const fence = locateFrontmatterFence(content);
|
|
33
|
+
if (!fence || !fence.closed) return null;
|
|
34
|
+
const fm = content.slice(fence.openEnd, fence.bodyEnd);
|
|
31
35
|
|
|
32
36
|
const quoted = fm.match(/^description:\s+"((?:[^"\\]|\\.)*)"\s*$/m);
|
|
33
37
|
if (quoted) return quoted[1];
|
|
@@ -68,6 +68,7 @@ const DOCS_GUARD_EXEMPT_BASELINE = [
|
|
|
68
68
|
'lint-allow-test-rule-refs.test.cjs',
|
|
69
69
|
'lint-docs-command-form.test.cjs',
|
|
70
70
|
'lint-docs-required.test.cjs',
|
|
71
|
+
'lint-retired-runtime-name.test.cjs',
|
|
71
72
|
'manifest-version-sync.test.cjs',
|
|
72
73
|
'milestone-archive.test.cjs',
|
|
73
74
|
'model-resolver.test.cjs',
|
|
@@ -87,6 +88,7 @@ const DOCS_GUARD_EXEMPT_BASELINE = [
|
|
|
87
88
|
'security-prompt-injection.security.test.cjs',
|
|
88
89
|
'shipped-reference-cites.test.cjs',
|
|
89
90
|
'state.test.cjs',
|
|
91
|
+
'verification-status.test.cjs',
|
|
90
92
|
'worktree-safety.test.cjs',
|
|
91
93
|
];
|
|
92
94
|
|
|
@@ -178,13 +180,39 @@ const DOCS_GUARD_EXEMPT_DOCS_PATHS = {
|
|
|
178
180
|
'docs/COMMANDS.md', 'docs/USER-GUIDE.md', 'docs/adr', 'docs/adr/0001-foo.md', 'docs/adr/0099-new.md',
|
|
179
181
|
'docs/agents', 'docs/agents/triage-labels.md',
|
|
180
182
|
],
|
|
183
|
+
// #4729: `writeFile('docs/...', ...)` calls WRITE fabricated fixture
|
|
184
|
+
// content into a throwaway mkdtemp repo; the file never reads real shipped
|
|
185
|
+
// docs/ content — every path here is fixture data for the guard under
|
|
186
|
+
// test.
|
|
187
|
+
// Re-confirmed: every path below is WRITTEN as fabricated fixture content
|
|
188
|
+
// into a throwaway mkdtemp repo; none reads real shipped docs. The a*/b*/c*/
|
|
189
|
+
// d* entries are the adversarial-regression fixtures (dialect-plus-runtime-
|
|
190
|
+
// word, adjacency laundering, version laundering, bare-marker abuse).
|
|
191
|
+
'lint-retired-runtime-name.test.cjs': [
|
|
192
|
+
'docs/adr', 'docs/adr/999-retired-runtime-record.md', 'docs/filler/note-',
|
|
193
|
+
'docs/guides/a1.md', 'docs/guides/a2.md', 'docs/guides/b1.md',
|
|
194
|
+
'docs/guides/b2.md', 'docs/guides/b3.md', 'docs/guides/c3.md',
|
|
195
|
+
'docs/guides/c4.md', 'docs/guides/config-homes.md', 'docs/guides/d1.md',
|
|
196
|
+
'docs/guides/hooks.md', 'docs/guides/one.md', 'docs/guides/runtime-claim.md',
|
|
197
|
+
'docs/guides/setup.md', 'docs/history/migration-note.md',
|
|
198
|
+
'docs/ja-JP/guides/runtimes.md', 'docs/pt-BR/guides/a3.md',
|
|
199
|
+
'docs/pt-BR/guides/hooks.md', 'docs/pt-BR/guides/policy.md',
|
|
200
|
+
'docs/reference/client-models.md', 'docs/reference/models.md',
|
|
201
|
+
'docs/zh-CN/guides/a4.md', 'docs/zh-CN/reference/models.md',
|
|
202
|
+
],
|
|
181
203
|
'manifest-version-sync.test.cjs': [],
|
|
182
204
|
// #3884: re-confirmed — the added docs/CLI-TOOLS.md:458 reference is the
|
|
183
205
|
// same class as the existing docs/TESTING-SUITES.md one (a placement-note
|
|
184
206
|
// / explanatory comment citing documented CLI behavior for context, never
|
|
185
207
|
// a read target); the exemption's premise still holds for both.
|
|
186
208
|
'milestone-archive.test.cjs': ['docs/CLI-TOOLS.md', 'docs/TESTING-SUITES.md'],
|
|
187
|
-
|
|
209
|
+
// #4505: additionally cites docs/features/dynamic-routing-with-failure-tier-escalation.md
|
|
210
|
+
// in explanatory comments, quoting the documented first-spawn contract the new rows
|
|
211
|
+
// assert against; the file never reads that (or any) docs/ file — every read it makes
|
|
212
|
+
// targets a tmpdir .planning fixture.
|
|
213
|
+
'model-resolver.test.cjs': [
|
|
214
|
+
'docs/TESTING-SUITES.md', 'docs/features/dynamic-routing-with-failure-tier-escalation.md',
|
|
215
|
+
],
|
|
188
216
|
'new-project-mvp-prompt.test.cjs': ['docs/CONFIGURATION.md'],
|
|
189
217
|
'onboard-command.test.cjs': ['docs/adr/0001-runtime.md'],
|
|
190
218
|
'opencode-command-dir-plural.test.cjs': ['docs/commands'],
|
|
@@ -209,6 +237,15 @@ const DOCS_GUARD_EXEMPT_DOCS_PATHS = {
|
|
|
209
237
|
// #4186: the record-session usage-contract test cites the documented
|
|
210
238
|
// signature in docs/CLI-TOOLS.md in its explanatory comment.
|
|
211
239
|
'state.test.cjs': ['docs/CLI-TOOLS.md', 'docs/CONFIGURATION.md', 'docs/reference/state-md.md'],
|
|
240
|
+
// #5095: 'docs/VERIFICATION.md' is a tmpdir fixture basename (proving the
|
|
241
|
+
// report-shaped filter matches basename, not full path); 'docs/planning'
|
|
242
|
+
// and its two nested PLAN/SUMMARY children are an in-repo `.planning ->
|
|
243
|
+
// docs/planning` symlink-alias fixture. All are WRITTEN into a throwaway
|
|
244
|
+
// mkdtemp/createTempGitProject tree; none reads real shipped docs/ content.
|
|
245
|
+
'verification-status.test.cjs': [
|
|
246
|
+
'docs/VERIFICATION.md', 'docs/planning', 'docs/planning/phases',
|
|
247
|
+
'docs/planning/phases/01-foo/01-01-PLAN.md', 'docs/planning/phases/01-foo/01-01-SUMMARY.md',
|
|
248
|
+
],
|
|
212
249
|
'worktree-safety.test.cjs': ['docs/SUMMARY.md'],
|
|
213
250
|
};
|
|
214
251
|
|