create-quiver 0.15.4 → 0.16.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.
Files changed (179) hide show
  1. package/.github/pull_request_template.md +17 -0
  2. package/.github/workflows/ci.yml +76 -0
  3. package/.markdown-link-check.json +15 -0
  4. package/.markdownlint.json +11 -0
  5. package/.quiver/runs/run-2026-06-09t19-14-39z/approvals.json +5 -0
  6. package/.quiver/runs/run-2026-06-09t19-14-39z/decisions.md +2 -0
  7. package/.quiver/runs/run-2026-06-09t19-14-39z/requirement.md +0 -0
  8. package/.quiver/runs/run-2026-06-09t19-14-39z/snapshots/20260609T191439Z/docs/INDEX.md +97 -0
  9. package/.quiver/runs/run-2026-06-09t19-14-39z/snapshots/20260609T191439Z/manifest.json +61 -0
  10. package/.quiver/runs/run-2026-06-09t19-14-39z/state.json +28 -0
  11. package/ACTIVE_SLICES.md +43 -0
  12. package/ARCHITECTURE.md +133 -0
  13. package/CHANGELOG.md +12 -0
  14. package/CONTRIBUTING.md +174 -9
  15. package/README.md +10 -1
  16. package/ROADMAP.md +4 -0
  17. package/SECURITY.md +9 -2
  18. package/auditoria-ux-ui-performance-documentacion.md +705 -0
  19. package/copys-landing-page.md +244 -0
  20. package/docs/AI_CONTEXT.md.es.template +3 -1
  21. package/docs/AI_CONTEXT.md.template +3 -1
  22. package/docs/CLI_UX_GUIDE.md +9 -1
  23. package/docs/COMMANDS.md.template +20 -6
  24. package/docs/GITFLOW_PR_GUIDE.md +73 -11
  25. package/docs/GITFLOW_PR_GUIDE.md.es.template +61 -2
  26. package/docs/GITFLOW_PR_GUIDE.md.template +72 -10
  27. package/docs/INDEX.md +1 -0
  28. package/docs/QUICK.md.template +2 -1
  29. package/docs/STANDARD.md.template +2 -1
  30. package/docs/WORKFLOW.md.es.template +3 -1
  31. package/docs/WORKFLOW.md.template +6 -4
  32. package/docs/ai/ACTIVE_SLICE.md +61 -0
  33. package/docs/getting-started/installation.md +7 -0
  34. package/docs/reference/commands.md +104 -6
  35. package/docs/reference/slice-schema.md +37 -0
  36. package/docs/schema/slice.schema.json +221 -0
  37. package/docs/specs/01-spec/01-slice/01-slice.json +36 -0
  38. package/docs/specs/01-spec/01-slice/01-slice.md +106 -0
  39. package/docs/specs/01-spec/01-slice/CLOSURE_BRIEF.md +80 -0
  40. package/docs/specs/01-spec/01-slice/EXECUTION_BRIEF.md +39 -0
  41. package/docs/specs/01-spec/02-slice/02-slice.json +36 -0
  42. package/docs/specs/01-spec/02-slice/02-slice.md +108 -0
  43. package/docs/specs/01-spec/02-slice/CLOSURE_BRIEF.md +88 -0
  44. package/docs/specs/01-spec/02-slice/EXECUTION_BRIEF.md +40 -0
  45. package/docs/specs/01-spec/03-slice/03-slice.json +36 -0
  46. package/docs/specs/01-spec/03-slice/03-slice.md +103 -0
  47. package/docs/specs/01-spec/03-slice/CLOSURE_BRIEF.md +54 -0
  48. package/docs/specs/01-spec/03-slice/EXECUTION_BRIEF.md +39 -0
  49. package/docs/specs/01-spec/04-slice/04-slice.json +36 -0
  50. package/docs/specs/01-spec/04-slice/04-slice.md +107 -0
  51. package/docs/specs/01-spec/04-slice/CLOSURE_BRIEF.md +46 -0
  52. package/docs/specs/01-spec/04-slice/EXECUTION_BRIEF.md +39 -0
  53. package/docs/specs/01-spec/05-slice/05-slice.json +36 -0
  54. package/docs/specs/01-spec/05-slice/05-slice.md +106 -0
  55. package/docs/specs/01-spec/05-slice/CLOSURE_BRIEF.md +84 -0
  56. package/docs/specs/01-spec/05-slice/EXECUTION_BRIEF.md +109 -0
  57. package/docs/specs/01-spec/06-slice/06-slice.json +36 -0
  58. package/docs/specs/01-spec/06-slice/06-slice.md +107 -0
  59. package/docs/specs/01-spec/06-slice/CLOSURE_BRIEF.md +67 -0
  60. package/docs/specs/01-spec/06-slice/EXECUTION_BRIEF.md +39 -0
  61. package/docs/specs/01-spec/07-slice/07-slice.json +36 -0
  62. package/docs/specs/01-spec/07-slice/07-slice.md +105 -0
  63. package/docs/specs/01-spec/07-slice/CLOSURE_BRIEF.md +71 -0
  64. package/docs/specs/01-spec/07-slice/EXECUTION_BRIEF.md +39 -0
  65. package/docs/specs/01-spec/08-slice/08-slice.json +36 -0
  66. package/docs/specs/01-spec/08-slice/08-slice.md +105 -0
  67. package/docs/specs/01-spec/08-slice/CLOSURE_BRIEF.md +114 -0
  68. package/docs/specs/01-spec/08-slice/EXECUTION_BRIEF.md +39 -0
  69. package/docs/specs/01-spec/CLOSURE_BRIEF.md +87 -0
  70. package/docs/specs/01-spec/spec.md +197 -0
  71. package/docs/workflows/full-ai-spec-to-pr.md +46 -3
  72. package/i18n/es/docs/GITFLOW_PR_GUIDE.md.template +38 -1
  73. package/package.json +27 -1
  74. package/pr.md +154 -0
  75. package/scripts/package-quiver.sh +82 -2
  76. package/scripts/release-quiver.sh +14 -3
  77. package/specs/[project-name]/slices/pr.md.template +19 -0
  78. package/specs/quiver-v43-cli-i18n-audit-release-readiness/command-language-mode-matrix.json +91 -0
  79. package/specs/quiver-v50-audit-trust-foundation/EVIDENCE_REPORT.md +151 -0
  80. package/specs/quiver-v50-audit-trust-foundation/EXECUTION_PLAN.md +34 -0
  81. package/specs/quiver-v50-audit-trust-foundation/SPEC.md +113 -0
  82. package/specs/quiver-v50-audit-trust-foundation/STATUS.md +26 -0
  83. package/specs/quiver-v50-audit-trust-foundation/pr.md +120 -0
  84. package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/CLOSURE_BRIEF.md +20 -0
  85. package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/EXECUTION_BRIEF.md +58 -0
  86. package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/slice.json +57 -0
  87. package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/CLOSURE_BRIEF.md +24 -0
  88. package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/EXECUTION_BRIEF.md +67 -0
  89. package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/slice.json +71 -0
  90. package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/CLOSURE_BRIEF.md +24 -0
  91. package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/EXECUTION_BRIEF.md +71 -0
  92. package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/slice.json +81 -0
  93. package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/CLOSURE_BRIEF.md +22 -0
  94. package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/EXECUTION_BRIEF.md +57 -0
  95. package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/slice.json +56 -0
  96. package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/CLOSURE_BRIEF.md +23 -0
  97. package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/EXECUTION_BRIEF.md +68 -0
  98. package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/slice.json +84 -0
  99. package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/CLOSURE_BRIEF.md +25 -0
  100. package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/EXECUTION_BRIEF.md +73 -0
  101. package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/slice.json +72 -0
  102. package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/CLOSURE_BRIEF.md +22 -0
  103. package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/EXECUTION_BRIEF.md +66 -0
  104. package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/slice.json +74 -0
  105. package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/CLOSURE_BRIEF.md +29 -0
  106. package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/EXECUTION_BRIEF.md +74 -0
  107. package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/slice.json +81 -0
  108. package/specs/quiver-v51-cli-ergonomics-automation-contracts/EVIDENCE_REPORT.md +145 -0
  109. package/specs/quiver-v51-cli-ergonomics-automation-contracts/EXECUTION_PLAN.md +32 -0
  110. package/specs/quiver-v51-cli-ergonomics-automation-contracts/SPEC.md +109 -0
  111. package/specs/quiver-v51-cli-ergonomics-automation-contracts/STATUS.md +25 -0
  112. package/specs/quiver-v51-cli-ergonomics-automation-contracts/pr.md +69 -0
  113. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/CLOSURE_BRIEF.md +20 -0
  114. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/EXECUTION_BRIEF.md +58 -0
  115. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/slice.json +56 -0
  116. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/CLOSURE_BRIEF.md +21 -0
  117. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/EXECUTION_BRIEF.md +61 -0
  118. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/slice.json +68 -0
  119. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/CLOSURE_BRIEF.md +25 -0
  120. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/EXECUTION_BRIEF.md +65 -0
  121. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/pr.md +134 -0
  122. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/slice.json +80 -0
  123. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/CLOSURE_BRIEF.md +31 -0
  124. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/EXECUTION_BRIEF.md +80 -0
  125. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/pr.md +159 -0
  126. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/slice.json +102 -0
  127. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/CLOSURE_BRIEF.md +25 -0
  128. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/EXECUTION_BRIEF.md +74 -0
  129. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/pr.md +147 -0
  130. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/slice.json +91 -0
  131. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/CLOSURE_BRIEF.md +28 -0
  132. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/EXECUTION_BRIEF.md +73 -0
  133. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/pr.md +146 -0
  134. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/slice.json +100 -0
  135. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/CLOSURE_BRIEF.md +36 -0
  136. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/EXECUTION_BRIEF.md +76 -0
  137. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/pr.md +155 -0
  138. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/slice.json +111 -0
  139. package/specs/quiver-v52-schema-docs-release-hygiene/EVIDENCE_REPORT.md +95 -0
  140. package/specs/quiver-v52-schema-docs-release-hygiene/EXECUTION_PLAN.md +31 -0
  141. package/specs/quiver-v52-schema-docs-release-hygiene/SPEC.md +107 -0
  142. package/specs/quiver-v52-schema-docs-release-hygiene/STATUS.md +22 -0
  143. package/specs/quiver-v52-schema-docs-release-hygiene/pr.md +69 -0
  144. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/CLOSURE_BRIEF.md +21 -0
  145. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/EXECUTION_BRIEF.md +60 -0
  146. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/slice.json +62 -0
  147. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/CLOSURE_BRIEF.md +34 -0
  148. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/EXECUTION_BRIEF.md +71 -0
  149. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/pr.md +146 -0
  150. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/slice.json +106 -0
  151. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/CLOSURE_BRIEF.md +33 -0
  152. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/EXECUTION_BRIEF.md +67 -0
  153. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/pr.md +144 -0
  154. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/slice.json +86 -0
  155. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/CLOSURE_BRIEF.md +38 -0
  156. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/EXECUTION_BRIEF.md +75 -0
  157. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/pr.md +159 -0
  158. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/slice.json +105 -0
  159. package/src/create-quiver/commands/changelog.js +93 -0
  160. package/src/create-quiver/commands/config.js +16 -5
  161. package/src/create-quiver/commands/evidence.js +33 -2
  162. package/src/create-quiver/commands/flow.js +1 -0
  163. package/src/create-quiver/commands/graph.js +8 -2
  164. package/src/create-quiver/commands/plan.js +6 -0
  165. package/src/create-quiver/commands/spec.js +28 -13
  166. package/src/create-quiver/index.js +294 -94
  167. package/src/create-quiver/lib/ai/github.js +5 -2
  168. package/src/create-quiver/lib/ai/spec-templates.js +19 -0
  169. package/src/create-quiver/lib/cli/command-registry.js +71 -0
  170. package/src/create-quiver/lib/cli/parser.js +14 -0
  171. package/src/create-quiver/lib/evidence.js +161 -6
  172. package/src/create-quiver/lib/git.js +99 -0
  173. package/src/create-quiver/lib/i18n/messages/en.js +52 -7
  174. package/src/create-quiver/lib/i18n/messages/es.js +54 -9
  175. package/src/create-quiver/lib/init-docs.js +1 -1
  176. package/src/create-quiver/lib/init-layout.js +9 -8
  177. package/src/create-quiver/lib/lifecycle.js +24 -26
  178. package/src/create-quiver/lib/readiness.js +67 -56
  179. package/src/create-quiver/lib/spec-worktrees.js +16 -34
@@ -35,6 +35,7 @@ const {
35
35
  runSpecsList: runAiSpecsList,
36
36
  runTraceReport: runAiTraceReport,
37
37
  } = require('./commands/ai');
38
+ const { runChangelog } = require('./commands/changelog');
38
39
  const { runConfig } = require('./commands/config');
39
40
  const { runDashboard } = require('./commands/dashboard');
40
41
  const { runDemo } = require('./commands/demo');
@@ -58,6 +59,15 @@ const { cleanupSlice, refreshActiveSlicesBoard, startSlice } = require('./lib/li
58
59
  const { buildSpecStatus, closeSpecWorktree, formatSpecCloseResult, formatSpecStartResult, formatSpecStatus, startSpecWorktree } = require('./lib/spec-worktrees');
59
60
  const { getContextPathExclusionReason } = require('./lib/ai/safety');
60
61
  const { selectOption } = require('./lib/cli/selectors');
62
+ const {
63
+ SUPPORTED_AI_COMMANDS,
64
+ SUPPORTED_COMMAND_MODES,
65
+ SUPPORTED_CONFIG_LANGUAGE_COMMANDS,
66
+ SUPPORTED_CONFIG_SECTIONS,
67
+ SUPPORTED_DEMO_COMMANDS,
68
+ SUPPORTED_SPEC_COMMANDS,
69
+ } = require('./lib/cli/command-registry');
70
+ const { parseCliArgs } = require('./lib/cli/parser');
61
71
  const { createUx } = require('./lib/cli/ux');
62
72
  const { validateUxFlags } = require('./lib/cli/ux-flags');
63
73
  const {
@@ -145,65 +155,38 @@ function formatLanguageWarningForCli(warning, language = DEFAULT_LANGUAGE) {
145
155
  }));
146
156
  }
147
157
 
148
- const SUPPORTED_COMMAND_MODES = new Set([
149
- 'init',
150
- 'version',
151
- 'flow',
152
- 'dashboard',
153
- 'plan',
154
- 'graph',
155
- 'next',
156
- 'doctor',
157
- 'prepare',
158
- 'analyze',
159
- 'migrate',
160
- 'start-slice',
161
- 'check-slice',
162
- 'check-pr',
163
- 'check-handoff',
164
- 'new-handoff',
165
- 'cleanup-slice',
166
- 'check-scope',
167
- 'config',
168
- 'refresh-active-slices',
169
- 'spec',
170
- 'evidence',
171
- 'demo',
172
- 'ai',
173
- ]);
158
+ const SLICE_NAMESPACE_COMMANDS = Object.freeze({
159
+ start: 'start-slice',
160
+ check: 'check-slice',
161
+ pr: 'check-pr',
162
+ scope: 'check-scope',
163
+ cleanup: 'cleanup-slice',
164
+ 'refresh-active': 'refresh-active-slices',
165
+ });
174
166
 
175
- const SUPPORTED_AI_COMMANDS = new Set([
176
- 'active-slice',
177
- 'agent',
178
- 'approve',
179
- 'approval-status',
180
- 'approvals',
181
- 'doctor',
182
- 'execute-plan',
183
- 'execute-slice',
184
- 'executor-prompt',
185
- 'export',
186
- 'inspect',
187
- 'onboard',
188
- 'plan',
189
- 'prepare-context',
190
- 'pr',
191
- 'prompt-slice',
192
- 'repair-plan',
193
- 'review-plan',
194
- 'revise',
195
- 'resume',
196
- 'run',
197
- 'slices',
198
- 'specs',
199
- 'status',
200
- 'trace',
201
- ]);
167
+ const HANDOFF_NAMESPACE_COMMANDS = Object.freeze({
168
+ check: 'check-handoff',
169
+ new: 'new-handoff',
170
+ });
171
+
172
+ const LEGACY_NAMESPACE_ALIASES = Object.freeze({
173
+ 'start-slice': 'slice start',
174
+ 'check-slice': 'slice check',
175
+ 'check-pr': 'slice pr',
176
+ 'check-scope': 'slice scope',
177
+ 'cleanup-slice': 'slice cleanup',
178
+ 'refresh-active-slices': 'slice refresh-active',
179
+ 'check-handoff': 'handoff check',
180
+ 'new-handoff': 'handoff new',
181
+ });
182
+
183
+ function legacyNamespaceAliasFor(mode) {
184
+ return LEGACY_NAMESPACE_ALIASES[mode] || '';
185
+ }
202
186
 
203
- const SUPPORTED_SPEC_COMMANDS = new Set(['close', 'create', 'start', 'status', 'validate']);
204
- const SUPPORTED_DEMO_COMMANDS = new Set(['create']);
205
- const SUPPORTED_CONFIG_SECTIONS = new Set(['language']);
206
- const SUPPORTED_CONFIG_LANGUAGE_COMMANDS = new Set(['show', 'set']);
187
+ function formatLegacyNamespaceWarning(mode, canonicalCommand) {
188
+ return `create-quiver: ${mode} is a legacy alias; use npx create-quiver ${canonicalCommand}.`;
189
+ }
207
190
 
208
191
  function unsupportedCommandMessage(commandName) {
209
192
  const translator = createTranslator(currentErrorLanguage);
@@ -225,6 +208,7 @@ const COMMAND_HELP_GROUPS = [
225
208
  ['flow', 'Show the read-only guided workflow stage, blockers, and next safe command.'],
226
209
  ['dashboard', 'Show compact read-only project, spec, slice, run, approval, and agent status.'],
227
210
  ['version', 'Show a Quiver-branded version report; use --json for metadata.'],
211
+ ['changelog', 'Show recent local CHANGELOG.md release entries; use --json for metadata.'],
228
212
  ['config language show|set', 'Inspect or update the effective Quiver language without editing JSON by hand.'],
229
213
  ['prepare', 'Run setup diagnostics for providers, GitHub, SSH, and project readiness.'],
230
214
  ['migrate', 'Upgrade an already initialized Quiver project to the current contract.'],
@@ -280,6 +264,8 @@ const COMMAND_HELP_GROUPS = [
280
264
  ['spec status', 'Show spec worktree, branch, slice-00 state, and pending slices.'],
281
265
  ['spec validate', 'Validate spec docs, slices, briefs, evidence, status, dependencies, and safe paths.'],
282
266
  ['spec close', 'Close a merged clean spec worktree and guide local sync.'],
267
+ ['slice start|check|pr|scope|cleanup|refresh-active', 'Canonical namespace for slice lifecycle, validation, scope, and board commands.'],
268
+ ['handoff check|new', 'Canonical namespace for validating or scaffolding handoff artifacts.'],
283
269
  ['start-slice', 'Start work on one slice and mark it active.'],
284
270
  ['check-slice', 'Validate slice structure, dependencies, scope, and readiness.'],
285
271
  ['check-pr', 'Validate PR readiness for a slice/spec workflow.'],
@@ -294,6 +280,8 @@ const COMMAND_HELP_GROUPS = [
294
280
  title: 'Evidence and demos',
295
281
  commands: [
296
282
  ['evidence run', 'Run a command and record exit code, duration, redacted output, and Markdown evidence.'],
283
+ ['evidence list', 'List local evidence records; use --json for automation.'],
284
+ ['evidence show', 'Show one local evidence record; use --json for automation.'],
297
285
  ['demo create spec-viewer', 'Create or preview the optional static Quiver Spec Viewer demo scaffold.'],
298
286
  ],
299
287
  },
@@ -329,6 +317,7 @@ function printUsage(language = DEFAULT_LANGUAGE) {
329
317
  npx create-quiver flow [options]
330
318
  npx create-quiver dashboard [options]
331
319
  npx create-quiver version [--json]
320
+ npx create-quiver changelog [--json]
332
321
  npx create-quiver config language show [--json]
333
322
  npx create-quiver config language set <en|es> [--global]
334
323
  npx create-quiver plan [options]
@@ -366,7 +355,9 @@ function printUsage(language = DEFAULT_LANGUAGE) {
366
355
  npx create-quiver spec status <spec-dir>
367
356
  npx create-quiver spec validate <spec-dir>
368
357
  npx create-quiver spec close <spec-dir>
369
- npx create-quiver evidence run [options] -- <command>
358
+ npx create-quiver slice <start|check|pr|scope|cleanup|refresh-active> [options]
359
+ npx create-quiver handoff <check|new> [options]
360
+ npx create-quiver evidence <run|list|show> [options]
370
361
  npx create-quiver demo create spec-viewer [options]
371
362
 
372
363
  ${formatCommandHelpGroups(language)}
@@ -415,11 +406,11 @@ ${helpText(help, 'headings', 'options', 'Options:')}
415
406
  --ssh-host-alias <name> ${optionDescription(help, 'SSH host alias to validate for prepare or AI commands')}
416
407
  --identity-file <path> ${optionDescription(help, 'SSH identity file to validate for prepare or AI commands')}
417
408
  --remote <name> ${optionDescription(help, 'Git remote name for check-slice or AI PR checks')}
418
- --base <branch> ${optionDescription(help, 'Base branch for check-slice, check-scope, ai pr, or spec close (default: main)')}
409
+ --base <branch> ${optionDescription(help, 'Base branch override for check-slice, check-scope, check-pr, ai pr, spec start, or spec close')}
419
410
  --output <file> ${optionDescription(help, 'Output file for evidence run')}
420
411
  --max-output <n> ${optionDescription(help, 'Maximum stdout/stderr chars per evidence section')}
421
412
  --title <text> ${optionDescription(help, 'Override PR title for ai pr create')}
422
- -y, --yes ${optionDescription(help, 'Skip prompts and use the provided inputs')}
413
+ -y, --yes ${optionDescription(help, 'Skip prompts and confirm write prompts such as migrate')}
423
414
  -V, --version ${optionDescription(help, 'Show the installed create-quiver version')}
424
415
  -h, --help ${optionDescription(help, 'Show this help message')}
425
416
 
@@ -435,6 +426,8 @@ ${helpText(help, 'headings', 'examples', 'Examples:')}
435
426
  cd ./my-project && npx create-quiver dashboard --json
436
427
  cd ./my-project && npx create-quiver version
437
428
  cd ./my-project && npx create-quiver version --json
429
+ cd ./my-project && npx create-quiver changelog
430
+ cd ./my-project && npx create-quiver changelog --json
438
431
  cd ./my-project && npx create-quiver config language show
439
432
  cd ./my-project && npx create-quiver config language set es
440
433
  npx create-quiver config language set en --global
@@ -499,6 +492,8 @@ ${helpText(help, 'headings', 'examples', 'Examples:')}
499
492
  cd ./my-project && npx create-quiver spec status specs/my-project
500
493
  cd ./my-project && npx create-quiver spec validate specs/my-project
501
494
  cd ./my-project && npx create-quiver spec close specs/my-project --dry-run
495
+ cd ./my-project && npx create-quiver slice check --local specs/my-project/slices/slice-01/slice.json
496
+ cd ./my-project && npx create-quiver handoff check specs/my-project/slices/slice-01/EXECUTION_BRIEF.md
502
497
  cd ./my-project && npx create-quiver evidence run -- npm test
503
498
  cd ./my-project && npx create-quiver demo create spec-viewer --dry-run
504
499
  node bin/create-quiver.js doctor --dir ./my-project
@@ -584,22 +579,33 @@ function parseArgs(argv, options = {}) {
584
579
  initLegacyScripts: false,
585
580
  initMinimal: false,
586
581
  specCommand: '',
582
+ sliceCommand: '',
583
+ handoffCommand: '',
584
+ legacyAliasCommand: '',
587
585
  demoCommand: '',
588
586
  demoName: '',
589
587
  evidenceCommand: '',
590
588
  evidenceArgs: [],
591
589
  evidenceOutput: '',
592
590
  evidenceMaxOutput: null,
591
+ evidenceTarget: '',
593
592
  };
594
593
 
595
594
  const args = [...argv];
596
595
  if (SUPPORTED_COMMAND_MODES.has(args[0])) {
597
596
  result.mode = args[0];
597
+ result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
598
598
  result.explicitInit = args[0] === 'init';
599
599
  args.shift();
600
600
  if (result.mode === 'spec') {
601
601
  result.specCommand = args.shift() || '';
602
602
  }
603
+ if (result.mode === 'slice') {
604
+ result.sliceCommand = args.shift() || '';
605
+ }
606
+ if (result.mode === 'handoff') {
607
+ result.handoffCommand = args.shift() || '';
608
+ }
603
609
  if (result.mode === 'evidence') {
604
610
  result.evidenceCommand = args.shift() || '';
605
611
  }
@@ -618,9 +624,11 @@ function parseArgs(argv, options = {}) {
618
624
  args.shift();
619
625
  } else if (args[0] === '--check-handoff') {
620
626
  result.mode = 'check-handoff';
627
+ result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
621
628
  args.shift();
622
629
  } else if (args[0] === '--new-handoff') {
623
630
  result.mode = 'new-handoff';
631
+ result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
624
632
  args.shift();
625
633
  } else if (args[0] && !args[0].startsWith('-')) {
626
634
  throw new Error(formatError(unsupportedCommandMessage(args[0])));
@@ -671,11 +679,13 @@ function parseArgs(argv, options = {}) {
671
679
 
672
680
  if (arg === '--check-handoff') {
673
681
  result.mode = 'check-handoff';
682
+ result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
674
683
  continue;
675
684
  }
676
685
 
677
686
  if (arg === '--new-handoff') {
678
687
  result.mode = 'new-handoff';
688
+ result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
679
689
  continue;
680
690
  }
681
691
 
@@ -1197,13 +1207,17 @@ function parseArgs(argv, options = {}) {
1197
1207
  result.configSection = positional.shift();
1198
1208
  }
1199
1209
  if (!SUPPORTED_CONFIG_SECTIONS.has(result.configSection)) {
1200
- throw new Error(formatError(`unsupported config section: ${result.configSection || '(missing)'}. Supported sections: language`));
1210
+ throw new Error(formatError(translate(currentErrorLanguage, 'config.error.unsupported_section', {
1211
+ section: result.configSection || '(missing)',
1212
+ })));
1201
1213
  }
1202
1214
  if (!result.configCommand && positional.length > 0) {
1203
1215
  result.configCommand = positional.shift();
1204
1216
  }
1205
1217
  if (!SUPPORTED_CONFIG_LANGUAGE_COMMANDS.has(result.configCommand)) {
1206
- throw new Error(formatError(`unsupported config language command: ${result.configCommand || '(missing)'}. Supported commands: show, set`));
1218
+ throw new Error(formatError(translate(currentErrorLanguage, 'config.error.unsupported_language_command', {
1219
+ command: result.configCommand || '(missing)',
1220
+ })));
1207
1221
  }
1208
1222
  if (result.configCommand === 'set') {
1209
1223
  if (positional.length === 0) {
@@ -1252,6 +1266,38 @@ function parseArgs(argv, options = {}) {
1252
1266
  if (positional.length > 0) {
1253
1267
  throw new Error(formatError('refresh-active-slices does not accept positional arguments'));
1254
1268
  }
1269
+ } else if (result.mode === 'slice') {
1270
+ if (!result.sliceCommand && positional.length > 0) {
1271
+ result.sliceCommand = positional.shift();
1272
+ }
1273
+ const mappedMode = SLICE_NAMESPACE_COMMANDS[result.sliceCommand];
1274
+ if (!mappedMode) {
1275
+ throw new Error(formatError(`unsupported slice subcommand: ${result.sliceCommand || '(missing)'}. Supported tasks: start, check, pr, scope, cleanup, refresh-active`));
1276
+ }
1277
+ result.mode = mappedMode;
1278
+ if (mappedMode === 'refresh-active-slices') {
1279
+ if (positional.length > 0) {
1280
+ throw new Error(formatError('slice refresh-active does not accept positional arguments'));
1281
+ }
1282
+ } else {
1283
+ result.targetDir = positional.shift() || '';
1284
+ if (!result.targetDir) {
1285
+ throw new Error(formatError(`slice ${result.sliceCommand} requires a slice.json path`));
1286
+ }
1287
+ }
1288
+ } else if (result.mode === 'handoff') {
1289
+ if (!result.handoffCommand && positional.length > 0) {
1290
+ result.handoffCommand = positional.shift();
1291
+ }
1292
+ const mappedMode = HANDOFF_NAMESPACE_COMMANDS[result.handoffCommand];
1293
+ if (!mappedMode) {
1294
+ throw new Error(formatError(`unsupported handoff subcommand: ${result.handoffCommand || '(missing)'}. Supported tasks: check, new`));
1295
+ }
1296
+ result.mode = mappedMode;
1297
+ result.targetDir = positional.shift() || '';
1298
+ if (!result.targetDir) {
1299
+ throw new Error(formatError(`handoff ${result.handoffCommand} requires ${result.handoffCommand === 'new' ? 'a spec slug' : 'a handoff or brief path'}`));
1300
+ }
1255
1301
  } else if (result.mode === 'spec') {
1256
1302
  if (!result.specCommand && positional.length > 0) {
1257
1303
  result.specCommand = positional.shift();
@@ -1270,14 +1316,26 @@ function parseArgs(argv, options = {}) {
1270
1316
  result.evidenceCommand = positional.shift();
1271
1317
  }
1272
1318
  if (!result.evidenceCommand) {
1273
- throw new Error(formatError('missing evidence subcommand. Use: npx create-quiver evidence run -- <command>'));
1319
+ throw new Error(formatError('missing evidence subcommand. Use: npx create-quiver evidence <run|list|show>'));
1274
1320
  }
1275
- if (result.evidenceCommand !== 'run') {
1276
- throw new Error(formatError(`unsupported evidence subcommand: ${result.evidenceCommand}. Supported tasks: run`));
1321
+ if (!['run', 'list', 'show'].includes(result.evidenceCommand)) {
1322
+ throw new Error(formatError(`unsupported evidence subcommand: ${result.evidenceCommand}. Supported tasks: run, list, show`));
1277
1323
  }
1278
- if (positional.length > 0) {
1324
+ if (result.evidenceCommand === 'run' && positional.length > 0) {
1279
1325
  throw new Error(formatError('evidence run does not accept positional arguments before --'));
1280
1326
  }
1327
+ if (result.evidenceCommand === 'list' && positional.length > 0) {
1328
+ throw new Error(formatError('evidence list does not accept positional arguments'));
1329
+ }
1330
+ if (result.evidenceCommand === 'show') {
1331
+ result.evidenceTarget = positional.shift() || '';
1332
+ if (!result.evidenceTarget) {
1333
+ throw new Error(formatError('evidence show requires an evidence file path'));
1334
+ }
1335
+ if (positional.length > 0) {
1336
+ throw new Error(formatError('evidence show accepts exactly one evidence file path'));
1337
+ }
1338
+ }
1281
1339
  } else if (result.mode === 'demo') {
1282
1340
  if (!result.demoCommand && positional.length > 0) {
1283
1341
  result.demoCommand = positional.shift();
@@ -2321,15 +2379,46 @@ function writeProjectScanArtifacts(projectRoot, scan) {
2321
2379
  return { jsonPath, mdPath: scanPaths.projectMapPath };
2322
2380
  }
2323
2381
 
2324
- function runAnalyze(targetDir, options = {}) {
2382
+ function createCommandProgressUx(options = {}) {
2383
+ return createUx({
2384
+ env: options.env || process.env,
2385
+ error: options.error,
2386
+ input: options.input,
2387
+ interactive: false,
2388
+ json: options.json,
2389
+ noColor: options.noColor,
2390
+ output: options.output,
2391
+ prompts: options.prompts,
2392
+ spinner: options.noColor === true ? false : options.spinner,
2393
+ stderrIsTTY: options.stderrIsTTY,
2394
+ stdinIsTTY: options.stdinIsTTY,
2395
+ stdoutIsTTY: options.stdoutIsTTY,
2396
+ write: options.write,
2397
+ });
2398
+ }
2399
+
2400
+ async function runProgress(ux, message, task, successMessage = message) {
2401
+ return ux.withSpinner(message, task, {
2402
+ echo: false,
2403
+ successMessage,
2404
+ });
2405
+ }
2406
+
2407
+ async function runAnalyze(targetDir, options = {}) {
2325
2408
  const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
2326
2409
  const translator = createTranslator(options.language);
2410
+ const progress = createCommandProgressUx(options);
2327
2411
 
2328
2412
  if (!fs.existsSync(projectRoot)) {
2329
2413
  throw new Error(formatError(`target directory does not exist: ${projectRoot}`));
2330
2414
  }
2331
2415
 
2332
- const scan = buildProjectScan(projectRoot);
2416
+ const scan = await runProgress(
2417
+ progress,
2418
+ translator.t('analyze.progress.scanning'),
2419
+ () => buildProjectScan(projectRoot),
2420
+ translator.t('analyze.progress.scanned'),
2421
+ );
2333
2422
 
2334
2423
  if (options.dryRun) {
2335
2424
  console.log(translator.t('analyze.dry_run_for', { path: projectRoot }));
@@ -2350,9 +2439,24 @@ function runAnalyze(targetDir, options = {}) {
2350
2439
  };
2351
2440
  }
2352
2441
 
2353
- const artifacts = writeProjectScanArtifacts(projectRoot, scan);
2354
- const aiContextPath = refreshAiContextDoc(projectRoot, scan);
2355
- updateStateForAnalyze(projectRoot, CLI_VERSION);
2442
+ const artifacts = await runProgress(
2443
+ progress,
2444
+ translator.t('analyze.progress.writing_artifacts'),
2445
+ () => writeProjectScanArtifacts(projectRoot, scan),
2446
+ translator.t('analyze.progress.artifacts_written'),
2447
+ );
2448
+ const aiContextPath = await runProgress(
2449
+ progress,
2450
+ translator.t('analyze.progress.refreshing_context'),
2451
+ () => refreshAiContextDoc(projectRoot, scan),
2452
+ translator.t('analyze.progress.context_refreshed'),
2453
+ );
2454
+ await runProgress(
2455
+ progress,
2456
+ translator.t('analyze.progress.updating_state'),
2457
+ () => updateStateForAnalyze(projectRoot, CLI_VERSION),
2458
+ translator.t('analyze.progress.state_updated'),
2459
+ );
2356
2460
 
2357
2461
  console.log(translator.t('analyze.completed_for', { path: projectRoot }));
2358
2462
  console.log(translator.t('analyze.wrote', { path: relativePosixPath(projectRoot, artifacts.jsonPath) }));
@@ -2369,7 +2473,39 @@ function runAnalyze(targetDir, options = {}) {
2369
2473
  };
2370
2474
  }
2371
2475
 
2372
- function runMigrate(targetDir, options = {}) {
2476
+ async function confirmMigrateWrite(projectRoot, options, translator) {
2477
+ if (options.force === true) {
2478
+ return;
2479
+ }
2480
+
2481
+ const ux = createUx({
2482
+ env: options.env,
2483
+ error: options.error,
2484
+ input: options.input,
2485
+ interactive: true,
2486
+ json: options.json,
2487
+ noColor: options.noColor,
2488
+ output: options.output,
2489
+ promptConfirm: options.promptConfirm,
2490
+ stderrIsTTY: options.stderrIsTTY,
2491
+ stdinIsTTY: options.stdinIsTTY,
2492
+ stdoutIsTTY: options.stdoutIsTTY,
2493
+ write: options.write,
2494
+ });
2495
+
2496
+ if (!ux.mode.usePrompts) {
2497
+ throw new Error(formatError(translator.t('migrate.confirm.required')));
2498
+ }
2499
+
2500
+ const confirmed = await ux.promptConfirm(translator.t('migrate.confirm.prompt', { path: projectRoot }), {
2501
+ initialValue: false,
2502
+ });
2503
+ if (!confirmed) {
2504
+ throw new Error(formatError(translator.t('migrate.confirm.declined')));
2505
+ }
2506
+ }
2507
+
2508
+ async function runMigrate(targetDir, options = {}) {
2373
2509
  const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
2374
2510
  const translator = createTranslator(options.language);
2375
2511
 
@@ -2410,6 +2546,8 @@ function runMigrate(targetDir, options = {}) {
2410
2546
  return;
2411
2547
  }
2412
2548
 
2549
+ await confirmMigrateWrite(projectRoot, options, translator);
2550
+
2413
2551
  const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'quiver-migrate-'));
2414
2552
 
2415
2553
  try {
@@ -3158,8 +3296,9 @@ async function run(argv) {
3158
3296
  return;
3159
3297
  }
3160
3298
 
3161
- const args = parseArgs(normalizedArgv, {
3299
+ const args = parseCliArgs(normalizedArgv, {
3162
3300
  language: languageArgs.language,
3301
+ legacyParseArgs: parseArgs,
3163
3302
  });
3164
3303
  args.languageResolution = languageResolution;
3165
3304
  args.language = args.languageResolution.language;
@@ -3180,12 +3319,20 @@ async function run(argv) {
3180
3319
  for (const warning of args.languageResolution.warnings || []) {
3181
3320
  process.stderr.write(`${formatLanguageWarningForCli(warning, args.language)}\n`);
3182
3321
  }
3322
+ if (args.legacyAliasCommand) {
3323
+ process.stderr.write(`${formatLegacyNamespaceWarning(args.mode, args.legacyAliasCommand)}\n`);
3324
+ }
3183
3325
  }
3184
3326
 
3185
3327
  if (args.mode === 'analyze') {
3186
- runAnalyze(args.targetDir, {
3328
+ await runAnalyze(args.targetDir, {
3187
3329
  dryRun: args.dryRun,
3330
+ json: args.json,
3188
3331
  language: args.language,
3332
+ noColor: args.noColor,
3333
+ stderrIsTTY: Boolean(process.stderr.isTTY),
3334
+ stdinIsTTY: Boolean(process.stdin.isTTY),
3335
+ stdoutIsTTY: Boolean(process.stdout.isTTY),
3189
3336
  });
3190
3337
  return;
3191
3338
  }
@@ -3231,11 +3378,17 @@ async function run(argv) {
3231
3378
  return;
3232
3379
  }
3233
3380
 
3381
+ if (args.mode === 'changelog') {
3382
+ runChangelog({ json: args.json });
3383
+ return;
3384
+ }
3385
+
3234
3386
  if (args.mode === 'config') {
3235
3387
  runConfig(process.cwd(), {
3236
3388
  command: args.configCommand,
3237
3389
  global: args.configGlobal,
3238
3390
  json: args.json,
3391
+ language: args.language,
3239
3392
  languageResolution: args.languageResolution,
3240
3393
  section: args.configSection,
3241
3394
  value: args.configValue,
@@ -3570,7 +3723,7 @@ async function run(argv) {
3570
3723
 
3571
3724
  if (args.aiCommand === 'pr') {
3572
3725
  await runAiPr(process.cwd(), {
3573
- baseBranch: args.aiBaseBranch,
3726
+ baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
3574
3727
  create: args.aiCreate,
3575
3728
  dryRun: args.dryRun,
3576
3729
  input: args.aiInput || undefined,
@@ -3620,7 +3773,9 @@ async function run(argv) {
3620
3773
  language: args.language,
3621
3774
  maxOutput: args.evidenceMaxOutput || undefined,
3622
3775
  output: args.evidenceOutput || undefined,
3776
+ json: args.json,
3623
3777
  subcommand: args.evidenceCommand,
3778
+ target: args.evidenceTarget,
3624
3779
  });
3625
3780
  process.exitCode = result.exitCode;
3626
3781
  return;
@@ -3639,10 +3794,16 @@ async function run(argv) {
3639
3794
  }
3640
3795
 
3641
3796
  if (args.mode === 'migrate') {
3642
- runMigrate(args.targetDir, {
3797
+ await runMigrate(args.targetDir, {
3643
3798
  dryRun: args.dryRun,
3799
+ force: args.force,
3800
+ json: args.json,
3644
3801
  language: args.language,
3802
+ noColor: args.noColor,
3645
3803
  skipInstall: args.skipInstall,
3804
+ stderrIsTTY: Boolean(process.stderr.isTTY),
3805
+ stdinIsTTY: Boolean(process.stdin.isTTY),
3806
+ stdoutIsTTY: Boolean(process.stdout.isTTY),
3646
3807
  });
3647
3808
  return;
3648
3809
  }
@@ -3680,7 +3841,11 @@ async function run(argv) {
3680
3841
  }
3681
3842
 
3682
3843
  if (args.mode === 'check-pr') {
3683
- checkPrReadiness(args.targetDir, { language: args.language });
3844
+ checkPrReadiness(args.targetDir, {
3845
+ baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
3846
+ language: args.language,
3847
+ remote: args.aiRemote,
3848
+ });
3684
3849
  return;
3685
3850
  }
3686
3851
 
@@ -3751,11 +3916,12 @@ async function run(argv) {
3751
3916
  }
3752
3917
 
3753
3918
  if (!args.targetDir || args.targetDir === '.') {
3754
- throw new Error(formatError('missing spec directory. Use: npx create-quiver spec <start|status|validate|close> <spec-dir>'));
3919
+ throw new Error(formatError(createTranslator(args.language).t('spec.error.missing_directory_command')));
3755
3920
  }
3756
3921
 
3757
3922
  if (args.specCommand === 'start') {
3758
3923
  const report = startSpecWorktree(process.cwd(), args.targetDir, {
3924
+ baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
3759
3925
  dryRun: args.dryRun,
3760
3926
  });
3761
3927
  process.stdout.write(formatSpecStartResult(report, { language: args.language }));
@@ -3778,7 +3944,7 @@ async function run(argv) {
3778
3944
 
3779
3945
  if (args.specCommand === 'close') {
3780
3946
  const report = closeSpecWorktree(process.cwd(), args.targetDir, {
3781
- baseBranch: args.aiBaseBranch,
3947
+ baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
3782
3948
  discard: args.discard,
3783
3949
  dryRun: args.dryRun,
3784
3950
  force: args.force,
@@ -3824,25 +3990,60 @@ async function run(argv) {
3824
3990
  }
3825
3991
 
3826
3992
  const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'quiver-create-'));
3993
+ const translator = createTranslator(args.language);
3994
+ const progress = createCommandProgressUx({
3995
+ json: args.json,
3996
+ noColor: args.noColor,
3997
+ stderrIsTTY: Boolean(process.stderr.isTTY),
3998
+ stdinIsTTY: Boolean(process.stdin.isTTY),
3999
+ stdoutIsTTY: Boolean(process.stdout.isTTY),
4000
+ });
3827
4001
 
3828
4002
  try {
3829
- ensureDir(targetDir);
3830
-
3831
- const templateRoot = packTemplate(packageRoot, tempRoot);
4003
+ let templateRoot = '';
4004
+ await runProgress(
4005
+ progress,
4006
+ translator.t('init.progress.preparing_templates'),
4007
+ () => {
4008
+ ensureDir(targetDir);
4009
+ templateRoot = packTemplate(packageRoot, tempRoot);
4010
+ return templateRoot;
4011
+ },
4012
+ translator.t('init.progress.templates_ready'),
4013
+ );
3832
4014
  if (initLayout.profile === 'full') {
3833
- exportTemplatesToLegacyRoot(templateRoot, targetDir);
3834
- }
3835
- runInitDocs(targetDir, initOptions.projectName, {
3836
- includeTemplates: initOptions.includeTemplates,
3837
- language: initLanguage.docsLanguage,
3838
- legacyScripts: initOptions.legacyScripts,
3839
- profile: initLayout.profile,
3840
- templateRoot,
3841
- });
3842
- const languageWrite = persistInitLanguage(targetDir, { language: initLanguage.configLanguage });
4015
+ await runProgress(
4016
+ progress,
4017
+ translator.t('init.progress.exporting_templates'),
4018
+ () => exportTemplatesToLegacyRoot(templateRoot, targetDir),
4019
+ translator.t('init.progress.templates_exported'),
4020
+ );
4021
+ }
4022
+ let languageWrite = null;
4023
+ await runProgress(
4024
+ progress,
4025
+ translator.t('init.progress.writing_docs'),
4026
+ () => {
4027
+ runInitDocs(targetDir, initOptions.projectName, {
4028
+ includeTemplates: initOptions.includeTemplates,
4029
+ language: initLanguage.docsLanguage,
4030
+ legacyScripts: initOptions.legacyScripts,
4031
+ profile: initLayout.profile,
4032
+ templateRoot,
4033
+ });
4034
+ languageWrite = persistInitLanguage(targetDir, { language: initLanguage.configLanguage });
4035
+ return languageWrite;
4036
+ },
4037
+ translator.t('init.progress.docs_written'),
4038
+ );
3843
4039
 
3844
4040
  if (!args.skipInstall) {
3845
- const installResult = installSelfAsDevDep(targetDir, CLI_VERSION);
4041
+ const installResult = await runProgress(
4042
+ progress,
4043
+ translator.t('init.progress.installing_package'),
4044
+ () => installSelfAsDevDep(targetDir, CLI_VERSION),
4045
+ translator.t('init.progress.install_checked'),
4046
+ );
3846
4047
  if (installResult === 'installed') {
3847
4048
  console.log(`Added create-quiver@${CLI_VERSION} as dev dependency`);
3848
4049
  } else if (installResult === 'failed') {
@@ -3850,7 +4051,6 @@ async function run(argv) {
3850
4051
  }
3851
4052
  }
3852
4053
 
3853
- const translator = createTranslator(args.language);
3854
4054
  console.log(translator.t('init.installed', { path: targetDir }));
3855
4055
  if (languageWrite) {
3856
4056
  console.log(translator.t('init.language.saved', { language: languageWrite.language }));