@dmrlzz/davecode 0.3.0 → 0.5.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.
Files changed (120) hide show
  1. package/README.md +5 -4
  2. package/bin/davecode.js +0 -0
  3. package/dist/{ChatApp-FO5SABXB.js → ChatApp-CJBICQGA.js} +289 -137
  4. package/dist/ChatApp-CJBICQGA.js.map +1 -0
  5. package/dist/{RunnerView-DLVR7C22.js → RunnerView-A7JSPUW5.js} +5 -5
  6. package/dist/account-QWDPJWAA.js +23 -0
  7. package/dist/accounts-IQMR72FC.js +37 -0
  8. package/dist/{budget-RBHCEDPP.js → budget-XANOUVWO.js} +6 -6
  9. package/dist/chat-KDDRNC5V.js +359 -0
  10. package/dist/chat-KDDRNC5V.js.map +1 -0
  11. package/dist/{accounts-MTMGYKEP.js → chunk-44AFJL2X.js} +24 -17
  12. package/dist/chunk-44AFJL2X.js.map +1 -0
  13. package/dist/{chunk-BOLFK3BH.js → chunk-5LKOJBUL.js} +2 -2
  14. package/dist/{chunk-23KTE7IK.js → chunk-AZKACMME.js} +2 -2
  15. package/dist/{chunk-PIIJ3RSI.js → chunk-FYPMA55O.js} +1269 -1265
  16. package/dist/chunk-FYPMA55O.js.map +1 -0
  17. package/dist/{chunk-OYEYNDOO.js → chunk-GE22VBCY.js} +3 -3
  18. package/dist/{chunk-C7FDRA3U.js → chunk-HSBJDV3O.js} +660 -139
  19. package/dist/chunk-HSBJDV3O.js.map +1 -0
  20. package/dist/chunk-JLATEHS7.js +20 -0
  21. package/dist/chunk-JLATEHS7.js.map +1 -0
  22. package/dist/{chunk-VVCXGQMY.js → chunk-MC7RIPL7.js} +17 -8
  23. package/dist/chunk-MC7RIPL7.js.map +1 -0
  24. package/dist/{chunk-MSLLH5XP.js → chunk-PGAJIGUF.js} +4 -4
  25. package/dist/{chunk-OXRMGR72.js → chunk-PGPXE6LF.js} +2 -2
  26. package/dist/chunk-QA3O6RA2.js +81 -0
  27. package/dist/chunk-QA3O6RA2.js.map +1 -0
  28. package/dist/chunk-W7GPBEBZ.js +144 -0
  29. package/dist/chunk-W7GPBEBZ.js.map +1 -0
  30. package/dist/{chunk-IVZHKUCD.js → chunk-WQ7MEWDF.js} +3 -3
  31. package/dist/{config-FRMY5OHG.js → config-YTUPIYZT.js} +5 -5
  32. package/dist/dashboard/assets/Accounts-cq8RLMoI.js +1 -0
  33. package/dist/dashboard/assets/Badge-Z4RBdO9j.js +55 -0
  34. package/dist/dashboard/assets/Callout-w8BTYh4k.js +1 -0
  35. package/dist/dashboard/assets/Field-Cmpgg_1z.js +1 -0
  36. package/dist/dashboard/assets/Goals-Bw02to72.js +1 -0
  37. package/dist/dashboard/assets/Library-DK7mlpRb.js +1 -0
  38. package/dist/dashboard/assets/{Markdown-ClRsddnB.js → Markdown-DCZ4Awcc.js} +8 -8
  39. package/dist/dashboard/assets/Panes-_KTf8pbZ.js +8 -0
  40. package/dist/dashboard/assets/Panes-kHJ-D0s7.css +1 -0
  41. package/dist/dashboard/assets/RoutesPage-QV0oPRW9.js +4 -0
  42. package/dist/dashboard/assets/Runner-CkHBLQl0.js +1 -0
  43. package/dist/dashboard/assets/Settings-BLz2gTBR.js +1 -0
  44. package/dist/dashboard/assets/Switch-DPYlLseH.js +1 -0
  45. package/dist/dashboard/assets/Tasks-BiUQSTpt.js +2 -0
  46. package/dist/dashboard/assets/Traffic-BVfBuC70.js +1 -0
  47. package/dist/dashboard/assets/Workspace-CJTgiiU5.js +1 -0
  48. package/dist/dashboard/assets/arrow-up-DjhzZprp.js +1 -0
  49. package/dist/dashboard/assets/cn-BwE4cei0.js +1 -0
  50. package/dist/dashboard/assets/forms-DVIUAxAc.js +1 -0
  51. package/dist/dashboard/assets/index-BDBa5cb0.js +104 -0
  52. package/dist/dashboard/assets/index-BEmBgsbP.css +2 -0
  53. package/dist/dashboard/assets/task-errors-Daqwi0ue.js +1 -0
  54. package/dist/dashboard/assets/trash-BTuDcSaQ.js +1 -0
  55. package/dist/dashboard/favicon.svg +1 -7
  56. package/dist/dashboard/index.html +4 -4
  57. package/dist/{dist-ZPXEVBEC.js → dist-37VQSHHA.js} +24 -2
  58. package/dist/dist-37VQSHHA.js.map +1 -0
  59. package/dist/{doctor-7RUD4D3A.js → doctor-PYUQRRCB.js} +5 -5
  60. package/dist/{goal-JFRNPBSD.js → goal-SXZUDUCL.js} +5 -5
  61. package/dist/index.js +48 -30
  62. package/dist/index.js.map +1 -1
  63. package/dist/{init-NFYNO3A3.js → init-Z2AFQEEP.js} +6 -6
  64. package/dist/{prompts-L37J72YW.js → prompts-TZ7UC42M.js} +9 -5
  65. package/dist/prompts-TZ7UC42M.js.map +1 -0
  66. package/dist/{run-ARUPXFFB.js → run-AOS7L3RT.js} +10 -10
  67. package/dist/runtime.js +18 -0
  68. package/dist/runtime.js.map +1 -0
  69. package/dist/{start-CFPOVIAR.js → start-CEPXKZUE.js} +5 -5
  70. package/dist/{status-E4EACVE2.js → status-WNJ3GGKU.js} +6 -6
  71. package/dist/status-WNJ3GGKU.js.map +1 -0
  72. package/dist/{tasks-ZIK6BVEX.js → tasks-TFUTUMWB.js} +6 -6
  73. package/package.json +21 -15
  74. package/dist/ChatApp-FO5SABXB.js.map +0 -1
  75. package/dist/accounts-MTMGYKEP.js.map +0 -1
  76. package/dist/chat-ZDXX3N6X.js +0 -95
  77. package/dist/chat-ZDXX3N6X.js.map +0 -1
  78. package/dist/chunk-C7FDRA3U.js.map +0 -1
  79. package/dist/chunk-DYQ56FBT.js +0 -47
  80. package/dist/chunk-DYQ56FBT.js.map +0 -1
  81. package/dist/chunk-PIIJ3RSI.js.map +0 -1
  82. package/dist/chunk-VVCXGQMY.js.map +0 -1
  83. package/dist/dashboard/assets/Accounts-BR3ZfVk4.js +0 -1
  84. package/dist/dashboard/assets/Badge-B-qzNRrZ.js +0 -55
  85. package/dist/dashboard/assets/Callout-B9g_wPDi.js +0 -1
  86. package/dist/dashboard/assets/Field-BfabPEcY.js +0 -1
  87. package/dist/dashboard/assets/Goals-BsV-6m94.js +0 -1
  88. package/dist/dashboard/assets/Library-CEA9P1m-.js +0 -1
  89. package/dist/dashboard/assets/Panel-B9tSgX6l.js +0 -1
  90. package/dist/dashboard/assets/RoutesPage-Dh-BJ3ir.js +0 -4
  91. package/dist/dashboard/assets/Runner-C_e9l5l2.js +0 -1
  92. package/dist/dashboard/assets/Settings-C6Yc1Gjg.js +0 -1
  93. package/dist/dashboard/assets/Switch-CUpOJjUT.js +0 -1
  94. package/dist/dashboard/assets/Tasks-CTku0rR3.js +0 -2
  95. package/dist/dashboard/assets/Traffic-CE6wZSMr.js +0 -1
  96. package/dist/dashboard/assets/Workspace-CxFxvkA6.js +0 -1
  97. package/dist/dashboard/assets/arrow-up-DL3CuFOO.js +0 -1
  98. package/dist/dashboard/assets/forms-D6UIYgC5.js +0 -1
  99. package/dist/dashboard/assets/index-1iH716Xy.css +0 -2
  100. package/dist/dashboard/assets/index-BMWr9EKo.js +0 -104
  101. package/dist/dashboard/assets/task-errors-CE4oEr8H.js +0 -1
  102. package/dist/dashboard/assets/trash-CWqeZ7eg.js +0 -1
  103. package/dist/prompts-L37J72YW.js.map +0 -1
  104. /package/dist/{RunnerView-DLVR7C22.js.map → RunnerView-A7JSPUW5.js.map} +0 -0
  105. /package/dist/{dist-ZPXEVBEC.js.map → account-QWDPJWAA.js.map} +0 -0
  106. /package/dist/{status-E4EACVE2.js.map → accounts-IQMR72FC.js.map} +0 -0
  107. /package/dist/{budget-RBHCEDPP.js.map → budget-XANOUVWO.js.map} +0 -0
  108. /package/dist/{chunk-BOLFK3BH.js.map → chunk-5LKOJBUL.js.map} +0 -0
  109. /package/dist/{chunk-23KTE7IK.js.map → chunk-AZKACMME.js.map} +0 -0
  110. /package/dist/{chunk-OYEYNDOO.js.map → chunk-GE22VBCY.js.map} +0 -0
  111. /package/dist/{chunk-MSLLH5XP.js.map → chunk-PGAJIGUF.js.map} +0 -0
  112. /package/dist/{chunk-OXRMGR72.js.map → chunk-PGPXE6LF.js.map} +0 -0
  113. /package/dist/{chunk-IVZHKUCD.js.map → chunk-WQ7MEWDF.js.map} +0 -0
  114. /package/dist/{config-FRMY5OHG.js.map → config-YTUPIYZT.js.map} +0 -0
  115. /package/dist/{doctor-7RUD4D3A.js.map → doctor-PYUQRRCB.js.map} +0 -0
  116. /package/dist/{goal-JFRNPBSD.js.map → goal-SXZUDUCL.js.map} +0 -0
  117. /package/dist/{init-NFYNO3A3.js.map → init-Z2AFQEEP.js.map} +0 -0
  118. /package/dist/{run-ARUPXFFB.js.map → run-AOS7L3RT.js.map} +0 -0
  119. /package/dist/{start-CFPOVIAR.js.map → start-CEPXKZUE.js.map} +0 -0
  120. /package/dist/{tasks-ZIK6BVEX.js.map → tasks-TFUTUMWB.js.map} +0 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/program.ts","../src/index.ts"],"sourcesContent":["import { Command, CommanderError, InvalidArgumentError, Option } from 'commander';\nimport { type CliContext, type CliIO, createContext, type GlobalOptions } from './context';\nimport { CliError, EXIT } from './errors';\n\n/**\n * Command tree. Keep this module light: it only declares commands and options. Every action\n * lazy-loads its implementation, so `davecode --help` never pays for SQLite, Fastify or Ink.\n */\n\nexport interface RunOptions {\n io: CliIO;\n env: NodeJS.ProcessEnv;\n cwd: string;\n}\n\n/** Result of an action: an exit code, or nothing for success. */\nexport type ActionResult = number | undefined;\n\ninterface ProgramState {\n ctx?: CliContext;\n exitCode: number;\n}\n\nexport function buildProgram(options: RunOptions, state: ProgramState = { exitCode: 0 }): Command {\n const { io } = options;\n const program = new Command('davecode');\n\n const context = (): CliContext => {\n if (!state.ctx) throw new Error('CLI context is not initialised');\n return state.ctx;\n };\n\n /** Wrap a lazily loaded action: `(ctx, ...args) => exit code`. */\n const run =\n <A extends unknown[]>(action: (ctx: CliContext, ...args: A) => Promise<ActionResult>) =>\n async (...args: A) => {\n const code = await action(context(), ...args);\n if (typeof code === 'number') state.exitCode = code;\n };\n\n program\n .description('Local-first AI gateway and autonomous coding engine.')\n .usage('[command] [options]')\n .option('--home <dir>', 'DaveCode home directory (sets DAVECODE_HOME)')\n .option('--json', 'machine-readable JSON output where supported')\n .option('--no-color', 'disable colours (NO_COLOR is honoured too)')\n .option('-V, --version', 'print the version and exit')\n .showSuggestionAfterError(true)\n .configureOutput({\n writeOut: (text) => io.stdout.write(text),\n writeErr: (text) => io.stderr.write(text),\n outputError: (text, write) => write(text),\n })\n .exitOverride()\n .hook('preAction', (_root, action) => {\n state.ctx = createContext(action.optsWithGlobals<GlobalOptions>(), io, options);\n })\n .addHelpText(\n 'after',\n `\nRun \\`davecode\\` with no command in a terminal to open the chat TUI.\nDocs: https://github.com/DMRLZZ/DaveCode#readme`,\n );\n\n program.action(\n run(async (ctx) => {\n const globals = program.opts<GlobalOptions & { version?: boolean }>();\n if (globals.version) {\n const { VERSION } = await import('@davecode/core');\n ctx.out(`davecode ${VERSION}`);\n return EXIT.ok;\n }\n if (ctx.interactive) {\n const { chatCommand } = await import('./commands/chat');\n return chatCommand(ctx, {});\n }\n program.outputHelp();\n return EXIT.ok;\n }),\n );\n\n registerCommands(program, run);\n return program;\n}\n\ntype Runner = <A extends unknown[]>(\n action: (ctx: CliContext, ...args: A) => Promise<ActionResult>,\n) => (...args: A) => Promise<void>;\n\n/** Parse a TCP port (0 = pick a free one). */\nexport function parsePort(value: string): number {\n const n = Number(value);\n if (!/^\\d+$/.test(value.trim()) || !Number.isInteger(n) || n < 0 || n > 65535) {\n throw new InvalidArgumentError('expected a port number between 0 and 65535');\n }\n return n;\n}\n\n/** Parse a non-negative integer (priorities, weights, limits). */\nexport function parseInteger(value: string): number {\n const n = Number(value);\n if (!/^-?\\d+$/.test(value.trim()) || !Number.isSafeInteger(n) || n < 0) {\n throw new InvalidArgumentError('expected a non-negative integer');\n }\n return n;\n}\n\n/** Repeatable option collector (`--model a --model b`, also accepts `a,b`). */\nexport function collect(value: string, previous: string[] = []): string[] {\n return [\n ...previous,\n ...value\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean),\n ];\n}\n\n/** Subcommands. Each action dynamically imports its module. */\nfunction registerCommands(program: Command, run: Runner): void {\n program\n .command('app')\n .description('start your local workspace in a Chrome or Edge app window')\n .addOption(new Option('-p, --port <port>', 'port to listen on').argParser(parsePort))\n .option('--project <dir>', 'repository to open')\n .action(\n run(async (ctx, opts: import('./commands/start').StartOptions) => {\n const { startCommand } = await import('./commands/start');\n return startCommand(ctx, { ...opts, host: '127.0.0.1', app: true });\n }),\n );\n program\n .command('start')\n .description('start the gateway (OpenAI-compatible /v1, dashboard API and web dashboard)')\n .addOption(new Option('-p, --port <port>', 'port to listen on').argParser(parsePort))\n .option('--host <host>', 'interface to bind (default 127.0.0.1)')\n .option('--no-dashboard', 'do not serve the web dashboard')\n .option('--project <dir>', 'repository whose project brain to serve (default: detected)')\n .option('--verbose', 'print gateway request logs')\n .option('-q, --quiet', 'do not print the live activity log')\n .action(\n run(async (ctx, opts: import('./commands/start').StartOptions) => {\n const { startCommand } = await import('./commands/start');\n return startCommand(ctx, opts);\n }),\n );\n\n program\n .command('status')\n .description('gateway health, accounts and 1m/5h/24h quota usage')\n .action(\n run(async (ctx) => {\n const { statusCommand } = await import('./commands/status');\n return statusCommand(ctx);\n }),\n );\n\n program\n .command('chat')\n .description('chat TUI (also what bare `davecode` opens in a terminal)')\n .option('-m, --model <id>', 'model or route, e.g. davecode/auto or anthropic/claude-sonnet-5-5')\n .option('--project <dir>', 'repository whose brain an in-process gateway serves')\n .action(\n run(async (ctx, opts: { model?: string; project?: string }) => {\n const { chatCommand } = await import('./commands/chat');\n return chatCommand(ctx, opts);\n }),\n );\n\n registerAccounts(program, run);\n registerProject(program, run);\n\n program\n .command('budget')\n .description('plans, renewals and remaining quota per account (what agents are told)')\n .option('--context', 'print only the summary injected into agent prompts')\n .option('--local', 'read the local database even if a gateway is running')\n .action(\n run(async (ctx, opts: import('./commands/budget').BudgetFlags) => {\n const { budgetCommand } = await import('./commands/budget');\n return budgetCommand(ctx, opts);\n }),\n );\n\n program\n .command('doctor')\n .description('check the environment and print fixes')\n .action(\n run(async (ctx) => {\n const { doctorCommand } = await import('./commands/doctor');\n return doctorCommand(ctx);\n }),\n );\n\n program\n .command('run')\n .description('run the autonomous engine on the task graph (live view in a terminal)')\n .option('--once', 'implement at most one ready task, print the result and exit')\n .option(\n '--task <id>',\n \"run this task instead of the runner's pick (it must be PENDING and unblocked)\",\n )\n .option('--project <dir>', 'repository to work on (default: detected)')\n .addHelpText(\n 'after',\n `\nExit codes with --once: 0 success or nothing to do, 1 failed or error, 130 stopped.\nCtrl+C stops safely: partial work stays on the task branch and the task goes back to PENDING.`,\n )\n .action(\n run(async (ctx, opts: import('./commands/run').RunOptions) => {\n const { runCommand } = await import('./commands/run');\n return runCommand(ctx, opts);\n }),\n );\n\n registerGoals(program, run);\n}\n\nfunction registerGoals(program: Command, run: Runner): void {\n const limit = (flag: string, description: string) =>\n new Option(flag, description).argParser((value) => {\n const n = parseInteger(value);\n if (n < 1) throw new InvalidArgumentError('expected a positive integer');\n return n;\n });\n\n program\n .command('goal <objective...>')\n .description('pursue an objective with a team of agents (plan, execute, review, re-plan)')\n .addOption(\n limit('--max-rounds <n>', 'plan → execute → review rounds (capped by goal.maxRounds)'),\n )\n .addOption(limit('--max-tasks <n>', 'tasks across all rounds (capped by goal.maxTasks)'))\n .addOption(\n limit('--max-tokens <n>', 'token budget for the whole goal (capped by goal.maxTokens)'),\n )\n .option('--dry-run', 'plan only: print the task graph without executing it')\n .option('--project <dir>', 'repository to work in (default: detected)')\n .addHelpText(\n 'after',\n `\nAgents never send emails, post, pay or sign up for anything: such steps become drafts in\n.davecode/goals/<goal-id>/. Code tasks go through the autonomous runner (branch, checks, merge).\nCtrl+C cancels. Exit codes: 0 succeeded or planned, 1 failed or out of budget, 130 cancelled.\n\nExamples:\n davecode goal \"Write positioning and landing copy for this app\" --dry-run\n davecode goal \"Add a /health endpoint with tests\" --max-rounds 2`,\n )\n .action(\n run(async (ctx, words: string[], opts: import('./commands/goal').GoalOptions) => {\n const { goalCommand } = await import('./commands/goal');\n return goalCommand(ctx, words, opts);\n }),\n );\n\n const goals = program.command('goals').description('goals of this repository');\n goals\n .command('list', { isDefault: true })\n .alias('ls')\n .description('goals, newest first')\n .option('--project <dir>', 'repository (default: detected)')\n .action(\n run(async (ctx, opts: { project?: string }) => {\n const { goalsList } = await import('./commands/goal');\n return goalsList(ctx, opts);\n }),\n );\n goals\n .command('show <id>')\n .description('tasks, artifacts and summary of a goal')\n .option('--project <dir>', 'repository (default: detected)')\n .action(\n run(async (ctx, id: string, opts: { project?: string }) => {\n const { goalsShow } = await import('./commands/goal');\n return goalsShow(ctx, id, opts);\n }),\n );\n goals\n .command('cancel <id>')\n .description('cancel a running goal')\n .option('--project <dir>', 'repository (default: detected)')\n .action(\n run(async (ctx, id: string, opts: { project?: string }) => {\n const { goalsCancel } = await import('./commands/goal');\n return goalsCancel(ctx, id, opts);\n }),\n );\n}\n\nfunction registerProject(program: Command, run: Runner): void {\n program\n .command('init')\n .description('scaffold the project brain (.davecode/) in this repository')\n .option('--name <name>', 'project name used in STATE.md and ARCHITECTURE.md')\n .option('--config', 'write a starter .davecode/config.json without asking')\n .option('--no-config', 'do not write .davecode/config.json')\n .action(\n run(async (ctx, opts: { name?: string; config?: boolean }) => {\n const { initCommand } = await import('./commands/init');\n return initCommand(ctx, opts);\n }),\n );\n\n const tasks = program.command('tasks').description('show and edit the task graph');\n tasks\n .command('list', { isDefault: true })\n .alias('ls')\n .description('task tree with status and blocked reasons')\n .action(\n run(async (ctx) => {\n const { tasksList } = await import('./commands/tasks');\n return tasksList(ctx);\n }),\n );\n tasks\n .command('next')\n .description('the task the runner would pick next')\n .action(\n run(async (ctx) => {\n const { tasksNext } = await import('./commands/tasks');\n return tasksNext(ctx);\n }),\n );\n tasks\n .command('add <id> <title...>')\n .description('add a PENDING task')\n .option('-d, --depends <ids>', 'dependencies (repeatable or comma-separated)', collect)\n .addOption(new Option('-p, --priority <n>', 'higher runs first').argParser(parseInteger))\n .option('--description <text>', 'longer description')\n .option(\n '-a, --acceptance <criterion>',\n 'acceptance criterion (repeatable)',\n (v, prev: string[] = []) => [...prev, v],\n )\n .action(\n run(\n async (\n ctx,\n id: string,\n title: string[],\n opts: import('./commands/tasks').AddTaskOptions,\n ) => {\n const { tasksAdd } = await import('./commands/tasks');\n return tasksAdd(ctx, id, title, opts);\n },\n ),\n );\n tasks\n .command('status <id> <status>')\n .description('move a task to PENDING | IN_PROGRESS | SUCCESS | FAILED')\n .option('--notes <text>', 'note stored on the task')\n .action(\n run(async (ctx, id: string, status: string, opts: { notes?: string }) => {\n const { tasksStatus } = await import('./commands/tasks');\n return tasksStatus(ctx, id, status, opts);\n }),\n );\n\n const config = program.command('config').description('show the resolved configuration');\n config\n .command('show', { isDefault: true })\n .description('resolved config as JSON (secrets redacted)')\n .action(\n run(async (ctx) => {\n const { configShow } = await import('./commands/config');\n return configShow(ctx);\n }),\n );\n config\n .command('path')\n .description('where config, state and brains live')\n .action(\n run(async (ctx) => {\n const { configPath } = await import('./commands/config');\n return configPath(ctx);\n }),\n );\n config\n .command('get <key>')\n .description('one value by dotted key, e.g. server.port')\n .action(\n run(async (ctx, key: string) => {\n const { configGet } = await import('./commands/config');\n return configGet(ctx, key);\n }),\n );\n}\n\ntype AddOpts = import('./commands/accounts').AddCommandFlags;\n\nfunction addAccountOptions(command: Command, run: Runner): Command {\n return command\n .option(\n '--provider <kind>',\n 'anthropic | openai | gemini | openai-compatible | claude-cli | codex-cli | gemini-cli | gemini-web',\n )\n .option('--label <name>', 'human-friendly name')\n .addOption(\n new Option('--priority <n>', 'lower is tried first (default 100)').argParser(parseInteger),\n )\n .addOption(\n new Option('--weight <n>', 'traffic share among equal priorities').argParser(parseInteger),\n )\n .option('--secret-env <var>', 'read the API key from this environment variable')\n .option('--secret-stdin', 'read the API key from stdin')\n .option('--secret <value>', 'API key (discouraged: visible in shell history)')\n .option('--base-url <url>', 'endpoint for openai-compatible accounts')\n .option('--model <id>', 'advertised model (repeatable or comma-separated)', collect)\n .option('--default-model <id>', 'model used for davecode/auto without a route')\n .option('--binary-path <path>', 'CLI binary for claude-cli / codex-cli / gemini-cli')\n .option('--limit <key=value>', 'quota limit, e.g. tokens5h=500000 (repeatable)', collect)\n .option('--disabled', 'add the account disabled')\n .option('-y, --yes', 'never prompt: take everything from flags')\n .option('--no-login', 'do not offer to log in after adding a CLI account')\n .option('--local', 'write to the local database even if a gateway is running')\n .addHelpText(\n 'after',\n `\nExamples:\n davecode accounts add # interactive\n davecode accounts add --provider anthropic --label work --secret-env ANTHROPIC_API_KEY --yes\n echo \"$OPENROUTER_KEY\" | davecode accounts add --provider openai-compatible \\\\\n --base-url https://openrouter.ai/api/v1 --model openai/gpt-5.5 --secret-stdin\n davecode accounts add --provider claude-cli --label \"Claude Pro\" --yes`,\n )\n .action(\n run(async (ctx, opts: AddOpts) => {\n const { accountsAdd } = await import('./commands/accounts');\n return accountsAdd(ctx, opts);\n }),\n );\n}\n\nfunction registerAccounts(program: Command, run: Runner): void {\n const accounts = program.command('accounts').description('manage provider accounts');\n\n accounts\n .command('list', { isDefault: true })\n .alias('ls')\n .description('list accounts')\n .option('--local', 'read the local database even if a gateway is running')\n .action(\n run(async (ctx, opts: { local?: boolean }) => {\n const { accountsList } = await import('./commands/accounts');\n return accountsList(ctx, opts);\n }),\n );\n\n addAccountOptions(\n accounts.command('add').description('add an account (interactive in a terminal)'),\n run,\n );\n\n accounts\n .command('remove <id>')\n .alias('rm')\n .description('remove an account, its secret and its sandbox')\n .option('-y, --yes', 'do not ask for confirmation')\n .option('--local', 'write to the local database even if a gateway is running')\n .action(\n run(async (ctx, id: string, opts: { yes?: boolean; local?: boolean }) => {\n const { accountsRemove } = await import('./commands/accounts');\n return accountsRemove(ctx, id, opts);\n }),\n );\n\n for (const [name, enabled] of [\n ['enable', true],\n ['disable', false],\n ] as const) {\n accounts\n .command(`${name} <id>`)\n .description(`${name} an account${enabled ? ' (also clears error and cooldown state)' : ''}`)\n .option('--local', 'write to the local database even if a gateway is running')\n .action(\n run(async (ctx, id: string, opts: { local?: boolean }) => {\n const { accountsSetEnabled } = await import('./commands/accounts');\n return accountsSetEnabled(ctx, id, enabled, opts);\n }),\n );\n }\n\n accounts\n .command('plan <id>')\n .description('show or set what you pay for an account (plan, price, paid/renewal dates)')\n .option('--plan <name>', 'plan name, e.g. \"Claude Pro\" or \"API pay-as-you-go\"')\n .option('--price <amount>', 'price per period, e.g. 20')\n .option('--currency <code>', '3-letter currency code (default USD)')\n .option('--period <period>', 'month | year (default month)')\n .option('--paid <date>', 'last payment date (YYYY-MM-DD)')\n .option('--renews <date>', 'next renewal date (YYYY-MM-DD)')\n .option('--notes <text>', 'free-form note')\n .option('--clear', 'remove the recorded plan')\n .option('--local', 'write to the local database even if a gateway is running')\n .addHelpText(\n 'after',\n `\nEntered by hand: DaveCode never reads billing pages. Example:\n davecode accounts plan acc_123 --plan \"Claude Pro\" --price 20 --renews 2026-11-01`,\n )\n .action(\n run(async (ctx, id: string, opts: import('./commands/accounts').PlanFlags) => {\n const { accountsPlan } = await import('./commands/accounts');\n return accountsPlan(ctx, id, opts);\n }),\n );\n\n accounts\n .command('login <id> [args...]')\n .description(\n 'log a claude-cli / codex-cli / gemini-cli account in, inside its own isolated config dir',\n )\n .allowUnknownOption()\n .option('--local', 'read the local database even if a gateway is running')\n .option('--hold', 'wait for Enter before exiting (for windows opened by the dashboard)')\n .addHelpText(\n 'after',\n `\nRuns the vendor's official sign-in (claude auth login, codex login, Gemini CLI's\n\"Login with Google\") with CLAUDE_CONFIG_DIR / CODEX_HOME / GEMINI_CLI_HOME pointing at the\naccount's sandbox, so every account keeps a separate login. DaveCode never sees the password.\nExtra arguments after -- replace the default ones (e.g. -- login --device-auth for Codex).`,\n )\n .action(\n run(\n async (ctx, id: string, args: string[], opts: import('./commands/accounts').LoginFlags) => {\n const { accountsLogin } = await import('./commands/accounts');\n return accountsLogin(ctx, id, args, opts);\n },\n ),\n );\n\n accounts\n .command('connect <id>')\n .description('connect a subscription: check its login and run the official sign-in if needed')\n .option('--check', 'only report whether the account is connected')\n .option('--local', 'read the local database even if a gateway is running')\n .addHelpText(\n 'after',\n `\nAPI-key accounts are connected when a key is stored. CLI accounts (claude-cli, codex-cli,\ngemini-cli) ask the vendor CLI for its login status inside the account sandbox and, when not\nconnected, start the vendor's own sign-in. Example:\n davecode accounts connect acc_123 --check`,\n )\n .action(\n run(async (ctx, id: string, opts: import('./commands/accounts').ConnectFlags) => {\n const { accountsConnect } = await import('./commands/accounts');\n return accountsConnect(ctx, id, opts);\n }),\n );\n\n addAccountOptions(program.command('add-account').description('alias of `accounts add`'), run);\n}\n\n/** Render an error for humans: `error: …` plus an optional hint, without a stack trace. */\nexport function describeError(err: unknown): { message: string; hint?: string; exitCode: number } {\n if (err instanceof CliError) {\n return {\n message: err.message,\n exitCode: err.exitCode,\n ...(err.hint ? { hint: err.hint } : {}),\n };\n }\n if (err instanceof Error) {\n if (err.name === 'ConfigError') {\n return {\n message: err.message,\n hint: 'Fix the file above or run `davecode config path` to see where config is read from.',\n exitCode: EXIT.failure,\n };\n }\n return { message: err.message, exitCode: EXIT.failure };\n }\n return { message: String(err), exitCode: EXIT.failure };\n}\n\n/** Parse `argv` (user arguments only) and run the matching command. Resolves to an exit code. */\nexport async function runCli(argv: string[], options: RunOptions): Promise<number> {\n const state: ProgramState = { exitCode: 0 };\n const program = buildProgram(options, state);\n try {\n await program.parseAsync(argv, { from: 'user' });\n return state.exitCode;\n } catch (err) {\n if (err instanceof CommanderError) {\n // Help/version print and exit 0; usage errors were already written by commander.\n return err.exitCode;\n }\n const { message, hint, exitCode } = describeError(err);\n const theme = state.ctx?.errTheme;\n const label = theme ? theme.error('error') : 'error';\n options.io.stderr.write(`${label}: ${message}\\n`);\n if (hint) options.io.stderr.write(`${theme ? theme.dim(hint) : hint}\\n`);\n if (options.env.DAVECODE_DEBUG && err instanceof Error && err.stack) {\n options.io.stderr.write(`${err.stack}\\n`);\n }\n return exitCode;\n }\n}\n","import { runCli } from './program';\n\nconst code = await runCli(process.argv.slice(2), {\n io: { stdout: process.stdout, stderr: process.stderr, stdin: process.stdin },\n env: process.env,\n cwd: process.cwd(),\n});\nprocess.exitCode = code;\n"],"mappings":"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","names":["code"]}
1
+ {"version":3,"sources":["../src/program.ts","../src/index.ts"],"sourcesContent":["import { Command, CommanderError, InvalidArgumentError, Option } from 'commander';\nimport { type CliContext, type CliIO, createContext, type GlobalOptions } from './context';\nimport { CliError, EXIT } from './errors';\n\n/**\n * Command tree. Keep this module light: it only declares commands and options. Every action\n * lazy-loads its implementation, so `davecode --help` never pays for SQLite, Fastify or Ink.\n */\n\nexport interface RunOptions {\n io: CliIO;\n env: NodeJS.ProcessEnv;\n cwd: string;\n}\n\n/** Result of an action: an exit code, or nothing for success. */\nexport type ActionResult = number | undefined;\n\ninterface ProgramState {\n ctx?: CliContext;\n exitCode: number;\n}\n\nexport function buildProgram(options: RunOptions, state: ProgramState = { exitCode: 0 }): Command {\n const { io } = options;\n const program = new Command('davecode');\n\n const context = (): CliContext => {\n if (!state.ctx) throw new Error('CLI context is not initialised');\n return state.ctx;\n };\n\n /** Wrap a lazily loaded action: `(ctx, ...args) => exit code`. */\n const run =\n <A extends unknown[]>(action: (ctx: CliContext, ...args: A) => Promise<ActionResult>) =>\n async (...args: A) => {\n const code = await action(context(), ...args);\n if (typeof code === 'number') state.exitCode = code;\n };\n\n program\n .description('Local-first AI gateway and autonomous coding engine.')\n .usage('[command] [options]')\n .option('--home <dir>', 'DaveCode home directory (sets DAVECODE_HOME)')\n .option('--json', 'machine-readable JSON output where supported')\n .option('--no-color', 'disable colours (NO_COLOR is honoured too)')\n .option('-V, --version', 'print the version and exit')\n .showSuggestionAfterError(true)\n .configureOutput({\n writeOut: (text) => io.stdout.write(text),\n writeErr: (text) => io.stderr.write(text),\n outputError: (text, write) => write(text),\n })\n .exitOverride()\n .hook('preAction', (_root, action) => {\n state.ctx = createContext(action.optsWithGlobals<GlobalOptions>(), io, options);\n })\n .addHelpText(\n 'after',\n `\nRun \\`davecode\\` with no command in a terminal to open the chat TUI.\nDocs: https://github.com/DMRLZZ/DaveCode#readme`,\n );\n\n program.action(\n run(async (ctx) => {\n const globals = program.opts<GlobalOptions & { version?: boolean }>();\n if (globals.version) {\n const { VERSION } = await import('@davecode/core');\n ctx.out(`davecode ${VERSION}`);\n return EXIT.ok;\n }\n if (ctx.interactive) {\n const { chatCommand } = await import('./commands/chat');\n return chatCommand(ctx, {});\n }\n program.outputHelp();\n return EXIT.ok;\n }),\n );\n\n registerCommands(program, run);\n return program;\n}\n\ntype Runner = <A extends unknown[]>(\n action: (ctx: CliContext, ...args: A) => Promise<ActionResult>,\n) => (...args: A) => Promise<void>;\n\n/** Parse a TCP port (0 = pick a free one). */\nexport function parsePort(value: string): number {\n const n = Number(value);\n if (!/^\\d+$/.test(value.trim()) || !Number.isInteger(n) || n < 0 || n > 65535) {\n throw new InvalidArgumentError('expected a port number between 0 and 65535');\n }\n return n;\n}\n\n/** Parse a non-negative integer (priorities, weights, limits). */\nexport function parseInteger(value: string): number {\n const n = Number(value);\n if (!/^-?\\d+$/.test(value.trim()) || !Number.isSafeInteger(n) || n < 0) {\n throw new InvalidArgumentError('expected a non-negative integer');\n }\n return n;\n}\n\n/** Repeatable option collector (`--model a --model b`, also accepts `a,b`). */\nexport function collect(value: string, previous: string[] = []): string[] {\n return [\n ...previous,\n ...value\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean),\n ];\n}\n\n/** Subcommands. Each action dynamically imports its module. */\nfunction registerCommands(program: Command, run: Runner): void {\n program\n .command('app')\n .description('start your local workspace in a Chrome or Edge app window')\n .addOption(new Option('-p, --port <port>', 'port to listen on').argParser(parsePort))\n .option('--project <dir>', 'repository to open')\n .action(\n run(async (ctx, opts: import('./commands/start').StartOptions) => {\n const { startCommand } = await import('./commands/start');\n return startCommand(ctx, { ...opts, host: '127.0.0.1', app: true });\n }),\n );\n program\n .command('start')\n .description('start the gateway (OpenAI-compatible /v1, dashboard API and web dashboard)')\n .addOption(new Option('-p, --port <port>', 'port to listen on').argParser(parsePort))\n .option('--host <host>', 'interface to bind (default 127.0.0.1)')\n .option('--no-dashboard', 'do not serve the web dashboard')\n .option('--project <dir>', 'repository whose project brain to serve (default: detected)')\n .option('--verbose', 'print gateway request logs')\n .option('-q, --quiet', 'do not print the live activity log')\n .action(\n run(async (ctx, opts: import('./commands/start').StartOptions) => {\n const { startCommand } = await import('./commands/start');\n return startCommand(ctx, opts);\n }),\n );\n\n program\n .command('status')\n .description('gateway health, accounts and 1m/5h/24h quota usage')\n .action(\n run(async (ctx) => {\n const { statusCommand } = await import('./commands/status');\n return statusCommand(ctx);\n }),\n );\n\n program\n .command('chat')\n .description('chat TUI (also what bare `davecode` opens in a terminal)')\n .option('-m, --model <id>', 'model or route, e.g. davecode/auto or anthropic/claude-sonnet-5-5')\n .option('--project <dir>', 'repository whose brain an in-process gateway serves')\n .action(\n run(async (ctx, opts: { model?: string; project?: string }) => {\n const { chatCommand } = await import('./commands/chat');\n return chatCommand(ctx, opts);\n }),\n );\n\n program\n .command('login')\n .description('sign in to your DaveCode account in the browser')\n .action(\n run(async (ctx) => {\n const { loginCommand } = await import('./commands/account');\n return loginCommand(ctx);\n }),\n );\n program\n .command('logout')\n .description('sign out of your DaveCode account')\n .action(\n run(async (ctx) => {\n const { logoutCommand } = await import('./commands/account');\n return logoutCommand(ctx);\n }),\n );\n program\n .command('account')\n .description('show the signed-in DaveCode account')\n .action(\n run(async (ctx) => {\n const { accountCommand } = await import('./commands/account');\n return accountCommand(ctx);\n }),\n );\n\n registerAccounts(program, run);\n registerProject(program, run);\n\n program\n .command('budget')\n .description('plans, renewals and remaining quota per account (what agents are told)')\n .option('--context', 'print only the summary injected into agent prompts')\n .option('--local', 'read the local database even if a gateway is running')\n .action(\n run(async (ctx, opts: import('./commands/budget').BudgetFlags) => {\n const { budgetCommand } = await import('./commands/budget');\n return budgetCommand(ctx, opts);\n }),\n );\n\n program\n .command('doctor')\n .description('check the environment and print fixes')\n .action(\n run(async (ctx) => {\n const { doctorCommand } = await import('./commands/doctor');\n return doctorCommand(ctx);\n }),\n );\n\n program\n .command('run')\n .description('run the autonomous engine on the task graph (live view in a terminal)')\n .option('--once', 'implement at most one ready task, print the result and exit')\n .option(\n '--task <id>',\n \"run this task instead of the runner's pick (it must be PENDING and unblocked)\",\n )\n .option('--project <dir>', 'repository to work on (default: detected)')\n .addHelpText(\n 'after',\n `\nExit codes with --once: 0 success or nothing to do, 1 failed or error, 130 stopped.\nCtrl+C stops safely: partial work stays on the task branch and the task goes back to PENDING.`,\n )\n .action(\n run(async (ctx, opts: import('./commands/run').RunOptions) => {\n const { runCommand } = await import('./commands/run');\n return runCommand(ctx, opts);\n }),\n );\n\n registerGoals(program, run);\n}\n\nfunction registerGoals(program: Command, run: Runner): void {\n const limit = (flag: string, description: string) =>\n new Option(flag, description).argParser((value) => {\n const n = parseInteger(value);\n if (n < 1) throw new InvalidArgumentError('expected a positive integer');\n return n;\n });\n\n program\n .command('goal <objective...>')\n .description('pursue an objective with a team of agents (plan, execute, review, re-plan)')\n .addOption(\n limit('--max-rounds <n>', 'plan → execute → review rounds (capped by goal.maxRounds)'),\n )\n .addOption(limit('--max-tasks <n>', 'tasks across all rounds (capped by goal.maxTasks)'))\n .addOption(\n limit('--max-tokens <n>', 'token budget for the whole goal (capped by goal.maxTokens)'),\n )\n .option('--dry-run', 'plan only: print the task graph without executing it')\n .option('--project <dir>', 'repository to work in (default: detected)')\n .addHelpText(\n 'after',\n `\nAgents never send emails, post, pay or sign up for anything: such steps become drafts in\n.davecode/goals/<goal-id>/. Code tasks go through the autonomous runner (branch, checks, merge).\nCtrl+C cancels. Exit codes: 0 succeeded or planned, 1 failed or out of budget, 130 cancelled.\n\nExamples:\n davecode goal \"Write positioning and landing copy for this app\" --dry-run\n davecode goal \"Add a /health endpoint with tests\" --max-rounds 2`,\n )\n .action(\n run(async (ctx, words: string[], opts: import('./commands/goal').GoalOptions) => {\n const { goalCommand } = await import('./commands/goal');\n return goalCommand(ctx, words, opts);\n }),\n );\n\n const goals = program.command('goals').description('goals of this repository');\n goals\n .command('list', { isDefault: true })\n .alias('ls')\n .description('goals, newest first')\n .option('--project <dir>', 'repository (default: detected)')\n .action(\n run(async (ctx, opts: { project?: string }) => {\n const { goalsList } = await import('./commands/goal');\n return goalsList(ctx, opts);\n }),\n );\n goals\n .command('show <id>')\n .description('tasks, artifacts and summary of a goal')\n .option('--project <dir>', 'repository (default: detected)')\n .action(\n run(async (ctx, id: string, opts: { project?: string }) => {\n const { goalsShow } = await import('./commands/goal');\n return goalsShow(ctx, id, opts);\n }),\n );\n goals\n .command('cancel <id>')\n .description('cancel a running goal')\n .option('--project <dir>', 'repository (default: detected)')\n .action(\n run(async (ctx, id: string, opts: { project?: string }) => {\n const { goalsCancel } = await import('./commands/goal');\n return goalsCancel(ctx, id, opts);\n }),\n );\n}\n\nfunction registerProject(program: Command, run: Runner): void {\n program\n .command('init')\n .description('scaffold the project brain (.davecode/) in this repository')\n .option('--name <name>', 'project name used in STATE.md and ARCHITECTURE.md')\n .option('--config', 'write a starter .davecode/config.json without asking')\n .option('--no-config', 'do not write .davecode/config.json')\n .action(\n run(async (ctx, opts: { name?: string; config?: boolean }) => {\n const { initCommand } = await import('./commands/init');\n return initCommand(ctx, opts);\n }),\n );\n\n const tasks = program.command('tasks').description('show and edit the task graph');\n tasks\n .command('list', { isDefault: true })\n .alias('ls')\n .description('task tree with status and blocked reasons')\n .action(\n run(async (ctx) => {\n const { tasksList } = await import('./commands/tasks');\n return tasksList(ctx);\n }),\n );\n tasks\n .command('next')\n .description('the task the runner would pick next')\n .action(\n run(async (ctx) => {\n const { tasksNext } = await import('./commands/tasks');\n return tasksNext(ctx);\n }),\n );\n tasks\n .command('add <id> <title...>')\n .description('add a PENDING task')\n .option('-d, --depends <ids>', 'dependencies (repeatable or comma-separated)', collect)\n .addOption(new Option('-p, --priority <n>', 'higher runs first').argParser(parseInteger))\n .option('--description <text>', 'longer description')\n .option(\n '-a, --acceptance <criterion>',\n 'acceptance criterion (repeatable)',\n (v, prev: string[] = []) => [...prev, v],\n )\n .action(\n run(\n async (\n ctx,\n id: string,\n title: string[],\n opts: import('./commands/tasks').AddTaskOptions,\n ) => {\n const { tasksAdd } = await import('./commands/tasks');\n return tasksAdd(ctx, id, title, opts);\n },\n ),\n );\n tasks\n .command('status <id> <status>')\n .description('move a task to PENDING | IN_PROGRESS | SUCCESS | FAILED')\n .option('--notes <text>', 'note stored on the task')\n .action(\n run(async (ctx, id: string, status: string, opts: { notes?: string }) => {\n const { tasksStatus } = await import('./commands/tasks');\n return tasksStatus(ctx, id, status, opts);\n }),\n );\n\n const config = program.command('config').description('show the resolved configuration');\n config\n .command('show', { isDefault: true })\n .description('resolved config as JSON (secrets redacted)')\n .action(\n run(async (ctx) => {\n const { configShow } = await import('./commands/config');\n return configShow(ctx);\n }),\n );\n config\n .command('path')\n .description('where config, state and brains live')\n .action(\n run(async (ctx) => {\n const { configPath } = await import('./commands/config');\n return configPath(ctx);\n }),\n );\n config\n .command('get <key>')\n .description('one value by dotted key, e.g. server.port')\n .action(\n run(async (ctx, key: string) => {\n const { configGet } = await import('./commands/config');\n return configGet(ctx, key);\n }),\n );\n}\n\ntype AddOpts = import('./commands/accounts').AddCommandFlags;\n\nfunction addAccountOptions(command: Command, run: Runner): Command {\n return command\n .option(\n '--provider <kind>',\n 'anthropic | openai | gemini | openai-compatible | claude-cli | codex-cli | gemini-cli | gemini-web',\n )\n .option('--label <name>', 'human-friendly name')\n .addOption(\n new Option('--priority <n>', 'lower is tried first (default 100)').argParser(parseInteger),\n )\n .addOption(\n new Option('--weight <n>', 'traffic share among equal priorities').argParser(parseInteger),\n )\n .option('--secret-env <var>', 'read the API key from this environment variable')\n .option('--secret-stdin', 'read the API key from stdin')\n .option('--secret <value>', 'API key (discouraged: visible in shell history)')\n .option('--base-url <url>', 'endpoint for openai-compatible accounts')\n .option('--model <id>', 'advertised model (repeatable or comma-separated)', collect)\n .option('--default-model <id>', 'model used for davecode/auto without a route')\n .option('--binary-path <path>', 'CLI binary for claude-cli / codex-cli / gemini-cli')\n .option('--limit <key=value>', 'quota limit, e.g. tokens5h=500000 (repeatable)', collect)\n .option('--disabled', 'add the account disabled')\n .option('-y, --yes', 'never prompt: take everything from flags')\n .option('--no-login', 'do not offer to log in after adding a CLI account')\n .option('--local', 'write to the local database even if a gateway is running')\n .addHelpText(\n 'after',\n `\nExamples:\n davecode accounts add # interactive\n davecode accounts add --provider anthropic --label work --secret-env ANTHROPIC_API_KEY --yes\n echo \"$OPENROUTER_KEY\" | davecode accounts add --provider openai-compatible \\\\\n --base-url https://openrouter.ai/api/v1 --model openai/gpt-5.5 --secret-stdin\n davecode accounts add --provider claude-cli --label \"Claude Pro\" --yes`,\n )\n .action(\n run(async (ctx, opts: AddOpts) => {\n const { accountsAdd } = await import('./commands/accounts');\n return accountsAdd(ctx, opts);\n }),\n );\n}\n\nfunction registerAccounts(program: Command, run: Runner): void {\n const accounts = program.command('accounts').description('manage provider accounts');\n\n accounts\n .command('list', { isDefault: true })\n .alias('ls')\n .description('list accounts')\n .option('--local', 'read the local database even if a gateway is running')\n .action(\n run(async (ctx, opts: { local?: boolean }) => {\n const { accountsList } = await import('./commands/accounts');\n return accountsList(ctx, opts);\n }),\n );\n\n addAccountOptions(\n accounts.command('add').description('add an account (interactive in a terminal)'),\n run,\n );\n\n accounts\n .command('remove <id>')\n .alias('rm')\n .description('remove an account, its secret and its sandbox')\n .option('-y, --yes', 'do not ask for confirmation')\n .option('--local', 'write to the local database even if a gateway is running')\n .action(\n run(async (ctx, id: string, opts: { yes?: boolean; local?: boolean }) => {\n const { accountsRemove } = await import('./commands/accounts');\n return accountsRemove(ctx, id, opts);\n }),\n );\n\n for (const [name, enabled] of [\n ['enable', true],\n ['disable', false],\n ] as const) {\n accounts\n .command(`${name} <id>`)\n .description(`${name} an account${enabled ? ' (also clears error and cooldown state)' : ''}`)\n .option('--local', 'write to the local database even if a gateway is running')\n .action(\n run(async (ctx, id: string, opts: { local?: boolean }) => {\n const { accountsSetEnabled } = await import('./commands/accounts');\n return accountsSetEnabled(ctx, id, enabled, opts);\n }),\n );\n }\n\n accounts\n .command('plan <id>')\n .description('show or set what you pay for an account (plan, price, paid/renewal dates)')\n .option('--plan <name>', 'plan name, e.g. \"Claude Pro\" or \"API pay-as-you-go\"')\n .option('--price <amount>', 'price per period, e.g. 20')\n .option('--currency <code>', '3-letter currency code (default USD)')\n .option('--period <period>', 'month | year (default month)')\n .option('--paid <date>', 'last payment date (YYYY-MM-DD)')\n .option('--renews <date>', 'next renewal date (YYYY-MM-DD)')\n .option('--notes <text>', 'free-form note')\n .option('--clear', 'remove the recorded plan')\n .option('--local', 'write to the local database even if a gateway is running')\n .addHelpText(\n 'after',\n `\nEntered by hand: DaveCode never reads billing pages. Example:\n davecode accounts plan acc_123 --plan \"Claude Pro\" --price 20 --renews 2026-11-01`,\n )\n .action(\n run(async (ctx, id: string, opts: import('./commands/accounts').PlanFlags) => {\n const { accountsPlan } = await import('./commands/accounts');\n return accountsPlan(ctx, id, opts);\n }),\n );\n\n accounts\n .command('login <id> [args...]')\n .description(\n 'log a claude-cli / codex-cli / gemini-cli account in, inside its own isolated config dir',\n )\n .allowUnknownOption()\n .option('--local', 'read the local database even if a gateway is running')\n .option('--hold', 'wait for Enter before exiting (for windows opened by the dashboard)')\n .addHelpText(\n 'after',\n `\nRuns the vendor's official sign-in (claude auth login, codex login, Gemini CLI's\n\"Login with Google\") with CLAUDE_CONFIG_DIR / CODEX_HOME / GEMINI_CLI_HOME pointing at the\naccount's sandbox, so every account keeps a separate login. DaveCode never sees the password.\nExtra arguments after -- replace the default ones (e.g. -- login --device-auth for Codex).`,\n )\n .action(\n run(\n async (ctx, id: string, args: string[], opts: import('./commands/accounts').LoginFlags) => {\n const { accountsLogin } = await import('./commands/accounts');\n return accountsLogin(ctx, id, args, opts);\n },\n ),\n );\n\n accounts\n .command('connect <id>')\n .description('connect a subscription: check its login and run the official sign-in if needed')\n .option('--check', 'only report whether the account is connected')\n .option('--local', 'read the local database even if a gateway is running')\n .addHelpText(\n 'after',\n `\nAPI-key accounts are connected when a key is stored. CLI accounts (claude-cli, codex-cli,\ngemini-cli) ask the vendor CLI for its login status inside the account sandbox and, when not\nconnected, start the vendor's own sign-in. Example:\n davecode accounts connect acc_123 --check`,\n )\n .action(\n run(async (ctx, id: string, opts: import('./commands/accounts').ConnectFlags) => {\n const { accountsConnect } = await import('./commands/accounts');\n return accountsConnect(ctx, id, opts);\n }),\n );\n\n addAccountOptions(program.command('add-account').description('alias of `accounts add`'), run);\n}\n\n/** Render an error for humans: `error: …` plus an optional hint, without a stack trace. */\nexport function describeError(err: unknown): { message: string; hint?: string; exitCode: number } {\n if (err instanceof CliError) {\n return {\n message: err.message,\n exitCode: err.exitCode,\n ...(err.hint ? { hint: err.hint } : {}),\n };\n }\n if (err instanceof Error) {\n if (err.name === 'ConfigError') {\n return {\n message: err.message,\n hint: 'Fix the file above or run `davecode config path` to see where config is read from.',\n exitCode: EXIT.failure,\n };\n }\n return { message: err.message, exitCode: EXIT.failure };\n }\n return { message: String(err), exitCode: EXIT.failure };\n}\n\n/** Parse `argv` (user arguments only) and run the matching command. Resolves to an exit code. */\nexport async function runCli(argv: string[], options: RunOptions): Promise<number> {\n const state: ProgramState = { exitCode: 0 };\n const program = buildProgram(options, state);\n try {\n await program.parseAsync(argv, { from: 'user' });\n return state.exitCode;\n } catch (err) {\n if (err instanceof CommanderError) {\n // Help/version print and exit 0; usage errors were already written by commander.\n return err.exitCode;\n }\n const { message, hint, exitCode } = describeError(err);\n const theme = state.ctx?.errTheme;\n const label = theme ? theme.error('error') : 'error';\n options.io.stderr.write(`${label}: ${message}\\n`);\n if (hint) options.io.stderr.write(`${theme ? theme.dim(hint) : hint}\\n`);\n if (options.env.DAVECODE_DEBUG && err instanceof Error && err.stack) {\n options.io.stderr.write(`${err.stack}\\n`);\n }\n return exitCode;\n }\n}\n","import { runCli } from './program';\n\nconst code = await runCli(process.argv.slice(2), {\n io: { stdout: process.stdout, stderr: process.stderr, stdin: process.stdin },\n env: process.env,\n cwd: process.cwd(),\n});\nprocess.exitCode = code;\n"],"mappings":"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","names":["code"]}
@@ -3,11 +3,10 @@ import {
3
3
  } from "./chunk-IC3TDONV.js";
4
4
  import {
5
5
  printJson
6
- } from "./chunk-DYQ56FBT.js";
7
- import "./chunk-VVCXGQMY.js";
6
+ } from "./chunk-QA3O6RA2.js";
8
7
  import {
9
8
  detectProjectRoot
10
- } from "./chunk-PIIJ3RSI.js";
9
+ } from "./chunk-FYPMA55O.js";
11
10
  import {
12
11
  CliError,
13
12
  EXIT
@@ -16,7 +15,8 @@ import {
16
15
  ProjectBrain,
17
16
  configSchema,
18
17
  projectPaths
19
- } from "./chunk-C7FDRA3U.js";
18
+ } from "./chunk-HSBJDV3O.js";
19
+ import "./chunk-MC7RIPL7.js";
20
20
 
21
21
  // src/commands/init.ts
22
22
  import { existsSync as existsSync2, readFileSync as readFileSync2, writeFileSync } from "fs";
@@ -118,7 +118,7 @@ async function initCommand(ctx, opts, deps = {}) {
118
118
  } else {
119
119
  let write = opts.config === true;
120
120
  if (!write && ctx.interactive) {
121
- const prompter = deps.prompter ?? (await import("./prompts-L37J72YW.js")).createInkPrompter({
121
+ const prompter = deps.prompter ?? (await import("./prompts-TZ7UC42M.js")).createInkPrompter({
122
122
  stdout: ctx.io.stdout,
123
123
  stdin: ctx.io.stdin,
124
124
  theme: ctx.theme
@@ -191,4 +191,4 @@ export {
191
191
  ensureLockIgnored,
192
192
  initCommand
193
193
  };
194
- //# sourceMappingURL=init-NFYNO3A3.js.map
194
+ //# sourceMappingURL=init-Z2AFQEEP.js.map
@@ -4,8 +4,8 @@ import {
4
4
  import {
5
5
  ThemeProvider,
6
6
  useTheme
7
- } from "./chunk-OXRMGR72.js";
8
- import "./chunk-VVCXGQMY.js";
7
+ } from "./chunk-PGPXE6LF.js";
8
+ import "./chunk-MC7RIPL7.js";
9
9
 
10
10
  // src/tui/prompts.tsx
11
11
  import { Box, render, Text, useInput } from "ink";
@@ -50,7 +50,10 @@ function SelectPrompt({
50
50
  setChosen(choice);
51
51
  done(choice.value);
52
52
  } else if (/^[1-9]$/.test(input) && Number(input) <= choices.length) {
53
+ const choice = choices[Number(input) - 1];
53
54
  setIndex(Number(input) - 1);
55
+ setChosen(choice);
56
+ done(choice.value);
54
57
  }
55
58
  });
56
59
  if (chosen) return /* @__PURE__ */ jsx(Question, { message, answer: chosen.label });
@@ -59,8 +62,9 @@ function SelectPrompt({
59
62
  choices.map((choice, i) => {
60
63
  const active = i === index;
61
64
  return /* @__PURE__ */ jsxs(Text, { children: [
62
- /* @__PURE__ */ jsxs(Text, { color: active ? theme.ink.accent : void 0, children: [
65
+ /* @__PURE__ */ jsxs(Text, { bold: active, dimColor: !active && theme.ink.dim, children: [
63
66
  active ? ` ${theme.glyph.prompt} ` : " ",
67
+ choices.length <= 9 ? `${i + 1}. ` : "",
64
68
  choice.label
65
69
  ] }),
66
70
  choice.hint ? /* @__PURE__ */ jsxs(Text, { dimColor: theme.ink.dim, children: [
@@ -69,7 +73,7 @@ function SelectPrompt({
69
73
  ] }) : null
70
74
  ] }, choice.value);
71
75
  }),
72
- /* @__PURE__ */ jsx(Text, { dimColor: theme.ink.dim, children: " \u2191/\u2193 to move, Enter to select, Esc to cancel" })
76
+ /* @__PURE__ */ jsx(Text, { dimColor: theme.ink.dim, children: choices.length <= 9 ? " \u2191/\u2193 or a number to choose, Enter to confirm, Esc to cancel" : " \u2191/\u2193 to move, Enter to select, Esc to cancel" })
73
77
  ] });
74
78
  }
75
79
  function TextPrompt({
@@ -212,4 +216,4 @@ export {
212
216
  createInkPrompter,
213
217
  sanitizeLine
214
218
  };
215
- //# sourceMappingURL=prompts-L37J72YW.js.map
219
+ //# sourceMappingURL=prompts-TZ7UC42M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tui/prompts.tsx"],"sourcesContent":["import { Box, render, Text, useInput } from 'ink';\nimport { type ReactElement, useState } from 'react';\nimport type { InStream, OutStream } from '../context';\nimport {\n type Choice,\n PromptCancelledError,\n type Prompter,\n type SecretOptions,\n type TextOptions,\n} from '../lib/prompter';\nimport type { Theme } from '../ui/theme';\nimport { ThemeProvider, useTheme } from './theme-context';\n\n/** Drop line breaks and control characters from typed or pasted single-line input. */\nexport function sanitizeLine(input: string): string {\n // biome-ignore lint/suspicious/noControlCharactersInRegex: stripping control characters\n return input.replace(/[\\u0000-\\u001f\\u007f]/g, '');\n}\n\ninterface Settle<T> {\n done: (value: T) => void;\n cancel: () => void;\n}\n\nfunction Question({ message, answer }: { message: string; answer?: string }) {\n const theme = useTheme();\n return (\n <Text>\n <Text color={answer === undefined ? theme.ink.accent : theme.ink.ok}>\n {answer === undefined ? '?' : theme.glyph.ok}\n </Text>{' '}\n <Text bold>{message}</Text>\n {answer !== undefined ? <Text dimColor={theme.ink.dim}> {answer}</Text> : null}\n </Text>\n );\n}\n\nexport function SelectPrompt<T extends string>({\n message,\n choices,\n initial,\n done,\n cancel,\n}: { message: string; choices: Choice<T>[]; initial?: T } & Settle<T>) {\n const theme = useTheme();\n const start = Math.max(\n 0,\n choices.findIndex((c) => c.value === initial),\n );\n const [index, setIndex] = useState(start);\n const [chosen, setChosen] = useState<Choice<T> | undefined>();\n\n useInput((input, key) => {\n if (chosen) return;\n if (key.escape || (key.ctrl && input === 'c')) return cancel();\n if (key.upArrow || input === 'k') setIndex((i) => (i - 1 + choices.length) % choices.length);\n else if (key.downArrow || input === 'j') setIndex((i) => (i + 1) % choices.length);\n else if (key.return) {\n const choice = choices[index]!;\n setChosen(choice);\n done(choice.value);\n } else if (/^[1-9]$/.test(input) && Number(input) <= choices.length) {\n // A number picks its option straight away, as in Claude Code's menus.\n const choice = choices[Number(input) - 1]!;\n setIndex(Number(input) - 1);\n setChosen(choice);\n done(choice.value);\n }\n });\n\n if (chosen) return <Question message={message} answer={chosen.label} />;\n return (\n <Box flexDirection=\"column\">\n <Question message={message} />\n {choices.map((choice, i) => {\n const active = i === index;\n return (\n <Text key={choice.value}>\n <Text bold={active} dimColor={!active && theme.ink.dim}>\n {active ? ` ${theme.glyph.prompt} ` : ' '}\n {choices.length <= 9 ? `${i + 1}. ` : ''}\n {choice.label}\n </Text>\n {choice.hint ? <Text dimColor={theme.ink.dim}> {choice.hint}</Text> : null}\n </Text>\n );\n })}\n <Text dimColor={theme.ink.dim}>\n {choices.length <= 9\n ? ' ↑/↓ or a number to choose, Enter to confirm, Esc to cancel'\n : ' ↑/↓ to move, Enter to select, Esc to cancel'}\n </Text>\n </Box>\n );\n}\n\nexport function TextPrompt({\n message,\n initial = '',\n placeholder,\n validate,\n mask,\n optional,\n done,\n cancel,\n}: TextOptions & SecretOptions & { message: string; mask?: boolean } & Settle<string>) {\n const theme = useTheme();\n const [value, setValue] = useState(initial);\n const [error, setError] = useState<string | undefined>();\n const [submitted, setSubmitted] = useState(false);\n\n useInput((input, key) => {\n if (submitted) return;\n if (key.escape || (key.ctrl && input === 'c')) return cancel();\n if (key.return) {\n if (mask && !optional && value.trim() === '') {\n setError('a value is required');\n return;\n }\n const problem = validate?.(value);\n if (problem) {\n setError(problem);\n return;\n }\n setSubmitted(true);\n done(value);\n return;\n }\n if (key.backspace || key.delete) {\n setValue((v) => [...v].slice(0, -1).join(''));\n } else if (key.ctrl && input === 'u') {\n setValue('');\n } else if (!key.ctrl && !key.meta) {\n const text = sanitizeLine(input);\n if (text) setValue((v) => v + text);\n }\n setError(undefined);\n });\n\n const shown = mask ? '•'.repeat(Math.min([...value].length, 32)) : value;\n if (submitted) {\n const answer = mask ? (value ? 'set' : 'skipped') : value || '(empty)';\n return <Question message={message} answer={answer} />;\n }\n return (\n <Box flexDirection=\"column\">\n <Text>\n <Text color={theme.ink.accent}>?</Text> <Text bold>{message}</Text>{' '}\n {shown ? <Text>{shown}</Text> : <Text dimColor={theme.ink.dim}>{placeholder ?? ''}</Text>}\n <Text inverse> </Text>\n </Text>\n {error ? (\n <Text color={theme.ink.error}>\n {' '}\n {error}\n </Text>\n ) : null}\n </Box>\n );\n}\n\nexport function ConfirmPrompt({\n message,\n initial,\n done,\n cancel,\n}: { message: string; initial: boolean } & Settle<boolean>) {\n const theme = useTheme();\n const [answer, setAnswer] = useState<boolean | undefined>();\n useInput((input, key) => {\n if (answer !== undefined) return;\n if (key.escape || (key.ctrl && input === 'c')) return cancel();\n let value: boolean | undefined;\n if (key.return) value = initial;\n else if (/^y$/i.test(input)) value = true;\n else if (/^n$/i.test(input)) value = false;\n if (value === undefined) return;\n setAnswer(value);\n done(value);\n });\n if (answer !== undefined) return <Question message={message} answer={answer ? 'yes' : 'no'} />;\n return (\n <Text>\n <Text color={theme.ink.accent}>?</Text> <Text bold>{message}</Text>{' '}\n <Text dimColor={theme.ink.dim}>{initial ? '(Y/n)' : '(y/N)'}</Text>\n </Text>\n );\n}\n\nexport interface InkPrompterOptions {\n stdout: OutStream;\n stdin: InStream;\n theme: Theme;\n}\n\n/** Ink-backed prompter: each question is a short-lived Ink app that leaves its answer behind. */\nexport function createInkPrompter(options: InkPrompterOptions): Prompter {\n const ask = <T,>(element: (settle: Settle<T>) => ReactElement): Promise<T> =>\n new Promise<T>((resolve, reject) => {\n let result: { ok: true; value: T } | { ok: false } | undefined;\n const instance = render(\n <ThemeProvider theme={options.theme}>\n {element({\n done: (value) => {\n result = { ok: true, value };\n setImmediate(() => instance.unmount());\n },\n cancel: () => {\n result = { ok: false };\n setImmediate(() => instance.unmount());\n },\n })}\n </ThemeProvider>,\n {\n stdout: options.stdout as NodeJS.WriteStream,\n stdin: options.stdin as NodeJS.ReadStream,\n exitOnCtrlC: false,\n patchConsole: false,\n },\n );\n instance.waitUntilExit().then(\n () => {\n if (result?.ok) resolve(result.value);\n else reject(new PromptCancelledError());\n },\n (err: unknown) => reject(err),\n );\n });\n\n return {\n select: (message, choices, initial) =>\n ask((s) => (\n <SelectPrompt\n message={message}\n choices={choices}\n {...(initial !== undefined ? { initial } : {})}\n {...s}\n />\n )),\n text: (message, opts = {}) => ask((s) => <TextPrompt message={message} {...opts} {...s} />),\n secret: (message, opts = {}) =>\n ask((s) => <TextPrompt message={message} mask {...opts} {...s} />),\n confirm: (message, initial = false) =>\n ask((s) => <ConfirmPrompt message={message} initial={initial} {...s} />),\n };\n}\n"],"mappings":"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","names":[]}
@@ -1,25 +1,24 @@
1
1
  import {
2
2
  logText
3
- } from "./chunk-OYEYNDOO.js";
3
+ } from "./chunk-GE22VBCY.js";
4
4
  import {
5
5
  initialRunnerState,
6
6
  isTerminal
7
7
  } from "./chunk-FRFSJMN4.js";
8
- import "./chunk-BOLFK3BH.js";
9
- import "./chunk-OXRMGR72.js";
8
+ import "./chunk-5LKOJBUL.js";
9
+ import "./chunk-PGPXE6LF.js";
10
10
  import {
11
11
  formatDuration
12
12
  } from "./chunk-SF5ZEAP4.js";
13
13
  import {
14
14
  printJson
15
- } from "./chunk-DYQ56FBT.js";
16
- import "./chunk-VVCXGQMY.js";
15
+ } from "./chunk-QA3O6RA2.js";
17
16
  import {
18
17
  GatewayError,
19
18
  detectProjectRoot,
20
19
  findGateway,
21
20
  wireProject
22
- } from "./chunk-PIIJ3RSI.js";
21
+ } from "./chunk-FYPMA55O.js";
23
22
  import {
24
23
  CliError,
25
24
  EXIT
@@ -29,7 +28,8 @@ import {
29
28
  RunnerError,
30
29
  createEngine,
31
30
  loadConfig
32
- } from "./chunk-C7FDRA3U.js";
31
+ } from "./chunk-HSBJDV3O.js";
32
+ import "./chunk-MC7RIPL7.js";
33
33
 
34
34
  // src/commands/run.ts
35
35
  import { existsSync } from "fs";
@@ -268,7 +268,7 @@ async function runContinuous(ctx, engine, runner, config, projectName, tasks, de
268
268
  const [{ render }, { createElement }, { RunnerApp }] = await Promise.all([
269
269
  import("ink"),
270
270
  import("react"),
271
- import("./RunnerView-DLVR7C22.js")
271
+ import("./RunnerView-A7JSPUW5.js")
272
272
  ]);
273
273
  let initial = initialRunnerState(runner.status(), tasks);
274
274
  const { runnerReducer } = await import("./runner-state-QFU3LJVJ.js");
@@ -334,7 +334,7 @@ async function driveGateway(ctx, client, config, root, taskId) {
334
334
  const [{ render }, { createElement }, { RunnerApp }, { tasks }] = await Promise.all([
335
335
  import("ink"),
336
336
  import("react"),
337
- import("./RunnerView-DLVR7C22.js"),
337
+ import("./RunnerView-A7JSPUW5.js"),
338
338
  client.get("/api/tasks").then((r) => ({ tasks: r.graph.tasks })).catch(() => ({ tasks: [] }))
339
339
  ]);
340
340
  const status = await client.get("/api/runner").then((r) => r.status).catch(() => latest);
@@ -373,4 +373,4 @@ export {
373
373
  explainRunnerError,
374
374
  runCommand
375
375
  };
376
- //# sourceMappingURL=run-ARUPXFFB.js.map
376
+ //# sourceMappingURL=run-AOS7L3RT.js.map
@@ -0,0 +1,18 @@
1
+ import {
2
+ detectProjectRoot,
3
+ launchLoginTerminal,
4
+ resolveDashboardDir,
5
+ resolveProjectRoot,
6
+ startRuntime,
7
+ wireProject
8
+ } from "./chunk-FYPMA55O.js";
9
+ import "./chunk-HSBJDV3O.js";
10
+ export {
11
+ detectProjectRoot,
12
+ launchLoginTerminal,
13
+ resolveDashboardDir,
14
+ resolveProjectRoot,
15
+ startRuntime,
16
+ wireProject
17
+ };
18
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -4,14 +4,13 @@ import {
4
4
  } from "./chunk-SF5ZEAP4.js";
5
5
  import {
6
6
  printJson
7
- } from "./chunk-DYQ56FBT.js";
8
- import "./chunk-VVCXGQMY.js";
7
+ } from "./chunk-QA3O6RA2.js";
9
8
  import {
10
9
  detectProjectRoot,
11
10
  findGateway,
12
11
  startRuntime,
13
12
  which
14
- } from "./chunk-PIIJ3RSI.js";
13
+ } from "./chunk-FYPMA55O.js";
15
14
  import {
16
15
  CliError,
17
16
  EXIT
@@ -20,7 +19,8 @@ import {
20
19
  VERSION,
21
20
  loadConfig,
22
21
  summarize
23
- } from "./chunk-C7FDRA3U.js";
22
+ } from "./chunk-HSBJDV3O.js";
23
+ import "./chunk-MC7RIPL7.js";
24
24
 
25
25
  // src/commands/start.ts
26
26
  import { existsSync } from "fs";
@@ -282,4 +282,4 @@ async function startCommand(ctx, opts, deps = {}) {
282
282
  export {
283
283
  startCommand
284
284
  };
285
- //# sourceMappingURL=start-CFPOVIAR.js.map
285
+ //# sourceMappingURL=start-CEPXKZUE.js.map
@@ -6,13 +6,13 @@ import {
6
6
  renderStatus,
7
7
  statusCommand,
8
8
  windowCell
9
- } from "./chunk-MSLLH5XP.js";
9
+ } from "./chunk-PGAJIGUF.js";
10
10
  import "./chunk-SF5ZEAP4.js";
11
- import "./chunk-DYQ56FBT.js";
12
- import "./chunk-VVCXGQMY.js";
13
- import "./chunk-PIIJ3RSI.js";
11
+ import "./chunk-QA3O6RA2.js";
12
+ import "./chunk-FYPMA55O.js";
14
13
  import "./chunk-7XVXEO7U.js";
15
- import "./chunk-C7FDRA3U.js";
14
+ import "./chunk-HSBJDV3O.js";
15
+ import "./chunk-MC7RIPL7.js";
16
16
  export {
17
17
  emptyUsage,
18
18
  gatherStatus,
@@ -22,4 +22,4 @@ export {
22
22
  statusCommand,
23
23
  windowCell
24
24
  };
25
- //# sourceMappingURL=status-E4EACVE2.js.map
25
+ //# sourceMappingURL=status-WNJ3GGKU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -2,15 +2,14 @@ import {
2
2
  formatTaskDetail,
3
3
  formatTaskTree,
4
4
  summaryLine
5
- } from "./chunk-23KTE7IK.js";
5
+ } from "./chunk-AZKACMME.js";
6
6
  import "./chunk-SF5ZEAP4.js";
7
7
  import {
8
8
  printJson
9
- } from "./chunk-DYQ56FBT.js";
10
- import "./chunk-VVCXGQMY.js";
9
+ } from "./chunk-QA3O6RA2.js";
11
10
  import {
12
11
  detectProjectRoot
13
- } from "./chunk-PIIJ3RSI.js";
12
+ } from "./chunk-FYPMA55O.js";
14
13
  import {
15
14
  CliError,
16
15
  EXIT
@@ -23,7 +22,8 @@ import {
23
22
  nextTask,
24
23
  parseTaskGraph,
25
24
  summarize
26
- } from "./chunk-C7FDRA3U.js";
25
+ } from "./chunk-HSBJDV3O.js";
26
+ import "./chunk-MC7RIPL7.js";
27
27
 
28
28
  // src/commands/tasks.ts
29
29
  import { rename, writeFile } from "fs/promises";
@@ -181,4 +181,4 @@ export {
181
181
  tasksNext,
182
182
  tasksStatus
183
183
  };
184
- //# sourceMappingURL=tasks-ZIK6BVEX.js.map
184
+ //# sourceMappingURL=tasks-TFUTUMWB.js.map
package/package.json CHANGED
@@ -1,9 +1,15 @@
1
1
  {
2
2
  "name": "@dmrlzz/davecode",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "DaveCode CLI & TUI: run the gateway, manage accounts and drive the autonomous engine from your terminal.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
+ "exports": {
8
+ "./runtime": {
9
+ "source": "./src/runtime.ts",
10
+ "default": "./dist/runtime.js"
11
+ }
12
+ },
7
13
  "bin": {
8
14
  "davecode": "bin/davecode.js"
9
15
  },
@@ -36,21 +42,16 @@
36
42
  "engines": {
37
43
  "node": ">=22.12.0"
38
44
  },
39
- "scripts": {
40
- "build": "tsup",
41
- "dev": "tsx --conditions=source src/index.ts",
42
- "typecheck": "tsc --noEmit"
43
- },
44
45
  "dependencies": {
45
- "@fastify/cors": "^11.3.0",
46
- "@fastify/static": "^10.1.5",
46
+ "@fastify/cors": "^11.3.1",
47
+ "@fastify/static": "^10.1.7",
47
48
  "better-sqlite3": "^13.0.3",
48
49
  "commander": "^15.0.0",
49
50
  "fastify": "^5.12.5",
50
51
  "ink": "^8.0.0",
51
52
  "js-tiktoken": "^1.0.21",
52
- "react": "^19.3.0",
53
- "zod": "^4.6.5"
53
+ "react": "^19.3.1",
54
+ "zod": "^4.6.7"
54
55
  },
55
56
  "peerDependencies": {
56
57
  "playwright-core": ">=1.50.0"
@@ -61,10 +62,15 @@
61
62
  }
62
63
  },
63
64
  "devDependencies": {
64
- "@davecode/core": "workspace:*",
65
- "@davecode/server": "workspace:*",
66
- "@davecode/ui": "workspace:*",
67
65
  "@types/react": "^19.3.0",
68
- "ink-testing-library": "^4.0.0"
66
+ "ink-testing-library": "^4.0.0",
67
+ "@davecode/server": "0.5.0",
68
+ "@davecode/ui": "0.5.0",
69
+ "@davecode/core": "0.5.0"
70
+ },
71
+ "scripts": {
72
+ "build": "tsup",
73
+ "dev": "tsx --conditions=source src/index.ts",
74
+ "typecheck": "tsc --noEmit"
69
75
  }
70
- }
76
+ }