@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
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface ProcessRequest {
|
|
2
|
+
readonly executable: string;
|
|
3
|
+
readonly args: readonly string[];
|
|
4
|
+
readonly captureOutput: boolean;
|
|
5
|
+
readonly signal?: AbortSignal;
|
|
6
|
+
}
|
|
7
|
+
interface ProcessOutput {
|
|
8
|
+
readonly stdout: string;
|
|
9
|
+
readonly stderr: string;
|
|
10
|
+
}
|
|
11
|
+
export type ProcessResult = (ProcessOutput & {
|
|
12
|
+
readonly status: 'completed';
|
|
13
|
+
readonly exitCode: 0;
|
|
14
|
+
}) | (ProcessOutput & {
|
|
15
|
+
readonly status: 'missing';
|
|
16
|
+
readonly message: string;
|
|
17
|
+
}) | (ProcessOutput & {
|
|
18
|
+
readonly status: 'failed';
|
|
19
|
+
readonly exitCode: number | null;
|
|
20
|
+
readonly message: string;
|
|
21
|
+
}) | (ProcessOutput & {
|
|
22
|
+
readonly status: 'interrupted';
|
|
23
|
+
readonly signal: NodeJS.Signals;
|
|
24
|
+
});
|
|
25
|
+
export interface ProcessRunner {
|
|
26
|
+
run(request: ProcessRequest): ProcessResult | Promise<ProcessResult>;
|
|
27
|
+
}
|
|
28
|
+
export declare const systemProcessRunner: ProcessRunner;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
const INTERRUPT_ESCALATION_DELAY_MS = 500;
|
|
3
|
+
function outputText(value) {
|
|
4
|
+
if (typeof value === 'string') {
|
|
5
|
+
return value;
|
|
6
|
+
}
|
|
7
|
+
return value ? value.toString('utf8') : '';
|
|
8
|
+
}
|
|
9
|
+
export const systemProcessRunner = {
|
|
10
|
+
async run(request) {
|
|
11
|
+
if (request.signal?.aborted) {
|
|
12
|
+
return { status: 'interrupted', signal: 'SIGINT', stdout: '', stderr: '' };
|
|
13
|
+
}
|
|
14
|
+
return await new Promise((resolveResult) => {
|
|
15
|
+
const stdoutChunks = [];
|
|
16
|
+
const stderrChunks = [];
|
|
17
|
+
let settled = false;
|
|
18
|
+
let aborted = false;
|
|
19
|
+
let escalationTimer;
|
|
20
|
+
const child = spawn(request.executable, [...request.args], {
|
|
21
|
+
shell: false,
|
|
22
|
+
stdio: request.captureOutput ? ['ignore', 'pipe', 'pipe'] : 'inherit',
|
|
23
|
+
windowsHide: true,
|
|
24
|
+
});
|
|
25
|
+
child.stdout?.on('data', (chunk) => {
|
|
26
|
+
stdoutChunks.push(Buffer.from(chunk));
|
|
27
|
+
});
|
|
28
|
+
child.stderr?.on('data', (chunk) => {
|
|
29
|
+
stderrChunks.push(Buffer.from(chunk));
|
|
30
|
+
});
|
|
31
|
+
const output = () => ({
|
|
32
|
+
stdout: outputText(Buffer.concat(stdoutChunks)),
|
|
33
|
+
stderr: outputText(Buffer.concat(stderrChunks)),
|
|
34
|
+
});
|
|
35
|
+
const cleanup = () => {
|
|
36
|
+
request.signal?.removeEventListener('abort', onAbort);
|
|
37
|
+
if (escalationTimer) {
|
|
38
|
+
clearTimeout(escalationTimer);
|
|
39
|
+
escalationTimer = undefined;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const settle = (result) => {
|
|
43
|
+
if (settled) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
settled = true;
|
|
47
|
+
cleanup();
|
|
48
|
+
resolveResult(result);
|
|
49
|
+
};
|
|
50
|
+
const onAbort = () => {
|
|
51
|
+
if (aborted || settled) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
aborted = true;
|
|
55
|
+
try {
|
|
56
|
+
child.kill('SIGINT');
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// The close/error event below owns the final result.
|
|
60
|
+
}
|
|
61
|
+
escalationTimer = setTimeout(() => {
|
|
62
|
+
if (settled) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
child.kill('SIGKILL');
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// A child that has already exited will still emit close/error.
|
|
70
|
+
}
|
|
71
|
+
}, INTERRUPT_ESCALATION_DELAY_MS);
|
|
72
|
+
escalationTimer.unref();
|
|
73
|
+
};
|
|
74
|
+
request.signal?.addEventListener('abort', onAbort, { once: true });
|
|
75
|
+
if (request.signal?.aborted) {
|
|
76
|
+
onAbort();
|
|
77
|
+
}
|
|
78
|
+
child.once('error', (rawError) => {
|
|
79
|
+
const error = rawError;
|
|
80
|
+
if (aborted) {
|
|
81
|
+
settle({ status: 'interrupted', signal: 'SIGINT', ...output() });
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (error.code === 'ENOENT') {
|
|
85
|
+
settle({
|
|
86
|
+
status: 'missing',
|
|
87
|
+
...output(),
|
|
88
|
+
message: `未找到 executable: ${request.executable}`,
|
|
89
|
+
});
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
settle({
|
|
93
|
+
status: 'failed',
|
|
94
|
+
exitCode: null,
|
|
95
|
+
...output(),
|
|
96
|
+
message: error.message,
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
child.once('close', (exitCode, signal) => {
|
|
100
|
+
if (aborted) {
|
|
101
|
+
settle({
|
|
102
|
+
status: 'interrupted',
|
|
103
|
+
signal: 'SIGINT',
|
|
104
|
+
...output(),
|
|
105
|
+
});
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (signal) {
|
|
109
|
+
settle({
|
|
110
|
+
status: 'interrupted',
|
|
111
|
+
signal,
|
|
112
|
+
...output(),
|
|
113
|
+
});
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (exitCode === 0) {
|
|
117
|
+
settle({ status: 'completed', exitCode: 0, ...output() });
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
settle({
|
|
121
|
+
status: 'failed',
|
|
122
|
+
exitCode,
|
|
123
|
+
...output(),
|
|
124
|
+
message: `${request.executable} 退出码 ${exitCode ?? 'unknown'}`,
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=process-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-runner.js","sourceRoot":"","sources":["../../src/infrastructure/process-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { renameSync } from 'node:fs';
|
|
2
|
+
import type { ProcessRunner } from './process-runner.js';
|
|
3
|
+
export interface VscodeSettingsInspectionReady {
|
|
4
|
+
readonly status: 'ready';
|
|
5
|
+
readonly settingsPath: string;
|
|
6
|
+
}
|
|
7
|
+
export interface VscodeSettingsInspectionUnavailable {
|
|
8
|
+
readonly status: 'unavailable';
|
|
9
|
+
readonly message: string;
|
|
10
|
+
}
|
|
11
|
+
export interface VscodeSettingsInspectionInterrupted {
|
|
12
|
+
readonly status: 'interrupted';
|
|
13
|
+
readonly signal: NodeJS.Signals;
|
|
14
|
+
}
|
|
15
|
+
export type VscodeSettingsInspection = VscodeSettingsInspectionReady | VscodeSettingsInspectionUnavailable | VscodeSettingsInspectionInterrupted;
|
|
16
|
+
export interface InspectVscodeUserSettingsOptions {
|
|
17
|
+
readonly platform?: NodeJS.Platform;
|
|
18
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
19
|
+
readonly homeDir?: string;
|
|
20
|
+
readonly signal?: AbortSignal;
|
|
21
|
+
}
|
|
22
|
+
export interface VscodeSettingsUpdateRequest {
|
|
23
|
+
readonly settingsPath: string;
|
|
24
|
+
readonly source: string;
|
|
25
|
+
}
|
|
26
|
+
export type VscodeSettingsUpdateResult = {
|
|
27
|
+
readonly status: 'completed';
|
|
28
|
+
readonly changed: boolean;
|
|
29
|
+
readonly settingsPath: string;
|
|
30
|
+
} | {
|
|
31
|
+
readonly status: 'failed';
|
|
32
|
+
readonly message: string;
|
|
33
|
+
readonly settingsPath: string;
|
|
34
|
+
};
|
|
35
|
+
export interface VscodeSettingsUpdateDependencies {
|
|
36
|
+
readonly beforeRevisionCheck?: () => void;
|
|
37
|
+
readonly beforeRecoveryRename?: () => void;
|
|
38
|
+
readonly rename?: typeof renameSync;
|
|
39
|
+
}
|
|
40
|
+
export declare function resolveVscodeUserSettingsPath(options?: InspectVscodeUserSettingsOptions): string | undefined;
|
|
41
|
+
export declare function inspectVscodeUserSettings(processRunner: ProcessRunner, options?: InspectVscodeUserSettingsOptions): Promise<VscodeSettingsInspection>;
|
|
42
|
+
export declare function updateVscodeMarketplaceSettings(request: VscodeSettingsUpdateRequest, dependencies?: VscodeSettingsUpdateDependencies): VscodeSettingsUpdateResult;
|