@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.
- package/CHANGELOG.md +68 -0
- package/README.md +103 -6
- package/dist/adapters/agent-plugins.d.ts +11 -0
- package/dist/adapters/agent-plugins.js +66 -0
- package/dist/adapters/agent-plugins.js.map +1 -0
- package/dist/adapters/claude.d.ts +32 -1
- package/dist/adapters/claude.js +119 -14
- package/dist/adapters/claude.js.map +1 -1
- package/dist/adapters/codex.d.ts +7 -0
- package/dist/adapters/codex.js +10 -14
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/marketplace-registration.d.ts +17 -0
- package/dist/adapters/marketplace-registration.js +367 -0
- package/dist/adapters/marketplace-registration.js.map +1 -0
- package/dist/adapters/openspec.d.ts +66 -0
- package/dist/adapters/openspec.js +232 -0
- package/dist/adapters/openspec.js.map +1 -0
- package/dist/application/marketplace-registration-contract.d.ts +51 -0
- package/dist/application/marketplace-registration-contract.js +11 -0
- package/dist/application/marketplace-registration-contract.js.map +1 -0
- package/dist/application/marketplace-registration.d.ts +20 -0
- package/dist/application/marketplace-registration.js +304 -0
- package/dist/application/marketplace-registration.js.map +1 -0
- package/dist/cli.d.ts +2 -1
- package/dist/cli.js +25 -5
- package/dist/cli.js.map +1 -1
- package/dist/commands/build.d.ts +1 -1
- package/dist/commands/build.js +27 -5
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/index-gen.d.ts +10 -0
- package/dist/commands/index-gen.js +81 -20
- package/dist/commands/index-gen.js.map +1 -1
- package/dist/commands/init-repo.js +11 -2
- package/dist/commands/init-repo.js.map +1 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.js +61 -9
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install-repo.d.ts +20 -0
- package/dist/commands/install-repo.js +200 -0
- package/dist/commands/install-repo.js.map +1 -0
- package/dist/commands/release-local.d.ts +1 -0
- package/dist/commands/release-local.js +310 -7
- package/dist/commands/release-local.js.map +1 -1
- package/dist/commands/validate.js +399 -16
- package/dist/commands/validate.js.map +1 -1
- package/dist/core/errors.d.ts +5 -0
- package/dist/core/errors.js +12 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/generated/skill-content.js +1 -1
- package/dist/generated/skill-content.js.map +1 -1
- package/dist/infrastructure/process-runner.d.ts +29 -0
- package/dist/infrastructure/process-runner.js +130 -0
- package/dist/infrastructure/process-runner.js.map +1 -0
- package/dist/infrastructure/vscode-user-settings.d.ts +42 -0
- package/dist/infrastructure/vscode-user-settings.js +509 -0
- package/dist/infrastructure/vscode-user-settings.js.map +1 -0
- package/dist/schema/agent-plugins.d.ts +221 -0
- package/dist/schema/agent-plugins.js +155 -0
- package/dist/schema/agent-plugins.js.map +1 -0
- package/dist/schema/plugin-yaml.d.ts +37 -3
- package/dist/schema/plugin-yaml.js +89 -4
- package/dist/schema/plugin-yaml.js.map +1 -1
- package/dist/utils/helpers.d.ts +1 -0
- package/dist/utils/helpers.js +1 -0
- package/dist/utils/helpers.js.map +1 -1
- package/dist/validation/agent-plugins.d.ts +3 -0
- package/dist/validation/agent-plugins.js +418 -0
- package/dist/validation/agent-plugins.js.map +1 -0
- package/package.json +14 -5
package/dist/adapters/codex.js
CHANGED
|
@@ -8,16 +8,17 @@
|
|
|
8
8
|
* - skills/ — skill 文件(同上,无需生成)
|
|
9
9
|
* - .mcp.json — MCP 配置(格式与 Claude Code 相同)
|
|
10
10
|
*/
|
|
11
|
-
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
11
|
+
import { mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
12
12
|
import { join } from 'node:path';
|
|
13
13
|
import { toTitleCase } from '../utils/helpers.js';
|
|
14
|
+
import { buildMcpConfig } from './claude.js';
|
|
14
15
|
/**
|
|
15
16
|
* 生成 Codex 的 .codex-plugin/plugin.json
|
|
16
17
|
*
|
|
17
18
|
* 如果 plugin.yaml 中没有显式指定 platform.codex.interface,
|
|
18
19
|
* 则从 name 和 description 自动推导。
|
|
19
20
|
*/
|
|
20
|
-
function
|
|
21
|
+
export function buildCodexManifest(config) {
|
|
21
22
|
const iface = config.platform?.codex?.interface;
|
|
22
23
|
const manifest = {
|
|
23
24
|
name: config.name,
|
|
@@ -78,19 +79,14 @@ export function generateCodex(config, pluginDir) {
|
|
|
78
79
|
// .codex-plugin/plugin.json
|
|
79
80
|
const codexDir = join(pluginDir, '.codex-plugin');
|
|
80
81
|
mkdirSync(codexDir, { recursive: true });
|
|
81
|
-
writeFileSync(join(codexDir, 'plugin.json'), JSON.stringify(
|
|
82
|
+
writeFileSync(join(codexDir, 'plugin.json'), JSON.stringify(buildCodexManifest(config), null, 2) + '\n');
|
|
82
83
|
// .mcp.json(Codex 的 MCP 格式与 Claude Code 相同)
|
|
83
|
-
const
|
|
84
|
-
if (
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
...(mcp.args ? { args: mcp.args } : {}),
|
|
90
|
-
...(mcp.env ? { env: mcp.env } : {}),
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
writeFileSync(join(pluginDir, '.mcp.json'), JSON.stringify({ mcpServers: servers }, null, 2) + '\n');
|
|
84
|
+
const mcpConfig = buildMcpConfig(config);
|
|
85
|
+
if (mcpConfig) {
|
|
86
|
+
writeFileSync(join(pluginDir, '.mcp.json'), JSON.stringify(mcpConfig, null, 2) + '\n');
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
rmSync(join(pluginDir, '.mcp.json'), { force: true });
|
|
94
90
|
}
|
|
95
91
|
}
|
|
96
92
|
//# sourceMappingURL=codex.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AgentTargetId, MarketplaceRegistrationSource, TargetInspection, TargetRegistrationResult } from '../application/marketplace-registration-contract.js';
|
|
2
|
+
import { type ProcessRunner } from '../infrastructure/process-runner.js';
|
|
3
|
+
import { type VscodeSettingsInspection, type VscodeSettingsUpdateRequest, type VscodeSettingsUpdateResult } from '../infrastructure/vscode-user-settings.js';
|
|
4
|
+
export interface MarketplaceRegistrationRuntime {
|
|
5
|
+
readonly processRunner?: ProcessRunner;
|
|
6
|
+
readonly signal?: AbortSignal;
|
|
7
|
+
readonly inspectVscode?: (runner: ProcessRunner, signal?: AbortSignal) => VscodeSettingsInspection | Promise<VscodeSettingsInspection>;
|
|
8
|
+
readonly updateVscode?: (request: VscodeSettingsUpdateRequest) => VscodeSettingsUpdateResult;
|
|
9
|
+
}
|
|
10
|
+
export interface MarketplaceRegistrationAdapter {
|
|
11
|
+
readonly id: AgentTargetId;
|
|
12
|
+
readonly label: string;
|
|
13
|
+
inspect(source: MarketplaceRegistrationSource, runtime?: MarketplaceRegistrationRuntime): Promise<TargetInspection>;
|
|
14
|
+
execute(source: MarketplaceRegistrationSource, inspection: TargetInspection, runtime?: MarketplaceRegistrationRuntime): Promise<TargetRegistrationResult>;
|
|
15
|
+
}
|
|
16
|
+
export declare const MARKETPLACE_REGISTRATION_ADAPTERS: readonly MarketplaceRegistrationAdapter[];
|
|
17
|
+
export declare function getMarketplaceRegistrationAdapter(id: AgentTargetId): MarketplaceRegistrationAdapter;
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
import { lstatSync, realpathSync } from 'node:fs';
|
|
2
|
+
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
3
|
+
import { systemProcessRunner, } from '../infrastructure/process-runner.js';
|
|
4
|
+
import { inspectVscodeUserSettings, updateVscodeMarketplaceSettings, } from '../infrastructure/vscode-user-settings.js';
|
|
5
|
+
function runnerFor(runtime) {
|
|
6
|
+
return runtime?.processRunner ?? systemProcessRunner;
|
|
7
|
+
}
|
|
8
|
+
function localIndexFailure(source, candidates) {
|
|
9
|
+
if (source.kind !== 'local') {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
const available = candidates.some((relativePath) => {
|
|
13
|
+
try {
|
|
14
|
+
return lstatSync(join(source.localPath, relativePath)).isFile();
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
if (available) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
return `本地 Marketplace 缺少目标索引: ${candidates.join(' 或 ')}`;
|
|
24
|
+
}
|
|
25
|
+
function failedLocalInspection(id, label, message) {
|
|
26
|
+
return {
|
|
27
|
+
id,
|
|
28
|
+
label,
|
|
29
|
+
status: 'failed',
|
|
30
|
+
message,
|
|
31
|
+
recovery: '先在来源 Marketplace 中运行 build/index/validate,再重新注册。',
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function pathIsInside(rootPath, candidatePath) {
|
|
35
|
+
const relativePath = relative(rootPath, candidatePath);
|
|
36
|
+
return (relativePath === '' ||
|
|
37
|
+
(!relativePath.startsWith(`..${sep}`) &&
|
|
38
|
+
relativePath !== '..' &&
|
|
39
|
+
!isAbsolute(relativePath)));
|
|
40
|
+
}
|
|
41
|
+
function canonicalizePotentialPath(path) {
|
|
42
|
+
let cursor = resolve(path);
|
|
43
|
+
const missingSegments = [];
|
|
44
|
+
for (;;) {
|
|
45
|
+
try {
|
|
46
|
+
return resolve(realpathSync(cursor), ...missingSegments);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
const code = error?.code;
|
|
50
|
+
if (code !== 'ENOENT' && code !== 'ENOTDIR') {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
const parent = dirname(cursor);
|
|
54
|
+
if (parent === cursor) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
missingSegments.unshift(basename(cursor));
|
|
58
|
+
cursor = parent;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function vscodeSourceBoundaryFailure(source, settingsPath) {
|
|
63
|
+
if (source.kind !== 'local') {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
const lexicalSettingsPath = resolve(settingsPath);
|
|
67
|
+
const canonicalSettingsPath = canonicalizePotentialPath(settingsPath);
|
|
68
|
+
const overlaps = pathIsInside(source.localPath, lexicalSettingsPath) ||
|
|
69
|
+
(canonicalSettingsPath !== undefined &&
|
|
70
|
+
pathIsInside(source.localPath, canonicalSettingsPath));
|
|
71
|
+
if (!overlaps && canonicalSettingsPath !== undefined) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
id: 'vscode',
|
|
76
|
+
label: 'VS Code',
|
|
77
|
+
status: 'failed',
|
|
78
|
+
message: overlaps
|
|
79
|
+
? 'VS Code 用户配置路径与本地 Marketplace 来源重叠;为保持来源只读,没有写入配置。'
|
|
80
|
+
: '无法安全确认 VS Code 用户配置路径不在本地 Marketplace 来源内;没有写入配置。',
|
|
81
|
+
recovery: '将 Marketplace 移出 VS Code 用户配置目录,或修正 HOME/XDG/APPDATA 后重试。',
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function resultFromInspection(inspection) {
|
|
85
|
+
return {
|
|
86
|
+
id: inspection.id,
|
|
87
|
+
label: inspection.label,
|
|
88
|
+
status: inspection.status === 'ready' ? 'failed' : inspection.status,
|
|
89
|
+
message: inspection.status === 'ready'
|
|
90
|
+
? `${inspection.label} 注册未执行。`
|
|
91
|
+
: inspection.message,
|
|
92
|
+
recovery: inspection.recovery,
|
|
93
|
+
...(inspection.invocation ? { invocation: inspection.invocation } : {}),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function processFailureMessage(result) {
|
|
97
|
+
if (result.status !== 'failed') {
|
|
98
|
+
return '';
|
|
99
|
+
}
|
|
100
|
+
const detail = result.stderr.trim() || result.stdout.trim() || result.message;
|
|
101
|
+
return `${detail}${result.exitCode === null ? '' : ` (exit ${result.exitCode})`}`;
|
|
102
|
+
}
|
|
103
|
+
function nativeAdapter(definition) {
|
|
104
|
+
const probeArgs = ['plugin', 'marketplace', 'add', '--help'];
|
|
105
|
+
return {
|
|
106
|
+
id: definition.id,
|
|
107
|
+
label: definition.label,
|
|
108
|
+
async inspect(source, runtime) {
|
|
109
|
+
const localFailure = localIndexFailure(source, definition.localIndexCandidates);
|
|
110
|
+
if (localFailure) {
|
|
111
|
+
return failedLocalInspection(definition.id, definition.label, localFailure);
|
|
112
|
+
}
|
|
113
|
+
const probe = await runnerFor(runtime).run({
|
|
114
|
+
executable: definition.executable,
|
|
115
|
+
args: probeArgs,
|
|
116
|
+
captureOutput: true,
|
|
117
|
+
signal: runtime?.signal,
|
|
118
|
+
});
|
|
119
|
+
const invocation = {
|
|
120
|
+
executable: definition.executable,
|
|
121
|
+
args: ['plugin', 'marketplace', 'add', source.clientValue],
|
|
122
|
+
};
|
|
123
|
+
if (probe.status === 'missing') {
|
|
124
|
+
return {
|
|
125
|
+
id: definition.id,
|
|
126
|
+
label: definition.label,
|
|
127
|
+
status: 'missing-cli',
|
|
128
|
+
message: `未找到 ${definition.executable} CLI。`,
|
|
129
|
+
recovery: definition.missingRecovery,
|
|
130
|
+
invocation,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
if (probe.status === 'interrupted') {
|
|
134
|
+
return {
|
|
135
|
+
id: definition.id,
|
|
136
|
+
label: definition.label,
|
|
137
|
+
status: 'interrupted',
|
|
138
|
+
message: `${definition.label} 能力探测被 ${probe.signal} 中断。`,
|
|
139
|
+
recovery: '重新运行命令。',
|
|
140
|
+
invocation,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
if (probe.status === 'failed') {
|
|
144
|
+
return {
|
|
145
|
+
id: definition.id,
|
|
146
|
+
label: definition.label,
|
|
147
|
+
status: 'failed',
|
|
148
|
+
message: `${definition.executable} CLI 不支持 plugin marketplace add: ${processFailureMessage(probe)}`,
|
|
149
|
+
recovery: definition.missingRecovery,
|
|
150
|
+
invocation,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
id: definition.id,
|
|
155
|
+
label: definition.label,
|
|
156
|
+
status: 'ready',
|
|
157
|
+
message: `${definition.label} 可通过原生 CLI 注册。`,
|
|
158
|
+
recovery: definition.missingRecovery,
|
|
159
|
+
invocation,
|
|
160
|
+
};
|
|
161
|
+
},
|
|
162
|
+
async execute(source, inspection, runtime) {
|
|
163
|
+
const localFailure = localIndexFailure(source, definition.localIndexCandidates);
|
|
164
|
+
if (localFailure) {
|
|
165
|
+
return resultFromInspection(failedLocalInspection(definition.id, definition.label, localFailure));
|
|
166
|
+
}
|
|
167
|
+
if (inspection.status !== 'ready') {
|
|
168
|
+
return resultFromInspection(inspection);
|
|
169
|
+
}
|
|
170
|
+
const invocation = inspection.invocation ?? {
|
|
171
|
+
executable: definition.executable,
|
|
172
|
+
args: ['plugin', 'marketplace', 'add', source.clientValue],
|
|
173
|
+
};
|
|
174
|
+
const executed = await runnerFor(runtime).run({
|
|
175
|
+
executable: invocation.executable,
|
|
176
|
+
args: invocation.args,
|
|
177
|
+
captureOutput: false,
|
|
178
|
+
signal: runtime?.signal,
|
|
179
|
+
});
|
|
180
|
+
if (executed.status === 'completed') {
|
|
181
|
+
return {
|
|
182
|
+
id: definition.id,
|
|
183
|
+
label: definition.label,
|
|
184
|
+
status: 'completed',
|
|
185
|
+
message: 'Marketplace 已通过原生 CLI 注册。',
|
|
186
|
+
invocation,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
if (executed.status === 'missing') {
|
|
190
|
+
return {
|
|
191
|
+
id: definition.id,
|
|
192
|
+
label: definition.label,
|
|
193
|
+
status: 'missing-cli',
|
|
194
|
+
message: `执行前未找到 ${definition.executable} CLI。`,
|
|
195
|
+
recovery: definition.missingRecovery,
|
|
196
|
+
invocation,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
if (executed.status === 'interrupted') {
|
|
200
|
+
return {
|
|
201
|
+
id: definition.id,
|
|
202
|
+
label: definition.label,
|
|
203
|
+
status: 'interrupted',
|
|
204
|
+
message: `注册被 ${executed.signal} 中断。`,
|
|
205
|
+
recovery: '确认客户端状态后重新运行命令。',
|
|
206
|
+
invocation,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
id: definition.id,
|
|
211
|
+
label: definition.label,
|
|
212
|
+
status: 'failed',
|
|
213
|
+
message: `原生 CLI 注册失败: ${processFailureMessage(executed)}`,
|
|
214
|
+
recovery: '检查来源、客户端认证与 CLI 输出后重试。',
|
|
215
|
+
invocation,
|
|
216
|
+
};
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
const claudeAdapter = nativeAdapter({
|
|
221
|
+
id: 'claude',
|
|
222
|
+
label: 'Claude Code',
|
|
223
|
+
executable: 'claude',
|
|
224
|
+
localIndexCandidates: ['.claude-plugin/marketplace.json'],
|
|
225
|
+
missingRecovery: '安装或升级 Claude Code CLI,确认 plugin marketplace add 可用后重试。',
|
|
226
|
+
});
|
|
227
|
+
const codexAdapter = nativeAdapter({
|
|
228
|
+
id: 'codex',
|
|
229
|
+
label: 'Codex',
|
|
230
|
+
executable: 'codex',
|
|
231
|
+
localIndexCandidates: ['.agents/plugins/marketplace.json'],
|
|
232
|
+
missingRecovery: '安装或升级 Codex CLI,确认 plugin marketplace add 可用后重试。',
|
|
233
|
+
});
|
|
234
|
+
const COPILOT_VSCODE_LOCAL_INDEX_CANDIDATES = [
|
|
235
|
+
'.github/plugin/marketplace.json',
|
|
236
|
+
'.claude-plugin/marketplace.json',
|
|
237
|
+
];
|
|
238
|
+
const copilotAdapter = nativeAdapter({
|
|
239
|
+
id: 'copilot',
|
|
240
|
+
label: 'GitHub Copilot',
|
|
241
|
+
executable: 'copilot',
|
|
242
|
+
localIndexCandidates: COPILOT_VSCODE_LOCAL_INDEX_CANDIDATES,
|
|
243
|
+
missingRecovery: '安装或升级 GitHub Copilot CLI,确认 plugin marketplace add 可用后重试。',
|
|
244
|
+
});
|
|
245
|
+
const vscodeAdapter = {
|
|
246
|
+
id: 'vscode',
|
|
247
|
+
label: 'VS Code',
|
|
248
|
+
async inspect(source, runtime) {
|
|
249
|
+
const localFailure = localIndexFailure(source, COPILOT_VSCODE_LOCAL_INDEX_CANDIDATES);
|
|
250
|
+
if (localFailure) {
|
|
251
|
+
return failedLocalInspection('vscode', 'VS Code', localFailure);
|
|
252
|
+
}
|
|
253
|
+
const inspected = runtime?.inspectVscode
|
|
254
|
+
? await runtime.inspectVscode(runnerFor(runtime), runtime.signal)
|
|
255
|
+
: await inspectVscodeUserSettings(runnerFor(runtime), {
|
|
256
|
+
...(runtime?.signal ? { signal: runtime.signal } : {}),
|
|
257
|
+
});
|
|
258
|
+
if (inspected.status === 'interrupted') {
|
|
259
|
+
return {
|
|
260
|
+
id: 'vscode',
|
|
261
|
+
label: 'VS Code',
|
|
262
|
+
status: 'interrupted',
|
|
263
|
+
message: `VS Code 探测被 ${inspected.signal} 中断。`,
|
|
264
|
+
recovery: '重新运行命令。',
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
if (inspected.status === 'unavailable') {
|
|
268
|
+
return {
|
|
269
|
+
id: 'vscode',
|
|
270
|
+
label: 'VS Code',
|
|
271
|
+
status: 'failed',
|
|
272
|
+
message: inspected.message,
|
|
273
|
+
recovery: '安装官方 VS Code,或先启动一次以创建用户配置目录后重试。',
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
const sourceBoundaryFailure = vscodeSourceBoundaryFailure(source, inspected.settingsPath);
|
|
277
|
+
if (sourceBoundaryFailure) {
|
|
278
|
+
return sourceBoundaryFailure;
|
|
279
|
+
}
|
|
280
|
+
return {
|
|
281
|
+
id: 'vscode',
|
|
282
|
+
label: 'VS Code',
|
|
283
|
+
status: 'ready',
|
|
284
|
+
message: `将更新用户配置: ${inspected.settingsPath}`,
|
|
285
|
+
recovery: '修复用户 settings.json 或组织策略后重试。',
|
|
286
|
+
settingsPath: inspected.settingsPath,
|
|
287
|
+
};
|
|
288
|
+
},
|
|
289
|
+
async execute(source, inspection, runtime) {
|
|
290
|
+
const localFailure = localIndexFailure(source, COPILOT_VSCODE_LOCAL_INDEX_CANDIDATES);
|
|
291
|
+
if (localFailure) {
|
|
292
|
+
return resultFromInspection(failedLocalInspection('vscode', 'VS Code', localFailure));
|
|
293
|
+
}
|
|
294
|
+
if (inspection.status !== 'ready' || !inspection.settingsPath) {
|
|
295
|
+
return resultFromInspection(inspection);
|
|
296
|
+
}
|
|
297
|
+
const sourceBoundaryFailure = vscodeSourceBoundaryFailure(source, inspection.settingsPath);
|
|
298
|
+
if (sourceBoundaryFailure) {
|
|
299
|
+
return resultFromInspection(sourceBoundaryFailure);
|
|
300
|
+
}
|
|
301
|
+
const updated = (runtime?.updateVscode ?? updateVscodeMarketplaceSettings)({
|
|
302
|
+
settingsPath: inspection.settingsPath,
|
|
303
|
+
source: source.vscodeValue,
|
|
304
|
+
});
|
|
305
|
+
if (updated.status === 'failed') {
|
|
306
|
+
return {
|
|
307
|
+
id: 'vscode',
|
|
308
|
+
label: 'VS Code',
|
|
309
|
+
status: 'failed',
|
|
310
|
+
message: updated.message,
|
|
311
|
+
recovery: '检查当前 settings.json 并修复 JSONC、权限或并发冲突后重试;并发恢复为最佳努力,不能保证保留无条件 rename 窗口内的新 inode 写入。',
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
return {
|
|
315
|
+
id: 'vscode',
|
|
316
|
+
label: 'VS Code',
|
|
317
|
+
status: 'completed',
|
|
318
|
+
message: updated.changed
|
|
319
|
+
? '用户配置已注入;请重新加载 VS Code 窗口。组织策略可能覆盖用户设置。'
|
|
320
|
+
: '用户配置已包含该 Marketplace;请在需要时重新加载 VS Code 窗口。',
|
|
321
|
+
};
|
|
322
|
+
},
|
|
323
|
+
};
|
|
324
|
+
const cursorAdapter = {
|
|
325
|
+
id: 'cursor',
|
|
326
|
+
label: 'Cursor',
|
|
327
|
+
async inspect(source) {
|
|
328
|
+
const localFailure = localIndexFailure(source, ['.cursor-plugin/marketplace.json']);
|
|
329
|
+
if (localFailure) {
|
|
330
|
+
return failedLocalInspection('cursor', 'Cursor', localFailure);
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
id: 'cursor',
|
|
334
|
+
label: 'Cursor',
|
|
335
|
+
status: 'manual-required',
|
|
336
|
+
message: 'Cursor 当前需要通过 Dashboard 手工导入。',
|
|
337
|
+
recovery: 'Cursor Team/Enterprise 管理员进入 Dashboard → Plugins → Add Marketplace → Import from Repo。',
|
|
338
|
+
};
|
|
339
|
+
},
|
|
340
|
+
async execute(_source, inspection) {
|
|
341
|
+
if (inspection.status === 'failed' || inspection.status === 'interrupted') {
|
|
342
|
+
return resultFromInspection(inspection);
|
|
343
|
+
}
|
|
344
|
+
return {
|
|
345
|
+
id: 'cursor',
|
|
346
|
+
label: 'Cursor',
|
|
347
|
+
status: 'manual-required',
|
|
348
|
+
message: 'Dashboard → Plugins → Add Marketplace → Import from Repo;需要 Cursor Team/Enterprise 且由管理员操作。',
|
|
349
|
+
recovery: '满足组织版本和管理员权限后,在 Cursor Dashboard 中导入同一 Git 仓库或本地来源。',
|
|
350
|
+
};
|
|
351
|
+
},
|
|
352
|
+
};
|
|
353
|
+
export const MARKETPLACE_REGISTRATION_ADAPTERS = [
|
|
354
|
+
claudeAdapter,
|
|
355
|
+
codexAdapter,
|
|
356
|
+
copilotAdapter,
|
|
357
|
+
vscodeAdapter,
|
|
358
|
+
cursorAdapter,
|
|
359
|
+
];
|
|
360
|
+
export function getMarketplaceRegistrationAdapter(id) {
|
|
361
|
+
const adapter = MARKETPLACE_REGISTRATION_ADAPTERS.find((candidate) => candidate.id === id);
|
|
362
|
+
if (!adapter) {
|
|
363
|
+
throw new Error(`Unknown marketplace registration adapter: ${id}`);
|
|
364
|
+
}
|
|
365
|
+
return adapter;
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=marketplace-registration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplace-registration.js","sourceRoot":"","sources":["../../src/adapters/marketplace-registration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenSpec 适配器
|
|
3
|
+
*
|
|
4
|
+
* 从 OpenSpec 专属配置生成独立 sidecar。
|
|
5
|
+
* 该 sidecar 不属于 Claude/Codex 原生 manifest,避免污染平台 manifest。
|
|
6
|
+
*/
|
|
7
|
+
import type { PluginYaml } from '../schema/plugin-yaml.js';
|
|
8
|
+
export declare const OPENSPEC_SOURCE_ADAPTERS_FILE = "openspec-source-adapters.yaml";
|
|
9
|
+
export type OpenSpecAdapterKind = 'command' | 'skill' | 'deferred' | 'manual';
|
|
10
|
+
export declare const OPEN_SPEC_ADAPTER_KINDS: OpenSpecAdapterKind[];
|
|
11
|
+
export interface OpenSpecAdapterOperation {
|
|
12
|
+
command?: string;
|
|
13
|
+
args?: string[];
|
|
14
|
+
output?: 'json' | 'markdown' | 'text';
|
|
15
|
+
parser?: 'prd-markdown' | 'yapi-summary-json' | 'raw-json' | 'raw-text';
|
|
16
|
+
skill?: string;
|
|
17
|
+
execution?: 'agent-plan' | 'agent-mcp';
|
|
18
|
+
produces?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface OpenSpecAdapterParam {
|
|
21
|
+
key: string;
|
|
22
|
+
scope?: 'capability' | 'adapter' | 'operation';
|
|
23
|
+
required?: boolean;
|
|
24
|
+
label?: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
sensitive?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface OpenSpecAdapter {
|
|
29
|
+
id: string;
|
|
30
|
+
capability: string;
|
|
31
|
+
kind: OpenSpecAdapterKind;
|
|
32
|
+
operations: Record<string, OpenSpecAdapterOperation>;
|
|
33
|
+
knownParams?: OpenSpecAdapterParam[];
|
|
34
|
+
requiredParams?: OpenSpecAdapterParam[];
|
|
35
|
+
}
|
|
36
|
+
export interface OpenSpecSourceAdaptersYaml {
|
|
37
|
+
schemaVersion?: 'openspec.source-adapters.v1';
|
|
38
|
+
adapters: OpenSpecAdapter[];
|
|
39
|
+
}
|
|
40
|
+
export interface OpenSpecPluginManifest {
|
|
41
|
+
name: string;
|
|
42
|
+
version: string;
|
|
43
|
+
description: string;
|
|
44
|
+
author: PluginYaml['author'];
|
|
45
|
+
openspec: {
|
|
46
|
+
adapters: OpenSpecAdapter[];
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export interface OpenSpecSourceAdapterIndexEntry {
|
|
50
|
+
name: string;
|
|
51
|
+
source: string;
|
|
52
|
+
manifest: string;
|
|
53
|
+
adapters: Array<{
|
|
54
|
+
id: string;
|
|
55
|
+
capability: string;
|
|
56
|
+
kind: OpenSpecAdapter['kind'];
|
|
57
|
+
operations: string[];
|
|
58
|
+
}>;
|
|
59
|
+
}
|
|
60
|
+
export declare function isOpenSpecAdapterKind(value: unknown): value is OpenSpecAdapterKind;
|
|
61
|
+
export declare function findDuplicateOpenSpecAdapterOperations(entries: OpenSpecSourceAdapterIndexEntry[]): string[];
|
|
62
|
+
export declare function assertUniqueOpenSpecAdapterOperations(entries: OpenSpecSourceAdapterIndexEntry[]): void;
|
|
63
|
+
export declare function loadOpenSpecAdapters(pluginDir: string): OpenSpecAdapter[];
|
|
64
|
+
export declare function buildOpenSpecManifest(config: PluginYaml, pluginDir: string): OpenSpecPluginManifest | null;
|
|
65
|
+
export declare function generateOpenSpec(config: PluginYaml, pluginDir: string): boolean;
|
|
66
|
+
export declare function buildOpenSpecSourceAdapterIndexEntry(config: PluginYaml, pluginDir: string, relativePath: string): OpenSpecSourceAdapterIndexEntry | null;
|