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.
- package/dist/adapters/cc-switch/common.d.ts +1 -1
- package/dist/adapters/cc-switch/common.d.ts.map +1 -1
- package/dist/adapters/cc-switch/index.d.ts +1 -0
- package/dist/adapters/cc-switch/index.d.ts.map +1 -1
- package/dist/adapters/cc-switch/index.js +5 -5
- package/dist/adapters/cc-switch/mcp-claudecode.d.ts.map +1 -1
- package/dist/adapters/cc-switch/mcp-claudecode.js +2 -3
- package/dist/adapters/cc-switch/mcp-claudecode.test.d.ts +2 -0
- package/dist/adapters/cc-switch/mcp-claudecode.test.d.ts.map +1 -0
- package/dist/adapters/cc-switch/mcp-claudecode.test.js +74 -0
- package/dist/adapters/cc-switch/mcp-opencode.d.ts.map +1 -1
- package/dist/adapters/cc-switch/mcp-opencode.js +3 -7
- package/dist/adapters/cc-switch/mcp-opencode.test.d.ts +2 -0
- package/dist/adapters/cc-switch/mcp-opencode.test.d.ts.map +1 -0
- package/dist/adapters/cc-switch/mcp-opencode.test.js +61 -0
- package/dist/adapters/cc-switch/skill-claude.d.ts +2 -7
- package/dist/adapters/cc-switch/skill-claude.d.ts.map +1 -1
- package/dist/adapters/cc-switch/skill-claude.js +3 -83
- package/dist/adapters/cc-switch/skill-claudecode.d.ts +2 -7
- package/dist/adapters/cc-switch/skill-claudecode.d.ts.map +1 -1
- package/dist/adapters/cc-switch/skill-claudecode.js +3 -83
- package/dist/adapters/cc-switch/skill-codex.d.ts +5 -0
- package/dist/adapters/cc-switch/skill-codex.d.ts.map +1 -0
- package/dist/adapters/cc-switch/skill-codex.js +6 -0
- package/dist/adapters/cc-switch/skill-directory.d.ts +10 -0
- package/dist/adapters/cc-switch/skill-directory.d.ts.map +1 -0
- package/dist/adapters/cc-switch/skill-directory.js +137 -0
- package/dist/adapters/cc-switch/skill-directory.test.d.ts +2 -0
- package/dist/adapters/cc-switch/skill-directory.test.d.ts.map +1 -0
- package/dist/adapters/cc-switch/skill-directory.test.js +73 -0
- package/dist/adapters/cc-switch/skill-opencode.d.ts +2 -7
- package/dist/adapters/cc-switch/skill-opencode.d.ts.map +1 -1
- package/dist/adapters/cc-switch/skill-opencode.js +3 -87
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -0
- package/dist/routes/instance.js +4 -5
- package/dist/routes/mcp.js +3 -2
- package/dist/routes/skills.js +3 -2
- package/dist/services/cc-switch-discovery.test.d.ts +2 -0
- package/dist/services/cc-switch-discovery.test.d.ts.map +1 -0
- package/dist/services/cc-switch-discovery.test.js +56 -0
- package/dist/services/cc-switch-sdk.d.ts +7 -2
- package/dist/services/cc-switch-sdk.d.ts.map +1 -1
- package/dist/services/cc-switch-sdk.js +15 -5
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/mcp-utils.d.ts.map +1 -1
- package/dist/utils/mcp-utils.js +6 -5
- package/node_modules/@cc-switch/sdk/dist/constants.d.ts.map +1 -1
- package/node_modules/@cc-switch/sdk/dist/constants.js +4 -2
- package/node_modules/@cc-switch/sdk/dist/sdk.d.ts.map +1 -1
- package/node_modules/@cc-switch/sdk/dist/sdk.js +20 -30
- package/node_modules/@cc-switch/sdk/dist/services/mcp-model.d.ts.map +1 -1
- package/node_modules/@cc-switch/sdk/dist/services/mcp-model.js +7 -4
- package/node_modules/@cc-switch/sdk/dist/services/skill-model.d.ts.map +1 -1
- package/node_modules/@cc-switch/sdk/dist/services/skill-model.js +7 -4
- package/node_modules/@cc-switch/sdk/dist/types.d.ts +1 -0
- package/node_modules/@cc-switch/sdk/dist/types.d.ts.map +1 -1
- package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts +1 -0
- package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts.map +1 -1
- package/node_modules/@cc-switch/sdk/dist/utils/fs.js +23 -0
- package/package/cc-switch-sdk/dist/constants.d.ts.map +1 -1
- package/package/cc-switch-sdk/dist/constants.js +4 -2
- package/package/cc-switch-sdk/dist/sdk.d.ts.map +1 -1
- package/package/cc-switch-sdk/dist/sdk.js +20 -30
- package/package/cc-switch-sdk/dist/services/mcp-model.d.ts.map +1 -1
- package/package/cc-switch-sdk/dist/services/mcp-model.js +7 -4
- package/package/cc-switch-sdk/dist/services/skill-model.d.ts.map +1 -1
- package/package/cc-switch-sdk/dist/services/skill-model.js +7 -4
- package/package/cc-switch-sdk/dist/types.d.ts +1 -0
- package/package/cc-switch-sdk/dist/types.d.ts.map +1 -1
- package/package/cc-switch-sdk/dist/utils/fs.d.ts +1 -0
- package/package/cc-switch-sdk/dist/utils/fs.d.ts.map +1 -1
- package/package/cc-switch-sdk/dist/utils/fs.js +23 -0
- 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 @@
|
|
|
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
|
|
7
|
-
export declare class OpenCodeSkillAdapter
|
|
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,
|
|
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
|
-
|
|
7
|
-
|
|
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
|
-
|
|
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
|
/**
|
package/dist/config.d.ts.map
CHANGED
|
@@ -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() ||
|
package/dist/routes/instance.js
CHANGED
|
@@ -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
|
|
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:
|
|
146
|
-
skills:
|
|
144
|
+
mcpServers: imported.mcpServers,
|
|
145
|
+
skills: imported.skills,
|
|
147
146
|
},
|
|
148
147
|
state: { ...state, toolStatus },
|
|
149
148
|
});
|
package/dist/routes/mcp.js
CHANGED
|
@@ -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;
|
package/dist/routes/skills.js
CHANGED
|
@@ -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 @@
|
|
|
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 {
|
|
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,
|
|
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 {
|
|
8
|
+
import { AiConfigService, CcSwitchSdk } from '@cc-switch/sdk';
|
|
9
9
|
import { createMcpAdapters, createSkillAdapters } from '../adapters/cc-switch/index.js';
|
|
10
|
-
import {
|
|
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.
|
|
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:
|
|
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:
|
|
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
|
}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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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"}
|