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
|
@@ -35,6 +35,8 @@ const {
|
|
|
35
35
|
runSpecsList: runAiSpecsList,
|
|
36
36
|
runTraceReport: runAiTraceReport,
|
|
37
37
|
} = require('./commands/ai');
|
|
38
|
+
const { runChangelog } = require('./commands/changelog');
|
|
39
|
+
const { runConfig } = require('./commands/config');
|
|
38
40
|
const { runDashboard } = require('./commands/dashboard');
|
|
39
41
|
const { runDemo } = require('./commands/demo');
|
|
40
42
|
const { runPrepare } = require('./commands/prepare');
|
|
@@ -57,8 +59,27 @@ const { cleanupSlice, refreshActiveSlicesBoard, startSlice } = require('./lib/li
|
|
|
57
59
|
const { buildSpecStatus, closeSpecWorktree, formatSpecCloseResult, formatSpecStartResult, formatSpecStatus, startSpecWorktree } = require('./lib/spec-worktrees');
|
|
58
60
|
const { getContextPathExclusionReason } = require('./lib/ai/safety');
|
|
59
61
|
const { selectOption } = require('./lib/cli/selectors');
|
|
62
|
+
const {
|
|
63
|
+
SUPPORTED_AI_COMMANDS,
|
|
64
|
+
SUPPORTED_COMMAND_MODES,
|
|
65
|
+
SUPPORTED_CONFIG_LANGUAGE_COMMANDS,
|
|
66
|
+
SUPPORTED_CONFIG_SECTIONS,
|
|
67
|
+
SUPPORTED_DEMO_COMMANDS,
|
|
68
|
+
SUPPORTED_SPEC_COMMANDS,
|
|
69
|
+
} = require('./lib/cli/command-registry');
|
|
70
|
+
const { parseCliArgs } = require('./lib/cli/parser');
|
|
60
71
|
const { createUx } = require('./lib/cli/ux');
|
|
61
72
|
const { validateUxFlags } = require('./lib/cli/ux-flags');
|
|
73
|
+
const {
|
|
74
|
+
DEFAULT_LANGUAGE,
|
|
75
|
+
extractCliLanguageFlag,
|
|
76
|
+
normalizeLanguage,
|
|
77
|
+
readProjectLanguageConfig,
|
|
78
|
+
resolveLanguage,
|
|
79
|
+
writeProjectLanguageConfig,
|
|
80
|
+
} = require('./lib/i18n/language');
|
|
81
|
+
const { createTranslator, getCatalog, translate } = require('./lib/i18n/catalog');
|
|
82
|
+
const { formatWarningPrefix } = require('./lib/i18n/read-only-format');
|
|
62
83
|
const { relativePosixPath, resolveTargetRoot } = require('./lib/paths');
|
|
63
84
|
const {
|
|
64
85
|
CURRENT_SCAN_RELATIVE_PATH,
|
|
@@ -78,73 +99,102 @@ const {
|
|
|
78
99
|
const cliPackageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../..', 'package.json'), 'utf8'));
|
|
79
100
|
const CLI_VERSION = cliPackageJson.version || '0.0.0';
|
|
80
101
|
|
|
102
|
+
let currentErrorLanguage = DEFAULT_LANGUAGE;
|
|
103
|
+
|
|
104
|
+
function setCurrentErrorLanguage(language) {
|
|
105
|
+
currentErrorLanguage = language || DEFAULT_LANGUAGE;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function localizeParserMessage(message, language = currentErrorLanguage) {
|
|
109
|
+
const raw = String(message || '');
|
|
110
|
+
const missingValue = raw.match(/^missing value for (--[a-z0-9-]+)$/i);
|
|
111
|
+
if (missingValue) {
|
|
112
|
+
return translate(language, 'error.flag.missing_value', { flag: missingValue[1] });
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const invalidValue = raw.match(/^invalid value for (--[a-z0-9-]+)$/i);
|
|
116
|
+
if (invalidValue) {
|
|
117
|
+
return translate(language, 'error.flag.invalid_value', { flag: invalidValue[1] });
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const unknownFlag = raw.match(/^unknown flag: (.+)$/);
|
|
121
|
+
if (unknownFlag) {
|
|
122
|
+
return translate(language, 'error.flag.unknown', { flag: unknownFlag[1] });
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return raw;
|
|
126
|
+
}
|
|
127
|
+
|
|
81
128
|
function formatError(message) {
|
|
82
|
-
return `create-quiver: ${message}`;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const SUPPORTED_COMMAND_MODES = new Set([
|
|
86
|
-
'init',
|
|
87
|
-
'version',
|
|
88
|
-
'flow',
|
|
89
|
-
'dashboard',
|
|
90
|
-
'plan',
|
|
91
|
-
'graph',
|
|
92
|
-
'next',
|
|
93
|
-
'doctor',
|
|
94
|
-
'prepare',
|
|
95
|
-
'analyze',
|
|
96
|
-
'migrate',
|
|
97
|
-
'start-slice',
|
|
98
|
-
'check-slice',
|
|
99
|
-
'check-pr',
|
|
100
|
-
'check-handoff',
|
|
101
|
-
'new-handoff',
|
|
102
|
-
'cleanup-slice',
|
|
103
|
-
'check-scope',
|
|
104
|
-
'refresh-active-slices',
|
|
105
|
-
'spec',
|
|
106
|
-
'evidence',
|
|
107
|
-
'demo',
|
|
108
|
-
'ai',
|
|
109
|
-
]);
|
|
129
|
+
return `create-quiver: ${localizeParserMessage(message)}`;
|
|
130
|
+
}
|
|
110
131
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
'
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
'
|
|
122
|
-
|
|
123
|
-
'onboard',
|
|
124
|
-
'plan',
|
|
125
|
-
'prepare-context',
|
|
126
|
-
'pr',
|
|
127
|
-
'prompt-slice',
|
|
128
|
-
'repair-plan',
|
|
129
|
-
'review-plan',
|
|
130
|
-
'revise',
|
|
131
|
-
'resume',
|
|
132
|
-
'run',
|
|
133
|
-
'slices',
|
|
134
|
-
'specs',
|
|
135
|
-
'status',
|
|
136
|
-
'trace',
|
|
137
|
-
]);
|
|
132
|
+
function helpCatalog(language = DEFAULT_LANGUAGE) {
|
|
133
|
+
const catalog = getCatalog(language);
|
|
134
|
+
return catalog.messages['cli.help'] || getCatalog(DEFAULT_LANGUAGE).messages['cli.help'] || {};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function helpText(help, section, key, fallback) {
|
|
138
|
+
return help?.[section]?.[key] || fallback;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function optionDescription(help, fallback) {
|
|
142
|
+
return helpText(help, 'optionDescriptions', fallback, fallback);
|
|
143
|
+
}
|
|
138
144
|
|
|
139
|
-
|
|
140
|
-
|
|
145
|
+
function formatLanguageWarningForCli(warning, language = DEFAULT_LANGUAGE) {
|
|
146
|
+
if (!warning || warning.code !== 'UNSUPPORTED_LANGUAGE') {
|
|
147
|
+
return '';
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return formatError(translate(language, 'warning.language.unsupported_source', {
|
|
151
|
+
fallback: warning.fallbackLanguage,
|
|
152
|
+
language: warning.requestedLanguage,
|
|
153
|
+
source: warning.source,
|
|
154
|
+
supported: warning.supportedLanguages.join(', '),
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const SLICE_NAMESPACE_COMMANDS = Object.freeze({
|
|
159
|
+
start: 'start-slice',
|
|
160
|
+
check: 'check-slice',
|
|
161
|
+
pr: 'check-pr',
|
|
162
|
+
scope: 'check-scope',
|
|
163
|
+
cleanup: 'cleanup-slice',
|
|
164
|
+
'refresh-active': 'refresh-active-slices',
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
const HANDOFF_NAMESPACE_COMMANDS = Object.freeze({
|
|
168
|
+
check: 'check-handoff',
|
|
169
|
+
new: 'new-handoff',
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
const LEGACY_NAMESPACE_ALIASES = Object.freeze({
|
|
173
|
+
'start-slice': 'slice start',
|
|
174
|
+
'check-slice': 'slice check',
|
|
175
|
+
'check-pr': 'slice pr',
|
|
176
|
+
'check-scope': 'slice scope',
|
|
177
|
+
'cleanup-slice': 'slice cleanup',
|
|
178
|
+
'refresh-active-slices': 'slice refresh-active',
|
|
179
|
+
'check-handoff': 'handoff check',
|
|
180
|
+
'new-handoff': 'handoff new',
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
function legacyNamespaceAliasFor(mode) {
|
|
184
|
+
return LEGACY_NAMESPACE_ALIASES[mode] || '';
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function formatLegacyNamespaceWarning(mode, canonicalCommand) {
|
|
188
|
+
return `create-quiver: ${mode} is a legacy alias; use npx create-quiver ${canonicalCommand}.`;
|
|
189
|
+
}
|
|
141
190
|
|
|
142
191
|
function unsupportedCommandMessage(commandName) {
|
|
192
|
+
const translator = createTranslator(currentErrorLanguage);
|
|
143
193
|
return [
|
|
144
|
-
|
|
145
|
-
'
|
|
146
|
-
|
|
147
|
-
'
|
|
194
|
+
translator.t('error.command.unsupported', { commandName }),
|
|
195
|
+
translator.t('error.command.help'),
|
|
196
|
+
translator.t('error.command.init_hint', { commandName }),
|
|
197
|
+
translator.t('error.command.update_hint'),
|
|
148
198
|
].join('\n');
|
|
149
199
|
}
|
|
150
200
|
|
|
@@ -158,6 +208,8 @@ const COMMAND_HELP_GROUPS = [
|
|
|
158
208
|
['flow', 'Show the read-only guided workflow stage, blockers, and next safe command.'],
|
|
159
209
|
['dashboard', 'Show compact read-only project, spec, slice, run, approval, and agent status.'],
|
|
160
210
|
['version', 'Show a Quiver-branded version report; use --json for metadata.'],
|
|
211
|
+
['changelog', 'Show recent local CHANGELOG.md release entries; use --json for metadata.'],
|
|
212
|
+
['config language show|set', 'Inspect or update the effective Quiver language without editing JSON by hand.'],
|
|
161
213
|
['prepare', 'Run setup diagnostics for providers, GitHub, SSH, and project readiness.'],
|
|
162
214
|
['migrate', 'Upgrade an already initialized Quiver project to the current contract.'],
|
|
163
215
|
],
|
|
@@ -212,6 +264,8 @@ const COMMAND_HELP_GROUPS = [
|
|
|
212
264
|
['spec status', 'Show spec worktree, branch, slice-00 state, and pending slices.'],
|
|
213
265
|
['spec validate', 'Validate spec docs, slices, briefs, evidence, status, dependencies, and safe paths.'],
|
|
214
266
|
['spec close', 'Close a merged clean spec worktree and guide local sync.'],
|
|
267
|
+
['slice start|check|pr|scope|cleanup|refresh-active', 'Canonical namespace for slice lifecycle, validation, scope, and board commands.'],
|
|
268
|
+
['handoff check|new', 'Canonical namespace for validating or scaffolding handoff artifacts.'],
|
|
215
269
|
['start-slice', 'Start work on one slice and mark it active.'],
|
|
216
270
|
['check-slice', 'Validate slice structure, dependencies, scope, and readiness.'],
|
|
217
271
|
['check-pr', 'Validate PR readiness for a slice/spec workflow.'],
|
|
@@ -226,6 +280,8 @@ const COMMAND_HELP_GROUPS = [
|
|
|
226
280
|
title: 'Evidence and demos',
|
|
227
281
|
commands: [
|
|
228
282
|
['evidence run', 'Run a command and record exit code, duration, redacted output, and Markdown evidence.'],
|
|
283
|
+
['evidence list', 'List local evidence records; use --json for automation.'],
|
|
284
|
+
['evidence show', 'Show one local evidence record; use --json for automation.'],
|
|
229
285
|
['demo create spec-viewer', 'Create or preview the optional static Quiver Spec Viewer demo scaffold.'],
|
|
230
286
|
],
|
|
231
287
|
},
|
|
@@ -240,25 +296,30 @@ const COMMAND_HELP_GROUPS = [
|
|
|
240
296
|
},
|
|
241
297
|
];
|
|
242
298
|
|
|
243
|
-
function formatCommandHelpGroups() {
|
|
244
|
-
const
|
|
299
|
+
function formatCommandHelpGroups(language = DEFAULT_LANGUAGE) {
|
|
300
|
+
const help = helpCatalog(language);
|
|
301
|
+
const lines = [helpText(help, 'headings', 'commands', 'Commands:')];
|
|
245
302
|
for (const group of COMMAND_HELP_GROUPS) {
|
|
246
|
-
lines.push('', `${group.title}:`);
|
|
303
|
+
lines.push('', `${helpText(help, 'groupTitles', group.title, group.title)}:`);
|
|
247
304
|
for (const [command, description] of group.commands) {
|
|
248
|
-
lines.push(` ${command.padEnd(24)} ${description}`);
|
|
305
|
+
lines.push(` ${command.padEnd(24)} ${helpText(help, 'commandDescriptions', command, description)}`);
|
|
249
306
|
}
|
|
250
307
|
}
|
|
251
308
|
return lines.join('\n');
|
|
252
309
|
}
|
|
253
310
|
|
|
254
|
-
function printUsage() {
|
|
255
|
-
|
|
311
|
+
function printUsage(language = DEFAULT_LANGUAGE) {
|
|
312
|
+
const help = helpCatalog(language);
|
|
313
|
+
console.log(`${helpText(help, 'headings', 'usage', 'Usage:')}
|
|
256
314
|
npx create-quiver [options]
|
|
257
315
|
npx create-quiver init [options]
|
|
258
316
|
npx create-quiver analyze [options]
|
|
259
317
|
npx create-quiver flow [options]
|
|
260
318
|
npx create-quiver dashboard [options]
|
|
261
319
|
npx create-quiver version [--json]
|
|
320
|
+
npx create-quiver changelog [--json]
|
|
321
|
+
npx create-quiver config language show [--json]
|
|
322
|
+
npx create-quiver config language set <en|es> [--global]
|
|
262
323
|
npx create-quiver plan [options]
|
|
263
324
|
npx create-quiver ai <task> [options]
|
|
264
325
|
npx create-quiver ai run create --input <requirements.md>
|
|
@@ -294,62 +355,66 @@ function printUsage() {
|
|
|
294
355
|
npx create-quiver spec status <spec-dir>
|
|
295
356
|
npx create-quiver spec validate <spec-dir>
|
|
296
357
|
npx create-quiver spec close <spec-dir>
|
|
297
|
-
npx create-quiver
|
|
358
|
+
npx create-quiver slice <start|check|pr|scope|cleanup|refresh-active> [options]
|
|
359
|
+
npx create-quiver handoff <check|new> [options]
|
|
360
|
+
npx create-quiver evidence <run|list|show> [options]
|
|
298
361
|
npx create-quiver demo create spec-viewer [options]
|
|
299
362
|
|
|
300
|
-
${formatCommandHelpGroups()}
|
|
301
|
-
|
|
302
|
-
Options:
|
|
303
|
-
-n, --name <project-name> Project name to generate
|
|
304
|
-
-d, --dir <target-dir> Target directory to scaffold into or inspect
|
|
305
|
-
--spec <slug> Restrict plan, graph, next, or dashboard output to one spec
|
|
306
|
-
--format <name> Graph or AI export output format (tree, mermaid, dot, json, markdown)
|
|
307
|
-
--show-conflicts Show shared file paths in graph output
|
|
308
|
-
--level <n> Restrict graph output to one level
|
|
309
|
-
--json Emit machine-readable JSON
|
|
310
|
-
--
|
|
311
|
-
--
|
|
312
|
-
--
|
|
313
|
-
--
|
|
314
|
-
--
|
|
315
|
-
--
|
|
316
|
-
--
|
|
317
|
-
--
|
|
318
|
-
--
|
|
319
|
-
--
|
|
320
|
-
--
|
|
321
|
-
--
|
|
322
|
-
--
|
|
323
|
-
--
|
|
324
|
-
--
|
|
325
|
-
--
|
|
326
|
-
--
|
|
327
|
-
--
|
|
328
|
-
--
|
|
329
|
-
--
|
|
330
|
-
--
|
|
331
|
-
--
|
|
332
|
-
--
|
|
333
|
-
--
|
|
334
|
-
--
|
|
335
|
-
--
|
|
336
|
-
--
|
|
337
|
-
--
|
|
338
|
-
--
|
|
339
|
-
--
|
|
340
|
-
--
|
|
341
|
-
--
|
|
342
|
-
--
|
|
343
|
-
--
|
|
344
|
-
--
|
|
345
|
-
--
|
|
346
|
-
--
|
|
347
|
-
--
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
-
|
|
351
|
-
|
|
352
|
-
|
|
363
|
+
${formatCommandHelpGroups(language)}
|
|
364
|
+
|
|
365
|
+
${helpText(help, 'headings', 'options', 'Options:')}
|
|
366
|
+
-n, --name <project-name> ${optionDescription(help, 'Project name to generate')}
|
|
367
|
+
-d, --dir <target-dir> ${optionDescription(help, 'Target directory to scaffold into or inspect')}
|
|
368
|
+
--spec <slug> ${optionDescription(help, 'Restrict plan, graph, next, or dashboard output to one spec')}
|
|
369
|
+
--format <name> ${optionDescription(help, 'Graph or AI export output format (tree, mermaid, dot, json, markdown)')}
|
|
370
|
+
--show-conflicts ${optionDescription(help, 'Show shared file paths in graph output')}
|
|
371
|
+
--level <n> ${optionDescription(help, 'Restrict graph output to one level')}
|
|
372
|
+
--json ${optionDescription(help, 'Emit machine-readable JSON')}
|
|
373
|
+
--lang <en|es> ${optionDescription(help, 'Override CLI human output language')}
|
|
374
|
+
--global ${optionDescription(help, 'For config language set, write the global user config')}
|
|
375
|
+
--include-completed ${optionDescription(help, 'Include completed slices in dashboard, plan, graph, or next history output')}
|
|
376
|
+
--details ${optionDescription(help, 'Show the full human dashboard report')}
|
|
377
|
+
--section <name> ${optionDescription(help, 'Show one human dashboard section')}
|
|
378
|
+
--limit <n> ${optionDescription(help, 'Limit dashboard human lists (1-100)')}
|
|
379
|
+
--only-ready ${optionDescription(help, 'Show only slices with no pending dependencies')}
|
|
380
|
+
--all-ready ${optionDescription(help, 'List every ready slice returned by next')}
|
|
381
|
+
--auto-start ${optionDescription(help, 'Prompt for confirmation and run start-slice on next')}
|
|
382
|
+
--local ${optionDescription(help, 'For check-slice, run structural validation without remote/base checks')}
|
|
383
|
+
--strict ${optionDescription(help, 'Treat supported validation warnings as failures')}
|
|
384
|
+
--unicode ${optionDescription(help, 'Prefer Unicode output when supported')}
|
|
385
|
+
--minimal ${optionDescription(help, 'Plan or run the minimal init profile')}
|
|
386
|
+
--full ${optionDescription(help, 'Plan or run the full compatibility init profile')}
|
|
387
|
+
--legacy-scripts ${optionDescription(help, 'Include legacy Bash wrappers in init profile')}
|
|
388
|
+
--include-templates ${optionDescription(help, 'Export packaged templates in init profile')}
|
|
389
|
+
--dry-run ${optionDescription(help, 'Preview init, analyze, migrate, prepare, spec create/start/close, demo, ai agent set, or AI work without executing writes/providers')}
|
|
390
|
+
--print-prompt ${optionDescription(help, 'Print the exact AI prompt and exit without executing provider CLIs')}
|
|
391
|
+
--with-planner ${optionDescription(help, 'Enable planner-assisted behavior on commands that explicitly support it')}
|
|
392
|
+
--interactive ${optionDescription(help, 'Enable prompts on commands that explicitly support interactive choices')}
|
|
393
|
+
--review ${optionDescription(help, 'Open or prepare human review before persistent writes where supported')}
|
|
394
|
+
--methodology <name> ${optionDescription(help, 'Select methodology where supported (currently wdd-sdd)')}
|
|
395
|
+
--no-color ${optionDescription(help, 'Disable ANSI colors in human output')}
|
|
396
|
+
--fix ${optionDescription(help, 'For doctor, apply safe non-destructive repairs')}
|
|
397
|
+
--execute ${optionDescription(help, 'For ai execute-plan, run the planned slices instead of printing commands')}
|
|
398
|
+
--create ${optionDescription(help, 'For ai pr, create the PR after preflight instead of printing the plan only')}
|
|
399
|
+
--commit ${optionDescription(help, 'For ai execute-slice, commit validated slice changes after provider, scope, and tests pass')}
|
|
400
|
+
--allow-dirty ${optionDescription(help, 'For ai execute-slice, allow pre-existing dirty files and ignore them for scope diff')}
|
|
401
|
+
--mode <name> ${optionDescription(help, 'Execution mode for ai execute-plan (auto, manual, delegated)')}
|
|
402
|
+
--provider <name> ${optionDescription(help, 'Provider CLI to preflight for prepare or AI commands')}
|
|
403
|
+
--model <model-id> ${optionDescription(help, 'Technical model id for AI agent profiles or provider-backed AI commands')}
|
|
404
|
+
--version <n> ${optionDescription(help, 'Draft version to approve for AI planner phases')}
|
|
405
|
+
--run <id> ${optionDescription(help, 'AI lifecycle run id')}
|
|
406
|
+
--ssh-host-alias <name> ${optionDescription(help, 'SSH host alias to validate for prepare or AI commands')}
|
|
407
|
+
--identity-file <path> ${optionDescription(help, 'SSH identity file to validate for prepare or AI commands')}
|
|
408
|
+
--remote <name> ${optionDescription(help, 'Git remote name for check-slice or AI PR checks')}
|
|
409
|
+
--base <branch> ${optionDescription(help, 'Base branch override for check-slice, check-scope, check-pr, ai pr, spec start, or spec close')}
|
|
410
|
+
--output <file> ${optionDescription(help, 'Output file for evidence run')}
|
|
411
|
+
--max-output <n> ${optionDescription(help, 'Maximum stdout/stderr chars per evidence section')}
|
|
412
|
+
--title <text> ${optionDescription(help, 'Override PR title for ai pr create')}
|
|
413
|
+
-y, --yes ${optionDescription(help, 'Skip prompts and confirm write prompts such as migrate')}
|
|
414
|
+
-V, --version ${optionDescription(help, 'Show the installed create-quiver version')}
|
|
415
|
+
-h, --help ${optionDescription(help, 'Show this help message')}
|
|
416
|
+
|
|
417
|
+
${helpText(help, 'headings', 'examples', 'Examples:')}
|
|
353
418
|
npx create-quiver init --name "My Project"
|
|
354
419
|
npx create-quiver init --interactive
|
|
355
420
|
npx create-quiver init --name "My Project" --dry-run
|
|
@@ -361,6 +426,11 @@ Examples:
|
|
|
361
426
|
cd ./my-project && npx create-quiver dashboard --json
|
|
362
427
|
cd ./my-project && npx create-quiver version
|
|
363
428
|
cd ./my-project && npx create-quiver version --json
|
|
429
|
+
cd ./my-project && npx create-quiver changelog
|
|
430
|
+
cd ./my-project && npx create-quiver changelog --json
|
|
431
|
+
cd ./my-project && npx create-quiver config language show
|
|
432
|
+
cd ./my-project && npx create-quiver config language set es
|
|
433
|
+
npx create-quiver config language set en --global
|
|
364
434
|
cd ./my-project && npx create-quiver analyze
|
|
365
435
|
cd ./my-project && npx create-quiver plan --json
|
|
366
436
|
cd ./my-project && npx create-quiver ai onboard --dry-run
|
|
@@ -422,13 +492,15 @@ Examples:
|
|
|
422
492
|
cd ./my-project && npx create-quiver spec status specs/my-project
|
|
423
493
|
cd ./my-project && npx create-quiver spec validate specs/my-project
|
|
424
494
|
cd ./my-project && npx create-quiver spec close specs/my-project --dry-run
|
|
495
|
+
cd ./my-project && npx create-quiver slice check --local specs/my-project/slices/slice-01/slice.json
|
|
496
|
+
cd ./my-project && npx create-quiver handoff check specs/my-project/slices/slice-01/EXECUTION_BRIEF.md
|
|
425
497
|
cd ./my-project && npx create-quiver evidence run -- npm test
|
|
426
498
|
cd ./my-project && npx create-quiver demo create spec-viewer --dry-run
|
|
427
499
|
node bin/create-quiver.js doctor --dir ./my-project
|
|
428
500
|
`);
|
|
429
501
|
}
|
|
430
502
|
|
|
431
|
-
function parseArgs(argv) {
|
|
503
|
+
function parseArgs(argv, options = {}) {
|
|
432
504
|
const result = {
|
|
433
505
|
help: false,
|
|
434
506
|
force: false,
|
|
@@ -448,8 +520,14 @@ function parseArgs(argv) {
|
|
|
448
520
|
strict: false,
|
|
449
521
|
strictOverlap: false,
|
|
450
522
|
json: false,
|
|
523
|
+
language: options.language || '',
|
|
524
|
+
languageResolution: null,
|
|
451
525
|
noColor: false,
|
|
452
526
|
withPlanner: false,
|
|
527
|
+
configGlobal: false,
|
|
528
|
+
configSection: '',
|
|
529
|
+
configCommand: '',
|
|
530
|
+
configValue: '',
|
|
453
531
|
interactive: false,
|
|
454
532
|
review: false,
|
|
455
533
|
includeCompleted: false,
|
|
@@ -501,22 +579,33 @@ function parseArgs(argv) {
|
|
|
501
579
|
initLegacyScripts: false,
|
|
502
580
|
initMinimal: false,
|
|
503
581
|
specCommand: '',
|
|
582
|
+
sliceCommand: '',
|
|
583
|
+
handoffCommand: '',
|
|
584
|
+
legacyAliasCommand: '',
|
|
504
585
|
demoCommand: '',
|
|
505
586
|
demoName: '',
|
|
506
587
|
evidenceCommand: '',
|
|
507
588
|
evidenceArgs: [],
|
|
508
589
|
evidenceOutput: '',
|
|
509
590
|
evidenceMaxOutput: null,
|
|
591
|
+
evidenceTarget: '',
|
|
510
592
|
};
|
|
511
593
|
|
|
512
594
|
const args = [...argv];
|
|
513
595
|
if (SUPPORTED_COMMAND_MODES.has(args[0])) {
|
|
514
596
|
result.mode = args[0];
|
|
597
|
+
result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
|
|
515
598
|
result.explicitInit = args[0] === 'init';
|
|
516
599
|
args.shift();
|
|
517
600
|
if (result.mode === 'spec') {
|
|
518
601
|
result.specCommand = args.shift() || '';
|
|
519
602
|
}
|
|
603
|
+
if (result.mode === 'slice') {
|
|
604
|
+
result.sliceCommand = args.shift() || '';
|
|
605
|
+
}
|
|
606
|
+
if (result.mode === 'handoff') {
|
|
607
|
+
result.handoffCommand = args.shift() || '';
|
|
608
|
+
}
|
|
520
609
|
if (result.mode === 'evidence') {
|
|
521
610
|
result.evidenceCommand = args.shift() || '';
|
|
522
611
|
}
|
|
@@ -535,9 +624,11 @@ function parseArgs(argv) {
|
|
|
535
624
|
args.shift();
|
|
536
625
|
} else if (args[0] === '--check-handoff') {
|
|
537
626
|
result.mode = 'check-handoff';
|
|
627
|
+
result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
|
|
538
628
|
args.shift();
|
|
539
629
|
} else if (args[0] === '--new-handoff') {
|
|
540
630
|
result.mode = 'new-handoff';
|
|
631
|
+
result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
|
|
541
632
|
args.shift();
|
|
542
633
|
} else if (args[0] && !args[0].startsWith('-')) {
|
|
543
634
|
throw new Error(formatError(unsupportedCommandMessage(args[0])));
|
|
@@ -588,11 +679,13 @@ function parseArgs(argv) {
|
|
|
588
679
|
|
|
589
680
|
if (arg === '--check-handoff') {
|
|
590
681
|
result.mode = 'check-handoff';
|
|
682
|
+
result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
|
|
591
683
|
continue;
|
|
592
684
|
}
|
|
593
685
|
|
|
594
686
|
if (arg === '--new-handoff') {
|
|
595
687
|
result.mode = 'new-handoff';
|
|
688
|
+
result.legacyAliasCommand = legacyNamespaceAliasFor(result.mode);
|
|
596
689
|
continue;
|
|
597
690
|
}
|
|
598
691
|
|
|
@@ -700,6 +793,11 @@ function parseArgs(argv) {
|
|
|
700
793
|
continue;
|
|
701
794
|
}
|
|
702
795
|
|
|
796
|
+
if (arg === '--global') {
|
|
797
|
+
result.configGlobal = true;
|
|
798
|
+
continue;
|
|
799
|
+
}
|
|
800
|
+
|
|
703
801
|
if (arg === '--with-planner') {
|
|
704
802
|
result.withPlanner = true;
|
|
705
803
|
continue;
|
|
@@ -1104,6 +1202,32 @@ function parseArgs(argv) {
|
|
|
1104
1202
|
if (positional.length > 0) {
|
|
1105
1203
|
throw new Error(formatError('dashboard does not accept positional arguments; use --spec <slug>'));
|
|
1106
1204
|
}
|
|
1205
|
+
} else if (result.mode === 'config') {
|
|
1206
|
+
if (!result.configSection && positional.length > 0) {
|
|
1207
|
+
result.configSection = positional.shift();
|
|
1208
|
+
}
|
|
1209
|
+
if (!SUPPORTED_CONFIG_SECTIONS.has(result.configSection)) {
|
|
1210
|
+
throw new Error(formatError(translate(currentErrorLanguage, 'config.error.unsupported_section', {
|
|
1211
|
+
section: result.configSection || '(missing)',
|
|
1212
|
+
})));
|
|
1213
|
+
}
|
|
1214
|
+
if (!result.configCommand && positional.length > 0) {
|
|
1215
|
+
result.configCommand = positional.shift();
|
|
1216
|
+
}
|
|
1217
|
+
if (!SUPPORTED_CONFIG_LANGUAGE_COMMANDS.has(result.configCommand)) {
|
|
1218
|
+
throw new Error(formatError(translate(currentErrorLanguage, 'config.error.unsupported_language_command', {
|
|
1219
|
+
command: result.configCommand || '(missing)',
|
|
1220
|
+
})));
|
|
1221
|
+
}
|
|
1222
|
+
if (result.configCommand === 'set') {
|
|
1223
|
+
if (positional.length === 0) {
|
|
1224
|
+
throw new Error(formatError('missing language for config language set. Use: npx create-quiver config language set <en|es>'));
|
|
1225
|
+
}
|
|
1226
|
+
result.configValue = positional.shift();
|
|
1227
|
+
}
|
|
1228
|
+
if (result.configCommand === 'show' && positional.length > 0) {
|
|
1229
|
+
throw new Error(formatError('config language show does not accept a language value'));
|
|
1230
|
+
}
|
|
1107
1231
|
} else if (result.mode === 'ai') {
|
|
1108
1232
|
if (!result.aiCommand && positional.length > 0) {
|
|
1109
1233
|
result.aiCommand = positional.shift();
|
|
@@ -1142,6 +1266,38 @@ function parseArgs(argv) {
|
|
|
1142
1266
|
if (positional.length > 0) {
|
|
1143
1267
|
throw new Error(formatError('refresh-active-slices does not accept positional arguments'));
|
|
1144
1268
|
}
|
|
1269
|
+
} else if (result.mode === 'slice') {
|
|
1270
|
+
if (!result.sliceCommand && positional.length > 0) {
|
|
1271
|
+
result.sliceCommand = positional.shift();
|
|
1272
|
+
}
|
|
1273
|
+
const mappedMode = SLICE_NAMESPACE_COMMANDS[result.sliceCommand];
|
|
1274
|
+
if (!mappedMode) {
|
|
1275
|
+
throw new Error(formatError(`unsupported slice subcommand: ${result.sliceCommand || '(missing)'}. Supported tasks: start, check, pr, scope, cleanup, refresh-active`));
|
|
1276
|
+
}
|
|
1277
|
+
result.mode = mappedMode;
|
|
1278
|
+
if (mappedMode === 'refresh-active-slices') {
|
|
1279
|
+
if (positional.length > 0) {
|
|
1280
|
+
throw new Error(formatError('slice refresh-active does not accept positional arguments'));
|
|
1281
|
+
}
|
|
1282
|
+
} else {
|
|
1283
|
+
result.targetDir = positional.shift() || '';
|
|
1284
|
+
if (!result.targetDir) {
|
|
1285
|
+
throw new Error(formatError(`slice ${result.sliceCommand} requires a slice.json path`));
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
} else if (result.mode === 'handoff') {
|
|
1289
|
+
if (!result.handoffCommand && positional.length > 0) {
|
|
1290
|
+
result.handoffCommand = positional.shift();
|
|
1291
|
+
}
|
|
1292
|
+
const mappedMode = HANDOFF_NAMESPACE_COMMANDS[result.handoffCommand];
|
|
1293
|
+
if (!mappedMode) {
|
|
1294
|
+
throw new Error(formatError(`unsupported handoff subcommand: ${result.handoffCommand || '(missing)'}. Supported tasks: check, new`));
|
|
1295
|
+
}
|
|
1296
|
+
result.mode = mappedMode;
|
|
1297
|
+
result.targetDir = positional.shift() || '';
|
|
1298
|
+
if (!result.targetDir) {
|
|
1299
|
+
throw new Error(formatError(`handoff ${result.handoffCommand} requires ${result.handoffCommand === 'new' ? 'a spec slug' : 'a handoff or brief path'}`));
|
|
1300
|
+
}
|
|
1145
1301
|
} else if (result.mode === 'spec') {
|
|
1146
1302
|
if (!result.specCommand && positional.length > 0) {
|
|
1147
1303
|
result.specCommand = positional.shift();
|
|
@@ -1160,14 +1316,26 @@ function parseArgs(argv) {
|
|
|
1160
1316
|
result.evidenceCommand = positional.shift();
|
|
1161
1317
|
}
|
|
1162
1318
|
if (!result.evidenceCommand) {
|
|
1163
|
-
throw new Error(formatError('missing evidence subcommand. Use: npx create-quiver evidence run
|
|
1319
|
+
throw new Error(formatError('missing evidence subcommand. Use: npx create-quiver evidence <run|list|show>'));
|
|
1164
1320
|
}
|
|
1165
|
-
if (
|
|
1166
|
-
throw new Error(formatError(`unsupported evidence subcommand: ${result.evidenceCommand}. Supported tasks: run`));
|
|
1321
|
+
if (!['run', 'list', 'show'].includes(result.evidenceCommand)) {
|
|
1322
|
+
throw new Error(formatError(`unsupported evidence subcommand: ${result.evidenceCommand}. Supported tasks: run, list, show`));
|
|
1167
1323
|
}
|
|
1168
|
-
if (positional.length > 0) {
|
|
1324
|
+
if (result.evidenceCommand === 'run' && positional.length > 0) {
|
|
1169
1325
|
throw new Error(formatError('evidence run does not accept positional arguments before --'));
|
|
1170
1326
|
}
|
|
1327
|
+
if (result.evidenceCommand === 'list' && positional.length > 0) {
|
|
1328
|
+
throw new Error(formatError('evidence list does not accept positional arguments'));
|
|
1329
|
+
}
|
|
1330
|
+
if (result.evidenceCommand === 'show') {
|
|
1331
|
+
result.evidenceTarget = positional.shift() || '';
|
|
1332
|
+
if (!result.evidenceTarget) {
|
|
1333
|
+
throw new Error(formatError('evidence show requires an evidence file path'));
|
|
1334
|
+
}
|
|
1335
|
+
if (positional.length > 0) {
|
|
1336
|
+
throw new Error(formatError('evidence show accepts exactly one evidence file path'));
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1171
1339
|
} else if (result.mode === 'demo') {
|
|
1172
1340
|
if (!result.demoCommand && positional.length > 0) {
|
|
1173
1341
|
result.demoCommand = positional.shift();
|
|
@@ -1205,6 +1373,14 @@ function parseArgs(argv) {
|
|
|
1205
1373
|
throw new Error(formatError(`${requestedDashboardFlags.join(', ')} ${requestedDashboardFlags.length === 1 ? 'is' : 'are'} only supported by dashboard. Use: npx create-quiver dashboard ${requestedDashboardFlags[0]}${requestedDashboardFlags[0] === '--section' ? ' <name>' : requestedDashboardFlags[0] === '--limit' ? ' <n>' : ''}`));
|
|
1206
1374
|
}
|
|
1207
1375
|
|
|
1376
|
+
if (result.mode !== 'config' && result.configGlobal) {
|
|
1377
|
+
throw new Error(formatError('--global is only supported by config language set. Use: npx create-quiver config language set <en|es> --global'));
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
if (result.mode === 'config' && result.configGlobal && result.configCommand !== 'set') {
|
|
1381
|
+
throw new Error(formatError('--global is only supported by config language set. Use: npx create-quiver config language set <en|es> --global'));
|
|
1382
|
+
}
|
|
1383
|
+
|
|
1208
1384
|
return result;
|
|
1209
1385
|
}
|
|
1210
1386
|
|
|
@@ -1349,6 +1525,7 @@ function runInitDocs(repoRoot, projectName, options = {}) {
|
|
|
1349
1525
|
migrateMode: false,
|
|
1350
1526
|
profile: options.profile || 'default',
|
|
1351
1527
|
templateRoot: templateRoot.path,
|
|
1528
|
+
language: options.language || '',
|
|
1352
1529
|
});
|
|
1353
1530
|
}
|
|
1354
1531
|
|
|
@@ -2202,24 +2379,56 @@ function writeProjectScanArtifacts(projectRoot, scan) {
|
|
|
2202
2379
|
return { jsonPath, mdPath: scanPaths.projectMapPath };
|
|
2203
2380
|
}
|
|
2204
2381
|
|
|
2205
|
-
function
|
|
2382
|
+
function createCommandProgressUx(options = {}) {
|
|
2383
|
+
return createUx({
|
|
2384
|
+
env: options.env || process.env,
|
|
2385
|
+
error: options.error,
|
|
2386
|
+
input: options.input,
|
|
2387
|
+
interactive: false,
|
|
2388
|
+
json: options.json,
|
|
2389
|
+
noColor: options.noColor,
|
|
2390
|
+
output: options.output,
|
|
2391
|
+
prompts: options.prompts,
|
|
2392
|
+
spinner: options.noColor === true ? false : options.spinner,
|
|
2393
|
+
stderrIsTTY: options.stderrIsTTY,
|
|
2394
|
+
stdinIsTTY: options.stdinIsTTY,
|
|
2395
|
+
stdoutIsTTY: options.stdoutIsTTY,
|
|
2396
|
+
write: options.write,
|
|
2397
|
+
});
|
|
2398
|
+
}
|
|
2399
|
+
|
|
2400
|
+
async function runProgress(ux, message, task, successMessage = message) {
|
|
2401
|
+
return ux.withSpinner(message, task, {
|
|
2402
|
+
echo: false,
|
|
2403
|
+
successMessage,
|
|
2404
|
+
});
|
|
2405
|
+
}
|
|
2406
|
+
|
|
2407
|
+
async function runAnalyze(targetDir, options = {}) {
|
|
2206
2408
|
const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
|
|
2409
|
+
const translator = createTranslator(options.language);
|
|
2410
|
+
const progress = createCommandProgressUx(options);
|
|
2207
2411
|
|
|
2208
2412
|
if (!fs.existsSync(projectRoot)) {
|
|
2209
2413
|
throw new Error(formatError(`target directory does not exist: ${projectRoot}`));
|
|
2210
2414
|
}
|
|
2211
2415
|
|
|
2212
|
-
const scan =
|
|
2416
|
+
const scan = await runProgress(
|
|
2417
|
+
progress,
|
|
2418
|
+
translator.t('analyze.progress.scanning'),
|
|
2419
|
+
() => buildProjectScan(projectRoot),
|
|
2420
|
+
translator.t('analyze.progress.scanned'),
|
|
2421
|
+
);
|
|
2213
2422
|
|
|
2214
2423
|
if (options.dryRun) {
|
|
2215
|
-
console.log(
|
|
2216
|
-
console.log('
|
|
2217
|
-
console.log(
|
|
2218
|
-
console.log(
|
|
2219
|
-
console.log('
|
|
2220
|
-
console.log(
|
|
2221
|
-
console.log(
|
|
2222
|
-
console.log(
|
|
2424
|
+
console.log(translator.t('analyze.dry_run_for', { path: projectRoot }));
|
|
2425
|
+
console.log(translator.t('analyze.writes_none'));
|
|
2426
|
+
console.log(translator.t('analyze.would_write', { path: CURRENT_SCAN_RELATIVE_PATH }));
|
|
2427
|
+
console.log(translator.t('analyze.would_write', { path: PROJECT_MAP_RELATIVE_PATH }));
|
|
2428
|
+
console.log(translator.t('analyze.would_refresh', { path: 'docs/AI_CONTEXT.md' }));
|
|
2429
|
+
console.log(translator.t('analyze.detected_primary_stack', { stack: scan.stack.primary }));
|
|
2430
|
+
console.log(translator.t('analyze.detected_frameworks', { frameworks: scan.stack.frameworks.length > 0 ? scan.stack.frameworks.join(', ') : translator.t('common.none_detected') }));
|
|
2431
|
+
console.log(translator.t('analyze.detected_package_manager', { manager: scan.project.package_manager }));
|
|
2223
2432
|
return {
|
|
2224
2433
|
artifacts: {
|
|
2225
2434
|
jsonPath: path.join(projectRoot, CURRENT_SCAN_RELATIVE_PATH),
|
|
@@ -2230,16 +2439,31 @@ function runAnalyze(targetDir, options = {}) {
|
|
|
2230
2439
|
};
|
|
2231
2440
|
}
|
|
2232
2441
|
|
|
2233
|
-
const artifacts =
|
|
2234
|
-
|
|
2235
|
-
|
|
2442
|
+
const artifacts = await runProgress(
|
|
2443
|
+
progress,
|
|
2444
|
+
translator.t('analyze.progress.writing_artifacts'),
|
|
2445
|
+
() => writeProjectScanArtifacts(projectRoot, scan),
|
|
2446
|
+
translator.t('analyze.progress.artifacts_written'),
|
|
2447
|
+
);
|
|
2448
|
+
const aiContextPath = await runProgress(
|
|
2449
|
+
progress,
|
|
2450
|
+
translator.t('analyze.progress.refreshing_context'),
|
|
2451
|
+
() => refreshAiContextDoc(projectRoot, scan),
|
|
2452
|
+
translator.t('analyze.progress.context_refreshed'),
|
|
2453
|
+
);
|
|
2454
|
+
await runProgress(
|
|
2455
|
+
progress,
|
|
2456
|
+
translator.t('analyze.progress.updating_state'),
|
|
2457
|
+
() => updateStateForAnalyze(projectRoot, CLI_VERSION),
|
|
2458
|
+
translator.t('analyze.progress.state_updated'),
|
|
2459
|
+
);
|
|
2236
2460
|
|
|
2237
|
-
console.log(
|
|
2238
|
-
console.log(
|
|
2239
|
-
console.log(
|
|
2240
|
-
console.log(
|
|
2241
|
-
console.log(
|
|
2242
|
-
console.log(
|
|
2461
|
+
console.log(translator.t('analyze.completed_for', { path: projectRoot }));
|
|
2462
|
+
console.log(translator.t('analyze.wrote', { path: relativePosixPath(projectRoot, artifacts.jsonPath) }));
|
|
2463
|
+
console.log(translator.t('analyze.wrote', { path: relativePosixPath(projectRoot, artifacts.mdPath) }));
|
|
2464
|
+
console.log(translator.t('analyze.wrote', { path: relativePosixPath(projectRoot, aiContextPath) }));
|
|
2465
|
+
console.log(translator.t('analyze.detected_primary_stack', { stack: scan.stack.primary }));
|
|
2466
|
+
console.log(translator.t('analyze.detected_package_manager', { manager: scan.project.package_manager }));
|
|
2243
2467
|
|
|
2244
2468
|
return {
|
|
2245
2469
|
artifacts,
|
|
@@ -2249,8 +2473,41 @@ function runAnalyze(targetDir, options = {}) {
|
|
|
2249
2473
|
};
|
|
2250
2474
|
}
|
|
2251
2475
|
|
|
2252
|
-
function
|
|
2476
|
+
async function confirmMigrateWrite(projectRoot, options, translator) {
|
|
2477
|
+
if (options.force === true) {
|
|
2478
|
+
return;
|
|
2479
|
+
}
|
|
2480
|
+
|
|
2481
|
+
const ux = createUx({
|
|
2482
|
+
env: options.env,
|
|
2483
|
+
error: options.error,
|
|
2484
|
+
input: options.input,
|
|
2485
|
+
interactive: true,
|
|
2486
|
+
json: options.json,
|
|
2487
|
+
noColor: options.noColor,
|
|
2488
|
+
output: options.output,
|
|
2489
|
+
promptConfirm: options.promptConfirm,
|
|
2490
|
+
stderrIsTTY: options.stderrIsTTY,
|
|
2491
|
+
stdinIsTTY: options.stdinIsTTY,
|
|
2492
|
+
stdoutIsTTY: options.stdoutIsTTY,
|
|
2493
|
+
write: options.write,
|
|
2494
|
+
});
|
|
2495
|
+
|
|
2496
|
+
if (!ux.mode.usePrompts) {
|
|
2497
|
+
throw new Error(formatError(translator.t('migrate.confirm.required')));
|
|
2498
|
+
}
|
|
2499
|
+
|
|
2500
|
+
const confirmed = await ux.promptConfirm(translator.t('migrate.confirm.prompt', { path: projectRoot }), {
|
|
2501
|
+
initialValue: false,
|
|
2502
|
+
});
|
|
2503
|
+
if (!confirmed) {
|
|
2504
|
+
throw new Error(formatError(translator.t('migrate.confirm.declined')));
|
|
2505
|
+
}
|
|
2506
|
+
}
|
|
2507
|
+
|
|
2508
|
+
async function runMigrate(targetDir, options = {}) {
|
|
2253
2509
|
const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
|
|
2510
|
+
const translator = createTranslator(options.language);
|
|
2254
2511
|
|
|
2255
2512
|
if (!fs.existsSync(projectRoot)) {
|
|
2256
2513
|
throw new Error(formatError(`target directory does not exist: ${projectRoot}`));
|
|
@@ -2273,22 +2530,24 @@ function runMigrate(targetDir, options = {}) {
|
|
|
2273
2530
|
projectName,
|
|
2274
2531
|
skipInstall: options.skipInstall === true,
|
|
2275
2532
|
});
|
|
2276
|
-
console.log('
|
|
2277
|
-
console.log(`-
|
|
2278
|
-
console.log(`-
|
|
2279
|
-
console.log(
|
|
2280
|
-
console.log(`-
|
|
2281
|
-
console.log(`-
|
|
2282
|
-
console.log(`-
|
|
2533
|
+
console.log(translator.t('migrate.dry_run_title'));
|
|
2534
|
+
console.log(`- ${translator.t('migrate.project', { project: projectName })}`);
|
|
2535
|
+
console.log(`- ${translator.t('migrate.target', { path: projectRoot })}`);
|
|
2536
|
+
console.log(`- ${translator.t('migrate.writes_none')}`);
|
|
2537
|
+
console.log(`- ${translator.t('migrate.planned_create', { count: migrationPlan.summary.create })}`);
|
|
2538
|
+
console.log(`- ${translator.t('migrate.planned_update', { count: migrationPlan.summary.update })}`);
|
|
2539
|
+
console.log(`- ${translator.t('migrate.planned_preserve', { count: migrationPlan.summary.preserve })}`);
|
|
2283
2540
|
if (legacyLayout.hasLegacyLayout) {
|
|
2284
|
-
console.log(`-
|
|
2541
|
+
console.log(`- ${translator.t('migrate.legacy_preserved', { paths: legacyLayout.legacyPaths.join(', ') })}`);
|
|
2285
2542
|
}
|
|
2286
|
-
console.log('
|
|
2543
|
+
console.log(`- ${translator.t('migrate.next_command', { command: 'npx create-quiver migrate --skip-install' })}`);
|
|
2287
2544
|
console.log('');
|
|
2288
2545
|
console.log(formatInitLayoutPlan(migrationPlan));
|
|
2289
2546
|
return;
|
|
2290
2547
|
}
|
|
2291
2548
|
|
|
2549
|
+
await confirmMigrateWrite(projectRoot, options, translator);
|
|
2550
|
+
|
|
2292
2551
|
const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'quiver-migrate-'));
|
|
2293
2552
|
|
|
2294
2553
|
try {
|
|
@@ -2314,10 +2573,10 @@ function runMigrate(targetDir, options = {}) {
|
|
|
2314
2573
|
}
|
|
2315
2574
|
}
|
|
2316
2575
|
|
|
2317
|
-
console.log(
|
|
2318
|
-
console.log('
|
|
2576
|
+
console.log(translator.t('migrate.completed_for', { path: projectRoot }));
|
|
2577
|
+
console.log(translator.t('migrate.restored_missing'));
|
|
2319
2578
|
if (legacyLayout.hasLegacyLayout) {
|
|
2320
|
-
console.log(
|
|
2579
|
+
console.log(translator.t('migrate.legacy_preserved', { paths: legacyLayout.legacyPaths.join(', ') }));
|
|
2321
2580
|
}
|
|
2322
2581
|
} finally {
|
|
2323
2582
|
fs.rmSync(tempRoot, { recursive: true, force: true });
|
|
@@ -2558,6 +2817,7 @@ function buildDoctorCommandReport(projectRoot) {
|
|
|
2558
2817
|
}
|
|
2559
2818
|
|
|
2560
2819
|
function formatDoctorHumanReport(report, options = {}) {
|
|
2820
|
+
const translator = createTranslator(options.language);
|
|
2561
2821
|
const lines = [];
|
|
2562
2822
|
const ux = createUx({
|
|
2563
2823
|
...options,
|
|
@@ -2574,19 +2834,39 @@ function formatDoctorHumanReport(report, options = {}) {
|
|
|
2574
2834
|
if (status === 'error') return 'error';
|
|
2575
2835
|
return 'warning';
|
|
2576
2836
|
};
|
|
2837
|
+
const localizeDoctorText = (message) => {
|
|
2838
|
+
const text = String(message || '');
|
|
2839
|
+
let match = text.match(/^Quiver doctor passed for (.+)$/);
|
|
2840
|
+
if (match) return translator.t('doctor.check.passed_for', { path: match[1] });
|
|
2841
|
+
match = text.match(/^Layout: (.+)$/);
|
|
2842
|
+
if (match) return translator.t('doctor.check.layout', { layout: match[1] });
|
|
2843
|
+
if (text === 'Specs: none yet') return translator.t('doctor.check.specs_none');
|
|
2844
|
+
match = text.match(/^Specs: (.+)$/);
|
|
2845
|
+
if (match) return translator.t('doctor.check.specs_found', { specs: match[1] });
|
|
2846
|
+
if (text === 'Required files found') return translator.t('doctor.check.required_files_found');
|
|
2847
|
+
if (text === 'Workflow scripts available') return translator.t('doctor.check.workflow_scripts_available');
|
|
2848
|
+
if (text === 'Quiver state metadata found') return translator.t('doctor.check.state_found');
|
|
2849
|
+
if (text === 'Project analysis artifacts found') return translator.t('doctor.check.project_analysis_found');
|
|
2850
|
+
if (text === 'No specs yet. That is valid after the AI-first init flow.') return translator.t('doctor.fix.no_specs_yet');
|
|
2851
|
+
if (text === 'Run `npx create-quiver analyze` to generate docs/PROJECT_MAP.md when you want the visible project map.') return translator.t('doctor.fix.generate_project_map');
|
|
2852
|
+
if (text === 'Analyze the project first: npx create-quiver analyze') return translator.t('doctor.fix.analyze_first');
|
|
2853
|
+
if (text === 'Check the next ready slice: npx create-quiver next') return translator.t('doctor.fix.check_next');
|
|
2854
|
+
if (text === 'Create real specs and slices only after acceptance criteria are approved and the technical plan is reviewed and approved.') return translator.t('doctor.fix.create_specs_after_approval');
|
|
2855
|
+
return formatWarningPrefix(text, translator);
|
|
2856
|
+
};
|
|
2577
2857
|
|
|
2578
|
-
ux.section('
|
|
2858
|
+
ux.section(translator.t('doctor.title'));
|
|
2579
2859
|
ux.line('');
|
|
2580
|
-
ux.line('
|
|
2860
|
+
ux.line(translator.t('doctor.checks'));
|
|
2581
2861
|
for (const check of report.checks) {
|
|
2582
|
-
const line = ` ${symbolForStatus(check.status)} ${check.message}`;
|
|
2862
|
+
const line = ` ${symbolForStatus(check.status)} ${localizeDoctorText(check.message)}`;
|
|
2583
2863
|
ux.line(ux.mode.decoration ? ux.theme.status(colorForStatus(check.status), line) : line);
|
|
2584
2864
|
}
|
|
2585
2865
|
|
|
2586
2866
|
ux.line('');
|
|
2587
|
-
ux.line('
|
|
2867
|
+
ux.line(translator.t('doctor.suggested_fixes'));
|
|
2588
2868
|
for (const fix of report.suggested_fixes) {
|
|
2589
|
-
const line = ` ${ux.theme.symbols.bullet} ${fix}`;
|
|
2869
|
+
const line = ` ${ux.theme.symbols.bullet} ${localizeDoctorText(fix)}`;
|
|
2590
2870
|
ux.line(ux.mode.decoration ? ux.theme.status('command', line) : line);
|
|
2591
2871
|
}
|
|
2592
2872
|
|
|
@@ -2640,6 +2920,74 @@ const INIT_PROFILE_OPTIONS = Object.freeze([
|
|
|
2640
2920
|
},
|
|
2641
2921
|
]);
|
|
2642
2922
|
|
|
2923
|
+
function initModeOptions(translator) {
|
|
2924
|
+
return [
|
|
2925
|
+
{
|
|
2926
|
+
label: translator.t('init.mode.existing.label'),
|
|
2927
|
+
value: 'existing',
|
|
2928
|
+
hint: translator.t('init.mode.existing.hint'),
|
|
2929
|
+
default: true,
|
|
2930
|
+
},
|
|
2931
|
+
{
|
|
2932
|
+
label: translator.t('init.mode.new.label'),
|
|
2933
|
+
value: 'new',
|
|
2934
|
+
hint: translator.t('init.mode.new.hint'),
|
|
2935
|
+
},
|
|
2936
|
+
{
|
|
2937
|
+
label: translator.t('init.mode.validate.label'),
|
|
2938
|
+
value: 'validate',
|
|
2939
|
+
hint: translator.t('init.mode.validate.hint'),
|
|
2940
|
+
},
|
|
2941
|
+
];
|
|
2942
|
+
}
|
|
2943
|
+
|
|
2944
|
+
function methodologyOptions(translator) {
|
|
2945
|
+
return [
|
|
2946
|
+
{
|
|
2947
|
+
label: translator.t('init.methodology.wdd_sdd.label'),
|
|
2948
|
+
value: 'wdd-sdd',
|
|
2949
|
+
hint: translator.t('init.methodology.wdd_sdd.hint'),
|
|
2950
|
+
default: true,
|
|
2951
|
+
},
|
|
2952
|
+
];
|
|
2953
|
+
}
|
|
2954
|
+
|
|
2955
|
+
function initProfileOptions(translator) {
|
|
2956
|
+
return [
|
|
2957
|
+
{
|
|
2958
|
+
label: 'Default',
|
|
2959
|
+
value: 'default',
|
|
2960
|
+
hint: translator.t('init.profile.default.hint'),
|
|
2961
|
+
default: true,
|
|
2962
|
+
},
|
|
2963
|
+
{
|
|
2964
|
+
label: 'Minimal',
|
|
2965
|
+
value: 'minimal',
|
|
2966
|
+
hint: translator.t('init.profile.minimal.hint'),
|
|
2967
|
+
},
|
|
2968
|
+
{
|
|
2969
|
+
label: 'Full compatibility',
|
|
2970
|
+
value: 'full',
|
|
2971
|
+
hint: translator.t('init.profile.full.hint'),
|
|
2972
|
+
},
|
|
2973
|
+
];
|
|
2974
|
+
}
|
|
2975
|
+
|
|
2976
|
+
function initLanguageOptions() {
|
|
2977
|
+
return [
|
|
2978
|
+
{
|
|
2979
|
+
label: 'English',
|
|
2980
|
+
value: 'en',
|
|
2981
|
+
hint: 'en',
|
|
2982
|
+
},
|
|
2983
|
+
{
|
|
2984
|
+
label: 'Español',
|
|
2985
|
+
value: 'es',
|
|
2986
|
+
hint: 'es',
|
|
2987
|
+
},
|
|
2988
|
+
];
|
|
2989
|
+
}
|
|
2990
|
+
|
|
2643
2991
|
function hasDirectoryContent(dirPath) {
|
|
2644
2992
|
return fs.existsSync(dirPath)
|
|
2645
2993
|
&& fs.statSync(dirPath).isDirectory()
|
|
@@ -2657,8 +3005,16 @@ function assertSupportedMethodology(value) {
|
|
|
2657
3005
|
return normalized;
|
|
2658
3006
|
}
|
|
2659
3007
|
|
|
3008
|
+
function resolveExistingProjectLanguage(targetDir) {
|
|
3009
|
+
const config = readProjectLanguageConfig(targetDir);
|
|
3010
|
+
return normalizeLanguage(config.language);
|
|
3011
|
+
}
|
|
3012
|
+
|
|
2660
3013
|
async function resolveInteractiveInitOptions(args, targetDir, projectName, options = {}) {
|
|
2661
3014
|
const explicitMethodology = assertSupportedMethodology(args.methodology);
|
|
3015
|
+
const language = normalizeLanguage(options.language || args.language) || DEFAULT_LANGUAGE;
|
|
3016
|
+
const translator = createTranslator(language);
|
|
3017
|
+
const existingProjectLanguage = resolveExistingProjectLanguage(targetDir);
|
|
2662
3018
|
|
|
2663
3019
|
if (args.interactive !== true) {
|
|
2664
3020
|
return {
|
|
@@ -2669,6 +3025,7 @@ async function resolveInteractiveInitOptions(args, targetDir, projectName, optio
|
|
|
2669
3025
|
methodology: explicitMethodology,
|
|
2670
3026
|
minimal: args.initMinimal,
|
|
2671
3027
|
projectName,
|
|
3028
|
+
language: '',
|
|
2672
3029
|
};
|
|
2673
3030
|
}
|
|
2674
3031
|
|
|
@@ -2702,58 +3059,66 @@ async function resolveInteractiveInitOptions(args, targetDir, projectName, optio
|
|
|
2702
3059
|
stdoutIsTTY: options.stdoutIsTTY,
|
|
2703
3060
|
};
|
|
2704
3061
|
|
|
2705
|
-
ux.heading('
|
|
2706
|
-
const selectedMode = await selectOption('
|
|
3062
|
+
ux.heading(translator.t('init.heading'));
|
|
3063
|
+
const selectedMode = await selectOption(translator.t('init.prompt.mode'), initModeOptions(translator), {
|
|
2707
3064
|
...selectorOptions,
|
|
2708
3065
|
defaultValue: hasDirectoryContent(targetDir) ? 'existing' : 'new',
|
|
2709
3066
|
flag: 'init|doctor',
|
|
2710
3067
|
name: 'init mode',
|
|
2711
3068
|
});
|
|
2712
|
-
const selectedMethodology = await selectOption('
|
|
3069
|
+
const selectedMethodology = await selectOption(translator.t('init.prompt.methodology'), methodologyOptions(translator), {
|
|
2713
3070
|
...selectorOptions,
|
|
2714
3071
|
defaultValue: explicitMethodology,
|
|
2715
3072
|
flag: '--methodology',
|
|
2716
3073
|
name: 'methodology',
|
|
2717
3074
|
value: args.methodology || '',
|
|
2718
3075
|
});
|
|
3076
|
+
const selectedLanguage = await selectOption(translator.t('init.prompt.language'), initLanguageOptions(), {
|
|
3077
|
+
...selectorOptions,
|
|
3078
|
+
defaultValue: existingProjectLanguage || language,
|
|
3079
|
+
flag: '--lang|config language set',
|
|
3080
|
+
name: 'project language',
|
|
3081
|
+
});
|
|
2719
3082
|
|
|
2720
3083
|
assertSupportedMethodology(selectedMethodology.value);
|
|
2721
3084
|
|
|
2722
3085
|
if (selectedMode.value === 'validate') {
|
|
2723
3086
|
ux.summary([
|
|
2724
|
-
{ label: '
|
|
2725
|
-
{ label: '
|
|
2726
|
-
{ label: '
|
|
2727
|
-
|
|
3087
|
+
{ label: translator.t('init.summary.mode'), value: selectedMode.label },
|
|
3088
|
+
{ label: translator.t('init.summary.methodology'), value: selectedMethodology.label },
|
|
3089
|
+
{ label: translator.t('init.summary.language'), value: selectedLanguage.value },
|
|
3090
|
+
{ label: translator.t('init.summary.equivalent_command'), value: 'npx create-quiver doctor' },
|
|
3091
|
+
], { title: translator.t('init.summary.title') });
|
|
2728
3092
|
if (!args.force && !args.dryRun) {
|
|
2729
|
-
const confirmed = await ux.promptConfirm('
|
|
3093
|
+
const confirmed = await ux.promptConfirm(translator.t('init.confirm.doctor'), { initialValue: true });
|
|
2730
3094
|
if (!confirmed) {
|
|
2731
3095
|
throw new Error(formatError('init interactive validation declined. No files were written.'));
|
|
2732
3096
|
}
|
|
2733
3097
|
}
|
|
2734
3098
|
return {
|
|
2735
3099
|
action: 'doctor',
|
|
3100
|
+
language: selectedLanguage.value,
|
|
2736
3101
|
methodology: selectedMethodology.value,
|
|
2737
3102
|
projectName,
|
|
2738
3103
|
};
|
|
2739
3104
|
}
|
|
2740
3105
|
|
|
2741
3106
|
const defaultProfile = args.initFull ? 'full' : args.initMinimal ? 'minimal' : 'default';
|
|
2742
|
-
const selectedProfile = await selectOption('
|
|
3107
|
+
const selectedProfile = await selectOption(translator.t('init.prompt.profile'), initProfileOptions(translator), {
|
|
2743
3108
|
...selectorOptions,
|
|
2744
3109
|
defaultValue: defaultProfile,
|
|
2745
3110
|
flag: '--minimal|--full',
|
|
2746
3111
|
name: 'init profile',
|
|
2747
3112
|
});
|
|
2748
|
-
const agentGuidance = await selectOption('
|
|
3113
|
+
const agentGuidance = await selectOption(translator.t('init.prompt.agent_guidance'), [
|
|
2749
3114
|
{
|
|
2750
|
-
label: '
|
|
3115
|
+
label: translator.t('init.agent_guidance.show.label'),
|
|
2751
3116
|
value: 'show',
|
|
2752
|
-
hint: '
|
|
3117
|
+
hint: translator.t('init.agent_guidance.show.hint'),
|
|
2753
3118
|
default: true,
|
|
2754
3119
|
},
|
|
2755
3120
|
{
|
|
2756
|
-
label: '
|
|
3121
|
+
label: translator.t('init.agent_guidance.skip.label'),
|
|
2757
3122
|
value: 'skip',
|
|
2758
3123
|
},
|
|
2759
3124
|
], {
|
|
@@ -2766,28 +3131,30 @@ async function resolveInteractiveInitOptions(args, targetDir, projectName, optio
|
|
|
2766
3131
|
full: selectedProfile.value === 'full',
|
|
2767
3132
|
includeTemplates: args.initIncludeTemplates || selectedProfile.value === 'full',
|
|
2768
3133
|
legacyScripts: args.initLegacyScripts,
|
|
3134
|
+
language: selectedLanguage.value,
|
|
2769
3135
|
methodology: selectedMethodology.value,
|
|
2770
3136
|
minimal: selectedProfile.value === 'minimal',
|
|
2771
3137
|
projectName,
|
|
2772
3138
|
};
|
|
2773
3139
|
|
|
2774
3140
|
ux.summary([
|
|
2775
|
-
{ label: '
|
|
2776
|
-
{ label: '
|
|
2777
|
-
{ label: '
|
|
2778
|
-
{ label: '
|
|
2779
|
-
{ label: '
|
|
2780
|
-
|
|
3141
|
+
{ label: translator.t('init.summary.project'), value: projectName },
|
|
3142
|
+
{ label: translator.t('init.summary.mode'), value: selectedMode.label },
|
|
3143
|
+
{ label: translator.t('init.summary.methodology'), value: selectedMethodology.label },
|
|
3144
|
+
{ label: translator.t('init.summary.language'), value: selectedLanguage.value },
|
|
3145
|
+
{ label: translator.t('init.summary.profile'), value: selectedProfile.label },
|
|
3146
|
+
{ label: translator.t('init.summary.agent_profiles'), value: agentGuidance.value === 'show' ? translator.t('init.agent_guidance.show.summary') : translator.t('init.agent_guidance.skip.summary') },
|
|
3147
|
+
], { title: translator.t('init.summary.title') });
|
|
2781
3148
|
|
|
2782
3149
|
if (agentGuidance.value === 'show') {
|
|
2783
3150
|
ux.nextSteps([
|
|
2784
3151
|
'npx create-quiver ai agent set planner --provider codex --model gpt-5.5 --dry-run',
|
|
2785
3152
|
'npx create-quiver ai agent set executor --provider claude --model claude-sonnet-4-6 --dry-run',
|
|
2786
|
-
], { title: '
|
|
3153
|
+
], { title: translator.t('init.next_steps.after_init') });
|
|
2787
3154
|
}
|
|
2788
3155
|
|
|
2789
3156
|
if (!args.force && !args.dryRun) {
|
|
2790
|
-
const confirmed = await ux.promptConfirm(
|
|
3157
|
+
const confirmed = await ux.promptConfirm(translator.t('init.confirm.initialize', { path: targetDir }), { initialValue: true });
|
|
2791
3158
|
if (!confirmed) {
|
|
2792
3159
|
throw new Error(formatError('init interactive approval declined. No files were written.'));
|
|
2793
3160
|
}
|
|
@@ -2799,6 +3166,46 @@ async function resolveInteractiveInitOptions(args, targetDir, projectName, optio
|
|
|
2799
3166
|
};
|
|
2800
3167
|
}
|
|
2801
3168
|
|
|
3169
|
+
function persistInitLanguage(targetDir, initOptions = {}) {
|
|
3170
|
+
if (!initOptions.language) {
|
|
3171
|
+
return null;
|
|
3172
|
+
}
|
|
3173
|
+
writeProjectLanguageConfig(targetDir, initOptions.language);
|
|
3174
|
+
return {
|
|
3175
|
+
language: initOptions.language,
|
|
3176
|
+
path: path.join(targetDir, '.quiver', 'config.json'),
|
|
3177
|
+
};
|
|
3178
|
+
}
|
|
3179
|
+
|
|
3180
|
+
function resolveInitGeneratedLanguage(args, targetDir, initOptions = {}) {
|
|
3181
|
+
if (initOptions.language) {
|
|
3182
|
+
return {
|
|
3183
|
+
configLanguage: initOptions.language,
|
|
3184
|
+
docsLanguage: initOptions.language,
|
|
3185
|
+
};
|
|
3186
|
+
}
|
|
3187
|
+
|
|
3188
|
+
if (args.languageResolution?.source === '--lang') {
|
|
3189
|
+
return {
|
|
3190
|
+
configLanguage: args.language,
|
|
3191
|
+
docsLanguage: args.language,
|
|
3192
|
+
};
|
|
3193
|
+
}
|
|
3194
|
+
|
|
3195
|
+
const existingProjectLanguage = resolveExistingProjectLanguage(targetDir);
|
|
3196
|
+
if (existingProjectLanguage) {
|
|
3197
|
+
return {
|
|
3198
|
+
configLanguage: existingProjectLanguage,
|
|
3199
|
+
docsLanguage: existingProjectLanguage,
|
|
3200
|
+
};
|
|
3201
|
+
}
|
|
3202
|
+
|
|
3203
|
+
return {
|
|
3204
|
+
configLanguage: '',
|
|
3205
|
+
docsLanguage: args.language || DEFAULT_LANGUAGE,
|
|
3206
|
+
};
|
|
3207
|
+
}
|
|
3208
|
+
|
|
2802
3209
|
function runDoctor(targetDir, options = {}) {
|
|
2803
3210
|
const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
|
|
2804
3211
|
|
|
@@ -2837,6 +3244,7 @@ function runDoctor(targetDir, options = {}) {
|
|
|
2837
3244
|
console.log(JSON.stringify(commandReport, null, 2));
|
|
2838
3245
|
} else {
|
|
2839
3246
|
process.stdout.write(formatDoctorHumanReport(commandReport, {
|
|
3247
|
+
language: options.language,
|
|
2840
3248
|
noColor: options.noColor,
|
|
2841
3249
|
unicode: options.unicode,
|
|
2842
3250
|
}));
|
|
@@ -2847,38 +3255,84 @@ function runDoctor(targetDir, options = {}) {
|
|
|
2847
3255
|
}
|
|
2848
3256
|
}
|
|
2849
3257
|
|
|
2850
|
-
function printInitNextSteps(targetDir, projectName) {
|
|
3258
|
+
function printInitNextSteps(targetDir, projectName, options = {}) {
|
|
3259
|
+
const translator = createTranslator(options.language);
|
|
2851
3260
|
console.log('');
|
|
2852
|
-
console.log('
|
|
2853
|
-
console.log(`-
|
|
2854
|
-
console.log(`-
|
|
2855
|
-
console.log('
|
|
2856
|
-
console.log(
|
|
3261
|
+
console.log(translator.t('init.next_steps.title'));
|
|
3262
|
+
console.log(`- ${translator.t('init.next_steps.review_agents', { path: path.join(targetDir, 'docs', 'AI_ONBOARDING_PROMPT.md') })}`);
|
|
3263
|
+
console.log(`- ${translator.t('init.next_steps.review_workflow', { path: path.join(targetDir, 'docs', 'WORKFLOW.md') })}`);
|
|
3264
|
+
console.log(`- ${translator.t('init.next_steps.analyze')}`);
|
|
3265
|
+
console.log(`- ${translator.t('init.next_steps.create_specs')}`);
|
|
2857
3266
|
}
|
|
2858
3267
|
|
|
2859
3268
|
async function run(argv) {
|
|
2860
|
-
|
|
2861
|
-
|
|
3269
|
+
let languageArgs;
|
|
3270
|
+
try {
|
|
3271
|
+
languageArgs = extractCliLanguageFlag(argv);
|
|
3272
|
+
} catch (error) {
|
|
3273
|
+
const languageResolution = resolveLanguage({
|
|
3274
|
+
env: process.env,
|
|
3275
|
+
projectRoot: process.cwd(),
|
|
3276
|
+
});
|
|
3277
|
+
setCurrentErrorLanguage(languageResolution.language);
|
|
3278
|
+
throw new Error(formatError(error.message));
|
|
3279
|
+
}
|
|
3280
|
+
|
|
3281
|
+
const normalizedArgv = languageArgs.argv;
|
|
3282
|
+
const languageResolution = resolveLanguage({
|
|
3283
|
+
cliLanguage: languageArgs.language,
|
|
3284
|
+
env: process.env,
|
|
3285
|
+
projectRoot: process.cwd(),
|
|
3286
|
+
});
|
|
3287
|
+
setCurrentErrorLanguage(languageResolution.language);
|
|
3288
|
+
|
|
3289
|
+
if (normalizedArgv.length === 1 && normalizedArgv[0] === 'help') {
|
|
3290
|
+
printUsage(languageResolution.language);
|
|
2862
3291
|
return;
|
|
2863
3292
|
}
|
|
2864
3293
|
|
|
2865
|
-
if (
|
|
3294
|
+
if (normalizedArgv.length === 1 && (normalizedArgv[0] === '-V' || normalizedArgv[0] === '--version')) {
|
|
2866
3295
|
console.log(CLI_VERSION);
|
|
2867
3296
|
return;
|
|
2868
3297
|
}
|
|
2869
3298
|
|
|
2870
|
-
const args =
|
|
3299
|
+
const args = parseCliArgs(normalizedArgv, {
|
|
3300
|
+
language: languageArgs.language,
|
|
3301
|
+
legacyParseArgs: parseArgs,
|
|
3302
|
+
});
|
|
3303
|
+
args.languageResolution = languageResolution;
|
|
3304
|
+
args.language = args.languageResolution.language;
|
|
2871
3305
|
|
|
2872
3306
|
if (args.help) {
|
|
2873
|
-
|
|
3307
|
+
if (!args.json) {
|
|
3308
|
+
for (const warning of args.languageResolution.warnings || []) {
|
|
3309
|
+
process.stderr.write(`${formatLanguageWarningForCli(warning, args.language)}\n`);
|
|
3310
|
+
}
|
|
3311
|
+
}
|
|
3312
|
+
printUsage(args.language);
|
|
2874
3313
|
return;
|
|
2875
3314
|
}
|
|
2876
3315
|
|
|
2877
3316
|
validateUxFlags(args);
|
|
2878
3317
|
|
|
3318
|
+
if (!args.json) {
|
|
3319
|
+
for (const warning of args.languageResolution.warnings || []) {
|
|
3320
|
+
process.stderr.write(`${formatLanguageWarningForCli(warning, args.language)}\n`);
|
|
3321
|
+
}
|
|
3322
|
+
if (args.legacyAliasCommand) {
|
|
3323
|
+
process.stderr.write(`${formatLegacyNamespaceWarning(args.mode, args.legacyAliasCommand)}\n`);
|
|
3324
|
+
}
|
|
3325
|
+
}
|
|
3326
|
+
|
|
2879
3327
|
if (args.mode === 'analyze') {
|
|
2880
|
-
runAnalyze(args.targetDir, {
|
|
3328
|
+
await runAnalyze(args.targetDir, {
|
|
2881
3329
|
dryRun: args.dryRun,
|
|
3330
|
+
json: args.json,
|
|
3331
|
+
language: args.language,
|
|
3332
|
+
noColor: args.noColor,
|
|
3333
|
+
stderrIsTTY: Boolean(process.stderr.isTTY),
|
|
3334
|
+
stdinIsTTY: Boolean(process.stdin.isTTY),
|
|
3335
|
+
stdoutIsTTY: Boolean(process.stdout.isTTY),
|
|
2882
3336
|
});
|
|
2883
3337
|
return;
|
|
2884
3338
|
}
|
|
@@ -2886,6 +3340,7 @@ async function run(argv) {
|
|
|
2886
3340
|
if (args.mode === 'flow') {
|
|
2887
3341
|
await runFlow(process.cwd(), {
|
|
2888
3342
|
json: args.json,
|
|
3343
|
+
language: args.language,
|
|
2889
3344
|
});
|
|
2890
3345
|
return;
|
|
2891
3346
|
}
|
|
@@ -2895,6 +3350,7 @@ async function run(argv) {
|
|
|
2895
3350
|
details: args.dashboardDetails,
|
|
2896
3351
|
includeCompleted: args.includeCompleted,
|
|
2897
3352
|
json: args.json,
|
|
3353
|
+
language: args.language,
|
|
2898
3354
|
limit: args.dashboardLimit,
|
|
2899
3355
|
noColor: args.noColor,
|
|
2900
3356
|
optionErrors: args.dashboardOptionErrors,
|
|
@@ -2914,6 +3370,7 @@ async function run(argv) {
|
|
|
2914
3370
|
} else {
|
|
2915
3371
|
process.stdout.write(formatHumanVersionReport(report, {
|
|
2916
3372
|
env: process.env,
|
|
3373
|
+
language: args.language,
|
|
2917
3374
|
noColor: args.noColor,
|
|
2918
3375
|
stdoutIsTTY: Boolean(process.stdout.isTTY),
|
|
2919
3376
|
}));
|
|
@@ -2921,10 +3378,29 @@ async function run(argv) {
|
|
|
2921
3378
|
return;
|
|
2922
3379
|
}
|
|
2923
3380
|
|
|
3381
|
+
if (args.mode === 'changelog') {
|
|
3382
|
+
runChangelog({ json: args.json });
|
|
3383
|
+
return;
|
|
3384
|
+
}
|
|
3385
|
+
|
|
3386
|
+
if (args.mode === 'config') {
|
|
3387
|
+
runConfig(process.cwd(), {
|
|
3388
|
+
command: args.configCommand,
|
|
3389
|
+
global: args.configGlobal,
|
|
3390
|
+
json: args.json,
|
|
3391
|
+
language: args.language,
|
|
3392
|
+
languageResolution: args.languageResolution,
|
|
3393
|
+
section: args.configSection,
|
|
3394
|
+
value: args.configValue,
|
|
3395
|
+
});
|
|
3396
|
+
return;
|
|
3397
|
+
}
|
|
3398
|
+
|
|
2924
3399
|
if (args.mode === 'plan') {
|
|
2925
3400
|
runPlan(process.cwd(), {
|
|
2926
3401
|
includeCompleted: args.includeCompleted,
|
|
2927
3402
|
json: args.json,
|
|
3403
|
+
language: args.language,
|
|
2928
3404
|
onlyReady: args.onlyReady,
|
|
2929
3405
|
specSlug: args.specSlug,
|
|
2930
3406
|
unicode: args.unicode,
|
|
@@ -2951,6 +3427,7 @@ async function run(argv) {
|
|
|
2951
3427
|
runAiLifecycleRun(process.cwd(), {
|
|
2952
3428
|
command: args.aiRunCommand,
|
|
2953
3429
|
input: args.aiInput || undefined,
|
|
3430
|
+
language: args.language,
|
|
2954
3431
|
runId: args.aiRunId || undefined,
|
|
2955
3432
|
specSlug: args.specSlug || undefined,
|
|
2956
3433
|
});
|
|
@@ -2961,12 +3438,14 @@ async function run(argv) {
|
|
|
2961
3438
|
runAiActiveSlice(process.cwd(), {
|
|
2962
3439
|
command: args.aiSecondaryCommand || 'status',
|
|
2963
3440
|
dryRun: args.dryRun,
|
|
3441
|
+
language: args.language,
|
|
2964
3442
|
});
|
|
2965
3443
|
return;
|
|
2966
3444
|
}
|
|
2967
3445
|
|
|
2968
3446
|
if (args.aiCommand === 'status') {
|
|
2969
3447
|
runAiLifecycleStatus(process.cwd(), {
|
|
3448
|
+
language: args.language,
|
|
2970
3449
|
runId: args.aiRunId || undefined,
|
|
2971
3450
|
});
|
|
2972
3451
|
return;
|
|
@@ -2974,6 +3453,7 @@ async function run(argv) {
|
|
|
2974
3453
|
|
|
2975
3454
|
if (args.aiCommand === 'resume') {
|
|
2976
3455
|
runAiLifecycleResume(process.cwd(), {
|
|
3456
|
+
language: args.language,
|
|
2977
3457
|
runId: args.aiRunId || undefined,
|
|
2978
3458
|
});
|
|
2979
3459
|
return;
|
|
@@ -2982,6 +3462,7 @@ async function run(argv) {
|
|
|
2982
3462
|
if (args.aiCommand === 'inspect') {
|
|
2983
3463
|
runAiInspect(process.cwd(), {
|
|
2984
3464
|
includeCompleted: args.includeCompleted,
|
|
3465
|
+
language: args.language,
|
|
2985
3466
|
});
|
|
2986
3467
|
return;
|
|
2987
3468
|
}
|
|
@@ -2990,6 +3471,7 @@ async function run(argv) {
|
|
|
2990
3471
|
runAiExport(process.cwd(), {
|
|
2991
3472
|
format: args.formatExplicit ? args.format : 'json',
|
|
2992
3473
|
includeCompleted: args.includeCompleted,
|
|
3474
|
+
language: args.language,
|
|
2993
3475
|
});
|
|
2994
3476
|
return;
|
|
2995
3477
|
}
|
|
@@ -2998,6 +3480,7 @@ async function run(argv) {
|
|
|
2998
3480
|
runAiSpecsList(process.cwd(), {
|
|
2999
3481
|
includeCompleted: args.includeCompleted,
|
|
3000
3482
|
json: args.json,
|
|
3483
|
+
language: args.language,
|
|
3001
3484
|
});
|
|
3002
3485
|
return;
|
|
3003
3486
|
}
|
|
@@ -3006,6 +3489,7 @@ async function run(argv) {
|
|
|
3006
3489
|
runAiSlicesList(process.cwd(), {
|
|
3007
3490
|
includeCompleted: args.includeCompleted,
|
|
3008
3491
|
json: args.json,
|
|
3492
|
+
language: args.language,
|
|
3009
3493
|
});
|
|
3010
3494
|
return;
|
|
3011
3495
|
}
|
|
@@ -3013,6 +3497,7 @@ async function run(argv) {
|
|
|
3013
3497
|
if (args.aiCommand === 'trace') {
|
|
3014
3498
|
runAiTraceReport(process.cwd(), {
|
|
3015
3499
|
includeCompleted: args.includeCompleted,
|
|
3500
|
+
language: args.language,
|
|
3016
3501
|
});
|
|
3017
3502
|
return;
|
|
3018
3503
|
}
|
|
@@ -3020,6 +3505,7 @@ async function run(argv) {
|
|
|
3020
3505
|
if (args.aiCommand === 'models') {
|
|
3021
3506
|
runAiModelsList({
|
|
3022
3507
|
json: args.json,
|
|
3508
|
+
language: args.language,
|
|
3023
3509
|
provider: args.aiProviderExplicit ? args.aiProvider : undefined,
|
|
3024
3510
|
});
|
|
3025
3511
|
return;
|
|
@@ -3034,6 +3520,7 @@ async function run(argv) {
|
|
|
3034
3520
|
id: args.aiProfileId || undefined,
|
|
3035
3521
|
interactive: args.interactive,
|
|
3036
3522
|
json: args.json,
|
|
3523
|
+
language: args.language,
|
|
3037
3524
|
label: args.aiLabel || undefined,
|
|
3038
3525
|
model: args.aiModel || undefined,
|
|
3039
3526
|
provider: args.aiProviderExplicit ? args.aiProvider : undefined,
|
|
@@ -3052,6 +3539,7 @@ async function run(argv) {
|
|
|
3052
3539
|
provider: args.aiProvider,
|
|
3053
3540
|
providerExplicit: args.aiProviderExplicit,
|
|
3054
3541
|
model: args.aiModel || undefined,
|
|
3542
|
+
language: args.language,
|
|
3055
3543
|
plannerProfile: args.aiPlannerProfile || undefined,
|
|
3056
3544
|
role: args.aiRole,
|
|
3057
3545
|
timeout: args.aiTimeout,
|
|
@@ -3064,6 +3552,7 @@ async function run(argv) {
|
|
|
3064
3552
|
context: args.aiContext || undefined,
|
|
3065
3553
|
dryRun: args.dryRun,
|
|
3066
3554
|
interactive: args.interactive,
|
|
3555
|
+
language: args.language,
|
|
3067
3556
|
printPrompt: args.aiPrintPrompt,
|
|
3068
3557
|
provider: args.aiProvider,
|
|
3069
3558
|
providerExplicit: args.aiProviderExplicit,
|
|
@@ -3084,6 +3573,7 @@ async function run(argv) {
|
|
|
3084
3573
|
dryRun: args.dryRun,
|
|
3085
3574
|
input: args.aiInput || undefined,
|
|
3086
3575
|
phase: args.aiPhase,
|
|
3576
|
+
language: args.language,
|
|
3087
3577
|
printPrompt: args.aiPrintPrompt,
|
|
3088
3578
|
provider: args.aiProvider,
|
|
3089
3579
|
providerExplicit: args.aiProviderExplicit,
|
|
@@ -3105,6 +3595,7 @@ async function run(argv) {
|
|
|
3105
3595
|
context: args.aiContext || undefined,
|
|
3106
3596
|
dryRun: args.dryRun,
|
|
3107
3597
|
input: args.aiInput || undefined,
|
|
3598
|
+
language: args.language,
|
|
3108
3599
|
printPrompt: args.aiPrintPrompt,
|
|
3109
3600
|
provider: args.aiProvider,
|
|
3110
3601
|
providerExplicit: args.aiProviderExplicit,
|
|
@@ -3120,6 +3611,7 @@ async function run(argv) {
|
|
|
3120
3611
|
context: args.aiContext || undefined,
|
|
3121
3612
|
dryRun: args.dryRun,
|
|
3122
3613
|
input: args.aiInput || undefined,
|
|
3614
|
+
language: args.language,
|
|
3123
3615
|
printPrompt: args.aiPrintPrompt,
|
|
3124
3616
|
provider: args.aiProvider,
|
|
3125
3617
|
providerExplicit: args.aiProviderExplicit,
|
|
@@ -3138,6 +3630,7 @@ async function run(argv) {
|
|
|
3138
3630
|
dryRun: args.dryRun,
|
|
3139
3631
|
input: args.aiInput || undefined,
|
|
3140
3632
|
phase: args.aiPhase,
|
|
3633
|
+
language: args.language,
|
|
3141
3634
|
printPrompt: args.aiPrintPrompt,
|
|
3142
3635
|
provider: args.aiProvider,
|
|
3143
3636
|
providerExplicit: args.aiProviderExplicit,
|
|
@@ -3154,6 +3647,7 @@ async function run(argv) {
|
|
|
3154
3647
|
await runAiApprove(process.cwd(), {
|
|
3155
3648
|
dryRun: args.dryRun,
|
|
3156
3649
|
input: args.aiInput || undefined,
|
|
3650
|
+
language: args.language,
|
|
3157
3651
|
phase: args.aiPhase,
|
|
3158
3652
|
runId: args.aiRunId || undefined,
|
|
3159
3653
|
version: args.aiVersion || undefined,
|
|
@@ -3162,7 +3656,9 @@ async function run(argv) {
|
|
|
3162
3656
|
}
|
|
3163
3657
|
|
|
3164
3658
|
if (args.aiCommand === 'approvals' || args.aiCommand === 'approval-status') {
|
|
3165
|
-
await runAiApprovalStatus(process.cwd()
|
|
3659
|
+
await runAiApprovalStatus(process.cwd(), {
|
|
3660
|
+
language: args.language,
|
|
3661
|
+
});
|
|
3166
3662
|
return;
|
|
3167
3663
|
}
|
|
3168
3664
|
|
|
@@ -3174,6 +3670,7 @@ async function run(argv) {
|
|
|
3174
3670
|
dryRun: args.dryRun,
|
|
3175
3671
|
executorProfile: args.aiExecutorProfile || undefined,
|
|
3176
3672
|
interactive: args.interactive,
|
|
3673
|
+
language: args.language,
|
|
3177
3674
|
model: args.aiModel || undefined,
|
|
3178
3675
|
provider: args.aiProvider,
|
|
3179
3676
|
providerExplicit: args.aiProviderExplicit,
|
|
@@ -3186,6 +3683,7 @@ async function run(argv) {
|
|
|
3186
3683
|
|
|
3187
3684
|
if (args.aiCommand === 'prompt-slice' || args.aiCommand === 'executor-prompt') {
|
|
3188
3685
|
runAiPromptSlice(process.cwd(), {
|
|
3686
|
+
language: args.language,
|
|
3189
3687
|
slice: args.aiSlice || undefined,
|
|
3190
3688
|
});
|
|
3191
3689
|
return;
|
|
@@ -3201,6 +3699,7 @@ async function run(argv) {
|
|
|
3201
3699
|
executorProfile: args.aiExecutorProfile || undefined,
|
|
3202
3700
|
interactive: args.interactive,
|
|
3203
3701
|
json: args.json,
|
|
3702
|
+
language: args.language,
|
|
3204
3703
|
model: args.aiModel || undefined,
|
|
3205
3704
|
mode: args.aiExecutionMode,
|
|
3206
3705
|
provider: args.aiProvider,
|
|
@@ -3224,11 +3723,12 @@ async function run(argv) {
|
|
|
3224
3723
|
|
|
3225
3724
|
if (args.aiCommand === 'pr') {
|
|
3226
3725
|
await runAiPr(process.cwd(), {
|
|
3227
|
-
baseBranch: args.aiBaseBranch,
|
|
3726
|
+
baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
|
|
3228
3727
|
create: args.aiCreate,
|
|
3229
3728
|
dryRun: args.dryRun,
|
|
3230
3729
|
input: args.aiInput || undefined,
|
|
3231
3730
|
interactive: args.interactive,
|
|
3731
|
+
language: args.language,
|
|
3232
3732
|
remote: args.aiRemote || undefined,
|
|
3233
3733
|
review: args.review,
|
|
3234
3734
|
sshHostAlias: args.aiSshHostAlias || undefined,
|
|
@@ -3246,6 +3746,7 @@ async function run(argv) {
|
|
|
3246
3746
|
format: args.format,
|
|
3247
3747
|
includeCompleted: args.includeCompleted,
|
|
3248
3748
|
json: args.json,
|
|
3749
|
+
language: args.language,
|
|
3249
3750
|
level: args.level,
|
|
3250
3751
|
showConflicts: args.showConflicts,
|
|
3251
3752
|
specSlug: args.specSlug,
|
|
@@ -3260,6 +3761,7 @@ async function run(argv) {
|
|
|
3260
3761
|
autoStart: args.autoStart,
|
|
3261
3762
|
includeCompleted: args.includeCompleted,
|
|
3262
3763
|
json: args.json,
|
|
3764
|
+
language: args.language,
|
|
3263
3765
|
specSlug: args.specSlug,
|
|
3264
3766
|
});
|
|
3265
3767
|
return;
|
|
@@ -3268,9 +3770,12 @@ async function run(argv) {
|
|
|
3268
3770
|
if (args.mode === 'evidence') {
|
|
3269
3771
|
const result = runEvidence(process.cwd(), {
|
|
3270
3772
|
command: args.evidenceArgs,
|
|
3773
|
+
language: args.language,
|
|
3271
3774
|
maxOutput: args.evidenceMaxOutput || undefined,
|
|
3272
3775
|
output: args.evidenceOutput || undefined,
|
|
3776
|
+
json: args.json,
|
|
3273
3777
|
subcommand: args.evidenceCommand,
|
|
3778
|
+
target: args.evidenceTarget,
|
|
3274
3779
|
});
|
|
3275
3780
|
process.exitCode = result.exitCode;
|
|
3276
3781
|
return;
|
|
@@ -3282,15 +3787,23 @@ async function run(argv) {
|
|
|
3282
3787
|
command: args.demoCommand,
|
|
3283
3788
|
demo: args.demoName,
|
|
3284
3789
|
dryRun: args.dryRun,
|
|
3790
|
+
language: args.language,
|
|
3285
3791
|
targetRoot: demoTarget,
|
|
3286
3792
|
});
|
|
3287
3793
|
return;
|
|
3288
3794
|
}
|
|
3289
3795
|
|
|
3290
3796
|
if (args.mode === 'migrate') {
|
|
3291
|
-
runMigrate(args.targetDir, {
|
|
3797
|
+
await runMigrate(args.targetDir, {
|
|
3292
3798
|
dryRun: args.dryRun,
|
|
3799
|
+
force: args.force,
|
|
3800
|
+
json: args.json,
|
|
3801
|
+
language: args.language,
|
|
3802
|
+
noColor: args.noColor,
|
|
3293
3803
|
skipInstall: args.skipInstall,
|
|
3804
|
+
stderrIsTTY: Boolean(process.stderr.isTTY),
|
|
3805
|
+
stdinIsTTY: Boolean(process.stdin.isTTY),
|
|
3806
|
+
stdoutIsTTY: Boolean(process.stdout.isTTY),
|
|
3294
3807
|
});
|
|
3295
3808
|
return;
|
|
3296
3809
|
}
|
|
@@ -3300,6 +3813,7 @@ async function run(argv) {
|
|
|
3300
3813
|
dryRun: args.dryRun,
|
|
3301
3814
|
fix: args.doctorFix,
|
|
3302
3815
|
json: args.json,
|
|
3816
|
+
language: args.language,
|
|
3303
3817
|
noColor: args.noColor,
|
|
3304
3818
|
unicode: args.unicode,
|
|
3305
3819
|
});
|
|
@@ -3307,7 +3821,10 @@ async function run(argv) {
|
|
|
3307
3821
|
}
|
|
3308
3822
|
|
|
3309
3823
|
if (args.mode === 'start-slice') {
|
|
3310
|
-
startSlice(args.targetDir, {
|
|
3824
|
+
startSlice(args.targetDir, {
|
|
3825
|
+
allowDraft: args.allowDraft,
|
|
3826
|
+
language: args.language,
|
|
3827
|
+
});
|
|
3311
3828
|
return;
|
|
3312
3829
|
}
|
|
3313
3830
|
|
|
@@ -3315,6 +3832,7 @@ async function run(argv) {
|
|
|
3315
3832
|
checkSliceReadiness(args.targetDir, {
|
|
3316
3833
|
baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
|
|
3317
3834
|
gate: args.gate,
|
|
3835
|
+
language: args.language,
|
|
3318
3836
|
local: args.checkSliceLocal,
|
|
3319
3837
|
remote: args.aiRemote,
|
|
3320
3838
|
strictOverlap: args.strictOverlap,
|
|
@@ -3323,7 +3841,11 @@ async function run(argv) {
|
|
|
3323
3841
|
}
|
|
3324
3842
|
|
|
3325
3843
|
if (args.mode === 'check-pr') {
|
|
3326
|
-
checkPrReadiness(args.targetDir
|
|
3844
|
+
checkPrReadiness(args.targetDir, {
|
|
3845
|
+
baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
|
|
3846
|
+
language: args.language,
|
|
3847
|
+
remote: args.aiRemote,
|
|
3848
|
+
});
|
|
3327
3849
|
return;
|
|
3328
3850
|
}
|
|
3329
3851
|
|
|
@@ -3333,16 +3855,21 @@ async function run(argv) {
|
|
|
3333
3855
|
if (!handoffInput || handoffInput === '.') {
|
|
3334
3856
|
throw new Error(formatError('missing handoff or brief path. Use: npx create-quiver check-handoff specs/<spec-slug>/HANDOFF.md or specs/<spec-slug>/slices/<slice-id>/EXECUTION_BRIEF.md'));
|
|
3335
3857
|
}
|
|
3336
|
-
const
|
|
3337
|
-
|
|
3858
|
+
const translator = createTranslator(args.language);
|
|
3859
|
+
const resolved = checkHandoff(handoffInput, repoRoot, { language: args.language });
|
|
3860
|
+
console.log(translator.t('handoff.validated', {
|
|
3861
|
+
path: resolved.relativePath,
|
|
3862
|
+
subject: translator.t(`handoff.label.${resolved.kind}`),
|
|
3863
|
+
}));
|
|
3338
3864
|
return;
|
|
3339
3865
|
}
|
|
3340
3866
|
|
|
3341
3867
|
if (args.mode === 'new-handoff') {
|
|
3342
3868
|
const repoRoot = process.cwd();
|
|
3343
3869
|
const handoffSlug = args.targetDir;
|
|
3870
|
+
const translator = createTranslator(args.language);
|
|
3344
3871
|
const resolved = scaffoldHandoff(handoffSlug, repoRoot);
|
|
3345
|
-
console.log(
|
|
3872
|
+
console.log(translator.t('handoff.scaffolded', { path: resolved.relativePath }));
|
|
3346
3873
|
return;
|
|
3347
3874
|
}
|
|
3348
3875
|
|
|
@@ -3352,6 +3879,7 @@ async function run(argv) {
|
|
|
3352
3879
|
discard: args.discard,
|
|
3353
3880
|
dryRun: args.dryRun,
|
|
3354
3881
|
force: args.force,
|
|
3882
|
+
language: args.language,
|
|
3355
3883
|
});
|
|
3356
3884
|
return;
|
|
3357
3885
|
}
|
|
@@ -3359,6 +3887,7 @@ async function run(argv) {
|
|
|
3359
3887
|
if (args.mode === 'check-scope') {
|
|
3360
3888
|
checkScope(args.targetDir, {
|
|
3361
3889
|
baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
|
|
3890
|
+
language: args.language,
|
|
3362
3891
|
remote: args.aiRemote,
|
|
3363
3892
|
strict: args.strict,
|
|
3364
3893
|
});
|
|
@@ -3377,6 +3906,7 @@ async function run(argv) {
|
|
|
3377
3906
|
dryRun: args.dryRun,
|
|
3378
3907
|
input: args.aiInput || undefined,
|
|
3379
3908
|
interactive: args.interactive,
|
|
3909
|
+
language: args.language,
|
|
3380
3910
|
methodology: args.methodology || undefined,
|
|
3381
3911
|
review: args.review,
|
|
3382
3912
|
specSlug: args.specSlug || undefined,
|
|
@@ -3386,25 +3916,27 @@ async function run(argv) {
|
|
|
3386
3916
|
}
|
|
3387
3917
|
|
|
3388
3918
|
if (!args.targetDir || args.targetDir === '.') {
|
|
3389
|
-
throw new Error(formatError('
|
|
3919
|
+
throw new Error(formatError(createTranslator(args.language).t('spec.error.missing_directory_command')));
|
|
3390
3920
|
}
|
|
3391
3921
|
|
|
3392
3922
|
if (args.specCommand === 'start') {
|
|
3393
3923
|
const report = startSpecWorktree(process.cwd(), args.targetDir, {
|
|
3924
|
+
baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
|
|
3394
3925
|
dryRun: args.dryRun,
|
|
3395
3926
|
});
|
|
3396
|
-
process.stdout.write(formatSpecStartResult(report));
|
|
3927
|
+
process.stdout.write(formatSpecStartResult(report, { language: args.language }));
|
|
3397
3928
|
return;
|
|
3398
3929
|
}
|
|
3399
3930
|
|
|
3400
3931
|
if (args.specCommand === 'status') {
|
|
3401
3932
|
const report = buildSpecStatus(process.cwd(), args.targetDir);
|
|
3402
|
-
process.stdout.write(formatSpecStatus(report));
|
|
3933
|
+
process.stdout.write(formatSpecStatus(report, { language: args.language }));
|
|
3403
3934
|
return;
|
|
3404
3935
|
}
|
|
3405
3936
|
|
|
3406
3937
|
if (args.specCommand === 'validate') {
|
|
3407
3938
|
runValidateSpec(process.cwd(), args.targetDir, {
|
|
3939
|
+
language: args.language,
|
|
3408
3940
|
strict: args.strict,
|
|
3409
3941
|
});
|
|
3410
3942
|
return;
|
|
@@ -3412,13 +3944,13 @@ async function run(argv) {
|
|
|
3412
3944
|
|
|
3413
3945
|
if (args.specCommand === 'close') {
|
|
3414
3946
|
const report = closeSpecWorktree(process.cwd(), args.targetDir, {
|
|
3415
|
-
baseBranch: args.aiBaseBranch,
|
|
3947
|
+
baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
|
|
3416
3948
|
discard: args.discard,
|
|
3417
3949
|
dryRun: args.dryRun,
|
|
3418
3950
|
force: args.force,
|
|
3419
3951
|
remote: args.aiRemote,
|
|
3420
3952
|
});
|
|
3421
|
-
process.stdout.write(formatSpecCloseResult(report));
|
|
3953
|
+
process.stdout.write(formatSpecCloseResult(report, { language: args.language }));
|
|
3422
3954
|
return;
|
|
3423
3955
|
}
|
|
3424
3956
|
|
|
@@ -3439,11 +3971,13 @@ async function run(argv) {
|
|
|
3439
3971
|
});
|
|
3440
3972
|
return;
|
|
3441
3973
|
}
|
|
3974
|
+
const initLanguage = resolveInitGeneratedLanguage(args, targetDir, initOptions);
|
|
3442
3975
|
const initLayout = buildInitLayout(targetDir, {
|
|
3443
3976
|
compatibilityAlias: !args.explicitInit,
|
|
3444
3977
|
dryRun: args.dryRun,
|
|
3445
3978
|
full: initOptions.full,
|
|
3446
3979
|
includeTemplates: initOptions.includeTemplates,
|
|
3980
|
+
language: initLanguage.configLanguage,
|
|
3447
3981
|
legacyScripts: initOptions.legacyScripts,
|
|
3448
3982
|
minimal: initOptions.minimal,
|
|
3449
3983
|
projectName: initOptions.projectName,
|
|
@@ -3456,23 +3990,60 @@ async function run(argv) {
|
|
|
3456
3990
|
}
|
|
3457
3991
|
|
|
3458
3992
|
const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'quiver-create-'));
|
|
3993
|
+
const translator = createTranslator(args.language);
|
|
3994
|
+
const progress = createCommandProgressUx({
|
|
3995
|
+
json: args.json,
|
|
3996
|
+
noColor: args.noColor,
|
|
3997
|
+
stderrIsTTY: Boolean(process.stderr.isTTY),
|
|
3998
|
+
stdinIsTTY: Boolean(process.stdin.isTTY),
|
|
3999
|
+
stdoutIsTTY: Boolean(process.stdout.isTTY),
|
|
4000
|
+
});
|
|
3459
4001
|
|
|
3460
4002
|
try {
|
|
3461
|
-
|
|
3462
|
-
|
|
3463
|
-
|
|
4003
|
+
let templateRoot = '';
|
|
4004
|
+
await runProgress(
|
|
4005
|
+
progress,
|
|
4006
|
+
translator.t('init.progress.preparing_templates'),
|
|
4007
|
+
() => {
|
|
4008
|
+
ensureDir(targetDir);
|
|
4009
|
+
templateRoot = packTemplate(packageRoot, tempRoot);
|
|
4010
|
+
return templateRoot;
|
|
4011
|
+
},
|
|
4012
|
+
translator.t('init.progress.templates_ready'),
|
|
4013
|
+
);
|
|
3464
4014
|
if (initLayout.profile === 'full') {
|
|
3465
|
-
|
|
3466
|
-
|
|
3467
|
-
|
|
3468
|
-
|
|
3469
|
-
|
|
3470
|
-
|
|
3471
|
-
|
|
3472
|
-
|
|
4015
|
+
await runProgress(
|
|
4016
|
+
progress,
|
|
4017
|
+
translator.t('init.progress.exporting_templates'),
|
|
4018
|
+
() => exportTemplatesToLegacyRoot(templateRoot, targetDir),
|
|
4019
|
+
translator.t('init.progress.templates_exported'),
|
|
4020
|
+
);
|
|
4021
|
+
}
|
|
4022
|
+
let languageWrite = null;
|
|
4023
|
+
await runProgress(
|
|
4024
|
+
progress,
|
|
4025
|
+
translator.t('init.progress.writing_docs'),
|
|
4026
|
+
() => {
|
|
4027
|
+
runInitDocs(targetDir, initOptions.projectName, {
|
|
4028
|
+
includeTemplates: initOptions.includeTemplates,
|
|
4029
|
+
language: initLanguage.docsLanguage,
|
|
4030
|
+
legacyScripts: initOptions.legacyScripts,
|
|
4031
|
+
profile: initLayout.profile,
|
|
4032
|
+
templateRoot,
|
|
4033
|
+
});
|
|
4034
|
+
languageWrite = persistInitLanguage(targetDir, { language: initLanguage.configLanguage });
|
|
4035
|
+
return languageWrite;
|
|
4036
|
+
},
|
|
4037
|
+
translator.t('init.progress.docs_written'),
|
|
4038
|
+
);
|
|
3473
4039
|
|
|
3474
4040
|
if (!args.skipInstall) {
|
|
3475
|
-
const installResult =
|
|
4041
|
+
const installResult = await runProgress(
|
|
4042
|
+
progress,
|
|
4043
|
+
translator.t('init.progress.installing_package'),
|
|
4044
|
+
() => installSelfAsDevDep(targetDir, CLI_VERSION),
|
|
4045
|
+
translator.t('init.progress.install_checked'),
|
|
4046
|
+
);
|
|
3476
4047
|
if (installResult === 'installed') {
|
|
3477
4048
|
console.log(`Added create-quiver@${CLI_VERSION} as dev dependency`);
|
|
3478
4049
|
} else if (installResult === 'failed') {
|
|
@@ -3480,14 +4051,18 @@ async function run(argv) {
|
|
|
3480
4051
|
}
|
|
3481
4052
|
}
|
|
3482
4053
|
|
|
3483
|
-
console.log(
|
|
3484
|
-
|
|
4054
|
+
console.log(translator.t('init.installed', { path: targetDir }));
|
|
4055
|
+
if (languageWrite) {
|
|
4056
|
+
console.log(translator.t('init.language.saved', { language: languageWrite.language }));
|
|
4057
|
+
}
|
|
4058
|
+
printInitNextSteps(targetDir, initOptions.projectName, { language: args.language });
|
|
3485
4059
|
} finally {
|
|
3486
4060
|
fs.rmSync(tempRoot, { recursive: true, force: true });
|
|
3487
4061
|
}
|
|
3488
4062
|
}
|
|
3489
4063
|
|
|
3490
4064
|
module.exports = {
|
|
4065
|
+
persistInitLanguage,
|
|
3491
4066
|
resolveInteractiveInitOptions,
|
|
3492
4067
|
runAnalyze,
|
|
3493
4068
|
runDashboard,
|