create-quiver 0.15.3 → 0.15.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +3 -0
- package/AGENTS.md.es.template +37 -0
- package/docs/AI_CONTEXT.md.es.template +35 -0
- package/docs/AI_ONBOARDING_PROMPT.md.es.template +22 -0
- package/docs/CLI_UX_GUIDE.md +46 -0
- package/docs/COMMANDS.md.es.template +28 -0
- package/docs/CONTEXTO.md.es.template +33 -0
- package/docs/DECISIONS.md.es.template +17 -0
- package/docs/GITFLOW_PR_GUIDE.md.es.template +25 -0
- package/docs/INDEX.md +10 -1
- package/docs/INDEX.md.es.template +36 -0
- 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 +29 -0
- package/docs/ai/LESSONS.md.es.template +24 -0
- package/docs/getting-started/installation.md +19 -0
- package/docs/reference/commands.md +55 -1
- package/package.json +1 -1
- 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 +545 -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/src/create-quiver/commands/ai.js +485 -307
- package/src/create-quiver/commands/config.js +124 -0
- package/src/create-quiver/commands/demo.js +2 -2
- package/src/create-quiver/commands/evidence.js +6 -4
- package/src/create-quiver/commands/flow.js +108 -16
- package/src/create-quiver/commands/graph.js +1 -0
- package/src/create-quiver/commands/next.js +21 -18
- package/src/create-quiver/commands/plan.js +23 -6
- package/src/create-quiver/commands/spec.js +66 -57
- package/src/create-quiver/index.js +514 -139
- 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 +24 -21
- package/src/create-quiver/lib/ai/run-state.js +28 -25
- package/src/create-quiver/lib/dashboard.js +154 -111
- package/src/create-quiver/lib/demo.js +14 -12
- 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 +853 -0
- package/src/create-quiver/lib/i18n/messages/es.js +968 -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 +18 -4
- package/src/create-quiver/lib/init-layout.js +6 -0
- package/src/create-quiver/lib/lifecycle.js +53 -46
- package/src/create-quiver/lib/readiness.js +77 -67
- package/src/create-quiver/lib/renderers/tree.js +9 -6
- package/src/create-quiver/lib/spec-worktrees.js +34 -30
- package/src/create-quiver/lib/version.js +11 -9
|
@@ -2,6 +2,7 @@ const fs = require('fs');
|
|
|
2
2
|
const path = require('path');
|
|
3
3
|
const { catFileExists, currentBranch, hasLocalBranch, hasRemoteBranch, mergeBaseIsAncestor, revListCount, runGit, statusPorcelain, worktreeList } = require('./git');
|
|
4
4
|
const { parseJsonWithComments } = require('./json');
|
|
5
|
+
const { createTranslator } = require('./i18n/catalog');
|
|
5
6
|
const { buildGraph, normalizeDeclaredDependencies, readAllSlices, SliceGraphError, topoSort } = require('./slice-graph');
|
|
6
7
|
const { resolveSliceContext, toAlias, validateSliceMetaForStart } = require('./slice');
|
|
7
8
|
const { validateProjectRelativePaths } = require('./paths');
|
|
@@ -12,6 +13,10 @@ function ensureExists(filePath, message) {
|
|
|
12
13
|
}
|
|
13
14
|
}
|
|
14
15
|
|
|
16
|
+
function readinessTranslator(options = {}) {
|
|
17
|
+
return createTranslator(options.language || 'es');
|
|
18
|
+
}
|
|
19
|
+
|
|
15
20
|
function walkSlices(rootDir, acc, repoRoot) {
|
|
16
21
|
if (!fs.existsSync(rootDir)) {
|
|
17
22
|
return;
|
|
@@ -96,33 +101,33 @@ function collectOverlapWarnings(repoRoot, currentBranchName, currentFiles, baseR
|
|
|
96
101
|
return warnings;
|
|
97
102
|
}
|
|
98
103
|
|
|
99
|
-
function validateLocalSliceArtifacts(repoRoot, slice) {
|
|
104
|
+
function validateLocalSliceArtifacts(repoRoot, slice, translator) {
|
|
100
105
|
const sliceDir = path.dirname(slice.sliceAbs);
|
|
101
106
|
for (const file of ['EXECUTION_BRIEF.md', 'CLOSURE_BRIEF.md']) {
|
|
102
107
|
ensureExists(path.join(sliceDir, file), `create-quiver: falta '${path.posix.join(path.dirname(slice.sliceRel), file)}'.`);
|
|
103
108
|
}
|
|
104
|
-
console.log('
|
|
109
|
+
console.log(translator.t('readiness.local.briefs.pass'));
|
|
105
110
|
|
|
106
111
|
if (!Array.isArray(slice.json.files) || slice.json.files.length === 0) {
|
|
107
|
-
throw new Error(
|
|
112
|
+
throw new Error(`create-quiver: ${translator.t('readiness.local.files.error.empty')}`);
|
|
108
113
|
}
|
|
109
114
|
|
|
110
115
|
const invalidFiles = slice.json.files.filter((file) => typeof file !== 'string' || file.trim().length === 0);
|
|
111
116
|
if (invalidFiles.length > 0) {
|
|
112
|
-
throw new Error(
|
|
117
|
+
throw new Error(`create-quiver: ${translator.t('readiness.local.files.error.invalid')}`);
|
|
113
118
|
}
|
|
114
|
-
console.log('
|
|
119
|
+
console.log(translator.t('readiness.local.files.pass'));
|
|
115
120
|
|
|
116
121
|
validateSliceMetaForStart(slice);
|
|
117
|
-
console.log('
|
|
122
|
+
console.log(translator.t('readiness.local.git.pass'));
|
|
118
123
|
|
|
119
124
|
validateProjectRelativePaths(slice.files, 'slice.json files/allowed_write_paths');
|
|
120
125
|
validateProjectRelativePaths(slice.expectedReadPaths, 'slice.json expected_read_paths');
|
|
121
|
-
console.log('
|
|
126
|
+
console.log(translator.t('readiness.local.paths.pass'));
|
|
122
127
|
}
|
|
123
128
|
|
|
124
|
-
function baseRecoveryMessage(remote, baseBranch) {
|
|
125
|
-
return
|
|
129
|
+
function baseRecoveryMessage(remote, baseBranch, translator) {
|
|
130
|
+
return translator.t('readiness.base.recovery', { base: baseBranch, remote, remoteRef: `${remote}/${baseBranch}` });
|
|
126
131
|
}
|
|
127
132
|
|
|
128
133
|
function resolveReadinessRoot(localMode) {
|
|
@@ -137,6 +142,7 @@ function resolveReadinessRoot(localMode) {
|
|
|
137
142
|
}
|
|
138
143
|
|
|
139
144
|
function validateSliceDocumentedOnBase(repoRoot, slice, options = {}) {
|
|
145
|
+
const translator = readinessTranslator(options);
|
|
140
146
|
const gate = options.gate || 'execution';
|
|
141
147
|
const remote = options.remote || 'origin';
|
|
142
148
|
const baseBranch = options.baseBranch || slice.baseBranch || 'develop';
|
|
@@ -145,19 +151,19 @@ function validateSliceDocumentedOnBase(repoRoot, slice, options = {}) {
|
|
|
145
151
|
const hasLocalBase = hasLocalBranch(repoRoot, baseBranch);
|
|
146
152
|
|
|
147
153
|
if (hasRemoteBase && catFileExists(repoRoot, `${remoteRef}:${slice.sliceRel}`)) {
|
|
148
|
-
console.log(
|
|
154
|
+
console.log(translator.t('readiness.documented.remote.pass', { ref: remoteRef }));
|
|
149
155
|
return remoteRef;
|
|
150
156
|
}
|
|
151
157
|
|
|
152
158
|
if (hasLocalBase && catFileExists(repoRoot, `${baseBranch}:${slice.sliceRel}`)) {
|
|
153
|
-
console.log(
|
|
159
|
+
console.log(translator.t('readiness.documented.local.pass', { branch: baseBranch }));
|
|
154
160
|
return baseBranch;
|
|
155
161
|
}
|
|
156
162
|
|
|
157
163
|
if (!hasRemoteBase && !hasLocalBase) {
|
|
158
|
-
const guidance = baseRecoveryMessage(remote, baseBranch);
|
|
164
|
+
const guidance = baseRecoveryMessage(remote, baseBranch, translator);
|
|
159
165
|
if (gate === 'validation') {
|
|
160
|
-
console.log(
|
|
166
|
+
console.log(translator.t('readiness.warn', { message: guidance }));
|
|
161
167
|
return null;
|
|
162
168
|
}
|
|
163
169
|
|
|
@@ -166,11 +172,11 @@ function validateSliceDocumentedOnBase(repoRoot, slice, options = {}) {
|
|
|
166
172
|
|
|
167
173
|
const expectedBase = hasRemoteBase ? remoteRef : baseBranch;
|
|
168
174
|
if (gate === 'validation') {
|
|
169
|
-
console.log(
|
|
175
|
+
console.log(translator.t('readiness.documented.missing_validation.warn', { ref: expectedBase }));
|
|
170
176
|
return expectedBase;
|
|
171
177
|
}
|
|
172
178
|
|
|
173
|
-
throw new Error(`create-quiver:
|
|
179
|
+
throw new Error(`create-quiver: ${translator.t('readiness.documented.missing.error', { ref: expectedBase })}`);
|
|
174
180
|
}
|
|
175
181
|
|
|
176
182
|
function validateDeclaredDependencyContract(repoRoot, slice) {
|
|
@@ -227,12 +233,13 @@ function validateDeclaredDependencyContract(repoRoot, slice) {
|
|
|
227
233
|
}
|
|
228
234
|
}
|
|
229
235
|
|
|
230
|
-
function localCheckSummary() {
|
|
231
|
-
console.log('
|
|
232
|
-
console.log('
|
|
236
|
+
function localCheckSummary(translator) {
|
|
237
|
+
console.log(translator.t('readiness.local.summary.executed'));
|
|
238
|
+
console.log(translator.t('readiness.local.summary.skipped'));
|
|
233
239
|
}
|
|
234
240
|
|
|
235
241
|
function checkSliceReadiness(sliceInput, options = {}) {
|
|
242
|
+
const translator = readinessTranslator(options);
|
|
236
243
|
const gate = options.gate || 'execution';
|
|
237
244
|
const localMode = options.local === true;
|
|
238
245
|
const strictOverlap = options.strictOverlap === true;
|
|
@@ -244,17 +251,18 @@ function checkSliceReadiness(sliceInput, options = {}) {
|
|
|
244
251
|
for (const specFile of ['SPEC.md', 'STATUS.md', 'EVIDENCE_REPORT.md']) {
|
|
245
252
|
ensureExists(path.join(repoRoot, slice.specDirRel, specFile), `create-quiver: falta '${slice.specDirRel}/${specFile}'.`);
|
|
246
253
|
}
|
|
247
|
-
console.log('
|
|
254
|
+
console.log(translator.t('readiness.spec_docs.pass'));
|
|
248
255
|
|
|
249
256
|
let baseRef = null;
|
|
250
257
|
if (localMode) {
|
|
251
|
-
validateLocalSliceArtifacts(repoRoot, slice);
|
|
252
|
-
console.log(
|
|
253
|
-
console.log('
|
|
258
|
+
validateLocalSliceArtifacts(repoRoot, slice, translator);
|
|
259
|
+
console.log(translator.t('readiness.local.skip_base', { base: baseBranch, remoteRef: `${remote}/${baseBranch}` }));
|
|
260
|
+
console.log(translator.t('readiness.local.skip_overlap'));
|
|
254
261
|
} else {
|
|
255
262
|
baseRef = validateSliceDocumentedOnBase(repoRoot, slice, {
|
|
256
263
|
baseBranch,
|
|
257
264
|
gate,
|
|
265
|
+
language: options.language,
|
|
258
266
|
remote,
|
|
259
267
|
});
|
|
260
268
|
}
|
|
@@ -262,130 +270,132 @@ function checkSliceReadiness(sliceInput, options = {}) {
|
|
|
262
270
|
if (!localMode) {
|
|
263
271
|
const overlapWarnings = collectOverlapWarnings(repoRoot, currentBranch(repoRoot), slice.files, baseRef || `${remote}/${baseBranch}`);
|
|
264
272
|
if (overlapWarnings.length === 0) {
|
|
265
|
-
console.log('
|
|
273
|
+
console.log(translator.t('readiness.overlap.none.pass'));
|
|
266
274
|
} else {
|
|
267
275
|
for (const warning of overlapWarnings) {
|
|
268
276
|
const [overlapBranch, overlapFiles] = warning.split('|');
|
|
269
277
|
if (strictOverlap) {
|
|
270
|
-
throw new Error(`create-quiver:
|
|
278
|
+
throw new Error(`create-quiver: ${translator.t('readiness.overlap.warning', { branch: overlapBranch, files: overlapFiles })}`);
|
|
271
279
|
}
|
|
272
|
-
console.log(
|
|
280
|
+
console.log(translator.t('readiness.overlap.warn', { branch: overlapBranch, files: overlapFiles }));
|
|
273
281
|
}
|
|
274
282
|
}
|
|
275
283
|
}
|
|
276
284
|
|
|
277
285
|
validateDeclaredDependencyContract(repoRoot, slice);
|
|
278
286
|
if (localMode) {
|
|
279
|
-
localCheckSummary();
|
|
287
|
+
localCheckSummary(translator);
|
|
280
288
|
}
|
|
281
289
|
|
|
282
290
|
switch (gate) {
|
|
283
291
|
case 'ready':
|
|
284
292
|
if (slice.status !== 'ready') {
|
|
285
|
-
throw new Error(`create-quiver:
|
|
293
|
+
throw new Error(`create-quiver: ${translator.t('readiness.gate.ready.error_status', { status: slice.status })}`);
|
|
286
294
|
}
|
|
287
|
-
console.log('
|
|
295
|
+
console.log(translator.t('readiness.gate.ready.pass'));
|
|
288
296
|
break;
|
|
289
297
|
case 'execution':
|
|
290
298
|
if (slice.status === 'blocked') {
|
|
291
|
-
throw new Error(
|
|
299
|
+
throw new Error(`create-quiver: ${translator.t('readiness.gate.execution.error.blocked')}`);
|
|
292
300
|
}
|
|
293
301
|
if (slice.status === 'cancelled') {
|
|
294
|
-
throw new Error(
|
|
302
|
+
throw new Error(`create-quiver: ${translator.t('readiness.gate.execution.error.cancelled')}`);
|
|
295
303
|
}
|
|
296
304
|
if (slice.status === 'completed') {
|
|
297
|
-
console.log('
|
|
305
|
+
console.log(translator.t('readiness.gate.execution.warn.completed'));
|
|
298
306
|
}
|
|
299
307
|
if (slice.status === 'draft') {
|
|
300
|
-
console.log(
|
|
308
|
+
console.log(translator.t('readiness.gate.execution.warn.draft'));
|
|
301
309
|
}
|
|
302
|
-
console.log('
|
|
310
|
+
console.log(translator.t('readiness.gate.execution.pass'));
|
|
303
311
|
break;
|
|
304
312
|
case 'validation':
|
|
305
313
|
if (slice.status !== 'completed') {
|
|
306
|
-
throw new Error(
|
|
314
|
+
throw new Error(`create-quiver: ${translator.t('readiness.gate.validation.error_status')}`);
|
|
307
315
|
}
|
|
308
316
|
if (!slice.json.completed_at) {
|
|
309
|
-
throw new Error(
|
|
317
|
+
throw new Error(`create-quiver: ${translator.t('readiness.gate.validation.error_completed_at')}`);
|
|
310
318
|
}
|
|
311
319
|
if (!slice.json.started_at) {
|
|
312
|
-
throw new Error(
|
|
320
|
+
throw new Error(`create-quiver: ${translator.t('readiness.gate.validation.error_started_at')}`);
|
|
313
321
|
}
|
|
314
322
|
if (!slice.json.actual_hours || Number(slice.json.actual_hours) <= 0) {
|
|
315
|
-
throw new Error(
|
|
323
|
+
throw new Error(`create-quiver: ${translator.t('readiness.gate.validation.error_actual_hours')}`);
|
|
316
324
|
}
|
|
317
|
-
console.log('
|
|
325
|
+
console.log(translator.t('readiness.gate.validation.pass'));
|
|
318
326
|
break;
|
|
319
327
|
}
|
|
320
328
|
}
|
|
321
329
|
|
|
322
|
-
function checkPrReadiness(sliceInput) {
|
|
330
|
+
function checkPrReadiness(sliceInput, options = {}) {
|
|
331
|
+
const translator = readinessTranslator(options);
|
|
323
332
|
const repoRoot = runGit(['rev-parse', '--show-toplevel'], process.cwd());
|
|
324
333
|
const scriptDir = path.dirname(__filename);
|
|
325
334
|
const slice = resolveSliceContext(repoRoot, sliceInput);
|
|
326
335
|
const current = currentBranch(repoRoot);
|
|
327
336
|
const prPath = path.join(path.dirname(slice.sliceAbs), 'pr.md');
|
|
328
337
|
|
|
329
|
-
checkSliceReadiness(slice.sliceRel, { gate: 'validation' });
|
|
330
|
-
checkScope(slice.sliceRel, { strict: true });
|
|
338
|
+
checkSliceReadiness(slice.sliceRel, { gate: 'validation', language: options.language });
|
|
339
|
+
checkScope(slice.sliceRel, { language: options.language, strict: true });
|
|
331
340
|
|
|
332
341
|
if (!slice.branchName) {
|
|
333
|
-
throw new Error(
|
|
342
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.missing_branch')}`);
|
|
334
343
|
}
|
|
335
344
|
if (!fs.existsSync(prPath)) {
|
|
336
|
-
throw new Error(
|
|
345
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.missing_pr')}`);
|
|
337
346
|
}
|
|
338
347
|
if (current !== slice.branchName) {
|
|
339
|
-
throw new Error(`create-quiver:
|
|
348
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.wrong_branch', { actual: current, expected: slice.branchName })}`);
|
|
340
349
|
}
|
|
341
|
-
console.log('
|
|
350
|
+
console.log(translator.t('readiness.pr.branch.pass'));
|
|
342
351
|
if (statusPorcelain(repoRoot) !== '') {
|
|
343
|
-
throw new Error(
|
|
352
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.dirty')}`);
|
|
344
353
|
}
|
|
345
|
-
console.log('
|
|
354
|
+
console.log(translator.t('readiness.pr.clean.pass'));
|
|
346
355
|
|
|
347
356
|
const aheadCount = revListCount(repoRoot, 'origin/develop..HEAD');
|
|
348
357
|
if (aheadCount <= 0) {
|
|
349
358
|
if (mergeBaseIsAncestor(repoRoot, 'HEAD', 'origin/develop')) {
|
|
350
|
-
throw new Error(
|
|
359
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.absorbed')}`);
|
|
351
360
|
}
|
|
352
|
-
throw new Error(
|
|
361
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.no_commits')}`);
|
|
353
362
|
}
|
|
354
|
-
console.log('
|
|
363
|
+
console.log(translator.t('readiness.pr.commits.pass'));
|
|
355
364
|
|
|
356
365
|
const prText = fs.readFileSync(prPath, 'utf8');
|
|
357
366
|
for (const heading of ['## Title', '## Summary', '## Scope', '## Files', '## How to Test (DETAILED - REQUIRED)', '## Evidence', '## Rollback', '## Risks / Notes']) {
|
|
358
367
|
if (!prText.includes(heading)) {
|
|
359
|
-
throw new Error(`create-quiver:
|
|
368
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.missing_section', { heading })}`);
|
|
360
369
|
}
|
|
361
370
|
}
|
|
362
|
-
console.log('
|
|
371
|
+
console.log(translator.t('readiness.pr.sections.pass'));
|
|
363
372
|
|
|
364
373
|
for (const subheading of ['### Required Environment', '### Worktree Access', '### Run the Project', '### Use Cases', '### Technical Verification']) {
|
|
365
374
|
if (!prText.includes(subheading)) {
|
|
366
|
-
throw new Error(`create-quiver:
|
|
375
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.missing_subsection', { subheading })}`);
|
|
367
376
|
}
|
|
368
377
|
}
|
|
369
|
-
console.log('
|
|
378
|
+
console.log(translator.t('readiness.pr.how_to_test.pass'));
|
|
370
379
|
|
|
371
380
|
if (!/#### Case [0-9]+:/.test(prText)) {
|
|
372
|
-
throw new Error(
|
|
381
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.no_case')}`);
|
|
373
382
|
}
|
|
374
|
-
console.log('
|
|
383
|
+
console.log(translator.t('readiness.pr.case.pass'));
|
|
375
384
|
|
|
376
385
|
if (!/git revert /.test(prText)) {
|
|
377
|
-
throw new Error(
|
|
386
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.rollback')}`);
|
|
378
387
|
}
|
|
379
|
-
console.log('
|
|
388
|
+
console.log(translator.t('readiness.pr.rollback.pass'));
|
|
380
389
|
|
|
381
390
|
if (/^\s*-\s*`manual review`$/mi.test(prText) || /^\s*-\s*`visual check`$/mi.test(prText) || /^\s*-\s*`screen test`$/mi.test(prText) || /^\s*-\s*`visual validation`$/mi.test(prText)) {
|
|
382
391
|
throw new Error('create-quiver: How to Test cannot rely only on generic phrases.');
|
|
383
392
|
}
|
|
384
393
|
|
|
385
|
-
console.log(
|
|
394
|
+
console.log(translator.t('readiness.pr.ready.pass', { slice: slice.sliceId }));
|
|
386
395
|
}
|
|
387
396
|
|
|
388
397
|
function checkScope(sliceInput, options = {}) {
|
|
398
|
+
const translator = readinessTranslator(options);
|
|
389
399
|
const strict = options.strict === true;
|
|
390
400
|
const remote = options.remote || 'origin';
|
|
391
401
|
const repoRoot = runGit(['rev-parse', '--show-toplevel'], process.cwd());
|
|
@@ -420,14 +430,14 @@ function checkScope(sliceInput, options = {}) {
|
|
|
420
430
|
let touchedRaw = '';
|
|
421
431
|
if (baseRef) {
|
|
422
432
|
touchedRaw = runGit(['diff', '--name-only', `${baseRef}...HEAD`], repoRoot);
|
|
423
|
-
console.log(
|
|
433
|
+
console.log(translator.t('readiness.scope.base.info', { ref: baseRef, source: baseSource }));
|
|
424
434
|
} else {
|
|
425
|
-
console.log(
|
|
435
|
+
console.log(translator.t('readiness.scope.base.warn', { branches: candidateBaseBranches.join(', ') }));
|
|
426
436
|
return;
|
|
427
437
|
}
|
|
428
438
|
|
|
429
439
|
if (!touchedRaw) {
|
|
430
|
-
console.log(
|
|
440
|
+
console.log(translator.t('readiness.scope.empty.warn', { ref: baseRef }));
|
|
431
441
|
return;
|
|
432
442
|
}
|
|
433
443
|
|
|
@@ -451,7 +461,7 @@ function checkScope(sliceInput, options = {}) {
|
|
|
451
461
|
});
|
|
452
462
|
|
|
453
463
|
if (outOfScope.length === 0) {
|
|
454
|
-
console.log('
|
|
464
|
+
console.log(translator.t('readiness.scope.pass'));
|
|
455
465
|
return;
|
|
456
466
|
}
|
|
457
467
|
|
|
@@ -459,16 +469,16 @@ function checkScope(sliceInput, options = {}) {
|
|
|
459
469
|
for (const file of outOfScope) {
|
|
460
470
|
violationCount += 1;
|
|
461
471
|
if (strict) {
|
|
462
|
-
throw new Error(`create-quiver:
|
|
472
|
+
throw new Error(`create-quiver: ${translator.t('readiness.scope.error.file', { file })}`);
|
|
463
473
|
}
|
|
464
|
-
console.log(
|
|
474
|
+
console.log(translator.t('readiness.scope.warn.file', { file }));
|
|
465
475
|
}
|
|
466
476
|
|
|
467
477
|
if (violationCount > 0) {
|
|
468
478
|
if (strict) {
|
|
469
|
-
throw new Error(
|
|
479
|
+
throw new Error(translator.t('readiness.scope.error.count', { count: violationCount }));
|
|
470
480
|
}
|
|
471
|
-
console.log(
|
|
481
|
+
console.log(translator.t('readiness.scope.warn.count', { count: violationCount }));
|
|
472
482
|
}
|
|
473
483
|
}
|
|
474
484
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
const { formatStatus, translatorForHuman } = require('../i18n/read-only-format');
|
|
2
|
+
|
|
1
3
|
function isUnicodeEnabled(options = {}) {
|
|
2
4
|
if (options.unicode === true) {
|
|
3
5
|
return true;
|
|
@@ -53,10 +55,10 @@ function countParallelLots(level, conflicts) {
|
|
|
53
55
|
}
|
|
54
56
|
|
|
55
57
|
function formatLevelHeader(levelIndex, level, conflicts, options = {}) {
|
|
56
|
-
const
|
|
57
|
-
const label =
|
|
58
|
+
const translator = translatorForHuman(options);
|
|
59
|
+
const label = translator.t('graph.level', { level: levelIndex });
|
|
58
60
|
const lotCount = countParallelLots(level, conflicts);
|
|
59
|
-
return `${label} (${level.length}
|
|
61
|
+
return `${label} (${translator.t('graph.slices_count', { count: level.length })}, ${translator.t('graph.lots_count', { count: lotCount })})`;
|
|
60
62
|
}
|
|
61
63
|
|
|
62
64
|
function formatConflictSuffix(conflict, options = {}) {
|
|
@@ -73,6 +75,7 @@ function formatConflictSuffix(conflict, options = {}) {
|
|
|
73
75
|
|
|
74
76
|
function renderTreeGraph(report, options = {}) {
|
|
75
77
|
const unicode = isUnicodeEnabled(options);
|
|
78
|
+
const translator = translatorForHuman(options);
|
|
76
79
|
const branch = unicode ? '├─' : '+--';
|
|
77
80
|
const lastBranch = unicode ? '└─' : '\\--';
|
|
78
81
|
const pipe = unicode ? '│ ' : '| ';
|
|
@@ -80,10 +83,10 @@ function renderTreeGraph(report, options = {}) {
|
|
|
80
83
|
const lines = [];
|
|
81
84
|
|
|
82
85
|
if (!Array.isArray(report.levels) || report.levels.length === 0) {
|
|
83
|
-
return '
|
|
86
|
+
return `${translator.t('graph.empty.pending')}\n`;
|
|
84
87
|
}
|
|
85
88
|
|
|
86
|
-
lines.push('
|
|
89
|
+
lines.push(translator.t('graph.title'));
|
|
87
90
|
|
|
88
91
|
report.levels.forEach((level, levelIndex) => {
|
|
89
92
|
const levelConflicts = Array.isArray(report.conflicts)
|
|
@@ -98,7 +101,7 @@ function renderTreeGraph(report, options = {}) {
|
|
|
98
101
|
const sharedPaths = conflict && options.showConflicts ? ` ${formatConflictSuffix(conflict, options)}` : '';
|
|
99
102
|
const title = slice.title ? ` ${slice.title}` : '';
|
|
100
103
|
const hours = typeof slice.hours === 'number' ? ` (${slice.hours}h)` : '';
|
|
101
|
-
const status = slice.status ? ` [${slice.status}]` : '';
|
|
104
|
+
const status = slice.status ? ` [${formatStatus(slice.status, translator)}]` : '';
|
|
102
105
|
lines.push(`${connector} ${marker} ${slice.ref}${title}${hours}${status}${sharedPaths}`.replace(/\s+/g, ' ').trimEnd());
|
|
103
106
|
});
|
|
104
107
|
|
|
@@ -20,6 +20,7 @@ const {
|
|
|
20
20
|
} = require('./git');
|
|
21
21
|
const { parseJsonWithComments } = require('./json');
|
|
22
22
|
const { acquireLock, releaseLock, withLockSync } = require('./locks');
|
|
23
|
+
const { createTranslator } = require('./i18n/catalog');
|
|
23
24
|
const { safeBranchName, worktreesRootForRepo } = require('./slice');
|
|
24
25
|
|
|
25
26
|
function formatError(message) {
|
|
@@ -239,23 +240,24 @@ function buildSpecStatus(repoRoot, specInput) {
|
|
|
239
240
|
};
|
|
240
241
|
}
|
|
241
242
|
|
|
242
|
-
function formatSpecStatus(status) {
|
|
243
|
+
function formatSpecStatus(status, options = {}) {
|
|
244
|
+
const translator = createTranslator(options.language);
|
|
243
245
|
const lines = [
|
|
244
|
-
'
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
status.worktreeExpectedPathUnregistered ? '
|
|
251
|
-
|
|
246
|
+
translator.t('spec_status.title'),
|
|
247
|
+
translator.t('spec_status.spec', { path: status.relativeSpecDir }),
|
|
248
|
+
translator.t('spec_status.branch', { branch: status.branchName }),
|
|
249
|
+
translator.t('spec_status.worktree', { path: status.existingWorktree || status.worktreePath }),
|
|
250
|
+
translator.t('spec_status.worktree_missing_stale', { value: status.worktreeMissing ? translator.t('common.yes') : translator.t('common.no') }),
|
|
251
|
+
translator.t('spec_status.worktree_registered', { value: status.existingWorktree ? translator.t('common.yes') : translator.t('common.no') }),
|
|
252
|
+
status.worktreeExpectedPathUnregistered ? translator.t('spec_status.worktree_note_unregistered') : '',
|
|
253
|
+
translator.t('spec_status.worktree_dirty', { value: status.worktreeDirty ? translator.t('common.yes') : translator.t('common.no') }),
|
|
252
254
|
`slice-00: ${status.slice00 ? status.slice00.status : 'missing'}`,
|
|
253
|
-
|
|
254
|
-
'
|
|
255
|
+
translator.t('spec_status.later_slices_blocked', { value: status.laterSlicesBlocked ? translator.t('common.yes') : translator.t('common.no') }),
|
|
256
|
+
translator.t('spec_status.pending_slices'),
|
|
255
257
|
];
|
|
256
258
|
|
|
257
259
|
if (status.pendingSlices.length === 0) {
|
|
258
|
-
lines.push('
|
|
260
|
+
lines.push(`- ${translator.t('common.none')}`);
|
|
259
261
|
} else {
|
|
260
262
|
for (const slice of status.pendingSlices) {
|
|
261
263
|
lines.push(`- ${slice.id}: ${slice.status}`);
|
|
@@ -346,15 +348,16 @@ function startSpecWorktree(repoRoot, specInput, options = {}) {
|
|
|
346
348
|
}, run);
|
|
347
349
|
}
|
|
348
350
|
|
|
349
|
-
function formatSpecStartResult(result) {
|
|
351
|
+
function formatSpecStartResult(result, options = {}) {
|
|
352
|
+
const translator = createTranslator(options.language);
|
|
350
353
|
return `${[
|
|
351
|
-
result.dryRun ? '
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
354
|
+
result.dryRun ? translator.t('spec_start.title.dry_run') : translator.t('spec_start.title.ready'),
|
|
355
|
+
translator.t('spec_start.branch', { branch: result.branchName }),
|
|
356
|
+
translator.t('spec_start.base', { base: result.baseRef }),
|
|
357
|
+
translator.t('spec_start.worktree', { path: result.worktreePath }),
|
|
358
|
+
translator.t('spec_start.reused', { value: result.reused ? translator.t('common.yes') : translator.t('common.no') }),
|
|
356
359
|
`slice-00: ${result.slice00 ? result.slice00.status : 'missing'}`,
|
|
357
|
-
result.dryRun && !result.reused ?
|
|
360
|
+
result.dryRun && !result.reused ? translator.t('spec_start.would_create_worktree', { path: result.worktreePath }) : '',
|
|
358
361
|
].filter(Boolean).join('\n')}\n`;
|
|
359
362
|
}
|
|
360
363
|
|
|
@@ -443,24 +446,25 @@ function closeSpecWorktree(repoRoot, specInput, options = {}) {
|
|
|
443
446
|
}
|
|
444
447
|
}
|
|
445
448
|
|
|
446
|
-
function formatSpecCloseResult(result) {
|
|
449
|
+
function formatSpecCloseResult(result, options = {}) {
|
|
450
|
+
const translator = createTranslator(options.language);
|
|
447
451
|
const lines = [
|
|
448
|
-
result.dryRun ? '
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
452
|
+
result.dryRun ? translator.t('spec_close.title.dry_run') : translator.t('spec_close.title.closed'),
|
|
453
|
+
translator.t('spec_close.spec', { path: result.relativeSpecDir }),
|
|
454
|
+
translator.t('spec_close.branch', { branch: result.branchName }),
|
|
455
|
+
translator.t('spec_close.base', { base: result.baseRef }),
|
|
456
|
+
translator.t('spec_close.worktree', { path: result.worktreePath }),
|
|
457
|
+
translator.t('spec_close.discard', { value: result.discarded ? translator.t('common.yes') : translator.t('common.no') }),
|
|
454
458
|
];
|
|
455
459
|
|
|
456
460
|
if (result.dryRun) {
|
|
457
|
-
lines.push(
|
|
461
|
+
lines.push(translator.t('spec_close.would_remove_worktree', { path: result.worktreePath }));
|
|
458
462
|
if (!result.discarded && result.remote) {
|
|
459
|
-
lines.push(
|
|
463
|
+
lines.push(translator.t('spec_close.would_pull', { command: `git pull --ff-only ${result.remote} ${result.baseBranch}` }));
|
|
460
464
|
}
|
|
461
465
|
} else {
|
|
462
|
-
lines.push(
|
|
463
|
-
lines.push(
|
|
466
|
+
lines.push(translator.t('spec_close.removed_worktree', { value: result.removed ? translator.t('common.yes') : translator.t('common.no') }));
|
|
467
|
+
lines.push(translator.t('spec_close.pulled_main_checkout', { value: result.pulled ? translator.t('common.yes') : translator.t('common.no') }));
|
|
464
468
|
}
|
|
465
469
|
|
|
466
470
|
return `${lines.join('\n')}\n`;
|
|
@@ -2,6 +2,7 @@ const fs = require('node:fs');
|
|
|
2
2
|
const path = require('node:path');
|
|
3
3
|
|
|
4
4
|
const { resolveTheme } = require('./cli/theme');
|
|
5
|
+
const { createTranslator } = require('./i18n/catalog');
|
|
5
6
|
|
|
6
7
|
const VERSION_SCHEMA_VERSION = 1;
|
|
7
8
|
const PACKAGE_ROOT = path.resolve(__dirname, '../../..');
|
|
@@ -108,9 +109,9 @@ function collectVersionReport(projectRoot = process.cwd(), options = {}) {
|
|
|
108
109
|
};
|
|
109
110
|
}
|
|
110
111
|
|
|
111
|
-
function formatPackageManager(packageManager) {
|
|
112
|
+
function formatPackageManager(packageManager, translator = createTranslator()) {
|
|
112
113
|
if (!packageManager?.name || packageManager.name === 'unknown') {
|
|
113
|
-
return 'unknown';
|
|
114
|
+
return translator.t('common.unknown');
|
|
114
115
|
}
|
|
115
116
|
return packageManager.version ? `${packageManager.name}@${packageManager.version}` : packageManager.name;
|
|
116
117
|
}
|
|
@@ -128,20 +129,21 @@ function quiverBanner(theme) {
|
|
|
128
129
|
}
|
|
129
130
|
|
|
130
131
|
function formatHumanVersionReport(report, options = {}) {
|
|
132
|
+
const translator = createTranslator(options.language);
|
|
131
133
|
const theme = resolveTheme({ noColor: options.noColor }, options.env || process.env, {
|
|
132
134
|
stdout: options.stdoutIsTTY ?? Boolean(process.stdout.isTTY),
|
|
133
135
|
});
|
|
134
136
|
const project = report.project?.name
|
|
135
|
-
? `${report.project.name}${report.project.quiver_initialized ?
|
|
136
|
-
: 'none';
|
|
137
|
+
? `${report.project.name}${report.project.quiver_initialized ? ` (${translator.t('version.project.quiver')})` : ''}`
|
|
138
|
+
: translator.t('common.none');
|
|
137
139
|
const lines = [
|
|
138
140
|
quiverBanner(theme),
|
|
139
141
|
'',
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
142
|
+
`${translator.t('version.label.cli')}: ${report.cli.version}`,
|
|
143
|
+
`${translator.t('version.label.node')}: ${report.runtime.node}`,
|
|
144
|
+
`${translator.t('version.label.package_manager')}: ${formatPackageManager(report.package_manager, translator)}`,
|
|
145
|
+
`${translator.t('version.label.os')}: ${report.runtime.platform} ${report.runtime.arch}`,
|
|
146
|
+
`${translator.t('version.label.project')}: ${project}`,
|
|
145
147
|
'',
|
|
146
148
|
];
|
|
147
149
|
|