Sfoglia il codice sorgente

feat: configurable instructions (#624)

Aiden Cline 7 mesi fa
parent
commit
b99565959b

+ 7 - 0
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": {

+ 4 - 0
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

+ 15 - 0
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))
   }
 

+ 24 - 0
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
+  }
 }