@mcpeak/cli 0.12.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +1 -1
- package/dist/cli.mjs +1 -1
- package/dist/commands.cjs +58 -9
- package/dist/commands.d.cts +42 -3
- package/dist/commands.d.mts +42 -3
- package/dist/commands.mjs +45 -2
- package/dist/{repair-command-8GUlJJ47.d.mts → index-CBFNkZgR.d.mts} +147 -3
- package/dist/{repair-command-CVFqxU6V.d.cts → index-_hQ_Ohu-.d.cts} +146 -2
- package/dist/index.cjs +6 -219
- package/dist/index.d.cts +2 -16
- package/dist/index.d.mts +2 -16
- package/dist/index.mjs +2 -217
- package/dist/{test-command-1m3myzTS.cjs → src-BBBK_BXs.cjs} +6739 -5202
- package/dist/{test-command-P8_uaAIy.mjs → src-CRsYPuu_.mjs} +6715 -5202
- package/package.json +17 -7
package/dist/index.cjs
CHANGED
|
@@ -1,220 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
"repair",
|
|
9
|
-
"record",
|
|
10
|
-
"mock"
|
|
11
|
-
];
|
|
12
|
-
const unavailableDependencies = {
|
|
13
|
-
readFile: async () => {
|
|
14
|
-
throw new Error("runtime dependencies unavailable");
|
|
15
|
-
},
|
|
16
|
-
validateSuite: () => {
|
|
17
|
-
throw new Error("runtime dependencies unavailable");
|
|
18
|
-
},
|
|
19
|
-
connect: async () => {
|
|
20
|
-
throw new Error("runtime dependencies unavailable");
|
|
21
|
-
},
|
|
22
|
-
startRunner: () => {
|
|
23
|
-
throw new Error("runtime dependencies unavailable");
|
|
24
|
-
},
|
|
25
|
-
finalize: async () => {
|
|
26
|
-
throw new Error("runtime dependencies unavailable");
|
|
27
|
-
},
|
|
28
|
-
renderReport: () => {
|
|
29
|
-
throw new Error("runtime dependencies unavailable");
|
|
30
|
-
},
|
|
31
|
-
renderJUnit: () => {
|
|
32
|
-
throw new Error("runtime dependencies unavailable");
|
|
33
|
-
},
|
|
34
|
-
writeFile: async () => {
|
|
35
|
-
throw new Error("runtime dependencies unavailable");
|
|
36
|
-
},
|
|
37
|
-
colorEnabled: false,
|
|
38
|
-
writeStdout: (text) => process.stdout.write(text),
|
|
39
|
-
writeStderr: (text) => process.stderr.write(text)
|
|
40
|
-
};
|
|
41
|
-
const unavailableRuntimeDependencies = {
|
|
42
|
-
...unavailableDependencies,
|
|
43
|
-
readFile: node_fs_promises.readFile
|
|
44
|
-
};
|
|
45
|
-
/**
|
|
46
|
-
* `repair` 실행 의존성. 함수로 빼 둔 이유는 **주입 자체를 테스트가 단언할 수 있게** 하기
|
|
47
|
-
* 위해서다. 분기 안에 리터럴로 두면 `reviewIO` 를 빠뜨려도 아무 테스트도 안 깨진다.
|
|
48
|
-
* 실제로 그렇게 한 번 빠뜨렸다(T10 보고서).
|
|
49
|
-
*
|
|
50
|
-
* 대화형 판정은 `generate` 와 같은 기준이다. 같은 `nodeReviewIO()` 를 쓰고, 그 구현이
|
|
51
|
-
* stdin·stdout 이 둘 다 TTY 일 때만 `interactive` 를 참으로 만든다.
|
|
52
|
-
*/
|
|
53
|
-
function nodeRepairDependencies(generate) {
|
|
54
|
-
return {
|
|
55
|
-
readFile: (path) => (0, node_fs_promises.readFile)(path, "utf8"),
|
|
56
|
-
writeStdout: (text) => void process.stdout.write(text),
|
|
57
|
-
writeStderr: (text) => void process.stderr.write(text),
|
|
58
|
-
reviewIO: require_test_command.nodeReviewIO(),
|
|
59
|
-
diagnosis: {
|
|
60
|
-
prepare: generate.prepareDiagnosisRequest,
|
|
61
|
-
dispatch: generate.dispatchDiagnosisRequest,
|
|
62
|
-
providers: {
|
|
63
|
-
codex: (model) => generate.createCodexProvider({ model }),
|
|
64
|
-
claude: (model) => generate.createClaudeProvider({ model })
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
/** `mcpeak help <이름>` 으로 볼 수 있는 명령. 위 두 갈래가 같은 목록을 봐야 한다. */
|
|
70
|
-
const HELP_TOPICS = [
|
|
71
|
-
"test",
|
|
72
|
-
"generate",
|
|
73
|
-
"repair"
|
|
74
|
-
];
|
|
75
|
-
const isHelpTopic = (value) => HELP_TOPICS.includes(value);
|
|
76
|
-
async function run(argv) {
|
|
77
|
-
if (argv.length === 0 || argv.length === 1 && [
|
|
78
|
-
"--help",
|
|
79
|
-
"-h",
|
|
80
|
-
"help"
|
|
81
|
-
].includes(argv[0] ?? "")) {
|
|
82
|
-
process.stdout.write(require_test_command.GLOBAL_HELP);
|
|
83
|
-
return 0;
|
|
84
|
-
}
|
|
85
|
-
if (argv.length === 2) {
|
|
86
|
-
const command = argv[0] === "help" ? argv[1] : argv[1] === "--help" ? argv[0] : void 0;
|
|
87
|
-
if (command === "replay" || command === "verify") return require_test_command.runCli([command], unavailableDependencies);
|
|
88
|
-
if (isHelpTopic(command)) {
|
|
89
|
-
process.stdout.write(require_test_command.commandHelp(command));
|
|
90
|
-
return 0;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* `help` 로 시작했는데 위에서 안 걸렸다면 **뒤에 붙은 인자가 틀린 것**이다.
|
|
95
|
-
*
|
|
96
|
-
* 여기서 안 막고 아래로 흘려보내면 `runCli` 가 `argv[0]` 인 `help` 를 명령으로 읽어
|
|
97
|
-
* "알 수 없는 CLI 명령 'help'입니다" 라고 한다. 사용자가 정확히 친 토큰을 틀렸다고
|
|
98
|
-
* 지목하는 셈이라, 무엇을 고쳐야 하는지가 화면에서 사라진다.
|
|
99
|
-
*/
|
|
100
|
-
if (argv[0] === "help") {
|
|
101
|
-
const target = argv[1] ?? "";
|
|
102
|
-
const extra = argv[2];
|
|
103
|
-
const message = isHelpTopic(target) && extra !== void 0 ? `\`help ${require_test_command.escapeTerminalText(target)}\` 뒤의 '${require_test_command.escapeTerminalText(extra)}' 는 받지 않습니다.` : `도움말이 없는 명령 '${require_test_command.escapeTerminalText(target)}'입니다.`;
|
|
104
|
-
process.stderr.write(`오류 [CLI_USAGE]: ${message}\n해결: ${require_test_command.commandDiscovery}\n`);
|
|
105
|
-
return 1;
|
|
106
|
-
}
|
|
107
|
-
if (argv.length === 1 && argv[0] === "--version") {
|
|
108
|
-
process.stdout.write(`mcpeak ${require_test_command.version}\n`);
|
|
109
|
-
return 0;
|
|
110
|
-
}
|
|
111
|
-
if (argv[0] === "generate") {
|
|
112
|
-
let core;
|
|
113
|
-
let runner;
|
|
114
|
-
let generate;
|
|
115
|
-
try {
|
|
116
|
-
[core, runner, generate] = await Promise.all([
|
|
117
|
-
import("@mcpeak/core"),
|
|
118
|
-
import("@mcpeak/runner"),
|
|
119
|
-
import("@mcpeak/generate")
|
|
120
|
-
]);
|
|
121
|
-
} catch {
|
|
122
|
-
return require_test_command.runGenerateCommand(argv, {
|
|
123
|
-
...require_test_command.nodeGenerateDependencies(),
|
|
124
|
-
connect: unavailableDependencies.connect,
|
|
125
|
-
createBaselineSuite: unavailableDependencies.validateSuite,
|
|
126
|
-
createAuthoringSession: unavailableDependencies.validateSuite,
|
|
127
|
-
finalizeAuthoringDraft: unavailableDependencies.validateSuite,
|
|
128
|
-
getAuthoringExecutionSuite: unavailableDependencies.validateSuite,
|
|
129
|
-
validateSuite: unavailableDependencies.validateSuite
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
return require_test_command.runGenerateCommand(argv, {
|
|
133
|
-
...require_test_command.nodeGenerateDependencies(),
|
|
134
|
-
connect: core.connectStdio,
|
|
135
|
-
connectHttp: core.connectHttp,
|
|
136
|
-
readEnv: (name) => process.env[name],
|
|
137
|
-
createBaselineSuite: generate.createBaselineSuite,
|
|
138
|
-
createAuthoringSession: generate.createAuthoringSession,
|
|
139
|
-
finalizeAuthoringDraft: generate.finalizeAuthoringDraft,
|
|
140
|
-
getAuthoringExecutionSuite: generate.getAuthoringExecutionSuite,
|
|
141
|
-
validateSuite: runner.validateMcpSuite,
|
|
142
|
-
reviewIO: require_test_command.nodeReviewIO(),
|
|
143
|
-
providers: {
|
|
144
|
-
codex: (model) => generate.createCodexAuthoringProvider({ model }),
|
|
145
|
-
claude: (model) => generate.createClaudeAuthoringProvider({ model })
|
|
146
|
-
},
|
|
147
|
-
prepareAuthoringRequest: generate.prepareAuthoringRequest,
|
|
148
|
-
dispatchAuthoringRequest: generate.dispatchAuthoringRequest,
|
|
149
|
-
createAuthoringDiff: generate.createAuthoringDiff,
|
|
150
|
-
applyAuthoringChanges: generate.applyAuthoringChanges,
|
|
151
|
-
reviewLocalAuthoringCandidate: generate.reviewLocalAuthoringCandidate,
|
|
152
|
-
computeCoverage: generate.computeCoverage,
|
|
153
|
-
preparePreFillRequest: generate.preparePreFillRequest,
|
|
154
|
-
previewPreFillRequest: generate.previewPreFillRequest,
|
|
155
|
-
dispatchPreFillRequest: generate.dispatchPreFillRequest,
|
|
156
|
-
preFillProviders: {
|
|
157
|
-
codex: (model) => generate.createCodexProvider({ model }),
|
|
158
|
-
claude: (model) => generate.createClaudeProvider({ model })
|
|
159
|
-
},
|
|
160
|
-
prepareRejectionDiagnosisRequests: generate.prepareRejectionDiagnosisRequests,
|
|
161
|
-
dispatchRejectionDiagnosis: generate.dispatchRejectionDiagnosis,
|
|
162
|
-
rejectionProviders: {
|
|
163
|
-
codex: (model) => generate.createCodexProvider({ model }),
|
|
164
|
-
claude: (model) => generate.createClaudeProvider({ model })
|
|
165
|
-
},
|
|
166
|
-
GenerateTestsError: generate.GenerateTestsError
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
if (argv[0] === "repair") {
|
|
170
|
-
/**
|
|
171
|
-
* `generate` 분기와 같은 모양으로 동적 import 한다. `test` 경로는 이 분기를 지나지 않으므로
|
|
172
|
-
* 여전히 `core` 와 `runner` 만 로드한다. 계획서 §8 위험표 첫 줄.
|
|
173
|
-
*/
|
|
174
|
-
let generate;
|
|
175
|
-
try {
|
|
176
|
-
generate = await import("@mcpeak/generate");
|
|
177
|
-
} catch {
|
|
178
|
-
process.stderr.write("오류 [REPAIR_RUNTIME_UNAVAILABLE]: 진단에 필요한 @mcpeak/generate 를 로드하지 못했습니다.\n해결: 의존성을 설치한 뒤 다시 실행하세요.\n");
|
|
179
|
-
return 1;
|
|
180
|
-
}
|
|
181
|
-
const dependencies = nodeRepairDependencies(generate);
|
|
182
|
-
try {
|
|
183
|
-
return await require_test_command.runRepairCommand(argv, dependencies);
|
|
184
|
-
} finally {
|
|
185
|
-
dependencies.reviewIO?.close?.();
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
if (argv[0] !== "test") return require_test_command.runCli(argv, unavailableDependencies);
|
|
189
|
-
try {
|
|
190
|
-
if (!require_test_command.parseTestCommand(argv.slice(1)).suitePath.toLowerCase().endsWith(".json")) return require_test_command.runCli(argv, unavailableDependencies);
|
|
191
|
-
} catch {
|
|
192
|
-
return require_test_command.runCli(argv, unavailableDependencies);
|
|
193
|
-
}
|
|
194
|
-
let core;
|
|
195
|
-
let runner;
|
|
196
|
-
try {
|
|
197
|
-
[core, runner] = await Promise.all([import("@mcpeak/core"), import("@mcpeak/runner")]);
|
|
198
|
-
} catch {
|
|
199
|
-
return require_test_command.runCli(argv, unavailableRuntimeDependencies);
|
|
200
|
-
}
|
|
201
|
-
return require_test_command.runCli(argv, {
|
|
202
|
-
readFile: node_fs_promises.readFile,
|
|
203
|
-
validateSuite: runner.validateMcpSuite,
|
|
204
|
-
connect: core.connectStdio,
|
|
205
|
-
connectHttp: core.connectHttp,
|
|
206
|
-
readEnv: (name) => process.env[name],
|
|
207
|
-
startRunner: runner.runSuite,
|
|
208
|
-
finalize: runner.finalizeRunnerExecution,
|
|
209
|
-
renderReport: runner.renderReport,
|
|
210
|
-
renderJUnit: runner.renderJUnit,
|
|
211
|
-
writeFile: (path, text) => (0, node_fs_promises.writeFile)(path, text, "utf8"),
|
|
212
|
-
colorEnabled: process.stdout.isTTY === true && process.env.NO_COLOR === void 0,
|
|
213
|
-
writeStdout: (text) => process.stdout.write(text),
|
|
214
|
-
writeStderr: (text) => process.stderr.write(text)
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
//#endregion
|
|
218
|
-
exports.COMMANDS = COMMANDS;
|
|
219
|
-
exports.nodeRepairDependencies = nodeRepairDependencies;
|
|
220
|
-
exports.run = run;
|
|
2
|
+
const require_src = require("./src-BBBK_BXs.cjs");
|
|
3
|
+
exports.COMMANDS = require_src.COMMANDS;
|
|
4
|
+
exports.nodeAuditDependencies = require_src.nodeAuditDependencies;
|
|
5
|
+
exports.nodeOptimizeDependencies = require_src.nodeOptimizeDependencies;
|
|
6
|
+
exports.nodeRepairDependencies = require_src.nodeRepairDependencies;
|
|
7
|
+
exports.run = require_src.run;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,16 +1,2 @@
|
|
|
1
|
-
import { t as
|
|
2
|
-
|
|
3
|
-
type Command = (argv: string[]) => Promise<number>;
|
|
4
|
-
declare const COMMANDS: readonly ["test", "generate", "repair", "record", "mock"];
|
|
5
|
-
/**
|
|
6
|
-
* `repair` 실행 의존성. 함수로 빼 둔 이유는 **주입 자체를 테스트가 단언할 수 있게** 하기
|
|
7
|
-
* 위해서다. 분기 안에 리터럴로 두면 `reviewIO` 를 빠뜨려도 아무 테스트도 안 깨진다.
|
|
8
|
-
* 실제로 그렇게 한 번 빠뜨렸다(T10 보고서).
|
|
9
|
-
*
|
|
10
|
-
* 대화형 판정은 `generate` 와 같은 기준이다. 같은 `nodeReviewIO()` 를 쓰고, 그 구현이
|
|
11
|
-
* stdin·stdout 이 둘 다 TTY 일 때만 `interactive` 를 참으로 만든다.
|
|
12
|
-
*/
|
|
13
|
-
declare function nodeRepairDependencies(generate: typeof import("@mcpeak/generate")): RepairCommandDependencies;
|
|
14
|
-
declare function run(argv: string[]): Promise<number>;
|
|
15
|
-
//#endregion
|
|
16
|
-
export { COMMANDS, Command, nodeRepairDependencies, run };
|
|
1
|
+
import { a as nodeRepairDependencies, i as nodeOptimizeDependencies, n as Command, o as run, r as nodeAuditDependencies, t as COMMANDS } from "./index-_hQ_Ohu-.cjs";
|
|
2
|
+
export { COMMANDS, Command, nodeAuditDependencies, nodeOptimizeDependencies, nodeRepairDependencies, run };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,16 +1,2 @@
|
|
|
1
|
-
import { t as
|
|
2
|
-
|
|
3
|
-
type Command = (argv: string[]) => Promise<number>;
|
|
4
|
-
declare const COMMANDS: readonly ["test", "generate", "repair", "record", "mock"];
|
|
5
|
-
/**
|
|
6
|
-
* `repair` 실행 의존성. 함수로 빼 둔 이유는 **주입 자체를 테스트가 단언할 수 있게** 하기
|
|
7
|
-
* 위해서다. 분기 안에 리터럴로 두면 `reviewIO` 를 빠뜨려도 아무 테스트도 안 깨진다.
|
|
8
|
-
* 실제로 그렇게 한 번 빠뜨렸다(T10 보고서).
|
|
9
|
-
*
|
|
10
|
-
* 대화형 판정은 `generate` 와 같은 기준이다. 같은 `nodeReviewIO()` 를 쓰고, 그 구현이
|
|
11
|
-
* stdin·stdout 이 둘 다 TTY 일 때만 `interactive` 를 참으로 만든다.
|
|
12
|
-
*/
|
|
13
|
-
declare function nodeRepairDependencies(generate: typeof import("@mcpeak/generate")): RepairCommandDependencies;
|
|
14
|
-
declare function run(argv: string[]): Promise<number>;
|
|
15
|
-
//#endregion
|
|
16
|
-
export { COMMANDS, Command, nodeRepairDependencies, run };
|
|
1
|
+
import { a as nodeRepairDependencies, i as nodeOptimizeDependencies, n as Command, o as run, r as nodeAuditDependencies, t as COMMANDS } from "./index-CBFNkZgR.mjs";
|
|
2
|
+
export { COMMANDS, Command, nodeAuditDependencies, nodeOptimizeDependencies, nodeRepairDependencies, run };
|
package/dist/index.mjs
CHANGED
|
@@ -1,217 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
//#region src/index.ts
|
|
4
|
-
const COMMANDS = [
|
|
5
|
-
"test",
|
|
6
|
-
"generate",
|
|
7
|
-
"repair",
|
|
8
|
-
"record",
|
|
9
|
-
"mock"
|
|
10
|
-
];
|
|
11
|
-
const unavailableDependencies = {
|
|
12
|
-
readFile: async () => {
|
|
13
|
-
throw new Error("runtime dependencies unavailable");
|
|
14
|
-
},
|
|
15
|
-
validateSuite: () => {
|
|
16
|
-
throw new Error("runtime dependencies unavailable");
|
|
17
|
-
},
|
|
18
|
-
connect: async () => {
|
|
19
|
-
throw new Error("runtime dependencies unavailable");
|
|
20
|
-
},
|
|
21
|
-
startRunner: () => {
|
|
22
|
-
throw new Error("runtime dependencies unavailable");
|
|
23
|
-
},
|
|
24
|
-
finalize: async () => {
|
|
25
|
-
throw new Error("runtime dependencies unavailable");
|
|
26
|
-
},
|
|
27
|
-
renderReport: () => {
|
|
28
|
-
throw new Error("runtime dependencies unavailable");
|
|
29
|
-
},
|
|
30
|
-
renderJUnit: () => {
|
|
31
|
-
throw new Error("runtime dependencies unavailable");
|
|
32
|
-
},
|
|
33
|
-
writeFile: async () => {
|
|
34
|
-
throw new Error("runtime dependencies unavailable");
|
|
35
|
-
},
|
|
36
|
-
colorEnabled: false,
|
|
37
|
-
writeStdout: (text) => process.stdout.write(text),
|
|
38
|
-
writeStderr: (text) => process.stderr.write(text)
|
|
39
|
-
};
|
|
40
|
-
const unavailableRuntimeDependencies = {
|
|
41
|
-
...unavailableDependencies,
|
|
42
|
-
readFile
|
|
43
|
-
};
|
|
44
|
-
/**
|
|
45
|
-
* `repair` 실행 의존성. 함수로 빼 둔 이유는 **주입 자체를 테스트가 단언할 수 있게** 하기
|
|
46
|
-
* 위해서다. 분기 안에 리터럴로 두면 `reviewIO` 를 빠뜨려도 아무 테스트도 안 깨진다.
|
|
47
|
-
* 실제로 그렇게 한 번 빠뜨렸다(T10 보고서).
|
|
48
|
-
*
|
|
49
|
-
* 대화형 판정은 `generate` 와 같은 기준이다. 같은 `nodeReviewIO()` 를 쓰고, 그 구현이
|
|
50
|
-
* stdin·stdout 이 둘 다 TTY 일 때만 `interactive` 를 참으로 만든다.
|
|
51
|
-
*/
|
|
52
|
-
function nodeRepairDependencies(generate) {
|
|
53
|
-
return {
|
|
54
|
-
readFile: (path) => readFile(path, "utf8"),
|
|
55
|
-
writeStdout: (text) => void process.stdout.write(text),
|
|
56
|
-
writeStderr: (text) => void process.stderr.write(text),
|
|
57
|
-
reviewIO: nodeReviewIO(),
|
|
58
|
-
diagnosis: {
|
|
59
|
-
prepare: generate.prepareDiagnosisRequest,
|
|
60
|
-
dispatch: generate.dispatchDiagnosisRequest,
|
|
61
|
-
providers: {
|
|
62
|
-
codex: (model) => generate.createCodexProvider({ model }),
|
|
63
|
-
claude: (model) => generate.createClaudeProvider({ model })
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
/** `mcpeak help <이름>` 으로 볼 수 있는 명령. 위 두 갈래가 같은 목록을 봐야 한다. */
|
|
69
|
-
const HELP_TOPICS = [
|
|
70
|
-
"test",
|
|
71
|
-
"generate",
|
|
72
|
-
"repair"
|
|
73
|
-
];
|
|
74
|
-
const isHelpTopic = (value) => HELP_TOPICS.includes(value);
|
|
75
|
-
async function run(argv) {
|
|
76
|
-
if (argv.length === 0 || argv.length === 1 && [
|
|
77
|
-
"--help",
|
|
78
|
-
"-h",
|
|
79
|
-
"help"
|
|
80
|
-
].includes(argv[0] ?? "")) {
|
|
81
|
-
process.stdout.write(GLOBAL_HELP);
|
|
82
|
-
return 0;
|
|
83
|
-
}
|
|
84
|
-
if (argv.length === 2) {
|
|
85
|
-
const command = argv[0] === "help" ? argv[1] : argv[1] === "--help" ? argv[0] : void 0;
|
|
86
|
-
if (command === "replay" || command === "verify") return runCli([command], unavailableDependencies);
|
|
87
|
-
if (isHelpTopic(command)) {
|
|
88
|
-
process.stdout.write(commandHelp(command));
|
|
89
|
-
return 0;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* `help` 로 시작했는데 위에서 안 걸렸다면 **뒤에 붙은 인자가 틀린 것**이다.
|
|
94
|
-
*
|
|
95
|
-
* 여기서 안 막고 아래로 흘려보내면 `runCli` 가 `argv[0]` 인 `help` 를 명령으로 읽어
|
|
96
|
-
* "알 수 없는 CLI 명령 'help'입니다" 라고 한다. 사용자가 정확히 친 토큰을 틀렸다고
|
|
97
|
-
* 지목하는 셈이라, 무엇을 고쳐야 하는지가 화면에서 사라진다.
|
|
98
|
-
*/
|
|
99
|
-
if (argv[0] === "help") {
|
|
100
|
-
const target = argv[1] ?? "";
|
|
101
|
-
const extra = argv[2];
|
|
102
|
-
const message = isHelpTopic(target) && extra !== void 0 ? `\`help ${escapeTerminalText(target)}\` 뒤의 '${escapeTerminalText(extra)}' 는 받지 않습니다.` : `도움말이 없는 명령 '${escapeTerminalText(target)}'입니다.`;
|
|
103
|
-
process.stderr.write(`오류 [CLI_USAGE]: ${message}\n해결: ${commandDiscovery}\n`);
|
|
104
|
-
return 1;
|
|
105
|
-
}
|
|
106
|
-
if (argv.length === 1 && argv[0] === "--version") {
|
|
107
|
-
process.stdout.write(`mcpeak ${version}\n`);
|
|
108
|
-
return 0;
|
|
109
|
-
}
|
|
110
|
-
if (argv[0] === "generate") {
|
|
111
|
-
let core;
|
|
112
|
-
let runner;
|
|
113
|
-
let generate;
|
|
114
|
-
try {
|
|
115
|
-
[core, runner, generate] = await Promise.all([
|
|
116
|
-
import("@mcpeak/core"),
|
|
117
|
-
import("@mcpeak/runner"),
|
|
118
|
-
import("@mcpeak/generate")
|
|
119
|
-
]);
|
|
120
|
-
} catch {
|
|
121
|
-
return runGenerateCommand(argv, {
|
|
122
|
-
...nodeGenerateDependencies(),
|
|
123
|
-
connect: unavailableDependencies.connect,
|
|
124
|
-
createBaselineSuite: unavailableDependencies.validateSuite,
|
|
125
|
-
createAuthoringSession: unavailableDependencies.validateSuite,
|
|
126
|
-
finalizeAuthoringDraft: unavailableDependencies.validateSuite,
|
|
127
|
-
getAuthoringExecutionSuite: unavailableDependencies.validateSuite,
|
|
128
|
-
validateSuite: unavailableDependencies.validateSuite
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
return runGenerateCommand(argv, {
|
|
132
|
-
...nodeGenerateDependencies(),
|
|
133
|
-
connect: core.connectStdio,
|
|
134
|
-
connectHttp: core.connectHttp,
|
|
135
|
-
readEnv: (name) => process.env[name],
|
|
136
|
-
createBaselineSuite: generate.createBaselineSuite,
|
|
137
|
-
createAuthoringSession: generate.createAuthoringSession,
|
|
138
|
-
finalizeAuthoringDraft: generate.finalizeAuthoringDraft,
|
|
139
|
-
getAuthoringExecutionSuite: generate.getAuthoringExecutionSuite,
|
|
140
|
-
validateSuite: runner.validateMcpSuite,
|
|
141
|
-
reviewIO: nodeReviewIO(),
|
|
142
|
-
providers: {
|
|
143
|
-
codex: (model) => generate.createCodexAuthoringProvider({ model }),
|
|
144
|
-
claude: (model) => generate.createClaudeAuthoringProvider({ model })
|
|
145
|
-
},
|
|
146
|
-
prepareAuthoringRequest: generate.prepareAuthoringRequest,
|
|
147
|
-
dispatchAuthoringRequest: generate.dispatchAuthoringRequest,
|
|
148
|
-
createAuthoringDiff: generate.createAuthoringDiff,
|
|
149
|
-
applyAuthoringChanges: generate.applyAuthoringChanges,
|
|
150
|
-
reviewLocalAuthoringCandidate: generate.reviewLocalAuthoringCandidate,
|
|
151
|
-
computeCoverage: generate.computeCoverage,
|
|
152
|
-
preparePreFillRequest: generate.preparePreFillRequest,
|
|
153
|
-
previewPreFillRequest: generate.previewPreFillRequest,
|
|
154
|
-
dispatchPreFillRequest: generate.dispatchPreFillRequest,
|
|
155
|
-
preFillProviders: {
|
|
156
|
-
codex: (model) => generate.createCodexProvider({ model }),
|
|
157
|
-
claude: (model) => generate.createClaudeProvider({ model })
|
|
158
|
-
},
|
|
159
|
-
prepareRejectionDiagnosisRequests: generate.prepareRejectionDiagnosisRequests,
|
|
160
|
-
dispatchRejectionDiagnosis: generate.dispatchRejectionDiagnosis,
|
|
161
|
-
rejectionProviders: {
|
|
162
|
-
codex: (model) => generate.createCodexProvider({ model }),
|
|
163
|
-
claude: (model) => generate.createClaudeProvider({ model })
|
|
164
|
-
},
|
|
165
|
-
GenerateTestsError: generate.GenerateTestsError
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
if (argv[0] === "repair") {
|
|
169
|
-
/**
|
|
170
|
-
* `generate` 분기와 같은 모양으로 동적 import 한다. `test` 경로는 이 분기를 지나지 않으므로
|
|
171
|
-
* 여전히 `core` 와 `runner` 만 로드한다. 계획서 §8 위험표 첫 줄.
|
|
172
|
-
*/
|
|
173
|
-
let generate;
|
|
174
|
-
try {
|
|
175
|
-
generate = await import("@mcpeak/generate");
|
|
176
|
-
} catch {
|
|
177
|
-
process.stderr.write("오류 [REPAIR_RUNTIME_UNAVAILABLE]: 진단에 필요한 @mcpeak/generate 를 로드하지 못했습니다.\n해결: 의존성을 설치한 뒤 다시 실행하세요.\n");
|
|
178
|
-
return 1;
|
|
179
|
-
}
|
|
180
|
-
const dependencies = nodeRepairDependencies(generate);
|
|
181
|
-
try {
|
|
182
|
-
return await runRepairCommand(argv, dependencies);
|
|
183
|
-
} finally {
|
|
184
|
-
dependencies.reviewIO?.close?.();
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
if (argv[0] !== "test") return runCli(argv, unavailableDependencies);
|
|
188
|
-
try {
|
|
189
|
-
if (!parseTestCommand(argv.slice(1)).suitePath.toLowerCase().endsWith(".json")) return runCli(argv, unavailableDependencies);
|
|
190
|
-
} catch {
|
|
191
|
-
return runCli(argv, unavailableDependencies);
|
|
192
|
-
}
|
|
193
|
-
let core;
|
|
194
|
-
let runner;
|
|
195
|
-
try {
|
|
196
|
-
[core, runner] = await Promise.all([import("@mcpeak/core"), import("@mcpeak/runner")]);
|
|
197
|
-
} catch {
|
|
198
|
-
return runCli(argv, unavailableRuntimeDependencies);
|
|
199
|
-
}
|
|
200
|
-
return runCli(argv, {
|
|
201
|
-
readFile,
|
|
202
|
-
validateSuite: runner.validateMcpSuite,
|
|
203
|
-
connect: core.connectStdio,
|
|
204
|
-
connectHttp: core.connectHttp,
|
|
205
|
-
readEnv: (name) => process.env[name],
|
|
206
|
-
startRunner: runner.runSuite,
|
|
207
|
-
finalize: runner.finalizeRunnerExecution,
|
|
208
|
-
renderReport: runner.renderReport,
|
|
209
|
-
renderJUnit: runner.renderJUnit,
|
|
210
|
-
writeFile: (path, text) => writeFile(path, text, "utf8"),
|
|
211
|
-
colorEnabled: process.stdout.isTTY === true && process.env.NO_COLOR === void 0,
|
|
212
|
-
writeStdout: (text) => process.stdout.write(text),
|
|
213
|
-
writeStderr: (text) => process.stderr.write(text)
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
//#endregion
|
|
217
|
-
export { COMMANDS, nodeRepairDependencies, run };
|
|
1
|
+
import { a as run, i as nodeRepairDependencies, n as nodeAuditDependencies, r as nodeOptimizeDependencies, t as COMMANDS } from "./src-CRsYPuu_.mjs";
|
|
2
|
+
export { COMMANDS, nodeAuditDependencies, nodeOptimizeDependencies, nodeRepairDependencies, run };
|