@robota-sdk/agent-cli 3.0.0-beta.67 → 3.0.0-beta.69
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/README.md +116 -35
- package/bin/robota.cjs +5 -1
- package/dist/node/bin.d.ts +1 -0
- package/dist/node/bin.js +23 -8
- package/dist/node/bin.js.map +1 -1
- package/dist/node/cli.cjs +1 -0
- package/dist/node/cli.d.ts +7 -0
- package/dist/node/cli.d.ts.map +1 -0
- package/dist/node/cli.js +2 -0
- package/dist/node/cli.js.map +1 -0
- package/dist/node/constants.cjs +1 -0
- package/dist/node/constants.js +2 -0
- package/dist/node/constants.js.map +1 -0
- package/dist/node/index.cjs +17 -8
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +17 -8
- package/dist/node/index.js.map +1 -1
- package/dist/node/init/init-command.cjs +32 -0
- package/dist/node/init/init-command.js +33 -0
- package/dist/node/init/init-command.js.map +1 -0
- package/dist/node/modes/print-mode.cjs +6 -0
- package/dist/node/modes/print-mode.js +7 -0
- package/dist/node/modes/print-mode.js.map +1 -0
- package/dist/node/modes/shell-exec.cjs +1 -0
- package/dist/node/modes/shell-exec.js +2 -0
- package/dist/node/modes/shell-exec.js.map +1 -0
- package/dist/node/modes/tui-mode.cjs +1 -0
- package/dist/node/modes/tui-mode.js +2 -0
- package/dist/node/modes/tui-mode.js.map +1 -0
- package/dist/node/startup/append-system-prompt.cjs +3 -0
- package/dist/node/startup/append-system-prompt.js +4 -0
- package/dist/node/startup/append-system-prompt.js.map +1 -0
- package/dist/node/startup/args-to-options.cjs +1 -0
- package/dist/node/startup/args-to-options.js +2 -0
- package/dist/node/startup/args-to-options.js.map +1 -0
- package/dist/node/startup/command-setup.cjs +1 -0
- package/dist/node/startup/command-setup.d.ts +11 -0
- package/dist/node/startup/command-setup.d.ts.map +1 -0
- package/dist/node/startup/command-setup.js +2 -0
- package/dist/node/startup/command-setup.js.map +1 -0
- package/dist/node/startup/config-phase.cjs +1 -0
- package/dist/node/startup/config-phase.js +2 -0
- package/dist/node/startup/config-phase.js.map +1 -0
- package/dist/node/startup/preflight.cjs +1 -0
- package/dist/node/startup/preflight.js +2 -0
- package/dist/node/startup/preflight.js.map +1 -0
- package/dist/node/startup/provider-setup.cjs +1 -0
- package/dist/node/startup/provider-setup.js +2 -0
- package/dist/node/startup/provider-setup.js.map +1 -0
- package/dist/node/startup/provider-startup.cjs +2 -0
- package/dist/node/startup/provider-startup.js +3 -0
- package/dist/node/startup/provider-startup.js.map +1 -0
- package/dist/node/startup/reset-config.cjs +1 -0
- package/dist/node/startup/reset-config.js +2 -0
- package/dist/node/startup/reset-config.js.map +1 -0
- package/dist/node/startup/session-setup.cjs +1 -0
- package/dist/node/startup/session-setup.js +2 -0
- package/dist/node/startup/session-setup.js.map +1 -0
- package/dist/node/startup/subagent-setup.cjs +1 -0
- package/dist/node/startup/subagent-setup.js +2 -0
- package/dist/node/startup/subagent-setup.js.map +1 -0
- package/dist/node/startup/update-notice.cjs +1 -0
- package/dist/node/startup/update-notice.js +2 -0
- package/dist/node/startup/update-notice.js.map +1 -0
- package/dist/node/startup/version.cjs +1 -0
- package/dist/node/startup/version.js +2 -0
- package/dist/node/startup/version.js.map +1 -0
- package/dist/node/user-local-direct-command.cjs +1 -0
- package/dist/node/user-local-direct-command.js +2 -0
- package/dist/node/user-local-direct-command.js.map +1 -0
- package/dist/node/utils/cli-args.cjs +35 -0
- package/dist/node/utils/cli-args.js +36 -0
- package/dist/node/utils/cli-args.js.map +1 -0
- package/package.json +25 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","names":[],"sources":["../../src/cli.ts"],"sourcesContent":["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 const cwd = process.cwd();\n\n // Layer 0: pre-flight — single point for all early-exit commands\n if ((await handlePreflightCommands(args, { version, terminal, cwd })).handled) return;\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"],"mappings":"4hCA2BA,SAAS,GAAkC,CACzC,GAAI,CACF,OAAO,EAAa,CACtB,OAAS,EAAO,CAEd,QAAQ,OAAO,MAAM,GAAG,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAE,GAAG,EAClF,QAAQ,KAAK,CAAC,CAChB,CACF,CAEA,eAAsB,EAAS,EAA4B,CAAC,EAAkB,CAC5E,IAAM,EAAO,EAAgB,EACvB,EAAU,EAAY,EACtB,EAAW,IAAI,EAEf,EAAM,QAAQ,IAAI,EAGxB,IAAK,MAAM,EAAwB,EAAM,CAAE,UAAS,WAAU,KAAI,CAAC,GAAG,QAAS,OAG/E,IAAM,EAAkB,EAAqB,CAAI,EAC3C,EAAc,EAAoB,CAAI,EAE5C,GAAI,CACF,GAAI,MAAM,EAAqC,EAA0B,CAAI,EAAG,EAAK,CAAQ,EAC3F,MACJ,OAAS,EAAO,CAEd,EAAS,WAAW,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAAC,EAC1E,QAAQ,KAAK,CAAC,CAChB,CAGA,IAAM,EAAQ,QAAQ,MAAM,QAAU,IAAQ,QAAQ,OAAO,QAAU,GACjE,EAAe,EAAmB,EAAK,CAAO,EAEpD,IAAI,MADsB,EAAkB,EAAK,EAAiB,EAAc,EAAU,CAAK,GAC/E,QAAS,OAEzB,IAAM,EAAgB,EAAoB,EAAK,EAAiB,CAAY,EACtE,EAAe,EAAmB,EAAK,CAAW,EAGlD,EAAU,EAAmB,CACjC,MACA,SAAU,EAAc,SACxB,eAAgB,EAAa,eAC7B,oBAAqB,EAAa,oBAClC,0BAA2B,EAAa,0BACxC,sBAAuB,EAAc,sBACrC,aAAc,EAAa,aAC3B,kBAAmB,EAA+B,CACpD,CAAC,EAGD,GAAI,EAAgB,UAAW,CAC7B,MAAM,EAAa,EAAa,CAAO,EACvC,MACF,CAEA,MAAM,EAAW,CACf,UACA,UACA,eACA,gBACA,eACA,cACA,oBAAqB,EAA2B,EAAS,EAA6B,CAAI,CAAC,CAC7F,CAAC,EACD,QAAQ,KAAK,CAAC,CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
exports.AGENT_CLI_NAME=`robota-cli`;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","names":[],"sources":["../../src/constants.ts"],"sourcesContent":["export const AGENT_CLI_NAME = 'robota-cli';\n"],"mappings":"AAAA,MAAa,EAAiB"}
|
package/dist/node/index.cjs
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(
|
|
2
|
-
|
|
3
|
-
`):void 0}const m=`robota-cli`;function h(){return e=>(0,a.execSync)(e,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd()}async function g(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.
|
|
4
|
-
`),process.exit(1)),t}async function _(e,t){let r=await g(e),i=p(t.cwd,e),a=h(),o=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:i,systemPrompt:e.systemPrompt,shellExec:a,agentName:m}),s=(0,n.createHeadlessTransport)({outputFormat:e.outputFormat??`text`,prompt:r});o.attachTransport(s),await s.start(),await o.shutdown({reason:`prompt_input_exit`,message:`Headless transport complete`}),process.exit(s.getExitCode())}async function v(e){let{runtime:t,version:n,commandSetup:r,providerSetup:i,sessionSetup:a,sessionOpts:s,startupUpdateNotice:c}=e;await new o.TuiTransport({runtime:t,providerOverride:i.activeProfileName,providerType:i.providerSettings.name,modelId:i.modelId,language:s.language,permissionMode:s.permissionMode,maxTurns:s.maxTurns,version:n,resumeSessionId:a.resumeSessionId,showSessionPickerOnStart:a.showSessionPickerOnStart,forkSession:s.forkSession,sessionName:s.sessionName,shellExec:h(),startupUpdateNotice:c,cliAdapter:(0,o.createDefaultTuiCliAdapter)({providerDefinitions:r.providerDefinitions,reloadPluginCommandSource:r.reloadPluginCommandSource}),agentName:m}).start()}function y(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 b(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 x(e){return{positional:e.positional,format:e.format,summary:e.summary,source:e.source}}function S(e){return{printMode:e.printMode,disableUpdateCheck:e.disableUpdateCheck}}function C(t,n={}){let r={settings:{read:()=>(0,e.readSettings)((0,e.getUserSettingsPath)()),write:t=>(0,e.writeSettings)((0,e.getUserSettingsPath)(),t)},plugin:(0,s.createDefaultPluginCommandAdapter)(t)},i=n.providerDefinitions??(0,c.createDefaultProviderDefinitions)();return{commandHostAdapters:r,providerDefinitions:i,commandModules:[...(0,s.createDefaultCommandModules)({cwd:t,providerDefinitions:i,providerSettingsAdapter:{readMergedSettings:()=>(0,e.readMergedProviderSettings)(t),readTargetSettings:()=>(0,e.readSettings)((0,e.resolveProviderSettingsWriteTargetPath)(t)),writeTargetSettings:n=>(0,e.writeSettings)((0,e.resolveProviderSettingsWriteTargetPath)(t),n)}}),...n.commandModules??[]],reloadPluginCommandSource:s.reloadPluginCommandSource}}function w(e){if(e===void 0||e===`user`||e===`project-local`)return e;throw Error(`Invalid --settings-scope "${e}". Valid: user | project-local`)}function T(t,n,r,i){let a=(0,e.resolveSettingsPathForScope)(t,w(n.settingsScope));return n.configureProvider?((0,e.applyProviderConfiguration)(a,O(n),{providerDefinitions:i}),r.writeLine(`Provider profile saved to ${a}`),!n.printMode&&n.positional.length===0):n.provider&&n.setCurrent?((0,e.applyProviderSwitch)(n.settingsScope===void 0?(0,e.resolveProviderSettingsWriteTargetPath)(t):a,n.provider,{knownProviders:(0,e.readMergedProviderSettings)(t).providers}),r.writeLine(`Current provider set to ${n.provider}`),!n.printMode&&n.positional.length===0):!1}async function E(e,t,n,r,i,a){await(0,s.ensureProviderConfig)(e,{provider:t.provider,settingsScope:w(t.settingsScope)},n,r,i,{formatError:k,isInteractive:()=>a})}async function D(e,t,n,r,i){await(0,s.runProviderStartupSetup)(e,{settingsScope:w(t.settingsScope)},n,r,i)}function O(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 k(e){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${(0,l.formatSupportedProviderTypes)(e)}`,...e.map(A)].join(`
|
|
5
|
-
`)}function A(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 j(e,t,r,i,a){return t.configure?(await D(e,t,n.promptInput,i,r.providerDefinitions),{handled:!0}):T(e,t,i,r.providerDefinitions)?{handled:!0}:(await E(e,t,n.promptInput,i,r.providerDefinitions,a),{handled:!1})}const M=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],N=[`text`,`json`,`stream-json`];function P(){return`
|
|
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-core`),a=require(`@robota-sdk/agent-provider`),o=require(`@robota-sdk/agent-command`),s=require(`@robota-sdk/agent-transport/tui`),c=require(`@robota-sdk/agent-transport`),l=require(`@robota-sdk/agent-executor`),u=require(`@robota-sdk/agent-subagent-runner`),d=require(`node:fs`),f=require(`node:path`);const p=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],m=[`text`,`json`,`stream-json`];function h(){return`
|
|
6
2
|
Usage: robota [options] [-p <prompt>]
|
|
7
3
|
|
|
8
4
|
Options:
|
|
@@ -12,22 +8,35 @@ Options:
|
|
|
12
8
|
--append-system-prompt <t> Append text to the system prompt
|
|
13
9
|
--language <lang> Language preference (e.g. ko, en)
|
|
14
10
|
--no-session-persistence Disable session persistence for this run
|
|
15
|
-
--model <model> Override model for this session
|
|
16
11
|
--permission-mode <mode> Permission mode: plan | default | acceptEdits | bypassPermissions
|
|
17
12
|
--max-turns <n> Maximum agent turns before stopping
|
|
18
13
|
-c, --continue Continue the most recent session
|
|
19
14
|
-r, --resume <id> Resume a session by ID or name
|
|
20
15
|
-n, --name <name> Name for the new session
|
|
21
|
-
--fork-session Fork the current session
|
|
16
|
+
--fork-session Fork the current session into a new independent session
|
|
17
|
+
--task-file <path> Read a task prompt from file and append it to the system prompt
|
|
18
|
+
--bare Print mode: output raw text only, no formatting wrapper
|
|
22
19
|
--configure Run interactive provider configuration
|
|
23
20
|
--configure-provider <n> Configure a specific provider
|
|
21
|
+
--dry-run Plan-only run: show what the agent would do without modifying files
|
|
24
22
|
--check-update Check for CLI updates
|
|
25
23
|
--version Show version number
|
|
26
24
|
-h, --help Show this help message
|
|
27
25
|
|
|
26
|
+
Commands:
|
|
27
|
+
robota init Initialize AGENTS.md and .robota/settings.json
|
|
28
|
+
|
|
28
29
|
Examples:
|
|
29
30
|
robota Start interactive TUI session
|
|
31
|
+
robota init Initialize project files
|
|
30
32
|
robota -p "Hello" Print mode: send prompt and exit
|
|
31
33
|
robota -p "Hello" --output-format json
|
|
34
|
+
robota -p "Review this diff" --bare Raw output for shell pipelines
|
|
35
|
+
robota --task-file task.md Run task from file (appended to system prompt)
|
|
36
|
+
robota --dry-run "Refactor the auth module" Show plan without modifying files
|
|
32
37
|
robota --continue Resume the last session
|
|
33
|
-
`}function
|
|
38
|
+
`}function g(e){if(e!==void 0){if(!m.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${m.join(` | `)}`);return e}}function _(e){if(e!==void 0){if(!p.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${p.join(` | `)}`);return e}}function v(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 y={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 b(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,language:e.language,permissionMode:_(e[`permission-mode`]),maxTurns:v(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 x(){let{values:e,positionals:t}=(0,r.parseArgs)(y);return b(e,t)}function S(e){if(e===void 0||e===`user`||e===`project-local`)return e;throw Error(`Invalid --settings-scope "${e}". Valid: user | project-local`)}function C(e,t,r,i=(0,a.createDefaultProviderDefinitions)()){let o=(0,n.resolveSettingsPathForScope)(e,S(t.settingsScope));return t.configureProvider?((0,n.applyProviderConfiguration)(o,E(t),{providerDefinitions:i}),r.writeLine(`Provider profile saved to ${o}`),!t.printMode&&t.positional.length===0):t.provider&&t.setCurrent?((0,n.applyProviderSwitch)(t.settingsScope===void 0?(0,n.resolveProviderSettingsWriteTargetPath)(e):o,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 w(e,t,n,r,i=(0,a.createDefaultProviderDefinitions)(),s){await(0,o.ensureProviderConfig)(e,{provider:t.provider,settingsScope:S(t.settingsScope)},n,r,i,{formatError:D,isInteractive:s===void 0?()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0:()=>s})}async function T(e,t,n,r,i=(0,a.createDefaultProviderDefinitions)()){await(0,o.runProviderStartupSetup)(e,{settingsScope:S(t.settingsScope)},n,r,i)}function E(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 D(e=(0,a.createDefaultProviderDefinitions)()){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${(0,i.formatSupportedProviderTypes)(e)}`,...e.map(O)].join(`
|
|
39
|
+
`)}function O(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 k(e,t,n){if(e.positional[0]!==`user-local`)return!1;let r=await(0,o.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}const A=()=>(0,n.readPackageVersion)(require(`url`).pathToFileURL(__filename).href);function j(e){let t=(0,n.resetUserConfig)();t.deleted?e.writeLine(`Deleted ${t.path}`):e.writeLine(`No user settings found.`)}function M(e,t,r,i){let s={settings:{read:()=>(0,n.readSettings)((0,n.getUserSettingsPath)()),write:e=>(0,n.writeSettings)((0,n.getUserSettingsPath)(),e)},plugin:(0,o.createDefaultPluginCommandAdapter)(e)},c=r.providerDefinitions??(0,a.createDefaultProviderDefinitions)();return{commandHostAdapters:s,providerDefinitions:c,commandModules:[...(0,o.createDefaultCommandModules)({cwd:e,providerDefinitions:c,providerSettingsAdapter:{readMergedSettings:()=>(0,n.readMergedProviderSettings)(e),readTargetSettings:()=>(0,n.readSettings)((0,n.resolveProviderSettingsWriteTargetPath)(e)),writeTargetSettings:t=>(0,n.writeSettings)((0,n.resolveProviderSettingsWriteTargetPath)(e),t)}}),...r.commandModules??[]],startupUpdateNoticePromise:(0,n.shouldRunStartupCliUpdateCheck)(t)?(0,n.getStartupCliUpdateNotice)({currentVersion:i}):void 0}}function N(e,t){let n=(0,d.readFileSync)((0,f.resolve)(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function P(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(N(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(`
|
|
40
|
+
|
|
41
|
+
`):void 0}async function F(r,i,a,o,s,c,l,u){let d=i.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.
|
|
42
|
+
`),process.exit(1));let f=P(r,i),p=t=>(0,e.execSync)(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),m=new n.InteractiveSession({cwd:r,provider:a,permissionMode:i.permissionMode??`bypassPermissions`,maxTurns:i.maxTurns,sessionStore:i.noSessionPersistence?void 0:o,sessionName:i.sessionName,bare:i.bare||void 0,allowedTools:i.allowedTools?i.allowedTools.split(`,`).map(e=>e.trim()).filter(e=>e.length>0):void 0,appendSystemPrompt:f,...i.systemPrompt?{systemPrompt:i.systemPrompt}:{},backgroundTaskRunners:s,subagentRunnerFactory:c,commandModules:l,commandHostAdapters:u,shellExec:p,agentName:`robota-cli`}),h=(0,t.createHeadlessTransport)({outputFormat:i.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 I(r={}){let i;try{i=x()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let a=A();if(i.help){process.stdout.write(h());return}if(i.version){process.stdout.write(`robota ${a}\n`);return}if(i.checkUpdate){let e=await(0,n.checkForCliUpdate)({currentVersion:a,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 d=process.cwd(),f=new t.PrintTerminal;if(i.reset){j(f);return}try{if(await k(i,d,f))return}catch(e){f.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let{commandHostAdapters:p,providerDefinitions:m,commandModules:g,startupUpdateNoticePromise:_}=M(d,i,r,a);if(i.configure){await T(d,i,t.promptInput,f,m);return}if(C(d,i,f,m))return;try{await w(d,i,t.promptInput,f,m)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let v=i.provider?{providerOverride:i.provider,providerDefinitions:m}:{providerDefinitions:m},y=(0,n.readProviderSettings)(d,v),b=i.model??y.model,S=(0,n.createProviderFromSettings)(d,i.model,v),E=(0,l.createDefaultBackgroundTaskRunners)(),D=(0,n.projectPaths)(d),O=(0,u.createChildProcessSubagentRunnerFactory)({workerPath:(0,u.getDefaultSubagentWorkerPath)(),providerConfig:{...y,model:b},logsDir:D.logs}),N=(0,n.createProjectSessionStore)(d),P,I=!1;if(i.continueMode?P=(0,n.resolveLatestSessionId)(N,d):i.resumeId!==void 0&&(i.resumeId===``?I=!0:(P=(0,n.resolveSessionIdByIdOrName)(N,i.resumeId),P===void 0&&(process.stderr.write(`Session not found: ${i.resumeId}\n`),process.exit(1)))),i.printMode){await F(d,i,S,N,E,O,g,p);return}await new s.TuiTransport({cwd:d,provider:S,providerOverride:i.provider,providerType:y.name,modelId:b,language:i.language,permissionMode:i.permissionMode,maxTurns:i.maxTurns,version:a,sessionStore:i.noSessionPersistence?void 0:N,resumeSessionId:P,showSessionPickerOnStart:I,forkSession:i.forkSession,sessionName:i.sessionName,backgroundTaskRunners:E,subagentRunnerFactory:O,commandModules:g,commandHostAdapters:p,shellExec:t=>(0,e.execSync)(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:_?_.then(e=>e?(0,n.formatCliUpdateNotice)(e):void 0):void 0,transportRegistry:(0,c.createDefaultTransportRegistry)(),cliAdapter:(0,s.createDefaultTuiCliAdapter)({providerDefinitions:m,reloadPluginCommandSource:o.reloadPluginCommandSource}),reloadPluginCommandSource:o.reloadPluginCommandSource,agentName:`robota-cli`}).start(),process.exit(0)}exports.startCli=I;
|
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":";;;;
|
|
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;;;iBCkB9B,QAAA,CAAS,OAAA,GAAS,gBAAA,GAAwB,OAAO"}
|
package/dist/node/index.js
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
import{
|
|
2
|
-
|
|
3
|
-
`):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.
|
|
4
|
-
`),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(`
|
|
5
|
-
`)}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`
|
|
1
|
+
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`
|
|
6
2
|
Usage: robota [options] [-p <prompt>]
|
|
7
3
|
|
|
8
4
|
Options:
|
|
@@ -12,23 +8,36 @@ Options:
|
|
|
12
8
|
--append-system-prompt <t> Append text to the system prompt
|
|
13
9
|
--language <lang> Language preference (e.g. ko, en)
|
|
14
10
|
--no-session-persistence Disable session persistence for this run
|
|
15
|
-
--model <model> Override model for this session
|
|
16
11
|
--permission-mode <mode> Permission mode: plan | default | acceptEdits | bypassPermissions
|
|
17
12
|
--max-turns <n> Maximum agent turns before stopping
|
|
18
13
|
-c, --continue Continue the most recent session
|
|
19
14
|
-r, --resume <id> Resume a session by ID or name
|
|
20
15
|
-n, --name <name> Name for the new session
|
|
21
|
-
--fork-session Fork the current session
|
|
16
|
+
--fork-session Fork the current session into a new independent session
|
|
17
|
+
--task-file <path> Read a task prompt from file and append it to the system prompt
|
|
18
|
+
--bare Print mode: output raw text only, no formatting wrapper
|
|
22
19
|
--configure Run interactive provider configuration
|
|
23
20
|
--configure-provider <n> Configure a specific provider
|
|
21
|
+
--dry-run Plan-only run: show what the agent would do without modifying files
|
|
24
22
|
--check-update Check for CLI updates
|
|
25
23
|
--version Show version number
|
|
26
24
|
-h, --help Show this help message
|
|
27
25
|
|
|
26
|
+
Commands:
|
|
27
|
+
robota init Initialize AGENTS.md and .robota/settings.json
|
|
28
|
+
|
|
28
29
|
Examples:
|
|
29
30
|
robota Start interactive TUI session
|
|
31
|
+
robota init Initialize project files
|
|
30
32
|
robota -p "Hello" Print mode: send prompt and exit
|
|
31
33
|
robota -p "Hello" --output-format json
|
|
34
|
+
robota -p "Review this diff" --bare Raw output for shell pipelines
|
|
35
|
+
robota --task-file task.md Run task from file (appended to system prompt)
|
|
36
|
+
robota --dry-run "Refactor the auth module" Show plan without modifying files
|
|
32
37
|
robota --continue Resume the last session
|
|
33
|
-
`}function
|
|
38
|
+
`}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(`
|
|
39
|
+
`)}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(`
|
|
40
|
+
|
|
41
|
+
`):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.
|
|
42
|
+
`),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)}export{fe as startCli};
|
|
34
43
|
//# sourceMappingURL=index.js.map
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.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"],"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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.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"],"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"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
let e=require(`@robota-sdk/agent-transport/headless`),t=require(`node:fs`),n=require(`node:path`);const r={permissions:{allow:[`Read(.robota/**)`,`Read(.claude/**)`,`Read(.agents/**)`],deny:[]}};function i(e){let r=(0,n.join)(e,`settings.json`);if(!(0,t.existsSync)(r))return{};let i=(0,t.readFileSync)(r,`utf8`);return JSON.parse(i)}async function a(t){let n=await(0,e.promptInput)(`${t} [y/N] `);return n.toLowerCase()===`y`||n.toLowerCase()===`yes`}async function o(e,o){o.writeLine(``),o.writeLine(`Robota project initialization`),o.writeLine(`─`.repeat(40));let s=(0,n.join)(e,`.robota`),c=(0,n.join)(s,`settings.json`),l=(0,n.join)(e,`AGENTS.md`),u=(0,n.join)(e,`.claude`),d=(0,t.existsSync)(u),f=(0,t.existsSync)(c),p=(0,t.existsSync)(l);if(f&&p&&(o.writeLine(``),o.writeLine(`Both AGENTS.md and .robota/settings.json already exist.`),!await a(`Overwrite existing files?`))){o.writeLine(`Init cancelled.`);return}let m={...r};if(d&&(o.writeLine(``),o.writeLine(`Detected .claude/ directory (Claude Code configuration).`),await a(`Migrate Claude Code settings to .robota/?`))){let e=i(u),t=e.permissions;m={...e,permissions:{...typeof e.permissions==`object`&&e.permissions!==null?e.permissions:{},allow:[...r.permissions.allow,...t?.allow??[]],deny:t?.deny??[]}},o.writeLine(`Settings imported from .claude/settings.json.`)}(0,t.mkdirSync)(s,{recursive:!0}),(0,t.writeFileSync)(c,JSON.stringify(m,null,2)+`
|
|
2
|
+
`,`utf8`),o.writeLine(``),o.writeLine(`Created: .robota/settings.json`),(0,t.writeFileSync)(l,`# AGENTS.md — Project Agent Guidelines
|
|
3
|
+
|
|
4
|
+
This file guides the AI agent working in this project. Customize it for your project.
|
|
5
|
+
|
|
6
|
+
## Project Overview
|
|
7
|
+
|
|
8
|
+
<!-- Describe your project's purpose, tech stack, and key conventions -->
|
|
9
|
+
|
|
10
|
+
## Common Commands
|
|
11
|
+
|
|
12
|
+
\`\`\`bash
|
|
13
|
+
# Install dependencies
|
|
14
|
+
npm install
|
|
15
|
+
|
|
16
|
+
# Run tests
|
|
17
|
+
npm test
|
|
18
|
+
|
|
19
|
+
# Build
|
|
20
|
+
npm run build
|
|
21
|
+
\`\`\`
|
|
22
|
+
|
|
23
|
+
## Coding Conventions
|
|
24
|
+
|
|
25
|
+
- Language: <!-- e.g. TypeScript strict mode -->
|
|
26
|
+
- Test framework: <!-- e.g. Vitest, Jest -->
|
|
27
|
+
- Linting: <!-- e.g. ESLint with prettier -->
|
|
28
|
+
|
|
29
|
+
## Important Notes
|
|
30
|
+
|
|
31
|
+
<!-- Anything the agent should know before making changes -->
|
|
32
|
+
`,`utf8`),o.writeLine(`Created: AGENTS.md`),o.writeLine(``),o.writeLine(`Initialization complete.`),o.writeLine(``),o.writeLine(`Next steps:`),o.writeLine(` 1. Edit AGENTS.md to describe your project conventions`),o.writeLine(" 2. Run `robota --configure` to set up your AI provider"),o.writeLine(" 3. Run `robota` to start the assistant"),o.writeLine(``)}exports.runInitCommand=o;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import{promptInput as e}from"@robota-sdk/agent-transport/headless";import{existsSync as t,mkdirSync as n,readFileSync as r,writeFileSync as i}from"node:fs";import{join as a}from"node:path";const o={permissions:{allow:[`Read(.robota/**)`,`Read(.claude/**)`,`Read(.agents/**)`],deny:[]}};function s(e){let n=a(e,`settings.json`);if(!t(n))return{};let i=r(n,`utf8`);return JSON.parse(i)}async function c(t){let n=await e(`${t} [y/N] `);return n.toLowerCase()===`y`||n.toLowerCase()===`yes`}async function l(e,r){r.writeLine(``),r.writeLine(`Robota project initialization`),r.writeLine(`─`.repeat(40));let l=a(e,`.robota`),u=a(l,`settings.json`),d=a(e,`AGENTS.md`),f=a(e,`.claude`),p=t(f),m=t(u),h=t(d);if(m&&h&&(r.writeLine(``),r.writeLine(`Both AGENTS.md and .robota/settings.json already exist.`),!await c(`Overwrite existing files?`))){r.writeLine(`Init cancelled.`);return}let g={...o};if(p&&(r.writeLine(``),r.writeLine(`Detected .claude/ directory (Claude Code configuration).`),await c(`Migrate Claude Code settings to .robota/?`))){let e=s(f),t=e.permissions;g={...e,permissions:{...typeof e.permissions==`object`&&e.permissions!==null?e.permissions:{},allow:[...o.permissions.allow,...t?.allow??[]],deny:t?.deny??[]}},r.writeLine(`Settings imported from .claude/settings.json.`)}n(l,{recursive:!0}),i(u,JSON.stringify(g,null,2)+`
|
|
2
|
+
`,`utf8`),r.writeLine(``),r.writeLine(`Created: .robota/settings.json`),i(d,`# AGENTS.md — Project Agent Guidelines
|
|
3
|
+
|
|
4
|
+
This file guides the AI agent working in this project. Customize it for your project.
|
|
5
|
+
|
|
6
|
+
## Project Overview
|
|
7
|
+
|
|
8
|
+
<!-- Describe your project's purpose, tech stack, and key conventions -->
|
|
9
|
+
|
|
10
|
+
## Common Commands
|
|
11
|
+
|
|
12
|
+
\`\`\`bash
|
|
13
|
+
# Install dependencies
|
|
14
|
+
npm install
|
|
15
|
+
|
|
16
|
+
# Run tests
|
|
17
|
+
npm test
|
|
18
|
+
|
|
19
|
+
# Build
|
|
20
|
+
npm run build
|
|
21
|
+
\`\`\`
|
|
22
|
+
|
|
23
|
+
## Coding Conventions
|
|
24
|
+
|
|
25
|
+
- Language: <!-- e.g. TypeScript strict mode -->
|
|
26
|
+
- Test framework: <!-- e.g. Vitest, Jest -->
|
|
27
|
+
- Linting: <!-- e.g. ESLint with prettier -->
|
|
28
|
+
|
|
29
|
+
## Important Notes
|
|
30
|
+
|
|
31
|
+
<!-- Anything the agent should know before making changes -->
|
|
32
|
+
`,`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 `robota --configure` to set up your AI provider"),r.writeLine(" 3. Run `robota` to start the assistant"),r.writeLine(``)}export{l as runInitCommand};
|
|
33
|
+
//# sourceMappingURL=init-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-command.js","names":[],"sources":["../../../src/init/init-command.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { promptInput } from '@robota-sdk/agent-transport/headless';\n\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\n\nconst AGENTS_MD_TEMPLATE = `# AGENTS.md — Project Agent Guidelines\n\nThis file guides the AI agent working in this project. Customize it for your project.\n\n## Project Overview\n\n<!-- Describe your project's purpose, tech stack, and key conventions -->\n\n## Common Commands\n\n\\`\\`\\`bash\n# Install dependencies\nnpm install\n\n# Run tests\nnpm test\n\n# Build\nnpm run build\n\\`\\`\\`\n\n## Coding Conventions\n\n- Language: <!-- e.g. TypeScript strict mode -->\n- Test framework: <!-- e.g. Vitest, Jest -->\n- Linting: <!-- e.g. ESLint with prettier -->\n\n## Important Notes\n\n<!-- Anything the agent should know before making changes -->\n`;\n\nconst SETTINGS_TEMPLATE = {\n permissions: {\n allow: ['Read(.robota/**)', 'Read(.claude/**)', 'Read(.agents/**)'],\n deny: [],\n },\n};\n\nfunction readClaudeSettings(claudeDir: string): Record<string, unknown> {\n const settingsPath = join(claudeDir, 'settings.json');\n if (!existsSync(settingsPath)) return {};\n const raw = readFileSync(settingsPath, 'utf8');\n return JSON.parse(raw) as Record<string, unknown>;\n}\n\nasync function askYesNo(question: string): Promise<boolean> {\n const answer = await promptInput(`${question} [y/N] `);\n return answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';\n}\n\nexport async function runInitCommand(cwd: string, terminal: ITerminalOutput): Promise<void> {\n terminal.writeLine('');\n terminal.writeLine('Robota project initialization');\n terminal.writeLine('─'.repeat(40));\n\n const robotaDir = join(cwd, '.robota');\n const settingsPath = join(robotaDir, 'settings.json');\n const agentsMdPath = join(cwd, 'AGENTS.md');\n const claudeDir = join(cwd, '.claude');\n const hasClaudeDir = existsSync(claudeDir);\n\n const hasSettings = existsSync(settingsPath);\n const hasAgentsMd = existsSync(agentsMdPath);\n\n if (hasSettings && hasAgentsMd) {\n terminal.writeLine('');\n terminal.writeLine('Both AGENTS.md and .robota/settings.json already exist.');\n const overwrite = await askYesNo('Overwrite existing files?');\n if (!overwrite) {\n terminal.writeLine('Init cancelled.');\n return;\n }\n }\n\n let settingsData: Record<string, unknown> = { ...SETTINGS_TEMPLATE };\n\n if (hasClaudeDir) {\n terminal.writeLine('');\n terminal.writeLine('Detected .claude/ directory (Claude Code configuration).');\n const migrate = await askYesNo('Migrate Claude Code settings to .robota/?');\n if (migrate) {\n const claudeSettings = readClaudeSettings(claudeDir);\n const claudePerms = claudeSettings.permissions as\n | { allow?: string[]; deny?: string[] }\n | undefined;\n settingsData = {\n ...claudeSettings,\n permissions: {\n ...(typeof claudeSettings.permissions === 'object' && claudeSettings.permissions !== null\n ? (claudeSettings.permissions as Record<string, unknown>)\n : {}),\n allow: [...SETTINGS_TEMPLATE.permissions.allow, ...(claudePerms?.allow ?? [])],\n deny: claudePerms?.deny ?? [],\n },\n };\n terminal.writeLine('Settings imported from .claude/settings.json.');\n }\n }\n\n mkdirSync(robotaDir, { recursive: true });\n writeFileSync(settingsPath, JSON.stringify(settingsData, null, 2) + '\\n', 'utf8');\n terminal.writeLine('');\n terminal.writeLine('Created: .robota/settings.json');\n\n writeFileSync(agentsMdPath, AGENTS_MD_TEMPLATE, 'utf8');\n terminal.writeLine('Created: AGENTS.md');\n\n terminal.writeLine('');\n terminal.writeLine('Initialization complete.');\n terminal.writeLine('');\n terminal.writeLine('Next steps:');\n terminal.writeLine(' 1. Edit AGENTS.md to describe your project conventions');\n terminal.writeLine(' 2. Run `robota --configure` to set up your AI provider');\n terminal.writeLine(' 3. Run `robota` to start the assistant');\n terminal.writeLine('');\n}\n"],"mappings":"6LAOA,MAgCM,EAAoB,CACxB,YAAa,CACX,MAAO,CAAC,mBAAoB,mBAAoB,kBAAkB,EAClE,KAAM,CAAC,CACT,CACF,EAEA,SAAS,EAAmB,EAA4C,CACtE,IAAM,EAAe,EAAK,EAAW,eAAe,EACpD,GAAI,CAAC,EAAW,CAAY,EAAG,MAAO,CAAC,EACvC,IAAM,EAAM,EAAa,EAAc,MAAM,EAC7C,OAAO,KAAK,MAAM,CAAG,CACvB,CAEA,eAAe,EAAS,EAAoC,CAC1D,IAAM,EAAS,MAAM,EAAY,GAAG,EAAS,QAAQ,EACrD,OAAO,EAAO,YAAY,IAAM,KAAO,EAAO,YAAY,IAAM,KAClE,CAEA,eAAsB,EAAe,EAAa,EAA0C,CAC1F,EAAS,UAAU,EAAE,EACrB,EAAS,UAAU,+BAA+B,EAClD,EAAS,UAAU,IAAI,OAAO,EAAE,CAAC,EAEjC,IAAM,EAAY,EAAK,EAAK,SAAS,EAC/B,EAAe,EAAK,EAAW,eAAe,EAC9C,EAAe,EAAK,EAAK,WAAW,EACpC,EAAY,EAAK,EAAK,SAAS,EAC/B,EAAe,EAAW,CAAS,EAEnC,EAAc,EAAW,CAAY,EACrC,EAAc,EAAW,CAAY,EAE3C,GAAI,GAAe,IACjB,EAAS,UAAU,EAAE,EACrB,EAAS,UAAU,yDAAyD,EAExE,CAAC,MADmB,EAAS,2BAA2B,GAC5C,CACd,EAAS,UAAU,iBAAiB,EACpC,MACF,CAGF,IAAI,EAAwC,CAAE,GAAG,CAAkB,EAEnE,GAAI,IACF,EAAS,UAAU,EAAE,EACrB,EAAS,UAAU,0DAA0D,EAEzE,MADkB,EAAS,2CAA2C,GAC7D,CACX,IAAM,EAAiB,EAAmB,CAAS,EAC7C,EAAc,EAAe,YAGnC,EAAe,CACb,GAAG,EACH,YAAa,CACX,GAAI,OAAO,EAAe,aAAgB,UAAY,EAAe,cAAgB,KAChF,EAAe,YAChB,CAAC,EACL,MAAO,CAAC,GAAG,EAAkB,YAAY,MAAO,GAAI,GAAa,OAAS,CAAC,CAAE,EAC7E,KAAM,GAAa,MAAQ,CAAC,CAC9B,CACF,EACA,EAAS,UAAU,+CAA+C,CACpE,CAGF,EAAU,EAAW,CAAE,UAAW,EAAK,CAAC,EACxC,EAAc,EAAc,KAAK,UAAU,EAAc,KAAM,CAAC,EAAI;EAAM,MAAM,EAChF,EAAS,UAAU,EAAE,EACrB,EAAS,UAAU,gCAAgC,EAEnD,EAAc,EAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAoB,MAAM,EACtD,EAAS,UAAU,oBAAoB,EAEvC,EAAS,UAAU,EAAE,EACrB,EAAS,UAAU,0BAA0B,EAC7C,EAAS,UAAU,EAAE,EACrB,EAAS,UAAU,aAAa,EAChC,EAAS,UAAU,0DAA0D,EAC7E,EAAS,UAAU,0DAA0D,EAC7E,EAAS,UAAU,0CAA0C,EAC7D,EAAS,UAAU,EAAE,CACvB"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
const e=require(`../startup/append-system-prompt.cjs`),t=require(`../constants.cjs`),n=require(`./shell-exec.cjs`);let r=require(`@robota-sdk/agent-transport/headless`);async function i(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.
|
|
2
|
+
`),process.exit(1)),t}async function a(a,o){let s=await i(a);a.dryRun&&process.stdout.write(`DRY RUN — plan mode enabled. No files will be modified.
|
|
3
|
+
|
|
4
|
+
`);let c=[];a.dryRun&&c.push(`You are in dry-run (plan) mode. Analyze the request and describe step by step what you would do, without executing any write or edit operations. Format your response as a numbered action plan.`);let l=e.buildAppendSystemPrompt(o.cwd,a);l&&c.push(l);let u=c.length>0?c.join(`
|
|
5
|
+
|
|
6
|
+
`):void 0,d=n.createShellExec(),f=o.createSession({permissionMode:a.permissionMode??`bypassPermissions`,maxTurns:a.maxTurns,sessionStore:a.noSessionPersistence?void 0:o.sessionStore,sessionName:a.sessionName,bare:a.bare||void 0,allowedTools:a.allowedTools?a.allowedTools.split(`,`).map(e=>e.trim()).filter(e=>e.length>0):void 0,appendSystemPrompt:u,systemPrompt:a.systemPrompt,shellExec:d,agentName:t.AGENT_CLI_NAME}),p=(0,r.createHeadlessTransport)({outputFormat:a.outputFormat??`text`,prompt:s});f.attachTransport(p),await p.start(),await f.shutdown({reason:`prompt_input_exit`,message:`Headless transport complete`}),process.exit(p.getExitCode())}exports.runPrintMode=a;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{buildAppendSystemPrompt as e}from"../startup/append-system-prompt.js";import{AGENT_CLI_NAME as t}from"../constants.js";import{createShellExec as n}from"./shell-exec.js";import{createHeadlessTransport as r}from"@robota-sdk/agent-transport/headless";async function i(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.
|
|
2
|
+
`),process.exit(1)),t}async function a(a,o){let s=await i(a);a.dryRun&&process.stdout.write(`DRY RUN — plan mode enabled. No files will be modified.
|
|
3
|
+
|
|
4
|
+
`);let c=[];a.dryRun&&c.push(`You are in dry-run (plan) mode. Analyze the request and describe step by step what you would do, without executing any write or edit operations. Format your response as a numbered action plan.`);let l=e(o.cwd,a);l&&c.push(l);let u=c.length>0?c.join(`
|
|
5
|
+
|
|
6
|
+
`):void 0,d=n(),f=o.createSession({permissionMode:a.permissionMode??`bypassPermissions`,maxTurns:a.maxTurns,sessionStore:a.noSessionPersistence?void 0:o.sessionStore,sessionName:a.sessionName,bare:a.bare||void 0,allowedTools:a.allowedTools?a.allowedTools.split(`,`).map(e=>e.trim()).filter(e=>e.length>0):void 0,appendSystemPrompt:u,systemPrompt:a.systemPrompt,shellExec:d,agentName:t}),p=r({outputFormat:a.outputFormat??`text`,prompt:s});f.attachTransport(p),await p.start(),await f.shutdown({reason:`prompt_input_exit`,message:`Headless transport complete`}),process.exit(p.getExitCode())}export{a as runPrintMode};
|
|
7
|
+
//# sourceMappingURL=print-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print-mode.js","names":[],"sources":["../../../src/modes/print-mode.ts"],"sourcesContent":["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\nconst DRY_RUN_SYSTEM_PROMPT =\n 'You are in dry-run (plan) mode. Analyze the request and describe step by step what you would do, without executing any write or edit operations. Format your response as a numbered action plan.';\n\nexport async function runPrintMode(\n opts: ISessionRunOptions,\n runtime: IAgentRuntime,\n): Promise<void> {\n const prompt = await resolvePrompt(opts);\n\n if (opts.dryRun) {\n process.stdout.write('DRY RUN — plan mode enabled. No files will be modified.\\n\\n');\n }\n\n const appendSystemPromptParts: string[] = [];\n if (opts.dryRun) appendSystemPromptParts.push(DRY_RUN_SYSTEM_PROMPT);\n const baseAppend = buildAppendSystemPrompt(runtime.cwd, opts);\n if (baseAppend) appendSystemPromptParts.push(baseAppend);\n const appendSystemPrompt =\n appendSystemPromptParts.length > 0 ? appendSystemPromptParts.join('\\n\\n') : undefined;\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"],"mappings":"+PASA,eAAe,EAAc,EAA2C,CACtE,IAAI,EAAS,EAAK,WAAW,KAAK,GAAG,EAAE,KAAK,EAE5C,GAAI,CAAC,GAAU,CAAC,QAAQ,MAAM,MAAO,CACnC,IAAM,EAAmB,CAAC,EAC1B,UAAW,IAAM,KAAS,QAAQ,MAChC,EAAO,KAAK,CAAe,EAE7B,EAAS,OAAO,OAAO,CAAM,EAAE,SAAS,OAAO,EAAE,KAAK,CACxD,CAOA,OALK,IACH,QAAQ,OAAO,MAAM;CAA+C,EACpE,QAAQ,KAAK,CAAC,GAGT,CACT,CAKA,eAAsB,EACpB,EACA,EACe,CACf,IAAM,EAAS,MAAM,EAAc,CAAI,EAEnC,EAAK,QACP,QAAQ,OAAO,MAAM;;CAA6D,EAGpF,IAAM,EAAoC,CAAC,EACvC,EAAK,QAAQ,EAAwB,KAAK,kMAAqB,EACnE,IAAM,EAAa,EAAwB,EAAQ,IAAK,CAAI,EACxD,GAAY,EAAwB,KAAK,CAAU,EACvD,IAAM,EACJ,EAAwB,OAAS,EAAI,EAAwB,KAAK;;CAAM,EAAI,IAAA,GACxE,EAAY,EAAgB,EAE5B,EAAU,EAAQ,cAAc,CACpC,eAAgB,EAAK,gBAAkB,oBACvC,SAAU,EAAK,SACf,aAAc,EAAK,qBAAuB,IAAA,GAAY,EAAQ,aAC9D,YAAa,EAAK,YAClB,KAAM,EAAK,MAAQ,IAAA,GACnB,aAAc,EAAK,aACf,EAAK,aACF,MAAM,GAAG,EACT,IAAK,GAAM,EAAE,KAAK,CAAC,EACnB,OAAQ,GAAM,EAAE,OAAS,CAAC,EAC7B,IAAA,GACJ,qBACA,aAAc,EAAK,aACnB,YACA,UAAW,CACb,CAAC,EAEK,EAAY,EAAwB,CACxC,aAAc,EAAK,cAAgB,OACnC,QACF,CAAC,EACD,EAAQ,gBAAgB,CAAS,EACjC,MAAM,EAAU,MAAM,EACtB,MAAM,EAAQ,SAAS,CAAE,OAAQ,oBAAqB,QAAS,6BAA8B,CAAC,EAC9F,QAAQ,KAAK,EAAU,YAAY,CAAC,CACtC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
let e=require(`node:child_process`);function t(){return t=>(0,e.execSync)(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd()}exports.createShellExec=t;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-exec.js","names":[],"sources":["../../../src/modes/shell-exec.ts"],"sourcesContent":["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"],"mappings":"8CAIA,SAAgB,GAA+C,CAC7D,MAAQ,IACN,EAAS,EAAS,CAChB,QAAS,IACT,SAAU,QACV,MAAO,MACT,CAAC,EAAE,QAAQ,CACf"}
|