syntaur 0.1.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.
Files changed (128) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/bin/syntaur.js +2 -0
  3. package/dashboard/dist/assets/_basePickBy-C-VS6QEr.js +1 -0
  4. package/dashboard/dist/assets/_baseUniq-Dfp0h_kE.js +1 -0
  5. package/dashboard/dist/assets/arc-DMAuseMg.js +1 -0
  6. package/dashboard/dist/assets/architectureDiagram-2XIMDMQ5-DERw9YH7.js +36 -0
  7. package/dashboard/dist/assets/blockDiagram-WCTKOSBZ-CVhoUGyp.js +132 -0
  8. package/dashboard/dist/assets/c4Diagram-IC4MRINW-B97ce7q3.js +10 -0
  9. package/dashboard/dist/assets/channel-BFnz84Fk.js +1 -0
  10. package/dashboard/dist/assets/chunk-4BX2VUAB-C-Tm8s7l.js +1 -0
  11. package/dashboard/dist/assets/chunk-55IACEB6-DTLywdgN.js +1 -0
  12. package/dashboard/dist/assets/chunk-FMBD7UC4-CZe3jJBW.js +15 -0
  13. package/dashboard/dist/assets/chunk-JSJVCQXG-DCDIzNBU.js +1 -0
  14. package/dashboard/dist/assets/chunk-KX2RTZJC-Dny_iTMP.js +1 -0
  15. package/dashboard/dist/assets/chunk-NQ4KR5QH-BVkniaFi.js +220 -0
  16. package/dashboard/dist/assets/chunk-QZHKN3VN-Yiy-DBy_.js +1 -0
  17. package/dashboard/dist/assets/chunk-WL4C6EOR-BZ6Aii8B.js +189 -0
  18. package/dashboard/dist/assets/classDiagram-VBA2DB6C-9i4eMNgh.js +1 -0
  19. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-9i4eMNgh.js +1 -0
  20. package/dashboard/dist/assets/clone-BQWw0UR0.js +1 -0
  21. package/dashboard/dist/assets/cose-bilkent-S5V4N54A-p-FSX7Hd.js +1 -0
  22. package/dashboard/dist/assets/cytoscape.esm-BQaXIfA_.js +331 -0
  23. package/dashboard/dist/assets/dagre-KLK3FWXG-JGHXC_Z-.js +4 -0
  24. package/dashboard/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  25. package/dashboard/dist/assets/diagram-E7M64L7V-BMj79nA2.js +24 -0
  26. package/dashboard/dist/assets/diagram-IFDJBPK2-DvE6Hc7-.js +43 -0
  27. package/dashboard/dist/assets/diagram-P4PSJMXO-xVL3uMJs.js +24 -0
  28. package/dashboard/dist/assets/erDiagram-INFDFZHY-HAM6d8j_.js +70 -0
  29. package/dashboard/dist/assets/flowDiagram-PKNHOUZH-DPorMsV0.js +162 -0
  30. package/dashboard/dist/assets/ganttDiagram-A5KZAMGK-BxesGLxK.js +292 -0
  31. package/dashboard/dist/assets/gitGraphDiagram-K3NZZRJ6-tjaHpiMU.js +65 -0
  32. package/dashboard/dist/assets/graph-DAyh4Dby.js +1 -0
  33. package/dashboard/dist/assets/index-BnqH-RIk.css +1 -0
  34. package/dashboard/dist/assets/index-C1augJ5N.js +440 -0
  35. package/dashboard/dist/assets/infoDiagram-LFFYTUFH-MekJE5ZF.js +2 -0
  36. package/dashboard/dist/assets/init-Gi6I4Gst.js +1 -0
  37. package/dashboard/dist/assets/ishikawaDiagram-PHBUUO56-DovIBmaF.js +70 -0
  38. package/dashboard/dist/assets/journeyDiagram-4ABVD52K-CZw0QfY4.js +139 -0
  39. package/dashboard/dist/assets/kanban-definition-K7BYSVSG-Bl-d4Lb6.js +89 -0
  40. package/dashboard/dist/assets/katex-B1X10hvy.js +261 -0
  41. package/dashboard/dist/assets/layout-Ds5A52wn.js +1 -0
  42. package/dashboard/dist/assets/linear-FqOeAEKI.js +1 -0
  43. package/dashboard/dist/assets/mermaid.core-C7JSt2gc.js +255 -0
  44. package/dashboard/dist/assets/mindmap-definition-YRQLILUH-D6x3mID9.js +68 -0
  45. package/dashboard/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  46. package/dashboard/dist/assets/pieDiagram-SKSYHLDU-CnElBd0K.js +30 -0
  47. package/dashboard/dist/assets/quadrantDiagram-337W2JSQ-Q08fuvGB.js +7 -0
  48. package/dashboard/dist/assets/requirementDiagram-Z7DCOOCP-BImzzV5r.js +73 -0
  49. package/dashboard/dist/assets/sankeyDiagram-WA2Y5GQK-BIfD481p.js +10 -0
  50. package/dashboard/dist/assets/sequenceDiagram-2WXFIKYE-BS_1aSDE.js +145 -0
  51. package/dashboard/dist/assets/stateDiagram-RAJIS63D-Br1E8nkw.js +1 -0
  52. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-rZTWN-vQ.js +1 -0
  53. package/dashboard/dist/assets/timeline-definition-YZTLITO2-DQJ_O-WU.js +61 -0
  54. package/dashboard/dist/assets/treemap-KZPCXAKY-BmmUp0Cf.js +162 -0
  55. package/dashboard/dist/assets/vennDiagram-LZ73GAT5-DzQooghy.js +34 -0
  56. package/dashboard/dist/assets/xychartDiagram-JWTSCODW-W9j8X9K6.js +7 -0
  57. package/dashboard/dist/index.html +17 -0
  58. package/dist/dashboard/server.d.ts +15 -0
  59. package/dist/dashboard/server.js +5873 -0
  60. package/dist/dashboard/server.js.map +1 -0
  61. package/dist/index.d.ts +2 -0
  62. package/dist/index.js +8892 -0
  63. package/dist/index.js.map +1 -0
  64. package/examples/playbooks/commit-discipline.md +20 -0
  65. package/examples/playbooks/keep-records-updated.md +30 -0
  66. package/examples/playbooks/plan-versioning.md +36 -0
  67. package/examples/playbooks/read-before-plan.md +27 -0
  68. package/examples/playbooks/test-before-done.md +24 -0
  69. package/examples/playbooks/workspace-before-code.md +30 -0
  70. package/examples/sample-mission/_index-assignments.md +20 -0
  71. package/examples/sample-mission/_index-decisions.md +11 -0
  72. package/examples/sample-mission/_index-plans.md +12 -0
  73. package/examples/sample-mission/_status.md +47 -0
  74. package/examples/sample-mission/agent.md +33 -0
  75. package/examples/sample-mission/assignments/design-auth-schema/assignment.md +61 -0
  76. package/examples/sample-mission/assignments/design-auth-schema/decision-record.md +15 -0
  77. package/examples/sample-mission/assignments/design-auth-schema/handoff.md +31 -0
  78. package/examples/sample-mission/assignments/design-auth-schema/plan.md +31 -0
  79. package/examples/sample-mission/assignments/design-auth-schema/scratchpad.md +40 -0
  80. package/examples/sample-mission/assignments/implement-jwt-middleware/assignment.md +65 -0
  81. package/examples/sample-mission/assignments/implement-jwt-middleware/decision-record.md +15 -0
  82. package/examples/sample-mission/assignments/implement-jwt-middleware/handoff.md +9 -0
  83. package/examples/sample-mission/assignments/implement-jwt-middleware/plan.md +33 -0
  84. package/examples/sample-mission/assignments/implement-jwt-middleware/scratchpad.md +48 -0
  85. package/examples/sample-mission/assignments/write-auth-tests/assignment.md +54 -0
  86. package/examples/sample-mission/assignments/write-auth-tests/decision-record.md +9 -0
  87. package/examples/sample-mission/assignments/write-auth-tests/handoff.md +9 -0
  88. package/examples/sample-mission/assignments/write-auth-tests/plan.md +34 -0
  89. package/examples/sample-mission/assignments/write-auth-tests/scratchpad.md +8 -0
  90. package/examples/sample-mission/claude.md +13 -0
  91. package/examples/sample-mission/manifest.md +22 -0
  92. package/examples/sample-mission/memories/_index.md +11 -0
  93. package/examples/sample-mission/memories/postgres-connection-pooling.md +35 -0
  94. package/examples/sample-mission/mission.md +34 -0
  95. package/examples/sample-mission/resources/_index.md +11 -0
  96. package/examples/sample-mission/resources/auth-requirements.md +44 -0
  97. package/package.json +57 -0
  98. package/plugin/.claude-plugin/plugin.json +9 -0
  99. package/plugin/agents/syntaur-expert.md +393 -0
  100. package/plugin/commands/track-server/track-server.md +56 -0
  101. package/plugin/commands/track-session/track-session.md +65 -0
  102. package/plugin/hooks/enforce-boundaries.sh +135 -0
  103. package/plugin/hooks/hooks.json +27 -0
  104. package/plugin/hooks/session-cleanup.sh +74 -0
  105. package/plugin/references/file-ownership.md +51 -0
  106. package/plugin/references/protocol-summary.md +70 -0
  107. package/plugin/skills/complete-assignment/SKILL.md +137 -0
  108. package/plugin/skills/create-assignment/SKILL.md +64 -0
  109. package/plugin/skills/create-mission/SKILL.md +51 -0
  110. package/plugin/skills/grab-assignment/SKILL.md +180 -0
  111. package/plugin/skills/plan-assignment/SKILL.md +101 -0
  112. package/plugin/skills/syntaur-protocol/SKILL.md +72 -0
  113. package/plugins/syntaur/.codex-plugin/plugin.json +28 -0
  114. package/plugins/syntaur/agents/openai.yaml +7 -0
  115. package/plugins/syntaur/agents/syntaur-operator.md +127 -0
  116. package/plugins/syntaur/commands/track-session.md +27 -0
  117. package/plugins/syntaur/hooks.json +27 -0
  118. package/plugins/syntaur/references/file-ownership.md +51 -0
  119. package/plugins/syntaur/references/protocol-summary.md +66 -0
  120. package/plugins/syntaur/scripts/enforce-boundaries.sh +103 -0
  121. package/plugins/syntaur/scripts/session-cleanup.sh +39 -0
  122. package/plugins/syntaur/skills/complete-assignment/SKILL.md +63 -0
  123. package/plugins/syntaur/skills/create-assignment/SKILL.md +43 -0
  124. package/plugins/syntaur/skills/create-mission/SKILL.md +35 -0
  125. package/plugins/syntaur/skills/grab-assignment/SKILL.md +61 -0
  126. package/plugins/syntaur/skills/plan-assignment/SKILL.md +49 -0
  127. package/plugins/syntaur/skills/syntaur-protocol/SKILL.md +84 -0
  128. package/plugins/syntaur/skills/track-session/SKILL.md +49 -0
@@ -0,0 +1,101 @@
1
+ ---
2
+ name: plan-assignment
3
+ description: Create an implementation plan for the current Syntaur assignment
4
+ argument-hint: "[focus area or notes]"
5
+ allowed-tools:
6
+ - Bash
7
+ - Read
8
+ - Write
9
+ - Edit
10
+ - Glob
11
+ - Grep
12
+ ---
13
+
14
+ # Plan Assignment
15
+
16
+ Create a detailed implementation plan for your current Syntaur assignment.
17
+
18
+ ## Arguments
19
+
20
+ Optional notes from the user: $ARGUMENTS
21
+
22
+ ## Step 1: Load Context
23
+
24
+ Read `.syntaur/context.json` from the current working directory.
25
+
26
+ If the file does not exist, tell the user: "No active assignment found. Run `/grab-assignment <mission-slug>` first to claim an assignment."
27
+
28
+ Extract from the context file:
29
+ - `missionSlug` -- the mission slug
30
+ - `assignmentSlug` -- the assignment slug
31
+ - `assignmentDir` -- absolute path to the assignment folder
32
+ - `missionDir` -- absolute path to the mission folder
33
+ - `workspaceRoot` -- absolute path to the workspace (may be null)
34
+
35
+ ## Step 1.5: Load Playbooks
36
+
37
+ Read all playbook files from `~/.syntaur/playbooks/` — these contain user-defined behavioral rules you must follow:
38
+
39
+ ```bash
40
+ ls ~/.syntaur/playbooks/*.md 2>/dev/null
41
+ ```
42
+
43
+ For each file found, read it and follow its directives. Playbooks may contain rules about planning conventions, required steps, or quality expectations that apply to this plan.
44
+
45
+ ## Step 2: Read Assignment Details
46
+
47
+ Read the following files to understand the assignment:
48
+
49
+ 1. Read `<assignmentDir>/assignment.md` -- extract the objective, acceptance criteria, context section, and any Q&A
50
+ 2. Read `<missionDir>/agent.md` -- extract conventions and boundaries
51
+ 3. Read `<missionDir>/claude.md` if it exists -- extract Claude-specific instructions
52
+ 4. Read `<missionDir>/mission.md` -- extract the mission goal for broader context
53
+
54
+ If the assignment has dependencies (`dependsOn` in frontmatter), read the handoff.md from each dependency's assignment folder for integration context:
55
+ - `<missionDir>/assignments/<dep-slug>/handoff.md`
56
+
57
+ ## Step 3: Explore Workspace (if set)
58
+
59
+ If `workspaceRoot` is not null:
60
+
61
+ 1. Check if the workspace directory exists:
62
+ ```bash
63
+ ls <workspaceRoot>
64
+ ```
65
+ 2. Explore the codebase structure to understand what exists:
66
+ - Use `Glob` to find key files (e.g., `**/*.ts`, `**/package.json`, `**/*.md`)
67
+ - Use `Grep` to search for relevant patterns mentioned in the assignment
68
+ - Read key files like `package.json`, `tsconfig.json`, or entry points
69
+ 3. Note any existing patterns, conventions, or architecture you discover
70
+
71
+ If `workspaceRoot` is null, skip this step and note in the plan that no workspace is configured.
72
+
73
+ ## Step 4: Write the Plan
74
+
75
+ Read the existing `<assignmentDir>/plan.md` to see its current frontmatter structure. Preserve the YAML frontmatter fields (`assignment`, `status`, `created`, `updated`) and update the `updated` timestamp. Change the `status` field from `draft` to `in_progress` if it is still `draft`.
76
+
77
+ Replace the markdown body with a detailed implementation plan. The plan should include:
78
+
79
+ 1. **Overview** -- one paragraph summarizing the approach
80
+ 2. **Tasks** -- numbered list of implementation tasks, each with:
81
+ - Description of what to do
82
+ - Files to create or modify (with paths)
83
+ - Dependencies on other tasks
84
+ - Estimated complexity (low/medium/high)
85
+ 3. **Acceptance Criteria Mapping** -- for each criterion from assignment.md, which task(s) address it
86
+ 4. **Risks and Open Questions** -- anything that might block or complicate implementation
87
+ 5. **Testing Strategy** -- how to verify the implementation works
88
+
89
+ Write the plan using the Edit tool to update `<assignmentDir>/plan.md`. Preserve the existing frontmatter and replace only the body content.
90
+
91
+ ## Step 5: Report to User
92
+
93
+ After writing the plan:
94
+ 1. Summarize the plan (number of tasks, key decisions)
95
+ 2. Note any open questions or risks that need human input
96
+ 3. Suggest next step: begin implementing the first task, or run `/complete-assignment` when all work is done
97
+
98
+ **Remind the agent about recordkeeping during implementation:**
99
+ - Check off acceptance criteria in `assignment.md` as each one is completed, not in a batch at the end
100
+ - Update the `## Progress` section in `assignment.md` after each meaningful milestone
101
+ - The assignment file is a live document — it should reflect current state at all times
@@ -0,0 +1,72 @@
1
+ ---
2
+ name: syntaur-protocol
3
+ description: This skill should be used when the user mentions "syntaur", "assignment", "mission", works with files under ~/.syntaur/, references assignment.md, plan.md, handoff.md, or discusses the Syntaur protocol, lifecycle states, or write boundaries.
4
+ version: 0.1.0
5
+ ---
6
+
7
+ # Syntaur Protocol Knowledge
8
+
9
+ You are working within the Syntaur protocol. Follow these rules at all times.
10
+
11
+ ## Write Boundary Rules (CRITICAL)
12
+
13
+ You MUST respect file ownership boundaries. Violations will be blocked by the PreToolUse hook.
14
+
15
+ ### Files you may WRITE:
16
+ 1. **Your assignment folder** -- only the assignment you are currently working on:
17
+ - `assignment.md`, `plan.md`, `scratchpad.md`, `handoff.md`, `decision-record.md`
18
+ - Path: `~/.syntaur/missions/<mission>/assignments/<your-assignment>/`
19
+ 2. **Shared resources and memories** at the mission level:
20
+ - `~/.syntaur/missions/<mission>/resources/<slug>.md`
21
+ - `~/.syntaur/missions/<mission>/memories/<slug>.md`
22
+ 3. **Your workspace** -- source code files within the workspace defined in your assignment's frontmatter (`workspace.worktreePath` or `workspace.repository`)
23
+ 4. **Context file** -- `.syntaur/context.json` in the current working directory
24
+
25
+ ### Files you must NEVER write:
26
+ 1. `mission.md`, `agent.md`, `claude.md` -- human-authored, read-only
27
+ 2. `manifest.md` -- derived, rebuilt by tooling
28
+ 3. Any file prefixed with `_` (`_index-*.md`, `_status.md`) -- derived
29
+ 4. Other agents' assignment folders
30
+ 5. Any files outside your workspace boundary
31
+
32
+ ## Current Assignment Context
33
+
34
+ If `.syntaur/context.json` exists in the current working directory, read it to determine:
35
+ - `missionSlug` -- which mission you are working on
36
+ - `assignmentSlug` -- which assignment is yours
37
+ - `missionDir` -- absolute path to the mission folder
38
+ - `assignmentDir` -- absolute path to your assignment folder
39
+ - `workspaceRoot` -- absolute path to your code workspace (if set)
40
+
41
+ ## Protocol References
42
+
43
+ For detailed protocol information, read these files:
44
+ - **Protocol summary:** `${CLAUDE_PLUGIN_ROOT}/references/protocol-summary.md`
45
+ - **File ownership rules:** `${CLAUDE_PLUGIN_ROOT}/references/file-ownership.md`
46
+
47
+ ## Lifecycle Commands
48
+
49
+ Use the `syntaur` CLI for state transitions. Available commands:
50
+ - `syntaur assign <slug> --agent <name> --mission <mission>` -- set assignee
51
+ - `syntaur start <slug> --mission <mission>` -- pending -> in_progress
52
+ - `syntaur review <slug> --mission <mission>` -- in_progress -> review
53
+ - `syntaur complete <slug> --mission <mission>` -- in_progress/review -> completed
54
+ - `syntaur block <slug> --mission <mission> --reason <text>` -- block an assignment
55
+ - `syntaur unblock <slug> --mission <mission>` -- unblock
56
+ - `syntaur fail <slug> --mission <mission>` -- mark as failed
57
+
58
+ ## Playbooks
59
+
60
+ Playbooks are user-defined behavioral rules stored in `~/.syntaur/playbooks/`. Each playbook is a markdown file with imperative rules that agents must follow. When you begin work on any assignment, read all playbook files and follow their directives. Playbooks take precedence over default conventions when they conflict.
61
+
62
+ ```bash
63
+ ls ~/.syntaur/playbooks/*.md 2>/dev/null
64
+ ```
65
+
66
+ ## Conventions
67
+
68
+ - Assignment frontmatter is the single source of truth for state
69
+ - Slugs are lowercase, hyphen-separated
70
+ - Always read `agent.md` and `claude.md` at the mission level before starting work
71
+ - Add unanswered questions to the Q&A section of assignment.md (do not set status to blocked for questions)
72
+ - Commit frequently with messages referencing the assignment slug
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "syntaur",
3
+ "version": "0.1.0",
4
+ "description": "Run Syntaur mission and assignment workflows from Codex, including claiming work, planning, completing handoffs, session tracking, and write-boundary enforcement.",
5
+ "author": {
6
+ "name": "Brennen"
7
+ },
8
+ "skills": "./skills/",
9
+ "hooks": "./hooks.json",
10
+ "interface": {
11
+ "displayName": "Syntaur",
12
+ "shortDescription": "Mission and assignment workflows for Codex",
13
+ "longDescription": "Use Syntaur to create missions and assignments, claim work, keep plan and handoff records current, track Codex sessions, and enforce Syntaur write boundaries.",
14
+ "developerName": "Brennen",
15
+ "category": "Coding",
16
+ "capabilities": [
17
+ "Interactive",
18
+ "Read",
19
+ "Write"
20
+ ],
21
+ "defaultPrompt": [
22
+ "Claim a Syntaur assignment and set up this workspace",
23
+ "Plan the current Syntaur assignment",
24
+ "Write a Syntaur handoff and transition the assignment"
25
+ ],
26
+ "brandColor": "#0F766E"
27
+ }
28
+ }
@@ -0,0 +1,7 @@
1
+ interface:
2
+ display_name: "Syntaur"
3
+ short_description: "Mission and assignment workflows for Codex"
4
+ default_prompt: "Use Syntaur to create missions and assignments, claim work, plan an assignment, or complete a handoff in the current workspace."
5
+
6
+ policy:
7
+ allow_implicit_invocation: true
@@ -0,0 +1,127 @@
1
+ ---
2
+ name: syntaur-operator
3
+ description: Specializes in the Syntaur CLI and protocol: mission and assignment scaffolding, claiming work, maintaining assignment records, planning, handoffs, session tracking, adapter setup, lifecycle transitions, and write-boundary enforcement. Use when working with ~/.syntaur/, assignment.md, plan.md, handoff.md, .syntaur/context.json, or the syntaur CLI.
4
+ ---
5
+
6
+ You are the Syntaur Operator for Codex.
7
+
8
+ Your job is to work fluently within the Syntaur protocol without breaking ownership, lifecycle, or workspace boundaries.
9
+
10
+ ## Primary Responsibilities
11
+
12
+ - Create missions and assignments with the `syntaur` CLI
13
+ - Claim assignments and establish local assignment context
14
+ - Keep `assignment.md`, `plan.md`, and `handoff.md` accurate during execution
15
+ - Track Codex sessions for the Syntaur dashboard
16
+ - Set up Codex adapter instructions in the active workspace
17
+ - Enforce Syntaur write boundaries and lifecycle rules
18
+
19
+ ## Start Here
20
+
21
+ When a task involves Syntaur:
22
+
23
+ 1. Determine whether the user needs mission creation, assignment creation, assignment execution, completion/handoff, or session tracking.
24
+ 2. If `.syntaur/context.json` exists in the current working directory, read it first.
25
+ 3. If working on a specific assignment, read these in order:
26
+ - `<missionDir>/manifest.md`
27
+ - `<missionDir>/agent.md`
28
+ - `<missionDir>/mission.md`
29
+ - `<missionDir>/claude.md` if it exists
30
+ - `<assignmentDir>/assignment.md`
31
+ - `<assignmentDir>/plan.md`
32
+ - `<assignmentDir>/handoff.md`
33
+ 4. Resolve the workspace boundary from `.syntaur/context.json` or `assignment.md` frontmatter before editing code.
34
+
35
+ ## File Ownership
36
+
37
+ ### Never write
38
+
39
+ - `mission.md`
40
+ - `agent.md`
41
+ - `claude.md`
42
+ - `manifest.md`
43
+ - any underscore-prefixed derived file such as `_index-assignments.md`, `_status.md`, `resources/_index.md`, or `memories/_index.md`
44
+ - other agents' assignment folders
45
+
46
+ ### You may write
47
+
48
+ - the current assignment folder only:
49
+ - `assignment.md`
50
+ - `plan.md`
51
+ - `scratchpad.md`
52
+ - `handoff.md`
53
+ - `decision-record.md`
54
+ - mission `resources/*.md`
55
+ - mission `memories/*.md`
56
+ - `.syntaur/context.json` in the current working directory
57
+ - source files inside the assignment workspace boundary
58
+
59
+ ## Protocol Rules
60
+
61
+ - Assignment frontmatter is the single source of truth for assignment state.
62
+ - Slugs are lowercase and hyphen-separated.
63
+ - `pending` with unmet `dependsOn` means structural waiting. `blocked` means a real runtime obstacle and requires a `blockedReason`.
64
+ - Update acceptance criteria checkboxes as work lands.
65
+ - Keep the `## Progress` section in `assignment.md` current after meaningful milestones.
66
+ - Append handoffs instead of replacing previous handoff entries.
67
+
68
+ ## CLI Reference
69
+
70
+ Use these commands directly when needed:
71
+
72
+ - `syntaur create-mission "<title>" [--slug <slug>] [--dir <path>]`
73
+ - `syntaur create-assignment "<title>" --mission <slug> [--slug <slug>] [--priority <level>] [--depends-on <slugs>] [--dir <path>]`
74
+ - `syntaur create-assignment "<title>" --one-off [--slug <slug>] [--priority <level>] [--dir <path>]`
75
+ - `syntaur setup [--yes] [--claude] [--codex] [--dashboard]`
76
+ - `syntaur assign <assignment-slug> --agent codex --mission <mission-slug>`
77
+ - `syntaur start <assignment-slug> --mission <mission-slug>`
78
+ - `syntaur review <assignment-slug> --mission <mission-slug>`
79
+ - `syntaur complete <assignment-slug> --mission <mission-slug>`
80
+ - `syntaur block <assignment-slug> --mission <mission-slug> --reason <text>`
81
+ - `syntaur unblock <assignment-slug> --mission <mission-slug>`
82
+ - `syntaur fail <assignment-slug> --mission <mission-slug>`
83
+ - `syntaur uninstall [--all] [--yes]`
84
+ - `syntaur track-session --mission <mission-slug> --assignment <assignment-slug> --agent codex --session-id <id> --path <cwd>`
85
+ - `syntaur setup-adapter codex --mission <mission-slug> --assignment <assignment-slug>`
86
+
87
+ ## Standard Workflows
88
+
89
+ ### Claim an assignment
90
+
91
+ 1. Discover the mission and pending assignments.
92
+ 2. Run `syntaur assign ... --agent codex`.
93
+ 3. Run `syntaur start ...`.
94
+ 4. Create `.syntaur/context.json` in the working directory.
95
+ 5. Register the session with `syntaur track-session`.
96
+ 6. If needed, run `syntaur setup-adapter codex --mission <slug> --assignment <slug>`.
97
+
98
+ ### Plan an assignment
99
+
100
+ 1. Read the assignment, mission instructions, and any dependency handoffs.
101
+ 2. Explore the workspace.
102
+ 3. Replace the body of `plan.md` with a concrete implementation plan.
103
+ 4. Keep `assignment.md` in sync with what is now known.
104
+
105
+ ### Complete an assignment
106
+
107
+ 1. Re-check every acceptance criterion.
108
+ 2. Update any missing checkboxes in `assignment.md`.
109
+ 3. Append a new structured handoff entry to `handoff.md`.
110
+ 4. Mark the dashboard session completed if `sessionId` exists.
111
+ 5. Transition the assignment with `syntaur review` or `syntaur complete`.
112
+ 6. Remove `.syntaur/context.json` when the assignment is no longer active.
113
+
114
+ ## Decision Rules
115
+
116
+ - If the user asks for the "next" assignment, choose from `pending` assignments only.
117
+ - If multiple pending assignments exist, present the options unless there is an obvious single best candidate.
118
+ - If dependencies are unmet, do not try to force an assignment into `in_progress`.
119
+ - If acceptance criteria are incomplete, prefer transition to `review` over `completed`.
120
+ - If workspace metadata is missing and code changes are expected, set the workspace to the current working directory before implementation.
121
+
122
+ ## References
123
+
124
+ Read these when you need schema-level detail:
125
+
126
+ - `../references/protocol-summary.md`
127
+ - `../references/file-ownership.md`
@@ -0,0 +1,27 @@
1
+ ---
2
+ description: Register, refresh, remove, or list tracked tmux sessions for the Syntaur dashboard.
3
+ ---
4
+
5
+ # /track-session
6
+
7
+ Track a tmux session so its dev servers appear in the Syntaur dashboard.
8
+
9
+ ## Usage
10
+
11
+ - `/track-session <session-name>` - register a session and scan it
12
+ - `/track-session --refresh [session-name]` - refresh one or all sessions
13
+ - `/track-session --remove <session-name>` - stop tracking a session
14
+ - `/track-session --list` - list tracked sessions
15
+
16
+ ## Workflow
17
+
18
+ 1. Prefer the `track-session` skill logic for all variants.
19
+ 2. For register:
20
+ - verify the tmux session exists
21
+ - create or update `~/.syntaur/servers/<sanitized-name>.md`
22
+ 3. For refresh:
23
+ - update `last_refreshed`
24
+ 4. For remove:
25
+ - delete the registration file
26
+ 5. For list:
27
+ - show tracked sessions pulled from frontmatter
@@ -0,0 +1,27 @@
1
+ {
2
+ "hooks": {
3
+ "PreToolUse": [
4
+ {
5
+ "matcher": "Write|Edit|MultiEdit",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "./scripts/enforce-boundaries.sh",
10
+ "timeout": 10
11
+ }
12
+ ]
13
+ }
14
+ ],
15
+ "SessionEnd": [
16
+ {
17
+ "hooks": [
18
+ {
19
+ "type": "command",
20
+ "command": "./scripts/session-cleanup.sh",
21
+ "timeout": 5
22
+ }
23
+ ]
24
+ }
25
+ ]
26
+ }
27
+ }
@@ -0,0 +1,51 @@
1
+ # File Ownership Rules
2
+
3
+ ## Human-Authored (Read-Only for Agents)
4
+
5
+ Agents must never modify these files:
6
+
7
+ | File | Location |
8
+ |------|----------|
9
+ | `mission.md` | `<mission>/mission.md` |
10
+ | `agent.md` | `<mission>/agent.md` |
11
+ | `claude.md` | `<mission>/claude.md` |
12
+
13
+ ## Agent-Writable (Your Assignment Folder Only)
14
+
15
+ You may only write to files inside your assigned assignment folder:
16
+
17
+ | File | Purpose |
18
+ |------|---------|
19
+ | `assignment.md` | Assignment record and source of truth for state |
20
+ | `plan.md` | Your implementation plan |
21
+ | `scratchpad.md` | Working notes |
22
+ | `handoff.md` | Append-only handoff log |
23
+ | `decision-record.md` | Append-only decision log |
24
+
25
+ Path pattern: `~/.syntaur/missions/<mission>/assignments/<your-assignment>/`
26
+
27
+ ## Shared-Writable
28
+
29
+ | Location | Purpose |
30
+ |----------|---------|
31
+ | `<mission>/resources/<slug>.md` | Reference material |
32
+ | `<mission>/memories/<slug>.md` | Learnings and reusable patterns |
33
+
34
+ ## Derived (Never Edit)
35
+
36
+ All files prefixed with `_` are derived and rebuilt by tooling:
37
+
38
+ - `manifest.md`
39
+ - `_index-assignments.md`
40
+ - `_index-plans.md`
41
+ - `_index-decisions.md`
42
+ - `_status.md`
43
+ - `resources/_index.md`
44
+ - `memories/_index.md`
45
+
46
+ ## Workspace Files
47
+
48
+ When working on code, you may write to files within the workspace defined in assignment frontmatter:
49
+
50
+ - `workspace.worktreePath` or `workspace.repository` defines the project root
51
+ - `.syntaur/context.json` in your current working directory is also writable
@@ -0,0 +1,66 @@
1
+ # Syntaur Protocol Summary
2
+
3
+ ## Directory Structure
4
+
5
+ ```
6
+ ~/.syntaur/
7
+ config.md
8
+ missions/
9
+ <mission-slug>/
10
+ manifest.md # Derived: root navigation (read-only)
11
+ mission.md # Human-authored: mission overview (read-only)
12
+ _index-assignments.md # Derived (read-only)
13
+ _index-plans.md # Derived (read-only)
14
+ _index-decisions.md # Derived (read-only)
15
+ _status.md # Derived (read-only)
16
+ claude.md # Human-authored: Claude-specific instructions (read-only)
17
+ agent.md # Human-authored: universal agent instructions (read-only)
18
+ assignments/
19
+ <assignment-slug>/
20
+ assignment.md # Agent-writable: source of truth for state
21
+ plan.md # Agent-writable: implementation plan
22
+ scratchpad.md # Agent-writable: working notes
23
+ handoff.md # Agent-writable: append-only handoff log
24
+ decision-record.md # Agent-writable: append-only decision log
25
+ resources/
26
+ _index.md # Derived (read-only)
27
+ <resource-slug>.md # Shared-writable
28
+ memories/
29
+ _index.md # Derived (read-only)
30
+ <memory-slug>.md # Shared-writable
31
+ ```
32
+
33
+ ## Assignment Lifecycle
34
+
35
+ | Status | Meaning |
36
+ |--------|---------|
37
+ | `pending` | Not yet started |
38
+ | `in_progress` | Actively being worked on |
39
+ | `blocked` | Manually blocked and requires `blockedReason` |
40
+ | `review` | Work complete and awaiting review |
41
+ | `completed` | Done |
42
+ | `failed` | Could not be completed |
43
+
44
+ ## Valid State Transitions
45
+
46
+ | From | Command | To |
47
+ |------|---------|----|
48
+ | pending | start | in_progress |
49
+ | pending | block | blocked |
50
+ | in_progress | block | blocked |
51
+ | in_progress | review | review |
52
+ | in_progress | complete | completed |
53
+ | in_progress | fail | failed |
54
+ | blocked | unblock | in_progress |
55
+ | review | start | in_progress |
56
+ | review | complete | completed |
57
+ | review | fail | failed |
58
+
59
+ ## Key Rules
60
+
61
+ 1. Assignment frontmatter is the single source of truth for assignment state.
62
+ 2. One folder per mission and one subfolder per assignment.
63
+ 3. Derived files are never edited manually.
64
+ 4. Slugs are lowercase and hyphen-separated.
65
+ 5. Dependencies are declared via `dependsOn` in assignment frontmatter.
66
+ 6. An assignment cannot transition from `pending` to `in_progress` while any dependency is not `completed`.
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env bash
2
+ # Syntaur write boundary enforcement hook for Codex plugins.
3
+ # Reads JSON from stdin and returns a block decision only for writes outside the
4
+ # active assignment boundary. Any parse or runtime error falls back to allow.
5
+
6
+ allow_and_exit() {
7
+ echo '{}'
8
+ exit 0
9
+ }
10
+
11
+ if ! command -v jq >/dev/null 2>&1; then
12
+ echo '{"systemMessage":"Syntaur boundary hook: jq not found, skipping enforcement"}'
13
+ exit 0
14
+ fi
15
+
16
+ INPUT=$(cat)
17
+ if [ -z "$INPUT" ]; then
18
+ allow_and_exit
19
+ fi
20
+
21
+ TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)
22
+ if [ -z "$TOOL_NAME" ]; then
23
+ allow_and_exit
24
+ fi
25
+
26
+ case "$TOOL_NAME" in
27
+ Edit|Write|MultiEdit)
28
+ ;;
29
+ *)
30
+ allow_and_exit
31
+ ;;
32
+ esac
33
+
34
+ FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty' 2>/dev/null)
35
+ if [ -z "$FILE_PATH" ]; then
36
+ allow_and_exit
37
+ fi
38
+
39
+ if [[ "$FILE_PATH" != /* ]]; then
40
+ FILE_PATH="$(pwd)/$FILE_PATH"
41
+ fi
42
+
43
+ FILE_PATH=$(cd "$(dirname "$FILE_PATH")" 2>/dev/null && echo "$(pwd)/$(basename "$FILE_PATH")") || FILE_PATH=""
44
+ if [ -z "$FILE_PATH" ]; then
45
+ allow_and_exit
46
+ fi
47
+
48
+ CONTEXT_FILE=".syntaur/context.json"
49
+ if [ ! -f "$CONTEXT_FILE" ]; then
50
+ allow_and_exit
51
+ fi
52
+
53
+ ASSIGNMENT_DIR=$(jq -r '.assignmentDir // empty' "$CONTEXT_FILE" 2>/dev/null)
54
+ MISSION_DIR=$(jq -r '.missionDir // empty' "$CONTEXT_FILE" 2>/dev/null)
55
+ WORKSPACE_ROOT=$(jq -r '.workspaceRoot // empty' "$CONTEXT_FILE" 2>/dev/null)
56
+
57
+ if [ -z "$ASSIGNMENT_DIR" ] || [ -z "$MISSION_DIR" ]; then
58
+ allow_and_exit
59
+ fi
60
+
61
+ ASSIGNMENT_DIR="${ASSIGNMENT_DIR/#\~/$HOME}"
62
+ MISSION_DIR="${MISSION_DIR/#\~/$HOME}"
63
+ if [ -n "$WORKSPACE_ROOT" ] && [ "$WORKSPACE_ROOT" != "null" ]; then
64
+ WORKSPACE_ROOT="${WORKSPACE_ROOT/#\~/$HOME}"
65
+ else
66
+ WORKSPACE_ROOT=""
67
+ fi
68
+
69
+ if [[ "$FILE_PATH" == "$ASSIGNMENT_DIR"/* ]]; then
70
+ allow_and_exit
71
+ fi
72
+
73
+ if [[ "$FILE_PATH" == "$MISSION_DIR/resources/"* ]]; then
74
+ BASENAME=$(basename "$FILE_PATH")
75
+ if [[ "$BASENAME" != _* ]]; then
76
+ allow_and_exit
77
+ fi
78
+ fi
79
+
80
+ if [[ "$FILE_PATH" == "$MISSION_DIR/memories/"* ]]; then
81
+ BASENAME=$(basename "$FILE_PATH")
82
+ if [[ "$BASENAME" != _* ]]; then
83
+ allow_and_exit
84
+ fi
85
+ fi
86
+
87
+ CONTEXT_ABS="$(cd "$(dirname "$CONTEXT_FILE")" 2>/dev/null && echo "$(pwd)/$(basename "$CONTEXT_FILE")")"
88
+ if [ "$FILE_PATH" = "$CONTEXT_ABS" ]; then
89
+ allow_and_exit
90
+ fi
91
+
92
+ if [ -n "$WORKSPACE_ROOT" ] && [[ "$FILE_PATH" == "$WORKSPACE_ROOT"/* ]]; then
93
+ allow_and_exit
94
+ fi
95
+
96
+ REASON="Syntaur write boundary violation: Cannot write to '$FILE_PATH'. Allowed paths: assignment dir ($ASSIGNMENT_DIR), mission resources/memories, workspace ($WORKSPACE_ROOT)."
97
+ REASON_ESCAPED=$(echo "$REASON" | jq -Rs '.' 2>/dev/null)
98
+ if [ -z "$REASON_ESCAPED" ]; then
99
+ REASON_ESCAPED="\"Syntaur write boundary violation\""
100
+ fi
101
+
102
+ echo "{\"decision\":\"block\",\"reason\":${REASON_ESCAPED}}"
103
+ exit 0
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env bash
2
+ # Syntaur SessionEnd hook for Codex plugins.
3
+ # Marks active agent sessions as stopped when a Codex session exits.
4
+
5
+ set -o pipefail 2>/dev/null || true
6
+
7
+ if ! command -v jq >/dev/null 2>&1; then
8
+ exit 0
9
+ fi
10
+
11
+ INPUT=$(cat)
12
+ if [ -z "$INPUT" ]; then
13
+ exit 0
14
+ fi
15
+
16
+ CWD=$(echo "$INPUT" | jq -r '.cwd // empty' 2>/dev/null)
17
+ if [ -z "$CWD" ]; then
18
+ exit 0
19
+ fi
20
+
21
+ CONTEXT_FILE="$CWD/.syntaur/context.json"
22
+ if [ ! -f "$CONTEXT_FILE" ]; then
23
+ exit 0
24
+ fi
25
+
26
+ SESSION_ID=$(jq -r '.sessionId // empty' "$CONTEXT_FILE" 2>/dev/null)
27
+ MISSION_SLUG=$(jq -r '.missionSlug // empty' "$CONTEXT_FILE" 2>/dev/null)
28
+
29
+ if [ -z "$SESSION_ID" ] || [ -z "$MISSION_SLUG" ]; then
30
+ exit 0
31
+ fi
32
+
33
+ PORT=$(cat "$HOME/.syntaur/dashboard-port" 2>/dev/null || echo "4800")
34
+ curl -sf -X PATCH "http://localhost:${PORT}/api/agent-sessions/${SESSION_ID}/status" \
35
+ -H "Content-Type: application/json" \
36
+ -d "{\"status\": \"stopped\", \"missionSlug\": \"${MISSION_SLUG}\"}" \
37
+ -o /dev/null 2>/dev/null || true
38
+
39
+ exit 0