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.
- package/CHANGELOG.md +8 -0
- package/README.md +16 -8
- package/README_FOR_AI.md +11 -6
- package/ROADMAP.md +9 -2
- package/docs/COMMANDS.md.template +9 -2
- package/package.json +2 -1
- package/specs/quiver-v26-0121-smoke-hardening/SPEC.md +2 -2
- package/specs/quiver-v26-0121-smoke-hardening/STATUS.md +5 -5
- package/specs/quiver-v27-reliability-ai-workflow-hardening/AUDIT_V24_V25_V26.md +67 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/COMMAND_CONTRACTS.md +125 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/COVERAGE_MATRIX.md +74 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/EVIDENCE_REPORT.md +179 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/EXECUTION_PLAN.md +71 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/SPEC.md +176 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/STATUS.md +37 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/pr.md +132 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-00-docs-audit-coverage-and-contracts/CLOSURE_BRIEF.md +36 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-00-docs-audit-coverage-and-contracts/EXECUTION_BRIEF.md +56 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-00-docs-audit-coverage-and-contracts/slice.json +75 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-01-core-state-resolver-and-canonical-statuses/CLOSURE_BRIEF.md +37 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-01-core-state-resolver-and-canonical-statuses/EXECUTION_BRIEF.md +54 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-01-core-state-resolver-and-canonical-statuses/slice.json +79 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-02-json-export-contract-and-machine-output/CLOSURE_BRIEF.md +34 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-02-json-export-contract-and-machine-output/EXECUTION_BRIEF.md +54 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-02-json-export-contract-and-machine-output/slice.json +75 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-03-approved-plan-to-spec-create/CLOSURE_BRIEF.md +36 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-03-approved-plan-to-spec-create/EXECUTION_BRIEF.md +55 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-03-approved-plan-to-spec-create/slice.json +78 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-04-ai-artifact-storage-redaction-and-token-compaction/CLOSURE_BRIEF.md +31 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-04-ai-artifact-storage-redaction-and-token-compaction/EXECUTION_BRIEF.md +55 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-04-ai-artifact-storage-redaction-and-token-compaction/slice.json +77 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-05-worktree-lifecycle-locks-and-recovery/CLOSURE_BRIEF.md +31 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-05-worktree-lifecycle-locks-and-recovery/EXECUTION_BRIEF.md +55 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-05-worktree-lifecycle-locks-and-recovery/slice.json +84 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-06-validation-gates-and-scope-safety/CLOSURE_BRIEF.md +32 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-06-validation-gates-and-scope-safety/EXECUTION_BRIEF.md +57 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-06-validation-gates-and-scope-safety/slice.json +99 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-07-context-analysis-and-doctor-flow/CLOSURE_BRIEF.md +31 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-07-context-analysis-and-doctor-flow/EXECUTION_BRIEF.md +57 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-07-context-analysis-and-doctor-flow/slice.json +88 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-08-cross-platform-help-auth-and-dx/CLOSURE_BRIEF.md +31 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-08-cross-platform-help-auth-and-dx/EXECUTION_BRIEF.md +56 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-08-cross-platform-help-auth-and-dx/slice.json +85 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-09-fixtures-smoke-docs-and-release-readiness/CLOSURE_BRIEF.md +32 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-09-fixtures-smoke-docs-and-release-readiness/EXECUTION_BRIEF.md +56 -0
- package/specs/quiver-v27-reliability-ai-workflow-hardening/slices/slice-09-fixtures-smoke-docs-and-release-readiness/slice.json +91 -0
- package/src/create-quiver/commands/ai.js +84 -9
- package/src/create-quiver/commands/flow.js +52 -4
- package/src/create-quiver/commands/graph.js +7 -7
- package/src/create-quiver/commands/plan.js +6 -15
- package/src/create-quiver/commands/spec.js +282 -0
- package/src/create-quiver/index.js +83 -21
- package/src/create-quiver/lib/agent-profiles.js +15 -3
- package/src/create-quiver/lib/ai/artifacts.js +318 -0
- package/src/create-quiver/lib/ai/execution-plan.js +9 -0
- package/src/create-quiver/lib/ai/executor.js +3 -2
- package/src/create-quiver/lib/ai/export-state.js +242 -97
- package/src/create-quiver/lib/ai/github.js +80 -3
- package/src/create-quiver/lib/ai/plan-review.js +2 -0
- package/src/create-quiver/lib/ai/spec-generator.js +72 -13
- package/src/create-quiver/lib/ai/spec-templates.js +72 -12
- package/src/create-quiver/lib/analyze.js +2 -2
- package/src/create-quiver/lib/approvals.js +14 -2
- package/src/create-quiver/lib/doctor.js +79 -0
- package/src/create-quiver/lib/git.js +40 -1
- package/src/create-quiver/lib/handoff.js +43 -1
- package/src/create-quiver/lib/init-docs.js +11 -7
- package/src/create-quiver/lib/init-layout.js +1 -0
- package/src/create-quiver/lib/lifecycle.js +52 -3
- package/src/create-quiver/lib/locks.js +134 -0
- package/src/create-quiver/lib/package-safety.js +7 -0
- package/src/create-quiver/lib/paths.js +74 -0
- package/src/create-quiver/lib/project-scan.js +74 -0
- package/src/create-quiver/lib/project-state-resolver.js +236 -0
- package/src/create-quiver/lib/readiness.js +48 -7
- package/src/create-quiver/lib/scope.js +2 -1
- package/src/create-quiver/lib/slice.js +8 -4
- package/src/create-quiver/lib/spec-worktrees.js +121 -38
- 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
|
-
|
|
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:
|
|
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,
|