@plainconceptsplatform/agent-harness 3.9.0-alpha.1 → 3.10.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.
package/README.md CHANGED
@@ -89,7 +89,7 @@ Reach for individual steps when you want something narrower:
89
89
 
90
90
  > **Upgrading from `opencode-onboard` v1?** v2 renamed the config files and the skill prefix (`ob-` became `pc-`), and it does not migrate v1 projects. The CLI detects one and refuses to run rather than half-patching it. Re-onboard on a clean branch: remove `.opencode/` and `.agents/skills/ob-*`, then run the wizard again.
91
91
 
92
- > **Browser tooling changed in v2.5.** `agent-browser` (which launched its own isolated Chrome for Testing) was replaced by [`browse`](https://opencode.ai/product/browse), the OpenCode MCP server that drives the user's real Chrome-family browser with their logins, tabs, cookies, and extensions. Agent tabs open in the background in collapsed groups; when only a person can proceed (login, 2FA, captcha, payment), browse hands the tab back and continues once the user clicks Continue. Running `update` replaces the `agent-browser` MCP server entry with `browse`, installs the new CLI, and runs `browse install` which opens the Chrome Web Store for the extension and pairs it. Skills you wrote that call `agent-browser` CLI commands or `agent_browser_*` MCP tools must switch to the `browse` CLI or the `browse.execute` / `browse.session_*` MCP tools. Backlog-browser users: browse uses your real browser, so work-item pages behind your own login are already authenticated — no separate login session is needed.
92
+ > **Browser tooling changed in v3.10.** `agent-browser` (which launched its own isolated Chrome for Testing) was replaced by [`browse`](https://opencode.ai/product/browse), the OpenCode MCP server that drives the user's real Chrome-family browser with their logins, tabs, cookies, and extensions. Agent tabs open in the background in collapsed groups; when only a person can proceed (login, 2FA, captcha, payment), browse hands the tab back and continues once the user clicks Continue. Running `update` replaces the `agent-browser` MCP server entry with `browse`, installs the new CLI, and runs `browse install` which opens the Chrome Web Store for the extension and pairs it. Skills you wrote that call `agent-browser` CLI commands or `agent_browser_*` MCP tools must switch to the `browse` CLI or the `browse.execute` / `browse.session_*` MCP tools. Backlog-browser users: browse uses your real browser, so work-item pages behind your own login are already authenticated — no separate login session is needed.
93
93
 
94
94
  ---
95
95
 
@@ -166,6 +166,40 @@ function migrateMcp(obj) {
166
166
  return true
167
167
  }
168
168
 
169
+ // Stale MCP server entries that browse replaced. The V2 @different-ai/opencode-browser
170
+ // plugin (and its Chrome extension) was replaced by agent-browser in v2.4, then by browse
171
+ // in v3.10. Both old entries are stripped and the current browse entry is ensured.
172
+ const BROWSE_MCP_SERVER = {
173
+ type: 'local',
174
+ command: ['browse', 'mcp'],
175
+ environment: { OPENCODE_BROWSER_RUNTIME: 'auto-update' },
176
+ disabled: false,
177
+ }
178
+ const STALE_MCP_SERVER_NAMES = ['agent-browser', 'opencode-browser', '@different-ai/opencode-browser']
179
+
180
+ function migrateBrowserMcp(obj) {
181
+ if (!obj.mcp?.servers || typeof obj.mcp.servers !== 'object') return false
182
+ let changed = false
183
+ for (const name of STALE_MCP_SERVER_NAMES) {
184
+ if (name in obj.mcp.servers) {
185
+ delete obj.mcp.servers[name]
186
+ changed = true
187
+ }
188
+ }
189
+ const current = obj.mcp.servers['browse']
190
+ if (!current) {
191
+ obj.mcp.servers['browse'] = { ...BROWSE_MCP_SERVER }
192
+ changed = true
193
+ } else if (JSON.stringify(current.command) !== JSON.stringify(BROWSE_MCP_SERVER.command)) {
194
+ obj.mcp.servers['browse'] = { ...current, ...BROWSE_MCP_SERVER, environment: current.environment ?? BROWSE_MCP_SERVER.environment }
195
+ changed = true
196
+ } else if (!current.environment?.OPENCODE_BROWSER_RUNTIME) {
197
+ obj.mcp.servers['browse'] = { ...current, environment: { ...(current.environment ?? {}), OPENCODE_BROWSER_RUNTIME: 'auto-update' } }
198
+ changed = true
199
+ }
200
+ return changed
201
+ }
202
+
169
203
  /** Mutate `obj` in place to the native V2 shape; returns true when it changed. */
170
204
  function migrateToV2(obj) {
171
205
  let changed = false
@@ -246,6 +280,7 @@ function migrateToV2(obj) {
246
280
 
247
281
  if (migrateAgents(obj)) changed = true
248
282
  if (migrateMcp(obj)) changed = true
283
+ if (migrateBrowserMcp(obj)) changed = true
249
284
  if (migratePluginArray(obj)) changed = true
250
285
 
251
286
  // A session starts read-only: fullstack-engineer is a subagent now, so a
@@ -5,6 +5,7 @@
5
5
  "browse": {
6
6
  "type": "local",
7
7
  "command": ["browse", "mcp"],
8
+ "environment": { "OPENCODE_BROWSER_RUNTIME": "auto-update" },
8
9
  "disabled": false
9
10
  }
10
11
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plainconceptsplatform/agent-harness",
3
- "version": "3.9.0-alpha.1",
3
+ "version": "3.10.0",
4
4
  "description": "Installs the Plain Concepts Platform Harness into any codebase, and keeps it up to date. Wires OpenCode, OpenSpec, codegraph, and agentmemory into a multi-agent workflow that runs on native parallel subagents.",
5
5
  "keywords": [
6
6
  "opencode",