summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--packages/opencode/config.schema.json7
-rw-r--r--packages/opencode/src/config/config.ts4
-rw-r--r--packages/opencode/src/session/system.ts15
-rw-r--r--packages/opencode/src/util/filesystem.ts24
4 files changed, 50 insertions, 0 deletions
diff --git a/packages/opencode/config.schema.json b/packages/opencode/config.schema.json
index 6ee406c01..35dfd6f1e 100644
--- a/packages/opencode/config.schema.json
+++ b/packages/opencode/config.schema.json
@@ -297,6 +297,13 @@
},
"description": "MCP (Model Context Protocol) server configurations"
},
+ "instructions": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Additional instruction files or patterns to include"
+ },
"experimental": {
"type": "object",
"properties": {
diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts
index cf2f34790..eb67778eb 100644
--- a/packages/opencode/src/config/config.ts
+++ b/packages/opencode/src/config/config.ts
@@ -176,6 +176,10 @@ export namespace Config {
.record(z.string(), Mcp)
.optional()
.describe("MCP (Model Context Protocol) server configurations"),
+ instructions: z
+ .array(z.string())
+ .optional()
+ .describe("Additional instruction files or patterns to include"),
experimental: z
.object({
hook: z
diff --git a/packages/opencode/src/session/system.ts b/packages/opencode/src/session/system.ts
index 1c77824b1..722964ea2 100644
--- a/packages/opencode/src/session/system.ts
+++ b/packages/opencode/src/session/system.ts
@@ -2,6 +2,7 @@ import { App } from "../app/app"
import { Ripgrep } from "../file/ripgrep"
import { Global } from "../global"
import { Filesystem } from "../util/filesystem"
+import { Config } from "../config/config"
import path from "path"
import os from "os"
@@ -55,8 +56,10 @@ export namespace SystemPrompt {
"CLAUDE.md",
"CONTEXT.md", // deprecated
]
+
export async function custom() {
const { cwd, root } = App.info().path
+ const config = await Config.get()
const found = []
for (const item of CUSTOM_FILES) {
const matches = await Filesystem.findUp(item, cwd, root)
@@ -72,6 +75,18 @@ export namespace SystemPrompt {
.text()
.catch(() => ""),
)
+
+ if (config.instructions) {
+ for (const instruction of config.instructions) {
+ try {
+ const matches = await Filesystem.globUp(instruction, cwd, root)
+ found.push(...matches.map((x) => Bun.file(x).text()))
+ } catch {
+ continue // Skip invalid glob patterns
+ }
+ }
+ }
+
return Promise.all(found).then((result) => result.filter(Boolean))
}
diff --git a/packages/opencode/src/util/filesystem.ts b/packages/opencode/src/util/filesystem.ts
index bddc4025b..c4fd163c5 100644
--- a/packages/opencode/src/util/filesystem.ts
+++ b/packages/opencode/src/util/filesystem.ts
@@ -15,4 +15,28 @@ export namespace Filesystem {
}
return result
}
+
+ export async function globUp(pattern: string, start: string, stop?: string) {
+ let current = start
+ const result = []
+ while (true) {
+ try {
+ const glob = new Bun.Glob(pattern)
+ for await (const match of glob.scan({
+ cwd: current,
+ onlyFiles: true,
+ dot: true,
+ })) {
+ result.push(join(current, match))
+ }
+ } catch {
+ // Skip invalid glob patterns
+ }
+ if (stop === current) break
+ const parent = dirname(current)
+ if (parent === current) break
+ current = parent
+ }
+ return result
+ }
}