@obov/mext 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/approval.d.ts +33 -0
- package/dist/approval.js +36 -0
- package/dist/approval.js.map +1 -0
- package/dist/audit.d.ts +123 -0
- package/dist/audit.js +221 -0
- package/dist/audit.js.map +1 -0
- package/dist/build-cli.d.ts +1 -0
- package/dist/build-cli.js.map +1 -1
- package/dist/build.d.ts +2 -0
- package/dist/build.js +30 -3
- package/dist/build.js.map +1 -1
- package/dist/caller.d.ts +53 -0
- package/dist/caller.js +51 -0
- package/dist/caller.js.map +1 -0
- package/dist/cli/build.js +4 -2
- package/dist/cli/build.js.map +1 -1
- package/dist/cli/dev-audit.d.ts +25 -0
- package/dist/cli/dev-audit.js +84 -0
- package/dist/cli/dev-audit.js.map +1 -0
- package/dist/cli/dev-lock.d.ts +3 -1
- package/dist/cli/dev-lock.js +12 -5
- package/dist/cli/dev-lock.js.map +1 -1
- package/dist/cli/dev-server.d.ts +9 -0
- package/dist/cli/dev-server.js +24 -1
- package/dist/cli/dev-server.js.map +1 -1
- package/dist/cli/dev-tap.d.ts +20 -0
- package/dist/cli/dev-tap.js +70 -0
- package/dist/cli/dev-tap.js.map +1 -0
- package/dist/cli/dev.js +16 -4
- package/dist/cli/dev.js.map +1 -1
- package/dist/cli/help.js +2 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/inspect.d.ts +7 -0
- package/dist/cli/inspect.js +699 -0
- package/dist/cli/inspect.js.map +1 -0
- package/dist/cli/main.js +8 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/output.d.ts +1 -1
- package/dist/cli/output.js +3 -2
- package/dist/cli/output.js.map +1 -1
- package/dist/cli/run.js +28 -4
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/types.d.ts +9 -0
- package/dist/cli/types.js +77 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/client/index.d.ts +10 -0
- package/dist/client/index.js +7 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/manifest.js +6 -2
- package/dist/client/manifest.js.map +1 -1
- package/dist/client/runner.js +37 -3
- package/dist/client/runner.js.map +1 -1
- package/dist/client/typed.d.ts +54 -0
- package/dist/client/typed.js +490 -0
- package/dist/client/typed.js.map +1 -0
- package/dist/client/types.d.ts +196 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/command.d.ts +61 -5
- package/dist/command.js +42 -1
- package/dist/command.js.map +1 -1
- package/dist/config.d.ts +42 -10
- package/dist/config.js +32 -7
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts +21 -3
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -1
- package/dist/expose.d.ts +9 -0
- package/dist/expose.js +52 -0
- package/dist/expose.js.map +1 -0
- package/dist/index.d.ts +15 -6
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/inspect/agent.d.ts +104 -0
- package/dist/inspect/agent.js +125 -0
- package/dist/inspect/agent.js.map +1 -0
- package/dist/inspect/audit.d.ts +46 -0
- package/dist/inspect/audit.js +133 -0
- package/dist/inspect/audit.js.map +1 -0
- package/dist/inspect/compare.d.ts +12 -0
- package/dist/inspect/compare.js +31 -0
- package/dist/inspect/compare.js.map +1 -0
- package/dist/inspect/index.d.ts +17 -0
- package/dist/inspect/index.js +12 -0
- package/dist/inspect/index.js.map +1 -0
- package/dist/inspect/inspector.d.ts +168 -0
- package/dist/inspect/inspector.js +392 -0
- package/dist/inspect/inspector.js.map +1 -0
- package/dist/inspect/profiles.d.ts +95 -0
- package/dist/inspect/profiles.js +235 -0
- package/dist/inspect/profiles.js.map +1 -0
- package/dist/inspect/scenario.d.ts +126 -0
- package/dist/inspect/scenario.js +555 -0
- package/dist/inspect/scenario.js.map +1 -0
- package/dist/inspect/ui-server.d.ts +31 -0
- package/dist/inspect/ui-server.js +378 -0
- package/dist/inspect/ui-server.js.map +1 -0
- package/dist/inspect/ui.html +917 -0
- package/dist/instrumentation.d.ts +13 -2
- package/dist/instrumentation.js +11 -1
- package/dist/instrumentation.js.map +1 -1
- package/dist/invoke.d.ts +32 -5
- package/dist/invoke.js +150 -16
- package/dist/invoke.js.map +1 -1
- package/dist/manifest.d.ts +13 -2
- package/dist/manifest.js +5 -1
- package/dist/manifest.js.map +1 -1
- package/dist/mcp/constants.d.ts +5 -0
- package/dist/mcp/constants.js +5 -0
- package/dist/mcp/constants.js.map +1 -1
- package/dist/mcp/dispatch.d.ts +1 -1
- package/dist/mcp/dispatch.js +14 -3
- package/dist/mcp/dispatch.js.map +1 -1
- package/dist/mcp/help.d.ts +2 -0
- package/dist/mcp/help.js +6 -1
- package/dist/mcp/help.js.map +1 -1
- package/dist/mcp/http.d.ts +16 -2
- package/dist/mcp/http.js +76 -7
- package/dist/mcp/http.js.map +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.js +1 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/server.d.ts +12 -1
- package/dist/mcp/server.js +63 -17
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/stdio.d.ts +4 -0
- package/dist/mcp/stdio.js +3 -0
- package/dist/mcp/stdio.js.map +1 -1
- package/dist/mcp/tasks.d.ts +3 -1
- package/dist/mcp/tasks.js +6 -3
- package/dist/mcp/tasks.js.map +1 -1
- package/dist/principal.d.ts +22 -0
- package/dist/principal.js +29 -0
- package/dist/principal.js.map +1 -1
- package/dist/registry.d.ts +5 -0
- package/dist/registry.js +21 -0
- package/dist/registry.js.map +1 -1
- package/dist/remote/client.d.ts +2 -0
- package/dist/remote/client.js +3 -2
- package/dist/remote/client.js.map +1 -1
- package/dist/remote/oauth.d.ts +1 -1
- package/dist/remote/oauth.js +1 -1
- package/dist/remote/oauth.js.map +1 -1
- package/dist/start.js +6 -2
- package/dist/start.js.map +1 -1
- package/dist/suggest.js +1 -1
- package/dist/suggest.js.map +1 -1
- package/dist/typegen.d.ts +27 -0
- package/dist/typegen.js +62 -0
- package/dist/typegen.js.map +1 -0
- package/dist/version-constant.d.ts +5 -0
- package/dist/version-constant.js +6 -0
- package/dist/version-constant.js.map +1 -0
- package/dist/version.d.ts +1 -2
- package/dist/version.js +1 -2
- package/dist/version.js.map +1 -1
- package/package.json +12 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/cli/inspect.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\"\nimport { basename, relative, resolve } from \"node:path\"\nimport { pathToFileURL } from \"node:url\"\nimport { entryFromHelp } from \"../client/runner.ts\"\nimport { CallError } from \"../client/typed.ts\"\nimport type { CommandInfo, CommandList, CommandSummary } from \"../client/types.ts\"\nimport { isMextError } from \"../errors.ts\"\nimport { parentNamespace } from \"../ids.ts\"\nimport {\n createInspector,\n InspectUsageError,\n outcomeOf,\n resolveTarget,\n type Answers,\n type CallRecord,\n type ErrorBody,\n type Inspector,\n type InspectTarget,\n} from \"../inspect/inspector.ts\"\nimport { isAgentClient, type AgentClient, type AgentPluginContext } from \"../inspect/agent.ts\"\nimport { resolveAudit } from \"../inspect/audit.ts\"\nimport { startUiServer, UI_DEFAULT_PORT } from \"../inspect/ui-server.ts\"\nimport { findProfile, INSPECT_DIR, loadProfiles, PROFILES_FILE, ProfileFileError, type ProfileSet } from \"../inspect/profiles.ts\"\nimport {\n appendStep,\n listErrorBody,\n loadScenario,\n runScenario,\n ScenarioFileError,\n scenarioFiles,\n stepFromRecord,\n type Scenario,\n type ScenarioResult,\n type StepResult,\n} from \"../inspect/scenario.ts\"\nimport type { CommandHelp } from \"../mcp/help.ts\"\nimport { parseArgs } from \"./args.ts\"\nimport { table } from \"./help.ts\"\nimport { readAll, type CliIo } from \"./io.ts\"\nimport { EXIT, formatError, formatJson, formatProgress, formatResult } from \"./output.ts\"\n\nexport const INSPECT_PROG = \"mext inspect\"\n\n/**\n * mext inspect <commands|show|call|run|profiles|ui> (specs/inspector.md §3 · §5).\n * 대상 = --url > MEXT_URL > 이 프로젝트의 mext dev. 호출자 = --as <프로필>[,<프로필>…] (inspect/profiles.json)\n */\n\ninterface Flags {\n url?: string\n profiles?: string\n as?: string[]\n json: boolean\n help: boolean\n confirmed: boolean\n decline: boolean\n raw: boolean\n bail: boolean\n answers?: Answers\n save?: string\n port?: string\n agent?: string\n name?: string\n}\n\nconst VALUE_FLAGS = [\"url\", \"profiles\", \"as\", \"answers\", \"save\", \"port\", \"agent\", \"name\"] as const\nconst BOOLEAN_FLAGS = [\"json\", \"confirmed\", \"decline\", \"raw\", \"bail\"] as const\n/** 하위 명령별로 받는 플래그 (공통 제외) */\nconst SUBCOMMAND_FLAGS: Record<string, readonly string[]> = {\n commands: [],\n show: [],\n call: [\"confirmed\", \"decline\", \"raw\", \"answers\", \"save\"],\n run: [\"bail\", \"agent\"],\n profiles: [],\n ui: [\"port\", \"agent\"],\n \"mcp-config\": [\"name\"],\n}\nconst COMMON_FLAGS = [\"url\", \"profiles\", \"as\", \"json\"]\n\nclass UsageError extends Error {}\n\nexport async function inspectCommand(argv: readonly string[], io: CliIo): Promise<number> {\n const json = argv.includes(\"--json\")\n try {\n return await run(argv, io)\n } catch (error) {\n if (error instanceof UsageError) {\n io.stderr.write(`error: ${error.message}\\nRun \"${INSPECT_PROG} --help\" for usage.\\n`)\n return EXIT.usage\n }\n if (error instanceof InspectUsageError || error instanceof ProfileFileError || error instanceof ScenarioFileError) {\n io.stderr.write(`error: ${error.message}\\n`)\n return EXIT.usage\n }\n if (isMextError(error, \"INVALID_ARGUMENT\")) {\n const lines = formatError(error, INSPECT_PROG).trimEnd().split(\"\\n\")\n if (lines.at(-1)?.startsWith(\"Run \")) lines[lines.length - 1] = `Run \"${INSPECT_PROG} show ${error.details.command}\" for the input schema.`\n io.stderr.write(`${lines.join(\"\\n\")}\\n`)\n return EXIT.usage\n }\n const body = listErrorBody(error)\n io.stderr.write(json ? formatJson(body) : `error: ${body.code}: ${body.message}\\n`)\n return EXIT.error\n }\n}\n\nasync function run(argv: readonly string[], io: CliIo): Promise<number> {\n const flags: Flags = { json: false, help: false, confirmed: false, decline: false, raw: false, bail: false }\n const given = new Set<string>()\n const positionals: string[] = []\n /** call 의 <id> 뒤 = 명령어 입력 (mext run 과 같은 플래그). inspect 플래그는 <id> 앞에 둔다 */\n let inputArgv: string[] = []\n for (let i = 0; i < argv.length; i++) {\n const tok = argv[i]!\n if (tok === \"--help\" || tok === \"-h\") {\n flags.help = true\n continue\n }\n if (!tok.startsWith(\"--\")) {\n positionals.push(tok)\n if (positionals[0] === \"call\" && positionals.length === 2) {\n inputArgv = argv.slice(i + 1)\n break\n }\n continue\n }\n const eq = tok.indexOf(\"=\")\n const name = tok.slice(2, eq < 0 ? undefined : eq)\n given.add(name)\n if ((BOOLEAN_FLAGS as readonly string[]).includes(name) && eq < 0) {\n flags[name as (typeof BOOLEAN_FLAGS)[number]] = true\n continue\n }\n if (!(VALUE_FLAGS as readonly string[]).includes(name)) throw new UsageError(`unknown flag --${name}`)\n const value = eq < 0 ? argv[++i] : tok.slice(eq + 1)\n if (value === undefined || value === \"\") throw new UsageError(`--${name} requires a value`)\n if (name === \"as\") {\n flags.as = value\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s !== \"\")\n } else if (name === \"answers\") flags.answers = parseAnswers(value)\n else flags[name as \"url\" | \"profiles\" | \"save\" | \"port\" | \"agent\" | \"name\"] = value\n }\n const [sub, ...args] = positionals\n if (sub === undefined || sub === \"help\") {\n (flags.help || sub === \"help\" ? io.stdout : io.stderr).write(inspectHelp())\n return flags.help || sub === \"help\" ? EXIT.ok : EXIT.usage\n }\n if (flags.help) {\n io.stdout.write(inspectHelp())\n return EXIT.ok\n }\n const allowed = SUBCOMMAND_FLAGS[sub]\n if (!allowed) throw new UsageError(`unknown subcommand \"${sub}\" (commands · show · call · run · profiles · ui · mcp-config)`)\n for (const name of given) {\n if (!COMMON_FLAGS.includes(name) && !allowed.includes(name)) throw new UsageError(`--${name} is not a flag of \"${INSPECT_PROG} ${sub}\"`)\n }\n\n const profiles = loadProfiles(io.cwd, { ...(flags.profiles !== undefined ? { file: flags.profiles } : {}), env: io.env })\n if (sub === \"profiles\") {\n if (args.length > 0) throw new UsageError(`unexpected argument \"${args[0]}\"`)\n return printProfiles(profiles, io, flags.json)\n }\n const target = resolveTarget({ ...(flags.url !== undefined ? { url: flags.url } : {}), env: io.env, cwd: io.cwd })\n if (sub === \"ui\") {\n if (args.length > 0) throw new UsageError(`unexpected argument \"${args[0]}\"`)\n if (flags.as || flags.json) throw new UsageError(`--${flags.as ? \"as\" : \"json\"} is not a flag of \"${INSPECT_PROG} ui\" (pick profiles in the page)`)\n return ui(target, profiles, flags, io)\n }\n // run = 감사 이벤트를 비교한다 (expect.audit · agent 단계): 대상이 이 프로젝트의 mext dev 면 감사 출처를 잇는다\n if (sub === \"mcp-config\") {\n if (args.length > 0) throw new UsageError(`unexpected argument \"${args[0]}\"`)\n return mcpConfig(target, profiles, flags, io)\n }\n const audit = sub === \"run\" ? resolveAudit(target, io.cwd) : undefined\n const inspector = createInspector({ url: target.url, profiles, env: io.env, ...(audit?.available ? { audit: audit.source } : {}) })\n // 이름 확인 (없는 프로필 = 사용법 오류)\n const names = (flags.as ?? [profiles.default]).map((name) => inspector.profile(name).name)\n if (names.length === 0) throw new UsageError(\"--as requires at least one profile name\")\n\n switch (sub) {\n case \"commands\": {\n if (args.length > 1) throw new UsageError(`unexpected argument \"${args[1]}\"`)\n return commands(inspector, target, names, args[0], io, flags.json)\n }\n case \"show\": {\n if (args.length !== 1) throw new UsageError(`usage: ${INSPECT_PROG} show <id>`)\n return show(inspector, names, args[0]!, io, flags.json)\n }\n case \"call\": {\n if (args.length !== 1) throw new UsageError(`usage: ${INSPECT_PROG} call [flags] <id> [input flags]`)\n return call(inspector, names, args[0]!, inputArgv, flags, io)\n }\n default: {\n if (flags.as && flags.as.length > 1) throw new UsageError(\"--as takes one profile for run (steps name their own profile with \\\"as\\\")\")\n try {\n return await runScenarios(inspector, profiles, args, flags, io)\n } finally {\n inspector.close()\n }\n }\n }\n}\n\nfunction parseAnswers(text: string): Answers {\n let value: unknown\n try {\n value = JSON.parse(text)\n } catch {\n throw new UsageError('--answers must be JSON, e.g. \\'{\"confirm\": true, \"form\": {\"reason\": \"ok\"}}\\'')\n }\n if (!isRecord(value)) throw new UsageError(\"--answers must be a JSON object\")\n const out: Answers = {}\n for (const [key, v] of Object.entries(value)) {\n if (key === \"confirm\" || key === \"url\") {\n if (typeof v !== \"boolean\") throw new UsageError(`--answers ${key} must be true or false`)\n out[key] = v\n } else if (key === \"form\") {\n if (v !== false && !isRecord(v)) throw new UsageError(\"--answers form must be an object or false\")\n out.form = v\n } else throw new UsageError(`--answers: unknown key \"${key}\" (confirm · form · url)`)\n }\n return out\n}\n\n/* profiles */\n\nfunction printProfiles(profiles: ProfileSet, io: CliIo, json: boolean): number {\n const inspector = createInspector({ url: \"http://unused.invalid/mcp\", profiles, env: io.env })\n const views = inspector.profiles()\n if (json) {\n io.stdout.write(formatJson({ file: profiles.file ?? null, default: profiles.default, profiles: views }))\n return EXIT.ok\n }\n const source = profiles.file ? shown(io.cwd, profiles.file) : `built-in (no ${INSPECT_DIR}/${PROFILES_FILE})`\n const rows = views.map((p) => [\n `${p.default ? \"*\" : \" \"} ${p.name}`,\n p.token ? `${p.token.env} (${p.token.set ? \"set\" : \"not set\"})` : \"-\",\n p.headers.map((h) => (h.env ? `${h.name}=$${h.env}${h.set ? \"\" : \" (not set)\"}` : `${h.name}=${h.value}`)).join(\", \") || \"-\",\n p.description ?? \"\",\n ])\n io.stdout.write(`Profiles: ${source}\\n${table([[\" NAME\", \"TOKEN\", \"HEADERS\", \"DESCRIPTION\"], ...rows]).join(\"\\n\")}\\n`)\n return EXIT.ok\n}\n\n/* mcp-config */\n\n/**\n * 에이전트 (Happy 봇) 가 이 서버를 MCP 서버로 쓰게 하는 설정 스니펫 (mcp.toml 형식, §3). 출력만 한다 (파일을 쓰지 않는다).\n * 토큰 = 환경변수 이름 (bearer_token_env_var). 값은 읽지도 출력하지도 않는다\n */\nfunction mcpConfig(target: InspectTarget, profiles: ProfileSet, flags: Flags, io: CliIo): number {\n if (!flags.as || flags.as.length !== 1) {\n throw new UsageError(`\"${INSPECT_PROG} mcp-config\" needs --as <profile>: the profile whose token the agent will use (profiles: ${profiles.profiles.map((p) => p.name).join(\", \")})`)\n }\n const profile = findProfile(profiles, flags.as[0])\n if (!profile) throw new UsageError(`Unknown profile \"${flags.as[0]}\". Profiles: ${profiles.profiles.map((p) => p.name).join(\", \")}`)\n const name = flags.name ?? (basename(resolve(io.cwd)).replace(/[^A-Za-z0-9_-]+/g, \"_\") || \"mext\")\n const fixed = Object.entries(profile.headers).filter((entry): entry is [string, string] => typeof entry[1] === \"string\")\n const fromEnv = Object.entries(profile.headers).flatMap(([header, value]) => (typeof value === \"string\" ? [] : [{ name: header, env: value.env }]))\n const key = /^[A-Za-z0-9_-]+$/.test(name) ? name : JSON.stringify(name)\n const entry = [\n `[mcp_servers.${key}]`,\n `url = ${JSON.stringify(target.url)}`,\n ...(profile.token ? [`bearer_token_env_var = ${JSON.stringify(profile.token.env)}`] : []),\n ...(fixed.length > 0 ? [`http_headers = { ${fixed.map(([header, value]) => `${JSON.stringify(header)} = ${JSON.stringify(value)}`).join(\", \")} }`] : []),\n ]\n if (flags.json) {\n io.stdout.write(\n formatJson({\n name,\n profile: profile.name,\n url: target.url,\n bearerTokenEnvVar: profile.token?.env ?? null,\n httpHeaders: Object.fromEntries(fixed),\n skippedHeaders: fromEnv,\n toml: `${entry.join(\"\\n\")}\\n`,\n }),\n )\n return EXIT.ok\n }\n const lines = [\n `# MCP server entry for a Happy Agent bot, calling as profile \"${profile.name}\" (${INSPECT_PROG} mcp-config).`,\n \"# 1. Add it to the mcp.toml in the bot's folder (for example ~/Happy/Bots/<bot>/mcp.toml). This command does not write that file.\",\n profile.token\n ? `# 2. The Happy daemon reads the token from its own environment: ${profile.token.env} must be set where the daemon runs (not only in this shell).`\n : \"# 2. This profile has no token: the bot calls the server anonymously.\",\n \"# 3. Ask the bot to reload its MCP servers.\",\n ...entry,\n ...fromEnv.map((h) => `# Not included: header ${h.name} comes from $${h.env} in this profile, and mcp.toml headers are fixed values only.`),\n ...(target.source === \"dev\" ? [`# This URL is this project's mext dev server. Keep the port fixed (mext dev --port ${new URL(target.url).port}) so the entry stays valid.`] : []),\n ]\n io.stdout.write(`${lines.join(\"\\n\")}\\n`)\n return EXIT.ok\n}\n\n/* commands */\n\ntype Listing = { profile: string; ok: true; list: CommandList } | { profile: string; ok: false; error: ErrorBody }\n\nasync function listFor(inspector: Inspector, names: readonly string[], namespace: string | undefined): Promise<Listing[]> {\n const out: Listing[] = []\n for (const profile of names) {\n try {\n const list = await inspector.commands(profile)\n out.push({ profile, ok: true, list: namespace === undefined ? list : within(list, namespace) })\n } catch (error) {\n out.push({ profile, ok: false, error: listErrorBody(error) })\n }\n }\n return out\n}\n\nfunction within(list: CommandList, namespace: string): CommandList {\n const inside = (id: string): boolean => id === namespace || id.startsWith(`${namespace}.`)\n return { ...list, namespaces: list.namespaces.filter((n) => inside(n.id)), commands: list.commands.filter((c) => inside(c.id)) }\n}\n\nasync function commands(\n inspector: Inspector,\n target: InspectTarget,\n names: readonly string[],\n namespace: string | undefined,\n io: CliIo,\n json: boolean,\n): Promise<number> {\n const listings = await listFor(inspector, names, namespace)\n const failed = listings.some((l) => !l.ok)\n if (names.length === 1) {\n const only = listings[0]!\n if (!only.ok) {\n io.stderr.write(json ? formatJson(only.error) : `error: ${only.error.code}: ${only.error.message}\\n`)\n return EXIT.error\n }\n if (json) {\n io.stdout.write(formatJson(only.list))\n return EXIT.ok\n }\n io.stdout.write(`${targetLine(target)} · as ${only.profile}\\n\\n${commandLines(only.list)}`)\n return EXIT.ok\n }\n if (json) {\n io.stdout.write(formatJson(listings))\n return failed ? EXIT.error : EXIT.ok\n }\n const ids = [...new Set(listings.flatMap((l) => (l.ok ? l.list.commands.map((c) => c.id) : [])))].sort()\n const rows = ids.map((id) => [id, ...listings.map((l) => (l.ok ? (l.list.commands.some((c) => c.id === id) ? \"visible\" : \"hidden\") : l.error.code))])\n io.stdout.write(`${targetLine(target)}\\n\\n${table([[\"\", ...names], ...rows]).join(\"\\n\")}\\n`)\n for (const l of listings) if (!l.ok) io.stderr.write(`${l.profile}: ${l.error.code}: ${l.error.message}\\n`)\n return failed ? EXIT.error : EXIT.ok\n}\n\nfunction targetLine(target: InspectTarget): string {\n return `${target.url}${target.source === \"dev\" ? \" (mext dev)\" : \"\"}`\n}\n\n/** 네임스페이스별 명령어 + 안전성 */\nfunction commandLines(list: CommandList): string {\n if (list.commands.length === 0) return \"(no commands visible to this profile)\\n\"\n const groups = new Map<string, CommandSummary[]>()\n for (const c of list.commands) {\n const ns = parentNamespace(c.id)\n groups.set(ns, [...(groups.get(ns) ?? []), c])\n }\n const rows: string[][] = []\n const heads = new Set<number>()\n for (const [ns, items] of [...groups].sort(([a], [b]) => a.localeCompare(b))) {\n heads.add(rows.length)\n rows.push([ns === \"\" ? \"(root)\" : ns, \"\", list.namespaces.find((n) => n.id === ns)?.description ?? \"\"])\n for (const c of items) rows.push([` ${c.id}`, safetyOf(c).join(\", \"), c.description])\n }\n const lines = table(rows)\n return `${lines.map((l, i) => (heads.has(i) && i > 0 ? `\\n${l}` : l)).join(\"\\n\")}\\n`\n}\n\n/** 안전성 표시 (mext run --help 의 Safety 줄과 같은 말) */\nexport function safetyOf(c: CommandSummary): string[] {\n const out = [c.readOnly ? \"read-only\" : \"writes\"]\n if (c.destructive) out.push(\"destructive\")\n if (c.requiresConfirmation) out.push(\"requires confirmation\")\n else if (c.needsApproval === \"conditional\") out.push(\"may require confirmation\")\n return out\n}\n\n/* show */\n\nasync function show(inspector: Inspector, names: readonly string[], id: string, io: CliIo, json: boolean): Promise<number> {\n let info: CommandInfo | undefined\n const visibleTo: Record<string, boolean> = {}\n let firstError: unknown\n for (const profile of names) {\n try {\n const found = await inspector.describe(id, profile)\n info ??= found\n visibleTo[profile] = true\n } catch (error) {\n if (!(error instanceof CallError && error.code === \"UNKNOWN_COMMAND\") && names.length === 1) throw error\n firstError ??= error\n visibleTo[profile] = false\n }\n }\n if (!info) throw firstError\n if (json) {\n io.stdout.write(formatJson(names.length === 1 ? info : { ...info, visibleTo }))\n return EXIT.ok\n }\n const safety = safetyOf(info)\n const rows: string[][] = [\n [\"Safety\", safety.join(\", \")],\n [\"Approval\", info.requiresConfirmation ? \"required\" : info.needsApproval === \"conditional\" ? \"conditional\" : \"none\"],\n [\"Scopes\", info.scopes.join(\", \") || \"(none)\"],\n ]\n if (info.aliases.length > 0) rows.push([\"Aliases\", info.aliases.join(\", \")])\n if (info.tool !== undefined) rows.push([\"Tool\", info.tool])\n if (info.task) rows.push([\"Task\", `ttl ${info.task.ttlMs}ms`])\n if (info.errors.length > 0) rows.push([\"Errors\", info.errors.join(\", \")])\n if (names.length > 1) rows.push([\"Visible to\", names.map((n) => `${n} ${visibleTo[n] ? \"yes\" : \"no\"}`).join(\" · \")])\n const out = [`${info.id} — ${info.description}`, \"\", ...table(rows), \"\", \"Input schema:\", indent(JSON.stringify(info.inputSchema, null, 2))]\n if (info.outputSchema) out.push(\"\", \"Output schema:\", indent(JSON.stringify(info.outputSchema, null, 2)))\n if (info.examples.length > 0) out.push(\"\", \"Examples:\", ...info.examples.map((e) => ` ${JSON.stringify(e)}`))\n io.stdout.write(`${out.join(\"\\n\")}\\n`)\n return EXIT.ok\n}\n\n/* call */\n\nasync function call(inspector: Inspector, names: readonly string[], id: string, inputArgv: readonly string[], flags: Flags, io: CliIo): Promise<number> {\n const parsed = await parseInput(inspector, names, id, inputArgv, io)\n if (parsed.help) return show(inspector, names, id, io, flags.json || parsed.json)\n const json = flags.json || parsed.json\n const confirmed = flags.confirmed || parsed.yes\n const records: CallRecord[] = []\n for (const profile of names) {\n records.push(\n await inspector.call(id, parsed.input, {\n profile,\n ...(confirmed ? { confirmed: true } : {}),\n ...(flags.answers ? { answers: flags.answers } : {}),\n ...(flags.decline ? { decline: true } : {}),\n ...(io.signal ? { signal: io.signal } : {}),\n onProgress: (update) => {\n const line = formatProgress({ ...update, progress: update.progress ?? 0 })\n io.stderr.write(names.length > 1 ? `${profile}: ${line}` : line)\n },\n }),\n )\n }\n if (flags.save !== undefined) {\n const file = resolve(io.cwd, flags.save)\n let count = 0\n for (const record of records) {\n count = appendStep(file, stepFromRecord(record, { ...(flags.answers ? { answers: flags.answers } : {}), ...(flags.decline ? { decline: true } : {}) }))\n }\n io.stderr.write(`Saved ${records.length === 1 ? \"step\" : `${records.length} steps`} to ${shown(io.cwd, file)} (${count} step${count === 1 ? \"\" : \"s\"})\\n`)\n }\n const failed = records.some((r) => !r.ok)\n if (json) {\n io.stdout.write(\n formatJson(\n records.map((r) => ({\n profile: r.profile,\n ...outcomeOf(r),\n durationMs: r.durationMs,\n ...(r.task ? { task: r.task } : {}),\n ...(flags.raw ? { exchanges: r.exchanges } : {}),\n })),\n ),\n )\n return failed ? EXIT.error : EXIT.ok\n }\n const blocks = records.map((r) => {\n const lines = [recordLine(r)]\n const body = r.ok ? formatResult(r.value).trimEnd() : JSON.stringify(r.error, null, 2)\n if (body !== \"\") lines.push(indent(body))\n if (flags.raw) {\n lines.push(\" Requests:\")\n for (const x of r.exchanges) {\n lines.push(` → ${x.request.method} ${x.request.url}${x.rpc ? ` ${x.rpc}` : \"\"} (${x.response ? x.response.status : (x.error ?? \"no response\")}, ${x.durationMs}ms)`)\n lines.push(indent(JSON.stringify({ request: x.request, response: x.response }, null, 2), 4))\n }\n }\n return lines.join(\"\\n\")\n })\n io.stdout.write(`${blocks.join(\"\\n\\n\")}\\n`)\n return failed ? EXIT.error : EXIT.ok\n}\n\n/** 한 줄 요약: ✓ posts.get as editor (12ms) · ✗ posts.publish as agent (8ms) APPROVAL_REQUIRED (human_required) */\nfunction recordLine(r: CallRecord): string {\n const head = `${r.ok ? \"✓\" : \"✗\"} ${r.command} as ${r.profile} (${r.durationMs}ms)`\n if (r.ok || !r.error) return head\n return `${head} ${r.error.code}${typeof r.error.reason === \"string\" ? ` (${r.error.reason})` : \"\"}`\n}\n\n/**\n * <id> 뒤 argv → 입력. 스키마 = 이 명령어가 보이는 첫 프로필의 것 (mext run 과 같은 플래그 해석).\n * 어느 프로필에도 보이지 않으면 (숨긴 명령어를 호출해 보는 경우) --input-json 만 받는다\n */\nasync function parseInput(\n inspector: Inspector,\n names: readonly string[],\n id: string,\n argv: readonly string[],\n io: CliIo,\n): Promise<{ input: Record<string, unknown>; json: boolean; yes: boolean; help: boolean }> {\n let info: CommandInfo | undefined\n for (const profile of names) {\n try {\n info = await inspector.describe(id, profile)\n break\n } catch {\n // 다음 프로필\n }\n }\n if (info) {\n const entry = entryFromHelp({ ...info, kind: \"command\" } as unknown as CommandHelp)\n const parsed = await parseArgs(entry, argv, { readStdin: () => readAll(io.stdin) })\n return { input: isRecord(parsed.input) ? parsed.input : {}, json: parsed.json, yes: parsed.yes, help: parsed.help }\n }\n const out = { input: {} as Record<string, unknown>, json: false, yes: false, help: false }\n for (let i = 0; i < argv.length; i++) {\n const tok = argv[i]!\n if (tok === \"--json\") out.json = true\n else if (tok === \"--yes\") out.yes = true\n else if (tok === \"--help\" || tok === \"-h\") out.help = true\n else if (tok === \"--input-json\" || tok.startsWith(\"--input-json=\")) {\n const text = tok === \"--input-json\" ? argv[++i] : tok.slice(\"--input-json=\".length)\n let value: unknown\n try {\n value = JSON.parse(text === \"-\" ? await readAll(io.stdin) : (text ?? \"\"))\n } catch {\n throw new UsageError(\"--input-json must be a JSON object\")\n }\n if (!isRecord(value)) throw new UsageError(\"--input-json must be a JSON object\")\n out.input = value\n } else {\n throw new UsageError(`\"${id}\" is not visible to ${names.join(\", \")}, so its flags are unknown. Pass the input with --input-json '<json>'`)\n }\n }\n return out\n}\n\n/* run */\n\nasync function runScenarios(inspector: Inspector, profiles: ProfileSet, paths: readonly string[], flags: Flags, io: CliIo): Promise<number> {\n const scenarios = scenarioFiles(io.cwd, paths).map((file) => loadScenario(file, profiles))\n const needsAgent = scenarios.some((scenario) => scenario.steps.some((step) => \"agent\" in step))\n if (needsAgent && flags.agent === undefined) {\n throw new UsageError('these scenarios have \"agent\" steps: pass --agent <module> (a module whose default export is an AgentClient, or a function that makes one)')\n }\n const agent = flags.agent !== undefined ? await loadAgent(flags.agent, io) : undefined\n try {\n return await runLoaded(inspector, scenarios, agent, flags, io)\n } finally {\n await agent?.close?.().catch(() => {})\n }\n}\n\n/** --agent <모듈>: default export = AgentClient, 또는 그것을 만드는 함수 ({ cwd, env }) */\nasync function loadAgent(path: string, io: CliIo): Promise<AgentClient> {\n const file = resolve(io.cwd, path)\n if (!existsSync(file)) throw new UsageError(`--agent: ${shown(io.cwd, file)} not found`)\n const module = (await import(pathToFileURL(file).href)) as { default?: unknown }\n const plugin = module.default\n let client: unknown = plugin\n if (typeof plugin === \"function\") {\n try {\n client = await (plugin as (context: AgentPluginContext) => unknown)({ cwd: io.cwd, env: io.env })\n } catch (error) {\n // 설정이 빠진 plugin (환경변수 등) = 사용법 오류\n throw new UsageError(`--agent: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n if (!isAgentClient(client)) {\n throw new UsageError(`--agent: the default export of ${shown(io.cwd, file)} must be an AgentClient ({ connect, send, onEvent }) or a function that returns one`)\n }\n return client\n}\n\nasync function runLoaded(inspector: Inspector, scenarios: readonly Scenario[], agent: AgentClient | undefined, flags: Flags, io: CliIo): Promise<number> {\n const results: ScenarioResult[] = []\n for (const scenario of scenarios) {\n // --as = 시나리오 · 단계가 프로필을 적지 않았을 때의 기본값\n const effective = scenario.as === undefined && flags.as ? { ...scenario, as: flags.as[0]! } : scenario\n if (!flags.json) io.stdout.write(`${scenario.name}${scenario.file ? ` (${shown(io.cwd, scenario.file)})` : \"\"}\\n`)\n const result = await runScenario(inspector, effective, {\n bail: flags.bail,\n ...(agent ? { agent } : {}),\n ...(io.signal ? { signal: io.signal } : {}),\n onStep: (step) => {\n if (!flags.json) io.stdout.write(stepLines(step))\n },\n })\n results.push(result)\n if (!flags.json && result.steps.length < scenario.steps.length) {\n io.stdout.write(` (stopped: ${scenario.steps.length - result.steps.length} step(s) not run)\\n`)\n }\n }\n const pass = results.every((r) => r.pass)\n if (flags.json) {\n io.stdout.write(formatJson({ pass, scenarios: results }))\n return pass ? EXIT.ok : EXIT.error\n }\n const steps = results.flatMap((r) => r.steps)\n const passed = results.filter((r) => r.pass).length\n io.stdout.write(\n `\\n${passed}/${results.length} scenario${results.length === 1 ? \"\" : \"s\"} passed, ${steps.filter((s) => s.pass).length}/${steps.length} steps passed\\n`,\n )\n return pass ? EXIT.ok : EXIT.error\n}\n\nfunction stepLines(step: StepResult): string {\n const lines = [` ${step.pass ? \"✓\" : \"✗\"} ${step.step}. ${step.name} (as ${step.as}, ${step.durationMs}ms)`]\n for (const f of step.failures) lines.push(` ${f.path}: expected ${JSON.stringify(f.expected)}, got ${JSON.stringify(f.actual)}`)\n const outcome = step.outcome\n if (outcome && \"events\" in outcome) {\n // agent 단계: 실패하면 서버가 본 것 (감사 이벤트) 과 에이전트가 한 말을 같이 보여 준다\n if (!step.pass) {\n lines.push(` server saw ${outcome.events.length} call${outcome.events.length === 1 ? \"\" : \"s\"} from the agent${outcome.events.length > 0 ? \":\" : \"\"}`)\n for (const event of outcome.events) lines.push(` ${event.outcome} ${event.command}${event.error ? ` (${event.error.code})` : \"\"}`)\n const said = outcome.messages.at(-1)\n if (said !== undefined) lines.push(` agent said: ${said.length > 200 ? `${said.slice(0, 197)}…` : said}`)\n }\n } else if (!step.pass && outcome && !outcome.ok) lines.push(` result: ${outcome.error.code}: ${outcome.error.message}`)\n return `${lines.join(\"\\n\")}\\n`\n}\n\n/* ui */\n\n/** 웹 UI (§5): 127.0.0.1 에 페이지 · 중계 API 를 열고 SIGINT 까지 실행 */\nasync function ui(target: InspectTarget, profiles: ProfileSet, flags: Flags, io: CliIo): Promise<number> {\n const port = flags.port === undefined ? UI_DEFAULT_PORT : Number(flags.port)\n if (!Number.isInteger(port) || port < 0 || port > 65_535) throw new UsageError(\"--port must be a port number (0 = any free port)\")\n const audit = resolveAudit(target, io.cwd)\n const agent = flags.agent !== undefined ? await loadAgent(flags.agent, io) : undefined\n const inspector = createInspector({ url: target.url, profiles, env: io.env, ...(audit.available ? { audit: audit.source } : {}) })\n let server\n try {\n server = await startUiServer({ inspector, target, cwd: io.cwd, port, ...(audit.available ? {} : { auditReason: audit.reason }), ...(agent ? { agent } : {}) })\n } catch (error) {\n inspector.close()\n if ((error as NodeJS.ErrnoException).code === \"EADDRINUSE\") {\n io.stderr.write(`error: port ${port} is in use. Pass --port <n> (0 = any free port).\\n`)\n return EXIT.error\n }\n throw error\n }\n io.stderr.write(\n `${INSPECT_PROG}: ${server.url}\\n` +\n ` target ${targetLine(target)}\\n` +\n ` audit ${audit.available ? \"streaming from mext dev\" : \"not available for this target\"}\\n` +\n (agent ? ` agent ${agent.name ?? \"connected on the first agent step\"}\\n` : \"\") +\n \"Press Ctrl-C to stop.\\n\",\n )\n await new Promise<void>((done) => {\n if (io.signal?.aborted) return done()\n io.signal?.addEventListener(\"abort\", () => done(), { once: true })\n })\n await server.close()\n inspector.close()\n await agent?.close?.().catch(() => {})\n return EXIT.ok\n}\n\n/* help */\n\nexport function inspectHelp(): string {\n const lines = [\n \"Inspect a mext server command by command: who (a caller profile) calls what, and what comes back.\",\n \"\",\n \"Usage:\",\n ` ${INSPECT_PROG} commands [<namespace>] List commands with safety metadata`,\n ` ${INSPECT_PROG} show <id> One command: safety, approval, scopes, input schema, examples, errors`,\n ` ${INSPECT_PROG} call [flags] <id> [input] Call a command (input: --flag value, or --input-json '<json>')`,\n ` ${INSPECT_PROG} run [<scenario|folder>...] Run scenario files (default: ${INSPECT_DIR}/scenarios)`,\n ` ${INSPECT_PROG} profiles List caller profiles (values are never printed)`,\n ` ${INSPECT_PROG} ui [--port <n>] [--agent <m>] Web UI on http://127.0.0.1:${UI_DEFAULT_PORT} (calls go through this process)`,\n ` ${INSPECT_PROG} mcp-config --as <profile> Print the mcp.toml entry that lets an agent (a Happy bot) use this server`,\n \"\",\n \"Server: --url <url>, or MEXT_URL, or the mext dev server running in this project.\",\n `Profiles: ${INSPECT_DIR}/${PROFILES_FILE} names tokens and headers by environment variable, e.g.`,\n ' { \"profiles\": { \"editor\": { \"token\": { \"env\": \"EDITOR_TOKEN\" } }, \"anonymous\": {} } }',\n \"Without the file there is one profile, default (token from MEXT_TOKEN if set).\",\n \"\",\n \"Flags:\",\n ...table([\n [\"--url <url>\", \"MCP endpoint of the server to inspect\"],\n [\"--profiles <path>\", `Profiles file (default: ${INSPECT_DIR}/${PROFILES_FILE})`],\n [\"--as <a>[,<b>...]\", \"Caller profile. Several = run the same request as each and compare\"],\n [\"--json\", \"Print JSON\"],\n [\"-h, --help\", \"Show help\"],\n ]).map((l) => ` ${l}`),\n \"\",\n `Flags of call (before <id>; everything after <id> is the command's input):`,\n ...table([\n [\"--confirmed\", \"Declare that a human confirmed this call (same as --yes after <id>)\"],\n [\"--answers <json>\", 'Answers for input requests: {\"confirm\": true, \"form\": {…}, \"url\": true}'],\n [\"--decline\", \"Decline input and confirmation requests\"],\n [\"--save <file>\", \"Append this call and its observed result to a scenario file\"],\n [\"--raw\", \"Also print the raw requests and responses (secrets redacted)\"],\n ]).map((l) => ` ${l}`),\n \"\",\n \"Flags of run (--agent also works for ui):\",\n ...table([\n [\"--bail\", \"Stop a scenario at its first failing step\"],\n [\"--agent <module>\", 'Agent client for \"agent\" steps (default export: { connect, send, onEvent })'],\n ]).map((l) => ` ${l}`),\n \"\",\n \"Exit code: 0 = every call succeeded / every scenario passed, 1 = an error result or a failed scenario, 2 = usage or file format error.\",\n ]\n return `${lines.join(\"\\n\")}\\n`\n}\n\n/** cwd 안 = 상대 경로 · 밖 = 절대 경로 */\nfunction shown(cwd: string, file: string): string {\n const rel = relative(cwd, file)\n return rel === \"\" || rel.startsWith(\"..\") ? file : rel\n}\n\nfunction indent(text: string, by = 2): string {\n const pad = \" \".repeat(by)\n return text\n .split(\"\\n\")\n .map((l) => (l === \"\" ? l : `${pad}${l}`))\n .join(\"\\n\")\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n"]}
|
package/dist/cli/main.js
CHANGED
|
@@ -10,6 +10,7 @@ import { runLogout } from "./logout.js";
|
|
|
10
10
|
import { mcpCommand } from "./mcp.js";
|
|
11
11
|
import { runCommand } from "./run.js";
|
|
12
12
|
import { startCommand } from "./start.js";
|
|
13
|
+
import { typesCommand } from "./types.js";
|
|
13
14
|
/**
|
|
14
15
|
* 하위 명령 표. 이후 단계가 항목을 추가한다 (mcp · mcp --stdio · mcp install · login · build · run --url).
|
|
15
16
|
* 순서 = help 표시 순서.
|
|
@@ -22,6 +23,13 @@ export const SUBCOMMANDS = [
|
|
|
22
23
|
{ name: "logout", summary: "Revoke and remove stored credentials (mext logout --url <url>)", run: runLogout },
|
|
23
24
|
{ name: "build", summary: "Build .mext/ for production: bundle, manifest, server.js (mext build --help)", run: (argv, io) => runBuild(argv, io) },
|
|
24
25
|
{ name: "start", summary: "Production MCP server from .mext/ (mext start, mext start --stdio)", run: startCommand },
|
|
26
|
+
{ name: "types", summary: "Generate command types for the typed client (mext types --help)", run: typesCommand },
|
|
27
|
+
// inspect 는 실행할 때만 읽는다 (mext start · run 이 inspector 코드를 import 하지 않게)
|
|
28
|
+
{
|
|
29
|
+
name: "inspect",
|
|
30
|
+
summary: "Inspect a server: commands, calls as caller profiles, scenarios (mext inspect --help)",
|
|
31
|
+
run: async (argv, io) => (await import("./inspect.js")).inspectCommand(argv, io),
|
|
32
|
+
},
|
|
25
33
|
];
|
|
26
34
|
/**
|
|
27
35
|
* mext CLI 진입점. argv = 실행 파일 뒤 인자 (process.argv.slice(2)). 반환 = exit code.
|
package/dist/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,SAAS,EAAc,MAAM,SAAS,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAWzC;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAoB;IAC1C,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,+DAA+D,EAAE,GAAG,EAAE,UAAU,EAAE;IAC1G,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,wEAAwE,EAAE,GAAG,EAAE,UAAU,EAAE;IACnH,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,2DAA2D,EAAE,GAAG,EAAE,UAAU,EAAE;IACtG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,oDAAoD,EAAE,GAAG,EAAE,QAAQ,EAAE;IAC/F,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,gEAAgE,EAAE,GAAG,EAAE,SAAS,EAAE;IAC7G,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,8EAA8E,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE;IACjJ,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,oEAAoE,EAAE,GAAG,EAAE,YAAY,EAAE;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"node:fs\"\nimport { closest } from \"../suggest.ts\"\nimport { table } from \"./help.ts\"\nimport { resolveIo, type CliIo } from \"./io.ts\"\nimport { EXIT } from \"./output.ts\"\nimport { runBuild } from \"./build.ts\"\nimport { runLogin } from \"./login.ts\"\nimport { devCommand } from \"./dev.ts\"\nimport { runLogout } from \"./logout.ts\"\nimport { mcpCommand } from \"./mcp.ts\"\nimport { runCommand } from \"./run.ts\"\nimport { startCommand } from \"./start.ts\"\nimport { typesCommand } from \"./types.ts\"\n\n/** mext 의 하위 명령 (run · dev · mcp install · login · logout · build · start) */\nexport interface CliSubcommand {\n name: string\n /** mext help 한 줄 설명 */\n summary: string\n /** 하위 명령 이름 뒤의 argv. 반환 = exit code */\n run(argv: readonly string[], io: CliIo): Promise<number>\n}\n\n/**\n * 하위 명령 표. 이후 단계가 항목을 추가한다 (mcp · mcp --stdio · mcp install · login · build · run --url).\n * 순서 = help 표시 순서.\n */\nexport const SUBCOMMANDS: CliSubcommand[] = [\n { name: \"run\", summary: \"Run a command locally, or remotely with --url (mext run help)\", run: runCommand },\n { name: \"dev\", summary: \"Development MCP server with file watching (mext dev, mext dev --stdio)\", run: devCommand },\n { name: \"mcp\", summary: \"Print MCP client registration commands (mext mcp install)\", run: mcpCommand },\n { name: \"login\", summary: \"Log in to a remote server (mext login --url <url>)\", run: runLogin },\n { name: \"logout\", summary: \"Revoke and remove stored credentials (mext logout --url <url>)\", run: runLogout },\n { name: \"build\", summary: \"Build .mext/ for production: bundle, manifest, server.js (mext build --help)\", run: (argv, io) => runBuild(argv, io) },\n { name: \"start\", summary: \"Production MCP server from .mext/ (mext start, mext start --stdio)\", run: startCommand },\n { name: \"types\", summary: \"Generate command types for the typed client (mext types --help)\", run: typesCommand },\n // inspect 는 실행할 때만 읽는다 (mext start · run 이 inspector 코드를 import 하지 않게)\n {\n name: \"inspect\",\n summary: \"Inspect a server: commands, calls as caller profiles, scenarios (mext inspect --help)\",\n run: async (argv, io) => (await import(\"./inspect.ts\")).inspectCommand(argv, io),\n },\n]\n\n/**\n * mext CLI 진입점. argv = 실행 파일 뒤 인자 (process.argv.slice(2)). 반환 = exit code.\n * io 는 테스트용 주입 (stdin · stdout · stderr · isTTY · env · cwd · signal), 생략 = process.\n */\nexport async function runCli(argv: readonly string[], io: Partial<CliIo> = {}): Promise<number> {\n const resolved = resolveIo(io)\n const subcommands = SUBCOMMANDS\n const [first, ...rest] = argv\n if (first === undefined) {\n resolved.stderr.write(rootHelp(subcommands))\n return EXIT.usage\n }\n if (first === \"help\" || first === \"--help\" || first === \"-h\") {\n resolved.stdout.write(rootHelp(subcommands))\n return EXIT.ok\n }\n if (first === \"--version\" || first === \"-v\") {\n resolved.stdout.write(`${packageVersion()}\\n`)\n return EXIT.ok\n }\n const sub = subcommands.find((s) => s.name === first)\n if (!sub) {\n const suggested = closest(first, subcommands.map((s): [string, string] => [s.name, s.name]))\n const hint = suggested.length > 0 ? ` Did you mean \"mext ${suggested[0]}\"?` : \"\"\n resolved.stderr.write(`error: unknown command \"${first}\".${hint}\\nRun \"mext help\" for available commands.\\n`)\n return EXIT.usage\n }\n return sub.run(rest, resolved)\n}\n\nfunction rootHelp(subcommands: readonly CliSubcommand[]): string {\n const lines = [\n \"mext — file-based commands as a CLI and an MCP server\",\n \"\",\n \"Usage:\",\n \" mext <command> [args]\",\n \"\",\n \"Commands:\",\n ...table(subcommands.map((s) => [s.name, s.summary])).map((l) => ` ${l}`),\n \"\",\n \"Flags:\",\n ...table([\n [\"-h, --help\", \"Show help\"],\n [\"-v, --version\", \"Print the version\"],\n ]).map((l) => ` ${l}`),\n ]\n return `${lines.join(\"\\n\")}\\n`\n}\n\nfunction packageVersion(): string {\n const pkg = JSON.parse(readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf8\")) as { version?: string }\n return pkg.version ?? \"0.0.0\"\n}\n"]}
|
package/dist/cli/output.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export declare class CliInterrupted extends Error {
|
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
15
|
* 오류 → exit code.
|
|
16
|
-
* INVALID_ARGUMENT · UNKNOWN_COMMAND · INPUT_UNAVAILABLE = 2 · UNAUTHENTICATED · PERMISSION_DENIED = 77 · SIGINT = 130 · 그 외 = 1
|
|
16
|
+
* INVALID_ARGUMENT · UNKNOWN_COMMAND · INPUT_UNAVAILABLE = 2 · UNAUTHENTICATED · PERMISSION_DENIED · APPROVAL_REQUIRED = 77 · SIGINT = 130 · 그 외 = 1
|
|
17
17
|
*/
|
|
18
18
|
export declare function exitCodeOf(error: unknown): number;
|
|
19
19
|
/**
|
package/dist/cli/output.js
CHANGED
|
@@ -18,7 +18,7 @@ export class CliInterrupted extends Error {
|
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
20
|
* 오류 → exit code.
|
|
21
|
-
* INVALID_ARGUMENT · UNKNOWN_COMMAND · INPUT_UNAVAILABLE = 2 · UNAUTHENTICATED · PERMISSION_DENIED = 77 · SIGINT = 130 · 그 외 = 1
|
|
21
|
+
* INVALID_ARGUMENT · UNKNOWN_COMMAND · INPUT_UNAVAILABLE = 2 · UNAUTHENTICATED · PERMISSION_DENIED · APPROVAL_REQUIRED = 77 · SIGINT = 130 · 그 외 = 1
|
|
22
22
|
*/
|
|
23
23
|
export function exitCodeOf(error) {
|
|
24
24
|
if (error instanceof CliInterrupted)
|
|
@@ -31,6 +31,7 @@ export function exitCodeOf(error) {
|
|
|
31
31
|
return EXIT.usage;
|
|
32
32
|
case "UNAUTHENTICATED":
|
|
33
33
|
case "PERMISSION_DENIED":
|
|
34
|
+
case "APPROVAL_REQUIRED":
|
|
34
35
|
return EXIT.auth;
|
|
35
36
|
}
|
|
36
37
|
}
|
|
@@ -182,7 +183,7 @@ export function emitError(io, error, formatter) {
|
|
|
182
183
|
const { code, message, ...details } = error.body;
|
|
183
184
|
const info = {
|
|
184
185
|
code: typeof code === "string" ? code : "EXECUTION_ERROR",
|
|
185
|
-
message: typeof message === "string" ? message :
|
|
186
|
+
message: typeof message === "string" ? message : message == null ? "" : JSON.stringify(message),
|
|
186
187
|
details,
|
|
187
188
|
reasons: reasonsOf(details),
|
|
188
189
|
body: error.body,
|
package/dist/cli/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ProgressUpdate } from \"../command.ts\"\nimport { CommandError, isMextError, MextBuildError, MextError } from \"../errors.ts\"\nimport { toKebab } from \"./args.ts\"\nimport { cliPath, table } from \"./help.ts\"\n\n/** exit code (spec §5) */\nexport const EXIT = {\n ok: 0,\n error: 1,\n usage: 2,\n auth: 77,\n interrupted: 130,\n} as const\n\n/** 실행 중 SIGINT (ctx.signal abort) 를 나타내는 CLI 내부 오류 */\nexport class CliInterrupted extends Error {\n constructor() {\n super(\"Interrupted.\")\n this.name = \"CliInterrupted\"\n }\n}\n\n/**\n * 오류 → exit code.\n * INVALID_ARGUMENT · UNKNOWN_COMMAND · INPUT_UNAVAILABLE = 2 · UNAUTHENTICATED · PERMISSION_DENIED = 77 · SIGINT = 130 · 그 외 = 1\n */\nexport function exitCodeOf(error: unknown): number {\n if (error instanceof CliInterrupted) return EXIT.interrupted\n if (error instanceof MextError) {\n switch (error.code) {\n case \"INVALID_ARGUMENT\":\n case \"UNKNOWN_COMMAND\":\n case \"INPUT_UNAVAILABLE\":\n return EXIT.usage\n case \"UNAUTHENTICATED\":\n case \"PERMISSION_DENIED\":\n return EXIT.auth\n }\n }\n return EXIT.error\n}\n\n/**\n * --json 오류 본문. MextError · CommandError = toJSON(), 빌드 오류 = BUILD_ERROR + issues,\n * SIGINT = INTERRUPTED, 핸들러 예외 = EXECUTION_ERROR\n */\nexport function errorJson(error: unknown): Record<string, unknown> {\n if (error instanceof MextError || error instanceof CommandError) return error.toJSON()\n if (error instanceof MextBuildError) return { code: \"BUILD_ERROR\", message: error.message, issues: error.issues }\n if (error instanceof CliInterrupted) return { code: \"INTERRUPTED\", message: error.message }\n return { code: \"EXECUTION_ERROR\", message: error instanceof Error ? error.message : String(error) }\n}\n\n/** 사람용 오류 텍스트 (끝 줄바꿈 포함) */\nexport function formatError(error: unknown, prog: string): string {\n const lines: string[] = []\n if (isMextError(error, \"INVALID_ARGUMENT\")) {\n const d = error.details\n lines.push(d.command === \"\" ? \"error: invalid arguments\" : `error: invalid arguments for ${cliPath(d.command)}`)\n const rows = d.issues.map((i) => {\n if (i.path === \"\") return [i.message]\n return [flagOf(i.path), d.missing_fields.includes(i.path) ? \"required\" : i.message]\n })\n lines.push(...table(rows.filter((r) => r.length === 2)).map((l) => ` ${l}`))\n lines.push(...rows.filter((r) => r.length === 1).map((r) => ` ${r[0]}`))\n if (d.command !== \"\") lines.push(`Run \"${prog} ${cliPath(d.command)} --help\" for usage.`)\n } else if (isMextError(error, \"UNKNOWN_COMMAND\")) {\n const d = error.details\n if (d.command === \"\") lines.push(\"error: no command given\")\n else if (error.message.startsWith(\"Unknown command\")) lines.push(`error: unknown command \"${cliPath(d.command)}\"`)\n else lines.push(`error: ${error.message}`)\n if (d.suggested.length > 0) lines.push(`Did you mean: ${d.suggested.map((s) => `${prog} ${cliPath(s)}`).join(\", \")}?`)\n lines.push(`Run \"${usageCommand(prog, d.usage)}\" for available commands.`)\n } else if (isMextError(error, \"PERMISSION_DENIED\")) {\n const d = error.details\n lines.push(`error: ${error.message}`)\n lines.push(` required scopes: ${d.required_scopes.join(\", \") || \"(none)\"}`)\n lines.push(` held scopes: ${d.held_scopes.join(\", \") || \"(none)\"}`)\n } else if (isMextError(error, \"UNAUTHENTICATED\")) {\n lines.push(`error: ${error.message}`)\n if (error.details.login !== undefined) lines.push(`Run \"${error.details.login}\" to log in.`)\n } else if (isMextError(error, \"INPUT_UNAVAILABLE\")) {\n lines.push(`error: ${error.message}`)\n } else if (error instanceof Error) {\n lines.push(`error: ${error.message}`)\n } else {\n lines.push(`error: ${String(error)}`)\n }\n return `${lines.join(\"\\n\")}\\n`\n}\n\n/** \"help\" → \"mext run help\" · \"help users\" → \"mext run users --help\" */\nfunction usageCommand(prog: string, usage: string): string {\n const target = usage.replace(/^help\\s*/, \"\")\n return target === \"\" ? `${prog} help` : `${prog} ${cliPath(target)} --help`\n}\n\n/** 입력 경로 → 플래그 표기 (\"filter.minAge\" → \"--filter.min-age\") */\nfunction flagOf(path: string): string {\n return `--${path\n .split(\".\")\n .map((s) => (/^\\d+$/.test(s) ? s : toKebab(s)))\n .join(\".\")}`\n}\n\n/**\n * 사람용 결과 텍스트 (끝 줄바꿈 포함, undefined = 빈 문자열).\n * 문자열 = 그대로 · 원시 값 = String · 객체 배열 = 표 · 원시 배열 = 줄마다 · 객체 = 키 값 정렬. 중첩 값은 JSON 한 줄\n */\nexport function formatResult(value: unknown): string {\n if (value === undefined) return \"\"\n if (value === null) return \"null\\n\"\n if (typeof value === \"string\") return value.endsWith(\"\\n\") ? value : `${value}\\n`\n if (Array.isArray(value)) {\n if (value.length === 0) return \"(empty)\\n\"\n if (value.every(isRecord)) {\n const columns: string[] = []\n for (const row of value) for (const k of Object.keys(row)) if (!columns.includes(k)) columns.push(k)\n return lines(table([columns, ...value.map((row) => columns.map((c) => cell(row[c])))]))\n }\n return lines(value.map(cell))\n }\n if (isRecord(value)) {\n const entries = Object.entries(value).filter(([, v]) => v !== undefined)\n if (entries.length === 0) return \"(empty)\\n\"\n return lines(table(entries.map(([k, v]) => [k, cell(v)])))\n }\n return `${cell(value)}\\n`\n}\n\n/** --json 결과 */\nexport function formatJson(value: unknown): string {\n return `${JSON.stringify(value === undefined ? null : value, null, 2)}\\n`\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) && !(value instanceof Date)\n}\n\nfunction cell(value: unknown): string {\n if (value === undefined || value === null) return \"\"\n if (typeof value === \"string\") return value\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") return String(value)\n if (value instanceof Date) return value.toISOString()\n return JSON.stringify(value) ?? \"\"\n}\n\nfunction lines(list: string[]): string {\n return `${list.join(\"\\n\")}\\n`\n}\n\n/** ctx.progress → stderr 한 줄 */\nexport function formatProgress(update: ProgressUpdate): string {\n const head = update.total !== undefined ? `[${update.progress}/${update.total}]` : `[${update.progress}]`\n return `${update.message ? `${head} ${update.message}` : head}\\n`\n}\n\n/* ---------------------------------------------------------------- 오류 출력 커스텀 (cli.errors, spec §5) */\n\n/** cli.errors formatter 입력: 오류 하나 + mext 기본 출력 */\nexport interface CliErrorInfo {\n /** MextErrorCode · EXECUTION_ERROR · INTERRUPTED · REMOTE_ERROR · LOGIN_FAILED · LOGOUT_FAILED · 핸들러 정의 오류 code 등 (= body.code) */\n code: string\n message: string\n /** 오류 상세 (MextError.details · 서버 오류 본문의 code · message 외 필드) */\n details: Record<string, unknown>\n /** INVALID_ARGUMENT issues 의 \"경로: 메시지\" (경로 없으면 메시지). 그 외 [] */\n reasons: string[]\n /** mext 기본 --json 오류 본문 */\n body: Record<string, unknown>\n /** mext 기본 사람용 텍스트 (끝 줄바꿈 포함) */\n text: string\n /** mext 기본 exit code (0 · 1 · 2 · 77 · 130) */\n exitCode: number\n /** --json 지정 여부 */\n json: boolean\n}\n\n/** formatter 출력. 지정한 필드만 기본값 대체 (stderr 기본 = json ? body JSON : text, stdout 기본 = 없음) */\nexport interface CliErrorOutput {\n exitCode?: number\n stderr?: string\n stdout?: string\n}\n\n/** cli.errors 모듈의 default export. undefined 반환 = mext 기본 */\nexport type CliErrorFormatter = (error: CliErrorInfo) => CliErrorOutput | undefined | void\n\nexport interface CliErrorWriter {\n stdout: { write(chunk: string): unknown }\n stderr: { write(chunk: string): unknown }\n}\n\n/**\n * 오류 출력 (기본 = json ? body : text) + formatter 적용 → exit code.\n * formatter 예외 · 잘못된 exitCode = 기본값 + stderr 경고 1줄\n */\nexport function emitError(\n io: CliErrorWriter,\n error: { body: Record<string, unknown>; text: string; exitCode: number; json: boolean },\n formatter: CliErrorFormatter | undefined,\n): number {\n const fallback = error.json ? formatJson(error.body) : error.text\n if (!formatter) {\n io.stderr.write(fallback)\n return error.exitCode\n }\n const { code, message, ...details } = error.body\n const info: CliErrorInfo = {\n code: typeof code === \"string\" ? code : \"EXECUTION_ERROR\",\n message: typeof message === \"string\" ? message : String(message ?? \"\"),\n details,\n reasons: reasonsOf(details),\n body: error.body,\n text: error.text,\n exitCode: error.exitCode,\n json: error.json,\n }\n let out: CliErrorOutput | undefined | void\n try {\n out = formatter(info)\n } catch (e) {\n io.stderr.write(fallback)\n io.stderr.write(`warning: cli.errors formatter failed: ${e instanceof Error ? e.message : String(e)}\\n`)\n return error.exitCode\n }\n if (out === undefined || out === null) {\n io.stderr.write(fallback)\n return error.exitCode\n }\n if (out.stdout !== undefined) io.stdout.write(out.stdout)\n io.stderr.write(out.stderr ?? fallback)\n if (out.exitCode === undefined) return error.exitCode\n if (!Number.isInteger(out.exitCode) || out.exitCode < 0 || out.exitCode > 255) {\n io.stderr.write(`warning: cli.errors formatter returned an invalid exitCode (${String(out.exitCode)})\\n`)\n return error.exitCode\n }\n return out.exitCode\n}\n\n/** INVALID_ARGUMENT details.issues → \"경로: 메시지\" */\nfunction reasonsOf(details: Record<string, unknown>): string[] {\n const issues = details.issues\n if (!Array.isArray(issues)) return []\n return issues.flatMap((i) => {\n if (!isRecord(i) || typeof i.message !== \"string\") return []\n return [typeof i.path === \"string\" && i.path !== \"\" ? `${i.path}: ${i.message}` : i.message]\n })\n}\n"]}
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ProgressUpdate } from \"../command.ts\"\nimport { CommandError, isMextError, MextBuildError, MextError } from \"../errors.ts\"\nimport { toKebab } from \"./args.ts\"\nimport { cliPath, table } from \"./help.ts\"\n\n/** exit code (spec §5) */\nexport const EXIT = {\n ok: 0,\n error: 1,\n usage: 2,\n auth: 77,\n interrupted: 130,\n} as const\n\n/** 실행 중 SIGINT (ctx.signal abort) 를 나타내는 CLI 내부 오류 */\nexport class CliInterrupted extends Error {\n constructor() {\n super(\"Interrupted.\")\n this.name = \"CliInterrupted\"\n }\n}\n\n/**\n * 오류 → exit code.\n * INVALID_ARGUMENT · UNKNOWN_COMMAND · INPUT_UNAVAILABLE = 2 · UNAUTHENTICATED · PERMISSION_DENIED · APPROVAL_REQUIRED = 77 · SIGINT = 130 · 그 외 = 1\n */\nexport function exitCodeOf(error: unknown): number {\n if (error instanceof CliInterrupted) return EXIT.interrupted\n if (error instanceof MextError) {\n switch (error.code) {\n case \"INVALID_ARGUMENT\":\n case \"UNKNOWN_COMMAND\":\n case \"INPUT_UNAVAILABLE\":\n return EXIT.usage\n case \"UNAUTHENTICATED\":\n case \"PERMISSION_DENIED\":\n case \"APPROVAL_REQUIRED\":\n return EXIT.auth\n }\n }\n return EXIT.error\n}\n\n/**\n * --json 오류 본문. MextError · CommandError = toJSON(), 빌드 오류 = BUILD_ERROR + issues,\n * SIGINT = INTERRUPTED, 핸들러 예외 = EXECUTION_ERROR\n */\nexport function errorJson(error: unknown): Record<string, unknown> {\n if (error instanceof MextError || error instanceof CommandError) return error.toJSON()\n if (error instanceof MextBuildError) return { code: \"BUILD_ERROR\", message: error.message, issues: error.issues }\n if (error instanceof CliInterrupted) return { code: \"INTERRUPTED\", message: error.message }\n return { code: \"EXECUTION_ERROR\", message: error instanceof Error ? error.message : String(error) }\n}\n\n/** 사람용 오류 텍스트 (끝 줄바꿈 포함) */\nexport function formatError(error: unknown, prog: string): string {\n const lines: string[] = []\n if (isMextError(error, \"INVALID_ARGUMENT\")) {\n const d = error.details\n lines.push(d.command === \"\" ? \"error: invalid arguments\" : `error: invalid arguments for ${cliPath(d.command)}`)\n const rows = d.issues.map((i) => {\n if (i.path === \"\") return [i.message]\n return [flagOf(i.path), d.missing_fields.includes(i.path) ? \"required\" : i.message]\n })\n lines.push(...table(rows.filter((r) => r.length === 2)).map((l) => ` ${l}`))\n lines.push(...rows.filter((r) => r.length === 1).map((r) => ` ${r[0]}`))\n if (d.command !== \"\") lines.push(`Run \"${prog} ${cliPath(d.command)} --help\" for usage.`)\n } else if (isMextError(error, \"UNKNOWN_COMMAND\")) {\n const d = error.details\n if (d.command === \"\") lines.push(\"error: no command given\")\n else if (error.message.startsWith(\"Unknown command\")) lines.push(`error: unknown command \"${cliPath(d.command)}\"`)\n else lines.push(`error: ${error.message}`)\n if (d.suggested.length > 0) lines.push(`Did you mean: ${d.suggested.map((s) => `${prog} ${cliPath(s)}`).join(\", \")}?`)\n lines.push(`Run \"${usageCommand(prog, d.usage)}\" for available commands.`)\n } else if (isMextError(error, \"PERMISSION_DENIED\")) {\n const d = error.details\n lines.push(`error: ${error.message}`)\n lines.push(` required scopes: ${d.required_scopes.join(\", \") || \"(none)\"}`)\n lines.push(` held scopes: ${d.held_scopes.join(\", \") || \"(none)\"}`)\n } else if (isMextError(error, \"UNAUTHENTICATED\")) {\n lines.push(`error: ${error.message}`)\n if (error.details.login !== undefined) lines.push(`Run \"${error.details.login}\" to log in.`)\n } else if (isMextError(error, \"INPUT_UNAVAILABLE\")) {\n lines.push(`error: ${error.message}`)\n } else if (error instanceof Error) {\n lines.push(`error: ${error.message}`)\n } else {\n lines.push(`error: ${String(error)}`)\n }\n return `${lines.join(\"\\n\")}\\n`\n}\n\n/** \"help\" → \"mext run help\" · \"help users\" → \"mext run users --help\" */\nfunction usageCommand(prog: string, usage: string): string {\n const target = usage.replace(/^help\\s*/, \"\")\n return target === \"\" ? `${prog} help` : `${prog} ${cliPath(target)} --help`\n}\n\n/** 입력 경로 → 플래그 표기 (\"filter.minAge\" → \"--filter.min-age\") */\nfunction flagOf(path: string): string {\n return `--${path\n .split(\".\")\n .map((s) => (/^\\d+$/.test(s) ? s : toKebab(s)))\n .join(\".\")}`\n}\n\n/**\n * 사람용 결과 텍스트 (끝 줄바꿈 포함, undefined = 빈 문자열).\n * 문자열 = 그대로 · 원시 값 = String · 객체 배열 = 표 · 원시 배열 = 줄마다 · 객체 = 키 값 정렬. 중첩 값은 JSON 한 줄\n */\nexport function formatResult(value: unknown): string {\n if (value === undefined) return \"\"\n if (value === null) return \"null\\n\"\n if (typeof value === \"string\") return value.endsWith(\"\\n\") ? value : `${value}\\n`\n if (Array.isArray(value)) {\n if (value.length === 0) return \"(empty)\\n\"\n if (value.every(isRecord)) {\n const columns: string[] = []\n for (const row of value) for (const k of Object.keys(row)) if (!columns.includes(k)) columns.push(k)\n return lines(table([columns, ...value.map((row) => columns.map((c) => cell(row[c])))]))\n }\n return lines(value.map(cell))\n }\n if (isRecord(value)) {\n const entries = Object.entries(value).filter(([, v]) => v !== undefined)\n if (entries.length === 0) return \"(empty)\\n\"\n return lines(table(entries.map(([k, v]) => [k, cell(v)])))\n }\n return `${cell(value)}\\n`\n}\n\n/** --json 결과 */\nexport function formatJson(value: unknown): string {\n return `${JSON.stringify(value === undefined ? null : value, null, 2)}\\n`\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) && !(value instanceof Date)\n}\n\nfunction cell(value: unknown): string {\n if (value === undefined || value === null) return \"\"\n if (typeof value === \"string\") return value\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") return String(value)\n if (value instanceof Date) return value.toISOString()\n return JSON.stringify(value) ?? \"\"\n}\n\nfunction lines(list: string[]): string {\n return `${list.join(\"\\n\")}\\n`\n}\n\n/** ctx.progress → stderr 한 줄 */\nexport function formatProgress(update: ProgressUpdate): string {\n const head = update.total !== undefined ? `[${update.progress}/${update.total}]` : `[${update.progress}]`\n return `${update.message ? `${head} ${update.message}` : head}\\n`\n}\n\n/* ---------------------------------------------------------------- 오류 출력 커스텀 (cli.errors, spec §5) */\n\n/** cli.errors formatter 입력: 오류 하나 + mext 기본 출력 */\nexport interface CliErrorInfo {\n /** MextErrorCode · EXECUTION_ERROR · INTERRUPTED · REMOTE_ERROR · LOGIN_FAILED · LOGOUT_FAILED · 핸들러 정의 오류 code 등 (= body.code) */\n code: string\n message: string\n /** 오류 상세 (MextError.details · 서버 오류 본문의 code · message 외 필드) */\n details: Record<string, unknown>\n /** INVALID_ARGUMENT issues 의 \"경로: 메시지\" (경로 없으면 메시지). 그 외 [] */\n reasons: string[]\n /** mext 기본 --json 오류 본문 */\n body: Record<string, unknown>\n /** mext 기본 사람용 텍스트 (끝 줄바꿈 포함) */\n text: string\n /** mext 기본 exit code (0 · 1 · 2 · 77 · 130) */\n exitCode: number\n /** --json 지정 여부 */\n json: boolean\n}\n\n/** formatter 출력. 지정한 필드만 기본값 대체 (stderr 기본 = json ? body JSON : text, stdout 기본 = 없음) */\nexport interface CliErrorOutput {\n exitCode?: number\n stderr?: string\n stdout?: string\n}\n\n/** cli.errors 모듈의 default export. undefined 반환 = mext 기본 */\nexport type CliErrorFormatter = (error: CliErrorInfo) => CliErrorOutput | undefined | void\n\nexport interface CliErrorWriter {\n stdout: { write(chunk: string): unknown }\n stderr: { write(chunk: string): unknown }\n}\n\n/**\n * 오류 출력 (기본 = json ? body : text) + formatter 적용 → exit code.\n * formatter 예외 · 잘못된 exitCode = 기본값 + stderr 경고 1줄\n */\nexport function emitError(\n io: CliErrorWriter,\n error: { body: Record<string, unknown>; text: string; exitCode: number; json: boolean },\n formatter: CliErrorFormatter | undefined,\n): number {\n const fallback = error.json ? formatJson(error.body) : error.text\n if (!formatter) {\n io.stderr.write(fallback)\n return error.exitCode\n }\n const { code, message, ...details } = error.body\n const info: CliErrorInfo = {\n code: typeof code === \"string\" ? code : \"EXECUTION_ERROR\",\n message: typeof message === \"string\" ? message : message == null ? \"\" : JSON.stringify(message),\n details,\n reasons: reasonsOf(details),\n body: error.body,\n text: error.text,\n exitCode: error.exitCode,\n json: error.json,\n }\n let out: CliErrorOutput | undefined | void\n try {\n out = formatter(info)\n } catch (e) {\n io.stderr.write(fallback)\n io.stderr.write(`warning: cli.errors formatter failed: ${e instanceof Error ? e.message : String(e)}\\n`)\n return error.exitCode\n }\n if (out === undefined || out === null) {\n io.stderr.write(fallback)\n return error.exitCode\n }\n if (out.stdout !== undefined) io.stdout.write(out.stdout)\n io.stderr.write(out.stderr ?? fallback)\n if (out.exitCode === undefined) return error.exitCode\n if (!Number.isInteger(out.exitCode) || out.exitCode < 0 || out.exitCode > 255) {\n io.stderr.write(`warning: cli.errors formatter returned an invalid exitCode (${String(out.exitCode)})\\n`)\n return error.exitCode\n }\n return out.exitCode\n}\n\n/** INVALID_ARGUMENT details.issues → \"경로: 메시지\" */\nfunction reasonsOf(details: Record<string, unknown>): string[] {\n const issues = details.issues\n if (!Array.isArray(issues)) return []\n return issues.flatMap((i) => {\n if (!isRecord(i) || typeof i.message !== \"string\") return []\n return [typeof i.path === \"string\" && i.path !== \"\" ? `${i.path}: ${i.message}` : i.message]\n })\n}\n"]}
|
package/dist/cli/run.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { auditHidden, startAudit } from "../audit.js";
|
|
1
2
|
import { createApp, loadCliErrorFormatter, loadConfig, resolveCommandsDir, resolveLocalPrincipal } from "../config.js";
|
|
3
|
+
import { surfaceOf } from "../caller.js";
|
|
2
4
|
import { MextError } from "../errors.js";
|
|
5
|
+
import { exposedRegistry, hasExposure } from "../expose.js";
|
|
3
6
|
import { isSegment } from "../ids.js";
|
|
4
7
|
import { loadProjectInstrumentation } from "../instrumentation.js";
|
|
5
8
|
import { authorize, findCommand, invoke } from "../invoke.js";
|
|
@@ -66,7 +69,12 @@ export async function runLocalCommand(argv, io, source) {
|
|
|
66
69
|
const lines = createLineReader(io);
|
|
67
70
|
let formatter;
|
|
68
71
|
try {
|
|
69
|
-
const
|
|
72
|
+
const loaded = await source.load((f) => (formatter = f));
|
|
73
|
+
const { instrumentation, config } = loaded;
|
|
74
|
+
// expose (§4): 로컬 주체의 표면 (기본 cli) 에서 숨긴 명령어 = 없는 명령어 (help · 경로 해석 · suggested).
|
|
75
|
+
// expose 가 없으면 주체를 미리 만들지 않는다 (help 경로가 localPrincipal 을 부르지 않던 동작 유지)
|
|
76
|
+
let principal = hasExposure(loaded.registry) ? await resolveLocalPrincipal(config, "cli") : undefined;
|
|
77
|
+
const registry = principal ? exposedRegistry(loaded.registry, surfaceOf(principal, "local")) : loaded.registry;
|
|
70
78
|
// mext run help [target...]
|
|
71
79
|
if (rest[0] === "help") {
|
|
72
80
|
const targetTokens = rest.slice(1).filter((t) => !t.startsWith("-"));
|
|
@@ -76,6 +84,14 @@ export async function runLocalCommand(argv, io, source) {
|
|
|
76
84
|
await prepareCliSpec(resolveCommand(registry, id));
|
|
77
85
|
return printHelp(registry, id, io, prog, json, config.tools, source.footer);
|
|
78
86
|
}
|
|
87
|
+
const help = lead.help || beforeDashDash.includes("--help") || beforeDashDash.includes("-h");
|
|
88
|
+
// 숨긴 명령어의 호출 시도 기록 (audit.includeHidden, §11.1): 전체 Registry 에서는 명령어인 경로. help 는 호출이 아니다.
|
|
89
|
+
// 응답 = 아래의 UNKNOWN_COMMAND 그대로. 프로세스가 곧 끝나므로 전달을 기다린다
|
|
90
|
+
if (principal && registry !== loaded.registry && config.audit?.includeHidden === true && !help) {
|
|
91
|
+
const target = resolveCommand(loaded.registry, resolvePath(loaded.registry, rest).id);
|
|
92
|
+
if (target && !registry.commands.has(target.id))
|
|
93
|
+
await auditHidden(target, { audit: config.audit, principal, transport: "local" });
|
|
94
|
+
}
|
|
79
95
|
const { id, consumed } = resolvePath(registry, rest);
|
|
80
96
|
const entry = id === "" ? undefined : resolveCommand(registry, id);
|
|
81
97
|
const next = rest[consumed];
|
|
@@ -87,7 +103,6 @@ export async function runLocalCommand(argv, io, source) {
|
|
|
87
103
|
throw unknownAt(registry, id, rest.slice(consumed));
|
|
88
104
|
}
|
|
89
105
|
await prepareCliSpec(entry);
|
|
90
|
-
const help = lead.help || beforeDashDash.includes("--help") || beforeDashDash.includes("-h");
|
|
91
106
|
if (help)
|
|
92
107
|
return printHelp(registry, id, io, prog, json, config.tools, source.footer);
|
|
93
108
|
if (!entry) {
|
|
@@ -98,8 +113,15 @@ export async function runLocalCommand(argv, io, source) {
|
|
|
98
113
|
const text = `${formatError(error, prog)}\n${helpText(registry, id, prog, source.footer)}`;
|
|
99
114
|
return emitError(io, { body: errorJson(error), text, exitCode: EXIT.usage, json: false }, formatter);
|
|
100
115
|
}
|
|
101
|
-
|
|
102
|
-
|
|
116
|
+
principal ??= await resolveLocalPrincipal(config, "cli");
|
|
117
|
+
try {
|
|
118
|
+
authorize(entry, principal); // 권한 → 입력 검증 순서 (invoke 와 같음)
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
// invoke 전 거부도 감사 1건 (§11.1)
|
|
122
|
+
await startAudit(entry, { principal, transport: "local", ...(config.audit ? { audit: config.audit } : {}) })?.finish({ error }, false);
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
103
125
|
const parsed = await parseArgs(entry, rest.slice(consumed), { readStdin: () => readAll(io.stdin) });
|
|
104
126
|
const yes = lead.yes || parsed.yes;
|
|
105
127
|
const app = await createApp(config);
|
|
@@ -117,6 +139,8 @@ export async function runLocalCommand(argv, io, source) {
|
|
|
117
139
|
app,
|
|
118
140
|
instrumentation,
|
|
119
141
|
transport: "local",
|
|
142
|
+
...(config.audit ? { audit: config.audit } : {}),
|
|
143
|
+
...(config.approval ? { approval: config.approval } : {}),
|
|
120
144
|
});
|
|
121
145
|
if (controller.signal.aborted)
|
|
122
146
|
throw new CliInterrupted();
|
package/dist/cli/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,UAAU,EAAE,kBAAkB,EAAE,qBAAqB,EAAmB,MAAM,cAAc,CAAA;AACvI,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,0BAA0B,EAAwB,MAAM,uBAAuB,CAAA;AACxF,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAmB,MAAM,cAAc,CAAA;AAE9E,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AACrC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAyC,MAAM,gBAAgB,CAAA;AACnG,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrG,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAA+B,MAAM,SAAS,CAAA;AAChF,OAAO,EACL,cAAc,EACd,SAAS,EACT,IAAI,EACJ,SAAS,EACT,UAAU,EACV,WAAW,EACX,UAAU,EACV,cAAc,EACd,YAAY,GAEb,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE5D,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAA;AAqBlC,kGAAkG;AAClG,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,KAAK,CAAC,IAAI,CAAC,YAAY;YACrB,kEAAkE;YAClE,MAAM,eAAe,GAAG,MAAM,0BAA0B,CAAC,GAAG,CAAC,CAAA;YAC7D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;YACpC,YAAY,CAAC,MAAM,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAA;YACtD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAA;YACpE,oBAAoB,CAAC,QAAQ,CAAC,CAAA;YAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;QAC9C,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAuB,EAAE,EAAS;IACjE,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;IACzC,IAAI,MAAM;QAAE,OAAO,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAC/C,OAAO,eAAe,CAAC,IAAI,EAAE,EAAE,EAAE,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAuB,EAAE,EAAS,EAAE,MAAsB;IAC9F,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IACxB,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IACrD,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;QACpB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,GAAG;YAAE,MAAK;QAC9C,IAAI,GAAG,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;aACjC,IAAI,GAAG,KAAK,OAAO;YAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAA;aACpC,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;aACtD,CAAC;YACJ,OAAO,MAAM,CAAC,UAAU,CAAC,gBAAgB,GAAG,qBAAqB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;QACxG,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC1B,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IACxF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAE3D,MAAM,KAAK,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAA;IAClC,IAAI,SAAwC,CAAA;IAC5C,IAAI,CAAC;QACH,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAA;QAEvF,4BAA4B;QAC5B,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;YACvB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;YACpE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;YAC5D,IAAI,QAAQ,GAAG,YAAY,CAAC,MAAM;gBAAE,MAAM,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;YAC/F,MAAM,cAAc,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAA;YAClD,OAAO,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QAC7E,CAAC;QAED,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QACpD,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC3B,MAAM,iBAAiB,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAA;QACpF,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrG,MAAM,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;QACrD,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvE,MAAM,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;QACrD,CAAC;QAED,MAAM,cAAc,CAAC,KAAK,CAAC,CAAA;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC5F,IAAI,IAAI;YAAE,OAAO,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QAErF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,+BAA+B;YAC/B,MAAM,KAAK,GAAG,IAAI,SAAS,CACzB,iBAAiB,EACjB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,sCAAsC,EACvF,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,CACzE,CAAA;YACD,IAAI,IAAI;gBAAE,OAAO,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAA;YACzD,MAAM,IAAI,GAAG,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAA;YAC1F,OAAO,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,SAAS,CAAC,CAAA;QACtG,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAA;QACrD,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA,CAAC,8BAA8B;QAC1D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACnG,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAA;QAClC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAA;QAEnC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QACxC,MAAM,OAAO,GAAG,GAAS,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC/D,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO;YAAE,OAAO,EAAE,CAAA;QACjC,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE;gBAC5D,SAAS;gBACT,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gBAC7D,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;gBACxD,GAAG;gBACH,eAAe;gBACf,SAAS,EAAE,OAAO;aACnB,CAAC,CAAA;YACF,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM,IAAI,cAAc,EAAE,CAAA;YACzD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YAC7E,OAAO,IAAI,CAAC,EAAE,CAAA;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM,IAAI,cAAc,EAAE,CAAA;YACzD,MAAM,KAAK,CAAA;QACb,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAClD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAA;IACjD,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,KAAK,EAAE,CAAA;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,cAAc,CAAC,KAAoC;IAChE,IAAI,CAAC,KAAK,EAAE,IAAI;QAAE,OAAM;IACxB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAA;IACxC,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAA;AACrG,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,WAAW,CAAC,QAAkB,EAAE,MAAyB;IACvE,IAAI,EAAE,GAAG,EAAE,CAAA;IACX,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;YAAE,MAAK;QAC1B,MAAM,SAAS,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAA;QAClD,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC;YAAE,MAAK;QACtF,EAAE,GAAG,SAAS,CAAA;QACd,QAAQ,EAAE,CAAA;IACZ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAA;AACzB,CAAC;AAED,0DAA0D;AAC1D,SAAS,SAAS,CAAC,QAAkB,EAAE,EAAU,EAAE,IAAuB;IACxE,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAAE,MAAK;QAClE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACZ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YAAE,MAAK;IAC1B,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC/D,IAAI,CAAC;QACH,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,SAAS;YAAE,OAAO,KAAK,CAAA;QAC5C,MAAM,KAAK,CAAA;IACb,CAAC;IACD,OAAO,IAAI,SAAS,CAAC,iBAAiB,EAAE,oBAAoB,OAAO,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AAC9H,CAAC;AAED,qFAAqF;AACrF,SAAS,SAAS,CAChB,QAAkB,EAClB,EAAU,EACV,EAAS,EACT,IAAY,EACZ,IAAa,EACb,KAA+B,EAC/B,MAA0B;IAE1B,MAAM,OAAO,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAoB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACnH,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;IACzH,OAAO,IAAI,CAAC,EAAE,CAAA;AAChB,CAAC;AAED,iCAAiC;AACjC,SAAS,QAAQ,CAAC,QAAkB,EAAE,EAAU,EAAE,IAAY,EAAE,MAA0B;IACxF,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/C,OAAO,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1D,CAAC;AAED,SAAS,MAAM,CAAC,KAAc,EAAE,EAAS,EAAE,IAAY,EAAE,IAAa,EAAE,SAA6B;IACnG,OAAO,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,CAAC,CAAA;AAChI,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IACjC,OAAO,IAAI,SAAS,CAAC,kBAAkB,EAAE,OAAO,EAAE;QAChD,OAAO,EAAE,EAAE;QACX,cAAc,EAAE,EAAE;QAClB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;QACrD,eAAe,EAAE,EAAE;QACnB,QAAQ,EAAE,EAAE;KACb,CAAC,CAAA;AACJ,CAAC;AAGD;;;;GAIG;AACH,SAAS,UAAU,CAAC,EAAS,EAAE,KAAiB,EAAE,GAAY,EAAE,IAAa,EAAE,MAAmB;IAChG,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;QAC/E,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG;YAAE,OAAO,IAAI,CAAA;QAClD,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,qCAAqC,CAAA;YAC3G,MAAM,IAAI,SAAS,CACjB,mBAAmB,EACnB,GAAG,OAAO,CAAC,OAAO,WAAW,OAAO,CAAC,OAAO,kCAAkC,IAAI,EAAE,EACpF,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAC7B,CAAA;QACH,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,OAAO,SAAS,EAAE,MAAM,CAAC,CAAA;YACxE,IAAI,MAAM,CAAC,OAAO;gBAAE,MAAM,IAAI,cAAc,EAAE,CAAA;YAC9C,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QAChD,CAAC;QACD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAA;QACvC,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;QACtE,MAAM,GAAG,GAA4B,EAAE,CAAA;QACvC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,IAAI,EAAE,MAAM,CAAC,CAAA;YAC7F,IAAI,MAAM,CAAC,OAAO;gBAAE,MAAM,IAAI,cAAc,EAAE,CAAA;YAC9C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE;gBAAE,SAAQ;YACnD,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAA;gBACnB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACvC,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;oBACrC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC3B,CAAC,CAAC,CAAA;gBACF,SAAQ;YACV,CAAC;YACD,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;YACrC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAA;QACtC,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC,CAAA;AACH,CAAC","sourcesContent":["import { createApp, loadCliErrorFormatter, loadConfig, resolveCommandsDir, resolveLocalPrincipal, type MextConfig } from \"../config.ts\"\nimport { MextError } from \"../errors.ts\"\nimport { isSegment } from \"../ids.ts\"\nimport { loadProjectInstrumentation, type Instrumentation } from \"../instrumentation.ts\"\nimport { authorize, findCommand, invoke, type AskHandler } from \"../invoke.ts\"\nimport type { ToolExposure } from \"../mcp/dispatch.ts\"\nimport { help } from \"../mcp/help.ts\"\nimport { loadCommand, resolveCommand, type RegisteredCommand, type Registry } from \"../registry.ts\"\nimport { loadRegistry } from \"../scan.ts\"\nimport { analyzeInput, assertCliConvertible, coerceValue, defineCliSpec, parseArgs } from \"./args.ts\"\nimport { askUrl } from \"./ask-url.ts\"\nimport { cliPath, renderHelp } from \"./help.ts\"\nimport { createLineReader, readAll, type CliIo, type LineReader } from \"./io.ts\"\nimport {\n CliInterrupted,\n emitError,\n EXIT,\n errorJson,\n exitCodeOf,\n formatError,\n formatJson,\n formatProgress,\n formatResult,\n type CliErrorFormatter,\n} from \"./output.ts\"\nimport { remoteTarget, runRemoteCommand } from \"./remote.ts\"\n\nexport const RUN_PROG = \"mext run\"\n\n/** 로컬 실행에 필요한 것: 계측 · 설정 · Registry (+ cli.errors formatter) */\nexport interface LocalRunLoaded {\n instrumentation: Instrumentation\n config: MextConfig\n registry: Registry\n}\n\n/**\n * 로컬 실행 코어의 입력. mext run = 소스 (commands/ · mext.config.ts), 로컬 bin = .mext/ 빌드 (start.ts runLocalBin)\n */\nexport interface LocalRunSource {\n /** help · 오류 안내의 명령 이름 (\"mext run\" · \"<bin>\") */\n prog: string\n /** 루트 help 뒤에 붙일 텍스트 (로컬 bin 내장 명령) */\n footer?: string\n /** instrumentation register → 설정 → formatter (setFormatter 로 즉시 전달, 이후 오류에 적용) → Registry */\n load(setFormatter: (formatter: CliErrorFormatter | undefined) => void): Promise<LocalRunLoaded>\n}\n\n/** mext run 의 소스: 도입 프로젝트 (cwd) 의 instrumentation.ts · mext.config.ts · cli.errors · commands/ */\nexport function projectSource(cwd: string): LocalRunSource {\n return {\n prog: RUN_PROG,\n async load(setFormatter) {\n // instrumentation.ts register() = 설정 · 명령어 모듈 import 전 (프로세스당 1회)\n const instrumentation = await loadProjectInstrumentation(cwd)\n const config = await loadConfig(cwd)\n setFormatter(await loadCliErrorFormatter(cwd, config))\n const registry = await loadRegistry(resolveCommandsDir(cwd, config))\n assertCliConvertible(registry)\n return { instrumentation, config, registry }\n },\n }\n}\n\n/**\n * mext run <ns> <cmd> [flags] — 로컬 실행 (ctx.principal.kind = local, mext.config.ts 의 localPrincipal 로 변경 가능).\n * mext run help [target] · mext run [<ns> [<cmd>]] --help · --json · --yes.\n * --url <url> (또는 MEXT_URL) = 원격 실행 (cli/remote.ts)\n */\nexport async function runCommand(argv: readonly string[], io: CliIo): Promise<number> {\n const remote = remoteTarget(argv, io.env)\n if (remote) return runRemoteCommand(remote, io)\n return runLocalCommand(argv, io, projectSource(io.cwd))\n}\n\n/**\n * 로컬 실행 코어 (mext run · 로컬 bin 공통). argv = 명령 경로 · 플래그 (help [target] 포함). 반환 = exit code\n */\nexport async function runLocalCommand(argv: readonly string[], io: CliIo, source: LocalRunSource): Promise<number> {\n const prog = source.prog\n const lead = { json: false, yes: false, help: false }\n let i = 0\n for (; i < argv.length; i++) {\n const tok = argv[i]!\n if (!tok.startsWith(\"-\") || tok === \"-\") break\n if (tok === \"--json\") lead.json = true\n else if (tok === \"--yes\") lead.yes = true\n else if (tok === \"--help\" || tok === \"-h\") lead.help = true\n else {\n return report(usageError(`unknown flag ${tok} before the command`), io, prog, argv.includes(\"--json\"))\n }\n }\n const rest = argv.slice(i)\n const beforeDashDash = rest.indexOf(\"--\") < 0 ? rest : rest.slice(0, rest.indexOf(\"--\"))\n const json = lead.json || beforeDashDash.includes(\"--json\")\n\n const lines = createLineReader(io)\n let formatter: CliErrorFormatter | undefined\n try {\n const { instrumentation, config, registry } = await source.load((f) => (formatter = f))\n\n // mext run help [target...]\n if (rest[0] === \"help\") {\n const targetTokens = rest.slice(1).filter((t) => !t.startsWith(\"-\"))\n const { id, consumed } = resolvePath(registry, targetTokens)\n if (consumed < targetTokens.length) throw unknownAt(registry, id, targetTokens.slice(consumed))\n await prepareCliSpec(resolveCommand(registry, id))\n return printHelp(registry, id, io, prog, json, config.tools, source.footer)\n }\n\n const { id, consumed } = resolvePath(registry, rest)\n const entry = id === \"\" ? undefined : resolveCommand(registry, id)\n const next = rest[consumed]\n const acceptsPositional = entry !== undefined && entry.command.positional.length > 0\n if (registry.namespaces.has(id) && next !== undefined && !next.startsWith(\"-\") && !acceptsPositional) {\n throw unknownAt(registry, id, rest.slice(consumed))\n }\n if (entry === undefined && next !== undefined && !next.startsWith(\"-\")) {\n throw unknownAt(registry, id, rest.slice(consumed))\n }\n\n await prepareCliSpec(entry)\n const help = lead.help || beforeDashDash.includes(\"--help\") || beforeDashDash.includes(\"-h\")\n if (help) return printHelp(registry, id, io, prog, json, config.tools, source.footer)\n\n if (!entry) {\n // 네임스페이스 (루트 포함) 만 지정 = 명령어 없음\n const error = new MextError(\n \"UNKNOWN_COMMAND\",\n id === \"\" ? \"No command given.\" : `\"${cliPath(id)}\" is a namespace. Specify a command.`,\n { command: id, suggested: [], usage: id === \"\" ? \"help\" : `help ${id}` },\n )\n if (json) return report(error, io, prog, true, formatter)\n const text = `${formatError(error, prog)}\\n${helpText(registry, id, prog, source.footer)}`\n return emitError(io, { body: errorJson(error), text, exitCode: EXIT.usage, json: false }, formatter)\n }\n\n const principal = await resolveLocalPrincipal(config)\n authorize(entry, principal) // 권한 → 입력 검증 순서 (invoke 와 같음)\n const parsed = await parseArgs(entry, rest.slice(consumed), { readStdin: () => readAll(io.stdin) })\n const yes = lead.yes || parsed.yes\n const app = await createApp(config)\n\n const controller = new AbortController()\n const onAbort = (): void => controller.abort(io.signal?.reason)\n if (io.signal?.aborted) onAbort()\n io.signal?.addEventListener(\"abort\", onAbort, { once: true })\n try {\n const result = await invoke(registry, entry.id, parsed.input, {\n principal,\n signal: controller.signal,\n progress: (update) => io.stderr.write(formatProgress(update)),\n ask: askHandler(io, lines, yes, json, controller.signal),\n app,\n instrumentation,\n transport: \"local\",\n })\n if (controller.signal.aborted) throw new CliInterrupted()\n io.stdout.write(json ? formatJson(result.value) : formatResult(result.value))\n return EXIT.ok\n } catch (error) {\n if (controller.signal.aborted) throw new CliInterrupted()\n throw error\n } finally {\n io.signal?.removeEventListener(\"abort\", onAbort)\n }\n } catch (error) {\n return report(error, io, prog, json, formatter)\n } finally {\n lines.close()\n }\n}\n\n/**\n * lazy Registry (로컬 bin 의 .mext/) 명령어 = 모듈 로드 후 Zod 입력 분석으로 CLI 필드 지정 (mext run 과 같은 파서).\n * 대상 명령어 하나만 로드. eager Registry (mext run) = 그대로\n */\nasync function prepareCliSpec(entry: RegisteredCommand | undefined): Promise<void> {\n if (!entry?.load) return\n const command = await loadCommand(entry)\n defineCliSpec(entry, analyzeInput(command.input, entry.inputSchema, entry.command.positional).spec)\n}\n\n/** 앞쪽 경로 토큰 → 가장 긴 네임스페이스 · 명령어 (별칭 포함) ID */\nexport function resolvePath(registry: Registry, tokens: readonly string[]): { id: string; consumed: number } {\n let id = \"\"\n let consumed = 0\n for (const tok of tokens) {\n if (!isSegment(tok)) break\n const candidate = id === \"\" ? tok : `${id}.${tok}`\n if (!registry.namespaces.has(candidate) && !resolveCommand(registry, candidate)) break\n id = candidate\n consumed++\n }\n return { id, consumed }\n}\n\n/** 해석되지 않은 경로 토큰 → UNKNOWN_COMMAND (suggested · usage) */\nfunction unknownAt(registry: Registry, id: string, tail: readonly string[]): MextError {\n const segs: string[] = []\n for (const t of tail) {\n if (t.startsWith(\"-\") || (segs.length > 0 && !isSegment(t))) break\n segs.push(t)\n if (!isSegment(t)) break\n }\n const unknown = [id, ...segs].filter((s) => s !== \"\").join(\".\")\n try {\n findCommand(registry, unknown)\n } catch (error) {\n if (error instanceof MextError) return error\n throw error\n }\n return new MextError(\"UNKNOWN_COMMAND\", `Unknown command \"${unknown}\".`, { command: unknown, suggested: [], usage: \"help\" })\n}\n\n/** --help --json = MCP help 의 structuredContent 와 같은 데이터 (mext mcp 의 tools 노출 기준) */\nfunction printHelp(\n registry: Registry,\n id: string,\n io: CliIo,\n prog: string,\n json: boolean,\n tools: ToolExposure | undefined,\n footer: string | undefined,\n): number {\n const toolFor = tools === \"split\" ? (e: RegisteredCommand) => (e.command.readOnly ? \"query\" : \"mutate\") : undefined\n io.stdout.write(json ? formatJson(help(registry, id, toolFor ? { toolFor } : {})) : helpText(registry, id, prog, footer))\n return EXIT.ok\n}\n\n/** 사람용 help. 루트면 footer 를 붙인다 */\nfunction helpText(registry: Registry, id: string, prog: string, footer: string | undefined): string {\n const text = renderHelp(registry, id, { prog })\n return id === \"\" && footer ? `${text}\\n${footer}` : text\n}\n\nfunction report(error: unknown, io: CliIo, prog: string, json: boolean, formatter?: CliErrorFormatter): number {\n return emitError(io, { body: errorJson(error), text: formatError(error, prog), exitCode: exitCodeOf(error), json }, formatter)\n}\n\nfunction usageError(message: string): MextError<\"INVALID_ARGUMENT\"> {\n return new MextError(\"INVALID_ARGUMENT\", message, {\n command: \"\",\n missing_fields: [],\n issues: [{ path: \"\", code: \"unknown_flag\", message }],\n expected_schema: {},\n examples: [],\n })\n}\n\n\n/**\n * ctx.ask. --yes = confirm 승인. TTY 없음 = 즉시 INPUT_UNAVAILABLE.\n * TTY = stderr 프롬프트 + stdin 한 줄 (confirm = y/yes, input = 필드별 입력을 스키마 모양으로 변환).\n * url = askUrl (--yes 미적용, --json = INPUT_UNAVAILABLE)\n */\nfunction askHandler(io: CliIo, lines: LineReader, yes: boolean, json: boolean, signal: AbortSignal): AskHandler {\n return async (request) => {\n if (request.kind === \"url\") return askUrl(io, lines, request, { json, signal })\n if (request.kind === \"confirm\" && yes) return true\n if (!io.isTTY) {\n const hint = request.kind === \"confirm\" ? \" Pass --yes to approve.\" : \" Run it in an interactive terminal.\"\n throw new MextError(\n \"INPUT_UNAVAILABLE\",\n `${request.command} asked \"${request.message}\", but stdin is not a terminal.${hint}`,\n { command: request.command },\n )\n }\n if (request.kind === \"confirm\") {\n const answer = await lines.question(`${request.message} [y/N] `, signal)\n if (signal.aborted) throw new CliInterrupted()\n return /^y(es)?$/i.test((answer ?? \"\").trim())\n }\n io.stderr.write(`${request.message}\\n`)\n const { spec } = analyzeInput(request.schema, request.requestedSchema)\n const out: Record<string, unknown> = {}\n for (const f of spec.fields) {\n const answer = await lines.question(` ${f.key}${f.required ? \"\" : \" (optional)\"}: `, signal)\n if (signal.aborted) throw new CliInterrupted()\n if (answer === undefined || answer === \"\") continue\n if (f.kind.type === \"array\") {\n const kind = f.kind\n out[f.key] = answer.split(\",\").map((s) => {\n const r = coerceValue(kind, s.trim())\n return r.ok ? r.value : s\n })\n continue\n }\n const r = coerceValue(f.kind, answer)\n out[f.key] = r.ok ? r.value : answer\n }\n return out\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"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","sourcesContent":["import { auditHidden, startAudit } from \"../audit.ts\"\nimport { createApp, loadCliErrorFormatter, loadConfig, resolveCommandsDir, resolveLocalPrincipal, type MextConfig } from \"../config.ts\"\nimport { surfaceOf } from \"../caller.ts\"\nimport { MextError } from \"../errors.ts\"\nimport { exposedRegistry, hasExposure } from \"../expose.ts\"\nimport { isSegment } from \"../ids.ts\"\nimport { loadProjectInstrumentation, type Instrumentation } from \"../instrumentation.ts\"\nimport { authorize, findCommand, invoke, type AskHandler } from \"../invoke.ts\"\nimport type { ToolExposure } from \"../mcp/dispatch.ts\"\nimport { help } from \"../mcp/help.ts\"\nimport { loadCommand, resolveCommand, type RegisteredCommand, type Registry } from \"../registry.ts\"\nimport { loadRegistry } from \"../scan.ts\"\nimport { analyzeInput, assertCliConvertible, coerceValue, defineCliSpec, parseArgs } from \"./args.ts\"\nimport { askUrl } from \"./ask-url.ts\"\nimport { cliPath, renderHelp } from \"./help.ts\"\nimport { createLineReader, readAll, type CliIo, type LineReader } from \"./io.ts\"\nimport {\n CliInterrupted,\n emitError,\n EXIT,\n errorJson,\n exitCodeOf,\n formatError,\n formatJson,\n formatProgress,\n formatResult,\n type CliErrorFormatter,\n} from \"./output.ts\"\nimport { remoteTarget, runRemoteCommand } from \"./remote.ts\"\n\nexport const RUN_PROG = \"mext run\"\n\n/** 로컬 실행에 필요한 것: 계측 · 설정 · Registry (+ cli.errors formatter) */\nexport interface LocalRunLoaded {\n instrumentation: Instrumentation\n config: MextConfig\n registry: Registry\n}\n\n/**\n * 로컬 실행 코어의 입력. mext run = 소스 (commands/ · mext.config.ts), 로컬 bin = .mext/ 빌드 (start.ts runLocalBin)\n */\nexport interface LocalRunSource {\n /** help · 오류 안내의 명령 이름 (\"mext run\" · \"<bin>\") */\n prog: string\n /** 루트 help 뒤에 붙일 텍스트 (로컬 bin 내장 명령) */\n footer?: string\n /** instrumentation register → 설정 → formatter (setFormatter 로 즉시 전달, 이후 오류에 적용) → Registry */\n load(setFormatter: (formatter: CliErrorFormatter | undefined) => void): Promise<LocalRunLoaded>\n}\n\n/** mext run 의 소스: 도입 프로젝트 (cwd) 의 instrumentation.ts · mext.config.ts · cli.errors · commands/ */\nexport function projectSource(cwd: string): LocalRunSource {\n return {\n prog: RUN_PROG,\n async load(setFormatter) {\n // instrumentation.ts register() = 설정 · 명령어 모듈 import 전 (프로세스당 1회)\n const instrumentation = await loadProjectInstrumentation(cwd)\n const config = await loadConfig(cwd)\n setFormatter(await loadCliErrorFormatter(cwd, config))\n const registry = await loadRegistry(resolveCommandsDir(cwd, config))\n assertCliConvertible(registry)\n return { instrumentation, config, registry }\n },\n }\n}\n\n/**\n * mext run <ns> <cmd> [flags] — 로컬 실행 (ctx.principal.kind = local, mext.config.ts 의 localPrincipal 로 변경 가능).\n * mext run help [target] · mext run [<ns> [<cmd>]] --help · --json · --yes.\n * --url <url> (또는 MEXT_URL) = 원격 실행 (cli/remote.ts)\n */\nexport async function runCommand(argv: readonly string[], io: CliIo): Promise<number> {\n const remote = remoteTarget(argv, io.env)\n if (remote) return runRemoteCommand(remote, io)\n return runLocalCommand(argv, io, projectSource(io.cwd))\n}\n\n/**\n * 로컬 실행 코어 (mext run · 로컬 bin 공통). argv = 명령 경로 · 플래그 (help [target] 포함). 반환 = exit code\n */\nexport async function runLocalCommand(argv: readonly string[], io: CliIo, source: LocalRunSource): Promise<number> {\n const prog = source.prog\n const lead = { json: false, yes: false, help: false }\n let i = 0\n for (; i < argv.length; i++) {\n const tok = argv[i]!\n if (!tok.startsWith(\"-\") || tok === \"-\") break\n if (tok === \"--json\") lead.json = true\n else if (tok === \"--yes\") lead.yes = true\n else if (tok === \"--help\" || tok === \"-h\") lead.help = true\n else {\n return report(usageError(`unknown flag ${tok} before the command`), io, prog, argv.includes(\"--json\"))\n }\n }\n const rest = argv.slice(i)\n const beforeDashDash = rest.indexOf(\"--\") < 0 ? rest : rest.slice(0, rest.indexOf(\"--\"))\n const json = lead.json || beforeDashDash.includes(\"--json\")\n\n const lines = createLineReader(io)\n let formatter: CliErrorFormatter | undefined\n try {\n const loaded = await source.load((f) => (formatter = f))\n const { instrumentation, config } = loaded\n // expose (§4): 로컬 주체의 표면 (기본 cli) 에서 숨긴 명령어 = 없는 명령어 (help · 경로 해석 · suggested).\n // expose 가 없으면 주체를 미리 만들지 않는다 (help 경로가 localPrincipal 을 부르지 않던 동작 유지)\n let principal = hasExposure(loaded.registry) ? await resolveLocalPrincipal(config, \"cli\") : undefined\n const registry = principal ? exposedRegistry(loaded.registry, surfaceOf(principal, \"local\")) : loaded.registry\n\n // mext run help [target...]\n if (rest[0] === \"help\") {\n const targetTokens = rest.slice(1).filter((t) => !t.startsWith(\"-\"))\n const { id, consumed } = resolvePath(registry, targetTokens)\n if (consumed < targetTokens.length) throw unknownAt(registry, id, targetTokens.slice(consumed))\n await prepareCliSpec(resolveCommand(registry, id))\n return printHelp(registry, id, io, prog, json, config.tools, source.footer)\n }\n\n const help = lead.help || beforeDashDash.includes(\"--help\") || beforeDashDash.includes(\"-h\")\n // 숨긴 명령어의 호출 시도 기록 (audit.includeHidden, §11.1): 전체 Registry 에서는 명령어인 경로. help 는 호출이 아니다.\n // 응답 = 아래의 UNKNOWN_COMMAND 그대로. 프로세스가 곧 끝나므로 전달을 기다린다\n if (principal && registry !== loaded.registry && config.audit?.includeHidden === true && !help) {\n const target = resolveCommand(loaded.registry, resolvePath(loaded.registry, rest).id)\n if (target && !registry.commands.has(target.id)) await auditHidden(target, { audit: config.audit, principal, transport: \"local\" })\n }\n\n const { id, consumed } = resolvePath(registry, rest)\n const entry = id === \"\" ? undefined : resolveCommand(registry, id)\n const next = rest[consumed]\n const acceptsPositional = entry !== undefined && entry.command.positional.length > 0\n if (registry.namespaces.has(id) && next !== undefined && !next.startsWith(\"-\") && !acceptsPositional) {\n throw unknownAt(registry, id, rest.slice(consumed))\n }\n if (entry === undefined && next !== undefined && !next.startsWith(\"-\")) {\n throw unknownAt(registry, id, rest.slice(consumed))\n }\n\n await prepareCliSpec(entry)\n if (help) return printHelp(registry, id, io, prog, json, config.tools, source.footer)\n\n if (!entry) {\n // 네임스페이스 (루트 포함) 만 지정 = 명령어 없음\n const error = new MextError(\n \"UNKNOWN_COMMAND\",\n id === \"\" ? \"No command given.\" : `\"${cliPath(id)}\" is a namespace. Specify a command.`,\n { command: id, suggested: [], usage: id === \"\" ? \"help\" : `help ${id}` },\n )\n if (json) return report(error, io, prog, true, formatter)\n const text = `${formatError(error, prog)}\\n${helpText(registry, id, prog, source.footer)}`\n return emitError(io, { body: errorJson(error), text, exitCode: EXIT.usage, json: false }, formatter)\n }\n\n principal ??= await resolveLocalPrincipal(config, \"cli\")\n try {\n authorize(entry, principal) // 권한 → 입력 검증 순서 (invoke 와 같음)\n } catch (error) {\n // invoke 전 거부도 감사 1건 (§11.1)\n await startAudit(entry, { principal, transport: \"local\", ...(config.audit ? { audit: config.audit } : {}) })?.finish({ error }, false)\n throw error\n }\n const parsed = await parseArgs(entry, rest.slice(consumed), { readStdin: () => readAll(io.stdin) })\n const yes = lead.yes || parsed.yes\n const app = await createApp(config)\n\n const controller = new AbortController()\n const onAbort = (): void => controller.abort(io.signal?.reason)\n if (io.signal?.aborted) onAbort()\n io.signal?.addEventListener(\"abort\", onAbort, { once: true })\n try {\n const result = await invoke(registry, entry.id, parsed.input, {\n principal,\n signal: controller.signal,\n progress: (update) => io.stderr.write(formatProgress(update)),\n ask: askHandler(io, lines, yes, json, controller.signal),\n app,\n instrumentation,\n transport: \"local\",\n ...(config.audit ? { audit: config.audit } : {}),\n ...(config.approval ? { approval: config.approval } : {}),\n })\n if (controller.signal.aborted) throw new CliInterrupted()\n io.stdout.write(json ? formatJson(result.value) : formatResult(result.value))\n return EXIT.ok\n } catch (error) {\n if (controller.signal.aborted) throw new CliInterrupted()\n throw error\n } finally {\n io.signal?.removeEventListener(\"abort\", onAbort)\n }\n } catch (error) {\n return report(error, io, prog, json, formatter)\n } finally {\n lines.close()\n }\n}\n\n/**\n * lazy Registry (로컬 bin 의 .mext/) 명령어 = 모듈 로드 후 Zod 입력 분석으로 CLI 필드 지정 (mext run 과 같은 파서).\n * 대상 명령어 하나만 로드. eager Registry (mext run) = 그대로\n */\nasync function prepareCliSpec(entry: RegisteredCommand | undefined): Promise<void> {\n if (!entry?.load) return\n const command = await loadCommand(entry)\n defineCliSpec(entry, analyzeInput(command.input, entry.inputSchema, entry.command.positional).spec)\n}\n\n/** 앞쪽 경로 토큰 → 가장 긴 네임스페이스 · 명령어 (별칭 포함) ID */\nexport function resolvePath(registry: Registry, tokens: readonly string[]): { id: string; consumed: number } {\n let id = \"\"\n let consumed = 0\n for (const tok of tokens) {\n if (!isSegment(tok)) break\n const candidate = id === \"\" ? tok : `${id}.${tok}`\n if (!registry.namespaces.has(candidate) && !resolveCommand(registry, candidate)) break\n id = candidate\n consumed++\n }\n return { id, consumed }\n}\n\n/** 해석되지 않은 경로 토큰 → UNKNOWN_COMMAND (suggested · usage) */\nfunction unknownAt(registry: Registry, id: string, tail: readonly string[]): MextError {\n const segs: string[] = []\n for (const t of tail) {\n if (t.startsWith(\"-\") || (segs.length > 0 && !isSegment(t))) break\n segs.push(t)\n if (!isSegment(t)) break\n }\n const unknown = [id, ...segs].filter((s) => s !== \"\").join(\".\")\n try {\n findCommand(registry, unknown)\n } catch (error) {\n if (error instanceof MextError) return error\n throw error\n }\n return new MextError(\"UNKNOWN_COMMAND\", `Unknown command \"${unknown}\".`, { command: unknown, suggested: [], usage: \"help\" })\n}\n\n/** --help --json = MCP help 의 structuredContent 와 같은 데이터 (mext mcp 의 tools 노출 기준) */\nfunction printHelp(\n registry: Registry,\n id: string,\n io: CliIo,\n prog: string,\n json: boolean,\n tools: ToolExposure | undefined,\n footer: string | undefined,\n): number {\n const toolFor = tools === \"split\" ? (e: RegisteredCommand) => (e.command.readOnly ? \"query\" : \"mutate\") : undefined\n io.stdout.write(json ? formatJson(help(registry, id, toolFor ? { toolFor } : {})) : helpText(registry, id, prog, footer))\n return EXIT.ok\n}\n\n/** 사람용 help. 루트면 footer 를 붙인다 */\nfunction helpText(registry: Registry, id: string, prog: string, footer: string | undefined): string {\n const text = renderHelp(registry, id, { prog })\n return id === \"\" && footer ? `${text}\\n${footer}` : text\n}\n\nfunction report(error: unknown, io: CliIo, prog: string, json: boolean, formatter?: CliErrorFormatter): number {\n return emitError(io, { body: errorJson(error), text: formatError(error, prog), exitCode: exitCodeOf(error), json }, formatter)\n}\n\nfunction usageError(message: string): MextError<\"INVALID_ARGUMENT\"> {\n return new MextError(\"INVALID_ARGUMENT\", message, {\n command: \"\",\n missing_fields: [],\n issues: [{ path: \"\", code: \"unknown_flag\", message }],\n expected_schema: {},\n examples: [],\n })\n}\n\n\n/**\n * ctx.ask. --yes = confirm 승인. TTY 없음 = 즉시 INPUT_UNAVAILABLE.\n * TTY = stderr 프롬프트 + stdin 한 줄 (confirm = y/yes, input = 필드별 입력을 스키마 모양으로 변환).\n * url = askUrl (--yes 미적용, --json = INPUT_UNAVAILABLE)\n */\nfunction askHandler(io: CliIo, lines: LineReader, yes: boolean, json: boolean, signal: AbortSignal): AskHandler {\n return async (request) => {\n if (request.kind === \"url\") return askUrl(io, lines, request, { json, signal })\n if (request.kind === \"confirm\" && yes) return true\n if (!io.isTTY) {\n const hint = request.kind === \"confirm\" ? \" Pass --yes to approve.\" : \" Run it in an interactive terminal.\"\n throw new MextError(\n \"INPUT_UNAVAILABLE\",\n `${request.command} asked \"${request.message}\", but stdin is not a terminal.${hint}`,\n { command: request.command },\n )\n }\n if (request.kind === \"confirm\") {\n const answer = await lines.question(`${request.message} [y/N] `, signal)\n if (signal.aborted) throw new CliInterrupted()\n return /^y(es)?$/i.test((answer ?? \"\").trim())\n }\n io.stderr.write(`${request.message}\\n`)\n const { spec } = analyzeInput(request.schema, request.requestedSchema)\n const out: Record<string, unknown> = {}\n for (const f of spec.fields) {\n const answer = await lines.question(` ${f.key}${f.required ? \"\" : \" (optional)\"}: `, signal)\n if (signal.aborted) throw new CliInterrupted()\n if (answer === undefined || answer === \"\") continue\n if (f.kind.type === \"array\") {\n const kind = f.kind\n out[f.key] = answer.split(\",\").map((s) => {\n const r = coerceValue(kind, s.trim())\n return r.ok ? r.value : s\n })\n continue\n }\n const r = coerceValue(f.kind, answer)\n out[f.key] = r.ok ? r.value : answer\n }\n return out\n }\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CliIo } from "./io.ts";
|
|
2
|
+
export declare const TYPES_PROG = "mext types";
|
|
3
|
+
/**
|
|
4
|
+
* mext types [--out <path>] [--check] — 명령어 타입 생성 (specs/client.md §4).
|
|
5
|
+
* 위치 = --out > mext.config.ts types > ./mext.gen.ts. types 설정이 없어도 동작한다.
|
|
6
|
+
* --check = 쓰지 않고 비교, 다르거나 없으면 exit 1
|
|
7
|
+
*/
|
|
8
|
+
export declare function typesCommand(argv: readonly string[], io: CliIo): Promise<number>;
|
|
9
|
+
export declare function typesHelp(): string;
|