create-quiver 0.15.3 → 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 (236) hide show
  1. package/.github/workflows/ci.yml +3 -0
  2. package/AGENTS.md.es.template +37 -0
  3. package/docs/AI_CONTEXT.md.es.template +35 -0
  4. package/docs/AI_ONBOARDING_PROMPT.md.es.template +22 -0
  5. package/docs/CLI_UX_GUIDE.md +46 -0
  6. package/docs/COMMANDS.md.es.template +28 -0
  7. package/docs/CONTEXTO.md.es.template +33 -0
  8. package/docs/DECISIONS.md.es.template +17 -0
  9. package/docs/GITFLOW_PR_GUIDE.md.es.template +25 -0
  10. package/docs/INDEX.md +10 -1
  11. package/docs/INDEX.md.es.template +36 -0
  12. package/docs/STATUS.md.es.template +28 -0
  13. package/docs/SUPPORT_MATRIX.md.es.template +22 -0
  14. package/docs/TESTING_GUIDE_FOR_AI.md.es.template +19 -0
  15. package/docs/TROUBLESHOOTING.md.es.template +35 -0
  16. package/docs/WORKFLOW.md.es.template +29 -0
  17. package/docs/ai/LESSONS.md.es.template +24 -0
  18. package/docs/getting-started/installation.md +19 -0
  19. package/docs/reference/commands.md +55 -1
  20. package/package.json +1 -1
  21. package/specs/quiver-v37-cli-i18n-foundation/EVIDENCE_REPORT.md +73 -0
  22. package/specs/quiver-v37-cli-i18n-foundation/EXECUTION_PLAN.md +34 -0
  23. package/specs/quiver-v37-cli-i18n-foundation/SPEC.md +91 -0
  24. package/specs/quiver-v37-cli-i18n-foundation/STATUS.md +29 -0
  25. package/specs/quiver-v37-cli-i18n-foundation/pr.md +97 -0
  26. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/CLOSURE_BRIEF.md +10 -0
  27. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/EXECUTION_BRIEF.md +22 -0
  28. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/slice.json +54 -0
  29. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/CLOSURE_BRIEF.md +30 -0
  30. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/EXECUTION_BRIEF.md +27 -0
  31. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/slice.json +66 -0
  32. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/CLOSURE_BRIEF.md +27 -0
  33. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/EXECUTION_BRIEF.md +26 -0
  34. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/slice.json +62 -0
  35. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/CLOSURE_BRIEF.md +32 -0
  36. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/EXECUTION_BRIEF.md +25 -0
  37. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/slice.json +66 -0
  38. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/CLOSURE_BRIEF.md +30 -0
  39. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/EXECUTION_BRIEF.md +24 -0
  40. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/slice.json +65 -0
  41. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/CLOSURE_BRIEF.md +27 -0
  42. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/EXECUTION_BRIEF.md +23 -0
  43. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/slice.json +67 -0
  44. package/specs/quiver-v38-cli-i18n-read-only-commands/EVIDENCE_REPORT.md +69 -0
  45. package/specs/quiver-v38-cli-i18n-read-only-commands/EXECUTION_PLAN.md +25 -0
  46. package/specs/quiver-v38-cli-i18n-read-only-commands/SPEC.md +52 -0
  47. package/specs/quiver-v38-cli-i18n-read-only-commands/STATUS.md +24 -0
  48. package/specs/quiver-v38-cli-i18n-read-only-commands/pr.md +119 -0
  49. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/CLOSURE_BRIEF.md +10 -0
  50. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/EXECUTION_BRIEF.md +21 -0
  51. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/slice.json +53 -0
  52. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/CLOSURE_BRIEF.md +17 -0
  53. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/EXECUTION_BRIEF.md +23 -0
  54. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/slice.json +69 -0
  55. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/CLOSURE_BRIEF.md +13 -0
  56. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/EXECUTION_BRIEF.md +22 -0
  57. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/slice.json +77 -0
  58. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/CLOSURE_BRIEF.md +12 -0
  59. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/EXECUTION_BRIEF.md +22 -0
  60. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/slice.json +66 -0
  61. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/CLOSURE_BRIEF.md +13 -0
  62. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/EXECUTION_BRIEF.md +22 -0
  63. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/slice.json +61 -0
  64. package/specs/quiver-v39-cli-i18n-setup-onboarding/EVIDENCE_REPORT.md +71 -0
  65. package/specs/quiver-v39-cli-i18n-setup-onboarding/EXECUTION_PLAN.md +25 -0
  66. package/specs/quiver-v39-cli-i18n-setup-onboarding/SPEC.md +53 -0
  67. package/specs/quiver-v39-cli-i18n-setup-onboarding/STATUS.md +24 -0
  68. package/specs/quiver-v39-cli-i18n-setup-onboarding/pr.md +104 -0
  69. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/CLOSURE_BRIEF.md +10 -0
  70. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/EXECUTION_BRIEF.md +21 -0
  71. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/slice.json +53 -0
  72. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/CLOSURE_BRIEF.md +12 -0
  73. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/EXECUTION_BRIEF.md +23 -0
  74. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/slice.json +68 -0
  75. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/CLOSURE_BRIEF.md +12 -0
  76. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/EXECUTION_BRIEF.md +23 -0
  77. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/slice.json +62 -0
  78. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/CLOSURE_BRIEF.md +12 -0
  79. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/EXECUTION_BRIEF.md +22 -0
  80. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/slice.json +72 -0
  81. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/CLOSURE_BRIEF.md +15 -0
  82. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/EXECUTION_BRIEF.md +22 -0
  83. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/slice.json +61 -0
  84. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/EVIDENCE_REPORT.md +50 -0
  85. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/EXECUTION_PLAN.md +25 -0
  86. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/SPEC.md +52 -0
  87. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/STATUS.md +24 -0
  88. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/pr.md +94 -0
  89. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/CLOSURE_BRIEF.md +10 -0
  90. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/EXECUTION_BRIEF.md +21 -0
  91. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/slice.json +53 -0
  92. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/CLOSURE_BRIEF.md +12 -0
  93. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/EXECUTION_BRIEF.md +22 -0
  94. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/slice.json +63 -0
  95. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/CLOSURE_BRIEF.md +10 -0
  96. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/EXECUTION_BRIEF.md +22 -0
  97. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/slice.json +63 -0
  98. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/CLOSURE_BRIEF.md +10 -0
  99. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/EXECUTION_BRIEF.md +22 -0
  100. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/slice.json +72 -0
  101. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/CLOSURE_BRIEF.md +15 -0
  102. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/EXECUTION_BRIEF.md +22 -0
  103. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/slice.json +69 -0
  104. package/specs/quiver-v41-cli-i18n-ai-lifecycle/EVIDENCE_REPORT.md +90 -0
  105. package/specs/quiver-v41-cli-i18n-ai-lifecycle/EXECUTION_PLAN.md +33 -0
  106. package/specs/quiver-v41-cli-i18n-ai-lifecycle/SPEC.md +57 -0
  107. package/specs/quiver-v41-cli-i18n-ai-lifecycle/STATUS.md +26 -0
  108. package/specs/quiver-v41-cli-i18n-ai-lifecycle/pr.md +103 -0
  109. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/CLOSURE_BRIEF.md +10 -0
  110. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/EXECUTION_BRIEF.md +21 -0
  111. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/slice.json +53 -0
  112. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/CLOSURE_BRIEF.md +13 -0
  113. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/EXECUTION_BRIEF.md +22 -0
  114. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/slice.json +68 -0
  115. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/CLOSURE_BRIEF.md +12 -0
  116. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/EXECUTION_BRIEF.md +22 -0
  117. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/slice.json +66 -0
  118. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/CLOSURE_BRIEF.md +12 -0
  119. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/EXECUTION_BRIEF.md +23 -0
  120. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/slice.json +68 -0
  121. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/CLOSURE_BRIEF.md +13 -0
  122. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/EXECUTION_BRIEF.md +23 -0
  123. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/slice.json +72 -0
  124. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/CLOSURE_BRIEF.md +15 -0
  125. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/EXECUTION_BRIEF.md +22 -0
  126. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/slice.json +66 -0
  127. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/CLOSURE_BRIEF.md +11 -0
  128. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/EXECUTION_BRIEF.md +22 -0
  129. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/slice.json +70 -0
  130. package/specs/quiver-v42-cli-i18n-generated-docs/EVIDENCE_REPORT.md +64 -0
  131. package/specs/quiver-v42-cli-i18n-generated-docs/EXECUTION_PLAN.md +26 -0
  132. package/specs/quiver-v42-cli-i18n-generated-docs/SPEC.md +52 -0
  133. package/specs/quiver-v42-cli-i18n-generated-docs/STATUS.md +24 -0
  134. package/specs/quiver-v42-cli-i18n-generated-docs/pr.md +125 -0
  135. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/CLOSURE_BRIEF.md +10 -0
  136. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/EXECUTION_BRIEF.md +21 -0
  137. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/slice.json +53 -0
  138. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/CLOSURE_BRIEF.md +10 -0
  139. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/EXECUTION_BRIEF.md +22 -0
  140. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/slice.json +62 -0
  141. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/CLOSURE_BRIEF.md +11 -0
  142. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/EXECUTION_BRIEF.md +22 -0
  143. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/slice.json +72 -0
  144. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/CLOSURE_BRIEF.md +12 -0
  145. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/EXECUTION_BRIEF.md +22 -0
  146. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/slice.json +60 -0
  147. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/CLOSURE_BRIEF.md +16 -0
  148. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/EXECUTION_BRIEF.md +22 -0
  149. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/slice.json +62 -0
  150. package/specs/quiver-v43-cli-i18n-audit-release-readiness/EVIDENCE_REPORT.md +203 -0
  151. package/specs/quiver-v43-cli-i18n-audit-release-readiness/EXECUTION_PLAN.md +27 -0
  152. package/specs/quiver-v43-cli-i18n-audit-release-readiness/SPEC.md +54 -0
  153. package/specs/quiver-v43-cli-i18n-audit-release-readiness/STATUS.md +24 -0
  154. package/specs/quiver-v43-cli-i18n-audit-release-readiness/command-language-mode-matrix.json +545 -0
  155. package/specs/quiver-v43-cli-i18n-audit-release-readiness/cross-platform-smoke-matrix.md +35 -0
  156. package/specs/quiver-v43-cli-i18n-audit-release-readiness/pr.md +155 -0
  157. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/CLOSURE_BRIEF.md +10 -0
  158. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/EXECUTION_BRIEF.md +21 -0
  159. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/slice.json +53 -0
  160. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/CLOSURE_BRIEF.md +13 -0
  161. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/EXECUTION_BRIEF.md +23 -0
  162. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/slice.json +62 -0
  163. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/CLOSURE_BRIEF.md +18 -0
  164. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/EXECUTION_BRIEF.md +22 -0
  165. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/slice.json +59 -0
  166. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/CLOSURE_BRIEF.md +15 -0
  167. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/EXECUTION_BRIEF.md +23 -0
  168. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/slice.json +62 -0
  169. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/CLOSURE_BRIEF.md +17 -0
  170. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/EXECUTION_BRIEF.md +24 -0
  171. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/slice.json +66 -0
  172. package/specs/quiver-v44-provider-live-output-tui-lite/EVIDENCE_REPORT.md +18 -0
  173. package/specs/quiver-v44-provider-live-output-tui-lite/EXECUTION_PLAN.md +31 -0
  174. package/specs/quiver-v44-provider-live-output-tui-lite/SPEC.md +118 -0
  175. package/specs/quiver-v44-provider-live-output-tui-lite/STATUS.md +25 -0
  176. package/specs/quiver-v44-provider-live-output-tui-lite/pr.md +92 -0
  177. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/CLOSURE_BRIEF.md +11 -0
  178. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/EXECUTION_BRIEF.md +23 -0
  179. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/slice.json +64 -0
  180. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/CLOSURE_BRIEF.md +10 -0
  181. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/EXECUTION_BRIEF.md +24 -0
  182. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/slice.json +65 -0
  183. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/CLOSURE_BRIEF.md +10 -0
  184. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/EXECUTION_BRIEF.md +24 -0
  185. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/slice.json +70 -0
  186. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/CLOSURE_BRIEF.md +10 -0
  187. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/EXECUTION_BRIEF.md +25 -0
  188. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/slice.json +70 -0
  189. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/CLOSURE_BRIEF.md +10 -0
  190. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/EXECUTION_BRIEF.md +26 -0
  191. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/slice.json +72 -0
  192. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/CLOSURE_BRIEF.md +15 -0
  193. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/EXECUTION_BRIEF.md +26 -0
  194. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/slice.json +75 -0
  195. package/specs/quiver-v45-ci-actions-node24-readiness/EVIDENCE_REPORT.md +30 -0
  196. package/specs/quiver-v45-ci-actions-node24-readiness/EXECUTION_PLAN.md +22 -0
  197. package/specs/quiver-v45-ci-actions-node24-readiness/SPEC.md +49 -0
  198. package/specs/quiver-v45-ci-actions-node24-readiness/STATUS.md +21 -0
  199. package/specs/quiver-v45-ci-actions-node24-readiness/pr.md +67 -0
  200. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/CLOSURE_BRIEF.md +10 -0
  201. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/EXECUTION_BRIEF.md +21 -0
  202. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/slice.json +48 -0
  203. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/CLOSURE_BRIEF.md +14 -0
  204. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/EXECUTION_BRIEF.md +23 -0
  205. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/slice.json +65 -0
  206. package/src/create-quiver/commands/ai.js +485 -307
  207. package/src/create-quiver/commands/config.js +124 -0
  208. package/src/create-quiver/commands/demo.js +2 -2
  209. package/src/create-quiver/commands/evidence.js +6 -4
  210. package/src/create-quiver/commands/flow.js +108 -16
  211. package/src/create-quiver/commands/graph.js +1 -0
  212. package/src/create-quiver/commands/next.js +21 -18
  213. package/src/create-quiver/commands/plan.js +23 -6
  214. package/src/create-quiver/commands/spec.js +66 -57
  215. package/src/create-quiver/index.js +514 -139
  216. package/src/create-quiver/lib/ai/execution-plan.js +23 -20
  217. package/src/create-quiver/lib/ai/executor.js +60 -44
  218. package/src/create-quiver/lib/ai/export-state.js +75 -64
  219. package/src/create-quiver/lib/ai/github.js +24 -21
  220. package/src/create-quiver/lib/ai/run-state.js +28 -25
  221. package/src/create-quiver/lib/dashboard.js +154 -111
  222. package/src/create-quiver/lib/demo.js +14 -12
  223. package/src/create-quiver/lib/handoff.js +16 -7
  224. package/src/create-quiver/lib/i18n/catalog.js +152 -0
  225. package/src/create-quiver/lib/i18n/language.js +279 -0
  226. package/src/create-quiver/lib/i18n/messages/en.js +853 -0
  227. package/src/create-quiver/lib/i18n/messages/es.js +968 -0
  228. package/src/create-quiver/lib/i18n/read-only-format.js +26 -0
  229. package/src/create-quiver/lib/i18n/templates.js +172 -0
  230. package/src/create-quiver/lib/init-docs.js +18 -4
  231. package/src/create-quiver/lib/init-layout.js +6 -0
  232. package/src/create-quiver/lib/lifecycle.js +53 -46
  233. package/src/create-quiver/lib/readiness.js +77 -67
  234. package/src/create-quiver/lib/renderers/tree.js +9 -6
  235. package/src/create-quiver/lib/spec-worktrees.js +34 -30
  236. package/src/create-quiver/lib/version.js +11 -9
@@ -2,6 +2,7 @@ const fs = require('node:fs');
2
2
  const path = require('node:path');
3
3
 
4
4
  const { collectLifecycleExport } = require('./ai/export-state');
5
+ const { createTranslator } = require('./i18n/catalog');
5
6
  const {
6
7
  collectActiveSliceState,
7
8
  filterSlicesForExecution,
@@ -41,6 +42,36 @@ class DashboardError extends Error {
41
42
  }
42
43
  }
43
44
 
45
+ function translatorForOptions(options = {}) {
46
+ return createTranslator(options.json ? 'en' : options.language);
47
+ }
48
+
49
+ function formatStatus(status, translator) {
50
+ const key = `status.${String(status || '').replace(/-/g, '_')}`;
51
+ const translated = translator.t(key);
52
+ return translated.startsWith('[missing:') ? String(status || '') : translated;
53
+ }
54
+
55
+ function formatWarningMessage(warning, specSlug, translator) {
56
+ if (warning.code === 'NO_SPECS_FOUND') {
57
+ return translator.t('dashboard.warning.no_specs_found');
58
+ }
59
+ if (warning.code === 'NO_VISIBLE_SLICES') {
60
+ return specSlug
61
+ ? translator.t('dashboard.warning.no_visible_slices_for_spec', { spec: specSlug })
62
+ : translator.t('dashboard.warning.no_visible_slices');
63
+ }
64
+ return warning.message;
65
+ }
66
+
67
+ function translateIfCatalogKey(value, translator) {
68
+ const text = String(value || '');
69
+ if (!text.startsWith('dashboard.')) {
70
+ return text;
71
+ }
72
+ return translator.t(text);
73
+ }
74
+
44
75
  function compareRefs(left, right) {
45
76
  return String(left || '').localeCompare(String(right || ''));
46
77
  }
@@ -405,6 +436,7 @@ function buildErrorPayload(error) {
405
436
  }
406
437
 
407
438
  function collectDashboardReport(projectRoot, options = {}) {
439
+ const translator = translatorForOptions(options);
408
440
  const specSlug = options.specSlug ? String(options.specSlug).trim() : '';
409
441
  const includeCompleted = options.includeCompleted === true;
410
442
  const specDirs = listSpecDirectories(projectRoot);
@@ -413,7 +445,7 @@ function collectDashboardReport(projectRoot, options = {}) {
413
445
  if (specSlug && !selectedSpecDir) {
414
446
  throw new DashboardError(
415
447
  'SPEC_NOT_FOUND',
416
- `Spec '${specSlug}' was not found in specs/ or specs-fix/.`,
448
+ translator.t('dashboard.error.spec_not_found', { spec: specSlug }),
417
449
  'npx create-quiver ai specs list',
418
450
  );
419
451
  }
@@ -530,8 +562,8 @@ function collectDashboardReport(projectRoot, options = {}) {
530
562
  };
531
563
  }
532
564
 
533
- function formatProgress(progress) {
534
- return `${progress.completed}/${progress.total} completed, ${progress.open} open, ${progress.blocked} blocked, ${progress.percent}%`;
565
+ function formatProgress(progress, translator = createTranslator()) {
566
+ return `${progress.completed}/${progress.total} ${translator.t('status.completed')}, ${progress.open} ${translator.t('dashboard.open')}, ${progress.blocked} ${translator.t('status.blocked')}, ${progress.percent}%`;
535
567
  }
536
568
 
537
569
  function dashboardOptionError(message, nextCommand = 'npx create-quiver dashboard --help') {
@@ -545,13 +577,13 @@ function parseDashboardLimit(rawLimit, errors) {
545
577
 
546
578
  const value = String(rawLimit).trim();
547
579
  if (!/^[1-9]\d*$/.test(value)) {
548
- errors.push('invalid value for --limit: expected an integer from 1 to 100');
580
+ errors.push('dashboard.limit.invalid');
549
581
  return DEFAULT_DASHBOARD_LIMIT;
550
582
  }
551
583
 
552
584
  const parsed = Number.parseInt(value, 10);
553
585
  if (parsed > MAX_DASHBOARD_LIMIT) {
554
- errors.push('invalid value for --limit: expected an integer from 1 to 100');
586
+ errors.push('dashboard.limit.invalid');
555
587
  return DEFAULT_DASHBOARD_LIMIT;
556
588
  }
557
589
 
@@ -559,6 +591,7 @@ function parseDashboardLimit(rawLimit, errors) {
559
591
  }
560
592
 
561
593
  function normalizeDashboardOptions(options = {}) {
594
+ const translator = translatorForOptions(options);
562
595
  const errors = Array.isArray(options.optionErrors) ? [...options.optionErrors] : [];
563
596
  const details = options.details === true;
564
597
  const section = String(options.section || '').trim();
@@ -566,23 +599,27 @@ function normalizeDashboardOptions(options = {}) {
566
599
  const limit = parseDashboardLimit(options.limit, errors);
567
600
 
568
601
  if (section && !SUPPORTED_DASHBOARD_SECTIONS.includes(section)) {
569
- errors.push(`unsupported dashboard section: ${section}. Supported sections: ${SUPPORTED_DASHBOARD_SECTIONS.join(', ')}`);
602
+ errors.push(translator.t('dashboard.unsupported_section', {
603
+ section,
604
+ sections: SUPPORTED_DASHBOARD_SECTIONS.join(', '),
605
+ }));
570
606
  }
571
607
 
572
608
  if (details && section) {
573
- errors.push('dashboard --details cannot be combined with --section <name>');
609
+ errors.push(translator.t('dashboard.cannot_combine_details_section'));
574
610
  }
575
611
 
576
612
  if (options.json && (details || section || hasLimit || errors.length > 0)) {
577
- errors.push('dashboard --json cannot be combined with human-only flags: --details, --section, --limit');
613
+ errors.push(translator.t('dashboard.json_human_flags'));
578
614
  }
579
615
 
580
616
  if (errors.length > 0) {
581
- throw dashboardOptionError(errors.join(' '));
617
+ throw dashboardOptionError(errors.map((error) => translateIfCatalogKey(error, translator)).join(' '));
582
618
  }
583
619
 
584
620
  return {
585
621
  details,
622
+ language: options.language,
586
623
  limit,
587
624
  section,
588
625
  };
@@ -610,13 +647,16 @@ function dashboardCommand(report, suffix = '') {
610
647
  return parts.join(' ');
611
648
  }
612
649
 
613
- function truncationLine(report, section, hidden) {
614
- return `- + ${hidden} more. Run: ${dashboardCommand(report, `--section ${section}`)}`;
650
+ function truncationLine(report, section, hidden, translator = createTranslator()) {
651
+ return `- ${translator.t('dashboard.more_run', {
652
+ command: dashboardCommand(report, `--section ${section}`),
653
+ count: hidden,
654
+ })}`;
615
655
  }
616
656
 
617
- function pushLimitedList(lines, report, section, items, limit, formatter) {
657
+ function pushLimitedList(lines, report, section, items, limit, formatter, translator = createTranslator()) {
618
658
  if (!items.length) {
619
- lines.push('- none');
659
+ lines.push(`- ${translator.t('common.none')}`);
620
660
  return;
621
661
  }
622
662
 
@@ -626,41 +666,42 @@ function pushLimitedList(lines, report, section, items, limit, formatter) {
626
666
 
627
667
  const hidden = items.length - limit;
628
668
  if (hidden > 0) {
629
- lines.push(truncationLine(report, section, hidden));
669
+ lines.push(truncationLine(report, section, hidden, translator));
630
670
  }
631
671
  }
632
672
 
633
- function formatSpecLine(spec) {
634
- return `${spec.slug}: ${spec.status}, ${spec.progress.percent}% (${spec.progress.completed}/${spec.progress.total})`;
673
+ function formatSpecLine(spec, translator = createTranslator()) {
674
+ return `${spec.slug}: ${formatStatus(spec.status, translator)}, ${spec.progress.percent}% (${spec.progress.completed}/${spec.progress.total})`;
635
675
  }
636
676
 
637
- function formatSliceLine(slice) {
677
+ function formatSliceLine(slice, translator = createTranslator()) {
638
678
  const blocked = slice.blocked_reason ? ` blocked=${truncateText(slice.blocked_reason, 48)}` : '';
639
- return `${slice.ref}: ${slice.status}, ${slice.progress}%${blocked}`;
679
+ return `${slice.ref}: ${formatStatus(slice.status, translator)}, ${slice.progress}%${blocked}`;
640
680
  }
641
681
 
642
- function formatAgentLine(agent) {
643
- return `${agent.role}: ${agent.configured ? agent.provider || 'configured' : 'missing'}`;
682
+ function formatAgentLine(agent, translator = createTranslator()) {
683
+ return `${agent.role}: ${agent.configured ? agent.provider || translator.t('dashboard.configured') : translator.t('dashboard.missing')}`;
644
684
  }
645
685
 
646
- function formatApprovalLine(approval) {
647
- const version = approval.approved_version ? ` approved=v${approval.approved_version}` : '';
648
- return `${approval.phase}: ${approval.status}${version}`;
686
+ function formatApprovalLine(approval, translator = createTranslator()) {
687
+ const version = approval.approved_version ? ` ${translator.t('dashboard.approved')}=v${approval.approved_version}` : '';
688
+ return `${approval.phase}: ${formatStatus(approval.status, translator)}${version}`;
649
689
  }
650
690
 
651
- function formatRunLine(run) {
652
- return `${run.run_id}: ${run.phase} (${run.status})`;
691
+ function formatRunLine(run, translator = createTranslator()) {
692
+ return `${run.run_id}: ${run.phase} (${formatStatus(run.status, translator)})`;
653
693
  }
654
694
 
655
- function pushSignalSection(lines, report, title, section, items, limit, formatter) {
656
- lines.push(`${title}: ${items.length === 0 ? 'none' : ''}`.trimEnd());
695
+ function pushSignalSection(lines, report, title, section, items, limit, formatter, translator = createTranslator()) {
696
+ lines.push(`${title}: ${items.length === 0 ? translator.t('common.none') : ''}`.trimEnd());
657
697
  if (items.length > 0) {
658
- pushLimitedList(lines, report, section, items, limit, formatter);
698
+ pushLimitedList(lines, report, section, items, limit, formatter, translator);
659
699
  }
660
700
  }
661
701
 
662
702
  function formatCompactDashboard(report, options) {
663
- const nextCommand = report.next_steps[0]?.command || 'none';
703
+ const translator = createTranslator(options.language);
704
+ const nextCommand = report.next_steps[0]?.command || translator.t('common.none');
664
705
  const state = report.blockers.length > 0
665
706
  ? 'blocked'
666
707
  : report.warnings.length > 0
@@ -669,38 +710,38 @@ function formatCompactDashboard(report, options) {
669
710
  ? 'ready'
670
711
  : 'idle';
671
712
  const lines = [
672
- 'Quiver Dashboard',
673
- `Project: ${truncateText(report.project.name, 42)} | Layout: ${report.summary.layout} | Filter: ${report.source_metadata.spec_filter || 'all specs'}`,
674
- `State: ${state}`,
675
- `Next safe command: ${nextCommand}`,
676
- `Progress: Global: ${formatProgress(report.global_progress)} | Visible: ${formatProgress(report.visible_progress)}`,
677
- `Counts: specs ${report.summary.specs} (${report.summary.visible_specs} visible), slices ${report.summary.slices} (${report.summary.visible_slices} visible), agents ${report.summary.configured_agents}/${report.summary.agents}, runs ${report.summary.runs}`,
678
- `Next ready slice: ${report.next_ready ? `${report.next_ready.ref} - ${truncateText(report.next_ready.title, 48)}` : 'none'}`,
713
+ translator.t('dashboard.title'),
714
+ `${translator.t('dashboard.project')}: ${truncateText(report.project.name, 42)} | ${translator.t('dashboard.layout')}: ${report.summary.layout} | ${translator.t('dashboard.filter')}: ${report.source_metadata.spec_filter || translator.t('dashboard.all_specs')}`,
715
+ `${translator.t('dashboard.state')}: ${translator.t(`dashboard.state.${state}`)}`,
716
+ `${translator.t('dashboard.next_safe_command')}: ${nextCommand}`,
717
+ `${translator.t('dashboard.progress')}: ${translator.t('dashboard.global')}: ${formatProgress(report.global_progress, translator)} | ${translator.t('dashboard.visible')}: ${formatProgress(report.visible_progress, translator)}`,
718
+ `${translator.t('dashboard.counts')}: ${translator.t('dashboard.specs')} ${report.summary.specs} (${report.summary.visible_specs} ${translator.t('dashboard.visible_count')}), ${translator.t('dashboard.slices')} ${report.summary.slices} (${report.summary.visible_slices} ${translator.t('dashboard.visible_count')}), ${translator.t('dashboard.agents')} ${report.summary.configured_agents}/${report.summary.agents}, ${translator.t('dashboard.runs')} ${report.summary.runs}`,
719
+ `${translator.t('dashboard.next_ready_slice')}: ${report.next_ready ? `${report.next_ready.ref} - ${truncateText(report.next_ready.title, 48)}` : translator.t('common.none')}`,
679
720
  ];
680
721
 
681
- pushSignalSection(lines, report, 'Blockers', 'blockers', report.blockers, options.limit, (blocker) => `${blocker.ref}: ${truncateText(blocker.reason, 70)}`);
682
- pushSignalSection(lines, report, 'Warnings', 'warnings', report.warnings, options.limit, (warning) => `${warning.code}: ${truncateText(warning.message, 70)}`);
722
+ pushSignalSection(lines, report, translator.t('dashboard.blockers'), 'blockers', report.blockers, options.limit, (blocker) => `${blocker.ref}: ${truncateText(blocker.reason, 70)}`, translator);
723
+ pushSignalSection(lines, report, translator.t('dashboard.warnings'), 'warnings', report.warnings, options.limit, (warning) => `${warning.code}: ${truncateText(formatWarningMessage(warning, report.source_metadata.spec_filter, translator), 70)}`, translator);
683
724
 
684
- lines.push(`Active slice: ${report.active_slice.reconciliation.decision} (${truncateText(report.active_slice.reconciliation.reason, 60)})`);
685
- lines.push(`Inspect: ${dashboardCommand(report, '--details')}`);
725
+ lines.push(`${translator.t('dashboard.active_slice')}: ${report.active_slice.reconciliation.decision} (${truncateText(report.active_slice.reconciliation.reason, 60)})`);
726
+ lines.push(`${translator.t('dashboard.inspect')}: ${dashboardCommand(report, '--details')}`);
686
727
  lines.push('');
687
728
  return `${lines.join('\n')}\n`;
688
729
  }
689
730
 
690
- function formatDashboardOverview(report) {
731
+ function formatDashboardOverview(report, translator = createTranslator()) {
691
732
  const lines = [
692
- 'Dashboard Overview',
693
- `Project: ${report.project.name}`,
694
- `Layout: ${report.summary.layout}`,
695
- `Filter: ${report.source_metadata.spec_filter || 'all specs'}`,
696
- `Completed hidden: ${report.source_metadata.include_completed ? 'no' : 'yes'}`,
697
- `Global progress: ${formatProgress(report.global_progress)}`,
698
- `Visible progress: ${formatProgress(report.visible_progress)}`,
699
- `Specs: ${report.summary.specs} (${report.summary.visible_specs} visible)`,
700
- `Slices: ${report.summary.slices} (${report.summary.visible_slices} visible)`,
701
- `Blockers: ${report.summary.blockers}`,
702
- `Warnings: ${report.summary.warnings}`,
703
- `Runs: ${report.summary.runs}`,
733
+ translator.t('dashboard.dashboard_overview'),
734
+ `${translator.t('dashboard.project')}: ${report.project.name}`,
735
+ `${translator.t('dashboard.layout')}: ${report.summary.layout}`,
736
+ `${translator.t('dashboard.filter')}: ${report.source_metadata.spec_filter || translator.t('dashboard.all_specs')}`,
737
+ `${translator.t('dashboard.completed_hidden')}: ${report.source_metadata.include_completed ? translator.t('common.no') : translator.t('common.yes')}`,
738
+ `${translator.t('dashboard.global_progress')}: ${formatProgress(report.global_progress, translator)}`,
739
+ `${translator.t('dashboard.visible_progress')}: ${formatProgress(report.visible_progress, translator)}`,
740
+ `${translator.t('dashboard.specs')}: ${report.summary.specs} (${report.summary.visible_specs} ${translator.t('dashboard.visible_count')})`,
741
+ `${translator.t('dashboard.slices')}: ${report.summary.slices} (${report.summary.visible_slices} ${translator.t('dashboard.visible_count')})`,
742
+ `${translator.t('dashboard.blockers')}: ${report.summary.blockers}`,
743
+ `${translator.t('dashboard.warnings')}: ${report.summary.warnings}`,
744
+ `${translator.t('dashboard.runs')}: ${report.summary.runs}`,
704
745
  '',
705
746
  ];
706
747
 
@@ -708,161 +749,163 @@ function formatDashboardOverview(report) {
708
749
  }
709
750
 
710
751
  function formatDashboardSection(report, options) {
752
+ const translator = createTranslator(options.language);
711
753
  const lines = [];
712
754
  const limit = options.limit;
713
755
 
714
756
  if (options.section === 'overview') {
715
- return formatDashboardOverview(report);
757
+ return formatDashboardOverview(report, translator);
716
758
  }
717
759
 
718
760
  if (options.section === 'specs') {
719
- lines.push('Specs');
720
- pushLimitedList(lines, report, 'specs', report.specs, limit, formatSpecLine);
761
+ lines.push(translator.t('dashboard.specs'));
762
+ pushLimitedList(lines, report, 'specs', report.specs, limit, (spec) => formatSpecLine(spec, translator), translator);
721
763
  }
722
764
 
723
765
  if (options.section === 'slices') {
724
- lines.push('Slices');
725
- pushLimitedList(lines, report, 'slices', report.slices, limit, formatSliceLine);
766
+ lines.push(translator.t('dashboard.slices'));
767
+ pushLimitedList(lines, report, 'slices', report.slices, limit, (slice) => formatSliceLine(slice, translator), translator);
726
768
  }
727
769
 
728
770
  if (options.section === 'blockers') {
729
- lines.push('Blockers');
730
- pushLimitedList(lines, report, 'blockers', report.blockers, limit, (blocker) => `${blocker.ref}: ${blocker.reason}`);
771
+ lines.push(translator.t('dashboard.blockers'));
772
+ pushLimitedList(lines, report, 'blockers', report.blockers, limit, (blocker) => `${blocker.ref}: ${blocker.reason}`, translator);
731
773
  }
732
774
 
733
775
  if (options.section === 'warnings') {
734
- lines.push('Warnings');
735
- pushLimitedList(lines, report, 'warnings', report.warnings, limit, (warning) => `${warning.code}: ${warning.message}`);
776
+ lines.push(translator.t('dashboard.warnings'));
777
+ pushLimitedList(lines, report, 'warnings', report.warnings, limit, (warning) => `${warning.code}: ${formatWarningMessage(warning, report.source_metadata.spec_filter, translator)}`, translator);
736
778
  }
737
779
 
738
780
  if (options.section === 'agents') {
739
- lines.push('Agents');
740
- pushLimitedList(lines, report, 'agents', report.agents, limit, formatAgentLine);
781
+ lines.push(translator.t('dashboard.agents'));
782
+ pushLimitedList(lines, report, 'agents', report.agents, limit, (agent) => formatAgentLine(agent, translator), translator);
741
783
  }
742
784
 
743
785
  if (options.section === 'approvals') {
744
- lines.push('Approvals');
745
- pushLimitedList(lines, report, 'approvals', report.approvals, limit, formatApprovalLine);
786
+ lines.push(translator.t('dashboard.approvals'));
787
+ pushLimitedList(lines, report, 'approvals', report.approvals, limit, (approval) => formatApprovalLine(approval, translator), translator);
746
788
  }
747
789
 
748
790
  if (options.section === 'runs') {
749
- lines.push('Runs');
750
- pushLimitedList(lines, report, 'runs', report.runs, limit, formatRunLine);
791
+ lines.push(translator.t('dashboard.runs'));
792
+ pushLimitedList(lines, report, 'runs', report.runs, limit, (run) => formatRunLine(run, translator), translator);
751
793
  }
752
794
 
753
795
  if (options.section === 'active-slice') {
754
796
  lines.push(
755
- 'Active slice',
756
- `- Sources: ${report.active_slice.sources_count}`,
757
- `- Reconciliation: ${report.active_slice.reconciliation.decision} (${report.active_slice.reconciliation.reason})`,
797
+ translator.t('dashboard.active_slice'),
798
+ `- ${translator.t('dashboard.sources')}: ${report.active_slice.sources_count}`,
799
+ `- ${translator.t('dashboard.reconciliation')}: ${report.active_slice.reconciliation.decision} (${report.active_slice.reconciliation.reason})`,
758
800
  );
759
801
  }
760
802
 
761
803
  if (options.section === 'next-steps') {
762
- lines.push('Next safe commands');
763
- pushLimitedList(lines, report, 'next-steps', report.next_steps, limit, (step) => step.command);
804
+ lines.push(translator.t('dashboard.next_safe_commands'));
805
+ pushLimitedList(lines, report, 'next-steps', report.next_steps, limit, (step) => step.command, translator);
764
806
  }
765
807
 
766
808
  lines.push('');
767
809
  return `${lines.join('\n')}\n`;
768
810
  }
769
811
 
770
- function formatDashboardDetails(report) {
812
+ function formatDashboardDetails(report, options = {}) {
813
+ const translator = createTranslator(options.language);
771
814
  const lines = [
772
- 'Quiver Dashboard',
773
- `Project: ${report.project.name}`,
774
- `Layout: ${report.summary.layout}`,
775
- `Filter: ${report.source_metadata.spec_filter || 'all specs'}`,
776
- `Completed hidden: ${report.source_metadata.include_completed ? 'no' : 'yes'}`,
815
+ translator.t('dashboard.title'),
816
+ `${translator.t('dashboard.project')}: ${report.project.name}`,
817
+ `${translator.t('dashboard.layout')}: ${report.summary.layout}`,
818
+ `${translator.t('dashboard.filter')}: ${report.source_metadata.spec_filter || translator.t('dashboard.all_specs')}`,
819
+ `${translator.t('dashboard.completed_hidden')}: ${report.source_metadata.include_completed ? translator.t('common.no') : translator.t('common.yes')}`,
777
820
  '',
778
- 'Progress',
779
- `- Global: ${formatProgress(report.global_progress)}`,
780
- `- Visible: ${formatProgress(report.visible_progress)}`,
821
+ translator.t('dashboard.progress'),
822
+ `- ${translator.t('dashboard.global')}: ${formatProgress(report.global_progress, translator)}`,
823
+ `- ${translator.t('dashboard.visible')}: ${formatProgress(report.visible_progress, translator)}`,
781
824
  '',
782
- 'Next ready slice',
825
+ translator.t('dashboard.next_ready_slice'),
783
826
  ];
784
827
 
785
828
  if (report.next_ready) {
786
829
  lines.push(`- ${report.next_ready.ref}: ${report.next_ready.title}`);
787
- lines.push(`- Start: ${report.next_ready.start_slice_command}`);
830
+ lines.push(`- ${translator.t('dashboard.start')}: ${report.next_ready.start_slice_command}`);
788
831
  } else {
789
- lines.push('- none');
832
+ lines.push(`- ${translator.t('common.none')}`);
790
833
  }
791
834
 
792
- lines.push('', 'Specs');
835
+ lines.push('', translator.t('dashboard.specs'));
793
836
  if (report.specs.length === 0) {
794
- lines.push('- none');
837
+ lines.push(`- ${translator.t('common.none')}`);
795
838
  } else {
796
839
  for (const spec of report.specs) {
797
- lines.push(`- ${formatSpecLine(spec)}`);
840
+ lines.push(`- ${formatSpecLine(spec, translator)}`);
798
841
  }
799
842
  }
800
843
 
801
- lines.push('', 'Slices');
844
+ lines.push('', translator.t('dashboard.slices'));
802
845
  if (report.slices.length === 0) {
803
- lines.push('- none');
846
+ lines.push(`- ${translator.t('common.none')}`);
804
847
  } else {
805
848
  for (const slice of report.slices) {
806
- lines.push(`- ${formatSliceLine(slice)}`);
849
+ lines.push(`- ${formatSliceLine(slice, translator)}`);
807
850
  }
808
851
  }
809
852
 
810
- lines.push('', 'Blockers');
853
+ lines.push('', translator.t('dashboard.blockers'));
811
854
  if (report.blockers.length === 0) {
812
- lines.push('- none');
855
+ lines.push(`- ${translator.t('common.none')}`);
813
856
  } else {
814
857
  for (const blocker of report.blockers) {
815
858
  lines.push(`- ${blocker.ref}: ${blocker.reason}`);
816
859
  }
817
860
  }
818
861
 
819
- lines.push('', 'Warnings');
862
+ lines.push('', translator.t('dashboard.warnings'));
820
863
  if (report.warnings.length === 0) {
821
- lines.push('- none');
864
+ lines.push(`- ${translator.t('common.none')}`);
822
865
  } else {
823
866
  for (const warning of report.warnings) {
824
- lines.push(`- ${warning.code}: ${warning.message}`);
867
+ lines.push(`- ${warning.code}: ${formatWarningMessage(warning, report.source_metadata.spec_filter, translator)}`);
825
868
  }
826
869
  }
827
870
 
828
- lines.push('', 'Agents');
871
+ lines.push('', translator.t('dashboard.agents'));
829
872
  if (report.agents.length === 0) {
830
- lines.push('- none');
873
+ lines.push(`- ${translator.t('common.none')}`);
831
874
  } else {
832
875
  for (const agent of report.agents) {
833
- lines.push(`- ${formatAgentLine(agent)}`);
876
+ lines.push(`- ${formatAgentLine(agent, translator)}`);
834
877
  }
835
878
  }
836
879
 
837
- lines.push('', 'Approvals');
880
+ lines.push('', translator.t('dashboard.approvals'));
838
881
  if (report.approvals.length === 0) {
839
- lines.push('- none');
882
+ lines.push(`- ${translator.t('common.none')}`);
840
883
  } else {
841
884
  for (const approval of report.approvals) {
842
- lines.push(`- ${formatApprovalLine(approval)}`);
885
+ lines.push(`- ${formatApprovalLine(approval, translator)}`);
843
886
  }
844
887
  }
845
888
 
846
- lines.push('', 'Runs');
889
+ lines.push('', translator.t('dashboard.runs'));
847
890
  if (report.runs.length === 0) {
848
- lines.push('- none');
891
+ lines.push(`- ${translator.t('common.none')}`);
849
892
  } else {
850
893
  for (const run of report.runs) {
851
- lines.push(`- ${formatRunLine(run)}`);
894
+ lines.push(`- ${formatRunLine(run, translator)}`);
852
895
  }
853
896
  }
854
897
 
855
898
  lines.push(
856
899
  '',
857
- 'Active slice',
858
- `- Sources: ${report.active_slice.sources_count}`,
859
- `- Reconciliation: ${report.active_slice.reconciliation.decision} (${report.active_slice.reconciliation.reason})`,
900
+ translator.t('dashboard.active_slice'),
901
+ `- ${translator.t('dashboard.sources')}: ${report.active_slice.sources_count}`,
902
+ `- ${translator.t('dashboard.reconciliation')}: ${report.active_slice.reconciliation.decision} (${report.active_slice.reconciliation.reason})`,
860
903
  '',
861
- 'Next safe commands',
904
+ translator.t('dashboard.next_safe_commands'),
862
905
  );
863
906
 
864
907
  if (report.next_steps.length === 0) {
865
- lines.push('- none');
908
+ lines.push(`- ${translator.t('common.none')}`);
866
909
  } else {
867
910
  for (const step of report.next_steps) {
868
911
  lines.push(`- ${step.command}`);
@@ -876,7 +919,7 @@ function formatDashboardDetails(report) {
876
919
  function formatHumanDashboard(report, options = {}) {
877
920
  const normalized = normalizeDashboardOptions({ ...options, json: false });
878
921
  if (normalized.details) {
879
- return formatDashboardDetails(report);
922
+ return formatDashboardDetails(report, normalized);
880
923
  }
881
924
  if (normalized.section) {
882
925
  return formatDashboardSection(report, normalized);
@@ -6,6 +6,7 @@ const {
6
6
  resolveInitPackageScripts,
7
7
  toProjectSlug,
8
8
  } = require('./init-layout');
9
+ const { createTranslator } = require('./i18n/catalog');
9
10
  const cliPackageJson = require('../../../package.json');
10
11
 
11
12
  const SPEC_VIEWER_DEMO = 'spec-viewer';
@@ -770,38 +771,39 @@ function buildDemoPlan(targetRoot, options = {}) {
770
771
  }
771
772
 
772
773
  function formatDemoPlan(plan, options = {}) {
774
+ const translator = createTranslator(options.language);
773
775
  const lines = [];
774
- const title = options.dryRun ? 'Quiver demo dry-run' : 'Quiver demo created';
776
+ const title = options.dryRun ? translator.t('demo.title.dry_run') : translator.t('demo.title.created');
775
777
 
776
778
  lines.push(title);
777
- lines.push(`- Demo: ${plan.demo}`);
778
- lines.push(`- Project: ${plan.projectName}`);
779
- lines.push(`- Target: ${plan.targetRoot}`);
780
- lines.push(`- Files to create: ${plan.summary.create}`);
781
- lines.push(`- Files to preserve: ${plan.summary.preserve}`);
779
+ lines.push(`- ${translator.t('demo.label.demo', { demo: plan.demo })}`);
780
+ lines.push(`- ${translator.t('demo.label.project', { project: plan.projectName })}`);
781
+ lines.push(`- ${translator.t('demo.label.target', { path: plan.targetRoot })}`);
782
+ lines.push(`- ${translator.t('demo.label.files_to_create', { count: plan.summary.create })}`);
783
+ lines.push(`- ${translator.t('demo.label.files_to_preserve', { count: plan.summary.preserve })}`);
782
784
  lines.push('');
783
- lines.push('Files to create');
785
+ lines.push(translator.t('demo.section.files_to_create'));
784
786
  for (const operation of plan.operations.filter((item) => item.action === 'create')) {
785
787
  lines.push(`- ${operation.path}`);
786
788
  }
787
789
  if (plan.summary.create === 0) {
788
- lines.push('- none');
790
+ lines.push(`- ${translator.t('common.none')}`);
789
791
  }
790
792
  lines.push('');
791
- lines.push('Files to preserve');
793
+ lines.push(translator.t('demo.section.files_to_preserve'));
792
794
  for (const operation of plan.operations.filter((item) => item.action === 'preserve')) {
793
795
  lines.push(`- ${operation.path}`);
794
796
  }
795
797
  if (plan.summary.preserve === 0) {
796
- lines.push('- none');
798
+ lines.push(`- ${translator.t('common.none')}`);
797
799
  }
798
800
 
799
801
  if (options.dryRun) {
800
802
  lines.push('');
801
- lines.push('No files were written.');
803
+ lines.push(translator.t('demo.no_files_written'));
802
804
  } else {
803
805
  lines.push('');
804
- lines.push('Next commands');
806
+ lines.push(translator.t('demo.next_commands'));
805
807
  lines.push(`- cd ${plan.targetRoot}`);
806
808
  lines.push('- npm run validate');
807
809
  lines.push('- npm start');
@@ -1,5 +1,6 @@
1
1
  const fs = require('fs');
2
2
  const path = require('path');
3
+ const { createTranslator } = require('./i18n/catalog');
3
4
 
4
5
  const REQUIRED_HEADINGS = [
5
6
  '## Background',
@@ -141,23 +142,31 @@ function formatMinimalTemplate(kind) {
141
142
  return lines.join('\n').trimEnd();
142
143
  }
143
144
 
144
- function formatMissingSectionsError(resolved, missingSections) {
145
+ function formatMissingSectionsError(resolved, missingSections, options = {}) {
146
+ const translator = createTranslator(options.language);
145
147
  return [
146
- `create-quiver: ${resolved.label.toLowerCase()} is missing required sections: ${missingSections.join(', ')}`,
148
+ `create-quiver: ${translator.t('handoff.error.missing_sections', {
149
+ sections: missingSections.join(', '),
150
+ subject: translator.t(`handoff.subject.${resolved.kind}`),
151
+ })}`,
147
152
  '',
148
- 'Accepted headings/aliases:',
153
+ translator.t('handoff.accepted_headings'),
149
154
  formatAliasGuidance(resolved.kind),
150
155
  '',
151
- 'Minimal template:',
156
+ translator.t('handoff.minimal_template'),
152
157
  formatMinimalTemplate(resolved.kind),
153
158
  ].join('\n');
154
159
  }
155
160
 
156
- function checkHandoff(handoffInput, repoRoot = process.cwd()) {
161
+ function checkHandoff(handoffInput, repoRoot = process.cwd(), options = {}) {
157
162
  const resolved = resolveHandoffPath(repoRoot, handoffInput);
163
+ const translator = createTranslator(options.language);
158
164
 
159
165
  if (!fs.existsSync(resolved.absolutePath)) {
160
- throw new Error(`create-quiver: missing ${resolved.label.toLowerCase()} file: ${resolved.relativePath}`);
166
+ throw new Error(`create-quiver: ${translator.t('handoff.error.missing_file', {
167
+ path: resolved.relativePath,
168
+ subject: translator.t(`handoff.subject.${resolved.kind}`),
169
+ })}`);
161
170
  }
162
171
 
163
172
  const text = fs.readFileSync(resolved.absolutePath, 'utf8');
@@ -165,7 +174,7 @@ function checkHandoff(handoffInput, repoRoot = process.cwd()) {
165
174
  ? validateHandoffSections(text)
166
175
  : validateBriefSections(text, resolved.kind);
167
176
  if (missingSections.length > 0) {
168
- throw new Error(formatMissingSectionsError(resolved, missingSections));
177
+ throw new Error(formatMissingSectionsError(resolved, missingSections, options));
169
178
  }
170
179
 
171
180
  return resolved;