@obov/mext 0.6.0 → 0.7.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.
Files changed (75) hide show
  1. package/dist/build.js +16 -2
  2. package/dist/build.js.map +1 -1
  3. package/dist/cli/args.js +1 -2
  4. package/dist/cli/args.js.map +1 -1
  5. package/dist/cli/build.js +22 -2
  6. package/dist/cli/build.js.map +1 -1
  7. package/dist/cli/dev-server.js +3 -2
  8. package/dist/cli/dev-server.js.map +1 -1
  9. package/dist/cli/dev.d.ts +6 -0
  10. package/dist/cli/dev.js +4 -4
  11. package/dist/cli/dev.js.map +1 -1
  12. package/dist/cli/main.js +2 -0
  13. package/dist/cli/main.js.map +1 -1
  14. package/dist/cli/media.d.ts +19 -0
  15. package/dist/cli/media.js +77 -0
  16. package/dist/cli/media.js.map +1 -0
  17. package/dist/cli/run.js +5 -0
  18. package/dist/cli/run.js.map +1 -1
  19. package/dist/cli/serve.d.ts +10 -0
  20. package/dist/cli/serve.js +114 -0
  21. package/dist/cli/serve.js.map +1 -0
  22. package/dist/client/index.d.ts +2 -1
  23. package/dist/client/index.js.map +1 -1
  24. package/dist/client/runner.js +3 -0
  25. package/dist/client/runner.js.map +1 -1
  26. package/dist/client/typed.d.ts +3 -1
  27. package/dist/client/typed.js +39 -3
  28. package/dist/client/typed.js.map +1 -1
  29. package/dist/client/types.d.ts +31 -2
  30. package/dist/client/types.js.map +1 -1
  31. package/dist/config.d.ts +17 -0
  32. package/dist/config.js +36 -1
  33. package/dist/config.js.map +1 -1
  34. package/dist/content.d.ts +65 -0
  35. package/dist/content.js +99 -0
  36. package/dist/content.js.map +1 -0
  37. package/dist/index.d.ts +3 -1
  38. package/dist/index.js +1 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/invoke.d.ts +4 -0
  41. package/dist/invoke.js +12 -5
  42. package/dist/invoke.js.map +1 -1
  43. package/dist/manifest.d.ts +6 -1
  44. package/dist/manifest.js.map +1 -1
  45. package/dist/mcp/constants.d.ts +2 -0
  46. package/dist/mcp/constants.js +2 -0
  47. package/dist/mcp/constants.js.map +1 -1
  48. package/dist/mcp/dispatch.d.ts +9 -3
  49. package/dist/mcp/dispatch.js +10 -4
  50. package/dist/mcp/dispatch.js.map +1 -1
  51. package/dist/mcp/host.d.ts +14 -0
  52. package/dist/mcp/host.js +48 -0
  53. package/dist/mcp/host.js.map +1 -0
  54. package/dist/mcp/http.d.ts +22 -5
  55. package/dist/mcp/http.js +154 -19
  56. package/dist/mcp/http.js.map +1 -1
  57. package/dist/mcp/index.d.ts +1 -0
  58. package/dist/mcp/index.js +1 -0
  59. package/dist/mcp/index.js.map +1 -1
  60. package/dist/mcp/tasks.js +1 -1
  61. package/dist/mcp/tasks.js.map +1 -1
  62. package/dist/remote/client.d.ts +24 -1
  63. package/dist/remote/client.js +177 -53
  64. package/dist/remote/client.js.map +1 -1
  65. package/dist/remote/index.d.ts +1 -1
  66. package/dist/remote/index.js.map +1 -1
  67. package/dist/route.d.ts +40 -2
  68. package/dist/route.js +128 -8
  69. package/dist/route.js.map +1 -1
  70. package/dist/start.js +3 -2
  71. package/dist/start.js.map +1 -1
  72. package/dist/version-constant.d.ts +1 -1
  73. package/dist/version-constant.js +1 -1
  74. package/dist/version-constant.js.map +1 -1
  75. package/package.json +1 -1
package/dist/build.js CHANGED
@@ -19,7 +19,8 @@ import { buildManifest, manifestHash, MANIFEST_SCHEMA_VERSION } from "./manifest
19
19
  import { collectPrompts, collectPromptSet, describePrompt } from "./prompt.js";
20
20
  import { collectRegistry } from "./registry.js";
21
21
  import { collectResources, collectResourceSet, describeResource, resourceEntries } from "./resource.js";
22
- import { collectRoutes } from "./route.js";
22
+ import { MAX_BODY_BYTES } from "./mcp/constants.js";
23
+ import { collectRoutes, resolveRouteOptions } from "./route.js";
23
24
  import { collectCommands } from "./scan.js";
24
25
  import { resolveTypesPath, writeTypes } from "./typegen.js";
25
26
  import { mextVersion } from "./version.js";
@@ -209,7 +210,20 @@ export async function buildProject(options = {}) {
209
210
  ...(routes.routes.length > 0
210
211
  ? {
211
212
  routes: routes.routes
212
- .map((r) => ({ path: r.path, file: r.file, methods: r.methods, module: `${routeModuleName(r.file)}.js` }))
213
+ .map((r) => {
214
+ // 적용 값 (§12.4 표시). true = server.maxBodyBytes 값
215
+ const applied = resolveRouteOptions(r.module, config.routes);
216
+ const max = applied.maxBodyBytes ?? false;
217
+ return {
218
+ path: r.path,
219
+ file: r.file,
220
+ methods: r.methods,
221
+ module: `${routeModuleName(r.file)}.js`,
222
+ auth: applied.auth ?? false,
223
+ origin: applied.origin ?? false,
224
+ maxBodyBytes: max === true ? (config.server?.maxBodyBytes ?? MAX_BODY_BYTES) : max,
225
+ };
226
+ })
213
227
  .sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0)),
214
228
  }
215
229
  : {}),
package/dist/build.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\"\nimport { chmodSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\"\nimport { isBuiltin } from \"node:module\"\nimport { basename, isAbsolute, join, relative, resolve, sep } from \"node:path\"\nimport { buildCustomerCli, CLI_DIR, customerCliIssues, projectVersion, type CustomerCliBuild } from \"./build-cli.ts\"\nimport { cliBuildIssues } from \"./cli/args.ts\"\nimport { CONFIG_FILE, loadConfig, resolveCommandsDir, resolvePromptsDir, resolveResourcesDir, resolveRoutesDir } from \"./config.ts\"\nimport { MextBuildError } from \"./errors.ts\"\nimport { exposedRegistry } from \"./expose.ts\"\nimport { buildManifest, manifestHash, MANIFEST_SCHEMA_VERSION, type BuildManifest } from \"./manifest.ts\"\nimport { collectPrompts, collectPromptSet, describePrompt } from \"./prompt.ts\"\nimport { collectRegistry } from \"./registry.ts\"\nimport { collectResources, collectResourceSet, describeResource, resourceEntries } from \"./resource.ts\"\nimport { collectRoutes } from \"./route.ts\"\nimport { collectCommands } from \"./scan.ts\"\nimport { resolveTypesPath, writeTypes } from \"./typegen.ts\"\nimport { mextVersion } from \"./version.ts\"\n\n/** mext build 산출 폴더 (도입 프로젝트 루트 기준) */\nexport const BUILD_DIR = \".mext\"\nexport const BUILD_MANIFEST_FILE = \"manifest.json\"\nexport const INSTRUMENTATION_FILE = \"instrumentation.ts\"\n/** 생성 파일 (server.js · handler.js) 이 import 하는 런타임 엔트리 */\nexport const START_ENTRY = \"@obov/mext/start\"\n/** 로컬 bin (cli.local) 실행 파일 · cli.errors 번들 */\nexport const LOCAL_BIN_FILE = \"bin.js\"\nexport const LOCAL_BIN_ERRORS = \"cli-errors\"\n/** 빌드가 지우지 않는 .mext/ 하위 (mext dev 산출 · 잠금) */\nconst PRESERVED_ENTRIES = new Set([\"dev\"])\n\n/** rolldown 모듈 중 mext build 가 쓰는 부분 */\nexport interface RolldownModule {\n build(options: Record<string, unknown>): Promise<{ output: readonly RolldownOutputItem[] }>\n}\n\nexport interface RolldownOutputItem {\n type: \"chunk\" | \"asset\"\n fileName: string\n /** chunk 코드 */\n code?: string\n isEntry?: boolean\n name?: string\n}\n\nexport interface BuildOptions {\n /** 도입 프로젝트 루트 (mext.config.ts · package.json · instrumentation.ts 위치). 기본 process.cwd() */\n cwd?: string\n /** 산출 폴더. 기본 <cwd>/.mext. 기존 내용은 dev/ 외 삭제 */\n outDir?: string\n /** rolldown 로더 (테스트 주입). 기본 import(\"rolldown\") (선택 peer dependency) */\n importRolldown?: () => Promise<RolldownModule>\n}\n\nexport interface BuildWarning {\n /**\n * UNDECLARED_DEPENDENCY = 외부로 남긴 패키지가 package.json dependencies · peerDependencies · optionalDependencies 에 없음.\n * LOCAL_BIN_UNDECLARED = cli.local 인데 package.json bin[\"<bin>\"] 이 .mext/bin.js 가 아님\n */\n code: \"UNDECLARED_DEPENDENCY\" | \"BUNDLER_WARNING\" | \"LOCAL_BIN_UNDECLARED\"\n message: string\n}\n\nexport interface BuildResult {\n /** 산출 폴더 절대 경로 */\n outDir: string\n manifest: BuildManifest\n /** outDir 기준 생성 파일 (posix, 정렬) */\n files: string[]\n warnings: BuildWarning[]\n /** 고객 CLI (.mext/cli/). config.cli 가 있고 local 이 아닐 때 */\n cli?: CustomerCliBuild\n /** 로컬 bin (.mext/bin.js). config.cli.local 일 때 */\n localBin?: { bin: string; version: string }\n /** 명령어 타입 생성 파일 (config.types 가 있을 때, specs/client.md §4). 절대 경로 */\n types?: string\n}\n\n/** rolldown 을 찾을 수 없음. message 에 설치 명령 */\nexport class RolldownUnavailableError extends Error {\n readonly installCommand: string\n\n constructor(installCommand: string, cause?: unknown) {\n super(`mext build requires rolldown (optional peer dependency of @obov/mext). Install it: ${installCommand}`, { cause })\n this.name = \"RolldownUnavailableError\"\n this.installCommand = installCommand\n }\n}\n\n/**\n * mext build: commands/ → .mext/ (§10).\n * 1. rolldown 확인 (없으면 RolldownUnavailableError)\n * 2. 검증: 파일 규칙 · import · Registry (ID · 별칭 · 스키마) · CLI 변환 issue 를 모두 모아 MextBuildError 한 번\n * 3. rolldown 다중 엔트리 번들: commands/**\\/*.js (명령어별) · config.js · instrumentation.js · chunks/. 패키지 import 는 외부\n * 4. server.js · handler.js (얇은 생성 파일, 런타임 = @obov/mext/start) · package.json (type module) · manifest.json (마지막)\n */\nexport async function buildProject(options: BuildOptions = {}): Promise<BuildResult> {\n const cwd = resolve(options.cwd ?? process.cwd())\n const outDir = resolve(cwd, options.outDir ?? BUILD_DIR)\n // 빌드 전 outDir 을 비우므로 프로젝트 폴더 자체 · 상위는 거부\n const up = relative(outDir, cwd)\n if (up === \"\" || (!up.startsWith(\"..\") && !isAbsolute(up))) {\n throw new Error(`mext build: outDir must not be the project directory or its parent (${outDir})`)\n }\n const rolldown = await (options.importRolldown ?? importRolldown)().catch((error: unknown) => {\n if (isModuleNotFound(error, \"rolldown\")) throw new RolldownUnavailableError(installCommand(cwd), error)\n throw error\n })\n\n const config = await loadConfig(cwd)\n const commandsDir = resolveCommandsDir(cwd, config)\n const scanned = await collectCommands(commandsDir)\n const { registry, issues: registryIssues } = collectRegistry(scanned)\n const routesDir = resolveRoutesDir(cwd, config)\n const routes = await collectRoutes(routesDir)\n const resourcesDir = resolveResourcesDir(cwd, config)\n const scannedResources = await collectResources(resourcesDir)\n const { resources, issues: resourceIssues } = collectResourceSet(scannedResources.inputs, basename(resourcesDir))\n const promptsDir = resolvePromptsDir(cwd, config)\n const scannedPrompts = await collectPrompts(promptsDir)\n const { prompts, issues: promptIssues } = collectPromptSet(scannedPrompts.inputs, basename(promptsDir))\n const issues = [\n ...scanned.issues,\n ...registryIssues,\n ...cliBuildIssues(registry),\n ...customerCliIssues(config.cli, registry),\n ...scannedResources.issues,\n ...resourceIssues,\n ...scannedPrompts.issues,\n ...promptIssues,\n ...routes.issues,\n ]\n if (issues.length > 0) throw new MextBuildError(issues)\n\n // 엔트리 이름 = 출력 경로 (확장자 제외). 명령어 = commands/ 아래 소스 경로 그대로\n const input: Record<string, string> = {}\n const moduleOf = new Map<string, string>()\n for (const entry of registry.commands.values()) {\n const file = entry.file!\n const name = `commands/${file.replace(/\\.ts$/, \"\")}`\n input[name] = join(commandsDir, file)\n moduleOf.set(entry.id, `${name}.js`)\n }\n // 자원 = resources/ 아래 소스 경로 그대로 (§12.3)\n const resourceList = resourceEntries(resources).sort((a, b) => (a.uri < b.uri ? -1 : a.uri > b.uri ? 1 : 0))\n const resourceModuleOf = new Map<string, string>()\n for (const entry of resourceList) {\n const name = `resources/${entry.file!.replace(/\\.ts$/, \"\")}`\n input[name] = join(resourcesDir, entry.file!)\n resourceModuleOf.set(entry.uri, `${name}.js`)\n }\n // 프롬프트 = prompts/ 아래 소스 경로 그대로 (§12.3)\n const promptList = [...prompts.values()]\n const promptModuleOf = new Map<string, string>()\n for (const entry of promptList) {\n const name = `prompts/${entry.file!.replace(/\\.ts$/, \"\")}`\n input[name] = join(promptsDir, entry.file!)\n promptModuleOf.set(entry.name, `${name}.js`)\n }\n for (const route of routes.routes) input[routeModuleName(route.file)] = join(routesDir, route.file)\n const hasConfig = existsSync(join(cwd, CONFIG_FILE))\n if (hasConfig) input.config = join(cwd, CONFIG_FILE)\n const hasInstrumentation = existsSync(join(cwd, INSTRUMENTATION_FILE))\n if (hasInstrumentation) input.instrumentation = join(cwd, INSTRUMENTATION_FILE)\n const local = config.cli?.local === true ? config.cli : undefined\n if (local?.errors !== undefined) {\n const errorsFile = resolve(cwd, local.errors)\n if (!existsSync(errorsFile)) throw new MextBuildError([{ code: \"INVALID_CONFIG\", message: `cli.errors file not found: ${local.errors}` }])\n input[LOCAL_BIN_ERRORS] = errorsFile\n }\n\n cleanOutDir(outDir)\n\n const warnings: BuildWarning[] = []\n /** 외부 패키지 이름 → 처음 import 한 파일 */\n const externals = new Map<string, string | undefined>()\n let output: readonly RolldownOutputItem[]\n try {\n ;({ output } = await rolldown.build({\n cwd,\n input,\n platform: \"node\",\n // 상대 · 절대 경로 · # (package.json imports) = 번들. 그 외 bare import = 외부 (도입 프로젝트 node_modules 에서 해석)\n external: (id: string, importer: string | undefined): boolean => {\n if (id.startsWith(\".\") || id.startsWith(\"#\") || id.startsWith(\"\\0\") || isAbsolute(id)) return false\n if (id.startsWith(\"node:\") || isBuiltin(id)) return true\n const pkg = packageName(id)\n if (!externals.has(pkg) && importer !== undefined && !importer.startsWith(\"\\0\")) externals.set(pkg, importer)\n return true\n },\n transform: { target: \"node22\" },\n logLevel: \"warn\",\n onLog: (_level: string, log: { message: string }) => warnings.push({ code: \"BUNDLER_WARNING\", message: log.message }),\n output: {\n dir: outDir,\n format: \"esm\",\n entryFileNames: \"[name].js\",\n chunkFileNames: \"chunks/[name]-[hash].js\",\n sourcemap: true,\n },\n }))\n } catch (error) {\n throw new MextBuildError([{ code: \"BUNDLE_FAILED\", message: error instanceof Error ? error.message : String(error) }])\n }\n\n const declared = declaredDependencies(cwd)\n for (const [pkg, importer] of externals) {\n if (declared.has(pkg)) continue\n const from = importer === undefined ? \"\" : ` (imported by ${toPosix(relative(cwd, importer))})`\n warnings.push({\n code: \"UNDECLARED_DEPENDENCY\",\n message: `\"${pkg}\" is not in package.json dependencies${from}. It stays external and must be installed where .mext/ runs`,\n })\n }\n\n const emitted = new Set(output.map((o) => o.fileName))\n for (const name of Object.keys(input)) {\n if (!emitted.has(`${name}.js`)) throw new Error(`mext build: rolldown did not emit ${name}.js`)\n }\n\n const base = buildManifest(registry)\n const hash = manifestHash(base.commands, {\n resources: resourceList.map((r) => r.uri),\n prompts: promptList.map((p) => ({ name: p.name, argsSchema: p.argsSchema })),\n })\n const version = mextVersion()\n const manifest: BuildManifest = {\n schemaVersion: MANIFEST_SCHEMA_VERSION,\n mextVersion: version,\n buildId: buildIdOf(version, hash, output),\n manifestHash: hash,\n tools: config.tools ?? \"execute\",\n ...(hasConfig ? { config: \"config.js\" } : {}),\n ...(hasInstrumentation ? { instrumentation: \"instrumentation.js\" } : {}),\n ...(base.description !== undefined ? { description: base.description } : {}),\n namespaces: base.namespaces,\n commands: base.commands.map((c) => {\n const expose = registry.commands.get(c.id)?.command.expose\n return { ...c, module: moduleOf.get(c.id)!, ...(expose ? { expose: { ...expose } as Record<string, boolean> } : {}) }\n }),\n ...(resourceList.length > 0\n ? { resources: resourceList.map((r) => ({ ...describeResource(r), module: resourceModuleOf.get(r.uri)! })) }\n : {}),\n ...(promptList.length > 0\n ? { prompts: promptList.map((p) => ({ ...describePrompt(p), module: promptModuleOf.get(p.name)! })) }\n : {}),\n ...(routes.routes.length > 0\n ? {\n routes: routes.routes\n .map((r) => ({ path: r.path, file: r.file, methods: r.methods, module: `${routeModuleName(r.file)}.js` }))\n .sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0)),\n }\n : {}),\n }\n\n const generated: Record<string, string> = {\n \"package.json\": `${JSON.stringify({ type: \"module\" }, null, 2)}\\n`,\n \"server.js\": SERVER_JS,\n \"handler.js\": HANDLER_JS,\n }\n const localBin = local ? { bin: local.bin, version: local.version ?? projectVersion(cwd) ?? \"0.0.0\" } : undefined\n if (localBin) {\n generated[LOCAL_BIN_FILE] = localBinJs({ ...localBin, ...(local?.errors !== undefined ? { errors: `${LOCAL_BIN_ERRORS}.js` } : {}) })\n const declaredBin = packageBin(cwd, localBin.bin)\n const expected = `${toPosix(relative(cwd, outDir))}/${LOCAL_BIN_FILE}`\n if (declaredBin === undefined || declaredBin.replace(/^\\.\\//, \"\") !== expected) {\n warnings.push({\n code: \"LOCAL_BIN_UNDECLARED\",\n message: `cli.local: add \"bin\": { \"${localBin.bin}\": \"${expected}\" } to package.json (and include ${toPosix(relative(cwd, outDir))} in \"files\")`,\n })\n }\n }\n for (const [file, content] of Object.entries(generated)) writeFileSync(join(outDir, file), content)\n if (localBin) chmodSync(join(outDir, LOCAL_BIN_FILE), 0o755)\n\n // 고객 CLI (.mext/cli/, §5): manifest · buildId 확정 후, manifest.json 쓰기 전. 로컬 bin 이면 만들지 않는다\n // 고객 CLI = 원격 실행의 기본 표면 (mcp) 에서 보이는 명령어 · 그 manifestHash (§4 expose). 숨긴 명령어가 없으면 manifest 그대로\n const mcpView = exposedRegistry(registry, \"mcp\")\n const cliManifest: BuildManifest =\n mcpView === registry\n ? manifest\n : {\n ...manifest,\n namespaces: buildManifest(mcpView).namespaces,\n commands: manifest.commands.filter((c) => mcpView.commands.has(c.id)),\n manifestHash: manifestHash(\n base.commands.filter((c) => mcpView.commands.has(c.id)),\n { resources: resourceList.map((r) => r.uri), prompts: promptList.map((p) => ({ name: p.name, argsSchema: p.argsSchema })) },\n ),\n }\n const cli = config.cli && !local ? await buildCustomerCli({ rolldown, cwd, outDir, cli: config.cli, manifest: cliManifest }) : undefined\n\n // manifest.json 은 마지막: 중간 실패한 빌드는 manifest 가 없어 mext start 가 \"mext build 먼저\" 로 거부\n writeFileSync(join(outDir, BUILD_MANIFEST_FILE), `${JSON.stringify(manifest, null, 2)}\\n`)\n\n // 명령어 타입 (specs/client.md §4): config.types 가 있을 때만. 산출 폴더 밖 (프로젝트 소스 옆) 에 쓴다\n const typesPath = resolveTypesPath(cwd, config.types)\n if (typesPath !== undefined) writeTypes(commandsDir, typesPath)\n\n const files = [\n ...emitted,\n ...Object.keys(generated),\n BUILD_MANIFEST_FILE,\n ...(cli?.files.map((f) => `${CLI_DIR}/${f}`) ?? []),\n ].sort()\n return {\n outDir,\n manifest,\n files,\n warnings,\n ...(cli ? { cli } : {}),\n ...(localBin ? { localBin } : {}),\n ...(typesPath !== undefined ? { types: typesPath } : {}),\n }\n}\n\n/**\n * .mext/bin.js (로컬 bin, cli.local). 계약: mainLocalBin(.mext 폴더 URL, { bin, version, errors? }).\n * 도입 프로젝트 package.json bin 이 이 파일을 가리킨다 (npm 이 symlink 해도 import.meta.url = 실제 경로)\n */\nexport function localBinJs(options: { bin: string; version: string; errors?: string }): string {\n return `#!/usr/bin/env node\n// Generated by mext build. Do not edit.\n// Local bin (cli.local): ${options.bin} help · ${options.bin} <namespace> <command> · ${options.bin} mcp serve\nimport { mainLocalBin } from \"${START_ENTRY}\"\n\nawait mainLocalBin(new URL(\".\", import.meta.url), ${JSON.stringify(options)})\n`\n}\n\n/** package.json bin[name] (문자열 bin = 패키지 이름이 name 일 때) */\nfunction packageBin(cwd: string, name: string): string | undefined {\n try {\n const pkg = JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf8\")) as { name?: unknown; bin?: unknown }\n if (typeof pkg.bin === \"string\") return pkg.name === name ? pkg.bin : undefined\n if (typeof pkg.bin === \"object\" && pkg.bin !== null) {\n const v = (pkg.bin as Record<string, unknown>)[name]\n return typeof v === \"string\" ? v : undefined\n }\n } catch {\n // package.json 없음 · 형식 오류 = 미선언\n }\n return undefined\n}\n\n/**\n * .mext/server.js. 계약: startFromBuild(.mext 폴더 URL, { argv, env }) → exit code.\n * argv = server.js 뒤 인자 (--stdio), env = PORT · HOST\n */\nexport const SERVER_JS = `// Generated by mext build. Do not edit.\n// node .mext/server.js [--stdio] (= mext start). Environment: PORT · HOST\nimport { startFromBuild } from \"${START_ENTRY}\"\n\nprocess.exitCode = await startFromBuild(new URL(\".\", import.meta.url), { argv: process.argv.slice(2), env: process.env })\n`\n\n/** .mext/handler.js. 계약: createFetchHandler(.mext 폴더 URL) → { fetch(request: Request): Promise<Response> } (동기 반환) */\nexport const HANDLER_JS = `// Generated by mext build. Do not edit.\n// Web fetch handler (Request → Response) for other runtimes and platforms\nimport { createFetchHandler } from \"${START_ENTRY}\"\n\nexport default createFetchHandler(new URL(\".\", import.meta.url))\n`\n\nasync function importRolldown(): Promise<RolldownModule> {\n // 문자열 변수: 타입 검사 · 번들러가 선택 peer 를 정적 의존으로 취급하지 않게\n const specifier = \"rolldown\"\n return (await import(specifier)) as RolldownModule\n}\n\nfunction isModuleNotFound(error: unknown, pkg: string): boolean {\n const e = error as { code?: unknown; message?: unknown } | null\n if (typeof e !== \"object\" || e === null) return false\n if (e.code !== \"ERR_MODULE_NOT_FOUND\" && e.code !== \"MODULE_NOT_FOUND\") return false\n return typeof e.message !== \"string\" || e.message.includes(`'${pkg}'`) || e.message.includes(`\"${pkg}\"`)\n}\n\n/** 도입 프로젝트의 lock 파일로 패키지 관리자 추정 */\nfunction installCommand(cwd: string): string {\n for (let dir = cwd; ; dir = resolve(dir, \"..\")) {\n if (existsSync(join(dir, \"pnpm-lock.yaml\"))) return \"pnpm add -D rolldown\"\n if (existsSync(join(dir, \"yarn.lock\"))) return \"yarn add -D rolldown\"\n if (existsSync(join(dir, \"bun.lock\")) || existsSync(join(dir, \"bun.lockb\"))) return \"bun add -d rolldown\"\n if (existsSync(join(dir, \"package-lock.json\")) || resolve(dir, \"..\") === dir) return \"npm install --save-dev rolldown\"\n }\n}\n\nfunction cleanOutDir(outDir: string): void {\n mkdirSync(outDir, { recursive: true })\n for (const name of readdirSync(outDir)) {\n if (!PRESERVED_ENTRIES.has(name)) rmSync(join(outDir, name), { recursive: true, force: true })\n }\n}\n\n/**\n * route 엔트리 이름 = routes/ 아래 소스 경로, [name] → _name_ (rolldown 이 [ ] 를 바꾸므로 직접 정한다).\n * `_` 접두 파일 · 폴더는 route 가 아니라 충돌 없음. routes/items/[id].ts → routes/items/_id_\n */\nfunction routeModuleName(file: string): string {\n return `routes/${file.replace(/\\.ts$/, \"\").replace(/\\[([^\\]/]+)\\]/g, \"_$1_\")}`\n}\n\n/** \"@scope/pkg/sub\" → \"@scope/pkg\" · \"pkg/sub\" → \"pkg\" */\nfunction packageName(specifier: string): string {\n const parts = specifier.split(\"/\")\n return specifier.startsWith(\"@\") ? parts.slice(0, 2).join(\"/\") : parts[0]!\n}\n\nfunction declaredDependencies(cwd: string): Set<string> {\n let pkg: Record<string, unknown>\n try {\n pkg = JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf8\")) as Record<string, unknown>\n } catch {\n return new Set()\n }\n const names = new Set<string>()\n if (typeof pkg.name === \"string\") names.add(pkg.name)\n for (const field of [\"dependencies\", \"peerDependencies\", \"optionalDependencies\"]) {\n const deps = pkg[field]\n if (typeof deps === \"object\" && deps !== null) for (const name of Object.keys(deps)) names.add(name)\n }\n return names\n}\n\n/** D3: mextVersion · manifestHash · 번들 chunk (파일 이름 · 코드) 의 sha256 앞 16자. 같은 입력 = 같은 buildId */\nfunction buildIdOf(version: string, hash: string, output: readonly RolldownOutputItem[]): string {\n const h = createHash(\"sha256\").update(`${version}\\n${hash}\\n`)\n for (const item of [...output].sort((a, b) => (a.fileName < b.fileName ? -1 : 1))) {\n if (item.type !== \"chunk\") continue\n h.update(`${item.fileName}\\0${item.code ?? \"\"}\\0`)\n }\n return h.digest(\"hex\").slice(0, 16)\n}\n\nfunction toPosix(path: string): string {\n return path.split(sep).join(\"/\")\n}\n"]}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\"\nimport { chmodSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\"\nimport { isBuiltin } from \"node:module\"\nimport { basename, isAbsolute, join, relative, resolve, sep } from \"node:path\"\nimport { buildCustomerCli, CLI_DIR, customerCliIssues, projectVersion, type CustomerCliBuild } from \"./build-cli.ts\"\nimport { cliBuildIssues } from \"./cli/args.ts\"\nimport { CONFIG_FILE, loadConfig, resolveCommandsDir, resolvePromptsDir, resolveResourcesDir, resolveRoutesDir } from \"./config.ts\"\nimport { MextBuildError } from \"./errors.ts\"\nimport { exposedRegistry } from \"./expose.ts\"\nimport { buildManifest, manifestHash, MANIFEST_SCHEMA_VERSION, type BuildManifest } from \"./manifest.ts\"\nimport { collectPrompts, collectPromptSet, describePrompt } from \"./prompt.ts\"\nimport { collectRegistry } from \"./registry.ts\"\nimport { collectResources, collectResourceSet, describeResource, resourceEntries } from \"./resource.ts\"\nimport { MAX_BODY_BYTES } from \"./mcp/constants.ts\"\nimport { collectRoutes, resolveRouteOptions } from \"./route.ts\"\nimport { collectCommands } from \"./scan.ts\"\nimport { resolveTypesPath, writeTypes } from \"./typegen.ts\"\nimport { mextVersion } from \"./version.ts\"\n\n/** mext build 산출 폴더 (도입 프로젝트 루트 기준) */\nexport const BUILD_DIR = \".mext\"\nexport const BUILD_MANIFEST_FILE = \"manifest.json\"\nexport const INSTRUMENTATION_FILE = \"instrumentation.ts\"\n/** 생성 파일 (server.js · handler.js) 이 import 하는 런타임 엔트리 */\nexport const START_ENTRY = \"@obov/mext/start\"\n/** 로컬 bin (cli.local) 실행 파일 · cli.errors 번들 */\nexport const LOCAL_BIN_FILE = \"bin.js\"\nexport const LOCAL_BIN_ERRORS = \"cli-errors\"\n/** 빌드가 지우지 않는 .mext/ 하위 (mext dev 산출 · 잠금) */\nconst PRESERVED_ENTRIES = new Set([\"dev\"])\n\n/** rolldown 모듈 중 mext build 가 쓰는 부분 */\nexport interface RolldownModule {\n build(options: Record<string, unknown>): Promise<{ output: readonly RolldownOutputItem[] }>\n}\n\nexport interface RolldownOutputItem {\n type: \"chunk\" | \"asset\"\n fileName: string\n /** chunk 코드 */\n code?: string\n isEntry?: boolean\n name?: string\n}\n\nexport interface BuildOptions {\n /** 도입 프로젝트 루트 (mext.config.ts · package.json · instrumentation.ts 위치). 기본 process.cwd() */\n cwd?: string\n /** 산출 폴더. 기본 <cwd>/.mext. 기존 내용은 dev/ 외 삭제 */\n outDir?: string\n /** rolldown 로더 (테스트 주입). 기본 import(\"rolldown\") (선택 peer dependency) */\n importRolldown?: () => Promise<RolldownModule>\n}\n\nexport interface BuildWarning {\n /**\n * UNDECLARED_DEPENDENCY = 외부로 남긴 패키지가 package.json dependencies · peerDependencies · optionalDependencies 에 없음.\n * LOCAL_BIN_UNDECLARED = cli.local 인데 package.json bin[\"<bin>\"] 이 .mext/bin.js 가 아님\n */\n code: \"UNDECLARED_DEPENDENCY\" | \"BUNDLER_WARNING\" | \"LOCAL_BIN_UNDECLARED\"\n message: string\n}\n\nexport interface BuildResult {\n /** 산출 폴더 절대 경로 */\n outDir: string\n manifest: BuildManifest\n /** outDir 기준 생성 파일 (posix, 정렬) */\n files: string[]\n warnings: BuildWarning[]\n /** 고객 CLI (.mext/cli/). config.cli 가 있고 local 이 아닐 때 */\n cli?: CustomerCliBuild\n /** 로컬 bin (.mext/bin.js). config.cli.local 일 때 */\n localBin?: { bin: string; version: string }\n /** 명령어 타입 생성 파일 (config.types 가 있을 때, specs/client.md §4). 절대 경로 */\n types?: string\n}\n\n/** rolldown 을 찾을 수 없음. message 에 설치 명령 */\nexport class RolldownUnavailableError extends Error {\n readonly installCommand: string\n\n constructor(installCommand: string, cause?: unknown) {\n super(`mext build requires rolldown (optional peer dependency of @obov/mext). Install it: ${installCommand}`, { cause })\n this.name = \"RolldownUnavailableError\"\n this.installCommand = installCommand\n }\n}\n\n/**\n * mext build: commands/ → .mext/ (§10).\n * 1. rolldown 확인 (없으면 RolldownUnavailableError)\n * 2. 검증: 파일 규칙 · import · Registry (ID · 별칭 · 스키마) · CLI 변환 issue 를 모두 모아 MextBuildError 한 번\n * 3. rolldown 다중 엔트리 번들: commands/**\\/*.js (명령어별) · config.js · instrumentation.js · chunks/. 패키지 import 는 외부\n * 4. server.js · handler.js (얇은 생성 파일, 런타임 = @obov/mext/start) · package.json (type module) · manifest.json (마지막)\n */\nexport async function buildProject(options: BuildOptions = {}): Promise<BuildResult> {\n const cwd = resolve(options.cwd ?? process.cwd())\n const outDir = resolve(cwd, options.outDir ?? BUILD_DIR)\n // 빌드 전 outDir 을 비우므로 프로젝트 폴더 자체 · 상위는 거부\n const up = relative(outDir, cwd)\n if (up === \"\" || (!up.startsWith(\"..\") && !isAbsolute(up))) {\n throw new Error(`mext build: outDir must not be the project directory or its parent (${outDir})`)\n }\n const rolldown = await (options.importRolldown ?? importRolldown)().catch((error: unknown) => {\n if (isModuleNotFound(error, \"rolldown\")) throw new RolldownUnavailableError(installCommand(cwd), error)\n throw error\n })\n\n const config = await loadConfig(cwd)\n const commandsDir = resolveCommandsDir(cwd, config)\n const scanned = await collectCommands(commandsDir)\n const { registry, issues: registryIssues } = collectRegistry(scanned)\n const routesDir = resolveRoutesDir(cwd, config)\n const routes = await collectRoutes(routesDir)\n const resourcesDir = resolveResourcesDir(cwd, config)\n const scannedResources = await collectResources(resourcesDir)\n const { resources, issues: resourceIssues } = collectResourceSet(scannedResources.inputs, basename(resourcesDir))\n const promptsDir = resolvePromptsDir(cwd, config)\n const scannedPrompts = await collectPrompts(promptsDir)\n const { prompts, issues: promptIssues } = collectPromptSet(scannedPrompts.inputs, basename(promptsDir))\n const issues = [\n ...scanned.issues,\n ...registryIssues,\n ...cliBuildIssues(registry),\n ...customerCliIssues(config.cli, registry),\n ...scannedResources.issues,\n ...resourceIssues,\n ...scannedPrompts.issues,\n ...promptIssues,\n ...routes.issues,\n ]\n if (issues.length > 0) throw new MextBuildError(issues)\n\n // 엔트리 이름 = 출력 경로 (확장자 제외). 명령어 = commands/ 아래 소스 경로 그대로\n const input: Record<string, string> = {}\n const moduleOf = new Map<string, string>()\n for (const entry of registry.commands.values()) {\n const file = entry.file!\n const name = `commands/${file.replace(/\\.ts$/, \"\")}`\n input[name] = join(commandsDir, file)\n moduleOf.set(entry.id, `${name}.js`)\n }\n // 자원 = resources/ 아래 소스 경로 그대로 (§12.3)\n const resourceList = resourceEntries(resources).sort((a, b) => (a.uri < b.uri ? -1 : a.uri > b.uri ? 1 : 0))\n const resourceModuleOf = new Map<string, string>()\n for (const entry of resourceList) {\n const name = `resources/${entry.file!.replace(/\\.ts$/, \"\")}`\n input[name] = join(resourcesDir, entry.file!)\n resourceModuleOf.set(entry.uri, `${name}.js`)\n }\n // 프롬프트 = prompts/ 아래 소스 경로 그대로 (§12.3)\n const promptList = [...prompts.values()]\n const promptModuleOf = new Map<string, string>()\n for (const entry of promptList) {\n const name = `prompts/${entry.file!.replace(/\\.ts$/, \"\")}`\n input[name] = join(promptsDir, entry.file!)\n promptModuleOf.set(entry.name, `${name}.js`)\n }\n for (const route of routes.routes) input[routeModuleName(route.file)] = join(routesDir, route.file)\n const hasConfig = existsSync(join(cwd, CONFIG_FILE))\n if (hasConfig) input.config = join(cwd, CONFIG_FILE)\n const hasInstrumentation = existsSync(join(cwd, INSTRUMENTATION_FILE))\n if (hasInstrumentation) input.instrumentation = join(cwd, INSTRUMENTATION_FILE)\n const local = config.cli?.local === true ? config.cli : undefined\n if (local?.errors !== undefined) {\n const errorsFile = resolve(cwd, local.errors)\n if (!existsSync(errorsFile)) throw new MextBuildError([{ code: \"INVALID_CONFIG\", message: `cli.errors file not found: ${local.errors}` }])\n input[LOCAL_BIN_ERRORS] = errorsFile\n }\n\n cleanOutDir(outDir)\n\n const warnings: BuildWarning[] = []\n /** 외부 패키지 이름 → 처음 import 한 파일 */\n const externals = new Map<string, string | undefined>()\n let output: readonly RolldownOutputItem[]\n try {\n ;({ output } = await rolldown.build({\n cwd,\n input,\n platform: \"node\",\n // 상대 · 절대 경로 · # (package.json imports) = 번들. 그 외 bare import = 외부 (도입 프로젝트 node_modules 에서 해석)\n external: (id: string, importer: string | undefined): boolean => {\n if (id.startsWith(\".\") || id.startsWith(\"#\") || id.startsWith(\"\\0\") || isAbsolute(id)) return false\n if (id.startsWith(\"node:\") || isBuiltin(id)) return true\n const pkg = packageName(id)\n if (!externals.has(pkg) && importer !== undefined && !importer.startsWith(\"\\0\")) externals.set(pkg, importer)\n return true\n },\n transform: { target: \"node22\" },\n logLevel: \"warn\",\n onLog: (_level: string, log: { message: string }) => warnings.push({ code: \"BUNDLER_WARNING\", message: log.message }),\n output: {\n dir: outDir,\n format: \"esm\",\n entryFileNames: \"[name].js\",\n chunkFileNames: \"chunks/[name]-[hash].js\",\n sourcemap: true,\n },\n }))\n } catch (error) {\n throw new MextBuildError([{ code: \"BUNDLE_FAILED\", message: error instanceof Error ? error.message : String(error) }])\n }\n\n const declared = declaredDependencies(cwd)\n for (const [pkg, importer] of externals) {\n if (declared.has(pkg)) continue\n const from = importer === undefined ? \"\" : ` (imported by ${toPosix(relative(cwd, importer))})`\n warnings.push({\n code: \"UNDECLARED_DEPENDENCY\",\n message: `\"${pkg}\" is not in package.json dependencies${from}. It stays external and must be installed where .mext/ runs`,\n })\n }\n\n const emitted = new Set(output.map((o) => o.fileName))\n for (const name of Object.keys(input)) {\n if (!emitted.has(`${name}.js`)) throw new Error(`mext build: rolldown did not emit ${name}.js`)\n }\n\n const base = buildManifest(registry)\n const hash = manifestHash(base.commands, {\n resources: resourceList.map((r) => r.uri),\n prompts: promptList.map((p) => ({ name: p.name, argsSchema: p.argsSchema })),\n })\n const version = mextVersion()\n const manifest: BuildManifest = {\n schemaVersion: MANIFEST_SCHEMA_VERSION,\n mextVersion: version,\n buildId: buildIdOf(version, hash, output),\n manifestHash: hash,\n tools: config.tools ?? \"execute\",\n ...(hasConfig ? { config: \"config.js\" } : {}),\n ...(hasInstrumentation ? { instrumentation: \"instrumentation.js\" } : {}),\n ...(base.description !== undefined ? { description: base.description } : {}),\n namespaces: base.namespaces,\n commands: base.commands.map((c) => {\n const expose = registry.commands.get(c.id)?.command.expose\n return { ...c, module: moduleOf.get(c.id)!, ...(expose ? { expose: { ...expose } as Record<string, boolean> } : {}) }\n }),\n ...(resourceList.length > 0\n ? { resources: resourceList.map((r) => ({ ...describeResource(r), module: resourceModuleOf.get(r.uri)! })) }\n : {}),\n ...(promptList.length > 0\n ? { prompts: promptList.map((p) => ({ ...describePrompt(p), module: promptModuleOf.get(p.name)! })) }\n : {}),\n ...(routes.routes.length > 0\n ? {\n routes: routes.routes\n .map((r) => {\n // 적용 값 (§12.4 표시). true = server.maxBodyBytes 값\n const applied = resolveRouteOptions(r.module, config.routes)\n const max = applied.maxBodyBytes ?? false\n return {\n path: r.path,\n file: r.file,\n methods: r.methods,\n module: `${routeModuleName(r.file)}.js`,\n auth: applied.auth ?? false,\n origin: applied.origin ?? false,\n maxBodyBytes: max === true ? (config.server?.maxBodyBytes ?? MAX_BODY_BYTES) : max,\n }\n })\n .sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0)),\n }\n : {}),\n }\n\n const generated: Record<string, string> = {\n \"package.json\": `${JSON.stringify({ type: \"module\" }, null, 2)}\\n`,\n \"server.js\": SERVER_JS,\n \"handler.js\": HANDLER_JS,\n }\n const localBin = local ? { bin: local.bin, version: local.version ?? projectVersion(cwd) ?? \"0.0.0\" } : undefined\n if (localBin) {\n generated[LOCAL_BIN_FILE] = localBinJs({ ...localBin, ...(local?.errors !== undefined ? { errors: `${LOCAL_BIN_ERRORS}.js` } : {}) })\n const declaredBin = packageBin(cwd, localBin.bin)\n const expected = `${toPosix(relative(cwd, outDir))}/${LOCAL_BIN_FILE}`\n if (declaredBin === undefined || declaredBin.replace(/^\\.\\//, \"\") !== expected) {\n warnings.push({\n code: \"LOCAL_BIN_UNDECLARED\",\n message: `cli.local: add \"bin\": { \"${localBin.bin}\": \"${expected}\" } to package.json (and include ${toPosix(relative(cwd, outDir))} in \"files\")`,\n })\n }\n }\n for (const [file, content] of Object.entries(generated)) writeFileSync(join(outDir, file), content)\n if (localBin) chmodSync(join(outDir, LOCAL_BIN_FILE), 0o755)\n\n // 고객 CLI (.mext/cli/, §5): manifest · buildId 확정 후, manifest.json 쓰기 전. 로컬 bin 이면 만들지 않는다\n // 고객 CLI = 원격 실행의 기본 표면 (mcp) 에서 보이는 명령어 · 그 manifestHash (§4 expose). 숨긴 명령어가 없으면 manifest 그대로\n const mcpView = exposedRegistry(registry, \"mcp\")\n const cliManifest: BuildManifest =\n mcpView === registry\n ? manifest\n : {\n ...manifest,\n namespaces: buildManifest(mcpView).namespaces,\n commands: manifest.commands.filter((c) => mcpView.commands.has(c.id)),\n manifestHash: manifestHash(\n base.commands.filter((c) => mcpView.commands.has(c.id)),\n { resources: resourceList.map((r) => r.uri), prompts: promptList.map((p) => ({ name: p.name, argsSchema: p.argsSchema })) },\n ),\n }\n const cli = config.cli && !local ? await buildCustomerCli({ rolldown, cwd, outDir, cli: config.cli, manifest: cliManifest }) : undefined\n\n // manifest.json 은 마지막: 중간 실패한 빌드는 manifest 가 없어 mext start 가 \"mext build 먼저\" 로 거부\n writeFileSync(join(outDir, BUILD_MANIFEST_FILE), `${JSON.stringify(manifest, null, 2)}\\n`)\n\n // 명령어 타입 (specs/client.md §4): config.types 가 있을 때만. 산출 폴더 밖 (프로젝트 소스 옆) 에 쓴다\n const typesPath = resolveTypesPath(cwd, config.types)\n if (typesPath !== undefined) writeTypes(commandsDir, typesPath)\n\n const files = [\n ...emitted,\n ...Object.keys(generated),\n BUILD_MANIFEST_FILE,\n ...(cli?.files.map((f) => `${CLI_DIR}/${f}`) ?? []),\n ].sort()\n return {\n outDir,\n manifest,\n files,\n warnings,\n ...(cli ? { cli } : {}),\n ...(localBin ? { localBin } : {}),\n ...(typesPath !== undefined ? { types: typesPath } : {}),\n }\n}\n\n/**\n * .mext/bin.js (로컬 bin, cli.local). 계약: mainLocalBin(.mext 폴더 URL, { bin, version, errors? }).\n * 도입 프로젝트 package.json bin 이 이 파일을 가리킨다 (npm 이 symlink 해도 import.meta.url = 실제 경로)\n */\nexport function localBinJs(options: { bin: string; version: string; errors?: string }): string {\n return `#!/usr/bin/env node\n// Generated by mext build. Do not edit.\n// Local bin (cli.local): ${options.bin} help · ${options.bin} <namespace> <command> · ${options.bin} mcp serve\nimport { mainLocalBin } from \"${START_ENTRY}\"\n\nawait mainLocalBin(new URL(\".\", import.meta.url), ${JSON.stringify(options)})\n`\n}\n\n/** package.json bin[name] (문자열 bin = 패키지 이름이 name 일 때) */\nfunction packageBin(cwd: string, name: string): string | undefined {\n try {\n const pkg = JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf8\")) as { name?: unknown; bin?: unknown }\n if (typeof pkg.bin === \"string\") return pkg.name === name ? pkg.bin : undefined\n if (typeof pkg.bin === \"object\" && pkg.bin !== null) {\n const v = (pkg.bin as Record<string, unknown>)[name]\n return typeof v === \"string\" ? v : undefined\n }\n } catch {\n // package.json 없음 · 형식 오류 = 미선언\n }\n return undefined\n}\n\n/**\n * .mext/server.js. 계약: startFromBuild(.mext 폴더 URL, { argv, env }) → exit code.\n * argv = server.js 뒤 인자 (--stdio), env = PORT · HOST\n */\nexport const SERVER_JS = `// Generated by mext build. Do not edit.\n// node .mext/server.js [--stdio] (= mext start). Environment: PORT · HOST\nimport { startFromBuild } from \"${START_ENTRY}\"\n\nprocess.exitCode = await startFromBuild(new URL(\".\", import.meta.url), { argv: process.argv.slice(2), env: process.env })\n`\n\n/** .mext/handler.js. 계약: createFetchHandler(.mext 폴더 URL) → { fetch(request: Request): Promise<Response> } (동기 반환) */\nexport const HANDLER_JS = `// Generated by mext build. Do not edit.\n// Web fetch handler (Request → Response) for other runtimes and platforms\nimport { createFetchHandler } from \"${START_ENTRY}\"\n\nexport default createFetchHandler(new URL(\".\", import.meta.url))\n`\n\nasync function importRolldown(): Promise<RolldownModule> {\n // 문자열 변수: 타입 검사 · 번들러가 선택 peer 를 정적 의존으로 취급하지 않게\n const specifier = \"rolldown\"\n return (await import(specifier)) as RolldownModule\n}\n\nfunction isModuleNotFound(error: unknown, pkg: string): boolean {\n const e = error as { code?: unknown; message?: unknown } | null\n if (typeof e !== \"object\" || e === null) return false\n if (e.code !== \"ERR_MODULE_NOT_FOUND\" && e.code !== \"MODULE_NOT_FOUND\") return false\n return typeof e.message !== \"string\" || e.message.includes(`'${pkg}'`) || e.message.includes(`\"${pkg}\"`)\n}\n\n/** 도입 프로젝트의 lock 파일로 패키지 관리자 추정 */\nfunction installCommand(cwd: string): string {\n for (let dir = cwd; ; dir = resolve(dir, \"..\")) {\n if (existsSync(join(dir, \"pnpm-lock.yaml\"))) return \"pnpm add -D rolldown\"\n if (existsSync(join(dir, \"yarn.lock\"))) return \"yarn add -D rolldown\"\n if (existsSync(join(dir, \"bun.lock\")) || existsSync(join(dir, \"bun.lockb\"))) return \"bun add -d rolldown\"\n if (existsSync(join(dir, \"package-lock.json\")) || resolve(dir, \"..\") === dir) return \"npm install --save-dev rolldown\"\n }\n}\n\nfunction cleanOutDir(outDir: string): void {\n mkdirSync(outDir, { recursive: true })\n for (const name of readdirSync(outDir)) {\n if (!PRESERVED_ENTRIES.has(name)) rmSync(join(outDir, name), { recursive: true, force: true })\n }\n}\n\n/**\n * route 엔트리 이름 = routes/ 아래 소스 경로, [name] → _name_ (rolldown 이 [ ] 를 바꾸므로 직접 정한다).\n * `_` 접두 파일 · 폴더는 route 가 아니라 충돌 없음. routes/items/[id].ts → routes/items/_id_\n */\nfunction routeModuleName(file: string): string {\n return `routes/${file.replace(/\\.ts$/, \"\").replace(/\\[([^\\]/]+)\\]/g, \"_$1_\")}`\n}\n\n/** \"@scope/pkg/sub\" → \"@scope/pkg\" · \"pkg/sub\" → \"pkg\" */\nfunction packageName(specifier: string): string {\n const parts = specifier.split(\"/\")\n return specifier.startsWith(\"@\") ? parts.slice(0, 2).join(\"/\") : parts[0]!\n}\n\nfunction declaredDependencies(cwd: string): Set<string> {\n let pkg: Record<string, unknown>\n try {\n pkg = JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf8\")) as Record<string, unknown>\n } catch {\n return new Set()\n }\n const names = new Set<string>()\n if (typeof pkg.name === \"string\") names.add(pkg.name)\n for (const field of [\"dependencies\", \"peerDependencies\", \"optionalDependencies\"]) {\n const deps = pkg[field]\n if (typeof deps === \"object\" && deps !== null) for (const name of Object.keys(deps)) names.add(name)\n }\n return names\n}\n\n/** D3: mextVersion · manifestHash · 번들 chunk (파일 이름 · 코드) 의 sha256 앞 16자. 같은 입력 = 같은 buildId */\nfunction buildIdOf(version: string, hash: string, output: readonly RolldownOutputItem[]): string {\n const h = createHash(\"sha256\").update(`${version}\\n${hash}\\n`)\n for (const item of [...output].sort((a, b) => (a.fileName < b.fileName ? -1 : 1))) {\n if (item.type !== \"chunk\") continue\n h.update(`${item.fileName}\\0${item.code ?? \"\"}\\0`)\n }\n return h.digest(\"hex\").slice(0, 16)\n}\n\nfunction toPosix(path: string): string {\n return path.split(sep).join(\"/\")\n}\n"]}
package/dist/cli/args.js CHANGED
@@ -3,9 +3,8 @@ import { closest } from "../suggest.js";
3
3
  /** mext run 이 명령어 플래그 위치에서도 가로채는 플래그. input 키와 겹치면 빌드 오류 */
4
4
  export const RESERVED_FLAGS = ["help", "json", "yes", "input-json"];
5
5
  const WRAPPERS = new Set(["optional", "nullable", "default", "prefault", "catch", "readonly", "nonoptional"]);
6
+ /** 플래그 · JSON 문자열로 표현할 수 없는 타입 (빌드 오류). any · unknown 은 여기 없다 = JSON 문자열 (analyze 의 json) */
6
7
  const UNCONVERTIBLE = new Set([
7
- "any",
8
- "unknown",
9
8
  "function",
10
9
  "promise",
11
10
  "symbol",
@@ -1 +1 @@
1
- {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InputSchema } from \"../command.ts\"\nimport { MextBuildError, MextError, type ArgumentIssue, type BuildIssue } from \"../errors.ts\"\nimport type { JsonSchema, RegisteredCommand, Registry } from \"../registry.ts\"\nimport { closest } from \"../suggest.ts\"\n\n/**\n * CLI 입력 변환 (spec §4).\n * 필드 종류는 Zod def 로, 설명 · 기본값 · 필수 여부는 input JSON Schema 로 판단한다.\n * 파서는 문자열을 객체로 모으기만 하고 (스키마 모양에 따른 number · boolean · enum 변환 포함) 검증은 invoke 의 Zod safeParse 1회.\n */\n\nexport type Primitive = string | number | boolean\n\nexport type ScalarKind =\n | { type: \"string\" }\n | { type: \"number\" }\n | { type: \"boolean\" }\n | { type: \"enum\"; values: readonly Primitive[] }\n\nexport type FieldKind =\n | ScalarKind\n /** 원시 타입 배열. 플래그 반복 */\n | { type: \"array\"; item: ScalarKind }\n /** z.object 1단. 점 플래그 (--filter.status) 또는 JSON 문자열 */\n | { type: \"object\"; fields: readonly CliField[] }\n /** 2단 이상 · union · record 등. JSON 문자열 */\n | { type: \"json\" }\n\nexport interface CliField {\n /** input 키 (camelCase) */\n key: string\n /** 플래그 이름 (kebab-case, \"--\" 제외) */\n flag: string\n kind: FieldKind\n description: string | undefined\n required: boolean\n hasDefault: boolean\n default: unknown\n}\n\nexport interface CliSpec {\n fields: readonly CliField[]\n /** positional 로 받는 input 키 순서 */\n positional: readonly string[]\n}\n\n/** mext run 이 명령어 플래그 위치에서도 가로채는 플래그. input 키와 겹치면 빌드 오류 */\nexport const RESERVED_FLAGS: readonly string[] = [\"help\", \"json\", \"yes\", \"input-json\"]\n\nexport interface ParsedArgs {\n /** invoke 에 넘길 원본 입력 (검증 전) */\n input: unknown\n json: boolean\n yes: boolean\n help: boolean\n}\n\nexport interface ParseArgsOptions {\n /** stdin (-) · --input-json - 입력. 기본 = 빈 문자열 */\n readStdin?: () => Promise<string>\n}\n\n// ---------------------------------------------------------------- 스키마 분석\n\ninterface ZodLike {\n _zod: { def: ZodDef }\n}\n\ninterface ZodDef {\n type: string\n innerType?: ZodLike\n in?: ZodLike\n out?: ZodLike\n getter?: () => ZodLike\n element?: ZodLike\n shape?: Record<string, ZodLike>\n options?: readonly ZodLike[]\n values?: readonly unknown[]\n entries?: Record<string, unknown>\n}\n\nconst WRAPPERS = new Set([\"optional\", \"nullable\", \"default\", \"prefault\", \"catch\", \"readonly\", \"nonoptional\"])\nconst UNCONVERTIBLE = new Set([\n \"any\",\n \"unknown\",\n \"function\",\n \"promise\",\n \"symbol\",\n \"custom\",\n \"transform\",\n \"never\",\n \"void\",\n \"undefined\",\n \"bigint\",\n \"date\",\n \"map\",\n \"set\",\n \"file\",\n])\n\nfunction defOf(schema: ZodLike): ZodDef {\n return schema._zod.def\n}\n\n/** optional · nullable · default · pipe (입력 쪽) · lazy 등을 벗긴 실제 타입 */\nfunction unwrap(schema: ZodLike): ZodLike {\n let cur = schema\n for (let depth = 0; depth < 32; depth++) {\n const def = defOf(cur)\n if (WRAPPERS.has(def.type) && def.innerType) cur = def.innerType\n else if (def.type === \"pipe\" && def.in && def.out) cur = defOf(def.in).type === \"transform\" ? def.out : def.in\n else if (def.type === \"lazy\" && def.getter) cur = def.getter()\n else return cur\n }\n return cur\n}\n\ntype Analysis = FieldKind | { type: \"unconvertible\"; zodType: string }\n\nfunction scalarOf(schema: ZodLike): ScalarKind | { type: \"unconvertible\"; zodType: string } | undefined {\n const base = unwrap(schema)\n const def = defOf(base)\n switch (def.type) {\n case \"string\":\n case \"template_literal\":\n return { type: \"string\" }\n case \"number\":\n return { type: \"number\" }\n case \"boolean\":\n return { type: \"boolean\" }\n case \"enum\":\n case \"literal\":\n case \"union\": {\n const values = literalValues(base)\n return values ? { type: \"enum\", values } : undefined\n }\n }\n if (UNCONVERTIBLE.has(def.type)) return { type: \"unconvertible\", zodType: def.type }\n return undefined\n}\n\n/** enum · 리터럴 · 리터럴만의 union → 값 목록. 그 외 undefined */\nfunction literalValues(schema: ZodLike): Primitive[] | undefined {\n const def = defOf(unwrap(schema))\n let raw: unknown[]\n if (def.type === \"enum\") raw = Object.values(def.entries ?? {})\n else if (def.type === \"literal\") raw = [...(def.values ?? [])]\n else if (def.type === \"union\") {\n raw = []\n for (const option of def.options ?? []) {\n const values = literalValues(option)\n if (!values) return undefined\n raw.push(...values)\n }\n } else return undefined\n if (!raw.every((v) => typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\")) return undefined\n return [...new Set(raw as Primitive[])]\n}\n\nfunction analyze(schema: ZodLike, topLevel: boolean): Analysis {\n const scalar = scalarOf(schema)\n if (scalar) return scalar\n const base = unwrap(schema)\n const def = defOf(base)\n if (def.type === \"array\" && def.element) {\n const item = scalarOf(def.element)\n return item && item.type !== \"unconvertible\" ? { type: \"array\", item } : { type: \"json\" }\n }\n if (def.type === \"object\" && topLevel) {\n const fields: CliField[] = []\n for (const [key, sub] of Object.entries(def.shape ?? {})) {\n const kind = analyze(sub, false)\n if (kind.type === \"unconvertible\" || kind.type === \"json\" || kind.type === \"object\") return { type: \"json\" }\n fields.push(field(key, kind, undefined))\n }\n return { type: \"object\", fields }\n }\n return { type: \"json\" }\n}\n\nfunction field(key: string, kind: FieldKind, json: JsonSchema | undefined, required = false): CliField {\n const has = json !== undefined && Object.hasOwn(json, \"default\")\n return {\n key,\n flag: toKebab(key),\n kind,\n description: typeof json?.description === \"string\" ? json.description : undefined,\n required,\n hasDefault: has,\n default: has ? json!.default : undefined,\n }\n}\n\n/** camelCase → kebab-case (userId → user-id · URLPath → url-path) */\nexport function toKebab(key: string): string {\n return key\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z])([A-Z][a-z])/g, \"$1-$2\")\n .toLowerCase()\n}\n\nconst FLAG_PATTERN = /^[a-z0-9]+(?:[-_][a-z0-9]+)*$/\n\n/** JSON Schema 의 객체 (nullable 이면 anyOf 안) */\nfunction objectSchema(json: JsonSchema | undefined): JsonSchema | undefined {\n if (!json) return undefined\n if (typeof json.properties === \"object\" && json.properties !== null) return json\n for (const key of [\"anyOf\", \"oneOf\"]) {\n const list = json[key]\n if (Array.isArray(list)) {\n const found = list.find((s) => typeof s === \"object\" && s !== null && \"properties\" in s) as JsonSchema | undefined\n if (found) return found\n }\n }\n return undefined\n}\n\nfunction propertiesOf(json: JsonSchema | undefined): { props: Record<string, JsonSchema>; required: string[] } {\n const obj = objectSchema(json)\n return {\n props: (obj?.properties as Record<string, JsonSchema> | undefined) ?? {},\n required: Array.isArray(obj?.required) ? (obj!.required as string[]) : [],\n }\n}\n\n/**\n * input 스키마 → CLI 필드. problems = 변환 불가 (any · 함수 등) · 플래그로 쓸 수 없는 키 · 플래그 충돌 · 예약 플래그.\n * jsonSchema = input JSON Schema (io input). 설명 · 기본값 · 필수 여부의 원본\n */\nexport function analyzeInput(\n schema: InputSchema,\n jsonSchema: JsonSchema | undefined,\n positional: readonly string[] = [],\n): { spec: CliSpec; problems: string[] } {\n const problems: string[] = []\n const fields: CliField[] = []\n const { props, required } = propertiesOf(jsonSchema)\n const shape = (schema as unknown as ZodLike)._zod.def.shape ?? {}\n const flags = new Map<string, string>()\n\n for (const [key, sub] of Object.entries(shape)) {\n const kind = analyze(sub, true)\n if (kind.type === \"unconvertible\") {\n problems.push(`input \"${key}\": z.${kind.zodType}() is not convertible to CLI flags`)\n continue\n }\n const f = field(key, kind, props[key], required.includes(key))\n if (!FLAG_PATTERN.test(f.flag)) {\n problems.push(`input \"${key}\": key cannot be a CLI flag (use camelCase letters and digits)`)\n continue\n }\n if (RESERVED_FLAGS.includes(f.flag)) {\n problems.push(`input \"${key}\": --${f.flag} is reserved by the CLI`)\n continue\n }\n const other = flags.get(f.flag)\n if (other !== undefined) {\n problems.push(`input \"${key}\": --${f.flag} collides with input \"${other}\"`)\n continue\n }\n if (kind.type === \"object\") {\n const sub = propertiesOf(props[key])\n const subFlags = new Set<string>()\n const subs: CliField[] = []\n for (const s of kind.fields) {\n const sf = field(s.key, s.kind, sub.props[s.key], sub.required.includes(s.key))\n if (!FLAG_PATTERN.test(sf.flag)) {\n problems.push(`input \"${key}.${s.key}\": key cannot be a CLI flag (use camelCase letters and digits)`)\n continue\n }\n if (subFlags.has(sf.flag)) {\n problems.push(`input \"${key}.${s.key}\": --${f.flag}.${sf.flag} collides with another key`)\n continue\n }\n subFlags.add(sf.flag)\n subs.push(sf)\n }\n f.kind = { type: \"object\", fields: subs }\n }\n flags.set(f.flag, key)\n fields.push(f)\n }\n\n // --no-x 와 같은 이름의 플래그가 있으면 모호\n for (const f of fields) {\n if (f.flag.startsWith(\"no-\") && isBooleanKind(fields.find((g) => g.flag === f.flag.slice(3))?.kind)) {\n problems.push(`input \"${f.key}\": --${f.flag} collides with the negation of --${f.flag.slice(3)}`)\n }\n }\n\n return { spec: { fields, positional: [...positional] }, problems }\n}\n\nfunction isBooleanKind(kind: FieldKind | undefined): boolean {\n return kind?.type === \"boolean\" || (kind?.type === \"array\" && kind.item.type === \"boolean\")\n}\n\nconst specCache = new WeakMap<RegisteredCommand, { spec: CliSpec; problems: string[] }>()\n\nfunction analyzed(entry: RegisteredCommand): { spec: CliSpec; problems: string[] } {\n let result = specCache.get(entry)\n if (!result) {\n result = analyzeInput(entry.command.input, entry.inputSchema, entry.command.positional)\n specCache.set(entry, result)\n }\n return result\n}\n\n/**\n * Registry 밖 명령어 (원격 help 로 만든 항목) 의 CLI 필드 지정. 이후 cliSpec · parseArgs · help 가 이 값을 쓴다.\n * 로컬 명령어는 Zod 스키마로 분석하므로 쓰지 않는다\n */\nexport function defineCliSpec(entry: RegisteredCommand, spec: CliSpec): void {\n specCache.set(entry, { spec, problems: [] })\n}\n\n// ---------------------------------------------------------------- JSON Schema 분석 (원격)\n\n/**\n * input JSON Schema (원격 help 의 inputSchema) → CLI 필드. 로컬 (Zod) 분석과 같은 규칙을 JSON Schema 모양으로:\n * type string · number · integer · boolean · enum · const · 리터럴 anyOf = 원시, nullable (anyOf null) 은 벗김,\n * 원시 배열 = 반복, 최상위 1단 객체 (하위 전부 원시 · 원시 배열) = 점 플래그, 그 외 = JSON 문자열.\n * 플래그로 쓸 수 없는 키 · 예약 플래그 · 충돌 키는 건너뛴다 (--input-json 으로 전달)\n */\nexport function cliSpecFromJsonSchema(jsonSchema: JsonSchema, positional: readonly string[] = []): CliSpec {\n const { props, required } = propertiesOf(jsonSchema)\n const fields: CliField[] = []\n const flags = new Set<string>()\n for (const [key, sub] of Object.entries(props)) {\n const kind = jsonKind(sub, true)\n const f = field(key, kind, sub, required.includes(key))\n if (!FLAG_PATTERN.test(f.flag) || RESERVED_FLAGS.includes(f.flag) || flags.has(f.flag)) continue\n if (kind.type === \"object\") {\n const subProps = propertiesOf(stripNullable(sub))\n const subs: CliField[] = []\n const subFlags = new Set<string>()\n for (const s of kind.fields) {\n const sf = field(s.key, s.kind, subProps.props[s.key], subProps.required.includes(s.key))\n if (!FLAG_PATTERN.test(sf.flag) || subFlags.has(sf.flag)) continue\n subFlags.add(sf.flag)\n subs.push(sf)\n }\n f.kind = { type: \"object\", fields: subs }\n }\n flags.add(f.flag)\n fields.push(f)\n }\n return { fields, positional: positional.filter((k) => fields.some((f) => f.key === k)) }\n}\n\nfunction isJsonObject(value: unknown): value is JsonSchema {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction isPrimitive(value: unknown): value is Primitive {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\"\n}\n\n/** anyOf · oneOf 에서 { type: \"null\" } 을 뺀 나머지가 하나면 그것, type 배열의 \"null\" 제거 */\nfunction stripNullable(schema: JsonSchema): JsonSchema {\n for (const key of [\"anyOf\", \"oneOf\"]) {\n const list = schema[key]\n if (!Array.isArray(list)) continue\n const rest = list.filter((s) => !(isJsonObject(s) && s.type === \"null\"))\n if (rest.length === 1 && rest.length < list.length && isJsonObject(rest[0])) return rest[0]\n }\n if (Array.isArray(schema.type)) {\n const types = schema.type.filter((t) => t !== \"null\")\n if (types.length === 1) return { ...schema, type: types[0] }\n }\n return schema\n}\n\nfunction jsonLiterals(schema: JsonSchema): Primitive[] | undefined {\n if (Array.isArray(schema.enum)) return schema.enum.every(isPrimitive) ? [...new Set(schema.enum)] : undefined\n if (\"const\" in schema) return isPrimitive(schema.const) ? [schema.const] : undefined\n for (const key of [\"anyOf\", \"oneOf\"]) {\n const list = schema[key]\n if (!Array.isArray(list)) continue\n const out: Primitive[] = []\n for (const option of list) {\n const values = isJsonObject(option) ? jsonLiterals(option) : undefined\n if (!values) return undefined\n out.push(...values)\n }\n return [...new Set(out)]\n }\n return undefined\n}\n\nfunction jsonScalar(raw: unknown): ScalarKind | undefined {\n if (!isJsonObject(raw)) return undefined\n const schema = stripNullable(raw)\n const values = jsonLiterals(schema)\n if (values) return { type: \"enum\", values }\n switch (schema.type) {\n case \"string\":\n return { type: \"string\" }\n case \"number\":\n case \"integer\":\n return { type: \"number\" }\n case \"boolean\":\n return { type: \"boolean\" }\n }\n return undefined\n}\n\nfunction jsonKind(raw: unknown, topLevel: boolean): FieldKind {\n const scalar = jsonScalar(raw)\n if (scalar) return scalar\n if (!isJsonObject(raw)) return { type: \"json\" }\n const schema = stripNullable(raw)\n if (schema.type === \"array\" && isJsonObject(schema.items)) {\n const item = jsonScalar(schema.items)\n return item ? { type: \"array\", item } : { type: \"json\" }\n }\n if (topLevel && schema.type === \"object\" && isJsonObject(schema.properties)) {\n const fields: CliField[] = []\n for (const [key, sub] of Object.entries(schema.properties)) {\n const kind = jsonKind(sub, false)\n if (kind.type === \"json\" || kind.type === \"object\") return { type: \"json\" }\n fields.push(field(key, kind, undefined))\n }\n return { type: \"object\", fields }\n }\n return { type: \"json\" }\n}\n\n/** 명령어의 CLI 필드 (캐시) */\nexport function cliSpec(entry: RegisteredCommand): CliSpec {\n return analyzed(entry).spec\n}\n\n/** Registry 전체의 CLI 변환 불가 문제 (빌드 오류 issues) */\nexport function cliBuildIssues(registry: Registry): BuildIssue[] {\n const issues: BuildIssue[] = []\n for (const entry of registry.commands.values()) {\n for (const message of analyzed(entry).problems) {\n issues.push({ code: \"CLI_UNCONVERTIBLE\", message, id: entry.id, file: entry.file })\n }\n }\n return issues\n}\n\n/** 변환 불가 타입이 있으면 MextBuildError */\nexport function assertCliConvertible(registry: Registry): void {\n const issues = cliBuildIssues(registry)\n if (issues.length > 0) throw new MextBuildError(issues)\n}\n\n// ---------------------------------------------------------------- 파서\n\ninterface Resolved {\n field: CliField\n sub?: CliField\n negated: boolean\n}\n\nfunction resolveFlag(spec: CliSpec, name: string): Resolved | undefined {\n const top = spec.fields.find((f) => f.flag === name)\n if (top) return { field: top, negated: false }\n const dot = name.indexOf(\".\")\n if (dot > 0) {\n const parent = spec.fields.find((f) => f.flag === name.slice(0, dot))\n if (parent?.kind.type === \"object\") {\n const sub = parent.kind.fields.find((f) => f.flag === name.slice(dot + 1))\n if (sub) return { field: parent, sub, negated: false }\n }\n }\n if (name.startsWith(\"no-\")) {\n const r = resolveFlag(spec, name.slice(3))\n if (r && !r.negated && isBooleanKind((r.sub ?? r.field).kind)) return { ...r, negated: true }\n }\n return undefined\n}\n\n/** 사용 가능한 플래그 이름 전체 (제안용) */\nfunction allFlags(spec: CliSpec): string[] {\n const out: string[] = []\n for (const f of spec.fields) {\n out.push(f.flag)\n if (isBooleanKind(f.kind)) out.push(`no-${f.flag}`)\n if (f.kind.type === \"object\") {\n for (const s of f.kind.fields) {\n out.push(`${f.flag}.${s.flag}`)\n if (isBooleanKind(s.kind)) out.push(`no-${f.flag}.${s.flag}`)\n }\n }\n }\n return [...out, ...RESERVED_FLAGS]\n}\n\nfunction coerceScalar(kind: ScalarKind, raw: string): unknown {\n switch (kind.type) {\n case \"string\":\n return raw\n case \"number\": {\n const n = Number(raw)\n return raw.trim() !== \"\" && Number.isFinite(n) ? n : raw\n }\n case \"boolean\":\n return raw === \"true\" ? true : raw === \"false\" ? false : raw\n case \"enum\":\n return kind.values.find((v) => String(v) === raw) ?? raw\n }\n}\n\n/** 원시 · 배열 · 객체 · JSON 필드 종류에 맞춘 문자열 변환. JSON 파싱 실패 = undefined (호출자가 오류) */\nexport function coerceValue(kind: FieldKind, raw: string): { ok: true; value: unknown } | { ok: false } {\n if (kind.type === \"array\") return { ok: true, value: coerceScalar(kind.item, raw) }\n if (kind.type === \"object\" || kind.type === \"json\") {\n try {\n return { ok: true, value: JSON.parse(raw) }\n } catch {\n return { ok: false }\n }\n }\n return { ok: true, value: coerceScalar(kind, raw) }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\n/** 파서 단계 INVALID_ARGUMENT */\nexport function argumentError(entry: RegisteredCommand, issues: ArgumentIssue[]): MextError<\"INVALID_ARGUMENT\"> {\n return new MextError(\n \"INVALID_ARGUMENT\",\n `Invalid arguments for ${entry.id}: ${issues.map((i) => i.message).join(\"; \")}`,\n {\n command: entry.id,\n missing_fields: [],\n issues,\n expected_schema: entry.inputSchema,\n examples: [...entry.command.examples],\n },\n )\n}\n\n/**\n * 명령어 경로 뒤의 argv → 원본 입력.\n * --flag v · --flag=v · boolean --x · --x=true|false · --no-x · 반복 (배열) · --obj.key v · JSON 문자열 ·\n * --input-json <json|-> · - (stdin) · positional · -- 이후 = positional. 모르는 플래그는 항상 오류.\n * 개별 플래그는 --input-json · stdin 입력의 같은 키를 덮어쓴다 (점 플래그는 객체 안에 병합).\n */\nexport async function parseArgs(\n entry: RegisteredCommand,\n argv: readonly string[],\n options: ParseArgsOptions = {},\n): Promise<ParsedArgs> {\n const spec = cliSpec(entry)\n const fail = (path: string, code: string, message: string): never => {\n throw argumentError(entry, [{ path, code, message }])\n }\n const values: Record<string, unknown> = {}\n const given = new Set<string>() // 지정된 경로 (배열 제외). \"filter\" = JSON 전체 · \"filter.status\" = 점 플래그\n const flags = { json: false, yes: false, help: false }\n const positionals: string[] = []\n let source: { kind: \"json\"; text: string } | { kind: \"stdin\" } | undefined\n let rest = false\n\n const setInput = (next: NonNullable<typeof source>, label: string): void => {\n if (source) fail(\"\", \"duplicate_input\", `${label}: whole input given more than once (--input-json · -)`)\n source = next\n }\n\n const assign = (r: Resolved, value: unknown, label: string): void => {\n const target = r.sub ?? r.field\n const path = r.sub ? `${r.field.key}.${r.sub.key}` : r.field.key\n if (r.sub) {\n if (given.has(r.field.key)) fail(path, \"conflict\", `${label} cannot be combined with --${r.field.flag} <json>`)\n } else if (r.field.kind.type === \"object\" && [...given].some((p) => p.startsWith(`${r.field.key}.`))) {\n fail(path, \"conflict\", `${label} <json> cannot be combined with --${r.field.flag}.<key>`)\n }\n let container = values\n if (r.sub) {\n const existing = values[r.field.key]\n if (!isPlainObject(existing)) values[r.field.key] = {}\n container = values[r.field.key] as Record<string, unknown>\n }\n if (target.kind.type === \"array\") {\n const list = container[target.key]\n if (Array.isArray(list)) list.push(value)\n else container[target.key] = [value]\n return\n }\n if (given.has(path)) fail(path, \"duplicate_flag\", `${label} given more than once`)\n given.add(path)\n container[target.key] = value\n }\n\n const coerce = (r: Resolved, raw: string, label: string): unknown => {\n const kind = r.sub ? r.sub.kind : r.field.kind\n const result = coerceValue(kind, raw)\n if (!result.ok) {\n return fail(r.sub ? `${r.field.key}.${r.sub.key}` : r.field.key, \"invalid_json\", `${label}: value is not valid JSON`)\n }\n return result.value\n }\n\n for (let i = 0; i < argv.length; i++) {\n const tok = argv[i]!\n if (rest) {\n positionals.push(tok)\n continue\n }\n if (tok === \"--\") {\n rest = true\n continue\n }\n if (tok === \"-\") {\n setInput({ kind: \"stdin\" }, \"-\")\n continue\n }\n if (tok === \"-h\") {\n flags.help = true\n continue\n }\n if (tok.startsWith(\"--\")) {\n const body = tok.slice(2)\n const eq = body.indexOf(\"=\")\n const name = eq < 0 ? body : body.slice(0, eq)\n const inline = eq < 0 ? undefined : body.slice(eq + 1)\n const label = `--${name}`\n const takeValue = (): string => {\n if (inline !== undefined) return inline\n const next = argv[i + 1]\n if (next === undefined || (next.startsWith(\"--\") && next.length > 2)) {\n return fail(\"\", \"missing_value\", `${label} requires a value`)\n }\n i++\n return next\n }\n if (name === \"help\" || name === \"json\" || name === \"yes\") {\n if (inline !== undefined) fail(\"\", \"unexpected_value\", `${label} does not take a value`)\n flags[name] = true\n continue\n }\n if (name === \"input-json\") {\n const text = takeValue()\n setInput(text === \"-\" ? { kind: \"stdin\" } : { kind: \"json\", text }, label)\n continue\n }\n const r = resolveFlag(spec, name)\n if (!r) {\n const suggested = closest(name, allFlags(spec).map((f): [string, string] => [f, f]))\n const hint = suggested.length > 0 ? ` Did you mean --${suggested[0]}?` : \"\"\n return fail(\"\", \"unknown_flag\", `unknown flag ${label}.${hint}`)\n }\n const kind = (r.sub ?? r.field).kind\n if (isBooleanKind(kind)) {\n if (r.negated) {\n if (inline !== undefined) fail(\"\", \"unexpected_value\", `${label} does not take a value`)\n assign(r, false, label)\n } else {\n assign(r, inline === undefined ? true : coerceScalar({ type: \"boolean\" }, inline), label)\n }\n continue\n }\n assign(r, coerce(r, takeValue(), label), label)\n continue\n }\n if (tok.startsWith(\"-\") && !/^-[\\d.]/.test(tok)) {\n fail(\"\", \"unknown_flag\", `unknown flag ${tok} (short flags are not supported)`)\n }\n positionals.push(tok)\n }\n\n // positional\n let p = 0\n for (let k = 0; k < spec.positional.length && p < positionals.length; k++) {\n const f = spec.fields.find((x) => x.key === spec.positional[k])\n if (!f) continue\n const r: Resolved = { field: f, negated: false }\n const label = `<${f.flag}>`\n const variadic = f.kind.type === \"array\" && k === spec.positional.length - 1\n do {\n assign(r, coerce(r, positionals[p]!, label), label)\n p++\n } while (variadic && p < positionals.length)\n }\n if (p < positionals.length) fail(\"\", \"unexpected_argument\", `unexpected argument \"${positionals[p]}\"`)\n\n let input: unknown = values\n if (source) {\n const text = source.kind === \"stdin\" ? await (options.readStdin ?? (async () => \"\"))() : source.text\n let base: unknown\n try {\n base = JSON.parse(text)\n } catch {\n return fail(\"\", \"invalid_json\", `${source.kind === \"stdin\" ? \"stdin\" : \"--input-json\"} is not valid JSON`)\n }\n if (Object.keys(values).length === 0) input = base\n else if (!isPlainObject(base)) {\n fail(\"\", \"invalid_json\", \"whole input must be a JSON object to combine with flags\")\n } else {\n const merged: Record<string, unknown> = { ...base }\n for (const [key, value] of Object.entries(values)) {\n // 점 플래그로 모은 객체는 병합, 그 외 (JSON 문자열 포함) 는 덮어쓰기\n const dotted = !given.has(key) && spec.fields.find((x) => x.key === key)?.kind.type === \"object\"\n merged[key] = dotted && isPlainObject(base[key]) && isPlainObject(value) ? { ...base[key], ...value } : value\n }\n input = merged\n }\n }\n\n return { input, ...flags }\n}\n"]}
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InputSchema } from \"../command.ts\"\nimport { MextBuildError, MextError, type ArgumentIssue, type BuildIssue } from \"../errors.ts\"\nimport type { JsonSchema, RegisteredCommand, Registry } from \"../registry.ts\"\nimport { closest } from \"../suggest.ts\"\n\n/**\n * CLI 입력 변환 (spec §4).\n * 필드 종류는 Zod def 로, 설명 · 기본값 · 필수 여부는 input JSON Schema 로 판단한다.\n * 파서는 문자열을 객체로 모으기만 하고 (스키마 모양에 따른 number · boolean · enum 변환 포함) 검증은 invoke 의 Zod safeParse 1회.\n */\n\nexport type Primitive = string | number | boolean\n\nexport type ScalarKind =\n | { type: \"string\" }\n | { type: \"number\" }\n | { type: \"boolean\" }\n | { type: \"enum\"; values: readonly Primitive[] }\n\nexport type FieldKind =\n | ScalarKind\n /** 원시 타입 배열. 플래그 반복 */\n | { type: \"array\"; item: ScalarKind }\n /** z.object 1단. 점 플래그 (--filter.status) 또는 JSON 문자열 */\n | { type: \"object\"; fields: readonly CliField[] }\n /** 2단 이상 · union · record 등. JSON 문자열 */\n | { type: \"json\" }\n\nexport interface CliField {\n /** input 키 (camelCase) */\n key: string\n /** 플래그 이름 (kebab-case, \"--\" 제외) */\n flag: string\n kind: FieldKind\n description: string | undefined\n required: boolean\n hasDefault: boolean\n default: unknown\n}\n\nexport interface CliSpec {\n fields: readonly CliField[]\n /** positional 로 받는 input 키 순서 */\n positional: readonly string[]\n}\n\n/** mext run 이 명령어 플래그 위치에서도 가로채는 플래그. input 키와 겹치면 빌드 오류 */\nexport const RESERVED_FLAGS: readonly string[] = [\"help\", \"json\", \"yes\", \"input-json\"]\n\nexport interface ParsedArgs {\n /** invoke 에 넘길 원본 입력 (검증 전) */\n input: unknown\n json: boolean\n yes: boolean\n help: boolean\n}\n\nexport interface ParseArgsOptions {\n /** stdin (-) · --input-json - 입력. 기본 = 빈 문자열 */\n readStdin?: () => Promise<string>\n}\n\n// ---------------------------------------------------------------- 스키마 분석\n\ninterface ZodLike {\n _zod: { def: ZodDef }\n}\n\ninterface ZodDef {\n type: string\n innerType?: ZodLike\n in?: ZodLike\n out?: ZodLike\n getter?: () => ZodLike\n element?: ZodLike\n shape?: Record<string, ZodLike>\n options?: readonly ZodLike[]\n values?: readonly unknown[]\n entries?: Record<string, unknown>\n}\n\nconst WRAPPERS = new Set([\"optional\", \"nullable\", \"default\", \"prefault\", \"catch\", \"readonly\", \"nonoptional\"])\n/** 플래그 · JSON 문자열로 표현할 수 없는 타입 (빌드 오류). any · unknown 은 여기 없다 = JSON 문자열 (analyze 의 json) */\nconst UNCONVERTIBLE = new Set([\n \"function\",\n \"promise\",\n \"symbol\",\n \"custom\",\n \"transform\",\n \"never\",\n \"void\",\n \"undefined\",\n \"bigint\",\n \"date\",\n \"map\",\n \"set\",\n \"file\",\n])\n\nfunction defOf(schema: ZodLike): ZodDef {\n return schema._zod.def\n}\n\n/** optional · nullable · default · pipe (입력 쪽) · lazy 등을 벗긴 실제 타입 */\nfunction unwrap(schema: ZodLike): ZodLike {\n let cur = schema\n for (let depth = 0; depth < 32; depth++) {\n const def = defOf(cur)\n if (WRAPPERS.has(def.type) && def.innerType) cur = def.innerType\n else if (def.type === \"pipe\" && def.in && def.out) cur = defOf(def.in).type === \"transform\" ? def.out : def.in\n else if (def.type === \"lazy\" && def.getter) cur = def.getter()\n else return cur\n }\n return cur\n}\n\ntype Analysis = FieldKind | { type: \"unconvertible\"; zodType: string }\n\nfunction scalarOf(schema: ZodLike): ScalarKind | { type: \"unconvertible\"; zodType: string } | undefined {\n const base = unwrap(schema)\n const def = defOf(base)\n switch (def.type) {\n case \"string\":\n case \"template_literal\":\n return { type: \"string\" }\n case \"number\":\n return { type: \"number\" }\n case \"boolean\":\n return { type: \"boolean\" }\n case \"enum\":\n case \"literal\":\n case \"union\": {\n const values = literalValues(base)\n return values ? { type: \"enum\", values } : undefined\n }\n }\n if (UNCONVERTIBLE.has(def.type)) return { type: \"unconvertible\", zodType: def.type }\n return undefined\n}\n\n\n/** enum · 리터럴 · 리터럴만의 union → 값 목록. 그 외 undefined */\nfunction literalValues(schema: ZodLike): Primitive[] | undefined {\n const def = defOf(unwrap(schema))\n let raw: unknown[]\n if (def.type === \"enum\") raw = Object.values(def.entries ?? {})\n else if (def.type === \"literal\") raw = [...(def.values ?? [])]\n else if (def.type === \"union\") {\n raw = []\n for (const option of def.options ?? []) {\n const values = literalValues(option)\n if (!values) return undefined\n raw.push(...values)\n }\n } else return undefined\n if (!raw.every((v) => typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\")) return undefined\n return [...new Set(raw as Primitive[])]\n}\n\nfunction analyze(schema: ZodLike, topLevel: boolean): Analysis {\n const scalar = scalarOf(schema)\n if (scalar) return scalar\n const base = unwrap(schema)\n const def = defOf(base)\n if (def.type === \"array\" && def.element) {\n const item = scalarOf(def.element)\n return item && item.type !== \"unconvertible\" ? { type: \"array\", item } : { type: \"json\" }\n }\n if (def.type === \"object\" && topLevel) {\n const fields: CliField[] = []\n for (const [key, sub] of Object.entries(def.shape ?? {})) {\n const kind = analyze(sub, false)\n if (kind.type === \"unconvertible\" || kind.type === \"json\" || kind.type === \"object\") return { type: \"json\" }\n fields.push(field(key, kind, undefined))\n }\n return { type: \"object\", fields }\n }\n return { type: \"json\" }\n}\n\nfunction field(key: string, kind: FieldKind, json: JsonSchema | undefined, required = false): CliField {\n const has = json !== undefined && Object.hasOwn(json, \"default\")\n return {\n key,\n flag: toKebab(key),\n kind,\n description: typeof json?.description === \"string\" ? json.description : undefined,\n required,\n hasDefault: has,\n default: has ? json!.default : undefined,\n }\n}\n\n/** camelCase → kebab-case (userId → user-id · URLPath → url-path) */\nexport function toKebab(key: string): string {\n return key\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z])([A-Z][a-z])/g, \"$1-$2\")\n .toLowerCase()\n}\n\nconst FLAG_PATTERN = /^[a-z0-9]+(?:[-_][a-z0-9]+)*$/\n\n/** JSON Schema 의 객체 (nullable 이면 anyOf 안) */\nfunction objectSchema(json: JsonSchema | undefined): JsonSchema | undefined {\n if (!json) return undefined\n if (typeof json.properties === \"object\" && json.properties !== null) return json\n for (const key of [\"anyOf\", \"oneOf\"]) {\n const list = json[key]\n if (Array.isArray(list)) {\n const found = list.find((s) => typeof s === \"object\" && s !== null && \"properties\" in s) as JsonSchema | undefined\n if (found) return found\n }\n }\n return undefined\n}\n\nfunction propertiesOf(json: JsonSchema | undefined): { props: Record<string, JsonSchema>; required: string[] } {\n const obj = objectSchema(json)\n return {\n props: (obj?.properties as Record<string, JsonSchema> | undefined) ?? {},\n required: Array.isArray(obj?.required) ? (obj!.required as string[]) : [],\n }\n}\n\n/**\n * input 스키마 → CLI 필드. problems = 변환 불가 (any · 함수 등) · 플래그로 쓸 수 없는 키 · 플래그 충돌 · 예약 플래그.\n * jsonSchema = input JSON Schema (io input). 설명 · 기본값 · 필수 여부의 원본\n */\nexport function analyzeInput(\n schema: InputSchema,\n jsonSchema: JsonSchema | undefined,\n positional: readonly string[] = [],\n): { spec: CliSpec; problems: string[] } {\n const problems: string[] = []\n const fields: CliField[] = []\n const { props, required } = propertiesOf(jsonSchema)\n const shape = (schema as unknown as ZodLike)._zod.def.shape ?? {}\n const flags = new Map<string, string>()\n\n for (const [key, sub] of Object.entries(shape)) {\n const kind = analyze(sub, true)\n if (kind.type === \"unconvertible\") {\n problems.push(`input \"${key}\": z.${kind.zodType}() is not convertible to CLI flags`)\n continue\n }\n const f = field(key, kind, props[key], required.includes(key))\n if (!FLAG_PATTERN.test(f.flag)) {\n problems.push(`input \"${key}\": key cannot be a CLI flag (use camelCase letters and digits)`)\n continue\n }\n if (RESERVED_FLAGS.includes(f.flag)) {\n problems.push(`input \"${key}\": --${f.flag} is reserved by the CLI`)\n continue\n }\n const other = flags.get(f.flag)\n if (other !== undefined) {\n problems.push(`input \"${key}\": --${f.flag} collides with input \"${other}\"`)\n continue\n }\n if (kind.type === \"object\") {\n const sub = propertiesOf(props[key])\n const subFlags = new Set<string>()\n const subs: CliField[] = []\n for (const s of kind.fields) {\n const sf = field(s.key, s.kind, sub.props[s.key], sub.required.includes(s.key))\n if (!FLAG_PATTERN.test(sf.flag)) {\n problems.push(`input \"${key}.${s.key}\": key cannot be a CLI flag (use camelCase letters and digits)`)\n continue\n }\n if (subFlags.has(sf.flag)) {\n problems.push(`input \"${key}.${s.key}\": --${f.flag}.${sf.flag} collides with another key`)\n continue\n }\n subFlags.add(sf.flag)\n subs.push(sf)\n }\n f.kind = { type: \"object\", fields: subs }\n }\n flags.set(f.flag, key)\n fields.push(f)\n }\n\n // --no-x 와 같은 이름의 플래그가 있으면 모호\n for (const f of fields) {\n if (f.flag.startsWith(\"no-\") && isBooleanKind(fields.find((g) => g.flag === f.flag.slice(3))?.kind)) {\n problems.push(`input \"${f.key}\": --${f.flag} collides with the negation of --${f.flag.slice(3)}`)\n }\n }\n\n return { spec: { fields, positional: [...positional] }, problems }\n}\n\nfunction isBooleanKind(kind: FieldKind | undefined): boolean {\n return kind?.type === \"boolean\" || (kind?.type === \"array\" && kind.item.type === \"boolean\")\n}\n\nconst specCache = new WeakMap<RegisteredCommand, { spec: CliSpec; problems: string[] }>()\n\nfunction analyzed(entry: RegisteredCommand): { spec: CliSpec; problems: string[] } {\n let result = specCache.get(entry)\n if (!result) {\n result = analyzeInput(entry.command.input, entry.inputSchema, entry.command.positional)\n specCache.set(entry, result)\n }\n return result\n}\n\n/**\n * Registry 밖 명령어 (원격 help 로 만든 항목) 의 CLI 필드 지정. 이후 cliSpec · parseArgs · help 가 이 값을 쓴다.\n * 로컬 명령어는 Zod 스키마로 분석하므로 쓰지 않는다\n */\nexport function defineCliSpec(entry: RegisteredCommand, spec: CliSpec): void {\n specCache.set(entry, { spec, problems: [] })\n}\n\n// ---------------------------------------------------------------- JSON Schema 분석 (원격)\n\n/**\n * input JSON Schema (원격 help 의 inputSchema) → CLI 필드. 로컬 (Zod) 분석과 같은 규칙을 JSON Schema 모양으로:\n * type string · number · integer · boolean · enum · const · 리터럴 anyOf = 원시, nullable (anyOf null) 은 벗김,\n * 원시 배열 = 반복, 최상위 1단 객체 (하위 전부 원시 · 원시 배열) = 점 플래그, 그 외 = JSON 문자열.\n * 플래그로 쓸 수 없는 키 · 예약 플래그 · 충돌 키는 건너뛴다 (--input-json 으로 전달)\n */\nexport function cliSpecFromJsonSchema(jsonSchema: JsonSchema, positional: readonly string[] = []): CliSpec {\n const { props, required } = propertiesOf(jsonSchema)\n const fields: CliField[] = []\n const flags = new Set<string>()\n for (const [key, sub] of Object.entries(props)) {\n const kind = jsonKind(sub, true)\n const f = field(key, kind, sub, required.includes(key))\n if (!FLAG_PATTERN.test(f.flag) || RESERVED_FLAGS.includes(f.flag) || flags.has(f.flag)) continue\n if (kind.type === \"object\") {\n const subProps = propertiesOf(stripNullable(sub))\n const subs: CliField[] = []\n const subFlags = new Set<string>()\n for (const s of kind.fields) {\n const sf = field(s.key, s.kind, subProps.props[s.key], subProps.required.includes(s.key))\n if (!FLAG_PATTERN.test(sf.flag) || subFlags.has(sf.flag)) continue\n subFlags.add(sf.flag)\n subs.push(sf)\n }\n f.kind = { type: \"object\", fields: subs }\n }\n flags.add(f.flag)\n fields.push(f)\n }\n return { fields, positional: positional.filter((k) => fields.some((f) => f.key === k)) }\n}\n\nfunction isJsonObject(value: unknown): value is JsonSchema {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction isPrimitive(value: unknown): value is Primitive {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\"\n}\n\n/** anyOf · oneOf 에서 { type: \"null\" } 을 뺀 나머지가 하나면 그것, type 배열의 \"null\" 제거 */\nfunction stripNullable(schema: JsonSchema): JsonSchema {\n for (const key of [\"anyOf\", \"oneOf\"]) {\n const list = schema[key]\n if (!Array.isArray(list)) continue\n const rest = list.filter((s) => !(isJsonObject(s) && s.type === \"null\"))\n if (rest.length === 1 && rest.length < list.length && isJsonObject(rest[0])) return rest[0]\n }\n if (Array.isArray(schema.type)) {\n const types = schema.type.filter((t) => t !== \"null\")\n if (types.length === 1) return { ...schema, type: types[0] }\n }\n return schema\n}\n\nfunction jsonLiterals(schema: JsonSchema): Primitive[] | undefined {\n if (Array.isArray(schema.enum)) return schema.enum.every(isPrimitive) ? [...new Set(schema.enum)] : undefined\n if (\"const\" in schema) return isPrimitive(schema.const) ? [schema.const] : undefined\n for (const key of [\"anyOf\", \"oneOf\"]) {\n const list = schema[key]\n if (!Array.isArray(list)) continue\n const out: Primitive[] = []\n for (const option of list) {\n const values = isJsonObject(option) ? jsonLiterals(option) : undefined\n if (!values) return undefined\n out.push(...values)\n }\n return [...new Set(out)]\n }\n return undefined\n}\n\nfunction jsonScalar(raw: unknown): ScalarKind | undefined {\n if (!isJsonObject(raw)) return undefined\n const schema = stripNullable(raw)\n const values = jsonLiterals(schema)\n if (values) return { type: \"enum\", values }\n switch (schema.type) {\n case \"string\":\n return { type: \"string\" }\n case \"number\":\n case \"integer\":\n return { type: \"number\" }\n case \"boolean\":\n return { type: \"boolean\" }\n }\n return undefined\n}\n\nfunction jsonKind(raw: unknown, topLevel: boolean): FieldKind {\n const scalar = jsonScalar(raw)\n if (scalar) return scalar\n if (!isJsonObject(raw)) return { type: \"json\" }\n const schema = stripNullable(raw)\n if (schema.type === \"array\" && isJsonObject(schema.items)) {\n const item = jsonScalar(schema.items)\n return item ? { type: \"array\", item } : { type: \"json\" }\n }\n if (topLevel && schema.type === \"object\" && isJsonObject(schema.properties)) {\n const fields: CliField[] = []\n for (const [key, sub] of Object.entries(schema.properties)) {\n const kind = jsonKind(sub, false)\n if (kind.type === \"json\" || kind.type === \"object\") return { type: \"json\" }\n fields.push(field(key, kind, undefined))\n }\n return { type: \"object\", fields }\n }\n return { type: \"json\" }\n}\n\n/** 명령어의 CLI 필드 (캐시) */\nexport function cliSpec(entry: RegisteredCommand): CliSpec {\n return analyzed(entry).spec\n}\n\n/** Registry 전체의 CLI 변환 불가 문제 (빌드 오류 issues) */\nexport function cliBuildIssues(registry: Registry): BuildIssue[] {\n const issues: BuildIssue[] = []\n for (const entry of registry.commands.values()) {\n for (const message of analyzed(entry).problems) {\n issues.push({ code: \"CLI_UNCONVERTIBLE\", message, id: entry.id, file: entry.file })\n }\n }\n return issues\n}\n\n/** 변환 불가 타입이 있으면 MextBuildError */\nexport function assertCliConvertible(registry: Registry): void {\n const issues = cliBuildIssues(registry)\n if (issues.length > 0) throw new MextBuildError(issues)\n}\n\n// ---------------------------------------------------------------- 파서\n\ninterface Resolved {\n field: CliField\n sub?: CliField\n negated: boolean\n}\n\nfunction resolveFlag(spec: CliSpec, name: string): Resolved | undefined {\n const top = spec.fields.find((f) => f.flag === name)\n if (top) return { field: top, negated: false }\n const dot = name.indexOf(\".\")\n if (dot > 0) {\n const parent = spec.fields.find((f) => f.flag === name.slice(0, dot))\n if (parent?.kind.type === \"object\") {\n const sub = parent.kind.fields.find((f) => f.flag === name.slice(dot + 1))\n if (sub) return { field: parent, sub, negated: false }\n }\n }\n if (name.startsWith(\"no-\")) {\n const r = resolveFlag(spec, name.slice(3))\n if (r && !r.negated && isBooleanKind((r.sub ?? r.field).kind)) return { ...r, negated: true }\n }\n return undefined\n}\n\n/** 사용 가능한 플래그 이름 전체 (제안용) */\nfunction allFlags(spec: CliSpec): string[] {\n const out: string[] = []\n for (const f of spec.fields) {\n out.push(f.flag)\n if (isBooleanKind(f.kind)) out.push(`no-${f.flag}`)\n if (f.kind.type === \"object\") {\n for (const s of f.kind.fields) {\n out.push(`${f.flag}.${s.flag}`)\n if (isBooleanKind(s.kind)) out.push(`no-${f.flag}.${s.flag}`)\n }\n }\n }\n return [...out, ...RESERVED_FLAGS]\n}\n\nfunction coerceScalar(kind: ScalarKind, raw: string): unknown {\n switch (kind.type) {\n case \"string\":\n return raw\n case \"number\": {\n const n = Number(raw)\n return raw.trim() !== \"\" && Number.isFinite(n) ? n : raw\n }\n case \"boolean\":\n return raw === \"true\" ? true : raw === \"false\" ? false : raw\n case \"enum\":\n return kind.values.find((v) => String(v) === raw) ?? raw\n }\n}\n\n/** 원시 · 배열 · 객체 · JSON 필드 종류에 맞춘 문자열 변환. JSON 파싱 실패 = undefined (호출자가 오류) */\nexport function coerceValue(kind: FieldKind, raw: string): { ok: true; value: unknown } | { ok: false } {\n if (kind.type === \"array\") return { ok: true, value: coerceScalar(kind.item, raw) }\n if (kind.type === \"object\" || kind.type === \"json\") {\n try {\n return { ok: true, value: JSON.parse(raw) }\n } catch {\n return { ok: false }\n }\n }\n return { ok: true, value: coerceScalar(kind, raw) }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\n/** 파서 단계 INVALID_ARGUMENT */\nexport function argumentError(entry: RegisteredCommand, issues: ArgumentIssue[]): MextError<\"INVALID_ARGUMENT\"> {\n return new MextError(\n \"INVALID_ARGUMENT\",\n `Invalid arguments for ${entry.id}: ${issues.map((i) => i.message).join(\"; \")}`,\n {\n command: entry.id,\n missing_fields: [],\n issues,\n expected_schema: entry.inputSchema,\n examples: [...entry.command.examples],\n },\n )\n}\n\n/**\n * 명령어 경로 뒤의 argv → 원본 입력.\n * --flag v · --flag=v · boolean --x · --x=true|false · --no-x · 반복 (배열) · --obj.key v · JSON 문자열 ·\n * --input-json <json|-> · - (stdin) · positional · -- 이후 = positional. 모르는 플래그는 항상 오류.\n * 개별 플래그는 --input-json · stdin 입력의 같은 키를 덮어쓴다 (점 플래그는 객체 안에 병합).\n */\nexport async function parseArgs(\n entry: RegisteredCommand,\n argv: readonly string[],\n options: ParseArgsOptions = {},\n): Promise<ParsedArgs> {\n const spec = cliSpec(entry)\n const fail = (path: string, code: string, message: string): never => {\n throw argumentError(entry, [{ path, code, message }])\n }\n const values: Record<string, unknown> = {}\n const given = new Set<string>() // 지정된 경로 (배열 제외). \"filter\" = JSON 전체 · \"filter.status\" = 점 플래그\n const flags = { json: false, yes: false, help: false }\n const positionals: string[] = []\n let source: { kind: \"json\"; text: string } | { kind: \"stdin\" } | undefined\n let rest = false\n\n const setInput = (next: NonNullable<typeof source>, label: string): void => {\n if (source) fail(\"\", \"duplicate_input\", `${label}: whole input given more than once (--input-json · -)`)\n source = next\n }\n\n const assign = (r: Resolved, value: unknown, label: string): void => {\n const target = r.sub ?? r.field\n const path = r.sub ? `${r.field.key}.${r.sub.key}` : r.field.key\n if (r.sub) {\n if (given.has(r.field.key)) fail(path, \"conflict\", `${label} cannot be combined with --${r.field.flag} <json>`)\n } else if (r.field.kind.type === \"object\" && [...given].some((p) => p.startsWith(`${r.field.key}.`))) {\n fail(path, \"conflict\", `${label} <json> cannot be combined with --${r.field.flag}.<key>`)\n }\n let container = values\n if (r.sub) {\n const existing = values[r.field.key]\n if (!isPlainObject(existing)) values[r.field.key] = {}\n container = values[r.field.key] as Record<string, unknown>\n }\n if (target.kind.type === \"array\") {\n const list = container[target.key]\n if (Array.isArray(list)) list.push(value)\n else container[target.key] = [value]\n return\n }\n if (given.has(path)) fail(path, \"duplicate_flag\", `${label} given more than once`)\n given.add(path)\n container[target.key] = value\n }\n\n const coerce = (r: Resolved, raw: string, label: string): unknown => {\n const kind = r.sub ? r.sub.kind : r.field.kind\n const result = coerceValue(kind, raw)\n if (!result.ok) {\n return fail(r.sub ? `${r.field.key}.${r.sub.key}` : r.field.key, \"invalid_json\", `${label}: value is not valid JSON`)\n }\n return result.value\n }\n\n for (let i = 0; i < argv.length; i++) {\n const tok = argv[i]!\n if (rest) {\n positionals.push(tok)\n continue\n }\n if (tok === \"--\") {\n rest = true\n continue\n }\n if (tok === \"-\") {\n setInput({ kind: \"stdin\" }, \"-\")\n continue\n }\n if (tok === \"-h\") {\n flags.help = true\n continue\n }\n if (tok.startsWith(\"--\")) {\n const body = tok.slice(2)\n const eq = body.indexOf(\"=\")\n const name = eq < 0 ? body : body.slice(0, eq)\n const inline = eq < 0 ? undefined : body.slice(eq + 1)\n const label = `--${name}`\n const takeValue = (): string => {\n if (inline !== undefined) return inline\n const next = argv[i + 1]\n if (next === undefined || (next.startsWith(\"--\") && next.length > 2)) {\n return fail(\"\", \"missing_value\", `${label} requires a value`)\n }\n i++\n return next\n }\n if (name === \"help\" || name === \"json\" || name === \"yes\") {\n if (inline !== undefined) fail(\"\", \"unexpected_value\", `${label} does not take a value`)\n flags[name] = true\n continue\n }\n if (name === \"input-json\") {\n const text = takeValue()\n setInput(text === \"-\" ? { kind: \"stdin\" } : { kind: \"json\", text }, label)\n continue\n }\n const r = resolveFlag(spec, name)\n if (!r) {\n const suggested = closest(name, allFlags(spec).map((f): [string, string] => [f, f]))\n const hint = suggested.length > 0 ? ` Did you mean --${suggested[0]}?` : \"\"\n return fail(\"\", \"unknown_flag\", `unknown flag ${label}.${hint}`)\n }\n const kind = (r.sub ?? r.field).kind\n if (isBooleanKind(kind)) {\n if (r.negated) {\n if (inline !== undefined) fail(\"\", \"unexpected_value\", `${label} does not take a value`)\n assign(r, false, label)\n } else {\n assign(r, inline === undefined ? true : coerceScalar({ type: \"boolean\" }, inline), label)\n }\n continue\n }\n assign(r, coerce(r, takeValue(), label), label)\n continue\n }\n if (tok.startsWith(\"-\") && !/^-[\\d.]/.test(tok)) {\n fail(\"\", \"unknown_flag\", `unknown flag ${tok} (short flags are not supported)`)\n }\n positionals.push(tok)\n }\n\n // positional\n let p = 0\n for (let k = 0; k < spec.positional.length && p < positionals.length; k++) {\n const f = spec.fields.find((x) => x.key === spec.positional[k])\n if (!f) continue\n const r: Resolved = { field: f, negated: false }\n const label = `<${f.flag}>`\n const variadic = f.kind.type === \"array\" && k === spec.positional.length - 1\n do {\n assign(r, coerce(r, positionals[p]!, label), label)\n p++\n } while (variadic && p < positionals.length)\n }\n if (p < positionals.length) fail(\"\", \"unexpected_argument\", `unexpected argument \"${positionals[p]}\"`)\n\n let input: unknown = values\n if (source) {\n const text = source.kind === \"stdin\" ? await (options.readStdin ?? (async () => \"\"))() : source.text\n let base: unknown\n try {\n base = JSON.parse(text)\n } catch {\n return fail(\"\", \"invalid_json\", `${source.kind === \"stdin\" ? \"stdin\" : \"--input-json\"} is not valid JSON`)\n }\n if (Object.keys(values).length === 0) input = base\n else if (!isPlainObject(base)) {\n fail(\"\", \"invalid_json\", \"whole input must be a JSON object to combine with flags\")\n } else {\n const merged: Record<string, unknown> = { ...base }\n for (const [key, value] of Object.entries(values)) {\n // 점 플래그로 모은 객체는 병합, 그 외 (JSON 문자열 포함) 는 덮어쓰기\n const dotted = !given.has(key) && spec.fields.find((x) => x.key === key)?.kind.type === \"object\"\n merged[key] = dotted && isPlainObject(base[key]) && isPlainObject(value) ? { ...base[key], ...value } : value\n }\n input = merged\n }\n }\n\n return { input, ...flags }\n}\n"]}
package/dist/cli/build.js CHANGED
@@ -44,7 +44,19 @@ export function formatBuildSummary(result, cwd) {
44
44
  ]).map((l) => ` ${l}`),
45
45
  "",
46
46
  ...(manifest.routes?.length
47
- ? [...table([["Route", "Methods"], ...manifest.routes.map((r) => [r.path, r.methods.join(" · ")])]).map((l) => ` ${l}`), ""]
47
+ ? [
48
+ ...table([
49
+ ["Route", "Methods", "Auth", "Origin", "Body"],
50
+ ...manifest.routes.map((r) => [
51
+ r.path,
52
+ r.methods.join(" · "),
53
+ r.auth === "optional" ? "optional" : r.auth === true ? "yes" : "-",
54
+ r.origin === true ? "yes" : "-",
55
+ typeof r.maxBodyBytes === "number" ? formatBytes(r.maxBodyBytes) : "-",
56
+ ]),
57
+ ]).map((l) => ` ${l}`),
58
+ "",
59
+ ]
48
60
  : []),
49
61
  `Start: ${runtimeExec} ${dir}/server.js [--stdio]`,
50
62
  ];
@@ -78,7 +90,7 @@ export function buildHelp() {
78
90
  "",
79
91
  "Output (.mext/):",
80
92
  ...table([
81
- ["manifest.json", "schemaVersion · mextVersion · buildId · manifestHash · namespaces · commands · resources · prompts · routes (+ module)"],
93
+ ["manifest.json", "schemaVersion · mextVersion · buildId · manifestHash · namespaces · commands · resources · prompts · routes (+ module · auth · origin · maxBodyBytes)"],
82
94
  ["server.js", "node .mext/server.js [--stdio]. PORT · HOST environment variables"],
83
95
  ["handler.js", "export default { fetch(request) } (Web Request → Response)"],
84
96
  ["config.js", "mext.config.ts bundle (when present)"],
@@ -98,4 +110,12 @@ export function buildHelp() {
98
110
  ];
99
111
  return `${lines.join("\n")}\n`;
100
112
  }
113
+ /** 본문 상한 표시: 1 KiB · 1 MiB 단위로 나누어 떨어지면 그 단위, 아니면 바이트 */
114
+ function formatBytes(bytes) {
115
+ if (bytes % (1024 * 1024) === 0)
116
+ return `${bytes / 1024 / 1024} MiB`;
117
+ if (bytes % 1024 === 0)
118
+ return `${bytes / 1024} KiB`;
119
+ return `${bytes} B`;
120
+ }
101
121
  //# sourceMappingURL=build.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"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","sourcesContent":["import { relative } from \"node:path\"\nimport { buildProject, type BuildOptions, type BuildResult } from \"../build.ts\"\nimport type { BuildManifestCommand } from \"../manifest.ts\"\nimport { runtimeExec } from \"../runtime.ts\"\nimport { table } from \"./help.ts\"\nimport type { CliIo } from \"./io.ts\"\nimport { EXIT, exitCodeOf, formatError } from \"./output.ts\"\n\nexport const BUILD_PROG = \"mext build\"\n\n/**\n * mext build: commands/ → .mext/. 경고 · 오류 = stderr, 성공 요약 · 명령어 표 = stdout.\n * 검증 오류는 MextBuildError 하나에 모아 한 번에 출력, exit 1\n */\nexport async function runBuild(argv: readonly string[], io: CliIo, options: Omit<BuildOptions, \"cwd\"> = {}): Promise<number> {\n for (const tok of argv) {\n if (tok === \"--help\" || tok === \"-h\") {\n io.stdout.write(buildHelp())\n return EXIT.ok\n }\n io.stderr.write(`error: unexpected argument \"${tok}\"\\nRun \"${BUILD_PROG} --help\" for usage.\\n`)\n return EXIT.usage\n }\n let result: BuildResult\n try {\n result = await buildProject({ ...options, cwd: io.cwd })\n } catch (error) {\n io.stderr.write(formatError(error, BUILD_PROG))\n return exitCodeOf(error)\n }\n for (const w of result.warnings) io.stderr.write(`warning: ${w.message}\\n`)\n io.stdout.write(formatBuildSummary(result, io.cwd))\n return EXIT.ok\n}\n\n/** 성공 요약 + 명령어 표 (ID · 안전성 · scopes), next build 의 route 표와 같은 역할 */\nexport function formatBuildSummary(result: BuildResult, cwd: string): string {\n const { manifest } = result\n const dir = relative(cwd, result.outDir) || \".\"\n const n = manifest.commands.length\n const lines = [\n `Built ${dir}/ (${n} command${n === 1 ? \"\" : \"s\"}, buildId ${manifest.buildId})`,\n \"\",\n ...table([\n [\"Command\", \"Safety\", \"Scopes\"],\n ...manifest.commands.map((c) => [c.id, safetyOf(c), c.scopes.join(\", \") || \"-\"]),\n ]).map((l) => ` ${l}`),\n \"\",\n ...(manifest.routes?.length\n ? [...table([[\"Route\", \"Methods\"], ...manifest.routes.map((r) => [r.path, r.methods.join(\" · \")])]).map((l) => ` ${l}`), \"\"]\n : []),\n `Start: ${runtimeExec} ${dir}/server.js [--stdio]`,\n ]\n const cli = result.cli\n if (cli) {\n const kb = (cli.size / 1024).toFixed(1)\n lines.push(\n `Customer CLI: ${dir}/cli/ (${cli.packageName}@${cli.version}, bin ${cli.bin}, ${cli.form}, ${kb} KB). Publish: npm publish ${dir}/cli`,\n )\n }\n const local = result.localBin\n if (local) lines.push(`Local bin: ${dir}/bin.js (bin ${local.bin}@${local.version}). Run: ${local.bin} help (after npm link · npm install -g)`)\n if (result.types !== undefined) lines.push(`Types: ${relative(cwd, result.types) || result.types} (createClient<Commands>() from \"@obov/mext/client\")`)\n return `${lines.join(\"\\n\")}\\n`\n}\n\n/** readOnly · destructive · confirm (조건식 = confirm?). 아무것도 없으면 write */\nfunction safetyOf(c: BuildManifestCommand): string {\n const flags = [\n ...(c.readOnly ? [\"readOnly\"] : []),\n ...(c.destructive ? [\"destructive\"] : []),\n ...(c.requiresConfirmation ? [\"confirm\"] : c.needsApproval !== undefined ? [\"confirm?\"] : []),\n ]\n return flags.length === 0 ? \"write\" : flags.join(\" · \")\n}\n\nexport function buildHelp(): string {\n const lines = [\n \"Build commands/ into .mext/ for production (mext start · node .mext/server.js).\",\n \"\",\n \"Usage:\",\n ` ${BUILD_PROG}`,\n \"\",\n \"Output (.mext/):\",\n ...table([\n [\"manifest.json\", \"schemaVersion · mextVersion · buildId · manifestHash · namespaces · commands · resources · prompts · routes (+ module)\"],\n [\"server.js\", \"node .mext/server.js [--stdio]. PORT · HOST environment variables\"],\n [\"handler.js\", \"export default { fetch(request) } (Web Request → Response)\"],\n [\"config.js\", \"mext.config.ts bundle (when present)\"],\n [\"instrumentation.js\", \"instrumentation.ts bundle (when present)\"],\n [\"commands/**/*.js\", \"one module per command\"],\n [\"resources/**/*.js\", \"one module per MCP resource (resources/, when present)\"],\n [\"prompts/**/*.js\", \"one module per MCP prompt (prompts/, when present)\"],\n [\"routes/**/*.js\", \"one module per HTTP route (routes/, when present)\"],\n [\"chunks/\", \"shared code\"],\n [\"cli/\", \"customer CLI npm package (when mext.config.ts has cli): package.json · bin.js · README.md\"],\n [\"bin.js\", \"local bin (cli.local: true, instead of cli/). package.json bin points here\"],\n [\"cli-errors.js\", \"cli.errors bundle for the local bin\"],\n ]).map((l) => ` ${l}`),\n \"\",\n \"Requires rolldown (npm install --save-dev rolldown). Package imports stay external.\",\n \"All validation errors are reported at once (exit 1).\",\n ]\n return `${lines.join(\"\\n\")}\\n`\n}\n"]}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"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","sourcesContent":["import { relative } from \"node:path\"\nimport { buildProject, type BuildOptions, type BuildResult } from \"../build.ts\"\nimport type { BuildManifestCommand } from \"../manifest.ts\"\nimport { runtimeExec } from \"../runtime.ts\"\nimport { table } from \"./help.ts\"\nimport type { CliIo } from \"./io.ts\"\nimport { EXIT, exitCodeOf, formatError } from \"./output.ts\"\n\nexport const BUILD_PROG = \"mext build\"\n\n/**\n * mext build: commands/ → .mext/. 경고 · 오류 = stderr, 성공 요약 · 명령어 표 = stdout.\n * 검증 오류는 MextBuildError 하나에 모아 한 번에 출력, exit 1\n */\nexport async function runBuild(argv: readonly string[], io: CliIo, options: Omit<BuildOptions, \"cwd\"> = {}): Promise<number> {\n for (const tok of argv) {\n if (tok === \"--help\" || tok === \"-h\") {\n io.stdout.write(buildHelp())\n return EXIT.ok\n }\n io.stderr.write(`error: unexpected argument \"${tok}\"\\nRun \"${BUILD_PROG} --help\" for usage.\\n`)\n return EXIT.usage\n }\n let result: BuildResult\n try {\n result = await buildProject({ ...options, cwd: io.cwd })\n } catch (error) {\n io.stderr.write(formatError(error, BUILD_PROG))\n return exitCodeOf(error)\n }\n for (const w of result.warnings) io.stderr.write(`warning: ${w.message}\\n`)\n io.stdout.write(formatBuildSummary(result, io.cwd))\n return EXIT.ok\n}\n\n/** 성공 요약 + 명령어 표 (ID · 안전성 · scopes), next build 의 route 표와 같은 역할 */\nexport function formatBuildSummary(result: BuildResult, cwd: string): string {\n const { manifest } = result\n const dir = relative(cwd, result.outDir) || \".\"\n const n = manifest.commands.length\n const lines = [\n `Built ${dir}/ (${n} command${n === 1 ? \"\" : \"s\"}, buildId ${manifest.buildId})`,\n \"\",\n ...table([\n [\"Command\", \"Safety\", \"Scopes\"],\n ...manifest.commands.map((c) => [c.id, safetyOf(c), c.scopes.join(\", \") || \"-\"]),\n ]).map((l) => ` ${l}`),\n \"\",\n ...(manifest.routes?.length\n ? [\n ...table([\n [\"Route\", \"Methods\", \"Auth\", \"Origin\", \"Body\"],\n ...manifest.routes.map((r) => [\n r.path,\n r.methods.join(\" · \"),\n r.auth === \"optional\" ? \"optional\" : r.auth === true ? \"yes\" : \"-\",\n r.origin === true ? \"yes\" : \"-\",\n typeof r.maxBodyBytes === \"number\" ? formatBytes(r.maxBodyBytes) : \"-\",\n ]),\n ]).map((l) => ` ${l}`),\n \"\",\n ]\n : []),\n `Start: ${runtimeExec} ${dir}/server.js [--stdio]`,\n ]\n const cli = result.cli\n if (cli) {\n const kb = (cli.size / 1024).toFixed(1)\n lines.push(\n `Customer CLI: ${dir}/cli/ (${cli.packageName}@${cli.version}, bin ${cli.bin}, ${cli.form}, ${kb} KB). Publish: npm publish ${dir}/cli`,\n )\n }\n const local = result.localBin\n if (local) lines.push(`Local bin: ${dir}/bin.js (bin ${local.bin}@${local.version}). Run: ${local.bin} help (after npm link · npm install -g)`)\n if (result.types !== undefined) lines.push(`Types: ${relative(cwd, result.types) || result.types} (createClient<Commands>() from \"@obov/mext/client\")`)\n return `${lines.join(\"\\n\")}\\n`\n}\n\n/** readOnly · destructive · confirm (조건식 = confirm?). 아무것도 없으면 write */\nfunction safetyOf(c: BuildManifestCommand): string {\n const flags = [\n ...(c.readOnly ? [\"readOnly\"] : []),\n ...(c.destructive ? [\"destructive\"] : []),\n ...(c.requiresConfirmation ? [\"confirm\"] : c.needsApproval !== undefined ? [\"confirm?\"] : []),\n ]\n return flags.length === 0 ? \"write\" : flags.join(\" · \")\n}\n\nexport function buildHelp(): string {\n const lines = [\n \"Build commands/ into .mext/ for production (mext start · node .mext/server.js).\",\n \"\",\n \"Usage:\",\n ` ${BUILD_PROG}`,\n \"\",\n \"Output (.mext/):\",\n ...table([\n [\"manifest.json\", \"schemaVersion · mextVersion · buildId · manifestHash · namespaces · commands · resources · prompts · routes (+ module · auth · origin · maxBodyBytes)\"],\n [\"server.js\", \"node .mext/server.js [--stdio]. PORT · HOST environment variables\"],\n [\"handler.js\", \"export default { fetch(request) } (Web Request → Response)\"],\n [\"config.js\", \"mext.config.ts bundle (when present)\"],\n [\"instrumentation.js\", \"instrumentation.ts bundle (when present)\"],\n [\"commands/**/*.js\", \"one module per command\"],\n [\"resources/**/*.js\", \"one module per MCP resource (resources/, when present)\"],\n [\"prompts/**/*.js\", \"one module per MCP prompt (prompts/, when present)\"],\n [\"routes/**/*.js\", \"one module per HTTP route (routes/, when present)\"],\n [\"chunks/\", \"shared code\"],\n [\"cli/\", \"customer CLI npm package (when mext.config.ts has cli): package.json · bin.js · README.md\"],\n [\"bin.js\", \"local bin (cli.local: true, instead of cli/). package.json bin points here\"],\n [\"cli-errors.js\", \"cli.errors bundle for the local bin\"],\n ]).map((l) => ` ${l}`),\n \"\",\n \"Requires rolldown (npm install --save-dev rolldown). Package imports stay external.\",\n \"All validation errors are reported at once (exit 1).\",\n ]\n return `${lines.join(\"\\n\")}\\n`\n}\n\n/** 본문 상한 표시: 1 KiB · 1 MiB 단위로 나누어 떨어지면 그 단위, 아니면 바이트 */\nfunction formatBytes(bytes: number): string {\n if (bytes % (1024 * 1024) === 0) return `${bytes / 1024 / 1024} MiB`\n if (bytes % 1024 === 0) return `${bytes / 1024} KiB`\n return `${bytes} B`\n}\n"]}