@@ -2,7 +2,7 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
22import { homedir } from "node:os" ;
33import { dirname , join } from "node:path" ;
44
5- import type { AgentId } from "./agents/types.js" ;
5+ import type { AgentId , PermissionMode , SandboxMode } from "./agents/types.js" ;
66
77export const DEFAULT_RUN_TIMEOUT_MS = 6 * 60 * 60 * 1000 ;
88export const DEFAULT_DASHBOARD_THEME : DashboardTheme = "dark" ;
@@ -12,6 +12,9 @@ export type DashboardTheme = "light" | "dark";
1212export interface AgentModelDefaults {
1313 model ?: string ;
1414 reasoningEffort ?: string ;
15+ permissionMode ?: PermissionMode ;
16+ sandbox ?: SandboxMode ;
17+ extraArgs ?: string [ ] ;
1518}
1619
1720export type AgentModelDefaultsByAgent = Partial < Record < AgentId , AgentModelDefaults > > ;
@@ -155,7 +158,7 @@ function parseSimpleYaml(
155158 const values : Partial < Pick < HumanizeConfig , "cacheDir" | "defaultRunTimeoutMs" | "defaultTheme" | "agentDefaults" | "workflow" > > = {
156159 agentDefaults : { }
157160 } ;
158- let section : "agents" | "workflow" | "workflow.softEnforcement" | "workflow.scripts" | "workflow.scripts.allow" | undefined ;
161+ let section : "agents" | "workflow" | "workflow.softEnforcement" | "workflow.scripts" | "workflow.scripts.allow" | "agents.extraArgs" | undefined ;
159162 let currentAgent : AgentId | undefined ;
160163
161164 for ( const line of contents . split ( "\n" ) ) {
@@ -176,6 +179,26 @@ function parseSimpleYaml(
176179 continue ;
177180 }
178181
182+ // agent extraArgs list items (e.g., ` - --skip-git-repo-check`)
183+ if ( section === "agents.extraArgs" && indent >= 6 && currentAgent !== undefined && trimmed . startsWith ( "- " ) ) {
184+ const item = trimmed . slice ( 2 ) . trim ( ) . replace ( / ^ [ " ' ] | [ " ' ] $ / g, "" ) ;
185+ if ( item . length > 0 ) {
186+ const defaults = values . agentDefaults ?. [ currentAgent ] ?? { } ;
187+ defaults . extraArgs = [ ...( defaults . extraArgs ?? [ ] ) , item ] ;
188+ values . agentDefaults = {
189+ ...values . agentDefaults ,
190+ [ currentAgent ] : defaults
191+ } ;
192+ }
193+ continue ;
194+ }
195+
196+ // extraArgs list is done — reset section so sibling fields (model,
197+ // permissionMode, sandbox) under the same agent are not silently ignored
198+ if ( section === "agents.extraArgs" && indent >= 4 && currentAgent !== undefined && ! trimmed . startsWith ( "- " ) ) {
199+ section = "agents" ;
200+ }
201+
179202 const separatorIndex = trimmed . indexOf ( ":" ) ;
180203 if ( separatorIndex < 0 ) {
181204 continue ;
@@ -233,8 +256,9 @@ function parseSimpleYaml(
233256 section = "workflow.scripts.allow" ;
234257 continue ;
235258 }
236- if ( section === "agents" && indent === 2 ) {
259+ if ( ( section === "agents" || section === "agents.extraArgs" ) && indent === 2 ) {
237260 currentAgent = key === "codex" || key === "claude" ? key : undefined ;
261+ section = "agents" ;
238262 continue ;
239263 }
240264 if ( section === "agents" && indent >= 4 && currentAgent !== undefined && value . length > 0 ) {
@@ -245,6 +269,25 @@ function parseSimpleYaml(
245269 if ( key === "reasoningEffort" ) {
246270 defaults . reasoningEffort = value ;
247271 }
272+ if ( key === "permissionMode" ) {
273+ defaults . permissionMode = value as PermissionMode ;
274+ }
275+ if ( key === "sandbox" ) {
276+ defaults . sandbox = value as SandboxMode ;
277+ }
278+ values . agentDefaults = {
279+ ...values . agentDefaults ,
280+ [ currentAgent ] : defaults
281+ } ;
282+ }
283+ if ( section === "agents" && indent >= 4 && currentAgent !== undefined && key === "extraArgs" ) {
284+ const defaults = values . agentDefaults ?. [ currentAgent ] ?? { } ;
285+ if ( value === "[]" || value . length === 0 ) {
286+ defaults . extraArgs = [ ] ;
287+ section = "agents.extraArgs" ;
288+ } else {
289+ defaults . extraArgs = parseCommaList ( value ) ;
290+ }
248291 values . agentDefaults = {
249292 ...values . agentDefaults ,
250293 [ currentAgent ] : defaults
@@ -262,11 +305,13 @@ function mergeAgentDefaults(
262305 return {
263306 codex : {
264307 ...defaults . codex ,
265- ...overrides ?. codex
308+ ...overrides ?. codex ,
309+ extraArgs : overrides ?. codex ?. extraArgs ?? defaults . codex ?. extraArgs
266310 } ,
267311 claude : {
268312 ...defaults . claude ,
269- ...overrides ?. claude
313+ ...overrides ?. claude ,
314+ extraArgs : overrides ?. claude ?. extraArgs ?? defaults . claude ?. extraArgs
270315 }
271316 } ;
272317}
0 commit comments