@cleocode/adapters 2026.5.28 → 2026.5.33
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.js +66 -73
- package/dist/index.js.map +4 -4
- package/dist/providers/claude-code/install.d.ts +2 -7
- package/dist/providers/claude-code/install.d.ts.map +1 -1
- package/dist/providers/cursor/install.d.ts +6 -1
- package/dist/providers/cursor/install.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/__tests__/claude-code-adapter.test.ts +10 -10
- package/src/providers/claude-code/__tests__/adapter.test.ts +11 -0
- package/src/providers/claude-code/install.ts +8 -52
- package/src/providers/cursor/__tests__/adapter.test.ts +17 -0
- package/src/providers/cursor/install.ts +26 -16
|
@@ -47,17 +47,12 @@ export declare class ClaudeCodeInstallProvider implements AdapterInstallProvider
|
|
|
47
47
|
/**
|
|
48
48
|
* Ensure CLAUDE.md contains @-references to CLEO instruction files.
|
|
49
49
|
*
|
|
50
|
-
*
|
|
50
|
+
* Delegates to CAAMP's canonical API which reads the instruction file name
|
|
51
|
+
* and default references from the provider registry (T1919).
|
|
51
52
|
*
|
|
52
53
|
* @param projectDir - Project root directory
|
|
53
54
|
*/
|
|
54
55
|
ensureInstructionReferences(projectDir: string): Promise<void>;
|
|
55
|
-
/**
|
|
56
|
-
* Update CLAUDE.md with CLEO @-references.
|
|
57
|
-
*
|
|
58
|
-
* @returns true if the file was created or modified
|
|
59
|
-
*/
|
|
60
|
-
private updateInstructionFile;
|
|
61
56
|
/**
|
|
62
57
|
* Install Claude Code-specific commands to .claude/commands/ in the project.
|
|
63
58
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/providers/claude-code/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/providers/claude-code/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAcH,OAAO,KAAK,EAAE,sBAAsB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAajG;;;;;;;;;;;;;GAaG;AACH,qBAAa,yBAA0B,YAAW,sBAAsB;IACtE;;;;;OAKG;IACG,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAwC9D;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAEhC;;;;OAIG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAkBrC;;;;;;;OAOG;IACG,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;IAsBvB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAkCtB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,oBAAoB;IAgC5B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,sBAAsB;CAmD/B"}
|
|
@@ -53,7 +53,8 @@ export declare class CursorInstallProvider implements AdapterInstallProvider {
|
|
|
53
53
|
/**
|
|
54
54
|
* Ensure instruction files contain @-references to CLEO.
|
|
55
55
|
*
|
|
56
|
-
*
|
|
56
|
+
* Delegates the primary AGENTS.md write to CAAMP's canonical API (T1919) and
|
|
57
|
+
* also updates cursor-specific MDC + legacy .cursorrules formats.
|
|
57
58
|
*
|
|
58
59
|
* @param projectDir - Project root directory
|
|
59
60
|
*/
|
|
@@ -68,6 +69,9 @@ export declare class CursorInstallProvider implements AdapterInstallProvider {
|
|
|
68
69
|
private updateInstructionFiles;
|
|
69
70
|
/**
|
|
70
71
|
* Update legacy .cursorrules file with @-references.
|
|
72
|
+
*
|
|
73
|
+
* References are sourced from the CAAMP provider registry (T1919) rather than
|
|
74
|
+
* a local constant, keeping this adapter in sync with the single source of truth.
|
|
71
75
|
* Only modifies the file if it already exists (does not create it).
|
|
72
76
|
*
|
|
73
77
|
* @returns true if the file was modified
|
|
@@ -78,6 +82,7 @@ export declare class CursorInstallProvider implements AdapterInstallProvider {
|
|
|
78
82
|
*
|
|
79
83
|
* MDC (Markdown Component) format is Cursor's modern rule file format.
|
|
80
84
|
* Each .mdc file in .cursor/rules/ is loaded as a rule set.
|
|
85
|
+
* References are sourced from the CAAMP provider registry (T1919).
|
|
81
86
|
*
|
|
82
87
|
* @returns true if the file was created or modified
|
|
83
88
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/providers/cursor/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/providers/cursor/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,sBAAsB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOjG;;;;;;;;;;;;;GAaG;AACH,qBAAa,qBAAsB,YAAW,sBAAsB;IAClE;;;;;OAKG;IACG,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IA+B9D;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAEhC;;;;OAIG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAsBrC;;;;;;;OAOG;IACG,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpE;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAgB9B;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IAuBzB;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IA+BzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,oBAAoB;IA8B5B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,sBAAsB;CAyC/B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cleocode/adapters",
|
|
3
|
-
"version": "2026.5.
|
|
3
|
+
"version": "2026.5.33",
|
|
4
4
|
"description": "Unified provider adapters for CLEO (Claude Code, OpenCode, Cursor)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
"@ai-sdk/anthropic": "^3.0.69",
|
|
16
16
|
"@ai-sdk/openai": "^2.0.53",
|
|
17
17
|
"ai": "^6.0.168",
|
|
18
|
-
"@cleocode/caamp": "2026.5.
|
|
19
|
-
"@cleocode/contracts": "2026.5.
|
|
20
|
-
"@cleocode/paths": "2026.5.
|
|
18
|
+
"@cleocode/caamp": "2026.5.33",
|
|
19
|
+
"@cleocode/contracts": "2026.5.33",
|
|
20
|
+
"@cleocode/paths": "2026.5.33"
|
|
21
21
|
},
|
|
22
22
|
"license": "MIT",
|
|
23
23
|
"engines": {
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@types/node": "^22.19.15",
|
|
32
32
|
"vitest": "^4.1.4",
|
|
33
|
-
"@cleocode/playbooks": "2026.5.
|
|
33
|
+
"@cleocode/playbooks": "2026.5.33"
|
|
34
34
|
},
|
|
35
35
|
"repository": {
|
|
36
36
|
"type": "git",
|
|
@@ -186,18 +186,18 @@ describe('ClaudeCodeInstallProvider — integration', () => {
|
|
|
186
186
|
expect(content).toContain('@.cleo/memory-bridge.md');
|
|
187
187
|
});
|
|
188
188
|
|
|
189
|
-
it('does not duplicate
|
|
190
|
-
//
|
|
191
|
-
|
|
192
|
-
const
|
|
193
|
-
const
|
|
194
|
-
|
|
189
|
+
it('is idempotent — calling twice does not duplicate the CAAMP block', async () => {
|
|
190
|
+
// First call creates the CAAMP-managed block
|
|
191
|
+
await install.ensureInstructionReferences(testDir);
|
|
192
|
+
const firstContent = readFileSync(join(testDir, 'CLAUDE.md'), 'utf-8');
|
|
193
|
+
const firstCount = (firstContent.match(/@~\/.+\/CLEO-INJECTION\.md/g) ?? []).length;
|
|
194
|
+
expect(firstCount).toBe(1);
|
|
195
195
|
|
|
196
|
+
// Second call must be idempotent — CAAMP detects existing block and returns 'intact'
|
|
196
197
|
await install.ensureInstructionReferences(testDir);
|
|
197
|
-
const
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
expect(injectionCount).toBe(1);
|
|
198
|
+
const secondContent = readFileSync(join(testDir, 'CLAUDE.md'), 'utf-8');
|
|
199
|
+
const secondCount = (secondContent.match(/@~\/.+\/CLEO-INJECTION\.md/g) ?? []).length;
|
|
200
|
+
expect(secondCount).toBe(1);
|
|
201
201
|
});
|
|
202
202
|
|
|
203
203
|
it('install returns expected shape', async () => {
|
|
@@ -49,10 +49,21 @@ vi.mock('node:fs', async (importOriginal) => {
|
|
|
49
49
|
});
|
|
50
50
|
|
|
51
51
|
vi.mock('node:fs/promises', () => ({
|
|
52
|
+
mkdir: vi.fn().mockResolvedValue(undefined),
|
|
53
|
+
readFile: vi.fn().mockResolvedValue(''),
|
|
52
54
|
writeFile: vi.fn().mockResolvedValue(undefined),
|
|
53
55
|
unlink: vi.fn().mockResolvedValue(undefined),
|
|
54
56
|
}));
|
|
55
57
|
|
|
58
|
+
vi.mock('@cleocode/caamp', () => ({
|
|
59
|
+
ensureProviderInstructionFile: vi.fn().mockResolvedValue({
|
|
60
|
+
filePath: '/tmp/test-project/CLAUDE.md',
|
|
61
|
+
instructFile: 'CLAUDE.md',
|
|
62
|
+
action: 'added',
|
|
63
|
+
providerId: 'claude-code',
|
|
64
|
+
}),
|
|
65
|
+
}));
|
|
66
|
+
|
|
56
67
|
describe('ClaudeCodeAdapter', () => {
|
|
57
68
|
let adapter: ClaudeCodeAdapter;
|
|
58
69
|
|
|
@@ -21,22 +21,12 @@ import {
|
|
|
21
21
|
import { homedir } from 'node:os';
|
|
22
22
|
import { dirname, join } from 'node:path';
|
|
23
23
|
import { fileURLToPath } from 'node:url';
|
|
24
|
+
import { ensureProviderInstructionFile } from '@cleocode/caamp';
|
|
24
25
|
import type { AdapterInstallProvider, InstallOptions, InstallResult } from '@cleocode/contracts';
|
|
25
26
|
import {
|
|
26
27
|
type InstallHookTemplatesResult,
|
|
27
28
|
installProviderHookTemplates,
|
|
28
29
|
} from '../shared/hook-template-installer.js';
|
|
29
|
-
import { getCleoTemplatesTildePath } from '../shared/paths.js';
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Lines that should appear in CLAUDE.md to reference CLEO.
|
|
33
|
-
* The CLEO-INJECTION.md path is resolved dynamically to support non-default
|
|
34
|
-
* XDG / OS installation locations (T916).
|
|
35
|
-
*/
|
|
36
|
-
const INSTRUCTION_REFERENCES = [
|
|
37
|
-
`@${getCleoTemplatesTildePath()}/CLEO-INJECTION.md`,
|
|
38
|
-
'@.cleo/memory-bridge.md',
|
|
39
|
-
];
|
|
40
30
|
|
|
41
31
|
/** Resolve the commands directory bundled with this adapter. */
|
|
42
32
|
function getAdapterCommandsDir(): string {
|
|
@@ -72,10 +62,11 @@ export class ClaudeCodeInstallProvider implements AdapterInstallProvider {
|
|
|
72
62
|
let instructionFileUpdated = false;
|
|
73
63
|
const details: Record<string, unknown> = {};
|
|
74
64
|
|
|
75
|
-
// Step 1: Ensure CLAUDE.md has @-references
|
|
76
|
-
|
|
65
|
+
// Step 1: Ensure CLAUDE.md has @-references via CAAMP canonical API (T1919)
|
|
66
|
+
const instructionResult = await ensureProviderInstructionFile('claude-code', projectDir, {});
|
|
67
|
+
instructionFileUpdated = instructionResult.action !== 'intact';
|
|
77
68
|
if (instructionFileUpdated) {
|
|
78
|
-
details.instructionFile =
|
|
69
|
+
details.instructionFile = instructionResult.filePath;
|
|
79
70
|
}
|
|
80
71
|
|
|
81
72
|
// Step 2: Install adapter-provided commands to .claude/commands/
|
|
@@ -138,48 +129,13 @@ export class ClaudeCodeInstallProvider implements AdapterInstallProvider {
|
|
|
138
129
|
/**
|
|
139
130
|
* Ensure CLAUDE.md contains @-references to CLEO instruction files.
|
|
140
131
|
*
|
|
141
|
-
*
|
|
132
|
+
* Delegates to CAAMP's canonical API which reads the instruction file name
|
|
133
|
+
* and default references from the provider registry (T1919).
|
|
142
134
|
*
|
|
143
135
|
* @param projectDir - Project root directory
|
|
144
136
|
*/
|
|
145
137
|
async ensureInstructionReferences(projectDir: string): Promise<void> {
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Update CLAUDE.md with CLEO @-references.
|
|
151
|
-
*
|
|
152
|
-
* @returns true if the file was created or modified
|
|
153
|
-
*/
|
|
154
|
-
private updateInstructionFile(projectDir: string): boolean {
|
|
155
|
-
const claudeMdPath = join(projectDir, 'CLAUDE.md');
|
|
156
|
-
let content = '';
|
|
157
|
-
let existed = false;
|
|
158
|
-
|
|
159
|
-
if (existsSync(claudeMdPath)) {
|
|
160
|
-
content = readFileSync(claudeMdPath, 'utf-8');
|
|
161
|
-
existed = true;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
const missingRefs = INSTRUCTION_REFERENCES.filter((ref) => !content.includes(ref));
|
|
165
|
-
|
|
166
|
-
if (missingRefs.length === 0) {
|
|
167
|
-
return false;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
const refsBlock = missingRefs.join('\n');
|
|
171
|
-
|
|
172
|
-
if (existed) {
|
|
173
|
-
// Append missing references
|
|
174
|
-
const separator = content.endsWith('\n') ? '' : '\n';
|
|
175
|
-
content = content + separator + refsBlock + '\n';
|
|
176
|
-
} else {
|
|
177
|
-
// Create new CLAUDE.md with references
|
|
178
|
-
content = refsBlock + '\n';
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
writeFileSync(claudeMdPath, content, 'utf-8');
|
|
182
|
-
return true;
|
|
138
|
+
await ensureProviderInstructionFile('claude-code', projectDir, {});
|
|
183
139
|
}
|
|
184
140
|
|
|
185
141
|
/**
|
|
@@ -17,6 +17,7 @@ vi.mock('node:fs', async (importOriginal) => {
|
|
|
17
17
|
existsSync: vi.fn((path: string) => {
|
|
18
18
|
if (typeof path === 'string' && path.includes('.cursor')) return true;
|
|
19
19
|
if (typeof path === 'string' && path.includes('.cursorrules')) return false;
|
|
20
|
+
if (typeof path === 'string' && path.includes('AGENTS.md')) return false;
|
|
20
21
|
return false;
|
|
21
22
|
}),
|
|
22
23
|
readFileSync: vi.fn((path: string) => {
|
|
@@ -30,6 +31,22 @@ vi.mock('node:fs', async (importOriginal) => {
|
|
|
30
31
|
};
|
|
31
32
|
});
|
|
32
33
|
|
|
34
|
+
vi.mock('node:fs/promises', () => ({
|
|
35
|
+
mkdir: vi.fn().mockResolvedValue(undefined),
|
|
36
|
+
readFile: vi.fn().mockResolvedValue(''),
|
|
37
|
+
writeFile: vi.fn().mockResolvedValue(undefined),
|
|
38
|
+
unlink: vi.fn().mockResolvedValue(undefined),
|
|
39
|
+
}));
|
|
40
|
+
|
|
41
|
+
vi.mock('@cleocode/caamp', () => ({
|
|
42
|
+
ensureProviderInstructionFile: vi.fn().mockResolvedValue({
|
|
43
|
+
filePath: '/tmp/test-project/AGENTS.md',
|
|
44
|
+
instructFile: 'AGENTS.md',
|
|
45
|
+
action: 'added',
|
|
46
|
+
providerId: 'cursor',
|
|
47
|
+
}),
|
|
48
|
+
}));
|
|
49
|
+
|
|
33
50
|
describe('CursorAdapter', () => {
|
|
34
51
|
let adapter: CursorAdapter;
|
|
35
52
|
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
20
20
|
import { join } from 'node:path';
|
|
21
|
+
import { ensureProviderInstructionFile } from '@cleocode/caamp';
|
|
21
22
|
import type { AdapterInstallProvider, InstallOptions, InstallResult } from '@cleocode/contracts';
|
|
22
23
|
import {
|
|
23
24
|
type InstallHookTemplatesResult,
|
|
@@ -25,16 +26,6 @@ import {
|
|
|
25
26
|
} from '../shared/hook-template-installer.js';
|
|
26
27
|
import { getCleoTemplatesTildePath } from '../shared/paths.js';
|
|
27
28
|
|
|
28
|
-
/**
|
|
29
|
-
* Lines that should appear in instruction files to reference CLEO.
|
|
30
|
-
* The CLEO-INJECTION.md path is resolved dynamically to support non-default
|
|
31
|
-
* XDG / OS installation locations (T916).
|
|
32
|
-
*/
|
|
33
|
-
const INSTRUCTION_REFERENCES = [
|
|
34
|
-
`@${getCleoTemplatesTildePath()}/CLEO-INJECTION.md`,
|
|
35
|
-
'@.cleo/memory-bridge.md',
|
|
36
|
-
];
|
|
37
|
-
|
|
38
29
|
/**
|
|
39
30
|
* Install provider for Cursor.
|
|
40
31
|
*
|
|
@@ -62,8 +53,12 @@ export class CursorInstallProvider implements AdapterInstallProvider {
|
|
|
62
53
|
let instructionFileUpdated = false;
|
|
63
54
|
const details: Record<string, unknown> = {};
|
|
64
55
|
|
|
65
|
-
// Step 1: Ensure instruction files have @-references
|
|
66
|
-
|
|
56
|
+
// Step 1: Ensure instruction files have @-references via CAAMP canonical API (T1919).
|
|
57
|
+
// ensureProviderInstructionFile handles the primary AGENTS.md (registry instructFile);
|
|
58
|
+
// updateInstructionFiles also manages cursor-specific MDC + legacy .cursorrules formats.
|
|
59
|
+
const instructionResult = await ensureProviderInstructionFile('cursor', projectDir, {});
|
|
60
|
+
const cursorFilesUpdated = this.updateInstructionFiles(projectDir);
|
|
61
|
+
instructionFileUpdated = instructionResult.action !== 'intact' || cursorFilesUpdated;
|
|
67
62
|
if (instructionFileUpdated) {
|
|
68
63
|
details.instructionFiles = this.getUpdatedFileList(projectDir);
|
|
69
64
|
}
|
|
@@ -105,7 +100,8 @@ export class CursorInstallProvider implements AdapterInstallProvider {
|
|
|
105
100
|
if (existsSync(rulesPath)) {
|
|
106
101
|
try {
|
|
107
102
|
const content = readFileSync(rulesPath, 'utf-8');
|
|
108
|
-
|
|
103
|
+
const injectionRef = `@${getCleoTemplatesTildePath()}/CLEO-INJECTION.md`;
|
|
104
|
+
if (content.includes(injectionRef) || content.includes('@.cleo/memory-bridge.md')) {
|
|
109
105
|
return true;
|
|
110
106
|
}
|
|
111
107
|
} catch {
|
|
@@ -119,11 +115,13 @@ export class CursorInstallProvider implements AdapterInstallProvider {
|
|
|
119
115
|
/**
|
|
120
116
|
* Ensure instruction files contain @-references to CLEO.
|
|
121
117
|
*
|
|
122
|
-
*
|
|
118
|
+
* Delegates the primary AGENTS.md write to CAAMP's canonical API (T1919) and
|
|
119
|
+
* also updates cursor-specific MDC + legacy .cursorrules formats.
|
|
123
120
|
*
|
|
124
121
|
* @param projectDir - Project root directory
|
|
125
122
|
*/
|
|
126
123
|
async ensureInstructionReferences(projectDir: string): Promise<void> {
|
|
124
|
+
await ensureProviderInstructionFile('cursor', projectDir, {});
|
|
127
125
|
this.updateInstructionFiles(projectDir);
|
|
128
126
|
}
|
|
129
127
|
|
|
@@ -152,6 +150,9 @@ export class CursorInstallProvider implements AdapterInstallProvider {
|
|
|
152
150
|
|
|
153
151
|
/**
|
|
154
152
|
* Update legacy .cursorrules file with @-references.
|
|
153
|
+
*
|
|
154
|
+
* References are sourced from the CAAMP provider registry (T1919) rather than
|
|
155
|
+
* a local constant, keeping this adapter in sync with the single source of truth.
|
|
155
156
|
* Only modifies the file if it already exists (does not create it).
|
|
156
157
|
*
|
|
157
158
|
* @returns true if the file was modified
|
|
@@ -163,7 +164,11 @@ export class CursorInstallProvider implements AdapterInstallProvider {
|
|
|
163
164
|
}
|
|
164
165
|
|
|
165
166
|
let content = readFileSync(rulesPath, 'utf-8');
|
|
166
|
-
const
|
|
167
|
+
const cursorRefs = [
|
|
168
|
+
`@${getCleoTemplatesTildePath()}/CLEO-INJECTION.md`,
|
|
169
|
+
'@.cleo/memory-bridge.md',
|
|
170
|
+
];
|
|
171
|
+
const missingRefs = cursorRefs.filter((ref) => !content.includes(ref));
|
|
167
172
|
|
|
168
173
|
if (missingRefs.length === 0) {
|
|
169
174
|
return false;
|
|
@@ -180,6 +185,7 @@ export class CursorInstallProvider implements AdapterInstallProvider {
|
|
|
180
185
|
*
|
|
181
186
|
* MDC (Markdown Component) format is Cursor's modern rule file format.
|
|
182
187
|
* Each .mdc file in .cursor/rules/ is loaded as a rule set.
|
|
188
|
+
* References are sourced from the CAAMP provider registry (T1919).
|
|
183
189
|
*
|
|
184
190
|
* @returns true if the file was created or modified
|
|
185
191
|
*/
|
|
@@ -187,6 +193,10 @@ export class CursorInstallProvider implements AdapterInstallProvider {
|
|
|
187
193
|
const rulesDir = join(projectDir, '.cursor', 'rules');
|
|
188
194
|
const mdcPath = join(rulesDir, 'cleo.mdc');
|
|
189
195
|
|
|
196
|
+
const cursorRefs = [
|
|
197
|
+
`@${getCleoTemplatesTildePath()}/CLEO-INJECTION.md`,
|
|
198
|
+
'@.cleo/memory-bridge.md',
|
|
199
|
+
];
|
|
190
200
|
const expectedContent = [
|
|
191
201
|
'---',
|
|
192
202
|
'description: CLEO task management protocol references',
|
|
@@ -194,7 +204,7 @@ export class CursorInstallProvider implements AdapterInstallProvider {
|
|
|
194
204
|
'alwaysApply: true',
|
|
195
205
|
'---',
|
|
196
206
|
'',
|
|
197
|
-
...
|
|
207
|
+
...cursorRefs,
|
|
198
208
|
'',
|
|
199
209
|
].join('\n');
|
|
200
210
|
|