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
@@ -0,0 +1,26 @@
1
+ const { createTranslator } = require('./catalog');
2
+
3
+ function translatorForHuman(options = {}) {
4
+ return createTranslator(options.language);
5
+ }
6
+
7
+ function formatStatus(status, translator = createTranslator()) {
8
+ const key = `status.${String(status || '').replace(/-/g, '_')}`;
9
+ const translated = translator.t(key);
10
+ return translated.startsWith('[missing:') ? String(status || '') : translated;
11
+ }
12
+
13
+ function formatWarningPrefix(message, translator = createTranslator()) {
14
+ const text = String(message || '');
15
+ const match = text.match(/^Warning: (.+)$/);
16
+ if (!match) {
17
+ return text;
18
+ }
19
+ return translator.t('common.warning', { message: match[1] });
20
+ }
21
+
22
+ module.exports = {
23
+ formatStatus,
24
+ formatWarningPrefix,
25
+ translatorForHuman,
26
+ };
@@ -0,0 +1,172 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+
4
+ const {
5
+ DEFAULT_LANGUAGE,
6
+ SUPPORTED_LANGUAGES,
7
+ normalizeLanguage,
8
+ resolveLanguage,
9
+ } = require('./language');
10
+
11
+ const MACHINE_TEMPLATE_PATHS = new Set([
12
+ 'package.template.json',
13
+ 'specs/[project-name]/slices/slice-template/slice.json',
14
+ ]);
15
+
16
+ function toTemplatePath(relativePath) {
17
+ const normalized = String(relativePath || '').replace(/\\/g, '/').replace(/^\.\//, '');
18
+ if (!normalized || path.isAbsolute(normalized) || normalized.split('/').includes('..')) {
19
+ throw new Error(`invalid template path: ${relativePath}`);
20
+ }
21
+ return normalized;
22
+ }
23
+
24
+ function isHumanTemplatePath(relativePath) {
25
+ const normalized = toTemplatePath(relativePath);
26
+ if (MACHINE_TEMPLATE_PATHS.has(normalized)) {
27
+ return false;
28
+ }
29
+ return normalized.endsWith('.md.template') || normalized.endsWith('.md');
30
+ }
31
+
32
+ function localizedTemplateRelativePath(relativePath, language) {
33
+ const normalized = toTemplatePath(relativePath);
34
+ const resolvedLanguage = normalizeLanguage(language) || DEFAULT_LANGUAGE;
35
+ if (resolvedLanguage === DEFAULT_LANGUAGE || !isHumanTemplatePath(normalized)) {
36
+ return normalized;
37
+ }
38
+
39
+ if (normalized.endsWith('.template')) {
40
+ const withoutTemplateSuffix = normalized.slice(0, -'.template'.length);
41
+ return `${withoutTemplateSuffix}.${resolvedLanguage}.template`;
42
+ }
43
+
44
+ const extension = path.posix.extname(normalized);
45
+ if (!extension) {
46
+ return `${normalized}.${resolvedLanguage}`;
47
+ }
48
+
49
+ return `${normalized.slice(0, -extension.length)}.${resolvedLanguage}${extension}`;
50
+ }
51
+
52
+ function resolveTemplateLanguage(options = {}) {
53
+ return resolveLanguage({
54
+ cliLanguage: options.language || options.cliLanguage,
55
+ env: options.env,
56
+ homeDir: options.homeDir,
57
+ intlLocale: options.intlLocale,
58
+ projectRoot: options.projectRoot,
59
+ });
60
+ }
61
+
62
+ function resolveLocalizedTemplatePath(templateRoot, relativePath, options = {}) {
63
+ const normalized = toTemplatePath(relativePath);
64
+ const templateLanguage = resolveTemplateLanguage(options);
65
+ const requestedLanguage = templateLanguage.language || DEFAULT_LANGUAGE;
66
+ const basePath = path.join(templateRoot, normalized);
67
+ const human = isHumanTemplatePath(normalized);
68
+
69
+ if (!human) {
70
+ return {
71
+ human: false,
72
+ language: '',
73
+ requestedLanguage,
74
+ relativePath: normalized,
75
+ templatePath: basePath,
76
+ localizedRelativePath: normalized,
77
+ fallback: false,
78
+ reason: 'machine-artifact',
79
+ languageSource: templateLanguage.source,
80
+ warnings: templateLanguage.warnings || [],
81
+ };
82
+ }
83
+
84
+ const localizedRelativePath = localizedTemplateRelativePath(normalized, requestedLanguage);
85
+ const localizedPath = path.join(templateRoot, localizedRelativePath);
86
+ if (localizedRelativePath !== normalized && fs.existsSync(localizedPath)) {
87
+ return {
88
+ human: true,
89
+ language: requestedLanguage,
90
+ requestedLanguage,
91
+ relativePath: normalized,
92
+ templatePath: localizedPath,
93
+ localizedRelativePath,
94
+ fallback: false,
95
+ reason: 'localized-template',
96
+ languageSource: templateLanguage.source,
97
+ warnings: templateLanguage.warnings || [],
98
+ };
99
+ }
100
+
101
+ if (fs.existsSync(basePath)) {
102
+ return {
103
+ human: true,
104
+ language: DEFAULT_LANGUAGE,
105
+ requestedLanguage,
106
+ relativePath: normalized,
107
+ templatePath: basePath,
108
+ localizedRelativePath: normalized,
109
+ fallback: requestedLanguage !== DEFAULT_LANGUAGE,
110
+ reason: requestedLanguage === DEFAULT_LANGUAGE ? 'default-template' : 'missing-localized-template',
111
+ languageSource: templateLanguage.source,
112
+ warnings: templateLanguage.warnings || [],
113
+ };
114
+ }
115
+
116
+ throw new Error(`create-quiver: missing template ${normalized} in ${templateRoot}`);
117
+ }
118
+
119
+ function collectLocalizedTemplateCoverage(templateRoot, relativePaths, options = {}) {
120
+ const languages = Array.isArray(options.languages) && options.languages.length > 0
121
+ ? options.languages.map((language) => normalizeLanguage(language)).filter(Boolean)
122
+ : SUPPORTED_LANGUAGES;
123
+ const missing = [];
124
+ const checked = [];
125
+ const skipped = [];
126
+
127
+ for (const relativePath of relativePaths) {
128
+ const normalized = toTemplatePath(relativePath);
129
+ if (!isHumanTemplatePath(normalized)) {
130
+ skipped.push({
131
+ relativePath: normalized,
132
+ reason: 'machine-artifact',
133
+ });
134
+ continue;
135
+ }
136
+
137
+ for (const language of languages) {
138
+ if (language === DEFAULT_LANGUAGE) {
139
+ continue;
140
+ }
141
+ const localizedRelativePath = localizedTemplateRelativePath(normalized, language);
142
+ checked.push({
143
+ language,
144
+ relativePath: normalized,
145
+ localizedRelativePath,
146
+ });
147
+ if (!fs.existsSync(path.join(templateRoot, localizedRelativePath))) {
148
+ missing.push({
149
+ language,
150
+ relativePath: normalized,
151
+ localizedRelativePath,
152
+ });
153
+ }
154
+ }
155
+ }
156
+
157
+ return {
158
+ ok: missing.length === 0,
159
+ checked,
160
+ missing,
161
+ skipped,
162
+ };
163
+ }
164
+
165
+ module.exports = {
166
+ collectLocalizedTemplateCoverage,
167
+ isHumanTemplatePath,
168
+ localizedTemplateRelativePath,
169
+ resolveLocalizedTemplatePath,
170
+ resolveTemplateLanguage,
171
+ toTemplatePath,
172
+ };
@@ -7,6 +7,7 @@ const {
7
7
  quiverInternalPaths,
8
8
  resolveInitPackageScripts,
9
9
  } = require('./init-layout');
10
+ const { resolveLocalizedTemplatePath } = require('./i18n/templates');
10
11
  const { writeState } = require('./state');
11
12
 
12
13
  function ensureDir(dirPath) {
@@ -118,6 +119,17 @@ function copyRenderedFile(sourcePath, destinationPath, replacements, skipIfExist
118
119
  return 'created';
119
120
  }
120
121
 
122
+ function resolveGeneratedTemplatePath(templateRoot, relativePath, options = {}) {
123
+ const basePath = path.join(templateRoot, relativePath);
124
+ if (!fs.existsSync(basePath)) {
125
+ return '';
126
+ }
127
+ return resolveLocalizedTemplatePath(templateRoot, relativePath, {
128
+ language: options.language,
129
+ projectRoot: options.projectRoot,
130
+ }).templatePath;
131
+ }
132
+
121
133
  function copyBinaryFile(sourcePath, destinationPath, skipIfExists) {
122
134
  if (skipIfExists && fs.existsSync(destinationPath)) {
123
135
  return 'skipped';
@@ -686,6 +698,7 @@ function initializeProjectDocs(options) {
686
698
  migrateMode = false,
687
699
  profile = 'default',
688
700
  templateRoot: providedTemplateRoot = '',
701
+ language = '',
689
702
  } = options;
690
703
 
691
704
  const templateRoot = providedTemplateRoot || path.join(projectRoot, 'docs-template');
@@ -747,8 +760,9 @@ function initializeProjectDocs(options) {
747
760
  operations.push({ source: 'packaged templates', destination: '.quiver/templates', result: 'merged' });
748
761
  }
749
762
 
750
- const agentsSourcePath = path.join(templateRoot, 'AGENTS.md.template');
751
- if (fs.existsSync(agentsSourcePath)) {
763
+ const templateLanguageOptions = { language, projectRoot };
764
+ const agentsSourcePath = resolveGeneratedTemplatePath(templateRoot, 'AGENTS.md.template', templateLanguageOptions);
765
+ if (agentsSourcePath) {
752
766
  const agentsDestinationPath = path.join(projectRoot, 'AGENTS.md');
753
767
  const result = copyRenderedFile(agentsSourcePath, agentsDestinationPath, replacements, true);
754
768
  operations.push({ source: 'AGENTS.md.template', destination: 'AGENTS.md', result });
@@ -814,8 +828,8 @@ function initializeProjectDocs(options) {
814
828
  continue;
815
829
  }
816
830
 
817
- const sourcePath = path.join(templateRoot, source);
818
- if (!fs.existsSync(sourcePath)) {
831
+ const sourcePath = resolveGeneratedTemplatePath(templateRoot, source, templateLanguageOptions);
832
+ if (!sourcePath) {
819
833
  continue;
820
834
  }
821
835
 
@@ -125,6 +125,7 @@ function normalizeInitLayoutOptions(options = {}) {
125
125
  dryRun: options.dryRun === true,
126
126
  full,
127
127
  includeTemplates: options.includeTemplates === true,
128
+ language: typeof options.language === 'string' ? options.language : '',
128
129
  legacyScripts: options.legacyScripts === true,
129
130
  minimal,
130
131
  skipInstall: options.skipInstall === true,
@@ -353,6 +354,7 @@ function buildInitLayout(projectRoot, options = {}) {
353
354
  projectSlug,
354
355
  targetRoot: path.resolve(projectRoot),
355
356
  flags: normalized,
357
+ language: normalized.language,
356
358
  operations,
357
359
  ignoredPaths: [...new Set(ignoredPaths)],
358
360
  risks,
@@ -374,6 +376,10 @@ function formatInitLayoutPlan(plan) {
374
376
  lines.push(`- Slug: ${plan.projectSlug}`);
375
377
  lines.push(`- Target: ${plan.targetRoot}`);
376
378
  lines.push(`- Profile: ${plan.profile}`);
379
+ if (plan.language) {
380
+ lines.push(`- Language: ${plan.language}`);
381
+ lines.push('- Language config: write .quiver/config.json');
382
+ }
377
383
  lines.push(`- Entry point: ${entryPoint}`);
378
384
  lines.push(`- Planned create: ${plan.summary.create}`);
379
385
  lines.push(`- Planned update: ${plan.summary.update}`);
@@ -2,6 +2,7 @@ const fs = require('fs');
2
2
  const path = require('path');
3
3
  const { branchDelete, catFileExists, currentBranch, fetchBranch, fetchRemote, hasLocalBranch, hasRemoteBranch, isGitWorktree, isLinkedWorktree, lsRemoteHeads, mergeBaseIsAncestor, revListCount, runGit, statusPorcelain, worktreeAdd, worktreeList, worktreePrune, worktreeRemove } = require('./git');
4
4
  const { parseJsonWithComments } = require('./json');
5
+ const { createTranslator } = require('./i18n/catalog');
5
6
  const { writeFrontMatter } = require('./init-docs');
6
7
  const { withLockSync } = require('./locks');
7
8
  const { relativePosixPath, resolveTargetRoot } = require('./paths');
@@ -12,6 +13,10 @@ function ensureDir(dirPath) {
12
13
  fs.mkdirSync(dirPath, { recursive: true });
13
14
  }
14
15
 
16
+ function lifecycleTranslator(options = {}) {
17
+ return createTranslator(options.language);
18
+ }
19
+
15
20
  function estimateTokenCost(text) {
16
21
  return Math.max(1, Math.ceil(Buffer.byteLength(text, 'utf8') / 4));
17
22
  }
@@ -267,7 +272,7 @@ function refreshActiveSlicesBoard(repoRoot) {
267
272
  return outputPath;
268
273
  }
269
274
 
270
- function resolveBaseRef(repoRoot, baseBranch) {
275
+ function resolveBaseRef(repoRoot, baseBranch, translator = lifecycleTranslator()) {
271
276
  if (hasLocalBranch(repoRoot, baseBranch)) {
272
277
  return baseBranch;
273
278
  }
@@ -279,10 +284,10 @@ function resolveBaseRef(repoRoot, baseBranch) {
279
284
  fetchBranch(repoRoot, baseBranch);
280
285
  return `origin/${baseBranch}`;
281
286
  } catch {
282
- throw new Error(`create-quiver: origin existe pero no se pudo actualizar '${baseBranch}'. Revisa conectividad o crea la rama local '${baseBranch}' antes de correr start-slice.`);
287
+ throw new Error(`create-quiver: ${translator.t('lifecycle.base_ref.fetch_failed', { base: baseBranch })}`);
283
288
  }
284
289
  }
285
- throw new Error(`create-quiver: no se encontró '${baseBranch}' como rama local ni como ref remota 'origin/${baseBranch}'. Crea la rama base localmente o configura origin antes de correr start-slice.`);
290
+ throw new Error(`create-quiver: ${translator.t('lifecycle.base_ref.missing', { base: baseBranch, remoteRef: `origin/${baseBranch}` })}`);
286
291
  }
287
292
 
288
293
  function findExistingWorktreeForBranch(repoRoot, branchName) {
@@ -326,6 +331,7 @@ function formatNestedSliceWorktree(branchName, existingWorktreePath = '') {
326
331
  }
327
332
 
328
333
  function startSlice(sliceInput, options = {}) {
334
+ const translator = lifecycleTranslator(options);
329
335
  const allowDraft = options.allowDraft === true || process.env.ALLOW_DRAFT_SLICE === '1';
330
336
  const repoRoot = runGit(['rev-parse', '--show-toplevel'], process.cwd());
331
337
  const slice = resolveSliceContext(repoRoot, sliceInput);
@@ -338,19 +344,19 @@ function startSlice(sliceInput, options = {}) {
338
344
  validateSliceMetaForStart(slice);
339
345
 
340
346
  if (slice.status === 'blocked') {
341
- throw new Error('create-quiver: el slice esta bloqueado (status=blocked). Resolve el bloqueante antes de iniciar.');
347
+ throw new Error(`create-quiver: ${translator.t('lifecycle.start.error.blocked')}`);
342
348
  }
343
349
  if (slice.status === 'cancelled') {
344
- throw new Error('create-quiver: el slice esta cancelado (status=cancelled).');
350
+ throw new Error(`create-quiver: ${translator.t('lifecycle.start.error.cancelled')}`);
345
351
  }
346
352
  if (slice.status === 'completed') {
347
- console.log('WARN: el slice ya figura como completed. Si realmente corresponde reejecutarlo, cambia el status a in_progress.');
353
+ console.log(translator.t('lifecycle.start.warn.completed'));
348
354
  }
349
355
  if (slice.status === 'draft' && !allowDraft) {
350
- throw new Error("create-quiver: el slice esta en estado 'draft'. Marca el slice como 'ready' o usa --allow-draft para un bootstrap intencional.");
356
+ throw new Error(`create-quiver: ${translator.t('lifecycle.start.error.draft')}`);
351
357
  }
352
358
  if (slice.status === 'draft') {
353
- console.log('WARN: bootstrap intencional para un slice en draft.');
359
+ console.log(translator.t('lifecycle.start.warn.draft'));
354
360
  }
355
361
 
356
362
  return withLockSync(repoRoot, `slice-worktree-${slice.branchName}`, {
@@ -375,19 +381,19 @@ function startSlice(sliceInput, options = {}) {
375
381
  writeWorktreeContext(existingWorktreePath, slice, slice.branchName);
376
382
  const activeSlice = writeActiveSlice(repoRoot, slice);
377
383
  if (activeSlice.replaced) {
378
- console.log('WARN: Reemplazando docs/ai/ACTIVE_SLICE.md existente.');
384
+ console.log(translator.t('lifecycle.active_slice.replaced'));
379
385
  } else {
380
- console.log('Wrote docs/ai/ACTIVE_SLICE.md');
386
+ console.log(translator.t('lifecycle.active_slice.wrote'));
381
387
  }
382
388
  refreshActiveSlicesBoard(repoRoot);
383
- console.log('La rama ya tiene un worktree asociado.');
384
- console.log(`Alias: ${toAlias(slice.ticket)}`);
385
- console.log(`Spec: ${slice.specSlug}`);
386
- console.log(`Slice: ${slice.sliceId}`);
387
- console.log(`Ticket: ${slice.ticket}`);
388
- console.log(`Rama: ${slice.branchName}`);
389
- console.log(`Base: ${slice.baseBranch}`);
390
- console.log(`Worktree: ${existingWorktreePath}`);
389
+ console.log(translator.t('lifecycle.start.existing_worktree'));
390
+ console.log(translator.t('lifecycle.label.alias', { value: toAlias(slice.ticket) }));
391
+ console.log(translator.t('lifecycle.label.spec', { value: slice.specSlug }));
392
+ console.log(translator.t('lifecycle.label.slice', { value: slice.sliceId }));
393
+ console.log(translator.t('lifecycle.label.ticket', { value: slice.ticket }));
394
+ console.log(translator.t('lifecycle.label.branch', { value: slice.branchName }));
395
+ console.log(translator.t('lifecycle.label.base', { value: slice.baseBranch }));
396
+ console.log(translator.t('lifecycle.label.worktree', { value: existingWorktreePath }));
391
397
  return { worktreePath: existingWorktreePath, reused: true };
392
398
  }
393
399
 
@@ -418,35 +424,36 @@ function startSlice(sliceInput, options = {}) {
418
424
  }
419
425
  worktreeAdd(repoRoot, worktreePath, slice.branchName);
420
426
  } else {
421
- const baseRef = resolveBaseRef(repoRoot, slice.baseBranch);
427
+ const baseRef = resolveBaseRef(repoRoot, slice.baseBranch, translator);
422
428
  worktreeAdd(repoRoot, worktreePath, baseRef, { branch: slice.branchName });
423
429
  }
424
430
 
425
431
  writeWorktreeContext(worktreePath, slice, slice.branchName);
426
432
  const activeSlice = writeActiveSlice(repoRoot, slice);
427
433
  if (activeSlice.replaced) {
428
- console.log('WARN: Reemplazando docs/ai/ACTIVE_SLICE.md existente.');
434
+ console.log(translator.t('lifecycle.active_slice.replaced'));
429
435
  } else {
430
- console.log('Wrote docs/ai/ACTIVE_SLICE.md');
436
+ console.log(translator.t('lifecycle.active_slice.wrote'));
431
437
  }
432
438
  refreshActiveSlicesBoard(repoRoot);
433
439
 
434
- console.log('Slice listo para trabajar.');
435
- console.log(`Alias: ${toAlias(slice.ticket)}`);
436
- console.log(`Spec: ${slice.specSlug}`);
437
- console.log(`Slice: ${slice.sliceId}`);
438
- console.log(`Ticket: ${slice.ticket}`);
439
- console.log(`Tipo de rama: ${slice.branchType}`);
440
- console.log(`Base: ${slice.baseBranch}`);
441
- console.log(`Slug: ${slice.branchSlug}`);
442
- console.log(`Rama: ${slice.branchName}`);
443
- console.log(`Worktree: ${worktreePath}`);
444
- console.log(`Contexto: ${worktreePath}/WORKTREE_CONTEXT.md`);
440
+ console.log(translator.t('lifecycle.start.ready'));
441
+ console.log(translator.t('lifecycle.label.alias', { value: toAlias(slice.ticket) }));
442
+ console.log(translator.t('lifecycle.label.spec', { value: slice.specSlug }));
443
+ console.log(translator.t('lifecycle.label.slice', { value: slice.sliceId }));
444
+ console.log(translator.t('lifecycle.label.ticket', { value: slice.ticket }));
445
+ console.log(translator.t('lifecycle.label.branch_type', { value: slice.branchType }));
446
+ console.log(translator.t('lifecycle.label.base', { value: slice.baseBranch }));
447
+ console.log(translator.t('lifecycle.label.slug', { value: slice.branchSlug }));
448
+ console.log(translator.t('lifecycle.label.branch', { value: slice.branchName }));
449
+ console.log(translator.t('lifecycle.label.worktree', { value: worktreePath }));
450
+ console.log(translator.t('lifecycle.label.context', { value: `${worktreePath}/WORKTREE_CONTEXT.md` }));
445
451
  return { worktreePath, reused: false };
446
452
  });
447
453
  }
448
454
 
449
455
  function cleanupSlice(sliceInput, options = {}) {
456
+ const translator = lifecycleTranslator(options);
450
457
  const closeBaseline = options.closeBaseline === true;
451
458
  const discard = options.discard === true;
452
459
  const forceDelete = options.force === true;
@@ -457,18 +464,18 @@ function cleanupSlice(sliceInput, options = {}) {
457
464
  const worktreePath = path.join(worktreesRoot, safeBranchName(slice.branchName));
458
465
 
459
466
  if (slice.isBaseline && !closeBaseline) {
460
- console.log(`INFO: '${slice.sliceId}' es baseline. El worktree queda congelado por default.`);
461
- console.log('INFO: Usa --close-baseline solo cuando la primera ola del spec ya este estable o mergeada.');
467
+ console.log(translator.t('lifecycle.cleanup.baseline.info', { slice: slice.sliceId }));
468
+ console.log(translator.t('lifecycle.cleanup.baseline.close_hint'));
462
469
  return;
463
470
  }
464
471
 
465
472
  if (!discard) {
466
473
  const branch = currentBranch(repoRoot);
467
474
  if (branch !== 'develop') {
468
- throw new Error(`create-quiver: el cleanup normal debe correrse desde develop. Rama actual: ${branch}`);
475
+ throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.branch', { branch })}`);
469
476
  }
470
477
  if (statusPorcelain(repoRoot) !== '') {
471
- throw new Error('create-quiver: el checkout actual no esta limpio. Limpialo antes del cleanup.');
478
+ throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.dirty')}`);
472
479
  }
473
480
 
474
481
  try {
@@ -480,12 +487,12 @@ function cleanupSlice(sliceInput, options = {}) {
480
487
  const localDevelopSha = runGit(['rev-parse', 'HEAD'], repoRoot);
481
488
  const remoteDevelopSha = runGit(['rev-parse', 'origin/develop'], repoRoot);
482
489
  if (localDevelopSha !== remoteDevelopSha) {
483
- throw new Error('create-quiver: develop local no esta actualizado. Ejecuta git pull --ff-only antes del cleanup.');
490
+ throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.develop_stale')}`);
484
491
  }
485
492
 
486
493
  if (hasLocalBranch(repoRoot, slice.branchName)) {
487
494
  if (!mergeBaseIsAncestor(repoRoot, slice.branchName, 'origin/develop')) {
488
- throw new Error(`create-quiver: la rama '${slice.branchName}' no esta mergeada en origin/develop. Usa --discard si el slice se descarta.`);
495
+ throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.unmerged', { branch: slice.branchName })}`);
489
496
  }
490
497
  }
491
498
  }
@@ -493,38 +500,38 @@ function cleanupSlice(sliceInput, options = {}) {
493
500
  const worktreeExists = fs.existsSync(worktreePath);
494
501
  const branchExists = hasLocalBranch(repoRoot, slice.branchName);
495
502
  if (!worktreeExists && !branchExists) {
496
- throw new Error(`create-quiver: no existe worktree ni rama local para '${slice.sliceId}'.`);
503
+ throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.missing', { slice: slice.sliceId })}`);
497
504
  }
498
505
 
499
506
  const removeWorktree = () => worktreeRemove(repoRoot, worktreePath, forceDelete || discard);
500
507
  const removeBranch = () => branchDelete(repoRoot, slice.branchName, forceDelete || discard);
501
508
 
502
509
  if (dryRun) {
503
- console.log(`DRY RUN: slice=${slice.sliceId} branch=${slice.branchName}`);
510
+ console.log(translator.t('lifecycle.cleanup.dry_run.slice', { slice: slice.sliceId, branch: slice.branchName }));
504
511
  if (worktreeExists) {
505
- console.log(`DRY RUN: git worktree remove ${forceDelete || discard ? '--force ' : ''}${worktreePath}`);
512
+ console.log(translator.t('lifecycle.cleanup.dry_run.worktree', { force: forceDelete || discard ? '--force ' : '', path: worktreePath }));
506
513
  }
507
514
  if (branchExists) {
508
- console.log(`DRY RUN: git branch ${forceDelete || discard ? '-D' : '-d'} ${slice.branchName}`);
515
+ console.log(translator.t('lifecycle.cleanup.dry_run.branch', { flag: forceDelete || discard ? '-D' : '-d', branch: slice.branchName }));
509
516
  }
510
517
  return;
511
518
  }
512
519
 
513
520
  if (worktreeExists) {
514
521
  removeWorktree();
515
- console.log(`PASS: Worktree eliminado: ${worktreePath}`);
522
+ console.log(translator.t('lifecycle.cleanup.removed_worktree', { path: worktreePath }));
516
523
  }
517
524
  if (branchExists) {
518
525
  removeBranch();
519
- console.log(`PASS: Rama local eliminada: ${slice.branchName}`);
526
+ console.log(translator.t('lifecycle.cleanup.removed_branch', { branch: slice.branchName }));
520
527
  }
521
528
 
522
529
  if (removeActiveSlice(repoRoot)) {
523
- console.log('PASS: ACTIVE_SLICE.md eliminado');
530
+ console.log(translator.t('lifecycle.cleanup.removed_active_slice'));
524
531
  }
525
532
 
526
533
  refreshActiveSlicesBoard(repoRoot);
527
- console.log(`PASS: Cleanup finalizado para '${slice.sliceId}'.`);
534
+ console.log(translator.t('lifecycle.cleanup.finished', { slice: slice.sliceId }));
528
535
  }
529
536
 
530
537
  module.exports = {