You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
-[x] Per-backend CLI tools (`cli_codex`, `cli_claude`, `cli_gemini`) with Linear session activity streaming
41
45
-[ ]**Worktree → PR merge** — `createPullRequest()` exists but is not wired into the pipeline. After audit pass, commits sit on a `codex/{identifier}` branch. You create the PR manually.
42
46
-[ ]**Sub-agent worktree sharing** — Sub-agents spawned via `spawn_agent`/`ask_agent` do not inherit the parent worktree. They run in their own session without code access.
43
47
-[ ]**Parallel worktree conflict resolution** — DAG dispatch runs up to 3 issues concurrently in separate worktrees, but there's no merge conflict detection across them.
@@ -109,12 +113,12 @@ The end result: you work in Linear. You create issues, assign them, comment in p
109
113
110
114
-**Named agents** — Define agents with different roles and expertise. Route work by `@mention` or natural language ("hey kaylee look at this").
111
115
-**Intent classification** — An LLM classifier (~300 tokens, ~2s) runs on every user request across all webhook paths — not just comments. Classifies intent and gates work requests on untriaged issues. Regex fallback if the classifier fails.
112
-
-**Scope enforcement** — Three-layer defense prevents agents from building code on issues that haven't been planned. Intent gate blocks `request_work` pre-dispatch; prompt-level constraints limit `code_run` to planning-only; a `before_tool_call` hook prepends hard constraints to worker prompts.
116
+
-**Scope enforcement** — Three-layer defense prevents agents from building code on issues that haven't been planned. Intent gate blocks `request_work` pre-dispatch; prompt-level constraints limit CLI tools to planning-only; a `before_tool_call` hook prepends hard constraints to worker prompts.
113
117
-**One-time detour** — `@mention` a different agent in a session and it handles that single interaction. The session stays with the original agent.
114
118
115
119
### Multi-Backend & Multi-Repo
116
120
117
-
-**Three coding backends** — Codex (OpenAI), Claude (Anthropic), Gemini (Google). Configurable globally or per-agent. The agent writes the prompt; the plugin handles backend selection.
121
+
-**Three coding backends** — Codex (OpenAI), Claude (Anthropic), Gemini (Google). Configurable globally or per-agent. Each backend registers as a dedicated tool (`cli_codex`, `cli_claude`, `cli_gemini`) so agents and Linear session UI show exactly which backend is running. Per-agent overrides let you assign different backends to different team members.
118
122
-**Multi-repo dispatch** — Tag an issue with `<!-- repos: api, frontend -->` and the worker gets isolated worktrees for each repo. One issue, multiple codebases, one agent session.
119
123
120
124
### Operations
@@ -723,18 +727,18 @@ To move forward:
723
727
I can help you scope and plan — just ask questions or discuss the approach.
724
728
```
725
729
726
-
This prevents the most common failure mode: an agent receiving a casual comment like "build X" on an unscoped issue and immediately spinning up `code_run` to build something that was never planned.
730
+
This prevents the most common failure mode: an agent receiving a casual comment like "build X" on an unscoped issue and immediately spinning up a CLI tool to build something that was never planned.
-`code_run` in **planning mode only** — workers can explore code and write plan files but cannot create, modify, or delete source code
737
+
-`cli_codex`/`cli_claude`/`cli_gemini` in **planning mode only** — workers can explore code and write plan files but cannot create, modify, or delete source code
734
738
735
739
**What's blocked on untriaged issues:**
736
740
-`request_work` intent — the gate returns a rejection message before any agent runs
737
-
- Full `code_run` implementation — even if the orchestrator LLM ignores prompt rules, a `before_tool_call` hook prepends hard planning-only constraints to the worker's prompt
741
+
- Full CLI tool implementation — even if the orchestrator LLM ignores prompt rules, a `before_tool_call` hook prepends hard planning-only constraints to the worker's prompt
738
742
739
743
### Agent Routing
740
744
@@ -885,7 +889,7 @@ Add settings under the plugin entry in `openclaw.json`:
885
889
|`notifications`| object | — | Notification targets (see [Notifications](#notifications)) |
886
890
|`inactivitySec`| number |`120`| Kill agent if silent this long |
887
891
|`maxTotalSec`| number |`7200`| Max total agent session time |
888
-
|`toolTimeoutSec`| number |`600`| Max single `code_run` time |
892
+
|`toolTimeoutSec`| number |`600`| Max single CLI tool time |
889
893
|`enableGuidance`| boolean |`true`| Inject Linear workspace/team guidance into agent prompts |
890
894
|`teamGuidanceOverrides`| object | — | Per-team guidance toggle. Key = team ID, value = boolean. Unset teams inherit `enableGuidance`. |
891
895
|`claudeApiKey`| string | — | Anthropic API key for Claude CLI (passed as `ANTHROPIC_API_KEY` env var). Required if using Claude backend. |
@@ -952,7 +956,7 @@ Create `coding-tools.json` in the plugin root to configure which CLI backend age
952
956
}
953
957
```
954
958
955
-
The agent calls `code_run` without knowing which backend is active. Resolution order: explicit `backend` parameter > per-agent override > global default > `"codex"`.
959
+
Each backend registers as a dedicated tool — `cli_codex`, `cli_claude`, or `cli_gemini` — so agents and Linear's session UI show exactly which backend is running. The agent's prompt references the correct tool name automatically. Resolution order for which tool is exposed: per-agent override (`agentCodingTools`) > global default (`codingTool`) > `"codex"`.
956
960
957
961
#### Claude API Key
958
962
@@ -1126,7 +1130,7 @@ rework:
1126
1130
| `{{reviewModel}}` | Name of cross-model reviewer (planner review) |
Sends a task to whichever coding CLI is configured (Codex, Claude Code, or Gemini). The agent writes the prompt; the plugin handles backend selection, worktree setup, and output capture.
1306
+
Three per-backend tools that send tasks to their respective coding CLIs. Each agent sees only the tool matching its configured backend (e.g., an agent configured for `codex` gets `cli_codex`). The tool name is visible in Linear's agent session UI, so you always know which backend is running. The agent writes the prompt; the plugin handles worktree setup, session activity streaming, and output capture.
1303
1307
1304
1308
### `linear_issues` — Native Linear API
1305
1309
@@ -1320,7 +1324,7 @@ Agents call `linear_issues` with typed JSON parameters. The tool wraps the Linea
1320
1324
1321
1325
Delegate work to other crew agents. `spawn_agent` is fire-and-forget (parallel), `ask_agent` waits for a reply (synchronous). Disabled with `enableOrchestration: false`.
1322
1326
1323
-
Sub-agents run in their own context — they do **not** share the parent's worktree or get `code_run` access. They're useful for reasoning, research, and coordination (e.g., "ask Inara how to phrase this error message") but cannot directly modify code. To give a sub-agent code context, include the relevant snippets in the task message.
1327
+
Sub-agents run in their own context — they do **not** share the parent's worktree or get CLI tool access. They're useful for reasoning, research, and coordination (e.g., "ask Inara how to phrase this error message") but cannot directly modify code. To give a sub-agent code context, include the relevant snippets in the task message.
1324
1328
1325
1329
### `dispatch_history` — Recent dispatch context
1326
1330
@@ -1330,9 +1334,9 @@ Returns recent dispatch activity. Agents use this for situational awareness when
1330
1334
1331
1335
Tool access varies by context. Orchestrators get the full toolset; workers and auditors are restricted:
| Orchestrator (untriaged issue) | Read only | Planning only | Yes | Read + write |
1337
1341
| Worker | None | None | None | Read + write |
1338
1342
| Auditor | Prompt-constrained (has tool, instructed to verify only) | None | None | Read only (by prompt) |
@@ -1342,7 +1346,7 @@ Tool access varies by context. Orchestrators get the full toolset; workers and a
1342
1346
1343
1347
**Auditors** have access to `linear_issues` (the tool is registered) but are instructed via prompt to verify only — they return a JSON verdict, not code or issue mutations. Write access is not enforced at the tool level.
1344
1348
1345
-
**Sub-agents** spawned via `spawn_agent`/`ask_agent` run in their own session with no worktree access and no `code_run`. They're information workers — useful for reasoning and coordination, not code execution.
1349
+
**Sub-agents** spawned via `spawn_agent`/`ask_agent` run in their own session with no worktree access and no CLI tools. They're information workers — useful for reasoning and coordination, not code execution.
1346
1350
1347
1351
---
1348
1352
@@ -1457,12 +1461,12 @@ The plugin registers four lifecycle hooks via `api.on()` in `index.ts`:
1457
1461
- Reads dispatch state and finds up to 3 active dispatches
1458
1462
- Prepends a `<dispatch-history>` block so the agent has situational awareness of concurrent work
1459
1463
1460
-
**`before_tool_call`** — Planning-only enforcement for `code_run`. When the active issue is not in "started" state:
1464
+
**`before_tool_call`** — Planning-only enforcement for CLI tools (`cli_codex`, `cli_claude`, `cli_gemini`). When the active issue is not in "started" state:
1461
1465
- Fetches the issue's current workflow state from the Linear API
1462
1466
- If the issue is in Triage, Todo, Backlog, or any non-started state, prepends hard constraints to the worker's prompt:
1463
1467
- Workers may read/explore files and write plan files (PLAN.md, design docs)
1464
1468
- Workers must NOT create/modify/delete source code, run deployments, or make system changes
1465
-
- This is the deepest layer of scope enforcement — even if the orchestrator LLM ignores prompt-level scope rules and calls `code_run` anyway, the worker receives constraints that prevent implementation
1469
+
- This is the deepest layer of scope enforcement — even if the orchestrator LLM ignores prompt-level scope rules and calls a CLI tool anyway, the worker receives constraints that prevent implementation
1466
1470
1467
1471
**`message_sending`** — Narration guard. Catches short (~250 char) "Let me explore..." responses where the agent narrates intent without actually calling tools:
1468
1472
- Appends a warning: "Agent acknowledged but may not have completed the task"
@@ -1762,7 +1766,8 @@ openclaw openclaw-linear prompts show # View the active prompts
| Agent goes silent | Watchdog auto-kills after `inactivitySec` and retries. Check logs for `Watchdog KILL`. |
1828
1833
| Dispatch stuck after watchdog | Both retries failed. Check `.claw/log.jsonl`. Re-assign issue to restart. |
1829
-
|`code_run` uses wrong backend | Check `coding-tools.json` — explicit backend > per-agent > global default. Run `code-run doctor` to see routing. |
1830
-
|`code_run` fails at runtime | Run `openclaw openclaw-linear code-run doctor` — checks binary, API key, and live callability for each backend. |
1834
+
|`cli_*` uses wrong backend | Check `coding-tools.json` — per-agent override > global default. Run `code-run doctor` to see routing. |
1835
+
|`cli_*` fails at runtime | Run `openclaw openclaw-linear code-run doctor` — checks binary, API key, and live callability for each backend. |
1831
1836
| Webhook events not arriving | Run `openclaw openclaw-linear webhooks setup` to auto-provision. Both webhooks must point to `/linear/webhook`. Check tunnel is running. |
1832
1837
| Tunnel down / webhooks silently failing |`systemctl status cloudflared` (or `systemctl --user status cloudflared`). Restart with `systemctl restart cloudflared`. Test: `curl -s -X POST https://your-domain.com/linear/webhook -H 'Content-Type: application/json' -d '{"type":"test"}'` — should return `"ok"`. |
1833
1838
| OAuth token expired | Auto-refreshes. If stuck, re-run `openclaw openclaw-linear auth` and restart. |
"description": "Map Linear team keys to repos, agents, and team-specific context",
41
+
"additionalProperties": {
42
+
"type": "object",
43
+
"properties": {
44
+
"repos": {
45
+
"type": "array",
46
+
"items": { "type": "string" },
47
+
"description": "Repo names (keys in 'repos' config) for this team"
48
+
},
49
+
"defaultAgent": {
50
+
"type": "string",
51
+
"description": "OpenClaw agent ID to handle issues from this team"
52
+
},
53
+
"context": {
54
+
"type": "string",
55
+
"description": "Extra context injected into worker/audit prompts for this team"
56
+
}
57
+
}
58
+
}
59
+
},
21
60
"dispatchStatePath": { "type": "string", "description": "Path to dispatch state JSON file (default: ~/.openclaw/linear-dispatch-state.json)" },
22
61
"planningStatePath": { "type": "string", "description": "Path to planning state JSON file (default: ~/.openclaw/linear-planning-state.json)" },
23
62
"notifications": {
@@ -61,7 +100,10 @@
61
100
"toolTimeoutSec": { "type": "number", "description": "Max runtime for a single code_run CLI invocation in seconds (default: 600)", "default": 600 },
62
101
"claudeApiKey": { "type": "string", "description": "Anthropic API key for Claude CLI backend (passed as ANTHROPIC_API_KEY env var)", "sensitive": true },
63
102
"enableGuidance": { "type": "boolean", "description": "Inject Linear workspace/team guidance into agent prompts (default: true)", "default": true },
64
-
"teamGuidanceOverrides": { "type": "object", "description": "Per-team guidance toggle. Key = Linear team ID, value = boolean. Unset teams inherit enableGuidance.", "additionalProperties": { "type": "boolean" } }
103
+
"teamGuidanceOverrides": { "type": "object", "description": "Per-team guidance toggle. Key = Linear team ID, value = boolean. Unset teams inherit enableGuidance.", "additionalProperties": { "type": "boolean" } },
0 commit comments