Skip to content

Commit 9a37a49

Browse files
committed
feat(claude-code): make agent-browser the default browser tool, via an image-managed skill
Replaces the per-project sandbox-playwright skill with devcontainer-browser, shipped by the image at /etc/claude-code/.claude/skills/ (Claude Code's managed skills location). Every project gets it without a copy, and it wins a name clash with a project skill. - devcontainer-browser: agent-browser first, for opening the app, UI checks, screenshots, DPR/srcset measurement, scripted checks and React render profiling. Playwright only for a project's committed @playwright/test suite, vitest browser mode or Storybook tests, Firefox/WebKit, or a missing agent-browser. Keeps the executablePath wiring matrix and the never-download-a-browser rules. Defers agent-browser command docs to the version-matched `agent-browser skills get core`. - managed-settings.json: a claudeMd routing rule loaded in every session, and permissions.allow for Bash(agent-browser:*). - agent-browser moves from the default target into base, so the sandbox target has it too; sandbox also sets AGENT_BROWSER_EXECUTABLE_PATH. - CI verify checks agent-browser, its env var, the managed skill, and both new managed-settings keys on both targets. - devcontainer-upstream-sync 1.3.0: sandbox-playwright is a retired path (delete), since a leftover copy would load alongside the new skill. - README: built-in browser skill section, migration note, and the "default target only" notes for agent-browser removed. Removing the Playwright MCP plugin is separate: #174 (review 2026-11-25).
1 parent 6c81fcd commit 9a37a49

7 files changed

Lines changed: 179 additions & 160 deletions

File tree

‎.github/workflows/ci.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,12 @@ jobs:
117117
add_image "claude-code" \
118118
"claude-code/.devcontainer" \
119119
"claude-code/.devcontainer/Dockerfile" \
120-
"bun --version || true && claude --version && mise --version && zsh --version && gh --version && gh stack --version && rtk --version && ralphex --version && test -x /usr/local/bin/patch-playwright-mcp && test -r /etc/claude-code/managed-settings.json && jq -r '.hooks.SessionStart[0].hooks[0].command' /etc/claude-code/managed-settings.json | grep -qx /usr/local/bin/patch-playwright-mcp && jq -r '.managedMcpServers.mdn.url' /etc/claude-code/managed-settings.json | grep -qx https://mcp.mdn.mozilla.net/ && printenv AGENT_BROWSER_EXECUTABLE_PATH | grep -qx /usr/bin/chromium && zsh -ic 'typeset -p ZSH_THEME' | grep -q powerlevel10k/powerlevel10k && stat -c %U /home/node/.local/share | grep -qx node && stat -c %U /home/node/.config/gh | grep -qx node" \
120+
"bun --version || true && claude --version && mise --version && zsh --version && gh --version && gh stack --version && rtk --version && ralphex --version && test -x /usr/local/bin/patch-playwright-mcp && test -r /etc/claude-code/managed-settings.json && jq -r '.hooks.SessionStart[0].hooks[0].command' /etc/claude-code/managed-settings.json | grep -qx /usr/local/bin/patch-playwright-mcp && jq -r '.managedMcpServers.mdn.url' /etc/claude-code/managed-settings.json | grep -qx https://mcp.mdn.mozilla.net/ && agent-browser --version && printenv AGENT_BROWSER_EXECUTABLE_PATH | grep -qx /usr/bin/chromium && test -r /etc/claude-code/.claude/skills/devcontainer-browser/SKILL.md && jq -e '.permissions.allow | index(\"Bash(agent-browser:*)\")' /etc/claude-code/managed-settings.json >/dev/null && jq -r '.claudeMd' /etc/claude-code/managed-settings.json | grep -q devcontainer-browser && zsh -ic 'typeset -p ZSH_THEME' | grep -q powerlevel10k/powerlevel10k && stat -c %U /home/node/.local/share | grep -qx node && stat -c %U /home/node/.config/gh | grep -qx node" \
121121
"default"
122122
add_image "claude-code-sandbox" \
123123
"claude-code/.devcontainer" \
124124
"claude-code/.devcontainer/Dockerfile" \
125-
"claude --version && mise --version && zsh --version && gh --version && gh stack --version && which iptables && rtk --version && ralphex --version && test -x /usr/local/bin/patch-playwright-mcp && test -r /etc/claude-code/managed-settings.json && jq -r '.hooks.SessionStart[0].hooks[0].command' /etc/claude-code/managed-settings.json | grep -qx /usr/local/bin/patch-playwright-mcp && jq -r '.managedMcpServers.mdn.url' /etc/claude-code/managed-settings.json | grep -qx https://mcp.mdn.mozilla.net/ && zsh -ic 'typeset -p ZSH_THEME' | grep -q powerlevel10k/powerlevel10k && stat -c %U /home/node/.local/share | grep -qx node && stat -c %U /home/node/.config/gh | grep -qx node" \
125+
"claude --version && mise --version && zsh --version && gh --version && gh stack --version && which iptables && rtk --version && ralphex --version && test -x /usr/local/bin/patch-playwright-mcp && test -r /etc/claude-code/managed-settings.json && jq -r '.hooks.SessionStart[0].hooks[0].command' /etc/claude-code/managed-settings.json | grep -qx /usr/local/bin/patch-playwright-mcp && jq -r '.managedMcpServers.mdn.url' /etc/claude-code/managed-settings.json | grep -qx https://mcp.mdn.mozilla.net/ && agent-browser --version && printenv AGENT_BROWSER_EXECUTABLE_PATH | grep -qx /usr/bin/chromium && test -r /etc/claude-code/.claude/skills/devcontainer-browser/SKILL.md && jq -e '.permissions.allow | index(\"Bash(agent-browser:*)\")' /etc/claude-code/managed-settings.json >/dev/null && jq -r '.claudeMd' /etc/claude-code/managed-settings.json | grep -q devcontainer-browser && zsh -ic 'typeset -p ZSH_THEME' | grep -q powerlevel10k/powerlevel10k && stat -c %U /home/node/.local/share | grep -qx node && stat -c %U /home/node/.config/gh | grep -qx node" \
126126
"sandbox"
127127
fi
128128

‎claude-code/.claude/skills/devcontainer-upstream-sync/SKILL.md‎

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ description: Use to audit a project's .devcontainer/ and bundled .claude/skills/
44
metadata:
55
author: Serge Gatezh
66
url: https://github.com/gatezh
7-
version: "1.2.0"
7+
version: "1.3.0"
88
---
99

1010
# Devcontainer Upstream Sync
@@ -67,12 +67,20 @@ but don't, and includes files that shouldn't be tracked.
6767
| `.devcontainer/claude-sandbox/docker-compose.yml` | `claude-code/.devcontainer/claude-sandbox/docker-compose.yml` | starter-customize |
6868
| `.devcontainer/claude-sandbox/init-firewall.sh` | `.devcontainer/claude-sandbox/init-firewall.sh` *(repo root, not `claude-code/`)* | exemplar |
6969
| `.claude/skills/sandbox-fetch-docs/SKILL.md` | `claude-code/.claude/skills/sandbox-fetch-docs/SKILL.md` | framework-track |
70-
| `.claude/skills/sandbox-playwright/SKILL.md` | `claude-code/.claude/skills/sandbox-playwright/SKILL.md` | framework-track |
7170
| `.claude/skills/stacked-prs/SKILL.md` | `claude-code/.claude/skills/stacked-prs/SKILL.md` | framework-track |
7271
| `.claude/skills/devcontainer-upstream-sync/SKILL.md` | `claude-code/.claude/skills/devcontainer-upstream-sync/SKILL.md` | framework-track |
7372
| `.claude/settings.json` | `claude-code/.claude/settings.json` | starter-customize |
7473
| `.mise.toml` | `claude-code/mise.toml` | starter-customize |
7574

75+
### Retired paths
76+
77+
Upstream no longer ships these. If the project still has one, report it as
78+
`retired: delete` and delete it when adopting — don't diff it.
79+
80+
| local path | why |
81+
|---|---|
82+
| `.claude/skills/sandbox-playwright/` | Replaced by `devcontainer-browser`, which the image ships at `/etc/claude-code/.claude/skills/`. The names differ, so a leftover copy loads alongside it and contradicts it (it makes the Playwright MCP the default). |
83+
7684
### Bucket meanings
7785

7886
- **framework-track** — should match upstream byte-for-byte modulo
@@ -155,7 +163,8 @@ Report format (one row per manifest entry):
155163
✓ .devcontainer/devcontainer.json framework-track intentional-customization (Hugo extensions, hostname)
156164
⚠ .devcontainer/claude-sandbox/init-firewall.sh exemplar template-divergence: see Workflow 2
157165
⚠ .mise.toml starter-customize local-missing (project may not use mise)
158-
✗ .claude/skills/sandbox-playwright/SKILL.md framework-track drift-needs-adopt: 3 hunks
166+
✗ .claude/skills/stacked-prs/SKILL.md framework-track drift-needs-adopt: 3 hunks
167+
✗ .claude/skills/sandbox-playwright/ retired retired: delete
159168
```
160169

161170
Audit is read-only. Don't apply edits in this phase.

‎claude-code/.claude/skills/sandbox-playwright/SKILL.md‎

Lines changed: 0 additions & 126 deletions
This file was deleted.

0 commit comments

Comments
 (0)