syntaur 0.7.1 → 0.8.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 (48) hide show
  1. package/.claude-plugin/plugin.json +23 -0
  2. package/README.md +64 -24
  3. package/dist/index.js +632 -254
  4. package/dist/index.js.map +1 -1
  5. package/package.json +6 -8
  6. package/platforms/claude-code/.claude-plugin/plugin.json +15 -2
  7. package/{vendor/syntaur-skills → platforms/claude-code}/skills/complete-assignment/SKILL.md +0 -2
  8. package/{vendor/syntaur-skills → platforms/claude-code}/skills/grab-assignment/SKILL.md +2 -7
  9. package/{vendor/syntaur-skills → platforms/claude-code}/skills/plan-assignment/SKILL.md +1 -3
  10. package/{vendor/syntaur-skills → platforms/claude-code}/skills/syntaur-protocol/SKILL.md +4 -23
  11. package/{vendor/syntaur-skills → platforms/claude-code}/skills/syntaur-protocol/references/file-ownership.md +1 -2
  12. package/{vendor/syntaur-skills → platforms/claude-code}/skills/syntaur-protocol/references/protocol-summary.md +1 -6
  13. package/platforms/claude-code/skills/track-server/SKILL.md +49 -0
  14. package/platforms/codex/.codex-plugin/plugin.json +2 -2
  15. package/platforms/codex/skills/clear-assignment/SKILL.md +111 -0
  16. package/platforms/codex/skills/complete-assignment/SKILL.md +146 -0
  17. package/platforms/codex/skills/create-assignment/SKILL.md +73 -0
  18. package/platforms/codex/skills/create-project/SKILL.md +56 -0
  19. package/platforms/codex/skills/grab-assignment/SKILL.md +158 -0
  20. package/platforms/codex/skills/manage-statuses/SKILL.md +72 -0
  21. package/platforms/codex/skills/plan-assignment/SKILL.md +137 -0
  22. package/platforms/codex/skills/save-session-summary/SKILL.md +113 -0
  23. package/platforms/codex/skills/syntaur-protocol/SKILL.md +119 -0
  24. package/platforms/codex/skills/syntaur-protocol/references/file-ownership.md +67 -0
  25. package/platforms/codex/skills/syntaur-protocol/references/protocol-summary.md +82 -0
  26. package/platforms/codex/skills/track-server/SKILL.md +49 -0
  27. package/platforms/codex/skills/track-session/SKILL.md +63 -26
  28. package/skills/clear-assignment/SKILL.md +111 -0
  29. package/skills/complete-assignment/SKILL.md +146 -0
  30. package/skills/create-assignment/SKILL.md +73 -0
  31. package/skills/create-project/SKILL.md +56 -0
  32. package/skills/grab-assignment/SKILL.md +158 -0
  33. package/skills/manage-statuses/SKILL.md +72 -0
  34. package/skills/plan-assignment/SKILL.md +137 -0
  35. package/skills/save-session-summary/SKILL.md +113 -0
  36. package/skills/syntaur-protocol/SKILL.md +119 -0
  37. package/skills/syntaur-protocol/references/file-ownership.md +67 -0
  38. package/skills/syntaur-protocol/references/protocol-summary.md +82 -0
  39. package/skills/track-server/SKILL.md +49 -0
  40. package/skills/track-session/SKILL.md +86 -0
  41. package/scripts/postinstall-submodules.mjs +0 -40
  42. package/vendor/syntaur-skills/LICENSE +0 -21
  43. package/vendor/syntaur-skills/README.md +0 -57
  44. /package/{vendor/syntaur-skills → platforms/claude-code}/skills/clear-assignment/SKILL.md +0 -0
  45. /package/{vendor/syntaur-skills → platforms/claude-code}/skills/create-assignment/SKILL.md +0 -0
  46. /package/{vendor/syntaur-skills → platforms/claude-code}/skills/create-project/SKILL.md +0 -0
  47. /package/{vendor/syntaur-skills → platforms/claude-code}/skills/manage-statuses/SKILL.md +0 -0
  48. /package/{vendor/syntaur-skills → platforms/claude-code}/skills/save-session-summary/SKILL.md +0 -0
@@ -0,0 +1,67 @@
1
+ # File Ownership Rules (protocol v2.0)
2
+
3
+ ## Human-Authored (READ-ONLY for agents)
4
+
5
+ Agents must NEVER modify these files:
6
+
7
+ | File | Location |
8
+ |------|----------|
9
+ | `project.md` | `<project>/project.md` |
10
+ | `CLAUDE.md` / `AGENTS.md` | Repo root (live outside `~/.syntaur/`) |
11
+ | `<slug>.md` | `~/.syntaur/playbooks/<slug>.md` |
12
+
13
+ Per-project `agent.md` / `claude.md` were removed in protocol v2.0. Agent-level conventions live at the repo root in `CLAUDE.md` / `AGENTS.md`, and user-defined behavioral rules live in `~/.syntaur/playbooks/`.
14
+
15
+ ## Agent-Writable (YOUR assignment folder ONLY)
16
+
17
+ You may only write to files inside your currently-claimed assignment folder:
18
+
19
+ | File | Purpose |
20
+ |------|---------|
21
+ | `assignment.md` | Assignment record; source of truth for state. Includes `## Todos` checklist. |
22
+ | `plan*.md` | Versioned implementation plans (`plan.md`, `plan-v2.md`, ...). When superseded, the old plan's todo is marked superseded but the file itself is never deleted. |
23
+ | `progress.md` | Append-only, timestamped progress log (newest first). |
24
+ | `scratchpad.md` | Working notes. |
25
+ | `handoff.md` | Append-only handoff log. |
26
+ | `decision-record.md` | Append-only decision log (Status / Context / Decision / Consequences). |
27
+
28
+ Path patterns:
29
+ - Project-nested: `~/.syntaur/projects/<project>/assignments/<your-assignment-slug>/`
30
+ - Standalone: `~/.syntaur/assignments/<your-assignment-uuid>/` (folder name is the UUID; `slug` is display-only)
31
+
32
+ ## CLI-Mediated (any agent via the `syntaur` CLI)
33
+
34
+ These files are never edited directly — write to them only through the CLI so derived indexes and dashboards stay consistent.
35
+
36
+ | Target | Command |
37
+ |--------|---------|
38
+ | `comments.md` (any assignment) | `syntaur comment <slug-or-uuid> "body" --type question\|note\|feedback [--reply-to <id>]` |
39
+ | Another assignment's `## Todos` | `syntaur request <target> "text" [--from <source>]` |
40
+
41
+ ## Shared-Writable (any agent or human)
42
+
43
+ | Location | Purpose |
44
+ |----------|---------|
45
+ | `<project>/resources/<slug>.md` | Reference material |
46
+ | `<project>/memories/<slug>.md` | Learnings and patterns |
47
+
48
+ ## Derived (NEVER edit)
49
+
50
+ All files prefixed with `_` are derived and rebuilt by tooling:
51
+
52
+ - `manifest.md`
53
+ - `_index-assignments.md`
54
+ - `_index-plans.md`
55
+ - `_index-decisions.md`
56
+ - `_status.md`
57
+ - `resources/_index.md`
58
+ - `memories/_index.md`
59
+ - `~/.syntaur/playbooks/manifest.md`
60
+
61
+ ## Workspace Files
62
+
63
+ When working on code (not protocol files), you may write to files within the workspace defined in your assignment frontmatter:
64
+
65
+ - `workspace.worktreePath` or `workspace.repository` defines your code root.
66
+ - You may create and edit source files within that workspace.
67
+ - The `.syntaur/context.json` context file in your working directory is also writable (merge, don't overwrite — the platform SessionStart hook may have populated `sessionId` and `transcriptPath`).
@@ -0,0 +1,82 @@
1
+ # Syntaur Protocol Summary
2
+
3
+ Protocol version: **2.0**
4
+
5
+ ## Directory Structure
6
+
7
+ ```
8
+ ~/.syntaur/
9
+ config.md
10
+ projects/
11
+ <project-slug>/
12
+ manifest.md # Derived: root navigation (read-only)
13
+ project.md # Human-authored: project overview (read-only)
14
+ _index-assignments.md # Derived (read-only)
15
+ _index-plans.md # Derived (read-only)
16
+ _index-decisions.md # Derived (read-only)
17
+ _status.md # Derived: status rollup (read-only)
18
+ assignments/
19
+ <assignment-slug>/
20
+ assignment.md # Agent-writable: source of truth for state (## Todos checklist)
21
+ plan*.md # Agent-writable: versioned plans (plan.md, plan-v2.md, ...)
22
+ progress.md # Agent-writable, append-only: timestamped progress log
23
+ comments.md # CLI-mediated: threaded questions/notes/feedback (via `syntaur comment`)
24
+ scratchpad.md # Agent-writable: working notes
25
+ handoff.md # Agent-writable, append-only: handoff log
26
+ decision-record.md # Agent-writable, append-only: decision log
27
+ resources/
28
+ _index.md # Derived (read-only)
29
+ <resource-slug>.md # Shared-writable
30
+ memories/
31
+ _index.md # Derived (read-only)
32
+ <memory-slug>.md # Shared-writable
33
+ assignments/
34
+ <assignment-uuid>/ # Standalone assignments: folder = UUID, `project: null`, slug display-only
35
+ assignment.md # Same schema as project-nested
36
+ plan*.md, progress.md, comments.md, scratchpad.md, handoff.md, decision-record.md
37
+ playbooks/
38
+ manifest.md # Derived: playbook listing (read-only)
39
+ <slug>.md # User-authored: behavioral rules for agents
40
+ syntaur.db # SQLite: agent session registry keyed on real session_id
41
+ ```
42
+
43
+ ## Assignment Lifecycle
44
+
45
+ | Status | Meaning |
46
+ |--------|---------|
47
+ | `pending` | Not yet started |
48
+ | `in_progress` | Actively being worked on |
49
+ | `blocked` | Manually blocked (requires `blockedReason`) |
50
+ | `review` | Work complete, awaiting review |
51
+ | `completed` | Done |
52
+ | `failed` | Could not be completed |
53
+
54
+ ## Valid State Transitions
55
+
56
+ | From | Command | To |
57
+ |------|---------|-----|
58
+ | pending | start | in_progress |
59
+ | pending | block | blocked |
60
+ | in_progress | block | blocked |
61
+ | in_progress | review | review |
62
+ | in_progress | complete | completed |
63
+ | in_progress | fail | failed |
64
+ | blocked | unblock | in_progress |
65
+ | review | start | in_progress |
66
+ | review | complete | completed |
67
+ | review | fail | failed |
68
+
69
+ ## Key Rules
70
+
71
+ 1. **Assignment frontmatter is the single source of truth** for all assignment state.
72
+ 2. **Project-nested assignments** live at `projects/<slug>/assignments/<aslug>/` (folder name = slug). **Standalone assignments** live at `assignments/<uuid>/` (folder name = UUID, `project: null`, slug display-only).
73
+ 3. **Derived files** (underscore-prefixed, plus `manifest.md`) are never edited manually.
74
+ 4. **Slugs** are lowercase, hyphen-separated.
75
+ 5. **Dependencies** are declared via `dependsOn` in assignment frontmatter. Only valid within the same project — standalone assignments cannot declare `dependsOn`.
76
+ 6. An assignment cannot transition from `pending` to `in_progress` while any dependency is not `completed`.
77
+ 7. **Playbooks** in `~/.syntaur/playbooks/` define behavioral rules agents must follow. Read them before starting work.
78
+ 8. **Todos** in `## Todos` of `assignment.md` is an informal markdown checklist. Items may be simple tasks or markdown links to plan files. When a plan is superseded, mark the old todo `- [x] ~~Execute [plan](./plan.md)~~ (superseded by plan-v2)` — never delete. `## Todos` is also the landing spot for cross-assignment `syntaur request` entries.
79
+ 9. **Progress** is appended to `progress.md` as timestamped entries (newest first). Do NOT add a `## Progress` section to `assignment.md` — protocol v2.0 moved progress to its own file.
80
+ 10. **Comments** are appended to `comments.md` via `syntaur comment <slug> "body" [--type question|note|feedback] [--reply-to <id>]`. Never edit `comments.md` directly. Questions carry a `resolved` flag toggled in the dashboard.
81
+ 11. **Cross-assignment work** is requested via `syntaur request <target> "text"` — appends to the target's `## Todos` annotated `(from: <source>)`.
82
+ 12. **Agent sessions** in `syntaur.db` must use real agent-runtime session IDs. Synthesized UUIDs are rejected. Plugins for Claude Code / Codex populate `.syntaur/context.json` with the real id via a SessionStart hook; other agents should source it from their runtime and pass `--session-id` explicitly.
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: track-server
3
+ description: Use when the user wants to register, refresh, remove, or list tracked tmux dev-server sessions for the Syntaur dashboard. Triggers on "/track-server", "track this server", "register this dev server", or similar — distinct from /track-session which registers Claude Code agent sessions.
4
+ ---
5
+
6
+ # Track Server
7
+
8
+ Track tmux sessions so their development servers show up in the Syntaur dashboard. Distinct from `/track-session`, which registers Claude Code agent sessions.
9
+
10
+ ## Arguments
11
+
12
+ User arguments: `$ARGUMENTS`
13
+
14
+ Supported forms:
15
+
16
+ - `<session-name>`
17
+ - `--refresh [session-name]`
18
+ - `--remove <session-name>`
19
+ - `--list`
20
+
21
+ ## Workflow
22
+
23
+ ### Register
24
+
25
+ 1. Verify the tmux session exists with `tmux has-session -t <name>`.
26
+ 2. If it does not exist, list available sessions with `tmux list-sessions -F '#{session_name}'`.
27
+ 3. Create `~/.syntaur/servers/<sanitized-name>.md` with frontmatter:
28
+
29
+ ```yaml
30
+ ---
31
+ session: <original-name>
32
+ registered: <ISO timestamp>
33
+ last_refreshed: <ISO timestamp>
34
+ ---
35
+ ```
36
+
37
+ 4. Tell the user the session is now tracked.
38
+
39
+ ### Refresh
40
+
41
+ 1. Update `last_refreshed` for the named session, or for every file in `~/.syntaur/servers/` when no name was provided.
42
+
43
+ ### Remove
44
+
45
+ 1. Delete `~/.syntaur/servers/<sanitized-name>.md`.
46
+
47
+ ### List
48
+
49
+ 1. List all tracked session markdown files and show the `session` field from each.
@@ -0,0 +1,86 @@
1
+ ---
2
+ name: track-session
3
+ description: Use when the user asks to track, register, or log this Claude Code session in the Syntaur dashboard — standalone or linked to a project/assignment. Triggers on "/track-session", "track this session", "register this session in syntaur", or similar.
4
+ ---
5
+
6
+ # Track Session
7
+
8
+ Register the current Claude Code session as an agent session in the Syntaur dashboard. Works standalone or linked to a project/assignment.
9
+
10
+ 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.
11
+
12
+ ## Usage
13
+
14
+ User arguments: `$ARGUMENTS`
15
+
16
+ - (no args) — register a standalone session
17
+ - `--description "<text>"` — with a description
18
+ - `--project <slug> --assignment <slug>` — linked to a project
19
+ - `--description "<text>" --project <slug> --assignment <slug>` — both
20
+
21
+ ## Workflow
22
+
23
+ ### Step 1: Parse arguments
24
+
25
+ Extract optional flags from the argument string:
26
+ - `--description "<text>"` or `--description <text>` — session description
27
+ - `--project <slug>` — project to link to
28
+ - `--assignment <slug>` — assignment to link to
29
+
30
+ ### Step 2: Source the real session id + transcript path
31
+
32
+ In priority order:
33
+
34
+ 1. Read `.syntaur/context.json` if present. If it contains `sessionId`, use it. Also pick up `transcriptPath` if present.
35
+ 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.
36
+ 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."
37
+
38
+ DO NOT generate a UUID. `syntaur track-session` rejects missing session IDs.
39
+
40
+ ### Step 3: Run the CLI command
41
+
42
+ Run the track-session CLI via Bash (use `dangerouslyDisableSandbox: true` since it writes to `~/.syntaur/`):
43
+
44
+ ```bash
45
+ syntaur track-session \
46
+ --agent claude \
47
+ --session-id "$SESSION_ID" \
48
+ --transcript-path "$TRANSCRIPT_PATH" \
49
+ --path "$(pwd)" \
50
+ [--description "<text>"] \
51
+ [--project <slug>] \
52
+ [--assignment <slug>]
53
+ ```
54
+
55
+ Omit `--transcript-path` entirely (don't pass an empty string) if no transcript path could be resolved.
56
+
57
+ The CLI prints one of:
58
+ - `Registered standalone agent session <sessionId>.`
59
+ - `Registered agent session <sessionId> for <assignment> in <project>.`
60
+
61
+ Registration is idempotent — re-running the command with the same session id safely upserts project/assignment/description onto the existing row.
62
+
63
+ ### Step 4: Merge context.json
64
+
65
+ Ensure `.syntaur/context.json` has the session fields (so SessionEnd and future `track-session` runs find them). Merge, don't overwrite:
66
+
67
+ ```bash
68
+ mkdir -p .syntaur
69
+ if [ -f .syntaur/context.json ]; then
70
+ jq --arg sid "$SESSION_ID" --arg tp "$TRANSCRIPT_PATH" \
71
+ '. + {sessionId: $sid} + (if ($tp | length) > 0 then {transcriptPath: $tp} else {} end)' \
72
+ .syntaur/context.json > .syntaur/context.json.tmp \
73
+ && mv .syntaur/context.json.tmp .syntaur/context.json
74
+ else
75
+ jq -n --arg sid "$SESSION_ID" --arg tp "$TRANSCRIPT_PATH" \
76
+ '{sessionId: $sid} + (if ($tp | length) > 0 then {transcriptPath: $tp} else {} end)' \
77
+ > .syntaur/context.json
78
+ fi
79
+ ```
80
+
81
+ ### Step 5: Confirm
82
+
83
+ Tell the user:
84
+ - The session was registered (include the short session id).
85
+ - It will be auto-stopped when this conversation ends via the SessionEnd hook.
86
+ - If linked to a project, mention which project/assignment.
@@ -1,40 +0,0 @@
1
- #!/usr/bin/env node
2
- // Lazy-init git submodules for contributor clones.
3
- // Silent no-op for end-user installs (where .git/.gitmodules are absent
4
- // because npm publish bundles the vendored files directly).
5
-
6
- import { existsSync } from 'node:fs';
7
- import { resolve, dirname } from 'node:path';
8
- import { fileURLToPath } from 'node:url';
9
- import { spawnSync } from 'node:child_process';
10
-
11
- const here = dirname(fileURLToPath(import.meta.url));
12
- const repoRoot = resolve(here, '..');
13
-
14
- const gitDir = resolve(repoRoot, '.git');
15
- const gitmodules = resolve(repoRoot, '.gitmodules');
16
- const vendoredSkills = resolve(repoRoot, 'vendor', 'syntaur-skills', 'skills');
17
-
18
- // End-user install (from npm): no .git, no .gitmodules. Nothing to do.
19
- if (!existsSync(gitDir) || !existsSync(gitmodules)) {
20
- process.exit(0);
21
- }
22
-
23
- // Contributor already initialized submodules.
24
- if (existsSync(vendoredSkills)) {
25
- process.exit(0);
26
- }
27
-
28
- const result = spawnSync(
29
- 'git',
30
- ['submodule', 'update', '--init', '--recursive'],
31
- { cwd: repoRoot, stdio: 'inherit' },
32
- );
33
-
34
- if (result.status !== 0) {
35
- console.warn(
36
- '[postinstall-submodules] git submodule update failed — ' +
37
- 'run it manually before building.',
38
- );
39
- // Do not fail postinstall; let the build step surface the missing files.
40
- }
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Prong Horn
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1,57 +0,0 @@
1
- # syntaur-skills
2
-
3
- Agent-agnostic skills for the [Syntaur](https://github.com/prong-horn/syntaur) coordination protocol. Works with any AI coding agent — Claude Code, Cursor, Codex, OpenCode, and more.
4
-
5
- ## Prerequisites
6
-
7
- Install the Syntaur CLI:
8
-
9
- ```bash
10
- npm install -g syntaur
11
- syntaur setup
12
- ```
13
-
14
- ## Install
15
-
16
- If you use Claude Code or Codex, install the `syntaur` package — these skills ship automatically with its plugin install flow:
17
-
18
- ```bash
19
- npm install -g syntaur
20
- syntaur install-plugin # Claude Code → ~/.claude/skills/
21
- syntaur install-codex-plugin # Codex → ~/.codex/skills/
22
- ```
23
-
24
- For any other AI coding agent (Cursor, OpenCode, custom runtimes), install the skills directly:
25
-
26
- ```bash
27
- npx skills add prong-horn/syntaur-skills
28
- ```
29
-
30
- Or install a specific skill:
31
-
32
- ```bash
33
- npx skills add prong-horn/syntaur-skills --skill syntaur-protocol
34
- ```
35
-
36
- > **Note:** If you install `syntaur` AND also run `npx skills add prong-horn/syntaur-skills` on the same machine, you'll get the same skills installed once — they use the same names. The `syntaur` CLI detects existing copies and skips already-current ones.
37
-
38
- ## Skills
39
-
40
- | Skill | Description |
41
- |-------|-------------|
42
- | `syntaur-protocol` | Core protocol knowledge — write boundaries, lifecycle states, conventions. Auto-activates when working with Syntaur files. |
43
- | `grab-assignment` | Discover and claim a pending assignment from a project. Sets up working context. |
44
- | `plan-assignment` | Create a detailed implementation plan for the current assignment. |
45
- | `complete-assignment` | Write a handoff and transition an assignment to review or completed. |
46
- | `clear-assignment` | Drop the active assignment from session context without transitioning lifecycle state. Inverse of `grab-assignment`. |
47
- | `create-project` | Create a new project with full scaffolding (manifest + indexes + resources + memories). |
48
- | `create-assignment` | Create a new assignment within a project (or as a standalone one-off at `~/.syntaur/assignments/<uuid>/`). |
49
- | `manage-statuses` | List / add / rename / remove / reorder custom assignment statuses (and transitions); writes to `~/.syntaur/config.md`. |
50
-
51
- ## How it works
52
-
53
- Syntaur is a coordination protocol for AI agents built on markdown files. Projects contain assignments, assignments have lifecycle states, and agents follow write boundary rules about which files they can modify. Everything lives under `~/.syntaur/` and is managed via the `syntaur` CLI.
54
-
55
- These skills teach your agent the protocol so it can participate in Syntaur-coordinated work — regardless of which coding agent you use.
56
-
57
- For platform-specific integrations (hooks, commands, sandbox enforcement), see the [Syntaur plugin system](https://github.com/prong-horn/syntaur).