summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorKit Langton <[email protected]>2026-04-17 16:49:36 -0400
committerGitHub <[email protected]>2026-04-17 20:49:36 +0000
commitb1307d5c2a41c12d6696b31fe46bea7882993753 (patch)
tree1152db339dfe242a14ccaa8e6b2b23a3d93e7176
parentdc16013b4f0aa5e4d3eb433046965e1274da3990 (diff)
downloadopencode-b1307d5c2a41c12d6696b31fe46bea7882993753.tar.gz
opencode-b1307d5c2a41c12d6696b31fe46bea7882993753.zip
refactor(config): migrate skills, formatter, console-state to Effect Schema (#23162)
-rw-r--r--packages/opencode/src/config/config.ts4
-rw-r--r--packages/opencode/src/config/console-state.ts21
-rw-r--r--packages/opencode/src/config/formatter.ts22
-rw-r--r--packages/opencode/src/config/skills.ts21
-rw-r--r--packages/opencode/src/server/routes/instance/experimental.ts2
-rw-r--r--packages/sdk/js/src/v2/gen/types.gen.ts12
6 files changed, 46 insertions, 36 deletions
diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts
index 039b0598d..261c5acab 100644
--- a/packages/opencode/src/config/config.ts
+++ b/packages/opencode/src/config/config.ts
@@ -100,7 +100,7 @@ export const Info = z
.record(z.string(), ConfigCommand.Info)
.optional()
.describe("Command configuration, see https://opencode.ai/docs/commands"),
- skills: ConfigSkills.Info.optional().describe("Additional skill folder paths"),
+ skills: ConfigSkills.Info.zod.optional().describe("Additional skill folder paths"),
watcher: z
.object({
ignore: z.array(z.string()).optional(),
@@ -188,7 +188,7 @@ export const Info = z
)
.optional()
.describe("MCP (Model Context Protocol) server configurations"),
- formatter: ConfigFormatter.Info.optional(),
+ formatter: ConfigFormatter.Info.zod.optional(),
lsp: ConfigLSP.Info.zod.optional(),
instructions: z.array(z.string()).optional().describe("Additional instruction files or patterns to include"),
layout: Layout.optional().describe("@deprecated Always uses stretch layout."),
diff --git a/packages/opencode/src/config/console-state.ts b/packages/opencode/src/config/console-state.ts
index cf96a4e30..08668afe4 100644
--- a/packages/opencode/src/config/console-state.ts
+++ b/packages/opencode/src/config/console-state.ts
@@ -1,15 +1,16 @@
-import z from "zod"
+import { Schema } from "effect"
+import { zod } from "@/util/effect-zod"
-export const ConsoleState = z.object({
- consoleManagedProviders: z.array(z.string()),
- activeOrgName: z.string().optional(),
- switchableOrgCount: z.number().int().nonnegative(),
-})
-
-export type ConsoleState = z.infer<typeof ConsoleState>
+export class ConsoleState extends Schema.Class<ConsoleState>("ConsoleState")({
+ consoleManagedProviders: Schema.mutable(Schema.Array(Schema.String)),
+ activeOrgName: Schema.optional(Schema.String),
+ switchableOrgCount: Schema.Number,
+}) {
+ static readonly zod = zod(this)
+}
-export const emptyConsoleState: ConsoleState = {
+export const emptyConsoleState: ConsoleState = ConsoleState.make({
consoleManagedProviders: [],
activeOrgName: undefined,
switchableOrgCount: 0,
-}
+})
diff --git a/packages/opencode/src/config/formatter.ts b/packages/opencode/src/config/formatter.ts
index 93b87f028..8c1f09a24 100644
--- a/packages/opencode/src/config/formatter.ts
+++ b/packages/opencode/src/config/formatter.ts
@@ -1,13 +1,17 @@
export * as ConfigFormatter from "./formatter"
-import z from "zod"
+import { Schema } from "effect"
+import { zod } from "@/util/effect-zod"
+import { withStatics } from "@/util/schema"
-export const Entry = z.object({
- disabled: z.boolean().optional(),
- command: z.array(z.string()).optional(),
- environment: z.record(z.string(), z.string()).optional(),
- extensions: z.array(z.string()).optional(),
-})
+export const Entry = Schema.Struct({
+ disabled: Schema.optional(Schema.Boolean),
+ command: Schema.optional(Schema.mutable(Schema.Array(Schema.String))),
+ environment: Schema.optional(Schema.Record(Schema.String, Schema.String)),
+ extensions: Schema.optional(Schema.mutable(Schema.Array(Schema.String))),
+}).pipe(withStatics((s) => ({ zod: zod(s) })))
-export const Info = z.union([z.boolean(), z.record(z.string(), Entry)])
-export type Info = z.infer<typeof Info>
+export const Info = Schema.Union([Schema.Boolean, Schema.Record(Schema.String, Entry)]).pipe(
+ withStatics((s) => ({ zod: zod(s) })),
+)
+export type Info = Schema.Schema.Type<typeof Info>
diff --git a/packages/opencode/src/config/skills.ts b/packages/opencode/src/config/skills.ts
index 38cbf99e7..f29d854f5 100644
--- a/packages/opencode/src/config/skills.ts
+++ b/packages/opencode/src/config/skills.ts
@@ -1,13 +1,16 @@
-import z from "zod"
+import { Schema } from "effect"
+import { zod } from "@/util/effect-zod"
+import { withStatics } from "@/util/schema"
-export const Info = z.object({
- paths: z.array(z.string()).optional().describe("Additional paths to skill folders"),
- urls: z
- .array(z.string())
- .optional()
- .describe("URLs to fetch skills from (e.g., https://example.com/.well-known/skills/)"),
-})
+export const Info = Schema.Struct({
+ paths: Schema.optional(Schema.Array(Schema.String)).annotate({
+ description: "Additional paths to skill folders",
+ }),
+ urls: Schema.optional(Schema.Array(Schema.String)).annotate({
+ description: "URLs to fetch skills from (e.g., https://example.com/.well-known/skills/)",
+ }),
+}).pipe(withStatics((s) => ({ zod: zod(s) })))
-export type Info = z.infer<typeof Info>
+export type Info = Schema.Schema.Type<typeof Info>
export * as ConfigSkills from "./skills"
diff --git a/packages/opencode/src/server/routes/instance/experimental.ts b/packages/opencode/src/server/routes/instance/experimental.ts
index f7ecc8255..d5659346e 100644
--- a/packages/opencode/src/server/routes/instance/experimental.ts
+++ b/packages/opencode/src/server/routes/instance/experimental.ts
@@ -49,7 +49,7 @@ export const ExperimentalRoutes = lazy(() =>
description: "Active Console provider metadata",
content: {
"application/json": {
- schema: resolver(ConsoleState),
+ schema: resolver(ConsoleState.zod),
},
},
},
diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts
index 5698cba54..72a383a60 100644
--- a/packages/sdk/js/src/v2/gen/types.gen.ts
+++ b/packages/sdk/js/src/v2/gen/types.gen.ts
@@ -1807,6 +1807,12 @@ export type Provider = {
}
}
+export type ConsoleState = {
+ consoleManagedProviders: Array<string>
+ activeOrgName?: string
+ switchableOrgCount: number
+}
+
export type ToolIds = Array<string>
export type ToolListItem = {
@@ -2933,11 +2939,7 @@ export type ExperimentalConsoleGetResponses = {
/**
* Active Console provider metadata
*/
- 200: {
- consoleManagedProviders: Array<string>
- activeOrgName?: string
- switchableOrgCount: number
- }
+ 200: ConsoleState
}
export type ExperimentalConsoleGetResponse = ExperimentalConsoleGetResponses[keyof ExperimentalConsoleGetResponses]