create-quiver 0.12.1 → 0.13.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.
Files changed (79) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +16 -8
  3. package/README_FOR_AI.md +11 -6
  4. package/ROADMAP.md +9 -2
  5. package/docs/COMMANDS.md.template +9 -2
  6. package/package.json +2 -1
  7. package/specs/quiver-v26-0121-smoke-hardening/SPEC.md +2 -2
  8. package/specs/quiver-v26-0121-smoke-hardening/STATUS.md +5 -5
  9. package/specs/quiver-v27-reliability-ai-workflow-hardening/AUDIT_V24_V25_V26.md +67 -0
  10. package/specs/quiver-v27-reliability-ai-workflow-hardening/COMMAND_CONTRACTS.md +125 -0
  11. package/specs/quiver-v27-reliability-ai-workflow-hardening/COVERAGE_MATRIX.md +74 -0
  12. package/specs/quiver-v27-reliability-ai-workflow-hardening/EVIDENCE_REPORT.md +179 -0
  13. package/specs/quiver-v27-reliability-ai-workflow-hardening/EXECUTION_PLAN.md +71 -0
  14. package/specs/quiver-v27-reliability-ai-workflow-hardening/SPEC.md +176 -0
  15. package/specs/quiver-v27-reliability-ai-workflow-hardening/STATUS.md +37 -0
  16. package/specs/quiver-v27-reliability-ai-workflow-hardening/pr.md +132 -0
  17. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-00-docs-audit-coverage-and-contracts/CLOSURE_BRIEF.md +36 -0
  18. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-00-docs-audit-coverage-and-contracts/EXECUTION_BRIEF.md +56 -0
  19. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-00-docs-audit-coverage-and-contracts/slice.json +75 -0
  20. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-01-core-state-resolver-and-canonical-statuses/CLOSURE_BRIEF.md +37 -0
  21. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-01-core-state-resolver-and-canonical-statuses/EXECUTION_BRIEF.md +54 -0
  22. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-01-core-state-resolver-and-canonical-statuses/slice.json +79 -0
  23. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-02-json-export-contract-and-machine-output/CLOSURE_BRIEF.md +34 -0
  24. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-02-json-export-contract-and-machine-output/EXECUTION_BRIEF.md +54 -0
  25. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-02-json-export-contract-and-machine-output/slice.json +75 -0
  26. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-03-approved-plan-to-spec-create/CLOSURE_BRIEF.md +36 -0
  27. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-03-approved-plan-to-spec-create/EXECUTION_BRIEF.md +55 -0
  28. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-03-approved-plan-to-spec-create/slice.json +78 -0
  29. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-04-ai-artifact-storage-redaction-and-token-compaction/CLOSURE_BRIEF.md +31 -0
  30. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-04-ai-artifact-storage-redaction-and-token-compaction/EXECUTION_BRIEF.md +55 -0
  31. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-04-ai-artifact-storage-redaction-and-token-compaction/slice.json +77 -0
  32. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-05-worktree-lifecycle-locks-and-recovery/CLOSURE_BRIEF.md +31 -0
  33. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-05-worktree-lifecycle-locks-and-recovery/EXECUTION_BRIEF.md +55 -0
  34. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-05-worktree-lifecycle-locks-and-recovery/slice.json +84 -0
  35. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-06-validation-gates-and-scope-safety/CLOSURE_BRIEF.md +32 -0
  36. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-06-validation-gates-and-scope-safety/EXECUTION_BRIEF.md +57 -0
  37. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-06-validation-gates-and-scope-safety/slice.json +99 -0
  38. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-07-context-analysis-and-doctor-flow/CLOSURE_BRIEF.md +31 -0
  39. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-07-context-analysis-and-doctor-flow/EXECUTION_BRIEF.md +57 -0
  40. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-07-context-analysis-and-doctor-flow/slice.json +88 -0
  41. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-08-cross-platform-help-auth-and-dx/CLOSURE_BRIEF.md +31 -0
  42. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-08-cross-platform-help-auth-and-dx/EXECUTION_BRIEF.md +56 -0
  43. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-08-cross-platform-help-auth-and-dx/slice.json +85 -0
  44. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-09-fixtures-smoke-docs-and-release-readiness/CLOSURE_BRIEF.md +32 -0
  45. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-09-fixtures-smoke-docs-and-release-readiness/EXECUTION_BRIEF.md +56 -0
  46. package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-09-fixtures-smoke-docs-and-release-readiness/slice.json +91 -0
  47. package/src/create-quiver/commands/ai.js +84 -9
  48. package/src/create-quiver/commands/flow.js +52 -4
  49. package/src/create-quiver/commands/graph.js +7 -7
  50. package/src/create-quiver/commands/plan.js +6 -15
  51. package/src/create-quiver/commands/spec.js +282 -0
  52. package/src/create-quiver/index.js +83 -21
  53. package/src/create-quiver/lib/agent-profiles.js +15 -3
  54. package/src/create-quiver/lib/ai/artifacts.js +318 -0
  55. package/src/create-quiver/lib/ai/execution-plan.js +9 -0
  56. package/src/create-quiver/lib/ai/executor.js +3 -2
  57. package/src/create-quiver/lib/ai/export-state.js +242 -97
  58. package/src/create-quiver/lib/ai/github.js +80 -3
  59. package/src/create-quiver/lib/ai/plan-review.js +2 -0
  60. package/src/create-quiver/lib/ai/spec-generator.js +72 -13
  61. package/src/create-quiver/lib/ai/spec-templates.js +72 -12
  62. package/src/create-quiver/lib/analyze.js +2 -2
  63. package/src/create-quiver/lib/approvals.js +14 -2
  64. package/src/create-quiver/lib/doctor.js +79 -0
  65. package/src/create-quiver/lib/git.js +40 -1
  66. package/src/create-quiver/lib/handoff.js +43 -1
  67. package/src/create-quiver/lib/init-docs.js +11 -7
  68. package/src/create-quiver/lib/init-layout.js +1 -0
  69. package/src/create-quiver/lib/lifecycle.js +52 -3
  70. package/src/create-quiver/lib/locks.js +134 -0
  71. package/src/create-quiver/lib/package-safety.js +7 -0
  72. package/src/create-quiver/lib/paths.js +74 -0
  73. package/src/create-quiver/lib/project-scan.js +74 -0
  74. package/src/create-quiver/lib/project-state-resolver.js +236 -0
  75. package/src/create-quiver/lib/readiness.js +48 -7
  76. package/src/create-quiver/lib/scope.js +2 -1
  77. package/src/create-quiver/lib/slice.js +8 -4
  78. package/src/create-quiver/lib/spec-worktrees.js +121 -38
  79. package/src/create-quiver/lib/statuses.js +115 -0
@@ -0,0 +1,88 @@
1
+ {
2
+ "slice_id": "slice-07-context-analysis-and-doctor-flow",
3
+ "ticket": "QUIVER-27-07",
4
+ "type": "implementation",
5
+ "title": "Context analysis and doctor flow",
6
+ "objective": "Harden analyze, prepare-context, flow, and doctor so onboarding docs are evidence-based, dry-runs are read-only, and next steps are accurate.",
7
+ "description": "Fixes stack detection, read-only dry-run behavior, docs/status consistency checks, stale-state guidance, active spec/slice examples, root/package manager detection, and first-use diagnostics.",
8
+ "git": {
9
+ "branch_type": "feature",
10
+ "base_branch": "main",
11
+ "branch_slug": "v27-context-analysis-doctor-flow",
12
+ "branch_name": "feature/QUIVER-27-07-v27-context-analysis-doctor-flow"
13
+ },
14
+ "files": [
15
+ "src/create-quiver/lib/analyze.js",
16
+ "src/create-quiver/lib/project-scan.js",
17
+ "src/create-quiver/lib/doctor.js",
18
+ "src/create-quiver/lib/ai/onboarding-template.js",
19
+ "src/create-quiver/commands/flow.js",
20
+ "src/create-quiver/commands/prepare.js",
21
+ "tests/lib/**",
22
+ "tests/commands/**",
23
+ "tests/fixtures/**",
24
+ "specs/quiver-v27-reliability-ai-workflow-hardening/**"
25
+ ],
26
+ "expected_read_paths": [
27
+ "src/create-quiver/lib/analyze.js",
28
+ "src/create-quiver/lib/project-scan.js",
29
+ "src/create-quiver/lib/doctor.js",
30
+ "src/create-quiver/lib/ai/onboarding-template.js",
31
+ "src/create-quiver/commands/flow.js",
32
+ "tests/commands/analyze.test.js",
33
+ "tests/commands/ai-onboard.test.js",
34
+ "tests/commands/flow.test.js",
35
+ "tests/commands/doctor.test.js"
36
+ ],
37
+ "allowed_write_paths": [
38
+ "src/create-quiver/lib/analyze.js",
39
+ "src/create-quiver/lib/project-scan.js",
40
+ "src/create-quiver/lib/doctor.js",
41
+ "src/create-quiver/lib/ai/onboarding-template.js",
42
+ "src/create-quiver/commands/flow.js",
43
+ "src/create-quiver/commands/prepare.js",
44
+ "tests/lib/**",
45
+ "tests/commands/**",
46
+ "tests/fixtures/**",
47
+ "specs/quiver-v27-reliability-ai-workflow-hardening/**"
48
+ ],
49
+ "depends_on": [
50
+ "slice-01-core-state-resolver-and-canonical-statuses",
51
+ "slice-06-validation-gates-and-scope-safety"
52
+ ],
53
+ "parallel_safe": "no",
54
+ "parallel_safe_reason": "Context and doctor guidance depends on resolver and validation contract behavior.",
55
+ "must": [
56
+ "Make analyze --dry-run read-only.",
57
+ "Improve React/Vite and stack detection using package.json and config evidence.",
58
+ "Make prepare-context conservative and evidence-based.",
59
+ "Detect docs/status contradictions without overwriting human content.",
60
+ "Make flow show source/timestamp or stale-state information.",
61
+ "Make doctor prioritize active spec/slice examples where available."
62
+ ],
63
+ "not_included": [
64
+ "Changing spec create behavior.",
65
+ "Changing worktree lifecycle beyond guidance messages.",
66
+ "Executing AI providers."
67
+ ],
68
+ "acceptance": [
69
+ "analyze --dry-run leaves git status unchanged.",
70
+ "React + Vite projects are detected as React/Vite, not Vue.",
71
+ "prepare-context --dry-run does not propose placeholders as truth when evidence exists.",
72
+ "flow reports the state source or a stale/missing context explanation.",
73
+ "doctor examples prefer active spec/slice context or generic examples over the wrong spec."
74
+ ],
75
+ "tests": [
76
+ "node --test tests/commands/analyze.test.js tests/commands/ai-onboard.test.js tests/commands/flow.test.js tests/commands/doctor.test.js tests/lib/project-scan.test.js tests/lib/doctor.test.js",
77
+ "npm run smoke:doctor-fixtures",
78
+ "git diff --check"
79
+ ],
80
+ "validation_hints": [
81
+ "Snapshot git status before/after dry-run tests.",
82
+ "Use fixtures with stale docs and real completed slices."
83
+ ],
84
+ "estimated_hours": 6,
85
+ "status": "completed",
86
+ "completed_at": "2026-05-24",
87
+ "blocked_reason": null
88
+ }
@@ -0,0 +1,31 @@
1
+ # CLOSURE BRIEF - slice-08: Cross-platform help, auth, and DX
2
+
3
+ ## Summary
4
+
5
+ Hardened cross-platform DX around help output, agent profile previews, GitHub auth diagnostics, SSH/path guidance, and package-manager-aware next-step messaging.
6
+
7
+ ## Validation Against Acceptance Criteria
8
+
9
+ - Help output now documents the `ai agent set --dry-run` flow and the general `--dry-run` option includes `ai agent set`.
10
+ - Paths with spaces now trigger shell-specific guidance for macOS/Linux, Windows PowerShell, Git Bash, and WSL in GitHub PR/preflight output.
11
+ - GitHub auth failures now identify likely account, scope, and SSH alias issues and point to `gh auth status` as the next safe command.
12
+ - `ai agent set --dry-run` validates and previews the profile without writing `.quiver/agents/profiles.json`.
13
+ - `flow` now reports the detected package manager and generated `quiver:flow` script command; init/migrate install fallback warnings respect npm, pnpm, yarn, or bun.
14
+
15
+ ## Changes
16
+
17
+ - Added `buildAgentProfileState` and wired `ai agent set --dry-run` through `src/create-quiver/commands/ai.js`.
18
+ - Updated CLI help, examples, and agent dispatch in `src/create-quiver/index.js`.
19
+ - Added GitHub auth classification and shell-safe command/path formatting in `src/create-quiver/lib/ai/github.js`.
20
+ - Added package-manager-aware flow output in `src/create-quiver/commands/flow.js`.
21
+ - Updated command docs and v27 evidence/status docs.
22
+ - Added focused tests for agent dry-run, help contract, GitHub diagnostics/path guidance, and flow package-manager output.
23
+
24
+ ## Remaining Risks
25
+
26
+ - `gh auth status` output varies by GitHub CLI version; diagnostics intentionally combine parsed hints with general account/scope/alias guidance.
27
+ - Shell-safe examples are generated for common shells, but unusual shell configurations may still require manual path adaptation.
28
+
29
+ ## Follow-up Recommendations
30
+
31
+ - In `slice-09`, include smoke coverage for packaged CLI help, `flow`, `ai agent set --dry-run`, and GitHub diagnostic fixtures.
@@ -0,0 +1,56 @@
1
+ # EXECUTION BRIEF - slice-08: Cross-platform help, auth, and DX
2
+
3
+ ## Context
4
+
5
+ Pixel Quiver exposed DX gaps around paths with spaces, GitHub auth, command copying, help coverage, and safe profile configuration. This slice focuses on user-facing clarity after core context behavior is hardened.
6
+
7
+ ## Objective
8
+
9
+ Improve cross-platform help, auth diagnostics, and actionable command guidance.
10
+
11
+ ## Scope
12
+
13
+ - CLI help
14
+ - doctor/preflight messages
15
+ - GitHub auth diagnostics
16
+ - agent profile dry-run
17
+ - package manager-aware suggestions
18
+ - docs and tests
19
+
20
+ ## Acceptance Criteria
21
+
22
+ - Help output covers public commands and key options.
23
+ - Path guidance is copy-safe across OS variants.
24
+ - GitHub auth diagnostics are actionable.
25
+ - Agent profile dry-run does not write files.
26
+ - Suggested commands respect detected package manager.
27
+
28
+ ## Technical Plan Summary
29
+
30
+ Update help registry/messages, add auth diagnostics and dry-run preview, and cover OS/package-manager examples with tests.
31
+
32
+ ## Suggested Execution Steps
33
+
34
+ 1. Inspect help and diagnostics surfaces.
35
+ 2. Add/adjust `ai agent set --dry-run`.
36
+ 3. Improve GitHub auth and SSH alias messages.
37
+ 4. Add path/package-manager guidance.
38
+ 5. Update docs and tests.
39
+
40
+ ## Restrictions
41
+
42
+ - Do not install credentials or mutate user auth.
43
+ - Do not require network in tests.
44
+
45
+ ## Risks
46
+
47
+ - Help output can drift; keep tests tied to command registry.
48
+
49
+ ## Completion Checklist
50
+
51
+ - [ ] Help tests updated.
52
+ - [ ] Auth diagnostics tested.
53
+ - [ ] Agent dry-run tested.
54
+ - [ ] Cross-platform path guidance tested.
55
+ - [ ] Validation commands passed.
56
+
@@ -0,0 +1,85 @@
1
+ {
2
+ "slice_id": "slice-08-cross-platform-help-auth-and-dx",
3
+ "ticket": "QUIVER-27-08",
4
+ "type": "implementation",
5
+ "title": "Cross-platform help, auth, and DX",
6
+ "objective": "Improve cross-platform command guidance, GitHub auth diagnostics, help output, agent profile dry-runs, and next safe command messaging.",
7
+ "description": "Hardens copy-safe command output for macOS/Linux/Windows, paths with spaces, GitHub/SSH auth diagnostics, top-level help coverage, agent profile dry-runs, and actionable error messages.",
8
+ "git": {
9
+ "branch_type": "feature",
10
+ "base_branch": "main",
11
+ "branch_slug": "v27-cross-platform-help-auth-dx",
12
+ "branch_name": "feature/QUIVER-27-08-cross-platform-help-auth-dx"
13
+ },
14
+ "files": [
15
+ "src/create-quiver/index.js",
16
+ "src/create-quiver/lib/actionable-error.js",
17
+ "src/create-quiver/lib/ai/github.js",
18
+ "src/create-quiver/lib/ai/preflight.js",
19
+ "src/create-quiver/lib/agent-profiles.js",
20
+ "src/create-quiver/lib/doctor.js",
21
+ "docs/**",
22
+ "tests/lib/**",
23
+ "tests/commands/**",
24
+ "specs/quiver-v27-reliability-ai-workflow-hardening/**"
25
+ ],
26
+ "expected_read_paths": [
27
+ "src/create-quiver/index.js",
28
+ "src/create-quiver/lib/ai/github.js",
29
+ "src/create-quiver/lib/ai/preflight.js",
30
+ "src/create-quiver/lib/agent-profiles.js",
31
+ "tests/commands/cli-contract.test.js",
32
+ "tests/commands/ai-agent.test.js",
33
+ "tests/lib/ai-github.test.js"
34
+ ],
35
+ "allowed_write_paths": [
36
+ "src/create-quiver/index.js",
37
+ "src/create-quiver/lib/actionable-error.js",
38
+ "src/create-quiver/lib/ai/github.js",
39
+ "src/create-quiver/lib/ai/preflight.js",
40
+ "src/create-quiver/lib/agent-profiles.js",
41
+ "src/create-quiver/lib/doctor.js",
42
+ "docs/**",
43
+ "tests/lib/**",
44
+ "tests/commands/**",
45
+ "specs/quiver-v27-reliability-ai-workflow-hardening/**"
46
+ ],
47
+ "depends_on": [
48
+ "slice-07-context-analysis-and-doctor-flow"
49
+ ],
50
+ "parallel_safe": "no",
51
+ "parallel_safe_reason": "DX/help output should reference the final hardened context and doctor behavior.",
52
+ "must": [
53
+ "Provide copy-safe path guidance for spaces and OS variants.",
54
+ "Improve GitHub auth diagnostics and SSH alias guidance.",
55
+ "Keep --help complete and grouped.",
56
+ "Add ai agent set --dry-run or equivalent safe preview.",
57
+ "Improve next safe command messages.",
58
+ "Respect package manager detection in suggested commands."
59
+ ],
60
+ "not_included": [
61
+ "Installing gh or SSH keys automatically.",
62
+ "Executing provider APIs.",
63
+ "Publishing npm."
64
+ ],
65
+ "acceptance": [
66
+ "Help output includes new/changed commands and key options.",
67
+ "Paths with spaces produce copy-safe guidance for macOS, Linux, PowerShell, Git Bash, and WSL.",
68
+ "GitHub auth errors identify likely account/scope/alias issues and next safe commands.",
69
+ "ai agent set dry-run previews file changes without writing.",
70
+ "Package manager suggestions respect detected npm/pnpm/yarn/bun."
71
+ ],
72
+ "tests": [
73
+ "node --test tests/commands/cli-contract.test.js tests/commands/ai-agent.test.js tests/lib/ai-github.test.js tests/lib/doctor.test.js",
74
+ "npm run smoke:doctor-fixtures",
75
+ "git diff --check"
76
+ ],
77
+ "validation_hints": [
78
+ "Use fixtures for paths with spaces and missing/ambiguous gh auth.",
79
+ "Do not require real GitHub credentials in tests."
80
+ ],
81
+ "estimated_hours": 4,
82
+ "status": "completed",
83
+ "completed_at": "2026-05-24",
84
+ "blocked_reason": null
85
+ }
@@ -0,0 +1,32 @@
1
+ # CLOSURE BRIEF - slice-09: Fixtures, smoke, docs, and release readiness
2
+
3
+ ## Summary
4
+
5
+ Validated the full v27 hardening package from source and packaged CLI behavior. Added final fixture coverage, stale/legacy doctor regressions, packaged CLI smokes, and synchronized source-of-truth docs with the implemented-but-unpublished state.
6
+
7
+ ## Validation Against Acceptance Criteria
8
+
9
+ - All v27 QP/QIS items are covered by completed slices or final fixture validation evidence.
10
+ - Sanitized fixtures now cover Pixel Quiver-style completed specs, paths with spaces, no-Git projects, old `.quiver` state, multiple specs, and stale docs.
11
+ - `node --test tests/**/*.test.js` passed with 356 tests.
12
+ - `npm run smoke:create-quiver`, `npm run smoke:guided-workflow`, `npm run smoke:doctor-fixtures`, and `npm run package:quiver` passed.
13
+ - Package/tarball smoke validates installed CLI behavior for help, `flow`, and `ai agent set --dry-run`, not only source files.
14
+ - `README.md`, `README_FOR_AI.md`, `ROADMAP.md`, and `CHANGELOG.md` are synchronized with v27 implemented but not published.
15
+
16
+ ## Changes
17
+
18
+ - Extended `tests/fixtures/validation-errors/matrix.json` with executable coverage references for final dogfooding states.
19
+ - Hardened `scripts/ci/smoke-doctor-fixtures.js` to require traceable fixture coverage files.
20
+ - Added doctor tests for stale generated docs and old incomplete `.quiver` state.
21
+ - Extended `scripts/ci/smoke-create-quiver.sh` to validate source and packaged CLI first-use guidance.
22
+ - Updated v27 status, roadmap, PR body, evidence, closure, and root docs.
23
+
24
+ ## Remaining Risks
25
+
26
+ - npm publication is intentionally outside this slice and must happen only through the normal release process.
27
+ - The final Pixel Quiver project remains external evidence; committed fixtures stay sanitized and do not copy private project content.
28
+
29
+ ## Follow-up Recommendations
30
+
31
+ - Open the v27 PR with the completed evidence pack.
32
+ - After merge, run the normal release flow and publish the next package version if approved.
@@ -0,0 +1,56 @@
1
+ # EXECUTION BRIEF - slice-09: Fixtures, smoke, docs, and release readiness
2
+
3
+ ## Context
4
+
5
+ After all v27 implementation slices, Quiver needs full regression evidence from source and packaged CLI behavior. This slice closes the spec without publishing npm.
6
+
7
+ ## Objective
8
+
9
+ Validate v27 end to end with sanitized fixtures, tests, smokes, tarball/package smoke, docs sync, and release readiness evidence.
10
+
11
+ ## Scope
12
+
13
+ - Regression fixtures
14
+ - Smoke scripts and evidence
15
+ - README/README_FOR_AI/ROADMAP/CHANGELOG
16
+ - v27 status/evidence/closure
17
+
18
+ ## Acceptance Criteria
19
+
20
+ - Every QP/QIS is fixed, validated, or documented as remaining risk.
21
+ - Sanitized fixtures cover real production cases.
22
+ - Full tests and smokes pass.
23
+ - Package/tarball smoke validates installed behavior.
24
+ - Docs reflect implemented behavior only.
25
+
26
+ ## Technical Plan Summary
27
+
28
+ Add fixtures, run full validation, smoke the packaged CLI from outside the repo, update docs and evidence, and mark the spec release-ready without publishing.
29
+
30
+ ## Suggested Execution Steps
31
+
32
+ 1. Add sanitized fixtures from dogfooding cases.
33
+ 2. Run full test and smoke suite.
34
+ 3. Package and smoke the tarball outside the repo.
35
+ 4. Update README, README_FOR_AI, ROADMAP, CHANGELOG, STATUS, and EVIDENCE_REPORT.
36
+ 5. Record remaining risks.
37
+
38
+ ## Restrictions
39
+
40
+ - Do not publish npm.
41
+ - Do not commit private local paths or credentials.
42
+ - Do not claim release until package smoke passes.
43
+
44
+ ## Risks
45
+
46
+ - Tarball smoke may reveal package-only issues; fix or document before closure.
47
+
48
+ ## Completion Checklist
49
+
50
+ - [ ] Fixtures sanitized.
51
+ - [ ] Full tests passed.
52
+ - [ ] Smokes passed.
53
+ - [ ] Tarball smoke passed.
54
+ - [ ] Docs synced.
55
+ - [ ] Spec evidence completed.
56
+
@@ -0,0 +1,91 @@
1
+ {
2
+ "slice_id": "slice-09-fixtures-smoke-docs-and-release-readiness",
3
+ "ticket": "QUIVER-27-09",
4
+ "type": "validation",
5
+ "title": "Fixtures, smoke, docs, and release readiness",
6
+ "objective": "Validate the full v27 hardening package with sanitized fixtures, local tests, smoke tests, tarball/package validation, and source-of-truth docs.",
7
+ "description": "Adds final regression fixtures from real dogfooding, runs full local and package smokes, synchronizes docs, records evidence, and confirms release readiness without publishing npm.",
8
+ "git": {
9
+ "branch_type": "feature",
10
+ "base_branch": "main",
11
+ "branch_slug": "v27-fixtures-smoke-docs-release-readiness",
12
+ "branch_name": "feature/QUIVER-27-09-fixtures-smoke-docs-release-readiness"
13
+ },
14
+ "files": [
15
+ "README.md",
16
+ "README_FOR_AI.md",
17
+ "ROADMAP.md",
18
+ "CHANGELOG.md",
19
+ "tests/**",
20
+ "scripts/**",
21
+ "specs/quiver-v27-reliability-ai-workflow-hardening/**"
22
+ ],
23
+ "expected_read_paths": [
24
+ "README.md",
25
+ "README_FOR_AI.md",
26
+ "ROADMAP.md",
27
+ "CHANGELOG.md",
28
+ "package.json",
29
+ "scripts/package-quiver.sh",
30
+ "scripts/ci/**",
31
+ "tests/**",
32
+ "specs/quiver-v27-reliability-ai-workflow-hardening/**"
33
+ ],
34
+ "allowed_write_paths": [
35
+ "README.md",
36
+ "README_FOR_AI.md",
37
+ "ROADMAP.md",
38
+ "CHANGELOG.md",
39
+ "tests/**",
40
+ "scripts/**",
41
+ "specs/quiver-v27-reliability-ai-workflow-hardening/**"
42
+ ],
43
+ "depends_on": [
44
+ "slice-02-json-export-contract-and-machine-output",
45
+ "slice-03-approved-plan-to-spec-create",
46
+ "slice-04-ai-artifact-storage-redaction-and-token-compaction",
47
+ "slice-05-worktree-lifecycle-locks-and-recovery",
48
+ "slice-06-validation-gates-and-scope-safety",
49
+ "slice-07-context-analysis-and-doctor-flow",
50
+ "slice-08-cross-platform-help-auth-and-dx"
51
+ ],
52
+ "parallel_safe": "no",
53
+ "parallel_safe_reason": "Final validation and docs sync must run after all implementation slices.",
54
+ "must": [
55
+ "Add sanitized fixtures that represent real dogfooding failures.",
56
+ "Run full command and lib tests.",
57
+ "Run smoke suites.",
58
+ "Run package/tarball smoke from outside the repo.",
59
+ "Update source-of-truth docs only with implemented behavior.",
60
+ "Record release readiness evidence without publishing."
61
+ ],
62
+ "not_included": [
63
+ "Publishing npm.",
64
+ "Opening PR unless requested.",
65
+ "Adding unsanitized local paths or credentials."
66
+ ],
67
+ "acceptance": [
68
+ "All v27 QP/QIS coverage items are either fixed, validated, or documented as remaining risk.",
69
+ "Sanitized fixtures cover Pixel Quiver completed specs, path with spaces, no Git, old .quiver state, multiple specs, and stale docs.",
70
+ "node --test tests/**/*.test.js passes.",
71
+ "smoke:create-quiver, smoke:guided-workflow, and smoke:doctor-fixtures pass or documented blockers are resolved.",
72
+ "Package/tarball smoke validates installed CLI behavior rather than only source code.",
73
+ "README, README_FOR_AI, ROADMAP, and CHANGELOG are synchronized with actual implementation state."
74
+ ],
75
+ "tests": [
76
+ "node --test tests/**/*.test.js",
77
+ "npm run smoke:create-quiver",
78
+ "npm run smoke:guided-workflow",
79
+ "npm run smoke:doctor-fixtures",
80
+ "npm run package:quiver",
81
+ "git diff --check"
82
+ ],
83
+ "validation_hints": [
84
+ "Run package smoke from /private/tmp or another clean directory.",
85
+ "Confirm fixtures do not contain private tokens or unnecessary personal paths."
86
+ ],
87
+ "estimated_hours": 5,
88
+ "status": "completed",
89
+ "completed_at": "2026-05-24",
90
+ "blocked_reason": null
91
+ }
@@ -3,6 +3,12 @@ const path = require('node:path');
3
3
 
4
4
  const { redactSecrets } = require('../lib/evidence');
5
5
  const { formatActionableError } = require('../lib/actionable-error');
6
+ const {
7
+ assertProviderPromptWithinLimit,
8
+ compactRevisionInput,
9
+ extractCleanProviderOutput,
10
+ writeRawProviderArtifact,
11
+ } = require('../lib/ai/artifacts');
6
12
  const { buildContextPackMetadata, normalizeRole } = require('../lib/ai/context-packs');
7
13
  const { runExecuteSlice, runPromptSlice } = require('../lib/ai/executor');
8
14
  const { runExecutePlan } = require('../lib/ai/execution-plan');
@@ -38,6 +44,7 @@ const {
38
44
  } = require('../lib/ai/run-state');
39
45
  const {
40
46
  agentProfilesPath,
47
+ buildAgentProfileState,
41
48
  getAgentProfile,
42
49
  listAgentProfiles,
43
50
  resolveProfileProvider,
@@ -298,15 +305,11 @@ function writeProviderOutput(result) {
298
305
  }
299
306
  }
300
307
 
301
- function getRedactedProviderText(result) {
302
- return redactSecrets([result.stdout, result.stderr].filter(Boolean).join(''));
303
- }
304
-
305
308
  function normalizeText(value) {
306
309
  return String(value || '').replace(/\r\n/g, '\n');
307
310
  }
308
311
 
309
- function buildRevisionInput({ phase, feedbackPath, feedbackText, repoRoot }) {
312
+ function buildRevisionInput({ phase, feedbackPath, feedbackText, repoRoot, compactionOptions = {} }) {
310
313
  const current = readPhaseApproval(repoRoot, phase);
311
314
  if (!current.draft) {
312
315
  throw new Error(formatError(`ai revise --phase ${phase} requires an existing draft; current status is ${current.status}. Run \`npx create-quiver ai plan --phase ${phase} --input <file>\` first.`));
@@ -327,7 +330,7 @@ function buildRevisionInput({ phase, feedbackPath, feedbackText, repoRoot }) {
327
330
  feedbackText.trimEnd(),
328
331
  );
329
332
 
330
- return sections.join('\n\n');
333
+ return compactRevisionInput(sections.join('\n\n'), compactionOptions);
331
334
  }
332
335
 
333
336
  function buildManagedContextBlock(content) {
@@ -723,6 +726,7 @@ async function runPlan(repoRoot, options = {}) {
723
726
  const context = options.context || DEFAULT_PLAN_CONTEXT;
724
727
  const timeoutMs = normalizeTimeout(options.timeout);
725
728
  let inputPath = options.input || '';
729
+ let inputCompaction = null;
726
730
 
727
731
  if (phase === 'spec') {
728
732
  const resolved = resolveReviewedTechnicalPlanInput(repoRoot, inputPath || undefined);
@@ -781,12 +785,15 @@ async function runPlan(repoRoot, options = {}) {
781
785
  throw new Error(formatError(`missing feedback input file for ai revise phase '${phase}'`));
782
786
  }
783
787
  const feedbackText = readTextFile(inputPath, repoRoot);
784
- inputText = buildRevisionInput({
788
+ const revisionInput = buildRevisionInput({
785
789
  phase,
786
790
  feedbackPath: inputPath,
787
791
  feedbackText,
788
792
  repoRoot,
793
+ compactionOptions: options,
789
794
  });
795
+ inputText = revisionInput.text;
796
+ inputCompaction = revisionInput.compaction;
790
797
  } else if (phase === 'technical-plan') {
791
798
  const resolved = resolveApprovedPlannerInput(repoRoot, phase, inputPath || undefined);
792
799
  inputPath = resolved.inputPath;
@@ -809,6 +816,7 @@ async function runPlan(repoRoot, options = {}) {
809
816
  revise: options.revise === true,
810
817
  });
811
818
  const prompt = contextInfo.prompt;
819
+ assertProviderPromptWithinLimit(prompt, options);
812
820
  let invocation;
813
821
 
814
822
  try {
@@ -871,12 +879,27 @@ async function runPlan(repoRoot, options = {}) {
871
879
  throw annotateProviderError(result.error || new Error('provider run failed'), 'plan', phase);
872
880
  }
873
881
 
874
- const draft = savePlannerDraft(repoRoot, phase, inputPath, getRedactedProviderText(result));
875
882
  const lifecycleRun = ensureAiRun(repoRoot, {
876
883
  command: `ai plan --phase ${phase}`,
877
884
  input: inputPath,
878
885
  runId: options.runId,
879
886
  });
887
+ const clean = extractCleanProviderOutput(result, { prompt, projectRoot: repoRoot });
888
+ const rawArtifact = writeRawProviderArtifact(repoRoot, lifecycleRun.run_id, `ai-plan-${phase}`, result, {
889
+ metadata: {
890
+ phase,
891
+ input_path: inputPath,
892
+ prompt_bytes: invocation.promptLength,
893
+ clean_output_source: clean.source,
894
+ stripped_prompt_echo: clean.strippedPromptEcho,
895
+ input_compaction: inputCompaction,
896
+ },
897
+ });
898
+ const draft = savePlannerDraft(repoRoot, phase, inputPath, clean.cleanOutput, {
899
+ rawArtifactPath: rawArtifact.path,
900
+ outputSource: clean.source,
901
+ inputCompaction,
902
+ });
880
903
  updateAiRunPhase(repoRoot, lifecycleRun.run_id, phase === 'acceptance' ? 'acceptance-draft' : 'technical-plan-draft', {
881
904
  artifact: path.relative(repoRoot, draft.filePath).split(path.sep).join('/'),
882
905
  command: `ai plan --phase ${phase}`,
@@ -911,6 +934,7 @@ async function runReviewPlan(repoRoot, options = {}) {
911
934
  inputText,
912
935
  inputPath,
913
936
  });
937
+ assertProviderPromptWithinLimit(built.prompt, options);
914
938
  let invocation;
915
939
 
916
940
  try {
@@ -993,11 +1017,31 @@ async function runReviewPlan(repoRoot, options = {}) {
993
1017
  throw annotateProviderError(result.error || new Error('provider run failed'), 'review-plan');
994
1018
  }
995
1019
 
1020
+ const lifecycleRun = ensureAiRun(repoRoot, {
1021
+ command: 'ai review-plan',
1022
+ input: inputPath,
1023
+ runId: options.runId,
1024
+ phase: 'technical-plan-reviewed',
1025
+ });
1026
+ const clean = extractCleanProviderOutput(result, { prompt: built.prompt, projectRoot: repoRoot });
1027
+ const rawArtifact = writeRawProviderArtifact(repoRoot, lifecycleRun.run_id, 'ai-review-plan', result, {
1028
+ metadata: {
1029
+ phase: 'plan-review',
1030
+ input_path: inputPath,
1031
+ input_kind: resolved.kind,
1032
+ input_version: resolved.version || null,
1033
+ prompt_bytes: invocation.promptLength,
1034
+ clean_output_source: clean.source,
1035
+ stripped_prompt_echo: clean.strippedPromptEcho,
1036
+ },
1037
+ });
996
1038
  const saved = savePlanReview(repoRoot, {
997
- contents: getRedactedProviderText(result),
1039
+ contents: clean.cleanOutput,
998
1040
  inputPath,
999
1041
  inputKind: resolved.kind,
1000
1042
  inputVersion: resolved.version,
1043
+ outputSource: clean.source,
1044
+ rawArtifactPath: rawArtifact.path,
1001
1045
  });
1002
1046
  const relativePath = path.relative(repoRoot, saved.filePath).split(path.sep).join('/');
1003
1047
  process.stdout.write(`AI plan review saved\nArtifact: ${relativePath}\nPrompt source: ${PLAN_REVIEW_PROMPT_SOURCE}\n`);
@@ -1261,6 +1305,21 @@ function formatAgentProfileList(profiles) {
1261
1305
  return `${lines.join('\n')}\n`;
1262
1306
  }
1263
1307
 
1308
+ function formatAgentProfileDryRun(repoRoot, result) {
1309
+ const relativePath = path.relative(repoRoot, result.filePath).split(path.sep).join('/');
1310
+ const verb = result.action === 'update' ? 'update' : 'create';
1311
+ return [
1312
+ 'AI agent profile dry-run',
1313
+ '- Writes: none',
1314
+ `- Would ${verb}: ${relativePath}`,
1315
+ '',
1316
+ formatAgentProfile(result.profile).trimEnd(),
1317
+ '',
1318
+ 'No secrets or provider credentials are stored in agent profiles.',
1319
+ '',
1320
+ ].join('\n');
1321
+ }
1322
+
1264
1323
  function runAgent(repoRoot, options = {}) {
1265
1324
  const command = String(options.command || '').trim().toLowerCase();
1266
1325
 
@@ -1271,6 +1330,22 @@ function runAgent(repoRoot, options = {}) {
1271
1330
  if (!options.provider) {
1272
1331
  throw new Error(formatError('ai agent set requires --provider. Supported providers: codex, claude, gemini.'));
1273
1332
  }
1333
+ if (options.dryRun) {
1334
+ const preview = buildAgentProfileState(repoRoot, options.role, {
1335
+ context: options.context,
1336
+ label: options.label,
1337
+ model: options.model,
1338
+ provider: options.provider,
1339
+ });
1340
+ process.stdout.write(formatAgentProfileDryRun(repoRoot, preview));
1341
+ return {
1342
+ task: 'agent',
1343
+ command,
1344
+ dryRun: true,
1345
+ profile: preview.profile,
1346
+ filePath: path.relative(repoRoot, preview.filePath).split(path.sep).join('/'),
1347
+ };
1348
+ }
1274
1349
  const result = setAgentProfile(repoRoot, options.role, {
1275
1350
  context: options.context,
1276
1351
  label: options.label,