diff --git a/packages/opencode/src/cli/cmd/run.ts b/packages/opencode/src/cli/cmd/run.ts index c8856b28bfe..425aef94782 100644 --- a/packages/opencode/src/cli/cmd/run.ts +++ b/packages/opencode/src/cli/cmd/run.ts @@ -228,8 +228,8 @@ export const RunCommand = effectCmd({ describe: "run in direct interactive split-footer mode", default: false, }) - .option("dangerously-skip-permissions", { - alias: ["yolo"], + .option("yolo", { + alias: ["dangerously-skip-permissions"], type: "boolean", describe: "auto-approve permissions that are not explicitly denied (dangerous!)", default: false, @@ -733,7 +733,7 @@ export const RunCommand = effectCmd({ const permission = event.properties if (permission.sessionID !== sessionID) continue - if (args["dangerously-skip-permissions"]) { + if (args.yolo) { await client.permission.reply({ requestID: permission.id, reply: "once", diff --git a/packages/opencode/src/cli/cmd/tui.ts b/packages/opencode/src/cli/cmd/tui.ts index cfb5c7b267e..6364d153cbf 100644 --- a/packages/opencode/src/cli/cmd/tui.ts +++ b/packages/opencode/src/cli/cmd/tui.ts @@ -104,8 +104,8 @@ export const TuiThreadCommand = cmd({ type: "string", describe: "agent to use", }) - .option("dangerously-skip-permissions", { - alias: ["yolo"], + .option("yolo", { + alias: ["dangerously-skip-permissions"], type: "boolean", describe: "auto-approve permissions that are not explicitly denied (dangerous!)", default: false, diff --git a/packages/opencode/src/effect/runtime-flags.ts b/packages/opencode/src/effect/runtime-flags.ts index 39a596fdf28..650896b2686 100644 --- a/packages/opencode/src/effect/runtime-flags.ts +++ b/packages/opencode/src/effect/runtime-flags.ts @@ -15,7 +15,10 @@ const enabledByExperimental = (name: string) => export class Service extends ConfigService.Service()("@opencode/RuntimeFlags", { autoShare: bool("OPENCODE_AUTO_SHARE"), - dangerouslySkipPermissions: bool("OPENCODE_DANGEROUSLY_SKIP_PERMISSIONS"), + yolo: Config.all({ + primary: bool("OPENCODE_YOLO"), + legacy: bool("OPENCODE_DANGEROUSLY_SKIP_PERMISSIONS"), + }).pipe(Config.map((flags) => flags.primary || flags.legacy)), pure: bool("OPENCODE_PURE"), disableDefaultPlugins: bool("OPENCODE_DISABLE_DEFAULT_PLUGINS"), disableEmbeddedWebUi: bool("OPENCODE_DISABLE_EMBEDDED_WEB_UI"), diff --git a/packages/opencode/src/index.ts b/packages/opencode/src/index.ts index 0cf53aeb9bf..0f93a3b5b48 100644 --- a/packages/opencode/src/index.ts +++ b/packages/opencode/src/index.ts @@ -66,7 +66,7 @@ const cli = yargs(args) .middleware(async (opts) => { if (opts.printLogs) process.env.OPENCODE_PRINT_LOGS = "1" if (opts.logLevel) process.env.OPENCODE_LOG_LEVEL = opts.logLevel - if (opts.dangerouslySkipPermissions) process.env.OPENCODE_DANGEROUSLY_SKIP_PERMISSIONS = "1" + if (opts.yolo) process.env.OPENCODE_YOLO = "1" if (opts.pure) { process.env.OPENCODE_PURE = "1" } diff --git a/packages/opencode/src/permission/index.ts b/packages/opencode/src/permission/index.ts index 6cec0abebd6..66bbe9851e6 100644 --- a/packages/opencode/src/permission/index.ts +++ b/packages/opencode/src/permission/index.ts @@ -91,7 +91,7 @@ export const layer = Layer.effect( }) } if (rule.action === "allow") continue - if (flags.dangerouslySkipPermissions) continue + if (flags.yolo) continue needsAsk = true } diff --git a/packages/opencode/test/cli/help/__snapshots__/help-snapshots.test.ts.snap b/packages/opencode/test/cli/help/__snapshots__/help-snapshots.test.ts.snap index 9c9d7862dc9..0cdbe816b08 100644 --- a/packages/opencode/test/cli/help/__snapshots__/help-snapshots.test.ts.snap +++ b/packages/opencode/test/cli/help/__snapshots__/help-snapshots.test.ts.snap @@ -111,7 +111,7 @@ Options: messages [number] -i, --interactive run in direct interactive split-footer mode [boolean] [default: false] - --dangerously-skip-permissions, --yolo auto-approve permissions that are not explicitly + --yolo, --dangerously-skip-permissions auto-approve permissions that are not explicitly denied (dangerous!) [boolean] [default: false] --demo enable direct interactive demo slash commands; pass one as the message to run it immediately diff --git a/packages/opencode/test/cli/help/help-snapshots.test.ts b/packages/opencode/test/cli/help/help-snapshots.test.ts index 31f015c7989..72cc9cbe501 100644 --- a/packages/opencode/test/cli/help/help-snapshots.test.ts +++ b/packages/opencode/test/cli/help/help-snapshots.test.ts @@ -102,8 +102,8 @@ describe("opencode CLI help-text snapshots", () => { const topLevel = yield* opencode.spawn(["--help"], { env: SNAPSHOT_ENV }) expect(topLevel.exitCode).toBe(0) expect(topLevel.stderr.endsWith(EOL)).toBe(true) - expect(topLevel.stderr).toContain("--dangerously-skip-permissions") expect(topLevel.stderr).toContain("--yolo") + expect(topLevel.stderr).toContain("--dangerously-skip-permissions") const argvs: Array = [...TOP_LEVEL.map((c) => [c] as const), ...SUBCOMMANDS] diff --git a/packages/opencode/test/effect/runtime-flags.test.ts b/packages/opencode/test/effect/runtime-flags.test.ts index f029e6c0b67..b42e5b9babf 100644 --- a/packages/opencode/test/effect/runtime-flags.test.ts +++ b/packages/opencode/test/effect/runtime-flags.test.ts @@ -14,7 +14,7 @@ describe("RuntimeFlags", () => { const flags = yield* readFlags.pipe(Effect.provide(fromConfig({}))) expect(flags.autoShare).toBe(false) - expect(flags.dangerouslySkipPermissions).toBe(false) + expect(flags.yolo).toBe(false) }), ) @@ -24,7 +24,7 @@ describe("RuntimeFlags", () => { Effect.provide( fromConfig({ OPENCODE_PURE: "true", - OPENCODE_DANGEROUSLY_SKIP_PERMISSIONS: "true", + OPENCODE_YOLO: "true", OPENCODE_DISABLE_DEFAULT_PLUGINS: "true", OPENCODE_AUTO_SHARE: "true", OPENCODE_DISABLE_EMBEDDED_WEB_UI: "true", @@ -41,7 +41,7 @@ describe("RuntimeFlags", () => { ) expect(flags.pure).toBe(true) - expect(flags.dangerouslySkipPermissions).toBe(true) + expect(flags.yolo).toBe(true) expect(flags.autoShare).toBe(true) expect(flags.disableDefaultPlugins).toBe(true) expect(flags.disableEmbeddedWebUi).toBe(true) @@ -81,6 +81,14 @@ describe("RuntimeFlags", () => { }), ) + it.effect("supports the legacy dangerous permission environment variable", () => + Effect.gen(function* () { + const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ OPENCODE_DANGEROUSLY_SKIP_PERMISSIONS: "true" }))) + + expect(flags.yolo).toBe(true) + }), + ) + it.effect("enables native LLM via dedicated flag only", () => Effect.gen(function* () { const explicit = yield* readFlags.pipe(Effect.provide(fromConfig({ OPENCODE_EXPERIMENTAL_NATIVE_LLM: "true" }))) diff --git a/packages/opencode/test/permission/next.test.ts b/packages/opencode/test/permission/next.test.ts index 6a405a09dd4..b646244ee1f 100644 --- a/packages/opencode/test/permission/next.test.ts +++ b/packages/opencode/test/permission/next.test.ts @@ -25,7 +25,7 @@ const makeEnv = (flags: Partial = {}) => { ) } const it = testEffect(makeEnv()) -const dangerousIt = testEffect(makeEnv({ dangerouslySkipPermissions: true })) +const yoloIt = testEffect(makeEnv({ yolo: true })) const rejectAll = (message?: string) => Effect.gen(function* () { @@ -618,8 +618,8 @@ it.instance( { git: true }, ) -dangerousIt.instance( - "ask - resolves ask rules when dangerous permission skipping is enabled", +yoloIt.instance( + "ask - resolves ask rules when yolo mode is enabled", () => ask({ sessionID: SessionID.make("session_test"), @@ -632,8 +632,8 @@ dangerousIt.instance( { git: true }, ) -dangerousIt.instance( - "ask - preserves deny rules when dangerous permission skipping is enabled", +yoloIt.instance( + "ask - preserves deny rules when yolo mode is enabled", () => Effect.gen(function* () { const err = yield* fail( diff --git a/packages/web/src/content/docs/cli.mdx b/packages/web/src/content/docs/cli.mdx index 3d7a98aa0e6..213d26dd064 100644 --- a/packages/web/src/content/docs/cli.mdx +++ b/packages/web/src/content/docs/cli.mdx @@ -42,7 +42,8 @@ opencode [project] | {"--mdns"} | | Enable mDNS discovery | | {"--mdns-domain"} | | Custom mDNS domain name | | {"--cors"} | | Additional browser origin(s) to allow CORS | -| {"--dangerously-skip-permissions"} | | Auto-approve permissions not explicitly denied. Alias: `--yolo` | +| {"--yolo"} | | Auto-approve permissions not explicitly denied | +| {"--dangerously-skip-permissions"} | | Legacy alias for `--yolo` | --- @@ -381,7 +382,8 @@ opencode run --attach http://localhost:4096 "Explain async/await in JavaScript" | {"--port"} | | Port for the local server (defaults to random port) | | {"--variant"} | | Model variant (provider-specific reasoning effort) | | {"--thinking"} | | Show thinking blocks | -| {"--dangerously-skip-permissions"} | | Auto-approve permissions that are not explicitly denied. Alias: `--yolo` | +| {"--yolo"} | | Auto-approve permissions that are not explicitly denied | +| {"--dangerously-skip-permissions"} | | Legacy alias for `--yolo` | --- @@ -689,7 +691,8 @@ OpenCode can be configured using environment variables. | `OPENCODE_DISABLE_PRUNE` | boolean | Disable pruning of old data | | `OPENCODE_DISABLE_TERMINAL_TITLE` | boolean | Disable automatic terminal title updates | | `OPENCODE_PERMISSION` | string | Inlined json permissions config | -| `OPENCODE_DANGEROUSLY_SKIP_PERMISSIONS` | boolean | Auto-approve permissions not explicitly denied | +| `OPENCODE_YOLO` | boolean | Auto-approve permissions not explicitly denied | +| `OPENCODE_DANGEROUSLY_SKIP_PERMISSIONS` | boolean | Legacy alias for `OPENCODE_YOLO` | | `OPENCODE_DISABLE_DEFAULT_PLUGINS` | boolean | Disable default plugins | | `OPENCODE_DISABLE_LSP_DOWNLOAD` | boolean | Disable automatic LSP server downloads | | `OPENCODE_ENABLE_EXPERIMENTAL_MODELS` | boolean | Enable experimental models |