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
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
const fs = require('fs');
|
|
2
2
|
const path = require('path');
|
|
3
|
-
const { catFileExists, currentBranch,
|
|
3
|
+
const { catFileExists, currentBranch, mergeBaseIsAncestor, resolveBaseRef, revListCount, runGit, statusPorcelain, worktreeList } = require('./git');
|
|
4
4
|
const { parseJsonWithComments } = require('./json');
|
|
5
|
+
const { createTranslator } = require('./i18n/catalog');
|
|
5
6
|
const { buildGraph, normalizeDeclaredDependencies, readAllSlices, SliceGraphError, topoSort } = require('./slice-graph');
|
|
6
7
|
const { resolveSliceContext, toAlias, validateSliceMetaForStart } = require('./slice');
|
|
7
8
|
const { validateProjectRelativePaths } = require('./paths');
|
|
@@ -12,6 +13,10 @@ function ensureExists(filePath, message) {
|
|
|
12
13
|
}
|
|
13
14
|
}
|
|
14
15
|
|
|
16
|
+
function readinessTranslator(options = {}) {
|
|
17
|
+
return createTranslator(options.language || 'es');
|
|
18
|
+
}
|
|
19
|
+
|
|
15
20
|
function walkSlices(rootDir, acc, repoRoot) {
|
|
16
21
|
if (!fs.existsSync(rootDir)) {
|
|
17
22
|
return;
|
|
@@ -57,7 +62,7 @@ function parseWorktrees(text) {
|
|
|
57
62
|
return entries;
|
|
58
63
|
}
|
|
59
64
|
|
|
60
|
-
function collectOverlapWarnings(repoRoot, currentBranchName, currentFiles, baseRef
|
|
65
|
+
function collectOverlapWarnings(repoRoot, currentBranchName, currentFiles, baseRef) {
|
|
61
66
|
const sliceMap = new Map();
|
|
62
67
|
walkSlices(path.join(repoRoot, 'specs'), sliceMap, repoRoot);
|
|
63
68
|
walkSlices(path.join(repoRoot, 'specs-fix'), sliceMap, repoRoot);
|
|
@@ -96,33 +101,42 @@ function collectOverlapWarnings(repoRoot, currentBranchName, currentFiles, baseR
|
|
|
96
101
|
return warnings;
|
|
97
102
|
}
|
|
98
103
|
|
|
99
|
-
function validateLocalSliceArtifacts(repoRoot, slice) {
|
|
104
|
+
function validateLocalSliceArtifacts(repoRoot, slice, translator) {
|
|
100
105
|
const sliceDir = path.dirname(slice.sliceAbs);
|
|
101
106
|
for (const file of ['EXECUTION_BRIEF.md', 'CLOSURE_BRIEF.md']) {
|
|
102
107
|
ensureExists(path.join(sliceDir, file), `create-quiver: falta '${path.posix.join(path.dirname(slice.sliceRel), file)}'.`);
|
|
103
108
|
}
|
|
104
|
-
console.log('
|
|
109
|
+
console.log(translator.t('readiness.local.briefs.pass'));
|
|
105
110
|
|
|
106
111
|
if (!Array.isArray(slice.json.files) || slice.json.files.length === 0) {
|
|
107
|
-
throw new Error(
|
|
112
|
+
throw new Error(`create-quiver: ${translator.t('readiness.local.files.error.empty')}`);
|
|
108
113
|
}
|
|
109
114
|
|
|
110
115
|
const invalidFiles = slice.json.files.filter((file) => typeof file !== 'string' || file.trim().length === 0);
|
|
111
116
|
if (invalidFiles.length > 0) {
|
|
112
|
-
throw new Error(
|
|
117
|
+
throw new Error(`create-quiver: ${translator.t('readiness.local.files.error.invalid')}`);
|
|
113
118
|
}
|
|
114
|
-
console.log('
|
|
119
|
+
console.log(translator.t('readiness.local.files.pass'));
|
|
115
120
|
|
|
116
121
|
validateSliceMetaForStart(slice);
|
|
117
|
-
console.log('
|
|
122
|
+
console.log(translator.t('readiness.local.git.pass'));
|
|
118
123
|
|
|
119
124
|
validateProjectRelativePaths(slice.files, 'slice.json files/allowed_write_paths');
|
|
120
125
|
validateProjectRelativePaths(slice.expectedReadPaths, 'slice.json expected_read_paths');
|
|
121
|
-
console.log('
|
|
126
|
+
console.log(translator.t('readiness.local.paths.pass'));
|
|
122
127
|
}
|
|
123
128
|
|
|
124
|
-
function baseRecoveryMessage(remote, baseBranch) {
|
|
125
|
-
return
|
|
129
|
+
function baseRecoveryMessage(remote, baseBranch, translator) {
|
|
130
|
+
return translator.t('readiness.base.recovery', { base: baseBranch, remote, remoteRef: `${remote}/${baseBranch}` });
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function resolveReadinessBase(repoRoot, slice, options = {}) {
|
|
134
|
+
return resolveBaseRef(repoRoot, {
|
|
135
|
+
explicitBaseBranch: options.baseBranch,
|
|
136
|
+
missingOk: true,
|
|
137
|
+
preferredBaseBranch: slice.baseBranch,
|
|
138
|
+
remote: options.remote || 'origin',
|
|
139
|
+
});
|
|
126
140
|
}
|
|
127
141
|
|
|
128
142
|
function resolveReadinessRoot(localMode) {
|
|
@@ -137,40 +151,40 @@ function resolveReadinessRoot(localMode) {
|
|
|
137
151
|
}
|
|
138
152
|
|
|
139
153
|
function validateSliceDocumentedOnBase(repoRoot, slice, options = {}) {
|
|
154
|
+
const translator = readinessTranslator(options);
|
|
140
155
|
const gate = options.gate || 'execution';
|
|
141
156
|
const remote = options.remote || 'origin';
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
157
|
+
const base = resolveReadinessBase(repoRoot, slice, {
|
|
158
|
+
baseBranch: options.baseBranch,
|
|
159
|
+
remote,
|
|
160
|
+
});
|
|
146
161
|
|
|
147
|
-
if (
|
|
148
|
-
console.log(
|
|
149
|
-
return
|
|
162
|
+
if (base.baseRef && base.remote && catFileExists(repoRoot, `${base.baseRef}:${slice.sliceRel}`)) {
|
|
163
|
+
console.log(translator.t('readiness.documented.remote.pass', { ref: base.baseRef }));
|
|
164
|
+
return base.baseRef;
|
|
150
165
|
}
|
|
151
166
|
|
|
152
|
-
if (
|
|
153
|
-
console.log(
|
|
154
|
-
return
|
|
167
|
+
if (base.baseRef && !base.remote && catFileExists(repoRoot, `${base.baseRef}:${slice.sliceRel}`)) {
|
|
168
|
+
console.log(translator.t('readiness.documented.local.pass', { branch: base.baseRef }));
|
|
169
|
+
return base.baseRef;
|
|
155
170
|
}
|
|
156
171
|
|
|
157
|
-
if (!
|
|
158
|
-
const guidance = baseRecoveryMessage(remote, baseBranch);
|
|
172
|
+
if (!base.baseRef) {
|
|
173
|
+
const guidance = baseRecoveryMessage(remote, base.baseBranch || base.candidates.map((candidate) => candidate.branch).join(', '), translator);
|
|
159
174
|
if (gate === 'validation') {
|
|
160
|
-
console.log(
|
|
175
|
+
console.log(translator.t('readiness.warn', { message: guidance }));
|
|
161
176
|
return null;
|
|
162
177
|
}
|
|
163
178
|
|
|
164
179
|
throw new Error(`create-quiver: ${guidance}`);
|
|
165
180
|
}
|
|
166
181
|
|
|
167
|
-
const expectedBase = hasRemoteBase ? remoteRef : baseBranch;
|
|
168
182
|
if (gate === 'validation') {
|
|
169
|
-
console.log(
|
|
170
|
-
return
|
|
183
|
+
console.log(translator.t('readiness.documented.missing_validation.warn', { ref: base.baseRef }));
|
|
184
|
+
return base.baseRef;
|
|
171
185
|
}
|
|
172
186
|
|
|
173
|
-
throw new Error(`create-quiver:
|
|
187
|
+
throw new Error(`create-quiver: ${translator.t('readiness.documented.missing.error', { ref: base.baseRef })}`);
|
|
174
188
|
}
|
|
175
189
|
|
|
176
190
|
function validateDeclaredDependencyContract(repoRoot, slice) {
|
|
@@ -227,165 +241,191 @@ function validateDeclaredDependencyContract(repoRoot, slice) {
|
|
|
227
241
|
}
|
|
228
242
|
}
|
|
229
243
|
|
|
230
|
-
function localCheckSummary() {
|
|
231
|
-
console.log('
|
|
232
|
-
console.log('
|
|
244
|
+
function localCheckSummary(translator) {
|
|
245
|
+
console.log(translator.t('readiness.local.summary.executed'));
|
|
246
|
+
console.log(translator.t('readiness.local.summary.skipped'));
|
|
233
247
|
}
|
|
234
248
|
|
|
235
249
|
function checkSliceReadiness(sliceInput, options = {}) {
|
|
250
|
+
const translator = readinessTranslator(options);
|
|
236
251
|
const gate = options.gate || 'execution';
|
|
237
252
|
const localMode = options.local === true;
|
|
238
253
|
const strictOverlap = options.strictOverlap === true;
|
|
239
254
|
const remote = options.remote || 'origin';
|
|
240
255
|
const repoRoot = resolveReadinessRoot(localMode);
|
|
241
256
|
const slice = resolveSliceContext(repoRoot, sliceInput);
|
|
242
|
-
const
|
|
257
|
+
const base = resolveReadinessBase(repoRoot, slice, {
|
|
258
|
+
baseBranch: options.baseBranch,
|
|
259
|
+
remote,
|
|
260
|
+
});
|
|
261
|
+
const baseBranch = base.baseBranch || options.baseBranch || slice.baseBranch || 'main';
|
|
243
262
|
|
|
244
263
|
for (const specFile of ['SPEC.md', 'STATUS.md', 'EVIDENCE_REPORT.md']) {
|
|
245
264
|
ensureExists(path.join(repoRoot, slice.specDirRel, specFile), `create-quiver: falta '${slice.specDirRel}/${specFile}'.`);
|
|
246
265
|
}
|
|
247
|
-
console.log('
|
|
266
|
+
console.log(translator.t('readiness.spec_docs.pass'));
|
|
248
267
|
|
|
249
268
|
let baseRef = null;
|
|
250
269
|
if (localMode) {
|
|
251
|
-
validateLocalSliceArtifacts(repoRoot, slice);
|
|
252
|
-
console.log(
|
|
253
|
-
console.log('
|
|
270
|
+
validateLocalSliceArtifacts(repoRoot, slice, translator);
|
|
271
|
+
console.log(translator.t('readiness.local.skip_base', { base: baseBranch, remoteRef: `${remote}/${baseBranch}` }));
|
|
272
|
+
console.log(translator.t('readiness.local.skip_overlap'));
|
|
254
273
|
} else {
|
|
255
274
|
baseRef = validateSliceDocumentedOnBase(repoRoot, slice, {
|
|
256
275
|
baseBranch,
|
|
257
276
|
gate,
|
|
277
|
+
language: options.language,
|
|
258
278
|
remote,
|
|
259
279
|
});
|
|
260
280
|
}
|
|
261
281
|
|
|
262
282
|
if (!localMode) {
|
|
263
|
-
const overlapWarnings = collectOverlapWarnings(repoRoot, currentBranch(repoRoot), slice.files, baseRef ||
|
|
283
|
+
const overlapWarnings = collectOverlapWarnings(repoRoot, currentBranch(repoRoot), slice.files, baseRef || base.baseRef);
|
|
264
284
|
if (overlapWarnings.length === 0) {
|
|
265
|
-
console.log('
|
|
285
|
+
console.log(translator.t('readiness.overlap.none.pass'));
|
|
266
286
|
} else {
|
|
267
287
|
for (const warning of overlapWarnings) {
|
|
268
288
|
const [overlapBranch, overlapFiles] = warning.split('|');
|
|
269
289
|
if (strictOverlap) {
|
|
270
|
-
throw new Error(`create-quiver:
|
|
290
|
+
throw new Error(`create-quiver: ${translator.t('readiness.overlap.warning', { branch: overlapBranch, files: overlapFiles })}`);
|
|
271
291
|
}
|
|
272
|
-
console.log(
|
|
292
|
+
console.log(translator.t('readiness.overlap.warn', { branch: overlapBranch, files: overlapFiles }));
|
|
273
293
|
}
|
|
274
294
|
}
|
|
275
295
|
}
|
|
276
296
|
|
|
277
297
|
validateDeclaredDependencyContract(repoRoot, slice);
|
|
278
298
|
if (localMode) {
|
|
279
|
-
localCheckSummary();
|
|
299
|
+
localCheckSummary(translator);
|
|
280
300
|
}
|
|
281
301
|
|
|
282
302
|
switch (gate) {
|
|
283
303
|
case 'ready':
|
|
284
304
|
if (slice.status !== 'ready') {
|
|
285
|
-
throw new Error(`create-quiver:
|
|
305
|
+
throw new Error(`create-quiver: ${translator.t('readiness.gate.ready.error_status', { status: slice.status })}`);
|
|
286
306
|
}
|
|
287
|
-
console.log('
|
|
307
|
+
console.log(translator.t('readiness.gate.ready.pass'));
|
|
288
308
|
break;
|
|
289
309
|
case 'execution':
|
|
290
310
|
if (slice.status === 'blocked') {
|
|
291
|
-
throw new Error(
|
|
311
|
+
throw new Error(`create-quiver: ${translator.t('readiness.gate.execution.error.blocked')}`);
|
|
292
312
|
}
|
|
293
313
|
if (slice.status === 'cancelled') {
|
|
294
|
-
throw new Error(
|
|
314
|
+
throw new Error(`create-quiver: ${translator.t('readiness.gate.execution.error.cancelled')}`);
|
|
295
315
|
}
|
|
296
316
|
if (slice.status === 'completed') {
|
|
297
|
-
console.log('
|
|
317
|
+
console.log(translator.t('readiness.gate.execution.warn.completed'));
|
|
298
318
|
}
|
|
299
319
|
if (slice.status === 'draft') {
|
|
300
|
-
console.log(
|
|
320
|
+
console.log(translator.t('readiness.gate.execution.warn.draft'));
|
|
301
321
|
}
|
|
302
|
-
console.log('
|
|
322
|
+
console.log(translator.t('readiness.gate.execution.pass'));
|
|
303
323
|
break;
|
|
304
324
|
case 'validation':
|
|
305
325
|
if (slice.status !== 'completed') {
|
|
306
|
-
throw new Error(
|
|
326
|
+
throw new Error(`create-quiver: ${translator.t('readiness.gate.validation.error_status')}`);
|
|
307
327
|
}
|
|
308
328
|
if (!slice.json.completed_at) {
|
|
309
|
-
throw new Error(
|
|
329
|
+
throw new Error(`create-quiver: ${translator.t('readiness.gate.validation.error_completed_at')}`);
|
|
310
330
|
}
|
|
311
331
|
if (!slice.json.started_at) {
|
|
312
|
-
throw new Error(
|
|
332
|
+
throw new Error(`create-quiver: ${translator.t('readiness.gate.validation.error_started_at')}`);
|
|
313
333
|
}
|
|
314
334
|
if (!slice.json.actual_hours || Number(slice.json.actual_hours) <= 0) {
|
|
315
|
-
throw new Error(
|
|
335
|
+
throw new Error(`create-quiver: ${translator.t('readiness.gate.validation.error_actual_hours')}`);
|
|
316
336
|
}
|
|
317
|
-
console.log('
|
|
337
|
+
console.log(translator.t('readiness.gate.validation.pass'));
|
|
318
338
|
break;
|
|
319
339
|
}
|
|
320
340
|
}
|
|
321
341
|
|
|
322
|
-
function checkPrReadiness(sliceInput) {
|
|
342
|
+
function checkPrReadiness(sliceInput, options = {}) {
|
|
343
|
+
const translator = readinessTranslator(options);
|
|
323
344
|
const repoRoot = runGit(['rev-parse', '--show-toplevel'], process.cwd());
|
|
324
|
-
const scriptDir = path.dirname(__filename);
|
|
325
345
|
const slice = resolveSliceContext(repoRoot, sliceInput);
|
|
326
346
|
const current = currentBranch(repoRoot);
|
|
327
347
|
const prPath = path.join(path.dirname(slice.sliceAbs), 'pr.md');
|
|
348
|
+
const remote = options.remote || 'origin';
|
|
349
|
+
const base = resolveReadinessBase(repoRoot, slice, {
|
|
350
|
+
baseBranch: options.baseBranch,
|
|
351
|
+
remote,
|
|
352
|
+
});
|
|
328
353
|
|
|
329
|
-
|
|
330
|
-
|
|
354
|
+
if (!base.baseRef) {
|
|
355
|
+
throw new Error(`create-quiver: ${baseRecoveryMessage(remote, base.baseBranch || base.candidates.map((candidate) => candidate.branch).join(', '), translator)}`);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
checkSliceReadiness(slice.sliceRel, {
|
|
359
|
+
baseBranch: base.baseBranch,
|
|
360
|
+
gate: 'validation',
|
|
361
|
+
language: options.language,
|
|
362
|
+
remote,
|
|
363
|
+
});
|
|
364
|
+
checkScope(slice.sliceRel, {
|
|
365
|
+
baseBranch: base.baseBranch,
|
|
366
|
+
language: options.language,
|
|
367
|
+
remote,
|
|
368
|
+
strict: true,
|
|
369
|
+
});
|
|
331
370
|
|
|
332
371
|
if (!slice.branchName) {
|
|
333
|
-
throw new Error(
|
|
372
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.missing_branch')}`);
|
|
334
373
|
}
|
|
335
374
|
if (!fs.existsSync(prPath)) {
|
|
336
|
-
throw new Error(
|
|
375
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.missing_pr')}`);
|
|
337
376
|
}
|
|
338
377
|
if (current !== slice.branchName) {
|
|
339
|
-
throw new Error(`create-quiver:
|
|
378
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.wrong_branch', { actual: current, expected: slice.branchName })}`);
|
|
340
379
|
}
|
|
341
|
-
console.log('
|
|
380
|
+
console.log(translator.t('readiness.pr.branch.pass'));
|
|
342
381
|
if (statusPorcelain(repoRoot) !== '') {
|
|
343
|
-
throw new Error(
|
|
382
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.dirty')}`);
|
|
344
383
|
}
|
|
345
|
-
console.log('
|
|
384
|
+
console.log(translator.t('readiness.pr.clean.pass'));
|
|
346
385
|
|
|
347
|
-
const aheadCount = revListCount(repoRoot,
|
|
386
|
+
const aheadCount = revListCount(repoRoot, `${base.baseRef}..HEAD`);
|
|
348
387
|
if (aheadCount <= 0) {
|
|
349
|
-
if (mergeBaseIsAncestor(repoRoot, 'HEAD',
|
|
350
|
-
throw new Error(
|
|
388
|
+
if (mergeBaseIsAncestor(repoRoot, 'HEAD', base.baseRef)) {
|
|
389
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.absorbed', { ref: base.baseRef })}`);
|
|
351
390
|
}
|
|
352
|
-
throw new Error(
|
|
391
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.no_commits', { ref: base.baseRef })}`);
|
|
353
392
|
}
|
|
354
|
-
console.log('
|
|
393
|
+
console.log(translator.t('readiness.pr.commits.pass', { ref: base.baseRef }));
|
|
355
394
|
|
|
356
395
|
const prText = fs.readFileSync(prPath, 'utf8');
|
|
357
396
|
for (const heading of ['## Title', '## Summary', '## Scope', '## Files', '## How to Test (DETAILED - REQUIRED)', '## Evidence', '## Rollback', '## Risks / Notes']) {
|
|
358
397
|
if (!prText.includes(heading)) {
|
|
359
|
-
throw new Error(`create-quiver:
|
|
398
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.missing_section', { heading })}`);
|
|
360
399
|
}
|
|
361
400
|
}
|
|
362
|
-
console.log('
|
|
401
|
+
console.log(translator.t('readiness.pr.sections.pass'));
|
|
363
402
|
|
|
364
403
|
for (const subheading of ['### Required Environment', '### Worktree Access', '### Run the Project', '### Use Cases', '### Technical Verification']) {
|
|
365
404
|
if (!prText.includes(subheading)) {
|
|
366
|
-
throw new Error(`create-quiver:
|
|
405
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.missing_subsection', { subheading })}`);
|
|
367
406
|
}
|
|
368
407
|
}
|
|
369
|
-
console.log('
|
|
408
|
+
console.log(translator.t('readiness.pr.how_to_test.pass'));
|
|
370
409
|
|
|
371
410
|
if (!/#### Case [0-9]+:/.test(prText)) {
|
|
372
|
-
throw new Error(
|
|
411
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.no_case')}`);
|
|
373
412
|
}
|
|
374
|
-
console.log('
|
|
413
|
+
console.log(translator.t('readiness.pr.case.pass'));
|
|
375
414
|
|
|
376
415
|
if (!/git revert /.test(prText)) {
|
|
377
|
-
throw new Error(
|
|
416
|
+
throw new Error(`create-quiver: ${translator.t('readiness.pr.error.rollback')}`);
|
|
378
417
|
}
|
|
379
|
-
console.log('
|
|
418
|
+
console.log(translator.t('readiness.pr.rollback.pass'));
|
|
380
419
|
|
|
381
420
|
if (/^\s*-\s*`manual review`$/mi.test(prText) || /^\s*-\s*`visual check`$/mi.test(prText) || /^\s*-\s*`screen test`$/mi.test(prText) || /^\s*-\s*`visual validation`$/mi.test(prText)) {
|
|
382
421
|
throw new Error('create-quiver: How to Test cannot rely only on generic phrases.');
|
|
383
422
|
}
|
|
384
423
|
|
|
385
|
-
console.log(
|
|
424
|
+
console.log(translator.t('readiness.pr.ready.pass', { slice: slice.sliceId }));
|
|
386
425
|
}
|
|
387
426
|
|
|
388
427
|
function checkScope(sliceInput, options = {}) {
|
|
428
|
+
const translator = readinessTranslator(options);
|
|
389
429
|
const strict = options.strict === true;
|
|
390
430
|
const remote = options.remote || 'origin';
|
|
391
431
|
const repoRoot = runGit(['rev-parse', '--show-toplevel'], process.cwd());
|
|
@@ -393,41 +433,22 @@ function checkScope(sliceInput, options = {}) {
|
|
|
393
433
|
const declared = slice.files;
|
|
394
434
|
validateProjectRelativePaths(declared, 'slice scope path');
|
|
395
435
|
|
|
396
|
-
const
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
'main',
|
|
401
|
-
'develop',
|
|
402
|
-
'master',
|
|
403
|
-
].filter(Boolean)));
|
|
404
|
-
|
|
405
|
-
let baseRef = '';
|
|
406
|
-
let baseSource = '';
|
|
407
|
-
for (const candidate of candidateBaseBranches) {
|
|
408
|
-
if (hasRemoteBranch(repoRoot, candidate, remote)) {
|
|
409
|
-
baseRef = `${remote}/${candidate}`;
|
|
410
|
-
baseSource = explicitBaseBranch === candidate ? '--base' : candidate === slice.baseBranch ? 'slice.git.base_branch' : 'fallback';
|
|
411
|
-
break;
|
|
412
|
-
}
|
|
413
|
-
if (hasLocalBranch(repoRoot, candidate)) {
|
|
414
|
-
baseRef = candidate;
|
|
415
|
-
baseSource = explicitBaseBranch === candidate ? '--base' : candidate === slice.baseBranch ? 'slice.git.base_branch' : 'fallback';
|
|
416
|
-
break;
|
|
417
|
-
}
|
|
418
|
-
}
|
|
436
|
+
const base = resolveReadinessBase(repoRoot, slice, {
|
|
437
|
+
baseBranch: options.baseBranch,
|
|
438
|
+
remote,
|
|
439
|
+
});
|
|
419
440
|
|
|
420
441
|
let touchedRaw = '';
|
|
421
|
-
if (baseRef) {
|
|
422
|
-
touchedRaw = runGit(['diff', '--name-only', `${baseRef}...HEAD`], repoRoot);
|
|
423
|
-
console.log(
|
|
442
|
+
if (base.baseRef) {
|
|
443
|
+
touchedRaw = runGit(['diff', '--name-only', `${base.baseRef}...HEAD`], repoRoot);
|
|
444
|
+
console.log(translator.t('readiness.scope.base.info', { ref: base.baseRef, source: base.source }));
|
|
424
445
|
} else {
|
|
425
|
-
console.log(
|
|
446
|
+
console.log(translator.t('readiness.scope.base.warn', { branches: base.candidates.map((candidate) => candidate.branch).join(', ') }));
|
|
426
447
|
return;
|
|
427
448
|
}
|
|
428
449
|
|
|
429
450
|
if (!touchedRaw) {
|
|
430
|
-
console.log(
|
|
451
|
+
console.log(translator.t('readiness.scope.empty.warn', { ref: base.baseRef }));
|
|
431
452
|
return;
|
|
432
453
|
}
|
|
433
454
|
|
|
@@ -451,7 +472,7 @@ function checkScope(sliceInput, options = {}) {
|
|
|
451
472
|
});
|
|
452
473
|
|
|
453
474
|
if (outOfScope.length === 0) {
|
|
454
|
-
console.log('
|
|
475
|
+
console.log(translator.t('readiness.scope.pass'));
|
|
455
476
|
return;
|
|
456
477
|
}
|
|
457
478
|
|
|
@@ -459,16 +480,16 @@ function checkScope(sliceInput, options = {}) {
|
|
|
459
480
|
for (const file of outOfScope) {
|
|
460
481
|
violationCount += 1;
|
|
461
482
|
if (strict) {
|
|
462
|
-
throw new Error(`create-quiver:
|
|
483
|
+
throw new Error(`create-quiver: ${translator.t('readiness.scope.error.file', { file })}`);
|
|
463
484
|
}
|
|
464
|
-
console.log(
|
|
485
|
+
console.log(translator.t('readiness.scope.warn.file', { file }));
|
|
465
486
|
}
|
|
466
487
|
|
|
467
488
|
if (violationCount > 0) {
|
|
468
489
|
if (strict) {
|
|
469
|
-
throw new Error(
|
|
490
|
+
throw new Error(translator.t('readiness.scope.error.count', { count: violationCount }));
|
|
470
491
|
}
|
|
471
|
-
console.log(
|
|
492
|
+
console.log(translator.t('readiness.scope.warn.count', { count: violationCount }));
|
|
472
493
|
}
|
|
473
494
|
}
|
|
474
495
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
const { formatStatus, translatorForHuman } = require('../i18n/read-only-format');
|
|
2
|
+
|
|
1
3
|
function isUnicodeEnabled(options = {}) {
|
|
2
4
|
if (options.unicode === true) {
|
|
3
5
|
return true;
|
|
@@ -53,10 +55,10 @@ function countParallelLots(level, conflicts) {
|
|
|
53
55
|
}
|
|
54
56
|
|
|
55
57
|
function formatLevelHeader(levelIndex, level, conflicts, options = {}) {
|
|
56
|
-
const
|
|
57
|
-
const label =
|
|
58
|
+
const translator = translatorForHuman(options);
|
|
59
|
+
const label = translator.t('graph.level', { level: levelIndex });
|
|
58
60
|
const lotCount = countParallelLots(level, conflicts);
|
|
59
|
-
return `${label} (${level.length}
|
|
61
|
+
return `${label} (${translator.t('graph.slices_count', { count: level.length })}, ${translator.t('graph.lots_count', { count: lotCount })})`;
|
|
60
62
|
}
|
|
61
63
|
|
|
62
64
|
function formatConflictSuffix(conflict, options = {}) {
|
|
@@ -73,6 +75,7 @@ function formatConflictSuffix(conflict, options = {}) {
|
|
|
73
75
|
|
|
74
76
|
function renderTreeGraph(report, options = {}) {
|
|
75
77
|
const unicode = isUnicodeEnabled(options);
|
|
78
|
+
const translator = translatorForHuman(options);
|
|
76
79
|
const branch = unicode ? '├─' : '+--';
|
|
77
80
|
const lastBranch = unicode ? '└─' : '\\--';
|
|
78
81
|
const pipe = unicode ? '│ ' : '| ';
|
|
@@ -80,10 +83,10 @@ function renderTreeGraph(report, options = {}) {
|
|
|
80
83
|
const lines = [];
|
|
81
84
|
|
|
82
85
|
if (!Array.isArray(report.levels) || report.levels.length === 0) {
|
|
83
|
-
return '
|
|
86
|
+
return `${translator.t('graph.empty.pending')}\n`;
|
|
84
87
|
}
|
|
85
88
|
|
|
86
|
-
lines.push('
|
|
89
|
+
lines.push(translator.t('graph.title'));
|
|
87
90
|
|
|
88
91
|
report.levels.forEach((level, levelIndex) => {
|
|
89
92
|
const levelConflicts = Array.isArray(report.conflicts)
|
|
@@ -98,7 +101,7 @@ function renderTreeGraph(report, options = {}) {
|
|
|
98
101
|
const sharedPaths = conflict && options.showConflicts ? ` ${formatConflictSuffix(conflict, options)}` : '';
|
|
99
102
|
const title = slice.title ? ` ${slice.title}` : '';
|
|
100
103
|
const hours = typeof slice.hours === 'number' ? ` (${slice.hours}h)` : '';
|
|
101
|
-
const status = slice.status ? ` [${slice.status}]` : '';
|
|
104
|
+
const status = slice.status ? ` [${formatStatus(slice.status, translator)}]` : '';
|
|
102
105
|
lines.push(`${connector} ${marker} ${slice.ref}${title}${hours}${status}${sharedPaths}`.replace(/\s+/g, ' ').trimEnd());
|
|
103
106
|
});
|
|
104
107
|
|