summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-07-31 19:35:55 -0400
committerDax Raad <[email protected]>2025-07-31 19:36:07 -0400
commit30e10127f220cac74da35c5510673c037eef2f16 (patch)
tree9528e47486ee52d3f4ef37b6a7687f71b3fde4a4
parent5e66fc2318433690ef508dc543ce5683374c6385 (diff)
downloadopencode-30e10127f220cac74da35c5510673c037eef2f16.tar.gz
opencode-30e10127f220cac74da35c5510673c037eef2f16.zip
formatter config
-rw-r--r--opencode.json6
-rw-r--r--packages/opencode/src/config/config.ts3
-rw-r--r--packages/opencode/src/format/formatter.ts4
-rw-r--r--packages/opencode/src/format/index.ts29
-rw-r--r--packages/opencode/src/tool/edit.ts1
5 files changed, 37 insertions, 6 deletions
diff --git a/opencode.json b/opencode.json
index 8efc57a7a..185b48c00 100644
--- a/opencode.json
+++ b/opencode.json
@@ -19,6 +19,12 @@
}
}
},
+ "formatter": {
+ "test": {
+ "extensions": [".json"],
+ "command": ["sed", "-i", "s/name/poop/g", "$FILE"]
+ }
+ },
"mcp": {
"context7": {
"type": "remote",
diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts
index 3901bb16b..533975f14 100644
--- a/packages/opencode/src/config/config.ts
+++ b/packages/opencode/src/config/config.ts
@@ -283,6 +283,9 @@ export namespace Config {
z.string(),
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(),
}),
)
.optional(),
diff --git a/packages/opencode/src/format/formatter.ts b/packages/opencode/src/format/formatter.ts
index 8cb77df2b..8a8bbc9aa 100644
--- a/packages/opencode/src/format/formatter.ts
+++ b/packages/opencode/src/format/formatter.ts
@@ -129,7 +129,9 @@ export const clang: Info = {
command: ["clang-format", "-i", "$FILE"],
extensions: [".c", ".cc", ".cpp", ".cxx", ".c++", ".h", ".hh", ".hpp", ".hxx", ".h++", ".ino", ".C", ".H"],
async enabled() {
- return Bun.which("clang-format") !== null
+ const app = App.info()
+ const items = await Filesystem.findUp(".clang-format", app.path.cwd, app.path.root)
+ return items.length > 0
},
}
diff --git a/packages/opencode/src/format/index.ts b/packages/opencode/src/format/index.ts
index 30d464a3c..d4f73c38a 100644
--- a/packages/opencode/src/format/index.ts
+++ b/packages/opencode/src/format/index.ts
@@ -6,20 +6,39 @@ import path from "path"
import * as Formatter from "./formatter"
import { Config } from "../config/config"
+import { mergeDeep } from "remeda"
export namespace Format {
const log = Log.create({ service: "format" })
- const state = App.state("format", () => {
+ const state = App.state("format", async () => {
const enabled: Record<string, boolean> = {}
+ const cfg = await Config.get()
+
+ const formatters = { ...Formatter } as Record<string, Formatter.Info>
+ for (const [name, item] of Object.entries(cfg.formatter ?? {})) {
+ if (item.disabled) {
+ delete formatters[name]
+ continue
+ }
+ const result: Formatter.Info = mergeDeep(formatters[name] ?? {}, {
+ command: [],
+ extensions: [],
+ ...item,
+ })
+ result.enabled = async () => true
+ result.name = name
+ formatters[name] = result
+ }
return {
enabled,
+ formatters,
}
})
async function isEnabled(item: Formatter.Info) {
- const s = state()
+ const s = await state()
let status = s.enabled[item.name]
if (status === undefined) {
status = await item.enabled()
@@ -29,11 +48,11 @@ export namespace Format {
}
async function getFormatter(ext: string) {
- const cfg = await Config.get()
+ const formatters = await state().then((x) => x.formatters)
const result = []
- for (const item of Object.values(Formatter)) {
+ for (const item of Object.values(formatters)) {
+ log.info("checking", { name: item.name, ext })
if (!item.extensions.includes(ext)) continue
- if (cfg.formatter?.[item.name]?.disabled) continue
if (!(await isEnabled(item))) continue
result.push(item)
}
diff --git a/packages/opencode/src/tool/edit.ts b/packages/opencode/src/tool/edit.ts
index 5bed09157..fbda9e4d1 100644
--- a/packages/opencode/src/tool/edit.ts
+++ b/packages/opencode/src/tool/edit.ts
@@ -96,6 +96,7 @@ export const EditTool = Tool.define("edit", {
file: filePath,
})
contentNew = await file.text()
+ diff = trimDiff(createTwoFilesPatch(filePath, filePath, contentOld, contentNew))
})()
FileTime.read(ctx.sessionID, filePath)