create-quiver 0.15.2 → 0.15.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +3 -0
- package/AGENTS.md.es.template +37 -0
- package/README.md +1 -0
- package/README_FOR_AI.md +6 -4
- package/docs/AI_CONTEXT.md.es.template +35 -0
- package/docs/AI_ONBOARDING_PROMPT.md.es.template +22 -0
- package/docs/CLI_UX_GUIDE.md +47 -1
- package/docs/COMMANDS.md.es.template +28 -0
- package/docs/COMMANDS.md.template +14 -3
- package/docs/CONTEXTO.md.es.template +33 -0
- package/docs/DECISIONS.md.es.template +17 -0
- package/docs/GITFLOW_PR_GUIDE.md.es.template +25 -0
- package/docs/INDEX.md +96 -0
- package/docs/INDEX.md.es.template +36 -0
- package/docs/STATUS.md.es.template +28 -0
- package/docs/SUPPORT_MATRIX.md.es.template +22 -0
- package/docs/TESTING_GUIDE_FOR_AI.md.es.template +19 -0
- package/docs/TROUBLESHOOTING.md.es.template +35 -0
- package/docs/WORKFLOW.md.es.template +29 -0
- package/docs/WORKFLOW.md.template +2 -2
- package/docs/ai/LESSONS.md.es.template +24 -0
- package/docs/getting-started/installation.md +19 -0
- package/docs/reference/commands.md +68 -2
- package/package.json +3 -1
- package/specs/quiver-v34-cli-dashboard-status/EVIDENCE_REPORT.md +119 -0
- package/specs/quiver-v34-cli-dashboard-status/EXECUTION_PLAN.md +77 -0
- package/specs/quiver-v34-cli-dashboard-status/SPEC.md +152 -0
- package/specs/quiver-v34-cli-dashboard-status/STATUS.md +29 -0
- package/specs/quiver-v34-cli-dashboard-status/pr.md +99 -0
- package/specs/quiver-v34-cli-dashboard-status/slices/slice-00-dashboard-foundation/CLOSURE_BRIEF.md +19 -0
- package/specs/quiver-v34-cli-dashboard-status/slices/slice-00-dashboard-foundation/EXECUTION_BRIEF.md +49 -0
- package/specs/quiver-v34-cli-dashboard-status/slices/slice-00-dashboard-foundation/slice.json +68 -0
- package/specs/quiver-v34-cli-dashboard-status/slices/slice-01-dashboard-report-contract/CLOSURE_BRIEF.md +19 -0
- package/specs/quiver-v34-cli-dashboard-status/slices/slice-01-dashboard-report-contract/EXECUTION_BRIEF.md +53 -0
- package/specs/quiver-v34-cli-dashboard-status/slices/slice-01-dashboard-report-contract/slice.json +78 -0
- package/specs/quiver-v34-cli-dashboard-status/slices/slice-02-dashboard-command-rendering/CLOSURE_BRIEF.md +19 -0
- package/specs/quiver-v34-cli-dashboard-status/slices/slice-02-dashboard-command-rendering/EXECUTION_BRIEF.md +53 -0
- package/specs/quiver-v34-cli-dashboard-status/slices/slice-02-dashboard-command-rendering/slice.json +82 -0
- package/specs/quiver-v34-cli-dashboard-status/slices/slice-03-dashboard-edge-cases-and-guardrails/CLOSURE_BRIEF.md +19 -0
- package/specs/quiver-v34-cli-dashboard-status/slices/slice-03-dashboard-edge-cases-and-guardrails/EXECUTION_BRIEF.md +54 -0
- package/specs/quiver-v34-cli-dashboard-status/slices/slice-03-dashboard-edge-cases-and-guardrails/slice.json +77 -0
- package/specs/quiver-v34-cli-dashboard-status/slices/slice-04-docs-templates-and-scripts/CLOSURE_BRIEF.md +19 -0
- package/specs/quiver-v34-cli-dashboard-status/slices/slice-04-docs-templates-and-scripts/EXECUTION_BRIEF.md +54 -0
- package/specs/quiver-v34-cli-dashboard-status/slices/slice-04-docs-templates-and-scripts/slice.json +88 -0
- package/specs/quiver-v34-cli-dashboard-status/slices/slice-05-tests-smokes-release-readiness/CLOSURE_BRIEF.md +26 -0
- package/specs/quiver-v34-cli-dashboard-status/slices/slice-05-tests-smokes-release-readiness/EXECUTION_BRIEF.md +57 -0
- package/specs/quiver-v34-cli-dashboard-status/slices/slice-05-tests-smokes-release-readiness/slice.json +85 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/EVIDENCE_REPORT.md +43 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/EXECUTION_PLAN.md +85 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/SPEC.md +147 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/STATUS.md +33 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/pr.md +106 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-00-foundation-and-doc-router/CLOSURE_BRIEF.md +19 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-00-foundation-and-doc-router/EXECUTION_BRIEF.md +38 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-00-foundation-and-doc-router/slice.json +64 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-01-dashboard-cli-contract/CLOSURE_BRIEF.md +19 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-01-dashboard-cli-contract/EXECUTION_BRIEF.md +49 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-01-dashboard-cli-contract/slice.json +80 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-02-dashboard-compact-renderer/CLOSURE_BRIEF.md +19 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-02-dashboard-compact-renderer/EXECUTION_BRIEF.md +48 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-02-dashboard-compact-renderer/slice.json +73 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-03-dashboard-details-sections/CLOSURE_BRIEF.md +19 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-03-dashboard-details-sections/EXECUTION_BRIEF.md +48 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-03-dashboard-details-sections/slice.json +72 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-04-version-command/CLOSURE_BRIEF.md +19 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-04-version-command/EXECUTION_BRIEF.md +49 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-04-version-command/slice.json +82 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-05-docs-help-generated-guidance/CLOSURE_BRIEF.md +19 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-05-docs-help-generated-guidance/EXECUTION_BRIEF.md +50 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-05-docs-help-generated-guidance/slice.json +90 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-06-tests-smokes-release-readiness/CLOSURE_BRIEF.md +21 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-06-tests-smokes-release-readiness/EXECUTION_BRIEF.md +51 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-06-tests-smokes-release-readiness/slice.json +85 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-07-package-and-cross-platform-smoke/CLOSURE_BRIEF.md +20 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-07-package-and-cross-platform-smoke/EXECUTION_BRIEF.md +49 -0
- package/specs/quiver-v35-compact-dashboard-version-ux/slices/slice-07-package-and-cross-platform-smoke/slice.json +79 -0
- package/specs/quiver-v36-ai-run-watch-portable/EVIDENCE_REPORT.md +33 -0
- package/specs/quiver-v36-ai-run-watch-portable/EXECUTION_PLAN.md +39 -0
- package/specs/quiver-v36-ai-run-watch-portable/SPEC.md +166 -0
- package/specs/quiver-v36-ai-run-watch-portable/STATUS.md +31 -0
- package/specs/quiver-v36-ai-run-watch-portable/pr.md +78 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-00-foundation-and-handoffs/CLOSURE_BRIEF.md +19 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-00-foundation-and-handoffs/EXECUTION_BRIEF.md +43 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-00-foundation-and-handoffs/slice.json +61 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-01-run-schema-path-safety/CLOSURE_BRIEF.md +18 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-01-run-schema-path-safety/EXECUTION_BRIEF.md +43 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-01-run-schema-path-safety/slice.json +65 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-02-event-writer-redacted-logs/CLOSURE_BRIEF.md +18 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-02-event-writer-redacted-logs/EXECUTION_BRIEF.md +43 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-02-event-writer-redacted-logs/slice.json +66 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-03-provider-streaming-integration/CLOSURE_BRIEF.md +18 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-03-provider-streaming-integration/EXECUTION_BRIEF.md +41 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-03-provider-streaming-integration/slice.json +71 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-04-ai-run-watch-command/CLOSURE_BRIEF.md +18 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-04-ai-run-watch-command/EXECUTION_BRIEF.md +44 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-04-ai-run-watch-command/slice.json +73 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-05-main-progress-user-guidance/CLOSURE_BRIEF.md +18 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-05-main-progress-user-guidance/EXECUTION_BRIEF.md +44 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-05-main-progress-user-guidance/slice.json +71 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-06-docs-generated-guidance/CLOSURE_BRIEF.md +19 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-06-docs-generated-guidance/EXECUTION_BRIEF.md +45 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-06-docs-generated-guidance/slice.json +77 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-07-tests-cross-platform-readiness/CLOSURE_BRIEF.md +22 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-07-tests-cross-platform-readiness/EXECUTION_BRIEF.md +46 -0
- package/specs/quiver-v36-ai-run-watch-portable/slices/slice-07-tests-cross-platform-readiness/slice.json +87 -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 +545 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/cross-platform-smoke-matrix.md +35 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/pr.md +155 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/EXECUTION_BRIEF.md +21 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/slice.json +53 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/CLOSURE_BRIEF.md +13 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/slice.json +62 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/CLOSURE_BRIEF.md +18 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/slice.json +59 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/CLOSURE_BRIEF.md +15 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/slice.json +62 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/CLOSURE_BRIEF.md +17 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/EXECUTION_BRIEF.md +24 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/slice.json +66 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/EVIDENCE_REPORT.md +18 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/EXECUTION_PLAN.md +31 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/SPEC.md +118 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/STATUS.md +25 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/pr.md +92 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/CLOSURE_BRIEF.md +11 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/slice.json +64 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/EXECUTION_BRIEF.md +24 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/slice.json +65 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/EXECUTION_BRIEF.md +24 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/slice.json +70 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/EXECUTION_BRIEF.md +25 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/slice.json +70 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/EXECUTION_BRIEF.md +26 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/slice.json +72 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/CLOSURE_BRIEF.md +15 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/EXECUTION_BRIEF.md +26 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/slice.json +75 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/EVIDENCE_REPORT.md +30 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/EXECUTION_PLAN.md +22 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/SPEC.md +49 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/STATUS.md +21 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/pr.md +67 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/EXECUTION_BRIEF.md +21 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/slice.json +48 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/CLOSURE_BRIEF.md +14 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/slice.json +65 -0
- package/src/create-quiver/commands/ai.js +485 -307
- package/src/create-quiver/commands/config.js +124 -0
- package/src/create-quiver/commands/dashboard.js +31 -0
- package/src/create-quiver/commands/demo.js +2 -2
- package/src/create-quiver/commands/evidence.js +6 -4
- package/src/create-quiver/commands/flow.js +108 -16
- package/src/create-quiver/commands/graph.js +1 -0
- package/src/create-quiver/commands/next.js +21 -18
- package/src/create-quiver/commands/plan.js +23 -6
- package/src/create-quiver/commands/spec.js +66 -57
- package/src/create-quiver/index.js +606 -136
- package/src/create-quiver/lib/ai/execution-plan.js +23 -20
- package/src/create-quiver/lib/ai/executor.js +60 -44
- package/src/create-quiver/lib/ai/export-state.js +75 -64
- package/src/create-quiver/lib/ai/github.js +24 -21
- package/src/create-quiver/lib/ai/run-state.js +28 -25
- package/src/create-quiver/lib/cli/ux-flags.js +6 -0
- package/src/create-quiver/lib/dashboard.js +939 -0
- package/src/create-quiver/lib/demo.js +14 -12
- package/src/create-quiver/lib/handoff.js +16 -7
- package/src/create-quiver/lib/i18n/catalog.js +152 -0
- package/src/create-quiver/lib/i18n/language.js +279 -0
- package/src/create-quiver/lib/i18n/messages/en.js +853 -0
- package/src/create-quiver/lib/i18n/messages/es.js +968 -0
- package/src/create-quiver/lib/i18n/read-only-format.js +26 -0
- package/src/create-quiver/lib/i18n/templates.js +172 -0
- package/src/create-quiver/lib/init-docs.js +24 -4
- package/src/create-quiver/lib/init-layout.js +8 -0
- package/src/create-quiver/lib/lifecycle.js +53 -46
- package/src/create-quiver/lib/project-state-resolver.js +22 -2
- package/src/create-quiver/lib/readiness.js +77 -67
- package/src/create-quiver/lib/renderers/tree.js +9 -6
- package/src/create-quiver/lib/spec-worktrees.js +34 -30
- package/src/create-quiver/lib/version.js +159 -0
|
@@ -35,6 +35,8 @@ const {
|
|
|
35
35
|
runSpecsList: runAiSpecsList,
|
|
36
36
|
runTraceReport: runAiTraceReport,
|
|
37
37
|
} = require('./commands/ai');
|
|
38
|
+
const { runConfig } = require('./commands/config');
|
|
39
|
+
const { runDashboard } = require('./commands/dashboard');
|
|
38
40
|
const { runDemo } = require('./commands/demo');
|
|
39
41
|
const { runPrepare } = require('./commands/prepare');
|
|
40
42
|
const { runEvidence } = require('./commands/evidence');
|
|
@@ -43,6 +45,7 @@ const { runGraph } = require('./commands/graph');
|
|
|
43
45
|
const { runNext } = require('./commands/next');
|
|
44
46
|
const { runPlan } = require('./commands/plan');
|
|
45
47
|
const { runCreateSpec, runValidateSpec } = require('./commands/spec');
|
|
48
|
+
const { collectVersionReport, formatHumanVersionReport } = require('./lib/version');
|
|
46
49
|
const { buildInitLayout, formatInitLayoutPlan } = require('./lib/init-layout');
|
|
47
50
|
const {
|
|
48
51
|
formatInstallSelfCommand,
|
|
@@ -57,6 +60,16 @@ const { getContextPathExclusionReason } = require('./lib/ai/safety');
|
|
|
57
60
|
const { selectOption } = require('./lib/cli/selectors');
|
|
58
61
|
const { createUx } = require('./lib/cli/ux');
|
|
59
62
|
const { validateUxFlags } = require('./lib/cli/ux-flags');
|
|
63
|
+
const {
|
|
64
|
+
DEFAULT_LANGUAGE,
|
|
65
|
+
extractCliLanguageFlag,
|
|
66
|
+
normalizeLanguage,
|
|
67
|
+
readProjectLanguageConfig,
|
|
68
|
+
resolveLanguage,
|
|
69
|
+
writeProjectLanguageConfig,
|
|
70
|
+
} = require('./lib/i18n/language');
|
|
71
|
+
const { createTranslator, getCatalog, translate } = require('./lib/i18n/catalog');
|
|
72
|
+
const { formatWarningPrefix } = require('./lib/i18n/read-only-format');
|
|
60
73
|
const { relativePosixPath, resolveTargetRoot } = require('./lib/paths');
|
|
61
74
|
const {
|
|
62
75
|
CURRENT_SCAN_RELATIVE_PATH,
|
|
@@ -76,13 +89,67 @@ const {
|
|
|
76
89
|
const cliPackageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../..', 'package.json'), 'utf8'));
|
|
77
90
|
const CLI_VERSION = cliPackageJson.version || '0.0.0';
|
|
78
91
|
|
|
92
|
+
let currentErrorLanguage = DEFAULT_LANGUAGE;
|
|
93
|
+
|
|
94
|
+
function setCurrentErrorLanguage(language) {
|
|
95
|
+
currentErrorLanguage = language || DEFAULT_LANGUAGE;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function localizeParserMessage(message, language = currentErrorLanguage) {
|
|
99
|
+
const raw = String(message || '');
|
|
100
|
+
const missingValue = raw.match(/^missing value for (--[a-z0-9-]+)$/i);
|
|
101
|
+
if (missingValue) {
|
|
102
|
+
return translate(language, 'error.flag.missing_value', { flag: missingValue[1] });
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const invalidValue = raw.match(/^invalid value for (--[a-z0-9-]+)$/i);
|
|
106
|
+
if (invalidValue) {
|
|
107
|
+
return translate(language, 'error.flag.invalid_value', { flag: invalidValue[1] });
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const unknownFlag = raw.match(/^unknown flag: (.+)$/);
|
|
111
|
+
if (unknownFlag) {
|
|
112
|
+
return translate(language, 'error.flag.unknown', { flag: unknownFlag[1] });
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return raw;
|
|
116
|
+
}
|
|
117
|
+
|
|
79
118
|
function formatError(message) {
|
|
80
|
-
return `create-quiver: ${message}`;
|
|
119
|
+
return `create-quiver: ${localizeParserMessage(message)}`;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function helpCatalog(language = DEFAULT_LANGUAGE) {
|
|
123
|
+
const catalog = getCatalog(language);
|
|
124
|
+
return catalog.messages['cli.help'] || getCatalog(DEFAULT_LANGUAGE).messages['cli.help'] || {};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function helpText(help, section, key, fallback) {
|
|
128
|
+
return help?.[section]?.[key] || fallback;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function optionDescription(help, fallback) {
|
|
132
|
+
return helpText(help, 'optionDescriptions', fallback, fallback);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function formatLanguageWarningForCli(warning, language = DEFAULT_LANGUAGE) {
|
|
136
|
+
if (!warning || warning.code !== 'UNSUPPORTED_LANGUAGE') {
|
|
137
|
+
return '';
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return formatError(translate(language, 'warning.language.unsupported_source', {
|
|
141
|
+
fallback: warning.fallbackLanguage,
|
|
142
|
+
language: warning.requestedLanguage,
|
|
143
|
+
source: warning.source,
|
|
144
|
+
supported: warning.supportedLanguages.join(', '),
|
|
145
|
+
}));
|
|
81
146
|
}
|
|
82
147
|
|
|
83
148
|
const SUPPORTED_COMMAND_MODES = new Set([
|
|
84
149
|
'init',
|
|
150
|
+
'version',
|
|
85
151
|
'flow',
|
|
152
|
+
'dashboard',
|
|
86
153
|
'plan',
|
|
87
154
|
'graph',
|
|
88
155
|
'next',
|
|
@@ -97,6 +164,7 @@ const SUPPORTED_COMMAND_MODES = new Set([
|
|
|
97
164
|
'new-handoff',
|
|
98
165
|
'cleanup-slice',
|
|
99
166
|
'check-scope',
|
|
167
|
+
'config',
|
|
100
168
|
'refresh-active-slices',
|
|
101
169
|
'spec',
|
|
102
170
|
'evidence',
|
|
@@ -134,13 +202,16 @@ const SUPPORTED_AI_COMMANDS = new Set([
|
|
|
134
202
|
|
|
135
203
|
const SUPPORTED_SPEC_COMMANDS = new Set(['close', 'create', 'start', 'status', 'validate']);
|
|
136
204
|
const SUPPORTED_DEMO_COMMANDS = new Set(['create']);
|
|
205
|
+
const SUPPORTED_CONFIG_SECTIONS = new Set(['language']);
|
|
206
|
+
const SUPPORTED_CONFIG_LANGUAGE_COMMANDS = new Set(['show', 'set']);
|
|
137
207
|
|
|
138
208
|
function unsupportedCommandMessage(commandName) {
|
|
209
|
+
const translator = createTranslator(currentErrorLanguage);
|
|
139
210
|
return [
|
|
140
|
-
|
|
141
|
-
'
|
|
142
|
-
|
|
143
|
-
'
|
|
211
|
+
translator.t('error.command.unsupported', { commandName }),
|
|
212
|
+
translator.t('error.command.help'),
|
|
213
|
+
translator.t('error.command.init_hint', { commandName }),
|
|
214
|
+
translator.t('error.command.update_hint'),
|
|
144
215
|
].join('\n');
|
|
145
216
|
}
|
|
146
217
|
|
|
@@ -152,6 +223,9 @@ const COMMAND_HELP_GROUPS = [
|
|
|
152
223
|
['analyze', 'Scan the project and write docs/PROJECT_MAP.md plus .quiver scan data.'],
|
|
153
224
|
['doctor', 'Validate the Quiver layout, generated docs, environment, and next safe steps.'],
|
|
154
225
|
['flow', 'Show the read-only guided workflow stage, blockers, and next safe command.'],
|
|
226
|
+
['dashboard', 'Show compact read-only project, spec, slice, run, approval, and agent status.'],
|
|
227
|
+
['version', 'Show a Quiver-branded version report; use --json for metadata.'],
|
|
228
|
+
['config language show|set', 'Inspect or update the effective Quiver language without editing JSON by hand.'],
|
|
155
229
|
['prepare', 'Run setup diagnostics for providers, GitHub, SSH, and project readiness.'],
|
|
156
230
|
['migrate', 'Upgrade an already initialized Quiver project to the current contract.'],
|
|
157
231
|
],
|
|
@@ -234,23 +308,29 @@ const COMMAND_HELP_GROUPS = [
|
|
|
234
308
|
},
|
|
235
309
|
];
|
|
236
310
|
|
|
237
|
-
function formatCommandHelpGroups() {
|
|
238
|
-
const
|
|
311
|
+
function formatCommandHelpGroups(language = DEFAULT_LANGUAGE) {
|
|
312
|
+
const help = helpCatalog(language);
|
|
313
|
+
const lines = [helpText(help, 'headings', 'commands', 'Commands:')];
|
|
239
314
|
for (const group of COMMAND_HELP_GROUPS) {
|
|
240
|
-
lines.push('', `${group.title}:`);
|
|
315
|
+
lines.push('', `${helpText(help, 'groupTitles', group.title, group.title)}:`);
|
|
241
316
|
for (const [command, description] of group.commands) {
|
|
242
|
-
lines.push(` ${command.padEnd(24)} ${description}`);
|
|
317
|
+
lines.push(` ${command.padEnd(24)} ${helpText(help, 'commandDescriptions', command, description)}`);
|
|
243
318
|
}
|
|
244
319
|
}
|
|
245
320
|
return lines.join('\n');
|
|
246
321
|
}
|
|
247
322
|
|
|
248
|
-
function printUsage() {
|
|
249
|
-
|
|
323
|
+
function printUsage(language = DEFAULT_LANGUAGE) {
|
|
324
|
+
const help = helpCatalog(language);
|
|
325
|
+
console.log(`${helpText(help, 'headings', 'usage', 'Usage:')}
|
|
250
326
|
npx create-quiver [options]
|
|
251
327
|
npx create-quiver init [options]
|
|
252
328
|
npx create-quiver analyze [options]
|
|
253
329
|
npx create-quiver flow [options]
|
|
330
|
+
npx create-quiver dashboard [options]
|
|
331
|
+
npx create-quiver version [--json]
|
|
332
|
+
npx create-quiver config language show [--json]
|
|
333
|
+
npx create-quiver config language set <en|es> [--global]
|
|
254
334
|
npx create-quiver plan [options]
|
|
255
335
|
npx create-quiver ai <task> [options]
|
|
256
336
|
npx create-quiver ai run create --input <requirements.md>
|
|
@@ -289,62 +369,75 @@ function printUsage() {
|
|
|
289
369
|
npx create-quiver evidence run [options] -- <command>
|
|
290
370
|
npx create-quiver demo create spec-viewer [options]
|
|
291
371
|
|
|
292
|
-
${formatCommandHelpGroups()}
|
|
293
|
-
|
|
294
|
-
Options:
|
|
295
|
-
-n, --name <project-name> Project name to generate
|
|
296
|
-
-d, --dir <target-dir> Target directory to scaffold into or inspect
|
|
297
|
-
--spec <slug> Restrict plan output to one spec
|
|
298
|
-
--format <name> Graph or AI export output format (tree, mermaid, dot, json, markdown)
|
|
299
|
-
--show-conflicts Show shared file paths in graph output
|
|
300
|
-
--level <n> Restrict graph output to one level
|
|
301
|
-
--json Emit machine-readable JSON
|
|
302
|
-
--
|
|
303
|
-
--
|
|
304
|
-
--
|
|
305
|
-
--
|
|
306
|
-
--
|
|
307
|
-
--
|
|
308
|
-
--
|
|
309
|
-
--
|
|
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
|
-
|
|
372
|
+
${formatCommandHelpGroups(language)}
|
|
373
|
+
|
|
374
|
+
${helpText(help, 'headings', 'options', 'Options:')}
|
|
375
|
+
-n, --name <project-name> ${optionDescription(help, 'Project name to generate')}
|
|
376
|
+
-d, --dir <target-dir> ${optionDescription(help, 'Target directory to scaffold into or inspect')}
|
|
377
|
+
--spec <slug> ${optionDescription(help, 'Restrict plan, graph, next, or dashboard output to one spec')}
|
|
378
|
+
--format <name> ${optionDescription(help, 'Graph or AI export output format (tree, mermaid, dot, json, markdown)')}
|
|
379
|
+
--show-conflicts ${optionDescription(help, 'Show shared file paths in graph output')}
|
|
380
|
+
--level <n> ${optionDescription(help, 'Restrict graph output to one level')}
|
|
381
|
+
--json ${optionDescription(help, 'Emit machine-readable JSON')}
|
|
382
|
+
--lang <en|es> ${optionDescription(help, 'Override CLI human output language')}
|
|
383
|
+
--global ${optionDescription(help, 'For config language set, write the global user config')}
|
|
384
|
+
--include-completed ${optionDescription(help, 'Include completed slices in dashboard, plan, graph, or next history output')}
|
|
385
|
+
--details ${optionDescription(help, 'Show the full human dashboard report')}
|
|
386
|
+
--section <name> ${optionDescription(help, 'Show one human dashboard section')}
|
|
387
|
+
--limit <n> ${optionDescription(help, 'Limit dashboard human lists (1-100)')}
|
|
388
|
+
--only-ready ${optionDescription(help, 'Show only slices with no pending dependencies')}
|
|
389
|
+
--all-ready ${optionDescription(help, 'List every ready slice returned by next')}
|
|
390
|
+
--auto-start ${optionDescription(help, 'Prompt for confirmation and run start-slice on next')}
|
|
391
|
+
--local ${optionDescription(help, 'For check-slice, run structural validation without remote/base checks')}
|
|
392
|
+
--strict ${optionDescription(help, 'Treat supported validation warnings as failures')}
|
|
393
|
+
--unicode ${optionDescription(help, 'Prefer Unicode output when supported')}
|
|
394
|
+
--minimal ${optionDescription(help, 'Plan or run the minimal init profile')}
|
|
395
|
+
--full ${optionDescription(help, 'Plan or run the full compatibility init profile')}
|
|
396
|
+
--legacy-scripts ${optionDescription(help, 'Include legacy Bash wrappers in init profile')}
|
|
397
|
+
--include-templates ${optionDescription(help, 'Export packaged templates in init profile')}
|
|
398
|
+
--dry-run ${optionDescription(help, 'Preview init, analyze, migrate, prepare, spec create/start/close, demo, ai agent set, or AI work without executing writes/providers')}
|
|
399
|
+
--print-prompt ${optionDescription(help, 'Print the exact AI prompt and exit without executing provider CLIs')}
|
|
400
|
+
--with-planner ${optionDescription(help, 'Enable planner-assisted behavior on commands that explicitly support it')}
|
|
401
|
+
--interactive ${optionDescription(help, 'Enable prompts on commands that explicitly support interactive choices')}
|
|
402
|
+
--review ${optionDescription(help, 'Open or prepare human review before persistent writes where supported')}
|
|
403
|
+
--methodology <name> ${optionDescription(help, 'Select methodology where supported (currently wdd-sdd)')}
|
|
404
|
+
--no-color ${optionDescription(help, 'Disable ANSI colors in human output')}
|
|
405
|
+
--fix ${optionDescription(help, 'For doctor, apply safe non-destructive repairs')}
|
|
406
|
+
--execute ${optionDescription(help, 'For ai execute-plan, run the planned slices instead of printing commands')}
|
|
407
|
+
--create ${optionDescription(help, 'For ai pr, create the PR after preflight instead of printing the plan only')}
|
|
408
|
+
--commit ${optionDescription(help, 'For ai execute-slice, commit validated slice changes after provider, scope, and tests pass')}
|
|
409
|
+
--allow-dirty ${optionDescription(help, 'For ai execute-slice, allow pre-existing dirty files and ignore them for scope diff')}
|
|
410
|
+
--mode <name> ${optionDescription(help, 'Execution mode for ai execute-plan (auto, manual, delegated)')}
|
|
411
|
+
--provider <name> ${optionDescription(help, 'Provider CLI to preflight for prepare or AI commands')}
|
|
412
|
+
--model <model-id> ${optionDescription(help, 'Technical model id for AI agent profiles or provider-backed AI commands')}
|
|
413
|
+
--version <n> ${optionDescription(help, 'Draft version to approve for AI planner phases')}
|
|
414
|
+
--run <id> ${optionDescription(help, 'AI lifecycle run id')}
|
|
415
|
+
--ssh-host-alias <name> ${optionDescription(help, 'SSH host alias to validate for prepare or AI commands')}
|
|
416
|
+
--identity-file <path> ${optionDescription(help, 'SSH identity file to validate for prepare or AI commands')}
|
|
417
|
+
--remote <name> ${optionDescription(help, 'Git remote name for check-slice or AI PR checks')}
|
|
418
|
+
--base <branch> ${optionDescription(help, 'Base branch for check-slice, check-scope, ai pr, or spec close (default: main)')}
|
|
419
|
+
--output <file> ${optionDescription(help, 'Output file for evidence run')}
|
|
420
|
+
--max-output <n> ${optionDescription(help, 'Maximum stdout/stderr chars per evidence section')}
|
|
421
|
+
--title <text> ${optionDescription(help, 'Override PR title for ai pr create')}
|
|
422
|
+
-y, --yes ${optionDescription(help, 'Skip prompts and use the provided inputs')}
|
|
423
|
+
-V, --version ${optionDescription(help, 'Show the installed create-quiver version')}
|
|
424
|
+
-h, --help ${optionDescription(help, 'Show this help message')}
|
|
425
|
+
|
|
426
|
+
${helpText(help, 'headings', 'examples', 'Examples:')}
|
|
342
427
|
npx create-quiver init --name "My Project"
|
|
343
428
|
npx create-quiver init --interactive
|
|
344
429
|
npx create-quiver init --name "My Project" --dry-run
|
|
345
430
|
npx create-quiver --name "My Project"
|
|
346
431
|
npx create-quiver --name "My Project" --dir ./my-project
|
|
347
432
|
cd ./my-project && npx create-quiver flow
|
|
433
|
+
cd ./my-project && npx create-quiver dashboard
|
|
434
|
+
cd ./my-project && npx create-quiver dashboard --section slices --limit 10
|
|
435
|
+
cd ./my-project && npx create-quiver dashboard --json
|
|
436
|
+
cd ./my-project && npx create-quiver version
|
|
437
|
+
cd ./my-project && npx create-quiver version --json
|
|
438
|
+
cd ./my-project && npx create-quiver config language show
|
|
439
|
+
cd ./my-project && npx create-quiver config language set es
|
|
440
|
+
npx create-quiver config language set en --global
|
|
348
441
|
cd ./my-project && npx create-quiver analyze
|
|
349
442
|
cd ./my-project && npx create-quiver plan --json
|
|
350
443
|
cd ./my-project && npx create-quiver ai onboard --dry-run
|
|
@@ -412,7 +505,7 @@ Examples:
|
|
|
412
505
|
`);
|
|
413
506
|
}
|
|
414
507
|
|
|
415
|
-
function parseArgs(argv) {
|
|
508
|
+
function parseArgs(argv, options = {}) {
|
|
416
509
|
const result = {
|
|
417
510
|
help: false,
|
|
418
511
|
force: false,
|
|
@@ -432,11 +525,21 @@ function parseArgs(argv) {
|
|
|
432
525
|
strict: false,
|
|
433
526
|
strictOverlap: false,
|
|
434
527
|
json: false,
|
|
528
|
+
language: options.language || '',
|
|
529
|
+
languageResolution: null,
|
|
435
530
|
noColor: false,
|
|
436
531
|
withPlanner: false,
|
|
532
|
+
configGlobal: false,
|
|
533
|
+
configSection: '',
|
|
534
|
+
configCommand: '',
|
|
535
|
+
configValue: '',
|
|
437
536
|
interactive: false,
|
|
438
537
|
review: false,
|
|
439
538
|
includeCompleted: false,
|
|
539
|
+
dashboardDetails: false,
|
|
540
|
+
dashboardSection: '',
|
|
541
|
+
dashboardLimit: null,
|
|
542
|
+
dashboardOptionErrors: [],
|
|
440
543
|
onlyReady: false,
|
|
441
544
|
allReady: false,
|
|
442
545
|
autoStart: false,
|
|
@@ -680,6 +783,11 @@ function parseArgs(argv) {
|
|
|
680
783
|
continue;
|
|
681
784
|
}
|
|
682
785
|
|
|
786
|
+
if (arg === '--global') {
|
|
787
|
+
result.configGlobal = true;
|
|
788
|
+
continue;
|
|
789
|
+
}
|
|
790
|
+
|
|
683
791
|
if (arg === '--with-planner') {
|
|
684
792
|
result.withPlanner = true;
|
|
685
793
|
continue;
|
|
@@ -700,6 +808,33 @@ function parseArgs(argv) {
|
|
|
700
808
|
continue;
|
|
701
809
|
}
|
|
702
810
|
|
|
811
|
+
if (arg === '--details') {
|
|
812
|
+
result.dashboardDetails = true;
|
|
813
|
+
continue;
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
if (arg === '--section') {
|
|
817
|
+
const value = args[index + 1];
|
|
818
|
+
if (!value || String(value).startsWith('--')) {
|
|
819
|
+
result.dashboardOptionErrors.push('missing value for --section');
|
|
820
|
+
continue;
|
|
821
|
+
}
|
|
822
|
+
result.dashboardSection = value;
|
|
823
|
+
index += 1;
|
|
824
|
+
continue;
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
if (arg === '--limit') {
|
|
828
|
+
const value = args[index + 1];
|
|
829
|
+
if (!value || String(value).startsWith('--')) {
|
|
830
|
+
result.dashboardOptionErrors.push('missing value for --limit');
|
|
831
|
+
continue;
|
|
832
|
+
}
|
|
833
|
+
result.dashboardLimit = value;
|
|
834
|
+
index += 1;
|
|
835
|
+
continue;
|
|
836
|
+
}
|
|
837
|
+
|
|
703
838
|
if (arg === '--show-conflicts') {
|
|
704
839
|
result.showConflicts = true;
|
|
705
840
|
continue;
|
|
@@ -1049,6 +1184,36 @@ function parseArgs(argv) {
|
|
|
1049
1184
|
if (positional.length > 0) {
|
|
1050
1185
|
throw new Error(formatError('flow does not accept positional arguments'));
|
|
1051
1186
|
}
|
|
1187
|
+
} else if (result.mode === 'version') {
|
|
1188
|
+
if (positional.length > 0) {
|
|
1189
|
+
throw new Error(formatError('version does not accept positional arguments'));
|
|
1190
|
+
}
|
|
1191
|
+
} else if (result.mode === 'dashboard') {
|
|
1192
|
+
if (positional.length > 0) {
|
|
1193
|
+
throw new Error(formatError('dashboard does not accept positional arguments; use --spec <slug>'));
|
|
1194
|
+
}
|
|
1195
|
+
} else if (result.mode === 'config') {
|
|
1196
|
+
if (!result.configSection && positional.length > 0) {
|
|
1197
|
+
result.configSection = positional.shift();
|
|
1198
|
+
}
|
|
1199
|
+
if (!SUPPORTED_CONFIG_SECTIONS.has(result.configSection)) {
|
|
1200
|
+
throw new Error(formatError(`unsupported config section: ${result.configSection || '(missing)'}. Supported sections: language`));
|
|
1201
|
+
}
|
|
1202
|
+
if (!result.configCommand && positional.length > 0) {
|
|
1203
|
+
result.configCommand = positional.shift();
|
|
1204
|
+
}
|
|
1205
|
+
if (!SUPPORTED_CONFIG_LANGUAGE_COMMANDS.has(result.configCommand)) {
|
|
1206
|
+
throw new Error(formatError(`unsupported config language command: ${result.configCommand || '(missing)'}. Supported commands: show, set`));
|
|
1207
|
+
}
|
|
1208
|
+
if (result.configCommand === 'set') {
|
|
1209
|
+
if (positional.length === 0) {
|
|
1210
|
+
throw new Error(formatError('missing language for config language set. Use: npx create-quiver config language set <en|es>'));
|
|
1211
|
+
}
|
|
1212
|
+
result.configValue = positional.shift();
|
|
1213
|
+
}
|
|
1214
|
+
if (result.configCommand === 'show' && positional.length > 0) {
|
|
1215
|
+
throw new Error(formatError('config language show does not accept a language value'));
|
|
1216
|
+
}
|
|
1052
1217
|
} else if (result.mode === 'ai') {
|
|
1053
1218
|
if (!result.aiCommand && positional.length > 0) {
|
|
1054
1219
|
result.aiCommand = positional.shift();
|
|
@@ -1142,6 +1307,22 @@ function parseArgs(argv) {
|
|
|
1142
1307
|
throw new Error(formatError('too many positional arguments'));
|
|
1143
1308
|
}
|
|
1144
1309
|
|
|
1310
|
+
const requestedDashboardFlags = [];
|
|
1311
|
+
if (result.dashboardDetails) requestedDashboardFlags.push('--details');
|
|
1312
|
+
if (result.dashboardSection || result.dashboardOptionErrors.some((error) => error.includes('--section'))) requestedDashboardFlags.push('--section');
|
|
1313
|
+
if (result.dashboardLimit !== null || result.dashboardOptionErrors.some((error) => error.includes('--limit'))) requestedDashboardFlags.push('--limit');
|
|
1314
|
+
if (result.mode !== 'dashboard' && requestedDashboardFlags.length > 0) {
|
|
1315
|
+
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>' : ''}`));
|
|
1316
|
+
}
|
|
1317
|
+
|
|
1318
|
+
if (result.mode !== 'config' && result.configGlobal) {
|
|
1319
|
+
throw new Error(formatError('--global is only supported by config language set. Use: npx create-quiver config language set <en|es> --global'));
|
|
1320
|
+
}
|
|
1321
|
+
|
|
1322
|
+
if (result.mode === 'config' && result.configGlobal && result.configCommand !== 'set') {
|
|
1323
|
+
throw new Error(formatError('--global is only supported by config language set. Use: npx create-quiver config language set <en|es> --global'));
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1145
1326
|
return result;
|
|
1146
1327
|
}
|
|
1147
1328
|
|
|
@@ -1286,6 +1467,7 @@ function runInitDocs(repoRoot, projectName, options = {}) {
|
|
|
1286
1467
|
migrateMode: false,
|
|
1287
1468
|
profile: options.profile || 'default',
|
|
1288
1469
|
templateRoot: templateRoot.path,
|
|
1470
|
+
language: options.language || '',
|
|
1289
1471
|
});
|
|
1290
1472
|
}
|
|
1291
1473
|
|
|
@@ -2141,6 +2323,7 @@ function writeProjectScanArtifacts(projectRoot, scan) {
|
|
|
2141
2323
|
|
|
2142
2324
|
function runAnalyze(targetDir, options = {}) {
|
|
2143
2325
|
const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
|
|
2326
|
+
const translator = createTranslator(options.language);
|
|
2144
2327
|
|
|
2145
2328
|
if (!fs.existsSync(projectRoot)) {
|
|
2146
2329
|
throw new Error(formatError(`target directory does not exist: ${projectRoot}`));
|
|
@@ -2149,14 +2332,14 @@ function runAnalyze(targetDir, options = {}) {
|
|
|
2149
2332
|
const scan = buildProjectScan(projectRoot);
|
|
2150
2333
|
|
|
2151
2334
|
if (options.dryRun) {
|
|
2152
|
-
console.log(
|
|
2153
|
-
console.log('
|
|
2154
|
-
console.log(
|
|
2155
|
-
console.log(
|
|
2156
|
-
console.log('
|
|
2157
|
-
console.log(
|
|
2158
|
-
console.log(
|
|
2159
|
-
console.log(
|
|
2335
|
+
console.log(translator.t('analyze.dry_run_for', { path: projectRoot }));
|
|
2336
|
+
console.log(translator.t('analyze.writes_none'));
|
|
2337
|
+
console.log(translator.t('analyze.would_write', { path: CURRENT_SCAN_RELATIVE_PATH }));
|
|
2338
|
+
console.log(translator.t('analyze.would_write', { path: PROJECT_MAP_RELATIVE_PATH }));
|
|
2339
|
+
console.log(translator.t('analyze.would_refresh', { path: 'docs/AI_CONTEXT.md' }));
|
|
2340
|
+
console.log(translator.t('analyze.detected_primary_stack', { stack: scan.stack.primary }));
|
|
2341
|
+
console.log(translator.t('analyze.detected_frameworks', { frameworks: scan.stack.frameworks.length > 0 ? scan.stack.frameworks.join(', ') : translator.t('common.none_detected') }));
|
|
2342
|
+
console.log(translator.t('analyze.detected_package_manager', { manager: scan.project.package_manager }));
|
|
2160
2343
|
return {
|
|
2161
2344
|
artifacts: {
|
|
2162
2345
|
jsonPath: path.join(projectRoot, CURRENT_SCAN_RELATIVE_PATH),
|
|
@@ -2171,12 +2354,12 @@ function runAnalyze(targetDir, options = {}) {
|
|
|
2171
2354
|
const aiContextPath = refreshAiContextDoc(projectRoot, scan);
|
|
2172
2355
|
updateStateForAnalyze(projectRoot, CLI_VERSION);
|
|
2173
2356
|
|
|
2174
|
-
console.log(
|
|
2175
|
-
console.log(
|
|
2176
|
-
console.log(
|
|
2177
|
-
console.log(
|
|
2178
|
-
console.log(
|
|
2179
|
-
console.log(
|
|
2357
|
+
console.log(translator.t('analyze.completed_for', { path: projectRoot }));
|
|
2358
|
+
console.log(translator.t('analyze.wrote', { path: relativePosixPath(projectRoot, artifacts.jsonPath) }));
|
|
2359
|
+
console.log(translator.t('analyze.wrote', { path: relativePosixPath(projectRoot, artifacts.mdPath) }));
|
|
2360
|
+
console.log(translator.t('analyze.wrote', { path: relativePosixPath(projectRoot, aiContextPath) }));
|
|
2361
|
+
console.log(translator.t('analyze.detected_primary_stack', { stack: scan.stack.primary }));
|
|
2362
|
+
console.log(translator.t('analyze.detected_package_manager', { manager: scan.project.package_manager }));
|
|
2180
2363
|
|
|
2181
2364
|
return {
|
|
2182
2365
|
artifacts,
|
|
@@ -2188,6 +2371,7 @@ function runAnalyze(targetDir, options = {}) {
|
|
|
2188
2371
|
|
|
2189
2372
|
function runMigrate(targetDir, options = {}) {
|
|
2190
2373
|
const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
|
|
2374
|
+
const translator = createTranslator(options.language);
|
|
2191
2375
|
|
|
2192
2376
|
if (!fs.existsSync(projectRoot)) {
|
|
2193
2377
|
throw new Error(formatError(`target directory does not exist: ${projectRoot}`));
|
|
@@ -2210,17 +2394,17 @@ function runMigrate(targetDir, options = {}) {
|
|
|
2210
2394
|
projectName,
|
|
2211
2395
|
skipInstall: options.skipInstall === true,
|
|
2212
2396
|
});
|
|
2213
|
-
console.log('
|
|
2214
|
-
console.log(`-
|
|
2215
|
-
console.log(`-
|
|
2216
|
-
console.log(
|
|
2217
|
-
console.log(`-
|
|
2218
|
-
console.log(`-
|
|
2219
|
-
console.log(`-
|
|
2397
|
+
console.log(translator.t('migrate.dry_run_title'));
|
|
2398
|
+
console.log(`- ${translator.t('migrate.project', { project: projectName })}`);
|
|
2399
|
+
console.log(`- ${translator.t('migrate.target', { path: projectRoot })}`);
|
|
2400
|
+
console.log(`- ${translator.t('migrate.writes_none')}`);
|
|
2401
|
+
console.log(`- ${translator.t('migrate.planned_create', { count: migrationPlan.summary.create })}`);
|
|
2402
|
+
console.log(`- ${translator.t('migrate.planned_update', { count: migrationPlan.summary.update })}`);
|
|
2403
|
+
console.log(`- ${translator.t('migrate.planned_preserve', { count: migrationPlan.summary.preserve })}`);
|
|
2220
2404
|
if (legacyLayout.hasLegacyLayout) {
|
|
2221
|
-
console.log(`-
|
|
2405
|
+
console.log(`- ${translator.t('migrate.legacy_preserved', { paths: legacyLayout.legacyPaths.join(', ') })}`);
|
|
2222
2406
|
}
|
|
2223
|
-
console.log('
|
|
2407
|
+
console.log(`- ${translator.t('migrate.next_command', { command: 'npx create-quiver migrate --skip-install' })}`);
|
|
2224
2408
|
console.log('');
|
|
2225
2409
|
console.log(formatInitLayoutPlan(migrationPlan));
|
|
2226
2410
|
return;
|
|
@@ -2251,10 +2435,10 @@ function runMigrate(targetDir, options = {}) {
|
|
|
2251
2435
|
}
|
|
2252
2436
|
}
|
|
2253
2437
|
|
|
2254
|
-
console.log(
|
|
2255
|
-
console.log('
|
|
2438
|
+
console.log(translator.t('migrate.completed_for', { path: projectRoot }));
|
|
2439
|
+
console.log(translator.t('migrate.restored_missing'));
|
|
2256
2440
|
if (legacyLayout.hasLegacyLayout) {
|
|
2257
|
-
console.log(
|
|
2441
|
+
console.log(translator.t('migrate.legacy_preserved', { paths: legacyLayout.legacyPaths.join(', ') }));
|
|
2258
2442
|
}
|
|
2259
2443
|
} finally {
|
|
2260
2444
|
fs.rmSync(tempRoot, { recursive: true, force: true });
|
|
@@ -2495,6 +2679,7 @@ function buildDoctorCommandReport(projectRoot) {
|
|
|
2495
2679
|
}
|
|
2496
2680
|
|
|
2497
2681
|
function formatDoctorHumanReport(report, options = {}) {
|
|
2682
|
+
const translator = createTranslator(options.language);
|
|
2498
2683
|
const lines = [];
|
|
2499
2684
|
const ux = createUx({
|
|
2500
2685
|
...options,
|
|
@@ -2511,19 +2696,39 @@ function formatDoctorHumanReport(report, options = {}) {
|
|
|
2511
2696
|
if (status === 'error') return 'error';
|
|
2512
2697
|
return 'warning';
|
|
2513
2698
|
};
|
|
2699
|
+
const localizeDoctorText = (message) => {
|
|
2700
|
+
const text = String(message || '');
|
|
2701
|
+
let match = text.match(/^Quiver doctor passed for (.+)$/);
|
|
2702
|
+
if (match) return translator.t('doctor.check.passed_for', { path: match[1] });
|
|
2703
|
+
match = text.match(/^Layout: (.+)$/);
|
|
2704
|
+
if (match) return translator.t('doctor.check.layout', { layout: match[1] });
|
|
2705
|
+
if (text === 'Specs: none yet') return translator.t('doctor.check.specs_none');
|
|
2706
|
+
match = text.match(/^Specs: (.+)$/);
|
|
2707
|
+
if (match) return translator.t('doctor.check.specs_found', { specs: match[1] });
|
|
2708
|
+
if (text === 'Required files found') return translator.t('doctor.check.required_files_found');
|
|
2709
|
+
if (text === 'Workflow scripts available') return translator.t('doctor.check.workflow_scripts_available');
|
|
2710
|
+
if (text === 'Quiver state metadata found') return translator.t('doctor.check.state_found');
|
|
2711
|
+
if (text === 'Project analysis artifacts found') return translator.t('doctor.check.project_analysis_found');
|
|
2712
|
+
if (text === 'No specs yet. That is valid after the AI-first init flow.') return translator.t('doctor.fix.no_specs_yet');
|
|
2713
|
+
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');
|
|
2714
|
+
if (text === 'Analyze the project first: npx create-quiver analyze') return translator.t('doctor.fix.analyze_first');
|
|
2715
|
+
if (text === 'Check the next ready slice: npx create-quiver next') return translator.t('doctor.fix.check_next');
|
|
2716
|
+
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');
|
|
2717
|
+
return formatWarningPrefix(text, translator);
|
|
2718
|
+
};
|
|
2514
2719
|
|
|
2515
|
-
ux.section('
|
|
2720
|
+
ux.section(translator.t('doctor.title'));
|
|
2516
2721
|
ux.line('');
|
|
2517
|
-
ux.line('
|
|
2722
|
+
ux.line(translator.t('doctor.checks'));
|
|
2518
2723
|
for (const check of report.checks) {
|
|
2519
|
-
const line = ` ${symbolForStatus(check.status)} ${check.message}`;
|
|
2724
|
+
const line = ` ${symbolForStatus(check.status)} ${localizeDoctorText(check.message)}`;
|
|
2520
2725
|
ux.line(ux.mode.decoration ? ux.theme.status(colorForStatus(check.status), line) : line);
|
|
2521
2726
|
}
|
|
2522
2727
|
|
|
2523
2728
|
ux.line('');
|
|
2524
|
-
ux.line('
|
|
2729
|
+
ux.line(translator.t('doctor.suggested_fixes'));
|
|
2525
2730
|
for (const fix of report.suggested_fixes) {
|
|
2526
|
-
const line = ` ${ux.theme.symbols.bullet} ${fix}`;
|
|
2731
|
+
const line = ` ${ux.theme.symbols.bullet} ${localizeDoctorText(fix)}`;
|
|
2527
2732
|
ux.line(ux.mode.decoration ? ux.theme.status('command', line) : line);
|
|
2528
2733
|
}
|
|
2529
2734
|
|
|
@@ -2577,6 +2782,74 @@ const INIT_PROFILE_OPTIONS = Object.freeze([
|
|
|
2577
2782
|
},
|
|
2578
2783
|
]);
|
|
2579
2784
|
|
|
2785
|
+
function initModeOptions(translator) {
|
|
2786
|
+
return [
|
|
2787
|
+
{
|
|
2788
|
+
label: translator.t('init.mode.existing.label'),
|
|
2789
|
+
value: 'existing',
|
|
2790
|
+
hint: translator.t('init.mode.existing.hint'),
|
|
2791
|
+
default: true,
|
|
2792
|
+
},
|
|
2793
|
+
{
|
|
2794
|
+
label: translator.t('init.mode.new.label'),
|
|
2795
|
+
value: 'new',
|
|
2796
|
+
hint: translator.t('init.mode.new.hint'),
|
|
2797
|
+
},
|
|
2798
|
+
{
|
|
2799
|
+
label: translator.t('init.mode.validate.label'),
|
|
2800
|
+
value: 'validate',
|
|
2801
|
+
hint: translator.t('init.mode.validate.hint'),
|
|
2802
|
+
},
|
|
2803
|
+
];
|
|
2804
|
+
}
|
|
2805
|
+
|
|
2806
|
+
function methodologyOptions(translator) {
|
|
2807
|
+
return [
|
|
2808
|
+
{
|
|
2809
|
+
label: translator.t('init.methodology.wdd_sdd.label'),
|
|
2810
|
+
value: 'wdd-sdd',
|
|
2811
|
+
hint: translator.t('init.methodology.wdd_sdd.hint'),
|
|
2812
|
+
default: true,
|
|
2813
|
+
},
|
|
2814
|
+
];
|
|
2815
|
+
}
|
|
2816
|
+
|
|
2817
|
+
function initProfileOptions(translator) {
|
|
2818
|
+
return [
|
|
2819
|
+
{
|
|
2820
|
+
label: 'Default',
|
|
2821
|
+
value: 'default',
|
|
2822
|
+
hint: translator.t('init.profile.default.hint'),
|
|
2823
|
+
default: true,
|
|
2824
|
+
},
|
|
2825
|
+
{
|
|
2826
|
+
label: 'Minimal',
|
|
2827
|
+
value: 'minimal',
|
|
2828
|
+
hint: translator.t('init.profile.minimal.hint'),
|
|
2829
|
+
},
|
|
2830
|
+
{
|
|
2831
|
+
label: 'Full compatibility',
|
|
2832
|
+
value: 'full',
|
|
2833
|
+
hint: translator.t('init.profile.full.hint'),
|
|
2834
|
+
},
|
|
2835
|
+
];
|
|
2836
|
+
}
|
|
2837
|
+
|
|
2838
|
+
function initLanguageOptions() {
|
|
2839
|
+
return [
|
|
2840
|
+
{
|
|
2841
|
+
label: 'English',
|
|
2842
|
+
value: 'en',
|
|
2843
|
+
hint: 'en',
|
|
2844
|
+
},
|
|
2845
|
+
{
|
|
2846
|
+
label: 'Español',
|
|
2847
|
+
value: 'es',
|
|
2848
|
+
hint: 'es',
|
|
2849
|
+
},
|
|
2850
|
+
];
|
|
2851
|
+
}
|
|
2852
|
+
|
|
2580
2853
|
function hasDirectoryContent(dirPath) {
|
|
2581
2854
|
return fs.existsSync(dirPath)
|
|
2582
2855
|
&& fs.statSync(dirPath).isDirectory()
|
|
@@ -2594,8 +2867,16 @@ function assertSupportedMethodology(value) {
|
|
|
2594
2867
|
return normalized;
|
|
2595
2868
|
}
|
|
2596
2869
|
|
|
2870
|
+
function resolveExistingProjectLanguage(targetDir) {
|
|
2871
|
+
const config = readProjectLanguageConfig(targetDir);
|
|
2872
|
+
return normalizeLanguage(config.language);
|
|
2873
|
+
}
|
|
2874
|
+
|
|
2597
2875
|
async function resolveInteractiveInitOptions(args, targetDir, projectName, options = {}) {
|
|
2598
2876
|
const explicitMethodology = assertSupportedMethodology(args.methodology);
|
|
2877
|
+
const language = normalizeLanguage(options.language || args.language) || DEFAULT_LANGUAGE;
|
|
2878
|
+
const translator = createTranslator(language);
|
|
2879
|
+
const existingProjectLanguage = resolveExistingProjectLanguage(targetDir);
|
|
2599
2880
|
|
|
2600
2881
|
if (args.interactive !== true) {
|
|
2601
2882
|
return {
|
|
@@ -2606,6 +2887,7 @@ async function resolveInteractiveInitOptions(args, targetDir, projectName, optio
|
|
|
2606
2887
|
methodology: explicitMethodology,
|
|
2607
2888
|
minimal: args.initMinimal,
|
|
2608
2889
|
projectName,
|
|
2890
|
+
language: '',
|
|
2609
2891
|
};
|
|
2610
2892
|
}
|
|
2611
2893
|
|
|
@@ -2639,58 +2921,66 @@ async function resolveInteractiveInitOptions(args, targetDir, projectName, optio
|
|
|
2639
2921
|
stdoutIsTTY: options.stdoutIsTTY,
|
|
2640
2922
|
};
|
|
2641
2923
|
|
|
2642
|
-
ux.heading('
|
|
2643
|
-
const selectedMode = await selectOption('
|
|
2924
|
+
ux.heading(translator.t('init.heading'));
|
|
2925
|
+
const selectedMode = await selectOption(translator.t('init.prompt.mode'), initModeOptions(translator), {
|
|
2644
2926
|
...selectorOptions,
|
|
2645
2927
|
defaultValue: hasDirectoryContent(targetDir) ? 'existing' : 'new',
|
|
2646
2928
|
flag: 'init|doctor',
|
|
2647
2929
|
name: 'init mode',
|
|
2648
2930
|
});
|
|
2649
|
-
const selectedMethodology = await selectOption('
|
|
2931
|
+
const selectedMethodology = await selectOption(translator.t('init.prompt.methodology'), methodologyOptions(translator), {
|
|
2650
2932
|
...selectorOptions,
|
|
2651
2933
|
defaultValue: explicitMethodology,
|
|
2652
2934
|
flag: '--methodology',
|
|
2653
2935
|
name: 'methodology',
|
|
2654
2936
|
value: args.methodology || '',
|
|
2655
2937
|
});
|
|
2938
|
+
const selectedLanguage = await selectOption(translator.t('init.prompt.language'), initLanguageOptions(), {
|
|
2939
|
+
...selectorOptions,
|
|
2940
|
+
defaultValue: existingProjectLanguage || language,
|
|
2941
|
+
flag: '--lang|config language set',
|
|
2942
|
+
name: 'project language',
|
|
2943
|
+
});
|
|
2656
2944
|
|
|
2657
2945
|
assertSupportedMethodology(selectedMethodology.value);
|
|
2658
2946
|
|
|
2659
2947
|
if (selectedMode.value === 'validate') {
|
|
2660
2948
|
ux.summary([
|
|
2661
|
-
{ label: '
|
|
2662
|
-
{ label: '
|
|
2663
|
-
{ label: '
|
|
2664
|
-
|
|
2949
|
+
{ label: translator.t('init.summary.mode'), value: selectedMode.label },
|
|
2950
|
+
{ label: translator.t('init.summary.methodology'), value: selectedMethodology.label },
|
|
2951
|
+
{ label: translator.t('init.summary.language'), value: selectedLanguage.value },
|
|
2952
|
+
{ label: translator.t('init.summary.equivalent_command'), value: 'npx create-quiver doctor' },
|
|
2953
|
+
], { title: translator.t('init.summary.title') });
|
|
2665
2954
|
if (!args.force && !args.dryRun) {
|
|
2666
|
-
const confirmed = await ux.promptConfirm('
|
|
2955
|
+
const confirmed = await ux.promptConfirm(translator.t('init.confirm.doctor'), { initialValue: true });
|
|
2667
2956
|
if (!confirmed) {
|
|
2668
2957
|
throw new Error(formatError('init interactive validation declined. No files were written.'));
|
|
2669
2958
|
}
|
|
2670
2959
|
}
|
|
2671
2960
|
return {
|
|
2672
2961
|
action: 'doctor',
|
|
2962
|
+
language: selectedLanguage.value,
|
|
2673
2963
|
methodology: selectedMethodology.value,
|
|
2674
2964
|
projectName,
|
|
2675
2965
|
};
|
|
2676
2966
|
}
|
|
2677
2967
|
|
|
2678
2968
|
const defaultProfile = args.initFull ? 'full' : args.initMinimal ? 'minimal' : 'default';
|
|
2679
|
-
const selectedProfile = await selectOption('
|
|
2969
|
+
const selectedProfile = await selectOption(translator.t('init.prompt.profile'), initProfileOptions(translator), {
|
|
2680
2970
|
...selectorOptions,
|
|
2681
2971
|
defaultValue: defaultProfile,
|
|
2682
2972
|
flag: '--minimal|--full',
|
|
2683
2973
|
name: 'init profile',
|
|
2684
2974
|
});
|
|
2685
|
-
const agentGuidance = await selectOption('
|
|
2975
|
+
const agentGuidance = await selectOption(translator.t('init.prompt.agent_guidance'), [
|
|
2686
2976
|
{
|
|
2687
|
-
label: '
|
|
2977
|
+
label: translator.t('init.agent_guidance.show.label'),
|
|
2688
2978
|
value: 'show',
|
|
2689
|
-
hint: '
|
|
2979
|
+
hint: translator.t('init.agent_guidance.show.hint'),
|
|
2690
2980
|
default: true,
|
|
2691
2981
|
},
|
|
2692
2982
|
{
|
|
2693
|
-
label: '
|
|
2983
|
+
label: translator.t('init.agent_guidance.skip.label'),
|
|
2694
2984
|
value: 'skip',
|
|
2695
2985
|
},
|
|
2696
2986
|
], {
|
|
@@ -2703,28 +2993,30 @@ async function resolveInteractiveInitOptions(args, targetDir, projectName, optio
|
|
|
2703
2993
|
full: selectedProfile.value === 'full',
|
|
2704
2994
|
includeTemplates: args.initIncludeTemplates || selectedProfile.value === 'full',
|
|
2705
2995
|
legacyScripts: args.initLegacyScripts,
|
|
2996
|
+
language: selectedLanguage.value,
|
|
2706
2997
|
methodology: selectedMethodology.value,
|
|
2707
2998
|
minimal: selectedProfile.value === 'minimal',
|
|
2708
2999
|
projectName,
|
|
2709
3000
|
};
|
|
2710
3001
|
|
|
2711
3002
|
ux.summary([
|
|
2712
|
-
{ label: '
|
|
2713
|
-
{ label: '
|
|
2714
|
-
{ label: '
|
|
2715
|
-
{ label: '
|
|
2716
|
-
{ label: '
|
|
2717
|
-
|
|
3003
|
+
{ label: translator.t('init.summary.project'), value: projectName },
|
|
3004
|
+
{ label: translator.t('init.summary.mode'), value: selectedMode.label },
|
|
3005
|
+
{ label: translator.t('init.summary.methodology'), value: selectedMethodology.label },
|
|
3006
|
+
{ label: translator.t('init.summary.language'), value: selectedLanguage.value },
|
|
3007
|
+
{ label: translator.t('init.summary.profile'), value: selectedProfile.label },
|
|
3008
|
+
{ 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') },
|
|
3009
|
+
], { title: translator.t('init.summary.title') });
|
|
2718
3010
|
|
|
2719
3011
|
if (agentGuidance.value === 'show') {
|
|
2720
3012
|
ux.nextSteps([
|
|
2721
3013
|
'npx create-quiver ai agent set planner --provider codex --model gpt-5.5 --dry-run',
|
|
2722
3014
|
'npx create-quiver ai agent set executor --provider claude --model claude-sonnet-4-6 --dry-run',
|
|
2723
|
-
], { title: '
|
|
3015
|
+
], { title: translator.t('init.next_steps.after_init') });
|
|
2724
3016
|
}
|
|
2725
3017
|
|
|
2726
3018
|
if (!args.force && !args.dryRun) {
|
|
2727
|
-
const confirmed = await ux.promptConfirm(
|
|
3019
|
+
const confirmed = await ux.promptConfirm(translator.t('init.confirm.initialize', { path: targetDir }), { initialValue: true });
|
|
2728
3020
|
if (!confirmed) {
|
|
2729
3021
|
throw new Error(formatError('init interactive approval declined. No files were written.'));
|
|
2730
3022
|
}
|
|
@@ -2736,6 +3028,46 @@ async function resolveInteractiveInitOptions(args, targetDir, projectName, optio
|
|
|
2736
3028
|
};
|
|
2737
3029
|
}
|
|
2738
3030
|
|
|
3031
|
+
function persistInitLanguage(targetDir, initOptions = {}) {
|
|
3032
|
+
if (!initOptions.language) {
|
|
3033
|
+
return null;
|
|
3034
|
+
}
|
|
3035
|
+
writeProjectLanguageConfig(targetDir, initOptions.language);
|
|
3036
|
+
return {
|
|
3037
|
+
language: initOptions.language,
|
|
3038
|
+
path: path.join(targetDir, '.quiver', 'config.json'),
|
|
3039
|
+
};
|
|
3040
|
+
}
|
|
3041
|
+
|
|
3042
|
+
function resolveInitGeneratedLanguage(args, targetDir, initOptions = {}) {
|
|
3043
|
+
if (initOptions.language) {
|
|
3044
|
+
return {
|
|
3045
|
+
configLanguage: initOptions.language,
|
|
3046
|
+
docsLanguage: initOptions.language,
|
|
3047
|
+
};
|
|
3048
|
+
}
|
|
3049
|
+
|
|
3050
|
+
if (args.languageResolution?.source === '--lang') {
|
|
3051
|
+
return {
|
|
3052
|
+
configLanguage: args.language,
|
|
3053
|
+
docsLanguage: args.language,
|
|
3054
|
+
};
|
|
3055
|
+
}
|
|
3056
|
+
|
|
3057
|
+
const existingProjectLanguage = resolveExistingProjectLanguage(targetDir);
|
|
3058
|
+
if (existingProjectLanguage) {
|
|
3059
|
+
return {
|
|
3060
|
+
configLanguage: existingProjectLanguage,
|
|
3061
|
+
docsLanguage: existingProjectLanguage,
|
|
3062
|
+
};
|
|
3063
|
+
}
|
|
3064
|
+
|
|
3065
|
+
return {
|
|
3066
|
+
configLanguage: '',
|
|
3067
|
+
docsLanguage: args.language || DEFAULT_LANGUAGE,
|
|
3068
|
+
};
|
|
3069
|
+
}
|
|
3070
|
+
|
|
2739
3071
|
function runDoctor(targetDir, options = {}) {
|
|
2740
3072
|
const projectRoot = resolveTargetRoot(process.cwd(), targetDir);
|
|
2741
3073
|
|
|
@@ -2774,6 +3106,7 @@ function runDoctor(targetDir, options = {}) {
|
|
|
2774
3106
|
console.log(JSON.stringify(commandReport, null, 2));
|
|
2775
3107
|
} else {
|
|
2776
3108
|
process.stdout.write(formatDoctorHumanReport(commandReport, {
|
|
3109
|
+
language: options.language,
|
|
2777
3110
|
noColor: options.noColor,
|
|
2778
3111
|
unicode: options.unicode,
|
|
2779
3112
|
}));
|
|
@@ -2784,38 +3117,75 @@ function runDoctor(targetDir, options = {}) {
|
|
|
2784
3117
|
}
|
|
2785
3118
|
}
|
|
2786
3119
|
|
|
2787
|
-
function printInitNextSteps(targetDir, projectName) {
|
|
3120
|
+
function printInitNextSteps(targetDir, projectName, options = {}) {
|
|
3121
|
+
const translator = createTranslator(options.language);
|
|
2788
3122
|
console.log('');
|
|
2789
|
-
console.log('
|
|
2790
|
-
console.log(`-
|
|
2791
|
-
console.log(`-
|
|
2792
|
-
console.log('
|
|
2793
|
-
console.log(
|
|
3123
|
+
console.log(translator.t('init.next_steps.title'));
|
|
3124
|
+
console.log(`- ${translator.t('init.next_steps.review_agents', { path: path.join(targetDir, 'docs', 'AI_ONBOARDING_PROMPT.md') })}`);
|
|
3125
|
+
console.log(`- ${translator.t('init.next_steps.review_workflow', { path: path.join(targetDir, 'docs', 'WORKFLOW.md') })}`);
|
|
3126
|
+
console.log(`- ${translator.t('init.next_steps.analyze')}`);
|
|
3127
|
+
console.log(`- ${translator.t('init.next_steps.create_specs')}`);
|
|
2794
3128
|
}
|
|
2795
3129
|
|
|
2796
3130
|
async function run(argv) {
|
|
2797
|
-
|
|
2798
|
-
|
|
3131
|
+
let languageArgs;
|
|
3132
|
+
try {
|
|
3133
|
+
languageArgs = extractCliLanguageFlag(argv);
|
|
3134
|
+
} catch (error) {
|
|
3135
|
+
const languageResolution = resolveLanguage({
|
|
3136
|
+
env: process.env,
|
|
3137
|
+
projectRoot: process.cwd(),
|
|
3138
|
+
});
|
|
3139
|
+
setCurrentErrorLanguage(languageResolution.language);
|
|
3140
|
+
throw new Error(formatError(error.message));
|
|
3141
|
+
}
|
|
3142
|
+
|
|
3143
|
+
const normalizedArgv = languageArgs.argv;
|
|
3144
|
+
const languageResolution = resolveLanguage({
|
|
3145
|
+
cliLanguage: languageArgs.language,
|
|
3146
|
+
env: process.env,
|
|
3147
|
+
projectRoot: process.cwd(),
|
|
3148
|
+
});
|
|
3149
|
+
setCurrentErrorLanguage(languageResolution.language);
|
|
3150
|
+
|
|
3151
|
+
if (normalizedArgv.length === 1 && normalizedArgv[0] === 'help') {
|
|
3152
|
+
printUsage(languageResolution.language);
|
|
2799
3153
|
return;
|
|
2800
3154
|
}
|
|
2801
3155
|
|
|
2802
|
-
if (
|
|
3156
|
+
if (normalizedArgv.length === 1 && (normalizedArgv[0] === '-V' || normalizedArgv[0] === '--version')) {
|
|
2803
3157
|
console.log(CLI_VERSION);
|
|
2804
3158
|
return;
|
|
2805
3159
|
}
|
|
2806
3160
|
|
|
2807
|
-
const args = parseArgs(
|
|
3161
|
+
const args = parseArgs(normalizedArgv, {
|
|
3162
|
+
language: languageArgs.language,
|
|
3163
|
+
});
|
|
3164
|
+
args.languageResolution = languageResolution;
|
|
3165
|
+
args.language = args.languageResolution.language;
|
|
2808
3166
|
|
|
2809
3167
|
if (args.help) {
|
|
2810
|
-
|
|
3168
|
+
if (!args.json) {
|
|
3169
|
+
for (const warning of args.languageResolution.warnings || []) {
|
|
3170
|
+
process.stderr.write(`${formatLanguageWarningForCli(warning, args.language)}\n`);
|
|
3171
|
+
}
|
|
3172
|
+
}
|
|
3173
|
+
printUsage(args.language);
|
|
2811
3174
|
return;
|
|
2812
3175
|
}
|
|
2813
3176
|
|
|
2814
3177
|
validateUxFlags(args);
|
|
2815
3178
|
|
|
3179
|
+
if (!args.json) {
|
|
3180
|
+
for (const warning of args.languageResolution.warnings || []) {
|
|
3181
|
+
process.stderr.write(`${formatLanguageWarningForCli(warning, args.language)}\n`);
|
|
3182
|
+
}
|
|
3183
|
+
}
|
|
3184
|
+
|
|
2816
3185
|
if (args.mode === 'analyze') {
|
|
2817
3186
|
runAnalyze(args.targetDir, {
|
|
2818
3187
|
dryRun: args.dryRun,
|
|
3188
|
+
language: args.language,
|
|
2819
3189
|
});
|
|
2820
3190
|
return;
|
|
2821
3191
|
}
|
|
@@ -2823,6 +3193,52 @@ async function run(argv) {
|
|
|
2823
3193
|
if (args.mode === 'flow') {
|
|
2824
3194
|
await runFlow(process.cwd(), {
|
|
2825
3195
|
json: args.json,
|
|
3196
|
+
language: args.language,
|
|
3197
|
+
});
|
|
3198
|
+
return;
|
|
3199
|
+
}
|
|
3200
|
+
|
|
3201
|
+
if (args.mode === 'dashboard') {
|
|
3202
|
+
runDashboard(process.cwd(), {
|
|
3203
|
+
details: args.dashboardDetails,
|
|
3204
|
+
includeCompleted: args.includeCompleted,
|
|
3205
|
+
json: args.json,
|
|
3206
|
+
language: args.language,
|
|
3207
|
+
limit: args.dashboardLimit,
|
|
3208
|
+
noColor: args.noColor,
|
|
3209
|
+
optionErrors: args.dashboardOptionErrors,
|
|
3210
|
+
section: args.dashboardSection,
|
|
3211
|
+
specSlug: args.specSlug,
|
|
3212
|
+
});
|
|
3213
|
+
return;
|
|
3214
|
+
}
|
|
3215
|
+
|
|
3216
|
+
if (args.mode === 'version') {
|
|
3217
|
+
const report = collectVersionReport(process.cwd(), {
|
|
3218
|
+
cliVersion: CLI_VERSION,
|
|
3219
|
+
env: process.env,
|
|
3220
|
+
});
|
|
3221
|
+
if (args.json) {
|
|
3222
|
+
process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
|
|
3223
|
+
} else {
|
|
3224
|
+
process.stdout.write(formatHumanVersionReport(report, {
|
|
3225
|
+
env: process.env,
|
|
3226
|
+
language: args.language,
|
|
3227
|
+
noColor: args.noColor,
|
|
3228
|
+
stdoutIsTTY: Boolean(process.stdout.isTTY),
|
|
3229
|
+
}));
|
|
3230
|
+
}
|
|
3231
|
+
return;
|
|
3232
|
+
}
|
|
3233
|
+
|
|
3234
|
+
if (args.mode === 'config') {
|
|
3235
|
+
runConfig(process.cwd(), {
|
|
3236
|
+
command: args.configCommand,
|
|
3237
|
+
global: args.configGlobal,
|
|
3238
|
+
json: args.json,
|
|
3239
|
+
languageResolution: args.languageResolution,
|
|
3240
|
+
section: args.configSection,
|
|
3241
|
+
value: args.configValue,
|
|
2826
3242
|
});
|
|
2827
3243
|
return;
|
|
2828
3244
|
}
|
|
@@ -2831,6 +3247,7 @@ async function run(argv) {
|
|
|
2831
3247
|
runPlan(process.cwd(), {
|
|
2832
3248
|
includeCompleted: args.includeCompleted,
|
|
2833
3249
|
json: args.json,
|
|
3250
|
+
language: args.language,
|
|
2834
3251
|
onlyReady: args.onlyReady,
|
|
2835
3252
|
specSlug: args.specSlug,
|
|
2836
3253
|
unicode: args.unicode,
|
|
@@ -2857,6 +3274,7 @@ async function run(argv) {
|
|
|
2857
3274
|
runAiLifecycleRun(process.cwd(), {
|
|
2858
3275
|
command: args.aiRunCommand,
|
|
2859
3276
|
input: args.aiInput || undefined,
|
|
3277
|
+
language: args.language,
|
|
2860
3278
|
runId: args.aiRunId || undefined,
|
|
2861
3279
|
specSlug: args.specSlug || undefined,
|
|
2862
3280
|
});
|
|
@@ -2867,12 +3285,14 @@ async function run(argv) {
|
|
|
2867
3285
|
runAiActiveSlice(process.cwd(), {
|
|
2868
3286
|
command: args.aiSecondaryCommand || 'status',
|
|
2869
3287
|
dryRun: args.dryRun,
|
|
3288
|
+
language: args.language,
|
|
2870
3289
|
});
|
|
2871
3290
|
return;
|
|
2872
3291
|
}
|
|
2873
3292
|
|
|
2874
3293
|
if (args.aiCommand === 'status') {
|
|
2875
3294
|
runAiLifecycleStatus(process.cwd(), {
|
|
3295
|
+
language: args.language,
|
|
2876
3296
|
runId: args.aiRunId || undefined,
|
|
2877
3297
|
});
|
|
2878
3298
|
return;
|
|
@@ -2880,6 +3300,7 @@ async function run(argv) {
|
|
|
2880
3300
|
|
|
2881
3301
|
if (args.aiCommand === 'resume') {
|
|
2882
3302
|
runAiLifecycleResume(process.cwd(), {
|
|
3303
|
+
language: args.language,
|
|
2883
3304
|
runId: args.aiRunId || undefined,
|
|
2884
3305
|
});
|
|
2885
3306
|
return;
|
|
@@ -2888,6 +3309,7 @@ async function run(argv) {
|
|
|
2888
3309
|
if (args.aiCommand === 'inspect') {
|
|
2889
3310
|
runAiInspect(process.cwd(), {
|
|
2890
3311
|
includeCompleted: args.includeCompleted,
|
|
3312
|
+
language: args.language,
|
|
2891
3313
|
});
|
|
2892
3314
|
return;
|
|
2893
3315
|
}
|
|
@@ -2896,6 +3318,7 @@ async function run(argv) {
|
|
|
2896
3318
|
runAiExport(process.cwd(), {
|
|
2897
3319
|
format: args.formatExplicit ? args.format : 'json',
|
|
2898
3320
|
includeCompleted: args.includeCompleted,
|
|
3321
|
+
language: args.language,
|
|
2899
3322
|
});
|
|
2900
3323
|
return;
|
|
2901
3324
|
}
|
|
@@ -2904,6 +3327,7 @@ async function run(argv) {
|
|
|
2904
3327
|
runAiSpecsList(process.cwd(), {
|
|
2905
3328
|
includeCompleted: args.includeCompleted,
|
|
2906
3329
|
json: args.json,
|
|
3330
|
+
language: args.language,
|
|
2907
3331
|
});
|
|
2908
3332
|
return;
|
|
2909
3333
|
}
|
|
@@ -2912,6 +3336,7 @@ async function run(argv) {
|
|
|
2912
3336
|
runAiSlicesList(process.cwd(), {
|
|
2913
3337
|
includeCompleted: args.includeCompleted,
|
|
2914
3338
|
json: args.json,
|
|
3339
|
+
language: args.language,
|
|
2915
3340
|
});
|
|
2916
3341
|
return;
|
|
2917
3342
|
}
|
|
@@ -2919,6 +3344,7 @@ async function run(argv) {
|
|
|
2919
3344
|
if (args.aiCommand === 'trace') {
|
|
2920
3345
|
runAiTraceReport(process.cwd(), {
|
|
2921
3346
|
includeCompleted: args.includeCompleted,
|
|
3347
|
+
language: args.language,
|
|
2922
3348
|
});
|
|
2923
3349
|
return;
|
|
2924
3350
|
}
|
|
@@ -2926,6 +3352,7 @@ async function run(argv) {
|
|
|
2926
3352
|
if (args.aiCommand === 'models') {
|
|
2927
3353
|
runAiModelsList({
|
|
2928
3354
|
json: args.json,
|
|
3355
|
+
language: args.language,
|
|
2929
3356
|
provider: args.aiProviderExplicit ? args.aiProvider : undefined,
|
|
2930
3357
|
});
|
|
2931
3358
|
return;
|
|
@@ -2940,6 +3367,7 @@ async function run(argv) {
|
|
|
2940
3367
|
id: args.aiProfileId || undefined,
|
|
2941
3368
|
interactive: args.interactive,
|
|
2942
3369
|
json: args.json,
|
|
3370
|
+
language: args.language,
|
|
2943
3371
|
label: args.aiLabel || undefined,
|
|
2944
3372
|
model: args.aiModel || undefined,
|
|
2945
3373
|
provider: args.aiProviderExplicit ? args.aiProvider : undefined,
|
|
@@ -2958,6 +3386,7 @@ async function run(argv) {
|
|
|
2958
3386
|
provider: args.aiProvider,
|
|
2959
3387
|
providerExplicit: args.aiProviderExplicit,
|
|
2960
3388
|
model: args.aiModel || undefined,
|
|
3389
|
+
language: args.language,
|
|
2961
3390
|
plannerProfile: args.aiPlannerProfile || undefined,
|
|
2962
3391
|
role: args.aiRole,
|
|
2963
3392
|
timeout: args.aiTimeout,
|
|
@@ -2970,6 +3399,7 @@ async function run(argv) {
|
|
|
2970
3399
|
context: args.aiContext || undefined,
|
|
2971
3400
|
dryRun: args.dryRun,
|
|
2972
3401
|
interactive: args.interactive,
|
|
3402
|
+
language: args.language,
|
|
2973
3403
|
printPrompt: args.aiPrintPrompt,
|
|
2974
3404
|
provider: args.aiProvider,
|
|
2975
3405
|
providerExplicit: args.aiProviderExplicit,
|
|
@@ -2990,6 +3420,7 @@ async function run(argv) {
|
|
|
2990
3420
|
dryRun: args.dryRun,
|
|
2991
3421
|
input: args.aiInput || undefined,
|
|
2992
3422
|
phase: args.aiPhase,
|
|
3423
|
+
language: args.language,
|
|
2993
3424
|
printPrompt: args.aiPrintPrompt,
|
|
2994
3425
|
provider: args.aiProvider,
|
|
2995
3426
|
providerExplicit: args.aiProviderExplicit,
|
|
@@ -3011,6 +3442,7 @@ async function run(argv) {
|
|
|
3011
3442
|
context: args.aiContext || undefined,
|
|
3012
3443
|
dryRun: args.dryRun,
|
|
3013
3444
|
input: args.aiInput || undefined,
|
|
3445
|
+
language: args.language,
|
|
3014
3446
|
printPrompt: args.aiPrintPrompt,
|
|
3015
3447
|
provider: args.aiProvider,
|
|
3016
3448
|
providerExplicit: args.aiProviderExplicit,
|
|
@@ -3026,6 +3458,7 @@ async function run(argv) {
|
|
|
3026
3458
|
context: args.aiContext || undefined,
|
|
3027
3459
|
dryRun: args.dryRun,
|
|
3028
3460
|
input: args.aiInput || undefined,
|
|
3461
|
+
language: args.language,
|
|
3029
3462
|
printPrompt: args.aiPrintPrompt,
|
|
3030
3463
|
provider: args.aiProvider,
|
|
3031
3464
|
providerExplicit: args.aiProviderExplicit,
|
|
@@ -3044,6 +3477,7 @@ async function run(argv) {
|
|
|
3044
3477
|
dryRun: args.dryRun,
|
|
3045
3478
|
input: args.aiInput || undefined,
|
|
3046
3479
|
phase: args.aiPhase,
|
|
3480
|
+
language: args.language,
|
|
3047
3481
|
printPrompt: args.aiPrintPrompt,
|
|
3048
3482
|
provider: args.aiProvider,
|
|
3049
3483
|
providerExplicit: args.aiProviderExplicit,
|
|
@@ -3060,6 +3494,7 @@ async function run(argv) {
|
|
|
3060
3494
|
await runAiApprove(process.cwd(), {
|
|
3061
3495
|
dryRun: args.dryRun,
|
|
3062
3496
|
input: args.aiInput || undefined,
|
|
3497
|
+
language: args.language,
|
|
3063
3498
|
phase: args.aiPhase,
|
|
3064
3499
|
runId: args.aiRunId || undefined,
|
|
3065
3500
|
version: args.aiVersion || undefined,
|
|
@@ -3068,7 +3503,9 @@ async function run(argv) {
|
|
|
3068
3503
|
}
|
|
3069
3504
|
|
|
3070
3505
|
if (args.aiCommand === 'approvals' || args.aiCommand === 'approval-status') {
|
|
3071
|
-
await runAiApprovalStatus(process.cwd()
|
|
3506
|
+
await runAiApprovalStatus(process.cwd(), {
|
|
3507
|
+
language: args.language,
|
|
3508
|
+
});
|
|
3072
3509
|
return;
|
|
3073
3510
|
}
|
|
3074
3511
|
|
|
@@ -3080,6 +3517,7 @@ async function run(argv) {
|
|
|
3080
3517
|
dryRun: args.dryRun,
|
|
3081
3518
|
executorProfile: args.aiExecutorProfile || undefined,
|
|
3082
3519
|
interactive: args.interactive,
|
|
3520
|
+
language: args.language,
|
|
3083
3521
|
model: args.aiModel || undefined,
|
|
3084
3522
|
provider: args.aiProvider,
|
|
3085
3523
|
providerExplicit: args.aiProviderExplicit,
|
|
@@ -3092,6 +3530,7 @@ async function run(argv) {
|
|
|
3092
3530
|
|
|
3093
3531
|
if (args.aiCommand === 'prompt-slice' || args.aiCommand === 'executor-prompt') {
|
|
3094
3532
|
runAiPromptSlice(process.cwd(), {
|
|
3533
|
+
language: args.language,
|
|
3095
3534
|
slice: args.aiSlice || undefined,
|
|
3096
3535
|
});
|
|
3097
3536
|
return;
|
|
@@ -3107,6 +3546,7 @@ async function run(argv) {
|
|
|
3107
3546
|
executorProfile: args.aiExecutorProfile || undefined,
|
|
3108
3547
|
interactive: args.interactive,
|
|
3109
3548
|
json: args.json,
|
|
3549
|
+
language: args.language,
|
|
3110
3550
|
model: args.aiModel || undefined,
|
|
3111
3551
|
mode: args.aiExecutionMode,
|
|
3112
3552
|
provider: args.aiProvider,
|
|
@@ -3135,6 +3575,7 @@ async function run(argv) {
|
|
|
3135
3575
|
dryRun: args.dryRun,
|
|
3136
3576
|
input: args.aiInput || undefined,
|
|
3137
3577
|
interactive: args.interactive,
|
|
3578
|
+
language: args.language,
|
|
3138
3579
|
remote: args.aiRemote || undefined,
|
|
3139
3580
|
review: args.review,
|
|
3140
3581
|
sshHostAlias: args.aiSshHostAlias || undefined,
|
|
@@ -3152,6 +3593,7 @@ async function run(argv) {
|
|
|
3152
3593
|
format: args.format,
|
|
3153
3594
|
includeCompleted: args.includeCompleted,
|
|
3154
3595
|
json: args.json,
|
|
3596
|
+
language: args.language,
|
|
3155
3597
|
level: args.level,
|
|
3156
3598
|
showConflicts: args.showConflicts,
|
|
3157
3599
|
specSlug: args.specSlug,
|
|
@@ -3166,6 +3608,7 @@ async function run(argv) {
|
|
|
3166
3608
|
autoStart: args.autoStart,
|
|
3167
3609
|
includeCompleted: args.includeCompleted,
|
|
3168
3610
|
json: args.json,
|
|
3611
|
+
language: args.language,
|
|
3169
3612
|
specSlug: args.specSlug,
|
|
3170
3613
|
});
|
|
3171
3614
|
return;
|
|
@@ -3174,6 +3617,7 @@ async function run(argv) {
|
|
|
3174
3617
|
if (args.mode === 'evidence') {
|
|
3175
3618
|
const result = runEvidence(process.cwd(), {
|
|
3176
3619
|
command: args.evidenceArgs,
|
|
3620
|
+
language: args.language,
|
|
3177
3621
|
maxOutput: args.evidenceMaxOutput || undefined,
|
|
3178
3622
|
output: args.evidenceOutput || undefined,
|
|
3179
3623
|
subcommand: args.evidenceCommand,
|
|
@@ -3188,6 +3632,7 @@ async function run(argv) {
|
|
|
3188
3632
|
command: args.demoCommand,
|
|
3189
3633
|
demo: args.demoName,
|
|
3190
3634
|
dryRun: args.dryRun,
|
|
3635
|
+
language: args.language,
|
|
3191
3636
|
targetRoot: demoTarget,
|
|
3192
3637
|
});
|
|
3193
3638
|
return;
|
|
@@ -3196,6 +3641,7 @@ async function run(argv) {
|
|
|
3196
3641
|
if (args.mode === 'migrate') {
|
|
3197
3642
|
runMigrate(args.targetDir, {
|
|
3198
3643
|
dryRun: args.dryRun,
|
|
3644
|
+
language: args.language,
|
|
3199
3645
|
skipInstall: args.skipInstall,
|
|
3200
3646
|
});
|
|
3201
3647
|
return;
|
|
@@ -3206,6 +3652,7 @@ async function run(argv) {
|
|
|
3206
3652
|
dryRun: args.dryRun,
|
|
3207
3653
|
fix: args.doctorFix,
|
|
3208
3654
|
json: args.json,
|
|
3655
|
+
language: args.language,
|
|
3209
3656
|
noColor: args.noColor,
|
|
3210
3657
|
unicode: args.unicode,
|
|
3211
3658
|
});
|
|
@@ -3213,7 +3660,10 @@ async function run(argv) {
|
|
|
3213
3660
|
}
|
|
3214
3661
|
|
|
3215
3662
|
if (args.mode === 'start-slice') {
|
|
3216
|
-
startSlice(args.targetDir, {
|
|
3663
|
+
startSlice(args.targetDir, {
|
|
3664
|
+
allowDraft: args.allowDraft,
|
|
3665
|
+
language: args.language,
|
|
3666
|
+
});
|
|
3217
3667
|
return;
|
|
3218
3668
|
}
|
|
3219
3669
|
|
|
@@ -3221,6 +3671,7 @@ async function run(argv) {
|
|
|
3221
3671
|
checkSliceReadiness(args.targetDir, {
|
|
3222
3672
|
baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
|
|
3223
3673
|
gate: args.gate,
|
|
3674
|
+
language: args.language,
|
|
3224
3675
|
local: args.checkSliceLocal,
|
|
3225
3676
|
remote: args.aiRemote,
|
|
3226
3677
|
strictOverlap: args.strictOverlap,
|
|
@@ -3229,7 +3680,7 @@ async function run(argv) {
|
|
|
3229
3680
|
}
|
|
3230
3681
|
|
|
3231
3682
|
if (args.mode === 'check-pr') {
|
|
3232
|
-
checkPrReadiness(args.targetDir);
|
|
3683
|
+
checkPrReadiness(args.targetDir, { language: args.language });
|
|
3233
3684
|
return;
|
|
3234
3685
|
}
|
|
3235
3686
|
|
|
@@ -3239,16 +3690,21 @@ async function run(argv) {
|
|
|
3239
3690
|
if (!handoffInput || handoffInput === '.') {
|
|
3240
3691
|
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'));
|
|
3241
3692
|
}
|
|
3242
|
-
const
|
|
3243
|
-
|
|
3693
|
+
const translator = createTranslator(args.language);
|
|
3694
|
+
const resolved = checkHandoff(handoffInput, repoRoot, { language: args.language });
|
|
3695
|
+
console.log(translator.t('handoff.validated', {
|
|
3696
|
+
path: resolved.relativePath,
|
|
3697
|
+
subject: translator.t(`handoff.label.${resolved.kind}`),
|
|
3698
|
+
}));
|
|
3244
3699
|
return;
|
|
3245
3700
|
}
|
|
3246
3701
|
|
|
3247
3702
|
if (args.mode === 'new-handoff') {
|
|
3248
3703
|
const repoRoot = process.cwd();
|
|
3249
3704
|
const handoffSlug = args.targetDir;
|
|
3705
|
+
const translator = createTranslator(args.language);
|
|
3250
3706
|
const resolved = scaffoldHandoff(handoffSlug, repoRoot);
|
|
3251
|
-
console.log(
|
|
3707
|
+
console.log(translator.t('handoff.scaffolded', { path: resolved.relativePath }));
|
|
3252
3708
|
return;
|
|
3253
3709
|
}
|
|
3254
3710
|
|
|
@@ -3258,6 +3714,7 @@ async function run(argv) {
|
|
|
3258
3714
|
discard: args.discard,
|
|
3259
3715
|
dryRun: args.dryRun,
|
|
3260
3716
|
force: args.force,
|
|
3717
|
+
language: args.language,
|
|
3261
3718
|
});
|
|
3262
3719
|
return;
|
|
3263
3720
|
}
|
|
@@ -3265,6 +3722,7 @@ async function run(argv) {
|
|
|
3265
3722
|
if (args.mode === 'check-scope') {
|
|
3266
3723
|
checkScope(args.targetDir, {
|
|
3267
3724
|
baseBranch: args.baseBranchExplicit ? args.aiBaseBranch : '',
|
|
3725
|
+
language: args.language,
|
|
3268
3726
|
remote: args.aiRemote,
|
|
3269
3727
|
strict: args.strict,
|
|
3270
3728
|
});
|
|
@@ -3283,6 +3741,7 @@ async function run(argv) {
|
|
|
3283
3741
|
dryRun: args.dryRun,
|
|
3284
3742
|
input: args.aiInput || undefined,
|
|
3285
3743
|
interactive: args.interactive,
|
|
3744
|
+
language: args.language,
|
|
3286
3745
|
methodology: args.methodology || undefined,
|
|
3287
3746
|
review: args.review,
|
|
3288
3747
|
specSlug: args.specSlug || undefined,
|
|
@@ -3299,18 +3758,19 @@ async function run(argv) {
|
|
|
3299
3758
|
const report = startSpecWorktree(process.cwd(), args.targetDir, {
|
|
3300
3759
|
dryRun: args.dryRun,
|
|
3301
3760
|
});
|
|
3302
|
-
process.stdout.write(formatSpecStartResult(report));
|
|
3761
|
+
process.stdout.write(formatSpecStartResult(report, { language: args.language }));
|
|
3303
3762
|
return;
|
|
3304
3763
|
}
|
|
3305
3764
|
|
|
3306
3765
|
if (args.specCommand === 'status') {
|
|
3307
3766
|
const report = buildSpecStatus(process.cwd(), args.targetDir);
|
|
3308
|
-
process.stdout.write(formatSpecStatus(report));
|
|
3767
|
+
process.stdout.write(formatSpecStatus(report, { language: args.language }));
|
|
3309
3768
|
return;
|
|
3310
3769
|
}
|
|
3311
3770
|
|
|
3312
3771
|
if (args.specCommand === 'validate') {
|
|
3313
3772
|
runValidateSpec(process.cwd(), args.targetDir, {
|
|
3773
|
+
language: args.language,
|
|
3314
3774
|
strict: args.strict,
|
|
3315
3775
|
});
|
|
3316
3776
|
return;
|
|
@@ -3324,7 +3784,7 @@ async function run(argv) {
|
|
|
3324
3784
|
force: args.force,
|
|
3325
3785
|
remote: args.aiRemote,
|
|
3326
3786
|
});
|
|
3327
|
-
process.stdout.write(formatSpecCloseResult(report));
|
|
3787
|
+
process.stdout.write(formatSpecCloseResult(report, { language: args.language }));
|
|
3328
3788
|
return;
|
|
3329
3789
|
}
|
|
3330
3790
|
|
|
@@ -3345,11 +3805,13 @@ async function run(argv) {
|
|
|
3345
3805
|
});
|
|
3346
3806
|
return;
|
|
3347
3807
|
}
|
|
3808
|
+
const initLanguage = resolveInitGeneratedLanguage(args, targetDir, initOptions);
|
|
3348
3809
|
const initLayout = buildInitLayout(targetDir, {
|
|
3349
3810
|
compatibilityAlias: !args.explicitInit,
|
|
3350
3811
|
dryRun: args.dryRun,
|
|
3351
3812
|
full: initOptions.full,
|
|
3352
3813
|
includeTemplates: initOptions.includeTemplates,
|
|
3814
|
+
language: initLanguage.configLanguage,
|
|
3353
3815
|
legacyScripts: initOptions.legacyScripts,
|
|
3354
3816
|
minimal: initOptions.minimal,
|
|
3355
3817
|
projectName: initOptions.projectName,
|
|
@@ -3372,10 +3834,12 @@ async function run(argv) {
|
|
|
3372
3834
|
}
|
|
3373
3835
|
runInitDocs(targetDir, initOptions.projectName, {
|
|
3374
3836
|
includeTemplates: initOptions.includeTemplates,
|
|
3837
|
+
language: initLanguage.docsLanguage,
|
|
3375
3838
|
legacyScripts: initOptions.legacyScripts,
|
|
3376
3839
|
profile: initLayout.profile,
|
|
3377
3840
|
templateRoot,
|
|
3378
3841
|
});
|
|
3842
|
+
const languageWrite = persistInitLanguage(targetDir, { language: initLanguage.configLanguage });
|
|
3379
3843
|
|
|
3380
3844
|
if (!args.skipInstall) {
|
|
3381
3845
|
const installResult = installSelfAsDevDep(targetDir, CLI_VERSION);
|
|
@@ -3386,16 +3850,22 @@ async function run(argv) {
|
|
|
3386
3850
|
}
|
|
3387
3851
|
}
|
|
3388
3852
|
|
|
3389
|
-
|
|
3390
|
-
|
|
3853
|
+
const translator = createTranslator(args.language);
|
|
3854
|
+
console.log(translator.t('init.installed', { path: targetDir }));
|
|
3855
|
+
if (languageWrite) {
|
|
3856
|
+
console.log(translator.t('init.language.saved', { language: languageWrite.language }));
|
|
3857
|
+
}
|
|
3858
|
+
printInitNextSteps(targetDir, initOptions.projectName, { language: args.language });
|
|
3391
3859
|
} finally {
|
|
3392
3860
|
fs.rmSync(tempRoot, { recursive: true, force: true });
|
|
3393
3861
|
}
|
|
3394
3862
|
}
|
|
3395
3863
|
|
|
3396
3864
|
module.exports = {
|
|
3865
|
+
persistInitLanguage,
|
|
3397
3866
|
resolveInteractiveInitOptions,
|
|
3398
3867
|
runAnalyze,
|
|
3868
|
+
runDashboard,
|
|
3399
3869
|
runDoctor,
|
|
3400
3870
|
runFlow,
|
|
3401
3871
|
runMigrate,
|