@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.
@@ -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;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"}
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.49",
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/contracts": "2026.5.49",
19
- "@cleocode/paths": "2026.5.49",
20
- "@cleocode/caamp": "2026.5.49"
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.49"
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/.cleo/cant');
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/cleo/cant');
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/cleo/cant');
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
- // Suppress unused-var lint on Windows (USERPROFILE pathway not exercised here).
37
- void fakeHome;
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(homedir(), '.claude', 'settings.json');
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 home = homedir();
179
- const settingsPath = join(home, '.claude', 'settings.json');
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(join(home, '.claude'), { recursive: true });
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 home = homedir();
236
- const hooksDir = join(home, '.claude', 'hooks');
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 home = homedir();
279
- const settingsPath = join(home, '.claude', 'settings.json');
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(join(home, '.claude'), { recursive: true });
329
+ mkdirSync(claudeDir, { recursive: true });
325
330
  writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
326
331
  return true;
327
332
  }