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.
- package/.agents/plugins/marketplace.json +20 -0
- package/bin/syntaur.js +2 -0
- package/dashboard/dist/assets/_basePickBy-C-VS6QEr.js +1 -0
- package/dashboard/dist/assets/_baseUniq-Dfp0h_kE.js +1 -0
- package/dashboard/dist/assets/arc-DMAuseMg.js +1 -0
- package/dashboard/dist/assets/architectureDiagram-2XIMDMQ5-DERw9YH7.js +36 -0
- package/dashboard/dist/assets/blockDiagram-WCTKOSBZ-CVhoUGyp.js +132 -0
- package/dashboard/dist/assets/c4Diagram-IC4MRINW-B97ce7q3.js +10 -0
- package/dashboard/dist/assets/channel-BFnz84Fk.js +1 -0
- package/dashboard/dist/assets/chunk-4BX2VUAB-C-Tm8s7l.js +1 -0
- package/dashboard/dist/assets/chunk-55IACEB6-DTLywdgN.js +1 -0
- package/dashboard/dist/assets/chunk-FMBD7UC4-CZe3jJBW.js +15 -0
- package/dashboard/dist/assets/chunk-JSJVCQXG-DCDIzNBU.js +1 -0
- package/dashboard/dist/assets/chunk-KX2RTZJC-Dny_iTMP.js +1 -0
- package/dashboard/dist/assets/chunk-NQ4KR5QH-BVkniaFi.js +220 -0
- package/dashboard/dist/assets/chunk-QZHKN3VN-Yiy-DBy_.js +1 -0
- package/dashboard/dist/assets/chunk-WL4C6EOR-BZ6Aii8B.js +189 -0
- package/dashboard/dist/assets/classDiagram-VBA2DB6C-9i4eMNgh.js +1 -0
- package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-9i4eMNgh.js +1 -0
- package/dashboard/dist/assets/clone-BQWw0UR0.js +1 -0
- package/dashboard/dist/assets/cose-bilkent-S5V4N54A-p-FSX7Hd.js +1 -0
- package/dashboard/dist/assets/cytoscape.esm-BQaXIfA_.js +331 -0
- package/dashboard/dist/assets/dagre-KLK3FWXG-JGHXC_Z-.js +4 -0
- package/dashboard/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/dashboard/dist/assets/diagram-E7M64L7V-BMj79nA2.js +24 -0
- package/dashboard/dist/assets/diagram-IFDJBPK2-DvE6Hc7-.js +43 -0
- package/dashboard/dist/assets/diagram-P4PSJMXO-xVL3uMJs.js +24 -0
- package/dashboard/dist/assets/erDiagram-INFDFZHY-HAM6d8j_.js +70 -0
- package/dashboard/dist/assets/flowDiagram-PKNHOUZH-DPorMsV0.js +162 -0
- package/dashboard/dist/assets/ganttDiagram-A5KZAMGK-BxesGLxK.js +292 -0
- package/dashboard/dist/assets/gitGraphDiagram-K3NZZRJ6-tjaHpiMU.js +65 -0
- package/dashboard/dist/assets/graph-DAyh4Dby.js +1 -0
- package/dashboard/dist/assets/index-BnqH-RIk.css +1 -0
- package/dashboard/dist/assets/index-C1augJ5N.js +440 -0
- package/dashboard/dist/assets/infoDiagram-LFFYTUFH-MekJE5ZF.js +2 -0
- package/dashboard/dist/assets/init-Gi6I4Gst.js +1 -0
- package/dashboard/dist/assets/ishikawaDiagram-PHBUUO56-DovIBmaF.js +70 -0
- package/dashboard/dist/assets/journeyDiagram-4ABVD52K-CZw0QfY4.js +139 -0
- package/dashboard/dist/assets/kanban-definition-K7BYSVSG-Bl-d4Lb6.js +89 -0
- package/dashboard/dist/assets/katex-B1X10hvy.js +261 -0
- package/dashboard/dist/assets/layout-Ds5A52wn.js +1 -0
- package/dashboard/dist/assets/linear-FqOeAEKI.js +1 -0
- package/dashboard/dist/assets/mermaid.core-C7JSt2gc.js +255 -0
- package/dashboard/dist/assets/mindmap-definition-YRQLILUH-D6x3mID9.js +68 -0
- package/dashboard/dist/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dashboard/dist/assets/pieDiagram-SKSYHLDU-CnElBd0K.js +30 -0
- package/dashboard/dist/assets/quadrantDiagram-337W2JSQ-Q08fuvGB.js +7 -0
- package/dashboard/dist/assets/requirementDiagram-Z7DCOOCP-BImzzV5r.js +73 -0
- package/dashboard/dist/assets/sankeyDiagram-WA2Y5GQK-BIfD481p.js +10 -0
- package/dashboard/dist/assets/sequenceDiagram-2WXFIKYE-BS_1aSDE.js +145 -0
- package/dashboard/dist/assets/stateDiagram-RAJIS63D-Br1E8nkw.js +1 -0
- package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-rZTWN-vQ.js +1 -0
- package/dashboard/dist/assets/timeline-definition-YZTLITO2-DQJ_O-WU.js +61 -0
- package/dashboard/dist/assets/treemap-KZPCXAKY-BmmUp0Cf.js +162 -0
- package/dashboard/dist/assets/vennDiagram-LZ73GAT5-DzQooghy.js +34 -0
- package/dashboard/dist/assets/xychartDiagram-JWTSCODW-W9j8X9K6.js +7 -0
- package/dashboard/dist/index.html +17 -0
- package/dist/dashboard/server.d.ts +15 -0
- package/dist/dashboard/server.js +5873 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +8892 -0
- package/dist/index.js.map +1 -0
- package/examples/playbooks/commit-discipline.md +20 -0
- package/examples/playbooks/keep-records-updated.md +30 -0
- package/examples/playbooks/plan-versioning.md +36 -0
- package/examples/playbooks/read-before-plan.md +27 -0
- package/examples/playbooks/test-before-done.md +24 -0
- package/examples/playbooks/workspace-before-code.md +30 -0
- package/examples/sample-mission/_index-assignments.md +20 -0
- package/examples/sample-mission/_index-decisions.md +11 -0
- package/examples/sample-mission/_index-plans.md +12 -0
- package/examples/sample-mission/_status.md +47 -0
- package/examples/sample-mission/agent.md +33 -0
- package/examples/sample-mission/assignments/design-auth-schema/assignment.md +61 -0
- package/examples/sample-mission/assignments/design-auth-schema/decision-record.md +15 -0
- package/examples/sample-mission/assignments/design-auth-schema/handoff.md +31 -0
- package/examples/sample-mission/assignments/design-auth-schema/plan.md +31 -0
- package/examples/sample-mission/assignments/design-auth-schema/scratchpad.md +40 -0
- package/examples/sample-mission/assignments/implement-jwt-middleware/assignment.md +65 -0
- package/examples/sample-mission/assignments/implement-jwt-middleware/decision-record.md +15 -0
- package/examples/sample-mission/assignments/implement-jwt-middleware/handoff.md +9 -0
- package/examples/sample-mission/assignments/implement-jwt-middleware/plan.md +33 -0
- package/examples/sample-mission/assignments/implement-jwt-middleware/scratchpad.md +48 -0
- package/examples/sample-mission/assignments/write-auth-tests/assignment.md +54 -0
- package/examples/sample-mission/assignments/write-auth-tests/decision-record.md +9 -0
- package/examples/sample-mission/assignments/write-auth-tests/handoff.md +9 -0
- package/examples/sample-mission/assignments/write-auth-tests/plan.md +34 -0
- package/examples/sample-mission/assignments/write-auth-tests/scratchpad.md +8 -0
- package/examples/sample-mission/claude.md +13 -0
- package/examples/sample-mission/manifest.md +22 -0
- package/examples/sample-mission/memories/_index.md +11 -0
- package/examples/sample-mission/memories/postgres-connection-pooling.md +35 -0
- package/examples/sample-mission/mission.md +34 -0
- package/examples/sample-mission/resources/_index.md +11 -0
- package/examples/sample-mission/resources/auth-requirements.md +44 -0
- package/package.json +57 -0
- package/plugin/.claude-plugin/plugin.json +9 -0
- package/plugin/agents/syntaur-expert.md +393 -0
- package/plugin/commands/track-server/track-server.md +56 -0
- package/plugin/commands/track-session/track-session.md +65 -0
- package/plugin/hooks/enforce-boundaries.sh +135 -0
- package/plugin/hooks/hooks.json +27 -0
- package/plugin/hooks/session-cleanup.sh +74 -0
- package/plugin/references/file-ownership.md +51 -0
- package/plugin/references/protocol-summary.md +70 -0
- package/plugin/skills/complete-assignment/SKILL.md +137 -0
- package/plugin/skills/create-assignment/SKILL.md +64 -0
- package/plugin/skills/create-mission/SKILL.md +51 -0
- package/plugin/skills/grab-assignment/SKILL.md +180 -0
- package/plugin/skills/plan-assignment/SKILL.md +101 -0
- package/plugin/skills/syntaur-protocol/SKILL.md +72 -0
- package/plugins/syntaur/.codex-plugin/plugin.json +28 -0
- package/plugins/syntaur/agents/openai.yaml +7 -0
- package/plugins/syntaur/agents/syntaur-operator.md +127 -0
- package/plugins/syntaur/commands/track-session.md +27 -0
- package/plugins/syntaur/hooks.json +27 -0
- package/plugins/syntaur/references/file-ownership.md +51 -0
- package/plugins/syntaur/references/protocol-summary.md +66 -0
- package/plugins/syntaur/scripts/enforce-boundaries.sh +103 -0
- package/plugins/syntaur/scripts/session-cleanup.sh +39 -0
- package/plugins/syntaur/skills/complete-assignment/SKILL.md +63 -0
- package/plugins/syntaur/skills/create-assignment/SKILL.md +43 -0
- package/plugins/syntaur/skills/create-mission/SKILL.md +35 -0
- package/plugins/syntaur/skills/grab-assignment/SKILL.md +61 -0
- package/plugins/syntaur/skills/plan-assignment/SKILL.md +49 -0
- package/plugins/syntaur/skills/syntaur-protocol/SKILL.md +84 -0
- 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
|