@robota-sdk/agent-cli 3.0.0-beta.74 → 3.0.0-beta.76
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/node/bin.js +18 -19
- package/dist/node/bin.js.map +1 -1
- package/dist/node/index.cjs +19 -20
- package/dist/node/index.d.ts +1 -1
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +17 -18
- package/dist/node/index.js.map +1 -1
- package/package.json +12 -8
package/dist/node/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("node:child_process"),t=require("@robota-sdk/agent-transport/headless"),n=require("@robota-sdk/agent-framework"),r=require("node:util"),i=require("@robota-sdk/agent-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("node:child_process"),t=require("@robota-sdk/agent-transport/headless"),n=require("@robota-sdk/agent-framework"),r=require("node:util"),i=require("@robota-sdk/agent-preset"),a=require("@robota-sdk/agent-core"),o=require("@robota-sdk/agent-provider"),s=require("@robota-sdk/agent-command"),c=require("@robota-sdk/agent-transport-tui"),l=require("@robota-sdk/agent-transport"),u=require("@robota-sdk/agent-transport-ws"),d=require("@robota-sdk/agent-executor"),f=require("@robota-sdk/agent-subagent-runner"),p=require("@robota-sdk/agent-session-analytics"),m=require("node:fs"),h=require("node:readline/promises"),g=require("node:net"),_=require("node:path");const v=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],y=[`text`,`json`,`stream-json`];function ee(){return`
|
|
2
2
|
Usage: robota [options] [-p <prompt>]
|
|
3
3
|
|
|
4
4
|
Options:
|
|
@@ -21,6 +21,7 @@ Options:
|
|
|
21
21
|
--allowed-tools <list> Comma-separated tool allowlist (TUI and print mode)
|
|
22
22
|
--denied-tools <list> Comma-separated tool denylist (TUI and print mode)
|
|
23
23
|
--model <model> Model override for this run
|
|
24
|
+
--preset <id> Preset id to apply (default: settings.preset or "default")
|
|
24
25
|
--json-schema <schema> Print mode: instruct the model to respond with JSON matching this schema
|
|
25
26
|
--dry-run Alias for --permission-mode plan (plan only, no execution)
|
|
26
27
|
--reset Delete ~/.robota/settings.json (provider profiles and preferences).
|
|
@@ -43,20 +44,18 @@ Examples:
|
|
|
43
44
|
robota --task-file task.md Run task from file (appended to system prompt)
|
|
44
45
|
robota -p "Refactor the auth module" --dry-run Plan only, no execution
|
|
45
46
|
robota --continue Resume the last session
|
|
46
|
-
`}function
|
|
47
|
-
`)}function
|
|
48
|
-
`)}
|
|
49
|
-
`)
|
|
50
|
-
`);return}if(r.last!==void 0){let e=i.slice(-r.last),t=[];for(let n of e)try{t.push(P(A(n)))}catch{}t.length===0&&(process.stderr.write(`No valid sessions found.
|
|
51
|
-
`),process.exit(1));let n=U(t);process.stdout.write(z(n)+`
|
|
47
|
+
`}function b(e){if(e===void 0)return;let t=e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0);return t.length>0?t:void 0}function x(e){if(e!==void 0){if(!y.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${y.join(` | `)}`);return e}}function S(e){if(e!==void 0){if(!v.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${v.join(` | `)}`);return e}}function C(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 w={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`},preset:{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 T(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,language:e.language,permissionMode:S(e[`permission-mode`]),maxTurns:C(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:x(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,preset:e.preset,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 E(){let{values:e,positionals:t}=(0,r.parseArgs)(w),n=T(e,t);if(n.printMode){if(n.resumeId===``)throw Error(`Print mode requires an explicit session id: -r <id|name> (the interactive session picker is TUI-only)`);if(n.noSessionPersistence&&(n.continueMode||n.resumeId!==void 0))throw Error(`--no-session-persistence conflicts with -c/-r (resume needs the session store)`)}if(n.dryRun){if(n.permissionMode!==void 0&&n.permissionMode!==`plan`)throw Error(`--dry-run is an alias for --permission-mode plan and conflicts with --permission-mode ${n.permissionMode}`);return{...n,permissionMode:`plan`}}return n}function D(e,t){return e.preset??t??`default`}function O(e){return{...e.model===void 0?{}:{model:e.model},...e.systemPrompt===void 0?{}:{systemPrompt:e.systemPrompt},...e.appendSystemPrompt===void 0?{}:{appendSystemPrompt:e.appendSystemPrompt},...e.language===void 0?{}:{language:e.language},...e.permissionMode===void 0?{}:{permissionMode:e.permissionMode}}}function k(e,t){return(0,i.resolvePreset)(D(e,t),{cliOverrides:O(e)})}function A(e){if(e===void 0||e===`user`||e===`project-local`)return e;throw Error(`Invalid --settings-scope "${e}". Valid: user | project-local`)}function te(e,t,r,i=(0,o.createDefaultProviderDefinitions)()){let a=(0,n.resolveSettingsPathForScope)(e,A(t.settingsScope));return t.configureProvider?((0,n.applyProviderConfiguration)(a,N(t),{providerDefinitions:i}),r.writeLine(`Provider profile saved to ${a}`),!t.printMode&&t.positional.length===0):t.provider&&t.setCurrent?((0,n.applyProviderSwitch)(t.settingsScope===void 0?(0,n.resolveProviderSettingsWriteTargetPath)(e):a,t.provider,{knownProviders:(0,n.readMergedProviderSettings)(e).providers}),r.writeLine(`Current provider set to ${t.provider}`),!t.printMode&&t.positional.length===0):!1}async function j(e,t,n,r,i=(0,o.createDefaultProviderDefinitions)(),a){await(0,s.ensureProviderConfig)(e,{provider:t.provider,settingsScope:A(t.settingsScope)},n,r,i,{formatError:P,isInteractive:a===void 0?()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0:()=>a})}async function M(e,t,n,r,i=(0,o.createDefaultProviderDefinitions)()){await(0,s.runProviderStartupSetup)(e,{settingsScope:A(t.settingsScope)},n,r,i)}function N(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 P(e=(0,o.createDefaultProviderDefinitions)()){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${(0,a.formatSupportedProviderTypes)(e)}`,...e.map(F)].join(`
|
|
48
|
+
`)}function F(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 ne(e,t,n){if(e.positional[0]!==`user-local`)return!1;let r=await(0,s.executeUserLocalDirectCommand)({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 I(e){let t,n;for(let r=0;r<e.length;r++)if(e[r]===`--last`&&e[r+1]){let n=parseInt(e[r+1],10);!isNaN(n)&&n>0&&(t=n),r++}else e[r]===`--session`&&e[r+1]&&(n=e[r+1],r++);return{last:t,sessionId:n}}function L(e){let t=new Map;for(let e of(0,n.createUserSessionStore)().list())t.set(e.id,e);for(let r of(0,n.createProjectSessionStore)(e).list())t.set(r.id,r);return[...t.values()].sort((e,t)=>e.id.localeCompare(t.id))}async function R(e,t=process.cwd()){let r=I(e),i=L(t);if(i.length===0&&(process.stderr.write(`No session files found in ${(0,n.projectPaths)(t).sessions} or ${(0,n.userPaths)().sessions}\n`),process.exit(1)),r.sessionId!==void 0){let e=i.find(e=>e.id.includes(r.sessionId));e||(process.stderr.write(`Session not found: ${r.sessionId}\n`),process.exit(1)),process.stdout.write((0,p.formatSingleSession)((0,p.analyzeSession)(e))+`
|
|
49
|
+
`);return}if(r.last!==void 0){let e=i.slice(-r.last).map(e=>(0,p.analyzeSession)(e));e.length===0&&(process.stderr.write(`No valid sessions found.
|
|
50
|
+
`),process.exit(1)),process.stdout.write((0,p.formatAggregateReport)((0,p.aggregateReports)(e))+`
|
|
52
51
|
`);return}let a=i[i.length-1];a||(process.stderr.write(`No sessions found.
|
|
53
|
-
`),process.exit(1))
|
|
54
|
-
`)}const
|
|
55
|
-
Recommendation: use iTerm2 (https://iterm2.com)`}:{label:`Terminal`,status:`ok`,message:e}}function
|
|
52
|
+
`),process.exit(1)),process.stdout.write((0,p.formatSingleSession)((0,p.analyzeSession)(a))+`
|
|
53
|
+
`)}const z=()=>(0,n.readPackageVersion)(require("url").pathToFileURL(__filename).href);async function B(e){let t=(0,h.createInterface)({input:process.stdin,output:process.stdout});try{let n=(await t.question(e)).trim().toLowerCase();return n===`y`||n===`yes`}finally{t.close()}}async function V(e,t){let r=(0,n.getUserSettingsPath)();if(!(0,m.existsSync)(r))return e.writeLine(`No user settings found.`),0;if(!t.yes){if(!t.isTTY)return e.writeError(`--reset deletes ${r}. Refusing without confirmation in non-interactive mode — pass --yes to proceed.`),1;if(!await(t.confirm??B)(`Delete ${r}? [y/N] `))return e.writeLine(`Reset cancelled.`),1}let i=(0,n.resetUserConfig)();return i.deleted?e.writeLine(`Deleted ${i.path}`):e.writeLine(`No user settings found.`),0}const H={anthropic:{host:`api.anthropic.com`,port:443},openai:{host:`api.openai.com`,port:443},gemini:{host:`generativelanguage.googleapis.com`,port:443},deepseek:{host:`api.deepseek.com`,port:443},qwen:{host:`dashscope.aliyuncs.com`,port:443}};function U(){let[e]=process.versions.node.split(`.`).map(Number);return e!==void 0&&e>=22?{label:`Node.js version`,status:`ok`,message:`v${process.versions.node}`}:{label:`Node.js version`,status:`fail`,message:`v${process.versions.node} (requires >=22)\n nvm: nvm install 22 && nvm use 22\n Volta: volta install node@22`}}function W(e){return{label:`robota version`,status:`ok`,message:e}}function G(e,t,r){try{let i=(0,n.readProviderSettings)(e,{providerDefinitions:t,env:r}),a=i.source===`env-default`?`env-default via ${i.sourceEnvVar??`environment`}`:`settings profile`,o=i.model===void 0?``:` (${i.model})`;return{label:`API key`,status:`ok`,message:`${i.name}${o} — ${a}`}}catch(e){return{label:`API key`,status:`fail`,message:`${e instanceof Error?e.message:String(e)}\n Set ANTHROPIC_API_KEY or run: robota --configure\n Get key: https://console.anthropic.com/settings/keys`}}}function K(e){try{return JSON.parse((0,m.readFileSync)(e,`utf-8`)),`ok`}catch{return`corrupt`}}function q(e){let t=(0,n.getProviderSettingsPaths)(e).filter(e=>(0,m.existsSync)(e));return t.length===0?[{label:`Settings file`,status:`warn`,message:`Not found — run: robota --configure`}]:t.map(e=>K(e)===`corrupt`?{label:`Settings file`,status:`fail`,message:`${e} — invalid JSON\n Fix or delete the file, or run: robota --configure`}:{label:`Settings file`,status:`ok`,message:e})}function J(e){try{let t=JSON.parse((0,m.readFileSync)(e,`utf-8`));return typeof t.currentProvider==`string`?t.currentProvider:void 0}catch{return}}function Y(e){let t=(0,_.join)(e,`.robota`,`settings.json`),n=(0,_.join)(process.env.HOME??``,`.robota`,`settings.json`),r=(0,m.existsSync)(t)?t:(0,m.existsSync)(n)?n:void 0;if(r!==void 0){let e=(J(r)??``).toLowerCase(),t=Object.entries(H).find(([t])=>e.startsWith(t));if(t)return t[1]}return H.anthropic}function X(){let e=process.env.TERM_PROGRAM??`unknown`;return process.platform===`darwin`&&e===`Apple_Terminal`?{label:`Terminal`,status:`warn`,message:`macOS Terminal.app — CJK/IME input may be unstable
|
|
54
|
+
Recommendation: use iTerm2 (https://iterm2.com)`}:{label:`Terminal`,status:`ok`,message:e}}function re(e){let t=`Network (${e.host})`;return new Promise(n=>{let r=Date.now(),i=(0,g.createConnection)({host:e.host,port:e.port}),a=setTimeout(()=>{i.destroy(),n({label:t,status:`fail`,message:`timeout (3s)`})},3e3);i.on(`connect`,()=>{clearTimeout(a),i.destroy(),n({label:t,status:`ok`,message:`reachable (${Date.now()-r}ms)`})}),i.on(`error`,e=>{clearTimeout(a),n({label:t,status:`warn`,message:`${e.message}\n Check proxy settings or firewall`})})})}async function ie(e,t={checkNetwork:re}){e.terminal.writeLine(`
|
|
56
55
|
robota diagnose
|
|
57
|
-
`);let n=
|
|
58
|
-
`);e.terminal.writeLine(` ${n} ${t.label}: ${r[0]}`);for(let t of r.slice(1))e.terminal.writeLine(` ${t}`);t.status===`fail`&&s++,t.status===`warn`&&c++}return e.terminal.writeLine(``),s===0&&c===0?e.terminal.writeLine(`✓ All checks passed. robota is ready to use.`):s>0?e.terminal.writeLine(`✗ ${s} issue(s) found. Fix the items above to use robota.`):e.terminal.writeLine(`⚠ ${c} warning(s). robota may work but check the items above.`),e.terminal.writeLine(``),s}const
|
|
59
|
-
`,`utf8`),r.writeLine(``),r.writeLine(`Created: .robota/settings.json`),(0,
|
|
56
|
+
`);let n=Y(e.cwd),r=t.providerDefinitions??(0,o.createDefaultProviderDefinitions)(),i=t.env??process.env,a=[U(),W(e.version),G(e.cwd,r,i),...q(e.cwd),X(),await t.checkNetwork(n)],s=0,c=0;for(let t of a){let n=t.status===`ok`?`✓`:t.status===`warn`?`⚠`:`✗`,r=t.message.split(`
|
|
57
|
+
`);e.terminal.writeLine(` ${n} ${t.label}: ${r[0]}`);for(let t of r.slice(1))e.terminal.writeLine(` ${t}`);t.status===`fail`&&s++,t.status===`warn`&&c++}return e.terminal.writeLine(``),s===0&&c===0?e.terminal.writeLine(`✓ All checks passed. robota is ready to use.`):s>0?e.terminal.writeLine(`✗ ${s} issue(s) found. Fix the items above to use robota.`):e.terminal.writeLine(`⚠ ${c} warning(s). robota may work but check the items above.`),e.terminal.writeLine(``),s}const Z=`robota`,Q={permissions:{allow:[`Read(.robota/**)`,`Read(.claude/**)`,`Read(.agents/**)`],deny:[]}};function ae(e){let t=(0,_.join)(e,`settings.json`);if(!(0,m.existsSync)(t))return{};let n=(0,m.readFileSync)(t,`utf8`);try{return JSON.parse(n)}catch{return null}}var oe=class extends Error{constructor(e){super(`Cannot ask "${e}" in a non-interactive shell. Re-run with --yes to accept the defaults.`),this.name=`InitPromptUnavailableError`}};async function $(e,t,n){if(n.yes||n.ci)return n.terminal.writeLine(`${e} → ${t?`Y`:`N`} (${n.yes?`--yes`:`CI`}: using default)`),t;if(!n.isTTY)throw new oe(e);let r=await n.promptFn(`${e} [y/N] `);return r.toLowerCase()===`y`||r.toLowerCase()===`yes`}async function se(e,r,i={}){r.writeLine(``),r.writeLine(`${Z} project initialization`),r.writeLine(`─`.repeat(40));let a={yes:i.yes===!0,ci:i.ci??process.env.CI===`true`,isTTY:i.isTTY??process.stdin.isTTY===!0,promptFn:i.promptFn??t.promptInput,terminal:r},o=(0,n.projectPaths)(e).settings,s=(0,_.dirname)(o),c=(0,_.join)(e,`AGENTS.md`),l=(0,_.join)(e,`.claude`),u=(0,m.existsSync)(l),d=(0,m.existsSync)(o),f=(0,m.existsSync)(c);if(d&&f&&(r.writeLine(``),r.writeLine(`Both AGENTS.md and .robota/settings.json already exist.`),!await $(`Overwrite existing files?`,!1,a))){r.writeLine(`Init cancelled.`);return}let p={...Q};if(u&&(r.writeLine(``),r.writeLine(`Detected .claude/ directory (Claude Code configuration).`),await $(`Migrate Claude Code settings to .robota/?`,!1,a))){let e=ae(l);if(e===null)r.writeLine(`Warning: .claude/settings.json could not be parsed — skipping migration.`);else{let t=e.permissions;p={...e,permissions:{...typeof e.permissions==`object`&&e.permissions!==null?e.permissions:{},allow:[...Q.permissions.allow,...t?.allow??[]],deny:t?.deny??[]}},r.writeLine(`Settings imported from .claude/settings.json.`)}}(0,m.mkdirSync)(s,{recursive:!0}),(0,m.writeFileSync)(o,JSON.stringify(p,null,2)+`
|
|
58
|
+
`,`utf8`),r.writeLine(``),r.writeLine(`Created: .robota/settings.json`),(0,m.writeFileSync)(c,`# AGENTS.md — Project Agent Guidelines
|
|
60
59
|
|
|
61
60
|
This file guides the AI agent working in this project. Customize it for your project.
|
|
62
61
|
|
|
@@ -86,9 +85,9 @@ npm run build
|
|
|
86
85
|
## Important Notes
|
|
87
86
|
|
|
88
87
|
<!-- Anything the agent should know before making changes -->
|
|
89
|
-
`,`utf8`),r.writeLine(`Created: AGENTS.md`),r.writeLine(``),r.writeLine(`Initialization complete.`),r.writeLine(``),r.writeLine(`Next steps:`),r.writeLine(` 1. Edit AGENTS.md to describe your project conventions`),r.writeLine(` 2. Run \`${
|
|
88
|
+
`,`utf8`),r.writeLine(`Created: AGENTS.md`),r.writeLine(``),r.writeLine(`Initialization complete.`),r.writeLine(``),r.writeLine(`Next steps:`),r.writeLine(` 1. Edit AGENTS.md to describe your project conventions`),r.writeLine(` 2. Run \`${Z} --configure\` to set up your AI provider`),r.writeLine(` 3. Run \`${Z}\` to start the assistant`),r.writeLine(``),i.onProviderSetup!==void 0&&(a.isTTY||a.yes||a.ci)&&await $(`Would you like to set up a provider now?`,!1,a)&&await i.onProviderSetup()}function ce(e=(0,n.userPaths)().onboarded){return!(0,m.existsSync)(e)}function le(e=(0,n.userPaths)().onboarded){(0,m.mkdirSync)((0,_.dirname)(e),{recursive:!0}),(0,m.writeFileSync)(e,new Date().toISOString())}const ue=`
|
|
90
89
|
╭─────────────────────────────────────────────────────────────╮
|
|
91
|
-
│ Welcome to ${
|
|
90
|
+
│ Welcome to ${Z}! — AI coding assistant │
|
|
92
91
|
│ │
|
|
93
92
|
│ Try asking: │
|
|
94
93
|
│ "Explain this project structure" │
|
|
@@ -101,13 +100,13 @@ npm run build
|
|
|
101
100
|
│ /cost show token usage and estimated cost │
|
|
102
101
|
│ /clear clear conversation history │
|
|
103
102
|
│ │
|
|
104
|
-
│ ${
|
|
103
|
+
│ ${Z} diagnose — check your setup │
|
|
105
104
|
╰─────────────────────────────────────────────────────────────╯
|
|
106
|
-
`;function
|
|
105
|
+
`;function de(e){e.writeLine(ue)}function fe(e){process.platform===`darwin`&&process.env.TERM_PROGRAM===`Apple_Terminal`&&e.writeError(`
|
|
107
106
|
⚠ macOS Terminal.app detected: CJK/IME input may be unstable.
|
|
108
107
|
Recommended: use iTerm2 (https://iterm2.com) for Korean/Japanese/Chinese input.
|
|
109
108
|
Or use headless mode: robota -p "your prompt"
|
|
110
|
-
`)}function
|
|
109
|
+
`)}function pe(e,t,r,i,a={}){let c={settings:{read:()=>(0,n.readSettings)((0,n.getUserSettingsPath)()),write:e=>(0,n.writeSettings)((0,n.getUserSettingsPath)(),e)},plugin:(0,s.createDefaultPluginCommandAdapter)(e)},l=r.providerDefinitions??(0,o.createDefaultProviderDefinitions)();return{commandHostAdapters:c,providerDefinitions:l,commandModules:[...(0,s.createDefaultCommandModules)({cwd:e,providerDefinitions:l,providerSettingsAdapter:{readMergedSettings:()=>(0,n.readMergedProviderSettings)(e),readTargetSettings:()=>(0,n.readSettings)((0,n.resolveProviderSettingsWriteTargetPath)(e)),writeTargetSettings:t=>(0,n.writeSettings)((0,n.resolveProviderSettingsWriteTargetPath)(e),t)},...a.enabledCommandModules===void 0?{}:{enabledCommandModules:a.enabledCommandModules},...a.disabledCommandModules===void 0?{}:{disabledCommandModules:a.disabledCommandModules}}),...r.commandModules??[]],startupUpdateNoticePromise:(0,n.shouldRunStartupCliUpdateCheck)(t)?(0,n.getStartupCliUpdateNotice)({currentVersion:i}):void 0}}function me(e,t){let n=(0,m.readFileSync)((0,_.resolve)(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function he(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(me(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(`
|
|
111
110
|
|
|
112
|
-
`):void 0}async function
|
|
113
|
-
`),process.exit(1));let
|
|
111
|
+
`):void 0}async function ge(e,n,r,i,a,o,s,c,l={},u={}){let d=n.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.
|
|
112
|
+
`),process.exit(1));let f=he(e,n),p=new t.HeadlessInteractionChannel({cwd:e,provider:r,outputFormat:n.outputFormat??`text`,permissionMode:n.permissionMode??u.permissionMode??`bypassPermissions`,maxTurns:n.maxTurns,sessionStore:n.noSessionPersistence?void 0:i,resumeSessionId:l.resumeSessionId,forkSession:l.forkSession,sessionName:n.sessionName,bare:n.bare||void 0,allowedTools:b(n.allowedTools),deniedTools:b(n.deniedTools),appendSystemPrompt:f,...u.persona===void 0?{}:{persona:u.persona},...u.agentName===void 0?{}:{agentName:u.agentName},...u.activePresetId===void 0?{}:{activePresetId:u.activePresetId},...u.enableParallelSubagents===void 0?{}:{enableParallelSubagents:u.enableParallelSubagents},...u.selfVerification===void 0?{}:{selfVerification:u.selfVerification},...n.systemPrompt?{systemPrompt:n.systemPrompt}:{},backgroundTaskRunners:a,subagentRunnerFactory:o,commandModules:s,commandHostAdapters:c});await p.run(d),process.exit(p.getExitCode())}function _e(){let e=new l.TransportRegistry((0,n.getUserSettingsPath)());return e.register(new u.WsTransport),e}async function ve(r={}){if(process.argv[2]===`session`&&process.argv[3]===`analyze`){await R(process.argv.slice(4),process.cwd());return}let a;try{a=E()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let o=z();if(a.help){process.stdout.write(ee());return}if(a.version){process.stdout.write(`robota ${o}\n`);return}if(a.checkUpdate){let e=await(0,n.checkForCliUpdate)({currentVersion:o,force:!0}),t=(0,n.formatCliUpdateCheckMessage)(e);e.status===`error`&&(process.stderr.write(`${t}\n`),process.exit(1)),process.stdout.write(`${t}\n`);return}let l=process.cwd(),u=new t.PrintTerminal;if(a.reset){process.exitCode=await V(u,{yes:a.yes,isTTY:process.stdin.isTTY===!0});return}if(a.positional[0]===`diagnose`){let e=await ie({version:o,terminal:u,cwd:l});process.exitCode=+(e>0);return}if(a.positional[0]===`session`&&a.positional[1]===`analyze`){await R(process.argv.slice(4),l);return}try{if(await ne(a,l,u))return}catch(e){u.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let p=(0,n.readSettings)((0,n.getUserSettingsPath)()),m=typeof p.preset==`string`?p.preset:void 0,h=(0,i.loadExternalPresets)();for(let{file:e,error:t}of h.errors)u.writeError(`Skipped external preset "${e}": ${t}`);let g;try{g=k(a,m)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let _=D(a,m),{commandHostAdapters:v,providerDefinitions:y,commandModules:x,startupUpdateNoticePromise:S}=pe(l,a,r,o,{...g.enabledCommandModules===void 0?{}:{enabledCommandModules:g.enabledCommandModules},...g.disabledCommandModules===void 0?{}:{disabledCommandModules:g.disabledCommandModules}});if(a.positional[0]===`init`){try{await se(l,u,{yes:a.yes,onProviderSetup:async()=>{await M(l,a,t.promptInput,u,y)}})}catch(e){u.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}return}if(a.configure){await M(l,a,t.promptInput,u,y);return}if(te(l,a,u,y))return;try{await j(l,a,t.promptInput,u,y)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(e instanceof n.ProviderConfigError&&a.printMode?3:1)}let C=a.provider?{providerOverride:a.provider,providerDefinitions:y}:{providerDefinitions:y},w=(0,n.readProviderSettings)(l,C),T=g.model??w.model;if(w.source===`env-default`&&w.sourceEnvVar!==void 0){let e=`Using ${w.name} (${T}) via ${w.sourceEnvVar} — run \`robota --configure\` to persist a profile.\n`;a.printMode?process.stderr.write(e):u.writeLine(e.trimEnd())}let O=(0,n.createProviderFromSettings)(l,g.model,C),A=(0,d.createDefaultBackgroundTaskRunners)(),N=(0,n.projectPaths)(l),P=(0,f.createChildProcessSubagentRunnerFactory)({workerPath:(0,f.getDefaultSubagentWorkerPath)(),providerConfig:{...w,model:T},logsDir:N.logs}),F=(0,n.createProjectSessionStore)(l),I,L=!1;if(a.continueMode?I=(0,n.resolveLatestSessionId)(F,l):a.resumeId!==void 0&&(a.resumeId===``?L=!0:(I=(0,n.resolveSessionIdByIdOrName)(F,a.resumeId),I===void 0&&(process.stderr.write(`Session not found: ${a.resumeId}\n`),process.exit(1)))),a.printMode){await ge(l,a,O,F,A,P,x,v,{resumeSessionId:I,forkSession:a.forkSession},{agentName:g.agentName??i.DEFAULT_AGENT_NAME,activePresetId:_,persona:g.persona,...g.permissionMode===void 0?{}:{permissionMode:g.permissionMode},...g.enableParallelSubagents===void 0?{}:{enableParallelSubagents:g.enableParallelSubagents},...g.selfVerification===void 0?{}:{selfVerification:g.selfVerification}});return}fe(u),ce()&&(de(u),le()),await(0,c.renderApp)({cwd:l,provider:O,providerOverride:a.provider,providerType:w.name,modelId:T,language:a.language,permissionMode:a.permissionMode??g.permissionMode,maxTurns:a.maxTurns,allowedTools:b(a.allowedTools),deniedTools:b(a.deniedTools),version:o,sessionStore:a.noSessionPersistence?void 0:F,resumeSessionId:I,showSessionPickerOnStart:L,forkSession:a.forkSession,sessionName:a.sessionName,backgroundTaskRunners:A,subagentRunnerFactory:P,commandModules:x,commandHostAdapters:v,shellExec:t=>(0,e.execSync)(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:S?S.then(e=>e?(0,n.formatCliUpdateNotice)(e):void 0):void 0,transportRegistry:_e(),cliAdapter:(0,c.createDefaultTuiCliAdapter)({providerDefinitions:y,reloadPluginCommandSource:s.reloadPluginCommandSource}),reloadPluginCommandSource:s.reloadPluginCommandSource,agentName:g.agentName??i.DEFAULT_AGENT_NAME,activePresetId:_,persona:g.persona,...g.enableParallelSubagents===void 0?{}:{enableParallelSubagents:g.enableParallelSubagents},...g.selfVerification===void 0?{}:{selfVerification:g.selfVerification}}),process.exit(0)}exports.startCli=ve;
|
package/dist/node/index.d.ts
CHANGED
package/dist/node/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/startup/command-setup.ts","../../src/cli.ts"],"mappings":";;;;UAuBiB,gBAAA;EACf,cAAA,YAA0B,cAAA;EAC1B,mBAAA,YAA+B,mBAAmB;AAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/startup/command-setup.ts","../../src/cli.ts"],"mappings":";;;;UAuBiB,gBAAA;EACf,cAAA,YAA0B,cAAA;EAC1B,mBAAA,YAA+B,mBAAmB;AAAA;;;iBC0C9B,QAAA,CAAS,OAAA,GAAS,gBAAA,GAAwB,OAAO"}
|
package/dist/node/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{execSync as e}from"node:child_process";import{HeadlessInteractionChannel as t,PrintTerminal as n,promptInput as r}from"@robota-sdk/agent-transport/headless";import{ProviderConfigError as i,applyProviderConfiguration as a,applyProviderSwitch as o,checkForCliUpdate as s,createProjectSessionStore as c,createProviderFromSettings as l,
|
|
1
|
+
import{execSync as e}from"node:child_process";import{HeadlessInteractionChannel as t,PrintTerminal as n,promptInput as r}from"@robota-sdk/agent-transport/headless";import{ProviderConfigError as i,applyProviderConfiguration as a,applyProviderSwitch as o,checkForCliUpdate as s,createProjectSessionStore as c,createProviderFromSettings as l,createUserSessionStore as u,formatCliUpdateCheckMessage as d,formatCliUpdateNotice as f,getProviderSettingsPaths as p,getStartupCliUpdateNotice as m,getUserSettingsPath as h,projectPaths as g,readMergedProviderSettings as _,readPackageVersion as ee,readProviderSettings as v,readSettings as y,resetUserConfig as b,resolveLatestSessionId as te,resolveProviderSettingsWriteTargetPath as x,resolveSessionIdByIdOrName as ne,resolveSettingsPathForScope as S,shouldRunStartupCliUpdateCheck as C,userPaths as w,writeSettings as T}from"@robota-sdk/agent-framework";import{parseArgs as E}from"node:util";import{DEFAULT_AGENT_NAME as D,loadExternalPresets as re,resolvePreset as O}from"@robota-sdk/agent-preset";import{formatSupportedProviderTypes as k}from"@robota-sdk/agent-core";import{createDefaultProviderDefinitions as A}from"@robota-sdk/agent-provider";import{createDefaultCommandModules as j,createDefaultPluginCommandAdapter as M,ensureProviderConfig as N,executeUserLocalDirectCommand as P,reloadPluginCommandSource as ie,runProviderStartupSetup as F}from"@robota-sdk/agent-command";import{createDefaultTuiCliAdapter as ae,renderApp as oe}from"@robota-sdk/agent-transport-tui";import{TransportRegistry as I}from"@robota-sdk/agent-transport";import{WsTransport as se}from"@robota-sdk/agent-transport-ws";import{createDefaultBackgroundTaskRunners as ce}from"@robota-sdk/agent-executor";import{createChildProcessSubagentRunnerFactory as le,getDefaultSubagentWorkerPath as ue}from"@robota-sdk/agent-subagent-runner";import{aggregateReports as de,analyzeSession as L,formatAggregateReport as fe,formatSingleSession as R}from"@robota-sdk/agent-session-analytics";import{existsSync as z,mkdirSync as pe,readFileSync as B,writeFileSync as V}from"node:fs";import{createInterface as me}from"node:readline/promises";import{createConnection as he}from"node:net";import{dirname as H,join as U,resolve as ge}from"node:path";const W=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],G=[`text`,`json`,`stream-json`];function _e(){return`
|
|
2
2
|
Usage: robota [options] [-p <prompt>]
|
|
3
3
|
|
|
4
4
|
Options:
|
|
@@ -21,6 +21,7 @@ Options:
|
|
|
21
21
|
--allowed-tools <list> Comma-separated tool allowlist (TUI and print mode)
|
|
22
22
|
--denied-tools <list> Comma-separated tool denylist (TUI and print mode)
|
|
23
23
|
--model <model> Model override for this run
|
|
24
|
+
--preset <id> Preset id to apply (default: settings.preset or "default")
|
|
24
25
|
--json-schema <schema> Print mode: instruct the model to respond with JSON matching this schema
|
|
25
26
|
--dry-run Alias for --permission-mode plan (plan only, no execution)
|
|
26
27
|
--reset Delete ~/.robota/settings.json (provider profiles and preferences).
|
|
@@ -43,20 +44,18 @@ Examples:
|
|
|
43
44
|
robota --task-file task.md Run task from file (appended to system prompt)
|
|
44
45
|
robota -p "Refactor the auth module" --dry-run Plan only, no execution
|
|
45
46
|
robota --continue Resume the last session
|
|
46
|
-
`}function
|
|
47
|
-
`)}function
|
|
48
|
-
`)}
|
|
49
|
-
`)
|
|
50
|
-
`);return}if(n.last!==void 0){let e=r.slice(-n.last),t=[];for(let n of e)try{t.push(G(U(n)))}catch{}t.length===0&&(process.stderr.write(`No valid sessions found.
|
|
51
|
-
`),process.exit(1));let i=Le(t);process.stdout.write(Pe(i)+`
|
|
47
|
+
`}function K(e){if(e===void 0)return;let t=e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0);return t.length>0?t:void 0}function ve(e){if(e!==void 0){if(!G.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${G.join(` | `)}`);return e}}function ye(e){if(e!==void 0){if(!W.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${W.join(` | `)}`);return e}}function be(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 xe={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`},preset:{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 Se(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,language:e.language,permissionMode:ye(e[`permission-mode`]),maxTurns:be(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:ve(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,preset:e.preset,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 Ce(){let{values:e,positionals:t}=E(xe),n=Se(e,t);if(n.printMode){if(n.resumeId===``)throw Error(`Print mode requires an explicit session id: -r <id|name> (the interactive session picker is TUI-only)`);if(n.noSessionPersistence&&(n.continueMode||n.resumeId!==void 0))throw Error(`--no-session-persistence conflicts with -c/-r (resume needs the session store)`)}if(n.dryRun){if(n.permissionMode!==void 0&&n.permissionMode!==`plan`)throw Error(`--dry-run is an alias for --permission-mode plan and conflicts with --permission-mode ${n.permissionMode}`);return{...n,permissionMode:`plan`}}return n}function q(e,t){return e.preset??t??`default`}function we(e){return{...e.model===void 0?{}:{model:e.model},...e.systemPrompt===void 0?{}:{systemPrompt:e.systemPrompt},...e.appendSystemPrompt===void 0?{}:{appendSystemPrompt:e.appendSystemPrompt},...e.language===void 0?{}:{language:e.language},...e.permissionMode===void 0?{}:{permissionMode:e.permissionMode}}}function Te(e,t){return O(q(e,t),{cliOverrides:we(e)})}function J(e){if(e===void 0||e===`user`||e===`project-local`)return e;throw Error(`Invalid --settings-scope "${e}". Valid: user | project-local`)}function Ee(e,t,n,r=A()){let i=S(e,J(t.settingsScope));return t.configureProvider?(a(i,Oe(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:_(e).providers}),n.writeLine(`Current provider set to ${t.provider}`),!t.printMode&&t.positional.length===0):!1}async function De(e,t,n,r,i=A(),a){await N(e,{provider:t.provider,settingsScope:J(t.settingsScope)},n,r,i,{formatError:ke,isInteractive:a===void 0?()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0:()=>a})}async function Y(e,t,n,r,i=A()){await F(e,{settingsScope:J(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 ke(e=A()){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${k(e)}`,...e.map(Ae)].join(`
|
|
48
|
+
`)}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 je(e,t,n){if(e.positional[0]!==`user-local`)return!1;let r=await P({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 Me(e){let t,n;for(let r=0;r<e.length;r++)if(e[r]===`--last`&&e[r+1]){let n=parseInt(e[r+1],10);!isNaN(n)&&n>0&&(t=n),r++}else e[r]===`--session`&&e[r+1]&&(n=e[r+1],r++);return{last:t,sessionId:n}}function Ne(e){let t=new Map;for(let e of u().list())t.set(e.id,e);for(let n of c(e).list())t.set(n.id,n);return[...t.values()].sort((e,t)=>e.id.localeCompare(t.id))}async function X(e,t=process.cwd()){let n=Me(e),r=Ne(t);if(r.length===0&&(process.stderr.write(`No session files found in ${g(t).sessions} or ${w().sessions}\n`),process.exit(1)),n.sessionId!==void 0){let e=r.find(e=>e.id.includes(n.sessionId));e||(process.stderr.write(`Session not found: ${n.sessionId}\n`),process.exit(1)),process.stdout.write(R(L(e))+`
|
|
49
|
+
`);return}if(n.last!==void 0){let e=r.slice(-n.last).map(e=>L(e));e.length===0&&(process.stderr.write(`No valid sessions found.
|
|
50
|
+
`),process.exit(1)),process.stdout.write(fe(de(e))+`
|
|
52
51
|
`);return}let i=r[r.length-1];i||(process.stderr.write(`No sessions found.
|
|
53
|
-
`),process.exit(1))
|
|
54
|
-
`)}const
|
|
55
|
-
Recommendation: use iTerm2 (https://iterm2.com)`}:{label:`Terminal`,status:`ok`,message:e}}function
|
|
52
|
+
`),process.exit(1)),process.stdout.write(R(L(i))+`
|
|
53
|
+
`)}const Pe=()=>ee(import.meta.url);async function Fe(e){let t=me({input:process.stdin,output:process.stdout});try{let n=(await t.question(e)).trim().toLowerCase();return n===`y`||n===`yes`}finally{t.close()}}async function Ie(e,t){let n=h();if(!z(n))return e.writeLine(`No user settings found.`),0;if(!t.yes){if(!t.isTTY)return e.writeError(`--reset deletes ${n}. Refusing without confirmation in non-interactive mode — pass --yes to proceed.`),1;if(!await(t.confirm??Fe)(`Delete ${n}? [y/N] `))return e.writeLine(`Reset cancelled.`),1}let r=b();return r.deleted?e.writeLine(`Deleted ${r.path}`):e.writeLine(`No user settings found.`),0}const Z={anthropic:{host:`api.anthropic.com`,port:443},openai:{host:`api.openai.com`,port:443},gemini:{host:`generativelanguage.googleapis.com`,port:443},deepseek:{host:`api.deepseek.com`,port:443},qwen:{host:`dashscope.aliyuncs.com`,port:443}};function Le(){let[e]=process.versions.node.split(`.`).map(Number);return e!==void 0&&e>=22?{label:`Node.js version`,status:`ok`,message:`v${process.versions.node}`}:{label:`Node.js version`,status:`fail`,message:`v${process.versions.node} (requires >=22)\n nvm: nvm install 22 && nvm use 22\n Volta: volta install node@22`}}function Re(e){return{label:`robota version`,status:`ok`,message:e}}function ze(e,t,n){try{let r=v(e,{providerDefinitions:t,env:n}),i=r.source===`env-default`?`env-default via ${r.sourceEnvVar??`environment`}`:`settings profile`,a=r.model===void 0?``:` (${r.model})`;return{label:`API key`,status:`ok`,message:`${r.name}${a} — ${i}`}}catch(e){return{label:`API key`,status:`fail`,message:`${e instanceof Error?e.message:String(e)}\n Set ANTHROPIC_API_KEY or run: robota --configure\n Get key: https://console.anthropic.com/settings/keys`}}}function Be(e){try{return JSON.parse(B(e,`utf-8`)),`ok`}catch{return`corrupt`}}function Ve(e){let t=p(e).filter(e=>z(e));return t.length===0?[{label:`Settings file`,status:`warn`,message:`Not found — run: robota --configure`}]:t.map(e=>Be(e)===`corrupt`?{label:`Settings file`,status:`fail`,message:`${e} — invalid JSON\n Fix or delete the file, or run: robota --configure`}:{label:`Settings file`,status:`ok`,message:e})}function He(e){try{let t=JSON.parse(B(e,`utf-8`));return typeof t.currentProvider==`string`?t.currentProvider:void 0}catch{return}}function Ue(e){let t=U(e,`.robota`,`settings.json`),n=U(process.env.HOME??``,`.robota`,`settings.json`),r=z(t)?t:z(n)?n:void 0;if(r!==void 0){let e=(He(r)??``).toLowerCase(),t=Object.entries(Z).find(([t])=>e.startsWith(t));if(t)return t[1]}return Z.anthropic}function We(){let e=process.env.TERM_PROGRAM??`unknown`;return process.platform===`darwin`&&e===`Apple_Terminal`?{label:`Terminal`,status:`warn`,message:`macOS Terminal.app — CJK/IME input may be unstable
|
|
54
|
+
Recommendation: use iTerm2 (https://iterm2.com)`}:{label:`Terminal`,status:`ok`,message:e}}function Ge(e){let t=`Network (${e.host})`;return new Promise(n=>{let r=Date.now(),i=he({host:e.host,port:e.port}),a=setTimeout(()=>{i.destroy(),n({label:t,status:`fail`,message:`timeout (3s)`})},3e3);i.on(`connect`,()=>{clearTimeout(a),i.destroy(),n({label:t,status:`ok`,message:`reachable (${Date.now()-r}ms)`})}),i.on(`error`,e=>{clearTimeout(a),n({label:t,status:`warn`,message:`${e.message}\n Check proxy settings or firewall`})})})}async function Ke(e,t={checkNetwork:Ge}){e.terminal.writeLine(`
|
|
56
55
|
robota diagnose
|
|
57
|
-
`);let n=
|
|
58
|
-
`);e.terminal.writeLine(` ${n} ${t.label}: ${r[0]}`);for(let t of r.slice(1))e.terminal.writeLine(` ${t}`);t.status===`fail`&&o++,t.status===`warn`&&s++}return e.terminal.writeLine(``),o===0&&s===0?e.terminal.writeLine(`✓ All checks passed. robota is ready to use.`):o>0?e.terminal.writeLine(`✗ ${o} issue(s) found. Fix the items above to use robota.`):e.terminal.writeLine(`⚠ ${s} warning(s). robota may work but check the items above.`),e.terminal.writeLine(``),o}const Q=`robota`,
|
|
59
|
-
`,`utf8`),t.writeLine(``),t.writeLine(`Created: .robota/settings.json`),
|
|
56
|
+
`);let n=Ue(e.cwd),r=t.providerDefinitions??A(),i=t.env??process.env,a=[Le(),Re(e.version),ze(e.cwd,r,i),...Ve(e.cwd),We(),await t.checkNetwork(n)],o=0,s=0;for(let t of a){let n=t.status===`ok`?`✓`:t.status===`warn`?`⚠`:`✗`,r=t.message.split(`
|
|
57
|
+
`);e.terminal.writeLine(` ${n} ${t.label}: ${r[0]}`);for(let t of r.slice(1))e.terminal.writeLine(` ${t}`);t.status===`fail`&&o++,t.status===`warn`&&s++}return e.terminal.writeLine(``),o===0&&s===0?e.terminal.writeLine(`✓ All checks passed. robota is ready to use.`):o>0?e.terminal.writeLine(`✗ ${o} issue(s) found. Fix the items above to use robota.`):e.terminal.writeLine(`⚠ ${s} warning(s). robota may work but check the items above.`),e.terminal.writeLine(``),o}const Q=`robota`,qe={permissions:{allow:[`Read(.robota/**)`,`Read(.claude/**)`,`Read(.agents/**)`],deny:[]}};function Je(e){let t=U(e,`settings.json`);if(!z(t))return{};let n=B(t,`utf8`);try{return JSON.parse(n)}catch{return null}}var Ye=class extends Error{constructor(e){super(`Cannot ask "${e}" in a non-interactive shell. Re-run with --yes to accept the defaults.`),this.name=`InitPromptUnavailableError`}};async function $(e,t,n){if(n.yes||n.ci)return n.terminal.writeLine(`${e} → ${t?`Y`:`N`} (${n.yes?`--yes`:`CI`}: using default)`),t;if(!n.isTTY)throw new Ye(e);let r=await n.promptFn(`${e} [y/N] `);return r.toLowerCase()===`y`||r.toLowerCase()===`yes`}async function Xe(e,t,n={}){t.writeLine(``),t.writeLine(`${Q} project initialization`),t.writeLine(`─`.repeat(40));let i={yes:n.yes===!0,ci:n.ci??process.env.CI===`true`,isTTY:n.isTTY??process.stdin.isTTY===!0,promptFn:n.promptFn??r,terminal:t},a=g(e).settings,o=H(a),s=U(e,`AGENTS.md`),c=U(e,`.claude`),l=z(c),u=z(a),d=z(s);if(u&&d&&(t.writeLine(``),t.writeLine(`Both AGENTS.md and .robota/settings.json already exist.`),!await $(`Overwrite existing files?`,!1,i))){t.writeLine(`Init cancelled.`);return}let f={...qe};if(l&&(t.writeLine(``),t.writeLine(`Detected .claude/ directory (Claude Code configuration).`),await $(`Migrate Claude Code settings to .robota/?`,!1,i))){let e=Je(c);if(e===null)t.writeLine(`Warning: .claude/settings.json could not be parsed — skipping migration.`);else{let n=e.permissions;f={...e,permissions:{...typeof e.permissions==`object`&&e.permissions!==null?e.permissions:{},allow:[...qe.permissions.allow,...n?.allow??[]],deny:n?.deny??[]}},t.writeLine(`Settings imported from .claude/settings.json.`)}}pe(o,{recursive:!0}),V(a,JSON.stringify(f,null,2)+`
|
|
58
|
+
`,`utf8`),t.writeLine(``),t.writeLine(`Created: .robota/settings.json`),V(s,`# AGENTS.md — Project Agent Guidelines
|
|
60
59
|
|
|
61
60
|
This file guides the AI agent working in this project. Customize it for your project.
|
|
62
61
|
|
|
@@ -86,7 +85,7 @@ npm run build
|
|
|
86
85
|
## Important Notes
|
|
87
86
|
|
|
88
87
|
<!-- Anything the agent should know before making changes -->
|
|
89
|
-
`,`utf8`),t.writeLine(`Created: AGENTS.md`),t.writeLine(``),t.writeLine(`Initialization complete.`),t.writeLine(``),t.writeLine(`Next steps:`),t.writeLine(` 1. Edit AGENTS.md to describe your project conventions`),t.writeLine(` 2. Run \`${Q} --configure\` to set up your AI provider`),t.writeLine(` 3. Run \`${Q}\` to start the assistant`),t.writeLine(``),n.onProviderSetup!==void 0&&(i.isTTY||i.yes||i.ci)&&await $(`Would you like to set up a provider now?`,!1,i)&&await n.onProviderSetup()}function
|
|
88
|
+
`,`utf8`),t.writeLine(`Created: AGENTS.md`),t.writeLine(``),t.writeLine(`Initialization complete.`),t.writeLine(``),t.writeLine(`Next steps:`),t.writeLine(` 1. Edit AGENTS.md to describe your project conventions`),t.writeLine(` 2. Run \`${Q} --configure\` to set up your AI provider`),t.writeLine(` 3. Run \`${Q}\` to start the assistant`),t.writeLine(``),n.onProviderSetup!==void 0&&(i.isTTY||i.yes||i.ci)&&await $(`Would you like to set up a provider now?`,!1,i)&&await n.onProviderSetup()}function Ze(e=w().onboarded){return!z(e)}function Qe(e=w().onboarded){pe(H(e),{recursive:!0}),V(e,new Date().toISOString())}const $e=`
|
|
90
89
|
╭─────────────────────────────────────────────────────────────╮
|
|
91
90
|
│ Welcome to ${Q}! — AI coding assistant │
|
|
92
91
|
│ │
|
|
@@ -103,12 +102,12 @@ npm run build
|
|
|
103
102
|
│ │
|
|
104
103
|
│ ${Q} diagnose — check your setup │
|
|
105
104
|
╰─────────────────────────────────────────────────────────────╯
|
|
106
|
-
`;function
|
|
105
|
+
`;function et(e){e.writeLine($e)}function tt(e){process.platform===`darwin`&&process.env.TERM_PROGRAM===`Apple_Terminal`&&e.writeError(`
|
|
107
106
|
⚠ macOS Terminal.app detected: CJK/IME input may be unstable.
|
|
108
107
|
Recommended: use iTerm2 (https://iterm2.com) for Korean/Japanese/Chinese input.
|
|
109
108
|
Or use headless mode: robota -p "your prompt"
|
|
110
|
-
`)}function
|
|
109
|
+
`)}function nt(e,t,n,r,i={}){let a={settings:{read:()=>y(h()),write:e=>T(h(),e)},plugin:M(e)},o=n.providerDefinitions??A();return{commandHostAdapters:a,providerDefinitions:o,commandModules:[...j({cwd:e,providerDefinitions:o,providerSettingsAdapter:{readMergedSettings:()=>_(e),readTargetSettings:()=>y(x(e)),writeTargetSettings:t=>T(x(e),t)},...i.enabledCommandModules===void 0?{}:{enabledCommandModules:i.enabledCommandModules},...i.disabledCommandModules===void 0?{}:{disabledCommandModules:i.disabledCommandModules}}),...n.commandModules??[]],startupUpdateNoticePromise:C(t)?m({currentVersion:r}):void 0}}function rt(e,t){let n=B(ge(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function it(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(rt(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(`
|
|
111
110
|
|
|
112
|
-
`):void 0}async function
|
|
113
|
-
`),process.exit(1));let
|
|
111
|
+
`):void 0}async function at(e,n,r,i,a,o,s,c,l={},u={}){let d=n.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.
|
|
112
|
+
`),process.exit(1));let f=it(e,n),p=new t({cwd:e,provider:r,outputFormat:n.outputFormat??`text`,permissionMode:n.permissionMode??u.permissionMode??`bypassPermissions`,maxTurns:n.maxTurns,sessionStore:n.noSessionPersistence?void 0:i,resumeSessionId:l.resumeSessionId,forkSession:l.forkSession,sessionName:n.sessionName,bare:n.bare||void 0,allowedTools:K(n.allowedTools),deniedTools:K(n.deniedTools),appendSystemPrompt:f,...u.persona===void 0?{}:{persona:u.persona},...u.agentName===void 0?{}:{agentName:u.agentName},...u.activePresetId===void 0?{}:{activePresetId:u.activePresetId},...u.enableParallelSubagents===void 0?{}:{enableParallelSubagents:u.enableParallelSubagents},...u.selfVerification===void 0?{}:{selfVerification:u.selfVerification},...n.systemPrompt?{systemPrompt:n.systemPrompt}:{},backgroundTaskRunners:a,subagentRunnerFactory:o,commandModules:s,commandHostAdapters:c});await p.run(d),process.exit(p.getExitCode())}function ot(){let e=new I(h());return e.register(new se),e}async function st(t={}){if(process.argv[2]===`session`&&process.argv[3]===`analyze`){await X(process.argv.slice(4),process.cwd());return}let a;try{a=Ce()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let o=Pe();if(a.help){process.stdout.write(_e());return}if(a.version){process.stdout.write(`robota ${o}\n`);return}if(a.checkUpdate){let e=await s({currentVersion:o,force:!0}),t=d(e);e.status===`error`&&(process.stderr.write(`${t}\n`),process.exit(1)),process.stdout.write(`${t}\n`);return}let u=process.cwd(),p=new n;if(a.reset){process.exitCode=await Ie(p,{yes:a.yes,isTTY:process.stdin.isTTY===!0});return}if(a.positional[0]===`diagnose`){let e=await Ke({version:o,terminal:p,cwd:u});process.exitCode=+(e>0);return}if(a.positional[0]===`session`&&a.positional[1]===`analyze`){await X(process.argv.slice(4),u);return}try{if(await je(a,u,p))return}catch(e){p.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let m=y(h()),_=typeof m.preset==`string`?m.preset:void 0,ee=re();for(let{file:e,error:t}of ee.errors)p.writeError(`Skipped external preset "${e}": ${t}`);let b;try{b=Te(a,_)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let x=q(a,_),{commandHostAdapters:S,providerDefinitions:C,commandModules:w,startupUpdateNoticePromise:T}=nt(u,a,t,o,{...b.enabledCommandModules===void 0?{}:{enabledCommandModules:b.enabledCommandModules},...b.disabledCommandModules===void 0?{}:{disabledCommandModules:b.disabledCommandModules}});if(a.positional[0]===`init`){try{await Xe(u,p,{yes:a.yes,onProviderSetup:async()=>{await Y(u,a,r,p,C)}})}catch(e){p.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}return}if(a.configure){await Y(u,a,r,p,C);return}if(Ee(u,a,p,C))return;try{await De(u,a,r,p,C)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(e instanceof i&&a.printMode?3:1)}let E=a.provider?{providerOverride:a.provider,providerDefinitions:C}:{providerDefinitions:C},O=v(u,E),k=b.model??O.model;if(O.source===`env-default`&&O.sourceEnvVar!==void 0){let e=`Using ${O.name} (${k}) via ${O.sourceEnvVar} — run \`robota --configure\` to persist a profile.\n`;a.printMode?process.stderr.write(e):p.writeLine(e.trimEnd())}let A=l(u,b.model,E),j=ce(),M=g(u),N=le({workerPath:ue(),providerConfig:{...O,model:k},logsDir:M.logs}),P=c(u),F,I=!1;if(a.continueMode?F=te(P,u):a.resumeId!==void 0&&(a.resumeId===``?I=!0:(F=ne(P,a.resumeId),F===void 0&&(process.stderr.write(`Session not found: ${a.resumeId}\n`),process.exit(1)))),a.printMode){await at(u,a,A,P,j,N,w,S,{resumeSessionId:F,forkSession:a.forkSession},{agentName:b.agentName??D,activePresetId:x,persona:b.persona,...b.permissionMode===void 0?{}:{permissionMode:b.permissionMode},...b.enableParallelSubagents===void 0?{}:{enableParallelSubagents:b.enableParallelSubagents},...b.selfVerification===void 0?{}:{selfVerification:b.selfVerification}});return}tt(p),Ze()&&(et(p),Qe()),await oe({cwd:u,provider:A,providerOverride:a.provider,providerType:O.name,modelId:k,language:a.language,permissionMode:a.permissionMode??b.permissionMode,maxTurns:a.maxTurns,allowedTools:K(a.allowedTools),deniedTools:K(a.deniedTools),version:o,sessionStore:a.noSessionPersistence?void 0:P,resumeSessionId:F,showSessionPickerOnStart:I,forkSession:a.forkSession,sessionName:a.sessionName,backgroundTaskRunners:j,subagentRunnerFactory:N,commandModules:w,commandHostAdapters:S,shellExec:t=>e(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:T?T.then(e=>e?f(e):void 0):void 0,transportRegistry:ot(),cliAdapter:ae({providerDefinitions:C,reloadPluginCommandSource:ie}),reloadPluginCommandSource:ie,agentName:b.agentName??D,activePresetId:x,persona:b.persona,...b.enableParallelSubagents===void 0?{}:{enableParallelSubagents:b.enableParallelSubagents},...b.selfVerification===void 0?{}:{selfVerification:b.selfVerification}}),process.exit(0)}export{st as startCli};
|
|
114
113
|
//# sourceMappingURL=index.js.map
|