@pareto4/pp-core 1.5.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/plugin.json +23 -0
- package/GEMINI.md +53 -0
- package/LICENSE +22 -0
- package/README.md +100 -0
- package/agents/pp-advisor-researcher.md +108 -0
- package/agents/pp-ai-researcher.md +114 -0
- package/agents/pp-assumptions-analyzer.md +105 -0
- package/agents/pp-code-fixer.md +669 -0
- package/agents/pp-code-reviewer.md +387 -0
- package/agents/pp-codebase-mapper.md +853 -0
- package/agents/pp-debug-session-manager.md +315 -0
- package/agents/pp-debugger.md +1453 -0
- package/agents/pp-doc-classifier.md +168 -0
- package/agents/pp-doc-synthesizer.md +204 -0
- package/agents/pp-doc-verifier.md +217 -0
- package/agents/pp-doc-writer.md +616 -0
- package/agents/pp-domain-researcher.md +147 -0
- package/agents/pp-eval-auditor.md +191 -0
- package/agents/pp-eval-planner.md +154 -0
- package/agents/pp-executor.md +808 -0
- package/agents/pp-framework-selector.md +160 -0
- package/agents/pp-integration-checker.md +470 -0
- package/agents/pp-intel-updater.md +339 -0
- package/agents/pp-mempalace-curator.md +47 -0
- package/agents/pp-nyquist-auditor.md +204 -0
- package/agents/pp-pattern-mapper.md +335 -0
- package/agents/pp-phase-researcher.md +867 -0
- package/agents/pp-plan-checker.md +988 -0
- package/agents/pp-planner.md +1052 -0
- package/agents/pp-project-researcher.md +612 -0
- package/agents/pp-research-synthesizer.md +260 -0
- package/agents/pp-roadmapper.md +741 -0
- package/agents/pp-security-auditor.md +156 -0
- package/agents/pp-ui-auditor.md +495 -0
- package/agents/pp-ui-checker.md +309 -0
- package/agents/pp-ui-researcher.md +375 -0
- package/agents/pp-user-profiler.md +171 -0
- package/agents/pp-verifier.md +967 -0
- package/assets/gsd-logo-2000-transparent.png +0 -0
- package/assets/gsd-logo-2000-transparent.svg +17 -0
- package/assets/gsd-logo-2000.png +0 -0
- package/assets/gsd-logo-2000.svg +21 -0
- package/assets/terminal.svg +68 -0
- package/bin/install.js +12370 -0
- package/bin/lib/ui-safety-gate.cjs +107 -0
- package/commands/pp-add-tests.md +42 -0
- package/commands/pp-ai-integration-phase.md +37 -0
- package/commands/pp-audit-fix.md +34 -0
- package/commands/pp-audit-milestone.md +37 -0
- package/commands/pp-audit-uat.md +24 -0
- package/commands/pp-autonomous.md +51 -0
- package/commands/pp-capture.md +62 -0
- package/commands/pp-cleanup.md +24 -0
- package/commands/pp-code-review.md +59 -0
- package/commands/pp-complete-milestone.md +143 -0
- package/commands/pp-config.md +56 -0
- package/commands/pp-debug.md +52 -0
- package/commands/pp-discovery.md +34 -0
- package/commands/pp-discuss-phase.md +77 -0
- package/commands/pp-docs-update.md +49 -0
- package/commands/pp-eval-review.md +33 -0
- package/commands/pp-execute-phase.md +65 -0
- package/commands/pp-explore.md +27 -0
- package/commands/pp-extract-learnings.md +23 -0
- package/commands/pp-fast.md +31 -0
- package/commands/pp-forensics.md +57 -0
- package/commands/pp-graphify.md +204 -0
- package/commands/pp-health.md +31 -0
- package/commands/pp-help.md +28 -0
- package/commands/pp-import.md +45 -0
- package/commands/pp-inbox.md +39 -0
- package/commands/pp-ingest-docs.md +42 -0
- package/commands/pp-manager.md +45 -0
- package/commands/pp-map-codebase.md +83 -0
- package/commands/pp-mempalace-capture.md +71 -0
- package/commands/pp-mempalace-recall.md +102 -0
- package/commands/pp-milestone-summary.md +51 -0
- package/commands/pp-mvp-phase.md +45 -0
- package/commands/pp-new-milestone.md +45 -0
- package/commands/pp-new-project.md +47 -0
- package/commands/pp-ns-context.md +25 -0
- package/commands/pp-ns-ideate.md +24 -0
- package/commands/pp-ns-manage.md +36 -0
- package/commands/pp-ns-project.md +27 -0
- package/commands/pp-ns-review.md +29 -0
- package/commands/pp-ns-workflow.md +35 -0
- package/commands/pp-pause-work.md +43 -0
- package/commands/pp-phase.md +56 -0
- package/commands/pp-plan-phase.md +63 -0
- package/commands/pp-plan-review-convergence.md +60 -0
- package/commands/pp-pr-branch.md +26 -0
- package/commands/pp-profile-user.md +46 -0
- package/commands/pp-progress.md +49 -0
- package/commands/pp-quick.md +174 -0
- package/commands/pp-resume-work.md +30 -0
- package/commands/pp-review-backlog.md +63 -0
- package/commands/pp-review.md +42 -0
- package/commands/pp-secure-phase.md +36 -0
- package/commands/pp-settings.md +29 -0
- package/commands/pp-ship.md +24 -0
- package/commands/pp-sketch.md +60 -0
- package/commands/pp-spec-phase.md +63 -0
- package/commands/pp-spike.md +57 -0
- package/commands/pp-stats.md +20 -0
- package/commands/pp-surface.md +162 -0
- package/commands/pp-thread.md +24 -0
- package/commands/pp-ui-phase.md +35 -0
- package/commands/pp-ui-review.md +33 -0
- package/commands/pp-ultraplan-phase.md +34 -0
- package/commands/pp-undo.md +35 -0
- package/commands/pp-update.md +49 -0
- package/commands/pp-validate-phase.md +36 -0
- package/commands/pp-verify-work.md +39 -0
- package/commands/pp-workspace.md +52 -0
- package/commands/pp-workstreams.md +70 -0
- package/gemini-extension.json +6 -0
- package/hooks/dist/lib/git-cmd.js +150 -0
- package/hooks/dist/lib/pp-graphify-rebuild.sh +65 -0
- package/hooks/dist/managed-hooks-registry.cjs +39 -0
- package/hooks/dist/pp-check-update-worker.js +108 -0
- package/hooks/dist/pp-check-update.js +66 -0
- package/hooks/dist/pp-config-reload.js +133 -0
- package/hooks/dist/pp-context-monitor.js +196 -0
- package/hooks/dist/pp-cursor-post-tool.js +75 -0
- package/hooks/dist/pp-cursor-session-start.js +52 -0
- package/hooks/dist/pp-ensure-canonical-path.js +305 -0
- package/hooks/dist/pp-graphify-update.sh +158 -0
- package/hooks/dist/pp-phase-boundary.sh +47 -0
- package/hooks/dist/pp-prompt-guard.js +97 -0
- package/hooks/dist/pp-read-guard.js +101 -0
- package/hooks/dist/pp-read-injection-scanner.js +203 -0
- package/hooks/dist/pp-session-state.sh +59 -0
- package/hooks/dist/pp-statusline.js +566 -0
- package/hooks/dist/pp-update-banner.js +138 -0
- package/hooks/dist/pp-validate-commit.sh +57 -0
- package/hooks/dist/pp-workflow-guard.js +167 -0
- package/hooks/dist/pp-worktree-path-guard.js +185 -0
- package/hooks/hooks.json +70 -0
- package/hooks/lib/git-cmd.js +150 -0
- package/hooks/lib/pp-graphify-rebuild.sh +65 -0
- package/hooks/managed-hooks-registry.cjs +39 -0
- package/hooks/pp-check-update-worker.js +108 -0
- package/hooks/pp-check-update.js +66 -0
- package/hooks/pp-config-reload.js +133 -0
- package/hooks/pp-context-monitor.js +196 -0
- package/hooks/pp-cursor-post-tool.js +75 -0
- package/hooks/pp-cursor-session-start.js +52 -0
- package/hooks/pp-ensure-canonical-path.js +305 -0
- package/hooks/pp-graphify-update.sh +158 -0
- package/hooks/pp-phase-boundary.sh +47 -0
- package/hooks/pp-prompt-guard.js +97 -0
- package/hooks/pp-read-guard.js +101 -0
- package/hooks/pp-read-injection-scanner.js +203 -0
- package/hooks/pp-session-state.sh +59 -0
- package/hooks/pp-statusline.js +566 -0
- package/hooks/pp-update-banner.js +138 -0
- package/hooks/pp-validate-commit.sh +57 -0
- package/hooks/pp-workflow-guard.js +167 -0
- package/hooks/pp-worktree-path-guard.js +185 -0
- package/package.json +125 -0
- package/pp-core/bin/check-latest-version.cjs +161 -0
- package/pp-core/bin/lib/active-workstream-store.cjs +297 -0
- package/pp-core/bin/lib/adr-parser.cjs +399 -0
- package/pp-core/bin/lib/agent-command-router.cjs +68 -0
- package/pp-core/bin/lib/agent-install-check.cjs +143 -0
- package/pp-core/bin/lib/artifacts.cjs +51 -0
- package/pp-core/bin/lib/audit-command-router.cjs +61 -0
- package/pp-core/bin/lib/audit.cjs +743 -0
- package/pp-core/bin/lib/capability-activation.cjs +113 -0
- package/pp-core/bin/lib/capability-registry.cjs +3727 -0
- package/pp-core/bin/lib/capability-state.cjs +497 -0
- package/pp-core/bin/lib/capability-writer.cjs +355 -0
- package/pp-core/bin/lib/check-command-router.cjs +800 -0
- package/pp-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
- package/pp-core/bin/lib/cli-exit.cjs +61 -0
- package/pp-core/bin/lib/clock.cjs +95 -0
- package/pp-core/bin/lib/clusters.cjs +131 -0
- package/pp-core/bin/lib/code-review-flags.cjs +59 -0
- package/pp-core/bin/lib/command-aliases.cjs +809 -0
- package/pp-core/bin/lib/command-arg-projection.cjs +55 -0
- package/pp-core/bin/lib/command-roster.cjs +19 -0
- package/pp-core/bin/lib/command-routing-hub.cjs +300 -0
- package/pp-core/bin/lib/commands.cjs +1244 -0
- package/pp-core/bin/lib/config-loader.cjs +714 -0
- package/pp-core/bin/lib/config-schema.cjs +58 -0
- package/pp-core/bin/lib/config-types.cjs +20 -0
- package/pp-core/bin/lib/config.cjs +796 -0
- package/pp-core/bin/lib/configuration.cjs +209 -0
- package/pp-core/bin/lib/context-utilization.cjs +48 -0
- package/pp-core/bin/lib/core-utils.cjs +198 -0
- package/pp-core/bin/lib/decisions.cjs +136 -0
- package/pp-core/bin/lib/docs.cjs +264 -0
- package/pp-core/bin/lib/drift.cjs +364 -0
- package/pp-core/bin/lib/edge-probe.cjs +196 -0
- package/pp-core/bin/lib/fallow-runner.cjs +153 -0
- package/pp-core/bin/lib/federated-config.cjs +182 -0
- package/pp-core/bin/lib/frontmatter.cjs +494 -0
- package/pp-core/bin/lib/gap-checker.cjs +260 -0
- package/pp-core/bin/lib/git-base-branch.cjs +220 -0
- package/pp-core/bin/lib/graphify-command-router.cjs +72 -0
- package/pp-core/bin/lib/graphify.cjs +472 -0
- package/pp-core/bin/lib/gsd2-import.cjs +456 -0
- package/pp-core/bin/lib/init-command-router.cjs +62 -0
- package/pp-core/bin/lib/init.cjs +1912 -0
- package/pp-core/bin/lib/install-profiles.cjs +814 -0
- package/pp-core/bin/lib/installer-migration-authoring.cjs +122 -0
- package/pp-core/bin/lib/installer-migration-report.cjs +351 -0
- package/pp-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +225 -0
- package/pp-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
- package/pp-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
- package/pp-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
- package/pp-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs +123 -0
- package/pp-core/bin/lib/installer-migrations/005-rename-gsd-core-to-pp-core.cjs +109 -0
- package/pp-core/bin/lib/installer-migrations/006-rename-gsd-command-namespace.cjs +135 -0
- package/pp-core/bin/lib/installer-migrations.cjs +823 -0
- package/pp-core/bin/lib/intel-command-router.cjs +119 -0
- package/pp-core/bin/lib/intel.cjs +584 -0
- package/pp-core/bin/lib/io.cjs +220 -0
- package/pp-core/bin/lib/learnings.cjs +270 -0
- package/pp-core/bin/lib/legacy-cleanup.cjs +253 -0
- package/pp-core/bin/lib/loop-host-contract.cjs +105 -0
- package/pp-core/bin/lib/loop-resolver.cjs +479 -0
- package/pp-core/bin/lib/milestone.cjs +381 -0
- package/pp-core/bin/lib/model-catalog.cjs +154 -0
- package/pp-core/bin/lib/model-profiles.cjs +24 -0
- package/pp-core/bin/lib/model-resolver.cjs +467 -0
- package/pp-core/bin/lib/observability/event.cjs +51 -0
- package/pp-core/bin/lib/observability/logger.cjs +146 -0
- package/pp-core/bin/lib/observability/redaction.cjs +48 -0
- package/pp-core/bin/lib/package-identity.cjs +35 -0
- package/pp-core/bin/lib/package-legitimacy.cjs +368 -0
- package/pp-core/bin/lib/phase-command-router.cjs +209 -0
- package/pp-core/bin/lib/phase-id.cjs +213 -0
- package/pp-core/bin/lib/phase-lifecycle.cjs +74 -0
- package/pp-core/bin/lib/phase-locator.cjs +145 -0
- package/pp-core/bin/lib/phase.cjs +1446 -0
- package/pp-core/bin/lib/phases-command-router.cjs +43 -0
- package/pp-core/bin/lib/plan-drift-guard.cjs +117 -0
- package/pp-core/bin/lib/plan-scan.cjs +91 -0
- package/pp-core/bin/lib/planning-workspace.cjs +245 -0
- package/pp-core/bin/lib/probe-core.cjs +402 -0
- package/pp-core/bin/lib/profile-output.cjs +1164 -0
- package/pp-core/bin/lib/profile-pipeline-command-router.cjs +138 -0
- package/pp-core/bin/lib/profile-pipeline.cjs +519 -0
- package/pp-core/bin/lib/prohibition-enforcement.cjs +660 -0
- package/pp-core/bin/lib/project-root.cjs +119 -0
- package/pp-core/bin/lib/prompt-budget.cjs +305 -0
- package/pp-core/bin/lib/research-provider.cjs +137 -0
- package/pp-core/bin/lib/research-store.cjs +167 -0
- package/pp-core/bin/lib/review-reviewer-selection.cjs +121 -0
- package/pp-core/bin/lib/roadmap-command-router.cjs +166 -0
- package/pp-core/bin/lib/roadmap-parser.cjs +456 -0
- package/pp-core/bin/lib/roadmap-upgrade.cjs +476 -0
- package/pp-core/bin/lib/roadmap.cjs +738 -0
- package/pp-core/bin/lib/runtime-artifact-conversion.cjs +1966 -0
- package/pp-core/bin/lib/runtime-artifact-layout.cjs +342 -0
- package/pp-core/bin/lib/runtime-config-adapter-registry.cjs +103 -0
- package/pp-core/bin/lib/runtime-homes.cjs +272 -0
- package/pp-core/bin/lib/runtime-hooks-surface.cjs +1460 -0
- package/pp-core/bin/lib/runtime-name-policy.cjs +97 -0
- package/pp-core/bin/lib/runtime-slash.cjs +137 -0
- package/pp-core/bin/lib/schema-detect.cjs +159 -0
- package/pp-core/bin/lib/secrets.cjs +34 -0
- package/pp-core/bin/lib/security.cjs +480 -0
- package/pp-core/bin/lib/semver-compare.cjs +42 -0
- package/pp-core/bin/lib/shell-command-projection.cjs +550 -0
- package/pp-core/bin/lib/state-command-router.cjs +172 -0
- package/pp-core/bin/lib/state-document.cjs +312 -0
- package/pp-core/bin/lib/state.cjs +2587 -0
- package/pp-core/bin/lib/surface.cjs +505 -0
- package/pp-core/bin/lib/task-command-router.cjs +85 -0
- package/pp-core/bin/lib/teams-status.cjs +74 -0
- package/pp-core/bin/lib/template.cjs +246 -0
- package/pp-core/bin/lib/uat-predicate.cjs +329 -0
- package/pp-core/bin/lib/uat.cjs +359 -0
- package/pp-core/bin/lib/ui-safety-gate.cjs +98 -0
- package/pp-core/bin/lib/update-context.cjs +221 -0
- package/pp-core/bin/lib/validate-command-router.cjs +91 -0
- package/pp-core/bin/lib/validate.cjs +122 -0
- package/pp-core/bin/lib/verification-command-router.cjs +31 -0
- package/pp-core/bin/lib/verification.cjs +196 -0
- package/pp-core/bin/lib/verify-command-router.cjs +44 -0
- package/pp-core/bin/lib/verify.cjs +1932 -0
- package/pp-core/bin/lib/workstream-inventory-builder.cjs +81 -0
- package/pp-core/bin/lib/workstream-inventory.cjs +147 -0
- package/pp-core/bin/lib/workstream-name-policy.cjs +91 -0
- package/pp-core/bin/lib/workstream.cjs +386 -0
- package/pp-core/bin/lib/worktree-base-ref.cjs +350 -0
- package/pp-core/bin/lib/worktree-safety.cjs +985 -0
- package/pp-core/bin/pp-tools.cjs +2239 -0
- package/pp-core/bin/pp_run +20 -0
- package/pp-core/bin/shared/config-defaults.manifest.json +97 -0
- package/pp-core/bin/shared/config-schema.manifest.json +176 -0
- package/pp-core/bin/shared/model-catalog.json +160 -0
- package/pp-core/bin/shared/runtime-aliases.manifest.json +79 -0
- package/pp-core/bin/verify-reapply-patches.cjs +400 -0
- package/pp-core/contexts/dev.md +21 -0
- package/pp-core/contexts/research.md +22 -0
- package/pp-core/contexts/review.md +23 -0
- package/pp-core/references/agent-contracts.md +79 -0
- package/pp-core/references/ai-evals.md +156 -0
- package/pp-core/references/ai-frameworks.md +186 -0
- package/pp-core/references/artifact-types.md +131 -0
- package/pp-core/references/autonomous-smart-discuss.md +277 -0
- package/pp-core/references/checkpoints.md +814 -0
- package/pp-core/references/common-bug-patterns.md +114 -0
- package/pp-core/references/context-budget.md +85 -0
- package/pp-core/references/continuation-format.md +253 -0
- package/pp-core/references/debugger-philosophy.md +76 -0
- package/pp-core/references/decimal-phase-calculation.md +64 -0
- package/pp-core/references/doc-conflict-engine.md +91 -0
- package/pp-core/references/domain-probes.md +125 -0
- package/pp-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json +7 -0
- package/pp-core/references/edge-probe-fixtures/01-round-half-even/requirements.json +1 -0
- package/pp-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json +8 -0
- package/pp-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json +1 -0
- package/pp-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json +7 -0
- package/pp-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json +1 -0
- package/pp-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json +7 -0
- package/pp-core/references/edge-probe-fixtures/04-money-rounding/requirements.json +1 -0
- package/pp-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json +8 -0
- package/pp-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json +1 -0
- package/pp-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json +8 -0
- package/pp-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json +1 -0
- package/pp-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json +4 -0
- package/pp-core/references/edge-probe.md +272 -0
- package/pp-core/references/execute-mvp-tdd.md +81 -0
- package/pp-core/references/executor-examples.md +110 -0
- package/pp-core/references/few-shot-examples/plan-checker.md +73 -0
- package/pp-core/references/few-shot-examples/verifier.md +109 -0
- package/pp-core/references/gate-prompts.md +100 -0
- package/pp-core/references/gates.md +70 -0
- package/pp-core/references/git-integration.md +298 -0
- package/pp-core/references/git-planning-commit.md +40 -0
- package/pp-core/references/ios-scaffold.md +123 -0
- package/pp-core/references/loop-hook-dispatch.md +61 -0
- package/pp-core/references/mandatory-initial-read.md +2 -0
- package/pp-core/references/model-profile-resolution.md +38 -0
- package/pp-core/references/model-profiles.md +245 -0
- package/pp-core/references/mvp-concepts.md +49 -0
- package/pp-core/references/phase-argument-parsing.md +61 -0
- package/pp-core/references/planner-antipatterns.md +176 -0
- package/pp-core/references/planner-chunked.md +49 -0
- package/pp-core/references/planner-gap-closure.md +62 -0
- package/pp-core/references/planner-graphify-auto-update.md +67 -0
- package/pp-core/references/planner-guidance.md +186 -0
- package/pp-core/references/planner-human-verify-mode.md +57 -0
- package/pp-core/references/planner-interface-context.md +62 -0
- package/pp-core/references/planner-load-graph-context.md +36 -0
- package/pp-core/references/planner-mvp-mode.md +53 -0
- package/pp-core/references/planner-reviews.md +42 -0
- package/pp-core/references/planner-revision.md +87 -0
- package/pp-core/references/planner-source-audit.md +73 -0
- package/pp-core/references/planning-config.md +477 -0
- package/pp-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json +14 -0
- package/pp-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json +4 -0
- package/pp-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json +32 -0
- package/pp-core/references/prohibition-probe.md +326 -0
- package/pp-core/references/project-skills-discovery.md +19 -0
- package/pp-core/references/questioning.md +162 -0
- package/pp-core/references/research-documentation-lookup.md +29 -0
- package/pp-core/references/research-philosophy.md +29 -0
- package/pp-core/references/research-verification-protocol.md +27 -0
- package/pp-core/references/revision-loop.md +97 -0
- package/pp-core/references/scout-codebase.md +51 -0
- package/pp-core/references/skeleton-template.md +48 -0
- package/pp-core/references/sketch-interactivity.md +41 -0
- package/pp-core/references/sketch-theme-system.md +94 -0
- package/pp-core/references/sketch-tooling.md +45 -0
- package/pp-core/references/sketch-variant-patterns.md +81 -0
- package/pp-core/references/spidr-splitting.md +69 -0
- package/pp-core/references/tdd.md +330 -0
- package/pp-core/references/thinking-models-debug.md +44 -0
- package/pp-core/references/thinking-models-execution.md +50 -0
- package/pp-core/references/thinking-models-planning.md +62 -0
- package/pp-core/references/thinking-models-research.md +50 -0
- package/pp-core/references/thinking-models-verification.md +55 -0
- package/pp-core/references/thinking-partner.md +96 -0
- package/pp-core/references/ui-brand.md +162 -0
- package/pp-core/references/universal-anti-patterns.md +63 -0
- package/pp-core/references/user-profiling.md +681 -0
- package/pp-core/references/user-story-template.md +58 -0
- package/pp-core/references/verification-overrides.md +227 -0
- package/pp-core/references/verification-patterns.md +612 -0
- package/pp-core/references/verify-mvp-mode.md +85 -0
- package/pp-core/references/workstream-flag.md +111 -0
- package/pp-core/references/worktree-branch-check.md +44 -0
- package/pp-core/references/worktree-path-safety.md +67 -0
- package/pp-core/templates/AI-SPEC.md +246 -0
- package/pp-core/templates/DEBUG.md +169 -0
- package/pp-core/templates/README.md +77 -0
- package/pp-core/templates/SECURITY.md +61 -0
- package/pp-core/templates/UAT.md +265 -0
- package/pp-core/templates/UI-SPEC.md +100 -0
- package/pp-core/templates/VALIDATION.md +76 -0
- package/pp-core/templates/claude-md.md +145 -0
- package/pp-core/templates/codebase/architecture.md +255 -0
- package/pp-core/templates/codebase/concerns.md +310 -0
- package/pp-core/templates/codebase/conventions.md +307 -0
- package/pp-core/templates/codebase/integrations.md +280 -0
- package/pp-core/templates/codebase/stack.md +186 -0
- package/pp-core/templates/codebase/structure.md +285 -0
- package/pp-core/templates/codebase/testing.md +480 -0
- package/pp-core/templates/config.json +62 -0
- package/pp-core/templates/context.md +352 -0
- package/pp-core/templates/continue-here.md +78 -0
- package/pp-core/templates/copilot-instructions.md +7 -0
- package/pp-core/templates/debug-subagent-prompt.md +91 -0
- package/pp-core/templates/dev-preferences.md +21 -0
- package/pp-core/templates/discovery.md +146 -0
- package/pp-core/templates/discussion-log.md +63 -0
- package/pp-core/templates/milestone-archive.md +123 -0
- package/pp-core/templates/milestone.md +115 -0
- package/pp-core/templates/phase-prompt.md +610 -0
- package/pp-core/templates/planner-subagent-prompt.md +117 -0
- package/pp-core/templates/project.md +203 -0
- package/pp-core/templates/requirements.md +231 -0
- package/pp-core/templates/research-project/ARCHITECTURE.md +204 -0
- package/pp-core/templates/research-project/FEATURES.md +147 -0
- package/pp-core/templates/research-project/PITFALLS.md +200 -0
- package/pp-core/templates/research-project/STACK.md +120 -0
- package/pp-core/templates/research-project/SUMMARY.md +170 -0
- package/pp-core/templates/research.md +592 -0
- package/pp-core/templates/retrospective.md +54 -0
- package/pp-core/templates/roadmap.md +202 -0
- package/pp-core/templates/spec.md +333 -0
- package/pp-core/templates/state.md +195 -0
- package/pp-core/templates/summary-complex.md +60 -0
- package/pp-core/templates/summary-minimal.md +42 -0
- package/pp-core/templates/summary-standard.md +49 -0
- package/pp-core/templates/summary.md +249 -0
- package/pp-core/templates/user-profile.md +146 -0
- package/pp-core/templates/user-setup.md +311 -0
- package/pp-core/templates/verification-report.md +335 -0
- package/pp-core/workflows/_runtime-launcher.snippet.sh +1 -0
- package/pp-core/workflows/add-backlog.md +91 -0
- package/pp-core/workflows/add-phase.md +113 -0
- package/pp-core/workflows/add-tests.md +355 -0
- package/pp-core/workflows/add-todo.md +161 -0
- package/pp-core/workflows/ai-integration-phase.md +295 -0
- package/pp-core/workflows/analyze-dependencies.md +96 -0
- package/pp-core/workflows/audit-fix.md +178 -0
- package/pp-core/workflows/audit-milestone.md +362 -0
- package/pp-core/workflows/audit-uat.md +110 -0
- package/pp-core/workflows/autonomous.md +886 -0
- package/pp-core/workflows/check-todos.md +180 -0
- package/pp-core/workflows/cleanup.md +195 -0
- package/pp-core/workflows/code-review-fix.md +506 -0
- package/pp-core/workflows/code-review.md +696 -0
- package/pp-core/workflows/complete-milestone.md +857 -0
- package/pp-core/workflows/debug.md +237 -0
- package/pp-core/workflows/diagnose-issues.md +245 -0
- package/pp-core/workflows/discovery-phase.md +291 -0
- package/pp-core/workflows/discovery-sprint.md +1546 -0
- package/pp-core/workflows/discuss-phase/modes/advisor.md +176 -0
- package/pp-core/workflows/discuss-phase/modes/all.md +28 -0
- package/pp-core/workflows/discuss-phase/modes/analyze.md +44 -0
- package/pp-core/workflows/discuss-phase/modes/auto.md +57 -0
- package/pp-core/workflows/discuss-phase/modes/batch.md +52 -0
- package/pp-core/workflows/discuss-phase/modes/chain.md +98 -0
- package/pp-core/workflows/discuss-phase/modes/default.md +141 -0
- package/pp-core/workflows/discuss-phase/modes/power.md +44 -0
- package/pp-core/workflows/discuss-phase/modes/text.md +55 -0
- package/pp-core/workflows/discuss-phase/templates/checkpoint.json +18 -0
- package/pp-core/workflows/discuss-phase/templates/context.md +136 -0
- package/pp-core/workflows/discuss-phase/templates/discussion-log.md +50 -0
- package/pp-core/workflows/discuss-phase-assumptions.md +675 -0
- package/pp-core/workflows/discuss-phase-power.md +291 -0
- package/pp-core/workflows/discuss-phase.md +520 -0
- package/pp-core/workflows/do.md +111 -0
- package/pp-core/workflows/docs-update.md +1168 -0
- package/pp-core/workflows/edit-phase.md +295 -0
- package/pp-core/workflows/eval-review.md +159 -0
- package/pp-core/workflows/execute-phase/steps/codebase-drift-gate.md +95 -0
- package/pp-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
- package/pp-core/workflows/execute-phase/steps/post-merge-gate.md +117 -0
- package/pp-core/workflows/execute-phase/steps/worktree-recovery-policy.md +9 -0
- package/pp-core/workflows/execute-phase.md +1707 -0
- package/pp-core/workflows/execute-plan.md +541 -0
- package/pp-core/workflows/explore.md +146 -0
- package/pp-core/workflows/extract-learnings.md +243 -0
- package/pp-core/workflows/fast.md +124 -0
- package/pp-core/workflows/forensics.md +279 -0
- package/pp-core/workflows/graduation.md +196 -0
- package/pp-core/workflows/health.md +224 -0
- package/pp-core/workflows/help/modes/brief.md +22 -0
- package/pp-core/workflows/help/modes/default.md +50 -0
- package/pp-core/workflows/help/modes/full.md +791 -0
- package/pp-core/workflows/help/modes/topic.md +74 -0
- package/pp-core/workflows/help.md +24 -0
- package/pp-core/workflows/import.md +256 -0
- package/pp-core/workflows/inbox.md +387 -0
- package/pp-core/workflows/ingest-docs.md +340 -0
- package/pp-core/workflows/insert-phase.md +152 -0
- package/pp-core/workflows/list-phase-assumptions.md +178 -0
- package/pp-core/workflows/list-workspaces.md +57 -0
- package/pp-core/workflows/manager.md +435 -0
- package/pp-core/workflows/map-codebase.md +444 -0
- package/pp-core/workflows/milestone-summary.md +224 -0
- package/pp-core/workflows/mvp-phase.md +222 -0
- package/pp-core/workflows/new-milestone.md +643 -0
- package/pp-core/workflows/new-project.md +1563 -0
- package/pp-core/workflows/new-workspace.md +240 -0
- package/pp-core/workflows/next.md +347 -0
- package/pp-core/workflows/node-repair.md +92 -0
- package/pp-core/workflows/note.md +158 -0
- package/pp-core/workflows/pause-work.md +250 -0
- package/pp-core/workflows/plan-milestone-gaps.md +281 -0
- package/pp-core/workflows/plan-phase.md +1755 -0
- package/pp-core/workflows/plan-review-convergence.md +369 -0
- package/pp-core/workflows/plant-seed.md +230 -0
- package/pp-core/workflows/pr-branch.md +159 -0
- package/pp-core/workflows/profile-user.md +455 -0
- package/pp-core/workflows/progress.md +756 -0
- package/pp-core/workflows/quick.md +1045 -0
- package/pp-core/workflows/reapply-patches.md +443 -0
- package/pp-core/workflows/remove-phase.md +156 -0
- package/pp-core/workflows/remove-workspace.md +108 -0
- package/pp-core/workflows/resume-project.md +348 -0
- package/pp-core/workflows/review.md +765 -0
- package/pp-core/workflows/scan.md +107 -0
- package/pp-core/workflows/secure-phase.md +184 -0
- package/pp-core/workflows/session-report.md +146 -0
- package/pp-core/workflows/settings-advanced.md +816 -0
- package/pp-core/workflows/settings-integrations.md +312 -0
- package/pp-core/workflows/settings.md +592 -0
- package/pp-core/workflows/ship.md +465 -0
- package/pp-core/workflows/sketch-wrap-up.md +286 -0
- package/pp-core/workflows/sketch.md +361 -0
- package/pp-core/workflows/spec-phase.md +495 -0
- package/pp-core/workflows/spike-wrap-up.md +307 -0
- package/pp-core/workflows/spike.md +453 -0
- package/pp-core/workflows/stats.md +80 -0
- package/pp-core/workflows/sync-skills.md +182 -0
- package/pp-core/workflows/thread.md +222 -0
- package/pp-core/workflows/transition.md +694 -0
- package/pp-core/workflows/ui-phase.md +328 -0
- package/pp-core/workflows/ui-review.md +193 -0
- package/pp-core/workflows/ultraplan-phase.md +199 -0
- package/pp-core/workflows/undo.md +314 -0
- package/pp-core/workflows/update.md +501 -0
- package/pp-core/workflows/validate-phase.md +183 -0
- package/pp-core/workflows/verify-phase.md +569 -0
- package/pp-core/workflows/verify-work.md +804 -0
- package/scripts/affected-tests-lib.cjs +554 -0
- package/scripts/audit-workflow-script-paths.cjs +73 -0
- package/scripts/base64-scan.sh +351 -0
- package/scripts/build-hooks.js +254 -0
- package/scripts/changeset/README.md +129 -0
- package/scripts/changeset/cli.cjs +597 -0
- package/scripts/changeset/github-release-notes.cjs +199 -0
- package/scripts/changeset/lint.cjs +147 -0
- package/scripts/changeset/new.cjs +151 -0
- package/scripts/changeset/parse.cjs +114 -0
- package/scripts/changeset/render.cjs +34 -0
- package/scripts/changeset/serialize.cjs +130 -0
- package/scripts/check-alias-drift.cjs +114 -0
- package/scripts/check-env.cjs +312 -0
- package/scripts/check-npm-integrity.cjs +215 -0
- package/scripts/ci-guard-runner.cjs +22 -0
- package/scripts/ci-prepare-test-scope.cjs +93 -0
- package/scripts/ci-rebase-check.cjs +86 -0
- package/scripts/ci-test-scope.cjs +441 -0
- package/scripts/command-contract-helpers.cjs +64 -0
- package/scripts/diff-touches-shipped-paths.cjs +149 -0
- package/scripts/fix-slash-commands.cjs +161 -0
- package/scripts/gen-capability-registry.cjs +2646 -0
- package/scripts/gen-commands-reference.cjs +139 -0
- package/scripts/gen-inventory-manifest.cjs +114 -0
- package/scripts/gen-loop-host-contract.cjs +526 -0
- package/scripts/gen-research-agents.cjs +276 -0
- package/scripts/generate-package-identity.cjs +134 -0
- package/scripts/issue-dedupe.cjs +278 -0
- package/scripts/issue-version-gate.cjs +140 -0
- package/scripts/lib/allowlist-ratchet.cjs +236 -0
- package/scripts/lib/cli-exit.cjs +56 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +328 -0
- package/scripts/lint-allow-test-rule-refs.cjs +162 -0
- package/scripts/lint-command-contract.cjs +118 -0
- package/scripts/lint-descriptions.cjs +87 -0
- package/scripts/lint-docs-required.cjs +222 -0
- package/scripts/lint-legacy-dir-name.cjs +166 -0
- package/scripts/lint-package-identity-drift.cjs +141 -0
- package/scripts/lint-pr-check-project-dir.cjs +99 -0
- package/scripts/lint-regression-test-names.allowlist.json +269 -0
- package/scripts/lint-regression-test-names.cjs +117 -0
- package/scripts/lint-shell-command-projection-drift.cjs +62 -0
- package/scripts/lint-skill-deps.cjs +185 -0
- package/scripts/lint-test-file-count.allowlist.json +181 -0
- package/scripts/lint-test-file-count.cjs +246 -0
- package/scripts/lint-windows-test-portability.cjs +178 -0
- package/scripts/mutation-matrix.cjs +323 -0
- package/scripts/pr-target-policy.cjs +63 -0
- package/scripts/pr-template-policy.cjs +268 -0
- package/scripts/prompt-injection-scan.sh +207 -0
- package/scripts/registry-smoke.cjs +337 -0
- package/scripts/release-notes/discord-release-summary.cjs +373 -0
- package/scripts/release-notes/format-github-release-notes.cjs +261 -0
- package/scripts/release-tarball-smoke.cjs +763 -0
- package/scripts/research-profiles.cjs +149 -0
- package/scripts/run-affected-tests.cjs +7 -0
- package/scripts/run-tests.cjs +589 -0
- package/scripts/secret-scan-lint.sh +231 -0
- package/scripts/secret-scan.sh +358 -0
- package/scripts/setup-branch-protection.sh +234 -0
- package/scripts/strip-prose-atrefs.cjs +106 -0
- package/scripts/sync-manifest-versions.cjs +119 -0
- package/scripts/sync-next-version.cjs +133 -0
- package/scripts/sync-rulesets.sh +34 -0
- package/scripts/sync-runtime-launcher.cjs +425 -0
- package/scripts/test-failure-reasons.cjs +34 -0
- package/scripts/update-size-baseline.cjs +68 -0
- package/scripts/verify-npm-publish.cjs +240 -0
- package/scripts/verify-opengsd-sweep.cjs +288 -0
- package/scripts/verify-phase-02-rename.sh +258 -0
- package/scripts/verify-phase-03-rename.sh +376 -0
- package/scripts/workflow-policy.cjs +483 -0
- package/scripts/workflow-size.cjs +90 -0
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Roadmap Parser — ROADMAP.md parsing helpers
|
|
4
|
+
*
|
|
5
|
+
* ADR-857 rollout phase 2b: extracted from core.cts (issue #870).
|
|
6
|
+
* Owns shipped-milestone slicing, current-milestone extraction,
|
|
7
|
+
* milestone/phase lookups, and milestone-phase filtering.
|
|
8
|
+
* Behaviour is preserved byte-for-behaviour from the prior location;
|
|
9
|
+
* only the module boundary moved. The core.cjs re-export spine was retired
|
|
10
|
+
* in epic #1267; callers import roadmap-parser helpers directly.
|
|
11
|
+
*
|
|
12
|
+
* Dependencies (leaf modules only — no loadConfig):
|
|
13
|
+
* - node:fs / node:path (stdlib)
|
|
14
|
+
* - ./phase-id.cjs (escapeRegex, phaseMarkdownRegexSource)
|
|
15
|
+
* - ./planning-workspace.cjs (planningDir)
|
|
16
|
+
* - ./shell-command-projection.cjs (platformReadSync)
|
|
17
|
+
*/
|
|
18
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
19
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
20
|
+
};
|
|
21
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
22
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
24
|
+
const phaseIdModule = require("./phase-id.cjs");
|
|
25
|
+
const { escapeRegex, phaseMarkdownRegexSource } = phaseIdModule;
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
27
|
+
const planningWorkspace = require("./planning-workspace.cjs");
|
|
28
|
+
const { planningDir } = planningWorkspace;
|
|
29
|
+
const shell_command_projection_cjs_1 = require("./shell-command-projection.cjs");
|
|
30
|
+
// ─── Roadmap milestone scoping ───────────────────────────────────────────────
|
|
31
|
+
/**
|
|
32
|
+
* Strip shipped milestone content wrapped in <details> blocks.
|
|
33
|
+
*/
|
|
34
|
+
function stripShippedMilestones(content) {
|
|
35
|
+
return content.replace(/<details>[\s\S]*?<\/details>/gi, '');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Extract the current milestone section from ROADMAP.md by positive lookup.
|
|
39
|
+
*/
|
|
40
|
+
function extractCurrentMilestone(content, cwd) {
|
|
41
|
+
if (!cwd)
|
|
42
|
+
return stripShippedMilestones(content);
|
|
43
|
+
let version = null;
|
|
44
|
+
try {
|
|
45
|
+
const statePath = node_path_1.default.join(planningDir(cwd), 'STATE.md');
|
|
46
|
+
const stateRaw = (0, shell_command_projection_cjs_1.platformReadSync)(statePath);
|
|
47
|
+
if (stateRaw !== null) {
|
|
48
|
+
const milestoneMatch = stateRaw.match(/^milestone:\s*(.+)/m);
|
|
49
|
+
if (milestoneMatch) {
|
|
50
|
+
version = milestoneMatch[1].trim();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch { /* ignore */ }
|
|
55
|
+
if (!version) {
|
|
56
|
+
const inProgressMatch = content.match(/(?:🚧|🔄)\s*\*\*v(\d+\.\d+)\s/);
|
|
57
|
+
if (inProgressMatch) {
|
|
58
|
+
version = 'v' + inProgressMatch[1];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (!version)
|
|
62
|
+
return stripShippedMilestones(content);
|
|
63
|
+
const escapedVersion = escapeRegex(version);
|
|
64
|
+
const sectionPattern = new RegExp(`(^#{1,3}\\s+(?!Phase\\s+\\S).*${escapedVersion}\\b[^\\n]*)`, 'gmi');
|
|
65
|
+
const summaryPattern = new RegExp(`<summary[^>]*>([^<]*${escapedVersion}[^<]*)<\\/summary>`, 'i');
|
|
66
|
+
const headingMatches = [...content.matchAll(sectionPattern)];
|
|
67
|
+
if (headingMatches.length === 0) {
|
|
68
|
+
const summaryMatch = content.match(summaryPattern);
|
|
69
|
+
if (summaryMatch) {
|
|
70
|
+
const summaryIdx = content.indexOf(summaryMatch[0]);
|
|
71
|
+
const beforeSummary = content.slice(0, summaryIdx);
|
|
72
|
+
const detailsOpenIdx = beforeSummary.lastIndexOf('<details');
|
|
73
|
+
if (detailsOpenIdx !== -1) {
|
|
74
|
+
const afterDetails = content.slice(detailsOpenIdx);
|
|
75
|
+
const closingMatch = afterDetails.match(/<\/details>/i);
|
|
76
|
+
const detailsEnd = closingMatch
|
|
77
|
+
? detailsOpenIdx + (closingMatch.index ?? 0) + '</details>'.length
|
|
78
|
+
: content.length;
|
|
79
|
+
const anyMilestoneOrDetails = /^#{1,3}\s+(?!Phase\s+\S)(?:.*v\d+\.\d+|✅|📋|🚧|🔄)|<details/im;
|
|
80
|
+
const firstMilestoneMatch = content.match(anyMilestoneOrDetails);
|
|
81
|
+
const preambleCutoff = firstMilestoneMatch ? firstMilestoneMatch.index : detailsOpenIdx;
|
|
82
|
+
const preamble = content.slice(0, preambleCutoff)
|
|
83
|
+
.replace(/<details>[\s\S]*?<\/details>/gi, '')
|
|
84
|
+
.replace(/^#{2,4}\s*Phase\s+[\w][\w.-]*\s*:[^\n]*(?:\n(?!#{1,6}\s)[^\n]*)*\n?/gim, '')
|
|
85
|
+
.replace(/^#{1,4}\s*Phase Details\b[^\n]*\n?/gim, '');
|
|
86
|
+
return preamble + content.slice(detailsOpenIdx, detailsEnd);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return stripShippedMilestones(content);
|
|
90
|
+
}
|
|
91
|
+
const allMatches = headingMatches;
|
|
92
|
+
const closedMarkerPattern = /\b(?:CLOSED|ARCHIVED|ABANDONED|SHIPPED|FAILED)\b|✅|🗄/i;
|
|
93
|
+
const activeMarkerPattern = /\b(?:STARTED|ACTIVE|WIP)\b|in\s+progress|🚧|🔄/i;
|
|
94
|
+
const isClosed = (h) => closedMarkerPattern.test(h) && !activeMarkerPattern.test(h);
|
|
95
|
+
const firstMatch = allMatches[0];
|
|
96
|
+
const selected = allMatches.find((m) => !isClosed(m[1])) || firstMatch;
|
|
97
|
+
const sectionStart = selected.index;
|
|
98
|
+
const computeSectionEnd = (headingText, headingStart) => {
|
|
99
|
+
const level = (headingText.match(/^(#{1,3})\s/) ?? ['', '#'])[1].length;
|
|
100
|
+
const rest = content.slice(headingStart + headingText.length);
|
|
101
|
+
const stopPattern = new RegExp(`^#{1,${level}}\\s+(?!Phase\\s+\\S)(?:.*v\\d+\\.\\d+|✅|📋|🚧)`, 'i');
|
|
102
|
+
let end = content.length;
|
|
103
|
+
let fc = null;
|
|
104
|
+
let fl = 0;
|
|
105
|
+
let off = 0;
|
|
106
|
+
for (const line of rest.split('\n')) {
|
|
107
|
+
const fm = line.match(/^\s{0,3}((?:`{3,}|~{3,}))(.*)/);
|
|
108
|
+
if (fm) {
|
|
109
|
+
const ch = fm[1][0];
|
|
110
|
+
const ln = fm[1].length;
|
|
111
|
+
const trailing = fm[2] || '';
|
|
112
|
+
if (!fc) {
|
|
113
|
+
fc = ch;
|
|
114
|
+
fl = ln;
|
|
115
|
+
}
|
|
116
|
+
else if (ch === fc && ln >= fl && /^\s*$/.test(trailing)) {
|
|
117
|
+
fc = null;
|
|
118
|
+
fl = 0;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else if (!fc && stopPattern.test(line)) {
|
|
122
|
+
end = headingStart + headingText.length + off;
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
off += line.length + 1;
|
|
126
|
+
}
|
|
127
|
+
return end;
|
|
128
|
+
};
|
|
129
|
+
const sectionEnd = computeSectionEnd(selected[0], sectionStart);
|
|
130
|
+
const anyMilestonePattern = /^#{1,3}\s+(?!Phase\s+\S)(?:.*v\d+\.\d+|✅|📋|🚧)/im;
|
|
131
|
+
const firstMilestoneMatch = content.match(anyMilestonePattern);
|
|
132
|
+
const preambleCutoff = firstMilestoneMatch
|
|
133
|
+
? firstMilestoneMatch.index
|
|
134
|
+
: firstMatch.index;
|
|
135
|
+
const beforeMilestones = content.slice(0, preambleCutoff);
|
|
136
|
+
const currentSection = content.slice(sectionStart, sectionEnd);
|
|
137
|
+
// Multi-milestone roadmaps split each added milestone across two version-bearing
|
|
138
|
+
// headings: a `## Phases` checklist subsection (early) and a dedicated
|
|
139
|
+
// `## Milestone … (Phase Details)` section (late) holding the `### Phase N:`
|
|
140
|
+
// detail headers. The scope window above stops at the next version-bearing
|
|
141
|
+
// heading — the current milestone's OWN Phase Details heading — leaving those
|
|
142
|
+
// detail headers outside `currentSection`. Append that section so phase
|
|
143
|
+
// resolution and counting see the current milestone's phases. Anchor the lookup
|
|
144
|
+
// to the SELECTED heading's specific version token (boundary-aware, so a
|
|
145
|
+
// `v3.0` state does not match a `v3.0-A` sub-milestone) so sibling milestones
|
|
146
|
+
// that share a version prefix do not cross-pollinate. (#730)
|
|
147
|
+
const selectedVersionToken = selected[1].match(/v\d+(?:\.\d+)+(?:[-.][A-Za-z0-9]+)*/i)?.[0];
|
|
148
|
+
const detailsVersionBoundary = selectedVersionToken
|
|
149
|
+
? new RegExp(`${escapeRegex(selectedVersionToken)}(?![\\w.-])`, 'i')
|
|
150
|
+
: null;
|
|
151
|
+
let detailsSection = '';
|
|
152
|
+
const detailsMatch = allMatches.find((m) => /\(Phase\s+Details\)/i.test(m[1]) &&
|
|
153
|
+
!isClosed(m[1]) &&
|
|
154
|
+
(!detailsVersionBoundary || detailsVersionBoundary.test(m[1])) &&
|
|
155
|
+
(m.index ?? 0) >= sectionEnd);
|
|
156
|
+
if (detailsMatch) {
|
|
157
|
+
const detailsStart = detailsMatch.index ?? 0;
|
|
158
|
+
detailsSection = content.slice(detailsStart, computeSectionEnd(detailsMatch[0], detailsStart));
|
|
159
|
+
}
|
|
160
|
+
const preamble = beforeMilestones
|
|
161
|
+
.replace(/<details>[\s\S]*?<\/details>/gi, '')
|
|
162
|
+
.replace(/^#{2,4}\s*Phase\s+[\w][\w.-]*\s*:[^\n]*(?:\n(?!#{1,6}\s)[^\n]*)*\n?/gim, '')
|
|
163
|
+
.replace(/^#{1,4}\s*Phase Details\b[^\n]*\n?/gim, '');
|
|
164
|
+
return detailsSection
|
|
165
|
+
? preamble + currentSection + '\n' + detailsSection
|
|
166
|
+
: preamble + currentSection;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Replace a pattern only in the current milestone section of ROADMAP.md.
|
|
170
|
+
*/
|
|
171
|
+
function replaceInCurrentMilestone(content, pattern, replacement) {
|
|
172
|
+
const lastDetailsClose = content.lastIndexOf('</details>');
|
|
173
|
+
if (lastDetailsClose === -1) {
|
|
174
|
+
return content.replace(pattern, replacement);
|
|
175
|
+
}
|
|
176
|
+
const offset = lastDetailsClose + '</details>'.length;
|
|
177
|
+
const before = content.slice(0, offset);
|
|
178
|
+
const after = content.slice(offset);
|
|
179
|
+
return before + after.replace(pattern, replacement);
|
|
180
|
+
}
|
|
181
|
+
function findRoadmapPhaseInContent(content, phaseNum) {
|
|
182
|
+
const phasePattern = new RegExp(`#{2,4}\\s*(?:\\[[^\\]]+\\]\\s*)?Phase\\s+${phaseMarkdownRegexSource(phaseNum)}:\\s*([^\\n]+)`, 'i');
|
|
183
|
+
const headerMatch = content.match(phasePattern);
|
|
184
|
+
if (!headerMatch)
|
|
185
|
+
return null;
|
|
186
|
+
const phaseName = headerMatch[1].trim();
|
|
187
|
+
const headerIndex = headerMatch.index;
|
|
188
|
+
const restOfContent = content.slice(headerIndex);
|
|
189
|
+
const nextHeaderMatch = restOfContent.match(/\n#{2,4}\s+(?:\[[^\]]+\]\s*)?Phase\s+[\w]/i);
|
|
190
|
+
const sectionEnd = nextHeaderMatch ? headerIndex + nextHeaderMatch.index : content.length;
|
|
191
|
+
const section = content.slice(headerIndex, sectionEnd).trim();
|
|
192
|
+
const goalMatch = section.match(/\*\*Goal(?:\*\*:|\*?\*?:\*\*)\s*([^\n]+)/i);
|
|
193
|
+
const goal = goalMatch ? goalMatch[1].trim() : null;
|
|
194
|
+
return {
|
|
195
|
+
found: true,
|
|
196
|
+
phase_number: String(phaseNum),
|
|
197
|
+
phase_name: phaseName,
|
|
198
|
+
goal,
|
|
199
|
+
section,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
function getRoadmapPhaseInternal(cwd, phaseNum) {
|
|
203
|
+
if (!phaseNum)
|
|
204
|
+
return null;
|
|
205
|
+
const roadmapPath = node_path_1.default.join(planningDir(cwd), 'ROADMAP.md');
|
|
206
|
+
if (!node_fs_1.default.existsSync(roadmapPath))
|
|
207
|
+
return null;
|
|
208
|
+
try {
|
|
209
|
+
const roadmapRaw = (0, shell_command_projection_cjs_1.platformReadSync)(roadmapPath);
|
|
210
|
+
if (roadmapRaw === null)
|
|
211
|
+
throw new Error('missing');
|
|
212
|
+
const content = extractCurrentMilestone(roadmapRaw, cwd);
|
|
213
|
+
const scopedResult = findRoadmapPhaseInContent(content, phaseNum);
|
|
214
|
+
if (scopedResult)
|
|
215
|
+
return scopedResult;
|
|
216
|
+
return findRoadmapPhaseInContent(stripShippedMilestones(roadmapRaw), phaseNum);
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
function getMilestoneInfo(cwd) {
|
|
223
|
+
try {
|
|
224
|
+
const roadmap = (0, shell_command_projection_cjs_1.platformReadSync)(node_path_1.default.join(planningDir(cwd), 'ROADMAP.md'));
|
|
225
|
+
if (roadmap === null)
|
|
226
|
+
throw new Error('missing');
|
|
227
|
+
let stateVersion = null;
|
|
228
|
+
if (cwd) {
|
|
229
|
+
try {
|
|
230
|
+
const statePath = node_path_1.default.join(planningDir(cwd), 'STATE.md');
|
|
231
|
+
const stateRaw = (0, shell_command_projection_cjs_1.platformReadSync)(statePath);
|
|
232
|
+
if (stateRaw !== null) {
|
|
233
|
+
const m = stateRaw.match(/^milestone:\s*(.+)/m);
|
|
234
|
+
if (m)
|
|
235
|
+
stateVersion = m[1].trim();
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch { /* intentionally empty */ }
|
|
239
|
+
}
|
|
240
|
+
if (stateVersion) {
|
|
241
|
+
const escapedVer = escapeRegex(stateVersion);
|
|
242
|
+
const headingMatch = roadmap.match(new RegExp(`##[^\\n]*${escapedVer}[:\\s]+([^\\n(]+)`, 'i'));
|
|
243
|
+
if (headingMatch) {
|
|
244
|
+
if (!headingMatch[0].includes('✅')) {
|
|
245
|
+
return { version: stateVersion, name: headingMatch[1].trim() };
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
const listMatch = roadmap.match(new RegExp(`🚧\\s*\\*?\\*?${escapedVer}\\s+([^*\\n]+)`, 'i'));
|
|
250
|
+
if (listMatch) {
|
|
251
|
+
return { version: stateVersion, name: listMatch[1].trim() };
|
|
252
|
+
}
|
|
253
|
+
return { version: stateVersion, name: 'milestone' };
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
const inProgressMatch = roadmap.match(/🚧\s*\*\*v(\d+(?:\.\d+)+)\s+([^*]+)\*\*/);
|
|
257
|
+
if (inProgressMatch) {
|
|
258
|
+
return {
|
|
259
|
+
version: 'v' + inProgressMatch[1],
|
|
260
|
+
name: inProgressMatch[2].trim(),
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
const cleaned = stripShippedMilestones(roadmap);
|
|
264
|
+
const headingMatch = cleaned.match(/## (?!.*✅).*v(\d+(?:\.\d+)+)[:\s]+([^\n(]+)/);
|
|
265
|
+
if (headingMatch) {
|
|
266
|
+
return {
|
|
267
|
+
version: 'v' + headingMatch[1],
|
|
268
|
+
name: headingMatch[2].trim(),
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
const versionMatch = cleaned.match(/v(\d+(?:\.\d+)+)/);
|
|
272
|
+
return {
|
|
273
|
+
version: versionMatch ? versionMatch[0] : 'v1.0',
|
|
274
|
+
name: 'milestone',
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
return { version: 'v1.0', name: 'milestone' };
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// ─── Fence-aware text helper ──────────────────────────────────────────────────
|
|
282
|
+
/**
|
|
283
|
+
* Return a copy of `text` with every line that lies inside a fenced code block
|
|
284
|
+
* replaced by an empty string, using the same fence semantics as
|
|
285
|
+
* `computeSectionEnd` (backtick/tilde, ≥3 chars, indent ≤3 spaces, toggle;
|
|
286
|
+
* an unclosed fence treats remaining content as fenced).
|
|
287
|
+
*/
|
|
288
|
+
function stripFencedLines(text) {
|
|
289
|
+
let fenceChar = null;
|
|
290
|
+
let fenceLen = 0;
|
|
291
|
+
const lines = text.split('\n');
|
|
292
|
+
const result = [];
|
|
293
|
+
for (const line of lines) {
|
|
294
|
+
const fm = line.match(/^\s{0,3}((?:`{3,}|~{3,}))(.*)/);
|
|
295
|
+
if (fm) {
|
|
296
|
+
const ch = fm[1][0];
|
|
297
|
+
const ln = fm[1].length;
|
|
298
|
+
const trailing = fm[2] || '';
|
|
299
|
+
if (!fenceChar) {
|
|
300
|
+
fenceChar = ch;
|
|
301
|
+
fenceLen = ln;
|
|
302
|
+
// The fence-open line itself is not a content line — blank it.
|
|
303
|
+
result.push('');
|
|
304
|
+
}
|
|
305
|
+
else if (ch === fenceChar && ln >= fenceLen && /^\s*$/.test(trailing)) {
|
|
306
|
+
fenceChar = null;
|
|
307
|
+
fenceLen = 0;
|
|
308
|
+
// The fence-close line — blank it.
|
|
309
|
+
result.push('');
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
// A fence marker that doesn't close the current fence (different char or shorter) — keep treating as fenced content.
|
|
313
|
+
result.push(fenceChar ? '' : line);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
result.push(fenceChar ? '' : line);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return result.join('\n');
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Returns a filter function that checks whether a phase directory belongs
|
|
324
|
+
* to the current milestone based on ROADMAP.md phase headings.
|
|
325
|
+
*
|
|
326
|
+
* @param cwd - Project working directory.
|
|
327
|
+
* @param versionOverride - Optional version string to scope the phase filter
|
|
328
|
+
* to a specific milestone (e.g. 'v1.2').
|
|
329
|
+
* @param phaseIdConvention - The resolved `phase_id_convention` config value.
|
|
330
|
+
* When `'milestone-prefixed'`, a deprecation warning is emitted for
|
|
331
|
+
* free-form ROADMAPs that lack versioned milestone headings. When absent or
|
|
332
|
+
* any other value, the warning is suppressed — legacy/default projects must
|
|
333
|
+
* never see spurious warnings.
|
|
334
|
+
*/
|
|
335
|
+
function getMilestonePhaseFilter(cwd, versionOverride, phaseIdConvention) {
|
|
336
|
+
const milestonePhaseNums = new Set();
|
|
337
|
+
let missingExplicitVersion = false;
|
|
338
|
+
try {
|
|
339
|
+
const roadmapPath = node_path_1.default.join(planningDir(cwd), 'ROADMAP.md');
|
|
340
|
+
const roadmapContent = (0, shell_command_projection_cjs_1.platformReadSync)(roadmapPath);
|
|
341
|
+
if (roadmapContent === null)
|
|
342
|
+
throw new Error('missing');
|
|
343
|
+
let roadmap = extractCurrentMilestone(roadmapContent, cwd);
|
|
344
|
+
const hasVersionedMilestonesGlobal = /^#{1,3}\s+.*v\d+\.\d+/mi.test(roadmapContent);
|
|
345
|
+
const hasPhaseHeadings = /#{2,4}\s*(?:\[[^\]]+\]\s*)?Phase\s+[\w]/i.test(roadmapContent);
|
|
346
|
+
if (!hasVersionedMilestonesGlobal && hasPhaseHeadings && phaseIdConvention === 'milestone-prefixed') {
|
|
347
|
+
console.warn('[gsd] Deprecated: free-form ROADMAP.md detected (no versioned milestone headings). ' +
|
|
348
|
+
'The project has phase_id_convention set to "milestone-prefixed" in config.json but the ' +
|
|
349
|
+
'ROADMAP does not use versioned milestone headings. Run `gsd-tools roadmap upgrade --convention milestone-prefixed` to migrate (dry-run by default).');
|
|
350
|
+
}
|
|
351
|
+
if (versionOverride) {
|
|
352
|
+
const escapedVersion = escapeRegex(versionOverride);
|
|
353
|
+
const sectionPattern = new RegExp(`(^#{1,3}\\s+(?!Phase\\s+\\S).*${escapedVersion}[^\\n]*)`, 'mi');
|
|
354
|
+
let sectionMatch = roadmapContent.match(sectionPattern);
|
|
355
|
+
if (!sectionMatch) {
|
|
356
|
+
const summaryPat = new RegExp(`<summary[^>]*>[^<]*${escapedVersion}[^<]*<\\/summary>`, 'i');
|
|
357
|
+
const summaryHit = roadmapContent.match(summaryPat);
|
|
358
|
+
if (summaryHit) {
|
|
359
|
+
const beforeSummary = roadmapContent.slice(0, summaryHit.index);
|
|
360
|
+
const detailsIdx = beforeSummary.lastIndexOf('<details');
|
|
361
|
+
if (detailsIdx !== -1) {
|
|
362
|
+
sectionMatch = null;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
if (!sectionMatch) {
|
|
367
|
+
const hasVersionedMilestones = /^#{1,3}\s+(?!Phase\s+\S).*v\d+\.\d+/mi.test(roadmapContent);
|
|
368
|
+
const versionInSummary = new RegExp(`<summary[^>]*>[^<]*${escapedVersion}[^<]*<\\/summary>`, 'i').test(roadmapContent);
|
|
369
|
+
if (hasVersionedMilestones && !versionInSummary) {
|
|
370
|
+
roadmap = '';
|
|
371
|
+
missingExplicitVersion = true;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
const sectionStart = sectionMatch.index;
|
|
376
|
+
const headingLevel = (sectionMatch[1].match(/^(#{1,3})\s/) ?? ['', '#'])[1].length;
|
|
377
|
+
const restContent = roadmapContent.slice(sectionStart + sectionMatch[0].length);
|
|
378
|
+
const nextMilestonePattern = new RegExp(`^#{1,${headingLevel}}\\s+(?!Phase\\s+\\S)(?:.*v\\d+\\.\\d+|✅|📋|🚧)`, 'i');
|
|
379
|
+
let sectionEnd = roadmapContent.length;
|
|
380
|
+
let fenceChar = null;
|
|
381
|
+
let fenceLen = 0;
|
|
382
|
+
let charOffset = 0;
|
|
383
|
+
for (const line of restContent.split('\n')) {
|
|
384
|
+
const fenceMatch = line.match(/^\s{0,3}((?:`{3,}|~{3,}))(.*)/);
|
|
385
|
+
if (fenceMatch) {
|
|
386
|
+
const char = fenceMatch[1][0];
|
|
387
|
+
const len = fenceMatch[1].length;
|
|
388
|
+
const trailing = fenceMatch[2] || '';
|
|
389
|
+
if (!fenceChar) {
|
|
390
|
+
fenceChar = char;
|
|
391
|
+
fenceLen = len;
|
|
392
|
+
}
|
|
393
|
+
else if (char === fenceChar && len >= fenceLen && /^\s*$/.test(trailing)) {
|
|
394
|
+
fenceChar = null;
|
|
395
|
+
fenceLen = 0;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
else if (!fenceChar && nextMilestonePattern.test(line)) {
|
|
399
|
+
sectionEnd = sectionStart + sectionMatch[0].length + charOffset;
|
|
400
|
+
break;
|
|
401
|
+
}
|
|
402
|
+
charOffset += line.length + 1;
|
|
403
|
+
}
|
|
404
|
+
const currentSection = roadmapContent.slice(sectionStart, sectionEnd);
|
|
405
|
+
roadmap = currentSection;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
const phasePattern = /#{2,4}\s*(?:\[[^\]]+\]\s*)?Phase\s+([\w][\w.-]*)\s*:/gi;
|
|
409
|
+
const roadmapUnfenced = stripFencedLines(roadmap);
|
|
410
|
+
let m;
|
|
411
|
+
while ((m = phasePattern.exec(roadmapUnfenced)) !== null) {
|
|
412
|
+
milestonePhaseNums.add(m[1]);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
catch { /* intentionally empty */ }
|
|
416
|
+
if (milestonePhaseNums.size === 0) {
|
|
417
|
+
const passAll = (() => true);
|
|
418
|
+
passAll.phaseCount = 0;
|
|
419
|
+
passAll.missingExplicitVersion = missingExplicitVersion;
|
|
420
|
+
return passAll;
|
|
421
|
+
}
|
|
422
|
+
const normalized = new Set([...milestonePhaseNums].map(n => n.split('-').map(seg => (seg.replace(/^0+(?=\d)/, '') || '0')).join('-').toLowerCase()));
|
|
423
|
+
function normalizePhaseIdSegments(id) {
|
|
424
|
+
return id.split('-').map(seg => seg.replace(/^0+(?=\d)/, '') || '0').join('-');
|
|
425
|
+
}
|
|
426
|
+
const roadmapUsesHyphenedIds = [...normalized].some(n => n.includes('-'));
|
|
427
|
+
const numericRe = roadmapUsesHyphenedIds
|
|
428
|
+
? /^0*(\d+(?:-0*\d+)*[A-Za-z]?(?:\.\d+)*)/
|
|
429
|
+
: /^0*(\d+[A-Za-z]?(?:\.\d+)*)/;
|
|
430
|
+
function isDirInMilestone(dirName) {
|
|
431
|
+
const m2 = dirName.match(numericRe);
|
|
432
|
+
if (m2 && normalized.has(normalizePhaseIdSegments(m2[1]).toLowerCase()))
|
|
433
|
+
return true;
|
|
434
|
+
const customMatch = dirName.match(/^([A-Za-z][A-Za-z0-9]*(?:-[A-Za-z0-9]+)*)/);
|
|
435
|
+
if (customMatch && normalized.has(customMatch[1].toLowerCase()))
|
|
436
|
+
return true;
|
|
437
|
+
const stripped = dirName.replace(/^[A-Z]{1,6}-(?=\d)/i, '');
|
|
438
|
+
if (stripped !== dirName) {
|
|
439
|
+
const sm = stripped.match(numericRe);
|
|
440
|
+
if (sm && normalized.has(normalizePhaseIdSegments(sm[1]).toLowerCase()))
|
|
441
|
+
return true;
|
|
442
|
+
}
|
|
443
|
+
return false;
|
|
444
|
+
}
|
|
445
|
+
isDirInMilestone.phaseCount = milestonePhaseNums.size;
|
|
446
|
+
isDirInMilestone.missingExplicitVersion = missingExplicitVersion;
|
|
447
|
+
return isDirInMilestone;
|
|
448
|
+
}
|
|
449
|
+
module.exports = {
|
|
450
|
+
stripShippedMilestones,
|
|
451
|
+
extractCurrentMilestone,
|
|
452
|
+
replaceInCurrentMilestone,
|
|
453
|
+
getRoadmapPhaseInternal,
|
|
454
|
+
getMilestoneInfo,
|
|
455
|
+
getMilestonePhaseFilter,
|
|
456
|
+
};
|