create-quiver 0.7.0 → 0.8.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/.claude/settings.local.json +45 -0
- package/.github/workflows/ci.yml +2 -2
- package/BACKLOG.md +139 -0
- package/CHANGELOG.md +13 -1
- package/README.md +31 -1
- package/README_FOR_AI.md +25 -13
- package/ROADMAP.md +28 -6
- package/docs/AI_ONBOARDING_PROMPT.md.template +4 -0
- package/docs/COMMANDS.md.template +25 -0
- package/docs/INDEX.md.template +2 -0
- package/docs/SUPPORT_MATRIX.md.template +9 -0
- package/docs/WORKFLOW.md.template +4 -0
- package/docs/examples/graph.md.template +62 -0
- package/docs/examples/next.md.template +27 -0
- package/docs/examples/plan.md.template +28 -0
- package/package.json +5 -2
- package/package.template.json +8 -3
- package/scripts/check-slice-readiness.sh +6 -4
- package/scripts/init-docs.sh +57 -9
- package/specs/[project-name]/HANDOFF.md.template +37 -0
- package/specs/[project-name]/slices/slice-template/slice.json +5 -0
- package/specs/quiver-v08-agent-onboarding-analysis/slices/slice-01-project-scan-command/slice.json +1 -1
- package/specs/quiver-v08-agent-onboarding-analysis/slices/slice-02-ai-onboarding-prompt/slice.json +1 -1
- package/specs/quiver-v08-agent-onboarding-analysis/slices/slice-03-doctor-readme-adoption-flow/slice.json +1 -1
- package/specs/quiver-v12-cross-platform-native-runtime/slices/slice-01-cross-platform-support-contract/slice.json +1 -1
- package/specs/quiver-v12-cross-platform-native-runtime/slices/slice-02-node-init-docs-runtime/slice.json +1 -1
- package/specs/quiver-v12-cross-platform-native-runtime/slices/slice-03-node-migrate-analyze-doctor-flow/slice.json +1 -1
- package/specs/quiver-v12-cross-platform-native-runtime/slices/slice-04-node-slice-lifecycle-commands/slice.json +1 -1
- package/specs/quiver-v12-cross-platform-native-runtime/slices/slice-05-generated-project-scripts-and-migration/slice.json +1 -1
- package/specs/quiver-v13-token-efficient-ai-context/EVIDENCE_REPORT.md +1 -1
- package/specs/quiver-v13-token-efficient-ai-context/SPEC.md +1 -1
- package/specs/quiver-v15-init-required-before-migrate/EVIDENCE_REPORT.md +26 -0
- package/specs/quiver-v15-init-required-before-migrate/SPEC.md +66 -0
- package/specs/quiver-v15-init-required-before-migrate/STATUS.md +26 -0
- package/specs/quiver-v15-init-required-before-migrate/slices/slice-01-migrate-initialization-precondition/slice.json +65 -0
- package/specs/quiver-v15-init-required-before-migrate/slices/slice-02-doctor-not-initialized-guidance/slice.json +61 -0
- package/specs/quiver-v15-init-required-before-migrate/slices/slice-03-docs-smokes-init-before-migrate/slice.json +64 -0
- package/specs/quiver-v16-handoff-contract/EVIDENCE_REPORT.md +26 -0
- package/specs/quiver-v16-handoff-contract/SPEC.md +68 -0
- package/specs/quiver-v16-handoff-contract/STATUS.md +26 -0
- package/specs/quiver-v16-handoff-contract/slices/slice-01-handoff-template-and-contract/slice.json +66 -0
- package/specs/quiver-v16-handoff-contract/slices/slice-02-check-handoff-command/slice.json +70 -0
- package/specs/quiver-v16-handoff-contract/slices/slice-03-handoff-scaffold-optional/slice.json +67 -0
- package/specs/quiver-v17-orchestration-foundation/EVIDENCE_REPORT.md +32 -0
- package/specs/quiver-v17-orchestration-foundation/SPEC.md +79 -0
- package/specs/quiver-v17-orchestration-foundation/STATUS.md +31 -0
- package/specs/quiver-v17-orchestration-foundation/slices/slice-01-ci-matrix-verified/slice.json +68 -0
- package/specs/quiver-v17-orchestration-foundation/slices/slice-02-slice-graph-library/slice.json +65 -0
- package/specs/quiver-v17-orchestration-foundation/slices/slice-03-depends-on-validation/slice.json +72 -0
- package/specs/quiver-v18-slice-orchestration/EVIDENCE_REPORT.md +38 -0
- package/specs/quiver-v18-slice-orchestration/SPEC.md +91 -0
- package/specs/quiver-v18-slice-orchestration/STATUS.md +33 -0
- package/specs/quiver-v18-slice-orchestration/slices/slice-01-plan-command/slice.json +79 -0
- package/specs/quiver-v18-slice-orchestration/slices/slice-02-graph-mvp-tree/slice.json +75 -0
- package/specs/quiver-v18-slice-orchestration/slices/slice-03-graph-extended-formats/slice.json +70 -0
- package/specs/quiver-v18-slice-orchestration/slices/slice-04-next-command/slice.json +73 -0
- package/specs/quiver-v18-stabilization/EVIDENCE_REPORT.md +26 -0
- package/specs/quiver-v18-stabilization/SPEC.md +62 -0
- package/specs/quiver-v18-stabilization/STATUS.md +30 -0
- package/specs/quiver-v18-stabilization/slices/slice-01-fix-legacy-dependency-resolution/CLOSURE_BRIEF.md +29 -0
- package/specs/quiver-v18-stabilization/slices/slice-01-fix-legacy-dependency-resolution/EXECUTION_BRIEF.md +134 -0
- package/specs/quiver-v18-stabilization/slices/slice-01-fix-legacy-dependency-resolution/slice.json +56 -0
- package/specs/quiver-v18-stabilization/slices/slice-02-roadmap-and-branch-cleanup/CLOSURE_BRIEF.md +29 -0
- package/specs/quiver-v18-stabilization/slices/slice-02-roadmap-and-branch-cleanup/EXECUTION_BRIEF.md +118 -0
- package/specs/quiver-v18-stabilization/slices/slice-02-roadmap-and-branch-cleanup/slice.json +57 -0
- package/specs/quiver-v18-stabilization/slices/slice-03-publish-drafts-branch/CLOSURE_BRIEF.md +23 -0
- package/specs/quiver-v18-stabilization/slices/slice-03-publish-drafts-branch/EXECUTION_BRIEF.md +73 -0
- package/specs/quiver-v18-stabilization/slices/slice-03-publish-drafts-branch/slice.json +49 -0
- package/src/create-quiver/commands/graph.js +97 -0
- package/src/create-quiver/commands/next.js +134 -0
- package/src/create-quiver/commands/plan.js +205 -0
- package/src/create-quiver/index.js +179 -2
- package/src/create-quiver/lib/handoff.js +104 -0
- package/src/create-quiver/lib/init-docs.js +71 -13
- package/src/create-quiver/lib/json.js +14 -0
- package/src/create-quiver/lib/lifecycle.js +3 -2
- package/src/create-quiver/lib/readiness.js +55 -1
- package/src/create-quiver/lib/renderers/dot.js +129 -0
- package/src/create-quiver/lib/renderers/mermaid.js +119 -0
- package/src/create-quiver/lib/renderers/tree.js +116 -0
- package/src/create-quiver/lib/slice-graph.js +453 -0
- package/src/create-quiver/lib/slice.js +2 -1
- package/src/create-quiver/lib/state.js +50 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slice_id": "slice-02-doctor-not-initialized-guidance",
|
|
3
|
+
"ticket": "QUIVER-02",
|
|
4
|
+
"type": "feature",
|
|
5
|
+
"title": "Doctor Not-Initialized Guidance",
|
|
6
|
+
"objective": "Make `doctor` explain when a project was never initialized by Quiver.",
|
|
7
|
+
"description": "Once `migrate` is hardened, `doctor` must stop implying that every repo only needs migration. This slice teaches the CLI to distinguish not-initialized from not-migrated projects.",
|
|
8
|
+
"git": {
|
|
9
|
+
"branch_type": "feature",
|
|
10
|
+
"base_branch": "main",
|
|
11
|
+
"branch_slug": "doctor-not-initialized-guidance",
|
|
12
|
+
"branch_name": "feature/QUIVER-02-doctor-not-initialized-guidance"
|
|
13
|
+
},
|
|
14
|
+
"must": [
|
|
15
|
+
"Update `doctor` so missing init metadata points to `npx create-quiver --name \"Project Name\"` instead of migration",
|
|
16
|
+
"Keep migration guidance for projects that do have init metadata but are missing upgrade artifacts",
|
|
17
|
+
"Do not weaken existing hard failures around missing required files"
|
|
18
|
+
],
|
|
19
|
+
"not_included": [
|
|
20
|
+
"Changing README or generated docs",
|
|
21
|
+
"Changing migrate behavior"
|
|
22
|
+
],
|
|
23
|
+
"acceptance": [
|
|
24
|
+
"A repo without init metadata gets an init-first doctor message",
|
|
25
|
+
"An initialized but outdated repo still gets migration guidance",
|
|
26
|
+
"Healthy initialized projects keep the current doctor success flow"
|
|
27
|
+
],
|
|
28
|
+
"files": [
|
|
29
|
+
"src/create-quiver/index.js",
|
|
30
|
+
"src/create-quiver/lib/doctor.js",
|
|
31
|
+
"scripts/ci/smoke-create-quiver.sh",
|
|
32
|
+
"specs/quiver-v15-init-required-before-migrate/SPEC.md",
|
|
33
|
+
"specs/quiver-v15-init-required-before-migrate/STATUS.md",
|
|
34
|
+
"specs/quiver-v15-init-required-before-migrate/EVIDENCE_REPORT.md",
|
|
35
|
+
"specs/quiver-v15-init-required-before-migrate/slices/slice-02-doctor-not-initialized-guidance/slice.json"
|
|
36
|
+
],
|
|
37
|
+
"tests": [
|
|
38
|
+
"node -c src/create-quiver/index.js",
|
|
39
|
+
"node -c src/create-quiver/lib/doctor.js",
|
|
40
|
+
"bash scripts/ci/smoke-create-quiver.sh",
|
|
41
|
+
"git diff --check"
|
|
42
|
+
],
|
|
43
|
+
"documentation": [
|
|
44
|
+
"specs/quiver-v15-init-required-before-migrate/SPEC.md",
|
|
45
|
+
"specs/quiver-v15-init-required-before-migrate/STATUS.md",
|
|
46
|
+
"specs/quiver-v15-init-required-before-migrate/EVIDENCE_REPORT.md"
|
|
47
|
+
],
|
|
48
|
+
"dependencies": [
|
|
49
|
+
"slice-01-migrate-initialization-precondition"
|
|
50
|
+
],
|
|
51
|
+
"assumptions": [
|
|
52
|
+
"The init state can be inferred purely from Quiver metadata without guessing from generated files"
|
|
53
|
+
],
|
|
54
|
+
"estimated_hours": 2,
|
|
55
|
+
"actual_hours": 1,
|
|
56
|
+
"status": "completed",
|
|
57
|
+
"blocked_reason": null,
|
|
58
|
+
"ready_at": null,
|
|
59
|
+
"started_at": "2026-04-23",
|
|
60
|
+
"completed_at": "2026-04-23"
|
|
61
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slice_id": "slice-03-docs-smokes-init-before-migrate",
|
|
3
|
+
"ticket": "QUIVER-03",
|
|
4
|
+
"type": "docs",
|
|
5
|
+
"title": "Docs and Smokes for Init Before Migrate",
|
|
6
|
+
"objective": "Align the public docs and smoke tests with the new init-before-migrate contract.",
|
|
7
|
+
"description": "Once the CLI behavior changes, the README, generated docs, and smoke coverage must reflect the new rule so users do not keep treating `migrate` as a bootstrap path.",
|
|
8
|
+
"git": {
|
|
9
|
+
"branch_type": "docs",
|
|
10
|
+
"base_branch": "main",
|
|
11
|
+
"branch_slug": "docs-smokes-init-before-migrate",
|
|
12
|
+
"branch_name": "docs/QUIVER-03-init-before-migrate-contract"
|
|
13
|
+
},
|
|
14
|
+
"must": [
|
|
15
|
+
"Document that `migrate` is only for projects previously initialized by Quiver",
|
|
16
|
+
"Update generated docs to point non-initialized repos back to `npx create-quiver --name \"Project Name\"`",
|
|
17
|
+
"Add smoke coverage for the fail-before-init path and the success-after-init path"
|
|
18
|
+
],
|
|
19
|
+
"not_included": [
|
|
20
|
+
"Changing CLI semantics beyond messaging and tests"
|
|
21
|
+
],
|
|
22
|
+
"acceptance": [
|
|
23
|
+
"README explains the init-before-migrate contract",
|
|
24
|
+
"Generated docs do not imply that `migrate` bootstraps new repos",
|
|
25
|
+
"Smokes fail if `migrate` succeeds before init"
|
|
26
|
+
],
|
|
27
|
+
"files": [
|
|
28
|
+
"README.md",
|
|
29
|
+
"README_FOR_AI.md",
|
|
30
|
+
"src/create-quiver/lib/init-docs.js",
|
|
31
|
+
"scripts/ci/smoke-create-quiver.sh",
|
|
32
|
+
"scripts/ci/smoke-cross-platform.js",
|
|
33
|
+
"specs/quiver-v15-init-required-before-migrate/SPEC.md",
|
|
34
|
+
"specs/quiver-v15-init-required-before-migrate/STATUS.md",
|
|
35
|
+
"specs/quiver-v15-init-required-before-migrate/EVIDENCE_REPORT.md",
|
|
36
|
+
"specs/quiver-v15-init-required-before-migrate/slices/slice-03-docs-smokes-init-before-migrate/slice.json"
|
|
37
|
+
],
|
|
38
|
+
"tests": [
|
|
39
|
+
"bash scripts/ci/smoke-create-quiver.sh",
|
|
40
|
+
"node scripts/ci/smoke-cross-platform.js",
|
|
41
|
+
"git diff --check"
|
|
42
|
+
],
|
|
43
|
+
"documentation": [
|
|
44
|
+
"README.md",
|
|
45
|
+
"README_FOR_AI.md",
|
|
46
|
+
"specs/quiver-v15-init-required-before-migrate/SPEC.md",
|
|
47
|
+
"specs/quiver-v15-init-required-before-migrate/STATUS.md",
|
|
48
|
+
"specs/quiver-v15-init-required-before-migrate/EVIDENCE_REPORT.md"
|
|
49
|
+
],
|
|
50
|
+
"dependencies": [
|
|
51
|
+
"slice-01-migrate-initialization-precondition",
|
|
52
|
+
"slice-02-doctor-not-initialized-guidance"
|
|
53
|
+
],
|
|
54
|
+
"assumptions": [
|
|
55
|
+
"Public docs should describe state-based behavior, not internal implementation details"
|
|
56
|
+
],
|
|
57
|
+
"estimated_hours": 3,
|
|
58
|
+
"actual_hours": 1,
|
|
59
|
+
"status": "completed",
|
|
60
|
+
"blocked_reason": null,
|
|
61
|
+
"ready_at": null,
|
|
62
|
+
"started_at": "2026-04-23",
|
|
63
|
+
"completed_at": "2026-04-23"
|
|
64
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Quiver v0.16 Evidence Report
|
|
2
|
+
|
|
3
|
+
**Spec:** quiver-v16-handoff-contract
|
|
4
|
+
**Date:** 2026-04-23
|
|
5
|
+
**Status:** Completed
|
|
6
|
+
|
|
7
|
+
## Summary
|
|
8
|
+
|
|
9
|
+
This spec will standardize Quiver handoffs as a lightweight artifact for exceptional context transfers. The target outcome is a documented contract with minimal automation, not a new workflow layer.
|
|
10
|
+
|
|
11
|
+
## Slice Evidence
|
|
12
|
+
|
|
13
|
+
| Slice | Status | Evidence |
|
|
14
|
+
|-------|--------|----------|
|
|
15
|
+
| slice-01 | Completed | A canonical `specs/[project-name]/HANDOFF.md.template` now exists, `init-docs` and `scripts/init-docs.sh` copy it into `specs/<project-slug>/HANDOFF.md`, and the docs explain when to use a handoff versus updating a spec or slice directly |
|
|
16
|
+
| slice-02 | Completed | `create-quiver check-handoff <path>` validates path and required sections, returns non-zero on malformed handoffs, and smoke coverage proves both valid and invalid examples |
|
|
17
|
+
| slice-03 | Completed | `create-quiver new-handoff <spec-slug>` generates `specs/<spec-slug>/HANDOFF.md` from the template without overwriting an existing handoff and stays aligned with the validator contract |
|
|
18
|
+
|
|
19
|
+
## Required Final Evidence
|
|
20
|
+
|
|
21
|
+
- A canonical `HANDOFF.md.template` exists under `specs/[project-name]/`
|
|
22
|
+
- Documentation defines the canonical location, lifecycle, and required sections
|
|
23
|
+
- `check-handoff` fails clearly for missing files, wrong paths, and missing required sections
|
|
24
|
+
- A valid `HANDOFF.md` passes validation
|
|
25
|
+
- If `new-handoff` is implemented, it generates a valid handoff in the correct location and refuses accidental overwrite
|
|
26
|
+
- The contract remains separate from `slice.json` types and from `doctor`
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Quiver v0.16 - Handoff Contract
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-04-23
|
|
4
|
+
**Status:** Completed
|
|
5
|
+
|
|
6
|
+
Slice numbering resets here: this spec starts at `slice-01` and does not continue any previous spec's numbering.
|
|
7
|
+
|
|
8
|
+
## Objective
|
|
9
|
+
|
|
10
|
+
Formalize a lightweight `HANDOFF.md` contract for exceptional context transfers between humans and agents without turning handoffs into a new slice type or a heavier orchestration system.
|
|
11
|
+
|
|
12
|
+
## Scope
|
|
13
|
+
|
|
14
|
+
### Included
|
|
15
|
+
|
|
16
|
+
- Define a canonical `HANDOFF.md` template and required sections
|
|
17
|
+
- Define the canonical location and lifecycle for handoff artifacts
|
|
18
|
+
- Add a lightweight `check-handoff` command that validates structure and placement
|
|
19
|
+
- Optionally add a `new-handoff` scaffold command for faster creation
|
|
20
|
+
- Document when a handoff should be used and when a normal spec or slice update is enough
|
|
21
|
+
|
|
22
|
+
### Excluded
|
|
23
|
+
|
|
24
|
+
- Adding a new `type` to `slice.json`
|
|
25
|
+
- Integrating handoff checks into `doctor`
|
|
26
|
+
- Persisting handoff state in `.quiver/state.json`
|
|
27
|
+
- Automatic handoff resolution, merging, or workflow orchestration
|
|
28
|
+
- Publishing a release as part of this spec
|
|
29
|
+
|
|
30
|
+
## Organic Evidence
|
|
31
|
+
|
|
32
|
+
- One real handoff already exists at [specs/quiver-v14-tiered-context-pack/HANDOFF.md](../quiver-v14-tiered-context-pack/HANDOFF.md)
|
|
33
|
+
- This spec promotes that pattern into a documented contract without assuming broader automation than the evidence supports
|
|
34
|
+
|
|
35
|
+
## Preconditions
|
|
36
|
+
|
|
37
|
+
- Before executing `slice-01`, align [ROADMAP.md](../../ROADMAP.md) and [BACKLOG.md](../../BACKLOG.md) so they reflect the already completed `v14` and `v15` work
|
|
38
|
+
|
|
39
|
+
## Proposed Contract
|
|
40
|
+
|
|
41
|
+
- Canonical path: `specs/<spec-slug>/HANDOFF.md`
|
|
42
|
+
- Canonical template source: `specs/[project-name]/HANDOFF.md.template`
|
|
43
|
+
- Required sections:
|
|
44
|
+
- `## Background`
|
|
45
|
+
- `## What you will change`
|
|
46
|
+
- `## Validation checklist`
|
|
47
|
+
- `## Out of scope`
|
|
48
|
+
- `## Expected deliverable`
|
|
49
|
+
- `## Constraints`
|
|
50
|
+
- Handoffs are exceptional artifacts for cross-cutting reconciliation, redirection, or bounded transfer of execution context
|
|
51
|
+
- A handoff must not replace `SPEC.md`, `STATUS.md`, `EVIDENCE_REPORT.md`, or `slice.json`
|
|
52
|
+
|
|
53
|
+
## Slices
|
|
54
|
+
|
|
55
|
+
| Slice | Title | Status | Spec |
|
|
56
|
+
|-------|-------|--------|------|
|
|
57
|
+
| 01 | Handoff Template and Contract | Completed | [slice-01](./slices/slice-01-handoff-template-and-contract/slice.json) |
|
|
58
|
+
| 02 | Check Handoff Command | Completed | [slice-02](./slices/slice-02-check-handoff-command/slice.json) |
|
|
59
|
+
| 03 | Handoff Scaffold Optional | Completed | [slice-03](./slices/slice-03-handoff-scaffold-optional/slice.json) |
|
|
60
|
+
|
|
61
|
+
## Definition of Done
|
|
62
|
+
|
|
63
|
+
- Quiver ships a canonical `HANDOFF.md.template` with the required sections
|
|
64
|
+
- The documentation explains where handoffs live, when to create one, and when not to
|
|
65
|
+
- `create-quiver check-handoff <path>` validates the contract and fails clearly on missing sections or wrong placement
|
|
66
|
+
- `create-quiver new-handoff <spec-slug>` can create a handoff from the template without overwriting an existing file
|
|
67
|
+
- No new `slice.json` type or handoff state machine is introduced
|
|
68
|
+
- Smokes cover the validator and, if implemented, the scaffold flow
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Quiver v0.16 Spec Status
|
|
2
|
+
|
|
3
|
+
**Spec:** quiver-v16-handoff-contract
|
|
4
|
+
**Last updated:** 2026-04-23
|
|
5
|
+
|
|
6
|
+
Slice numbering is local to this spec. The first slice is `slice-01`.
|
|
7
|
+
|
|
8
|
+
## Status
|
|
9
|
+
|
|
10
|
+
| Slice | Title | Status | PR | Estimated hours | Actual hours |
|
|
11
|
+
|-------|-------|--------|----|-----------------|--------------|
|
|
12
|
+
| slice-01 | Handoff Template and Contract | Completed | - | 3 | 2 |
|
|
13
|
+
| slice-02 | Check Handoff Command | Completed | - | 3 | 2 |
|
|
14
|
+
| slice-03 | Handoff Scaffold Optional | Completed | - | 2 | 2 |
|
|
15
|
+
|
|
16
|
+
## Progress
|
|
17
|
+
|
|
18
|
+
- Completed slices: 3 / 3
|
|
19
|
+
- Estimated hours: 8
|
|
20
|
+
- Actual hours: 6
|
|
21
|
+
|
|
22
|
+
## Blockers
|
|
23
|
+
|
|
24
|
+
| Slice | Blocker | Since | Action needed |
|
|
25
|
+
|-------|---------|-------|---------------|
|
|
26
|
+
| - | - | - | - |
|
package/specs/quiver-v16-handoff-contract/slices/slice-01-handoff-template-and-contract/slice.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slice_id": "slice-01-handoff-template-and-contract",
|
|
3
|
+
"ticket": "QUIVER-01",
|
|
4
|
+
"type": "docs",
|
|
5
|
+
"title": "Handoff Template and Contract",
|
|
6
|
+
"objective": "Define the canonical HANDOFF artifact, its required sections, and its lifecycle without changing the slice model.",
|
|
7
|
+
"description": "Quiver already has one real handoff artifact, but there is no formal contract yet. This slice standardizes the artifact as `specs/<spec-slug>/HANDOFF.md`, adds a reusable template at `specs/[project-name]/HANDOFF.md.template`, and documents when a handoff is appropriate versus when a normal spec or slice update is enough.",
|
|
8
|
+
"git": {
|
|
9
|
+
"branch_type": "docs",
|
|
10
|
+
"base_branch": "main",
|
|
11
|
+
"branch_slug": "handoff-template-and-contract",
|
|
12
|
+
"branch_name": "docs/QUIVER-01-handoff-template-and-contract"
|
|
13
|
+
},
|
|
14
|
+
"must": [
|
|
15
|
+
"Add `specs/[project-name]/HANDOFF.md.template` with the required sections `Background`, `What you will change`, `Validation checklist`, `Out of scope`, `Expected deliverable`, and `Constraints`",
|
|
16
|
+
"Document the canonical path for concrete handoffs as `specs/<spec-slug>/HANDOFF.md`",
|
|
17
|
+
"Document when a handoff should be used and when a spec, status update, or slice update is the correct tool instead",
|
|
18
|
+
"State explicitly that handoffs do not introduce a new `slice.json` type and do not replace spec artifacts"
|
|
19
|
+
],
|
|
20
|
+
"not_included": [
|
|
21
|
+
"CLI commands",
|
|
22
|
+
"Doctor integration",
|
|
23
|
+
"Handoff state metadata",
|
|
24
|
+
"Automatic handoff generation"
|
|
25
|
+
],
|
|
26
|
+
"acceptance": [
|
|
27
|
+
"The repository contains a canonical `specs/[project-name]/HANDOFF.md.template`",
|
|
28
|
+
"The template contains all six required sections with stable headings",
|
|
29
|
+
"README and AI workflow documentation explain the canonical path and lifecycle for handoffs",
|
|
30
|
+
"The documentation explains that handoffs are exceptional artifacts and not a replacement for `SPEC.md`, `STATUS.md`, `EVIDENCE_REPORT.md`, or `slice.json`"
|
|
31
|
+
],
|
|
32
|
+
"files": [
|
|
33
|
+
"specs/[project-name]/HANDOFF.md.template",
|
|
34
|
+
"README.md",
|
|
35
|
+
"README_FOR_AI.md",
|
|
36
|
+
"docs/WORKFLOW.md.template",
|
|
37
|
+
"specs/quiver-v16-handoff-contract/SPEC.md",
|
|
38
|
+
"specs/quiver-v16-handoff-contract/STATUS.md",
|
|
39
|
+
"specs/quiver-v16-handoff-contract/EVIDENCE_REPORT.md",
|
|
40
|
+
"specs/quiver-v16-handoff-contract/slices/slice-01-handoff-template-and-contract/slice.json"
|
|
41
|
+
],
|
|
42
|
+
"tests": [
|
|
43
|
+
"rg -n \"^## Background$|^## What you will change$|^## Validation checklist$|^## Out of scope$|^## Expected deliverable$|^## Constraints$\" specs/[project-name]/HANDOFF.md.template",
|
|
44
|
+
"rg -n \"HANDOFF.md|handoff\" README.md README_FOR_AI.md docs/WORKFLOW.md.template",
|
|
45
|
+
"git diff --check"
|
|
46
|
+
],
|
|
47
|
+
"documentation": [
|
|
48
|
+
"README.md",
|
|
49
|
+
"README_FOR_AI.md",
|
|
50
|
+
"docs/WORKFLOW.md.template",
|
|
51
|
+
"specs/[project-name]/HANDOFF.md.template"
|
|
52
|
+
],
|
|
53
|
+
"dependencies": [],
|
|
54
|
+
"assumptions": [
|
|
55
|
+
"One organic handoff example is enough to justify a documented contract layer",
|
|
56
|
+
"The first step should define the artifact and its boundaries before adding automation"
|
|
57
|
+
],
|
|
58
|
+
"estimated_hours": 3,
|
|
59
|
+
"actual_hours": null,
|
|
60
|
+
"status": "completed",
|
|
61
|
+
"blocked_reason": null,
|
|
62
|
+
"ready_at": null,
|
|
63
|
+
"started_at": "2026-04-23",
|
|
64
|
+
"completed_at": "2026-04-23",
|
|
65
|
+
"actual_hours": 2
|
|
66
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slice_id": "slice-02-check-handoff-command",
|
|
3
|
+
"ticket": "QUIVER-02",
|
|
4
|
+
"type": "feature",
|
|
5
|
+
"title": "Check Handoff Command",
|
|
6
|
+
"objective": "Add a lightweight validator for HANDOFF artifacts so the contract is machine-checkable.",
|
|
7
|
+
"description": "Once the handoff contract exists, Quiver should be able to validate that a concrete handoff lives in the canonical location and contains the required sections. This slice adds `create-quiver check-handoff <path>` with clear failures for missing files, wrong placement, and missing headings.",
|
|
8
|
+
"git": {
|
|
9
|
+
"branch_type": "feature",
|
|
10
|
+
"base_branch": "main",
|
|
11
|
+
"branch_slug": "check-handoff-command",
|
|
12
|
+
"branch_name": "feature/QUIVER-02-check-handoff-command"
|
|
13
|
+
},
|
|
14
|
+
"must": [
|
|
15
|
+
"Add `create-quiver check-handoff <path>` to the CLI",
|
|
16
|
+
"Fail non-zero when the target file does not exist",
|
|
17
|
+
"Fail non-zero when the target file is not located at the canonical `specs/<spec-slug>/HANDOFF.md` path",
|
|
18
|
+
"Fail non-zero when any required section heading is missing",
|
|
19
|
+
"Allow extra sections as long as the required headings are present",
|
|
20
|
+
"Add smoke coverage for both passing and failing examples"
|
|
21
|
+
],
|
|
22
|
+
"not_included": [
|
|
23
|
+
"Automatic handoff creation",
|
|
24
|
+
"Doctor warnings",
|
|
25
|
+
"Semantic validation of handoff quality"
|
|
26
|
+
],
|
|
27
|
+
"acceptance": [
|
|
28
|
+
"A valid `specs/<spec-slug>/HANDOFF.md` passes `create-quiver check-handoff <path>`",
|
|
29
|
+
"A missing handoff path exits non-zero with a clear message",
|
|
30
|
+
"A handoff missing one required section exits non-zero and names the missing heading",
|
|
31
|
+
"A handoff outside the canonical `specs/<spec-slug>/HANDOFF.md` path exits non-zero with a placement error",
|
|
32
|
+
"Smoke coverage proves both valid and invalid cases"
|
|
33
|
+
],
|
|
34
|
+
"files": [
|
|
35
|
+
"src/create-quiver/index.js",
|
|
36
|
+
"src/create-quiver/lib/handoff.js",
|
|
37
|
+
"scripts/ci/smoke-cross-platform.js",
|
|
38
|
+
"README.md",
|
|
39
|
+
"README_FOR_AI.md",
|
|
40
|
+
"specs/quiver-v16-handoff-contract/SPEC.md",
|
|
41
|
+
"specs/quiver-v16-handoff-contract/STATUS.md",
|
|
42
|
+
"specs/quiver-v16-handoff-contract/EVIDENCE_REPORT.md",
|
|
43
|
+
"specs/quiver-v16-handoff-contract/slices/slice-02-check-handoff-command/slice.json"
|
|
44
|
+
],
|
|
45
|
+
"tests": [
|
|
46
|
+
"node -c src/create-quiver/index.js",
|
|
47
|
+
"node -c src/create-quiver/lib/handoff.js",
|
|
48
|
+
"node bin/create-quiver.js check-handoff /tmp/quiver-valid-handoff/specs/sample-spec/HANDOFF.md",
|
|
49
|
+
"node bin/create-quiver.js check-handoff /tmp/quiver-invalid-handoff/specs/sample-spec/HANDOFF.md",
|
|
50
|
+
"git diff --check"
|
|
51
|
+
],
|
|
52
|
+
"documentation": [
|
|
53
|
+
"README.md",
|
|
54
|
+
"README_FOR_AI.md"
|
|
55
|
+
],
|
|
56
|
+
"dependencies": [
|
|
57
|
+
"slice-01-handoff-template-and-contract"
|
|
58
|
+
],
|
|
59
|
+
"assumptions": [
|
|
60
|
+
"Structure validation is enough for the first version; semantic quality can stay a human review concern",
|
|
61
|
+
"The validator should enforce canonical placement so the contract stays discoverable"
|
|
62
|
+
],
|
|
63
|
+
"estimated_hours": 3,
|
|
64
|
+
"actual_hours": 2,
|
|
65
|
+
"status": "completed",
|
|
66
|
+
"blocked_reason": null,
|
|
67
|
+
"ready_at": "2026-04-23T00:00:00Z",
|
|
68
|
+
"started_at": "2026-04-23T00:00:00Z",
|
|
69
|
+
"completed_at": "2026-04-23T00:00:00Z"
|
|
70
|
+
}
|
package/specs/quiver-v16-handoff-contract/slices/slice-03-handoff-scaffold-optional/slice.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slice_id": "slice-03-handoff-scaffold-optional",
|
|
3
|
+
"ticket": "QUIVER-03",
|
|
4
|
+
"type": "feature",
|
|
5
|
+
"title": "Handoff Scaffold Optional",
|
|
6
|
+
"objective": "Optionally add a scaffold command for handoffs after the contract and validator already exist.",
|
|
7
|
+
"description": "If the handoff contract proves useful, Quiver can add a convenience command to create `specs/<spec-slug>/HANDOFF.md` from the canonical template. This slice stays intentionally small and must not become a larger orchestration feature.",
|
|
8
|
+
"git": {
|
|
9
|
+
"branch_type": "feature",
|
|
10
|
+
"base_branch": "main",
|
|
11
|
+
"branch_slug": "handoff-scaffold-optional",
|
|
12
|
+
"branch_name": "feature/QUIVER-03-handoff-scaffold-optional"
|
|
13
|
+
},
|
|
14
|
+
"must": [
|
|
15
|
+
"Add `create-quiver new-handoff <spec-slug>`",
|
|
16
|
+
"Generate `specs/<spec-slug>/HANDOFF.md` from `specs/[project-name]/HANDOFF.md.template`",
|
|
17
|
+
"Refuse to overwrite an existing handoff unless a future explicit force flag is added in another spec",
|
|
18
|
+
"Keep the scaffold aligned with the validator contract and required headings",
|
|
19
|
+
"Document the command as optional convenience rather than a mandatory workflow step"
|
|
20
|
+
],
|
|
21
|
+
"not_included": [
|
|
22
|
+
"Force overwrite flags",
|
|
23
|
+
"Automatic creation of handoffs during init, migrate, or doctor",
|
|
24
|
+
"Any new state machine for handoff lifecycle"
|
|
25
|
+
],
|
|
26
|
+
"acceptance": [
|
|
27
|
+
"Running `create-quiver new-handoff sample-spec` creates `specs/sample-spec/HANDOFF.md` in the canonical location",
|
|
28
|
+
"The generated handoff passes `create-quiver check-handoff specs/sample-spec/HANDOFF.md`",
|
|
29
|
+
"Running the command again without deleting the file exits non-zero and preserves the existing handoff",
|
|
30
|
+
"README and AI docs describe the scaffold as optional convenience"
|
|
31
|
+
],
|
|
32
|
+
"files": [
|
|
33
|
+
"src/create-quiver/index.js",
|
|
34
|
+
"src/create-quiver/lib/handoff.js",
|
|
35
|
+
"README.md",
|
|
36
|
+
"README_FOR_AI.md",
|
|
37
|
+
"specs/quiver-v16-handoff-contract/SPEC.md",
|
|
38
|
+
"specs/quiver-v16-handoff-contract/STATUS.md",
|
|
39
|
+
"specs/quiver-v16-handoff-contract/EVIDENCE_REPORT.md",
|
|
40
|
+
"specs/quiver-v16-handoff-contract/slices/slice-03-handoff-scaffold-optional/slice.json"
|
|
41
|
+
],
|
|
42
|
+
"tests": [
|
|
43
|
+
"node -c src/create-quiver/index.js",
|
|
44
|
+
"node -c src/create-quiver/lib/handoff.js",
|
|
45
|
+
"node bin/create-quiver.js new-handoff sample-spec",
|
|
46
|
+
"node bin/create-quiver.js check-handoff specs/sample-spec/HANDOFF.md",
|
|
47
|
+
"git diff --check"
|
|
48
|
+
],
|
|
49
|
+
"documentation": [
|
|
50
|
+
"README.md",
|
|
51
|
+
"README_FOR_AI.md"
|
|
52
|
+
],
|
|
53
|
+
"dependencies": [
|
|
54
|
+
"slice-01-handoff-template-and-contract"
|
|
55
|
+
],
|
|
56
|
+
"assumptions": [
|
|
57
|
+
"The scaffold remains optional and should not be built before the contract is clear",
|
|
58
|
+
"Convenience is valuable only if the generated file stays perfectly aligned with the validator"
|
|
59
|
+
],
|
|
60
|
+
"estimated_hours": 2,
|
|
61
|
+
"actual_hours": 2,
|
|
62
|
+
"status": "completed",
|
|
63
|
+
"blocked_reason": null,
|
|
64
|
+
"ready_at": "2026-04-23T00:00:00Z",
|
|
65
|
+
"started_at": "2026-04-23T00:00:00Z",
|
|
66
|
+
"completed_at": "2026-04-23T00:00:00Z"
|
|
67
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Quiver v0.17 Evidence Report
|
|
2
|
+
|
|
3
|
+
**Spec:** quiver-v17-orchestration-foundation
|
|
4
|
+
**Date:** 2026-04-23
|
|
5
|
+
**Status:** Completed
|
|
6
|
+
|
|
7
|
+
## Summary
|
|
8
|
+
|
|
9
|
+
This spec installs the cross-platform foundation and shared graph library used by every orchestration command in v18–v22. It does not ship a user-facing command. The primary measurable outcome is that the graph library returns the correct topological order and parallel levels for the existing Quiver repo, and that the CI matrix is green on macOS, Linux, and Windows.
|
|
10
|
+
|
|
11
|
+
## Slice Evidence
|
|
12
|
+
|
|
13
|
+
| Slice | Status | Evidence |
|
|
14
|
+
|-------|--------|----------|
|
|
15
|
+
| slice-01 | Completed | CI matrix runs macOS + Linux + Windows; a Windows path guard validates `path.win32` handling and the authoring rules docs are generated |
|
|
16
|
+
| slice-02 | Completed | `src/create-quiver/lib/slice-graph.js` exports the six documented functions; unit tests cover empty repos, heuristic inference, explicit overrides, cross-spec deps, cycle detection, and conflict grouping |
|
|
17
|
+
| slice-03 | Completed | `check-slice` rejects `depends_on: ["nonexistent/slice-99"]`, rejects cycles, and requires `parallel_safe_reason` when `parallel_safe: "never"` |
|
|
18
|
+
|
|
19
|
+
## Required Final Evidence
|
|
20
|
+
|
|
21
|
+
- `.github/workflows/ci.yml` shows `macos-latest`, `ubuntu-latest`, `windows-latest` in the matrix and all three are green
|
|
22
|
+
- `node -e "const g=require('./src/create-quiver/lib/slice-graph'); console.log(g.readAllSlices('.').length)"` returns a non-zero count on all three OS
|
|
23
|
+
- Unit tests for `buildGraph`, `topoSort`, `computeLevels`, and `detectFileConflicts` pass on all three OS
|
|
24
|
+
- `check-slice` output demonstrates the new `depends_on` validation rules
|
|
25
|
+
- `docs/COMMANDS.md` exists with a header table and at least one reserved command row
|
|
26
|
+
- `docs/SUPPORT_MATRIX.md` contains the cross-platform authoring rules section
|
|
27
|
+
|
|
28
|
+
## Validation Checkpoint (Post-Merge)
|
|
29
|
+
|
|
30
|
+
- A dry-run of `readAllSlices` against the Quiver repo returns every existing slice without throwing
|
|
31
|
+
- The maintainer confirms the library is usable before starting v18
|
|
32
|
+
- At least one reviewer on a second machine confirms the CI matrix works locally
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Quiver v0.17 - Orchestration Foundation
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-04-23
|
|
4
|
+
**Status:** Completed
|
|
5
|
+
|
|
6
|
+
Slice numbering resets here: this spec starts at `slice-01` and does not continue any previous spec's numbering.
|
|
7
|
+
|
|
8
|
+
## Objective
|
|
9
|
+
|
|
10
|
+
Lay the cross-platform foundation and shared graph library required by every subsequent orchestration command (`plan`, `graph`, `next`, `status`, `estimate`, `lint-spec`, `cost`, `diff-pack`, `replay`, `archive`, `blame-slice`). No user-facing command is shipped here; this spec exists to make the following specs cheap to build and safe on macOS, Linux, and Windows.
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
The orchestration roadmap (v18–v22) introduces ~13 new commands that all need to read slices, infer dependencies, compute execution levels, and detect file conflicts. Without a shared library those commands re-implement the same logic three or four times. Without a verified cross-platform CI matrix, any new command is fragile on Windows. This spec consolidates both concerns into one foundation.
|
|
15
|
+
|
|
16
|
+
## Scope
|
|
17
|
+
|
|
18
|
+
### Included
|
|
19
|
+
|
|
20
|
+
- Verify or introduce a CI matrix that runs macOS, Linux, and Windows for all Quiver tests
|
|
21
|
+
- Create `src/create-quiver/lib/slice-graph.js` with a stable API: `readAllSlices`, `inferDependencies`, `buildGraph`, `topoSort`, `computeLevels`, `detectFileConflicts`
|
|
22
|
+
- Support optional `depends_on` and `parallel_safe` fields in `slice.json`, with heuristic inference as the fallback
|
|
23
|
+
- Extend `check-slice` to validate `depends_on` when declared (existence, no cycles, reason when `parallel_safe: "never"`)
|
|
24
|
+
- Create `docs/COMMANDS.md` as the canonical command reference table, initially empty beyond the plan row
|
|
25
|
+
- Publish cross-platform authoring rules in `docs/SUPPORT_MATRIX.md` for all subsequent commands
|
|
26
|
+
|
|
27
|
+
### Excluded
|
|
28
|
+
|
|
29
|
+
- Any user-facing orchestration command (deferred to v18)
|
|
30
|
+
- A full slice JSON Schema file (only the new optional fields are validated)
|
|
31
|
+
- Parallelism enforcement or locking (library returns groups; commands decide)
|
|
32
|
+
- Any change to existing slice contents beyond optional new fields
|
|
33
|
+
|
|
34
|
+
## Cross-Platform Authoring Rules
|
|
35
|
+
|
|
36
|
+
Every subsequent orchestration command must follow these rules, enforced by code review and CI:
|
|
37
|
+
|
|
38
|
+
- No shell invocations for logic — Node.js `fs`, `path`, and `child_process` with `shell: false`
|
|
39
|
+
- Paths use `path.join` and `path.sep`; output may normalize to `/` for human readability
|
|
40
|
+
- Write files with `\n`; read tolerating `\r\n`
|
|
41
|
+
- `--json` is the primary contract; human output is cortesy and may vary
|
|
42
|
+
- Colors only when `process.stdout.isTTY && !process.env.NO_COLOR`
|
|
43
|
+
- Unicode glyphs only when `process.env.LANG` includes `UTF-8` or the user passes `--unicode`; ASCII fallback otherwise
|
|
44
|
+
- Optional external tools (`gh`, `graphviz`) detected with a cross-platform probe; degrade with a clear message if absent
|
|
45
|
+
|
|
46
|
+
## Graph Library Contract
|
|
47
|
+
|
|
48
|
+
`src/create-quiver/lib/slice-graph.js` exports:
|
|
49
|
+
|
|
50
|
+
```js
|
|
51
|
+
readAllSlices(rootDir) // → Slice[] (from specs/*/slices/*/slice.json)
|
|
52
|
+
inferDependencies(slices) // → Slice[] with implicit depends_on[]
|
|
53
|
+
buildGraph(slices) // → { nodes, edges, cycles: [] }
|
|
54
|
+
topoSort(graph) // → Slice[] (throws on cycle)
|
|
55
|
+
computeLevels(graph) // → Slice[][] (each level is a parallel lot)
|
|
56
|
+
detectFileConflicts(slicesInLevel)// → ConflictGroup[]
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Dependency inference rule: within a single spec, `slice-NN` implicitly depends on all lower-numbered slices in the same spec that share at least one entry in `files[]`. An explicit `depends_on` array in `slice.json` overrides the heuristic.
|
|
60
|
+
|
|
61
|
+
## Slices
|
|
62
|
+
|
|
63
|
+
| Slice | Title | Status | Spec |
|
|
64
|
+
|-------|-------|--------|------|
|
|
65
|
+
| 01 | Cross-Platform CI Matrix Verified | Completed | [slice-01](./slices/slice-01-ci-matrix-verified/slice.json) |
|
|
66
|
+
| 02 | Slice Graph Library | Completed | [slice-02](./slices/slice-02-slice-graph-library/slice.json) |
|
|
67
|
+
| 03 | Optional `depends_on` Validation | Completed | [slice-03](./slices/slice-03-depends-on-validation/slice.json) |
|
|
68
|
+
|
|
69
|
+
## Definition of Done
|
|
70
|
+
|
|
71
|
+
- `.github/workflows/ci.yml` runs tests on `macos-latest`, `ubuntu-latest`, and `windows-latest` and is green on all three
|
|
72
|
+
- `src/create-quiver/lib/slice-graph.js` exists with the six documented exports and tests for each
|
|
73
|
+
- `check-slice` rejects `depends_on` entries pointing at nonexistent slices and cycles, and requires `parallel_safe_reason` when `parallel_safe: "never"` is declared
|
|
74
|
+
- `docs/COMMANDS.md` exists with a header table and a row reserved for the plan command
|
|
75
|
+
- `docs/SUPPORT_MATRIX.md` documents the cross-platform authoring rules above
|
|
76
|
+
|
|
77
|
+
## Validation Checkpoint
|
|
78
|
+
|
|
79
|
+
Before v18 is started, the graph library must pass its own unit tests on all three OS targets, and a dry-run of `readAllSlices(repoRoot)` against the current Quiver repo must return every existing slice without throwing.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Quiver v0.17 Spec Status
|
|
2
|
+
|
|
3
|
+
**Spec:** quiver-v17-orchestration-foundation
|
|
4
|
+
**Last updated:** 2026-04-23
|
|
5
|
+
|
|
6
|
+
Slice numbering is local to this spec. The first slice is `slice-01`.
|
|
7
|
+
|
|
8
|
+
## Status
|
|
9
|
+
|
|
10
|
+
| Slice | Title | Status | PR | Estimated hours | Actual hours |
|
|
11
|
+
|-------|-------|--------|----|-----------------|--------------|
|
|
12
|
+
| slice-01 | Cross-Platform CI Matrix Verified | Completed | https://github.com/FabriJuncal/quiver/pull/46 | 4 | 4 |
|
|
13
|
+
| slice-02 | Slice Graph Library | Completed | https://github.com/FabriJuncal/quiver/pull/46 | 5 | 5 |
|
|
14
|
+
| slice-03 | Optional `depends_on` Validation | Completed | https://github.com/FabriJuncal/quiver/pull/48 | 2 | 2 |
|
|
15
|
+
|
|
16
|
+
## Progress
|
|
17
|
+
|
|
18
|
+
- Completed slices: 3 / 3
|
|
19
|
+
- Estimated hours: 11
|
|
20
|
+
- Actual hours: 11
|
|
21
|
+
|
|
22
|
+
## Blockers
|
|
23
|
+
|
|
24
|
+
| Slice | Blocker | Since | Action needed |
|
|
25
|
+
|-------|---------|-------|---------------|
|
|
26
|
+
| - | - | - | - |
|
|
27
|
+
|
|
28
|
+
## Dependencies
|
|
29
|
+
|
|
30
|
+
- slice-02 depends on slice-01 (library assumes CI will validate it cross-platform)
|
|
31
|
+
- slice-03 depends on slice-02 (validation uses the library's graph functions)
|