aws-runtime-bridge 1.1.11 → 1.2.0

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 (76) hide show
  1. package/dist/adapters/cc-switch/common.d.ts +1 -1
  2. package/dist/adapters/cc-switch/common.d.ts.map +1 -1
  3. package/dist/adapters/cc-switch/index.d.ts +1 -0
  4. package/dist/adapters/cc-switch/index.d.ts.map +1 -1
  5. package/dist/adapters/cc-switch/index.js +5 -5
  6. package/dist/adapters/cc-switch/mcp-claudecode.d.ts.map +1 -1
  7. package/dist/adapters/cc-switch/mcp-claudecode.js +2 -3
  8. package/dist/adapters/cc-switch/mcp-claudecode.test.d.ts +2 -0
  9. package/dist/adapters/cc-switch/mcp-claudecode.test.d.ts.map +1 -0
  10. package/dist/adapters/cc-switch/mcp-claudecode.test.js +74 -0
  11. package/dist/adapters/cc-switch/mcp-opencode.d.ts.map +1 -1
  12. package/dist/adapters/cc-switch/mcp-opencode.js +3 -7
  13. package/dist/adapters/cc-switch/mcp-opencode.test.d.ts +2 -0
  14. package/dist/adapters/cc-switch/mcp-opencode.test.d.ts.map +1 -0
  15. package/dist/adapters/cc-switch/mcp-opencode.test.js +61 -0
  16. package/dist/adapters/cc-switch/skill-claude.d.ts +2 -7
  17. package/dist/adapters/cc-switch/skill-claude.d.ts.map +1 -1
  18. package/dist/adapters/cc-switch/skill-claude.js +3 -83
  19. package/dist/adapters/cc-switch/skill-claudecode.d.ts +2 -7
  20. package/dist/adapters/cc-switch/skill-claudecode.d.ts.map +1 -1
  21. package/dist/adapters/cc-switch/skill-claudecode.js +3 -83
  22. package/dist/adapters/cc-switch/skill-codex.d.ts +5 -0
  23. package/dist/adapters/cc-switch/skill-codex.d.ts.map +1 -0
  24. package/dist/adapters/cc-switch/skill-codex.js +6 -0
  25. package/dist/adapters/cc-switch/skill-directory.d.ts +10 -0
  26. package/dist/adapters/cc-switch/skill-directory.d.ts.map +1 -0
  27. package/dist/adapters/cc-switch/skill-directory.js +137 -0
  28. package/dist/adapters/cc-switch/skill-directory.test.d.ts +2 -0
  29. package/dist/adapters/cc-switch/skill-directory.test.d.ts.map +1 -0
  30. package/dist/adapters/cc-switch/skill-directory.test.js +73 -0
  31. package/dist/adapters/cc-switch/skill-opencode.d.ts +2 -7
  32. package/dist/adapters/cc-switch/skill-opencode.d.ts.map +1 -1
  33. package/dist/adapters/cc-switch/skill-opencode.js +3 -87
  34. package/dist/config.d.ts +2 -0
  35. package/dist/config.d.ts.map +1 -1
  36. package/dist/config.js +5 -0
  37. package/dist/routes/instance.js +4 -5
  38. package/dist/routes/mcp.js +3 -2
  39. package/dist/routes/skills.js +3 -2
  40. package/dist/services/cc-switch-discovery.test.d.ts +2 -0
  41. package/dist/services/cc-switch-discovery.test.d.ts.map +1 -0
  42. package/dist/services/cc-switch-discovery.test.js +56 -0
  43. package/dist/services/cc-switch-sdk.d.ts +7 -2
  44. package/dist/services/cc-switch-sdk.d.ts.map +1 -1
  45. package/dist/services/cc-switch-sdk.js +15 -5
  46. package/dist/types.d.ts +2 -0
  47. package/dist/types.d.ts.map +1 -1
  48. package/dist/utils/mcp-utils.d.ts.map +1 -1
  49. package/dist/utils/mcp-utils.js +6 -5
  50. package/node_modules/@cc-switch/sdk/dist/constants.d.ts.map +1 -1
  51. package/node_modules/@cc-switch/sdk/dist/constants.js +4 -2
  52. package/node_modules/@cc-switch/sdk/dist/sdk.d.ts.map +1 -1
  53. package/node_modules/@cc-switch/sdk/dist/sdk.js +20 -30
  54. package/node_modules/@cc-switch/sdk/dist/services/mcp-model.d.ts.map +1 -1
  55. package/node_modules/@cc-switch/sdk/dist/services/mcp-model.js +7 -4
  56. package/node_modules/@cc-switch/sdk/dist/services/skill-model.d.ts.map +1 -1
  57. package/node_modules/@cc-switch/sdk/dist/services/skill-model.js +7 -4
  58. package/node_modules/@cc-switch/sdk/dist/types.d.ts +1 -0
  59. package/node_modules/@cc-switch/sdk/dist/types.d.ts.map +1 -1
  60. package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts +1 -0
  61. package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts.map +1 -1
  62. package/node_modules/@cc-switch/sdk/dist/utils/fs.js +23 -0
  63. package/package/cc-switch-sdk/dist/constants.d.ts.map +1 -1
  64. package/package/cc-switch-sdk/dist/constants.js +4 -2
  65. package/package/cc-switch-sdk/dist/sdk.d.ts.map +1 -1
  66. package/package/cc-switch-sdk/dist/sdk.js +20 -30
  67. package/package/cc-switch-sdk/dist/services/mcp-model.d.ts.map +1 -1
  68. package/package/cc-switch-sdk/dist/services/mcp-model.js +7 -4
  69. package/package/cc-switch-sdk/dist/services/skill-model.d.ts.map +1 -1
  70. package/package/cc-switch-sdk/dist/services/skill-model.js +7 -4
  71. package/package/cc-switch-sdk/dist/types.d.ts +1 -0
  72. package/package/cc-switch-sdk/dist/types.d.ts.map +1 -1
  73. package/package/cc-switch-sdk/dist/utils/fs.d.ts +1 -0
  74. package/package/cc-switch-sdk/dist/utils/fs.d.ts.map +1 -1
  75. package/package/cc-switch-sdk/dist/utils/fs.js +23 -0
  76. package/package.json +1 -1
@@ -0,0 +1,137 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ async function ensureDir(dir) {
4
+ await fs.mkdir(dir, { recursive: true });
5
+ }
6
+ async function pathExists(target) {
7
+ try {
8
+ await fs.access(target);
9
+ return true;
10
+ }
11
+ catch (error) {
12
+ if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {
13
+ return false;
14
+ }
15
+ return false;
16
+ }
17
+ }
18
+ async function removeIfExists(target) {
19
+ await fs.rm(target, { recursive: true, force: true });
20
+ }
21
+ async function copyDir(source, target) {
22
+ await ensureDir(target);
23
+ const entries = await fs.readdir(source, { withFileTypes: true });
24
+ for (const entry of entries) {
25
+ const srcPath = path.join(source, entry.name);
26
+ const tgtPath = path.join(target, entry.name);
27
+ if (entry.isDirectory()) {
28
+ await copyDir(srcPath, tgtPath);
29
+ continue;
30
+ }
31
+ if (entry.isSymbolicLink()) {
32
+ const linkTarget = await fs.readlink(srcPath);
33
+ await fs.symlink(linkTarget, tgtPath, 'junction');
34
+ continue;
35
+ }
36
+ if (entry.isFile()) {
37
+ await fs.copyFile(srcPath, tgtPath);
38
+ }
39
+ }
40
+ }
41
+ function parseYamlStringValue(raw) {
42
+ const trimmed = raw.trim();
43
+ if (!trimmed) {
44
+ return undefined;
45
+ }
46
+ if ((trimmed.startsWith('"') && trimmed.endsWith('"')) ||
47
+ (trimmed.startsWith("'") && trimmed.endsWith("'"))) {
48
+ return trimmed.slice(1, -1).trim();
49
+ }
50
+ return trimmed;
51
+ }
52
+ function fallbackNameFromDirectory(directory) {
53
+ return path.basename(directory).replace(/\.skill$/, '').replace(/[-_]/g, ' ');
54
+ }
55
+ async function parseSkillMetadata(directory) {
56
+ const skillFile = path.join(directory, 'SKILL.md');
57
+ if (!(await pathExists(skillFile))) {
58
+ return null;
59
+ }
60
+ const raw = (await fs.readFile(skillFile, 'utf-8')).replace(/^\uFEFF/, '');
61
+ const metadata = {};
62
+ if (raw.startsWith('---')) {
63
+ const end = raw.indexOf('\n---', 3);
64
+ if (end >= 0) {
65
+ const frontMatter = raw.slice(3, end).split(/\r?\n/);
66
+ for (const line of frontMatter) {
67
+ const match = line.match(/^\s*(name|description)\s*:\s*(.*)$/);
68
+ if (!match) {
69
+ continue;
70
+ }
71
+ const value = parseYamlStringValue(match[2]);
72
+ if (value) {
73
+ metadata[match[1]] = value;
74
+ }
75
+ }
76
+ }
77
+ }
78
+ return {
79
+ name: metadata.name || fallbackNameFromDirectory(directory),
80
+ description: metadata.description,
81
+ };
82
+ }
83
+ async function materializeSkillDir(sourceDir, targetDir, method) {
84
+ await removeIfExists(targetDir);
85
+ await ensureDir(path.dirname(targetDir));
86
+ if (method === 'copy') {
87
+ await copyDir(sourceDir, targetDir);
88
+ return;
89
+ }
90
+ if (method === 'symlink') {
91
+ await fs.symlink(sourceDir, targetDir, 'junction');
92
+ return;
93
+ }
94
+ try {
95
+ await fs.symlink(sourceDir, targetDir, 'junction');
96
+ }
97
+ catch {
98
+ await copyDir(sourceDir, targetDir);
99
+ }
100
+ }
101
+ export class DirectorySkillAdapter {
102
+ constructor(appId, skillsDir) {
103
+ this.appId = appId;
104
+ this.skillsDir = skillsDir;
105
+ }
106
+ async importSkills() {
107
+ await ensureDir(this.skillsDir);
108
+ const entries = await fs.readdir(this.skillsDir, { withFileTypes: true });
109
+ const skills = [];
110
+ for (const entry of entries) {
111
+ if (entry.name.startsWith('.') ||
112
+ (!entry.isDirectory() && !entry.isSymbolicLink())) {
113
+ continue;
114
+ }
115
+ const directory = path.join(this.skillsDir, entry.name);
116
+ const metadata = await parseSkillMetadata(directory);
117
+ if (!metadata) {
118
+ continue;
119
+ }
120
+ skills.push({
121
+ id: `skill_import_${this.appId}_${entry.name}`,
122
+ name: metadata.name,
123
+ directory,
124
+ description: metadata.description,
125
+ });
126
+ }
127
+ return skills;
128
+ }
129
+ async syncSkill(skill, sourceDir, method) {
130
+ const targetDir = path.join(this.skillsDir, skill.name);
131
+ await materializeSkillDir(sourceDir, targetDir, method);
132
+ }
133
+ async removeSkill(skill) {
134
+ const targetDir = path.join(this.skillsDir, skill.name);
135
+ await removeIfExists(targetDir);
136
+ }
137
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=skill-directory.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-directory.test.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/skill-directory.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,73 @@
1
+ import { mkdir, mkdtemp, readFile, rm, symlink, writeFile } from 'node:fs/promises';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
+ import { DirectorySkillAdapter } from './skill-directory.js';
6
+ let tempDir;
7
+ let skillsDir;
8
+ async function writeSkill(directory, body) {
9
+ await mkdir(directory, { recursive: true });
10
+ await writeFile(path.join(directory, 'SKILL.md'), body, 'utf-8');
11
+ }
12
+ function buildSkill(name = 'frontend-design') {
13
+ return {
14
+ id: 'skill_test',
15
+ name,
16
+ directory: path.join(tempDir, 'source'),
17
+ description: 'A design skill',
18
+ apps: {
19
+ claude: false,
20
+ claudecode: true,
21
+ codex: false,
22
+ gemini: false,
23
+ opencode: false,
24
+ openclaw: false,
25
+ },
26
+ installedAt: Date.now(),
27
+ };
28
+ }
29
+ beforeEach(async () => {
30
+ tempDir = await mkdtemp(path.join(os.tmpdir(), 'skill-directory-adapter-'));
31
+ skillsDir = path.join(tempDir, 'skills');
32
+ });
33
+ afterEach(async () => {
34
+ await rm(tempDir, { recursive: true, force: true });
35
+ });
36
+ describe('DirectorySkillAdapter', () => {
37
+ it('imports only skill directories with SKILL.md and parses front matter', async () => {
38
+ await writeSkill(path.join(skillsDir, 'frontend-design'), '---\nname: Frontend Design\ndescription: Polished UI work\n---\n# Skill\n');
39
+ await mkdir(path.join(skillsDir, 'ordinary-folder'), { recursive: true });
40
+ await writeSkill(path.join(skillsDir, '.hidden-skill'), '---\nname: Hidden\n---\n');
41
+ const adapter = new DirectorySkillAdapter('claudecode', skillsDir);
42
+ const imported = await adapter.importSkills();
43
+ expect(imported).toHaveLength(1);
44
+ expect(imported[0]).toMatchObject({
45
+ id: 'skill_import_claudecode_frontend-design',
46
+ name: 'Frontend Design',
47
+ description: 'Polished UI work',
48
+ directory: path.join(skillsDir, 'frontend-design'),
49
+ });
50
+ });
51
+ it('imports symlinked skill directories', async () => {
52
+ const source = path.join(tempDir, 'linked-source');
53
+ await writeSkill(source, '---\nname: Linked Skill\n---\n# Skill\n');
54
+ await mkdir(skillsDir, { recursive: true });
55
+ await symlink(source, path.join(skillsDir, 'linked-skill'), 'junction');
56
+ const adapter = new DirectorySkillAdapter('opencode', skillsDir);
57
+ const imported = await adapter.importSkills();
58
+ expect(imported).toHaveLength(1);
59
+ expect(imported[0]?.name).toBe('Linked Skill');
60
+ });
61
+ it('syncs and removes skill directories', async () => {
62
+ const source = path.join(tempDir, 'source');
63
+ await writeSkill(source, '# Skill\n');
64
+ await writeFile(path.join(source, 'README.md'), 'hello', 'utf-8');
65
+ const adapter = new DirectorySkillAdapter('codex', skillsDir);
66
+ await adapter.syncSkill(buildSkill('copied-skill'), source, 'copy');
67
+ const copiedReadme = await readFile(path.join(skillsDir, 'copied-skill', 'README.md'), 'utf-8');
68
+ expect(copiedReadme).toBe('hello');
69
+ await adapter.removeSkill(buildSkill('copied-skill'));
70
+ const imported = await adapter.importSkills();
71
+ expect(imported).toHaveLength(0);
72
+ });
73
+ });
@@ -3,13 +3,8 @@
3
3
  *
4
4
  * 实现 ISkillAdapter 接口,负责 OpenCode 的 Skill 目录管理
5
5
  */
6
- import type { ISkillAdapter, InstalledSkill, SkillSyncMethod } from '@cc-switch/sdk';
7
- export declare class OpenCodeSkillAdapter implements ISkillAdapter {
8
- private readonly skillsDir;
9
- readonly appId: "opencode";
6
+ import { DirectorySkillAdapter } from './skill-directory.js';
7
+ export declare class OpenCodeSkillAdapter extends DirectorySkillAdapter {
10
8
  constructor(skillsDir: string);
11
- importSkills(): Promise<Array<Pick<InstalledSkill, "id" | "name" | "directory" | "description">>>;
12
- syncSkill(skill: InstalledSkill, sourceDir: string, method: SkillSyncMethod): Promise<void>;
13
- removeSkill(skill: InstalledSkill): Promise<void>;
14
9
  }
15
10
  //# sourceMappingURL=skill-opencode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skill-opencode.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/skill-opencode.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAwErF,qBAAa,oBAAqB,YAAW,aAAa;IAG5C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,SAAgB,KAAK,EAAG,UAAU,CAAU;gBAEf,SAAS,EAAE,MAAM;IAExC,YAAY,IAAI,OAAO,CAC3B,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,MAAM,GAAG,WAAW,GAAG,aAAa,CAAC,CAAC,CACzE;IAmBK,SAAS,CACb,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC;IAMV,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAKxD"}
1
+ {"version":3,"file":"skill-opencode.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/skill-opencode.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,qBAAa,oBAAqB,SAAQ,qBAAqB;gBACjD,SAAS,EAAE,MAAM;CAG9B"}
@@ -3,93 +3,9 @@
3
3
  *
4
4
  * 实现 ISkillAdapter 接口,负责 OpenCode 的 Skill 目录管理
5
5
  */
6
- async function ensureDir(dir) {
7
- const fs = await import('node:fs/promises');
8
- await fs.mkdir(dir, { recursive: true });
9
- }
10
- async function removeIfExists(target) {
11
- const fs = await import('node:fs/promises');
12
- try {
13
- await fs.rm(target, { recursive: true, force: true });
14
- }
15
- catch {
16
- // ignore
17
- }
18
- }
19
- async function copyDir(source, target) {
20
- const fs = await import('node:fs/promises');
21
- const path = await import('node:path');
22
- await ensureDir(target);
23
- const entries = await fs.readdir(source, { withFileTypes: true });
24
- for (const entry of entries) {
25
- const srcPath = path.join(source, entry.name);
26
- const tgtPath = path.join(target, entry.name);
27
- if (entry.isDirectory()) {
28
- await copyDir(srcPath, tgtPath);
29
- }
30
- else {
31
- await fs.copyFile(srcPath, tgtPath);
32
- }
33
- }
34
- }
35
- /**
36
- * 从路径提取 skill 名称
37
- */
38
- function toNameFromPath(pathStr) {
39
- const base = pathStr.split(/[/\\]/).pop() || pathStr;
40
- return base.replace(/\.skill$/, '').replace(/[-_]/g, ' ');
41
- }
42
- async function materializeSkillDir(sourceDir, targetDir, method) {
43
- const fs = await import('node:fs/promises');
44
- const path = await import('node:path');
45
- await removeIfExists(targetDir);
46
- await ensureDir(path.dirname(targetDir));
47
- if (method === "copy") {
48
- await copyDir(sourceDir, targetDir);
49
- return;
50
- }
51
- if (method === "symlink") {
52
- await fs.symlink(sourceDir, targetDir, "junction");
53
- return;
54
- }
55
- // auto: 先尝试 symlink,失败则 copy
56
- try {
57
- await fs.symlink(sourceDir, targetDir, "junction");
58
- }
59
- catch {
60
- await copyDir(sourceDir, targetDir);
61
- }
62
- }
63
- export class OpenCodeSkillAdapter {
6
+ import { DirectorySkillAdapter } from './skill-directory.js';
7
+ export class OpenCodeSkillAdapter extends DirectorySkillAdapter {
64
8
  constructor(skillsDir) {
65
- this.skillsDir = skillsDir;
66
- this.appId = "opencode";
67
- }
68
- async importSkills() {
69
- const fs = await import('node:fs/promises');
70
- const path = await import('node:path');
71
- await ensureDir(this.skillsDir);
72
- const entries = await fs.readdir(this.skillsDir, { withFileTypes: true });
73
- return entries
74
- .filter((entry) => entry.isDirectory() || entry.isSymbolicLink())
75
- .map((entry) => {
76
- const directory = path.join(this.skillsDir, entry.name);
77
- return {
78
- id: `skill_import_${entry.name}`,
79
- name: toNameFromPath(entry.name),
80
- directory,
81
- description: undefined,
82
- };
83
- });
84
- }
85
- async syncSkill(skill, sourceDir, method) {
86
- const path = await import('node:path');
87
- const targetDir = path.join(this.skillsDir, skill.name);
88
- await materializeSkillDir(sourceDir, targetDir, method);
89
- }
90
- async removeSkill(skill) {
91
- const path = await import('node:path');
92
- const targetDir = path.join(this.skillsDir, skill.name);
93
- await removeIfExists(targetDir);
9
+ super('opencode', skillsDir);
94
10
  }
95
11
  }
package/dist/config.d.ts CHANGED
@@ -33,6 +33,8 @@ export declare function getClaudeSkillsDir(runtimeHome: string): string;
33
33
  export declare function getOpencodeConfigFile(runtimeHome: string): string;
34
34
  /** 获取 Codex 配置文件路径 */
35
35
  export declare function getCodexConfigFile(runtimeHome: string): string;
36
+ /** 获取 Codex Skills 目录 */
37
+ export declare function getCodexSkillsDir(runtimeHome: string): string;
36
38
  /** 获取 OpenCode Skills 目录 */
37
39
  export declare function getOpencodeSkillsDir(runtimeHome: string): string;
38
40
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,WAAW;AACX,eAAO,MAAM,IAAI,EAAE,MAElB,CAAC;AAEF,gBAAgB;AAChB,eAAO,MAAM,gBAAgB,EAAE,MACwC,CAAC;AAExE,oBAAoB;AACpB,eAAO,MAAM,8BAA8B,gCAAgC,CAAC;AAE5E,cAAc;AACd,eAAO,MAAM,OAAO,EAAE,MAA8C,CAAC;AAErE,kBAAkB;AAClB,eAAO,MAAM,YAAY,EAAE,MAC+C,CAAC;AAE3E,2BAA2B;AAC3B,eAAO,MAAM,wBAAwB,EAAE,OACiB,CAAC;AAEzD,oCAAoC;AACpC,eAAO,MAAM,oBAAoB,EAAE,OACiB,CAAC;AAErD,8BAA8B;AAC9B,eAAO,MAAM,kBAAkB,EAAE,MAAM,EAMC,CAAC;AAEzC,uBAAuB;AACvB,wBAAgB,uBAAuB,IAAI,IAAI,CAc9C;AAED,eAAe;AACf,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,8CAA8C;AAC9C,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK/D;AAED,2BAA2B;AAC3B,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAKlE;AAED,0BAA0B;AAC1B,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED,yBAAyB;AACzB,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED,sBAAsB;AACtB,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED,4BAA4B;AAC5B,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAKhE;AAED;;GAEG;AAEH,yBAAyB;AACzB,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,sBAAsB,EACrB,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE1C,eAAe;AACf,eAAO,MAAM,mBAAmB,SACiB,CAAC;AAElD,iCAAiC;AACjC,eAAO,MAAM,2BAA2B,QAEvC,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,uBAAuB,QAEnC,CAAC;AAEF;;GAEG;AAEH,eAAe;AACf,eAAO,MAAM,qBAAqB,SAA2C,CAAC;AAE9E,YAAY;AACZ,eAAO,MAAM,uBAAuB,QAAkC,CAAC;AAEvE,iBAAiB;AACjB,eAAO,MAAM,sBAAsB,QAAiC,CAAC;AAErE,oBAAoB;AACpB,eAAO,MAAM,2BAA2B,QAAsC,CAAC;AAE/E,WAAW;AACX,eAAO,MAAM,0BAA0B,QAAqC,CAAC;AAE7E,WAAW;AACX,eAAO,MAAM,uBAAuB,QAAkC,CAAC;AAEvE,aAAa;AACb,eAAO,MAAM,4BAA4B,QACH,CAAC;AAEvC,kCAAkC;AAClC,eAAO,MAAM,wBAAwB,QAC4B,CAAC;AAElE,aAAa;AACb,eAAO,MAAM,yBAAyB,QAErC,CAAC;AAEF,iBAAiB;AACjB,eAAO,MAAM,4BAA4B,QAExC,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,WAAW;AACX,eAAO,MAAM,IAAI,EAAE,MAElB,CAAC;AAEF,gBAAgB;AAChB,eAAO,MAAM,gBAAgB,EAAE,MACwC,CAAC;AAExE,oBAAoB;AACpB,eAAO,MAAM,8BAA8B,gCAAgC,CAAC;AAE5E,cAAc;AACd,eAAO,MAAM,OAAO,EAAE,MAA8C,CAAC;AAErE,kBAAkB;AAClB,eAAO,MAAM,YAAY,EAAE,MAC+C,CAAC;AAE3E,2BAA2B;AAC3B,eAAO,MAAM,wBAAwB,EAAE,OACiB,CAAC;AAEzD,oCAAoC;AACpC,eAAO,MAAM,oBAAoB,EAAE,OACiB,CAAC;AAErD,8BAA8B;AAC9B,eAAO,MAAM,kBAAkB,EAAE,MAAM,EAMC,CAAC;AAEzC,uBAAuB;AACvB,wBAAgB,uBAAuB,IAAI,IAAI,CAc9C;AAED,eAAe;AACf,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,8CAA8C;AAC9C,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK/D;AAED,2BAA2B;AAC3B,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAKlE;AAED,0BAA0B;AAC1B,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED,yBAAyB;AACzB,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED,sBAAsB;AACtB,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED,yBAAyB;AACzB,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK7D;AAED,4BAA4B;AAC5B,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAKhE;AAED;;GAEG;AAEH,yBAAyB;AACzB,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,sBAAsB,EACrB,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE1C,eAAe;AACf,eAAO,MAAM,mBAAmB,SACiB,CAAC;AAElD,iCAAiC;AACjC,eAAO,MAAM,2BAA2B,QAEvC,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,uBAAuB,QAEnC,CAAC;AAEF;;GAEG;AAEH,eAAe;AACf,eAAO,MAAM,qBAAqB,SAA2C,CAAC;AAE9E,YAAY;AACZ,eAAO,MAAM,uBAAuB,QAAkC,CAAC;AAEvE,iBAAiB;AACjB,eAAO,MAAM,sBAAsB,QAAiC,CAAC;AAErE,oBAAoB;AACpB,eAAO,MAAM,2BAA2B,QAAsC,CAAC;AAE/E,WAAW;AACX,eAAO,MAAM,0BAA0B,QAAqC,CAAC;AAE7E,WAAW;AACX,eAAO,MAAM,uBAAuB,QAAkC,CAAC;AAEvE,aAAa;AACb,eAAO,MAAM,4BAA4B,QACH,CAAC;AAEvC,kCAAkC;AAClC,eAAO,MAAM,wBAAwB,QAC4B,CAAC;AAElE,aAAa;AACb,eAAO,MAAM,yBAAyB,QAErC,CAAC;AAEF,iBAAiB;AACjB,eAAO,MAAM,4BAA4B,QAExC,CAAC"}
package/dist/config.js CHANGED
@@ -66,6 +66,11 @@ export function getCodexConfigFile(runtimeHome) {
66
66
  return (String(process.env.AWS_RUNTIME_CODEX_CONFIG_FILE || "").trim() ||
67
67
  path.join(runtimeHome, ".codex", "config.toml"));
68
68
  }
69
+ /** 获取 Codex Skills 目录 */
70
+ export function getCodexSkillsDir(runtimeHome) {
71
+ return (String(process.env.AWS_RUNTIME_CODEX_SKILLS_DIR || "").trim() ||
72
+ path.join(runtimeHome, ".codex", "skills"));
73
+ }
69
74
  /** 获取 OpenCode Skills 目录 */
70
75
  export function getOpencodeSkillsDir(runtimeHome) {
71
76
  return (String(process.env.AWS_RUNTIME_OPENCODE_SKILLS_DIR || "").trim() ||
@@ -5,7 +5,7 @@ import { validateToken } from "../middleware/auth.js";
5
5
  import { schedulerBaseUrl, runtimeToken } from "../config.js";
6
6
  import { loadInstanceState, saveInstanceState, } from "../services/instance-state.js";
7
7
  import { initInstance } from "../services/instance-init-service.js";
8
- import { loadCcSwitchSdk } from "../services/cc-switch-sdk.js";
8
+ import { discoverCcSwitchConfiguredItems, loadCcSwitchSdk } from "../services/cc-switch-sdk.js";
9
9
  import { syncLegacyStateFromSdk } from "../services/instance-init-service.js";
10
10
  import { detectToolStatuses, ensureToolsInstalled, SUPPORTED_INSTALLABLE_TOOLS, } from "../services/tool-installer.js";
11
11
  import { getConfiguredConnectionKeys } from "../services/auto-register.js";
@@ -133,8 +133,7 @@ instanceRouter.post("/cc-switch/state", validateToken, async (req, res) => {
133
133
  }
134
134
  try {
135
135
  const sdk = await loadCcSwitchSdk(agentId);
136
- const importedMcpCount = await sdk.importMcpFromApps();
137
- const importedSkillCount = await sdk.importSkillsFromApps();
136
+ const imported = await discoverCcSwitchConfiguredItems(sdk);
138
137
  const synced = await syncLegacyStateFromSdk(agentId, sdk);
139
138
  const state = synced.state;
140
139
  const toolStatus = await detectToolStatuses(state.enabledTools || []);
@@ -142,8 +141,8 @@ instanceRouter.post("/cc-switch/state", validateToken, async (req, res) => {
142
141
  ok: true,
143
142
  agentId: String(agentId),
144
143
  imported: {
145
- mcpServers: importedMcpCount,
146
- skills: importedSkillCount,
144
+ mcpServers: imported.mcpServers,
145
+ skills: imported.skills,
147
146
  },
148
147
  state: { ...state, toolStatus },
149
148
  });
@@ -1,6 +1,6 @@
1
1
  import { Router } from 'express';
2
2
  import { validateToken } from '../middleware/auth.js';
3
- import { loadCcSwitchSdk, runCcSwitchAdapter } from '../services/cc-switch-sdk.js';
3
+ import { discoverCcSwitchConfiguredItems, loadCcSwitchSdk, runCcSwitchAdapter } from '../services/cc-switch-sdk.js';
4
4
  import { syncLegacyStateFromSdk } from '../services/instance-init-service.js';
5
5
  import { normalizeSdkAppFlags, normalizeSdkMcpServerSpec } from '../utils/mcp-utils.js';
6
6
  export const mcpRouter = Router();
@@ -13,9 +13,10 @@ mcpRouter.post('/cc-switch/mcp/list', validateToken, async (req, res) => {
13
13
  }
14
14
  try {
15
15
  const sdk = await loadCcSwitchSdk(agentId);
16
+ const imported = await discoverCcSwitchConfiguredItems(sdk);
16
17
  const mcpServers = sdk.getAllMcpServers();
17
18
  const synced = await syncLegacyStateFromSdk(agentId, sdk);
18
- res.json({ ok: true, agentId: String(agentId), mcpServers, state: synced.state, configPath: synced.configPath });
19
+ res.json({ ok: true, agentId: String(agentId), imported, mcpServers, state: synced.state, configPath: synced.configPath });
19
20
  }
20
21
  catch (error) {
21
22
  const err = error;
@@ -1,6 +1,6 @@
1
1
  import { Router } from 'express';
2
2
  import { validateToken } from '../middleware/auth.js';
3
- import { loadCcSwitchSdk, runCcSwitchAdapter } from '../services/cc-switch-sdk.js';
3
+ import { discoverCcSwitchConfiguredItems, loadCcSwitchSdk, runCcSwitchAdapter } from '../services/cc-switch-sdk.js';
4
4
  import { syncLegacyStateFromSdk } from '../services/instance-init-service.js';
5
5
  import { resolveSkillSourceDir, ensureDirectoryExists } from '../utils/file-utils.js';
6
6
  import { normalizeSdkAppFlags } from '../utils/mcp-utils.js';
@@ -14,9 +14,10 @@ skillsRouter.post('/cc-switch/skills/list', validateToken, async (req, res) => {
14
14
  }
15
15
  try {
16
16
  const sdk = await loadCcSwitchSdk(agentId);
17
+ const imported = await discoverCcSwitchConfiguredItems(sdk);
17
18
  const skills = sdk.getAllSkills();
18
19
  const synced = await syncLegacyStateFromSdk(agentId, sdk);
19
- res.json({ ok: true, agentId: String(agentId), skills, state: synced.state });
20
+ res.json({ ok: true, agentId: String(agentId), imported, skills, state: synced.state });
20
21
  }
21
22
  catch (error) {
22
23
  const err = error;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cc-switch-discovery.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cc-switch-discovery.test.d.ts","sourceRoot":"","sources":["../../src/services/cc-switch-discovery.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,56 @@
1
+ import { mkdir, mkdtemp, readFile, readdir, rm, writeFile } from 'node:fs/promises';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
+ import { discoverCcSwitchConfiguredItems, loadCcSwitchSdk } from './cc-switch-sdk.js';
6
+ import { getAgentInitRoot } from './instance-state.js';
7
+ import { syncLegacyStateFromSdk } from './instance-init-service.js';
8
+ describe('CC Switch discovery flow', () => {
9
+ const previousRuntimeHome = process.env.AWS_RUNTIME_HOME_DIR;
10
+ let runtimeHome = '';
11
+ let agentId = '';
12
+ beforeEach(async () => {
13
+ runtimeHome = await mkdtemp(path.join(os.tmpdir(), 'cc-switch-discovery-runtime-'));
14
+ agentId = `agent-discovery-${Date.now()}-${Math.random().toString(36).slice(2)}`;
15
+ process.env.AWS_RUNTIME_HOME_DIR = runtimeHome;
16
+ });
17
+ afterEach(async () => {
18
+ if (previousRuntimeHome === undefined) {
19
+ delete process.env.AWS_RUNTIME_HOME_DIR;
20
+ }
21
+ else {
22
+ process.env.AWS_RUNTIME_HOME_DIR = previousRuntimeHome;
23
+ }
24
+ await rm(runtimeHome, { recursive: true, force: true });
25
+ if (agentId) {
26
+ await rm(getAgentInitRoot(agentId), { recursive: true, force: true });
27
+ }
28
+ });
29
+ it('discovers configured MCP and Skill items into instance state without rewriting source app files', async () => {
30
+ const opencodeConfigPath = path.join(runtimeHome, '.config', 'opencode', 'opencode.json');
31
+ const codexSkillDir = path.join(runtimeHome, '.codex', 'skills', 'codex-review');
32
+ const opencodeConfig = {
33
+ theme: 'dark',
34
+ mcpServers: {
35
+ 'legacy-opencode': {
36
+ type: 'remote',
37
+ url: 'http://localhost:9999/sse',
38
+ },
39
+ },
40
+ };
41
+ await mkdir(path.dirname(opencodeConfigPath), { recursive: true });
42
+ await writeFile(opencodeConfigPath, JSON.stringify(opencodeConfig, null, 2), 'utf-8');
43
+ await mkdir(codexSkillDir, { recursive: true });
44
+ await writeFile(path.join(codexSkillDir, 'SKILL.md'), '---\nname: Codex Review\ndescription: Review code with Codex\n---\n# Skill\n', 'utf-8');
45
+ const beforeOpencodeRaw = await readFile(opencodeConfigPath, 'utf-8');
46
+ const beforeCodexEntries = await readdir(path.dirname(codexSkillDir));
47
+ const sdk = await loadCcSwitchSdk(agentId);
48
+ const imported = await discoverCcSwitchConfiguredItems(sdk);
49
+ const synced = await syncLegacyStateFromSdk(agentId, sdk);
50
+ expect(imported).toEqual({ mcpServers: 1, skills: 1 });
51
+ expect(synced.state.mcpServers.some((item) => item.name === 'legacy-opencode')).toBe(true);
52
+ expect(synced.state.skills.some((item) => item.name === 'Codex Review')).toBe(true);
53
+ expect(await readFile(opencodeConfigPath, 'utf-8')).toBe(beforeOpencodeRaw);
54
+ expect(await readdir(path.dirname(codexSkillDir))).toEqual(beforeCodexEntries);
55
+ });
56
+ });
@@ -4,12 +4,17 @@
4
4
  * 负责创建 SDK 实例并注入 adapters。
5
5
  * adapters 实现在 src/adapters/cc-switch/ 中。
6
6
  */
7
- import { CcSwitchSdk, AiConfigService, type AppFlags } from '@cc-switch/sdk';
8
- import { InstanceService } from './instance-service.js';
7
+ import { AiConfigService, CcSwitchSdk, type AppFlags } from '@cc-switch/sdk';
9
8
  import type { CcSwitchAppPaths, AdapterResult, SdkApps } from '../types.js';
9
+ import { InstanceService } from './instance-service.js';
10
10
  export declare function getCcSwitchAppPaths(): CcSwitchAppPaths;
11
11
  export declare function getCcSwitchSdk(agentId: string): CcSwitchSdk;
12
12
  export declare function loadCcSwitchSdk(agentId: string): Promise<CcSwitchSdk>;
13
+ export interface CcSwitchDiscoveryResult {
14
+ mcpServers: number;
15
+ skills: number;
16
+ }
17
+ export declare function discoverCcSwitchConfiguredItems(sdk: CcSwitchSdk): Promise<CcSwitchDiscoveryResult>;
13
18
  export declare function getAiConfigService(): AiConfigService;
14
19
  export declare function getInstanceService(agentId: string, workspacePath: string): InstanceService;
15
20
  export declare function runCcSwitchAdapter(action: string, agentId: string, payload: unknown, sdk?: CcSwitchSdk): Promise<AdapterResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"cc-switch-sdk.d.ts","sourceRoot":"","sources":["../../src/services/cc-switch-sdk.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAc,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAWzF,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE5E,wBAAgB,mBAAmB,IAAI,gBAAgB,CAWtD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CA8B3D;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAI3E;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CAOpD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,eAAe,CAI1F;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,GAAG,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,aAAa,CAAC,CAgBxB;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,QAAQ,CAW1E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,QAAQ,CAmB7D"}
1
+ {"version":3,"file":"cc-switch-sdk.d.ts","sourceRoot":"","sources":["../../src/services/cc-switch-sdk.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAc,MAAM,gBAAgB,CAAC;AAYzF,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE5E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,wBAAgB,mBAAmB,IAAI,gBAAgB,CAatD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CA+B3D;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAI3E;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,+BAA+B,CACnD,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,uBAAuB,CAAC,CAOlC;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CAOpD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,eAAe,CAI1F;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,GAAG,CAAC,EAAE,WAAW,GAChB,OAAO,CAAC,aAAa,CAAC,CAgBxB;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,QAAQ,CAW1E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,QAAQ,CAmB7D"}
@@ -5,9 +5,9 @@
5
5
  * adapters 实现在 src/adapters/cc-switch/ 中。
6
6
  */
7
7
  import path from 'node:path';
8
- import { CcSwitchSdk, AiConfigService } from '@cc-switch/sdk';
8
+ import { AiConfigService, CcSwitchSdk } from '@cc-switch/sdk';
9
9
  import { createMcpAdapters, createSkillAdapters } from '../adapters/cc-switch/index.js';
10
- import { getCodexConfigFile, getRuntimeHomeDir, getClaudeConfigFile, getClaudeSkillsDir, getOpencodeConfigFile, getOpencodeSkillsDir, } from '../config.js';
10
+ import { getClaudeConfigFile, getClaudeMcpConfigFile, getClaudeSkillsDir, getCodexConfigFile, getCodexSkillsDir, getRuntimeHomeDir, getOpencodeConfigFile, getOpencodeSkillsDir, } from '../config.js';
11
11
  import { getAgentInitRoot } from './instance-state.js';
12
12
  import { InstanceService } from './instance-service.js';
13
13
  export function getCcSwitchAppPaths() {
@@ -15,8 +15,10 @@ export function getCcSwitchAppPaths() {
15
15
  return {
16
16
  runtimeHome,
17
17
  claudeConfigFile: path.resolve(getClaudeConfigFile(runtimeHome)),
18
+ claudeMcpConfigFile: path.resolve(getClaudeMcpConfigFile(runtimeHome)),
18
19
  claudeSkillsDir: path.resolve(getClaudeSkillsDir(runtimeHome)),
19
20
  codexConfigFile: path.resolve(getCodexConfigFile(runtimeHome)),
21
+ codexSkillsDir: path.resolve(getCodexSkillsDir(runtimeHome)),
20
22
  opencodeConfigFile: path.resolve(getOpencodeConfigFile(runtimeHome)),
21
23
  opencodeSkillsDir: path.resolve(getOpencodeSkillsDir(runtimeHome)),
22
24
  };
@@ -30,9 +32,10 @@ export function getCcSwitchSdk(agentId) {
30
32
  backupDir: path.join(sdkRoot, 'backups'),
31
33
  claudeConfigFile: appPaths.claudeConfigFile,
32
34
  claudeSkillsDir: appPaths.claudeSkillsDir,
33
- claudecodeConfigFile: appPaths.claudeConfigFile, // 使用 claude 路径
35
+ claudecodeConfigFile: appPaths.claudeMcpConfigFile,
34
36
  claudecodeSkillsDir: appPaths.claudeSkillsDir, // 使用 claude 路径
35
37
  codexConfigFile: appPaths.codexConfigFile,
38
+ codexSkillsDir: appPaths.codexSkillsDir,
36
39
  opencodeConfigFile: appPaths.opencodeConfigFile,
37
40
  opencodeSkillsDir: appPaths.opencodeSkillsDir,
38
41
  ssotSkillsDir: path.join(sdkRoot, 'skills'),
@@ -54,6 +57,13 @@ export async function loadCcSwitchSdk(agentId) {
54
57
  await sdk.load();
55
58
  return sdk;
56
59
  }
60
+ export async function discoverCcSwitchConfiguredItems(sdk) {
61
+ const [mcpServers, skills] = await Promise.all([
62
+ sdk.importMcpFromApps(),
63
+ sdk.importSkillsFromApps(),
64
+ ]);
65
+ return { mcpServers, skills };
66
+ }
57
67
  export function getAiConfigService() {
58
68
  const appPaths = getCcSwitchAppPaths();
59
69
  return new AiConfigService({
@@ -87,7 +97,7 @@ export function toSdkAppsFromEnabledTools(enabledTools) {
87
97
  const tools = Array.isArray(enabledTools) ? enabledTools : [];
88
98
  const includes = (name) => tools.includes(name);
89
99
  return {
90
- claude: includes('claude'),
100
+ claude: false,
91
101
  claudecode: includes('claudecode') || includes('claude'),
92
102
  codex: includes('codex'),
93
103
  gemini: includes('gemini'),
@@ -107,7 +117,7 @@ export function toSdkApps(apps) {
107
117
  };
108
118
  }
109
119
  return {
110
- claude: Boolean(apps.claude),
120
+ claude: false,
111
121
  claudecode: Boolean(apps.claudecode) || Boolean(apps.claude),
112
122
  codex: Boolean(apps.codex),
113
123
  gemini: Boolean(apps.gemini),
package/dist/types.d.ts CHANGED
@@ -139,8 +139,10 @@ export interface AiSourceApplyPayload {
139
139
  export interface CcSwitchAppPaths {
140
140
  runtimeHome: string;
141
141
  claudeConfigFile: string;
142
+ claudeMcpConfigFile: string;
142
143
  claudeSkillsDir: string;
143
144
  codexConfigFile: string;
145
+ codexSkillsDir: string;
144
146
  opencodeConfigFile: string;
145
147
  opencodeSkillsDir: string;
146
148
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}