@opengsd/gsd-core 1.2.0-rc.1
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/LICENSE +21 -0
- package/README.ja-JP.md +870 -0
- package/README.ko-KR.md +861 -0
- package/README.md +301 -0
- package/README.pt-BR.md +492 -0
- package/README.zh-CN.md +842 -0
- package/agents/gsd-advisor-researcher.md +127 -0
- package/agents/gsd-ai-researcher.md +133 -0
- package/agents/gsd-assumptions-analyzer.md +105 -0
- package/agents/gsd-code-fixer.md +668 -0
- package/agents/gsd-code-reviewer.md +387 -0
- package/agents/gsd-codebase-mapper.md +853 -0
- package/agents/gsd-debug-session-manager.md +314 -0
- package/agents/gsd-debugger.md +1452 -0
- package/agents/gsd-doc-classifier.md +168 -0
- package/agents/gsd-doc-synthesizer.md +204 -0
- package/agents/gsd-doc-verifier.md +217 -0
- package/agents/gsd-doc-writer.md +615 -0
- package/agents/gsd-domain-researcher.md +153 -0
- package/agents/gsd-eval-auditor.md +191 -0
- package/agents/gsd-eval-planner.md +154 -0
- package/agents/gsd-executor.md +772 -0
- package/agents/gsd-framework-selector.md +160 -0
- package/agents/gsd-integration-checker.md +470 -0
- package/agents/gsd-intel-updater.md +342 -0
- package/agents/gsd-nyquist-auditor.md +203 -0
- package/agents/gsd-pattern-mapper.md +335 -0
- package/agents/gsd-phase-researcher.md +928 -0
- package/agents/gsd-plan-checker.md +978 -0
- package/agents/gsd-planner.md +1218 -0
- package/agents/gsd-project-researcher.md +677 -0
- package/agents/gsd-research-synthesizer.md +255 -0
- package/agents/gsd-roadmapper.md +688 -0
- package/agents/gsd-security-auditor.md +155 -0
- package/agents/gsd-ui-auditor.md +495 -0
- package/agents/gsd-ui-checker.md +309 -0
- package/agents/gsd-ui-researcher.md +380 -0
- package/agents/gsd-user-profiler.md +171 -0
- package/agents/gsd-verifier.md +917 -0
- package/bin/install.js +10936 -0
- package/bin/lib/ui-safety-gate.cjs +107 -0
- package/commands/gsd/add-tests.md +42 -0
- package/commands/gsd/ai-integration-phase.md +37 -0
- package/commands/gsd/audit-fix.md +34 -0
- package/commands/gsd/audit-milestone.md +37 -0
- package/commands/gsd/audit-uat.md +24 -0
- package/commands/gsd/autonomous.md +46 -0
- package/commands/gsd/capture.md +62 -0
- package/commands/gsd/cleanup.md +24 -0
- package/commands/gsd/code-review.md +59 -0
- package/commands/gsd/complete-milestone.md +143 -0
- package/commands/gsd/config.md +56 -0
- package/commands/gsd/debug.md +52 -0
- package/commands/gsd/discuss-phase.md +76 -0
- package/commands/gsd/docs-update.md +49 -0
- package/commands/gsd/eval-review.md +33 -0
- package/commands/gsd/execute-phase.md +64 -0
- package/commands/gsd/explore.md +27 -0
- package/commands/gsd/extract-learnings.md +23 -0
- package/commands/gsd/fast.md +31 -0
- package/commands/gsd/forensics.md +57 -0
- package/commands/gsd/graphify.md +199 -0
- package/commands/gsd/health.md +31 -0
- package/commands/gsd/help.md +28 -0
- package/commands/gsd/import.md +41 -0
- package/commands/gsd/inbox.md +39 -0
- package/commands/gsd/ingest-docs.md +42 -0
- package/commands/gsd/manager.md +45 -0
- package/commands/gsd/map-codebase.md +83 -0
- package/commands/gsd/milestone-summary.md +51 -0
- package/commands/gsd/mvp-phase.md +45 -0
- package/commands/gsd/new-milestone.md +45 -0
- package/commands/gsd/new-project.md +47 -0
- package/commands/gsd/ns-context.md +23 -0
- package/commands/gsd/ns-ideate.md +24 -0
- package/commands/gsd/ns-manage.md +29 -0
- package/commands/gsd/ns-project.md +22 -0
- package/commands/gsd/ns-review.md +26 -0
- package/commands/gsd/ns-workflow.md +28 -0
- package/commands/gsd/pause-work.md +43 -0
- package/commands/gsd/phase.md +56 -0
- package/commands/gsd/plan-phase.md +62 -0
- package/commands/gsd/plan-review-convergence.md +59 -0
- package/commands/gsd/pr-branch.md +26 -0
- package/commands/gsd/profile-user.md +46 -0
- package/commands/gsd/progress.md +47 -0
- package/commands/gsd/quick.md +174 -0
- package/commands/gsd/resume-work.md +30 -0
- package/commands/gsd/review-backlog.md +63 -0
- package/commands/gsd/review.md +41 -0
- package/commands/gsd/secure-phase.md +36 -0
- package/commands/gsd/settings.md +29 -0
- package/commands/gsd/ship.md +24 -0
- package/commands/gsd/sketch.md +60 -0
- package/commands/gsd/spec-phase.md +63 -0
- package/commands/gsd/spike.md +57 -0
- package/commands/gsd/stats.md +19 -0
- package/commands/gsd/surface.md +155 -0
- package/commands/gsd/thread.md +24 -0
- package/commands/gsd/ui-phase.md +35 -0
- package/commands/gsd/ui-review.md +33 -0
- package/commands/gsd/ultraplan-phase.md +34 -0
- package/commands/gsd/undo.md +35 -0
- package/commands/gsd/update.md +48 -0
- package/commands/gsd/validate-phase.md +36 -0
- package/commands/gsd/verify-work.md +39 -0
- package/commands/gsd/workspace.md +52 -0
- package/commands/gsd/workstreams.md +70 -0
- package/get-shit-done/bin/check-latest-version.cjs +106 -0
- package/get-shit-done/bin/gsd-tools.cjs +1676 -0
- package/get-shit-done/bin/lib/active-workstream-store.cjs +302 -0
- package/get-shit-done/bin/lib/adr-parser.cjs +394 -0
- package/get-shit-done/bin/lib/agent-command-router.cjs +65 -0
- package/get-shit-done/bin/lib/artifacts.cjs +53 -0
- package/get-shit-done/bin/lib/audit.cjs +755 -0
- package/get-shit-done/bin/lib/check-command-router.cjs +333 -0
- package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +118 -0
- package/get-shit-done/bin/lib/clock.cjs +96 -0
- package/get-shit-done/bin/lib/clusters.cjs +135 -0
- package/get-shit-done/bin/lib/code-review-flags.cjs +74 -0
- package/get-shit-done/bin/lib/command-aliases.cjs +815 -0
- package/get-shit-done/bin/lib/command-arg-projection.cjs +62 -0
- package/get-shit-done/bin/lib/command-routing-hub.cjs +388 -0
- package/get-shit-done/bin/lib/commands.cjs +1188 -0
- package/get-shit-done/bin/lib/config-schema.cjs +31 -0
- package/get-shit-done/bin/lib/config.cjs +728 -0
- package/get-shit-done/bin/lib/configuration.cjs +248 -0
- package/get-shit-done/bin/lib/context-utilization.cjs +47 -0
- package/get-shit-done/bin/lib/core.cjs +2121 -0
- package/get-shit-done/bin/lib/decisions.cjs +116 -0
- package/get-shit-done/bin/lib/docs.cjs +270 -0
- package/get-shit-done/bin/lib/drift.cjs +388 -0
- package/get-shit-done/bin/lib/fallow-runner.cjs +109 -0
- package/get-shit-done/bin/lib/frontmatter.cjs +389 -0
- package/get-shit-done/bin/lib/gap-checker.cjs +205 -0
- package/get-shit-done/bin/lib/graphify.cjs +592 -0
- package/get-shit-done/bin/lib/gsd2-import.cjs +514 -0
- package/get-shit-done/bin/lib/init-command-router.cjs +58 -0
- package/get-shit-done/bin/lib/init.cjs +2112 -0
- package/get-shit-done/bin/lib/install-profiles.cjs +603 -0
- package/get-shit-done/bin/lib/installer-migration-authoring.cjs +117 -0
- package/get-shit-done/bin/lib/installer-migration-report.cjs +354 -0
- package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +220 -0
- package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +41 -0
- package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +80 -0
- package/get-shit-done/bin/lib/installer-migrations.cjs +778 -0
- package/get-shit-done/bin/lib/intel.cjs +708 -0
- package/get-shit-done/bin/lib/learnings.cjs +421 -0
- package/get-shit-done/bin/lib/milestone.cjs +314 -0
- package/get-shit-done/bin/lib/model-catalog.cjs +212 -0
- package/get-shit-done/bin/lib/model-profiles.cjs +31 -0
- package/get-shit-done/bin/lib/observability/event.cjs +82 -0
- package/get-shit-done/bin/lib/observability/logger.cjs +174 -0
- package/get-shit-done/bin/lib/observability/redaction.cjs +50 -0
- package/get-shit-done/bin/lib/package-identity.cjs +31 -0
- package/get-shit-done/bin/lib/phase-command-router.cjs +191 -0
- package/get-shit-done/bin/lib/phase-lifecycle.cjs +80 -0
- package/get-shit-done/bin/lib/phase.cjs +1607 -0
- package/get-shit-done/bin/lib/phases-command-router.cjs +39 -0
- package/get-shit-done/bin/lib/plan-scan.cjs +97 -0
- package/get-shit-done/bin/lib/planning-workspace.cjs +238 -0
- package/get-shit-done/bin/lib/profile-output.cjs +1141 -0
- package/get-shit-done/bin/lib/profile-pipeline.cjs +539 -0
- package/get-shit-done/bin/lib/project-root.cjs +112 -0
- package/get-shit-done/bin/lib/prompt-budget.cjs +399 -0
- package/get-shit-done/bin/lib/review-reviewer-selection.cjs +125 -0
- package/get-shit-done/bin/lib/roadmap-command-router.cjs +28 -0
- package/get-shit-done/bin/lib/roadmap.cjs +650 -0
- package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +301 -0
- package/get-shit-done/bin/lib/runtime-homes.cjs +222 -0
- package/get-shit-done/bin/lib/runtime-name-policy.cjs +83 -0
- package/get-shit-done/bin/lib/runtime-slash.cjs +112 -0
- package/get-shit-done/bin/lib/schema-detect.cjs +165 -0
- package/get-shit-done/bin/lib/secrets.cjs +32 -0
- package/get-shit-done/bin/lib/security.cjs +600 -0
- package/get-shit-done/bin/lib/semver-compare.cjs +35 -0
- package/get-shit-done/bin/lib/shell-command-projection.cjs +500 -0
- package/get-shit-done/bin/lib/state-command-router.cjs +252 -0
- package/get-shit-done/bin/lib/state-document.cjs +263 -0
- package/get-shit-done/bin/lib/state.cjs +2038 -0
- package/get-shit-done/bin/lib/surface.cjs +470 -0
- package/get-shit-done/bin/lib/task-command-router.cjs +81 -0
- package/get-shit-done/bin/lib/template.cjs +228 -0
- package/get-shit-done/bin/lib/uat.cjs +289 -0
- package/get-shit-done/bin/lib/update-context.cjs +209 -0
- package/get-shit-done/bin/lib/validate-command-router.cjs +83 -0
- package/get-shit-done/bin/lib/validate.cjs +92 -0
- package/get-shit-done/bin/lib/verify-command-router.cjs +40 -0
- package/get-shit-done/bin/lib/verify.cjs +1511 -0
- package/get-shit-done/bin/lib/workstream-inventory-builder.cjs +74 -0
- package/get-shit-done/bin/lib/workstream-inventory.cjs +146 -0
- package/get-shit-done/bin/lib/workstream-name-policy.cjs +94 -0
- package/get-shit-done/bin/lib/workstream.cjs +389 -0
- package/get-shit-done/bin/lib/worktree-safety.cjs +985 -0
- package/get-shit-done/bin/shared/config-defaults.manifest.json +97 -0
- package/get-shit-done/bin/shared/config-schema.manifest.json +175 -0
- package/get-shit-done/bin/shared/model-catalog.json +122 -0
- package/get-shit-done/bin/shared/runtime-aliases.manifest.json +75 -0
- package/get-shit-done/bin/verify-reapply-patches.cjs +352 -0
- package/get-shit-done/contexts/dev.md +21 -0
- package/get-shit-done/contexts/research.md +22 -0
- package/get-shit-done/contexts/review.md +23 -0
- package/get-shit-done/references/agent-contracts.md +79 -0
- package/get-shit-done/references/ai-evals.md +156 -0
- package/get-shit-done/references/ai-frameworks.md +186 -0
- package/get-shit-done/references/artifact-types.md +131 -0
- package/get-shit-done/references/autonomous-smart-discuss.md +277 -0
- package/get-shit-done/references/checkpoints.md +814 -0
- package/get-shit-done/references/common-bug-patterns.md +114 -0
- package/get-shit-done/references/context-budget.md +85 -0
- package/get-shit-done/references/continuation-format.md +253 -0
- package/get-shit-done/references/debugger-philosophy.md +76 -0
- package/get-shit-done/references/decimal-phase-calculation.md +64 -0
- package/get-shit-done/references/doc-conflict-engine.md +91 -0
- package/get-shit-done/references/domain-probes.md +125 -0
- package/get-shit-done/references/execute-mvp-tdd.md +81 -0
- package/get-shit-done/references/executor-examples.md +110 -0
- package/get-shit-done/references/few-shot-examples/plan-checker.md +73 -0
- package/get-shit-done/references/few-shot-examples/verifier.md +109 -0
- package/get-shit-done/references/gate-prompts.md +100 -0
- package/get-shit-done/references/gates.md +70 -0
- package/get-shit-done/references/git-integration.md +298 -0
- package/get-shit-done/references/git-planning-commit.md +40 -0
- package/get-shit-done/references/ios-scaffold.md +123 -0
- package/get-shit-done/references/mandatory-initial-read.md +2 -0
- package/get-shit-done/references/model-profile-resolution.md +38 -0
- package/get-shit-done/references/model-profiles.md +245 -0
- package/get-shit-done/references/mvp-concepts.md +49 -0
- package/get-shit-done/references/phase-argument-parsing.md +61 -0
- package/get-shit-done/references/planner-antipatterns.md +89 -0
- package/get-shit-done/references/planner-chunked.md +49 -0
- package/get-shit-done/references/planner-gap-closure.md +62 -0
- package/get-shit-done/references/planner-graphify-auto-update.md +67 -0
- package/get-shit-done/references/planner-human-verify-mode.md +57 -0
- package/get-shit-done/references/planner-interface-context.md +62 -0
- package/get-shit-done/references/planner-mvp-mode.md +53 -0
- package/get-shit-done/references/planner-reviews.md +39 -0
- package/get-shit-done/references/planner-revision.md +87 -0
- package/get-shit-done/references/planner-source-audit.md +73 -0
- package/get-shit-done/references/planning-config.md +471 -0
- package/get-shit-done/references/project-skills-discovery.md +19 -0
- package/get-shit-done/references/questioning.md +162 -0
- package/get-shit-done/references/revision-loop.md +97 -0
- package/get-shit-done/references/scout-codebase.md +51 -0
- package/get-shit-done/references/skeleton-template.md +48 -0
- package/get-shit-done/references/sketch-interactivity.md +41 -0
- package/get-shit-done/references/sketch-theme-system.md +94 -0
- package/get-shit-done/references/sketch-tooling.md +45 -0
- package/get-shit-done/references/sketch-variant-patterns.md +81 -0
- package/get-shit-done/references/spidr-splitting.md +69 -0
- package/get-shit-done/references/tdd.md +330 -0
- package/get-shit-done/references/thinking-models-debug.md +44 -0
- package/get-shit-done/references/thinking-models-execution.md +50 -0
- package/get-shit-done/references/thinking-models-planning.md +62 -0
- package/get-shit-done/references/thinking-models-research.md +50 -0
- package/get-shit-done/references/thinking-models-verification.md +55 -0
- package/get-shit-done/references/thinking-partner.md +96 -0
- package/get-shit-done/references/ui-brand.md +160 -0
- package/get-shit-done/references/universal-anti-patterns.md +63 -0
- package/get-shit-done/references/user-profiling.md +681 -0
- package/get-shit-done/references/user-story-template.md +58 -0
- package/get-shit-done/references/verification-overrides.md +227 -0
- package/get-shit-done/references/verification-patterns.md +612 -0
- package/get-shit-done/references/verify-mvp-mode.md +85 -0
- package/get-shit-done/references/workstream-flag.md +111 -0
- package/get-shit-done/references/worktree-path-safety.md +89 -0
- package/get-shit-done/templates/AI-SPEC.md +246 -0
- package/get-shit-done/templates/DEBUG.md +169 -0
- package/get-shit-done/templates/README.md +77 -0
- package/get-shit-done/templates/SECURITY.md +61 -0
- package/get-shit-done/templates/UAT.md +265 -0
- package/get-shit-done/templates/UI-SPEC.md +100 -0
- package/get-shit-done/templates/VALIDATION.md +76 -0
- package/get-shit-done/templates/claude-md.md +145 -0
- package/get-shit-done/templates/codebase/architecture.md +255 -0
- package/get-shit-done/templates/codebase/concerns.md +310 -0
- package/get-shit-done/templates/codebase/conventions.md +307 -0
- package/get-shit-done/templates/codebase/integrations.md +280 -0
- package/get-shit-done/templates/codebase/stack.md +186 -0
- package/get-shit-done/templates/codebase/structure.md +285 -0
- package/get-shit-done/templates/codebase/testing.md +480 -0
- package/get-shit-done/templates/config.json +62 -0
- package/get-shit-done/templates/context.md +352 -0
- package/get-shit-done/templates/continue-here.md +78 -0
- package/get-shit-done/templates/copilot-instructions.md +7 -0
- package/get-shit-done/templates/debug-subagent-prompt.md +91 -0
- package/get-shit-done/templates/dev-preferences.md +21 -0
- package/get-shit-done/templates/discovery.md +146 -0
- package/get-shit-done/templates/discussion-log.md +63 -0
- package/get-shit-done/templates/milestone-archive.md +123 -0
- package/get-shit-done/templates/milestone.md +115 -0
- package/get-shit-done/templates/phase-prompt.md +610 -0
- package/get-shit-done/templates/planner-subagent-prompt.md +117 -0
- package/get-shit-done/templates/project.md +186 -0
- package/get-shit-done/templates/requirements.md +231 -0
- package/get-shit-done/templates/research-project/ARCHITECTURE.md +204 -0
- package/get-shit-done/templates/research-project/FEATURES.md +147 -0
- package/get-shit-done/templates/research-project/PITFALLS.md +200 -0
- package/get-shit-done/templates/research-project/STACK.md +120 -0
- package/get-shit-done/templates/research-project/SUMMARY.md +170 -0
- package/get-shit-done/templates/research.md +592 -0
- package/get-shit-done/templates/retrospective.md +54 -0
- package/get-shit-done/templates/roadmap.md +202 -0
- package/get-shit-done/templates/spec.md +307 -0
- package/get-shit-done/templates/state.md +195 -0
- package/get-shit-done/templates/summary-complex.md +59 -0
- package/get-shit-done/templates/summary-minimal.md +41 -0
- package/get-shit-done/templates/summary-standard.md +48 -0
- package/get-shit-done/templates/summary.md +248 -0
- package/get-shit-done/templates/user-profile.md +146 -0
- package/get-shit-done/templates/user-setup.md +311 -0
- package/get-shit-done/templates/verification-report.md +322 -0
- package/get-shit-done/workflows/_runtime-launcher.snippet.sh +1 -0
- package/get-shit-done/workflows/add-backlog.md +91 -0
- package/get-shit-done/workflows/add-phase.md +113 -0
- package/get-shit-done/workflows/add-tests.md +355 -0
- package/get-shit-done/workflows/add-todo.md +161 -0
- package/get-shit-done/workflows/ai-integration-phase.md +295 -0
- package/get-shit-done/workflows/analyze-dependencies.md +96 -0
- package/get-shit-done/workflows/audit-fix.md +178 -0
- package/get-shit-done/workflows/audit-milestone.md +358 -0
- package/get-shit-done/workflows/audit-uat.md +110 -0
- package/get-shit-done/workflows/autonomous.md +795 -0
- package/get-shit-done/workflows/check-todos.md +180 -0
- package/get-shit-done/workflows/cleanup.md +155 -0
- package/get-shit-done/workflows/code-review-fix.md +502 -0
- package/get-shit-done/workflows/code-review.md +656 -0
- package/get-shit-done/workflows/complete-milestone.md +855 -0
- package/get-shit-done/workflows/debug.md +232 -0
- package/get-shit-done/workflows/diagnose-issues.md +241 -0
- package/get-shit-done/workflows/discovery-phase.md +291 -0
- package/get-shit-done/workflows/discuss-phase/modes/advisor.md +176 -0
- package/get-shit-done/workflows/discuss-phase/modes/all.md +28 -0
- package/get-shit-done/workflows/discuss-phase/modes/analyze.md +44 -0
- package/get-shit-done/workflows/discuss-phase/modes/auto.md +57 -0
- package/get-shit-done/workflows/discuss-phase/modes/batch.md +52 -0
- package/get-shit-done/workflows/discuss-phase/modes/chain.md +98 -0
- package/get-shit-done/workflows/discuss-phase/modes/default.md +141 -0
- package/get-shit-done/workflows/discuss-phase/modes/power.md +44 -0
- package/get-shit-done/workflows/discuss-phase/modes/text.md +55 -0
- package/get-shit-done/workflows/discuss-phase/templates/checkpoint.json +18 -0
- package/get-shit-done/workflows/discuss-phase/templates/context.md +136 -0
- package/get-shit-done/workflows/discuss-phase/templates/discussion-log.md +50 -0
- package/get-shit-done/workflows/discuss-phase-assumptions.md +675 -0
- package/get-shit-done/workflows/discuss-phase-power.md +291 -0
- package/get-shit-done/workflows/discuss-phase.md +499 -0
- package/get-shit-done/workflows/do.md +111 -0
- package/get-shit-done/workflows/docs-update.md +1162 -0
- package/get-shit-done/workflows/edit-phase.md +295 -0
- package/get-shit-done/workflows/eval-review.md +156 -0
- package/get-shit-done/workflows/execute-phase/steps/codebase-drift-gate.md +82 -0
- package/get-shit-done/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
- package/get-shit-done/workflows/execute-phase/steps/post-merge-gate.md +117 -0
- package/get-shit-done/workflows/execute-phase.md +1709 -0
- package/get-shit-done/workflows/execute-plan.md +526 -0
- package/get-shit-done/workflows/explore.md +144 -0
- package/get-shit-done/workflows/extract-learnings.md +243 -0
- package/get-shit-done/workflows/fast.md +124 -0
- package/get-shit-done/workflows/forensics.md +279 -0
- package/get-shit-done/workflows/graduation.md +196 -0
- package/get-shit-done/workflows/health.md +224 -0
- package/get-shit-done/workflows/help/modes/brief.md +22 -0
- package/get-shit-done/workflows/help/modes/default.md +50 -0
- package/get-shit-done/workflows/help/modes/full.md +784 -0
- package/get-shit-done/workflows/help/modes/topic.md +74 -0
- package/get-shit-done/workflows/help.md +24 -0
- package/get-shit-done/workflows/import.md +254 -0
- package/get-shit-done/workflows/inbox.md +387 -0
- package/get-shit-done/workflows/ingest-docs.md +339 -0
- package/get-shit-done/workflows/insert-phase.md +152 -0
- package/get-shit-done/workflows/list-phase-assumptions.md +178 -0
- package/get-shit-done/workflows/list-workspaces.md +57 -0
- package/get-shit-done/workflows/manager.md +393 -0
- package/get-shit-done/workflows/map-codebase.md +444 -0
- package/get-shit-done/workflows/milestone-summary.md +224 -0
- package/get-shit-done/workflows/mvp-phase.md +222 -0
- package/get-shit-done/workflows/new-milestone.md +635 -0
- package/get-shit-done/workflows/new-project.md +1555 -0
- package/get-shit-done/workflows/new-workspace.md +240 -0
- package/get-shit-done/workflows/next.md +299 -0
- package/get-shit-done/workflows/node-repair.md +92 -0
- package/get-shit-done/workflows/note.md +158 -0
- package/get-shit-done/workflows/pause-work.md +244 -0
- package/get-shit-done/workflows/plan-milestone-gaps.md +281 -0
- package/get-shit-done/workflows/plan-phase.md +1809 -0
- package/get-shit-done/workflows/plan-review-convergence.md +346 -0
- package/get-shit-done/workflows/plant-seed.md +230 -0
- package/get-shit-done/workflows/pr-branch.md +157 -0
- package/get-shit-done/workflows/profile-user.md +453 -0
- package/get-shit-done/workflows/progress.md +699 -0
- package/get-shit-done/workflows/quick.md +1039 -0
- package/get-shit-done/workflows/reapply-patches.md +426 -0
- package/get-shit-done/workflows/remove-phase.md +156 -0
- package/get-shit-done/workflows/remove-workspace.md +108 -0
- package/get-shit-done/workflows/resume-project.md +332 -0
- package/get-shit-done/workflows/review.md +623 -0
- package/get-shit-done/workflows/scan.md +105 -0
- package/get-shit-done/workflows/secure-phase.md +180 -0
- package/get-shit-done/workflows/session-report.md +146 -0
- package/get-shit-done/workflows/settings-advanced.md +620 -0
- package/get-shit-done/workflows/settings-integrations.md +312 -0
- package/get-shit-done/workflows/settings.md +552 -0
- package/get-shit-done/workflows/ship.md +356 -0
- package/get-shit-done/workflows/sketch-wrap-up.md +286 -0
- package/get-shit-done/workflows/sketch.md +361 -0
- package/get-shit-done/workflows/spec-phase.md +262 -0
- package/get-shit-done/workflows/spike-wrap-up.md +307 -0
- package/get-shit-done/workflows/spike.md +453 -0
- package/get-shit-done/workflows/stats.md +80 -0
- package/get-shit-done/workflows/sync-skills.md +182 -0
- package/get-shit-done/workflows/thread.md +222 -0
- package/get-shit-done/workflows/transition.md +694 -0
- package/get-shit-done/workflows/ui-phase.md +328 -0
- package/get-shit-done/workflows/ui-review.md +193 -0
- package/get-shit-done/workflows/ultraplan-phase.md +199 -0
- package/get-shit-done/workflows/undo.md +314 -0
- package/get-shit-done/workflows/update.md +443 -0
- package/get-shit-done/workflows/validate-phase.md +179 -0
- package/get-shit-done/workflows/verify-phase.md +544 -0
- package/get-shit-done/workflows/verify-work.md +781 -0
- package/hooks/dist/gsd-check-update-worker.js +95 -0
- package/hooks/dist/gsd-check-update.js +64 -0
- package/hooks/dist/gsd-context-monitor.js +195 -0
- package/hooks/dist/gsd-graphify-update.sh +158 -0
- package/hooks/dist/gsd-phase-boundary.sh +47 -0
- package/hooks/dist/gsd-prompt-guard.js +97 -0
- package/hooks/dist/gsd-read-guard.js +101 -0
- package/hooks/dist/gsd-read-injection-scanner.js +203 -0
- package/hooks/dist/gsd-session-state.sh +59 -0
- package/hooks/dist/gsd-statusline.js +548 -0
- package/hooks/dist/gsd-update-banner.js +134 -0
- package/hooks/dist/gsd-validate-commit.sh +57 -0
- package/hooks/dist/gsd-workflow-guard.js +166 -0
- package/hooks/dist/lib/git-cmd.js +150 -0
- package/hooks/dist/lib/gsd-graphify-rebuild.sh +65 -0
- package/hooks/gsd-check-update-worker.js +95 -0
- package/hooks/gsd-check-update.js +64 -0
- package/hooks/gsd-context-monitor.js +195 -0
- package/hooks/gsd-graphify-update.sh +158 -0
- package/hooks/gsd-phase-boundary.sh +47 -0
- package/hooks/gsd-prompt-guard.js +97 -0
- package/hooks/gsd-read-guard.js +101 -0
- package/hooks/gsd-read-injection-scanner.js +203 -0
- package/hooks/gsd-session-state.sh +59 -0
- package/hooks/gsd-statusline.js +548 -0
- package/hooks/gsd-update-banner.js +134 -0
- package/hooks/gsd-validate-commit.sh +57 -0
- package/hooks/gsd-workflow-guard.js +166 -0
- package/hooks/lib/git-cmd.js +150 -0
- package/hooks/lib/gsd-graphify-rebuild.sh +65 -0
- package/hooks/managed-hooks-registry.cjs +34 -0
- package/package.json +102 -0
- package/scripts/affected-tests-lib.cjs +541 -0
- package/scripts/audit-workflow-script-paths.cjs +73 -0
- package/scripts/base64-scan.sh +339 -0
- package/scripts/build-hooks.js +236 -0
- package/scripts/changeset/README.md +129 -0
- package/scripts/changeset/cli.cjs +392 -0
- package/scripts/changeset/github-release-notes.cjs +199 -0
- package/scripts/changeset/lint.cjs +110 -0
- package/scripts/changeset/new.cjs +137 -0
- package/scripts/changeset/parse.cjs +114 -0
- package/scripts/changeset/render.cjs +34 -0
- package/scripts/changeset/serialize.cjs +130 -0
- package/scripts/check-alias-drift.cjs +108 -0
- package/scripts/check-env.cjs +302 -0
- package/scripts/check-npm-integrity.cjs +209 -0
- package/scripts/ci-guard-runner.cjs +16 -0
- package/scripts/ci-prepare-test-scope.cjs +46 -0
- package/scripts/ci-rebase-check.cjs +85 -0
- package/scripts/ci-test-scope.cjs +302 -0
- package/scripts/command-contract-helpers.cjs +64 -0
- package/scripts/diff-touches-shipped-paths.cjs +147 -0
- package/scripts/fix-slash-commands.cjs +147 -0
- package/scripts/gen-inventory-manifest.cjs +109 -0
- package/scripts/generate-package-identity.cjs +104 -0
- package/scripts/lint-command-contract.cjs +108 -0
- package/scripts/lint-descriptions.cjs +83 -0
- package/scripts/lint-docs-required.cjs +222 -0
- package/scripts/lint-no-source-grep-extras.cjs +81 -0
- package/scripts/lint-no-source-grep.cjs +174 -0
- package/scripts/lint-package-identity-drift.cjs +141 -0
- package/scripts/lint-pr-check-project-dir.cjs +98 -0
- package/scripts/lint-shared-module-handsync.cjs +388 -0
- package/scripts/lint-shell-command-projection-drift.cjs +57 -0
- package/scripts/lint-skill-deps.cjs +180 -0
- package/scripts/lint-test-file-count.allowlist.json +36 -0
- package/scripts/lint-test-file-count.cjs +190 -0
- package/scripts/pr-template-policy.cjs +268 -0
- package/scripts/prompt-injection-scan.sh +203 -0
- package/scripts/release-tarball-smoke.cjs +627 -0
- package/scripts/run-affected-tests.cjs +6 -0
- package/scripts/run-cross-platform-tests.cjs +63 -0
- package/scripts/run-tests.cjs +282 -0
- package/scripts/secret-scan-lint.sh +231 -0
- package/scripts/secret-scan.sh +358 -0
- package/scripts/setup-branch-protection.sh +236 -0
- package/scripts/shared-module-handsync-allowlist.json +183 -0
- package/scripts/strip-prose-atrefs.cjs +106 -0
- package/scripts/sync-rulesets.sh +34 -0
- package/scripts/sync-runtime-launcher.cjs +402 -0
- package/scripts/test-failure-reasons.cjs +34 -0
- package/scripts/workflow-policy.cjs +450 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# changeset/ — release-notes tooling
|
|
2
|
+
|
|
3
|
+
This directory holds the scripts that turn per-PR fragments in [`.changeset/`](../../.changeset/README.md)
|
|
4
|
+
and git history into the project's `CHANGELOG.md` and GitHub release notes.
|
|
5
|
+
|
|
6
|
+
The entry point is `cli.cjs`. It exposes three subcommands:
|
|
7
|
+
|
|
8
|
+
| Subcommand | Purpose |
|
|
9
|
+
|---|---|
|
|
10
|
+
| `render` | Render a single version's changelog section from consolidated data. |
|
|
11
|
+
| `github-release-notes` | Build GitHub release-notes body for a ref range. |
|
|
12
|
+
| `extract` | Pull existing `CHANGELOG.md` entries that fall in a version range. |
|
|
13
|
+
|
|
14
|
+
The rest of this document specifies the **`extract`** contract, because it is the
|
|
15
|
+
surface most likely to be called by external tooling (CI workflows, npm scripts,
|
|
16
|
+
release automation) that needs a stable exit-code and output guarantee to code
|
|
17
|
+
against.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## `cli.cjs extract`
|
|
22
|
+
|
|
23
|
+
Extract the changelog entries for every release in a version range, reading from
|
|
24
|
+
an existing `CHANGELOG.md`. The range is **`--from` exclusive, `--to` inclusive**.
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
node scripts/changeset/cli.cjs extract --from VERSION --to VERSION \
|
|
28
|
+
[--changelog FILE] [--repo <dir>] [--json]
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Flags
|
|
32
|
+
|
|
33
|
+
| Flag | Required | Description |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| `--from VERSION` | Yes | Lower bound, **exclusive** — entries equal to `--from` are not returned. |
|
|
36
|
+
| `--to VERSION` | Yes | Upper bound, **inclusive** — entries equal to `--to` are returned. |
|
|
37
|
+
| `--changelog FILE` | No | Path to the changelog to read. Defaults to `<repo>/CHANGELOG.md`. |
|
|
38
|
+
| `--repo <dir>` | No | Repo root used to locate `CHANGELOG.md` when `--changelog` is omitted. Defaults to the current working directory. |
|
|
39
|
+
| `--json` | No | Emit the structured report as JSON instead of rendered markdown. |
|
|
40
|
+
|
|
41
|
+
### Version validation
|
|
42
|
+
|
|
43
|
+
Both `--from` and `--to` must be **stable triplet semver** — `MAJOR.MINOR.PATCH`,
|
|
44
|
+
digits only.
|
|
45
|
+
|
|
46
|
+
- A leading `v` is accepted and stripped: `v1.42.0` is treated as `1.42.0`.
|
|
47
|
+
- Pre-release and build suffixes are **rejected**: `1.42.0-rc.1`, `1.42.0+build`,
|
|
48
|
+
and partial versions like `1.42.x` all fail validation and exit `1`.
|
|
49
|
+
|
|
50
|
+
Strict validation is deliberate. Coercing a malformed bound such as `1.42.x` to
|
|
51
|
+
`1.42.0` would silently change which releases the range selects, so a malformed
|
|
52
|
+
bound is rejected early with a structured error rather than guessed at.
|
|
53
|
+
|
|
54
|
+
Changelog entries that are themselves pre-release or non-semver (and the
|
|
55
|
+
`Unreleased` section) are skipped during matching; a notice for each skipped
|
|
56
|
+
entry is written to stderr.
|
|
57
|
+
|
|
58
|
+
### Exit codes
|
|
59
|
+
|
|
60
|
+
`extract` resolves to one of three exit codes. The output shape depends on
|
|
61
|
+
whether `--json` is passed.
|
|
62
|
+
|
|
63
|
+
| Exit | Meaning | Default stdout | `--json` stdout |
|
|
64
|
+
|---|---|---|---|
|
|
65
|
+
| `0` | One or more releases fall in the range. | Rendered markdown for the matched releases. | `{ "releases": [ ... ], "from": "...", "to": "..." }` |
|
|
66
|
+
| `1` | Bad input: `--from`/`--to` is not stable semver, a required flag is missing, or the changelog file was not found. | Nothing (a missing-flag error and usage go to stderr). | `{ "error": "<message>", "releases": [] }` |
|
|
67
|
+
| `2` | Bounds are valid but no release falls in the range. | A `no releases found in range` notice on stderr. | `{ "releases": [], "from": "...", "to": "..." }` |
|
|
68
|
+
|
|
69
|
+
Notes for callers:
|
|
70
|
+
|
|
71
|
+
- **Treat exit `2` as "empty range", not "failure".** For a well-formed
|
|
72
|
+
invocation it means the request was understood and simply matched nothing — do
|
|
73
|
+
not surface it as an error. (At the argument-parsing layer, malformed argv such
|
|
74
|
+
as an unknown flag also exits `2`; pass well-formed arguments and this overlap
|
|
75
|
+
does not arise.)
|
|
76
|
+
- **In default (text) mode, a failure is signalled by the exit code alone** —
|
|
77
|
+
exit `1` from invalid semver or a missing changelog writes nothing to stdout.
|
|
78
|
+
Machine consumers should pass `--json` to receive the `error` field.
|
|
79
|
+
|
|
80
|
+
### Output shape
|
|
81
|
+
|
|
82
|
+
With `--json`, the report is pretty-printed JSON. The `releases` array contains
|
|
83
|
+
one object per matched release (version, date, and parsed sections); `from` and
|
|
84
|
+
`to` echo the normalized bounds. On exit `1`, `releases` is empty and an `error`
|
|
85
|
+
string describes the failure.
|
|
86
|
+
|
|
87
|
+
Without `--json`, exit `0` prints the matched releases as markdown, ready to
|
|
88
|
+
paste into release notes:
|
|
89
|
+
|
|
90
|
+
```text
|
|
91
|
+
## [1.42.0] - 2026-01-15
|
|
92
|
+
|
|
93
|
+
### Added
|
|
94
|
+
|
|
95
|
+
- New `--json` flag on the extract command (#3796)
|
|
96
|
+
|
|
97
|
+
### Fixed
|
|
98
|
+
|
|
99
|
+
- Trailing-slash handling in config paths (#3651)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Examples
|
|
103
|
+
|
|
104
|
+
Extract everything released after `1.41.0` up to and including `1.42.0`:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
node scripts/changeset/cli.cjs extract --from 1.41.0 --to 1.42.0
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
The same range as structured JSON, reading an explicit changelog file:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
node scripts/changeset/cli.cjs extract \
|
|
114
|
+
--from v1.41.0 --to v1.42.0 \
|
|
115
|
+
--changelog ./CHANGELOG.md --json
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Handle the three outcomes in a shell consumer:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
if out=$(node scripts/changeset/cli.cjs extract --from "$FROM" --to "$TO" --json); then
|
|
122
|
+
echo "$out" # exit 0 — releases found
|
|
123
|
+
else
|
|
124
|
+
case $? in
|
|
125
|
+
2) echo "no releases in range — nothing to publish" ;; # not an error
|
|
126
|
+
*) echo "extract failed: $out" >&2; exit 1 ;; # exit 1 — bad input
|
|
127
|
+
esac
|
|
128
|
+
fi
|
|
129
|
+
```
|
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* CLI wrapper for the changeset-fragment workflow (#2975).
|
|
6
|
+
*
|
|
7
|
+
* Subcommands:
|
|
8
|
+
* render --repo <dir> --version V --date D [--json] Fold .changeset/*.md
|
|
9
|
+
* into CHANGELOG.md;
|
|
10
|
+
* delete consumed fragments.
|
|
11
|
+
*
|
|
12
|
+
* `--json` emits a structured report on stdout — the only contract tests
|
|
13
|
+
* assert against. Per CONTRIBUTING.md "Prohibited: Raw Text Matching on
|
|
14
|
+
* Test Outputs", the human formatter is operator-only.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
const fs = require('node:fs');
|
|
18
|
+
const path = require('node:path');
|
|
19
|
+
|
|
20
|
+
const { parseFragment, FRAGMENT_ERROR } = require('./parse.cjs');
|
|
21
|
+
const { renderChangelog } = require('./render.cjs');
|
|
22
|
+
const { serializeChangelog, parseChangelog } = require('./serialize.cjs');
|
|
23
|
+
const { renderGithubReleaseNotes } = require('./github-release-notes.cjs');
|
|
24
|
+
const {
|
|
25
|
+
compareSemverCore,
|
|
26
|
+
isStableTripletSemver,
|
|
27
|
+
} = require('../../get-shit-done/bin/lib/semver-compare.cjs');
|
|
28
|
+
const { packageName, repoSlug: defaultRepoSlug } = require('../../get-shit-done/bin/lib/package-identity.cjs');
|
|
29
|
+
|
|
30
|
+
function parseArgs(argv) {
|
|
31
|
+
const opts = {
|
|
32
|
+
cmd: null,
|
|
33
|
+
repo: process.cwd(),
|
|
34
|
+
version: null,
|
|
35
|
+
date: null,
|
|
36
|
+
fromRef: null,
|
|
37
|
+
toRef: null,
|
|
38
|
+
changelog: null,
|
|
39
|
+
output: null,
|
|
40
|
+
repoSlug: defaultRepoSlug,
|
|
41
|
+
installCommand: `npx ${packageName}@latest`,
|
|
42
|
+
json: false,
|
|
43
|
+
};
|
|
44
|
+
if (argv.length === 0) return { ok: true, opts };
|
|
45
|
+
opts.cmd = argv[0];
|
|
46
|
+
|
|
47
|
+
// Pull a value for a value-taking flag, validating that the next token
|
|
48
|
+
// exists and is not itself another flag (which is the silently-misparsed
|
|
49
|
+
// case CR called out: e.g. `--repo --json` would consume `--json` as the
|
|
50
|
+
// repo path).
|
|
51
|
+
const requireValue = (flag, i) => {
|
|
52
|
+
const v = argv[i + 1];
|
|
53
|
+
if (v === undefined || v.startsWith('--')) {
|
|
54
|
+
return { ok: false, error: `missing value for ${flag}` };
|
|
55
|
+
}
|
|
56
|
+
return { ok: true, value: v };
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
for (let i = 1; i < argv.length; i++) {
|
|
60
|
+
const a = argv[i];
|
|
61
|
+
if (a === '--json') { opts.json = true; continue; }
|
|
62
|
+
if (
|
|
63
|
+
a === '--repo' ||
|
|
64
|
+
a === '--version' ||
|
|
65
|
+
a === '--date' ||
|
|
66
|
+
a === '--from' ||
|
|
67
|
+
a === '--to' ||
|
|
68
|
+
a === '--changelog' ||
|
|
69
|
+
a === '--output' ||
|
|
70
|
+
a === '--repo-slug' ||
|
|
71
|
+
a === '--install-command'
|
|
72
|
+
) {
|
|
73
|
+
const r = requireValue(a, i);
|
|
74
|
+
if (!r.ok) return { ok: false, error: r.error };
|
|
75
|
+
if (a === '--repo') opts.repo = r.value;
|
|
76
|
+
else if (a === '--version') opts.version = r.value;
|
|
77
|
+
else if (a === '--date') opts.date = r.value;
|
|
78
|
+
else if (a === '--from') opts.fromRef = r.value;
|
|
79
|
+
else if (a === '--to') opts.toRef = r.value;
|
|
80
|
+
else if (a === '--changelog') opts.changelog = r.value;
|
|
81
|
+
else if (a === '--output') opts.output = r.value;
|
|
82
|
+
else if (a === '--repo-slug') opts.repoSlug = r.value;
|
|
83
|
+
else if (a === '--install-command') opts.installCommand = r.value;
|
|
84
|
+
i++;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
return { ok: false, error: `unknown argument: ${a}` };
|
|
88
|
+
}
|
|
89
|
+
return { ok: true, opts };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function listFragmentFiles(changesetDir) {
|
|
93
|
+
if (!fs.existsSync(changesetDir)) return [];
|
|
94
|
+
return fs.readdirSync(changesetDir)
|
|
95
|
+
.filter((f) => f.endsWith('.md') && f !== 'README.md')
|
|
96
|
+
.map((f) => path.join(changesetDir, f));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function splitChangelog(text) {
|
|
100
|
+
// Split off the top-level "# Changelog" heading + lead matter (everything
|
|
101
|
+
// before the first "## [version]" block) from the rest. The rest is the
|
|
102
|
+
// priorChangelog passed into renderChangelog. The "## [Unreleased]" block,
|
|
103
|
+
// if present, is dropped (the new release replaces it).
|
|
104
|
+
const lines = text.split(/\r?\n/);
|
|
105
|
+
const firstReleaseIdx = lines.findIndex((l) => /^##\s+\[/.test(l));
|
|
106
|
+
if (firstReleaseIdx === -1) {
|
|
107
|
+
return { lead: text.replace(/\s+$/, ''), prior: '' };
|
|
108
|
+
}
|
|
109
|
+
const lead = lines.slice(0, firstReleaseIdx).join('\n').replace(/\s+$/, '');
|
|
110
|
+
let priorStart = firstReleaseIdx;
|
|
111
|
+
// Skip the [Unreleased] block if present — it's a placeholder, not a release.
|
|
112
|
+
if (/^##\s+\[Unreleased\]/i.test(lines[firstReleaseIdx])) {
|
|
113
|
+
let j = firstReleaseIdx + 1;
|
|
114
|
+
while (j < lines.length && !/^##\s+\[/.test(lines[j])) j++;
|
|
115
|
+
priorStart = j;
|
|
116
|
+
}
|
|
117
|
+
const prior = lines.slice(priorStart).join('\n').trimStart();
|
|
118
|
+
return { lead, prior };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function cmdRender(opts) {
|
|
122
|
+
const repo = path.resolve(opts.repo);
|
|
123
|
+
const changesetDir = path.join(repo, '.changeset');
|
|
124
|
+
const changelogPath = path.join(repo, 'CHANGELOG.md');
|
|
125
|
+
const fragmentFiles = listFragmentFiles(changesetDir);
|
|
126
|
+
|
|
127
|
+
const fragments = [];
|
|
128
|
+
const failures = [];
|
|
129
|
+
for (const file of fragmentFiles) {
|
|
130
|
+
const src = fs.readFileSync(file, 'utf8');
|
|
131
|
+
const r = parseFragment(src);
|
|
132
|
+
if (r.ok) fragments.push({ ...r.fragment, file });
|
|
133
|
+
else failures.push({ file: path.relative(repo, file), reason: r.reason, detail: r.detail || null });
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (failures.length > 0) {
|
|
137
|
+
return { exitCode: 1, report: { consumed: 0, failures } };
|
|
138
|
+
}
|
|
139
|
+
if (fragments.length === 0) {
|
|
140
|
+
return { exitCode: 0, report: { consumed: 0, failures: [] } };
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const priorText = fs.existsSync(changelogPath) ? fs.readFileSync(changelogPath, 'utf8') : '';
|
|
144
|
+
const { lead, prior } = splitChangelog(priorText);
|
|
145
|
+
|
|
146
|
+
const ir = renderChangelog({
|
|
147
|
+
fragments,
|
|
148
|
+
version: opts.version,
|
|
149
|
+
date: opts.date,
|
|
150
|
+
priorChangelog: prior || null,
|
|
151
|
+
});
|
|
152
|
+
const releaseBlock = serializeChangelog(ir);
|
|
153
|
+
const out = [
|
|
154
|
+
lead || '# Changelog',
|
|
155
|
+
'',
|
|
156
|
+
'## [Unreleased]',
|
|
157
|
+
'',
|
|
158
|
+
releaseBlock.replace(/\s+$/, ''),
|
|
159
|
+
'',
|
|
160
|
+
].join('\n');
|
|
161
|
+
|
|
162
|
+
fs.writeFileSync(changelogPath, out);
|
|
163
|
+
|
|
164
|
+
// Delete consumed fragments. If any unlink fails the changelog is written
|
|
165
|
+
// but the fragment is still on disk, so a re-run would double-consume it.
|
|
166
|
+
// Surface the partial-failure as exitCode=1 with structured detail so the
|
|
167
|
+
// operator can manually clean up before retrying.
|
|
168
|
+
const deleteFailures = [];
|
|
169
|
+
for (const f of fragments) {
|
|
170
|
+
try {
|
|
171
|
+
fs.unlinkSync(f.file);
|
|
172
|
+
} catch (e) {
|
|
173
|
+
deleteFailures.push({
|
|
174
|
+
file: path.relative(repo, f.file),
|
|
175
|
+
reason: 'fail_fragment_delete',
|
|
176
|
+
detail: e.code || e.message,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return {
|
|
182
|
+
exitCode: deleteFailures.length > 0 ? 1 : 0,
|
|
183
|
+
report: {
|
|
184
|
+
consumed: fragments.length - deleteFailures.length,
|
|
185
|
+
failures: deleteFailures,
|
|
186
|
+
release: { version: opts.version, date: opts.date },
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* extract subcommand: extracts all changelog release blocks strictly after
|
|
193
|
+
* `--from` (exclusive) up to and including `--to` (inclusive). Both
|
|
194
|
+
* arguments accept `v`-prefixed semver (e.g. `v1.5.13`).
|
|
195
|
+
*
|
|
196
|
+
* Exit codes:
|
|
197
|
+
* 0 — one or more releases matched, output written.
|
|
198
|
+
* 2 — no releases fall in the specified range (matches nothing).
|
|
199
|
+
* 1 — I/O error or missing required flags.
|
|
200
|
+
*
|
|
201
|
+
* Fix for #3496: provides a deterministic range-aware helper so the
|
|
202
|
+
* `/gsd:update` show_changes_and_confirm step no longer relies on
|
|
203
|
+
* vague/manual extraction that can silently skip intermediate versions.
|
|
204
|
+
*/
|
|
205
|
+
function cmdExtract(opts) {
|
|
206
|
+
const stripV = (v) => (typeof v === 'string' ? v.replace(/^v/, '') : v);
|
|
207
|
+
const from = stripV(opts.fromRef);
|
|
208
|
+
const to = stripV(opts.toRef);
|
|
209
|
+
|
|
210
|
+
// Validate that both bounds are strict semver (N.N.N, digits only).
|
|
211
|
+
// Coercing a malformed bound like "1.41.x" to "1.41.0" makes range
|
|
212
|
+
// selection silently wrong; reject early with a structured error.
|
|
213
|
+
if (!isStableTripletSemver(from)) {
|
|
214
|
+
return {
|
|
215
|
+
exitCode: 1,
|
|
216
|
+
report: { error: `invalid semver for --from: "${from}" (expected N.N.N)`, releases: [] },
|
|
217
|
+
textOutput: null,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
if (!isStableTripletSemver(to)) {
|
|
221
|
+
return {
|
|
222
|
+
exitCode: 1,
|
|
223
|
+
report: { error: `invalid semver for --to: "${to}" (expected N.N.N)`, releases: [] },
|
|
224
|
+
textOutput: null,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const changelogPath = opts.changelog
|
|
229
|
+
? path.resolve(opts.changelog)
|
|
230
|
+
: path.join(path.resolve(opts.repo), 'CHANGELOG.md');
|
|
231
|
+
|
|
232
|
+
if (!fs.existsSync(changelogPath)) {
|
|
233
|
+
return {
|
|
234
|
+
exitCode: 1,
|
|
235
|
+
report: { error: `CHANGELOG not found: ${changelogPath}`, releases: [] },
|
|
236
|
+
textOutput: null,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const text = fs.readFileSync(changelogPath, 'utf8');
|
|
241
|
+
const { releases } = parseChangelog(text);
|
|
242
|
+
|
|
243
|
+
const matched = releases.filter((rel) => {
|
|
244
|
+
if (rel.version === 'Unreleased') return false;
|
|
245
|
+
// Extract mode intentionally operates on stable releases only.
|
|
246
|
+
if (!isStableTripletSemver(rel.version)) {
|
|
247
|
+
process.stderr.write(`[extract] skipping pre-release/non-semver entry: ${rel.version}\n`);
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
// from is exclusive: cmp > 0 means rel.version > from
|
|
251
|
+
const afterFrom = compareSemverCore(rel.version, from) > 0;
|
|
252
|
+
// to is inclusive: cmp <= 0 means rel.version <= to
|
|
253
|
+
const upToTo = compareSemverCore(rel.version, to) <= 0;
|
|
254
|
+
return afterFrom && upToTo;
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
if (matched.length === 0) {
|
|
258
|
+
return {
|
|
259
|
+
exitCode: 2,
|
|
260
|
+
report: { releases: [], from, to },
|
|
261
|
+
textOutput: null,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
return {
|
|
266
|
+
exitCode: 0,
|
|
267
|
+
report: { releases: matched, from, to },
|
|
268
|
+
textOutput: matched
|
|
269
|
+
.map((rel) => {
|
|
270
|
+
const header = `## [${rel.version}]${rel.date ? ` - ${rel.date}` : ''}`;
|
|
271
|
+
const sections = (rel.sections || [])
|
|
272
|
+
.map((s) => {
|
|
273
|
+
const bullets = s.bullets
|
|
274
|
+
.map((b) => (b.pr !== null ? `- ${b.body} (#${b.pr})` : `- ${b.body}`))
|
|
275
|
+
.join('\n');
|
|
276
|
+
return `### ${s.type}\n\n${bullets}`;
|
|
277
|
+
})
|
|
278
|
+
.join('\n\n');
|
|
279
|
+
return sections ? `${header}\n\n${sections}` : header;
|
|
280
|
+
})
|
|
281
|
+
.join('\n\n'),
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
function cmdGithubReleaseNotes(opts) {
|
|
286
|
+
const repo = path.resolve(opts.repo);
|
|
287
|
+
const report = renderGithubReleaseNotes({
|
|
288
|
+
repo,
|
|
289
|
+
fromRef: opts.fromRef,
|
|
290
|
+
toRef: opts.toRef,
|
|
291
|
+
repoSlug: opts.repoSlug,
|
|
292
|
+
installCommand: opts.installCommand,
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
if (!report.ok) {
|
|
296
|
+
return {
|
|
297
|
+
exitCode: 1,
|
|
298
|
+
report: {
|
|
299
|
+
consumed: 0,
|
|
300
|
+
failures: report.failures,
|
|
301
|
+
release: { from: opts.fromRef, to: opts.toRef },
|
|
302
|
+
},
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (opts.output) {
|
|
307
|
+
fs.writeFileSync(path.resolve(opts.output), report.body);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
return {
|
|
311
|
+
exitCode: 0,
|
|
312
|
+
report: {
|
|
313
|
+
consumed: report.fragments.length,
|
|
314
|
+
failures: [],
|
|
315
|
+
release: { from: opts.fromRef, to: opts.toRef },
|
|
316
|
+
output: opts.output || null,
|
|
317
|
+
body: opts.output ? null : report.body,
|
|
318
|
+
},
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function usage() {
|
|
323
|
+
return [
|
|
324
|
+
'usage:',
|
|
325
|
+
' changeset/cli.cjs render --repo <dir> --version V --date D [--json]',
|
|
326
|
+
' changeset/cli.cjs github-release-notes --repo <dir> --from REF --to REF [--output FILE] [--repo-slug OWNER/REPO] [--install-command CMD] [--json]',
|
|
327
|
+
' changeset/cli.cjs extract --from VERSION --to VERSION [--changelog FILE] [--repo <dir>] [--json]',
|
|
328
|
+
' Extracts changelog entries strictly after --from (exclusive) and up to',
|
|
329
|
+
' and including --to (inclusive). Accepts v-prefixed versions.',
|
|
330
|
+
' Exit 2 when no releases fall in range.',
|
|
331
|
+
'',
|
|
332
|
+
].join('\n');
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function main() {
|
|
336
|
+
const parsed = parseArgs(process.argv.slice(2));
|
|
337
|
+
if (!parsed.ok) {
|
|
338
|
+
process.stderr.write(`${parsed.error}\n`);
|
|
339
|
+
process.stderr.write(usage());
|
|
340
|
+
process.exit(2);
|
|
341
|
+
}
|
|
342
|
+
const { opts } = parsed;
|
|
343
|
+
if (opts.cmd !== 'render' && opts.cmd !== 'github-release-notes' && opts.cmd !== 'extract') {
|
|
344
|
+
process.stderr.write(usage());
|
|
345
|
+
process.exit(1);
|
|
346
|
+
}
|
|
347
|
+
if (opts.cmd === 'render' && (!opts.version || !opts.date)) {
|
|
348
|
+
process.stderr.write('--version and --date are required for render\n');
|
|
349
|
+
process.exit(2);
|
|
350
|
+
}
|
|
351
|
+
if (opts.cmd === 'github-release-notes' && (!opts.fromRef || !opts.toRef)) {
|
|
352
|
+
process.stderr.write('--from and --to are required for github-release-notes\n');
|
|
353
|
+
process.exit(2);
|
|
354
|
+
}
|
|
355
|
+
if (opts.cmd === 'extract' && (!opts.fromRef || !opts.toRef)) {
|
|
356
|
+
process.stderr.write('--from and --to are required for extract\n');
|
|
357
|
+
process.stderr.write(usage());
|
|
358
|
+
process.exit(1);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
if (opts.cmd === 'extract') {
|
|
362
|
+
const { exitCode, report, textOutput } = cmdExtract(opts);
|
|
363
|
+
if (opts.json) {
|
|
364
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
365
|
+
} else if (textOutput) {
|
|
366
|
+
process.stdout.write(textOutput + '\n');
|
|
367
|
+
} else if (exitCode === 2) {
|
|
368
|
+
process.stderr.write(`no releases found in range (from=${report.from}, to=${report.to})\n`);
|
|
369
|
+
}
|
|
370
|
+
process.exit(exitCode);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const { exitCode, report } = opts.cmd === 'render' ? cmdRender(opts) : cmdGithubReleaseNotes(opts);
|
|
374
|
+
if (opts.json) {
|
|
375
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
376
|
+
} else if (opts.cmd === 'github-release-notes' && report.body) {
|
|
377
|
+
process.stdout.write(report.body);
|
|
378
|
+
} else {
|
|
379
|
+
process.stdout.write(`Consumed: ${report.consumed} fragment(s)\n`);
|
|
380
|
+
if (report.failures.length > 0) {
|
|
381
|
+
process.stdout.write(`Failures: ${report.failures.length}\n`);
|
|
382
|
+
for (const f of report.failures) {
|
|
383
|
+
process.stdout.write(` ${f.file}: ${f.reason}${f.detail ? ` (${f.detail})` : ''}\n`);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
process.exit(exitCode);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
if (require.main === module) main();
|
|
391
|
+
|
|
392
|
+
module.exports = { cmdRender, cmdExtract, cmdGithubReleaseNotes, parseArgs, splitChangelog, listFragmentFiles, usage };
|