@jesonliu/lark-claudecode-bridge 0.18.0 → 0.19.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/README.md +5 -3
- package/assets/web/css/main.css +2 -0
- package/assets/web/js/main.js +3 -1
- package/assets/web/js/pages/mcp.js +229 -0
- package/assets/web/js/pages/skills.js +169 -0
- package/assets/web/js/pages/workspaces.js +23 -2
- package/dist/bin/lcb.js +5 -0
- package/dist/bin/lcb.js.map +1 -1
- package/dist/config.js +33 -7
- package/dist/config.js.map +1 -1
- package/dist/executor/notify-server.d.ts +13 -0
- package/dist/executor/notify-server.js +60 -4
- package/dist/executor/notify-server.js.map +1 -1
- package/dist/executor/plugin-discovery.d.ts +6 -0
- package/dist/executor/plugin-discovery.js +14 -0
- package/dist/executor/plugin-discovery.js.map +1 -1
- package/dist/gateway/card-builder.d.ts +24 -26
- package/dist/gateway/card-builder.js +79 -109
- package/dist/gateway/card-builder.js.map +1 -1
- package/dist/gateway/feishu-gateway.d.ts +10 -0
- package/dist/gateway/feishu-gateway.js +48 -0
- package/dist/gateway/feishu-gateway.js.map +1 -1
- package/dist/gateway/progress-card.d.ts +26 -0
- package/dist/gateway/progress-card.js +68 -4
- package/dist/gateway/progress-card.js.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.js +174 -71
- package/dist/index.js.map +1 -1
- package/dist/notify-sop.d.ts +1 -0
- package/dist/notify-sop.js +30 -0
- package/dist/notify-sop.js.map +1 -0
- package/dist/types.d.ts +14 -2
- package/dist/util/log-tee.d.ts +4 -0
- package/dist/util/log-tee.js +99 -0
- package/dist/util/log-tee.js.map +1 -0
- package/dist/util/runtime-dirs.d.ts +4 -0
- package/dist/util/runtime-dirs.js +27 -0
- package/dist/util/runtime-dirs.js.map +1 -0
- package/dist/web/lifecycle.d.ts +4 -1
- package/dist/web/lifecycle.js +11 -25
- package/dist/web/lifecycle.js.map +1 -1
- package/dist/web/server.js +311 -11
- package/dist/web/server.js.map +1 -1
- package/dist/web/skills-mcp-api.d.ts +113 -0
- package/dist/web/skills-mcp-api.js +312 -0
- package/dist/web/skills-mcp-api.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/** skill 来源:machine-user = 本机 ~/.claude/skills;bridge = bridge 自管目录(managed 生效);
|
|
2
|
+
* project = 工作区 .claude/skills(workspaceName 标注归属);plugin = 已装插件目录内
|
|
3
|
+
* <plugin-installPath>/skills(pluginName 标注归属 + pluginEnabled 标注启用状态) */
|
|
4
|
+
export type SkillSource = 'machine-user' | 'bridge' | 'project' | 'plugin';
|
|
5
|
+
/** 插件简表(server.ts 注入扫描层用;插件 installPath 已存在则参与 skill/mcp 聚合) */
|
|
6
|
+
export interface PluginLite {
|
|
7
|
+
name: string;
|
|
8
|
+
path: string;
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface SkillSummary {
|
|
12
|
+
/** 目录名 = skill name(约束:与 SKILL.md frontmatter.name 一致,目录名作主键以兼容历史目录式布局) */
|
|
13
|
+
name: string;
|
|
14
|
+
/** SKILL.md frontmatter 的 description(缺省空串) */
|
|
15
|
+
description: string;
|
|
16
|
+
/** skill 所在目录绝对路径 */
|
|
17
|
+
path: string;
|
|
18
|
+
source: SkillSource;
|
|
19
|
+
/** project 来源时的工作区名(前端标签展示「项目级 · <名>」) */
|
|
20
|
+
workspaceName?: string;
|
|
21
|
+
/** plugin 来源时的插件名(前端标签展示「插件 · <名>」) */
|
|
22
|
+
pluginName?: string;
|
|
23
|
+
/** plugin 来源时的启用状态(前端 chip 在未启用时追加「(未启用)」) */
|
|
24
|
+
pluginEnabled?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/** 简单 frontmatter 解析:仅取 name / description 两个键,避开 yaml 依赖;非法格式返回空字段 */
|
|
27
|
+
export declare function parseSkillFrontmatter(md: string): {
|
|
28
|
+
name?: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* 扫描单个 skills 目录,列出 SKILL.md frontmatter 摘要。
|
|
33
|
+
* 缺目录返回空数组(用户首次访问功能时优雅呈现「暂无 skill」而非报错)
|
|
34
|
+
*/
|
|
35
|
+
export declare function listSkills(rootDir: string, source: SkillSource, workspaceName?: string): SkillSummary[];
|
|
36
|
+
/** skill 三来源目录清单(server.ts 聚合调用;workspaces 由 config 提供) */
|
|
37
|
+
export declare function skillRoots(workspaces: Array<{
|
|
38
|
+
name: string;
|
|
39
|
+
path: string;
|
|
40
|
+
}>): Array<{
|
|
41
|
+
dir: string;
|
|
42
|
+
source: SkillSource;
|
|
43
|
+
workspaceName?: string;
|
|
44
|
+
}>;
|
|
45
|
+
/**
|
|
46
|
+
* 全量 skills 聚合(#12 + 插件来源补全):三目录来源 + 已装插件目录。
|
|
47
|
+
* 插件来源遍历 plugins,每个扫 `<plugin.path>/skills`,每条标 source=plugin + pluginName/pluginEnabled。
|
|
48
|
+
* 沿用 listSkills 单目录版做底;同名 skill 允许跨来源并存(删除按 source+workspaceName/pluginName 定位互不串扰)
|
|
49
|
+
*/
|
|
50
|
+
export declare function listAllSkills(workspaces: Array<{
|
|
51
|
+
name: string;
|
|
52
|
+
path: string;
|
|
53
|
+
}>, plugins: PluginLite[]): SkillSummary[];
|
|
54
|
+
/** skill 名合法字符:字母数字下划线连字符(与 SKILL.md frontmatter 约束一致,避开路径穿越) */
|
|
55
|
+
export declare const SKILL_NAME_RE: RegExp;
|
|
56
|
+
/** MCP server 来源:bridge = <CONFIG_DIR>/mcp/servers.json(页面管理 + 注入生效);
|
|
57
|
+
* machine-user = ~/.claude.json mcpServers(展示+可删,页面不再写入);project = 工作区 .mcp.json(只读);
|
|
58
|
+
* plugin = 已装插件目录内 <plugin-installPath>/.mcp.json(pluginName + pluginEnabled 同 skill) */
|
|
59
|
+
export type McpSource = 'bridge' | 'machine-user' | 'project' | 'plugin';
|
|
60
|
+
/** MCP server 入口(mcpServers[name] = { type?, command?, args?, env?, url?, ... }) */
|
|
61
|
+
export interface McpServerEntry {
|
|
62
|
+
name: string;
|
|
63
|
+
/** 原 JSON 值(type/command/args/env/url 等任意字段,原样回传前端供编辑) */
|
|
64
|
+
config: Record<string, unknown>;
|
|
65
|
+
source: McpSource;
|
|
66
|
+
/** project 来源时的工作区名 */
|
|
67
|
+
workspaceName?: string;
|
|
68
|
+
/** plugin 来源时的插件名 */
|
|
69
|
+
pluginName?: string;
|
|
70
|
+
/** plugin 来源时的启用状态 */
|
|
71
|
+
pluginEnabled?: boolean;
|
|
72
|
+
/** 所属配置文件绝对路径(前端展示) */
|
|
73
|
+
path: string;
|
|
74
|
+
}
|
|
75
|
+
/** bridge 自管 MCP 配置文件(页面添加统一落这里;executeTask 每任务现读注入 SDK) */
|
|
76
|
+
export declare const BRIDGE_MCP_JSON: string;
|
|
77
|
+
/** 本机用户级 Claude CLI 配置(mcpServers 字段;只展示+可删) */
|
|
78
|
+
export declare const USER_CLAUDE_JSON: string;
|
|
79
|
+
/** 解析 JSON 文件的 mcpServers 段;文件不存在/解析失败返回空(缺失不报错——首装常态) */
|
|
80
|
+
export declare function readMcpServersFromJsonFile(file: string): {
|
|
81
|
+
servers: Record<string, Record<string, unknown>>;
|
|
82
|
+
exists: boolean;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* 读取插件清单 .claude-plugin/plugin.json 内的 mcpServers 字段(Claude Code 插件规范的第二 MCP 位置——
|
|
86
|
+
* 独立 .mcp.json 之外的清单内嵌形态)。同一 plugin 两处都写时调用方需自行决定优先级。
|
|
87
|
+
*/
|
|
88
|
+
export declare function readPluginMcpFromManifest(pluginDir: string): {
|
|
89
|
+
servers: Record<string, Record<string, unknown>>;
|
|
90
|
+
exists: boolean;
|
|
91
|
+
};
|
|
92
|
+
/** 聚合 MCP 三来源清单(server.ts GET /api/mcp 调用;workspaces 由 config 提供,plugins 提供插件来源) */
|
|
93
|
+
export declare function listMcpServers(workspaces: Array<{
|
|
94
|
+
name: string;
|
|
95
|
+
path: string;
|
|
96
|
+
}>, plugins?: PluginLite[]): McpServerEntry[];
|
|
97
|
+
/** MCP server 名合法字符(避用 / \ 与空格等,与磁盘配置键兼容) */
|
|
98
|
+
export declare const MCP_NAME_RE: RegExp;
|
|
99
|
+
export type ParsedMcpCommand = {
|
|
100
|
+
ok: true;
|
|
101
|
+
name: string;
|
|
102
|
+
config: Record<string, unknown>;
|
|
103
|
+
} | {
|
|
104
|
+
ok: false;
|
|
105
|
+
error: string;
|
|
106
|
+
};
|
|
107
|
+
export declare function parseClaudeMcpAdd(cmd: string): ParsedMcpCommand;
|
|
108
|
+
/** 展开配置 env 值中的 ${VAR} 引用为进程当前环境值;未设置的变量保留原样并计入 missing
|
|
109
|
+
* (前端对 missing 项标注「未设置」——抽屉「同步展示环境变量当前配置的值」的数据源) */
|
|
110
|
+
export declare function resolveEnvRefs(env: Record<string, unknown> | undefined): {
|
|
111
|
+
resolved: Record<string, string>;
|
|
112
|
+
missing: string[];
|
|
113
|
+
};
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
// Skills / MCP 管理纯函数层(#12):
|
|
2
|
+
// - Skills 三来源:本机 ~/.claude/skills(用户级·本机)、bridge 自管 <CONFIG_DIR>/claude/skills
|
|
3
|
+
// (用户级·bridge,managed 模式生效目录)、各工作区 <ws>/.claude/skills(项目级)
|
|
4
|
+
// - MCP 三来源:bridge 自管 <CONFIG_DIR>/mcp/servers.json(页面可管理,executeTask 注入生效)、
|
|
5
|
+
// 本机 ~/.claude.json 的 mcpServers(用户级·本机,展示+可删)、各工作区 .mcp.json(项目级,只读)
|
|
6
|
+
// - claude mcp add / add-json 命令解析(页面「原生命令方式」添加)
|
|
7
|
+
// - env ${VAR} 引用展开(抽屉展示当前值)
|
|
8
|
+
// 本模块无 IO 副作用(读盘聚合由调用方注入目录),tests/web/skills-mcp-api.test.ts 直接单测
|
|
9
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
|
10
|
+
import { homedir } from 'node:os';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { DEFAULT_CLAUDE_DIR, MANAGED_CLAUDE_DIR } from '../claude-config.js';
|
|
13
|
+
import { CONFIG_DIR } from '../config.js';
|
|
14
|
+
/** 简单 frontmatter 解析:仅取 name / description 两个键,避开 yaml 依赖;非法格式返回空字段 */
|
|
15
|
+
export function parseSkillFrontmatter(md) {
|
|
16
|
+
if (!md.startsWith('---'))
|
|
17
|
+
return {};
|
|
18
|
+
const end = md.indexOf('\n---', 3);
|
|
19
|
+
if (end < 0)
|
|
20
|
+
return {};
|
|
21
|
+
const block = md.slice(3, end);
|
|
22
|
+
const out = {};
|
|
23
|
+
for (const line of block.split('\n')) {
|
|
24
|
+
const m = /^([A-Za-z_-][A-Za-z0-9_-]*)\s*:\s*(.*)$/.exec(line);
|
|
25
|
+
if (!m)
|
|
26
|
+
continue;
|
|
27
|
+
const key = m[1].toLowerCase();
|
|
28
|
+
const val = m[2].replace(/^["']|["']$/g, '').trim();
|
|
29
|
+
if (key === 'name' && val)
|
|
30
|
+
out.name = val;
|
|
31
|
+
else if (key === 'description' && val)
|
|
32
|
+
out.description = val;
|
|
33
|
+
}
|
|
34
|
+
return out;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 扫描单个 skills 目录,列出 SKILL.md frontmatter 摘要。
|
|
38
|
+
* 缺目录返回空数组(用户首次访问功能时优雅呈现「暂无 skill」而非报错)
|
|
39
|
+
*/
|
|
40
|
+
export function listSkills(rootDir, source, workspaceName) {
|
|
41
|
+
if (!existsSync(rootDir))
|
|
42
|
+
return [];
|
|
43
|
+
let entries;
|
|
44
|
+
try {
|
|
45
|
+
const raw = readdirSync(rootDir);
|
|
46
|
+
entries = [];
|
|
47
|
+
for (const n of raw) {
|
|
48
|
+
try {
|
|
49
|
+
if (statSync(join(rootDir, n.toString())).isDirectory())
|
|
50
|
+
entries.push(n.toString());
|
|
51
|
+
}
|
|
52
|
+
catch { /* 单条 stat 失败跳过 */ }
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
const out = [];
|
|
59
|
+
for (const name of entries) {
|
|
60
|
+
const skillPath = join(rootDir, name);
|
|
61
|
+
const mdPath = join(skillPath, 'SKILL.md');
|
|
62
|
+
if (!existsSync(mdPath))
|
|
63
|
+
continue;
|
|
64
|
+
let md;
|
|
65
|
+
try {
|
|
66
|
+
md = readFileSync(mdPath, 'utf8');
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const fm = parseSkillFrontmatter(md);
|
|
72
|
+
out.push({ name, description: fm.description ?? '', path: skillPath, source, ...(workspaceName ? { workspaceName } : {}) });
|
|
73
|
+
}
|
|
74
|
+
out.sort((a, b) => a.name.localeCompare(b.name));
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
/** skill 三来源目录清单(server.ts 聚合调用;workspaces 由 config 提供) */
|
|
78
|
+
export function skillRoots(workspaces) {
|
|
79
|
+
return [
|
|
80
|
+
{ dir: join(DEFAULT_CLAUDE_DIR, 'skills'), source: 'machine-user' },
|
|
81
|
+
{ dir: join(MANAGED_CLAUDE_DIR, 'skills'), source: 'bridge' },
|
|
82
|
+
...workspaces.map((w) => ({ dir: join(w.path, '.claude', 'skills'), source: 'project', workspaceName: w.name })),
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 全量 skills 聚合(#12 + 插件来源补全):三目录来源 + 已装插件目录。
|
|
87
|
+
* 插件来源遍历 plugins,每个扫 `<plugin.path>/skills`,每条标 source=plugin + pluginName/pluginEnabled。
|
|
88
|
+
* 沿用 listSkills 单目录版做底;同名 skill 允许跨来源并存(删除按 source+workspaceName/pluginName 定位互不串扰)
|
|
89
|
+
*/
|
|
90
|
+
export function listAllSkills(workspaces, plugins) {
|
|
91
|
+
const out = [];
|
|
92
|
+
for (const r of skillRoots(workspaces)) {
|
|
93
|
+
out.push(...listSkills(r.dir, r.source, r.workspaceName));
|
|
94
|
+
}
|
|
95
|
+
for (const p of plugins) {
|
|
96
|
+
for (const s of listSkills(join(p.path, 'skills'), 'plugin')) {
|
|
97
|
+
out.push({ ...s, pluginName: p.name, pluginEnabled: p.enabled });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return out;
|
|
101
|
+
}
|
|
102
|
+
/** skill 名合法字符:字母数字下划线连字符(与 SKILL.md frontmatter 约束一致,避开路径穿越) */
|
|
103
|
+
export const SKILL_NAME_RE = /^[A-Za-z0-9_-]{1,64}$/;
|
|
104
|
+
/** bridge 自管 MCP 配置文件(页面添加统一落这里;executeTask 每任务现读注入 SDK) */
|
|
105
|
+
export const BRIDGE_MCP_JSON = join(CONFIG_DIR, 'mcp', 'servers.json');
|
|
106
|
+
/** 本机用户级 Claude CLI 配置(mcpServers 字段;只展示+可删) */
|
|
107
|
+
export const USER_CLAUDE_JSON = join(homedir(), '.claude.json');
|
|
108
|
+
/** 解析 JSON 文件的 mcpServers 段;文件不存在/解析失败返回空(缺失不报错——首装常态) */
|
|
109
|
+
export function readMcpServersFromJsonFile(file) {
|
|
110
|
+
if (!existsSync(file))
|
|
111
|
+
return { servers: {}, exists: false };
|
|
112
|
+
try {
|
|
113
|
+
const raw = JSON.parse(readFileSync(file, 'utf8'));
|
|
114
|
+
const servers = raw.mcpServers && typeof raw.mcpServers === 'object' && !Array.isArray(raw.mcpServers)
|
|
115
|
+
? raw.mcpServers
|
|
116
|
+
: {};
|
|
117
|
+
return { servers, exists: true };
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return { servers: {}, exists: false };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 读取插件清单 .claude-plugin/plugin.json 内的 mcpServers 字段(Claude Code 插件规范的第二 MCP 位置——
|
|
125
|
+
* 独立 .mcp.json 之外的清单内嵌形态)。同一 plugin 两处都写时调用方需自行决定优先级。
|
|
126
|
+
*/
|
|
127
|
+
export function readPluginMcpFromManifest(pluginDir) {
|
|
128
|
+
return readMcpServersFromJsonFile(join(pluginDir, '.claude-plugin', 'plugin.json'));
|
|
129
|
+
}
|
|
130
|
+
/** 聚合 MCP 三来源清单(server.ts GET /api/mcp 调用;workspaces 由 config 提供,plugins 提供插件来源) */
|
|
131
|
+
export function listMcpServers(workspaces, plugins = []) {
|
|
132
|
+
const out = [];
|
|
133
|
+
const push = (file, source, workspaceName, pluginName, pluginEnabled) => {
|
|
134
|
+
for (const [name, cfg] of Object.entries(readMcpServersFromJsonFile(file).servers)) {
|
|
135
|
+
if (!cfg || typeof cfg !== 'object')
|
|
136
|
+
continue;
|
|
137
|
+
const entry = {
|
|
138
|
+
name, config: cfg, source, path: file,
|
|
139
|
+
...(workspaceName ? { workspaceName } : {}),
|
|
140
|
+
...(pluginName ? { pluginName, pluginEnabled: !!pluginEnabled } : {}),
|
|
141
|
+
};
|
|
142
|
+
out.push(entry);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
push(BRIDGE_MCP_JSON, 'bridge');
|
|
146
|
+
push(USER_CLAUDE_JSON, 'machine-user');
|
|
147
|
+
for (const w of workspaces)
|
|
148
|
+
push(join(w.path, '.mcp.json'), 'project', w.name);
|
|
149
|
+
// plugin 来源合并两种位置:独立 .mcp.json 优先(作者有意独立写则尊重),再用清单内 mcpServers 字段补
|
|
150
|
+
for (const p of plugins) {
|
|
151
|
+
const a = readMcpServersFromJsonFile(join(p.path, '.mcp.json'));
|
|
152
|
+
const b = readPluginMcpFromManifest(p.path);
|
|
153
|
+
const merged = { ...b.servers, ...a.servers };
|
|
154
|
+
for (const [name, cfg] of Object.entries(merged)) {
|
|
155
|
+
if (!cfg || typeof cfg !== 'object')
|
|
156
|
+
continue;
|
|
157
|
+
const entry = {
|
|
158
|
+
name, config: cfg, source: 'plugin', path: a.exists && name in a.servers ? join(p.path, '.mcp.json') : join(p.path, '.claude-plugin', 'plugin.json'),
|
|
159
|
+
pluginName: p.name, pluginEnabled: !!p.enabled,
|
|
160
|
+
};
|
|
161
|
+
out.push(entry);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
out.sort((a, b) => a.source.localeCompare(b.source) || a.name.localeCompare(b.name));
|
|
165
|
+
return out;
|
|
166
|
+
}
|
|
167
|
+
/** MCP server 名合法字符(避用 / \ 与空格等,与磁盘配置键兼容) */
|
|
168
|
+
export const MCP_NAME_RE = /^[A-Za-z0-9_.-]{1,64}$/;
|
|
169
|
+
/**
|
|
170
|
+
* 解析 `claude mcp add` / `claude mcp add-json` 命令子集(页面「原生命令方式」添加):
|
|
171
|
+
* claude mcp add <name> [-s scope] [-t stdio|http|sse] [-e KEY=VAL]... [-H "k: v"]... [--] <command> [args...]
|
|
172
|
+
* claude mcp add-json <name> '<json>'
|
|
173
|
+
* scope(-s/--scope)忽略——页面添加统一进 bridge 目录;<command> 为 http(s) URL 时按 http 类型处理。
|
|
174
|
+
*/
|
|
175
|
+
/** shell 风格分词:引号内的空格不断词(-H "Authorization: Bearer x" 是单参数),引号本身剥离 */
|
|
176
|
+
function shellTokens(cmd) {
|
|
177
|
+
const out = [];
|
|
178
|
+
let cur = '';
|
|
179
|
+
let quote;
|
|
180
|
+
for (const ch of cmd.trim()) {
|
|
181
|
+
if (quote) {
|
|
182
|
+
if (ch === quote)
|
|
183
|
+
quote = undefined;
|
|
184
|
+
else
|
|
185
|
+
cur += ch;
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
if (ch === '"' || ch === "'") {
|
|
189
|
+
quote = ch;
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (/\s/.test(ch)) {
|
|
193
|
+
if (cur) {
|
|
194
|
+
out.push(cur);
|
|
195
|
+
cur = '';
|
|
196
|
+
}
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
cur += ch;
|
|
200
|
+
}
|
|
201
|
+
if (cur)
|
|
202
|
+
out.push(cur);
|
|
203
|
+
return out;
|
|
204
|
+
}
|
|
205
|
+
export function parseClaudeMcpAdd(cmd) {
|
|
206
|
+
const tokens = shellTokens(cmd);
|
|
207
|
+
if (tokens.length < 4 || tokens[0] !== 'claude' || tokens[1] !== 'mcp') {
|
|
208
|
+
return { ok: false, error: '命令须以 "claude mcp add" 或 "claude mcp add-json" 开头' };
|
|
209
|
+
}
|
|
210
|
+
const name = tokens[3];
|
|
211
|
+
if (!MCP_NAME_RE.test(name)) {
|
|
212
|
+
return { ok: false, error: `名字 "${name}" 不合法(1-64 位字母/数字/下划线/点/连字符)` };
|
|
213
|
+
}
|
|
214
|
+
if (tokens[2] === 'add-json') {
|
|
215
|
+
const raw = tokens.slice(4).join(' ').trim().replace(/^["']|["']$/g, '');
|
|
216
|
+
if (!raw)
|
|
217
|
+
return { ok: false, error: 'add-json 缺少配置 JSON' };
|
|
218
|
+
try {
|
|
219
|
+
const cfg = JSON.parse(raw);
|
|
220
|
+
if (!cfg || typeof cfg !== 'object' || Array.isArray(cfg))
|
|
221
|
+
return { ok: false, error: 'JSON 必须为对象' };
|
|
222
|
+
return { ok: true, name, config: cfg };
|
|
223
|
+
}
|
|
224
|
+
catch (e) {
|
|
225
|
+
return { ok: false, error: `JSON 解析失败:${e instanceof Error ? e.message : String(e)}` };
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (tokens[2] !== 'add')
|
|
229
|
+
return { ok: false, error: '仅支持 add / add-json 子命令' };
|
|
230
|
+
const env = {};
|
|
231
|
+
const headers = {};
|
|
232
|
+
let transport;
|
|
233
|
+
let url;
|
|
234
|
+
const argv = [];
|
|
235
|
+
let i = 4;
|
|
236
|
+
for (; i < tokens.length; i++) {
|
|
237
|
+
const t = tokens[i];
|
|
238
|
+
if (t === '--') {
|
|
239
|
+
argv.push(...tokens.slice(i + 1));
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
if (t === '-e' || t === '--env') {
|
|
243
|
+
const kv = tokens[++i];
|
|
244
|
+
const m = kv ? /^([^=]+)=(.*)$/.exec(kv) : null;
|
|
245
|
+
if (!m)
|
|
246
|
+
return { ok: false, error: `-e 参数格式应为 KEY=VAL(当前:${kv ?? '缺失'})` };
|
|
247
|
+
env[m[1]] = m[2];
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
if (t === '-H' || t === '--header') {
|
|
251
|
+
const hv = (tokens[++i] ?? '').replace(/^["']|["']$/g, '');
|
|
252
|
+
const m = /^([^:]+):\s*(.*)$/.exec(hv);
|
|
253
|
+
if (!m)
|
|
254
|
+
return { ok: false, error: `-H 参数格式应为 "Key: Value"(当前:${hv || '缺失'})` };
|
|
255
|
+
headers[m[1].trim()] = m[2];
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
if (t === '-t' || t === '--transport') {
|
|
259
|
+
transport = tokens[++i];
|
|
260
|
+
if (!transport || !['stdio', 'http', 'sse'].includes(transport)) {
|
|
261
|
+
return { ok: false, error: `-t 传输类型须为 stdio / http / sse(当前:${transport ?? '缺失'})` };
|
|
262
|
+
}
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
if (t === '-s' || t === '--scope') {
|
|
266
|
+
i++;
|
|
267
|
+
continue;
|
|
268
|
+
} // scope 忽略:统一写 bridge 目录
|
|
269
|
+
if (/^--(env|header|transport|scope)=/.test(t)) {
|
|
270
|
+
// --key=value 长选项等价形态:拆回 key value 走同一分支
|
|
271
|
+
const eq = t.indexOf('=');
|
|
272
|
+
tokens.splice(i, 1, t.slice(0, eq), t.slice(eq + 1));
|
|
273
|
+
i--;
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
// 非选项 token:命令位(claude CLI 语义)——http(s) URL 按远程 server 处理,否则按 stdio 命令
|
|
277
|
+
if (argv.length === 0 && /^https?:\/\//.test(t)) {
|
|
278
|
+
url = t;
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
argv.push(t);
|
|
282
|
+
}
|
|
283
|
+
if (url) {
|
|
284
|
+
return { ok: true, name, config: { type: transport ?? 'http', url, ...(Object.keys(headers).length ? { headers } : {}) } };
|
|
285
|
+
}
|
|
286
|
+
if (argv.length === 0)
|
|
287
|
+
return { ok: false, error: '缺少启动命令(stdio 形如 `-- npx -y xxx`,http 形如 `https://…`)' };
|
|
288
|
+
const [command, ...args] = argv;
|
|
289
|
+
return { ok: true, name, config: { type: transport ?? 'stdio', command, ...(args.length ? { args } : {}), ...(Object.keys(env).length ? { env } : {}) } };
|
|
290
|
+
}
|
|
291
|
+
// ---------------- env 引用展开(抽屉展示当前值) ----------------
|
|
292
|
+
/** 展开配置 env 值中的 ${VAR} 引用为进程当前环境值;未设置的变量保留原样并计入 missing
|
|
293
|
+
* (前端对 missing 项标注「未设置」——抽屉「同步展示环境变量当前配置的值」的数据源) */
|
|
294
|
+
export function resolveEnvRefs(env) {
|
|
295
|
+
const resolved = {};
|
|
296
|
+
const missing = new Set();
|
|
297
|
+
if (!env || typeof env !== 'object')
|
|
298
|
+
return { resolved, missing: [] };
|
|
299
|
+
for (const [k, v] of Object.entries(env)) {
|
|
300
|
+
const raw = typeof v === 'string' ? v : JSON.stringify(v);
|
|
301
|
+
resolved[k] = raw.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g, (whole, varName) => {
|
|
302
|
+
const cur = process.env[varName];
|
|
303
|
+
if (cur === undefined) {
|
|
304
|
+
missing.add(varName);
|
|
305
|
+
return whole;
|
|
306
|
+
}
|
|
307
|
+
return cur;
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
return { resolved, missing: [...missing] };
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=skills-mcp-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-mcp-api.js","sourceRoot":"","sources":["../../src/web/skills-mcp-api.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jesonliu/lark-claudecode-bridge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"description": "飞书 ↔ Claude Code 桥接器:卡片确认走长连接,免公网 IP",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -26,12 +26,14 @@
|
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@anthropic-ai/claude-agent-sdk": "^0.3.247",
|
|
28
28
|
"@larksuiteoapi/node-sdk": "^1.73.0",
|
|
29
|
+
"adm-zip": "^0.6.0",
|
|
29
30
|
"diff": "^9.0.0",
|
|
30
31
|
"picocolors": "^1.1.1",
|
|
31
32
|
"yaml": "^2.9.0",
|
|
32
33
|
"zod": "^4.4.0"
|
|
33
34
|
},
|
|
34
35
|
"devDependencies": {
|
|
36
|
+
"@types/adm-zip": "^0.5.8",
|
|
35
37
|
"@types/diff": "^7.0.2",
|
|
36
38
|
"@types/node": "^26.4.0",
|
|
37
39
|
"tsx": "^4.23.12",
|