kordoc 2.4.0 → 2.5.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/README.md +56 -1
- package/dist/{chunk-VLSATRNQ.cjs → chunk-5HWLDNT5.cjs} +2 -2
- package/dist/{chunk-VLSATRNQ.cjs.map → chunk-5HWLDNT5.cjs.map} +1 -1
- package/dist/{chunk-KSBPABBQ.js → chunk-JU7NRDCV.js} +95 -10
- package/dist/chunk-JU7NRDCV.js.map +1 -0
- package/dist/{chunk-XG5CQUSC.js → chunk-UOBENOSJ.js} +2 -2
- package/dist/{chunk-VJPDY4YT.js → chunk-V6STPG3I.js} +2 -2
- package/dist/cli.js +7 -3
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +179 -94
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +94 -9
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +3 -3
- package/dist/{parser-STAOZMUC.cjs → parser-BYHUJ5GP.cjs} +16 -15
- package/dist/{parser-STAOZMUC.cjs.map → parser-BYHUJ5GP.cjs.map} +1 -1
- package/dist/{parser-XRUZEFZT.js → parser-W4P5VX7T.js} +3 -2
- package/dist/parser-W4P5VX7T.js.map +1 -0
- package/dist/{parser-4275GJRB.js → parser-YHW6R62S.js} +3 -2
- package/dist/parser-YHW6R62S.js.map +1 -0
- package/dist/setup-57FB3LSP.js +201 -0
- package/dist/setup-57FB3LSP.js.map +1 -0
- package/dist/{watch-BFLNFJBE.js → watch-Z2YSFSQ3.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-KSBPABBQ.js.map +0 -1
- package/dist/parser-4275GJRB.js.map +0 -1
- package/dist/parser-XRUZEFZT.js.map +0 -1
- /package/dist/{chunk-XG5CQUSC.js.map → chunk-UOBENOSJ.js.map} +0 -0
- /package/dist/{chunk-VJPDY4YT.js.map → chunk-V6STPG3I.js.map} +0 -0
- /package/dist/{watch-BFLNFJBE.js.map → watch-Z2YSFSQ3.js.map} +0 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/setup.ts
|
|
4
|
+
import { createInterface } from "readline/promises";
|
|
5
|
+
import { readFile, writeFile, mkdir } from "fs/promises";
|
|
6
|
+
import { existsSync } from "fs";
|
|
7
|
+
import { resolve, dirname } from "path";
|
|
8
|
+
import { homedir, platform } from "os";
|
|
9
|
+
import { stdin, stdout } from "process";
|
|
10
|
+
function detectClients() {
|
|
11
|
+
const home = homedir();
|
|
12
|
+
const os = platform();
|
|
13
|
+
const clients = [];
|
|
14
|
+
const claudePaths = {
|
|
15
|
+
darwin: resolve(home, "Library/Application Support/Claude/claude_desktop_config.json"),
|
|
16
|
+
win32: resolve(process.env["APPDATA"] ?? resolve(home, "AppData/Roaming"), "Claude/claude_desktop_config.json"),
|
|
17
|
+
linux: resolve(home, ".config/Claude/claude_desktop_config.json")
|
|
18
|
+
};
|
|
19
|
+
const claudePath = claudePaths[os];
|
|
20
|
+
if (claudePath) clients.push({ name: "Claude Desktop", configPath: claudePath, format: "mcpServers" });
|
|
21
|
+
clients.push({ name: "Claude Code (\uD604\uC7AC \uB514\uB809\uD1A0\uB9AC)", configPath: resolve(process.cwd(), ".mcp.json"), format: "mcpServers" });
|
|
22
|
+
clients.push({ name: "Cursor", configPath: resolve(home, ".cursor/mcp.json"), format: "mcpServers" });
|
|
23
|
+
clients.push({ name: "VS Code (\uD604\uC7AC \uB514\uB809\uD1A0\uB9AC)", configPath: resolve(process.cwd(), ".vscode/mcp.json"), format: "servers" });
|
|
24
|
+
clients.push({ name: "Windsurf", configPath: resolve(home, ".codeium/windsurf/mcp_config.json"), format: "mcpServers" });
|
|
25
|
+
clients.push({ name: "Gemini CLI", configPath: resolve(home, ".gemini/settings.json"), format: "mcpServers" });
|
|
26
|
+
const zedPaths = {
|
|
27
|
+
darwin: resolve(home, ".zed/settings.json"),
|
|
28
|
+
linux: resolve(home, ".config/zed/settings.json"),
|
|
29
|
+
win32: resolve(home, ".zed/settings.json")
|
|
30
|
+
};
|
|
31
|
+
const zedPath = zedPaths[os];
|
|
32
|
+
if (zedPath) clients.push({ name: "Zed", configPath: zedPath, format: "context_servers" });
|
|
33
|
+
clients.push({ name: "Antigravity", configPath: resolve(home, ".gemini/antigravity/mcp_config.json"), format: "mcpServers" });
|
|
34
|
+
return clients;
|
|
35
|
+
}
|
|
36
|
+
async function readJsonFile(path) {
|
|
37
|
+
if (!existsSync(path)) return {};
|
|
38
|
+
const raw = await readFile(path, "utf-8");
|
|
39
|
+
return JSON.parse(raw);
|
|
40
|
+
}
|
|
41
|
+
async function writeJsonFile(path, data) {
|
|
42
|
+
const dir = dirname(path);
|
|
43
|
+
if (!existsSync(dir)) await mkdir(dir, { recursive: true });
|
|
44
|
+
await writeFile(path, JSON.stringify(data, null, 2) + "\n", "utf-8");
|
|
45
|
+
}
|
|
46
|
+
function buildServerEntry() {
|
|
47
|
+
if (platform() === "win32") {
|
|
48
|
+
return { command: "cmd", args: ["/c", "npx", "-y", "kordoc", "mcp"] };
|
|
49
|
+
}
|
|
50
|
+
return { command: "npx", args: ["-y", "kordoc", "mcp"] };
|
|
51
|
+
}
|
|
52
|
+
function buildZedEntry() {
|
|
53
|
+
const base = platform() === "win32" ? { path: "cmd", args: ["/c", "npx", "-y", "kordoc", "mcp"] } : { path: "npx", args: ["-y", "kordoc", "mcp"] };
|
|
54
|
+
return { command: base };
|
|
55
|
+
}
|
|
56
|
+
var ESC = "\x1B[";
|
|
57
|
+
var c = {
|
|
58
|
+
reset: `${ESC}0m`,
|
|
59
|
+
bold: `${ESC}1m`,
|
|
60
|
+
dim: `${ESC}2m`,
|
|
61
|
+
cyan: `${ESC}36m`,
|
|
62
|
+
green: `${ESC}32m`,
|
|
63
|
+
yellow: `${ESC}33m`,
|
|
64
|
+
red: `${ESC}31m`,
|
|
65
|
+
white: `${ESC}37m`
|
|
66
|
+
};
|
|
67
|
+
function rgb(r, g, b) {
|
|
68
|
+
return `${ESC}38;2;${r};${g};${b}m`;
|
|
69
|
+
}
|
|
70
|
+
function sleep(ms) {
|
|
71
|
+
return new Promise((res) => setTimeout(res, ms));
|
|
72
|
+
}
|
|
73
|
+
async function typewrite(text, delay = 15) {
|
|
74
|
+
for (const ch of text) {
|
|
75
|
+
process.stdout.write(ch);
|
|
76
|
+
await sleep(delay);
|
|
77
|
+
}
|
|
78
|
+
console.log();
|
|
79
|
+
}
|
|
80
|
+
async function printBanner() {
|
|
81
|
+
const gradients = [
|
|
82
|
+
rgb(255, 120, 80),
|
|
83
|
+
rgb(255, 140, 80),
|
|
84
|
+
rgb(255, 160, 80),
|
|
85
|
+
rgb(240, 180, 80),
|
|
86
|
+
rgb(220, 200, 80),
|
|
87
|
+
rgb(200, 220, 80)
|
|
88
|
+
];
|
|
89
|
+
const logo = [
|
|
90
|
+
" _ _ ",
|
|
91
|
+
" | | _____ _ __ __| | ___ ___ ",
|
|
92
|
+
" | |/ / _ \\| '__/ _` |/ _ \\ / __|",
|
|
93
|
+
" | < (_) | | | (_| | (_) | (__ ",
|
|
94
|
+
" |_|\\_\\___/|_| \\__,_|\\___/ \\___|"
|
|
95
|
+
];
|
|
96
|
+
console.log();
|
|
97
|
+
for (let i = 0; i < logo.length; i++) {
|
|
98
|
+
console.log(`${gradients[i % gradients.length]}${c.bold}${logo[i]}${c.reset}`);
|
|
99
|
+
await sleep(60);
|
|
100
|
+
}
|
|
101
|
+
console.log();
|
|
102
|
+
await typewrite(`${c.dim} \uBAA8\uB450 \uD30C\uC2F1\uD574\uBC84\uB9AC\uACA0\uB2E4 \u2501\u2501 HWP \xB7 HWPX \xB7 PDF \xB7 XLSX \xB7 DOCX \u2192 Markdown${c.reset}`, 10);
|
|
103
|
+
console.log();
|
|
104
|
+
console.log(`${c.cyan} ${"\u2501".repeat(60)}${c.reset}`);
|
|
105
|
+
console.log();
|
|
106
|
+
}
|
|
107
|
+
function stepHeader(step, total, title) {
|
|
108
|
+
const dots = `${c.dim}${"\xB7".repeat(Math.max(0, 40 - title.length))}${c.reset}`;
|
|
109
|
+
console.log(` ${c.cyan}${c.bold}[${step}/${total}]${c.reset} ${c.white}${c.bold}${title}${c.reset} ${dots}`);
|
|
110
|
+
console.log();
|
|
111
|
+
}
|
|
112
|
+
function successLine(label, detail) {
|
|
113
|
+
console.log(` ${c.green}${c.bold}+${c.reset} ${c.white}${label}${c.reset}${c.dim} ${detail}${c.reset}`);
|
|
114
|
+
}
|
|
115
|
+
function failLine(label, detail) {
|
|
116
|
+
console.log(` ${c.red}${c.bold}x${c.reset} ${c.white}${label}${c.reset}${c.dim} ${detail}${c.reset}`);
|
|
117
|
+
}
|
|
118
|
+
async function printComplete() {
|
|
119
|
+
console.log();
|
|
120
|
+
const box = [
|
|
121
|
+
` ${c.green}${c.bold}\u2554${"\u2550".repeat(50)}\u2557${c.reset}`,
|
|
122
|
+
` ${c.green}${c.bold}\u2551${c.reset}${" ".repeat(14)}${c.green}${c.bold}Setup Complete!${c.reset}${" ".repeat(22)}${c.green}${c.bold}\u2551${c.reset}`,
|
|
123
|
+
` ${c.green}${c.bold}\u255A${"\u2550".repeat(50)}\u255D${c.reset}`
|
|
124
|
+
];
|
|
125
|
+
for (const line of box) {
|
|
126
|
+
console.log(line);
|
|
127
|
+
await sleep(40);
|
|
128
|
+
}
|
|
129
|
+
console.log();
|
|
130
|
+
console.log(` ${c.dim}\uD074\uB77C\uC774\uC5B8\uD2B8\uB97C \uC7AC\uC2DC\uC791\uD558\uBA74 'kordoc' MCP \uC11C\uBC84\uAC00 \uD65C\uC131\uD654\uB429\uB2C8\uB2E4.${c.reset}`);
|
|
131
|
+
console.log(` ${c.dim}8\uAC1C \uB3C4\uAD6C: parse_document / parse_metadata / parse_pages / parse_table${c.reset}`);
|
|
132
|
+
console.log(` ${c.dim} detect_format / compare_documents / parse_form / fill_form${c.reset}`);
|
|
133
|
+
console.log();
|
|
134
|
+
}
|
|
135
|
+
async function runSetup() {
|
|
136
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
137
|
+
try {
|
|
138
|
+
await printBanner();
|
|
139
|
+
stepHeader(1, 2, "MCP \uD074\uB77C\uC774\uC5B8\uD2B8 \uC120\uD0DD");
|
|
140
|
+
const clients = detectClients();
|
|
141
|
+
clients.forEach((cl, i) => {
|
|
142
|
+
const exists = existsSync(cl.configPath);
|
|
143
|
+
const badge = exists ? `${c.green} [\uAC10\uC9C0\uB428]${c.reset}` : "";
|
|
144
|
+
const num = `${c.cyan}${String(i + 1).padStart(2)}${c.reset}`;
|
|
145
|
+
console.log(` ${num}) ${c.white}${cl.name}${c.reset}${badge}`);
|
|
146
|
+
});
|
|
147
|
+
console.log();
|
|
148
|
+
const clientInput = (await rl.question(` ${c.cyan}>${c.reset} \uBC88\uD638 (\uC608: 1,3): `)).trim();
|
|
149
|
+
if (!clientInput) {
|
|
150
|
+
console.log(`
|
|
151
|
+
${c.yellow}\uC120\uD0DD \uC5C6\uC74C${c.reset} \u2014 \uC218\uB3D9 \uC124\uC815 \uC548\uB0B4:`);
|
|
152
|
+
printManualConfig();
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const indices = clientInput.split(",").map((s) => parseInt(s.trim(), 10) - 1).filter((i) => i >= 0 && i < clients.length);
|
|
156
|
+
if (indices.length === 0) {
|
|
157
|
+
console.log(`
|
|
158
|
+
${c.yellow}\uC720\uD6A8\uD55C \uC120\uD0DD \uC5C6\uC74C${c.reset} \u2014 \uC218\uB3D9 \uC124\uC815 \uC548\uB0B4:`);
|
|
159
|
+
printManualConfig();
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
console.log();
|
|
163
|
+
stepHeader(2, 2, "\uC124\uC815 \uD30C\uC77C \uC5C5\uB370\uC774\uD2B8");
|
|
164
|
+
const entry = buildServerEntry();
|
|
165
|
+
for (const idx of indices) {
|
|
166
|
+
const client = clients[idx];
|
|
167
|
+
await sleep(150);
|
|
168
|
+
try {
|
|
169
|
+
const config = await readJsonFile(client.configPath);
|
|
170
|
+
const key = client.format;
|
|
171
|
+
const serverEntry = key === "context_servers" ? buildZedEntry() : entry;
|
|
172
|
+
const servers = config[key] ?? {};
|
|
173
|
+
servers["kordoc"] = serverEntry;
|
|
174
|
+
config[key] = servers;
|
|
175
|
+
await writeJsonFile(client.configPath, config);
|
|
176
|
+
successLine(client.name, client.configPath);
|
|
177
|
+
} catch (err) {
|
|
178
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
179
|
+
failLine(client.name, msg);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
await printComplete();
|
|
183
|
+
} catch (err) {
|
|
184
|
+
if (err?.code === "ERR_USE_AFTER_CLOSE") return;
|
|
185
|
+
throw err;
|
|
186
|
+
} finally {
|
|
187
|
+
rl.close();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function printManualConfig() {
|
|
191
|
+
const entry = buildServerEntry();
|
|
192
|
+
console.log();
|
|
193
|
+
console.log(` ${c.dim}\uC544\uB798 JSON\uC744 \uC124\uC815 \uD30C\uC77C\uC758 mcpServers\uC5D0 \uCD94\uAC00\uD558\uC138\uC694:${c.reset}`);
|
|
194
|
+
console.log();
|
|
195
|
+
console.log(` ${c.cyan}"kordoc"${c.reset}: ${JSON.stringify(entry, null, 4)}`);
|
|
196
|
+
console.log();
|
|
197
|
+
}
|
|
198
|
+
export {
|
|
199
|
+
runSetup
|
|
200
|
+
};
|
|
201
|
+
//# sourceMappingURL=setup-57FB3LSP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/setup.ts"],"sourcesContent":["/**\n * 대화형 설치 마법사 — kordoc MCP\n *\n * `npx kordoc setup` 으로 실행.\n * 선택한 AI 클라이언트 설정 파일에 kordoc-mcp 서버를 자동 등록합니다.\n * API 키 불필요, macOS / Linux / Windows 공용.\n */\n\nimport { createInterface } from \"node:readline/promises\"\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\"\nimport { existsSync } from \"node:fs\"\nimport { resolve, dirname } from \"node:path\"\nimport { homedir, platform } from \"node:os\"\nimport { stdin, stdout } from \"node:process\"\n\ninterface ClientConfig {\n readonly name: string\n readonly configPath: string\n readonly format: \"mcpServers\" | \"servers\" | \"context_servers\"\n}\n\nfunction detectClients(): readonly ClientConfig[] {\n const home = homedir()\n const os = platform()\n const clients: ClientConfig[] = []\n\n const claudePaths: Record<string, string> = {\n darwin: resolve(home, \"Library/Application Support/Claude/claude_desktop_config.json\"),\n win32: resolve(process.env[\"APPDATA\"] ?? resolve(home, \"AppData/Roaming\"), \"Claude/claude_desktop_config.json\"),\n linux: resolve(home, \".config/Claude/claude_desktop_config.json\"),\n }\n const claudePath = claudePaths[os]\n if (claudePath) clients.push({ name: \"Claude Desktop\", configPath: claudePath, format: \"mcpServers\" })\n\n clients.push({ name: \"Claude Code (현재 디렉토리)\", configPath: resolve(process.cwd(), \".mcp.json\"), format: \"mcpServers\" })\n clients.push({ name: \"Cursor\", configPath: resolve(home, \".cursor/mcp.json\"), format: \"mcpServers\" })\n clients.push({ name: \"VS Code (현재 디렉토리)\", configPath: resolve(process.cwd(), \".vscode/mcp.json\"), format: \"servers\" })\n clients.push({ name: \"Windsurf\", configPath: resolve(home, \".codeium/windsurf/mcp_config.json\"), format: \"mcpServers\" })\n clients.push({ name: \"Gemini CLI\", configPath: resolve(home, \".gemini/settings.json\"), format: \"mcpServers\" })\n\n const zedPaths: Record<string, string> = {\n darwin: resolve(home, \".zed/settings.json\"),\n linux: resolve(home, \".config/zed/settings.json\"),\n win32: resolve(home, \".zed/settings.json\"),\n }\n const zedPath = zedPaths[os]\n if (zedPath) clients.push({ name: \"Zed\", configPath: zedPath, format: \"context_servers\" })\n\n clients.push({ name: \"Antigravity\", configPath: resolve(home, \".gemini/antigravity/mcp_config.json\"), format: \"mcpServers\" })\n\n return clients\n}\n\nasync function readJsonFile(path: string): Promise<Record<string, unknown>> {\n if (!existsSync(path)) return {}\n const raw = await readFile(path, \"utf-8\")\n return JSON.parse(raw) as Record<string, unknown>\n}\n\nasync function writeJsonFile(path: string, data: Record<string, unknown>): Promise<void> {\n const dir = dirname(path)\n if (!existsSync(dir)) await mkdir(dir, { recursive: true })\n await writeFile(path, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\")\n}\n\n/**\n * Windows 에선 npx.cmd 를 Claude Desktop 이 해석 못 해서 `cmd /c` 래핑이 필요하다.\n * `kordoc` 은 `npx kordoc mcp` 로 MCP 서버 실행, 또는 `kordoc-mcp` bin 직접 실행.\n * npx 래핑이 범용적이므로 `npx -y kordoc mcp` 로 통일.\n */\nfunction buildServerEntry(): Record<string, unknown> {\n if (platform() === \"win32\") {\n return { command: \"cmd\", args: [\"/c\", \"npx\", \"-y\", \"kordoc\", \"mcp\"] }\n }\n return { command: \"npx\", args: [\"-y\", \"kordoc\", \"mcp\"] }\n}\n\nfunction buildZedEntry(): Record<string, unknown> {\n const base = platform() === \"win32\"\n ? { path: \"cmd\", args: [\"/c\", \"npx\", \"-y\", \"kordoc\", \"mcp\"] }\n : { path: \"npx\", args: [\"-y\", \"kordoc\", \"mcp\"] }\n return { command: base }\n}\n\n// ─── ANSI ─────────────────────────────────────────────────────────────\nconst ESC = \"\\x1b[\"\nconst c = {\n reset: `${ESC}0m`, bold: `${ESC}1m`, dim: `${ESC}2m`,\n cyan: `${ESC}36m`, green: `${ESC}32m`, yellow: `${ESC}33m`,\n red: `${ESC}31m`, white: `${ESC}37m`,\n} as const\n\nfunction rgb(r: number, g: number, b: number): string {\n return `${ESC}38;2;${r};${g};${b}m`\n}\nfunction sleep(ms: number): Promise<void> {\n return new Promise((res) => setTimeout(res, ms))\n}\nasync function typewrite(text: string, delay = 15): Promise<void> {\n for (const ch of text) { process.stdout.write(ch); await sleep(delay) }\n console.log()\n}\n\nasync function printBanner(): Promise<void> {\n const gradients = [\n rgb(255, 120, 80), rgb(255, 140, 80), rgb(255, 160, 80),\n rgb(240, 180, 80), rgb(220, 200, 80), rgb(200, 220, 80),\n ]\n const logo = [\n \" _ _ \",\n \" | | _____ _ __ __| | ___ ___ \",\n \" | |/ / _ \\\\| '__/ _` |/ _ \\\\ / __|\",\n \" | < (_) | | | (_| | (_) | (__ \",\n \" |_|\\\\_\\\\___/|_| \\\\__,_|\\\\___/ \\\\___|\",\n ]\n console.log()\n for (let i = 0; i < logo.length; i++) {\n console.log(`${gradients[i % gradients.length]}${c.bold}${logo[i]}${c.reset}`)\n await sleep(60)\n }\n console.log()\n await typewrite(`${c.dim} 모두 파싱해버리겠다 ━━ HWP · HWPX · PDF · XLSX · DOCX → Markdown${c.reset}`, 10)\n console.log()\n console.log(`${c.cyan} ${\"━\".repeat(60)}${c.reset}`)\n console.log()\n}\n\nfunction stepHeader(step: number, total: number, title: string): void {\n const dots = `${c.dim}${\"·\".repeat(Math.max(0, 40 - title.length))}${c.reset}`\n console.log(` ${c.cyan}${c.bold}[${step}/${total}]${c.reset} ${c.white}${c.bold}${title}${c.reset} ${dots}`)\n console.log()\n}\n\nfunction successLine(label: string, detail: string): void {\n console.log(` ${c.green}${c.bold}+${c.reset} ${c.white}${label}${c.reset}${c.dim} ${detail}${c.reset}`)\n}\nfunction failLine(label: string, detail: string): void {\n console.log(` ${c.red}${c.bold}x${c.reset} ${c.white}${label}${c.reset}${c.dim} ${detail}${c.reset}`)\n}\n\nasync function printComplete(): Promise<void> {\n console.log()\n const box = [\n ` ${c.green}${c.bold}╔${\"═\".repeat(50)}╗${c.reset}`,\n ` ${c.green}${c.bold}║${c.reset}${\" \".repeat(14)}${c.green}${c.bold}Setup Complete!${c.reset}${\" \".repeat(22)}${c.green}${c.bold}║${c.reset}`,\n ` ${c.green}${c.bold}╚${\"═\".repeat(50)}╝${c.reset}`,\n ]\n for (const line of box) { console.log(line); await sleep(40) }\n console.log()\n console.log(` ${c.dim}클라이언트를 재시작하면 'kordoc' MCP 서버가 활성화됩니다.${c.reset}`)\n console.log(` ${c.dim}8개 도구: parse_document / parse_metadata / parse_pages / parse_table${c.reset}`)\n console.log(` ${c.dim} detect_format / compare_documents / parse_form / fill_form${c.reset}`)\n console.log()\n}\n\nexport async function runSetup(): Promise<void> {\n const rl = createInterface({ input: stdin, output: stdout })\n\n try {\n await printBanner()\n\n stepHeader(1, 2, \"MCP 클라이언트 선택\")\n const clients = detectClients()\n clients.forEach((cl, i) => {\n const exists = existsSync(cl.configPath)\n const badge = exists ? `${c.green} [감지됨]${c.reset}` : \"\"\n const num = `${c.cyan}${String(i + 1).padStart(2)}${c.reset}`\n console.log(` ${num}) ${c.white}${cl.name}${c.reset}${badge}`)\n })\n console.log()\n const clientInput = (await rl.question(` ${c.cyan}>${c.reset} 번호 (예: 1,3): `)).trim()\n\n if (!clientInput) {\n console.log(`\\n ${c.yellow}선택 없음${c.reset} — 수동 설정 안내:`)\n printManualConfig()\n return\n }\n\n const indices = clientInput\n .split(\",\")\n .map((s) => parseInt(s.trim(), 10) - 1)\n .filter((i) => i >= 0 && i < clients.length)\n\n if (indices.length === 0) {\n console.log(`\\n ${c.yellow}유효한 선택 없음${c.reset} — 수동 설정 안내:`)\n printManualConfig()\n return\n }\n\n console.log()\n stepHeader(2, 2, \"설정 파일 업데이트\")\n const entry = buildServerEntry()\n\n for (const idx of indices) {\n const client = clients[idx]\n await sleep(150)\n try {\n const config = await readJsonFile(client.configPath)\n const key = client.format\n const serverEntry = key === \"context_servers\" ? buildZedEntry() : entry\n const servers = (config[key] ?? {}) as Record<string, unknown>\n servers[\"kordoc\"] = serverEntry\n config[key] = servers\n await writeJsonFile(client.configPath, config)\n successLine(client.name, client.configPath)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n failLine(client.name, msg)\n }\n }\n\n await printComplete()\n } catch (err) {\n if ((err as NodeJS.ErrnoException)?.code === \"ERR_USE_AFTER_CLOSE\") return\n throw err\n } finally {\n rl.close()\n }\n}\n\nfunction printManualConfig(): void {\n const entry = buildServerEntry()\n console.log()\n console.log(` ${c.dim}아래 JSON을 설정 파일의 mcpServers에 추가하세요:${c.reset}`)\n console.log()\n console.log(` ${c.cyan}\"kordoc\"${c.reset}: ${JSON.stringify(entry, null, 4)}`)\n console.log()\n}\n"],"mappings":";;;AAQA,SAAS,uBAAuB;AAChC,SAAS,UAAU,WAAW,aAAa;AAC3C,SAAS,kBAAkB;AAC3B,SAAS,SAAS,eAAe;AACjC,SAAS,SAAS,gBAAgB;AAClC,SAAS,OAAO,cAAc;AAQ9B,SAAS,gBAAyC;AAChD,QAAM,OAAO,QAAQ;AACrB,QAAM,KAAK,SAAS;AACpB,QAAM,UAA0B,CAAC;AAEjC,QAAM,cAAsC;AAAA,IAC1C,QAAQ,QAAQ,MAAM,+DAA+D;AAAA,IACrF,OAAO,QAAQ,QAAQ,IAAI,SAAS,KAAK,QAAQ,MAAM,iBAAiB,GAAG,mCAAmC;AAAA,IAC9G,OAAO,QAAQ,MAAM,2CAA2C;AAAA,EAClE;AACA,QAAM,aAAa,YAAY,EAAE;AACjC,MAAI,WAAY,SAAQ,KAAK,EAAE,MAAM,kBAAkB,YAAY,YAAY,QAAQ,aAAa,CAAC;AAErG,UAAQ,KAAK,EAAE,MAAM,uDAAyB,YAAY,QAAQ,QAAQ,IAAI,GAAG,WAAW,GAAG,QAAQ,aAAa,CAAC;AACrH,UAAQ,KAAK,EAAE,MAAM,UAAU,YAAY,QAAQ,MAAM,kBAAkB,GAAG,QAAQ,aAAa,CAAC;AACpG,UAAQ,KAAK,EAAE,MAAM,mDAAqB,YAAY,QAAQ,QAAQ,IAAI,GAAG,kBAAkB,GAAG,QAAQ,UAAU,CAAC;AACrH,UAAQ,KAAK,EAAE,MAAM,YAAY,YAAY,QAAQ,MAAM,mCAAmC,GAAG,QAAQ,aAAa,CAAC;AACvH,UAAQ,KAAK,EAAE,MAAM,cAAc,YAAY,QAAQ,MAAM,uBAAuB,GAAG,QAAQ,aAAa,CAAC;AAE7G,QAAM,WAAmC;AAAA,IACvC,QAAQ,QAAQ,MAAM,oBAAoB;AAAA,IAC1C,OAAO,QAAQ,MAAM,2BAA2B;AAAA,IAChD,OAAO,QAAQ,MAAM,oBAAoB;AAAA,EAC3C;AACA,QAAM,UAAU,SAAS,EAAE;AAC3B,MAAI,QAAS,SAAQ,KAAK,EAAE,MAAM,OAAO,YAAY,SAAS,QAAQ,kBAAkB,CAAC;AAEzF,UAAQ,KAAK,EAAE,MAAM,eAAe,YAAY,QAAQ,MAAM,qCAAqC,GAAG,QAAQ,aAAa,CAAC;AAE5H,SAAO;AACT;AAEA,eAAe,aAAa,MAAgD;AAC1E,MAAI,CAAC,WAAW,IAAI,EAAG,QAAO,CAAC;AAC/B,QAAM,MAAM,MAAM,SAAS,MAAM,OAAO;AACxC,SAAO,KAAK,MAAM,GAAG;AACvB;AAEA,eAAe,cAAc,MAAc,MAA8C;AACvF,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,CAAC,WAAW,GAAG,EAAG,OAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAC1D,QAAM,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,MAAM,OAAO;AACrE;AAOA,SAAS,mBAA4C;AACnD,MAAI,SAAS,MAAM,SAAS;AAC1B,WAAO,EAAE,SAAS,OAAO,MAAM,CAAC,MAAM,OAAO,MAAM,UAAU,KAAK,EAAE;AAAA,EACtE;AACA,SAAO,EAAE,SAAS,OAAO,MAAM,CAAC,MAAM,UAAU,KAAK,EAAE;AACzD;AAEA,SAAS,gBAAyC;AAChD,QAAM,OAAO,SAAS,MAAM,UACxB,EAAE,MAAM,OAAO,MAAM,CAAC,MAAM,OAAO,MAAM,UAAU,KAAK,EAAE,IAC1D,EAAE,MAAM,OAAO,MAAM,CAAC,MAAM,UAAU,KAAK,EAAE;AACjD,SAAO,EAAE,SAAS,KAAK;AACzB;AAGA,IAAM,MAAM;AACZ,IAAM,IAAI;AAAA,EACR,OAAO,GAAG,GAAG;AAAA,EAAM,MAAM,GAAG,GAAG;AAAA,EAAM,KAAK,GAAG,GAAG;AAAA,EAChD,MAAM,GAAG,GAAG;AAAA,EAAO,OAAO,GAAG,GAAG;AAAA,EAAO,QAAQ,GAAG,GAAG;AAAA,EACrD,KAAK,GAAG,GAAG;AAAA,EAAO,OAAO,GAAG,GAAG;AACjC;AAEA,SAAS,IAAI,GAAW,GAAW,GAAmB;AACpD,SAAO,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AAClC;AACA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,QAAQ,WAAW,KAAK,EAAE,CAAC;AACjD;AACA,eAAe,UAAU,MAAc,QAAQ,IAAmB;AAChE,aAAW,MAAM,MAAM;AAAE,YAAQ,OAAO,MAAM,EAAE;AAAG,UAAM,MAAM,KAAK;AAAA,EAAE;AACtE,UAAQ,IAAI;AACd;AAEA,eAAe,cAA6B;AAC1C,QAAM,YAAY;AAAA,IAChB,IAAI,KAAK,KAAK,EAAE;AAAA,IAAG,IAAI,KAAK,KAAK,EAAE;AAAA,IAAG,IAAI,KAAK,KAAK,EAAE;AAAA,IACtD,IAAI,KAAK,KAAK,EAAE;AAAA,IAAG,IAAI,KAAK,KAAK,EAAE;AAAA,IAAG,IAAI,KAAK,KAAK,EAAE;AAAA,EACxD;AACA,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,UAAQ,IAAI;AACZ,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAQ,IAAI,GAAG,UAAU,IAAI,UAAU,MAAM,CAAC,GAAG,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE;AAC7E,UAAM,MAAM,EAAE;AAAA,EAChB;AACA,UAAQ,IAAI;AACZ,QAAM,UAAU,GAAG,EAAE,GAAG,sIAA8D,EAAE,KAAK,IAAI,EAAE;AACnG,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAG,EAAE,IAAI,KAAK,SAAI,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE;AACpD,UAAQ,IAAI;AACd;AAEA,SAAS,WAAW,MAAc,OAAe,OAAqB;AACpE,QAAM,OAAO,GAAG,EAAE,GAAG,GAAG,OAAI,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK;AAC5E,UAAQ,IAAI,KAAK,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK,GAAG,EAAE,IAAI,GAAG,KAAK,GAAG,EAAE,KAAK,IAAI,IAAI,EAAE;AAC5G,UAAQ,IAAI;AACd;AAEA,SAAS,YAAY,OAAe,QAAsB;AACxD,UAAQ,IAAI,KAAK,EAAE,KAAK,GAAG,EAAE,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,GAAG,IAAI,MAAM,GAAG,EAAE,KAAK,EAAE;AACzG;AACA,SAAS,SAAS,OAAe,QAAsB;AACrD,UAAQ,IAAI,KAAK,EAAE,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,GAAG,IAAI,MAAM,GAAG,EAAE,KAAK,EAAE;AACvG;AAEA,eAAe,gBAA+B;AAC5C,UAAQ,IAAI;AACZ,QAAM,MAAM;AAAA,IACV,KAAK,EAAE,KAAK,GAAG,EAAE,IAAI,SAAI,SAAI,OAAO,EAAE,CAAC,SAAI,EAAE,KAAK;AAAA,IAClD,KAAK,EAAE,KAAK,GAAG,EAAE,IAAI,SAAI,EAAE,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,GAAG,EAAE,IAAI,kBAAkB,EAAE,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,GAAG,EAAE,IAAI,SAAI,EAAE,KAAK;AAAA,IAC5I,KAAK,EAAE,KAAK,GAAG,EAAE,IAAI,SAAI,SAAI,OAAO,EAAE,CAAC,SAAI,EAAE,KAAK;AAAA,EACpD;AACA,aAAW,QAAQ,KAAK;AAAE,YAAQ,IAAI,IAAI;AAAG,UAAM,MAAM,EAAE;AAAA,EAAE;AAC7D,UAAQ,IAAI;AACZ,UAAQ,IAAI,KAAK,EAAE,GAAG,4IAAwC,EAAE,KAAK,EAAE;AACvE,UAAQ,IAAI,KAAK,EAAE,GAAG,oFAAqE,EAAE,KAAK,EAAE;AACpG,UAAQ,IAAI,KAAK,EAAE,GAAG,sEAAsE,EAAE,KAAK,EAAE;AACrG,UAAQ,IAAI;AACd;AAEA,eAAsB,WAA0B;AAC9C,QAAM,KAAK,gBAAgB,EAAE,OAAO,OAAO,QAAQ,OAAO,CAAC;AAE3D,MAAI;AACF,UAAM,YAAY;AAElB,eAAW,GAAG,GAAG,iDAAc;AAC/B,UAAM,UAAU,cAAc;AAC9B,YAAQ,QAAQ,CAAC,IAAI,MAAM;AACzB,YAAM,SAAS,WAAW,GAAG,UAAU;AACvC,YAAM,QAAQ,SAAS,GAAG,EAAE,KAAK,wBAAS,EAAE,KAAK,KAAK;AACtD,YAAM,MAAM,GAAG,EAAE,IAAI,GAAG,OAAO,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,EAAE,KAAK;AAC3D,cAAQ,IAAI,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,GAAG,IAAI,GAAG,EAAE,KAAK,GAAG,KAAK,EAAE;AAAA,IAChE,CAAC;AACD,YAAQ,IAAI;AACZ,UAAM,eAAe,MAAM,GAAG,SAAS,KAAK,EAAE,IAAI,IAAI,EAAE,KAAK,+BAAgB,GAAG,KAAK;AAErF,QAAI,CAAC,aAAa;AAChB,cAAQ,IAAI;AAAA,IAAO,EAAE,MAAM,4BAAQ,EAAE,KAAK,iDAAc;AACxD,wBAAkB;AAClB;AAAA,IACF;AAEA,UAAM,UAAU,YACb,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,SAAS,EAAE,KAAK,GAAG,EAAE,IAAI,CAAC,EACrC,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,QAAQ,MAAM;AAE7C,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,IAAI;AAAA,IAAO,EAAE,MAAM,+CAAY,EAAE,KAAK,iDAAc;AAC5D,wBAAkB;AAClB;AAAA,IACF;AAEA,YAAQ,IAAI;AACZ,eAAW,GAAG,GAAG,oDAAY;AAC7B,UAAM,QAAQ,iBAAiB;AAE/B,eAAW,OAAO,SAAS;AACzB,YAAM,SAAS,QAAQ,GAAG;AAC1B,YAAM,MAAM,GAAG;AACf,UAAI;AACF,cAAM,SAAS,MAAM,aAAa,OAAO,UAAU;AACnD,cAAM,MAAM,OAAO;AACnB,cAAM,cAAc,QAAQ,oBAAoB,cAAc,IAAI;AAClE,cAAM,UAAW,OAAO,GAAG,KAAK,CAAC;AACjC,gBAAQ,QAAQ,IAAI;AACpB,eAAO,GAAG,IAAI;AACd,cAAM,cAAc,OAAO,YAAY,MAAM;AAC7C,oBAAY,OAAO,MAAM,OAAO,UAAU;AAAA,MAC5C,SAAS,KAAK;AACZ,cAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,iBAAS,OAAO,MAAM,GAAG;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,cAAc;AAAA,EACtB,SAAS,KAAK;AACZ,QAAK,KAA+B,SAAS,sBAAuB;AACpE,UAAM;AAAA,EACR,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AAEA,SAAS,oBAA0B;AACjC,QAAM,QAAQ,iBAAiB;AAC/B,UAAQ,IAAI;AACZ,UAAQ,IAAI,KAAK,EAAE,GAAG,2GAAqC,EAAE,KAAK,EAAE;AACpE,UAAQ,IAAI;AACZ,UAAQ,IAAI,KAAK,EAAE,IAAI,WAAW,EAAE,KAAK,KAAK,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC,EAAE;AAC9E,UAAQ,IAAI;AACd;","names":[]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
parse
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-JU7NRDCV.js";
|
|
5
5
|
import {
|
|
6
6
|
detectFormat
|
|
7
7
|
} from "./chunk-M3E3C5GS.js";
|
|
8
8
|
import {
|
|
9
9
|
toArrayBuffer
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-V6STPG3I.js";
|
|
11
11
|
import "./chunk-MOL7MDBG.js";
|
|
12
12
|
|
|
13
13
|
// src/watch.ts
|
|
@@ -147,4 +147,4 @@ async function sendWebhook(url, payload) {
|
|
|
147
147
|
export {
|
|
148
148
|
watchDirectory
|
|
149
149
|
};
|
|
150
|
-
//# sourceMappingURL=watch-
|
|
150
|
+
//# sourceMappingURL=watch-Z2YSFSQ3.js.map
|