diff --git a/packages/core/src/flag/flag.ts b/packages/core/src/flag/flag.ts index fc9acf7c92..fd01b09b2b 100644 --- a/packages/core/src/flag/flag.ts +++ b/packages/core/src/flag/flag.ts @@ -57,7 +57,6 @@ export const Flag = { copy === undefined ? process.platform === "win32" : truthy("OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT"), OPENCODE_ENABLE_EXA: truthy("OPENCODE_ENABLE_EXA") || OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_EXA"), OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX: number("OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX"), - OPENCODE_EXPERIMENTAL_OXFMT: OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_OXFMT"), OPENCODE_EXPERIMENTAL_LSP_TY: truthy("OPENCODE_EXPERIMENTAL_LSP_TY"), OPENCODE_EXPERIMENTAL_LSP_TOOL: OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_LSP_TOOL"), OPENCODE_EXPERIMENTAL_PLAN_MODE: OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_PLAN_MODE"), diff --git a/packages/opencode/src/effect/runtime-flags.ts b/packages/opencode/src/effect/runtime-flags.ts index 008ea558b8..88ad4dabbd 100644 --- a/packages/opencode/src/effect/runtime-flags.ts +++ b/packages/opencode/src/effect/runtime-flags.ts @@ -32,6 +32,7 @@ export class Service extends ConfigService.Service()("@opencode/Runtime experimentalScout: enabledByExperimental("OPENCODE_EXPERIMENTAL_SCOUT"), experimentalBackgroundSubagents: enabledByExperimental("OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS"), experimentalLspTool: enabledByExperimental("OPENCODE_EXPERIMENTAL_LSP_TOOL"), + experimentalOxfmt: enabledByExperimental("OPENCODE_EXPERIMENTAL_OXFMT"), experimentalPlanMode: enabledByExperimental("OPENCODE_EXPERIMENTAL_PLAN_MODE"), experimentalEventSystem: enabledByExperimental("OPENCODE_EXPERIMENTAL_EVENT_SYSTEM"), experimentalWorkspaces: enabledByExperimental("OPENCODE_EXPERIMENTAL_WORKSPACES"), diff --git a/packages/opencode/src/format/formatter.ts b/packages/opencode/src/format/formatter.ts index dbc1326017..4c559631f2 100644 --- a/packages/opencode/src/format/formatter.ts +++ b/packages/opencode/src/format/formatter.ts @@ -3,9 +3,10 @@ import type { InstanceContext } from "../project/instance" import { Filesystem } from "@/util/filesystem" import { Process } from "@/util/process" import { which } from "../util/which" -import { Flag } from "@opencode-ai/core/flag/flag" -export interface Context extends Pick {} +export interface Context extends Pick { + experimentalOxfmt: boolean +} export interface Info { name: string @@ -90,7 +91,7 @@ export const oxfmt: Info = { }, extensions: [".js", ".jsx", ".mjs", ".cjs", ".ts", ".tsx", ".mts", ".cts"], async enabled(context) { - if (!Flag.OPENCODE_EXPERIMENTAL_OXFMT) return false + if (!context.experimentalOxfmt) return false const items = await Filesystem.findUp("package.json", context.directory, context.worktree) for (const item of items) { const json = await Filesystem.readJson<{ diff --git a/packages/opencode/src/format/index.ts b/packages/opencode/src/format/index.ts index fa22014439..50abba0ff9 100644 --- a/packages/opencode/src/format/index.ts +++ b/packages/opencode/src/format/index.ts @@ -5,6 +5,7 @@ import { InstanceState } from "@/effect/instance-state" import path from "path" import { mergeDeep } from "remeda" import { Config } from "@/config/config" +import { RuntimeFlags } from "@/effect/runtime-flags" import { errorMessage } from "@/util/error" import * as Log from "@opencode-ai/core/util/log" import * as Formatter from "./formatter" @@ -31,6 +32,7 @@ export const layer = Layer.effect( Effect.gen(function* () { const config = yield* Config.Service const appProcess = yield* AppProcess.Service + const flags = yield* RuntimeFlags.Service const state = yield* InstanceState.make( Effect.fn("Format.state")(function* (ctx) { @@ -40,7 +42,7 @@ export const layer = Layer.effect( async function getCommand(item: Formatter.Info) { let cmd = commands[item.name] if (cmd === false || cmd === undefined) { - cmd = await item.enabled(ctx) + cmd = await item.enabled({ ...ctx, experimentalOxfmt: flags.experimentalOxfmt }) commands[item.name] = cmd } return cmd @@ -198,6 +200,10 @@ export const layer = Layer.effect( }), ) -export const defaultLayer = layer.pipe(Layer.provide(Config.defaultLayer), Layer.provide(AppProcess.defaultLayer)) +export const defaultLayer = layer.pipe( + Layer.provide(Config.defaultLayer), + Layer.provide(AppProcess.defaultLayer), + Layer.provide(RuntimeFlags.defaultLayer), +) export * as Format from "." diff --git a/packages/opencode/test/effect/runtime-flags.test.ts b/packages/opencode/test/effect/runtime-flags.test.ts index 241a86a501..c7ca1061df 100644 --- a/packages/opencode/test/effect/runtime-flags.test.ts +++ b/packages/opencode/test/effect/runtime-flags.test.ts @@ -35,6 +35,7 @@ describe("RuntimeFlags", () => { expect(flags.experimentalScout).toBe(true) expect(flags.experimentalBackgroundSubagents).toBe(true) expect(flags.experimentalLspTool).toBe(true) + expect(flags.experimentalOxfmt).toBe(true) expect(flags.experimentalPlanMode).toBe(true) expect(flags.experimentalEventSystem).toBe(true) expect(flags.experimentalWorkspaces).toBe(true) @@ -52,12 +53,49 @@ describe("RuntimeFlags", () => { expect(flags.disableDefaultPlugins).toBe(true) expect(flags.disableClaudeCodeSkills).toBe(false) expect(flags.enableExa).toBe(false) + expect(flags.experimentalOxfmt).toBe(false) expect(flags.bashDefaultTimeoutMs).toBe(1_000) expect(flags.enableExperimentalModels).toBe(false) expect(flags.client).toBe("cli") }), ) + it.effect("experimentalOxfmt defaults to false", () => + Effect.gen(function* () { + const flags = yield* readFlags.pipe(Effect.provide(fromConfig({}))) + + expect(flags.experimentalOxfmt).toBe(false) + }), + ) + + it.effect("experimentalOxfmt is enabled by OPENCODE_EXPERIMENTAL_OXFMT", () => + Effect.gen(function* () { + const flags = yield* readFlags.pipe( + Effect.provide( + fromConfig({ + OPENCODE_EXPERIMENTAL_OXFMT: "true", + }), + ), + ) + + expect(flags.experimentalOxfmt).toBe(true) + }), + ) + + it.effect("experimentalOxfmt inherits OPENCODE_EXPERIMENTAL", () => + Effect.gen(function* () { + const flags = yield* readFlags.pipe( + Effect.provide( + fromConfig({ + OPENCODE_EXPERIMENTAL: "true", + }), + ), + ) + + expect(flags.experimentalOxfmt).toBe(true) + }), + ) + for (const input of [ { name: "absent", config: {}, expected: undefined }, { @@ -109,6 +147,7 @@ describe("RuntimeFlags", () => { expect(flags.disableDefaultPlugins).toBe(false) expect(flags.disableClaudeCodeSkills).toBe(false) expect(flags.enableExa).toBe(false) + expect(flags.experimentalOxfmt).toBe(false) expect(flags.bashDefaultTimeoutMs).toBeUndefined() expect(flags.client).toBe("cli") }),