@cleocode/adapters 2026.5.4 → 2026.5.5

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 (123) hide show
  1. package/package.json +4 -4
  2. package/dist/cant-context.js +0 -711
  3. package/dist/cant-context.js.map +0 -1
  4. package/dist/providers/claude-code/adapter.js +0 -222
  5. package/dist/providers/claude-code/adapter.js.map +0 -1
  6. package/dist/providers/claude-code/context-monitor.js +0 -159
  7. package/dist/providers/claude-code/context-monitor.js.map +0 -1
  8. package/dist/providers/claude-code/hooks.js +0 -428
  9. package/dist/providers/claude-code/hooks.js.map +0 -1
  10. package/dist/providers/claude-code/index.js +0 -41
  11. package/dist/providers/claude-code/index.js.map +0 -1
  12. package/dist/providers/claude-code/install.js +0 -310
  13. package/dist/providers/claude-code/install.js.map +0 -1
  14. package/dist/providers/claude-code/paths.js +0 -41
  15. package/dist/providers/claude-code/paths.js.map +0 -1
  16. package/dist/providers/claude-code/spawn.js +0 -198
  17. package/dist/providers/claude-code/spawn.js.map +0 -1
  18. package/dist/providers/claude-code/statusline.js +0 -130
  19. package/dist/providers/claude-code/statusline.js.map +0 -1
  20. package/dist/providers/claude-code/task-sync.js +0 -119
  21. package/dist/providers/claude-code/task-sync.js.map +0 -1
  22. package/dist/providers/claude-code/transport.js +0 -29
  23. package/dist/providers/claude-code/transport.js.map +0 -1
  24. package/dist/providers/claude-sdk/adapter.js +0 -88
  25. package/dist/providers/claude-sdk/adapter.js.map +0 -1
  26. package/dist/providers/claude-sdk/index.js +0 -34
  27. package/dist/providers/claude-sdk/index.js.map +0 -1
  28. package/dist/providers/claude-sdk/install.js +0 -61
  29. package/dist/providers/claude-sdk/install.js.map +0 -1
  30. package/dist/providers/claude-sdk/mcp-registry.js +0 -66
  31. package/dist/providers/claude-sdk/mcp-registry.js.map +0 -1
  32. package/dist/providers/claude-sdk/session-store.js +0 -84
  33. package/dist/providers/claude-sdk/session-store.js.map +0 -1
  34. package/dist/providers/claude-sdk/spawn.js +0 -251
  35. package/dist/providers/claude-sdk/spawn.js.map +0 -1
  36. package/dist/providers/claude-sdk/tool-bridge.js +0 -50
  37. package/dist/providers/claude-sdk/tool-bridge.js.map +0 -1
  38. package/dist/providers/codex/adapter.js +0 -146
  39. package/dist/providers/codex/adapter.js.map +0 -1
  40. package/dist/providers/codex/hooks.js +0 -113
  41. package/dist/providers/codex/hooks.js.map +0 -1
  42. package/dist/providers/codex/index.js +0 -40
  43. package/dist/providers/codex/index.js.map +0 -1
  44. package/dist/providers/codex/install.js +0 -132
  45. package/dist/providers/codex/install.js.map +0 -1
  46. package/dist/providers/codex/spawn.js +0 -203
  47. package/dist/providers/codex/spawn.js.map +0 -1
  48. package/dist/providers/cursor/adapter.js +0 -151
  49. package/dist/providers/cursor/adapter.js.map +0 -1
  50. package/dist/providers/cursor/hooks.js +0 -208
  51. package/dist/providers/cursor/hooks.js.map +0 -1
  52. package/dist/providers/cursor/index.js +0 -36
  53. package/dist/providers/cursor/index.js.map +0 -1
  54. package/dist/providers/cursor/install.js +0 -281
  55. package/dist/providers/cursor/install.js.map +0 -1
  56. package/dist/providers/cursor/spawn.js +0 -59
  57. package/dist/providers/cursor/spawn.js.map +0 -1
  58. package/dist/providers/gemini-cli/adapter.js +0 -158
  59. package/dist/providers/gemini-cli/adapter.js.map +0 -1
  60. package/dist/providers/gemini-cli/hooks.js +0 -128
  61. package/dist/providers/gemini-cli/hooks.js.map +0 -1
  62. package/dist/providers/gemini-cli/index.js +0 -40
  63. package/dist/providers/gemini-cli/index.js.map +0 -1
  64. package/dist/providers/gemini-cli/install.js +0 -124
  65. package/dist/providers/gemini-cli/install.js.map +0 -1
  66. package/dist/providers/gemini-cli/spawn.js +0 -195
  67. package/dist/providers/gemini-cli/spawn.js.map +0 -1
  68. package/dist/providers/kimi/adapter.js +0 -145
  69. package/dist/providers/kimi/adapter.js.map +0 -1
  70. package/dist/providers/kimi/hooks.js +0 -79
  71. package/dist/providers/kimi/hooks.js.map +0 -1
  72. package/dist/providers/kimi/index.js +0 -40
  73. package/dist/providers/kimi/index.js.map +0 -1
  74. package/dist/providers/kimi/install.js +0 -124
  75. package/dist/providers/kimi/install.js.map +0 -1
  76. package/dist/providers/kimi/spawn.js +0 -225
  77. package/dist/providers/kimi/spawn.js.map +0 -1
  78. package/dist/providers/openai-sdk/adapter.js +0 -121
  79. package/dist/providers/openai-sdk/adapter.js.map +0 -1
  80. package/dist/providers/openai-sdk/guardrails.js +0 -174
  81. package/dist/providers/openai-sdk/guardrails.js.map +0 -1
  82. package/dist/providers/openai-sdk/handoff.js +0 -128
  83. package/dist/providers/openai-sdk/handoff.js.map +0 -1
  84. package/dist/providers/openai-sdk/index.js +0 -40
  85. package/dist/providers/openai-sdk/index.js.map +0 -1
  86. package/dist/providers/openai-sdk/install.js +0 -120
  87. package/dist/providers/openai-sdk/install.js.map +0 -1
  88. package/dist/providers/openai-sdk/spawn.js +0 -361
  89. package/dist/providers/openai-sdk/spawn.js.map +0 -1
  90. package/dist/providers/openai-sdk/tracing.js +0 -159
  91. package/dist/providers/openai-sdk/tracing.js.map +0 -1
  92. package/dist/providers/opencode/adapter.js +0 -166
  93. package/dist/providers/opencode/adapter.js.map +0 -1
  94. package/dist/providers/opencode/hooks.js +0 -206
  95. package/dist/providers/opencode/hooks.js.map +0 -1
  96. package/dist/providers/opencode/index.js +0 -37
  97. package/dist/providers/opencode/index.js.map +0 -1
  98. package/dist/providers/opencode/install.js +0 -242
  99. package/dist/providers/opencode/install.js.map +0 -1
  100. package/dist/providers/opencode/spawn.js +0 -257
  101. package/dist/providers/opencode/spawn.js.map +0 -1
  102. package/dist/providers/pi/adapter.js +0 -220
  103. package/dist/providers/pi/adapter.js.map +0 -1
  104. package/dist/providers/pi/hooks.js +0 -223
  105. package/dist/providers/pi/hooks.js.map +0 -1
  106. package/dist/providers/pi/index.js +0 -38
  107. package/dist/providers/pi/index.js.map +0 -1
  108. package/dist/providers/pi/install.js +0 -183
  109. package/dist/providers/pi/install.js.map +0 -1
  110. package/dist/providers/pi/spawn.js +0 -187
  111. package/dist/providers/pi/spawn.js.map +0 -1
  112. package/dist/providers/shared/conduit-trace-writer.js +0 -65
  113. package/dist/providers/shared/conduit-trace-writer.js.map +0 -1
  114. package/dist/providers/shared/hook-template-installer.js +0 -209
  115. package/dist/providers/shared/hook-template-installer.js.map +0 -1
  116. package/dist/providers/shared/paths.js +0 -77
  117. package/dist/providers/shared/paths.js.map +0 -1
  118. package/dist/providers/shared/sdk-result-mapper.js +0 -55
  119. package/dist/providers/shared/sdk-result-mapper.js.map +0 -1
  120. package/dist/providers/shared/transcript-reader.js +0 -124
  121. package/dist/providers/shared/transcript-reader.js.map +0 -1
  122. package/dist/registry.js +0 -92
  123. package/dist/registry.js.map +0 -1
@@ -1,310 +0,0 @@
1
- /**
2
- * Claude Code Install Provider
3
- *
4
- * Handles CLEO installation into Claude Code environments:
5
- * - Ensures CLAUDE.md has CLEO @-references
6
- * - Manages plugin registration in ~/.claude/settings.json
7
- *
8
- * Migrated from src/core/install/claude-plugin.ts
9
- *
10
- * @task T5240
11
- */
12
- import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, } from 'node:fs';
13
- import { homedir } from 'node:os';
14
- import { dirname, join } from 'node:path';
15
- import { fileURLToPath } from 'node:url';
16
- import { installProviderHookTemplates, } from '../shared/hook-template-installer.js';
17
- import { getCleoTemplatesTildePath } from '../shared/paths.js';
18
- /**
19
- * Lines that should appear in CLAUDE.md to reference CLEO.
20
- * The CLEO-INJECTION.md path is resolved dynamically to support non-default
21
- * XDG / OS installation locations (T916).
22
- */
23
- const INSTRUCTION_REFERENCES = [
24
- `@${getCleoTemplatesTildePath()}/CLEO-INJECTION.md`,
25
- '@.cleo/memory-bridge.md',
26
- ];
27
- /** Resolve the commands directory bundled with this adapter. */
28
- function getAdapterCommandsDir() {
29
- // Works in both ESM (import.meta.url) and compiled output
30
- const thisDir = dirname(fileURLToPath(import.meta.url));
31
- return join(thisDir, 'commands');
32
- }
33
- /**
34
- * Install provider for Claude Code.
35
- *
36
- * Manages CLEO's integration with Claude Code by:
37
- * 1. Ensuring CLAUDE.md contains @-references to CLEO instruction files
38
- * 2. Installing adapter-provided commands to .claude/commands/
39
- * 3. Registering the brain observation plugin in ~/.claude/settings.json
40
- *
41
- * @remarks
42
- * Installation is idempotent -- running install multiple times on the same
43
- * project produces the same result. The provider disables the legacy
44
- * `claude-mem\@thedotmack` plugin if present and enables the unified
45
- * `cleo\@cleocode` plugin instead.
46
- */
47
- export class ClaudeCodeInstallProvider {
48
- /**
49
- * Install CLEO into a Claude Code project.
50
- *
51
- * @param options - Installation options including project directory
52
- * @returns Result describing what was installed
53
- */
54
- async install(options) {
55
- const { projectDir } = options;
56
- const installedAt = new Date().toISOString();
57
- let instructionFileUpdated = false;
58
- const details = {};
59
- // Step 1: Ensure CLAUDE.md has @-references
60
- instructionFileUpdated = this.updateInstructionFile(projectDir);
61
- if (instructionFileUpdated) {
62
- details.instructionFile = join(projectDir, 'CLAUDE.md');
63
- }
64
- // Step 2: Install adapter-provided commands to .claude/commands/
65
- const commandsInstalled = this.installCommands(projectDir);
66
- if (commandsInstalled.length > 0) {
67
- details.commands = commandsInstalled;
68
- }
69
- // Step 3: Register plugin in ~/.claude/settings.json
70
- const pluginResult = this.registerPlugin();
71
- if (pluginResult) {
72
- details.plugin = pluginResult;
73
- }
74
- // Step 4 (T1013): Install PreCompact hook templates + wire the handler
75
- // command into ~/.claude/settings.json's `PreCompact` event.
76
- const hookResult = this.installHookTemplates();
77
- if (hookResult) {
78
- details.hookTemplates = hookResult;
79
- }
80
- return {
81
- success: true,
82
- installedAt,
83
- instructionFileUpdated,
84
- details,
85
- };
86
- }
87
- /**
88
- * Uninstall CLEO from the current Claude Code project.
89
- *
90
- * Does not remove CLAUDE.md references (they are harmless if CLEO is not present).
91
- */
92
- async uninstall() { }
93
- /**
94
- * Check whether CLEO is installed in the current environment.
95
- *
96
- * Checks for plugin enabled in ~/.claude/settings.json.
97
- */
98
- async isInstalled() {
99
- // Check ~/.claude/settings.json for plugin registration
100
- const settingsPath = join(homedir(), '.claude', 'settings.json');
101
- if (existsSync(settingsPath)) {
102
- try {
103
- const settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));
104
- const plugins = settings.enabledPlugins;
105
- if (plugins && plugins['cleo@cleocode'] === true) {
106
- return true;
107
- }
108
- }
109
- catch {
110
- // Fall through
111
- }
112
- }
113
- return false;
114
- }
115
- /**
116
- * Ensure CLAUDE.md contains @-references to CLEO instruction files.
117
- *
118
- * Creates CLAUDE.md if it does not exist. Appends any missing references.
119
- *
120
- * @param projectDir - Project root directory
121
- */
122
- async ensureInstructionReferences(projectDir) {
123
- this.updateInstructionFile(projectDir);
124
- }
125
- /**
126
- * Update CLAUDE.md with CLEO @-references.
127
- *
128
- * @returns true if the file was created or modified
129
- */
130
- updateInstructionFile(projectDir) {
131
- const claudeMdPath = join(projectDir, 'CLAUDE.md');
132
- let content = '';
133
- let existed = false;
134
- if (existsSync(claudeMdPath)) {
135
- content = readFileSync(claudeMdPath, 'utf-8');
136
- existed = true;
137
- }
138
- const missingRefs = INSTRUCTION_REFERENCES.filter((ref) => !content.includes(ref));
139
- if (missingRefs.length === 0) {
140
- return false;
141
- }
142
- const refsBlock = missingRefs.join('\n');
143
- if (existed) {
144
- // Append missing references
145
- const separator = content.endsWith('\n') ? '' : '\n';
146
- content = content + separator + refsBlock + '\n';
147
- }
148
- else {
149
- // Create new CLAUDE.md with references
150
- content = refsBlock + '\n';
151
- }
152
- writeFileSync(claudeMdPath, content, 'utf-8');
153
- return true;
154
- }
155
- /**
156
- * Install Claude Code-specific commands to .claude/commands/ in the project.
157
- *
158
- * These commands extend CLEO's provider-neutral skills with Claude Code-specific
159
- * operational patterns (Agent tool spawn templates, model assignment, context guardrails).
160
- *
161
- * @param projectDir - Project root directory
162
- * @returns Array of installed command filenames
163
- */
164
- installCommands(projectDir) {
165
- const adapterCommandsDir = getAdapterCommandsDir();
166
- if (!existsSync(adapterCommandsDir)) {
167
- return [];
168
- }
169
- const targetDir = join(projectDir, '.claude', 'commands');
170
- mkdirSync(targetDir, { recursive: true });
171
- const installed = [];
172
- const files = readdirSync(adapterCommandsDir).filter((f) => f.endsWith('.md'));
173
- for (const file of files) {
174
- const src = join(adapterCommandsDir, file);
175
- const dest = join(targetDir, file);
176
- copyFileSync(src, dest);
177
- installed.push(file);
178
- }
179
- return installed;
180
- }
181
- /**
182
- * Register the CLEO brain plugin in ~/.claude/settings.json.
183
- *
184
- * @returns Description of what was registered, or null if no change needed
185
- */
186
- registerPlugin() {
187
- const home = homedir();
188
- const settingsPath = join(home, '.claude', 'settings.json');
189
- let settings = {};
190
- if (existsSync(settingsPath)) {
191
- try {
192
- settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));
193
- }
194
- catch {
195
- // Start fresh
196
- }
197
- }
198
- const enabledPlugins = settings.enabledPlugins ?? {};
199
- const pluginKey = 'cleo@cleocode';
200
- if (enabledPlugins[pluginKey] === true) {
201
- return null;
202
- }
203
- // Disable old claude-mem if present
204
- if (enabledPlugins['claude-mem@thedotmack'] === true) {
205
- enabledPlugins['claude-mem@thedotmack'] = false;
206
- }
207
- enabledPlugins[pluginKey] = true;
208
- settings.enabledPlugins = enabledPlugins;
209
- mkdirSync(join(home, '.claude'), { recursive: true });
210
- writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
211
- return `Enabled ${pluginKey} in ~/.claude/settings.json`;
212
- }
213
- /**
214
- * Install the CLEO PreCompact hook templates for Claude Code (T1013).
215
- *
216
- * Writes two files to `~/.claude/hooks/`:
217
- * 1. `cleo-precompact-core.sh` — universal CLEO safestop helper (shared
218
- * across all providers; sourced by the provider-specific shim).
219
- * 2. `precompact-safestop.sh` — Claude-Code-flavoured wrapper that invokes
220
- * `cleo memory precompact-flush` and `cleo safestop`.
221
- *
222
- * Also registers a `PreCompact` entry in `~/.claude/settings.json` so Claude
223
- * Code runs the hook when auto-compact fires (at 95% context).
224
- *
225
- * Idempotent: subsequent installs skip unchanged files and do not duplicate
226
- * the settings.json hook entry.
227
- *
228
- * @returns Install summary (paths written + config change description), or
229
- * `null` when no change was required.
230
- *
231
- * @task T1013
232
- */
233
- installHookTemplates() {
234
- const home = homedir();
235
- const hooksDir = join(home, '.claude', 'hooks');
236
- // 1. Copy the bash templates next to each other so `source $SCRIPT_DIR/...` works.
237
- // Template copy is best-effort so missing/locked filesystems (CI sandboxes,
238
- // mocked `node:fs` in unit tests) don't fail the whole install.
239
- let templates;
240
- try {
241
- templates = installProviderHookTemplates({
242
- provider: 'claude-code',
243
- targetDir: hooksDir,
244
- });
245
- }
246
- catch {
247
- return null;
248
- }
249
- // 2. Wire the PreCompact event in ~/.claude/settings.json.
250
- const settingsEntryAdded = this.registerPreCompactHook(join(hooksDir, 'precompact-safestop.sh'));
251
- if (templates.installedFiles.length === 0 && !settingsEntryAdded) {
252
- return null;
253
- }
254
- return { templates, settingsEntryAdded };
255
- }
256
- /**
257
- * Register the PreCompact hook command in `~/.claude/settings.json`.
258
- *
259
- * The Claude Code native event name for the canonical `PreCompact` event is
260
- * `PreCompact` (identity mapping — see `hook-mappings.json`). The entry is
261
- * tagged with `# cleo-hook` so the uninstall flow can identify and remove
262
- * our additions without touching user-authored hooks.
263
- *
264
- * @param shimPath - Absolute path to the installed `precompact-safestop.sh`.
265
- * @returns `true` when a new hook entry was written, `false` when an
266
- * equivalent entry was already present.
267
- *
268
- * @task T1013
269
- */
270
- registerPreCompactHook(shimPath) {
271
- const home = homedir();
272
- const settingsPath = join(home, '.claude', 'settings.json');
273
- let settings = {};
274
- if (existsSync(settingsPath)) {
275
- try {
276
- settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));
277
- }
278
- catch {
279
- // Start fresh on corrupt settings — safer than aborting install.
280
- }
281
- }
282
- const hooks = settings.hooks ?? {};
283
- const preCompactEntries = hooks.PreCompact ?? [];
284
- const alreadyWired = preCompactEntries.some((entry) => typeof entry === 'object' &&
285
- entry !== null &&
286
- Array.isArray(entry.hooks) &&
287
- entry.hooks.some((h) => typeof h.command === 'string' &&
288
- h.command.includes('# cleo-hook') &&
289
- h.command.includes('precompact-safestop.sh')));
290
- if (alreadyWired) {
291
- return false;
292
- }
293
- preCompactEntries.push({
294
- matcher: '',
295
- hooks: [
296
- {
297
- type: 'command',
298
- command: `"${shimPath}" # cleo-hook`,
299
- timeout: 30,
300
- },
301
- ],
302
- });
303
- hooks.PreCompact = preCompactEntries;
304
- settings.hooks = hooks;
305
- mkdirSync(join(home, '.claude'), { recursive: true });
306
- writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
307
- return true;
308
- }
309
- }
310
- //# sourceMappingURL=install.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/providers/claude-code/install.ts"],"names":[],"mappings":"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"}
@@ -1,41 +0,0 @@
1
- /**
2
- * Claude Code path provider.
3
- *
4
- * Implements AdapterPathProvider with Claude Code-specific directory locations.
5
- *
6
- * @task T5240
7
- */
8
- import { homedir } from 'node:os';
9
- import { join } from 'node:path';
10
- /**
11
- * Path provider for Anthropic Claude Code CLI.
12
- *
13
- * Resolves Claude Code's standard directory layout:
14
- * - Config dir: ~/.claude (or CLAUDE_HOME)
15
- * - Settings: ~/.claude/settings.json (or CLAUDE_SETTINGS)
16
- * - Agents: ~/.claude/agents
17
- * - Memory DB: ~/.claude-mem/claude-mem.db (or CLAUDE_MEM_DB)
18
- *
19
- * @remarks
20
- * All paths respect environment variable overrides for CI and non-standard
21
- * installations. When env vars are unset, the canonical default paths are used.
22
- */
23
- export class ClaudeCodePathProvider {
24
- /** Get the provider's root configuration directory. */
25
- getProviderDir() {
26
- return process.env['CLAUDE_HOME'] ?? join(homedir(), '.claude');
27
- }
28
- /** Get the path to the provider's settings file, or null if unavailable. */
29
- getSettingsPath() {
30
- return process.env['CLAUDE_SETTINGS'] ?? join(this.getProviderDir(), 'settings.json');
31
- }
32
- /** Get the directory where agents are installed, or null if unsupported. */
33
- getAgentInstallDir() {
34
- return join(this.getProviderDir(), 'agents');
35
- }
36
- /** Get the path to the provider's memory database, or null if unsupported. */
37
- getMemoryDbPath() {
38
- return process.env['CLAUDE_MEM_DB'] ?? join(homedir(), '.claude-mem', 'claude-mem.db');
39
- }
40
- }
41
- //# sourceMappingURL=paths.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/providers/claude-code/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,sBAAsB;IACjC,uDAAuD;IACvD,cAAc;QACZ,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IAClE,CAAC;IAED,4EAA4E;IAC5E,eAAe;QACb,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,eAAe,CAAC,CAAC;IACxF,CAAC;IAED,4EAA4E;IAC5E,kBAAkB;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,8EAA8E;IAC9E,eAAe;QACb,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;IACzF,CAAC;CACF"}
@@ -1,198 +0,0 @@
1
- /**
2
- * Claude Code Spawn Provider
3
- *
4
- * Implements AdapterSpawnProvider for Claude Code CLI.
5
- * Migrated from src/core/spawn/adapters/claude-code-adapter.ts
6
- *
7
- * Uses the native `claude` CLI to spawn subagent processes with prompts
8
- * written to temporary files. Processes run detached and are tracked
9
- * by PID for listing and termination.
10
- *
11
- * @task T5240
12
- */
13
- import { exec, spawn as nodeSpawn } from 'node:child_process';
14
- import { unlink, writeFile } from 'node:fs/promises';
15
- import { promisify } from 'node:util';
16
- import { getErrorMessage } from '@cleocode/contracts';
17
- const execAsync = promisify(exec);
18
- /**
19
- * Spawn provider for Claude Code.
20
- *
21
- * Spawns detached Claude CLI processes for subagent execution.
22
- * Each spawn writes its prompt to a temporary file, then runs
23
- * `claude --allow-insecure --no-upgrade-check <tmpFile>` as a
24
- * detached, unref'd child process.
25
- *
26
- * @remarks
27
- * The provider uses `--allow-insecure --no-upgrade-check` flags to
28
- * ensure the Claude CLI starts without interactive prompts. Prompts are
29
- * written to temporary files under `/tmp/` and cleaned up after the
30
- * child process exits. Processes are tracked by instance ID in an
31
- * in-memory map and verified via `kill(pid, 0)` liveness checks.
32
- */
33
- export class ClaudeCodeSpawnProvider {
34
- /** Map of instance IDs to tracked process info. */
35
- processMap = new Map();
36
- /**
37
- * Check if the Claude CLI is available in PATH.
38
- *
39
- * @returns true if `claude` is found via `which`
40
- */
41
- async canSpawn() {
42
- try {
43
- await execAsync('which claude');
44
- return true;
45
- }
46
- catch {
47
- return false;
48
- }
49
- }
50
- /**
51
- * Spawn a subagent via Claude CLI.
52
- *
53
- * Writes the prompt to a temporary file and spawns a detached Claude
54
- * process. The process runs independently of the parent.
55
- *
56
- * @param context - Spawn context with taskId, prompt, and options
57
- * @returns Spawn result with instance ID and status
58
- */
59
- async spawn(context) {
60
- const instanceId = `claude-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
61
- const startTime = new Date().toISOString();
62
- let tmpFile;
63
- try {
64
- // Enrich prompt with CANT bundle, memory bridge, mental model, and NEXUS context (T555, T625).
65
- // Best-effort: if CANT context is unavailable, the raw prompt is used.
66
- let enrichedPrompt = context.prompt;
67
- try {
68
- const { buildCantEnrichedPrompt } = await import('../../cant-context.js');
69
- enrichedPrompt = await buildCantEnrichedPrompt({
70
- projectDir: context.workingDirectory ?? process.cwd(),
71
- basePrompt: context.prompt,
72
- agentName: context.options?.agentName ?? undefined,
73
- // Inject NEXUS code intelligence context for the task scope (T625).
74
- // This injects callers/callees/impact data so the agent understands
75
- // blast radius before modifying any symbol.
76
- taskId: context.taskId ?? undefined,
77
- });
78
- }
79
- catch {
80
- // CANT enrichment unavailable — use raw prompt
81
- }
82
- tmpFile = `/tmp/claude-spawn-${instanceId}.txt`;
83
- await writeFile(tmpFile, enrichedPrompt, 'utf-8');
84
- // --print: non-interactive batch mode (process prompt, output response, exit)
85
- // --dangerously-skip-permissions: allow all tool calls without human approval
86
- // --output-format json: structured output for parsing
87
- const args = [
88
- '--print',
89
- '--dangerously-skip-permissions',
90
- '--output-format',
91
- 'json',
92
- tmpFile,
93
- ];
94
- const spawnOpts = {
95
- detached: true,
96
- stdio: ['ignore', 'pipe', 'pipe'],
97
- };
98
- if (context.workingDirectory) {
99
- spawnOpts.cwd = context.workingDirectory;
100
- }
101
- const child = nodeSpawn('claude', args, spawnOpts);
102
- child.unref();
103
- if (child.pid) {
104
- this.processMap.set(instanceId, {
105
- pid: child.pid,
106
- taskId: context.taskId,
107
- startTime,
108
- });
109
- }
110
- const capturedTmpFile = tmpFile;
111
- child.on('exit', async () => {
112
- this.processMap.delete(instanceId);
113
- try {
114
- await unlink(capturedTmpFile);
115
- }
116
- catch {
117
- // Ignore cleanup errors
118
- }
119
- });
120
- return {
121
- instanceId,
122
- taskId: context.taskId,
123
- providerId: 'claude-code',
124
- status: 'running',
125
- startTime,
126
- };
127
- }
128
- catch (error) {
129
- // Log spawn failure for debugging
130
- console.error(`[ClaudeCodeSpawnProvider] Failed to spawn: ${getErrorMessage(error)}`);
131
- if (tmpFile) {
132
- try {
133
- await unlink(tmpFile);
134
- }
135
- catch {
136
- // Ignore cleanup errors
137
- }
138
- }
139
- return {
140
- instanceId,
141
- taskId: context.taskId,
142
- providerId: 'claude-code',
143
- status: 'failed',
144
- startTime,
145
- endTime: new Date().toISOString(),
146
- error: getErrorMessage(error),
147
- };
148
- }
149
- }
150
- /**
151
- * List currently running Claude subagent processes.
152
- *
153
- * Checks each tracked process via kill(pid, 0) to verify it is still alive.
154
- * Dead processes are automatically cleaned from the tracking map.
155
- *
156
- * @returns Array of spawn results for running processes
157
- */
158
- async listRunning() {
159
- const running = [];
160
- for (const [instanceId, tracked] of this.processMap.entries()) {
161
- try {
162
- process.kill(tracked.pid, 0);
163
- running.push({
164
- instanceId,
165
- taskId: tracked.taskId,
166
- providerId: 'claude-code',
167
- status: 'running',
168
- startTime: tracked.startTime,
169
- });
170
- }
171
- catch {
172
- this.processMap.delete(instanceId);
173
- }
174
- }
175
- return running;
176
- }
177
- /**
178
- * Terminate a running spawn by instance ID.
179
- *
180
- * Sends SIGTERM to the tracked process. If the process is not found
181
- * or has already exited, this is a no-op.
182
- *
183
- * @param instanceId - ID of the spawn instance to terminate
184
- */
185
- async terminate(instanceId) {
186
- const tracked = this.processMap.get(instanceId);
187
- if (!tracked)
188
- return;
189
- try {
190
- process.kill(tracked.pid, 'SIGTERM');
191
- }
192
- catch {
193
- // Process may have already exited
194
- }
195
- this.processMap.delete(instanceId);
196
- }
197
- }
198
- //# sourceMappingURL=spawn.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../src/providers/claude-code/spawn.ts"],"names":[],"mappings":"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"}