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.
- package/dashboard/dist/assets/{_basePickBy-DPBuiT9A.js → _basePickBy-CV3s3ZBR.js} +1 -1
- package/dashboard/dist/assets/{_baseUniq-B5Q4dkW3.js → _baseUniq-BTBb-kpx.js} +1 -1
- package/dashboard/dist/assets/{arc-Bp71QC_v.js → arc-DroCaru_.js} +1 -1
- package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-CWHBISZ5.js → architectureDiagram-2XIMDMQ5-hL5g0oNx.js} +1 -1
- package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-D0txIHgi.js → blockDiagram-WCTKOSBZ-H-mOZOGQ.js} +1 -1
- package/dashboard/dist/assets/{c4Diagram-IC4MRINW-D_Hpnc38.js → c4Diagram-IC4MRINW-C7JTywql.js} +1 -1
- package/dashboard/dist/assets/channel-X6-lrXLw.js +1 -0
- package/dashboard/dist/assets/{chunk-4BX2VUAB-D0A_A8qn.js → chunk-4BX2VUAB-C5NgL7Ud.js} +1 -1
- package/dashboard/dist/assets/{chunk-55IACEB6-DuK8QvrD.js → chunk-55IACEB6-CpqlZIZp.js} +1 -1
- package/dashboard/dist/assets/{chunk-FMBD7UC4-B5WfIDS6.js → chunk-FMBD7UC4-DOEJuCgN.js} +1 -1
- package/dashboard/dist/assets/{chunk-JSJVCQXG-D3jB_ZJP.js → chunk-JSJVCQXG-DTvwZQeC.js} +1 -1
- package/dashboard/dist/assets/{chunk-KX2RTZJC-DtxN1mOD.js → chunk-KX2RTZJC-DtM5R3Ro.js} +1 -1
- package/dashboard/dist/assets/{chunk-NQ4KR5QH-4fQpgivN.js → chunk-NQ4KR5QH-BRf7XeyG.js} +1 -1
- package/dashboard/dist/assets/{chunk-QZHKN3VN-BOf9TZCT.js → chunk-QZHKN3VN-CkRK4_hm.js} +1 -1
- package/dashboard/dist/assets/{chunk-WL4C6EOR-D9HeEPWL.js → chunk-WL4C6EOR-D40xff82.js} +1 -1
- package/dashboard/dist/assets/classDiagram-VBA2DB6C-DfkR91Os.js +1 -0
- package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-DfkR91Os.js +1 -0
- package/dashboard/dist/assets/clone--OUSRwbL.js +1 -0
- package/dashboard/dist/assets/{cose-bilkent-S5V4N54A-CpzWcyB7.js → cose-bilkent-S5V4N54A-BzAx8dWI.js} +1 -1
- package/dashboard/dist/assets/{dagre-KLK3FWXG-CC9-omFF.js → dagre-KLK3FWXG-DqBzOGFn.js} +1 -1
- package/dashboard/dist/assets/{diagram-E7M64L7V-q_F9KKPz.js → diagram-E7M64L7V-BU3Nv4BP.js} +1 -1
- package/dashboard/dist/assets/{diagram-IFDJBPK2-CbYvNpQB.js → diagram-IFDJBPK2-9173qxjV.js} +1 -1
- package/dashboard/dist/assets/{diagram-P4PSJMXO-q8XUUKRC.js → diagram-P4PSJMXO-CDO7XNao.js} +1 -1
- package/dashboard/dist/assets/{erDiagram-INFDFZHY-Q-oL35fO.js → erDiagram-INFDFZHY-DkO9AjCM.js} +1 -1
- package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-Cptj-2yF.js → flowDiagram-PKNHOUZH-9Fjhsq_p.js} +1 -1
- package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-BYmgXBad.js → ganttDiagram-A5KZAMGK-FL3oGbo9.js} +1 -1
- package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-DHF3w-Cn.js → gitGraphDiagram-K3NZZRJ6-FS9HpxFJ.js} +1 -1
- package/dashboard/dist/assets/{graph-Br4uG9xg.js → graph-COu71lol.js} +1 -1
- package/dashboard/dist/assets/index-BohN_jjP.css +1 -0
- package/dashboard/dist/assets/{index-dyJ_mu3x.js → index-D1FxzsMS.js} +84 -83
- package/dashboard/dist/assets/{infoDiagram-LFFYTUFH-Ckb3YLUI.js → infoDiagram-LFFYTUFH-Cb7nqRMJ.js} +1 -1
- package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-DSXXm4hL.js → ishikawaDiagram-PHBUUO56-DU44jQ_t.js} +1 -1
- package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-D4JJ4wn_.js → journeyDiagram-4ABVD52K-Dvf5wmhX.js} +1 -1
- package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-DZeWPcIi.js → kanban-definition-K7BYSVSG-NNnzIiBX.js} +1 -1
- package/dashboard/dist/assets/{layout-DU5mcBKh.js → layout-BWL1q6XW.js} +1 -1
- package/dashboard/dist/assets/{linear-h7AvdT63.js → linear-BpjXUE-L.js} +1 -1
- package/dashboard/dist/assets/{mermaid.core-DIOnVuDB.js → mermaid.core-C1YuKa7V.js} +4 -4
- package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-BVSORv6W.js → mindmap-definition-YRQLILUH-BUS-7SSM.js} +1 -1
- package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-BEdO084J.js → pieDiagram-SKSYHLDU-CId0D08y.js} +1 -1
- package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-3Dc5mQ7q.js → quadrantDiagram-337W2JSQ-lrdlvDFz.js} +1 -1
- package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-eu-8doSY.js → requirementDiagram-Z7DCOOCP-CijOr4BN.js} +1 -1
- package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-jA292hzv.js → sankeyDiagram-WA2Y5GQK-Bz63rCum.js} +1 -1
- package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-et31a6Tg.js → sequenceDiagram-2WXFIKYE-0ojwsRXQ.js} +1 -1
- package/dashboard/dist/assets/{stateDiagram-RAJIS63D-D6MtTWaR.js → stateDiagram-RAJIS63D-DvTark-k.js} +1 -1
- package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-CiT1CTy0.js +1 -0
- package/dashboard/dist/assets/{timeline-definition-YZTLITO2-Oa_SYaCP.js → timeline-definition-YZTLITO2-B4EQprf1.js} +1 -1
- package/dashboard/dist/assets/{treemap-KZPCXAKY-vrIbKmuv.js → treemap-KZPCXAKY-ht_xOxVL.js} +1 -1
- package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-B3UlkEHW.js → vennDiagram-LZ73GAT5-C4DqZkvq.js} +1 -1
- package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-BLiVVy6A.js → xychartDiagram-JWTSCODW-eoymvv9D.js} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/dist/dashboard/server.js +449 -124
- package/dist/dashboard/server.js.map +1 -1
- package/dist/index.js +5766 -3927
- package/dist/index.js.map +1 -1
- package/dist/launch/index.js +1191 -1181
- package/dist/launch/index.js.map +1 -1
- package/package.json +2 -1
- package/platforms/README.md +21 -0
- package/platforms/claude-code/skills/clear-assignment/SKILL.md +2 -2
- package/platforms/claude-code/skills/log-progress/SKILL.md +29 -48
- package/platforms/claude-code/skills/plan-assignment/SKILL.md +20 -1
- package/platforms/claude-code/skills/save-session-summary/SKILL.md +28 -29
- package/platforms/claude-code/skills/set-workspace/SKILL.md +25 -41
- package/platforms/codex/skills/clear-assignment/SKILL.md +2 -2
- package/platforms/codex/skills/log-progress/SKILL.md +29 -48
- package/platforms/codex/skills/plan-assignment/SKILL.md +20 -1
- package/platforms/codex/skills/save-session-summary/SKILL.md +28 -29
- package/platforms/codex/skills/set-workspace/SKILL.md +25 -41
- package/skills/clear-assignment/SKILL.md +2 -2
- package/skills/log-progress/SKILL.md +29 -48
- package/skills/plan-assignment/SKILL.md +20 -1
- package/skills/save-session-summary/SKILL.md +28 -29
- package/skills/set-workspace/SKILL.md +25 -41
- package/dashboard/dist/assets/channel-D41AslDq.js +0 -1
- package/dashboard/dist/assets/classDiagram-VBA2DB6C-BnKy62Yt.js +0 -1
- package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-BnKy62Yt.js +0 -1
- package/dashboard/dist/assets/clone-Cz7h9axV.js +0 -1
- package/dashboard/dist/assets/index-Ds1-e_jv.css +0 -1
- 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.
|
|
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",
|
package/platforms/README.md
CHANGED
|
@@ -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).
|
|
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
|
-
|
|
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.
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
59
|
-
|
|
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:
|
|
64
|
+
## Step 3: Log the entry via the CLI
|
|
62
65
|
|
|
63
|
-
|
|
66
|
+
Run:
|
|
64
67
|
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
>
|
|
107
|
-
>
|
|
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
|
|
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
|
-
|
|
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:
|
|
39
|
+
## Step 2: Author the summary body
|
|
40
40
|
|
|
41
|
-
|
|
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 body — be 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
|
|
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
|
|
102
|
+
## Step 5: Append a Progress Entry (optional but recommended)
|
|
104
103
|
|
|
105
|
-
If progress hasn't already been logged in this turn,
|
|
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
|
|
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:
|
|
44
|
+
## Step 2: Gather inputs
|
|
45
45
|
|
|
46
|
-
|
|
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
|
|
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
|
|
61
|
+
## Step 3: Write via the CLI
|
|
74
62
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
86
|
-
|
|
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
|
-
|
|
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
|
-
|
|
99
|
-
|
|
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
|
|
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).
|
|
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
|
-
|
|
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.
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
59
|
-
|
|
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:
|
|
64
|
+
## Step 3: Log the entry via the CLI
|
|
62
65
|
|
|
63
|
-
|
|
66
|
+
Run:
|
|
64
67
|
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
>
|
|
107
|
-
>
|
|
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
|
|
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
|
-
|
|
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.
|