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.
Files changed (99) hide show
  1. package/dashboard/dist/assets/{_basePickBy-CHKX1r7P.js → _basePickBy-BhaCV7eH.js} +1 -1
  2. package/dashboard/dist/assets/{_baseUniq-CTxTc4MS.js → _baseUniq-CDPcqrs2.js} +1 -1
  3. package/dashboard/dist/assets/{arc-BUo5zftd.js → arc-BP0RxLwl.js} +1 -1
  4. package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-CrJLm-P0.js → architectureDiagram-2XIMDMQ5-BDzvaeJp.js} +1 -1
  5. package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-BK60lBBJ.js → blockDiagram-WCTKOSBZ-ZeL9mROo.js} +1 -1
  6. package/dashboard/dist/assets/{c4Diagram-IC4MRINW-C7oJEvA0.js → c4Diagram-IC4MRINW-7S5bvFLp.js} +1 -1
  7. package/dashboard/dist/assets/channel-CcB_wcgb.js +1 -0
  8. package/dashboard/dist/assets/{chunk-4BX2VUAB-CjUPlzHz.js → chunk-4BX2VUAB-Ca7R4nv5.js} +1 -1
  9. package/dashboard/dist/assets/{chunk-55IACEB6-6HmWguiO.js → chunk-55IACEB6-flEv13FB.js} +1 -1
  10. package/dashboard/dist/assets/{chunk-FMBD7UC4-CLuJnd1b.js → chunk-FMBD7UC4-CfcYWBM6.js} +1 -1
  11. package/dashboard/dist/assets/{chunk-JSJVCQXG-B4d62qWV.js → chunk-JSJVCQXG-Dw4yL0VS.js} +1 -1
  12. package/dashboard/dist/assets/{chunk-KX2RTZJC-AsEKRPq2.js → chunk-KX2RTZJC-B2cDe40G.js} +1 -1
  13. package/dashboard/dist/assets/{chunk-NQ4KR5QH-DQhHHvwY.js → chunk-NQ4KR5QH-LZVm0IWg.js} +1 -1
  14. package/dashboard/dist/assets/{chunk-QZHKN3VN-Ds1TtI3E.js → chunk-QZHKN3VN-Dg0EeHNI.js} +1 -1
  15. package/dashboard/dist/assets/{chunk-WL4C6EOR-C7jE3-cR.js → chunk-WL4C6EOR-v3rXNwXc.js} +1 -1
  16. package/dashboard/dist/assets/classDiagram-VBA2DB6C-BJr38z2g.js +1 -0
  17. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-BJr38z2g.js +1 -0
  18. package/dashboard/dist/assets/clone-Cfs2GUGt.js +1 -0
  19. package/dashboard/dist/assets/{cose-bilkent-S5V4N54A-C9ka5v1m.js → cose-bilkent-S5V4N54A-D-3JzLoS.js} +1 -1
  20. package/dashboard/dist/assets/{dagre-KLK3FWXG-BbgPQBKy.js → dagre-KLK3FWXG-d_mbczhU.js} +1 -1
  21. package/dashboard/dist/assets/{diagram-E7M64L7V-DpdeZFD4.js → diagram-E7M64L7V-BUyAp8pW.js} +1 -1
  22. package/dashboard/dist/assets/{diagram-IFDJBPK2-FlHLQzOV.js → diagram-IFDJBPK2-C8doXcyQ.js} +1 -1
  23. package/dashboard/dist/assets/{diagram-P4PSJMXO-B22NkEF_.js → diagram-P4PSJMXO-BUSmHa55.js} +1 -1
  24. package/dashboard/dist/assets/{erDiagram-INFDFZHY-zSqmtDid.js → erDiagram-INFDFZHY-Bn5_0LPU.js} +1 -1
  25. package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-BP_0XmVV.js → flowDiagram-PKNHOUZH-CnEjerQM.js} +1 -1
  26. package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-8uRyYgZV.js → ganttDiagram-A5KZAMGK-CL94fbyy.js} +1 -1
  27. package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-JFqg8sv4.js → gitGraphDiagram-K3NZZRJ6-4i_PeG8V.js} +1 -1
  28. package/dashboard/dist/assets/{graph-a-PAH599.js → graph-BtoFhoAd.js} +1 -1
  29. package/dashboard/dist/assets/index-DZUGYrvE.css +1 -0
  30. package/dashboard/dist/assets/index-Dv_-SxuL.js +481 -0
  31. package/dashboard/dist/assets/{infoDiagram-LFFYTUFH-C3kq7Nbv.js → infoDiagram-LFFYTUFH-CdUsuNgZ.js} +1 -1
  32. package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-Kqi4EZ-n.js → ishikawaDiagram-PHBUUO56-BjggRlUx.js} +1 -1
  33. package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-CTfv0Wcr.js → journeyDiagram-4ABVD52K-V4AgexlR.js} +1 -1
  34. package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-Dmx0lgvR.js → kanban-definition-K7BYSVSG-ChlylQRf.js} +1 -1
  35. package/dashboard/dist/assets/{layout-KKRbT2Od.js → layout-DLcz9AmA.js} +1 -1
  36. package/dashboard/dist/assets/{linear-5egaBiw7.js → linear-l2xnSHze.js} +1 -1
  37. package/dashboard/dist/assets/{mermaid.core-C9pF_oFQ.js → mermaid.core-DKO1ytRW.js} +4 -4
  38. package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-C7HXYEXt.js → mindmap-definition-YRQLILUH-DTmTPHrT.js} +1 -1
  39. package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-DkdZm-YP.js → pieDiagram-SKSYHLDU-CwK80y8Y.js} +1 -1
  40. package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-DkcRJs5F.js → quadrantDiagram-337W2JSQ-Be1xqW_w.js} +1 -1
  41. package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-BaTDVYTl.js → requirementDiagram-Z7DCOOCP-JcspXCs0.js} +1 -1
  42. package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-DvPLbGV5.js → sankeyDiagram-WA2Y5GQK-nJb1BInq.js} +1 -1
  43. package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-DQoZ2xMK.js → sequenceDiagram-2WXFIKYE-DUrclEgA.js} +1 -1
  44. package/dashboard/dist/assets/{stateDiagram-RAJIS63D-CS4l0OjM.js → stateDiagram-RAJIS63D-CjinnNtF.js} +1 -1
  45. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-yfclw-nM.js +1 -0
  46. package/dashboard/dist/assets/{timeline-definition-YZTLITO2-aC0iCFCW.js → timeline-definition-YZTLITO2-kM-oVLNz.js} +1 -1
  47. package/dashboard/dist/assets/{treemap-KZPCXAKY-Ie-PFjgx.js → treemap-KZPCXAKY-CYziFlrQ.js} +1 -1
  48. package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-CJN3ExTQ.js → vennDiagram-LZ73GAT5-DX0DbxBN.js} +1 -1
  49. package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-DSiDu1CN.js → xychartDiagram-JWTSCODW-BGqM42ZM.js} +1 -1
  50. package/dashboard/dist/index.html +2 -2
  51. package/dist/dashboard/server.d.ts +5 -0
  52. package/dist/dashboard/server.js +2185 -609
  53. package/dist/dashboard/server.js.map +1 -1
  54. package/dist/index.js +2596 -959
  55. package/dist/index.js.map +1 -1
  56. package/examples/playbooks/keep-records-updated.md +14 -8
  57. package/examples/playbooks/read-before-plan.md +8 -5
  58. package/examples/sample-project/_status.md +1 -1
  59. package/examples/sample-project/assignments/design-auth-schema/assignment.md +4 -17
  60. package/examples/sample-project/assignments/design-auth-schema/comments.md +26 -0
  61. package/examples/sample-project/assignments/design-auth-schema/progress.md +20 -0
  62. package/examples/sample-project/assignments/implement-jwt-middleware/assignment.md +4 -17
  63. package/examples/sample-project/assignments/implement-jwt-middleware/comments.md +17 -0
  64. package/examples/sample-project/assignments/implement-jwt-middleware/progress.md +20 -0
  65. package/examples/sample-project/assignments/write-auth-tests/assignment.md +4 -8
  66. package/examples/sample-project/assignments/write-auth-tests/comments.md +10 -0
  67. package/examples/sample-project/assignments/write-auth-tests/progress.md +10 -0
  68. package/package.json +1 -1
  69. package/platforms/claude-code/.claude-plugin/plugin.json +5 -1
  70. package/platforms/claude-code/agents/syntaur-expert.md +46 -15
  71. package/platforms/claude-code/commands/track-session/track-session.md +43 -18
  72. package/platforms/claude-code/hooks/hooks.json +11 -0
  73. package/platforms/claude-code/hooks/session-cleanup.sh +13 -23
  74. package/platforms/claude-code/hooks/session-start.sh +80 -0
  75. package/platforms/claude-code/hooks/statusline.sh +110 -0
  76. package/platforms/claude-code/references/file-ownership.md +15 -3
  77. package/platforms/claude-code/references/protocol-summary.md +19 -5
  78. package/platforms/claude-code/skills/complete-assignment/SKILL.md +14 -0
  79. package/platforms/claude-code/skills/create-assignment/SKILL.md +12 -10
  80. package/platforms/claude-code/skills/grab-assignment/SKILL.md +30 -15
  81. package/platforms/claude-code/skills/plan-assignment/SKILL.md +16 -8
  82. package/platforms/claude-code/skills/syntaur-protocol/SKILL.md +21 -11
  83. package/platforms/codex/.codex-plugin/plugin.json +1 -1
  84. package/platforms/codex/agents/syntaur-operator.md +39 -25
  85. package/platforms/codex/references/file-ownership.md +14 -3
  86. package/platforms/codex/references/protocol-summary.md +19 -5
  87. package/platforms/codex/scripts/resolve-session.sh +49 -0
  88. package/platforms/codex/skills/complete-assignment/SKILL.md +1 -0
  89. package/platforms/codex/skills/create-assignment/SKILL.md +13 -8
  90. package/platforms/codex/skills/grab-assignment/SKILL.md +7 -5
  91. package/platforms/codex/skills/plan-assignment/SKILL.md +8 -4
  92. package/platforms/codex/skills/syntaur-protocol/SKILL.md +26 -13
  93. package/dashboard/dist/assets/channel-DdltvFFH.js +0 -1
  94. package/dashboard/dist/assets/classDiagram-VBA2DB6C-BHqdFE-8.js +0 -1
  95. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-BHqdFE-8.js +0 -1
  96. package/dashboard/dist/assets/clone-CBJOOeOm.js +0 -1
  97. package/dashboard/dist/assets/index-CoVCLSh2.css +0 -1
  98. package/dashboard/dist/assets/index-yyAIuzrP.js +0 -471
  99. 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 progress, sessions, and criteria current in real-time"
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-02T00:00:00Z"
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
- - Update the `## Progress` section in assignment.md with what you did
17
- - Use reverse-chronological order (newest first)
18
- - Include timestamps
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
- - Add a progress entry noting you've begun and what your approach is
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
- - Write a final progress entry summarizing current state
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-02T00:00:00Z"
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. `agent.md` -- understand conventions and constraints
20
- 4. `claude.md` (if exists) -- Claude-specific instructions
21
- 5. `assignment.md` -- understand your specific task, acceptance criteria, and dependencies
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 -- understand what they produced and any interfaces you need to conform to.
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 unanswered** question in [implement-jwt-middleware](./assignments/implement-jwt-middleware/assignment.md)
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)
@@ -0,0 +1,10 @@
1
+ ---
2
+ assignment: write-auth-tests
3
+ entryCount: 0
4
+ generated: "2026-03-15T09:30:00Z"
5
+ updated: "2026-03-15T09:30:00Z"
6
+ ---
7
+
8
+ # Comments
9
+
10
+ No comments yet.
@@ -0,0 +1,10 @@
1
+ ---
2
+ assignment: write-auth-tests
3
+ entryCount: 0
4
+ generated: "2026-03-15T09:30:00Z"
5
+ updated: "2026-03-15T09:30:00Z"
6
+ ---
7
+
8
+ # Progress
9
+
10
+ No progress yet.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "syntaur",
3
- "version": "0.2.0",
3
+ "version": "0.3.3",
4
4
  "description": "Project workflow CLI with dashboard, Claude Code plugin, and Codex plugin",
5
5
  "homepage": "https://github.com/prong-horn/syntaur#readme",
6
6
  "repository": {
@@ -5,5 +5,9 @@
5
5
  "name": "Brennen",
6
6
  "email": ""
7
7
  },
8
- "version": "0.1.7"
8
+ "version": "0.1.8",
9
+ "statusLine": {
10
+ "type": "command",
11
+ "command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/statusline.sh"
12
+ }
9
13
  }
@@ -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 one-off assignment |
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` | Register agent session |
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/unansweredQuestions)
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:** `"1.0"` (string, not number)
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. Contains:
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": "uuid-v4"
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: Add it to the Q&A section of assignment.md. Do NOT set status to `blocked` for questions — `blocked` is for runtime obstacles only.
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: Run the CLI command
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 track-session CLI command via Bash (use `dangerouslyDisableSandbox: true` since it writes to `~/.syntaur/`):
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 --agent claude --path $(pwd) [--description "<text>"] [--project <slug>] [--assignment <slug>]
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
- ### Step 3: Parse the session ID
59
+ Omit `--transcript-path` entirely (don't pass an empty string) if no transcript path could be resolved.
41
60
 
42
- The CLI output will be one of:
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
- Extract the session ID from the output.
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: Write context file
67
+ ### Step 4: Merge context.json
49
68
 
50
- Write the session ID to `.syntaur/context.json` so the SessionEnd hook can mark it stopped when this conversation ends:
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
- - If `.syntaur/context.json` already exists, read it and add `"sessionId": "<id>"` to the existing JSON
53
- - If it doesn't exist, create the `.syntaur/` directory and write:
54
- ```json
55
- {
56
- "sessionId": "<id>"
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 ID)
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.
@@ -12,6 +12,17 @@
12
12
  ]
13
13
  }
14
14
  ],
15
+ "SessionStart": [
16
+ {
17
+ "hooks": [
18
+ {
19
+ "type": "command",
20
+ "command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/session-start.sh",
21
+ "timeout": 5
22
+ }
23
+ ]
24
+ }
25
+ ],
15
26
  "SessionEnd": [
16
27
  {
17
28
  "hooks": [