syntaur 0.2.0 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dashboard/dist/assets/{_basePickBy-CHKX1r7P.js → _basePickBy-BhaCV7eH.js} +1 -1
- package/dashboard/dist/assets/{_baseUniq-CTxTc4MS.js → _baseUniq-CDPcqrs2.js} +1 -1
- package/dashboard/dist/assets/{arc-BUo5zftd.js → arc-BP0RxLwl.js} +1 -1
- package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-CrJLm-P0.js → architectureDiagram-2XIMDMQ5-BDzvaeJp.js} +1 -1
- package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-BK60lBBJ.js → blockDiagram-WCTKOSBZ-ZeL9mROo.js} +1 -1
- package/dashboard/dist/assets/{c4Diagram-IC4MRINW-C7oJEvA0.js → c4Diagram-IC4MRINW-7S5bvFLp.js} +1 -1
- package/dashboard/dist/assets/channel-CcB_wcgb.js +1 -0
- package/dashboard/dist/assets/{chunk-4BX2VUAB-CjUPlzHz.js → chunk-4BX2VUAB-Ca7R4nv5.js} +1 -1
- package/dashboard/dist/assets/{chunk-55IACEB6-6HmWguiO.js → chunk-55IACEB6-flEv13FB.js} +1 -1
- package/dashboard/dist/assets/{chunk-FMBD7UC4-CLuJnd1b.js → chunk-FMBD7UC4-CfcYWBM6.js} +1 -1
- package/dashboard/dist/assets/{chunk-JSJVCQXG-B4d62qWV.js → chunk-JSJVCQXG-Dw4yL0VS.js} +1 -1
- package/dashboard/dist/assets/{chunk-KX2RTZJC-AsEKRPq2.js → chunk-KX2RTZJC-B2cDe40G.js} +1 -1
- package/dashboard/dist/assets/{chunk-NQ4KR5QH-DQhHHvwY.js → chunk-NQ4KR5QH-LZVm0IWg.js} +1 -1
- package/dashboard/dist/assets/{chunk-QZHKN3VN-Ds1TtI3E.js → chunk-QZHKN3VN-Dg0EeHNI.js} +1 -1
- package/dashboard/dist/assets/{chunk-WL4C6EOR-C7jE3-cR.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-C9ka5v1m.js → cose-bilkent-S5V4N54A-D-3JzLoS.js} +1 -1
- package/dashboard/dist/assets/{dagre-KLK3FWXG-BbgPQBKy.js → dagre-KLK3FWXG-d_mbczhU.js} +1 -1
- package/dashboard/dist/assets/{diagram-E7M64L7V-DpdeZFD4.js → diagram-E7M64L7V-BUyAp8pW.js} +1 -1
- package/dashboard/dist/assets/{diagram-IFDJBPK2-FlHLQzOV.js → diagram-IFDJBPK2-C8doXcyQ.js} +1 -1
- package/dashboard/dist/assets/{diagram-P4PSJMXO-B22NkEF_.js → diagram-P4PSJMXO-BUSmHa55.js} +1 -1
- package/dashboard/dist/assets/{erDiagram-INFDFZHY-zSqmtDid.js → erDiagram-INFDFZHY-Bn5_0LPU.js} +1 -1
- package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-BP_0XmVV.js → flowDiagram-PKNHOUZH-CnEjerQM.js} +1 -1
- package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-8uRyYgZV.js → ganttDiagram-A5KZAMGK-CL94fbyy.js} +1 -1
- package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-JFqg8sv4.js → gitGraphDiagram-K3NZZRJ6-4i_PeG8V.js} +1 -1
- package/dashboard/dist/assets/{graph-a-PAH599.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-C3kq7Nbv.js → infoDiagram-LFFYTUFH-CdUsuNgZ.js} +1 -1
- package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-Kqi4EZ-n.js → ishikawaDiagram-PHBUUO56-BjggRlUx.js} +1 -1
- package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-CTfv0Wcr.js → journeyDiagram-4ABVD52K-V4AgexlR.js} +1 -1
- package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-Dmx0lgvR.js → kanban-definition-K7BYSVSG-ChlylQRf.js} +1 -1
- package/dashboard/dist/assets/{layout-KKRbT2Od.js → layout-DLcz9AmA.js} +1 -1
- package/dashboard/dist/assets/{linear-5egaBiw7.js → linear-l2xnSHze.js} +1 -1
- package/dashboard/dist/assets/{mermaid.core-C9pF_oFQ.js → mermaid.core-DKO1ytRW.js} +4 -4
- package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-C7HXYEXt.js → mindmap-definition-YRQLILUH-DTmTPHrT.js} +1 -1
- package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-DkdZm-YP.js → pieDiagram-SKSYHLDU-CwK80y8Y.js} +1 -1
- package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-DkcRJs5F.js → quadrantDiagram-337W2JSQ-Be1xqW_w.js} +1 -1
- package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-BaTDVYTl.js → requirementDiagram-Z7DCOOCP-JcspXCs0.js} +1 -1
- package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-DvPLbGV5.js → sankeyDiagram-WA2Y5GQK-nJb1BInq.js} +1 -1
- package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-DQoZ2xMK.js → sequenceDiagram-2WXFIKYE-DUrclEgA.js} +1 -1
- package/dashboard/dist/assets/{stateDiagram-RAJIS63D-CS4l0OjM.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-aC0iCFCW.js → timeline-definition-YZTLITO2-kM-oVLNz.js} +1 -1
- package/dashboard/dist/assets/{treemap-KZPCXAKY-Ie-PFjgx.js → treemap-KZPCXAKY-CYziFlrQ.js} +1 -1
- package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-CJN3ExTQ.js → vennDiagram-LZ73GAT5-DX0DbxBN.js} +1 -1
- package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-DSiDu1CN.js → xychartDiagram-JWTSCODW-BGqM42ZM.js} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/dist/dashboard/server.d.ts +5 -0
- package/dist/dashboard/server.js +2185 -609
- package/dist/dashboard/server.js.map +1 -1
- package/dist/index.js +2596 -959
- package/dist/index.js.map +1 -1
- package/examples/playbooks/keep-records-updated.md +14 -8
- package/examples/playbooks/read-before-plan.md +8 -5
- package/examples/sample-project/_status.md +1 -1
- package/examples/sample-project/assignments/design-auth-schema/assignment.md +4 -17
- 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-project/assignments/implement-jwt-middleware/assignment.md +4 -17
- 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-project/assignments/write-auth-tests/assignment.md +4 -8
- 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/package.json +1 -1
- package/platforms/claude-code/.claude-plugin/plugin.json +5 -1
- package/platforms/claude-code/agents/syntaur-expert.md +46 -15
- package/platforms/claude-code/commands/track-session/track-session.md +43 -18
- package/platforms/claude-code/hooks/hooks.json +11 -0
- package/platforms/claude-code/hooks/session-cleanup.sh +13 -23
- package/platforms/claude-code/hooks/session-start.sh +80 -0
- package/platforms/claude-code/hooks/statusline.sh +110 -0
- package/platforms/claude-code/references/file-ownership.md +15 -3
- package/platforms/claude-code/references/protocol-summary.md +19 -5
- package/platforms/claude-code/skills/complete-assignment/SKILL.md +14 -0
- package/platforms/claude-code/skills/create-assignment/SKILL.md +12 -10
- package/platforms/claude-code/skills/grab-assignment/SKILL.md +30 -15
- package/platforms/claude-code/skills/plan-assignment/SKILL.md +16 -8
- package/platforms/claude-code/skills/syntaur-protocol/SKILL.md +21 -11
- package/platforms/codex/.codex-plugin/plugin.json +1 -1
- package/platforms/codex/agents/syntaur-operator.md +39 -25
- package/platforms/codex/references/file-ownership.md +14 -3
- package/platforms/codex/references/protocol-summary.md +19 -5
- package/platforms/codex/scripts/resolve-session.sh +49 -0
- package/platforms/codex/skills/complete-assignment/SKILL.md +1 -0
- package/platforms/codex/skills/create-assignment/SKILL.md +13 -8
- package/platforms/codex/skills/grab-assignment/SKILL.md +7 -5
- package/platforms/codex/skills/plan-assignment/SKILL.md +8 -4
- package/platforms/codex/skills/syntaur-protocol/SKILL.md +26 -13
- package/dashboard/dist/assets/channel-DdltvFFH.js +0 -1
- package/dashboard/dist/assets/classDiagram-VBA2DB6C-BHqdFE-8.js +0 -1
- package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-BHqdFE-8.js +0 -1
- package/dashboard/dist/assets/clone-CBJOOeOm.js +0 -1
- package/dashboard/dist/assets/index-CoVCLSh2.css +0 -1
- package/dashboard/dist/assets/index-yyAIuzrP.js +0 -471
- package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-DkBtE1WJ.js +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "Keep Records Updated"
|
|
3
3
|
slug: keep-records-updated
|
|
4
|
-
description: "Agents must keep assignment.md
|
|
4
|
+
description: "Agents must keep assignment.md criteria, progress.md, and related records current in real-time"
|
|
5
5
|
when_to_use: "After every meaningful action, when completing acceptance criteria, when starting or stopping work"
|
|
6
6
|
created: "2026-04-02T00:00:00Z"
|
|
7
|
-
updated: "2026-04-
|
|
7
|
+
updated: "2026-04-20T00:00:00Z"
|
|
8
8
|
tags:
|
|
9
9
|
- protocol
|
|
10
10
|
- recordkeeping
|
|
@@ -13,18 +13,24 @@ tags:
|
|
|
13
13
|
# Keep Records Updated
|
|
14
14
|
|
|
15
15
|
## After every meaningful action:
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
16
|
+
- Append a new entry to `progress.md` with what you did
|
|
17
|
+
- Progress entries live in `progress.md` (reverse-chronological order, newest first with a `## <ISO 8601 timestamp>` heading). Do NOT add a `## Progress` section to `assignment.md` — that section is removed as of protocol v2.0.
|
|
18
|
+
- Bump `entryCount` and `updated` in `progress.md`'s frontmatter.
|
|
19
19
|
|
|
20
20
|
## When you complete an acceptance criterion:
|
|
21
|
-
- Check it off in the `## Acceptance Criteria` section immediately
|
|
21
|
+
- Check it off in the `## Acceptance Criteria` section of `assignment.md` immediately
|
|
22
22
|
- Do not batch these up -- mark them as you go
|
|
23
23
|
|
|
24
|
+
## When you have a question, note, or piece of feedback:
|
|
25
|
+
- Run `syntaur comment <slug-or-uuid> "body" --type question|note|feedback [--reply-to <id>]`
|
|
26
|
+
- Never edit `comments.md` directly — all writes are CLI-mediated
|
|
27
|
+
- Questions carry a `resolved` flag that can be toggled from the dashboard
|
|
28
|
+
|
|
24
29
|
## When starting work:
|
|
25
|
-
-
|
|
30
|
+
- Append an entry to `progress.md` noting you've begun and what your approach is
|
|
26
31
|
- If any plan files exist (plan.md, plan-v2.md, ...), update their task checkboxes as you complete steps
|
|
27
32
|
|
|
28
33
|
## When stopping or handing off:
|
|
29
|
-
-
|
|
34
|
+
- Append a final entry to `progress.md` summarizing current state
|
|
35
|
+
- Write a structured handoff entry in `handoff.md`
|
|
30
36
|
- Note anything the next agent needs to know
|
|
@@ -4,7 +4,7 @@ slug: read-before-plan
|
|
|
4
4
|
description: "Agents must read all project context files before creating or modifying a plan"
|
|
5
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
|
-
updated: "2026-04-
|
|
7
|
+
updated: "2026-04-20T00:00:00Z"
|
|
8
8
|
tags:
|
|
9
9
|
- protocol
|
|
10
10
|
- planning
|
|
@@ -14,14 +14,17 @@ tags:
|
|
|
14
14
|
|
|
15
15
|
Before creating or modifying any plan file (plan.md, plan-v2.md, ...), read these files in order:
|
|
16
16
|
|
|
17
|
+
For project-nested assignments:
|
|
17
18
|
1. `manifest.md` -- understand the project structure
|
|
18
19
|
2. `project.md` -- understand the goal and scope
|
|
19
|
-
3. `
|
|
20
|
-
4. `
|
|
21
|
-
5. `
|
|
20
|
+
3. `assignment.md` -- understand your specific task, acceptance criteria, and dependencies. Frontmatter includes `project: <slug> | null` and `type: <classification> | null`.
|
|
21
|
+
4. `progress.md` (if exists) -- reverse-chron log of what has been done on this assignment
|
|
22
|
+
5. `comments.md` (if exists) -- open questions, notes, and feedback
|
|
22
23
|
6. `handoff.md` (if exists) -- understand what previous agents did and learned
|
|
23
24
|
7. `decision-record.md` (if exists) -- understand past decisions and their rationale
|
|
24
25
|
|
|
26
|
+
For standalone assignments (at `~/.syntaur/assignments/<uuid>/`), skip `manifest.md` and `project.md` — those only exist for project-nested assignments.
|
|
27
|
+
|
|
25
28
|
Do NOT skip files because you think you know what's in them. Context from prior agents is often critical.
|
|
26
29
|
|
|
27
|
-
If the assignment has `dependsOn` entries, read those assignments too --
|
|
30
|
+
If the assignment has `dependsOn` entries, read those assignments too -- and read **their** `decision-record.md` first. Upstream decisions are binding constraints you must not silently contradict. (The grab-assignment skill auto-loads these.)
|
|
@@ -44,4 +44,4 @@ graph TD
|
|
|
44
44
|
|
|
45
45
|
- **0 blocked** assignments
|
|
46
46
|
- **0 failed** assignments
|
|
47
|
-
- **1
|
|
47
|
+
- **1 open** question in [implement-jwt-middleware/comments.md](./assignments/implement-jwt-middleware/comments.md)
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
id: d1e2f3a4-b5c6-7890-abcd-111111111111
|
|
3
3
|
slug: design-auth-schema
|
|
4
4
|
title: Design Auth Database Schema
|
|
5
|
+
project: build-auth-system
|
|
6
|
+
type: feature
|
|
5
7
|
status: completed
|
|
6
8
|
priority: high
|
|
7
9
|
created: "2026-03-15T09:30:00Z"
|
|
@@ -40,25 +42,10 @@ Design the PostgreSQL database schema for the authentication system. This includ
|
|
|
40
42
|
|
|
41
43
|
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.
|
|
42
44
|
|
|
43
|
-
## Questions & Answers
|
|
44
|
-
|
|
45
|
-
### Q: Should we use UUIDs or auto-incrementing integers for user IDs?
|
|
46
|
-
**Asked:** 2026-03-16T10:00:00Z
|
|
47
|
-
**A:** Use UUIDs (v4). They avoid enumeration attacks and simplify future sharding. Generate them in the application layer, not the database.
|
|
48
|
-
|
|
49
|
-
## Progress
|
|
50
|
-
|
|
51
|
-
### 2026-03-17T10:00:00Z
|
|
52
|
-
Completed all migration scripts and schema design. Final schema includes three tables: `users`, `sessions`, and `refresh_tokens`. Added composite index on `sessions(user_id, revoked_at)` for the active-session lookup query. All migrations tested against a clean database. Ready for handoff to JWT middleware implementation.
|
|
53
|
-
|
|
54
|
-
### 2026-03-16T14:00:00Z
|
|
55
|
-
Draft schema complete for users and sessions tables. Working on refresh token rotation tracking. Decided to add a `token_family` column to detect reuse of old refresh tokens.
|
|
56
|
-
|
|
57
|
-
### 2026-03-16T09:30:00Z
|
|
58
|
-
Started schema design. Reviewed auth requirements document. Planning three tables: users, sessions, refresh_tokens.
|
|
59
|
-
|
|
60
45
|
## Links
|
|
61
46
|
|
|
47
|
+
- [Progress](./progress.md)
|
|
48
|
+
- [Comments](./comments.md)
|
|
62
49
|
- [Scratchpad](./scratchpad.md)
|
|
63
50
|
- [Handoff](./handoff.md)
|
|
64
51
|
- [Decision Record](./decision-record.md)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
assignment: design-auth-schema
|
|
3
|
+
entryCount: 2
|
|
4
|
+
generated: "2026-03-17T10:00:00Z"
|
|
5
|
+
updated: "2026-03-16T10:05:00Z"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Comments
|
|
9
|
+
|
|
10
|
+
## c-1
|
|
11
|
+
|
|
12
|
+
**Recorded:** 2026-03-16T10:00:00Z
|
|
13
|
+
**Author:** claude-2
|
|
14
|
+
**Type:** question
|
|
15
|
+
**Resolved:** true
|
|
16
|
+
|
|
17
|
+
Should we use UUIDs or auto-incrementing integers for user IDs?
|
|
18
|
+
|
|
19
|
+
## c-2
|
|
20
|
+
|
|
21
|
+
**Recorded:** 2026-03-16T10:05:00Z
|
|
22
|
+
**Author:** human
|
|
23
|
+
**Type:** note
|
|
24
|
+
**Reply to:** c-1
|
|
25
|
+
|
|
26
|
+
Use UUIDs (v4). They avoid enumeration attacks and simplify future sharding. Generate them in the application layer, not the database.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
assignment: design-auth-schema
|
|
3
|
+
entryCount: 3
|
|
4
|
+
generated: "2026-03-16T09:30:00Z"
|
|
5
|
+
updated: "2026-03-17T10:00:00Z"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Progress
|
|
9
|
+
|
|
10
|
+
## 2026-03-17T10:00:00Z
|
|
11
|
+
|
|
12
|
+
Completed all migration scripts and schema design. Final schema includes three tables: `users`, `sessions`, and `refresh_tokens`. Added composite index on `sessions(user_id, revoked_at)` for the active-session lookup query. All migrations tested against a clean database. Ready for handoff to JWT middleware implementation.
|
|
13
|
+
|
|
14
|
+
## 2026-03-16T14:00:00Z
|
|
15
|
+
|
|
16
|
+
Draft schema complete for users and sessions tables. Working on refresh token rotation tracking. Decided to add a `token_family` column to detect reuse of old refresh tokens.
|
|
17
|
+
|
|
18
|
+
## 2026-03-16T09:30:00Z
|
|
19
|
+
|
|
20
|
+
Started schema design. Reviewed auth requirements document. Planning three tables: users, sessions, refresh_tokens.
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
id: d1e2f3a4-b5c6-7890-abcd-222222222222
|
|
3
3
|
slug: implement-jwt-middleware
|
|
4
4
|
title: Implement JWT Authentication Middleware
|
|
5
|
+
project: build-auth-system
|
|
6
|
+
type: feature
|
|
5
7
|
status: in_progress
|
|
6
8
|
priority: high
|
|
7
9
|
created: "2026-03-15T09:30:00Z"
|
|
@@ -44,25 +46,10 @@ Implement Express.js middleware that validates JWT access tokens on protected ro
|
|
|
44
46
|
|
|
45
47
|
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.
|
|
46
48
|
|
|
47
|
-
## Questions & Answers
|
|
48
|
-
|
|
49
|
-
### Q: Should the refresh token endpoint require the old access token or just the refresh token?
|
|
50
|
-
**Asked:** 2026-03-18T11:00:00Z
|
|
51
|
-
**A:** pending
|
|
52
|
-
|
|
53
|
-
## Progress
|
|
54
|
-
|
|
55
|
-
### 2026-03-18T14:30:00Z
|
|
56
|
-
Implemented role-based route guard middleware (`requireRole`). Working on the refresh token endpoint next. The token generation and basic validation middleware are working and passing manual tests. Need to wire up the refresh token rotation logic using the `token_family` pattern from the schema design.
|
|
57
|
-
|
|
58
|
-
### 2026-03-18T10:00:00Z
|
|
59
|
-
JWT validation middleware is functional. It extracts the token from the Authorization header, verifies the RS256 signature, checks expiry, and looks up the `jti` in the sessions table to confirm the session is not revoked. Added proper error responses for expired, invalid, and revoked tokens.
|
|
60
|
-
|
|
61
|
-
### 2026-03-17T10:30:00Z
|
|
62
|
-
Started implementation. Set up RS256 key pair loading from environment variables. Implemented `generateAccessToken` and `generateRefreshToken` functions. Created the login endpoint that authenticates with bcrypt and returns both tokens.
|
|
63
|
-
|
|
64
49
|
## Links
|
|
65
50
|
|
|
51
|
+
- [Progress](./progress.md)
|
|
52
|
+
- [Comments](./comments.md)
|
|
66
53
|
- [Scratchpad](./scratchpad.md)
|
|
67
54
|
- [Handoff](./handoff.md)
|
|
68
55
|
- [Decision Record](./decision-record.md)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
assignment: implement-jwt-middleware
|
|
3
|
+
entryCount: 1
|
|
4
|
+
generated: "2026-03-18T11:00:00Z"
|
|
5
|
+
updated: "2026-03-18T11:00:00Z"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Comments
|
|
9
|
+
|
|
10
|
+
## c-1
|
|
11
|
+
|
|
12
|
+
**Recorded:** 2026-03-18T11:00:00Z
|
|
13
|
+
**Author:** claude-1
|
|
14
|
+
**Type:** question
|
|
15
|
+
**Resolved:** false
|
|
16
|
+
|
|
17
|
+
Should the refresh token endpoint require the old access token or just the refresh token?
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
assignment: implement-jwt-middleware
|
|
3
|
+
entryCount: 3
|
|
4
|
+
generated: "2026-03-17T10:30:00Z"
|
|
5
|
+
updated: "2026-03-18T14:30:00Z"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Progress
|
|
9
|
+
|
|
10
|
+
## 2026-03-18T14:30:00Z
|
|
11
|
+
|
|
12
|
+
Implemented role-based route guard middleware (`requireRole`). Working on the refresh token endpoint next. The token generation and basic validation middleware are working and passing manual tests. Need to wire up the refresh token rotation logic using the `token_family` pattern from the schema design.
|
|
13
|
+
|
|
14
|
+
## 2026-03-18T10:00:00Z
|
|
15
|
+
|
|
16
|
+
JWT validation middleware is functional. It extracts the token from the Authorization header, verifies the RS256 signature, checks expiry, and looks up the `jti` in the sessions table to confirm the session is not revoked. Added proper error responses for expired, invalid, and revoked tokens.
|
|
17
|
+
|
|
18
|
+
## 2026-03-17T10:30:00Z
|
|
19
|
+
|
|
20
|
+
Started implementation. Set up RS256 key pair loading from environment variables. Implemented `generateAccessToken` and `generateRefreshToken` functions. Created the login endpoint that authenticates with bcrypt and returns both tokens.
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
id: d1e2f3a4-b5c6-7890-abcd-333333333333
|
|
3
3
|
slug: write-auth-tests
|
|
4
4
|
title: Write Auth System Tests
|
|
5
|
+
project: build-auth-system
|
|
6
|
+
type: feature
|
|
5
7
|
status: pending
|
|
6
8
|
priority: medium
|
|
7
9
|
created: "2026-03-15T09:30:00Z"
|
|
@@ -42,16 +44,10 @@ Write comprehensive unit and integration tests for the authentication system, co
|
|
|
42
44
|
|
|
43
45
|
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.
|
|
44
46
|
|
|
45
|
-
## Questions & Answers
|
|
46
|
-
|
|
47
|
-
No questions yet.
|
|
48
|
-
|
|
49
|
-
## Progress
|
|
50
|
-
|
|
51
|
-
No progress yet.
|
|
52
|
-
|
|
53
47
|
## Links
|
|
54
48
|
|
|
49
|
+
- [Progress](./progress.md)
|
|
50
|
+
- [Comments](./comments.md)
|
|
55
51
|
- [Scratchpad](./scratchpad.md)
|
|
56
52
|
- [Handoff](./handoff.md)
|
|
57
53
|
- [Decision Record](./decision-record.md)
|
package/package.json
CHANGED
|
@@ -46,8 +46,6 @@ Syntaur is a **markdown-based, filesystem-hosted protocol** that coordinates wor
|
|
|
46
46
|
<project-slug>/
|
|
47
47
|
manifest.md # Derived: root navigation
|
|
48
48
|
project.md # Human-authored: goal, context, success criteria
|
|
49
|
-
agent.md # Human-authored: universal agent instructions
|
|
50
|
-
claude.md # Human-authored: Claude Code-specific instructions
|
|
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
|
|
@@ -56,6 +54,8 @@ Syntaur is a **markdown-based, filesystem-hosted protocol** that coordinates wor
|
|
|
56
54
|
<assignment-slug>/
|
|
57
55
|
assignment.md # Agent-writable: source of truth for state (includes ## Todos)
|
|
58
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
|
---
|
|
@@ -73,18 +82,21 @@ Syntaur is a **markdown-based, filesystem-hosted protocol** that coordinates wor
|
|
|
73
82
|
|
|
74
83
|
### Human-Authored (READ-ONLY for agents)
|
|
75
84
|
- `project.md` — project overview, goal, context, success criteria
|
|
76
|
-
- `agent.md` — universal agent instructions
|
|
77
|
-
- `claude.md` — Claude Code-specific instructions
|
|
78
85
|
|
|
79
86
|
### Agent-Writable (single-writer per assignment)
|
|
80
|
-
- `assignment.md` — source of truth for assignment state (includes `## Todos` checklist)
|
|
87
|
+
- `assignment.md` — source of truth for assignment state (includes `## Todos` checklist). `## Todos` is also the landing spot for cross-assignment requests.
|
|
81
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
|
|
@@ -155,8 +167,14 @@ Only the assigned agent may write to its own assignment folder.
|
|
|
155
167
|
| Command | Description |
|
|
156
168
|
|---------|-------------|
|
|
157
169
|
| `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
|
-
| `syntaur create-assignment <title> --one-off` | Create standalone
|
|
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)
|
|
174
|
+
| Command | Description |
|
|
175
|
+
|---------|-------------|
|
|
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 |
|
|
@@ -173,7 +191,7 @@ Only the assigned agent may write to its own assignment folder.
|
|
|
173
191
|
### Session Tracking
|
|
174
192
|
| Command | Description |
|
|
175
193
|
|---------|-------------|
|
|
176
|
-
| `syntaur track-session --project M --assignment A --agent N
|
|
194
|
+
| `syntaur track-session --project M --assignment A --agent N --session-id <real-id> --transcript-path <path>` | Register agent session. `--session-id` is required and must be the agent runtime's real id (Claude: `~/.claude/sessions/<pid>.json` or SessionStart hook payload; Codex: `payload.id` from `~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl`). Do not synthesize. |
|
|
177
195
|
|
|
178
196
|
All commands support `--dir <path>` to override the default `~/.syntaur/projects/` directory.
|
|
179
197
|
|
|
@@ -200,6 +218,7 @@ plugin/
|
|
|
200
218
|
track-session/track-session.md # Register tmux sessions
|
|
201
219
|
hooks/
|
|
202
220
|
hooks.json # Hook definitions
|
|
221
|
+
session-start.sh # Merge real session_id + transcript_path into existing .syntaur/context.json
|
|
203
222
|
session-cleanup.sh # Mark sessions stopped on exit
|
|
204
223
|
enforce-boundaries.sh # Write boundary enforcement
|
|
205
224
|
references/
|
|
@@ -223,6 +242,7 @@ plugin/
|
|
|
223
242
|
| Hook | Event | Behavior |
|
|
224
243
|
|------|-------|----------|
|
|
225
244
|
| 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` |
|
|
245
|
+
| SessionStart | Claude Code session starts | Runs session-start.sh to merge the real `session_id` + `transcript_path` into an EXISTING `.syntaur/context.json`. Does nothing if context.json is absent (no active assignment). |
|
|
226
246
|
| SessionEnd | Claude Code session exits | Runs session-cleanup.sh to mark session as stopped |
|
|
227
247
|
| PreToolUse: enforce-boundaries | Edit/Write/MultiEdit | Validates target path is within assignment boundaries |
|
|
228
248
|
|
|
@@ -295,10 +315,14 @@ Adapters embed protocol knowledge (write boundaries, lifecycle states, CLI comma
|
|
|
295
315
|
|
|
296
316
|
### Frontmatter Fields by File Type
|
|
297
317
|
|
|
298
|
-
**assignment.md:** id, slug, title, status, priority, created, updated, assignee, externalIds, dependsOn, blockedReason, workspace (repository, worktreePath, branch, parentBranch), tags
|
|
318
|
+
**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
319
|
|
|
300
320
|
**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
321
|
|
|
322
|
+
**progress.md:** assignment, entryCount, generated, updated — body is reverse-chron `## <timestamp>` entries
|
|
323
|
+
|
|
324
|
+
**comments.md:** assignment, entryCount, generated, updated — body entries are `## <id>` with structured metadata lines (Recorded, Author, Type, optional Reply to, optional Resolved)
|
|
325
|
+
|
|
302
326
|
**handoff.md:** assignment, updated, handoffCount
|
|
303
327
|
|
|
304
328
|
**decision-record.md:** assignment, updated, decisionCount
|
|
@@ -307,13 +331,13 @@ Adapters embed protocol knowledge (write boundaries, lifecycle states, CLI comma
|
|
|
307
331
|
|
|
308
332
|
**manifest.md:** version, project, generated
|
|
309
333
|
|
|
310
|
-
**_status.md:** project, generated, status, progress (total/completed/in_progress/blocked/pending/review/failed), needsAttention (blockedCount/failedCount
|
|
334
|
+
**_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
335
|
|
|
312
336
|
### Conventions
|
|
313
337
|
- **Timestamps:** RFC 3339 / ISO 8601 with UTC: `2026-03-18T14:30:00Z`
|
|
314
338
|
- **Paths:** Absolute expanded form in YAML (never `~`), relative in markdown links
|
|
315
|
-
- **Slugs:** Lowercase, hyphen-separated, match folder names
|
|
316
|
-
- **Protocol version:** `"
|
|
339
|
+
- **Slugs:** Lowercase, hyphen-separated, match folder names (project-nested). For standalone assignments, the folder is named by UUID and `slug` is display-only.
|
|
340
|
+
- **Protocol version:** `"2.0"` (string, not number)
|
|
317
341
|
|
|
318
342
|
---
|
|
319
343
|
|
|
@@ -348,7 +372,7 @@ syntaur dashboard
|
|
|
348
372
|
|
|
349
373
|
## Context File (.syntaur/context.json)
|
|
350
374
|
|
|
351
|
-
Created by `/grab-assignment` in the current working directory.
|
|
375
|
+
Created by `/grab-assignment` in the current working directory. The SessionStart hook merges `sessionId` / `transcriptPath` into this file on each Claude Code session start — it never creates the file, only enriches an existing one. Contents:
|
|
352
376
|
```json
|
|
353
377
|
{
|
|
354
378
|
"projectSlug": "my-first-project",
|
|
@@ -359,7 +383,8 @@ Created by `/grab-assignment` in the current working directory. Contains:
|
|
|
359
383
|
"title": "Design the schema",
|
|
360
384
|
"branch": "feature/design-the-schema",
|
|
361
385
|
"grabbedAt": "2026-03-18T14:30:00Z",
|
|
362
|
-
"sessionId": "
|
|
386
|
+
"sessionId": "<real-claude-session-id>",
|
|
387
|
+
"transcriptPath": "/Users/you/.claude/projects/<encoded-cwd>/<session-id>.jsonl"
|
|
363
388
|
}
|
|
364
389
|
```
|
|
365
390
|
|
|
@@ -376,7 +401,13 @@ A: Use `/grab-assignment <project-slug>` — it lists pending assignments. Or ch
|
|
|
376
401
|
A: No. Single-writer guarantee — one agent per assignment folder. Use separate assignments for parallel work.
|
|
377
402
|
|
|
378
403
|
**Q: What if I need to ask the human a question?**
|
|
379
|
-
A:
|
|
404
|
+
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.
|
|
405
|
+
|
|
406
|
+
**Q: What goes in `progress.md` vs `handoff.md`?**
|
|
407
|
+
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.
|
|
408
|
+
|
|
409
|
+
**Q: How do I route work to another assignment without breaking the single-writer rule?**
|
|
410
|
+
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
411
|
|
|
381
412
|
**Q: How do indexes get updated?**
|
|
382
413
|
A: Derived files are rebuilt by tooling. They are projections of assignment frontmatter. When divergence occurs, re-run rebuild.
|
|
@@ -11,6 +11,8 @@ arguments:
|
|
|
11
11
|
|
|
12
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
|
+
Only real Claude Code session IDs are accepted — no synthesis. The real id is written to `.syntaur/context.json` by the SessionStart hook, with `~/.claude/sessions/<pid>.json` as the fallback source.
|
|
15
|
+
|
|
14
16
|
## Usage
|
|
15
17
|
|
|
16
18
|
- `/track-session` — register a standalone session
|
|
@@ -29,37 +31,60 @@ Extract optional flags from the argument string:
|
|
|
29
31
|
- `--project <slug>` — project to link to
|
|
30
32
|
- `--assignment <slug>` — assignment to link to
|
|
31
33
|
|
|
32
|
-
### Step 2:
|
|
34
|
+
### Step 2: Source the real session id + transcript path
|
|
35
|
+
|
|
36
|
+
In priority order:
|
|
37
|
+
|
|
38
|
+
1. Read `.syntaur/context.json` if present. If it contains `sessionId`, use it. Also pick up `transcriptPath` if present.
|
|
39
|
+
2. Otherwise, read the most-recently-modified file under `~/.claude/sessions/*.json` whose `cwd` matches `$(pwd)` and use its `sessionId` field. The transcript path is conventionally `~/.claude/projects/<encoded-cwd>/<sessionId>.jsonl`; include it if the file exists, otherwise omit.
|
|
40
|
+
3. If neither source yields an id, abort with: "Could not resolve a real Claude Code session id. Restart the Claude session so the SessionStart hook can populate `.syntaur/context.json`, or run `/rename <slug>` then try again."
|
|
41
|
+
|
|
42
|
+
DO NOT generate a UUID. `syntaur track-session` rejects missing session IDs.
|
|
33
43
|
|
|
34
|
-
Run the
|
|
44
|
+
### Step 3: Run the CLI command
|
|
45
|
+
|
|
46
|
+
Run the track-session CLI via Bash (use `dangerouslyDisableSandbox: true` since it writes to `~/.syntaur/`):
|
|
35
47
|
|
|
36
48
|
```bash
|
|
37
|
-
syntaur track-session
|
|
49
|
+
syntaur track-session \
|
|
50
|
+
--agent claude \
|
|
51
|
+
--session-id "$SESSION_ID" \
|
|
52
|
+
--transcript-path "$TRANSCRIPT_PATH" \
|
|
53
|
+
--path "$(pwd)" \
|
|
54
|
+
[--description "<text>"] \
|
|
55
|
+
[--project <slug>] \
|
|
56
|
+
[--assignment <slug>]
|
|
38
57
|
```
|
|
39
58
|
|
|
40
|
-
|
|
59
|
+
Omit `--transcript-path` entirely (don't pass an empty string) if no transcript path could be resolved.
|
|
41
60
|
|
|
42
|
-
The CLI
|
|
61
|
+
The CLI prints one of:
|
|
43
62
|
- `Registered standalone agent session <sessionId>.`
|
|
44
63
|
- `Registered agent session <sessionId> for <assignment> in <project>.`
|
|
45
64
|
|
|
46
|
-
|
|
65
|
+
Registration is idempotent — re-running the command with the same session id safely upserts project/assignment/description onto the existing row.
|
|
47
66
|
|
|
48
|
-
### Step 4:
|
|
67
|
+
### Step 4: Merge context.json
|
|
49
68
|
|
|
50
|
-
|
|
69
|
+
Ensure `.syntaur/context.json` has the session fields (so SessionEnd and future `/track-session` runs find them). Merge, don't overwrite:
|
|
51
70
|
|
|
52
|
-
|
|
53
|
-
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
71
|
+
```bash
|
|
72
|
+
mkdir -p .syntaur
|
|
73
|
+
if [ -f .syntaur/context.json ]; then
|
|
74
|
+
jq --arg sid "$SESSION_ID" --arg tp "$TRANSCRIPT_PATH" \
|
|
75
|
+
'. + {sessionId: $sid} + (if ($tp | length) > 0 then {transcriptPath: $tp} else {} end)' \
|
|
76
|
+
.syntaur/context.json > .syntaur/context.json.tmp \
|
|
77
|
+
&& mv .syntaur/context.json.tmp .syntaur/context.json
|
|
78
|
+
else
|
|
79
|
+
jq -n --arg sid "$SESSION_ID" --arg tp "$TRANSCRIPT_PATH" \
|
|
80
|
+
'{sessionId: $sid} + (if ($tp | length) > 0 then {transcriptPath: $tp} else {} end)' \
|
|
81
|
+
> .syntaur/context.json
|
|
82
|
+
fi
|
|
83
|
+
```
|
|
59
84
|
|
|
60
85
|
### Step 5: Confirm
|
|
61
86
|
|
|
62
87
|
Tell the user:
|
|
63
|
-
- The session was registered (include the short session
|
|
64
|
-
- It will be auto-stopped when this conversation ends
|
|
65
|
-
- If linked to a project, mention which project/assignment
|
|
88
|
+
- The session was registered (include the short session id).
|
|
89
|
+
- It will be auto-stopped when this conversation ends via the SessionEnd hook.
|
|
90
|
+
- If linked to a project, mention which project/assignment.
|