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
|
@@ -23,7 +23,7 @@ tags:
|
|
|
23
23
|
|
|
24
24
|
## When starting work:
|
|
25
25
|
- Add a progress entry noting you've begun and what your approach is
|
|
26
|
-
- If
|
|
26
|
+
- If any plan files exist (plan.md, plan-v2.md, ...), update their task checkboxes as you complete steps
|
|
27
27
|
|
|
28
28
|
## When stopping or handing off:
|
|
29
29
|
- Write a final progress entry summarizing current state
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "Read Before You Plan"
|
|
3
3
|
slug: read-before-plan
|
|
4
|
-
description: "Agents must read all
|
|
5
|
-
when_to_use: "Before creating or modifying plan.md"
|
|
4
|
+
description: "Agents must read all project context files before creating or modifying a plan"
|
|
5
|
+
when_to_use: "Before creating or modifying any plan file (plan.md, plan-v2.md, ...)"
|
|
6
6
|
created: "2026-04-02T00:00:00Z"
|
|
7
7
|
updated: "2026-04-02T00:00:00Z"
|
|
8
8
|
tags:
|
|
@@ -12,10 +12,10 @@ tags:
|
|
|
12
12
|
|
|
13
13
|
# Read Before You Plan
|
|
14
14
|
|
|
15
|
-
Before creating or modifying plan.md, read these files in order:
|
|
15
|
+
Before creating or modifying any plan file (plan.md, plan-v2.md, ...), read these files in order:
|
|
16
16
|
|
|
17
|
-
1. `manifest.md` -- understand the
|
|
18
|
-
2. `
|
|
17
|
+
1. `manifest.md` -- understand the project structure
|
|
18
|
+
2. `project.md` -- understand the goal and scope
|
|
19
19
|
3. `agent.md` -- understand conventions and constraints
|
|
20
20
|
4. `claude.md` (if exists) -- Claude-specific instructions
|
|
21
21
|
5. `assignment.md` -- understand your specific task, acceptance criteria, and dependencies
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
2
|
+
project: build-auth-system
|
|
3
3
|
generated: "2026-03-18T14:30:00Z"
|
|
4
4
|
status: active
|
|
5
5
|
progress:
|
|
@@ -13,10 +13,10 @@ progress:
|
|
|
13
13
|
needsAttention:
|
|
14
14
|
blockedCount: 0
|
|
15
15
|
failedCount: 0
|
|
16
|
-
|
|
16
|
+
openQuestions: 1
|
|
17
17
|
---
|
|
18
18
|
|
|
19
|
-
#
|
|
19
|
+
# Project Status: Build Authentication System
|
|
20
20
|
|
|
21
21
|
**Status:** active
|
|
22
22
|
**Progress:** 1/3 assignments complete
|
package/examples/{sample-mission → sample-project}/assignments/design-auth-schema/assignment.md
RENAMED
|
@@ -32,6 +32,10 @@ Design the PostgreSQL database schema for the authentication system. This includ
|
|
|
32
32
|
- [x] All tables have appropriate indexes for query patterns
|
|
33
33
|
- [x] Migration scripts are idempotent and backward-compatible
|
|
34
34
|
|
|
35
|
+
## Todos
|
|
36
|
+
|
|
37
|
+
- [x] Execute [plan](./plan.md)
|
|
38
|
+
|
|
35
39
|
## Context
|
|
36
40
|
|
|
37
41
|
This is the foundational data layer for the auth system. The schema must support the JWT middleware (implement-jwt-middleware) and be testable (write-auth-tests). See [Auth Requirements](../../resources/auth-requirements.md) for functional specs.
|
|
@@ -55,7 +59,6 @@ Started schema design. Reviewed auth requirements document. Planning three table
|
|
|
55
59
|
|
|
56
60
|
## Links
|
|
57
61
|
|
|
58
|
-
- [Plan](./plan.md)
|
|
59
62
|
- [Scratchpad](./scratchpad.md)
|
|
60
63
|
- [Handoff](./handoff.md)
|
|
61
64
|
- [Decision Record](./decision-record.md)
|
|
@@ -36,6 +36,10 @@ Implement Express.js middleware that validates JWT access tokens on protected ro
|
|
|
36
36
|
- [ ] Token revocation endpoint (logout)
|
|
37
37
|
- [ ] Role-based route guards (admin vs user)
|
|
38
38
|
|
|
39
|
+
## Todos
|
|
40
|
+
|
|
41
|
+
- [ ] Execute [plan](./plan.md)
|
|
42
|
+
|
|
39
43
|
## Context
|
|
40
44
|
|
|
41
45
|
Depends on the database schema from [design-auth-schema](../design-auth-schema/assignment.md). The schema is complete — see the [handoff notes](../design-auth-schema/handoff.md) for integration details. Key table: `sessions` with `jti` column for token validation. See [Auth Requirements](../../resources/auth-requirements.md) for full specs.
|
|
@@ -59,7 +63,6 @@ Started implementation. Set up RS256 key pair loading from environment variables
|
|
|
59
63
|
|
|
60
64
|
## Links
|
|
61
65
|
|
|
62
|
-
- [Plan](./plan.md)
|
|
63
66
|
- [Scratchpad](./scratchpad.md)
|
|
64
67
|
- [Handoff](./handoff.md)
|
|
65
68
|
- [Decision Record](./decision-record.md)
|
package/examples/{sample-mission → sample-project}/assignments/write-auth-tests/assignment.md
RENAMED
|
@@ -34,6 +34,10 @@ Write comprehensive unit and integration tests for the authentication system, co
|
|
|
34
34
|
- [ ] Edge case tests: expired tokens, revoked sessions, refresh token reuse detection
|
|
35
35
|
- [ ] Coverage report showing 80%+ line coverage
|
|
36
36
|
|
|
37
|
+
## Todos
|
|
38
|
+
|
|
39
|
+
- [ ] Execute [plan](./plan.md)
|
|
40
|
+
|
|
37
41
|
## Context
|
|
38
42
|
|
|
39
43
|
This assignment depends on [implement-jwt-middleware](../implement-jwt-middleware/assignment.md) being completed. Tests will cover both the schema layer (from design-auth-schema) and the middleware/endpoint layer (from implement-jwt-middleware). Use Jest as the test framework with `supertest` for HTTP integration tests.
|
|
@@ -48,7 +52,6 @@ No progress yet.
|
|
|
48
52
|
|
|
49
53
|
## Links
|
|
50
54
|
|
|
51
|
-
- [Plan](./plan.md)
|
|
52
55
|
- [Scratchpad](./scratchpad.md)
|
|
53
56
|
- [Handoff](./handoff.md)
|
|
54
57
|
- [Decision Record](./decision-record.md)
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
version: "1.0"
|
|
3
|
-
|
|
3
|
+
project: build-auth-system
|
|
4
4
|
generated: "2026-03-18T14:30:00Z"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
#
|
|
7
|
+
# Project: build-auth-system
|
|
8
8
|
|
|
9
9
|
## Overview
|
|
10
|
-
- [
|
|
10
|
+
- [Project Overview](./project.md)
|
|
11
11
|
|
|
12
12
|
## Indexes
|
|
13
13
|
- [Assignments](./_index-assignments.md)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
2
|
+
project: build-auth-system
|
|
3
3
|
generated: "2026-03-18T14:30:00Z"
|
|
4
4
|
total: 1
|
|
5
5
|
---
|
|
@@ -8,4 +8,4 @@ total: 1
|
|
|
8
8
|
|
|
9
9
|
| Name | Source | Scope | Source Assignment | Updated |
|
|
10
10
|
|------|--------|-------|------------------|---------|
|
|
11
|
-
| [postgres-connection-pooling](./postgres-connection-pooling.md) | claude-2 |
|
|
11
|
+
| [postgres-connection-pooling](./postgres-connection-pooling.md) | claude-2 | project | design-auth-schema | 2026-03-17T09:00:00Z |
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "syntaur",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.2.0",
|
|
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": {
|
|
7
7
|
"type": "git",
|
|
@@ -40,7 +40,9 @@
|
|
|
40
40
|
"typecheck": "tsc --noEmit",
|
|
41
41
|
"test": "vitest run",
|
|
42
42
|
"test:watch": "vitest",
|
|
43
|
-
"prepublishOnly": "npm run build && npm ci --prefix dashboard && npm run build --prefix dashboard"
|
|
43
|
+
"prepublishOnly": "npm run build && npm ci --prefix dashboard && npm run build --prefix dashboard",
|
|
44
|
+
"try": "node scripts/try.mjs",
|
|
45
|
+
"untry": "npm unlink -g syntaur && npm install -g syntaur@latest && echo '\\n✓ global syntaur restored to latest published version'"
|
|
44
46
|
},
|
|
45
47
|
"engines": {
|
|
46
48
|
"node": ">=20.0.0"
|
package/platforms/README.md
CHANGED
|
@@ -16,16 +16,16 @@ format expected by the target framework.
|
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
18
|
# Generate Cursor adapter files in the current directory
|
|
19
|
-
syntaur setup-adapter cursor --
|
|
19
|
+
syntaur setup-adapter cursor --project <project-slug> --assignment <assignment-slug>
|
|
20
20
|
|
|
21
21
|
# Generate Codex adapter files
|
|
22
|
-
syntaur setup-adapter codex --
|
|
22
|
+
syntaur setup-adapter codex --project <project-slug> --assignment <assignment-slug>
|
|
23
23
|
|
|
24
24
|
# Generate OpenCode adapter files
|
|
25
|
-
syntaur setup-adapter opencode --
|
|
25
|
+
syntaur setup-adapter opencode --project <project-slug> --assignment <assignment-slug>
|
|
26
26
|
|
|
27
27
|
# Overwrite existing files
|
|
28
|
-
syntaur setup-adapter cursor --
|
|
28
|
+
syntaur setup-adapter cursor --project my-project --assignment my-task --force
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
## What Gets Generated
|
|
@@ -35,8 +35,8 @@ All adapters embed equivalent protocol knowledge:
|
|
|
35
35
|
- **Write boundary rules** (which files the agent can and cannot modify)
|
|
36
36
|
- **Assignment lifecycle states** and valid transitions
|
|
37
37
|
- **CLI commands** for state transitions (`syntaur start`, `syntaur complete`, etc.)
|
|
38
|
-
- **Reading order** for
|
|
39
|
-
- **Current assignment context** (
|
|
38
|
+
- **Reading order** for project and assignment files
|
|
39
|
+
- **Current assignment context** (project slug, assignment slug, paths)
|
|
40
40
|
|
|
41
41
|
## Contributing a New Adapter
|
|
42
42
|
|
|
@@ -46,7 +46,7 @@ To add support for a new framework:
|
|
|
46
46
|
reference file showing the format. This is documentation, not a runtime asset.
|
|
47
47
|
|
|
48
48
|
2. **Create a TypeScript renderer** in `src/templates/<framework>.ts`:
|
|
49
|
-
- Define a params interface with `
|
|
49
|
+
- Define a params interface with `projectSlug`, `assignmentSlug`, `projectDir`, `assignmentDir`
|
|
50
50
|
- Export a render function returning the file content as a string
|
|
51
51
|
- Embed protocol knowledge directly in the template literal (do not read files at runtime)
|
|
52
52
|
|
|
@@ -4,7 +4,7 @@ Syntaur plugin for Claude Code. Installed automatically during `syntaur setup`.
|
|
|
4
4
|
|
|
5
5
|
## What's included
|
|
6
6
|
|
|
7
|
-
- **Skills:** grab-assignment, plan-assignment, complete-assignment, create-
|
|
7
|
+
- **Skills:** grab-assignment, plan-assignment, complete-assignment, create-project, create-assignment, syntaur-protocol
|
|
8
8
|
- **Agents:** syntaur-protocol (background)
|
|
9
9
|
- **Hooks:** write boundary enforcement (PreToolUse)
|
|
10
10
|
- **Commands:** track-session
|
|
@@ -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
|
-
|
|
48
|
+
project.md # Human-authored: goal, context, success criteria
|
|
49
49
|
agent.md # Human-authored: universal agent instructions
|
|
50
50
|
claude.md # Human-authored: Claude Code-specific instructions
|
|
51
51
|
_index-assignments.md # Derived: assignment summary table
|
|
52
52
|
_index-plans.md # Derived: plan status summary
|
|
53
53
|
_index-decisions.md # Derived: decision record summary
|
|
54
|
-
_status.md # Derived:
|
|
54
|
+
_status.md # Derived: project status rollup
|
|
55
55
|
assignments/
|
|
56
56
|
<assignment-slug>/
|
|
57
|
-
assignment.md # Agent-writable: source of truth for state
|
|
58
|
-
plan
|
|
57
|
+
assignment.md # Agent-writable: source of truth for state (includes ## Todos)
|
|
58
|
+
plan*.md # Agent-writable: versioned implementation plans (0+, optional)
|
|
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
|
|
@@ -72,13 +72,13 @@ Syntaur is a **markdown-based, filesystem-hosted protocol** that coordinates wor
|
|
|
72
72
|
## File Ownership Model
|
|
73
73
|
|
|
74
74
|
### Human-Authored (READ-ONLY for agents)
|
|
75
|
-
- `
|
|
75
|
+
- `project.md` — project overview, goal, context, success criteria
|
|
76
76
|
- `agent.md` — universal agent instructions
|
|
77
77
|
- `claude.md` — Claude Code-specific instructions
|
|
78
78
|
|
|
79
79
|
### Agent-Writable (single-writer per assignment)
|
|
80
|
-
- `assignment.md` — source of truth for assignment state
|
|
81
|
-
- `plan
|
|
80
|
+
- `assignment.md` — source of truth for assignment state (includes `## Todos` checklist)
|
|
81
|
+
- `plan*.md` — versioned implementation plans (optional, one per `## Todos` entry: `plan.md`, `plan-v2.md`, ...)
|
|
82
82
|
- `scratchpad.md` — unstructured working notes
|
|
83
83
|
- `handoff.md` — append-only handoff log
|
|
84
84
|
- `decision-record.md` — append-only decision log
|
|
@@ -128,8 +128,8 @@ Only the assigned agent may write to its own assignment folder.
|
|
|
128
128
|
- `pending` + unmet dependencies = structural wait (automatic, no action needed)
|
|
129
129
|
- `blocked` = runtime obstacle requiring human intervention (must set `blockedReason`)
|
|
130
130
|
|
|
131
|
-
###
|
|
132
|
-
1. `archived: true` in
|
|
131
|
+
### Project Status Rollup (computed, first-match-wins)
|
|
132
|
+
1. `archived: true` in project.md → `archived`
|
|
133
133
|
2. ALL assignments `completed` → `completed`
|
|
134
134
|
3. ANY `in_progress` or `review` → `active`
|
|
135
135
|
4. ANY `failed` → `failed`
|
|
@@ -151,31 +151,31 @@ Only the assigned agent may write to its own assignment folder.
|
|
|
151
151
|
| `syntaur setup-adapter <framework>` | Generate adapter files for cursor, codex, or opencode |
|
|
152
152
|
| `syntaur uninstall [--all]` | Remove plugins and optionally `~/.syntaur` data |
|
|
153
153
|
|
|
154
|
-
###
|
|
154
|
+
### Project & Assignment Creation
|
|
155
155
|
| Command | Description |
|
|
156
156
|
|---------|-------------|
|
|
157
|
-
| `syntaur create-
|
|
158
|
-
| `syntaur create-assignment <title> --
|
|
157
|
+
| `syntaur create-project <title> [--slug S] [--dir D]` | Create new project with full scaffolding |
|
|
158
|
+
| `syntaur create-assignment <title> --project M [--priority P] [--depends-on D] [--slug S]` | Create assignment in a project |
|
|
159
159
|
| `syntaur create-assignment <title> --one-off` | Create standalone one-off assignment |
|
|
160
160
|
|
|
161
161
|
### State Transitions
|
|
162
162
|
| Command | Description |
|
|
163
163
|
|---------|-------------|
|
|
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> --
|
|
164
|
+
| `syntaur assign <slug> --agent <name> --project <project>` | Set assignee |
|
|
165
|
+
| `syntaur start <slug> --project <project>` | pending → in_progress |
|
|
166
|
+
| `syntaur review <slug> --project <project>` | in_progress → review |
|
|
167
|
+
| `syntaur complete <slug> --project <project>` | in_progress/review → completed |
|
|
168
|
+
| `syntaur block <slug> --project <project> --reason <text>` | → blocked |
|
|
169
|
+
| `syntaur unblock <slug> --project <project>` | blocked → in_progress |
|
|
170
|
+
| `syntaur fail <slug> --project <project>` | → failed |
|
|
171
|
+
| `syntaur reopen <slug> --project <project>` | completed/failed → in_progress |
|
|
172
172
|
|
|
173
173
|
### Session Tracking
|
|
174
174
|
| Command | Description |
|
|
175
175
|
|---------|-------------|
|
|
176
|
-
| `syntaur track-session --
|
|
176
|
+
| `syntaur track-session --project M --assignment A --agent N` | Register agent session |
|
|
177
177
|
|
|
178
|
-
All commands support `--dir <path>` to override the default `~/.syntaur/
|
|
178
|
+
All commands support `--dir <path>` to override the default `~/.syntaur/projects/` directory.
|
|
179
179
|
|
|
180
180
|
---
|
|
181
181
|
|
|
@@ -192,7 +192,7 @@ plugin/
|
|
|
192
192
|
skills/
|
|
193
193
|
syntaur-protocol/SKILL.md # Core protocol rules (background)
|
|
194
194
|
grab-assignment/SKILL.md # Claim a pending assignment
|
|
195
|
-
create-
|
|
195
|
+
create-project/SKILL.md # Create new project
|
|
196
196
|
create-assignment/SKILL.md # Create new assignment
|
|
197
197
|
plan-assignment/SKILL.md # Write implementation plan
|
|
198
198
|
complete-assignment/SKILL.md # Handoff and complete
|
|
@@ -212,17 +212,17 @@ plugin/
|
|
|
212
212
|
| Skill | Trigger | Purpose |
|
|
213
213
|
|-------|---------|---------|
|
|
214
214
|
| `/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
|
|
215
|
+
| `/grab-assignment` | User says "grab assignment" or starts work on a project | Discover pending assignments, claim one, create context.json |
|
|
216
|
+
| `/create-project` | User wants to create a new project | Run CLI scaffolding, guide through editing project files |
|
|
217
|
+
| `/create-assignment` | User wants to add an assignment to a project | Create assignment with all supporting files |
|
|
218
|
+
| `/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
219
|
| `/complete-assignment` | User is done with assignment work | Verify criteria, write handoff, transition state, close session |
|
|
220
220
|
|
|
221
221
|
### Hooks
|
|
222
222
|
|
|
223
223
|
| Hook | Event | Behavior |
|
|
224
224
|
|------|-------|----------|
|
|
225
|
-
| PostToolUse: ExitPlanMode | User exits plan mode | Prompts to
|
|
225
|
+
| 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
226
|
| SessionEnd | Claude Code session exits | Runs session-cleanup.sh to mark session as stopped |
|
|
227
227
|
| PreToolUse: enforce-boundaries | Edit/Write/MultiEdit | Validates target path is within assignment boundaries |
|
|
228
228
|
|
|
@@ -240,27 +240,27 @@ syntaur # Dashboard is the default command
|
|
|
240
240
|
```
|
|
241
241
|
|
|
242
242
|
### Features
|
|
243
|
-
- **Overview page:**
|
|
244
|
-
- **
|
|
243
|
+
- **Overview page:** Project stats, quick actions, attention items
|
|
244
|
+
- **Project detail:** Assignment listing, resources, memories, status
|
|
245
245
|
- **Assignment detail:** Full assignment view with all fields, criteria checklist
|
|
246
246
|
- **Kanban board:** Drag assignments between status columns
|
|
247
247
|
- **Agent sessions:** Track active/completed/stopped agent sessions
|
|
248
248
|
- **Server tracking:** Discover running dev servers via tmux session scanning
|
|
249
249
|
- **Real-time updates:** WebSocket pushes file changes to the browser
|
|
250
|
-
- **Markdown editing:** Edit
|
|
250
|
+
- **Markdown editing:** Edit project.md, assignment.md, plan files, scratchpad.md in-browser
|
|
251
251
|
- **Attention queue:** Highlights blocked, failed, and review-pending items
|
|
252
252
|
|
|
253
253
|
### API Endpoints
|
|
254
254
|
- `GET /api/overview` — Dashboard summary stats
|
|
255
|
-
- `GET /api/
|
|
256
|
-
- `GET /api/
|
|
257
|
-
- `GET /api/
|
|
258
|
-
- `GET /api/assignments` — All assignments across
|
|
255
|
+
- `GET /api/projects` — List all projects
|
|
256
|
+
- `GET /api/projects/:slug` — Project detail with assignments
|
|
257
|
+
- `GET /api/projects/:slug/assignments/:aslug` — Assignment detail
|
|
258
|
+
- `GET /api/assignments` — All assignments across projects
|
|
259
259
|
- `GET /api/attention` — Items needing attention
|
|
260
260
|
- `GET /api/agent-sessions` — Agent session list
|
|
261
|
-
- `POST /api/
|
|
262
|
-
- `POST /api/
|
|
263
|
-
- `PATCH /api/
|
|
261
|
+
- `POST /api/projects` — Create project
|
|
262
|
+
- `POST /api/projects/:slug/assignments` — Create assignment
|
|
263
|
+
- `PATCH /api/projects/:slug/assignments/:aslug` — Update assignment
|
|
264
264
|
- WebSocket at `/ws` for real-time file change notifications
|
|
265
265
|
|
|
266
266
|
### Architecture
|
|
@@ -276,9 +276,9 @@ syntaur # Dashboard is the default command
|
|
|
276
276
|
Syntaur supports Cursor, Codex, and OpenCode via generated adapter files.
|
|
277
277
|
|
|
278
278
|
```bash
|
|
279
|
-
syntaur setup-adapter cursor --
|
|
280
|
-
syntaur setup-adapter codex --
|
|
281
|
-
syntaur setup-adapter opencode --
|
|
279
|
+
syntaur setup-adapter cursor --project <slug> --assignment <slug>
|
|
280
|
+
syntaur setup-adapter codex --project <slug> --assignment <slug>
|
|
281
|
+
syntaur setup-adapter opencode --project <slug> --assignment <slug>
|
|
282
282
|
```
|
|
283
283
|
|
|
284
284
|
| Framework | Generated Files | Discovery |
|
|
@@ -297,17 +297,17 @@ Adapters embed protocol knowledge (write boundaries, lifecycle states, CLI comma
|
|
|
297
297
|
|
|
298
298
|
**assignment.md:** id, slug, title, status, priority, created, updated, assignee, externalIds, dependsOn, blockedReason, workspace (repository, worktreePath, branch, parentBranch), tags
|
|
299
299
|
|
|
300
|
-
**plan.md:** assignment, status (draft/approved/in_progress/completed), created, updated
|
|
300
|
+
**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
|
|
301
301
|
|
|
302
302
|
**handoff.md:** assignment, updated, handoffCount
|
|
303
303
|
|
|
304
304
|
**decision-record.md:** assignment, updated, decisionCount
|
|
305
305
|
|
|
306
|
-
**
|
|
306
|
+
**project.md:** id, slug, title, archived, archivedAt, archivedReason, created, updated, externalIds, tags
|
|
307
307
|
|
|
308
|
-
**manifest.md:** version,
|
|
308
|
+
**manifest.md:** version, project, generated
|
|
309
309
|
|
|
310
|
-
**_status.md:**
|
|
310
|
+
**_status.md:** project, generated, status, progress (total/completed/in_progress/blocked/pending/review/failed), needsAttention (blockedCount/failedCount/unansweredQuestions)
|
|
311
311
|
|
|
312
312
|
### Conventions
|
|
313
313
|
- **Timestamps:** RFC 3339 / ISO 8601 with UTC: `2026-03-18T14:30:00Z`
|
|
@@ -324,12 +324,12 @@ Adapters embed protocol knowledge (write boundaries, lifecycle states, CLI comma
|
|
|
324
324
|
# 1. Run guided setup
|
|
325
325
|
npx syntaur@latest setup
|
|
326
326
|
|
|
327
|
-
# 2. Create your first
|
|
328
|
-
syntaur create-
|
|
327
|
+
# 2. Create your first project
|
|
328
|
+
syntaur create-project "My First Project"
|
|
329
329
|
|
|
330
330
|
# 3. Create assignments
|
|
331
|
-
syntaur create-assignment "Design the schema" --
|
|
332
|
-
syntaur create-assignment "Implement the API" --
|
|
331
|
+
syntaur create-assignment "Design the schema" --project my-first-project --priority high
|
|
332
|
+
syntaur create-assignment "Implement the API" --project my-first-project --depends-on design-the-schema
|
|
333
333
|
|
|
334
334
|
# 4. Start the dashboard
|
|
335
335
|
syntaur dashboard
|
|
@@ -338,7 +338,7 @@ syntaur dashboard
|
|
|
338
338
|
### Agent Workflow
|
|
339
339
|
```bash
|
|
340
340
|
# In Claude Code, use skills:
|
|
341
|
-
/grab-assignment my-first-
|
|
341
|
+
/grab-assignment my-first-project # Claim a pending assignment
|
|
342
342
|
/plan-assignment # Write implementation plan
|
|
343
343
|
# ... do the work ...
|
|
344
344
|
/complete-assignment # Handoff and complete
|
|
@@ -351,10 +351,10 @@ syntaur dashboard
|
|
|
351
351
|
Created by `/grab-assignment` in the current working directory. Contains:
|
|
352
352
|
```json
|
|
353
353
|
{
|
|
354
|
-
"
|
|
354
|
+
"projectSlug": "my-first-project",
|
|
355
355
|
"assignmentSlug": "design-the-schema",
|
|
356
|
-
"
|
|
357
|
-
"assignmentDir": "/Users/you/.syntaur/
|
|
356
|
+
"projectDir": "/Users/you/.syntaur/projects/my-first-project",
|
|
357
|
+
"assignmentDir": "/Users/you/.syntaur/projects/my-first-project/assignments/design-the-schema",
|
|
358
358
|
"workspaceRoot": "/Users/you/projects/my-app",
|
|
359
359
|
"title": "Design the schema",
|
|
360
360
|
"branch": "feature/design-the-schema",
|
|
@@ -370,7 +370,7 @@ Read by `/plan-assignment`, `/complete-assignment`, and the write boundary hook
|
|
|
370
370
|
## Common Questions
|
|
371
371
|
|
|
372
372
|
**Q: How do I see what assignments are available?**
|
|
373
|
-
A: Use `/grab-assignment <
|
|
373
|
+
A: Use `/grab-assignment <project-slug>` — it lists pending assignments. Or check the dashboard, or read `_index-assignments.md`.
|
|
374
374
|
|
|
375
375
|
**Q: Can two agents work on the same assignment?**
|
|
376
376
|
A: No. Single-writer guarantee — one agent per assignment folder. Use separate assignments for parallel work.
|
|
@@ -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.
|