create-quiver 0.15.4 → 0.17.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 (199) 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/ARCHITECTURE.md +133 -0
  6. package/CHANGELOG.md +16 -0
  7. package/CONTRIBUTING.md +174 -9
  8. package/README.md +17 -2
  9. package/README_FOR_AI.md +4 -1
  10. package/ROADMAP.md +4 -0
  11. package/SECURITY.md +9 -2
  12. package/docs/AI_CONTEXT.md.es.template +3 -1
  13. package/docs/AI_CONTEXT.md.template +3 -1
  14. package/docs/CLI_UX_GUIDE.md +20 -1
  15. package/docs/COMMANDS.md.template +20 -6
  16. package/docs/GITFLOW_PR_GUIDE.md +73 -11
  17. package/docs/GITFLOW_PR_GUIDE.md.es.template +61 -2
  18. package/docs/GITFLOW_PR_GUIDE.md.template +72 -10
  19. package/docs/INDEX.md +6 -1
  20. package/docs/QUICK.md.template +2 -1
  21. package/docs/STANDARD.md.template +2 -1
  22. package/docs/WORKFLOW.md.es.template +3 -1
  23. package/docs/WORKFLOW.md.template +6 -4
  24. package/docs/getting-started/installation.md +7 -0
  25. package/docs/reference/commands.md +138 -6
  26. package/docs/reference/slice-schema.md +37 -0
  27. package/docs/schema/slice.schema.json +221 -0
  28. package/docs/specs/01-spec/01-slice/01-slice.json +36 -0
  29. package/docs/specs/01-spec/01-slice/01-slice.md +106 -0
  30. package/docs/specs/01-spec/01-slice/CLOSURE_BRIEF.md +80 -0
  31. package/docs/specs/01-spec/01-slice/EXECUTION_BRIEF.md +39 -0
  32. package/docs/specs/01-spec/02-slice/02-slice.json +36 -0
  33. package/docs/specs/01-spec/02-slice/02-slice.md +108 -0
  34. package/docs/specs/01-spec/02-slice/CLOSURE_BRIEF.md +88 -0
  35. package/docs/specs/01-spec/02-slice/EXECUTION_BRIEF.md +40 -0
  36. package/docs/specs/01-spec/03-slice/03-slice.json +36 -0
  37. package/docs/specs/01-spec/03-slice/03-slice.md +103 -0
  38. package/docs/specs/01-spec/03-slice/CLOSURE_BRIEF.md +54 -0
  39. package/docs/specs/01-spec/03-slice/EXECUTION_BRIEF.md +39 -0
  40. package/docs/specs/01-spec/04-slice/04-slice.json +36 -0
  41. package/docs/specs/01-spec/04-slice/04-slice.md +107 -0
  42. package/docs/specs/01-spec/04-slice/CLOSURE_BRIEF.md +46 -0
  43. package/docs/specs/01-spec/04-slice/EXECUTION_BRIEF.md +39 -0
  44. package/docs/specs/01-spec/05-slice/05-slice.json +36 -0
  45. package/docs/specs/01-spec/05-slice/05-slice.md +106 -0
  46. package/docs/specs/01-spec/05-slice/CLOSURE_BRIEF.md +84 -0
  47. package/docs/specs/01-spec/05-slice/EXECUTION_BRIEF.md +109 -0
  48. package/docs/specs/01-spec/06-slice/06-slice.json +36 -0
  49. package/docs/specs/01-spec/06-slice/06-slice.md +107 -0
  50. package/docs/specs/01-spec/06-slice/CLOSURE_BRIEF.md +67 -0
  51. package/docs/specs/01-spec/06-slice/EXECUTION_BRIEF.md +39 -0
  52. package/docs/specs/01-spec/07-slice/07-slice.json +36 -0
  53. package/docs/specs/01-spec/07-slice/07-slice.md +105 -0
  54. package/docs/specs/01-spec/07-slice/CLOSURE_BRIEF.md +71 -0
  55. package/docs/specs/01-spec/07-slice/EXECUTION_BRIEF.md +39 -0
  56. package/docs/specs/01-spec/08-slice/08-slice.json +36 -0
  57. package/docs/specs/01-spec/08-slice/08-slice.md +105 -0
  58. package/docs/specs/01-spec/08-slice/CLOSURE_BRIEF.md +114 -0
  59. package/docs/specs/01-spec/08-slice/EXECUTION_BRIEF.md +39 -0
  60. package/docs/specs/01-spec/CLOSURE_BRIEF.md +87 -0
  61. package/docs/specs/01-spec/spec.md +197 -0
  62. package/docs/workflows/full-ai-spec-to-pr.md +46 -3
  63. package/i18n/es/docs/GITFLOW_PR_GUIDE.md.template +38 -1
  64. package/package.json +27 -1
  65. package/scripts/package-quiver.sh +82 -2
  66. package/scripts/release-quiver.sh +14 -3
  67. package/specs/[project-name]/slices/pr.md.template +19 -0
  68. package/specs/quiver-v43-cli-i18n-audit-release-readiness/command-language-mode-matrix.json +122 -1
  69. package/specs/quiver-v46-deep-project-analysis/EVIDENCE_REPORT.md +94 -0
  70. package/specs/quiver-v46-deep-project-analysis/EXECUTION_PLAN.md +26 -0
  71. package/specs/quiver-v46-deep-project-analysis/SPEC.md +157 -0
  72. package/specs/quiver-v46-deep-project-analysis/STATUS.md +26 -0
  73. package/specs/quiver-v46-deep-project-analysis/pr.md +131 -0
  74. package/specs/quiver-v46-deep-project-analysis/slices/slice-00-analysis-contract-foundation/CLOSURE_BRIEF.md +14 -0
  75. package/specs/quiver-v46-deep-project-analysis/slices/slice-00-analysis-contract-foundation/EXECUTION_BRIEF.md +41 -0
  76. package/specs/quiver-v46-deep-project-analysis/slices/slice-00-analysis-contract-foundation/slice.json +61 -0
  77. package/specs/quiver-v46-deep-project-analysis/slices/slice-01-stack-agnostic-discovery-sampling/CLOSURE_BRIEF.md +22 -0
  78. package/specs/quiver-v46-deep-project-analysis/slices/slice-01-stack-agnostic-discovery-sampling/EXECUTION_BRIEF.md +33 -0
  79. package/specs/quiver-v46-deep-project-analysis/slices/slice-01-stack-agnostic-discovery-sampling/slice.json +80 -0
  80. package/specs/quiver-v46-deep-project-analysis/slices/slice-02-provider-analysis-json-contract/CLOSURE_BRIEF.md +21 -0
  81. package/specs/quiver-v46-deep-project-analysis/slices/slice-02-provider-analysis-json-contract/EXECUTION_BRIEF.md +34 -0
  82. package/specs/quiver-v46-deep-project-analysis/slices/slice-02-provider-analysis-json-contract/slice.json +79 -0
  83. package/specs/quiver-v46-deep-project-analysis/slices/slice-03-doc-proposal-review-safe-writes/CLOSURE_BRIEF.md +19 -0
  84. package/specs/quiver-v46-deep-project-analysis/slices/slice-03-doc-proposal-review-safe-writes/EXECUTION_BRIEF.md +33 -0
  85. package/specs/quiver-v46-deep-project-analysis/slices/slice-03-doc-proposal-review-safe-writes/slice.json +79 -0
  86. package/specs/quiver-v46-deep-project-analysis/slices/slice-04-validation-docs-release-readiness/CLOSURE_BRIEF.md +20 -0
  87. package/specs/quiver-v46-deep-project-analysis/slices/slice-04-validation-docs-release-readiness/EXECUTION_BRIEF.md +32 -0
  88. package/specs/quiver-v46-deep-project-analysis/slices/slice-04-validation-docs-release-readiness/slice.json +85 -0
  89. package/specs/quiver-v50-audit-trust-foundation/EVIDENCE_REPORT.md +151 -0
  90. package/specs/quiver-v50-audit-trust-foundation/EXECUTION_PLAN.md +34 -0
  91. package/specs/quiver-v50-audit-trust-foundation/SPEC.md +113 -0
  92. package/specs/quiver-v50-audit-trust-foundation/STATUS.md +26 -0
  93. package/specs/quiver-v50-audit-trust-foundation/pr.md +120 -0
  94. package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/CLOSURE_BRIEF.md +20 -0
  95. package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/EXECUTION_BRIEF.md +58 -0
  96. package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/slice.json +57 -0
  97. package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/CLOSURE_BRIEF.md +24 -0
  98. package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/EXECUTION_BRIEF.md +67 -0
  99. package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/slice.json +71 -0
  100. package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/CLOSURE_BRIEF.md +24 -0
  101. package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/EXECUTION_BRIEF.md +71 -0
  102. package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/slice.json +81 -0
  103. package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/CLOSURE_BRIEF.md +22 -0
  104. package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/EXECUTION_BRIEF.md +57 -0
  105. package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/slice.json +56 -0
  106. package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/CLOSURE_BRIEF.md +23 -0
  107. package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/EXECUTION_BRIEF.md +68 -0
  108. package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/slice.json +84 -0
  109. package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/CLOSURE_BRIEF.md +25 -0
  110. package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/EXECUTION_BRIEF.md +73 -0
  111. package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/slice.json +72 -0
  112. package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/CLOSURE_BRIEF.md +22 -0
  113. package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/EXECUTION_BRIEF.md +66 -0
  114. package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/slice.json +74 -0
  115. package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/CLOSURE_BRIEF.md +29 -0
  116. package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/EXECUTION_BRIEF.md +74 -0
  117. package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/slice.json +81 -0
  118. package/specs/quiver-v51-cli-ergonomics-automation-contracts/EVIDENCE_REPORT.md +145 -0
  119. package/specs/quiver-v51-cli-ergonomics-automation-contracts/EXECUTION_PLAN.md +32 -0
  120. package/specs/quiver-v51-cli-ergonomics-automation-contracts/SPEC.md +109 -0
  121. package/specs/quiver-v51-cli-ergonomics-automation-contracts/STATUS.md +25 -0
  122. package/specs/quiver-v51-cli-ergonomics-automation-contracts/pr.md +69 -0
  123. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/CLOSURE_BRIEF.md +20 -0
  124. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/EXECUTION_BRIEF.md +58 -0
  125. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/slice.json +56 -0
  126. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/CLOSURE_BRIEF.md +21 -0
  127. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/EXECUTION_BRIEF.md +61 -0
  128. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/slice.json +68 -0
  129. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/CLOSURE_BRIEF.md +25 -0
  130. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/EXECUTION_BRIEF.md +65 -0
  131. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/pr.md +134 -0
  132. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/slice.json +80 -0
  133. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/CLOSURE_BRIEF.md +31 -0
  134. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/EXECUTION_BRIEF.md +80 -0
  135. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/pr.md +159 -0
  136. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/slice.json +102 -0
  137. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/CLOSURE_BRIEF.md +25 -0
  138. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/EXECUTION_BRIEF.md +74 -0
  139. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/pr.md +147 -0
  140. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/slice.json +91 -0
  141. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/CLOSURE_BRIEF.md +28 -0
  142. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/EXECUTION_BRIEF.md +73 -0
  143. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/pr.md +146 -0
  144. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/slice.json +100 -0
  145. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/CLOSURE_BRIEF.md +36 -0
  146. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/EXECUTION_BRIEF.md +76 -0
  147. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/pr.md +155 -0
  148. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/slice.json +111 -0
  149. package/specs/quiver-v52-schema-docs-release-hygiene/EVIDENCE_REPORT.md +95 -0
  150. package/specs/quiver-v52-schema-docs-release-hygiene/EXECUTION_PLAN.md +31 -0
  151. package/specs/quiver-v52-schema-docs-release-hygiene/SPEC.md +107 -0
  152. package/specs/quiver-v52-schema-docs-release-hygiene/STATUS.md +22 -0
  153. package/specs/quiver-v52-schema-docs-release-hygiene/pr.md +69 -0
  154. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/CLOSURE_BRIEF.md +21 -0
  155. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/EXECUTION_BRIEF.md +60 -0
  156. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/slice.json +62 -0
  157. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/CLOSURE_BRIEF.md +34 -0
  158. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/EXECUTION_BRIEF.md +71 -0
  159. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/pr.md +146 -0
  160. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/slice.json +106 -0
  161. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/CLOSURE_BRIEF.md +33 -0
  162. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/EXECUTION_BRIEF.md +67 -0
  163. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/pr.md +144 -0
  164. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/slice.json +86 -0
  165. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/CLOSURE_BRIEF.md +38 -0
  166. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/EXECUTION_BRIEF.md +75 -0
  167. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/pr.md +159 -0
  168. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/slice.json +105 -0
  169. package/src/create-quiver/commands/ai.js +521 -0
  170. package/src/create-quiver/commands/changelog.js +93 -0
  171. package/src/create-quiver/commands/config.js +16 -5
  172. package/src/create-quiver/commands/evidence.js +33 -2
  173. package/src/create-quiver/commands/flow.js +1 -0
  174. package/src/create-quiver/commands/graph.js +8 -2
  175. package/src/create-quiver/commands/plan.js +6 -0
  176. package/src/create-quiver/commands/spec.js +28 -13
  177. package/src/create-quiver/index.js +408 -98
  178. package/src/create-quiver/lib/ai/analyze-project-discovery.js +387 -0
  179. package/src/create-quiver/lib/ai/analyze-project-docs.js +364 -0
  180. package/src/create-quiver/lib/ai/analyze-project-parser.js +277 -0
  181. package/src/create-quiver/lib/ai/analyze-project-prompts.js +214 -0
  182. package/src/create-quiver/lib/ai/analyze-project-review.js +99 -0
  183. package/src/create-quiver/lib/ai/analyze-project-sampling.js +402 -0
  184. package/src/create-quiver/lib/ai/analyze-project-schema.js +92 -0
  185. package/src/create-quiver/lib/ai/analyze-project-validation.js +309 -0
  186. package/src/create-quiver/lib/ai/artifacts.js +4 -1
  187. package/src/create-quiver/lib/ai/github.js +5 -2
  188. package/src/create-quiver/lib/ai/spec-templates.js +19 -0
  189. package/src/create-quiver/lib/cli/command-registry.js +72 -0
  190. package/src/create-quiver/lib/cli/parser.js +14 -0
  191. package/src/create-quiver/lib/evidence.js +161 -6
  192. package/src/create-quiver/lib/git.js +99 -0
  193. package/src/create-quiver/lib/i18n/messages/en.js +52 -7
  194. package/src/create-quiver/lib/i18n/messages/es.js +54 -9
  195. package/src/create-quiver/lib/init-docs.js +1 -1
  196. package/src/create-quiver/lib/init-layout.js +9 -8
  197. package/src/create-quiver/lib/lifecycle.js +24 -26
  198. package/src/create-quiver/lib/readiness.js +67 -56
  199. package/src/create-quiver/lib/spec-worktrees.js +16 -34
@@ -12,6 +12,7 @@ const {
12
12
  const {
13
13
  runActiveSlice: runAiActiveSlice,
14
14
  runAgent: runAiAgent,
15
+ runAnalyzeProject: runAiAnalyzeProject,
15
16
  runApprovalStatus: runAiApprovalStatus,
16
17
  runApprove: runAiApprove,
17
18
  runDoctor: runAiDoctor,
@@ -35,6 +36,7 @@ const {
35
36
  runSpecsList: runAiSpecsList,
36
37
  runTraceReport: runAiTraceReport,
37
38
  } = require('./commands/ai');
39
+ const { runChangelog } = require('./commands/changelog');
38
40
  const { runConfig } = require('./commands/config');
39
41
  const { runDashboard } = require('./commands/dashboard');
40
42
  const { runDemo } = require('./commands/demo');
@@ -58,6 +60,15 @@ const { cleanupSlice, refreshActiveSlicesBoard, startSlice } = require('./lib/li
58
60
  const { buildSpecStatus, closeSpecWorktree, formatSpecCloseResult, formatSpecStartResult, formatSpecStatus, startSpecWorktree } = require('./lib/spec-worktrees');
59
61
  const { getContextPathExclusionReason } = require('./lib/ai/safety');
60
62
  const { selectOption } = require('./lib/cli/selectors');
63
+ const {
64
+ SUPPORTED_AI_COMMANDS,
65
+ SUPPORTED_COMMAND_MODES,
66
+ SUPPORTED_CONFIG_LANGUAGE_COMMANDS,
67
+ SUPPORTED_CONFIG_SECTIONS,
68
+ SUPPORTED_DEMO_COMMANDS,
69
+ SUPPORTED_SPEC_COMMANDS,
70
+ } = require('./lib/cli/command-registry');
71
+ const { parseCliArgs } = require('./lib/cli/parser');
61
72
  const { createUx } = require('./lib/cli/ux');
62
73
  const { validateUxFlags } = require('./lib/cli/ux-flags');
63
74
  const {
@@ -145,65 +156,38 @@ function formatLanguageWarningForCli(warning, language = DEFAULT_LANGUAGE) {
145
156
  }));
146
157
  }
147
158
 
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
- ]);
174
-
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
- ]);
159
+ const SLICE_NAMESPACE_COMMANDS = Object.freeze({
160
+ start: 'start-slice',
161
+ check: 'check-slice',
162
+ pr: 'check-pr',
163
+ scope: 'check-scope',
164
+ cleanup: 'cleanup-slice',
165
+ 'refresh-active': 'refresh-active-slices',
166
+ });
167
+
168
+ const HANDOFF_NAMESPACE_COMMANDS = Object.freeze({
169
+ check: 'check-handoff',
170
+ new: 'new-handoff',
171
+ });
172
+
173
+ const LEGACY_NAMESPACE_ALIASES = Object.freeze({
174
+ 'start-slice': 'slice start',
175
+ 'check-slice': 'slice check',
176
+ 'check-pr': 'slice pr',
177
+ 'check-scope': 'slice scope',
178
+ 'cleanup-slice': 'slice cleanup',
179
+ 'refresh-active-slices': 'slice refresh-active',
180
+ 'check-handoff': 'handoff check',
181
+ 'new-handoff': 'handoff new',
182
+ });
183
+
184
+ function legacyNamespaceAliasFor(mode) {
185
+ return LEGACY_NAMESPACE_ALIASES[mode] || '';
186
+ }
202
187
 
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']);
188
+ function formatLegacyNamespaceWarning(mode, canonicalCommand) {
189
+ return `create-quiver: ${mode} is a legacy alias; use npx create-quiver ${canonicalCommand}.`;
190
+ }
207
191
 
208
192
  function unsupportedCommandMessage(commandName) {
209
193
  const translator = createTranslator(currentErrorLanguage);
@@ -225,6 +209,7 @@ const COMMAND_HELP_GROUPS = [
225
209
  ['flow', 'Show the read-only guided workflow stage, blockers, and next safe command.'],
226
210
  ['dashboard', 'Show compact read-only project, spec, slice, run, approval, and agent status.'],
227
211
  ['version', 'Show a Quiver-branded version report; use --json for metadata.'],
212
+ ['changelog', 'Show recent local CHANGELOG.md release entries; use --json for metadata.'],
228
213
  ['config language show|set', 'Inspect or update the effective Quiver language without editing JSON by hand.'],
229
214
  ['prepare', 'Run setup diagnostics for providers, GitHub, SSH, and project readiness.'],
230
215
  ['migrate', 'Upgrade an already initialized Quiver project to the current contract.'],
@@ -245,6 +230,7 @@ const COMMAND_HELP_GROUPS = [
245
230
  ['ai active-slice status|reconcile', 'Inspect or dry-run reconcile local active-slice state from every supported source.'],
246
231
  ['ai status', 'Show current AI lifecycle phase, approved versions, blockers, and next command.'],
247
232
  ['ai resume', 'Resume guidance from the last valid lifecycle phase without chat memory.'],
233
+ ['ai analyze-project', 'Read and explain a bounded project sample without provider execution or writes.'],
248
234
  ['ai onboard', 'Run or print the planner onboarding prompt with a token-aware context pack.'],
249
235
  ['ai prepare-context', 'Preview or write docs-only AI context updates with assumptions and risks.'],
250
236
  ['ai agent set|list|show|doctor|repair', 'Manage, diagnose, and dry-run repair planner, executor, reviewer, and doctor provider profiles without secrets.'],
@@ -280,6 +266,8 @@ const COMMAND_HELP_GROUPS = [
280
266
  ['spec status', 'Show spec worktree, branch, slice-00 state, and pending slices.'],
281
267
  ['spec validate', 'Validate spec docs, slices, briefs, evidence, status, dependencies, and safe paths.'],
282
268
  ['spec close', 'Close a merged clean spec worktree and guide local sync.'],
269
+ ['slice start|check|pr|scope|cleanup|refresh-active', 'Canonical namespace for slice lifecycle, validation, scope, and board commands.'],
270
+ ['handoff check|new', 'Canonical namespace for validating or scaffolding handoff artifacts.'],
283
271
  ['start-slice', 'Start work on one slice and mark it active.'],
284
272
  ['check-slice', 'Validate slice structure, dependencies, scope, and readiness.'],
285
273
  ['check-pr', 'Validate PR readiness for a slice/spec workflow.'],
@@ -294,6 +282,8 @@ const COMMAND_HELP_GROUPS = [
294
282
  title: 'Evidence and demos',
295
283
  commands: [
296
284
  ['evidence run', 'Run a command and record exit code, duration, redacted output, and Markdown evidence.'],
285
+ ['evidence list', 'List local evidence records; use --json for automation.'],
286
+ ['evidence show', 'Show one local evidence record; use --json for automation.'],
297
287
  ['demo create spec-viewer', 'Create or preview the optional static Quiver Spec Viewer demo scaffold.'],
298
288
  ],
299
289
  },
@@ -329,6 +319,7 @@ function printUsage(language = DEFAULT_LANGUAGE) {
329
319
  npx create-quiver flow [options]
330
320
  npx create-quiver dashboard [options]
331
321
  npx create-quiver version [--json]
322
+ npx create-quiver changelog [--json]
332
323
  npx create-quiver config language show [--json]
333
324
  npx create-quiver config language set <en|es> [--global]
334
325
  npx create-quiver plan [options]
@@ -338,6 +329,7 @@ function printUsage(language = DEFAULT_LANGUAGE) {
338
329
  npx create-quiver ai active-slice reconcile --dry-run
339
330
  npx create-quiver ai status [options]
340
331
  npx create-quiver ai resume [options]
332
+ npx create-quiver ai analyze-project [--deep] [--dry-run] [--json]
341
333
  npx create-quiver ai inspect [options]
342
334
  npx create-quiver ai export [--format json|markdown]
343
335
  npx create-quiver ai specs list [--json]
@@ -366,7 +358,9 @@ function printUsage(language = DEFAULT_LANGUAGE) {
366
358
  npx create-quiver spec status <spec-dir>
367
359
  npx create-quiver spec validate <spec-dir>
368
360
  npx create-quiver spec close <spec-dir>
369
- npx create-quiver evidence run [options] -- <command>
361
+ npx create-quiver slice <start|check|pr|scope|cleanup|refresh-active> [options]
362
+ npx create-quiver handoff <check|new> [options]
363
+ npx create-quiver evidence <run|list|show> [options]
370
364
  npx create-quiver demo create spec-viewer [options]
371
365
 
372
366
  ${formatCommandHelpGroups(language)}
@@ -395,7 +389,14 @@ ${helpText(help, 'headings', 'options', 'Options:')}
395
389
  --full ${optionDescription(help, 'Plan or run the full compatibility init profile')}
396
390
  --legacy-scripts ${optionDescription(help, 'Include legacy Bash wrappers in init profile')}
397
391
  --include-templates ${optionDescription(help, 'Export packaged templates in init profile')}
398
- --dry-run ${optionDescription(help, 'Preview init, analyze, migrate, prepare, spec create/start/close, demo, ai agent set, or AI work without executing writes/providers')}
392
+ --dry-run ${optionDescription(help, 'Preview init, analyze, migrate, prepare, spec create/start/close, demo, ai agent set, ai analyze-project, or AI work without executing writes/providers')}
393
+ --deep ${optionDescription(help, 'For ai analyze-project, include source and DB files in the read-only sample')}
394
+ --max-files <n> ${optionDescription(help, 'For ai analyze-project, maximum files in the semantic sample')}
395
+ --max-bytes <n> ${optionDescription(help, 'For ai analyze-project, maximum selected bytes in the semantic sample')}
396
+ --include-source ${optionDescription(help, 'For ai analyze-project, include source files without requiring --deep')}
397
+ --include-tests ${optionDescription(help, 'For ai analyze-project, include test files in the sample')}
398
+ --include-db ${optionDescription(help, 'For ai analyze-project, include schema, migration, and DB files in the sample')}
399
+ --scope <path|name> ${optionDescription(help, 'For ai analyze-project, restrict discovery to a repo path or workspace name')}
399
400
  --print-prompt ${optionDescription(help, 'Print the exact AI prompt and exit without executing provider CLIs')}
400
401
  --with-planner ${optionDescription(help, 'Enable planner-assisted behavior on commands that explicitly support it')}
401
402
  --interactive ${optionDescription(help, 'Enable prompts on commands that explicitly support interactive choices')}
@@ -415,11 +416,11 @@ ${helpText(help, 'headings', 'options', 'Options:')}
415
416
  --ssh-host-alias <name> ${optionDescription(help, 'SSH host alias to validate for prepare or AI commands')}
416
417
  --identity-file <path> ${optionDescription(help, 'SSH identity file to validate for prepare or AI commands')}
417
418
  --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)')}
419
+ --base <branch> ${optionDescription(help, 'Base branch override for check-slice, check-scope, check-pr, ai pr, spec start, or spec close')}
419
420
  --output <file> ${optionDescription(help, 'Output file for evidence run')}
420
421
  --max-output <n> ${optionDescription(help, 'Maximum stdout/stderr chars per evidence section')}
421
422
  --title <text> ${optionDescription(help, 'Override PR title for ai pr create')}
422
- -y, --yes ${optionDescription(help, 'Skip prompts and use the provided inputs')}
423
+ -y, --yes ${optionDescription(help, 'Skip prompts and confirm write prompts such as migrate')}
423
424
  -V, --version ${optionDescription(help, 'Show the installed create-quiver version')}
424
425
  -h, --help ${optionDescription(help, 'Show this help message')}
425
426
 
@@ -435,6 +436,8 @@ ${helpText(help, 'headings', 'examples', 'Examples:')}
435
436
  cd ./my-project && npx create-quiver dashboard --json
436
437
  cd ./my-project && npx create-quiver version
437
438
  cd ./my-project && npx create-quiver version --json
439
+ cd ./my-project && npx create-quiver changelog
440
+ cd ./my-project && npx create-quiver changelog --json
438
441
  cd ./my-project && npx create-quiver config language show
439
442
  cd ./my-project && npx create-quiver config language set es
440
443
  npx create-quiver config language set en --global
@@ -442,6 +445,8 @@ ${helpText(help, 'headings', 'examples', 'Examples:')}
442
445
  cd ./my-project && npx create-quiver plan --json
443
446
  cd ./my-project && npx create-quiver ai onboard --dry-run
444
447
  cd ./my-project && npx create-quiver ai onboard --print-prompt
448
+ cd ./my-project && npx create-quiver ai analyze-project --deep --dry-run
449
+ cd ./my-project && npx create-quiver ai analyze-project --deep --json
445
450
  cd ./my-project && npx create-quiver ai prepare-context --dry-run
446
451
  cd ./my-project && npx create-quiver ai run create --input requirements.md
447
452
  cd ./my-project && npx create-quiver ai active-slice reconcile --dry-run
@@ -499,6 +504,8 @@ ${helpText(help, 'headings', 'examples', 'Examples:')}
499
504
  cd ./my-project && npx create-quiver spec status specs/my-project
500
505
  cd ./my-project && npx create-quiver spec validate specs/my-project
501
506
  cd ./my-project && npx create-quiver spec close specs/my-project --dry-run
507
+ cd ./my-project && npx create-quiver slice check --local specs/my-project/slices/slice-01/slice.json
508
+ cd ./my-project && npx create-quiver handoff check specs/my-project/slices/slice-01/EXECUTION_BRIEF.md
502
509
  cd ./my-project && npx create-quiver evidence run -- npm test
503
510
  cd ./my-project && npx create-quiver demo create spec-viewer --dry-run
504
511
  node bin/create-quiver.js doctor --dir ./my-project
@@ -568,6 +575,14 @@ function parseArgs(argv, options = {}) {
568
575
  aiInput: '',
569
576
  aiSlice: '',
570
577
  aiTimeout: null,
578
+ aiAnalyzeDeep: false,
579
+ aiAnalyzeIncludeDb: false,
580
+ aiAnalyzeIncludeSource: false,
581
+ aiAnalyzeIncludeTests: false,
582
+ aiAnalyzeMaxBytes: null,
583
+ aiAnalyzeMaxFiles: null,
584
+ aiAnalyzeScope: '',
585
+ aiAnalyzeOptionUsed: false,
571
586
  aiCommit: false,
572
587
  aiAllowDirty: false,
573
588
  aiExecute: false,
@@ -584,22 +599,33 @@ function parseArgs(argv, options = {}) {
584
599
  initLegacyScripts: false,
585
600
  initMinimal: false,
586
601
  specCommand: '',
602
+ sliceCommand: '',
603
+ handoffCommand: '',
604
+ legacyAliasCommand: '',
587
605
  demoCommand: '',
588
606
  demoName: '',
589
607
  evidenceCommand: '',
590
608
  evidenceArgs: [],
591
609
  evidenceOutput: '',
592
610
  evidenceMaxOutput: null,
611
+ evidenceTarget: '',
593
612
  };
594
613
 
595
614
  const args = [...argv];
596
615
  if (SUPPORTED_COMMAND_MODES.has(args[0])) {
597
616
  result.mode = args[0];
617
+ result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
598
618
  result.explicitInit = args[0] === 'init';
599
619
  args.shift();
600
620
  if (result.mode === 'spec') {
601
621
  result.specCommand = args.shift() || '';
602
622
  }
623
+ if (result.mode === 'slice') {
624
+ result.sliceCommand = args.shift() || '';
625
+ }
626
+ if (result.mode === 'handoff') {
627
+ result.handoffCommand = args.shift() || '';
628
+ }
603
629
  if (result.mode === 'evidence') {
604
630
  result.evidenceCommand = args.shift() || '';
605
631
  }
@@ -618,9 +644,11 @@ function parseArgs(argv, options = {}) {
618
644
  args.shift();
619
645
  } else if (args[0] === '--check-handoff') {
620
646
  result.mode = 'check-handoff';
647
+ result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
621
648
  args.shift();
622
649
  } else if (args[0] === '--new-handoff') {
623
650
  result.mode = 'new-handoff';
651
+ result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
624
652
  args.shift();
625
653
  } else if (args[0] && !args[0].startsWith('-')) {
626
654
  throw new Error(formatError(unsupportedCommandMessage(args[0])));
@@ -671,11 +699,13 @@ function parseArgs(argv, options = {}) {
671
699
 
672
700
  if (arg === '--check-handoff') {
673
701
  result.mode = 'check-handoff';
702
+ result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
674
703
  continue;
675
704
  }
676
705
 
677
706
  if (arg === '--new-handoff') {
678
707
  result.mode = 'new-handoff';
708
+ result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
679
709
  continue;
680
710
  }
681
711
 
@@ -709,6 +739,68 @@ function parseArgs(argv, options = {}) {
709
739
  continue;
710
740
  }
711
741
 
742
+ if (arg === '--deep') {
743
+ result.aiAnalyzeDeep = true;
744
+ result.aiAnalyzeOptionUsed = true;
745
+ continue;
746
+ }
747
+
748
+ if (arg === '--include-source') {
749
+ result.aiAnalyzeIncludeSource = true;
750
+ result.aiAnalyzeOptionUsed = true;
751
+ continue;
752
+ }
753
+
754
+ if (arg === '--include-tests') {
755
+ result.aiAnalyzeIncludeTests = true;
756
+ result.aiAnalyzeOptionUsed = true;
757
+ continue;
758
+ }
759
+
760
+ if (arg === '--include-db') {
761
+ result.aiAnalyzeIncludeDb = true;
762
+ result.aiAnalyzeOptionUsed = true;
763
+ continue;
764
+ }
765
+
766
+ if (arg === '--max-files') {
767
+ const value = args[++index];
768
+ if (typeof value === 'undefined') {
769
+ throw new Error(formatError('missing value for --max-files'));
770
+ }
771
+ const parsed = Number.parseInt(value, 10);
772
+ if (!Number.isInteger(parsed) || parsed <= 0) {
773
+ throw new Error(formatError('invalid value for --max-files'));
774
+ }
775
+ result.aiAnalyzeMaxFiles = parsed;
776
+ result.aiAnalyzeOptionUsed = true;
777
+ continue;
778
+ }
779
+
780
+ if (arg === '--max-bytes') {
781
+ const value = args[++index];
782
+ if (typeof value === 'undefined') {
783
+ throw new Error(formatError('missing value for --max-bytes'));
784
+ }
785
+ const parsed = Number.parseInt(value, 10);
786
+ if (!Number.isInteger(parsed) || parsed <= 0) {
787
+ throw new Error(formatError('invalid value for --max-bytes'));
788
+ }
789
+ result.aiAnalyzeMaxBytes = parsed;
790
+ result.aiAnalyzeOptionUsed = true;
791
+ continue;
792
+ }
793
+
794
+ if (arg === '--scope') {
795
+ const value = args[++index];
796
+ if (!value || String(value).startsWith('--')) {
797
+ throw new Error(formatError('missing value for --scope'));
798
+ }
799
+ result.aiAnalyzeScope = value;
800
+ result.aiAnalyzeOptionUsed = true;
801
+ continue;
802
+ }
803
+
712
804
  if (arg === '--print-prompt') {
713
805
  result.aiPrintPrompt = true;
714
806
  continue;
@@ -1168,6 +1260,10 @@ function parseArgs(argv, options = {}) {
1168
1260
  positional.push(arg);
1169
1261
  }
1170
1262
 
1263
+ if (result.aiAnalyzeOptionUsed && result.mode !== 'ai') {
1264
+ throw new Error(formatError('analysis flags are only supported by ai analyze-project'));
1265
+ }
1266
+
1171
1267
  if (result.mode === 'init') {
1172
1268
  if (!result.projectName && positional.length > 0) {
1173
1269
  result.projectName = positional.shift();
@@ -1197,13 +1293,17 @@ function parseArgs(argv, options = {}) {
1197
1293
  result.configSection = positional.shift();
1198
1294
  }
1199
1295
  if (!SUPPORTED_CONFIG_SECTIONS.has(result.configSection)) {
1200
- throw new Error(formatError(`unsupported config section: ${result.configSection || '(missing)'}. Supported sections: language`));
1296
+ throw new Error(formatError(translate(currentErrorLanguage, 'config.error.unsupported_section', {
1297
+ section: result.configSection || '(missing)',
1298
+ })));
1201
1299
  }
1202
1300
  if (!result.configCommand && positional.length > 0) {
1203
1301
  result.configCommand = positional.shift();
1204
1302
  }
1205
1303
  if (!SUPPORTED_CONFIG_LANGUAGE_COMMANDS.has(result.configCommand)) {
1206
- throw new Error(formatError(`unsupported config language command: ${result.configCommand || '(missing)'}. Supported commands: show, set`));
1304
+ throw new Error(formatError(translate(currentErrorLanguage, 'config.error.unsupported_language_command', {
1305
+ command: result.configCommand || '(missing)',
1306
+ })));
1207
1307
  }
1208
1308
  if (result.configCommand === 'set') {
1209
1309
  if (positional.length === 0) {
@@ -1218,6 +1318,9 @@ function parseArgs(argv, options = {}) {
1218
1318
  if (!result.aiCommand && positional.length > 0) {
1219
1319
  result.aiCommand = positional.shift();
1220
1320
  }
1321
+ if (result.aiAnalyzeOptionUsed && result.aiCommand !== 'analyze-project') {
1322
+ throw new Error(formatError('analysis flags are only supported by ai analyze-project'));
1323
+ }
1221
1324
  if (result.aiCommand === 'agent') {
1222
1325
  if (!result.aiAgentCommand && positional.length > 0) {
1223
1326
  result.aiAgentCommand = positional.shift();
@@ -1252,6 +1355,38 @@ function parseArgs(argv, options = {}) {
1252
1355
  if (positional.length > 0) {
1253
1356
  throw new Error(formatError('refresh-active-slices does not accept positional arguments'));
1254
1357
  }
1358
+ } else if (result.mode === 'slice') {
1359
+ if (!result.sliceCommand && positional.length > 0) {
1360
+ result.sliceCommand = positional.shift();
1361
+ }
1362
+ const mappedMode = SLICE_NAMESPACE_COMMANDS[result.sliceCommand];
1363
+ if (!mappedMode) {
1364
+ throw new Error(formatError(`unsupported slice subcommand: ${result.sliceCommand || '(missing)'}. Supported tasks: start, check, pr, scope, cleanup, refresh-active`));
1365
+ }
1366
+ result.mode = mappedMode;
1367
+ if (mappedMode === 'refresh-active-slices') {
1368
+ if (positional.length > 0) {
1369
+ throw new Error(formatError('slice refresh-active does not accept positional arguments'));
1370
+ }
1371
+ } else {
1372
+ result.targetDir = positional.shift() || '';
1373
+ if (!result.targetDir) {
1374
+ throw new Error(formatError(`slice ${result.sliceCommand} requires a slice.json path`));
1375
+ }
1376
+ }
1377
+ } else if (result.mode === 'handoff') {
1378
+ if (!result.handoffCommand && positional.length > 0) {
1379
+ result.handoffCommand = positional.shift();
1380
+ }
1381
+ const mappedMode = HANDOFF_NAMESPACE_COMMANDS[result.handoffCommand];
1382
+ if (!mappedMode) {
1383
+ throw new Error(formatError(`unsupported handoff subcommand: ${result.handoffCommand || '(missing)'}. Supported tasks: check, new`));
1384
+ }
1385
+ result.mode = mappedMode;
1386
+ result.targetDir = positional.shift() || '';
1387
+ if (!result.targetDir) {
1388
+ throw new Error(formatError(`handoff ${result.handoffCommand} requires ${result.handoffCommand === 'new' ? 'a spec slug' : 'a handoff or brief path'}`));
1389
+ }
1255
1390
  } else if (result.mode === 'spec') {
1256
1391
  if (!result.specCommand && positional.length > 0) {
1257
1392
  result.specCommand = positional.shift();
@@ -1270,14 +1405,26 @@ function parseArgs(argv, options = {}) {
1270
1405
  result.evidenceCommand = positional.shift();
1271
1406
  }
1272
1407
  if (!result.evidenceCommand) {
1273
- throw new Error(formatError('missing evidence subcommand. Use: npx create-quiver evidence run -- <command>'));
1408
+ throw new Error(formatError('missing evidence subcommand. Use: npx create-quiver evidence <run|list|show>'));
1274
1409
  }
1275
- if (result.evidenceCommand !== 'run') {
1276
- throw new Error(formatError(`unsupported evidence subcommand: ${result.evidenceCommand}. Supported tasks: run`));
1410
+ if (!['run', 'list', 'show'].includes(result.evidenceCommand)) {
1411
+ throw new Error(formatError(`unsupported evidence subcommand: ${result.evidenceCommand}. Supported tasks: run, list, show`));
1277
1412
  }
1278
- if (positional.length > 0) {
1413
+ if (result.evidenceCommand === 'run' && positional.length > 0) {
1279
1414
  throw new Error(formatError('evidence run does not accept positional arguments before --'));
1280
1415
  }
1416
+ if (result.evidenceCommand === 'list' && positional.length > 0) {
1417
+ throw new Error(formatError('evidence list does not accept positional arguments'));
1418
+ }
1419
+ if (result.evidenceCommand === 'show') {
1420
+ result.evidenceTarget = positional.shift() || '';
1421
+ if (!result.evidenceTarget) {
1422
+ throw new Error(formatError('evidence show requires an evidence file path'));
1423
+ }
1424
+ if (positional.length > 0) {
1425
+ throw new Error(formatError('evidence show accepts exactly one evidence file path'));
1426
+ }
1427
+ }
1281
1428
  } else if (result.mode === 'demo') {
1282
1429
  if (!result.demoCommand && positional.length > 0) {
1283
1430
  result.demoCommand = positional.shift();
@@ -2321,15 +2468,46 @@ function writeProjectScanArtifacts(projectRoot, scan) {
2321
2468
  return { jsonPath, mdPath: scanPaths.projectMapPath };
2322
2469
  }
2323
2470
 
2324
- function runAnalyze(targetDir, options = {}) {
2471
+ function createCommandProgressUx(options = {}) {
2472
+ return createUx({
2473
+ env: options.env || process.env,
2474
+ error: options.error,
2475
+ input: options.input,
2476
+ interactive: false,
2477
+ json: options.json,
2478
+ noColor: options.noColor,
2479
+ output: options.output,
2480
+ prompts: options.prompts,
2481
+ spinner: options.noColor === true ? false : options.spinner,
2482
+ stderrIsTTY: options.stderrIsTTY,
2483
+ stdinIsTTY: options.stdinIsTTY,
2484
+ stdoutIsTTY: options.stdoutIsTTY,
2485
+ write: options.write,
2486
+ });
2487
+ }
2488
+
2489
+ async function runProgress(ux, message, task, successMessage = message) {
2490
+ return ux.withSpinner(message, task, {
2491
+ echo: false,
2492
+ successMessage,
2493
+ });
2494
+ }
2495
+
2496
+ async function runAnalyze(targetDir, options = {}) {
2325
2497
  const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
2326
2498
  const translator = createTranslator(options.language);
2499
+ const progress = createCommandProgressUx(options);
2327
2500
 
2328
2501
  if (!fs.existsSync(projectRoot)) {
2329
2502
  throw new Error(formatError(`target directory does not exist: ${projectRoot}`));
2330
2503
  }
2331
2504
 
2332
- const scan = buildProjectScan(projectRoot);
2505
+ const scan = await runProgress(
2506
+ progress,
2507
+ translator.t('analyze.progress.scanning'),
2508
+ () => buildProjectScan(projectRoot),
2509
+ translator.t('analyze.progress.scanned'),
2510
+ );
2333
2511
 
2334
2512
  if (options.dryRun) {
2335
2513
  console.log(translator.t('analyze.dry_run_for', { path: projectRoot }));
@@ -2350,9 +2528,24 @@ function runAnalyze(targetDir, options = {}) {
2350
2528
  };
2351
2529
  }
2352
2530
 
2353
- const artifacts = writeProjectScanArtifacts(projectRoot, scan);
2354
- const aiContextPath = refreshAiContextDoc(projectRoot, scan);
2355
- updateStateForAnalyze(projectRoot, CLI_VERSION);
2531
+ const artifacts = await runProgress(
2532
+ progress,
2533
+ translator.t('analyze.progress.writing_artifacts'),
2534
+ () => writeProjectScanArtifacts(projectRoot, scan),
2535
+ translator.t('analyze.progress.artifacts_written'),
2536
+ );
2537
+ const aiContextPath = await runProgress(
2538
+ progress,
2539
+ translator.t('analyze.progress.refreshing_context'),
2540
+ () => refreshAiContextDoc(projectRoot, scan),
2541
+ translator.t('analyze.progress.context_refreshed'),
2542
+ );
2543
+ await runProgress(
2544
+ progress,
2545
+ translator.t('analyze.progress.updating_state'),
2546
+ () => updateStateForAnalyze(projectRoot, CLI_VERSION),
2547
+ translator.t('analyze.progress.state_updated'),
2548
+ );
2356
2549
 
2357
2550
  console.log(translator.t('analyze.completed_for', { path: projectRoot }));
2358
2551
  console.log(translator.t('analyze.wrote', { path: relativePosixPath(projectRoot, artifacts.jsonPath) }));
@@ -2369,7 +2562,39 @@ function runAnalyze(targetDir, options = {}) {
2369
2562
  };
2370
2563
  }
2371
2564
 
2372
- function runMigrate(targetDir, options = {}) {
2565
+ async function confirmMigrateWrite(projectRoot, options, translator) {
2566
+ if (options.force === true) {
2567
+ return;
2568
+ }
2569
+
2570
+ const ux = createUx({
2571
+ env: options.env,
2572
+ error: options.error,
2573
+ input: options.input,
2574
+ interactive: true,
2575
+ json: options.json,
2576
+ noColor: options.noColor,
2577
+ output: options.output,
2578
+ promptConfirm: options.promptConfirm,
2579
+ stderrIsTTY: options.stderrIsTTY,
2580
+ stdinIsTTY: options.stdinIsTTY,
2581
+ stdoutIsTTY: options.stdoutIsTTY,
2582
+ write: options.write,
2583
+ });
2584
+
2585
+ if (!ux.mode.usePrompts) {
2586
+ throw new Error(formatError(translator.t('migrate.confirm.required')));
2587
+ }
2588
+
2589
+ const confirmed = await ux.promptConfirm(translator.t('migrate.confirm.prompt', { path: projectRoot }), {
2590
+ initialValue: false,
2591
+ });
2592
+ if (!confirmed) {
2593
+ throw new Error(formatError(translator.t('migrate.confirm.declined')));
2594
+ }
2595
+ }
2596
+
2597
+ async function runMigrate(targetDir, options = {}) {
2373
2598
  const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
2374
2599
  const translator = createTranslator(options.language);
2375
2600
 
@@ -2410,6 +2635,8 @@ function runMigrate(targetDir, options = {}) {
2410
2635
  return;
2411
2636
  }
2412
2637
 
2638
+ await confirmMigrateWrite(projectRoot, options, translator);
2639
+
2413
2640
  const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'quiver-migrate-'));
2414
2641
 
2415
2642
  try {
@@ -3158,8 +3385,9 @@ async function run(argv) {
3158
3385
  return;
3159
3386
  }
3160
3387
 
3161
- const args = parseArgs(normalizedArgv, {
3388
+ const args = parseCliArgs(normalizedArgv, {
3162
3389
  language: languageArgs.language,
3390
+ legacyParseArgs: parseArgs,
3163
3391
  });
3164
3392
  args.languageResolution = languageResolution;
3165
3393
  args.language = args.languageResolution.language;
@@ -3180,12 +3408,20 @@ async function run(argv) {
3180
3408
  for (const warning of args.languageResolution.warnings || []) {
3181
3409
  process.stderr.write(`${formatLanguageWarningForCli(warning, args.language)}\n`);
3182
3410
  }
3411
+ if (args.legacyAliasCommand) {
3412
+ process.stderr.write(`${formatLegacyNamespaceWarning(args.mode, args.legacyAliasCommand)}\n`);
3413
+ }
3183
3414
  }
3184
3415
 
3185
3416
  if (args.mode === 'analyze') {
3186
- runAnalyze(args.targetDir, {
3417
+ await runAnalyze(args.targetDir, {
3187
3418
  dryRun: args.dryRun,
3419
+ json: args.json,
3188
3420
  language: args.language,
3421
+ noColor: args.noColor,
3422
+ stderrIsTTY: Boolean(process.stderr.isTTY),
3423
+ stdinIsTTY: Boolean(process.stdin.isTTY),
3424
+ stdoutIsTTY: Boolean(process.stdout.isTTY),
3189
3425
  });
3190
3426
  return;
3191
3427
  }
@@ -3231,11 +3467,17 @@ async function run(argv) {
3231
3467
  return;
3232
3468
  }
3233
3469
 
3470
+ if (args.mode === 'changelog') {
3471
+ runChangelog({ json: args.json });
3472
+ return;
3473
+ }
3474
+
3234
3475
  if (args.mode === 'config') {
3235
3476
  runConfig(process.cwd(), {
3236
3477
  command: args.configCommand,
3237
3478
  global: args.configGlobal,
3238
3479
  json: args.json,
3480
+ language: args.language,
3239
3481
  languageResolution: args.languageResolution,
3240
3482
  section: args.configSection,
3241
3483
  value: args.configValue,
@@ -3267,7 +3509,28 @@ async function run(argv) {
3267
3509
 
3268
3510
  if (args.mode === 'ai') {
3269
3511
  if (!args.aiCommand) {
3270
- throw new Error(formatError('missing ai subcommand. Use: npx create-quiver ai onboard | prepare-context | run | active-slice | status | resume | inspect | export | specs | slices | models | trace | plan | revise | repair-plan | review-plan | approve | approvals | agent | prompt-slice | execute-slice | execute-plan | doctor | pr'));
3512
+ throw new Error(formatError('missing ai subcommand. Use: npx create-quiver ai analyze-project | onboard | prepare-context | run | active-slice | status | resume | inspect | export | specs | slices | models | trace | plan | revise | repair-plan | review-plan | approve | approvals | agent | prompt-slice | execute-slice | execute-plan | doctor | pr'));
3513
+ }
3514
+
3515
+ if (args.aiCommand === 'analyze-project') {
3516
+ await runAiAnalyzeProject(process.cwd(), {
3517
+ deep: args.aiAnalyzeDeep,
3518
+ dryRun: args.dryRun,
3519
+ force: args.force,
3520
+ includeDb: args.aiAnalyzeIncludeDb,
3521
+ includeSource: args.aiAnalyzeIncludeSource,
3522
+ includeTests: args.aiAnalyzeIncludeTests,
3523
+ interactive: args.interactive,
3524
+ json: args.json,
3525
+ language: args.language,
3526
+ maxBytes: args.aiAnalyzeMaxBytes || undefined,
3527
+ maxFiles: args.aiAnalyzeMaxFiles || undefined,
3528
+ printPrompt: args.aiPrintPrompt,
3529
+ review: args.review,
3530
+ scope: args.aiAnalyzeScope || undefined,
3531
+ strict: args.strict,
3532
+ });
3533
+ return;
3271
3534
  }
3272
3535
 
3273
3536
  if (args.aiCommand === 'run') {
@@ -3570,7 +3833,7 @@ async function run(argv) {
3570
3833
 
3571
3834
  if (args.aiCommand === 'pr') {
3572
3835
  await runAiPr(process.cwd(), {
3573
- baseBranch: args.aiBaseBranch,
3836
+ baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
3574
3837
  create: args.aiCreate,
3575
3838
  dryRun: args.dryRun,
3576
3839
  input: args.aiInput || undefined,
@@ -3585,7 +3848,7 @@ async function run(argv) {
3585
3848
  return;
3586
3849
  }
3587
3850
 
3588
- throw new Error(formatError(`unsupported ai subcommand: ${args.aiCommand}. Supported tasks: onboard, prepare-context, run, active-slice, status, resume, inspect, export, specs, slices, models, trace, plan, revise, repair-plan, review-plan, approve, approvals, agent, prompt-slice, execute-slice, execute-plan, doctor, pr`));
3851
+ throw new Error(formatError(`unsupported ai subcommand: ${args.aiCommand}. Supported tasks: analyze-project, onboard, prepare-context, run, active-slice, status, resume, inspect, export, specs, slices, models, trace, plan, revise, repair-plan, review-plan, approve, approvals, agent, prompt-slice, execute-slice, execute-plan, doctor, pr`));
3589
3852
  }
3590
3853
 
3591
3854
  if (args.mode === 'graph') {
@@ -3620,7 +3883,9 @@ async function run(argv) {
3620
3883
  language: args.language,
3621
3884
  maxOutput: args.evidenceMaxOutput || undefined,
3622
3885
  output: args.evidenceOutput || undefined,
3886
+ json: args.json,
3623
3887
  subcommand: args.evidenceCommand,
3888
+ target: args.evidenceTarget,
3624
3889
  });
3625
3890
  process.exitCode = result.exitCode;
3626
3891
  return;
@@ -3639,10 +3904,16 @@ async function run(argv) {
3639
3904
  }
3640
3905
 
3641
3906
  if (args.mode === 'migrate') {
3642
- runMigrate(args.targetDir, {
3907
+ await runMigrate(args.targetDir, {
3643
3908
  dryRun: args.dryRun,
3909
+ force: args.force,
3910
+ json: args.json,
3644
3911
  language: args.language,
3912
+ noColor: args.noColor,
3645
3913
  skipInstall: args.skipInstall,
3914
+ stderrIsTTY: Boolean(process.stderr.isTTY),
3915
+ stdinIsTTY: Boolean(process.stdin.isTTY),
3916
+ stdoutIsTTY: Boolean(process.stdout.isTTY),
3646
3917
  });
3647
3918
  return;
3648
3919
  }
@@ -3680,7 +3951,11 @@ async function run(argv) {
3680
3951
  }
3681
3952
 
3682
3953
  if (args.mode === 'check-pr') {
3683
- checkPrReadiness(args.targetDir, { language: args.language });
3954
+ checkPrReadiness(args.targetDir, {
3955
+ baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
3956
+ language: args.language,
3957
+ remote: args.aiRemote,
3958
+ });
3684
3959
  return;
3685
3960
  }
3686
3961
 
@@ -3751,11 +4026,12 @@ async function run(argv) {
3751
4026
  }
3752
4027
 
3753
4028
  if (!args.targetDir || args.targetDir === '.') {
3754
- throw new Error(formatError('missing spec directory. Use: npx create-quiver spec <start|status|validate|close> <spec-dir>'));
4029
+ throw new Error(formatError(createTranslator(args.language).t('spec.error.missing_directory_command')));
3755
4030
  }
3756
4031
 
3757
4032
  if (args.specCommand === 'start') {
3758
4033
  const report = startSpecWorktree(process.cwd(), args.targetDir, {
4034
+ baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
3759
4035
  dryRun: args.dryRun,
3760
4036
  });
3761
4037
  process.stdout.write(formatSpecStartResult(report, { language: args.language }));
@@ -3778,7 +4054,7 @@ async function run(argv) {
3778
4054
 
3779
4055
  if (args.specCommand === 'close') {
3780
4056
  const report = closeSpecWorktree(process.cwd(), args.targetDir, {
3781
- baseBranch: args.aiBaseBranch,
4057
+ baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
3782
4058
  discard: args.discard,
3783
4059
  dryRun: args.dryRun,
3784
4060
  force: args.force,
@@ -3824,25 +4100,60 @@ async function run(argv) {
3824
4100
  }
3825
4101
 
3826
4102
  const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'quiver-create-'));
4103
+ const translator = createTranslator(args.language);
4104
+ const progress = createCommandProgressUx({
4105
+ json: args.json,
4106
+ noColor: args.noColor,
4107
+ stderrIsTTY: Boolean(process.stderr.isTTY),
4108
+ stdinIsTTY: Boolean(process.stdin.isTTY),
4109
+ stdoutIsTTY: Boolean(process.stdout.isTTY),
4110
+ });
3827
4111
 
3828
4112
  try {
3829
- ensureDir(targetDir);
3830
-
3831
- const templateRoot = packTemplate(packageRoot, tempRoot);
4113
+ let templateRoot = '';
4114
+ await runProgress(
4115
+ progress,
4116
+ translator.t('init.progress.preparing_templates'),
4117
+ () => {
4118
+ ensureDir(targetDir);
4119
+ templateRoot = packTemplate(packageRoot, tempRoot);
4120
+ return templateRoot;
4121
+ },
4122
+ translator.t('init.progress.templates_ready'),
4123
+ );
3832
4124
  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 });
4125
+ await runProgress(
4126
+ progress,
4127
+ translator.t('init.progress.exporting_templates'),
4128
+ () => exportTemplatesToLegacyRoot(templateRoot, targetDir),
4129
+ translator.t('init.progress.templates_exported'),
4130
+ );
4131
+ }
4132
+ let languageWrite = null;
4133
+ await runProgress(
4134
+ progress,
4135
+ translator.t('init.progress.writing_docs'),
4136
+ () => {
4137
+ runInitDocs(targetDir, initOptions.projectName, {
4138
+ includeTemplates: initOptions.includeTemplates,
4139
+ language: initLanguage.docsLanguage,
4140
+ legacyScripts: initOptions.legacyScripts,
4141
+ profile: initLayout.profile,
4142
+ templateRoot,
4143
+ });
4144
+ languageWrite = persistInitLanguage(targetDir, { language: initLanguage.configLanguage });
4145
+ return languageWrite;
4146
+ },
4147
+ translator.t('init.progress.docs_written'),
4148
+ );
3843
4149
 
3844
4150
  if (!args.skipInstall) {
3845
- const installResult = installSelfAsDevDep(targetDir, CLI_VERSION);
4151
+ const installResult = await runProgress(
4152
+ progress,
4153
+ translator.t('init.progress.installing_package'),
4154
+ () => installSelfAsDevDep(targetDir, CLI_VERSION),
4155
+ translator.t('init.progress.install_checked'),
4156
+ );
3846
4157
  if (installResult === 'installed') {
3847
4158
  console.log(`Added create-quiver@${CLI_VERSION} as dev dependency`);
3848
4159
  } else if (installResult === 'failed') {
@@ -3850,7 +4161,6 @@ async function run(argv) {
3850
4161
  }
3851
4162
  }
3852
4163
 
3853
- const translator = createTranslator(args.language);
3854
4164
  console.log(translator.t('init.installed', { path: targetDir }));
3855
4165
  if (languageWrite) {
3856
4166
  console.log(translator.t('init.language.saved', { language: languageWrite.language }));