@enderfga/claw-orchestrator 3.0.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/LICENSE +21 -0
- package/README.md +218 -0
- package/assets/banner.jpg +0 -0
- package/configs/council-reviewer-prompt.md +82 -0
- package/configs/council-system-prompt.md +141 -0
- package/dist/bin/cli.d.ts +13 -0
- package/dist/bin/cli.js +460 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/src/base-oneshot-session.d.ts +87 -0
- package/dist/src/base-oneshot-session.js +228 -0
- package/dist/src/base-oneshot-session.js.map +1 -0
- package/dist/src/circuit-breaker.d.ts +21 -0
- package/dist/src/circuit-breaker.js +49 -0
- package/dist/src/circuit-breaker.js.map +1 -0
- package/dist/src/consensus.d.ts +20 -0
- package/dist/src/consensus.js +52 -0
- package/dist/src/consensus.js.map +1 -0
- package/dist/src/constants.d.ts +129 -0
- package/dist/src/constants.js +138 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/council.d.ts +67 -0
- package/dist/src/council.js +914 -0
- package/dist/src/council.js.map +1 -0
- package/dist/src/embedded-server.d.ts +25 -0
- package/dist/src/embedded-server.js +360 -0
- package/dist/src/embedded-server.js.map +1 -0
- package/dist/src/inbox-manager.d.ts +38 -0
- package/dist/src/inbox-manager.js +111 -0
- package/dist/src/inbox-manager.js.map +1 -0
- package/dist/src/index.d.ts +63 -0
- package/dist/src/index.js +973 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/logger.d.ts +16 -0
- package/dist/src/logger.js +44 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/models.d.ts +69 -0
- package/dist/src/models.js +299 -0
- package/dist/src/models.js.map +1 -0
- package/dist/src/openai-compat.d.ts +224 -0
- package/dist/src/openai-compat.js +756 -0
- package/dist/src/openai-compat.js.map +1 -0
- package/dist/src/persistent-codex-app-session.d.ts +108 -0
- package/dist/src/persistent-codex-app-session.js +465 -0
- package/dist/src/persistent-codex-app-session.js.map +1 -0
- package/dist/src/persistent-codex-session.d.ts +37 -0
- package/dist/src/persistent-codex-session.js +208 -0
- package/dist/src/persistent-codex-session.js.map +1 -0
- package/dist/src/persistent-cursor-session.d.ts +21 -0
- package/dist/src/persistent-cursor-session.js +241 -0
- package/dist/src/persistent-cursor-session.js.map +1 -0
- package/dist/src/persistent-custom-session.d.ts +78 -0
- package/dist/src/persistent-custom-session.js +938 -0
- package/dist/src/persistent-custom-session.js.map +1 -0
- package/dist/src/persistent-gemini-session.d.ts +21 -0
- package/dist/src/persistent-gemini-session.js +216 -0
- package/dist/src/persistent-gemini-session.js.map +1 -0
- package/dist/src/persistent-session.d.ts +80 -0
- package/dist/src/persistent-session.js +745 -0
- package/dist/src/persistent-session.js.map +1 -0
- package/dist/src/proxy/anthropic-adapter.d.ts +136 -0
- package/dist/src/proxy/anthropic-adapter.js +392 -0
- package/dist/src/proxy/anthropic-adapter.js.map +1 -0
- package/dist/src/proxy/handler.d.ts +39 -0
- package/dist/src/proxy/handler.js +365 -0
- package/dist/src/proxy/handler.js.map +1 -0
- package/dist/src/proxy/schema-cleaner.d.ts +11 -0
- package/dist/src/proxy/schema-cleaner.js +34 -0
- package/dist/src/proxy/schema-cleaner.js.map +1 -0
- package/dist/src/proxy/thought-cache.d.ts +19 -0
- package/dist/src/proxy/thought-cache.js +53 -0
- package/dist/src/proxy/thought-cache.js.map +1 -0
- package/dist/src/session-manager.d.ts +317 -0
- package/dist/src/session-manager.js +1528 -0
- package/dist/src/session-manager.js.map +1 -0
- package/dist/src/types.d.ts +513 -0
- package/dist/src/types.js +8 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/validation.d.ts +31 -0
- package/dist/src/validation.js +104 -0
- package/dist/src/validation.js.map +1 -0
- package/openclaw.plugin.json +122 -0
- package/package.json +84 -0
- package/skills/SKILL.md +184 -0
- package/skills/references/claude-cli-tracking.md +25 -0
- package/skills/references/cli.md +187 -0
- package/skills/references/council.md +210 -0
- package/skills/references/getting-started.md +133 -0
- package/skills/references/inbox.md +81 -0
- package/skills/references/multi-engine.md +382 -0
- package/skills/references/openai-compat.md +203 -0
- package/skills/references/sessions.md +191 -0
- package/skills/references/tools.md +418 -0
- package/skills/references/ultra.md +126 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared validation utilities for input sanitization.
|
|
3
|
+
*
|
|
4
|
+
* Used by both the plugin tool handlers (index.ts) and the embedded HTTP
|
|
5
|
+
* server (embedded-server.ts) to ensure consistent protection regardless
|
|
6
|
+
* of entry point.
|
|
7
|
+
*/
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import * as fs from 'node:fs';
|
|
10
|
+
import * as os from 'node:os';
|
|
11
|
+
// ─── Blocked Path Prefixes ─────────────────────────────────────────────────
|
|
12
|
+
/** System-critical directories that must never be used as a working directory */
|
|
13
|
+
const BLOCKED_PREFIXES = ['/etc', '/proc', '/sys', '/var/run', '/var/log', '/boot', '/sbin'];
|
|
14
|
+
/** Sensitive directories under the user's home that must never be used as cwd */
|
|
15
|
+
const BLOCKED_HOME_SUBDIRS = ['.ssh', '.gnupg', '.aws', '.config/gcloud'];
|
|
16
|
+
// ─── sanitizeCwd ────────────────────────────────────────────────────────────
|
|
17
|
+
/**
|
|
18
|
+
* Resolve and validate a working directory path.
|
|
19
|
+
*
|
|
20
|
+
* Prevents path traversal and blocks access to system-critical and
|
|
21
|
+
* sensitive directories. Resolves symlinks where possible to defeat
|
|
22
|
+
* symlink-based bypasses.
|
|
23
|
+
*/
|
|
24
|
+
export function sanitizeCwd(cwd) {
|
|
25
|
+
if (!cwd)
|
|
26
|
+
return undefined;
|
|
27
|
+
// Logical path: resolves .. and . but does NOT follow symlinks.
|
|
28
|
+
// This catches the obvious cases (/etc, /var/run, /sbin) on all platforms.
|
|
29
|
+
const logical = path.resolve(cwd);
|
|
30
|
+
// Real path: follows symlinks. This catches symlink-based bypasses
|
|
31
|
+
// (e.g. /tmp/safe → /etc). Falls back to logical for non-existent paths.
|
|
32
|
+
let real;
|
|
33
|
+
try {
|
|
34
|
+
real = fs.realpathSync(cwd);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
real = logical;
|
|
38
|
+
}
|
|
39
|
+
// Collect all paths to check — logical, real, and their de-prefixed
|
|
40
|
+
// variants for macOS where /etc → /private/etc, /var → /private/var.
|
|
41
|
+
const pathsToCheck = new Set([logical, real]);
|
|
42
|
+
for (const p of [logical, real]) {
|
|
43
|
+
if (p.startsWith('/private/')) {
|
|
44
|
+
pathsToCheck.add(p.slice('/private'.length));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Block filesystem root
|
|
48
|
+
for (const check of pathsToCheck) {
|
|
49
|
+
if (check === '/') {
|
|
50
|
+
throw new Error(`Unsafe working directory: ${logical}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Block system-critical prefixes
|
|
54
|
+
for (const check of pathsToCheck) {
|
|
55
|
+
for (const prefix of BLOCKED_PREFIXES) {
|
|
56
|
+
if (check === prefix || check.startsWith(prefix + '/')) {
|
|
57
|
+
throw new Error(`Unsafe working directory: ${logical}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Block sensitive home subdirectories
|
|
62
|
+
const home = os.homedir();
|
|
63
|
+
for (const check of pathsToCheck) {
|
|
64
|
+
for (const subdir of BLOCKED_HOME_SUBDIRS) {
|
|
65
|
+
const sensitive = path.join(home, subdir);
|
|
66
|
+
if (check === sensitive || check.startsWith(sensitive + '/')) {
|
|
67
|
+
throw new Error(`Unsafe working directory: ${logical}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return real;
|
|
72
|
+
}
|
|
73
|
+
// ─── validateRegex ──────────────────────────────────────────────────────────
|
|
74
|
+
/**
|
|
75
|
+
* Validate that a string is a syntactically valid regular expression.
|
|
76
|
+
*
|
|
77
|
+
* Returns the compiled RegExp if valid, throws on invalid syntax.
|
|
78
|
+
* Note: this validates syntax only — it does not detect catastrophic
|
|
79
|
+
* backtracking (ReDoS) patterns.
|
|
80
|
+
*/
|
|
81
|
+
export function validateRegex(pattern) {
|
|
82
|
+
try {
|
|
83
|
+
return new RegExp(pattern, 'i');
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
throw new Error(`Invalid regex pattern: ${err.message}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// ─── validateName ───────────────────────────────────────────────────────────
|
|
90
|
+
const VALID_NAME = /^[a-zA-Z0-9_-]+$/;
|
|
91
|
+
/**
|
|
92
|
+
* Validate a resource name (agent, skill, rule) to prevent path injection.
|
|
93
|
+
*
|
|
94
|
+
* Only allows alphanumeric characters, hyphens, and underscores.
|
|
95
|
+
* Rejects empty strings, dots, slashes, spaces, and any other characters
|
|
96
|
+
* that could be used for path traversal.
|
|
97
|
+
*/
|
|
98
|
+
export function validateName(name) {
|
|
99
|
+
if (!name || !VALID_NAME.test(name)) {
|
|
100
|
+
throw new Error(`Invalid name '${name}': must be non-empty and match /^[a-zA-Z0-9_-]+$/`);
|
|
101
|
+
}
|
|
102
|
+
return name;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "claw-orchestrator",
|
|
3
|
+
"name": "Claw Orchestrator",
|
|
4
|
+
"description": "Run Claude Code, Codex, Gemini, Cursor Agent and custom coding CLIs as one unified runtime. Persistent sessions, multi-engine orchestration, multi-agent council, worktree isolation, multi-model proxy, structured output, plan mode workflows.",
|
|
5
|
+
"enabledByDefault": false,
|
|
6
|
+
"configSchema": {
|
|
7
|
+
"type": "object",
|
|
8
|
+
"properties": {
|
|
9
|
+
"claudeBin": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"default": "claude",
|
|
12
|
+
"description": "Path to Claude Code CLI binary"
|
|
13
|
+
},
|
|
14
|
+
"defaultModel": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"description": "Default model for new sessions"
|
|
17
|
+
},
|
|
18
|
+
"defaultPermissionMode": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"enum": ["acceptEdits", "bypassPermissions", "default", "delegate", "dontAsk", "plan", "auto"],
|
|
21
|
+
"default": "acceptEdits"
|
|
22
|
+
},
|
|
23
|
+
"defaultEffort": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"enum": ["low", "medium", "high", "max", "auto"],
|
|
26
|
+
"default": "auto"
|
|
27
|
+
},
|
|
28
|
+
"maxConcurrentSessions": {
|
|
29
|
+
"type": "number",
|
|
30
|
+
"default": 5,
|
|
31
|
+
"description": "Maximum concurrent Claude Code sessions"
|
|
32
|
+
},
|
|
33
|
+
"sessionTtlMinutes": {
|
|
34
|
+
"type": "number",
|
|
35
|
+
"default": 120,
|
|
36
|
+
"description": "Auto-cleanup idle sessions after N minutes"
|
|
37
|
+
},
|
|
38
|
+
"proxy": {
|
|
39
|
+
"type": "object",
|
|
40
|
+
"description": "Multi-model proxy settings for Gemini/GPT/other model support via Anthropic format translation",
|
|
41
|
+
"properties": {
|
|
42
|
+
"enabled": {
|
|
43
|
+
"type": "boolean",
|
|
44
|
+
"default": false,
|
|
45
|
+
"description": "Enable built-in multi-model proxy"
|
|
46
|
+
},
|
|
47
|
+
"bigModel": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"default": "gemini-2.5-pro",
|
|
50
|
+
"description": "Default model for complex requests"
|
|
51
|
+
},
|
|
52
|
+
"smallModel": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"default": "gemini-2.5-flash",
|
|
55
|
+
"description": "Default model for fast requests"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"capabilities": {
|
|
62
|
+
"childProcess": true,
|
|
63
|
+
"networkAccess": ["127.0.0.1"]
|
|
64
|
+
},
|
|
65
|
+
"contracts": {
|
|
66
|
+
"tools": [
|
|
67
|
+
"session_start",
|
|
68
|
+
"session_send",
|
|
69
|
+
"session_stop",
|
|
70
|
+
"session_list",
|
|
71
|
+
"sessions_overview",
|
|
72
|
+
"session_status",
|
|
73
|
+
"session_grep",
|
|
74
|
+
"session_compact",
|
|
75
|
+
"agents_list",
|
|
76
|
+
"team_list",
|
|
77
|
+
"team_send",
|
|
78
|
+
"session_update_tools",
|
|
79
|
+
"session_switch_model",
|
|
80
|
+
"project_purge",
|
|
81
|
+
"codex_resume",
|
|
82
|
+
"codex_review",
|
|
83
|
+
"codex_goal_set",
|
|
84
|
+
"codex_goal_get",
|
|
85
|
+
"codex_goal_pause",
|
|
86
|
+
"codex_goal_resume",
|
|
87
|
+
"codex_goal_clear",
|
|
88
|
+
"council_start",
|
|
89
|
+
"council_status",
|
|
90
|
+
"council_abort",
|
|
91
|
+
"council_inject",
|
|
92
|
+
"council_review",
|
|
93
|
+
"council_accept",
|
|
94
|
+
"council_reject",
|
|
95
|
+
"session_send_to",
|
|
96
|
+
"session_inbox",
|
|
97
|
+
"session_deliver_inbox",
|
|
98
|
+
"ultraplan_start",
|
|
99
|
+
"ultraplan_status",
|
|
100
|
+
"ultrareview_start",
|
|
101
|
+
"ultrareview_status",
|
|
102
|
+
"claude_session_start",
|
|
103
|
+
"claude_session_send",
|
|
104
|
+
"claude_session_stop",
|
|
105
|
+
"claude_session_list",
|
|
106
|
+
"claude_sessions_overview",
|
|
107
|
+
"claude_session_status",
|
|
108
|
+
"claude_session_grep",
|
|
109
|
+
"claude_session_compact",
|
|
110
|
+
"claude_agents_list",
|
|
111
|
+
"claude_team_list",
|
|
112
|
+
"claude_team_send",
|
|
113
|
+
"claude_session_update_tools",
|
|
114
|
+
"claude_session_switch_model",
|
|
115
|
+
"claude_project_purge",
|
|
116
|
+
"claude_session_send_to",
|
|
117
|
+
"claude_session_inbox",
|
|
118
|
+
"claude_session_deliver_inbox"
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
"skills": ["skills/SKILL.md"]
|
|
122
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@enderfga/claw-orchestrator",
|
|
3
|
+
"version": "3.0.0",
|
|
4
|
+
"description": "Claw Orchestrator — run Claude Code, Codex, Gemini, Cursor Agent and custom coding CLIs as one unified runtime for claw-style agent systems. Runs standalone, with first-class OpenClaw plugin support. Persistent sessions, multi-agent council, tool orchestration.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/src/index.js",
|
|
7
|
+
"types": "./dist/src/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"clawo": "./dist/bin/cli.js",
|
|
10
|
+
"claude-code-skill": "./dist/bin/cli.js"
|
|
11
|
+
},
|
|
12
|
+
"openclaw": {
|
|
13
|
+
"extensions": [
|
|
14
|
+
"./dist/src/index.js"
|
|
15
|
+
],
|
|
16
|
+
"hooks": {}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist/",
|
|
20
|
+
"configs/",
|
|
21
|
+
"skills/",
|
|
22
|
+
"openclaw.plugin.json",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE",
|
|
25
|
+
"assets/banner.jpg"
|
|
26
|
+
],
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsc",
|
|
29
|
+
"dev": "tsx src/index.ts",
|
|
30
|
+
"test": "vitest run",
|
|
31
|
+
"test:watch": "vitest",
|
|
32
|
+
"test:coverage": "vitest run --coverage",
|
|
33
|
+
"lint": "eslint src/ bin/",
|
|
34
|
+
"lint:fix": "eslint src/ bin/ --fix",
|
|
35
|
+
"format": "prettier --write 'src/**/*.ts' 'bin/**/*.ts'",
|
|
36
|
+
"format:check": "prettier --check 'src/**/*.ts' 'bin/**/*.ts'",
|
|
37
|
+
"prepublishOnly": "npm run build"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=22.0.0"
|
|
41
|
+
},
|
|
42
|
+
"keywords": [
|
|
43
|
+
"claw-orchestrator",
|
|
44
|
+
"coding-agent",
|
|
45
|
+
"agent-orchestration",
|
|
46
|
+
"claude-code",
|
|
47
|
+
"codex",
|
|
48
|
+
"gemini",
|
|
49
|
+
"cursor",
|
|
50
|
+
"multi-agent",
|
|
51
|
+
"agent-council",
|
|
52
|
+
"session-management",
|
|
53
|
+
"openclaw",
|
|
54
|
+
"mcp"
|
|
55
|
+
],
|
|
56
|
+
"author": "enderfga",
|
|
57
|
+
"repository": {
|
|
58
|
+
"type": "git",
|
|
59
|
+
"url": "git+https://github.com/Enderfga/claw-orchestrator.git"
|
|
60
|
+
},
|
|
61
|
+
"homepage": "https://github.com/Enderfga/claw-orchestrator#readme",
|
|
62
|
+
"bugs": {
|
|
63
|
+
"url": "https://github.com/Enderfga/claw-orchestrator/issues"
|
|
64
|
+
},
|
|
65
|
+
"license": "MIT",
|
|
66
|
+
"dependencies": {
|
|
67
|
+
"commander": "^12.1.0"
|
|
68
|
+
},
|
|
69
|
+
"peerDependencies": {
|
|
70
|
+
"openclaw": ">=2026.3.0"
|
|
71
|
+
},
|
|
72
|
+
"devDependencies": {
|
|
73
|
+
"@eslint/js": "^9.15.0",
|
|
74
|
+
"@types/node": "^22.10.0",
|
|
75
|
+
"@vitest/coverage-v8": "^3.1.0",
|
|
76
|
+
"eslint": "^9.15.0",
|
|
77
|
+
"eslint-config-prettier": "^10.1.0",
|
|
78
|
+
"prettier": "^3.5.0",
|
|
79
|
+
"tsx": "^4.19.0",
|
|
80
|
+
"typescript": "^5.7.0",
|
|
81
|
+
"typescript-eslint": "^8.20.0",
|
|
82
|
+
"vitest": "^3.1.0"
|
|
83
|
+
}
|
|
84
|
+
}
|
package/skills/SKILL.md
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: claw-orchestrator
|
|
3
|
+
description: Manage persistent coding sessions across Claude Code, Codex, Gemini, and Cursor engines. Use when orchestrating multi-engine coding agents, starting/sending/stopping sessions, running multi-agent council collaborations, cross-session messaging, ultraplan deep planning, ultrareview parallel code review, or switching models/tools at runtime. Triggers on "start a session", "send to session", "run council", "ultraplan", "ultrareview", "switch model", "multi-agent", "coding session", "session inbox", "cursor agent".
|
|
4
|
+
metadata:
|
|
5
|
+
{
|
|
6
|
+
"openclaw":
|
|
7
|
+
{
|
|
8
|
+
"emoji": "🤖",
|
|
9
|
+
"requires": { "anyBins": ["claude", "codex", "gemini", "agent"] },
|
|
10
|
+
"install":
|
|
11
|
+
[
|
|
12
|
+
{
|
|
13
|
+
"id": "npm-plugin",
|
|
14
|
+
"kind": "node",
|
|
15
|
+
"package": "@enderfga/claw-orchestrator",
|
|
16
|
+
"label": "Install plugin (npm)"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": "node-claude",
|
|
20
|
+
"kind": "node",
|
|
21
|
+
"package": "@anthropic-ai/claude-code",
|
|
22
|
+
"bins": ["claude"],
|
|
23
|
+
"label": "Install Claude Code CLI"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "node-codex",
|
|
27
|
+
"kind": "node",
|
|
28
|
+
"package": "@openai/codex",
|
|
29
|
+
"bins": ["codex"],
|
|
30
|
+
"label": "Install Codex CLI"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "node-gemini",
|
|
34
|
+
"kind": "node",
|
|
35
|
+
"package": "@google/gemini-cli",
|
|
36
|
+
"bins": ["gemini"],
|
|
37
|
+
"label": "Install Gemini CLI"
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
# Claw Orchestrator Skill
|
|
45
|
+
|
|
46
|
+
Claw Orchestrator — persistent multi-engine coding session manager for claw-style agent systems. Runs as a standalone CLI/server, with first-class OpenClaw plugin support. Wraps Claude Code, Codex, Gemini, Cursor Agent, and custom CLIs into headless agentic engines with 35 tools.
|
|
47
|
+
|
|
48
|
+
## Engine Quick Reference
|
|
49
|
+
|
|
50
|
+
| Engine | CLI | Session Type | Best For |
|
|
51
|
+
|--------|-----|-------------|----------|
|
|
52
|
+
| `claude` | `claude` | Persistent subprocess | Multi-turn, complex tasks |
|
|
53
|
+
| `codex` | `codex exec` | Per-message spawn | One-shot execution |
|
|
54
|
+
| `gemini` | `gemini -p` | Per-message spawn | One-shot execution |
|
|
55
|
+
| `cursor` | `agent -p` | Per-message spawn | One-shot execution |
|
|
56
|
+
|
|
57
|
+
## Core Workflow
|
|
58
|
+
|
|
59
|
+
```javascript
|
|
60
|
+
// 1. Start session (any engine)
|
|
61
|
+
claude_session_start({ name: "myproject", cwd: "/path/to/project", engine: "claude" })
|
|
62
|
+
claude_session_start({ name: "codex-task", cwd: "/path/to/project", engine: "codex" })
|
|
63
|
+
claude_session_start({ name: "gemini-task", cwd: "/path/to/project", engine: "gemini" })
|
|
64
|
+
claude_session_start({ name: "cursor-task", cwd: "/path/to/project", engine: "cursor" })
|
|
65
|
+
|
|
66
|
+
// 2. Send messages
|
|
67
|
+
claude_session_send({ name: "myproject", message: "Fix the auth bug" })
|
|
68
|
+
|
|
69
|
+
// 3. Check status / search history
|
|
70
|
+
claude_session_status({ name: "myproject" })
|
|
71
|
+
claude_session_grep({ name: "myproject", pattern: "error" })
|
|
72
|
+
|
|
73
|
+
// 4. Stop when done
|
|
74
|
+
claude_session_stop({ name: "myproject" })
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Session Options
|
|
78
|
+
|
|
79
|
+
| Parameter | Description |
|
|
80
|
+
|-----------|-------------|
|
|
81
|
+
| `engine` | `claude` (default), `codex`, `gemini`, `cursor` |
|
|
82
|
+
| `model` | Model name or alias (`opus`, `sonnet`, `haiku`, `gpt-5.4`, `gemini-pro`, `composer-2`) |
|
|
83
|
+
| `permissionMode` | `acceptEdits`, `auto`, `plan`, `bypassPermissions`, `default` |
|
|
84
|
+
| `effort` | `low`, `medium`, `high`, `xhigh`, `max`, `auto` (`xhigh` is Opus 4.7-only, between `high` and `max`) |
|
|
85
|
+
| `maxBudgetUsd` | Cost limit in USD |
|
|
86
|
+
| `allowedTools` | List of allowed tool names |
|
|
87
|
+
|
|
88
|
+
### CLI 2.1.111 options
|
|
89
|
+
|
|
90
|
+
| Parameter | Description |
|
|
91
|
+
|-----------|-------------|
|
|
92
|
+
| `bare` | Minimal mode — no CLAUDE.md, hooks, LSP, auto-memory. Auto-enables prompt cache optimizations (see below). |
|
|
93
|
+
| `includeHookEvents` | Stream hook lifecycle events (PreToolUse/PostToolUse). |
|
|
94
|
+
| `permissionPromptTool` | Delegate permission prompts to an MCP tool for non-interactive use. |
|
|
95
|
+
| `excludeDynamicSystemPromptSections` | Move cwd/env/git from system prompt to user message for better prompt cache hits. Auto-enabled with `bare: true`. |
|
|
96
|
+
| `enablePromptCaching1H` | Enable 1-hour prompt cache TTL (vs default 5-min). Auto-enabled with `bare: true`. |
|
|
97
|
+
| `debug` / `debugFile` | Targeted debug output by category (e.g. `"api,mcp"`) and optional file path. |
|
|
98
|
+
| `fromPr` | Resume a session linked to a GitHub PR number or URL. |
|
|
99
|
+
| `channels` / `dangerouslyLoadDevelopmentChannels` | MCP channel subscriptions (research preview). |
|
|
100
|
+
|
|
101
|
+
### CLI 2.1.121 options
|
|
102
|
+
|
|
103
|
+
| Parameter | Description |
|
|
104
|
+
|-----------|-------------|
|
|
105
|
+
| `forkSubagent` | Fork subagent for non-interactive sessions (sets `CLAUDE_CODE_FORK_SUBAGENT=1`). |
|
|
106
|
+
| `enableToolSearch` | Enable Vertex AI tool search (sets `ENABLE_TOOL_SEARCH=1`). |
|
|
107
|
+
| `otelLogUserPrompts` | OpenTelemetry: include user prompts in logs (sets `OTEL_LOG_USER_PROMPTS=1`). |
|
|
108
|
+
| `otelLogRawApiBodies` | OpenTelemetry: include raw API bodies in logs (sets `OTEL_LOG_RAW_API_BODIES=1`). Debug only. |
|
|
109
|
+
|
|
110
|
+
`stats.pluginErrors` is now populated from the `system/init` event when CLI plugins fail to load due to unmet dependencies.
|
|
111
|
+
|
|
112
|
+
`TRACEPARENT` / `TRACESTATE` (W3C distributed tracing) are automatically forwarded from parent process env — set them before starting the session and they propagate to the child Claude CLI.
|
|
113
|
+
|
|
114
|
+
**Smart defaults:** When `bare: true`, the plugin auto-enables `--exclude-dynamic-system-prompt-sections` and `ENABLE_PROMPT_CACHING_1H=1` unless explicitly set to `false`.
|
|
115
|
+
|
|
116
|
+
## Multi-Agent Council
|
|
117
|
+
|
|
118
|
+
Parallel agent collaboration with git worktree isolation and consensus voting. Agents can use different engines.
|
|
119
|
+
|
|
120
|
+
```javascript
|
|
121
|
+
// Start a council
|
|
122
|
+
council_start({
|
|
123
|
+
task: 'Build a REST API',
|
|
124
|
+
agents: [
|
|
125
|
+
{ name: 'Architect', emoji: '🏗️', persona: 'System design', engine: 'claude' },
|
|
126
|
+
{ name: 'Engineer', emoji: '⚙️', persona: 'Implementation', engine: 'codex' },
|
|
127
|
+
],
|
|
128
|
+
maxRounds: 5,
|
|
129
|
+
projectDir: '/path/to/project',
|
|
130
|
+
});
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Council lifecycle: `council_start` → poll `council_status` → `council_review` → `council_accept` or `council_reject`.
|
|
134
|
+
|
|
135
|
+
For details: see [references/council.md](references/council.md)
|
|
136
|
+
|
|
137
|
+
## Cross-Session Messaging
|
|
138
|
+
|
|
139
|
+
Sessions can communicate. Idle sessions receive immediately; busy sessions queue.
|
|
140
|
+
|
|
141
|
+
```javascript
|
|
142
|
+
claude_session_send_to({ from: "sender", to: "receiver", message: "Auth module needs rate limiting" })
|
|
143
|
+
claude_session_send_to({ from: "monitor", to: "*", message: "Build failed!" }) // broadcast
|
|
144
|
+
claude_session_inbox({ name: "receiver" })
|
|
145
|
+
claude_session_deliver_inbox({ name: "receiver" })
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Team Tools (All Engines)
|
|
149
|
+
|
|
150
|
+
All engines use the same virtual-team layer: cross-session inbox routing across active SessionManager sessions. (Claude Code's native experimental Agent Teams is in-process TUI only and not reachable from a subprocess wrapper.)
|
|
151
|
+
|
|
152
|
+
```javascript
|
|
153
|
+
claude_team_list({ name: "myproject" })
|
|
154
|
+
claude_team_send({ name: "myproject", teammate: "teammate", message: "Review this" })
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Ultraplan & Ultrareview
|
|
158
|
+
|
|
159
|
+
- **Ultraplan**: Opus deep planning session (up to 30 min), produces detailed implementation plan
|
|
160
|
+
- **Ultrareview**: Fleet of 5-20 bug-hunting agents reviewing in parallel (security, logic, perf, types, etc.)
|
|
161
|
+
|
|
162
|
+
Both are async — start then poll status.
|
|
163
|
+
|
|
164
|
+
## 27 Tools Overview
|
|
165
|
+
|
|
166
|
+
| Category | Tools |
|
|
167
|
+
|----------|-------|
|
|
168
|
+
| Session Lifecycle | `claude_session_start`, `claude_session_send`, `claude_session_stop`, `claude_session_list`, `claude_sessions_overview` |
|
|
169
|
+
| Session Ops | `claude_session_status`, `claude_session_grep`, `claude_session_compact`, `claude_session_update_tools`, `claude_session_switch_model` |
|
|
170
|
+
| Inbox | `claude_session_send_to`, `claude_session_inbox`, `claude_session_deliver_inbox` |
|
|
171
|
+
| Teams | `claude_agents_list`, `claude_team_list`, `claude_team_send` |
|
|
172
|
+
| Council | `council_start`, `council_status`, `council_abort`, `council_inject`, `council_review`, `council_accept`, `council_reject` |
|
|
173
|
+
| Ultra | `ultraplan_start`, `ultraplan_status`, `ultrareview_start`, `ultrareview_status` |
|
|
174
|
+
|
|
175
|
+
For full parameter reference: see [references/tools.md](references/tools.md)
|
|
176
|
+
|
|
177
|
+
## Authentication Prerequisites
|
|
178
|
+
|
|
179
|
+
Each engine requires its own auth before use:
|
|
180
|
+
|
|
181
|
+
- **Claude**: `claude /login` or `ANTHROPIC_API_KEY`
|
|
182
|
+
- **Codex**: `codex login` or `OPENAI_API_KEY`
|
|
183
|
+
- **Gemini**: `gemini login` or `GEMINI_API_KEY`
|
|
184
|
+
- **Cursor**: `agent login` or `CURSOR_API_KEY`
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Claude Code CLI Feature Tracking
|
|
2
|
+
|
|
3
|
+
This document tracks which Claude Code CLI version Claw Orchestrator is currently synced to, and which features have been integrated.
|
|
4
|
+
|
|
5
|
+
## Currently tracked: **Claude Code CLI 2.1.126** (as of 2026-05-04, plugin v2.14.2)
|
|
6
|
+
|
|
7
|
+
## Sync history
|
|
8
|
+
|
|
9
|
+
| Plugin Version | Claude CLI Version | Date | Notable integrations |
|
|
10
|
+
|---|---|---|---|
|
|
11
|
+
| v2.14.2 | 2.1.126 | 2026-05-04 | `bedrockServiceTier` (Bedrock service-tier env, 2.1.122), `claude_project_purge` tool (wraps `claude project purge`, 2.1.126); skipped passive-only items (OTel numeric attr, `invocation_trigger`, `/v1/models` gateway discovery, PowerShell shell changes) |
|
|
12
|
+
| v2.14.0 | 2.1.121 | 2026-04-28 | `forkSubagent` (fork subagent env), `enableToolSearch` (Vertex AI tool search env), `otelLogUserPrompts` / `otelLogRawApiBodies` (OTEL logging toggles), `xhigh` effort level (Opus 4.7), `stats.pluginErrors` capture from `system/init` |
|
|
13
|
+
| v2.13.0 | 2.1.111 | 2026-04-16 | Hook events, permission delegation, prompt cache optimization (exclude-dynamic-sections + 1H cache), debug control, `--from-pr`, MCP channels, `system/api_retry` event tracking |
|
|
14
|
+
| v2.12.2 and earlier | 2.1.91 | — | Bare mode, worktree, json-schema, mcp-config, betas, fallback-model, effort, agent teams |
|
|
15
|
+
|
|
16
|
+
## How to update this
|
|
17
|
+
|
|
18
|
+
When syncing to a new Claude Code CLI version:
|
|
19
|
+
|
|
20
|
+
1. Run `claude --version` to confirm target version
|
|
21
|
+
2. Check Claude Code changelog / release notes for new flags, events, env vars since the last tracked version
|
|
22
|
+
3. Decide which features are valuable for programmatic/agent use (vs human-interactive only) — see the Tier 1/2/3 framework in `docs/superpowers/specs/`
|
|
23
|
+
4. Implement worthwhile features (add to `SessionConfig` → wire into `persistent-session.ts` → expose in tool schema → document)
|
|
24
|
+
5. Update this file with the new version + notable integrations
|
|
25
|
+
6. Update `CLAUDE.md` and `README.md` engine compatibility tables
|