create-quiver 0.15.3 → 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 (390) hide show
  1. package/.github/pull_request_template.md +17 -0
  2. package/.github/workflows/ci.yml +79 -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/AGENTS.md.es.template +37 -0
  13. package/ARCHITECTURE.md +133 -0
  14. package/CHANGELOG.md +12 -0
  15. package/CONTRIBUTING.md +174 -9
  16. package/README.md +10 -1
  17. package/ROADMAP.md +4 -0
  18. package/SECURITY.md +9 -2
  19. package/auditoria-ux-ui-performance-documentacion.md +705 -0
  20. package/copys-landing-page.md +244 -0
  21. package/docs/AI_CONTEXT.md.es.template +37 -0
  22. package/docs/AI_CONTEXT.md.template +3 -1
  23. package/docs/AI_ONBOARDING_PROMPT.md.es.template +22 -0
  24. package/docs/CLI_UX_GUIDE.md +55 -1
  25. package/docs/COMMANDS.md.es.template +28 -0
  26. package/docs/COMMANDS.md.template +20 -6
  27. package/docs/CONTEXTO.md.es.template +33 -0
  28. package/docs/DECISIONS.md.es.template +17 -0
  29. package/docs/GITFLOW_PR_GUIDE.md +73 -11
  30. package/docs/GITFLOW_PR_GUIDE.md.es.template +84 -0
  31. package/docs/GITFLOW_PR_GUIDE.md.template +72 -10
  32. package/docs/INDEX.md +11 -1
  33. package/docs/INDEX.md.es.template +36 -0
  34. package/docs/QUICK.md.template +2 -1
  35. package/docs/STANDARD.md.template +2 -1
  36. package/docs/STATUS.md.es.template +28 -0
  37. package/docs/SUPPORT_MATRIX.md.es.template +22 -0
  38. package/docs/TESTING_GUIDE_FOR_AI.md.es.template +19 -0
  39. package/docs/TROUBLESHOOTING.md.es.template +35 -0
  40. package/docs/WORKFLOW.md.es.template +31 -0
  41. package/docs/WORKFLOW.md.template +6 -4
  42. package/docs/ai/ACTIVE_SLICE.md +61 -0
  43. package/docs/ai/LESSONS.md.es.template +24 -0
  44. package/docs/getting-started/installation.md +26 -0
  45. package/docs/reference/commands.md +159 -7
  46. package/docs/reference/slice-schema.md +37 -0
  47. package/docs/schema/slice.schema.json +221 -0
  48. package/docs/specs/01-spec/01-slice/01-slice.json +36 -0
  49. package/docs/specs/01-spec/01-slice/01-slice.md +106 -0
  50. package/docs/specs/01-spec/01-slice/CLOSURE_BRIEF.md +80 -0
  51. package/docs/specs/01-spec/01-slice/EXECUTION_BRIEF.md +39 -0
  52. package/docs/specs/01-spec/02-slice/02-slice.json +36 -0
  53. package/docs/specs/01-spec/02-slice/02-slice.md +108 -0
  54. package/docs/specs/01-spec/02-slice/CLOSURE_BRIEF.md +88 -0
  55. package/docs/specs/01-spec/02-slice/EXECUTION_BRIEF.md +40 -0
  56. package/docs/specs/01-spec/03-slice/03-slice.json +36 -0
  57. package/docs/specs/01-spec/03-slice/03-slice.md +103 -0
  58. package/docs/specs/01-spec/03-slice/CLOSURE_BRIEF.md +54 -0
  59. package/docs/specs/01-spec/03-slice/EXECUTION_BRIEF.md +39 -0
  60. package/docs/specs/01-spec/04-slice/04-slice.json +36 -0
  61. package/docs/specs/01-spec/04-slice/04-slice.md +107 -0
  62. package/docs/specs/01-spec/04-slice/CLOSURE_BRIEF.md +46 -0
  63. package/docs/specs/01-spec/04-slice/EXECUTION_BRIEF.md +39 -0
  64. package/docs/specs/01-spec/05-slice/05-slice.json +36 -0
  65. package/docs/specs/01-spec/05-slice/05-slice.md +106 -0
  66. package/docs/specs/01-spec/05-slice/CLOSURE_BRIEF.md +84 -0
  67. package/docs/specs/01-spec/05-slice/EXECUTION_BRIEF.md +109 -0
  68. package/docs/specs/01-spec/06-slice/06-slice.json +36 -0
  69. package/docs/specs/01-spec/06-slice/06-slice.md +107 -0
  70. package/docs/specs/01-spec/06-slice/CLOSURE_BRIEF.md +67 -0
  71. package/docs/specs/01-spec/06-slice/EXECUTION_BRIEF.md +39 -0
  72. package/docs/specs/01-spec/07-slice/07-slice.json +36 -0
  73. package/docs/specs/01-spec/07-slice/07-slice.md +105 -0
  74. package/docs/specs/01-spec/07-slice/CLOSURE_BRIEF.md +71 -0
  75. package/docs/specs/01-spec/07-slice/EXECUTION_BRIEF.md +39 -0
  76. package/docs/specs/01-spec/08-slice/08-slice.json +36 -0
  77. package/docs/specs/01-spec/08-slice/08-slice.md +105 -0
  78. package/docs/specs/01-spec/08-slice/CLOSURE_BRIEF.md +114 -0
  79. package/docs/specs/01-spec/08-slice/EXECUTION_BRIEF.md +39 -0
  80. package/docs/specs/01-spec/CLOSURE_BRIEF.md +87 -0
  81. package/docs/specs/01-spec/spec.md +197 -0
  82. package/docs/workflows/full-ai-spec-to-pr.md +46 -3
  83. package/i18n/es/docs/GITFLOW_PR_GUIDE.md.template +38 -1
  84. package/package.json +27 -1
  85. package/pr.md +154 -0
  86. package/scripts/package-quiver.sh +82 -2
  87. package/scripts/release-quiver.sh +14 -3
  88. package/specs/[project-name]/slices/pr.md.template +19 -0
  89. package/specs/quiver-v37-cli-i18n-foundation/EVIDENCE_REPORT.md +73 -0
  90. package/specs/quiver-v37-cli-i18n-foundation/EXECUTION_PLAN.md +34 -0
  91. package/specs/quiver-v37-cli-i18n-foundation/SPEC.md +91 -0
  92. package/specs/quiver-v37-cli-i18n-foundation/STATUS.md +29 -0
  93. package/specs/quiver-v37-cli-i18n-foundation/pr.md +97 -0
  94. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/CLOSURE_BRIEF.md +10 -0
  95. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/EXECUTION_BRIEF.md +22 -0
  96. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/slice.json +54 -0
  97. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/CLOSURE_BRIEF.md +30 -0
  98. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/EXECUTION_BRIEF.md +27 -0
  99. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/slice.json +66 -0
  100. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/CLOSURE_BRIEF.md +27 -0
  101. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/EXECUTION_BRIEF.md +26 -0
  102. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/slice.json +62 -0
  103. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/CLOSURE_BRIEF.md +32 -0
  104. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/EXECUTION_BRIEF.md +25 -0
  105. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/slice.json +66 -0
  106. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/CLOSURE_BRIEF.md +30 -0
  107. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/EXECUTION_BRIEF.md +24 -0
  108. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/slice.json +65 -0
  109. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/CLOSURE_BRIEF.md +27 -0
  110. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/EXECUTION_BRIEF.md +23 -0
  111. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/slice.json +67 -0
  112. package/specs/quiver-v38-cli-i18n-read-only-commands/EVIDENCE_REPORT.md +69 -0
  113. package/specs/quiver-v38-cli-i18n-read-only-commands/EXECUTION_PLAN.md +25 -0
  114. package/specs/quiver-v38-cli-i18n-read-only-commands/SPEC.md +52 -0
  115. package/specs/quiver-v38-cli-i18n-read-only-commands/STATUS.md +24 -0
  116. package/specs/quiver-v38-cli-i18n-read-only-commands/pr.md +119 -0
  117. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/CLOSURE_BRIEF.md +10 -0
  118. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/EXECUTION_BRIEF.md +21 -0
  119. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/slice.json +53 -0
  120. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/CLOSURE_BRIEF.md +17 -0
  121. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/EXECUTION_BRIEF.md +23 -0
  122. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/slice.json +69 -0
  123. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/CLOSURE_BRIEF.md +13 -0
  124. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/EXECUTION_BRIEF.md +22 -0
  125. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/slice.json +77 -0
  126. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/CLOSURE_BRIEF.md +12 -0
  127. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/EXECUTION_BRIEF.md +22 -0
  128. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/slice.json +66 -0
  129. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/CLOSURE_BRIEF.md +13 -0
  130. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/EXECUTION_BRIEF.md +22 -0
  131. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/slice.json +61 -0
  132. package/specs/quiver-v39-cli-i18n-setup-onboarding/EVIDENCE_REPORT.md +71 -0
  133. package/specs/quiver-v39-cli-i18n-setup-onboarding/EXECUTION_PLAN.md +25 -0
  134. package/specs/quiver-v39-cli-i18n-setup-onboarding/SPEC.md +53 -0
  135. package/specs/quiver-v39-cli-i18n-setup-onboarding/STATUS.md +24 -0
  136. package/specs/quiver-v39-cli-i18n-setup-onboarding/pr.md +104 -0
  137. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/CLOSURE_BRIEF.md +10 -0
  138. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/EXECUTION_BRIEF.md +21 -0
  139. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/slice.json +53 -0
  140. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/CLOSURE_BRIEF.md +12 -0
  141. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/EXECUTION_BRIEF.md +23 -0
  142. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/slice.json +68 -0
  143. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/CLOSURE_BRIEF.md +12 -0
  144. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/EXECUTION_BRIEF.md +23 -0
  145. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/slice.json +62 -0
  146. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/CLOSURE_BRIEF.md +12 -0
  147. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/EXECUTION_BRIEF.md +22 -0
  148. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/slice.json +72 -0
  149. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/CLOSURE_BRIEF.md +15 -0
  150. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/EXECUTION_BRIEF.md +22 -0
  151. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/slice.json +61 -0
  152. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/EVIDENCE_REPORT.md +50 -0
  153. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/EXECUTION_PLAN.md +25 -0
  154. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/SPEC.md +52 -0
  155. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/STATUS.md +24 -0
  156. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/pr.md +94 -0
  157. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/CLOSURE_BRIEF.md +10 -0
  158. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/EXECUTION_BRIEF.md +21 -0
  159. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/slice.json +53 -0
  160. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/CLOSURE_BRIEF.md +12 -0
  161. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/EXECUTION_BRIEF.md +22 -0
  162. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/slice.json +63 -0
  163. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/CLOSURE_BRIEF.md +10 -0
  164. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/EXECUTION_BRIEF.md +22 -0
  165. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/slice.json +63 -0
  166. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/CLOSURE_BRIEF.md +10 -0
  167. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/EXECUTION_BRIEF.md +22 -0
  168. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/slice.json +72 -0
  169. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/CLOSURE_BRIEF.md +15 -0
  170. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/EXECUTION_BRIEF.md +22 -0
  171. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/slice.json +69 -0
  172. package/specs/quiver-v41-cli-i18n-ai-lifecycle/EVIDENCE_REPORT.md +90 -0
  173. package/specs/quiver-v41-cli-i18n-ai-lifecycle/EXECUTION_PLAN.md +33 -0
  174. package/specs/quiver-v41-cli-i18n-ai-lifecycle/SPEC.md +57 -0
  175. package/specs/quiver-v41-cli-i18n-ai-lifecycle/STATUS.md +26 -0
  176. package/specs/quiver-v41-cli-i18n-ai-lifecycle/pr.md +103 -0
  177. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/CLOSURE_BRIEF.md +10 -0
  178. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/EXECUTION_BRIEF.md +21 -0
  179. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/slice.json +53 -0
  180. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/CLOSURE_BRIEF.md +13 -0
  181. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/EXECUTION_BRIEF.md +22 -0
  182. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/slice.json +68 -0
  183. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/CLOSURE_BRIEF.md +12 -0
  184. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/EXECUTION_BRIEF.md +22 -0
  185. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/slice.json +66 -0
  186. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/CLOSURE_BRIEF.md +12 -0
  187. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/EXECUTION_BRIEF.md +23 -0
  188. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/slice.json +68 -0
  189. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/CLOSURE_BRIEF.md +13 -0
  190. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/EXECUTION_BRIEF.md +23 -0
  191. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/slice.json +72 -0
  192. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/CLOSURE_BRIEF.md +15 -0
  193. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/EXECUTION_BRIEF.md +22 -0
  194. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/slice.json +66 -0
  195. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/CLOSURE_BRIEF.md +11 -0
  196. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/EXECUTION_BRIEF.md +22 -0
  197. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/slice.json +70 -0
  198. package/specs/quiver-v42-cli-i18n-generated-docs/EVIDENCE_REPORT.md +64 -0
  199. package/specs/quiver-v42-cli-i18n-generated-docs/EXECUTION_PLAN.md +26 -0
  200. package/specs/quiver-v42-cli-i18n-generated-docs/SPEC.md +52 -0
  201. package/specs/quiver-v42-cli-i18n-generated-docs/STATUS.md +24 -0
  202. package/specs/quiver-v42-cli-i18n-generated-docs/pr.md +125 -0
  203. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/CLOSURE_BRIEF.md +10 -0
  204. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/EXECUTION_BRIEF.md +21 -0
  205. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/slice.json +53 -0
  206. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/CLOSURE_BRIEF.md +10 -0
  207. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/EXECUTION_BRIEF.md +22 -0
  208. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/slice.json +62 -0
  209. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/CLOSURE_BRIEF.md +11 -0
  210. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/EXECUTION_BRIEF.md +22 -0
  211. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/slice.json +72 -0
  212. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/CLOSURE_BRIEF.md +12 -0
  213. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/EXECUTION_BRIEF.md +22 -0
  214. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/slice.json +60 -0
  215. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/CLOSURE_BRIEF.md +16 -0
  216. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/EXECUTION_BRIEF.md +22 -0
  217. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/slice.json +62 -0
  218. package/specs/quiver-v43-cli-i18n-audit-release-readiness/EVIDENCE_REPORT.md +203 -0
  219. package/specs/quiver-v43-cli-i18n-audit-release-readiness/EXECUTION_PLAN.md +27 -0
  220. package/specs/quiver-v43-cli-i18n-audit-release-readiness/SPEC.md +54 -0
  221. package/specs/quiver-v43-cli-i18n-audit-release-readiness/STATUS.md +24 -0
  222. package/specs/quiver-v43-cli-i18n-audit-release-readiness/command-language-mode-matrix.json +636 -0
  223. package/specs/quiver-v43-cli-i18n-audit-release-readiness/cross-platform-smoke-matrix.md +35 -0
  224. package/specs/quiver-v43-cli-i18n-audit-release-readiness/pr.md +155 -0
  225. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/CLOSURE_BRIEF.md +10 -0
  226. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/EXECUTION_BRIEF.md +21 -0
  227. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/slice.json +53 -0
  228. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/CLOSURE_BRIEF.md +13 -0
  229. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/EXECUTION_BRIEF.md +23 -0
  230. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/slice.json +62 -0
  231. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/CLOSURE_BRIEF.md +18 -0
  232. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/EXECUTION_BRIEF.md +22 -0
  233. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/slice.json +59 -0
  234. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/CLOSURE_BRIEF.md +15 -0
  235. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/EXECUTION_BRIEF.md +23 -0
  236. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/slice.json +62 -0
  237. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/CLOSURE_BRIEF.md +17 -0
  238. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/EXECUTION_BRIEF.md +24 -0
  239. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/slice.json +66 -0
  240. package/specs/quiver-v44-provider-live-output-tui-lite/EVIDENCE_REPORT.md +18 -0
  241. package/specs/quiver-v44-provider-live-output-tui-lite/EXECUTION_PLAN.md +31 -0
  242. package/specs/quiver-v44-provider-live-output-tui-lite/SPEC.md +118 -0
  243. package/specs/quiver-v44-provider-live-output-tui-lite/STATUS.md +25 -0
  244. package/specs/quiver-v44-provider-live-output-tui-lite/pr.md +92 -0
  245. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/CLOSURE_BRIEF.md +11 -0
  246. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/EXECUTION_BRIEF.md +23 -0
  247. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/slice.json +64 -0
  248. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/CLOSURE_BRIEF.md +10 -0
  249. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/EXECUTION_BRIEF.md +24 -0
  250. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/slice.json +65 -0
  251. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/CLOSURE_BRIEF.md +10 -0
  252. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/EXECUTION_BRIEF.md +24 -0
  253. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/slice.json +70 -0
  254. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/CLOSURE_BRIEF.md +10 -0
  255. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/EXECUTION_BRIEF.md +25 -0
  256. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/slice.json +70 -0
  257. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/CLOSURE_BRIEF.md +10 -0
  258. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/EXECUTION_BRIEF.md +26 -0
  259. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/slice.json +72 -0
  260. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/CLOSURE_BRIEF.md +15 -0
  261. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/EXECUTION_BRIEF.md +26 -0
  262. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/slice.json +75 -0
  263. package/specs/quiver-v45-ci-actions-node24-readiness/EVIDENCE_REPORT.md +30 -0
  264. package/specs/quiver-v45-ci-actions-node24-readiness/EXECUTION_PLAN.md +22 -0
  265. package/specs/quiver-v45-ci-actions-node24-readiness/SPEC.md +49 -0
  266. package/specs/quiver-v45-ci-actions-node24-readiness/STATUS.md +21 -0
  267. package/specs/quiver-v45-ci-actions-node24-readiness/pr.md +67 -0
  268. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/CLOSURE_BRIEF.md +10 -0
  269. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/EXECUTION_BRIEF.md +21 -0
  270. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/slice.json +48 -0
  271. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/CLOSURE_BRIEF.md +14 -0
  272. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/EXECUTION_BRIEF.md +23 -0
  273. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/slice.json +65 -0
  274. package/specs/quiver-v50-audit-trust-foundation/EVIDENCE_REPORT.md +151 -0
  275. package/specs/quiver-v50-audit-trust-foundation/EXECUTION_PLAN.md +34 -0
  276. package/specs/quiver-v50-audit-trust-foundation/SPEC.md +113 -0
  277. package/specs/quiver-v50-audit-trust-foundation/STATUS.md +26 -0
  278. package/specs/quiver-v50-audit-trust-foundation/pr.md +120 -0
  279. package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/CLOSURE_BRIEF.md +20 -0
  280. package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/EXECUTION_BRIEF.md +58 -0
  281. package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/slice.json +57 -0
  282. package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/CLOSURE_BRIEF.md +24 -0
  283. package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/EXECUTION_BRIEF.md +67 -0
  284. package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/slice.json +71 -0
  285. package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/CLOSURE_BRIEF.md +24 -0
  286. package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/EXECUTION_BRIEF.md +71 -0
  287. package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/slice.json +81 -0
  288. package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/CLOSURE_BRIEF.md +22 -0
  289. package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/EXECUTION_BRIEF.md +57 -0
  290. package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/slice.json +56 -0
  291. package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/CLOSURE_BRIEF.md +23 -0
  292. package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/EXECUTION_BRIEF.md +68 -0
  293. package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/slice.json +84 -0
  294. package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/CLOSURE_BRIEF.md +25 -0
  295. package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/EXECUTION_BRIEF.md +73 -0
  296. package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/slice.json +72 -0
  297. package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/CLOSURE_BRIEF.md +22 -0
  298. package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/EXECUTION_BRIEF.md +66 -0
  299. package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/slice.json +74 -0
  300. package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/CLOSURE_BRIEF.md +29 -0
  301. package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/EXECUTION_BRIEF.md +74 -0
  302. package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/slice.json +81 -0
  303. package/specs/quiver-v51-cli-ergonomics-automation-contracts/EVIDENCE_REPORT.md +145 -0
  304. package/specs/quiver-v51-cli-ergonomics-automation-contracts/EXECUTION_PLAN.md +32 -0
  305. package/specs/quiver-v51-cli-ergonomics-automation-contracts/SPEC.md +109 -0
  306. package/specs/quiver-v51-cli-ergonomics-automation-contracts/STATUS.md +25 -0
  307. package/specs/quiver-v51-cli-ergonomics-automation-contracts/pr.md +69 -0
  308. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/CLOSURE_BRIEF.md +20 -0
  309. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/EXECUTION_BRIEF.md +58 -0
  310. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/slice.json +56 -0
  311. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/CLOSURE_BRIEF.md +21 -0
  312. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/EXECUTION_BRIEF.md +61 -0
  313. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/slice.json +68 -0
  314. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/CLOSURE_BRIEF.md +25 -0
  315. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/EXECUTION_BRIEF.md +65 -0
  316. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/pr.md +134 -0
  317. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/slice.json +80 -0
  318. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/CLOSURE_BRIEF.md +31 -0
  319. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/EXECUTION_BRIEF.md +80 -0
  320. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/pr.md +159 -0
  321. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/slice.json +102 -0
  322. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/CLOSURE_BRIEF.md +25 -0
  323. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/EXECUTION_BRIEF.md +74 -0
  324. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/pr.md +147 -0
  325. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/slice.json +91 -0
  326. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/CLOSURE_BRIEF.md +28 -0
  327. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/EXECUTION_BRIEF.md +73 -0
  328. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/pr.md +146 -0
  329. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/slice.json +100 -0
  330. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/CLOSURE_BRIEF.md +36 -0
  331. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/EXECUTION_BRIEF.md +76 -0
  332. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/pr.md +155 -0
  333. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/slice.json +111 -0
  334. package/specs/quiver-v52-schema-docs-release-hygiene/EVIDENCE_REPORT.md +95 -0
  335. package/specs/quiver-v52-schema-docs-release-hygiene/EXECUTION_PLAN.md +31 -0
  336. package/specs/quiver-v52-schema-docs-release-hygiene/SPEC.md +107 -0
  337. package/specs/quiver-v52-schema-docs-release-hygiene/STATUS.md +22 -0
  338. package/specs/quiver-v52-schema-docs-release-hygiene/pr.md +69 -0
  339. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/CLOSURE_BRIEF.md +21 -0
  340. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/EXECUTION_BRIEF.md +60 -0
  341. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/slice.json +62 -0
  342. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/CLOSURE_BRIEF.md +34 -0
  343. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/EXECUTION_BRIEF.md +71 -0
  344. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/pr.md +146 -0
  345. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/slice.json +106 -0
  346. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/CLOSURE_BRIEF.md +33 -0
  347. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/EXECUTION_BRIEF.md +67 -0
  348. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/pr.md +144 -0
  349. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/slice.json +86 -0
  350. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/CLOSURE_BRIEF.md +38 -0
  351. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/EXECUTION_BRIEF.md +75 -0
  352. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/pr.md +159 -0
  353. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/slice.json +105 -0
  354. package/src/create-quiver/commands/ai.js +485 -307
  355. package/src/create-quiver/commands/changelog.js +93 -0
  356. package/src/create-quiver/commands/config.js +135 -0
  357. package/src/create-quiver/commands/demo.js +2 -2
  358. package/src/create-quiver/commands/evidence.js +39 -6
  359. package/src/create-quiver/commands/flow.js +109 -16
  360. package/src/create-quiver/commands/graph.js +9 -2
  361. package/src/create-quiver/commands/next.js +21 -18
  362. package/src/create-quiver/commands/plan.js +29 -6
  363. package/src/create-quiver/commands/spec.js +94 -70
  364. package/src/create-quiver/index.js +798 -223
  365. package/src/create-quiver/lib/ai/execution-plan.js +23 -20
  366. package/src/create-quiver/lib/ai/executor.js +60 -44
  367. package/src/create-quiver/lib/ai/export-state.js +75 -64
  368. package/src/create-quiver/lib/ai/github.js +29 -23
  369. package/src/create-quiver/lib/ai/run-state.js +28 -25
  370. package/src/create-quiver/lib/ai/spec-templates.js +19 -0
  371. package/src/create-quiver/lib/cli/command-registry.js +71 -0
  372. package/src/create-quiver/lib/cli/parser.js +14 -0
  373. package/src/create-quiver/lib/dashboard.js +154 -111
  374. package/src/create-quiver/lib/demo.js +14 -12
  375. package/src/create-quiver/lib/evidence.js +161 -6
  376. package/src/create-quiver/lib/git.js +99 -0
  377. package/src/create-quiver/lib/handoff.js +16 -7
  378. package/src/create-quiver/lib/i18n/catalog.js +152 -0
  379. package/src/create-quiver/lib/i18n/language.js +279 -0
  380. package/src/create-quiver/lib/i18n/messages/en.js +898 -0
  381. package/src/create-quiver/lib/i18n/messages/es.js +1013 -0
  382. package/src/create-quiver/lib/i18n/read-only-format.js +26 -0
  383. package/src/create-quiver/lib/i18n/templates.js +172 -0
  384. package/src/create-quiver/lib/init-docs.js +19 -5
  385. package/src/create-quiver/lib/init-layout.js +15 -8
  386. package/src/create-quiver/lib/lifecycle.js +72 -67
  387. package/src/create-quiver/lib/readiness.js +131 -110
  388. package/src/create-quiver/lib/renderers/tree.js +9 -6
  389. package/src/create-quiver/lib/spec-worktrees.js +50 -64
  390. package/src/create-quiver/lib/version.js +11 -9
@@ -35,6 +35,8 @@ const {
35
35
  runSpecsList: runAiSpecsList,
36
36
  runTraceReport: runAiTraceReport,
37
37
  } = require('./commands/ai');
38
+ const { runChangelog } = require('./commands/changelog');
39
+ const { runConfig } = require('./commands/config');
38
40
  const { runDashboard } = require('./commands/dashboard');
39
41
  const { runDemo } = require('./commands/demo');
40
42
  const { runPrepare } = require('./commands/prepare');
@@ -57,8 +59,27 @@ const { cleanupSlice, refreshActiveSlicesBoard, startSlice } = require('./lib/li
57
59
  const { buildSpecStatus, closeSpecWorktree, formatSpecCloseResult, formatSpecStartResult, formatSpecStatus, startSpecWorktree } = require('./lib/spec-worktrees');
58
60
  const { getContextPathExclusionReason } = require('./lib/ai/safety');
59
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');
60
71
  const { createUx } = require('./lib/cli/ux');
61
72
  const { validateUxFlags } = require('./lib/cli/ux-flags');
73
+ const {
74
+ DEFAULT_LANGUAGE,
75
+ extractCliLanguageFlag,
76
+ normalizeLanguage,
77
+ readProjectLanguageConfig,
78
+ resolveLanguage,
79
+ writeProjectLanguageConfig,
80
+ } = require('./lib/i18n/language');
81
+ const { createTranslator, getCatalog, translate } = require('./lib/i18n/catalog');
82
+ const { formatWarningPrefix } = require('./lib/i18n/read-only-format');
62
83
  const { relativePosixPath, resolveTargetRoot } = require('./lib/paths');
63
84
  const {
64
85
  CURRENT_SCAN_RELATIVE_PATH,
@@ -78,73 +99,102 @@ const {
78
99
  const cliPackageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../..', 'package.json'), 'utf8'));
79
100
  const CLI_VERSION = cliPackageJson.version || '0.0.0';
80
101
 
102
+ let currentErrorLanguage = DEFAULT_LANGUAGE;
103
+
104
+ function setCurrentErrorLanguage(language) {
105
+ currentErrorLanguage = language || DEFAULT_LANGUAGE;
106
+ }
107
+
108
+ function localizeParserMessage(message, language = currentErrorLanguage) {
109
+ const raw = String(message || '');
110
+ const missingValue = raw.match(/^missing value for (--[a-z0-9-]+)$/i);
111
+ if (missingValue) {
112
+ return translate(language, 'error.flag.missing_value', { flag: missingValue[1] });
113
+ }
114
+
115
+ const invalidValue = raw.match(/^invalid value for (--[a-z0-9-]+)$/i);
116
+ if (invalidValue) {
117
+ return translate(language, 'error.flag.invalid_value', { flag: invalidValue[1] });
118
+ }
119
+
120
+ const unknownFlag = raw.match(/^unknown flag: (.+)$/);
121
+ if (unknownFlag) {
122
+ return translate(language, 'error.flag.unknown', { flag: unknownFlag[1] });
123
+ }
124
+
125
+ return raw;
126
+ }
127
+
81
128
  function formatError(message) {
82
- return `create-quiver: ${message}`;
83
- }
84
-
85
- const SUPPORTED_COMMAND_MODES = new Set([
86
- 'init',
87
- 'version',
88
- 'flow',
89
- 'dashboard',
90
- 'plan',
91
- 'graph',
92
- 'next',
93
- 'doctor',
94
- 'prepare',
95
- 'analyze',
96
- 'migrate',
97
- 'start-slice',
98
- 'check-slice',
99
- 'check-pr',
100
- 'check-handoff',
101
- 'new-handoff',
102
- 'cleanup-slice',
103
- 'check-scope',
104
- 'refresh-active-slices',
105
- 'spec',
106
- 'evidence',
107
- 'demo',
108
- 'ai',
109
- ]);
129
+ return `create-quiver: ${localizeParserMessage(message)}`;
130
+ }
110
131
 
111
- const SUPPORTED_AI_COMMANDS = new Set([
112
- 'active-slice',
113
- 'agent',
114
- 'approve',
115
- 'approval-status',
116
- 'approvals',
117
- 'doctor',
118
- 'execute-plan',
119
- 'execute-slice',
120
- 'executor-prompt',
121
- 'export',
122
- 'inspect',
123
- 'onboard',
124
- 'plan',
125
- 'prepare-context',
126
- 'pr',
127
- 'prompt-slice',
128
- 'repair-plan',
129
- 'review-plan',
130
- 'revise',
131
- 'resume',
132
- 'run',
133
- 'slices',
134
- 'specs',
135
- 'status',
136
- 'trace',
137
- ]);
132
+ function helpCatalog(language = DEFAULT_LANGUAGE) {
133
+ const catalog = getCatalog(language);
134
+ return catalog.messages['cli.help'] || getCatalog(DEFAULT_LANGUAGE).messages['cli.help'] || {};
135
+ }
136
+
137
+ function helpText(help, section, key, fallback) {
138
+ return help?.[section]?.[key] || fallback;
139
+ }
140
+
141
+ function optionDescription(help, fallback) {
142
+ return helpText(help, 'optionDescriptions', fallback, fallback);
143
+ }
138
144
 
139
- const SUPPORTED_SPEC_COMMANDS = new Set(['close', 'create', 'start', 'status', 'validate']);
140
- const SUPPORTED_DEMO_COMMANDS = new Set(['create']);
145
+ function formatLanguageWarningForCli(warning, language = DEFAULT_LANGUAGE) {
146
+ if (!warning || warning.code !== 'UNSUPPORTED_LANGUAGE') {
147
+ return '';
148
+ }
149
+
150
+ return formatError(translate(language, 'warning.language.unsupported_source', {
151
+ fallback: warning.fallbackLanguage,
152
+ language: warning.requestedLanguage,
153
+ source: warning.source,
154
+ supported: warning.supportedLanguages.join(', '),
155
+ }));
156
+ }
157
+
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
+ });
166
+
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
+ }
186
+
187
+ function formatLegacyNamespaceWarning(mode, canonicalCommand) {
188
+ return `create-quiver: ${mode} is a legacy alias; use npx create-quiver ${canonicalCommand}.`;
189
+ }
141
190
 
142
191
  function unsupportedCommandMessage(commandName) {
192
+ const translator = createTranslator(currentErrorLanguage);
143
193
  return [
144
- `unsupported command: ${commandName}`,
145
- 'Run: npx create-quiver --help',
146
- `If you meant to initialize a project, use: npx create-quiver init --name "${commandName}"`,
147
- 'If this command exists in newer docs, update create-quiver and rerun the command.',
194
+ translator.t('error.command.unsupported', { commandName }),
195
+ translator.t('error.command.help'),
196
+ translator.t('error.command.init_hint', { commandName }),
197
+ translator.t('error.command.update_hint'),
148
198
  ].join('\n');
149
199
  }
150
200
 
@@ -158,6 +208,8 @@ const COMMAND_HELP_GROUPS = [
158
208
  ['flow', 'Show the read-only guided workflow stage, blockers, and next safe command.'],
159
209
  ['dashboard', 'Show compact read-only project, spec, slice, run, approval, and agent status.'],
160
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.'],
212
+ ['config language show|set', 'Inspect or update the effective Quiver language without editing JSON by hand.'],
161
213
  ['prepare', 'Run setup diagnostics for providers, GitHub, SSH, and project readiness.'],
162
214
  ['migrate', 'Upgrade an already initialized Quiver project to the current contract.'],
163
215
  ],
@@ -212,6 +264,8 @@ const COMMAND_HELP_GROUPS = [
212
264
  ['spec status', 'Show spec worktree, branch, slice-00 state, and pending slices.'],
213
265
  ['spec validate', 'Validate spec docs, slices, briefs, evidence, status, dependencies, and safe paths.'],
214
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.'],
215
269
  ['start-slice', 'Start work on one slice and mark it active.'],
216
270
  ['check-slice', 'Validate slice structure, dependencies, scope, and readiness.'],
217
271
  ['check-pr', 'Validate PR readiness for a slice/spec workflow.'],
@@ -226,6 +280,8 @@ const COMMAND_HELP_GROUPS = [
226
280
  title: 'Evidence and demos',
227
281
  commands: [
228
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.'],
229
285
  ['demo create spec-viewer', 'Create or preview the optional static Quiver Spec Viewer demo scaffold.'],
230
286
  ],
231
287
  },
@@ -240,25 +296,30 @@ const COMMAND_HELP_GROUPS = [
240
296
  },
241
297
  ];
242
298
 
243
- function formatCommandHelpGroups() {
244
- const lines = ['Commands:'];
299
+ function formatCommandHelpGroups(language = DEFAULT_LANGUAGE) {
300
+ const help = helpCatalog(language);
301
+ const lines = [helpText(help, 'headings', 'commands', 'Commands:')];
245
302
  for (const group of COMMAND_HELP_GROUPS) {
246
- lines.push('', `${group.title}:`);
303
+ lines.push('', `${helpText(help, 'groupTitles', group.title, group.title)}:`);
247
304
  for (const [command, description] of group.commands) {
248
- lines.push(` ${command.padEnd(24)} ${description}`);
305
+ lines.push(` ${command.padEnd(24)} ${helpText(help, 'commandDescriptions', command, description)}`);
249
306
  }
250
307
  }
251
308
  return lines.join('\n');
252
309
  }
253
310
 
254
- function printUsage() {
255
- console.log(`Usage:
311
+ function printUsage(language = DEFAULT_LANGUAGE) {
312
+ const help = helpCatalog(language);
313
+ console.log(`${helpText(help, 'headings', 'usage', 'Usage:')}
256
314
  npx create-quiver [options]
257
315
  npx create-quiver init [options]
258
316
  npx create-quiver analyze [options]
259
317
  npx create-quiver flow [options]
260
318
  npx create-quiver dashboard [options]
261
319
  npx create-quiver version [--json]
320
+ npx create-quiver changelog [--json]
321
+ npx create-quiver config language show [--json]
322
+ npx create-quiver config language set <en|es> [--global]
262
323
  npx create-quiver plan [options]
263
324
  npx create-quiver ai <task> [options]
264
325
  npx create-quiver ai run create --input <requirements.md>
@@ -294,62 +355,66 @@ function printUsage() {
294
355
  npx create-quiver spec status <spec-dir>
295
356
  npx create-quiver spec validate <spec-dir>
296
357
  npx create-quiver spec close <spec-dir>
297
- 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]
298
361
  npx create-quiver demo create spec-viewer [options]
299
362
 
300
- ${formatCommandHelpGroups()}
301
-
302
- Options:
303
- -n, --name <project-name> Project name to generate
304
- -d, --dir <target-dir> Target directory to scaffold into or inspect
305
- --spec <slug> Restrict plan, graph, next, or dashboard output to one spec
306
- --format <name> Graph or AI export output format (tree, mermaid, dot, json, markdown)
307
- --show-conflicts Show shared file paths in graph output
308
- --level <n> Restrict graph output to one level
309
- --json Emit machine-readable JSON
310
- --include-completed Include completed slices in dashboard, plan, graph, or next history output
311
- --details Show the full human dashboard report
312
- --section <name> Show one human dashboard section
313
- --limit <n> Limit dashboard human lists (1-100)
314
- --only-ready Show only slices with no pending dependencies
315
- --all-ready List every ready slice returned by next
316
- --auto-start Prompt for confirmation and run start-slice on next
317
- --local For check-slice, run structural validation without remote/base checks
318
- --strict Treat supported validation warnings as failures
319
- --unicode Prefer Unicode output when supported
320
- --minimal Plan or run the minimal init profile
321
- --full Plan or run the full compatibility init profile
322
- --legacy-scripts Include legacy Bash wrappers in init profile
323
- --include-templates Export packaged templates in init profile
324
- --dry-run Preview init, analyze, migrate, prepare, spec create/start/close, demo, ai agent set, or AI work without executing writes/providers
325
- --print-prompt Print the exact AI prompt and exit without executing provider CLIs
326
- --with-planner Enable planner-assisted behavior on commands that explicitly support it
327
- --interactive Enable prompts on commands that explicitly support interactive choices
328
- --review Open or prepare human review before persistent writes where supported
329
- --methodology <name> Select methodology where supported (currently wdd-sdd)
330
- --no-color Disable ANSI colors in human output
331
- --fix For doctor, apply safe non-destructive repairs
332
- --execute For ai execute-plan, run the planned slices instead of printing commands
333
- --create For ai pr, create the PR after preflight instead of printing the plan only
334
- --commit For ai execute-slice, commit validated slice changes after provider, scope, and tests pass
335
- --allow-dirty For ai execute-slice, allow pre-existing dirty files and ignore them for scope diff
336
- --mode <name> Execution mode for ai execute-plan (auto, manual, delegated)
337
- --provider <name> Provider CLI to preflight for prepare or AI commands
338
- --model <model-id> Technical model id for AI agent profiles or provider-backed AI commands
339
- --version <n> Draft version to approve for AI planner phases
340
- --run <id> AI lifecycle run id
341
- --ssh-host-alias <name> SSH host alias to validate for prepare or AI commands
342
- --identity-file <path> SSH identity file to validate for prepare or AI commands
343
- --remote <name> Git remote name for check-slice or AI PR checks
344
- --base <branch> Base branch for check-slice, check-scope, ai pr, or spec close (default: main)
345
- --output <file> Output file for evidence run
346
- --max-output <n> Maximum stdout/stderr chars per evidence section
347
- --title <text> Override PR title for ai pr create
348
- -y, --yes Skip prompts and use the provided inputs
349
- -V, --version Show the installed create-quiver version
350
- -h, --help Show this help message
351
-
352
- Examples:
363
+ ${formatCommandHelpGroups(language)}
364
+
365
+ ${helpText(help, 'headings', 'options', 'Options:')}
366
+ -n, --name <project-name> ${optionDescription(help, 'Project name to generate')}
367
+ -d, --dir <target-dir> ${optionDescription(help, 'Target directory to scaffold into or inspect')}
368
+ --spec <slug> ${optionDescription(help, 'Restrict plan, graph, next, or dashboard output to one spec')}
369
+ --format <name> ${optionDescription(help, 'Graph or AI export output format (tree, mermaid, dot, json, markdown)')}
370
+ --show-conflicts ${optionDescription(help, 'Show shared file paths in graph output')}
371
+ --level <n> ${optionDescription(help, 'Restrict graph output to one level')}
372
+ --json ${optionDescription(help, 'Emit machine-readable JSON')}
373
+ --lang <en|es> ${optionDescription(help, 'Override CLI human output language')}
374
+ --global ${optionDescription(help, 'For config language set, write the global user config')}
375
+ --include-completed ${optionDescription(help, 'Include completed slices in dashboard, plan, graph, or next history output')}
376
+ --details ${optionDescription(help, 'Show the full human dashboard report')}
377
+ --section <name> ${optionDescription(help, 'Show one human dashboard section')}
378
+ --limit <n> ${optionDescription(help, 'Limit dashboard human lists (1-100)')}
379
+ --only-ready ${optionDescription(help, 'Show only slices with no pending dependencies')}
380
+ --all-ready ${optionDescription(help, 'List every ready slice returned by next')}
381
+ --auto-start ${optionDescription(help, 'Prompt for confirmation and run start-slice on next')}
382
+ --local ${optionDescription(help, 'For check-slice, run structural validation without remote/base checks')}
383
+ --strict ${optionDescription(help, 'Treat supported validation warnings as failures')}
384
+ --unicode ${optionDescription(help, 'Prefer Unicode output when supported')}
385
+ --minimal ${optionDescription(help, 'Plan or run the minimal init profile')}
386
+ --full ${optionDescription(help, 'Plan or run the full compatibility init profile')}
387
+ --legacy-scripts ${optionDescription(help, 'Include legacy Bash wrappers in init profile')}
388
+ --include-templates ${optionDescription(help, 'Export packaged templates in init profile')}
389
+ --dry-run ${optionDescription(help, 'Preview init, analyze, migrate, prepare, spec create/start/close, demo, ai agent set, or AI work without executing writes/providers')}
390
+ --print-prompt ${optionDescription(help, 'Print the exact AI prompt and exit without executing provider CLIs')}
391
+ --with-planner ${optionDescription(help, 'Enable planner-assisted behavior on commands that explicitly support it')}
392
+ --interactive ${optionDescription(help, 'Enable prompts on commands that explicitly support interactive choices')}
393
+ --review ${optionDescription(help, 'Open or prepare human review before persistent writes where supported')}
394
+ --methodology <name> ${optionDescription(help, 'Select methodology where supported (currently wdd-sdd)')}
395
+ --no-color ${optionDescription(help, 'Disable ANSI colors in human output')}
396
+ --fix ${optionDescription(help, 'For doctor, apply safe non-destructive repairs')}
397
+ --execute ${optionDescription(help, 'For ai execute-plan, run the planned slices instead of printing commands')}
398
+ --create ${optionDescription(help, 'For ai pr, create the PR after preflight instead of printing the plan only')}
399
+ --commit ${optionDescription(help, 'For ai execute-slice, commit validated slice changes after provider, scope, and tests pass')}
400
+ --allow-dirty ${optionDescription(help, 'For ai execute-slice, allow pre-existing dirty files and ignore them for scope diff')}
401
+ --mode <name> ${optionDescription(help, 'Execution mode for ai execute-plan (auto, manual, delegated)')}
402
+ --provider <name> ${optionDescription(help, 'Provider CLI to preflight for prepare or AI commands')}
403
+ --model <model-id> ${optionDescription(help, 'Technical model id for AI agent profiles or provider-backed AI commands')}
404
+ --version <n> ${optionDescription(help, 'Draft version to approve for AI planner phases')}
405
+ --run <id> ${optionDescription(help, 'AI lifecycle run id')}
406
+ --ssh-host-alias <name> ${optionDescription(help, 'SSH host alias to validate for prepare or AI commands')}
407
+ --identity-file <path> ${optionDescription(help, 'SSH identity file to validate for prepare or AI commands')}
408
+ --remote <name> ${optionDescription(help, 'Git remote name for check-slice or AI PR checks')}
409
+ --base <branch> ${optionDescription(help, 'Base branch override for check-slice, check-scope, check-pr, ai pr, spec start, or spec close')}
410
+ --output <file> ${optionDescription(help, 'Output file for evidence run')}
411
+ --max-output <n> ${optionDescription(help, 'Maximum stdout/stderr chars per evidence section')}
412
+ --title <text> ${optionDescription(help, 'Override PR title for ai pr create')}
413
+ -y, --yes ${optionDescription(help, 'Skip prompts and confirm write prompts such as migrate')}
414
+ -V, --version ${optionDescription(help, 'Show the installed create-quiver version')}
415
+ -h, --help ${optionDescription(help, 'Show this help message')}
416
+
417
+ ${helpText(help, 'headings', 'examples', 'Examples:')}
353
418
  npx create-quiver init --name "My Project"
354
419
  npx create-quiver init --interactive
355
420
  npx create-quiver init --name "My Project" --dry-run
@@ -361,6 +426,11 @@ Examples:
361
426
  cd ./my-project && npx create-quiver dashboard --json
362
427
  cd ./my-project && npx create-quiver version
363
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
431
+ cd ./my-project && npx create-quiver config language show
432
+ cd ./my-project && npx create-quiver config language set es
433
+ npx create-quiver config language set en --global
364
434
  cd ./my-project && npx create-quiver analyze
365
435
  cd ./my-project && npx create-quiver plan --json
366
436
  cd ./my-project && npx create-quiver ai onboard --dry-run
@@ -422,13 +492,15 @@ Examples:
422
492
  cd ./my-project && npx create-quiver spec status specs/my-project
423
493
  cd ./my-project && npx create-quiver spec validate specs/my-project
424
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
425
497
  cd ./my-project && npx create-quiver evidence run -- npm test
426
498
  cd ./my-project && npx create-quiver demo create spec-viewer --dry-run
427
499
  node bin/create-quiver.js doctor --dir ./my-project
428
500
  `);
429
501
  }
430
502
 
431
- function parseArgs(argv) {
503
+ function parseArgs(argv, options = {}) {
432
504
  const result = {
433
505
  help: false,
434
506
  force: false,
@@ -448,8 +520,14 @@ function parseArgs(argv) {
448
520
  strict: false,
449
521
  strictOverlap: false,
450
522
  json: false,
523
+ language: options.language || '',
524
+ languageResolution: null,
451
525
  noColor: false,
452
526
  withPlanner: false,
527
+ configGlobal: false,
528
+ configSection: '',
529
+ configCommand: '',
530
+ configValue: '',
453
531
  interactive: false,
454
532
  review: false,
455
533
  includeCompleted: false,
@@ -501,22 +579,33 @@ function parseArgs(argv) {
501
579
  initLegacyScripts: false,
502
580
  initMinimal: false,
503
581
  specCommand: '',
582
+ sliceCommand: '',
583
+ handoffCommand: '',
584
+ legacyAliasCommand: '',
504
585
  demoCommand: '',
505
586
  demoName: '',
506
587
  evidenceCommand: '',
507
588
  evidenceArgs: [],
508
589
  evidenceOutput: '',
509
590
  evidenceMaxOutput: null,
591
+ evidenceTarget: '',
510
592
  };
511
593
 
512
594
  const args = [...argv];
513
595
  if (SUPPORTED_COMMAND_MODES.has(args[0])) {
514
596
  result.mode = args[0];
597
+ result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
515
598
  result.explicitInit = args[0] === 'init';
516
599
  args.shift();
517
600
  if (result.mode === 'spec') {
518
601
  result.specCommand = args.shift() || '';
519
602
  }
603
+ if (result.mode === 'slice') {
604
+ result.sliceCommand = args.shift() || '';
605
+ }
606
+ if (result.mode === 'handoff') {
607
+ result.handoffCommand = args.shift() || '';
608
+ }
520
609
  if (result.mode === 'evidence') {
521
610
  result.evidenceCommand = args.shift() || '';
522
611
  }
@@ -535,9 +624,11 @@ function parseArgs(argv) {
535
624
  args.shift();
536
625
  } else if (args[0] === '--check-handoff') {
537
626
  result.mode = 'check-handoff';
627
+ result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
538
628
  args.shift();
539
629
  } else if (args[0] === '--new-handoff') {
540
630
  result.mode = 'new-handoff';
631
+ result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
541
632
  args.shift();
542
633
  } else if (args[0] && !args[0].startsWith('-')) {
543
634
  throw new Error(formatError(unsupportedCommandMessage(args[0])));
@@ -588,11 +679,13 @@ function parseArgs(argv) {
588
679
 
589
680
  if (arg === '--check-handoff') {
590
681
  result.mode = 'check-handoff';
682
+ result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
591
683
  continue;
592
684
  }
593
685
 
594
686
  if (arg === '--new-handoff') {
595
687
  result.mode = 'new-handoff';
688
+ result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
596
689
  continue;
597
690
  }
598
691
 
@@ -700,6 +793,11 @@ function parseArgs(argv) {
700
793
  continue;
701
794
  }
702
795
 
796
+ if (arg === '--global') {
797
+ result.configGlobal = true;
798
+ continue;
799
+ }
800
+
703
801
  if (arg === '--with-planner') {
704
802
  result.withPlanner = true;
705
803
  continue;
@@ -1104,6 +1202,32 @@ function parseArgs(argv) {
1104
1202
  if (positional.length > 0) {
1105
1203
  throw new Error(formatError('dashboard does not accept positional arguments; use --spec <slug>'));
1106
1204
  }
1205
+ } else if (result.mode === 'config') {
1206
+ if (!result.configSection && positional.length > 0) {
1207
+ result.configSection = positional.shift();
1208
+ }
1209
+ if (!SUPPORTED_CONFIG_SECTIONS.has(result.configSection)) {
1210
+ throw new Error(formatError(translate(currentErrorLanguage, 'config.error.unsupported_section', {
1211
+ section: result.configSection || '(missing)',
1212
+ })));
1213
+ }
1214
+ if (!result.configCommand && positional.length > 0) {
1215
+ result.configCommand = positional.shift();
1216
+ }
1217
+ if (!SUPPORTED_CONFIG_LANGUAGE_COMMANDS.has(result.configCommand)) {
1218
+ throw new Error(formatError(translate(currentErrorLanguage, 'config.error.unsupported_language_command', {
1219
+ command: result.configCommand || '(missing)',
1220
+ })));
1221
+ }
1222
+ if (result.configCommand === 'set') {
1223
+ if (positional.length === 0) {
1224
+ throw new Error(formatError('missing language for config language set. Use: npx create-quiver config language set <en|es>'));
1225
+ }
1226
+ result.configValue = positional.shift();
1227
+ }
1228
+ if (result.configCommand === 'show' && positional.length > 0) {
1229
+ throw new Error(formatError('config language show does not accept a language value'));
1230
+ }
1107
1231
  } else if (result.mode === 'ai') {
1108
1232
  if (!result.aiCommand && positional.length > 0) {
1109
1233
  result.aiCommand = positional.shift();
@@ -1142,6 +1266,38 @@ function parseArgs(argv) {
1142
1266
  if (positional.length > 0) {
1143
1267
  throw new Error(formatError('refresh-active-slices does not accept positional arguments'));
1144
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
+ }
1145
1301
  } else if (result.mode === 'spec') {
1146
1302
  if (!result.specCommand && positional.length > 0) {
1147
1303
  result.specCommand = positional.shift();
@@ -1160,14 +1316,26 @@ function parseArgs(argv) {
1160
1316
  result.evidenceCommand = positional.shift();
1161
1317
  }
1162
1318
  if (!result.evidenceCommand) {
1163
- 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>'));
1164
1320
  }
1165
- if (result.evidenceCommand !== 'run') {
1166
- 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`));
1167
1323
  }
1168
- if (positional.length > 0) {
1324
+ if (result.evidenceCommand === 'run' && positional.length > 0) {
1169
1325
  throw new Error(formatError('evidence run does not accept positional arguments before --'));
1170
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
+ }
1171
1339
  } else if (result.mode === 'demo') {
1172
1340
  if (!result.demoCommand && positional.length > 0) {
1173
1341
  result.demoCommand = positional.shift();
@@ -1205,6 +1373,14 @@ function parseArgs(argv) {
1205
1373
  throw new Error(formatError(`${requestedDashboardFlags.join(', ')} ${requestedDashboardFlags.length === 1 ? 'is' : 'are'} only supported by dashboard. Use: npx create-quiver dashboard ${requestedDashboardFlags[0]}${requestedDashboardFlags[0] === '--section' ? ' <name>' : requestedDashboardFlags[0] === '--limit' ? ' <n>' : ''}`));
1206
1374
  }
1207
1375
 
1376
+ if (result.mode !== 'config' && result.configGlobal) {
1377
+ throw new Error(formatError('--global is only supported by config language set. Use: npx create-quiver config language set <en|es> --global'));
1378
+ }
1379
+
1380
+ if (result.mode === 'config' && result.configGlobal && result.configCommand !== 'set') {
1381
+ throw new Error(formatError('--global is only supported by config language set. Use: npx create-quiver config language set <en|es> --global'));
1382
+ }
1383
+
1208
1384
  return result;
1209
1385
  }
1210
1386
 
@@ -1349,6 +1525,7 @@ function runInitDocs(repoRoot, projectName, options = {}) {
1349
1525
  migrateMode: false,
1350
1526
  profile: options.profile || 'default',
1351
1527
  templateRoot: templateRoot.path,
1528
+ language: options.language || '',
1352
1529
  });
1353
1530
  }
1354
1531
 
@@ -2202,24 +2379,56 @@ function writeProjectScanArtifacts(projectRoot, scan) {
2202
2379
  return { jsonPath, mdPath: scanPaths.projectMapPath };
2203
2380
  }
2204
2381
 
2205
- 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 = {}) {
2206
2408
  const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
2409
+ const translator = createTranslator(options.language);
2410
+ const progress = createCommandProgressUx(options);
2207
2411
 
2208
2412
  if (!fs.existsSync(projectRoot)) {
2209
2413
  throw new Error(formatError(`target directory does not exist: ${projectRoot}`));
2210
2414
  }
2211
2415
 
2212
- 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
+ );
2213
2422
 
2214
2423
  if (options.dryRun) {
2215
- console.log(`Project analysis dry-run for ${projectRoot}`);
2216
- console.log('Writes: none');
2217
- console.log(`Would write ${CURRENT_SCAN_RELATIVE_PATH}`);
2218
- console.log(`Would write ${PROJECT_MAP_RELATIVE_PATH}`);
2219
- console.log('Would refresh docs/AI_CONTEXT.md');
2220
- console.log(`Detected primary stack: ${scan.stack.primary}`);
2221
- console.log(`Detected frameworks: ${scan.stack.frameworks.length > 0 ? scan.stack.frameworks.join(', ') : 'none detected'}`);
2222
- console.log(`Detected package manager: ${scan.project.package_manager}`);
2424
+ console.log(translator.t('analyze.dry_run_for', { path: projectRoot }));
2425
+ console.log(translator.t('analyze.writes_none'));
2426
+ console.log(translator.t('analyze.would_write', { path: CURRENT_SCAN_RELATIVE_PATH }));
2427
+ console.log(translator.t('analyze.would_write', { path: PROJECT_MAP_RELATIVE_PATH }));
2428
+ console.log(translator.t('analyze.would_refresh', { path: 'docs/AI_CONTEXT.md' }));
2429
+ console.log(translator.t('analyze.detected_primary_stack', { stack: scan.stack.primary }));
2430
+ console.log(translator.t('analyze.detected_frameworks', { frameworks: scan.stack.frameworks.length > 0 ? scan.stack.frameworks.join(', ') : translator.t('common.none_detected') }));
2431
+ console.log(translator.t('analyze.detected_package_manager', { manager: scan.project.package_manager }));
2223
2432
  return {
2224
2433
  artifacts: {
2225
2434
  jsonPath: path.join(projectRoot, CURRENT_SCAN_RELATIVE_PATH),
@@ -2230,16 +2439,31 @@ function runAnalyze(targetDir, options = {}) {
2230
2439
  };
2231
2440
  }
2232
2441
 
2233
- const artifacts = writeProjectScanArtifacts(projectRoot, scan);
2234
- const aiContextPath = refreshAiContextDoc(projectRoot, scan);
2235
- 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
+ );
2236
2460
 
2237
- console.log(`Project analysis completed for ${projectRoot}`);
2238
- console.log(`Wrote ${relativePosixPath(projectRoot, artifacts.jsonPath)}`);
2239
- console.log(`Wrote ${relativePosixPath(projectRoot, artifacts.mdPath)}`);
2240
- console.log(`Wrote ${relativePosixPath(projectRoot, aiContextPath)}`);
2241
- console.log(`Detected primary stack: ${scan.stack.primary}`);
2242
- console.log(`Detected package manager: ${scan.project.package_manager}`);
2461
+ console.log(translator.t('analyze.completed_for', { path: projectRoot }));
2462
+ console.log(translator.t('analyze.wrote', { path: relativePosixPath(projectRoot, artifacts.jsonPath) }));
2463
+ console.log(translator.t('analyze.wrote', { path: relativePosixPath(projectRoot, artifacts.mdPath) }));
2464
+ console.log(translator.t('analyze.wrote', { path: relativePosixPath(projectRoot, aiContextPath) }));
2465
+ console.log(translator.t('analyze.detected_primary_stack', { stack: scan.stack.primary }));
2466
+ console.log(translator.t('analyze.detected_package_manager', { manager: scan.project.package_manager }));
2243
2467
 
2244
2468
  return {
2245
2469
  artifacts,
@@ -2249,8 +2473,41 @@ function runAnalyze(targetDir, options = {}) {
2249
2473
  };
2250
2474
  }
2251
2475
 
2252
- 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 = {}) {
2253
2509
  const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
2510
+ const translator = createTranslator(options.language);
2254
2511
 
2255
2512
  if (!fs.existsSync(projectRoot)) {
2256
2513
  throw new Error(formatError(`target directory does not exist: ${projectRoot}`));
@@ -2273,22 +2530,24 @@ function runMigrate(targetDir, options = {}) {
2273
2530
  projectName,
2274
2531
  skipInstall: options.skipInstall === true,
2275
2532
  });
2276
- console.log('Quiver migration dry-run');
2277
- console.log(`- Project: ${projectName}`);
2278
- console.log(`- Target: ${projectRoot}`);
2279
- console.log('- Writes: none');
2280
- console.log(`- Planned create: ${migrationPlan.summary.create}`);
2281
- console.log(`- Planned update: ${migrationPlan.summary.update}`);
2282
- console.log(`- Planned preserve: ${migrationPlan.summary.preserve}`);
2533
+ console.log(translator.t('migrate.dry_run_title'));
2534
+ console.log(`- ${translator.t('migrate.project', { project: projectName })}`);
2535
+ console.log(`- ${translator.t('migrate.target', { path: projectRoot })}`);
2536
+ console.log(`- ${translator.t('migrate.writes_none')}`);
2537
+ console.log(`- ${translator.t('migrate.planned_create', { count: migrationPlan.summary.create })}`);
2538
+ console.log(`- ${translator.t('migrate.planned_update', { count: migrationPlan.summary.update })}`);
2539
+ console.log(`- ${translator.t('migrate.planned_preserve', { count: migrationPlan.summary.preserve })}`);
2283
2540
  if (legacyLayout.hasLegacyLayout) {
2284
- console.log(`- Legacy layout detected and preserved: ${legacyLayout.legacyPaths.join(', ')}`);
2541
+ console.log(`- ${translator.t('migrate.legacy_preserved', { paths: legacyLayout.legacyPaths.join(', ') })}`);
2285
2542
  }
2286
- console.log('- Next command: npx create-quiver migrate --skip-install');
2543
+ console.log(`- ${translator.t('migrate.next_command', { command: 'npx create-quiver migrate --skip-install' })}`);
2287
2544
  console.log('');
2288
2545
  console.log(formatInitLayoutPlan(migrationPlan));
2289
2546
  return;
2290
2547
  }
2291
2548
 
2549
+ await confirmMigrateWrite(projectRoot, options, translator);
2550
+
2292
2551
  const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'quiver-migrate-'));
2293
2552
 
2294
2553
  try {
@@ -2314,10 +2573,10 @@ function runMigrate(targetDir, options = {}) {
2314
2573
  }
2315
2574
  }
2316
2575
 
2317
- console.log(`Quiver migration completed for ${projectRoot}`);
2318
- console.log('Missing workflow files were restored without overwriting existing project files.');
2576
+ console.log(translator.t('migrate.completed_for', { path: projectRoot }));
2577
+ console.log(translator.t('migrate.restored_missing'));
2319
2578
  if (legacyLayout.hasLegacyLayout) {
2320
- console.log(`Legacy layout detected and preserved: ${legacyLayout.legacyPaths.join(', ')}`);
2579
+ console.log(translator.t('migrate.legacy_preserved', { paths: legacyLayout.legacyPaths.join(', ') }));
2321
2580
  }
2322
2581
  } finally {
2323
2582
  fs.rmSync(tempRoot, { recursive: true, force: true });
@@ -2558,6 +2817,7 @@ function buildDoctorCommandReport(projectRoot) {
2558
2817
  }
2559
2818
 
2560
2819
  function formatDoctorHumanReport(report, options = {}) {
2820
+ const translator = createTranslator(options.language);
2561
2821
  const lines = [];
2562
2822
  const ux = createUx({
2563
2823
  ...options,
@@ -2574,19 +2834,39 @@ function formatDoctorHumanReport(report, options = {}) {
2574
2834
  if (status === 'error') return 'error';
2575
2835
  return 'warning';
2576
2836
  };
2837
+ const localizeDoctorText = (message) => {
2838
+ const text = String(message || '');
2839
+ let match = text.match(/^Quiver doctor passed for (.+)$/);
2840
+ if (match) return translator.t('doctor.check.passed_for', { path: match[1] });
2841
+ match = text.match(/^Layout: (.+)$/);
2842
+ if (match) return translator.t('doctor.check.layout', { layout: match[1] });
2843
+ if (text === 'Specs: none yet') return translator.t('doctor.check.specs_none');
2844
+ match = text.match(/^Specs: (.+)$/);
2845
+ if (match) return translator.t('doctor.check.specs_found', { specs: match[1] });
2846
+ if (text === 'Required files found') return translator.t('doctor.check.required_files_found');
2847
+ if (text === 'Workflow scripts available') return translator.t('doctor.check.workflow_scripts_available');
2848
+ if (text === 'Quiver state metadata found') return translator.t('doctor.check.state_found');
2849
+ if (text === 'Project analysis artifacts found') return translator.t('doctor.check.project_analysis_found');
2850
+ if (text === 'No specs yet. That is valid after the AI-first init flow.') return translator.t('doctor.fix.no_specs_yet');
2851
+ if (text === 'Run `npx create-quiver analyze` to generate docs/PROJECT_MAP.md when you want the visible project map.') return translator.t('doctor.fix.generate_project_map');
2852
+ if (text === 'Analyze the project first: npx create-quiver analyze') return translator.t('doctor.fix.analyze_first');
2853
+ if (text === 'Check the next ready slice: npx create-quiver next') return translator.t('doctor.fix.check_next');
2854
+ if (text === 'Create real specs and slices only after acceptance criteria are approved and the technical plan is reviewed and approved.') return translator.t('doctor.fix.create_specs_after_approval');
2855
+ return formatWarningPrefix(text, translator);
2856
+ };
2577
2857
 
2578
- ux.section('Quiver Doctor');
2858
+ ux.section(translator.t('doctor.title'));
2579
2859
  ux.line('');
2580
- ux.line('Checks');
2860
+ ux.line(translator.t('doctor.checks'));
2581
2861
  for (const check of report.checks) {
2582
- const line = ` ${symbolForStatus(check.status)} ${check.message}`;
2862
+ const line = ` ${symbolForStatus(check.status)} ${localizeDoctorText(check.message)}`;
2583
2863
  ux.line(ux.mode.decoration ? ux.theme.status(colorForStatus(check.status), line) : line);
2584
2864
  }
2585
2865
 
2586
2866
  ux.line('');
2587
- ux.line('Suggested fixes');
2867
+ ux.line(translator.t('doctor.suggested_fixes'));
2588
2868
  for (const fix of report.suggested_fixes) {
2589
- const line = ` ${ux.theme.symbols.bullet} ${fix}`;
2869
+ const line = ` ${ux.theme.symbols.bullet} ${localizeDoctorText(fix)}`;
2590
2870
  ux.line(ux.mode.decoration ? ux.theme.status('command', line) : line);
2591
2871
  }
2592
2872
 
@@ -2640,6 +2920,74 @@ const INIT_PROFILE_OPTIONS = Object.freeze([
2640
2920
  },
2641
2921
  ]);
2642
2922
 
2923
+ function initModeOptions(translator) {
2924
+ return [
2925
+ {
2926
+ label: translator.t('init.mode.existing.label'),
2927
+ value: 'existing',
2928
+ hint: translator.t('init.mode.existing.hint'),
2929
+ default: true,
2930
+ },
2931
+ {
2932
+ label: translator.t('init.mode.new.label'),
2933
+ value: 'new',
2934
+ hint: translator.t('init.mode.new.hint'),
2935
+ },
2936
+ {
2937
+ label: translator.t('init.mode.validate.label'),
2938
+ value: 'validate',
2939
+ hint: translator.t('init.mode.validate.hint'),
2940
+ },
2941
+ ];
2942
+ }
2943
+
2944
+ function methodologyOptions(translator) {
2945
+ return [
2946
+ {
2947
+ label: translator.t('init.methodology.wdd_sdd.label'),
2948
+ value: 'wdd-sdd',
2949
+ hint: translator.t('init.methodology.wdd_sdd.hint'),
2950
+ default: true,
2951
+ },
2952
+ ];
2953
+ }
2954
+
2955
+ function initProfileOptions(translator) {
2956
+ return [
2957
+ {
2958
+ label: 'Default',
2959
+ value: 'default',
2960
+ hint: translator.t('init.profile.default.hint'),
2961
+ default: true,
2962
+ },
2963
+ {
2964
+ label: 'Minimal',
2965
+ value: 'minimal',
2966
+ hint: translator.t('init.profile.minimal.hint'),
2967
+ },
2968
+ {
2969
+ label: 'Full compatibility',
2970
+ value: 'full',
2971
+ hint: translator.t('init.profile.full.hint'),
2972
+ },
2973
+ ];
2974
+ }
2975
+
2976
+ function initLanguageOptions() {
2977
+ return [
2978
+ {
2979
+ label: 'English',
2980
+ value: 'en',
2981
+ hint: 'en',
2982
+ },
2983
+ {
2984
+ label: 'Español',
2985
+ value: 'es',
2986
+ hint: 'es',
2987
+ },
2988
+ ];
2989
+ }
2990
+
2643
2991
  function hasDirectoryContent(dirPath) {
2644
2992
  return fs.existsSync(dirPath)
2645
2993
  && fs.statSync(dirPath).isDirectory()
@@ -2657,8 +3005,16 @@ function assertSupportedMethodology(value) {
2657
3005
  return normalized;
2658
3006
  }
2659
3007
 
3008
+ function resolveExistingProjectLanguage(targetDir) {
3009
+ const config = readProjectLanguageConfig(targetDir);
3010
+ return normalizeLanguage(config.language);
3011
+ }
3012
+
2660
3013
  async function resolveInteractiveInitOptions(args, targetDir, projectName, options = {}) {
2661
3014
  const explicitMethodology = assertSupportedMethodology(args.methodology);
3015
+ const language = normalizeLanguage(options.language || args.language) || DEFAULT_LANGUAGE;
3016
+ const translator = createTranslator(language);
3017
+ const existingProjectLanguage = resolveExistingProjectLanguage(targetDir);
2662
3018
 
2663
3019
  if (args.interactive !== true) {
2664
3020
  return {
@@ -2669,6 +3025,7 @@ async function resolveInteractiveInitOptions(args, targetDir, projectName, optio
2669
3025
  methodology: explicitMethodology,
2670
3026
  minimal: args.initMinimal,
2671
3027
  projectName,
3028
+ language: '',
2672
3029
  };
2673
3030
  }
2674
3031
 
@@ -2702,58 +3059,66 @@ async function resolveInteractiveInitOptions(args, targetDir, projectName, optio
2702
3059
  stdoutIsTTY: options.stdoutIsTTY,
2703
3060
  };
2704
3061
 
2705
- ux.heading('Bienvenido a Quiver');
2706
- const selectedMode = await selectOption('¿Qué querés configurar?', INIT_MODE_OPTIONS, {
3062
+ ux.heading(translator.t('init.heading'));
3063
+ const selectedMode = await selectOption(translator.t('init.prompt.mode'), initModeOptions(translator), {
2707
3064
  ...selectorOptions,
2708
3065
  defaultValue: hasDirectoryContent(targetDir) ? 'existing' : 'new',
2709
3066
  flag: 'init|doctor',
2710
3067
  name: 'init mode',
2711
3068
  });
2712
- const selectedMethodology = await selectOption('¿Qué metodología vas a usar?', METHODOLOGY_OPTIONS, {
3069
+ const selectedMethodology = await selectOption(translator.t('init.prompt.methodology'), methodologyOptions(translator), {
2713
3070
  ...selectorOptions,
2714
3071
  defaultValue: explicitMethodology,
2715
3072
  flag: '--methodology',
2716
3073
  name: 'methodology',
2717
3074
  value: args.methodology || '',
2718
3075
  });
3076
+ const selectedLanguage = await selectOption(translator.t('init.prompt.language'), initLanguageOptions(), {
3077
+ ...selectorOptions,
3078
+ defaultValue: existingProjectLanguage || language,
3079
+ flag: '--lang|config language set',
3080
+ name: 'project language',
3081
+ });
2719
3082
 
2720
3083
  assertSupportedMethodology(selectedMethodology.value);
2721
3084
 
2722
3085
  if (selectedMode.value === 'validate') {
2723
3086
  ux.summary([
2724
- { label: 'Modo', value: 'Solo validar estructura' },
2725
- { label: 'Metodologia', value: selectedMethodology.label },
2726
- { label: 'Comando equivalente', value: 'npx create-quiver doctor' },
2727
- ], { title: 'Configuracion elegida' });
3087
+ { label: translator.t('init.summary.mode'), value: selectedMode.label },
3088
+ { label: translator.t('init.summary.methodology'), value: selectedMethodology.label },
3089
+ { label: translator.t('init.summary.language'), value: selectedLanguage.value },
3090
+ { label: translator.t('init.summary.equivalent_command'), value: 'npx create-quiver doctor' },
3091
+ ], { title: translator.t('init.summary.title') });
2728
3092
  if (!args.force && !args.dryRun) {
2729
- const confirmed = await ux.promptConfirm('Ejecutar Doctor ahora?', { initialValue: true });
3093
+ const confirmed = await ux.promptConfirm(translator.t('init.confirm.doctor'), { initialValue: true });
2730
3094
  if (!confirmed) {
2731
3095
  throw new Error(formatError('init interactive validation declined. No files were written.'));
2732
3096
  }
2733
3097
  }
2734
3098
  return {
2735
3099
  action: 'doctor',
3100
+ language: selectedLanguage.value,
2736
3101
  methodology: selectedMethodology.value,
2737
3102
  projectName,
2738
3103
  };
2739
3104
  }
2740
3105
 
2741
3106
  const defaultProfile = args.initFull ? 'full' : args.initMinimal ? 'minimal' : 'default';
2742
- const selectedProfile = await selectOption('¿Qué contrato inicial querés crear?', INIT_PROFILE_OPTIONS, {
3107
+ const selectedProfile = await selectOption(translator.t('init.prompt.profile'), initProfileOptions(translator), {
2743
3108
  ...selectorOptions,
2744
3109
  defaultValue: defaultProfile,
2745
3110
  flag: '--minimal|--full',
2746
3111
  name: 'init profile',
2747
3112
  });
2748
- const agentGuidance = await selectOption('¿Querés ver el próximo paso para perfiles de agentes?', [
3113
+ const agentGuidance = await selectOption(translator.t('init.prompt.agent_guidance'), [
2749
3114
  {
2750
- label: 'Mostrar comandos sugeridos',
3115
+ label: translator.t('init.agent_guidance.show.label'),
2751
3116
  value: 'show',
2752
- hint: 'No guarda credenciales ni ejecuta proveedores',
3117
+ hint: translator.t('init.agent_guidance.show.hint'),
2753
3118
  default: true,
2754
3119
  },
2755
3120
  {
2756
- label: 'Omitir por ahora',
3121
+ label: translator.t('init.agent_guidance.skip.label'),
2757
3122
  value: 'skip',
2758
3123
  },
2759
3124
  ], {
@@ -2766,28 +3131,30 @@ async function resolveInteractiveInitOptions(args, targetDir, projectName, optio
2766
3131
  full: selectedProfile.value === 'full',
2767
3132
  includeTemplates: args.initIncludeTemplates || selectedProfile.value === 'full',
2768
3133
  legacyScripts: args.initLegacyScripts,
3134
+ language: selectedLanguage.value,
2769
3135
  methodology: selectedMethodology.value,
2770
3136
  minimal: selectedProfile.value === 'minimal',
2771
3137
  projectName,
2772
3138
  };
2773
3139
 
2774
3140
  ux.summary([
2775
- { label: 'Proyecto', value: projectName },
2776
- { label: 'Modo', value: selectedMode.label },
2777
- { label: 'Metodologia', value: selectedMethodology.label },
2778
- { label: 'Perfil', value: selectedProfile.label },
2779
- { label: 'Perfiles de agentes', value: agentGuidance.value === 'show' ? 'mostrar proximo paso' : 'omitir' },
2780
- ], { title: 'Configuracion elegida' });
3141
+ { label: translator.t('init.summary.project'), value: projectName },
3142
+ { label: translator.t('init.summary.mode'), value: selectedMode.label },
3143
+ { label: translator.t('init.summary.methodology'), value: selectedMethodology.label },
3144
+ { label: translator.t('init.summary.language'), value: selectedLanguage.value },
3145
+ { label: translator.t('init.summary.profile'), value: selectedProfile.label },
3146
+ { label: translator.t('init.summary.agent_profiles'), value: agentGuidance.value === 'show' ? translator.t('init.agent_guidance.show.summary') : translator.t('init.agent_guidance.skip.summary') },
3147
+ ], { title: translator.t('init.summary.title') });
2781
3148
 
2782
3149
  if (agentGuidance.value === 'show') {
2783
3150
  ux.nextSteps([
2784
3151
  'npx create-quiver ai agent set planner --provider codex --model gpt-5.5 --dry-run',
2785
3152
  'npx create-quiver ai agent set executor --provider claude --model claude-sonnet-4-6 --dry-run',
2786
- ], { title: 'Despues de inicializar' });
3153
+ ], { title: translator.t('init.next_steps.after_init') });
2787
3154
  }
2788
3155
 
2789
3156
  if (!args.force && !args.dryRun) {
2790
- const confirmed = await ux.promptConfirm(`Inicializar Quiver en ${targetDir}?`, { initialValue: true });
3157
+ const confirmed = await ux.promptConfirm(translator.t('init.confirm.initialize', { path: targetDir }), { initialValue: true });
2791
3158
  if (!confirmed) {
2792
3159
  throw new Error(formatError('init interactive approval declined. No files were written.'));
2793
3160
  }
@@ -2799,6 +3166,46 @@ async function resolveInteractiveInitOptions(args, targetDir, projectName, optio
2799
3166
  };
2800
3167
  }
2801
3168
 
3169
+ function persistInitLanguage(targetDir, initOptions = {}) {
3170
+ if (!initOptions.language) {
3171
+ return null;
3172
+ }
3173
+ writeProjectLanguageConfig(targetDir, initOptions.language);
3174
+ return {
3175
+ language: initOptions.language,
3176
+ path: path.join(targetDir, '.quiver', 'config.json'),
3177
+ };
3178
+ }
3179
+
3180
+ function resolveInitGeneratedLanguage(args, targetDir, initOptions = {}) {
3181
+ if (initOptions.language) {
3182
+ return {
3183
+ configLanguage: initOptions.language,
3184
+ docsLanguage: initOptions.language,
3185
+ };
3186
+ }
3187
+
3188
+ if (args.languageResolution?.source === '--lang') {
3189
+ return {
3190
+ configLanguage: args.language,
3191
+ docsLanguage: args.language,
3192
+ };
3193
+ }
3194
+
3195
+ const existingProjectLanguage = resolveExistingProjectLanguage(targetDir);
3196
+ if (existingProjectLanguage) {
3197
+ return {
3198
+ configLanguage: existingProjectLanguage,
3199
+ docsLanguage: existingProjectLanguage,
3200
+ };
3201
+ }
3202
+
3203
+ return {
3204
+ configLanguage: '',
3205
+ docsLanguage: args.language || DEFAULT_LANGUAGE,
3206
+ };
3207
+ }
3208
+
2802
3209
  function runDoctor(targetDir, options = {}) {
2803
3210
  const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
2804
3211
 
@@ -2837,6 +3244,7 @@ function runDoctor(targetDir, options = {}) {
2837
3244
  console.log(JSON.stringify(commandReport, null, 2));
2838
3245
  } else {
2839
3246
  process.stdout.write(formatDoctorHumanReport(commandReport, {
3247
+ language: options.language,
2840
3248
  noColor: options.noColor,
2841
3249
  unicode: options.unicode,
2842
3250
  }));
@@ -2847,38 +3255,84 @@ function runDoctor(targetDir, options = {}) {
2847
3255
  }
2848
3256
  }
2849
3257
 
2850
- function printInitNextSteps(targetDir, projectName) {
3258
+ function printInitNextSteps(targetDir, projectName, options = {}) {
3259
+ const translator = createTranslator(options.language);
2851
3260
  console.log('');
2852
- console.log('Next steps:');
2853
- console.log(`- Review AGENTS.md, then ${path.join(targetDir, 'docs', 'AI_ONBOARDING_PROMPT.md')}`);
2854
- console.log(`- Review ${path.join(targetDir, 'docs', 'WORKFLOW.md')}`);
2855
- console.log('- Analyze the project with npx create-quiver analyze');
2856
- console.log('- Create real specs and slices after acceptance criteria are approved and the technical plan is reviewed and approved.');
3261
+ console.log(translator.t('init.next_steps.title'));
3262
+ console.log(`- ${translator.t('init.next_steps.review_agents', { path: path.join(targetDir, 'docs', 'AI_ONBOARDING_PROMPT.md') })}`);
3263
+ console.log(`- ${translator.t('init.next_steps.review_workflow', { path: path.join(targetDir, 'docs', 'WORKFLOW.md') })}`);
3264
+ console.log(`- ${translator.t('init.next_steps.analyze')}`);
3265
+ console.log(`- ${translator.t('init.next_steps.create_specs')}`);
2857
3266
  }
2858
3267
 
2859
3268
  async function run(argv) {
2860
- if (argv.length === 1 && argv[0] === 'help') {
2861
- printUsage();
3269
+ let languageArgs;
3270
+ try {
3271
+ languageArgs = extractCliLanguageFlag(argv);
3272
+ } catch (error) {
3273
+ const languageResolution = resolveLanguage({
3274
+ env: process.env,
3275
+ projectRoot: process.cwd(),
3276
+ });
3277
+ setCurrentErrorLanguage(languageResolution.language);
3278
+ throw new Error(formatError(error.message));
3279
+ }
3280
+
3281
+ const normalizedArgv = languageArgs.argv;
3282
+ const languageResolution = resolveLanguage({
3283
+ cliLanguage: languageArgs.language,
3284
+ env: process.env,
3285
+ projectRoot: process.cwd(),
3286
+ });
3287
+ setCurrentErrorLanguage(languageResolution.language);
3288
+
3289
+ if (normalizedArgv.length === 1 && normalizedArgv[0] === 'help') {
3290
+ printUsage(languageResolution.language);
2862
3291
  return;
2863
3292
  }
2864
3293
 
2865
- if (argv.length === 1 && (argv[0] === '-V' || argv[0] === '--version')) {
3294
+ if (normalizedArgv.length === 1 && (normalizedArgv[0] === '-V' || normalizedArgv[0] === '--version')) {
2866
3295
  console.log(CLI_VERSION);
2867
3296
  return;
2868
3297
  }
2869
3298
 
2870
- const args = parseArgs(argv);
3299
+ const args = parseCliArgs(normalizedArgv, {
3300
+ language: languageArgs.language,
3301
+ legacyParseArgs: parseArgs,
3302
+ });
3303
+ args.languageResolution = languageResolution;
3304
+ args.language = args.languageResolution.language;
2871
3305
 
2872
3306
  if (args.help) {
2873
- printUsage();
3307
+ if (!args.json) {
3308
+ for (const warning of args.languageResolution.warnings || []) {
3309
+ process.stderr.write(`${formatLanguageWarningForCli(warning, args.language)}\n`);
3310
+ }
3311
+ }
3312
+ printUsage(args.language);
2874
3313
  return;
2875
3314
  }
2876
3315
 
2877
3316
  validateUxFlags(args);
2878
3317
 
3318
+ if (!args.json) {
3319
+ for (const warning of args.languageResolution.warnings || []) {
3320
+ process.stderr.write(`${formatLanguageWarningForCli(warning, args.language)}\n`);
3321
+ }
3322
+ if (args.legacyAliasCommand) {
3323
+ process.stderr.write(`${formatLegacyNamespaceWarning(args.mode, args.legacyAliasCommand)}\n`);
3324
+ }
3325
+ }
3326
+
2879
3327
  if (args.mode === 'analyze') {
2880
- runAnalyze(args.targetDir, {
3328
+ await runAnalyze(args.targetDir, {
2881
3329
  dryRun: args.dryRun,
3330
+ json: args.json,
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),
2882
3336
  });
2883
3337
  return;
2884
3338
  }
@@ -2886,6 +3340,7 @@ async function run(argv) {
2886
3340
  if (args.mode === 'flow') {
2887
3341
  await runFlow(process.cwd(), {
2888
3342
  json: args.json,
3343
+ language: args.language,
2889
3344
  });
2890
3345
  return;
2891
3346
  }
@@ -2895,6 +3350,7 @@ async function run(argv) {
2895
3350
  details: args.dashboardDetails,
2896
3351
  includeCompleted: args.includeCompleted,
2897
3352
  json: args.json,
3353
+ language: args.language,
2898
3354
  limit: args.dashboardLimit,
2899
3355
  noColor: args.noColor,
2900
3356
  optionErrors: args.dashboardOptionErrors,
@@ -2914,6 +3370,7 @@ async function run(argv) {
2914
3370
  } else {
2915
3371
  process.stdout.write(formatHumanVersionReport(report, {
2916
3372
  env: process.env,
3373
+ language: args.language,
2917
3374
  noColor: args.noColor,
2918
3375
  stdoutIsTTY: Boolean(process.stdout.isTTY),
2919
3376
  }));
@@ -2921,10 +3378,29 @@ async function run(argv) {
2921
3378
  return;
2922
3379
  }
2923
3380
 
3381
+ if (args.mode === 'changelog') {
3382
+ runChangelog({ json: args.json });
3383
+ return;
3384
+ }
3385
+
3386
+ if (args.mode === 'config') {
3387
+ runConfig(process.cwd(), {
3388
+ command: args.configCommand,
3389
+ global: args.configGlobal,
3390
+ json: args.json,
3391
+ language: args.language,
3392
+ languageResolution: args.languageResolution,
3393
+ section: args.configSection,
3394
+ value: args.configValue,
3395
+ });
3396
+ return;
3397
+ }
3398
+
2924
3399
  if (args.mode === 'plan') {
2925
3400
  runPlan(process.cwd(), {
2926
3401
  includeCompleted: args.includeCompleted,
2927
3402
  json: args.json,
3403
+ language: args.language,
2928
3404
  onlyReady: args.onlyReady,
2929
3405
  specSlug: args.specSlug,
2930
3406
  unicode: args.unicode,
@@ -2951,6 +3427,7 @@ async function run(argv) {
2951
3427
  runAiLifecycleRun(process.cwd(), {
2952
3428
  command: args.aiRunCommand,
2953
3429
  input: args.aiInput || undefined,
3430
+ language: args.language,
2954
3431
  runId: args.aiRunId || undefined,
2955
3432
  specSlug: args.specSlug || undefined,
2956
3433
  });
@@ -2961,12 +3438,14 @@ async function run(argv) {
2961
3438
  runAiActiveSlice(process.cwd(), {
2962
3439
  command: args.aiSecondaryCommand || 'status',
2963
3440
  dryRun: args.dryRun,
3441
+ language: args.language,
2964
3442
  });
2965
3443
  return;
2966
3444
  }
2967
3445
 
2968
3446
  if (args.aiCommand === 'status') {
2969
3447
  runAiLifecycleStatus(process.cwd(), {
3448
+ language: args.language,
2970
3449
  runId: args.aiRunId || undefined,
2971
3450
  });
2972
3451
  return;
@@ -2974,6 +3453,7 @@ async function run(argv) {
2974
3453
 
2975
3454
  if (args.aiCommand === 'resume') {
2976
3455
  runAiLifecycleResume(process.cwd(), {
3456
+ language: args.language,
2977
3457
  runId: args.aiRunId || undefined,
2978
3458
  });
2979
3459
  return;
@@ -2982,6 +3462,7 @@ async function run(argv) {
2982
3462
  if (args.aiCommand === 'inspect') {
2983
3463
  runAiInspect(process.cwd(), {
2984
3464
  includeCompleted: args.includeCompleted,
3465
+ language: args.language,
2985
3466
  });
2986
3467
  return;
2987
3468
  }
@@ -2990,6 +3471,7 @@ async function run(argv) {
2990
3471
  runAiExport(process.cwd(), {
2991
3472
  format: args.formatExplicit ? args.format : 'json',
2992
3473
  includeCompleted: args.includeCompleted,
3474
+ language: args.language,
2993
3475
  });
2994
3476
  return;
2995
3477
  }
@@ -2998,6 +3480,7 @@ async function run(argv) {
2998
3480
  runAiSpecsList(process.cwd(), {
2999
3481
  includeCompleted: args.includeCompleted,
3000
3482
  json: args.json,
3483
+ language: args.language,
3001
3484
  });
3002
3485
  return;
3003
3486
  }
@@ -3006,6 +3489,7 @@ async function run(argv) {
3006
3489
  runAiSlicesList(process.cwd(), {
3007
3490
  includeCompleted: args.includeCompleted,
3008
3491
  json: args.json,
3492
+ language: args.language,
3009
3493
  });
3010
3494
  return;
3011
3495
  }
@@ -3013,6 +3497,7 @@ async function run(argv) {
3013
3497
  if (args.aiCommand === 'trace') {
3014
3498
  runAiTraceReport(process.cwd(), {
3015
3499
  includeCompleted: args.includeCompleted,
3500
+ language: args.language,
3016
3501
  });
3017
3502
  return;
3018
3503
  }
@@ -3020,6 +3505,7 @@ async function run(argv) {
3020
3505
  if (args.aiCommand === 'models') {
3021
3506
  runAiModelsList({
3022
3507
  json: args.json,
3508
+ language: args.language,
3023
3509
  provider: args.aiProviderExplicit ? args.aiProvider : undefined,
3024
3510
  });
3025
3511
  return;
@@ -3034,6 +3520,7 @@ async function run(argv) {
3034
3520
  id: args.aiProfileId || undefined,
3035
3521
  interactive: args.interactive,
3036
3522
  json: args.json,
3523
+ language: args.language,
3037
3524
  label: args.aiLabel || undefined,
3038
3525
  model: args.aiModel || undefined,
3039
3526
  provider: args.aiProviderExplicit ? args.aiProvider : undefined,
@@ -3052,6 +3539,7 @@ async function run(argv) {
3052
3539
  provider: args.aiProvider,
3053
3540
  providerExplicit: args.aiProviderExplicit,
3054
3541
  model: args.aiModel || undefined,
3542
+ language: args.language,
3055
3543
  plannerProfile: args.aiPlannerProfile || undefined,
3056
3544
  role: args.aiRole,
3057
3545
  timeout: args.aiTimeout,
@@ -3064,6 +3552,7 @@ async function run(argv) {
3064
3552
  context: args.aiContext || undefined,
3065
3553
  dryRun: args.dryRun,
3066
3554
  interactive: args.interactive,
3555
+ language: args.language,
3067
3556
  printPrompt: args.aiPrintPrompt,
3068
3557
  provider: args.aiProvider,
3069
3558
  providerExplicit: args.aiProviderExplicit,
@@ -3084,6 +3573,7 @@ async function run(argv) {
3084
3573
  dryRun: args.dryRun,
3085
3574
  input: args.aiInput || undefined,
3086
3575
  phase: args.aiPhase,
3576
+ language: args.language,
3087
3577
  printPrompt: args.aiPrintPrompt,
3088
3578
  provider: args.aiProvider,
3089
3579
  providerExplicit: args.aiProviderExplicit,
@@ -3105,6 +3595,7 @@ async function run(argv) {
3105
3595
  context: args.aiContext || undefined,
3106
3596
  dryRun: args.dryRun,
3107
3597
  input: args.aiInput || undefined,
3598
+ language: args.language,
3108
3599
  printPrompt: args.aiPrintPrompt,
3109
3600
  provider: args.aiProvider,
3110
3601
  providerExplicit: args.aiProviderExplicit,
@@ -3120,6 +3611,7 @@ async function run(argv) {
3120
3611
  context: args.aiContext || undefined,
3121
3612
  dryRun: args.dryRun,
3122
3613
  input: args.aiInput || undefined,
3614
+ language: args.language,
3123
3615
  printPrompt: args.aiPrintPrompt,
3124
3616
  provider: args.aiProvider,
3125
3617
  providerExplicit: args.aiProviderExplicit,
@@ -3138,6 +3630,7 @@ async function run(argv) {
3138
3630
  dryRun: args.dryRun,
3139
3631
  input: args.aiInput || undefined,
3140
3632
  phase: args.aiPhase,
3633
+ language: args.language,
3141
3634
  printPrompt: args.aiPrintPrompt,
3142
3635
  provider: args.aiProvider,
3143
3636
  providerExplicit: args.aiProviderExplicit,
@@ -3154,6 +3647,7 @@ async function run(argv) {
3154
3647
  await runAiApprove(process.cwd(), {
3155
3648
  dryRun: args.dryRun,
3156
3649
  input: args.aiInput || undefined,
3650
+ language: args.language,
3157
3651
  phase: args.aiPhase,
3158
3652
  runId: args.aiRunId || undefined,
3159
3653
  version: args.aiVersion || undefined,
@@ -3162,7 +3656,9 @@ async function run(argv) {
3162
3656
  }
3163
3657
 
3164
3658
  if (args.aiCommand === 'approvals' || args.aiCommand === 'approval-status') {
3165
- await runAiApprovalStatus(process.cwd());
3659
+ await runAiApprovalStatus(process.cwd(), {
3660
+ language: args.language,
3661
+ });
3166
3662
  return;
3167
3663
  }
3168
3664
 
@@ -3174,6 +3670,7 @@ async function run(argv) {
3174
3670
  dryRun: args.dryRun,
3175
3671
  executorProfile: args.aiExecutorProfile || undefined,
3176
3672
  interactive: args.interactive,
3673
+ language: args.language,
3177
3674
  model: args.aiModel || undefined,
3178
3675
  provider: args.aiProvider,
3179
3676
  providerExplicit: args.aiProviderExplicit,
@@ -3186,6 +3683,7 @@ async function run(argv) {
3186
3683
 
3187
3684
  if (args.aiCommand === 'prompt-slice' || args.aiCommand === 'executor-prompt') {
3188
3685
  runAiPromptSlice(process.cwd(), {
3686
+ language: args.language,
3189
3687
  slice: args.aiSlice || undefined,
3190
3688
  });
3191
3689
  return;
@@ -3201,6 +3699,7 @@ async function run(argv) {
3201
3699
  executorProfile: args.aiExecutorProfile || undefined,
3202
3700
  interactive: args.interactive,
3203
3701
  json: args.json,
3702
+ language: args.language,
3204
3703
  model: args.aiModel || undefined,
3205
3704
  mode: args.aiExecutionMode,
3206
3705
  provider: args.aiProvider,
@@ -3224,11 +3723,12 @@ async function run(argv) {
3224
3723
 
3225
3724
  if (args.aiCommand === 'pr') {
3226
3725
  await runAiPr(process.cwd(), {
3227
- baseBranch: args.aiBaseBranch,
3726
+ baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
3228
3727
  create: args.aiCreate,
3229
3728
  dryRun: args.dryRun,
3230
3729
  input: args.aiInput || undefined,
3231
3730
  interactive: args.interactive,
3731
+ language: args.language,
3232
3732
  remote: args.aiRemote || undefined,
3233
3733
  review: args.review,
3234
3734
  sshHostAlias: args.aiSshHostAlias || undefined,
@@ -3246,6 +3746,7 @@ async function run(argv) {
3246
3746
  format: args.format,
3247
3747
  includeCompleted: args.includeCompleted,
3248
3748
  json: args.json,
3749
+ language: args.language,
3249
3750
  level: args.level,
3250
3751
  showConflicts: args.showConflicts,
3251
3752
  specSlug: args.specSlug,
@@ -3260,6 +3761,7 @@ async function run(argv) {
3260
3761
  autoStart: args.autoStart,
3261
3762
  includeCompleted: args.includeCompleted,
3262
3763
  json: args.json,
3764
+ language: args.language,
3263
3765
  specSlug: args.specSlug,
3264
3766
  });
3265
3767
  return;
@@ -3268,9 +3770,12 @@ async function run(argv) {
3268
3770
  if (args.mode === 'evidence') {
3269
3771
  const result = runEvidence(process.cwd(), {
3270
3772
  command: args.evidenceArgs,
3773
+ language: args.language,
3271
3774
  maxOutput: args.evidenceMaxOutput || undefined,
3272
3775
  output: args.evidenceOutput || undefined,
3776
+ json: args.json,
3273
3777
  subcommand: args.evidenceCommand,
3778
+ target: args.evidenceTarget,
3274
3779
  });
3275
3780
  process.exitCode = result.exitCode;
3276
3781
  return;
@@ -3282,15 +3787,23 @@ async function run(argv) {
3282
3787
  command: args.demoCommand,
3283
3788
  demo: args.demoName,
3284
3789
  dryRun: args.dryRun,
3790
+ language: args.language,
3285
3791
  targetRoot: demoTarget,
3286
3792
  });
3287
3793
  return;
3288
3794
  }
3289
3795
 
3290
3796
  if (args.mode === 'migrate') {
3291
- runMigrate(args.targetDir, {
3797
+ await runMigrate(args.targetDir, {
3292
3798
  dryRun: args.dryRun,
3799
+ force: args.force,
3800
+ json: args.json,
3801
+ language: args.language,
3802
+ noColor: args.noColor,
3293
3803
  skipInstall: args.skipInstall,
3804
+ stderrIsTTY: Boolean(process.stderr.isTTY),
3805
+ stdinIsTTY: Boolean(process.stdin.isTTY),
3806
+ stdoutIsTTY: Boolean(process.stdout.isTTY),
3294
3807
  });
3295
3808
  return;
3296
3809
  }
@@ -3300,6 +3813,7 @@ async function run(argv) {
3300
3813
  dryRun: args.dryRun,
3301
3814
  fix: args.doctorFix,
3302
3815
  json: args.json,
3816
+ language: args.language,
3303
3817
  noColor: args.noColor,
3304
3818
  unicode: args.unicode,
3305
3819
  });
@@ -3307,7 +3821,10 @@ async function run(argv) {
3307
3821
  }
3308
3822
 
3309
3823
  if (args.mode === 'start-slice') {
3310
- startSlice(args.targetDir, { allowDraft: args.allowDraft });
3824
+ startSlice(args.targetDir, {
3825
+ allowDraft: args.allowDraft,
3826
+ language: args.language,
3827
+ });
3311
3828
  return;
3312
3829
  }
3313
3830
 
@@ -3315,6 +3832,7 @@ async function run(argv) {
3315
3832
  checkSliceReadiness(args.targetDir, {
3316
3833
  baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
3317
3834
  gate: args.gate,
3835
+ language: args.language,
3318
3836
  local: args.checkSliceLocal,
3319
3837
  remote: args.aiRemote,
3320
3838
  strictOverlap: args.strictOverlap,
@@ -3323,7 +3841,11 @@ async function run(argv) {
3323
3841
  }
3324
3842
 
3325
3843
  if (args.mode === 'check-pr') {
3326
- checkPrReadiness(args.targetDir);
3844
+ checkPrReadiness(args.targetDir, {
3845
+ baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
3846
+ language: args.language,
3847
+ remote: args.aiRemote,
3848
+ });
3327
3849
  return;
3328
3850
  }
3329
3851
 
@@ -3333,16 +3855,21 @@ async function run(argv) {
3333
3855
  if (!handoffInput || handoffInput === '.') {
3334
3856
  throw new Error(formatError('missing handoff or brief path. Use: npx create-quiver check-handoff specs/<spec-slug>/HANDOFF.md or specs/<spec-slug>/slices/<slice-id>/EXECUTION_BRIEF.md'));
3335
3857
  }
3336
- const resolved = checkHandoff(handoffInput, repoRoot);
3337
- console.log(`PASS: ${resolved.label} validated at ${resolved.relativePath}`);
3858
+ const translator = createTranslator(args.language);
3859
+ const resolved = checkHandoff(handoffInput, repoRoot, { language: args.language });
3860
+ console.log(translator.t('handoff.validated', {
3861
+ path: resolved.relativePath,
3862
+ subject: translator.t(`handoff.label.${resolved.kind}`),
3863
+ }));
3338
3864
  return;
3339
3865
  }
3340
3866
 
3341
3867
  if (args.mode === 'new-handoff') {
3342
3868
  const repoRoot = process.cwd();
3343
3869
  const handoffSlug = args.targetDir;
3870
+ const translator = createTranslator(args.language);
3344
3871
  const resolved = scaffoldHandoff(handoffSlug, repoRoot);
3345
- console.log(`PASS: Handoff scaffolded at ${resolved.relativePath}`);
3872
+ console.log(translator.t('handoff.scaffolded', { path: resolved.relativePath }));
3346
3873
  return;
3347
3874
  }
3348
3875
 
@@ -3352,6 +3879,7 @@ async function run(argv) {
3352
3879
  discard: args.discard,
3353
3880
  dryRun: args.dryRun,
3354
3881
  force: args.force,
3882
+ language: args.language,
3355
3883
  });
3356
3884
  return;
3357
3885
  }
@@ -3359,6 +3887,7 @@ async function run(argv) {
3359
3887
  if (args.mode === 'check-scope') {
3360
3888
  checkScope(args.targetDir, {
3361
3889
  baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
3890
+ language: args.language,
3362
3891
  remote: args.aiRemote,
3363
3892
  strict: args.strict,
3364
3893
  });
@@ -3377,6 +3906,7 @@ async function run(argv) {
3377
3906
  dryRun: args.dryRun,
3378
3907
  input: args.aiInput || undefined,
3379
3908
  interactive: args.interactive,
3909
+ language: args.language,
3380
3910
  methodology: args.methodology || undefined,
3381
3911
  review: args.review,
3382
3912
  specSlug: args.specSlug || undefined,
@@ -3386,25 +3916,27 @@ async function run(argv) {
3386
3916
  }
3387
3917
 
3388
3918
  if (!args.targetDir || args.targetDir === '.') {
3389
- 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')));
3390
3920
  }
3391
3921
 
3392
3922
  if (args.specCommand === 'start') {
3393
3923
  const report = startSpecWorktree(process.cwd(), args.targetDir, {
3924
+ baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
3394
3925
  dryRun: args.dryRun,
3395
3926
  });
3396
- process.stdout.write(formatSpecStartResult(report));
3927
+ process.stdout.write(formatSpecStartResult(report, { language: args.language }));
3397
3928
  return;
3398
3929
  }
3399
3930
 
3400
3931
  if (args.specCommand === 'status') {
3401
3932
  const report = buildSpecStatus(process.cwd(), args.targetDir);
3402
- process.stdout.write(formatSpecStatus(report));
3933
+ process.stdout.write(formatSpecStatus(report, { language: args.language }));
3403
3934
  return;
3404
3935
  }
3405
3936
 
3406
3937
  if (args.specCommand === 'validate') {
3407
3938
  runValidateSpec(process.cwd(), args.targetDir, {
3939
+ language: args.language,
3408
3940
  strict: args.strict,
3409
3941
  });
3410
3942
  return;
@@ -3412,13 +3944,13 @@ async function run(argv) {
3412
3944
 
3413
3945
  if (args.specCommand === 'close') {
3414
3946
  const report = closeSpecWorktree(process.cwd(), args.targetDir, {
3415
- baseBranch: args.aiBaseBranch,
3947
+ baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
3416
3948
  discard: args.discard,
3417
3949
  dryRun: args.dryRun,
3418
3950
  force: args.force,
3419
3951
  remote: args.aiRemote,
3420
3952
  });
3421
- process.stdout.write(formatSpecCloseResult(report));
3953
+ process.stdout.write(formatSpecCloseResult(report, { language: args.language }));
3422
3954
  return;
3423
3955
  }
3424
3956
 
@@ -3439,11 +3971,13 @@ async function run(argv) {
3439
3971
  });
3440
3972
  return;
3441
3973
  }
3974
+ const initLanguage = resolveInitGeneratedLanguage(args, targetDir, initOptions);
3442
3975
  const initLayout = buildInitLayout(targetDir, {
3443
3976
  compatibilityAlias: !args.explicitInit,
3444
3977
  dryRun: args.dryRun,
3445
3978
  full: initOptions.full,
3446
3979
  includeTemplates: initOptions.includeTemplates,
3980
+ language: initLanguage.configLanguage,
3447
3981
  legacyScripts: initOptions.legacyScripts,
3448
3982
  minimal: initOptions.minimal,
3449
3983
  projectName: initOptions.projectName,
@@ -3456,23 +3990,60 @@ async function run(argv) {
3456
3990
  }
3457
3991
 
3458
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
+ });
3459
4001
 
3460
4002
  try {
3461
- ensureDir(targetDir);
3462
-
3463
- 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
+ );
3464
4014
  if (initLayout.profile === 'full') {
3465
- exportTemplatesToLegacyRoot(templateRoot, targetDir);
3466
- }
3467
- runInitDocs(targetDir, initOptions.projectName, {
3468
- includeTemplates: initOptions.includeTemplates,
3469
- legacyScripts: initOptions.legacyScripts,
3470
- profile: initLayout.profile,
3471
- templateRoot,
3472
- });
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
+ );
3473
4039
 
3474
4040
  if (!args.skipInstall) {
3475
- 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
+ );
3476
4047
  if (installResult === 'installed') {
3477
4048
  console.log(`Added create-quiver@${CLI_VERSION} as dev dependency`);
3478
4049
  } else if (installResult === 'failed') {
@@ -3480,14 +4051,18 @@ async function run(argv) {
3480
4051
  }
3481
4052
  }
3482
4053
 
3483
- console.log(`Installed Quiver into ${targetDir}`);
3484
- printInitNextSteps(targetDir, initOptions.projectName);
4054
+ console.log(translator.t('init.installed', { path: targetDir }));
4055
+ if (languageWrite) {
4056
+ console.log(translator.t('init.language.saved', { language: languageWrite.language }));
4057
+ }
4058
+ printInitNextSteps(targetDir, initOptions.projectName, { language: args.language });
3485
4059
  } finally {
3486
4060
  fs.rmSync(tempRoot, { recursive: true, force: true });
3487
4061
  }
3488
4062
  }
3489
4063
 
3490
4064
  module.exports = {
4065
+ persistInitLanguage,
3491
4066
  resolveInteractiveInitOptions,
3492
4067
  runAnalyze,
3493
4068
  runDashboard,