syntaur 0.16.2 → 0.17.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/dashboard/dist/assets/{_basePickBy-DTuHiZCP.js → _basePickBy-Dek5-ACb.js} +1 -1
- package/dashboard/dist/assets/{_baseUniq-BjbISCNN.js → _baseUniq-BeLddDKU.js} +1 -1
- package/dashboard/dist/assets/{arc-D9mCa8If.js → arc-kotdj4Uh.js} +1 -1
- package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-CLWheiZu.js → architectureDiagram-2XIMDMQ5-BaqFXQ-q.js} +1 -1
- package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-BBxrVTWB.js → blockDiagram-WCTKOSBZ-BSyGne6h.js} +1 -1
- package/dashboard/dist/assets/{c4Diagram-IC4MRINW-DnhDZ2W3.js → c4Diagram-IC4MRINW-iYjZFKOW.js} +1 -1
- package/dashboard/dist/assets/channel-eXdj7ayV.js +1 -0
- package/dashboard/dist/assets/{chunk-4BX2VUAB-DeAfVeDa.js → chunk-4BX2VUAB-DvY9Y7jB.js} +1 -1
- package/dashboard/dist/assets/{chunk-55IACEB6-cKEeGDNI.js → chunk-55IACEB6-2vCDm2cJ.js} +1 -1
- package/dashboard/dist/assets/{chunk-FMBD7UC4-7RuZ6HEq.js → chunk-FMBD7UC4-BVPaoRtV.js} +1 -1
- package/dashboard/dist/assets/{chunk-JSJVCQXG-B5dwG0bv.js → chunk-JSJVCQXG-B9uJpMzd.js} +1 -1
- package/dashboard/dist/assets/{chunk-KX2RTZJC-DeyQYDVj.js → chunk-KX2RTZJC-CHcjjGaq.js} +1 -1
- package/dashboard/dist/assets/{chunk-NQ4KR5QH-NYo4hSqA.js → chunk-NQ4KR5QH-B8n19pSs.js} +1 -1
- package/dashboard/dist/assets/{chunk-QZHKN3VN-CtJFICF8.js → chunk-QZHKN3VN-CF9ZYFGK.js} +1 -1
- package/dashboard/dist/assets/{chunk-WL4C6EOR-DZ3WYdab.js → chunk-WL4C6EOR-mY_1Vmdf.js} +1 -1
- package/dashboard/dist/assets/classDiagram-VBA2DB6C-B-bBQACr.js +1 -0
- package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-B-bBQACr.js +1 -0
- package/dashboard/dist/assets/clone-CL04pv9J.js +1 -0
- package/dashboard/dist/assets/{cose-bilkent-S5V4N54A-DaYOsf-M.js → cose-bilkent-S5V4N54A-DOYoG3gB.js} +1 -1
- package/dashboard/dist/assets/{dagre-KLK3FWXG-DzLc7ykF.js → dagre-KLK3FWXG-CZFrp-Yq.js} +1 -1
- package/dashboard/dist/assets/{diagram-E7M64L7V-kpjEdOqb.js → diagram-E7M64L7V-F3rF5YwM.js} +1 -1
- package/dashboard/dist/assets/{diagram-IFDJBPK2-D3EHoh6j.js → diagram-IFDJBPK2-BynWv-Vo.js} +1 -1
- package/dashboard/dist/assets/{diagram-P4PSJMXO-Cp6Un2ys.js → diagram-P4PSJMXO-NIyzhm_M.js} +1 -1
- package/dashboard/dist/assets/{erDiagram-INFDFZHY-DDjOUPWk.js → erDiagram-INFDFZHY-Ca9NbihE.js} +1 -1
- package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-CfO51xge.js → flowDiagram-PKNHOUZH-YhS0MOu4.js} +1 -1
- package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-BDzAtkcp.js → ganttDiagram-A5KZAMGK-G7P3qq_2.js} +1 -1
- package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-JPMFN2zF.js → gitGraphDiagram-K3NZZRJ6-BJAK7M7E.js} +1 -1
- package/dashboard/dist/assets/{graph-DXDryilu.js → graph-11geMy3f.js} +1 -1
- package/dashboard/dist/assets/index--qwybK3W.js +535 -0
- package/dashboard/dist/assets/index-DwrhlK8r.css +1 -0
- package/dashboard/dist/assets/{infoDiagram-LFFYTUFH-CYi5kkvz.js → infoDiagram-LFFYTUFH-COcQYcLf.js} +1 -1
- package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-DQl_IUe8.js → ishikawaDiagram-PHBUUO56-B7Jjyw8J.js} +1 -1
- package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-BXXGPcrS.js → journeyDiagram-4ABVD52K--snU-QAX.js} +1 -1
- package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-BqJestUY.js → kanban-definition-K7BYSVSG-BucLoc89.js} +1 -1
- package/dashboard/dist/assets/{layout-D5VdYmWn.js → layout-Bcgxdz8A.js} +1 -1
- package/dashboard/dist/assets/{linear-dZA_O_GN.js → linear-CRF8xwvk.js} +1 -1
- package/dashboard/dist/assets/{mermaid.core-B0Ixd1yP.js → mermaid.core-D5JD5uYg.js} +4 -4
- package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-CSJYdSMG.js → mindmap-definition-YRQLILUH-BqGcTcbk.js} +1 -1
- package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-DmYrRZHN.js → pieDiagram-SKSYHLDU-CnQ2EkyX.js} +1 -1
- package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-La3ce5kE.js → quadrantDiagram-337W2JSQ-CKCfmTRc.js} +1 -1
- package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-DPitIZQl.js → requirementDiagram-Z7DCOOCP-B9J4bvUK.js} +1 -1
- package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-CAmCqGkr.js → sankeyDiagram-WA2Y5GQK-CMSzI5rg.js} +1 -1
- package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-6lEzNTWG.js → sequenceDiagram-2WXFIKYE-BFQDtxd0.js} +1 -1
- package/dashboard/dist/assets/{stateDiagram-RAJIS63D-DyGKCS2C.js → stateDiagram-RAJIS63D-DgWYKT02.js} +1 -1
- package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-Nmwft4cR.js +1 -0
- package/dashboard/dist/assets/{timeline-definition-YZTLITO2-D9RxQE3j.js → timeline-definition-YZTLITO2-jANu0e7M.js} +1 -1
- package/dashboard/dist/assets/{treemap-KZPCXAKY-TuXbGNN4.js → treemap-KZPCXAKY-BFjWMkyM.js} +1 -1
- package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-Bly5knr-.js → vennDiagram-LZ73GAT5-DGwrAJYj.js} +1 -1
- package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-CA-5z7-4.js → xychartDiagram-JWTSCODW-BLCPfoFM.js} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/dist/dashboard/server.js +2220 -479
- package/dist/dashboard/server.js.map +1 -1
- package/dist/db/leases-db.js.map +1 -1
- package/dist/index.js +4499 -1127
- package/dist/index.js.map +1 -1
- package/dist/launch/index.js +127 -63
- package/dist/launch/index.js.map +1 -1
- package/package.json +1 -1
- package/platforms/claude-code/skills/bundle-worktree/SKILL.md +107 -0
- package/platforms/claude-code/skills/complete-bundle/SKILL.md +113 -0
- package/platforms/claude-code/skills/grab-bundle/SKILL.md +111 -0
- package/platforms/claude-code/skills/plan-bundle/SKILL.md +88 -0
- package/platforms/codex/skills/bundle-worktree/SKILL.md +107 -0
- package/platforms/codex/skills/complete-bundle/SKILL.md +113 -0
- package/platforms/codex/skills/grab-bundle/SKILL.md +111 -0
- package/platforms/codex/skills/plan-bundle/SKILL.md +88 -0
- package/skills/bundle-worktree/SKILL.md +107 -0
- package/skills/complete-bundle/SKILL.md +113 -0
- package/skills/grab-bundle/SKILL.md +111 -0
- package/skills/plan-bundle/SKILL.md +88 -0
- package/dashboard/dist/assets/channel-CN5VmjNa.js +0 -1
- package/dashboard/dist/assets/classDiagram-VBA2DB6C-CqLb9GuU.js +0 -1
- package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-CqLb9GuU.js +0 -1
- package/dashboard/dist/assets/clone-DwvrjCQs.js +0 -1
- package/dashboard/dist/assets/index-D7UtkCYM.js +0 -515
- package/dashboard/dist/assets/index-DTXSWSzH.css +0 -1
- package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-BOmRICoY.js +0 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: grab-bundle
|
|
3
|
+
description: >-
|
|
4
|
+
Claim a Syntaur todo bundle (a lightweight container grouping 2+
|
|
5
|
+
scope-mate todos under a shared plan and worktree, with no full
|
|
6
|
+
assignment overhead). Use when the user wants to start working on a
|
|
7
|
+
todo bundle: "claim bundle b:xxxx", "work on the auth-cleanup bundle",
|
|
8
|
+
or after creating one via `syntaur todo bundle new`.
|
|
9
|
+
license: MIT
|
|
10
|
+
metadata:
|
|
11
|
+
author: prong-horn
|
|
12
|
+
version: "1.0.0"
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Grab Bundle
|
|
16
|
+
|
|
17
|
+
Claim a Syntaur todo bundle and set up the current workspace. The bundle
|
|
18
|
+
contract is lighter than an assignment — no lifecycle transitions, no
|
|
19
|
+
progress.md, no handoff/decision-record/acceptance criteria. Member todos
|
|
20
|
+
keep their own `start` / `complete` lifecycle; the bundle just owns the
|
|
21
|
+
shared `planDir`, `branch`, `worktreePath`, and `repository`.
|
|
22
|
+
|
|
23
|
+
## Input
|
|
24
|
+
|
|
25
|
+
One or two positional arguments:
|
|
26
|
+
|
|
27
|
+
- A bundle id (with or without `b:` prefix) — required if multiple bundles
|
|
28
|
+
exist in the current scope.
|
|
29
|
+
- Scope flags: `--workspace <slug>`, `--project <slug>`, or `--global`
|
|
30
|
+
(default).
|
|
31
|
+
|
|
32
|
+
If no id is given, run `syntaur todo bundle list <scope flags>` and ask
|
|
33
|
+
the user to pick.
|
|
34
|
+
|
|
35
|
+
## Pre-flight check
|
|
36
|
+
|
|
37
|
+
Read `.syntaur/context.json` in the current working directory.
|
|
38
|
+
|
|
39
|
+
- If it already contains assignment fields (`projectSlug`/`assignmentSlug`/
|
|
40
|
+
`assignmentDir`), warn the user: "You already have an active assignment.
|
|
41
|
+
Grabbing a bundle will replace this context. Proceed?" — stop if no.
|
|
42
|
+
- If it already contains different bundle fields (`bundleId` set to a
|
|
43
|
+
different id), warn: "Context is bound to bundle b:<old>. Switch to b:<new>?"
|
|
44
|
+
— stop if no.
|
|
45
|
+
- If it has only `sessionId` (platform SessionStart hook seeded it), proceed
|
|
46
|
+
and merge bundle fields on top.
|
|
47
|
+
|
|
48
|
+
## Step 1: Load the bundle
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
syntaur todo bundle show <bundle-id> <scope flags>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Note its scope, member todos, slug, planDir (if any), branch (if any),
|
|
55
|
+
worktreePath (if any), and repository.
|
|
56
|
+
|
|
57
|
+
## Step 2: Read the bundle's plan (if present)
|
|
58
|
+
|
|
59
|
+
If `planDir` is set, read `<planDir>/plan.md` (and any `plan-v<N>.md` —
|
|
60
|
+
prefer the highest version). This is the shared implementation plan for
|
|
61
|
+
the whole bundle.
|
|
62
|
+
|
|
63
|
+
## Step 3: Read each member todo
|
|
64
|
+
|
|
65
|
+
For each `[t:<id>]` listed in the bundle, run
|
|
66
|
+
`syntaur todo list --status open` (and `--status in_progress` and
|
|
67
|
+
`--status blocked`) under the same scope, OR read the checklist markdown
|
|
68
|
+
directly. Note the description, current status, and any session
|
|
69
|
+
fingerprint on `in_progress` members.
|
|
70
|
+
|
|
71
|
+
## Step 4: Write bundle context.json
|
|
72
|
+
|
|
73
|
+
Merge bundle fields into `<workspaceRoot>/.syntaur/context.json` — never
|
|
74
|
+
overwrite. Required fields:
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
{
|
|
78
|
+
"bundleId": "<bundle.id>",
|
|
79
|
+
"bundleSlug": "<bundle.slug or null>",
|
|
80
|
+
"bundleScope": "<workspace|project|global>",
|
|
81
|
+
"bundleScopeId": "<scopeId>",
|
|
82
|
+
"todoIds": ["<id1>", "<id2>", "..."],
|
|
83
|
+
"planDir": "<planDir or null>",
|
|
84
|
+
"branch": "<branch or null>",
|
|
85
|
+
"worktreePath": "<worktreePath or null>",
|
|
86
|
+
"repository": "<repository or null>",
|
|
87
|
+
"boundAt": "<ISO 8601>"
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
NO assignment fields. The `resolveAssignmentTarget` discriminator at
|
|
92
|
+
`src/utils/assignment-target.ts` will throw a clean error if any assignment
|
|
93
|
+
flow misfires inside a bundle worktree.
|
|
94
|
+
|
|
95
|
+
If the bundle already has a worktreePath set and the user is NOT inside it,
|
|
96
|
+
suggest `cd <worktreePath>` before continuing.
|
|
97
|
+
|
|
98
|
+
## Step 5: Report to user
|
|
99
|
+
|
|
100
|
+
Summarize:
|
|
101
|
+
|
|
102
|
+
- Bundle id (b:xxxx) + slug.
|
|
103
|
+
- Scope + scopeId.
|
|
104
|
+
- Number of members + their descriptions + statuses.
|
|
105
|
+
- Plan file path (if any).
|
|
106
|
+
- Branch + worktreePath (if any).
|
|
107
|
+
- Repository (if any).
|
|
108
|
+
- Suggested next step:
|
|
109
|
+
- `/plan-bundle` if no plan exists yet
|
|
110
|
+
- `/bundle-worktree --branch <name>` if no worktree exists yet
|
|
111
|
+
- `/complete-bundle` if every member is done
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plan-bundle
|
|
3
|
+
description: >-
|
|
4
|
+
Draft a shared implementation plan for the active Syntaur todo bundle.
|
|
5
|
+
Use when the user wants to plan a bundle, write or extend its plan.md,
|
|
6
|
+
or design an approach that covers every member todo together.
|
|
7
|
+
license: MIT
|
|
8
|
+
metadata:
|
|
9
|
+
author: prong-horn
|
|
10
|
+
version: "1.0.0"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Plan Bundle
|
|
14
|
+
|
|
15
|
+
Create or extend the bundle's shared plan file. Bundles are non-lifecycle-
|
|
16
|
+
bearing containers — their "acceptance" is "every member todo is completed."
|
|
17
|
+
The plan must surface this explicitly: there are no acceptance criteria of
|
|
18
|
+
the bundle's own to track, only the member todos.
|
|
19
|
+
|
|
20
|
+
## Step 1: Load context
|
|
21
|
+
|
|
22
|
+
Read `.syntaur/context.json` from the current working directory. It must
|
|
23
|
+
contain `bundleId` (a bundle context). If it instead has assignment fields,
|
|
24
|
+
stop and tell the user: "Active context is an assignment, not a bundle.
|
|
25
|
+
Use `/plan-assignment` instead, or `/grab-bundle <id>` to switch."
|
|
26
|
+
|
|
27
|
+
Extract `bundleId`, `bundleScope`, `bundleScopeId`, `todoIds`, `planDir`.
|
|
28
|
+
|
|
29
|
+
## Step 2: Read each member todo
|
|
30
|
+
|
|
31
|
+
For each `t:<id>` in `todoIds`, read the description from the bundle's
|
|
32
|
+
scope checklist:
|
|
33
|
+
|
|
34
|
+
- workspace scope → `~/.syntaur/todos/<scopeId>.md`
|
|
35
|
+
- global scope → `~/.syntaur/todos/_global.md`
|
|
36
|
+
- project scope → `~/.syntaur/projects/<scopeId>/todos/<scopeId>.md`
|
|
37
|
+
|
|
38
|
+
Note each member's current status. Bundled members can be `open`,
|
|
39
|
+
`in_progress`, or `blocked` — a `completed` member should not be in a
|
|
40
|
+
live bundle (run `syntaur doctor` if you see one).
|
|
41
|
+
|
|
42
|
+
## Step 3: Create or open the plan file
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
syntaur todo bundle plan <bundle-id> <scope flags>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
This prints the path to the new (or next-version) plan file. First call
|
|
49
|
+
creates `plan.md`; subsequent calls create `plan-v2.md`, `plan-v3.md`, etc.
|
|
50
|
+
The stub frontmatter includes `bundle:`, `todos:`, `scope:`, `status: draft`.
|
|
51
|
+
A `## Members` section listing each member is pre-populated.
|
|
52
|
+
|
|
53
|
+
## Step 4: Write the plan body
|
|
54
|
+
|
|
55
|
+
Replace the body of the new plan file with:
|
|
56
|
+
|
|
57
|
+
1. **Overview** — one paragraph: why these todos are bundled together (a
|
|
58
|
+
shared schema migration, a feature with split FE/BE work, a coordinated
|
|
59
|
+
refactor, etc.).
|
|
60
|
+
2. **Tasks** — numbered list. For each task: description, files to
|
|
61
|
+
create/modify, dependencies on other tasks, complexity estimate.
|
|
62
|
+
3. **Member Mapping** — for each `t:<id>` member, which numbered task(s)
|
|
63
|
+
complete it. This is the bundle equivalent of an assignment's "Acceptance
|
|
64
|
+
Criteria Mapping" — it tells the implementer "after task N is done,
|
|
65
|
+
member t:<id> can be marked completed."
|
|
66
|
+
4. **Risks and Open Questions**.
|
|
67
|
+
5. **Testing Strategy**.
|
|
68
|
+
|
|
69
|
+
Bump `updated:` in the plan frontmatter and flip `status: draft` → `status: in_progress`.
|
|
70
|
+
|
|
71
|
+
## Step 5: Mirror skills (if you also edited the skill file)
|
|
72
|
+
|
|
73
|
+
If this session also added or edited any `skills/<name>/SKILL.md`, run:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
npm run mirror-skills
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
This is per `AGENTS.md` — propagates to `platforms/<kind>/skills/`.
|
|
80
|
+
|
|
81
|
+
## Step 6: Report to user
|
|
82
|
+
|
|
83
|
+
- Plan file path (absolute).
|
|
84
|
+
- Task count.
|
|
85
|
+
- Open questions / risks worth flagging up front.
|
|
86
|
+
- Suggested next step:
|
|
87
|
+
- `/bundle-worktree --branch <name>` to spin up the shared worktree
|
|
88
|
+
- Otherwise start implementing the first task in-place
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bundle-worktree
|
|
3
|
+
description: >-
|
|
4
|
+
Create a git worktree for a Syntaur todo bundle and bind it to the
|
|
5
|
+
current agent session. Use when the user wants to "make a worktree for
|
|
6
|
+
this bundle", "spin up an isolated workspace for bundle b:xxxx", or set
|
|
7
|
+
up parallel work on a different bundle.
|
|
8
|
+
license: MIT
|
|
9
|
+
metadata:
|
|
10
|
+
author: prong-horn
|
|
11
|
+
version: "1.0.0"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Bundle Worktree
|
|
15
|
+
|
|
16
|
+
Atomic worktree-and-bind for a Syntaur todo bundle. Unlike the assignment
|
|
17
|
+
equivalent (`/syntaur-worktree`), bundles have no lifecycle to transition
|
|
18
|
+
— this skill only creates the worktree, persists the workspace on the
|
|
19
|
+
bundle + every member, and writes a bundle-shaped `.syntaur/context.json`
|
|
20
|
+
inside the new worktree.
|
|
21
|
+
|
|
22
|
+
## When NOT to use this skill
|
|
23
|
+
|
|
24
|
+
- The bundle already has a `worktreePath` set — `syntaur todo bundle show`
|
|
25
|
+
will print it; use it instead. The CLI will refuse a second worktree.
|
|
26
|
+
- You want a worktree for an assignment, not a bundle — use
|
|
27
|
+
`/syntaur-worktree` instead.
|
|
28
|
+
|
|
29
|
+
## Step 1: Resolve inputs
|
|
30
|
+
|
|
31
|
+
Required:
|
|
32
|
+
|
|
33
|
+
- `--branch <name>` — the new branch name (also the worktree dir name).
|
|
34
|
+
|
|
35
|
+
Optional (with sensible defaults):
|
|
36
|
+
|
|
37
|
+
- `--repository <path>` — defaults to the current working directory.
|
|
38
|
+
- `--parent-branch <name>` — defaults to `main`.
|
|
39
|
+
- `--worktree-path <path>` — defaults to `<repository>/.worktrees/<branch>`.
|
|
40
|
+
- A bundle id positional, OR scope flags + the active context's `bundleId`.
|
|
41
|
+
|
|
42
|
+
The computed worktree path is **always**
|
|
43
|
+
`<repository>/.worktrees/<branch>` (never `.claude/worktrees`, never
|
|
44
|
+
`~/.syntaur/worktrees`). Repo-local convention.
|
|
45
|
+
|
|
46
|
+
## Step 2: Pre-flight
|
|
47
|
+
|
|
48
|
+
- Confirm `.syntaur/context.json` is a bundle context (has `bundleId`,
|
|
49
|
+
no assignment fields). If it's an assignment context, stop and tell the
|
|
50
|
+
user to `/grab-bundle <id>` first.
|
|
51
|
+
- Confirm `<repository>/.git` exists.
|
|
52
|
+
- Confirm the branch does NOT already exist. If it does, the CLI will
|
|
53
|
+
surface a `GitWorktreeError` — surface that verbatim.
|
|
54
|
+
- Confirm the bundle's existing `worktreePath` is null. The CLI rejects a
|
|
55
|
+
second worktree.
|
|
56
|
+
|
|
57
|
+
## Step 3: Create worktree + bind
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
syntaur todo bundle worktree <bundle-id> \
|
|
61
|
+
--branch <branch> \
|
|
62
|
+
--repository <repository> \
|
|
63
|
+
--parent-branch <parent-branch> \
|
|
64
|
+
<scope flags>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
The CLI handles the entire transactional flow via
|
|
68
|
+
`createWorktreeForBundle` in `src/utils/git-worktree.ts`. On any failure
|
|
69
|
+
between `git worktree add` and the persistence writes, the worktree and
|
|
70
|
+
branch are removed and the error is tagged `'bundle storage'`.
|
|
71
|
+
|
|
72
|
+
## Step 4: cd into the new worktree
|
|
73
|
+
|
|
74
|
+
After the CLI prints `Created worktree at <path>`, `cd` into that path.
|
|
75
|
+
The bundle context.json was already written inside it, so a new session
|
|
76
|
+
started from that directory will read bundle fields automatically.
|
|
77
|
+
|
|
78
|
+
## Step 5: Confirm context
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
cat .syntaur/context.json
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
The JSON should contain `bundleId`, `bundleScope`, `bundleScopeId`,
|
|
85
|
+
`todoIds`, `branch`, `worktreePath`, `repository`, `boundAt` — and NO
|
|
86
|
+
`assignmentDir` / `assignmentSlug` / `projectSlug`. If you see assignment
|
|
87
|
+
fields, stop — something is wrong; the CLI should never emit a mixed
|
|
88
|
+
context. Report the issue.
|
|
89
|
+
|
|
90
|
+
## Step 6: Report to user
|
|
91
|
+
|
|
92
|
+
- New worktree path.
|
|
93
|
+
- Branch + parent branch.
|
|
94
|
+
- Bundle id + member count.
|
|
95
|
+
- Repository absolute path.
|
|
96
|
+
- Reminder to `cd` into the new worktree (if the parent shell is not
|
|
97
|
+
already there).
|
|
98
|
+
- Note that subsequent agent sessions opened in this directory will read
|
|
99
|
+
the bundle fields automatically.
|
|
100
|
+
|
|
101
|
+
## Step 7: Mirror skills (if you also edited the skill file)
|
|
102
|
+
|
|
103
|
+
If this session also touched `skills/<name>/SKILL.md`, run:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
npm run mirror-skills
|
|
107
|
+
```
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: complete-bundle
|
|
3
|
+
description: >-
|
|
4
|
+
Bulk-complete every member todo of a Syntaur todo bundle. Use when the
|
|
5
|
+
user wants to "finish this bundle", "close out bundle b:xxxx", or mark
|
|
6
|
+
the whole bundle done after every implementation task is verified.
|
|
7
|
+
license: MIT
|
|
8
|
+
metadata:
|
|
9
|
+
author: prong-horn
|
|
10
|
+
version: "1.0.0"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Complete Bundle
|
|
14
|
+
|
|
15
|
+
Bulk-complete every open / in-progress / blocked member todo of the
|
|
16
|
+
current Syntaur bundle. Bundles have no lifecycle to transition — this
|
|
17
|
+
skill simply flips each member todo to `completed`, writes a log entry
|
|
18
|
+
per newly-completed member, and (optionally) appends a shared summary
|
|
19
|
+
to the bundle's plan.
|
|
20
|
+
|
|
21
|
+
## When NOT to use this skill
|
|
22
|
+
|
|
23
|
+
- The bundle has unverified work. Read each member's description and
|
|
24
|
+
confirm it is actually done in the codebase BEFORE running this skill.
|
|
25
|
+
Once a todo is `completed`, the log entry is permanent.
|
|
26
|
+
- A member belongs to an assignment via `linkedAssignmentId`. The
|
|
27
|
+
assignment's own lifecycle (`/complete-assignment`) is the authoritative
|
|
28
|
+
closer; let it auto-complete the todo via the existing linked-todos
|
|
29
|
+
hook (`src/lifecycle/linked-todos.ts`).
|
|
30
|
+
|
|
31
|
+
## Step 1: Load context
|
|
32
|
+
|
|
33
|
+
Read `.syntaur/context.json`. It must contain `bundleId`. Extract that and
|
|
34
|
+
the scope (`bundleScope` + `bundleScopeId`).
|
|
35
|
+
|
|
36
|
+
## Step 2: Verify every member is done
|
|
37
|
+
|
|
38
|
+
For each `t:<id>` in `todoIds`, read the description and confirm in the
|
|
39
|
+
codebase that the work is complete:
|
|
40
|
+
|
|
41
|
+
- Files exist / were modified as the plan described.
|
|
42
|
+
- Tests pass.
|
|
43
|
+
- No `// TODO(bundle):` markers remain in the modified files for that
|
|
44
|
+
member.
|
|
45
|
+
|
|
46
|
+
If any member is not done, list it for the user and ask whether to
|
|
47
|
+
proceed anyway (default: don't). If the user says yes, note in the shared
|
|
48
|
+
summary that member `t:<id>` was bulk-completed despite incomplete
|
|
49
|
+
verification.
|
|
50
|
+
|
|
51
|
+
## Step 3: Append a completion summary to the plan (optional but recommended)
|
|
52
|
+
|
|
53
|
+
If the bundle has a `planDir`, open the latest `plan*.md` and append at
|
|
54
|
+
the bottom:
|
|
55
|
+
|
|
56
|
+
```markdown
|
|
57
|
+
## <ISO 8601 timestamp> — Completion
|
|
58
|
+
|
|
59
|
+
<One paragraph summarizing what was implemented, which tests pass, and any
|
|
60
|
+
deferred scope. Reference each member by t:<id> if behavior differed.>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Step 4: Run the CLI
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
syntaur todo bundle complete <bundle-id> \
|
|
67
|
+
[--summary "<shared one-line summary>"] \
|
|
68
|
+
<scope flags>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
The CLI flips every non-completed member to `completed`, clears its
|
|
72
|
+
`session`, writes one log entry per newly-completed member, and bumps the
|
|
73
|
+
bundle's `updatedAt`. Already-completed members are skipped silently.
|
|
74
|
+
|
|
75
|
+
## Step 5: Confirm derived status
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
syntaur todo bundle show <bundle-id> <scope flags>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The `Status:` line should now read `completed (N/N done)`. If it reads
|
|
82
|
+
`mixed`, some members were not in the expected state — surface to the user.
|
|
83
|
+
|
|
84
|
+
## Step 6: Decide bundle disposition
|
|
85
|
+
|
|
86
|
+
The CLI leaves the bundle record intact after `complete` for historical
|
|
87
|
+
reference. The user has two options:
|
|
88
|
+
|
|
89
|
+
- Leave the bundle intact (default). `bundle list` will keep showing it
|
|
90
|
+
with `completed` derived status. Plan + worktree remain on disk.
|
|
91
|
+
- Dissolve via `syntaur todo bundle dissolve <bundle-id>` — clears each
|
|
92
|
+
member's `bundleId` back to `null` and removes the bundle from
|
|
93
|
+
`bundles/index.md`. Member status / planDir / branch / worktreePath are
|
|
94
|
+
preserved.
|
|
95
|
+
|
|
96
|
+
Recommend leaving it intact unless the user explicitly wants to recycle
|
|
97
|
+
the worktree / branch for unrelated work.
|
|
98
|
+
|
|
99
|
+
## Step 7: Report to user
|
|
100
|
+
|
|
101
|
+
- Bundle id.
|
|
102
|
+
- Number of newly-completed members vs already-done.
|
|
103
|
+
- Path to the shared summary appendix (if written).
|
|
104
|
+
- Derived status from `bundle show`.
|
|
105
|
+
- Suggested next: continue, dissolve, or grab a different bundle.
|
|
106
|
+
|
|
107
|
+
## Step 8: Mirror skills (if you also edited the skill file)
|
|
108
|
+
|
|
109
|
+
If this session also touched `skills/<name>/SKILL.md`, run:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
npm run mirror-skills
|
|
113
|
+
```
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: grab-bundle
|
|
3
|
+
description: >-
|
|
4
|
+
Claim a Syntaur todo bundle (a lightweight container grouping 2+
|
|
5
|
+
scope-mate todos under a shared plan and worktree, with no full
|
|
6
|
+
assignment overhead). Use when the user wants to start working on a
|
|
7
|
+
todo bundle: "claim bundle b:xxxx", "work on the auth-cleanup bundle",
|
|
8
|
+
or after creating one via `syntaur todo bundle new`.
|
|
9
|
+
license: MIT
|
|
10
|
+
metadata:
|
|
11
|
+
author: prong-horn
|
|
12
|
+
version: "1.0.0"
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Grab Bundle
|
|
16
|
+
|
|
17
|
+
Claim a Syntaur todo bundle and set up the current workspace. The bundle
|
|
18
|
+
contract is lighter than an assignment — no lifecycle transitions, no
|
|
19
|
+
progress.md, no handoff/decision-record/acceptance criteria. Member todos
|
|
20
|
+
keep their own `start` / `complete` lifecycle; the bundle just owns the
|
|
21
|
+
shared `planDir`, `branch`, `worktreePath`, and `repository`.
|
|
22
|
+
|
|
23
|
+
## Input
|
|
24
|
+
|
|
25
|
+
One or two positional arguments:
|
|
26
|
+
|
|
27
|
+
- A bundle id (with or without `b:` prefix) — required if multiple bundles
|
|
28
|
+
exist in the current scope.
|
|
29
|
+
- Scope flags: `--workspace <slug>`, `--project <slug>`, or `--global`
|
|
30
|
+
(default).
|
|
31
|
+
|
|
32
|
+
If no id is given, run `syntaur todo bundle list <scope flags>` and ask
|
|
33
|
+
the user to pick.
|
|
34
|
+
|
|
35
|
+
## Pre-flight check
|
|
36
|
+
|
|
37
|
+
Read `.syntaur/context.json` in the current working directory.
|
|
38
|
+
|
|
39
|
+
- If it already contains assignment fields (`projectSlug`/`assignmentSlug`/
|
|
40
|
+
`assignmentDir`), warn the user: "You already have an active assignment.
|
|
41
|
+
Grabbing a bundle will replace this context. Proceed?" — stop if no.
|
|
42
|
+
- If it already contains different bundle fields (`bundleId` set to a
|
|
43
|
+
different id), warn: "Context is bound to bundle b:<old>. Switch to b:<new>?"
|
|
44
|
+
— stop if no.
|
|
45
|
+
- If it has only `sessionId` (platform SessionStart hook seeded it), proceed
|
|
46
|
+
and merge bundle fields on top.
|
|
47
|
+
|
|
48
|
+
## Step 1: Load the bundle
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
syntaur todo bundle show <bundle-id> <scope flags>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Note its scope, member todos, slug, planDir (if any), branch (if any),
|
|
55
|
+
worktreePath (if any), and repository.
|
|
56
|
+
|
|
57
|
+
## Step 2: Read the bundle's plan (if present)
|
|
58
|
+
|
|
59
|
+
If `planDir` is set, read `<planDir>/plan.md` (and any `plan-v<N>.md` —
|
|
60
|
+
prefer the highest version). This is the shared implementation plan for
|
|
61
|
+
the whole bundle.
|
|
62
|
+
|
|
63
|
+
## Step 3: Read each member todo
|
|
64
|
+
|
|
65
|
+
For each `[t:<id>]` listed in the bundle, run
|
|
66
|
+
`syntaur todo list --status open` (and `--status in_progress` and
|
|
67
|
+
`--status blocked`) under the same scope, OR read the checklist markdown
|
|
68
|
+
directly. Note the description, current status, and any session
|
|
69
|
+
fingerprint on `in_progress` members.
|
|
70
|
+
|
|
71
|
+
## Step 4: Write bundle context.json
|
|
72
|
+
|
|
73
|
+
Merge bundle fields into `<workspaceRoot>/.syntaur/context.json` — never
|
|
74
|
+
overwrite. Required fields:
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
{
|
|
78
|
+
"bundleId": "<bundle.id>",
|
|
79
|
+
"bundleSlug": "<bundle.slug or null>",
|
|
80
|
+
"bundleScope": "<workspace|project|global>",
|
|
81
|
+
"bundleScopeId": "<scopeId>",
|
|
82
|
+
"todoIds": ["<id1>", "<id2>", "..."],
|
|
83
|
+
"planDir": "<planDir or null>",
|
|
84
|
+
"branch": "<branch or null>",
|
|
85
|
+
"worktreePath": "<worktreePath or null>",
|
|
86
|
+
"repository": "<repository or null>",
|
|
87
|
+
"boundAt": "<ISO 8601>"
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
NO assignment fields. The `resolveAssignmentTarget` discriminator at
|
|
92
|
+
`src/utils/assignment-target.ts` will throw a clean error if any assignment
|
|
93
|
+
flow misfires inside a bundle worktree.
|
|
94
|
+
|
|
95
|
+
If the bundle already has a worktreePath set and the user is NOT inside it,
|
|
96
|
+
suggest `cd <worktreePath>` before continuing.
|
|
97
|
+
|
|
98
|
+
## Step 5: Report to user
|
|
99
|
+
|
|
100
|
+
Summarize:
|
|
101
|
+
|
|
102
|
+
- Bundle id (b:xxxx) + slug.
|
|
103
|
+
- Scope + scopeId.
|
|
104
|
+
- Number of members + their descriptions + statuses.
|
|
105
|
+
- Plan file path (if any).
|
|
106
|
+
- Branch + worktreePath (if any).
|
|
107
|
+
- Repository (if any).
|
|
108
|
+
- Suggested next step:
|
|
109
|
+
- `/plan-bundle` if no plan exists yet
|
|
110
|
+
- `/bundle-worktree --branch <name>` if no worktree exists yet
|
|
111
|
+
- `/complete-bundle` if every member is done
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plan-bundle
|
|
3
|
+
description: >-
|
|
4
|
+
Draft a shared implementation plan for the active Syntaur todo bundle.
|
|
5
|
+
Use when the user wants to plan a bundle, write or extend its plan.md,
|
|
6
|
+
or design an approach that covers every member todo together.
|
|
7
|
+
license: MIT
|
|
8
|
+
metadata:
|
|
9
|
+
author: prong-horn
|
|
10
|
+
version: "1.0.0"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Plan Bundle
|
|
14
|
+
|
|
15
|
+
Create or extend the bundle's shared plan file. Bundles are non-lifecycle-
|
|
16
|
+
bearing containers — their "acceptance" is "every member todo is completed."
|
|
17
|
+
The plan must surface this explicitly: there are no acceptance criteria of
|
|
18
|
+
the bundle's own to track, only the member todos.
|
|
19
|
+
|
|
20
|
+
## Step 1: Load context
|
|
21
|
+
|
|
22
|
+
Read `.syntaur/context.json` from the current working directory. It must
|
|
23
|
+
contain `bundleId` (a bundle context). If it instead has assignment fields,
|
|
24
|
+
stop and tell the user: "Active context is an assignment, not a bundle.
|
|
25
|
+
Use `/plan-assignment` instead, or `/grab-bundle <id>` to switch."
|
|
26
|
+
|
|
27
|
+
Extract `bundleId`, `bundleScope`, `bundleScopeId`, `todoIds`, `planDir`.
|
|
28
|
+
|
|
29
|
+
## Step 2: Read each member todo
|
|
30
|
+
|
|
31
|
+
For each `t:<id>` in `todoIds`, read the description from the bundle's
|
|
32
|
+
scope checklist:
|
|
33
|
+
|
|
34
|
+
- workspace scope → `~/.syntaur/todos/<scopeId>.md`
|
|
35
|
+
- global scope → `~/.syntaur/todos/_global.md`
|
|
36
|
+
- project scope → `~/.syntaur/projects/<scopeId>/todos/<scopeId>.md`
|
|
37
|
+
|
|
38
|
+
Note each member's current status. Bundled members can be `open`,
|
|
39
|
+
`in_progress`, or `blocked` — a `completed` member should not be in a
|
|
40
|
+
live bundle (run `syntaur doctor` if you see one).
|
|
41
|
+
|
|
42
|
+
## Step 3: Create or open the plan file
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
syntaur todo bundle plan <bundle-id> <scope flags>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
This prints the path to the new (or next-version) plan file. First call
|
|
49
|
+
creates `plan.md`; subsequent calls create `plan-v2.md`, `plan-v3.md`, etc.
|
|
50
|
+
The stub frontmatter includes `bundle:`, `todos:`, `scope:`, `status: draft`.
|
|
51
|
+
A `## Members` section listing each member is pre-populated.
|
|
52
|
+
|
|
53
|
+
## Step 4: Write the plan body
|
|
54
|
+
|
|
55
|
+
Replace the body of the new plan file with:
|
|
56
|
+
|
|
57
|
+
1. **Overview** — one paragraph: why these todos are bundled together (a
|
|
58
|
+
shared schema migration, a feature with split FE/BE work, a coordinated
|
|
59
|
+
refactor, etc.).
|
|
60
|
+
2. **Tasks** — numbered list. For each task: description, files to
|
|
61
|
+
create/modify, dependencies on other tasks, complexity estimate.
|
|
62
|
+
3. **Member Mapping** — for each `t:<id>` member, which numbered task(s)
|
|
63
|
+
complete it. This is the bundle equivalent of an assignment's "Acceptance
|
|
64
|
+
Criteria Mapping" — it tells the implementer "after task N is done,
|
|
65
|
+
member t:<id> can be marked completed."
|
|
66
|
+
4. **Risks and Open Questions**.
|
|
67
|
+
5. **Testing Strategy**.
|
|
68
|
+
|
|
69
|
+
Bump `updated:` in the plan frontmatter and flip `status: draft` → `status: in_progress`.
|
|
70
|
+
|
|
71
|
+
## Step 5: Mirror skills (if you also edited the skill file)
|
|
72
|
+
|
|
73
|
+
If this session also added or edited any `skills/<name>/SKILL.md`, run:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
npm run mirror-skills
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
This is per `AGENTS.md` — propagates to `platforms/<kind>/skills/`.
|
|
80
|
+
|
|
81
|
+
## Step 6: Report to user
|
|
82
|
+
|
|
83
|
+
- Plan file path (absolute).
|
|
84
|
+
- Task count.
|
|
85
|
+
- Open questions / risks worth flagging up front.
|
|
86
|
+
- Suggested next step:
|
|
87
|
+
- `/bundle-worktree --branch <name>` to spin up the shared worktree
|
|
88
|
+
- Otherwise start implementing the first task in-place
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{aq as o,ar as n}from"./mermaid.core-B0Ixd1yP.js";const t=(r,a)=>o.lang.round(n.parse(r)[a]);export{t as c};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-WL4C6EOR-DZ3WYdab.js";import{_ as i}from"./mermaid.core-B0Ixd1yP.js";import"./chunk-FMBD7UC4-7RuZ6HEq.js";import"./chunk-JSJVCQXG-B5dwG0bv.js";import"./chunk-55IACEB6-cKEeGDNI.js";import"./chunk-KX2RTZJC-DeyQYDVj.js";import"./index-D7UtkCYM.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-WL4C6EOR-DZ3WYdab.js";import{_ as i}from"./mermaid.core-B0Ixd1yP.js";import"./chunk-FMBD7UC4-7RuZ6HEq.js";import"./chunk-JSJVCQXG-B5dwG0bv.js";import"./chunk-55IACEB6-cKEeGDNI.js";import"./chunk-KX2RTZJC-DeyQYDVj.js";import"./index-D7UtkCYM.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{b as r}from"./_baseUniq-BjbISCNN.js";var e=4;function a(o){return r(o,e)}export{a as c};
|