@robota-sdk/agent-cli 3.0.0-beta.67 → 3.0.0-beta.68

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 (74) hide show
  1. package/README.md +116 -35
  2. package/bin/robota.cjs +5 -1
  3. package/dist/node/bin.d.ts +1 -0
  4. package/dist/node/bin.js +23 -8
  5. package/dist/node/bin.js.map +1 -1
  6. package/dist/node/cli.cjs +1 -0
  7. package/dist/node/cli.d.ts +7 -0
  8. package/dist/node/cli.d.ts.map +1 -0
  9. package/dist/node/cli.js +2 -0
  10. package/dist/node/cli.js.map +1 -0
  11. package/dist/node/constants.cjs +1 -0
  12. package/dist/node/constants.js +2 -0
  13. package/dist/node/constants.js.map +1 -0
  14. package/dist/node/index.cjs +17 -8
  15. package/dist/node/index.d.ts.map +1 -1
  16. package/dist/node/index.js +17 -8
  17. package/dist/node/index.js.map +1 -1
  18. package/dist/node/init/init-command.cjs +32 -0
  19. package/dist/node/init/init-command.js +33 -0
  20. package/dist/node/init/init-command.js.map +1 -0
  21. package/dist/node/modes/print-mode.cjs +6 -0
  22. package/dist/node/modes/print-mode.js +7 -0
  23. package/dist/node/modes/print-mode.js.map +1 -0
  24. package/dist/node/modes/shell-exec.cjs +1 -0
  25. package/dist/node/modes/shell-exec.js +2 -0
  26. package/dist/node/modes/shell-exec.js.map +1 -0
  27. package/dist/node/modes/tui-mode.cjs +1 -0
  28. package/dist/node/modes/tui-mode.js +2 -0
  29. package/dist/node/modes/tui-mode.js.map +1 -0
  30. package/dist/node/startup/append-system-prompt.cjs +3 -0
  31. package/dist/node/startup/append-system-prompt.js +4 -0
  32. package/dist/node/startup/append-system-prompt.js.map +1 -0
  33. package/dist/node/startup/args-to-options.cjs +1 -0
  34. package/dist/node/startup/args-to-options.js +2 -0
  35. package/dist/node/startup/args-to-options.js.map +1 -0
  36. package/dist/node/startup/command-setup.cjs +1 -0
  37. package/dist/node/startup/command-setup.d.ts +11 -0
  38. package/dist/node/startup/command-setup.d.ts.map +1 -0
  39. package/dist/node/startup/command-setup.js +2 -0
  40. package/dist/node/startup/command-setup.js.map +1 -0
  41. package/dist/node/startup/config-phase.cjs +1 -0
  42. package/dist/node/startup/config-phase.js +2 -0
  43. package/dist/node/startup/config-phase.js.map +1 -0
  44. package/dist/node/startup/preflight.cjs +1 -0
  45. package/dist/node/startup/preflight.js +2 -0
  46. package/dist/node/startup/preflight.js.map +1 -0
  47. package/dist/node/startup/provider-setup.cjs +1 -0
  48. package/dist/node/startup/provider-setup.js +2 -0
  49. package/dist/node/startup/provider-setup.js.map +1 -0
  50. package/dist/node/startup/provider-startup.cjs +2 -0
  51. package/dist/node/startup/provider-startup.js +3 -0
  52. package/dist/node/startup/provider-startup.js.map +1 -0
  53. package/dist/node/startup/reset-config.cjs +1 -0
  54. package/dist/node/startup/reset-config.js +2 -0
  55. package/dist/node/startup/reset-config.js.map +1 -0
  56. package/dist/node/startup/session-setup.cjs +1 -0
  57. package/dist/node/startup/session-setup.js +2 -0
  58. package/dist/node/startup/session-setup.js.map +1 -0
  59. package/dist/node/startup/subagent-setup.cjs +1 -0
  60. package/dist/node/startup/subagent-setup.js +2 -0
  61. package/dist/node/startup/subagent-setup.js.map +1 -0
  62. package/dist/node/startup/update-notice.cjs +1 -0
  63. package/dist/node/startup/update-notice.js +2 -0
  64. package/dist/node/startup/update-notice.js.map +1 -0
  65. package/dist/node/startup/version.cjs +1 -0
  66. package/dist/node/startup/version.js +2 -0
  67. package/dist/node/startup/version.js.map +1 -0
  68. package/dist/node/user-local-direct-command.cjs +1 -0
  69. package/dist/node/user-local-direct-command.js +2 -0
  70. package/dist/node/user-local-direct-command.js.map +1 -0
  71. package/dist/node/utils/cli-args.cjs +35 -0
  72. package/dist/node/utils/cli-args.js +36 -0
  73. package/dist/node/utils/cli-args.js.map +1 -0
  74. package/package.json +25 -8
package/README.md CHANGED
@@ -1,32 +1,68 @@
1
1
  **Language:** [English](README.md) | [한국어](docs/README-KO.md)
2
2
 
3
+ > **Beta software** — currently `3.0.0-beta`. APIs and behavior may change before stable release.
4
+ > Please [report issues](https://github.com/woojubb/robota/issues) to help us improve.
5
+
3
6
  # @robota-sdk/agent-cli
4
7
 
5
8
  AI coding assistant CLI built on Robota SDK. Loads AGENTS.md/CLAUDE.md for project context and provides a tool-calling REPL with Claude Code-compatible permission modes.
6
9
 
10
+ ## Why Robota?
11
+
12
+ | | Robota | Claude Code | Aider |
13
+ | ------------------------------------------------- | :----: | :---------: | :---: |
14
+ | Multi-provider (Anthropic, OpenAI, Gemini, Qwen…) | ✅ | ❌ | ✅ |
15
+ | Embed SDK in your own app | ✅ | ❌ | ❌ |
16
+ | Local models (LM Studio, Ollama via OpenAI API) | ✅ | ❌ | ✅ |
17
+ | Open source (MIT) | ✅ | partial | ✅ |
18
+ | Claude Code config compatible (CLAUDE.md, modes) | ✅ | — | ❌ |
19
+
20
+ ## Embed in Your App
21
+
22
+ ```typescript
23
+ import { createAgentRuntime } from '@robota-sdk/agent-framework';
24
+ import { createAnthropicProvider } from '@robota-sdk/agent-provider';
25
+
26
+ const runtime = createAgentRuntime({
27
+ provider: createAnthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY }),
28
+ });
29
+ const session = runtime.createSession({ permissionMode: 'bypassPermissions' });
30
+ const response = await session.submit('Explain this codebase');
31
+ ```
32
+
7
33
  ## Prerequisites
8
34
 
9
- Node.js **22 or higher** is required.
35
+ Node.js **22 or higher** is required. The TUI renderer ([ink 7.x](https://github.com/vadimdemedes/ink)) requires Node.js 22+.
10
36
 
11
37
  ```bash
12
38
  node --version # Must output v22.x.x or higher
13
39
  ```
14
40
 
15
- If your version is below 22, upgrade using [nvm](https://github.com/nvm-sh/nvm):
41
+ If your version is below 22, upgrade using one of:
16
42
 
17
43
  ```bash
18
- nvm install 22
19
- nvm use 22
44
+ # nvm
45
+ nvm install 22 && nvm use 22
46
+
47
+ # Volta
48
+ volta install node@22
20
49
  ```
21
50
 
51
+ ## Demo
52
+
53
+ <!-- TODO: Add demo GIF here -->
54
+ <!-- Run `pnpm demo:record` to capture a demo recording — see docs/demo-script.md for instructions -->
55
+
56
+ ![Demo](./docs/demo.gif)
57
+
22
58
  ## Installation
23
59
 
24
60
  ```bash
25
- # Global install
26
- npm install -g @robota-sdk/agent-cli
27
-
28
- # Or run directly with npx
61
+ # Try it now — no install needed
29
62
  npx @robota-sdk/agent-cli
63
+
64
+ # Install globally for persistent use
65
+ npm install -g @robota-sdk/agent-cli
30
66
  ```
31
67
 
32
68
  > **macOS users**: Korean/CJK IME input may crash macOS Terminal.app. Use **[iTerm2](https://iterm2.com/)** instead. This is a known Ink + Terminal.app issue shared with Claude Code.
@@ -41,11 +77,14 @@ robota -p "List all files" # Print mode (one-shot, exit after response)
41
77
 
42
78
  ### Environment Variables
43
79
 
44
- | Variable | Description | Required |
45
- | ------------------- | ---------------------------------------------- | -------------- |
46
- | `ANTHROPIC_API_KEY` | Anthropic API key for the `anthropic` provider | Anthropic only |
47
- | `DEEPSEEK_API_KEY` | DeepSeek API key for the `deepseek` provider | DeepSeek only |
48
- | `DASHSCOPE_API_KEY` | Alibaba Cloud Model Studio key for `qwen` | Qwen only |
80
+ | Variable | Description | Provider |
81
+ | ------------------- | -------------------------------------------------------- | --------- |
82
+ | `ANTHROPIC_API_KEY` | Anthropic API key | Anthropic |
83
+ | `OPENAI_API_KEY` | OpenAI API key | OpenAI |
84
+ | `GEMINI_API_KEY` | Google Gemini API key | Gemini |
85
+ | `DEEPSEEK_API_KEY` | DeepSeek API key | DeepSeek |
86
+ | `DASHSCOPE_API_KEY` | Alibaba Cloud Model Studio key | Qwen |
87
+ | `BRAVE_API_KEY` | Brave Search API key (optional — enables WebSearch tool) | WebSearch |
49
88
 
50
89
  Set your key before running:
51
90
 
@@ -87,13 +126,15 @@ robota "prompt" # REPL with initial prompt
87
126
  robota -p "prompt" # Print mode (one-shot, exit after response)
88
127
  robota -c # Continue last session
89
128
  robota -r <session-id> # Resume session by ID
90
- robota --model <model> # Model override (e.g., claude-sonnet-4-6)
91
129
  robota --language <lang> # Response language (ko, en, ja, zh)
92
130
  robota --permission-mode <mode> # plan | default | acceptEdits | bypassPermissions
93
131
  robota --max-turns <n> # Limit agentic turns per interaction
94
132
  robota --output-format <fmt> # text | json | stream-json (print mode)
95
133
  robota --system-prompt <text> # Replace system prompt (print mode)
96
134
  robota --append-system-prompt <text> # Append to system prompt (print mode)
135
+ robota --model claude-opus-4-7 # Override provider model for this session
136
+ robota --allowed-tools "Bash,Read" # Whitelist specific tools
137
+ robota --denied-tools "Bash,Write" # Blacklist specific tools (denied > allowed)
97
138
  robota --reset # Delete user settings and exit
98
139
  robota --check-update # Check npm for a newer CLI version and exit
99
140
  robota --disable-update-check # Skip interactive startup update check for this run
@@ -126,9 +167,20 @@ Print mode (`-p`) supports three output formats via `--output-format`:
126
167
  | `json` | Single JSON object: `{ type, result, session_id, subtype }` |
127
168
  | `stream-json` | Newline-delimited JSON with `content_block_delta` streaming events |
128
169
 
170
+ ### Exit Codes (print mode)
171
+
172
+ | Code | Meaning |
173
+ | ---- | ---------------------------------------------- |
174
+ | 0 | Success |
175
+ | 1 | General error |
176
+ | 2 | Argument error |
177
+ | 3 | Configuration error (missing provider/API key) |
178
+ | 4 | API error |
179
+ | 5 | Tool execution error |
180
+
129
181
  ### Stdin Pipe
130
182
 
131
- When `-p` is used without a positional argument and stdin is piped, the CLI reads from stdin:
183
+ When stdin is piped, the CLI reads it automatically. If a positional prompt is also given, the piped content is appended inside `<stdin>` tags:
132
184
 
133
185
  ```bash
134
186
  echo "Explain this error" | robota -p
@@ -161,16 +213,18 @@ Non-interactive/headless mode never prompts. Configure a provider ahead of time
161
213
 
162
214
  The AI agent can invoke 8 local tools:
163
215
 
164
- | Tool | Description | Primary Argument |
165
- | ----------- | ------------------------------------ | ---------------- |
166
- | `Bash` | Execute shell commands | `command` |
167
- | `Read` | Read file contents with line numbers | `filePath` |
168
- | `Write` | Write content to a file | `filePath` |
169
- | `Edit` | Replace a string in a file | `filePath` |
170
- | `Glob` | Find files matching a pattern | `pattern` |
171
- | `Grep` | Search file contents with regex | `pattern` |
172
- | `WebFetch` | Fetch URL content as text | `url` |
173
- | `WebSearch` | Search the internet | `query` |
216
+ | Tool | Description | Primary Argument |
217
+ | ----------- | ---------------------------------------------- | ---------------- |
218
+ | `Bash` | Execute shell commands | `command` |
219
+ | `Read` | Read file contents with line numbers | `filePath` |
220
+ | `Write` | Write content to a file | `filePath` |
221
+ | `Edit` | Replace a string in a file | `filePath` |
222
+ | `Glob` | Find files matching a pattern | `pattern` |
223
+ | `Grep` | Search file contents with regex | `pattern` |
224
+ | `WebFetch` | Fetch URL content as text | `url` |
225
+ | `WebSearch` | Search the internet (requires `BRAVE_API_KEY`) | `query` |
226
+
227
+ > **WebSearch** requires a `BRAVE_API_KEY` environment variable. Without it, the tool returns a setup message instead of results. Get a free key at [brave.com/search/api](https://brave.com/search/api/) (2,000 queries/month free tier).
174
228
 
175
229
  ## Recent TUI Capabilities
176
230
 
@@ -290,23 +344,50 @@ When a session has a name, it appears in three places:
290
344
 
291
345
  ## Slash Commands
292
346
 
347
+ Typing `/` in the TUI opens an autocomplete popup. Arrow keys navigate, Tab inserts without executing, Enter executes. Subcommands (e.g., `/provider list`) show a nested submenu.
348
+
349
+ ### Session & Context
350
+
293
351
  | Command | Description |
294
352
  | ------------------------- | ---------------------------------------------------------------------- |
295
- | `/help` | Show available commands |
296
353
  | `/clear` | Clear conversation history |
297
- | `/model [model]` | Select AI model (confirmation prompt, CLI restarts) |
298
- | `/language [lang]` | Set response language (ko, en, ja, zh), saves and restarts |
299
354
  | `/compact [instructions]` | Compress context window |
300
- | `/cost` | Show session info |
301
355
  | `/context` | Context window details, reference inventory, and auto-compact controls |
302
- | `/agent` | Run and manage background subagent jobs |
303
- | `/permissions [mode]` | Show permission rules or change permission mode |
304
- | `/plugin [subcommand]` | Plugin management |
356
+ | `/cost` | Show session token usage and cost |
305
357
  | `/resume` | List recent sessions and resume one |
306
358
  | `/rename <name>` | Rename the current session |
307
- | `/exit` | Exit CLI |
308
-
309
- Typing `/` triggers an autocomplete popup with arrow-key navigation and Esc to dismiss. Tab inserts the highlighted command into the input field without executing — continue typing args or press Enter to execute. Enter selects and executes immediately. Commands with subcommands (e.g., `/permissions`, `/model`) show a nested submenu. Skill commands discovered from `.agents/skills/` and `.claude/commands/` appear alongside built-in commands.
359
+ | `/rewind` | List, inspect, restore, or rollback edit checkpoints |
360
+
361
+ ### Providers & Settings
362
+
363
+ | Command | Description |
364
+ | ------------------------ | -------------------------------------------------------------------- | ------- | -------------------------------------------------- |
365
+ | `/provider [subcommand]` | Manage provider profiles: `list`, `switch`, `add`, `test`, `current` |
366
+ | `/mode [mode]` | Show or switch permission mode |
367
+ | `/permissions [mode]` | Show permission rules or change permission mode |
368
+ | `/settings` | Open transport settings (enable/disable transports) |
369
+ | `/language [lang]` | Set response language (ko, en, ja, zh), saves and restarts |
370
+ | `/statusline [on | off | reset]` | Configure status-line fields (model, context, git) |
371
+
372
+ ### Tools & Memory
373
+
374
+ | Command | Description |
375
+ | ---------------------- | ---------------------------------------------- |
376
+ | `/memory [subcommand]` | Inspect, add, or review project memory entries |
377
+ | `/background` | List and control background tasks |
378
+ | `/agent` | Run and manage background subagent jobs |
379
+ | `/skills [name]` | List registered skills or activate one by name |
380
+ | `/plugin [subcommand]` | Plugin management |
381
+
382
+ ### Utility
383
+
384
+ | Command | Description |
385
+ | -------- | -------------------------------------------------- |
386
+ | `/help` | Show available commands |
387
+ | `/reset` | Delete user settings and return to first-run state |
388
+ | `/exit` | Exit CLI |
389
+
390
+ Skill commands discovered from `.agents/skills/` and `.claude/commands/` appear alongside built-in commands.
310
391
 
311
392
  ## Plugin Management
312
393
 
package/bin/robota.cjs CHANGED
@@ -13,13 +13,17 @@ if (nodeMajor < REQUIRED_NODE_MAJOR) {
13
13
  ' or higher.\n' +
14
14
  ' Current version: ' +
15
15
  process.versions.node +
16
- '\n\n' +
16
+ '\n' +
17
+ ' (Reason: the TUI renderer ink 7.x requires Node.js 22+)\n\n' +
17
18
  ' Upgrade options:\n' +
18
19
  ' nvm: nvm install ' +
19
20
  REQUIRED_NODE_MAJOR +
20
21
  ' && nvm use ' +
21
22
  REQUIRED_NODE_MAJOR +
22
23
  '\n' +
24
+ ' Volta: volta install node@' +
25
+ REQUIRED_NODE_MAJOR +
26
+ '\n' +
23
27
  ' Download: https://nodejs.org/en/download\n\n',
24
28
  );
25
29
  process.exit(1);
@@ -1 +1,2 @@
1
+
1
2
  export { };
package/dist/node/bin.js CHANGED
@@ -1,9 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import{applyProviderConfiguration as e,applyProviderSwitch as t,checkForCliUpdate as n,createAgentRuntime as r,createProjectSessionStore as i,createProviderFromSettings as a,formatCliUpdateCheckMessage as o,formatCliUpdateNotice as s,getStartupCliUpdateNotice as c,getUserSettingsPath as l,projectPaths as u,readMergedProviderSettings as d,readPackageVersion as f,readProviderSettings as p,readSettings as m,resetUserConfig as ee,resolveLatestSessionId as h,resolveProviderSettingsWriteTargetPath as g,resolveSessionIdByIdOrName as _,resolveSettingsPathForScope as v,shouldRunStartupCliUpdateCheck as te,writeSettings as y}from"@robota-sdk/agent-framework";import{createDefaultTransportRegistry as ne}from"@robota-sdk/agent-transport";import{PrintTerminal as b,createHeadlessTransport as x,promptInput as S}from"@robota-sdk/agent-transport/headless";import{readFileSync as C}from"node:fs";import{resolve as w}from"node:path";import{execSync as T}from"node:child_process";import{TuiTransport as E,createDefaultTuiCliAdapter as D}from"@robota-sdk/agent-transport/tui";import{createDefaultCommandModules as O,createDefaultPluginCommandAdapter as k,ensureProviderConfig as A,executeUserLocalDirectCommand as j,reloadPluginCommandSource as M,runProviderStartupSetup as N}from"@robota-sdk/agent-command";import{createDefaultProviderDefinitions as P}from"@robota-sdk/agent-provider";import{formatSupportedProviderTypes as F}from"@robota-sdk/agent-core";import{parseArgs as I}from"node:util";import{createChildProcessSubagentRunnerFactory as L}from"@robota-sdk/agent-subagent-runner";function R(e,t){let n=C(w(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function z(e,t){let n=[];return t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile&&n.push(R(e,t.taskFile)),t.jsonSchema&&n.push(`Respond with valid JSON only, matching this JSON schema:\n${t.jsonSchema}`),n.length>0?n.join(`
3
-
4
- `):void 0}const B=`robota-cli`;function V(){return e=>T(e,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd()}async function H(e){let t=e.positional.join(` `).trim();if(!t&&!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);t=Buffer.concat(e).toString(`utf-8`).trim()}return t||(process.stderr.write(`Print mode (-p) requires a prompt argument.
5
- `),process.exit(1)),t}async function U(e,t){let n=await H(e),r=z(t.cwd,e),i=V(),a=t.createSession({permissionMode:e.permissionMode??`bypassPermissions`,maxTurns:e.maxTurns,sessionStore:e.noSessionPersistence?void 0:t.sessionStore,sessionName:e.sessionName,bare:e.bare||void 0,allowedTools:e.allowedTools?e.allowedTools.split(`,`).map(e=>e.trim()).filter(e=>e.length>0):void 0,appendSystemPrompt:r,systemPrompt:e.systemPrompt,shellExec:i,agentName:B}),o=x({outputFormat:e.outputFormat??`text`,prompt:n});a.attachTransport(o),await o.start(),await a.shutdown({reason:`prompt_input_exit`,message:`Headless transport complete`}),process.exit(o.getExitCode())}async function W(e){let{runtime:t,version:n,commandSetup:r,providerSetup:i,sessionSetup:a,sessionOpts:o,startupUpdateNotice:s}=e;await new E({runtime:t,providerOverride:i.activeProfileName,providerType:i.providerSettings.name,modelId:i.modelId,language:o.language,permissionMode:o.permissionMode,maxTurns:o.maxTurns,version:n,resumeSessionId:a.resumeSessionId,showSessionPickerOnStart:a.showSessionPickerOnStart,forkSession:o.forkSession,sessionName:o.sessionName,shellExec:V(),startupUpdateNotice:s,cliAdapter:D({providerDefinitions:r.providerDefinitions,reloadPluginCommandSource:r.reloadPluginCommandSource}),agentName:B}).start()}function G(e){return{configure:e.configure,provider:e.provider,settingsScope:e.settingsScope,configureProvider:e.configureProvider,providerType:e.providerType,model:e.model,apiKey:e.apiKey,apiKeyEnv:e.apiKeyEnv,baseURL:e.baseURL,setCurrent:e.setCurrent,printMode:e.printMode,positional:e.positional}}function K(e){return{positional:e.positional,language:e.language,permissionMode:e.permissionMode,maxTurns:e.maxTurns,sessionName:e.sessionName,noSessionPersistence:e.noSessionPersistence,continueMode:e.continueMode,resumeId:e.resumeId,forkSession:e.forkSession,outputFormat:e.outputFormat,bare:e.bare,allowedTools:e.allowedTools,systemPrompt:e.systemPrompt,appendSystemPrompt:e.appendSystemPrompt,taskFile:e.taskFile,jsonSchema:e.jsonSchema}}function q(e){return{positional:e.positional,format:e.format,summary:e.summary,source:e.source}}function re(e){return{printMode:e.printMode,disableUpdateCheck:e.disableUpdateCheck}}function J(e,t={}){let n={settings:{read:()=>m(l()),write:e=>y(l(),e)},plugin:k(e)},r=t.providerDefinitions??P();return{commandHostAdapters:n,providerDefinitions:r,commandModules:[...O({cwd:e,providerDefinitions:r,providerSettingsAdapter:{readMergedSettings:()=>d(e),readTargetSettings:()=>m(g(e)),writeTargetSettings:t=>y(g(e),t)}}),...t.commandModules??[]],reloadPluginCommandSource:M}}function Y(e){if(e===void 0||e===`user`||e===`project-local`)return e;throw Error(`Invalid --settings-scope "${e}". Valid: user | project-local`)}function X(n,r,i,a){let o=v(n,Y(r.settingsScope));return r.configureProvider?(e(o,oe(r),{providerDefinitions:a}),i.writeLine(`Provider profile saved to ${o}`),!r.printMode&&r.positional.length===0):r.provider&&r.setCurrent?(t(r.settingsScope===void 0?g(n):o,r.provider,{knownProviders:d(n).providers}),i.writeLine(`Current provider set to ${r.provider}`),!r.printMode&&r.positional.length===0):!1}async function ie(e,t,n,r,i,a){await A(e,{provider:t.provider,settingsScope:Y(t.settingsScope)},n,r,i,{formatError:se,isInteractive:()=>a})}async function ae(e,t,n,r,i){await N(e,{settingsScope:Y(t.settingsScope)},n,r,i)}function oe(e){let t=e.providerType??e.configureProvider;if(!e.configureProvider||!t)throw Error(`--configure-provider requires a provider profile and --type`);return{profile:e.configureProvider,type:t,...e.model!==void 0&&{model:e.model},...e.apiKey!==void 0&&{apiKey:e.apiKey},...e.apiKeyEnv!==void 0&&{apiKeyEnv:e.apiKeyEnv},...e.baseURL!==void 0&&{baseURL:e.baseURL},setCurrent:e.setCurrent}}function se(e){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${F(e)}`,...e.map(ce)].join(`
6
- `)}function ce(e){return` ${[`robota --configure-provider ${e.type}`,`--type ${e.type}`,...e.defaults?.baseURL===void 0?[]:[`--base-url <url>`],`--model <model>`,...e.requiresApiKey===!0?[`--api-key-env <ENV_NAME>`]:[],`--set-current`].join(` `)}`}async function le(e,t,n,r,i){return t.configure?(await ae(e,t,S,r,n.providerDefinitions),{handled:!0}):X(e,t,r,n.providerDefinitions)?{handled:!0}:(await ie(e,t,S,r,n.providerDefinitions,i),{handled:!1})}const Z=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],Q=[`text`,`json`,`stream-json`];function ue(){return`
2
+ ;(function(){var v=parseInt(process.versions.node.split('.')[0],10);if(v<22){process.stderr.write('\n✗ Node.js 22+ is required (current: '+process.version+')\n\nUpgrade:\n nvm: nvm install 22 && nvm use 22\n Volta: volta install node@22\n Download: https://nodejs.org/en/download\n\n');process.exit(1);}})();
3
+ import{execSync as e}from"node:child_process";import{PrintTerminal as t,createHeadlessTransport as n,promptInput as r}from"@robota-sdk/agent-transport/headless";import{InteractiveSession as i,applyProviderConfiguration as a,applyProviderSwitch as o,checkForCliUpdate as s,createProjectSessionStore as c,createProviderFromSettings as l,formatCliUpdateCheckMessage as u,formatCliUpdateNotice as d,getStartupCliUpdateNotice as f,getUserSettingsPath as p,projectPaths as m,readMergedProviderSettings as h,readPackageVersion as g,readProviderSettings as _,readSettings as v,resetUserConfig as y,resolveLatestSessionId as b,resolveProviderSettingsWriteTargetPath as x,resolveSessionIdByIdOrName as S,resolveSettingsPathForScope as C,shouldRunStartupCliUpdateCheck as w,writeSettings as T}from"@robota-sdk/agent-framework";import{parseArgs as E}from"node:util";import{formatSupportedProviderTypes as D}from"@robota-sdk/agent-core";import{createDefaultProviderDefinitions as O}from"@robota-sdk/agent-provider";import{createDefaultCommandModules as k,createDefaultPluginCommandAdapter as A,ensureProviderConfig as j,executeUserLocalDirectCommand as ee,reloadPluginCommandSource as M,runProviderStartupSetup as N}from"@robota-sdk/agent-command";import{TuiTransport as P,createDefaultTuiCliAdapter as F}from"@robota-sdk/agent-transport/tui";import{createDefaultTransportRegistry as I}from"@robota-sdk/agent-transport";import{createDefaultBackgroundTaskRunners as L}from"@robota-sdk/agent-executor";import{createChildProcessSubagentRunnerFactory as R,getDefaultSubagentWorkerPath as z}from"@robota-sdk/agent-subagent-runner";import{readFileSync as B}from"node:fs";import{resolve as V}from"node:path";const H=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],U=[`text`,`json`,`stream-json`];function W(){return`
7
4
  Usage: robota [options] [-p <prompt>]
8
5
 
9
6
  Options:
@@ -13,24 +10,42 @@ Options:
13
10
  --append-system-prompt <t> Append text to the system prompt
14
11
  --language <lang> Language preference (e.g. ko, en)
15
12
  --no-session-persistence Disable session persistence for this run
16
- --model <model> Override model for this session
17
13
  --permission-mode <mode> Permission mode: plan | default | acceptEdits | bypassPermissions
18
14
  --max-turns <n> Maximum agent turns before stopping
19
15
  -c, --continue Continue the most recent session
20
16
  -r, --resume <id> Resume a session by ID or name
21
17
  -n, --name <name> Name for the new session
22
- --fork-session Fork the current session
18
+ --fork-session Fork the current session into a new independent session
19
+ --task-file <path> Read a task prompt from file and append it to the system prompt
20
+ --bare Print mode: output raw text only, no formatting wrapper
23
21
  --configure Run interactive provider configuration
24
22
  --configure-provider <n> Configure a specific provider
23
+ --dry-run Plan-only run: show what the agent would do without modifying files
25
24
  --check-update Check for CLI updates
26
25
  --version Show version number
27
26
  -h, --help Show this help message
28
27
 
28
+ Commands:
29
+ robota init Initialize AGENTS.md and .robota/settings.json
30
+
29
31
  Examples:
30
32
  robota Start interactive TUI session
33
+ robota init Initialize project files
31
34
  robota -p "Hello" Print mode: send prompt and exit
32
35
  robota -p "Hello" --output-format json
36
+ robota -p "Review this diff" --bare Raw output for shell pipelines
37
+ robota --task-file task.md Run task from file (appended to system prompt)
38
+ robota --dry-run "Refactor the auth module" Show plan without modifying files
33
39
  robota --continue Resume the last session
34
- `}function de(e){if(e!==void 0){if(!Q.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${Q.join(` | `)}`);return e}}function fe(e){if(e!==void 0){if(!Z.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${Z.join(` | `)}`);return e}}function pe(e){if(e===void 0)return;let t=parseInt(e,10);if(isNaN(t)||t<=0)throw Error(`Invalid --max-turns "${e}". Must be a positive integer.`);return t}const me={allowPositionals:!0,options:{help:{type:`boolean`,short:`h`,default:!1},p:{type:`boolean`,short:`p`,default:!1},continue:{type:`boolean`,short:`c`,default:!1},resume:{type:`string`,short:`r`},model:{type:`string`},language:{type:`string`},"permission-mode":{type:`string`},"max-turns":{type:`string`},"fork-session":{type:`boolean`,default:!1},name:{type:`string`,short:`n`},"output-format":{type:`string`},format:{type:`string`},summary:{type:`string`},source:{type:`string`},"system-prompt":{type:`string`},"append-system-prompt":{type:`string`},"task-file":{type:`string`},version:{type:`boolean`,default:!1},reset:{type:`boolean`,default:!1},bare:{type:`boolean`,default:!1},"allowed-tools":{type:`string`},"no-session-persistence":{type:`boolean`,default:!1},"json-schema":{type:`string`},configure:{type:`boolean`,default:!1},"configure-provider":{type:`string`},provider:{type:`string`},type:{type:`string`},"base-url":{type:`string`},"api-key":{type:`string`},"api-key-env":{type:`string`},"set-current":{type:`boolean`,default:!1},"settings-scope":{type:`string`},"check-update":{type:`boolean`,default:!1},"disable-update-check":{type:`boolean`,default:!1}}};function he(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,model:e.model,language:e.language,permissionMode:fe(e[`permission-mode`]),maxTurns:pe(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:de(e[`output-format`]),format:e.format,summary:e.summary,source:e.source,systemPrompt:e[`system-prompt`],appendSystemPrompt:e[`append-system-prompt`],taskFile:e[`task-file`],version:e.version??!1,reset:e.reset??!1,bare:e.bare??!1,allowedTools:e[`allowed-tools`],noSessionPersistence:e[`no-session-persistence`]??!1,jsonSchema:e[`json-schema`],configure:e.configure??!1,configureProvider:e[`configure-provider`],provider:e.provider,providerType:e.type,baseURL:e[`base-url`],apiKey:e[`api-key`],apiKeyEnv:e[`api-key-env`],setCurrent:e[`set-current`]??!1,settingsScope:e[`settings-scope`],checkUpdate:e[`check-update`]??!1,disableUpdateCheck:e[`disable-update-check`]??!1}}function ge(){let{values:e,positionals:t}=I(me);return he(e,t)}function _e(e){let t=ee();t.deleted?e.writeLine(`Deleted ${t.path}`):e.writeLine(`No user settings found.`)}async function ve(e,t){if(e.help)return t.terminal.write(ue()),{handled:!0};if(e.version)return t.terminal.writeLine(`robota ${t.version}`),{handled:!0};if(e.checkUpdate){let e=await n({currentVersion:t.version,force:!0}),r=o(e);if(e.status===`error`)throw Error(r);return t.terminal.writeLine(r),{handled:!0}}return e.reset?(_e(t.terminal),{handled:!0}):{handled:!1}}function ye(e){return{subagentRunnerFactory:L({providerConfig:e.providerConfig,logsDir:e.logsDir})}}function be(e,t,n){let r=t.provider?{providerOverride:t.provider,providerDefinitions:n.providerDefinitions}:{providerDefinitions:n.providerDefinitions},i=p(e,r),o=t.model??i.model,s=a(e,t.model,r),c=t.provider??d(e).currentProvider,{subagentRunnerFactory:l}=ye({providerConfig:{...i,model:o},logsDir:u(e).logs});return{provider:s,providerSettings:i,modelId:o,activeProfileName:c,subagentRunnerFactory:l}}function $(e,t){let n=t.noSessionPersistence?void 0:i(e),r,a=!1;if(t.continueMode)r=h(n,e);else if(t.resumeId!==void 0){if(t.resumeId===``)a=!0;else if(r=_(n,t.resumeId),r===void 0)throw Error(`Session not found: ${t.resumeId}`)}return{sessionStore:n,resumeSessionId:r,showSessionPickerOnStart:a}}function xe(e,t){if(te(t))return c({currentVersion:e}).then(e=>e?s(e):void 0)}const Se=()=>f(import.meta.url);async function Ce(e,t,n){if(e.positional[0]!==`user-local`)return!1;let r=await j({cwd:t,argv:e.positional.slice(1),format:e.format,summary:e.summary,source:e.source}),i=r.message.trimEnd();if(!r.success)throw Error(i);return n.writeLine(i),!0}function we(){try{return ge()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}}async function Te(e={}){let t=we(),n=Se(),i=new b;if((await ve(t,{version:n,terminal:i})).handled)return;let a=process.cwd(),o=G(t),s=K(t);try{if(await Ce(q(t),a,i))return}catch(e){i.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let c=process.stdin.isTTY===!0&&process.stdout.isTTY===!0,l=J(a,e);if((await le(a,o,l,i,c)).handled)return;let u=be(a,o,l),d=$(a,s),f=r({cwd:a,provider:u.provider,commandModules:l.commandModules,commandHostAdapters:l.commandHostAdapters,reloadPluginCommandSource:l.reloadPluginCommandSource,subagentRunnerFactory:u.subagentRunnerFactory,sessionStore:d.sessionStore,transportRegistry:ne()});if(o.printMode){await U(s,f);return}await W({runtime:f,version:n,commandSetup:l,providerSetup:u,sessionSetup:d,sessionOpts:s,startupUpdateNotice:xe(n,re(t))}),process.exit(0)}process.on(`uncaughtException`,e=>{let t=e.message??``;if(t.includes(`string-width`)||t.includes(`setCursorPosition`)||t.includes(`getStringWidth`)||t.includes(`slice`)||t.includes(`charCodeAt`)){process.stderr.write(`[robota] IME error suppressed: ${t}\n`);return}throw e}),Te().catch(e=>{let t=e instanceof Error?e.message:String(e);process.stderr.write(t+`
40
+ `}function G(e){if(e!==void 0){if(!U.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${U.join(` | `)}`);return e}}function K(e){if(e!==void 0){if(!H.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${H.join(` | `)}`);return e}}function q(e){if(e===void 0)return;let t=parseInt(e,10);if(isNaN(t)||t<=0)throw Error(`Invalid --max-turns "${e}". Must be a positive integer.`);return t}const te={allowPositionals:!0,options:{help:{type:`boolean`,short:`h`,default:!1},p:{type:`boolean`,short:`p`,default:!1},continue:{type:`boolean`,short:`c`,default:!1},resume:{type:`string`,short:`r`},language:{type:`string`},"permission-mode":{type:`string`},"max-turns":{type:`string`},"fork-session":{type:`boolean`,default:!1},name:{type:`string`,short:`n`},"output-format":{type:`string`},format:{type:`string`},summary:{type:`string`},source:{type:`string`},"system-prompt":{type:`string`},"append-system-prompt":{type:`string`},"task-file":{type:`string`},version:{type:`boolean`,default:!1},reset:{type:`boolean`,default:!1},bare:{type:`boolean`,default:!1},"allowed-tools":{type:`string`},"denied-tools":{type:`string`},model:{type:`string`},"no-session-persistence":{type:`boolean`,default:!1},"json-schema":{type:`string`},configure:{type:`boolean`,default:!1},"configure-provider":{type:`string`},provider:{type:`string`},type:{type:`string`},"base-url":{type:`string`},"api-key":{type:`string`},"api-key-env":{type:`string`},"set-current":{type:`boolean`,default:!1},"settings-scope":{type:`string`},"check-update":{type:`boolean`,default:!1},"disable-update-check":{type:`boolean`,default:!1},"dry-run":{type:`boolean`,default:!1},yes:{type:`boolean`,short:`y`,default:!1}}};function J(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,language:e.language,permissionMode:K(e[`permission-mode`]),maxTurns:q(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:G(e[`output-format`]),format:e.format,summary:e.summary,source:e.source,systemPrompt:e[`system-prompt`],appendSystemPrompt:e[`append-system-prompt`],taskFile:e[`task-file`],version:e.version??!1,reset:e.reset??!1,bare:e.bare??!1,allowedTools:e[`allowed-tools`],deniedTools:e[`denied-tools`],model:e.model,noSessionPersistence:e[`no-session-persistence`]??!1,jsonSchema:e[`json-schema`],configure:e.configure??!1,configureProvider:e[`configure-provider`],provider:e.provider,providerType:e.type,baseURL:e[`base-url`],apiKey:e[`api-key`],apiKeyEnv:e[`api-key-env`],setCurrent:e[`set-current`]??!1,settingsScope:e[`settings-scope`],checkUpdate:e[`check-update`]??!1,disableUpdateCheck:e[`disable-update-check`]??!1,dryRun:e[`dry-run`]??!1,yes:e.yes??!1}}function Y(){let{values:e,positionals:t}=E(te);return J(e,t)}function X(e){if(e===void 0||e===`user`||e===`project-local`)return e;throw Error(`Invalid --settings-scope "${e}". Valid: user | project-local`)}function Z(e,t,n,r=O()){let i=C(e,X(t.settingsScope));return t.configureProvider?(a(i,re(t),{providerDefinitions:r}),n.writeLine(`Provider profile saved to ${i}`),!t.printMode&&t.positional.length===0):t.provider&&t.setCurrent?(o(t.settingsScope===void 0?x(e):i,t.provider,{knownProviders:h(e).providers}),n.writeLine(`Current provider set to ${t.provider}`),!t.printMode&&t.positional.length===0):!1}async function Q(e,t,n,r,i=O(),a){await j(e,{provider:t.provider,settingsScope:X(t.settingsScope)},n,r,i,{formatError:ie,isInteractive:a===void 0?()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0:()=>a})}async function ne(e,t,n,r,i=O()){await N(e,{settingsScope:X(t.settingsScope)},n,r,i)}function re(e){let t=e.providerType??e.configureProvider;if(!e.configureProvider||!t)throw Error(`--configure-provider requires a provider profile and --type`);return{profile:e.configureProvider,type:t,...e.model!==void 0&&{model:e.model},...e.apiKey!==void 0&&{apiKey:e.apiKey},...e.apiKeyEnv!==void 0&&{apiKeyEnv:e.apiKeyEnv},...e.baseURL!==void 0&&{baseURL:e.baseURL},setCurrent:e.setCurrent}}function ie(e=O()){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${D(e)}`,...e.map(ae)].join(`
41
+ `)}function ae(e){return` ${[`robota --configure-provider ${e.type}`,`--type ${e.type}`,...e.defaults?.baseURL===void 0?[]:[`--base-url <url>`],`--model <model>`,...e.requiresApiKey===!0?[`--api-key-env <ENV_NAME>`]:[],`--set-current`].join(` `)}`}async function oe(e,t,n){if(e.positional[0]!==`user-local`)return!1;let r=await ee({cwd:t,argv:e.positional.slice(1),format:e.format,summary:e.summary,source:e.source}),i=r.message.trimEnd();if(!r.success)throw Error(i);return n.writeLine(i),!0}const $=()=>g(import.meta.url);function se(e){let t=y();t.deleted?e.writeLine(`Deleted ${t.path}`):e.writeLine(`No user settings found.`)}function ce(e,t,n,r){let i={settings:{read:()=>v(p()),write:e=>T(p(),e)},plugin:A(e)},a=n.providerDefinitions??O();return{commandHostAdapters:i,providerDefinitions:a,commandModules:[...k({cwd:e,providerDefinitions:a,providerSettingsAdapter:{readMergedSettings:()=>h(e),readTargetSettings:()=>v(x(e)),writeTargetSettings:t=>T(x(e),t)}}),...n.commandModules??[]],startupUpdateNoticePromise:w(t)?f({currentVersion:r}):void 0}}function le(e,t){let n=B(V(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function ue(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(le(e,t.taskFile))}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}return t.jsonSchema&&n.push(`Respond with valid JSON only, matching this JSON schema:\n${t.jsonSchema}`),n.length>0?n.join(`
42
+
43
+ `):void 0}async function de(t,r,a,o,s,c,l,u){let d=r.positional.join(` `).trim();if(!d&&!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);d=Buffer.concat(e).toString(`utf-8`).trim()}d||(process.stderr.write(`Print mode (-p) requires a prompt argument.
44
+ `),process.exit(1));let f=ue(t,r),p=t=>e(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),m=new i({cwd:t,provider:a,permissionMode:r.permissionMode??`bypassPermissions`,maxTurns:r.maxTurns,sessionStore:r.noSessionPersistence?void 0:o,sessionName:r.sessionName,bare:r.bare||void 0,allowedTools:r.allowedTools?r.allowedTools.split(`,`).map(e=>e.trim()).filter(e=>e.length>0):void 0,appendSystemPrompt:f,...r.systemPrompt?{systemPrompt:r.systemPrompt}:{},backgroundTaskRunners:s,subagentRunnerFactory:c,commandModules:l,commandHostAdapters:u,shellExec:p,agentName:`robota-cli`}),h=n({outputFormat:r.outputFormat??`text`,prompt:d});m.attachTransport(h),await h.start(),await m.shutdown({reason:`prompt_input_exit`,message:`Headless transport complete`}),process.exit(h.getExitCode())}async function fe(n={}){let i;try{i=Y()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let a=$();if(i.help){process.stdout.write(W());return}if(i.version){process.stdout.write(`robota ${a}\n`);return}if(i.checkUpdate){let e=await s({currentVersion:a,force:!0}),t=u(e);e.status===`error`&&(process.stderr.write(`${t}\n`),process.exit(1)),process.stdout.write(`${t}\n`);return}let o=process.cwd(),f=new t;if(i.reset){se(f);return}try{if(await oe(i,o,f))return}catch(e){f.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let{commandHostAdapters:p,providerDefinitions:h,commandModules:g,startupUpdateNoticePromise:v}=ce(o,i,n,a);if(i.configure){await ne(o,i,r,f,h);return}if(Z(o,i,f,h))return;try{await Q(o,i,r,f,h)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let y=i.provider?{providerOverride:i.provider,providerDefinitions:h}:{providerDefinitions:h},x=_(o,y),C=i.model??x.model,w=l(o,i.model,y),T=L(),E=m(o),D=R({workerPath:z(),providerConfig:{...x,model:C},logsDir:E.logs}),O=c(o),k,A=!1;if(i.continueMode?k=b(O,o):i.resumeId!==void 0&&(i.resumeId===``?A=!0:(k=S(O,i.resumeId),k===void 0&&(process.stderr.write(`Session not found: ${i.resumeId}\n`),process.exit(1)))),i.printMode){await de(o,i,w,O,T,D,g,p);return}await new P({cwd:o,provider:w,providerOverride:i.provider,providerType:x.name,modelId:C,language:i.language,permissionMode:i.permissionMode,maxTurns:i.maxTurns,version:a,sessionStore:i.noSessionPersistence?void 0:O,resumeSessionId:k,showSessionPickerOnStart:A,forkSession:i.forkSession,sessionName:i.sessionName,backgroundTaskRunners:T,subagentRunnerFactory:D,commandModules:g,commandHostAdapters:p,shellExec:t=>e(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:v?v.then(e=>e?d(e):void 0):void 0,transportRegistry:I(),cliAdapter:F({providerDefinitions:h,reloadPluginCommandSource:M}),reloadPluginCommandSource:M,agentName:`robota-cli`}).start(),process.exit(0)}process.on(`uncaughtException`,e=>{let t=e.message??``;if(t.includes(`string-width`)||t.includes(`setCursorPosition`)||t.includes(`getStringWidth`)||t.includes(`slice`)||t.includes(`charCodeAt`)){process.stderr.write(`
45
+ [robota] CJK/IME input error — this is a known issue with macOS Terminal.app.
46
+ Workaround: use iTerm2 (https://iterm2.com) or input your prompt in English.
47
+ Alternatively, use headless mode: robota -p "your prompt here"
48
+
49
+ `);return}throw e}),fe().catch(e=>{let t=e instanceof Error?e.message:String(e);process.stderr.write(t+`
35
50
  `),process.exit(1)});export{};
36
51
  //# sourceMappingURL=bin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","names":[],"sources":["../../src/startup/append-system-prompt.ts","../../src/constants.ts","../../src/modes/shell-exec.ts","../../src/modes/print-mode.ts","../../src/modes/tui-mode.ts","../../src/startup/args-to-options.ts","../../src/startup/command-setup.ts","../../src/startup/provider-startup.ts","../../src/startup/config-phase.ts","../../src/utils/cli-args.ts","../../src/startup/reset-config.ts","../../src/startup/preflight.ts","../../src/startup/subagent-setup.ts","../../src/startup/provider-setup.ts","../../src/startup/session-setup.ts","../../src/startup/update-notice.ts","../../src/startup/version.ts","../../src/user-local-direct-command.ts","../../src/cli.ts","../../src/bin.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nexport interface IAppendSystemPromptOptions {\n appendSystemPrompt?: string;\n taskFile?: string;\n jsonSchema?: string;\n}\n\nfunction readTaskFilePrompt(cwd: string, taskFile: string): string {\n const taskPath = resolve(cwd, taskFile);\n const content = readFileSync(taskPath, 'utf8').trim();\n if (content.length === 0) {\n throw new Error(`Task file is empty: ${taskFile}`);\n }\n return `Task file (${taskFile}):\\n${content}`;\n}\n\nexport function buildAppendSystemPrompt(\n cwd: string,\n opts: IAppendSystemPromptOptions,\n): string | undefined {\n const appendParts: string[] = [];\n if (opts.appendSystemPrompt) appendParts.push(opts.appendSystemPrompt);\n if (opts.taskFile) {\n appendParts.push(readTaskFilePrompt(cwd, opts.taskFile));\n }\n if (opts.jsonSchema)\n appendParts.push(\n `Respond with valid JSON only, matching this JSON schema:\\n${opts.jsonSchema}`,\n );\n return appendParts.length > 0 ? appendParts.join('\\n\\n') : undefined;\n}\n","export const AGENT_CLI_NAME = 'robota-cli';\n","import { execSync } from 'node:child_process';\n\nexport const SHELL_EXEC_TIMEOUT_MS = 5_000;\n\nexport function createShellExec(): (command: string) => string {\n return (command: string): string =>\n execSync(command, {\n timeout: SHELL_EXEC_TIMEOUT_MS,\n encoding: 'utf-8',\n stdio: 'pipe',\n }).trimEnd();\n}\n","import { createHeadlessTransport } from '@robota-sdk/agent-transport/headless';\n\nimport { buildAppendSystemPrompt } from '../startup/append-system-prompt.js';\nimport { AGENT_CLI_NAME } from '../constants.js';\nimport { createShellExec } from './shell-exec.js';\n\nimport type { ISessionRunOptions } from '../startup/args-to-options.js';\nimport type { IAgentRuntime } from '@robota-sdk/agent-framework';\n\nasync function resolvePrompt(opts: ISessionRunOptions): Promise<string> {\n let prompt = opts.positional.join(' ').trim();\n\n if (!prompt && !process.stdin.isTTY) {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n prompt = Buffer.concat(chunks).toString('utf-8').trim();\n }\n\n if (!prompt) {\n process.stderr.write('Print mode (-p) requires a prompt argument.\\n');\n process.exit(1);\n }\n\n return prompt;\n}\n\nexport async function runPrintMode(\n opts: ISessionRunOptions,\n runtime: IAgentRuntime,\n): Promise<void> {\n const prompt = await resolvePrompt(opts);\n const appendSystemPrompt = buildAppendSystemPrompt(runtime.cwd, opts);\n const shellExec = createShellExec();\n\n const session = runtime.createSession({\n permissionMode: opts.permissionMode ?? 'bypassPermissions',\n maxTurns: opts.maxTurns,\n sessionStore: opts.noSessionPersistence ? undefined : runtime.sessionStore,\n sessionName: opts.sessionName,\n bare: opts.bare || undefined,\n allowedTools: opts.allowedTools\n ? opts.allowedTools\n .split(',')\n .map((t) => t.trim())\n .filter((t) => t.length > 0)\n : undefined,\n appendSystemPrompt,\n systemPrompt: opts.systemPrompt,\n shellExec,\n agentName: AGENT_CLI_NAME,\n });\n\n const transport = createHeadlessTransport({\n outputFormat: opts.outputFormat ?? 'text',\n prompt,\n });\n session.attachTransport(transport);\n await transport.start();\n await session.shutdown({ reason: 'prompt_input_exit', message: 'Headless transport complete' });\n process.exit(transport.getExitCode());\n}\n","import { TuiTransport, createDefaultTuiCliAdapter } from '@robota-sdk/agent-transport/tui';\n\nimport type { ISessionRunOptions } from '../startup/args-to-options.js';\nimport type { ICommandSetup } from '../startup/command-setup.js';\nimport type { IProviderSetup } from '../startup/provider-setup.js';\nimport type { ISessionSetup } from '../startup/session-setup.js';\nimport type { IAgentRuntime } from '@robota-sdk/agent-framework';\nimport { AGENT_CLI_NAME } from '../constants.js';\nimport { createShellExec } from './shell-exec.js';\n\nexport interface ITuiModeOptions {\n runtime: IAgentRuntime;\n version: string;\n commandSetup: ICommandSetup;\n providerSetup: IProviderSetup;\n sessionSetup: ISessionSetup;\n sessionOpts: ISessionRunOptions;\n startupUpdateNotice: Promise<string | undefined> | undefined;\n}\n\nexport async function runTuiMode(opts: ITuiModeOptions): Promise<void> {\n const {\n runtime,\n version,\n commandSetup,\n providerSetup,\n sessionSetup,\n sessionOpts,\n startupUpdateNotice,\n } = opts;\n\n const tuiTransport = new TuiTransport({\n runtime,\n providerOverride: providerSetup.activeProfileName,\n providerType: providerSetup.providerSettings.name,\n modelId: providerSetup.modelId,\n language: sessionOpts.language,\n permissionMode: sessionOpts.permissionMode,\n maxTurns: sessionOpts.maxTurns,\n version,\n resumeSessionId: sessionSetup.resumeSessionId,\n showSessionPickerOnStart: sessionSetup.showSessionPickerOnStart,\n forkSession: sessionOpts.forkSession,\n sessionName: sessionOpts.sessionName,\n shellExec: createShellExec(),\n startupUpdateNotice,\n cliAdapter: createDefaultTuiCliAdapter({\n providerDefinitions: commandSetup.providerDefinitions,\n reloadPluginCommandSource: commandSetup.reloadPluginCommandSource,\n }),\n agentName: AGENT_CLI_NAME,\n });\n\n await tuiTransport.start();\n}\n","import type { IParsedCliArgs, TOutputFormat } from '../utils/cli-args.js';\nimport type { TPermissionMode } from '@robota-sdk/agent-core';\n\nexport interface IConfigPhaseOptions {\n configure: boolean;\n provider?: string;\n settingsScope?: string;\n configureProvider?: string;\n providerType?: string;\n model?: string;\n apiKey?: string;\n apiKeyEnv?: string;\n baseURL?: string;\n setCurrent: boolean;\n printMode: boolean;\n positional: readonly string[];\n}\n\nexport interface ISessionRunOptions {\n positional: readonly string[];\n language?: string;\n permissionMode?: TPermissionMode;\n maxTurns?: number;\n sessionName?: string;\n noSessionPersistence: boolean;\n continueMode: boolean;\n resumeId?: string;\n forkSession: boolean;\n outputFormat?: TOutputFormat;\n bare: boolean;\n allowedTools?: string;\n systemPrompt?: string;\n appendSystemPrompt?: string;\n taskFile?: string;\n jsonSchema?: string;\n}\n\nexport interface IUserLocalCommandOptions {\n positional: readonly string[];\n format?: string;\n summary?: string;\n source?: string;\n}\n\nexport interface IStartupUpdatePolicyOptions {\n printMode: boolean;\n disableUpdateCheck: boolean;\n}\n\nexport function toConfigPhaseOptions(args: IParsedCliArgs): IConfigPhaseOptions {\n return {\n configure: args.configure,\n provider: args.provider,\n settingsScope: args.settingsScope,\n configureProvider: args.configureProvider,\n providerType: args.providerType,\n model: args.model,\n apiKey: args.apiKey,\n apiKeyEnv: args.apiKeyEnv,\n baseURL: args.baseURL,\n setCurrent: args.setCurrent,\n printMode: args.printMode,\n positional: args.positional,\n };\n}\n\nexport function toSessionRunOptions(args: IParsedCliArgs): ISessionRunOptions {\n return {\n positional: args.positional,\n language: args.language,\n permissionMode: args.permissionMode,\n maxTurns: args.maxTurns,\n sessionName: args.sessionName,\n noSessionPersistence: args.noSessionPersistence,\n continueMode: args.continueMode,\n resumeId: args.resumeId,\n forkSession: args.forkSession,\n outputFormat: args.outputFormat,\n bare: args.bare,\n allowedTools: args.allowedTools,\n systemPrompt: args.systemPrompt,\n appendSystemPrompt: args.appendSystemPrompt,\n taskFile: args.taskFile,\n jsonSchema: args.jsonSchema,\n };\n}\n\nexport function toUserLocalCommandOptions(args: IParsedCliArgs): IUserLocalCommandOptions {\n return {\n positional: args.positional,\n format: args.format,\n summary: args.summary,\n source: args.source,\n };\n}\n\nexport function toStartupUpdatePolicyOptions(args: IParsedCliArgs): IStartupUpdatePolicyOptions {\n return {\n printMode: args.printMode,\n disableUpdateCheck: args.disableUpdateCheck,\n };\n}\n","import type { IProviderDefinition } from '@robota-sdk/agent-core';\nimport {\n getUserSettingsPath,\n readMergedProviderSettings,\n readSettings,\n resolveProviderSettingsWriteTargetPath,\n writeSettings,\n} from '@robota-sdk/agent-framework';\nimport type {\n ICommandHostAdapters,\n ICommandModule,\n TProviderSettingsDocument,\n} from '@robota-sdk/agent-framework';\nimport type { CommandRegistry } from '@robota-sdk/agent-framework';\nimport {\n createDefaultCommandModules,\n createDefaultPluginCommandAdapter,\n reloadPluginCommandSource,\n} from '@robota-sdk/agent-command';\nimport { createDefaultProviderDefinitions } from '@robota-sdk/agent-provider';\n\nexport interface IStartCliOptions {\n commandModules?: readonly ICommandModule[];\n providerDefinitions?: readonly IProviderDefinition[];\n}\n\nexport interface ICommandSetup {\n commandHostAdapters: ICommandHostAdapters;\n providerDefinitions: readonly IProviderDefinition[];\n commandModules: readonly ICommandModule[];\n reloadPluginCommandSource: (registry: CommandRegistry) => void;\n}\n\nexport function createCommandSetup(cwd: string, options: IStartCliOptions = {}): ICommandSetup {\n const commandHostAdapters: ICommandHostAdapters = {\n settings: {\n read: () => readSettings(getUserSettingsPath()),\n write: (settings) => writeSettings(getUserSettingsPath(), settings),\n },\n plugin: createDefaultPluginCommandAdapter(cwd),\n };\n const providerDefinitions = options.providerDefinitions ?? createDefaultProviderDefinitions();\n const providerSettingsAdapter = {\n readMergedSettings: () => readMergedProviderSettings(cwd),\n readTargetSettings: () =>\n readSettings(resolveProviderSettingsWriteTargetPath(cwd)) as TProviderSettingsDocument,\n writeTargetSettings: (settings: TProviderSettingsDocument) =>\n writeSettings(resolveProviderSettingsWriteTargetPath(cwd), settings),\n };\n const commandModules: readonly ICommandModule[] = [\n ...createDefaultCommandModules({ cwd, providerDefinitions, providerSettingsAdapter }),\n ...(options.commandModules ?? []),\n ];\n return { commandHostAdapters, providerDefinitions, commandModules, reloadPluginCommandSource };\n}\n","import { formatSupportedProviderTypes, type IProviderDefinition } from '@robota-sdk/agent-core';\nimport type { IConfigPhaseOptions } from './args-to-options.js';\nimport {\n applyProviderConfiguration,\n applyProviderSwitch,\n readMergedProviderSettings,\n resolveProviderSettingsWriteTargetPath,\n resolveSettingsPathForScope,\n} from '@robota-sdk/agent-framework';\nimport type { TSettingsScope } from '@robota-sdk/agent-framework';\nimport { type IProviderSetupInput } from '@robota-sdk/agent-framework';\nimport {\n ensureProviderConfig,\n runProviderStartupSetup,\n type TPromptInput,\n} from '@robota-sdk/agent-command';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\n\nfunction validateSettingsScope(scope: string | undefined): TSettingsScope | undefined {\n if (scope === undefined || scope === 'user' || scope === 'project-local') {\n return scope as TSettingsScope | undefined;\n }\n throw new Error(`Invalid --settings-scope \"${scope}\". Valid: user | project-local`);\n}\n\nexport function handleProviderConfigurationArgs(\n cwd: string,\n opts: IConfigPhaseOptions,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[],\n): boolean {\n const settingsPath = resolveSettingsPathForScope(cwd, validateSettingsScope(opts.settingsScope));\n if (opts.configureProvider) {\n applyProviderConfiguration(settingsPath, buildSetupInputFromOptions(opts), {\n providerDefinitions,\n });\n terminal.writeLine(`Provider profile saved to ${settingsPath}`);\n return !opts.printMode && opts.positional.length === 0;\n }\n if (opts.provider && opts.setCurrent) {\n const switchSettingsPath =\n opts.settingsScope === undefined ? resolveProviderSettingsWriteTargetPath(cwd) : settingsPath;\n applyProviderSwitch(switchSettingsPath, opts.provider, {\n knownProviders: readMergedProviderSettings(cwd).providers,\n });\n terminal.writeLine(`Current provider set to ${opts.provider}`);\n return !opts.printMode && opts.positional.length === 0;\n }\n return false;\n}\n\nexport async function ensureConfig(\n cwd: string,\n opts: IConfigPhaseOptions,\n promptInput: TPromptInput,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[],\n isInteractive: boolean,\n): Promise<void> {\n await ensureProviderConfig(\n cwd,\n { provider: opts.provider, settingsScope: validateSettingsScope(opts.settingsScope) },\n promptInput,\n terminal,\n providerDefinitions,\n {\n formatError: formatMissingProviderConfigMessage,\n isInteractive: () => isInteractive,\n },\n );\n}\n\nexport async function runInteractiveProviderSetup(\n cwd: string,\n opts: IConfigPhaseOptions,\n promptInput: TPromptInput,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[],\n): Promise<void> {\n await runProviderStartupSetup(\n cwd,\n { settingsScope: validateSettingsScope(opts.settingsScope) },\n promptInput,\n terminal,\n providerDefinitions,\n );\n}\n\nfunction buildSetupInputFromOptions(opts: IConfigPhaseOptions): IProviderSetupInput {\n const type = opts.providerType ?? opts.configureProvider;\n if (!opts.configureProvider || !type) {\n throw new Error('--configure-provider requires a provider profile and --type');\n }\n return {\n profile: opts.configureProvider,\n type,\n ...(opts.model !== undefined && { model: opts.model }),\n ...(opts.apiKey !== undefined && { apiKey: opts.apiKey }),\n ...(opts.apiKeyEnv !== undefined && { apiKeyEnv: opts.apiKeyEnv }),\n ...(opts.baseURL !== undefined && { baseURL: opts.baseURL }),\n setCurrent: opts.setCurrent,\n };\n}\n\nexport function formatMissingProviderConfigMessage(\n providerDefinitions: readonly IProviderDefinition[],\n): string {\n return [\n 'No provider configuration found.',\n 'Run `robota --configure` in an interactive terminal, or configure a provider:',\n `Supported providers: ${formatSupportedProviderTypes(providerDefinitions)}`,\n ...providerDefinitions.map(formatConfigureProviderExample),\n ].join('\\n');\n}\n\nfunction formatConfigureProviderExample(definition: IProviderDefinition): string {\n const flags = [\n `robota --configure-provider ${definition.type}`,\n `--type ${definition.type}`,\n ...(definition.defaults?.baseURL !== undefined ? ['--base-url <url>'] : []),\n '--model <model>',\n ...(definition.requiresApiKey === true ? ['--api-key-env <ENV_NAME>'] : []),\n '--set-current',\n ];\n return ` ${flags.join(' ')}`;\n}\n","import type { ITerminalOutput } from '@robota-sdk/agent-core';\nimport { promptInput } from '@robota-sdk/agent-transport/headless';\nimport type { IConfigPhaseOptions } from './args-to-options.js';\nimport type { ICommandSetup } from './command-setup.js';\nimport {\n ensureConfig,\n handleProviderConfigurationArgs,\n runInteractiveProviderSetup,\n} from './provider-startup.js';\n\nexport type TConfigPhaseResult = { handled: true } | { handled: false };\n\nexport async function handleConfigPhase(\n cwd: string,\n opts: IConfigPhaseOptions,\n commandSetup: ICommandSetup,\n terminal: ITerminalOutput,\n isInteractive: boolean,\n): Promise<TConfigPhaseResult> {\n if (opts.configure) {\n await runInteractiveProviderSetup(\n cwd,\n opts,\n promptInput,\n terminal,\n commandSetup.providerDefinitions,\n );\n return { handled: true };\n }\n\n if (handleProviderConfigurationArgs(cwd, opts, terminal, commandSetup.providerDefinitions)) {\n return { handled: true };\n }\n\n await ensureConfig(\n cwd,\n opts,\n promptInput,\n terminal,\n commandSetup.providerDefinitions,\n isInteractive,\n );\n\n return { handled: false };\n}\n","/**\n * CLI argument parsing and validation.\n * Pure functions — throw on invalid input, no process.* side effects.\n */\n\nimport { parseArgs } from 'node:util';\n\nimport type { TPermissionMode } from '@robota-sdk/agent-core';\n\nconst VALID_MODES: TPermissionMode[] = ['plan', 'default', 'acceptEdits', 'bypassPermissions'];\n\nconst VALID_OUTPUT_FORMATS = ['text', 'json', 'stream-json'] as const;\nexport type TOutputFormat = (typeof VALID_OUTPUT_FORMATS)[number];\n\nexport interface IParsedCliArgs {\n positional: string[];\n help: boolean;\n printMode: boolean;\n continueMode: boolean;\n resumeId: string | undefined;\n model: string | undefined;\n language: string | undefined;\n permissionMode: TPermissionMode | undefined;\n maxTurns: number | undefined;\n forkSession: boolean;\n sessionName: string | undefined;\n outputFormat: TOutputFormat | undefined;\n format: string | undefined;\n summary: string | undefined;\n source: string | undefined;\n systemPrompt: string | undefined;\n appendSystemPrompt: string | undefined;\n taskFile: string | undefined;\n version: boolean;\n reset: boolean;\n bare: boolean;\n allowedTools: string | undefined;\n noSessionPersistence: boolean;\n jsonSchema: string | undefined;\n configure: boolean;\n configureProvider: string | undefined;\n provider: string | undefined;\n providerType: string | undefined;\n baseURL: string | undefined;\n apiKey: string | undefined;\n apiKeyEnv: string | undefined;\n setCurrent: boolean;\n settingsScope: string | undefined;\n checkUpdate: boolean;\n disableUpdateCheck: boolean;\n}\n\n/** Return CLI usage help text. */\nexport function printHelp(): string {\n return `\nUsage: robota [options] [-p <prompt>]\n\nOptions:\n -p <prompt> Run in print (headless) mode with the given prompt\n --output-format <format> Output format: text | json | stream-json (default: text)\n --system-prompt <text> Override the system prompt for this session\n --append-system-prompt <t> Append text to the system prompt\n --language <lang> Language preference (e.g. ko, en)\n --no-session-persistence Disable session persistence for this run\n --model <model> Override model for this session\n --permission-mode <mode> Permission mode: plan | default | acceptEdits | bypassPermissions\n --max-turns <n> Maximum agent turns before stopping\n -c, --continue Continue the most recent session\n -r, --resume <id> Resume a session by ID or name\n -n, --name <name> Name for the new session\n --fork-session Fork the current session\n --configure Run interactive provider configuration\n --configure-provider <n> Configure a specific provider\n --check-update Check for CLI updates\n --version Show version number\n -h, --help Show this help message\n\nExamples:\n robota Start interactive TUI session\n robota -p \"Hello\" Print mode: send prompt and exit\n robota -p \"Hello\" --output-format json\n robota --continue Resume the last session\n`;\n}\n\n/** Validate and return a TOutputFormat from a raw CLI string, or throw on error. */\nexport function parseOutputFormat(raw: string | undefined): TOutputFormat | undefined {\n if (raw === undefined) return undefined;\n if (!(VALID_OUTPUT_FORMATS as readonly string[]).includes(raw)) {\n throw new Error(`Invalid --output-format \"${raw}\". Valid: ${VALID_OUTPUT_FORMATS.join(' | ')}`);\n }\n return raw as TOutputFormat;\n}\n\n/** Validate and return a TPermissionMode from a raw CLI string, or throw on error. */\nexport function parsePermissionMode(raw: string | undefined): TPermissionMode | undefined {\n if (raw === undefined) return undefined;\n if (!VALID_MODES.includes(raw as TPermissionMode)) {\n throw new Error(`Invalid --permission-mode \"${raw}\". Valid: ${VALID_MODES.join(' | ')}`);\n }\n return raw as TPermissionMode;\n}\n\n/** Validate and return a positive integer from a raw CLI string, or throw on error. */\nexport function parseMaxTurns(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const n = parseInt(raw, 10);\n if (isNaN(n) || n <= 0) {\n throw new Error(`Invalid --max-turns \"${raw}\". Must be a positive integer.`);\n }\n return n;\n}\n\nconst PARSE_ARGS_CONFIG = {\n allowPositionals: true,\n options: {\n help: { type: 'boolean', short: 'h', default: false },\n p: { type: 'boolean', short: 'p', default: false },\n continue: { type: 'boolean', short: 'c', default: false },\n resume: { type: 'string', short: 'r' },\n model: { type: 'string' },\n language: { type: 'string' },\n 'permission-mode': { type: 'string' },\n 'max-turns': { type: 'string' },\n 'fork-session': { type: 'boolean', default: false },\n name: { type: 'string', short: 'n' },\n 'output-format': { type: 'string' },\n format: { type: 'string' },\n summary: { type: 'string' },\n source: { type: 'string' },\n 'system-prompt': { type: 'string' },\n 'append-system-prompt': { type: 'string' },\n 'task-file': { type: 'string' },\n version: { type: 'boolean', default: false },\n reset: { type: 'boolean', default: false },\n bare: { type: 'boolean', default: false },\n 'allowed-tools': { type: 'string' },\n 'no-session-persistence': { type: 'boolean', default: false },\n 'json-schema': { type: 'string' },\n configure: { type: 'boolean', default: false },\n 'configure-provider': { type: 'string' },\n provider: { type: 'string' },\n type: { type: 'string' },\n 'base-url': { type: 'string' },\n 'api-key': { type: 'string' },\n 'api-key-env': { type: 'string' },\n 'set-current': { type: 'boolean', default: false },\n 'settings-scope': { type: 'string' },\n 'check-update': { type: 'boolean', default: false },\n 'disable-update-check': { type: 'boolean', default: false },\n },\n} as const;\n\nfunction mapParsedValues(\n values: ReturnType<typeof parseArgs<typeof PARSE_ARGS_CONFIG>>['values'],\n positionals: string[],\n): IParsedCliArgs {\n return {\n positional: positionals,\n help: values['help'] ?? false,\n printMode: values['p'] ?? false,\n continueMode: values['continue'] ?? false,\n resumeId: values['resume'],\n model: values['model'],\n language: values['language'],\n permissionMode: parsePermissionMode(values['permission-mode']),\n maxTurns: parseMaxTurns(values['max-turns']),\n forkSession: values['fork-session'] ?? false,\n sessionName: values['name'],\n outputFormat: parseOutputFormat(values['output-format']),\n format: values['format'],\n summary: values['summary'],\n source: values['source'],\n systemPrompt: values['system-prompt'],\n appendSystemPrompt: values['append-system-prompt'],\n taskFile: values['task-file'],\n version: values['version'] ?? false,\n reset: values['reset'] ?? false,\n bare: values['bare'] ?? false,\n allowedTools: values['allowed-tools'],\n noSessionPersistence: values['no-session-persistence'] ?? false,\n jsonSchema: values['json-schema'],\n configure: values['configure'] ?? false,\n configureProvider: values['configure-provider'],\n provider: values['provider'],\n providerType: values['type'],\n baseURL: values['base-url'],\n apiKey: values['api-key'],\n apiKeyEnv: values['api-key-env'],\n setCurrent: values['set-current'] ?? false,\n settingsScope: values['settings-scope'],\n checkUpdate: values['check-update'] ?? false,\n disableUpdateCheck: values['disable-update-check'] ?? false,\n };\n}\n\n/** Parse and validate CLI arguments. */\nexport function parseCliArgs(): IParsedCliArgs {\n const { values, positionals } = parseArgs(PARSE_ARGS_CONFIG);\n return mapParsedValues(values, positionals);\n}\n","import { resetUserConfig } from '@robota-sdk/agent-framework';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\n\nexport function runResetConfig(terminal: ITerminalOutput): void {\n const result = resetUserConfig();\n if (result.deleted) {\n terminal.writeLine(`Deleted ${result.path}`);\n } else {\n terminal.writeLine('No user settings found.');\n }\n}\n","import type { ITerminalOutput } from '@robota-sdk/agent-core';\nimport { checkForCliUpdate, formatCliUpdateCheckMessage } from '@robota-sdk/agent-framework';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\nimport { printHelp } from '../utils/cli-args.js';\nimport { runResetConfig } from './reset-config.js';\n\nexport type TPreflightResult = { handled: true } | { handled: false };\n\nexport interface IPreflightContext {\n version: string;\n terminal: ITerminalOutput;\n}\n\nexport async function handlePreflightCommands(\n args: IParsedCliArgs,\n ctx: IPreflightContext,\n): Promise<TPreflightResult> {\n if (args.help) {\n ctx.terminal.write(printHelp());\n return { handled: true };\n }\n if (args.version) {\n ctx.terminal.writeLine(`robota ${ctx.version}`);\n return { handled: true };\n }\n if (args.checkUpdate) {\n const result = await checkForCliUpdate({ currentVersion: ctx.version, force: true });\n const message = formatCliUpdateCheckMessage(result);\n if (result.status === 'error') {\n throw new Error(message);\n }\n ctx.terminal.writeLine(message);\n return { handled: true };\n }\n if (args.reset) {\n runResetConfig(ctx.terminal);\n return { handled: true };\n }\n return { handled: false };\n}\n","import type { IProviderConfig } from '@robota-sdk/agent-core';\nimport type { TSubagentRunnerFactory } from '@robota-sdk/agent-framework';\nimport { createChildProcessSubagentRunnerFactory } from '@robota-sdk/agent-subagent-runner';\n\nexport interface ISubagentSetupConfig {\n providerConfig: IProviderConfig;\n logsDir: string;\n}\n\nexport interface ISubagentSetup {\n subagentRunnerFactory: TSubagentRunnerFactory;\n}\n\nexport function createSubagentSetup(config: ISubagentSetupConfig): ISubagentSetup {\n return {\n subagentRunnerFactory: createChildProcessSubagentRunnerFactory({\n providerConfig: config.providerConfig,\n logsDir: config.logsDir,\n }),\n };\n}\n","import type { IAIProvider, IProviderConfig } from '@robota-sdk/agent-core';\nimport type { TSubagentRunnerFactory } from '@robota-sdk/agent-framework';\nimport {\n projectPaths,\n readMergedProviderSettings,\n readProviderSettings,\n createProviderFromSettings,\n} from '@robota-sdk/agent-framework';\nimport type { IConfigPhaseOptions } from './args-to-options.js';\nimport type { ICommandSetup } from './command-setup.js';\nimport { createSubagentSetup } from './subagent-setup.js';\n\nexport interface IProviderSetup {\n provider: IAIProvider;\n providerSettings: IProviderConfig;\n modelId: string;\n activeProfileName: string | undefined;\n subagentRunnerFactory: TSubagentRunnerFactory;\n}\n\nexport function createProviderSetup(\n cwd: string,\n opts: IConfigPhaseOptions,\n commandSetup: ICommandSetup,\n): IProviderSetup {\n const providerOptions = opts.provider\n ? { providerOverride: opts.provider, providerDefinitions: commandSetup.providerDefinitions }\n : { providerDefinitions: commandSetup.providerDefinitions };\n\n const providerSettings = readProviderSettings(cwd, providerOptions);\n const modelId = opts.model ?? providerSettings.model;\n const provider = createProviderFromSettings(cwd, opts.model, providerOptions);\n const activeProfileName = opts.provider ?? readMergedProviderSettings(cwd).currentProvider;\n\n const { subagentRunnerFactory } = createSubagentSetup({\n providerConfig: { ...providerSettings, model: modelId },\n logsDir: projectPaths(cwd).logs,\n });\n\n return { provider, providerSettings, modelId, activeProfileName, subagentRunnerFactory };\n}\n","import type { IInteractiveSessionStore } from '@robota-sdk/agent-framework';\nimport {\n createProjectSessionStore,\n resolveLatestSessionId,\n resolveSessionIdByIdOrName,\n} from '@robota-sdk/agent-framework';\nimport type { ISessionRunOptions } from './args-to-options.js';\n\nexport interface ISessionSetup {\n sessionStore: IInteractiveSessionStore | undefined;\n resumeSessionId: string | undefined;\n showSessionPickerOnStart: boolean;\n}\n\nexport function createSessionSetup(cwd: string, opts: ISessionRunOptions): ISessionSetup {\n const sessionStore = opts.noSessionPersistence ? undefined : createProjectSessionStore(cwd);\n\n let resumeSessionId: string | undefined;\n let showSessionPickerOnStart = false;\n\n if (opts.continueMode) {\n resumeSessionId = resolveLatestSessionId(sessionStore, cwd);\n } else if (opts.resumeId !== undefined) {\n if (opts.resumeId === '') {\n showSessionPickerOnStart = true;\n } else {\n resumeSessionId = resolveSessionIdByIdOrName(sessionStore, opts.resumeId);\n if (resumeSessionId === undefined) {\n throw new Error(`Session not found: ${opts.resumeId}`);\n }\n }\n }\n\n return { sessionStore, resumeSessionId, showSessionPickerOnStart };\n}\n","import {\n shouldRunStartupCliUpdateCheck,\n getStartupCliUpdateNotice,\n formatCliUpdateNotice,\n} from '@robota-sdk/agent-framework';\nimport type { IStartupUpdatePolicyOptions } from './args-to-options.js';\n\nexport function resolveStartupUpdateNotice(\n version: string,\n policy: IStartupUpdatePolicyOptions,\n): Promise<string | undefined> | undefined {\n if (!shouldRunStartupCliUpdateCheck(policy)) return undefined;\n return getStartupCliUpdateNotice({ currentVersion: version }).then((n) =>\n n ? formatCliUpdateNotice(n) : undefined,\n );\n}\n","import { readPackageVersion } from '@robota-sdk/agent-framework';\n\nexport const readVersion = (): string => readPackageVersion(import.meta.url);\n","import { executeUserLocalDirectCommand } from '@robota-sdk/agent-command';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\nimport type { IUserLocalCommandOptions } from './startup/args-to-options.js';\n\nexport async function runUserLocalDirectCommandIfRequested(\n opts: IUserLocalCommandOptions,\n cwd: string,\n terminal: ITerminalOutput,\n): Promise<boolean> {\n if (opts.positional[0] !== 'user-local') {\n return false;\n }\n\n const result = await executeUserLocalDirectCommand({\n cwd,\n argv: opts.positional.slice(1),\n format: opts.format,\n summary: opts.summary,\n source: opts.source,\n });\n const output = result.message.trimEnd();\n if (!result.success) {\n throw new Error(output);\n }\n terminal.writeLine(output);\n return true;\n}\n","import { createAgentRuntime } from '@robota-sdk/agent-framework';\nimport { createDefaultTransportRegistry } from '@robota-sdk/agent-transport';\nimport { PrintTerminal } from '@robota-sdk/agent-transport/headless';\n\nimport { runPrintMode } from './modes/print-mode.js';\nimport { runTuiMode } from './modes/tui-mode.js';\nimport {\n toConfigPhaseOptions,\n toSessionRunOptions,\n toUserLocalCommandOptions,\n toStartupUpdatePolicyOptions,\n} from './startup/args-to-options.js';\nimport { createCommandSetup } from './startup/command-setup.js';\nimport { handleConfigPhase } from './startup/config-phase.js';\nimport { handlePreflightCommands } from './startup/preflight.js';\nimport { createProviderSetup } from './startup/provider-setup.js';\nimport { createSessionSetup } from './startup/session-setup.js';\nimport { resolveStartupUpdateNotice } from './startup/update-notice.js';\nimport { readVersion } from './startup/version.js';\nimport { runUserLocalDirectCommandIfRequested } from './user-local-direct-command.js';\nimport { parseCliArgs } from './utils/cli-args.js';\n\nimport type { IStartCliOptions } from './startup/command-setup.js';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\n\nexport type { IStartCliOptions };\n\nfunction parseArgsOrExit(): IParsedCliArgs {\n try {\n return parseCliArgs();\n } catch (error) {\n // allow-fallback: argument validation errors are terminal — exit is the correct response\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exit(1);\n }\n}\n\nexport async function startCli(options: IStartCliOptions = {}): Promise<void> {\n const args = parseArgsOrExit();\n const version = readVersion();\n const terminal = new PrintTerminal();\n\n // Layer 0: pre-flight — single point for all early-exit commands\n if ((await handlePreflightCommands(args, { version, terminal })).handled) return;\n\n const cwd = process.cwd();\n\n // Layer 1: IParsedCliArgs → typed option objects (boundary)\n const configPhaseOpts = toConfigPhaseOptions(args);\n const sessionOpts = toSessionRunOptions(args);\n\n try {\n if (await runUserLocalDirectCommandIfRequested(toUserLocalCommandOptions(args), cwd, terminal))\n return;\n } catch (error) {\n // allow-fallback: user-local command failure is terminal — exit is the correct response\n terminal.writeError(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n // Layer 2: sub-layer assembly (same-level grouping)\n const isTTY = process.stdin.isTTY === true && process.stdout.isTTY === true;\n const commandSetup = createCommandSetup(cwd, options);\n const configPhase = await handleConfigPhase(cwd, configPhaseOpts, commandSetup, terminal, isTTY);\n if (configPhase.handled) return;\n\n const providerSetup = createProviderSetup(cwd, configPhaseOpts, commandSetup);\n const sessionSetup = createSessionSetup(cwd, sessionOpts);\n\n // Layer 3: runtime assembly\n const runtime = createAgentRuntime({\n cwd,\n provider: providerSetup.provider,\n commandModules: commandSetup.commandModules,\n commandHostAdapters: commandSetup.commandHostAdapters,\n reloadPluginCommandSource: commandSetup.reloadPluginCommandSource,\n subagentRunnerFactory: providerSetup.subagentRunnerFactory,\n sessionStore: sessionSetup.sessionStore,\n transportRegistry: createDefaultTransportRegistry(),\n });\n\n // Layer 4: mode / transport\n if (configPhaseOpts.printMode) {\n await runPrintMode(sessionOpts, runtime);\n return;\n }\n\n await runTuiMode({\n runtime,\n version,\n commandSetup,\n providerSetup,\n sessionSetup,\n sessionOpts,\n startupUpdateNotice: resolveStartupUpdateNotice(version, toStartupUpdatePolicyOptions(args)),\n });\n process.exit(0);\n}\n","#!/usr/bin/env node\n/**\n * Robota CLI binary entry point.\n *\n * Boots the CLI and handles any uncaught top-level errors gracefully.\n *\n * NOTE: Node.js version check and Terminal.app warning are injected as a\n * build-time banner in tsup.config.ts, ensuring they execute before any\n * ESM module is loaded (static imports are hoisted by the JS engine).\n */\nimport { startCli } from './cli.js';\n\n// Last-resort crash prevention for IME-related errors only.\n// Korean IME in raw mode can cause errors that escape React/Ink.\n// Non-IME errors are re-thrown to preserve normal crash behavior.\nprocess.on('uncaughtException', (err) => {\n const msg = err.message ?? '';\n const isLikelyIME =\n msg.includes('string-width') ||\n msg.includes('setCursorPosition') ||\n msg.includes('getStringWidth') ||\n msg.includes('slice') ||\n msg.includes('charCodeAt');\n if (isLikelyIME) {\n process.stderr.write(`[robota] IME error suppressed: ${msg}\\n`);\n return;\n }\n // Re-throw non-IME errors — let them crash normally\n throw err;\n});\n\nstartCli().catch((err) => {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(message + '\\n');\n process.exit(1);\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"bin.js","names":[],"sources":["../../src/utils/cli-args.ts","../../src/startup/provider-startup.ts","../../src/user-local-direct-command.ts","../../src/startup/version.ts","../../src/startup/reset-config.ts","../../src/startup/command-setup.ts","../../src/startup/append-system-prompt.ts","../../src/modes/print-mode.ts","../../src/cli.ts","../../src/bin.ts"],"sourcesContent":["/**\n * CLI argument parsing and validation.\n * Pure functions — throw on invalid input, no process.* side effects.\n */\n\nimport { parseArgs } from 'node:util';\n\nimport type { TPermissionMode } from '@robota-sdk/agent-core';\n\nconst VALID_MODES: TPermissionMode[] = ['plan', 'default', 'acceptEdits', 'bypassPermissions'];\n\nconst VALID_OUTPUT_FORMATS = ['text', 'json', 'stream-json'] as const;\nexport type TOutputFormat = (typeof VALID_OUTPUT_FORMATS)[number];\n\nexport interface IParsedCliArgs {\n positional: string[];\n help: boolean;\n printMode: boolean;\n continueMode: boolean;\n resumeId: string | undefined;\n language: string | undefined;\n permissionMode: TPermissionMode | undefined;\n maxTurns: number | undefined;\n forkSession: boolean;\n sessionName: string | undefined;\n outputFormat: TOutputFormat | undefined;\n format: string | undefined;\n summary: string | undefined;\n source: string | undefined;\n systemPrompt: string | undefined;\n appendSystemPrompt: string | undefined;\n taskFile: string | undefined;\n version: boolean;\n reset: boolean;\n bare: boolean;\n allowedTools: string | undefined;\n deniedTools: string | undefined;\n model: string | undefined;\n noSessionPersistence: boolean;\n jsonSchema: string | undefined;\n configure: boolean;\n configureProvider: string | undefined;\n provider: string | undefined;\n providerType: string | undefined;\n baseURL: string | undefined;\n apiKey: string | undefined;\n apiKeyEnv: string | undefined;\n setCurrent: boolean;\n settingsScope: string | undefined;\n checkUpdate: boolean;\n disableUpdateCheck: boolean;\n dryRun: boolean;\n yes: boolean;\n}\n\n/** Return CLI usage help text. */\nexport function printHelp(): string {\n return `\nUsage: robota [options] [-p <prompt>]\n\nOptions:\n -p <prompt> Run in print (headless) mode with the given prompt\n --output-format <format> Output format: text | json | stream-json (default: text)\n --system-prompt <text> Override the system prompt for this session\n --append-system-prompt <t> Append text to the system prompt\n --language <lang> Language preference (e.g. ko, en)\n --no-session-persistence Disable session persistence for this run\n --permission-mode <mode> Permission mode: plan | default | acceptEdits | bypassPermissions\n --max-turns <n> Maximum agent turns before stopping\n -c, --continue Continue the most recent session\n -r, --resume <id> Resume a session by ID or name\n -n, --name <name> Name for the new session\n --fork-session Fork the current session into a new independent session\n --task-file <path> Read a task prompt from file and append it to the system prompt\n --bare Print mode: output raw text only, no formatting wrapper\n --configure Run interactive provider configuration\n --configure-provider <n> Configure a specific provider\n --dry-run Plan-only run: show what the agent would do without modifying files\n --check-update Check for CLI updates\n --version Show version number\n -h, --help Show this help message\n\nCommands:\n robota init Initialize AGENTS.md and .robota/settings.json\n\nExamples:\n robota Start interactive TUI session\n robota init Initialize project files\n robota -p \"Hello\" Print mode: send prompt and exit\n robota -p \"Hello\" --output-format json\n robota -p \"Review this diff\" --bare Raw output for shell pipelines\n robota --task-file task.md Run task from file (appended to system prompt)\n robota --dry-run \"Refactor the auth module\" Show plan without modifying files\n robota --continue Resume the last session\n`;\n}\n\n/** Validate and return a TOutputFormat from a raw CLI string, or throw on error. */\nexport function parseOutputFormat(raw: string | undefined): TOutputFormat | undefined {\n if (raw === undefined) return undefined;\n if (!(VALID_OUTPUT_FORMATS as readonly string[]).includes(raw)) {\n throw new Error(`Invalid --output-format \"${raw}\". Valid: ${VALID_OUTPUT_FORMATS.join(' | ')}`);\n }\n return raw as TOutputFormat;\n}\n\n/** Validate and return a TPermissionMode from a raw CLI string, or throw on error. */\nexport function parsePermissionMode(raw: string | undefined): TPermissionMode | undefined {\n if (raw === undefined) return undefined;\n if (!VALID_MODES.includes(raw as TPermissionMode)) {\n throw new Error(`Invalid --permission-mode \"${raw}\". Valid: ${VALID_MODES.join(' | ')}`);\n }\n return raw as TPermissionMode;\n}\n\n/** Validate and return a positive integer from a raw CLI string, or throw on error. */\nexport function parseMaxTurns(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const n = parseInt(raw, 10);\n if (isNaN(n) || n <= 0) {\n throw new Error(`Invalid --max-turns \"${raw}\". Must be a positive integer.`);\n }\n return n;\n}\n\nconst PARSE_ARGS_CONFIG = {\n allowPositionals: true,\n options: {\n help: { type: 'boolean', short: 'h', default: false },\n p: { type: 'boolean', short: 'p', default: false },\n continue: { type: 'boolean', short: 'c', default: false },\n resume: { type: 'string', short: 'r' },\n language: { type: 'string' },\n 'permission-mode': { type: 'string' },\n 'max-turns': { type: 'string' },\n 'fork-session': { type: 'boolean', default: false },\n name: { type: 'string', short: 'n' },\n 'output-format': { type: 'string' },\n format: { type: 'string' },\n summary: { type: 'string' },\n source: { type: 'string' },\n 'system-prompt': { type: 'string' },\n 'append-system-prompt': { type: 'string' },\n 'task-file': { type: 'string' },\n version: { type: 'boolean', default: false },\n reset: { type: 'boolean', default: false },\n bare: { type: 'boolean', default: false },\n 'allowed-tools': { type: 'string' },\n 'denied-tools': { type: 'string' },\n model: { type: 'string' },\n 'no-session-persistence': { type: 'boolean', default: false },\n 'json-schema': { type: 'string' },\n configure: { type: 'boolean', default: false },\n 'configure-provider': { type: 'string' },\n provider: { type: 'string' },\n type: { type: 'string' },\n 'base-url': { type: 'string' },\n 'api-key': { type: 'string' },\n 'api-key-env': { type: 'string' },\n 'set-current': { type: 'boolean', default: false },\n 'settings-scope': { type: 'string' },\n 'check-update': { type: 'boolean', default: false },\n 'disable-update-check': { type: 'boolean', default: false },\n 'dry-run': { type: 'boolean', default: false },\n yes: { type: 'boolean', short: 'y', default: false },\n },\n} as const;\n\nfunction mapParsedValues(\n values: ReturnType<typeof parseArgs<typeof PARSE_ARGS_CONFIG>>['values'],\n positionals: string[],\n): IParsedCliArgs {\n return {\n positional: positionals,\n help: values['help'] ?? false,\n printMode: values['p'] ?? false,\n continueMode: values['continue'] ?? false,\n resumeId: values['resume'],\n language: values['language'],\n permissionMode: parsePermissionMode(values['permission-mode']),\n maxTurns: parseMaxTurns(values['max-turns']),\n forkSession: values['fork-session'] ?? false,\n sessionName: values['name'],\n outputFormat: parseOutputFormat(values['output-format']),\n format: values['format'],\n summary: values['summary'],\n source: values['source'],\n systemPrompt: values['system-prompt'],\n appendSystemPrompt: values['append-system-prompt'],\n taskFile: values['task-file'],\n version: values['version'] ?? false,\n reset: values['reset'] ?? false,\n bare: values['bare'] ?? false,\n allowedTools: values['allowed-tools'],\n deniedTools: values['denied-tools'],\n model: values['model'],\n noSessionPersistence: values['no-session-persistence'] ?? false,\n jsonSchema: values['json-schema'],\n configure: values['configure'] ?? false,\n configureProvider: values['configure-provider'],\n provider: values['provider'],\n providerType: values['type'],\n baseURL: values['base-url'],\n apiKey: values['api-key'],\n apiKeyEnv: values['api-key-env'],\n setCurrent: values['set-current'] ?? false,\n settingsScope: values['settings-scope'],\n checkUpdate: values['check-update'] ?? false,\n disableUpdateCheck: values['disable-update-check'] ?? false,\n dryRun: values['dry-run'] ?? false,\n yes: values['yes'] ?? false,\n };\n}\n\n/** Parse and validate CLI arguments. */\nexport function parseCliArgs(): IParsedCliArgs {\n const { values, positionals } = parseArgs(PARSE_ARGS_CONFIG);\n return mapParsedValues(values, positionals);\n}\n","import { formatSupportedProviderTypes, type IProviderDefinition } from '@robota-sdk/agent-core';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\nimport {\n applyProviderConfiguration,\n applyProviderSwitch,\n readMergedProviderSettings,\n resolveProviderSettingsWriteTargetPath,\n resolveSettingsPathForScope,\n} from '@robota-sdk/agent-framework';\nimport type { TSettingsScope } from '@robota-sdk/agent-framework';\nimport { createDefaultProviderDefinitions } from '@robota-sdk/agent-provider';\nimport { type IProviderSetupInput } from '@robota-sdk/agent-framework';\nimport {\n ensureProviderConfig,\n runProviderStartupSetup,\n type TPromptInput,\n} from '@robota-sdk/agent-command';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\n\nfunction validateSettingsScope(scope: string | undefined): TSettingsScope | undefined {\n if (scope === undefined || scope === 'user' || scope === 'project-local') {\n return scope as TSettingsScope | undefined;\n }\n throw new Error(`Invalid --settings-scope \"${scope}\". Valid: user | project-local`);\n}\n\nexport function handleProviderConfigurationArgs(\n cwd: string,\n args: IParsedCliArgs,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n): boolean {\n const settingsPath = resolveSettingsPathForScope(cwd, validateSettingsScope(args.settingsScope));\n if (args.configureProvider) {\n applyProviderConfiguration(settingsPath, buildSetupInputFromArgs(args), {\n providerDefinitions,\n });\n terminal.writeLine(`Provider profile saved to ${settingsPath}`);\n return !args.printMode && args.positional.length === 0;\n }\n if (args.provider && args.setCurrent) {\n const switchSettingsPath =\n args.settingsScope === undefined ? resolveProviderSettingsWriteTargetPath(cwd) : settingsPath;\n applyProviderSwitch(switchSettingsPath, args.provider, {\n knownProviders: readMergedProviderSettings(cwd).providers,\n });\n terminal.writeLine(`Current provider set to ${args.provider}`);\n return !args.printMode && args.positional.length === 0;\n }\n return false;\n}\n\nexport async function ensureConfig(\n cwd: string,\n args: IParsedCliArgs,\n promptInput: TPromptInput,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n isInteractive?: boolean,\n): Promise<void> {\n await ensureProviderConfig(\n cwd,\n { provider: args.provider, settingsScope: validateSettingsScope(args.settingsScope) },\n promptInput,\n terminal,\n providerDefinitions,\n {\n formatError: formatMissingProviderConfigMessage,\n isInteractive:\n isInteractive !== undefined\n ? () => isInteractive\n : () => process.stdin.isTTY === true && process.stdout.isTTY === true,\n },\n );\n}\n\nexport async function runInteractiveProviderSetup(\n cwd: string,\n args: IParsedCliArgs,\n promptInput: TPromptInput,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n): Promise<void> {\n await runProviderStartupSetup(\n cwd,\n { settingsScope: validateSettingsScope(args.settingsScope) },\n promptInput,\n terminal,\n providerDefinitions,\n );\n}\n\nfunction buildSetupInputFromArgs(args: IParsedCliArgs): IProviderSetupInput {\n const type = args.providerType ?? args.configureProvider;\n if (!args.configureProvider || !type) {\n throw new Error('--configure-provider requires a provider profile and --type');\n }\n return {\n profile: args.configureProvider,\n type,\n ...(args.model !== undefined && { model: args.model }),\n ...(args.apiKey !== undefined && { apiKey: args.apiKey }),\n ...(args.apiKeyEnv !== undefined && { apiKeyEnv: args.apiKeyEnv }),\n ...(args.baseURL !== undefined && { baseURL: args.baseURL }),\n setCurrent: args.setCurrent,\n };\n}\n\nexport function formatMissingProviderConfigMessage(\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n): string {\n return [\n 'No provider configuration found.',\n 'Run `robota --configure` in an interactive terminal, or configure a provider:',\n `Supported providers: ${formatSupportedProviderTypes(providerDefinitions)}`,\n ...providerDefinitions.map(formatConfigureProviderExample),\n ].join('\\n');\n}\n\nfunction formatConfigureProviderExample(definition: IProviderDefinition): string {\n const flags = [\n `robota --configure-provider ${definition.type}`,\n `--type ${definition.type}`,\n ...(definition.defaults?.baseURL !== undefined ? ['--base-url <url>'] : []),\n '--model <model>',\n ...(definition.requiresApiKey === true ? ['--api-key-env <ENV_NAME>'] : []),\n '--set-current',\n ];\n return ` ${flags.join(' ')}`;\n}\n","import { executeUserLocalDirectCommand } from '@robota-sdk/agent-command';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\n\nexport async function runUserLocalDirectCommandIfRequested(\n args: IParsedCliArgs,\n cwd: string,\n terminal: ITerminalOutput,\n): Promise<boolean> {\n if (args.positional[0] !== 'user-local') {\n return false;\n }\n\n const result = await executeUserLocalDirectCommand({\n cwd,\n argv: args.positional.slice(1),\n format: args.format,\n summary: args.summary,\n source: args.source,\n });\n const output = result.message.trimEnd();\n if (!result.success) {\n throw new Error(output);\n }\n terminal.writeLine(output);\n return true;\n}\n","import { readPackageVersion } from '@robota-sdk/agent-framework';\n\nexport const readVersion = (): string => readPackageVersion(import.meta.url);\n","import { resetUserConfig } from '@robota-sdk/agent-framework';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\n\nexport function runResetConfig(terminal: ITerminalOutput): void {\n const result = resetUserConfig();\n if (result.deleted) {\n terminal.writeLine(`Deleted ${result.path}`);\n } else {\n terminal.writeLine('No user settings found.');\n }\n}\n","import type { IProviderDefinition } from '@robota-sdk/agent-core';\nimport {\n getStartupCliUpdateNotice,\n getUserSettingsPath,\n readMergedProviderSettings,\n readSettings,\n resolveProviderSettingsWriteTargetPath,\n shouldRunStartupCliUpdateCheck,\n writeSettings,\n} from '@robota-sdk/agent-framework';\nimport type {\n ICliUpdateNotice,\n ICommandHostAdapters,\n ICommandModule,\n TProviderSettingsDocument,\n} from '@robota-sdk/agent-framework';\nimport {\n createDefaultCommandModules,\n createDefaultPluginCommandAdapter,\n} from '@robota-sdk/agent-command';\nimport { createDefaultProviderDefinitions } from '@robota-sdk/agent-provider';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\n\nexport interface IStartCliOptions {\n commandModules?: readonly ICommandModule[];\n providerDefinitions?: readonly IProviderDefinition[];\n}\n\nexport interface ICliSetup {\n commandHostAdapters: ICommandHostAdapters;\n providerDefinitions: readonly IProviderDefinition[];\n commandModules: readonly ICommandModule[];\n startupUpdateNoticePromise: Promise<ICliUpdateNotice | undefined> | undefined;\n}\n\nexport function buildCommandSetup(\n cwd: string,\n args: IParsedCliArgs,\n options: IStartCliOptions,\n version: string,\n): ICliSetup {\n const commandHostAdapters: ICommandHostAdapters = {\n settings: {\n read: () => readSettings(getUserSettingsPath()),\n write: (settings) => writeSettings(getUserSettingsPath(), settings),\n },\n plugin: createDefaultPluginCommandAdapter(cwd),\n };\n const providerDefinitions = options.providerDefinitions ?? createDefaultProviderDefinitions();\n const providerSettingsAdapter = {\n readMergedSettings: () => readMergedProviderSettings(cwd),\n readTargetSettings: () =>\n readSettings(resolveProviderSettingsWriteTargetPath(cwd)) as TProviderSettingsDocument,\n writeTargetSettings: (settings: TProviderSettingsDocument) =>\n writeSettings(resolveProviderSettingsWriteTargetPath(cwd), settings),\n };\n const commandModules: readonly ICommandModule[] = [\n ...createDefaultCommandModules({ cwd, providerDefinitions, providerSettingsAdapter }),\n ...(options.commandModules ?? []),\n ];\n const startupUpdateNoticePromise = shouldRunStartupCliUpdateCheck(args)\n ? getStartupCliUpdateNotice({ currentVersion: version })\n : undefined;\n return { commandHostAdapters, providerDefinitions, commandModules, startupUpdateNoticePromise };\n}\n","import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\n\nfunction readTaskFilePrompt(cwd: string, taskFile: string): string {\n const taskPath = resolve(cwd, taskFile);\n const content = readFileSync(taskPath, 'utf8').trim();\n if (content.length === 0) {\n throw new Error(`Task file is empty: ${taskFile}`);\n }\n return `Task file (${taskFile}):\\n${content}`;\n}\n\nexport function buildAppendSystemPrompt(cwd: string, args: IParsedCliArgs): string | undefined {\n const appendParts: string[] = [];\n if (args.appendSystemPrompt) appendParts.push(args.appendSystemPrompt);\n if (args.taskFile) {\n try {\n appendParts.push(readTaskFilePrompt(cwd, args.taskFile));\n } catch (error) {\n // allow-fallback: terminal failure — task file read failure exits process\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exit(1);\n }\n }\n if (args.jsonSchema)\n appendParts.push(\n `Respond with valid JSON only, matching this JSON schema:\\n${args.jsonSchema}`,\n );\n return appendParts.length > 0 ? appendParts.join('\\n\\n') : undefined;\n}\n","import { execSync } from 'node:child_process';\nimport type { IAIProvider } from '@robota-sdk/agent-core';\nimport {\n InteractiveSession,\n type ICommandHostAdapters,\n type ICommandModule,\n} from '@robota-sdk/agent-framework';\nimport type { createProjectSessionStore } from '@robota-sdk/agent-framework';\nimport { createHeadlessTransport } from '@robota-sdk/agent-transport/headless';\nimport type { IBackgroundTaskRunner } from '@robota-sdk/agent-executor';\nimport type { createChildProcessSubagentRunnerFactory } from '@robota-sdk/agent-subagent-runner';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\nimport { buildAppendSystemPrompt } from '../startup/append-system-prompt.js';\n\nexport async function runPrintMode(\n cwd: string,\n args: IParsedCliArgs,\n provider: IAIProvider,\n sessionStore: ReturnType<typeof createProjectSessionStore>,\n backgroundTaskRunners: IBackgroundTaskRunner[],\n subagentRunnerFactory: ReturnType<typeof createChildProcessSubagentRunnerFactory>,\n commandModules: readonly ICommandModule[],\n commandHostAdapters: ICommandHostAdapters,\n): Promise<void> {\n let prompt = args.positional.join(' ').trim();\n\n if (!prompt && !process.stdin.isTTY) {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n prompt = Buffer.concat(chunks).toString('utf-8').trim();\n }\n\n if (!prompt) {\n process.stderr.write('Print mode (-p) requires a prompt argument.\\n');\n process.exit(1);\n }\n\n const appendSystemPrompt = buildAppendSystemPrompt(cwd, args);\n\n const shellExec = (command: string) =>\n execSync(command, { timeout: 5000, encoding: 'utf-8', stdio: 'pipe' }).trimEnd();\n\n const session = new InteractiveSession({\n cwd,\n provider,\n permissionMode: args.permissionMode ?? 'bypassPermissions',\n maxTurns: args.maxTurns,\n sessionStore: args.noSessionPersistence ? undefined : sessionStore,\n sessionName: args.sessionName,\n bare: args.bare || undefined,\n allowedTools: args.allowedTools\n ? args.allowedTools\n .split(',')\n .map((t) => t.trim())\n .filter((t) => t.length > 0)\n : undefined,\n appendSystemPrompt,\n ...(args.systemPrompt ? { systemPrompt: args.systemPrompt } : {}),\n backgroundTaskRunners,\n subagentRunnerFactory,\n commandModules,\n commandHostAdapters,\n shellExec,\n agentName: 'robota-cli',\n });\n\n const transport = createHeadlessTransport({\n outputFormat: args.outputFormat ?? 'text',\n prompt,\n });\n session.attachTransport(transport);\n await transport.start();\n await session.shutdown({ reason: 'prompt_input_exit', message: 'Headless transport complete' });\n process.exit(transport.getExitCode());\n}\n","/**\n * CLI entry point — pure composition root.\n * Parses arguments and delegates to startup modules, mode runners, and transports.\n */\n\nimport { execSync } from 'node:child_process';\nimport { PrintTerminal, promptInput } from '@robota-sdk/agent-transport/headless';\nimport {\n createProjectSessionStore,\n projectPaths,\n resolveLatestSessionId,\n resolveSessionIdByIdOrName,\n readMergedProviderSettings,\n readProviderSettings,\n createProviderFromSettings,\n checkForCliUpdate,\n formatCliUpdateCheckMessage,\n formatCliUpdateNotice,\n} from '@robota-sdk/agent-framework';\nimport { parseCliArgs, printHelp } from './utils/cli-args.js';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\nimport {\n ensureConfig,\n handleProviderConfigurationArgs,\n runInteractiveProviderSetup,\n} from './startup/provider-startup.js';\nimport { TuiTransport, createDefaultTuiCliAdapter } from '@robota-sdk/agent-transport/tui';\nimport { createDefaultTransportRegistry } from '@robota-sdk/agent-transport';\nimport { createDefaultBackgroundTaskRunners } from '@robota-sdk/agent-executor';\nimport {\n createChildProcessSubagentRunnerFactory,\n getDefaultSubagentWorkerPath,\n} from '@robota-sdk/agent-subagent-runner';\nimport { reloadPluginCommandSource } from '@robota-sdk/agent-command';\nimport { runUserLocalDirectCommandIfRequested } from './user-local-direct-command.js';\nimport { readVersion } from './startup/version.js';\nimport { runResetConfig } from './startup/reset-config.js';\nimport type { IStartCliOptions } from './startup/command-setup.js';\nimport { buildCommandSetup } from './startup/command-setup.js';\nimport { runPrintMode } from './modes/print-mode.js';\n\nexport type { IStartCliOptions };\n\nexport async function startCli(options: IStartCliOptions = {}): Promise<void> {\n let args: IParsedCliArgs;\n try {\n args = parseCliArgs();\n } catch (error) {\n // allow-fallback: argument validation errors are terminal — exit is the correct response\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exit(1);\n }\n const version = readVersion();\n\n if (args.help) {\n process.stdout.write(printHelp());\n return;\n }\n\n if (args.version) {\n process.stdout.write(`robota ${version}\\n`);\n return;\n }\n\n if (args.checkUpdate) {\n const result = await checkForCliUpdate({ currentVersion: version, force: true });\n const message = formatCliUpdateCheckMessage(result);\n if (result.status === 'error') {\n process.stderr.write(`${message}\\n`);\n process.exit(1);\n }\n process.stdout.write(`${message}\\n`);\n return;\n }\n\n const cwd = process.cwd();\n const terminal = new PrintTerminal();\n\n if (args.reset) {\n runResetConfig(terminal);\n return;\n }\n\n try {\n if (await runUserLocalDirectCommandIfRequested(args, cwd, terminal)) {\n return;\n }\n } catch (error) {\n // allow-fallback: user-local command failure is terminal — exit is the correct response\n terminal.writeError(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n const { commandHostAdapters, providerDefinitions, commandModules, startupUpdateNoticePromise } =\n buildCommandSetup(cwd, args, options, version);\n\n if (args.configure) {\n await runInteractiveProviderSetup(cwd, args, promptInput, terminal, providerDefinitions);\n return;\n }\n\n if (handleProviderConfigurationArgs(cwd, args, terminal, providerDefinitions)) {\n return;\n }\n\n try {\n await ensureConfig(cwd, args, promptInput, terminal, providerDefinitions);\n } catch (error) {\n // allow-fallback: terminal failure — not a silent fallback\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exit(1);\n }\n\n const providerOptions = args.provider\n ? { providerOverride: args.provider, providerDefinitions }\n : { providerDefinitions };\n const providerSettings = readProviderSettings(cwd, providerOptions);\n const modelId = args.model ?? providerSettings.model;\n const provider = createProviderFromSettings(cwd, args.model, providerOptions);\n const backgroundTaskRunners = createDefaultBackgroundTaskRunners();\n const paths = projectPaths(cwd);\n const subagentRunnerFactory = createChildProcessSubagentRunnerFactory({\n workerPath: getDefaultSubagentWorkerPath(),\n providerConfig: { ...providerSettings, model: modelId },\n logsDir: paths.logs,\n });\n\n const sessionStore = createProjectSessionStore(cwd);\n let resumeSessionId: string | undefined;\n let showSessionPickerOnStart = false;\n\n if (args.continueMode) {\n resumeSessionId = resolveLatestSessionId(sessionStore, cwd);\n } else if (args.resumeId !== undefined) {\n if (args.resumeId === '') {\n showSessionPickerOnStart = true;\n } else {\n resumeSessionId = resolveSessionIdByIdOrName(sessionStore, args.resumeId);\n if (resumeSessionId === undefined) {\n process.stderr.write(`Session not found: ${args.resumeId}\\n`);\n process.exit(1);\n }\n }\n }\n\n if (args.printMode) {\n await runPrintMode(\n cwd,\n args,\n provider,\n sessionStore,\n backgroundTaskRunners,\n subagentRunnerFactory,\n commandModules,\n commandHostAdapters,\n );\n return;\n }\n\n const tuiTransport = new TuiTransport({\n cwd,\n provider,\n providerOverride: args.provider,\n providerType: providerSettings.name,\n modelId,\n language: args.language,\n permissionMode: args.permissionMode,\n maxTurns: args.maxTurns,\n version,\n sessionStore: args.noSessionPersistence ? undefined : sessionStore,\n resumeSessionId,\n showSessionPickerOnStart,\n forkSession: args.forkSession,\n sessionName: args.sessionName,\n backgroundTaskRunners,\n subagentRunnerFactory,\n commandModules,\n commandHostAdapters,\n shellExec: (command: string) =>\n execSync(command, { timeout: 5000, encoding: 'utf-8', stdio: 'pipe' }).trimEnd(),\n startupUpdateNotice: startupUpdateNoticePromise\n ? startupUpdateNoticePromise.then((n) => (n ? formatCliUpdateNotice(n) : undefined))\n : undefined,\n transportRegistry: createDefaultTransportRegistry(),\n cliAdapter: createDefaultTuiCliAdapter({ providerDefinitions, reloadPluginCommandSource }),\n reloadPluginCommandSource,\n agentName: 'robota-cli',\n });\n await tuiTransport.start();\n process.exit(0);\n}\n","#!/usr/bin/env node\n/**\n * Robota CLI binary entry point.\n *\n * Boots the CLI and handles any uncaught top-level errors gracefully.\n *\n * A Node.js version check (>=22) is injected as a build-time banner in\n * tsdown.config.ts and runs before any module imports are loaded.\n */\nimport { startCli } from './cli.js';\n\n// Last-resort crash prevention for IME-related errors only.\n// Korean IME in raw mode can cause errors that escape React/Ink.\n// Non-IME errors are re-thrown to preserve normal crash behavior.\nprocess.on('uncaughtException', (err) => {\n const msg = err.message ?? '';\n const isLikelyIME =\n msg.includes('string-width') ||\n msg.includes('setCursorPosition') ||\n msg.includes('getStringWidth') ||\n msg.includes('slice') ||\n msg.includes('charCodeAt');\n if (isLikelyIME) {\n process.stderr.write(\n '\\n[robota] CJK/IME input error — this is a known issue with macOS Terminal.app.\\n' +\n ' Workaround: use iTerm2 (https://iterm2.com) or input your prompt in English.\\n' +\n ' Alternatively, use headless mode: robota -p \"your prompt here\"\\n\\n',\n );\n return;\n }\n // Re-throw non-IME errors — let them crash normally\n throw err;\n});\n\nstartCli().catch((err) => {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(message + '\\n');\n process.exit(1);\n});\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ const e=require(`./modes/print-mode.cjs`),t=require(`./modes/tui-mode.cjs`),n=require(`./startup/args-to-options.cjs`),r=require(`./startup/command-setup.cjs`),i=require(`./startup/config-phase.cjs`),a=require(`./utils/cli-args.cjs`),o=require(`./startup/preflight.cjs`),s=require(`./startup/provider-setup.cjs`),c=require(`./startup/session-setup.cjs`),l=require(`./startup/update-notice.cjs`),u=require(`./startup/version.cjs`),d=require(`./user-local-direct-command.cjs`);let f=require(`@robota-sdk/agent-framework`),p=require(`@robota-sdk/agent-transport`),m=require(`@robota-sdk/agent-transport/headless`);function h(){try{return a.parseCliArgs()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}}async function g(a={}){let g=h(),_=u.readVersion(),v=new m.PrintTerminal,y=process.cwd();if((await o.handlePreflightCommands(g,{version:_,terminal:v,cwd:y})).handled)return;let b=n.toConfigPhaseOptions(g),x=n.toSessionRunOptions(g);try{if(await d.runUserLocalDirectCommandIfRequested(n.toUserLocalCommandOptions(g),y,v))return}catch(e){v.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let S=process.stdin.isTTY===!0&&process.stdout.isTTY===!0,C=r.createCommandSetup(y,a);if((await i.handleConfigPhase(y,b,C,v,S)).handled)return;let w=s.createProviderSetup(y,b,C),T=c.createSessionSetup(y,x),E=(0,f.createAgentRuntime)({cwd:y,provider:w.provider,commandModules:C.commandModules,commandHostAdapters:C.commandHostAdapters,reloadPluginCommandSource:C.reloadPluginCommandSource,subagentRunnerFactory:w.subagentRunnerFactory,sessionStore:T.sessionStore,transportRegistry:(0,p.createDefaultTransportRegistry)()});if(b.printMode){await e.runPrintMode(x,E);return}await t.runTuiMode({runtime:E,version:_,commandSetup:C,providerSetup:w,sessionSetup:T,sessionOpts:x,startupUpdateNotice:l.resolveStartupUpdateNotice(_,n.toStartupUpdatePolicyOptions(g))}),process.exit(0)}exports.startCli=g;
@@ -0,0 +1,7 @@
1
+ import { IStartCliOptions } from "./startup/command-setup.js";
2
+
3
+ //#region src/cli.d.ts
4
+ declare function startCli(options?: IStartCliOptions): Promise<void>;
5
+ //#endregion
6
+ export { startCli };
7
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","names":[],"sources":["../../src/cli.ts"],"mappings":";;;iBAqCsB,QAAA,CAAS,OAAA,GAAS,gBAAA,GAAwB,OAAO"}
@@ -0,0 +1,2 @@
1
+ import{runPrintMode as e}from"./modes/print-mode.js";import{runTuiMode as t}from"./modes/tui-mode.js";import{toConfigPhaseOptions as n,toSessionRunOptions as r,toStartupUpdatePolicyOptions as i,toUserLocalCommandOptions as a}from"./startup/args-to-options.js";import{createCommandSetup as o}from"./startup/command-setup.js";import{handleConfigPhase as s}from"./startup/config-phase.js";import{parseCliArgs as c}from"./utils/cli-args.js";import{handlePreflightCommands as l}from"./startup/preflight.js";import{createProviderSetup as u}from"./startup/provider-setup.js";import{createSessionSetup as d}from"./startup/session-setup.js";import{resolveStartupUpdateNotice as f}from"./startup/update-notice.js";import{readVersion as p}from"./startup/version.js";import{runUserLocalDirectCommandIfRequested as m}from"./user-local-direct-command.js";import{createAgentRuntime as h}from"@robota-sdk/agent-framework";import{createDefaultTransportRegistry as g}from"@robota-sdk/agent-transport";import{PrintTerminal as _}from"@robota-sdk/agent-transport/headless";function v(){try{return c()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}}async function y(c={}){let y=v(),b=p(),x=new _,S=process.cwd();if((await l(y,{version:b,terminal:x,cwd:S})).handled)return;let C=n(y),w=r(y);try{if(await m(a(y),S,x))return}catch(e){x.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let T=process.stdin.isTTY===!0&&process.stdout.isTTY===!0,E=o(S,c);if((await s(S,C,E,x,T)).handled)return;let D=u(S,C,E),O=d(S,w),k=h({cwd:S,provider:D.provider,commandModules:E.commandModules,commandHostAdapters:E.commandHostAdapters,reloadPluginCommandSource:E.reloadPluginCommandSource,subagentRunnerFactory:D.subagentRunnerFactory,sessionStore:O.sessionStore,transportRegistry:g()});if(C.printMode){await e(w,k);return}await t({runtime:k,version:b,commandSetup:E,providerSetup:D,sessionSetup:O,sessionOpts:w,startupUpdateNotice:f(b,i(y))}),process.exit(0)}export{y as startCli};
2
+ //# sourceMappingURL=cli.js.map