{"version":3,"file":"presenter.cjs","names":["DEFAULT_THEME","DEFAULT_THEME_NAME","DOOM_EXTENSION","AMBIENT_EXTENSION_FILTER","GLOBAL_DOOM_SEED_FILES","SEED_FILE_GUIDANCE"],"sources":["../../../../src/cli/commands/init/presenter.ts"],"sourcesContent":["import { GLOBAL_DOOM_SEED_FILES, type GlobalDoomInitResult } from '@agimon-ai/doompi-config';\nimport { AMBIENT_EXTENSION_FILTER, DOOM_EXTENSION } from '@agimon-ai/doompi-core/runtime-pi-settings';\nimport { DEFAULT_THEME, DEFAULT_THEME_NAME } from '@agimon-ai/doompi-ui/theme';\n\nimport { SEED_FILE_GUIDANCE } from './constants';\n\nconst FORCE_COLOR_ENV = 'FORCE_COLOR';\nconst NO_COLOR_ENV = 'NO_COLOR';\nconst DUMB_TERMINAL = 'dumb';\nconst ANSI_PREFIX = '\\u001B[';\nconst ANSI_RESET = `${ANSI_PREFIX}0m`;\nconst SECTION_RULE = '─'.repeat(72);\nconst READY_RULE = '━━━━━━━━';\nconst SETTINGS_KEYS = ['extensions', 'themes', 'theme', 'quietStartup'] as const;\n\nexport interface InitOutput {\n  write: NodeJS.WritableStream['write'];\n  isTTY?: boolean;\n}\n\nexport interface PiIntegrationSummary {\n  settingsPath: string;\n  themePath: string;\n  aliasPath: string;\n  before: Record<string, unknown>;\n  after: Record<string, unknown>;\n}\n\ntype SeedFile = (typeof GLOBAL_DOOM_SEED_FILES)[number];\ntype SeedFileStatus = 'CREATED' | 'KEPT' | 'REPLACED';\ntype Paint = (text: string) => string;\n\ninterface InitPalette {\n  accent: Paint;\n  badge: Paint;\n  error: Paint;\n  heading: Paint;\n  key: Paint;\n  kept: Paint;\n  muted: Paint;\n  path: Paint;\n  strong: Paint;\n  success: Paint;\n  warning: Paint;\n}\n\ninterface PaintOptions {\n  background?: string;\n  bold?: boolean;\n}\n\nfunction colorEnabled(output: InitOutput, environment: NodeJS.ProcessEnv): boolean {\n  const forced = environment[FORCE_COLOR_ENV];\n  if (forced === '0') return false;\n  if (forced !== undefined) return true;\n  if (environment[NO_COLOR_ENV] !== undefined) return false;\n  return output.isTTY === true && environment.TERM !== DUMB_TERMINAL;\n}\n\nfunction rgbCode(prefix: 38 | 48, hex: string): string {\n  const value = Number.parseInt(hex.slice(1), 16);\n  const red = (value >> 16) & 0xff;\n  const green = (value >> 8) & 0xff;\n  const blue = value & 0xff;\n  return `${String(prefix)};2;${String(red)};${String(green)};${String(blue)}`;\n}\n\nfunction painter(enabled: boolean, foreground: string, options: PaintOptions = {}): Paint {\n  if (!enabled) return (text) => text;\n  const codes = [rgbCode(38, foreground)];\n  if (options.background) codes.push(rgbCode(48, options.background));\n  if (options.bold) codes.unshift('1');\n  const opening = `${ANSI_PREFIX}${codes.join(';')}m`;\n  return (text) => `${opening}${text}${ANSI_RESET}`;\n}\n\nfunction createPalette(enabled: boolean): InitPalette {\n  const { vars } = DEFAULT_THEME;\n  const accent = painter(enabled, vars.blue);\n  const badgePaint = painter(enabled, vars.bg, { background: vars.blue, bold: true });\n  return {\n    accent,\n    badge: enabled ? (text) => badgePaint(` ${text} `) : (text) => text,\n    error: painter(enabled, vars.red, { bold: true }),\n    heading: painter(enabled, vars.magenta, { bold: true }),\n    key: painter(enabled, vars.cyan),\n    kept: painter(enabled, vars.violet),\n    muted: painter(enabled, vars.comment),\n    path: painter(enabled, vars.cyan),\n    strong: painter(enabled, vars.fg, { bold: true }),\n    success: painter(enabled, vars.green, { bold: true }),\n    warning: painter(enabled, vars.yellow),\n  };\n}\n\nfunction seedFileStatus(result: GlobalDoomInitResult, fileName: SeedFile): SeedFileStatus {\n  if (result.created.includes(fileName)) return 'CREATED';\n  if (result.replaced.includes(fileName)) return 'REPLACED';\n  if (result.preserved.includes(fileName)) return 'KEPT';\n  throw new Error(`doompi init did not classify generated file: ${fileName}`);\n}\n\nfunction firstString(value: unknown): string | undefined {\n  if (!Array.isArray(value)) return undefined;\n  return value.find((entry): entry is string => typeof entry === 'string');\n}\n\n/** Streams the init command using the same Doom One semantic palette as the Pi TUI. */\nexport class InitPresenter {\n  private readonly output: InitOutput;\n  private readonly palette: InitPalette;\n\n  constructor(output: InitOutput, environment: NodeJS.ProcessEnv) {\n    this.output = output;\n    this.palette = createPalette(colorEnabled(output, environment));\n  }\n\n  brand(): void {\n    const color = this.palette;\n    this.write([\n      color.muted('BOOT / INIT'),\n      `${color.accent('DOOM')} ${color.badge('PI')}  ${color.heading('INITIALIZE')}`,\n      color.muted('Pi, configured for focus.'),\n      `${color.accent(READY_RULE)} ${color.heading('SETUP')}`,\n      '',\n    ]);\n  }\n\n  stage(step: number, total: number, label: string, target: string): void {\n    const color = this.palette;\n    this.write([\n      `${color.accent(`[${String(step)}/${String(total)}]`)} ${color.strong(label)}`,\n      `      ${color.muted('TARGET')}  ${color.path(target)}`,\n    ]);\n  }\n\n  stageReady(message: string): void {\n    this.write([`      ${this.palette.success('● READY')}  ${message}`]);\n  }\n\n  stageFailed(message: string, detail: readonly string[]): void {\n    this.write([\n      `      ${this.palette.error('● FAILED')} ${message}`,\n      ...detail.map((line) => `        ${this.palette.warning(line)}`),\n    ]);\n  }\n\n  complete(config: GlobalDoomInitResult, pi: PiIntegrationSummary): void {\n    this.write(['', ...this.formatPiIntegration(pi)]);\n    this.write(['', ...this.formatConfigResult(config)]);\n    this.write([\n      '',\n      this.sectionHeading('NEXT'),\n      `  ${this.palette.accent('01')}  Open ${this.palette.path(config.directory)}.`,\n      `  ${this.palette.accent('02')}  Edit the YAML files to match how you want Pi to work.`,\n      `  ${this.palette.accent('03')}  From the repository you want to configure, run:`,\n      '',\n      `      ${this.palette.badge('doompi sync')}`,\n      '',\n      `${this.palette.success(READY_RULE)} ${this.palette.success('READY')}  Edit your config, then sync it.`,\n    ]);\n  }\n\n  private formatPiIntegration(result: PiIntegrationSummary): string[] {\n    const changedKeys = SETTINGS_KEYS.filter((key) => this.settingsValueChanged(result, key));\n    const selectedTheme = typeof result.after.theme === 'string' ? result.after.theme : DEFAULT_THEME_NAME;\n    const themeDescription =\n      selectedTheme === DEFAULT_THEME_NAME\n        ? `selected ${this.palette.path(`\"${DEFAULT_THEME_NAME}\"`)} when no prior theme was set`\n        : `kept your existing selection ${this.palette.path(`\"${selectedTheme}\"`)}`;\n    const registeredTheme = firstString(result.after.themes) ?? result.themePath;\n    const summary =\n      changedKeys.length === 0\n        ? this.palette.success('No settings edits were needed; DoomPi entries were already current.')\n        : `${this.palette.warning(\n            `Updated ${String(changedKeys.length)} managed key${changedKeys.length === 1 ? '' : 's'}.`,\n          )} ${this.palette.muted('Unrelated settings were preserved.')}`;\n\n    return [\n      this.sectionHeading('PI GLOBAL SETTINGS'),\n      `  ${this.palette.path(result.settingsPath)}`,\n      `  ${this.palette.muted('Pi defaults to ~/.pi/agent/settings.json and honors PI_CODING_AGENT_DIR.')}`,\n      `  ${summary}`,\n      this.settingLine(\n        result,\n        'extensions',\n        `load ${this.palette.path(`\"${DOOM_EXTENSION}\"`)} first; ${this.palette.path(\n          `\"${AMBIENT_EXTENSION_FILTER}\"`,\n        )} keeps layer loading explicit`,\n      ),\n      this.settingLine(result, 'themes', `registered ${this.palette.path(`\"${registeredTheme}\"`)}`),\n      this.settingLine(result, 'theme', themeDescription),\n      this.settingLine(result, 'quietStartup', 'true for a concise Pi startup'),\n      `  ${this.palette.muted('RESOURCES')}`,\n      `    ${this.palette.muted('ALIAS'.padEnd(7))}${this.palette.path(result.aliasPath)}`,\n      `    ${this.palette.muted('THEME'.padEnd(7))}${this.palette.path(result.themePath)}`,\n    ];\n  }\n\n  private formatConfigResult(result: GlobalDoomInitResult): string[] {\n    const lines = [\n      this.sectionHeading('DOOMPI CONFIGURATION'),\n      `  ${this.palette.path(result.directory)}`,\n      ...GLOBAL_DOOM_SEED_FILES.map((fileName) => {\n        const status = seedFileStatus(result, fileName);\n        return `  ${this.fileStatus(status)} ${this.palette.key(fileName.padEnd(13))} ${this.palette.muted('—')} ${SEED_FILE_GUIDANCE[fileName]}`;\n      }),\n    ];\n    if (result.preserved.length > 0) {\n      lines.push(`  ${this.palette.kept('KEPT')} ${this.palette.muted('files retain your existing edits.')}`);\n    }\n    if (result.replaced.length > 0) {\n      lines.push(\n        `  ${this.palette.warning('REPLACED')} ${this.palette.muted(\n          'files were restored from the templates because --force was used.',\n        )}`,\n      );\n    }\n    return lines;\n  }\n\n  private settingLine(result: PiIntegrationSummary, key: (typeof SETTINGS_KEYS)[number], description: string): string {\n    const changed = this.settingsValueChanged(result, key);\n    const status = changed ? this.palette.warning('UPDATED'.padEnd(8)) : this.palette.success('READY'.padEnd(8));\n    return `  ${status} ${this.palette.key(`${key}:`.padEnd(14))}${description}`;\n  }\n\n  private settingsValueChanged(result: PiIntegrationSummary, key: (typeof SETTINGS_KEYS)[number]): boolean {\n    return JSON.stringify(result.before[key]) !== JSON.stringify(result.after[key]);\n  }\n\n  private fileStatus(status: SeedFileStatus): string {\n    const padded = status.padEnd(8);\n    if (status === 'CREATED') return this.palette.accent(padded);\n    if (status === 'REPLACED') return this.palette.warning(padded);\n    return this.palette.kept(padded);\n  }\n\n  private sectionHeading(title: string): string {\n    return `${this.palette.muted(SECTION_RULE)}\\n${this.palette.heading(title)}`;\n  }\n\n  private write(lines: readonly string[]): void {\n    this.output.write(`${lines.join('\\n')}\\n`);\n  }\n}\n"],"mappings":"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"}