create-quiver 0.10.0 → 0.12.1
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/BACKLOG.md +16 -17
- package/CHANGELOG.md +78 -0
- package/README.md +208 -41
- package/README_FOR_AI.md +50 -24
- package/ROADMAP.md +34 -11
- package/docs/AI_CONTEXT.md.template +2 -0
- package/docs/AI_ONBOARDING_PROMPT.md.template +31 -18
- package/docs/COMMANDS.md.template +90 -16
- package/docs/CONTEXTO.md.template +2 -0
- package/docs/DECISIONS.md.template +1 -0
- package/docs/INDEX.md.template +20 -18
- package/docs/STATUS.md.template +6 -1
- package/docs/SUPPORT_MATRIX.md.template +2 -2
- package/docs/TROUBLESHOOTING.md.template +50 -0
- package/docs/WORKFLOW.md.template +27 -17
- package/package.json +27 -4
- package/package.template.json +13 -1
- package/scripts/init-docs.sh +11 -4
- package/scripts/package-quiver.sh +18 -2
- package/specs/quiver-v22-guided-ai-workflow/EVIDENCE_REPORT.md +58 -0
- package/specs/quiver-v22-guided-ai-workflow/EXECUTION_PLAN.md +88 -0
- package/specs/quiver-v22-guided-ai-workflow/SPEC.md +228 -0
- package/specs/quiver-v22-guided-ai-workflow/STATUS.md +42 -0
- package/specs/quiver-v22-guided-ai-workflow/pr.md +104 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-00-spec-foundation/CLOSURE_BRIEF.md +35 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-00-spec-foundation/EXECUTION_BRIEF.md +61 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-00-spec-foundation/slice.json +51 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-01-docs-source-of-truth-sync/CLOSURE_BRIEF.md +31 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-01-docs-source-of-truth-sync/EXECUTION_BRIEF.md +58 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-01-docs-source-of-truth-sync/slice.json +55 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-02-prepare-command-diagnostics/CLOSURE_BRIEF.md +30 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-02-prepare-command-diagnostics/EXECUTION_BRIEF.md +57 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-02-prepare-command-diagnostics/slice.json +57 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-03-context-doc-refresh/CLOSURE_BRIEF.md +32 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-03-context-doc-refresh/EXECUTION_BRIEF.md +56 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-03-context-doc-refresh/slice.json +56 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-04-planner-approval-state/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-04-planner-approval-state/EXECUTION_BRIEF.md +56 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-04-planner-approval-state/slice.json +58 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-05-spec-worktree-lifecycle/CLOSURE_BRIEF.md +32 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-05-spec-worktree-lifecycle/EXECUTION_BRIEF.md +56 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-05-spec-worktree-lifecycle/slice.json +54 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-06-executor-commit-recovery/CLOSURE_BRIEF.md +32 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-06-executor-commit-recovery/EXECUTION_BRIEF.md +58 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-06-executor-commit-recovery/slice.json +57 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-07-execution-waves-delegation/CLOSURE_BRIEF.md +32 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-07-execution-waves-delegation/EXECUTION_BRIEF.md +58 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-07-execution-waves-delegation/slice.json +55 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-08-pr-create-gh-ssh/CLOSURE_BRIEF.md +32 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-08-pr-create-gh-ssh/EXECUTION_BRIEF.md +58 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-08-pr-create-gh-ssh/slice.json +53 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-09-post-merge-cleanup-release-safety/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-09-post-merge-cleanup-release-safety/EXECUTION_BRIEF.md +59 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-09-post-merge-cleanup-release-safety/slice.json +59 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-10-docs-smokes-release-readiness/CLOSURE_BRIEF.md +34 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-10-docs-smokes-release-readiness/EXECUTION_BRIEF.md +58 -0
- package/specs/quiver-v22-guided-ai-workflow/slices/slice-10-docs-smokes-release-readiness/slice.json +60 -0
- package/specs/quiver-v23-guided-flow-productization/EVIDENCE_REPORT.md +80 -0
- package/specs/quiver-v23-guided-flow-productization/EXECUTION_PLAN.md +80 -0
- package/specs/quiver-v23-guided-flow-productization/SPEC.md +203 -0
- package/specs/quiver-v23-guided-flow-productization/STATUS.md +39 -0
- package/specs/quiver-v23-guided-flow-productization/pr.md +119 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-00-spec-foundation/CLOSURE_BRIEF.md +30 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-00-spec-foundation/EXECUTION_BRIEF.md +61 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-00-spec-foundation/slice.json +51 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-01-short-command-and-flow-entrypoint/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-01-short-command-and-flow-entrypoint/EXECUTION_BRIEF.md +35 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-01-short-command-and-flow-entrypoint/slice.json +56 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-02-flow-status-wizard/CLOSURE_BRIEF.md +31 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-02-flow-status-wizard/EXECUTION_BRIEF.md +29 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-02-flow-status-wizard/slice.json +55 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-03-agent-profiles/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-03-agent-profiles/EXECUTION_BRIEF.md +29 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-03-agent-profiles/slice.json +54 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-04-context-preparation-onboarding/CLOSURE_BRIEF.md +32 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-04-context-preparation-onboarding/EXECUTION_BRIEF.md +30 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-04-context-preparation-onboarding/slice.json +59 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-05-planner-iteration-history/CLOSURE_BRIEF.md +31 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-05-planner-iteration-history/EXECUTION_BRIEF.md +29 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-05-planner-iteration-history/slice.json +53 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-06-production-plan-review/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-06-production-plan-review/EXECUTION_BRIEF.md +30 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-06-production-plan-review/slice.json +54 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-07-spec-create-experience/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-07-spec-create-experience/EXECUTION_BRIEF.md +30 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-07-spec-create-experience/slice.json +55 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-08-executor-prompt-generation/CLOSURE_BRIEF.md +32 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-08-executor-prompt-generation/EXECUTION_BRIEF.md +30 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-08-executor-prompt-generation/slice.json +55 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-09-delegated-slice-execution/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-09-delegated-slice-execution/EXECUTION_BRIEF.md +34 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-09-delegated-slice-execution/slice.json +57 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-10-docs-smokes-release-readiness/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-10-docs-smokes-release-readiness/EXECUTION_BRIEF.md +32 -0
- package/specs/quiver-v23-guided-flow-productization/slices/slice-10-docs-smokes-release-readiness/slice.json +63 -0
- package/specs/quiver-v24-dx-onboarding-hardening/EVIDENCE_REPORT.md +55 -0
- package/specs/quiver-v24-dx-onboarding-hardening/EXECUTION_PLAN.md +43 -0
- package/specs/quiver-v24-dx-onboarding-hardening/SPEC.md +149 -0
- package/specs/quiver-v24-dx-onboarding-hardening/STATUS.md +31 -0
- package/specs/quiver-v24-dx-onboarding-hardening/pr.md +76 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-00-spec-foundation/CLOSURE_BRIEF.md +31 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-00-spec-foundation/EXECUTION_BRIEF.md +52 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-00-spec-foundation/slice.json +51 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-01-init-template-hygiene/CLOSURE_BRIEF.md +38 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-01-init-template-hygiene/EXECUTION_BRIEF.md +53 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-01-init-template-hygiene/slice.json +55 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-02-cli-command-routing-version-errors/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-02-cli-command-routing-version-errors/EXECUTION_BRIEF.md +50 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-02-cli-command-routing-version-errors/slice.json +52 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-03-doctor-fix-doc-link-checks/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-03-doctor-fix-doc-link-checks/EXECUTION_BRIEF.md +50 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-03-doctor-fix-doc-link-checks/slice.json +53 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-04-prepare-output-ai-context-drafts/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-04-prepare-output-ai-context-drafts/EXECUTION_BRIEF.md +50 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-04-prepare-output-ai-context-drafts/slice.json +70 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-05-local-slice-validation-base-guidance/CLOSURE_BRIEF.md +36 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-05-local-slice-validation-base-guidance/EXECUTION_BRIEF.md +49 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-05-local-slice-validation-base-guidance/slice.json +52 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-06-plan-graph-next-history-views/CLOSURE_BRIEF.md +43 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-06-plan-graph-next-history-views/EXECUTION_BRIEF.md +53 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-06-plan-graph-next-history-views/slice.json +60 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-07-analyzer-command-map-hardening/CLOSURE_BRIEF.md +32 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-07-analyzer-command-map-hardening/EXECUTION_BRIEF.md +50 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-07-analyzer-command-map-hardening/slice.json +51 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-08-evidence-run-command/CLOSURE_BRIEF.md +34 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-08-evidence-run-command/EXECUTION_BRIEF.md +52 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-08-evidence-run-command/slice.json +54 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-09-spec-viewer-demo-scaffolding/CLOSURE_BRIEF.md +34 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-09-spec-viewer-demo-scaffolding/EXECUTION_BRIEF.md +51 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-09-spec-viewer-demo-scaffolding/slice.json +59 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-10-docs-smokes-release-readiness/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-10-docs-smokes-release-readiness/EXECUTION_BRIEF.md +54 -0
- package/specs/quiver-v24-dx-onboarding-hardening/slices/slice-10-docs-smokes-release-readiness/slice.json +76 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/EVIDENCE_REPORT.md +293 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/EXECUTION_PLAN.md +58 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/SPEC.md +242 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/STATUS.md +35 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/pr.md +77 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-00-spec-foundation/CLOSURE_BRIEF.md +34 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-00-spec-foundation/EXECUTION_BRIEF.md +52 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-00-spec-foundation/slice.json +52 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-01-cli-contract-compatibility/CLOSURE_BRIEF.md +36 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-01-cli-contract-compatibility/EXECUTION_BRIEF.md +52 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-01-cli-contract-compatibility/slice.json +56 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-02-run-state-phase-locks/CLOSURE_BRIEF.md +43 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-02-run-state-phase-locks/EXECUTION_BRIEF.md +54 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-02-run-state-phase-locks/slice.json +52 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-03-safe-ai-onboarding-docs/CLOSURE_BRIEF.md +35 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-03-safe-ai-onboarding-docs/EXECUTION_BRIEF.md +53 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-03-safe-ai-onboarding-docs/slice.json +54 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-04-agent-profiles-adapters/CLOSURE_BRIEF.md +34 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-04-agent-profiles-adapters/EXECUTION_BRIEF.md +54 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-04-agent-profiles-adapters/slice.json +52 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-05-approval-gates/CLOSURE_BRIEF.md +34 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-05-approval-gates/EXECUTION_BRIEF.md +54 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-05-approval-gates/slice.json +53 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-06-spec-slice-generator/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-06-spec-slice-generator/EXECUTION_BRIEF.md +56 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-06-spec-slice-generator/slice.json +55 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-07-slice-execution-planner/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-07-slice-execution-planner/EXECUTION_BRIEF.md +54 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-07-slice-execution-planner/slice.json +52 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-08-controlled-slice-execution/CLOSURE_BRIEF.md +39 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-08-controlled-slice-execution/EXECUTION_BRIEF.md +56 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-08-controlled-slice-execution/slice.json +53 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-09-git-worktree-pr-lifecycle/CLOSURE_BRIEF.md +38 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-09-git-worktree-pr-lifecycle/EXECUTION_BRIEF.md +57 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-09-git-worktree-pr-lifecycle/slice.json +52 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-10-validation-errors-fixtures/CLOSURE_BRIEF.md +39 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-10-validation-errors-fixtures/EXECUTION_BRIEF.md +55 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-10-validation-errors-fixtures/slice.json +56 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-11-export-dashboard-migration/CLOSURE_BRIEF.md +36 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-11-export-dashboard-migration/EXECUTION_BRIEF.md +54 -0
- package/specs/quiver-v25-ai-first-lifecycle-orchestrator/slices/slice-11-export-dashboard-migration/slice.json +53 -0
- package/specs/quiver-v26-0121-smoke-hardening/EVIDENCE_REPORT.md +208 -0
- package/specs/quiver-v26-0121-smoke-hardening/EXECUTION_PLAN.md +57 -0
- package/specs/quiver-v26-0121-smoke-hardening/SPEC.md +137 -0
- package/specs/quiver-v26-0121-smoke-hardening/STATUS.md +32 -0
- package/specs/quiver-v26-0121-smoke-hardening/pr.md +96 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-00-docs-foundation/CLOSURE_BRIEF.md +35 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-00-docs-foundation/EXECUTION_BRIEF.md +55 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-00-docs-foundation/slice.json +73 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-01-cli-help-version-contract/CLOSURE_BRIEF.md +38 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-01-cli-help-version-contract/EXECUTION_BRIEF.md +51 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-01-cli-help-version-contract/slice.json +76 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-02-init-doc-links-and-flow-guidance/CLOSURE_BRIEF.md +37 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-02-init-doc-links-and-flow-guidance/EXECUTION_BRIEF.md +52 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-02-init-doc-links-and-flow-guidance/slice.json +75 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-03-ai-approval-review-consistency/CLOSURE_BRIEF.md +37 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-03-ai-approval-review-consistency/EXECUTION_BRIEF.md +53 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-03-ai-approval-review-consistency/slice.json +77 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-04-local-validation-brief-contracts/CLOSURE_BRIEF.md +35 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-04-local-validation-brief-contracts/EXECUTION_BRIEF.md +52 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-04-local-validation-brief-contracts/slice.json +77 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-05-demo-scaffold-readiness/CLOSURE_BRIEF.md +34 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-05-demo-scaffold-readiness/EXECUTION_BRIEF.md +54 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-05-demo-scaffold-readiness/slice.json +84 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-06-plan-graph-scope-performance/CLOSURE_BRIEF.md +35 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-06-plan-graph-scope-performance/EXECUTION_BRIEF.md +53 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-06-plan-graph-scope-performance/slice.json +82 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-07-smoke-release-readiness/CLOSURE_BRIEF.md +35 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-07-smoke-release-readiness/EXECUTION_BRIEF.md +55 -0
- package/specs/quiver-v26-0121-smoke-hardening/slices/slice-07-smoke-release-readiness/slice.json +92 -0
- package/src/create-quiver/commands/ai.js +1060 -37
- package/src/create-quiver/commands/demo.js +22 -0
- package/src/create-quiver/commands/evidence.js +37 -0
- package/src/create-quiver/commands/flow.js +562 -0
- package/src/create-quiver/commands/graph.js +19 -4
- package/src/create-quiver/commands/next.js +28 -0
- package/src/create-quiver/commands/plan.js +9 -6
- package/src/create-quiver/commands/prepare.js +236 -0
- package/src/create-quiver/commands/spec.js +133 -0
- package/src/create-quiver/index.js +1010 -31
- package/src/create-quiver/lib/actionable-error.js +27 -0
- package/src/create-quiver/lib/agent-profiles.js +148 -0
- package/src/create-quiver/lib/ai/context-packs.js +16 -0
- package/src/create-quiver/lib/ai/execution-plan.js +377 -11
- package/src/create-quiver/lib/ai/executor.js +633 -24
- package/src/create-quiver/lib/ai/export-state.js +534 -0
- package/src/create-quiver/lib/ai/github.js +279 -0
- package/src/create-quiver/lib/ai/onboarding-template.js +578 -0
- package/src/create-quiver/lib/ai/plan-review.js +286 -0
- package/src/create-quiver/lib/ai/providers.js +5 -3
- package/src/create-quiver/lib/ai/run-state.js +414 -0
- package/src/create-quiver/lib/ai/safety.js +5 -0
- package/src/create-quiver/lib/ai/spec-generator.js +12 -0
- package/src/create-quiver/lib/ai/spec-templates.js +80 -11
- package/src/create-quiver/lib/approvals.js +369 -0
- package/src/create-quiver/lib/demo.js +832 -0
- package/src/create-quiver/lib/doctor.js +309 -0
- package/src/create-quiver/lib/evidence.js +115 -0
- package/src/create-quiver/lib/handoff.js +81 -12
- package/src/create-quiver/lib/init-docs.js +302 -17
- package/src/create-quiver/lib/init-layout.js +34 -1
- package/src/create-quiver/lib/json.js +53 -3
- package/src/create-quiver/lib/lifecycle.js +6 -0
- package/src/create-quiver/lib/package-safety.js +117 -0
- package/src/create-quiver/lib/readiness.js +103 -21
- package/src/create-quiver/lib/scope.js +50 -7
- package/src/create-quiver/lib/slice-graph.js +138 -37
- package/src/create-quiver/lib/slice.js +14 -9
- package/src/create-quiver/lib/spec-worktrees.js +363 -0
|
@@ -205,6 +205,57 @@ function writeFrontMatter(filePath, fields) {
|
|
|
205
205
|
return nextContent;
|
|
206
206
|
}
|
|
207
207
|
|
|
208
|
+
const ROOT_GITIGNORE_DEFAULTS = [
|
|
209
|
+
'node_modules/',
|
|
210
|
+
'.DS_Store',
|
|
211
|
+
'dist/',
|
|
212
|
+
'coverage/',
|
|
213
|
+
];
|
|
214
|
+
|
|
215
|
+
function normalizeGitignorePattern(line) {
|
|
216
|
+
const trimmed = line.trim();
|
|
217
|
+
if (!trimmed || trimmed.startsWith('#')) {
|
|
218
|
+
return trimmed;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return trimmed.replace(/\/+$/g, '');
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function mergeLineList(existingText, defaults) {
|
|
225
|
+
const existingLines = existingText
|
|
226
|
+
.split(/\r?\n/)
|
|
227
|
+
.filter((line, index, lines) => line.length > 0 || index < lines.length - 1);
|
|
228
|
+
const seen = new Set(existingLines.map(normalizeGitignorePattern).filter(Boolean));
|
|
229
|
+
const nextLines = [...existingLines];
|
|
230
|
+
|
|
231
|
+
for (const line of defaults) {
|
|
232
|
+
const normalized = normalizeGitignorePattern(line);
|
|
233
|
+
if (!seen.has(normalized)) {
|
|
234
|
+
nextLines.push(line);
|
|
235
|
+
seen.add(normalized);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return `${nextLines.join('\n').replace(/\s+$/g, '')}\n`;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function mergeRootGitignore(projectRoot) {
|
|
243
|
+
const gitignorePath = path.join(projectRoot, '.gitignore');
|
|
244
|
+
const exists = fs.existsSync(gitignorePath);
|
|
245
|
+
const existingText = exists
|
|
246
|
+
? fs.readFileSync(gitignorePath, 'utf8')
|
|
247
|
+
: '';
|
|
248
|
+
|
|
249
|
+
ensureDir(path.dirname(gitignorePath));
|
|
250
|
+
fs.writeFileSync(gitignorePath, mergeLineList(existingText, ROOT_GITIGNORE_DEFAULTS));
|
|
251
|
+
return exists ? 'merged' : 'created';
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function resolvePackageName(projectRoot, options = {}) {
|
|
255
|
+
return options.projectSlug
|
|
256
|
+
|| toProjectSlug(options.projectName || path.basename(projectRoot) || 'Quiver Project');
|
|
257
|
+
}
|
|
258
|
+
|
|
208
259
|
function mergePackageJson(projectRoot, templateRoot, options = {}) {
|
|
209
260
|
const packageTemplate = path.join(templateRoot, 'package.template.json');
|
|
210
261
|
const packageJsonPath = path.join(projectRoot, 'package.json');
|
|
@@ -218,13 +269,17 @@ function mergePackageJson(projectRoot, templateRoot, options = {}) {
|
|
|
218
269
|
|
|
219
270
|
if (!fs.existsSync(packageJsonPath)) {
|
|
220
271
|
const template = JSON.parse(fs.readFileSync(packageTemplate, 'utf8'));
|
|
272
|
+
template.name = resolvePackageName(projectRoot, options);
|
|
221
273
|
template.scripts = scripts;
|
|
222
274
|
fs.writeFileSync(packageJsonPath, `${JSON.stringify(template, null, 2)}\n`);
|
|
223
275
|
return 'created';
|
|
224
276
|
}
|
|
225
277
|
|
|
226
278
|
const existing = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
227
|
-
|
|
279
|
+
|
|
280
|
+
if (typeof existing.name !== 'string' || existing.name.trim().length === 0) {
|
|
281
|
+
existing.name = resolvePackageName(projectRoot, options);
|
|
282
|
+
}
|
|
228
283
|
|
|
229
284
|
existing.scripts = {
|
|
230
285
|
...(existing.scripts || {}),
|
|
@@ -259,16 +314,28 @@ npx create-quiver next
|
|
|
259
314
|
Use \`AGENTS.md\` first, then \`docs/AI_CONTEXT.md\` and \`docs/AI_ONBOARDING_PROMPT.md\` for the working contract.
|
|
260
315
|
|
|
261
316
|
\`\`\`bash
|
|
317
|
+
npm run quiver:prepare -- --dry-run
|
|
262
318
|
npm run quiver:ai:onboard -- --dry-run
|
|
319
|
+
npm run quiver:ai:inspect
|
|
320
|
+
npm run quiver:ai:export -- --format json
|
|
321
|
+
npm run quiver:ai:specs
|
|
322
|
+
npm run quiver:ai:slices
|
|
323
|
+
npm run quiver:ai:trace
|
|
263
324
|
npm run quiver:ai:plan -- --phase acceptance --input requirements.md --dry-run
|
|
264
|
-
npm run quiver:ai:
|
|
265
|
-
npm run quiver:ai:
|
|
325
|
+
npm run quiver:ai:revise -- --phase acceptance --input feedback.md --dry-run
|
|
326
|
+
npm run quiver:ai:approve -- --phase acceptance --version <n>
|
|
327
|
+
npm run quiver:ai:plan -- --phase technical-plan --dry-run
|
|
328
|
+
npm run quiver:ai:review-plan -- --dry-run
|
|
329
|
+
npm run quiver:ai:approve -- --phase technical-plan --version <n>
|
|
330
|
+
npm run quiver:spec:create -- --dry-run
|
|
266
331
|
\`\`\`
|
|
267
332
|
|
|
268
333
|
When a real spec exists, execute one approved slice at a time:
|
|
269
334
|
|
|
270
335
|
\`\`\`bash
|
|
271
|
-
npm run quiver:ai:
|
|
336
|
+
npm run quiver:ai:prompt-slice -- --slice specs/<spec-slug>/slices/<slice-id>/slice.json --dry-run
|
|
337
|
+
npm run quiver:ai:execute-slice -- --slice specs/<spec-slug>/slices/<slice-id>/slice.json --dry-run --commit
|
|
338
|
+
npm run quiver:ai:execute-plan -- --dry-run --commit --mode delegated
|
|
272
339
|
\`\`\`
|
|
273
340
|
|
|
274
341
|
## Documentation
|
|
@@ -302,21 +369,28 @@ After \`analyze\`, use \`docs/PROJECT_MAP.md\` for the detected stack, package m
|
|
|
302
369
|
|
|
303
370
|
## AI-First Workflow
|
|
304
371
|
|
|
305
|
-
Quiver keeps the visible contract small: start with \`README.md\`, \`AGENTS.md\`, and \`docs/\`. Specs and slices should be created only after a real requirement and
|
|
372
|
+
Quiver keeps the visible contract small: start with \`README.md\`, \`AGENTS.md\`, and \`docs/\`. Specs and slices should be created only after a real requirement and a reviewed, approved technical plan.
|
|
306
373
|
|
|
307
374
|
Use dry-runs before spending model tokens:
|
|
308
375
|
|
|
309
376
|
\`\`\`bash
|
|
377
|
+
npm run quiver:prepare -- --dry-run
|
|
310
378
|
npm run quiver:ai:onboard -- --dry-run
|
|
311
379
|
npm run quiver:ai:plan -- --phase acceptance --input requirements.md --dry-run
|
|
312
|
-
npm run quiver:ai:
|
|
313
|
-
npm run quiver:ai:
|
|
380
|
+
npm run quiver:ai:revise -- --phase acceptance --input feedback.md --dry-run
|
|
381
|
+
npm run quiver:ai:approve -- --phase acceptance --version <n>
|
|
382
|
+
npm run quiver:ai:plan -- --phase technical-plan --dry-run
|
|
383
|
+
npm run quiver:ai:review-plan -- --dry-run
|
|
384
|
+
npm run quiver:ai:approve -- --phase technical-plan --version <n>
|
|
385
|
+
npm run quiver:spec:create -- --dry-run
|
|
314
386
|
\`\`\`
|
|
315
387
|
|
|
316
388
|
When a real spec exists, execute one approved slice at a time:
|
|
317
389
|
|
|
318
390
|
\`\`\`bash
|
|
319
|
-
npm run quiver:ai:
|
|
391
|
+
npm run quiver:ai:prompt-slice -- --slice specs/<spec-slug>/slices/<slice-id>/slice.json --dry-run
|
|
392
|
+
npm run quiver:ai:execute-slice -- --slice specs/<spec-slug>/slices/<slice-id>/slice.json --dry-run --commit
|
|
393
|
+
npm run quiver:ai:execute-plan -- --dry-run --commit --mode delegated
|
|
320
394
|
\`\`\`
|
|
321
395
|
|
|
322
396
|
## Project NPM Scripts
|
|
@@ -325,13 +399,32 @@ The generated project includes \`quiver:*\` npm scripts that call the Node CLI:
|
|
|
325
399
|
|
|
326
400
|
\`\`\`bash
|
|
327
401
|
npm run quiver:analyze
|
|
402
|
+
npm run quiver:prepare -- --dry-run
|
|
328
403
|
npm run quiver:plan
|
|
329
404
|
npm run quiver:graph
|
|
330
405
|
npm run quiver:next
|
|
331
406
|
npm run quiver:doctor
|
|
407
|
+
npm run quiver:ai:inspect
|
|
408
|
+
npm run quiver:ai:export -- --format json
|
|
409
|
+
npm run quiver:ai:export -- --format markdown
|
|
410
|
+
npm run quiver:ai:specs
|
|
411
|
+
npm run quiver:ai:slices
|
|
412
|
+
npm run quiver:ai:trace
|
|
332
413
|
npm run quiver:ai:onboard -- --dry-run
|
|
333
414
|
npm run quiver:ai:plan -- --phase acceptance --input requirements.md --dry-run
|
|
334
|
-
npm run quiver:ai:
|
|
415
|
+
npm run quiver:ai:revise -- --phase acceptance --input feedback.md --dry-run
|
|
416
|
+
npm run quiver:ai:approve -- --phase acceptance --version <n>
|
|
417
|
+
npm run quiver:ai:plan -- --phase technical-plan --dry-run
|
|
418
|
+
npm run quiver:ai:review-plan -- --dry-run
|
|
419
|
+
npm run quiver:ai:approve -- --phase technical-plan --version <n>
|
|
420
|
+
npm run quiver:spec:create -- --dry-run
|
|
421
|
+
npm run quiver:ai:prompt-slice -- --slice specs/<spec-slug>/slices/<slice-id>/slice.json --dry-run
|
|
422
|
+
npm run quiver:ai:execute-slice -- --slice specs/<spec-slug>/slices/<slice-id>/slice.json --dry-run --commit
|
|
423
|
+
npm run quiver:ai:execute-plan -- --dry-run --commit --mode delegated
|
|
424
|
+
npm run quiver:ai:pr -- --dry-run --input specs/<spec-slug>/pr.md --ssh-host-alias github-work --identity-file ~/.ssh/github-work
|
|
425
|
+
npm run quiver:spec:start -- specs/<spec-slug>
|
|
426
|
+
npm run quiver:spec:status -- specs/<spec-slug>
|
|
427
|
+
npm run quiver:spec:close -- specs/<spec-slug> --dry-run
|
|
335
428
|
\`\`\`
|
|
336
429
|
|
|
337
430
|
## Documentation
|
|
@@ -388,12 +481,20 @@ Quiver is designed for an AI-first workflow: a planner agent reads the project c
|
|
|
388
481
|
Start with dry-runs so you can inspect the provider, role, context pack, and invocation before spending model tokens:
|
|
389
482
|
|
|
390
483
|
\`\`\`bash
|
|
484
|
+
npm run quiver:prepare -- --dry-run
|
|
391
485
|
npm run quiver:ai:onboard -- --dry-run
|
|
392
486
|
npm run quiver:ai:plan -- --phase acceptance --input requirements.md --dry-run
|
|
393
|
-
npm run quiver:ai:
|
|
394
|
-
npm run quiver:ai:
|
|
395
|
-
npm run quiver:ai:
|
|
396
|
-
npm run quiver:ai:
|
|
487
|
+
npm run quiver:ai:revise -- --phase acceptance --input feedback.md --dry-run
|
|
488
|
+
npm run quiver:ai:approve -- --phase acceptance --version <n>
|
|
489
|
+
npm run quiver:ai:plan -- --phase technical-plan --dry-run
|
|
490
|
+
npm run quiver:ai:review-plan -- --dry-run
|
|
491
|
+
npm run quiver:ai:approve -- --phase technical-plan --version <n>
|
|
492
|
+
npm run quiver:spec:create -- --dry-run
|
|
493
|
+
npm run quiver:spec:start -- specs/${projectSlug}
|
|
494
|
+
npm run quiver:ai:prompt-slice -- --slice specs/${projectSlug}/slices/slice-01/slice.json --dry-run
|
|
495
|
+
npm run quiver:ai:execute-slice -- --slice specs/${projectSlug}/slices/slice-01/slice.json --dry-run --commit
|
|
496
|
+
npm run quiver:ai:execute-plan -- --dry-run --commit --mode delegated
|
|
497
|
+
npm run quiver:ai:pr -- --dry-run --input specs/${projectSlug}/pr.md --ssh-host-alias github-work --identity-file ~/.ssh/github-work
|
|
397
498
|
\`\`\`
|
|
398
499
|
|
|
399
500
|
Remove \`--dry-run\` only after the phase output is approved and the local provider CLI is ready.
|
|
@@ -404,20 +505,33 @@ The generated project includes \`quiver:*\` npm scripts that call the Node CLI a
|
|
|
404
505
|
|
|
405
506
|
\`\`\`bash
|
|
406
507
|
npm run quiver:analyze
|
|
508
|
+
npm run quiver:prepare -- --dry-run
|
|
407
509
|
npm run quiver:plan
|
|
408
510
|
npm run quiver:graph
|
|
409
511
|
npm run quiver:next
|
|
410
512
|
npm run quiver:doctor
|
|
411
513
|
npm run quiver:ai:onboard -- --dry-run
|
|
412
514
|
npm run quiver:ai:plan -- --phase acceptance --input requirements.md --dry-run
|
|
413
|
-
npm run quiver:ai:
|
|
515
|
+
npm run quiver:ai:revise -- --phase acceptance --input feedback.md --dry-run
|
|
516
|
+
npm run quiver:ai:approve -- --phase acceptance --version <n>
|
|
517
|
+
npm run quiver:ai:plan -- --phase technical-plan --dry-run
|
|
518
|
+
npm run quiver:ai:review-plan -- --dry-run
|
|
519
|
+
npm run quiver:ai:approve -- --phase technical-plan --version <n>
|
|
520
|
+
npm run quiver:spec:create -- --dry-run
|
|
521
|
+
npm run quiver:ai:prompt-slice -- --slice specs/${projectSlug}/slices/slice-01/slice.json --dry-run
|
|
522
|
+
npm run quiver:ai:execute-slice -- --slice specs/${projectSlug}/slices/slice-01/slice.json --dry-run --commit
|
|
523
|
+
npm run quiver:ai:execute-plan -- --dry-run --commit --mode delegated
|
|
414
524
|
npm run quiver:ai:doctor -- --dry-run --ssh-host-alias github-work --identity-file ~/.ssh/github-work
|
|
415
|
-
npm run quiver:ai:pr -- --dry-run --ssh-host-alias github-work --identity-file ~/.ssh/github-work
|
|
525
|
+
npm run quiver:ai:pr -- --dry-run --input specs/${projectSlug}/pr.md --ssh-host-alias github-work --identity-file ~/.ssh/github-work
|
|
526
|
+
npm run quiver:spec:start -- specs/${projectSlug}
|
|
527
|
+
npm run quiver:spec:status -- specs/${projectSlug}
|
|
528
|
+
npm run quiver:spec:close -- specs/${projectSlug} --dry-run
|
|
416
529
|
npm run quiver:migrate
|
|
417
530
|
npm run quiver:start-slice -- specs/${projectSlug}/slices/slice-01/slice.json
|
|
418
531
|
npm run quiver:check-slice -- specs/${projectSlug}/slices/slice-01/slice.json
|
|
419
532
|
npm run quiver:check-pr -- specs/${projectSlug}/slices/slice-01/slice.json
|
|
420
533
|
npm run quiver:check-handoff -- specs/${projectSlug}/HANDOFF.md
|
|
534
|
+
npm run quiver:check-handoff -- specs/${projectSlug}/slices/slice-01/EXECUTION_BRIEF.md
|
|
421
535
|
npm run quiver:cleanup-slice -- specs/${projectSlug}/slices/slice-01/slice.json
|
|
422
536
|
npm run quiver:check-scope -- specs/${projectSlug}/slices/slice-01/slice.json
|
|
423
537
|
npm run quiver:refresh-active-slices
|
|
@@ -425,12 +539,14 @@ npm run quiver:refresh-active-slices
|
|
|
425
539
|
|
|
426
540
|
The \`quiver:graph\` script prints the tree view by default; use \`npx create-quiver graph --format mermaid\` for PR-ready Markdown and \`--format dot\` when you want Graphviz source.
|
|
427
541
|
The \`quiver:next\` script points to the next ready slice and can auto-start it behind a confirmation prompt.
|
|
428
|
-
The \`quiver:ai:*\` scripts standardize planner/executor AI flows. Use dry-run first: onboarding and planning dry-runs do not require provider auth,
|
|
542
|
+
The \`quiver:ai:*\` scripts standardize planner/executor AI flows. Use dry-run first: onboarding and planning dry-runs do not require provider auth, \`quiver:ai:execute-plan -- --dry-run --commit --mode manual\` prints manual prompts, \`--mode delegated\` prints safe waves, \`quiver:ai:inspect\` shows lifecycle state, \`quiver:ai:export -- --format json|markdown\` emits dashboard/agent-friendly state, and \`quiver:ai:pr -- --dry-run\` validates \`gh\`, GitFlow docs, branch/worktree state, SSH inputs, and \`pr.md\` without creating a PR. Add \`--create\` only after reviewing the plan.
|
|
543
|
+
Use \`quiver:spec:create\`, \`quiver:spec:start\`, \`quiver:spec:status\`, and \`quiver:spec:close\` for one spec generation and worktree per spec.
|
|
429
544
|
Use \`npx create-quiver next --all-ready\` when you want the full ready level instead of a single suggestion.
|
|
430
545
|
The legacy Bash wrappers remain in \`tools/scripts/\` for compatibility, but new project-level automation should prefer the \`quiver:*\` scripts and the direct \`npx create-quiver ...\` commands below.
|
|
431
546
|
\`npm run quiver:migrate\` is only for projects that were already initialized by Quiver.
|
|
432
547
|
\`npm run check-handoff -- specs/${projectSlug}/HANDOFF.md\` is available as a legacy-friendly alias for the handoff validator.
|
|
433
548
|
If a new bounded transfer is needed, scaffold \`specs/${projectSlug}/HANDOFF.md\` with \`npx create-quiver new-handoff ${projectSlug}\` and validate it with \`npx create-quiver check-handoff specs/${projectSlug}/HANDOFF.md\`.
|
|
549
|
+
Use \`npx create-quiver check-handoff specs/${projectSlug}/slices/slice-01/EXECUTION_BRIEF.md\` or \`CLOSURE_BRIEF.md\` to validate the current per-slice brief contract.
|
|
434
550
|
For exceptional context transfers between agents or phases, a dedicated \`HANDOFF.md\` can live alongside the usual spec and docs files.
|
|
435
551
|
|
|
436
552
|
## Cross-Platform Support
|
|
@@ -502,7 +618,7 @@ Record durable decisions in \`docs/DECISIONS.md\` so future AI agents do not re-
|
|
|
502
618
|
|
|
503
619
|
## First Slice Workflow
|
|
504
620
|
|
|
505
|
-
Use this section only for projects generated with the full compatibility layout. In the default AI-first layout, create real specs and slices with \`npx create-quiver
|
|
621
|
+
Use this section only for projects generated with the full compatibility layout. In the default AI-first layout, create real specs and slices with \`npx create-quiver spec create\` after acceptance criteria are approved and the technical plan is reviewed and approved.
|
|
506
622
|
|
|
507
623
|
1. Review or refine specs/${projectSlug}/SPEC.md.
|
|
508
624
|
2. Create the first slice from specs/${projectSlug}/slices/slice-template/slice.json.
|
|
@@ -541,6 +657,19 @@ Use this section only for projects generated with the full compatibility layout.
|
|
|
541
657
|
`;
|
|
542
658
|
}
|
|
543
659
|
|
|
660
|
+
function buildFullProfileIndexAppendix(projectSlug) {
|
|
661
|
+
return `## Full Profile Extras
|
|
662
|
+
|
|
663
|
+
- **Multi-agent workflow** - \`./MULTI_AGENT_WORKFLOW.md\`
|
|
664
|
+
- **Quick AI context** - \`./ai/QUICK.md\`
|
|
665
|
+
- **Standard AI context** - \`./ai/STANDARD.md\`
|
|
666
|
+
- **Deep AI context** - \`./ai/DEEP.md\`
|
|
667
|
+
- **Spec starter assets** - \`../specs/${projectSlug}/\`
|
|
668
|
+
- **Tool notes** - \`./tools/\`
|
|
669
|
+
- **Archive** - \`./archive/\`
|
|
670
|
+
`;
|
|
671
|
+
}
|
|
672
|
+
|
|
544
673
|
function initializeProjectDocs(options) {
|
|
545
674
|
const {
|
|
546
675
|
projectRoot,
|
|
@@ -598,6 +727,9 @@ function initializeProjectDocs(options) {
|
|
|
598
727
|
fs.writeFileSync(internalPaths.gitignorePath, buildQuiverInternalGitignore());
|
|
599
728
|
operations.push({ source: 'Quiver internal gitignore', destination: '.quiver/.gitignore', result: 'updated' });
|
|
600
729
|
|
|
730
|
+
const rootGitignoreResult = mergeRootGitignore(projectRoot);
|
|
731
|
+
operations.push({ source: 'root gitignore defaults', destination: '.gitignore', result: rootGitignoreResult });
|
|
732
|
+
|
|
601
733
|
if (includeTemplates) {
|
|
602
734
|
fs.mkdirSync(internalPaths.templatesDir, { recursive: true });
|
|
603
735
|
fs.cpSync(templateRoot, internalPaths.templatesDir, {
|
|
@@ -691,6 +823,17 @@ function initializeProjectDocs(options) {
|
|
|
691
823
|
operations.push({ source, destination, result });
|
|
692
824
|
}
|
|
693
825
|
|
|
826
|
+
const indexPath = path.join(projectRoot, 'docs', 'INDEX.md');
|
|
827
|
+
const indexWasCreated = operations.some((operation) => (
|
|
828
|
+
operation.destination === 'docs/INDEX.md'
|
|
829
|
+
&& (operation.result === 'created' || operation.result === 'created-with-frontmatter')
|
|
830
|
+
));
|
|
831
|
+
if (profile === 'full' && indexWasCreated && fs.existsSync(indexPath)) {
|
|
832
|
+
const currentIndex = fs.readFileSync(indexPath, 'utf8').replace(/\s+$/g, '');
|
|
833
|
+
fs.writeFileSync(indexPath, `${currentIndex}\n\n${buildFullProfileIndexAppendix(replacements.projectSlug)}`);
|
|
834
|
+
operations.push({ source: 'full profile index appendix', destination: 'docs/INDEX.md', result: 'updated' });
|
|
835
|
+
}
|
|
836
|
+
|
|
694
837
|
const binaryCopies = [
|
|
695
838
|
['docs/UI_STANDARDS.md', 'docs/UI_STANDARDS.md'],
|
|
696
839
|
['docs/MOCK_DATA_GUIDE.md', 'docs/MOCK_DATA_GUIDE.md'],
|
|
@@ -765,6 +908,8 @@ function initializeProjectDocs(options) {
|
|
|
765
908
|
legacyScripts,
|
|
766
909
|
migrateMode,
|
|
767
910
|
profile,
|
|
911
|
+
projectName,
|
|
912
|
+
projectSlug: replacements.projectSlug,
|
|
768
913
|
});
|
|
769
914
|
operations.push({ source: 'package.template.json', destination: 'package.json', result: packageResult });
|
|
770
915
|
|
|
@@ -963,8 +1108,148 @@ function installSelfAsDevDep(projectRoot, version) {
|
|
|
963
1108
|
}
|
|
964
1109
|
}
|
|
965
1110
|
|
|
1111
|
+
function normalizeSkippedReason(reason) {
|
|
1112
|
+
if (!reason) {
|
|
1113
|
+
return 'excluded path';
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
if (reason === 'env-file') {
|
|
1117
|
+
return 'env files';
|
|
1118
|
+
}
|
|
1119
|
+
|
|
1120
|
+
if (reason === 'git-metadata') {
|
|
1121
|
+
return '.git metadata';
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
if (reason === 'hidden-directory') {
|
|
1125
|
+
return 'hidden directories';
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
if (reason.startsWith('secret-file:')) {
|
|
1129
|
+
return 'secret files';
|
|
1130
|
+
}
|
|
1131
|
+
|
|
1132
|
+
if (reason.startsWith('unsafe-segment:')) {
|
|
1133
|
+
const segment = reason.slice('unsafe-segment:'.length);
|
|
1134
|
+
const dependencySegments = new Set(['node_modules', '.pnpm-store', '.npm', '.yarn']);
|
|
1135
|
+
const outputSegments = new Set(['dist', 'build', 'coverage', 'out', 'tmp', 'temp', 'cache', '.cache', '.turbo', '.next', '.nuxt', '.parcel-cache', 'generated', 'gen', 'artifacts', 'reports', 'vendor', 'target']);
|
|
1136
|
+
|
|
1137
|
+
if (segment === '.quiver') {
|
|
1138
|
+
return 'local AI state';
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
if (dependencySegments.has(segment)) {
|
|
1142
|
+
return 'dependency folders';
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
if (outputSegments.has(segment)) {
|
|
1146
|
+
return 'generated/output/cache folders';
|
|
1147
|
+
}
|
|
1148
|
+
|
|
1149
|
+
return segment;
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
return reason;
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
function summarizeSkippedPaths(skippedPathDetails = [], skippedPaths = []) {
|
|
1156
|
+
const counts = new Map();
|
|
1157
|
+
|
|
1158
|
+
const items = Array.isArray(skippedPathDetails) && skippedPathDetails.length > 0
|
|
1159
|
+
? skippedPathDetails
|
|
1160
|
+
: skippedPaths.map((item) => ({ path: item, reason: 'excluded path' }));
|
|
1161
|
+
|
|
1162
|
+
for (const item of items) {
|
|
1163
|
+
const label = normalizeSkippedReason(item.reason);
|
|
1164
|
+
counts.set(label, (counts.get(label) || 0) + 1);
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1167
|
+
return Array.from(counts.entries()).map(([label, count]) => ({ label, count }));
|
|
1168
|
+
}
|
|
1169
|
+
|
|
1170
|
+
function renderAiContextDoc(scan, options = {}) {
|
|
1171
|
+
const projectName = scan?.project?.name || 'Quiver Project';
|
|
1172
|
+
const projectSlug = options.projectSlug || toProjectSlug(projectName);
|
|
1173
|
+
const stack = scan?.stack || {};
|
|
1174
|
+
const commands = scan?.commands || {};
|
|
1175
|
+
const common = commands.common || {};
|
|
1176
|
+
const summaries = summarizeSkippedPaths(scan?.skipped_path_details, scan?.skipped_paths);
|
|
1177
|
+
const risks = Array.isArray(scan?.risks) ? scan.risks : [];
|
|
1178
|
+
const hasReadme = scan?.docs?.has_readme ? 'yes' : 'no';
|
|
1179
|
+
const hasWorkflow = scan?.ci?.has_ci ? 'yes' : 'no';
|
|
1180
|
+
const sourceDirs = Array.isArray(scan?.structure?.source_directories) ? scan.structure.source_directories : [];
|
|
1181
|
+
|
|
1182
|
+
const lines = [];
|
|
1183
|
+
lines.push(`# ${projectName} AI Context`);
|
|
1184
|
+
lines.push('');
|
|
1185
|
+
lines.push('This file is refreshed by `npx create-quiver analyze`.');
|
|
1186
|
+
lines.push('Use `docs/PROJECT_MAP.md` for stack and command details, and `.quiver/scans/PROJECT_SCAN.json` only when raw analyzer data is needed.');
|
|
1187
|
+
lines.push('');
|
|
1188
|
+
lines.push('## Snapshot');
|
|
1189
|
+
lines.push(`- Primary stack: ${stack.primary || 'unknown'}`);
|
|
1190
|
+
lines.push('- Package manager source: `docs/PROJECT_MAP.md`');
|
|
1191
|
+
lines.push(`- Install: ${commands.install || 'not defined'}`);
|
|
1192
|
+
lines.push(`- Dev: ${common.dev || 'not defined'}`);
|
|
1193
|
+
lines.push(`- Build: ${common.build || 'not defined'}`);
|
|
1194
|
+
lines.push(`- Test: ${common.test || 'not defined'}`);
|
|
1195
|
+
lines.push(`- README present: ${hasReadme}`);
|
|
1196
|
+
lines.push(`- GitHub Actions workflows: ${hasWorkflow}`);
|
|
1197
|
+
lines.push(`- Source directories: ${sourceDirs.length > 0 ? sourceDirs.join(', ') : 'none detected'}`);
|
|
1198
|
+
lines.push('');
|
|
1199
|
+
lines.push('## Read First');
|
|
1200
|
+
lines.push('- `docs/PROJECT_MAP.md`');
|
|
1201
|
+
lines.push('- `docs/WORKFLOW.md`');
|
|
1202
|
+
lines.push('- `docs/AI_ONBOARDING_PROMPT.md`');
|
|
1203
|
+
lines.push('- `docs/CONTEXTO.md`');
|
|
1204
|
+
lines.push('- `docs/DECISIONS.md`');
|
|
1205
|
+
lines.push(`- specs/${projectSlug}/SPEC.md`);
|
|
1206
|
+
lines.push('');
|
|
1207
|
+
lines.push('## Assumptions and Missing Info');
|
|
1208
|
+
if (risks.length > 0) {
|
|
1209
|
+
for (const risk of risks) {
|
|
1210
|
+
lines.push(`- ${risk}`);
|
|
1211
|
+
}
|
|
1212
|
+
} else {
|
|
1213
|
+
lines.push('- No major repository signals are missing.');
|
|
1214
|
+
}
|
|
1215
|
+
lines.push('- Do not infer product or business rules that are not present in the repository.');
|
|
1216
|
+
lines.push('');
|
|
1217
|
+
lines.push('## Exclusions');
|
|
1218
|
+
if (summaries.length > 0) {
|
|
1219
|
+
for (const item of summaries) {
|
|
1220
|
+
lines.push(`- ${item.label}: ${item.count}`);
|
|
1221
|
+
}
|
|
1222
|
+
} else {
|
|
1223
|
+
lines.push('- No exclusions were needed.');
|
|
1224
|
+
}
|
|
1225
|
+
lines.push('');
|
|
1226
|
+
lines.push('## Internal Artifacts');
|
|
1227
|
+
lines.push('- Visible source: `docs/PROJECT_MAP.md`');
|
|
1228
|
+
lines.push('- Internal raw scan: `.quiver/scans/PROJECT_SCAN.json`');
|
|
1229
|
+
lines.push('');
|
|
1230
|
+
const body = lines.join('\n');
|
|
1231
|
+
const frontMatter = serializeFrontMatter(buildFrontMatterFields({
|
|
1232
|
+
purpose: 'Agent-facing project context pack',
|
|
1233
|
+
appliesWhen: 'after analyze, onboarding, implementation, review',
|
|
1234
|
+
body,
|
|
1235
|
+
currentDate: options.currentDate || new Date().toISOString().slice(0, 10),
|
|
1236
|
+
}));
|
|
1237
|
+
|
|
1238
|
+
return `${frontMatter}\n\n${body}`;
|
|
1239
|
+
}
|
|
1240
|
+
|
|
1241
|
+
function refreshAiContextDoc(projectRoot, scan, options = {}) {
|
|
1242
|
+
const destinationPath = path.join(projectRoot, 'docs', 'AI_CONTEXT.md');
|
|
1243
|
+
fs.mkdirSync(path.dirname(destinationPath), { recursive: true });
|
|
1244
|
+
fs.writeFileSync(destinationPath, `${renderAiContextDoc(scan, options)}\n`);
|
|
1245
|
+
return destinationPath;
|
|
1246
|
+
}
|
|
1247
|
+
|
|
966
1248
|
module.exports = {
|
|
967
1249
|
initializeProjectDocs,
|
|
1250
|
+
refreshAiContextDoc,
|
|
1251
|
+
renderAiContextDoc,
|
|
1252
|
+
summarizeSkippedPaths,
|
|
968
1253
|
writeFrontMatter,
|
|
969
1254
|
toProjectSlug,
|
|
970
1255
|
detectPackageManager,
|
|
@@ -22,6 +22,7 @@ const CORE_VISIBLE_DIRECTORIES = ['docs', 'docs/ai', '.quiver', '.quiver/scans']
|
|
|
22
22
|
const MINIMAL_VISIBLE_FILES = [
|
|
23
23
|
'README.md',
|
|
24
24
|
'AGENTS.md',
|
|
25
|
+
'.gitignore',
|
|
25
26
|
'docs/AI_CONTEXT.md',
|
|
26
27
|
'docs/AI_ONBOARDING_PROMPT.md',
|
|
27
28
|
'docs/COMMANDS.md',
|
|
@@ -81,6 +82,7 @@ function quiverInternalPaths(projectRoot) {
|
|
|
81
82
|
cacheDir: path.join(root, 'cache'),
|
|
82
83
|
configPath: path.join(root, 'config.json'),
|
|
83
84
|
gitignorePath: path.join(root, '.gitignore'),
|
|
85
|
+
locksDir: path.join(root, 'locks'),
|
|
84
86
|
runsDir: path.join(root, 'runs'),
|
|
85
87
|
scansDir: path.join(root, 'scans'),
|
|
86
88
|
statePath: path.join(root, 'state.json'),
|
|
@@ -92,6 +94,8 @@ function quiverInternalPaths(projectRoot) {
|
|
|
92
94
|
function buildQuiverInternalGitignore() {
|
|
93
95
|
return [
|
|
94
96
|
'cache/',
|
|
97
|
+
'evidence/',
|
|
98
|
+
'locks/',
|
|
95
99
|
'runs/',
|
|
96
100
|
'worktrees/',
|
|
97
101
|
'',
|
|
@@ -178,15 +182,34 @@ function resolveInitPackageScripts(profile, options = {}) {
|
|
|
178
182
|
const baseScripts = {
|
|
179
183
|
'quiver:migrate': 'npx create-quiver migrate',
|
|
180
184
|
'quiver:analyze': 'npx create-quiver analyze',
|
|
185
|
+
'quiver:flow': 'npx create-quiver flow',
|
|
186
|
+
'quiver:prepare': 'npx create-quiver prepare',
|
|
181
187
|
'quiver:plan': 'npx create-quiver plan',
|
|
182
188
|
'quiver:graph': 'npx create-quiver graph',
|
|
183
189
|
'quiver:next': 'npx create-quiver next',
|
|
184
190
|
'quiver:doctor': 'npx create-quiver doctor',
|
|
191
|
+
'quiver:evidence': 'npx create-quiver evidence',
|
|
192
|
+
'quiver:ai:agent': 'npx create-quiver ai agent',
|
|
193
|
+
'quiver:ai:inspect': 'npx create-quiver ai inspect',
|
|
194
|
+
'quiver:ai:export': 'npx create-quiver ai export',
|
|
195
|
+
'quiver:ai:specs': 'npx create-quiver ai specs list',
|
|
196
|
+
'quiver:ai:slices': 'npx create-quiver ai slices list',
|
|
197
|
+
'quiver:ai:trace': 'npx create-quiver ai trace report',
|
|
185
198
|
'quiver:ai:onboard': 'npx create-quiver ai onboard',
|
|
199
|
+
'quiver:ai:prepare-context': 'npx create-quiver ai prepare-context',
|
|
186
200
|
'quiver:ai:plan': 'npx create-quiver ai plan',
|
|
201
|
+
'quiver:ai:revise': 'npx create-quiver ai revise',
|
|
202
|
+
'quiver:ai:review-plan': 'npx create-quiver ai review-plan',
|
|
203
|
+
'quiver:ai:approve': 'npx create-quiver ai approve',
|
|
204
|
+
'quiver:ai:prompt-slice': 'npx create-quiver ai prompt-slice',
|
|
187
205
|
'quiver:ai:execute-slice': 'npx create-quiver ai execute-slice',
|
|
206
|
+
'quiver:ai:execute-plan': 'npx create-quiver ai execute-plan',
|
|
188
207
|
'quiver:ai:pr': 'npx create-quiver ai pr',
|
|
189
208
|
'quiver:ai:doctor': 'npx create-quiver ai doctor',
|
|
209
|
+
'quiver:spec:create': 'npx create-quiver spec create',
|
|
210
|
+
'quiver:spec:start': 'npx create-quiver spec start',
|
|
211
|
+
'quiver:spec:status': 'npx create-quiver spec status',
|
|
212
|
+
'quiver:spec:close': 'npx create-quiver spec close',
|
|
190
213
|
'quiver:start-slice': 'npx create-quiver start-slice',
|
|
191
214
|
'quiver:check-slice': 'npx create-quiver check-slice',
|
|
192
215
|
'quiver:check-pr': 'npx create-quiver check-pr',
|
|
@@ -259,7 +282,17 @@ function buildInitLayout(projectRoot, options = {}) {
|
|
|
259
282
|
}
|
|
260
283
|
|
|
261
284
|
for (const file of visibleFiles) {
|
|
262
|
-
|
|
285
|
+
const updateMode = file === 'package.json' || file === '.gitignore';
|
|
286
|
+
pushPlannedOperation(
|
|
287
|
+
operations,
|
|
288
|
+
projectRoot,
|
|
289
|
+
file,
|
|
290
|
+
'file',
|
|
291
|
+
updateMode ? 'update' : 'create',
|
|
292
|
+
updateMode ? 'prepare project metadata or ignored paths' : 'core visible contract file',
|
|
293
|
+
profile,
|
|
294
|
+
'visible',
|
|
295
|
+
);
|
|
263
296
|
}
|
|
264
297
|
|
|
265
298
|
if (profile === 'full') {
|
|
@@ -1,7 +1,57 @@
|
|
|
1
1
|
function stripJsonComments(text) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
const input = String(text || '');
|
|
3
|
+
let output = '';
|
|
4
|
+
let inString = false;
|
|
5
|
+
let escaped = false;
|
|
6
|
+
|
|
7
|
+
for (let index = 0; index < input.length; index += 1) {
|
|
8
|
+
const char = input[index];
|
|
9
|
+
const next = input[index + 1];
|
|
10
|
+
|
|
11
|
+
if (inString) {
|
|
12
|
+
output += char;
|
|
13
|
+
if (escaped) {
|
|
14
|
+
escaped = false;
|
|
15
|
+
} else if (char === '\\') {
|
|
16
|
+
escaped = true;
|
|
17
|
+
} else if (char === '"') {
|
|
18
|
+
inString = false;
|
|
19
|
+
}
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (char === '"') {
|
|
24
|
+
inString = true;
|
|
25
|
+
output += char;
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (char === '/' && next === '/') {
|
|
30
|
+
while (index < input.length && input[index] !== '\n') {
|
|
31
|
+
index += 1;
|
|
32
|
+
}
|
|
33
|
+
if (index < input.length) {
|
|
34
|
+
output += '\n';
|
|
35
|
+
}
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (char === '/' && next === '*') {
|
|
40
|
+
index += 2;
|
|
41
|
+
while (index < input.length && !(input[index] === '*' && input[index + 1] === '/')) {
|
|
42
|
+
if (input[index] === '\n') {
|
|
43
|
+
output += '\n';
|
|
44
|
+
}
|
|
45
|
+
index += 1;
|
|
46
|
+
}
|
|
47
|
+
index += 1;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
output += char;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return output;
|
|
5
55
|
}
|
|
6
56
|
|
|
7
57
|
function parseJsonWithComments(text) {
|
|
@@ -4,6 +4,7 @@ const { branchDelete, catFileExists, currentBranch, fetchBranch, fetchRemote, ha
|
|
|
4
4
|
const { parseJsonWithComments } = require('./json');
|
|
5
5
|
const { writeFrontMatter } = require('./init-docs');
|
|
6
6
|
const { relativePosixPath, resolveTargetRoot } = require('./paths');
|
|
7
|
+
const { ensureSpecSliceZeroComplete } = require('./spec-worktrees');
|
|
7
8
|
const { activeSlicePath, renderActiveSlice, resolveSliceContext, safeBranchName, toAlias, validateSliceMetaForStart, worktreesRootForRepo } = require('./slice');
|
|
8
9
|
|
|
9
10
|
function ensureDir(dirPath) {
|
|
@@ -299,6 +300,11 @@ function startSlice(sliceInput, options = {}) {
|
|
|
299
300
|
const repoRoot = runGit(['rev-parse', '--show-toplevel'], process.cwd());
|
|
300
301
|
const slice = resolveSliceContext(repoRoot, sliceInput);
|
|
301
302
|
slice.repoRoot = repoRoot;
|
|
303
|
+
|
|
304
|
+
if (!slice.isBaseline) {
|
|
305
|
+
ensureSpecSliceZeroComplete(repoRoot, slice.specDirAbs);
|
|
306
|
+
}
|
|
307
|
+
|
|
302
308
|
validateSliceMetaForStart(slice);
|
|
303
309
|
|
|
304
310
|
if (slice.status === 'blocked') {
|