Просмотр исходного кода

fix plan mode when not in git worktree

Dax Raad 2 месяцев назад
Родитель
Сommit
fcc561ebb7

+ 6 - 0
packages/opencode/src/agent/agent.ts

@@ -13,6 +13,8 @@ import PROMPT_SUMMARY from "./prompt/summary.txt"
 import PROMPT_TITLE from "./prompt/title.txt"
 import { PermissionNext } from "@/permission/next"
 import { mergeDeep, pipe, sortBy, values } from "remeda"
+import { Global } from "@/global"
+import path from "path"
 
 export namespace Agent {
   export const Info = z
@@ -88,9 +90,13 @@ export namespace Agent {
           PermissionNext.fromConfig({
             question: "allow",
             plan_exit: "allow",
+            external_directory: {
+              [path.join(Global.Path.data, "plans", "*")]: "allow",
+            },
             edit: {
               "*": "deny",
               ".opencode/plans/*.md": "allow",
+              [path.relative(Instance.worktree, path.join(Global.Path.data, "plans/*.md"))]: "allow",
             },
           }),
           user,

+ 5 - 1
packages/opencode/src/session/index.ts

@@ -22,6 +22,7 @@ import { Snapshot } from "@/snapshot"
 import type { Provider } from "@/provider/provider"
 import { PermissionNext } from "@/permission/next"
 import path from "path"
+import { Global } from "@/global"
 
 export namespace Session {
   const log = Log.create({ service: "session" })
@@ -233,7 +234,10 @@ export namespace Session {
   }
 
   export function plan(input: { slug: string; time: { created: number } }) {
-    return path.join(Instance.worktree, ".opencode", "plans", [input.time.created, input.slug].join("-") + ".md")
+    const base = Instance.project.vcs
+      ? path.join(Instance.worktree, ".opencode", "plans")
+      : path.join(Global.Path.data, "plans")
+    return path.join(base, [input.time.created, input.slug].join("-") + ".md")
   }
 
   export const get = fn(Identifier.schema("session"), async (id) => {

+ 3 - 1
packages/opencode/src/session/prompt.ts

@@ -1229,11 +1229,13 @@ export namespace SessionPrompt {
           messageID: userMessage.info.id,
           sessionID: userMessage.info.sessionID,
           type: "text",
-          text: BUILD_SWITCH.replace("{{plan}}", plan),
+          text:
+            BUILD_SWITCH + "\n\n" + `A plan file exists at ${plan}. You should execute on the plan defined within it`,
           synthetic: true,
         })
         userMessage.parts.push(part)
       }
+      return input.messages
     }
 
     // Entering plan mode

+ 0 - 2
packages/opencode/src/session/prompt/build-switch.txt

@@ -2,6 +2,4 @@
 Your operational mode has changed from plan to build.
 You are no longer in read-only mode.
 You are permitted to make file changes, run shell commands, and utilize your arsenal of tools as needed.
-
-A plan file exists at {{plan}}. You should read this file and execute on the plan defined within it.
 </system-reminder>