create-quiver 0.15.3 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/pull_request_template.md +17 -0
- package/.github/workflows/ci.yml +79 -0
- package/.markdown-link-check.json +15 -0
- package/.markdownlint.json +11 -0
- package/.quiver/runs/run-2026-06-09t19-14-39z/approvals.json +5 -0
- package/.quiver/runs/run-2026-06-09t19-14-39z/decisions.md +2 -0
- package/.quiver/runs/run-2026-06-09t19-14-39z/requirement.md +0 -0
- package/.quiver/runs/run-2026-06-09t19-14-39z/snapshots/20260609T191439Z/docs/INDEX.md +97 -0
- package/.quiver/runs/run-2026-06-09t19-14-39z/snapshots/20260609T191439Z/manifest.json +61 -0
- package/.quiver/runs/run-2026-06-09t19-14-39z/state.json +28 -0
- package/ACTIVE_SLICES.md +43 -0
- package/AGENTS.md.es.template +37 -0
- package/ARCHITECTURE.md +133 -0
- package/CHANGELOG.md +12 -0
- package/CONTRIBUTING.md +174 -9
- package/README.md +10 -1
- package/ROADMAP.md +4 -0
- package/SECURITY.md +9 -2
- package/auditoria-ux-ui-performance-documentacion.md +705 -0
- package/copys-landing-page.md +244 -0
- package/docs/AI_CONTEXT.md.es.template +37 -0
- package/docs/AI_CONTEXT.md.template +3 -1
- package/docs/AI_ONBOARDING_PROMPT.md.es.template +22 -0
- package/docs/CLI_UX_GUIDE.md +55 -1
- package/docs/COMMANDS.md.es.template +28 -0
- package/docs/COMMANDS.md.template +20 -6
- package/docs/CONTEXTO.md.es.template +33 -0
- package/docs/DECISIONS.md.es.template +17 -0
- package/docs/GITFLOW_PR_GUIDE.md +73 -11
- package/docs/GITFLOW_PR_GUIDE.md.es.template +84 -0
- package/docs/GITFLOW_PR_GUIDE.md.template +72 -10
- package/docs/INDEX.md +11 -1
- package/docs/INDEX.md.es.template +36 -0
- package/docs/QUICK.md.template +2 -1
- package/docs/STANDARD.md.template +2 -1
- package/docs/STATUS.md.es.template +28 -0
- package/docs/SUPPORT_MATRIX.md.es.template +22 -0
- package/docs/TESTING_GUIDE_FOR_AI.md.es.template +19 -0
- package/docs/TROUBLESHOOTING.md.es.template +35 -0
- package/docs/WORKFLOW.md.es.template +31 -0
- package/docs/WORKFLOW.md.template +6 -4
- package/docs/ai/ACTIVE_SLICE.md +61 -0
- package/docs/ai/LESSONS.md.es.template +24 -0
- package/docs/getting-started/installation.md +26 -0
- package/docs/reference/commands.md +159 -7
- package/docs/reference/slice-schema.md +37 -0
- package/docs/schema/slice.schema.json +221 -0
- package/docs/specs/01-spec/01-slice/01-slice.json +36 -0
- package/docs/specs/01-spec/01-slice/01-slice.md +106 -0
- package/docs/specs/01-spec/01-slice/CLOSURE_BRIEF.md +80 -0
- package/docs/specs/01-spec/01-slice/EXECUTION_BRIEF.md +39 -0
- package/docs/specs/01-spec/02-slice/02-slice.json +36 -0
- package/docs/specs/01-spec/02-slice/02-slice.md +108 -0
- package/docs/specs/01-spec/02-slice/CLOSURE_BRIEF.md +88 -0
- package/docs/specs/01-spec/02-slice/EXECUTION_BRIEF.md +40 -0
- package/docs/specs/01-spec/03-slice/03-slice.json +36 -0
- package/docs/specs/01-spec/03-slice/03-slice.md +103 -0
- package/docs/specs/01-spec/03-slice/CLOSURE_BRIEF.md +54 -0
- package/docs/specs/01-spec/03-slice/EXECUTION_BRIEF.md +39 -0
- package/docs/specs/01-spec/04-slice/04-slice.json +36 -0
- package/docs/specs/01-spec/04-slice/04-slice.md +107 -0
- package/docs/specs/01-spec/04-slice/CLOSURE_BRIEF.md +46 -0
- package/docs/specs/01-spec/04-slice/EXECUTION_BRIEF.md +39 -0
- package/docs/specs/01-spec/05-slice/05-slice.json +36 -0
- package/docs/specs/01-spec/05-slice/05-slice.md +106 -0
- package/docs/specs/01-spec/05-slice/CLOSURE_BRIEF.md +84 -0
- package/docs/specs/01-spec/05-slice/EXECUTION_BRIEF.md +109 -0
- package/docs/specs/01-spec/06-slice/06-slice.json +36 -0
- package/docs/specs/01-spec/06-slice/06-slice.md +107 -0
- package/docs/specs/01-spec/06-slice/CLOSURE_BRIEF.md +67 -0
- package/docs/specs/01-spec/06-slice/EXECUTION_BRIEF.md +39 -0
- package/docs/specs/01-spec/07-slice/07-slice.json +36 -0
- package/docs/specs/01-spec/07-slice/07-slice.md +105 -0
- package/docs/specs/01-spec/07-slice/CLOSURE_BRIEF.md +71 -0
- package/docs/specs/01-spec/07-slice/EXECUTION_BRIEF.md +39 -0
- package/docs/specs/01-spec/08-slice/08-slice.json +36 -0
- package/docs/specs/01-spec/08-slice/08-slice.md +105 -0
- package/docs/specs/01-spec/08-slice/CLOSURE_BRIEF.md +114 -0
- package/docs/specs/01-spec/08-slice/EXECUTION_BRIEF.md +39 -0
- package/docs/specs/01-spec/CLOSURE_BRIEF.md +87 -0
- package/docs/specs/01-spec/spec.md +197 -0
- package/docs/workflows/full-ai-spec-to-pr.md +46 -3
- package/i18n/es/docs/GITFLOW_PR_GUIDE.md.template +38 -1
- package/package.json +27 -1
- package/pr.md +154 -0
- package/scripts/package-quiver.sh +82 -2
- package/scripts/release-quiver.sh +14 -3
- package/specs/[project-name]/slices/pr.md.template +19 -0
- package/specs/quiver-v37-cli-i18n-foundation/EVIDENCE_REPORT.md +73 -0
- package/specs/quiver-v37-cli-i18n-foundation/EXECUTION_PLAN.md +34 -0
- package/specs/quiver-v37-cli-i18n-foundation/SPEC.md +91 -0
- package/specs/quiver-v37-cli-i18n-foundation/STATUS.md +29 -0
- package/specs/quiver-v37-cli-i18n-foundation/pr.md +97 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/slice.json +54 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/CLOSURE_BRIEF.md +30 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/EXECUTION_BRIEF.md +27 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/slice.json +66 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/CLOSURE_BRIEF.md +27 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/EXECUTION_BRIEF.md +26 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/slice.json +62 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/CLOSURE_BRIEF.md +32 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/EXECUTION_BRIEF.md +25 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/slice.json +66 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/CLOSURE_BRIEF.md +30 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/EXECUTION_BRIEF.md +24 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/slice.json +65 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/CLOSURE_BRIEF.md +27 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/slice.json +67 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/EVIDENCE_REPORT.md +69 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/EXECUTION_PLAN.md +25 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/SPEC.md +52 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/STATUS.md +24 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/pr.md +119 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/EXECUTION_BRIEF.md +21 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/slice.json +53 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/CLOSURE_BRIEF.md +17 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/slice.json +69 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/CLOSURE_BRIEF.md +13 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/slice.json +77 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/CLOSURE_BRIEF.md +12 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/slice.json +66 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/CLOSURE_BRIEF.md +13 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/slice.json +61 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/EVIDENCE_REPORT.md +71 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/EXECUTION_PLAN.md +25 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/SPEC.md +53 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/STATUS.md +24 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/pr.md +104 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/EXECUTION_BRIEF.md +21 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/slice.json +53 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/CLOSURE_BRIEF.md +12 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/slice.json +68 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/CLOSURE_BRIEF.md +12 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/slice.json +62 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/CLOSURE_BRIEF.md +12 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/slice.json +72 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/CLOSURE_BRIEF.md +15 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/slice.json +61 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/EVIDENCE_REPORT.md +50 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/EXECUTION_PLAN.md +25 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/SPEC.md +52 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/STATUS.md +24 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/pr.md +94 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/EXECUTION_BRIEF.md +21 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/slice.json +53 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/CLOSURE_BRIEF.md +12 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/slice.json +63 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/slice.json +63 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/slice.json +72 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/CLOSURE_BRIEF.md +15 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/slice.json +69 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/EVIDENCE_REPORT.md +90 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/EXECUTION_PLAN.md +33 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/SPEC.md +57 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/STATUS.md +26 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/pr.md +103 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/EXECUTION_BRIEF.md +21 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/slice.json +53 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/CLOSURE_BRIEF.md +13 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/slice.json +68 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/CLOSURE_BRIEF.md +12 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/slice.json +66 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/CLOSURE_BRIEF.md +12 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/slice.json +68 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/CLOSURE_BRIEF.md +13 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/slice.json +72 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/CLOSURE_BRIEF.md +15 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/slice.json +66 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/CLOSURE_BRIEF.md +11 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/slice.json +70 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/EVIDENCE_REPORT.md +64 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/EXECUTION_PLAN.md +26 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/SPEC.md +52 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/STATUS.md +24 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/pr.md +125 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/EXECUTION_BRIEF.md +21 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/slice.json +53 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/slice.json +62 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/CLOSURE_BRIEF.md +11 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/slice.json +72 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/CLOSURE_BRIEF.md +12 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/slice.json +60 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/CLOSURE_BRIEF.md +16 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/slice.json +62 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/EVIDENCE_REPORT.md +203 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/EXECUTION_PLAN.md +27 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/SPEC.md +54 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/STATUS.md +24 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/command-language-mode-matrix.json +636 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/cross-platform-smoke-matrix.md +35 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/pr.md +155 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/EXECUTION_BRIEF.md +21 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/slice.json +53 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/CLOSURE_BRIEF.md +13 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/slice.json +62 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/CLOSURE_BRIEF.md +18 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/slice.json +59 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/CLOSURE_BRIEF.md +15 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/slice.json +62 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/CLOSURE_BRIEF.md +17 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/EXECUTION_BRIEF.md +24 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/slice.json +66 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/EVIDENCE_REPORT.md +18 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/EXECUTION_PLAN.md +31 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/SPEC.md +118 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/STATUS.md +25 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/pr.md +92 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/CLOSURE_BRIEF.md +11 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/slice.json +64 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/EXECUTION_BRIEF.md +24 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/slice.json +65 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/EXECUTION_BRIEF.md +24 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/slice.json +70 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/EXECUTION_BRIEF.md +25 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/slice.json +70 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/EXECUTION_BRIEF.md +26 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/slice.json +72 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/CLOSURE_BRIEF.md +15 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/EXECUTION_BRIEF.md +26 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/slice.json +75 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/EVIDENCE_REPORT.md +30 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/EXECUTION_PLAN.md +22 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/SPEC.md +49 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/STATUS.md +21 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/pr.md +67 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/EXECUTION_BRIEF.md +21 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/slice.json +48 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/CLOSURE_BRIEF.md +14 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/slice.json +65 -0
- package/specs/quiver-v50-audit-trust-foundation/EVIDENCE_REPORT.md +151 -0
- package/specs/quiver-v50-audit-trust-foundation/EXECUTION_PLAN.md +34 -0
- package/specs/quiver-v50-audit-trust-foundation/SPEC.md +113 -0
- package/specs/quiver-v50-audit-trust-foundation/STATUS.md +26 -0
- package/specs/quiver-v50-audit-trust-foundation/pr.md +120 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/CLOSURE_BRIEF.md +20 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/EXECUTION_BRIEF.md +58 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/slice.json +57 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/CLOSURE_BRIEF.md +24 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/EXECUTION_BRIEF.md +67 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/slice.json +71 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/CLOSURE_BRIEF.md +24 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/EXECUTION_BRIEF.md +71 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/slice.json +81 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/CLOSURE_BRIEF.md +22 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/EXECUTION_BRIEF.md +57 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/slice.json +56 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/CLOSURE_BRIEF.md +23 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/EXECUTION_BRIEF.md +68 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/slice.json +84 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/CLOSURE_BRIEF.md +25 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/EXECUTION_BRIEF.md +73 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/slice.json +72 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/CLOSURE_BRIEF.md +22 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/EXECUTION_BRIEF.md +66 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/slice.json +74 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/CLOSURE_BRIEF.md +29 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/EXECUTION_BRIEF.md +74 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/slice.json +81 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/EVIDENCE_REPORT.md +145 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/EXECUTION_PLAN.md +32 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/SPEC.md +109 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/STATUS.md +25 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/pr.md +69 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/CLOSURE_BRIEF.md +20 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/EXECUTION_BRIEF.md +58 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/slice.json +56 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/CLOSURE_BRIEF.md +21 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/EXECUTION_BRIEF.md +61 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/slice.json +68 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/CLOSURE_BRIEF.md +25 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/EXECUTION_BRIEF.md +65 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/pr.md +134 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/slice.json +80 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/CLOSURE_BRIEF.md +31 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/EXECUTION_BRIEF.md +80 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/pr.md +159 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/slice.json +102 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/CLOSURE_BRIEF.md +25 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/EXECUTION_BRIEF.md +74 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/pr.md +147 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/slice.json +91 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/CLOSURE_BRIEF.md +28 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/EXECUTION_BRIEF.md +73 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/pr.md +146 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/slice.json +100 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/CLOSURE_BRIEF.md +36 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/EXECUTION_BRIEF.md +76 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/pr.md +155 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/slice.json +111 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/EVIDENCE_REPORT.md +95 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/EXECUTION_PLAN.md +31 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/SPEC.md +107 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/STATUS.md +22 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/pr.md +69 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/CLOSURE_BRIEF.md +21 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/EXECUTION_BRIEF.md +60 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/slice.json +62 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/CLOSURE_BRIEF.md +34 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/EXECUTION_BRIEF.md +71 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/pr.md +146 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/slice.json +106 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/EXECUTION_BRIEF.md +67 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/pr.md +144 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/slice.json +86 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/CLOSURE_BRIEF.md +38 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/EXECUTION_BRIEF.md +75 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/pr.md +159 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/slice.json +105 -0
- package/src/create-quiver/commands/ai.js +485 -307
- package/src/create-quiver/commands/changelog.js +93 -0
- package/src/create-quiver/commands/config.js +135 -0
- package/src/create-quiver/commands/demo.js +2 -2
- package/src/create-quiver/commands/evidence.js +39 -6
- package/src/create-quiver/commands/flow.js +109 -16
- package/src/create-quiver/commands/graph.js +9 -2
- package/src/create-quiver/commands/next.js +21 -18
- package/src/create-quiver/commands/plan.js +29 -6
- package/src/create-quiver/commands/spec.js +94 -70
- package/src/create-quiver/index.js +798 -223
- package/src/create-quiver/lib/ai/execution-plan.js +23 -20
- package/src/create-quiver/lib/ai/executor.js +60 -44
- package/src/create-quiver/lib/ai/export-state.js +75 -64
- package/src/create-quiver/lib/ai/github.js +29 -23
- package/src/create-quiver/lib/ai/run-state.js +28 -25
- package/src/create-quiver/lib/ai/spec-templates.js +19 -0
- package/src/create-quiver/lib/cli/command-registry.js +71 -0
- package/src/create-quiver/lib/cli/parser.js +14 -0
- package/src/create-quiver/lib/dashboard.js +154 -111
- package/src/create-quiver/lib/demo.js +14 -12
- package/src/create-quiver/lib/evidence.js +161 -6
- package/src/create-quiver/lib/git.js +99 -0
- package/src/create-quiver/lib/handoff.js +16 -7
- package/src/create-quiver/lib/i18n/catalog.js +152 -0
- package/src/create-quiver/lib/i18n/language.js +279 -0
- package/src/create-quiver/lib/i18n/messages/en.js +898 -0
- package/src/create-quiver/lib/i18n/messages/es.js +1013 -0
- package/src/create-quiver/lib/i18n/read-only-format.js +26 -0
- package/src/create-quiver/lib/i18n/templates.js +172 -0
- package/src/create-quiver/lib/init-docs.js +19 -5
- package/src/create-quiver/lib/init-layout.js +15 -8
- package/src/create-quiver/lib/lifecycle.js +72 -67
- package/src/create-quiver/lib/readiness.js +131 -110
- package/src/create-quiver/lib/renderers/tree.js +9 -6
- package/src/create-quiver/lib/spec-worktrees.js +50 -64
- package/src/create-quiver/lib/version.js +11 -9
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
|
|
4
|
+
function parseChangelog(content) {
|
|
5
|
+
const lines = String(content || '').split(/\r?\n/);
|
|
6
|
+
const entries = [];
|
|
7
|
+
let current = null;
|
|
8
|
+
|
|
9
|
+
for (const line of lines) {
|
|
10
|
+
const heading = line.match(/^##\s+\[?([^\]\n]+)\]?(?:\s+-\s+(.+))?$/);
|
|
11
|
+
if (heading) {
|
|
12
|
+
if (current) {
|
|
13
|
+
current.body = current.body.trim();
|
|
14
|
+
entries.push(current);
|
|
15
|
+
}
|
|
16
|
+
current = {
|
|
17
|
+
version: heading[1].trim(),
|
|
18
|
+
date: heading[2]?.trim() || null,
|
|
19
|
+
body: '',
|
|
20
|
+
};
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (current) {
|
|
25
|
+
current.body += `${line}\n`;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (current) {
|
|
30
|
+
current.body = current.body.trim();
|
|
31
|
+
entries.push(current);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return entries;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function readChangelog(packageRoot) {
|
|
38
|
+
const changelogPath = path.join(packageRoot, 'CHANGELOG.md');
|
|
39
|
+
if (!fs.existsSync(changelogPath)) {
|
|
40
|
+
return { path: changelogPath, entries: [], missing: true };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const content = fs.readFileSync(changelogPath, 'utf8');
|
|
44
|
+
return { path: changelogPath, entries: parseChangelog(content), missing: false };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function formatHumanChangelog(report) {
|
|
48
|
+
if (report.missing) {
|
|
49
|
+
return 'Quiver changelog\n\nNo local CHANGELOG.md was found in the installed package.\n';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const entries = report.entries.slice(0, 3);
|
|
53
|
+
if (entries.length === 0) {
|
|
54
|
+
return 'Quiver changelog\n\nLocal CHANGELOG.md did not contain parseable release entries.\n';
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const lines = ['Quiver changelog', ''];
|
|
58
|
+
for (const entry of entries) {
|
|
59
|
+
lines.push(`## ${entry.version}${entry.date ? ` - ${entry.date}` : ''}`);
|
|
60
|
+
if (entry.body) {
|
|
61
|
+
lines.push(entry.body);
|
|
62
|
+
}
|
|
63
|
+
lines.push('');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return `${lines.join('\n').trimEnd()}\n`;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function runChangelog(options = {}) {
|
|
70
|
+
const packageRoot = options.packageRoot || path.resolve(__dirname, '../..', '..');
|
|
71
|
+
const report = readChangelog(packageRoot);
|
|
72
|
+
const payload = {
|
|
73
|
+
schema_version: 1,
|
|
74
|
+
source: report.path,
|
|
75
|
+
missing: report.missing,
|
|
76
|
+
entries: report.entries.slice(0, 10),
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
if (options.json) {
|
|
80
|
+
process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
|
|
81
|
+
return payload;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
process.stdout.write(formatHumanChangelog(report));
|
|
85
|
+
return payload;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
module.exports = {
|
|
89
|
+
formatHumanChangelog,
|
|
90
|
+
parseChangelog,
|
|
91
|
+
readChangelog,
|
|
92
|
+
runChangelog,
|
|
93
|
+
};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
const path = require('path');
|
|
2
|
+
|
|
3
|
+
const {
|
|
4
|
+
DEFAULT_LANGUAGE,
|
|
5
|
+
SUPPORTED_LANGUAGES,
|
|
6
|
+
formatLanguageWarning,
|
|
7
|
+
globalLanguageConfigPath,
|
|
8
|
+
normalizeLanguage,
|
|
9
|
+
projectLanguageConfigPath,
|
|
10
|
+
writeGlobalLanguageConfig,
|
|
11
|
+
writeProjectLanguageConfig,
|
|
12
|
+
} = require('../lib/i18n/language');
|
|
13
|
+
const { createTranslator } = require('../lib/i18n/catalog');
|
|
14
|
+
|
|
15
|
+
function formatError(message) {
|
|
16
|
+
return `create-quiver: ${message}`;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function toJsonWarning(warning) {
|
|
20
|
+
return {
|
|
21
|
+
code: warning.code,
|
|
22
|
+
source: warning.source,
|
|
23
|
+
requested_language: warning.requestedLanguage,
|
|
24
|
+
fallback_language: warning.fallbackLanguage,
|
|
25
|
+
supported_languages: warning.supportedLanguages,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function formatProjectRelativePath(repoRoot, filePath) {
|
|
30
|
+
return path.relative(repoRoot, filePath).split(path.sep).join('/') || '.';
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function validateLanguageForSet(language, translator = createTranslator()) {
|
|
34
|
+
const normalized = normalizeLanguage(language);
|
|
35
|
+
if (!normalized || normalized !== String(language || '').trim().toLowerCase()) {
|
|
36
|
+
throw new Error(formatError(translator.t('config.error.unsupported_language', {
|
|
37
|
+
fallback: DEFAULT_LANGUAGE,
|
|
38
|
+
language: language || '<missing>',
|
|
39
|
+
supported: SUPPORTED_LANGUAGES.join(', '),
|
|
40
|
+
})));
|
|
41
|
+
}
|
|
42
|
+
return normalized;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function runLanguageShow(repoRoot, options = {}) {
|
|
46
|
+
const resolution = options.languageResolution || {
|
|
47
|
+
language: DEFAULT_LANGUAGE,
|
|
48
|
+
source: 'default',
|
|
49
|
+
warnings: [],
|
|
50
|
+
};
|
|
51
|
+
const warnings = resolution.warnings || [];
|
|
52
|
+
|
|
53
|
+
if (options.json) {
|
|
54
|
+
process.stdout.write(`${JSON.stringify({
|
|
55
|
+
schema_version: 1,
|
|
56
|
+
language: resolution.language,
|
|
57
|
+
source: resolution.source,
|
|
58
|
+
requested_source: resolution.requestedSource || null,
|
|
59
|
+
requested_language: resolution.requestedLanguage || null,
|
|
60
|
+
warnings: warnings.map(toJsonWarning),
|
|
61
|
+
}, null, 2)}\n`);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const lines = [
|
|
66
|
+
'Quiver config language',
|
|
67
|
+
`Language: ${resolution.language}`,
|
|
68
|
+
`Source: ${resolution.source}`,
|
|
69
|
+
];
|
|
70
|
+
for (const warning of warnings) {
|
|
71
|
+
lines.push(formatLanguageWarning(warning));
|
|
72
|
+
}
|
|
73
|
+
process.stdout.write(`${lines.join('\n')}\n`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function runLanguageSet(repoRoot, options = {}) {
|
|
77
|
+
const translator = createTranslator(options.language);
|
|
78
|
+
const language = validateLanguageForSet(options.value, translator);
|
|
79
|
+
const global = options.global === true;
|
|
80
|
+
const configPath = global ? globalLanguageConfigPath() : projectLanguageConfigPath(repoRoot);
|
|
81
|
+
|
|
82
|
+
if (global) {
|
|
83
|
+
writeGlobalLanguageConfig(language);
|
|
84
|
+
} else {
|
|
85
|
+
writeProjectLanguageConfig(repoRoot, language);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const displayPath = global ? '~/.quiver/config.json' : formatProjectRelativePath(repoRoot, configPath);
|
|
89
|
+
const scope = global ? 'global' : 'project';
|
|
90
|
+
|
|
91
|
+
if (options.json) {
|
|
92
|
+
process.stdout.write(`${JSON.stringify({
|
|
93
|
+
schema_version: 1,
|
|
94
|
+
action: 'set',
|
|
95
|
+
scope,
|
|
96
|
+
language,
|
|
97
|
+
path: displayPath,
|
|
98
|
+
}, null, 2)}\n`);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
process.stdout.write([
|
|
103
|
+
'Quiver config language updated',
|
|
104
|
+
`Scope: ${scope}`,
|
|
105
|
+
`Path: ${displayPath}`,
|
|
106
|
+
`Language: ${language}`,
|
|
107
|
+
].join('\n') + '\n');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function runConfig(repoRoot, options = {}) {
|
|
111
|
+
const translator = createTranslator(options.language);
|
|
112
|
+
if (options.section !== 'language') {
|
|
113
|
+
throw new Error(formatError(translator.t('config.error.unsupported_section', {
|
|
114
|
+
section: options.section || '(missing)',
|
|
115
|
+
})));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (options.command === 'show') {
|
|
119
|
+
runLanguageShow(repoRoot, options);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (options.command === 'set') {
|
|
124
|
+
runLanguageSet(repoRoot, options);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
throw new Error(formatError(translator.t('config.error.unsupported_language_command', {
|
|
129
|
+
command: options.command || '(missing)',
|
|
130
|
+
})));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
module.exports = {
|
|
134
|
+
runConfig,
|
|
135
|
+
};
|
|
@@ -8,12 +8,12 @@ function runDemo(options = {}) {
|
|
|
8
8
|
const plan = buildDemoPlan(options.targetRoot, { demo: options.demo });
|
|
9
9
|
|
|
10
10
|
if (options.dryRun) {
|
|
11
|
-
console.log(formatDemoPlan(plan, { dryRun: true }));
|
|
11
|
+
console.log(formatDemoPlan(plan, { dryRun: true, language: options.language }));
|
|
12
12
|
return plan;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
writeDemoPlan(plan);
|
|
16
|
-
console.log(formatDemoPlan(plan));
|
|
16
|
+
console.log(formatDemoPlan(plan, { language: options.language }));
|
|
17
17
|
return plan;
|
|
18
18
|
}
|
|
19
19
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const path = require('path');
|
|
2
|
-
const { runEvidenceCommand } = require('../lib/evidence');
|
|
2
|
+
const { listEvidenceFiles, runEvidenceCommand, showEvidenceFile } = require('../lib/evidence');
|
|
3
|
+
const { createTranslator } = require('../lib/i18n/catalog');
|
|
3
4
|
|
|
4
5
|
function formatOutputPath(repoRoot, outputPath) {
|
|
5
6
|
const relativeOutput = path.relative(repoRoot, outputPath).split(path.sep).join('/');
|
|
@@ -11,22 +12,54 @@ function formatOutputPath(repoRoot, outputPath) {
|
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
function runEvidence(repoRoot, options = {}) {
|
|
15
|
+
const translator = createTranslator(options.language);
|
|
14
16
|
const command = options.command || '';
|
|
17
|
+
if (options.subcommand === 'list') {
|
|
18
|
+
const evidence = listEvidenceFiles(repoRoot);
|
|
19
|
+
if (options.json) {
|
|
20
|
+
process.stdout.write(`${JSON.stringify({ evidence }, null, 2)}\n`);
|
|
21
|
+
return { evidence, exitCode: 0 };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
console.log(translator.t('evidence.list.title'));
|
|
25
|
+
if (evidence.length === 0) {
|
|
26
|
+
console.log(translator.t('evidence.list.empty'));
|
|
27
|
+
return { evidence, exitCode: 0 };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
for (const item of evidence) {
|
|
31
|
+
console.log(`- ${item.path} (${translator.t('evidence.exit_code', { code: item.exit_code ?? '-' })})`);
|
|
32
|
+
}
|
|
33
|
+
return { evidence, exitCode: 0 };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (options.subcommand === 'show') {
|
|
37
|
+
const evidence = showEvidenceFile(repoRoot, options.target);
|
|
38
|
+
if (options.json) {
|
|
39
|
+
process.stdout.write(`${JSON.stringify(evidence, null, 2)}\n`);
|
|
40
|
+
return { evidence, exitCode: 0 };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
process.stdout.write(evidence.content);
|
|
44
|
+
return { evidence, exitCode: 0 };
|
|
45
|
+
}
|
|
46
|
+
|
|
15
47
|
if (options.subcommand !== 'run') {
|
|
16
|
-
throw new Error(
|
|
48
|
+
throw new Error(`create-quiver: ${translator.t('evidence.error.missing_subcommand')}`);
|
|
17
49
|
}
|
|
18
50
|
|
|
19
51
|
const result = runEvidenceCommand(repoRoot, command, {
|
|
52
|
+
missingCommandMessage: `create-quiver: ${translator.t('evidence.error.missing_command')}`,
|
|
20
53
|
maxOutput: options.maxOutput,
|
|
21
54
|
outputPath: options.output,
|
|
22
55
|
spawnSync: options.spawnSync,
|
|
23
56
|
});
|
|
24
57
|
const displayOutput = formatOutputPath(repoRoot, result.outputPath);
|
|
25
58
|
|
|
26
|
-
console.log('
|
|
27
|
-
console.log(`-
|
|
28
|
-
console.log(`-
|
|
29
|
-
console.log(`-
|
|
59
|
+
console.log(translator.t('evidence.recorded'));
|
|
60
|
+
console.log(`- ${translator.t('evidence.command', { command: result.record.command })}`);
|
|
61
|
+
console.log(`- ${translator.t('evidence.exit_code', { code: result.exitCode })}`);
|
|
62
|
+
console.log(`- ${translator.t('evidence.output', { path: displayOutput })}`);
|
|
30
63
|
|
|
31
64
|
return result;
|
|
32
65
|
}
|
|
@@ -5,6 +5,7 @@ const { readPhaseApproval } = require('../lib/approvals');
|
|
|
5
5
|
const { approvalCandidateCommand, buildApprovalCandidateReport, formatCandidateSummary } = require('../lib/ai/approval-candidates');
|
|
6
6
|
const { readPlanReview } = require('../lib/ai/plan-review');
|
|
7
7
|
const { listAgentProfiles } = require('../lib/agent-profiles');
|
|
8
|
+
const { translatorForHuman } = require('../lib/i18n/read-only-format');
|
|
8
9
|
const { readProjectScanStatus } = require('../lib/project-scan');
|
|
9
10
|
const { buildGraph, naturalNumberFromSliceId, readAllSlices } = require('../lib/slice-graph');
|
|
10
11
|
const { hasQuiverInitializationEvidence, readState } = require('../lib/state');
|
|
@@ -257,6 +258,7 @@ function baseReport({ stage, label, blockers = [], nextCommand, suggestedCommand
|
|
|
257
258
|
label,
|
|
258
259
|
blockers,
|
|
259
260
|
nextCommand,
|
|
261
|
+
next_command: nextCommand,
|
|
260
262
|
suggestedCommands,
|
|
261
263
|
facts,
|
|
262
264
|
};
|
|
@@ -617,38 +619,129 @@ function detectFlowState(projectRoot) {
|
|
|
617
619
|
});
|
|
618
620
|
}
|
|
619
621
|
|
|
620
|
-
function
|
|
622
|
+
function formatFlowBlocker(blocker, translator) {
|
|
623
|
+
const text = String(blocker || '');
|
|
624
|
+
if (text === 'Quiver has not been initialized in this project.') {
|
|
625
|
+
return translator.t('flow.blocker.not_initialized');
|
|
626
|
+
}
|
|
627
|
+
if (text === 'Acceptance criteria draft exists but is not approved.') {
|
|
628
|
+
return translator.t('flow.blocker.acceptance_draft');
|
|
629
|
+
}
|
|
630
|
+
if (text === 'Acceptance criteria changed after approval.') {
|
|
631
|
+
return translator.t('flow.blocker.acceptance_stale');
|
|
632
|
+
}
|
|
633
|
+
if (text === 'Technical plan draft exists but has not been reviewed for production readiness.') {
|
|
634
|
+
return translator.t('flow.blocker.technical_plan_review_needed');
|
|
635
|
+
}
|
|
636
|
+
if (text === 'Technical plan review blocks approval.') {
|
|
637
|
+
return translator.t('flow.blocker.technical_plan_review_blocked');
|
|
638
|
+
}
|
|
639
|
+
if (text === 'Technical plan draft was reviewed but is not approved.') {
|
|
640
|
+
return translator.t('flow.blocker.technical_plan_draft');
|
|
641
|
+
}
|
|
642
|
+
if (text === 'Technical plan changed after approval and needs a fresh production review.') {
|
|
643
|
+
return translator.t('flow.blocker.technical_plan_changed_review_needed');
|
|
644
|
+
}
|
|
645
|
+
if (text === 'Technical plan changed after approval and latest review blocks approval.') {
|
|
646
|
+
return translator.t('flow.blocker.technical_plan_changed_review_blocked');
|
|
647
|
+
}
|
|
648
|
+
if (text === 'Technical plan changed after approval and the latest draft was reviewed.') {
|
|
649
|
+
return translator.t('flow.blocker.technical_plan_changed_reviewed');
|
|
650
|
+
}
|
|
651
|
+
if (text === 'Later slices are blocked until slice-00 is completed and committed.') {
|
|
652
|
+
return translator.t('flow.blocker.slice_00_required');
|
|
653
|
+
}
|
|
654
|
+
if (text === 'No ready slice was found. Review dependencies and statuses.') {
|
|
655
|
+
return translator.t('flow.blocker.no_ready_slice');
|
|
656
|
+
}
|
|
657
|
+
const missingDoc = text.match(/^Missing (docs\/[^.]+\.md)\.$/);
|
|
658
|
+
if (missingDoc) {
|
|
659
|
+
return translator.t('flow.blocker.missing_doc', { file: missingDoc[1] });
|
|
660
|
+
}
|
|
661
|
+
const missingProfiles = text.match(/^Missing (.+) agent profile(s?)\.$/);
|
|
662
|
+
if (missingProfiles) {
|
|
663
|
+
return translator.t('flow.blocker.missing_agent_profiles', { roles: missingProfiles[1] });
|
|
664
|
+
}
|
|
665
|
+
const planReviewStatus = text.match(/^Plan review status is (.+)\.$/);
|
|
666
|
+
if (planReviewStatus) {
|
|
667
|
+
return translator.t('flow.blocker.plan_review_status', { status: planReviewStatus[1] });
|
|
668
|
+
}
|
|
669
|
+
const couldNotReadSlices = text.match(/^Could not read slices: (.+)$/);
|
|
670
|
+
if (couldNotReadSlices) {
|
|
671
|
+
return translator.t('flow.blocker.could_not_read_slices', { error: couldNotReadSlices[1] });
|
|
672
|
+
}
|
|
673
|
+
if (text === 'No slice.json files found for the detected specs.') {
|
|
674
|
+
return translator.t('flow.blocker.no_slice_json');
|
|
675
|
+
}
|
|
676
|
+
const graphNotReady = text.match(/^Slice graph is not ready: (.+)$/);
|
|
677
|
+
if (graphNotReady) {
|
|
678
|
+
return translator.t('flow.blocker.slice_graph_not_ready', { error: graphNotReady[1] });
|
|
679
|
+
}
|
|
680
|
+
return text;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
function formatFlowContextSource(contextSource, translator) {
|
|
684
|
+
const source = contextSource || {};
|
|
685
|
+
if (source.status === 'fresh') {
|
|
686
|
+
return translator.t('flow.context_source.fresh', {
|
|
687
|
+
path: source.artifactPath,
|
|
688
|
+
updatedAt: source.scanUpdatedAt,
|
|
689
|
+
});
|
|
690
|
+
}
|
|
691
|
+
if (source.status === 'legacy') {
|
|
692
|
+
return translator.t('flow.context_source.legacy', {
|
|
693
|
+
path: source.artifactPath,
|
|
694
|
+
updatedAt: source.scanUpdatedAt,
|
|
695
|
+
});
|
|
696
|
+
}
|
|
697
|
+
if (source.status === 'stale') {
|
|
698
|
+
return translator.t('flow.context_source.stale', { path: source.artifactPath });
|
|
699
|
+
}
|
|
700
|
+
if (source.status === 'partial' && source.artifactPath && !source.projectMapPath) {
|
|
701
|
+
return translator.t('flow.context_source.partial_scan_only', { path: source.artifactPath });
|
|
702
|
+
}
|
|
703
|
+
if (source.status === 'partial' && !source.artifactPath && source.projectMapPath) {
|
|
704
|
+
return translator.t('flow.context_source.partial_map_only');
|
|
705
|
+
}
|
|
706
|
+
if (source.status === 'invalid') {
|
|
707
|
+
return translator.t('flow.context_source.invalid', { error: source.error });
|
|
708
|
+
}
|
|
709
|
+
return translator.t('flow.context_source.missing');
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
function formatFlowReport(report, options = {}) {
|
|
713
|
+
const translator = translatorForHuman(options);
|
|
621
714
|
const lines = [
|
|
622
|
-
'
|
|
715
|
+
translator.t('flow.title'),
|
|
623
716
|
'',
|
|
624
|
-
'
|
|
625
|
-
'
|
|
626
|
-
'
|
|
627
|
-
`-
|
|
717
|
+
`${translator.t('flow.command_path')}:`,
|
|
718
|
+
`- ${translator.t('flow.bootstrap_remote')}: npx create-quiver <command>`,
|
|
719
|
+
`- ${translator.t('flow.short_alias')}: quiver <command>`,
|
|
720
|
+
`- ${translator.t('flow.generated_script')}: ${report.facts.flowScriptCommand}`,
|
|
628
721
|
'',
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
722
|
+
`${translator.t('flow.package_manager')}: ${report.facts.packageManager}`,
|
|
723
|
+
`${translator.t('flow.stage')}: ${translator.t(`flow.stage.${report.stage}`)}`,
|
|
724
|
+
`${translator.t('flow.next_safe_command')}: ${report.nextCommand}`,
|
|
725
|
+
`${translator.t('flow.context_source')}: ${formatFlowContextSource(report.facts.contextSource, translator)}`,
|
|
633
726
|
];
|
|
634
727
|
|
|
635
728
|
if (report.blockers.length > 0) {
|
|
636
|
-
lines.push('', '
|
|
729
|
+
lines.push('', `${translator.t('flow.blockers')}:`);
|
|
637
730
|
for (const blocker of report.blockers) {
|
|
638
|
-
lines.push(`- ${blocker}`);
|
|
731
|
+
lines.push(`- ${formatFlowBlocker(blocker, translator)}`);
|
|
639
732
|
}
|
|
640
733
|
}
|
|
641
734
|
|
|
642
|
-
lines.push('', '
|
|
735
|
+
lines.push('', `${translator.t('flow.suggested_sequence')}:`);
|
|
643
736
|
for (const command of report.suggestedCommands) {
|
|
644
737
|
lines.push(`- ${command}`);
|
|
645
738
|
}
|
|
646
739
|
|
|
647
740
|
if (report.facts.specSlugs.length > 0) {
|
|
648
|
-
lines.push('',
|
|
741
|
+
lines.push('', `${translator.t('flow.specs_found')}: ${report.facts.specSlugs.join(', ')}`);
|
|
649
742
|
}
|
|
650
743
|
|
|
651
|
-
lines.push('', '
|
|
744
|
+
lines.push('', translator.t('flow.safety_read_only'));
|
|
652
745
|
|
|
653
746
|
return `${lines.join('\n')}\n`;
|
|
654
747
|
}
|
|
@@ -661,7 +754,7 @@ async function runFlow(repoRoot, options = {}) {
|
|
|
661
754
|
return report;
|
|
662
755
|
}
|
|
663
756
|
|
|
664
|
-
process.stdout.write(formatFlowReport(report));
|
|
757
|
+
process.stdout.write(formatFlowReport(report, options));
|
|
665
758
|
return report;
|
|
666
759
|
}
|
|
667
760
|
|
|
@@ -3,6 +3,7 @@ const { computeLevels, detectFileConflicts } = require('../lib/slice-graph');
|
|
|
3
3
|
const { renderDotGraph } = require('../lib/renderers/dot');
|
|
4
4
|
const { renderMermaidGraph } = require('../lib/renderers/mermaid');
|
|
5
5
|
const { renderTreeGraph, isUnicodeEnabled } = require('../lib/renderers/tree');
|
|
6
|
+
const { createTranslator } = require('../lib/i18n/catalog');
|
|
6
7
|
|
|
7
8
|
function toGraphNode(node) {
|
|
8
9
|
return {
|
|
@@ -69,9 +70,14 @@ function collectGraph(repoRoot, options = {}) {
|
|
|
69
70
|
}
|
|
70
71
|
|
|
71
72
|
function formatHumanGraph(report, options = {}) {
|
|
73
|
+
const translator = createTranslator(options.language);
|
|
72
74
|
const format = options.format || 'tree';
|
|
75
|
+
if (format === 'tree' && typeof options.level === 'number' && (!Array.isArray(report.levels) || report.levels.length === 0)) {
|
|
76
|
+
return `${translator.t('graph.empty.level', { level: options.level })}\n`;
|
|
77
|
+
}
|
|
73
78
|
const sharedOptions = {
|
|
74
79
|
showConflicts: options.showConflicts === true,
|
|
80
|
+
language: options.language,
|
|
75
81
|
unicode: options.unicode === true || isUnicodeEnabled(options),
|
|
76
82
|
};
|
|
77
83
|
|
|
@@ -87,12 +93,13 @@ function formatHumanGraph(report, options = {}) {
|
|
|
87
93
|
return renderDotGraph(report, sharedOptions);
|
|
88
94
|
}
|
|
89
95
|
|
|
90
|
-
throw new Error(`create-quiver:
|
|
96
|
+
throw new Error(`create-quiver: ${translator.t('graph.error.unsupported_format', { format })}`);
|
|
91
97
|
}
|
|
92
98
|
|
|
93
99
|
function runGraph(repoRoot, options = {}) {
|
|
100
|
+
const translator = createTranslator(options.language);
|
|
94
101
|
if (options.format && !['tree', 'mermaid', 'dot'].includes(options.format)) {
|
|
95
|
-
throw new Error(`create-quiver:
|
|
102
|
+
throw new Error(`create-quiver: ${translator.t('graph.error.unsupported_format', { format: options.format })}`);
|
|
96
103
|
}
|
|
97
104
|
|
|
98
105
|
const report = collectGraph(repoRoot, options);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const path = require('path');
|
|
2
2
|
const readline = require('readline');
|
|
3
3
|
const { collectPlan } = require('./plan');
|
|
4
|
+
const { formatStatus, translatorForHuman } = require('../lib/i18n/read-only-format');
|
|
4
5
|
const { startSlice } = require('../lib/lifecycle');
|
|
5
6
|
|
|
6
7
|
function toStartSliceCommand(slicePath) {
|
|
@@ -34,15 +35,16 @@ function collectNext(repoRoot, options = {}) {
|
|
|
34
35
|
}
|
|
35
36
|
|
|
36
37
|
function formatHumanNext(report, options = {}) {
|
|
37
|
-
const
|
|
38
|
+
const translator = translatorForHuman(options);
|
|
39
|
+
const lines = [options.allReady ? translator.t('next.title.ready') : translator.t('next.title.next')];
|
|
38
40
|
|
|
39
41
|
if (!report.next) {
|
|
40
|
-
lines.push('
|
|
42
|
+
lines.push(translator.t('next.empty.ready'));
|
|
41
43
|
if (report.include_completed && report.history.length > 0) {
|
|
42
44
|
lines.push('');
|
|
43
|
-
lines.push('
|
|
45
|
+
lines.push(`${translator.t('next.history_title')}:`);
|
|
44
46
|
for (const item of report.history) {
|
|
45
|
-
lines.push(`- ${item.ref} (${item.status})`);
|
|
47
|
+
lines.push(`- ${item.ref} (${formatStatus(item.status, translator)})`);
|
|
46
48
|
}
|
|
47
49
|
}
|
|
48
50
|
return `${lines.join('\n')}\n`;
|
|
@@ -55,25 +57,25 @@ function formatHumanNext(report, options = {}) {
|
|
|
55
57
|
if (options.allReady) {
|
|
56
58
|
lines.push('');
|
|
57
59
|
lines.push(`[${index + 1}] ${item.ref}`);
|
|
58
|
-
lines.push(
|
|
59
|
-
lines.push(
|
|
60
|
-
lines.push(
|
|
60
|
+
lines.push(`${translator.t('next.label.title')}: ${item.title}`);
|
|
61
|
+
lines.push(`${translator.t('next.label.status')}: ${formatStatus(item.status, translator)}`);
|
|
62
|
+
lines.push(`${translator.t('next.label.start')}: ${command}`);
|
|
61
63
|
} else {
|
|
62
|
-
lines.push(
|
|
63
|
-
lines.push(
|
|
64
|
-
lines.push(
|
|
65
|
-
lines.push(
|
|
64
|
+
lines.push(`${translator.t('next.label.slice')}: ${item.ref}`);
|
|
65
|
+
lines.push(`${translator.t('next.label.title')}: ${item.title}`);
|
|
66
|
+
lines.push(`${translator.t('next.label.status')}: ${formatStatus(item.status, translator)}`);
|
|
67
|
+
lines.push(`${translator.t('next.label.start')}: ${command}`);
|
|
66
68
|
if (report.all_ready.length > 1) {
|
|
67
|
-
lines.push(
|
|
69
|
+
lines.push(`${translator.t('next.label.also_ready')}: ${report.all_ready.slice(1).map((candidate) => candidate.ref).join(', ')}`);
|
|
68
70
|
}
|
|
69
71
|
}
|
|
70
72
|
}
|
|
71
73
|
|
|
72
74
|
if (report.include_completed && report.history.length > 0) {
|
|
73
75
|
lines.push('');
|
|
74
|
-
lines.push('
|
|
76
|
+
lines.push(`${translator.t('next.history_title')}:`);
|
|
75
77
|
for (const item of report.history) {
|
|
76
|
-
lines.push(`- ${item.ref} (${item.status})`);
|
|
78
|
+
lines.push(`- ${item.ref} (${formatStatus(item.status, translator)})`);
|
|
77
79
|
}
|
|
78
80
|
}
|
|
79
81
|
|
|
@@ -104,6 +106,7 @@ function promptConfirm(message, io = {}) {
|
|
|
104
106
|
|
|
105
107
|
async function runNext(repoRoot, options = {}) {
|
|
106
108
|
const report = collectNext(repoRoot, options);
|
|
109
|
+
const translator = translatorForHuman(options);
|
|
107
110
|
const isTTY = options.isTTY || {
|
|
108
111
|
stdin: Boolean(process.stdin.isTTY),
|
|
109
112
|
stdout: Boolean(process.stdout.isTTY),
|
|
@@ -115,17 +118,17 @@ async function runNext(repoRoot, options = {}) {
|
|
|
115
118
|
}
|
|
116
119
|
|
|
117
120
|
if (!report.next) {
|
|
118
|
-
process.stdout.write('
|
|
121
|
+
process.stdout.write(`${translator.t('next.empty.ready')}\n`);
|
|
119
122
|
return report;
|
|
120
123
|
}
|
|
121
124
|
|
|
122
|
-
const confirmed = await (options.promptConfirm || promptConfirm)(
|
|
125
|
+
const confirmed = await (options.promptConfirm || promptConfirm)(translator.t('next.prompt.start', { ref: report.next.ref }));
|
|
123
126
|
if (confirmed) {
|
|
124
127
|
const slicePath = path.resolve(repoRoot, report.next.slice_path);
|
|
125
128
|
await Promise.resolve((options.startSliceFn || startSlice)(slicePath, { allowDraft: true }));
|
|
126
|
-
process.stdout.write(
|
|
129
|
+
process.stdout.write(`${translator.t('next.started', { ref: report.next.ref })}\n`);
|
|
127
130
|
} else {
|
|
128
|
-
process.stdout.write('
|
|
131
|
+
process.stdout.write(`${translator.t('next.aborted')}\n`);
|
|
129
132
|
}
|
|
130
133
|
return report;
|
|
131
134
|
}
|