syntaur 0.1.13 → 0.2.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-DXzhD14q.js → _basePickBy-CHKX1r7P.js} +1 -1
- package/dashboard/dist/assets/{_baseUniq-gxypqvP5.js → _baseUniq-CTxTc4MS.js} +1 -1
- package/dashboard/dist/assets/{arc-Ce7nYKSm.js → arc-BUo5zftd.js} +1 -1
- package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-zX4f4_Mf.js → architectureDiagram-2XIMDMQ5-CrJLm-P0.js} +1 -1
- package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-auOdy7nH.js → blockDiagram-WCTKOSBZ-BK60lBBJ.js} +1 -1
- package/dashboard/dist/assets/{c4Diagram-IC4MRINW-C2kkjPbW.js → c4Diagram-IC4MRINW-C7oJEvA0.js} +1 -1
- package/dashboard/dist/assets/channel-DdltvFFH.js +1 -0
- package/dashboard/dist/assets/{chunk-4BX2VUAB-B7dfpnbG.js → chunk-4BX2VUAB-CjUPlzHz.js} +1 -1
- package/dashboard/dist/assets/{chunk-55IACEB6-r1_jHZYp.js → chunk-55IACEB6-6HmWguiO.js} +1 -1
- package/dashboard/dist/assets/{chunk-FMBD7UC4-5mMONjMK.js → chunk-FMBD7UC4-CLuJnd1b.js} +1 -1
- package/dashboard/dist/assets/{chunk-JSJVCQXG-CwKj-Es4.js → chunk-JSJVCQXG-B4d62qWV.js} +1 -1
- package/dashboard/dist/assets/{chunk-KX2RTZJC-ByoW-HgN.js → chunk-KX2RTZJC-AsEKRPq2.js} +1 -1
- package/dashboard/dist/assets/{chunk-NQ4KR5QH-D1olOovd.js → chunk-NQ4KR5QH-DQhHHvwY.js} +1 -1
- package/dashboard/dist/assets/{chunk-QZHKN3VN-CB8_FC8w.js → chunk-QZHKN3VN-Ds1TtI3E.js} +1 -1
- package/dashboard/dist/assets/{chunk-WL4C6EOR-CFEqRrE1.js → chunk-WL4C6EOR-C7jE3-cR.js} +1 -1
- package/dashboard/dist/assets/classDiagram-VBA2DB6C-BHqdFE-8.js +1 -0
- package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-BHqdFE-8.js +1 -0
- package/dashboard/dist/assets/clone-CBJOOeOm.js +1 -0
- package/dashboard/dist/assets/{cose-bilkent-S5V4N54A-D6dGVXEI.js → cose-bilkent-S5V4N54A-C9ka5v1m.js} +1 -1
- package/dashboard/dist/assets/{dagre-KLK3FWXG-Cvg9CgP-.js → dagre-KLK3FWXG-BbgPQBKy.js} +1 -1
- package/dashboard/dist/assets/{diagram-E7M64L7V-iCBudhZD.js → diagram-E7M64L7V-DpdeZFD4.js} +1 -1
- package/dashboard/dist/assets/{diagram-IFDJBPK2-BGniy7VQ.js → diagram-IFDJBPK2-FlHLQzOV.js} +1 -1
- package/dashboard/dist/assets/{diagram-P4PSJMXO-B6Ie044E.js → diagram-P4PSJMXO-B22NkEF_.js} +1 -1
- package/dashboard/dist/assets/{erDiagram-INFDFZHY-BHvFRNhJ.js → erDiagram-INFDFZHY-zSqmtDid.js} +1 -1
- package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-CN86Zu3Q.js → flowDiagram-PKNHOUZH-BP_0XmVV.js} +1 -1
- package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-D-1fKFjW.js → ganttDiagram-A5KZAMGK-8uRyYgZV.js} +1 -1
- package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-Dtf1A6KL.js → gitGraphDiagram-K3NZZRJ6-JFqg8sv4.js} +1 -1
- package/dashboard/dist/assets/{graph-B6H_kXSs.js → graph-a-PAH599.js} +1 -1
- package/dashboard/dist/assets/index-CoVCLSh2.css +1 -0
- package/dashboard/dist/assets/index-yyAIuzrP.js +471 -0
- package/dashboard/dist/assets/{infoDiagram-LFFYTUFH-R9wJj4JF.js → infoDiagram-LFFYTUFH-C3kq7Nbv.js} +1 -1
- package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-CJmeR-bX.js → ishikawaDiagram-PHBUUO56-Kqi4EZ-n.js} +1 -1
- package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-FcUhyu8I.js → journeyDiagram-4ABVD52K-CTfv0Wcr.js} +1 -1
- package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-C8UcTIwW.js → kanban-definition-K7BYSVSG-Dmx0lgvR.js} +1 -1
- package/dashboard/dist/assets/{layout-DzBy6alw.js → layout-KKRbT2Od.js} +1 -1
- package/dashboard/dist/assets/{linear-CZJCNOB9.js → linear-5egaBiw7.js} +1 -1
- package/dashboard/dist/assets/{mermaid.core-fMQRe9Gq.js → mermaid.core-C9pF_oFQ.js} +4 -4
- package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-BFwp-LS-.js → mindmap-definition-YRQLILUH-C7HXYEXt.js} +1 -1
- package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-CQLmPkkd.js → pieDiagram-SKSYHLDU-DkdZm-YP.js} +1 -1
- package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-DAmi-dmD.js → quadrantDiagram-337W2JSQ-DkcRJs5F.js} +1 -1
- package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-Dcdts4kX.js → requirementDiagram-Z7DCOOCP-BaTDVYTl.js} +1 -1
- package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-By8LRvM0.js → sankeyDiagram-WA2Y5GQK-DvPLbGV5.js} +1 -1
- package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-BsvqgtTz.js → sequenceDiagram-2WXFIKYE-DQoZ2xMK.js} +1 -1
- package/dashboard/dist/assets/{stateDiagram-RAJIS63D-DFNOD7cx.js → stateDiagram-RAJIS63D-CS4l0OjM.js} +1 -1
- package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-DkBtE1WJ.js +1 -0
- package/dashboard/dist/assets/{timeline-definition-YZTLITO2-CMcgJGjn.js → timeline-definition-YZTLITO2-aC0iCFCW.js} +1 -1
- package/dashboard/dist/assets/{treemap-KZPCXAKY-BWsRNHwq.js → treemap-KZPCXAKY-Ie-PFjgx.js} +1 -1
- package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-io7-2Tod.js → vennDiagram-LZ73GAT5-CJN3ExTQ.js} +1 -1
- package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-AVnh4fDS.js → xychartDiagram-JWTSCODW-DSiDu1CN.js} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/dist/dashboard/server.d.ts +1 -1
- package/dist/dashboard/server.js +1163 -734
- package/dist/dashboard/server.js.map +1 -1
- package/dist/index.js +3979 -1372
- package/dist/index.js.map +1 -1
- package/examples/playbooks/keep-records-updated.md +1 -1
- package/examples/playbooks/read-before-plan.md +5 -5
- 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 +3 -3
- package/examples/{sample-mission → sample-project}/assignments/design-auth-schema/assignment.md +4 -1
- package/examples/{sample-mission → sample-project}/assignments/implement-jwt-middleware/assignment.md +4 -1
- package/examples/{sample-mission → sample-project}/assignments/write-auth-tests/assignment.md +4 -1
- 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 +57 -57
- 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 +8 -8
- package/platforms/claude-code/references/protocol-summary.md +7 -6
- package/platforms/claude-code/skills/complete-assignment/SKILL.md +21 -17
- package/platforms/claude-code/skills/create-assignment/SKILL.md +15 -14
- 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 +21 -17
- 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 +33 -30
- package/platforms/codex/references/file-ownership.md +8 -8
- package/platforms/codex/references/protocol-summary.md +11 -6
- 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 +6 -6
- package/platforms/codex/skills/create-assignment/SKILL.md +8 -7
- 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 +26 -21
- 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-PMR2DuGi.js +0 -1
- package/dashboard/dist/assets/classDiagram-VBA2DB6C-DmESf_RL.js +0 -1
- package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-DmESf_RL.js +0 -1
- package/dashboard/dist/assets/clone-WlIeyha4.js +0 -1
- package/dashboard/dist/assets/index-BhuXD-Q5.js +0 -445
- package/dashboard/dist/assets/index-BnqH-RIk.css +0 -1
- package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-DVO-Epiz.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
|
@@ -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,9 @@ Agents must NEVER modify these files:
|
|
|
6
6
|
|
|
7
7
|
| File | Location |
|
|
8
8
|
|------|----------|
|
|
9
|
-
| `
|
|
10
|
-
| `agent.md` | `<
|
|
11
|
-
| `claude.md` | `<
|
|
9
|
+
| `project.md` | `<project>/project.md` |
|
|
10
|
+
| `agent.md` | `<project>/agent.md` |
|
|
11
|
+
| `claude.md` | `<project>/claude.md` |
|
|
12
12
|
|
|
13
13
|
## Agent-Writable (YOUR assignment folder ONLY)
|
|
14
14
|
|
|
@@ -16,20 +16,20 @@ You may ONLY write to files inside your assigned assignment folder:
|
|
|
16
16
|
|
|
17
17
|
| File | Purpose |
|
|
18
18
|
|------|---------|
|
|
19
|
-
| `assignment.md` | Assignment record, source of truth for state |
|
|
20
|
-
| `plan
|
|
19
|
+
| `assignment.md` | Assignment record, source of truth for state (includes `## Todos` checklist) |
|
|
20
|
+
| `plan*.md` | Versioned implementation plans (optional, 0 or more: `plan.md`, `plan-v2.md`, ...) — each linked from a todo in `assignment.md` |
|
|
21
21
|
| `scratchpad.md` | Working notes |
|
|
22
22
|
| `handoff.md` | Append-only handoff log |
|
|
23
23
|
| `decision-record.md` | Append-only decision log |
|
|
24
24
|
|
|
25
|
-
Path pattern: `~/.syntaur/
|
|
25
|
+
Path pattern: `~/.syntaur/projects/<project>/assignments/<your-assignment>/`
|
|
26
26
|
|
|
27
27
|
## Shared-Writable (any agent or human)
|
|
28
28
|
|
|
29
29
|
| Location | Purpose |
|
|
30
30
|
|----------|---------|
|
|
31
|
-
| `<
|
|
32
|
-
| `<
|
|
31
|
+
| `<project>/resources/<slug>.md` | Reference material |
|
|
32
|
+
| `<project>/memories/<slug>.md` | Learnings and patterns |
|
|
33
33
|
|
|
34
34
|
## Derived (NEVER edit)
|
|
35
35
|
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
```
|
|
6
6
|
~/.syntaur/
|
|
7
7
|
config.md
|
|
8
|
-
|
|
9
|
-
<
|
|
8
|
+
projects/
|
|
9
|
+
<project-slug>/
|
|
10
10
|
manifest.md # Derived: root navigation (read-only)
|
|
11
|
-
|
|
11
|
+
project.md # Human-authored: project overview (read-only)
|
|
12
12
|
_index-assignments.md # Derived (read-only)
|
|
13
13
|
_index-plans.md # Derived (read-only)
|
|
14
14
|
_index-decisions.md # Derived (read-only)
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
agent.md # Human-authored: universal agent instructions (read-only)
|
|
18
18
|
assignments/
|
|
19
19
|
<assignment-slug>/
|
|
20
|
-
assignment.md # Agent-writable: source of truth for state
|
|
21
|
-
plan
|
|
20
|
+
assignment.md # Agent-writable: source of truth for state (includes ## Todos checklist)
|
|
21
|
+
plan*.md # Agent-writable: versioned implementation plans (optional, 0 or more: plan.md, plan-v2.md, ...)
|
|
22
22
|
scratchpad.md # Agent-writable: working notes
|
|
23
23
|
handoff.md # Agent-writable: append-only handoff log
|
|
24
24
|
decision-record.md # Agent-writable: append-only decision log
|
|
@@ -62,9 +62,10 @@
|
|
|
62
62
|
## Key Rules
|
|
63
63
|
|
|
64
64
|
1. **Assignment frontmatter is the single source of truth** for all assignment state.
|
|
65
|
-
2. **One folder per
|
|
65
|
+
2. **One folder per project**, one subfolder per assignment.
|
|
66
66
|
3. **Derived files** (underscore-prefixed) are never edited manually.
|
|
67
67
|
4. **Slugs** are lowercase, hyphen-separated.
|
|
68
68
|
5. **Dependencies** are declared via `dependsOn` in assignment frontmatter.
|
|
69
69
|
6. An assignment cannot transition from `pending` to `in_progress` while any dependency is not `completed`.
|
|
70
70
|
7. **Playbooks** in `~/.syntaur/playbooks/` define behavioral rules agents must follow. Read `manifest.md` for a summary, then read each referenced playbook before starting work.
|
|
71
|
+
8. **Todos** in the `## Todos` section of `assignment.md` are an informal markdown checklist. Items may be simple tasks or link to plan files. When a plan is superseded, mark the old todo: `- [x] ~~Execute [plan](./plan.md)~~ (superseded by plan-v2)` — never delete it.
|
|
@@ -17,15 +17,15 @@ Write a handoff for your current assignment and transition it to review (or comp
|
|
|
17
17
|
|
|
18
18
|
User provided: $ARGUMENTS
|
|
19
19
|
|
|
20
|
-
If the user passed `--complete`, transition directly to `completed` instead of `review`. However, `--complete` is ONLY allowed if ALL acceptance criteria are met. If any
|
|
20
|
+
If the user passed `--complete`, transition directly to `completed` instead of `review`. However, `--complete` is ONLY allowed if ALL acceptance criteria are met AND every `## Todos` item is either checked or marked superseded. If any criterion or todo is unresolved, always transition to `review` regardless of the `--complete` flag, and inform the user why.
|
|
21
21
|
|
|
22
22
|
## Step 1: Load Context
|
|
23
23
|
|
|
24
24
|
Read `.syntaur/context.json` from the current working directory.
|
|
25
25
|
|
|
26
|
-
If the file does not exist, tell the user: "No active assignment found. Run `/grab-assignment <
|
|
26
|
+
If the file does not exist, tell the user: "No active assignment found. Run `/grab-assignment <project-slug>` first."
|
|
27
27
|
|
|
28
|
-
Extract: `
|
|
28
|
+
Extract: `projectSlug`, `assignmentSlug`, `assignmentDir`, `projectDir`.
|
|
29
29
|
|
|
30
30
|
## Step 1.5: Load Playbooks
|
|
31
31
|
|
|
@@ -37,15 +37,17 @@ ls ~/.syntaur/playbooks/*.md 2>/dev/null
|
|
|
37
37
|
|
|
38
38
|
For each file found, read it and check that your work follows its directives. If any playbook has completion-related rules (e.g., "run tests before done"), follow them before proceeding.
|
|
39
39
|
|
|
40
|
-
## Step 2: Verify Acceptance Criteria
|
|
40
|
+
## Step 2: Verify Acceptance Criteria and Todos
|
|
41
41
|
|
|
42
|
-
Read `<assignmentDir>/assignment.md` and find the `## Acceptance Criteria`
|
|
42
|
+
Read `<assignmentDir>/assignment.md` and find the `## Acceptance Criteria` and `## Todos` sections.
|
|
43
43
|
|
|
44
|
-
Review each criterion (checkbox item). For each:
|
|
45
|
-
- If you believe it is met, note why (what was implemented, where)
|
|
46
|
-
- If it is NOT met, flag it clearly
|
|
44
|
+
Review each acceptance criterion (checkbox item) and each todo. For each:
|
|
45
|
+
- If you believe it is met/done, note why (what was implemented, where)
|
|
46
|
+
- If it is NOT met/done, flag it clearly
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
Superseded todos (marked `- [x] ~~...~~ (superseded by ...)`) count as resolved — they do not need to be done again.
|
|
49
|
+
|
|
50
|
+
If any acceptance criteria are unmet OR any todo is still `- [ ]` and not superseded, warn the user: "The following are not yet done: [list]. Do you want to proceed with the handoff anyway?"
|
|
49
51
|
|
|
50
52
|
If the user says no, stop.
|
|
51
53
|
|
|
@@ -82,20 +84,22 @@ Use the Edit tool to append this entry to handoff.md (do not overwrite existing
|
|
|
82
84
|
|
|
83
85
|
Also update the handoff.md frontmatter: set `updated` to the current timestamp and increment the `handoffCount` by 1.
|
|
84
86
|
|
|
85
|
-
## Step 4: Update
|
|
87
|
+
## Step 4: Update Checkboxes (Criteria + Todos)
|
|
88
|
+
|
|
89
|
+
In `<assignmentDir>/assignment.md`, update checkboxes in both the `## Acceptance Criteria` and `## Todos` sections to reflect the current state. Use the Edit tool to check off items that were completed (change `- [ ]` to `- [x]`).
|
|
86
90
|
|
|
87
|
-
|
|
91
|
+
**Note:** Ideally, these should have been checked off incrementally during implementation. If they are already checked, verify they are still accurate. If some were missed, check them off now with a note in the handoff about which were verified at completion time vs. during development.
|
|
88
92
|
|
|
89
|
-
|
|
93
|
+
Do NOT uncheck or rewrite superseded todo lines (those matching `- [x] ~~...~~ (superseded by ...)`) — leave that history intact.
|
|
90
94
|
|
|
91
95
|
## Step 4.5: Close Session
|
|
92
96
|
|
|
93
|
-
Read the context file (`.syntaur/context.json`) to get the `sessionId` and `
|
|
97
|
+
Read the context file (`.syntaur/context.json`) to get the `sessionId` and `projectSlug`. Then mark the session as completed via the dashboard API:
|
|
94
98
|
|
|
95
99
|
```bash
|
|
96
100
|
curl -s -X PATCH "http://localhost:$(cat ~/.syntaur/dashboard-port 2>/dev/null || echo 4800)/api/agent-sessions/<session-id>/status" \
|
|
97
101
|
-H "Content-Type: application/json" \
|
|
98
|
-
-d '{"status": "completed", "
|
|
102
|
+
-d '{"status": "completed", "projectSlug": "<project-slug>"}'
|
|
99
103
|
```
|
|
100
104
|
|
|
101
105
|
If the API call fails (e.g., dashboard not running), this is non-critical — the session will be reconciled automatically on the next dashboard load.
|
|
@@ -105,20 +109,20 @@ If the API call fails (e.g., dashboard not running), this is non-critical — th
|
|
|
105
109
|
If the user passed `--complete`:
|
|
106
110
|
|
|
107
111
|
```bash
|
|
108
|
-
syntaur complete <assignment-slug> --
|
|
112
|
+
syntaur complete <assignment-slug> --project <project-slug>
|
|
109
113
|
```
|
|
110
114
|
|
|
111
115
|
Otherwise, transition to review:
|
|
112
116
|
|
|
113
117
|
```bash
|
|
114
|
-
syntaur review <assignment-slug> --
|
|
118
|
+
syntaur review <assignment-slug> --project <project-slug>
|
|
115
119
|
```
|
|
116
120
|
|
|
117
121
|
Use `dangerouslyDisableSandbox: true` since the CLI writes to `~/.syntaur/`.
|
|
118
122
|
|
|
119
123
|
If the command fails, report the error. Common failures:
|
|
120
124
|
- Assignment is not in `in_progress` status (cannot transition)
|
|
121
|
-
-
|
|
125
|
+
- Project not found
|
|
122
126
|
|
|
123
127
|
## Step 6: Clean Up Context
|
|
124
128
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: create-assignment
|
|
3
|
-
description: Create a new Syntaur assignment within a
|
|
4
|
-
argument-hint: <title> --
|
|
3
|
+
description: Create a new Syntaur assignment within a project (or as a one-off)
|
|
4
|
+
argument-hint: <title> --project <slug> [--priority <level>] [--depends-on <slugs>] [--one-off]
|
|
5
5
|
allowed-tools:
|
|
6
6
|
- Bash
|
|
7
7
|
- Read
|
|
@@ -9,7 +9,7 @@ allowed-tools:
|
|
|
9
9
|
|
|
10
10
|
# Create Assignment
|
|
11
11
|
|
|
12
|
-
Create a new assignment within a Syntaur
|
|
12
|
+
Create a new assignment within a Syntaur project from Claude Code.
|
|
13
13
|
|
|
14
14
|
## Arguments
|
|
15
15
|
|
|
@@ -17,25 +17,25 @@ The user provided: $ARGUMENTS
|
|
|
17
17
|
|
|
18
18
|
Parse the arguments:
|
|
19
19
|
- First argument (required): the assignment title (e.g., `"Add login endpoint"`)
|
|
20
|
-
- `--
|
|
21
|
-
- `--one-off` (optional): create a standalone
|
|
20
|
+
- `--project <slug>` (required unless `--one-off`): the project to add the assignment to
|
|
21
|
+
- `--one-off` (optional): create a standalone project+assignment in one step
|
|
22
22
|
- `--slug` (optional): override the auto-generated assignment slug
|
|
23
23
|
- `--priority` (optional): `low`, `medium` (default), `high`, or `critical`
|
|
24
24
|
- `--depends-on` (optional): comma-separated list of assignment slugs this depends on
|
|
25
|
-
- `--dir` (optional): override the default
|
|
25
|
+
- `--dir` (optional): override the default project directory
|
|
26
26
|
|
|
27
27
|
If no title was provided, ask the user what the assignment should be called.
|
|
28
28
|
|
|
29
|
-
If neither `--
|
|
29
|
+
If neither `--project` nor `--one-off` was provided, check if there is an active assignment context in `.syntaur/context.json`. If so, default `--project` to that context's `projectSlug` and confirm with the user: "Add this assignment to project `<projectSlug>`?"
|
|
30
30
|
|
|
31
|
-
If there is no active context and no
|
|
31
|
+
If there is no active context and no project flag, ask the user which project to add it to, or whether it should be a one-off.
|
|
32
32
|
|
|
33
33
|
## Step 1: Run the CLI
|
|
34
34
|
|
|
35
35
|
Build the command from the parsed arguments. Use `dangerouslyDisableSandbox: true` since the CLI writes to `~/.syntaur/` which is outside the project sandbox.
|
|
36
36
|
|
|
37
37
|
```bash
|
|
38
|
-
syntaur create-assignment "<title>" --
|
|
38
|
+
syntaur create-assignment "<title>" --project <slug> [--slug <slug>] [--priority <level>] [--depends-on <slugs>] [--dir <path>]
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
Or for one-off:
|
|
@@ -44,21 +44,22 @@ Or for one-off:
|
|
|
44
44
|
syntaur create-assignment "<title>" --one-off [--slug <slug>] [--priority <level>] [--dir <path>]
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
If the command fails (e.g.,
|
|
47
|
+
If the command fails (e.g., project not found, slug collision), report the error and suggest fixes.
|
|
48
48
|
|
|
49
49
|
## Step 2: Read the Created Assignment
|
|
50
50
|
|
|
51
51
|
After successful creation, extract the assignment slug and directory from the CLI output. Read the generated `assignment.md`:
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
|
-
cat ~/.syntaur/
|
|
54
|
+
cat ~/.syntaur/projects/<project-slug>/assignments/<assignment-slug>/assignment.md
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
## Step 3: Guide Next Steps
|
|
58
58
|
|
|
59
59
|
Tell the user:
|
|
60
60
|
- The assignment was created with its slug, priority, and location
|
|
61
|
-
- List the files created (assignment.md,
|
|
62
|
-
- Suggest they edit `assignment.md` to fill in the objective, acceptance criteria, and
|
|
61
|
+
- List the files created (assignment.md, scratchpad.md, handoff.md, decision-record.md). Note that `plan.md` is NOT scaffolded — plan files are optional and created on demand by `/plan-assignment`.
|
|
62
|
+
- Suggest they edit `assignment.md` to fill in the objective, acceptance criteria, context, and any initial todos. The `## Todos` section accepts simple tasks or markdown links to plan files.
|
|
63
|
+
- Or suggest running `/plan-assignment` after grabbing — it creates a plan file and auto-appends a linked todo to `## Todos`.
|
|
63
64
|
- If dependencies were set, note them
|
|
64
|
-
- Suggest running `/grab-assignment <
|
|
65
|
+
- Suggest running `/grab-assignment <project-slug> <assignment-slug>` to claim and start working on it
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: grab-assignment
|
|
3
|
-
description:
|
|
4
|
-
argument-hint: <
|
|
3
|
+
description: Load a Syntaur assignment into the current working context
|
|
4
|
+
argument-hint: <project-slug> [assignment-slug]
|
|
5
5
|
allowed-tools:
|
|
6
6
|
- Bash
|
|
7
7
|
- Read
|
|
@@ -12,86 +12,79 @@ allowed-tools:
|
|
|
12
12
|
|
|
13
13
|
# Grab Assignment
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
Load a Syntaur assignment into the current working context so you can work on it.
|
|
16
|
+
|
|
17
|
+
**Grabbing is non-destructive.** It never fails because of status. An assignment in `pending`, `in_progress`, `blocked`, `review`, `completed`, or `failed` can all be grabbed — grabbing just sets up context (`.syntaur/context.json`), registers the session, and reads the assignment. Only a `pending` assignment will additionally be transitioned to `in_progress`; any other status is left untouched.
|
|
16
18
|
|
|
17
19
|
## Arguments
|
|
18
20
|
|
|
19
21
|
The user provided: $ARGUMENTS
|
|
20
22
|
|
|
21
23
|
Parse the arguments:
|
|
22
|
-
- First argument (required): the
|
|
23
|
-
- Second argument (optional): a specific assignment slug to grab. If omitted, you will list
|
|
24
|
+
- First argument (required): the project slug (e.g., `build-auth-system`)
|
|
25
|
+
- Second argument (optional): a specific assignment slug to grab. If omitted, you will list the project's assignments and pick one (preferring `pending` when multiple exist).
|
|
24
26
|
|
|
25
27
|
## Pre-flight Check
|
|
26
28
|
|
|
27
29
|
1. Check if `.syntaur/context.json` already exists in the current working directory.
|
|
28
|
-
- If it exists, read it and warn the user: "You already have an active assignment: `<assignmentSlug>` in
|
|
30
|
+
- If it exists, read it and warn the user: "You already have an active assignment: `<assignmentSlug>` in project `<projectSlug>`. Grabbing a new assignment will replace this context. Proceed?"
|
|
29
31
|
- If the user says no, stop.
|
|
30
32
|
|
|
31
|
-
## Step 1: Discover the
|
|
33
|
+
## Step 1: Discover the Project
|
|
32
34
|
|
|
33
|
-
Read the
|
|
35
|
+
Read the project directory to understand what is available:
|
|
34
36
|
|
|
35
37
|
```bash
|
|
36
|
-
ls ~/.syntaur/
|
|
38
|
+
ls ~/.syntaur/projects/<project-slug>/
|
|
37
39
|
```
|
|
38
40
|
|
|
39
|
-
Read the
|
|
40
|
-
- Read `~/.syntaur/
|
|
41
|
-
- Read `~/.syntaur/
|
|
42
|
-
- Read `~/.syntaur/
|
|
43
|
-
- Read `~/.syntaur/
|
|
44
|
-
|
|
45
|
-
Note the `workspace` field in `mission.md` frontmatter if present. This indicates which project/codebase grouping the mission belongs to. When writing context to `.syntaur/context.json` (Step 5), include `"workspace": "<value>"` if the mission has a workspace.
|
|
41
|
+
Read the project files, starting with the manifest (the protocol-defined entry point):
|
|
42
|
+
- Read `~/.syntaur/projects/<project-slug>/manifest.md` first (root navigation file per protocol spec)
|
|
43
|
+
- Read `~/.syntaur/projects/<project-slug>/project.md` for goal and context
|
|
44
|
+
- Read `~/.syntaur/projects/<project-slug>/agent.md` for agent instructions
|
|
45
|
+
- Read `~/.syntaur/projects/<project-slug>/claude.md` if it exists for Claude-specific instructions
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
Note the `workspace` field in `project.md` frontmatter if present. This indicates which project/codebase grouping the project belongs to. When writing context to `.syntaur/context.json` (Step 5), include `"workspace": "<value>"` if the project has a workspace.
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
ls ~/.syntaur/missions/<mission-slug>/assignments/
|
|
53
|
-
```
|
|
49
|
+
## Step 2: Find Assignments
|
|
54
50
|
|
|
55
|
-
|
|
51
|
+
List assignment directories:
|
|
56
52
|
|
|
57
53
|
```bash
|
|
58
|
-
|
|
54
|
+
ls ~/.syntaur/projects/<project-slug>/assignments/
|
|
59
55
|
```
|
|
60
56
|
|
|
61
|
-
If
|
|
62
|
-
|
|
63
|
-
If the user specified an assignment slug as the second argument, verify it exists and is pending. If it is not pending, report its current status and stop.
|
|
57
|
+
If the user specified an assignment slug as the second argument, verify that directory exists. Its status does **not** matter — grab it regardless. If it doesn't exist, report that and stop.
|
|
64
58
|
|
|
65
|
-
If no specific assignment was requested, present the list
|
|
59
|
+
If no specific assignment was requested, read each `assignment.md` frontmatter and present the list with title, priority, and current status. Prefer `pending` assignments when presenting options (they're the most likely default), but show non-terminal assignments too so the user can pick one to resume. Ask the user which to grab unless there is exactly one obvious candidate (single `pending` assignment).
|
|
66
60
|
|
|
67
61
|
## Step 3: Claim the Assignment
|
|
68
62
|
|
|
69
|
-
|
|
63
|
+
Read the assignment frontmatter first to learn its current `status`:
|
|
70
64
|
|
|
71
65
|
```bash
|
|
72
|
-
syntaur
|
|
66
|
+
cat ~/.syntaur/projects/<project-slug>/assignments/<assignment-slug>/assignment.md
|
|
73
67
|
```
|
|
74
68
|
|
|
75
|
-
Then:
|
|
69
|
+
Then run the Syntaur CLI to set the assignee. This is safe at any status and does not transition state. Use `dangerouslyDisableSandbox: true` for these bash commands since the CLI writes to `~/.syntaur/` which is outside the project sandbox.
|
|
76
70
|
|
|
77
71
|
```bash
|
|
78
|
-
syntaur
|
|
72
|
+
syntaur assign <assignment-slug> --agent claude --project <project-slug>
|
|
79
73
|
```
|
|
80
74
|
|
|
81
|
-
|
|
82
|
-
- Assignment has unmet dependencies (cannot start until dependencies are `completed`)
|
|
83
|
-
- Assignment is not in `pending` status
|
|
84
|
-
- Mission not found
|
|
85
|
-
|
|
86
|
-
## Step 4: Read Assignment Context and Set Workspace
|
|
87
|
-
|
|
88
|
-
After successfully starting the assignment, read the full assignment details:
|
|
75
|
+
**Only if the current status is `pending`**, also run `syntaur start` to transition it to `in_progress`:
|
|
89
76
|
|
|
90
77
|
```bash
|
|
91
|
-
|
|
78
|
+
syntaur start <assignment-slug> --project <project-slug>
|
|
92
79
|
```
|
|
93
80
|
|
|
94
|
-
|
|
81
|
+
For any other status (`in_progress`, `blocked`, `review`, `completed`, `failed`), **skip `syntaur start`** — the assignment has already been advanced past pending and grabbing should not rewind it. Tell the user which status the assignment is in and continue with context setup.
|
|
82
|
+
|
|
83
|
+
If `syntaur assign` fails (e.g., project not found, invalid slug), report the error and stop. Do not treat a non-pending status as a failure.
|
|
84
|
+
|
|
85
|
+
## Step 4: Read Assignment Context and Set Workspace
|
|
86
|
+
|
|
87
|
+
You have already read the assignment file in Step 3. Extract from the frontmatter:
|
|
95
88
|
- `title` -- the assignment title
|
|
96
89
|
- `workspace.repository` -- the code repository path (may be null)
|
|
97
90
|
- `workspace.worktreePath` -- the worktree path (may be null)
|
|
@@ -99,7 +92,15 @@ Extract from the frontmatter:
|
|
|
99
92
|
- `dependsOn` -- list of dependency slugs
|
|
100
93
|
- `priority` -- priority level
|
|
101
94
|
|
|
102
|
-
Read the objective
|
|
95
|
+
Read the objective, acceptance criteria, and the `## Todos` section (if present) from the markdown body. Active (unchecked) todos indicate outstanding work and may link to plan files to execute.
|
|
96
|
+
|
|
97
|
+
### Auto-load upstream decision records
|
|
98
|
+
|
|
99
|
+
If `dependsOn` is non-empty, for each dependency slug `<dep>`, read:
|
|
100
|
+
- `<projectDir>/assignments/<dep>/handoff.md` (if it exists) for integration context
|
|
101
|
+
- `<projectDir>/assignments/<dep>/decision-record.md` (if it exists) for upstream decisions
|
|
102
|
+
|
|
103
|
+
Surface those upstream decisions in the Step 6 report — downstream work should inherit prior decisions without the user having to ask.
|
|
103
104
|
|
|
104
105
|
### Set workspace if not configured
|
|
105
106
|
|
|
@@ -124,10 +125,10 @@ Then write the JSON file with this structure:
|
|
|
124
125
|
|
|
125
126
|
```json
|
|
126
127
|
{
|
|
127
|
-
"
|
|
128
|
+
"projectSlug": "<project-slug>",
|
|
128
129
|
"assignmentSlug": "<assignment-slug>",
|
|
129
|
-
"
|
|
130
|
-
"assignmentDir": "/Users/<username>/.syntaur/
|
|
130
|
+
"projectDir": "/Users/<username>/.syntaur/projects/<project-slug>",
|
|
131
|
+
"assignmentDir": "/Users/<username>/.syntaur/projects/<project-slug>/assignments/<assignment-slug>",
|
|
131
132
|
"workspaceRoot": "<workspace.worktreePath if set, else workspace.repository if it is a local path, else current working directory>",
|
|
132
133
|
"title": "<assignment title>",
|
|
133
134
|
"branch": "<workspace.branch or null>",
|
|
@@ -141,7 +142,7 @@ Use absolute paths (expand `~` to the actual home directory). Note: `workspace.r
|
|
|
141
142
|
|
|
142
143
|
## Step 5.5: Register Agent Session
|
|
143
144
|
|
|
144
|
-
After creating the context file, register this session in the
|
|
145
|
+
After creating the context file, register this session in the project's agent session log so it appears in the dashboard.
|
|
145
146
|
|
|
146
147
|
1. Find the current Claude Code session ID by reading from `~/.claude/sessions/`. These are JSON files keyed by PID containing `sessionId`, `cwd`, etc. Find the most recently modified file whose `cwd` matches the current working directory:
|
|
147
148
|
```bash
|
|
@@ -153,7 +154,7 @@ If you cannot find a matching session file (e.g., no file matches the cwd, or th
|
|
|
153
154
|
|
|
154
155
|
2. Run the track-session command (use `dangerouslyDisableSandbox: true` since it writes to `~/.syntaur/`):
|
|
155
156
|
```bash
|
|
156
|
-
syntaur track-session --
|
|
157
|
+
syntaur track-session --project <projectSlug> --assignment <assignmentSlug> --agent claude --session-id <claude-session-id> --path $(pwd)
|
|
157
158
|
```
|
|
158
159
|
|
|
159
160
|
3. Update the `.syntaur/context.json` context file to include the session ID. Add `"sessionId": "<claude-session-id>"` to the JSON object you wrote in Step 5.
|
|
@@ -174,7 +175,13 @@ If no playbook files exist, skip this step.
|
|
|
174
175
|
|
|
175
176
|
Summarize what was done:
|
|
176
177
|
- Which assignment was grabbed
|
|
178
|
+
- Its current status (note if it was already past `pending` — e.g., "already in `review`, status unchanged")
|
|
177
179
|
- The objective (first paragraph from assignment.md body)
|
|
178
180
|
- The acceptance criteria (the checkbox list)
|
|
181
|
+
- Active todos from the `## Todos` section (if any), with links to any referenced plan files
|
|
179
182
|
- The workspace path (if set)
|
|
180
|
-
- Suggest next step
|
|
183
|
+
- Suggest an appropriate next step based on status:
|
|
184
|
+
- `pending` / `in_progress`: `/plan-assignment` to plan implementation
|
|
185
|
+
- `blocked`: investigate the blocker recorded in `blockedReason`
|
|
186
|
+
- `review`: inspect the implementation and help verify acceptance criteria
|
|
187
|
+
- `completed` / `failed`: read the handoff; grab is probably for reference or reopen
|