create-quiver 0.15.2 → 0.15.4

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 (324) hide show
  1. package/.github/workflows/ci.yml +3 -0
  2. package/AGENTS.md.es.template +37 -0
  3. package/README.md +1 -0
  4. package/README_FOR_AI.md +6 -4
  5. package/docs/AI_CONTEXT.md.es.template +35 -0
  6. package/docs/AI_ONBOARDING_PROMPT.md.es.template +22 -0
  7. package/docs/CLI_UX_GUIDE.md +47 -1
  8. package/docs/COMMANDS.md.es.template +28 -0
  9. package/docs/COMMANDS.md.template +14 -3
  10. package/docs/CONTEXTO.md.es.template +33 -0
  11. package/docs/DECISIONS.md.es.template +17 -0
  12. package/docs/GITFLOW_PR_GUIDE.md.es.template +25 -0
  13. package/docs/INDEX.md +96 -0
  14. package/docs/INDEX.md.es.template +36 -0
  15. package/docs/STATUS.md.es.template +28 -0
  16. package/docs/SUPPORT_MATRIX.md.es.template +22 -0
  17. package/docs/TESTING_GUIDE_FOR_AI.md.es.template +19 -0
  18. package/docs/TROUBLESHOOTING.md.es.template +35 -0
  19. package/docs/WORKFLOW.md.es.template +29 -0
  20. package/docs/WORKFLOW.md.template +2 -2
  21. package/docs/ai/LESSONS.md.es.template +24 -0
  22. package/docs/getting-started/installation.md +19 -0
  23. package/docs/reference/commands.md +68 -2
  24. package/package.json +3 -1
  25. package/specs/quiver-v34-cli-dashboard-status/EVIDENCE_REPORT.md +119 -0
  26. package/specs/quiver-v34-cli-dashboard-status/EXECUTION_PLAN.md +77 -0
  27. package/specs/quiver-v34-cli-dashboard-status/SPEC.md +152 -0
  28. package/specs/quiver-v34-cli-dashboard-status/STATUS.md +29 -0
  29. package/specs/quiver-v34-cli-dashboard-status/pr.md +99 -0
  30. package/specs/quiver-v34-cli-dashboard-status/slices/slice-00-dashboard-foundation/CLOSURE_BRIEF.md +19 -0
  31. package/specs/quiver-v34-cli-dashboard-status/slices/slice-00-dashboard-foundation/EXECUTION_BRIEF.md +49 -0
  32. package/specs/quiver-v34-cli-dashboard-status/slices/slice-00-dashboard-foundation/slice.json +68 -0
  33. package/specs/quiver-v34-cli-dashboard-status/slices/slice-01-dashboard-report-contract/CLOSURE_BRIEF.md +19 -0
  34. package/specs/quiver-v34-cli-dashboard-status/slices/slice-01-dashboard-report-contract/EXECUTION_BRIEF.md +53 -0
  35. package/specs/quiver-v34-cli-dashboard-status/slices/slice-01-dashboard-report-contract/slice.json +78 -0
  36. package/specs/quiver-v34-cli-dashboard-status/slices/slice-02-dashboard-command-rendering/CLOSURE_BRIEF.md +19 -0
  37. package/specs/quiver-v34-cli-dashboard-status/slices/slice-02-dashboard-command-rendering/EXECUTION_BRIEF.md +53 -0
  38. package/specs/quiver-v34-cli-dashboard-status/slices/slice-02-dashboard-command-rendering/slice.json +82 -0
  39. package/specs/quiver-v34-cli-dashboard-status/slices/slice-03-dashboard-edge-cases-and-guardrails/CLOSURE_BRIEF.md +19 -0
  40. package/specs/quiver-v34-cli-dashboard-status/slices/slice-03-dashboard-edge-cases-and-guardrails/EXECUTION_BRIEF.md +54 -0
  41. package/specs/quiver-v34-cli-dashboard-status/slices/slice-03-dashboard-edge-cases-and-guardrails/slice.json +77 -0
  42. package/specs/quiver-v34-cli-dashboard-status/slices/slice-04-docs-templates-and-scripts/CLOSURE_BRIEF.md +19 -0
  43. package/specs/quiver-v34-cli-dashboard-status/slices/slice-04-docs-templates-and-scripts/EXECUTION_BRIEF.md +54 -0
  44. package/specs/quiver-v34-cli-dashboard-status/slices/slice-04-docs-templates-and-scripts/slice.json +88 -0
  45. package/specs/quiver-v34-cli-dashboard-status/slices/slice-05-tests-smokes-release-readiness/CLOSURE_BRIEF.md +26 -0
  46. package/specs/quiver-v34-cli-dashboard-status/slices/slice-05-tests-smokes-release-readiness/EXECUTION_BRIEF.md +57 -0
  47. package/specs/quiver-v34-cli-dashboard-status/slices/slice-05-tests-smokes-release-readiness/slice.json +85 -0
  48. package/specs/quiver-v35-compact-dashboard-version-ux/EVIDENCE_REPORT.md +43 -0
  49. package/specs/quiver-v35-compact-dashboard-version-ux/EXECUTION_PLAN.md +85 -0
  50. package/specs/quiver-v35-compact-dashboard-version-ux/SPEC.md +147 -0
  51. package/specs/quiver-v35-compact-dashboard-version-ux/STATUS.md +33 -0
  52. package/specs/quiver-v35-compact-dashboard-version-ux/pr.md +106 -0
  53. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-00-foundation-and-doc-router/CLOSURE_BRIEF.md +19 -0
  54. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-00-foundation-and-doc-router/EXECUTION_BRIEF.md +38 -0
  55. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-00-foundation-and-doc-router/slice.json +64 -0
  56. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-01-dashboard-cli-contract/CLOSURE_BRIEF.md +19 -0
  57. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-01-dashboard-cli-contract/EXECUTION_BRIEF.md +49 -0
  58. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-01-dashboard-cli-contract/slice.json +80 -0
  59. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-02-dashboard-compact-renderer/CLOSURE_BRIEF.md +19 -0
  60. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-02-dashboard-compact-renderer/EXECUTION_BRIEF.md +48 -0
  61. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-02-dashboard-compact-renderer/slice.json +73 -0
  62. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-03-dashboard-details-sections/CLOSURE_BRIEF.md +19 -0
  63. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-03-dashboard-details-sections/EXECUTION_BRIEF.md +48 -0
  64. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-03-dashboard-details-sections/slice.json +72 -0
  65. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-04-version-command/CLOSURE_BRIEF.md +19 -0
  66. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-04-version-command/EXECUTION_BRIEF.md +49 -0
  67. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-04-version-command/slice.json +82 -0
  68. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-05-docs-help-generated-guidance/CLOSURE_BRIEF.md +19 -0
  69. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-05-docs-help-generated-guidance/EXECUTION_BRIEF.md +50 -0
  70. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-05-docs-help-generated-guidance/slice.json +90 -0
  71. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-06-tests-smokes-release-readiness/CLOSURE_BRIEF.md +21 -0
  72. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-06-tests-smokes-release-readiness/EXECUTION_BRIEF.md +51 -0
  73. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-06-tests-smokes-release-readiness/slice.json +85 -0
  74. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-07-package-and-cross-platform-smoke/CLOSURE_BRIEF.md +20 -0
  75. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-07-package-and-cross-platform-smoke/EXECUTION_BRIEF.md +49 -0
  76. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-07-package-and-cross-platform-smoke/slice.json +79 -0
  77. package/specs/quiver-v36-ai-run-watch-portable/EVIDENCE_REPORT.md +33 -0
  78. package/specs/quiver-v36-ai-run-watch-portable/EXECUTION_PLAN.md +39 -0
  79. package/specs/quiver-v36-ai-run-watch-portable/SPEC.md +166 -0
  80. package/specs/quiver-v36-ai-run-watch-portable/STATUS.md +31 -0
  81. package/specs/quiver-v36-ai-run-watch-portable/pr.md +78 -0
  82. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-00-foundation-and-handoffs/CLOSURE_BRIEF.md +19 -0
  83. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-00-foundation-and-handoffs/EXECUTION_BRIEF.md +43 -0
  84. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-00-foundation-and-handoffs/slice.json +61 -0
  85. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-01-run-schema-path-safety/CLOSURE_BRIEF.md +18 -0
  86. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-01-run-schema-path-safety/EXECUTION_BRIEF.md +43 -0
  87. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-01-run-schema-path-safety/slice.json +65 -0
  88. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-02-event-writer-redacted-logs/CLOSURE_BRIEF.md +18 -0
  89. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-02-event-writer-redacted-logs/EXECUTION_BRIEF.md +43 -0
  90. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-02-event-writer-redacted-logs/slice.json +66 -0
  91. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-03-provider-streaming-integration/CLOSURE_BRIEF.md +18 -0
  92. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-03-provider-streaming-integration/EXECUTION_BRIEF.md +41 -0
  93. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-03-provider-streaming-integration/slice.json +71 -0
  94. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-04-ai-run-watch-command/CLOSURE_BRIEF.md +18 -0
  95. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-04-ai-run-watch-command/EXECUTION_BRIEF.md +44 -0
  96. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-04-ai-run-watch-command/slice.json +73 -0
  97. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-05-main-progress-user-guidance/CLOSURE_BRIEF.md +18 -0
  98. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-05-main-progress-user-guidance/EXECUTION_BRIEF.md +44 -0
  99. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-05-main-progress-user-guidance/slice.json +71 -0
  100. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-06-docs-generated-guidance/CLOSURE_BRIEF.md +19 -0
  101. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-06-docs-generated-guidance/EXECUTION_BRIEF.md +45 -0
  102. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-06-docs-generated-guidance/slice.json +77 -0
  103. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-07-tests-cross-platform-readiness/CLOSURE_BRIEF.md +22 -0
  104. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-07-tests-cross-platform-readiness/EXECUTION_BRIEF.md +46 -0
  105. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-07-tests-cross-platform-readiness/slice.json +87 -0
  106. package/specs/quiver-v37-cli-i18n-foundation/EVIDENCE_REPORT.md +73 -0
  107. package/specs/quiver-v37-cli-i18n-foundation/EXECUTION_PLAN.md +34 -0
  108. package/specs/quiver-v37-cli-i18n-foundation/SPEC.md +91 -0
  109. package/specs/quiver-v37-cli-i18n-foundation/STATUS.md +29 -0
  110. package/specs/quiver-v37-cli-i18n-foundation/pr.md +97 -0
  111. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/CLOSURE_BRIEF.md +10 -0
  112. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/EXECUTION_BRIEF.md +22 -0
  113. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/slice.json +54 -0
  114. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/CLOSURE_BRIEF.md +30 -0
  115. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/EXECUTION_BRIEF.md +27 -0
  116. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/slice.json +66 -0
  117. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/CLOSURE_BRIEF.md +27 -0
  118. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/EXECUTION_BRIEF.md +26 -0
  119. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/slice.json +62 -0
  120. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/CLOSURE_BRIEF.md +32 -0
  121. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/EXECUTION_BRIEF.md +25 -0
  122. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/slice.json +66 -0
  123. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/CLOSURE_BRIEF.md +30 -0
  124. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/EXECUTION_BRIEF.md +24 -0
  125. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/slice.json +65 -0
  126. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/CLOSURE_BRIEF.md +27 -0
  127. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/EXECUTION_BRIEF.md +23 -0
  128. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/slice.json +67 -0
  129. package/specs/quiver-v38-cli-i18n-read-only-commands/EVIDENCE_REPORT.md +69 -0
  130. package/specs/quiver-v38-cli-i18n-read-only-commands/EXECUTION_PLAN.md +25 -0
  131. package/specs/quiver-v38-cli-i18n-read-only-commands/SPEC.md +52 -0
  132. package/specs/quiver-v38-cli-i18n-read-only-commands/STATUS.md +24 -0
  133. package/specs/quiver-v38-cli-i18n-read-only-commands/pr.md +119 -0
  134. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/CLOSURE_BRIEF.md +10 -0
  135. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/EXECUTION_BRIEF.md +21 -0
  136. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/slice.json +53 -0
  137. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/CLOSURE_BRIEF.md +17 -0
  138. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/EXECUTION_BRIEF.md +23 -0
  139. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/slice.json +69 -0
  140. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/CLOSURE_BRIEF.md +13 -0
  141. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/EXECUTION_BRIEF.md +22 -0
  142. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/slice.json +77 -0
  143. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/CLOSURE_BRIEF.md +12 -0
  144. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/EXECUTION_BRIEF.md +22 -0
  145. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/slice.json +66 -0
  146. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/CLOSURE_BRIEF.md +13 -0
  147. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/EXECUTION_BRIEF.md +22 -0
  148. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/slice.json +61 -0
  149. package/specs/quiver-v39-cli-i18n-setup-onboarding/EVIDENCE_REPORT.md +71 -0
  150. package/specs/quiver-v39-cli-i18n-setup-onboarding/EXECUTION_PLAN.md +25 -0
  151. package/specs/quiver-v39-cli-i18n-setup-onboarding/SPEC.md +53 -0
  152. package/specs/quiver-v39-cli-i18n-setup-onboarding/STATUS.md +24 -0
  153. package/specs/quiver-v39-cli-i18n-setup-onboarding/pr.md +104 -0
  154. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/CLOSURE_BRIEF.md +10 -0
  155. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/EXECUTION_BRIEF.md +21 -0
  156. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/slice.json +53 -0
  157. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/CLOSURE_BRIEF.md +12 -0
  158. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/EXECUTION_BRIEF.md +23 -0
  159. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/slice.json +68 -0
  160. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/CLOSURE_BRIEF.md +12 -0
  161. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/EXECUTION_BRIEF.md +23 -0
  162. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/slice.json +62 -0
  163. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/CLOSURE_BRIEF.md +12 -0
  164. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/EXECUTION_BRIEF.md +22 -0
  165. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/slice.json +72 -0
  166. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/CLOSURE_BRIEF.md +15 -0
  167. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/EXECUTION_BRIEF.md +22 -0
  168. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/slice.json +61 -0
  169. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/EVIDENCE_REPORT.md +50 -0
  170. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/EXECUTION_PLAN.md +25 -0
  171. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/SPEC.md +52 -0
  172. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/STATUS.md +24 -0
  173. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/pr.md +94 -0
  174. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/CLOSURE_BRIEF.md +10 -0
  175. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/EXECUTION_BRIEF.md +21 -0
  176. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/slice.json +53 -0
  177. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/CLOSURE_BRIEF.md +12 -0
  178. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/EXECUTION_BRIEF.md +22 -0
  179. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/slice.json +63 -0
  180. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/CLOSURE_BRIEF.md +10 -0
  181. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/EXECUTION_BRIEF.md +22 -0
  182. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/slice.json +63 -0
  183. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/CLOSURE_BRIEF.md +10 -0
  184. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/EXECUTION_BRIEF.md +22 -0
  185. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/slice.json +72 -0
  186. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/CLOSURE_BRIEF.md +15 -0
  187. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/EXECUTION_BRIEF.md +22 -0
  188. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/slice.json +69 -0
  189. package/specs/quiver-v41-cli-i18n-ai-lifecycle/EVIDENCE_REPORT.md +90 -0
  190. package/specs/quiver-v41-cli-i18n-ai-lifecycle/EXECUTION_PLAN.md +33 -0
  191. package/specs/quiver-v41-cli-i18n-ai-lifecycle/SPEC.md +57 -0
  192. package/specs/quiver-v41-cli-i18n-ai-lifecycle/STATUS.md +26 -0
  193. package/specs/quiver-v41-cli-i18n-ai-lifecycle/pr.md +103 -0
  194. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/CLOSURE_BRIEF.md +10 -0
  195. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/EXECUTION_BRIEF.md +21 -0
  196. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/slice.json +53 -0
  197. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/CLOSURE_BRIEF.md +13 -0
  198. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/EXECUTION_BRIEF.md +22 -0
  199. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/slice.json +68 -0
  200. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/CLOSURE_BRIEF.md +12 -0
  201. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/EXECUTION_BRIEF.md +22 -0
  202. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/slice.json +66 -0
  203. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/CLOSURE_BRIEF.md +12 -0
  204. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/EXECUTION_BRIEF.md +23 -0
  205. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/slice.json +68 -0
  206. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/CLOSURE_BRIEF.md +13 -0
  207. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/EXECUTION_BRIEF.md +23 -0
  208. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/slice.json +72 -0
  209. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/CLOSURE_BRIEF.md +15 -0
  210. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/EXECUTION_BRIEF.md +22 -0
  211. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/slice.json +66 -0
  212. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/CLOSURE_BRIEF.md +11 -0
  213. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/EXECUTION_BRIEF.md +22 -0
  214. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/slice.json +70 -0
  215. package/specs/quiver-v42-cli-i18n-generated-docs/EVIDENCE_REPORT.md +64 -0
  216. package/specs/quiver-v42-cli-i18n-generated-docs/EXECUTION_PLAN.md +26 -0
  217. package/specs/quiver-v42-cli-i18n-generated-docs/SPEC.md +52 -0
  218. package/specs/quiver-v42-cli-i18n-generated-docs/STATUS.md +24 -0
  219. package/specs/quiver-v42-cli-i18n-generated-docs/pr.md +125 -0
  220. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/CLOSURE_BRIEF.md +10 -0
  221. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/EXECUTION_BRIEF.md +21 -0
  222. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/slice.json +53 -0
  223. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/CLOSURE_BRIEF.md +10 -0
  224. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/EXECUTION_BRIEF.md +22 -0
  225. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/slice.json +62 -0
  226. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/CLOSURE_BRIEF.md +11 -0
  227. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/EXECUTION_BRIEF.md +22 -0
  228. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/slice.json +72 -0
  229. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/CLOSURE_BRIEF.md +12 -0
  230. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/EXECUTION_BRIEF.md +22 -0
  231. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/slice.json +60 -0
  232. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/CLOSURE_BRIEF.md +16 -0
  233. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/EXECUTION_BRIEF.md +22 -0
  234. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/slice.json +62 -0
  235. package/specs/quiver-v43-cli-i18n-audit-release-readiness/EVIDENCE_REPORT.md +203 -0
  236. package/specs/quiver-v43-cli-i18n-audit-release-readiness/EXECUTION_PLAN.md +27 -0
  237. package/specs/quiver-v43-cli-i18n-audit-release-readiness/SPEC.md +54 -0
  238. package/specs/quiver-v43-cli-i18n-audit-release-readiness/STATUS.md +24 -0
  239. package/specs/quiver-v43-cli-i18n-audit-release-readiness/command-language-mode-matrix.json +545 -0
  240. package/specs/quiver-v43-cli-i18n-audit-release-readiness/cross-platform-smoke-matrix.md +35 -0
  241. package/specs/quiver-v43-cli-i18n-audit-release-readiness/pr.md +155 -0
  242. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/CLOSURE_BRIEF.md +10 -0
  243. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/EXECUTION_BRIEF.md +21 -0
  244. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/slice.json +53 -0
  245. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/CLOSURE_BRIEF.md +13 -0
  246. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/EXECUTION_BRIEF.md +23 -0
  247. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/slice.json +62 -0
  248. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/CLOSURE_BRIEF.md +18 -0
  249. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/EXECUTION_BRIEF.md +22 -0
  250. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/slice.json +59 -0
  251. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/CLOSURE_BRIEF.md +15 -0
  252. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/EXECUTION_BRIEF.md +23 -0
  253. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/slice.json +62 -0
  254. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/CLOSURE_BRIEF.md +17 -0
  255. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/EXECUTION_BRIEF.md +24 -0
  256. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/slice.json +66 -0
  257. package/specs/quiver-v44-provider-live-output-tui-lite/EVIDENCE_REPORT.md +18 -0
  258. package/specs/quiver-v44-provider-live-output-tui-lite/EXECUTION_PLAN.md +31 -0
  259. package/specs/quiver-v44-provider-live-output-tui-lite/SPEC.md +118 -0
  260. package/specs/quiver-v44-provider-live-output-tui-lite/STATUS.md +25 -0
  261. package/specs/quiver-v44-provider-live-output-tui-lite/pr.md +92 -0
  262. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/CLOSURE_BRIEF.md +11 -0
  263. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/EXECUTION_BRIEF.md +23 -0
  264. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/slice.json +64 -0
  265. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/CLOSURE_BRIEF.md +10 -0
  266. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/EXECUTION_BRIEF.md +24 -0
  267. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/slice.json +65 -0
  268. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/CLOSURE_BRIEF.md +10 -0
  269. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/EXECUTION_BRIEF.md +24 -0
  270. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/slice.json +70 -0
  271. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/CLOSURE_BRIEF.md +10 -0
  272. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/EXECUTION_BRIEF.md +25 -0
  273. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/slice.json +70 -0
  274. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/CLOSURE_BRIEF.md +10 -0
  275. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/EXECUTION_BRIEF.md +26 -0
  276. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/slice.json +72 -0
  277. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/CLOSURE_BRIEF.md +15 -0
  278. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/EXECUTION_BRIEF.md +26 -0
  279. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/slice.json +75 -0
  280. package/specs/quiver-v45-ci-actions-node24-readiness/EVIDENCE_REPORT.md +30 -0
  281. package/specs/quiver-v45-ci-actions-node24-readiness/EXECUTION_PLAN.md +22 -0
  282. package/specs/quiver-v45-ci-actions-node24-readiness/SPEC.md +49 -0
  283. package/specs/quiver-v45-ci-actions-node24-readiness/STATUS.md +21 -0
  284. package/specs/quiver-v45-ci-actions-node24-readiness/pr.md +67 -0
  285. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/CLOSURE_BRIEF.md +10 -0
  286. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/EXECUTION_BRIEF.md +21 -0
  287. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/slice.json +48 -0
  288. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/CLOSURE_BRIEF.md +14 -0
  289. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/EXECUTION_BRIEF.md +23 -0
  290. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/slice.json +65 -0
  291. package/src/create-quiver/commands/ai.js +485 -307
  292. package/src/create-quiver/commands/config.js +124 -0
  293. package/src/create-quiver/commands/dashboard.js +31 -0
  294. package/src/create-quiver/commands/demo.js +2 -2
  295. package/src/create-quiver/commands/evidence.js +6 -4
  296. package/src/create-quiver/commands/flow.js +108 -16
  297. package/src/create-quiver/commands/graph.js +1 -0
  298. package/src/create-quiver/commands/next.js +21 -18
  299. package/src/create-quiver/commands/plan.js +23 -6
  300. package/src/create-quiver/commands/spec.js +66 -57
  301. package/src/create-quiver/index.js +606 -136
  302. package/src/create-quiver/lib/ai/execution-plan.js +23 -20
  303. package/src/create-quiver/lib/ai/executor.js +60 -44
  304. package/src/create-quiver/lib/ai/export-state.js +75 -64
  305. package/src/create-quiver/lib/ai/github.js +24 -21
  306. package/src/create-quiver/lib/ai/run-state.js +28 -25
  307. package/src/create-quiver/lib/cli/ux-flags.js +6 -0
  308. package/src/create-quiver/lib/dashboard.js +939 -0
  309. package/src/create-quiver/lib/demo.js +14 -12
  310. package/src/create-quiver/lib/handoff.js +16 -7
  311. package/src/create-quiver/lib/i18n/catalog.js +152 -0
  312. package/src/create-quiver/lib/i18n/language.js +279 -0
  313. package/src/create-quiver/lib/i18n/messages/en.js +853 -0
  314. package/src/create-quiver/lib/i18n/messages/es.js +968 -0
  315. package/src/create-quiver/lib/i18n/read-only-format.js +26 -0
  316. package/src/create-quiver/lib/i18n/templates.js +172 -0
  317. package/src/create-quiver/lib/init-docs.js +24 -4
  318. package/src/create-quiver/lib/init-layout.js +8 -0
  319. package/src/create-quiver/lib/lifecycle.js +53 -46
  320. package/src/create-quiver/lib/project-state-resolver.js +22 -2
  321. package/src/create-quiver/lib/readiness.js +77 -67
  322. package/src/create-quiver/lib/renderers/tree.js +9 -6
  323. package/src/create-quiver/lib/spec-worktrees.js +34 -30
  324. package/src/create-quiver/lib/version.js +159 -0
@@ -35,6 +35,8 @@ const {
35
35
  runSpecsList: runAiSpecsList,
36
36
  runTraceReport: runAiTraceReport,
37
37
  } = require('./commands/ai');
38
+ const { runConfig } = require('./commands/config');
39
+ const { runDashboard } = require('./commands/dashboard');
38
40
  const { runDemo } = require('./commands/demo');
39
41
  const { runPrepare } = require('./commands/prepare');
40
42
  const { runEvidence } = require('./commands/evidence');
@@ -43,6 +45,7 @@ const { runGraph } = require('./commands/graph');
43
45
  const { runNext } = require('./commands/next');
44
46
  const { runPlan } = require('./commands/plan');
45
47
  const { runCreateSpec, runValidateSpec } = require('./commands/spec');
48
+ const { collectVersionReport, formatHumanVersionReport } = require('./lib/version');
46
49
  const { buildInitLayout, formatInitLayoutPlan } = require('./lib/init-layout');
47
50
  const {
48
51
  formatInstallSelfCommand,
@@ -57,6 +60,16 @@ const { getContextPathExclusionReason } = require('./lib/ai/safety');
57
60
  const { selectOption } = require('./lib/cli/selectors');
58
61
  const { createUx } = require('./lib/cli/ux');
59
62
  const { validateUxFlags } = require('./lib/cli/ux-flags');
63
+ const {
64
+ DEFAULT_LANGUAGE,
65
+ extractCliLanguageFlag,
66
+ normalizeLanguage,
67
+ readProjectLanguageConfig,
68
+ resolveLanguage,
69
+ writeProjectLanguageConfig,
70
+ } = require('./lib/i18n/language');
71
+ const { createTranslator, getCatalog, translate } = require('./lib/i18n/catalog');
72
+ const { formatWarningPrefix } = require('./lib/i18n/read-only-format');
60
73
  const { relativePosixPath, resolveTargetRoot } = require('./lib/paths');
61
74
  const {
62
75
  CURRENT_SCAN_RELATIVE_PATH,
@@ -76,13 +89,67 @@ const {
76
89
  const cliPackageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../..', 'package.json'), 'utf8'));
77
90
  const CLI_VERSION = cliPackageJson.version || '0.0.0';
78
91
 
92
+ let currentErrorLanguage = DEFAULT_LANGUAGE;
93
+
94
+ function setCurrentErrorLanguage(language) {
95
+ currentErrorLanguage = language || DEFAULT_LANGUAGE;
96
+ }
97
+
98
+ function localizeParserMessage(message, language = currentErrorLanguage) {
99
+ const raw = String(message || '');
100
+ const missingValue = raw.match(/^missing value for (--[a-z0-9-]+)$/i);
101
+ if (missingValue) {
102
+ return translate(language, 'error.flag.missing_value', { flag: missingValue[1] });
103
+ }
104
+
105
+ const invalidValue = raw.match(/^invalid value for (--[a-z0-9-]+)$/i);
106
+ if (invalidValue) {
107
+ return translate(language, 'error.flag.invalid_value', { flag: invalidValue[1] });
108
+ }
109
+
110
+ const unknownFlag = raw.match(/^unknown flag: (.+)$/);
111
+ if (unknownFlag) {
112
+ return translate(language, 'error.flag.unknown', { flag: unknownFlag[1] });
113
+ }
114
+
115
+ return raw;
116
+ }
117
+
79
118
  function formatError(message) {
80
- return `create-quiver: ${message}`;
119
+ return `create-quiver: ${localizeParserMessage(message)}`;
120
+ }
121
+
122
+ function helpCatalog(language = DEFAULT_LANGUAGE) {
123
+ const catalog = getCatalog(language);
124
+ return catalog.messages['cli.help'] || getCatalog(DEFAULT_LANGUAGE).messages['cli.help'] || {};
125
+ }
126
+
127
+ function helpText(help, section, key, fallback) {
128
+ return help?.[section]?.[key] || fallback;
129
+ }
130
+
131
+ function optionDescription(help, fallback) {
132
+ return helpText(help, 'optionDescriptions', fallback, fallback);
133
+ }
134
+
135
+ function formatLanguageWarningForCli(warning, language = DEFAULT_LANGUAGE) {
136
+ if (!warning || warning.code !== 'UNSUPPORTED_LANGUAGE') {
137
+ return '';
138
+ }
139
+
140
+ return formatError(translate(language, 'warning.language.unsupported_source', {
141
+ fallback: warning.fallbackLanguage,
142
+ language: warning.requestedLanguage,
143
+ source: warning.source,
144
+ supported: warning.supportedLanguages.join(', '),
145
+ }));
81
146
  }
82
147
 
83
148
  const SUPPORTED_COMMAND_MODES = new Set([
84
149
  'init',
150
+ 'version',
85
151
  'flow',
152
+ 'dashboard',
86
153
  'plan',
87
154
  'graph',
88
155
  'next',
@@ -97,6 +164,7 @@ const SUPPORTED_COMMAND_MODES = new Set([
97
164
  'new-handoff',
98
165
  'cleanup-slice',
99
166
  'check-scope',
167
+ 'config',
100
168
  'refresh-active-slices',
101
169
  'spec',
102
170
  'evidence',
@@ -134,13 +202,16 @@ const SUPPORTED_AI_COMMANDS = new Set([
134
202
 
135
203
  const SUPPORTED_SPEC_COMMANDS = new Set(['close', 'create', 'start', 'status', 'validate']);
136
204
  const SUPPORTED_DEMO_COMMANDS = new Set(['create']);
205
+ const SUPPORTED_CONFIG_SECTIONS = new Set(['language']);
206
+ const SUPPORTED_CONFIG_LANGUAGE_COMMANDS = new Set(['show', 'set']);
137
207
 
138
208
  function unsupportedCommandMessage(commandName) {
209
+ const translator = createTranslator(currentErrorLanguage);
139
210
  return [
140
- `unsupported command: ${commandName}`,
141
- 'Run: npx create-quiver --help',
142
- `If you meant to initialize a project, use: npx create-quiver init --name "${commandName}"`,
143
- 'If this command exists in newer docs, update create-quiver and rerun the command.',
211
+ translator.t('error.command.unsupported', { commandName }),
212
+ translator.t('error.command.help'),
213
+ translator.t('error.command.init_hint', { commandName }),
214
+ translator.t('error.command.update_hint'),
144
215
  ].join('\n');
145
216
  }
146
217
 
@@ -152,6 +223,9 @@ const COMMAND_HELP_GROUPS = [
152
223
  ['analyze', 'Scan the project and write docs/PROJECT_MAP.md plus .quiver scan data.'],
153
224
  ['doctor', 'Validate the Quiver layout, generated docs, environment, and next safe steps.'],
154
225
  ['flow', 'Show the read-only guided workflow stage, blockers, and next safe command.'],
226
+ ['dashboard', 'Show compact read-only project, spec, slice, run, approval, and agent status.'],
227
+ ['version', 'Show a Quiver-branded version report; use --json for metadata.'],
228
+ ['config language show|set', 'Inspect or update the effective Quiver language without editing JSON by hand.'],
155
229
  ['prepare', 'Run setup diagnostics for providers, GitHub, SSH, and project readiness.'],
156
230
  ['migrate', 'Upgrade an already initialized Quiver project to the current contract.'],
157
231
  ],
@@ -234,23 +308,29 @@ const COMMAND_HELP_GROUPS = [
234
308
  },
235
309
  ];
236
310
 
237
- function formatCommandHelpGroups() {
238
- const lines = ['Commands:'];
311
+ function formatCommandHelpGroups(language = DEFAULT_LANGUAGE) {
312
+ const help = helpCatalog(language);
313
+ const lines = [helpText(help, 'headings', 'commands', 'Commands:')];
239
314
  for (const group of COMMAND_HELP_GROUPS) {
240
- lines.push('', `${group.title}:`);
315
+ lines.push('', `${helpText(help, 'groupTitles', group.title, group.title)}:`);
241
316
  for (const [command, description] of group.commands) {
242
- lines.push(` ${command.padEnd(24)} ${description}`);
317
+ lines.push(` ${command.padEnd(24)} ${helpText(help, 'commandDescriptions', command, description)}`);
243
318
  }
244
319
  }
245
320
  return lines.join('\n');
246
321
  }
247
322
 
248
- function printUsage() {
249
- console.log(`Usage:
323
+ function printUsage(language = DEFAULT_LANGUAGE) {
324
+ const help = helpCatalog(language);
325
+ console.log(`${helpText(help, 'headings', 'usage', 'Usage:')}
250
326
  npx create-quiver [options]
251
327
  npx create-quiver init [options]
252
328
  npx create-quiver analyze [options]
253
329
  npx create-quiver flow [options]
330
+ npx create-quiver dashboard [options]
331
+ npx create-quiver version [--json]
332
+ npx create-quiver config language show [--json]
333
+ npx create-quiver config language set <en|es> [--global]
254
334
  npx create-quiver plan [options]
255
335
  npx create-quiver ai <task> [options]
256
336
  npx create-quiver ai run create --input <requirements.md>
@@ -289,62 +369,75 @@ function printUsage() {
289
369
  npx create-quiver evidence run [options] -- <command>
290
370
  npx create-quiver demo create spec-viewer [options]
291
371
 
292
- ${formatCommandHelpGroups()}
293
-
294
- Options:
295
- -n, --name <project-name> Project name to generate
296
- -d, --dir <target-dir> Target directory to scaffold into or inspect
297
- --spec <slug> Restrict plan output to one spec
298
- --format <name> Graph or AI export output format (tree, mermaid, dot, json, markdown)
299
- --show-conflicts Show shared file paths in graph output
300
- --level <n> Restrict graph output to one level
301
- --json Emit machine-readable JSON
302
- --include-completed Include completed slices in plan, graph, or next history output
303
- --only-ready Show only slices with no pending dependencies
304
- --all-ready List every ready slice returned by next
305
- --auto-start Prompt for confirmation and run start-slice on next
306
- --local For check-slice, run structural validation without remote/base checks
307
- --strict Treat supported validation warnings as failures
308
- --unicode Prefer Unicode output when supported
309
- --minimal Plan or run the minimal init profile
310
- --full Plan or run the full compatibility init profile
311
- --legacy-scripts Include legacy Bash wrappers in init profile
312
- --include-templates Export packaged templates in init profile
313
- --dry-run Preview init, analyze, migrate, prepare, spec create/start/close, demo, ai agent set, or AI work without executing writes/providers
314
- --print-prompt Print the exact AI prompt and exit without executing provider CLIs
315
- --with-planner Enable planner-assisted behavior on commands that explicitly support it
316
- --interactive Enable prompts on commands that explicitly support interactive choices
317
- --review Open or prepare human review before persistent writes where supported
318
- --methodology <name> Select methodology where supported (currently wdd-sdd)
319
- --no-color Disable ANSI colors in human output
320
- --fix For doctor, apply safe non-destructive repairs
321
- --execute For ai execute-plan, run the planned slices instead of printing commands
322
- --create For ai pr, create the PR after preflight instead of printing the plan only
323
- --commit For ai execute-slice, commit validated slice changes after provider, scope, and tests pass
324
- --allow-dirty For ai execute-slice, allow pre-existing dirty files and ignore them for scope diff
325
- --mode <name> Execution mode for ai execute-plan (auto, manual, delegated)
326
- --provider <name> Provider CLI to preflight for prepare or AI commands
327
- --model <model-id> Technical model id for AI agent profiles or provider-backed AI commands
328
- --version <n> Draft version to approve for AI planner phases
329
- --run <id> AI lifecycle run id
330
- --ssh-host-alias <name> SSH host alias to validate for prepare or AI commands
331
- --identity-file <path> SSH identity file to validate for prepare or AI commands
332
- --remote <name> Git remote name for check-slice or AI PR checks
333
- --base <branch> Base branch for check-slice, check-scope, ai pr, or spec close (default: main)
334
- --output <file> Output file for evidence run
335
- --max-output <n> Maximum stdout/stderr chars per evidence section
336
- --title <text> Override PR title for ai pr create
337
- -y, --yes Skip prompts and use the provided inputs
338
- -V, --version Show the installed create-quiver version
339
- -h, --help Show this help message
340
-
341
- Examples:
372
+ ${formatCommandHelpGroups(language)}
373
+
374
+ ${helpText(help, 'headings', 'options', 'Options:')}
375
+ -n, --name <project-name> ${optionDescription(help, 'Project name to generate')}
376
+ -d, --dir <target-dir> ${optionDescription(help, 'Target directory to scaffold into or inspect')}
377
+ --spec <slug> ${optionDescription(help, 'Restrict plan, graph, next, or dashboard output to one spec')}
378
+ --format <name> ${optionDescription(help, 'Graph or AI export output format (tree, mermaid, dot, json, markdown)')}
379
+ --show-conflicts ${optionDescription(help, 'Show shared file paths in graph output')}
380
+ --level <n> ${optionDescription(help, 'Restrict graph output to one level')}
381
+ --json ${optionDescription(help, 'Emit machine-readable JSON')}
382
+ --lang <en|es> ${optionDescription(help, 'Override CLI human output language')}
383
+ --global ${optionDescription(help, 'For config language set, write the global user config')}
384
+ --include-completed ${optionDescription(help, 'Include completed slices in dashboard, plan, graph, or next history output')}
385
+ --details ${optionDescription(help, 'Show the full human dashboard report')}
386
+ --section <name> ${optionDescription(help, 'Show one human dashboard section')}
387
+ --limit <n> ${optionDescription(help, 'Limit dashboard human lists (1-100)')}
388
+ --only-ready ${optionDescription(help, 'Show only slices with no pending dependencies')}
389
+ --all-ready ${optionDescription(help, 'List every ready slice returned by next')}
390
+ --auto-start ${optionDescription(help, 'Prompt for confirmation and run start-slice on next')}
391
+ --local ${optionDescription(help, 'For check-slice, run structural validation without remote/base checks')}
392
+ --strict ${optionDescription(help, 'Treat supported validation warnings as failures')}
393
+ --unicode ${optionDescription(help, 'Prefer Unicode output when supported')}
394
+ --minimal ${optionDescription(help, 'Plan or run the minimal init profile')}
395
+ --full ${optionDescription(help, 'Plan or run the full compatibility init profile')}
396
+ --legacy-scripts ${optionDescription(help, 'Include legacy Bash wrappers in init profile')}
397
+ --include-templates ${optionDescription(help, 'Export packaged templates in init profile')}
398
+ --dry-run ${optionDescription(help, 'Preview init, analyze, migrate, prepare, spec create/start/close, demo, ai agent set, or AI work without executing writes/providers')}
399
+ --print-prompt ${optionDescription(help, 'Print the exact AI prompt and exit without executing provider CLIs')}
400
+ --with-planner ${optionDescription(help, 'Enable planner-assisted behavior on commands that explicitly support it')}
401
+ --interactive ${optionDescription(help, 'Enable prompts on commands that explicitly support interactive choices')}
402
+ --review ${optionDescription(help, 'Open or prepare human review before persistent writes where supported')}
403
+ --methodology <name> ${optionDescription(help, 'Select methodology where supported (currently wdd-sdd)')}
404
+ --no-color ${optionDescription(help, 'Disable ANSI colors in human output')}
405
+ --fix ${optionDescription(help, 'For doctor, apply safe non-destructive repairs')}
406
+ --execute ${optionDescription(help, 'For ai execute-plan, run the planned slices instead of printing commands')}
407
+ --create ${optionDescription(help, 'For ai pr, create the PR after preflight instead of printing the plan only')}
408
+ --commit ${optionDescription(help, 'For ai execute-slice, commit validated slice changes after provider, scope, and tests pass')}
409
+ --allow-dirty ${optionDescription(help, 'For ai execute-slice, allow pre-existing dirty files and ignore them for scope diff')}
410
+ --mode <name> ${optionDescription(help, 'Execution mode for ai execute-plan (auto, manual, delegated)')}
411
+ --provider <name> ${optionDescription(help, 'Provider CLI to preflight for prepare or AI commands')}
412
+ --model <model-id> ${optionDescription(help, 'Technical model id for AI agent profiles or provider-backed AI commands')}
413
+ --version <n> ${optionDescription(help, 'Draft version to approve for AI planner phases')}
414
+ --run <id> ${optionDescription(help, 'AI lifecycle run id')}
415
+ --ssh-host-alias <name> ${optionDescription(help, 'SSH host alias to validate for prepare or AI commands')}
416
+ --identity-file <path> ${optionDescription(help, 'SSH identity file to validate for prepare or AI commands')}
417
+ --remote <name> ${optionDescription(help, 'Git remote name for check-slice or AI PR checks')}
418
+ --base <branch> ${optionDescription(help, 'Base branch for check-slice, check-scope, ai pr, or spec close (default: main)')}
419
+ --output <file> ${optionDescription(help, 'Output file for evidence run')}
420
+ --max-output <n> ${optionDescription(help, 'Maximum stdout/stderr chars per evidence section')}
421
+ --title <text> ${optionDescription(help, 'Override PR title for ai pr create')}
422
+ -y, --yes ${optionDescription(help, 'Skip prompts and use the provided inputs')}
423
+ -V, --version ${optionDescription(help, 'Show the installed create-quiver version')}
424
+ -h, --help ${optionDescription(help, 'Show this help message')}
425
+
426
+ ${helpText(help, 'headings', 'examples', 'Examples:')}
342
427
  npx create-quiver init --name "My Project"
343
428
  npx create-quiver init --interactive
344
429
  npx create-quiver init --name "My Project" --dry-run
345
430
  npx create-quiver --name "My Project"
346
431
  npx create-quiver --name "My Project" --dir ./my-project
347
432
  cd ./my-project && npx create-quiver flow
433
+ cd ./my-project && npx create-quiver dashboard
434
+ cd ./my-project && npx create-quiver dashboard --section slices --limit 10
435
+ cd ./my-project && npx create-quiver dashboard --json
436
+ cd ./my-project && npx create-quiver version
437
+ cd ./my-project && npx create-quiver version --json
438
+ cd ./my-project && npx create-quiver config language show
439
+ cd ./my-project && npx create-quiver config language set es
440
+ npx create-quiver config language set en --global
348
441
  cd ./my-project && npx create-quiver analyze
349
442
  cd ./my-project && npx create-quiver plan --json
350
443
  cd ./my-project && npx create-quiver ai onboard --dry-run
@@ -412,7 +505,7 @@ Examples:
412
505
  `);
413
506
  }
414
507
 
415
- function parseArgs(argv) {
508
+ function parseArgs(argv, options = {}) {
416
509
  const result = {
417
510
  help: false,
418
511
  force: false,
@@ -432,11 +525,21 @@ function parseArgs(argv) {
432
525
  strict: false,
433
526
  strictOverlap: false,
434
527
  json: false,
528
+ language: options.language || '',
529
+ languageResolution: null,
435
530
  noColor: false,
436
531
  withPlanner: false,
532
+ configGlobal: false,
533
+ configSection: '',
534
+ configCommand: '',
535
+ configValue: '',
437
536
  interactive: false,
438
537
  review: false,
439
538
  includeCompleted: false,
539
+ dashboardDetails: false,
540
+ dashboardSection: '',
541
+ dashboardLimit: null,
542
+ dashboardOptionErrors: [],
440
543
  onlyReady: false,
441
544
  allReady: false,
442
545
  autoStart: false,
@@ -680,6 +783,11 @@ function parseArgs(argv) {
680
783
  continue;
681
784
  }
682
785
 
786
+ if (arg === '--global') {
787
+ result.configGlobal = true;
788
+ continue;
789
+ }
790
+
683
791
  if (arg === '--with-planner') {
684
792
  result.withPlanner = true;
685
793
  continue;
@@ -700,6 +808,33 @@ function parseArgs(argv) {
700
808
  continue;
701
809
  }
702
810
 
811
+ if (arg === '--details') {
812
+ result.dashboardDetails = true;
813
+ continue;
814
+ }
815
+
816
+ if (arg === '--section') {
817
+ const value = args[index + 1];
818
+ if (!value || String(value).startsWith('--')) {
819
+ result.dashboardOptionErrors.push('missing value for --section');
820
+ continue;
821
+ }
822
+ result.dashboardSection = value;
823
+ index += 1;
824
+ continue;
825
+ }
826
+
827
+ if (arg === '--limit') {
828
+ const value = args[index + 1];
829
+ if (!value || String(value).startsWith('--')) {
830
+ result.dashboardOptionErrors.push('missing value for --limit');
831
+ continue;
832
+ }
833
+ result.dashboardLimit = value;
834
+ index += 1;
835
+ continue;
836
+ }
837
+
703
838
  if (arg === '--show-conflicts') {
704
839
  result.showConflicts = true;
705
840
  continue;
@@ -1049,6 +1184,36 @@ function parseArgs(argv) {
1049
1184
  if (positional.length > 0) {
1050
1185
  throw new Error(formatError('flow does not accept positional arguments'));
1051
1186
  }
1187
+ } else if (result.mode === 'version') {
1188
+ if (positional.length > 0) {
1189
+ throw new Error(formatError('version does not accept positional arguments'));
1190
+ }
1191
+ } else if (result.mode === 'dashboard') {
1192
+ if (positional.length > 0) {
1193
+ throw new Error(formatError('dashboard does not accept positional arguments; use --spec <slug>'));
1194
+ }
1195
+ } else if (result.mode === 'config') {
1196
+ if (!result.configSection && positional.length > 0) {
1197
+ result.configSection = positional.shift();
1198
+ }
1199
+ if (!SUPPORTED_CONFIG_SECTIONS.has(result.configSection)) {
1200
+ throw new Error(formatError(`unsupported config section: ${result.configSection || '(missing)'}. Supported sections: language`));
1201
+ }
1202
+ if (!result.configCommand && positional.length > 0) {
1203
+ result.configCommand = positional.shift();
1204
+ }
1205
+ if (!SUPPORTED_CONFIG_LANGUAGE_COMMANDS.has(result.configCommand)) {
1206
+ throw new Error(formatError(`unsupported config language command: ${result.configCommand || '(missing)'}. Supported commands: show, set`));
1207
+ }
1208
+ if (result.configCommand === 'set') {
1209
+ if (positional.length === 0) {
1210
+ throw new Error(formatError('missing language for config language set. Use: npx create-quiver config language set <en|es>'));
1211
+ }
1212
+ result.configValue = positional.shift();
1213
+ }
1214
+ if (result.configCommand === 'show' && positional.length > 0) {
1215
+ throw new Error(formatError('config language show does not accept a language value'));
1216
+ }
1052
1217
  } else if (result.mode === 'ai') {
1053
1218
  if (!result.aiCommand && positional.length > 0) {
1054
1219
  result.aiCommand = positional.shift();
@@ -1142,6 +1307,22 @@ function parseArgs(argv) {
1142
1307
  throw new Error(formatError('too many positional arguments'));
1143
1308
  }
1144
1309
 
1310
+ const requestedDashboardFlags = [];
1311
+ if (result.dashboardDetails) requestedDashboardFlags.push('--details');
1312
+ if (result.dashboardSection || result.dashboardOptionErrors.some((error) => error.includes('--section'))) requestedDashboardFlags.push('--section');
1313
+ if (result.dashboardLimit !== null || result.dashboardOptionErrors.some((error) => error.includes('--limit'))) requestedDashboardFlags.push('--limit');
1314
+ if (result.mode !== 'dashboard' && requestedDashboardFlags.length > 0) {
1315
+ 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>' : ''}`));
1316
+ }
1317
+
1318
+ if (result.mode !== 'config' && result.configGlobal) {
1319
+ throw new Error(formatError('--global is only supported by config language set. Use: npx create-quiver config language set <en|es> --global'));
1320
+ }
1321
+
1322
+ if (result.mode === 'config' && result.configGlobal && result.configCommand !== 'set') {
1323
+ throw new Error(formatError('--global is only supported by config language set. Use: npx create-quiver config language set <en|es> --global'));
1324
+ }
1325
+
1145
1326
  return result;
1146
1327
  }
1147
1328
 
@@ -1286,6 +1467,7 @@ function runInitDocs(repoRoot, projectName, options = {}) {
1286
1467
  migrateMode: false,
1287
1468
  profile: options.profile || 'default',
1288
1469
  templateRoot: templateRoot.path,
1470
+ language: options.language || '',
1289
1471
  });
1290
1472
  }
1291
1473
 
@@ -2141,6 +2323,7 @@ function writeProjectScanArtifacts(projectRoot, scan) {
2141
2323
 
2142
2324
  function runAnalyze(targetDir, options = {}) {
2143
2325
  const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
2326
+ const translator = createTranslator(options.language);
2144
2327
 
2145
2328
  if (!fs.existsSync(projectRoot)) {
2146
2329
  throw new Error(formatError(`target directory does not exist: ${projectRoot}`));
@@ -2149,14 +2332,14 @@ function runAnalyze(targetDir, options = {}) {
2149
2332
  const scan = buildProjectScan(projectRoot);
2150
2333
 
2151
2334
  if (options.dryRun) {
2152
- console.log(`Project analysis dry-run for ${projectRoot}`);
2153
- console.log('Writes: none');
2154
- console.log(`Would write ${CURRENT_SCAN_RELATIVE_PATH}`);
2155
- console.log(`Would write ${PROJECT_MAP_RELATIVE_PATH}`);
2156
- console.log('Would refresh docs/AI_CONTEXT.md');
2157
- console.log(`Detected primary stack: ${scan.stack.primary}`);
2158
- console.log(`Detected frameworks: ${scan.stack.frameworks.length > 0 ? scan.stack.frameworks.join(', ') : 'none detected'}`);
2159
- console.log(`Detected package manager: ${scan.project.package_manager}`);
2335
+ console.log(translator.t('analyze.dry_run_for', { path: projectRoot }));
2336
+ console.log(translator.t('analyze.writes_none'));
2337
+ console.log(translator.t('analyze.would_write', { path: CURRENT_SCAN_RELATIVE_PATH }));
2338
+ console.log(translator.t('analyze.would_write', { path: PROJECT_MAP_RELATIVE_PATH }));
2339
+ console.log(translator.t('analyze.would_refresh', { path: 'docs/AI_CONTEXT.md' }));
2340
+ console.log(translator.t('analyze.detected_primary_stack', { stack: scan.stack.primary }));
2341
+ console.log(translator.t('analyze.detected_frameworks', { frameworks: scan.stack.frameworks.length > 0 ? scan.stack.frameworks.join(', ') : translator.t('common.none_detected') }));
2342
+ console.log(translator.t('analyze.detected_package_manager', { manager: scan.project.package_manager }));
2160
2343
  return {
2161
2344
  artifacts: {
2162
2345
  jsonPath: path.join(projectRoot, CURRENT_SCAN_RELATIVE_PATH),
@@ -2171,12 +2354,12 @@ function runAnalyze(targetDir, options = {}) {
2171
2354
  const aiContextPath = refreshAiContextDoc(projectRoot, scan);
2172
2355
  updateStateForAnalyze(projectRoot, CLI_VERSION);
2173
2356
 
2174
- console.log(`Project analysis completed for ${projectRoot}`);
2175
- console.log(`Wrote ${relativePosixPath(projectRoot, artifacts.jsonPath)}`);
2176
- console.log(`Wrote ${relativePosixPath(projectRoot, artifacts.mdPath)}`);
2177
- console.log(`Wrote ${relativePosixPath(projectRoot, aiContextPath)}`);
2178
- console.log(`Detected primary stack: ${scan.stack.primary}`);
2179
- console.log(`Detected package manager: ${scan.project.package_manager}`);
2357
+ console.log(translator.t('analyze.completed_for', { path: projectRoot }));
2358
+ console.log(translator.t('analyze.wrote', { path: relativePosixPath(projectRoot, artifacts.jsonPath) }));
2359
+ console.log(translator.t('analyze.wrote', { path: relativePosixPath(projectRoot, artifacts.mdPath) }));
2360
+ console.log(translator.t('analyze.wrote', { path: relativePosixPath(projectRoot, aiContextPath) }));
2361
+ console.log(translator.t('analyze.detected_primary_stack', { stack: scan.stack.primary }));
2362
+ console.log(translator.t('analyze.detected_package_manager', { manager: scan.project.package_manager }));
2180
2363
 
2181
2364
  return {
2182
2365
  artifacts,
@@ -2188,6 +2371,7 @@ function runAnalyze(targetDir, options = {}) {
2188
2371
 
2189
2372
  function runMigrate(targetDir, options = {}) {
2190
2373
  const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
2374
+ const translator = createTranslator(options.language);
2191
2375
 
2192
2376
  if (!fs.existsSync(projectRoot)) {
2193
2377
  throw new Error(formatError(`target directory does not exist: ${projectRoot}`));
@@ -2210,17 +2394,17 @@ function runMigrate(targetDir, options = {}) {
2210
2394
  projectName,
2211
2395
  skipInstall: options.skipInstall === true,
2212
2396
  });
2213
- console.log('Quiver migration dry-run');
2214
- console.log(`- Project: ${projectName}`);
2215
- console.log(`- Target: ${projectRoot}`);
2216
- console.log('- Writes: none');
2217
- console.log(`- Planned create: ${migrationPlan.summary.create}`);
2218
- console.log(`- Planned update: ${migrationPlan.summary.update}`);
2219
- console.log(`- Planned preserve: ${migrationPlan.summary.preserve}`);
2397
+ console.log(translator.t('migrate.dry_run_title'));
2398
+ console.log(`- ${translator.t('migrate.project', { project: projectName })}`);
2399
+ console.log(`- ${translator.t('migrate.target', { path: projectRoot })}`);
2400
+ console.log(`- ${translator.t('migrate.writes_none')}`);
2401
+ console.log(`- ${translator.t('migrate.planned_create', { count: migrationPlan.summary.create })}`);
2402
+ console.log(`- ${translator.t('migrate.planned_update', { count: migrationPlan.summary.update })}`);
2403
+ console.log(`- ${translator.t('migrate.planned_preserve', { count: migrationPlan.summary.preserve })}`);
2220
2404
  if (legacyLayout.hasLegacyLayout) {
2221
- console.log(`- Legacy layout detected and preserved: ${legacyLayout.legacyPaths.join(', ')}`);
2405
+ console.log(`- ${translator.t('migrate.legacy_preserved', { paths: legacyLayout.legacyPaths.join(', ') })}`);
2222
2406
  }
2223
- console.log('- Next command: npx create-quiver migrate --skip-install');
2407
+ console.log(`- ${translator.t('migrate.next_command', { command: 'npx create-quiver migrate --skip-install' })}`);
2224
2408
  console.log('');
2225
2409
  console.log(formatInitLayoutPlan(migrationPlan));
2226
2410
  return;
@@ -2251,10 +2435,10 @@ function runMigrate(targetDir, options = {}) {
2251
2435
  }
2252
2436
  }
2253
2437
 
2254
- console.log(`Quiver migration completed for ${projectRoot}`);
2255
- console.log('Missing workflow files were restored without overwriting existing project files.');
2438
+ console.log(translator.t('migrate.completed_for', { path: projectRoot }));
2439
+ console.log(translator.t('migrate.restored_missing'));
2256
2440
  if (legacyLayout.hasLegacyLayout) {
2257
- console.log(`Legacy layout detected and preserved: ${legacyLayout.legacyPaths.join(', ')}`);
2441
+ console.log(translator.t('migrate.legacy_preserved', { paths: legacyLayout.legacyPaths.join(', ') }));
2258
2442
  }
2259
2443
  } finally {
2260
2444
  fs.rmSync(tempRoot, { recursive: true, force: true });
@@ -2495,6 +2679,7 @@ function buildDoctorCommandReport(projectRoot) {
2495
2679
  }
2496
2680
 
2497
2681
  function formatDoctorHumanReport(report, options = {}) {
2682
+ const translator = createTranslator(options.language);
2498
2683
  const lines = [];
2499
2684
  const ux = createUx({
2500
2685
  ...options,
@@ -2511,19 +2696,39 @@ function formatDoctorHumanReport(report, options = {}) {
2511
2696
  if (status === 'error') return 'error';
2512
2697
  return 'warning';
2513
2698
  };
2699
+ const localizeDoctorText = (message) => {
2700
+ const text = String(message || '');
2701
+ let match = text.match(/^Quiver doctor passed for (.+)$/);
2702
+ if (match) return translator.t('doctor.check.passed_for', { path: match[1] });
2703
+ match = text.match(/^Layout: (.+)$/);
2704
+ if (match) return translator.t('doctor.check.layout', { layout: match[1] });
2705
+ if (text === 'Specs: none yet') return translator.t('doctor.check.specs_none');
2706
+ match = text.match(/^Specs: (.+)$/);
2707
+ if (match) return translator.t('doctor.check.specs_found', { specs: match[1] });
2708
+ if (text === 'Required files found') return translator.t('doctor.check.required_files_found');
2709
+ if (text === 'Workflow scripts available') return translator.t('doctor.check.workflow_scripts_available');
2710
+ if (text === 'Quiver state metadata found') return translator.t('doctor.check.state_found');
2711
+ if (text === 'Project analysis artifacts found') return translator.t('doctor.check.project_analysis_found');
2712
+ if (text === 'No specs yet. That is valid after the AI-first init flow.') return translator.t('doctor.fix.no_specs_yet');
2713
+ 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');
2714
+ if (text === 'Analyze the project first: npx create-quiver analyze') return translator.t('doctor.fix.analyze_first');
2715
+ if (text === 'Check the next ready slice: npx create-quiver next') return translator.t('doctor.fix.check_next');
2716
+ 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');
2717
+ return formatWarningPrefix(text, translator);
2718
+ };
2514
2719
 
2515
- ux.section('Quiver Doctor');
2720
+ ux.section(translator.t('doctor.title'));
2516
2721
  ux.line('');
2517
- ux.line('Checks');
2722
+ ux.line(translator.t('doctor.checks'));
2518
2723
  for (const check of report.checks) {
2519
- const line = ` ${symbolForStatus(check.status)} ${check.message}`;
2724
+ const line = ` ${symbolForStatus(check.status)} ${localizeDoctorText(check.message)}`;
2520
2725
  ux.line(ux.mode.decoration ? ux.theme.status(colorForStatus(check.status), line) : line);
2521
2726
  }
2522
2727
 
2523
2728
  ux.line('');
2524
- ux.line('Suggested fixes');
2729
+ ux.line(translator.t('doctor.suggested_fixes'));
2525
2730
  for (const fix of report.suggested_fixes) {
2526
- const line = ` ${ux.theme.symbols.bullet} ${fix}`;
2731
+ const line = ` ${ux.theme.symbols.bullet} ${localizeDoctorText(fix)}`;
2527
2732
  ux.line(ux.mode.decoration ? ux.theme.status('command', line) : line);
2528
2733
  }
2529
2734
 
@@ -2577,6 +2782,74 @@ const INIT_PROFILE_OPTIONS = Object.freeze([
2577
2782
  },
2578
2783
  ]);
2579
2784
 
2785
+ function initModeOptions(translator) {
2786
+ return [
2787
+ {
2788
+ label: translator.t('init.mode.existing.label'),
2789
+ value: 'existing',
2790
+ hint: translator.t('init.mode.existing.hint'),
2791
+ default: true,
2792
+ },
2793
+ {
2794
+ label: translator.t('init.mode.new.label'),
2795
+ value: 'new',
2796
+ hint: translator.t('init.mode.new.hint'),
2797
+ },
2798
+ {
2799
+ label: translator.t('init.mode.validate.label'),
2800
+ value: 'validate',
2801
+ hint: translator.t('init.mode.validate.hint'),
2802
+ },
2803
+ ];
2804
+ }
2805
+
2806
+ function methodologyOptions(translator) {
2807
+ return [
2808
+ {
2809
+ label: translator.t('init.methodology.wdd_sdd.label'),
2810
+ value: 'wdd-sdd',
2811
+ hint: translator.t('init.methodology.wdd_sdd.hint'),
2812
+ default: true,
2813
+ },
2814
+ ];
2815
+ }
2816
+
2817
+ function initProfileOptions(translator) {
2818
+ return [
2819
+ {
2820
+ label: 'Default',
2821
+ value: 'default',
2822
+ hint: translator.t('init.profile.default.hint'),
2823
+ default: true,
2824
+ },
2825
+ {
2826
+ label: 'Minimal',
2827
+ value: 'minimal',
2828
+ hint: translator.t('init.profile.minimal.hint'),
2829
+ },
2830
+ {
2831
+ label: 'Full compatibility',
2832
+ value: 'full',
2833
+ hint: translator.t('init.profile.full.hint'),
2834
+ },
2835
+ ];
2836
+ }
2837
+
2838
+ function initLanguageOptions() {
2839
+ return [
2840
+ {
2841
+ label: 'English',
2842
+ value: 'en',
2843
+ hint: 'en',
2844
+ },
2845
+ {
2846
+ label: 'Español',
2847
+ value: 'es',
2848
+ hint: 'es',
2849
+ },
2850
+ ];
2851
+ }
2852
+
2580
2853
  function hasDirectoryContent(dirPath) {
2581
2854
  return fs.existsSync(dirPath)
2582
2855
  && fs.statSync(dirPath).isDirectory()
@@ -2594,8 +2867,16 @@ function assertSupportedMethodology(value) {
2594
2867
  return normalized;
2595
2868
  }
2596
2869
 
2870
+ function resolveExistingProjectLanguage(targetDir) {
2871
+ const config = readProjectLanguageConfig(targetDir);
2872
+ return normalizeLanguage(config.language);
2873
+ }
2874
+
2597
2875
  async function resolveInteractiveInitOptions(args, targetDir, projectName, options = {}) {
2598
2876
  const explicitMethodology = assertSupportedMethodology(args.methodology);
2877
+ const language = normalizeLanguage(options.language || args.language) || DEFAULT_LANGUAGE;
2878
+ const translator = createTranslator(language);
2879
+ const existingProjectLanguage = resolveExistingProjectLanguage(targetDir);
2599
2880
 
2600
2881
  if (args.interactive !== true) {
2601
2882
  return {
@@ -2606,6 +2887,7 @@ async function resolveInteractiveInitOptions(args, targetDir, projectName, optio
2606
2887
  methodology: explicitMethodology,
2607
2888
  minimal: args.initMinimal,
2608
2889
  projectName,
2890
+ language: '',
2609
2891
  };
2610
2892
  }
2611
2893
 
@@ -2639,58 +2921,66 @@ async function resolveInteractiveInitOptions(args, targetDir, projectName, optio
2639
2921
  stdoutIsTTY: options.stdoutIsTTY,
2640
2922
  };
2641
2923
 
2642
- ux.heading('Bienvenido a Quiver');
2643
- const selectedMode = await selectOption('¿Qué querés configurar?', INIT_MODE_OPTIONS, {
2924
+ ux.heading(translator.t('init.heading'));
2925
+ const selectedMode = await selectOption(translator.t('init.prompt.mode'), initModeOptions(translator), {
2644
2926
  ...selectorOptions,
2645
2927
  defaultValue: hasDirectoryContent(targetDir) ? 'existing' : 'new',
2646
2928
  flag: 'init|doctor',
2647
2929
  name: 'init mode',
2648
2930
  });
2649
- const selectedMethodology = await selectOption('¿Qué metodología vas a usar?', METHODOLOGY_OPTIONS, {
2931
+ const selectedMethodology = await selectOption(translator.t('init.prompt.methodology'), methodologyOptions(translator), {
2650
2932
  ...selectorOptions,
2651
2933
  defaultValue: explicitMethodology,
2652
2934
  flag: '--methodology',
2653
2935
  name: 'methodology',
2654
2936
  value: args.methodology || '',
2655
2937
  });
2938
+ const selectedLanguage = await selectOption(translator.t('init.prompt.language'), initLanguageOptions(), {
2939
+ ...selectorOptions,
2940
+ defaultValue: existingProjectLanguage || language,
2941
+ flag: '--lang|config language set',
2942
+ name: 'project language',
2943
+ });
2656
2944
 
2657
2945
  assertSupportedMethodology(selectedMethodology.value);
2658
2946
 
2659
2947
  if (selectedMode.value === 'validate') {
2660
2948
  ux.summary([
2661
- { label: 'Modo', value: 'Solo validar estructura' },
2662
- { label: 'Metodologia', value: selectedMethodology.label },
2663
- { label: 'Comando equivalente', value: 'npx create-quiver doctor' },
2664
- ], { title: 'Configuracion elegida' });
2949
+ { label: translator.t('init.summary.mode'), value: selectedMode.label },
2950
+ { label: translator.t('init.summary.methodology'), value: selectedMethodology.label },
2951
+ { label: translator.t('init.summary.language'), value: selectedLanguage.value },
2952
+ { label: translator.t('init.summary.equivalent_command'), value: 'npx create-quiver doctor' },
2953
+ ], { title: translator.t('init.summary.title') });
2665
2954
  if (!args.force && !args.dryRun) {
2666
- const confirmed = await ux.promptConfirm('Ejecutar Doctor ahora?', { initialValue: true });
2955
+ const confirmed = await ux.promptConfirm(translator.t('init.confirm.doctor'), { initialValue: true });
2667
2956
  if (!confirmed) {
2668
2957
  throw new Error(formatError('init interactive validation declined. No files were written.'));
2669
2958
  }
2670
2959
  }
2671
2960
  return {
2672
2961
  action: 'doctor',
2962
+ language: selectedLanguage.value,
2673
2963
  methodology: selectedMethodology.value,
2674
2964
  projectName,
2675
2965
  };
2676
2966
  }
2677
2967
 
2678
2968
  const defaultProfile = args.initFull ? 'full' : args.initMinimal ? 'minimal' : 'default';
2679
- const selectedProfile = await selectOption('¿Qué contrato inicial querés crear?', INIT_PROFILE_OPTIONS, {
2969
+ const selectedProfile = await selectOption(translator.t('init.prompt.profile'), initProfileOptions(translator), {
2680
2970
  ...selectorOptions,
2681
2971
  defaultValue: defaultProfile,
2682
2972
  flag: '--minimal|--full',
2683
2973
  name: 'init profile',
2684
2974
  });
2685
- const agentGuidance = await selectOption('¿Querés ver el próximo paso para perfiles de agentes?', [
2975
+ const agentGuidance = await selectOption(translator.t('init.prompt.agent_guidance'), [
2686
2976
  {
2687
- label: 'Mostrar comandos sugeridos',
2977
+ label: translator.t('init.agent_guidance.show.label'),
2688
2978
  value: 'show',
2689
- hint: 'No guarda credenciales ni ejecuta proveedores',
2979
+ hint: translator.t('init.agent_guidance.show.hint'),
2690
2980
  default: true,
2691
2981
  },
2692
2982
  {
2693
- label: 'Omitir por ahora',
2983
+ label: translator.t('init.agent_guidance.skip.label'),
2694
2984
  value: 'skip',
2695
2985
  },
2696
2986
  ], {
@@ -2703,28 +2993,30 @@ async function resolveInteractiveInitOptions(args, targetDir, projectName, optio
2703
2993
  full: selectedProfile.value === 'full',
2704
2994
  includeTemplates: args.initIncludeTemplates || selectedProfile.value === 'full',
2705
2995
  legacyScripts: args.initLegacyScripts,
2996
+ language: selectedLanguage.value,
2706
2997
  methodology: selectedMethodology.value,
2707
2998
  minimal: selectedProfile.value === 'minimal',
2708
2999
  projectName,
2709
3000
  };
2710
3001
 
2711
3002
  ux.summary([
2712
- { label: 'Proyecto', value: projectName },
2713
- { label: 'Modo', value: selectedMode.label },
2714
- { label: 'Metodologia', value: selectedMethodology.label },
2715
- { label: 'Perfil', value: selectedProfile.label },
2716
- { label: 'Perfiles de agentes', value: agentGuidance.value === 'show' ? 'mostrar proximo paso' : 'omitir' },
2717
- ], { title: 'Configuracion elegida' });
3003
+ { label: translator.t('init.summary.project'), value: projectName },
3004
+ { label: translator.t('init.summary.mode'), value: selectedMode.label },
3005
+ { label: translator.t('init.summary.methodology'), value: selectedMethodology.label },
3006
+ { label: translator.t('init.summary.language'), value: selectedLanguage.value },
3007
+ { label: translator.t('init.summary.profile'), value: selectedProfile.label },
3008
+ { 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') },
3009
+ ], { title: translator.t('init.summary.title') });
2718
3010
 
2719
3011
  if (agentGuidance.value === 'show') {
2720
3012
  ux.nextSteps([
2721
3013
  'npx create-quiver ai agent set planner --provider codex --model gpt-5.5 --dry-run',
2722
3014
  'npx create-quiver ai agent set executor --provider claude --model claude-sonnet-4-6 --dry-run',
2723
- ], { title: 'Despues de inicializar' });
3015
+ ], { title: translator.t('init.next_steps.after_init') });
2724
3016
  }
2725
3017
 
2726
3018
  if (!args.force && !args.dryRun) {
2727
- const confirmed = await ux.promptConfirm(`Inicializar Quiver en ${targetDir}?`, { initialValue: true });
3019
+ const confirmed = await ux.promptConfirm(translator.t('init.confirm.initialize', { path: targetDir }), { initialValue: true });
2728
3020
  if (!confirmed) {
2729
3021
  throw new Error(formatError('init interactive approval declined. No files were written.'));
2730
3022
  }
@@ -2736,6 +3028,46 @@ async function resolveInteractiveInitOptions(args, targetDir, projectName, optio
2736
3028
  };
2737
3029
  }
2738
3030
 
3031
+ function persistInitLanguage(targetDir, initOptions = {}) {
3032
+ if (!initOptions.language) {
3033
+ return null;
3034
+ }
3035
+ writeProjectLanguageConfig(targetDir, initOptions.language);
3036
+ return {
3037
+ language: initOptions.language,
3038
+ path: path.join(targetDir, '.quiver', 'config.json'),
3039
+ };
3040
+ }
3041
+
3042
+ function resolveInitGeneratedLanguage(args, targetDir, initOptions = {}) {
3043
+ if (initOptions.language) {
3044
+ return {
3045
+ configLanguage: initOptions.language,
3046
+ docsLanguage: initOptions.language,
3047
+ };
3048
+ }
3049
+
3050
+ if (args.languageResolution?.source === '--lang') {
3051
+ return {
3052
+ configLanguage: args.language,
3053
+ docsLanguage: args.language,
3054
+ };
3055
+ }
3056
+
3057
+ const existingProjectLanguage = resolveExistingProjectLanguage(targetDir);
3058
+ if (existingProjectLanguage) {
3059
+ return {
3060
+ configLanguage: existingProjectLanguage,
3061
+ docsLanguage: existingProjectLanguage,
3062
+ };
3063
+ }
3064
+
3065
+ return {
3066
+ configLanguage: '',
3067
+ docsLanguage: args.language || DEFAULT_LANGUAGE,
3068
+ };
3069
+ }
3070
+
2739
3071
  function runDoctor(targetDir, options = {}) {
2740
3072
  const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
2741
3073
 
@@ -2774,6 +3106,7 @@ function runDoctor(targetDir, options = {}) {
2774
3106
  console.log(JSON.stringify(commandReport, null, 2));
2775
3107
  } else {
2776
3108
  process.stdout.write(formatDoctorHumanReport(commandReport, {
3109
+ language: options.language,
2777
3110
  noColor: options.noColor,
2778
3111
  unicode: options.unicode,
2779
3112
  }));
@@ -2784,38 +3117,75 @@ function runDoctor(targetDir, options = {}) {
2784
3117
  }
2785
3118
  }
2786
3119
 
2787
- function printInitNextSteps(targetDir, projectName) {
3120
+ function printInitNextSteps(targetDir, projectName, options = {}) {
3121
+ const translator = createTranslator(options.language);
2788
3122
  console.log('');
2789
- console.log('Next steps:');
2790
- console.log(`- Review AGENTS.md, then ${path.join(targetDir, 'docs', 'AI_ONBOARDING_PROMPT.md')}`);
2791
- console.log(`- Review ${path.join(targetDir, 'docs', 'WORKFLOW.md')}`);
2792
- console.log('- Analyze the project with npx create-quiver analyze');
2793
- console.log('- Create real specs and slices after acceptance criteria are approved and the technical plan is reviewed and approved.');
3123
+ console.log(translator.t('init.next_steps.title'));
3124
+ console.log(`- ${translator.t('init.next_steps.review_agents', { path: path.join(targetDir, 'docs', 'AI_ONBOARDING_PROMPT.md') })}`);
3125
+ console.log(`- ${translator.t('init.next_steps.review_workflow', { path: path.join(targetDir, 'docs', 'WORKFLOW.md') })}`);
3126
+ console.log(`- ${translator.t('init.next_steps.analyze')}`);
3127
+ console.log(`- ${translator.t('init.next_steps.create_specs')}`);
2794
3128
  }
2795
3129
 
2796
3130
  async function run(argv) {
2797
- if (argv.length === 1 && argv[0] === 'help') {
2798
- printUsage();
3131
+ let languageArgs;
3132
+ try {
3133
+ languageArgs = extractCliLanguageFlag(argv);
3134
+ } catch (error) {
3135
+ const languageResolution = resolveLanguage({
3136
+ env: process.env,
3137
+ projectRoot: process.cwd(),
3138
+ });
3139
+ setCurrentErrorLanguage(languageResolution.language);
3140
+ throw new Error(formatError(error.message));
3141
+ }
3142
+
3143
+ const normalizedArgv = languageArgs.argv;
3144
+ const languageResolution = resolveLanguage({
3145
+ cliLanguage: languageArgs.language,
3146
+ env: process.env,
3147
+ projectRoot: process.cwd(),
3148
+ });
3149
+ setCurrentErrorLanguage(languageResolution.language);
3150
+
3151
+ if (normalizedArgv.length === 1 && normalizedArgv[0] === 'help') {
3152
+ printUsage(languageResolution.language);
2799
3153
  return;
2800
3154
  }
2801
3155
 
2802
- if (argv.length === 1 && (argv[0] === '-V' || argv[0] === '--version')) {
3156
+ if (normalizedArgv.length === 1 && (normalizedArgv[0] === '-V' || normalizedArgv[0] === '--version')) {
2803
3157
  console.log(CLI_VERSION);
2804
3158
  return;
2805
3159
  }
2806
3160
 
2807
- const args = parseArgs(argv);
3161
+ const args = parseArgs(normalizedArgv, {
3162
+ language: languageArgs.language,
3163
+ });
3164
+ args.languageResolution = languageResolution;
3165
+ args.language = args.languageResolution.language;
2808
3166
 
2809
3167
  if (args.help) {
2810
- printUsage();
3168
+ if (!args.json) {
3169
+ for (const warning of args.languageResolution.warnings || []) {
3170
+ process.stderr.write(`${formatLanguageWarningForCli(warning, args.language)}\n`);
3171
+ }
3172
+ }
3173
+ printUsage(args.language);
2811
3174
  return;
2812
3175
  }
2813
3176
 
2814
3177
  validateUxFlags(args);
2815
3178
 
3179
+ if (!args.json) {
3180
+ for (const warning of args.languageResolution.warnings || []) {
3181
+ process.stderr.write(`${formatLanguageWarningForCli(warning, args.language)}\n`);
3182
+ }
3183
+ }
3184
+
2816
3185
  if (args.mode === 'analyze') {
2817
3186
  runAnalyze(args.targetDir, {
2818
3187
  dryRun: args.dryRun,
3188
+ language: args.language,
2819
3189
  });
2820
3190
  return;
2821
3191
  }
@@ -2823,6 +3193,52 @@ async function run(argv) {
2823
3193
  if (args.mode === 'flow') {
2824
3194
  await runFlow(process.cwd(), {
2825
3195
  json: args.json,
3196
+ language: args.language,
3197
+ });
3198
+ return;
3199
+ }
3200
+
3201
+ if (args.mode === 'dashboard') {
3202
+ runDashboard(process.cwd(), {
3203
+ details: args.dashboardDetails,
3204
+ includeCompleted: args.includeCompleted,
3205
+ json: args.json,
3206
+ language: args.language,
3207
+ limit: args.dashboardLimit,
3208
+ noColor: args.noColor,
3209
+ optionErrors: args.dashboardOptionErrors,
3210
+ section: args.dashboardSection,
3211
+ specSlug: args.specSlug,
3212
+ });
3213
+ return;
3214
+ }
3215
+
3216
+ if (args.mode === 'version') {
3217
+ const report = collectVersionReport(process.cwd(), {
3218
+ cliVersion: CLI_VERSION,
3219
+ env: process.env,
3220
+ });
3221
+ if (args.json) {
3222
+ process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
3223
+ } else {
3224
+ process.stdout.write(formatHumanVersionReport(report, {
3225
+ env: process.env,
3226
+ language: args.language,
3227
+ noColor: args.noColor,
3228
+ stdoutIsTTY: Boolean(process.stdout.isTTY),
3229
+ }));
3230
+ }
3231
+ return;
3232
+ }
3233
+
3234
+ if (args.mode === 'config') {
3235
+ runConfig(process.cwd(), {
3236
+ command: args.configCommand,
3237
+ global: args.configGlobal,
3238
+ json: args.json,
3239
+ languageResolution: args.languageResolution,
3240
+ section: args.configSection,
3241
+ value: args.configValue,
2826
3242
  });
2827
3243
  return;
2828
3244
  }
@@ -2831,6 +3247,7 @@ async function run(argv) {
2831
3247
  runPlan(process.cwd(), {
2832
3248
  includeCompleted: args.includeCompleted,
2833
3249
  json: args.json,
3250
+ language: args.language,
2834
3251
  onlyReady: args.onlyReady,
2835
3252
  specSlug: args.specSlug,
2836
3253
  unicode: args.unicode,
@@ -2857,6 +3274,7 @@ async function run(argv) {
2857
3274
  runAiLifecycleRun(process.cwd(), {
2858
3275
  command: args.aiRunCommand,
2859
3276
  input: args.aiInput || undefined,
3277
+ language: args.language,
2860
3278
  runId: args.aiRunId || undefined,
2861
3279
  specSlug: args.specSlug || undefined,
2862
3280
  });
@@ -2867,12 +3285,14 @@ async function run(argv) {
2867
3285
  runAiActiveSlice(process.cwd(), {
2868
3286
  command: args.aiSecondaryCommand || 'status',
2869
3287
  dryRun: args.dryRun,
3288
+ language: args.language,
2870
3289
  });
2871
3290
  return;
2872
3291
  }
2873
3292
 
2874
3293
  if (args.aiCommand === 'status') {
2875
3294
  runAiLifecycleStatus(process.cwd(), {
3295
+ language: args.language,
2876
3296
  runId: args.aiRunId || undefined,
2877
3297
  });
2878
3298
  return;
@@ -2880,6 +3300,7 @@ async function run(argv) {
2880
3300
 
2881
3301
  if (args.aiCommand === 'resume') {
2882
3302
  runAiLifecycleResume(process.cwd(), {
3303
+ language: args.language,
2883
3304
  runId: args.aiRunId || undefined,
2884
3305
  });
2885
3306
  return;
@@ -2888,6 +3309,7 @@ async function run(argv) {
2888
3309
  if (args.aiCommand === 'inspect') {
2889
3310
  runAiInspect(process.cwd(), {
2890
3311
  includeCompleted: args.includeCompleted,
3312
+ language: args.language,
2891
3313
  });
2892
3314
  return;
2893
3315
  }
@@ -2896,6 +3318,7 @@ async function run(argv) {
2896
3318
  runAiExport(process.cwd(), {
2897
3319
  format: args.formatExplicit ? args.format : 'json',
2898
3320
  includeCompleted: args.includeCompleted,
3321
+ language: args.language,
2899
3322
  });
2900
3323
  return;
2901
3324
  }
@@ -2904,6 +3327,7 @@ async function run(argv) {
2904
3327
  runAiSpecsList(process.cwd(), {
2905
3328
  includeCompleted: args.includeCompleted,
2906
3329
  json: args.json,
3330
+ language: args.language,
2907
3331
  });
2908
3332
  return;
2909
3333
  }
@@ -2912,6 +3336,7 @@ async function run(argv) {
2912
3336
  runAiSlicesList(process.cwd(), {
2913
3337
  includeCompleted: args.includeCompleted,
2914
3338
  json: args.json,
3339
+ language: args.language,
2915
3340
  });
2916
3341
  return;
2917
3342
  }
@@ -2919,6 +3344,7 @@ async function run(argv) {
2919
3344
  if (args.aiCommand === 'trace') {
2920
3345
  runAiTraceReport(process.cwd(), {
2921
3346
  includeCompleted: args.includeCompleted,
3347
+ language: args.language,
2922
3348
  });
2923
3349
  return;
2924
3350
  }
@@ -2926,6 +3352,7 @@ async function run(argv) {
2926
3352
  if (args.aiCommand === 'models') {
2927
3353
  runAiModelsList({
2928
3354
  json: args.json,
3355
+ language: args.language,
2929
3356
  provider: args.aiProviderExplicit ? args.aiProvider : undefined,
2930
3357
  });
2931
3358
  return;
@@ -2940,6 +3367,7 @@ async function run(argv) {
2940
3367
  id: args.aiProfileId || undefined,
2941
3368
  interactive: args.interactive,
2942
3369
  json: args.json,
3370
+ language: args.language,
2943
3371
  label: args.aiLabel || undefined,
2944
3372
  model: args.aiModel || undefined,
2945
3373
  provider: args.aiProviderExplicit ? args.aiProvider : undefined,
@@ -2958,6 +3386,7 @@ async function run(argv) {
2958
3386
  provider: args.aiProvider,
2959
3387
  providerExplicit: args.aiProviderExplicit,
2960
3388
  model: args.aiModel || undefined,
3389
+ language: args.language,
2961
3390
  plannerProfile: args.aiPlannerProfile || undefined,
2962
3391
  role: args.aiRole,
2963
3392
  timeout: args.aiTimeout,
@@ -2970,6 +3399,7 @@ async function run(argv) {
2970
3399
  context: args.aiContext || undefined,
2971
3400
  dryRun: args.dryRun,
2972
3401
  interactive: args.interactive,
3402
+ language: args.language,
2973
3403
  printPrompt: args.aiPrintPrompt,
2974
3404
  provider: args.aiProvider,
2975
3405
  providerExplicit: args.aiProviderExplicit,
@@ -2990,6 +3420,7 @@ async function run(argv) {
2990
3420
  dryRun: args.dryRun,
2991
3421
  input: args.aiInput || undefined,
2992
3422
  phase: args.aiPhase,
3423
+ language: args.language,
2993
3424
  printPrompt: args.aiPrintPrompt,
2994
3425
  provider: args.aiProvider,
2995
3426
  providerExplicit: args.aiProviderExplicit,
@@ -3011,6 +3442,7 @@ async function run(argv) {
3011
3442
  context: args.aiContext || undefined,
3012
3443
  dryRun: args.dryRun,
3013
3444
  input: args.aiInput || undefined,
3445
+ language: args.language,
3014
3446
  printPrompt: args.aiPrintPrompt,
3015
3447
  provider: args.aiProvider,
3016
3448
  providerExplicit: args.aiProviderExplicit,
@@ -3026,6 +3458,7 @@ async function run(argv) {
3026
3458
  context: args.aiContext || undefined,
3027
3459
  dryRun: args.dryRun,
3028
3460
  input: args.aiInput || undefined,
3461
+ language: args.language,
3029
3462
  printPrompt: args.aiPrintPrompt,
3030
3463
  provider: args.aiProvider,
3031
3464
  providerExplicit: args.aiProviderExplicit,
@@ -3044,6 +3477,7 @@ async function run(argv) {
3044
3477
  dryRun: args.dryRun,
3045
3478
  input: args.aiInput || undefined,
3046
3479
  phase: args.aiPhase,
3480
+ language: args.language,
3047
3481
  printPrompt: args.aiPrintPrompt,
3048
3482
  provider: args.aiProvider,
3049
3483
  providerExplicit: args.aiProviderExplicit,
@@ -3060,6 +3494,7 @@ async function run(argv) {
3060
3494
  await runAiApprove(process.cwd(), {
3061
3495
  dryRun: args.dryRun,
3062
3496
  input: args.aiInput || undefined,
3497
+ language: args.language,
3063
3498
  phase: args.aiPhase,
3064
3499
  runId: args.aiRunId || undefined,
3065
3500
  version: args.aiVersion || undefined,
@@ -3068,7 +3503,9 @@ async function run(argv) {
3068
3503
  }
3069
3504
 
3070
3505
  if (args.aiCommand === 'approvals' || args.aiCommand === 'approval-status') {
3071
- await runAiApprovalStatus(process.cwd());
3506
+ await runAiApprovalStatus(process.cwd(), {
3507
+ language: args.language,
3508
+ });
3072
3509
  return;
3073
3510
  }
3074
3511
 
@@ -3080,6 +3517,7 @@ async function run(argv) {
3080
3517
  dryRun: args.dryRun,
3081
3518
  executorProfile: args.aiExecutorProfile || undefined,
3082
3519
  interactive: args.interactive,
3520
+ language: args.language,
3083
3521
  model: args.aiModel || undefined,
3084
3522
  provider: args.aiProvider,
3085
3523
  providerExplicit: args.aiProviderExplicit,
@@ -3092,6 +3530,7 @@ async function run(argv) {
3092
3530
 
3093
3531
  if (args.aiCommand === 'prompt-slice' || args.aiCommand === 'executor-prompt') {
3094
3532
  runAiPromptSlice(process.cwd(), {
3533
+ language: args.language,
3095
3534
  slice: args.aiSlice || undefined,
3096
3535
  });
3097
3536
  return;
@@ -3107,6 +3546,7 @@ async function run(argv) {
3107
3546
  executorProfile: args.aiExecutorProfile || undefined,
3108
3547
  interactive: args.interactive,
3109
3548
  json: args.json,
3549
+ language: args.language,
3110
3550
  model: args.aiModel || undefined,
3111
3551
  mode: args.aiExecutionMode,
3112
3552
  provider: args.aiProvider,
@@ -3135,6 +3575,7 @@ async function run(argv) {
3135
3575
  dryRun: args.dryRun,
3136
3576
  input: args.aiInput || undefined,
3137
3577
  interactive: args.interactive,
3578
+ language: args.language,
3138
3579
  remote: args.aiRemote || undefined,
3139
3580
  review: args.review,
3140
3581
  sshHostAlias: args.aiSshHostAlias || undefined,
@@ -3152,6 +3593,7 @@ async function run(argv) {
3152
3593
  format: args.format,
3153
3594
  includeCompleted: args.includeCompleted,
3154
3595
  json: args.json,
3596
+ language: args.language,
3155
3597
  level: args.level,
3156
3598
  showConflicts: args.showConflicts,
3157
3599
  specSlug: args.specSlug,
@@ -3166,6 +3608,7 @@ async function run(argv) {
3166
3608
  autoStart: args.autoStart,
3167
3609
  includeCompleted: args.includeCompleted,
3168
3610
  json: args.json,
3611
+ language: args.language,
3169
3612
  specSlug: args.specSlug,
3170
3613
  });
3171
3614
  return;
@@ -3174,6 +3617,7 @@ async function run(argv) {
3174
3617
  if (args.mode === 'evidence') {
3175
3618
  const result = runEvidence(process.cwd(), {
3176
3619
  command: args.evidenceArgs,
3620
+ language: args.language,
3177
3621
  maxOutput: args.evidenceMaxOutput || undefined,
3178
3622
  output: args.evidenceOutput || undefined,
3179
3623
  subcommand: args.evidenceCommand,
@@ -3188,6 +3632,7 @@ async function run(argv) {
3188
3632
  command: args.demoCommand,
3189
3633
  demo: args.demoName,
3190
3634
  dryRun: args.dryRun,
3635
+ language: args.language,
3191
3636
  targetRoot: demoTarget,
3192
3637
  });
3193
3638
  return;
@@ -3196,6 +3641,7 @@ async function run(argv) {
3196
3641
  if (args.mode === 'migrate') {
3197
3642
  runMigrate(args.targetDir, {
3198
3643
  dryRun: args.dryRun,
3644
+ language: args.language,
3199
3645
  skipInstall: args.skipInstall,
3200
3646
  });
3201
3647
  return;
@@ -3206,6 +3652,7 @@ async function run(argv) {
3206
3652
  dryRun: args.dryRun,
3207
3653
  fix: args.doctorFix,
3208
3654
  json: args.json,
3655
+ language: args.language,
3209
3656
  noColor: args.noColor,
3210
3657
  unicode: args.unicode,
3211
3658
  });
@@ -3213,7 +3660,10 @@ async function run(argv) {
3213
3660
  }
3214
3661
 
3215
3662
  if (args.mode === 'start-slice') {
3216
- startSlice(args.targetDir, { allowDraft: args.allowDraft });
3663
+ startSlice(args.targetDir, {
3664
+ allowDraft: args.allowDraft,
3665
+ language: args.language,
3666
+ });
3217
3667
  return;
3218
3668
  }
3219
3669
 
@@ -3221,6 +3671,7 @@ async function run(argv) {
3221
3671
  checkSliceReadiness(args.targetDir, {
3222
3672
  baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
3223
3673
  gate: args.gate,
3674
+ language: args.language,
3224
3675
  local: args.checkSliceLocal,
3225
3676
  remote: args.aiRemote,
3226
3677
  strictOverlap: args.strictOverlap,
@@ -3229,7 +3680,7 @@ async function run(argv) {
3229
3680
  }
3230
3681
 
3231
3682
  if (args.mode === 'check-pr') {
3232
- checkPrReadiness(args.targetDir);
3683
+ checkPrReadiness(args.targetDir, { language: args.language });
3233
3684
  return;
3234
3685
  }
3235
3686
 
@@ -3239,16 +3690,21 @@ async function run(argv) {
3239
3690
  if (!handoffInput || handoffInput === '.') {
3240
3691
  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'));
3241
3692
  }
3242
- const resolved = checkHandoff(handoffInput, repoRoot);
3243
- console.log(`PASS: ${resolved.label} validated at ${resolved.relativePath}`);
3693
+ const translator = createTranslator(args.language);
3694
+ const resolved = checkHandoff(handoffInput, repoRoot, { language: args.language });
3695
+ console.log(translator.t('handoff.validated', {
3696
+ path: resolved.relativePath,
3697
+ subject: translator.t(`handoff.label.${resolved.kind}`),
3698
+ }));
3244
3699
  return;
3245
3700
  }
3246
3701
 
3247
3702
  if (args.mode === 'new-handoff') {
3248
3703
  const repoRoot = process.cwd();
3249
3704
  const handoffSlug = args.targetDir;
3705
+ const translator = createTranslator(args.language);
3250
3706
  const resolved = scaffoldHandoff(handoffSlug, repoRoot);
3251
- console.log(`PASS: Handoff scaffolded at ${resolved.relativePath}`);
3707
+ console.log(translator.t('handoff.scaffolded', { path: resolved.relativePath }));
3252
3708
  return;
3253
3709
  }
3254
3710
 
@@ -3258,6 +3714,7 @@ async function run(argv) {
3258
3714
  discard: args.discard,
3259
3715
  dryRun: args.dryRun,
3260
3716
  force: args.force,
3717
+ language: args.language,
3261
3718
  });
3262
3719
  return;
3263
3720
  }
@@ -3265,6 +3722,7 @@ async function run(argv) {
3265
3722
  if (args.mode === 'check-scope') {
3266
3723
  checkScope(args.targetDir, {
3267
3724
  baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
3725
+ language: args.language,
3268
3726
  remote: args.aiRemote,
3269
3727
  strict: args.strict,
3270
3728
  });
@@ -3283,6 +3741,7 @@ async function run(argv) {
3283
3741
  dryRun: args.dryRun,
3284
3742
  input: args.aiInput || undefined,
3285
3743
  interactive: args.interactive,
3744
+ language: args.language,
3286
3745
  methodology: args.methodology || undefined,
3287
3746
  review: args.review,
3288
3747
  specSlug: args.specSlug || undefined,
@@ -3299,18 +3758,19 @@ async function run(argv) {
3299
3758
  const report = startSpecWorktree(process.cwd(), args.targetDir, {
3300
3759
  dryRun: args.dryRun,
3301
3760
  });
3302
- process.stdout.write(formatSpecStartResult(report));
3761
+ process.stdout.write(formatSpecStartResult(report, { language: args.language }));
3303
3762
  return;
3304
3763
  }
3305
3764
 
3306
3765
  if (args.specCommand === 'status') {
3307
3766
  const report = buildSpecStatus(process.cwd(), args.targetDir);
3308
- process.stdout.write(formatSpecStatus(report));
3767
+ process.stdout.write(formatSpecStatus(report, { language: args.language }));
3309
3768
  return;
3310
3769
  }
3311
3770
 
3312
3771
  if (args.specCommand === 'validate') {
3313
3772
  runValidateSpec(process.cwd(), args.targetDir, {
3773
+ language: args.language,
3314
3774
  strict: args.strict,
3315
3775
  });
3316
3776
  return;
@@ -3324,7 +3784,7 @@ async function run(argv) {
3324
3784
  force: args.force,
3325
3785
  remote: args.aiRemote,
3326
3786
  });
3327
- process.stdout.write(formatSpecCloseResult(report));
3787
+ process.stdout.write(formatSpecCloseResult(report, { language: args.language }));
3328
3788
  return;
3329
3789
  }
3330
3790
 
@@ -3345,11 +3805,13 @@ async function run(argv) {
3345
3805
  });
3346
3806
  return;
3347
3807
  }
3808
+ const initLanguage = resolveInitGeneratedLanguage(args, targetDir, initOptions);
3348
3809
  const initLayout = buildInitLayout(targetDir, {
3349
3810
  compatibilityAlias: !args.explicitInit,
3350
3811
  dryRun: args.dryRun,
3351
3812
  full: initOptions.full,
3352
3813
  includeTemplates: initOptions.includeTemplates,
3814
+ language: initLanguage.configLanguage,
3353
3815
  legacyScripts: initOptions.legacyScripts,
3354
3816
  minimal: initOptions.minimal,
3355
3817
  projectName: initOptions.projectName,
@@ -3372,10 +3834,12 @@ async function run(argv) {
3372
3834
  }
3373
3835
  runInitDocs(targetDir, initOptions.projectName, {
3374
3836
  includeTemplates: initOptions.includeTemplates,
3837
+ language: initLanguage.docsLanguage,
3375
3838
  legacyScripts: initOptions.legacyScripts,
3376
3839
  profile: initLayout.profile,
3377
3840
  templateRoot,
3378
3841
  });
3842
+ const languageWrite = persistInitLanguage(targetDir, { language: initLanguage.configLanguage });
3379
3843
 
3380
3844
  if (!args.skipInstall) {
3381
3845
  const installResult = installSelfAsDevDep(targetDir, CLI_VERSION);
@@ -3386,16 +3850,22 @@ async function run(argv) {
3386
3850
  }
3387
3851
  }
3388
3852
 
3389
- console.log(`Installed Quiver into ${targetDir}`);
3390
- printInitNextSteps(targetDir, initOptions.projectName);
3853
+ const translator = createTranslator(args.language);
3854
+ console.log(translator.t('init.installed', { path: targetDir }));
3855
+ if (languageWrite) {
3856
+ console.log(translator.t('init.language.saved', { language: languageWrite.language }));
3857
+ }
3858
+ printInitNextSteps(targetDir, initOptions.projectName, { language: args.language });
3391
3859
  } finally {
3392
3860
  fs.rmSync(tempRoot, { recursive: true, force: true });
3393
3861
  }
3394
3862
  }
3395
3863
 
3396
3864
  module.exports = {
3865
+ persistInitLanguage,
3397
3866
  resolveInteractiveInitOptions,
3398
3867
  runAnalyze,
3868
+ runDashboard,
3399
3869
  runDoctor,
3400
3870
  runFlow,
3401
3871
  runMigrate,