{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/cli/commands/init/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\n\nimport {\n  type GlobalDoomInitResult,\n  globalDoomConfigDirectory,\n  initializeGlobalDoomConfig,\n} from '@agimon-ai/doompi-config';\nimport {\n  piAgentDirectory,\n  piThemeDirectory,\n  readPiSettings,\n  writePiSettings,\n} from '@agimon-ai/doompi-core/runtime-pi-settings';\nimport { DEFAULT_THEME_NAME, writeDefaultTheme } from '@agimon-ai/doompi-ui/theme';\n\nimport { writePiExtensionAlias } from '../../../builders/cli/piExtensionAlias';\nimport { wantsHelp } from '../../router';\nimport { initHelp } from './help';\nimport { InitPresenter, type InitOutput, type PiIntegrationSummary } from './presenter';\n\nconst INIT_COMMAND = 'init';\nconst FORCE_FLAG = '--force';\nconst SETUP_STAGE_COUNT = 2;\n\nfunction setupFailure(activity: string, target: string, error: unknown): Error {\n  const detail = error instanceof Error ? error.message : String(error);\n  return new Error(`doompi init failed while ${activity} at ${target}: ${detail}`, { cause: error });\n}\n\nasync function initializePiIntegration(\n  homeDirectory: string,\n  environment: NodeJS.ProcessEnv,\n): Promise<PiIntegrationSummary> {\n  const agentDirectory = piAgentDirectory(environment, homeDirectory);\n  const before = readPiSettings(agentDirectory);\n  const themeDirectory = piThemeDirectory(agentDirectory);\n  await fs.promises.mkdir(themeDirectory, { recursive: true });\n  const themePath = await writeDefaultTheme(themeDirectory);\n  const aliasPath = writePiExtensionAlias(agentDirectory);\n  const settingsPath = writePiSettings(agentDirectory, { themePath, themeName: DEFAULT_THEME_NAME });\n  return {\n    settingsPath,\n    themePath,\n    aliasPath,\n    before,\n    after: readPiSettings(agentDirectory),\n  };\n}\n\n/** Handles the repository-independent `doompi init` command. */\nexport async function runInit(\n  args: string[],\n  homeDirectory = os.homedir(),\n  output: InitOutput = process.stdout,\n  environment: NodeJS.ProcessEnv = process.env,\n): Promise<number> {\n  const flags = args.slice(1);\n  const unknown = flags.find((flag) => flag !== FORCE_FLAG);\n  if (wantsHelp(args)) {\n    process.stdout.write(initHelp());\n    return 0;\n  }\n  if (unknown !== undefined) throw new Error(`doompi init does not accept ${unknown}`);\n\n  const presenter = new InitPresenter(output, environment);\n  presenter.brand();\n\n  const configDirectory = globalDoomConfigDirectory(homeDirectory);\n  presenter.stage(1, SETUP_STAGE_COUNT, 'WRITE CONFIGURATION', configDirectory);\n  let configResult: GlobalDoomInitResult;\n  try {\n    configResult = initializeGlobalDoomConfig(homeDirectory, { force: flags.includes(FORCE_FLAG) });\n    presenter.stageReady('Configuration files are ready.');\n  } catch (error) {\n    presenter.stageFailed('Configuration setup failed.', [\n      'Fix the reported path or permissions, then run doompi init again.',\n    ]);\n    throw setupFailure('writing configuration', configDirectory, error);\n  }\n\n  const agentDirectory = piAgentDirectory(environment, homeDirectory);\n  presenter.stage(2, SETUP_STAGE_COUNT, 'REGISTER WITH PI', agentDirectory);\n  let piResult: PiIntegrationSummary;\n  try {\n    piResult = await initializePiIntegration(homeDirectory, environment);\n    presenter.stageReady('Pi integration is ready.');\n  } catch (error) {\n    presenter.stageFailed('Pi integration failed.', [\n      `Your DoomPi configuration remains at ${configResult.directory}.`,\n      'Fix the reported settings or filesystem issue, then run doompi init again.',\n    ]);\n    throw setupFailure('registering with Pi', agentDirectory, error);\n  }\n\n  presenter.complete(configResult, piResult);\n  return 0;\n}\n\n/** Compatibility API. Executables call the command function directly. */\nexport class InitCommand {\n  readonly name = INIT_COMMAND;\n\n  matches(args: string[]): boolean {\n    return args[0] === this.name;\n  }\n\n  async execute(\n    args: string[],\n    homeDirectory = os.homedir(),\n    output: InitOutput = process.stdout,\n    environment: NodeJS.ProcessEnv = process.env,\n  ): Promise<number> {\n    return runInit(args, homeDirectory, output, environment);\n  }\n}\n"],"mappings":";;;;;;;;;;AAqBA,MAAM,eAAe;AACrB,MAAM,aAAa;AACnB,MAAM,oBAAoB;AAE1B,SAAS,aAAa,UAAkB,QAAgB,OAAuB;CAC7E,MAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;CACpE,OAAO,IAAI,MAAM,4BAA4B,SAAS,MAAM,OAAO,IAAI,UAAU,EAAE,OAAO,MAAM,CAAC;AACnG;AAEA,eAAe,wBACb,eACA,aAC+B;CAC/B,MAAM,iBAAiB,iBAAiB,aAAa,aAAa;CAClE,MAAM,SAAS,eAAe,cAAc;CAC5C,MAAM,iBAAiB,iBAAiB,cAAc;CACtD,MAAM,GAAG,SAAS,MAAM,gBAAgB,EAAE,WAAW,KAAK,CAAC;CAC3D,MAAM,YAAY,MAAM,kBAAkB,cAAc;CACxD,MAAM,YAAY,sBAAsB,cAAc;CAEtD,OAAO;EACL,cAFmB,gBAAgB,gBAAgB;GAAE;GAAW,WAAW;EAAmB,CAEnF;EACX;EACA;EACA;EACA,OAAO,eAAe,cAAc;CACtC;AACF;;AAGA,eAAsB,QACpB,MACA,gBAAgB,GAAG,QAAQ,GAC3B,SAAqB,QAAQ,QAC7B,cAAiC,QAAQ,KACxB;CACjB,MAAM,QAAQ,KAAK,MAAM,CAAC;CAC1B,MAAM,UAAU,MAAM,MAAM,SAAS,SAAS,UAAU;CACxD,IAAI,UAAU,IAAI,GAAG;EACnB,QAAQ,OAAO,MAAM,SAAS,CAAC;EAC/B,OAAO;CACT;CACA,IAAI,YAAY,KAAA,GAAW,MAAM,IAAI,MAAM,+BAA+B,SAAS;CAEnF,MAAM,YAAY,IAAI,cAAc,QAAQ,WAAW;CACvD,UAAU,MAAM;CAEhB,MAAM,kBAAkB,0BAA0B,aAAa;CAC/D,UAAU,MAAM,GAAG,mBAAmB,uBAAuB,eAAe;CAC5E,IAAI;CACJ,IAAI;EACF,eAAe,2BAA2B,eAAe,EAAE,OAAO,MAAM,SAAS,UAAU,EAAE,CAAC;EAC9F,UAAU,WAAW,gCAAgC;CACvD,SAAS,OAAO;EACd,UAAU,YAAY,+BAA+B,CACnD,mEACF,CAAC;EACD,MAAM,aAAa,yBAAyB,iBAAiB,KAAK;CACpE;CAEA,MAAM,iBAAiB,iBAAiB,aAAa,aAAa;CAClE,UAAU,MAAM,GAAG,mBAAmB,oBAAoB,cAAc;CACxE,IAAI;CACJ,IAAI;EACF,WAAW,MAAM,wBAAwB,eAAe,WAAW;EACnE,UAAU,WAAW,0BAA0B;CACjD,SAAS,OAAO;EACd,UAAU,YAAY,0BAA0B,CAC9C,wCAAwC,aAAa,UAAU,IAC/D,4EACF,CAAC;EACD,MAAM,aAAa,uBAAuB,gBAAgB,KAAK;CACjE;CAEA,UAAU,SAAS,cAAc,QAAQ;CACzC,OAAO;AACT;;AAGA,IAAa,cAAb,MAAyB;CACvB,OAAgB;CAEhB,QAAQ,MAAyB;EAC/B,OAAO,KAAK,OAAO,KAAK;CAC1B;CAEA,MAAM,QACJ,MACA,gBAAgB,GAAG,QAAQ,GAC3B,SAAqB,QAAQ,QAC7B,cAAiC,QAAQ,KACxB;EACjB,OAAO,QAAQ,MAAM,eAAe,QAAQ,WAAW;CACzD;AACF"}