create-quiver 0.15.2 → 0.15.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/.github/workflows/ci.yml +3 -0
  2. package/AGENTS.md.es.template +37 -0
  3. package/README.md +1 -0
  4. package/README_FOR_AI.md +6 -4
  5. package/docs/AI_CONTEXT.md.es.template +35 -0
  6. package/docs/AI_ONBOARDING_PROMPT.md.es.template +22 -0
  7. package/docs/CLI_UX_GUIDE.md +47 -1
  8. package/docs/COMMANDS.md.es.template +28 -0
  9. package/docs/COMMANDS.md.template +14 -3
  10. package/docs/CONTEXTO.md.es.template +33 -0
  11. package/docs/DECISIONS.md.es.template +17 -0
  12. package/docs/GITFLOW_PR_GUIDE.md.es.template +25 -0
  13. package/docs/INDEX.md +96 -0
  14. package/docs/INDEX.md.es.template +36 -0
  15. package/docs/STATUS.md.es.template +28 -0
  16. package/docs/SUPPORT_MATRIX.md.es.template +22 -0
  17. package/docs/TESTING_GUIDE_FOR_AI.md.es.template +19 -0
  18. package/docs/TROUBLESHOOTING.md.es.template +35 -0
  19. package/docs/WORKFLOW.md.es.template +29 -0
  20. package/docs/WORKFLOW.md.template +2 -2
  21. package/docs/ai/LESSONS.md.es.template +24 -0
  22. package/docs/getting-started/installation.md +19 -0
  23. package/docs/reference/commands.md +68 -2
  24. package/package.json +3 -1
  25. package/specs/quiver-v34-cli-dashboard-status/EVIDENCE_REPORT.md +119 -0
  26. package/specs/quiver-v34-cli-dashboard-status/EXECUTION_PLAN.md +77 -0
  27. package/specs/quiver-v34-cli-dashboard-status/SPEC.md +152 -0
  28. package/specs/quiver-v34-cli-dashboard-status/STATUS.md +29 -0
  29. package/specs/quiver-v34-cli-dashboard-status/pr.md +99 -0
  30. package/specs/quiver-v34-cli-dashboard-status/slices/slice-00-dashboard-foundation/CLOSURE_BRIEF.md +19 -0
  31. package/specs/quiver-v34-cli-dashboard-status/slices/slice-00-dashboard-foundation/EXECUTION_BRIEF.md +49 -0
  32. package/specs/quiver-v34-cli-dashboard-status/slices/slice-00-dashboard-foundation/slice.json +68 -0
  33. package/specs/quiver-v34-cli-dashboard-status/slices/slice-01-dashboard-report-contract/CLOSURE_BRIEF.md +19 -0
  34. package/specs/quiver-v34-cli-dashboard-status/slices/slice-01-dashboard-report-contract/EXECUTION_BRIEF.md +53 -0
  35. package/specs/quiver-v34-cli-dashboard-status/slices/slice-01-dashboard-report-contract/slice.json +78 -0
  36. package/specs/quiver-v34-cli-dashboard-status/slices/slice-02-dashboard-command-rendering/CLOSURE_BRIEF.md +19 -0
  37. package/specs/quiver-v34-cli-dashboard-status/slices/slice-02-dashboard-command-rendering/EXECUTION_BRIEF.md +53 -0
  38. package/specs/quiver-v34-cli-dashboard-status/slices/slice-02-dashboard-command-rendering/slice.json +82 -0
  39. package/specs/quiver-v34-cli-dashboard-status/slices/slice-03-dashboard-edge-cases-and-guardrails/CLOSURE_BRIEF.md +19 -0
  40. package/specs/quiver-v34-cli-dashboard-status/slices/slice-03-dashboard-edge-cases-and-guardrails/EXECUTION_BRIEF.md +54 -0
  41. package/specs/quiver-v34-cli-dashboard-status/slices/slice-03-dashboard-edge-cases-and-guardrails/slice.json +77 -0
  42. package/specs/quiver-v34-cli-dashboard-status/slices/slice-04-docs-templates-and-scripts/CLOSURE_BRIEF.md +19 -0
  43. package/specs/quiver-v34-cli-dashboard-status/slices/slice-04-docs-templates-and-scripts/EXECUTION_BRIEF.md +54 -0
  44. package/specs/quiver-v34-cli-dashboard-status/slices/slice-04-docs-templates-and-scripts/slice.json +88 -0
  45. package/specs/quiver-v34-cli-dashboard-status/slices/slice-05-tests-smokes-release-readiness/CLOSURE_BRIEF.md +26 -0
  46. package/specs/quiver-v34-cli-dashboard-status/slices/slice-05-tests-smokes-release-readiness/EXECUTION_BRIEF.md +57 -0
  47. package/specs/quiver-v34-cli-dashboard-status/slices/slice-05-tests-smokes-release-readiness/slice.json +85 -0
  48. package/specs/quiver-v35-compact-dashboard-version-ux/EVIDENCE_REPORT.md +43 -0
  49. package/specs/quiver-v35-compact-dashboard-version-ux/EXECUTION_PLAN.md +85 -0
  50. package/specs/quiver-v35-compact-dashboard-version-ux/SPEC.md +147 -0
  51. package/specs/quiver-v35-compact-dashboard-version-ux/STATUS.md +33 -0
  52. package/specs/quiver-v35-compact-dashboard-version-ux/pr.md +106 -0
  53. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-00-foundation-and-doc-router/CLOSURE_BRIEF.md +19 -0
  54. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-00-foundation-and-doc-router/EXECUTION_BRIEF.md +38 -0
  55. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-00-foundation-and-doc-router/slice.json +64 -0
  56. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-01-dashboard-cli-contract/CLOSURE_BRIEF.md +19 -0
  57. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-01-dashboard-cli-contract/EXECUTION_BRIEF.md +49 -0
  58. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-01-dashboard-cli-contract/slice.json +80 -0
  59. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-02-dashboard-compact-renderer/CLOSURE_BRIEF.md +19 -0
  60. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-02-dashboard-compact-renderer/EXECUTION_BRIEF.md +48 -0
  61. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-02-dashboard-compact-renderer/slice.json +73 -0
  62. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-03-dashboard-details-sections/CLOSURE_BRIEF.md +19 -0
  63. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-03-dashboard-details-sections/EXECUTION_BRIEF.md +48 -0
  64. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-03-dashboard-details-sections/slice.json +72 -0
  65. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-04-version-command/CLOSURE_BRIEF.md +19 -0
  66. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-04-version-command/EXECUTION_BRIEF.md +49 -0
  67. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-04-version-command/slice.json +82 -0
  68. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-05-docs-help-generated-guidance/CLOSURE_BRIEF.md +19 -0
  69. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-05-docs-help-generated-guidance/EXECUTION_BRIEF.md +50 -0
  70. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-05-docs-help-generated-guidance/slice.json +90 -0
  71. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-06-tests-smokes-release-readiness/CLOSURE_BRIEF.md +21 -0
  72. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-06-tests-smokes-release-readiness/EXECUTION_BRIEF.md +51 -0
  73. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-06-tests-smokes-release-readiness/slice.json +85 -0
  74. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-07-package-and-cross-platform-smoke/CLOSURE_BRIEF.md +20 -0
  75. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-07-package-and-cross-platform-smoke/EXECUTION_BRIEF.md +49 -0
  76. package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-07-package-and-cross-platform-smoke/slice.json +79 -0
  77. package/specs/quiver-v36-ai-run-watch-portable/EVIDENCE_REPORT.md +33 -0
  78. package/specs/quiver-v36-ai-run-watch-portable/EXECUTION_PLAN.md +39 -0
  79. package/specs/quiver-v36-ai-run-watch-portable/SPEC.md +166 -0
  80. package/specs/quiver-v36-ai-run-watch-portable/STATUS.md +31 -0
  81. package/specs/quiver-v36-ai-run-watch-portable/pr.md +78 -0
  82. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-00-foundation-and-handoffs/CLOSURE_BRIEF.md +19 -0
  83. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-00-foundation-and-handoffs/EXECUTION_BRIEF.md +43 -0
  84. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-00-foundation-and-handoffs/slice.json +61 -0
  85. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-01-run-schema-path-safety/CLOSURE_BRIEF.md +18 -0
  86. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-01-run-schema-path-safety/EXECUTION_BRIEF.md +43 -0
  87. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-01-run-schema-path-safety/slice.json +65 -0
  88. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-02-event-writer-redacted-logs/CLOSURE_BRIEF.md +18 -0
  89. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-02-event-writer-redacted-logs/EXECUTION_BRIEF.md +43 -0
  90. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-02-event-writer-redacted-logs/slice.json +66 -0
  91. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-03-provider-streaming-integration/CLOSURE_BRIEF.md +18 -0
  92. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-03-provider-streaming-integration/EXECUTION_BRIEF.md +41 -0
  93. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-03-provider-streaming-integration/slice.json +71 -0
  94. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-04-ai-run-watch-command/CLOSURE_BRIEF.md +18 -0
  95. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-04-ai-run-watch-command/EXECUTION_BRIEF.md +44 -0
  96. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-04-ai-run-watch-command/slice.json +73 -0
  97. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-05-main-progress-user-guidance/CLOSURE_BRIEF.md +18 -0
  98. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-05-main-progress-user-guidance/EXECUTION_BRIEF.md +44 -0
  99. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-05-main-progress-user-guidance/slice.json +71 -0
  100. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-06-docs-generated-guidance/CLOSURE_BRIEF.md +19 -0
  101. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-06-docs-generated-guidance/EXECUTION_BRIEF.md +45 -0
  102. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-06-docs-generated-guidance/slice.json +77 -0
  103. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-07-tests-cross-platform-readiness/CLOSURE_BRIEF.md +22 -0
  104. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-07-tests-cross-platform-readiness/EXECUTION_BRIEF.md +46 -0
  105. package/specs/quiver-v36-ai-run-watch-portable/slices/slice-07-tests-cross-platform-readiness/slice.json +87 -0
  106. package/specs/quiver-v37-cli-i18n-foundation/EVIDENCE_REPORT.md +73 -0
  107. package/specs/quiver-v37-cli-i18n-foundation/EXECUTION_PLAN.md +34 -0
  108. package/specs/quiver-v37-cli-i18n-foundation/SPEC.md +91 -0
  109. package/specs/quiver-v37-cli-i18n-foundation/STATUS.md +29 -0
  110. package/specs/quiver-v37-cli-i18n-foundation/pr.md +97 -0
  111. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/CLOSURE_BRIEF.md +10 -0
  112. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/EXECUTION_BRIEF.md +22 -0
  113. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/slice.json +54 -0
  114. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/CLOSURE_BRIEF.md +30 -0
  115. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/EXECUTION_BRIEF.md +27 -0
  116. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/slice.json +66 -0
  117. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/CLOSURE_BRIEF.md +27 -0
  118. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/EXECUTION_BRIEF.md +26 -0
  119. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/slice.json +62 -0
  120. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/CLOSURE_BRIEF.md +32 -0
  121. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/EXECUTION_BRIEF.md +25 -0
  122. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/slice.json +66 -0
  123. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/CLOSURE_BRIEF.md +30 -0
  124. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/EXECUTION_BRIEF.md +24 -0
  125. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/slice.json +65 -0
  126. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/CLOSURE_BRIEF.md +27 -0
  127. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/EXECUTION_BRIEF.md +23 -0
  128. package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/slice.json +67 -0
  129. package/specs/quiver-v38-cli-i18n-read-only-commands/EVIDENCE_REPORT.md +69 -0
  130. package/specs/quiver-v38-cli-i18n-read-only-commands/EXECUTION_PLAN.md +25 -0
  131. package/specs/quiver-v38-cli-i18n-read-only-commands/SPEC.md +52 -0
  132. package/specs/quiver-v38-cli-i18n-read-only-commands/STATUS.md +24 -0
  133. package/specs/quiver-v38-cli-i18n-read-only-commands/pr.md +119 -0
  134. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/CLOSURE_BRIEF.md +10 -0
  135. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/EXECUTION_BRIEF.md +21 -0
  136. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/slice.json +53 -0
  137. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/CLOSURE_BRIEF.md +17 -0
  138. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/EXECUTION_BRIEF.md +23 -0
  139. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/slice.json +69 -0
  140. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/CLOSURE_BRIEF.md +13 -0
  141. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/EXECUTION_BRIEF.md +22 -0
  142. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/slice.json +77 -0
  143. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/CLOSURE_BRIEF.md +12 -0
  144. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/EXECUTION_BRIEF.md +22 -0
  145. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/slice.json +66 -0
  146. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/CLOSURE_BRIEF.md +13 -0
  147. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/EXECUTION_BRIEF.md +22 -0
  148. package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/slice.json +61 -0
  149. package/specs/quiver-v39-cli-i18n-setup-onboarding/EVIDENCE_REPORT.md +71 -0
  150. package/specs/quiver-v39-cli-i18n-setup-onboarding/EXECUTION_PLAN.md +25 -0
  151. package/specs/quiver-v39-cli-i18n-setup-onboarding/SPEC.md +53 -0
  152. package/specs/quiver-v39-cli-i18n-setup-onboarding/STATUS.md +24 -0
  153. package/specs/quiver-v39-cli-i18n-setup-onboarding/pr.md +104 -0
  154. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/CLOSURE_BRIEF.md +10 -0
  155. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/EXECUTION_BRIEF.md +21 -0
  156. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/slice.json +53 -0
  157. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/CLOSURE_BRIEF.md +12 -0
  158. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/EXECUTION_BRIEF.md +23 -0
  159. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/slice.json +68 -0
  160. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/CLOSURE_BRIEF.md +12 -0
  161. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/EXECUTION_BRIEF.md +23 -0
  162. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/slice.json +62 -0
  163. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/CLOSURE_BRIEF.md +12 -0
  164. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/EXECUTION_BRIEF.md +22 -0
  165. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/slice.json +72 -0
  166. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/CLOSURE_BRIEF.md +15 -0
  167. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/EXECUTION_BRIEF.md +22 -0
  168. package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/slice.json +61 -0
  169. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/EVIDENCE_REPORT.md +50 -0
  170. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/EXECUTION_PLAN.md +25 -0
  171. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/SPEC.md +52 -0
  172. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/STATUS.md +24 -0
  173. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/pr.md +94 -0
  174. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/CLOSURE_BRIEF.md +10 -0
  175. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/EXECUTION_BRIEF.md +21 -0
  176. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/slice.json +53 -0
  177. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/CLOSURE_BRIEF.md +12 -0
  178. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/EXECUTION_BRIEF.md +22 -0
  179. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/slice.json +63 -0
  180. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/CLOSURE_BRIEF.md +10 -0
  181. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/EXECUTION_BRIEF.md +22 -0
  182. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/slice.json +63 -0
  183. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/CLOSURE_BRIEF.md +10 -0
  184. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/EXECUTION_BRIEF.md +22 -0
  185. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/slice.json +72 -0
  186. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/CLOSURE_BRIEF.md +15 -0
  187. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/EXECUTION_BRIEF.md +22 -0
  188. package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/slice.json +69 -0
  189. package/specs/quiver-v41-cli-i18n-ai-lifecycle/EVIDENCE_REPORT.md +90 -0
  190. package/specs/quiver-v41-cli-i18n-ai-lifecycle/EXECUTION_PLAN.md +33 -0
  191. package/specs/quiver-v41-cli-i18n-ai-lifecycle/SPEC.md +57 -0
  192. package/specs/quiver-v41-cli-i18n-ai-lifecycle/STATUS.md +26 -0
  193. package/specs/quiver-v41-cli-i18n-ai-lifecycle/pr.md +103 -0
  194. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/CLOSURE_BRIEF.md +10 -0
  195. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/EXECUTION_BRIEF.md +21 -0
  196. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/slice.json +53 -0
  197. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/CLOSURE_BRIEF.md +13 -0
  198. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/EXECUTION_BRIEF.md +22 -0
  199. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/slice.json +68 -0
  200. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/CLOSURE_BRIEF.md +12 -0
  201. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/EXECUTION_BRIEF.md +22 -0
  202. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/slice.json +66 -0
  203. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/CLOSURE_BRIEF.md +12 -0
  204. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/EXECUTION_BRIEF.md +23 -0
  205. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/slice.json +68 -0
  206. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/CLOSURE_BRIEF.md +13 -0
  207. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/EXECUTION_BRIEF.md +23 -0
  208. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/slice.json +72 -0
  209. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/CLOSURE_BRIEF.md +15 -0
  210. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/EXECUTION_BRIEF.md +22 -0
  211. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/slice.json +66 -0
  212. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/CLOSURE_BRIEF.md +11 -0
  213. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/EXECUTION_BRIEF.md +22 -0
  214. package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/slice.json +70 -0
  215. package/specs/quiver-v42-cli-i18n-generated-docs/EVIDENCE_REPORT.md +64 -0
  216. package/specs/quiver-v42-cli-i18n-generated-docs/EXECUTION_PLAN.md +26 -0
  217. package/specs/quiver-v42-cli-i18n-generated-docs/SPEC.md +52 -0
  218. package/specs/quiver-v42-cli-i18n-generated-docs/STATUS.md +24 -0
  219. package/specs/quiver-v42-cli-i18n-generated-docs/pr.md +125 -0
  220. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/CLOSURE_BRIEF.md +10 -0
  221. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/EXECUTION_BRIEF.md +21 -0
  222. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/slice.json +53 -0
  223. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/CLOSURE_BRIEF.md +10 -0
  224. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/EXECUTION_BRIEF.md +22 -0
  225. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/slice.json +62 -0
  226. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/CLOSURE_BRIEF.md +11 -0
  227. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/EXECUTION_BRIEF.md +22 -0
  228. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/slice.json +72 -0
  229. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/CLOSURE_BRIEF.md +12 -0
  230. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/EXECUTION_BRIEF.md +22 -0
  231. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/slice.json +60 -0
  232. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/CLOSURE_BRIEF.md +16 -0
  233. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/EXECUTION_BRIEF.md +22 -0
  234. package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/slice.json +62 -0
  235. package/specs/quiver-v43-cli-i18n-audit-release-readiness/EVIDENCE_REPORT.md +203 -0
  236. package/specs/quiver-v43-cli-i18n-audit-release-readiness/EXECUTION_PLAN.md +27 -0
  237. package/specs/quiver-v43-cli-i18n-audit-release-readiness/SPEC.md +54 -0
  238. package/specs/quiver-v43-cli-i18n-audit-release-readiness/STATUS.md +24 -0
  239. package/specs/quiver-v43-cli-i18n-audit-release-readiness/command-language-mode-matrix.json +545 -0
  240. package/specs/quiver-v43-cli-i18n-audit-release-readiness/cross-platform-smoke-matrix.md +35 -0
  241. package/specs/quiver-v43-cli-i18n-audit-release-readiness/pr.md +155 -0
  242. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/CLOSURE_BRIEF.md +10 -0
  243. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/EXECUTION_BRIEF.md +21 -0
  244. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/slice.json +53 -0
  245. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/CLOSURE_BRIEF.md +13 -0
  246. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/EXECUTION_BRIEF.md +23 -0
  247. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/slice.json +62 -0
  248. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/CLOSURE_BRIEF.md +18 -0
  249. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/EXECUTION_BRIEF.md +22 -0
  250. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/slice.json +59 -0
  251. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/CLOSURE_BRIEF.md +15 -0
  252. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/EXECUTION_BRIEF.md +23 -0
  253. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/slice.json +62 -0
  254. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/CLOSURE_BRIEF.md +17 -0
  255. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/EXECUTION_BRIEF.md +24 -0
  256. package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/slice.json +66 -0
  257. package/specs/quiver-v44-provider-live-output-tui-lite/EVIDENCE_REPORT.md +18 -0
  258. package/specs/quiver-v44-provider-live-output-tui-lite/EXECUTION_PLAN.md +31 -0
  259. package/specs/quiver-v44-provider-live-output-tui-lite/SPEC.md +118 -0
  260. package/specs/quiver-v44-provider-live-output-tui-lite/STATUS.md +25 -0
  261. package/specs/quiver-v44-provider-live-output-tui-lite/pr.md +92 -0
  262. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/CLOSURE_BRIEF.md +11 -0
  263. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/EXECUTION_BRIEF.md +23 -0
  264. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/slice.json +64 -0
  265. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/CLOSURE_BRIEF.md +10 -0
  266. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/EXECUTION_BRIEF.md +24 -0
  267. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/slice.json +65 -0
  268. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/CLOSURE_BRIEF.md +10 -0
  269. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/EXECUTION_BRIEF.md +24 -0
  270. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/slice.json +70 -0
  271. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/CLOSURE_BRIEF.md +10 -0
  272. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/EXECUTION_BRIEF.md +25 -0
  273. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/slice.json +70 -0
  274. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/CLOSURE_BRIEF.md +10 -0
  275. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/EXECUTION_BRIEF.md +26 -0
  276. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/slice.json +72 -0
  277. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/CLOSURE_BRIEF.md +15 -0
  278. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/EXECUTION_BRIEF.md +26 -0
  279. package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/slice.json +75 -0
  280. package/specs/quiver-v45-ci-actions-node24-readiness/EVIDENCE_REPORT.md +30 -0
  281. package/specs/quiver-v45-ci-actions-node24-readiness/EXECUTION_PLAN.md +22 -0
  282. package/specs/quiver-v45-ci-actions-node24-readiness/SPEC.md +49 -0
  283. package/specs/quiver-v45-ci-actions-node24-readiness/STATUS.md +21 -0
  284. package/specs/quiver-v45-ci-actions-node24-readiness/pr.md +67 -0
  285. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/CLOSURE_BRIEF.md +10 -0
  286. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/EXECUTION_BRIEF.md +21 -0
  287. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/slice.json +48 -0
  288. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/CLOSURE_BRIEF.md +14 -0
  289. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/EXECUTION_BRIEF.md +23 -0
  290. package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/slice.json +65 -0
  291. package/src/create-quiver/commands/ai.js +485 -307
  292. package/src/create-quiver/commands/config.js +124 -0
  293. package/src/create-quiver/commands/dashboard.js +31 -0
  294. package/src/create-quiver/commands/demo.js +2 -2
  295. package/src/create-quiver/commands/evidence.js +6 -4
  296. package/src/create-quiver/commands/flow.js +108 -16
  297. package/src/create-quiver/commands/graph.js +1 -0
  298. package/src/create-quiver/commands/next.js +21 -18
  299. package/src/create-quiver/commands/plan.js +23 -6
  300. package/src/create-quiver/commands/spec.js +66 -57
  301. package/src/create-quiver/index.js +606 -136
  302. package/src/create-quiver/lib/ai/execution-plan.js +23 -20
  303. package/src/create-quiver/lib/ai/executor.js +60 -44
  304. package/src/create-quiver/lib/ai/export-state.js +75 -64
  305. package/src/create-quiver/lib/ai/github.js +24 -21
  306. package/src/create-quiver/lib/ai/run-state.js +28 -25
  307. package/src/create-quiver/lib/cli/ux-flags.js +6 -0
  308. package/src/create-quiver/lib/dashboard.js +939 -0
  309. package/src/create-quiver/lib/demo.js +14 -12
  310. package/src/create-quiver/lib/handoff.js +16 -7
  311. package/src/create-quiver/lib/i18n/catalog.js +152 -0
  312. package/src/create-quiver/lib/i18n/language.js +279 -0
  313. package/src/create-quiver/lib/i18n/messages/en.js +853 -0
  314. package/src/create-quiver/lib/i18n/messages/es.js +968 -0
  315. package/src/create-quiver/lib/i18n/read-only-format.js +26 -0
  316. package/src/create-quiver/lib/i18n/templates.js +172 -0
  317. package/src/create-quiver/lib/init-docs.js +24 -4
  318. package/src/create-quiver/lib/init-layout.js +8 -0
  319. package/src/create-quiver/lib/lifecycle.js +53 -46
  320. package/src/create-quiver/lib/project-state-resolver.js +22 -2
  321. package/src/create-quiver/lib/readiness.js +77 -67
  322. package/src/create-quiver/lib/renderers/tree.js +9 -6
  323. package/src/create-quiver/lib/spec-worktrees.js +34 -30
  324. package/src/create-quiver/lib/version.js +159 -0
@@ -2,6 +2,7 @@ const fs = require('fs');
2
2
  const path = require('path');
3
3
  const { catFileExists, currentBranch, hasLocalBranch, hasRemoteBranch, mergeBaseIsAncestor, revListCount, runGit, statusPorcelain, worktreeList } = require('./git');
4
4
  const { parseJsonWithComments } = require('./json');
5
+ const { createTranslator } = require('./i18n/catalog');
5
6
  const { buildGraph, normalizeDeclaredDependencies, readAllSlices, SliceGraphError, topoSort } = require('./slice-graph');
6
7
  const { resolveSliceContext, toAlias, validateSliceMetaForStart } = require('./slice');
7
8
  const { validateProjectRelativePaths } = require('./paths');
@@ -12,6 +13,10 @@ function ensureExists(filePath, message) {
12
13
  }
13
14
  }
14
15
 
16
+ function readinessTranslator(options = {}) {
17
+ return createTranslator(options.language || 'es');
18
+ }
19
+
15
20
  function walkSlices(rootDir, acc, repoRoot) {
16
21
  if (!fs.existsSync(rootDir)) {
17
22
  return;
@@ -96,33 +101,33 @@ function collectOverlapWarnings(repoRoot, currentBranchName, currentFiles, baseR
96
101
  return warnings;
97
102
  }
98
103
 
99
- function validateLocalSliceArtifacts(repoRoot, slice) {
104
+ function validateLocalSliceArtifacts(repoRoot, slice, translator) {
100
105
  const sliceDir = path.dirname(slice.sliceAbs);
101
106
  for (const file of ['EXECUTION_BRIEF.md', 'CLOSURE_BRIEF.md']) {
102
107
  ensureExists(path.join(sliceDir, file), `create-quiver: falta '${path.posix.join(path.dirname(slice.sliceRel), file)}'.`);
103
108
  }
104
- console.log('PASS: El slice local tiene EXECUTION_BRIEF.md y CLOSURE_BRIEF.md.');
109
+ console.log(translator.t('readiness.local.briefs.pass'));
105
110
 
106
111
  if (!Array.isArray(slice.json.files) || slice.json.files.length === 0) {
107
- throw new Error('create-quiver: slice.json debe declarar al menos un archivo en files para validacion local.');
112
+ throw new Error(`create-quiver: ${translator.t('readiness.local.files.error.empty')}`);
108
113
  }
109
114
 
110
115
  const invalidFiles = slice.json.files.filter((file) => typeof file !== 'string' || file.trim().length === 0);
111
116
  if (invalidFiles.length > 0) {
112
- throw new Error('create-quiver: slice.json.files contiene entradas invalidas.');
117
+ throw new Error(`create-quiver: ${translator.t('readiness.local.files.error.invalid')}`);
113
118
  }
114
- console.log('PASS: slice.json declara archivos de alcance.');
119
+ console.log(translator.t('readiness.local.files.pass'));
115
120
 
116
121
  validateSliceMetaForStart(slice);
117
- console.log('PASS: slice.json declara metadata git compatible con start-slice.');
122
+ console.log(translator.t('readiness.local.git.pass'));
118
123
 
119
124
  validateProjectRelativePaths(slice.files, 'slice.json files/allowed_write_paths');
120
125
  validateProjectRelativePaths(slice.expectedReadPaths, 'slice.json expected_read_paths');
121
- console.log('PASS: slice.json declara rutas relativas seguras dentro del proyecto.');
126
+ console.log(translator.t('readiness.local.paths.pass'));
122
127
  }
123
128
 
124
- function baseRecoveryMessage(remote, baseBranch) {
125
- return `No se encontro la base '${baseBranch}' como rama local ni como '${remote}/${baseBranch}'. Para validacion estructural usa --local; para validacion contra otra base usa --base <branch>; o configura/fetchea el remoto '${remote}'.`;
129
+ function baseRecoveryMessage(remote, baseBranch, translator) {
130
+ return translator.t('readiness.base.recovery', { base: baseBranch, remote, remoteRef: `${remote}/${baseBranch}` });
126
131
  }
127
132
 
128
133
  function resolveReadinessRoot(localMode) {
@@ -137,6 +142,7 @@ function resolveReadinessRoot(localMode) {
137
142
  }
138
143
 
139
144
  function validateSliceDocumentedOnBase(repoRoot, slice, options = {}) {
145
+ const translator = readinessTranslator(options);
140
146
  const gate = options.gate || 'execution';
141
147
  const remote = options.remote || 'origin';
142
148
  const baseBranch = options.baseBranch || slice.baseBranch || 'develop';
@@ -145,19 +151,19 @@ function validateSliceDocumentedOnBase(repoRoot, slice, options = {}) {
145
151
  const hasLocalBase = hasLocalBranch(repoRoot, baseBranch);
146
152
 
147
153
  if (hasRemoteBase && catFileExists(repoRoot, `${remoteRef}:${slice.sliceRel}`)) {
148
- console.log(`PASS: El slice ya existe en ${remoteRef} (PR base documental mergeado).`);
154
+ console.log(translator.t('readiness.documented.remote.pass', { ref: remoteRef }));
149
155
  return remoteRef;
150
156
  }
151
157
 
152
158
  if (hasLocalBase && catFileExists(repoRoot, `${baseBranch}:${slice.sliceRel}`)) {
153
- console.log(`PASS: El slice ya existe en ${baseBranch} local (modo sin remote).`);
159
+ console.log(translator.t('readiness.documented.local.pass', { branch: baseBranch }));
154
160
  return baseBranch;
155
161
  }
156
162
 
157
163
  if (!hasRemoteBase && !hasLocalBase) {
158
- const guidance = baseRecoveryMessage(remote, baseBranch);
164
+ const guidance = baseRecoveryMessage(remote, baseBranch, translator);
159
165
  if (gate === 'validation') {
160
- console.log(`WARN: ${guidance}`);
166
+ console.log(translator.t('readiness.warn', { message: guidance }));
161
167
  return null;
162
168
  }
163
169
 
@@ -166,11 +172,11 @@ function validateSliceDocumentedOnBase(repoRoot, slice, options = {}) {
166
172
 
167
173
  const expectedBase = hasRemoteBase ? remoteRef : baseBranch;
168
174
  if (gate === 'validation') {
169
- console.log(`WARN: El slice no existe todavia en ${expectedBase}. El PR base documental sigue pendiente de merge. Podes abrir el PR del slice igual si el humano mergea en orden.`);
175
+ console.log(translator.t('readiness.documented.missing_validation.warn', { ref: expectedBase }));
170
176
  return expectedBase;
171
177
  }
172
178
 
173
- throw new Error(`create-quiver: el slice no existe en ${expectedBase}. Mergea primero el PR base documental o usa --local para validar solo estructura local.`);
179
+ throw new Error(`create-quiver: ${translator.t('readiness.documented.missing.error', { ref: expectedBase })}`);
174
180
  }
175
181
 
176
182
  function validateDeclaredDependencyContract(repoRoot, slice) {
@@ -227,12 +233,13 @@ function validateDeclaredDependencyContract(repoRoot, slice) {
227
233
  }
228
234
  }
229
235
 
230
- function localCheckSummary() {
231
- console.log('INFO: Modo local: checks ejecutados: spec docs, briefs, metadata git, scope declarado, rutas seguras, dependencias y gate.');
232
- console.log('INFO: Modo local: checks omitidos: existencia en base remota/local y overlap contra worktrees activos.');
236
+ function localCheckSummary(translator) {
237
+ console.log(translator.t('readiness.local.summary.executed'));
238
+ console.log(translator.t('readiness.local.summary.skipped'));
233
239
  }
234
240
 
235
241
  function checkSliceReadiness(sliceInput, options = {}) {
242
+ const translator = readinessTranslator(options);
236
243
  const gate = options.gate || 'execution';
237
244
  const localMode = options.local === true;
238
245
  const strictOverlap = options.strictOverlap === true;
@@ -244,17 +251,18 @@ function checkSliceReadiness(sliceInput, options = {}) {
244
251
  for (const specFile of ['SPEC.md', 'STATUS.md', 'EVIDENCE_REPORT.md']) {
245
252
  ensureExists(path.join(repoRoot, slice.specDirRel, specFile), `create-quiver: falta '${slice.specDirRel}/${specFile}'.`);
246
253
  }
247
- console.log('PASS: El spec local tiene SPEC.md, STATUS.md y EVIDENCE_REPORT.md.');
254
+ console.log(translator.t('readiness.spec_docs.pass'));
248
255
 
249
256
  let baseRef = null;
250
257
  if (localMode) {
251
- validateLocalSliceArtifacts(repoRoot, slice);
252
- console.log(`INFO: Modo local: se omite validacion de existencia del slice en ${remote}/${baseBranch} o ${baseBranch}.`);
253
- console.log('INFO: Modo local: se omite validacion de overlap contra worktrees activos basada en rama remota/base.');
258
+ validateLocalSliceArtifacts(repoRoot, slice, translator);
259
+ console.log(translator.t('readiness.local.skip_base', { base: baseBranch, remoteRef: `${remote}/${baseBranch}` }));
260
+ console.log(translator.t('readiness.local.skip_overlap'));
254
261
  } else {
255
262
  baseRef = validateSliceDocumentedOnBase(repoRoot, slice, {
256
263
  baseBranch,
257
264
  gate,
265
+ language: options.language,
258
266
  remote,
259
267
  });
260
268
  }
@@ -262,130 +270,132 @@ function checkSliceReadiness(sliceInput, options = {}) {
262
270
  if (!localMode) {
263
271
  const overlapWarnings = collectOverlapWarnings(repoRoot, currentBranch(repoRoot), slice.files, baseRef || `${remote}/${baseBranch}`);
264
272
  if (overlapWarnings.length === 0) {
265
- console.log('PASS: No se detecto overlap con worktrees activos.');
273
+ console.log(translator.t('readiness.overlap.none.pass'));
266
274
  } else {
267
275
  for (const warning of overlapWarnings) {
268
276
  const [overlapBranch, overlapFiles] = warning.split('|');
269
277
  if (strictOverlap) {
270
- throw new Error(`create-quiver: Overlap con worktree activo '${overlapBranch}': ${overlapFiles}`);
278
+ throw new Error(`create-quiver: ${translator.t('readiness.overlap.warning', { branch: overlapBranch, files: overlapFiles })}`);
271
279
  }
272
- console.log(`WARN: Overlap con worktree activo '${overlapBranch}': ${overlapFiles}`);
280
+ console.log(translator.t('readiness.overlap.warn', { branch: overlapBranch, files: overlapFiles }));
273
281
  }
274
282
  }
275
283
  }
276
284
 
277
285
  validateDeclaredDependencyContract(repoRoot, slice);
278
286
  if (localMode) {
279
- localCheckSummary();
287
+ localCheckSummary(translator);
280
288
  }
281
289
 
282
290
  switch (gate) {
283
291
  case 'ready':
284
292
  if (slice.status !== 'ready') {
285
- throw new Error(`create-quiver: Gate ready: slice.json debe estar en status=ready. Estado actual: ${slice.status}. Completa la especificacion en el Track 1 antes de pasar a ejecucion.`);
293
+ throw new Error(`create-quiver: ${translator.t('readiness.gate.ready.error_status', { status: slice.status })}`);
286
294
  }
287
- console.log('PASS: Gate ready: el slice esta marcado como ready para ejecucion.');
295
+ console.log(translator.t('readiness.gate.ready.pass'));
288
296
  break;
289
297
  case 'execution':
290
298
  if (slice.status === 'blocked') {
291
- throw new Error('create-quiver: El slice esta bloqueado (status=blocked). Resolve el bloqueante antes de ejecutar.');
299
+ throw new Error(`create-quiver: ${translator.t('readiness.gate.execution.error.blocked')}`);
292
300
  }
293
301
  if (slice.status === 'cancelled') {
294
- throw new Error('create-quiver: El slice esta cancelado (status=cancelled).');
302
+ throw new Error(`create-quiver: ${translator.t('readiness.gate.execution.error.cancelled')}`);
295
303
  }
296
304
  if (slice.status === 'completed') {
297
- console.log('WARN: El slice ya figura como completed. Revisa si realmente corresponde reejecutarlo.');
305
+ console.log(translator.t('readiness.gate.execution.warn.completed'));
298
306
  }
299
307
  if (slice.status === 'draft') {
300
- console.log("WARN: El slice esta en estado 'draft'. Considera marcarlo como 'ready' antes de ejecutar.");
308
+ console.log(translator.t('readiness.gate.execution.warn.draft'));
301
309
  }
302
- console.log('PASS: Gate execution: metadata y precondiciones minimas OK.');
310
+ console.log(translator.t('readiness.gate.execution.pass'));
303
311
  break;
304
312
  case 'validation':
305
313
  if (slice.status !== 'completed') {
306
- throw new Error('create-quiver: Para gate validation, slice.json debe estar en status=completed.');
314
+ throw new Error(`create-quiver: ${translator.t('readiness.gate.validation.error_status')}`);
307
315
  }
308
316
  if (!slice.json.completed_at) {
309
- throw new Error('create-quiver: Para gate validation, slice.json debe tener completed_at.');
317
+ throw new Error(`create-quiver: ${translator.t('readiness.gate.validation.error_completed_at')}`);
310
318
  }
311
319
  if (!slice.json.started_at) {
312
- throw new Error('create-quiver: Para gate validation, slice.json debe tener started_at.');
320
+ throw new Error(`create-quiver: ${translator.t('readiness.gate.validation.error_started_at')}`);
313
321
  }
314
322
  if (!slice.json.actual_hours || Number(slice.json.actual_hours) <= 0) {
315
- throw new Error('create-quiver: Para gate validation, slice.json debe tener actual_hours > 0.');
323
+ throw new Error(`create-quiver: ${translator.t('readiness.gate.validation.error_actual_hours')}`);
316
324
  }
317
- console.log('PASS: Gate validation: slice marcado como completado y con trazabilidad minima.');
325
+ console.log(translator.t('readiness.gate.validation.pass'));
318
326
  break;
319
327
  }
320
328
  }
321
329
 
322
- function checkPrReadiness(sliceInput) {
330
+ function checkPrReadiness(sliceInput, options = {}) {
331
+ const translator = readinessTranslator(options);
323
332
  const repoRoot = runGit(['rev-parse', '--show-toplevel'], process.cwd());
324
333
  const scriptDir = path.dirname(__filename);
325
334
  const slice = resolveSliceContext(repoRoot, sliceInput);
326
335
  const current = currentBranch(repoRoot);
327
336
  const prPath = path.join(path.dirname(slice.sliceAbs), 'pr.md');
328
337
 
329
- checkSliceReadiness(slice.sliceRel, { gate: 'validation' });
330
- checkScope(slice.sliceRel, { strict: true });
338
+ checkSliceReadiness(slice.sliceRel, { gate: 'validation', language: options.language });
339
+ checkScope(slice.sliceRel, { language: options.language, strict: true });
331
340
 
332
341
  if (!slice.branchName) {
333
- throw new Error('create-quiver: Falta git.branch_name en el slice.');
342
+ throw new Error(`create-quiver: ${translator.t('readiness.pr.error.missing_branch')}`);
334
343
  }
335
344
  if (!fs.existsSync(prPath)) {
336
- throw new Error('create-quiver: Falta pr.md junto al slice.');
345
+ throw new Error(`create-quiver: ${translator.t('readiness.pr.error.missing_pr')}`);
337
346
  }
338
347
  if (current !== slice.branchName) {
339
- throw new Error(`create-quiver: Debes ejecutar este check desde la rama del slice. Actual: ${current} Esperada: ${slice.branchName}`);
348
+ throw new Error(`create-quiver: ${translator.t('readiness.pr.error.wrong_branch', { actual: current, expected: slice.branchName })}`);
340
349
  }
341
- console.log('PASS: La rama actual coincide con la rama declarada por el slice.');
350
+ console.log(translator.t('readiness.pr.branch.pass'));
342
351
  if (statusPorcelain(repoRoot) !== '') {
343
- throw new Error('create-quiver: El worktree no esta limpio. Cerra la implementacion antes de abrir el PR.');
352
+ throw new Error(`create-quiver: ${translator.t('readiness.pr.error.dirty')}`);
344
353
  }
345
- console.log('PASS: El worktree esta limpio.');
354
+ console.log(translator.t('readiness.pr.clean.pass'));
346
355
 
347
356
  const aheadCount = revListCount(repoRoot, 'origin/develop..HEAD');
348
357
  if (aheadCount <= 0) {
349
358
  if (mergeBaseIsAncestor(repoRoot, 'HEAD', 'origin/develop')) {
350
- throw new Error('create-quiver: La rama ya fue absorbida por origin/develop. Este gate aplica antes del merge.');
359
+ throw new Error(`create-quiver: ${translator.t('readiness.pr.error.absorbed')}`);
351
360
  }
352
- throw new Error('create-quiver: La rama no tiene commits propios respecto de origin/develop.');
361
+ throw new Error(`create-quiver: ${translator.t('readiness.pr.error.no_commits')}`);
353
362
  }
354
- console.log('PASS: La rama tiene commits propios contra origin/develop.');
363
+ console.log(translator.t('readiness.pr.commits.pass'));
355
364
 
356
365
  const prText = fs.readFileSync(prPath, 'utf8');
357
366
  for (const heading of ['## Title', '## Summary', '## Scope', '## Files', '## How to Test (DETAILED - REQUIRED)', '## Evidence', '## Rollback', '## Risks / Notes']) {
358
367
  if (!prText.includes(heading)) {
359
- throw new Error(`create-quiver: Falta la seccion obligatoria '${heading}' en pr.md.`);
368
+ throw new Error(`create-quiver: ${translator.t('readiness.pr.error.missing_section', { heading })}`);
360
369
  }
361
370
  }
362
- console.log('PASS: pr.md contiene las secciones obligatorias.');
371
+ console.log(translator.t('readiness.pr.sections.pass'));
363
372
 
364
373
  for (const subheading of ['### Required Environment', '### Worktree Access', '### Run the Project', '### Use Cases', '### Technical Verification']) {
365
374
  if (!prText.includes(subheading)) {
366
- throw new Error(`create-quiver: Falta la subseccion '${subheading}' dentro de How to Test.`);
375
+ throw new Error(`create-quiver: ${translator.t('readiness.pr.error.missing_subsection', { subheading })}`);
367
376
  }
368
377
  }
369
- console.log('PASS: How to Test incluye entorno, acceso al worktree, arranque, casos de uso y verificación técnica.');
378
+ console.log(translator.t('readiness.pr.how_to_test.pass'));
370
379
 
371
380
  if (!/#### Case [0-9]+:/.test(prText)) {
372
- throw new Error('create-quiver: How to Test debe tener al menos un caso de uso documentado (#### Case 1: ...).');
381
+ throw new Error(`create-quiver: ${translator.t('readiness.pr.error.no_case')}`);
373
382
  }
374
- console.log('PASS: Al menos un caso de uso documentado.');
383
+ console.log(translator.t('readiness.pr.case.pass'));
375
384
 
376
385
  if (!/git revert /.test(prText)) {
377
- throw new Error('create-quiver: Rollback debe incluir al menos un comando git revert.');
386
+ throw new Error(`create-quiver: ${translator.t('readiness.pr.error.rollback')}`);
378
387
  }
379
- console.log('PASS: Rollback incluye comando git revert.');
388
+ console.log(translator.t('readiness.pr.rollback.pass'));
380
389
 
381
390
  if (/^\s*-\s*`manual review`$/mi.test(prText) || /^\s*-\s*`visual check`$/mi.test(prText) || /^\s*-\s*`screen test`$/mi.test(prText) || /^\s*-\s*`visual validation`$/mi.test(prText)) {
382
391
  throw new Error('create-quiver: How to Test cannot rely only on generic phrases.');
383
392
  }
384
393
 
385
- console.log(`PASS: Gate PR listo para '${slice.sliceId}'.`);
394
+ console.log(translator.t('readiness.pr.ready.pass', { slice: slice.sliceId }));
386
395
  }
387
396
 
388
397
  function checkScope(sliceInput, options = {}) {
398
+ const translator = readinessTranslator(options);
389
399
  const strict = options.strict === true;
390
400
  const remote = options.remote || 'origin';
391
401
  const repoRoot = runGit(['rev-parse', '--show-toplevel'], process.cwd());
@@ -420,14 +430,14 @@ function checkScope(sliceInput, options = {}) {
420
430
  let touchedRaw = '';
421
431
  if (baseRef) {
422
432
  touchedRaw = runGit(['diff', '--name-only', `${baseRef}...HEAD`], repoRoot);
423
- console.log(`INFO: check-scope base: ${baseRef} (${baseSource}).`);
433
+ console.log(translator.t('readiness.scope.base.info', { ref: baseRef, source: baseSource }));
424
434
  } else {
425
- console.log(`WARN: No se encontro base para check-scope. Probadas: ${candidateBaseBranches.join(', ')}. Usa --base <branch> o configura git.base_branch en slice.json.`);
435
+ console.log(translator.t('readiness.scope.base.warn', { branches: candidateBaseBranches.join(', ') }));
426
436
  return;
427
437
  }
428
438
 
429
439
  if (!touchedRaw) {
430
- console.log(`WARN: No se encontraron archivos modificados respecto de ${baseRef}.`);
440
+ console.log(translator.t('readiness.scope.empty.warn', { ref: baseRef }));
431
441
  return;
432
442
  }
433
443
 
@@ -451,7 +461,7 @@ function checkScope(sliceInput, options = {}) {
451
461
  });
452
462
 
453
463
  if (outOfScope.length === 0) {
454
- console.log('PASS: Todos los archivos tocados estan dentro del scope declarado en slice.json.');
464
+ console.log(translator.t('readiness.scope.pass'));
455
465
  return;
456
466
  }
457
467
 
@@ -459,16 +469,16 @@ function checkScope(sliceInput, options = {}) {
459
469
  for (const file of outOfScope) {
460
470
  violationCount += 1;
461
471
  if (strict) {
462
- throw new Error(`create-quiver: Archivo fuera del scope: ${file}`);
472
+ throw new Error(`create-quiver: ${translator.t('readiness.scope.error.file', { file })}`);
463
473
  }
464
- console.log(`WARN: Archivo fuera del scope: ${file}`);
474
+ console.log(translator.t('readiness.scope.warn.file', { file }));
465
475
  }
466
476
 
467
477
  if (violationCount > 0) {
468
478
  if (strict) {
469
- throw new Error(`${violationCount} archivo(s) fuera del scope declarado. Actualiza slice.json.files o revierte los cambios fuera de alcance.`);
479
+ throw new Error(translator.t('readiness.scope.error.count', { count: violationCount }));
470
480
  }
471
- console.log(`WARN: ${violationCount} archivo(s) fuera del scope declarado. Considera actualizar slice.json.files o revertir los cambios no previstos.`);
481
+ console.log(translator.t('readiness.scope.warn.count', { count: violationCount }));
472
482
  }
473
483
  }
474
484
 
@@ -1,3 +1,5 @@
1
+ const { formatStatus, translatorForHuman } = require('../i18n/read-only-format');
2
+
1
3
  function isUnicodeEnabled(options = {}) {
2
4
  if (options.unicode === true) {
3
5
  return true;
@@ -53,10 +55,10 @@ function countParallelLots(level, conflicts) {
53
55
  }
54
56
 
55
57
  function formatLevelHeader(levelIndex, level, conflicts, options = {}) {
56
- const unicode = isUnicodeEnabled(options);
57
- const label = unicode ? `Level ${levelIndex}` : `Level ${levelIndex}`;
58
+ const translator = translatorForHuman(options);
59
+ const label = translator.t('graph.level', { level: levelIndex });
58
60
  const lotCount = countParallelLots(level, conflicts);
59
- return `${label} (${level.length} slices, ${lotCount} lots)`;
61
+ return `${label} (${translator.t('graph.slices_count', { count: level.length })}, ${translator.t('graph.lots_count', { count: lotCount })})`;
60
62
  }
61
63
 
62
64
  function formatConflictSuffix(conflict, options = {}) {
@@ -73,6 +75,7 @@ function formatConflictSuffix(conflict, options = {}) {
73
75
 
74
76
  function renderTreeGraph(report, options = {}) {
75
77
  const unicode = isUnicodeEnabled(options);
78
+ const translator = translatorForHuman(options);
76
79
  const branch = unicode ? '├─' : '+--';
77
80
  const lastBranch = unicode ? '└─' : '\\--';
78
81
  const pipe = unicode ? '│ ' : '| ';
@@ -80,10 +83,10 @@ function renderTreeGraph(report, options = {}) {
80
83
  const lines = [];
81
84
 
82
85
  if (!Array.isArray(report.levels) || report.levels.length === 0) {
83
- return 'No pending slices found.\n';
86
+ return `${translator.t('graph.empty.pending')}\n`;
84
87
  }
85
88
 
86
- lines.push('Quiver graph');
89
+ lines.push(translator.t('graph.title'));
87
90
 
88
91
  report.levels.forEach((level, levelIndex) => {
89
92
  const levelConflicts = Array.isArray(report.conflicts)
@@ -98,7 +101,7 @@ function renderTreeGraph(report, options = {}) {
98
101
  const sharedPaths = conflict && options.showConflicts ? ` ${formatConflictSuffix(conflict, options)}` : '';
99
102
  const title = slice.title ? ` ${slice.title}` : '';
100
103
  const hours = typeof slice.hours === 'number' ? ` (${slice.hours}h)` : '';
101
- const status = slice.status ? ` [${slice.status}]` : '';
104
+ const status = slice.status ? ` [${formatStatus(slice.status, translator)}]` : '';
102
105
  lines.push(`${connector} ${marker} ${slice.ref}${title}${hours}${status}${sharedPaths}`.replace(/\s+/g, ' ').trimEnd());
103
106
  });
104
107
 
@@ -20,6 +20,7 @@ const {
20
20
  } = require('./git');
21
21
  const { parseJsonWithComments } = require('./json');
22
22
  const { acquireLock, releaseLock, withLockSync } = require('./locks');
23
+ const { createTranslator } = require('./i18n/catalog');
23
24
  const { safeBranchName, worktreesRootForRepo } = require('./slice');
24
25
 
25
26
  function formatError(message) {
@@ -239,23 +240,24 @@ function buildSpecStatus(repoRoot, specInput) {
239
240
  };
240
241
  }
241
242
 
242
- function formatSpecStatus(status) {
243
+ function formatSpecStatus(status, options = {}) {
244
+ const translator = createTranslator(options.language);
243
245
  const lines = [
244
- 'Spec worktree status',
245
- `Spec: ${status.relativeSpecDir}`,
246
- `Branch: ${status.branchName}`,
247
- `Worktree: ${status.existingWorktree || status.worktreePath}`,
248
- `Worktree missing/stale: ${status.worktreeMissing ? 'yes' : 'no'}`,
249
- `Worktree registered: ${status.existingWorktree ? 'yes' : 'no'}`,
250
- status.worktreeExpectedPathUnregistered ? 'Worktree note: expected path exists but is not registered in git worktree list.' : '',
251
- `Worktree dirty: ${status.worktreeDirty ? 'yes' : 'no'}`,
246
+ translator.t('spec_status.title'),
247
+ translator.t('spec_status.spec', { path: status.relativeSpecDir }),
248
+ translator.t('spec_status.branch', { branch: status.branchName }),
249
+ translator.t('spec_status.worktree', { path: status.existingWorktree || status.worktreePath }),
250
+ translator.t('spec_status.worktree_missing_stale', { value: status.worktreeMissing ? translator.t('common.yes') : translator.t('common.no') }),
251
+ translator.t('spec_status.worktree_registered', { value: status.existingWorktree ? translator.t('common.yes') : translator.t('common.no') }),
252
+ status.worktreeExpectedPathUnregistered ? translator.t('spec_status.worktree_note_unregistered') : '',
253
+ translator.t('spec_status.worktree_dirty', { value: status.worktreeDirty ? translator.t('common.yes') : translator.t('common.no') }),
252
254
  `slice-00: ${status.slice00 ? status.slice00.status : 'missing'}`,
253
- `Later slices blocked: ${status.laterSlicesBlocked ? 'yes' : 'no'}`,
254
- 'Pending slices:',
255
+ translator.t('spec_status.later_slices_blocked', { value: status.laterSlicesBlocked ? translator.t('common.yes') : translator.t('common.no') }),
256
+ translator.t('spec_status.pending_slices'),
255
257
  ];
256
258
 
257
259
  if (status.pendingSlices.length === 0) {
258
- lines.push('- none');
260
+ lines.push(`- ${translator.t('common.none')}`);
259
261
  } else {
260
262
  for (const slice of status.pendingSlices) {
261
263
  lines.push(`- ${slice.id}: ${slice.status}`);
@@ -346,15 +348,16 @@ function startSpecWorktree(repoRoot, specInput, options = {}) {
346
348
  }, run);
347
349
  }
348
350
 
349
- function formatSpecStartResult(result) {
351
+ function formatSpecStartResult(result, options = {}) {
352
+ const translator = createTranslator(options.language);
350
353
  return `${[
351
- result.dryRun ? 'Spec worktree start dry-run' : 'Spec worktree ready',
352
- `Branch: ${result.branchName}`,
353
- `Base: ${result.baseRef}`,
354
- `Worktree: ${result.worktreePath}`,
355
- `Reused: ${result.reused ? 'yes' : 'no'}`,
354
+ result.dryRun ? translator.t('spec_start.title.dry_run') : translator.t('spec_start.title.ready'),
355
+ translator.t('spec_start.branch', { branch: result.branchName }),
356
+ translator.t('spec_start.base', { base: result.baseRef }),
357
+ translator.t('spec_start.worktree', { path: result.worktreePath }),
358
+ translator.t('spec_start.reused', { value: result.reused ? translator.t('common.yes') : translator.t('common.no') }),
356
359
  `slice-00: ${result.slice00 ? result.slice00.status : 'missing'}`,
357
- result.dryRun && !result.reused ? `Would create worktree: ${result.worktreePath}` : '',
360
+ result.dryRun && !result.reused ? translator.t('spec_start.would_create_worktree', { path: result.worktreePath }) : '',
358
361
  ].filter(Boolean).join('\n')}\n`;
359
362
  }
360
363
 
@@ -443,24 +446,25 @@ function closeSpecWorktree(repoRoot, specInput, options = {}) {
443
446
  }
444
447
  }
445
448
 
446
- function formatSpecCloseResult(result) {
449
+ function formatSpecCloseResult(result, options = {}) {
450
+ const translator = createTranslator(options.language);
447
451
  const lines = [
448
- result.dryRun ? 'Spec close dry-run' : 'Spec worktree closed',
449
- `Spec: ${result.relativeSpecDir}`,
450
- `Branch: ${result.branchName}`,
451
- `Base: ${result.baseRef}`,
452
- `Worktree: ${result.worktreePath}`,
453
- `Discard: ${result.discarded ? 'yes' : 'no'}`,
452
+ result.dryRun ? translator.t('spec_close.title.dry_run') : translator.t('spec_close.title.closed'),
453
+ translator.t('spec_close.spec', { path: result.relativeSpecDir }),
454
+ translator.t('spec_close.branch', { branch: result.branchName }),
455
+ translator.t('spec_close.base', { base: result.baseRef }),
456
+ translator.t('spec_close.worktree', { path: result.worktreePath }),
457
+ translator.t('spec_close.discard', { value: result.discarded ? translator.t('common.yes') : translator.t('common.no') }),
454
458
  ];
455
459
 
456
460
  if (result.dryRun) {
457
- lines.push(`Would remove worktree: ${result.worktreePath}`);
461
+ lines.push(translator.t('spec_close.would_remove_worktree', { path: result.worktreePath }));
458
462
  if (!result.discarded && result.remote) {
459
- lines.push(`Would pull: git pull --ff-only ${result.remote} ${result.baseBranch}`);
463
+ lines.push(translator.t('spec_close.would_pull', { command: `git pull --ff-only ${result.remote} ${result.baseBranch}` }));
460
464
  }
461
465
  } else {
462
- lines.push(`Removed worktree: ${result.removed ? 'yes' : 'no'}`);
463
- lines.push(`Pulled main checkout: ${result.pulled ? 'yes' : 'no'}`);
466
+ lines.push(translator.t('spec_close.removed_worktree', { value: result.removed ? translator.t('common.yes') : translator.t('common.no') }));
467
+ lines.push(translator.t('spec_close.pulled_main_checkout', { value: result.pulled ? translator.t('common.yes') : translator.t('common.no') }));
464
468
  }
465
469
 
466
470
  return `${lines.join('\n')}\n`;