syntaur 0.1.14 → 0.3.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/README.md +5 -0
- package/dashboard/dist/assets/{_basePickBy-eih-KlEh.js → _basePickBy-BhaCV7eH.js} +1 -1
- package/dashboard/dist/assets/{_baseUniq-M21wg9ZQ.js → _baseUniq-CDPcqrs2.js} +1 -1
- package/dashboard/dist/assets/{arc-uKZMelpQ.js → arc-BP0RxLwl.js} +1 -1
- package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-CpMG5exj.js → architectureDiagram-2XIMDMQ5-BDzvaeJp.js} +1 -1
- package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-BHnCCKl_.js → blockDiagram-WCTKOSBZ-ZeL9mROo.js} +1 -1
- package/dashboard/dist/assets/{c4Diagram-IC4MRINW-B-n3zU9i.js → c4Diagram-IC4MRINW-7S5bvFLp.js} +1 -1
- package/dashboard/dist/assets/channel-CcB_wcgb.js +1 -0
- package/dashboard/dist/assets/{chunk-4BX2VUAB-ChD9Iuih.js → chunk-4BX2VUAB-Ca7R4nv5.js} +1 -1
- package/dashboard/dist/assets/{chunk-55IACEB6-B3vP9Psg.js → chunk-55IACEB6-flEv13FB.js} +1 -1
- package/dashboard/dist/assets/{chunk-FMBD7UC4-CIhWgxPS.js → chunk-FMBD7UC4-CfcYWBM6.js} +1 -1
- package/dashboard/dist/assets/{chunk-JSJVCQXG-DiGIV_cB.js → chunk-JSJVCQXG-Dw4yL0VS.js} +1 -1
- package/dashboard/dist/assets/{chunk-KX2RTZJC-DnGsx5jo.js → chunk-KX2RTZJC-B2cDe40G.js} +1 -1
- package/dashboard/dist/assets/{chunk-NQ4KR5QH-BFBu1fmg.js → chunk-NQ4KR5QH-LZVm0IWg.js} +1 -1
- package/dashboard/dist/assets/{chunk-QZHKN3VN-DYtumHth.js → chunk-QZHKN3VN-Dg0EeHNI.js} +1 -1
- package/dashboard/dist/assets/{chunk-WL4C6EOR-BzCrQPuw.js → chunk-WL4C6EOR-v3rXNwXc.js} +1 -1
- package/dashboard/dist/assets/classDiagram-VBA2DB6C-BJr38z2g.js +1 -0
- package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-BJr38z2g.js +1 -0
- package/dashboard/dist/assets/clone-Cfs2GUGt.js +1 -0
- package/dashboard/dist/assets/{cose-bilkent-S5V4N54A-Bl8mb5eY.js → cose-bilkent-S5V4N54A-D-3JzLoS.js} +1 -1
- package/dashboard/dist/assets/{dagre-KLK3FWXG-BHffcOgo.js → dagre-KLK3FWXG-d_mbczhU.js} +1 -1
- package/dashboard/dist/assets/{diagram-E7M64L7V-Ib83qzT_.js → diagram-E7M64L7V-BUyAp8pW.js} +1 -1
- package/dashboard/dist/assets/{diagram-IFDJBPK2-hOdh63_T.js → diagram-IFDJBPK2-C8doXcyQ.js} +1 -1
- package/dashboard/dist/assets/{diagram-P4PSJMXO-D4ocLmc5.js → diagram-P4PSJMXO-BUSmHa55.js} +1 -1
- package/dashboard/dist/assets/{erDiagram-INFDFZHY-CHJ6zqnJ.js → erDiagram-INFDFZHY-Bn5_0LPU.js} +1 -1
- package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-DEz5g2Ye.js → flowDiagram-PKNHOUZH-CnEjerQM.js} +1 -1
- package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-BSftxDHA.js → ganttDiagram-A5KZAMGK-CL94fbyy.js} +1 -1
- package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-Cr3vGf07.js → gitGraphDiagram-K3NZZRJ6-4i_PeG8V.js} +1 -1
- package/dashboard/dist/assets/{graph-D4us8trI.js → graph-BtoFhoAd.js} +1 -1
- package/dashboard/dist/assets/index-DZUGYrvE.css +1 -0
- package/dashboard/dist/assets/index-Dv_-SxuL.js +481 -0
- package/dashboard/dist/assets/{infoDiagram-LFFYTUFH-CH_jVfru.js → infoDiagram-LFFYTUFH-CdUsuNgZ.js} +1 -1
- package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-BdKLa5GC.js → ishikawaDiagram-PHBUUO56-BjggRlUx.js} +1 -1
- package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-C_SMzNGF.js → journeyDiagram-4ABVD52K-V4AgexlR.js} +1 -1
- package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-BeA-egRW.js → kanban-definition-K7BYSVSG-ChlylQRf.js} +1 -1
- package/dashboard/dist/assets/{layout-B8tDmL4j.js → layout-DLcz9AmA.js} +1 -1
- package/dashboard/dist/assets/{linear-CeGJyrHS.js → linear-l2xnSHze.js} +1 -1
- package/dashboard/dist/assets/{mermaid.core-DyEs-LPd.js → mermaid.core-DKO1ytRW.js} +4 -4
- package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-DCxzAr8m.js → mindmap-definition-YRQLILUH-DTmTPHrT.js} +1 -1
- package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-CEj5dRDi.js → pieDiagram-SKSYHLDU-CwK80y8Y.js} +1 -1
- package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-CKfvAEQg.js → quadrantDiagram-337W2JSQ-Be1xqW_w.js} +1 -1
- package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-CTRqKPtJ.js → requirementDiagram-Z7DCOOCP-JcspXCs0.js} +1 -1
- package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-BlYbz8UR.js → sankeyDiagram-WA2Y5GQK-nJb1BInq.js} +1 -1
- package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-PT2t7ryQ.js → sequenceDiagram-2WXFIKYE-DUrclEgA.js} +1 -1
- package/dashboard/dist/assets/{stateDiagram-RAJIS63D-eDX7IUuV.js → stateDiagram-RAJIS63D-CjinnNtF.js} +1 -1
- package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-yfclw-nM.js +1 -0
- package/dashboard/dist/assets/{timeline-definition-YZTLITO2-By11B1Ow.js → timeline-definition-YZTLITO2-kM-oVLNz.js} +1 -1
- package/dashboard/dist/assets/{treemap-KZPCXAKY-rvdLeWWV.js → treemap-KZPCXAKY-CYziFlrQ.js} +1 -1
- package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-Br_oZ1wv.js → vennDiagram-LZ73GAT5-DX0DbxBN.js} +1 -1
- package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-D-MWVqrT.js → xychartDiagram-JWTSCODW-BGqM42ZM.js} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/dist/dashboard/server.d.ts +6 -1
- package/dist/dashboard/server.js +2427 -1089
- package/dist/dashboard/server.js.map +1 -1
- package/dist/index.js +6139 -2624
- package/dist/index.js.map +1 -1
- package/examples/playbooks/keep-records-updated.md +15 -9
- package/examples/playbooks/read-before-plan.md +13 -10
- package/examples/{sample-mission → sample-project}/_index-assignments.md +1 -1
- package/examples/{sample-mission → sample-project}/_index-decisions.md +1 -1
- package/examples/{sample-mission → sample-project}/_index-plans.md +1 -1
- package/examples/{sample-mission → sample-project}/_status.md +4 -4
- package/examples/{sample-mission → sample-project}/assignments/design-auth-schema/assignment.md +8 -18
- package/examples/sample-project/assignments/design-auth-schema/comments.md +26 -0
- package/examples/sample-project/assignments/design-auth-schema/progress.md +20 -0
- package/examples/{sample-mission → sample-project}/assignments/implement-jwt-middleware/assignment.md +8 -18
- package/examples/sample-project/assignments/implement-jwt-middleware/comments.md +17 -0
- package/examples/sample-project/assignments/implement-jwt-middleware/progress.md +20 -0
- package/examples/{sample-mission → sample-project}/assignments/write-auth-tests/assignment.md +8 -9
- package/examples/sample-project/assignments/write-auth-tests/comments.md +10 -0
- package/examples/sample-project/assignments/write-auth-tests/progress.md +10 -0
- package/examples/{sample-mission → sample-project}/manifest.md +3 -3
- package/examples/{sample-mission → sample-project}/memories/_index.md +2 -2
- package/examples/{sample-mission → sample-project}/memories/postgres-connection-pooling.md +1 -1
- package/examples/{sample-mission → sample-project}/resources/_index.md +1 -1
- package/package.json +5 -3
- package/platforms/README.md +7 -7
- package/platforms/claude-code/README.md +1 -1
- package/platforms/claude-code/agents/syntaur-expert.md +94 -66
- package/platforms/claude-code/commands/doctor-syntaur/doctor-syntaur.md +112 -0
- package/platforms/claude-code/commands/track-session/track-session.md +8 -8
- package/platforms/claude-code/hooks/enforce-boundaries.sh +4 -4
- package/platforms/claude-code/hooks/hooks.json +1 -1
- package/platforms/claude-code/hooks/session-cleanup.sh +5 -5
- package/platforms/claude-code/references/file-ownership.md +20 -8
- package/platforms/claude-code/references/protocol-summary.md +24 -9
- package/platforms/claude-code/skills/complete-assignment/SKILL.md +35 -17
- package/platforms/claude-code/skills/create-assignment/SKILL.md +22 -19
- package/platforms/claude-code/skills/grab-assignment/SKILL.md +56 -49
- package/platforms/claude-code/skills/plan-assignment/SKILL.md +57 -10
- package/platforms/claude-code/skills/syntaur-protocol/SKILL.md +38 -24
- package/platforms/codex/.codex-plugin/plugin.json +3 -3
- package/platforms/codex/README.md +1 -1
- package/platforms/codex/adapters/AGENTS.md.template +3 -3
- package/platforms/codex/agents/openai.yaml +2 -2
- package/platforms/codex/agents/syntaur-operator.md +58 -43
- package/platforms/codex/references/file-ownership.md +19 -8
- package/platforms/codex/references/protocol-summary.md +28 -9
- package/platforms/codex/scripts/enforce-boundaries.sh +2 -2
- package/platforms/codex/scripts/session-cleanup.sh +2 -2
- package/platforms/codex/skills/complete-assignment/SKILL.md +7 -6
- package/platforms/codex/skills/create-assignment/SKILL.md +18 -12
- package/platforms/codex/skills/grab-assignment/SKILL.md +30 -20
- package/platforms/codex/skills/plan-assignment/SKILL.md +19 -11
- package/platforms/codex/skills/syntaur-protocol/SKILL.md +46 -28
- package/platforms/cursor/README.md +1 -1
- package/platforms/cursor/adapters/syntaur-protocol.mdc +1 -1
- package/platforms/opencode/README.md +1 -1
- package/platforms/opencode/adapters/opencode.json.template +1 -1
- package/dashboard/dist/assets/channel-DVBgSlOI.js +0 -1
- package/dashboard/dist/assets/classDiagram-VBA2DB6C-B7dxBacd.js +0 -1
- package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-B7dxBacd.js +0 -1
- package/dashboard/dist/assets/clone-DAOrHcCC.js +0 -1
- package/dashboard/dist/assets/index-AXntWS_w.css +0 -1
- package/dashboard/dist/assets/index-CEMjexkj.js +0 -460
- package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO--yuSBnLh.js +0 -1
- package/examples/sample-mission/agent.md +0 -33
- package/examples/sample-mission/claude.md +0 -13
- package/platforms/claude-code/skills/create-mission/SKILL.md +0 -51
- package/platforms/codex/skills/create-mission/SKILL.md +0 -35
- /package/examples/{sample-mission → sample-project}/assignments/design-auth-schema/decision-record.md +0 -0
- /package/examples/{sample-mission → sample-project}/assignments/design-auth-schema/handoff.md +0 -0
- /package/examples/{sample-mission → sample-project}/assignments/design-auth-schema/plan.md +0 -0
- /package/examples/{sample-mission → sample-project}/assignments/design-auth-schema/scratchpad.md +0 -0
- /package/examples/{sample-mission → sample-project}/assignments/implement-jwt-middleware/decision-record.md +0 -0
- /package/examples/{sample-mission → sample-project}/assignments/implement-jwt-middleware/handoff.md +0 -0
- /package/examples/{sample-mission → sample-project}/assignments/implement-jwt-middleware/plan.md +0 -0
- /package/examples/{sample-mission → sample-project}/assignments/implement-jwt-middleware/scratchpad.md +0 -0
- /package/examples/{sample-mission → sample-project}/assignments/write-auth-tests/decision-record.md +0 -0
- /package/examples/{sample-mission → sample-project}/assignments/write-auth-tests/handoff.md +0 -0
- /package/examples/{sample-mission → sample-project}/assignments/write-auth-tests/plan.md +0 -0
- /package/examples/{sample-mission → sample-project}/assignments/write-auth-tests/scratchpad.md +0 -0
- /package/examples/{sample-mission/mission.md → sample-project/project.md} +0 -0
- /package/examples/{sample-mission → sample-project}/resources/auth-requirements.md +0 -0
|
@@ -6,7 +6,7 @@ model: opus
|
|
|
6
6
|
maxTurns: 20
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
You are the authoritative expert on the Syntaur platform — the markdown-based, filesystem-hosted protocol for multi-agent
|
|
9
|
+
You are the authoritative expert on the Syntaur platform — the markdown-based, filesystem-hosted protocol for multi-agent project coordination. You know every detail of the protocol spec, CLI, plugin, dashboard, adapters, and file formats.
|
|
10
10
|
|
|
11
11
|
When answering questions, read the actual source files rather than relying solely on this prompt. The codebase is your ground truth.
|
|
12
12
|
|
|
@@ -42,20 +42,20 @@ Syntaur is a **markdown-based, filesystem-hosted protocol** that coordinates wor
|
|
|
42
42
|
~/.syntaur/
|
|
43
43
|
config.md # Global config (optional)
|
|
44
44
|
syntaur.db # SQLite database for agent sessions
|
|
45
|
-
|
|
46
|
-
<
|
|
45
|
+
projects/
|
|
46
|
+
<project-slug>/
|
|
47
47
|
manifest.md # Derived: root navigation
|
|
48
|
-
|
|
49
|
-
agent.md # Human-authored: universal agent instructions
|
|
50
|
-
claude.md # Human-authored: Claude Code-specific instructions
|
|
48
|
+
project.md # Human-authored: goal, context, success criteria
|
|
51
49
|
_index-assignments.md # Derived: assignment summary table
|
|
52
50
|
_index-plans.md # Derived: plan status summary
|
|
53
51
|
_index-decisions.md # Derived: decision record summary
|
|
54
|
-
_status.md # Derived:
|
|
52
|
+
_status.md # Derived: project status rollup
|
|
55
53
|
assignments/
|
|
56
54
|
<assignment-slug>/
|
|
57
|
-
assignment.md # Agent-writable: source of truth for state
|
|
58
|
-
plan
|
|
55
|
+
assignment.md # Agent-writable: source of truth for state (includes ## Todos)
|
|
56
|
+
plan*.md # Agent-writable: versioned implementation plans (0+, optional)
|
|
57
|
+
progress.md # Agent-writable, append-only: timestamped progress log
|
|
58
|
+
comments.md # CLI-mediated: threaded questions/notes/feedback (via `syntaur comment`)
|
|
59
59
|
scratchpad.md # Agent-writable: working notes
|
|
60
60
|
handoff.md # Agent-writable: append-only handoff log
|
|
61
61
|
decision-record.md # Agent-writable: append-only decision log
|
|
@@ -65,6 +65,15 @@ Syntaur is a **markdown-based, filesystem-hosted protocol** that coordinates wor
|
|
|
65
65
|
memories/
|
|
66
66
|
_index.md # Derived
|
|
67
67
|
<memory-slug>.md # Shared-writable
|
|
68
|
+
assignments/
|
|
69
|
+
<assignment-id>/ # Standalone assignments — folder = UUID, project: null, slug display-only
|
|
70
|
+
assignment.md
|
|
71
|
+
plan*.md
|
|
72
|
+
progress.md
|
|
73
|
+
comments.md
|
|
74
|
+
scratchpad.md
|
|
75
|
+
handoff.md
|
|
76
|
+
decision-record.md
|
|
68
77
|
```
|
|
69
78
|
|
|
70
79
|
---
|
|
@@ -72,19 +81,22 @@ Syntaur is a **markdown-based, filesystem-hosted protocol** that coordinates wor
|
|
|
72
81
|
## File Ownership Model
|
|
73
82
|
|
|
74
83
|
### Human-Authored (READ-ONLY for agents)
|
|
75
|
-
- `
|
|
76
|
-
- `agent.md` — universal agent instructions
|
|
77
|
-
- `claude.md` — Claude Code-specific instructions
|
|
84
|
+
- `project.md` — project overview, goal, context, success criteria
|
|
78
85
|
|
|
79
86
|
### Agent-Writable (single-writer per assignment)
|
|
80
|
-
- `assignment.md` — source of truth for assignment state
|
|
81
|
-
- `plan
|
|
87
|
+
- `assignment.md` — source of truth for assignment state (includes `## Todos` checklist). `## Todos` is also the landing spot for cross-assignment requests.
|
|
88
|
+
- `plan*.md` — versioned implementation plans (optional, one per `## Todos` entry: `plan.md`, `plan-v2.md`, ...)
|
|
89
|
+
- `progress.md` — append-only timestamped progress log (newest first). Replaces the old `## Progress` body section.
|
|
82
90
|
- `scratchpad.md` — unstructured working notes
|
|
83
91
|
- `handoff.md` — append-only handoff log
|
|
84
92
|
- `decision-record.md` — append-only decision log
|
|
85
93
|
|
|
86
94
|
Only the assigned agent may write to its own assignment folder.
|
|
87
95
|
|
|
96
|
+
### CLI-Mediated Shared-Writable
|
|
97
|
+
- `comments.md` — threaded questions/notes/feedback. Writes via `syntaur comment <slug-or-uuid> "body" --type question|note|feedback [--reply-to <id>]`. Never edit directly.
|
|
98
|
+
- Another assignment's `## Todos` — writes via `syntaur request <source> <target> "text"`. Appends annotated `(from: <source>)`.
|
|
99
|
+
|
|
88
100
|
### Shared-Writable (any agent or human)
|
|
89
101
|
- `resources/<slug>.md` — reference material
|
|
90
102
|
- `memories/<slug>.md` — learnings discovered
|
|
@@ -128,8 +140,8 @@ Only the assigned agent may write to its own assignment folder.
|
|
|
128
140
|
- `pending` + unmet dependencies = structural wait (automatic, no action needed)
|
|
129
141
|
- `blocked` = runtime obstacle requiring human intervention (must set `blockedReason`)
|
|
130
142
|
|
|
131
|
-
###
|
|
132
|
-
1. `archived: true` in
|
|
143
|
+
### Project Status Rollup (computed, first-match-wins)
|
|
144
|
+
1. `archived: true` in project.md → `archived`
|
|
133
145
|
2. ALL assignments `completed` → `completed`
|
|
134
146
|
3. ANY `in_progress` or `review` → `active`
|
|
135
147
|
4. ANY `failed` → `failed`
|
|
@@ -151,31 +163,37 @@ Only the assigned agent may write to its own assignment folder.
|
|
|
151
163
|
| `syntaur setup-adapter <framework>` | Generate adapter files for cursor, codex, or opencode |
|
|
152
164
|
| `syntaur uninstall [--all]` | Remove plugins and optionally `~/.syntaur` data |
|
|
153
165
|
|
|
154
|
-
###
|
|
166
|
+
### Project & Assignment Creation
|
|
167
|
+
| Command | Description |
|
|
168
|
+
|---------|-------------|
|
|
169
|
+
| `syntaur create-project <title> [--slug S] [--dir D]` | Create new project with full scaffolding |
|
|
170
|
+
| `syntaur create-assignment <title> --project M [--priority P] [--depends-on D] [--slug S] [--type T]` | Create assignment in a project |
|
|
171
|
+
| `syntaur create-assignment <title> --one-off [--type T]` | Create standalone assignment at `~/.syntaur/assignments/<uuid>/` (project: null, slug display-only) |
|
|
172
|
+
|
|
173
|
+
### Coordination (CLI-mediated writes)
|
|
155
174
|
| Command | Description |
|
|
156
175
|
|---------|-------------|
|
|
157
|
-
| `syntaur
|
|
158
|
-
| `syntaur
|
|
159
|
-
| `syntaur create-assignment <title> --one-off` | Create standalone one-off assignment |
|
|
176
|
+
| `syntaur comment <slug-or-uuid> "body" --type question\|note\|feedback [--reply-to <id>] [--project <slug>]` | Append to `comments.md`. Questions carry a resolve flag toggleable in the dashboard. |
|
|
177
|
+
| `syntaur request <target> "text" [--from <source>] [--project <slug>]` | Append a todo to another assignment's `## Todos`, annotated `(from: <source>)`. |
|
|
160
178
|
|
|
161
179
|
### State Transitions
|
|
162
180
|
| Command | Description |
|
|
163
181
|
|---------|-------------|
|
|
164
|
-
| `syntaur assign <slug> --agent <name> --
|
|
165
|
-
| `syntaur start <slug> --
|
|
166
|
-
| `syntaur review <slug> --
|
|
167
|
-
| `syntaur complete <slug> --
|
|
168
|
-
| `syntaur block <slug> --
|
|
169
|
-
| `syntaur unblock <slug> --
|
|
170
|
-
| `syntaur fail <slug> --
|
|
171
|
-
| `syntaur reopen <slug> --
|
|
182
|
+
| `syntaur assign <slug> --agent <name> --project <project>` | Set assignee |
|
|
183
|
+
| `syntaur start <slug> --project <project>` | pending → in_progress |
|
|
184
|
+
| `syntaur review <slug> --project <project>` | in_progress → review |
|
|
185
|
+
| `syntaur complete <slug> --project <project>` | in_progress/review → completed |
|
|
186
|
+
| `syntaur block <slug> --project <project> --reason <text>` | → blocked |
|
|
187
|
+
| `syntaur unblock <slug> --project <project>` | blocked → in_progress |
|
|
188
|
+
| `syntaur fail <slug> --project <project>` | → failed |
|
|
189
|
+
| `syntaur reopen <slug> --project <project>` | completed/failed → in_progress |
|
|
172
190
|
|
|
173
191
|
### Session Tracking
|
|
174
192
|
| Command | Description |
|
|
175
193
|
|---------|-------------|
|
|
176
|
-
| `syntaur track-session --
|
|
194
|
+
| `syntaur track-session --project M --assignment A --agent N` | Register agent session |
|
|
177
195
|
|
|
178
|
-
All commands support `--dir <path>` to override the default `~/.syntaur/
|
|
196
|
+
All commands support `--dir <path>` to override the default `~/.syntaur/projects/` directory.
|
|
179
197
|
|
|
180
198
|
---
|
|
181
199
|
|
|
@@ -192,7 +210,7 @@ plugin/
|
|
|
192
210
|
skills/
|
|
193
211
|
syntaur-protocol/SKILL.md # Core protocol rules (background)
|
|
194
212
|
grab-assignment/SKILL.md # Claim a pending assignment
|
|
195
|
-
create-
|
|
213
|
+
create-project/SKILL.md # Create new project
|
|
196
214
|
create-assignment/SKILL.md # Create new assignment
|
|
197
215
|
plan-assignment/SKILL.md # Write implementation plan
|
|
198
216
|
complete-assignment/SKILL.md # Handoff and complete
|
|
@@ -212,17 +230,17 @@ plugin/
|
|
|
212
230
|
| Skill | Trigger | Purpose |
|
|
213
231
|
|-------|---------|---------|
|
|
214
232
|
| `/syntaur-protocol` | Background — auto-loaded when working with Syntaur files | Core write boundary rules and protocol knowledge |
|
|
215
|
-
| `/grab-assignment` | User says "grab assignment" or starts work on a
|
|
216
|
-
| `/create-
|
|
217
|
-
| `/create-assignment` | User wants to add an assignment to a
|
|
218
|
-
| `/plan-assignment` | User wants to plan current assignment | Explore workspace, write
|
|
233
|
+
| `/grab-assignment` | User says "grab assignment" or starts work on a project | Discover pending assignments, claim one, create context.json |
|
|
234
|
+
| `/create-project` | User wants to create a new project | Run CLI scaffolding, guide through editing project files |
|
|
235
|
+
| `/create-assignment` | User wants to add an assignment to a project | Create assignment with all supporting files |
|
|
236
|
+
| `/plan-assignment` | User wants to plan current assignment | Explore workspace, write the next `plan-v<N>.md`, append a linked todo to `## Todos` (supersede prior plan todo) |
|
|
219
237
|
| `/complete-assignment` | User is done with assignment work | Verify criteria, write handoff, transition state, close session |
|
|
220
238
|
|
|
221
239
|
### Hooks
|
|
222
240
|
|
|
223
241
|
| Hook | Event | Behavior |
|
|
224
242
|
|------|-------|----------|
|
|
225
|
-
| PostToolUse: ExitPlanMode | User exits plan mode | Prompts to
|
|
243
|
+
| PostToolUse: ExitPlanMode | User exits plan mode | Prompts to write the plan to the next unused `plan-v<N>.md` (or `plan.md` if none exists) and append a linked todo in the `## Todos` section of `assignment.md` |
|
|
226
244
|
| SessionEnd | Claude Code session exits | Runs session-cleanup.sh to mark session as stopped |
|
|
227
245
|
| PreToolUse: enforce-boundaries | Edit/Write/MultiEdit | Validates target path is within assignment boundaries |
|
|
228
246
|
|
|
@@ -240,27 +258,27 @@ syntaur # Dashboard is the default command
|
|
|
240
258
|
```
|
|
241
259
|
|
|
242
260
|
### Features
|
|
243
|
-
- **Overview page:**
|
|
244
|
-
- **
|
|
261
|
+
- **Overview page:** Project stats, quick actions, attention items
|
|
262
|
+
- **Project detail:** Assignment listing, resources, memories, status
|
|
245
263
|
- **Assignment detail:** Full assignment view with all fields, criteria checklist
|
|
246
264
|
- **Kanban board:** Drag assignments between status columns
|
|
247
265
|
- **Agent sessions:** Track active/completed/stopped agent sessions
|
|
248
266
|
- **Server tracking:** Discover running dev servers via tmux session scanning
|
|
249
267
|
- **Real-time updates:** WebSocket pushes file changes to the browser
|
|
250
|
-
- **Markdown editing:** Edit
|
|
268
|
+
- **Markdown editing:** Edit project.md, assignment.md, plan files, scratchpad.md in-browser
|
|
251
269
|
- **Attention queue:** Highlights blocked, failed, and review-pending items
|
|
252
270
|
|
|
253
271
|
### API Endpoints
|
|
254
272
|
- `GET /api/overview` — Dashboard summary stats
|
|
255
|
-
- `GET /api/
|
|
256
|
-
- `GET /api/
|
|
257
|
-
- `GET /api/
|
|
258
|
-
- `GET /api/assignments` — All assignments across
|
|
273
|
+
- `GET /api/projects` — List all projects
|
|
274
|
+
- `GET /api/projects/:slug` — Project detail with assignments
|
|
275
|
+
- `GET /api/projects/:slug/assignments/:aslug` — Assignment detail
|
|
276
|
+
- `GET /api/assignments` — All assignments across projects
|
|
259
277
|
- `GET /api/attention` — Items needing attention
|
|
260
278
|
- `GET /api/agent-sessions` — Agent session list
|
|
261
|
-
- `POST /api/
|
|
262
|
-
- `POST /api/
|
|
263
|
-
- `PATCH /api/
|
|
279
|
+
- `POST /api/projects` — Create project
|
|
280
|
+
- `POST /api/projects/:slug/assignments` — Create assignment
|
|
281
|
+
- `PATCH /api/projects/:slug/assignments/:aslug` — Update assignment
|
|
264
282
|
- WebSocket at `/ws` for real-time file change notifications
|
|
265
283
|
|
|
266
284
|
### Architecture
|
|
@@ -276,9 +294,9 @@ syntaur # Dashboard is the default command
|
|
|
276
294
|
Syntaur supports Cursor, Codex, and OpenCode via generated adapter files.
|
|
277
295
|
|
|
278
296
|
```bash
|
|
279
|
-
syntaur setup-adapter cursor --
|
|
280
|
-
syntaur setup-adapter codex --
|
|
281
|
-
syntaur setup-adapter opencode --
|
|
297
|
+
syntaur setup-adapter cursor --project <slug> --assignment <slug>
|
|
298
|
+
syntaur setup-adapter codex --project <slug> --assignment <slug>
|
|
299
|
+
syntaur setup-adapter opencode --project <slug> --assignment <slug>
|
|
282
300
|
```
|
|
283
301
|
|
|
284
302
|
| Framework | Generated Files | Discovery |
|
|
@@ -295,25 +313,29 @@ Adapters embed protocol knowledge (write boundaries, lifecycle states, CLI comma
|
|
|
295
313
|
|
|
296
314
|
### Frontmatter Fields by File Type
|
|
297
315
|
|
|
298
|
-
**assignment.md:** id, slug, title, status, priority, created, updated, assignee, externalIds, dependsOn, blockedReason, workspace (repository, worktreePath, branch, parentBranch), tags
|
|
316
|
+
**assignment.md:** id, slug, title, **project (slug or null)**, **type (string or null)**, status, priority, created, updated, assignee, externalIds, dependsOn, blockedReason, workspace (repository, worktreePath, branch, parentBranch), tags
|
|
299
317
|
|
|
300
|
-
**plan.md:** assignment, status (draft/approved/in_progress/completed), created, updated
|
|
318
|
+
**plan files (plan.md, plan-v2.md, ...):** assignment, status (draft/approved/in_progress/completed), created, updated — zero or more per assignment, each linked from a todo in `assignment.md`'s `## Todos` section
|
|
319
|
+
|
|
320
|
+
**progress.md:** assignment, entryCount, generated, updated — body is reverse-chron `## <timestamp>` entries
|
|
321
|
+
|
|
322
|
+
**comments.md:** assignment, entryCount, generated, updated — body entries are `## <id>` with structured metadata lines (Recorded, Author, Type, optional Reply to, optional Resolved)
|
|
301
323
|
|
|
302
324
|
**handoff.md:** assignment, updated, handoffCount
|
|
303
325
|
|
|
304
326
|
**decision-record.md:** assignment, updated, decisionCount
|
|
305
327
|
|
|
306
|
-
**
|
|
328
|
+
**project.md:** id, slug, title, archived, archivedAt, archivedReason, created, updated, externalIds, tags
|
|
307
329
|
|
|
308
|
-
**manifest.md:** version,
|
|
330
|
+
**manifest.md:** version, project, generated
|
|
309
331
|
|
|
310
|
-
**_status.md:**
|
|
332
|
+
**_status.md:** project, generated, status, progress (total/completed/in_progress/blocked/pending/review/failed), needsAttention (blockedCount/failedCount/**openQuestions**). `openQuestions` is counted from every assignment's `comments.md` (entries where `Type: question` and `Resolved: false` or absent).
|
|
311
333
|
|
|
312
334
|
### Conventions
|
|
313
335
|
- **Timestamps:** RFC 3339 / ISO 8601 with UTC: `2026-03-18T14:30:00Z`
|
|
314
336
|
- **Paths:** Absolute expanded form in YAML (never `~`), relative in markdown links
|
|
315
|
-
- **Slugs:** Lowercase, hyphen-separated, match folder names
|
|
316
|
-
- **Protocol version:** `"
|
|
337
|
+
- **Slugs:** Lowercase, hyphen-separated, match folder names (project-nested). For standalone assignments, the folder is named by UUID and `slug` is display-only.
|
|
338
|
+
- **Protocol version:** `"2.0"` (string, not number)
|
|
317
339
|
|
|
318
340
|
---
|
|
319
341
|
|
|
@@ -324,12 +346,12 @@ Adapters embed protocol knowledge (write boundaries, lifecycle states, CLI comma
|
|
|
324
346
|
# 1. Run guided setup
|
|
325
347
|
npx syntaur@latest setup
|
|
326
348
|
|
|
327
|
-
# 2. Create your first
|
|
328
|
-
syntaur create-
|
|
349
|
+
# 2. Create your first project
|
|
350
|
+
syntaur create-project "My First Project"
|
|
329
351
|
|
|
330
352
|
# 3. Create assignments
|
|
331
|
-
syntaur create-assignment "Design the schema" --
|
|
332
|
-
syntaur create-assignment "Implement the API" --
|
|
353
|
+
syntaur create-assignment "Design the schema" --project my-first-project --priority high
|
|
354
|
+
syntaur create-assignment "Implement the API" --project my-first-project --depends-on design-the-schema
|
|
333
355
|
|
|
334
356
|
# 4. Start the dashboard
|
|
335
357
|
syntaur dashboard
|
|
@@ -338,7 +360,7 @@ syntaur dashboard
|
|
|
338
360
|
### Agent Workflow
|
|
339
361
|
```bash
|
|
340
362
|
# In Claude Code, use skills:
|
|
341
|
-
/grab-assignment my-first-
|
|
363
|
+
/grab-assignment my-first-project # Claim a pending assignment
|
|
342
364
|
/plan-assignment # Write implementation plan
|
|
343
365
|
# ... do the work ...
|
|
344
366
|
/complete-assignment # Handoff and complete
|
|
@@ -351,10 +373,10 @@ syntaur dashboard
|
|
|
351
373
|
Created by `/grab-assignment` in the current working directory. Contains:
|
|
352
374
|
```json
|
|
353
375
|
{
|
|
354
|
-
"
|
|
376
|
+
"projectSlug": "my-first-project",
|
|
355
377
|
"assignmentSlug": "design-the-schema",
|
|
356
|
-
"
|
|
357
|
-
"assignmentDir": "/Users/you/.syntaur/
|
|
378
|
+
"projectDir": "/Users/you/.syntaur/projects/my-first-project",
|
|
379
|
+
"assignmentDir": "/Users/you/.syntaur/projects/my-first-project/assignments/design-the-schema",
|
|
358
380
|
"workspaceRoot": "/Users/you/projects/my-app",
|
|
359
381
|
"title": "Design the schema",
|
|
360
382
|
"branch": "feature/design-the-schema",
|
|
@@ -370,13 +392,19 @@ Read by `/plan-assignment`, `/complete-assignment`, and the write boundary hook
|
|
|
370
392
|
## Common Questions
|
|
371
393
|
|
|
372
394
|
**Q: How do I see what assignments are available?**
|
|
373
|
-
A: Use `/grab-assignment <
|
|
395
|
+
A: Use `/grab-assignment <project-slug>` — it lists pending assignments. Or check the dashboard, or read `_index-assignments.md`.
|
|
374
396
|
|
|
375
397
|
**Q: Can two agents work on the same assignment?**
|
|
376
398
|
A: No. Single-writer guarantee — one agent per assignment folder. Use separate assignments for parallel work.
|
|
377
399
|
|
|
378
400
|
**Q: What if I need to ask the human a question?**
|
|
379
|
-
A:
|
|
401
|
+
A: Run `syntaur comment <slug> "question text" --type question`. It appends to `comments.md`, which replaces the old `## Questions & Answers` body section. The question rolls up into `_status.md`'s `openQuestions` counter and shows on the dashboard. Do NOT set status to `blocked` for questions — `blocked` is for runtime obstacles only.
|
|
402
|
+
|
|
403
|
+
**Q: What goes in `progress.md` vs `handoff.md`?**
|
|
404
|
+
A: `progress.md` is a continuous reverse-chron log of what you've done — append an entry per meaningful work unit. `handoff.md` is only written when you hand off work (to another agent or human), and summarizes the state at that transition.
|
|
405
|
+
|
|
406
|
+
**Q: How do I route work to another assignment without breaking the single-writer rule?**
|
|
407
|
+
A: Run `syntaur request <target> "text"` — it appends a todo to the target's `## Todos` annotated `(from: <source>)`. This is a CLI-mediated exception to the single-writer rule.
|
|
380
408
|
|
|
381
409
|
**Q: How do indexes get updated?**
|
|
382
410
|
A: Derived files are rebuilt by tooling. They are projections of assignment frontmatter. When divergence occurs, re-run rebuild.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: doctor-syntaur
|
|
3
|
+
description: Diagnose and help recover from common Syntaur bad states
|
|
4
|
+
arguments:
|
|
5
|
+
- name: args
|
|
6
|
+
description: "Optional flags: --verbose, --only <check-id>"
|
|
7
|
+
required: false
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# /doctor-syntaur
|
|
11
|
+
|
|
12
|
+
Run `syntaur doctor` and help the user interpret the results, remediating issues where appropriate. Respect Syntaur write boundaries throughout.
|
|
13
|
+
|
|
14
|
+
## Usage
|
|
15
|
+
|
|
16
|
+
- `/doctor-syntaur` — run all checks
|
|
17
|
+
- `/doctor-syntaur --verbose` — include passing checks in the summary
|
|
18
|
+
- `/doctor-syntaur --only <check-id>` — re-run one check after remediation (e.g. `--only assignment.workspace-missing`)
|
|
19
|
+
|
|
20
|
+
## Instructions
|
|
21
|
+
|
|
22
|
+
When the user runs this command:
|
|
23
|
+
|
|
24
|
+
### Step 1: Parse arguments
|
|
25
|
+
|
|
26
|
+
From the argument string, extract optional flags:
|
|
27
|
+
|
|
28
|
+
- `--verbose` — pass through to the CLI and include passing checks in the summary
|
|
29
|
+
- `--only <check-id>` — pass through to the CLI to restrict to a single check
|
|
30
|
+
|
|
31
|
+
### Step 2: Run the CLI and capture output + exit code
|
|
32
|
+
|
|
33
|
+
Exit code 1 is expected (means issues were found). Do NOT let a non-zero exit fail the turn. Use a pattern like:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
output=$(syntaur doctor --json [--only <check-id>] 2>&1); exit_code=$?
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Then parse `$output` as JSON. If the JSON fails to parse, surface the raw output — that means the CLI itself broke.
|
|
40
|
+
|
|
41
|
+
### Step 3: Handle exit codes and severity
|
|
42
|
+
|
|
43
|
+
- **Exit 2** — Syntaur isn't initialized. Tell the user to run `syntaur init` and stop.
|
|
44
|
+
- **Exit 1** (one or more errors) — continue to step 4; report both errors and warnings.
|
|
45
|
+
- **Exit 0 and `summary.warn === 0`** — everything passed. Say so in one line (e.g. "All checks passed — no issues found.") and stop.
|
|
46
|
+
- **Exit 0 and `summary.warn > 0`** — no errors but warnings exist. Continue to step 4; report the warnings. The CLI only exits 1 on errors, so warn-only runs still need to be surfaced to the user.
|
|
47
|
+
|
|
48
|
+
### Step 4: Summarize results
|
|
49
|
+
|
|
50
|
+
Group the `checks` array from the JSON by `category`. For each category:
|
|
51
|
+
|
|
52
|
+
- Show errors first, then warnings.
|
|
53
|
+
- Skip passes unless `--verbose` was passed.
|
|
54
|
+
- Always include the `check.id` so the user can reference a specific issue in follow-up.
|
|
55
|
+
|
|
56
|
+
Format each issue like:
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
[category] check.id — title
|
|
60
|
+
detail line
|
|
61
|
+
affected: path (truncate long lists)
|
|
62
|
+
fix: remediation.suggestion
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Step 5: Establish your write boundary (before offering any edit)
|
|
66
|
+
|
|
67
|
+
Doctor reports issues from anywhere under `~/.syntaur/`. You are NOT allowed to edit most of those files. Before offering any remediation edit, compute your current write boundary:
|
|
68
|
+
|
|
69
|
+
1. Read `.syntaur/context.json` in the current working directory (the same `cwd` you ran the CLI from).
|
|
70
|
+
2. If the file does not exist, or exists but has no assignment fields (`projectSlug`, `assignmentSlug`, `projectDir`, `assignmentDir`):
|
|
71
|
+
- You have NO assignment context.
|
|
72
|
+
- Your only permitted edit target is the literal file `<cwd>/.syntaur/context.json` itself.
|
|
73
|
+
- For every other issue, show the `suggestion` text verbatim and do NOT offer to edit.
|
|
74
|
+
3. If the file has assignment fields, record these paths:
|
|
75
|
+
- `assignmentDir` — your per-assignment write zone.
|
|
76
|
+
- `workspaceRoot` — your code write zone (may be absent).
|
|
77
|
+
- `<cwd>/.syntaur/context.json` — always editable.
|
|
78
|
+
|
|
79
|
+
### Step 6: Offer remediation (issue by issue)
|
|
80
|
+
|
|
81
|
+
For each error or warning, determine what kind of offer is appropriate.
|
|
82
|
+
|
|
83
|
+
**First, use `remediation.kind`:**
|
|
84
|
+
|
|
85
|
+
- **`auto-safe`** — offer to run `syntaur doctor --fix --only <id>`. Ask the user to confirm before running. (v1 has no auto-safe remediations yet — this is a placeholder for future versions.)
|
|
86
|
+
- **`auto-destructive`** — never auto-run. Describe the impact and wait for the user.
|
|
87
|
+
- **`manual`** — apply the path check below before offering an edit.
|
|
88
|
+
|
|
89
|
+
**For `manual` remediations, compare each path in `affected[]` against your boundary from Step 5:**
|
|
90
|
+
|
|
91
|
+
1. Let `allowed = [assignmentDir, workspaceRoot, <cwd>/.syntaur/context.json]` (dropping any undefined entries).
|
|
92
|
+
2. A path is within boundary if and only if it equals `<cwd>/.syntaur/context.json` OR it is a strict path-prefix descendant of `assignmentDir` or `workspaceRoot`. Use path-segment comparison, not substring matching.
|
|
93
|
+
3. If **every** path in `affected[]` is within boundary, you may offer to make the edit. Show a diff first; wait for confirmation; then write.
|
|
94
|
+
4. If **any** path in `affected[]` is outside your boundary, do NOT offer to edit. Show the `suggestion` text verbatim and tell the user they or another tool must apply it.
|
|
95
|
+
|
|
96
|
+
**Hard stop list — never write to these regardless of what doctor reports:**
|
|
97
|
+
|
|
98
|
+
- `project.md`, `agent.md`, `claude.md`, `manifest.md`, `_status.md`
|
|
99
|
+
- Any file starting with `_index-` or ending in `_index.md`
|
|
100
|
+
- Any file in a project's `resources/` or `memories/` directory
|
|
101
|
+
- Any file inside a different assignment's folder (i.e. `projects/<m>/assignments/<other>/...` where `<other> !== assignmentSlug`)
|
|
102
|
+
|
|
103
|
+
### Step 7: Suggest a follow-up
|
|
104
|
+
|
|
105
|
+
After proposing fixes, suggest the user re-run `/doctor-syntaur --only <check-id>` (or the whole command) to verify that issues resolved.
|
|
106
|
+
|
|
107
|
+
## Guardrails
|
|
108
|
+
|
|
109
|
+
- Always invoke `syntaur doctor --json`. Do not re-derive checks from the filesystem yourself.
|
|
110
|
+
- Never pass `--fix` without explicit user confirmation.
|
|
111
|
+
- Always show each issue's `check.id` so the user can reference it.
|
|
112
|
+
- If the CLI output isn't valid JSON, show the raw output and stop — something is wrong with the install.
|
|
@@ -3,20 +3,20 @@ name: track-session
|
|
|
3
3
|
description: Register this Claude Code session as an agent session in the Syntaur dashboard
|
|
4
4
|
arguments:
|
|
5
5
|
- name: args
|
|
6
|
-
description: "Optional flags: --description, --
|
|
6
|
+
description: "Optional flags: --description, --project, --assignment"
|
|
7
7
|
required: false
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# /track-session
|
|
11
11
|
|
|
12
|
-
Register the current Claude Code session as an agent session in the Syntaur dashboard. Works standalone or linked to a
|
|
12
|
+
Register the current Claude Code session as an agent session in the Syntaur dashboard. Works standalone or linked to a project/assignment.
|
|
13
13
|
|
|
14
14
|
## Usage
|
|
15
15
|
|
|
16
16
|
- `/track-session` — register a standalone session
|
|
17
17
|
- `/track-session --description "exploring auth patterns"` — with a description
|
|
18
|
-
- `/track-session --
|
|
19
|
-
- `/track-session --description "auth work" --
|
|
18
|
+
- `/track-session --project <slug> --assignment <slug>` — linked to a project
|
|
19
|
+
- `/track-session --description "auth work" --project <slug> --assignment <slug>` — both
|
|
20
20
|
|
|
21
21
|
## Instructions
|
|
22
22
|
|
|
@@ -26,7 +26,7 @@ When the user runs this command:
|
|
|
26
26
|
|
|
27
27
|
Extract optional flags from the argument string:
|
|
28
28
|
- `--description "<text>"` or `--description <text>` — session description
|
|
29
|
-
- `--
|
|
29
|
+
- `--project <slug>` — project to link to
|
|
30
30
|
- `--assignment <slug>` — assignment to link to
|
|
31
31
|
|
|
32
32
|
### Step 2: Run the CLI command
|
|
@@ -34,14 +34,14 @@ Extract optional flags from the argument string:
|
|
|
34
34
|
Run the track-session CLI command via Bash (use `dangerouslyDisableSandbox: true` since it writes to `~/.syntaur/`):
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
syntaur track-session --agent claude --path $(pwd) [--description "<text>"] [--
|
|
37
|
+
syntaur track-session --agent claude --path $(pwd) [--description "<text>"] [--project <slug>] [--assignment <slug>]
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
### Step 3: Parse the session ID
|
|
41
41
|
|
|
42
42
|
The CLI output will be one of:
|
|
43
43
|
- `Registered standalone agent session <sessionId>.`
|
|
44
|
-
- `Registered agent session <sessionId> for <assignment> in <
|
|
44
|
+
- `Registered agent session <sessionId> for <assignment> in <project>.`
|
|
45
45
|
|
|
46
46
|
Extract the session ID from the output.
|
|
47
47
|
|
|
@@ -62,4 +62,4 @@ Write the session ID to `.syntaur/context.json` so the SessionEnd hook can mark
|
|
|
62
62
|
Tell the user:
|
|
63
63
|
- The session was registered (include the short session ID)
|
|
64
64
|
- It will be auto-stopped when this conversation ends
|
|
65
|
-
- If linked to a
|
|
65
|
+
- If linked to a project, mention which project/assignment
|
|
@@ -64,7 +64,7 @@ fi
|
|
|
64
64
|
|
|
65
65
|
# --- Step 8: Read context ---
|
|
66
66
|
ASSIGNMENT_DIR=$(jq -r '.assignmentDir // empty' "$CONTEXT_FILE" 2>/dev/null)
|
|
67
|
-
MISSION_DIR=$(jq -r '.
|
|
67
|
+
MISSION_DIR=$(jq -r '.projectDir // empty' "$CONTEXT_FILE" 2>/dev/null)
|
|
68
68
|
WORKSPACE_ROOT=$(jq -r '.workspaceRoot // empty' "$CONTEXT_FILE" 2>/dev/null)
|
|
69
69
|
|
|
70
70
|
if [ -z "$ASSIGNMENT_DIR" ] || [ -z "$MISSION_DIR" ]; then
|
|
@@ -88,7 +88,7 @@ if [[ "$FILE_PATH" == "$ASSIGNMENT_DIR"/* ]]; then
|
|
|
88
88
|
allow_and_exit
|
|
89
89
|
fi
|
|
90
90
|
|
|
91
|
-
# Allow: files in
|
|
91
|
+
# Allow: files in project resources/ directory (but NOT derived _index.md)
|
|
92
92
|
if [[ "$FILE_PATH" == "$MISSION_DIR/resources/"* ]]; then
|
|
93
93
|
BASENAME=$(basename "$FILE_PATH")
|
|
94
94
|
if [[ "$BASENAME" == _* ]]; then
|
|
@@ -99,7 +99,7 @@ if [[ "$FILE_PATH" == "$MISSION_DIR/resources/"* ]]; then
|
|
|
99
99
|
fi
|
|
100
100
|
fi
|
|
101
101
|
|
|
102
|
-
# Allow: files in
|
|
102
|
+
# Allow: files in project memories/ directory (but NOT derived _index.md)
|
|
103
103
|
if [[ "$FILE_PATH" == "$MISSION_DIR/memories/"* ]]; then
|
|
104
104
|
BASENAME=$(basename "$FILE_PATH")
|
|
105
105
|
if [[ "$BASENAME" == _* ]]; then
|
|
@@ -122,7 +122,7 @@ if [ -n "$WORKSPACE_ROOT" ] && [[ "$FILE_PATH" == "$WORKSPACE_ROOT"/* ]]; then
|
|
|
122
122
|
fi
|
|
123
123
|
|
|
124
124
|
# --- Step 11: Block the write ---
|
|
125
|
-
REASON="Syntaur write boundary violation: Cannot write to '$FILE_PATH'. Allowed paths: assignment dir ($ASSIGNMENT_DIR),
|
|
125
|
+
REASON="Syntaur write boundary violation: Cannot write to '$FILE_PATH'. Allowed paths: assignment dir ($ASSIGNMENT_DIR), project resources/memories, workspace ($WORKSPACE_ROOT)."
|
|
126
126
|
|
|
127
127
|
# Escape for JSON
|
|
128
128
|
REASON_ESCAPED=$(echo "$REASON" | jq -Rs '.' 2>/dev/null)
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"hooks": [
|
|
8
8
|
{
|
|
9
9
|
"type": "prompt",
|
|
10
|
-
"prompt": "You just exited plan mode. If there is an active Syntaur assignment (check for a workspace field in assignment.md),
|
|
10
|
+
"prompt": "You just exited plan mode. If there is an active Syntaur assignment (check for a workspace field in assignment.md), pick the next unused `plan-v<N>.md` filename (or `plan.md` if no plan*.md exists yet) under the assignment dir, write the plan you just created there, and append a `- [ ] Execute [plan](./plan.md)` (or versioned equivalent, e.g. `- [ ] Execute [plan v2](./plan-v2.md)`) entry to the `## Todos` section of assignment.md — marking any prior active plan todo as superseded (`- [x] ~~...~~ (superseded by plan-v<N>)`). Never delete superseded todos."
|
|
11
11
|
}
|
|
12
12
|
]
|
|
13
13
|
}
|
|
@@ -31,14 +31,14 @@ fi
|
|
|
31
31
|
|
|
32
32
|
# --- Step 4: Extract context info ---
|
|
33
33
|
SESSION_ID=$(jq -r '.sessionId // empty' "$CONTEXT_FILE" 2>/dev/null)
|
|
34
|
-
MISSION_SLUG=$(jq -r '.
|
|
34
|
+
MISSION_SLUG=$(jq -r '.projectSlug // empty' "$CONTEXT_FILE" 2>/dev/null)
|
|
35
35
|
ASSIGNMENT_SLUG=$(jq -r '.assignmentSlug // empty' "$CONTEXT_FILE" 2>/dev/null)
|
|
36
36
|
|
|
37
37
|
PORT=$(cat "$HOME/.syntaur/dashboard-port" 2>/dev/null || echo "4800")
|
|
38
38
|
|
|
39
|
-
# --- Step 5: If no session was registered, try to auto-register (requires
|
|
39
|
+
# --- Step 5: If no session was registered, try to auto-register (requires project+assignment) ---
|
|
40
40
|
if [ -z "$SESSION_ID" ]; then
|
|
41
|
-
# Can only auto-register if we have
|
|
41
|
+
# Can only auto-register if we have project and assignment context
|
|
42
42
|
if [ -z "$MISSION_SLUG" ] || [ -z "$ASSIGNMENT_SLUG" ]; then
|
|
43
43
|
exit 0
|
|
44
44
|
fi
|
|
@@ -50,7 +50,7 @@ if [ -z "$SESSION_ID" ]; then
|
|
|
50
50
|
|
|
51
51
|
RESPONSE=$(curl -sf -X POST "http://localhost:${PORT}/api/agent-sessions" \
|
|
52
52
|
-H "Content-Type: application/json" \
|
|
53
|
-
-d "{\"
|
|
53
|
+
-d "{\"projectSlug\": \"${MISSION_SLUG}\", \"assignmentSlug\": \"${ASSIGNMENT_SLUG}\", \"agent\": \"claude\", \"sessionId\": \"${SESSION_ID}\", \"path\": \"${CWD}\"}" \
|
|
54
54
|
2>/dev/null) || true
|
|
55
55
|
|
|
56
56
|
# If registration succeeded, update the context file with the session ID
|
|
@@ -63,7 +63,7 @@ fi
|
|
|
63
63
|
# --- Step 6: Mark session as stopped via dashboard API ---
|
|
64
64
|
BODY="{\"status\": \"stopped\"}"
|
|
65
65
|
if [ -n "$MISSION_SLUG" ]; then
|
|
66
|
-
BODY="{\"status\": \"stopped\", \"
|
|
66
|
+
BODY="{\"status\": \"stopped\", \"projectSlug\": \"${MISSION_SLUG}\"}"
|
|
67
67
|
fi
|
|
68
68
|
|
|
69
69
|
curl -sf -X PATCH "http://localhost:${PORT}/api/agent-sessions/${SESSION_ID}/status" \
|
|
@@ -6,9 +6,7 @@ Agents must NEVER modify these files:
|
|
|
6
6
|
|
|
7
7
|
| File | Location |
|
|
8
8
|
|------|----------|
|
|
9
|
-
| `
|
|
10
|
-
| `agent.md` | `<mission>/agent.md` |
|
|
11
|
-
| `claude.md` | `<mission>/claude.md` |
|
|
9
|
+
| `project.md` | `<project>/project.md` |
|
|
12
10
|
|
|
13
11
|
## Agent-Writable (YOUR assignment folder ONLY)
|
|
14
12
|
|
|
@@ -16,20 +14,34 @@ You may ONLY write to files inside your assigned assignment folder:
|
|
|
16
14
|
|
|
17
15
|
| File | Purpose |
|
|
18
16
|
|------|---------|
|
|
19
|
-
| `assignment.md` | Assignment record, source of truth for state |
|
|
20
|
-
| `plan
|
|
17
|
+
| `assignment.md` | Assignment record, source of truth for state (includes `## Todos` checklist) |
|
|
18
|
+
| `plan*.md` | Versioned implementation plans (optional, 0 or more: `plan.md`, `plan-v2.md`, ...) — each linked from a todo in `assignment.md` |
|
|
19
|
+
| `progress.md` | Append-only timestamped progress log (newest first). Replaces the old `## Progress` body section. |
|
|
21
20
|
| `scratchpad.md` | Working notes |
|
|
22
21
|
| `handoff.md` | Append-only handoff log |
|
|
23
22
|
| `decision-record.md` | Append-only decision log |
|
|
24
23
|
|
|
25
|
-
Path pattern: `~/.syntaur/
|
|
24
|
+
Path pattern (project-nested): `~/.syntaur/projects/<project>/assignments/<your-assignment>/`
|
|
25
|
+
Path pattern (standalone): `~/.syntaur/assignments/<your-assignment-uuid>/`
|
|
26
|
+
|
|
27
|
+
## CLI-Mediated Shared-Writable
|
|
28
|
+
|
|
29
|
+
Do NOT edit these files directly. Use the listed CLI commands:
|
|
30
|
+
|
|
31
|
+
| File | Mediator |
|
|
32
|
+
|------|----------|
|
|
33
|
+
| `comments.md` (any assignment) | `syntaur comment <slug-or-uuid> "body" [--type question\|note\|feedback] [--reply-to <id>]` |
|
|
34
|
+
| `## Todos` in another assignment's `assignment.md` (cross-assignment request) | `syntaur request <source> <target> "text"` |
|
|
35
|
+
| Question resolution | `PATCH /api/.../comments/:id/resolved` (dashboard) or toggle in dashboard UI |
|
|
36
|
+
|
|
37
|
+
These are bounded exceptions to the single-writer rule for assignment folders — the CLI serializes writes to avoid conflicts.
|
|
26
38
|
|
|
27
39
|
## Shared-Writable (any agent or human)
|
|
28
40
|
|
|
29
41
|
| Location | Purpose |
|
|
30
42
|
|----------|---------|
|
|
31
|
-
| `<
|
|
32
|
-
| `<
|
|
43
|
+
| `<project>/resources/<slug>.md` | Reference material |
|
|
44
|
+
| `<project>/memories/<slug>.md` | Learnings and patterns |
|
|
33
45
|
|
|
34
46
|
## Derived (NEVER edit)
|
|
35
47
|
|