@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
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Codex Agent TOML — typed IR for `~/.codex/agents/<agent>.toml` (#3243, ADR-2313).
|
|
4
|
+
*
|
|
5
|
+
* A genuine leaf: node builtins only. This is a **document model**, not a policy —
|
|
6
|
+
* it knows how to parse/render/strip two known keys (`model`,
|
|
7
|
+
* `model_reasoning_effort`) from a Codex agent `.toml`. It does NOT know which
|
|
8
|
+
* `model` values are illegal for Codex (that predicate — Anthropic-flavored
|
|
9
|
+
* detection — stays in `model-catalog.cts`; callers decide what to strip).
|
|
10
|
+
*
|
|
11
|
+
* Moved here (not copied) from `agent-install-check.cts` (#3242, Phase 2), which
|
|
12
|
+
* wrote the hard half: block-range detection, BOM stripping, TOML value
|
|
13
|
+
* unquoting, and the lenient header scan. That module's behavior is UNCHANGED —
|
|
14
|
+
* it imports `stripBOM`/`scanTomlLines` from here and its regression suite
|
|
15
|
+
* (`tests/agent-install-check.test.cjs`) is the proof.
|
|
16
|
+
*
|
|
17
|
+
* ── The reconciliation (40-design.md) ──────────────────────────────────────
|
|
18
|
+
*
|
|
19
|
+
* Phase 2's reader and this phase's writer disagree on how to handle an
|
|
20
|
+
* unterminated `developer_instructions` block, deliberately:
|
|
21
|
+
*
|
|
22
|
+
* - The READER (`scanTomlLines`, used directly by `checkCodexModelPosture`)
|
|
23
|
+
* stays LENIENT: an unterminated block still excludes "the rest of the
|
|
24
|
+
* file" from the header scan (findDeveloperInstructionsBlockRange's
|
|
25
|
+
* existing fallback), because misreading prompt prose as a pin is only a
|
|
26
|
+
* false positive — it wastes a user's time, nothing more.
|
|
27
|
+
* - The WRITER (`parseCodexAgentToml`, used by the Codex sync) is STRICT: an
|
|
28
|
+
* unterminated block makes the whole document `{ok:false}`, because a
|
|
29
|
+
* writer that proceeds on a malformed document risks rewriting it.
|
|
30
|
+
*
|
|
31
|
+
* One block-range detector, two call sites, two policies — never two detectors
|
|
32
|
+
* that could silently drift from each other.
|
|
33
|
+
*/
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
exports.PARSE_REASON = void 0;
|
|
36
|
+
exports.stripBOM = stripBOM;
|
|
37
|
+
exports.unquoteTomlValue = unquoteTomlValue;
|
|
38
|
+
exports.findDeveloperInstructionsBlockRange = findDeveloperInstructionsBlockRange;
|
|
39
|
+
exports.scanTomlLines = scanTomlLines;
|
|
40
|
+
exports.parseCodexAgentToml = parseCodexAgentToml;
|
|
41
|
+
exports.renderCodexAgentToml = renderCodexAgentToml;
|
|
42
|
+
exports.stripModel = stripModel;
|
|
43
|
+
exports.stripReasoningEffort = stripReasoningEffort;
|
|
44
|
+
/** Frozen reason enum for a failed {@link parseCodexAgentToml}. */
|
|
45
|
+
exports.PARSE_REASON = Object.freeze({
|
|
46
|
+
UNTERMINATED_BLOCK: 'unterminated_block',
|
|
47
|
+
});
|
|
48
|
+
// The UTF-8 BOM codepoint, spelled as an escape rather than the literal
|
|
49
|
+
// character so the source file never carries an invisible codepoint.
|
|
50
|
+
const BOM_CHAR = String.fromCharCode(0xfeff);
|
|
51
|
+
// Strips a leading UTF-8 BOM (U+FEFF), which fs.readFileSync(..., 'utf8') does not
|
|
52
|
+
// strip on its own, and unwraps a TOML basic/literal string value's surrounding
|
|
53
|
+
// quotes so `model = "sonnet"` yields `sonnet`, not `"sonnet"`.
|
|
54
|
+
function stripBOM(content) {
|
|
55
|
+
return content.charCodeAt(0) === 0xfeff ? content.slice(1) : content;
|
|
56
|
+
}
|
|
57
|
+
function unquoteTomlValue(rawValue) {
|
|
58
|
+
const trimmed = rawValue.trim();
|
|
59
|
+
const quoted = trimmed.match(/^"([^"]*)"/) ?? trimmed.match(/^'([^']*)'/);
|
|
60
|
+
return quoted ? quoted[1] : trimmed;
|
|
61
|
+
}
|
|
62
|
+
// The `developer_instructions` block is a TOML multi-line literal string
|
|
63
|
+
// (`developer_instructions = '''...'''`) that `generateCodexAgentToml` always
|
|
64
|
+
// emits after the header fields. Prompt prose inside that block discusses models
|
|
65
|
+
// constantly, so a `model = ...`-shaped line inside it must never be read as a
|
|
66
|
+
// live pin — but the block can legally appear anywhere in the file (a
|
|
67
|
+
// hand-reordered agent can move `model` after it), and another key's *value* can
|
|
68
|
+
// legally contain the literal text `developer_instructions = '''` (e.g. a
|
|
69
|
+
// `description` field quoting it) without that being the real block opener. So
|
|
70
|
+
// instead of truncating the file at the first textual occurrence of the marker
|
|
71
|
+
// anywhere in the content, this locates the block by its anchored line-start
|
|
72
|
+
// opener (`^\s*developer_instructions\s*=\s*'''`, never a mid-line/mid-value
|
|
73
|
+
// match) and its closing `'''` line, and excludes only the lines between them —
|
|
74
|
+
// every other line in the file, before AND after the block, is scanned.
|
|
75
|
+
//
|
|
76
|
+
// If no opener is found, nothing is excluded (the whole file is scanned) and
|
|
77
|
+
// `terminated` is trivially true. If the block IS opened but never closed before
|
|
78
|
+
// EOF (malformed file), `terminated` is false: the lenient reader (scanTomlLines)
|
|
79
|
+
// still treats the rest of the file as inside the block (the safe direction for
|
|
80
|
+
// a reader — see module header comment); the strict writer (parseCodexAgentToml)
|
|
81
|
+
// reads `terminated` and refuses instead. The emitter always uses `'''` (a TOML
|
|
82
|
+
// literal string), never a `"""` basic multi-line string, so only `'''` is
|
|
83
|
+
// treated as the block delimiter here.
|
|
84
|
+
function findDeveloperInstructionsBlockRange(lines) {
|
|
85
|
+
const openIndex = lines.findIndex((line) => /^\s*developer_instructions\s*=\s*'''/.test(line));
|
|
86
|
+
if (openIndex === -1) {
|
|
87
|
+
return { start: -1, end: -1, terminated: true };
|
|
88
|
+
}
|
|
89
|
+
const afterOpenMarker = lines[openIndex].replace(/^\s*developer_instructions\s*=\s*'''/, '');
|
|
90
|
+
if (afterOpenMarker.includes("'''")) {
|
|
91
|
+
// Same-line block: developer_instructions = '''one line'''
|
|
92
|
+
return { start: openIndex, end: openIndex, terminated: true };
|
|
93
|
+
}
|
|
94
|
+
for (let i = openIndex + 1; i < lines.length; i++) {
|
|
95
|
+
if (lines[i].includes("'''")) {
|
|
96
|
+
return { start: openIndex, end: i, terminated: true };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return { start: openIndex, end: lines.length - 1, terminated: false };
|
|
100
|
+
}
|
|
101
|
+
// Line-oriented scan of every line OUTSIDE the `developer_instructions` block
|
|
102
|
+
// (see findDeveloperInstructionsBlockRange). Full-key-name anchoring —
|
|
103
|
+
// `^([A-Za-z_][\w]*)\s*=` for a bare key, or `^"([^"]*)"\s*=` / `^'([^']*)'\s*=`
|
|
104
|
+
// for TOML's legal quoted-key forms, normalized to the same key name — means
|
|
105
|
+
// `model_verbosity` / `model_reasoning_effort` never satisfy a `model` probe,
|
|
106
|
+
// and vice versa; `#`-prefixed lines (after trimming leading whitespace) are
|
|
107
|
+
// treated as comments, never live pins. Shared by both scanTomlLines (the
|
|
108
|
+
// lenient reader, boolean-only for reasoning effort) and parseCodexAgentToml
|
|
109
|
+
// (the strict writer, which also needs the effort's value and both keys' line
|
|
110
|
+
// indices so stripModel/stripReasoningEffort can remove exactly one line).
|
|
111
|
+
function scanHeaderLines(lines, blockStart, blockEnd) {
|
|
112
|
+
let model = null;
|
|
113
|
+
let modelLineIndex = null;
|
|
114
|
+
let reasoningEffort = null;
|
|
115
|
+
let reasoningEffortLineIndex = null;
|
|
116
|
+
for (let i = 0; i < lines.length; i++) {
|
|
117
|
+
if (blockStart !== -1 && i >= blockStart && i <= blockEnd)
|
|
118
|
+
continue;
|
|
119
|
+
const trimmed = lines[i].trim();
|
|
120
|
+
if (trimmed === '' || trimmed.startsWith('#'))
|
|
121
|
+
continue;
|
|
122
|
+
const match = trimmed.match(/^(?:"([^"]*)"|'([^']*)'|([A-Za-z_][\w]*))\s*=\s*(.*)$/);
|
|
123
|
+
if (!match)
|
|
124
|
+
continue;
|
|
125
|
+
const key = match[1] ?? match[2] ?? match[3];
|
|
126
|
+
const rawValue = match[4];
|
|
127
|
+
if (key === 'model') {
|
|
128
|
+
model = unquoteTomlValue(rawValue);
|
|
129
|
+
modelLineIndex = i;
|
|
130
|
+
}
|
|
131
|
+
else if (key === 'model_reasoning_effort') {
|
|
132
|
+
reasoningEffort = unquoteTomlValue(rawValue);
|
|
133
|
+
reasoningEffortLineIndex = i;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return { model, modelLineIndex, reasoningEffort, reasoningEffortLineIndex };
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* The LENIENT reader entry point (Phase 2, moved verbatim in behavior). Never
|
|
140
|
+
* fails: an unterminated block falls back to "rest of file is inside the
|
|
141
|
+
* block" via {@link findDeveloperInstructionsBlockRange}'s own fallback.
|
|
142
|
+
* `content` is expected already BOM-stripped (callers pass `stripBOM(raw)`).
|
|
143
|
+
*/
|
|
144
|
+
function scanTomlLines(content) {
|
|
145
|
+
const lines = content.split(/\r?\n/);
|
|
146
|
+
const { start, end } = findDeveloperInstructionsBlockRange(lines);
|
|
147
|
+
const { model, reasoningEffort } = scanHeaderLines(lines, start, end);
|
|
148
|
+
return { model, hasReasoningEffort: reasoningEffort !== null };
|
|
149
|
+
}
|
|
150
|
+
// Splits `content` into `{lines, terminators}` where `terminators[i]` is the
|
|
151
|
+
// terminator that FOLLOWS `lines[i]` (`'\r\n'`, `'\r'`, `'\n'`, or `''` for a
|
|
152
|
+
// line with none — only possible as the file's last line). The two arrays are
|
|
153
|
+
// always the same length and there is NEVER a phantom trailing entry: a
|
|
154
|
+
// source ending in a terminator (the common case) yields exactly as many
|
|
155
|
+
// lines as it has content lines, not one more. `render` is then a plain
|
|
156
|
+
// `lines[i] + terminators[i]` concatenation with no special-casing of "the
|
|
157
|
+
// last line" — see `renderCodexAgentToml`.
|
|
158
|
+
//
|
|
159
|
+
// `String#split` with a capturing group interleaves the delimiters into the
|
|
160
|
+
// result array — `"a\r\nb\nc".split(/(\r\n|\r|\n)/)` yields
|
|
161
|
+
// `["a","\r\n","b","\n","c"]` — so even indices are line content and odd
|
|
162
|
+
// indices are that line's terminator. When `content` ends WITH a terminator,
|
|
163
|
+
// `split` appends one extra empty-string element after the last real
|
|
164
|
+
// terminator (e.g. `"a\n".split(...)` → `["a","\n",""]`); that trailing `""`
|
|
165
|
+
// is not a real line, it is `split`'s "nothing after the last delimiter"
|
|
166
|
+
// marker, so the loop below stops before consuming it instead of recording it
|
|
167
|
+
// as a phantom empty final line (the defect this replaced — see A29: a doc
|
|
168
|
+
// with a phantom last element made every removal rule reason about the wrong
|
|
169
|
+
// element for any trailing-newline-terminated file, the common case). `\r\n`
|
|
170
|
+
// is tried before the bare `\r` alternative so a CRLF is never misread as a
|
|
171
|
+
// lone-CR line followed by an empty LF-terminated line.
|
|
172
|
+
function splitPreservingTerminators(content) {
|
|
173
|
+
if (content === '')
|
|
174
|
+
return { lines: [], terminators: [] };
|
|
175
|
+
const parts = content.split(/(\r\n|\r|\n)/);
|
|
176
|
+
const lastIndex = parts.length - 1;
|
|
177
|
+
const lines = [];
|
|
178
|
+
const terminators = [];
|
|
179
|
+
for (let i = 0; i < parts.length; i += 2) {
|
|
180
|
+
if (i === lastIndex && parts[i] === '')
|
|
181
|
+
break; // split's post-terminator marker, not a real line
|
|
182
|
+
lines.push(parts[i]);
|
|
183
|
+
terminators.push(parts[i + 1] ?? '');
|
|
184
|
+
}
|
|
185
|
+
return { lines, terminators };
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* The STRICT parse entry point (Phase 3, the writer's half of the
|
|
189
|
+
* reconciliation). Returns `{ok:false, reason:UNTERMINATED_BLOCK}` rather than
|
|
190
|
+
* guessing when the `developer_instructions` block is opened but never closed.
|
|
191
|
+
* On success, `doc` carries enough (the original `lines`/`terminators`, BOM/
|
|
192
|
+
* trailing-newline flags, and the two resolved values with their line indices)
|
|
193
|
+
* for {@link renderCodexAgentToml} to reproduce the source byte-identically —
|
|
194
|
+
* including a source with mixed line-ending styles — and for
|
|
195
|
+
* {@link stripModel}/{@link stripReasoningEffort} to remove exactly one line
|
|
196
|
+
* and its own terminator.
|
|
197
|
+
*/
|
|
198
|
+
function parseCodexAgentToml(content) {
|
|
199
|
+
const hadBOM = content.charCodeAt(0) === 0xfeff;
|
|
200
|
+
const stripped = stripBOM(content);
|
|
201
|
+
// Informational only — see CodexAgentDoc.eol's docstring. Never used by
|
|
202
|
+
// renderCodexAgentToml.
|
|
203
|
+
const eol = stripped.includes('\r\n') ? '\r\n' : '\n';
|
|
204
|
+
const trailingNewline = /(\r\n|\r|\n)$/.test(stripped);
|
|
205
|
+
const { lines, terminators } = splitPreservingTerminators(stripped);
|
|
206
|
+
const { start, end, terminated } = findDeveloperInstructionsBlockRange(lines);
|
|
207
|
+
if (start !== -1 && !terminated) {
|
|
208
|
+
return { ok: false, reason: exports.PARSE_REASON.UNTERMINATED_BLOCK };
|
|
209
|
+
}
|
|
210
|
+
const { model, modelLineIndex, reasoningEffort, reasoningEffortLineIndex } = scanHeaderLines(lines, start, end);
|
|
211
|
+
const doc = {
|
|
212
|
+
lines,
|
|
213
|
+
terminators,
|
|
214
|
+
eol,
|
|
215
|
+
hadBOM,
|
|
216
|
+
trailingNewline,
|
|
217
|
+
blockRange: { start, end },
|
|
218
|
+
model,
|
|
219
|
+
modelLineIndex,
|
|
220
|
+
reasoningEffort,
|
|
221
|
+
reasoningEffortLineIndex,
|
|
222
|
+
};
|
|
223
|
+
return { ok: true, doc };
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Renders `doc` back to a string. For an unmodified doc this is
|
|
227
|
+
* byte-identical to the original `parseCodexAgentToml` input (matrix row
|
|
228
|
+
* A14) — it never re-derives line content, only rejoins each line with its
|
|
229
|
+
* OWN recorded terminator (`terminators[i]`, never the whole-file `eol`) and
|
|
230
|
+
* re-prepends a BOM if one was present. This is a plain concatenation of the
|
|
231
|
+
* surviving `[line, terminator]` pieces, so a source with mixed `\r\n`/`\n`/
|
|
232
|
+
* lone-`\r` line endings round-trips exactly, and a strip
|
|
233
|
+
* ({@link stripModel}/{@link stripReasoningEffort}) removes only the target
|
|
234
|
+
* line and its own terminator — every other line's ending is untouched.
|
|
235
|
+
*/
|
|
236
|
+
function renderCodexAgentToml(doc) {
|
|
237
|
+
let body = '';
|
|
238
|
+
for (let i = 0; i < doc.lines.length; i++) {
|
|
239
|
+
body += doc.lines[i] + (doc.terminators[i] ?? '');
|
|
240
|
+
}
|
|
241
|
+
return doc.hadBOM ? BOM_CHAR + body : body;
|
|
242
|
+
}
|
|
243
|
+
// Removes exactly one line (by index) — AND its own terminator — from
|
|
244
|
+
// `doc.lines`/`doc.terminators`, re-indexing the block range and the OTHER
|
|
245
|
+
// key's line index so a subsequent strip/render still sees a consistent doc.
|
|
246
|
+
// Never touches any other line's content or terminator.
|
|
247
|
+
//
|
|
248
|
+
// The one exception is when `index` names the file's LAST line: a plain
|
|
249
|
+
// slice-out would drop the removed line's terminator but leave the
|
|
250
|
+
// *previous* line's terminator standing in its place, which silently
|
|
251
|
+
// invents (or drops) a trailing newline the source never had — a middle-line
|
|
252
|
+
// removal never has this problem because the terminator that survives (the
|
|
253
|
+
// one that WAS between the previous line and the removed one) is exactly the
|
|
254
|
+
// terminator the new neighbors should have between them. For a last-line
|
|
255
|
+
// removal, the file's trailing-newline-or-not status lives in whether the
|
|
256
|
+
// REMOVED line's own terminator was empty (that is what `trailingNewline`
|
|
257
|
+
// was computed from) — so the new last line inherits the removed line's
|
|
258
|
+
// EMPTINESS only: if the removed terminator was `''`, the new last line's
|
|
259
|
+
// terminator is cleared to `''` too. If the removed terminator was
|
|
260
|
+
// non-empty, the source already ended with a newline and the new last line
|
|
261
|
+
// already has the right one (its OWN, unchanged) — overwriting it with the
|
|
262
|
+
// removed line's terminator would silently change the new last line's own
|
|
263
|
+
// ending style on a mixed-EOL source (see A26). Removing the only remaining
|
|
264
|
+
// line is the degenerate case: there is no new last line, so the result is
|
|
265
|
+
// the empty document.
|
|
266
|
+
function removeLine(doc, index, which) {
|
|
267
|
+
const isLastLine = index === doc.lines.length - 1;
|
|
268
|
+
let lines;
|
|
269
|
+
let terminators;
|
|
270
|
+
if (doc.lines.length === 1) {
|
|
271
|
+
lines = [];
|
|
272
|
+
terminators = [];
|
|
273
|
+
}
|
|
274
|
+
else if (isLastLine) {
|
|
275
|
+
lines = doc.lines.slice(0, index);
|
|
276
|
+
terminators = doc.terminators.slice(0, index);
|
|
277
|
+
// Inherit the removed line's EMPTINESS, never its STYLE: if the removed
|
|
278
|
+
// line had no terminator (the source had no trailing newline), the new
|
|
279
|
+
// last line's terminator becomes '' too. Otherwise the source DID end
|
|
280
|
+
// with a newline, and the new last line already has the right one — its
|
|
281
|
+
// OWN terminator (already carried over by the slice above), which may
|
|
282
|
+
// differ in style from the removed line's (a mixed-EOL source) — so it is
|
|
283
|
+
// left unchanged rather than overwritten.
|
|
284
|
+
if (doc.terminators[index] === '') {
|
|
285
|
+
terminators[terminators.length - 1] = '';
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
lines = doc.lines.slice(0, index).concat(doc.lines.slice(index + 1));
|
|
290
|
+
terminators = doc.terminators.slice(0, index).concat(doc.terminators.slice(index + 1));
|
|
291
|
+
}
|
|
292
|
+
const reindex = (i) => (i === null ? null : i > index ? i - 1 : i);
|
|
293
|
+
const blockRange = { ...doc.blockRange };
|
|
294
|
+
if (blockRange.start !== -1) {
|
|
295
|
+
if (blockRange.start > index)
|
|
296
|
+
blockRange.start -= 1;
|
|
297
|
+
if (blockRange.end > index)
|
|
298
|
+
blockRange.end -= 1;
|
|
299
|
+
}
|
|
300
|
+
return {
|
|
301
|
+
...doc,
|
|
302
|
+
lines,
|
|
303
|
+
terminators,
|
|
304
|
+
blockRange,
|
|
305
|
+
model: which === 'model' ? null : doc.model,
|
|
306
|
+
modelLineIndex: which === 'model' ? null : reindex(doc.modelLineIndex),
|
|
307
|
+
reasoningEffort: which === 'reasoningEffort' ? null : doc.reasoningEffort,
|
|
308
|
+
reasoningEffortLineIndex: which === 'reasoningEffort' ? null : reindex(doc.reasoningEffortLineIndex),
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Returns a new doc with the `model` line removed (a no-op copy if there was
|
|
313
|
+
* no `model` line). Every other byte — comments, other keys, the
|
|
314
|
+
* `developer_instructions` block, line endings, BOM — is untouched.
|
|
315
|
+
*/
|
|
316
|
+
function stripModel(doc) {
|
|
317
|
+
if (doc.modelLineIndex === null)
|
|
318
|
+
return doc;
|
|
319
|
+
return removeLine(doc, doc.modelLineIndex, 'model');
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Returns a new doc with the `model_reasoning_effort` line removed (a no-op
|
|
323
|
+
* copy if there was none). Every other byte is untouched.
|
|
324
|
+
*/
|
|
325
|
+
function stripReasoningEffort(doc) {
|
|
326
|
+
if (doc.reasoningEffortLineIndex === null)
|
|
327
|
+
return doc;
|
|
328
|
+
return removeLine(doc, doc.reasoningEffortLineIndex, 'reasoningEffort');
|
|
329
|
+
}
|
|
@@ -331,6 +331,30 @@ exports.INIT_COMMAND_ALIASES = [
|
|
|
331
331
|
"subcommand": "phase-op",
|
|
332
332
|
"mutation": false
|
|
333
333
|
},
|
|
334
|
+
{
|
|
335
|
+
"canonical": "init.code-review",
|
|
336
|
+
"aliases": [
|
|
337
|
+
"init code-review"
|
|
338
|
+
],
|
|
339
|
+
"subcommand": "code-review",
|
|
340
|
+
"mutation": false
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
"canonical": "init.review",
|
|
344
|
+
"aliases": [
|
|
345
|
+
"init review"
|
|
346
|
+
],
|
|
347
|
+
"subcommand": "review",
|
|
348
|
+
"mutation": false
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
"canonical": "init.discuss-phase-assumptions",
|
|
352
|
+
"aliases": [
|
|
353
|
+
"init discuss-phase-assumptions"
|
|
354
|
+
],
|
|
355
|
+
"subcommand": "discuss-phase-assumptions",
|
|
356
|
+
"mutation": false
|
|
357
|
+
},
|
|
334
358
|
{
|
|
335
359
|
"canonical": "init.todos",
|
|
336
360
|
"aliases": [
|
|
@@ -371,6 +395,54 @@ exports.INIT_COMMAND_ALIASES = [
|
|
|
371
395
|
"subcommand": "manager",
|
|
372
396
|
"mutation": false
|
|
373
397
|
},
|
|
398
|
+
{
|
|
399
|
+
"canonical": "init.complete-milestone",
|
|
400
|
+
"aliases": [
|
|
401
|
+
"init complete-milestone"
|
|
402
|
+
],
|
|
403
|
+
"subcommand": "complete-milestone",
|
|
404
|
+
"mutation": false
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
"canonical": "init.autonomous",
|
|
408
|
+
"aliases": [
|
|
409
|
+
"init autonomous"
|
|
410
|
+
],
|
|
411
|
+
"subcommand": "autonomous",
|
|
412
|
+
"mutation": false
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
"canonical": "init.docs-update",
|
|
416
|
+
"aliases": [
|
|
417
|
+
"init docs-update"
|
|
418
|
+
],
|
|
419
|
+
"subcommand": "docs-update",
|
|
420
|
+
"mutation": false
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
"canonical": "init.update",
|
|
424
|
+
"aliases": [
|
|
425
|
+
"init update"
|
|
426
|
+
],
|
|
427
|
+
"subcommand": "update",
|
|
428
|
+
"mutation": false
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
"canonical": "init.transition",
|
|
432
|
+
"aliases": [
|
|
433
|
+
"init transition"
|
|
434
|
+
],
|
|
435
|
+
"subcommand": "transition",
|
|
436
|
+
"mutation": false
|
|
437
|
+
},
|
|
438
|
+
{
|
|
439
|
+
"canonical": "init.debug",
|
|
440
|
+
"aliases": [
|
|
441
|
+
"init debug"
|
|
442
|
+
],
|
|
443
|
+
"subcommand": "debug",
|
|
444
|
+
"mutation": false
|
|
445
|
+
},
|
|
374
446
|
{
|
|
375
447
|
"canonical": "init.new-workspace",
|
|
376
448
|
"aliases": [
|
|
@@ -539,6 +611,14 @@ exports.ROADMAP_COMMAND_ALIASES = [
|
|
|
539
611
|
"subcommand": "analyze",
|
|
540
612
|
"mutation": false
|
|
541
613
|
},
|
|
614
|
+
{
|
|
615
|
+
"canonical": "roadmap.milestone-scope",
|
|
616
|
+
"aliases": [
|
|
617
|
+
"roadmap milestone-scope"
|
|
618
|
+
],
|
|
619
|
+
"subcommand": "milestone-scope",
|
|
620
|
+
"mutation": false
|
|
621
|
+
},
|
|
542
622
|
{
|
|
543
623
|
"canonical": "roadmap.get-phase",
|
|
544
624
|
"aliases": [
|
|
@@ -612,6 +692,20 @@ exports.NON_FAMILY_COMMAND_ALIASES = [
|
|
|
612
692
|
"aliases": [],
|
|
613
693
|
"mutation": true
|
|
614
694
|
},
|
|
695
|
+
{
|
|
696
|
+
"canonical": "commit-docs-guard.disable",
|
|
697
|
+
"aliases": [
|
|
698
|
+
"commit-docs-guard disable"
|
|
699
|
+
],
|
|
700
|
+
"mutation": true
|
|
701
|
+
},
|
|
702
|
+
{
|
|
703
|
+
"canonical": "commit-docs-guard.enable",
|
|
704
|
+
"aliases": [
|
|
705
|
+
"commit-docs-guard enable"
|
|
706
|
+
],
|
|
707
|
+
"mutation": true
|
|
708
|
+
},
|
|
615
709
|
{
|
|
616
710
|
"canonical": "commit-to-subrepo",
|
|
617
711
|
"aliases": [],
|
|
@@ -1,14 +1,57 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
/**
|
|
3
6
|
* Command Roster Module
|
|
4
7
|
*
|
|
5
8
|
* Read-only helper for discovering canonical commands/gsd command stems and
|
|
6
9
|
* applying the shared GSD slash-command namespace transform.
|
|
7
10
|
*/
|
|
11
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
12
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
13
|
+
// #2874 (ADR-58 cleanup phase): readGsdCommandNames is reached from
|
|
14
|
+
// installRuntimeArtifacts's call tree (skillsKind's stage() closure reads it
|
|
15
|
+
// for cross-referencing), but COMMANDS_DIR (below) is resolved by walking up
|
|
16
|
+
// from THIS MODULE'S OWN compiled __dirname to locate the GSD PACKAGE'S OWN
|
|
17
|
+
// commands/gsd/ source tree — not anything under the install destination.
|
|
18
|
+
// This is the exact same "package's own source, not the destination" case
|
|
19
|
+
// findInstallSourceRoot/findAgentsSourceRoot document in
|
|
20
|
+
// runtime-artifact-layout.cts's Step 2 (see that comment and
|
|
21
|
+
// install-fs-adapter.cts's module doc, "DELIBERATELY NOT ROUTED" section):
|
|
22
|
+
// an injected destination adapter's store starts empty and is never seeded
|
|
23
|
+
// with the real package's own on-disk layout, so routing this read through
|
|
24
|
+
// installFs() would make a fake-adapter install either silently return `[]`
|
|
25
|
+
// (via the ENOENT swallow below) or resolve wrong stems — never loudly fail,
|
|
26
|
+
// and never see the real package tree either way. This directory read
|
|
27
|
+
// therefore deliberately stays on real `node:fs`, unrouted — same rule,
|
|
28
|
+
// applied consistently, not an inconsistency with the routed staging calls
|
|
29
|
+
// elsewhere in this call tree. `readCmdNames` in
|
|
30
|
+
// scripts/fix-slash-commands.cjs also uses real `node:fs` directly (that
|
|
31
|
+
// script lives outside src/ and is also a standalone CLI tool), so its
|
|
32
|
+
// directory-read logic is reimplemented here against real fs instead of
|
|
33
|
+
// delegated to, keeping the pure regex/transform helpers below delegated as
|
|
34
|
+
// before.
|
|
8
35
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
9
36
|
const slashCommandTransformer = require('../../../scripts/fix-slash-commands.cjs');
|
|
37
|
+
// Mirrors scripts/fix-slash-commands.cjs's own `COMMANDS_DIR` computation
|
|
38
|
+
// (`path.join(__dirname, '..', 'commands', 'gsd')` from repo-root/scripts) —
|
|
39
|
+
// same target directory, resolved from this module's own compiled location
|
|
40
|
+
// (repo-root/gsd-core/bin/lib) instead, so the walk-up depth differs.
|
|
41
|
+
const COMMANDS_DIR = node_path_1.default.join(__dirname, '..', '..', '..', 'commands', 'gsd');
|
|
10
42
|
function readGsdCommandNames() {
|
|
11
|
-
|
|
43
|
+
try {
|
|
44
|
+
return node_fs_1.default.readdirSync(COMMANDS_DIR)
|
|
45
|
+
.filter((f) => f.endsWith('.md'))
|
|
46
|
+
.map((f) => f.replace(/\.md$/, ''));
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
// Only swallow the missing-directory case — mirrors readCmdNames' own
|
|
50
|
+
// contract (scripts/fix-slash-commands.cjs).
|
|
51
|
+
if (err instanceof Error && err.code !== 'ENOENT')
|
|
52
|
+
throw err;
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
12
55
|
}
|
|
13
56
|
module.exports = {
|
|
14
57
|
readGsdCommandNames,
|