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.
Files changed (77) hide show
  1. package/dashboard/dist/assets/{_basePickBy-DTuHiZCP.js → _basePickBy-Dek5-ACb.js} +1 -1
  2. package/dashboard/dist/assets/{_baseUniq-BjbISCNN.js → _baseUniq-BeLddDKU.js} +1 -1
  3. package/dashboard/dist/assets/{arc-D9mCa8If.js → arc-kotdj4Uh.js} +1 -1
  4. package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-CLWheiZu.js → architectureDiagram-2XIMDMQ5-BaqFXQ-q.js} +1 -1
  5. package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-BBxrVTWB.js → blockDiagram-WCTKOSBZ-BSyGne6h.js} +1 -1
  6. package/dashboard/dist/assets/{c4Diagram-IC4MRINW-DnhDZ2W3.js → c4Diagram-IC4MRINW-iYjZFKOW.js} +1 -1
  7. package/dashboard/dist/assets/channel-eXdj7ayV.js +1 -0
  8. package/dashboard/dist/assets/{chunk-4BX2VUAB-DeAfVeDa.js → chunk-4BX2VUAB-DvY9Y7jB.js} +1 -1
  9. package/dashboard/dist/assets/{chunk-55IACEB6-cKEeGDNI.js → chunk-55IACEB6-2vCDm2cJ.js} +1 -1
  10. package/dashboard/dist/assets/{chunk-FMBD7UC4-7RuZ6HEq.js → chunk-FMBD7UC4-BVPaoRtV.js} +1 -1
  11. package/dashboard/dist/assets/{chunk-JSJVCQXG-B5dwG0bv.js → chunk-JSJVCQXG-B9uJpMzd.js} +1 -1
  12. package/dashboard/dist/assets/{chunk-KX2RTZJC-DeyQYDVj.js → chunk-KX2RTZJC-CHcjjGaq.js} +1 -1
  13. package/dashboard/dist/assets/{chunk-NQ4KR5QH-NYo4hSqA.js → chunk-NQ4KR5QH-B8n19pSs.js} +1 -1
  14. package/dashboard/dist/assets/{chunk-QZHKN3VN-CtJFICF8.js → chunk-QZHKN3VN-CF9ZYFGK.js} +1 -1
  15. package/dashboard/dist/assets/{chunk-WL4C6EOR-DZ3WYdab.js → chunk-WL4C6EOR-mY_1Vmdf.js} +1 -1
  16. package/dashboard/dist/assets/classDiagram-VBA2DB6C-B-bBQACr.js +1 -0
  17. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-B-bBQACr.js +1 -0
  18. package/dashboard/dist/assets/clone-CL04pv9J.js +1 -0
  19. package/dashboard/dist/assets/{cose-bilkent-S5V4N54A-DaYOsf-M.js → cose-bilkent-S5V4N54A-DOYoG3gB.js} +1 -1
  20. package/dashboard/dist/assets/{dagre-KLK3FWXG-DzLc7ykF.js → dagre-KLK3FWXG-CZFrp-Yq.js} +1 -1
  21. package/dashboard/dist/assets/{diagram-E7M64L7V-kpjEdOqb.js → diagram-E7M64L7V-F3rF5YwM.js} +1 -1
  22. package/dashboard/dist/assets/{diagram-IFDJBPK2-D3EHoh6j.js → diagram-IFDJBPK2-BynWv-Vo.js} +1 -1
  23. package/dashboard/dist/assets/{diagram-P4PSJMXO-Cp6Un2ys.js → diagram-P4PSJMXO-NIyzhm_M.js} +1 -1
  24. package/dashboard/dist/assets/{erDiagram-INFDFZHY-DDjOUPWk.js → erDiagram-INFDFZHY-Ca9NbihE.js} +1 -1
  25. package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-CfO51xge.js → flowDiagram-PKNHOUZH-YhS0MOu4.js} +1 -1
  26. package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-BDzAtkcp.js → ganttDiagram-A5KZAMGK-G7P3qq_2.js} +1 -1
  27. package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-JPMFN2zF.js → gitGraphDiagram-K3NZZRJ6-BJAK7M7E.js} +1 -1
  28. package/dashboard/dist/assets/{graph-DXDryilu.js → graph-11geMy3f.js} +1 -1
  29. package/dashboard/dist/assets/index--qwybK3W.js +535 -0
  30. package/dashboard/dist/assets/index-DwrhlK8r.css +1 -0
  31. package/dashboard/dist/assets/{infoDiagram-LFFYTUFH-CYi5kkvz.js → infoDiagram-LFFYTUFH-COcQYcLf.js} +1 -1
  32. package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-DQl_IUe8.js → ishikawaDiagram-PHBUUO56-B7Jjyw8J.js} +1 -1
  33. package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-BXXGPcrS.js → journeyDiagram-4ABVD52K--snU-QAX.js} +1 -1
  34. package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-BqJestUY.js → kanban-definition-K7BYSVSG-BucLoc89.js} +1 -1
  35. package/dashboard/dist/assets/{layout-D5VdYmWn.js → layout-Bcgxdz8A.js} +1 -1
  36. package/dashboard/dist/assets/{linear-dZA_O_GN.js → linear-CRF8xwvk.js} +1 -1
  37. package/dashboard/dist/assets/{mermaid.core-B0Ixd1yP.js → mermaid.core-D5JD5uYg.js} +4 -4
  38. package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-CSJYdSMG.js → mindmap-definition-YRQLILUH-BqGcTcbk.js} +1 -1
  39. package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-DmYrRZHN.js → pieDiagram-SKSYHLDU-CnQ2EkyX.js} +1 -1
  40. package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-La3ce5kE.js → quadrantDiagram-337W2JSQ-CKCfmTRc.js} +1 -1
  41. package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-DPitIZQl.js → requirementDiagram-Z7DCOOCP-B9J4bvUK.js} +1 -1
  42. package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-CAmCqGkr.js → sankeyDiagram-WA2Y5GQK-CMSzI5rg.js} +1 -1
  43. package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-6lEzNTWG.js → sequenceDiagram-2WXFIKYE-BFQDtxd0.js} +1 -1
  44. package/dashboard/dist/assets/{stateDiagram-RAJIS63D-DyGKCS2C.js → stateDiagram-RAJIS63D-DgWYKT02.js} +1 -1
  45. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-Nmwft4cR.js +1 -0
  46. package/dashboard/dist/assets/{timeline-definition-YZTLITO2-D9RxQE3j.js → timeline-definition-YZTLITO2-jANu0e7M.js} +1 -1
  47. package/dashboard/dist/assets/{treemap-KZPCXAKY-TuXbGNN4.js → treemap-KZPCXAKY-BFjWMkyM.js} +1 -1
  48. package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-Bly5knr-.js → vennDiagram-LZ73GAT5-DGwrAJYj.js} +1 -1
  49. package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-CA-5z7-4.js → xychartDiagram-JWTSCODW-BLCPfoFM.js} +1 -1
  50. package/dashboard/dist/index.html +2 -2
  51. package/dist/dashboard/server.js +2220 -479
  52. package/dist/dashboard/server.js.map +1 -1
  53. package/dist/db/leases-db.js.map +1 -1
  54. package/dist/index.js +4499 -1127
  55. package/dist/index.js.map +1 -1
  56. package/dist/launch/index.js +127 -63
  57. package/dist/launch/index.js.map +1 -1
  58. package/package.json +1 -1
  59. package/platforms/claude-code/skills/bundle-worktree/SKILL.md +107 -0
  60. package/platforms/claude-code/skills/complete-bundle/SKILL.md +113 -0
  61. package/platforms/claude-code/skills/grab-bundle/SKILL.md +111 -0
  62. package/platforms/claude-code/skills/plan-bundle/SKILL.md +88 -0
  63. package/platforms/codex/skills/bundle-worktree/SKILL.md +107 -0
  64. package/platforms/codex/skills/complete-bundle/SKILL.md +113 -0
  65. package/platforms/codex/skills/grab-bundle/SKILL.md +111 -0
  66. package/platforms/codex/skills/plan-bundle/SKILL.md +88 -0
  67. package/skills/bundle-worktree/SKILL.md +107 -0
  68. package/skills/complete-bundle/SKILL.md +113 -0
  69. package/skills/grab-bundle/SKILL.md +111 -0
  70. package/skills/plan-bundle/SKILL.md +88 -0
  71. package/dashboard/dist/assets/channel-CN5VmjNa.js +0 -1
  72. package/dashboard/dist/assets/classDiagram-VBA2DB6C-CqLb9GuU.js +0 -1
  73. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-CqLb9GuU.js +0 -1
  74. package/dashboard/dist/assets/clone-DwvrjCQs.js +0 -1
  75. package/dashboard/dist/assets/index-D7UtkCYM.js +0 -515
  76. package/dashboard/dist/assets/index-DTXSWSzH.css +0 -1
  77. 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};