{"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["// The analyzer (which pulls the 23 MB typescript compiler, an optional peer)\n// loads lazily inside its own command only — `matrix` and `mcp-config` must\n// run on an install without typescript.\nimport { writeFileSync } from 'node:fs'\nimport { parseArgs } from 'node:util'\nimport { API_RULES, CONTEXT_RULES, EVENT_RULES, HOST_IMPORT_RULES, UI_CONTEXT_RULES } from './compatibility.js'\nimport { convertPiMcpConfig, renderMcpPatch } from './mcp-config.js'\nimport { resolvePiPackage } from './source.js'\nimport type { CompatibilityReport } from './types.js'\n\nfunction usage(): string {\n  return `pi2dsh — migrate Pi packages to DeepSeek Harness\\n\\n`\n    + `Usage:\\n`\n    + `  pi2dsh inspect <package-or-path> [--json]\\n`\n    + `  pi2dsh mcp-config [--cwd <dir>] [--out <file>] [--json]\\n`\n    + `  pi2dsh matrix [--json]\\n\\n`\n    + `Installing is dsh's own job — \\`dsh plugin add pi2dsh\\`, then\\n`\n    + `\\`dsh plugin add <pi package>\\`. This CLI only inspects.\\n\\n`\n    + `mcp-config reads Pi's standard mcpServers files (six-layer precedence)\\n`\n    + `and emits DSH cordis.patch.yml entries for the official dsh-mcp-client —\\n`\n    + `Pi's MCP adapter code is never executed.\\n`\n}\n\nfunction reportText(report: CompatibilityReport): string {\n  const lines = [\n    `${report.package.name}@${report.package.version}: ${report.verdict.toUpperCase()}`,\n    `full=${report.summary.full} partial=${report.summary.partial} unsupported=${report.summary.unsupported}`,\n    `extensions=${report.resources.extensions.length} skills=${report.resources.skills.length} prompts=${report.resources.prompts.length} themes=${report.resources.themes.length}`,\n  ]\n  for (const finding of report.findings) {\n    lines.push(`${finding.level.toUpperCase().padEnd(11)} ${finding.file}:${finding.line} ${finding.capability} — ${finding.detail}`)\n  }\n  return lines.join('\\n')\n}\n\nfunction matrix(json: boolean): void {\n  const value = {\n    api: API_RULES,\n    events: EVENT_RULES,\n    context: CONTEXT_RULES,\n    uiContext: UI_CONTEXT_RULES,\n    hostImports: HOST_IMPORT_RULES,\n  }\n  if (json) console.log(JSON.stringify(value, null, 2))\n  else {\n    for (const [kind, rules] of Object.entries(value)) {\n      console.log(`${kind}:`)\n      for (const [name, candidate] of Object.entries(rules)) {\n        if ('level' in candidate && 'detail' in candidate) {\n          console.log(`  ${candidate.level.padEnd(11)} ${name} — ${candidate.detail}`)\n        } else {\n          const hostRules = candidate as Readonly<Record<string, { level: string; detail: string }>>\n          for (const [exportName, hostRule] of Object.entries(hostRules)) {\n            console.log(`  ${hostRule.level.padEnd(11)} ${name}:${exportName} — ${hostRule.detail}`)\n          }\n        }\n      }\n    }\n  }\n}\n\nasync function main(): Promise<void> {\n  const parsed = parseArgs({\n    allowPositionals: true,\n    strict: true,\n    options: {\n      json: { type: 'boolean', default: false },\n      out: { type: 'string' },\n      cwd: { type: 'string' },\n      help: { type: 'boolean', short: 'h', default: false },\n    },\n  })\n  const [command, source] = parsed.positionals\n  if (parsed.values.help || command === undefined) {\n    console.log(usage())\n    return\n  }\n  if (command === 'matrix') {\n    matrix(parsed.values.json)\n    return\n  }\n  if (command === 'mcp-config') {\n    const result = convertPiMcpConfig(parsed.values.cwd ?? process.cwd())\n    for (const warning of result.warnings) {\n      console.error(`warning: ${warning.server}: ${warning.message}`)\n    }\n    const output = parsed.values.json ? `${JSON.stringify(result, null, 2)}\\n` : renderMcpPatch(result)\n    if (parsed.values.out === undefined) process.stdout.write(output)\n    else {\n      writeFileSync(parsed.values.out, output)\n      console.error(`wrote ${result.entries.length} MCP server entr${result.entries.length === 1 ? 'y' : 'ies'} from ${result.sources.length} Pi config file(s) to ${parsed.values.out}`)\n    }\n    return\n  }\n  if (command !== 'inspect' || source === undefined) {\n    throw new Error(`invalid command\\n\\n${usage()}`)\n  }\n\n  const pkg = await resolvePiPackage(source)\n  try {\n    const { analyzePackage } = await import('./analyzer.js')\n    const report = await analyzePackage(pkg)\n    console.log(parsed.values.json ? JSON.stringify(report, null, 2) : reportText(report))\n    if (report.verdict === 'blocked') process.exitCode = 2\n  } finally {\n    await pkg.dispose()\n  }\n}\n\nmain().catch((error: unknown) => {\n  console.error(error instanceof Error ? error.message : String(error))\n  process.exitCode = 1\n})\n"],"mappings":"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"}