sales-frontend-gemini-cli 0.4.1 → 0.4.2
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/common/helper.cjs +226 -32
- package/dist/common/helper.cjs.map +1 -1
- package/dist/common/helper.d.cts +22 -2
- package/dist/common/helper.d.ts +22 -2
- package/dist/common/helper.js +220 -33
- package/dist/common/helper.js.map +1 -1
- package/dist/pr-review/claude/claude-commander.cjs +8 -1
- package/dist/pr-review/claude/claude-commander.cjs.map +1 -1
- package/dist/pr-review/claude/claude-commander.js +8 -1
- package/dist/pr-review/claude/claude-commander.js.map +1 -1
- package/dist/pr-review/claude/installation-claude.cjs +178 -8
- package/dist/pr-review/claude/installation-claude.cjs.map +1 -1
- package/dist/pr-review/claude/installation-claude.js +177 -8
- package/dist/pr-review/claude/installation-claude.js.map +1 -1
- package/dist/pr-review/codex/codex-commander.cjs +6 -1
- package/dist/pr-review/codex/codex-commander.cjs.map +1 -1
- package/dist/pr-review/codex/codex-commander.js +6 -1
- package/dist/pr-review/codex/codex-commander.js.map +1 -1
- package/dist/pr-review/codex/installation-codex.cjs +178 -8
- package/dist/pr-review/codex/installation-codex.cjs.map +1 -1
- package/dist/pr-review/codex/installation-codex.js +177 -8
- package/dist/pr-review/codex/installation-codex.js.map +1 -1
- package/dist/pr-review/gemini/gemini-commander.cjs +7 -1
- package/dist/pr-review/gemini/gemini-commander.cjs.map +1 -1
- package/dist/pr-review/gemini/gemini-commander.js +7 -1
- package/dist/pr-review/gemini/gemini-commander.js.map +1 -1
- package/dist/pr-review/gemini/installation-gemini.cjs +178 -8
- package/dist/pr-review/gemini/installation-gemini.cjs.map +1 -1
- package/dist/pr-review/gemini/installation-gemini.js +177 -8
- package/dist/pr-review/gemini/installation-gemini.js.map +1 -1
- package/dist/pr-review/review-one-by-one.cjs +368 -108
- package/dist/pr-review/review-one-by-one.cjs.map +1 -1
- package/dist/pr-review/review-one-by-one.js +368 -108
- package/dist/pr-review/review-one-by-one.js.map +1 -1
- package/dist/pr-review/review.cjs +316 -80
- package/dist/pr-review/review.cjs.map +1 -1
- package/dist/pr-review/review.js +316 -80
- package/dist/pr-review/review.js.map +1 -1
- package/package.json +1 -1
package/dist/common/helper.cjs
CHANGED
|
@@ -5,6 +5,7 @@ var fs = require('fs');
|
|
|
5
5
|
var path = require('path');
|
|
6
6
|
var readline = require('readline');
|
|
7
7
|
var url = require('url');
|
|
8
|
+
var util = require('util');
|
|
8
9
|
|
|
9
10
|
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
10
11
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -15,6 +16,7 @@ var readline__default = /*#__PURE__*/_interopDefault(readline);
|
|
|
15
16
|
|
|
16
17
|
// src/common/helper.ts
|
|
17
18
|
var __dirname$1 = path__default.default.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('helper.cjs', document.baseURI).href))));
|
|
19
|
+
var traceMessages = [];
|
|
18
20
|
var rulesPath = path__default.default.resolve(__dirname$1, "../../src/common/rules/review-rules.md");
|
|
19
21
|
var namingRulesPath = path__default.default.resolve(__dirname$1, "../../src/common/rules/naming-rule.md");
|
|
20
22
|
var codingConventionRulesPath = path__default.default.resolve(__dirname$1, "../../src/common/rules/coding-convention.md");
|
|
@@ -37,32 +39,96 @@ var ignoreList = [
|
|
|
37
39
|
".review-report/"
|
|
38
40
|
// 생성되는 리포트 폴더도 제외
|
|
39
41
|
];
|
|
40
|
-
function parseServiceFromArgs(args = process.argv.slice(2)) {
|
|
41
|
-
const serviceIndex = args.indexOf("--service");
|
|
42
|
-
const rawService = serviceIndex !== -1 ? args[serviceIndex + 1] : "";
|
|
43
|
-
if (!rawService) {
|
|
44
|
-
return "";
|
|
45
|
-
}
|
|
46
|
-
const normalizedService = rawService.toLowerCase();
|
|
47
|
-
if (AIServices.includes(normalizedService)) {
|
|
48
|
-
return normalizedService;
|
|
49
|
-
}
|
|
50
|
-
console.error(
|
|
51
|
-
`\u274C \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uC11C\uBE44\uC2A4\uC785\uB2C8\uB2E4: ${rawService}. \uC0AC\uC6A9 \uAC00\uB2A5 \uAC12: ${AIServices.join(", ")} (\uC608: --service codex)`
|
|
52
|
-
);
|
|
53
|
-
process.exit(1);
|
|
54
|
-
}
|
|
55
42
|
function isTestMode(args = process.argv.slice(2)) {
|
|
56
43
|
return args.includes("--test");
|
|
57
44
|
}
|
|
45
|
+
function clearTraceMessages() {
|
|
46
|
+
traceMessages.length = 0;
|
|
47
|
+
}
|
|
48
|
+
function getTraceMessages() {
|
|
49
|
+
return [...traceMessages];
|
|
50
|
+
}
|
|
58
51
|
function createTraceLogger(scope, args = process.argv.slice(2)) {
|
|
59
52
|
const enabled = isTestMode(args);
|
|
60
53
|
return (step, detail) => {
|
|
54
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
55
|
+
const message = `[${timestamp}][TRACE][${scope}] ${step}${detail ? ` | ${detail}` : ""}`;
|
|
56
|
+
traceMessages.push(message);
|
|
61
57
|
if (!enabled) {
|
|
62
58
|
return;
|
|
63
59
|
}
|
|
64
|
-
console.log(
|
|
60
|
+
console.log(message);
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
var helperTrace = createTraceLogger("helper");
|
|
64
|
+
function getTimestampParts(now = /* @__PURE__ */ new Date()) {
|
|
65
|
+
return {
|
|
66
|
+
YYYY: now.getFullYear(),
|
|
67
|
+
MM: String(now.getMonth() + 1).padStart(2, "0"),
|
|
68
|
+
DD: String(now.getDate()).padStart(2, "0"),
|
|
69
|
+
HH: String(now.getHours()).padStart(2, "0"),
|
|
70
|
+
mm: String(now.getMinutes()).padStart(2, "0"),
|
|
71
|
+
ss: String(now.getSeconds()).padStart(2, "0")
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function getHumanReadableNowString(now = /* @__PURE__ */ new Date()) {
|
|
75
|
+
const { YYYY, MM, DD, HH, mm, ss } = getTimestampParts(now);
|
|
76
|
+
return `${YYYY}-${MM}-${DD} ${HH}:${mm}:${ss}`;
|
|
77
|
+
}
|
|
78
|
+
function stringifyUnknown(value) {
|
|
79
|
+
if (value === void 0 || value === null) {
|
|
80
|
+
return "";
|
|
81
|
+
}
|
|
82
|
+
if (typeof value === "string") {
|
|
83
|
+
return value;
|
|
84
|
+
}
|
|
85
|
+
if (Buffer.isBuffer(value)) {
|
|
86
|
+
return value.toString();
|
|
87
|
+
}
|
|
88
|
+
if (value instanceof Error) {
|
|
89
|
+
return value.stack || value.message;
|
|
90
|
+
}
|
|
91
|
+
return util.inspect(value, { depth: 5, breakLength: 120 });
|
|
92
|
+
}
|
|
93
|
+
function getErrorSummary(error) {
|
|
94
|
+
if (error instanceof Error) {
|
|
95
|
+
return `${error.name}: ${error.message}`;
|
|
96
|
+
}
|
|
97
|
+
return stringifyUnknown(error) || "Unknown error";
|
|
98
|
+
}
|
|
99
|
+
function serializeError(error) {
|
|
100
|
+
const serialized = {
|
|
101
|
+
summary: getErrorSummary(error)
|
|
65
102
|
};
|
|
103
|
+
if (error instanceof Error) {
|
|
104
|
+
serialized.name = error.name;
|
|
105
|
+
serialized.message = error.message;
|
|
106
|
+
serialized.stack = error.stack;
|
|
107
|
+
} else {
|
|
108
|
+
serialized.value = stringifyUnknown(error);
|
|
109
|
+
}
|
|
110
|
+
if (error && typeof error === "object") {
|
|
111
|
+
const errorLike = error;
|
|
112
|
+
const extraKeys = ["code", "errno", "syscall", "path", "cmd", "status", "signal", "spawnargs"];
|
|
113
|
+
extraKeys.forEach((key) => {
|
|
114
|
+
if (errorLike[key] !== void 0) {
|
|
115
|
+
serialized[key] = errorLike[key];
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
const stdout = stringifyUnknown(errorLike.stdout);
|
|
119
|
+
if (stdout) {
|
|
120
|
+
serialized.stdout = stdout;
|
|
121
|
+
}
|
|
122
|
+
const stderr = stringifyUnknown(errorLike.stderr);
|
|
123
|
+
if (stderr) {
|
|
124
|
+
serialized.stderr = stderr;
|
|
125
|
+
}
|
|
126
|
+
const cause = stringifyUnknown(errorLike.cause);
|
|
127
|
+
if (cause) {
|
|
128
|
+
serialized.cause = cause;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return serialized;
|
|
66
132
|
}
|
|
67
133
|
function getNextFilePath(dir, baseName, extension) {
|
|
68
134
|
let counter = 1;
|
|
@@ -74,6 +140,13 @@ function getNextFilePath(dir, baseName, extension) {
|
|
|
74
140
|
counter++;
|
|
75
141
|
}
|
|
76
142
|
}
|
|
143
|
+
function getAvailableFilePath(dir, baseName, extension) {
|
|
144
|
+
const firstFilePath = path__default.default.join(dir, `${baseName}${extension}`);
|
|
145
|
+
if (!fs__default.default.existsSync(firstFilePath)) {
|
|
146
|
+
return firstFilePath;
|
|
147
|
+
}
|
|
148
|
+
return getNextFilePath(dir, baseName, extension);
|
|
149
|
+
}
|
|
77
150
|
function deleteFile(filePath) {
|
|
78
151
|
if (fs__default.default.existsSync(filePath)) {
|
|
79
152
|
fs__default.default.unlinkSync(filePath);
|
|
@@ -87,16 +160,105 @@ function createReportDirectory() {
|
|
|
87
160
|
fs__default.default.mkdirSync(REPORT_DIR, { recursive: true });
|
|
88
161
|
}
|
|
89
162
|
}
|
|
90
|
-
function getNowString() {
|
|
91
|
-
const
|
|
92
|
-
const YYYY = now.getFullYear();
|
|
93
|
-
const MM = String(now.getMonth() + 1).padStart(2, "0");
|
|
94
|
-
const DD = String(now.getDate()).padStart(2, "0");
|
|
95
|
-
const HH = String(now.getHours()).padStart(2, "0");
|
|
96
|
-
const mm = String(now.getMinutes()).padStart(2, "0");
|
|
97
|
-
const ss = String(now.getSeconds()).padStart(2, "0");
|
|
163
|
+
function getNowString(now = /* @__PURE__ */ new Date()) {
|
|
164
|
+
const { YYYY, MM, DD, HH, mm, ss } = getTimestampParts(now);
|
|
98
165
|
return `${YYYY}-${MM}-${DD}_${HH}-${mm}-${ss}`;
|
|
99
166
|
}
|
|
167
|
+
function getErrorLogTimestamp(now = /* @__PURE__ */ new Date()) {
|
|
168
|
+
const { YYYY, MM, DD, HH, mm, ss } = getTimestampParts(now);
|
|
169
|
+
return `${YYYY}-${MM}-${DD}-${HH}\uC2DC-${mm}\uBD84-${ss}\uCD08`;
|
|
170
|
+
}
|
|
171
|
+
function writeErrorReport(error, options = {}) {
|
|
172
|
+
try {
|
|
173
|
+
const now = /* @__PURE__ */ new Date();
|
|
174
|
+
helperTrace("error-report:write:start", options.scope || "unknown");
|
|
175
|
+
createReportDirectory();
|
|
176
|
+
const reportPath = getAvailableFilePath(REPORT_DIR, `error-log-${getErrorLogTimestamp(now)}`, ".md");
|
|
177
|
+
const serializedError = serializeError(error);
|
|
178
|
+
const traceSnapshot = options.traceMessages ?? getTraceMessages();
|
|
179
|
+
const extraSections = options.extraSections || [];
|
|
180
|
+
const report = `# Error Log
|
|
181
|
+
|
|
182
|
+
- \uBC1C\uC0DD \uC2DC\uAC01: ${getHumanReadableNowString(now)}
|
|
183
|
+
- Scope: \`${options.scope || "unknown"}\`
|
|
184
|
+
- \uC791\uC5C5 \uACBD\uB85C: \`${process.cwd()}\`
|
|
185
|
+
- \uC2E4\uD589 \uC778\uC790: \`${JSON.stringify(options.args ?? process.argv.slice(2))}\`
|
|
186
|
+
- \uC2E4\uD589 \uD658\uACBD: \`${process.platform} ${process.arch} / Node ${process.version}\`
|
|
187
|
+
|
|
188
|
+
## Summary
|
|
189
|
+
|
|
190
|
+
${options.title || serializedError.summary || "Unknown error"}
|
|
191
|
+
|
|
192
|
+
## Error
|
|
193
|
+
|
|
194
|
+
\`\`\`json
|
|
195
|
+
${JSON.stringify(serializedError, null, 2)}
|
|
196
|
+
\`\`\`
|
|
197
|
+
|
|
198
|
+
## Trace
|
|
199
|
+
|
|
200
|
+
\`\`\`json
|
|
201
|
+
${JSON.stringify(traceSnapshot, null, 2)}
|
|
202
|
+
\`\`\`${extraSections.length ? `
|
|
203
|
+
${extraSections.map((section) => `
|
|
204
|
+
## ${section.heading}
|
|
205
|
+
|
|
206
|
+
${section.markdown}`).join("\n")}
|
|
207
|
+
` : "\n"}
|
|
208
|
+
`;
|
|
209
|
+
fs__default.default.writeFileSync(reportPath, report);
|
|
210
|
+
helperTrace("error-report:write:done", reportPath);
|
|
211
|
+
return reportPath;
|
|
212
|
+
} catch (writeError) {
|
|
213
|
+
console.error("\u26A0\uFE0F \uC5D0\uB7EC \uB85C\uADF8 \uD30C\uC77C \uC0DD\uC131\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.");
|
|
214
|
+
console.error(writeError);
|
|
215
|
+
return "";
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
function exitWithError(message, options = {}) {
|
|
219
|
+
const reportPath = writeErrorReport(options.error || new Error(message), {
|
|
220
|
+
...options,
|
|
221
|
+
title: message
|
|
222
|
+
});
|
|
223
|
+
console.error(message);
|
|
224
|
+
if (options.error) {
|
|
225
|
+
console.error(options.error);
|
|
226
|
+
}
|
|
227
|
+
if (reportPath) {
|
|
228
|
+
console.error(`\u{1F4C4} \uC5D0\uB7EC \uB85C\uADF8 \uC800\uC7A5 \uC704\uCE58: ${reportPath}`);
|
|
229
|
+
}
|
|
230
|
+
process.exit(1);
|
|
231
|
+
}
|
|
232
|
+
function parseServiceFromArgs(args = process.argv.slice(2)) {
|
|
233
|
+
helperTrace("parse-service:start", `args=${JSON.stringify(args)}`);
|
|
234
|
+
const serviceIndex = args.indexOf("--service");
|
|
235
|
+
const rawService = serviceIndex !== -1 ? args[serviceIndex + 1] : "";
|
|
236
|
+
if (!rawService) {
|
|
237
|
+
helperTrace("parse-service:empty");
|
|
238
|
+
return "";
|
|
239
|
+
}
|
|
240
|
+
const normalizedService = rawService.toLowerCase();
|
|
241
|
+
if (AIServices.includes(normalizedService)) {
|
|
242
|
+
helperTrace("parse-service:resolved", normalizedService);
|
|
243
|
+
return normalizedService;
|
|
244
|
+
}
|
|
245
|
+
helperTrace("parse-service:invalid", rawService);
|
|
246
|
+
exitWithError(
|
|
247
|
+
`\u274C \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uC11C\uBE44\uC2A4\uC785\uB2C8\uB2E4: ${rawService}. \uC0AC\uC6A9 \uAC00\uB2A5 \uAC12: ${AIServices.join(", ")} (\uC608: --service codex)`,
|
|
248
|
+
{
|
|
249
|
+
scope: "helper:parseServiceFromArgs",
|
|
250
|
+
args,
|
|
251
|
+
extraSections: [
|
|
252
|
+
{
|
|
253
|
+
heading: "Allowed Services",
|
|
254
|
+
markdown: `\`\`\`json
|
|
255
|
+
${JSON.stringify(AIServices, null, 2)}
|
|
256
|
+
\`\`\``
|
|
257
|
+
}
|
|
258
|
+
]
|
|
259
|
+
}
|
|
260
|
+
);
|
|
261
|
+
}
|
|
100
262
|
function getGitDiffFilter() {
|
|
101
263
|
const includeExtensions = ["*.ts", "*.tsx", "*.js", "*.jsx"];
|
|
102
264
|
const excludePatterns = ignoreList.map((item) => `:(exclude)${item}`);
|
|
@@ -108,6 +270,7 @@ function getGitDiffFilter() {
|
|
|
108
270
|
function openReport(reportPath) {
|
|
109
271
|
const resolvedPath = path__default.default.resolve(reportPath);
|
|
110
272
|
const { platform } = process;
|
|
273
|
+
helperTrace("open-report:start", resolvedPath);
|
|
111
274
|
const openWithChrome = () => {
|
|
112
275
|
if (platform === "darwin") {
|
|
113
276
|
child_process.execSync(`open -a "Google Chrome" "${resolvedPath}"`, { stdio: "ignore" });
|
|
@@ -132,32 +295,41 @@ function openReport(reportPath) {
|
|
|
132
295
|
};
|
|
133
296
|
try {
|
|
134
297
|
if (openWithChrome()) {
|
|
298
|
+
helperTrace("open-report:chrome:success", platform);
|
|
135
299
|
console.log("\u{1F680} Google Chrome\uC5D0\uC11C \uB9AC\uD3EC\uD2B8\uB97C \uC5F4\uC5C8\uC2B5\uB2C8\uB2E4.");
|
|
136
300
|
return;
|
|
137
301
|
}
|
|
138
|
-
} catch {
|
|
302
|
+
} catch (error) {
|
|
303
|
+
helperTrace("open-report:chrome:failed", getErrorSummary(error));
|
|
139
304
|
}
|
|
140
305
|
try {
|
|
141
306
|
if (openWithDefaultBrowser()) {
|
|
307
|
+
helperTrace("open-report:default-browser:success", platform);
|
|
142
308
|
console.log("\u{1F680} \uAE30\uBCF8 \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uB9AC\uD3EC\uD2B8\uB97C \uC5F4\uC5C8\uC2B5\uB2C8\uB2E4.");
|
|
143
309
|
return;
|
|
144
310
|
}
|
|
145
|
-
} catch (
|
|
146
|
-
|
|
311
|
+
} catch (error) {
|
|
312
|
+
helperTrace("open-report:default-browser:failed", getErrorSummary(error));
|
|
313
|
+
console.error("\u26A0\uFE0F \uBE0C\uB77C\uC6B0\uC800 \uC5F4\uAE30 \uC2E4\uD328:", error);
|
|
147
314
|
return;
|
|
148
315
|
}
|
|
316
|
+
helperTrace("open-report:unsupported-platform", platform);
|
|
149
317
|
console.error(`\u26A0\uFE0F \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uD50C\uB7AB\uD3FC\uC785\uB2C8\uB2E4: ${platform}`);
|
|
150
318
|
}
|
|
151
319
|
function getDiffArgs() {
|
|
152
320
|
const args = process.argv.slice(2);
|
|
153
321
|
const commitIndex = args.indexOf("--commit");
|
|
154
322
|
const { includeParams, excludeParams } = getGitDiffFilter();
|
|
323
|
+
helperTrace("diff-args:resolve:start", `args=${JSON.stringify(args)}`);
|
|
155
324
|
let diffArgs = "";
|
|
156
325
|
if (commitIndex !== -1) {
|
|
157
326
|
const commitHash = args[commitIndex + 1];
|
|
158
327
|
if (!commitHash) {
|
|
159
|
-
|
|
160
|
-
|
|
328
|
+
helperTrace("diff-args:commit-hash-missing");
|
|
329
|
+
exitWithError("\u274C \uCEE4\uBC0B \uD574\uC2DC\uAC00 \uC81C\uACF5\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.", {
|
|
330
|
+
scope: "helper:getDiffArgs",
|
|
331
|
+
args
|
|
332
|
+
});
|
|
161
333
|
}
|
|
162
334
|
const nextArg = args[commitIndex + 2];
|
|
163
335
|
let n = 0;
|
|
@@ -167,36 +339,48 @@ function getDiffArgs() {
|
|
|
167
339
|
n = 0;
|
|
168
340
|
}
|
|
169
341
|
}
|
|
342
|
+
helperTrace("diff-args:commit-mode", `${commitHash}~${n + 1} ${commitHash}`);
|
|
170
343
|
console.log(`\u2139\uFE0F \uCEE4\uBC0B '${commitHash}' ${n > 0 ? ` \uD3EC\uD568 \uCD1D ${n + 1}\uAC1C\uC758 \uCEE4\uBC0B` : ""}\uC744 \uB9AC\uBDF0\uD569\uB2C8\uB2E4...`);
|
|
171
344
|
diffArgs = `${commitHash}~${n + 1} ${commitHash}`;
|
|
172
345
|
} else {
|
|
173
346
|
try {
|
|
347
|
+
helperTrace("diff-args:unstaged-check:start");
|
|
174
348
|
const check = child_process.execSync(`git diff --name-only -- ${includeParams} ${excludeParams}`).toString();
|
|
175
349
|
if (!check.trim()) {
|
|
350
|
+
helperTrace("diff-args:unstaged-check:empty", "use HEAD~1 HEAD");
|
|
176
351
|
console.log("\u2139\uFE0F Unstaged \uBCC0\uACBD\uC0AC\uD56D\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uB9C8\uC9C0\uB9C9 \uCEE4\uBC0B(HEAD)\uC744 \uB9AC\uBDF0\uD569\uB2C8\uB2E4...");
|
|
177
352
|
diffArgs = "HEAD~1 HEAD";
|
|
353
|
+
} else {
|
|
354
|
+
helperTrace("diff-args:unstaged-check:has-changes", `length=${check.length}`);
|
|
178
355
|
}
|
|
179
|
-
} catch {
|
|
356
|
+
} catch (error) {
|
|
357
|
+
helperTrace("diff-args:unstaged-check:failed", getErrorSummary(error));
|
|
180
358
|
}
|
|
181
359
|
}
|
|
360
|
+
helperTrace("diff-args:resolve:done", diffArgs || "(default)");
|
|
182
361
|
return diffArgs;
|
|
183
362
|
}
|
|
184
363
|
function selectAIService() {
|
|
185
364
|
const service = parseServiceFromArgs();
|
|
186
365
|
if (!service) {
|
|
187
|
-
|
|
188
|
-
|
|
366
|
+
helperTrace("select-service:missing");
|
|
367
|
+
exitWithError("\u274C \uC11C\uBE44\uC2A4\uAC00 \uC120\uD0DD\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.", {
|
|
368
|
+
scope: "helper:selectAIService"
|
|
369
|
+
});
|
|
189
370
|
}
|
|
371
|
+
helperTrace("select-service:done", service);
|
|
190
372
|
return service;
|
|
191
373
|
}
|
|
192
374
|
async function showSelectionAIService() {
|
|
193
375
|
const selectedServiceFromArgs = parseServiceFromArgs();
|
|
194
376
|
if (selectedServiceFromArgs) {
|
|
377
|
+
helperTrace("show-selection:from-args", selectedServiceFromArgs);
|
|
195
378
|
console.log(`
|
|
196
379
|
\u2705 \x1B[32m${selectedServiceFromArgs}\x1B[0m \uC11C\uBE44\uC2A4\uAC00 \uC120\uD0DD\uB418\uC5C8\uC2B5\uB2C8\uB2E4. (--service)
|
|
197
380
|
`);
|
|
198
381
|
return selectedServiceFromArgs;
|
|
199
382
|
}
|
|
383
|
+
helperTrace("show-selection:interactive:start");
|
|
200
384
|
let selectedIndex = 0;
|
|
201
385
|
const rl = readline__default.default.createInterface({
|
|
202
386
|
input: process.stdin,
|
|
@@ -210,6 +394,7 @@ async function showSelectionAIService() {
|
|
|
210
394
|
readline__default.default.moveCursor(process.stdout, 0, -(AIServices.length + 1));
|
|
211
395
|
}
|
|
212
396
|
firstRender = false;
|
|
397
|
+
helperTrace("show-selection:interactive:render", AIServices[selectedIndex] || "unknown");
|
|
213
398
|
readline__default.default.clearScreenDown(process.stdout);
|
|
214
399
|
process.stdout.write(
|
|
215
400
|
"\u{1F916} AI \uC11C\uBE44\uC2A4\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694 (\x1B[33m\u2191\u2193 \uBC29\uD5A5\uD0A4\x1B[0m \uC774\uB3D9, \x1B[33mEnter\x1B[0m \uC120\uD0DD):\n"
|
|
@@ -229,6 +414,7 @@ async function showSelectionAIService() {
|
|
|
229
414
|
const onData = (data) => {
|
|
230
415
|
const key = data.toString();
|
|
231
416
|
if (key === "") {
|
|
417
|
+
helperTrace("show-selection:interactive:ctrl-c");
|
|
232
418
|
process.stdout.write("\x1B[?25h");
|
|
233
419
|
process.exit(0);
|
|
234
420
|
}
|
|
@@ -249,6 +435,7 @@ async function showSelectionAIService() {
|
|
|
249
435
|
`);
|
|
250
436
|
const result = AIServices[selectedIndex];
|
|
251
437
|
if (result) {
|
|
438
|
+
helperTrace("show-selection:interactive:confirmed", result);
|
|
252
439
|
resolve(result);
|
|
253
440
|
}
|
|
254
441
|
}
|
|
@@ -261,15 +448,21 @@ async function showSelectionAIService() {
|
|
|
261
448
|
|
|
262
449
|
exports.AIServices = AIServices;
|
|
263
450
|
exports.REPORT_DIR = REPORT_DIR;
|
|
451
|
+
exports.clearTraceMessages = clearTraceMessages;
|
|
264
452
|
exports.codingConventionRulesPath = codingConventionRulesPath;
|
|
265
453
|
exports.createReportDirectory = createReportDirectory;
|
|
266
454
|
exports.createTraceLogger = createTraceLogger;
|
|
267
455
|
exports.deleteFile = deleteFile;
|
|
268
456
|
exports.deleteTempDiff = deleteTempDiff;
|
|
457
|
+
exports.exitWithError = exitWithError;
|
|
458
|
+
exports.getAvailableFilePath = getAvailableFilePath;
|
|
269
459
|
exports.getDiffArgs = getDiffArgs;
|
|
460
|
+
exports.getErrorLogTimestamp = getErrorLogTimestamp;
|
|
461
|
+
exports.getErrorSummary = getErrorSummary;
|
|
270
462
|
exports.getGitDiffFilter = getGitDiffFilter;
|
|
271
463
|
exports.getNextFilePath = getNextFilePath;
|
|
272
464
|
exports.getNowString = getNowString;
|
|
465
|
+
exports.getTraceMessages = getTraceMessages;
|
|
273
466
|
exports.ignoreList = ignoreList;
|
|
274
467
|
exports.isTestMode = isTestMode;
|
|
275
468
|
exports.namingRulesPath = namingRulesPath;
|
|
@@ -280,5 +473,6 @@ exports.rulesPath = rulesPath;
|
|
|
280
473
|
exports.selectAIService = selectAIService;
|
|
281
474
|
exports.showSelectionAIService = showSelectionAIService;
|
|
282
475
|
exports.tempDiffPath = tempDiffPath;
|
|
476
|
+
exports.writeErrorReport = writeErrorReport;
|
|
283
477
|
//# sourceMappingURL=helper.cjs.map
|
|
284
478
|
//# sourceMappingURL=helper.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/common/helper.ts"],"names":["__dirname","path","fileURLToPath","fs","execSync","readline"],"mappings":"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","file":"helper.cjs","sourcesContent":["import { execSync } from 'child_process';\nimport fs from 'fs';\nimport path from 'path';\nimport readline from 'readline';\nimport { fileURLToPath } from 'url';\n\nimport { AIServiceType } from './types';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// 설치된 위치에 맞게 규칙/양식 파일 경로를 계산 (dist에서 src로 이동 등 고려)\n// dist/common/helper.js 가 실행되므로 __dirname은 .../dist/common 입니다.\n// 따라서 ../../src/common/rules 로 이동해야 원본 소스의 규칙 파일을 찾을 수 있습니다.\nexport const rulesPath = path.resolve(__dirname, '../../src/common/rules/review-rules.md');\nexport const namingRulesPath = path.resolve(__dirname, '../../src/common/rules/naming-rule.md');\nexport const codingConventionRulesPath = path.resolve(__dirname, '../../src/common/rules/coding-convention.md');\nexport const reviewFormPath = path.resolve(__dirname, '../../src/common/form/review-form.md');\nexport const reviewFormOneByOnePath = path.resolve(__dirname, '../../src/common/form/review-form-one-by-one.md');\nexport const REPORT_DIR = '.review-report';\nexport const tempDiffPath = 'temp_diff.txt';\nexport const AIServices: AIServiceType[] = ['gemini', 'claude', 'codex'];\nexport const ignoreList = [\n 'package.json',\n '*.yml',\n '*.md',\n '*.lock',\n 'dist/',\n 'node_modules/',\n 'assets/',\n 'public/',\n '*.json',\n '*.yaml',\n '.review-report/' // 생성되는 리포트 폴더도 제외\n];\n\nfunction parseServiceFromArgs(args: string[] = process.argv.slice(2)): AIServiceType | '' {\n const serviceIndex = args.indexOf('--service');\n const rawService = serviceIndex !== -1 ? args[serviceIndex + 1] : '';\n\n if (!rawService) {\n return '';\n }\n\n const normalizedService = rawService.toLowerCase();\n\n if (AIServices.includes(normalizedService as AIServiceType)) {\n return normalizedService as AIServiceType;\n }\n\n console.error(\n `❌ 지원하지 않는 서비스입니다: ${rawService}. 사용 가능 값: ${AIServices.join(', ')} (예: --service codex)`\n );\n process.exit(1);\n}\n\nexport function isTestMode(args: string[] = process.argv.slice(2)) {\n return args.includes('--test');\n}\n\nexport function createTraceLogger(scope: string, args: string[] = process.argv.slice(2)) {\n const enabled = isTestMode(args);\n\n return (step: string, detail?: string) => {\n if (!enabled) {\n return;\n }\n\n console.log(`[TRACE][${scope}] ${step}${detail ? ` | ${detail}` : ''}`);\n };\n}\n\nexport function getNextFilePath(dir: string, baseName: string, extension: string) {\n let counter = 1;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const filePath = path.join(dir, `${baseName}-${counter}${extension}`);\n if (!fs.existsSync(filePath)) {\n return filePath;\n }\n counter++;\n }\n}\n\nexport function deleteFile(filePath: string) {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n}\n\n/**\n * 임시파일 삭제\n */\nexport function deleteTempDiff() {\n deleteFile(tempDiffPath);\n}\n\n/**\n * 리뷰 결과 폴더 생성\n */\nexport function createReportDirectory() {\n if (!fs.existsSync(REPORT_DIR)) {\n fs.mkdirSync(REPORT_DIR, { recursive: true });\n }\n}\n\n/**\n * 현재 시간 문자열 생성\n */\nexport function getNowString() {\n const now = new Date();\n const YYYY = now.getFullYear();\n const MM = String(now.getMonth() + 1).padStart(2, '0');\n const DD = String(now.getDate()).padStart(2, '0');\n const HH = String(now.getHours()).padStart(2, '0');\n const mm = String(now.getMinutes()).padStart(2, '0');\n const ss = String(now.getSeconds()).padStart(2, '0');\n\n return `${YYYY}-${MM}-${DD}_${HH}-${mm}-${ss}`;\n}\n\nexport function getGitDiffFilter() {\n // 1. 리뷰 대상 파일 확장자 정의\n const includeExtensions = ['*.ts', '*.tsx', '*.js', '*.jsx'];\n\n // ignoreList 를 import 하여 재사용하여 작성한다.\n const excludePatterns = ignoreList.map((item) => `:(exclude)${item}`);\n\n // const excludePatterns = [':(exclude)*.lock', ':(exclude)dist/', ':(exclude)*.md'];\n\n // 2. 변경된 파일 목록 가져오기 (각 패턴을 따옴표로 감싸서 쉘 에러 방지)\n const quote = (pattern: string) => `\"${pattern}\"`;\n const includeParams = includeExtensions.map(quote).join(' ');\n const excludeParams = excludePatterns.map(quote).join(' ');\n\n return { includeParams, excludeParams };\n}\n\n/**\n * openReport를 OS별로 동작하도록 변경\n * 우선순위:\n * 1. Chrome 시도\n * - macOS: open -a \"Google Chrome\" \"<path>\"\n * - Ubuntu/Linux: google-chrome \"<path>\"\n * 2. 실패 시 기본 브라우저로 폴백\n * - macOS: open \"<path>\"\n * - Ubuntu/Linux: xdg-open \"<path>\"\n * 3. 둘 다 실패하면 에러 출력\n * 4. 미지원 플랫폼이면 플랫폼 경고 출력\n */\nexport function openReport(reportPath: string) {\n const resolvedPath = path.resolve(reportPath);\n const { platform } = process;\n\n const openWithChrome = () => {\n if (platform === 'darwin') {\n execSync(`open -a \"Google Chrome\" \"${resolvedPath}\"`, { stdio: 'ignore' });\n\n return true;\n }\n\n if (platform === 'linux') {\n execSync(`google-chrome \"${resolvedPath}\"`, { stdio: 'ignore' });\n\n return true;\n }\n\n return false;\n };\n\n const openWithDefaultBrowser = () => {\n if (platform === 'darwin') {\n execSync(`open \"${resolvedPath}\"`, { stdio: 'ignore' });\n\n return true;\n }\n\n if (platform === 'linux') {\n execSync(`xdg-open \"${resolvedPath}\"`, { stdio: 'ignore' });\n\n return true;\n }\n\n return false;\n };\n\n try {\n if (openWithChrome()) {\n console.log('🚀 Google Chrome에서 리포트를 열었습니다.');\n\n return;\n }\n } catch {\n // Chrome 실행 실패 시 기본 브라우저로 폴백\n }\n\n try {\n if (openWithDefaultBrowser()) {\n console.log('🚀 기본 브라우저에서 리포트를 열었습니다.');\n\n return;\n }\n } catch (e) {\n console.error('⚠️ 브라우저 열기 실패:', e);\n\n return;\n }\n\n console.error(`⚠️ 지원하지 않는 플랫폼입니다: ${platform}`);\n}\n\nexport function getDiffArgs() {\n const args = process.argv.slice(2);\n const commitIndex = args.indexOf('--commit');\n const { includeParams, excludeParams } = getGitDiffFilter();\n\n let diffArgs = '';\n\n if (commitIndex !== -1) {\n // 특정 커밋 (및 이전 n개) 리뷰\n const commitHash = args[commitIndex + 1];\n if (!commitHash) {\n console.error('❌ 커밋 해시가 제공되지 않았습니다.');\n process.exit(1);\n }\n\n // n값 확인 (optional)\n const nextArg = args[commitIndex + 2];\n let n = 0;\n if (nextArg && !nextArg.startsWith('--')) {\n n = parseInt(nextArg, 10);\n if (isNaN(n)) {\n n = 0;\n }\n }\n\n console.log(`ℹ️ 커밋 '${commitHash}' ${n > 0 ? ` 포함 총 ${n + 1}개의 커밋` : ''}을 리뷰합니다...`);\n diffArgs = `${commitHash}~${n + 1} ${commitHash}`;\n } else {\n // 기본 모드:\n // 1. Unstaged 변경사항 확인\n try {\n const check = execSync(`git diff --name-only -- ${includeParams} ${excludeParams}`).toString();\n if (!check.trim()) {\n console.log('ℹ️ Unstaged 변경사항이 없습니다. 마지막 커밋(HEAD)을 리뷰합니다...');\n diffArgs = 'HEAD~1 HEAD';\n }\n } catch {\n // git diff 실패시 무시\n }\n }\n\n return diffArgs;\n}\n\n// export const ServiceType = {\n// GEMINI: 'gemini',\n// CLAUDE: 'claude',\n// CODEX: 'codex'\n\n// }\n\n/**\n * AI 서비스 선택\n */\nexport function selectAIService() {\n const service = parseServiceFromArgs();\n\n if (!service) {\n console.error('❌ 서비스가 선택되지 않았습니다.');\n process.exit(1);\n }\n\n return service;\n}\n\n/**\n * 터미널에서 라디오 버튼 형태로 AI 서비스를 선택합니다.\n */\nexport async function showSelectionAIService(): Promise<AIServiceType> {\n const selectedServiceFromArgs = parseServiceFromArgs();\n\n if (selectedServiceFromArgs) {\n console.log(`\\n✅ \\u001b[32m${selectedServiceFromArgs}\\u001b[0m 서비스가 선택되었습니다. (--service)\\n`);\n\n return selectedServiceFromArgs;\n }\n\n let selectedIndex = 0;\n\n // Use readline to handle keypresses\n // 키 입력을 처리하기 위해 readline 인터페이스 사용\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: true\n });\n\n let firstRender = true;\n\n // Hide cursor\n process.stdout.write('\\u001b[?25l');\n\n const render = () => {\n if (!firstRender) {\n // Move cursor back to the starting line of the selection UI\n // We print (1 question line + services.length lines)\n // 선택 UI의 시작 라인으로 커서 이동 (질문 1줄 + 서비스 목록 N줄)\n readline.moveCursor(process.stdout, 0, -(AIServices.length + 1));\n }\n firstRender = false;\n\n // Clear everything from cursor down to avoid ghosting/overlaps\n // 잔상이나 겹침을 방지하기 위해 커서 위치부터 아래쪽 모두 지움\n readline.clearScreenDown(process.stdout);\n\n process.stdout.write(\n '🤖 AI 서비스를 선택해주세요 (\\u001b[33m↑↓ 방향키\\u001b[0m 이동, \\u001b[33mEnter\\u001b[0m 선택):\\n'\n );\n AIServices.forEach((service, index) => {\n if (index === selectedIndex) {\n process.stdout.write(` \\u001b[36m>\\u001b[0m \\u001b[36m◉\\u001b[0m \\u001b[1m${service}\\u001b[0m\\n`);\n } else {\n process.stdout.write(` ◯ ${service}\\n`);\n }\n });\n };\n\n render();\n\n return new Promise((resolve) => {\n const onData = (data: Buffer) => {\n const key = data.toString();\n if (key === '\\u0003') {\n // Ctrl+C\n process.stdout.write('\\u001b[?25h'); // Show cursor\n process.exit(0);\n }\n if (key === '\\x1b[A') {\n // Up arrow\n selectedIndex = (selectedIndex - 1 + AIServices.length) % AIServices.length;\n render();\n } else if (key === '\\x1b[B') {\n // Down arrow\n selectedIndex = (selectedIndex + 1) % AIServices.length;\n render();\n } else if (key === '\\r' || key === '\\n') {\n // Enter\n process.stdin.removeListener('data', onData);\n process.stdin.setRawMode(false);\n process.stdin.pause();\n rl.close();\n\n // Show cursor\n process.stdout.write('\\u001b[?25h');\n\n console.log(`\\n✅ \\u001b[32m${AIServices[selectedIndex]}\\u001b[0m 서비스가 선택되었습니다.\\n`);\n const result = AIServices[selectedIndex];\n if (result) {\n resolve(result);\n }\n }\n };\n\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.on('data', onData);\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/common/helper.ts"],"names":["__dirname","path","fileURLToPath","inspect","fs","execSync","readline"],"mappings":"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","file":"helper.cjs","sourcesContent":["import { execSync } from 'child_process';\nimport fs from 'fs';\nimport path from 'path';\nimport readline from 'readline';\nimport { fileURLToPath } from 'url';\nimport { inspect } from 'util';\n\nimport { AIServiceType } from './types';\n\ntype ErrorReportSection = {\n heading: string;\n markdown: string;\n};\n\ntype WriteErrorReportOptions = {\n title?: string;\n scope?: string;\n args?: string[];\n traceMessages?: string[];\n extraSections?: ErrorReportSection[];\n};\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst traceMessages: string[] = [];\n\n// 설치된 위치에 맞게 규칙/양식 파일 경로를 계산 (dist에서 src로 이동 등 고려)\n// dist/common/helper.js 가 실행되므로 __dirname은 .../dist/common 입니다.\n// 따라서 ../../src/common/rules 로 이동해야 원본 소스의 규칙 파일을 찾을 수 있습니다.\nexport const rulesPath = path.resolve(__dirname, '../../src/common/rules/review-rules.md');\nexport const namingRulesPath = path.resolve(__dirname, '../../src/common/rules/naming-rule.md');\nexport const codingConventionRulesPath = path.resolve(__dirname, '../../src/common/rules/coding-convention.md');\nexport const reviewFormPath = path.resolve(__dirname, '../../src/common/form/review-form.md');\nexport const reviewFormOneByOnePath = path.resolve(__dirname, '../../src/common/form/review-form-one-by-one.md');\nexport const REPORT_DIR = '.review-report';\nexport const tempDiffPath = 'temp_diff.txt';\nexport const AIServices: AIServiceType[] = ['gemini', 'claude', 'codex'];\nexport const ignoreList = [\n 'package.json',\n '*.yml',\n '*.md',\n '*.lock',\n 'dist/',\n 'node_modules/',\n 'assets/',\n 'public/',\n '*.json',\n '*.yaml',\n '.review-report/' // 생성되는 리포트 폴더도 제외\n];\n\nexport function isTestMode(args: string[] = process.argv.slice(2)) {\n return args.includes('--test');\n}\n\nexport function clearTraceMessages() {\n traceMessages.length = 0;\n}\n\nexport function getTraceMessages() {\n return [...traceMessages];\n}\n\nexport function createTraceLogger(scope: string, args: string[] = process.argv.slice(2)) {\n const enabled = isTestMode(args);\n\n return (step: string, detail?: string) => {\n const timestamp = new Date().toISOString();\n const message = `[${timestamp}][TRACE][${scope}] ${step}${detail ? ` | ${detail}` : ''}`;\n traceMessages.push(message);\n\n if (!enabled) {\n return;\n }\n\n console.log(message);\n };\n}\n\nconst helperTrace = createTraceLogger('helper');\n\nfunction getTimestampParts(now = new Date()) {\n return {\n YYYY: now.getFullYear(),\n MM: String(now.getMonth() + 1).padStart(2, '0'),\n DD: String(now.getDate()).padStart(2, '0'),\n HH: String(now.getHours()).padStart(2, '0'),\n mm: String(now.getMinutes()).padStart(2, '0'),\n ss: String(now.getSeconds()).padStart(2, '0')\n };\n}\n\nfunction getHumanReadableNowString(now = new Date()) {\n const { YYYY, MM, DD, HH, mm, ss } = getTimestampParts(now);\n\n return `${YYYY}-${MM}-${DD} ${HH}:${mm}:${ss}`;\n}\n\nfunction stringifyUnknown(value: unknown) {\n if (value === undefined || value === null) {\n return '';\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n if (Buffer.isBuffer(value)) {\n return value.toString();\n }\n\n if (value instanceof Error) {\n return value.stack || value.message;\n }\n\n return inspect(value, { depth: 5, breakLength: 120 });\n}\n\nexport function getErrorSummary(error: unknown) {\n if (error instanceof Error) {\n return `${error.name}: ${error.message}`;\n }\n\n return stringifyUnknown(error) || 'Unknown error';\n}\n\nfunction serializeError(error: unknown) {\n const serialized: Record<string, unknown> = {\n summary: getErrorSummary(error)\n };\n\n if (error instanceof Error) {\n serialized.name = error.name;\n serialized.message = error.message;\n serialized.stack = error.stack;\n } else {\n serialized.value = stringifyUnknown(error);\n }\n\n if (error && typeof error === 'object') {\n const errorLike = error as Record<string, unknown>;\n const extraKeys = ['code', 'errno', 'syscall', 'path', 'cmd', 'status', 'signal', 'spawnargs'];\n\n extraKeys.forEach((key) => {\n if (errorLike[key] !== undefined) {\n serialized[key] = errorLike[key];\n }\n });\n\n const stdout = stringifyUnknown(errorLike.stdout);\n if (stdout) {\n serialized.stdout = stdout;\n }\n\n const stderr = stringifyUnknown(errorLike.stderr);\n if (stderr) {\n serialized.stderr = stderr;\n }\n\n const cause = stringifyUnknown(errorLike.cause);\n if (cause) {\n serialized.cause = cause;\n }\n }\n\n return serialized;\n}\n\nexport function getNextFilePath(dir: string, baseName: string, extension: string) {\n let counter = 1;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const filePath = path.join(dir, `${baseName}-${counter}${extension}`);\n if (!fs.existsSync(filePath)) {\n return filePath;\n }\n counter++;\n }\n}\n\nexport function getAvailableFilePath(dir: string, baseName: string, extension: string) {\n const firstFilePath = path.join(dir, `${baseName}${extension}`);\n if (!fs.existsSync(firstFilePath)) {\n return firstFilePath;\n }\n\n return getNextFilePath(dir, baseName, extension);\n}\n\nexport function deleteFile(filePath: string) {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n}\n\n/**\n * 임시파일 삭제\n */\nexport function deleteTempDiff() {\n deleteFile(tempDiffPath);\n}\n\n/**\n * 리뷰 결과 폴더 생성\n */\nexport function createReportDirectory() {\n if (!fs.existsSync(REPORT_DIR)) {\n fs.mkdirSync(REPORT_DIR, { recursive: true });\n }\n}\n\n/**\n * 현재 시간 문자열 생성\n */\nexport function getNowString(now = new Date()) {\n const { YYYY, MM, DD, HH, mm, ss } = getTimestampParts(now);\n\n return `${YYYY}-${MM}-${DD}_${HH}-${mm}-${ss}`;\n}\n\nexport function getErrorLogTimestamp(now = new Date()) {\n const { YYYY, MM, DD, HH, mm, ss } = getTimestampParts(now);\n\n return `${YYYY}-${MM}-${DD}-${HH}시-${mm}분-${ss}초`;\n}\n\nexport function writeErrorReport(error: unknown, options: WriteErrorReportOptions = {}) {\n try {\n const now = new Date();\n helperTrace('error-report:write:start', options.scope || 'unknown');\n createReportDirectory();\n\n const reportPath = getAvailableFilePath(REPORT_DIR, `error-log-${getErrorLogTimestamp(now)}`, '.md');\n const serializedError = serializeError(error);\n const traceSnapshot = options.traceMessages ?? getTraceMessages();\n const extraSections = options.extraSections || [];\n\n const report = `# Error Log\n\n- 발생 시각: ${getHumanReadableNowString(now)}\n- Scope: \\`${options.scope || 'unknown'}\\`\n- 작업 경로: \\`${process.cwd()}\\`\n- 실행 인자: \\`${JSON.stringify(options.args ?? process.argv.slice(2))}\\`\n- 실행 환경: \\`${process.platform} ${process.arch} / Node ${process.version}\\`\n\n## Summary\n\n${options.title || serializedError.summary || 'Unknown error'}\n\n## Error\n\n\\`\\`\\`json\n${JSON.stringify(serializedError, null, 2)}\n\\`\\`\\`\n\n## Trace\n\n\\`\\`\\`json\n${JSON.stringify(traceSnapshot, null, 2)}\n\\`\\`\\`${extraSections.length ? `\\n${extraSections.map((section) => `\\n## ${section.heading}\\n\\n${section.markdown}`).join('\\n')}\\n` : '\\n'}\n`;\n\n fs.writeFileSync(reportPath, report);\n helperTrace('error-report:write:done', reportPath);\n\n return reportPath;\n } catch (writeError) {\n console.error('⚠️ 에러 로그 파일 생성에 실패했습니다.');\n console.error(writeError);\n\n return '';\n }\n}\n\nexport function exitWithError(\n message: string,\n options: Omit<WriteErrorReportOptions, 'title'> & { error?: unknown } = {}\n): never {\n const reportPath = writeErrorReport(options.error || new Error(message), {\n ...options,\n title: message\n });\n\n console.error(message);\n\n if (options.error) {\n console.error(options.error);\n }\n\n if (reportPath) {\n console.error(`📄 에러 로그 저장 위치: ${reportPath}`);\n }\n\n process.exit(1);\n}\n\nfunction parseServiceFromArgs(args: string[] = process.argv.slice(2)): AIServiceType | '' {\n helperTrace('parse-service:start', `args=${JSON.stringify(args)}`);\n const serviceIndex = args.indexOf('--service');\n const rawService = serviceIndex !== -1 ? args[serviceIndex + 1] : '';\n\n if (!rawService) {\n helperTrace('parse-service:empty');\n\n return '';\n }\n\n const normalizedService = rawService.toLowerCase();\n\n if (AIServices.includes(normalizedService as AIServiceType)) {\n helperTrace('parse-service:resolved', normalizedService);\n\n return normalizedService as AIServiceType;\n }\n\n helperTrace('parse-service:invalid', rawService);\n exitWithError(\n `❌ 지원하지 않는 서비스입니다: ${rawService}. 사용 가능 값: ${AIServices.join(', ')} (예: --service codex)`,\n {\n scope: 'helper:parseServiceFromArgs',\n args,\n extraSections: [\n {\n heading: 'Allowed Services',\n markdown: `\\`\\`\\`json\\n${JSON.stringify(AIServices, null, 2)}\\n\\`\\`\\``\n }\n ]\n }\n );\n}\n\nexport function getGitDiffFilter() {\n // 1. 리뷰 대상 파일 확장자 정의\n const includeExtensions = ['*.ts', '*.tsx', '*.js', '*.jsx'];\n\n // ignoreList 를 import 하여 재사용하여 작성한다.\n const excludePatterns = ignoreList.map((item) => `:(exclude)${item}`);\n\n // const excludePatterns = [':(exclude)*.lock', ':(exclude)dist/', ':(exclude)*.md'];\n\n // 2. 변경된 파일 목록 가져오기 (각 패턴을 따옴표로 감싸서 쉘 에러 방지)\n const quote = (pattern: string) => `\"${pattern}\"`;\n const includeParams = includeExtensions.map(quote).join(' ');\n const excludeParams = excludePatterns.map(quote).join(' ');\n\n return { includeParams, excludeParams };\n}\n\n/**\n * openReport를 OS별로 동작하도록 변경\n * 우선순위:\n * 1. Chrome 시도\n * - macOS: open -a \"Google Chrome\" \"<path>\"\n * - Ubuntu/Linux: google-chrome \"<path>\"\n * 2. 실패 시 기본 브라우저로 폴백\n * - macOS: open \"<path>\"\n * - Ubuntu/Linux: xdg-open \"<path>\"\n * 3. 둘 다 실패하면 에러 출력\n * 4. 미지원 플랫폼이면 플랫폼 경고 출력\n */\nexport function openReport(reportPath: string) {\n const resolvedPath = path.resolve(reportPath);\n const { platform } = process;\n helperTrace('open-report:start', resolvedPath);\n\n const openWithChrome = () => {\n if (platform === 'darwin') {\n execSync(`open -a \"Google Chrome\" \"${resolvedPath}\"`, { stdio: 'ignore' });\n\n return true;\n }\n\n if (platform === 'linux') {\n execSync(`google-chrome \"${resolvedPath}\"`, { stdio: 'ignore' });\n\n return true;\n }\n\n return false;\n };\n\n const openWithDefaultBrowser = () => {\n if (platform === 'darwin') {\n execSync(`open \"${resolvedPath}\"`, { stdio: 'ignore' });\n\n return true;\n }\n\n if (platform === 'linux') {\n execSync(`xdg-open \"${resolvedPath}\"`, { stdio: 'ignore' });\n\n return true;\n }\n\n return false;\n };\n\n try {\n if (openWithChrome()) {\n helperTrace('open-report:chrome:success', platform);\n console.log('🚀 Google Chrome에서 리포트를 열었습니다.');\n\n return;\n }\n } catch (error) {\n helperTrace('open-report:chrome:failed', getErrorSummary(error));\n // Chrome 실행 실패 시 기본 브라우저로 폴백\n }\n\n try {\n if (openWithDefaultBrowser()) {\n helperTrace('open-report:default-browser:success', platform);\n console.log('🚀 기본 브라우저에서 리포트를 열었습니다.');\n\n return;\n }\n } catch (error) {\n helperTrace('open-report:default-browser:failed', getErrorSummary(error));\n console.error('⚠️ 브라우저 열기 실패:', error);\n\n return;\n }\n\n helperTrace('open-report:unsupported-platform', platform);\n console.error(`⚠️ 지원하지 않는 플랫폼입니다: ${platform}`);\n}\n\nexport function getDiffArgs() {\n const args = process.argv.slice(2);\n const commitIndex = args.indexOf('--commit');\n const { includeParams, excludeParams } = getGitDiffFilter();\n helperTrace('diff-args:resolve:start', `args=${JSON.stringify(args)}`);\n\n let diffArgs = '';\n\n if (commitIndex !== -1) {\n // 특정 커밋 (및 이전 n개) 리뷰\n const commitHash = args[commitIndex + 1];\n if (!commitHash) {\n helperTrace('diff-args:commit-hash-missing');\n exitWithError('❌ 커밋 해시가 제공되지 않았습니다.', {\n scope: 'helper:getDiffArgs',\n args\n });\n }\n\n // n값 확인 (optional)\n const nextArg = args[commitIndex + 2];\n let n = 0;\n if (nextArg && !nextArg.startsWith('--')) {\n n = parseInt(nextArg, 10);\n if (isNaN(n)) {\n n = 0;\n }\n }\n\n helperTrace('diff-args:commit-mode', `${commitHash}~${n + 1} ${commitHash}`);\n console.log(`ℹ️ 커밋 '${commitHash}' ${n > 0 ? ` 포함 총 ${n + 1}개의 커밋` : ''}을 리뷰합니다...`);\n diffArgs = `${commitHash}~${n + 1} ${commitHash}`;\n } else {\n // 기본 모드:\n // 1. Unstaged 변경사항 확인\n try {\n helperTrace('diff-args:unstaged-check:start');\n const check = execSync(`git diff --name-only -- ${includeParams} ${excludeParams}`).toString();\n if (!check.trim()) {\n helperTrace('diff-args:unstaged-check:empty', 'use HEAD~1 HEAD');\n console.log('ℹ️ Unstaged 변경사항이 없습니다. 마지막 커밋(HEAD)을 리뷰합니다...');\n diffArgs = 'HEAD~1 HEAD';\n } else {\n helperTrace('diff-args:unstaged-check:has-changes', `length=${check.length}`);\n }\n } catch (error) {\n helperTrace('diff-args:unstaged-check:failed', getErrorSummary(error));\n // git diff 실패시 무시\n }\n }\n\n helperTrace('diff-args:resolve:done', diffArgs || '(default)');\n\n return diffArgs;\n}\n\n/**\n * AI 서비스 선택\n */\nexport function selectAIService() {\n const service = parseServiceFromArgs();\n\n if (!service) {\n helperTrace('select-service:missing');\n exitWithError('❌ 서비스가 선택되지 않았습니다.', {\n scope: 'helper:selectAIService'\n });\n }\n\n helperTrace('select-service:done', service);\n\n return service;\n}\n\n/**\n * 터미널에서 라디오 버튼 형태로 AI 서비스를 선택합니다.\n */\nexport async function showSelectionAIService(): Promise<AIServiceType> {\n const selectedServiceFromArgs = parseServiceFromArgs();\n\n if (selectedServiceFromArgs) {\n helperTrace('show-selection:from-args', selectedServiceFromArgs);\n console.log(`\\n✅ \\u001b[32m${selectedServiceFromArgs}\\u001b[0m 서비스가 선택되었습니다. (--service)\\n`);\n\n return selectedServiceFromArgs;\n }\n\n helperTrace('show-selection:interactive:start');\n let selectedIndex = 0;\n\n // Use readline to handle keypresses\n // 키 입력을 처리하기 위해 readline 인터페이스 사용\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: true\n });\n\n let firstRender = true;\n\n // Hide cursor\n process.stdout.write('\\u001b[?25l');\n\n const render = () => {\n if (!firstRender) {\n // Move cursor back to the starting line of the selection UI\n // We print (1 question line + services.length lines)\n // 선택 UI의 시작 라인으로 커서 이동 (질문 1줄 + 서비스 목록 N줄)\n readline.moveCursor(process.stdout, 0, -(AIServices.length + 1));\n }\n firstRender = false;\n helperTrace('show-selection:interactive:render', AIServices[selectedIndex] || 'unknown');\n\n // Clear everything from cursor down to avoid ghosting/overlaps\n // 잔상이나 겹침을 방지하기 위해 커서 위치부터 아래쪽 모두 지움\n readline.clearScreenDown(process.stdout);\n\n process.stdout.write(\n '🤖 AI 서비스를 선택해주세요 (\\u001b[33m↑↓ 방향키\\u001b[0m 이동, \\u001b[33mEnter\\u001b[0m 선택):\\n'\n );\n AIServices.forEach((service, index) => {\n if (index === selectedIndex) {\n process.stdout.write(` \\u001b[36m>\\u001b[0m \\u001b[36m◉\\u001b[0m \\u001b[1m${service}\\u001b[0m\\n`);\n } else {\n process.stdout.write(` ◯ ${service}\\n`);\n }\n });\n };\n\n render();\n\n return new Promise((resolve) => {\n const onData = (data: Buffer) => {\n const key = data.toString();\n if (key === '\\u0003') {\n // Ctrl+C\n helperTrace('show-selection:interactive:ctrl-c');\n process.stdout.write('\\u001b[?25h'); // Show cursor\n process.exit(0);\n }\n if (key === '\\x1b[A') {\n // Up arrow\n selectedIndex = (selectedIndex - 1 + AIServices.length) % AIServices.length;\n render();\n } else if (key === '\\x1b[B') {\n // Down arrow\n selectedIndex = (selectedIndex + 1) % AIServices.length;\n render();\n } else if (key === '\\r' || key === '\\n') {\n // Enter\n process.stdin.removeListener('data', onData);\n process.stdin.setRawMode(false);\n process.stdin.pause();\n rl.close();\n\n // Show cursor\n process.stdout.write('\\u001b[?25h');\n\n console.log(`\\n✅ \\u001b[32m${AIServices[selectedIndex]}\\u001b[0m 서비스가 선택되었습니다.\\n`);\n const result = AIServices[selectedIndex];\n if (result) {\n helperTrace('show-selection:interactive:confirmed', result);\n resolve(result);\n }\n }\n };\n\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.on('data', onData);\n });\n}\n"]}
|
package/dist/common/helper.d.cts
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import { AIServiceType } from './types.cjs';
|
|
2
2
|
|
|
3
|
+
type ErrorReportSection = {
|
|
4
|
+
heading: string;
|
|
5
|
+
markdown: string;
|
|
6
|
+
};
|
|
7
|
+
type WriteErrorReportOptions = {
|
|
8
|
+
title?: string;
|
|
9
|
+
scope?: string;
|
|
10
|
+
args?: string[];
|
|
11
|
+
traceMessages?: string[];
|
|
12
|
+
extraSections?: ErrorReportSection[];
|
|
13
|
+
};
|
|
3
14
|
declare const rulesPath: string;
|
|
4
15
|
declare const namingRulesPath: string;
|
|
5
16
|
declare const codingConventionRulesPath: string;
|
|
@@ -10,8 +21,12 @@ declare const tempDiffPath = "temp_diff.txt";
|
|
|
10
21
|
declare const AIServices: AIServiceType[];
|
|
11
22
|
declare const ignoreList: string[];
|
|
12
23
|
declare function isTestMode(args?: string[]): boolean;
|
|
24
|
+
declare function clearTraceMessages(): void;
|
|
25
|
+
declare function getTraceMessages(): string[];
|
|
13
26
|
declare function createTraceLogger(scope: string, args?: string[]): (step: string, detail?: string) => void;
|
|
27
|
+
declare function getErrorSummary(error: unknown): string;
|
|
14
28
|
declare function getNextFilePath(dir: string, baseName: string, extension: string): string;
|
|
29
|
+
declare function getAvailableFilePath(dir: string, baseName: string, extension: string): string;
|
|
15
30
|
declare function deleteFile(filePath: string): void;
|
|
16
31
|
/**
|
|
17
32
|
* 임시파일 삭제
|
|
@@ -24,7 +39,12 @@ declare function createReportDirectory(): void;
|
|
|
24
39
|
/**
|
|
25
40
|
* 현재 시간 문자열 생성
|
|
26
41
|
*/
|
|
27
|
-
declare function getNowString(): string;
|
|
42
|
+
declare function getNowString(now?: Date): string;
|
|
43
|
+
declare function getErrorLogTimestamp(now?: Date): string;
|
|
44
|
+
declare function writeErrorReport(error: unknown, options?: WriteErrorReportOptions): string;
|
|
45
|
+
declare function exitWithError(message: string, options?: Omit<WriteErrorReportOptions, 'title'> & {
|
|
46
|
+
error?: unknown;
|
|
47
|
+
}): never;
|
|
28
48
|
declare function getGitDiffFilter(): {
|
|
29
49
|
includeParams: string;
|
|
30
50
|
excludeParams: string;
|
|
@@ -52,4 +72,4 @@ declare function selectAIService(): AIServiceType;
|
|
|
52
72
|
*/
|
|
53
73
|
declare function showSelectionAIService(): Promise<AIServiceType>;
|
|
54
74
|
|
|
55
|
-
export { AIServices, REPORT_DIR, codingConventionRulesPath, createReportDirectory, createTraceLogger, deleteFile, deleteTempDiff, getDiffArgs, getGitDiffFilter, getNextFilePath, getNowString, ignoreList, isTestMode, namingRulesPath, openReport, reviewFormOneByOnePath, reviewFormPath, rulesPath, selectAIService, showSelectionAIService, tempDiffPath };
|
|
75
|
+
export { AIServices, REPORT_DIR, clearTraceMessages, codingConventionRulesPath, createReportDirectory, createTraceLogger, deleteFile, deleteTempDiff, exitWithError, getAvailableFilePath, getDiffArgs, getErrorLogTimestamp, getErrorSummary, getGitDiffFilter, getNextFilePath, getNowString, getTraceMessages, ignoreList, isTestMode, namingRulesPath, openReport, reviewFormOneByOnePath, reviewFormPath, rulesPath, selectAIService, showSelectionAIService, tempDiffPath, writeErrorReport };
|
package/dist/common/helper.d.ts
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import { AIServiceType } from './types.js';
|
|
2
2
|
|
|
3
|
+
type ErrorReportSection = {
|
|
4
|
+
heading: string;
|
|
5
|
+
markdown: string;
|
|
6
|
+
};
|
|
7
|
+
type WriteErrorReportOptions = {
|
|
8
|
+
title?: string;
|
|
9
|
+
scope?: string;
|
|
10
|
+
args?: string[];
|
|
11
|
+
traceMessages?: string[];
|
|
12
|
+
extraSections?: ErrorReportSection[];
|
|
13
|
+
};
|
|
3
14
|
declare const rulesPath: string;
|
|
4
15
|
declare const namingRulesPath: string;
|
|
5
16
|
declare const codingConventionRulesPath: string;
|
|
@@ -10,8 +21,12 @@ declare const tempDiffPath = "temp_diff.txt";
|
|
|
10
21
|
declare const AIServices: AIServiceType[];
|
|
11
22
|
declare const ignoreList: string[];
|
|
12
23
|
declare function isTestMode(args?: string[]): boolean;
|
|
24
|
+
declare function clearTraceMessages(): void;
|
|
25
|
+
declare function getTraceMessages(): string[];
|
|
13
26
|
declare function createTraceLogger(scope: string, args?: string[]): (step: string, detail?: string) => void;
|
|
27
|
+
declare function getErrorSummary(error: unknown): string;
|
|
14
28
|
declare function getNextFilePath(dir: string, baseName: string, extension: string): string;
|
|
29
|
+
declare function getAvailableFilePath(dir: string, baseName: string, extension: string): string;
|
|
15
30
|
declare function deleteFile(filePath: string): void;
|
|
16
31
|
/**
|
|
17
32
|
* 임시파일 삭제
|
|
@@ -24,7 +39,12 @@ declare function createReportDirectory(): void;
|
|
|
24
39
|
/**
|
|
25
40
|
* 현재 시간 문자열 생성
|
|
26
41
|
*/
|
|
27
|
-
declare function getNowString(): string;
|
|
42
|
+
declare function getNowString(now?: Date): string;
|
|
43
|
+
declare function getErrorLogTimestamp(now?: Date): string;
|
|
44
|
+
declare function writeErrorReport(error: unknown, options?: WriteErrorReportOptions): string;
|
|
45
|
+
declare function exitWithError(message: string, options?: Omit<WriteErrorReportOptions, 'title'> & {
|
|
46
|
+
error?: unknown;
|
|
47
|
+
}): never;
|
|
28
48
|
declare function getGitDiffFilter(): {
|
|
29
49
|
includeParams: string;
|
|
30
50
|
excludeParams: string;
|
|
@@ -52,4 +72,4 @@ declare function selectAIService(): AIServiceType;
|
|
|
52
72
|
*/
|
|
53
73
|
declare function showSelectionAIService(): Promise<AIServiceType>;
|
|
54
74
|
|
|
55
|
-
export { AIServices, REPORT_DIR, codingConventionRulesPath, createReportDirectory, createTraceLogger, deleteFile, deleteTempDiff, getDiffArgs, getGitDiffFilter, getNextFilePath, getNowString, ignoreList, isTestMode, namingRulesPath, openReport, reviewFormOneByOnePath, reviewFormPath, rulesPath, selectAIService, showSelectionAIService, tempDiffPath };
|
|
75
|
+
export { AIServices, REPORT_DIR, clearTraceMessages, codingConventionRulesPath, createReportDirectory, createTraceLogger, deleteFile, deleteTempDiff, exitWithError, getAvailableFilePath, getDiffArgs, getErrorLogTimestamp, getErrorSummary, getGitDiffFilter, getNextFilePath, getNowString, getTraceMessages, ignoreList, isTestMode, namingRulesPath, openReport, reviewFormOneByOnePath, reviewFormPath, rulesPath, selectAIService, showSelectionAIService, tempDiffPath, writeErrorReport };
|