syntaur 0.27.0 → 0.32.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 (79) hide show
  1. package/dashboard/dist/assets/{_basePickBy-DPBuiT9A.js → _basePickBy-CV3s3ZBR.js} +1 -1
  2. package/dashboard/dist/assets/{_baseUniq-B5Q4dkW3.js → _baseUniq-BTBb-kpx.js} +1 -1
  3. package/dashboard/dist/assets/{arc-Bp71QC_v.js → arc-DroCaru_.js} +1 -1
  4. package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-CWHBISZ5.js → architectureDiagram-2XIMDMQ5-hL5g0oNx.js} +1 -1
  5. package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-D0txIHgi.js → blockDiagram-WCTKOSBZ-H-mOZOGQ.js} +1 -1
  6. package/dashboard/dist/assets/{c4Diagram-IC4MRINW-D_Hpnc38.js → c4Diagram-IC4MRINW-C7JTywql.js} +1 -1
  7. package/dashboard/dist/assets/channel-X6-lrXLw.js +1 -0
  8. package/dashboard/dist/assets/{chunk-4BX2VUAB-D0A_A8qn.js → chunk-4BX2VUAB-C5NgL7Ud.js} +1 -1
  9. package/dashboard/dist/assets/{chunk-55IACEB6-DuK8QvrD.js → chunk-55IACEB6-CpqlZIZp.js} +1 -1
  10. package/dashboard/dist/assets/{chunk-FMBD7UC4-B5WfIDS6.js → chunk-FMBD7UC4-DOEJuCgN.js} +1 -1
  11. package/dashboard/dist/assets/{chunk-JSJVCQXG-D3jB_ZJP.js → chunk-JSJVCQXG-DTvwZQeC.js} +1 -1
  12. package/dashboard/dist/assets/{chunk-KX2RTZJC-DtxN1mOD.js → chunk-KX2RTZJC-DtM5R3Ro.js} +1 -1
  13. package/dashboard/dist/assets/{chunk-NQ4KR5QH-4fQpgivN.js → chunk-NQ4KR5QH-BRf7XeyG.js} +1 -1
  14. package/dashboard/dist/assets/{chunk-QZHKN3VN-BOf9TZCT.js → chunk-QZHKN3VN-CkRK4_hm.js} +1 -1
  15. package/dashboard/dist/assets/{chunk-WL4C6EOR-D9HeEPWL.js → chunk-WL4C6EOR-D40xff82.js} +1 -1
  16. package/dashboard/dist/assets/classDiagram-VBA2DB6C-DfkR91Os.js +1 -0
  17. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-DfkR91Os.js +1 -0
  18. package/dashboard/dist/assets/clone--OUSRwbL.js +1 -0
  19. package/dashboard/dist/assets/{cose-bilkent-S5V4N54A-CpzWcyB7.js → cose-bilkent-S5V4N54A-BzAx8dWI.js} +1 -1
  20. package/dashboard/dist/assets/{dagre-KLK3FWXG-CC9-omFF.js → dagre-KLK3FWXG-DqBzOGFn.js} +1 -1
  21. package/dashboard/dist/assets/{diagram-E7M64L7V-q_F9KKPz.js → diagram-E7M64L7V-BU3Nv4BP.js} +1 -1
  22. package/dashboard/dist/assets/{diagram-IFDJBPK2-CbYvNpQB.js → diagram-IFDJBPK2-9173qxjV.js} +1 -1
  23. package/dashboard/dist/assets/{diagram-P4PSJMXO-q8XUUKRC.js → diagram-P4PSJMXO-CDO7XNao.js} +1 -1
  24. package/dashboard/dist/assets/{erDiagram-INFDFZHY-Q-oL35fO.js → erDiagram-INFDFZHY-DkO9AjCM.js} +1 -1
  25. package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-Cptj-2yF.js → flowDiagram-PKNHOUZH-9Fjhsq_p.js} +1 -1
  26. package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-BYmgXBad.js → ganttDiagram-A5KZAMGK-FL3oGbo9.js} +1 -1
  27. package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-DHF3w-Cn.js → gitGraphDiagram-K3NZZRJ6-FS9HpxFJ.js} +1 -1
  28. package/dashboard/dist/assets/{graph-Br4uG9xg.js → graph-COu71lol.js} +1 -1
  29. package/dashboard/dist/assets/index-BohN_jjP.css +1 -0
  30. package/dashboard/dist/assets/{index-dyJ_mu3x.js → index-D1FxzsMS.js} +84 -83
  31. package/dashboard/dist/assets/{infoDiagram-LFFYTUFH-Ckb3YLUI.js → infoDiagram-LFFYTUFH-Cb7nqRMJ.js} +1 -1
  32. package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-DSXXm4hL.js → ishikawaDiagram-PHBUUO56-DU44jQ_t.js} +1 -1
  33. package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-D4JJ4wn_.js → journeyDiagram-4ABVD52K-Dvf5wmhX.js} +1 -1
  34. package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-DZeWPcIi.js → kanban-definition-K7BYSVSG-NNnzIiBX.js} +1 -1
  35. package/dashboard/dist/assets/{layout-DU5mcBKh.js → layout-BWL1q6XW.js} +1 -1
  36. package/dashboard/dist/assets/{linear-h7AvdT63.js → linear-BpjXUE-L.js} +1 -1
  37. package/dashboard/dist/assets/{mermaid.core-DIOnVuDB.js → mermaid.core-C1YuKa7V.js} +4 -4
  38. package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-BVSORv6W.js → mindmap-definition-YRQLILUH-BUS-7SSM.js} +1 -1
  39. package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-BEdO084J.js → pieDiagram-SKSYHLDU-CId0D08y.js} +1 -1
  40. package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-3Dc5mQ7q.js → quadrantDiagram-337W2JSQ-lrdlvDFz.js} +1 -1
  41. package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-eu-8doSY.js → requirementDiagram-Z7DCOOCP-CijOr4BN.js} +1 -1
  42. package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-jA292hzv.js → sankeyDiagram-WA2Y5GQK-Bz63rCum.js} +1 -1
  43. package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-et31a6Tg.js → sequenceDiagram-2WXFIKYE-0ojwsRXQ.js} +1 -1
  44. package/dashboard/dist/assets/{stateDiagram-RAJIS63D-D6MtTWaR.js → stateDiagram-RAJIS63D-DvTark-k.js} +1 -1
  45. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-CiT1CTy0.js +1 -0
  46. package/dashboard/dist/assets/{timeline-definition-YZTLITO2-Oa_SYaCP.js → timeline-definition-YZTLITO2-B4EQprf1.js} +1 -1
  47. package/dashboard/dist/assets/{treemap-KZPCXAKY-vrIbKmuv.js → treemap-KZPCXAKY-ht_xOxVL.js} +1 -1
  48. package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-B3UlkEHW.js → vennDiagram-LZ73GAT5-C4DqZkvq.js} +1 -1
  49. package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-BLiVVy6A.js → xychartDiagram-JWTSCODW-eoymvv9D.js} +1 -1
  50. package/dashboard/dist/index.html +2 -2
  51. package/dist/dashboard/server.js +449 -124
  52. package/dist/dashboard/server.js.map +1 -1
  53. package/dist/index.js +5766 -3927
  54. package/dist/index.js.map +1 -1
  55. package/dist/launch/index.js +1191 -1181
  56. package/dist/launch/index.js.map +1 -1
  57. package/package.json +2 -1
  58. package/platforms/README.md +21 -0
  59. package/platforms/claude-code/skills/clear-assignment/SKILL.md +2 -2
  60. package/platforms/claude-code/skills/log-progress/SKILL.md +29 -48
  61. package/platforms/claude-code/skills/plan-assignment/SKILL.md +20 -1
  62. package/platforms/claude-code/skills/save-session-summary/SKILL.md +28 -29
  63. package/platforms/claude-code/skills/set-workspace/SKILL.md +25 -41
  64. package/platforms/codex/skills/clear-assignment/SKILL.md +2 -2
  65. package/platforms/codex/skills/log-progress/SKILL.md +29 -48
  66. package/platforms/codex/skills/plan-assignment/SKILL.md +20 -1
  67. package/platforms/codex/skills/save-session-summary/SKILL.md +28 -29
  68. package/platforms/codex/skills/set-workspace/SKILL.md +25 -41
  69. package/skills/clear-assignment/SKILL.md +2 -2
  70. package/skills/log-progress/SKILL.md +29 -48
  71. package/skills/plan-assignment/SKILL.md +20 -1
  72. package/skills/save-session-summary/SKILL.md +28 -29
  73. package/skills/set-workspace/SKILL.md +25 -41
  74. package/dashboard/dist/assets/channel-D41AslDq.js +0 -1
  75. package/dashboard/dist/assets/classDiagram-VBA2DB6C-BnKy62Yt.js +0 -1
  76. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-BnKy62Yt.js +0 -1
  77. package/dashboard/dist/assets/clone-Cz7h9axV.js +0 -1
  78. package/dashboard/dist/assets/index-Ds1-e_jv.css +0 -1
  79. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-sYL-A3ib.js +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "syntaur",
3
- "version": "0.27.0",
3
+ "version": "0.32.0",
4
4
  "description": "Project workflow CLI with dashboard, Claude Code plugin, and Codex plugin",
5
5
  "homepage": "https://github.com/prong-horn/syntaur#readme",
6
6
  "repository": {
@@ -56,6 +56,7 @@
56
56
  "test": "vitest run",
57
57
  "test:watch": "vitest",
58
58
  "mirror-skills": "node scripts/mirror-skills-to-platforms.mjs",
59
+ "build:skills-index": "node scripts/build-skills-index.mjs",
59
60
  "postinstall": "node scripts/install-macos-url-handler.mjs",
60
61
  "prepack": "node scripts/mirror-skills-to-platforms.mjs",
61
62
  "prepublishOnly": "npm run build && npm ci --prefix dashboard && npm run build --prefix dashboard",
@@ -40,6 +40,27 @@ If `npx` is unavailable, `syntaur setup --target <id>` falls back to copying the
40
40
  bundled skills directly into the agent's skills dir. See
41
41
  `references/tool-dialects.md` for the Syntaur-id ↔ skills.sh-id mapping.
42
42
 
43
+ ### Channels
44
+
45
+ Two equivalent Tier-1 sources resolve the same 30 skills:
46
+
47
+ - **GitHub source** — `npx skills add prong-horn/syntaur` clones the repo and
48
+ auto-discovers `skills/` (no index needed).
49
+ - **Branded HTTP source** — a spec-valid Agent Skills **v0.2.0** discovery index at
50
+ `/.well-known/agent-skills/index.json`, generated from `skills/` by
51
+ `scripts/build-skills-index.mjs` (per-skill `sha256:` digests; single-file skills
52
+ ship as `skill-md`, the multi-file `syntaur-protocol` as a deterministic `archive`
53
+ tar.gz) and deployed to **GitHub Pages** by `publish.yml` on each `v*` tag:
54
+
55
+ ```bash
56
+ # Pass the FULL URL (a bare host parses as a GitHub shorthand in skills.sh):
57
+ npx skills add https://prong-horn.github.io/syntaur
58
+ ```
59
+
60
+ The index emits **index-directory-relative** `url`s, so it resolves correctly whether
61
+ hosted under the project-Pages subpath (`/syntaur/`) or, later, a custom domain at an
62
+ origin root — no regeneration needed to adopt a CNAME.
63
+
43
64
  ## Usage
44
65
 
45
66
  ```bash
@@ -29,7 +29,7 @@ If the assignment is actually done, use `complete-assignment` instead so a hando
29
29
  Optional flags from the user:
30
30
 
31
31
  - `--keep-session` — preserve `sessionId` / `transcriptPath` fields in `context.json` (just strip the assignment fields). Default: full delete.
32
- - `--unassign` — also run `syntaur unassign <slug> --project <project>` so the assignment is no longer claimed by this agent. Default: leave the claim in place (only the local context is cleared). Skip this flag if the CLI does not support `unassign` in the installed version — fall back to leaving the claim alone and tell the user.
32
+ - `--unassign` — also run `syntaur unassign <slug> --project <project>` so the assignment is no longer claimed by this agent. Default: leave the claim in place (only the local context is cleared).
33
33
 
34
34
  ## Step 1: Load Context
35
35
 
@@ -66,7 +66,7 @@ syntaur unassign <assignment-slug> --project <project-slug>
66
66
 
67
67
  For standalone assignments use the UUID (the folder name) in place of the slug, and omit `--project`.
68
68
 
69
- If the CLI rejects the command (older versions may not implement `unassign`), report the error and continue — the local context clear in Step 4 still happens.
69
+ `syntaur unassign` clears the assignee on the assignment frontmatter (the inverse of `assign`) and bumps `updated`.
70
70
 
71
71
  ## Step 4: Clear the Context File
72
72
 
@@ -16,9 +16,12 @@ metadata:
16
16
  # Log Progress
17
17
 
18
18
  Append a structured timestamped entry to the active assignment's
19
- `<assignmentDir>/progress.md`, and update its frontmatter. Markdown-only
20
- no CLI verb. Idempotent in the sense that re-running with the same body
21
- produces a duplicate entry, which is intentional (timestamps differ).
19
+ `<assignmentDir>/progress.md`, and update its frontmatter. CLI-mediated via
20
+ `syntaur progress log "<text>"` the command stamps the timestamp, inserts the
21
+ entry reverse-chronologically (newest right after the `# Progress` H1), replaces
22
+ the `No progress yet.` placeholder, bumps `entryCount` + `updated`, and preserves
23
+ the `assignment`/`generated` frontmatter. Re-running with the same body produces a
24
+ duplicate entry, which is intentional (timestamps differ).
22
25
 
23
26
  This skill implements the **Keep Records Updated** playbook: agents must keep
24
27
  records current in real-time, especially after every meaningful action.
@@ -55,34 +58,29 @@ The entry should be concise, factual, and link-rich. Suggested structure:
55
58
  Optional notes paragraph.
56
59
  ```
57
60
 
58
- Use ISO 8601 with `Z` suffix (e.g. `2026-05-08T20:13:00Z`). Use absolute
59
- file paths or repo-relative paths consistently.
61
+ The CLI stamps the ISO 8601 `Z` timestamp for you. Use absolute file paths or
62
+ repo-relative paths consistently in the body.
60
63
 
61
- ## Step 3: Read existing progress.md
64
+ ## Step 3: Log the entry via the CLI
62
65
 
63
- Read `<assignmentDir>/progress.md`. Extract:
66
+ Run:
64
67
 
65
- - Current `entryCount` from the frontmatter.
66
- - The full body (everything after the second `---`).
67
-
68
- If `progress.md` doesn't exist, abort and tell the user to re-grab the
69
- assignment (the file should always exist for an in-progress assignment).
70
-
71
- ## Step 4: Compute new frontmatter
72
-
73
- - `entryCount`: increment by 1.
74
- - `updated`: set to current ISO timestamp.
75
- - Other fields (`assignment`, `generated`): preserve as-is.
68
+ ```bash
69
+ syntaur progress log "<your composed entry body>"
70
+ ```
76
71
 
77
- ## Step 5: Write the file
72
+ The command resolves the active assignment from `.syntaur/context.json`
73
+ (or pass `--assignment <slug> [--project <slug>]` to target one explicitly),
74
+ then atomically:
78
75
 
79
- Write back the file with the updated frontmatter and the new entry **prepended**
80
- to the body (newest first), per the Keep Records Updated playbook and
81
- `skills/syntaur-protocol/references/protocol-summary.md`. Reverse-chronological
82
- order: the new `## <ISO 8601 timestamp>` heading sits immediately after the
83
- `# Progress` H1, with one blank line separating it from any prior entry.
76
+ - Inserts the entry immediately after the `# Progress` H1 (newest first,
77
+ reverse-chronological), replacing the `No progress yet.` placeholder on the
78
+ first real entry.
79
+ - Increments `entryCount` and bumps `updated`, preserving `assignment` and
80
+ `generated`.
84
81
 
85
- Layout:
82
+ Quote the body so the shell passes it as a single argument. Multi-line bodies
83
+ are fine inside the quotes. The resulting layout is:
86
84
 
87
85
  ```markdown
88
86
  # Progress
@@ -94,32 +92,15 @@ Layout:
94
92
  ## <prior ISO timestamp>
95
93
 
96
94
  <prior entry body>
97
-
98
- ## <even-older ISO timestamp>
99
-
100
- <even-older entry body>
101
95
  ```
102
96
 
103
- If the existing body is the placeholder text "No progress yet.", replace it
104
- with the new entry instead of preserving the placeholder.
105
-
106
- > **Why prepend:** the dashboard and downstream readers expect the most recent
107
- > entry first. Appending at the end would silently break the convention
108
- > documented in `~/.syntaur/playbooks/keep-records-updated.md`.
109
-
110
- ## Step 6: Verify schema
111
-
112
- Confirm by re-reading the file:
113
-
114
- - Starts with `---`, then frontmatter, then `---`.
115
- - `entryCount` is a non-negative integer.
116
- - `updated` matches the timestamp you wrote.
117
- - The new entry's `## <timestamp>` heading is present.
118
-
119
- If the file fails schema check, restore the prior content and report the
120
- error — do not leave it partially written.
97
+ > **Why the CLI:** the insert/ordering/`entryCount`/placeholder rules used to be
98
+ > hand-applied (and easy to get subtly wrong). `syntaur progress log` is the
99
+ > single, validated writer — the dashboard and downstream readers expect the
100
+ > most recent entry first, the convention documented in
101
+ > `~/.syntaur/playbooks/keep-records-updated.md`.
121
102
 
122
- ## Step 7: Report to User
103
+ ## Step 4: Report to User
123
104
 
124
105
  Summarize:
125
106
 
@@ -76,7 +76,24 @@ Remember this `planFilename` and `versionLabel` for Steps 5b and 5c.
76
76
 
77
77
  ### 5b. Write the plan file
78
78
 
79
- Write `<assignmentDir>/<planFilename>` with standard plan frontmatter:
79
+ **Scaffold via the CLI do not hand-write the file or frontmatter.**
80
+
81
+ - **Initial plan** (`planFilename` is `plan.md`, no plan files exist yet): run
82
+
83
+ ```bash
84
+ syntaur plan create
85
+ ```
86
+
87
+ (or `--assignment <slug> [--project <slug>]` to target one explicitly). This
88
+ writes `plan.md` with the standard `draft` frontmatter AND appends the
89
+ four-todo cycle to assignment.md `## Todos` — so **Step 5c is already done for
90
+ the initial plan**; skip it and proceed to fill in the body sections below.
91
+
92
+ - **New version** (`planFilename` is `plan-v<N>.md`): run `syntaur plan version`,
93
+ which scaffolds `plan-v<N>.md`, supersedes the prior cycle, and carries forward
94
+ unchecked tasks (this is Step 5c for the versioned case).
95
+
96
+ The scaffolded frontmatter is:
80
97
 
81
98
  ```yaml
82
99
  ---
@@ -87,6 +104,8 @@ updated: "<nowTimestamp>"
87
104
  ---
88
105
  ```
89
106
 
107
+ Then edit the scaffolded plan file in place to add the body sections below.
108
+
90
109
  Body sections:
91
110
 
92
111
  1. **Overview** — one paragraph summarizing the approach.
@@ -36,30 +36,12 @@ Extract:
36
36
 
37
37
  If `sessionId` is missing, empty, or `null`, abort with: "Session not tracked. Run `syntaur track-session ...` first." Do not invent or generate a session id.
38
38
 
39
- ## Step 2: Ensure Session Directory
39
+ ## Step 2: Author the summary body
40
40
 
41
- Create `<assignmentDir>/sessions/<sessionId>/` only at this step (not earlier empty session dirs are noise). Use `mkdir -p` semantics so re-saves are idempotent.
42
-
43
- ## Step 3: Read Existing Summary (if any)
44
-
45
- If `<assignmentDir>/sessions/<sessionId>/summary.md` already exists, read it and preserve its `created` frontmatter timestamp. Otherwise, the new file's `created` is now.
46
-
47
- This is a **single document per session id** — every save in the same session overwrites in place. The directory partitions by session id, so older sessions remain on disk as immutable history.
48
-
49
- ## Step 4: Write the Summary
50
-
51
- Write `<assignmentDir>/sessions/<sessionId>/summary.md` with this structure (overwrite if it exists). Fill the section bodies with content derived from this session's actual work — be specific and concrete, this is what a future session will load to resume.
41
+ Compose the markdown bodybe specific and concrete, this is what a future
42
+ session loads to resume. Use these sections:
52
43
 
53
44
  ```markdown
54
- ---
55
- assignment: <assignment-slug>
56
- sessionId: <session-id>
57
- created: "<original created timestamp, or now if new>"
58
- updated: "<now, ISO 8601>"
59
- ---
60
-
61
- # Session Summary
62
-
63
45
  ## Snapshot
64
46
 
65
47
  <One paragraph: what the assignment is, where work currently stands, what is load-bearing for a future session to know immediately on resume.>
@@ -68,19 +50,15 @@ updated: "<now, ISO 8601>"
68
50
 
69
51
  - <Concrete action 1>
70
52
  - <Concrete action 2>
71
- - ...
72
53
 
73
54
  ## What's Next
74
55
 
75
56
  - <Most important next step>
76
57
  - <Subsequent steps in order>
77
- - ...
78
58
 
79
59
  ## Open Questions
80
60
 
81
61
  - <Unresolved question or decision>
82
- - <Ambiguity to resolve>
83
- - ...
84
62
  (or "None." if no open items)
85
63
 
86
64
  ## Load-Bearing Context
@@ -91,7 +69,28 @@ updated: "<now, ISO 8601>"
91
69
  - External references (PRs, issues, docs) that scope the next steps
92
70
  ```
93
71
 
94
- ## Step 5: Confirm Do NOT Touch handoff.md
72
+ ## Step 3: Write via the CLI
73
+
74
+ Pass the body to `syntaur session save` (it owns the directory, frontmatter,
75
+ and `created`-preservation):
76
+
77
+ ```bash
78
+ syntaur session save --session-id <sessionId> --from-file <body.md>
79
+ # or pipe it: printf '%s' "$BODY" | syntaur session save --session-id <sessionId>
80
+ ```
81
+
82
+ Resolves the active assignment from `.syntaur/context.json` (or pass
83
+ `--assignment <slug> [--project <slug>]`), and `--session-id` defaults to the
84
+ context's `sessionId`. The command:
85
+
86
+ - Creates `<assignmentDir>/sessions/<sessionId>/` (idempotent) and writes
87
+ `summary.md` — a **single document per session id**, overwritten in place;
88
+ older sessions remain on disk as immutable history.
89
+ - Preserves the existing `created` frontmatter timestamp on re-save (new file →
90
+ `created = now`); always stamps `assignment`, `sessionId`, and `updated`.
91
+ - Writes the standard section skeleton if no body is supplied.
92
+
93
+ ## Step 4: Confirm — Do NOT Touch handoff.md
95
94
 
96
95
  Verify your write did not modify `<assignmentDir>/handoff.md`. The two artifacts are deliberately separate:
97
96
 
@@ -100,11 +99,11 @@ Verify your write did not modify `<assignmentDir>/handoff.md`. The two artifacts
100
99
  | `handoff.md` | Assignment-level | At completion (via `complete-assignment`) | Next ticket / agent / human reviewer |
101
100
  | `sessions/<sid>/summary.md` | Session-scoped | Mid-assignment, on demand or pre-compact | Future session of the same agent on the same assignment |
102
101
 
103
- ## Step 6: Append a Progress Entry (optional but recommended)
102
+ ## Step 5: Append a Progress Entry (optional but recommended)
104
103
 
105
- If progress hasn't already been logged in this turn, append a brief entry to `<assignmentDir>/progress.md` noting that a session summary was saved and the next-step pointer.
104
+ If progress hasn't already been logged in this turn, run `syntaur progress log "<note>"` noting that a session summary was saved and the next-step pointer.
106
105
 
107
- ## Step 7: Report to User
106
+ ## Step 6: Report to User
108
107
 
109
108
  Summarize:
110
109
  - Path of the written summary
@@ -41,21 +41,9 @@ Read `.syntaur/context.json` from the current working directory. Extract
41
41
  If no context, abort with: "No active assignment. Run `grab-assignment`
42
42
  first."
43
43
 
44
- ## Step 2: Pre-write validation
44
+ ## Step 2: Gather inputs
45
45
 
46
- ```bash
47
- syntaur doctor --assignment <assignmentDir>/assignment.md --json
48
- ```
49
-
50
- Parse the JSON output. If `ok: false`, refuse to proceed. Report the
51
- `errors[]` to the user verbatim and recommend they fix the underlying
52
- frontmatter (or run `syntaur doctor` for the broader project context).
53
- **Do not write any changes if the file is malformed.**
54
-
55
- ## Step 3: Gather inputs
56
-
57
- Required (one or more — at minimum the user must specify enough to fill
58
- all four fields):
46
+ At minimum specify enough to fill the four fields:
59
47
 
60
48
  - `--repository <path>` — repo root (typically `git rev-parse --show-toplevel`).
61
49
  - `--worktree-path <path>` — usually `<repository>/.worktrees/<branch>`
@@ -63,47 +51,43 @@ all four fields):
63
51
  - `--branch <name>` — current branch (`git rev-parse --abbrev-ref HEAD`).
64
52
  - `--parent-branch <name>` — typically `main`.
65
53
 
66
- Defaults the skill should auto-detect when not supplied:
54
+ Defaults to auto-detect when not supplied:
67
55
 
68
56
  - `repository` ← `git -C $(pwd) rev-parse --show-toplevel`.
69
57
  - `branch` ← `git -C $(pwd) rev-parse --abbrev-ref HEAD`.
70
58
  - `worktreePath` ← `$(pwd)` (when invoked from the worktree itself).
71
59
  - `parentBranch` ← prompt the user; do not invent.
72
60
 
73
- ## Step 4: Read assignment.md
61
+ ## Step 3: Write via the CLI
74
62
 
75
- Locate the `workspace:` block in the frontmatter. It must look like:
76
-
77
- ```yaml
78
- workspace:
79
- repository: <value-or-null>
80
- worktreePath: <value-or-null>
81
- branch: <value-or-null>
82
- parentBranch: <value-or-null>
63
+ ```bash
64
+ syntaur workspace set \
65
+ --repository <repo> \
66
+ --worktree-path <repo>/.worktrees/<branch> \
67
+ --branch <branch> \
68
+ --parent-branch <parent>
83
69
  ```
84
70
 
85
- If the block is missing entirely, refuse to write — `doctor --assignment`
86
- should have caught it; this is a defensive check.
87
-
88
- ## Step 5: Write the four fields
89
-
90
- Replace the four lines in place. Quote string values containing special
91
- characters; use `null` literal for unset fields. Preserve the rest of the
92
- frontmatter and body bit-for-bit.
93
-
94
- Bump the top-level `updated` timestamp in the frontmatter.
71
+ Targets the active assignment from `.syntaur/context.json` by default; pass
72
+ `--assignment <slug> [--project <slug>]` to target one explicitly. The command
73
+ does the whole safe write in one atomic step:
95
74
 
96
- ## Step 6: Re-validate
75
+ - **Pre-write validation** — runs the same checks as `syntaur doctor
76
+ --assignment --json`; if the file is malformed it refuses to write and prints
77
+ the errors. (Implements the "never touch a malformed file" guard.)
78
+ - Writes the four `workspace.*` fields in place via the frontmatter mutator
79
+ (other same-named keys elsewhere are untouched) and bumps the top-level
80
+ `updated` timestamp.
81
+ - **Post-write re-validation** — if the result is somehow invalid, it restores
82
+ the original file and exits non-zero, so the file is never left half-written.
97
83
 
98
- Re-run `syntaur doctor --assignment <path> --json`. Expect `ok: true`. If
99
- the post-write validation fails, restore the prior file content and report
100
- the error — do not leave the file in a half-written state.
84
+ If the command exits non-zero, report its `Error:` output verbatim and fix the
85
+ underlying frontmatter before retrying.
101
86
 
102
- ## Step 7: Report to User
87
+ ## Step 4: Report to User
103
88
 
104
89
  Summarize:
105
90
 
106
- - Path of the modified assignment.md.
91
+ - Path of the modified assignment.md (the command prints it).
107
92
  - The four field values that were written.
108
- - Confirmation that post-write `doctor --assignment` passed.
109
93
  - Reminder: implementation work is now unblocked by the write-boundary hook.
@@ -29,7 +29,7 @@ If the assignment is actually done, use `complete-assignment` instead so a hando
29
29
  Optional flags from the user:
30
30
 
31
31
  - `--keep-session` — preserve `sessionId` / `transcriptPath` fields in `context.json` (just strip the assignment fields). Default: full delete.
32
- - `--unassign` — also run `syntaur unassign <slug> --project <project>` so the assignment is no longer claimed by this agent. Default: leave the claim in place (only the local context is cleared). Skip this flag if the CLI does not support `unassign` in the installed version — fall back to leaving the claim alone and tell the user.
32
+ - `--unassign` — also run `syntaur unassign <slug> --project <project>` so the assignment is no longer claimed by this agent. Default: leave the claim in place (only the local context is cleared).
33
33
 
34
34
  ## Step 1: Load Context
35
35
 
@@ -66,7 +66,7 @@ syntaur unassign <assignment-slug> --project <project-slug>
66
66
 
67
67
  For standalone assignments use the UUID (the folder name) in place of the slug, and omit `--project`.
68
68
 
69
- If the CLI rejects the command (older versions may not implement `unassign`), report the error and continue — the local context clear in Step 4 still happens.
69
+ `syntaur unassign` clears the assignee on the assignment frontmatter (the inverse of `assign`) and bumps `updated`.
70
70
 
71
71
  ## Step 4: Clear the Context File
72
72
 
@@ -16,9 +16,12 @@ metadata:
16
16
  # Log Progress
17
17
 
18
18
  Append a structured timestamped entry to the active assignment's
19
- `<assignmentDir>/progress.md`, and update its frontmatter. Markdown-only
20
- no CLI verb. Idempotent in the sense that re-running with the same body
21
- produces a duplicate entry, which is intentional (timestamps differ).
19
+ `<assignmentDir>/progress.md`, and update its frontmatter. CLI-mediated via
20
+ `syntaur progress log "<text>"` the command stamps the timestamp, inserts the
21
+ entry reverse-chronologically (newest right after the `# Progress` H1), replaces
22
+ the `No progress yet.` placeholder, bumps `entryCount` + `updated`, and preserves
23
+ the `assignment`/`generated` frontmatter. Re-running with the same body produces a
24
+ duplicate entry, which is intentional (timestamps differ).
22
25
 
23
26
  This skill implements the **Keep Records Updated** playbook: agents must keep
24
27
  records current in real-time, especially after every meaningful action.
@@ -55,34 +58,29 @@ The entry should be concise, factual, and link-rich. Suggested structure:
55
58
  Optional notes paragraph.
56
59
  ```
57
60
 
58
- Use ISO 8601 with `Z` suffix (e.g. `2026-05-08T20:13:00Z`). Use absolute
59
- file paths or repo-relative paths consistently.
61
+ The CLI stamps the ISO 8601 `Z` timestamp for you. Use absolute file paths or
62
+ repo-relative paths consistently in the body.
60
63
 
61
- ## Step 3: Read existing progress.md
64
+ ## Step 3: Log the entry via the CLI
62
65
 
63
- Read `<assignmentDir>/progress.md`. Extract:
66
+ Run:
64
67
 
65
- - Current `entryCount` from the frontmatter.
66
- - The full body (everything after the second `---`).
67
-
68
- If `progress.md` doesn't exist, abort and tell the user to re-grab the
69
- assignment (the file should always exist for an in-progress assignment).
70
-
71
- ## Step 4: Compute new frontmatter
72
-
73
- - `entryCount`: increment by 1.
74
- - `updated`: set to current ISO timestamp.
75
- - Other fields (`assignment`, `generated`): preserve as-is.
68
+ ```bash
69
+ syntaur progress log "<your composed entry body>"
70
+ ```
76
71
 
77
- ## Step 5: Write the file
72
+ The command resolves the active assignment from `.syntaur/context.json`
73
+ (or pass `--assignment <slug> [--project <slug>]` to target one explicitly),
74
+ then atomically:
78
75
 
79
- Write back the file with the updated frontmatter and the new entry **prepended**
80
- to the body (newest first), per the Keep Records Updated playbook and
81
- `skills/syntaur-protocol/references/protocol-summary.md`. Reverse-chronological
82
- order: the new `## <ISO 8601 timestamp>` heading sits immediately after the
83
- `# Progress` H1, with one blank line separating it from any prior entry.
76
+ - Inserts the entry immediately after the `# Progress` H1 (newest first,
77
+ reverse-chronological), replacing the `No progress yet.` placeholder on the
78
+ first real entry.
79
+ - Increments `entryCount` and bumps `updated`, preserving `assignment` and
80
+ `generated`.
84
81
 
85
- Layout:
82
+ Quote the body so the shell passes it as a single argument. Multi-line bodies
83
+ are fine inside the quotes. The resulting layout is:
86
84
 
87
85
  ```markdown
88
86
  # Progress
@@ -94,32 +92,15 @@ Layout:
94
92
  ## <prior ISO timestamp>
95
93
 
96
94
  <prior entry body>
97
-
98
- ## <even-older ISO timestamp>
99
-
100
- <even-older entry body>
101
95
  ```
102
96
 
103
- If the existing body is the placeholder text "No progress yet.", replace it
104
- with the new entry instead of preserving the placeholder.
105
-
106
- > **Why prepend:** the dashboard and downstream readers expect the most recent
107
- > entry first. Appending at the end would silently break the convention
108
- > documented in `~/.syntaur/playbooks/keep-records-updated.md`.
109
-
110
- ## Step 6: Verify schema
111
-
112
- Confirm by re-reading the file:
113
-
114
- - Starts with `---`, then frontmatter, then `---`.
115
- - `entryCount` is a non-negative integer.
116
- - `updated` matches the timestamp you wrote.
117
- - The new entry's `## <timestamp>` heading is present.
118
-
119
- If the file fails schema check, restore the prior content and report the
120
- error — do not leave it partially written.
97
+ > **Why the CLI:** the insert/ordering/`entryCount`/placeholder rules used to be
98
+ > hand-applied (and easy to get subtly wrong). `syntaur progress log` is the
99
+ > single, validated writer — the dashboard and downstream readers expect the
100
+ > most recent entry first, the convention documented in
101
+ > `~/.syntaur/playbooks/keep-records-updated.md`.
121
102
 
122
- ## Step 7: Report to User
103
+ ## Step 4: Report to User
123
104
 
124
105
  Summarize:
125
106
 
@@ -76,7 +76,24 @@ Remember this `planFilename` and `versionLabel` for Steps 5b and 5c.
76
76
 
77
77
  ### 5b. Write the plan file
78
78
 
79
- Write `<assignmentDir>/<planFilename>` with standard plan frontmatter:
79
+ **Scaffold via the CLI do not hand-write the file or frontmatter.**
80
+
81
+ - **Initial plan** (`planFilename` is `plan.md`, no plan files exist yet): run
82
+
83
+ ```bash
84
+ syntaur plan create
85
+ ```
86
+
87
+ (or `--assignment <slug> [--project <slug>]` to target one explicitly). This
88
+ writes `plan.md` with the standard `draft` frontmatter AND appends the
89
+ four-todo cycle to assignment.md `## Todos` — so **Step 5c is already done for
90
+ the initial plan**; skip it and proceed to fill in the body sections below.
91
+
92
+ - **New version** (`planFilename` is `plan-v<N>.md`): run `syntaur plan version`,
93
+ which scaffolds `plan-v<N>.md`, supersedes the prior cycle, and carries forward
94
+ unchecked tasks (this is Step 5c for the versioned case).
95
+
96
+ The scaffolded frontmatter is:
80
97
 
81
98
  ```yaml
82
99
  ---
@@ -87,6 +104,8 @@ updated: "<nowTimestamp>"
87
104
  ---
88
105
  ```
89
106
 
107
+ Then edit the scaffolded plan file in place to add the body sections below.
108
+
90
109
  Body sections:
91
110
 
92
111
  1. **Overview** — one paragraph summarizing the approach.