kindflow 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/commands/start.ts","../src/commands/create.ts","../src/commands/list.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * Kindflow CLI entry point.\n *\n * Usage:\n * kindflow start [--web] [--port <n>]\n * kindflow create <name>\n * kindflow list\n */\n\nimport { defineCommand, runMain } from 'citty';\nimport { startCommand } from './commands/start.js';\nimport { createCommand } from './commands/create.js';\nimport { listCommand } from './commands/list.js';\n\n/** Root CLI command with subcommands. */\nconst main = defineCommand({\n meta: {\n name: 'kindflow',\n version: '0.2.0',\n description: 'Kindflow — The opinionated agent platform',\n },\n subCommands: {\n start: startCommand,\n create: createCommand,\n list: listCommand,\n },\n});\n\nrunMain(main);\n","/**\n * `kindflow start` — start the Kindflow daemon.\n *\n * By default, starts only the API server on port 7777.\n * With --web, also starts the web UI on port 7001.\n */\n\nimport { defineCommand } from 'citty';\nimport { startDaemon } from '@repo/daemon/daemon';\nimport { resolvePaths, detectMode, devPaths, cliPaths } from '@repo/daemon/paths';\nimport { mkdirSync } from 'fs';\nimport { resolve, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\n/** The `kindflow start` command definition. */\nexport const startCommand = defineCommand({\n meta: {\n name: 'start',\n description: 'Start the Kindflow daemon',\n },\n args: {\n web: {\n type: 'boolean',\n description: 'Also start the web UI',\n default: false,\n },\n port: {\n type: 'string',\n description: 'Override the API port (default: 7777)',\n },\n webPort: {\n type: 'string',\n description: 'Override the web UI port (default: 7001)',\n },\n agentsDir: {\n type: 'string',\n description: 'Override the agents directory',\n },\n },\n async run({ args }) {\n const isDev = detectMode() === 'dev';\n const base = isDev ? devPaths() : cliPaths();\n\n /* Compute webDir: in dev mode, webDir defaults to null (web runs separately).\n When --web is explicitly requested, point to apps/web in dev or dist/web in CLI. */\n let webDir: string | null = null;\n if (args.web) {\n if (base.webDir) {\n webDir = base.webDir;\n } else {\n /* Dev mode: resolve apps/web from the monorepo root. */\n const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../../../..');\n webDir = resolve(repoRoot, 'apps/web');\n }\n }\n\n const paths = {\n ...base,\n webDir,\n ...(args.agentsDir ? { agentsDir: resolve(args.agentsDir) } : {}),\n };\n\n /* Ensure the agents directory exists. */\n mkdirSync(paths.agentsDir, { recursive: true });\n\n const port = args.port ? parseInt(args.port, 10) : undefined;\n const webPort = args.webPort ? parseInt(args.webPort, 10) : undefined;\n\n console.log('');\n console.log(' Kindflow — The opinionated agent platform');\n console.log('');\n\n const daemon = await startDaemon({ port, webPort, paths });\n\n /** Handle SIGINT (Ctrl+C) and SIGTERM for graceful shutdown. */\n const handleSignal = async (signal: string): Promise<void> => {\n console.log(`\\n[kindflow] Received ${signal}`);\n await daemon.shutdown();\n process.exit(0);\n };\n\n process.on('SIGINT', () => handleSignal('SIGINT'));\n process.on('SIGTERM', () => handleSignal('SIGTERM'));\n },\n});\n","/**\n * `kindflow create <name>` — create a new agent from the template.\n */\n\nimport { defineCommand } from 'citty';\nimport { createAgentFromTemplate, generateSlug } from '@repo/daemon/agent-scanner';\nimport { resolvePaths } from '@repo/daemon/paths';\nimport { mkdirSync, existsSync } from 'fs';\nimport { resolve } from 'path';\n\n/** The `kindflow create` command definition. */\nexport const createCommand = defineCommand({\n meta: {\n name: 'create',\n description: 'Create a new agent',\n },\n args: {\n name: {\n type: 'positional',\n description: 'Name for the new agent',\n required: true,\n },\n },\n run({ args }) {\n const paths = resolvePaths();\n\n /* Ensure agents directory exists. */\n mkdirSync(paths.agentsDir, { recursive: true });\n\n /* Generate slug from name. */\n const slug = generateSlug(args.name);\n const agentDir = resolve(paths.agentsDir, slug);\n\n if (existsSync(agentDir)) {\n console.error(`Agent \"${slug}\" already exists at ${agentDir}`);\n process.exit(1);\n }\n\n const agent = createAgentFromTemplate(paths.agentsDir, paths.templateDir, slug, args.name);\n console.log(`Created agent \"${agent.config.name}\" at ${agent.dir}`);\n },\n});\n","/**\n * `kindflow list` — list all agents.\n */\n\nimport { defineCommand } from 'citty';\nimport { scanAgents } from '@repo/daemon/agent-scanner';\nimport { resolvePaths } from '@repo/daemon/paths';\n\n/** The `kindflow list` command definition. */\nexport const listCommand = defineCommand({\n meta: {\n name: 'list',\n description: 'List all agents',\n },\n run() {\n const paths = resolvePaths();\n const agents = scanAgents(paths.agentsDir);\n\n if (agents.length === 0) {\n console.log('No agents found.');\n console.log(`Create one with: kindflow create <name>`);\n return;\n }\n\n console.log(`Found ${agents.length} agent(s):\\n`);\n for (const agent of agents) {\n const autoStart = agent.config.autoStart ? 'auto-start' : 'manual';\n console.log(` ${agent.config.name} (${agent.id}) — ${autoStart}`);\n }\n },\n});\n"],"mappings":"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","names":["defineCommand","defineCommand","mkdirSync","resolve","defineCommand","defineCommand","defineCommand","defineCommand"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/start.ts","../src/commands/stop.ts","../src/commands/status.ts","../src/commands/create.ts","../src/commands/list.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * Kindflow CLI entry point.\n *\n * Usage:\n * kindflow start [--web] [--port <n>] [--foreground]\n * kindflow stop\n * kindflow status\n * kindflow create <name>\n * kindflow list\n */\n\nimport { defineCommand, runMain } from 'citty';\nimport { startCommand } from './commands/start.js';\nimport { stopCommand } from './commands/stop.js';\nimport { statusCommand } from './commands/status.js';\nimport { createCommand } from './commands/create.js';\nimport { listCommand } from './commands/list.js';\n\n/** Root CLI command with subcommands. */\nconst main = defineCommand({\n meta: {\n name: 'kindflow',\n version: '0.4.0',\n description: 'Kindflow — The opinionated agent platform',\n },\n subCommands: {\n start: startCommand,\n stop: stopCommand,\n status: statusCommand,\n create: createCommand,\n list: listCommand,\n },\n});\n\nrunMain(main);\n","/**\n * `kindflow start` — start the Kindflow daemon.\n *\n * By default, daemonizes (forks to background) and writes PID to ~/.kindflow/daemon.pid.\n * Use --foreground to run in the current terminal (useful for debugging).\n */\n\nimport { defineCommand } from 'citty';\nimport { spawn } from 'child_process';\nimport { readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync, openSync } from 'fs';\nimport { resolve, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport { homedir } from 'os';\n\n/**\n * Get the path to the PID file.\n *\n * @returns absolute path to ~/.kindflow/daemon.pid\n */\nconst pidFile = (): string => {\n const dataDir = process.env['KINDFLOW_DATA_DIR'] ?? resolve(homedir(), '.kindflow');\n return resolve(dataDir, 'daemon.pid');\n};\n\n/**\n * Get the path to the daemon log file.\n *\n * @returns absolute path to ~/.kindflow/daemon.log\n */\nconst logFile = (): string => {\n const dataDir = process.env['KINDFLOW_DATA_DIR'] ?? resolve(homedir(), '.kindflow');\n return resolve(dataDir, 'daemon.log');\n};\n\n/**\n * Check if a process with the given PID is running.\n *\n * @param pid - process ID to check\n * @returns true if the process exists\n */\nconst isRunning = (pid: number): boolean => {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * Read the PID from the PID file. Returns null if not found or stale.\n *\n * @returns the running daemon PID, or null\n */\nconst readPid = (): number | null => {\n const file = pidFile();\n if (!existsSync(file)) return null;\n const pid = parseInt(readFileSync(file, 'utf-8').trim(), 10);\n if (isNaN(pid) || !isRunning(pid)) {\n try { unlinkSync(file); } catch { /* ignore */ }\n return null;\n }\n return pid;\n};\n\n/**\n * Build the CLI args array for the daemon subprocess.\n * Passes the same flags the user provided to the foreground runner.\n */\nconst buildArgs = (args: Record<string, unknown>): string[] => {\n const result = ['start', '--foreground'];\n if (args['web']) result.push('--web');\n if (args['port']) result.push('--port', String(args['port']));\n if (args['webPort']) result.push('--web-port', String(args['webPort']));\n if (args['agentsDir']) result.push('--agents-dir', String(args['agentsDir']));\n return result;\n};\n\n/**\n * Run the daemon in the foreground (current process).\n * Called when --foreground is set, or by the daemonized child process.\n */\nconst runForeground = async (args: Record<string, unknown>): Promise<void> => {\n /* Dynamic imports to avoid loading heavy deps when just daemonizing. */\n const { startDaemon } = await import('@repo/daemon/daemon');\n const { detectMode, devPaths, cliPaths } = await import('@repo/daemon/paths');\n\n const isDev = detectMode() === 'dev';\n const base = isDev ? devPaths() : cliPaths();\n\n /* Compute webDir. */\n let webDir: string | null = null;\n if (args['web']) {\n if (base.webDir) {\n webDir = base.webDir;\n } else {\n const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../../../..');\n webDir = resolve(repoRoot, 'apps/web');\n }\n }\n\n const paths = {\n ...base,\n webDir,\n ...(args['agentsDir'] ? { agentsDir: resolve(String(args['agentsDir'])) } : {}),\n };\n\n mkdirSync(paths.agentsDir, { recursive: true });\n\n const port = args['port'] ? parseInt(String(args['port']), 10) : undefined;\n const webPort = args['webPort'] ? parseInt(String(args['webPort']), 10) : undefined;\n\n /* Write PID file so `kindflow stop` can find us. */\n const dataDir = process.env['KINDFLOW_DATA_DIR'] ?? resolve(homedir(), '.kindflow');\n mkdirSync(dataDir, { recursive: true });\n writeFileSync(resolve(dataDir, 'daemon.pid'), String(process.pid));\n\n try {\n const daemon = await startDaemon({ port, webPort, paths });\n\n const handleSignal = async (signal: string): Promise<void> => {\n console.log(`\\n[kindflow] Received ${signal}`);\n try { unlinkSync(resolve(dataDir, 'daemon.pid')); } catch { /* ignore */ }\n await daemon.shutdown();\n process.exit(0);\n };\n\n process.on('SIGINT', () => handleSignal('SIGINT'));\n process.on('SIGTERM', () => handleSignal('SIGTERM'));\n } catch (err) {\n try { unlinkSync(resolve(dataDir, 'daemon.pid')); } catch { /* ignore */ }\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`\\n Failed to start: ${msg}\\n`);\n process.exit(1);\n }\n};\n\n/** The `kindflow start` command definition. */\nexport const startCommand = defineCommand({\n meta: {\n name: 'start',\n description: 'Start the Kindflow daemon',\n },\n args: {\n web: {\n type: 'boolean',\n description: 'Also start the web UI',\n default: false,\n },\n port: {\n type: 'string',\n description: 'Override the API port (default: 7777)',\n },\n webPort: {\n type: 'string',\n description: 'Override the web UI port (default: 7001)',\n },\n agentsDir: {\n type: 'string',\n description: 'Override the agents directory',\n },\n foreground: {\n type: 'boolean',\n description: 'Run in the foreground (do not daemonize)',\n default: false,\n },\n },\n async run({ args }) {\n /* Foreground mode: run directly in this process. */\n if (args.foreground) {\n console.log('');\n console.log(' Kindflow — The opinionated agent platform');\n console.log('');\n await runForeground(args);\n return;\n }\n\n /* Check if already running. */\n const existingPid = readPid();\n if (existingPid) {\n console.log(` Kindflow is already running (PID ${existingPid})`);\n console.log(` Run \"kindflow stop\" first, or \"kindflow status\" for details.`);\n process.exit(1);\n }\n\n /* Daemonize: spawn a detached child running this same CLI with --foreground. */\n const dataDir = process.env['KINDFLOW_DATA_DIR'] ?? resolve(homedir(), '.kindflow');\n mkdirSync(dataDir, { recursive: true });\n const log = logFile();\n\n const out = openSync(log, 'a');\n const err = openSync(log, 'a');\n\n const kindflowBin = process.argv[1]!;\n const childArgs = buildArgs(args);\n\n /* In dev mode (running via tsx), we need to pass --import tsx to the child.\n In CLI mode (compiled .js), node runs it directly. */\n const isDev = kindflowBin.endsWith('.ts');\n const execArgs = isDev ? ['--import', 'tsx', kindflowBin, ...childArgs] : [kindflowBin, ...childArgs];\n\n const child = spawn(process.execPath, execArgs, {\n detached: true,\n stdio: ['ignore', out, err],\n env: { ...process.env },\n });\n\n child.unref();\n\n /* Wait briefly to see if the child crashes immediately. */\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n resolve();\n }, 2000);\n\n child.on('exit', (code) => {\n clearTimeout(timeout);\n if (code !== 0) {\n console.log('');\n console.log(` Failed to start. Check logs: ${log}`);\n console.log('');\n /* Print last few lines of the log. */\n try {\n const content = readFileSync(log, 'utf-8');\n const lines = content.trim().split('\\n').slice(-10);\n for (const line of lines) {\n console.log(` ${line}`);\n }\n } catch { /* ignore */ }\n process.exit(1);\n }\n resolve();\n });\n });\n\n /* Verify it started by checking PID file. */\n const pid = readPid();\n if (pid) {\n console.log('');\n console.log(' Kindflow — The opinionated agent platform');\n console.log('');\n console.log(` Daemon running (PID ${pid})`);\n console.log(` API: http://localhost:${args.port ?? '7777'}`);\n if (args.web) {\n console.log(` Web: http://localhost:${args.webPort ?? '7001'}`);\n }\n console.log(` Logs: ${log}`);\n console.log('');\n console.log(` Run \"kindflow stop\" to shut down.`);\n console.log('');\n } else {\n console.log('');\n console.log(` Failed to start. Check logs: ${log}`);\n console.log('');\n process.exit(1);\n }\n },\n});\n","/**\n * `kindflow stop` — stop the running Kindflow daemon.\n */\n\nimport { defineCommand } from 'citty';\nimport { readFileSync, existsSync, unlinkSync } from 'fs';\nimport { resolve } from 'path';\nimport { homedir } from 'os';\n\n/**\n * Check if a process with the given PID is running.\n *\n * @param pid - process ID to check\n * @returns true if the process exists\n */\nconst isRunning = (pid: number): boolean => {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n};\n\n/** The `kindflow stop` command definition. */\nexport const stopCommand = defineCommand({\n meta: {\n name: 'stop',\n description: 'Stop the Kindflow daemon',\n },\n run() {\n const dataDir = process.env['KINDFLOW_DATA_DIR'] ?? resolve(homedir(), '.kindflow');\n const pidPath = resolve(dataDir, 'daemon.pid');\n\n if (!existsSync(pidPath)) {\n console.log(' Kindflow is not running.');\n return;\n }\n\n const pid = parseInt(readFileSync(pidPath, 'utf-8').trim(), 10);\n\n if (isNaN(pid) || !isRunning(pid)) {\n console.log(' Kindflow is not running (stale PID file removed).');\n try { unlinkSync(pidPath); } catch { /* ignore */ }\n return;\n }\n\n /* Send SIGTERM for graceful shutdown. */\n process.kill(pid, 'SIGTERM');\n console.log(` Stopping Kindflow (PID ${pid})...`);\n\n /* Wait up to 10 seconds for the process to exit. */\n const start = Date.now();\n const maxWait = 10_000;\n const poll = setInterval(() => {\n if (!isRunning(pid)) {\n clearInterval(poll);\n try { unlinkSync(pidPath); } catch { /* ignore */ }\n console.log(' Stopped.');\n process.exit(0);\n }\n if (Date.now() - start > maxWait) {\n clearInterval(poll);\n console.log(` Process did not stop gracefully. Sending SIGKILL...`);\n try { process.kill(pid, 'SIGKILL'); } catch { /* ignore */ }\n try { unlinkSync(pidPath); } catch { /* ignore */ }\n console.log(' Killed.');\n process.exit(0);\n }\n }, 200);\n },\n});\n","/**\n * `kindflow status` — show the status of the Kindflow daemon.\n */\n\nimport { defineCommand } from 'citty';\nimport { readFileSync, existsSync } from 'fs';\nimport { resolve } from 'path';\nimport { homedir } from 'os';\n\n/**\n * Check if a process with the given PID is running.\n *\n * @param pid - process ID to check\n * @returns true if the process exists\n */\nconst isRunning = (pid: number): boolean => {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n};\n\n/** The `kindflow status` command definition. */\nexport const statusCommand = defineCommand({\n meta: {\n name: 'status',\n description: 'Show daemon status',\n },\n run() {\n const dataDir = process.env['KINDFLOW_DATA_DIR'] ?? resolve(homedir(), '.kindflow');\n const pidPath = resolve(dataDir, 'daemon.pid');\n const logPath = resolve(dataDir, 'daemon.log');\n\n if (!existsSync(pidPath)) {\n console.log(' Kindflow is not running.');\n return;\n }\n\n const pid = parseInt(readFileSync(pidPath, 'utf-8').trim(), 10);\n\n if (isNaN(pid) || !isRunning(pid)) {\n console.log(' Kindflow is not running (stale PID file).');\n return;\n }\n\n console.log('');\n console.log(' Kindflow is running');\n console.log('');\n console.log(` PID: ${pid}`);\n console.log(` Data: ${dataDir}`);\n console.log(` Agents: ${resolve(dataDir, 'agents')}`);\n console.log(` Logs: ${logPath}`);\n console.log('');\n },\n});\n","/**\n * `kindflow create <name>` — create a new agent from the template.\n */\n\nimport { defineCommand } from 'citty';\nimport { createAgentFromTemplate, generateSlug } from '@repo/daemon/agent-scanner';\nimport { resolvePaths } from '@repo/daemon/paths';\nimport { mkdirSync, existsSync } from 'fs';\nimport { resolve } from 'path';\n\n/** The `kindflow create` command definition. */\nexport const createCommand = defineCommand({\n meta: {\n name: 'create',\n description: 'Create a new agent',\n },\n args: {\n name: {\n type: 'positional',\n description: 'Name for the new agent',\n required: true,\n },\n },\n run({ args }) {\n const paths = resolvePaths();\n\n /* Ensure agents directory exists. */\n mkdirSync(paths.agentsDir, { recursive: true });\n\n /* Generate slug from name. */\n const slug = generateSlug(args.name);\n const agentDir = resolve(paths.agentsDir, slug);\n\n if (existsSync(agentDir)) {\n console.error(`Agent \"${slug}\" already exists at ${agentDir}`);\n process.exit(1);\n }\n\n const agent = createAgentFromTemplate(paths.agentsDir, paths.templateDir, slug, args.name);\n console.log(`Created agent \"${agent.config.name}\" at ${agent.dir}`);\n },\n});\n","/**\n * `kindflow list` — list all agents.\n */\n\nimport { defineCommand } from 'citty';\nimport { scanAgents } from '@repo/daemon/agent-scanner';\nimport { resolvePaths } from '@repo/daemon/paths';\n\n/** The `kindflow list` command definition. */\nexport const listCommand = defineCommand({\n meta: {\n name: 'list',\n description: 'List all agents',\n },\n run() {\n const paths = resolvePaths();\n const agents = scanAgents(paths.agentsDir);\n\n if (agents.length === 0) {\n console.log('No agents found.');\n console.log(`Create one with: kindflow create <name>`);\n return;\n }\n\n console.log(`Found ${agents.length} agent(s):\\n`);\n for (const agent of agents) {\n const autoStart = agent.config.autoStart ? 'auto-start' : 'manual';\n console.log(` ${agent.config.name} (${agent.id}) — ${autoStart}`);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;AAaA,SAAS,iBAAAA,gBAAe,eAAe;;;ACNvC,SAAS,qBAAqB;AAC9B,SAAS,aAAa;AACtB,SAAS,cAAc,eAAe,YAAY,WAAW,YAAY,gBAAgB;AACzF,SAAS,SAAS,eAAe;AACjC,SAAS,qBAAqB;AAC9B,SAAS,eAAe;AAOxB,IAAM,UAAU,MAAc;AAC5B,QAAM,UAAU,QAAQ,IAAI,mBAAmB,KAAK,QAAQ,QAAQ,GAAG,WAAW;AAClF,SAAO,QAAQ,SAAS,YAAY;AACtC;AAOA,IAAM,UAAU,MAAc;AAC5B,QAAM,UAAU,QAAQ,IAAI,mBAAmB,KAAK,QAAQ,QAAQ,GAAG,WAAW;AAClF,SAAO,QAAQ,SAAS,YAAY;AACtC;AAQA,IAAM,YAAY,CAAC,QAAyB;AAC1C,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOA,IAAM,UAAU,MAAqB;AACnC,QAAM,OAAO,QAAQ;AACrB,MAAI,CAAC,WAAW,IAAI,EAAG,QAAO;AAC9B,QAAM,MAAM,SAAS,aAAa,MAAM,OAAO,EAAE,KAAK,GAAG,EAAE;AAC3D,MAAI,MAAM,GAAG,KAAK,CAAC,UAAU,GAAG,GAAG;AACjC,QAAI;AAAE,iBAAW,IAAI;AAAA,IAAG,QAAQ;AAAA,IAAe;AAC/C,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAMA,IAAM,YAAY,CAAC,SAA4C;AAC7D,QAAM,SAAS,CAAC,SAAS,cAAc;AACvC,MAAI,KAAK,KAAK,EAAG,QAAO,KAAK,OAAO;AACpC,MAAI,KAAK,MAAM,EAAG,QAAO,KAAK,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC;AAC5D,MAAI,KAAK,SAAS,EAAG,QAAO,KAAK,cAAc,OAAO,KAAK,SAAS,CAAC,CAAC;AACtE,MAAI,KAAK,WAAW,EAAG,QAAO,KAAK,gBAAgB,OAAO,KAAK,WAAW,CAAC,CAAC;AAC5E,SAAO;AACT;AAMA,IAAM,gBAAgB,OAAO,SAAiD;AAE5E,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,aAAqB;AAC1D,QAAM,EAAE,YAAY,UAAU,SAAS,IAAI,MAAM,OAAO,qBAAoB;AAE5E,QAAM,QAAQ,WAAW,MAAM;AAC/B,QAAM,OAAO,QAAQ,SAAS,IAAI,SAAS;AAG3C,MAAI,SAAwB;AAC5B,MAAI,KAAK,KAAK,GAAG;AACf,QAAI,KAAK,QAAQ;AACf,eAAS,KAAK;AAAA,IAChB,OAAO;AACL,YAAM,WAAW,QAAQ,QAAQ,cAAc,YAAY,GAAG,CAAC,GAAG,aAAa;AAC/E,eAAS,QAAQ,UAAU,UAAU;AAAA,IACvC;AAAA,EACF;AAEA,QAAM,QAAQ;AAAA,IACZ,GAAG;AAAA,IACH;AAAA,IACA,GAAI,KAAK,WAAW,IAAI,EAAE,WAAW,QAAQ,OAAO,KAAK,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA,EAC/E;AAEA,YAAU,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAE9C,QAAM,OAAO,KAAK,MAAM,IAAI,SAAS,OAAO,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI;AACjE,QAAM,UAAU,KAAK,SAAS,IAAI,SAAS,OAAO,KAAK,SAAS,CAAC,GAAG,EAAE,IAAI;AAG1E,QAAM,UAAU,QAAQ,IAAI,mBAAmB,KAAK,QAAQ,QAAQ,GAAG,WAAW;AAClF,YAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACtC,gBAAc,QAAQ,SAAS,YAAY,GAAG,OAAO,QAAQ,GAAG,CAAC;AAEjE,MAAI;AACF,UAAM,SAAS,MAAM,YAAY,EAAE,MAAM,SAAS,MAAM,CAAC;AAEzD,UAAM,eAAe,OAAO,WAAkC;AAC5D,cAAQ,IAAI;AAAA,sBAAyB,MAAM,EAAE;AAC7C,UAAI;AAAE,mBAAW,QAAQ,SAAS,YAAY,CAAC;AAAA,MAAG,QAAQ;AAAA,MAAe;AACzE,YAAM,OAAO,SAAS;AACtB,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,GAAG,UAAU,MAAM,aAAa,QAAQ,CAAC;AACjD,YAAQ,GAAG,WAAW,MAAM,aAAa,SAAS,CAAC;AAAA,EACrD,SAAS,KAAK;AACZ,QAAI;AAAE,iBAAW,QAAQ,SAAS,YAAY,CAAC;AAAA,IAAG,QAAQ;AAAA,IAAe;AACzE,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,YAAQ,MAAM;AAAA,qBAAwB,GAAG;AAAA,CAAI;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAGO,IAAM,eAAe,cAAc;AAAA,EACxC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,KAAK;AAAA,MACH,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,YAAY;AAAA,MACV,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAElB,QAAI,KAAK,YAAY;AACnB,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,kDAA6C;AACzD,cAAQ,IAAI,EAAE;AACd,YAAM,cAAc,IAAI;AACxB;AAAA,IACF;AAGA,UAAM,cAAc,QAAQ;AAC5B,QAAI,aAAa;AACf,cAAQ,IAAI,sCAAsC,WAAW,GAAG;AAChE,cAAQ,IAAI,gEAAgE;AAC5E,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,UAAU,QAAQ,IAAI,mBAAmB,KAAK,QAAQ,QAAQ,GAAG,WAAW;AAClF,cAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACtC,UAAM,MAAM,QAAQ;AAEpB,UAAM,MAAM,SAAS,KAAK,GAAG;AAC7B,UAAM,MAAM,SAAS,KAAK,GAAG;AAE7B,UAAM,cAAc,QAAQ,KAAK,CAAC;AAClC,UAAM,YAAY,UAAU,IAAI;AAIhC,UAAM,QAAQ,YAAY,SAAS,KAAK;AACxC,UAAM,WAAW,QAAQ,CAAC,YAAY,OAAO,aAAa,GAAG,SAAS,IAAI,CAAC,aAAa,GAAG,SAAS;AAEpG,UAAM,QAAQ,MAAM,QAAQ,UAAU,UAAU;AAAA,MAC9C,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,KAAK,GAAG;AAAA,MAC1B,KAAK,EAAE,GAAG,QAAQ,IAAI;AAAA,IACxB,CAAC;AAED,UAAM,MAAM;AAGZ,UAAM,IAAI,QAAc,CAACC,aAAY;AACnC,YAAM,UAAU,WAAW,MAAM;AAC/B,QAAAA,SAAQ;AAAA,MACV,GAAG,GAAI;AAEP,YAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,qBAAa,OAAO;AACpB,YAAI,SAAS,GAAG;AACd,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,kCAAkC,GAAG,EAAE;AACnD,kBAAQ,IAAI,EAAE;AAEd,cAAI;AACF,kBAAM,UAAU,aAAa,KAAK,OAAO;AACzC,kBAAM,QAAQ,QAAQ,KAAK,EAAE,MAAM,IAAI,EAAE,MAAM,GAAG;AAClD,uBAAW,QAAQ,OAAO;AACxB,sBAAQ,IAAI,KAAK,IAAI,EAAE;AAAA,YACzB;AAAA,UACF,QAAQ;AAAA,UAAe;AACvB,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,QAAAA,SAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAGD,UAAM,MAAM,QAAQ;AACpB,QAAI,KAAK;AACP,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,kDAA6C;AACzD,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,yBAAyB,GAAG,GAAG;AAC3C,cAAQ,IAAI,4BAA4B,KAAK,QAAQ,MAAM,EAAE;AAC7D,UAAI,KAAK,KAAK;AACZ,gBAAQ,IAAI,4BAA4B,KAAK,WAAW,MAAM,EAAE;AAAA,MAClE;AACA,cAAQ,IAAI,WAAW,GAAG,EAAE;AAC5B,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,qCAAqC;AACjD,cAAQ,IAAI,EAAE;AAAA,IAChB,OAAO;AACL,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,kCAAkC,GAAG,EAAE;AACnD,cAAQ,IAAI,EAAE;AACd,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AC7PD,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,gBAAAC,eAAc,cAAAC,aAAY,cAAAC,mBAAkB;AACrD,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,gBAAe;AAQxB,IAAMC,aAAY,CAAC,QAAyB;AAC1C,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,IAAM,cAAcN,eAAc;AAAA,EACvC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AACJ,UAAM,UAAU,QAAQ,IAAI,mBAAmB,KAAKI,SAAQC,SAAQ,GAAG,WAAW;AAClF,UAAM,UAAUD,SAAQ,SAAS,YAAY;AAE7C,QAAI,CAACF,YAAW,OAAO,GAAG;AACxB,cAAQ,IAAI,4BAA4B;AACxC;AAAA,IACF;AAEA,UAAM,MAAM,SAASD,cAAa,SAAS,OAAO,EAAE,KAAK,GAAG,EAAE;AAE9D,QAAI,MAAM,GAAG,KAAK,CAACK,WAAU,GAAG,GAAG;AACjC,cAAQ,IAAI,qDAAqD;AACjE,UAAI;AAAE,QAAAH,YAAW,OAAO;AAAA,MAAG,QAAQ;AAAA,MAAe;AAClD;AAAA,IACF;AAGA,YAAQ,KAAK,KAAK,SAAS;AAC3B,YAAQ,IAAI,4BAA4B,GAAG,MAAM;AAGjD,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,UAAU;AAChB,UAAM,OAAO,YAAY,MAAM;AAC7B,UAAI,CAACG,WAAU,GAAG,GAAG;AACnB,sBAAc,IAAI;AAClB,YAAI;AAAE,UAAAH,YAAW,OAAO;AAAA,QAAG,QAAQ;AAAA,QAAe;AAClD,gBAAQ,IAAI,YAAY;AACxB,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,UAAI,KAAK,IAAI,IAAI,QAAQ,SAAS;AAChC,sBAAc,IAAI;AAClB,gBAAQ,IAAI,uDAAuD;AACnE,YAAI;AAAE,kBAAQ,KAAK,KAAK,SAAS;AAAA,QAAG,QAAQ;AAAA,QAAe;AAC3D,YAAI;AAAE,UAAAA,YAAW,OAAO;AAAA,QAAG,QAAQ;AAAA,QAAe;AAClD,gBAAQ,IAAI,WAAW;AACvB,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,GAAG,GAAG;AAAA,EACR;AACF,CAAC;;;ACnED,SAAS,iBAAAI,sBAAqB;AAC9B,SAAS,gBAAAC,eAAc,cAAAC,mBAAkB;AACzC,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,gBAAe;AAQxB,IAAMC,aAAY,CAAC,QAAyB;AAC1C,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,IAAM,gBAAgBL,eAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AACJ,UAAM,UAAU,QAAQ,IAAI,mBAAmB,KAAKG,SAAQC,SAAQ,GAAG,WAAW;AAClF,UAAM,UAAUD,SAAQ,SAAS,YAAY;AAC7C,UAAM,UAAUA,SAAQ,SAAS,YAAY;AAE7C,QAAI,CAACD,YAAW,OAAO,GAAG;AACxB,cAAQ,IAAI,4BAA4B;AACxC;AAAA,IACF;AAEA,UAAM,MAAM,SAASD,cAAa,SAAS,OAAO,EAAE,KAAK,GAAG,EAAE;AAE9D,QAAI,MAAM,GAAG,KAAK,CAACI,WAAU,GAAG,GAAG;AACjC,cAAQ,IAAI,6CAA6C;AACzD;AAAA,IACF;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,uBAAuB;AACnC,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,cAAc,GAAG,EAAE;AAC/B,YAAQ,IAAI,cAAc,OAAO,EAAE;AACnC,YAAQ,IAAI,cAAcF,SAAQ,SAAS,QAAQ,CAAC,EAAE;AACtD,YAAQ,IAAI,cAAc,OAAO,EAAE;AACnC,YAAQ,IAAI,EAAE;AAAA,EAChB;AACF,CAAC;;;ACpDD,SAAS,iBAAAG,sBAAqB;AAG9B,SAAS,aAAAC,YAAW,cAAAC,mBAAkB;AACtC,SAAS,WAAAC,gBAAe;AAGjB,IAAM,gBAAgBC,eAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,IAAI,EAAE,KAAK,GAAG;AACZ,UAAM,QAAQ,aAAa;AAG3B,IAAAH,WAAU,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAG9C,UAAM,OAAO,aAAa,KAAK,IAAI;AACnC,UAAM,WAAWE,SAAQ,MAAM,WAAW,IAAI;AAE9C,QAAID,YAAW,QAAQ,GAAG;AACxB,cAAQ,MAAM,UAAU,IAAI,uBAAuB,QAAQ,EAAE;AAC7D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,QAAQ,wBAAwB,MAAM,WAAW,MAAM,aAAa,MAAM,KAAK,IAAI;AACzF,YAAQ,IAAI,kBAAkB,MAAM,OAAO,IAAI,QAAQ,MAAM,GAAG,EAAE;AAAA,EACpE;AACF,CAAC;;;ACrCD,SAAS,iBAAAG,sBAAqB;AAKvB,IAAM,cAAcC,eAAc;AAAA,EACvC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AACJ,UAAM,QAAQ,aAAa;AAC3B,UAAM,SAAS,WAAW,MAAM,SAAS;AAEzC,QAAI,OAAO,WAAW,GAAG;AACvB,cAAQ,IAAI,kBAAkB;AAC9B,cAAQ,IAAI,yCAAyC;AACrD;AAAA,IACF;AAEA,YAAQ,IAAI,SAAS,OAAO,MAAM;AAAA,CAAc;AAChD,eAAW,SAAS,QAAQ;AAC1B,YAAM,YAAY,MAAM,OAAO,YAAY,eAAe;AAC1D,cAAQ,IAAI,KAAK,MAAM,OAAO,IAAI,KAAK,MAAM,EAAE,YAAO,SAAS,EAAE;AAAA,IACnE;AAAA,EACF;AACF,CAAC;;;ALTD,IAAM,OAAOC,eAAc;AAAA,EACzB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,aAAa;AAAA,IACX,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,EACR;AACF,CAAC;AAED,QAAQ,IAAI;","names":["defineCommand","resolve","defineCommand","readFileSync","existsSync","unlinkSync","resolve","homedir","isRunning","defineCommand","readFileSync","existsSync","resolve","homedir","isRunning","defineCommand","mkdirSync","existsSync","resolve","defineCommand","defineCommand","defineCommand","defineCommand"]}