@logixjs/cli 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/LICENSE +201 -0
  2. package/dist/Commands.d.ts +61 -0
  3. package/dist/Commands.js +16 -0
  4. package/dist/Commands.js.map +1 -0
  5. package/dist/anchorAutofill-V6CAXQHT.js +128 -0
  6. package/dist/anchorAutofill-V6CAXQHT.js.map +1 -0
  7. package/dist/anchorIndex-IEFARUZM.js +15 -0
  8. package/dist/anchorIndex-IEFARUZM.js.map +1 -0
  9. package/dist/bin/logix-devserver.d.ts +1 -0
  10. package/dist/bin/logix-devserver.js +32 -0
  11. package/dist/bin/logix-devserver.js.map +1 -0
  12. package/dist/bin/logix.d.ts +1 -0
  13. package/dist/bin/logix.js +37 -0
  14. package/dist/bin/logix.js.map +1 -0
  15. package/dist/chunk-6DZEO5HP.js +102 -0
  16. package/dist/chunk-6DZEO5HP.js.map +1 -0
  17. package/dist/chunk-HGHTOYNL.js +27 -0
  18. package/dist/chunk-HGHTOYNL.js.map +1 -0
  19. package/dist/chunk-PZ5AY32C.js +10 -0
  20. package/dist/chunk-PZ5AY32C.js.map +1 -0
  21. package/dist/chunk-RF7XSP3P.js +22 -0
  22. package/dist/chunk-RF7XSP3P.js.map +1 -0
  23. package/dist/chunk-TDQVD2IA.js +1193 -0
  24. package/dist/chunk-TDQVD2IA.js.map +1 -0
  25. package/dist/chunk-VRPSB3SV.js +143 -0
  26. package/dist/chunk-VRPSB3SV.js.map +1 -0
  27. package/dist/contractSuiteRun-5Y7LVI72.js +15 -0
  28. package/dist/contractSuiteRun-5Y7LVI72.js.map +1 -0
  29. package/dist/describe-5MFSLD7R.js +218 -0
  30. package/dist/describe-5MFSLD7R.js.map +1 -0
  31. package/dist/index.d.ts +2 -0
  32. package/dist/index.js +10 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/irDiff-WYXZEVA7.js +351 -0
  35. package/dist/irDiff-WYXZEVA7.js.map +1 -0
  36. package/dist/irExport-EI2VYIMT.js +87 -0
  37. package/dist/irExport-EI2VYIMT.js.map +1 -0
  38. package/dist/irValidate-JEQGVRL5.js +229 -0
  39. package/dist/irValidate-JEQGVRL5.js.map +1 -0
  40. package/dist/spyEvidence-JTJDS2WN.js +15 -0
  41. package/dist/spyEvidence-JTJDS2WN.js.map +1 -0
  42. package/dist/transformModule-D6YE3U5W.js +15 -0
  43. package/dist/transformModule-D6YE3U5W.js.map +1 -0
  44. package/dist/trialRun-SWVYG67P.js +15 -0
  45. package/dist/trialRun-SWVYG67P.js.map +1 -0
  46. package/package.json +69 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Commands.ts","../src/internal/args.ts","../src/internal/cliConfig.ts"],"sourcesContent":["import { Effect, Logger } from 'effect'\n\nimport type { SerializableErrorSummary } from './internal/errors.js'\nimport { asSerializableErrorSummary, exitCodeFromErrorSummary, makeCliError } from './internal/errors.js'\nimport type { ArtifactOutput, CommandResult } from './internal/result.js'\nimport { makeErrorCommandResult, sortArtifactsByOutputKey } from './internal/result.js'\nimport { stableStringifyJson } from './internal/stableJson.js'\nimport { parseCliInvocation, type CliHelpResult, type CliInvocation } from './internal/args.js'\nimport type { CliConfigArgvPrefixResolution } from './internal/cliConfig.js'\nimport { resolveCliConfigArgvPrefix, resolveCliConfigArgvPrefixResolution } from './internal/cliConfig.js'\n\nexport type RunOutcome =\n | { readonly kind: 'help'; readonly text: string; readonly exitCode: 0 }\n | { readonly kind: 'result'; readonly result: CommandResult; readonly exitCode: 0 | 1 | 2 }\n\nexport const formatCommandResult = (result: CommandResult): string => stableStringifyJson(result)\n\nexport const printHelp = (): string => `logix\n\n用法:\n logix describe --runId <id> --json [--out <dir>]\n logix ir export --runId <id> --entry <modulePath>#<exportName> [--out <dir>]\n logix ir validate --runId <id> --in <dir> [--out <dir>]\n logix ir diff --runId <id> --before <dir|file> --after <dir|file> [--out <dir>]\n logix trialrun --runId <id> --entry <modulePath>#<exportName> [--out <dir>] [--diagnosticsLevel off|light|full] [--maxEvents <n>] [--timeout <ms>] [--includeTrace]\n logix contract-suite run --runId <id> --entry <modulePath>#<exportName> [--baseline <dir>] [--out <dir>] [--allowWarn] [--includeContextPack] [--inputs <file|->] [--includeUiKitRegistry] [--packMaxBytes <n>] [--requireRulesManifest] [--includeAnchorAutofill] [--repoRoot <dir>] [--diagnosticsLevel off|light|full] [--maxEvents <n>] [--timeout <ms>] [--includeTrace]\n logix spy evidence --runId <id> --entry <modulePath>#<exportName> [--out <dir>] [--maxUsedServices <n>] [--maxRawMode <n>] [--timeout <ms>]\n logix anchor index --runId <id> [--repoRoot <dir>] [--out <dir>]\n logix anchor autofill --runId <id> [--repoRoot <dir>] [--mode report|write] [--tsconfig <path>] [--out <dir>]\n logix transform module --runId <id> --ops <delta.json|-> [--mode report|write] [--repoRoot <dir>] [--tsconfig <path>] [--out <dir>]\n\n全局参数:\n --runId <string> 必须显式提供(用于确定性工件命名与关联)\n --out <dir> 可选:稳定落盘目录(stdout 仍输出 CommandResult@v1)\n --outRoot <dir> 可选:当未显式 --out 时,自动落盘到 <outRoot>/<command>/<runId>\n --budgetBytes <n> 可选:stdout inline artifact 的预算上限(超限会截断并标记)\n --mode report|write 可选:写回模式(默认 report;仅对可写回命令生效)\n --tsconfig <path> 可选:ts-morph 解析/改写所用 tsconfig(默认自动探测/降级)\n --host <name> 可选:执行宿主(node|browser-mock;默认 node;影响入口加载/试跑)\n --cliConfig <path> 可选:显式指定 logix.cli.json(不提供则从 cwd 向上查找)\n --profile <name> 可选:选择配置文件中的 profile(在 defaults 之上叠加)\n --config <K=V> 可选:注入运行环境 config(可重复;仅 trialrun/contract-suite 消费)\n -h, --help 显示帮助\n`\n\ntype IrExportInvocation = Extract<CliInvocation, { readonly command: 'ir.export' }>\ntype IrValidateInvocation = Extract<CliInvocation, { readonly command: 'ir.validate' }>\ntype IrDiffInvocation = Extract<CliInvocation, { readonly command: 'ir.diff' }>\ntype DescribeInvocation = Extract<CliInvocation, { readonly command: 'describe' }>\ntype TrialRunInvocation = Extract<CliInvocation, { readonly command: 'trialrun' }>\ntype ContractSuiteRunInvocation = Extract<CliInvocation, { readonly command: 'contract-suite.run' }>\ntype SpyEvidenceInvocation = Extract<CliInvocation, { readonly command: 'spy.evidence' }>\ntype AnchorIndexInvocation = Extract<CliInvocation, { readonly command: 'anchor.index' }>\ntype AnchorAutofillInvocation = Extract<CliInvocation, { readonly command: 'anchor.autofill' }>\ntype TransformModuleInvocation = Extract<CliInvocation, { readonly command: 'transform.module' }>\n\ntype RunCommandContext = {\n readonly argv: ReadonlyArray<string>\n readonly argvWithConfigPrefix: ReadonlyArray<string>\n readonly cliConfig: CliConfigArgvPrefixResolution\n}\n\nconst EMPTY_CLI_CONFIG_RESOLUTION: CliConfigArgvPrefixResolution = {\n prefix: [],\n layers: [],\n discovery: { found: false },\n}\n\nconst runIrExport = (inv: IrExportInvocation): Effect.Effect<CommandResult, unknown> =>\n Effect.tryPromise({\n try: () => import('./internal/commands/irExport.js'),\n catch: (cause) =>\n makeCliError({\n code: 'CLI_COMMAND_IMPORT_FAILED',\n message: '[Logix][CLI] 加载命令失败:ir.export',\n cause,\n }),\n }).pipe(Effect.flatMap((mod) => mod.runIrExport(inv)))\n\nconst runDescribe = (inv: DescribeInvocation, ctx: RunCommandContext): Effect.Effect<CommandResult, unknown> =>\n Effect.tryPromise({\n try: () => import('./internal/commands/describe.js'),\n catch: (cause) =>\n makeCliError({\n code: 'CLI_COMMAND_IMPORT_FAILED',\n message: '[Logix][CLI] 加载命令失败:describe',\n cause,\n }),\n }).pipe(\n Effect.flatMap((mod) =>\n mod.runDescribe(inv, {\n argv: ctx.argv,\n argvWithConfigPrefix: ctx.argvWithConfigPrefix,\n cliConfig: ctx.cliConfig,\n }),\n ),\n )\n\nconst runTrialRun = (inv: TrialRunInvocation): Effect.Effect<CommandResult, unknown> =>\n Effect.tryPromise({\n try: () => import('./internal/commands/trialRun.js'),\n catch: (cause) =>\n makeCliError({\n code: 'CLI_COMMAND_IMPORT_FAILED',\n message: '[Logix][CLI] 加载命令失败:trialrun',\n cause,\n }),\n }).pipe(Effect.flatMap((mod) => mod.runTrialRun(inv)))\n\nconst runContractSuiteRun = (inv: ContractSuiteRunInvocation): Effect.Effect<CommandResult, unknown> =>\n Effect.tryPromise({\n try: () => import('./internal/commands/contractSuiteRun.js'),\n catch: (cause) =>\n makeCliError({\n code: 'CLI_COMMAND_IMPORT_FAILED',\n message: '[Logix][CLI] 加载命令失败:contract-suite.run',\n cause,\n }),\n }).pipe(Effect.flatMap((mod) => mod.runContractSuiteRun(inv)))\n\nconst runSpyEvidence = (inv: SpyEvidenceInvocation): Effect.Effect<CommandResult, unknown> =>\n Effect.tryPromise({\n try: () => import('./internal/commands/spyEvidence.js'),\n catch: (cause) =>\n makeCliError({\n code: 'CLI_COMMAND_IMPORT_FAILED',\n message: '[Logix][CLI] 加载命令失败:spy.evidence',\n cause,\n }),\n }).pipe(Effect.flatMap((mod) => mod.runSpyEvidence(inv)))\n\nconst runIrValidate = (inv: IrValidateInvocation): Effect.Effect<CommandResult, unknown> =>\n Effect.tryPromise({\n try: () => import('./internal/commands/irValidate.js'),\n catch: (cause) =>\n makeCliError({\n code: 'CLI_COMMAND_IMPORT_FAILED',\n message: '[Logix][CLI] 加载命令失败:ir.validate',\n cause,\n }),\n }).pipe(Effect.flatMap((mod) => mod.runIrValidate(inv)))\n\nconst runIrDiff = (inv: IrDiffInvocation): Effect.Effect<CommandResult, unknown> =>\n Effect.tryPromise({\n try: () => import('./internal/commands/irDiff.js'),\n catch: (cause) =>\n makeCliError({\n code: 'CLI_COMMAND_IMPORT_FAILED',\n message: '[Logix][CLI] 加载命令失败:ir.diff',\n cause,\n }),\n }).pipe(Effect.flatMap((mod) => mod.runIrDiff(inv)))\n\nconst runAnchorIndex = (inv: AnchorIndexInvocation): Effect.Effect<CommandResult, unknown> =>\n Effect.tryPromise({\n try: () => import('./internal/commands/anchorIndex.js'),\n catch: (cause) =>\n makeCliError({\n code: 'CLI_COMMAND_IMPORT_FAILED',\n message: '[Logix][CLI] 加载命令失败:anchor.index',\n cause,\n }),\n }).pipe(Effect.flatMap((mod) => mod.runAnchorIndex(inv)))\n\nconst runAnchorAutofill = (inv: AnchorAutofillInvocation): Effect.Effect<CommandResult, unknown> =>\n Effect.tryPromise({\n try: () => import('./internal/commands/anchorAutofill.js'),\n catch: (cause) =>\n makeCliError({\n code: 'CLI_COMMAND_IMPORT_FAILED',\n message: '[Logix][CLI] 加载命令失败:anchor.autofill',\n cause,\n }),\n }).pipe(Effect.flatMap((mod) => mod.runAnchorAutofill(inv)))\n\nconst runTransformModule = (inv: TransformModuleInvocation): Effect.Effect<CommandResult, unknown> =>\n Effect.tryPromise({\n try: () => import('./internal/commands/transformModule.js'),\n catch: (cause) =>\n makeCliError({\n code: 'CLI_COMMAND_IMPORT_FAILED',\n message: '[Logix][CLI] 加载命令失败:transform.module',\n cause,\n }),\n }).pipe(Effect.flatMap((mod) => mod.runTransformModule(inv)))\n\nconst runCommand = (inv: CliInvocation, ctx: RunCommandContext): Effect.Effect<CommandResult, unknown> => {\n switch (inv.command) {\n case 'describe':\n return runDescribe(inv, ctx)\n case 'ir.export':\n return runIrExport(inv)\n case 'ir.validate':\n return runIrValidate(inv)\n case 'ir.diff':\n return runIrDiff(inv)\n case 'trialrun':\n return runTrialRun(inv)\n case 'contract-suite.run':\n return runContractSuiteRun(inv)\n case 'spy.evidence':\n return runSpyEvidence(inv)\n case 'anchor.index':\n return runAnchorIndex(inv)\n case 'anchor.autofill':\n return runAnchorAutofill(inv)\n case 'transform.module':\n return runTransformModule(inv)\n }\n}\n\nconst isHelp = (x: CliHelpResult | CliInvocation): x is CliHelpResult => (x as any).kind === 'help'\n\nconst tryGetRunId = (argv: ReadonlyArray<string>): string | undefined => {\n const idx = argv.lastIndexOf('--runId')\n if (idx < 0) return undefined\n const next = argv[idx + 1]\n if (!next || next.startsWith('--')) return undefined\n return typeof next === 'string' && next.length > 0 ? next : undefined\n}\n\nconst resolveRunIdForFailure = (argv: ReadonlyArray<string>): Effect.Effect<string, never> => {\n const fromArgv = tryGetRunId(argv)\n if (fromArgv) return Effect.succeed(fromArgv)\n\n return resolveCliConfigArgvPrefix(argv).pipe(\n Effect.map((prefix) => (prefix.length > 0 ? [...prefix, ...argv] : argv)),\n Effect.map((argv2) => tryGetRunId(argv2) ?? 'missing-runId'),\n Effect.catch(() => Effect.succeed('missing-runId')),\n )\n}\n\nconst isHostErrorCode = (code: string | undefined): code is 'CLI_HOST_MISSING_BROWSER_GLOBAL' | 'CLI_HOST_MISMATCH' =>\n code === 'CLI_HOST_MISSING_BROWSER_GLOBAL' || code === 'CLI_HOST_MISMATCH'\n\nconst stripHostFromArgv = (argv: ReadonlyArray<string>): ReadonlyArray<string> => {\n const out: string[] = []\n for (let i = 0; i < argv.length; i++) {\n const token = argv[i]!\n if (token === '--host') {\n i += 1\n continue\n }\n if (token.startsWith('--host=')) continue\n out.push(token)\n }\n return out\n}\n\nconst makeCliDiagnosticsArtifact = (args: {\n readonly errorCode: 'CLI_HOST_MISSING_BROWSER_GLOBAL' | 'CLI_HOST_MISMATCH'\n readonly argv: ReadonlyArray<string>\n}): ArtifactOutput => {\n const argvNoHost = stripHostFromArgv(args.argv)\n const command = `logix --host browser-mock ${argvNoHost.join(' ')}`.trim()\n\n return {\n outputKey: 'cliDiagnostics',\n kind: 'CliDiagnostics',\n schemaVersion: 1,\n ok: true,\n inline: {\n schemaVersion: 1,\n kind: 'CliDiagnostics',\n diagnostics: [\n {\n severity: 'error',\n code: args.errorCode,\n message:\n args.errorCode === 'CLI_HOST_MISSING_BROWSER_GLOBAL'\n ? '入口需要浏览器全局(window/document/navigator 等);请用 browser-mock host 重跑,或把浏览器代码移出模块顶层。'\n : 'host 可能不匹配;请尝试 browser-mock,或把浏览器代码移出模块顶层。',\n action: { kind: 'run.command', command },\n },\n ],\n } as any,\n }\n}\n\nconst withHostDiagnosticsIfNeeded = (result: CommandResult, argv: ReadonlyArray<string>): CommandResult => {\n if (result.ok) return result\n const code = result.error?.code\n if (!isHostErrorCode(code)) return result\n if (result.artifacts.some((a) => a.outputKey === 'cliDiagnostics')) return result\n return {\n ...result,\n artifacts: [...result.artifacts, makeCliDiagnosticsArtifact({ errorCode: code, argv })],\n }\n}\n\nexport const runCli = (argv: ReadonlyArray<string>): Effect.Effect<RunOutcome, never> =>\n (argv.includes('-h') || argv.includes('--help') || argv.length === 0\n ? Effect.succeed({\n argv2: argv,\n cliConfig: EMPTY_CLI_CONFIG_RESOLUTION,\n })\n : resolveCliConfigArgvPrefixResolution(argv).pipe(\n Effect.map((resolved) => ({\n argv2: resolved.prefix.length > 0 ? [...resolved.prefix, ...argv] : argv,\n cliConfig: resolved,\n })),\n )\n ).pipe(\n Effect.flatMap(({ argv2, cliConfig }) =>\n parseCliInvocation(argv2, {\n helpText: printHelp(),\n }).pipe(Effect.map((parsed) => ({ argv2, parsed, cliConfig }))),\n ),\n Effect.matchEffect({\n onFailure: (cause) => {\n const error = asSerializableErrorSummary(cause)\n return resolveRunIdForFailure(argv).pipe(\n Effect.map((runId) => ({\n kind: 'result',\n result: makeErrorCommandResult({ runId, command: 'unknown', error }),\n exitCode: exitCodeFromErrorSummary(error),\n }) as RunOutcome),\n )\n },\n onSuccess: ({ argv2, parsed, cliConfig }) => {\n if (isHelp(parsed)) {\n return Effect.succeed({ kind: 'help', text: parsed.text, exitCode: 0 } as RunOutcome)\n }\n\n return runCommand(parsed, {\n argv,\n argvWithConfigPrefix: argv2,\n cliConfig,\n }).pipe(\n Effect.map(\n (result) => {\n const result2 = withHostDiagnosticsIfNeeded(result, argv2)\n return {\n kind: 'result' as const,\n result: {\n ...result2,\n artifacts: sortArtifactsByOutputKey(result2.artifacts),\n },\n exitCode: result2.ok ? 0 : exitCodeFromErrorSummary(result2.error),\n } as RunOutcome\n },\n ),\n Effect.catchCause((cause) => {\n const error: SerializableErrorSummary = asSerializableErrorSummary(\n makeCliError({\n code: 'CLI_COMMAND_FAILED',\n message: `[Logix][CLI] 命令执行失败:${parsed.command}`,\n cause,\n }),\n )\n const result = makeErrorCommandResult({\n runId: parsed.global.runId,\n command: parsed.command,\n error,\n })\n return Effect.succeed({ kind: 'result', result, exitCode: 1 } as RunOutcome)\n }),\n )\n },\n }),\n Effect.catchCause((cause) => {\n const error: SerializableErrorSummary = asSerializableErrorSummary(\n makeCliError({\n code: 'CLI_INTERNAL',\n message: '[Logix][CLI] 入口执行失败',\n cause,\n }),\n )\n return resolveRunIdForFailure(argv).pipe(\n Effect.map((runId) => ({\n kind: 'result',\n result: makeErrorCommandResult({ runId, command: 'unknown', error }),\n exitCode: 1,\n }) as RunOutcome),\n )\n }),\n // CLI stdout is a strict protocol (CommandResult@v1); silence Effect logs to avoid polluting stdout/stderr.\n Effect.provide(Logger.layer([Logger.make(() => {})])),\n )\n\nexport const main = runCli\n","import path from 'node:path'\n\nimport { Effect } from 'effect'\n\nimport { makeCliError } from './errors.js'\n\nexport type DiagnosticsLevel = 'off' | 'light' | 'full'\nexport type CliMode = 'report' | 'write'\nexport type CliHost = 'node' | 'browser-mock'\n\nexport type EntryRef = {\n readonly modulePath: string\n readonly exportName: string\n}\n\nexport type IrValidateInput =\n | { readonly kind: 'dir'; readonly dir: string }\n | { readonly kind: 'file'; readonly file: string }\n\nexport type CliCommand =\n | 'describe'\n | 'ir.export'\n | 'ir.validate'\n | 'ir.diff'\n | 'trialrun'\n | 'contract-suite.run'\n | 'anchor.index'\n | 'anchor.autofill'\n | 'transform.module'\n | 'spy.evidence'\n\nexport type CliInvocation =\n | {\n readonly kind: 'command'\n readonly command: 'describe'\n readonly global: CliInvocation.Global\n readonly format: 'json'\n }\n | {\n readonly kind: 'command'\n readonly command: 'ir.export'\n readonly global: CliInvocation.Global\n readonly entry: EntryRef\n }\n | {\n readonly kind: 'command'\n readonly command: 'ir.validate'\n readonly global: CliInvocation.Global\n readonly input: IrValidateInput\n }\n | {\n readonly kind: 'command'\n readonly command: 'ir.diff'\n readonly global: CliInvocation.Global\n readonly before: string\n readonly after: string\n }\n | {\n readonly kind: 'command'\n readonly command: 'trialrun'\n readonly global: CliInvocation.Global\n readonly entry: EntryRef\n readonly diagnosticsLevel: DiagnosticsLevel\n readonly maxEvents?: number\n readonly timeoutMs?: number\n readonly includeTrace: boolean\n readonly config: Record<string, string | number | boolean>\n }\n | {\n readonly kind: 'command'\n readonly command: 'contract-suite.run'\n readonly global: CliInvocation.Global\n readonly entry: EntryRef\n readonly diagnosticsLevel: DiagnosticsLevel\n readonly maxEvents?: number\n readonly timeoutMs?: number\n readonly includeTrace: boolean\n readonly config: Record<string, string | number | boolean>\n readonly allowWarn: boolean\n readonly baselineDir?: string\n readonly includeContextPack: boolean\n readonly packMaxBytes?: number\n readonly requireRulesManifest: boolean\n readonly inputsFile?: string\n readonly includeUiKitRegistry: boolean\n readonly includeAnchorAutofill: boolean\n readonly repoRoot: string\n }\n | {\n readonly kind: 'command'\n readonly command: 'spy.evidence'\n readonly global: CliInvocation.Global\n readonly entry: EntryRef\n readonly maxUsedServices?: number\n readonly maxRawMode?: number\n readonly timeoutMs?: number\n }\n | {\n readonly kind: 'command'\n readonly command: 'anchor.index'\n readonly global: CliInvocation.Global\n readonly repoRoot: string\n }\n | {\n readonly kind: 'command'\n readonly command: 'anchor.autofill'\n readonly global: CliInvocation.Global\n readonly repoRoot: string\n }\n | {\n readonly kind: 'command'\n readonly command: 'transform.module'\n readonly global: CliInvocation.Global\n readonly repoRoot: string\n readonly opsPath: string\n }\n\nexport declare namespace CliInvocation {\n export type Global = {\n readonly runId: string\n readonly outDir?: string\n readonly budgetBytes?: number\n readonly mode?: CliMode\n readonly tsconfig?: string\n readonly host: CliHost\n }\n}\n\nexport type CliHelpResult = { readonly kind: 'help'; readonly text: string }\n\nconst capitalize = (s: string): string => (s.length === 0 ? s : `${s[0]!.toUpperCase()}${s.slice(1)}`)\nconst decapitalize = (s: string): string => (s.length === 0 ? s : `${s[0]!.toLowerCase()}${s.slice(1)}`)\n\nconst parseConfigValue = (value: string): string | number | boolean => {\n const trimmed = value.trim()\n if (trimmed === 'true') return true\n if (trimmed === 'false') return false\n const asNumber = Number(trimmed)\n return Number.isFinite(asNumber) ? asNumber : trimmed\n}\n\nconst parseEntryRefFromOptions = (opts: {\n readonly entry?: string\n}): Effect.Effect<EntryRef, ReturnType<typeof makeCliError>> => {\n const entryRaw = typeof opts.entry === 'string' ? opts.entry.trim() : undefined\n if (!entryRaw) {\n return Effect.fail(\n makeCliError({\n code: 'CLI_INVALID_ARGUMENT',\n message: '缺少入口:请提供 --entry <modulePath>#<exportName>',\n }),\n )\n }\n\n const hash = entryRaw.lastIndexOf('#')\n if (hash > 0 && hash < entryRaw.length - 1) {\n return Effect.succeed({ modulePath: entryRaw.slice(0, hash), exportName: entryRaw.slice(hash + 1) })\n }\n return Effect.fail(\n makeCliError({\n code: 'CLI_INVALID_ARGUMENT',\n message: `--entry 非法:${entryRaw}(期望 <modulePath>#<exportName>)`,\n }),\n )\n}\n\nconst parseIrValidateInputFromOptions = (opts: {\n readonly inDir?: string\n readonly artifact?: string\n}): Effect.Effect<IrValidateInput, ReturnType<typeof makeCliError>> => {\n const dir = typeof opts.inDir === 'string' ? opts.inDir.trim() : undefined\n const file = typeof opts.artifact === 'string' ? opts.artifact.trim() : undefined\n\n if (dir && file) {\n return Effect.fail(\n makeCliError({\n code: 'CLI_INVALID_ARGUMENT',\n message: '参数互斥:请仅提供 --in 或 --artifact。',\n }),\n )\n }\n if (dir) return Effect.succeed({ kind: 'dir', dir })\n if (file) return Effect.succeed({ kind: 'file', file })\n return Effect.fail(\n makeCliError({\n code: 'CLI_INVALID_ARGUMENT',\n message: '缺少输入:请提供 --in <dir> 或 --artifact <file>',\n }),\n )\n}\n\nconst parseIrDiffInputFromOptions = (opts: {\n readonly before?: string\n readonly after?: string\n}): Effect.Effect<{ readonly before: string; readonly after: string }, ReturnType<typeof makeCliError>> => {\n const before = typeof opts.before === 'string' ? opts.before.trim() : undefined\n const after = typeof opts.after === 'string' ? opts.after.trim() : undefined\n if (!before || !after) {\n return Effect.fail(\n makeCliError({\n code: 'CLI_INVALID_ARGUMENT',\n message: '缺少输入:请提供 --before <dir|file> 与 --after <dir|file>',\n }),\n )\n }\n return Effect.succeed({ before, after })\n}\n\nexport type ParsedOptions = {\n readonly runId?: string\n readonly out?: string\n readonly outRoot?: string\n readonly budgetBytes?: number\n readonly mode?: CliMode\n readonly tsconfig?: string\n readonly host: CliHost\n readonly cliConfig?: string\n readonly profile?: string\n readonly repoRoot: string\n readonly entry?: string\n readonly inDir?: string\n readonly artifact?: string\n readonly before?: string\n readonly after?: string\n readonly opsPath?: string\n readonly diagnosticsLevel: DiagnosticsLevel\n readonly maxEvents?: number\n readonly timeoutMs?: number\n readonly includeTrace: boolean\n readonly config: Record<string, string | number | boolean>\n readonly allowWarn: boolean\n readonly baselineDir?: string\n readonly includeContextPack: boolean\n readonly packMaxBytes?: number\n readonly requireRulesManifest: boolean\n readonly inputsFile?: string\n readonly includeUiKitRegistry: boolean\n readonly includeAnchorAutofill: boolean\n readonly maxUsedServices?: number\n readonly maxRawMode?: number\n readonly describeJson: boolean\n}\n\ntype LeafParsed =\n | {\n readonly command: 'describe'\n readonly options: ParsedOptions\n readonly format: 'json'\n }\n | { readonly command: 'ir.export'; readonly options: ParsedOptions; readonly entry: EntryRef }\n | { readonly command: 'ir.validate'; readonly options: ParsedOptions; readonly input: IrValidateInput }\n | { readonly command: 'ir.diff'; readonly options: ParsedOptions; readonly before: string; readonly after: string }\n | {\n readonly command: 'trialrun'\n readonly options: ParsedOptions\n readonly entry: EntryRef\n readonly diagnosticsLevel: DiagnosticsLevel\n readonly maxEvents?: number\n readonly timeoutMs?: number\n readonly includeTrace: boolean\n readonly config: Record<string, string | number | boolean>\n }\n | {\n readonly command: 'contract-suite.run'\n readonly options: ParsedOptions\n readonly entry: EntryRef\n readonly diagnosticsLevel: DiagnosticsLevel\n readonly maxEvents?: number\n readonly timeoutMs?: number\n readonly includeTrace: boolean\n readonly config: Record<string, string | number | boolean>\n readonly allowWarn: boolean\n readonly baselineDir?: string\n readonly includeContextPack: boolean\n readonly packMaxBytes?: number\n readonly requireRulesManifest: boolean\n readonly inputsFile?: string\n readonly includeUiKitRegistry: boolean\n readonly includeAnchorAutofill: boolean\n readonly repoRoot: string\n }\n | {\n readonly command: 'spy.evidence'\n readonly options: ParsedOptions\n readonly entry: EntryRef\n readonly maxUsedServices?: number\n readonly maxRawMode?: number\n readonly timeoutMs?: number\n }\n | { readonly command: 'anchor.index'; readonly options: ParsedOptions; readonly repoRoot: string }\n | { readonly command: 'anchor.autofill'; readonly options: ParsedOptions; readonly repoRoot: string }\n | { readonly command: 'transform.module'; readonly options: ParsedOptions; readonly repoRoot: string; readonly opsPath: string }\n\n\nconst booleanOptionNames = new Set([\n 'allowWarn',\n 'includeAnchorAutofill',\n 'includeContextPack',\n 'includeTrace',\n 'includeUiKitRegistry',\n 'json',\n 'requireRulesManifest',\n])\n\nconst flagsWithValue = new Set([\n '--after',\n '--artifact',\n '--baseline',\n '--before',\n '--budgetBytes',\n '--cliConfig',\n '--config',\n '--diagnosticsLevel',\n '--entry',\n '--host',\n '--in',\n '--inputs',\n '--maxEvents',\n '--maxRawMode',\n '--maxUsedServices',\n '--mode',\n '--ops',\n '--out',\n '--outRoot',\n '--packMaxBytes',\n '--profile',\n '--repoRoot',\n '--runId',\n '--timeout',\n '--tsconfig',\n])\n\nconst isKnownBooleanFlag = (flag: string): boolean => {\n if (!flag.startsWith('--')) return false\n const name = flag.slice(2)\n if (booleanOptionNames.has(name)) return true\n if (name.startsWith('no')) {\n const canonical = decapitalize(name.slice(2))\n return booleanOptionNames.has(canonical)\n }\n return false\n}\n\nconst canonicalOptionKey = (flag: string): string | undefined => {\n if (!flag.startsWith('--')) return undefined\n const name = flag.slice(2)\n if (isKnownBooleanFlag(flag)) {\n if (name.startsWith('no')) return decapitalize(name.slice(2))\n return name\n }\n return name\n}\n\ntype ParsedOptionOccurrence = {\n readonly key?: string\n readonly tokens: ReadonlyArray<string>\n readonly allowMultiple: boolean\n}\n\nconst parseOptionOccurrences = (tokens: ReadonlyArray<string>): ReadonlyArray<ParsedOptionOccurrence> => {\n const out: Array<ParsedOptionOccurrence> = []\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!\n if (token.startsWith('-')) {\n const key = canonicalOptionKey(token)\n const allowMultiple = key === 'config'\n if (flagsWithValue.has(token)) {\n const value = tokens[i + 1]\n if (value !== undefined) {\n out.push({ key, tokens: [token, value], allowMultiple })\n i += 1\n continue\n }\n out.push({ key, tokens: [token], allowMultiple })\n continue\n }\n out.push({ key, tokens: [token], allowMultiple })\n continue\n }\n out.push({ tokens: [token], allowMultiple: true })\n }\n return out\n}\n\nconst dedupeOptionTokensLastWins = (tokens: ReadonlyArray<string>): ReadonlyArray<string> => {\n const occurrences = parseOptionOccurrences(tokens)\n const seen = new Set<string>()\n const kept: Array<ParsedOptionOccurrence> = []\n for (let i = occurrences.length - 1; i >= 0; i--) {\n const occ = occurrences[i]!\n if (!occ.key || occ.allowMultiple) {\n kept.push(occ)\n continue\n }\n if (seen.has(occ.key)) continue\n seen.add(occ.key)\n kept.push(occ)\n }\n kept.reverse()\n return kept.flatMap((o) => o.tokens)\n}\n\ntype ExtractedCommandTokens = {\n readonly tokens: ReadonlyArray<string>\n readonly indices: ReadonlyArray<number>\n}\n\nconst commandTokenShapes: ReadonlyArray<ReadonlyArray<string>> = [\n ['describe'],\n ['trialrun'],\n ['ir', 'export'],\n ['ir', 'validate'],\n ['ir', 'diff'],\n ['contract-suite', 'run'],\n ['spy', 'evidence'],\n ['anchor', 'index'],\n ['anchor', 'autofill'],\n ['transform', 'module'],\n]\n\nconst findCommandTokens = (argv: ReadonlyArray<string>): ExtractedCommandTokens | undefined => {\n for (let i = 0; i < argv.length; i++) {\n const token = argv[i]!\n if (token.startsWith('-')) {\n if (flagsWithValue.has(token)) i += 1\n continue\n }\n for (const shape of commandTokenShapes) {\n if (shape[0] !== token) continue\n let ok = true\n for (let j = 1; j < shape.length; j++) {\n if (argv[i + j] !== shape[j]) {\n ok = false\n break\n }\n }\n if (!ok) continue\n return { tokens: shape, indices: shape.map((_, j) => i + j) }\n }\n }\n return undefined\n}\n\nconst normalizeArgvForEffectCli = (argv: ReadonlyArray<string>): ReadonlyArray<string> => {\n const extracted = findCommandTokens(argv)\n if (!extracted) return dedupeOptionTokensLastWins(argv)\n\n const drop = new Set(extracted.indices)\n const rest = argv.filter((_, idx) => !drop.has(idx))\n return [...extracted.tokens, ...dedupeOptionTokensLastWins(rest)]\n}\n\nconst ANSI_CSI_REGEX = new RegExp(`${String.fromCharCode(27)}\\\\[[0-9;]*m`, 'g')\n\nconst renderValidationError = (err: unknown): string => {\n if (err instanceof Error && typeof err.message === 'string' && err.message.length > 0) {\n return err.message.replace(ANSI_CSI_REGEX, '').trim()\n }\n return typeof err === 'string' ? err : 'CLI validation failed'\n}\n\nconst defaultParsedOptions = (): ParsedOptions => ({\n host: 'node',\n repoRoot: '.',\n diagnosticsLevel: 'light',\n includeTrace: false,\n config: {},\n allowWarn: false,\n includeContextPack: false,\n requireRulesManifest: false,\n includeUiKitRegistry: false,\n includeAnchorAutofill: false,\n describeJson: false,\n})\n\ntype MutableParsedOptions = {\n -readonly [K in keyof ParsedOptions]: ParsedOptions[K]\n}\n\nconst invalidArgument = (message: string, helpText: string) =>\n makeCliError({\n code: 'CLI_INVALID_ARGUMENT',\n message,\n hint: helpText,\n })\n\nconst missingFlagError = (message: string, helpText: string) =>\n makeCliError({\n code: 'CLI_INVALID_ARGUMENT',\n message,\n hint: helpText,\n })\n\nconst parseManualOptions = (\n tokens: ReadonlyArray<string>,\n helpText: string,\n): Effect.Effect<ParsedOptions, ReturnType<typeof makeCliError>> =>\n Effect.sync(() => {\n const options: MutableParsedOptions = { ...defaultParsedOptions() }\n\n const readValue = (flag: string, index: number): string => {\n const value = tokens[index + 1]\n if (!value || value.startsWith('--')) {\n throw missingFlagError(`缺少参数值:${flag}`, helpText)\n }\n return value\n }\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!\n if (!token.startsWith('--')) {\n throw invalidArgument(`未知参数:${token}`, helpText)\n }\n\n const valueFlag = flagsWithValue.has(token)\n const key = canonicalOptionKey(token)\n\n if (valueFlag) {\n const value = readValue(token, i)\n i += 1\n switch (key) {\n case 'runId':\n options.runId = value\n break\n case 'out':\n options.out = value\n break\n case 'outRoot':\n options.outRoot = value\n break\n case 'budgetBytes':\n options.budgetBytes = Number(value)\n break\n case 'mode':\n options.mode = value as CliMode\n break\n case 'tsconfig':\n options.tsconfig = value\n break\n case 'host':\n options.host = value as CliHost\n break\n case 'cliConfig':\n options.cliConfig = value\n break\n case 'profile':\n options.profile = value\n break\n case 'repoRoot':\n options.repoRoot = value\n break\n case 'entry':\n options.entry = value\n break\n case 'in':\n options.inDir = value\n break\n case 'artifact':\n options.artifact = value\n break\n case 'before':\n options.before = value\n break\n case 'after':\n options.after = value\n break\n case 'ops':\n options.opsPath = value\n break\n case 'diagnosticsLevel':\n options.diagnosticsLevel = value as DiagnosticsLevel\n break\n case 'maxEvents':\n options.maxEvents = Number(value)\n break\n case 'timeout':\n options.timeoutMs = Number(value)\n break\n case 'config': {\n const eq = value.indexOf('=')\n if (eq <= 0) {\n throw invalidArgument(`非法 --config:${value}(期望 K=V)`, helpText)\n }\n const k = value.slice(0, eq)\n const v = value.slice(eq + 1)\n options.config = { ...options.config, [k]: parseConfigValue(v) }\n break\n }\n case 'baseline':\n options.baselineDir = value\n break\n case 'packMaxBytes':\n options.packMaxBytes = Number(value)\n break\n case 'inputs':\n options.inputsFile = value\n break\n case 'maxUsedServices':\n options.maxUsedServices = Number(value)\n break\n case 'maxRawMode':\n options.maxRawMode = Number(value)\n break\n default:\n throw invalidArgument(`未知参数:${token}`, helpText)\n }\n continue\n }\n\n switch (key) {\n case 'includeTrace':\n options.includeTrace = !token.startsWith('--no')\n break\n case 'allowWarn':\n options.allowWarn = !token.startsWith('--no')\n break\n case 'includeContextPack':\n options.includeContextPack = !token.startsWith('--no')\n break\n case 'requireRulesManifest':\n options.requireRulesManifest = !token.startsWith('--no')\n break\n case 'includeUiKitRegistry':\n options.includeUiKitRegistry = !token.startsWith('--no')\n break\n case 'includeAnchorAutofill':\n options.includeAnchorAutofill = !token.startsWith('--no')\n break\n case 'json':\n options.describeJson = !token.startsWith('--no')\n break\n default:\n throw invalidArgument(`未知参数:${token}`, helpText)\n }\n }\n\n return options\n })\n\nconst parseManualLeaf = (\n argv: ReadonlyArray<string>,\n helpText: string,\n): Effect.Effect<LeafParsed, unknown> =>\n Effect.gen(function* () {\n const normalized = normalizeArgvForEffectCli(argv)\n const extracted = findCommandTokens(normalized)\n if (!extracted) {\n return yield* Effect.fail(\n makeCliError({\n code: 'CLI_INVALID_COMMAND',\n message: '缺少命令:请提供 <group> <subcommand>(或 trialrun)',\n hint: helpText,\n }),\n )\n }\n\n const drop = new Set(extracted.indices)\n const rest = normalized.filter((_, idx) => !drop.has(idx))\n const options = yield* parseManualOptions(rest, helpText)\n const commandKey = extracted.tokens.join('.')\n\n switch (commandKey) {\n case 'describe':\n if (!options.describeJson) {\n return yield* Effect.fail(invalidArgument('describe 仅支持机器可读输出,请显式提供 --json', helpText))\n }\n return { command: 'describe', options, format: 'json' as const }\n case 'ir.export':\n return { command: 'ir.export', options, entry: yield* parseEntryRefFromOptions(options) }\n case 'ir.validate':\n return { command: 'ir.validate', options, input: yield* parseIrValidateInputFromOptions(options) }\n case 'ir.diff': {\n const diff = yield* parseIrDiffInputFromOptions(options)\n return { command: 'ir.diff', options, before: diff.before, after: diff.after }\n }\n case 'trialrun':\n return {\n command: 'trialrun',\n options,\n entry: yield* parseEntryRefFromOptions(options),\n diagnosticsLevel: options.diagnosticsLevel,\n ...(typeof options.maxEvents === 'number' ? { maxEvents: options.maxEvents } : null),\n ...(typeof options.timeoutMs === 'number' ? { timeoutMs: options.timeoutMs } : null),\n includeTrace: options.includeTrace,\n config: options.config,\n }\n case 'contract-suite.run':\n return {\n command: 'contract-suite.run',\n options,\n entry: yield* parseEntryRefFromOptions(options),\n diagnosticsLevel: options.diagnosticsLevel,\n ...(typeof options.maxEvents === 'number' ? { maxEvents: options.maxEvents } : null),\n ...(typeof options.timeoutMs === 'number' ? { timeoutMs: options.timeoutMs } : null),\n includeTrace: options.includeTrace,\n config: options.config,\n allowWarn: options.allowWarn,\n ...(options.baselineDir ? { baselineDir: options.baselineDir } : null),\n includeContextPack: options.includeContextPack,\n ...(typeof options.packMaxBytes === 'number' ? { packMaxBytes: options.packMaxBytes } : null),\n requireRulesManifest: options.requireRulesManifest,\n ...(options.inputsFile ? { inputsFile: options.inputsFile } : null),\n includeUiKitRegistry: options.includeUiKitRegistry,\n includeAnchorAutofill: options.includeAnchorAutofill,\n repoRoot: options.repoRoot,\n }\n case 'spy.evidence':\n return {\n command: 'spy.evidence',\n options,\n entry: yield* parseEntryRefFromOptions(options),\n ...(typeof options.maxUsedServices === 'number' ? { maxUsedServices: options.maxUsedServices } : null),\n ...(typeof options.maxRawMode === 'number' ? { maxRawMode: options.maxRawMode } : null),\n ...(typeof options.timeoutMs === 'number' ? { timeoutMs: options.timeoutMs } : null),\n }\n case 'anchor.index':\n return { command: 'anchor.index', options, repoRoot: options.repoRoot }\n case 'anchor.autofill':\n return { command: 'anchor.autofill', options, repoRoot: options.repoRoot }\n case 'transform.module': {\n const opsPath = typeof options.opsPath === 'string' && options.opsPath.length > 0 ? options.opsPath : undefined\n if (!opsPath) {\n return yield* Effect.fail(invalidArgument('缺少输入:请提供 --ops <delta.json|->', helpText))\n }\n return { command: 'transform.module', options, repoRoot: options.repoRoot, opsPath }\n }\n default:\n return yield* Effect.fail(\n makeCliError({\n code: 'CLI_INVALID_COMMAND',\n message: `未知命令:${commandKey}`,\n hint: helpText,\n }),\n )\n }\n })\n\nexport const parseCliInvocation = (\n argv: ReadonlyArray<string>,\n options: { readonly helpText: string },\n): Effect.Effect<CliHelpResult | CliInvocation, unknown> => {\n if (argv.includes('-h') || argv.includes('--help') || argv.length === 0) {\n return Effect.succeed(({ kind: 'help', text: options.helpText } as const satisfies CliHelpResult))\n }\n\n return parseManualLeaf(argv, options.helpText).pipe(\n Effect.flatMap((leaf): Effect.Effect<CliHelpResult | CliInvocation, unknown> => {\n const runId = typeof leaf.options.runId === 'string' ? leaf.options.runId.trim() : undefined\n if (!runId) {\n return Effect.fail(makeCliError({ code: 'CLI_MISSING_RUNID', message: '缺少 --runId(必须显式提供)' }))\n }\n\n const outDirExplicit = typeof leaf.options.out === 'string' ? leaf.options.out.trim() : undefined\n const outRoot = typeof leaf.options.outRoot === 'string' ? leaf.options.outRoot.trim() : undefined\n const outDir = outDirExplicit ?? (outRoot ? path.join(outRoot, leaf.command, runId) : undefined)\n const budgetBytes = typeof leaf.options.budgetBytes === 'number' ? leaf.options.budgetBytes : undefined\n const mode = leaf.options.mode\n const tsconfig = typeof leaf.options.tsconfig === 'string' ? leaf.options.tsconfig.trim() : undefined\n\n const global: CliInvocation.Global = {\n runId,\n ...(outDir ? { outDir } : null),\n ...(budgetBytes ? { budgetBytes } : null),\n ...(mode ? { mode } : null),\n ...(tsconfig ? { tsconfig } : null),\n host: leaf.options.host,\n }\n\n switch (leaf.command) {\n case 'describe':\n return Effect.succeed(({ kind: 'command', command: 'describe', global, format: leaf.format } as const))\n case 'ir.export':\n return Effect.succeed(({ kind: 'command', command: 'ir.export', global, entry: leaf.entry } as const))\n case 'ir.validate':\n return Effect.succeed(({ kind: 'command', command: 'ir.validate', global, input: leaf.input } as const))\n case 'ir.diff':\n return Effect.succeed(({ kind: 'command', command: 'ir.diff', global, before: leaf.before, after: leaf.after } as const))\n case 'trialrun':\n return Effect.succeed({\n kind: 'command',\n command: 'trialrun',\n global,\n entry: leaf.entry,\n diagnosticsLevel: leaf.diagnosticsLevel,\n ...(typeof leaf.maxEvents === 'number' ? { maxEvents: leaf.maxEvents } : null),\n ...(typeof leaf.timeoutMs === 'number' ? { timeoutMs: leaf.timeoutMs } : null),\n includeTrace: leaf.includeTrace,\n config: leaf.config,\n } as const)\n case 'contract-suite.run':\n return Effect.succeed({\n kind: 'command',\n command: 'contract-suite.run',\n global,\n entry: leaf.entry,\n diagnosticsLevel: leaf.diagnosticsLevel,\n ...(typeof leaf.maxEvents === 'number' ? { maxEvents: leaf.maxEvents } : null),\n ...(typeof leaf.timeoutMs === 'number' ? { timeoutMs: leaf.timeoutMs } : null),\n includeTrace: leaf.includeTrace,\n config: leaf.config,\n allowWarn: leaf.allowWarn,\n ...(leaf.baselineDir ? { baselineDir: leaf.baselineDir } : null),\n includeContextPack: leaf.includeContextPack,\n ...(typeof leaf.packMaxBytes === 'number' ? { packMaxBytes: leaf.packMaxBytes } : null),\n requireRulesManifest: leaf.requireRulesManifest,\n ...(leaf.inputsFile ? { inputsFile: leaf.inputsFile } : null),\n includeUiKitRegistry: leaf.includeUiKitRegistry,\n includeAnchorAutofill: leaf.includeAnchorAutofill,\n repoRoot: leaf.repoRoot,\n } as const)\n case 'spy.evidence':\n return Effect.succeed({\n kind: 'command',\n command: 'spy.evidence',\n global,\n entry: leaf.entry,\n ...(typeof leaf.maxUsedServices === 'number' ? { maxUsedServices: leaf.maxUsedServices } : null),\n ...(typeof leaf.maxRawMode === 'number' ? { maxRawMode: leaf.maxRawMode } : null),\n ...(typeof leaf.timeoutMs === 'number' ? { timeoutMs: leaf.timeoutMs } : null),\n } as const)\n case 'anchor.index':\n return Effect.succeed(({ kind: 'command', command: 'anchor.index', global, repoRoot: leaf.repoRoot } as const))\n case 'anchor.autofill':\n return Effect.succeed(({ kind: 'command', command: 'anchor.autofill', global, repoRoot: leaf.repoRoot } as const))\n case 'transform.module':\n return Effect.succeed(\n ({ kind: 'command', command: 'transform.module', global, repoRoot: leaf.repoRoot, opsPath: leaf.opsPath } as const),\n )\n }\n }),\n Effect.catch((cause) =>\n Effect.fail(\n makeCliError({\n code: 'CLI_INVALID_ARGUMENT',\n message: renderValidationError(cause),\n hint: options.helpText,\n cause,\n }),\n ),\n ),\n )\n}\n","import { Effect } from 'effect'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport { asSerializableErrorSummary, makeCliError } from './errors.js'\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst asNonEmptyString = (value: unknown): string | undefined =>\n typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined\n\nconst asPositiveInt = (value: unknown): number | undefined => {\n const n = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : NaN\n if (!Number.isFinite(n) || n <= 0) return undefined\n return Math.floor(n)\n}\n\nconst capitalize = (s: string): string => (s.length === 0 ? s : `${s[0]!.toUpperCase()}${s.slice(1)}`)\n\nexport type CliProfileDefaults = {\n readonly outRoot?: string\n readonly repoRoot?: string\n readonly tsconfig?: string\n readonly host?: 'node' | 'browser-mock'\n readonly budgetBytes?: number\n readonly diagnosticsLevel?: 'off' | 'light' | 'full'\n readonly maxEvents?: number\n readonly timeout?: number\n readonly baseline?: string\n readonly inputs?: string\n readonly packMaxBytes?: number\n readonly allowWarn?: boolean\n readonly includeTrace?: boolean\n readonly includeContextPack?: boolean\n readonly includeUiKitRegistry?: boolean\n readonly requireRulesManifest?: boolean\n readonly includeAnchorAutofill?: boolean\n readonly entry?: string\n}\n\nexport type LogixCliConfigFile = {\n readonly schemaVersion: 1\n readonly defaults?: CliProfileDefaults\n readonly profiles?: Readonly<Record<string, CliProfileDefaults>>\n}\n\nexport type CliConfigDiscovery =\n | { readonly found: false }\n | { readonly found: true; readonly path: string; readonly ok: true; readonly config: LogixCliConfigFile; readonly profiles: ReadonlyArray<string> }\n | { readonly found: true; readonly path: string; readonly ok: false; readonly error: { readonly code: string; readonly message: string } }\n\nexport type CliConfigArgvPrefixLayer =\n | {\n readonly source: 'defaults'\n readonly tokens: ReadonlyArray<string>\n }\n | {\n readonly source: 'profile'\n readonly profile: string\n readonly tokens: ReadonlyArray<string>\n }\n\nexport type CliConfigArgvPrefixResolution = {\n readonly prefix: ReadonlyArray<string>\n readonly cliConfigPathArg?: string\n readonly profile?: string\n readonly discoveredPath?: string\n readonly layers: ReadonlyArray<CliConfigArgvPrefixLayer>\n readonly discovery: CliConfigDiscovery\n}\n\nconst readJsonFile = (filePath: string): Effect.Effect<unknown, unknown> =>\n Effect.tryPromise({\n try: async () => JSON.parse(await fs.readFile(filePath, 'utf8')) as unknown,\n catch: (cause) =>\n makeCliError({\n code: 'CLI_INVALID_INPUT',\n message: `[Logix][CLI] 无法读取/解析配置文件:${filePath}`,\n cause,\n }),\n })\n\nconst statExists = (filePath: string): Effect.Effect<boolean, never> =>\n Effect.tryPromise({\n try: async () => {\n await fs.stat(filePath)\n return true\n },\n catch: (cause) => cause,\n }).pipe(Effect.catch(() => Effect.succeed(false)))\n\nconst findUp = (startDir: string, fileName: string): Effect.Effect<string | undefined, never> =>\n Effect.gen(function* () {\n let dir = path.resolve(startDir)\n while (true) {\n const candidate = path.join(dir, fileName)\n if (yield* statExists(candidate)) return candidate\n const parent = path.dirname(dir)\n if (parent === dir) return undefined\n dir = parent\n }\n })\n\nconst getFlag = (argv: ReadonlyArray<string>, name: string): string | undefined => {\n const idx = argv.lastIndexOf(`--${name}`)\n if (idx < 0) return undefined\n const next = argv[idx + 1]\n if (!next || next.startsWith('--')) {\n throw makeCliError({ code: 'CLI_INVALID_ARGUMENT', message: `--${name} 缺少参数` })\n }\n return next\n}\n\nconst parseCliConfigPath = (argv: ReadonlyArray<string>): string | undefined => getFlag(argv, 'cliConfig') ?? undefined\n\nconst parseProfile = (argv: ReadonlyArray<string>): string | undefined => {\n const raw = getFlag(argv, 'profile')\n return asNonEmptyString(raw)\n}\n\nconst validateDefaults = (input: unknown, label: string): CliProfileDefaults => {\n if (!isRecord(input)) {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: `[Logix][CLI] ${label} 必须是对象` })\n }\n\n const knownKeys = new Set([\n 'outRoot',\n 'repoRoot',\n 'tsconfig',\n 'host',\n 'budgetBytes',\n 'diagnosticsLevel',\n 'maxEvents',\n 'timeout',\n 'baseline',\n 'inputs',\n 'packMaxBytes',\n 'allowWarn',\n 'includeTrace',\n 'includeContextPack',\n 'includeUiKitRegistry',\n 'requireRulesManifest',\n 'includeAnchorAutofill',\n 'entry',\n ])\n\n for (const key of Object.keys(input)) {\n if (!knownKeys.has(key)) {\n throw makeCliError({\n code: 'CLI_INVALID_INPUT',\n message: `[Logix][CLI] ${label} 包含未知字段:${key}`,\n hint: '请更新配置文件或升级 CLI;配置 schemaVersion=1 不允许未知字段。',\n })\n }\n }\n\n const diagnosticsLevel = (input as any).diagnosticsLevel\n if (\n diagnosticsLevel !== undefined &&\n diagnosticsLevel !== 'off' &&\n diagnosticsLevel !== 'light' &&\n diagnosticsLevel !== 'full'\n ) {\n throw makeCliError({\n code: 'CLI_INVALID_INPUT',\n message: `[Logix][CLI] ${label}.diagnosticsLevel 非法:${String(diagnosticsLevel)}(期望 off|light|full)`,\n })\n }\n\n const allowWarn = (input as any).allowWarn\n if (allowWarn !== undefined && typeof allowWarn !== 'boolean') {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: `[Logix][CLI] ${label}.allowWarn 必须是 boolean` })\n }\n\n const includeTrace = (input as any).includeTrace\n if (includeTrace !== undefined && typeof includeTrace !== 'boolean') {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: `[Logix][CLI] ${label}.includeTrace 必须是 boolean` })\n }\n\n const includeContextPack = (input as any).includeContextPack\n if (includeContextPack !== undefined && typeof includeContextPack !== 'boolean') {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: `[Logix][CLI] ${label}.includeContextPack 必须是 boolean` })\n }\n\n const includeUiKitRegistry = (input as any).includeUiKitRegistry\n if (includeUiKitRegistry !== undefined && typeof includeUiKitRegistry !== 'boolean') {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: `[Logix][CLI] ${label}.includeUiKitRegistry 必须是 boolean` })\n }\n\n const requireRulesManifest = (input as any).requireRulesManifest\n if (requireRulesManifest !== undefined && typeof requireRulesManifest !== 'boolean') {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: `[Logix][CLI] ${label}.requireRulesManifest 必须是 boolean` })\n }\n\n const includeAnchorAutofill = (input as any).includeAnchorAutofill\n if (includeAnchorAutofill !== undefined && typeof includeAnchorAutofill !== 'boolean') {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: `[Logix][CLI] ${label}.includeAnchorAutofill 必须是 boolean` })\n }\n\n const budgetBytes = (input as any).budgetBytes\n if (budgetBytes !== undefined && asPositiveInt(budgetBytes) === undefined) {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: `[Logix][CLI] ${label}.budgetBytes 必须是正整数` })\n }\n\n const maxEvents = (input as any).maxEvents\n if (maxEvents !== undefined && asPositiveInt(maxEvents) === undefined) {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: `[Logix][CLI] ${label}.maxEvents 必须是正整数` })\n }\n\n const timeout = (input as any).timeout\n if (timeout !== undefined && asPositiveInt(timeout) === undefined) {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: `[Logix][CLI] ${label}.timeout 必须是正整数(ms)` })\n }\n\n const packMaxBytes = (input as any).packMaxBytes\n if (packMaxBytes !== undefined && asPositiveInt(packMaxBytes) === undefined) {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: `[Logix][CLI] ${label}.packMaxBytes 必须是正整数(bytes)` })\n }\n\n const outRoot = (input as any).outRoot\n if (outRoot !== undefined && asNonEmptyString(outRoot) === undefined) {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: `[Logix][CLI] ${label}.outRoot 必须是非空字符串` })\n }\n\n const repoRoot = (input as any).repoRoot\n if (repoRoot !== undefined && asNonEmptyString(repoRoot) === undefined) {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: `[Logix][CLI] ${label}.repoRoot 必须是非空字符串` })\n }\n\n const tsconfig = (input as any).tsconfig\n if (tsconfig !== undefined && asNonEmptyString(tsconfig) === undefined) {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: `[Logix][CLI] ${label}.tsconfig 必须是非空字符串` })\n }\n\n const host = (input as any).host\n if (host !== undefined && host !== 'node' && host !== 'browser-mock') {\n throw makeCliError({\n code: 'CLI_INVALID_INPUT',\n message: `[Logix][CLI] ${label}.host 非法:${String(host)}(期望 node|browser-mock)`,\n })\n }\n\n const baseline = (input as any).baseline\n if (baseline !== undefined && asNonEmptyString(baseline) === undefined) {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: `[Logix][CLI] ${label}.baseline 必须是非空字符串` })\n }\n\n const inputs = (input as any).inputs\n if (inputs !== undefined && asNonEmptyString(inputs) === undefined) {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: `[Logix][CLI] ${label}.inputs 必须是非空字符串` })\n }\n\n const entry = (input as any).entry\n if (entry !== undefined && asNonEmptyString(entry) === undefined) {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: `[Logix][CLI] ${label}.entry 必须是非空字符串` })\n }\n\n return {\n ...(outRoot !== undefined ? { outRoot: asNonEmptyString(outRoot) } : null),\n ...(repoRoot !== undefined ? { repoRoot: asNonEmptyString(repoRoot) } : null),\n ...(tsconfig !== undefined ? { tsconfig: asNonEmptyString(tsconfig) } : null),\n ...(host !== undefined ? { host } : null),\n ...(budgetBytes !== undefined ? { budgetBytes: asPositiveInt(budgetBytes) } : null),\n ...(diagnosticsLevel !== undefined ? { diagnosticsLevel } : null),\n ...(maxEvents !== undefined ? { maxEvents: asPositiveInt(maxEvents) } : null),\n ...(timeout !== undefined ? { timeout: asPositiveInt(timeout) } : null),\n ...(baseline !== undefined ? { baseline: asNonEmptyString(baseline) } : null),\n ...(inputs !== undefined ? { inputs: asNonEmptyString(inputs) } : null),\n ...(packMaxBytes !== undefined ? { packMaxBytes: asPositiveInt(packMaxBytes) } : null),\n ...(allowWarn !== undefined ? { allowWarn } : null),\n ...(includeTrace !== undefined ? { includeTrace } : null),\n ...(includeContextPack !== undefined ? { includeContextPack } : null),\n ...(includeUiKitRegistry !== undefined ? { includeUiKitRegistry } : null),\n ...(requireRulesManifest !== undefined ? { requireRulesManifest } : null),\n ...(includeAnchorAutofill !== undefined ? { includeAnchorAutofill } : null),\n ...(entry !== undefined ? { entry: asNonEmptyString(entry) } : null),\n }\n}\n\nconst validateConfigFile = (input: unknown, filePath: string): LogixCliConfigFile => {\n if (!isRecord(input)) {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: `[Logix][CLI] 配置文件必须是 JSON object:${filePath}` })\n }\n const schemaVersion = (input as any).schemaVersion\n if (schemaVersion !== 1) {\n throw makeCliError({\n code: 'CLI_INVALID_INPUT',\n message: `[Logix][CLI] 配置文件 schemaVersion 非法:${String(schemaVersion)}(期望 1)`,\n })\n }\n\n const defaultsRaw = (input as any).defaults\n const profilesRaw = (input as any).profiles\n\n const defaults = defaultsRaw !== undefined ? validateDefaults(defaultsRaw, 'defaults') : undefined\n\n let profiles: Record<string, CliProfileDefaults> | undefined\n if (profilesRaw !== undefined) {\n if (!isRecord(profilesRaw)) {\n throw makeCliError({ code: 'CLI_INVALID_INPUT', message: '[Logix][CLI] profiles 必须是对象(Record<string, defaults>)' })\n }\n profiles = {}\n for (const [name, raw] of Object.entries(profilesRaw)) {\n const key = asNonEmptyString(name)\n if (!key) continue\n profiles[key] = validateDefaults(raw, `profiles.${key}`)\n }\n }\n\n return {\n schemaVersion: 1,\n ...(defaults ? { defaults } : null),\n ...(profiles ? { profiles } : null),\n }\n}\n\nconst toArgvPrefix = (defaults: CliProfileDefaults): ReadonlyArray<string> => {\n const tokens: string[] = []\n\n if (defaults.outRoot) tokens.push('--outRoot', defaults.outRoot)\n if (defaults.repoRoot) tokens.push('--repoRoot', defaults.repoRoot)\n if (defaults.tsconfig) tokens.push('--tsconfig', defaults.tsconfig)\n if (defaults.host) tokens.push('--host', defaults.host)\n if (defaults.budgetBytes) tokens.push('--budgetBytes', String(defaults.budgetBytes))\n if (defaults.diagnosticsLevel) tokens.push('--diagnosticsLevel', defaults.diagnosticsLevel)\n if (defaults.maxEvents) tokens.push('--maxEvents', String(defaults.maxEvents))\n if (defaults.timeout) tokens.push('--timeout', String(defaults.timeout))\n if (defaults.baseline) tokens.push('--baseline', defaults.baseline)\n if (defaults.inputs) tokens.push('--inputs', defaults.inputs)\n if (defaults.packMaxBytes) tokens.push('--packMaxBytes', String(defaults.packMaxBytes))\n if (defaults.entry) tokens.push('--entry', defaults.entry)\n\n const bool = (key: keyof CliProfileDefaults, flag: string): void => {\n const value = defaults[key]\n if (value === true) tokens.push(`--${flag}`)\n if (value === false) tokens.push(`--no${capitalize(flag)}`)\n }\n\n bool('allowWarn', 'allowWarn')\n bool('includeTrace', 'includeTrace')\n bool('includeContextPack', 'includeContextPack')\n bool('includeUiKitRegistry', 'includeUiKitRegistry')\n bool('requireRulesManifest', 'requireRulesManifest')\n bool('includeAnchorAutofill', 'includeAnchorAutofill')\n\n return tokens\n}\n\nexport const resolveCliConfigArgvPrefixResolution = (\n argv: ReadonlyArray<string>,\n): Effect.Effect<CliConfigArgvPrefixResolution, unknown> =>\n Effect.gen(function* () {\n const explicitPathRaw = parseCliConfigPath(argv)\n const profile = parseProfile(argv)\n\n const configPath = explicitPathRaw\n ? path.resolve(process.cwd(), explicitPathRaw)\n : yield* findUp(process.cwd(), 'logix.cli.json')\n\n if (!configPath) {\n if (profile) {\n throw makeCliError({\n code: 'CLI_INVALID_INPUT',\n message: `[Logix][CLI] 未找到配置文件,但指定了 --profile ${profile}`,\n hint: '请在当前目录或上层目录放置 logix.cli.json,或使用 --cliConfig <path> 指定。',\n })\n }\n return {\n prefix: [],\n ...(explicitPathRaw ? { cliConfigPathArg: explicitPathRaw } : null),\n ...(profile ? { profile } : null),\n layers: [],\n discovery: { found: false } as const,\n } satisfies CliConfigArgvPrefixResolution\n }\n\n if (explicitPathRaw && !(yield* statExists(configPath))) {\n throw makeCliError({\n code: 'CLI_INVALID_INPUT',\n message: `[Logix][CLI] 指定的配置文件不存在:${explicitPathRaw}`,\n })\n }\n\n const raw = yield* readJsonFile(configPath)\n const config = validateConfigFile(raw, configPath)\n\n const layers: Array<CliConfigArgvPrefixLayer> = []\n if (config.defaults) {\n layers.push({\n source: 'defaults',\n tokens: toArgvPrefix(config.defaults),\n })\n }\n\n if (profile) {\n const profileDefaults = config.profiles?.[profile]\n if (!profileDefaults) {\n throw makeCliError({\n code: 'CLI_INVALID_INPUT',\n message: `[Logix][CLI] 未找到 profile:${profile}`,\n })\n }\n layers.push({\n source: 'profile',\n profile,\n tokens: toArgvPrefix(profileDefaults),\n })\n }\n\n return {\n prefix: layers.flatMap((layer) => layer.tokens),\n ...(explicitPathRaw ? { cliConfigPathArg: explicitPathRaw } : null),\n ...(profile ? { profile } : null),\n discoveredPath: configPath,\n layers,\n discovery: {\n found: true,\n path: configPath,\n ok: true,\n config,\n profiles: Object.keys(config.profiles ?? {}).sort(),\n } as const,\n } satisfies CliConfigArgvPrefixResolution\n })\n\nexport const resolveCliConfigArgvPrefix = (argv: ReadonlyArray<string>): Effect.Effect<ReadonlyArray<string>, unknown> =>\n resolveCliConfigArgvPrefixResolution(argv).pipe(Effect.map((resolved) => resolved.prefix))\n\nexport const discoverCliConfig = (args: {\n readonly cwd: string\n readonly cliConfigPath?: string\n}): Effect.Effect<CliConfigDiscovery, never> => {\n return Effect.gen(function* () {\n const explicit = asNonEmptyString(args.cliConfigPath)\n const discoveredPath = explicit ? path.resolve(args.cwd, explicit) : yield* findUp(args.cwd, 'logix.cli.json')\n\n if (!discoveredPath) return { found: false } as const\n\n if (explicit && !(yield* statExists(discoveredPath))) {\n return {\n found: true,\n path: discoveredPath,\n ok: false,\n error: { code: 'CLI_CONFIG_INVALID', message: `cli config not found: ${explicit}` },\n } as const\n }\n\n return yield* Effect.gen(function* () {\n const raw = yield* readJsonFile(discoveredPath)\n const config = yield* Effect.try({\n try: () => validateConfigFile(raw, discoveredPath),\n catch: (cause) => cause,\n })\n const profiles = Object.keys(config.profiles ?? {}).sort()\n return { found: true, path: discoveredPath, ok: true, config, profiles } as const\n }).pipe(\n Effect.catch((cause) => {\n const summary = asSerializableErrorSummary(cause)\n const code = summary.message.includes('.entry') ? 'CLI_ENTRY_INVALID' : 'CLI_CONFIG_INVALID'\n const out: CliConfigDiscovery = {\n found: true,\n path: discoveredPath,\n ok: false,\n error: { code, message: summary.message },\n }\n return Effect.succeed(out)\n }),\n )\n })\n}\n"],"mappings":"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","names":["Effect","Effect","path","Effect","path","Effect"]}
@@ -0,0 +1,143 @@
1
+ import {
2
+ sha256DigestOfJson,
3
+ stableStringifyJson
4
+ } from "./chunk-RF7XSP3P.js";
5
+ import {
6
+ makeCliError,
7
+ makeOversizedInlineValue
8
+ } from "./chunk-6DZEO5HP.js";
9
+
10
+ // src/internal/output.ts
11
+ import fs from "fs/promises";
12
+ import path from "path";
13
+ import { Effect } from "effect";
14
+ var ensureDir = (dir) => Effect.tryPromise({
15
+ try: () => fs.mkdir(dir, { recursive: true }),
16
+ catch: (cause) => makeCliError({
17
+ code: "CLI_IO_ERROR",
18
+ message: `[Logix][CLI] \u65E0\u6CD5\u521B\u5EFA\u76EE\u5F55\uFF1A${dir}`,
19
+ cause
20
+ })
21
+ });
22
+ var writeJsonFile = (outDir, fileName, value) => Effect.gen(function* () {
23
+ const dir = path.resolve(process.cwd(), outDir);
24
+ yield* ensureDir(dir);
25
+ const filePath = path.join(dir, fileName);
26
+ yield* Effect.tryPromise({
27
+ try: () => fs.writeFile(filePath, `${stableStringifyJson(value, 2)}
28
+ `, "utf8"),
29
+ catch: (cause) => makeCliError({
30
+ code: "CLI_IO_ERROR",
31
+ message: `[Logix][CLI] \u5199\u5165\u5931\u8D25\uFF1A${filePath}`,
32
+ cause
33
+ })
34
+ });
35
+ return fileName;
36
+ });
37
+ var readJsonFile = (filePath) => Effect.tryPromise({
38
+ try: () => fs.readFile(filePath, "utf8"),
39
+ catch: (cause) => makeCliError({
40
+ code: "CLI_IO_ERROR",
41
+ message: `[Logix][CLI] \u8BFB\u53D6\u5931\u8D25\uFF1A${filePath}`,
42
+ cause
43
+ })
44
+ }).pipe(
45
+ Effect.flatMap(
46
+ (text) => Effect.try({
47
+ try: () => JSON.parse(text),
48
+ catch: (cause) => makeCliError({
49
+ code: "CLI_INVALID_INPUT",
50
+ message: `[Logix][CLI] \u65E0\u6CD5\u89E3\u6790 JSON\uFF1A${filePath}`,
51
+ cause
52
+ })
53
+ })
54
+ )
55
+ );
56
+
57
+ // src/internal/artifacts.ts
58
+ import { Effect as Effect2 } from "effect";
59
+ var toBytes = (text) => new TextEncoder().encode(text).length;
60
+ var makeArtifactOutput = (args) => Effect2.gen(function* () {
61
+ const schemaVersion = (() => {
62
+ if (typeof args.schemaVersion === "number" && Number.isFinite(args.schemaVersion) && args.schemaVersion >= 0) {
63
+ return Math.floor(args.schemaVersion);
64
+ }
65
+ if (args.value && typeof args.value === "object" && "schemaVersion" in args.value) {
66
+ const sv = args.value.schemaVersion;
67
+ if (typeof sv === "number" && Number.isFinite(sv) && sv >= 0) return Math.floor(sv);
68
+ }
69
+ return void 0;
70
+ })();
71
+ const reasonCodes = (() => {
72
+ if (Array.isArray(args.reasonCodes) && args.reasonCodes.length > 0) {
73
+ return Array.from(new Set(args.reasonCodes.filter((code) => typeof code === "string" && code.length > 0))).sort();
74
+ }
75
+ const seen = /* @__PURE__ */ new Set();
76
+ const visit = (value, depth) => {
77
+ if (depth > 8 || value === null || value === void 0) return;
78
+ if (Array.isArray(value)) {
79
+ for (const item of value) visit(item, depth + 1);
80
+ return;
81
+ }
82
+ if (typeof value !== "object") return;
83
+ const record = value;
84
+ const fromCurrent = record.reasonCodes;
85
+ if (Array.isArray(fromCurrent)) {
86
+ for (const item of fromCurrent) {
87
+ if (typeof item === "string" && item.length > 0) seen.add(item);
88
+ }
89
+ }
90
+ for (const item of Object.values(record)) visit(item, depth + 1);
91
+ };
92
+ visit(args.value, 0);
93
+ return seen.size > 0 ? Array.from(seen).sort() : void 0;
94
+ })();
95
+ const digest = args.digest ?? sha256DigestOfJson(args.value);
96
+ const outDir = args.outDir;
97
+ if (outDir) {
98
+ const file = yield* writeJsonFile(outDir, args.fileName, args.value);
99
+ return {
100
+ outputKey: args.outputKey,
101
+ kind: args.kind,
102
+ ok: true,
103
+ file,
104
+ ...typeof schemaVersion === "number" ? { schemaVersion } : null,
105
+ ...reasonCodes ? { reasonCodes } : null,
106
+ digest
107
+ };
108
+ }
109
+ const json = stableStringifyJson(args.value);
110
+ const bytes = toBytes(json);
111
+ const budget = args.budgetBytes;
112
+ if (typeof budget === "number" && Number.isFinite(budget) && budget > 0 && bytes > budget) {
113
+ const truncated = makeOversizedInlineValue({ stableJson: json, bytes, budgetBytes: budget });
114
+ return {
115
+ outputKey: args.outputKey,
116
+ kind: args.kind,
117
+ ok: true,
118
+ inline: truncated.inline,
119
+ truncated: truncated.truncated,
120
+ budgetBytes: truncated.budgetBytes,
121
+ actualBytes: truncated.actualBytes,
122
+ ...typeof schemaVersion === "number" ? { schemaVersion } : null,
123
+ ...reasonCodes ? { reasonCodes } : null,
124
+ digest
125
+ };
126
+ }
127
+ return {
128
+ outputKey: args.outputKey,
129
+ kind: args.kind,
130
+ ok: true,
131
+ inline: JSON.parse(json),
132
+ ...typeof schemaVersion === "number" ? { schemaVersion } : null,
133
+ ...reasonCodes ? { reasonCodes } : null,
134
+ digest,
135
+ ...budget ? { budgetBytes: budget, actualBytes: bytes } : null
136
+ };
137
+ });
138
+
139
+ export {
140
+ readJsonFile,
141
+ makeArtifactOutput
142
+ };
143
+ //# sourceMappingURL=chunk-VRPSB3SV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/output.ts","../src/internal/artifacts.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport { Effect } from 'effect'\n\nimport { makeCliError } from './errors.js'\nimport { stableStringifyJson } from './stableJson.js'\n\nconst ensureDir = (dir: string): Effect.Effect<void, unknown> =>\n Effect.tryPromise({\n try: () => fs.mkdir(dir, { recursive: true }),\n catch: (cause) =>\n makeCliError({\n code: 'CLI_IO_ERROR',\n message: `[Logix][CLI] 无法创建目录:${dir}`,\n cause,\n }),\n })\n\nexport const writeJsonFile = (outDir: string, fileName: string, value: unknown): Effect.Effect<string, unknown> =>\n Effect.gen(function* () {\n const dir = path.resolve(process.cwd(), outDir)\n yield* ensureDir(dir)\n const filePath = path.join(dir, fileName)\n yield* Effect.tryPromise({\n try: () => fs.writeFile(filePath, `${stableStringifyJson(value, 2)}\\n`, 'utf8'),\n catch: (cause) =>\n makeCliError({\n code: 'CLI_IO_ERROR',\n message: `[Logix][CLI] 写入失败:${filePath}`,\n cause,\n }),\n })\n return fileName\n })\n\nexport const readJsonFile = (filePath: string): Effect.Effect<unknown, unknown> =>\n Effect.tryPromise({\n try: () => fs.readFile(filePath, 'utf8'),\n catch: (cause) =>\n makeCliError({\n code: 'CLI_IO_ERROR',\n message: `[Logix][CLI] 读取失败:${filePath}`,\n cause,\n }),\n }).pipe(\n Effect.flatMap((text) =>\n Effect.try({\n try: () => JSON.parse(text),\n catch: (cause) =>\n makeCliError({\n code: 'CLI_INVALID_INPUT',\n message: `[Logix][CLI] 无法解析 JSON:${filePath}`,\n cause,\n }),\n }),\n ),\n )\n\nconst readTextFromStdin = (stdin: NodeJS.ReadStream): Promise<string> =>\n new Promise((resolve, reject) => {\n let text = ''\n try {\n if (typeof stdin.setEncoding === 'function') {\n stdin.setEncoding('utf8')\n }\n } catch {\n // ignore\n }\n stdin.on('data', (chunk) => {\n text += typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString('utf8')\n })\n stdin.on('end', () => resolve(text))\n stdin.on('error', (err) => reject(err))\n })\n\nconst isTtyStdin = (stdin: NodeJS.ReadStream): boolean => Boolean(stdin.isTTY)\n\nexport const readJsonInput = (\n input: string,\n options?: { readonly label?: string; readonly stdin?: NodeJS.ReadStream },\n): Effect.Effect<unknown, unknown> => {\n const trimmed = String(input).trim()\n\n if (trimmed === '-') {\n const label = options?.label ?? 'stdin'\n const stdin = options?.stdin ?? process.stdin\n if (isTtyStdin(stdin)) {\n return Effect.fail(\n makeCliError({\n code: 'CLI_STDIN_IS_TTY',\n message: `[Logix][CLI] 无法读取:${label}(stdin 是 TTY;请通过管道输入 JSON,或改用文件路径)`,\n }),\n )\n }\n\n return Effect.tryPromise({\n try: () => readTextFromStdin(stdin),\n catch: (cause) =>\n makeCliError({\n code: 'CLI_IO_ERROR',\n message: `[Logix][CLI] 读取失败:${label}(stdin)`,\n cause,\n }),\n }).pipe(\n Effect.flatMap((text) =>\n Effect.try({\n try: () => JSON.parse(text),\n catch: (cause) =>\n makeCliError({\n code: 'CLI_INVALID_INPUT',\n message: `[Logix][CLI] 无法解析 JSON:${label}(stdin)`,\n cause,\n }),\n }),\n ),\n )\n }\n\n return readJsonFile(input)\n}\n","import { Effect } from 'effect'\n\nimport { writeJsonFile } from './output.js'\nimport type { ArtifactOutput, JsonValue } from './result.js'\nimport { makeOversizedInlineValue } from './result.js'\nimport { sha256DigestOfJson, stableStringifyJson } from './stableJson.js'\n\nconst toBytes = (text: string): number => new TextEncoder().encode(text).length\n\nexport const makeArtifactOutput = (args: {\n readonly outDir?: string\n readonly budgetBytes?: number\n readonly fileName: string\n readonly outputKey: string\n readonly kind: string\n readonly value: unknown\n readonly schemaVersion?: number\n readonly reasonCodes?: ReadonlyArray<string>\n readonly digest?: string\n}): Effect.Effect<ArtifactOutput, unknown> =>\n Effect.gen(function* () {\n const schemaVersion = (() => {\n if (typeof args.schemaVersion === 'number' && Number.isFinite(args.schemaVersion) && args.schemaVersion >= 0) {\n return Math.floor(args.schemaVersion)\n }\n if (args.value && typeof args.value === 'object' && 'schemaVersion' in (args.value as Record<string, unknown>)) {\n const sv = (args.value as Record<string, unknown>).schemaVersion\n if (typeof sv === 'number' && Number.isFinite(sv) && sv >= 0) return Math.floor(sv)\n }\n return undefined\n })()\n\n const reasonCodes = (() => {\n if (Array.isArray(args.reasonCodes) && args.reasonCodes.length > 0) {\n return Array.from(new Set(args.reasonCodes.filter((code): code is string => typeof code === 'string' && code.length > 0))).sort()\n }\n\n const seen = new Set<string>()\n const visit = (value: unknown, depth: number): void => {\n if (depth > 8 || value === null || value === undefined) return\n if (Array.isArray(value)) {\n for (const item of value) visit(item, depth + 1)\n return\n }\n if (typeof value !== 'object') return\n const record = value as Record<string, unknown>\n const fromCurrent = record.reasonCodes\n if (Array.isArray(fromCurrent)) {\n for (const item of fromCurrent) {\n if (typeof item === 'string' && item.length > 0) seen.add(item)\n }\n }\n for (const item of Object.values(record)) visit(item, depth + 1)\n }\n visit(args.value, 0)\n return seen.size > 0 ? Array.from(seen).sort() : undefined\n })()\n\n const digest = args.digest ?? sha256DigestOfJson(args.value)\n\n const outDir = args.outDir\n if (outDir) {\n const file = yield* writeJsonFile(outDir, args.fileName, args.value)\n return {\n outputKey: args.outputKey,\n kind: args.kind,\n ok: true,\n file,\n ...(typeof schemaVersion === 'number' ? { schemaVersion } : null),\n ...(reasonCodes ? { reasonCodes } : null),\n digest,\n }\n }\n\n const json = stableStringifyJson(args.value)\n const bytes = toBytes(json)\n const budget = args.budgetBytes\n if (typeof budget === 'number' && Number.isFinite(budget) && budget > 0 && bytes > budget) {\n const truncated = makeOversizedInlineValue({ stableJson: json, bytes, budgetBytes: budget })\n return {\n outputKey: args.outputKey,\n kind: args.kind,\n ok: true,\n inline: truncated.inline,\n truncated: truncated.truncated,\n budgetBytes: truncated.budgetBytes,\n actualBytes: truncated.actualBytes,\n ...(typeof schemaVersion === 'number' ? { schemaVersion } : null),\n ...(reasonCodes ? { reasonCodes } : null),\n digest,\n }\n }\n\n return {\n outputKey: args.outputKey,\n kind: args.kind,\n ok: true,\n inline: JSON.parse(json) as JsonValue,\n ...(typeof schemaVersion === 'number' ? { schemaVersion } : null),\n ...(reasonCodes ? { reasonCodes } : null),\n digest,\n ...(budget ? { budgetBytes: budget, actualBytes: bytes } : null),\n }\n })\n"],"mappings":"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","names":["Effect","Effect"]}
@@ -0,0 +1,15 @@
1
+ import {
2
+ runUnsupportedCommand
3
+ } from "./chunk-HGHTOYNL.js";
4
+ import "./chunk-6DZEO5HP.js";
5
+ import "./chunk-PZ5AY32C.js";
6
+
7
+ // src/internal/commands/contractSuiteRun.ts
8
+ var runContractSuiteRun = (inv) => runUnsupportedCommand({
9
+ runId: inv.global.runId,
10
+ command: "contract-suite.run"
11
+ });
12
+ export {
13
+ runContractSuiteRun
14
+ };
15
+ //# sourceMappingURL=contractSuiteRun-5Y7LVI72.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/commands/contractSuiteRun.ts"],"sourcesContent":["import { Effect } from 'effect'\n\nimport type { CliInvocation } from '../args.js'\nimport type { CommandResult } from '../result.js'\nimport { runUnsupportedCommand } from './unsupported.js'\n\ntype ContractSuiteRunInvocation = Extract<CliInvocation, { readonly command: 'contract-suite.run' }>\n\nexport const runContractSuiteRun = (inv: ContractSuiteRunInvocation): Effect.Effect<CommandResult, never> =>\n runUnsupportedCommand({\n runId: inv.global.runId,\n command: 'contract-suite.run',\n })\n"],"mappings":";;;;;;;AAQO,IAAM,sBAAsB,CAAC,QAClC,sBAAsB;AAAA,EACpB,OAAO,IAAI,OAAO;AAAA,EAClB,SAAS;AACX,CAAC;","names":[]}
@@ -0,0 +1,218 @@
1
+ import {
2
+ makeArtifactOutput
3
+ } from "./chunk-VRPSB3SV.js";
4
+ import "./chunk-RF7XSP3P.js";
5
+ import {
6
+ asSerializableErrorSummary,
7
+ makeCommandResult
8
+ } from "./chunk-6DZEO5HP.js";
9
+ import "./chunk-PZ5AY32C.js";
10
+
11
+ // src/internal/commands/describe.ts
12
+ import { Effect } from "effect";
13
+ var GLOBAL_OPTIONS = [
14
+ { name: "--runId", type: "string", required: true },
15
+ { name: "--out", type: "string", required: false },
16
+ { name: "--outRoot", type: "string", required: false },
17
+ { name: "--budgetBytes", type: "integer", required: false },
18
+ { name: "--mode", type: "enum", required: false, enumValues: ["report", "write"] },
19
+ { name: "--tsconfig", type: "string", required: false },
20
+ { name: "--host", type: "enum", required: false, default: "node", enumValues: ["node", "browser-mock"] },
21
+ { name: "--cliConfig", type: "string", required: false },
22
+ { name: "--profile", type: "string", required: false }
23
+ ];
24
+ var makeCommand = (input) => ({
25
+ ...input,
26
+ options: [...GLOBAL_OPTIONS, ...input.options ?? []],
27
+ exitCodes: [0, 1, 2]
28
+ });
29
+ var makeUnsupportedCommand = (input) => makeCommand({
30
+ ...input,
31
+ availability: "unavailable",
32
+ unavailableReasonCode: "CLI_NOT_IMPLEMENTED",
33
+ outputs: []
34
+ });
35
+ var COMMAND_CONTRACTS = [
36
+ makeCommand({
37
+ name: "describe",
38
+ category: "meta",
39
+ summary: "\u673A\u5668\u53EF\u8BFB\u547D\u4EE4\u5951\u7EA6\u4E0E\u914D\u7F6E\u53EF\u89C1\u6027\uFF08\u4EC5\u652F\u6301 --json\uFF09",
40
+ availability: "available",
41
+ options: [{ name: "--json", type: "boolean", required: true, default: true }],
42
+ outputs: [{ outputKey: "describeReport", kind: "CliDescribeReport" }]
43
+ }),
44
+ makeCommand({
45
+ name: "ir.export",
46
+ category: "oracle",
47
+ summary: "\u5BFC\u51FA\u63A7\u5236\u9762 IR\uFF08manifest/workflow surface\uFF09",
48
+ availability: "available",
49
+ options: [{ name: "--entry", type: "string", required: true }],
50
+ outputs: [
51
+ { outputKey: "controlSurfaceManifest", kind: "ControlSurfaceManifest" },
52
+ { outputKey: "workflowSurface", kind: "WorkflowSurfaceBundle" }
53
+ ]
54
+ }),
55
+ makeCommand({
56
+ name: "ir.validate",
57
+ category: "gate",
58
+ summary: "\u5BF9\u5BFC\u51FA\u5DE5\u4EF6\u505A\u7ED3\u6784\u5316\u95E8\u7981\u6821\u9A8C",
59
+ availability: "available",
60
+ options: [
61
+ { name: "--in", type: "string", required: false },
62
+ { name: "--artifact", type: "string", required: false }
63
+ ],
64
+ outputs: [{ outputKey: "irValidateReport", kind: "IrValidateReport" }]
65
+ }),
66
+ makeCommand({
67
+ name: "ir.diff",
68
+ category: "gate",
69
+ summary: "\u6BD4\u8F83 before/after \u5DE5\u4EF6\u5DEE\u5F02\u5E76\u95E8\u7981\u5316",
70
+ availability: "available",
71
+ options: [
72
+ { name: "--before", type: "string", required: true },
73
+ { name: "--after", type: "string", required: true }
74
+ ],
75
+ outputs: [{ outputKey: "irDiffReport", kind: "IrDiffReport" }]
76
+ }),
77
+ makeUnsupportedCommand({
78
+ name: "trialrun",
79
+ category: "oracle",
80
+ summary: "\u53D7\u63A7\u8BD5\u8DD1\u5E76\u8F93\u51FA TrialRunReport",
81
+ options: [
82
+ { name: "--entry", type: "string", required: true },
83
+ { name: "--diagnosticsLevel", type: "enum", required: false, default: "light", enumValues: ["off", "light", "full"] },
84
+ { name: "--maxEvents", type: "integer", required: false },
85
+ { name: "--timeout", type: "integer", required: false },
86
+ { name: "--includeTrace", type: "boolean", required: false, default: false },
87
+ { name: "--config", type: "kv", required: false, repeatable: true }
88
+ ]
89
+ }),
90
+ makeUnsupportedCommand({
91
+ name: "contract-suite.run",
92
+ category: "gate",
93
+ summary: "\u4E00\u952E\u9A8C\u6536\uFF08trialrun + verdict/context-pack\uFF09",
94
+ options: [
95
+ { name: "--entry", type: "string", required: true },
96
+ { name: "--allowWarn", type: "boolean", required: false, default: false },
97
+ { name: "--baseline", type: "string", required: false },
98
+ { name: "--includeContextPack", type: "boolean", required: false, default: false },
99
+ { name: "--inputs", type: "string", required: false },
100
+ { name: "--includeUiKitRegistry", type: "boolean", required: false, default: false },
101
+ { name: "--packMaxBytes", type: "integer", required: false },
102
+ { name: "--requireRulesManifest", type: "boolean", required: false, default: false },
103
+ { name: "--includeAnchorAutofill", type: "boolean", required: false, default: false },
104
+ { name: "--repoRoot", type: "string", required: false, default: "." },
105
+ { name: "--diagnosticsLevel", type: "enum", required: false, default: "light", enumValues: ["off", "light", "full"] },
106
+ { name: "--maxEvents", type: "integer", required: false },
107
+ { name: "--timeout", type: "integer", required: false },
108
+ { name: "--includeTrace", type: "boolean", required: false, default: false },
109
+ { name: "--config", type: "kv", required: false, repeatable: true }
110
+ ]
111
+ }),
112
+ makeUnsupportedCommand({
113
+ name: "spy.evidence",
114
+ category: "oracle",
115
+ summary: "\u91C7\u96C6 $.use(Tag) \u8BC1\u636E\uFF08\u4E0D\u5199\u56DE\u6E90\u7801\uFF09",
116
+ options: [
117
+ { name: "--entry", type: "string", required: true },
118
+ { name: "--maxUsedServices", type: "integer", required: false },
119
+ { name: "--maxRawMode", type: "integer", required: false },
120
+ { name: "--timeout", type: "integer", required: false }
121
+ ]
122
+ }),
123
+ makeUnsupportedCommand({
124
+ name: "anchor.index",
125
+ category: "oracle",
126
+ summary: "\u626B\u63CF\u4ED3\u5E93\u5E76\u6784\u5EFA AnchorIndex",
127
+ options: [{ name: "--repoRoot", type: "string", required: false, default: "." }]
128
+ }),
129
+ makeCommand({
130
+ name: "anchor.autofill",
131
+ category: "write",
132
+ summary: "\u8865\u9F50\u951A\u70B9\uFF08\u9ED8\u8BA4 report-only\uFF09",
133
+ availability: "available",
134
+ options: [{ name: "--repoRoot", type: "string", required: false, default: "." }],
135
+ outputs: [
136
+ { outputKey: "patchPlan", kind: "PatchPlan" },
137
+ { outputKey: "autofillReport", kind: "AutofillReport" },
138
+ { outputKey: "writeBackResult", kind: "WriteBackResult" }
139
+ ]
140
+ }),
141
+ makeUnsupportedCommand({
142
+ name: "transform.module",
143
+ category: "write",
144
+ summary: "\u6309 delta \u6279\u91CF\u53D8\u66F4 module\uFF08\u9ED8\u8BA4 report-only\uFF09",
145
+ options: [
146
+ { name: "--repoRoot", type: "string", required: false, default: "." },
147
+ { name: "--ops", type: "string", required: true }
148
+ ]
149
+ })
150
+ ];
151
+ var toConfigLayers = (layers) => layers.map(
152
+ (layer) => layer.source === "profile" ? { source: "profile", profile: layer.profile, tokens: layer.tokens } : { source: "defaults", tokens: layer.tokens }
153
+ );
154
+ var makeDescribeReport = (ctx) => ({
155
+ schemaVersion: 1,
156
+ kind: "CliDescribeReport",
157
+ nonGoals: [
158
+ "CLI_IS_NOT_AGENT_RUNTIME",
159
+ "CLI_MUST_NOT_EMBED_LOOP_MEMORY_POLICY",
160
+ "CLI_AGENT_DECISIONS_MUST_STAY_EXTERNAL"
161
+ ],
162
+ protocol: {
163
+ commandResultSchemaRef: "specs/085-logix-cli-node-only/contracts/schemas/cli-command-result.schema.json",
164
+ reasonCodeCatalogRef: "specs/085-logix-cli-node-only/contracts/reason-codes.md",
165
+ exitCodes: [
166
+ { code: 0, meaning: "PASS" },
167
+ { code: 1, meaning: "ERROR" },
168
+ { code: 2, meaning: "VIOLATION_OR_INVALID_INPUT" }
169
+ ]
170
+ },
171
+ commands: COMMAND_CONTRACTS,
172
+ configVisibility: {
173
+ precedence: ["defaults", "profile", "argv"],
174
+ argv: ctx.argv,
175
+ argvWithConfigPrefix: ctx.argvWithConfigPrefix,
176
+ ...ctx.cliConfig.cliConfigPathArg ? { cliConfigPathArg: ctx.cliConfig.cliConfigPathArg } : null,
177
+ ...ctx.cliConfig.profile ? { profile: ctx.cliConfig.profile } : null,
178
+ ...ctx.cliConfig.discoveredPath ? { discoveredPath: ctx.cliConfig.discoveredPath } : null,
179
+ layers: toConfigLayers(ctx.cliConfig.layers),
180
+ discovery: ctx.cliConfig.discovery
181
+ }
182
+ });
183
+ var runDescribe = (inv, ctx) => {
184
+ const runId = inv.global.runId;
185
+ return Effect.gen(function* () {
186
+ const report = makeDescribeReport(ctx);
187
+ const artifacts = [
188
+ yield* makeArtifactOutput({
189
+ outDir: inv.global.outDir,
190
+ budgetBytes: inv.global.budgetBytes,
191
+ fileName: "describe.report.json",
192
+ outputKey: "describeReport",
193
+ kind: "CliDescribeReport",
194
+ value: report
195
+ })
196
+ ];
197
+ return makeCommandResult({
198
+ runId,
199
+ command: "describe",
200
+ ok: true,
201
+ artifacts
202
+ });
203
+ }).pipe(
204
+ Effect.catch((cause) => Effect.succeed(
205
+ makeCommandResult({
206
+ runId,
207
+ command: "describe",
208
+ ok: false,
209
+ artifacts: [],
210
+ error: asSerializableErrorSummary(cause)
211
+ })
212
+ ))
213
+ );
214
+ };
215
+ export {
216
+ runDescribe
217
+ };
218
+ //# sourceMappingURL=describe-5MFSLD7R.js.map