create-quiver 0.15.3 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/pull_request_template.md +17 -0
- package/.github/workflows/ci.yml +79 -0
- package/.markdown-link-check.json +15 -0
- package/.markdownlint.json +11 -0
- package/.quiver/runs/run-2026-06-09t19-14-39z/approvals.json +5 -0
- package/.quiver/runs/run-2026-06-09t19-14-39z/decisions.md +2 -0
- package/.quiver/runs/run-2026-06-09t19-14-39z/requirement.md +0 -0
- package/.quiver/runs/run-2026-06-09t19-14-39z/snapshots/20260609T191439Z/docs/INDEX.md +97 -0
- package/.quiver/runs/run-2026-06-09t19-14-39z/snapshots/20260609T191439Z/manifest.json +61 -0
- package/.quiver/runs/run-2026-06-09t19-14-39z/state.json +28 -0
- package/ACTIVE_SLICES.md +43 -0
- package/AGENTS.md.es.template +37 -0
- package/ARCHITECTURE.md +133 -0
- package/CHANGELOG.md +12 -0
- package/CONTRIBUTING.md +174 -9
- package/README.md +10 -1
- package/ROADMAP.md +4 -0
- package/SECURITY.md +9 -2
- package/auditoria-ux-ui-performance-documentacion.md +705 -0
- package/copys-landing-page.md +244 -0
- package/docs/AI_CONTEXT.md.es.template +37 -0
- package/docs/AI_CONTEXT.md.template +3 -1
- package/docs/AI_ONBOARDING_PROMPT.md.es.template +22 -0
- package/docs/CLI_UX_GUIDE.md +55 -1
- package/docs/COMMANDS.md.es.template +28 -0
- package/docs/COMMANDS.md.template +20 -6
- package/docs/CONTEXTO.md.es.template +33 -0
- package/docs/DECISIONS.md.es.template +17 -0
- package/docs/GITFLOW_PR_GUIDE.md +73 -11
- package/docs/GITFLOW_PR_GUIDE.md.es.template +84 -0
- package/docs/GITFLOW_PR_GUIDE.md.template +72 -10
- package/docs/INDEX.md +11 -1
- package/docs/INDEX.md.es.template +36 -0
- package/docs/QUICK.md.template +2 -1
- package/docs/STANDARD.md.template +2 -1
- package/docs/STATUS.md.es.template +28 -0
- package/docs/SUPPORT_MATRIX.md.es.template +22 -0
- package/docs/TESTING_GUIDE_FOR_AI.md.es.template +19 -0
- package/docs/TROUBLESHOOTING.md.es.template +35 -0
- package/docs/WORKFLOW.md.es.template +31 -0
- package/docs/WORKFLOW.md.template +6 -4
- package/docs/ai/ACTIVE_SLICE.md +61 -0
- package/docs/ai/LESSONS.md.es.template +24 -0
- package/docs/getting-started/installation.md +26 -0
- package/docs/reference/commands.md +159 -7
- package/docs/reference/slice-schema.md +37 -0
- package/docs/schema/slice.schema.json +221 -0
- package/docs/specs/01-spec/01-slice/01-slice.json +36 -0
- package/docs/specs/01-spec/01-slice/01-slice.md +106 -0
- package/docs/specs/01-spec/01-slice/CLOSURE_BRIEF.md +80 -0
- package/docs/specs/01-spec/01-slice/EXECUTION_BRIEF.md +39 -0
- package/docs/specs/01-spec/02-slice/02-slice.json +36 -0
- package/docs/specs/01-spec/02-slice/02-slice.md +108 -0
- package/docs/specs/01-spec/02-slice/CLOSURE_BRIEF.md +88 -0
- package/docs/specs/01-spec/02-slice/EXECUTION_BRIEF.md +40 -0
- package/docs/specs/01-spec/03-slice/03-slice.json +36 -0
- package/docs/specs/01-spec/03-slice/03-slice.md +103 -0
- package/docs/specs/01-spec/03-slice/CLOSURE_BRIEF.md +54 -0
- package/docs/specs/01-spec/03-slice/EXECUTION_BRIEF.md +39 -0
- package/docs/specs/01-spec/04-slice/04-slice.json +36 -0
- package/docs/specs/01-spec/04-slice/04-slice.md +107 -0
- package/docs/specs/01-spec/04-slice/CLOSURE_BRIEF.md +46 -0
- package/docs/specs/01-spec/04-slice/EXECUTION_BRIEF.md +39 -0
- package/docs/specs/01-spec/05-slice/05-slice.json +36 -0
- package/docs/specs/01-spec/05-slice/05-slice.md +106 -0
- package/docs/specs/01-spec/05-slice/CLOSURE_BRIEF.md +84 -0
- package/docs/specs/01-spec/05-slice/EXECUTION_BRIEF.md +109 -0
- package/docs/specs/01-spec/06-slice/06-slice.json +36 -0
- package/docs/specs/01-spec/06-slice/06-slice.md +107 -0
- package/docs/specs/01-spec/06-slice/CLOSURE_BRIEF.md +67 -0
- package/docs/specs/01-spec/06-slice/EXECUTION_BRIEF.md +39 -0
- package/docs/specs/01-spec/07-slice/07-slice.json +36 -0
- package/docs/specs/01-spec/07-slice/07-slice.md +105 -0
- package/docs/specs/01-spec/07-slice/CLOSURE_BRIEF.md +71 -0
- package/docs/specs/01-spec/07-slice/EXECUTION_BRIEF.md +39 -0
- package/docs/specs/01-spec/08-slice/08-slice.json +36 -0
- package/docs/specs/01-spec/08-slice/08-slice.md +105 -0
- package/docs/specs/01-spec/08-slice/CLOSURE_BRIEF.md +114 -0
- package/docs/specs/01-spec/08-slice/EXECUTION_BRIEF.md +39 -0
- package/docs/specs/01-spec/CLOSURE_BRIEF.md +87 -0
- package/docs/specs/01-spec/spec.md +197 -0
- package/docs/workflows/full-ai-spec-to-pr.md +46 -3
- package/i18n/es/docs/GITFLOW_PR_GUIDE.md.template +38 -1
- package/package.json +27 -1
- package/pr.md +154 -0
- package/scripts/package-quiver.sh +82 -2
- package/scripts/release-quiver.sh +14 -3
- package/specs/[project-name]/slices/pr.md.template +19 -0
- package/specs/quiver-v37-cli-i18n-foundation/EVIDENCE_REPORT.md +73 -0
- package/specs/quiver-v37-cli-i18n-foundation/EXECUTION_PLAN.md +34 -0
- package/specs/quiver-v37-cli-i18n-foundation/SPEC.md +91 -0
- package/specs/quiver-v37-cli-i18n-foundation/STATUS.md +29 -0
- package/specs/quiver-v37-cli-i18n-foundation/pr.md +97 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-00-foundation-and-program-roadmap/slice.json +54 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/CLOSURE_BRIEF.md +30 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/EXECUTION_BRIEF.md +27 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-01-language-resolution-contract/slice.json +66 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/CLOSURE_BRIEF.md +27 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/EXECUTION_BRIEF.md +26 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-02-message-catalog-interpolation/slice.json +62 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/CLOSURE_BRIEF.md +32 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/EXECUTION_BRIEF.md +25 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-03-config-language-command/slice.json +66 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/CLOSURE_BRIEF.md +30 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/EXECUTION_BRIEF.md +24 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-04-parser-help-error-foundation/slice.json +65 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/CLOSURE_BRIEF.md +27 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v37-cli-i18n-foundation/slices/slice-05-foundation-docs-tests-package-readiness/slice.json +67 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/EVIDENCE_REPORT.md +69 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/EXECUTION_PLAN.md +25 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/SPEC.md +52 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/STATUS.md +24 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/pr.md +119 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/EXECUTION_BRIEF.md +21 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-00-read-only-foundation/slice.json +53 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/CLOSURE_BRIEF.md +17 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-01-version-dashboard-help/slice.json +69 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/CLOSURE_BRIEF.md +13 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-02-flow-doctor-next-graph/slice.json +77 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/CLOSURE_BRIEF.md +12 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-03-ai-inspection-and-export/slice.json +66 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/CLOSURE_BRIEF.md +13 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v38-cli-i18n-read-only-commands/slices/slice-04-read-only-tests-smokes/slice.json +61 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/EVIDENCE_REPORT.md +71 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/EXECUTION_PLAN.md +25 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/SPEC.md +53 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/STATUS.md +24 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/pr.md +104 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/EXECUTION_BRIEF.md +21 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-00-setup-foundation/slice.json +53 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/CLOSURE_BRIEF.md +12 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-01-init-interactive-language/slice.json +68 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/CLOSURE_BRIEF.md +12 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-02-analyze-migrate-prepare/slice.json +62 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/CLOSURE_BRIEF.md +12 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-03-demo-evidence-onboarding/slice.json +72 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/CLOSURE_BRIEF.md +15 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v39-cli-i18n-setup-onboarding/slices/slice-04-setup-tests-smokes/slice.json +61 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/EVIDENCE_REPORT.md +50 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/EXECUTION_PLAN.md +25 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/SPEC.md +52 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/STATUS.md +24 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/pr.md +94 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/EXECUTION_BRIEF.md +21 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-00-spec-slice-foundation/slice.json +53 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/CLOSURE_BRIEF.md +12 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-01-spec-create-start-status/slice.json +63 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-02-spec-validate-close/slice.json +63 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-03-slice-lifecycle-handoffs/slice.json +72 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/CLOSURE_BRIEF.md +15 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v40-cli-i18n-spec-slice-workflows/slices/slice-04-spec-slice-tests-smokes/slice.json +69 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/EVIDENCE_REPORT.md +90 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/EXECUTION_PLAN.md +33 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/SPEC.md +57 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/STATUS.md +26 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/pr.md +103 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/EXECUTION_BRIEF.md +21 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-00-ai-i18n-foundation/slice.json +53 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/CLOSURE_BRIEF.md +13 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-01-ai-run-status-resume/slice.json +68 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/CLOSURE_BRIEF.md +12 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-02-ai-agent-models/slice.json +66 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/CLOSURE_BRIEF.md +12 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-03-ai-planner-approval-review/slice.json +68 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/CLOSURE_BRIEF.md +13 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-04-ai-execution-pr/slice.json +72 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/CLOSURE_BRIEF.md +15 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-05-ai-tests-smokes/slice.json +66 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/CLOSURE_BRIEF.md +11 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v41-cli-i18n-ai-lifecycle/slices/slice-06-ai-prepare-context-progress-i18n-fix/slice.json +70 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/EVIDENCE_REPORT.md +64 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/EXECUTION_PLAN.md +26 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/SPEC.md +52 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/STATUS.md +24 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/pr.md +125 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/EXECUTION_BRIEF.md +21 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-00-generated-docs-foundation/slice.json +53 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-01-template-language-routing/slice.json +62 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/CLOSURE_BRIEF.md +11 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-02-init-docs-and-i18n-assets/slice.json +72 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/CLOSURE_BRIEF.md +12 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-03-docs-reference-guides/slice.json +60 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/CLOSURE_BRIEF.md +16 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v42-cli-i18n-generated-docs/slices/slice-04-generated-docs-tests-smokes/slice.json +62 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/EVIDENCE_REPORT.md +203 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/EXECUTION_PLAN.md +27 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/SPEC.md +54 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/STATUS.md +24 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/command-language-mode-matrix.json +636 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/cross-platform-smoke-matrix.md +35 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/pr.md +155 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/EXECUTION_BRIEF.md +21 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-00-audit-foundation/slice.json +53 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/CLOSURE_BRIEF.md +13 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-01-command-language-mode-matrix/slice.json +62 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/CLOSURE_BRIEF.md +18 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/EXECUTION_BRIEF.md +22 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-02-public-string-audit/slice.json +59 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/CLOSURE_BRIEF.md +15 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-03-cross-platform-smokes/slice.json +62 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/CLOSURE_BRIEF.md +17 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/EXECUTION_BRIEF.md +24 -0
- package/specs/quiver-v43-cli-i18n-audit-release-readiness/slices/slice-04-package-release-readiness/slice.json +66 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/EVIDENCE_REPORT.md +18 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/EXECUTION_PLAN.md +31 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/SPEC.md +118 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/STATUS.md +25 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/pr.md +92 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/CLOSURE_BRIEF.md +11 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-00-tui-lite-contract-foundation/slice.json +64 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/EXECUTION_BRIEF.md +24 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-01-provider-stream-hooks/slice.json +65 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/EXECUTION_BRIEF.md +24 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-02-live-output-renderer/slice.json +70 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/EXECUTION_BRIEF.md +25 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-03-prepare-context-integration/slice.json +70 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/EXECUTION_BRIEF.md +26 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-04-planner-command-audit-adoption/slice.json +72 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/CLOSURE_BRIEF.md +15 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/EXECUTION_BRIEF.md +26 -0
- package/specs/quiver-v44-provider-live-output-tui-lite/slices/slice-05-docs-tests-readiness/slice.json +75 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/EVIDENCE_REPORT.md +30 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/EXECUTION_PLAN.md +22 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/SPEC.md +49 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/STATUS.md +21 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/pr.md +67 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/CLOSURE_BRIEF.md +10 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/EXECUTION_BRIEF.md +21 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-00-ci-actions-foundation/slice.json +48 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/CLOSURE_BRIEF.md +14 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/EXECUTION_BRIEF.md +23 -0
- package/specs/quiver-v45-ci-actions-node24-readiness/slices/slice-01-actions-node24-readiness/slice.json +65 -0
- package/specs/quiver-v50-audit-trust-foundation/EVIDENCE_REPORT.md +151 -0
- package/specs/quiver-v50-audit-trust-foundation/EXECUTION_PLAN.md +34 -0
- package/specs/quiver-v50-audit-trust-foundation/SPEC.md +113 -0
- package/specs/quiver-v50-audit-trust-foundation/STATUS.md +26 -0
- package/specs/quiver-v50-audit-trust-foundation/pr.md +120 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/CLOSURE_BRIEF.md +20 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/EXECUTION_BRIEF.md +58 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-00-audit-baseline-and-resolved-findings/slice.json +57 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/CLOSURE_BRIEF.md +24 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/EXECUTION_BRIEF.md +67 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-01-runtime-minimum-and-package-metadata/slice.json +71 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/CLOSURE_BRIEF.md +24 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/EXECUTION_BRIEF.md +71 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-02-migrate-write-safety-contract/slice.json +81 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/CLOSURE_BRIEF.md +22 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/EXECUTION_BRIEF.md +57 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-03-security-reporting-channel/slice.json +56 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/CLOSURE_BRIEF.md +23 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/EXECUTION_BRIEF.md +68 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-04-user-facing-i18n-error-coverage/slice.json +84 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/CLOSURE_BRIEF.md +25 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/EXECUTION_BRIEF.md +73 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-05-init-analyze-progress-and-summaries/slice.json +72 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/CLOSURE_BRIEF.md +22 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/EXECUTION_BRIEF.md +66 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-06-contributor-and-architecture-docs/slice.json +74 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/CLOSURE_BRIEF.md +29 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/EXECUTION_BRIEF.md +74 -0
- package/specs/quiver-v50-audit-trust-foundation/slices/slice-07-ci-and-documentation-lint-baseline/slice.json +81 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/EVIDENCE_REPORT.md +145 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/EXECUTION_PLAN.md +32 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/SPEC.md +109 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/STATUS.md +25 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/pr.md +69 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/CLOSURE_BRIEF.md +20 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/EXECUTION_BRIEF.md +58 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-00-cli-contract-baseline/slice.json +56 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/CLOSURE_BRIEF.md +21 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/EXECUTION_BRIEF.md +61 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-01-flow-json-compatibility/slice.json +68 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/CLOSURE_BRIEF.md +25 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/EXECUTION_BRIEF.md +65 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/pr.md +134 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-02-dashboard-section-validation-i18n/slice.json +80 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/CLOSURE_BRIEF.md +31 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/EXECUTION_BRIEF.md +80 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/pr.md +159 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-03-base-branch-resolution-policy/slice.json +102 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/CLOSURE_BRIEF.md +25 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/EXECUTION_BRIEF.md +74 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/pr.md +147 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-04-next-plan-graph-ux-edge-cases/slice.json +91 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/CLOSURE_BRIEF.md +28 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/EXECUTION_BRIEF.md +73 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/pr.md +146 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-05-evidence-robustness-path-safety/slice.json +100 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/CLOSURE_BRIEF.md +36 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/EXECUTION_BRIEF.md +76 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/pr.md +155 -0
- package/specs/quiver-v51-cli-ergonomics-automation-contracts/slices/slice-06-namespace-compatibility-windows-scripts/slice.json +111 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/EVIDENCE_REPORT.md +95 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/EXECUTION_PLAN.md +31 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/SPEC.md +107 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/STATUS.md +22 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/pr.md +69 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/CLOSURE_BRIEF.md +21 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/EXECUTION_BRIEF.md +60 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-00-schema-docs-release-baseline/slice.json +62 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/CLOSURE_BRIEF.md +34 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/EXECUTION_BRIEF.md +71 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/pr.md +146 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-01-json-schema-for-slice-json/slice.json +106 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/EXECUTION_BRIEF.md +67 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/pr.md +144 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-02-generated-cli-reference/slice.json +86 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/CLOSURE_BRIEF.md +38 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/EXECUTION_BRIEF.md +75 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/pr.md +159 -0
- package/specs/quiver-v52-schema-docs-release-hygiene/slices/slice-03-changelog-package-release-smoke-hygiene/slice.json +105 -0
- package/src/create-quiver/commands/ai.js +485 -307
- package/src/create-quiver/commands/changelog.js +93 -0
- package/src/create-quiver/commands/config.js +135 -0
- package/src/create-quiver/commands/demo.js +2 -2
- package/src/create-quiver/commands/evidence.js +39 -6
- package/src/create-quiver/commands/flow.js +109 -16
- package/src/create-quiver/commands/graph.js +9 -2
- package/src/create-quiver/commands/next.js +21 -18
- package/src/create-quiver/commands/plan.js +29 -6
- package/src/create-quiver/commands/spec.js +94 -70
- package/src/create-quiver/index.js +798 -223
- package/src/create-quiver/lib/ai/execution-plan.js +23 -20
- package/src/create-quiver/lib/ai/executor.js +60 -44
- package/src/create-quiver/lib/ai/export-state.js +75 -64
- package/src/create-quiver/lib/ai/github.js +29 -23
- package/src/create-quiver/lib/ai/run-state.js +28 -25
- package/src/create-quiver/lib/ai/spec-templates.js +19 -0
- package/src/create-quiver/lib/cli/command-registry.js +71 -0
- package/src/create-quiver/lib/cli/parser.js +14 -0
- package/src/create-quiver/lib/dashboard.js +154 -111
- package/src/create-quiver/lib/demo.js +14 -12
- package/src/create-quiver/lib/evidence.js +161 -6
- package/src/create-quiver/lib/git.js +99 -0
- package/src/create-quiver/lib/handoff.js +16 -7
- package/src/create-quiver/lib/i18n/catalog.js +152 -0
- package/src/create-quiver/lib/i18n/language.js +279 -0
- package/src/create-quiver/lib/i18n/messages/en.js +898 -0
- package/src/create-quiver/lib/i18n/messages/es.js +1013 -0
- package/src/create-quiver/lib/i18n/read-only-format.js +26 -0
- package/src/create-quiver/lib/i18n/templates.js +172 -0
- package/src/create-quiver/lib/init-docs.js +19 -5
- package/src/create-quiver/lib/init-layout.js +15 -8
- package/src/create-quiver/lib/lifecycle.js +72 -67
- package/src/create-quiver/lib/readiness.js +131 -110
- package/src/create-quiver/lib/renderers/tree.js +9 -6
- package/src/create-quiver/lib/spec-worktrees.js +50 -64
- package/src/create-quiver/lib/version.js +11 -9
|
@@ -0,0 +1,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';
|
|
@@ -633,7 +645,7 @@ Use this section only for projects generated with the full compatibility layout.
|
|
|
633
645
|
5. Check the next ready slice with \`{{NEXT_COMMAND}}\` or \`npm run quiver:next\`.
|
|
634
646
|
6. Start work with \`{{START_SLICE_COMMAND}}\` or \`npm run quiver:start-slice -- <slice.json>\`.
|
|
635
647
|
7. Make one commit per slice.
|
|
636
|
-
8. Open one PR per
|
|
648
|
+
8. Open one PR per slice by default; group slices only when \`docs/GITFLOW_PR_GUIDE.md\` allows it.
|
|
637
649
|
|
|
638
650
|
## Verification Checklist
|
|
639
651
|
|
|
@@ -686,6 +698,7 @@ function initializeProjectDocs(options) {
|
|
|
686
698
|
migrateMode = false,
|
|
687
699
|
profile = 'default',
|
|
688
700
|
templateRoot: providedTemplateRoot = '',
|
|
701
|
+
language = '',
|
|
689
702
|
} = options;
|
|
690
703
|
|
|
691
704
|
const templateRoot = providedTemplateRoot || path.join(projectRoot, 'docs-template');
|
|
@@ -747,8 +760,9 @@ function initializeProjectDocs(options) {
|
|
|
747
760
|
operations.push({ source: 'packaged templates', destination: '.quiver/templates', result: 'merged' });
|
|
748
761
|
}
|
|
749
762
|
|
|
750
|
-
const
|
|
751
|
-
|
|
763
|
+
const templateLanguageOptions = { language, projectRoot };
|
|
764
|
+
const agentsSourcePath = resolveGeneratedTemplatePath(templateRoot, 'AGENTS.md.template', templateLanguageOptions);
|
|
765
|
+
if (agentsSourcePath) {
|
|
752
766
|
const agentsDestinationPath = path.join(projectRoot, 'AGENTS.md');
|
|
753
767
|
const result = copyRenderedFile(agentsSourcePath, agentsDestinationPath, replacements, true);
|
|
754
768
|
operations.push({ source: 'AGENTS.md.template', destination: 'AGENTS.md', result });
|
|
@@ -814,8 +828,8 @@ function initializeProjectDocs(options) {
|
|
|
814
828
|
continue;
|
|
815
829
|
}
|
|
816
830
|
|
|
817
|
-
const sourcePath =
|
|
818
|
-
if (!
|
|
831
|
+
const sourcePath = resolveGeneratedTemplatePath(templateRoot, source, templateLanguageOptions);
|
|
832
|
+
if (!sourcePath) {
|
|
819
833
|
continue;
|
|
820
834
|
}
|
|
821
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,
|
|
@@ -213,14 +214,15 @@ function resolveInitPackageScripts(profile, options = {}) {
|
|
|
213
214
|
'quiver:spec:status': 'npx create-quiver spec status',
|
|
214
215
|
'quiver:spec:validate': 'npx create-quiver spec validate',
|
|
215
216
|
'quiver:spec:close': 'npx create-quiver spec close',
|
|
216
|
-
'quiver:start-slice': 'npx create-quiver start
|
|
217
|
-
'quiver:check-slice': 'npx create-quiver check
|
|
218
|
-
'quiver:check-pr': 'npx create-quiver
|
|
219
|
-
'quiver:check-handoff': 'npx create-quiver check
|
|
220
|
-
'check-handoff': 'npx create-quiver check
|
|
221
|
-
'quiver:
|
|
222
|
-
'quiver:
|
|
223
|
-
'quiver:
|
|
217
|
+
'quiver:start-slice': 'npx create-quiver slice start',
|
|
218
|
+
'quiver:check-slice': 'npx create-quiver slice check',
|
|
219
|
+
'quiver:check-pr': 'npx create-quiver slice pr',
|
|
220
|
+
'quiver:check-handoff': 'npx create-quiver handoff check',
|
|
221
|
+
'check-handoff': 'npx create-quiver handoff check',
|
|
222
|
+
'quiver:new-handoff': 'npx create-quiver handoff new',
|
|
223
|
+
'quiver:cleanup-slice': 'npx create-quiver slice cleanup',
|
|
224
|
+
'quiver:check-scope': 'npx create-quiver slice scope',
|
|
225
|
+
'quiver:refresh-active-slices': 'npx create-quiver slice refresh-active',
|
|
224
226
|
};
|
|
225
227
|
|
|
226
228
|
if (profile === 'full' || options.legacyScripts === true) {
|
|
@@ -353,6 +355,7 @@ function buildInitLayout(projectRoot, options = {}) {
|
|
|
353
355
|
projectSlug,
|
|
354
356
|
targetRoot: path.resolve(projectRoot),
|
|
355
357
|
flags: normalized,
|
|
358
|
+
language: normalized.language,
|
|
356
359
|
operations,
|
|
357
360
|
ignoredPaths: [...new Set(ignoredPaths)],
|
|
358
361
|
risks,
|
|
@@ -374,6 +377,10 @@ function formatInitLayoutPlan(plan) {
|
|
|
374
377
|
lines.push(`- Slug: ${plan.projectSlug}`);
|
|
375
378
|
lines.push(`- Target: ${plan.targetRoot}`);
|
|
376
379
|
lines.push(`- Profile: ${plan.profile}`);
|
|
380
|
+
if (plan.language) {
|
|
381
|
+
lines.push(`- Language: ${plan.language}`);
|
|
382
|
+
lines.push('- Language config: write .quiver/config.json');
|
|
383
|
+
}
|
|
377
384
|
lines.push(`- Entry point: ${entryPoint}`);
|
|
378
385
|
lines.push(`- Planned create: ${plan.summary.create}`);
|
|
379
386
|
lines.push(`- Planned update: ${plan.summary.update}`);
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
const fs = require('fs');
|
|
2
2
|
const path = require('path');
|
|
3
|
-
const { branchDelete, catFileExists, currentBranch, fetchBranch, fetchRemote, hasLocalBranch,
|
|
3
|
+
const { branchDelete, catFileExists, currentBranch, fetchBranch, fetchRemote, hasLocalBranch, isGitWorktree, isLinkedWorktree, lsRemoteHeads, mergeBaseIsAncestor, resolveBaseRef: resolveGitBaseRef, 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,22 +272,15 @@ function refreshActiveSlicesBoard(repoRoot) {
|
|
|
267
272
|
return outputPath;
|
|
268
273
|
}
|
|
269
274
|
|
|
270
|
-
function resolveBaseRef(repoRoot, baseBranch) {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
if (lsRemoteHeads(repoRoot, baseBranch)) {
|
|
278
|
-
try {
|
|
279
|
-
fetchBranch(repoRoot, baseBranch);
|
|
280
|
-
return `origin/${baseBranch}`;
|
|
281
|
-
} catch {
|
|
282
|
-
throw new Error(`create-quiver: origin existe pero no se pudo actualizar '${baseBranch}'. Revisa conectividad o crea la rama local '${baseBranch}' antes de correr start-slice.`);
|
|
283
|
-
}
|
|
275
|
+
function resolveBaseRef(repoRoot, baseBranch, translator = lifecycleTranslator()) {
|
|
276
|
+
const resolution = resolveGitBaseRef(repoRoot, {
|
|
277
|
+
explicitBaseBranch: baseBranch,
|
|
278
|
+
missingOk: true,
|
|
279
|
+
});
|
|
280
|
+
if (resolution.baseRef) {
|
|
281
|
+
return resolution.baseRef;
|
|
284
282
|
}
|
|
285
|
-
throw new Error(`create-quiver:
|
|
283
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.base_ref.missing', { base: resolution.baseBranch || baseBranch, remoteRef: `origin/${resolution.baseBranch || baseBranch}` })}`);
|
|
286
284
|
}
|
|
287
285
|
|
|
288
286
|
function findExistingWorktreeForBranch(repoRoot, branchName) {
|
|
@@ -326,6 +324,7 @@ function formatNestedSliceWorktree(branchName, existingWorktreePath = '') {
|
|
|
326
324
|
}
|
|
327
325
|
|
|
328
326
|
function startSlice(sliceInput, options = {}) {
|
|
327
|
+
const translator = lifecycleTranslator(options);
|
|
329
328
|
const allowDraft = options.allowDraft === true || process.env.ALLOW_DRAFT_SLICE === '1';
|
|
330
329
|
const repoRoot = runGit(['rev-parse', '--show-toplevel'], process.cwd());
|
|
331
330
|
const slice = resolveSliceContext(repoRoot, sliceInput);
|
|
@@ -338,19 +337,19 @@ function startSlice(sliceInput, options = {}) {
|
|
|
338
337
|
validateSliceMetaForStart(slice);
|
|
339
338
|
|
|
340
339
|
if (slice.status === 'blocked') {
|
|
341
|
-
throw new Error(
|
|
340
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.start.error.blocked')}`);
|
|
342
341
|
}
|
|
343
342
|
if (slice.status === 'cancelled') {
|
|
344
|
-
throw new Error(
|
|
343
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.start.error.cancelled')}`);
|
|
345
344
|
}
|
|
346
345
|
if (slice.status === 'completed') {
|
|
347
|
-
console.log('
|
|
346
|
+
console.log(translator.t('lifecycle.start.warn.completed'));
|
|
348
347
|
}
|
|
349
348
|
if (slice.status === 'draft' && !allowDraft) {
|
|
350
|
-
throw new Error(
|
|
349
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.start.error.draft')}`);
|
|
351
350
|
}
|
|
352
351
|
if (slice.status === 'draft') {
|
|
353
|
-
console.log('
|
|
352
|
+
console.log(translator.t('lifecycle.start.warn.draft'));
|
|
354
353
|
}
|
|
355
354
|
|
|
356
355
|
return withLockSync(repoRoot, `slice-worktree-${slice.branchName}`, {
|
|
@@ -375,19 +374,19 @@ function startSlice(sliceInput, options = {}) {
|
|
|
375
374
|
writeWorktreeContext(existingWorktreePath, slice, slice.branchName);
|
|
376
375
|
const activeSlice = writeActiveSlice(repoRoot, slice);
|
|
377
376
|
if (activeSlice.replaced) {
|
|
378
|
-
console.log('
|
|
377
|
+
console.log(translator.t('lifecycle.active_slice.replaced'));
|
|
379
378
|
} else {
|
|
380
|
-
console.log('
|
|
379
|
+
console.log(translator.t('lifecycle.active_slice.wrote'));
|
|
381
380
|
}
|
|
382
381
|
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(
|
|
382
|
+
console.log(translator.t('lifecycle.start.existing_worktree'));
|
|
383
|
+
console.log(translator.t('lifecycle.label.alias', { value: toAlias(slice.ticket) }));
|
|
384
|
+
console.log(translator.t('lifecycle.label.spec', { value: slice.specSlug }));
|
|
385
|
+
console.log(translator.t('lifecycle.label.slice', { value: slice.sliceId }));
|
|
386
|
+
console.log(translator.t('lifecycle.label.ticket', { value: slice.ticket }));
|
|
387
|
+
console.log(translator.t('lifecycle.label.branch', { value: slice.branchName }));
|
|
388
|
+
console.log(translator.t('lifecycle.label.base', { value: slice.baseBranch }));
|
|
389
|
+
console.log(translator.t('lifecycle.label.worktree', { value: existingWorktreePath }));
|
|
391
390
|
return { worktreePath: existingWorktreePath, reused: true };
|
|
392
391
|
}
|
|
393
392
|
|
|
@@ -418,35 +417,36 @@ function startSlice(sliceInput, options = {}) {
|
|
|
418
417
|
}
|
|
419
418
|
worktreeAdd(repoRoot, worktreePath, slice.branchName);
|
|
420
419
|
} else {
|
|
421
|
-
const baseRef = resolveBaseRef(repoRoot, slice.baseBranch);
|
|
420
|
+
const baseRef = resolveBaseRef(repoRoot, slice.baseBranch, translator);
|
|
422
421
|
worktreeAdd(repoRoot, worktreePath, baseRef, { branch: slice.branchName });
|
|
423
422
|
}
|
|
424
423
|
|
|
425
424
|
writeWorktreeContext(worktreePath, slice, slice.branchName);
|
|
426
425
|
const activeSlice = writeActiveSlice(repoRoot, slice);
|
|
427
426
|
if (activeSlice.replaced) {
|
|
428
|
-
console.log('
|
|
427
|
+
console.log(translator.t('lifecycle.active_slice.replaced'));
|
|
429
428
|
} else {
|
|
430
|
-
console.log('
|
|
429
|
+
console.log(translator.t('lifecycle.active_slice.wrote'));
|
|
431
430
|
}
|
|
432
431
|
refreshActiveSlicesBoard(repoRoot);
|
|
433
432
|
|
|
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(
|
|
433
|
+
console.log(translator.t('lifecycle.start.ready'));
|
|
434
|
+
console.log(translator.t('lifecycle.label.alias', { value: toAlias(slice.ticket) }));
|
|
435
|
+
console.log(translator.t('lifecycle.label.spec', { value: slice.specSlug }));
|
|
436
|
+
console.log(translator.t('lifecycle.label.slice', { value: slice.sliceId }));
|
|
437
|
+
console.log(translator.t('lifecycle.label.ticket', { value: slice.ticket }));
|
|
438
|
+
console.log(translator.t('lifecycle.label.branch_type', { value: slice.branchType }));
|
|
439
|
+
console.log(translator.t('lifecycle.label.base', { value: slice.baseBranch }));
|
|
440
|
+
console.log(translator.t('lifecycle.label.slug', { value: slice.branchSlug }));
|
|
441
|
+
console.log(translator.t('lifecycle.label.branch', { value: slice.branchName }));
|
|
442
|
+
console.log(translator.t('lifecycle.label.worktree', { value: worktreePath }));
|
|
443
|
+
console.log(translator.t('lifecycle.label.context', { value: `${worktreePath}/WORKTREE_CONTEXT.md` }));
|
|
445
444
|
return { worktreePath, reused: false };
|
|
446
445
|
});
|
|
447
446
|
}
|
|
448
447
|
|
|
449
448
|
function cleanupSlice(sliceInput, options = {}) {
|
|
449
|
+
const translator = lifecycleTranslator(options);
|
|
450
450
|
const closeBaseline = options.closeBaseline === true;
|
|
451
451
|
const discard = options.discard === true;
|
|
452
452
|
const forceDelete = options.force === true;
|
|
@@ -457,35 +457,40 @@ function cleanupSlice(sliceInput, options = {}) {
|
|
|
457
457
|
const worktreePath = path.join(worktreesRoot, safeBranchName(slice.branchName));
|
|
458
458
|
|
|
459
459
|
if (slice.isBaseline && !closeBaseline) {
|
|
460
|
-
console.log(
|
|
461
|
-
console.log('
|
|
460
|
+
console.log(translator.t('lifecycle.cleanup.baseline.info', { slice: slice.sliceId }));
|
|
461
|
+
console.log(translator.t('lifecycle.cleanup.baseline.close_hint'));
|
|
462
462
|
return;
|
|
463
463
|
}
|
|
464
464
|
|
|
465
465
|
if (!discard) {
|
|
466
|
+
const base = resolveGitBaseRef(repoRoot, {
|
|
467
|
+
preferredBaseBranch: slice.baseBranch,
|
|
468
|
+
});
|
|
466
469
|
const branch = currentBranch(repoRoot);
|
|
467
|
-
if (branch !==
|
|
468
|
-
throw new Error(`create-quiver:
|
|
470
|
+
if (branch !== base.baseBranch) {
|
|
471
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.branch', { branch, base: base.baseBranch })}`);
|
|
469
472
|
}
|
|
470
473
|
if (statusPorcelain(repoRoot) !== '') {
|
|
471
|
-
throw new Error(
|
|
474
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.dirty')}`);
|
|
472
475
|
}
|
|
473
476
|
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
477
|
+
if (base.remote) {
|
|
478
|
+
try {
|
|
479
|
+
fetchRemote(repoRoot, base.remote, [base.baseBranch]);
|
|
480
|
+
} catch {
|
|
481
|
+
// Local-only test repos and offline environments can still validate against the current remote ref.
|
|
482
|
+
}
|
|
478
483
|
}
|
|
479
484
|
|
|
480
485
|
const localDevelopSha = runGit(['rev-parse', 'HEAD'], repoRoot);
|
|
481
|
-
const remoteDevelopSha = runGit(['rev-parse',
|
|
482
|
-
if (localDevelopSha !== remoteDevelopSha) {
|
|
483
|
-
throw new Error(
|
|
486
|
+
const remoteDevelopSha = runGit(['rev-parse', base.baseRef], repoRoot);
|
|
487
|
+
if (base.remote && localDevelopSha !== remoteDevelopSha) {
|
|
488
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.base_stale', { base: base.baseBranch, ref: base.baseRef })}`);
|
|
484
489
|
}
|
|
485
490
|
|
|
486
491
|
if (hasLocalBranch(repoRoot, slice.branchName)) {
|
|
487
|
-
if (!mergeBaseIsAncestor(repoRoot, slice.branchName,
|
|
488
|
-
throw new Error(`create-quiver:
|
|
492
|
+
if (!mergeBaseIsAncestor(repoRoot, slice.branchName, base.baseRef)) {
|
|
493
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.unmerged', { branch: slice.branchName, ref: base.baseRef })}`);
|
|
489
494
|
}
|
|
490
495
|
}
|
|
491
496
|
}
|
|
@@ -493,38 +498,38 @@ function cleanupSlice(sliceInput, options = {}) {
|
|
|
493
498
|
const worktreeExists = fs.existsSync(worktreePath);
|
|
494
499
|
const branchExists = hasLocalBranch(repoRoot, slice.branchName);
|
|
495
500
|
if (!worktreeExists && !branchExists) {
|
|
496
|
-
throw new Error(`create-quiver:
|
|
501
|
+
throw new Error(`create-quiver: ${translator.t('lifecycle.cleanup.error.missing', { slice: slice.sliceId })}`);
|
|
497
502
|
}
|
|
498
503
|
|
|
499
504
|
const removeWorktree = () => worktreeRemove(repoRoot, worktreePath, forceDelete || discard);
|
|
500
505
|
const removeBranch = () => branchDelete(repoRoot, slice.branchName, forceDelete || discard);
|
|
501
506
|
|
|
502
507
|
if (dryRun) {
|
|
503
|
-
console.log(
|
|
508
|
+
console.log(translator.t('lifecycle.cleanup.dry_run.slice', { slice: slice.sliceId, branch: slice.branchName }));
|
|
504
509
|
if (worktreeExists) {
|
|
505
|
-
console.log(
|
|
510
|
+
console.log(translator.t('lifecycle.cleanup.dry_run.worktree', { force: forceDelete || discard ? '--force ' : '', path: worktreePath }));
|
|
506
511
|
}
|
|
507
512
|
if (branchExists) {
|
|
508
|
-
console.log(
|
|
513
|
+
console.log(translator.t('lifecycle.cleanup.dry_run.branch', { flag: forceDelete || discard ? '-D' : '-d', branch: slice.branchName }));
|
|
509
514
|
}
|
|
510
515
|
return;
|
|
511
516
|
}
|
|
512
517
|
|
|
513
518
|
if (worktreeExists) {
|
|
514
519
|
removeWorktree();
|
|
515
|
-
console.log(
|
|
520
|
+
console.log(translator.t('lifecycle.cleanup.removed_worktree', { path: worktreePath }));
|
|
516
521
|
}
|
|
517
522
|
if (branchExists) {
|
|
518
523
|
removeBranch();
|
|
519
|
-
console.log(
|
|
524
|
+
console.log(translator.t('lifecycle.cleanup.removed_branch', { branch: slice.branchName }));
|
|
520
525
|
}
|
|
521
526
|
|
|
522
527
|
if (removeActiveSlice(repoRoot)) {
|
|
523
|
-
console.log('
|
|
528
|
+
console.log(translator.t('lifecycle.cleanup.removed_active_slice'));
|
|
524
529
|
}
|
|
525
530
|
|
|
526
531
|
refreshActiveSlicesBoard(repoRoot);
|
|
527
|
-
console.log(
|
|
532
|
+
console.log(translator.t('lifecycle.cleanup.finished', { slice: slice.sliceId }));
|
|
528
533
|
}
|
|
529
534
|
|
|
530
535
|
module.exports = {
|