@opengsd/gsd-core 1.2.0 → 1.3.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/README.ja-JP.md +46 -791
- package/README.ko-KR.md +44 -780
- package/README.md +42 -218
- package/README.pt-BR.md +47 -414
- package/README.zh-CN.md +46 -763
- package/agents/gsd-ai-researcher.md +2 -2
- package/agents/gsd-debug-session-manager.md +1 -1
- package/agents/gsd-debugger.md +8 -8
- package/agents/gsd-doc-writer.md +7 -6
- package/agents/gsd-domain-researcher.md +15 -2
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-eval-planner.md +2 -2
- package/agents/gsd-executor.md +21 -8
- package/agents/gsd-framework-selector.md +1 -1
- package/agents/gsd-intel-updater.md +4 -4
- package/agents/gsd-phase-researcher.md +19 -6
- package/agents/gsd-plan-checker.md +3 -3
- package/agents/gsd-planner.md +36 -23
- package/agents/gsd-project-researcher.md +13 -0
- package/agents/gsd-research-synthesizer.md +6 -2
- package/agents/gsd-roadmapper.md +6 -6
- package/agents/gsd-ui-researcher.md +16 -3
- package/agents/gsd-user-profiler.md +2 -2
- package/agents/gsd-verifier.md +8 -8
- 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 +255 -103
- package/commands/gsd/add-tests.md +1 -1
- package/commands/gsd/ai-integration-phase.md +3 -3
- package/commands/gsd/audit-fix.md +1 -1
- package/commands/gsd/audit-milestone.md +1 -1
- package/commands/gsd/audit-uat.md +1 -1
- package/commands/gsd/autonomous.md +2 -2
- package/commands/gsd/capture.md +6 -6
- package/commands/gsd/cleanup.md +1 -1
- package/commands/gsd/code-review.md +1 -1
- package/commands/gsd/complete-milestone.md +2 -2
- package/commands/gsd/config.md +3 -3
- package/commands/gsd/debug.md +1 -1
- package/commands/gsd/discuss-phase.md +5 -4
- package/commands/gsd/docs-update.md +1 -1
- package/commands/gsd/eval-review.md +2 -2
- package/commands/gsd/execute-phase.md +2 -2
- package/commands/gsd/explore.md +1 -1
- package/commands/gsd/extract-learnings.md +2 -2
- package/commands/gsd/fast.md +1 -1
- package/commands/gsd/forensics.md +1 -1
- package/commands/gsd/graphify.md +9 -9
- package/commands/gsd/health.md +1 -1
- package/commands/gsd/help.md +2 -2
- package/commands/gsd/import.md +5 -5
- package/commands/gsd/inbox.md +1 -1
- package/commands/gsd/ingest-docs.md +4 -4
- package/commands/gsd/manager.md +3 -3
- package/commands/gsd/map-codebase.md +1 -1
- package/commands/gsd/milestone-summary.md +1 -1
- package/commands/gsd/mvp-phase.md +4 -4
- package/commands/gsd/new-milestone.md +5 -5
- package/commands/gsd/new-project.md +5 -5
- package/commands/gsd/pause-work.md +2 -2
- package/commands/gsd/phase.md +4 -4
- package/commands/gsd/plan-phase.md +2 -2
- package/commands/gsd/plan-review-convergence.md +4 -4
- package/commands/gsd/pr-branch.md +1 -1
- package/commands/gsd/profile-user.md +2 -2
- package/commands/gsd/progress.md +4 -4
- package/commands/gsd/quick.md +1 -1
- package/commands/gsd/resume-work.md +1 -1
- package/commands/gsd/review.md +3 -2
- package/commands/gsd/secure-phase.md +1 -1
- package/commands/gsd/settings.md +1 -1
- package/commands/gsd/ship.md +2 -2
- package/commands/gsd/sketch.md +7 -7
- package/commands/gsd/spec-phase.md +2 -2
- package/commands/gsd/spike.md +3 -3
- package/commands/gsd/stats.md +1 -1
- package/commands/gsd/surface.md +4 -4
- package/commands/gsd/thread.md +1 -1
- package/commands/gsd/ui-phase.md +2 -2
- package/commands/gsd/ui-review.md +2 -2
- package/commands/gsd/ultraplan-phase.md +2 -2
- package/commands/gsd/undo.md +3 -3
- package/commands/gsd/update.md +3 -3
- package/commands/gsd/validate-phase.md +1 -1
- package/commands/gsd/verify-work.md +2 -2
- package/commands/gsd/workspace.md +4 -4
- package/{get-shit-done → gsd-core}/bin/check-latest-version.cjs +1 -1
- package/{get-shit-done → gsd-core}/bin/gsd-tools.cjs +50 -4
- package/gsd-core/bin/lib/active-workstream-store.cjs +291 -0
- package/gsd-core/bin/lib/adr-parser.cjs +399 -0
- package/gsd-core/bin/lib/agent-command-router.cjs +68 -0
- package/gsd-core/bin/lib/artifacts.cjs +51 -0
- package/gsd-core/bin/lib/audit.cjs +743 -0
- package/gsd-core/bin/lib/check-command-router.cjs +342 -0
- package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
- package/gsd-core/bin/lib/clock.cjs +95 -0
- package/gsd-core/bin/lib/clusters.cjs +128 -0
- package/gsd-core/bin/lib/code-review-flags.cjs +59 -0
- package/gsd-core/bin/lib/command-aliases.cjs +809 -0
- package/gsd-core/bin/lib/command-arg-projection.cjs +55 -0
- package/gsd-core/bin/lib/command-routing-hub.cjs +300 -0
- package/gsd-core/bin/lib/commands.cjs +1202 -0
- package/gsd-core/bin/lib/config-schema.cjs +29 -0
- package/gsd-core/bin/lib/config-types.cjs +19 -0
- package/gsd-core/bin/lib/config.cjs +714 -0
- package/{get-shit-done → gsd-core}/bin/lib/configuration.cjs +76 -85
- package/gsd-core/bin/lib/context-utilization.cjs +48 -0
- package/gsd-core/bin/lib/core.cjs +2007 -0
- package/{get-shit-done → gsd-core}/bin/lib/decisions.cjs +9 -7
- package/gsd-core/bin/lib/docs.cjs +252 -0
- package/gsd-core/bin/lib/drift.cjs +364 -0
- package/gsd-core/bin/lib/fallow-runner.cjs +115 -0
- package/gsd-core/bin/lib/frontmatter.cjs +442 -0
- package/gsd-core/bin/lib/gap-checker.cjs +257 -0
- package/gsd-core/bin/lib/graphify.cjs +496 -0
- package/gsd-core/bin/lib/gsd2-import.cjs +456 -0
- package/gsd-core/bin/lib/init-command-router.cjs +62 -0
- package/gsd-core/bin/lib/init.cjs +1799 -0
- package/gsd-core/bin/lib/install-profiles.cjs +526 -0
- package/gsd-core/bin/lib/installer-migration-authoring.cjs +122 -0
- package/gsd-core/bin/lib/installer-migration-report.cjs +347 -0
- package/gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +218 -0
- package/gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
- package/gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
- package/gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +784 -0
- package/gsd-core/bin/lib/intel.cjs +607 -0
- package/gsd-core/bin/lib/learnings.cjs +270 -0
- package/gsd-core/bin/lib/legacy-cleanup.cjs +253 -0
- package/gsd-core/bin/lib/milestone.cjs +373 -0
- package/gsd-core/bin/lib/model-catalog.cjs +154 -0
- package/gsd-core/bin/lib/model-profiles.cjs +24 -0
- package/gsd-core/bin/lib/observability/event.cjs +51 -0
- package/gsd-core/bin/lib/observability/logger.cjs +146 -0
- package/{get-shit-done → gsd-core}/bin/lib/observability/redaction.cjs +19 -21
- package/{get-shit-done → gsd-core}/bin/lib/package-identity.cjs +5 -1
- package/gsd-core/bin/lib/phase-command-router.cjs +189 -0
- package/gsd-core/bin/lib/phase-lifecycle.cjs +74 -0
- package/gsd-core/bin/lib/phase.cjs +1307 -0
- package/gsd-core/bin/lib/phases-command-router.cjs +43 -0
- package/{get-shit-done → gsd-core}/bin/lib/plan-scan.cjs +18 -24
- package/gsd-core/bin/lib/planning-workspace.cjs +245 -0
- package/gsd-core/bin/lib/profile-output.cjs +1120 -0
- package/gsd-core/bin/lib/profile-pipeline.cjs +517 -0
- package/gsd-core/bin/lib/project-root.cjs +119 -0
- package/gsd-core/bin/lib/prompt-budget.cjs +305 -0
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +121 -0
- package/gsd-core/bin/lib/roadmap-command-router.cjs +166 -0
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +491 -0
- package/gsd-core/bin/lib/roadmap.cjs +600 -0
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +254 -0
- package/gsd-core/bin/lib/runtime-homes.cjs +169 -0
- package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
- package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
- package/{get-shit-done → gsd-core}/bin/lib/schema-detect.cjs +20 -26
- package/gsd-core/bin/lib/secrets.cjs +34 -0
- package/gsd-core/bin/lib/security.cjs +407 -0
- package/gsd-core/bin/lib/semver-compare.cjs +42 -0
- package/gsd-core/bin/lib/shell-command-projection.cjs +524 -0
- package/gsd-core/bin/lib/state-command-router.cjs +160 -0
- package/{get-shit-done → gsd-core}/bin/lib/state-document.cjs +78 -82
- package/gsd-core/bin/lib/state.cjs +2010 -0
- package/gsd-core/bin/lib/surface.cjs +406 -0
- package/gsd-core/bin/lib/task-command-router.cjs +85 -0
- package/gsd-core/bin/lib/template.cjs +237 -0
- package/gsd-core/bin/lib/uat.cjs +297 -0
- package/gsd-core/bin/lib/ui-safety-gate.cjs +98 -0
- package/gsd-core/bin/lib/update-context.cjs +218 -0
- package/gsd-core/bin/lib/validate-command-router.cjs +91 -0
- package/gsd-core/bin/lib/validate.cjs +112 -0
- package/gsd-core/bin/lib/verify-command-router.cjs +44 -0
- package/gsd-core/bin/lib/verify.cjs +1451 -0
- package/{get-shit-done → gsd-core}/bin/lib/workstream-inventory-builder.cjs +19 -12
- package/gsd-core/bin/lib/workstream-inventory.cjs +147 -0
- package/{get-shit-done → gsd-core}/bin/lib/workstream-name-policy.cjs +28 -31
- package/gsd-core/bin/lib/workstream.cjs +380 -0
- package/gsd-core/bin/lib/worktree-safety.cjs +912 -0
- package/{get-shit-done → gsd-core}/bin/shared/config-defaults.manifest.json +1 -0
- package/{get-shit-done → gsd-core}/bin/shared/config-schema.manifest.json +17 -1
- package/{get-shit-done → gsd-core}/bin/shared/model-catalog.json +27 -0
- package/{get-shit-done → gsd-core}/references/artifact-types.md +1 -1
- package/{get-shit-done → gsd-core}/references/checkpoints.md +1 -1
- package/{get-shit-done → gsd-core}/references/few-shot-examples/plan-checker.md +2 -2
- package/{get-shit-done → gsd-core}/references/few-shot-examples/verifier.md +12 -12
- package/{get-shit-done → gsd-core}/references/model-profile-resolution.md +1 -1
- package/{get-shit-done → gsd-core}/references/mvp-concepts.md +1 -1
- package/{get-shit-done → gsd-core}/references/planner-graphify-auto-update.md +2 -2
- package/{get-shit-done → gsd-core}/references/planner-human-verify-mode.md +1 -1
- package/{get-shit-done → gsd-core}/references/planner-mvp-mode.md +1 -1
- package/{get-shit-done → gsd-core}/references/ui-brand.md +4 -2
- package/{get-shit-done → gsd-core}/references/verification-patterns.md +1 -1
- package/gsd-core/references/worktree-branch-check.md +38 -0
- package/{get-shit-done → gsd-core}/references/worktree-path-safety.md +4 -26
- package/{get-shit-done → gsd-core}/templates/README.md +2 -2
- package/{get-shit-done → gsd-core}/templates/codebase/structure.md +10 -10
- package/{get-shit-done → gsd-core}/templates/copilot-instructions.md +1 -1
- package/{get-shit-done → gsd-core}/templates/phase-prompt.md +10 -10
- package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -0
- package/{get-shit-done → gsd-core}/workflows/add-backlog.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/add-phase.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/add-tests.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/add-todo.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/ai-integration-phase.md +4 -4
- package/{get-shit-done → gsd-core}/workflows/audit-fix.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/audit-milestone.md +3 -1
- package/{get-shit-done → gsd-core}/workflows/audit-uat.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/autonomous.md +10 -8
- package/{get-shit-done → gsd-core}/workflows/check-todos.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/cleanup.md +44 -4
- package/{get-shit-done → gsd-core}/workflows/code-review-fix.md +4 -4
- package/{get-shit-done → gsd-core}/workflows/code-review.md +6 -4
- package/{get-shit-done → gsd-core}/workflows/complete-milestone.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/debug.md +7 -2
- package/{get-shit-done → gsd-core}/workflows/diagnose-issues.md +6 -2
- package/{get-shit-done → gsd-core}/workflows/discovery-phase.md +5 -5
- package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/advisor.md +5 -5
- package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/auto.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/chain.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/power.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/discuss-phase-assumptions.md +4 -4
- package/{get-shit-done → gsd-core}/workflows/discuss-phase.md +6 -6
- package/{get-shit-done → gsd-core}/workflows/do.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/docs-update.md +19 -5
- package/{get-shit-done → gsd-core}/workflows/edit-phase.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/eval-review.md +3 -3
- package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/codebase-drift-gate.md +16 -3
- package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/post-merge-gate.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/execute-phase.md +89 -57
- package/{get-shit-done → gsd-core}/workflows/execute-plan.md +8 -8
- package/{get-shit-done → gsd-core}/workflows/explore.md +5 -3
- package/{get-shit-done → gsd-core}/workflows/extract-learnings.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/forensics.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/graduation.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/health.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/help/modes/default.md +3 -3
- package/{get-shit-done → gsd-core}/workflows/help/modes/full.md +6 -6
- package/{get-shit-done → gsd-core}/workflows/import.md +3 -1
- package/{get-shit-done → gsd-core}/workflows/ingest-docs.md +5 -5
- package/{get-shit-done → gsd-core}/workflows/insert-phase.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/list-workspaces.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/manager.md +3 -3
- package/{get-shit-done → gsd-core}/workflows/map-codebase.md +3 -1
- package/{get-shit-done → gsd-core}/workflows/milestone-summary.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/mvp-phase.md +7 -7
- package/{get-shit-done → gsd-core}/workflows/new-milestone.md +5 -5
- package/{get-shit-done → gsd-core}/workflows/new-project.md +8 -8
- package/{get-shit-done → gsd-core}/workflows/new-workspace.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/next.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/pause-work.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/plan-milestone-gaps.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/plan-phase.md +29 -28
- package/{get-shit-done → gsd-core}/workflows/plan-review-convergence.md +10 -10
- package/{get-shit-done → gsd-core}/workflows/plant-seed.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/profile-user.md +11 -11
- package/{get-shit-done → gsd-core}/workflows/progress.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/quick.md +7 -29
- package/{get-shit-done → gsd-core}/workflows/reapply-patches.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/remove-phase.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/remove-workspace.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/resume-project.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/review.md +110 -2
- package/{get-shit-done → gsd-core}/workflows/scan.md +3 -1
- package/{get-shit-done → gsd-core}/workflows/secure-phase.md +5 -3
- package/{get-shit-done → gsd-core}/workflows/settings-advanced.md +196 -6
- package/{get-shit-done → gsd-core}/workflows/settings-integrations.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/settings.md +16 -2
- package/{get-shit-done → gsd-core}/workflows/ship.md +56 -4
- package/{get-shit-done → gsd-core}/workflows/sketch-wrap-up.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/sketch.md +5 -5
- package/{get-shit-done → gsd-core}/workflows/spec-phase.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/spike-wrap-up.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/spike.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/stats.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/sync-skills.md +3 -3
- package/{get-shit-done → gsd-core}/workflows/thread.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/transition.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/ui-phase.md +5 -5
- package/{get-shit-done → gsd-core}/workflows/ui-review.md +3 -3
- package/{get-shit-done → gsd-core}/workflows/ultraplan-phase.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/undo.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/update.md +41 -16
- package/{get-shit-done → gsd-core}/workflows/validate-phase.md +5 -3
- package/{get-shit-done → gsd-core}/workflows/verify-phase.md +4 -4
- package/{get-shit-done → gsd-core}/workflows/verify-work.md +7 -7
- package/hooks/dist/gsd-check-update-worker.js +16 -3
- package/hooks/dist/gsd-check-update.js +7 -5
- package/hooks/dist/gsd-context-monitor.js +2 -2
- package/hooks/dist/gsd-statusline.js +39 -21
- package/hooks/dist/gsd-update-banner.js +6 -2
- package/hooks/dist/gsd-worktree-path-guard.js +169 -0
- package/hooks/dist/managed-hooks-registry.cjs +35 -0
- package/hooks/gsd-check-update-worker.js +16 -3
- package/hooks/gsd-check-update.js +7 -5
- package/hooks/gsd-context-monitor.js +2 -2
- package/hooks/gsd-statusline.js +39 -21
- package/hooks/gsd-update-banner.js +6 -2
- package/hooks/gsd-worktree-path-guard.js +169 -0
- package/hooks/managed-hooks-registry.cjs +1 -0
- package/package.json +17 -11
- package/scripts/affected-tests-lib.cjs +1 -1
- package/scripts/base64-scan.sh +12 -0
- package/scripts/build-hooks.js +5 -1
- package/scripts/changeset/cli.cjs +2 -2
- package/scripts/changeset/github-release-notes.cjs +1 -1
- package/scripts/changeset/lint.cjs +1 -1
- package/scripts/check-alias-drift.cjs +8 -8
- package/scripts/check-env.cjs +5 -1
- package/scripts/ci-test-scope.cjs +34 -9
- package/scripts/command-contract-helpers.cjs +1 -1
- package/scripts/fix-slash-commands.cjs +5 -5
- package/scripts/gen-inventory-manifest.cjs +3 -3
- package/scripts/generate-package-identity.cjs +28 -7
- package/scripts/lib/allowlist-ratchet.cjs +136 -0
- package/scripts/lint-command-contract.cjs +1 -1
- package/scripts/lint-legacy-dir-name.cjs +156 -0
- package/scripts/lint-package-identity-drift.cjs +8 -8
- package/scripts/lint-pr-check-project-dir.cjs +0 -1
- package/scripts/lint-shell-command-projection-drift.cjs +1 -1
- package/scripts/lint-skill-deps.cjs +1 -1
- package/scripts/lint-test-file-count.allowlist.json +129 -32
- package/scripts/lint-test-file-count.cjs +85 -30
- package/scripts/mutation-matrix.cjs +219 -0
- package/scripts/prompt-injection-scan.sh +5 -1
- package/scripts/release-notes/format-github-release-notes.cjs +256 -0
- package/scripts/release-tarball-smoke.cjs +9 -9
- package/scripts/run-tests.cjs +34 -2
- package/scripts/strip-prose-atrefs.cjs +2 -2
- package/scripts/sync-runtime-launcher.cjs +2 -2
- package/scripts/verify-npm-publish.cjs +252 -0
- package/get-shit-done/bin/lib/active-workstream-store.cjs +0 -302
- package/get-shit-done/bin/lib/adr-parser.cjs +0 -394
- package/get-shit-done/bin/lib/agent-command-router.cjs +0 -65
- package/get-shit-done/bin/lib/artifacts.cjs +0 -53
- package/get-shit-done/bin/lib/audit.cjs +0 -755
- package/get-shit-done/bin/lib/check-command-router.cjs +0 -333
- package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +0 -118
- package/get-shit-done/bin/lib/clock.cjs +0 -96
- package/get-shit-done/bin/lib/clusters.cjs +0 -135
- package/get-shit-done/bin/lib/code-review-flags.cjs +0 -74
- package/get-shit-done/bin/lib/command-aliases.cjs +0 -815
- package/get-shit-done/bin/lib/command-arg-projection.cjs +0 -62
- package/get-shit-done/bin/lib/command-routing-hub.cjs +0 -388
- package/get-shit-done/bin/lib/commands.cjs +0 -1188
- package/get-shit-done/bin/lib/config-schema.cjs +0 -31
- package/get-shit-done/bin/lib/config.cjs +0 -728
- package/get-shit-done/bin/lib/context-utilization.cjs +0 -47
- package/get-shit-done/bin/lib/core.cjs +0 -2121
- package/get-shit-done/bin/lib/docs.cjs +0 -270
- package/get-shit-done/bin/lib/drift.cjs +0 -388
- package/get-shit-done/bin/lib/fallow-runner.cjs +0 -109
- package/get-shit-done/bin/lib/frontmatter.cjs +0 -389
- package/get-shit-done/bin/lib/gap-checker.cjs +0 -205
- package/get-shit-done/bin/lib/graphify.cjs +0 -592
- package/get-shit-done/bin/lib/gsd2-import.cjs +0 -514
- package/get-shit-done/bin/lib/init-command-router.cjs +0 -58
- package/get-shit-done/bin/lib/init.cjs +0 -2112
- package/get-shit-done/bin/lib/install-profiles.cjs +0 -603
- package/get-shit-done/bin/lib/installer-migration-authoring.cjs +0 -117
- package/get-shit-done/bin/lib/installer-migration-report.cjs +0 -354
- package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +0 -220
- package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +0 -41
- package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +0 -80
- package/get-shit-done/bin/lib/installer-migrations.cjs +0 -778
- package/get-shit-done/bin/lib/intel.cjs +0 -708
- package/get-shit-done/bin/lib/learnings.cjs +0 -421
- package/get-shit-done/bin/lib/milestone.cjs +0 -314
- package/get-shit-done/bin/lib/model-catalog.cjs +0 -212
- package/get-shit-done/bin/lib/model-profiles.cjs +0 -31
- package/get-shit-done/bin/lib/observability/event.cjs +0 -82
- package/get-shit-done/bin/lib/observability/logger.cjs +0 -174
- package/get-shit-done/bin/lib/phase-command-router.cjs +0 -191
- package/get-shit-done/bin/lib/phase-lifecycle.cjs +0 -80
- package/get-shit-done/bin/lib/phase.cjs +0 -1607
- package/get-shit-done/bin/lib/phases-command-router.cjs +0 -39
- package/get-shit-done/bin/lib/planning-workspace.cjs +0 -238
- package/get-shit-done/bin/lib/profile-output.cjs +0 -1141
- package/get-shit-done/bin/lib/profile-pipeline.cjs +0 -539
- package/get-shit-done/bin/lib/project-root.cjs +0 -112
- package/get-shit-done/bin/lib/prompt-budget.cjs +0 -399
- package/get-shit-done/bin/lib/review-reviewer-selection.cjs +0 -125
- package/get-shit-done/bin/lib/roadmap-command-router.cjs +0 -28
- package/get-shit-done/bin/lib/roadmap.cjs +0 -650
- package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +0 -301
- package/get-shit-done/bin/lib/runtime-homes.cjs +0 -222
- package/get-shit-done/bin/lib/runtime-name-policy.cjs +0 -83
- package/get-shit-done/bin/lib/runtime-slash.cjs +0 -112
- package/get-shit-done/bin/lib/secrets.cjs +0 -32
- package/get-shit-done/bin/lib/security.cjs +0 -600
- package/get-shit-done/bin/lib/semver-compare.cjs +0 -35
- package/get-shit-done/bin/lib/shell-command-projection.cjs +0 -500
- package/get-shit-done/bin/lib/state-command-router.cjs +0 -252
- package/get-shit-done/bin/lib/state.cjs +0 -2038
- package/get-shit-done/bin/lib/surface.cjs +0 -470
- package/get-shit-done/bin/lib/task-command-router.cjs +0 -81
- package/get-shit-done/bin/lib/template.cjs +0 -228
- package/get-shit-done/bin/lib/uat.cjs +0 -289
- package/get-shit-done/bin/lib/update-context.cjs +0 -209
- package/get-shit-done/bin/lib/validate-command-router.cjs +0 -83
- package/get-shit-done/bin/lib/validate.cjs +0 -92
- package/get-shit-done/bin/lib/verify-command-router.cjs +0 -40
- package/get-shit-done/bin/lib/verify.cjs +0 -1511
- package/get-shit-done/bin/lib/workstream-inventory.cjs +0 -146
- package/get-shit-done/bin/lib/workstream.cjs +0 -389
- package/get-shit-done/bin/lib/worktree-safety.cjs +0 -985
- package/get-shit-done/workflows/_runtime-launcher.snippet.sh +0 -1
- package/scripts/lint-no-source-grep-extras.cjs +0 -81
- package/scripts/lint-no-source-grep.cjs +0 -174
- package/scripts/lint-shared-module-handsync.cjs +0 -388
- package/scripts/shared-module-handsync-allowlist.json +0 -183
- /package/{get-shit-done → gsd-core}/bin/shared/runtime-aliases.manifest.json +0 -0
- /package/{get-shit-done → gsd-core}/bin/verify-reapply-patches.cjs +0 -0
- /package/{get-shit-done → gsd-core}/contexts/dev.md +0 -0
- /package/{get-shit-done → gsd-core}/contexts/research.md +0 -0
- /package/{get-shit-done → gsd-core}/contexts/review.md +0 -0
- /package/{get-shit-done → gsd-core}/references/agent-contracts.md +0 -0
- /package/{get-shit-done → gsd-core}/references/ai-evals.md +0 -0
- /package/{get-shit-done → gsd-core}/references/ai-frameworks.md +0 -0
- /package/{get-shit-done → gsd-core}/references/autonomous-smart-discuss.md +0 -0
- /package/{get-shit-done → gsd-core}/references/common-bug-patterns.md +0 -0
- /package/{get-shit-done → gsd-core}/references/context-budget.md +0 -0
- /package/{get-shit-done → gsd-core}/references/continuation-format.md +0 -0
- /package/{get-shit-done → gsd-core}/references/debugger-philosophy.md +0 -0
- /package/{get-shit-done → gsd-core}/references/decimal-phase-calculation.md +0 -0
- /package/{get-shit-done → gsd-core}/references/doc-conflict-engine.md +0 -0
- /package/{get-shit-done → gsd-core}/references/domain-probes.md +0 -0
- /package/{get-shit-done → gsd-core}/references/execute-mvp-tdd.md +0 -0
- /package/{get-shit-done → gsd-core}/references/executor-examples.md +0 -0
- /package/{get-shit-done → gsd-core}/references/gate-prompts.md +0 -0
- /package/{get-shit-done → gsd-core}/references/gates.md +0 -0
- /package/{get-shit-done → gsd-core}/references/git-integration.md +0 -0
- /package/{get-shit-done → gsd-core}/references/git-planning-commit.md +0 -0
- /package/{get-shit-done → gsd-core}/references/ios-scaffold.md +0 -0
- /package/{get-shit-done → gsd-core}/references/mandatory-initial-read.md +0 -0
- /package/{get-shit-done → gsd-core}/references/model-profiles.md +0 -0
- /package/{get-shit-done → gsd-core}/references/phase-argument-parsing.md +0 -0
- /package/{get-shit-done → gsd-core}/references/planner-antipatterns.md +0 -0
- /package/{get-shit-done → gsd-core}/references/planner-chunked.md +0 -0
- /package/{get-shit-done → gsd-core}/references/planner-gap-closure.md +0 -0
- /package/{get-shit-done → gsd-core}/references/planner-interface-context.md +0 -0
- /package/{get-shit-done → gsd-core}/references/planner-reviews.md +0 -0
- /package/{get-shit-done → gsd-core}/references/planner-revision.md +0 -0
- /package/{get-shit-done → gsd-core}/references/planner-source-audit.md +0 -0
- /package/{get-shit-done → gsd-core}/references/planning-config.md +0 -0
- /package/{get-shit-done → gsd-core}/references/project-skills-discovery.md +0 -0
- /package/{get-shit-done → gsd-core}/references/questioning.md +0 -0
- /package/{get-shit-done → gsd-core}/references/revision-loop.md +0 -0
- /package/{get-shit-done → gsd-core}/references/scout-codebase.md +0 -0
- /package/{get-shit-done → gsd-core}/references/skeleton-template.md +0 -0
- /package/{get-shit-done → gsd-core}/references/sketch-interactivity.md +0 -0
- /package/{get-shit-done → gsd-core}/references/sketch-theme-system.md +0 -0
- /package/{get-shit-done → gsd-core}/references/sketch-tooling.md +0 -0
- /package/{get-shit-done → gsd-core}/references/sketch-variant-patterns.md +0 -0
- /package/{get-shit-done → gsd-core}/references/spidr-splitting.md +0 -0
- /package/{get-shit-done → gsd-core}/references/tdd.md +0 -0
- /package/{get-shit-done → gsd-core}/references/thinking-models-debug.md +0 -0
- /package/{get-shit-done → gsd-core}/references/thinking-models-execution.md +0 -0
- /package/{get-shit-done → gsd-core}/references/thinking-models-planning.md +0 -0
- /package/{get-shit-done → gsd-core}/references/thinking-models-research.md +0 -0
- /package/{get-shit-done → gsd-core}/references/thinking-models-verification.md +0 -0
- /package/{get-shit-done → gsd-core}/references/thinking-partner.md +0 -0
- /package/{get-shit-done → gsd-core}/references/universal-anti-patterns.md +0 -0
- /package/{get-shit-done → gsd-core}/references/user-profiling.md +0 -0
- /package/{get-shit-done → gsd-core}/references/user-story-template.md +0 -0
- /package/{get-shit-done → gsd-core}/references/verification-overrides.md +0 -0
- /package/{get-shit-done → gsd-core}/references/verify-mvp-mode.md +0 -0
- /package/{get-shit-done → gsd-core}/references/workstream-flag.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/AI-SPEC.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/DEBUG.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/SECURITY.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/UAT.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/UI-SPEC.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/VALIDATION.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/claude-md.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/codebase/architecture.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/codebase/concerns.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/codebase/conventions.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/codebase/integrations.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/codebase/stack.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/codebase/testing.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/config.json +0 -0
- /package/{get-shit-done → gsd-core}/templates/context.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/continue-here.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/debug-subagent-prompt.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/dev-preferences.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/discovery.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/discussion-log.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/milestone-archive.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/milestone.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/planner-subagent-prompt.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/project.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/requirements.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/research-project/ARCHITECTURE.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/research-project/FEATURES.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/research-project/PITFALLS.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/research-project/STACK.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/research-project/SUMMARY.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/research.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/retrospective.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/roadmap.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/spec.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/state.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/summary-complex.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/summary-minimal.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/summary-standard.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/summary.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/user-profile.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/user-setup.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/verification-report.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/analyze-dependencies.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/all.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/analyze.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/batch.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/default.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/text.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/checkpoint.json +0 -0
- /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/context.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/discussion-log.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/discuss-phase-power.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/per-plan-worktree-gate.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/fast.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/help/modes/brief.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/help/modes/topic.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/help.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/inbox.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/list-phase-assumptions.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/node-repair.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/note.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/pr-branch.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/session-report.md +0 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file allowlist-ratchet.cjs
|
|
5
|
+
*
|
|
6
|
+
* Reusable "better than a count ratchet" primitives for CI guards.
|
|
7
|
+
*
|
|
8
|
+
* ## Motivation (issue #597)
|
|
9
|
+
*
|
|
10
|
+
* A count ratchet (`assert(offenders.length <= N)`) has a masking blind spot:
|
|
11
|
+
* fixing one offender and introducing a new one keeps the count constant, so a
|
|
12
|
+
* novel defect slips through green. These helpers enforce on IDENTITY instead,
|
|
13
|
+
* making every individual offender visible and requiring monotonic progress
|
|
14
|
+
* toward zero.
|
|
15
|
+
*
|
|
16
|
+
* ## Design
|
|
17
|
+
*
|
|
18
|
+
* Both functions are pure (no I/O, no global state). The `fail` callback is
|
|
19
|
+
* injected by the caller so the same logic can be used with `node:assert.fail`,
|
|
20
|
+
* a custom throw, or a message-collector in unit tests.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Assert that `current` offenders are all within the known allowlist, and that
|
|
25
|
+
* every entry in the allowlist still offends (forcing the allowlist to shrink
|
|
26
|
+
* as defects are fixed).
|
|
27
|
+
*
|
|
28
|
+
* Fails when:
|
|
29
|
+
* - Any id in `current` is NOT in `known` → novel offender introduced.
|
|
30
|
+
* - Any id in `known` is NOT in `current` → stale allowlist entry must be
|
|
31
|
+
* pruned so the guard ratchets toward zero (the ratchet-DOWN direction).
|
|
32
|
+
*
|
|
33
|
+
* ## Masking blind spot this prevents (issue #597)
|
|
34
|
+
*
|
|
35
|
+
* A count ratchet (`assert(count <= N)`) allows one offender to be silently
|
|
36
|
+
* replaced by another while the count stays at N. By asserting on identity
|
|
37
|
+
* instead, every new offender is caught by name, and every fixed offender
|
|
38
|
+
* forces the allowlist to shrink.
|
|
39
|
+
*
|
|
40
|
+
* @param {object} opts
|
|
41
|
+
* @param {string} opts.label - Human-readable name for the guard (used
|
|
42
|
+
* in failure messages).
|
|
43
|
+
* @param {Iterable<string>} opts.current - The offending ids found in the
|
|
44
|
+
* current run.
|
|
45
|
+
* @param {Iterable<string>} opts.known - The allowlisted ids (baseline).
|
|
46
|
+
* @param {function(string): void} opts.fail - Callback invoked with a
|
|
47
|
+
* descriptive message on any violation.
|
|
48
|
+
* Pass `require('node:assert').fail`, a
|
|
49
|
+
* custom thrower, or a collector. The
|
|
50
|
+
* function is NOT imported here so callers
|
|
51
|
+
* control the failure mode.
|
|
52
|
+
* @param {string} [opts.pruneHint] - Optional hint appended to the stale-
|
|
53
|
+
* entry failure message (e.g. the name of
|
|
54
|
+
* the allowlist file to edit).
|
|
55
|
+
* @returns {{ novel: string[], stale: string[] }} Sorted arrays of novel ids
|
|
56
|
+
* (in current but not known) and stale ids (in known but not current).
|
|
57
|
+
*/
|
|
58
|
+
function assertWithinAllowlist({ label, current, known, fail, pruneHint }) {
|
|
59
|
+
const currentSet = new Set(current);
|
|
60
|
+
const knownSet = new Set(known);
|
|
61
|
+
|
|
62
|
+
const novel = [...currentSet].filter((id) => !knownSet.has(id)).sort();
|
|
63
|
+
const stale = [...knownSet].filter((id) => !currentSet.has(id)).sort();
|
|
64
|
+
|
|
65
|
+
if (novel.length > 0) {
|
|
66
|
+
const list = novel.map((id) => ` - ${id}`).join('\n');
|
|
67
|
+
fail(
|
|
68
|
+
`[${label}] ${novel.length} NEW offender(s) introduced — fix at the source; do not just add to the allowlist.\n${list}`
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (stale.length > 0) {
|
|
73
|
+
const list = stale.map((id) => ` - ${id}`).join('\n');
|
|
74
|
+
const hint = pruneHint ? `\n(${pruneHint})` : '';
|
|
75
|
+
fail(
|
|
76
|
+
`[${label}] ${stale.length} allowlisted id(s) no longer offend and MUST be pruned so the guard ratchets toward zero.${hint}\n${list}`
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return { novel, stale };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Assert that an artifact's measured maximum stays within a declared ceiling,
|
|
85
|
+
* and that the ceiling itself does not creep above the high-water mark (budgets
|
|
86
|
+
* may only decrease, not increase over time).
|
|
87
|
+
*
|
|
88
|
+
* Fails when:
|
|
89
|
+
* - `actualMax > ceiling` → regression: artifact exceeds budget.
|
|
90
|
+
* - `ceiling - actualMax > grace` → ceiling sits too far above the measured
|
|
91
|
+
* value; tighten it toward `actualMax`.
|
|
92
|
+
*
|
|
93
|
+
* ## Masking blind spot this prevents (issue #597)
|
|
94
|
+
*
|
|
95
|
+
* A plain `assert(size <= ceiling)` with a ceiling set generously high allows
|
|
96
|
+
* the artifact to grow unchecked as long as it stays under the ceiling. The
|
|
97
|
+
* `grace` band forces the ceiling to stay close to the high-water mark,
|
|
98
|
+
* ensuring that any upward creep is immediately visible.
|
|
99
|
+
*
|
|
100
|
+
* @param {object} opts
|
|
101
|
+
* @param {string} opts.label - Human-readable name for the guard (used
|
|
102
|
+
* in failure messages).
|
|
103
|
+
* @param {number} opts.actualMax - The measured value (e.g. bundle size in
|
|
104
|
+
* bytes, line count).
|
|
105
|
+
* @param {number} opts.ceiling - The declared budget ceiling.
|
|
106
|
+
* @param {number} opts.grace - Maximum allowed slack (`ceiling -
|
|
107
|
+
* actualMax`) before the ceiling is
|
|
108
|
+
* considered too loose.
|
|
109
|
+
* @param {function(string): void} opts.fail - Callback invoked with a
|
|
110
|
+
* descriptive message on any violation.
|
|
111
|
+
* @returns {{ ok: boolean, slack: number }} Whether both checks passed and the
|
|
112
|
+
* current slack value.
|
|
113
|
+
*/
|
|
114
|
+
function assertTightCeiling({ label, actualMax, ceiling, grace, fail }) {
|
|
115
|
+
const slack = ceiling - actualMax;
|
|
116
|
+
let ok = true;
|
|
117
|
+
|
|
118
|
+
if (actualMax > ceiling) {
|
|
119
|
+
ok = false;
|
|
120
|
+
fail(
|
|
121
|
+
`[${label}] Regression: artifact value ${actualMax} exceeds budget ceiling ${ceiling}. ` +
|
|
122
|
+
`Raise the ceiling to at most ${actualMax} only if the increase is justified.`
|
|
123
|
+
);
|
|
124
|
+
} else if (slack > grace) {
|
|
125
|
+
ok = false;
|
|
126
|
+
fail(
|
|
127
|
+
`[${label}] Ceiling ${ceiling} sits too far above the high-water mark ${actualMax} ` +
|
|
128
|
+
`(slack ${slack} > grace ${grace}). Tighten the ceiling toward ${actualMax}. ` +
|
|
129
|
+
`Budgets may only decrease.`
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return { ok, slack };
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
module.exports = { assertWithinAllowlist, assertTightCeiling };
|
|
@@ -20,7 +20,7 @@ const path = require('path');
|
|
|
20
20
|
|
|
21
21
|
const ROOT = path.join(__dirname, '..');
|
|
22
22
|
const COMMANDS_DIR = path.join(ROOT, 'commands', 'gsd');
|
|
23
|
-
const GSD_ROOT = path.join(ROOT, '
|
|
23
|
+
const GSD_ROOT = path.join(ROOT, 'gsd-core');
|
|
24
24
|
|
|
25
25
|
const {
|
|
26
26
|
CANONICAL_TOOLS,
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* lint-legacy-dir-name.cjs
|
|
4
|
+
*
|
|
5
|
+
* Prevents accidental re-introduction of the bare legacy directory token
|
|
6
|
+
* `get-shit-done` now that the package has been renamed to `gsd-core` (#604).
|
|
7
|
+
*
|
|
8
|
+
* The forbidden token is constructed by splitting across the concat operator
|
|
9
|
+
* so this guard script cannot flag itself:
|
|
10
|
+
* const FORBIDDEN = 'get-shit' + '-done';
|
|
11
|
+
*
|
|
12
|
+
* Regex: FORBIDDEN + '(?!-\\w)' — allows any hyphenated slug variant
|
|
13
|
+
* (get-shit-done-OLD, get-shit-done-classic, get-shit-done-cli, etc.)
|
|
14
|
+
* while forbidding the bare word boundary that would indicate a stale
|
|
15
|
+
* directory reference. This is the exact pattern that would appear in a
|
|
16
|
+
* path like `~/.claude/get-shit-done/` or `'get-shit-done'` in code.
|
|
17
|
+
*
|
|
18
|
+
* Allowlist:
|
|
19
|
+
* - CHANGELOG.md (historical record; reviewed manually)
|
|
20
|
+
* - .changeset/ (ephemeral release-note fragments; consumed into CHANGELOG on
|
|
21
|
+
* release — like CHANGELOG, not swept by rename PRs)
|
|
22
|
+
* - Translated READMEs: README.ja-JP.md, README.ko-KR.md, README.pt-BR.md, README.zh-CN.md
|
|
23
|
+
* - Locale-specific docs dirs: docs/ja-JP/, docs/ko-KR/, docs/pt-BR/, docs/zh-CN/
|
|
24
|
+
* - Lines containing the marker `gsd-allow-legacy-name` (intentional uses)
|
|
25
|
+
* - Binary files (detected by NUL byte scan)
|
|
26
|
+
* - This guard script itself (by path)
|
|
27
|
+
*
|
|
28
|
+
* Exit 0 if no violations; exit 1 if any are found (with stderr diagnostics).
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
'use strict';
|
|
32
|
+
|
|
33
|
+
const { execFileSync } = require('child_process');
|
|
34
|
+
const fs = require('fs');
|
|
35
|
+
const path = require('path');
|
|
36
|
+
|
|
37
|
+
// Constructed with split to avoid self-match when this script is scanned.
|
|
38
|
+
const FORBIDDEN = 'get-shit' + '-done';
|
|
39
|
+
const FORBIDDEN_RE = new RegExp(FORBIDDEN + '(?!-\\w)', 'gi');
|
|
40
|
+
|
|
41
|
+
const ALLOW_MARKER = 'gsd-allow-legacy-name';
|
|
42
|
+
const SELF_PATH = path.resolve(__filename);
|
|
43
|
+
// GSD_LINT_LEGACY_REPO_ROOT is used by tests to redirect the guard to a
|
|
44
|
+
// temporary fixture git repo without touching the real working tree.
|
|
45
|
+
const REPO_ROOT = process.env.GSD_LINT_LEGACY_REPO_ROOT
|
|
46
|
+
? path.resolve(process.env.GSD_LINT_LEGACY_REPO_ROOT)
|
|
47
|
+
: path.resolve(__dirname, '..');
|
|
48
|
+
|
|
49
|
+
const ALLOWLIST_FILES = new Set([
|
|
50
|
+
'CHANGELOG.md',
|
|
51
|
+
'README.ja-JP.md',
|
|
52
|
+
'README.ko-KR.md',
|
|
53
|
+
'README.pt-BR.md',
|
|
54
|
+
'README.zh-CN.md',
|
|
55
|
+
]);
|
|
56
|
+
|
|
57
|
+
const ALLOWLIST_DIR_PREFIXES = [
|
|
58
|
+
// Pending changeset fragments are ephemeral release-note stubs consumed into
|
|
59
|
+
// CHANGELOG on release — like CHANGELOG itself, they should not be swept by
|
|
60
|
+
// rename PRs and may legitimately contain the legacy token in historical prose.
|
|
61
|
+
'.changeset/',
|
|
62
|
+
'docs/ja-JP/',
|
|
63
|
+
'docs/ko-KR/',
|
|
64
|
+
'docs/pt-BR/',
|
|
65
|
+
'docs/zh-CN/',
|
|
66
|
+
];
|
|
67
|
+
|
|
68
|
+
function isAllowlisted(relPath) {
|
|
69
|
+
if (ALLOWLIST_FILES.has(relPath)) return true;
|
|
70
|
+
for (const prefix of ALLOWLIST_DIR_PREFIXES) {
|
|
71
|
+
if (relPath.startsWith(prefix)) return true;
|
|
72
|
+
}
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function isBinary(fullPath) {
|
|
77
|
+
// Read a small chunk and check for NUL bytes.
|
|
78
|
+
let fd;
|
|
79
|
+
try {
|
|
80
|
+
fd = fs.openSync(fullPath, 'r');
|
|
81
|
+
const buf = Buffer.allocUnsafe(512);
|
|
82
|
+
const bytesRead = fs.readSync(fd, buf, 0, 512, 0);
|
|
83
|
+
return buf.subarray(0, bytesRead).includes(0);
|
|
84
|
+
} catch {
|
|
85
|
+
return false;
|
|
86
|
+
} finally {
|
|
87
|
+
if (fd != null) {
|
|
88
|
+
try { fs.closeSync(fd); } catch { /* best-effort */ }
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Enumerate tracked files via git ls-files so only committed/staged source is checked.
|
|
94
|
+
let trackedFiles;
|
|
95
|
+
try {
|
|
96
|
+
trackedFiles = execFileSync('git', ['ls-files'], { cwd: REPO_ROOT, encoding: 'utf8' })
|
|
97
|
+
.split('\n')
|
|
98
|
+
.map((f) => f.trim())
|
|
99
|
+
.filter(Boolean);
|
|
100
|
+
} catch (err) {
|
|
101
|
+
process.stderr.write('ERROR lint-legacy-dir-name: git ls-files failed: ' + err.message + '\n');
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const violations = [];
|
|
106
|
+
|
|
107
|
+
for (const relPath of trackedFiles) {
|
|
108
|
+
if (isAllowlisted(relPath)) continue;
|
|
109
|
+
|
|
110
|
+
const fullPath = path.join(REPO_ROOT, relPath);
|
|
111
|
+
|
|
112
|
+
// Skip this guard script itself.
|
|
113
|
+
if (path.resolve(fullPath) === SELF_PATH) continue;
|
|
114
|
+
|
|
115
|
+
if (isBinary(fullPath)) continue;
|
|
116
|
+
|
|
117
|
+
let content;
|
|
118
|
+
try {
|
|
119
|
+
content = fs.readFileSync(fullPath, 'utf8');
|
|
120
|
+
} catch {
|
|
121
|
+
// Unreadable files (permissions, etc.) — skip silently.
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const lines = content.split('\n');
|
|
126
|
+
for (let i = 0; i < lines.length; i++) {
|
|
127
|
+
const line = lines[i];
|
|
128
|
+
// Skip lines that carry the explicit allow marker.
|
|
129
|
+
if (line.includes(ALLOW_MARKER)) continue;
|
|
130
|
+
|
|
131
|
+
FORBIDDEN_RE.lastIndex = 0;
|
|
132
|
+
let match;
|
|
133
|
+
while ((match = FORBIDDEN_RE.exec(line)) !== null) {
|
|
134
|
+
violations.push({
|
|
135
|
+
file: relPath,
|
|
136
|
+
line: i + 1,
|
|
137
|
+
col: match.index + 1,
|
|
138
|
+
text: match[0],
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (violations.length === 0) {
|
|
145
|
+
process.stdout.write('ok lint-legacy-dir-name: ' + trackedFiles.length + ' tracked file(s) checked, 0 violations\n');
|
|
146
|
+
process.exit(0);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
process.stderr.write('\nERROR lint-legacy-dir-name: ' + violations.length + ' violation(s) found\n\n');
|
|
150
|
+
for (const v of violations) {
|
|
151
|
+
process.stderr.write(' ' + v.file + ':' + v.line + ':' + v.col + ' — ' + JSON.stringify(v.text) + '\n');
|
|
152
|
+
}
|
|
153
|
+
process.stderr.write('\n');
|
|
154
|
+
process.stderr.write('Fix: rename to gsd-core, or add `gsd-allow-legacy-name` marker on the line if the\n');
|
|
155
|
+
process.stderr.write(' use is intentional (migration modules, tests, guard, changeset).\n\n');
|
|
156
|
+
process.exit(1);
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
/**
|
|
5
5
|
* Drift-guard lint for the Package Identity seam (issue #498).
|
|
6
6
|
*
|
|
7
|
-
* The seam (`get-shit-done/bin/lib/package-identity.cjs`, derived from
|
|
7
|
+
* The seam (`get-shit-done/bin/lib/package-identity.cjs`, derived from // gsd-allow-legacy-name
|
|
8
8
|
* package.json) is the single source of GSD's published coordinates. Many
|
|
9
9
|
* runtime surfaces still carry a literal copy of those coordinates because
|
|
10
10
|
* they cannot `require()` the seam at runtime: the bash launcher snippet (and
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* literal is reported until updated. That is what turns a repoint into a
|
|
20
20
|
* one-line change with mechanical enforcement.
|
|
21
21
|
*
|
|
22
|
-
* Scope: the runtime/code surface (bin/, hooks/, scripts/, get-shit-done/).
|
|
22
|
+
* Scope: the runtime/code surface (bin/, hooks/, scripts/, get-shit-done/). // gsd-allow-legacy-name
|
|
23
23
|
* Pure-prose docs and localized READMEs are intentionally out of scope.
|
|
24
24
|
*/
|
|
25
25
|
|
|
@@ -27,11 +27,11 @@ const fs = require('node:fs');
|
|
|
27
27
|
const path = require('node:path');
|
|
28
28
|
|
|
29
29
|
// A GSD package coordinate: a scoped npm name whose package part contains
|
|
30
|
-
// "get-shit-done" (so @opengsd/gsd-sdk and unrelated scopes never match).
|
|
31
|
-
const PACKAGE_RE = /@[A-Za-z0-9._-]+\/[A-Za-z0-9._-]*get-shit-done[A-Za-z0-9._-]*/g;
|
|
30
|
+
// "get-shit-done" (so @opengsd/gsd-sdk and unrelated scopes never match). // gsd-allow-legacy-name
|
|
31
|
+
const PACKAGE_RE = /@[A-Za-z0-9._-]+\/[A-Za-z0-9._-]*get-shit-done[A-Za-z0-9._-]*/g; // gsd-allow-legacy-name
|
|
32
32
|
// A GSD repo slug, only inside a GitHub URL context so it never overlaps the
|
|
33
33
|
// scoped package literal above. The `.git` suffix is trimmed before compare.
|
|
34
|
-
const SLUG_RE = /(?:github\.com[/:]|raw\.githubusercontent\.com\/)([A-Za-z0-9._-]+\/[A-Za-z0-9._-]*get-shit-done[A-Za-z0-9._-]*)/g;
|
|
34
|
+
const SLUG_RE = /(?:github\.com[/:]|raw\.githubusercontent\.com\/)([A-Za-z0-9._-]+\/[A-Za-z0-9._-]*get-shit-done[A-Za-z0-9._-]*)/g; // gsd-allow-legacy-name
|
|
35
35
|
|
|
36
36
|
function lineOf(text, index) {
|
|
37
37
|
let line = 1;
|
|
@@ -62,14 +62,14 @@ function findCoordinateDrift(text, { packageName, repoSlug }) {
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
// Directories scanned, relative to repo root.
|
|
65
|
-
const SCAN_DIRS = ['bin', 'hooks', 'scripts', '
|
|
65
|
+
const SCAN_DIRS = ['bin', 'hooks', 'scripts', 'gsd-core'];
|
|
66
66
|
const SCAN_EXT = new Set(['.js', '.cjs', '.sh', '.md']);
|
|
67
67
|
// Files exempt because they ARE the source of truth / the tooling that defines
|
|
68
68
|
// the coordinate patterns. The generated seam holds the correct value by
|
|
69
69
|
// construction; the generator and this lint carry regex/templates, not stray
|
|
70
70
|
// literals.
|
|
71
71
|
const EXEMPT = new Set([
|
|
72
|
-
path.join('
|
|
72
|
+
path.join('gsd-core', 'bin', 'lib', 'package-identity.cjs'),
|
|
73
73
|
path.join('scripts', 'generate-package-identity.cjs'),
|
|
74
74
|
path.join('scripts', 'lint-package-identity-drift.cjs'),
|
|
75
75
|
]);
|
|
@@ -98,7 +98,7 @@ function walk(dir, acc) {
|
|
|
98
98
|
* annotated with the repo-relative file path.
|
|
99
99
|
*/
|
|
100
100
|
function scanRepo(root) {
|
|
101
|
-
const seam = require(path.join(root, '
|
|
101
|
+
const seam = require(path.join(root, 'gsd-core', 'bin', 'lib', 'package-identity.cjs'));
|
|
102
102
|
const expected = { packageName: seam.packageName, repoSlug: seam.repoSlug };
|
|
103
103
|
const violations = [];
|
|
104
104
|
for (const dir of SCAN_DIRS) {
|
|
@@ -10,7 +10,6 @@ const DEFAULT_RELATIVE_FILES = [
|
|
|
10
10
|
'.github/workflows/test.yml',
|
|
11
11
|
'.github/workflows/pr-template-format.yml',
|
|
12
12
|
'.github/workflows/changeset-required.yml',
|
|
13
|
-
'scripts/lint-no-source-grep.cjs',
|
|
14
13
|
'scripts/lint-command-contract.cjs',
|
|
15
14
|
'scripts/lint-skill-deps.cjs',
|
|
16
15
|
'scripts/lint-descriptions.cjs',
|
|
@@ -52,6 +52,6 @@ process.stderr.write(`ERROR shell-projection-drift: inline serialized shim build
|
|
|
52
52
|
for (const match of matches) {
|
|
53
53
|
process.stderr.write(` - ${match.label}\n`);
|
|
54
54
|
}
|
|
55
|
-
process.stderr.write('Route shim/wrapper rendering through
|
|
55
|
+
process.stderr.write('Route shim/wrapper rendering through gsd-core/bin/lib/shell-command-projection.cjs\n');
|
|
56
56
|
process.stderr.write('Safe subprocess execution via spawnSync/execFileSync is intentionally allowed.\n');
|
|
57
57
|
process.exit(1);
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
const fs = require('fs');
|
|
27
27
|
const path = require('path');
|
|
28
28
|
|
|
29
|
-
const PROFILES_MODULE = path.join(__dirname, '..', '
|
|
29
|
+
const PROFILES_MODULE = path.join(__dirname, '..', 'gsd-core', 'bin', 'lib', 'install-profiles.cjs');
|
|
30
30
|
const { PROFILES, loadSkillsManifest, resolveProfile } = require(PROFILES_MODULE);
|
|
31
31
|
|
|
32
32
|
// ---------------------------------------------------------------------------
|
|
@@ -1,36 +1,133 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_doc": "Baseline of modules currently exceeding the 2-test-file limit. Each entry locks in TODAY's
|
|
2
|
+
"_doc": "Baseline of modules currently exceeding the 2-test-file limit. Each entry locks in TODAY's exact test filenames as the allowlisted set (identity ratchet). Adding a NEW test file to a capped module fails (novel). Removing one requires pruning this list (stale, ratchet-down). When a cluster drops to ≤ 2, remove its entry entirely. New entries require justification in PR description.",
|
|
3
3
|
"modules": {
|
|
4
|
-
"
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
"
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
4
|
+
"audit": {
|
|
5
|
+
"files": [
|
|
6
|
+
"audit-fix-command.test.cjs",
|
|
7
|
+
"bug-2659-audit-open-crash.test.cjs",
|
|
8
|
+
"bug-2836-audit-open-summary-uat-drift.test.cjs",
|
|
9
|
+
"bug-2911-audit-open-output-shape.test.cjs"
|
|
10
|
+
],
|
|
11
|
+
"issue": "192"
|
|
12
|
+
},
|
|
13
|
+
"config": {
|
|
14
|
+
"files": [
|
|
15
|
+
"bug-2943-config-get-context-window-default.test.cjs",
|
|
16
|
+
"bug-321-config-defaults-clone-strategy.test.cjs",
|
|
17
|
+
"bug-3227-config-set-model-overrides.test.cjs",
|
|
18
|
+
"bug-442-config-dir-equals-in-path.test.cjs",
|
|
19
|
+
"config-field-docs.test.cjs",
|
|
20
|
+
"config-get-default.test.cjs",
|
|
21
|
+
"config-schema.property.test.cjs",
|
|
22
|
+
"config.test.cjs"
|
|
23
|
+
],
|
|
24
|
+
"issue": "TBD"
|
|
25
|
+
},
|
|
26
|
+
"graphify": {
|
|
27
|
+
"files": [
|
|
28
|
+
"bug-622-graphify-optional-graph-html.test.cjs",
|
|
29
|
+
"graphify-auto-update.test.cjs",
|
|
30
|
+
"graphify-query.test.cjs",
|
|
31
|
+
"graphify-visualization.test.cjs",
|
|
32
|
+
"graphify.test.cjs"
|
|
33
|
+
],
|
|
34
|
+
"issue": "622"
|
|
35
|
+
},
|
|
36
|
+
"intel": {
|
|
37
|
+
"files": [
|
|
38
|
+
"bug-2351-intel-kilo-layout.test.cjs",
|
|
39
|
+
"bug-3290-intel-updater-layout-block.test.cjs",
|
|
40
|
+
"intel.test.cjs"
|
|
41
|
+
],
|
|
42
|
+
"issue": "TBD"
|
|
43
|
+
},
|
|
44
|
+
"milestone": {
|
|
45
|
+
"files": [
|
|
46
|
+
"milestone-archive.test.cjs",
|
|
47
|
+
"milestone-helper.test.cjs",
|
|
48
|
+
"milestone-prefixed-convention.test.cjs",
|
|
49
|
+
"milestone-summary.test.cjs",
|
|
50
|
+
"milestone.test.cjs"
|
|
51
|
+
],
|
|
52
|
+
"issue": "TBD"
|
|
53
|
+
},
|
|
54
|
+
"phase": {
|
|
55
|
+
"files": [
|
|
56
|
+
"bug-214-phase-researcher-write-truncation-contract.test.cjs",
|
|
57
|
+
"phase-dependency-levels.test.cjs",
|
|
58
|
+
"phase.test.cjs"
|
|
59
|
+
],
|
|
60
|
+
"issue": "597"
|
|
61
|
+
},
|
|
62
|
+
"roadmap": {
|
|
63
|
+
"files": [
|
|
64
|
+
"bug-2661-roadmap-sync-parallel.test.cjs",
|
|
65
|
+
"bug-3128-roadmap-plan-count-slug-layout.test.cjs",
|
|
66
|
+
"bug-3599-roadmap-get-phase-project-code-prefix.test.cjs",
|
|
67
|
+
"enh-2447-roadmap-wave-deps.test.cjs",
|
|
68
|
+
"roadmap-mode-field.test.cjs",
|
|
69
|
+
"roadmap-phase-fallback.test.cjs",
|
|
70
|
+
"roadmap.test.cjs"
|
|
71
|
+
],
|
|
72
|
+
"issue": "TBD"
|
|
73
|
+
},
|
|
74
|
+
"runtime-artifact-layout": {
|
|
75
|
+
"files": [
|
|
76
|
+
"runtime-artifact-layout-install-profiles.test.cjs",
|
|
77
|
+
"runtime-artifact-layout-surface.test.cjs",
|
|
78
|
+
"runtime-artifact-layout.test.cjs"
|
|
79
|
+
],
|
|
80
|
+
"issue": "TBD"
|
|
81
|
+
},
|
|
82
|
+
"security": {
|
|
83
|
+
"files": [
|
|
84
|
+
"security-prompt-injection.test.cjs",
|
|
85
|
+
"security-scan.test.cjs",
|
|
86
|
+
"security.test.cjs"
|
|
87
|
+
],
|
|
88
|
+
"issue": "TBD"
|
|
89
|
+
},
|
|
90
|
+
"state": {
|
|
91
|
+
"files": [
|
|
92
|
+
"bug-21-state-md-template-frontmatter.test.cjs",
|
|
93
|
+
"bug-2630-state-frontmatter-milestone-switch.test.cjs",
|
|
94
|
+
"bug-3127-state-begin-phase-idempotent.test.cjs",
|
|
95
|
+
"bug-3242-state-update-progress-trample.test.cjs",
|
|
96
|
+
"bug-3286-state-write-routing.test.cjs",
|
|
97
|
+
"bug-3454-state-dollar-backreference-growth.test.cjs",
|
|
98
|
+
"bug-397-state-preserve-executor-authored.test.cjs",
|
|
99
|
+
"state-acquirestatelock-non-eexist.test.cjs",
|
|
100
|
+
"state-prune.test.cjs",
|
|
101
|
+
"state.test.cjs"
|
|
102
|
+
],
|
|
103
|
+
"issue": "180"
|
|
104
|
+
},
|
|
105
|
+
"verify": {
|
|
106
|
+
"files": [
|
|
107
|
+
"bug-2969-verify-reapply-patches.test.cjs",
|
|
108
|
+
"bug-2994-verify-reapply-patches-installed-path.test.cjs",
|
|
109
|
+
"bug-3381-verify-work-workstream.test.cjs",
|
|
110
|
+
"bug-3657-verify-reapply-patches-pristine-drift.test.cjs",
|
|
111
|
+
"verify-health.test.cjs",
|
|
112
|
+
"verify-mvp-uat.test.cjs",
|
|
113
|
+
"verify-npm-publish.test.cjs",
|
|
114
|
+
"verify-test-quality.test.cjs",
|
|
115
|
+
"verify-work-auto-transition.test.cjs",
|
|
116
|
+
"verify.test.cjs"
|
|
117
|
+
],
|
|
118
|
+
"issue": "3767"
|
|
119
|
+
},
|
|
120
|
+
"install": {
|
|
121
|
+
"files": [
|
|
122
|
+
"bug-410-install-defaults-test-mode-guard.test.cjs",
|
|
123
|
+
"install-minimal-hooks.test.cjs",
|
|
124
|
+
"install-path-detection.test.cjs",
|
|
125
|
+
"install-regressions.test.cjs",
|
|
126
|
+
"install-runtime-artifacts.test.cjs",
|
|
127
|
+
"install-update-marker.test.cjs",
|
|
128
|
+
"install.test.cjs"
|
|
129
|
+
],
|
|
130
|
+
"issue": "TBD"
|
|
131
|
+
}
|
|
35
132
|
}
|
|
36
133
|
}
|