@birdie_moblie/plugin-marketplace-cli 1.0.1 → 1.3.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 (69) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +103 -6
  3. package/dist/adapters/agent-plugins.d.ts +11 -0
  4. package/dist/adapters/agent-plugins.js +66 -0
  5. package/dist/adapters/agent-plugins.js.map +1 -0
  6. package/dist/adapters/claude.d.ts +32 -1
  7. package/dist/adapters/claude.js +119 -14
  8. package/dist/adapters/claude.js.map +1 -1
  9. package/dist/adapters/codex.d.ts +7 -0
  10. package/dist/adapters/codex.js +10 -14
  11. package/dist/adapters/codex.js.map +1 -1
  12. package/dist/adapters/marketplace-registration.d.ts +17 -0
  13. package/dist/adapters/marketplace-registration.js +367 -0
  14. package/dist/adapters/marketplace-registration.js.map +1 -0
  15. package/dist/adapters/openspec.d.ts +66 -0
  16. package/dist/adapters/openspec.js +232 -0
  17. package/dist/adapters/openspec.js.map +1 -0
  18. package/dist/application/marketplace-registration-contract.d.ts +51 -0
  19. package/dist/application/marketplace-registration-contract.js +11 -0
  20. package/dist/application/marketplace-registration-contract.js.map +1 -0
  21. package/dist/application/marketplace-registration.d.ts +20 -0
  22. package/dist/application/marketplace-registration.js +304 -0
  23. package/dist/application/marketplace-registration.js.map +1 -0
  24. package/dist/cli.d.ts +2 -1
  25. package/dist/cli.js +25 -5
  26. package/dist/cli.js.map +1 -1
  27. package/dist/commands/build.d.ts +1 -1
  28. package/dist/commands/build.js +27 -5
  29. package/dist/commands/build.js.map +1 -1
  30. package/dist/commands/index-gen.d.ts +10 -0
  31. package/dist/commands/index-gen.js +81 -20
  32. package/dist/commands/index-gen.js.map +1 -1
  33. package/dist/commands/init-repo.js +11 -2
  34. package/dist/commands/init-repo.js.map +1 -1
  35. package/dist/commands/init.d.ts +1 -1
  36. package/dist/commands/init.js +61 -9
  37. package/dist/commands/init.js.map +1 -1
  38. package/dist/commands/install-repo.d.ts +20 -0
  39. package/dist/commands/install-repo.js +200 -0
  40. package/dist/commands/install-repo.js.map +1 -0
  41. package/dist/commands/release-local.d.ts +1 -0
  42. package/dist/commands/release-local.js +310 -7
  43. package/dist/commands/release-local.js.map +1 -1
  44. package/dist/commands/validate.js +399 -16
  45. package/dist/commands/validate.js.map +1 -1
  46. package/dist/core/errors.d.ts +5 -0
  47. package/dist/core/errors.js +12 -0
  48. package/dist/core/errors.js.map +1 -0
  49. package/dist/generated/skill-content.js +1 -1
  50. package/dist/generated/skill-content.js.map +1 -1
  51. package/dist/infrastructure/process-runner.d.ts +29 -0
  52. package/dist/infrastructure/process-runner.js +130 -0
  53. package/dist/infrastructure/process-runner.js.map +1 -0
  54. package/dist/infrastructure/vscode-user-settings.d.ts +42 -0
  55. package/dist/infrastructure/vscode-user-settings.js +509 -0
  56. package/dist/infrastructure/vscode-user-settings.js.map +1 -0
  57. package/dist/schema/agent-plugins.d.ts +221 -0
  58. package/dist/schema/agent-plugins.js +155 -0
  59. package/dist/schema/agent-plugins.js.map +1 -0
  60. package/dist/schema/plugin-yaml.d.ts +37 -3
  61. package/dist/schema/plugin-yaml.js +89 -4
  62. package/dist/schema/plugin-yaml.js.map +1 -1
  63. package/dist/utils/helpers.d.ts +1 -0
  64. package/dist/utils/helpers.js +1 -0
  65. package/dist/utils/helpers.js.map +1 -1
  66. package/dist/validation/agent-plugins.d.ts +3 -0
  67. package/dist/validation/agent-plugins.js +418 -0
  68. package/dist/validation/agent-plugins.js.map +1 -0
  69. package/package.json +14 -5
@@ -0,0 +1,418 @@
1
+ import { existsSync, readFileSync, readdirSync, realpathSync, statSync, } from 'node:fs';
2
+ import { isIP } from 'node:net';
3
+ import { isAbsolute, join, relative, resolve } from 'node:path';
4
+ import { isDeepStrictEqual } from 'node:util';
5
+ import yaml from 'js-yaml';
6
+ import { buildAgentMcpConfig, buildAgentPluginManifest, } from '../adapters/agent-plugins.js';
7
+ import { formatAgentSchemaErrors, validateAgentMcpConfig, validateAgentPluginManifest, } from '../schema/agent-plugins.js';
8
+ import { isPluginStdioMcp, } from '../schema/plugin-yaml.js';
9
+ function isInside(root, candidate) {
10
+ const value = relative(root, candidate);
11
+ return value === '' || (!value.startsWith('..') && !isAbsolute(value));
12
+ }
13
+ function safeRealpath(path, label, errors) {
14
+ try {
15
+ return realpathSync(path);
16
+ }
17
+ catch {
18
+ errors.push(`${label} 真实路径不可解析: ${path}`);
19
+ return undefined;
20
+ }
21
+ }
22
+ function validateContainedExistingPath(pluginRealRoot, path, label, errors) {
23
+ if (!existsSync(path)) {
24
+ errors.push(`${label} 不存在: ${path}`);
25
+ return undefined;
26
+ }
27
+ const realPath = safeRealpath(path, label, errors);
28
+ if (!realPath)
29
+ return undefined;
30
+ if (!isInside(pluginRealRoot, realPath)) {
31
+ errors.push(`${label} 通过符号链接越过插件目录: ${path}`);
32
+ return undefined;
33
+ }
34
+ return realPath;
35
+ }
36
+ const AGENT_SKILL_FRONTMATTER_FIELDS = new Set([
37
+ 'name',
38
+ 'description',
39
+ 'license',
40
+ 'compatibility',
41
+ 'metadata',
42
+ 'allowed-tools',
43
+ ]);
44
+ function skillFrontmatterName(skillMdPath, errors) {
45
+ let content;
46
+ try {
47
+ content = readFileSync(skillMdPath, 'utf-8');
48
+ }
49
+ catch (error) {
50
+ errors.push(`无法读取 SKILL.md: ${skillMdPath}: ${error.message}`);
51
+ return undefined;
52
+ }
53
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/);
54
+ if (!match) {
55
+ errors.push(`SKILL.md 缺少 YAML frontmatter: ${skillMdPath}`);
56
+ return undefined;
57
+ }
58
+ let frontmatter;
59
+ try {
60
+ frontmatter = yaml.load(match[1]);
61
+ }
62
+ catch (error) {
63
+ errors.push(`SKILL.md frontmatter 不是有效 YAML: ${skillMdPath}: ${error.message}`);
64
+ return undefined;
65
+ }
66
+ if (!frontmatter || typeof frontmatter !== 'object' || Array.isArray(frontmatter)) {
67
+ errors.push(`SKILL.md frontmatter 必须是对象: ${skillMdPath}`);
68
+ return undefined;
69
+ }
70
+ const record = frontmatter;
71
+ for (const key of Object.keys(record)) {
72
+ if (!AGENT_SKILL_FRONTMATTER_FIELDS.has(key)) {
73
+ errors.push(`SKILL.md frontmatter 包含 Agent Skills 非标准字段 ${key}: ${skillMdPath}`);
74
+ }
75
+ }
76
+ const name = record.name;
77
+ if (typeof name !== 'string' || name.length === 0) {
78
+ errors.push(`SKILL.md frontmatter name 缺失: ${skillMdPath}`);
79
+ return undefined;
80
+ }
81
+ if (name.length > 64 || !/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(name)) {
82
+ errors.push(`SKILL.md frontmatter name 不符合 Agent Skills 命名约束: ${skillMdPath}: ${name}`);
83
+ }
84
+ const description = record.description;
85
+ if (typeof description !== 'string' || description.trim().length === 0) {
86
+ errors.push(`SKILL.md frontmatter description 必须是非空字符串: ${skillMdPath}`);
87
+ }
88
+ else if (description.length > 1024) {
89
+ errors.push(`SKILL.md frontmatter description 超过 1024 字符: ${skillMdPath}`);
90
+ }
91
+ if (record.license != null && typeof record.license !== 'string') {
92
+ errors.push(`SKILL.md frontmatter license 必须是字符串: ${skillMdPath}`);
93
+ }
94
+ if (record.compatibility != null) {
95
+ if (typeof record.compatibility !== 'string' || record.compatibility.trim().length === 0) {
96
+ errors.push(`SKILL.md frontmatter compatibility 必须是非空字符串: ${skillMdPath}`);
97
+ }
98
+ else if (record.compatibility.length > 500) {
99
+ errors.push(`SKILL.md frontmatter compatibility 超过 500 字符: ${skillMdPath}`);
100
+ }
101
+ }
102
+ if (record['allowed-tools'] != null && typeof record['allowed-tools'] !== 'string') {
103
+ errors.push(`SKILL.md frontmatter allowed-tools 必须是字符串: ${skillMdPath}`);
104
+ }
105
+ if (record.metadata != null) {
106
+ if (!record.metadata || typeof record.metadata !== 'object' || Array.isArray(record.metadata)) {
107
+ errors.push(`SKILL.md frontmatter metadata 必须是字符串键值对象: ${skillMdPath}`);
108
+ }
109
+ else if (Object.values(record.metadata).some((value) => typeof value !== 'string')) {
110
+ errors.push(`SKILL.md frontmatter metadata 的值必须全部是字符串: ${skillMdPath}`);
111
+ }
112
+ }
113
+ return name;
114
+ }
115
+ function collectNestedSkillFileErrors(skillsRoot, pluginRealRoot, errors) {
116
+ const visited = new Set();
117
+ function walk(directory) {
118
+ const realDirectory = validateContainedExistingPath(pluginRealRoot, directory, 'Skill 目录', errors);
119
+ if (!realDirectory || !statSync(realDirectory).isDirectory() || visited.has(realDirectory)) {
120
+ return;
121
+ }
122
+ visited.add(realDirectory);
123
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
124
+ const candidate = join(directory, entry.name);
125
+ const realCandidate = validateContainedExistingPath(pluginRealRoot, candidate, entry.name === 'SKILL.md' ? 'SKILL.md' : 'Skill 目录项', errors);
126
+ if (!realCandidate)
127
+ continue;
128
+ const stat = statSync(realCandidate);
129
+ if (stat.isDirectory()) {
130
+ walk(candidate);
131
+ continue;
132
+ }
133
+ if (stat.isFile() && entry.name === 'SKILL.md') {
134
+ const parts = relative(skillsRoot, candidate).split(/[\\/]/);
135
+ if (parts.length !== 2) {
136
+ errors.push(`Agent Skill 只能位于 skills/<skill-name>/SKILL.md,发现嵌套文件: ${relative(skillsRoot, candidate)}`);
137
+ }
138
+ }
139
+ }
140
+ }
141
+ walk(skillsRoot);
142
+ }
143
+ function collectSkillErrors(pluginDir, config, errors) {
144
+ const pluginRealRoot = realpathSync(pluginDir);
145
+ const declared = new Map();
146
+ for (const skill of config.components.skills || []) {
147
+ if (declared.has(skill.name)) {
148
+ errors.push(`Skill name 重复: ${skill.name}`);
149
+ continue;
150
+ }
151
+ declared.set(skill.name, skill.path);
152
+ const expectedPath = `skills/${skill.name}`;
153
+ if (skill.path !== expectedPath) {
154
+ errors.push(`Agent Plugins Skill 必须位于固定位置 ${expectedPath}: ${skill.path}`);
155
+ continue;
156
+ }
157
+ const skillDir = join(pluginDir, expectedPath);
158
+ const realSkillDir = validateContainedExistingPath(pluginRealRoot, skillDir, 'Skill 目录', errors);
159
+ if (!realSkillDir)
160
+ continue;
161
+ if (!statSync(realSkillDir).isDirectory()) {
162
+ errors.push(`Skill 路径不是目录: ${skill.path}`);
163
+ continue;
164
+ }
165
+ const skillMd = join(skillDir, 'SKILL.md');
166
+ const realSkillMd = validateContainedExistingPath(pluginRealRoot, skillMd, 'SKILL.md', errors);
167
+ if (!realSkillMd)
168
+ continue;
169
+ if (!statSync(realSkillMd).isFile()) {
170
+ errors.push(`SKILL.md 不是普通文件: ${skillMd}`);
171
+ continue;
172
+ }
173
+ const frontmatterName = skillFrontmatterName(realSkillMd, errors);
174
+ if (frontmatterName && frontmatterName !== skill.name) {
175
+ errors.push(`Skill 名称不一致: plugin.yaml=${skill.name}, directory=${skill.name}, frontmatter=${frontmatterName}`);
176
+ }
177
+ }
178
+ const skillsRoot = join(pluginDir, 'skills');
179
+ if (!existsSync(skillsRoot))
180
+ return;
181
+ const realSkillsRoot = validateContainedExistingPath(pluginRealRoot, skillsRoot, 'skills/ 目录', errors);
182
+ if (!realSkillsRoot || !statSync(realSkillsRoot).isDirectory())
183
+ return;
184
+ collectNestedSkillFileErrors(skillsRoot, pluginRealRoot, errors);
185
+ for (const entry of readdirSync(skillsRoot, { withFileTypes: true })) {
186
+ const candidateDir = join(skillsRoot, entry.name);
187
+ let isDirectory = entry.isDirectory();
188
+ if (entry.isSymbolicLink()) {
189
+ const realCandidate = validateContainedExistingPath(pluginRealRoot, candidateDir, 'Skill 目录', errors);
190
+ isDirectory = Boolean(realCandidate && statSync(realCandidate).isDirectory());
191
+ }
192
+ if (!isDirectory)
193
+ continue;
194
+ const skillMd = join(candidateDir, 'SKILL.md');
195
+ if (!existsSync(skillMd))
196
+ continue;
197
+ const realSkillMd = validateContainedExistingPath(pluginRealRoot, skillMd, 'SKILL.md', errors);
198
+ if (!realSkillMd)
199
+ continue;
200
+ if (!declared.has(entry.name)) {
201
+ errors.push(`发现未在 plugin.yaml 声明的 Agent Skill: skills/${entry.name}/SKILL.md`);
202
+ }
203
+ }
204
+ }
205
+ function validatePluginRelativePath(pluginDir, pluginRealRoot, value, label, requireExists, errors) {
206
+ const candidate = resolve(pluginDir, value);
207
+ if (!isInside(pluginDir, candidate)) {
208
+ errors.push(`${label} 越过插件目录: ${value}`);
209
+ return;
210
+ }
211
+ if (!requireExists)
212
+ return;
213
+ validateContainedExistingPath(pluginRealRoot, candidate, label, errors);
214
+ }
215
+ function validateDataCwd(value, label, errors) {
216
+ const suffix = value.slice('${PLUGIN_DATA}'.length).replace(/^\//, '');
217
+ const virtualRoot = resolve('/plugin-data');
218
+ const candidate = resolve(virtualRoot, suffix || '.');
219
+ if (!isInside(virtualRoot, candidate)) {
220
+ errors.push(`${label} 越过 PLUGIN_DATA 目录: ${value}`);
221
+ }
222
+ }
223
+ function validatePortablePlaceholders(value, label, errors) {
224
+ const remainder = value
225
+ .replaceAll('${PLUGIN_ROOT}', '')
226
+ .replaceAll('${PLUGIN_DATA}', '');
227
+ if (remainder.includes('${')) {
228
+ errors.push(`${label} 包含 Agent Plugins 不会展开的非标准占位符: ${value}`);
229
+ }
230
+ }
231
+ function validateStdioMcp(pluginDir, pluginRealRoot, mcp, errors) {
232
+ validatePortablePlaceholders(mcp.command, `MCP command (${mcp.name})`, errors);
233
+ if (mcp.command.includes('${PLUGIN_ROOT}') || mcp.command.includes('${PLUGIN_DATA}')) {
234
+ errors.push(`MCP command 不执行 PLUGIN_ROOT/PLUGIN_DATA 占位符展开: ${mcp.name}`);
235
+ }
236
+ if (/\s/.test(mcp.command)) {
237
+ errors.push(`MCP command 必须是单一可执行 token: ${mcp.name}`);
238
+ }
239
+ else if (mcp.command.startsWith('./')) {
240
+ validatePluginRelativePath(pluginDir, pluginRealRoot, mcp.command, `MCP command (${mcp.name})`, true, errors);
241
+ }
242
+ else if (mcp.command.includes('/') || mcp.command.includes('\\') || isAbsolute(mcp.command)) {
243
+ errors.push(`MCP command 必须是 bare executable 或 ./ 插件相对路径: ${mcp.name}`);
244
+ }
245
+ for (const reserved of ['PLUGIN_ROOT', 'PLUGIN_DATA']) {
246
+ if (Object.prototype.hasOwnProperty.call(mcp.env || {}, reserved)) {
247
+ errors.push(`MCP env ${reserved} 是客户端保留变量: ${mcp.name}`);
248
+ }
249
+ }
250
+ for (const [index, arg] of (mcp.args || []).entries()) {
251
+ validatePortablePlaceholders(arg, `MCP args[${index}] (${mcp.name})`, errors);
252
+ }
253
+ for (const [name, value] of Object.entries(mcp.env || {})) {
254
+ validatePortablePlaceholders(value, `MCP env ${name} (${mcp.name})`, errors);
255
+ }
256
+ if (mcp.cwd) {
257
+ validatePortablePlaceholders(mcp.cwd, `MCP cwd (${mcp.name})`, errors);
258
+ if (mcp.cwd.startsWith('./')) {
259
+ validatePluginRelativePath(pluginDir, pluginRealRoot, mcp.cwd, `MCP cwd (${mcp.name})`, true, errors);
260
+ }
261
+ else if (mcp.cwd === '${PLUGIN_ROOT}' || mcp.cwd.startsWith('${PLUGIN_ROOT}/')) {
262
+ const suffix = mcp.cwd.slice('${PLUGIN_ROOT}'.length).replace(/^\//, '');
263
+ validatePluginRelativePath(pluginDir, pluginRealRoot, `./${suffix || '.'}`, `MCP cwd (${mcp.name})`, true, errors);
264
+ }
265
+ else if (mcp.cwd === '${PLUGIN_DATA}' || mcp.cwd.startsWith('${PLUGIN_DATA}/')) {
266
+ validateDataCwd(mcp.cwd, `MCP cwd (${mcp.name})`, errors);
267
+ }
268
+ else {
269
+ errors.push(`MCP cwd 必须以 ./、\${PLUGIN_ROOT} 或 \${PLUGIN_DATA} 定位: ${mcp.name}`);
270
+ }
271
+ }
272
+ }
273
+ function normalizedHostname(url) {
274
+ return url.hostname.replace(/^\[/, '').replace(/\]$/, '').toLowerCase();
275
+ }
276
+ function isLoopbackHost(hostname) {
277
+ if (hostname === 'localhost')
278
+ return true;
279
+ if (isIP(hostname) === 4)
280
+ return hostname.startsWith('127.');
281
+ if (isIP(hostname) === 6) {
282
+ return hostname === '::1' || hostname === '0:0:0:0:0:0:0:1';
283
+ }
284
+ return false;
285
+ }
286
+ const HEADER_NAME = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
287
+ const SENSITIVE_HEADERS = new Set([
288
+ 'authorization',
289
+ 'proxy-authorization',
290
+ 'cookie',
291
+ 'set-cookie',
292
+ 'x-api-key',
293
+ 'api-key',
294
+ ]);
295
+ function validateRemoteMcp(mcp, errors) {
296
+ let endpoint;
297
+ try {
298
+ endpoint = new URL(mcp.url);
299
+ }
300
+ catch {
301
+ errors.push(`MCP remote URL 不是绝对 URL: ${mcp.name}`);
302
+ return;
303
+ }
304
+ if (!['http:', 'https:'].includes(endpoint.protocol)) {
305
+ errors.push(`MCP remote URL 仅支持 HTTP/HTTPS: ${mcp.name}`);
306
+ }
307
+ if (endpoint.username || endpoint.password) {
308
+ errors.push(`MCP remote URL 不得包含 userinfo: ${mcp.name}`);
309
+ }
310
+ if (endpoint.hash) {
311
+ errors.push(`MCP remote URL 不得包含 fragment: ${mcp.name}`);
312
+ }
313
+ const hostname = normalizedHostname(endpoint);
314
+ if (endpoint.protocol === 'http:' && !isLoopbackHost(hostname)) {
315
+ errors.push(`MCP 非 loopback endpoint 必须使用 HTTPS: ${mcp.name}`);
316
+ }
317
+ const seen = new Set();
318
+ for (const [name, value] of Object.entries(mcp.headers || {})) {
319
+ const normalized = name.toLowerCase();
320
+ if (seen.has(normalized)) {
321
+ errors.push(`MCP Header 名称忽略大小写后重复: ${mcp.name}: ${name}`);
322
+ }
323
+ seen.add(normalized);
324
+ if (!HEADER_NAME.test(name)) {
325
+ errors.push(`MCP Header 名称无效: ${mcp.name}: ${name}`);
326
+ }
327
+ if (/[^\t\x20-\x7e\x80-\xff]/.test(value)) {
328
+ errors.push(`MCP Header 值包含无效控制字符: ${mcp.name}: ${name}`);
329
+ }
330
+ if (value.includes('${')) {
331
+ errors.push(`MCP Header 不执行占位符展开: ${mcp.name}: ${name}`);
332
+ }
333
+ if (SENSITIVE_HEADERS.has(normalized)) {
334
+ errors.push(`MCP 敏感 Header ${name} 不得携带可见凭据: ${mcp.name}`);
335
+ }
336
+ }
337
+ }
338
+ function collectMcpErrors(pluginDir, config, errors) {
339
+ const pluginRealRoot = realpathSync(pluginDir);
340
+ const seenNames = new Set();
341
+ for (const mcp of config.components.mcp || []) {
342
+ if (['__proto__', 'prototype', 'constructor'].includes(mcp.name)) {
343
+ errors.push(`MCP server name 不安全: ${mcp.name}`);
344
+ }
345
+ if (seenNames.has(mcp.name))
346
+ errors.push(`MCP server name 重复: ${mcp.name}`);
347
+ seenNames.add(mcp.name);
348
+ if (isPluginStdioMcp(mcp)) {
349
+ validateStdioMcp(pluginDir, pluginRealRoot, mcp, errors);
350
+ }
351
+ else {
352
+ validateRemoteMcp(mcp, errors);
353
+ }
354
+ }
355
+ const expected = buildAgentMcpConfig(config);
356
+ if (expected && !validateAgentMcpConfig(expected)) {
357
+ errors.push(`Agent Plugins mcp.json schema 校验失败: ${formatAgentSchemaErrors(validateAgentMcpConfig.errors)}`);
358
+ }
359
+ }
360
+ export function collectAgentPluginSourceErrors(pluginDir, config) {
361
+ const errors = [];
362
+ const manifest = buildAgentPluginManifest(config);
363
+ if (!validateAgentPluginManifest(manifest)) {
364
+ errors.push(`Agent Plugins plugin.json schema 校验失败: ${formatAgentSchemaErrors(validateAgentPluginManifest.errors)}`);
365
+ }
366
+ collectSkillErrors(pluginDir, config, errors);
367
+ collectMcpErrors(pluginDir, config, errors);
368
+ return errors;
369
+ }
370
+ function readJson(path, label, errors) {
371
+ if (!existsSync(path))
372
+ return undefined;
373
+ try {
374
+ return JSON.parse(readFileSync(path, 'utf-8'));
375
+ }
376
+ catch (error) {
377
+ errors.push(`${label} 不是有效 JSON: ${path}: ${error.message}`);
378
+ return undefined;
379
+ }
380
+ }
381
+ export function collectAgentPluginGeneratedErrors(pluginDir, config) {
382
+ const errors = [];
383
+ const manifestPath = join(pluginDir, 'plugin.json');
384
+ const expectedManifest = buildAgentPluginManifest(config);
385
+ const actualManifest = readJson(manifestPath, 'Agent Plugins manifest', errors);
386
+ if (actualManifest === undefined) {
387
+ errors.push('Agent Plugins manifest 缺失,请重新运行 build: plugin.json');
388
+ }
389
+ else {
390
+ if (!validateAgentPluginManifest(actualManifest)) {
391
+ errors.push(`Agent Plugins manifest schema 校验失败: ${formatAgentSchemaErrors(validateAgentPluginManifest.errors)}`);
392
+ }
393
+ if (!isDeepStrictEqual(actualManifest, expectedManifest)) {
394
+ errors.push('Agent Plugins manifest plugin.json 与 plugin.yaml 派生结果不一致,请重新运行 build');
395
+ }
396
+ }
397
+ const mcpPath = join(pluginDir, 'mcp.json');
398
+ const expectedMcp = buildAgentMcpConfig(config);
399
+ const actualMcp = readJson(mcpPath, 'Agent Plugins MCP 配置', errors);
400
+ if (!expectedMcp) {
401
+ if (actualMcp !== undefined) {
402
+ errors.push('Agent Plugins MCP 配置已过期,请重新运行 build: mcp.json');
403
+ }
404
+ }
405
+ else if (actualMcp === undefined) {
406
+ errors.push('Agent Plugins MCP 配置缺失,请重新运行 build: mcp.json');
407
+ }
408
+ else {
409
+ if (!validateAgentMcpConfig(actualMcp)) {
410
+ errors.push(`Agent Plugins MCP 配置 schema 校验失败: ${formatAgentSchemaErrors(validateAgentMcpConfig.errors)}`);
411
+ }
412
+ if (!isDeepStrictEqual(actualMcp, expectedMcp)) {
413
+ errors.push('Agent Plugins MCP 配置 mcp.json 与 plugin.yaml 派生结果不一致,请重新运行 build');
414
+ }
415
+ }
416
+ return errors;
417
+ }
418
+ //# sourceMappingURL=agent-plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-plugins.js","sourceRoot":"","sources":["../../src/validation/agent-plugins.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,QAAQ,GACT,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EACL,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,gBAAgB,GAIjB,MAAM,0BAA0B,CAAC;AAElC,SAAS,QAAQ,CAAC,IAAY,EAAE,SAAiB;IAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACxC,OAAO,KAAK,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,KAAa,EAAE,MAAgB;IACjE,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,cAAc,IAAI,EAAE,CAAC,CAAC;QAC1C,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,6BAA6B,CACpC,cAAsB,EACtB,IAAY,EACZ,KAAa,EACb,MAAgB;IAEhB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,EAAE,CAAC,CAAC;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACnD,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,kBAAkB,IAAI,EAAE,CAAC,CAAC;QAC9C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,8BAA8B,GAAG,IAAI,GAAG,CAAC;IAC7C,MAAM;IACN,aAAa;IACb,SAAS;IACT,eAAe;IACf,UAAU;IACV,eAAe;CAChB,CAAC,CAAC;AAEH,SAAS,oBAAoB,CAAC,WAAmB,EAAE,MAAgB;IACjE,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,kBAAkB,WAAW,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACtE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,iCAAiC,WAAW,EAAE,CAAC,CAAC;QAC5D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,WAAoB,CAAC;IACzB,IAAI,CAAC;QACH,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,mCAAmC,WAAW,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3F,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAClF,MAAM,CAAC,IAAI,CAAC,+BAA+B,WAAW,EAAE,CAAC,CAAC;QAC1D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,WAAsC,CAAC;IACtD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,8BAA8B,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,8CAA8C,GAAG,KAAK,WAAW,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,iCAAiC,WAAW,EAAE,CAAC,CAAC;QAC5D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,oDAAoD,WAAW,KAAK,IAAI,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACvC,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,8CAA8C,WAAW,EAAE,CAAC,CAAC;IAC3E,CAAC;SAAM,IAAI,WAAW,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,gDAAgD,WAAW,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,wCAAwC,WAAW,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,MAAM,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC;QACjC,IAAI,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzF,MAAM,CAAC,IAAI,CAAC,gDAAgD,WAAW,EAAE,CAAC,CAAC;QAC7E,CAAC;aAAM,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,iDAAiD,WAAW,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,eAAe,CAAC,IAAI,IAAI,IAAI,OAAO,MAAM,CAAC,eAAe,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnF,MAAM,CAAC,IAAI,CAAC,8CAA8C,WAAW,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9F,MAAM,CAAC,IAAI,CAAC,6CAA6C,WAAW,EAAE,CAAC,CAAC;QAC1E,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,EAAE,CAAC;YACrF,MAAM,CAAC,IAAI,CAAC,6CAA6C,WAAW,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,4BAA4B,CACnC,UAAkB,EAClB,cAAsB,EACtB,MAAgB;IAEhB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,SAAS,IAAI,CAAC,SAAiB;QAC7B,MAAM,aAAa,GAAG,6BAA6B,CACjD,cAAc,EACd,SAAS,EACT,UAAU,EACV,MAAM,CACP,CAAC;QACF,IAAI,CAAC,aAAa,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YAC3F,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAE3B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACpE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,aAAa,GAAG,6BAA6B,CACjD,cAAc,EACd,SAAS,EACT,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,EACpD,MAAM,CACP,CAAC;YACF,IAAI,CAAC,aAAa;gBAAE,SAAS;YAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;YACrC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,IAAI,CAAC,SAAS,CAAC,CAAC;gBAChB,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC7D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvB,MAAM,CAAC,IAAI,CACT,yDAAyD,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,CAC3F,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAiB,EAAE,MAAkB,EAAE,MAAgB;IACjF,MAAM,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE3C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACnD,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5C,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAErC,MAAM,YAAY,GAAG,UAAU,KAAK,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,gCAAgC,YAAY,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3E,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,6BAA6B,CAChD,cAAc,EACd,QAAQ,EACR,UAAU,EACV,MAAM,CACP,CAAC;QACF,IAAI,CAAC,YAAY;YAAE,SAAS;QAC5B,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3C,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,6BAA6B,CAC/C,cAAc,EACd,OAAO,EACP,UAAU,EACV,MAAM,CACP,CAAC;QACF,IAAI,CAAC,WAAW;YAAE,SAAS;QAC3B,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC3C,SAAS;QACX,CAAC;QACD,MAAM,eAAe,GAAG,oBAAoB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAClE,IAAI,eAAe,IAAI,eAAe,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;YACtD,MAAM,CAAC,IAAI,CACT,4BAA4B,KAAK,CAAC,IAAI,eAAe,KAAK,CAAC,IAAI,iBAAiB,eAAe,EAAE,CAClG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO;IACpC,MAAM,cAAc,GAAG,6BAA6B,CAClD,cAAc,EACd,UAAU,EACV,YAAY,EACZ,MAAM,CACP,CAAC;IACF,IAAI,CAAC,cAAc,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE;QAAE,OAAO;IAEvE,4BAA4B,CAAC,UAAU,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IAEjE,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACrE,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3B,MAAM,aAAa,GAAG,6BAA6B,CACjD,cAAc,EACd,YAAY,EACZ,UAAU,EACV,MAAM,CACP,CAAC;YACF,WAAW,GAAG,OAAO,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,CAAC,WAAW;YAAE,SAAS;QAE3B,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,SAAS;QACnC,MAAM,WAAW,GAAG,6BAA6B,CAC/C,cAAc,EACd,OAAO,EACP,UAAU,EACV,MAAM,CACP,CAAC;QACF,IAAI,CAAC,WAAW;YAAE,SAAS;QAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,4CAA4C,KAAK,CAAC,IAAI,WAAW,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CACjC,SAAiB,EACjB,cAAsB,EACtB,KAAa,EACb,KAAa,EACb,aAAsB,EACtB,MAAgB;IAEhB,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,YAAY,KAAK,EAAE,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IACD,IAAI,CAAC,aAAa;QAAE,OAAO;IAC3B,6BAA6B,CAAC,cAAc,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,eAAe,CAAC,KAAa,EAAE,KAAa,EAAE,MAAgB;IACrE,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,MAAM,IAAI,GAAG,CAAC,CAAC;IACtD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,uBAAuB,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CAAC,KAAa,EAAE,KAAa,EAAE,MAAgB;IAClF,MAAM,SAAS,GAAG,KAAK;SACpB,UAAU,CAAC,gBAAgB,EAAE,EAAE,CAAC;SAChC,UAAU,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACpC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,kCAAkC,KAAK,EAAE,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CACvB,SAAiB,EACjB,cAAsB,EACtB,GAAmB,EACnB,MAAgB;IAEhB,4BAA4B,CAAC,GAAG,CAAC,OAAO,EAAE,gBAAgB,GAAG,CAAC,IAAI,GAAG,EAAE,MAAM,CAAC,CAAC;IAC/E,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrF,MAAM,CAAC,IAAI,CAAC,kDAAkD,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,+BAA+B,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;SAAM,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,0BAA0B,CACxB,SAAS,EACT,cAAc,EACd,GAAG,CAAC,OAAO,EACX,gBAAgB,GAAG,CAAC,IAAI,GAAG,EAC3B,IAAI,EACJ,MAAM,CACP,CAAC;IACJ,CAAC;SAAM,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9F,MAAM,CAAC,IAAI,CAAC,gDAAgD,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC;QACtD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC,WAAW,QAAQ,cAAc,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QACtD,4BAA4B,CAAC,GAAG,EAAE,YAAY,KAAK,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,MAAM,CAAC,CAAC;IAChF,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;QAC1D,4BAA4B,CAAC,KAAK,EAAE,WAAW,IAAI,KAAK,GAAG,CAAC,IAAI,GAAG,EAAE,MAAM,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,4BAA4B,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,GAAG,CAAC,IAAI,GAAG,EAAE,MAAM,CAAC,CAAC;QACvE,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,0BAA0B,CACxB,SAAS,EACT,cAAc,EACd,GAAG,CAAC,GAAG,EACP,YAAY,GAAG,CAAC,IAAI,GAAG,EACvB,IAAI,EACJ,MAAM,CACP,CAAC;QACJ,CAAC;aAAM,IAAI,GAAG,CAAC,GAAG,KAAK,gBAAgB,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACjF,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzE,0BAA0B,CACxB,SAAS,EACT,cAAc,EACd,KAAK,MAAM,IAAI,GAAG,EAAE,EACpB,YAAY,GAAG,CAAC,IAAI,GAAG,EACvB,IAAI,EACJ,MAAM,CACP,CAAC;QACJ,CAAC;aAAM,IAAI,GAAG,CAAC,GAAG,KAAK,gBAAgB,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACjF,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,GAAG,CAAC,IAAI,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,wDAAwD,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAQ;IAClC,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AAC1E,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,IAAI,QAAQ,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC7D,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,iBAAiB,CAAC;IAC9D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,WAAW,GAAG,gCAAgC,CAAC;AACrD,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,eAAe;IACf,qBAAqB;IACrB,QAAQ;IACR,YAAY;IACZ,WAAW;IACX,SAAS;CACV,CAAC,CAAC;AAEH,SAAS,iBAAiB,CAAC,GAAoB,EAAE,MAAgB;IAC/D,IAAI,QAAa,CAAC;IAClB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC,4BAA4B,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IACD,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,kCAAkC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,iCAAiC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,iCAAiC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,QAAQ,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,uCAAuC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,0BAA0B,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,oBAAoB,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,yBAAyB,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,wBAAwB,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,iBAAiB,IAAI,cAAc,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAiB,EAAE,MAAkB,EAAE,MAAgB;IAC/E,MAAM,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC;QAC9C,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,wBAAwB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,uBAAuB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5E,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,gBAAgB,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,QAAQ,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,uCAAuC,uBAAuB,CAAC,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/G,CAAC;AACH,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,SAAiB,EACjB,MAAkB;IAElB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAClD,IAAI,CAAC,2BAA2B,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CACT,0CAA0C,uBAAuB,CAAC,2BAA2B,CAAC,MAAM,CAAC,EAAE,CACxG,CAAC;IACJ,CAAC;IACD,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAa,EAAE,MAAgB;IAC7D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAY,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,eAAe,IAAI,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACxE,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,SAAiB,EACjB,MAAkB;IAElB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACpD,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,cAAc,GAAG,QAAQ,CAAC,YAAY,EAAE,wBAAwB,EAAE,MAAM,CAAC,CAAC;IAChF,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,2BAA2B,CAAC,cAAc,CAAC,EAAE,CAAC;YACjD,MAAM,CAAC,IAAI,CACT,uCAAuC,uBAAuB,CAAC,2BAA2B,CAAC,MAAM,CAAC,EAAE,CACrG,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,gBAAgB,CAAC,EAAE,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,EAAE,sBAAsB,EAAE,MAAM,CAAC,CAAC;IACpE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;SAAM,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CACT,qCAAqC,uBAAuB,CAAC,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAC9F,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@birdie_moblie/plugin-marketplace-cli",
3
- "version": "1.0.1",
3
+ "version": "1.3.0",
4
4
  "private": false,
5
- "description": "维护 Claude Code 和 Codex plugin marketplace 仓库的 CLI",
5
+ "description": "维护 Agent Plugins 1.0、Claude Code、Codex 和 Cursor plugin marketplace 仓库的 CLI;支持 install-repo 注册 marketplace",
6
6
  "license": "UNLICENSED",
7
7
  "type": "module",
8
8
  "bin": {
@@ -10,22 +10,31 @@
10
10
  },
11
11
  "files": [
12
12
  "dist",
13
- "README.md"
13
+ "README.md",
14
+ "CHANGELOG.md"
14
15
  ],
15
16
  "scripts": {
16
17
  "clean": "rm -rf dist src/generated tsconfig.tsbuildinfo",
17
18
  "generate:skill": "tsx scripts/generate-skill.ts",
18
19
  "build": "npm run clean && npm run generate:skill && tsc && chmod +x dist/cli.js",
20
+ "test:openspec-contracts": "tsx scripts/check-openspec-contracts.ts",
21
+ "test:lsp-contracts": "tsx scripts/check-lsp-contracts.ts",
22
+ "test:hook-contracts": "tsx scripts/check-hook-contracts.ts",
23
+ "test:agent-plugins-contracts": "tsx scripts/check-agent-plugins-contracts.ts",
24
+ "test:install-repo-contracts": "tsx scripts/check-install-repo-contracts.ts",
25
+ "test": "npm run test:openspec-contracts && npm run test:lsp-contracts && npm run test:hook-contracts && npm run test:agent-plugins-contracts && npm run test:install-repo-contracts",
26
+ "prepublishOnly": "npm run build && npm test",
19
27
  "premp": "npm run generate:skill",
20
28
  "mp": "tsx src/cli.ts",
21
29
  "predev": "npm run generate:skill",
22
30
  "dev": "tsx watch src/cli.ts"
23
31
  },
24
32
  "dependencies": {
33
+ "ajv": "^8.17.0",
34
+ "chalk": "^5.4.0",
25
35
  "commander": "^13.0.0",
26
36
  "js-yaml": "^4.1.0",
27
- "ajv": "^8.17.0",
28
- "chalk": "^5.4.0"
37
+ "jsonc-parser": "^3.3.1"
29
38
  },
30
39
  "devDependencies": {
31
40
  "@types/js-yaml": "^4.0.9",