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
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const { createTranslator } = require('./catalog');
|
|
2
|
+
|
|
3
|
+
function translatorForHuman(options = {}) {
|
|
4
|
+
return createTranslator(options.language);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
function formatStatus(status, translator = createTranslator()) {
|
|
8
|
+
const key = `status.${String(status || '').replace(/-/g, '_')}`;
|
|
9
|
+
const translated = translator.t(key);
|
|
10
|
+
return translated.startsWith('[missing:') ? String(status || '') : translated;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function formatWarningPrefix(message, translator = createTranslator()) {
|
|
14
|
+
const text = String(message || '');
|
|
15
|
+
const match = text.match(/^Warning: (.+)$/);
|
|
16
|
+
if (!match) {
|
|
17
|
+
return text;
|
|
18
|
+
}
|
|
19
|
+
return translator.t('common.warning', { message: match[1] });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports = {
|
|
23
|
+
formatStatus,
|
|
24
|
+
formatWarningPrefix,
|
|
25
|
+
translatorForHuman,
|
|
26
|
+
};
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
|
|
4
|
+
const {
|
|
5
|
+
DEFAULT_LANGUAGE,
|
|
6
|
+
SUPPORTED_LANGUAGES,
|
|
7
|
+
normalizeLanguage,
|
|
8
|
+
resolveLanguage,
|
|
9
|
+
} = require('./language');
|
|
10
|
+
|
|
11
|
+
const MACHINE_TEMPLATE_PATHS = new Set([
|
|
12
|
+
'package.template.json',
|
|
13
|
+
'specs/[project-name]/slices/slice-template/slice.json',
|
|
14
|
+
]);
|
|
15
|
+
|
|
16
|
+
function toTemplatePath(relativePath) {
|
|
17
|
+
const normalized = String(relativePath || '').replace(/\\/g, '/').replace(/^\.\//, '');
|
|
18
|
+
if (!normalized || path.isAbsolute(normalized) || normalized.split('/').includes('..')) {
|
|
19
|
+
throw new Error(`invalid template path: ${relativePath}`);
|
|
20
|
+
}
|
|
21
|
+
return normalized;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function isHumanTemplatePath(relativePath) {
|
|
25
|
+
const normalized = toTemplatePath(relativePath);
|
|
26
|
+
if (MACHINE_TEMPLATE_PATHS.has(normalized)) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return normalized.endsWith('.md.template') || normalized.endsWith('.md');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function localizedTemplateRelativePath(relativePath, language) {
|
|
33
|
+
const normalized = toTemplatePath(relativePath);
|
|
34
|
+
const resolvedLanguage = normalizeLanguage(language) || DEFAULT_LANGUAGE;
|
|
35
|
+
if (resolvedLanguage === DEFAULT_LANGUAGE || !isHumanTemplatePath(normalized)) {
|
|
36
|
+
return normalized;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (normalized.endsWith('.template')) {
|
|
40
|
+
const withoutTemplateSuffix = normalized.slice(0, -'.template'.length);
|
|
41
|
+
return `${withoutTemplateSuffix}.${resolvedLanguage}.template`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const extension = path.posix.extname(normalized);
|
|
45
|
+
if (!extension) {
|
|
46
|
+
return `${normalized}.${resolvedLanguage}`;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return `${normalized.slice(0, -extension.length)}.${resolvedLanguage}${extension}`;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function resolveTemplateLanguage(options = {}) {
|
|
53
|
+
return resolveLanguage({
|
|
54
|
+
cliLanguage: options.language || options.cliLanguage,
|
|
55
|
+
env: options.env,
|
|
56
|
+
homeDir: options.homeDir,
|
|
57
|
+
intlLocale: options.intlLocale,
|
|
58
|
+
projectRoot: options.projectRoot,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function resolveLocalizedTemplatePath(templateRoot, relativePath, options = {}) {
|
|
63
|
+
const normalized = toTemplatePath(relativePath);
|
|
64
|
+
const templateLanguage = resolveTemplateLanguage(options);
|
|
65
|
+
const requestedLanguage = templateLanguage.language || DEFAULT_LANGUAGE;
|
|
66
|
+
const basePath = path.join(templateRoot, normalized);
|
|
67
|
+
const human = isHumanTemplatePath(normalized);
|
|
68
|
+
|
|
69
|
+
if (!human) {
|
|
70
|
+
return {
|
|
71
|
+
human: false,
|
|
72
|
+
language: '',
|
|
73
|
+
requestedLanguage,
|
|
74
|
+
relativePath: normalized,
|
|
75
|
+
templatePath: basePath,
|
|
76
|
+
localizedRelativePath: normalized,
|
|
77
|
+
fallback: false,
|
|
78
|
+
reason: 'machine-artifact',
|
|
79
|
+
languageSource: templateLanguage.source,
|
|
80
|
+
warnings: templateLanguage.warnings || [],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const localizedRelativePath = localizedTemplateRelativePath(normalized, requestedLanguage);
|
|
85
|
+
const localizedPath = path.join(templateRoot, localizedRelativePath);
|
|
86
|
+
if (localizedRelativePath !== normalized && fs.existsSync(localizedPath)) {
|
|
87
|
+
return {
|
|
88
|
+
human: true,
|
|
89
|
+
language: requestedLanguage,
|
|
90
|
+
requestedLanguage,
|
|
91
|
+
relativePath: normalized,
|
|
92
|
+
templatePath: localizedPath,
|
|
93
|
+
localizedRelativePath,
|
|
94
|
+
fallback: false,
|
|
95
|
+
reason: 'localized-template',
|
|
96
|
+
languageSource: templateLanguage.source,
|
|
97
|
+
warnings: templateLanguage.warnings || [],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (fs.existsSync(basePath)) {
|
|
102
|
+
return {
|
|
103
|
+
human: true,
|
|
104
|
+
language: DEFAULT_LANGUAGE,
|
|
105
|
+
requestedLanguage,
|
|
106
|
+
relativePath: normalized,
|
|
107
|
+
templatePath: basePath,
|
|
108
|
+
localizedRelativePath: normalized,
|
|
109
|
+
fallback: requestedLanguage !== DEFAULT_LANGUAGE,
|
|
110
|
+
reason: requestedLanguage === DEFAULT_LANGUAGE ? 'default-template' : 'missing-localized-template',
|
|
111
|
+
languageSource: templateLanguage.source,
|
|
112
|
+
warnings: templateLanguage.warnings || [],
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
throw new Error(`create-quiver: missing template ${normalized} in ${templateRoot}`);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function collectLocalizedTemplateCoverage(templateRoot, relativePaths, options = {}) {
|
|
120
|
+
const languages = Array.isArray(options.languages) && options.languages.length > 0
|
|
121
|
+
? options.languages.map((language) => normalizeLanguage(language)).filter(Boolean)
|
|
122
|
+
: SUPPORTED_LANGUAGES;
|
|
123
|
+
const missing = [];
|
|
124
|
+
const checked = [];
|
|
125
|
+
const skipped = [];
|
|
126
|
+
|
|
127
|
+
for (const relativePath of relativePaths) {
|
|
128
|
+
const normalized = toTemplatePath(relativePath);
|
|
129
|
+
if (!isHumanTemplatePath(normalized)) {
|
|
130
|
+
skipped.push({
|
|
131
|
+
relativePath: normalized,
|
|
132
|
+
reason: 'machine-artifact',
|
|
133
|
+
});
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
for (const language of languages) {
|
|
138
|
+
if (language === DEFAULT_LANGUAGE) {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const localizedRelativePath = localizedTemplateRelativePath(normalized, language);
|
|
142
|
+
checked.push({
|
|
143
|
+
language,
|
|
144
|
+
relativePath: normalized,
|
|
145
|
+
localizedRelativePath,
|
|
146
|
+
});
|
|
147
|
+
if (!fs.existsSync(path.join(templateRoot, localizedRelativePath))) {
|
|
148
|
+
missing.push({
|
|
149
|
+
language,
|
|
150
|
+
relativePath: normalized,
|
|
151
|
+
localizedRelativePath,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return {
|
|
158
|
+
ok: missing.length === 0,
|
|
159
|
+
checked,
|
|
160
|
+
missing,
|
|
161
|
+
skipped,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
module.exports = {
|
|
166
|
+
collectLocalizedTemplateCoverage,
|
|
167
|
+
isHumanTemplatePath,
|
|
168
|
+
localizedTemplateRelativePath,
|
|
169
|
+
resolveLocalizedTemplatePath,
|
|
170
|
+
resolveTemplateLanguage,
|
|
171
|
+
toTemplatePath,
|
|
172
|
+
};
|
|
@@ -7,6 +7,7 @@ const {
|
|
|
7
7
|
quiverInternalPaths,
|
|
8
8
|
resolveInitPackageScripts,
|
|
9
9
|
} = require('./init-layout');
|
|
10
|
+
const { resolveLocalizedTemplatePath } = require('./i18n/templates');
|
|
10
11
|
const { writeState } = require('./state');
|
|
11
12
|
|
|
12
13
|
function ensureDir(dirPath) {
|
|
@@ -118,6 +119,17 @@ function copyRenderedFile(sourcePath, destinationPath, replacements, skipIfExist
|
|
|
118
119
|
return 'created';
|
|
119
120
|
}
|
|
120
121
|
|
|
122
|
+
function resolveGeneratedTemplatePath(templateRoot, relativePath, options = {}) {
|
|
123
|
+
const basePath = path.join(templateRoot, relativePath);
|
|
124
|
+
if (!fs.existsSync(basePath)) {
|
|
125
|
+
return '';
|
|
126
|
+
}
|
|
127
|
+
return resolveLocalizedTemplatePath(templateRoot, relativePath, {
|
|
128
|
+
language: options.language,
|
|
129
|
+
projectRoot: options.projectRoot,
|
|
130
|
+
}).templatePath;
|
|
131
|
+
}
|
|
132
|
+
|
|
121
133
|
function copyBinaryFile(sourcePath, destinationPath, skipIfExists) {
|
|
122
134
|
if (skipIfExists && fs.existsSync(destinationPath)) {
|
|
123
135
|
return 'skipped';
|
|
@@ -398,7 +410,9 @@ npm run quiver:ai:execute-plan -- --dry-run --commit --mode delegated
|
|
|
398
410
|
The generated project includes \`quiver:*\` npm scripts that call the Node CLI:
|
|
399
411
|
|
|
400
412
|
\`\`\`bash
|
|
413
|
+
npm run quiver:version
|
|
401
414
|
npm run quiver:analyze
|
|
415
|
+
npm run quiver:dashboard
|
|
402
416
|
npm run quiver:prepare -- --dry-run
|
|
403
417
|
npm run quiver:plan
|
|
404
418
|
npm run quiver:graph
|
|
@@ -504,7 +518,9 @@ Remove \`--dry-run\` only after the phase output is approved and the local provi
|
|
|
504
518
|
The generated project includes \`quiver:*\` npm scripts that call the Node CLI and are the preferred repeatable workflow:
|
|
505
519
|
|
|
506
520
|
\`\`\`bash
|
|
521
|
+
npm run quiver:version
|
|
507
522
|
npm run quiver:analyze
|
|
523
|
+
npm run quiver:dashboard
|
|
508
524
|
npm run quiver:prepare -- --dry-run
|
|
509
525
|
npm run quiver:plan
|
|
510
526
|
npm run quiver:graph
|
|
@@ -538,6 +554,8 @@ npm run quiver:refresh-active-slices
|
|
|
538
554
|
\`\`\`
|
|
539
555
|
|
|
540
556
|
The \`quiver:graph\` script prints the tree view by default; use \`npx create-quiver graph --format mermaid\` for PR-ready Markdown and \`--format dot\` when you want Graphviz source.
|
|
557
|
+
The \`quiver:version\` script shows the Quiver-branded version report; add \`--json\` for automation while top-level \`--version\` stays semver-only.
|
|
558
|
+
The \`quiver:dashboard\` script shows compact read-only project, spec, slice, run, approval, and agent status by default; use \`--details\` for the full report, \`--section <name>\` for focused inspection, and \`--json\` for automation.
|
|
541
559
|
The \`quiver:next\` script points to the next ready slice and can auto-start it behind a confirmation prompt.
|
|
542
560
|
The \`quiver:ai:*\` scripts standardize planner/executor AI flows. Use dry-run first: onboarding and planning dry-runs do not require provider auth, \`quiver:ai:execute-plan -- --dry-run --commit --mode manual\` prints manual prompts, \`--mode delegated\` prints safe waves, \`quiver:ai:inspect\` shows lifecycle state, \`quiver:ai:export -- --format json|markdown\` emits dashboard/agent-friendly state, and \`quiver:ai:pr -- --dry-run\` validates \`gh\`, GitFlow docs, branch/worktree state, SSH inputs, and \`pr.md\` without creating a PR. Add \`--create\` only after reviewing the plan.
|
|
543
561
|
Use \`quiver:spec:create\`, \`quiver:spec:start\`, \`quiver:spec:status\`, and \`quiver:spec:close\` for one spec generation and worktree per spec.
|
|
@@ -680,6 +698,7 @@ function initializeProjectDocs(options) {
|
|
|
680
698
|
migrateMode = false,
|
|
681
699
|
profile = 'default',
|
|
682
700
|
templateRoot: providedTemplateRoot = '',
|
|
701
|
+
language = '',
|
|
683
702
|
} = options;
|
|
684
703
|
|
|
685
704
|
const templateRoot = providedTemplateRoot || path.join(projectRoot, 'docs-template');
|
|
@@ -741,8 +760,9 @@ function initializeProjectDocs(options) {
|
|
|
741
760
|
operations.push({ source: 'packaged templates', destination: '.quiver/templates', result: 'merged' });
|
|
742
761
|
}
|
|
743
762
|
|
|
744
|
-
const
|
|
745
|
-
|
|
763
|
+
const templateLanguageOptions = { language, projectRoot };
|
|
764
|
+
const agentsSourcePath = resolveGeneratedTemplatePath(templateRoot, 'AGENTS.md.template', templateLanguageOptions);
|
|
765
|
+
if (agentsSourcePath) {
|
|
746
766
|
const agentsDestinationPath = path.join(projectRoot, 'AGENTS.md');
|
|
747
767
|
const result = copyRenderedFile(agentsSourcePath, agentsDestinationPath, replacements, true);
|
|
748
768
|
operations.push({ source: 'AGENTS.md.template', destination: 'AGENTS.md', result });
|
|
@@ -808,8 +828,8 @@ function initializeProjectDocs(options) {
|
|
|
808
828
|
continue;
|
|
809
829
|
}
|
|
810
830
|
|
|
811
|
-
const sourcePath =
|
|
812
|
-
if (!
|
|
831
|
+
const sourcePath = resolveGeneratedTemplatePath(templateRoot, source, templateLanguageOptions);
|
|
832
|
+
if (!sourcePath) {
|
|
813
833
|
continue;
|
|
814
834
|
}
|
|
815
835
|
|
|
@@ -125,6 +125,7 @@ function normalizeInitLayoutOptions(options = {}) {
|
|
|
125
125
|
dryRun: options.dryRun === true,
|
|
126
126
|
full,
|
|
127
127
|
includeTemplates: options.includeTemplates === true,
|
|
128
|
+
language: typeof options.language === 'string' ? options.language : '',
|
|
128
129
|
legacyScripts: options.legacyScripts === true,
|
|
129
130
|
minimal,
|
|
130
131
|
skipInstall: options.skipInstall === true,
|
|
@@ -181,8 +182,10 @@ function resolveInitVisibleDirectories(profile, projectSlug) {
|
|
|
181
182
|
function resolveInitPackageScripts(profile, options = {}) {
|
|
182
183
|
const baseScripts = {
|
|
183
184
|
'quiver:migrate': 'npx create-quiver migrate',
|
|
185
|
+
'quiver:version': 'npx create-quiver version',
|
|
184
186
|
'quiver:analyze': 'npx create-quiver analyze',
|
|
185
187
|
'quiver:flow': 'npx create-quiver flow',
|
|
188
|
+
'quiver:dashboard': 'npx create-quiver dashboard',
|
|
186
189
|
'quiver:prepare': 'npx create-quiver prepare',
|
|
187
190
|
'quiver:plan': 'npx create-quiver plan',
|
|
188
191
|
'quiver:graph': 'npx create-quiver graph',
|
|
@@ -351,6 +354,7 @@ function buildInitLayout(projectRoot, options = {}) {
|
|
|
351
354
|
projectSlug,
|
|
352
355
|
targetRoot: path.resolve(projectRoot),
|
|
353
356
|
flags: normalized,
|
|
357
|
+
language: normalized.language,
|
|
354
358
|
operations,
|
|
355
359
|
ignoredPaths: [...new Set(ignoredPaths)],
|
|
356
360
|
risks,
|
|
@@ -372,6 +376,10 @@ function formatInitLayoutPlan(plan) {
|
|
|
372
376
|
lines.push(`- Slug: ${plan.projectSlug}`);
|
|
373
377
|
lines.push(`- Target: ${plan.targetRoot}`);
|
|
374
378
|
lines.push(`- Profile: ${plan.profile}`);
|
|
379
|
+
if (plan.language) {
|
|
380
|
+
lines.push(`- Language: ${plan.language}`);
|
|
381
|
+
lines.push('- Language config: write .quiver/config.json');
|
|
382
|
+
}
|
|
375
383
|
lines.push(`- Entry point: ${entryPoint}`);
|
|
376
384
|
lines.push(`- Planned create: ${plan.summary.create}`);
|
|
377
385
|
lines.push(`- Planned update: ${plan.summary.update}`);
|
|
@@ -2,6 +2,7 @@ const fs = require('fs');
|
|
|
2
2
|
const path = require('path');
|
|
3
3
|
const { branchDelete, catFileExists, currentBranch, fetchBranch, fetchRemote, hasLocalBranch, hasRemoteBranch, isGitWorktree, isLinkedWorktree, lsRemoteHeads, mergeBaseIsAncestor, revListCount, runGit, statusPorcelain, worktreeAdd, worktreeList, worktreePrune, worktreeRemove } = require('./git');
|
|
4
4
|
const { parseJsonWithComments } = require('./json');
|
|
5
|
+
const { createTranslator } = require('./i18n/catalog');
|
|
5
6
|
const { writeFrontMatter } = require('./init-docs');
|
|
6
7
|
const { withLockSync } = require('./locks');
|
|
7
8
|
const { relativePosixPath, resolveTargetRoot } = require('./paths');
|
|
@@ -12,6 +13,10 @@ function ensureDir(dirPath) {
|
|
|
12
13
|
fs.mkdirSync(dirPath, { recursive: true });
|
|
13
14
|
}
|
|
14
15
|
|
|
16
|
+
function lifecycleTranslator(options = {}) {
|
|
17
|
+
return createTranslator(options.language);
|
|
18
|
+
}
|
|
19
|
+
|
|
15
20
|
function estimateTokenCost(text) {
|
|
16
21
|
return Math.max(1, Math.ceil(Buffer.byteLength(text, 'utf8') / 4));
|
|
17
22
|
}
|
|
@@ -267,7 +272,7 @@ function refreshActiveSlicesBoard(repoRoot) {
|
|
|
267
272
|
return outputPath;
|
|
268
273
|
}
|
|
269
274
|
|
|
270
|
-
function resolveBaseRef(repoRoot, baseBranch) {
|
|
275
|
+
function resolveBaseRef(repoRoot, baseBranch, translator = lifecycleTranslator()) {
|
|
271
276
|
if (hasLocalBranch(repoRoot, baseBranch)) {
|
|
272
277
|
return baseBranch;
|
|
273
278
|
}
|
|
@@ -279,10 +284,10 @@ function resolveBaseRef(repoRoot, baseBranch) {
|
|
|
279
284
|
fetchBranch(repoRoot, baseBranch);
|
|
280
285
|
return `origin/${baseBranch}`;
|
|
281
286
|
} catch {
|
|
282
|
-
throw new Error(`create-quiver:
|
|
287
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.base_ref.fetch_failed', { base: baseBranch })}`);
|
|
283
288
|
}
|
|
284
289
|
}
|
|
285
|
-
throw new Error(`create-quiver:
|
|
290
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.base_ref.missing', { base: baseBranch, remoteRef: `origin/${baseBranch}` })}`);
|
|
286
291
|
}
|
|
287
292
|
|
|
288
293
|
function findExistingWorktreeForBranch(repoRoot, branchName) {
|
|
@@ -326,6 +331,7 @@ function formatNestedSliceWorktree(branchName, existingWorktreePath = '') {
|
|
|
326
331
|
}
|
|
327
332
|
|
|
328
333
|
function startSlice(sliceInput, options = {}) {
|
|
334
|
+
const translator = lifecycleTranslator(options);
|
|
329
335
|
const allowDraft = options.allowDraft === true || process.env.ALLOW_DRAFT_SLICE === '1';
|
|
330
336
|
const repoRoot = runGit(['rev-parse', '--show-toplevel'], process.cwd());
|
|
331
337
|
const slice = resolveSliceContext(repoRoot, sliceInput);
|
|
@@ -338,19 +344,19 @@ function startSlice(sliceInput, options = {}) {
|
|
|
338
344
|
validateSliceMetaForStart(slice);
|
|
339
345
|
|
|
340
346
|
if (slice.status === 'blocked') {
|
|
341
|
-
throw new Error(
|
|
347
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.start.error.blocked')}`);
|
|
342
348
|
}
|
|
343
349
|
if (slice.status === 'cancelled') {
|
|
344
|
-
throw new Error(
|
|
350
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.start.error.cancelled')}`);
|
|
345
351
|
}
|
|
346
352
|
if (slice.status === 'completed') {
|
|
347
|
-
console.log('
|
|
353
|
+
console.log(translator.t('lifecycle.start.warn.completed'));
|
|
348
354
|
}
|
|
349
355
|
if (slice.status === 'draft' && !allowDraft) {
|
|
350
|
-
throw new Error(
|
|
356
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.start.error.draft')}`);
|
|
351
357
|
}
|
|
352
358
|
if (slice.status === 'draft') {
|
|
353
|
-
console.log('
|
|
359
|
+
console.log(translator.t('lifecycle.start.warn.draft'));
|
|
354
360
|
}
|
|
355
361
|
|
|
356
362
|
return withLockSync(repoRoot, `slice-worktree-${slice.branchName}`, {
|
|
@@ -375,19 +381,19 @@ function startSlice(sliceInput, options = {}) {
|
|
|
375
381
|
writeWorktreeContext(existingWorktreePath, slice, slice.branchName);
|
|
376
382
|
const activeSlice = writeActiveSlice(repoRoot, slice);
|
|
377
383
|
if (activeSlice.replaced) {
|
|
378
|
-
console.log('
|
|
384
|
+
console.log(translator.t('lifecycle.active_slice.replaced'));
|
|
379
385
|
} else {
|
|
380
|
-
console.log('
|
|
386
|
+
console.log(translator.t('lifecycle.active_slice.wrote'));
|
|
381
387
|
}
|
|
382
388
|
refreshActiveSlicesBoard(repoRoot);
|
|
383
|
-
console.log('
|
|
384
|
-
console.log(
|
|
385
|
-
console.log(
|
|
386
|
-
console.log(
|
|
387
|
-
console.log(
|
|
388
|
-
console.log(
|
|
389
|
-
console.log(
|
|
390
|
-
console.log(
|
|
389
|
+
console.log(translator.t('lifecycle.start.existing_worktree'));
|
|
390
|
+
console.log(translator.t('lifecycle.label.alias', { value: toAlias(slice.ticket) }));
|
|
391
|
+
console.log(translator.t('lifecycle.label.spec', { value: slice.specSlug }));
|
|
392
|
+
console.log(translator.t('lifecycle.label.slice', { value: slice.sliceId }));
|
|
393
|
+
console.log(translator.t('lifecycle.label.ticket', { value: slice.ticket }));
|
|
394
|
+
console.log(translator.t('lifecycle.label.branch', { value: slice.branchName }));
|
|
395
|
+
console.log(translator.t('lifecycle.label.base', { value: slice.baseBranch }));
|
|
396
|
+
console.log(translator.t('lifecycle.label.worktree', { value: existingWorktreePath }));
|
|
391
397
|
return { worktreePath: existingWorktreePath, reused: true };
|
|
392
398
|
}
|
|
393
399
|
|
|
@@ -418,35 +424,36 @@ function startSlice(sliceInput, options = {}) {
|
|
|
418
424
|
}
|
|
419
425
|
worktreeAdd(repoRoot, worktreePath, slice.branchName);
|
|
420
426
|
} else {
|
|
421
|
-
const baseRef = resolveBaseRef(repoRoot, slice.baseBranch);
|
|
427
|
+
const baseRef = resolveBaseRef(repoRoot, slice.baseBranch, translator);
|
|
422
428
|
worktreeAdd(repoRoot, worktreePath, baseRef, { branch: slice.branchName });
|
|
423
429
|
}
|
|
424
430
|
|
|
425
431
|
writeWorktreeContext(worktreePath, slice, slice.branchName);
|
|
426
432
|
const activeSlice = writeActiveSlice(repoRoot, slice);
|
|
427
433
|
if (activeSlice.replaced) {
|
|
428
|
-
console.log('
|
|
434
|
+
console.log(translator.t('lifecycle.active_slice.replaced'));
|
|
429
435
|
} else {
|
|
430
|
-
console.log('
|
|
436
|
+
console.log(translator.t('lifecycle.active_slice.wrote'));
|
|
431
437
|
}
|
|
432
438
|
refreshActiveSlicesBoard(repoRoot);
|
|
433
439
|
|
|
434
|
-
console.log('
|
|
435
|
-
console.log(
|
|
436
|
-
console.log(
|
|
437
|
-
console.log(
|
|
438
|
-
console.log(
|
|
439
|
-
console.log(
|
|
440
|
-
console.log(
|
|
441
|
-
console.log(
|
|
442
|
-
console.log(
|
|
443
|
-
console.log(
|
|
444
|
-
console.log(
|
|
440
|
+
console.log(translator.t('lifecycle.start.ready'));
|
|
441
|
+
console.log(translator.t('lifecycle.label.alias', { value: toAlias(slice.ticket) }));
|
|
442
|
+
console.log(translator.t('lifecycle.label.spec', { value: slice.specSlug }));
|
|
443
|
+
console.log(translator.t('lifecycle.label.slice', { value: slice.sliceId }));
|
|
444
|
+
console.log(translator.t('lifecycle.label.ticket', { value: slice.ticket }));
|
|
445
|
+
console.log(translator.t('lifecycle.label.branch_type', { value: slice.branchType }));
|
|
446
|
+
console.log(translator.t('lifecycle.label.base', { value: slice.baseBranch }));
|
|
447
|
+
console.log(translator.t('lifecycle.label.slug', { value: slice.branchSlug }));
|
|
448
|
+
console.log(translator.t('lifecycle.label.branch', { value: slice.branchName }));
|
|
449
|
+
console.log(translator.t('lifecycle.label.worktree', { value: worktreePath }));
|
|
450
|
+
console.log(translator.t('lifecycle.label.context', { value: `${worktreePath}/WORKTREE_CONTEXT.md` }));
|
|
445
451
|
return { worktreePath, reused: false };
|
|
446
452
|
});
|
|
447
453
|
}
|
|
448
454
|
|
|
449
455
|
function cleanupSlice(sliceInput, options = {}) {
|
|
456
|
+
const translator = lifecycleTranslator(options);
|
|
450
457
|
const closeBaseline = options.closeBaseline === true;
|
|
451
458
|
const discard = options.discard === true;
|
|
452
459
|
const forceDelete = options.force === true;
|
|
@@ -457,18 +464,18 @@ function cleanupSlice(sliceInput, options = {}) {
|
|
|
457
464
|
const worktreePath = path.join(worktreesRoot, safeBranchName(slice.branchName));
|
|
458
465
|
|
|
459
466
|
if (slice.isBaseline && !closeBaseline) {
|
|
460
|
-
console.log(
|
|
461
|
-
console.log('
|
|
467
|
+
console.log(translator.t('lifecycle.cleanup.baseline.info', { slice: slice.sliceId }));
|
|
468
|
+
console.log(translator.t('lifecycle.cleanup.baseline.close_hint'));
|
|
462
469
|
return;
|
|
463
470
|
}
|
|
464
471
|
|
|
465
472
|
if (!discard) {
|
|
466
473
|
const branch = currentBranch(repoRoot);
|
|
467
474
|
if (branch !== 'develop') {
|
|
468
|
-
throw new Error(`create-quiver:
|
|
475
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.branch', { branch })}`);
|
|
469
476
|
}
|
|
470
477
|
if (statusPorcelain(repoRoot) !== '') {
|
|
471
|
-
throw new Error(
|
|
478
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.dirty')}`);
|
|
472
479
|
}
|
|
473
480
|
|
|
474
481
|
try {
|
|
@@ -480,12 +487,12 @@ function cleanupSlice(sliceInput, options = {}) {
|
|
|
480
487
|
const localDevelopSha = runGit(['rev-parse', 'HEAD'], repoRoot);
|
|
481
488
|
const remoteDevelopSha = runGit(['rev-parse', 'origin/develop'], repoRoot);
|
|
482
489
|
if (localDevelopSha !== remoteDevelopSha) {
|
|
483
|
-
throw new Error(
|
|
490
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.develop_stale')}`);
|
|
484
491
|
}
|
|
485
492
|
|
|
486
493
|
if (hasLocalBranch(repoRoot, slice.branchName)) {
|
|
487
494
|
if (!mergeBaseIsAncestor(repoRoot, slice.branchName, 'origin/develop')) {
|
|
488
|
-
throw new Error(`create-quiver:
|
|
495
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.unmerged', { branch: slice.branchName })}`);
|
|
489
496
|
}
|
|
490
497
|
}
|
|
491
498
|
}
|
|
@@ -493,38 +500,38 @@ function cleanupSlice(sliceInput, options = {}) {
|
|
|
493
500
|
const worktreeExists = fs.existsSync(worktreePath);
|
|
494
501
|
const branchExists = hasLocalBranch(repoRoot, slice.branchName);
|
|
495
502
|
if (!worktreeExists && !branchExists) {
|
|
496
|
-
throw new Error(`create-quiver:
|
|
503
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.missing', { slice: slice.sliceId })}`);
|
|
497
504
|
}
|
|
498
505
|
|
|
499
506
|
const removeWorktree = () => worktreeRemove(repoRoot, worktreePath, forceDelete || discard);
|
|
500
507
|
const removeBranch = () => branchDelete(repoRoot, slice.branchName, forceDelete || discard);
|
|
501
508
|
|
|
502
509
|
if (dryRun) {
|
|
503
|
-
console.log(
|
|
510
|
+
console.log(translator.t('lifecycle.cleanup.dry_run.slice', { slice: slice.sliceId, branch: slice.branchName }));
|
|
504
511
|
if (worktreeExists) {
|
|
505
|
-
console.log(
|
|
512
|
+
console.log(translator.t('lifecycle.cleanup.dry_run.worktree', { force: forceDelete || discard ? '--force ' : '', path: worktreePath }));
|
|
506
513
|
}
|
|
507
514
|
if (branchExists) {
|
|
508
|
-
console.log(
|
|
515
|
+
console.log(translator.t('lifecycle.cleanup.dry_run.branch', { flag: forceDelete || discard ? '-D' : '-d', branch: slice.branchName }));
|
|
509
516
|
}
|
|
510
517
|
return;
|
|
511
518
|
}
|
|
512
519
|
|
|
513
520
|
if (worktreeExists) {
|
|
514
521
|
removeWorktree();
|
|
515
|
-
console.log(
|
|
522
|
+
console.log(translator.t('lifecycle.cleanup.removed_worktree', { path: worktreePath }));
|
|
516
523
|
}
|
|
517
524
|
if (branchExists) {
|
|
518
525
|
removeBranch();
|
|
519
|
-
console.log(
|
|
526
|
+
console.log(translator.t('lifecycle.cleanup.removed_branch', { branch: slice.branchName }));
|
|
520
527
|
}
|
|
521
528
|
|
|
522
529
|
if (removeActiveSlice(repoRoot)) {
|
|
523
|
-
console.log('
|
|
530
|
+
console.log(translator.t('lifecycle.cleanup.removed_active_slice'));
|
|
524
531
|
}
|
|
525
532
|
|
|
526
533
|
refreshActiveSlicesBoard(repoRoot);
|
|
527
|
-
console.log(
|
|
534
|
+
console.log(translator.t('lifecycle.cleanup.finished', { slice: slice.sliceId }));
|
|
528
535
|
}
|
|
529
536
|
|
|
530
537
|
module.exports = {
|
|
@@ -83,8 +83,28 @@ function safeBuildGraph(slices, allowGraphErrors) {
|
|
|
83
83
|
function resolveProjectState(projectRoot, options = {}) {
|
|
84
84
|
const specSlug = options.specSlug ? String(options.specSlug).trim() : '';
|
|
85
85
|
const rawSlices = readResolverSlices(projectRoot, specSlug);
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
let graph = safeBuildGraph(rawSlices, options.allowGraphErrors === true);
|
|
87
|
+
let orderedSlices;
|
|
88
|
+
|
|
89
|
+
try {
|
|
90
|
+
orderedSlices = graph.ok ? topoSort(graph).map(normalizeSliceRecord) : graph.nodes.slice().sort((left, right) => compareRefs(left.ref, right.ref));
|
|
91
|
+
} catch (error) {
|
|
92
|
+
if (!options.allowGraphErrors || !(error instanceof SliceGraphError)) {
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
graph = {
|
|
97
|
+
ok: false,
|
|
98
|
+
nodes: inferDependencies(rawSlices).map(normalizeSliceRecord),
|
|
99
|
+
edges: [],
|
|
100
|
+
cycles: Array.isArray(graph.cycles) ? graph.cycles : [],
|
|
101
|
+
error: {
|
|
102
|
+
code: error.code,
|
|
103
|
+
message: error.message,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
orderedSlices = graph.nodes.slice().sort((left, right) => compareRefs(left.ref, right.ref));
|
|
107
|
+
}
|
|
88
108
|
|
|
89
109
|
return {
|
|
90
110
|
graph,
|