@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,223 +0,0 @@
1
- /**
2
- * Pi Hook Provider
3
- *
4
- * Maps Pi coding agent native event names to CAAMP canonical hook events.
5
- * Pi supports 11 of 16 canonical events through its extension/event system.
6
- *
7
- * Event translation uses CAAMP normalizer APIs:
8
- * - `toCanonical(nativeName, 'pi')` for runtime event name resolution
9
- * - `getSupportedEvents('pi')` to enumerate supported canonical events
10
- * - `getProviderHookProfile('pi')` for the full provider profile
11
- *
12
- * A static map derived from CAAMP hook-mappings.json piEventCatalog is
13
- * maintained as a fallback for environments where CAAMP's runtime
14
- * resolution is unavailable.
15
- *
16
- * Mappings (11/16 supported):
17
- * session_start → SessionStart
18
- * session_shutdown → SessionEnd
19
- * input → PromptSubmit
20
- * turn_end → Notification (assistant turn complete)
21
- * tool_call → PreToolUse
22
- * tool_result → PostToolUse
23
- * before_agent_start → SubagentStart
24
- * agent_end → SubagentStop
25
- * before_provider_request → PreModel
26
- * context → PreCompact (context assembly = pre-compaction proxy)
27
- *
28
- * Unsupported (5/16):
29
- * ResponseComplete, PostToolUseFailure, PermissionRequest,
30
- * PostModel, PostCompact, ConfigChange
31
- *
32
- * @task T553
33
- */
34
- /** CAAMP provider identifier for Pi. */
35
- const PROVIDER_ID = 'pi';
36
- /**
37
- * Fallback map from Pi native event names to CAAMP canonical names.
38
- *
39
- * Derived from the `piEventCatalog` block in CAAMP hook-mappings.json.
40
- * Covers all 11 supported events. ResponseComplete, PostToolUseFailure,
41
- * PermissionRequest, PostModel, PostCompact, and ConfigChange are not
42
- * supported by Pi and are absent from this map.
43
- *
44
- * Used as fallback when CAAMP runtime is unavailable, and as the
45
- * synchronous implementation of `mapProviderEvent()`.
46
- */
47
- const PI_EVENT_MAP = {
48
- // piEventCatalog: session_start → SessionStart
49
- session_start: 'SessionStart',
50
- // piEventCatalog: session_shutdown → SessionEnd
51
- session_shutdown: 'SessionEnd',
52
- // piEventCatalog: input → PromptSubmit
53
- input: 'PromptSubmit',
54
- // piEventCatalog: turn_end → Notification (assistant turn complete)
55
- turn_end: 'Notification',
56
- // piEventCatalog: tool_call → PreToolUse
57
- tool_call: 'PreToolUse',
58
- // piEventCatalog: tool_execution_start → PreToolUse (duplicate path)
59
- tool_execution_start: 'PreToolUse',
60
- // piEventCatalog: tool_result → PostToolUse
61
- tool_result: 'PostToolUse',
62
- // piEventCatalog: tool_execution_end → PostToolUse (duplicate path)
63
- tool_execution_end: 'PostToolUse',
64
- // piEventCatalog: before_agent_start → SubagentStart
65
- before_agent_start: 'SubagentStart',
66
- // piEventCatalog: agent_end → SubagentStop
67
- agent_end: 'SubagentStop',
68
- // piEventCatalog: before_provider_request → PreModel
69
- before_provider_request: 'PreModel',
70
- // piEventCatalog: context → PreCompact (context assembly is the pre-compaction proxy for Pi)
71
- context: 'PreCompact',
72
- };
73
- /**
74
- * Hook provider for Pi coding agent.
75
- *
76
- * Pi registers hooks via its TypeScript extension system. Extensions are
77
- * loaded from `~/.pi/agent/extensions/*.ts` (global) or
78
- * `<projectDir>/.pi/extensions/*.ts` (project scope).
79
- *
80
- * Event mapping is based on the `piEventCatalog` block in CAAMP
81
- * hook-mappings.json. Async accessors (`getSupportedCanonicalEvents`,
82
- * `getProviderProfile`) call CAAMP directly when available.
83
- *
84
- * Since hooks are registered through the extension system (managed by the
85
- * install provider), `registerNativeHooks` and `unregisterNativeHooks`
86
- * track registration state without performing filesystem operations.
87
- *
88
- * @remarks
89
- * Pi is CAAMP's first-class primary harness (ADR-035). Its native events
90
- * use snake_case (e.g. `session_start`, `tool_call`) unlike the PascalCase
91
- * CAAMP canonical names. The static event map covers all 11 supported events.
92
- * Async CAAMP accessors fall back to the static map when CAAMP is unavailable.
93
- *
94
- * Pi does NOT support ResponseComplete, PostToolUseFailure, PermissionRequest,
95
- * PostModel, PostCompact, or ConfigChange canonical events.
96
- *
97
- * All hook dispatch is best-effort — hooks MUST never block or crash Pi.
98
- *
99
- * @task T553
100
- */
101
- export class PiHookProvider {
102
- /** Whether hooks have been registered for the current session. */
103
- registered = false;
104
- /**
105
- * Map a Pi native event name to a CAAMP canonical hook event name.
106
- *
107
- * Looks up the native event name in the map derived from the
108
- * `piEventCatalog` block in CAAMP hook-mappings.json.
109
- * Returns null for unrecognised or unsupported events.
110
- *
111
- * @param providerEvent - Pi native event (e.g. "session_start", "tool_call")
112
- * @returns CAAMP canonical event name, or null if unmapped
113
- * @task T553
114
- */
115
- mapProviderEvent(providerEvent) {
116
- return PI_EVENT_MAP[providerEvent] ?? null;
117
- }
118
- /**
119
- * Register native hooks for a project.
120
- *
121
- * For Pi, hooks are registered via the extension system, managed by
122
- * the install provider. This method marks hooks as registered without
123
- * performing filesystem operations.
124
- *
125
- * Iterating supported events is handled at install time using
126
- * `getSupportedCanonicalEvents()` to enumerate all 11 supported hooks.
127
- *
128
- * @param _projectDir - Project directory (unused; Pi uses extension system)
129
- * @task T553
130
- */
131
- async registerNativeHooks(_projectDir) {
132
- this.registered = true;
133
- }
134
- /**
135
- * Unregister native hooks.
136
- *
137
- * For Pi, this is a no-op since hooks are managed through the extension
138
- * system. Unregistration happens via the install provider's uninstall method.
139
- *
140
- * @task T553
141
- */
142
- async unregisterNativeHooks() {
143
- this.registered = false;
144
- }
145
- /**
146
- * Check whether hooks have been registered via `registerNativeHooks`.
147
- */
148
- isRegistered() {
149
- return this.registered;
150
- }
151
- /**
152
- * Get the native→canonical event mapping for introspection and debugging.
153
- *
154
- * Returns the map derived from the `piEventCatalog` block in CAAMP
155
- * hook-mappings.json. Use `getSupportedCanonicalEvents()` to enumerate
156
- * canonical names via live CAAMP APIs.
157
- *
158
- * @returns Immutable record of native event name → canonical event name
159
- */
160
- getEventMap() {
161
- return { ...PI_EVENT_MAP };
162
- }
163
- /**
164
- * Enumerate supported canonical events via CAAMP's `getSupportedEvents()`.
165
- *
166
- * Calls `getSupportedEvents('pi')` from the CAAMP normalizer to get the
167
- * authoritative list. Pi supports 11 of 16 canonical events. Falls back
168
- * to the unique values of the static event map when CAAMP is unavailable.
169
- *
170
- * @returns Array of CAAMP canonical event names supported by Pi
171
- * @task T553
172
- */
173
- async getSupportedCanonicalEvents() {
174
- try {
175
- const { getSupportedEvents } = await import('@cleocode/caamp');
176
- return getSupportedEvents(PROVIDER_ID);
177
- }
178
- catch {
179
- return [...new Set(Object.values(PI_EVENT_MAP))];
180
- }
181
- }
182
- /**
183
- * Retrieve the full provider hook profile from CAAMP.
184
- *
185
- * Calls `getProviderHookProfile('pi')` from the CAAMP normalizer to get
186
- * the complete profile including hook system type, config path, handler
187
- * types, and all event mappings. Returns null when CAAMP is unavailable.
188
- *
189
- * @returns Provider hook profile or null if CAAMP is unavailable
190
- * @task T553
191
- */
192
- async getProviderProfile() {
193
- try {
194
- const { getProviderHookProfile } = await import('@cleocode/caamp');
195
- return getProviderHookProfile(PROVIDER_ID) ?? null;
196
- }
197
- catch {
198
- return null;
199
- }
200
- }
201
- /**
202
- * Translate a CAAMP canonical event to its Pi native name via CAAMP.
203
- *
204
- * Calls `toNative(canonical, 'pi')` from the CAAMP normalizer.
205
- * Returns null for unsupported events or when CAAMP is unavailable.
206
- *
207
- * @param canonical - CAAMP canonical event name (e.g. "PreToolUse")
208
- * @returns Pi native event name or null
209
- * @task T553
210
- */
211
- async toNativeEvent(canonical) {
212
- try {
213
- const { toNative } = await import('@cleocode/caamp');
214
- return toNative(canonical, PROVIDER_ID);
215
- }
216
- catch {
217
- // Invert the static map as fallback — return the first match
218
- const entry = Object.entries(PI_EVENT_MAP).find(([, v]) => v === canonical);
219
- return entry?.[0] ?? null;
220
- }
221
- }
222
- }
223
- //# sourceMappingURL=hooks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/providers/pi/hooks.ts"],"names":[],"mappings":"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"}
@@ -1,38 +0,0 @@
1
- /**
2
- * @packageDocumentation
3
- *
4
- * CLEO provider adapter for Pi coding agent (https://github.com/badlogic/pi-mono).
5
- * Pi is CAAMP's first-class primary harness with 11/16 canonical hook events.
6
- * Default export is the adapter class for dynamic loading by AdapterManager.
7
- *
8
- * @task T553
9
- */
10
- import { PiAdapter } from './adapter.js';
11
- export { PiAdapter } from './adapter.js';
12
- export { PiHookProvider } from './hooks.js';
13
- export { PiInstallProvider } from './install.js';
14
- export { PiSpawnProvider } from './spawn.js';
15
- export default PiAdapter;
16
- /**
17
- * Factory function for creating Pi adapter instances.
18
- * Used by AdapterManager's dynamic import fallback.
19
- *
20
- * @remarks
21
- * This is the primary entry point for dynamic adapter loading.
22
- * AdapterManager calls this function when it resolves the pi provider
23
- * via its import-based discovery mechanism.
24
- *
25
- * @returns A new {@link PiAdapter} instance ready for initialization
26
- *
27
- * @example
28
- * ```typescript
29
- * import { createAdapter } from '@cleocode/adapters/providers/pi';
30
- *
31
- * const adapter = createAdapter();
32
- * await adapter.initialize('/path/to/project');
33
- * ```
34
- */
35
- export function createAdapter() {
36
- return new PiAdapter();
37
- }
38
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/pi/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAe,SAAS,CAAC;AAEzB;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,SAAS,EAAE,CAAC;AACzB,CAAC"}
@@ -1,183 +0,0 @@
1
- /**
2
- * Pi Install Provider
3
- *
4
- * Handles CLEO installation into Pi coding agent environments:
5
- * - Ensures AGENTS.md has CLEO @-references (project and global scope)
6
- * - Manages Pi settings.json to register CLEO extension path
7
- *
8
- * Pi uses AGENTS.md (not CLAUDE.md) as its instruction file. The global
9
- * instruction file lives at `~/.pi/agent/AGENTS.md`; the project-level
10
- * file lives at `<projectDir>/AGENTS.md`.
11
- *
12
- * Detection: Pi is detected by the `PI_CODING_AGENT_DIR` or `PI_HOME`
13
- * environment variables, or by presence of `~/.pi/agent/` directory.
14
- *
15
- * @task T553
16
- */
17
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
18
- import { homedir } from 'node:os';
19
- import { join } from 'node:path';
20
- import { getCleoTemplatesTildePath } from '../shared/paths.js';
21
- /**
22
- * Lines that should appear in AGENTS.md to reference CLEO.
23
- * The CLEO-INJECTION.md path is resolved dynamically to support non-default
24
- * XDG / OS installation locations (T916).
25
- */
26
- const INSTRUCTION_REFERENCES = [
27
- `@${getCleoTemplatesTildePath()}/CLEO-INJECTION.md`,
28
- '@.cleo/memory-bridge.md',
29
- ];
30
- /**
31
- * Resolve the Pi global state root directory.
32
- *
33
- * Honours `PI_CODING_AGENT_DIR` env var when set (with `~` expansion),
34
- * then `PI_HOME`, then falls back to `~/.pi/agent`.
35
- */
36
- function getPiAgentDir() {
37
- const env = process.env['PI_CODING_AGENT_DIR'];
38
- if (env !== undefined && env.length > 0) {
39
- if (env === '~')
40
- return homedir();
41
- if (env.startsWith('~/'))
42
- return join(homedir(), env.slice(2));
43
- return env;
44
- }
45
- const piHome = process.env['PI_HOME'];
46
- if (piHome !== undefined && piHome.length > 0) {
47
- return join(piHome, 'agent');
48
- }
49
- return join(homedir(), '.pi', 'agent');
50
- }
51
- /**
52
- * Install provider for Pi coding agent.
53
- *
54
- * Manages CLEO's integration with Pi by:
55
- * 1. Ensuring project AGENTS.md contains @-references to CLEO instruction files
56
- * 2. Ensuring global AGENTS.md (~/.pi/agent/AGENTS.md) contains @-references
57
- *
58
- * @remarks
59
- * Installation is idempotent — running install multiple times on the same
60
- * project produces the same result. Pi's AGENTS.md is auto-discovered from
61
- * the working directory upwards, so project-level injection is the primary
62
- * mechanism. Global injection ensures fresh sessions always load CLEO context.
63
- */
64
- export class PiInstallProvider {
65
- /**
66
- * Install CLEO into a Pi coding agent project.
67
- *
68
- * @param options - Installation options including project directory
69
- * @returns Result describing what was installed
70
- */
71
- async install(options) {
72
- const { projectDir } = options;
73
- const installedAt = new Date().toISOString();
74
- const details = {};
75
- // Step 1: Ensure project AGENTS.md has @-references
76
- const projectUpdated = this.updateInstructionFile(projectDir, 'AGENTS.md');
77
- if (projectUpdated) {
78
- details.instructionFile = join(projectDir, 'AGENTS.md');
79
- }
80
- // Step 2: Ensure global AGENTS.md has @-references (best-effort)
81
- let globalUpdated = false;
82
- try {
83
- const globalDir = getPiAgentDir();
84
- globalUpdated = this.updateInstructionFile(globalDir, 'AGENTS.md');
85
- if (globalUpdated) {
86
- details.globalInstructionFile = join(globalDir, 'AGENTS.md');
87
- }
88
- }
89
- catch {
90
- // Global install is best-effort — never block project install
91
- }
92
- const instructionFileUpdated = projectUpdated || globalUpdated;
93
- return {
94
- success: true,
95
- installedAt,
96
- instructionFileUpdated,
97
- details,
98
- };
99
- }
100
- /**
101
- * Uninstall CLEO from the current Pi project.
102
- *
103
- * Does not remove AGENTS.md references (they are harmless if CLEO is not present).
104
- */
105
- async uninstall() { }
106
- /**
107
- * Check whether CLEO is installed in the current environment.
108
- *
109
- * Checks for CLEO references in the project AGENTS.md.
110
- */
111
- async isInstalled() {
112
- const agentsMdPath = join(process.cwd(), 'AGENTS.md');
113
- if (existsSync(agentsMdPath)) {
114
- try {
115
- const content = readFileSync(agentsMdPath, 'utf-8');
116
- if (INSTRUCTION_REFERENCES.some((ref) => content.includes(ref))) {
117
- return true;
118
- }
119
- }
120
- catch {
121
- // Fall through
122
- }
123
- }
124
- // Also check global AGENTS.md
125
- try {
126
- const globalPath = join(getPiAgentDir(), 'AGENTS.md');
127
- if (existsSync(globalPath)) {
128
- const content = readFileSync(globalPath, 'utf-8');
129
- if (INSTRUCTION_REFERENCES.some((ref) => content.includes(ref))) {
130
- return true;
131
- }
132
- }
133
- }
134
- catch {
135
- // Fall through
136
- }
137
- return false;
138
- }
139
- /**
140
- * Ensure AGENTS.md contains @-references to CLEO instruction files.
141
- *
142
- * Creates AGENTS.md if it does not exist. Appends any missing references.
143
- *
144
- * @param projectDir - Project root directory
145
- */
146
- async ensureInstructionReferences(projectDir) {
147
- this.updateInstructionFile(projectDir, 'AGENTS.md');
148
- }
149
- /**
150
- * Update an instruction file with CLEO @-references.
151
- *
152
- * @param dir - Directory containing the instruction file
153
- * @param filename - Name of the instruction file (e.g. "AGENTS.md")
154
- * @returns true if the file was created or modified
155
- */
156
- updateInstructionFile(dir, filename) {
157
- const filePath = join(dir, filename);
158
- let content = '';
159
- let existed = false;
160
- if (existsSync(filePath)) {
161
- content = readFileSync(filePath, 'utf-8');
162
- existed = true;
163
- }
164
- const missingRefs = INSTRUCTION_REFERENCES.filter((ref) => !content.includes(ref));
165
- if (missingRefs.length === 0) {
166
- return false;
167
- }
168
- const refsBlock = missingRefs.join('\n');
169
- if (existed) {
170
- // Append missing references
171
- const separator = content.endsWith('\n') ? '' : '\n';
172
- content = content + separator + refsBlock + '\n';
173
- }
174
- else {
175
- // Create new file with references — ensure parent dir exists
176
- mkdirSync(dir, { recursive: true });
177
- content = refsBlock + '\n';
178
- }
179
- writeFileSync(filePath, content, 'utf-8');
180
- return true;
181
- }
182
- }
183
- //# sourceMappingURL=install.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/providers/pi/install.ts"],"names":[],"mappings":"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"}
@@ -1,187 +0,0 @@
1
- /**
2
- * Pi Spawn Provider
3
- *
4
- * Implements AdapterSpawnProvider for Pi coding agent CLI.
5
- *
6
- * Uses the `pi` CLI (or the path from `PI_CLI_PATH` env var) to spawn
7
- * subagent processes with prompts written to temporary files. Processes
8
- * run detached and are tracked by PID for listing and termination.
9
- *
10
- * Pi detection: `PI_CLI_PATH` env var or `which pi`.
11
- *
12
- * @task T553
13
- */
14
- import { exec, spawn as nodeSpawn } from 'node:child_process';
15
- import { unlink, writeFile } from 'node:fs/promises';
16
- import { promisify } from 'node:util';
17
- import { getErrorMessage } from '@cleocode/contracts';
18
- const execAsync = promisify(exec);
19
- /**
20
- * Resolve the Pi CLI executable path.
21
- *
22
- * Honours `PI_CLI_PATH` env var when set, otherwise uses `pi` (expects
23
- * the binary on PATH).
24
- */
25
- function getPiCliPath() {
26
- return process.env['PI_CLI_PATH'] ?? 'pi';
27
- }
28
- /**
29
- * Spawn provider for Pi coding agent.
30
- *
31
- * Spawns detached Pi CLI processes for subagent execution. Each spawn
32
- * writes its prompt to a temporary file, then runs the Pi CLI with the
33
- * prompt file as the primary argument as a detached, unref'd child process.
34
- *
35
- * @remarks
36
- * Prompts are written to temporary files under `/tmp/` and cleaned up
37
- * after the child process exits. Processes are tracked by instance ID in
38
- * an in-memory map and verified via `kill(pid, 0)` liveness checks.
39
- * All failures are best-effort and non-blocking.
40
- */
41
- export class PiSpawnProvider {
42
- /** Map of instance IDs to tracked process info. */
43
- processMap = new Map();
44
- /**
45
- * Check if the Pi CLI is available.
46
- *
47
- * Checks `PI_CLI_PATH` env var first, then tries `which pi`.
48
- *
49
- * @returns true if the Pi CLI is accessible
50
- */
51
- async canSpawn() {
52
- const cliPath = getPiCliPath();
53
- try {
54
- if (cliPath !== 'pi') {
55
- // Custom path — check if it exists
56
- const { stdout } = await execAsync(`test -x "${cliPath}" && echo ok`);
57
- return stdout.trim() === 'ok';
58
- }
59
- await execAsync('which pi');
60
- return true;
61
- }
62
- catch {
63
- return false;
64
- }
65
- }
66
- /**
67
- * Spawn a subagent via Pi CLI.
68
- *
69
- * Writes the prompt to a temporary file and spawns a detached Pi
70
- * process. The process runs independently of the parent.
71
- *
72
- * @param context - Spawn context with taskId, prompt, and options
73
- * @returns Spawn result with instance ID and status
74
- */
75
- async spawn(context) {
76
- const instanceId = `pi-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
77
- const startTime = new Date().toISOString();
78
- let tmpFile;
79
- try {
80
- tmpFile = `/tmp/pi-spawn-${instanceId}.txt`;
81
- await writeFile(tmpFile, context.prompt, 'utf-8');
82
- const cliPath = getPiCliPath();
83
- const args = [tmpFile];
84
- const spawnOpts = {
85
- detached: true,
86
- stdio: 'ignore',
87
- };
88
- if (context.workingDirectory) {
89
- spawnOpts.cwd = context.workingDirectory;
90
- }
91
- const child = nodeSpawn(cliPath, args, spawnOpts);
92
- child.unref();
93
- if (child.pid) {
94
- this.processMap.set(instanceId, {
95
- pid: child.pid,
96
- taskId: context.taskId,
97
- startTime,
98
- });
99
- }
100
- const capturedTmpFile = tmpFile;
101
- child.on('exit', async () => {
102
- this.processMap.delete(instanceId);
103
- try {
104
- await unlink(capturedTmpFile);
105
- }
106
- catch {
107
- // Ignore cleanup errors
108
- }
109
- });
110
- return {
111
- instanceId,
112
- taskId: context.taskId,
113
- providerId: 'pi',
114
- status: 'running',
115
- startTime,
116
- };
117
- }
118
- catch (error) {
119
- console.error(`[PiSpawnProvider] Failed to spawn: ${getErrorMessage(error)}`);
120
- if (tmpFile) {
121
- try {
122
- await unlink(tmpFile);
123
- }
124
- catch {
125
- // Ignore cleanup errors
126
- }
127
- }
128
- return {
129
- instanceId,
130
- taskId: context.taskId,
131
- providerId: 'pi',
132
- status: 'failed',
133
- startTime,
134
- endTime: new Date().toISOString(),
135
- error: getErrorMessage(error),
136
- };
137
- }
138
- }
139
- /**
140
- * List currently running Pi subagent processes.
141
- *
142
- * Checks each tracked process via kill(pid, 0) to verify it is still alive.
143
- * Dead processes are automatically cleaned from the tracking map.
144
- *
145
- * @returns Array of spawn results for running processes
146
- */
147
- async listRunning() {
148
- const running = [];
149
- for (const [instanceId, tracked] of this.processMap.entries()) {
150
- try {
151
- process.kill(tracked.pid, 0);
152
- running.push({
153
- instanceId,
154
- taskId: tracked.taskId,
155
- providerId: 'pi',
156
- status: 'running',
157
- startTime: tracked.startTime,
158
- });
159
- }
160
- catch {
161
- this.processMap.delete(instanceId);
162
- }
163
- }
164
- return running;
165
- }
166
- /**
167
- * Terminate a running spawn by instance ID.
168
- *
169
- * Sends SIGTERM to the tracked process. If the process is not found
170
- * or has already exited, this is a no-op.
171
- *
172
- * @param instanceId - ID of the spawn instance to terminate
173
- */
174
- async terminate(instanceId) {
175
- const tracked = this.processMap.get(instanceId);
176
- if (!tracked)
177
- return;
178
- try {
179
- process.kill(tracked.pid, 'SIGTERM');
180
- }
181
- catch {
182
- // Process may have already exited
183
- }
184
- this.processMap.delete(instanceId);
185
- }
186
- }
187
- //# sourceMappingURL=spawn.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../src/providers/pi/spawn.ts"],"names":[],"mappings":"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"}