create-quiver 0.15.3 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (390) hide show
  1. package/.github/pull_request_template.md +17 -0
  2. package/.github/workflows/ci.yml +79 -0
  3. package/.markdown-link-check.json +15 -0
  4. package/.markdownlint.json +11 -0
  5. package/.quiver/runs/run-2026-06-09t19-14-39z/approvals.json +5 -0
  6. package/.quiver/runs/run-2026-06-09t19-14-39z/decisions.md +2 -0
  7. package/.quiver/runs/run-2026-06-09t19-14-39z/requirement.md +0 -0
  8. package/.quiver/runs/run-2026-06-09t19-14-39z/snapshots/20260609T191439Z/docs/INDEX.md +97 -0
  9. package/.quiver/runs/run-2026-06-09t19-14-39z/snapshots/20260609T191439Z/manifest.json +61 -0
  10. package/.quiver/runs/run-2026-06-09t19-14-39z/state.json +28 -0
  11. package/ACTIVE_SLICES.md +43 -0
  12. package/AGENTS.md.es.template +37 -0
  13. package/ARCHITECTURE.md +133 -0
  14. package/CHANGELOG.md +12 -0
  15. package/CONTRIBUTING.md +174 -9
  16. package/README.md +10 -1
  17. package/ROADMAP.md +4 -0
  18. package/SECURITY.md +9 -2
  19. package/auditoria-ux-ui-performance-documentacion.md +705 -0
  20. package/copys-landing-page.md +244 -0
  21. package/docs/AI_CONTEXT.md.es.template +37 -0
  22. package/docs/AI_CONTEXT.md.template +3 -1
  23. package/docs/AI_ONBOARDING_PROMPT.md.es.template +22 -0
  24. package/docs/CLI_UX_GUIDE.md +55 -1
  25. package/docs/COMMANDS.md.es.template +28 -0
  26. package/docs/COMMANDS.md.template +20 -6
  27. package/docs/CONTEXTO.md.es.template +33 -0
  28. package/docs/DECISIONS.md.es.template +17 -0
  29. package/docs/GITFLOW_PR_GUIDE.md +73 -11
  30. package/docs/GITFLOW_PR_GUIDE.md.es.template +84 -0
  31. package/docs/GITFLOW_PR_GUIDE.md.template +72 -10
  32. package/docs/INDEX.md +11 -1
  33. package/docs/INDEX.md.es.template +36 -0
  34. package/docs/QUICK.md.template +2 -1
  35. package/docs/STANDARD.md.template +2 -1
  36. package/docs/STATUS.md.es.template +28 -0
  37. package/docs/SUPPORT_MATRIX.md.es.template +22 -0
  38. package/docs/TESTING_GUIDE_FOR_AI.md.es.template +19 -0
  39. package/docs/TROUBLESHOOTING.md.es.template +35 -0
  40. package/docs/WORKFLOW.md.es.template +31 -0
  41. package/docs/WORKFLOW.md.template +6 -4
  42. package/docs/ai/ACTIVE_SLICE.md +61 -0
  43. package/docs/ai/LESSONS.md.es.template +24 -0
  44. package/docs/getting-started/installation.md +26 -0
  45. package/docs/reference/commands.md +159 -7
  46. package/docs/reference/slice-schema.md +37 -0
  47. package/docs/schema/slice.schema.json +221 -0
  48. package/docs/specs/01-spec/01-slice/01-slice.json +36 -0
  49. package/docs/specs/01-spec/01-slice/01-slice.md +106 -0
  50. package/docs/specs/01-spec/01-slice/CLOSURE_BRIEF.md +80 -0
  51. package/docs/specs/01-spec/01-slice/EXECUTION_BRIEF.md +39 -0
  52. package/docs/specs/01-spec/02-slice/02-slice.json +36 -0
  53. package/docs/specs/01-spec/02-slice/02-slice.md +108 -0
  54. package/docs/specs/01-spec/02-slice/CLOSURE_BRIEF.md +88 -0
  55. package/docs/specs/01-spec/02-slice/EXECUTION_BRIEF.md +40 -0
  56. package/docs/specs/01-spec/03-slice/03-slice.json +36 -0
  57. package/docs/specs/01-spec/03-slice/03-slice.md +103 -0
  58. package/docs/specs/01-spec/03-slice/CLOSURE_BRIEF.md +54 -0
  59. package/docs/specs/01-spec/03-slice/EXECUTION_BRIEF.md +39 -0
  60. package/docs/specs/01-spec/04-slice/04-slice.json +36 -0
  61. package/docs/specs/01-spec/04-slice/04-slice.md +107 -0
  62. package/docs/specs/01-spec/04-slice/CLOSURE_BRIEF.md +46 -0
  63. package/docs/specs/01-spec/04-slice/EXECUTION_BRIEF.md +39 -0
  64. package/docs/specs/01-spec/05-slice/05-slice.json +36 -0
  65. package/docs/specs/01-spec/05-slice/05-slice.md +106 -0
  66. package/docs/specs/01-spec/05-slice/CLOSURE_BRIEF.md +84 -0
  67. package/docs/specs/01-spec/05-slice/EXECUTION_BRIEF.md +109 -0
  68. package/docs/specs/01-spec/06-slice/06-slice.json +36 -0
  69. package/docs/specs/01-spec/06-slice/06-slice.md +107 -0
  70. package/docs/specs/01-spec/06-slice/CLOSURE_BRIEF.md +67 -0
  71. package/docs/specs/01-spec/06-slice/EXECUTION_BRIEF.md +39 -0
  72. package/docs/specs/01-spec/07-slice/07-slice.json +36 -0
  73. package/docs/specs/01-spec/07-slice/07-slice.md +105 -0
  74. package/docs/specs/01-spec/07-slice/CLOSURE_BRIEF.md +71 -0
  75. package/docs/specs/01-spec/07-slice/EXECUTION_BRIEF.md +39 -0
  76. package/docs/specs/01-spec/08-slice/08-slice.json +36 -0
  77. package/docs/specs/01-spec/08-slice/08-slice.md +105 -0
  78. package/docs/specs/01-spec/08-slice/CLOSURE_BRIEF.md +114 -0
  79. package/docs/specs/01-spec/08-slice/EXECUTION_BRIEF.md +39 -0
  80. package/docs/specs/01-spec/CLOSURE_BRIEF.md +87 -0
  81. package/docs/specs/01-spec/spec.md +197 -0
  82. package/docs/workflows/full-ai-spec-to-pr.md +46 -3
  83. package/i18n/es/docs/GITFLOW_PR_GUIDE.md.template +38 -1
  84. package/package.json +27 -1
  85. package/pr.md +154 -0
  86. package/scripts/package-quiver.sh +82 -2
  87. package/scripts/release-quiver.sh +14 -3
  88. package/specs/[project-name]/slices/pr.md.template +19 -0
  89. package/specs/quiver-v37-cli-i18n-foundation/EVIDENCE_REPORT.md +73 -0
  90. package/specs/quiver-v37-cli-i18n-foundation/EXECUTION_PLAN.md +34 -0
  91. package/specs/quiver-v37-cli-i18n-foundation/SPEC.md +91 -0
  92. package/specs/quiver-v37-cli-i18n-foundation/STATUS.md +29 -0
  93. package/specs/quiver-v37-cli-i18n-foundation/pr.md +97 -0
  94. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/CLOSURE_BRIEF.md +10 -0
  95. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/EXECUTION_BRIEF.md +22 -0
  96. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/slice.json +54 -0
  97. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/CLOSURE_BRIEF.md +30 -0
  98. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/EXECUTION_BRIEF.md +27 -0
  99. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/slice.json +66 -0
  100. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/CLOSURE_BRIEF.md +27 -0
  101. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/EXECUTION_BRIEF.md +26 -0
  102. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/slice.json +62 -0
  103. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/CLOSURE_BRIEF.md +32 -0
  104. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/EXECUTION_BRIEF.md +25 -0
  105. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/slice.json +66 -0
  106. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/CLOSURE_BRIEF.md +30 -0
  107. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/EXECUTION_BRIEF.md +24 -0
  108. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/slice.json +65 -0
  109. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/CLOSURE_BRIEF.md +27 -0
  110. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/EXECUTION_BRIEF.md +23 -0
  111. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/slice.json +67 -0
  112. package/specs/quiver-v38-cli-i18n-read-only-commands/EVIDENCE_REPORT.md +69 -0
  113. package/specs/quiver-v38-cli-i18n-read-only-commands/EXECUTION_PLAN.md +25 -0
  114. package/specs/quiver-v38-cli-i18n-read-only-commands/SPEC.md +52 -0
  115. package/specs/quiver-v38-cli-i18n-read-only-commands/STATUS.md +24 -0
  116. package/specs/quiver-v38-cli-i18n-read-only-commands/pr.md +119 -0
  117. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/CLOSURE_BRIEF.md +10 -0
  118. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/EXECUTION_BRIEF.md +21 -0
  119. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/slice.json +53 -0
  120. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/CLOSURE_BRIEF.md +17 -0
  121. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/EXECUTION_BRIEF.md +23 -0
  122. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/slice.json +69 -0
  123. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/CLOSURE_BRIEF.md +13 -0
  124. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/EXECUTION_BRIEF.md +22 -0
  125. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/slice.json +77 -0
  126. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/CLOSURE_BRIEF.md +12 -0
  127. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/EXECUTION_BRIEF.md +22 -0
  128. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/slice.json +66 -0
  129. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/CLOSURE_BRIEF.md +13 -0
  130. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/EXECUTION_BRIEF.md +22 -0
  131. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/slice.json +61 -0
  132. package/specs/quiver-v39-cli-i18n-setup-onboarding/EVIDENCE_REPORT.md +71 -0
  133. package/specs/quiver-v39-cli-i18n-setup-onboarding/EXECUTION_PLAN.md +25 -0
  134. package/specs/quiver-v39-cli-i18n-setup-onboarding/SPEC.md +53 -0
  135. package/specs/quiver-v39-cli-i18n-setup-onboarding/STATUS.md +24 -0
  136. package/specs/quiver-v39-cli-i18n-setup-onboarding/pr.md +104 -0
  137. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/CLOSURE_BRIEF.md +10 -0
  138. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/EXECUTION_BRIEF.md +21 -0
  139. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/slice.json +53 -0
  140. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/CLOSURE_BRIEF.md +12 -0
  141. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/EXECUTION_BRIEF.md +23 -0
  142. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/slice.json +68 -0
  143. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/CLOSURE_BRIEF.md +12 -0
  144. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/EXECUTION_BRIEF.md +23 -0
  145. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/slice.json +62 -0
  146. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/CLOSURE_BRIEF.md +12 -0
  147. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/EXECUTION_BRIEF.md +22 -0
  148. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/slice.json +72 -0
  149. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/CLOSURE_BRIEF.md +15 -0
  150. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/EXECUTION_BRIEF.md +22 -0
  151. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/slice.json +61 -0
  152. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/EVIDENCE_REPORT.md +50 -0
  153. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/EXECUTION_PLAN.md +25 -0
  154. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/SPEC.md +52 -0
  155. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/STATUS.md +24 -0
  156. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/pr.md +94 -0
  157. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/CLOSURE_BRIEF.md +10 -0
  158. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/EXECUTION_BRIEF.md +21 -0
  159. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/slice.json +53 -0
  160. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/CLOSURE_BRIEF.md +12 -0
  161. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/EXECUTION_BRIEF.md +22 -0
  162. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/slice.json +63 -0
  163. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/CLOSURE_BRIEF.md +10 -0
  164. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/EXECUTION_BRIEF.md +22 -0
  165. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/slice.json +63 -0
  166. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/CLOSURE_BRIEF.md +10 -0
  167. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/EXECUTION_BRIEF.md +22 -0
  168. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/slice.json +72 -0
  169. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/CLOSURE_BRIEF.md +15 -0
  170. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/EXECUTION_BRIEF.md +22 -0
  171. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/slice.json +69 -0
  172. package/specs/quiver-v41-cli-i18n-ai-lifecycle/EVIDENCE_REPORT.md +90 -0
  173. package/specs/quiver-v41-cli-i18n-ai-lifecycle/EXECUTION_PLAN.md +33 -0
  174. package/specs/quiver-v41-cli-i18n-ai-lifecycle/SPEC.md +57 -0
  175. package/specs/quiver-v41-cli-i18n-ai-lifecycle/STATUS.md +26 -0
  176. package/specs/quiver-v41-cli-i18n-ai-lifecycle/pr.md +103 -0
  177. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/CLOSURE_BRIEF.md +10 -0
  178. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/EXECUTION_BRIEF.md +21 -0
  179. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/slice.json +53 -0
  180. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/CLOSURE_BRIEF.md +13 -0
  181. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/EXECUTION_BRIEF.md +22 -0
  182. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/slice.json +68 -0
  183. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/CLOSURE_BRIEF.md +12 -0
  184. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/EXECUTION_BRIEF.md +22 -0
  185. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/slice.json +66 -0
  186. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/CLOSURE_BRIEF.md +12 -0
  187. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/EXECUTION_BRIEF.md +23 -0
  188. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/slice.json +68 -0
  189. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/CLOSURE_BRIEF.md +13 -0
  190. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/EXECUTION_BRIEF.md +23 -0
  191. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/slice.json +72 -0
  192. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/CLOSURE_BRIEF.md +15 -0
  193. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/EXECUTION_BRIEF.md +22 -0
  194. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/slice.json +66 -0
  195. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/CLOSURE_BRIEF.md +11 -0
  196. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/EXECUTION_BRIEF.md +22 -0
  197. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/slice.json +70 -0
  198. package/specs/quiver-v42-cli-i18n-generated-docs/EVIDENCE_REPORT.md +64 -0
  199. package/specs/quiver-v42-cli-i18n-generated-docs/EXECUTION_PLAN.md +26 -0
  200. package/specs/quiver-v42-cli-i18n-generated-docs/SPEC.md +52 -0
  201. package/specs/quiver-v42-cli-i18n-generated-docs/STATUS.md +24 -0
  202. package/specs/quiver-v42-cli-i18n-generated-docs/pr.md +125 -0
  203. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/CLOSURE_BRIEF.md +10 -0
  204. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/EXECUTION_BRIEF.md +21 -0
  205. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/slice.json +53 -0
  206. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/CLOSURE_BRIEF.md +10 -0
  207. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/EXECUTION_BRIEF.md +22 -0
  208. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/slice.json +62 -0
  209. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/CLOSURE_BRIEF.md +11 -0
  210. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/EXECUTION_BRIEF.md +22 -0
  211. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/slice.json +72 -0
  212. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/CLOSURE_BRIEF.md +12 -0
  213. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/EXECUTION_BRIEF.md +22 -0
  214. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/slice.json +60 -0
  215. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/CLOSURE_BRIEF.md +16 -0
  216. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/EXECUTION_BRIEF.md +22 -0
  217. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/slice.json +62 -0
  218. package/specs/quiver-v43-cli-i18n-audit-release-readiness/EVIDENCE_REPORT.md +203 -0
  219. package/specs/quiver-v43-cli-i18n-audit-release-readiness/EXECUTION_PLAN.md +27 -0
  220. package/specs/quiver-v43-cli-i18n-audit-release-readiness/SPEC.md +54 -0
  221. package/specs/quiver-v43-cli-i18n-audit-release-readiness/STATUS.md +24 -0
  222. package/specs/quiver-v43-cli-i18n-audit-release-readiness/command-language-mode-matrix.json +636 -0
  223. package/specs/quiver-v43-cli-i18n-audit-release-readiness/cross-platform-smoke-matrix.md +35 -0
  224. package/specs/quiver-v43-cli-i18n-audit-release-readiness/pr.md +155 -0
  225. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/CLOSURE_BRIEF.md +10 -0
  226. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/EXECUTION_BRIEF.md +21 -0
  227. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/slice.json +53 -0
  228. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/CLOSURE_BRIEF.md +13 -0
  229. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/EXECUTION_BRIEF.md +23 -0
  230. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/slice.json +62 -0
  231. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/CLOSURE_BRIEF.md +18 -0
  232. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/EXECUTION_BRIEF.md +22 -0
  233. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/slice.json +59 -0
  234. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/CLOSURE_BRIEF.md +15 -0
  235. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/EXECUTION_BRIEF.md +23 -0
  236. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/slice.json +62 -0
  237. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/CLOSURE_BRIEF.md +17 -0
  238. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/EXECUTION_BRIEF.md +24 -0
  239. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/slice.json +66 -0
  240. package/specs/quiver-v44-provider-live-output-tui-lite/EVIDENCE_REPORT.md +18 -0
  241. package/specs/quiver-v44-provider-live-output-tui-lite/EXECUTION_PLAN.md +31 -0
  242. package/specs/quiver-v44-provider-live-output-tui-lite/SPEC.md +118 -0
  243. package/specs/quiver-v44-provider-live-output-tui-lite/STATUS.md +25 -0
  244. package/specs/quiver-v44-provider-live-output-tui-lite/pr.md +92 -0
  245. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/CLOSURE_BRIEF.md +11 -0
  246. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/EXECUTION_BRIEF.md +23 -0
  247. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/slice.json +64 -0
  248. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/CLOSURE_BRIEF.md +10 -0
  249. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/EXECUTION_BRIEF.md +24 -0
  250. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/slice.json +65 -0
  251. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/CLOSURE_BRIEF.md +10 -0
  252. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/EXECUTION_BRIEF.md +24 -0
  253. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/slice.json +70 -0
  254. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/CLOSURE_BRIEF.md +10 -0
  255. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/EXECUTION_BRIEF.md +25 -0
  256. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/slice.json +70 -0
  257. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/CLOSURE_BRIEF.md +10 -0
  258. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/EXECUTION_BRIEF.md +26 -0
  259. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/slice.json +72 -0
  260. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/CLOSURE_BRIEF.md +15 -0
  261. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/EXECUTION_BRIEF.md +26 -0
  262. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/slice.json +75 -0
  263. package/specs/quiver-v45-ci-actions-node24-readiness/EVIDENCE_REPORT.md +30 -0
  264. package/specs/quiver-v45-ci-actions-node24-readiness/EXECUTION_PLAN.md +22 -0
  265. package/specs/quiver-v45-ci-actions-node24-readiness/SPEC.md +49 -0
  266. package/specs/quiver-v45-ci-actions-node24-readiness/STATUS.md +21 -0
  267. package/specs/quiver-v45-ci-actions-node24-readiness/pr.md +67 -0
  268. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/CLOSURE_BRIEF.md +10 -0
  269. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/EXECUTION_BRIEF.md +21 -0
  270. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/slice.json +48 -0
  271. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/CLOSURE_BRIEF.md +14 -0
  272. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/EXECUTION_BRIEF.md +23 -0
  273. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/slice.json +65 -0
  274. package/specs/quiver-v50-audit-trust-foundation/EVIDENCE_REPORT.md +151 -0
  275. package/specs/quiver-v50-audit-trust-foundation/EXECUTION_PLAN.md +34 -0
  276. package/specs/quiver-v50-audit-trust-foundation/SPEC.md +113 -0
  277. package/specs/quiver-v50-audit-trust-foundation/STATUS.md +26 -0
  278. package/specs/quiver-v50-audit-trust-foundation/pr.md +120 -0
  279. package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/CLOSURE_BRIEF.md +20 -0
  280. package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/EXECUTION_BRIEF.md +58 -0
  281. package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/slice.json +57 -0
  282. package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/CLOSURE_BRIEF.md +24 -0
  283. package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/EXECUTION_BRIEF.md +67 -0
  284. package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/slice.json +71 -0
  285. package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/CLOSURE_BRIEF.md +24 -0
  286. package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/EXECUTION_BRIEF.md +71 -0
  287. package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/slice.json +81 -0
  288. package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/CLOSURE_BRIEF.md +22 -0
  289. package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/EXECUTION_BRIEF.md +57 -0
  290. package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/slice.json +56 -0
  291. package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/CLOSURE_BRIEF.md +23 -0
  292. package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/EXECUTION_BRIEF.md +68 -0
  293. package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/slice.json +84 -0
  294. package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/CLOSURE_BRIEF.md +25 -0
  295. package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/EXECUTION_BRIEF.md +73 -0
  296. package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/slice.json +72 -0
  297. package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/CLOSURE_BRIEF.md +22 -0
  298. package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/EXECUTION_BRIEF.md +66 -0
  299. package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/slice.json +74 -0
  300. package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/CLOSURE_BRIEF.md +29 -0
  301. package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/EXECUTION_BRIEF.md +74 -0
  302. package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/slice.json +81 -0
  303. package/specs/quiver-v51-cli-ergonomics-automation-contracts/EVIDENCE_REPORT.md +145 -0
  304. package/specs/quiver-v51-cli-ergonomics-automation-contracts/EXECUTION_PLAN.md +32 -0
  305. package/specs/quiver-v51-cli-ergonomics-automation-contracts/SPEC.md +109 -0
  306. package/specs/quiver-v51-cli-ergonomics-automation-contracts/STATUS.md +25 -0
  307. package/specs/quiver-v51-cli-ergonomics-automation-contracts/pr.md +69 -0
  308. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/CLOSURE_BRIEF.md +20 -0
  309. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/EXECUTION_BRIEF.md +58 -0
  310. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/slice.json +56 -0
  311. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/CLOSURE_BRIEF.md +21 -0
  312. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/EXECUTION_BRIEF.md +61 -0
  313. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/slice.json +68 -0
  314. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/CLOSURE_BRIEF.md +25 -0
  315. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/EXECUTION_BRIEF.md +65 -0
  316. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/pr.md +134 -0
  317. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/slice.json +80 -0
  318. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/CLOSURE_BRIEF.md +31 -0
  319. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/EXECUTION_BRIEF.md +80 -0
  320. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/pr.md +159 -0
  321. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/slice.json +102 -0
  322. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/CLOSURE_BRIEF.md +25 -0
  323. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/EXECUTION_BRIEF.md +74 -0
  324. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/pr.md +147 -0
  325. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/slice.json +91 -0
  326. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/CLOSURE_BRIEF.md +28 -0
  327. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/EXECUTION_BRIEF.md +73 -0
  328. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/pr.md +146 -0
  329. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/slice.json +100 -0
  330. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/CLOSURE_BRIEF.md +36 -0
  331. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/EXECUTION_BRIEF.md +76 -0
  332. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/pr.md +155 -0
  333. package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/slice.json +111 -0
  334. package/specs/quiver-v52-schema-docs-release-hygiene/EVIDENCE_REPORT.md +95 -0
  335. package/specs/quiver-v52-schema-docs-release-hygiene/EXECUTION_PLAN.md +31 -0
  336. package/specs/quiver-v52-schema-docs-release-hygiene/SPEC.md +107 -0
  337. package/specs/quiver-v52-schema-docs-release-hygiene/STATUS.md +22 -0
  338. package/specs/quiver-v52-schema-docs-release-hygiene/pr.md +69 -0
  339. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/CLOSURE_BRIEF.md +21 -0
  340. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/EXECUTION_BRIEF.md +60 -0
  341. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/slice.json +62 -0
  342. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/CLOSURE_BRIEF.md +34 -0
  343. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/EXECUTION_BRIEF.md +71 -0
  344. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/pr.md +146 -0
  345. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/slice.json +106 -0
  346. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/CLOSURE_BRIEF.md +33 -0
  347. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/EXECUTION_BRIEF.md +67 -0
  348. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/pr.md +144 -0
  349. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/slice.json +86 -0
  350. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/CLOSURE_BRIEF.md +38 -0
  351. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/EXECUTION_BRIEF.md +75 -0
  352. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/pr.md +159 -0
  353. package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/slice.json +105 -0
  354. package/src/create-quiver/commands/ai.js +485 -307
  355. package/src/create-quiver/commands/changelog.js +93 -0
  356. package/src/create-quiver/commands/config.js +135 -0
  357. package/src/create-quiver/commands/demo.js +2 -2
  358. package/src/create-quiver/commands/evidence.js +39 -6
  359. package/src/create-quiver/commands/flow.js +109 -16
  360. package/src/create-quiver/commands/graph.js +9 -2
  361. package/src/create-quiver/commands/next.js +21 -18
  362. package/src/create-quiver/commands/plan.js +29 -6
  363. package/src/create-quiver/commands/spec.js +94 -70
  364. package/src/create-quiver/index.js +798 -223
  365. package/src/create-quiver/lib/ai/execution-plan.js +23 -20
  366. package/src/create-quiver/lib/ai/executor.js +60 -44
  367. package/src/create-quiver/lib/ai/export-state.js +75 -64
  368. package/src/create-quiver/lib/ai/github.js +29 -23
  369. package/src/create-quiver/lib/ai/run-state.js +28 -25
  370. package/src/create-quiver/lib/ai/spec-templates.js +19 -0
  371. package/src/create-quiver/lib/cli/command-registry.js +71 -0
  372. package/src/create-quiver/lib/cli/parser.js +14 -0
  373. package/src/create-quiver/lib/dashboard.js +154 -111
  374. package/src/create-quiver/lib/demo.js +14 -12
  375. package/src/create-quiver/lib/evidence.js +161 -6
  376. package/src/create-quiver/lib/git.js +99 -0
  377. package/src/create-quiver/lib/handoff.js +16 -7
  378. package/src/create-quiver/lib/i18n/catalog.js +152 -0
  379. package/src/create-quiver/lib/i18n/language.js +279 -0
  380. package/src/create-quiver/lib/i18n/messages/en.js +898 -0
  381. package/src/create-quiver/lib/i18n/messages/es.js +1013 -0
  382. package/src/create-quiver/lib/i18n/read-only-format.js +26 -0
  383. package/src/create-quiver/lib/i18n/templates.js +172 -0
  384. package/src/create-quiver/lib/init-docs.js +19 -5
  385. package/src/create-quiver/lib/init-layout.js +15 -8
  386. package/src/create-quiver/lib/lifecycle.js +72 -67
  387. package/src/create-quiver/lib/readiness.js +131 -110
  388. package/src/create-quiver/lib/renderers/tree.js +9 -6
  389. package/src/create-quiver/lib/spec-worktrees.js +50 -64
  390. package/src/create-quiver/lib/version.js +11 -9
@@ -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';
@@ -633,7 +645,7 @@ Use this section only for projects generated with the full compatibility layout.
633
645
  5. Check the next ready slice with \`{{NEXT_COMMAND}}\` or \`npm run quiver:next\`.
634
646
  6. Start work with \`{{START_SLICE_COMMAND}}\` or \`npm run quiver:start-slice -- <slice.json>\`.
635
647
  7. Make one commit per slice.
636
- 8. Open one PR per spec.
648
+ 8. Open one PR per slice by default; group slices only when \`docs/GITFLOW_PR_GUIDE.md\` allows it.
637
649
 
638
650
  ## Verification Checklist
639
651
 
@@ -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,
@@ -213,14 +214,15 @@ function resolveInitPackageScripts(profile, options = {}) {
213
214
  'quiver:spec:status': 'npx create-quiver spec status',
214
215
  'quiver:spec:validate': 'npx create-quiver spec validate',
215
216
  'quiver:spec:close': 'npx create-quiver spec close',
216
- 'quiver:start-slice': 'npx create-quiver start-slice',
217
- 'quiver:check-slice': 'npx create-quiver check-slice',
218
- 'quiver:check-pr': 'npx create-quiver check-pr',
219
- 'quiver:check-handoff': 'npx create-quiver check-handoff',
220
- 'check-handoff': 'npx create-quiver check-handoff',
221
- 'quiver:cleanup-slice': 'npx create-quiver cleanup-slice',
222
- 'quiver:check-scope': 'npx create-quiver check-scope',
223
- 'quiver:refresh-active-slices': 'npx create-quiver refresh-active-slices',
217
+ 'quiver:start-slice': 'npx create-quiver slice start',
218
+ 'quiver:check-slice': 'npx create-quiver slice check',
219
+ 'quiver:check-pr': 'npx create-quiver slice pr',
220
+ 'quiver:check-handoff': 'npx create-quiver handoff check',
221
+ 'check-handoff': 'npx create-quiver handoff check',
222
+ 'quiver:new-handoff': 'npx create-quiver handoff new',
223
+ 'quiver:cleanup-slice': 'npx create-quiver slice cleanup',
224
+ 'quiver:check-scope': 'npx create-quiver slice scope',
225
+ 'quiver:refresh-active-slices': 'npx create-quiver slice refresh-active',
224
226
  };
225
227
 
226
228
  if (profile === 'full' || options.legacyScripts === true) {
@@ -353,6 +355,7 @@ function buildInitLayout(projectRoot, options = {}) {
353
355
  projectSlug,
354
356
  targetRoot: path.resolve(projectRoot),
355
357
  flags: normalized,
358
+ language: normalized.language,
356
359
  operations,
357
360
  ignoredPaths: [...new Set(ignoredPaths)],
358
361
  risks,
@@ -374,6 +377,10 @@ function formatInitLayoutPlan(plan) {
374
377
  lines.push(`- Slug: ${plan.projectSlug}`);
375
378
  lines.push(`- Target: ${plan.targetRoot}`);
376
379
  lines.push(`- Profile: ${plan.profile}`);
380
+ if (plan.language) {
381
+ lines.push(`- Language: ${plan.language}`);
382
+ lines.push('- Language config: write .quiver/config.json');
383
+ }
377
384
  lines.push(`- Entry point: ${entryPoint}`);
378
385
  lines.push(`- Planned create: ${plan.summary.create}`);
379
386
  lines.push(`- Planned update: ${plan.summary.update}`);
@@ -1,7 +1,8 @@
1
1
  const fs = require('fs');
2
2
  const path = require('path');
3
- const { branchDelete, catFileExists, currentBranch, fetchBranch, fetchRemote, hasLocalBranch, hasRemoteBranch, isGitWorktree, isLinkedWorktree, lsRemoteHeads, mergeBaseIsAncestor, revListCount, runGit, statusPorcelain, worktreeAdd, worktreeList, worktreePrune, worktreeRemove } = require('./git');
3
+ const { branchDelete, catFileExists, currentBranch, fetchBranch, fetchRemote, hasLocalBranch, isGitWorktree, isLinkedWorktree, lsRemoteHeads, mergeBaseIsAncestor, resolveBaseRef: resolveGitBaseRef, 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,22 +272,15 @@ function refreshActiveSlicesBoard(repoRoot) {
267
272
  return outputPath;
268
273
  }
269
274
 
270
- function resolveBaseRef(repoRoot, baseBranch) {
271
- if (hasLocalBranch(repoRoot, baseBranch)) {
272
- return baseBranch;
273
- }
274
- if (hasRemoteBranch(repoRoot, baseBranch)) {
275
- return `origin/${baseBranch}`;
276
- }
277
- if (lsRemoteHeads(repoRoot, baseBranch)) {
278
- try {
279
- fetchBranch(repoRoot, baseBranch);
280
- return `origin/${baseBranch}`;
281
- } 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.`);
283
- }
275
+ function resolveBaseRef(repoRoot, baseBranch, translator = lifecycleTranslator()) {
276
+ const resolution = resolveGitBaseRef(repoRoot, {
277
+ explicitBaseBranch: baseBranch,
278
+ missingOk: true,
279
+ });
280
+ if (resolution.baseRef) {
281
+ return resolution.baseRef;
284
282
  }
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.`);
283
+ throw new Error(`create-quiver: ${translator.t('lifecycle.base_ref.missing', { base: resolution.baseBranch || baseBranch, remoteRef: `origin/${resolution.baseBranch || baseBranch}` })}`);
286
284
  }
287
285
 
288
286
  function findExistingWorktreeForBranch(repoRoot, branchName) {
@@ -326,6 +324,7 @@ function formatNestedSliceWorktree(branchName, existingWorktreePath = '') {
326
324
  }
327
325
 
328
326
  function startSlice(sliceInput, options = {}) {
327
+ const translator = lifecycleTranslator(options);
329
328
  const allowDraft = options.allowDraft === true || process.env.ALLOW_DRAFT_SLICE === '1';
330
329
  const repoRoot = runGit(['rev-parse', '--show-toplevel'], process.cwd());
331
330
  const slice = resolveSliceContext(repoRoot, sliceInput);
@@ -338,19 +337,19 @@ function startSlice(sliceInput, options = {}) {
338
337
  validateSliceMetaForStart(slice);
339
338
 
340
339
  if (slice.status === 'blocked') {
341
- throw new Error('create-quiver: el slice esta bloqueado (status=blocked). Resolve el bloqueante antes de iniciar.');
340
+ throw new Error(`create-quiver: ${translator.t('lifecycle.start.error.blocked')}`);
342
341
  }
343
342
  if (slice.status === 'cancelled') {
344
- throw new Error('create-quiver: el slice esta cancelado (status=cancelled).');
343
+ throw new Error(`create-quiver: ${translator.t('lifecycle.start.error.cancelled')}`);
345
344
  }
346
345
  if (slice.status === 'completed') {
347
- console.log('WARN: el slice ya figura como completed. Si realmente corresponde reejecutarlo, cambia el status a in_progress.');
346
+ console.log(translator.t('lifecycle.start.warn.completed'));
348
347
  }
349
348
  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.");
349
+ throw new Error(`create-quiver: ${translator.t('lifecycle.start.error.draft')}`);
351
350
  }
352
351
  if (slice.status === 'draft') {
353
- console.log('WARN: bootstrap intencional para un slice en draft.');
352
+ console.log(translator.t('lifecycle.start.warn.draft'));
354
353
  }
355
354
 
356
355
  return withLockSync(repoRoot, `slice-worktree-${slice.branchName}`, {
@@ -375,19 +374,19 @@ function startSlice(sliceInput, options = {}) {
375
374
  writeWorktreeContext(existingWorktreePath, slice, slice.branchName);
376
375
  const activeSlice = writeActiveSlice(repoRoot, slice);
377
376
  if (activeSlice.replaced) {
378
- console.log('WARN: Reemplazando docs/ai/ACTIVE_SLICE.md existente.');
377
+ console.log(translator.t('lifecycle.active_slice.replaced'));
379
378
  } else {
380
- console.log('Wrote docs/ai/ACTIVE_SLICE.md');
379
+ console.log(translator.t('lifecycle.active_slice.wrote'));
381
380
  }
382
381
  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}`);
382
+ console.log(translator.t('lifecycle.start.existing_worktree'));
383
+ console.log(translator.t('lifecycle.label.alias', { value: toAlias(slice.ticket) }));
384
+ console.log(translator.t('lifecycle.label.spec', { value: slice.specSlug }));
385
+ console.log(translator.t('lifecycle.label.slice', { value: slice.sliceId }));
386
+ console.log(translator.t('lifecycle.label.ticket', { value: slice.ticket }));
387
+ console.log(translator.t('lifecycle.label.branch', { value: slice.branchName }));
388
+ console.log(translator.t('lifecycle.label.base', { value: slice.baseBranch }));
389
+ console.log(translator.t('lifecycle.label.worktree', { value: existingWorktreePath }));
391
390
  return { worktreePath: existingWorktreePath, reused: true };
392
391
  }
393
392
 
@@ -418,35 +417,36 @@ function startSlice(sliceInput, options = {}) {
418
417
  }
419
418
  worktreeAdd(repoRoot, worktreePath, slice.branchName);
420
419
  } else {
421
- const baseRef = resolveBaseRef(repoRoot, slice.baseBranch);
420
+ const baseRef = resolveBaseRef(repoRoot, slice.baseBranch, translator);
422
421
  worktreeAdd(repoRoot, worktreePath, baseRef, { branch: slice.branchName });
423
422
  }
424
423
 
425
424
  writeWorktreeContext(worktreePath, slice, slice.branchName);
426
425
  const activeSlice = writeActiveSlice(repoRoot, slice);
427
426
  if (activeSlice.replaced) {
428
- console.log('WARN: Reemplazando docs/ai/ACTIVE_SLICE.md existente.');
427
+ console.log(translator.t('lifecycle.active_slice.replaced'));
429
428
  } else {
430
- console.log('Wrote docs/ai/ACTIVE_SLICE.md');
429
+ console.log(translator.t('lifecycle.active_slice.wrote'));
431
430
  }
432
431
  refreshActiveSlicesBoard(repoRoot);
433
432
 
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`);
433
+ console.log(translator.t('lifecycle.start.ready'));
434
+ console.log(translator.t('lifecycle.label.alias', { value: toAlias(slice.ticket) }));
435
+ console.log(translator.t('lifecycle.label.spec', { value: slice.specSlug }));
436
+ console.log(translator.t('lifecycle.label.slice', { value: slice.sliceId }));
437
+ console.log(translator.t('lifecycle.label.ticket', { value: slice.ticket }));
438
+ console.log(translator.t('lifecycle.label.branch_type', { value: slice.branchType }));
439
+ console.log(translator.t('lifecycle.label.base', { value: slice.baseBranch }));
440
+ console.log(translator.t('lifecycle.label.slug', { value: slice.branchSlug }));
441
+ console.log(translator.t('lifecycle.label.branch', { value: slice.branchName }));
442
+ console.log(translator.t('lifecycle.label.worktree', { value: worktreePath }));
443
+ console.log(translator.t('lifecycle.label.context', { value: `${worktreePath}/WORKTREE_CONTEXT.md` }));
445
444
  return { worktreePath, reused: false };
446
445
  });
447
446
  }
448
447
 
449
448
  function cleanupSlice(sliceInput, options = {}) {
449
+ const translator = lifecycleTranslator(options);
450
450
  const closeBaseline = options.closeBaseline === true;
451
451
  const discard = options.discard === true;
452
452
  const forceDelete = options.force === true;
@@ -457,35 +457,40 @@ function cleanupSlice(sliceInput, options = {}) {
457
457
  const worktreePath = path.join(worktreesRoot, safeBranchName(slice.branchName));
458
458
 
459
459
  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.');
460
+ console.log(translator.t('lifecycle.cleanup.baseline.info', { slice: slice.sliceId }));
461
+ console.log(translator.t('lifecycle.cleanup.baseline.close_hint'));
462
462
  return;
463
463
  }
464
464
 
465
465
  if (!discard) {
466
+ const base = resolveGitBaseRef(repoRoot, {
467
+ preferredBaseBranch: slice.baseBranch,
468
+ });
466
469
  const branch = currentBranch(repoRoot);
467
- if (branch !== 'develop') {
468
- throw new Error(`create-quiver: el cleanup normal debe correrse desde develop. Rama actual: ${branch}`);
470
+ if (branch !== base.baseBranch) {
471
+ throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.branch', { branch, base: base.baseBranch })}`);
469
472
  }
470
473
  if (statusPorcelain(repoRoot) !== '') {
471
- throw new Error('create-quiver: el checkout actual no esta limpio. Limpialo antes del cleanup.');
474
+ throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.dirty')}`);
472
475
  }
473
476
 
474
- try {
475
- fetchRemote(repoRoot, 'origin', ['develop']);
476
- } catch {
477
- // ignore
477
+ if (base.remote) {
478
+ try {
479
+ fetchRemote(repoRoot, base.remote, [base.baseBranch]);
480
+ } catch {
481
+ // Local-only test repos and offline environments can still validate against the current remote ref.
482
+ }
478
483
  }
479
484
 
480
485
  const localDevelopSha = runGit(['rev-parse', 'HEAD'], repoRoot);
481
- const remoteDevelopSha = runGit(['rev-parse', 'origin/develop'], repoRoot);
482
- if (localDevelopSha !== remoteDevelopSha) {
483
- throw new Error('create-quiver: develop local no esta actualizado. Ejecuta git pull --ff-only antes del cleanup.');
486
+ const remoteDevelopSha = runGit(['rev-parse', base.baseRef], repoRoot);
487
+ if (base.remote && localDevelopSha !== remoteDevelopSha) {
488
+ throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.base_stale', { base: base.baseBranch, ref: base.baseRef })}`);
484
489
  }
485
490
 
486
491
  if (hasLocalBranch(repoRoot, slice.branchName)) {
487
- 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.`);
492
+ if (!mergeBaseIsAncestor(repoRoot, slice.branchName, base.baseRef)) {
493
+ throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.unmerged', { branch: slice.branchName, ref: base.baseRef })}`);
489
494
  }
490
495
  }
491
496
  }
@@ -493,38 +498,38 @@ function cleanupSlice(sliceInput, options = {}) {
493
498
  const worktreeExists = fs.existsSync(worktreePath);
494
499
  const branchExists = hasLocalBranch(repoRoot, slice.branchName);
495
500
  if (!worktreeExists && !branchExists) {
496
- throw new Error(`create-quiver: no existe worktree ni rama local para '${slice.sliceId}'.`);
501
+ throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.missing', { slice: slice.sliceId })}`);
497
502
  }
498
503
 
499
504
  const removeWorktree = () => worktreeRemove(repoRoot, worktreePath, forceDelete || discard);
500
505
  const removeBranch = () => branchDelete(repoRoot, slice.branchName, forceDelete || discard);
501
506
 
502
507
  if (dryRun) {
503
- console.log(`DRY RUN: slice=${slice.sliceId} branch=${slice.branchName}`);
508
+ console.log(translator.t('lifecycle.cleanup.dry_run.slice', { slice: slice.sliceId, branch: slice.branchName }));
504
509
  if (worktreeExists) {
505
- console.log(`DRY RUN: git worktree remove ${forceDelete || discard ? '--force ' : ''}${worktreePath}`);
510
+ console.log(translator.t('lifecycle.cleanup.dry_run.worktree', { force: forceDelete || discard ? '--force ' : '', path: worktreePath }));
506
511
  }
507
512
  if (branchExists) {
508
- console.log(`DRY RUN: git branch ${forceDelete || discard ? '-D' : '-d'} ${slice.branchName}`);
513
+ console.log(translator.t('lifecycle.cleanup.dry_run.branch', { flag: forceDelete || discard ? '-D' : '-d', branch: slice.branchName }));
509
514
  }
510
515
  return;
511
516
  }
512
517
 
513
518
  if (worktreeExists) {
514
519
  removeWorktree();
515
- console.log(`PASS: Worktree eliminado: ${worktreePath}`);
520
+ console.log(translator.t('lifecycle.cleanup.removed_worktree', { path: worktreePath }));
516
521
  }
517
522
  if (branchExists) {
518
523
  removeBranch();
519
- console.log(`PASS: Rama local eliminada: ${slice.branchName}`);
524
+ console.log(translator.t('lifecycle.cleanup.removed_branch', { branch: slice.branchName }));
520
525
  }
521
526
 
522
527
  if (removeActiveSlice(repoRoot)) {
523
- console.log('PASS: ACTIVE_SLICE.md eliminado');
528
+ console.log(translator.t('lifecycle.cleanup.removed_active_slice'));
524
529
  }
525
530
 
526
531
  refreshActiveSlicesBoard(repoRoot);
527
- console.log(`PASS: Cleanup finalizado para '${slice.sliceId}'.`);
532
+ console.log(translator.t('lifecycle.cleanup.finished', { slice: slice.sliceId }));
528
533
  }
529
534
 
530
535
  module.exports = {