@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,225 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Installer migration: record first-time installer migration baseline.
|
|
4
|
+
*
|
|
5
|
+
* ADR-457 build-at-publish: the hand-written
|
|
6
|
+
* bin/lib/installer-migrations/000-first-time-baseline.cjs collapsed to a
|
|
7
|
+
* TypeScript source of truth. Behaviour is preserved byte-for-behaviour from
|
|
8
|
+
* the prior hand-written .cjs; only types are added.
|
|
9
|
+
*/
|
|
10
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
11
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
12
|
+
};
|
|
13
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
14
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
15
|
+
const BASELINE_MIGRATION_ID = '2026-05-11-first-time-baseline-scan';
|
|
16
|
+
// Runtime install surfaces must stay aligned with:
|
|
17
|
+
// - docs/installer-migrations.md#runtime-configuration-contract-registry
|
|
18
|
+
// - docs/ARCHITECTURE.md#runtime-install-contract-matrix
|
|
19
|
+
const RUNTIME_SURFACES = {
|
|
20
|
+
claude: ['pp-core', 'commands/gsd', 'skills', 'agents', 'hooks', 'settings.json'],
|
|
21
|
+
codex: ['pp-core', 'skills', 'agents', 'hooks', 'config.toml', 'hooks.json'],
|
|
22
|
+
gemini: ['pp-core', 'commands/gsd', 'hooks'],
|
|
23
|
+
opencode: ['pp-core', 'command', 'skills', 'agents'],
|
|
24
|
+
kilo: ['pp-core', 'command', 'skills', 'agents'],
|
|
25
|
+
copilot: ['pp-core', 'skills', 'agents'],
|
|
26
|
+
antigravity: ['pp-core', 'skills', 'agents'],
|
|
27
|
+
cursor: ['pp-core', 'skills', 'agents', 'hooks', 'hooks.json'],
|
|
28
|
+
windsurf: ['pp-core', 'skills', 'agents', 'rules'],
|
|
29
|
+
augment: ['pp-core', 'skills', 'agents'],
|
|
30
|
+
trae: ['pp-core', 'skills', 'agents', 'rules'],
|
|
31
|
+
qwen: ['pp-core', 'skills', 'agents'],
|
|
32
|
+
hermes: ['pp-core', 'skills/gsd', 'agents'],
|
|
33
|
+
cline: ['pp-core', 'skills', 'agents'],
|
|
34
|
+
codebuddy: ['pp-core', 'skills', 'agents'],
|
|
35
|
+
};
|
|
36
|
+
const COMMON_SURFACES = ['pp-core', 'skills', 'agents', 'hooks'];
|
|
37
|
+
const INTERNAL_TOP_LEVEL_NAMES = new Set([
|
|
38
|
+
'pp-file-manifest.json',
|
|
39
|
+
'pp-install-state.json',
|
|
40
|
+
'pp-migration-backups',
|
|
41
|
+
'pp-migration-journal',
|
|
42
|
+
]);
|
|
43
|
+
const USER_OWNED_PATHS = new Set([
|
|
44
|
+
'pp-core/USER-PROFILE.md',
|
|
45
|
+
'commands/gsd/dev-preferences.md',
|
|
46
|
+
'skills/gsd-dev-preferences/SKILL.md',
|
|
47
|
+
]);
|
|
48
|
+
let knownGeneratedAgentNames = null;
|
|
49
|
+
function normalizeRelPath(relPath) {
|
|
50
|
+
return relPath.replace(/\\/g, '/').replace(/^\/+/, '');
|
|
51
|
+
}
|
|
52
|
+
function baselineInstallSurfaces(runtime) {
|
|
53
|
+
if (runtime && RUNTIME_SURFACES[runtime])
|
|
54
|
+
return RUNTIME_SURFACES[runtime];
|
|
55
|
+
return COMMON_SURFACES;
|
|
56
|
+
}
|
|
57
|
+
function walkFiles(root, relDir, files) {
|
|
58
|
+
const dir = node_path_1.default.join(root, relDir);
|
|
59
|
+
if (!node_fs_1.default.existsSync(dir))
|
|
60
|
+
return;
|
|
61
|
+
const entries = node_fs_1.default.readdirSync(dir, { withFileTypes: true });
|
|
62
|
+
for (const entry of entries) {
|
|
63
|
+
const relPath = node_path_1.default.posix.join(relDir, entry.name);
|
|
64
|
+
if (relDir === '' && INTERNAL_TOP_LEVEL_NAMES.has(entry.name))
|
|
65
|
+
continue;
|
|
66
|
+
if (entry.isDirectory()) {
|
|
67
|
+
walkFiles(root, relPath, files);
|
|
68
|
+
}
|
|
69
|
+
else if (entry.isFile()) {
|
|
70
|
+
files.add(normalizeRelPath(relPath));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function scanBaselineFiles(configDir, runtime) {
|
|
75
|
+
const relPaths = new Set();
|
|
76
|
+
for (const surface of baselineInstallSurfaces(runtime)) {
|
|
77
|
+
const normalized = normalizeRelPath(surface);
|
|
78
|
+
const fullPath = node_path_1.default.join(configDir, normalized);
|
|
79
|
+
if (!node_fs_1.default.existsSync(fullPath))
|
|
80
|
+
continue;
|
|
81
|
+
const stat = node_fs_1.default.statSync(fullPath);
|
|
82
|
+
if (stat.isDirectory()) {
|
|
83
|
+
walkFiles(configDir, normalized, relPaths);
|
|
84
|
+
}
|
|
85
|
+
else if (stat.isFile() && !INTERNAL_TOP_LEVEL_NAMES.has(normalized)) {
|
|
86
|
+
relPaths.add(normalized);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return [...relPaths];
|
|
90
|
+
}
|
|
91
|
+
function isUserOwnedBaselinePath(relPath) {
|
|
92
|
+
if (USER_OWNED_PATHS.has(relPath))
|
|
93
|
+
return true;
|
|
94
|
+
const parts = relPath.split('/');
|
|
95
|
+
// pp-core managed skills start with 'pp-' (new) or 'gsd-' (legacy back-compat);
|
|
96
|
+
// all other skill dirs are user-owned.
|
|
97
|
+
if (parts[0] === 'skills' && parts[1] && !parts[1].startsWith('pp-') && !parts[1].startsWith('gsd-'))
|
|
98
|
+
return true;
|
|
99
|
+
// Same for agents.
|
|
100
|
+
if (parts[0] === 'agents' && parts[1] && !parts[1].startsWith('pp-') && !parts[1].startsWith('gsd-'))
|
|
101
|
+
return true;
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
function listKnownGeneratedAgentNames() {
|
|
105
|
+
if (knownGeneratedAgentNames)
|
|
106
|
+
return knownGeneratedAgentNames;
|
|
107
|
+
knownGeneratedAgentNames = new Set();
|
|
108
|
+
const agentsDir = node_path_1.default.resolve(__dirname, '..', '..', '..', '..', 'agents');
|
|
109
|
+
try {
|
|
110
|
+
for (const entry of node_fs_1.default.readdirSync(agentsDir, { withFileTypes: true })) {
|
|
111
|
+
if (entry.isFile() && (entry.name.startsWith('pp-') || entry.name.startsWith('gsd-')) && entry.name.endsWith('.md')) {
|
|
112
|
+
knownGeneratedAgentNames.add(entry.name.replace(/\.md$/, ''));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// If the source agent directory is unavailable, fail closed and treat
|
|
118
|
+
// GSD-looking agent files as user-choice artifacts.
|
|
119
|
+
}
|
|
120
|
+
return knownGeneratedAgentNames;
|
|
121
|
+
}
|
|
122
|
+
function isKnownGeneratedAgentPath(relPath, runtime) {
|
|
123
|
+
const parts = relPath.split('/');
|
|
124
|
+
if (parts.length !== 2 || parts[0] !== 'agents')
|
|
125
|
+
return false;
|
|
126
|
+
const fileName = parts[1];
|
|
127
|
+
const extension = node_path_1.default.posix.extname(fileName);
|
|
128
|
+
if (extension !== '.md' && !(runtime === 'codex' && extension === '.toml'))
|
|
129
|
+
return false;
|
|
130
|
+
const agentName = fileName.slice(0, -extension.length);
|
|
131
|
+
return listKnownGeneratedAgentNames().has(agentName);
|
|
132
|
+
}
|
|
133
|
+
function isStaleGsdLookingPath(relPath) {
|
|
134
|
+
const baseName = node_path_1.default.posix.basename(relPath);
|
|
135
|
+
// Match gsd-* / gsd_* (legacy) and pp-* / pp_* (current) hook files that may
|
|
136
|
+
// be leftover from a prior install and need user decision at baseline scan.
|
|
137
|
+
if (/^gsd[-_]/.test(baseName))
|
|
138
|
+
return true;
|
|
139
|
+
if (/^pp[-_]/.test(baseName))
|
|
140
|
+
return true;
|
|
141
|
+
const parts = relPath.split('/');
|
|
142
|
+
if ((parts[0] === 'skills' || parts[0] === 'agents') && parts[1] && (parts[1].startsWith('gsd-') || parts[1].startsWith('pp-'))) {
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
function baselineActionRank(action) {
|
|
148
|
+
if (action.type === 'record-baseline')
|
|
149
|
+
return 0;
|
|
150
|
+
if (action.type === 'baseline-preserve-user')
|
|
151
|
+
return 1;
|
|
152
|
+
return 2;
|
|
153
|
+
}
|
|
154
|
+
const migration = {
|
|
155
|
+
id: BASELINE_MIGRATION_ID,
|
|
156
|
+
title: 'Record first-time installer migration baseline',
|
|
157
|
+
description: 'Classify existing install surfaces before destructive installer migrations run.',
|
|
158
|
+
introducedIn: '1.50.0',
|
|
159
|
+
scopes: ['global', 'local'],
|
|
160
|
+
destructive: false,
|
|
161
|
+
plan: ({ configDir, runtime, baselineScan, classifyArtifact }) => {
|
|
162
|
+
if (!baselineScan)
|
|
163
|
+
return [];
|
|
164
|
+
const actions = [];
|
|
165
|
+
for (const relPath of scanBaselineFiles(configDir, runtime)) {
|
|
166
|
+
// docs/installer-migrations.md#baseline-preserve-user keeps user-owned
|
|
167
|
+
// artifacts out of destructive migration flow.
|
|
168
|
+
if (isUserOwnedBaselinePath(relPath)) {
|
|
169
|
+
actions.push({
|
|
170
|
+
type: 'baseline-preserve-user',
|
|
171
|
+
relPath,
|
|
172
|
+
reason: 'known user-owned artifact preserved by first-time migration baseline',
|
|
173
|
+
classification: 'user-owned',
|
|
174
|
+
originalHash: null,
|
|
175
|
+
currentHash: null,
|
|
176
|
+
});
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const artifact = classifyArtifact(relPath);
|
|
180
|
+
if (artifact.classification === 'managed-pristine' || artifact.classification === 'managed-modified') {
|
|
181
|
+
actions.push({
|
|
182
|
+
type: 'record-baseline',
|
|
183
|
+
relPath,
|
|
184
|
+
reason: 'existing manifest-managed file included in first-time migration baseline',
|
|
185
|
+
});
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
const currentHash = artifact.currentHash ?? null;
|
|
189
|
+
if (isKnownGeneratedAgentPath(relPath, runtime)) {
|
|
190
|
+
actions.push({
|
|
191
|
+
type: 'record-baseline',
|
|
192
|
+
relPath,
|
|
193
|
+
reason: 'known installer-generated agent included in first-time migration baseline',
|
|
194
|
+
classification: artifact.classification,
|
|
195
|
+
originalHash: artifact.originalHash ?? null,
|
|
196
|
+
currentHash,
|
|
197
|
+
});
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (isStaleGsdLookingPath(relPath)) {
|
|
201
|
+
actions.push({
|
|
202
|
+
type: 'prompt-user',
|
|
203
|
+
relPath,
|
|
204
|
+
reason: 'GSD-looking file is not proven manifest-managed and needs explicit user choice',
|
|
205
|
+
classification: 'stale-gsd-looking',
|
|
206
|
+
originalHash: artifact.originalHash ?? null,
|
|
207
|
+
currentHash,
|
|
208
|
+
prompt: 'Choose whether to remove this stale-looking GSD artifact or keep it as user-owned.',
|
|
209
|
+
choices: ['keep', 'remove'],
|
|
210
|
+
});
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
actions.push({
|
|
214
|
+
type: 'baseline-preserve-user',
|
|
215
|
+
relPath,
|
|
216
|
+
reason: 'unknown install-surface file preserved by first-time migration baseline',
|
|
217
|
+
classification: artifact.classification,
|
|
218
|
+
originalHash: artifact.originalHash ?? null,
|
|
219
|
+
currentHash,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
return actions.sort((left, right) => baselineActionRank(left) - baselineActionRank(right) || left.relPath.localeCompare(right.relPath));
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
module.exports = migration;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Installer migration: remove manifest-managed legacy orphan hook files
|
|
4
|
+
* (ADR-457 build-at-publish: the hand-written
|
|
5
|
+
* bin/lib/installer-migrations/001-legacy-orphan-files.cjs collapsed to a
|
|
6
|
+
* TypeScript source of truth). Behaviour is preserved byte-for-behaviour from
|
|
7
|
+
* the prior hand-written .cjs; only types are added.
|
|
8
|
+
*/
|
|
9
|
+
const LEGACY_ORPHAN_FILES = [
|
|
10
|
+
'hooks/gsd-notify.sh',
|
|
11
|
+
'hooks/statusline.js',
|
|
12
|
+
];
|
|
13
|
+
const migration = {
|
|
14
|
+
id: '2026-05-11-legacy-orphan-files',
|
|
15
|
+
title: 'Remove manifest-managed legacy orphan hook files',
|
|
16
|
+
description: 'Remove legacy orphan hook files that are still manifest-managed.',
|
|
17
|
+
introducedIn: '1.50.0',
|
|
18
|
+
scopes: ['global', 'local'],
|
|
19
|
+
destructive: true,
|
|
20
|
+
// Retired generated hook files are removed only with manifest-managed
|
|
21
|
+
// evidence. This follows docs/installer-migrations.md#ownership and avoids
|
|
22
|
+
// relying on whether a runtime currently registers host hook config in the
|
|
23
|
+
// runtime contract registry.
|
|
24
|
+
plan: (ctx) => {
|
|
25
|
+
const actions = [];
|
|
26
|
+
for (const relPath of LEGACY_ORPHAN_FILES) {
|
|
27
|
+
const artifact = ctx.classifyArtifact(relPath);
|
|
28
|
+
if (artifact.classification === 'managed-pristine') {
|
|
29
|
+
actions.push({
|
|
30
|
+
type: 'remove-managed',
|
|
31
|
+
relPath,
|
|
32
|
+
reason: 'legacy orphan hook file retired by installer migration',
|
|
33
|
+
ownershipEvidence: 'legacy hook path is manifest-managed in gsd-file-manifest.json',
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
else if (artifact.classification === 'managed-modified') {
|
|
37
|
+
actions.push({
|
|
38
|
+
type: 'backup-and-remove',
|
|
39
|
+
relPath,
|
|
40
|
+
reason: 'legacy orphan hook file retired by installer migration',
|
|
41
|
+
ownershipEvidence: 'legacy hook path is manifest-managed in gsd-file-manifest.json',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return actions;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
module.exports = migration;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Installer migration: remove legacy Codex hooks.json GSD hook registrations.
|
|
4
|
+
*
|
|
5
|
+
* ADR-457 build-at-publish: the hand-written
|
|
6
|
+
* bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs collapsed to a
|
|
7
|
+
* TypeScript source of truth. Behaviour is preserved byte-for-behaviour from
|
|
8
|
+
* the prior hand-written .cjs; only types are added.
|
|
9
|
+
*/
|
|
10
|
+
const shell_command_projection_cjs_1 = require("../shell-command-projection.cjs");
|
|
11
|
+
function isStructurallyEmpty(value) {
|
|
12
|
+
if (value === null || value === undefined)
|
|
13
|
+
return true;
|
|
14
|
+
if (Array.isArray(value))
|
|
15
|
+
return value.length === 0;
|
|
16
|
+
if (typeof value !== 'object')
|
|
17
|
+
return false;
|
|
18
|
+
for (const _key in value)
|
|
19
|
+
return false;
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
function isManagedCodexHookCommand(command, configDir) {
|
|
23
|
+
return (0, shell_command_projection_cjs_1.isManagedHookCommand)(command, {
|
|
24
|
+
surface: 'codex-hooks-json',
|
|
25
|
+
includeLegacyAliases: true,
|
|
26
|
+
configDir,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function pruneLegacyCodexHooksJsonValue(value, configDir) {
|
|
30
|
+
if (Array.isArray(value)) {
|
|
31
|
+
let changed = false;
|
|
32
|
+
const next = [];
|
|
33
|
+
for (const item of value) {
|
|
34
|
+
const pruned = pruneLegacyCodexHooksJsonValue(item, configDir);
|
|
35
|
+
if (pruned.changed)
|
|
36
|
+
changed = true;
|
|
37
|
+
if (pruned.changed && isStructurallyEmpty(pruned.value))
|
|
38
|
+
changed = true;
|
|
39
|
+
else
|
|
40
|
+
next.push(pruned.value);
|
|
41
|
+
}
|
|
42
|
+
return { value: next, changed };
|
|
43
|
+
}
|
|
44
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
45
|
+
const valueObj = value;
|
|
46
|
+
const command = valueObj['command'];
|
|
47
|
+
if (isManagedCodexHookCommand(command, configDir)) {
|
|
48
|
+
return { value: null, changed: true };
|
|
49
|
+
}
|
|
50
|
+
let changed = false;
|
|
51
|
+
const next = {};
|
|
52
|
+
for (const [key, child] of Object.entries(valueObj)) {
|
|
53
|
+
const pruned = pruneLegacyCodexHooksJsonValue(child, configDir);
|
|
54
|
+
if (pruned.changed)
|
|
55
|
+
changed = true;
|
|
56
|
+
if (pruned.changed && isStructurallyEmpty(pruned.value))
|
|
57
|
+
changed = true;
|
|
58
|
+
else
|
|
59
|
+
next[key] = pruned.value;
|
|
60
|
+
}
|
|
61
|
+
return { value: next, changed };
|
|
62
|
+
}
|
|
63
|
+
return { value, changed: false };
|
|
64
|
+
}
|
|
65
|
+
const migration = {
|
|
66
|
+
id: '2026-05-11-codex-legacy-hooks-json',
|
|
67
|
+
title: 'Remove legacy Codex hooks.json GSD hook registrations',
|
|
68
|
+
description: 'Remove legacy Codex hooks.json GSD hook registrations after config.toml migration.',
|
|
69
|
+
introducedIn: '1.50.0',
|
|
70
|
+
runtimes: ['codex'],
|
|
71
|
+
scopes: ['global', 'local'],
|
|
72
|
+
destructive: true,
|
|
73
|
+
runtimeContract: 'docs/installer-migrations.md#runtime-configuration-contract-registry Codex row',
|
|
74
|
+
plan: (ctx) => {
|
|
75
|
+
const { configDir } = ctx;
|
|
76
|
+
const hooksJson = ctx.readJson('hooks.json');
|
|
77
|
+
if (!hooksJson.exists || hooksJson.error)
|
|
78
|
+
return [];
|
|
79
|
+
const pruned = pruneLegacyCodexHooksJsonValue(hooksJson.value, configDir);
|
|
80
|
+
if (!pruned.changed)
|
|
81
|
+
return [];
|
|
82
|
+
return [
|
|
83
|
+
{
|
|
84
|
+
type: 'rewrite-json',
|
|
85
|
+
relPath: 'hooks.json',
|
|
86
|
+
value: pruned.value,
|
|
87
|
+
deleteIfEmpty: true,
|
|
88
|
+
reason: 'legacy Codex hooks.json GSD registration retired by installer migration',
|
|
89
|
+
ownershipEvidence: 'pruned command matches generated GSD hook command under the install hooks directory',
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
module.exports = migration;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Installer migration 003: remove stale legacy get-shit-done/ runtime directory // gsd-allow-legacy-name
|
|
4
|
+
* files after the rename to gsd-core/ (#604).
|
|
5
|
+
*
|
|
6
|
+
* Background: the GSD runtime config subdirectory was renamed from
|
|
7
|
+
* get-shit-done/ to gsd-core/ in #604. On upgrade, both directories can exist // gsd-allow-legacy-name
|
|
8
|
+
* simultaneously. This migration removes prior-manifest-managed files from the
|
|
9
|
+
* legacy get-shit-done/ directory during install. Migrations run BEFORE the new // gsd-allow-legacy-name
|
|
10
|
+
* runtime is materialized, so gsd-core/ will not yet exist on the first upgrade
|
|
11
|
+
* run — the migration must not gate on its presence. If the install fails after
|
|
12
|
+
* migrations apply, the framework rolls back by restoring files from rollback
|
|
13
|
+
* storage (copied before deletion), so removing legacy files pre-materialization
|
|
14
|
+
* is safe.
|
|
15
|
+
*
|
|
16
|
+
* Per-file approach: the migration framework has no recursive directory-removal
|
|
17
|
+
* primitive — all actions operate on individual files identified by relPath. As
|
|
18
|
+
* a result, any empty subdirectory shells left under the legacy tree after all
|
|
19
|
+
* files are removed will remain on disk. Users can remove them manually if
|
|
20
|
+
* desired. This is a known, intentional limitation of the ADR-0008 design: the
|
|
21
|
+
* framework never removes directories, only files.
|
|
22
|
+
*
|
|
23
|
+
* User file preservation: files classified 'unknown' (not in the prior manifest)
|
|
24
|
+
* receive a 'baseline-preserve-user' action and are explicitly NOT removed.
|
|
25
|
+
*/
|
|
26
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
27
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
28
|
+
};
|
|
29
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
30
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
31
|
+
function walkLegacyFiles(root, relDir, baseResolved, results) {
|
|
32
|
+
const dir = node_path_1.default.join(root, relDir);
|
|
33
|
+
const entries = node_fs_1.default.readdirSync(dir, { withFileTypes: true });
|
|
34
|
+
for (const entry of entries) {
|
|
35
|
+
// Do not follow symlinks — skip them entirely to avoid out-of-tree traversal.
|
|
36
|
+
if (entry.isSymbolicLink())
|
|
37
|
+
continue; // gsd-allow-legacy-name (entry under legacy get-shit-done/ dir)
|
|
38
|
+
const relPath = node_path_1.default.posix.join(relDir, entry.name);
|
|
39
|
+
// Bounds check: ensure the resolved path stays under configDir.
|
|
40
|
+
const resolved = node_path_1.default.resolve(root, relPath);
|
|
41
|
+
if (resolved !== baseResolved && !resolved.startsWith(baseResolved + node_path_1.default.sep))
|
|
42
|
+
continue;
|
|
43
|
+
if (entry.isDirectory()) {
|
|
44
|
+
walkLegacyFiles(root, relPath, baseResolved, results);
|
|
45
|
+
}
|
|
46
|
+
else if (entry.isFile()) {
|
|
47
|
+
results.push(relPath);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const REASON = 'legacy runtime directory renamed to gsd-core (#604)';
|
|
52
|
+
const migration = {
|
|
53
|
+
id: '2026-06-02-rename-get-shit-done-to-gsd-core', // gsd-allow-legacy-name
|
|
54
|
+
title: 'Remove stale legacy get-shit-done/ runtime directory files (#604)', // gsd-allow-legacy-name
|
|
55
|
+
description: 'After the config dir rename from get-shit-done/ to gsd-core/ (#604), remove prior-manifest-managed files ' + // gsd-allow-legacy-name
|
|
56
|
+
'from the stale legacy directory during install (framework rollback restores them if install fails). User-added files are preserved.',
|
|
57
|
+
introducedIn: '1.2.0',
|
|
58
|
+
scopes: ['global', 'local'],
|
|
59
|
+
destructive: true,
|
|
60
|
+
plan(ctx) {
|
|
61
|
+
const legacyRoot = node_path_1.default.join(ctx.configDir, 'get-shit-done'); // gsd-allow-legacy-name
|
|
62
|
+
// Idempotency: if the legacy directory doesn't exist, nothing to do.
|
|
63
|
+
if (!node_fs_1.default.existsSync(legacyRoot))
|
|
64
|
+
return [];
|
|
65
|
+
// Safety: if the legacy root itself is a symlink to an out-of-tree location,
|
|
66
|
+
// do not process it — walking a symlinked dir could emit removes outside configDir.
|
|
67
|
+
if (node_fs_1.default.lstatSync(legacyRoot).isSymbolicLink())
|
|
68
|
+
return []; // gsd-allow-legacy-name
|
|
69
|
+
const baseResolved = node_path_1.default.resolve(ctx.configDir);
|
|
70
|
+
const relPaths = [];
|
|
71
|
+
walkLegacyFiles(ctx.configDir, 'get-shit-done', baseResolved, relPaths); // gsd-allow-legacy-name
|
|
72
|
+
const actions = [];
|
|
73
|
+
for (const relPath of relPaths) {
|
|
74
|
+
// Bounds-check each relPath before emitting any action.
|
|
75
|
+
const resolved = node_path_1.default.resolve(ctx.configDir, relPath);
|
|
76
|
+
if (resolved !== baseResolved && !resolved.startsWith(baseResolved + node_path_1.default.sep))
|
|
77
|
+
continue;
|
|
78
|
+
const { classification } = ctx.classifyArtifact(relPath);
|
|
79
|
+
if (classification === 'managed-pristine') {
|
|
80
|
+
actions.push({
|
|
81
|
+
type: 'remove-managed',
|
|
82
|
+
relPath,
|
|
83
|
+
reason: REASON,
|
|
84
|
+
ownershipEvidence: 'present in prior install manifest as a managed GSD runtime file',
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
else if (classification === 'managed-modified') {
|
|
88
|
+
actions.push({
|
|
89
|
+
type: 'backup-and-remove',
|
|
90
|
+
relPath,
|
|
91
|
+
reason: REASON,
|
|
92
|
+
ownershipEvidence: 'managed GSD runtime file, locally modified; backed up before removal',
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else if (classification === 'unknown') {
|
|
96
|
+
actions.push({
|
|
97
|
+
type: 'baseline-preserve-user',
|
|
98
|
+
relPath,
|
|
99
|
+
reason: 'user-added file under legacy runtime dir; preserved per ADR-0008',
|
|
100
|
+
ownershipEvidence: 'file is not present in the prior install manifest; treated as user-owned',
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// 'managed-missing', 'missing', and any other classification: skip (no action)
|
|
104
|
+
}
|
|
105
|
+
return actions;
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
module.exports = migration;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Installer migration 004: remove stale gsd-pristine/get-shit-done/ snapshot // gsd-allow-legacy-name
|
|
4
|
+
* files after the get-shit-done → gsd-core rename (#604, #934). // gsd-allow-legacy-name
|
|
5
|
+
*
|
|
6
|
+
* Background: migration 003 removed legacy runtime files from
|
|
7
|
+
* get-shit-done/ but did not touch gsd-pristine/get-shit-done/, the // gsd-allow-legacy-name
|
|
8
|
+
* parallel directory that holds pristine snapshots captured before the rename.
|
|
9
|
+
* These snapshot files are GSD-managed (written by the installer, never by the
|
|
10
|
+
* user) and reference stale get-shit-done/... key paths that no longer exist // gsd-allow-legacy-name
|
|
11
|
+
* in the active layout. When verify-reapply-patches.cjs looks up a backup entry
|
|
12
|
+
* keyed under gsd-core/... it finds no matching gsd-pristine/ snapshot, falls
|
|
13
|
+
* to over-broad mode, and reports false FAIL_INSTALLED_MISSING / // gsd-allow-legacy-name
|
|
14
|
+
* FAIL_USER_LINES_MISSING for every backed-up pre-rename file (#934).
|
|
15
|
+
*
|
|
16
|
+
* Fix: walk gsd-pristine/get-shit-done/ and emit remove-managed for each file. // gsd-allow-legacy-name
|
|
17
|
+
* These files are always GSD-written snapshots — users never place their own
|
|
18
|
+
* files inside gsd-pristine/ — so the classification override
|
|
19
|
+
* (managed-pristine) is safe: there is no user content to protect.
|
|
20
|
+
*
|
|
21
|
+
* Checksum safety: migration 003's body is left untouched. Adding this
|
|
22
|
+
* separate migration avoids modifying 003's checksum, which would break
|
|
23
|
+
* upgrade state for any user who already applied 003 (root cause of #670).
|
|
24
|
+
*
|
|
25
|
+
* Per-file approach: the migration framework has no recursive directory-removal
|
|
26
|
+
* primitive — all actions operate on individual files. Empty directory shells
|
|
27
|
+
* left after removal can be cleaned up manually; this is the intentional ADR-0008
|
|
28
|
+
* limitation.
|
|
29
|
+
*/
|
|
30
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
31
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
32
|
+
};
|
|
33
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
34
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
35
|
+
function walkPristineFiles(root, relDir, baseResolved, results) {
|
|
36
|
+
const dir = node_path_1.default.join(root, relDir);
|
|
37
|
+
let entries;
|
|
38
|
+
try {
|
|
39
|
+
entries = node_fs_1.default.readdirSync(dir, { withFileTypes: true });
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return; // directory absent or unreadable — nothing to do
|
|
43
|
+
}
|
|
44
|
+
for (const entry of entries) {
|
|
45
|
+
// Do not follow symlinks — skip to avoid out-of-tree traversal.
|
|
46
|
+
if (entry.isSymbolicLink())
|
|
47
|
+
continue;
|
|
48
|
+
const relPath = node_path_1.default.posix.join(relDir, entry.name);
|
|
49
|
+
// Bounds check: ensure the resolved path stays under configDir.
|
|
50
|
+
const resolved = node_path_1.default.resolve(root, relPath);
|
|
51
|
+
if (resolved !== baseResolved && !resolved.startsWith(baseResolved + node_path_1.default.sep))
|
|
52
|
+
continue;
|
|
53
|
+
if (entry.isDirectory()) {
|
|
54
|
+
walkPristineFiles(root, relPath, baseResolved, results);
|
|
55
|
+
}
|
|
56
|
+
else if (entry.isFile()) {
|
|
57
|
+
results.push(relPath);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const REASON = 'stale pristine snapshot from legacy get-shit-done/ dir, orphaned by rename migration 003 (#604, #934)'; // gsd-allow-legacy-name
|
|
62
|
+
const migration = {
|
|
63
|
+
id: '2026-06-09-prune-stale-pristine-get-shit-done', // gsd-allow-legacy-name
|
|
64
|
+
title: 'Remove stale gsd-pristine/get-shit-done/ snapshot files (#934)', // gsd-allow-legacy-name
|
|
65
|
+
description: 'Migration 003 removed runtime files from get-shit-done/ but left the matching pristine snapshot ' + // gsd-allow-legacy-name
|
|
66
|
+
'directory gsd-pristine/get-shit-done/ intact. Those snapshots reference stale key paths and cause ' + // gsd-allow-legacy-name
|
|
67
|
+
'verify-reapply-patches false positives (#934). Remove all files under gsd-pristine/get-shit-done/ ' + // gsd-allow-legacy-name
|
|
68
|
+
'as they are GSD-managed snapshots, never user content.',
|
|
69
|
+
introducedIn: '1.4.3',
|
|
70
|
+
scopes: ['global', 'local'],
|
|
71
|
+
destructive: true,
|
|
72
|
+
plan(ctx) {
|
|
73
|
+
const pristineGsdRoot = node_path_1.default.join(ctx.configDir, 'gsd-pristine', 'get-shit-done'); // gsd-allow-legacy-name
|
|
74
|
+
// Idempotency: if the stale pristine subdir doesn't exist, nothing to do.
|
|
75
|
+
if (!node_fs_1.default.existsSync(pristineGsdRoot))
|
|
76
|
+
return [];
|
|
77
|
+
// Safety: reject symlinks in ANY ancestor component of the path we will walk
|
|
78
|
+
// to prevent following a symlink out of configDir. Check both gsd-pristine/
|
|
79
|
+
// and gsd-pristine/get-shit-done/ — either being a symlink could redirect // gsd-allow-legacy-name
|
|
80
|
+
// the walk to an out-of-tree location.
|
|
81
|
+
const pristineParent = node_path_1.default.join(ctx.configDir, 'gsd-pristine');
|
|
82
|
+
try {
|
|
83
|
+
if (node_fs_1.default.lstatSync(pristineParent).isSymbolicLink())
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
if (node_fs_1.default.lstatSync(pristineGsdRoot).isSymbolicLink())
|
|
91
|
+
return []; // gsd-allow-legacy-name
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
const baseResolved = node_path_1.default.resolve(ctx.configDir);
|
|
97
|
+
const relPaths = [];
|
|
98
|
+
walkPristineFiles(ctx.configDir, node_path_1.default.posix.join('gsd-pristine', 'get-shit-done'), baseResolved, relPaths); // gsd-allow-legacy-name
|
|
99
|
+
const actions = [];
|
|
100
|
+
for (const relPath of relPaths) {
|
|
101
|
+
// Bounds-check each relPath before emitting any action.
|
|
102
|
+
const resolved = node_path_1.default.resolve(ctx.configDir, relPath);
|
|
103
|
+
if (resolved !== baseResolved && !resolved.startsWith(baseResolved + node_path_1.default.sep))
|
|
104
|
+
continue;
|
|
105
|
+
// These files are GSD-managed pristine snapshots — the installer writes
|
|
106
|
+
// them during install/upgrade; users never place personal files inside
|
|
107
|
+
// gsd-pristine/. Pass classification: 'managed-pristine' explicitly so
|
|
108
|
+
// the framework does not downgrade remove-managed to preserve-user when
|
|
109
|
+
// the manifest has no entry (these paths were never in the manifest since
|
|
110
|
+
// they live under gsd-pristine/, not the tracked runtime dir).
|
|
111
|
+
actions.push({
|
|
112
|
+
type: 'remove-managed',
|
|
113
|
+
relPath,
|
|
114
|
+
reason: REASON,
|
|
115
|
+
ownershipEvidence: 'GSD-written pristine snapshot under gsd-pristine/get-shit-done/; ' + // gsd-allow-legacy-name
|
|
116
|
+
'installer is the sole author of gsd-pristine/ contents; no user content lives here',
|
|
117
|
+
classification: 'managed-pristine',
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return actions;
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
module.exports = migration;
|