@every-env/compound-plugin 2.35.0 → 2.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,8 +11,8 @@
11
11
  "plugins": [
12
12
  {
13
13
  "name": "compound-engineering",
14
- "description": "AI-powered development tools that get smarter with every use. Make each unit of engineering work easier than the last. Includes 29 specialized agents, 22 commands, and 20 skills.",
15
- "version": "2.38.1",
14
+ "description": "AI-powered development tools that get smarter with every use. Make each unit of engineering work easier than the last. Includes 28 specialized agents, 22 commands, and 20 skills.",
15
+ "version": "2.39.0",
16
16
  "author": {
17
17
  "name": "Kieran Klaassen",
18
18
  "url": "https://github.com/kieranklaassen",
package/CHANGELOG.md CHANGED
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  Release numbering now follows the repository `v*` tag line. Starting at `v2.34.0`, the root CLI package and this changelog stay on that shared version stream. Older entries below retain the previous `0.x` CLI numbering.
9
9
 
10
+ # [2.36.0](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.35.0...v2.36.0) (2026-03-11)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * **hooks:** wrap PreToolUse handlers in try-catch to prevent parallel tool call crashes ([598222e](https://github.com/EveryInc/compound-engineering-plugin/commit/598222e11cb2206a2e3347cb5dd38cacdc3830df)), closes [#85](https://github.com/EveryInc/compound-engineering-plugin/issues/85)
16
+ * **install:** merge config instead of overwriting on opencode target ([1db7680](https://github.com/EveryInc/compound-engineering-plugin/commit/1db76800f91fefcc1bb9c1798ef273ddd0b65f5c)), closes [#125](https://github.com/EveryInc/compound-engineering-plugin/issues/125)
17
+ * **review:** add serial mode to prevent context limit crashes ([d96671b](https://github.com/EveryInc/compound-engineering-plugin/commit/d96671b9e9ecbe417568b2ce7f7fa4d379c2bec2)), closes [#166](https://github.com/EveryInc/compound-engineering-plugin/issues/166)
18
+
19
+
20
+ ### Features
21
+
22
+ * **compound:** add context budget precheck and compact-safe mode ([c4b1358](https://github.com/EveryInc/compound-engineering-plugin/commit/c4b13584312058cb8db3ad0f25674805bbb91b2d)), closes [#198](https://github.com/EveryInc/compound-engineering-plugin/issues/198)
23
+ * **plan:** add daily sequence number to plan filenames ([e94ca04](https://github.com/EveryInc/compound-engineering-plugin/commit/e94ca0409671efcfa2d4a8fcb2d60b79a848fd85)), closes [#135](https://github.com/EveryInc/compound-engineering-plugin/issues/135)
24
+ * **plugin:** release v2.39.0 with community contributions ([d2ab6c0](https://github.com/EveryInc/compound-engineering-plugin/commit/d2ab6c076882a4dacaa787c0a6f3c9d555d38af0))
25
+
10
26
  # [2.35.0](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.34.7...v2.35.0) (2026-03-10)
11
27
 
12
28
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@every-env/compound-plugin",
3
- "version": "2.35.0",
3
+ "version": "2.36.0",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "compound-engineering",
3
- "version": "2.38.1",
3
+ "version": "2.39.0",
4
4
  "description": "AI-powered development tools. 28 agents, 22 commands, 20 skills, 1 MCP server for code review, research, design, and workflow automation.",
5
5
  "author": {
6
6
  "name": "Kieran Klaassen",
@@ -5,6 +5,32 @@ All notable changes to the compound-engineering plugin will be documented in thi
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.39.0] - 2026-03-10
9
+
10
+ ### Added
11
+
12
+ - **ce:compound context budget precheck** — Warns when context is constrained and offers compact-safe mode to avoid compaction mid-compound ([#235](https://github.com/EveryInc/compound-engineering-plugin/pull/235))
13
+ - **ce:plan daily sequence numbers** — Plan filenames now include a 3-digit daily sequence number (e.g., `2026-03-10-001-feat-...`) to prevent collisions ([#238](https://github.com/EveryInc/compound-engineering-plugin/pull/238))
14
+ - **ce:review serial mode** — Pass `--serial` flag (or auto-detects when 6+ agents configured) to run review agents sequentially, preventing context limit crashes ([#237](https://github.com/EveryInc/compound-engineering-plugin/pull/237))
15
+ - **agent-browser inspection & debugging commands** — Added JS eval, console/errors, network, storage, device emulation, element debugging, recording/tracing, tabs, and advanced mouse commands to agent-browser skill ([#236](https://github.com/EveryInc/compound-engineering-plugin/pull/236))
16
+ - **test-browser port detection** — Auto-detects dev server port from CLAUDE.md, package.json, or .env files; supports `--port` flag ([#233](https://github.com/EveryInc/compound-engineering-plugin/pull/233))
17
+ - **lfg phase gating** — Added explicit GATE checks between /lfg steps to enforce plan-before-work ordering ([#231](https://github.com/EveryInc/compound-engineering-plugin/pull/231))
18
+
19
+ ### Fixed
20
+
21
+ - **Context7 API key auth** — MCP server config now passes `CONTEXT7_API_KEY` via `x-api-key` header to avoid anonymous rate limits ([#232](https://github.com/EveryInc/compound-engineering-plugin/pull/232))
22
+ - **CLI: MCP server merge order** — `sync` now correctly overwrites same-named MCP servers with plugin values instead of preserving stale entries
23
+
24
+ ### Removed
25
+
26
+ - **every-style-editor agent** — Removed duplicate agent; functionality already exists as `every-style-editor` skill ([#234](https://github.com/EveryInc/compound-engineering-plugin/pull/234))
27
+
28
+ ### Contributors
29
+
30
+ - Matt Van Horn ([@mvanhorn](https://x.com/mvanhorn)) — PRs #231–#238
31
+
32
+ ---
33
+
8
34
  ## [2.38.1] - 2026-03-01
9
35
 
10
36
  ### Fixed
@@ -6,7 +6,7 @@ AI-powered development tools that get smarter with every use. Make each unit of
6
6
 
7
7
  | Component | Count |
8
8
  |-----------|-------|
9
- | Agents | 29 |
9
+ | Agents | 28 |
10
10
  | Commands | 22 |
11
11
  | Skills | 20 |
12
12
  | MCP Servers | 1 |
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ce:review
3
3
  description: Perform exhaustive code reviews using multi-agent analysis, ultra-thinking, and worktrees
4
- argument-hint: "[PR number, GitHub URL, branch name, or latest]"
4
+ argument-hint: "[PR number, GitHub URL, branch name, or latest] [--serial]"
5
5
  ---
6
6
 
7
7
  # Review Command
@@ -65,17 +65,50 @@ Read `compound-engineering.local.md` in the project root. If found, use `review_
65
65
 
66
66
  If no settings file exists, invoke the `setup` skill to create one. Then read the newly created file and continue.
67
67
 
68
+ #### Choose Execution Mode
69
+
70
+ <execution_mode>
71
+
72
+ Before launching review agents, check for context constraints:
73
+
74
+ **If `--serial` flag is passed OR conversation is in a long session:**
75
+
76
+ Run agents ONE AT A TIME in sequence. Wait for each agent to complete before starting the next. This uses less context but takes longer.
77
+
78
+ **Default (parallel):**
79
+
80
+ Run all agents simultaneously for speed. If you hit context limits, retry with `--serial` flag.
81
+
82
+ **Auto-detect:** If more than 5 review agents are configured, automatically switch to serial mode and inform the user:
83
+ "Running review agents in serial mode (6+ agents configured). Use --parallel to override."
84
+
85
+ </execution_mode>
86
+
68
87
  #### Parallel Agents to review the PR:
69
88
 
70
89
  <parallel_tasks>
71
90
 
91
+ **Parallel mode (default for ≤5 agents):**
92
+
72
93
  Run all configured review agents in parallel using Task tool. For each agent in the `review_agents` list:
73
94
 
74
95
  ```
75
96
  Task {agent-name}(PR content + review context from settings body)
76
97
  ```
77
98
 
78
- Additionally, always run these regardless of settings:
99
+ **Serial mode (--serial flag, or auto for 6+ agents):**
100
+
101
+ Run configured review agents ONE AT A TIME. For each agent in the `review_agents` list, wait for it to complete before starting the next:
102
+
103
+ ```
104
+ For each agent in review_agents:
105
+ 1. Task {agent-name}(PR content + review context)
106
+ 2. Wait for completion
107
+ 3. Collect findings
108
+ 4. Proceed to next agent
109
+ ```
110
+
111
+ Always run these last regardless of mode:
79
112
  - Task agent-native-reviewer(PR content) - Verify new features are agent-accessible
80
113
  - Task learnings-researcher(PR content) - Search docs/solutions/ for past issues related to this PR's modules and patterns
81
114
 
@@ -202,7 +202,15 @@ function renderHookHandlers(
202
202
  const wrapped = options.requireError
203
203
  ? ` if (input?.error) {\n${statements.map((line) => ` ${line}`).join("\n")}\n }`
204
204
  : rendered
205
+
206
+ // Wrap tool.execute.before handlers in try-catch to prevent a failing hook
207
+ // from crashing parallel tool call batches (causes API 400 errors).
208
+ // See: https://github.com/EveryInc/compound-engineering-plugin/issues/85
209
+ const isPreToolUse = event === "tool.execute.before"
205
210
  const note = options.note ? ` // ${options.note}\n` : ""
211
+ if (isPreToolUse) {
212
+ return ` "${event}": async (input) => {\n${note} try {\n ${wrapped}\n } catch (err) {\n console.error("[hook] ${event} error (non-fatal):", err)\n }\n }`
213
+ }
206
214
  return ` "${event}": async (input) => {\n${note}${wrapped}\n }`
207
215
  }
208
216
 
@@ -19,7 +19,7 @@ export async function mergeJsonConfigAtKey(options: {
19
19
  ...existing,
20
20
  [key]: {
21
21
  ...existingEntries,
22
- ...incoming,
22
+ ...incoming, // incoming plugin entries overwrite same-named servers
23
23
  },
24
24
  }
25
25
 
@@ -58,12 +58,16 @@ export async function writeOpenCodeBundle(outputRoot: string, bundle: OpenCodeBu
58
58
  const openCodePaths = resolveOpenCodePaths(outputRoot)
59
59
  await ensureDir(openCodePaths.root)
60
60
 
61
+ const hadExistingConfig = await pathExists(openCodePaths.configPath)
61
62
  const backupPath = await backupFile(openCodePaths.configPath)
62
63
  if (backupPath) {
63
64
  console.log(`Backed up existing config to ${backupPath}`)
64
65
  }
65
66
  const merged = await mergeOpenCodeConfig(openCodePaths.configPath, bundle.config)
66
67
  await writeJson(openCodePaths.configPath, merged)
68
+ if (hadExistingConfig) {
69
+ console.log("Merged plugin config into existing opencode.json (user settings preserved)")
70
+ }
67
71
 
68
72
  const agentsDir = openCodePaths.agentsDir
69
73
  for (const agent of bundle.agents) {
@@ -132,6 +132,18 @@ describe("convertClaudeToOpenCode", () => {
132
132
  expect(hookFile!.content).toContain("// timeout: 30s")
133
133
  expect(hookFile!.content).toContain("// Prompt hook for Write|Edit")
134
134
  expect(hookFile!.content).toContain("// Agent hook for Write|Edit: security-sentinel")
135
+
136
+ // PreToolUse (tool.execute.before) handlers are wrapped in try-catch
137
+ // to prevent hook failures from crashing parallel tool call batches (#85)
138
+ const beforeIdx = hookFile!.content.indexOf('"tool.execute.before"')
139
+ const afterIdx = hookFile!.content.indexOf('"tool.execute.after"')
140
+ const beforeBlock = hookFile!.content.slice(beforeIdx, afterIdx)
141
+ expect(beforeBlock).toContain("try {")
142
+ expect(beforeBlock).toContain("} catch (err) {")
143
+
144
+ // PostToolUse (tool.execute.after) handlers are NOT wrapped in try-catch
145
+ const afterBlock = hookFile!.content.slice(afterIdx, hookFile!.content.indexOf('"session.created"'))
146
+ expect(afterBlock).not.toContain("try {")
135
147
  })
136
148
 
137
149
  test("converts MCP servers", async () => {
@@ -3,6 +3,7 @@ import { promises as fs } from "fs"
3
3
  import path from "path"
4
4
  import os from "os"
5
5
  import { writeOpenCodeBundle } from "../src/targets/opencode"
6
+ import { mergeJsonConfigAtKey } from "../src/sync/json-config"
6
7
  import type { OpenCodeBundle } from "../src/types/opencode"
7
8
 
8
9
  async function exists(filePath: string): Promise<boolean> {
@@ -254,3 +255,38 @@ describe("writeOpenCodeBundle", () => {
254
255
  expect(backupContent).toBe("old content\n")
255
256
  })
256
257
  })
258
+
259
+ describe("mergeJsonConfigAtKey", () => {
260
+ test("incoming plugin entries overwrite same-named servers", async () => {
261
+ const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "json-merge-"))
262
+ const configPath = path.join(tempDir, "opencode.json")
263
+
264
+ // User has an existing MCP server config
265
+ const existingConfig = {
266
+ model: "my-model",
267
+ mcp: {
268
+ "user-server": { type: "local", command: ["uvx", "user-srv"] },
269
+ },
270
+ }
271
+ await fs.writeFile(configPath, JSON.stringify(existingConfig, null, 2))
272
+
273
+ // Plugin syncs its servers, overwriting same-named entries
274
+ await mergeJsonConfigAtKey({
275
+ configPath,
276
+ key: "mcp",
277
+ incoming: {
278
+ "plugin-server": { type: "local", command: ["uvx", "plugin-srv"] },
279
+ "user-server": { type: "local", command: ["uvx", "plugin-override"] },
280
+ },
281
+ })
282
+
283
+ const merged = JSON.parse(await fs.readFile(configPath, "utf8"))
284
+
285
+ // User's top-level keys preserved
286
+ expect(merged.model).toBe("my-model")
287
+ // Plugin server added
288
+ expect(merged.mcp["plugin-server"]).toBeDefined()
289
+ // Plugin server overwrites same-named existing entry
290
+ expect(merged.mcp["user-server"].command[1]).toBe("plugin-override")
291
+ })
292
+ })