@opengsd/gsd-core 1.17.0 → 1.19.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 -1
- package/.opencode/plugins/gsd-core.js +2 -3
- package/agents/gsd-advisor-researcher.compact.md +1 -1
- package/agents/gsd-advisor-researcher.md +1 -1
- package/agents/gsd-assumptions-analyzer.compact.md +1 -1
- package/agents/gsd-assumptions-analyzer.md +1 -1
- package/agents/gsd-code-fixer.compact.md +3 -3
- package/agents/gsd-code-fixer.md +5 -4
- package/agents/gsd-code-reviewer.compact.md +1 -1
- package/agents/gsd-code-reviewer.md +1 -1
- package/agents/gsd-codebase-mapper.compact.md +1 -1
- package/agents/gsd-codebase-mapper.md +1 -1
- package/agents/gsd-debugger.md +1 -1
- package/agents/gsd-doc-verifier.compact.md +4 -4
- package/agents/gsd-doc-verifier.md +4 -3
- package/agents/gsd-doc-writer.compact.md +23 -5
- package/agents/gsd-doc-writer.md +19 -6
- package/agents/gsd-eval-auditor.compact.md +1 -1
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-executor.md +7 -3
- package/agents/gsd-integration-checker.compact.md +1 -1
- package/agents/gsd-integration-checker.md +1 -1
- package/agents/gsd-nyquist-auditor.compact.md +1 -1
- package/agents/gsd-nyquist-auditor.md +1 -1
- package/agents/gsd-phase-researcher.md +1 -1
- package/agents/gsd-plan-checker.md +2 -1
- package/agents/gsd-planner.md +5 -4
- package/agents/gsd-project-researcher.compact.md +1 -1
- package/agents/gsd-project-researcher.md +1 -1
- package/agents/gsd-research-synthesizer.compact.md +5 -5
- package/agents/gsd-research-synthesizer.md +5 -5
- package/agents/gsd-roadmapper.compact.md +1 -1
- package/agents/gsd-roadmapper.md +1 -1
- package/agents/gsd-security-auditor.compact.md +1 -1
- package/agents/gsd-security-auditor.md +1 -1
- package/agents/gsd-ui-auditor.compact.md +1 -1
- package/agents/gsd-ui-auditor.md +1 -1
- package/agents/gsd-ui-checker.compact.md +1 -1
- package/agents/gsd-ui-checker.md +1 -1
- package/agents/gsd-ui-researcher.compact.md +13 -1
- package/agents/gsd-ui-researcher.md +28 -1
- package/agents/gsd-verifier.md +2 -2
- package/bin/install.js +460 -105
- package/commands/gsd/code-review.md +8 -0
- package/commands/gsd/pause-work.md +1 -1
- package/gsd-core/bin/gsd-tools.cjs +124 -18
- package/gsd-core/bin/lib/agent-install-check.cjs +29 -3
- package/gsd-core/bin/lib/args-terminator.cjs +114 -0
- package/gsd-core/bin/lib/broken-windows.cjs +59 -1
- package/gsd-core/bin/lib/capability-ledger.cjs +25 -0
- package/gsd-core/bin/lib/capability-lock.cjs +41 -8
- package/gsd-core/bin/lib/capability-registry.cjs +162 -74
- package/gsd-core/bin/lib/capability-source.cjs +3 -1
- package/gsd-core/bin/lib/capability-state.cjs +20 -11
- package/gsd-core/bin/lib/capability-validator.cjs +23 -4
- package/gsd-core/bin/lib/commands.cjs +5 -1
- package/gsd-core/bin/lib/config-loader.cjs +13 -3
- package/gsd-core/bin/lib/config.cjs +256 -58
- package/gsd-core/bin/lib/core-utils.cjs +34 -0
- package/gsd-core/bin/lib/decision-coverage-support.cjs +93 -0
- package/gsd-core/bin/lib/gate-context-drift.cjs +8 -3
- package/gsd-core/bin/lib/gate-decision-coverage-plan.cjs +21 -1
- package/gsd-core/bin/lib/gate-decision-coverage-verify.cjs +19 -1
- package/gsd-core/bin/lib/gate-evaluation-scope.cjs +134 -13
- package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +23 -3
- package/gsd-core/bin/lib/gate-predicate.cjs +8 -12
- package/gsd-core/bin/lib/gate-tdd-review-checkpoint.cjs +114 -18
- package/gsd-core/bin/lib/gate-ui-safety.cjs +23 -5
- package/gsd-core/bin/lib/git-info-exclude.cjs +57 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +18 -3
- package/gsd-core/bin/lib/health-diagnostic-types.cjs +4 -0
- package/gsd-core/bin/lib/health-diagnostic.cjs +52 -1
- package/gsd-core/bin/lib/host-integration.cjs +13 -6
- package/gsd-core/bin/lib/init.cjs +76 -5
- package/gsd-core/bin/lib/install-effort-resolver.cjs +2 -2
- package/gsd-core/bin/lib/install-engine.cjs +246 -32
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +4 -3
- package/gsd-core/bin/lib/install-profiles.cjs +14 -7
- package/gsd-core/bin/lib/installer-migration-report.cjs +2 -0
- package/gsd-core/bin/lib/markdown-line-diff.cjs +147 -0
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +113 -0
- package/gsd-core/bin/lib/milestone-lock.cjs +8 -1
- package/gsd-core/bin/lib/milestone-release-map.cjs +244 -0
- package/gsd-core/bin/lib/milestone-release-tags.cjs +440 -0
- package/gsd-core/bin/lib/milestone.cjs +43 -1
- package/gsd-core/bin/lib/model-catalog.cjs +8 -0
- package/gsd-core/bin/lib/normalize-test-command.cjs +67 -0
- package/gsd-core/bin/lib/phase-id.cjs +21 -4
- package/gsd-core/bin/lib/phase-lifecycle.cjs +37 -4
- package/gsd-core/bin/lib/phase.cjs +235 -37
- package/gsd-core/bin/lib/planning-snapshot.cjs +3 -1
- package/gsd-core/bin/lib/planning-workspace.cjs +18 -0
- package/gsd-core/bin/lib/pristine-baseline.cjs +11 -3
- package/gsd-core/bin/lib/read-only-git-env.cjs +58 -0
- package/gsd-core/bin/lib/report-parser.cjs +57 -1
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +35 -2
- package/gsd-core/bin/lib/review-lane-invocation.cjs +40 -0
- package/gsd-core/bin/lib/review-lane-runner.cjs +33 -4
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +20 -1
- package/gsd-core/bin/lib/roadmap-parser.cjs +12 -0
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +39 -2
- package/gsd-core/bin/lib/roadmap.cjs +89 -30
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +428 -16
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +8 -4
- package/gsd-core/bin/lib/runtime-homes.cjs +18 -0
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +60 -16
- package/gsd-core/bin/lib/shell-command-projection.cjs +123 -16
- package/gsd-core/bin/lib/smart-entry.cjs +37 -16
- package/gsd-core/bin/lib/state-contract.cjs +29 -9
- package/gsd-core/bin/lib/state-document.cjs +47 -5
- package/gsd-core/bin/lib/state-transition.cjs +150 -34
- package/gsd-core/bin/lib/state.cjs +140 -88
- package/gsd-core/bin/lib/surface.cjs +9 -0
- package/gsd-core/bin/lib/task-command-router.cjs +7 -28
- package/gsd-core/bin/lib/task-content-resolution.cjs +46 -1
- package/gsd-core/bin/lib/tdd-red-evidence.cjs +5 -0
- package/gsd-core/bin/lib/tdd-test-files.cjs +42 -0
- package/gsd-core/bin/lib/verification.cjs +96 -9
- package/gsd-core/bin/lib/verify.cjs +38 -1
- package/gsd-core/bin/lib/worktree-safety.cjs +22 -1
- package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +1 -0
- package/gsd-core/references/agent-contracts.md +1 -1
- package/gsd-core/references/agent-skills-bootstrap.md +26 -7
- package/gsd-core/references/git-integration.md +14 -3
- package/gsd-core/references/loop-hook-dispatch.md +13 -6
- package/gsd-core/references/planner-reversibility.md +18 -4
- package/gsd-core/references/planner-verify-command-grounding.md +18 -0
- package/gsd-core/references/planning-config.md +2 -0
- package/gsd-core/references/tdd.md +5 -4
- package/gsd-core/references/verifier-phase-gates.md +8 -1
- package/gsd-core/templates/DEBUG.md +16 -0
- package/gsd-core/templates/config.json +2 -1
- package/gsd-core/templates/verification-report.md +1 -1
- package/gsd-core/workflows/add-backlog.md +10 -2
- package/gsd-core/workflows/add-phase.md +5 -1
- package/gsd-core/workflows/add-tests.md +5 -1
- package/gsd-core/workflows/add-todo.md +5 -1
- package/gsd-core/workflows/ai-integration-phase.md +5 -1
- package/gsd-core/workflows/audit-fix.md +2 -1
- package/gsd-core/workflows/audit-milestone.md +21 -9
- package/gsd-core/workflows/autonomous/templates/minimal-context.md +41 -0
- package/gsd-core/workflows/autonomous.md +52 -64
- package/gsd-core/workflows/check-todos.md +5 -1
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +10 -1
- package/gsd-core/workflows/code-review-fix.md +5 -1
- package/gsd-core/workflows/code-review.md +66 -8
- package/gsd-core/workflows/complete-milestone/detail/elaboration.md +5 -1
- package/gsd-core/workflows/complete-milestone/steps/project-md-evolution-review.md +145 -0
- package/gsd-core/workflows/complete-milestone/steps/release-map.md +80 -0
- package/gsd-core/workflows/complete-milestone.md +64 -157
- package/gsd-core/workflows/debug.md +5 -1
- package/gsd-core/workflows/diagnose-issues.md +34 -6
- package/gsd-core/workflows/discuss-phase/modes/chain.md +5 -1
- package/gsd-core/workflows/discuss-phase/modes/power.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions.md +44 -5
- package/gsd-core/workflows/discuss-phase-power.md +19 -2
- package/gsd-core/workflows/discuss-phase.md +11 -11
- package/gsd-core/workflows/docs-update/detail/elaboration.md +7 -6
- package/gsd-core/workflows/docs-update.md +27 -5
- package/gsd-core/workflows/edit-phase.md +5 -1
- package/gsd-core/workflows/eval-review.md +11 -3
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +5 -1
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +13 -7
- package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +19 -8
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +21 -3
- package/gsd-core/workflows/execute-phase/steps/regression-gate.md +18 -1
- package/gsd-core/workflows/execute-phase/steps/verify-phase-goal.md +7 -3
- package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +11 -2
- package/gsd-core/workflows/execute-phase.md +46 -11
- package/gsd-core/workflows/execute-plan.md +8 -4
- package/gsd-core/workflows/extract-learnings.md +6 -2
- package/gsd-core/workflows/forensics.md +5 -1
- package/gsd-core/workflows/health.md +2 -1
- package/gsd-core/workflows/import.md +6 -2
- package/gsd-core/workflows/insert-phase.md +5 -1
- package/gsd-core/workflows/manager.md +10 -2
- package/gsd-core/workflows/map-codebase.md +5 -1
- package/gsd-core/workflows/milestone-summary.md +10 -2
- package/gsd-core/workflows/new-milestone.md +13 -5
- package/gsd-core/workflows/new-project.md +9 -5
- package/gsd-core/workflows/next.md +8 -4
- package/gsd-core/workflows/pause-work.md +3 -3
- package/gsd-core/workflows/plan-phase/steps/auto-advance-check.md +70 -0
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +7 -3
- package/gsd-core/workflows/plan-phase/steps/closed-phase-gate.md +6 -2
- package/gsd-core/workflows/plan-phase.md +54 -86
- package/gsd-core/workflows/plan-review-convergence.md +17 -5
- package/gsd-core/workflows/plant-seed.md +8 -4
- package/gsd-core/workflows/progress.md +6 -2
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +1 -1
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +8 -1
- package/gsd-core/workflows/quick-batch/steps/plan-checker-loop.md +2 -1
- package/gsd-core/workflows/quick-batch.md +5 -1
- package/gsd-core/workflows/quick.md +23 -8
- package/gsd-core/workflows/remove-phase.md +5 -1
- package/gsd-core/workflows/resume-project.md +5 -1
- package/gsd-core/workflows/review.md +22 -15
- package/gsd-core/workflows/scan.md +5 -1
- package/gsd-core/workflows/section-manifest.json +5 -0
- package/gsd-core/workflows/secure-phase.md +6 -2
- package/gsd-core/workflows/settings.md +4 -3
- package/gsd-core/workflows/ship.md +16 -14
- package/gsd-core/workflows/spec-phase.md +3 -6
- package/gsd-core/workflows/thread.md +10 -2
- package/gsd-core/workflows/transition.md +5 -1
- package/gsd-core/workflows/ui-phase.md +5 -1
- package/gsd-core/workflows/ui-review.md +6 -2
- package/gsd-core/workflows/ultraplan-phase.md +5 -1
- package/gsd-core/workflows/update.md +5 -1
- package/gsd-core/workflows/validate-phase.md +6 -2
- package/gsd-core/workflows/verify-work/detail/elaboration.md +1 -1
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +5 -1
- package/gsd-core/workflows/verify-work.md +15 -6
- package/hooks/dist/gsd-agent-isolation-guard.js +14 -2
- package/hooks/dist/gsd-cursor-subagent-start.js +8 -3
- package/hooks/dist/gsd-path-export.js +95 -0
- package/hooks/dist/gsd-secret-read-guard.js +244 -53
- package/hooks/dist/gsd-statusline.js +35 -2
- package/hooks/dist/gsd-validate-commit.sh +27 -5
- package/hooks/dist/gsd-windsurf-pre-write.js +28 -1
- package/hooks/dist/gsd-workflow-guard.js +1 -1
- package/hooks/dist/gsd-worktree-path-guard.js +28 -1
- package/hooks/dist/lib/isolation-sentinel.js +44 -0
- package/hooks/dist/managed-hooks-registry.cjs +1 -0
- package/hooks/gsd-agent-isolation-guard.js +14 -2
- package/hooks/gsd-cursor-subagent-start.js +8 -3
- package/hooks/gsd-path-export.js +95 -0
- package/hooks/gsd-secret-read-guard.js +244 -53
- package/hooks/gsd-statusline.js +35 -2
- package/hooks/gsd-validate-commit.sh +27 -5
- package/hooks/gsd-windsurf-pre-write.js +28 -1
- package/hooks/gsd-workflow-guard.js +1 -1
- package/hooks/gsd-worktree-path-guard.js +28 -1
- package/hooks/hooks.json +1 -0
- package/hooks/lib/isolation-sentinel.js +44 -0
- package/hooks/managed-hooks-registry.cjs +1 -0
- package/package.json +13 -6
- package/pi/gsd.cjs +1047 -10
- package/pi/package-agents/gsd-advisor-researcher.md +113 -0
- package/pi/package-agents/gsd-ai-researcher.md +111 -0
- package/pi/package-agents/gsd-assumptions-analyzer.md +110 -0
- package/pi/package-agents/gsd-code-fixer.md +769 -0
- package/pi/package-agents/gsd-code-reviewer.md +402 -0
- package/pi/package-agents/gsd-codebase-mapper.md +850 -0
- package/pi/package-agents/gsd-debug-session-manager.md +416 -0
- package/pi/package-agents/gsd-debugger.md +1274 -0
- package/pi/package-agents/gsd-doc-classifier.md +269 -0
- package/pi/package-agents/gsd-doc-synthesizer.md +259 -0
- package/pi/package-agents/gsd-doc-verifier.md +212 -0
- package/pi/package-agents/gsd-doc-writer.md +626 -0
- package/pi/package-agents/gsd-dom-verifier.md +164 -0
- package/pi/package-agents/gsd-domain-researcher.md +144 -0
- package/pi/package-agents/gsd-eval-auditor.md +185 -0
- package/pi/package-agents/gsd-eval-planner.md +149 -0
- package/pi/package-agents/gsd-executor.md +894 -0
- package/pi/package-agents/gsd-framework-selector.md +159 -0
- package/pi/package-agents/gsd-integration-checker.md +476 -0
- package/pi/package-agents/gsd-intel-updater.md +338 -0
- package/pi/package-agents/gsd-mempalace-curator.md +49 -0
- package/pi/package-agents/gsd-nyquist-auditor.md +200 -0
- package/pi/package-agents/gsd-pattern-mapper.md +340 -0
- package/pi/package-agents/gsd-phase-researcher.md +897 -0
- package/pi/package-agents/gsd-plan-checker.md +1077 -0
- package/pi/package-agents/gsd-planner.md +1003 -0
- package/pi/package-agents/gsd-project-researcher.md +611 -0
- package/pi/package-agents/gsd-research-synthesizer.md +259 -0
- package/pi/package-agents/gsd-roadmapper.md +779 -0
- package/pi/package-agents/gsd-security-auditor.md +171 -0
- package/pi/package-agents/gsd-ui-auditor.md +581 -0
- package/pi/package-agents/gsd-ui-checker.md +417 -0
- package/pi/package-agents/gsd-ui-researcher.md +469 -0
- package/pi/package-agents/gsd-user-profiler.md +174 -0
- package/pi/package-agents/gsd-verifier.md +963 -0
- package/pi/package-agents/manifest.json +39 -0
- package/pi/package-skills/gsd-add-tests/SKILL.md +39 -0
- package/pi/package-skills/gsd-ai-integration-phase/SKILL.md +36 -0
- package/pi/package-skills/gsd-audit-fix/SKILL.md +34 -0
- package/pi/package-skills/gsd-audit-milestone/SKILL.md +40 -0
- package/pi/package-skills/gsd-audit-uat/SKILL.md +26 -0
- package/pi/package-skills/gsd-autonomous/SKILL.md +52 -0
- package/pi/package-skills/gsd-capture/SKILL.md +68 -0
- package/pi/package-skills/gsd-cleanup/SKILL.md +25 -0
- package/pi/package-skills/gsd-code-review/SKILL.md +71 -0
- package/pi/package-skills/gsd-complete-milestone/SKILL.md +147 -0
- package/pi/package-skills/gsd-config/SKILL.md +60 -0
- package/pi/package-skills/gsd-debug/SKILL.md +64 -0
- package/pi/package-skills/gsd-discuss-phase/SKILL.md +74 -0
- package/pi/package-skills/gsd-docs-update/SKILL.md +50 -0
- package/pi/package-skills/gsd-eval-review/SKILL.md +35 -0
- package/pi/package-skills/gsd-execute-phase/SKILL.md +62 -0
- package/pi/package-skills/gsd-explore/SKILL.md +26 -0
- package/pi/package-skills/gsd-extract-learnings/SKILL.md +25 -0
- package/pi/package-skills/gsd-fast/SKILL.md +33 -0
- package/pi/package-skills/gsd-forensics/SKILL.md +59 -0
- package/pi/package-skills/gsd-graphify/SKILL.md +210 -0
- package/pi/package-skills/gsd-health/SKILL.md +36 -0
- package/pi/package-skills/gsd-help/SKILL.md +37 -0
- package/pi/package-skills/gsd-import/SKILL.md +46 -0
- package/pi/package-skills/gsd-inbox/SKILL.md +42 -0
- package/pi/package-skills/gsd-ingest-docs/SKILL.md +43 -0
- package/pi/package-skills/gsd-manager/SKILL.md +46 -0
- package/pi/package-skills/gsd-map-codebase/SKILL.md +85 -0
- package/pi/package-skills/gsd-mempalace-capture/SKILL.md +111 -0
- package/pi/package-skills/gsd-mempalace-recall/SKILL.md +111 -0
- package/pi/package-skills/gsd-milestone-summary/SKILL.md +54 -0
- package/pi/package-skills/gsd-mvp-phase/SKILL.md +45 -0
- package/pi/package-skills/gsd-new-milestone/SKILL.md +49 -0
- package/pi/package-skills/gsd-new-project/SKILL.md +49 -0
- package/pi/package-skills/gsd-next/SKILL.md +34 -0
- package/pi/package-skills/gsd-ns-context/SKILL.md +31 -0
- package/pi/package-skills/gsd-ns-ideate/SKILL.md +30 -0
- package/pi/package-skills/gsd-ns-manage/SKILL.md +42 -0
- package/pi/package-skills/gsd-ns-project/SKILL.md +34 -0
- package/pi/package-skills/gsd-ns-review/SKILL.md +35 -0
- package/pi/package-skills/gsd-ns-workflow/SKILL.md +44 -0
- package/pi/package-skills/gsd-onboard/SKILL.md +46 -0
- package/pi/package-skills/gsd-pause-work/SKILL.md +48 -0
- package/pi/package-skills/gsd-phase/SKILL.md +61 -0
- package/pi/package-skills/gsd-plan-phase/SKILL.md +62 -0
- package/pi/package-skills/gsd-plan-review-convergence/SKILL.md +63 -0
- package/pi/package-skills/gsd-pr-branch/SKILL.md +31 -0
- package/pi/package-skills/gsd-profile-user/SKILL.md +48 -0
- package/pi/package-skills/gsd-progress/SKILL.md +51 -0
- package/pi/package-skills/gsd-quick/SKILL.md +179 -0
- package/pi/package-skills/gsd-quick-batch/SKILL.md +114 -0
- package/pi/package-skills/gsd-resume-work/SKILL.md +31 -0
- package/pi/package-skills/gsd-review/SKILL.md +50 -0
- package/pi/package-skills/gsd-review-backlog/SKILL.md +65 -0
- package/pi/package-skills/gsd-secure-phase/SKILL.md +37 -0
- package/pi/package-skills/gsd-settings/SKILL.md +30 -0
- package/pi/package-skills/gsd-ship/SKILL.md +27 -0
- package/pi/package-skills/gsd-sketch/SKILL.md +56 -0
- package/pi/package-skills/gsd-spec-phase/SKILL.md +63 -0
- package/pi/package-skills/gsd-spike/SKILL.md +53 -0
- package/pi/package-skills/gsd-stats/SKILL.md +22 -0
- package/pi/package-skills/gsd-surface/SKILL.md +177 -0
- package/pi/package-skills/gsd-thread/SKILL.md +29 -0
- package/pi/package-skills/gsd-ui-phase/SKILL.md +35 -0
- package/pi/package-skills/gsd-ui-review/SKILL.md +35 -0
- package/pi/package-skills/gsd-ultraplan-phase/SKILL.md +38 -0
- package/pi/package-skills/gsd-undo/SKILL.md +38 -0
- package/pi/package-skills/gsd-update/SKILL.md +51 -0
- package/pi/package-skills/gsd-validate-phase/SKILL.md +37 -0
- package/pi/package-skills/gsd-verify-work/SKILL.md +41 -0
- package/pi/package-skills/gsd-workspace/SKILL.md +57 -0
- package/pi/package-skills/gsd-workstreams/SKILL.md +73 -0
- package/scripts/audit-workflow-script-paths.cjs +1 -1
- package/scripts/build-hooks.js +4 -0
- package/scripts/command-contract-helpers.cjs +1 -1
- package/scripts/diagnose-windows-spawn-watcher.cjs +317 -0
- package/scripts/docs-guard-registry.cjs +22 -7
- package/scripts/gen-health-docs.cjs +13 -1
- package/scripts/gen-pi-package-skills.cjs +217 -0
- package/scripts/lib/macos-conformance-tier.generated.cjs +19 -0
- package/scripts/lib/platform-conformance-tier.generated.cjs +41 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +3 -3
- package/scripts/lint-phase-arg-assignment.cjs +2 -2
- package/scripts/lint-retired-runtime-name.cjs +5 -0
- package/scripts/lint-workflow-shellcheck-baseline.json +16 -16
- package/scripts/npm-audit-baseline.cjs +41 -7
- package/scripts/release-tarball-smoke.cjs +1 -0
- package/scripts/reviewed-or-maintainer-policy.cjs +181 -0
- package/scripts/select-docs-guards.cjs +1 -1
- package/scripts/self-test-report-policy.cjs +350 -0
- package/skills/gsd-code-review/SKILL.md +8 -0
- package/skills/gsd-pause-work/SKILL.md +1 -1
- package/vscode/package.json +1 -1
|
@@ -1075,6 +1075,7 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
|
|
|
1075
1075
|
// refusal below declines with the analyzer's own `missing_phase_details`
|
|
1076
1076
|
// vocabulary and leaves ROADMAP.md byte-identical.
|
|
1077
1077
|
let missingPhaseDetails = false;
|
|
1078
|
+
const warnings = [];
|
|
1078
1079
|
withPlanningLock(cwd, () => {
|
|
1079
1080
|
// #3957 (B9.4): captured BEFORE any transform runs, so the write/report
|
|
1080
1081
|
// decision below reflects whether the transforms actually changed
|
|
@@ -1110,13 +1111,26 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
|
|
|
1110
1111
|
// Heading target: the exact grammar `planSectionPattern` /
|
|
1111
1112
|
// `insertRowsPatternA|B` anchor on (an ATX phase heading for this phase).
|
|
1112
1113
|
const headingTargetFound = new RegExp(phaseHeadingAnchor, 'i').test(gateActiveRegion);
|
|
1114
|
+
// #5545: the phase-checklist bullet grammar, defined ONCE for the writer
|
|
1115
|
+
// (an unchecked bullet to tick) and the gate probe (`anyState`).
|
|
1116
|
+
// Line-anchored, with only an optional `**` before the label and horizontal
|
|
1117
|
+
// whitespace, so a bullet that merely MENTIONS "Phase N" is not the phase's
|
|
1118
|
+
// bullet and no `\s` can run past the line end (which used to land the
|
|
1119
|
+
// `(completed …)` annotation on the NEXT line). A decorated bullet (emoji,
|
|
1120
|
+
// blockquote, link) is deliberately NOT the phase's bullet either — the
|
|
1121
|
+
// same narrowing #4965 made for `roadmap analyze`'s checklist reader.
|
|
1122
|
+
// The lookahead only PEEKS (its `\s` may see a newline but consumes none):
|
|
1123
|
+
// the label must be followed by `:`, whitespace or the end of the line, so
|
|
1124
|
+
// `Phase 2.1` / `Phase 20` are not `Phase 2`. Capture group 1 is the opening
|
|
1125
|
+
// `- [`, group 2 the rest of the line after the box.
|
|
1126
|
+
const phaseChecklistBullet = (anyState) => new RegExp(`^([ \\t]*-[ \\t]*\\[)${anyState ? '[ x]' : ' '}(\\][ \\t]*(?:\\*\\*)?[ \\t]*Phase[ \\t]+${phasePattern}${OPTIONAL_PHASE_TAG_SOURCE}(?=[:\\s]|$)[^\\n]*)`, 'im');
|
|
1113
1127
|
// Checklist target: when the phase is complete, its own checklist bullet
|
|
1114
1128
|
// (`- [ ] **Phase N: …**`) IS a writable phase row — the completion
|
|
1115
1129
|
// checkbox stamp below updates it. Same grammar as that writer, widened
|
|
1116
1130
|
// one notch to `[ x]` so an ALREADY-checked bullet still counts as a
|
|
1117
1131
|
// found target: an idempotent re-run then takes the honest
|
|
1118
1132
|
// "no changes were needed" decline instead of this refusal.
|
|
1119
|
-
const checklistTargetFound = isComplete &&
|
|
1133
|
+
const checklistTargetFound = isComplete && phaseChecklistBullet(true).test(gateActiveRegion);
|
|
1120
1134
|
// Table-row target: set by the row-scoped cell updates below.
|
|
1121
1135
|
let tableRowFound = false;
|
|
1122
1136
|
// Progress table row: update Plans Complete/Status/Completed columns BY
|
|
@@ -1190,6 +1204,16 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
|
|
|
1190
1204
|
}
|
|
1191
1205
|
return text;
|
|
1192
1206
|
});
|
|
1207
|
+
// #4947: a word-prefixed Phase cell (`Phase 68`) is deliberately not a
|
|
1208
|
+
// writable table target (#4247 — the read side ignores it too), but when the
|
|
1209
|
+
// phase's heading section is still written the command reports
|
|
1210
|
+
// `updated: true` and the unwritten Status cell looked like a silent bug.
|
|
1211
|
+
// The row stays byte-identical; the output now says so.
|
|
1212
|
+
const wordPrefixedCellRe = new RegExp(`^Phase\\s+${phasePattern}\\.?(?:\\s|$)`, 'i');
|
|
1213
|
+
const progressTable = tableRowFound ? null : (0, markdown_table_cjs_1.findTableWithColumns)(gateActiveRegion, ['Phase', 'Status']);
|
|
1214
|
+
if (progressTable && progressTable.rows.some((row) => wordPrefixedCellRe.test((row['Phase'] ?? '').trim()))) {
|
|
1215
|
+
warnings.push(`Progress table row for phase ${formatDiagnosticToken(String(phaseNum))} was not updated: its Phase cell is word-prefixed ("Phase N"), and only a bare phase number (N or N.) is recognized. Edit that row by hand or rewrite the cell as the bare number.`);
|
|
1216
|
+
}
|
|
1193
1217
|
// Update plan count in phase detail section.
|
|
1194
1218
|
// Three recognised forms (all tolerated; canonical template uses the first):
|
|
1195
1219
|
// `**Plans**: N plans` — bold word + outer colon (gsd-core/templates/roadmap.md)
|
|
@@ -1247,6 +1271,13 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
|
|
|
1247
1271
|
// wording, so it correctly falls through to arm 3 untouched. Kept as a
|
|
1248
1272
|
// caller-side classifier (NOT seam grammar) reused below against the
|
|
1249
1273
|
// `boldField` node's own parsed `value`.
|
|
1274
|
+
// #4947: a value that is exactly `TBD` is the planner's own "no plans yet"
|
|
1275
|
+
// marker, not an operator annotation — once plans exist it contradicts the
|
|
1276
|
+
// checklist this verb inserts right under it. `TBD — note` keeps its note
|
|
1277
|
+
// (row 5): on the bold path the note is the node's trailing span, which the
|
|
1278
|
+
// caller checks is empty; on the plain path the note is part of the value,
|
|
1279
|
+
// so the whole-value comparison already excludes it.
|
|
1280
|
+
const isBareTbd = (value) => value.trim() === 'TBD';
|
|
1250
1281
|
const isTemplatePlaceholder = (value) => {
|
|
1251
1282
|
const trimmed = value.trim();
|
|
1252
1283
|
return /^\[\s*Number of plans\b[\s\S]*\]$/i.test(trimmed);
|
|
@@ -1272,6 +1303,35 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
|
|
|
1272
1303
|
const m = value.match(/^\d+\s+plans?/i);
|
|
1273
1304
|
return m ? m[0].length : -1;
|
|
1274
1305
|
};
|
|
1306
|
+
// #4947: the pending-plan clause a human or planner glues after the count
|
|
1307
|
+
// (`; 2 gap-closure plans pending (48-18, 48-19)`) is DERIVED from the same
|
|
1308
|
+
// plan/summary facts this verb already computes, so a completed plan left
|
|
1309
|
+
// listed as pending contradicts the count the verb just wrote. The verb
|
|
1310
|
+
// owns that one clause: ids that now have a SUMMARY.md are removed, the
|
|
1311
|
+
// number is recounted, and an emptied clause is dropped. Everything else in
|
|
1312
|
+
// the tail (`in 11 waves`, free prose) stays the operator's — a wave total
|
|
1313
|
+
// does not change when a plan completes. A clause whose ids are not all
|
|
1314
|
+
// plan ids (`(see backlog)`) is not provably derived, so it is left alone.
|
|
1315
|
+
const summarizedPlanIds = new Set(phaseInfo.summaries
|
|
1316
|
+
.map((summaryFile) => summaryFile.replace('-SUMMARY.md', '').replace('SUMMARY.md', ''))
|
|
1317
|
+
.filter((id) => id !== ''));
|
|
1318
|
+
const pendingClauseRe = /;[ \t]*(\d+)[ \t]+((?:[\w-]+[ \t]+)*?)plans?[ \t]+pending[ \t]*\(([^()\r\n]*)\)/i;
|
|
1319
|
+
const planIdShape = /^\d+(?:\.\d+)?-\d+(?:\.\d+)?$/;
|
|
1320
|
+
const reconcilePendingClause = (tail) => {
|
|
1321
|
+
const m = pendingClauseRe.exec(tail);
|
|
1322
|
+
if (!m)
|
|
1323
|
+
return tail;
|
|
1324
|
+
const ids = m[3].split(',').map((id) => id.trim());
|
|
1325
|
+
if (ids.length === 0 || !ids.every((id) => planIdShape.test(id)))
|
|
1326
|
+
return tail;
|
|
1327
|
+
const stillPending = ids.filter((id) => !summarizedPlanIds.has(id));
|
|
1328
|
+
if (stillPending.length === ids.length)
|
|
1329
|
+
return tail;
|
|
1330
|
+
const replacement = stillPending.length === 0
|
|
1331
|
+
? ''
|
|
1332
|
+
: `; ${stillPending.length} ${m[2]}plan${stillPending.length === 1 ? '' : 's'} pending (${stillPending.join(', ')})`;
|
|
1333
|
+
return tail.slice(0, m.index) + replacement + tail.slice(m.index + m[0].length);
|
|
1334
|
+
};
|
|
1275
1335
|
roadmapContent = replaceInCurrentMilestone(roadmapContent, planSectionPattern, (sectionText) => {
|
|
1276
1336
|
const parsed = (0, planning_document_cjs_1.parsePlanningDoc)(sectionText, 'ROADMAP.md');
|
|
1277
1337
|
if (!parsed.ok) {
|
|
@@ -1302,12 +1362,12 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
|
|
|
1302
1362
|
const plainFractionLen = fractionCountPrefixLength(plainValue);
|
|
1303
1363
|
const plainBareLen = bareCountPrefixLength(plainValue);
|
|
1304
1364
|
const plainCountPrefixLen = plainFractionLen >= 0 ? plainFractionLen : plainBareLen;
|
|
1305
|
-
if (plainCountPrefixLen < 0 && !isTemplatePlaceholder(plainValue)) {
|
|
1365
|
+
if (plainCountPrefixLen < 0 && !isTemplatePlaceholder(plainValue) && !isBareTbd(plainValue)) {
|
|
1306
1366
|
// Arm 3: freeform prose, TBD, a bracketed human annotation, or an
|
|
1307
1367
|
// empty value — leave the section exactly as it was.
|
|
1308
1368
|
return sectionText;
|
|
1309
1369
|
}
|
|
1310
|
-
const plainSuffix = plainCountPrefixLen >= 0 ? plainValue.slice(plainCountPrefixLen) : '';
|
|
1370
|
+
const plainSuffix = plainCountPrefixLen >= 0 ? reconcilePendingClause(plainValue.slice(plainCountPrefixLen)) : '';
|
|
1311
1371
|
const newPlainLine = `${indent}Plans:${spacing}${planCountText}${plainSuffix}`;
|
|
1312
1372
|
const start = plainMatch.index ?? sectionText.indexOf(whole);
|
|
1313
1373
|
return sectionText.slice(0, start) + newPlainLine + sectionText.slice(start + whole.length);
|
|
@@ -1320,7 +1380,11 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
|
|
|
1320
1380
|
const fractionPrefixLen = fractionCountPrefixLength(currentValue);
|
|
1321
1381
|
const barePrefixLen = bareCountPrefixLength(currentValue);
|
|
1322
1382
|
const countPrefixLen = fractionPrefixLen >= 0 ? fractionPrefixLen : barePrefixLen;
|
|
1323
|
-
|
|
1383
|
+
const fieldNode = parsed.value.nodes.find((n) => n.id === fieldId);
|
|
1384
|
+
const trailingText = fieldNode && fieldNode.kind === 'boldField'
|
|
1385
|
+
? parsed.value.source.slice(fieldNode.trailingSpan.start, fieldNode.trailingSpan.end)
|
|
1386
|
+
: '';
|
|
1387
|
+
if (countPrefixLen < 0 && !isTemplatePlaceholder(currentValue) && !(isBareTbd(currentValue) && trailingText.trim() === '')) {
|
|
1324
1388
|
// Arm 3: freeform prose, TBD, a bracketed human annotation, or an
|
|
1325
1389
|
// empty value — leave the section exactly as it was.
|
|
1326
1390
|
return sectionText;
|
|
@@ -1331,7 +1395,7 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
|
|
|
1331
1395
|
// `setFieldValue`'s valueSpan/trailingSpan split additionally preserves
|
|
1332
1396
|
// any EM-DASH-separated trailing annotation (#2853) automatically — no
|
|
1333
1397
|
// separate "preserve trailing" branch needed for that shape.
|
|
1334
|
-
const suffix = countPrefixLen >= 0 ? currentValue.slice(countPrefixLen) : '';
|
|
1398
|
+
const suffix = countPrefixLen >= 0 ? reconcilePendingClause(currentValue.slice(countPrefixLen)) : '';
|
|
1335
1399
|
const newValueToWrite = planCountText + suffix;
|
|
1336
1400
|
const staged = (0, planning_document_cjs_1.setFieldValue)(parsed.value, fieldId, newValueToWrite);
|
|
1337
1401
|
if (!staged.ok) {
|
|
@@ -1348,24 +1412,25 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
|
|
|
1348
1412
|
});
|
|
1349
1413
|
// If complete: check checkbox
|
|
1350
1414
|
if (isComplete) {
|
|
1351
|
-
|
|
1352
|
-
roadmapContent = replaceInCurrentMilestone(roadmapContent, checkboxPattern, `$1x$2 (completed ${today})`);
|
|
1415
|
+
roadmapContent = replaceInCurrentMilestone(roadmapContent, phaseChecklistBullet(false), `$1x$2 (completed ${today})`);
|
|
1353
1416
|
}
|
|
1354
1417
|
// Mark completed plan checkboxes (e.g. "- [ ] 50-01-PLAN.md", "- [ ] 50-01:", or "- [ ] **50-01**")
|
|
1355
1418
|
// #4741: tick only plans the phase's own COUNT still counts. `plans` is the
|
|
1356
1419
|
// superseded-filtered set (#2349 via scanPhasePlans) while `summaries` is
|
|
1357
1420
|
// the raw *-SUMMARY.md listing — a superseded plan can carry a SUMMARY
|
|
1358
1421
|
// (e.g. `status: halted`), and ticking it read as "executed" right under a
|
|
1359
|
-
// count line that excludes it.
|
|
1360
|
-
//
|
|
1361
|
-
//
|
|
1422
|
+
// count line that excludes it. #5542: a summary belongs to a live plan only
|
|
1423
|
+
// by the SAME pairing rule the counts use (`summaryCandidates` via
|
|
1424
|
+
// `countMatchedSummaries`), never by id prefix — a leftover `47-1` summary
|
|
1425
|
+
// must not survive because a live `47-10` plan starts with `47-1`. Rows
|
|
1426
|
+
// match the id up to a boundary (`planRowPattern`), so `47-1` never ticks
|
|
1427
|
+
// `47-10-PLAN.md`.
|
|
1362
1428
|
const tickableSummaries = phaseInfo.summaries
|
|
1363
1429
|
.map((summaryFile) => ({ summaryFile, planId: summaryFile.replace('-SUMMARY.md', '').replace('SUMMARY.md', '') }))
|
|
1364
|
-
.filter(({ planId }) => planId !== ''
|
|
1430
|
+
.filter(({ summaryFile, planId }) => planId !== ''
|
|
1431
|
+
&& coreUtils.summaryPairsWithAnyPlan(phaseInfo.plans, summaryFile));
|
|
1365
1432
|
for (const { planId } of tickableSummaries) {
|
|
1366
|
-
|
|
1367
|
-
const planCheckboxPattern = new RegExp(`(-\\s*\\[) (\\]\\s*(?:\\*\\*)?${planEscaped}(?:\\*\\*)?)`, 'i');
|
|
1368
|
-
roadmapContent = roadmapContent.replace(planCheckboxPattern, '$1x$2');
|
|
1433
|
+
roadmapContent = roadmapContent.replace(coreUtils.planRowPattern(planId), '$1x$2');
|
|
1369
1434
|
}
|
|
1370
1435
|
// Compute the active (post-</details>) region offset ONCE. Both the
|
|
1371
1436
|
// missing-plan DETECTION and the row INSERTION must use the same active
|
|
@@ -1389,23 +1454,19 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
|
|
|
1389
1454
|
//
|
|
1390
1455
|
// #4786: a plan row may be written WITH the `-PLAN.md` suffix (canonical
|
|
1391
1456
|
// template form) or WITHOUT it (hand-written form: `- [x] 659-01 — desc`).
|
|
1392
|
-
// The tick loop above keys on the bare planId stem
|
|
1393
|
-
//
|
|
1394
|
-
//
|
|
1395
|
-
//
|
|
1396
|
-
//
|
|
1397
|
-
//
|
|
1398
|
-
//
|
|
1399
|
-
// `.` — a dotted sub-id (`5-01.5`) is a real distinct plan, and counting
|
|
1400
|
-
// its row as 5-01's presence would suppress a genuine insertion.
|
|
1457
|
+
// The tick loop above keys on the bare planId stem, while detection required
|
|
1458
|
+
// the full `-PLAN.md` filename — so every suffix-less row was counted
|
|
1459
|
+
// missing and the insertion fired BESIDE the recognized list — 32 checkbox
|
|
1460
|
+
// lines for 16 plans, exit 0. The stem arm below accepts the bare id only
|
|
1461
|
+
// up to the SAME boundary the tick loop uses (`planRowPattern`, #5542), so
|
|
1462
|
+
// `5-011` never satisfies `5-01` and a dotted sub-id (`5-01.5`) is a real
|
|
1463
|
+
// distinct plan whose row does not count as 5-01's presence.
|
|
1401
1464
|
const missingPlans = phaseInfo.plans.filter((planFile) => {
|
|
1402
1465
|
const planEscaped = (0, pattern_cjs_1.escapeRegex)(planFile);
|
|
1403
1466
|
if (new RegExp(`-\\s*\\[[x ]\\]\\s*(?:\\*\\*)?${planEscaped}`, 'i').test(activeRegion))
|
|
1404
1467
|
return false;
|
|
1405
1468
|
const stem = planFile.replace(/-PLAN\.md$/i, '');
|
|
1406
|
-
|
|
1407
|
-
const stemPresent = new RegExp(`-\\s*\\[[x ]\\]\\s*(?:\\*\\*)?${stemEscaped}(?=$|\\s|:|—|–|-PLAN\\.md|\\.md|\\*\\*|\\))`, 'i').test(activeRegion);
|
|
1408
|
-
return !stemPresent;
|
|
1469
|
+
return !coreUtils.planRowPattern(stem, { anyState: true }).test(activeRegion);
|
|
1409
1470
|
});
|
|
1410
1471
|
if (missingPlans.length > 0) {
|
|
1411
1472
|
// Insert missing plan checklist rows (#1163). We prefer to anchor to the
|
|
@@ -1451,9 +1512,7 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
|
|
|
1451
1512
|
// (#4741: same superseded-filtered tick list as the loop above — a
|
|
1452
1513
|
// pre-existing superseded row must stay unchecked on this path too).
|
|
1453
1514
|
for (const { planId } of tickableSummaries) {
|
|
1454
|
-
|
|
1455
|
-
const planCheckboxPattern = new RegExp(`(-\\s*\\[) (\\]\\s*(?:\\*\\*)?${planEscaped}(?:\\*\\*)?)`, 'i');
|
|
1456
|
-
roadmapContent = roadmapContent.replace(planCheckboxPattern, '$1x$2');
|
|
1515
|
+
roadmapContent = roadmapContent.replace(coreUtils.planRowPattern(planId), '$1x$2');
|
|
1457
1516
|
}
|
|
1458
1517
|
}
|
|
1459
1518
|
}
|
|
@@ -1490,7 +1549,7 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
|
|
|
1490
1549
|
verification_stale_check_indeterminate: verificationStaleCheckIndeterminate,
|
|
1491
1550
|
};
|
|
1492
1551
|
if (updated) {
|
|
1493
|
-
output({ updated: true, ...computed }, raw, `${summaryCount}/${planCount} ${status}`);
|
|
1552
|
+
output(warnings.length > 0 ? { updated: true, ...computed, warnings } : { updated: true, ...computed }, raw, `${summaryCount}/${planCount} ${status}`);
|
|
1494
1553
|
}
|
|
1495
1554
|
else if (missingPhaseDetails) {
|
|
1496
1555
|
// #4247: honest refusal — the reason names the real condition (the
|