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
@@ -0,0 +1,939 @@
1
+ const fs = require('node:fs');
2
+ const path = require('node:path');
3
+
4
+ const { collectLifecycleExport } = require('./ai/export-state');
5
+ const { createTranslator } = require('./i18n/catalog');
6
+ const {
7
+ collectActiveSliceState,
8
+ filterSlicesForExecution,
9
+ groupSlicesBySpec,
10
+ isBlockedStatus,
11
+ isCompletedStatus,
12
+ normalizeStatus,
13
+ progressForSlice,
14
+ resolveProjectState,
15
+ summarizeGraph,
16
+ } = require('./project-state-resolver');
17
+ const { relativePosixPath } = require('./paths');
18
+
19
+ const DASHBOARD_SCHEMA_VERSION = 1;
20
+ const SPEC_FAMILIES = Object.freeze(['specs', 'specs-fix']);
21
+ const DEFAULT_DASHBOARD_LIMIT = 2;
22
+ const MAX_DASHBOARD_LIMIT = 100;
23
+ const SUPPORTED_DASHBOARD_SECTIONS = Object.freeze([
24
+ 'overview',
25
+ 'specs',
26
+ 'slices',
27
+ 'blockers',
28
+ 'warnings',
29
+ 'agents',
30
+ 'approvals',
31
+ 'runs',
32
+ 'active-slice',
33
+ 'next-steps',
34
+ ]);
35
+
36
+ class DashboardError extends Error {
37
+ constructor(code, message, nextCommand = 'npx create-quiver dashboard') {
38
+ super(message);
39
+ this.name = 'DashboardError';
40
+ this.code = code;
41
+ this.nextCommand = nextCommand;
42
+ }
43
+ }
44
+
45
+ function translatorForOptions(options = {}) {
46
+ return createTranslator(options.json ? 'en' : options.language);
47
+ }
48
+
49
+ function formatStatus(status, translator) {
50
+ const key = `status.${String(status || '').replace(/-/g, '_')}`;
51
+ const translated = translator.t(key);
52
+ return translated.startsWith('[missing:') ? String(status || '') : translated;
53
+ }
54
+
55
+ function formatWarningMessage(warning, specSlug, translator) {
56
+ if (warning.code === 'NO_SPECS_FOUND') {
57
+ return translator.t('dashboard.warning.no_specs_found');
58
+ }
59
+ if (warning.code === 'NO_VISIBLE_SLICES') {
60
+ return specSlug
61
+ ? translator.t('dashboard.warning.no_visible_slices_for_spec', { spec: specSlug })
62
+ : translator.t('dashboard.warning.no_visible_slices');
63
+ }
64
+ return warning.message;
65
+ }
66
+
67
+ function translateIfCatalogKey(value, translator) {
68
+ const text = String(value || '');
69
+ if (!text.startsWith('dashboard.')) {
70
+ return text;
71
+ }
72
+ return translator.t(text);
73
+ }
74
+
75
+ function compareRefs(left, right) {
76
+ return String(left || '').localeCompare(String(right || ''));
77
+ }
78
+
79
+ function toPosix(filePath) {
80
+ return String(filePath || '').split(path.sep).join('/');
81
+ }
82
+
83
+ function isPlaceholderSpecDir(name) {
84
+ return String(name || '').startsWith('[') && String(name || '').endsWith(']');
85
+ }
86
+
87
+ function listSpecDirectories(projectRoot) {
88
+ const specs = [];
89
+
90
+ for (const family of SPEC_FAMILIES) {
91
+ const familyPath = path.join(projectRoot, family);
92
+ if (!fs.existsSync(familyPath)) {
93
+ continue;
94
+ }
95
+
96
+ for (const entry of fs.readdirSync(familyPath, { withFileTypes: true })) {
97
+ if (!entry.isDirectory() || isPlaceholderSpecDir(entry.name)) {
98
+ continue;
99
+ }
100
+ const specRoot = path.join(familyPath, entry.name);
101
+ const hasSpecSignals = fs.existsSync(path.join(specRoot, 'SPEC.md'))
102
+ || fs.existsSync(path.join(specRoot, 'STATUS.md'))
103
+ || fs.existsSync(path.join(specRoot, 'slices'));
104
+ if (!hasSpecSignals) {
105
+ continue;
106
+ }
107
+ specs.push({
108
+ family,
109
+ path: toPosix(path.join(family, entry.name)),
110
+ slug: entry.name,
111
+ spec_path: fs.existsSync(path.join(specRoot, 'SPEC.md')) ? toPosix(path.join(family, entry.name, 'SPEC.md')) : null,
112
+ status_path: fs.existsSync(path.join(specRoot, 'STATUS.md')) ? toPosix(path.join(family, entry.name, 'STATUS.md')) : null,
113
+ });
114
+ }
115
+ }
116
+
117
+ return specs.sort((left, right) => left.slug.localeCompare(right.slug) || left.family.localeCompare(right.family));
118
+ }
119
+
120
+ function sliceStatus(slice) {
121
+ return normalizeStatus('slice', slice?.canonical_status || slice?.status, 'planned');
122
+ }
123
+
124
+ function isClosedSlice(slice) {
125
+ const status = sliceStatus(slice);
126
+ return status === 'completed' || status === 'skipped';
127
+ }
128
+
129
+ function summarizeProgress(slices) {
130
+ const items = Array.isArray(slices) ? slices : [];
131
+ const total = items.length;
132
+ const completed = items.filter((slice) => isCompletedStatus('slice', sliceStatus(slice))).length;
133
+ const skipped = items.filter((slice) => sliceStatus(slice) === 'skipped').length;
134
+ const blocked = items.filter((slice) => isBlockedStatus('slice', sliceStatus(slice), slice)).length;
135
+ const open = Math.max(0, total - completed - skipped);
136
+ const percent = total === 0 ? 0 : Math.round((completed / total) * 100);
137
+
138
+ return {
139
+ total,
140
+ completed,
141
+ skipped,
142
+ open,
143
+ blocked,
144
+ percent,
145
+ };
146
+ }
147
+
148
+ function normalizeSlice(projectRoot, slice) {
149
+ const sliceJsonPath = relativePosixPath(projectRoot, slice.slicePath);
150
+ const status = sliceStatus(slice);
151
+ return {
152
+ ref: slice.ref,
153
+ id: slice.sliceId,
154
+ title: slice.title || slice.sliceId,
155
+ status: slice.status || status,
156
+ canonical_status: status,
157
+ progress: progressForSlice(slice),
158
+ spec_slug: slice.specSlug,
159
+ spec_family: slice.specFamily,
160
+ path: relativePosixPath(projectRoot, slice.sliceDir),
161
+ slice_json: sliceJsonPath,
162
+ depends_on: Array.isArray(slice.depends_on) ? slice.depends_on : [],
163
+ blocked_reason: slice.json?.blocked_reason || null,
164
+ files_count: Array.isArray(slice.files) ? slice.files.length : 0,
165
+ start_slice_command: status === 'blocked' || isClosedSlice(slice) ? null : `npx create-quiver start-slice "${sliceJsonPath}"`,
166
+ };
167
+ }
168
+
169
+ function normalizeSpec(spec, projectRoot) {
170
+ const progress = summarizeProgress(spec.slices);
171
+ const specPath = toPosix(path.join(spec.specFamily, spec.specSlug));
172
+ return {
173
+ slug: spec.specSlug,
174
+ family: spec.specFamily,
175
+ path: specPath,
176
+ spec_path: fs.existsSync(path.join(projectRoot, specPath, 'SPEC.md')) ? toPosix(path.join(specPath, 'SPEC.md')) : null,
177
+ status_path: fs.existsSync(path.join(projectRoot, specPath, 'STATUS.md')) ? toPosix(path.join(specPath, 'STATUS.md')) : null,
178
+ status: spec.status,
179
+ canonical_status: normalizeStatus('spec', spec.canonical_status || spec.status, 'planned'),
180
+ progress,
181
+ slices: spec.slices.map((slice) => slice.ref).sort(compareRefs),
182
+ };
183
+ }
184
+
185
+ function mergeSpecDirectories(specs, directories) {
186
+ const byKey = new Map(specs.map((spec) => [`${spec.family}/${spec.slug}`, spec]));
187
+
188
+ for (const directory of directories) {
189
+ const key = `${directory.family}/${directory.slug}`;
190
+ if (byKey.has(key)) {
191
+ continue;
192
+ }
193
+ byKey.set(key, {
194
+ slug: directory.slug,
195
+ family: directory.family,
196
+ path: directory.path,
197
+ spec_path: directory.spec_path,
198
+ status_path: directory.status_path,
199
+ status: 'draft',
200
+ canonical_status: 'draft',
201
+ progress: summarizeProgress([]),
202
+ slices: [],
203
+ });
204
+ }
205
+
206
+ return Array.from(byKey.values()).sort((left, right) => left.slug.localeCompare(right.slug) || left.family.localeCompare(right.family));
207
+ }
208
+
209
+ function compactAgents(agents) {
210
+ return (Array.isArray(agents) ? agents : []).map((agent) => ({
211
+ role: agent.role,
212
+ configured: Boolean(agent.configured),
213
+ provider: agent.provider || null,
214
+ model: agent.model || null,
215
+ status: agent.status || 'idle',
216
+ canonical_status: agent.canonical_status || 'idle',
217
+ }));
218
+ }
219
+
220
+ function compactApprovals(approvals) {
221
+ return (Array.isArray(approvals) ? approvals : []).map((approval) => ({
222
+ phase: approval.phase,
223
+ status: approval.status,
224
+ canonical_status: approval.canonical_status,
225
+ latest_draft_version: approval.latest_draft_version || null,
226
+ approved_version: approval.approved_version || null,
227
+ error: approval.error || null,
228
+ }));
229
+ }
230
+
231
+ function compactRuns(runs) {
232
+ return (Array.isArray(runs) ? runs : []).map((run) => ({
233
+ run_id: run.run_id,
234
+ phase: run.phase,
235
+ status: run.status,
236
+ canonical_status: run.canonical_status,
237
+ spec_slug: run.spec_slug || null,
238
+ next_command: run.next_command || null,
239
+ updated_at: run.updated_at || null,
240
+ }));
241
+ }
242
+
243
+ function collectEvidenceSummary(slices) {
244
+ const refs = [];
245
+ let count = 0;
246
+
247
+ for (const slice of Array.isArray(slices) ? slices : []) {
248
+ const evidence = Array.isArray(slice.json?.evidence) ? slice.json.evidence : [];
249
+ if (evidence.length === 0) {
250
+ continue;
251
+ }
252
+ count += evidence.length;
253
+ refs.push(slice.ref);
254
+ }
255
+
256
+ return {
257
+ count,
258
+ slice_refs: Array.from(new Set(refs)).sort(compareRefs),
259
+ };
260
+ }
261
+
262
+ function filterGraphForRefs(graph, selectedRefs) {
263
+ if (!graph?.ok) {
264
+ return graph;
265
+ }
266
+
267
+ const refs = selectedRefs instanceof Set ? selectedRefs : new Set(selectedRefs);
268
+ return {
269
+ ...graph,
270
+ edges: graph.edges.filter((edge) => refs.has(edge.from) && refs.has(edge.to)),
271
+ levels: graph.levels
272
+ .map((level) => ({
273
+ level: level.level,
274
+ slices: level.slices.filter((ref) => refs.has(ref)),
275
+ }))
276
+ .filter((level) => level.slices.length > 0)
277
+ .map((level, index) => ({
278
+ ...level,
279
+ level: index,
280
+ })),
281
+ conflicts: graph.conflicts
282
+ .map((conflict) => ({
283
+ files: conflict.files,
284
+ slices: conflict.slices.filter((ref) => refs.has(ref)),
285
+ }))
286
+ .filter((conflict) => conflict.slices.length > 1),
287
+ };
288
+ }
289
+
290
+ function buildReadyRefs(graph, pendingSlices) {
291
+ if (!graph?.ok) {
292
+ return new Set();
293
+ }
294
+
295
+ const pendingRefs = new Set((Array.isArray(pendingSlices) ? pendingSlices : []).map((slice) => slice.ref));
296
+ const incomingCounts = new Map(Array.from(pendingRefs).map((ref) => [ref, 0]));
297
+
298
+ for (const edge of graph.edges || []) {
299
+ if (!pendingRefs.has(edge.from) || !pendingRefs.has(edge.to)) {
300
+ continue;
301
+ }
302
+ incomingCounts.set(edge.to, (incomingCounts.get(edge.to) || 0) + 1);
303
+ }
304
+
305
+ return new Set(Array.from(incomingCounts.entries())
306
+ .filter(([, count]) => count === 0)
307
+ .map(([ref]) => ref));
308
+ }
309
+
310
+ function selectNextReady({ graph, pendingSlices, visibleSlices, projectRoot }) {
311
+ const readyRefs = buildReadyRefs(graph, pendingSlices);
312
+ const next = (Array.isArray(visibleSlices) ? visibleSlices : [])
313
+ .filter((slice) => readyRefs.has(slice.ref))
314
+ .filter((slice) => !isBlockedStatus('slice', sliceStatus(slice), slice))
315
+ .filter((slice) => !isClosedSlice(slice))
316
+ .sort((left, right) => compareRefs(left.ref, right.ref))[0] || null;
317
+
318
+ return next ? normalizeSlice(projectRoot, next) : null;
319
+ }
320
+
321
+ function normalizeWarning(code, message) {
322
+ return { code, message };
323
+ }
324
+
325
+ function collectWarnings({ graphSummary, layout, specDirs, specSlug, visibleSlices }) {
326
+ const warnings = [];
327
+
328
+ if (!graphSummary.ok && graphSummary.error?.message) {
329
+ warnings.push(normalizeWarning(graphSummary.error.code || 'GRAPH_ERROR', graphSummary.error.message));
330
+ }
331
+
332
+ if (layout.layout === 'legacy' || layout.layout === 'hybrid' || layout.layout === 'incomplete') {
333
+ warnings.push(normalizeWarning('LAYOUT_REQUIRES_ATTENTION', layout.recommendations.join(' ')));
334
+ }
335
+
336
+ if (specDirs.length === 0) {
337
+ warnings.push(normalizeWarning('NO_SPECS_FOUND', 'No specs were found in specs/ or specs-fix/.'));
338
+ }
339
+
340
+ if (visibleSlices.length === 0) {
341
+ warnings.push(normalizeWarning(
342
+ 'NO_VISIBLE_SLICES',
343
+ specSlug
344
+ ? `No visible slices were found for spec '${specSlug}' with the current filters.`
345
+ : 'No visible slices were found with the current filters.',
346
+ ));
347
+ }
348
+
349
+ return warnings;
350
+ }
351
+
352
+ function collectBlockers({ graphSummary, layout, activeSlice, visibleSlices }) {
353
+ const blockers = [];
354
+
355
+ for (const slice of visibleSlices) {
356
+ if (isBlockedStatus('slice', sliceStatus(slice), slice)) {
357
+ blockers.push({
358
+ ref: slice.ref,
359
+ reason: slice.json?.blocked_reason || 'blocked',
360
+ });
361
+ }
362
+ }
363
+
364
+ if (!graphSummary.ok && graphSummary.error?.message) {
365
+ blockers.push({ ref: 'slice-graph', reason: graphSummary.error.message });
366
+ }
367
+
368
+ if (layout.layout === 'legacy' || layout.layout === 'hybrid' || layout.layout === 'incomplete') {
369
+ blockers.push({ ref: 'migration', reason: layout.recommendations.join(' ') });
370
+ }
371
+
372
+ if (activeSlice?.reconciliation?.decision === 'blocked') {
373
+ blockers.push({ ref: 'active-slice', reason: activeSlice.reconciliation.reason });
374
+ }
375
+
376
+ return blockers;
377
+ }
378
+
379
+ function collectNextSteps({ graphSummary, nextReady, selectedSpec, specSlug, visibleSlices }) {
380
+ const steps = [];
381
+
382
+ if (!graphSummary.ok) {
383
+ steps.push({
384
+ id: 'inspect-graph',
385
+ command: specSlug ? `npx create-quiver graph --spec ${specSlug}` : 'npx create-quiver graph',
386
+ reason: 'Inspect slice dependency issues before executing slices.',
387
+ });
388
+ return steps;
389
+ }
390
+
391
+ if (nextReady) {
392
+ steps.push({
393
+ id: 'start-next-ready-slice',
394
+ command: nextReady.start_slice_command,
395
+ reason: `Start ${nextReady.ref}.`,
396
+ });
397
+ }
398
+
399
+ if (selectedSpec?.path) {
400
+ steps.push({
401
+ id: 'validate-spec',
402
+ command: `npx create-quiver spec validate ${selectedSpec.path}`,
403
+ reason: 'Validate the spec package before execution or PR work.',
404
+ });
405
+ }
406
+
407
+ if (!nextReady && visibleSlices.length === 0 && specSlug) {
408
+ steps.push({
409
+ id: 'include-completed-history',
410
+ command: `npx create-quiver dashboard --spec ${specSlug} --include-completed`,
411
+ reason: 'Show completed history for this spec.',
412
+ });
413
+ }
414
+
415
+ if (!nextReady && !selectedSpec) {
416
+ steps.push({
417
+ id: 'draft-acceptance',
418
+ command: 'npx create-quiver ai plan --phase acceptance --input <requirements.md> --dry-run',
419
+ reason: 'Start the WDD + SDD planning flow before creating specs.',
420
+ });
421
+ }
422
+
423
+ return steps;
424
+ }
425
+
426
+ function buildErrorPayload(error) {
427
+ const isDashboardError = error instanceof DashboardError;
428
+ return {
429
+ dashboard_schema_version: DASHBOARD_SCHEMA_VERSION,
430
+ error: {
431
+ code: isDashboardError ? error.code : 'DASHBOARD_ERROR',
432
+ message: error.message,
433
+ next_command: isDashboardError ? error.nextCommand : 'npx create-quiver dashboard',
434
+ },
435
+ };
436
+ }
437
+
438
+ function collectDashboardReport(projectRoot, options = {}) {
439
+ const translator = translatorForOptions(options);
440
+ const specSlug = options.specSlug ? String(options.specSlug).trim() : '';
441
+ const includeCompleted = options.includeCompleted === true;
442
+ const specDirs = listSpecDirectories(projectRoot);
443
+ const selectedSpecDir = specSlug ? specDirs.find((spec) => spec.slug === specSlug) : null;
444
+
445
+ if (specSlug && !selectedSpecDir) {
446
+ throw new DashboardError(
447
+ 'SPEC_NOT_FOUND',
448
+ translator.t('dashboard.error.spec_not_found', { spec: specSlug }),
449
+ 'npx create-quiver ai specs list',
450
+ );
451
+ }
452
+
453
+ const exportData = collectLifecycleExport(projectRoot, { includeCompleted: true });
454
+ const globalState = resolveProjectState(projectRoot, { allowGraphErrors: true });
455
+ const visibleState = resolveProjectState(projectRoot, {
456
+ allowGraphErrors: true,
457
+ specSlug,
458
+ });
459
+ const globalSlices = globalState.graph.nodes;
460
+ const baseVisibleSlices = specSlug
461
+ ? visibleState.graph.nodes.filter((slice) => slice.specSlug === specSlug)
462
+ : visibleState.graph.nodes;
463
+ const visibleSlices = filterSlicesForExecution(baseVisibleSlices, { includeCompleted });
464
+ const pendingGraphSlices = filterSlicesForExecution(visibleState.graph.nodes, { includeCompleted: false });
465
+ const graphSummary = summarizeGraph(visibleState.graph);
466
+ const visibleRefs = new Set(visibleSlices.map((slice) => slice.ref));
467
+ const selectedGraph = filterGraphForRefs(graphSummary, visibleRefs);
468
+ const globalSpecs = mergeSpecDirectories(
469
+ groupSlicesBySpec(globalSlices).map((spec) => normalizeSpec(spec, projectRoot)),
470
+ specDirs,
471
+ );
472
+ const selectedSpec = specSlug
473
+ ? globalSpecs.find((spec) => spec.slug === specSlug) || {
474
+ ...selectedSpecDir,
475
+ status: 'draft',
476
+ canonical_status: 'draft',
477
+ progress: summarizeProgress([]),
478
+ slices: [],
479
+ }
480
+ : null;
481
+ const visibleSpecs = specSlug
482
+ ? (selectedSpec ? [selectedSpec] : [])
483
+ : globalSpecs;
484
+ const activeSlice = collectActiveSliceState(projectRoot, { slices: globalSlices });
485
+ const nextReady = selectNextReady({
486
+ graph: visibleState.graph,
487
+ pendingSlices: pendingGraphSlices,
488
+ projectRoot,
489
+ visibleSlices,
490
+ });
491
+ const warnings = collectWarnings({
492
+ graphSummary,
493
+ layout: exportData.migration,
494
+ specDirs,
495
+ specSlug,
496
+ visibleSlices,
497
+ });
498
+ const blockers = collectBlockers({
499
+ activeSlice,
500
+ graphSummary,
501
+ layout: exportData.migration,
502
+ visibleSlices,
503
+ });
504
+ const nextSteps = collectNextSteps({
505
+ graphSummary,
506
+ nextReady,
507
+ selectedSpec,
508
+ specSlug,
509
+ visibleSlices,
510
+ });
511
+ const agents = compactAgents(exportData.agents);
512
+ const approvals = compactApprovals(exportData.approvals);
513
+ const runs = compactRuns(exportData.runs);
514
+
515
+ return {
516
+ dashboard_schema_version: DASHBOARD_SCHEMA_VERSION,
517
+ generated_at: new Date().toISOString(),
518
+ source_metadata: {
519
+ generator: 'create-quiver',
520
+ command: 'dashboard',
521
+ resolver: 'project-state-resolver',
522
+ include_completed: includeCompleted,
523
+ spec_filter: specSlug || null,
524
+ },
525
+ project: exportData.project,
526
+ summary: {
527
+ specs: globalSpecs.length,
528
+ visible_specs: visibleSpecs.length,
529
+ slices: globalSlices.length,
530
+ visible_slices: visibleSlices.length,
531
+ runs: runs.length,
532
+ configured_agents: agents.filter((agent) => agent.configured).length,
533
+ agents: agents.length,
534
+ warnings: warnings.length,
535
+ blockers: blockers.length,
536
+ layout: exportData.migration.layout,
537
+ },
538
+ global_progress: summarizeProgress(globalSlices),
539
+ visible_progress: summarizeProgress(visibleSlices),
540
+ specs: visibleSpecs,
541
+ slices: visibleSlices.map((slice) => normalizeSlice(projectRoot, slice)),
542
+ next_ready: nextReady,
543
+ blockers,
544
+ warnings,
545
+ graph: {
546
+ ok: selectedGraph.ok,
547
+ edges: selectedGraph.ok ? selectedGraph.edges : [],
548
+ levels: selectedGraph.ok ? selectedGraph.levels : [],
549
+ conflicts: selectedGraph.ok ? selectedGraph.conflicts : [],
550
+ error: selectedGraph.ok ? null : selectedGraph.error,
551
+ },
552
+ agents,
553
+ approvals,
554
+ runs,
555
+ active_slice: {
556
+ supported_sources: activeSlice.supported_sources,
557
+ sources_count: activeSlice.sources.length,
558
+ reconciliation: activeSlice.reconciliation,
559
+ },
560
+ evidence: collectEvidenceSummary(visibleSlices),
561
+ next_steps: nextSteps,
562
+ };
563
+ }
564
+
565
+ function formatProgress(progress, translator = createTranslator()) {
566
+ return `${progress.completed}/${progress.total} ${translator.t('status.completed')}, ${progress.open} ${translator.t('dashboard.open')}, ${progress.blocked} ${translator.t('status.blocked')}, ${progress.percent}%`;
567
+ }
568
+
569
+ function dashboardOptionError(message, nextCommand = 'npx create-quiver dashboard --help') {
570
+ return new DashboardError('INVALID_DASHBOARD_OPTIONS', message, nextCommand);
571
+ }
572
+
573
+ function parseDashboardLimit(rawLimit, errors) {
574
+ if (rawLimit === null || typeof rawLimit === 'undefined' || rawLimit === '') {
575
+ return DEFAULT_DASHBOARD_LIMIT;
576
+ }
577
+
578
+ const value = String(rawLimit).trim();
579
+ if (!/^[1-9]\d*$/.test(value)) {
580
+ errors.push('dashboard.limit.invalid');
581
+ return DEFAULT_DASHBOARD_LIMIT;
582
+ }
583
+
584
+ const parsed = Number.parseInt(value, 10);
585
+ if (parsed > MAX_DASHBOARD_LIMIT) {
586
+ errors.push('dashboard.limit.invalid');
587
+ return DEFAULT_DASHBOARD_LIMIT;
588
+ }
589
+
590
+ return parsed;
591
+ }
592
+
593
+ function normalizeDashboardOptions(options = {}) {
594
+ const translator = translatorForOptions(options);
595
+ const errors = Array.isArray(options.optionErrors) ? [...options.optionErrors] : [];
596
+ const details = options.details === true;
597
+ const section = String(options.section || '').trim();
598
+ const hasLimit = options.limit !== null && typeof options.limit !== 'undefined';
599
+ const limit = parseDashboardLimit(options.limit, errors);
600
+
601
+ if (section && !SUPPORTED_DASHBOARD_SECTIONS.includes(section)) {
602
+ errors.push(translator.t('dashboard.unsupported_section', {
603
+ section,
604
+ sections: SUPPORTED_DASHBOARD_SECTIONS.join(', '),
605
+ }));
606
+ }
607
+
608
+ if (details && section) {
609
+ errors.push(translator.t('dashboard.cannot_combine_details_section'));
610
+ }
611
+
612
+ if (options.json && (details || section || hasLimit || errors.length > 0)) {
613
+ errors.push(translator.t('dashboard.json_human_flags'));
614
+ }
615
+
616
+ if (errors.length > 0) {
617
+ throw dashboardOptionError(errors.map((error) => translateIfCatalogKey(error, translator)).join(' '));
618
+ }
619
+
620
+ return {
621
+ details,
622
+ language: options.language,
623
+ limit,
624
+ section,
625
+ };
626
+ }
627
+
628
+ function truncateText(value, maxLength = 96) {
629
+ const text = String(value ?? '').replace(/\s+/g, ' ').trim();
630
+ if (text.length <= maxLength) {
631
+ return text;
632
+ }
633
+ return `${text.slice(0, Math.max(0, maxLength - 3)).trimEnd()}...`;
634
+ }
635
+
636
+ function dashboardCommand(report, suffix = '') {
637
+ const parts = ['npx create-quiver dashboard'];
638
+ if (report.source_metadata.spec_filter) {
639
+ parts.push('--spec', report.source_metadata.spec_filter);
640
+ }
641
+ if (report.source_metadata.include_completed) {
642
+ parts.push('--include-completed');
643
+ }
644
+ if (suffix) {
645
+ parts.push(suffix);
646
+ }
647
+ return parts.join(' ');
648
+ }
649
+
650
+ function truncationLine(report, section, hidden, translator = createTranslator()) {
651
+ return `- ${translator.t('dashboard.more_run', {
652
+ command: dashboardCommand(report, `--section ${section}`),
653
+ count: hidden,
654
+ })}`;
655
+ }
656
+
657
+ function pushLimitedList(lines, report, section, items, limit, formatter, translator = createTranslator()) {
658
+ if (!items.length) {
659
+ lines.push(`- ${translator.t('common.none')}`);
660
+ return;
661
+ }
662
+
663
+ for (const item of items.slice(0, limit)) {
664
+ lines.push(`- ${formatter(item)}`);
665
+ }
666
+
667
+ const hidden = items.length - limit;
668
+ if (hidden > 0) {
669
+ lines.push(truncationLine(report, section, hidden, translator));
670
+ }
671
+ }
672
+
673
+ function formatSpecLine(spec, translator = createTranslator()) {
674
+ return `${spec.slug}: ${formatStatus(spec.status, translator)}, ${spec.progress.percent}% (${spec.progress.completed}/${spec.progress.total})`;
675
+ }
676
+
677
+ function formatSliceLine(slice, translator = createTranslator()) {
678
+ const blocked = slice.blocked_reason ? ` blocked=${truncateText(slice.blocked_reason, 48)}` : '';
679
+ return `${slice.ref}: ${formatStatus(slice.status, translator)}, ${slice.progress}%${blocked}`;
680
+ }
681
+
682
+ function formatAgentLine(agent, translator = createTranslator()) {
683
+ return `${agent.role}: ${agent.configured ? agent.provider || translator.t('dashboard.configured') : translator.t('dashboard.missing')}`;
684
+ }
685
+
686
+ function formatApprovalLine(approval, translator = createTranslator()) {
687
+ const version = approval.approved_version ? ` ${translator.t('dashboard.approved')}=v${approval.approved_version}` : '';
688
+ return `${approval.phase}: ${formatStatus(approval.status, translator)}${version}`;
689
+ }
690
+
691
+ function formatRunLine(run, translator = createTranslator()) {
692
+ return `${run.run_id}: ${run.phase} (${formatStatus(run.status, translator)})`;
693
+ }
694
+
695
+ function pushSignalSection(lines, report, title, section, items, limit, formatter, translator = createTranslator()) {
696
+ lines.push(`${title}: ${items.length === 0 ? translator.t('common.none') : ''}`.trimEnd());
697
+ if (items.length > 0) {
698
+ pushLimitedList(lines, report, section, items, limit, formatter, translator);
699
+ }
700
+ }
701
+
702
+ function formatCompactDashboard(report, options) {
703
+ const translator = createTranslator(options.language);
704
+ const nextCommand = report.next_steps[0]?.command || translator.t('common.none');
705
+ const state = report.blockers.length > 0
706
+ ? 'blocked'
707
+ : report.warnings.length > 0
708
+ ? 'warning'
709
+ : report.next_ready
710
+ ? 'ready'
711
+ : 'idle';
712
+ const lines = [
713
+ translator.t('dashboard.title'),
714
+ `${translator.t('dashboard.project')}: ${truncateText(report.project.name, 42)} | ${translator.t('dashboard.layout')}: ${report.summary.layout} | ${translator.t('dashboard.filter')}: ${report.source_metadata.spec_filter || translator.t('dashboard.all_specs')}`,
715
+ `${translator.t('dashboard.state')}: ${translator.t(`dashboard.state.${state}`)}`,
716
+ `${translator.t('dashboard.next_safe_command')}: ${nextCommand}`,
717
+ `${translator.t('dashboard.progress')}: ${translator.t('dashboard.global')}: ${formatProgress(report.global_progress, translator)} | ${translator.t('dashboard.visible')}: ${formatProgress(report.visible_progress, translator)}`,
718
+ `${translator.t('dashboard.counts')}: ${translator.t('dashboard.specs')} ${report.summary.specs} (${report.summary.visible_specs} ${translator.t('dashboard.visible_count')}), ${translator.t('dashboard.slices')} ${report.summary.slices} (${report.summary.visible_slices} ${translator.t('dashboard.visible_count')}), ${translator.t('dashboard.agents')} ${report.summary.configured_agents}/${report.summary.agents}, ${translator.t('dashboard.runs')} ${report.summary.runs}`,
719
+ `${translator.t('dashboard.next_ready_slice')}: ${report.next_ready ? `${report.next_ready.ref} - ${truncateText(report.next_ready.title, 48)}` : translator.t('common.none')}`,
720
+ ];
721
+
722
+ pushSignalSection(lines, report, translator.t('dashboard.blockers'), 'blockers', report.blockers, options.limit, (blocker) => `${blocker.ref}: ${truncateText(blocker.reason, 70)}`, translator);
723
+ pushSignalSection(lines, report, translator.t('dashboard.warnings'), 'warnings', report.warnings, options.limit, (warning) => `${warning.code}: ${truncateText(formatWarningMessage(warning, report.source_metadata.spec_filter, translator), 70)}`, translator);
724
+
725
+ lines.push(`${translator.t('dashboard.active_slice')}: ${report.active_slice.reconciliation.decision} (${truncateText(report.active_slice.reconciliation.reason, 60)})`);
726
+ lines.push(`${translator.t('dashboard.inspect')}: ${dashboardCommand(report, '--details')}`);
727
+ lines.push('');
728
+ return `${lines.join('\n')}\n`;
729
+ }
730
+
731
+ function formatDashboardOverview(report, translator = createTranslator()) {
732
+ const lines = [
733
+ translator.t('dashboard.dashboard_overview'),
734
+ `${translator.t('dashboard.project')}: ${report.project.name}`,
735
+ `${translator.t('dashboard.layout')}: ${report.summary.layout}`,
736
+ `${translator.t('dashboard.filter')}: ${report.source_metadata.spec_filter || translator.t('dashboard.all_specs')}`,
737
+ `${translator.t('dashboard.completed_hidden')}: ${report.source_metadata.include_completed ? translator.t('common.no') : translator.t('common.yes')}`,
738
+ `${translator.t('dashboard.global_progress')}: ${formatProgress(report.global_progress, translator)}`,
739
+ `${translator.t('dashboard.visible_progress')}: ${formatProgress(report.visible_progress, translator)}`,
740
+ `${translator.t('dashboard.specs')}: ${report.summary.specs} (${report.summary.visible_specs} ${translator.t('dashboard.visible_count')})`,
741
+ `${translator.t('dashboard.slices')}: ${report.summary.slices} (${report.summary.visible_slices} ${translator.t('dashboard.visible_count')})`,
742
+ `${translator.t('dashboard.blockers')}: ${report.summary.blockers}`,
743
+ `${translator.t('dashboard.warnings')}: ${report.summary.warnings}`,
744
+ `${translator.t('dashboard.runs')}: ${report.summary.runs}`,
745
+ '',
746
+ ];
747
+
748
+ return `${lines.join('\n')}\n`;
749
+ }
750
+
751
+ function formatDashboardSection(report, options) {
752
+ const translator = createTranslator(options.language);
753
+ const lines = [];
754
+ const limit = options.limit;
755
+
756
+ if (options.section === 'overview') {
757
+ return formatDashboardOverview(report, translator);
758
+ }
759
+
760
+ if (options.section === 'specs') {
761
+ lines.push(translator.t('dashboard.specs'));
762
+ pushLimitedList(lines, report, 'specs', report.specs, limit, (spec) => formatSpecLine(spec, translator), translator);
763
+ }
764
+
765
+ if (options.section === 'slices') {
766
+ lines.push(translator.t('dashboard.slices'));
767
+ pushLimitedList(lines, report, 'slices', report.slices, limit, (slice) => formatSliceLine(slice, translator), translator);
768
+ }
769
+
770
+ if (options.section === 'blockers') {
771
+ lines.push(translator.t('dashboard.blockers'));
772
+ pushLimitedList(lines, report, 'blockers', report.blockers, limit, (blocker) => `${blocker.ref}: ${blocker.reason}`, translator);
773
+ }
774
+
775
+ if (options.section === 'warnings') {
776
+ lines.push(translator.t('dashboard.warnings'));
777
+ pushLimitedList(lines, report, 'warnings', report.warnings, limit, (warning) => `${warning.code}: ${formatWarningMessage(warning, report.source_metadata.spec_filter, translator)}`, translator);
778
+ }
779
+
780
+ if (options.section === 'agents') {
781
+ lines.push(translator.t('dashboard.agents'));
782
+ pushLimitedList(lines, report, 'agents', report.agents, limit, (agent) => formatAgentLine(agent, translator), translator);
783
+ }
784
+
785
+ if (options.section === 'approvals') {
786
+ lines.push(translator.t('dashboard.approvals'));
787
+ pushLimitedList(lines, report, 'approvals', report.approvals, limit, (approval) => formatApprovalLine(approval, translator), translator);
788
+ }
789
+
790
+ if (options.section === 'runs') {
791
+ lines.push(translator.t('dashboard.runs'));
792
+ pushLimitedList(lines, report, 'runs', report.runs, limit, (run) => formatRunLine(run, translator), translator);
793
+ }
794
+
795
+ if (options.section === 'active-slice') {
796
+ lines.push(
797
+ translator.t('dashboard.active_slice'),
798
+ `- ${translator.t('dashboard.sources')}: ${report.active_slice.sources_count}`,
799
+ `- ${translator.t('dashboard.reconciliation')}: ${report.active_slice.reconciliation.decision} (${report.active_slice.reconciliation.reason})`,
800
+ );
801
+ }
802
+
803
+ if (options.section === 'next-steps') {
804
+ lines.push(translator.t('dashboard.next_safe_commands'));
805
+ pushLimitedList(lines, report, 'next-steps', report.next_steps, limit, (step) => step.command, translator);
806
+ }
807
+
808
+ lines.push('');
809
+ return `${lines.join('\n')}\n`;
810
+ }
811
+
812
+ function formatDashboardDetails(report, options = {}) {
813
+ const translator = createTranslator(options.language);
814
+ const lines = [
815
+ translator.t('dashboard.title'),
816
+ `${translator.t('dashboard.project')}: ${report.project.name}`,
817
+ `${translator.t('dashboard.layout')}: ${report.summary.layout}`,
818
+ `${translator.t('dashboard.filter')}: ${report.source_metadata.spec_filter || translator.t('dashboard.all_specs')}`,
819
+ `${translator.t('dashboard.completed_hidden')}: ${report.source_metadata.include_completed ? translator.t('common.no') : translator.t('common.yes')}`,
820
+ '',
821
+ translator.t('dashboard.progress'),
822
+ `- ${translator.t('dashboard.global')}: ${formatProgress(report.global_progress, translator)}`,
823
+ `- ${translator.t('dashboard.visible')}: ${formatProgress(report.visible_progress, translator)}`,
824
+ '',
825
+ translator.t('dashboard.next_ready_slice'),
826
+ ];
827
+
828
+ if (report.next_ready) {
829
+ lines.push(`- ${report.next_ready.ref}: ${report.next_ready.title}`);
830
+ lines.push(`- ${translator.t('dashboard.start')}: ${report.next_ready.start_slice_command}`);
831
+ } else {
832
+ lines.push(`- ${translator.t('common.none')}`);
833
+ }
834
+
835
+ lines.push('', translator.t('dashboard.specs'));
836
+ if (report.specs.length === 0) {
837
+ lines.push(`- ${translator.t('common.none')}`);
838
+ } else {
839
+ for (const spec of report.specs) {
840
+ lines.push(`- ${formatSpecLine(spec, translator)}`);
841
+ }
842
+ }
843
+
844
+ lines.push('', translator.t('dashboard.slices'));
845
+ if (report.slices.length === 0) {
846
+ lines.push(`- ${translator.t('common.none')}`);
847
+ } else {
848
+ for (const slice of report.slices) {
849
+ lines.push(`- ${formatSliceLine(slice, translator)}`);
850
+ }
851
+ }
852
+
853
+ lines.push('', translator.t('dashboard.blockers'));
854
+ if (report.blockers.length === 0) {
855
+ lines.push(`- ${translator.t('common.none')}`);
856
+ } else {
857
+ for (const blocker of report.blockers) {
858
+ lines.push(`- ${blocker.ref}: ${blocker.reason}`);
859
+ }
860
+ }
861
+
862
+ lines.push('', translator.t('dashboard.warnings'));
863
+ if (report.warnings.length === 0) {
864
+ lines.push(`- ${translator.t('common.none')}`);
865
+ } else {
866
+ for (const warning of report.warnings) {
867
+ lines.push(`- ${warning.code}: ${formatWarningMessage(warning, report.source_metadata.spec_filter, translator)}`);
868
+ }
869
+ }
870
+
871
+ lines.push('', translator.t('dashboard.agents'));
872
+ if (report.agents.length === 0) {
873
+ lines.push(`- ${translator.t('common.none')}`);
874
+ } else {
875
+ for (const agent of report.agents) {
876
+ lines.push(`- ${formatAgentLine(agent, translator)}`);
877
+ }
878
+ }
879
+
880
+ lines.push('', translator.t('dashboard.approvals'));
881
+ if (report.approvals.length === 0) {
882
+ lines.push(`- ${translator.t('common.none')}`);
883
+ } else {
884
+ for (const approval of report.approvals) {
885
+ lines.push(`- ${formatApprovalLine(approval, translator)}`);
886
+ }
887
+ }
888
+
889
+ lines.push('', translator.t('dashboard.runs'));
890
+ if (report.runs.length === 0) {
891
+ lines.push(`- ${translator.t('common.none')}`);
892
+ } else {
893
+ for (const run of report.runs) {
894
+ lines.push(`- ${formatRunLine(run, translator)}`);
895
+ }
896
+ }
897
+
898
+ lines.push(
899
+ '',
900
+ translator.t('dashboard.active_slice'),
901
+ `- ${translator.t('dashboard.sources')}: ${report.active_slice.sources_count}`,
902
+ `- ${translator.t('dashboard.reconciliation')}: ${report.active_slice.reconciliation.decision} (${report.active_slice.reconciliation.reason})`,
903
+ '',
904
+ translator.t('dashboard.next_safe_commands'),
905
+ );
906
+
907
+ if (report.next_steps.length === 0) {
908
+ lines.push(`- ${translator.t('common.none')}`);
909
+ } else {
910
+ for (const step of report.next_steps) {
911
+ lines.push(`- ${step.command}`);
912
+ }
913
+ }
914
+
915
+ lines.push('');
916
+ return `${lines.join('\n')}\n`;
917
+ }
918
+
919
+ function formatHumanDashboard(report, options = {}) {
920
+ const normalized = normalizeDashboardOptions({ ...options, json: false });
921
+ if (normalized.details) {
922
+ return formatDashboardDetails(report, normalized);
923
+ }
924
+ if (normalized.section) {
925
+ return formatDashboardSection(report, normalized);
926
+ }
927
+ return formatCompactDashboard(report, normalized);
928
+ }
929
+
930
+ module.exports = {
931
+ DASHBOARD_SCHEMA_VERSION,
932
+ DEFAULT_DASHBOARD_LIMIT,
933
+ DashboardError,
934
+ SUPPORTED_DASHBOARD_SECTIONS,
935
+ buildErrorPayload,
936
+ collectDashboardReport,
937
+ formatHumanDashboard,
938
+ normalizeDashboardOptions,
939
+ };