diff --git a/CHANGELOG.md b/CHANGELOG.md index ece53ad..0e16265 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 0.2.3 + +- Always ask the model to report whether custom compaction instructions were applied. + ## 0.2.2 - Add explicit markers for applied and skipped custom compaction instructions. diff --git a/README.md b/README.md index 851244b..7fa92ad 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ Create `.opencode/compaction.md` in the project when you have project-specific c Append mode is the recommended default because it preserves OpenCode's built-in compaction behavior. Replace mode is available when the complete prompt needs to be controlled by this plugin. -When neither a prompt nor a memory file is available, the plugin adds `opencode-plugin-compaction-prompt: No custom compaction applied.` instead. +When neither a prompt nor a memory file is available, the plugin asks the model to echo `opencode-plugin-compaction-prompt: No custom compaction applied.` instead. ## Development diff --git a/src/index.ts b/src/index.ts index ab7a15c..2b06710 100644 --- a/src/index.ts +++ b/src/index.ts @@ -31,11 +31,7 @@ function buildInstructions( prompt: string, completionMarker: string, memory: string, -): string | undefined { - if (!prompt && !memory) { - return undefined; - } - +): string { const sections = [ "## User Compaction Instructions", `These instructions take precedence over previous instructions if there is conflict. At the very end of the summary, echo exactly: **${completionMarker}**`, @@ -115,17 +111,9 @@ export const CompactionPromptPlugin: Plugin = async ( output, ): Promise => { const memory = await readMemory(memoryPath, logError); - const instructions = buildInstructions(prompt, completionMarker, memory); - - if (!instructions) { - if (mode === "replace") { - output.prompt = skippedCompactionMarker; - } else { - output.context.push(skippedCompactionMarker); - } - - return; - } + const marker = + prompt || memory ? completionMarker : skippedCompactionMarker; + const instructions = buildInstructions(prompt, marker, memory); if (mode === "replace") { output.prompt = instructions; diff --git a/test/index.test.ts b/test/index.test.ts index bb81d8e..7b59e05 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -116,9 +116,9 @@ describe("CompactionPromptPlugin", () => { ); expect(context.logs).toHaveLength(0); - expect(output.context).toEqual([ - "opencode-plugin-compaction-prompt: No custom compaction applied.", - ]); + expect(output.context[0]).toContain( + "echo exactly: **opencode-plugin-compaction-prompt: No custom compaction applied.**", + ); }); test("adds a skipped marker when no instructions are provided", async () => { @@ -133,10 +133,10 @@ describe("CompactionPromptPlugin", () => { output, ); - expect(output.context).toEqual([ - "Existing context", - "opencode-plugin-compaction-prompt: No custom compaction applied.", - ]); + expect(output.context[0]).toBe("Existing context"); + expect(output.context[1]).toContain( + "echo exactly: **opencode-plugin-compaction-prompt: No custom compaction applied.**", + ); expect(output.prompt).toBeUndefined(); }); @@ -154,8 +154,8 @@ describe("CompactionPromptPlugin", () => { ); expect(context.logs).toHaveLength(1); - expect(output.context).toEqual([ - "opencode-plugin-compaction-prompt: No custom compaction applied.", - ]); + expect(output.context[0]).toContain( + "echo exactly: **opencode-plugin-compaction-prompt: No custom compaction applied.**", + ); }); });