create-quiver 0.13.0 → 0.14.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/CHANGELOG.md +30 -0
- package/README.md +183 -511
- package/README_FOR_AI.md +36 -26
- package/ROADMAP.md +11 -0
- package/assets/quiver-wordmark.svg +22 -0
- package/docs/AI_CONTEXT.md.template +2 -0
- package/docs/AI_ONBOARDING_PROMPT.md.template +9 -1
- package/docs/CLI_UX_GUIDE.md +125 -0
- package/docs/COMMANDS.md.template +19 -4
- package/docs/GITFLOW_PR_GUIDE.md +70 -0
- package/docs/TROUBLESHOOTING.md.template +29 -0
- package/docs/WORKFLOW.md.template +13 -12
- package/docs/getting-started/linux.md +84 -0
- package/docs/getting-started/macos.md +85 -0
- package/docs/getting-started/windows-git-bash-wsl.md +78 -0
- package/docs/getting-started/windows-powershell.md +96 -0
- package/docs/reference/commands.md +94 -0
- package/docs/workflows/existing-project.md +131 -0
- package/docs/workflows/full-ai-spec-to-pr.md +311 -0
- package/docs/workflows/legacy-quiver-project.md +102 -0
- package/docs/workflows/new-project.md +76 -0
- package/package.json +5 -1
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/COVERAGE_MATRIX.md +117 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/EVIDENCE_REPORT.md +200 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/EXECUTION_PLAN.md +60 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/SPEC.md +132 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/STATUS.md +36 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/pr.md +128 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-00-reconciliation-and-evidence-freeze/CLOSURE_BRIEF.md +44 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-00-reconciliation-and-evidence-freeze/EXECUTION_BRIEF.md +56 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-00-reconciliation-and-evidence-freeze/slice.json +71 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-01-ai-run-state-approvals-and-clean-output/CLOSURE_BRIEF.md +38 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-01-ai-run-state-approvals-and-clean-output/EXECUTION_BRIEF.md +53 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-01-ai-run-state-approvals-and-clean-output/slice.json +83 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-02-structured-technical-plan-contract-and-repair-flow/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-02-structured-technical-plan-contract-and-repair-flow/EXECUTION_BRIEF.md +53 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-02-structured-technical-plan-contract-and-repair-flow/slice.json +85 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-03-active-slice-reconciliation-and-ai-inspect/CLOSURE_BRIEF.md +34 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-03-active-slice-reconciliation-and-ai-inspect/EXECUTION_BRIEF.md +52 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-03-active-slice-reconciliation-and-ai-inspect/slice.json +82 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-04-spec-validation-scope-and-worktree-reliability/CLOSURE_BRIEF.md +32 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-04-spec-validation-scope-and-worktree-reliability/EXECUTION_BRIEF.md +55 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-04-spec-validation-scope-and-worktree-reliability/slice.json +85 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-05-review-plan-closure-and-agent-dx/CLOSURE_BRIEF.md +35 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-05-review-plan-closure-and-agent-dx/EXECUTION_BRIEF.md +59 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-05-review-plan-closure-and-agent-dx/slice.json +94 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-06-backward-compatibility-docs-and-release-readiness/CLOSURE_BRIEF.md +40 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-06-backward-compatibility-docs-and-release-readiness/EXECUTION_BRIEF.md +56 -0
- package/specs/quiver-v28-pixel-quiver-feedback-reconciliation/slices/slice-06-backward-compatibility-docs-and-release-readiness/slice.json +98 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/EVIDENCE_REPORT.md +163 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/EXECUTION_PLAN.md +72 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/SPEC.md +173 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/STATUS.md +34 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/pr.md +95 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-00-cli-ux-spec-foundation/CLOSURE_BRIEF.md +32 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-00-cli-ux-spec-foundation/EXECUTION_BRIEF.md +45 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-00-cli-ux-spec-foundation/slice.json +58 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-01-cli-ux-primitives-theme/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-01-cli-ux-primitives-theme/EXECUTION_BRIEF.md +49 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-01-cli-ux-primitives-theme/slice.json +75 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-02-planner-context-proposal-contract/CLOSURE_BRIEF.md +32 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-02-planner-context-proposal-contract/EXECUTION_BRIEF.md +47 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-02-planner-context-proposal-contract/slice.json +71 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-03-prepare-context-planner-review-flow/CLOSURE_BRIEF.md +33 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-03-prepare-context-planner-review-flow/EXECUTION_BRIEF.md +52 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-03-prepare-context-planner-review-flow/slice.json +82 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-04-ux-flag-matrix-compatibility/CLOSURE_BRIEF.md +34 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-04-ux-flag-matrix-compatibility/EXECUTION_BRIEF.md +46 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-04-ux-flag-matrix-compatibility/slice.json +73 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-05-progressive-command-adoption/CLOSURE_BRIEF.md +34 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-05-progressive-command-adoption/EXECUTION_BRIEF.md +46 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-05-progressive-command-adoption/slice.json +83 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-06-docs-tests-smoke-readiness/CLOSURE_BRIEF.md +31 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-06-docs-tests-smoke-readiness/EXECUTION_BRIEF.md +50 -0
- package/specs/quiver-v29-planner-prepare-context-cli-ux/slices/slice-06-docs-tests-smoke-readiness/slice.json +95 -0
- package/src/create-quiver/commands/ai.js +938 -16
- package/src/create-quiver/commands/spec.js +74 -2
- package/src/create-quiver/index.js +91 -5
- package/src/create-quiver/lib/ai/context-packs.js +2 -2
- package/src/create-quiver/lib/ai/context-proposal.js +389 -0
- package/src/create-quiver/lib/ai/context-proposal.schema.js +31 -0
- package/src/create-quiver/lib/ai/export-state.js +52 -5
- package/src/create-quiver/lib/ai/github.js +14 -2
- package/src/create-quiver/lib/ai/plan-review.js +159 -0
- package/src/create-quiver/lib/ai/run-state.js +17 -2
- package/src/create-quiver/lib/ai/spec-generator.js +15 -0
- package/src/create-quiver/lib/cli/editor.js +118 -0
- package/src/create-quiver/lib/cli/theme.js +100 -0
- package/src/create-quiver/lib/cli/ux-flags.js +151 -0
- package/src/create-quiver/lib/cli/ux.js +130 -0
- package/src/create-quiver/lib/project-state-resolver.js +195 -1
- package/src/create-quiver/lib/spec-worktrees.js +50 -2
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# CLOSURE_BRIEF - slice-01 CLI UX primitives, theme, and dependencies
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
Completed the shared CLI UX foundation required by later v29 slices.
|
|
6
|
+
|
|
7
|
+
## Validation Against Acceptance Criteria
|
|
8
|
+
|
|
9
|
+
- Theme tokens are centralized in `src/create-quiver/lib/cli/theme.js` and tested against the approved Quiver palette.
|
|
10
|
+
- UX mode detection disables prompts, spinners, colors, and decorative output for `--json`, CI, and no-TTY modes.
|
|
11
|
+
- `@clack/prompts` is wrapped behind internal helpers and loaded lazily so command code does not couple to it directly.
|
|
12
|
+
- `$VISUAL`/`$EDITOR` resolution, fallback behavior, shell-free execution, and cancellation paths are tested.
|
|
13
|
+
- `npm run package:quiver` passed after adding dependencies.
|
|
14
|
+
|
|
15
|
+
## Relevant Changes
|
|
16
|
+
|
|
17
|
+
- Added runtime dependencies: `@clack/prompts` and `zod`.
|
|
18
|
+
- Added `theme.js`, `ux.js`, and `editor.js` under `src/create-quiver/lib/cli/`.
|
|
19
|
+
- Added focused `node:test` coverage for theme, UX mode/spinner/prompt behavior, and editor resolution/execution.
|
|
20
|
+
|
|
21
|
+
## Pending Work
|
|
22
|
+
|
|
23
|
+
- Later slices must adopt these helpers instead of duplicating output logic.
|
|
24
|
+
- `zod` is intentionally added now and will be used by `slice-02` for planner proposal validation.
|
|
25
|
+
|
|
26
|
+
## Remaining Risks
|
|
27
|
+
|
|
28
|
+
- `@clack/prompts` is ESM-only; it is loaded through dynamic import and covered by tests, but later command adoption must keep this boundary.
|
|
29
|
+
- Windows editor behavior is covered through injected platform/runner tests; real terminal coverage remains part of final smoke/manual validation.
|
|
30
|
+
|
|
31
|
+
## Future Recommendations
|
|
32
|
+
|
|
33
|
+
- Keep UX helpers minimal and command-owned: command behavior should stay testable without a real TTY.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# EXECUTION_BRIEF - slice-01 CLI UX primitives, theme, and dependencies
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
Quiver currently has no runtime dependencies and uses direct string output. This slice adds a shared UX layer carefully so later command changes stay consistent and script-safe.
|
|
6
|
+
|
|
7
|
+
## Objective
|
|
8
|
+
|
|
9
|
+
Create internal helpers for Quiver-branded human output, prompts, spinners, mode detection, and editor review.
|
|
10
|
+
|
|
11
|
+
## Scope
|
|
12
|
+
|
|
13
|
+
- Add `@clack/prompts` and `zod` only if required by the approved implementation path.
|
|
14
|
+
- Add `src/create-quiver/lib/cli/theme.js`.
|
|
15
|
+
- Add `src/create-quiver/lib/cli/ux.js`.
|
|
16
|
+
- Add `src/create-quiver/lib/cli/editor.js`.
|
|
17
|
+
- Add focused unit tests.
|
|
18
|
+
|
|
19
|
+
## Acceptance Criteria
|
|
20
|
+
|
|
21
|
+
- Existing commands keep current behavior unless using new helpers internally without visible behavior changes.
|
|
22
|
+
- No output decoration in CI/no-TTY/JSON/no-color modes.
|
|
23
|
+
- Quiver color tokens match the approved palette.
|
|
24
|
+
- `$VISUAL`/`$EDITOR` fallback is tested.
|
|
25
|
+
|
|
26
|
+
## Suggested Steps
|
|
27
|
+
|
|
28
|
+
1. Add dependencies and lockfile updates.
|
|
29
|
+
2. Implement theme tokens and symbol fallbacks.
|
|
30
|
+
3. Implement mode detection and human-output helpers.
|
|
31
|
+
4. Implement editor helper with cancellation handling.
|
|
32
|
+
5. Add unit tests.
|
|
33
|
+
6. Run package smoke.
|
|
34
|
+
|
|
35
|
+
## Restrictions
|
|
36
|
+
|
|
37
|
+
- Do not migrate CLI parsing in this slice.
|
|
38
|
+
- Do not modify `ai prepare-context` behavior yet.
|
|
39
|
+
|
|
40
|
+
## Risks
|
|
41
|
+
|
|
42
|
+
- Dependency ESM/CJS compatibility can break `npx`.
|
|
43
|
+
- Decoration can leak into tests if mode detection is weak.
|
|
44
|
+
|
|
45
|
+
## Completion Checklist
|
|
46
|
+
|
|
47
|
+
- [ ] Dependencies justified and package smoke passes.
|
|
48
|
+
- [ ] Theme/helper/editor tests pass.
|
|
49
|
+
- [ ] No hardcoded Quiver colors outside the theme module.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slice_id": "slice-01-cli-ux-primitives-theme",
|
|
3
|
+
"ticket": "QUIVER-29-01",
|
|
4
|
+
"type": "feature",
|
|
5
|
+
"title": "CLI UX primitives, theme, and dependencies",
|
|
6
|
+
"objective": "Add shared CLI UX primitives for human output, TTY/CI detection, Quiver colors, prompts, spinners, and editor support without changing command behavior yet.",
|
|
7
|
+
"description": "Introduces the reusable internal UX layer that later command slices can adopt safely.",
|
|
8
|
+
"git": {
|
|
9
|
+
"branch_type": "feature",
|
|
10
|
+
"base_branch": "main",
|
|
11
|
+
"branch_slug": "v29-cli-ux-primitives-theme",
|
|
12
|
+
"branch_name": "feature/QUIVER-29-01-v29-cli-ux-primitives-theme"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"package.json",
|
|
16
|
+
"package-lock.json",
|
|
17
|
+
"src/create-quiver/lib/cli/theme.js",
|
|
18
|
+
"src/create-quiver/lib/cli/ux.js",
|
|
19
|
+
"src/create-quiver/lib/cli/editor.js",
|
|
20
|
+
"tests/lib/cli-theme.test.js",
|
|
21
|
+
"tests/lib/cli-ux.test.js",
|
|
22
|
+
"tests/lib/cli-editor.test.js",
|
|
23
|
+
"specs/quiver-v29-planner-prepare-context-cli-ux/**"
|
|
24
|
+
],
|
|
25
|
+
"expected_read_paths": [
|
|
26
|
+
"src/create-quiver/index.js",
|
|
27
|
+
"src/create-quiver/commands/next.js",
|
|
28
|
+
"package.json",
|
|
29
|
+
"tests/**"
|
|
30
|
+
],
|
|
31
|
+
"allowed_write_paths": [
|
|
32
|
+
"package.json",
|
|
33
|
+
"package-lock.json",
|
|
34
|
+
"src/create-quiver/lib/cli/**",
|
|
35
|
+
"tests/lib/cli-theme.test.js",
|
|
36
|
+
"tests/lib/cli-ux.test.js",
|
|
37
|
+
"tests/lib/cli-editor.test.js",
|
|
38
|
+
"specs/quiver-v29-planner-prepare-context-cli-ux/**"
|
|
39
|
+
],
|
|
40
|
+
"depends_on": [
|
|
41
|
+
"slice-00-cli-ux-spec-foundation"
|
|
42
|
+
],
|
|
43
|
+
"parallel_safe": "after_dependencies",
|
|
44
|
+
"parallel_safe_reason": "Must run before other implementation slices because it owns shared helpers and dependencies.",
|
|
45
|
+
"must": [
|
|
46
|
+
"Add Quiver color tokens in one shared module.",
|
|
47
|
+
"Detect TTY, CI, JSON, no-color, and machine-output modes.",
|
|
48
|
+
"Wrap @clack/prompts behind internal helpers so command code is not coupled directly.",
|
|
49
|
+
"Add editor helper using VISUAL, EDITOR, and safe fallback.",
|
|
50
|
+
"Keep existing command behavior unchanged."
|
|
51
|
+
],
|
|
52
|
+
"not_included": [
|
|
53
|
+
"Planner proposal parsing.",
|
|
54
|
+
"prepare-context behavior changes.",
|
|
55
|
+
"Full parser migration to commander/yargs/oclif."
|
|
56
|
+
],
|
|
57
|
+
"acceptance": [
|
|
58
|
+
"Theme tokens are centralized and tested.",
|
|
59
|
+
"UX helpers disable decoration for CI, no-TTY, --json, and no-color mode.",
|
|
60
|
+
"Editor helper handles missing editor and cancellation without writes.",
|
|
61
|
+
"Package smoke still passes after dependencies are added."
|
|
62
|
+
],
|
|
63
|
+
"tests": [
|
|
64
|
+
"node --test tests/lib/cli-theme.test.js tests/lib/cli-ux.test.js tests/lib/cli-editor.test.js",
|
|
65
|
+
"npm run package:quiver"
|
|
66
|
+
],
|
|
67
|
+
"validation_hints": [
|
|
68
|
+
"Prefer small wrappers over direct @clack usage in commands.",
|
|
69
|
+
"Do not hardcode color values outside theme.js."
|
|
70
|
+
],
|
|
71
|
+
"estimated_hours": 6,
|
|
72
|
+
"actual_hours": 3,
|
|
73
|
+
"status": "completed",
|
|
74
|
+
"completed_at": "2026-05-26"
|
|
75
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# CLOSURE_BRIEF - slice-02 Planner context proposal contract
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
Completed a strict planner context proposal contract for future `ai prepare-context --with-planner` usage.
|
|
6
|
+
|
|
7
|
+
## Validation Against Acceptance Criteria
|
|
8
|
+
|
|
9
|
+
- Valid structured JSON and fenced JSON planner outputs parse into a normalized docs-only write plan.
|
|
10
|
+
- Unsafe paths are rejected before writes, including product code, dependency/lockfiles, absolute paths, traversal paths, generated outputs, runtime/build config, `.quiver/`, and unapproved docs.
|
|
11
|
+
- Schema validation uses `zod` and reports actionable issues with safe next steps.
|
|
12
|
+
- Invalid raw output can be persisted as a redacted run artifact under `.quiver/runs/<run-id>/raw/`.
|
|
13
|
+
|
|
14
|
+
## Relevant Changes
|
|
15
|
+
|
|
16
|
+
- Added `src/create-quiver/lib/ai/context-proposal.schema.js`.
|
|
17
|
+
- Added `src/create-quiver/lib/ai/context-proposal.js`.
|
|
18
|
+
- Added valid, fenced, malformed, product-code, absolute-path, and traversal fixtures under `tests/fixtures/ai-context-proposals/`.
|
|
19
|
+
- Added focused unit tests in `tests/lib/ai-context-proposal.test.js`.
|
|
20
|
+
|
|
21
|
+
## Pending Work
|
|
22
|
+
|
|
23
|
+
- `ai prepare-context` must consume this contract in a later slice.
|
|
24
|
+
|
|
25
|
+
## Remaining Risks
|
|
26
|
+
|
|
27
|
+
- Planner output compatibility must be tested with real provider transcripts later.
|
|
28
|
+
- The allowlist intentionally matches current `prepare-context` docs; future docs must be added explicitly to avoid unsafe broadening.
|
|
29
|
+
|
|
30
|
+
## Future Recommendations
|
|
31
|
+
|
|
32
|
+
- Keep the schema versioned if external agents or dashboards start consuming it.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# EXECUTION_BRIEF - slice-02 Planner context proposal contract
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
Planner-assisted `ai prepare-context` needs a strict contract before any provider output can affect project docs.
|
|
6
|
+
|
|
7
|
+
## Objective
|
|
8
|
+
|
|
9
|
+
Create a safe parser and schema for planner-generated documentation proposals.
|
|
10
|
+
|
|
11
|
+
## Scope
|
|
12
|
+
|
|
13
|
+
- Add proposal schema.
|
|
14
|
+
- Add proposal parser/normalizer.
|
|
15
|
+
- Add docs-only allowlist.
|
|
16
|
+
- Add path safety checks.
|
|
17
|
+
- Add valid and invalid fixtures.
|
|
18
|
+
|
|
19
|
+
## Acceptance Criteria
|
|
20
|
+
|
|
21
|
+
- Unsafe planner output is rejected before writes.
|
|
22
|
+
- Valid planner output becomes a normalized docs-only plan.
|
|
23
|
+
- Errors explain what failed and how to continue safely.
|
|
24
|
+
|
|
25
|
+
## Suggested Steps
|
|
26
|
+
|
|
27
|
+
1. Define proposal JSON shape.
|
|
28
|
+
2. Add `zod` schema validation.
|
|
29
|
+
3. Add path normalization and allowlist checks.
|
|
30
|
+
4. Add fixtures for valid, invalid, product-code, absolute-path, traversal, and malformed outputs.
|
|
31
|
+
5. Add unit tests.
|
|
32
|
+
|
|
33
|
+
## Restrictions
|
|
34
|
+
|
|
35
|
+
- Do not call providers in this slice.
|
|
36
|
+
- Do not modify `runPrepareContext` write behavior yet.
|
|
37
|
+
|
|
38
|
+
## Risks
|
|
39
|
+
|
|
40
|
+
- Too-strict parsing can reject useful planner output; prefer clear repair guidance over unsafe fallback.
|
|
41
|
+
|
|
42
|
+
## Completion Checklist
|
|
43
|
+
|
|
44
|
+
- [ ] Valid fixtures parse.
|
|
45
|
+
- [ ] Unsafe fixtures fail.
|
|
46
|
+
- [ ] Proposal errors are actionable.
|
|
47
|
+
- [ ] No docs are written by this slice.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slice_id": "slice-02-planner-context-proposal-contract",
|
|
3
|
+
"ticket": "QUIVER-29-02",
|
|
4
|
+
"type": "feature",
|
|
5
|
+
"title": "Planner context proposal contract",
|
|
6
|
+
"objective": "Define and validate the structured proposal format used when a planner IA suggests context documentation updates.",
|
|
7
|
+
"description": "Adds the parser, schema, path safety, allowlist checks, and diff-ready internal model for planner-generated context proposals.",
|
|
8
|
+
"git": {
|
|
9
|
+
"branch_type": "feature",
|
|
10
|
+
"base_branch": "main",
|
|
11
|
+
"branch_slug": "v29-planner-context-proposal-contract",
|
|
12
|
+
"branch_name": "feature/QUIVER-29-02-v29-planner-context-proposal-contract"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"src/create-quiver/lib/ai/context-proposal.js",
|
|
16
|
+
"src/create-quiver/lib/ai/context-proposal.schema.js",
|
|
17
|
+
"src/create-quiver/lib/ai/onboarding-template.js",
|
|
18
|
+
"tests/lib/ai-context-proposal.test.js",
|
|
19
|
+
"tests/fixtures/ai-context-proposals/**",
|
|
20
|
+
"specs/quiver-v29-planner-prepare-context-cli-ux/**"
|
|
21
|
+
],
|
|
22
|
+
"expected_read_paths": [
|
|
23
|
+
"src/create-quiver/lib/ai/onboarding-template.js",
|
|
24
|
+
"src/create-quiver/lib/ai/safety.js",
|
|
25
|
+
"src/create-quiver/commands/ai.js",
|
|
26
|
+
"tests/commands/ai-onboard.test.js",
|
|
27
|
+
"tests/lib/ai-context-packs.test.js"
|
|
28
|
+
],
|
|
29
|
+
"allowed_write_paths": [
|
|
30
|
+
"src/create-quiver/lib/ai/context-proposal.js",
|
|
31
|
+
"src/create-quiver/lib/ai/context-proposal.schema.js",
|
|
32
|
+
"src/create-quiver/lib/ai/onboarding-template.js",
|
|
33
|
+
"tests/lib/ai-context-proposal.test.js",
|
|
34
|
+
"tests/fixtures/ai-context-proposals/**",
|
|
35
|
+
"specs/quiver-v29-planner-prepare-context-cli-ux/**"
|
|
36
|
+
],
|
|
37
|
+
"depends_on": [
|
|
38
|
+
"slice-01-cli-ux-primitives-theme"
|
|
39
|
+
],
|
|
40
|
+
"parallel_safe": "after_dependencies",
|
|
41
|
+
"parallel_safe_reason": "Can run in parallel with slice-04 if both avoid central CLI parser conflicts.",
|
|
42
|
+
"must": [
|
|
43
|
+
"Validate planner proposals with zod.",
|
|
44
|
+
"Accept structured JSON or fenced JSON output when safe.",
|
|
45
|
+
"Reject paths outside the repo, path traversal, absolute writes, product code, dependencies, lockfiles, build files, generated files, and runtime config.",
|
|
46
|
+
"Produce a normalized docs-only write plan that existing prepare-context logic can consume.",
|
|
47
|
+
"Persist invalid raw output as an artifact only when safe and redacted."
|
|
48
|
+
],
|
|
49
|
+
"not_included": [
|
|
50
|
+
"Invoking provider CLIs.",
|
|
51
|
+
"Writing docs from planner proposals.",
|
|
52
|
+
"Interactive editor review."
|
|
53
|
+
],
|
|
54
|
+
"acceptance": [
|
|
55
|
+
"Valid planner proposal fixtures parse into a normalized internal model.",
|
|
56
|
+
"Invalid or unsafe proposals fail before writes.",
|
|
57
|
+
"Allowed docs-only paths are explicit and tested.",
|
|
58
|
+
"The parser reports actionable errors with next safe commands."
|
|
59
|
+
],
|
|
60
|
+
"tests": [
|
|
61
|
+
"node --test tests/lib/ai-context-proposal.test.js"
|
|
62
|
+
],
|
|
63
|
+
"validation_hints": [
|
|
64
|
+
"Treat planner output as untrusted input.",
|
|
65
|
+
"Keep schema and allowlist close to the proposal parser."
|
|
66
|
+
],
|
|
67
|
+
"estimated_hours": 8,
|
|
68
|
+
"actual_hours": 3,
|
|
69
|
+
"status": "completed",
|
|
70
|
+
"completed_at": "2026-05-26"
|
|
71
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# CLOSURE_BRIEF - slice-03 Planner-assisted prepare-context review flow
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
Completed explicit planner-assisted context preparation for `ai prepare-context`.
|
|
6
|
+
|
|
7
|
+
## Validation Against Acceptance Criteria
|
|
8
|
+
|
|
9
|
+
- Default deterministic `ai prepare-context` behavior remains unchanged and existing tests still pass.
|
|
10
|
+
- `--with-planner --dry-run` reports provider invocation, candidate docs, allowed paths, and writes nothing.
|
|
11
|
+
- `--with-planner --print-prompt` prints the exact planner prompt without provider auth or writes.
|
|
12
|
+
- Live `--with-planner` invokes the provider, validates the proposal contract, creates snapshots, and writes only allowed docs.
|
|
13
|
+
- Provider failures, invalid planner output, review cancellation, and declined interactive approval leave docs untouched.
|
|
14
|
+
- `--review` writes a proposal artifact, opens or uses the editor flow, and revalidates edited JSON before writing.
|
|
15
|
+
|
|
16
|
+
## Relevant Changes
|
|
17
|
+
|
|
18
|
+
- Extended `src/create-quiver/commands/ai.js` with planner prompt building, dry-run/prompt-only reports, provider execution, proposal review, interactive confirmation, and planner write integration.
|
|
19
|
+
- Updated `src/create-quiver/index.js` to forward planner UX flags/options into `runPrepareContext`.
|
|
20
|
+
- Added `tests/commands/ai-prepare-context-planner.test.js`.
|
|
21
|
+
|
|
22
|
+
## Pending Work
|
|
23
|
+
|
|
24
|
+
- Progressive command adoption should reuse this pattern.
|
|
25
|
+
|
|
26
|
+
## Remaining Risks
|
|
27
|
+
|
|
28
|
+
- Real provider outputs may need fixture updates after dogfooding.
|
|
29
|
+
- Review mode uses a temporary JSON artifact; future UX can make this artifact easier to discover or persist under run state when useful.
|
|
30
|
+
|
|
31
|
+
## Future Recommendations
|
|
32
|
+
|
|
33
|
+
- Consider a future `ai describe-project` alias only if users still find `prepare-context --with-planner` unclear.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# EXECUTION_BRIEF - slice-03 Planner-assisted prepare-context review flow
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
The deterministic `ai prepare-context` path must remain default. Planner-assisted mode is opt-in and must never bypass docs-only safety.
|
|
6
|
+
|
|
7
|
+
## Objective
|
|
8
|
+
|
|
9
|
+
Implement `ai prepare-context --with-planner` with dry-run, prompt printing, review, and interactive support.
|
|
10
|
+
|
|
11
|
+
## Scope
|
|
12
|
+
|
|
13
|
+
- Parse new flags for `ai prepare-context`.
|
|
14
|
+
- Build planner prompt from context pack and current draft plan.
|
|
15
|
+
- Invoke provider only when not dry-run/print-prompt.
|
|
16
|
+
- Validate planner proposal.
|
|
17
|
+
- Snapshot and write docs-only changes.
|
|
18
|
+
- Add editor review flow.
|
|
19
|
+
|
|
20
|
+
## Acceptance Criteria
|
|
21
|
+
|
|
22
|
+
- Existing deterministic behavior stays compatible.
|
|
23
|
+
- Planner mode is explicit.
|
|
24
|
+
- No partial writes on provider, validation, editor, or snapshot failure.
|
|
25
|
+
- Human output has clear next safe commands.
|
|
26
|
+
|
|
27
|
+
## Suggested Steps
|
|
28
|
+
|
|
29
|
+
1. Extend CLI args for `ai prepare-context`.
|
|
30
|
+
2. Add planner prompt builder or reuse onboarding prompt pieces.
|
|
31
|
+
3. Add dry-run and print-prompt paths.
|
|
32
|
+
4. Add provider execution path.
|
|
33
|
+
5. Add proposal validation and write integration.
|
|
34
|
+
6. Add review flow and tests.
|
|
35
|
+
|
|
36
|
+
## Restrictions
|
|
37
|
+
|
|
38
|
+
- Do not allow product code writes.
|
|
39
|
+
- Do not make planner mode default.
|
|
40
|
+
- Do not require interactive prompts for automation.
|
|
41
|
+
|
|
42
|
+
## Risks
|
|
43
|
+
|
|
44
|
+
- Combining provider execution, review, and writes can create partial-state bugs unless staged carefully.
|
|
45
|
+
|
|
46
|
+
## Completion Checklist
|
|
47
|
+
|
|
48
|
+
- [ ] Default mode unchanged.
|
|
49
|
+
- [ ] Planner dry-run and print-prompt tested.
|
|
50
|
+
- [ ] Provider failure tested.
|
|
51
|
+
- [ ] Review cancellation tested.
|
|
52
|
+
- [ ] Snapshot and docs-only write tested.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slice_id": "slice-03-prepare-context-planner-review-flow",
|
|
3
|
+
"ticket": "QUIVER-29-03",
|
|
4
|
+
"type": "feature",
|
|
5
|
+
"title": "Planner-assisted prepare-context review flow",
|
|
6
|
+
"objective": "Implement `ai prepare-context --with-planner` with dry-run, print-prompt, review, interactive, docs-only writes, snapshots, and safe fallback.",
|
|
7
|
+
"description": "Extends the current deterministic prepare-context command while preserving its default behavior.",
|
|
8
|
+
"git": {
|
|
9
|
+
"branch_type": "feature",
|
|
10
|
+
"base_branch": "main",
|
|
11
|
+
"branch_slug": "v29-prepare-context-planner-review-flow",
|
|
12
|
+
"branch_name": "feature/QUIVER-29-03-v29-prepare-context-planner-review-flow"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"src/create-quiver/index.js",
|
|
16
|
+
"src/create-quiver/commands/ai.js",
|
|
17
|
+
"src/create-quiver/lib/ai/onboarding-template.js",
|
|
18
|
+
"src/create-quiver/lib/ai/context-proposal.js",
|
|
19
|
+
"src/create-quiver/lib/ai/artifacts.js",
|
|
20
|
+
"tests/commands/ai-onboard.test.js",
|
|
21
|
+
"tests/commands/ai-prepare-context-planner.test.js",
|
|
22
|
+
"specs/quiver-v29-planner-prepare-context-cli-ux/**"
|
|
23
|
+
],
|
|
24
|
+
"expected_read_paths": [
|
|
25
|
+
"src/create-quiver/index.js",
|
|
26
|
+
"src/create-quiver/commands/ai.js",
|
|
27
|
+
"src/create-quiver/lib/ai/**",
|
|
28
|
+
"tests/commands/ai-onboard.test.js",
|
|
29
|
+
"tests/commands/ai-plan.test.js"
|
|
30
|
+
],
|
|
31
|
+
"allowed_write_paths": [
|
|
32
|
+
"src/create-quiver/index.js",
|
|
33
|
+
"src/create-quiver/commands/ai.js",
|
|
34
|
+
"src/create-quiver/lib/ai/onboarding-template.js",
|
|
35
|
+
"src/create-quiver/lib/ai/context-proposal.js",
|
|
36
|
+
"src/create-quiver/lib/ai/artifacts.js",
|
|
37
|
+
"tests/commands/ai-onboard.test.js",
|
|
38
|
+
"tests/commands/ai-prepare-context-planner.test.js",
|
|
39
|
+
"specs/quiver-v29-planner-prepare-context-cli-ux/**"
|
|
40
|
+
],
|
|
41
|
+
"depends_on": [
|
|
42
|
+
"slice-02-planner-context-proposal-contract",
|
|
43
|
+
"slice-04-ux-flag-matrix-compatibility"
|
|
44
|
+
],
|
|
45
|
+
"parallel_safe": "no",
|
|
46
|
+
"parallel_safe_reason": "Main command integration touches central AI command behavior and should run after contract/flag guardrails are stable.",
|
|
47
|
+
"must": [
|
|
48
|
+
"Keep current prepare-context behavior as default.",
|
|
49
|
+
"Add --with-planner as explicit planner-assisted mode.",
|
|
50
|
+
"Support --print-prompt without provider auth or writes.",
|
|
51
|
+
"Support --dry-run without provider execution or writes.",
|
|
52
|
+
"Support --review with editor review and revalidation.",
|
|
53
|
+
"Support --interactive only in TTY and with non-interactive flag equivalents.",
|
|
54
|
+
"Create snapshots before writes.",
|
|
55
|
+
"Fallback safely to deterministic mode guidance when planner fails."
|
|
56
|
+
],
|
|
57
|
+
"not_included": [
|
|
58
|
+
"Applying UX flags to unrelated commands.",
|
|
59
|
+
"Allowing planner writes outside context docs.",
|
|
60
|
+
"Changing `analyze` behavior."
|
|
61
|
+
],
|
|
62
|
+
"acceptance": [
|
|
63
|
+
"Default prepare-context tests still pass.",
|
|
64
|
+
"--with-planner --dry-run reports invocation and candidate docs without writes.",
|
|
65
|
+
"--with-planner --print-prompt prints exact prompt and exits without provider auth.",
|
|
66
|
+
"--with-planner --review opens/uses editor flow and revalidates edited proposal.",
|
|
67
|
+
"Provider failure and invalid planner output produce no partial writes.",
|
|
68
|
+
"Docs-only snapshots are created before live writes."
|
|
69
|
+
],
|
|
70
|
+
"tests": [
|
|
71
|
+
"node --test tests/commands/ai-onboard.test.js tests/commands/ai-prepare-context-planner.test.js",
|
|
72
|
+
"node --test tests/lib/ai-context-proposal.test.js"
|
|
73
|
+
],
|
|
74
|
+
"validation_hints": [
|
|
75
|
+
"Use injected provider/editor functions in tests.",
|
|
76
|
+
"Verify no product-code writes through path allowlist tests."
|
|
77
|
+
],
|
|
78
|
+
"estimated_hours": 10,
|
|
79
|
+
"actual_hours": 5,
|
|
80
|
+
"status": "completed",
|
|
81
|
+
"completed_at": "2026-05-26"
|
|
82
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# CLOSURE_BRIEF - slice-04 UX flag matrix and compatibility guardrails
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
Completed centralized UX flag support and early compatibility validation.
|
|
6
|
+
|
|
7
|
+
## Validation Against Acceptance Criteria
|
|
8
|
+
|
|
9
|
+
- `--with-planner`, `--interactive`, and `--review` support is centralized in `src/create-quiver/lib/cli/ux-flags.js`.
|
|
10
|
+
- Unsupported UX flags fail before command dispatch and before side effects.
|
|
11
|
+
- Incompatible combinations such as `--json --interactive` and `--json --review` fail before command dispatch.
|
|
12
|
+
- `ai pr` supports `--interactive` and `--review`, while rejecting `--with-planner`.
|
|
13
|
+
- Read-only commands such as `flow`, `ai inspect`, and `ai export` reject unsupported UX flags.
|
|
14
|
+
- Existing `plan --json` output remains parseable when UX flags are not requested.
|
|
15
|
+
|
|
16
|
+
## Relevant Changes
|
|
17
|
+
|
|
18
|
+
- Added `src/create-quiver/lib/cli/ux-flags.js`.
|
|
19
|
+
- Updated `src/create-quiver/index.js` to parse UX flags, validate them early, document them in help, and forward supported values to future command handlers.
|
|
20
|
+
- Added `tests/commands/ux-flags.test.js`.
|
|
21
|
+
|
|
22
|
+
## Pending Work
|
|
23
|
+
|
|
24
|
+
- Later slices should rely on this matrix instead of ad hoc flag behavior.
|
|
25
|
+
- `slice-03` must implement actual `ai prepare-context --with-planner` behavior now that flags are accepted and forwarded.
|
|
26
|
+
|
|
27
|
+
## Remaining Risks
|
|
28
|
+
|
|
29
|
+
- Command help and docs must stay aligned with this matrix.
|
|
30
|
+
- Some supported flags are forwarded before their command behavior exists; final release readiness depends on `slice-03` and `slice-05` completing before merge.
|
|
31
|
+
|
|
32
|
+
## Future Recommendations
|
|
33
|
+
|
|
34
|
+
- Consider generating docs/reference command flag tables from the matrix in a future spec.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# EXECUTION_BRIEF - slice-04 UX flag matrix and compatibility guardrails
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
Quiver needs standard UX flags without making every command accept every flag.
|
|
6
|
+
|
|
7
|
+
## Objective
|
|
8
|
+
|
|
9
|
+
Centralize and enforce command support for `--with-planner`, `--interactive`, and `--review`.
|
|
10
|
+
|
|
11
|
+
## Scope
|
|
12
|
+
|
|
13
|
+
- Add a command/flag matrix.
|
|
14
|
+
- Add parser validation for UX flags.
|
|
15
|
+
- Add incompatible-combination errors.
|
|
16
|
+
- Add tests for CI/no-TTY/JSON behavior.
|
|
17
|
+
|
|
18
|
+
## Acceptance Criteria
|
|
19
|
+
|
|
20
|
+
- Unsupported flags fail before side effects.
|
|
21
|
+
- Supported flags are discoverable in help/docs.
|
|
22
|
+
- Machine modes are never decorated.
|
|
23
|
+
|
|
24
|
+
## Suggested Steps
|
|
25
|
+
|
|
26
|
+
1. Add central flag support matrix.
|
|
27
|
+
2. Extend arg parsing for new flags.
|
|
28
|
+
3. Validate unsupported and incompatible combinations early.
|
|
29
|
+
4. Add command contract tests.
|
|
30
|
+
5. Confirm existing commands keep passing.
|
|
31
|
+
|
|
32
|
+
## Restrictions
|
|
33
|
+
|
|
34
|
+
- Do not implement planner proposal writes here.
|
|
35
|
+
- Do not add prompts to commands in this slice.
|
|
36
|
+
|
|
37
|
+
## Risks
|
|
38
|
+
|
|
39
|
+
- Over-strict validation can break existing scripts if flags were previously ignored. Make errors clear and only reject new UX flags.
|
|
40
|
+
|
|
41
|
+
## Completion Checklist
|
|
42
|
+
|
|
43
|
+
- [ ] Matrix exists in code.
|
|
44
|
+
- [ ] Matrix is tested.
|
|
45
|
+
- [ ] CI/no-TTY/JSON behavior is protected.
|
|
46
|
+
- [ ] Unsupported flags produce actionable output.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slice_id": "slice-04-ux-flag-matrix-compatibility",
|
|
3
|
+
"ticket": "QUIVER-29-04",
|
|
4
|
+
"type": "feature",
|
|
5
|
+
"title": "UX flag matrix and compatibility guardrails",
|
|
6
|
+
"objective": "Add centralized rules for UX flags, incompatible combinations, machine-output modes, and unsupported command guidance.",
|
|
7
|
+
"description": "Prevents inconsistent adoption of `--with-planner`, `--interactive`, and `--review` by making command support explicit and testable.",
|
|
8
|
+
"git": {
|
|
9
|
+
"branch_type": "feature",
|
|
10
|
+
"base_branch": "main",
|
|
11
|
+
"branch_slug": "v29-ux-flag-matrix-compatibility",
|
|
12
|
+
"branch_name": "feature/QUIVER-29-04-v29-ux-flag-matrix-compatibility"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"src/create-quiver/index.js",
|
|
16
|
+
"src/create-quiver/lib/cli/ux-flags.js",
|
|
17
|
+
"src/create-quiver/lib/cli/ux.js",
|
|
18
|
+
"tests/commands/cli-contract.test.js",
|
|
19
|
+
"tests/commands/ux-flags.test.js",
|
|
20
|
+
"tests/lib/cli-ux.test.js",
|
|
21
|
+
"specs/quiver-v29-planner-prepare-context-cli-ux/**"
|
|
22
|
+
],
|
|
23
|
+
"expected_read_paths": [
|
|
24
|
+
"src/create-quiver/index.js",
|
|
25
|
+
"src/create-quiver/lib/cli/**",
|
|
26
|
+
"tests/commands/cli-contract.test.js"
|
|
27
|
+
],
|
|
28
|
+
"allowed_write_paths": [
|
|
29
|
+
"src/create-quiver/index.js",
|
|
30
|
+
"src/create-quiver/lib/cli/ux-flags.js",
|
|
31
|
+
"src/create-quiver/lib/cli/ux.js",
|
|
32
|
+
"tests/commands/cli-contract.test.js",
|
|
33
|
+
"tests/commands/ux-flags.test.js",
|
|
34
|
+
"tests/lib/cli-ux.test.js",
|
|
35
|
+
"specs/quiver-v29-planner-prepare-context-cli-ux/**"
|
|
36
|
+
],
|
|
37
|
+
"depends_on": [
|
|
38
|
+
"slice-01-cli-ux-primitives-theme"
|
|
39
|
+
],
|
|
40
|
+
"parallel_safe": "after_dependencies",
|
|
41
|
+
"parallel_safe_reason": "Can run in parallel with slice-02 if central parser conflicts are avoided.",
|
|
42
|
+
"must": [
|
|
43
|
+
"Define which commands support --with-planner, --interactive, and --review.",
|
|
44
|
+
"Reject unsupported UX flags with actionable messages.",
|
|
45
|
+
"Reject incompatible combinations such as --json --interactive and --json --review.",
|
|
46
|
+
"Ensure CI/no-TTY/--json disables spinners, colors, prompts, and decorative output.",
|
|
47
|
+
"Keep machine-readable stdout parseable."
|
|
48
|
+
],
|
|
49
|
+
"not_included": [
|
|
50
|
+
"Implementing planner mode itself.",
|
|
51
|
+
"Migrating all commands to interactive mode.",
|
|
52
|
+
"Changing existing command semantics beyond flag validation."
|
|
53
|
+
],
|
|
54
|
+
"acceptance": [
|
|
55
|
+
"Command/flag matrix is enforced in code and documented.",
|
|
56
|
+
"Unsupported flags fail before side effects.",
|
|
57
|
+
"Incompatible flag combinations fail before side effects.",
|
|
58
|
+
"JSON output stays undecorated.",
|
|
59
|
+
"Human-mode helpers remain opt-in."
|
|
60
|
+
],
|
|
61
|
+
"tests": [
|
|
62
|
+
"node --test tests/commands/ux-flags.test.js tests/commands/cli-contract.test.js",
|
|
63
|
+
"node --test tests/lib/cli-ux.test.js"
|
|
64
|
+
],
|
|
65
|
+
"validation_hints": [
|
|
66
|
+
"Tests should cover both supported and unsupported commands.",
|
|
67
|
+
"Do not allow partial command execution after flag validation failure."
|
|
68
|
+
],
|
|
69
|
+
"estimated_hours": 7,
|
|
70
|
+
"actual_hours": 2,
|
|
71
|
+
"status": "completed",
|
|
72
|
+
"completed_at": "2026-05-26"
|
|
73
|
+
}
|