@opengsd/gsd-core 1.3.0-rc.1 → 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 +44 -790
- package/README.ko-KR.md +41 -778
- package/README.md +39 -180
- package/README.pt-BR.md +45 -413
- package/README.zh-CN.md +43 -761
- package/agents/gsd-ai-researcher.md +1 -1
- package/agents/gsd-debugger.md +8 -8
- package/agents/gsd-domain-researcher.md +14 -1
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-eval-planner.md +1 -1
- 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 +18 -5
- 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 +15 -2
- package/agents/gsd-user-profiler.md +2 -2
- package/agents/gsd-verifier.md +7 -7
- package/bin/install.js +169 -59
- 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 +1 -1
- 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 +13 -3
- 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/{get-shit-done → gsd-core}/bin/lib/config-types.cjs +1 -1
- 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/{get-shit-done → gsd-core}/bin/lib/semver-compare.cjs +1 -1
- 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 -78
- 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-schema.manifest.json +5 -0
- package/{get-shit-done → gsd-core}/references/artifact-types.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-mvp-mode.md +1 -1
- 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 +1 -1
- package/{get-shit-done → gsd-core}/workflows/audit-milestone.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/audit-uat.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/autonomous.md +4 -4
- package/{get-shit-done → gsd-core}/workflows/check-todos.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/cleanup.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/code-review-fix.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/code-review.md +4 -4
- package/{get-shit-done → gsd-core}/workflows/complete-milestone.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/debug.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/diagnose-issues.md +4 -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 +4 -4
- 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 +2 -2
- 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 +1 -1
- package/{get-shit-done → gsd-core}/workflows/edit-phase.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/eval-review.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/codebase-drift-gate.md +15 -2
- 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 +68 -46
- package/{get-shit-done → gsd-core}/workflows/execute-plan.md +8 -8
- package/{get-shit-done → gsd-core}/workflows/explore.md +3 -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/full.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/import.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/ingest-docs.md +3 -3
- 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 +1 -1
- package/{get-shit-done → gsd-core}/workflows/map-codebase.md +1 -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 +3 -3
- package/{get-shit-done → gsd-core}/workflows/new-project.md +6 -6
- 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 +15 -15
- package/{get-shit-done → gsd-core}/workflows/plan-review-convergence.md +7 -7
- 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 +2 -26
- 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 +1 -1
- package/{get-shit-done → gsd-core}/workflows/scan.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/secure-phase.md +3 -3
- package/{get-shit-done → gsd-core}/workflows/settings-advanced.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/settings-integrations.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/settings.md +1 -1
- 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 +3 -3
- package/{get-shit-done → gsd-core}/workflows/ui-review.md +2 -2
- 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 +3 -3
- package/{get-shit-done → gsd-core}/workflows/verify-phase.md +4 -4
- package/{get-shit-done → gsd-core}/workflows/verify-work.md +5 -5
- 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/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/package.json +9 -6
- package/scripts/affected-tests-lib.cjs +1 -1
- package/scripts/base64-scan.sh +12 -0
- package/scripts/build-hooks.js +4 -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 +25 -10
- 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 +11 -3
- 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 -831
- 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 -1292
- 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 -2513
- 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 -254
- 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 -355
- 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 -372
- package/get-shit-done/bin/lib/model-catalog.cjs +0 -229
- 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 -79
- 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 -126
- package/get-shit-done/bin/lib/roadmap-command-router.cjs +0 -162
- package/get-shit-done/bin/lib/roadmap-upgrade.cjs +0 -569
- package/get-shit-done/bin/lib/roadmap.cjs +0 -651
- 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/shell-command-projection.cjs +0 -535
- package/get-shit-done/bin/lib/state-command-router.cjs +0 -252
- package/get-shit-done/bin/lib/state.cjs +0 -2073
- 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/ui-safety-gate.cjs +0 -111
- 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 -118
- package/get-shit-done/bin/lib/verify-command-router.cjs +0 -40
- package/get-shit-done/bin/lib/verify.cjs +0 -1614
- 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/{get-shit-done → gsd-core}/bin/shared/config-defaults.manifest.json +0 -0
- /package/{get-shit-done → gsd-core}/bin/shared/model-catalog.json +0 -0
- /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/checkpoints.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-human-verify-mode.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/ui-brand.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/default.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
|
@@ -4,7 +4,7 @@ const fs = require('node:fs');
|
|
|
4
4
|
const path = require('node:path');
|
|
5
5
|
|
|
6
6
|
const ROOT = path.resolve(__dirname, '..');
|
|
7
|
-
const aliasesPath = path.join(ROOT, '
|
|
7
|
+
const aliasesPath = path.join(ROOT, 'gsd-core', 'bin', 'lib', 'command-aliases.cjs');
|
|
8
8
|
|
|
9
9
|
function fail(message) {
|
|
10
10
|
process.stderr.write(`${message}\n`);
|
|
@@ -37,37 +37,37 @@ const families = [
|
|
|
37
37
|
{
|
|
38
38
|
commandAliases: 'STATE_COMMAND_ALIASES',
|
|
39
39
|
subcommands: 'STATE_SUBCOMMANDS',
|
|
40
|
-
routerPath: path.join(ROOT, '
|
|
40
|
+
routerPath: path.join(ROOT, 'gsd-core', 'bin', 'lib', 'state-command-router.cjs'),
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
commandAliases: 'VERIFY_COMMAND_ALIASES',
|
|
44
44
|
subcommands: 'VERIFY_SUBCOMMANDS',
|
|
45
|
-
routerPath: path.join(ROOT, '
|
|
45
|
+
routerPath: path.join(ROOT, 'gsd-core', 'bin', 'lib', 'verify-command-router.cjs'),
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
48
|
commandAliases: 'INIT_COMMAND_ALIASES',
|
|
49
49
|
subcommands: 'INIT_SUBCOMMANDS',
|
|
50
|
-
routerPath: path.join(ROOT, '
|
|
50
|
+
routerPath: path.join(ROOT, 'gsd-core', 'bin', 'lib', 'init-command-router.cjs'),
|
|
51
51
|
},
|
|
52
52
|
{
|
|
53
53
|
commandAliases: 'PHASE_COMMAND_ALIASES',
|
|
54
54
|
subcommands: 'PHASE_SUBCOMMANDS',
|
|
55
|
-
routerPath: path.join(ROOT, '
|
|
55
|
+
routerPath: path.join(ROOT, 'gsd-core', 'bin', 'lib', 'phase-command-router.cjs'),
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
commandAliases: 'PHASES_COMMAND_ALIASES',
|
|
59
59
|
subcommands: 'PHASES_SUBCOMMANDS',
|
|
60
|
-
routerPath: path.join(ROOT, '
|
|
60
|
+
routerPath: path.join(ROOT, 'gsd-core', 'bin', 'lib', 'phases-command-router.cjs'),
|
|
61
61
|
},
|
|
62
62
|
{
|
|
63
63
|
commandAliases: 'VALIDATE_COMMAND_ALIASES',
|
|
64
64
|
subcommands: 'VALIDATE_SUBCOMMANDS',
|
|
65
|
-
routerPath: path.join(ROOT, '
|
|
65
|
+
routerPath: path.join(ROOT, 'gsd-core', 'bin', 'lib', 'validate-command-router.cjs'),
|
|
66
66
|
},
|
|
67
67
|
{
|
|
68
68
|
commandAliases: 'ROADMAP_COMMAND_ALIASES',
|
|
69
69
|
subcommands: 'ROADMAP_SUBCOMMANDS',
|
|
70
|
-
routerPath: path.join(ROOT, '
|
|
70
|
+
routerPath: path.join(ROOT, 'gsd-core', 'bin', 'lib', 'roadmap-command-router.cjs'),
|
|
71
71
|
},
|
|
72
72
|
];
|
|
73
73
|
|
package/scripts/check-env.cjs
CHANGED
|
@@ -212,7 +212,11 @@ if (fs.existsSync(LOCKFILE)) {
|
|
|
212
212
|
// ---------------------------------------------------------------------------
|
|
213
213
|
if (fs.existsSync(LOCKFILE)) {
|
|
214
214
|
try {
|
|
215
|
-
|
|
215
|
+
// --ignore-scripts: this is a lockfile-vs-package.json sync check, not a
|
|
216
|
+
// build. Without it, npm would run the `prepare` lifecycle (build:lib via
|
|
217
|
+
// tsc) — which fails when check:env runs before deps are installed (tsc
|
|
218
|
+
// absent), misreporting an out-of-sync lockfile. ADR-457 build-at-publish.
|
|
219
|
+
const res = spawnSync(npmCmd, ['ci', '--dry-run', '--ignore-scripts'], {
|
|
216
220
|
cwd: PROJECT_ROOT,
|
|
217
221
|
encoding: 'utf8',
|
|
218
222
|
shell: process.platform === 'win32',
|
|
@@ -44,7 +44,7 @@ const RULES = [
|
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
46
|
name: 'TS runtime sources (ADR-457 build-at-publish)',
|
|
47
|
-
// src/*.cts compiles into
|
|
47
|
+
// src/*.cts compiles into gsd-core/bin/lib/*.cjs; a source-only edit must
|
|
48
48
|
// still trigger the migrated module's tests (otherwise CI silently skips them).
|
|
49
49
|
match: path => path.startsWith('src/') || path === 'tsconfig.build.json',
|
|
50
50
|
tests: [
|
|
@@ -55,7 +55,7 @@ const RULES = [
|
|
|
55
55
|
{
|
|
56
56
|
name: 'installer and package layout',
|
|
57
57
|
match: path => path.startsWith('bin/') ||
|
|
58
|
-
path.startsWith('
|
|
58
|
+
path.startsWith('gsd-core/bin/') ||
|
|
59
59
|
path.includes('install') ||
|
|
60
60
|
path.includes('release-tarball-smoke'),
|
|
61
61
|
fullMatrix: true,
|
|
@@ -122,7 +122,7 @@ const RULES = [
|
|
|
122
122
|
},
|
|
123
123
|
{
|
|
124
124
|
name: 'workflow prompts',
|
|
125
|
-
match: path => path.startsWith('
|
|
125
|
+
match: path => path.startsWith('gsd-core/workflows/'),
|
|
126
126
|
tests: [
|
|
127
127
|
'tests/workflow-compat.test.cjs',
|
|
128
128
|
'tests/workflow-size-budget.test.cjs',
|
|
@@ -153,7 +153,7 @@ const RULES = [
|
|
|
153
153
|
},
|
|
154
154
|
{
|
|
155
155
|
name: 'configuration',
|
|
156
|
-
match: path =>
|
|
156
|
+
match: path => ['config', 'configuration', 'model-catalog', 'model-profile'].some(k => path.includes(k)),
|
|
157
157
|
tests: [
|
|
158
158
|
'tests/config.test.cjs',
|
|
159
159
|
'tests/config-get-default.test.cjs',
|
|
@@ -208,7 +208,19 @@ function parseArgs(argv) {
|
|
|
208
208
|
|
|
209
209
|
function splitFiles(value) {
|
|
210
210
|
if (!value) return [];
|
|
211
|
-
|
|
211
|
+
const SEPARATORS = new Set([',', ' ', '\t', '\n', '\r', '\f', '\v']);
|
|
212
|
+
const tokens = [];
|
|
213
|
+
let current = '';
|
|
214
|
+
for (const ch of value) {
|
|
215
|
+
if (SEPARATORS.has(ch)) {
|
|
216
|
+
if (current) tokens.push(current);
|
|
217
|
+
current = '';
|
|
218
|
+
} else {
|
|
219
|
+
current += ch;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (current) tokens.push(current);
|
|
223
|
+
return tokens.map(v => v.trim()).filter(Boolean);
|
|
212
224
|
}
|
|
213
225
|
|
|
214
226
|
function changedFiles(args) {
|
|
@@ -231,6 +243,9 @@ function addAll(set, values) {
|
|
|
231
243
|
for (const value of values) set.add(value);
|
|
232
244
|
}
|
|
233
245
|
|
|
246
|
+
const WINDOWS_HINTS = ['windows', 'path', 'shell', 'workflow', 'install', 'hook'];
|
|
247
|
+
const isWindowsHint = s => WINDOWS_HINTS.some(k => s.toLowerCase().includes(k));
|
|
248
|
+
|
|
234
249
|
function classify(files) {
|
|
235
250
|
const targeted = new Set();
|
|
236
251
|
const windows = new Set();
|
|
@@ -239,9 +254,9 @@ function classify(files) {
|
|
|
239
254
|
let fullMatrix = false;
|
|
240
255
|
|
|
241
256
|
for (const file of files) {
|
|
242
|
-
if (
|
|
243
|
-
|
|
244
|
-
|
|
257
|
+
if (['bin/', 'gsd-core/', 'agents/', 'commands/', 'docs/', 'hooks/', 'tests/', 'scripts/'].some(p => file.startsWith(p)) ||
|
|
258
|
+
file === 'package.json' || file === 'package-lock.json' ||
|
|
259
|
+
(file.startsWith('tsconfig') && file.endsWith('.json')) ||
|
|
245
260
|
file.startsWith('.github/workflows/') ||
|
|
246
261
|
file.startsWith('.github/rulesets/')) {
|
|
247
262
|
codeChanged = true;
|
|
@@ -250,7 +265,7 @@ function classify(files) {
|
|
|
250
265
|
if (file.startsWith('tests/') && file.endsWith('.test.cjs')) {
|
|
251
266
|
targeted.add(file);
|
|
252
267
|
fullMatrix = true;
|
|
253
|
-
if (
|
|
268
|
+
if (isWindowsHint(file)) {
|
|
254
269
|
windows.add(file);
|
|
255
270
|
}
|
|
256
271
|
}
|
|
@@ -272,7 +287,7 @@ function classify(files) {
|
|
|
272
287
|
targetedTests.push('unit');
|
|
273
288
|
}
|
|
274
289
|
|
|
275
|
-
const windowsTests = existingTests([...new Set([...windows, ...targetedTests.filter(
|
|
290
|
+
const windowsTests = existingTests([...new Set([...windows, ...targetedTests.filter(isWindowsHint)])].sort());
|
|
276
291
|
|
|
277
292
|
return {
|
|
278
293
|
code_changed: codeChanged,
|
|
@@ -54,7 +54,7 @@ function executionContextRefs(content) {
|
|
|
54
54
|
const trailingProse = line.length > token.length;
|
|
55
55
|
const normalized = token
|
|
56
56
|
.replace(/^@(?:~|\$HOME)\//, '')
|
|
57
|
-
.replace(/^(?:\.claude\/)?(?:
|
|
57
|
+
.replace(/^(?:\.claude\/)?(?:gsd-core\/)?/, '');
|
|
58
58
|
refs.push({ token, normalized, trailingProse });
|
|
59
59
|
}
|
|
60
60
|
}
|
|
@@ -20,11 +20,11 @@ const path = require('node:path');
|
|
|
20
20
|
|
|
21
21
|
const COMMANDS_DIR = path.join(__dirname, '..', 'commands', 'gsd');
|
|
22
22
|
const SEARCH_DIRS = [
|
|
23
|
-
path.join(__dirname, '..', '
|
|
24
|
-
path.join(__dirname, '..', '
|
|
25
|
-
path.join(__dirname, '..', '
|
|
26
|
-
path.join(__dirname, '..', '
|
|
27
|
-
path.join(__dirname, '..', '
|
|
23
|
+
path.join(__dirname, '..', 'gsd-core', 'bin', 'lib'),
|
|
24
|
+
path.join(__dirname, '..', 'gsd-core', 'workflows'),
|
|
25
|
+
path.join(__dirname, '..', 'gsd-core', 'references'),
|
|
26
|
+
path.join(__dirname, '..', 'gsd-core', 'templates'),
|
|
27
|
+
path.join(__dirname, '..', 'gsd-core', 'contexts'),
|
|
28
28
|
path.join(__dirname, '..', 'commands', 'gsd'),
|
|
29
29
|
path.join(__dirname, '..', 'agents'),
|
|
30
30
|
path.join(__dirname, '..', 'hooks'),
|
|
@@ -34,19 +34,19 @@ const FAMILIES = [
|
|
|
34
34
|
},
|
|
35
35
|
{
|
|
36
36
|
name: 'workflows',
|
|
37
|
-
dir: path.join(ROOT, '
|
|
37
|
+
dir: path.join(ROOT, 'gsd-core', 'workflows'),
|
|
38
38
|
filter: (f) => f.endsWith('.md'),
|
|
39
39
|
toName: (f) => f,
|
|
40
40
|
},
|
|
41
41
|
{
|
|
42
42
|
name: 'references',
|
|
43
|
-
dir: path.join(ROOT, '
|
|
43
|
+
dir: path.join(ROOT, 'gsd-core', 'references'),
|
|
44
44
|
filter: (f) => f.endsWith('.md'),
|
|
45
45
|
toName: (f) => f,
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
48
|
name: 'cli_modules',
|
|
49
|
-
dir: path.join(ROOT, '
|
|
49
|
+
dir: path.join(ROOT, 'gsd-core', 'bin', 'lib'),
|
|
50
50
|
filter: (f) => f.endsWith('.cjs'),
|
|
51
51
|
toName: (f) => f,
|
|
52
52
|
},
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* `deriveIdentity(pkg)` is the pure core: it turns a parsed package.json into
|
|
8
8
|
* the coordinate record every consumer needs. The generated runtime module
|
|
9
|
-
* `
|
|
9
|
+
* `gsd-core/bin/lib/package-identity.cjs` bakes those values at build
|
|
10
10
|
* time, because the installed tree carries only a synthetic
|
|
11
11
|
* `{"type":"commonjs"}` package.json (no `.name`) — so a runtime
|
|
12
12
|
* `require('package.json').name` resolves to `undefined` (the #378 bug this
|
|
@@ -24,6 +24,21 @@ function parseRepoSlug(repository) {
|
|
|
24
24
|
return m ? m[1] : '';
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
/**
|
|
28
|
+
* Pure: turn an npm package name into a filesystem-safe slug for cache filenames.
|
|
29
|
+
* Strips a leading `@`, replaces `/` with `-`, then collapses any run of
|
|
30
|
+
* characters that are NOT `[a-z0-9]` to a single `-`, and trims leading/trailing `-`.
|
|
31
|
+
*/
|
|
32
|
+
function slugifyPackageName(name) {
|
|
33
|
+
if (!name) return '';
|
|
34
|
+
return name
|
|
35
|
+
.replace(/^@/, '')
|
|
36
|
+
.replace(/\//g, '-')
|
|
37
|
+
.toLowerCase()
|
|
38
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
39
|
+
.replace(/^-+|-+$/g, '');
|
|
40
|
+
}
|
|
41
|
+
|
|
27
42
|
/**
|
|
28
43
|
* Pure: package.json object -> the package identity coordinates.
|
|
29
44
|
*/
|
|
@@ -35,7 +50,9 @@ function deriveIdentity(pkg = {}) {
|
|
|
35
50
|
const changelogRawUrl = repoSlug
|
|
36
51
|
? `https://raw.githubusercontent.com/${repoSlug}/main/CHANGELOG.md`
|
|
37
52
|
: '';
|
|
38
|
-
|
|
53
|
+
const cacheSlug = slugifyPackageName(packageName);
|
|
54
|
+
const updateCacheFileName = cacheSlug ? `gsd-update-check-${cacheSlug}.json` : 'gsd-update-check.json';
|
|
55
|
+
return { packageName, binName, repoSlug, repoUrl, changelogRawUrl, cacheSlug, updateCacheFileName };
|
|
39
56
|
}
|
|
40
57
|
|
|
41
58
|
/**
|
|
@@ -62,7 +79,7 @@ const GENERATED_HEADER =
|
|
|
62
79
|
* runtime command builder is byte-identical to the tested source above.
|
|
63
80
|
*/
|
|
64
81
|
function render(identity) {
|
|
65
|
-
const { packageName, binName, repoSlug, repoUrl, changelogRawUrl } = identity;
|
|
82
|
+
const { packageName, binName, repoSlug, repoUrl, changelogRawUrl, cacheSlug, updateCacheFileName } = identity;
|
|
66
83
|
const j = (v) => JSON.stringify(v);
|
|
67
84
|
return (
|
|
68
85
|
GENERATED_HEADER +
|
|
@@ -71,7 +88,9 @@ function render(identity) {
|
|
|
71
88
|
`const binName = ${j(binName)};\n` +
|
|
72
89
|
`const repoSlug = ${j(repoSlug)};\n` +
|
|
73
90
|
`const repoUrl = ${j(repoUrl)};\n` +
|
|
74
|
-
`const changelogRawUrl = ${j(changelogRawUrl)};\n
|
|
91
|
+
`const changelogRawUrl = ${j(changelogRawUrl)};\n` +
|
|
92
|
+
`const cacheSlug = ${j(cacheSlug)};\n` +
|
|
93
|
+
`const updateCacheFileName = ${j(updateCacheFileName)};\n\n` +
|
|
75
94
|
`${formatManualInstall.toString()}\n\n` +
|
|
76
95
|
'function manualInstallCommand(opts = {}) {\n' +
|
|
77
96
|
' return formatManualInstall({ packageName, binName, scope: opts.scope, runtime: opts.runtime });\n' +
|
|
@@ -79,12 +98,14 @@ function render(identity) {
|
|
|
79
98
|
'module.exports = Object.freeze({\n' +
|
|
80
99
|
' packageName,\n' +
|
|
81
100
|
' // PACKAGE_NAME: back-compat alias for #516-era consumers. Baked here, so it\n' +
|
|
82
|
-
|
|
101
|
+
" // survives the installed tree's synthetic package.json (fixes the #378 undefined).\n" +
|
|
83
102
|
' PACKAGE_NAME: packageName,\n' +
|
|
84
103
|
' binName,\n' +
|
|
85
104
|
' repoSlug,\n' +
|
|
86
105
|
' repoUrl,\n' +
|
|
87
106
|
' changelogRawUrl,\n' +
|
|
107
|
+
' cacheSlug,\n' +
|
|
108
|
+
' updateCacheFileName,\n' +
|
|
88
109
|
' manualInstallCommand,\n' +
|
|
89
110
|
'});\n'
|
|
90
111
|
);
|
|
@@ -94,11 +115,11 @@ function main() {
|
|
|
94
115
|
const fs = require('node:fs');
|
|
95
116
|
const path = require('node:path');
|
|
96
117
|
const pkg = require(path.join(__dirname, '..', 'package.json'));
|
|
97
|
-
const out = path.join(__dirname, '..', '
|
|
118
|
+
const out = path.join(__dirname, '..', 'gsd-core', 'bin', 'lib', 'package-identity.cjs');
|
|
98
119
|
fs.writeFileSync(out, render(deriveIdentity(pkg)));
|
|
99
120
|
process.stdout.write(`wrote ${path.relative(path.join(__dirname, '..'), out)}\n`);
|
|
100
121
|
}
|
|
101
122
|
|
|
102
123
|
if (require.main === module) main();
|
|
103
124
|
|
|
104
|
-
module.exports = { deriveIdentity, parseRepoSlug, formatManualInstall, render, main };
|
|
125
|
+
module.exports = { deriveIdentity, parseRepoSlug, slugifyPackageName, formatManualInstall, render, main };
|
|
@@ -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) {
|