@cleocode/adapters 2026.5.49 → 2026.5.50
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 +12 -9
- package/dist/index.js.map +1 -1
- package/dist/providers/claude-code/install.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/__tests__/cant-context.test.ts +3 -3
- package/src/providers/claude-code/__tests__/hooks-install.test.ts +16 -2
- package/src/providers/claude-code/install.ts +14 -9
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;AAkBjG;;;;;;;;;;;;;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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cleocode/adapters",
|
|
3
|
-
"version": "2026.5.
|
|
3
|
+
"version": "2026.5.50",
|
|
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/
|
|
19
|
-
"@cleocode/paths": "2026.5.
|
|
20
|
-
"@cleocode/
|
|
18
|
+
"@cleocode/caamp": "2026.5.50",
|
|
19
|
+
"@cleocode/paths": "2026.5.50",
|
|
20
|
+
"@cleocode/contracts": "2026.5.50"
|
|
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.50"
|
|
34
34
|
},
|
|
35
35
|
"repository": {
|
|
36
36
|
"type": "git",
|
|
@@ -70,7 +70,7 @@ describe('discoverCantFiles', () => {
|
|
|
70
70
|
describe('resolveThreeTierPaths', () => {
|
|
71
71
|
it('returns project tier pointing to .cleo/cant/', () => {
|
|
72
72
|
const paths = resolveThreeTierPaths('/my/project');
|
|
73
|
-
expect(paths.project).toBe('/my/project
|
|
73
|
+
expect(paths.project).toBe(join('/my/project', '.cleo', 'cant'));
|
|
74
74
|
});
|
|
75
75
|
|
|
76
76
|
it('respects XDG_DATA_HOME for global tier', () => {
|
|
@@ -78,7 +78,7 @@ describe('resolveThreeTierPaths', () => {
|
|
|
78
78
|
process.env['XDG_DATA_HOME'] = '/custom/data';
|
|
79
79
|
try {
|
|
80
80
|
const paths = resolveThreeTierPaths('/my/project');
|
|
81
|
-
expect(paths.global).toBe('/custom/data
|
|
81
|
+
expect(paths.global).toBe(join('/custom/data', 'cleo', 'cant'));
|
|
82
82
|
} finally {
|
|
83
83
|
if (originalXdg) process.env['XDG_DATA_HOME'] = originalXdg;
|
|
84
84
|
else delete process.env['XDG_DATA_HOME'];
|
|
@@ -90,7 +90,7 @@ describe('resolveThreeTierPaths', () => {
|
|
|
90
90
|
process.env['XDG_CONFIG_HOME'] = '/custom/config';
|
|
91
91
|
try {
|
|
92
92
|
const paths = resolveThreeTierPaths('/my/project');
|
|
93
|
-
expect(paths.user).toBe('/custom/config
|
|
93
|
+
expect(paths.user).toBe(join('/custom/config', 'cleo', 'cant'));
|
|
94
94
|
} finally {
|
|
95
95
|
if (originalXdg) process.env['XDG_CONFIG_HOME'] = originalXdg;
|
|
96
96
|
else delete process.env['XDG_CONFIG_HOME'];
|
|
@@ -26,15 +26,19 @@ import { ClaudeCodeInstallProvider } from '../install.js';
|
|
|
26
26
|
describe('ClaudeCodeInstallProvider — PreCompact hook templates', () => {
|
|
27
27
|
let fakeHome: string;
|
|
28
28
|
let realHome: string | undefined;
|
|
29
|
+
let realUserProfile: string | undefined;
|
|
30
|
+
let realClaudeHome: string | undefined;
|
|
29
31
|
let projectDir: string;
|
|
30
32
|
|
|
31
33
|
beforeEach(() => {
|
|
32
34
|
realHome = process.env.HOME;
|
|
35
|
+
realUserProfile = process.env.USERPROFILE;
|
|
36
|
+
realClaudeHome = process.env.CLAUDE_HOME;
|
|
33
37
|
fakeHome = mkdtempSync(join(tmpdir(), 'cleo-claude-install-'));
|
|
34
38
|
projectDir = mkdtempSync(join(tmpdir(), 'cleo-claude-project-'));
|
|
35
39
|
process.env.HOME = fakeHome;
|
|
36
|
-
|
|
37
|
-
|
|
40
|
+
process.env.USERPROFILE = fakeHome;
|
|
41
|
+
process.env.CLAUDE_HOME = join(fakeHome, '.claude');
|
|
38
42
|
});
|
|
39
43
|
|
|
40
44
|
afterEach(() => {
|
|
@@ -43,6 +47,16 @@ describe('ClaudeCodeInstallProvider — PreCompact hook templates', () => {
|
|
|
43
47
|
} else {
|
|
44
48
|
delete process.env.HOME;
|
|
45
49
|
}
|
|
50
|
+
if (realUserProfile !== undefined) {
|
|
51
|
+
process.env.USERPROFILE = realUserProfile;
|
|
52
|
+
} else {
|
|
53
|
+
delete process.env.USERPROFILE;
|
|
54
|
+
}
|
|
55
|
+
if (realClaudeHome !== undefined) {
|
|
56
|
+
process.env.CLAUDE_HOME = realClaudeHome;
|
|
57
|
+
} else {
|
|
58
|
+
delete process.env.CLAUDE_HOME;
|
|
59
|
+
}
|
|
46
60
|
rmSync(fakeHome, { recursive: true, force: true });
|
|
47
61
|
rmSync(projectDir, { recursive: true, force: true });
|
|
48
62
|
});
|
|
@@ -28,6 +28,11 @@ import {
|
|
|
28
28
|
installProviderHookTemplates,
|
|
29
29
|
} from '../shared/hook-template-installer.js';
|
|
30
30
|
|
|
31
|
+
/** Resolve Claude Code's config directory, honoring the documented CI override. */
|
|
32
|
+
function getClaudeConfigDir(): string {
|
|
33
|
+
return process.env['CLAUDE_HOME'] ?? join(homedir(), '.claude');
|
|
34
|
+
}
|
|
35
|
+
|
|
31
36
|
/** Resolve the commands directory bundled with this adapter. */
|
|
32
37
|
function getAdapterCommandsDir(): string {
|
|
33
38
|
// Works in both ESM (import.meta.url) and compiled output
|
|
@@ -110,7 +115,7 @@ export class ClaudeCodeInstallProvider implements AdapterInstallProvider {
|
|
|
110
115
|
*/
|
|
111
116
|
async isInstalled(): Promise<boolean> {
|
|
112
117
|
// Check ~/.claude/settings.json for plugin registration
|
|
113
|
-
const settingsPath = join(
|
|
118
|
+
const settingsPath = join(getClaudeConfigDir(), 'settings.json');
|
|
114
119
|
if (existsSync(settingsPath)) {
|
|
115
120
|
try {
|
|
116
121
|
const settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));
|
|
@@ -175,8 +180,8 @@ export class ClaudeCodeInstallProvider implements AdapterInstallProvider {
|
|
|
175
180
|
* @returns Description of what was registered, or null if no change needed
|
|
176
181
|
*/
|
|
177
182
|
private registerPlugin(): string | null {
|
|
178
|
-
const
|
|
179
|
-
const settingsPath = join(
|
|
183
|
+
const claudeDir = getClaudeConfigDir();
|
|
184
|
+
const settingsPath = join(claudeDir, 'settings.json');
|
|
180
185
|
|
|
181
186
|
let settings: Record<string, unknown> = {};
|
|
182
187
|
if (existsSync(settingsPath)) {
|
|
@@ -202,7 +207,7 @@ export class ClaudeCodeInstallProvider implements AdapterInstallProvider {
|
|
|
202
207
|
enabledPlugins[pluginKey] = true;
|
|
203
208
|
settings.enabledPlugins = enabledPlugins;
|
|
204
209
|
|
|
205
|
-
mkdirSync(
|
|
210
|
+
mkdirSync(claudeDir, { recursive: true });
|
|
206
211
|
writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
|
|
207
212
|
|
|
208
213
|
return `Enabled ${pluginKey} in ~/.claude/settings.json`;
|
|
@@ -232,8 +237,8 @@ export class ClaudeCodeInstallProvider implements AdapterInstallProvider {
|
|
|
232
237
|
templates: InstallHookTemplatesResult;
|
|
233
238
|
settingsEntryAdded: boolean;
|
|
234
239
|
} | null {
|
|
235
|
-
const
|
|
236
|
-
const hooksDir = join(
|
|
240
|
+
const claudeDir = getClaudeConfigDir();
|
|
241
|
+
const hooksDir = join(claudeDir, 'hooks');
|
|
237
242
|
|
|
238
243
|
// 1. Copy the bash templates next to each other so `source $SCRIPT_DIR/...` works.
|
|
239
244
|
// Template copy is best-effort so missing/locked filesystems (CI sandboxes,
|
|
@@ -275,8 +280,8 @@ export class ClaudeCodeInstallProvider implements AdapterInstallProvider {
|
|
|
275
280
|
* @task T1013
|
|
276
281
|
*/
|
|
277
282
|
private registerPreCompactHook(shimPath: string): boolean {
|
|
278
|
-
const
|
|
279
|
-
const settingsPath = join(
|
|
283
|
+
const claudeDir = getClaudeConfigDir();
|
|
284
|
+
const settingsPath = join(claudeDir, 'settings.json');
|
|
280
285
|
|
|
281
286
|
let settings: Record<string, unknown> = {};
|
|
282
287
|
if (existsSync(settingsPath)) {
|
|
@@ -321,7 +326,7 @@ export class ClaudeCodeInstallProvider implements AdapterInstallProvider {
|
|
|
321
326
|
hooks.PreCompact = preCompactEntries;
|
|
322
327
|
settings.hooks = hooks;
|
|
323
328
|
|
|
324
|
-
mkdirSync(
|
|
329
|
+
mkdirSync(claudeDir, { recursive: true });
|
|
325
330
|
writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
|
|
326
331
|
return true;
|
|
327
332
|
}
|