@opengsd/gsd-core 1.9.1 → 1.11.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 +2 -3
- package/.opencode/plugins/gsd-core.js +8 -1
- package/agents/gsd-code-fixer.md +27 -3
- package/agents/gsd-debug-session-manager.md +11 -0
- package/agents/gsd-debugger.md +12 -246
- package/agents/gsd-doc-synthesizer.md +2 -4
- package/agents/gsd-executor.md +12 -10
- package/agents/gsd-integration-checker.md +3 -0
- package/agents/gsd-mempalace-curator.md +5 -2
- package/agents/gsd-phase-researcher.md +20 -1
- package/agents/gsd-plan-checker.md +46 -0
- package/agents/gsd-planner.md +49 -54
- package/agents/gsd-roadmapper.md +21 -3
- package/agents/gsd-user-profiler.md +3 -0
- package/agents/gsd-verifier.md +26 -73
- package/bin/install.js +1272 -1238
- package/bin/lib/ui-safety-gate.cjs +2 -0
- package/commands/gsd/code-review.md +1 -1
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/map-codebase.md +1 -1
- package/commands/gsd/mempalace-capture.md +2 -2
- package/commands/gsd/mempalace-recall.md +1 -1
- package/commands/gsd/new-milestone.md +2 -2
- package/commands/gsd/plan-phase.md +1 -1
- package/commands/gsd/quick.md +1 -1
- package/commands/gsd/review-backlog.md +2 -1
- package/commands/gsd/verify-work.md +1 -1
- package/gsd-core/bin/gsd-tools.cjs +1009 -115
- package/gsd-core/bin/lib/active-workstream-store.cjs +153 -12
- package/gsd-core/bin/lib/agent-install-check.cjs +268 -38
- package/gsd-core/bin/lib/api-coverage.cjs +123 -5
- package/gsd-core/bin/lib/artifacts.cjs +3 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +2 -4
- package/gsd-core/bin/lib/audit-command-router.cjs +9 -2
- package/gsd-core/bin/lib/audit.cjs +926 -202
- package/gsd-core/bin/lib/broken-windows.cjs +36 -6
- package/gsd-core/bin/lib/capability-consent.cjs +149 -15
- package/gsd-core/bin/lib/capability-lifecycle.cjs +45 -0
- package/gsd-core/bin/lib/capability-registry.cjs +608 -148
- package/gsd-core/bin/lib/capability-source.cjs +92 -0
- package/gsd-core/bin/lib/capability-trust.cjs +444 -25
- package/gsd-core/bin/lib/capability-validator.cjs +507 -24
- package/gsd-core/bin/lib/capability-writer.cjs +3 -2
- package/gsd-core/bin/lib/check-command-router.cjs +114 -38
- package/gsd-core/bin/lib/claude-orchestration.cjs +56 -3
- package/gsd-core/bin/lib/codex-agent-toml.cjs +329 -0
- package/gsd-core/bin/lib/command-aliases.cjs +94 -0
- package/gsd-core/bin/lib/command-roster.cjs +44 -1
- package/gsd-core/bin/lib/commands.cjs +665 -99
- package/gsd-core/bin/lib/commonjs-marker.cjs +142 -0
- package/gsd-core/bin/lib/complexity-trigger.cjs +1172 -0
- package/gsd-core/bin/lib/config-loader.cjs +76 -0
- package/gsd-core/bin/lib/config.cjs +22 -2
- package/gsd-core/bin/lib/context-composer.cjs +278 -0
- package/gsd-core/bin/lib/context-predicates.cjs +506 -0
- package/gsd-core/bin/lib/core-utils.cjs +217 -40
- package/gsd-core/bin/lib/decisions.cjs +23 -0
- package/gsd-core/bin/lib/docs.cjs +3 -2
- package/gsd-core/bin/lib/external-job.cjs +19 -4
- package/gsd-core/bin/lib/fallow-runner.cjs +20 -44
- package/gsd-core/bin/lib/frontmatter.cjs +239 -32
- package/gsd-core/bin/lib/gap-checker.cjs +68 -7
- package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +57 -6
- package/gsd-core/bin/lib/git-base-branch.cjs +160 -15
- package/gsd-core/bin/lib/graphify.cjs +142 -27
- package/gsd-core/bin/lib/gsd2-import.cjs +37 -5
- package/gsd-core/bin/lib/health-diagnostic-rules/agent-install.cjs +101 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/config-validation.cjs +348 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +145 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/install-surface-shadowing.cjs +98 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/milestone-archive-hygiene.cjs +100 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +222 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +265 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/root-existence.cjs +161 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +303 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +173 -0
- package/gsd-core/bin/lib/health-diagnostic-types.cjs +68 -0
- package/gsd-core/bin/lib/health-diagnostic.cjs +431 -0
- package/gsd-core/bin/lib/host-integration.cjs +13 -1
- package/gsd-core/bin/lib/host-runtime-detection.cjs +134 -0
- package/gsd-core/bin/lib/init-command-router.cjs +83 -8
- package/gsd-core/bin/lib/init.cjs +1325 -169
- package/gsd-core/bin/lib/install-effort-resolver.cjs +73 -30
- package/gsd-core/bin/lib/install-engine.cjs +805 -264
- package/gsd-core/bin/lib/install-fs-adapter.cjs +262 -0
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +203 -0
- package/gsd-core/bin/lib/install-profiles.cjs +160 -57
- package/gsd-core/bin/lib/install-scope.cjs +270 -0
- package/gsd-core/bin/lib/install-shadow-report.cjs +385 -0
- package/gsd-core/bin/lib/installed-surface-resolver.cjs +381 -0
- package/gsd-core/bin/lib/installer-migration-authoring.cjs +3 -1
- package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
- package/gsd-core/bin/lib/installer-migrations/007-retire-config-root-commonjs-marker.cjs +149 -0
- package/gsd-core/bin/lib/installer-migrations/008-cursor-retire-commands-surface.cjs +55 -0
- package/gsd-core/bin/lib/installer-migrations/009-pi-retire-reserved-hooks-dir.cjs +199 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +206 -13
- package/gsd-core/bin/lib/io.cjs +38 -3
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +8 -1
- package/gsd-core/bin/lib/markdown-table.cjs +133 -20
- package/gsd-core/bin/lib/mcp-catalog.cjs +518 -0
- package/gsd-core/bin/lib/mcp-server.cjs +135 -3
- package/gsd-core/bin/lib/milestone-lock.cjs +248 -0
- package/gsd-core/bin/lib/milestone.cjs +821 -109
- package/gsd-core/bin/lib/model-catalog.cjs +59 -1
- package/gsd-core/bin/lib/model-resolver.cjs +183 -40
- package/gsd-core/bin/lib/normalize-test-command.cjs +1 -1
- package/gsd-core/bin/lib/pattern.cjs +122 -0
- package/gsd-core/bin/lib/phase-estimation.cjs +1 -1
- package/gsd-core/bin/lib/phase-id.cjs +507 -36
- package/gsd-core/bin/lib/phase-lifecycle.cjs +28 -3
- package/gsd-core/bin/lib/phase-locator.cjs +258 -58
- package/gsd-core/bin/lib/phase.cjs +891 -156
- package/gsd-core/bin/lib/plan-dependency-graph.cjs +303 -0
- package/gsd-core/bin/lib/plan-drift-guard.cjs +120 -0
- package/gsd-core/bin/lib/plan-scan.cjs +86 -2
- package/gsd-core/bin/lib/planning-scope.cjs +31 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +890 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +60 -6
- package/gsd-core/bin/lib/probe-core.cjs +1 -1
- package/gsd-core/bin/lib/profile-output.cjs +1 -1
- package/gsd-core/bin/lib/prompt-budget.cjs +128 -165
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +740 -0
- package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +85 -0
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +108 -0
- package/gsd-core/bin/lib/review-lane-invocation.cjs +30 -0
- package/gsd-core/bin/lib/review-lane-runner.cjs +447 -68
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +13 -18
- package/gsd-core/bin/lib/roadmap-command-router.cjs +76 -9
- package/gsd-core/bin/lib/roadmap-parser.cjs +1035 -194
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +37 -10
- package/gsd-core/bin/lib/roadmap.cjs +405 -84
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +795 -100
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +14 -2
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +440 -57
- package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +3 -2
- package/gsd-core/bin/lib/runtime-homes.cjs +220 -41
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +220 -44
- package/gsd-core/bin/lib/runtime-name-policy.cjs +3 -1
- package/gsd-core/bin/lib/runtime-slash.cjs +27 -9
- package/gsd-core/bin/lib/section-manifest.cjs +209 -0
- package/gsd-core/bin/lib/security.cjs +104 -5
- package/gsd-core/bin/lib/shell-command-projection.cjs +388 -30
- package/gsd-core/bin/lib/smart-entry.cjs +154 -22
- package/gsd-core/bin/lib/state-command-router.cjs +5 -1
- package/gsd-core/bin/lib/state-document.cjs +152 -8
- package/gsd-core/bin/lib/state-transition.cjs +424 -105
- package/gsd-core/bin/lib/state.cjs +1927 -401
- package/gsd-core/bin/lib/surface.cjs +35 -10
- package/gsd-core/bin/lib/text-lines.cjs +80 -0
- package/gsd-core/bin/lib/token-scanner.cjs +76 -0
- package/gsd-core/bin/lib/uat-predicate.cjs +20 -4
- package/gsd-core/bin/lib/uat.cjs +706 -64
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +157 -0
- package/gsd-core/bin/lib/ui-safety-gate.cjs +14 -5
- package/gsd-core/bin/lib/unusable-input.cjs +33 -0
- package/gsd-core/bin/lib/update-context.cjs +8 -2
- package/gsd-core/bin/lib/user-artifact-staging.cjs +705 -0
- package/gsd-core/bin/lib/validate.cjs +20 -6
- package/gsd-core/bin/lib/vendor/README.md +37 -0
- package/gsd-core/bin/lib/vendor/re2js.cjs +6480 -0
- package/gsd-core/bin/lib/vendor/re2js.d.cts +938 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +287 -20
- package/gsd-core/bin/lib/verify.cjs +368 -880
- package/gsd-core/bin/lib/workflow-fragments.cjs +557 -0
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +203 -19
- package/gsd-core/bin/lib/workstream-inventory.cjs +576 -31
- package/gsd-core/bin/lib/workstream.cjs +8 -2
- package/gsd-core/bin/lib/worktree-base-ref.cjs +50 -6
- package/gsd-core/bin/lib/worktree-safety.cjs +450 -125
- package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +9 -1
- package/gsd-core/references/agent-contracts.md +43 -26
- package/gsd-core/references/artifact-types.md +10 -3
- package/gsd-core/references/autonomous-ui-design-contract.md +42 -0
- package/gsd-core/references/checkpoints.md +2 -2
- package/gsd-core/references/context-budget.md +1 -1
- package/gsd-core/references/debugger-techniques.md +255 -0
- package/gsd-core/references/dispatch-isolation-gate.md +138 -0
- package/gsd-core/references/doc-conflict-engine.md +1 -1
- package/gsd-core/references/execute-mvp-tdd.md +3 -3
- package/gsd-core/references/execute-phase-between-wave-reset.md +6 -2
- package/gsd-core/references/execute-phase-context-guard.md +1 -1
- package/gsd-core/references/execute-phase-response-language.md +1 -1
- package/gsd-core/references/execute-phase-wave-guard.md +6 -2
- package/gsd-core/references/gate-prompts.md +1 -1
- package/gsd-core/references/git-planning-commit.md +2 -1
- package/gsd-core/references/loop-hook-dispatch.md +39 -2
- package/gsd-core/references/model-profiles.md +12 -4
- package/gsd-core/references/mvp-concepts.md +9 -9
- package/gsd-core/references/planner-guidance.md +3 -9
- package/gsd-core/references/planner-preconditions.md +1 -1
- package/gsd-core/references/planner-reviews.md +1 -1
- package/gsd-core/references/planning-config.md +8 -6
- package/gsd-core/references/research-documentation-lookup.md +5 -3
- package/gsd-core/references/revision-loop.md +1 -1
- package/gsd-core/references/specless-probe-fallback.md +8 -7
- package/gsd-core/references/universal-anti-patterns.md +3 -3
- package/gsd-core/references/verifier-phase-gates.md +192 -0
- package/gsd-core/references/verifier-wiring-patterns.md +100 -0
- package/gsd-core/references/verify-mvp-mode.md +1 -1
- package/gsd-core/references/workstream-flag.md +22 -6
- package/gsd-core/references/worktree-branch-check.md +2 -2
- package/gsd-core/templates/discussion-log.md +1 -1
- package/gsd-core/templates/phase-prompt.md +2 -4
- package/gsd-core/templates/state.md +4 -4
- package/gsd-core/templates/summary-complex.md +2 -0
- package/gsd-core/templates/summary-minimal.md +2 -0
- package/gsd-core/templates/summary-standard.md +2 -0
- package/gsd-core/templates/summary.md +2 -0
- package/gsd-core/templates/verification-report.md +9 -1
- package/gsd-core/workflows/ai-integration-phase.md +9 -11
- package/gsd-core/workflows/audit-milestone.md +3 -0
- package/gsd-core/workflows/autonomous/steps/converge-banner.md +1 -0
- package/gsd-core/workflows/autonomous/steps/converge-dispatch-bg.md +11 -0
- package/gsd-core/workflows/autonomous/steps/converge-dispatch-inline.md +7 -0
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +21 -0
- package/gsd-core/workflows/autonomous/steps/converge-loop.md +7 -0
- package/gsd-core/workflows/autonomous.md +33 -70
- package/gsd-core/workflows/cleanup.md +62 -3
- package/gsd-core/workflows/code-review/steps/dispatch-fix.md +39 -0
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +93 -0
- package/gsd-core/workflows/code-review-fix.md +37 -10
- package/gsd-core/workflows/code-review.md +74 -166
- package/gsd-core/workflows/complete-milestone/steps/git-tag.md +29 -0
- package/gsd-core/workflows/complete-milestone.md +160 -95
- package/gsd-core/workflows/debug.md +16 -17
- package/gsd-core/workflows/diagnose-issues.md +56 -8
- package/gsd-core/workflows/discuss-phase/modes/chain.md +2 -1
- package/gsd-core/workflows/discuss-phase/modes/default.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +15 -0
- package/gsd-core/workflows/discuss-phase-assumptions.md +7 -17
- package/gsd-core/workflows/docs-update/steps/dispatch-monorepo-packages.md +51 -0
- package/gsd-core/workflows/docs-update.md +8 -51
- package/gsd-core/workflows/edit-phase.md +26 -1
- package/gsd-core/workflows/eval-review.md +3 -5
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +64 -7
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +50 -0
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +31 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +77 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +21 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +42 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate.md +43 -37
- package/gsd-core/workflows/execute-phase.md +103 -187
- package/gsd-core/workflows/execute-plan.md +36 -4
- package/gsd-core/workflows/explore.md +131 -4
- package/gsd-core/workflows/fast.md +10 -2
- package/gsd-core/workflows/health.md +73 -4
- package/gsd-core/workflows/help/modes/full.md +6 -1
- package/gsd-core/workflows/import.md +4 -4
- package/gsd-core/workflows/ingest-docs.md +7 -6
- package/gsd-core/workflows/mvp-phase.md +6 -3
- package/gsd-core/workflows/new-milestone/steps/project-md-milestone-write.md +16 -0
- package/gsd-core/workflows/new-milestone/steps/reset-phase-safety.md +19 -0
- package/gsd-core/workflows/new-milestone.md +35 -47
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +176 -0
- package/gsd-core/workflows/new-project/steps/auto-mode-detection.md +32 -0
- package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +18 -0
- package/gsd-core/workflows/new-project.md +27 -240
- package/gsd-core/workflows/next.md +12 -0
- package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +15 -0
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +110 -0
- package/gsd-core/workflows/plan-phase/steps/prd-express-gate.md +8 -0
- package/gsd-core/workflows/plan-phase/steps/research-only-early-exit.md +17 -0
- package/gsd-core/workflows/plan-phase/steps/research-only-modifiers.md +16 -0
- package/gsd-core/workflows/plan-phase/steps/reviews-prerequisite.md +17 -0
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +149 -0
- package/gsd-core/workflows/plan-phase.md +89 -209
- package/gsd-core/workflows/plan-review-convergence.md +50 -2
- package/gsd-core/workflows/progress/steps/forensic-audit.md +125 -0
- package/gsd-core/workflows/progress/steps/mvp-display.md +18 -0
- package/gsd-core/workflows/progress.md +45 -159
- package/gsd-core/workflows/quick/steps/discussion-phase.md +124 -0
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +111 -0
- package/gsd-core/workflows/quick/steps/quick-verification.md +67 -0
- package/gsd-core/workflows/quick/steps/research-phase.md +72 -0
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +37 -0
- package/gsd-core/workflows/quick.md +55 -405
- package/gsd-core/workflows/resume-project.md +3 -0
- package/gsd-core/workflows/review/steps/reviewer-instances-note-1.md +4 -0
- package/gsd-core/workflows/review/steps/reviewer-instances-note-2.md +3 -0
- package/gsd-core/workflows/review.md +41 -13
- package/gsd-core/workflows/section-manifest.json +219 -0
- package/gsd-core/workflows/secure-phase.md +1 -1
- package/gsd-core/workflows/session-report.md +2 -1
- package/gsd-core/workflows/settings.md +66 -2
- package/gsd-core/workflows/ship.md +104 -44
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/spec-phase.md +41 -20
- package/gsd-core/workflows/spike-wrap-up.md +20 -5
- package/gsd-core/workflows/spike.md +50 -16
- package/gsd-core/workflows/sync-skills.md +106 -13
- package/gsd-core/workflows/transition/steps/workstream-collision-check.md +17 -0
- package/gsd-core/workflows/transition.md +53 -31
- package/gsd-core/workflows/ui-phase.md +13 -12
- package/gsd-core/workflows/ui-review.md +2 -2
- package/gsd-core/workflows/update/steps/channel-banner.md +7 -0
- package/gsd-core/workflows/update.md +19 -8
- package/gsd-core/workflows/validate-phase.md +1 -1
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +36 -0
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +21 -0
- package/gsd-core/workflows/verify-work.md +17 -65
- package/hooks/dist/gsd-agent-isolation-guard.js +517 -0
- package/hooks/dist/gsd-check-update-worker.js +64 -12
- package/hooks/dist/gsd-check-update.js +19 -1
- package/hooks/dist/gsd-cursor-pre-tool.js +0 -3
- package/hooks/dist/gsd-cursor-subagent-start.js +607 -26
- package/hooks/dist/gsd-cursor-subagent-stop.js +3 -2
- package/hooks/dist/gsd-prompt-guard.js +21 -20
- package/hooks/dist/gsd-read-injection-scanner.js +45 -24
- package/hooks/dist/gsd-statusline.js +90 -6
- package/hooks/dist/gsd-update-banner.js +22 -1
- package/hooks/dist/gsd-workflow-guard.js +134 -36
- package/hooks/dist/gsd-worktree-path-guard.js +2 -1
- package/hooks/dist/gsd-write-guard.js +359 -0
- package/hooks/dist/lib/git-cmd.js +92 -59
- package/hooks/dist/lib/injection-patterns.js +45 -0
- package/hooks/dist/lib/isolation-deny-reason.js +39 -0
- package/hooks/dist/lib/isolation-sentinel.js +277 -0
- package/hooks/dist/managed-hooks-registry.cjs +2 -0
- package/hooks/gsd-agent-isolation-guard.js +517 -0
- package/hooks/gsd-check-update-worker.js +64 -12
- package/hooks/gsd-check-update.js +19 -1
- package/hooks/gsd-cursor-pre-tool.js +0 -3
- package/hooks/gsd-cursor-subagent-start.js +607 -26
- package/hooks/gsd-cursor-subagent-stop.js +3 -2
- package/hooks/gsd-prompt-guard.js +21 -20
- package/hooks/gsd-read-injection-scanner.js +45 -24
- package/hooks/gsd-statusline.js +90 -6
- package/hooks/gsd-update-banner.js +22 -1
- package/hooks/gsd-workflow-guard.js +134 -36
- package/hooks/gsd-worktree-path-guard.js +2 -1
- package/hooks/gsd-write-guard.js +359 -0
- package/hooks/hooks.json +12 -0
- package/hooks/lib/git-cmd.js +92 -59
- package/hooks/lib/injection-patterns.js +45 -0
- package/hooks/lib/isolation-deny-reason.js +39 -0
- package/hooks/lib/isolation-sentinel.js +277 -0
- package/hooks/managed-hooks-registry.cjs +2 -0
- package/package.json +31 -10
- package/pi/gsd.cjs +71 -12
- package/scripts/baselines/planning-prompt-drift-baseline.json +4 -0
- package/scripts/baselines/planning-snapshot-bypass-baseline.json +12 -0
- package/scripts/baselines/unreachable-guard-drift-baseline.json +4 -0
- package/scripts/build-hooks.js +9 -0
- package/scripts/changeset/lint.cjs +68 -6
- package/scripts/changeset/serialize.cjs +5 -1
- package/scripts/check-alias-drift.cjs +7 -43
- package/scripts/check-contract-drift.cjs +297 -0
- package/scripts/ci-test-scope.cjs +19 -2
- package/scripts/command-contract-helpers.cjs +903 -1
- package/scripts/gen-adr-index.cjs +728 -38
- package/scripts/gen-capability-matrix.cjs +1 -1
- package/scripts/gen-capability-registry.cjs +3 -15
- package/scripts/gen-context-index.cjs +439 -0
- package/scripts/gen-health-docs.cjs +390 -0
- package/scripts/gen-inventory-manifest.cjs +150 -4
- package/scripts/gen-loop-host-contract.cjs +4 -24
- package/scripts/gen-prompt-budget-parity-corpus.cjs +645 -0
- package/scripts/gen-registry.cjs +3 -14
- package/scripts/gen-section-manifest.cjs +638 -0
- package/scripts/generate-package-identity.cjs +4 -2
- package/scripts/lib/alias-drift-families.cjs +46 -0
- package/scripts/lib/drift-scan.cjs +278 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +15 -54
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +4 -0
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +3 -0
- package/scripts/lint-canary-version-leak.cjs +73 -0
- package/scripts/lint-command-contract.cjs +96 -13
- package/scripts/lint-compiled-artifact-sync.cjs +6 -1
- package/scripts/lint-completion-predicate-drift.cjs +933 -0
- package/scripts/lint-completion-ratio-drift.cjs +214 -0
- package/scripts/lint-default-flip-documentation.cjs +193 -0
- package/scripts/lint-docs-command-form.cjs +195 -0
- package/scripts/lint-docs-required.cjs +9 -1
- package/scripts/lint-emitted-drift-ack.cjs +215 -20
- package/scripts/lint-eslint-glob-coverage.allowlist.json +34 -0
- package/scripts/lint-eslint-glob-coverage.cjs +340 -0
- package/scripts/lint-example-parser-parity.cjs +395 -0
- package/scripts/lint-frontmatter-scalar-broad-grep.cjs +237 -0
- package/scripts/lint-health-diagnostic-rule-table.cjs +404 -0
- package/scripts/lint-hooks-runtime-build-seam.cjs +262 -0
- package/scripts/lint-milestone-window-drift.cjs +468 -0
- package/scripts/lint-phase-enumeration-drift.cjs +479 -0
- package/scripts/lint-plan-count-drift.cjs +318 -0
- package/scripts/lint-planning-artifact-writer-drift.cjs +398 -0
- package/scripts/lint-planning-prompt-drift.cjs +434 -0
- package/scripts/lint-planning-snapshot-bypass-drift.cjs +544 -0
- package/scripts/lint-regression-test-names.cjs +15 -13
- package/scripts/lint-removed-but-needed.cjs +320 -0
- package/scripts/lint-state-field-drift.cjs +805 -0
- package/scripts/lint-state-write-path-drift.cjs +1045 -0
- package/scripts/lint-test-file-count.allowlist.json +40 -3
- package/scripts/lint-unreachable-guard-drift.cjs +843 -0
- package/scripts/lint-vendored-deps.cjs +124 -0
- package/scripts/mutation-matrix.cjs +13 -0
- package/scripts/pr-changed-files.cjs +63 -0
- package/scripts/pr-template-policy.cjs +14 -4
- package/scripts/prompt-injection-scan.sh +52 -6
- package/scripts/require-issue-link-policy.cjs +192 -0
- package/scripts/state-write-path-drift-baseline.json +19 -0
- package/scripts/sync-runtime-launcher.cjs +2 -4
- package/skills/gsd-autonomous/SKILL.md +0 -1
- package/skills/gsd-code-review/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -2
- package/skills/gsd-map-codebase/SKILL.md +1 -1
- package/skills/gsd-mempalace-capture/SKILL.md +2 -2
- package/skills/gsd-mempalace-recall/SKILL.md +1 -1
- package/skills/gsd-new-milestone/SKILL.md +2 -2
- package/skills/gsd-next/SKILL.md +0 -1
- package/skills/gsd-plan-phase/SKILL.md +1 -2
- package/skills/gsd-progress/SKILL.md +0 -1
- package/skills/gsd-quick/SKILL.md +1 -1
- package/skills/gsd-review-backlog/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +0 -1
- package/skills/gsd-verify-work/SKILL.md +1 -1
- package/vscode/package.json +1 -1
- package/gsd-core/workflows/discovery-phase.md +0 -298
- package/gsd-core/workflows/plan-milestone-gaps.md +0 -281
- package/gsd-core/workflows/verify-phase.md +0 -577
- package/scripts/affected-tests-lib.cjs +0 -554
- package/scripts/gen-emitted-baseline.cjs +0 -145
- package/scripts/lint-allow-test-rule-refs.cjs +0 -162
- package/scripts/run-affected-tests.cjs +0 -7
- package/scripts/run-tests.cjs +0 -1050
|
@@ -63,6 +63,7 @@ exports.parseCoverageMatrix = parseCoverageMatrix;
|
|
|
63
63
|
exports.validateCoverageMatrix = validateCoverageMatrix;
|
|
64
64
|
exports.renderCoverageMatrix = renderCoverageMatrix;
|
|
65
65
|
const markdown_sectionizer_cjs_1 = require("./markdown-sectionizer.cjs");
|
|
66
|
+
const pattern_cjs_1 = require("./pattern.cjs");
|
|
66
67
|
/**
|
|
67
68
|
* Curated default trigger vocabulary. ADDITIVE-ONLY (Hyrum's Law). Tunable via
|
|
68
69
|
* the `terms` parameter.
|
|
@@ -156,9 +157,6 @@ function resolveTerms(terms) {
|
|
|
156
157
|
};
|
|
157
158
|
return { verbs: merge('verbs'), nouns: merge('nouns') };
|
|
158
159
|
}
|
|
159
|
-
function escapeRegex(s) {
|
|
160
|
-
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
161
|
-
}
|
|
162
160
|
function makeSnippet(line, anchor) {
|
|
163
161
|
const cleaned = line.replace(/\s+/g, ' ').trim();
|
|
164
162
|
if (cleaned.length <= 120)
|
|
@@ -238,6 +236,30 @@ const SURFACE_DESCRIPTOR_WORDS = new Set([
|
|
|
238
236
|
* EXTERNAL-API surface signal. Only unambiguously-internal words: "external"
|
|
239
237
|
* is deliberately absent (an external API IS external). */
|
|
240
238
|
const INTERNAL_DESCRIPTORS = new Set(['internal', 'in-house', 'local', 'first-party', 'private']);
|
|
239
|
+
/** #2784: negation suppression. A clause that pairs an integration verb with an
|
|
240
|
+
* API noun but the verb itself is directly negated (e.g. "does not integrate",
|
|
241
|
+
* "integrates no external API") is suppressed. Two windows are checked: a
|
|
242
|
+
* negation qualifier within 2 words directly before the verb, or "no"/"zero"/
|
|
243
|
+
* "none" between the verb and a following noun.
|
|
244
|
+
* KNOWN LIMIT (deliberate, not a bug to fix later): a negation further than 2
|
|
245
|
+
* words before the verb, or a clause where the noun precedes the verb, is NOT
|
|
246
|
+
* suppressed — e.g. "Ships without any API integration." still reports
|
|
247
|
+
* detected:true, because "without" sits outside the verb's 2-word lookback
|
|
248
|
+
* and the noun precedes the verb. This is intentional: detectApiIntegration
|
|
249
|
+
* is fail-closed — an unsuppressed false positive costs a one-line
|
|
250
|
+
* COVERAGE.md declaration, while widening the suppression window risks a
|
|
251
|
+
* false negative that silently lets a real external-API phase past a
|
|
252
|
+
* blocking gate.
|
|
253
|
+
* Hoisted to module scope (#3127 regression fix): this was previously
|
|
254
|
+
* allocated fresh on every source line, which is wasted work on documents
|
|
255
|
+
* with many lines. */
|
|
256
|
+
const NEGATION_QUALIFIERS = new Set([
|
|
257
|
+
'no', 'not', 'without', 'zero', 'neither', 'nor', 'none', "don't", "doesn't", "didn't", "won't", "can't", "cannot",
|
|
258
|
+
]);
|
|
259
|
+
/** Negation tokens checked BETWEEN a verb and a later noun (narrower than
|
|
260
|
+
* NEGATION_QUALIFIERS — "not" and "without" are checked only immediately
|
|
261
|
+
* before the verb, via NEGATION_QUALIFIERS above). */
|
|
262
|
+
const NEGATION_NOUN_TOKENS = new Set(['no', 'zero', 'none']);
|
|
241
263
|
/** A capitalized compound modifier ("Resolver-only", "Read-only", "E-commerce"
|
|
242
264
|
* — lowercase letter right after the hyphen) is an adjective phrase, not a
|
|
243
265
|
* service name. Real hyphenated services capitalize the second segment
|
|
@@ -378,10 +400,10 @@ function detectApiIntegration(text, terms) {
|
|
|
378
400
|
// Trailing boundary is a LOOKAHEAD (not consumed) so back-to-back terms
|
|
379
401
|
// separated by one boundary char are both found.
|
|
380
402
|
const verbRe = hasCompoundTerms
|
|
381
|
-
? new RegExp('(^|[^a-zA-Z0-9])(' + effective.verbs.map(escapeRegex).join('|') + ')(?=[^a-zA-Z0-9]|$)', 'gi')
|
|
403
|
+
? new RegExp('(^|[^a-zA-Z0-9])(' + effective.verbs.map(pattern_cjs_1.escapeRegex).join('|') + ')(?=[^a-zA-Z0-9]|$)', 'gi')
|
|
382
404
|
: null;
|
|
383
405
|
const nounRe = hasCompoundTerms
|
|
384
|
-
? new RegExp('(^|[^a-zA-Z0-9])(' + effective.nouns.map(escapeRegex).join('|') + ')(?=[^a-zA-Z0-9]|$)', 'gi')
|
|
406
|
+
? new RegExp('(^|[^a-zA-Z0-9])(' + effective.nouns.map(pattern_cjs_1.escapeRegex).join('|') + ')(?=[^a-zA-Z0-9]|$)', 'gi')
|
|
385
407
|
: null;
|
|
386
408
|
const surfaceRe = new RegExp(SERVICE_SURFACE_API_RE.source, 'g');
|
|
387
409
|
const nounSet = new Set(effective.nouns);
|
|
@@ -421,11 +443,45 @@ function detectApiIntegration(text, terms) {
|
|
|
421
443
|
// boundary is the whole relationship test. Nouns are NOT filtered on
|
|
422
444
|
// "internal" qualification here — "integrate the internal API" is a
|
|
423
445
|
// fail-closed positive; the declaration dismisses it if wrong.
|
|
446
|
+
//
|
|
447
|
+
// #2784: negation suppression. A clause that pairs an integration verb with
|
|
448
|
+
// an API noun but the verb itself is directly negated (e.g. "does not
|
|
449
|
+
// integrate", "integrates no external API") is suppressed. The check is
|
|
450
|
+
// scoped to the verb's immediate context (the word directly before the
|
|
451
|
+
// verb, or the word directly between verb and noun) — NOT a blanket
|
|
452
|
+
// clause-wide scan, because "without changing runtime dependencies" in a
|
|
453
|
+
// long clause does NOT negate the integration.
|
|
454
|
+
// KNOWN LIMIT (deliberate, not a bug to fix later): a negation further than
|
|
455
|
+
// 2 words before the verb, or a clause where the noun precedes the verb, is
|
|
456
|
+
// NOT suppressed — e.g. "Ships without any API integration." is NOT
|
|
457
|
+
// suppressed today (pinned by a test in tests/api-coverage.test.cjs).
|
|
458
|
+
// detectApiIntegration is fail-closed by design: an unsuppressed false
|
|
459
|
+
// positive costs a one-line COVERAGE.md declaration, while widening the
|
|
460
|
+
// window trades that for a silent false negative on a blocking gate.
|
|
424
461
|
if (verbRe && nounRe) {
|
|
425
462
|
for (const clause of clauses) {
|
|
426
463
|
const verbs = collectTermMatches(verbRe, clause.text);
|
|
427
464
|
if (verbs.length === 0)
|
|
428
465
|
continue;
|
|
466
|
+
// #2784: check if any verb is immediately preceded by a negation
|
|
467
|
+
// qualifier (within 2 words before the verb match).
|
|
468
|
+
//
|
|
469
|
+
// OFFSET NOTE: `v.start`/`n.start` (from collectTermMatches below and
|
|
470
|
+
// above) are already CLAUSE-LOCAL — collectTermMatches was called with
|
|
471
|
+
// `clause.text`, not the full line — and so is `clauseText`
|
|
472
|
+
// (`clause.text.toLowerCase()`). They must be used AS-IS to index into
|
|
473
|
+
// `clauseText`; do not re-base them against `clause.start` (that field
|
|
474
|
+
// is the clause's offset within the LINE, a different coordinate space,
|
|
475
|
+
// used only to map line-level spans like `extraNouns`/`masked` into a
|
|
476
|
+
// clause). Subtracting `clause.start` here double-offsets the slice
|
|
477
|
+
// bounds for every clause after the first on a line (#3127 follow-up).
|
|
478
|
+
const clauseText = clause.text.toLowerCase();
|
|
479
|
+
const hasNegatedVerb = verbs.some((v) => {
|
|
480
|
+
const before = clauseText.slice(Math.max(0, v.start - 20), v.start);
|
|
481
|
+
const beforeWords = before.split(/\s+/).filter(Boolean).slice(-2);
|
|
482
|
+
return beforeWords.some((w) => NEGATION_QUALIFIERS.has(w.replace(/[^a-z']/g, '')));
|
|
483
|
+
});
|
|
484
|
+
// Also check if "no"/"zero"/"none" appears between the verb and the noun.
|
|
429
485
|
const nouns = collectTermMatches(nounRe, clause.text);
|
|
430
486
|
const nounTerms = new Set(nouns.map((t) => t.term));
|
|
431
487
|
for (const u of extraNouns) {
|
|
@@ -435,6 +491,68 @@ function detectApiIntegration(text, terms) {
|
|
|
435
491
|
}
|
|
436
492
|
if (nounTerms.size === 0)
|
|
437
493
|
continue;
|
|
494
|
+
// Check for negation between verb and noun.
|
|
495
|
+
//
|
|
496
|
+
// #3127 regression: the original form of this check was
|
|
497
|
+
// O(verbs × nouns), re-slicing and re-splitting the clause text for
|
|
498
|
+
// every (verb, noun) pair — effectively cubic in clause length (a
|
|
499
|
+
// clause of N repeated "integrate api" pairs did O(N^2) pair checks,
|
|
500
|
+
// each doing an O(N) slice/split). On a clause with 800 repeated
|
|
501
|
+
// pairs this took ~8.5s; fast-check's property test then generated
|
|
502
|
+
// documents large enough to hang the whole test file past node:test's
|
|
503
|
+
// 600s timeout. It ALSO subtracted `clause.start` from `v.start`/
|
|
504
|
+
// `n.start` before slicing `clauseText` — but `v.start`/`n.start` are
|
|
505
|
+
// already local to `clause.text` (collectTermMatches was called with
|
|
506
|
+
// clause.text, not the full line), and `clauseText` is exactly
|
|
507
|
+
// `clause.text.toLowerCase()`. So that subtraction double-offset the
|
|
508
|
+
// slice bounds for every clause after the first on a line, sliding
|
|
509
|
+
// (and for negative results, JS's negative-index slice() wraparound
|
|
510
|
+
// non-monotonically re-mapping) the window to characters unrelated to
|
|
511
|
+
// the verb/noun pair — an independent latent bug, fixed here as part
|
|
512
|
+
// of establishing a well-defined O(1) predicate (a piecewise/clamped
|
|
513
|
+
// window has no single "widest span" to reason about at all).
|
|
514
|
+
//
|
|
515
|
+
// EXACT-EQUIVALENCE, single pass: the predicate is "does any pair
|
|
516
|
+
// (v, n) with n.start > v.start have a negation token in the span
|
|
517
|
+
// (v.end, n.start)". Every such span is a SUBSET of the widest
|
|
518
|
+
// possible span for a given noun: [min(v.end) over verbs valid for
|
|
519
|
+
// that noun, n.start). And since that window only widens as a
|
|
520
|
+
// noun's start increases (more verbs become valid, and the noun
|
|
521
|
+
// bound itself grows), the single widest span across the WHOLE
|
|
522
|
+
// clause is anchored at the noun with the maximum start, using the
|
|
523
|
+
// minimum verb-end among verbs valid for THAT noun (not the global
|
|
524
|
+
// minimum verb-end, which could belong to a verb that starts after
|
|
525
|
+
// this noun and so is never a valid pairing with it — a mismatch
|
|
526
|
+
// that would either miss or falsely include a negation). If that one
|
|
527
|
+
// substring contains no negation token, no narrower pair-specific
|
|
528
|
+
// substring can either; if it does, the (minVerb, maxNoun) pair
|
|
529
|
+
// itself contains it. This drops the check to O(verbs + nouns).
|
|
530
|
+
let hasNegatedNoun = false;
|
|
531
|
+
if (nouns.length > 0) {
|
|
532
|
+
let minVerbStart = Infinity;
|
|
533
|
+
for (const v of verbs)
|
|
534
|
+
if (v.start < minVerbStart)
|
|
535
|
+
minVerbStart = v.start;
|
|
536
|
+
let maxNounStart = -Infinity;
|
|
537
|
+
for (const n of nouns)
|
|
538
|
+
if (n.start > maxNounStart)
|
|
539
|
+
maxNounStart = n.start;
|
|
540
|
+
if (maxNounStart > minVerbStart) {
|
|
541
|
+
let minQualifyingVerbEnd = Infinity;
|
|
542
|
+
for (const v of verbs) {
|
|
543
|
+
if (v.start < maxNounStart) {
|
|
544
|
+
const vEnd = v.start + v.term.length;
|
|
545
|
+
if (vEnd < minQualifyingVerbEnd)
|
|
546
|
+
minQualifyingVerbEnd = vEnd;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
const between = clauseText.slice(minQualifyingVerbEnd, maxNounStart);
|
|
550
|
+
const betweenWords = between.split(/\s+/).filter(Boolean);
|
|
551
|
+
hasNegatedNoun = betweenWords.some((w) => NEGATION_NOUN_TOKENS.has(w.replace(/[^a-z']/g, '')));
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
if (hasNegatedVerb || hasNegatedNoun)
|
|
555
|
+
continue;
|
|
438
556
|
for (const vTerm of new Set(verbs.map((t) => t.term))) {
|
|
439
557
|
for (const nTerm of nounTerms)
|
|
440
558
|
emitPair(vTerm, nTerm, rawLine);
|
|
@@ -27,6 +27,9 @@ exports.CANONICAL_EXACT = new Set([
|
|
|
27
27
|
'config.json',
|
|
28
28
|
'CLAUDE.md',
|
|
29
29
|
'RETROSPECTIVE.md',
|
|
30
|
+
'WINDOWS.md', // #3224: broken-windows ledger (src/broken-windows.cts, LEDGER_FILE_NAME)
|
|
31
|
+
'STATE-ARCHIVE.md', // state.cts's cmdStatePrune writes this at the .planning/ root
|
|
32
|
+
'milestone.lock', // #3311: milestone (phase + session) claim (src/milestone-lock.cts); persistent, unlike the transient STATE.md.lock/WAITING.json
|
|
30
33
|
]);
|
|
31
34
|
// Pattern-match canonical file names (regex tests on the basename)
|
|
32
35
|
// Each pattern includes the name of the workflow that produces it as a comment.
|
|
@@ -37,6 +37,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
37
37
|
exports.DEFAULT_ASSUMPTION_DELTA_TERMS = void 0;
|
|
38
38
|
exports.detectAssumptionDelta = detectAssumptionDelta;
|
|
39
39
|
const markdown_sectionizer_cjs_1 = require("./markdown-sectionizer.cjs");
|
|
40
|
+
const pattern_cjs_1 = require("./pattern.cjs");
|
|
40
41
|
/**
|
|
41
42
|
* Curated default trigger vocabulary. Each kind lists cue terms that signal a
|
|
42
43
|
* core-assumption monopoly has been lost. ADDITIVE-ONLY (Hyrum's Law: once
|
|
@@ -168,7 +169,7 @@ function detectAssumptionDelta(text, terms) {
|
|
|
168
169
|
continue;
|
|
169
170
|
// Word-boundary anchored, case-insensitive — same shape as ui-safety-gate.
|
|
170
171
|
// (^|[^a-zA-Z0-9])(TERM)([^a-zA-Z0-9]|$) prevents interior-substring matches.
|
|
171
|
-
const escaped = cueTerms.map(escapeRegex).join('|');
|
|
172
|
+
const escaped = cueTerms.map(pattern_cjs_1.escapeRegex).join('|');
|
|
172
173
|
const pattern = new RegExp('(^|[^a-zA-Z0-9])(' + escaped + ')([^a-zA-Z0-9]|$)', 'gi');
|
|
173
174
|
const seen = new Set();
|
|
174
175
|
for (const line of stripped.split('\n')) {
|
|
@@ -188,9 +189,6 @@ function detectAssumptionDelta(text, terms) {
|
|
|
188
189
|
}
|
|
189
190
|
return { detected: signals.length > 0, signals, terms: effective };
|
|
190
191
|
}
|
|
191
|
-
function escapeRegex(s) {
|
|
192
|
-
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
193
|
-
}
|
|
194
192
|
// ── CLI entry point ──────────────────────────────────────────────────────────
|
|
195
193
|
// Reads phase-section text from STDIN (not argv) to avoid OS ARG_MAX limits.
|
|
196
194
|
// Invoked by workflow bash as: echo "$PHASE_SECTION" | node .../assumption-delta.cjs [--json]
|
|
@@ -71,7 +71,7 @@ function routeAuditOpen({ args, cwd, raw, error, _audit, _core }) {
|
|
|
71
71
|
routeHubCommandFamily({
|
|
72
72
|
family: 'audit-open',
|
|
73
73
|
args: hubArgs,
|
|
74
|
-
subcommands: ['run'],
|
|
74
|
+
subcommands: ['run', 'acknowledge'],
|
|
75
75
|
defaultSubcommand: 'run',
|
|
76
76
|
handlers: {
|
|
77
77
|
run: () => {
|
|
@@ -86,8 +86,15 @@ function routeAuditOpen({ args, cwd, raw, error, _audit, _core }) {
|
|
|
86
86
|
c.output(null, true, a.formatAuditReport(result));
|
|
87
87
|
}
|
|
88
88
|
},
|
|
89
|
+
// #3458 follow-up (design point A4): `audit-open acknowledge --category
|
|
90
|
+
// ... --milestone ...` writes/refreshes an `audit_acknowledged`
|
|
91
|
+
// suppression marker. `hubArgs.slice(2)` drops the family token and the
|
|
92
|
+
// `acknowledge` subcommand token itself, leaving just this
|
|
93
|
+
// subcommand's OWN `--flag value` pairs — the same slice
|
|
94
|
+
// `routeHubCommandFamily` itself passes to `hub.dispatch`'s `args`.
|
|
95
|
+
acknowledge: () => a.cmdAuditAcknowledge(cwd, hubArgs.slice(2), raw),
|
|
89
96
|
},
|
|
90
|
-
unknownMessage: (subcommand) => `Unknown audit-open subcommand: "${subcommand}".
|
|
97
|
+
unknownMessage: (subcommand) => `Unknown audit-open subcommand: "${subcommand}". Available: run (default, use --json for JSON output), acknowledge.`,
|
|
91
98
|
error,
|
|
92
99
|
cwd,
|
|
93
100
|
raw,
|