@cleocode/adapters 2026.4.0 → 2026.4.3
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/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +724 -630
- package/dist/index.js.map +3 -3
- package/dist/providers/claude-code/adapter.d.ts +21 -1
- package/dist/providers/claude-code/adapter.d.ts.map +1 -1
- package/dist/providers/claude-code/context-monitor.d.ts +11 -0
- package/dist/providers/claude-code/context-monitor.d.ts.map +1 -1
- package/dist/providers/claude-code/hooks.d.ts +7 -0
- package/dist/providers/claude-code/hooks.d.ts.map +1 -1
- package/dist/providers/claude-code/index.d.ts +16 -1
- package/dist/providers/claude-code/index.d.ts.map +1 -1
- package/dist/providers/claude-code/install.d.ts +10 -18
- package/dist/providers/claude-code/install.d.ts.map +1 -1
- package/dist/providers/claude-code/paths.d.ts +8 -0
- package/dist/providers/claude-code/paths.d.ts.map +1 -1
- package/dist/providers/claude-code/spawn.d.ts +7 -0
- package/dist/providers/claude-code/spawn.d.ts.map +1 -1
- package/dist/providers/claude-code/statusline.d.ts +44 -0
- package/dist/providers/claude-code/statusline.d.ts.map +1 -1
- package/dist/providers/claude-code/task-sync.d.ts +8 -0
- package/dist/providers/claude-code/task-sync.d.ts.map +1 -1
- package/dist/providers/claude-code/transport.d.ts +11 -0
- package/dist/providers/claude-code/transport.d.ts.map +1 -1
- package/dist/providers/codex/adapter.d.ts +14 -1
- package/dist/providers/codex/adapter.d.ts.map +1 -1
- package/dist/providers/codex/hooks.d.ts +6 -0
- package/dist/providers/codex/hooks.d.ts.map +1 -1
- package/dist/providers/codex/index.d.ts +16 -1
- package/dist/providers/codex/index.d.ts.map +1 -1
- package/dist/providers/codex/install.d.ts +8 -17
- package/dist/providers/codex/install.d.ts.map +1 -1
- package/dist/providers/cursor/adapter.d.ts +15 -1
- package/dist/providers/cursor/adapter.d.ts.map +1 -1
- package/dist/providers/cursor/hooks.d.ts +7 -0
- package/dist/providers/cursor/hooks.d.ts.map +1 -1
- package/dist/providers/cursor/index.d.ts +16 -1
- package/dist/providers/cursor/index.d.ts.map +1 -1
- package/dist/providers/cursor/install.d.ts +10 -17
- package/dist/providers/cursor/install.d.ts.map +1 -1
- package/dist/providers/gemini-cli/adapter.d.ts +15 -1
- package/dist/providers/gemini-cli/adapter.d.ts.map +1 -1
- package/dist/providers/gemini-cli/hooks.d.ts +7 -0
- package/dist/providers/gemini-cli/hooks.d.ts.map +1 -1
- package/dist/providers/gemini-cli/index.d.ts +16 -1
- package/dist/providers/gemini-cli/index.d.ts.map +1 -1
- package/dist/providers/gemini-cli/install.d.ts +8 -17
- package/dist/providers/gemini-cli/install.d.ts.map +1 -1
- package/dist/providers/kimi/adapter.d.ts +15 -2
- package/dist/providers/kimi/adapter.d.ts.map +1 -1
- package/dist/providers/kimi/hooks.d.ts +6 -0
- package/dist/providers/kimi/hooks.d.ts.map +1 -1
- package/dist/providers/kimi/index.d.ts +16 -1
- package/dist/providers/kimi/index.d.ts.map +1 -1
- package/dist/providers/kimi/install.d.ts +7 -22
- package/dist/providers/kimi/install.d.ts.map +1 -1
- package/dist/providers/opencode/adapter.d.ts +17 -1
- package/dist/providers/opencode/adapter.d.ts.map +1 -1
- package/dist/providers/opencode/hooks.d.ts +9 -0
- package/dist/providers/opencode/hooks.d.ts.map +1 -1
- package/dist/providers/opencode/index.d.ts +16 -1
- package/dist/providers/opencode/index.d.ts.map +1 -1
- package/dist/providers/opencode/install.d.ts +8 -17
- package/dist/providers/opencode/install.d.ts.map +1 -1
- package/dist/providers/opencode/spawn.d.ts +23 -1
- package/dist/providers/opencode/spawn.d.ts.map +1 -1
- package/dist/providers/shared/transcript-reader.d.ts +15 -0
- package/dist/providers/shared/transcript-reader.d.ts.map +1 -1
- package/dist/registry.d.ts +54 -2
- package/dist/registry.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/claude-code-adapter.test.js +21 -30
- package/src/__tests__/claude-code-adapter.test.js.map +1 -1
- package/src/__tests__/claude-code-adapter.test.ts +21 -32
- package/src/__tests__/cursor-adapter.test.js +25 -29
- package/src/__tests__/cursor-adapter.test.js.map +1 -1
- package/src/__tests__/cursor-adapter.test.ts +26 -33
- package/src/__tests__/opencode-adapter.test.js +47 -46
- package/src/__tests__/opencode-adapter.test.js.map +1 -1
- package/src/__tests__/opencode-adapter.test.ts +51 -49
- package/src/index.ts +9 -1
- package/src/providers/claude-code/__tests__/adapter.test.js +50 -23
- package/src/providers/claude-code/__tests__/adapter.test.js.map +1 -1
- package/src/providers/claude-code/__tests__/adapter.test.ts +52 -23
- package/src/providers/claude-code/adapter.ts +22 -2
- package/src/providers/claude-code/context-monitor.ts +11 -0
- package/src/providers/claude-code/hooks.ts +7 -0
- package/src/providers/claude-code/index.ts +16 -1
- package/src/providers/claude-code/install.ts +15 -96
- package/src/providers/claude-code/manifest.json +1 -1
- package/src/providers/claude-code/paths.ts +8 -0
- package/src/providers/claude-code/spawn.ts +7 -0
- package/src/providers/claude-code/statusline.ts +44 -0
- package/src/providers/claude-code/task-sync.ts +8 -0
- package/src/providers/claude-code/transport.ts +11 -0
- package/src/providers/codex/adapter.ts +15 -2
- package/src/providers/codex/hooks.ts +6 -0
- package/src/providers/codex/index.ts +16 -1
- package/src/providers/codex/install.ts +17 -81
- package/src/providers/codex/manifest.json +1 -1
- package/src/providers/cursor/__tests__/adapter.test.js +37 -12
- package/src/providers/cursor/__tests__/adapter.test.js.map +1 -1
- package/src/providers/cursor/__tests__/adapter.test.ts +43 -12
- package/src/providers/cursor/adapter.ts +16 -2
- package/src/providers/cursor/hooks.ts +7 -0
- package/src/providers/cursor/index.ts +16 -1
- package/src/providers/cursor/install.ts +23 -88
- package/src/providers/cursor/manifest.json +1 -1
- package/src/providers/gemini-cli/adapter.ts +16 -2
- package/src/providers/gemini-cli/hooks.ts +7 -0
- package/src/providers/gemini-cli/index.ts +16 -1
- package/src/providers/gemini-cli/install.ts +17 -81
- package/src/providers/gemini-cli/manifest.json +1 -1
- package/src/providers/kimi/adapter.ts +16 -3
- package/src/providers/kimi/hooks.ts +6 -0
- package/src/providers/kimi/index.ts +16 -1
- package/src/providers/kimi/install.ts +16 -86
- package/src/providers/kimi/manifest.json +1 -1
- package/src/providers/opencode/__tests__/adapter.test.js +48 -35
- package/src/providers/opencode/__tests__/adapter.test.js.map +1 -1
- package/src/providers/opencode/__tests__/adapter.test.ts +49 -34
- package/src/providers/opencode/adapter.ts +18 -2
- package/src/providers/opencode/hooks.ts +9 -0
- package/src/providers/opencode/index.ts +16 -1
- package/src/providers/opencode/install.ts +17 -90
- package/src/providers/opencode/manifest.json +1 -1
- package/src/providers/opencode/spawn.ts +23 -1
- package/src/providers/shared/transcript-reader.ts +15 -0
- package/src/registry.ts +54 -2
- package/dist/providers/claude-code/adapter.js +0 -165
- package/dist/providers/claude-code/adapter.js.map +0 -1
- package/dist/providers/claude-code/context-monitor.js +0 -148
- package/dist/providers/claude-code/context-monitor.js.map +0 -1
- package/dist/providers/claude-code/hooks.js +0 -279
- package/dist/providers/claude-code/hooks.js.map +0 -1
- package/dist/providers/claude-code/index.js +0 -26
- package/dist/providers/claude-code/index.js.map +0 -1
- package/dist/providers/claude-code/install.js +0 -234
- package/dist/providers/claude-code/install.js.map +0 -1
- package/dist/providers/claude-code/paths.js +0 -33
- package/dist/providers/claude-code/paths.js.map +0 -1
- package/dist/providers/claude-code/spawn.js +0 -164
- package/dist/providers/claude-code/spawn.js.map +0 -1
- package/dist/providers/claude-code/statusline.js +0 -86
- package/dist/providers/claude-code/statusline.js.map +0 -1
- package/dist/providers/claude-code/task-sync.js +0 -111
- package/dist/providers/claude-code/task-sync.js.map +0 -1
- package/dist/providers/claude-code/transport.js +0 -18
- package/dist/providers/claude-code/transport.js.map +0 -1
- package/dist/providers/codex/adapter.js +0 -134
- package/dist/providers/codex/adapter.js.map +0 -1
- package/dist/providers/codex/hooks.js +0 -107
- package/dist/providers/codex/hooks.js.map +0 -1
- package/dist/providers/codex/index.js +0 -24
- package/dist/providers/codex/index.js.map +0 -1
- package/dist/providers/codex/install.js +0 -183
- package/dist/providers/codex/install.js.map +0 -1
- package/dist/providers/cursor/adapter.js +0 -138
- package/dist/providers/cursor/adapter.js.map +0 -1
- package/dist/providers/cursor/hooks.js +0 -201
- package/dist/providers/cursor/hooks.js.map +0 -1
- package/dist/providers/cursor/index.js +0 -21
- package/dist/providers/cursor/index.js.map +0 -1
- package/dist/providers/cursor/install.js +0 -238
- package/dist/providers/cursor/install.js.map +0 -1
- package/dist/providers/cursor/spawn.js +0 -59
- package/dist/providers/cursor/spawn.js.map +0 -1
- package/dist/providers/gemini-cli/adapter.js +0 -145
- package/dist/providers/gemini-cli/adapter.js.map +0 -1
- package/dist/providers/gemini-cli/hooks.js +0 -121
- package/dist/providers/gemini-cli/hooks.js.map +0 -1
- package/dist/providers/gemini-cli/index.js +0 -24
- package/dist/providers/gemini-cli/index.js.map +0 -1
- package/dist/providers/gemini-cli/install.js +0 -183
- package/dist/providers/gemini-cli/install.js.map +0 -1
- package/dist/providers/kimi/adapter.js +0 -133
- package/dist/providers/kimi/adapter.js.map +0 -1
- package/dist/providers/kimi/hooks.js +0 -73
- package/dist/providers/kimi/hooks.js.map +0 -1
- package/dist/providers/kimi/index.js +0 -24
- package/dist/providers/kimi/index.js.map +0 -1
- package/dist/providers/kimi/install.js +0 -189
- package/dist/providers/kimi/install.js.map +0 -1
- package/dist/providers/opencode/adapter.js +0 -151
- package/dist/providers/opencode/adapter.js.map +0 -1
- package/dist/providers/opencode/hooks.js +0 -197
- package/dist/providers/opencode/hooks.js.map +0 -1
- package/dist/providers/opencode/index.js +0 -22
- package/dist/providers/opencode/index.js.map +0 -1
- package/dist/providers/opencode/install.js +0 -180
- package/dist/providers/opencode/install.js.map +0 -1
- package/dist/providers/opencode/spawn.js +0 -219
- package/dist/providers/opencode/spawn.js.map +0 -1
- package/dist/providers/shared/transcript-reader.js +0 -109
- package/dist/providers/shared/transcript-reader.js.map +0 -1
- package/dist/registry.js +0 -55
- package/dist/registry.js.map +0 -1
- package/src/__tests__/claude-code-adapter.test.d.ts +0 -10
- package/src/__tests__/cursor-adapter.test.d.ts +0 -10
- package/src/__tests__/opencode-adapter.test.d.ts +0 -10
- package/src/index.d.ts +0 -35
- package/src/index.d.ts.map +0 -1
- package/src/index.js +0 -13
- package/src/index.js.map +0 -1
- package/src/providers/claude-code/__tests__/adapter.test.d.ts +0 -7
- package/src/providers/claude-code/adapter.d.ts +0 -79
- package/src/providers/claude-code/adapter.d.ts.map +0 -1
- package/src/providers/claude-code/adapter.js +0 -154
- package/src/providers/claude-code/adapter.js.map +0 -1
- package/src/providers/claude-code/context-monitor.d.ts +0 -24
- package/src/providers/claude-code/context-monitor.d.ts.map +0 -1
- package/src/providers/claude-code/context-monitor.js +0 -148
- package/src/providers/claude-code/context-monitor.js.map +0 -1
- package/src/providers/claude-code/hooks.d.ts +0 -59
- package/src/providers/claude-code/hooks.d.ts.map +0 -1
- package/src/providers/claude-code/hooks.js +0 -77
- package/src/providers/claude-code/hooks.js.map +0 -1
- package/src/providers/claude-code/index.d.ts +0 -28
- package/src/providers/claude-code/index.d.ts.map +0 -1
- package/src/providers/claude-code/index.js +0 -26
- package/src/providers/claude-code/index.js.map +0 -1
- package/src/providers/claude-code/install.d.ts +0 -75
- package/src/providers/claude-code/install.d.ts.map +0 -1
- package/src/providers/claude-code/install.js +0 -234
- package/src/providers/claude-code/install.js.map +0 -1
- package/src/providers/claude-code/paths.d.ts +0 -24
- package/src/providers/claude-code/paths.d.ts.map +0 -1
- package/src/providers/claude-code/paths.js +0 -33
- package/src/providers/claude-code/paths.js.map +0 -1
- package/src/providers/claude-code/spawn.d.ts +0 -60
- package/src/providers/claude-code/spawn.d.ts.map +0 -1
- package/src/providers/claude-code/spawn.js +0 -164
- package/src/providers/claude-code/spawn.js.map +0 -1
- package/src/providers/claude-code/statusline.d.ts +0 -23
- package/src/providers/claude-code/statusline.d.ts.map +0 -1
- package/src/providers/claude-code/statusline.js +0 -86
- package/src/providers/claude-code/statusline.js.map +0 -1
- package/src/providers/claude-code/task-sync.js +0 -122
- package/src/providers/claude-code/task-sync.js.map +0 -1
- package/src/providers/claude-code/transport.d.ts +0 -14
- package/src/providers/claude-code/transport.d.ts.map +0 -1
- package/src/providers/claude-code/transport.js +0 -18
- package/src/providers/claude-code/transport.js.map +0 -1
- package/src/providers/cursor/__tests__/adapter.test.d.ts +0 -7
- package/src/providers/cursor/adapter.d.ts +0 -66
- package/src/providers/cursor/adapter.d.ts.map +0 -1
- package/src/providers/cursor/adapter.js +0 -124
- package/src/providers/cursor/adapter.js.map +0 -1
- package/src/providers/cursor/hooks.d.ts +0 -48
- package/src/providers/cursor/hooks.d.ts.map +0 -1
- package/src/providers/cursor/hooks.js +0 -55
- package/src/providers/cursor/hooks.js.map +0 -1
- package/src/providers/cursor/index.d.ts +0 -19
- package/src/providers/cursor/index.d.ts.map +0 -1
- package/src/providers/cursor/index.js +0 -21
- package/src/providers/cursor/index.js.map +0 -1
- package/src/providers/cursor/install.d.ts +0 -94
- package/src/providers/cursor/install.d.ts.map +0 -1
- package/src/providers/cursor/install.js +0 -238
- package/src/providers/cursor/install.js.map +0 -1
- package/src/providers/cursor/spawn.d.ts +0 -50
- package/src/providers/cursor/spawn.d.ts.map +0 -1
- package/src/providers/cursor/spawn.js +0 -59
- package/src/providers/cursor/spawn.js.map +0 -1
- package/src/providers/opencode/__tests__/adapter.test.d.ts +0 -7
- package/src/providers/opencode/adapter.d.ts +0 -71
- package/src/providers/opencode/adapter.d.ts.map +0 -1
- package/src/providers/opencode/adapter.js +0 -144
- package/src/providers/opencode/adapter.js.map +0 -1
- package/src/providers/opencode/hooks.d.ts +0 -66
- package/src/providers/opencode/hooks.d.ts.map +0 -1
- package/src/providers/opencode/hooks.js +0 -89
- package/src/providers/opencode/hooks.js.map +0 -1
- package/src/providers/opencode/index.d.ts +0 -20
- package/src/providers/opencode/index.d.ts.map +0 -1
- package/src/providers/opencode/index.js +0 -22
- package/src/providers/opencode/index.js.map +0 -1
- package/src/providers/opencode/install.d.ts +0 -65
- package/src/providers/opencode/install.d.ts.map +0 -1
- package/src/providers/opencode/install.js +0 -180
- package/src/providers/opencode/install.js.map +0 -1
- package/src/providers/opencode/spawn.d.ts +0 -75
- package/src/providers/opencode/spawn.d.ts.map +0 -1
- package/src/providers/opencode/spawn.js +0 -219
- package/src/providers/opencode/spawn.js.map +0 -1
- package/src/registry.d.ts +0 -36
- package/src/registry.d.ts.map +0 -1
- package/src/registry.js +0 -55
- package/src/registry.js.map +0 -1
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Cursor Install Provider
|
|
3
3
|
*
|
|
4
4
|
* Handles CLEO installation into Cursor environments:
|
|
5
|
-
* - Registers CLEO MCP server in .cursor/mcp.json
|
|
6
5
|
* - Ensures .cursorrules has CLEO @-references (legacy format)
|
|
7
6
|
* - Creates .cursor/rules/cleo.mdc with CLEO references (modern format)
|
|
8
7
|
*
|
|
@@ -22,54 +21,43 @@ import type { AdapterInstallProvider, InstallOptions, InstallResult } from '@cle
|
|
|
22
21
|
/** Lines that should appear in instruction files to reference CLEO. */
|
|
23
22
|
const INSTRUCTION_REFERENCES = ['@~/.cleo/templates/CLEO-INJECTION.md', '@.cleo/memory-bridge.md'];
|
|
24
23
|
|
|
25
|
-
/** MCP server registration key used in Cursor config. */
|
|
26
|
-
const MCP_SERVER_KEY = 'cleo';
|
|
27
|
-
|
|
28
24
|
/**
|
|
29
25
|
* Install provider for Cursor.
|
|
30
26
|
*
|
|
31
27
|
* Manages CLEO's integration with Cursor by:
|
|
32
|
-
* 1.
|
|
33
|
-
* 2. Creating
|
|
34
|
-
*
|
|
28
|
+
* 1. Creating/updating .cursorrules with @-references (legacy)
|
|
29
|
+
* 2. Creating .cursor/rules/cleo.mdc with @-references (modern)
|
|
30
|
+
*
|
|
31
|
+
* @remarks
|
|
32
|
+
* Installation is idempotent and writes to both instruction file formats
|
|
33
|
+
* for maximum compatibility. The legacy `.cursorrules` file is only modified
|
|
34
|
+
* if it already exists (never created from scratch). The modern MDC file
|
|
35
|
+
* is always created or updated to ensure Cursor's rule engine picks it up.
|
|
35
36
|
*/
|
|
36
37
|
export class CursorInstallProvider implements AdapterInstallProvider {
|
|
37
|
-
private installedProjectDir: string | null = null;
|
|
38
|
-
|
|
39
38
|
/**
|
|
40
39
|
* Install CLEO into a Cursor project.
|
|
41
40
|
*
|
|
42
|
-
* @param options - Installation options including project directory
|
|
41
|
+
* @param options - Installation options including project directory
|
|
43
42
|
* @returns Result describing what was installed
|
|
44
43
|
*/
|
|
45
44
|
async install(options: InstallOptions): Promise<InstallResult> {
|
|
46
|
-
const { projectDir
|
|
45
|
+
const { projectDir } = options;
|
|
47
46
|
const installedAt = new Date().toISOString();
|
|
48
47
|
let instructionFileUpdated = false;
|
|
49
|
-
let mcpRegistered = false;
|
|
50
48
|
const details: Record<string, unknown> = {};
|
|
51
49
|
|
|
52
|
-
// Step 1:
|
|
53
|
-
if (mcpServerPath) {
|
|
54
|
-
mcpRegistered = this.registerMcpServer(projectDir, mcpServerPath);
|
|
55
|
-
if (mcpRegistered) {
|
|
56
|
-
details.mcpConfigPath = join(projectDir, '.cursor', 'mcp.json');
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Step 2: Ensure instruction files have @-references
|
|
50
|
+
// Step 1: Ensure instruction files have @-references
|
|
61
51
|
instructionFileUpdated = this.updateInstructionFiles(projectDir);
|
|
62
52
|
if (instructionFileUpdated) {
|
|
63
53
|
details.instructionFiles = this.getUpdatedFileList(projectDir);
|
|
64
54
|
}
|
|
65
55
|
|
|
66
|
-
this.installedProjectDir = projectDir;
|
|
67
|
-
|
|
68
56
|
return {
|
|
69
57
|
success: true,
|
|
70
58
|
installedAt,
|
|
71
59
|
instructionFileUpdated,
|
|
72
|
-
mcpRegistered,
|
|
60
|
+
mcpRegistered: false,
|
|
73
61
|
details,
|
|
74
62
|
};
|
|
75
63
|
}
|
|
@@ -77,42 +65,26 @@ export class CursorInstallProvider implements AdapterInstallProvider {
|
|
|
77
65
|
/**
|
|
78
66
|
* Uninstall CLEO from the current Cursor project.
|
|
79
67
|
*
|
|
80
|
-
* Removes the MCP server registration from .cursor/mcp.json.
|
|
81
68
|
* Does not remove instruction file references (they are harmless if CLEO is not present).
|
|
82
69
|
*/
|
|
83
|
-
async uninstall(): Promise<void> {
|
|
84
|
-
if (!this.installedProjectDir) return;
|
|
85
|
-
|
|
86
|
-
const mcpPath = join(this.installedProjectDir, '.cursor', 'mcp.json');
|
|
87
|
-
if (existsSync(mcpPath)) {
|
|
88
|
-
try {
|
|
89
|
-
const raw = readFileSync(mcpPath, 'utf-8');
|
|
90
|
-
const config = JSON.parse(raw) as Record<string, unknown>;
|
|
91
|
-
const mcpServers = config.mcpServers as Record<string, unknown> | undefined;
|
|
92
|
-
if (mcpServers && MCP_SERVER_KEY in mcpServers) {
|
|
93
|
-
delete mcpServers[MCP_SERVER_KEY];
|
|
94
|
-
writeFileSync(mcpPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
95
|
-
}
|
|
96
|
-
} catch {
|
|
97
|
-
// Ignore errors during uninstall
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
this.installedProjectDir = null;
|
|
102
|
-
}
|
|
70
|
+
async uninstall(): Promise<void> {}
|
|
103
71
|
|
|
104
72
|
/**
|
|
105
73
|
* Check whether CLEO is installed in the current environment.
|
|
106
74
|
*
|
|
107
|
-
* Checks for
|
|
75
|
+
* Checks for .cursor/rules/cleo.mdc or .cursorrules with CLEO references.
|
|
108
76
|
*/
|
|
109
77
|
async isInstalled(): Promise<boolean> {
|
|
110
|
-
const
|
|
111
|
-
if (existsSync(
|
|
78
|
+
const mdcPath = join(process.cwd(), '.cursor', 'rules', 'cleo.mdc');
|
|
79
|
+
if (existsSync(mdcPath)) {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const rulesPath = join(process.cwd(), '.cursorrules');
|
|
84
|
+
if (existsSync(rulesPath)) {
|
|
112
85
|
try {
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
if (mcpServers && MCP_SERVER_KEY in mcpServers) {
|
|
86
|
+
const content = readFileSync(rulesPath, 'utf-8');
|
|
87
|
+
if (INSTRUCTION_REFERENCES.some((ref) => content.includes(ref))) {
|
|
116
88
|
return true;
|
|
117
89
|
}
|
|
118
90
|
} catch {
|
|
@@ -134,43 +106,6 @@ export class CursorInstallProvider implements AdapterInstallProvider {
|
|
|
134
106
|
this.updateInstructionFiles(projectDir);
|
|
135
107
|
}
|
|
136
108
|
|
|
137
|
-
/**
|
|
138
|
-
* Register the CLEO MCP server in .cursor/mcp.json.
|
|
139
|
-
*
|
|
140
|
-
* Cursor stores MCP server configuration in .cursor/mcp.json
|
|
141
|
-
* under the mcpServers key.
|
|
142
|
-
*
|
|
143
|
-
* @returns true if registration was performed or updated
|
|
144
|
-
*/
|
|
145
|
-
private registerMcpServer(projectDir: string, mcpServerPath: string): boolean {
|
|
146
|
-
const cursorDir = join(projectDir, '.cursor');
|
|
147
|
-
const mcpPath = join(cursorDir, 'mcp.json');
|
|
148
|
-
let config: Record<string, unknown> = {};
|
|
149
|
-
|
|
150
|
-
mkdirSync(cursorDir, { recursive: true });
|
|
151
|
-
|
|
152
|
-
if (existsSync(mcpPath)) {
|
|
153
|
-
try {
|
|
154
|
-
config = JSON.parse(readFileSync(mcpPath, 'utf-8'));
|
|
155
|
-
} catch {
|
|
156
|
-
// Start fresh on parse error
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
if (!config.mcpServers || typeof config.mcpServers !== 'object') {
|
|
161
|
-
config.mcpServers = {};
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
const mcpServers = config.mcpServers as Record<string, unknown>;
|
|
165
|
-
mcpServers[MCP_SERVER_KEY] = {
|
|
166
|
-
command: 'node',
|
|
167
|
-
args: [mcpServerPath],
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
writeFileSync(mcpPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
171
|
-
return true;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
109
|
/**
|
|
175
110
|
* Update instruction files with CLEO @-references.
|
|
176
111
|
*
|
|
@@ -28,16 +28,26 @@ const execAsync = promisify(exec);
|
|
|
28
28
|
*
|
|
29
29
|
* Bridges CLEO's adapter system with Gemini CLI's native capabilities:
|
|
30
30
|
* - Hooks: Maps Gemini CLI events (SessionStart, PreToolUse, etc.) to CAAMP events
|
|
31
|
-
* - Install:
|
|
31
|
+
* - Install: Ensures AGENTS.md references for CLEO instruction files
|
|
32
|
+
*
|
|
33
|
+
* @remarks
|
|
34
|
+
* Gemini CLI supports 10 canonical CAAMP events through its hook system,
|
|
35
|
+
* including PreModel and PostModel which most other providers lack. It has
|
|
36
|
+
* no spawn or transport capabilities. Integration is through AGENTS.md
|
|
37
|
+
* instruction files and the Gemini CLI's configuration at `~/.gemini/`.
|
|
32
38
|
*
|
|
33
39
|
* @task T161
|
|
34
40
|
* @epic T134
|
|
35
41
|
*/
|
|
36
42
|
export class GeminiCliAdapter implements CLEOProviderAdapter {
|
|
43
|
+
/** Unique provider identifier. */
|
|
37
44
|
readonly id = 'gemini-cli';
|
|
45
|
+
/** Human-readable provider name. */
|
|
38
46
|
readonly name = 'Gemini CLI';
|
|
47
|
+
/** Adapter version string. */
|
|
39
48
|
readonly version = '1.0.0';
|
|
40
49
|
|
|
50
|
+
/** Declared capabilities for this provider. */
|
|
41
51
|
capabilities: AdapterCapabilities = {
|
|
42
52
|
supportsHooks: true,
|
|
43
53
|
supportedHookEvents: [
|
|
@@ -54,7 +64,7 @@ export class GeminiCliAdapter implements CLEOProviderAdapter {
|
|
|
54
64
|
],
|
|
55
65
|
supportsSpawn: false,
|
|
56
66
|
supportsInstall: true,
|
|
57
|
-
supportsMcp:
|
|
67
|
+
supportsMcp: false,
|
|
58
68
|
supportsInstructionFiles: false,
|
|
59
69
|
supportsContextMonitor: false,
|
|
60
70
|
supportsStatusline: false,
|
|
@@ -63,10 +73,14 @@ export class GeminiCliAdapter implements CLEOProviderAdapter {
|
|
|
63
73
|
supportsTaskSync: false,
|
|
64
74
|
};
|
|
65
75
|
|
|
76
|
+
/** Hook provider for CAAMP event mapping. */
|
|
66
77
|
hooks: GeminiCliHookProvider;
|
|
78
|
+
/** Install provider for managing instruction files. */
|
|
67
79
|
install: GeminiCliInstallProvider;
|
|
68
80
|
|
|
81
|
+
/** Project directory this adapter was initialized with, or null. */
|
|
69
82
|
private projectDir: string | null = null;
|
|
83
|
+
/** Whether {@link initialize} has been called. */
|
|
70
84
|
private initialized = false;
|
|
71
85
|
|
|
72
86
|
constructor() {
|
|
@@ -52,10 +52,17 @@ const GEMINI_CLI_EVENT_MAP: Record<string, string> = {
|
|
|
52
52
|
* the install provider), registerNativeHooks and unregisterNativeHooks
|
|
53
53
|
* track registration state without performing filesystem operations.
|
|
54
54
|
*
|
|
55
|
+
* @remarks
|
|
56
|
+
* Gemini CLI uses its own event naming convention (e.g. BeforeAgent,
|
|
57
|
+
* AfterTool, PreCompress) which differs from both the PascalCase CAAMP
|
|
58
|
+
* canonical names and other providers' conventions. The static event map
|
|
59
|
+
* covers all 10 supported canonical events.
|
|
60
|
+
*
|
|
55
61
|
* @task T161
|
|
56
62
|
* @epic T134
|
|
57
63
|
*/
|
|
58
64
|
export class GeminiCliHookProvider implements AdapterHookProvider {
|
|
65
|
+
/** Whether hooks have been registered for the current session. */
|
|
59
66
|
private registered = false;
|
|
60
67
|
|
|
61
68
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* @packageDocumentation
|
|
3
3
|
*
|
|
4
4
|
* CLEO provider adapter for Google Gemini CLI.
|
|
5
5
|
* Default export is the adapter class for dynamic loading by AdapterManager.
|
|
@@ -20,6 +20,21 @@ export default GeminiCliAdapter;
|
|
|
20
20
|
* Factory function for creating adapter instances.
|
|
21
21
|
* Used by AdapterManager's dynamic import fallback.
|
|
22
22
|
*
|
|
23
|
+
* @remarks
|
|
24
|
+
* This is the primary entry point for dynamic adapter loading.
|
|
25
|
+
* AdapterManager calls this function when it resolves the gemini-cli
|
|
26
|
+
* provider via its import-based discovery mechanism.
|
|
27
|
+
*
|
|
28
|
+
* @returns A new {@link GeminiCliAdapter} instance ready for initialization
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* import { createAdapter } from '@cleocode/adapters/providers/gemini-cli';
|
|
33
|
+
*
|
|
34
|
+
* const adapter = createAdapter();
|
|
35
|
+
* await adapter.initialize('/path/to/project');
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
23
38
|
* @task T161
|
|
24
39
|
*/
|
|
25
40
|
export function createAdapter(): GeminiCliAdapter {
|
|
@@ -2,30 +2,29 @@
|
|
|
2
2
|
* Gemini CLI Install Provider
|
|
3
3
|
*
|
|
4
4
|
* Handles CLEO installation into Gemini CLI environments:
|
|
5
|
-
* - Registers CLEO MCP server in ~/.gemini/settings.json
|
|
6
5
|
* - Ensures AGENTS.md has CLEO @-references
|
|
7
6
|
*
|
|
8
7
|
* @task T161
|
|
9
8
|
* @epic T134
|
|
10
9
|
*/
|
|
11
10
|
|
|
12
|
-
import { existsSync,
|
|
13
|
-
import { homedir } from 'node:os';
|
|
11
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
14
12
|
import { join } from 'node:path';
|
|
15
13
|
import type { AdapterInstallProvider, InstallOptions, InstallResult } from '@cleocode/contracts';
|
|
16
14
|
|
|
17
15
|
/** Lines that should appear in AGENTS.md to reference CLEO. */
|
|
18
16
|
const INSTRUCTION_REFERENCES = ['@~/.cleo/templates/CLEO-INJECTION.md', '@.cleo/memory-bridge.md'];
|
|
19
17
|
|
|
20
|
-
/** MCP server registration key used in Gemini CLI settings. */
|
|
21
|
-
const MCP_SERVER_KEY = 'cleo';
|
|
22
|
-
|
|
23
18
|
/**
|
|
24
19
|
* Install provider for Gemini CLI.
|
|
25
20
|
*
|
|
26
21
|
* Manages CLEO's integration with Gemini CLI by:
|
|
27
|
-
* 1.
|
|
28
|
-
*
|
|
22
|
+
* 1. Ensuring AGENTS.md contains @-references to CLEO instruction files
|
|
23
|
+
*
|
|
24
|
+
* @remarks
|
|
25
|
+
* Installation is idempotent -- running install multiple times on the same
|
|
26
|
+
* project produces the same result. Only AGENTS.md is managed; Gemini CLI
|
|
27
|
+
* does not have an MCP or plugin registration mechanism.
|
|
29
28
|
*
|
|
30
29
|
* @task T161
|
|
31
30
|
* @epic T134
|
|
@@ -34,26 +33,17 @@ export class GeminiCliInstallProvider implements AdapterInstallProvider {
|
|
|
34
33
|
/**
|
|
35
34
|
* Install CLEO into a Gemini CLI environment.
|
|
36
35
|
*
|
|
37
|
-
* @param options - Installation options including project directory
|
|
36
|
+
* @param options - Installation options including project directory
|
|
38
37
|
* @returns Result describing what was installed
|
|
39
38
|
* @task T161
|
|
40
39
|
*/
|
|
41
40
|
async install(options: InstallOptions): Promise<InstallResult> {
|
|
42
|
-
const { projectDir
|
|
41
|
+
const { projectDir } = options;
|
|
43
42
|
const installedAt = new Date().toISOString();
|
|
44
43
|
let instructionFileUpdated = false;
|
|
45
|
-
let mcpRegistered = false;
|
|
46
44
|
const details: Record<string, unknown> = {};
|
|
47
45
|
|
|
48
|
-
// Step 1:
|
|
49
|
-
if (mcpServerPath) {
|
|
50
|
-
mcpRegistered = this.registerMcpServer(mcpServerPath);
|
|
51
|
-
if (mcpRegistered) {
|
|
52
|
-
details.mcpConfigPath = join(homedir(), '.gemini', 'settings.json');
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// Step 2: Ensure AGENTS.md has @-references
|
|
46
|
+
// Step 1: Ensure AGENTS.md has @-references
|
|
57
47
|
instructionFileUpdated = this.updateInstructionFile(projectDir);
|
|
58
48
|
if (instructionFileUpdated) {
|
|
59
49
|
details.instructionFile = join(projectDir, 'AGENTS.md');
|
|
@@ -63,7 +53,7 @@ export class GeminiCliInstallProvider implements AdapterInstallProvider {
|
|
|
63
53
|
success: true,
|
|
64
54
|
installedAt,
|
|
65
55
|
instructionFileUpdated,
|
|
66
|
-
mcpRegistered,
|
|
56
|
+
mcpRegistered: false,
|
|
67
57
|
details,
|
|
68
58
|
};
|
|
69
59
|
}
|
|
@@ -71,41 +61,25 @@ export class GeminiCliInstallProvider implements AdapterInstallProvider {
|
|
|
71
61
|
/**
|
|
72
62
|
* Uninstall CLEO from the Gemini CLI environment.
|
|
73
63
|
*
|
|
74
|
-
* Removes the MCP server registration from ~/.gemini/settings.json.
|
|
75
64
|
* Does not remove AGENTS.md references (they are harmless if CLEO is not present).
|
|
76
65
|
* @task T161
|
|
77
66
|
*/
|
|
78
67
|
async uninstall(): Promise<void> {
|
|
79
|
-
|
|
80
|
-
if (existsSync(settingsPath)) {
|
|
81
|
-
try {
|
|
82
|
-
const raw = readFileSync(settingsPath, 'utf-8');
|
|
83
|
-
const config = JSON.parse(raw) as Record<string, unknown>;
|
|
84
|
-
const mcpServers = config.mcpServers as Record<string, unknown> | undefined;
|
|
85
|
-
if (mcpServers && MCP_SERVER_KEY in mcpServers) {
|
|
86
|
-
delete mcpServers[MCP_SERVER_KEY];
|
|
87
|
-
writeFileSync(settingsPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
88
|
-
}
|
|
89
|
-
} catch {
|
|
90
|
-
// Ignore errors during uninstall
|
|
91
|
-
}
|
|
92
|
-
}
|
|
68
|
+
// No-op: no MCP registration to remove
|
|
93
69
|
}
|
|
94
70
|
|
|
95
71
|
/**
|
|
96
72
|
* Check whether CLEO is installed in the Gemini CLI environment.
|
|
97
73
|
*
|
|
98
|
-
* Checks for
|
|
99
|
-
* Returns true if the CLEO MCP server entry is found.
|
|
74
|
+
* Checks for CLEO references in AGENTS.md.
|
|
100
75
|
* @task T161
|
|
101
76
|
*/
|
|
102
77
|
async isInstalled(): Promise<boolean> {
|
|
103
|
-
const
|
|
104
|
-
if (existsSync(
|
|
78
|
+
const agentsMdPath = join(process.cwd(), 'AGENTS.md');
|
|
79
|
+
if (existsSync(agentsMdPath)) {
|
|
105
80
|
try {
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
if (mcpServers && MCP_SERVER_KEY in mcpServers) {
|
|
81
|
+
const content = readFileSync(agentsMdPath, 'utf-8');
|
|
82
|
+
if (INSTRUCTION_REFERENCES.some((ref) => content.includes(ref))) {
|
|
109
83
|
return true;
|
|
110
84
|
}
|
|
111
85
|
} catch {
|
|
@@ -128,44 +102,6 @@ export class GeminiCliInstallProvider implements AdapterInstallProvider {
|
|
|
128
102
|
this.updateInstructionFile(projectDir);
|
|
129
103
|
}
|
|
130
104
|
|
|
131
|
-
/**
|
|
132
|
-
* Register the CLEO MCP server in ~/.gemini/settings.json.
|
|
133
|
-
*
|
|
134
|
-
* Gemini CLI stores its MCP server configuration in ~/.gemini/settings.json
|
|
135
|
-
* under the mcpServers key.
|
|
136
|
-
*
|
|
137
|
-
* @param mcpServerPath - Absolute path to the MCP server entry point
|
|
138
|
-
* @returns true if registration was performed or updated
|
|
139
|
-
*/
|
|
140
|
-
private registerMcpServer(mcpServerPath: string): boolean {
|
|
141
|
-
const geminiDir = join(homedir(), '.gemini');
|
|
142
|
-
const settingsPath = join(geminiDir, 'settings.json');
|
|
143
|
-
let config: Record<string, unknown> = {};
|
|
144
|
-
|
|
145
|
-
mkdirSync(geminiDir, { recursive: true });
|
|
146
|
-
|
|
147
|
-
if (existsSync(settingsPath)) {
|
|
148
|
-
try {
|
|
149
|
-
config = JSON.parse(readFileSync(settingsPath, 'utf-8'));
|
|
150
|
-
} catch {
|
|
151
|
-
// Start fresh on parse error
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
if (!config.mcpServers || typeof config.mcpServers !== 'object') {
|
|
156
|
-
config.mcpServers = {};
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
const mcpServers = config.mcpServers as Record<string, unknown>;
|
|
160
|
-
mcpServers[MCP_SERVER_KEY] = {
|
|
161
|
-
command: 'node',
|
|
162
|
-
args: [mcpServerPath],
|
|
163
|
-
};
|
|
164
|
-
|
|
165
|
-
writeFileSync(settingsPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
166
|
-
return true;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
105
|
/**
|
|
170
106
|
* Update AGENTS.md with CLEO @-references.
|
|
171
107
|
*
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Main CLEOProviderAdapter implementation for Moonshot AI Kimi.
|
|
5
5
|
* Provides install-only capabilities for CLEO integration.
|
|
6
|
-
* Kimi has no native hook system
|
|
6
|
+
* Kimi has no native hook system; integration is via instruction files.
|
|
7
7
|
*
|
|
8
8
|
* @task T163
|
|
9
9
|
* @epic T134
|
|
@@ -29,22 +29,31 @@ const execAsync = promisify(exec);
|
|
|
29
29
|
*
|
|
30
30
|
* Bridges CLEO's adapter system with Kimi's integration surface:
|
|
31
31
|
* - Hooks: No-op (Kimi has no native hook system)
|
|
32
|
-
* - Install:
|
|
32
|
+
* - Install: Ensures AGENTS.md references for CLEO instruction files
|
|
33
|
+
*
|
|
34
|
+
* @remarks
|
|
35
|
+
* Kimi has no native hook or event system, so all hook-related capabilities
|
|
36
|
+
* are disabled. The adapter is install-only, managing AGENTS.md references
|
|
37
|
+
* for CLEO instruction injection.
|
|
33
38
|
*
|
|
34
39
|
* @task T163
|
|
35
40
|
* @epic T134
|
|
36
41
|
*/
|
|
37
42
|
export class KimiAdapter implements CLEOProviderAdapter {
|
|
43
|
+
/** Unique provider identifier. */
|
|
38
44
|
readonly id = 'kimi';
|
|
45
|
+
/** Human-readable provider name. */
|
|
39
46
|
readonly name = 'Kimi';
|
|
47
|
+
/** Adapter version string. */
|
|
40
48
|
readonly version = '1.0.0';
|
|
41
49
|
|
|
50
|
+
/** Declared capabilities for this provider. */
|
|
42
51
|
capabilities: AdapterCapabilities = {
|
|
43
52
|
supportsHooks: false,
|
|
44
53
|
supportedHookEvents: [],
|
|
45
54
|
supportsSpawn: false,
|
|
46
55
|
supportsInstall: true,
|
|
47
|
-
supportsMcp:
|
|
56
|
+
supportsMcp: false,
|
|
48
57
|
supportsInstructionFiles: false,
|
|
49
58
|
supportsContextMonitor: false,
|
|
50
59
|
supportsStatusline: false,
|
|
@@ -53,10 +62,14 @@ export class KimiAdapter implements CLEOProviderAdapter {
|
|
|
53
62
|
supportsTaskSync: false,
|
|
54
63
|
};
|
|
55
64
|
|
|
65
|
+
/** Hook provider (no-op since Kimi has no event system). */
|
|
56
66
|
hooks: KimiHookProvider;
|
|
67
|
+
/** Install provider for managing instruction files. */
|
|
57
68
|
install: KimiInstallProvider;
|
|
58
69
|
|
|
70
|
+
/** Project directory this adapter was initialized with, or null. */
|
|
59
71
|
private projectDir: string | null = null;
|
|
72
|
+
/** Whether {@link initialize} has been called. */
|
|
60
73
|
private initialized = false;
|
|
61
74
|
|
|
62
75
|
constructor() {
|
|
@@ -18,10 +18,16 @@ import type { AdapterHookProvider } from '@cleocode/contracts';
|
|
|
18
18
|
* All hook-related methods are no-ops; mapProviderEvent always
|
|
19
19
|
* returns null since there are no events to map.
|
|
20
20
|
*
|
|
21
|
+
* @remarks
|
|
22
|
+
* Since Kimi has no hookable events, the event map is empty and
|
|
23
|
+
* `mapProviderEvent` always returns null. Registration state is tracked
|
|
24
|
+
* purely for interface compliance with {@link AdapterHookProvider}.
|
|
25
|
+
*
|
|
21
26
|
* @task T163
|
|
22
27
|
* @epic T134
|
|
23
28
|
*/
|
|
24
29
|
export class KimiHookProvider implements AdapterHookProvider {
|
|
30
|
+
/** Whether hooks have been registered (always a no-op for Kimi). */
|
|
25
31
|
private registered = false;
|
|
26
32
|
|
|
27
33
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* @packageDocumentation
|
|
3
3
|
*
|
|
4
4
|
* CLEO provider adapter for Moonshot AI Kimi.
|
|
5
5
|
* Default export is the adapter class for dynamic loading by AdapterManager.
|
|
@@ -20,6 +20,21 @@ export default KimiAdapter;
|
|
|
20
20
|
* Factory function for creating adapter instances.
|
|
21
21
|
* Used by AdapterManager's dynamic import fallback.
|
|
22
22
|
*
|
|
23
|
+
* @remarks
|
|
24
|
+
* This is the primary entry point for dynamic adapter loading.
|
|
25
|
+
* AdapterManager calls this function when it resolves the kimi
|
|
26
|
+
* provider via its import-based discovery mechanism.
|
|
27
|
+
*
|
|
28
|
+
* @returns A new {@link KimiAdapter} instance ready for initialization
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* import { createAdapter } from '@cleocode/adapters/providers/kimi';
|
|
33
|
+
*
|
|
34
|
+
* const adapter = createAdapter();
|
|
35
|
+
* await adapter.initialize('/path/to/project');
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
23
38
|
* @task T163
|
|
24
39
|
*/
|
|
25
40
|
export function createAdapter(): KimiAdapter {
|