@soleur/opencode 0.0.0-stage → 3.354.2

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.
Files changed (832) hide show
  1. package/.claude-plugin/agents.manifest.json +476 -0
  2. package/.claude-plugin/plugin.json +42 -0
  3. package/README.md +44 -2
  4. package/agents/community/.gitkeep +0 -0
  5. package/agents/engineering/cto.md +87 -0
  6. package/agents/engineering/design/ddd-architect.md +95 -0
  7. package/agents/engineering/discovery/agent-finder.md +214 -0
  8. package/agents/engineering/discovery/functional-discovery.md +182 -0
  9. package/agents/engineering/infra/infra-security.md +151 -0
  10. package/agents/engineering/infra/platform-strategist.md +109 -0
  11. package/agents/engineering/infra/terraform-architect.md +171 -0
  12. package/agents/engineering/prompt-engineer.md +37 -0
  13. package/agents/engineering/research/best-practices-researcher.md +115 -0
  14. package/agents/engineering/research/framework-docs-researcher.md +93 -0
  15. package/agents/engineering/research/git-history-analyzer.md +53 -0
  16. package/agents/engineering/research/learnings-researcher.md +285 -0
  17. package/agents/engineering/research/repo-research-analyst.md +118 -0
  18. package/agents/engineering/review/agent-native-reviewer.md +279 -0
  19. package/agents/engineering/review/architecture-strategist.md +61 -0
  20. package/agents/engineering/review/code-quality-analyst.md +92 -0
  21. package/agents/engineering/review/code-simplicity-reviewer.md +109 -0
  22. package/agents/engineering/review/data-integrity-guardian.md +82 -0
  23. package/agents/engineering/review/data-migration-expert.md +98 -0
  24. package/agents/engineering/review/deployment-verification-agent.md +183 -0
  25. package/agents/engineering/review/dhh-rails-reviewer.md +46 -0
  26. package/agents/engineering/review/kieran-rails-reviewer.md +87 -0
  27. package/agents/engineering/review/legacy-code-expert.md +55 -0
  28. package/agents/engineering/review/observability-coverage-reviewer.md +147 -0
  29. package/agents/engineering/review/pattern-recognition-specialist.md +59 -0
  30. package/agents/engineering/review/performance-oracle.md +130 -0
  31. package/agents/engineering/review/security-sentinel.md +167 -0
  32. package/agents/engineering/review/semgrep-sast.md +36 -0
  33. package/agents/engineering/review/test-design-reviewer.md +150 -0
  34. package/agents/engineering/review/user-impact-reviewer.md +70 -0
  35. package/agents/engineering/workflow/pr-comment-resolver.md +69 -0
  36. package/agents/finance/budget-analyst.md +29 -0
  37. package/agents/finance/cfo.md +44 -0
  38. package/agents/finance/financial-reporter.md +30 -0
  39. package/agents/finance/revenue-analyst.md +30 -0
  40. package/agents/legal/clo.md +115 -0
  41. package/agents/legal/legal-compliance-auditor.md +110 -0
  42. package/agents/legal/legal-document-generator.md +134 -0
  43. package/agents/marketing/analytics-analyst.md +25 -0
  44. package/agents/marketing/brand-architect.md +181 -0
  45. package/agents/marketing/cmo.md +76 -0
  46. package/agents/marketing/conversion-optimizer.md +19 -0
  47. package/agents/marketing/copywriter.md +20 -0
  48. package/agents/marketing/fact-checker.md +70 -0
  49. package/agents/marketing/growth-strategist.md +145 -0
  50. package/agents/marketing/paid-media-strategist.md +28 -0
  51. package/agents/marketing/pricing-strategist.md +17 -0
  52. package/agents/marketing/programmatic-seo-specialist.md +25 -0
  53. package/agents/marketing/retention-strategist.md +23 -0
  54. package/agents/marketing/seo-aeo-analyst.md +164 -0
  55. package/agents/operations/coo.md +50 -0
  56. package/agents/operations/ops-advisor.md +78 -0
  57. package/agents/operations/ops-provisioner.md +101 -0
  58. package/agents/operations/ops-research.md +52 -0
  59. package/agents/operations/service-automator.md +278 -0
  60. package/agents/product/business-validator.md +206 -0
  61. package/agents/product/competitive-intelligence.md +89 -0
  62. package/agents/product/cpo.md +63 -0
  63. package/agents/product/design/ux-design-lead.md +209 -0
  64. package/agents/product/spec-flow-analyzer.md +122 -0
  65. package/agents/sales/cro.md +44 -0
  66. package/agents/sales/deal-architect.md +29 -0
  67. package/agents/sales/outbound-strategist.md +29 -0
  68. package/agents/sales/pipeline-analyst.md +29 -0
  69. package/agents/support/cco.md +48 -0
  70. package/agents/support/community-manager.md +570 -0
  71. package/agents/support/ticket-triage.md +70 -0
  72. package/bin/soleur-opencode.js +29 -0
  73. package/commands/go.md +660 -0
  74. package/commands/help.md +273 -0
  75. package/commands/sync.md +977 -0
  76. package/commands/version.md +103 -0
  77. package/hooks/antigravity-hooks.json +84 -0
  78. package/hooks/antigravity-session-start.sh +15 -0
  79. package/hooks/bare-root-cwd-guard.sh +131 -0
  80. package/hooks/browser-snapshot-credential-guard.sh +200 -0
  81. package/hooks/codex-session-start.sh +9 -0
  82. package/hooks/compaction-state.sh +525 -0
  83. package/hooks/destructive-command-guard.sh +1387 -0
  84. package/hooks/devin-session-start.sh +90 -0
  85. package/hooks/ext-filter-detect.sh +171 -0
  86. package/hooks/hooks.json +133 -0
  87. package/hooks/lib/hook-tool-kind.sh +24 -0
  88. package/hooks/lib/log-rotation.sh +176 -0
  89. package/hooks/lib/shell-argv.pl +576 -0
  90. package/hooks/memory-backstop.sh +1114 -0
  91. package/hooks/operator-stage-approval.sh +391 -0
  92. package/hooks/stop-hook.sh +367 -0
  93. package/hooks/unkept-promise-hook.sh +383 -0
  94. package/hooks/version-banner.sh +127 -0
  95. package/hooks/welcome-hook.sh +50 -0
  96. package/install.js +29 -0
  97. package/lib/agent-registry.ts +154 -0
  98. package/lib/c4-canonical-cli.mjs +34 -0
  99. package/lib/c4-canonical.mjs +46 -0
  100. package/lib/c4-from-components.ts +554 -0
  101. package/lib/go-routing.ts +81 -0
  102. package/lib/grok-inspect-contract.ts +311 -0
  103. package/lib/harness-model-map.ts +101 -0
  104. package/lib/harness-parity.ts +726 -0
  105. package/lib/harness-tool-map.ts +180 -0
  106. package/lib/harness.ts +716 -0
  107. package/lib/heartbeat-live-reconcile.ts +1153 -0
  108. package/lib/heartbeat-manifest.ts +361 -0
  109. package/lib/kb-coverage.ts +252 -0
  110. package/lib/pr-merge-poll.ts +103 -0
  111. package/lib/workflow-fidelity.ts +388 -0
  112. package/opencode/INSTRUCTIONS.md +171 -0
  113. package/opencode/agents/engineering/cto.md +10 -0
  114. package/opencode/agents/engineering/design/ddd-architect.md +10 -0
  115. package/opencode/agents/engineering/discovery/agent-finder.md +10 -0
  116. package/opencode/agents/engineering/discovery/functional-discovery.md +10 -0
  117. package/opencode/agents/engineering/infra/infra-security.md +10 -0
  118. package/opencode/agents/engineering/infra/platform-strategist.md +10 -0
  119. package/opencode/agents/engineering/infra/terraform-architect.md +10 -0
  120. package/opencode/agents/engineering/prompt-engineer.md +10 -0
  121. package/opencode/agents/engineering/research/best-practices-researcher.md +10 -0
  122. package/opencode/agents/engineering/research/framework-docs-researcher.md +10 -0
  123. package/opencode/agents/engineering/research/git-history-analyzer.md +10 -0
  124. package/opencode/agents/engineering/research/learnings-researcher.md +10 -0
  125. package/opencode/agents/engineering/research/repo-research-analyst.md +10 -0
  126. package/opencode/agents/engineering/review/agent-native-reviewer.md +10 -0
  127. package/opencode/agents/engineering/review/architecture-strategist.md +10 -0
  128. package/opencode/agents/engineering/review/code-quality-analyst.md +10 -0
  129. package/opencode/agents/engineering/review/code-simplicity-reviewer.md +10 -0
  130. package/opencode/agents/engineering/review/data-integrity-guardian.md +10 -0
  131. package/opencode/agents/engineering/review/data-migration-expert.md +10 -0
  132. package/opencode/agents/engineering/review/deployment-verification-agent.md +10 -0
  133. package/opencode/agents/engineering/review/dhh-rails-reviewer.md +10 -0
  134. package/opencode/agents/engineering/review/kieran-rails-reviewer.md +10 -0
  135. package/opencode/agents/engineering/review/legacy-code-expert.md +10 -0
  136. package/opencode/agents/engineering/review/observability-coverage-reviewer.md +10 -0
  137. package/opencode/agents/engineering/review/pattern-recognition-specialist.md +10 -0
  138. package/opencode/agents/engineering/review/performance-oracle.md +10 -0
  139. package/opencode/agents/engineering/review/security-sentinel.md +10 -0
  140. package/opencode/agents/engineering/review/semgrep-sast.md +10 -0
  141. package/opencode/agents/engineering/review/test-design-reviewer.md +10 -0
  142. package/opencode/agents/engineering/review/user-impact-reviewer.md +10 -0
  143. package/opencode/agents/engineering/workflow/pr-comment-resolver.md +10 -0
  144. package/opencode/agents/finance/budget-analyst.md +10 -0
  145. package/opencode/agents/finance/cfo.md +10 -0
  146. package/opencode/agents/finance/financial-reporter.md +10 -0
  147. package/opencode/agents/finance/revenue-analyst.md +10 -0
  148. package/opencode/agents/legal/clo.md +10 -0
  149. package/opencode/agents/legal/legal-compliance-auditor.md +10 -0
  150. package/opencode/agents/legal/legal-document-generator.md +10 -0
  151. package/opencode/agents/marketing/analytics-analyst.md +10 -0
  152. package/opencode/agents/marketing/brand-architect.md +10 -0
  153. package/opencode/agents/marketing/cmo.md +10 -0
  154. package/opencode/agents/marketing/conversion-optimizer.md +10 -0
  155. package/opencode/agents/marketing/copywriter.md +10 -0
  156. package/opencode/agents/marketing/fact-checker.md +10 -0
  157. package/opencode/agents/marketing/growth-strategist.md +10 -0
  158. package/opencode/agents/marketing/paid-media-strategist.md +10 -0
  159. package/opencode/agents/marketing/pricing-strategist.md +10 -0
  160. package/opencode/agents/marketing/programmatic-seo-specialist.md +10 -0
  161. package/opencode/agents/marketing/retention-strategist.md +10 -0
  162. package/opencode/agents/marketing/seo-aeo-analyst.md +10 -0
  163. package/opencode/agents/operations/coo.md +10 -0
  164. package/opencode/agents/operations/ops-advisor.md +10 -0
  165. package/opencode/agents/operations/ops-provisioner.md +10 -0
  166. package/opencode/agents/operations/ops-research.md +10 -0
  167. package/opencode/agents/operations/service-automator.md +10 -0
  168. package/opencode/agents/product/business-validator.md +10 -0
  169. package/opencode/agents/product/competitive-intelligence.md +10 -0
  170. package/opencode/agents/product/cpo.md +10 -0
  171. package/opencode/agents/product/design/ux-design-lead.md +10 -0
  172. package/opencode/agents/product/spec-flow-analyzer.md +10 -0
  173. package/opencode/agents/sales/cro.md +10 -0
  174. package/opencode/agents/sales/deal-architect.md +10 -0
  175. package/opencode/agents/sales/outbound-strategist.md +10 -0
  176. package/opencode/agents/sales/pipeline-analyst.md +10 -0
  177. package/opencode/agents/support/cco.md +10 -0
  178. package/opencode/agents/support/community-manager.md +10 -0
  179. package/opencode/agents/support/ticket-triage.md +10 -0
  180. package/opencode/commands/go.md +10 -0
  181. package/opencode/commands/help.md +10 -0
  182. package/opencode/commands/sync.md +10 -0
  183. package/opencode/commands/version.md +11 -0
  184. package/opencode/opencode.json +8 -0
  185. package/opencode/plugin.ts +818 -0
  186. package/package.json +36 -4
  187. package/scripts/admin-merge-ready.sh +545 -0
  188. package/scripts/admin-merge-ready.test.sh +753 -0
  189. package/scripts/affected-tests.sh +908 -0
  190. package/scripts/affected-tests.test.sh +1797 -0
  191. package/scripts/alpha-metrics.sh +78 -0
  192. package/scripts/alpha-metrics.test.sh +115 -0
  193. package/scripts/ancestor-signal-helpers.baseline.txt +16 -0
  194. package/scripts/audit-flag-flip.sh +107 -0
  195. package/scripts/check-red-on-main.sh +316 -0
  196. package/scripts/ci-head-verdict.sh +411 -0
  197. package/scripts/cloud-detect.sh +193 -0
  198. package/scripts/delegation-verify.sh +657 -0
  199. package/scripts/delegation-verify.test.sh +1424 -0
  200. package/scripts/deploy-arm.sh +475 -0
  201. package/scripts/domain-model-drift.sh +419 -0
  202. package/scripts/emit-decision.sh +144 -0
  203. package/scripts/emit-decision.test.sh +144 -0
  204. package/scripts/ext-filter-divergence-corpus.txt +15 -0
  205. package/scripts/ext-filter-divergence.sh +189 -0
  206. package/scripts/generate-c4-from-components.ts +442 -0
  207. package/scripts/grok-fidelity-gate.sh +68 -0
  208. package/scripts/grok-pre-push-gate.sh +232 -0
  209. package/scripts/harness-discovery-smoke.ts +906 -0
  210. package/scripts/harness-parity-census.ts +92 -0
  211. package/scripts/inngest-luks-alert-armed-probe.ts +29 -0
  212. package/scripts/install-opencode-adapter.ts +509 -0
  213. package/scripts/lib/affected-tests/common.sh +365 -0
  214. package/scripts/lib/affected-tests/go.sh +157 -0
  215. package/scripts/lib/affected-tests/js.sh +188 -0
  216. package/scripts/lib/affected-tests/nx-turbo.sh +98 -0
  217. package/scripts/lib/affected-tests/python.sh +185 -0
  218. package/scripts/lib/context-sanitize.sh +49 -0
  219. package/scripts/lib/domain-model-lib.sh +180 -0
  220. package/scripts/lib/ext-filter-grammar.tsv +34 -0
  221. package/scripts/lib/operator-script.sh +1236 -0
  222. package/scripts/lib/proc.sh +580 -0
  223. package/scripts/lib/session-state.sh +748 -0
  224. package/scripts/lib/tmp-classify.sh +843 -0
  225. package/scripts/lib/wrapper-boundary.sh +47 -0
  226. package/scripts/lint-ratchet.py +1547 -0
  227. package/scripts/monitor-pr-checks.sh +441 -0
  228. package/scripts/pipeline-tally.sh +756 -0
  229. package/scripts/pipeline-tally.test.sh +740 -0
  230. package/scripts/plugin-version.sh +528 -0
  231. package/scripts/precommit-guard.sh +115 -0
  232. package/scripts/precommit-guard.test.sh +254 -0
  233. package/scripts/reconcile-live-heartbeats.ts +705 -0
  234. package/scripts/render-c4-model.sh +217 -0
  235. package/scripts/resolve-git-root.sh +55 -0
  236. package/scripts/resolve-regenerable-conflicts.sh +363 -0
  237. package/scripts/resolve-regenerable-conflicts.test.sh +780 -0
  238. package/scripts/ruff-requirements.txt +22 -0
  239. package/scripts/run-in-pid-namespace.sh +98 -0
  240. package/scripts/run-in-pid-namespace.test.sh +290 -0
  241. package/scripts/scan-ancestor-signal-helpers.py +556 -0
  242. package/scripts/scan-ancestor-signal-helpers.test.sh +670 -0
  243. package/scripts/setup-ralph-loop.sh +238 -0
  244. package/scripts/sync-cursor-name-map.ts +316 -0
  245. package/scripts/sync-grok-agent-compat.ts +188 -0
  246. package/scripts/sync-npm-package.ts +165 -0
  247. package/scripts/sync-opencode-adapter.ts +498 -0
  248. package/scripts/sync-pr-behind.sh +647 -0
  249. package/scripts/sync-pr-behind.test.sh +252 -0
  250. package/scripts/taste-profile-update.sh +180 -0
  251. package/scripts/taste-profile-update.test.sh +167 -0
  252. package/scripts/write-budget-marker.sh +23 -0
  253. package/scripts/write-kb-coverage.ts +113 -0
  254. package/skills/admin-ip-refresh/SKILL.md +81 -0
  255. package/skills/admin-ip-refresh/references/admin-ip-refresh-procedure.md +201 -0
  256. package/skills/agent-browser/SKILL.md +698 -0
  257. package/skills/agent-browser/scripts/playwright-mcp-profile-slot.sh +304 -0
  258. package/skills/agent-browser/scripts/playwright-mcp-redact-proxy.py +964 -0
  259. package/skills/agent-browser/scripts/redact-a11y-snapshot.py +443 -0
  260. package/skills/agent-browser/test/fixtures/capture-playwright-mcp-fixtures.py +217 -0
  261. package/skills/agent-browser/test/fixtures/fake-passthrough-proxy.py +24 -0
  262. package/skills/agent-browser/test/fixtures/fake-playwright-mcp.py +131 -0
  263. package/skills/agent-browser/test/fixtures/make-proxy-mutant.py +48 -0
  264. package/skills/agent-browser/test/fixtures/odd-shapes/dialog-link-injection.json +10 -0
  265. package/skills/agent-browser/test/fixtures/odd-shapes/empty-content.json +5 -0
  266. package/skills/agent-browser/test/fixtures/odd-shapes/error-and-result.json +4 -0
  267. package/skills/agent-browser/test/fixtures/odd-shapes/error-code-bool.json +6 -0
  268. package/skills/agent-browser/test/fixtures/odd-shapes/error-code-string.json +6 -0
  269. package/skills/agent-browser/test/fixtures/odd-shapes/error-message-tree.json +6 -0
  270. package/skills/agent-browser/test/fixtures/odd-shapes/error-no-data.json +6 -0
  271. package/skills/agent-browser/test/fixtures/odd-shapes/error-string.json +4 -0
  272. package/skills/agent-browser/test/fixtures/odd-shapes/error-with-data.json +9 -0
  273. package/skills/agent-browser/test/fixtures/odd-shapes/evaluate-escaped-object.json +10 -0
  274. package/skills/agent-browser/test/fixtures/odd-shapes/invalid-utf8.json +4 -0
  275. package/skills/agent-browser/test/fixtures/odd-shapes/link-result.json +10 -0
  276. package/skills/agent-browser/test/fixtures/odd-shapes/list-two-results.json +6 -0
  277. package/skills/agent-browser/test/fixtures/odd-shapes/meta-in-result.json +13 -0
  278. package/skills/agent-browser/test/fixtures/odd-shapes/no-content.json +5 -0
  279. package/skills/agent-browser/test/fixtures/odd-shapes/quoted-key.json +10 -0
  280. package/skills/agent-browser/test/fixtures/odd-shapes/resource-block.json +18 -0
  281. package/skills/agent-browser/test/fixtures/odd-shapes/result-and-method.json +11 -0
  282. package/skills/agent-browser/test/fixtures/odd-shapes/result-string.json +3 -0
  283. package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped-one-row.json +10 -0
  284. package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped.json +10 -0
  285. package/skills/agent-browser/test/fixtures/odd-shapes/structured-content.json +13 -0
  286. package/skills/agent-browser/test/fixtures/odd-shapes/tools-list-no-tools.json +5 -0
  287. package/skills/agent-browser/test/fixtures/odd-shapes/tree-no-credential.json +10 -0
  288. package/skills/agent-browser/test/fixtures/odd-shapes/two-text-blocks.json +14 -0
  289. package/skills/agent-browser/test/fixtures/odd-shapes/unparsable-line.json +3 -0
  290. package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-brace.json +10 -0
  291. package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-link-substring.json +10 -0
  292. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/close.json +12 -0
  293. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/evaluate.json +12 -0
  294. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/find.json +12 -0
  295. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/framing.json +6 -0
  296. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/initialize.json +14 -0
  297. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate-link.json +12 -0
  298. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate.json +12 -0
  299. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/roots-list-request.json +5 -0
  300. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/screenshot.json +17 -0
  301. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-filename.json +12 -0
  302. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-json.json +12 -0
  303. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-raw.json +12 -0
  304. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot.json +12 -0
  305. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/tools-list.json +827 -0
  306. package/skills/agent-browser/test/fixtures/proxy-session-driver.py +138 -0
  307. package/skills/agent-browser/test/fixtures/session-facts.py +102 -0
  308. package/skills/agent-browser/test/playwright-mcp-lifetime.test.sh +1620 -0
  309. package/skills/agent-browser/test/playwright-mcp-redact-proxy.test.sh +1599 -0
  310. package/skills/agent-browser/test/redact-a11y-snapshot.test.sh +527 -0
  311. package/skills/agent-native-architecture/SKILL.md +479 -0
  312. package/skills/agent-native-architecture/references/action-parity-discipline.md +430 -0
  313. package/skills/agent-native-architecture/references/agent-execution-patterns.md +483 -0
  314. package/skills/agent-native-architecture/references/agent-native-testing.md +605 -0
  315. package/skills/agent-native-architecture/references/architecture-patterns.md +493 -0
  316. package/skills/agent-native-architecture/references/dynamic-context-injection.md +358 -0
  317. package/skills/agent-native-architecture/references/files-universal-interface.md +314 -0
  318. package/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +381 -0
  319. package/skills/agent-native-architecture/references/mcp-tool-design.md +524 -0
  320. package/skills/agent-native-architecture/references/mobile-patterns.md +897 -0
  321. package/skills/agent-native-architecture/references/product-implications.md +478 -0
  322. package/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +342 -0
  323. package/skills/agent-native-architecture/references/self-modification.md +294 -0
  324. package/skills/agent-native-architecture/references/shared-workspace-architecture.md +700 -0
  325. package/skills/agent-native-architecture/references/system-prompt-design.md +263 -0
  326. package/skills/agent-native-audit/SKILL.md +300 -0
  327. package/skills/agent-native-audit/workflows/agent-native-audit.workflow.js +423 -0
  328. package/skills/andrew-kane-gem-writer/SKILL.md +189 -0
  329. package/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
  330. package/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
  331. package/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
  332. package/skills/andrew-kane-gem-writer/references/resources.md +126 -0
  333. package/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
  334. package/skills/architecture/SKILL.md +436 -0
  335. package/skills/architecture/references/adr-template.md +154 -0
  336. package/skills/architecture/references/likec4-reference.md +136 -0
  337. package/skills/architecture/references/nfr-reference.md +126 -0
  338. package/skills/archive-kb/SKILL.md +86 -0
  339. package/skills/archive-kb/scripts/archive-kb.sh +300 -0
  340. package/skills/archive-kb/test/archive-kb-partial-run.test.sh +276 -0
  341. package/skills/atdd-developer/SKILL.md +65 -0
  342. package/skills/brainstorm/SKILL.md +701 -0
  343. package/skills/brainstorm/references/brainstorm-brand-workshop.md +153 -0
  344. package/skills/brainstorm/references/brainstorm-domain-config.md +63 -0
  345. package/skills/brainstorm/references/brainstorm-validation-workshop.md +65 -0
  346. package/skills/brainstorm/references/ui-surface-terms.md +42 -0
  347. package/skills/brainstorm-techniques/SKILL.md +231 -0
  348. package/skills/brainstorm-techniques/references/decision-principles.md +150 -0
  349. package/skills/brainstorm-techniques/references/phase-boundaries.md +103 -0
  350. package/skills/brainstorm-techniques/references/standing-delegation.md +407 -0
  351. package/skills/brainstorm-techniques/references/technical-ruling-delegation.md +174 -0
  352. package/skills/campaign-calendar/SKILL.md +145 -0
  353. package/skills/cf-token-scope/SKILL.md +164 -0
  354. package/skills/cf-token-scope/references/widen-playbook.md +114 -0
  355. package/skills/cf-token-scope/scripts/cf-token-scope.sh +253 -0
  356. package/skills/changelog/SKILL.md +142 -0
  357. package/skills/code-to-prd/SKILL.md +66 -0
  358. package/skills/code-to-prd/references/banner-template.md +12 -0
  359. package/skills/code-to-prd/references/prd-template.md +41 -0
  360. package/skills/code-to-prd/scripts/code-to-prd.sh +634 -0
  361. package/skills/code-to-prd/test/code-to-prd.test.sh +447 -0
  362. package/skills/code-to-prd/test/fixture/.env.example +7 -0
  363. package/skills/code-to-prd/test/fixture/app/about/page.tsx +11 -0
  364. package/skills/code-to-prd/test/fixture/app/api/health/route.ts +10 -0
  365. package/skills/code-to-prd/test/fixture/app/page.tsx +14 -0
  366. package/skills/code-to-prd/test/fixture/next.config.mjs +3 -0
  367. package/skills/code-to-prd/test/fixture/package.json +6 -0
  368. package/skills/cohort-status/SKILL.md +62 -0
  369. package/skills/community/SKILL.md +210 -0
  370. package/skills/community/scripts/bsky-community.sh +644 -0
  371. package/skills/community/scripts/bsky-setup.sh +631 -0
  372. package/skills/community/scripts/community-router.sh +93 -0
  373. package/skills/community/scripts/discord-community.sh +487 -0
  374. package/skills/community/scripts/discord-setup.sh +784 -0
  375. package/skills/community/scripts/github-community.sh +706 -0
  376. package/skills/community/scripts/hn-community.sh +233 -0
  377. package/skills/community/scripts/lib/hmac-sha1-b64.sh +126 -0
  378. package/skills/community/scripts/linkedin-community.sh +750 -0
  379. package/skills/community/scripts/linkedin-setup.sh +758 -0
  380. package/skills/community/scripts/x-community.sh +890 -0
  381. package/skills/community/scripts/x-setup.sh +713 -0
  382. package/skills/community/test/community-argv.test.sh +2922 -0
  383. package/skills/community/test/github-community.test.sh +981 -0
  384. package/skills/competitive-analysis/SKILL.md +69 -0
  385. package/skills/competitive-analysis/references/peer-plugin-audit.md +218 -0
  386. package/skills/compound/SKILL.md +673 -0
  387. package/skills/compound/scripts/token-efficiency-report.sh +334 -0
  388. package/skills/compound/test/phase-16.test.sh +379 -0
  389. package/skills/compound-capture/SKILL.md +791 -0
  390. package/skills/compound-capture/assets/critical-pattern-template.md +37 -0
  391. package/skills/compound-capture/assets/resolution-template.md +116 -0
  392. package/skills/compound-capture/references/yaml-schema.md +67 -0
  393. package/skills/compound-capture/schema.yaml +181 -0
  394. package/skills/constraint-scaffold/SKILL.md +175 -0
  395. package/skills/constraint-scaffold/references/boundary-readme.template +35 -0
  396. package/skills/constraint-scaffold/references/constraint-gates-workflow.template +69 -0
  397. package/skills/constraint-scaffold/references/depcruise-config.template +230 -0
  398. package/skills/constraint-scaffold/references/fix-constraints-stage-a.template +240 -0
  399. package/skills/constraint-scaffold/references/fix-constraints-stage-b.template +313 -0
  400. package/skills/constraint-scaffold/references/shared-runner.template +135 -0
  401. package/skills/constraint-scaffold/scripts/constraint-scaffold.sh +589 -0
  402. package/skills/constraint-scaffold/test/bite-proof.test.sh +1338 -0
  403. package/skills/constraint-scaffold/test/boundary.test.sh +734 -0
  404. package/skills/constraint-scaffold/test/emit-fix-constraints.test.sh +193 -0
  405. package/skills/constraint-scaffold/test/generator.test.sh +93 -0
  406. package/skills/constraint-scaffold/test/parity.test.sh +285 -0
  407. package/skills/content-writer/SKILL.md +242 -0
  408. package/skills/content-writer/scripts/blog-jargon-scan.sh +42 -0
  409. package/skills/cron-delete/SKILL.md +56 -0
  410. package/skills/cron-list/SKILL.md +54 -0
  411. package/skills/deepen-plan/SKILL.md +937 -0
  412. package/skills/deepen-plan/workflows/deepen-plan.workflow.js +488 -0
  413. package/skills/deploy/SKILL.md +115 -0
  414. package/skills/deploy/references/hetzner-setup.md +67 -0
  415. package/skills/deploy/scripts/deploy.sh +37 -0
  416. package/skills/deploy-docs/SKILL.md +95 -0
  417. package/skills/dhh-rails-style/SKILL.md +203 -0
  418. package/skills/dhh-rails-style/references/architecture.md +717 -0
  419. package/skills/dhh-rails-style/references/controllers.md +323 -0
  420. package/skills/dhh-rails-style/references/frontend.md +556 -0
  421. package/skills/dhh-rails-style/references/gems.md +316 -0
  422. package/skills/dhh-rails-style/references/models.md +388 -0
  423. package/skills/dhh-rails-style/references/testing.md +354 -0
  424. package/skills/discord-content/SKILL.md +126 -0
  425. package/skills/docs-site/SKILL.md +214 -0
  426. package/skills/drain-labeled-backlog/SKILL.md +203 -0
  427. package/skills/drain-labeled-backlog/scripts/group-by-area.sh +208 -0
  428. package/skills/drain-labeled-backlog/workflows/drain-labeled-backlog.workflow.js +433 -0
  429. package/skills/drain-prs/SKILL.md +143 -0
  430. package/skills/drain-prs/scripts/triage-prs.sh +192 -0
  431. package/skills/drain-prs/test/argv-ceiling.test.sh +183 -0
  432. package/skills/dspy-ruby/SKILL.md +634 -0
  433. package/skills/dspy-ruby/assets/config-template.rb +359 -0
  434. package/skills/dspy-ruby/assets/module-template.rb +326 -0
  435. package/skills/dspy-ruby/assets/signature-template.rb +143 -0
  436. package/skills/dspy-ruby/references/core-concepts.md +268 -0
  437. package/skills/dspy-ruby/references/optimization.md +623 -0
  438. package/skills/dspy-ruby/references/providers.md +335 -0
  439. package/skills/eval-harness/README.md +194 -0
  440. package/skills/eval-harness/SKILL.md +157 -0
  441. package/skills/eval-harness/enums/go-routes.json +13 -0
  442. package/skills/eval-harness/enums/incident-threshold.json +5 -0
  443. package/skills/eval-harness/enums/lane.json +5 -0
  444. package/skills/eval-harness/enums/tool-selection.json +20 -0
  445. package/skills/eval-harness/enums/triage-levels.json +5 -0
  446. package/skills/eval-harness/gated-skills.json +34 -0
  447. package/skills/eval-harness/models.generated.json +5 -0
  448. package/skills/eval-harness/promptfooconfig-go-routing.yaml +35 -0
  449. package/skills/eval-harness/promptfooconfig-incident-threshold.yaml +32 -0
  450. package/skills/eval-harness/promptfooconfig-lane-inference.yaml +33 -0
  451. package/skills/eval-harness/promptfooconfig-ticket-triage.yaml +34 -0
  452. package/skills/eval-harness/promptfooconfig-tool-selection.yaml +33 -0
  453. package/skills/eval-harness/prompts/go-baseline.txt +6 -0
  454. package/skills/eval-harness/prompts/go-skill.txt +21 -0
  455. package/skills/eval-harness/prompts/incident-threshold-baseline.txt +6 -0
  456. package/skills/eval-harness/prompts/incident-threshold-skill.txt +12 -0
  457. package/skills/eval-harness/prompts/lane-inference-baseline.txt +6 -0
  458. package/skills/eval-harness/prompts/lane-inference-skill.txt +15 -0
  459. package/skills/eval-harness/prompts/tool-selection-baseline.txt +19 -0
  460. package/skills/eval-harness/prompts/tool-selection-skill.txt +22 -0
  461. package/skills/eval-harness/prompts/triage-baseline.txt +7 -0
  462. package/skills/eval-harness/prompts/triage-skill.txt +10 -0
  463. package/skills/eval-harness/scripts/eval-gate.cjs +318 -0
  464. package/skills/eval-harness/scripts/extract-block.cjs +87 -0
  465. package/skills/eval-harness/scripts/gate-classification.cjs +28 -0
  466. package/skills/eval-harness/scripts/gen-models.sh +41 -0
  467. package/skills/eval-harness/scripts/gen-skill-prompt.cjs +177 -0
  468. package/skills/eval-harness/scripts/measure-classification.cjs +30 -0
  469. package/skills/eval-harness/scripts/parse-label.cjs +93 -0
  470. package/skills/eval-harness/scripts/verdict.cjs +132 -0
  471. package/skills/eval-harness/tasks/go-routing.jsonl +8 -0
  472. package/skills/eval-harness/tasks/incident-threshold.jsonl +7 -0
  473. package/skills/eval-harness/tasks/lane-inference.jsonl +7 -0
  474. package/skills/eval-harness/tasks/ticket-triage.jsonl +6 -0
  475. package/skills/eval-harness/tasks/tool-selection.jsonl +15 -0
  476. package/skills/eval-harness/test/eval-gate.test.sh +132 -0
  477. package/skills/eval-harness/test/extract-block.test.sh +87 -0
  478. package/skills/eval-harness/test/gate-classification.test.sh +77 -0
  479. package/skills/eval-harness/test/gen-models.test.sh +75 -0
  480. package/skills/eval-harness/test/measure-classification.test.sh +74 -0
  481. package/skills/eval-harness/test/parse-label.test.sh +129 -0
  482. package/skills/eval-harness/test/registry-completeness.test.sh +109 -0
  483. package/skills/eval-harness/test/verdict.test.sh +123 -0
  484. package/skills/every-style-editor/SKILL.md +142 -0
  485. package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
  486. package/skills/feature-tweet/SKILL.md +199 -0
  487. package/skills/feature-video/SKILL.md +412 -0
  488. package/skills/feature-video/scripts/check_deps.sh +281 -0
  489. package/skills/file-todos/SKILL.md +267 -0
  490. package/skills/file-todos/assets/todo-template.md +166 -0
  491. package/skills/fix-issue/SKILL.md +278 -0
  492. package/skills/fix-issue/references/agent-authored-exclusion.md +120 -0
  493. package/skills/fix-issue/references/exclude-label-jq-snippet.md +97 -0
  494. package/skills/flag-bootstrap/SETUP.md +142 -0
  495. package/skills/flag-create/SKILL.md +145 -0
  496. package/skills/flag-create/scripts/create.sh +273 -0
  497. package/skills/flag-delete/SKILL.md +167 -0
  498. package/skills/flag-delete/scripts/delete.sh +288 -0
  499. package/skills/flag-list/SKILL.md +99 -0
  500. package/skills/flag-list/scripts/list.sh +275 -0
  501. package/skills/flag-set-role/SKILL.md +229 -0
  502. package/skills/flag-set-role/scripts/flip.sh +774 -0
  503. package/skills/frontend-anti-slop/SKILL.md +106 -0
  504. package/skills/frontend-anti-slop/references/anti-patterns.md +199 -0
  505. package/skills/frontend-anti-slop/references/slop-rules.md +65 -0
  506. package/skills/frontend-anti-slop/scripts/tier1-scan.ts +525 -0
  507. package/skills/frontend-design/SKILL.md +77 -0
  508. package/skills/gdpr-gate/NOTICE +136 -0
  509. package/skills/gdpr-gate/SKILL.md +341 -0
  510. package/skills/gdpr-gate/references/fields.md +160 -0
  511. package/skills/gdpr-gate/references/layers/api-layer.md +355 -0
  512. package/skills/gdpr-gate/references/layers/auth-sessions.md +290 -0
  513. package/skills/gdpr-gate/references/layers/data-in-transit.md +331 -0
  514. package/skills/gdpr-gate/references/layers/data-lifecycle.md +341 -0
  515. package/skills/gdpr-gate/references/layers/frontend.md +249 -0
  516. package/skills/gdpr-gate/references/layers/testing-seeding.md +256 -0
  517. package/skills/gdpr-gate/references/leakage-vectors.md +248 -0
  518. package/skills/gdpr-gate/references/legacy/legal-consent-v1-prose.md +48 -0
  519. package/skills/gdpr-gate/references/legal-consent.md +140 -0
  520. package/skills/gdpr-gate/references/non-negotiables.md +60 -0
  521. package/skills/gdpr-gate/scripts/gdpr-gate.sh +271 -0
  522. package/skills/gdpr-gate/scripts/notice-frontmatter.sh +337 -0
  523. package/skills/gdpr-gate/scripts/path-denylist.txt +39 -0
  524. package/skills/gdpr-gate/scripts/repo-scan.sh +158 -0
  525. package/skills/gdpr-gate/scripts/vendor-drift-classify.sh +120 -0
  526. package/skills/gdpr-gate/scripts/vendor-pin-integrity.sh +237 -0
  527. package/skills/gemini-imagegen/SKILL.md +283 -0
  528. package/skills/gemini-imagegen/requirements.txt +5 -0
  529. package/skills/gemini-imagegen/scripts/_error_handling.py +146 -0
  530. package/skills/gemini-imagegen/scripts/compose_images.py +150 -0
  531. package/skills/gemini-imagegen/scripts/edit_image.py +137 -0
  532. package/skills/gemini-imagegen/scripts/gemini_images.py +256 -0
  533. package/skills/gemini-imagegen/scripts/generate_image.py +147 -0
  534. package/skills/gemini-imagegen/scripts/multi_turn_chat.py +223 -0
  535. package/skills/gemini-imagegen/scripts/test_error_handling.py +179 -0
  536. package/skills/git-worktree/SKILL.md +534 -0
  537. package/skills/git-worktree/scripts/git-repo-readiness-diag.sh +98 -0
  538. package/skills/git-worktree/scripts/worktree-manager.sh +4773 -0
  539. package/skills/git-worktree/test/create-from-origin-main.test.sh +116 -0
  540. package/skills/git-worktree/test/lease-protects-active.test.sh +1056 -0
  541. package/skills/git-worktree/test/no-repo-fail-loud.test.sh +88 -0
  542. package/skills/git-worktree/test/orphan-reaper-honest-count.test.sh +379 -0
  543. package/skills/git-worktree/test/reap-archive-persistence.test.sh +725 -0
  544. package/skills/git-worktree/test/stale-lock-sweep.test.sh +176 -0
  545. package/skills/go/SKILL.md +54 -0
  546. package/skills/growth/SKILL.md +164 -0
  547. package/skills/harvest-debt/SKILL.md +78 -0
  548. package/skills/harvest-debt/scripts/harvest-debt.sh +114 -0
  549. package/skills/heal-skill/SKILL.md +173 -0
  550. package/skills/help/SKILL.md +46 -0
  551. package/skills/incident/NOTICE +39 -0
  552. package/skills/incident/SKILL.md +395 -0
  553. package/skills/incident/scripts/dry-run.sh +448 -0
  554. package/skills/incident/scripts/redact-engine.py +412 -0
  555. package/skills/incident/scripts/redact-sentinel.sh +44 -0
  556. package/skills/incident/templates/pir.md +139 -0
  557. package/skills/incident/test/fixtures/dry-run-incident.json +26 -0
  558. package/skills/incident/test/fixtures/dry-run-secret-leak.json +26 -0
  559. package/skills/incident/test/fixtures/legacy-bash-scanner.sh +82 -0
  560. package/skills/incident/test/fixtures/positive-corpus.md +87 -0
  561. package/skills/incident/test/redact-sentinel.test.sh +1420 -0
  562. package/skills/invoice/SKILL.md +206 -0
  563. package/skills/kb-glossary/SKILL.md +71 -0
  564. package/skills/kb-glossary/references/glossary-format.md +111 -0
  565. package/skills/kb-glossary/references/rejected-request-register.md +115 -0
  566. package/skills/kb-search/SKILL.md +276 -0
  567. package/skills/kb-search/scripts/kb-search-cache.sh +123 -0
  568. package/skills/legal-audit/SKILL.md +161 -0
  569. package/skills/legal-generate/NOTICE +242 -0
  570. package/skills/legal-generate/SKILL.md +244 -0
  571. package/skills/legal-generate/references/templates/advisor-agreement/template.md +12 -0
  572. package/skills/legal-generate/references/templates/business-associate-agreement/template.md +112 -0
  573. package/skills/legal-generate/references/templates/cookie-notice/template.md +82 -0
  574. package/skills/legal-generate/references/templates/dpa-global/template.md +439 -0
  575. package/skills/legal-generate/references/templates/dpa-us/template.md +222 -0
  576. package/skills/legal-generate/references/templates/employee-offer-letter/template.md +75 -0
  577. package/skills/legal-generate/references/templates/master-services-agreement/template.md +252 -0
  578. package/skills/legal-generate/references/templates/mutual-nda/template.md +66 -0
  579. package/skills/legal-generate/references/templates/one-way-nda/template.md +38 -0
  580. package/skills/legal-generate/references/templates/privacy-policy-gdpr/template.md +427 -0
  581. package/skills/legal-generate/references/templates/privacy-policy-us/template.md +313 -0
  582. package/skills/legal-generate/references/templates/terms-of-use/template.md +75 -0
  583. package/skills/legal-generate/scripts/strip-vendor-credit.sh +96 -0
  584. package/skills/linear-fetch/SKILL.md +247 -0
  585. package/skills/linear-fetch/scripts/assert-no-linear-telemetry.sh +66 -0
  586. package/skills/linear-fetch/scripts/redact-linear-urls.sh +51 -0
  587. package/skills/linear-fetch/scripts/render-caller-template.sh +36 -0
  588. package/skills/linear-fetch/test/assert-no-linear-telemetry.test.sh +113 -0
  589. package/skills/linear-fetch/test/parity.test.sh +112 -0
  590. package/skills/linear-fetch/test/persist-safe-integration.test.sh +191 -0
  591. package/skills/linear-fetch/test/redact-linear-urls.test.sh +226 -0
  592. package/skills/merge-pr/SKILL.md +670 -0
  593. package/skills/model-launch-review/SKILL.md +255 -0
  594. package/skills/model-launch-review/scripts/audit-models.sh +501 -0
  595. package/skills/one-shot/SKILL.md +316 -0
  596. package/skills/one-shot/references/token-discipline.md +74 -0
  597. package/skills/operator-bootstrap/SKILL.md +412 -0
  598. package/skills/operator-bootstrap/template.sh +439 -0
  599. package/skills/operator-digest/SKILL.md +287 -0
  600. package/skills/operator-digest/assets/operator-digest.workflow.yml +175 -0
  601. package/skills/operator-digest/scripts/digest-scrub.sh +119 -0
  602. package/skills/operator-digest/scripts/provision-operator-digest-repo.sh +147 -0
  603. package/skills/operator-rephrase/SKILL.md +98 -0
  604. package/skills/pencil-setup/SKILL.md +201 -0
  605. package/skills/pencil-setup/scripts/check_deps.sh +556 -0
  606. package/skills/pencil-setup/scripts/copy_adapter.sh +80 -0
  607. package/skills/pencil-setup/scripts/package-lock.json +1172 -0
  608. package/skills/pencil-setup/scripts/package.json +14 -0
  609. package/skills/pencil-setup/scripts/pencil-error-enrichment.mjs +21 -0
  610. package/skills/pencil-setup/scripts/pencil-mcp-adapter.mjs +733 -0
  611. package/skills/pencil-setup/scripts/pencil-response-classify.mjs +38 -0
  612. package/skills/pencil-setup/scripts/pencil-save-gate.mjs +26 -0
  613. package/skills/pencil-setup/scripts/sanitize-filename.mjs +25 -0
  614. package/skills/plan/SKILL.md +1140 -0
  615. package/skills/plan/references/differential-migration-testing.md +185 -0
  616. package/skills/plan/references/plan-community-discovery.md +42 -0
  617. package/skills/plan/references/plan-founder-check.md +137 -0
  618. package/skills/plan/references/plan-functional-overlap.md +25 -0
  619. package/skills/plan/references/plan-host-fanout.md +51 -0
  620. package/skills/plan/references/plan-issue-templates.md +779 -0
  621. package/skills/plan/references/plan-network-outage-checklist.md +131 -0
  622. package/skills/plan/references/plan-scope-check.md +126 -0
  623. package/skills/plan/references/plan-sharp-edges.md +331 -0
  624. package/skills/plan/references/plan-signoff-lifecycle.md +12 -0
  625. package/skills/plan/references/webapp-cwv-observability.md +143 -0
  626. package/skills/plan-review/SKILL.md +91 -0
  627. package/skills/plan-review/lib/named-panel.mjs +58 -0
  628. package/skills/plan-review/workflows/plan-review.workflow.js +477 -0
  629. package/skills/postmerge/SKILL.md +642 -0
  630. package/skills/postmerge/references/deploy-status-debugging.md +141 -0
  631. package/skills/postmerge/references/graceful-degradation.md +20 -0
  632. package/skills/postmerge/references/sentry-error-count-delta.md +137 -0
  633. package/skills/preflight/SKILL.md +1553 -0
  634. package/skills/preflight/references/check-13-founder-check.md +286 -0
  635. package/skills/preflight/scripts/founder-check.py +1640 -0
  636. package/skills/preflight/scripts/parse-form-a.awk +107 -0
  637. package/skills/preflight/scripts/probe-verb-gate.sh +108 -0
  638. package/skills/product-roadmap/SKILL.md +357 -0
  639. package/skills/product-roadmap/scripts/roadmap-reconcile.sh +327 -0
  640. package/skills/provision-cloudflare/SKILL.md +67 -0
  641. package/skills/provision-cloudflare/scripts/provision-cloudflare.sh +271 -0
  642. package/skills/provision-doppler/SKILL.md +58 -0
  643. package/skills/provision-doppler/scripts/provision-doppler.sh +358 -0
  644. package/skills/provision-github/SKILL.md +59 -0
  645. package/skills/provision-github/scripts/provision-github.sh +300 -0
  646. package/skills/provision-hetzner/SKILL.md +76 -0
  647. package/skills/provision-hetzner/scripts/provision-hetzner.sh +262 -0
  648. package/skills/provision-hetzner/test/fixture/knowledge-base/legal/tenant-dpa-register.md +26 -0
  649. package/skills/provision-hetzner/test/fixture/provision-hetzner-dry-run.golden +34 -0
  650. package/skills/provision-hetzner/test/provision-hetzner-characterization.test.sh +227 -0
  651. package/skills/qa/SKILL.md +263 -0
  652. package/skills/qa/references/browser-preflight.md +22 -0
  653. package/skills/questionnaire-generate/SKILL.md +328 -0
  654. package/skills/questionnaire-generate/references/questionnaire.template +60 -0
  655. package/skills/rclone/SKILL.md +162 -0
  656. package/skills/rclone/scripts/check_setup.sh +63 -0
  657. package/skills/release-announce/SKILL.md +65 -0
  658. package/skills/release-docs/SKILL.md +92 -0
  659. package/skills/reproduce-bug/SKILL.md +358 -0
  660. package/skills/resolve-debt/SKILL.md +85 -0
  661. package/skills/resolve-debt/scripts/resolve-debt.py +584 -0
  662. package/skills/resolve-parallel/SKILL.md +45 -0
  663. package/skills/resolve-parallel/workflows/resolve-parallel.workflow.js +415 -0
  664. package/skills/resolve-pr-parallel/SKILL.md +68 -0
  665. package/skills/resolve-pr-parallel/workflows/resolve-pr-parallel.workflow.js +419 -0
  666. package/skills/resolve-todo-parallel/SKILL.md +57 -0
  667. package/skills/resolve-todo-parallel/workflows/resolve-todo-parallel.workflow.js +398 -0
  668. package/skills/review/SKILL.md +1620 -0
  669. package/skills/review/references/anti-slop-scanner-hook.md +40 -0
  670. package/skills/review/references/defect-classes-migrations.md +9 -0
  671. package/skills/review/references/generated-input-oracle-surfaces.md +15 -0
  672. package/skills/review/references/review-e2e-testing.md +116 -0
  673. package/skills/review/references/review-evidence-comment.md +36 -0
  674. package/skills/review/references/review-todo-structure.md +165 -0
  675. package/skills/review/references/risk-tier-and-fix-rounds.md +97 -0
  676. package/skills/review/references/semgrep-custom-rules.yaml +174 -0
  677. package/skills/review/references/ultrathink-phases.md +98 -0
  678. package/skills/review/references/wfs.md +6 -0
  679. package/skills/review/scripts/emit-review-trailer.sh +499 -0
  680. package/skills/review/scripts/ensure-semgrep.sh +99 -0
  681. package/skills/review/scripts/fix-round-seats.sh +197 -0
  682. package/skills/review/test/emit-review-trailer.test.sh +387 -0
  683. package/skills/review/test/ensure-semgrep.test.sh +111 -0
  684. package/skills/review/test/fix-round-seats.test.sh +237 -0
  685. package/skills/review/workflows/README.md +147 -0
  686. package/skills/review/workflows/review.workflow.js +667 -0
  687. package/skills/schedule/SKILL.md +796 -0
  688. package/skills/seo-aeo/SKILL.md +139 -0
  689. package/skills/seo-aeo/scripts/validate-csp.sh +233 -0
  690. package/skills/seo-aeo/scripts/validate-seo.sh +262 -0
  691. package/skills/ship/SKILL.md +3023 -0
  692. package/skills/ship/references/adr-ordinal-collision.md +47 -0
  693. package/skills/ship/references/affected-gate-contract.md +115 -0
  694. package/skills/ship/references/ci-run-diagnosis.md +29 -0
  695. package/skills/ship/references/ci-workflow-authoring.md +68 -0
  696. package/skills/ship/references/cleanup-merged-archival.md +39 -0
  697. package/skills/ship/references/counsel-review-clo-attestation.md +38 -0
  698. package/skills/ship/references/cto-ruling-armed-push.md +5 -0
  699. package/skills/ship/references/decision-challenges-render.md +71 -0
  700. package/skills/ship/references/delegated-act-authoring-form.md +7 -0
  701. package/skills/ship/references/detached-battery-verdict.md +13 -0
  702. package/skills/ship/references/epic-close-sweep.md +62 -0
  703. package/skills/ship/references/feature-tweet-draft.md +42 -0
  704. package/skills/ship/references/followthrough-issue-body-template.md +47 -0
  705. package/skills/ship/references/followthrough-stub-template.sh +92 -0
  706. package/skills/ship/references/merge-queue-dequeue.md +39 -0
  707. package/skills/ship/references/operator-holds.md +179 -0
  708. package/skills/ship/references/pipeline-tally-render.md +43 -0
  709. package/skills/ship/references/pr-overlap.md +153 -0
  710. package/skills/ship/references/queue-mode.md +7 -0
  711. package/skills/ship/references/ready-run-wait.md +36 -0
  712. package/skills/ship/references/red-on-main-quarantine.md +110 -0
  713. package/skills/ship/references/register-update-pr-pattern.md +88 -0
  714. package/skills/ship/references/settle-then-admin-merge.md +130 -0
  715. package/skills/ship/references/supabase-column-probe.md +13 -0
  716. package/skills/ship/scripts/auto-close-scan.sh +76 -0
  717. package/skills/ship/scripts/battery-owed.sh +403 -0
  718. package/skills/ship/scripts/hold-gate-eval.sh +410 -0
  719. package/skills/ship/scripts/net-issue-flow.sh +665 -0
  720. package/skills/ship/scripts/pr-overlap-preflight.sh +483 -0
  721. package/skills/ship/scripts/ship-pir-action-items-gate.sh +246 -0
  722. package/skills/ship/scripts/technical-ruling-gate.sh +444 -0
  723. package/skills/skill-creator/SKILL.md +299 -0
  724. package/skills/skill-creator/references/api-security.md +248 -0
  725. package/skills/skill-creator/references/authoring-levers.md +110 -0
  726. package/skills/skill-creator/references/be-clear-and-direct.md +587 -0
  727. package/skills/skill-creator/references/best-practices.md +431 -0
  728. package/skills/skill-creator/references/common-patterns.md +639 -0
  729. package/skills/skill-creator/references/core-principles.md +193 -0
  730. package/skills/skill-creator/references/executable-code.md +188 -0
  731. package/skills/skill-creator/references/iteration-and-testing.md +509 -0
  732. package/skills/skill-creator/references/official-spec.md +193 -0
  733. package/skills/skill-creator/references/recommended-structure.md +180 -0
  734. package/skills/skill-creator/references/skill-structure.md +396 -0
  735. package/skills/skill-creator/references/using-scripts.md +122 -0
  736. package/skills/skill-creator/references/using-templates.md +120 -0
  737. package/skills/skill-creator/references/workflows-and-validation.md +541 -0
  738. package/skills/skill-creator/scripts/init_skill.py +322 -0
  739. package/skills/skill-creator/scripts/package_skill.py +110 -0
  740. package/skills/skill-creator/scripts/quick_validate.py +64 -0
  741. package/skills/skill-creator/templates/router-skill.md +73 -0
  742. package/skills/skill-creator/templates/simple-skill.md +34 -0
  743. package/skills/skill-creator/workflows/add-reference.md +96 -0
  744. package/skills/skill-creator/workflows/add-script.md +104 -0
  745. package/skills/skill-creator/workflows/add-template.md +83 -0
  746. package/skills/skill-creator/workflows/add-workflow.md +128 -0
  747. package/skills/skill-creator/workflows/audit-skill.md +159 -0
  748. package/skills/skill-creator/workflows/create-domain-expertise-skill.md +623 -0
  749. package/skills/skill-creator/workflows/create-new-skill.md +207 -0
  750. package/skills/skill-creator/workflows/get-guidance.md +134 -0
  751. package/skills/skill-creator/workflows/upgrade-to-router.md +170 -0
  752. package/skills/skill-creator/workflows/verify-skill.md +226 -0
  753. package/skills/skill-security-scan/SKILL.md +145 -0
  754. package/skills/skill-security-scan/references/disclaimer.md +21 -0
  755. package/skills/skill-security-scan/references/first-party-allowlist.yaml +38 -0
  756. package/skills/skill-security-scan/references/override-artifact-schema.json +68 -0
  757. package/skills/skill-security-scan/references/override-mechanism.md +171 -0
  758. package/skills/skill-security-scan/references/redirect-domains.yaml +27 -0
  759. package/skills/skill-security-scan/references/regex-patterns.md +136 -0
  760. package/skills/skill-security-scan/references/rules/code-exec.yaml +70 -0
  761. package/skills/skill-security-scan/references/rules/filesystem-boundary.yaml +29 -0
  762. package/skills/skill-security-scan/references/rules/manifest.yaml +44 -0
  763. package/skills/skill-security-scan/references/rules/supply-chain.yaml +36 -0
  764. package/skills/skill-security-scan/references/scan-meta-schema.json +63 -0
  765. package/skills/skill-security-scan/references/test-fixtures/clean-soleur-style.skill.md +23 -0
  766. package/skills/skill-security-scan/references/test-fixtures/clean-third-party.skill.md +26 -0
  767. package/skills/skill-security-scan/references/test-fixtures/malicious-codeexec.skill.md +23 -0
  768. package/skills/skill-security-scan/references/test-fixtures/malicious-curl-pipe-bash.skill.md +69 -0
  769. package/skills/skill-security-scan/references/test-fixtures/malicious-prompt-injection.skill.md +17 -0
  770. package/skills/skill-security-scan/references/test-fixtures/malicious-telemetry-beacon.skill.md +23 -0
  771. package/skills/skill-security-scan/references/typosquat-targets.yaml +65 -0
  772. package/skills/skill-security-scan/scripts/check-codeexec.sh +41 -0
  773. package/skills/skill-security-scan/scripts/check-filesystem-boundary.sh +19 -0
  774. package/skills/skill-security-scan/scripts/check-prompt-injection.sh +95 -0
  775. package/skills/skill-security-scan/scripts/check-supply-chain.sh +219 -0
  776. package/skills/skill-security-scan/scripts/check-telemetry-surface.sh +126 -0
  777. package/skills/skill-security-scan/scripts/lib.sh +197 -0
  778. package/skills/skill-security-scan/scripts/parse-override.sh +231 -0
  779. package/skills/skill-security-scan/scripts/run-scan.sh +342 -0
  780. package/skills/skill-security-scan/scripts/run-self-test.sh +95 -0
  781. package/skills/skill-security-scan/test/argv-ceiling.test.sh +180 -0
  782. package/skills/skill-security-scan/test/meta-dir-reap.test.sh +411 -0
  783. package/skills/skill-security-scan/test/parse-override.test.sh +607 -0
  784. package/skills/skill-security-scan/test/redact-pii-ghs-shape.test.sh +251 -0
  785. package/skills/social-distribute/SKILL.md +485 -0
  786. package/skills/spec-templates/SKILL.md +274 -0
  787. package/skills/sync/SKILL.md +49 -0
  788. package/skills/test-browser/SKILL.md +464 -0
  789. package/skills/test-browser/references/feature-map.md +161 -0
  790. package/skills/test-fix-loop/SKILL.md +159 -0
  791. package/skills/test-fix-loop/references/determinism-checklist.md +154 -0
  792. package/skills/triage/SKILL.md +402 -0
  793. package/skills/trigger-cron/SKILL.md +136 -0
  794. package/skills/trigger-cron/scripts/trigger.sh +198 -0
  795. package/skills/user-set-role/SKILL.md +147 -0
  796. package/skills/user-set-role/scripts/set-role.sh +218 -0
  797. package/skills/user-story-writer/SKILL.md +77 -0
  798. package/skills/ux-audit/SKILL.md +251 -0
  799. package/skills/ux-audit/references/finding.schema.json +62 -0
  800. package/skills/ux-audit/references/route-list.yaml +95 -0
  801. package/skills/ux-audit/scripts/bot-fixture.ts +270 -0
  802. package/skills/ux-audit/scripts/bot-signin.ts +135 -0
  803. package/skills/ux-audit/scripts/dedup-hash.ts +46 -0
  804. package/skills/verification-scaffold/SKILL.md +73 -0
  805. package/skills/verification-scaffold/references/gitleaks.toml.template +13 -0
  806. package/skills/verification-scaffold/references/guardrail-audit.md +156 -0
  807. package/skills/verification-scaffold/references/guards/block-stash-hook.sh.template +72 -0
  808. package/skills/verification-scaffold/references/guards/commit-on-main-hook.sh.template +82 -0
  809. package/skills/verification-scaffold/references/guards/orphan-test-check.sh.template +102 -0
  810. package/skills/verification-scaffold/references/guards/precommit-guard.sh.template +115 -0
  811. package/skills/verification-scaffold/references/guards/secret-scan-hook.sh.template +176 -0
  812. package/skills/verification-scaffold/references/guards/verification-gates.yml.template +49 -0
  813. package/skills/verification-scaffold/references/guards/wrapper-boundary.sh.template +47 -0
  814. package/skills/verification-scaffold/references/guards.tsv +21 -0
  815. package/skills/verification-scaffold/references/verification-readme.template +55 -0
  816. package/skills/verification-scaffold/scripts/verification-scaffold.sh +785 -0
  817. package/skills/verification-scaffold/test/bite-proof.test.sh +159 -0
  818. package/skills/verification-scaffold/test/generator.test.sh +319 -0
  819. package/skills/verification-scaffold/test/manifest.test.sh +144 -0
  820. package/skills/work/SKILL.md +1480 -0
  821. package/skills/work/references/end-of-work-resume.md +7 -0
  822. package/skills/work/references/hook-test-main-cwd.md +24 -0
  823. package/skills/work/references/key-principles.md +83 -0
  824. package/skills/work/references/property-testing.md +122 -0
  825. package/skills/work/references/sql-security-definer-rpc-scaffold.sql +78 -0
  826. package/skills/work/references/work-agent-teams.md +97 -0
  827. package/skills/work/references/work-lifecycle-parallel.md +147 -0
  828. package/skills/work/references/work-lockfile-bumps.md +97 -0
  829. package/skills/work/references/work-scratch-sandboxes.md +212 -0
  830. package/skills/work/references/work-subagent-fanout.md +61 -0
  831. package/skills/work/references/work-test-harness-sharp-edges.md +73 -0
  832. package/skills/xcode-test/SKILL.md +360 -0
@@ -0,0 +1,698 @@
1
+ ---
2
+ name: agent-browser
3
+ description: "This skill should be used when automating browser interactions via Vercel's agent-browser CLI. It handles web page navigation, form filling, screenshots, and data scraping using ref-based element selection."
4
+ ---
5
+
6
+ <!-- grok-harness-invoke:start -->
7
+ **Grok Build (`plugins/soleur/lib/harness.ts` `invokeSkill()`):** Read this SKILL.md in this process and run it to completion. A one-segment `soleur:<name>` in this document names a SKILL — on Grok Build, Read `plugins/soleur/skills/<name>/SKILL.md` in this process; it is not a nested tool_use. A multi-segment id such as `soleur:<domain>:<name>` names an AGENT: spawn it, never Read it, and on Grok Build spawn_subagent takes the id with its colons replaced by hyphens (`agentIdToGrokSubagentType`). **Claude Code:** Skill tool for a skill (`soleur:<name>`), Task tool with `subagent_type` for an agent. Forbidden is executing a subset, not the Read.
8
+ <!-- grok-harness-invoke:end -->
9
+
10
+ # agent-browser: CLI Browser Automation
11
+
12
+ Vercel's headless browser automation CLI designed for AI agents. Uses ref-based selection (@e1, @e2) from accessibility snapshots.
13
+
14
+ ## Setup Check
15
+
16
+ ```bash
17
+ # Check installation
18
+ command -v agent-browser >/dev/null 2>&1 && echo "Installed" || echo "NOT INSTALLED - run: npm install --prefix ~/.local -g agent-browser@0.22.3 && agent-browser install"
19
+ ```
20
+
21
+ ### Install if needed
22
+
23
+ ```bash
24
+ npm install --prefix ~/.local -g agent-browser@0.22.3
25
+ agent-browser install # Downloads Chrome for Testing (~300MB)
26
+ # On Linux if system deps missing:
27
+ # agent-browser install --with-deps
28
+ ```
29
+
30
+ ### Required launch flag on Linux: `--no-sandbox`
31
+
32
+ On Ubuntu 23.10+, containers, and VMs, the host's AppArmor policy restricts
33
+ unprivileged user namespaces, so Chrome for Testing cannot initialize its zygote
34
+ sandbox and the browser fails to launch. Export the no-sandbox flag once per
35
+ session **before the first `agent-browser` command** — the daemon reads it at
36
+ launch and every later command in the session inherits it:
37
+
38
+ ```bash
39
+ export AGENT_BROWSER_ARGS="--no-sandbox"
40
+ ```
41
+
42
+ Inline alternative (first `open` only): `agent-browser open <url> --args "--no-sandbox"`.
43
+ This confines `--no-sandbox` to agent-browser's own ephemeral automation Chrome —
44
+ the same posture Playwright already runs here; it does not touch your real browser.
45
+
46
+ ### Troubleshooting: Chrome fails to launch / `open` hangs (no usable sandbox)
47
+
48
+ Symptom on pinned 0.22.3: `agent-browser open <url>` **hangs indefinitely** with
49
+ zero stdout/stderr (even `--debug` prints nothing). On newer versions it fails
50
+ fast with `No usable sandbox! ... unprivileged user namespaces ... AppArmor` and a
51
+ `--args "--no-sandbox"` hint. Both are the same cause.
52
+
53
+ 1. Set the launch flag: `export AGENT_BROWSER_ARGS="--no-sandbox"` (see above).
54
+ 2. If it still fails, a stale/wedged daemon may be holding the socket. Clear it:
55
+ `pkill -f agent-browser-linux-x64; rm -rf /tmp/agent-browser/* "/run/user/$(id -u)/agent-browser/"*`
56
+ then retry. (Never kill `playwright-mcp` processes — those are a separate stack.)
57
+ The commonest cause is a daemon whose worktree was REAPED: resolve each match's
58
+ `/proc/<pid>/cwd` and expect one ending `(deleted)`, often weeks old and inherited
59
+ by every later session on the machine. Such a daemon does not answer and **survives
60
+ SIGTERM** — it needs `kill -9`. Nothing in the CLI's error names any of this; the
61
+ only symptom is `Resource temporarily unavailable (os error 11)` (#7947).
62
+ 3. Verify: `AGENT_BROWSER_ARGS="--no-sandbox" timeout 45 agent-browser open https://example.com --headless` → exit 0 + a `✓` line.
63
+
64
+ ### Troubleshooting: Playwright MCP backend closed between calls
65
+
66
+ This is the **other** browser-automation symptom #6605 reported (the "MCP tools
67
+ de-register" half) — distinct from the agent-browser CLI hang above, and covering the
68
+ Playwright **MCP** stack. If a `mcp__plugin_soleur_playwright__browser_*` call
69
+ (or the same call on a host's own `mcp__playwright__*` registration) returns
70
+ `browserBackend.callTool: Target page, context or browser has been closed`, the browser
71
+ backend dropped while the MCP server itself stayed registered (a lifecycle event, not a
72
+ dead tool).
73
+
74
+ Two known causes, check in this order. **(1) A hook killing the browser at the end of
75
+ a turn.** Older plugin versions registered `browser-cleanup-hook.sh` on `Stop`, which
76
+ fires every turn and SIGTERMed every Playwright Chrome of the user (ADR-271; method in
77
+ `knowledge-base/project/learnings/bug-fixes/2026-10-04-stop-hook-killed-live-playwright-chrome-heartbeat-theory-refuted.md`).
78
+ Tell-tale: the next call after a turn boundary fails, and the session transcript
79
+ (`~/.claude/projects/<slug>/<session>.jsonl`) carries a `hook_success` attachment whose
80
+ `hookEvent` is `Stop` and whose `command` matches `browser-cleanup`; the kill text
81
+ `Browser cleanup: killed N orphaned Playwright Chrome process(es)` is in
82
+ `attachment.stderr`, not `stdout`. The hook is removed from the repository, but a
83
+ session may run the installed plugin copy, which keeps it until the plugin is updated:
84
+
85
+ 1. Check (read-only): take `installPath` for `soleur@soleur` from
86
+ `~/.claude/plugins/installed_plugins.json`, then run
87
+ `jq -c '.hooks.Stop[].hooks[].command' <installPath>/hooks/hooks.json`. A line naming
88
+ `browser-cleanup-hook.sh` means the installed copy still kills the browser.
89
+ 2. Update: `claude plugin update soleur@soleur` (or the id `claude plugin list` prints).
90
+ The installed version is a git sha, so the update carries the fix only once the release
91
+ that removes the hook has been published; before that it changes nothing.
92
+ 3. Restart: the USER restarts Claude Code (an agent cannot restart its own host). A `/mcp`
93
+ reconnect reuses the cached `.mcp.json` command and does not reload hooks.
94
+ 4. Until then, complete a whole browser flow inside ONE turn. Interim and untested: the
95
+ user can `chmod -x` the installed copy's `hooks/browser-cleanup-hook.sh`, which should
96
+ make that hook fail without blocking until the next update overwrites it.
97
+
98
+ **A second killer survives the update: a session in ANOTHER checkout still on the old
99
+ `.mcp.json` launch string.** That string contains `pkill -9 -f` and, on every start or
100
+ `/mcp` reconnect of that session, kills the proxy, server and Chrome of EVERY slot of
101
+ a session on the new string. Read-only check: `for w in $(git worktree list --porcelain |
102
+ sed -n 's/^worktree //p'); do grep -aq pkill "$w/.mcp.json" && echo "$w"; done` prints each
103
+ checkout still carrying it. Bring those checkouts to this `.mcp.json` and restart their
104
+ sessions (the string a running session loaded cannot be changed from here).
105
+
106
+ **A login that should persist is missing in the repo registration:** that session was
107
+ given a numbered slot or a `-p<pid>` directory. Run `grep -a 'was skipped:' "$(ls -t
108
+ ~/.cache/claude-cli-nodejs/"$(pwd | sed 's/[^A-Za-z0-9]/-/g')"/mcp-logs-playwright/*.jsonl |
109
+ head -1)"` from the project directory: the repo registration logs under `mcp-logs-playwright`
110
+ in the directory named after the working directory with every character that is not a
111
+ letter or digit replaced by a dash (`/.worktrees/` becomes `--worktrees-`). The plugin
112
+ registration's `mcp-logs-plugin-soleur-playwright` never runs the slot script and never
113
+ prints that line. The line names why slot 0 (the persistent profile) was not used, and the
114
+ remedy depends on the reason:
115
+
116
+ - "its lock is held by another live launch": the lease is held by the other session's
117
+ proxy process, and `browser_close` does not release it (it closes Chrome, not the
118
+ proxy). End that session, or disconnect its Playwright MCP server, then reconnect.
119
+ - "its SingletonLock names a live Chrome": that Chrome must exit, for example
120
+ `browser_close` in the session that owns it, then reconnect.
121
+ - A reason naming another HOST (a renamed host or a copied home directory) is
122
+ cleared by hand: after confirming no Chrome of yours uses that profile, `rm
123
+ <slot-0 dir>/Singleton*`, which removes only the stale lock files and no login.
124
+
125
+ A search for another killer must cover every enabled plugin's `hooks.json` (the installed
126
+ copy too), not only `settings.json`. The server's ping heartbeat is not a cause on stdio
127
+ (ADR-271). **(2) A Wayland/Vulkan GPU crash** — already diagnosed and
128
+ remediated in `.claude/playwright-mcp.config.json` (forces the X11/XWayland backend
129
+ and disables the GPU); see `knowledge-base/project/learnings/workflow-patterns/2026-06-17-playwright-mcp-wayland-vulkan-launch-crash.md`.
130
+
131
+ **Whatever the cause**, recycle the context and re-navigate (the pattern in
132
+ `plugins/soleur/skills/qa/SKILL.md`: `browser_close` — safe even if already closed —
133
+ then `browser_navigate`); the backend restarts. Note that snapshot `ref=` handles do
134
+ **not** survive the restart; target elements by name/selector
135
+ (`button:has-text("Save")`, `input[aria-label="..."]`) across it. A separate
136
+ `"these deferred tools are no longer available"` notice means the MCP server
137
+ disconnected (reload via `ToolSearch`) — a different failure from the backend-close.
138
+
139
+ ### Troubleshooting: version mismatch
140
+
141
+ If you see "Version mismatch between agent-browser (expects 1200) and installed Playwright (1208)":
142
+
143
+ 1. Check which binary is running: `which agent-browser && agent-browser --version`
144
+ 2. If it resolves to `/usr/bin/agent-browser` (version 0.5.0), a stale system install is shadowing the correct version
145
+ 3. Fix: `sudo npm uninstall -g agent-browser` to remove the system binary
146
+ 4. Verify: `which agent-browser` should now resolve to `~/.local/bin/agent-browser` (0.22.3)
147
+
148
+ ## Core Workflow
149
+
150
+ **The snapshot + ref pattern is optimal for LLMs:**
151
+
152
+ 1. **Navigate** to URL
153
+ 2. **Snapshot** to get interactive elements with refs
154
+ 3. **Interact** using refs (@e1, @e2, etc.)
155
+ 4. **Re-snapshot** after navigation or DOM changes
156
+
157
+ **Playwright MCP flow: when the flow is finished, call `browser_close`.** Nothing reaps the
158
+ browser at turn end (ADR-271): it lives as long as the session that launched it, and a
159
+ logged-in window left open after a credential hand-off stays logged in. For the
160
+ `agent-browser` CLI the same duty is `agent-browser close`.
161
+
162
+ ### Preflight: verify the plugin install before any snapshot
163
+
164
+ The redactor is reached through `${CLAUDE_PLUGIN_ROOT}`. An ambient value pointing at a
165
+ directory that is not a Soleur install would resolve to a path that does not exist — or, worse,
166
+ to one an attacker chose. Verify plugin IDENTITY and halt if it does not hold (ADR-179 decision 2);
167
+ a `test -f` on the script alone is a shape check and was measured bypassable.
168
+
169
+ ```bash
170
+ [ -f "${CLAUDE_PLUGIN_ROOT}/.claude-plugin/plugin.json" ] \
171
+ && grep -q '"name"[[:space:]]*:[[:space:]]*"soleur"' "${CLAUDE_PLUGIN_ROOT}/.claude-plugin/plugin.json" \
172
+ || { echo "SOLEUR_SNAPSHOT_HALT reason=plugin-root-unverified root=[${CLAUDE_PLUGIN_ROOT}]" >&2
173
+ echo " Cannot locate the snapshot redactor, so no accessibility snapshot may be taken here." >&2
174
+ echo " Root EMPTY: no Soleur plugin is loaded in this session. Install it and start a NEW session." >&2
175
+ echo " Root set but wrong: a repo checkout is not an install. Run 'claude plugin update soleur@soleur-marketplace' (or the id 'claude plugin list' prints, if you added the repository directly), then RESTART Claude Code." >&2
176
+ echo " Nothing has been captured yet, so nothing has leaked." >&2
177
+ exit 2; }
178
+ ```
179
+
180
+ ```bash
181
+ # Step 1: Open URL
182
+ agent-browser open https://example.com
183
+
184
+ # Step 2: Get interactive elements with refs
185
+ agent-browser snapshot -i --json 2>&1 | python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/redact-a11y-snapshot.py"
186
+
187
+ # Step 3: Interact using refs
188
+ agent-browser click @e1
189
+ agent-browser fill @e2 "search query"
190
+
191
+ # Step 4: Re-snapshot after changes
192
+ agent-browser snapshot -i 2>&1 | python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/redact-a11y-snapshot.py"
193
+ ```
194
+
195
+ ## Key Commands
196
+
197
+ ### Navigation
198
+
199
+ ```bash
200
+ agent-browser open <url> # Navigate to URL
201
+ agent-browser back # Go back
202
+ agent-browser forward # Go forward
203
+ agent-browser reload # Reload page
204
+ agent-browser close # Close browser
205
+ ```
206
+
207
+ ### Snapshots (Essential for AI)
208
+
209
+ ```bash
210
+ agent-browser snapshot 2>&1 | python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/redact-a11y-snapshot.py" # Full accessibility tree
211
+ agent-browser snapshot -i 2>&1 | python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/redact-a11y-snapshot.py" # Interactive elements only (recommended)
212
+ agent-browser snapshot -i --json 2>&1 | python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/redact-a11y-snapshot.py" # JSON output for parsing
213
+ agent-browser snapshot -c 2>&1 | python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/redact-a11y-snapshot.py" # Compact (remove empty elements)
214
+ agent-browser snapshot -d 3 2>&1 | python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/redact-a11y-snapshot.py" # Limit depth
215
+ ```
216
+
217
+ ### Interactions
218
+
219
+ ```bash
220
+ agent-browser click @e1 # Click element
221
+ agent-browser dblclick @e1 # Double-click
222
+ agent-browser fill @e1 "text" # Clear and fill input
223
+ agent-browser type @e1 "text" # Type without clearing
224
+ agent-browser press Enter # Press key
225
+ agent-browser hover @e1 # Hover element
226
+ agent-browser check @e1 # Check checkbox
227
+ agent-browser uncheck @e1 # Uncheck checkbox
228
+ agent-browser select @e1 "option" # Select dropdown option
229
+ agent-browser scroll down 500 # Scroll (up/down/left/right)
230
+ agent-browser scrollintoview @e1 # Scroll element into view
231
+ ```
232
+
233
+ ### Get Information
234
+
235
+ ```bash
236
+ agent-browser get text @e1 # Get element text
237
+ agent-browser get html @e1 # Get element HTML
238
+ agent-browser get value @e1 # Get input value
239
+ agent-browser get attr href @e1 # Get attribute
240
+ agent-browser get title # Get page title
241
+ agent-browser get url # Get current URL
242
+ agent-browser get count "button" # Count matching elements
243
+ ```
244
+
245
+ ### Screenshots & PDFs
246
+
247
+ ```bash
248
+ agent-browser screenshot # Viewport screenshot
249
+ agent-browser screenshot --full # Full page
250
+ agent-browser screenshot output.png # Save to file
251
+ agent-browser screenshot --full output.png # Full page to file
252
+ agent-browser pdf output.pdf # Save as PDF
253
+ ```
254
+
255
+ ### Wait
256
+
257
+ ```bash
258
+ agent-browser wait @e1 # Wait for element
259
+ agent-browser wait 2000 # Wait milliseconds
260
+ agent-browser wait "text" # Wait for text to appear
261
+ ```
262
+
263
+ ## Semantic Locators (Alternative to Refs)
264
+
265
+ ```bash
266
+ agent-browser find role button click --name "Submit"
267
+ agent-browser find text "Sign up" click
268
+ agent-browser find label "Email" fill "user@example.com"
269
+ agent-browser find placeholder "Search..." fill "query"
270
+ ```
271
+
272
+ ## Sessions (Parallel Browsers)
273
+
274
+ ```bash
275
+ # Run multiple independent browser sessions
276
+ agent-browser --session-name browser1 open https://site1.com
277
+ agent-browser --session-name browser2 open https://site2.com
278
+
279
+ # List saved states
280
+ agent-browser state list
281
+ ```
282
+
283
+ ## Examples
284
+
285
+ ### Credential safety on a login or credential page
286
+
287
+ An accessibility snapshot serializes the **value** of input fields. A value the
288
+ agent never typed — a password manager's autofill, a static `value=`, a JS
289
+ assignment, or a freshly-minted credential shown in a panel — is rendered into
290
+ the transcript and into any snapshot file written to disk. Nothing about the
291
+ call looks credential-adjacent, which is why this is a gate and not advice: the
292
+ PreToolUse hook `browser-snapshot-credential-guard.sh` denies an unrouted
293
+ snapshot before it runs (#7947).
294
+
295
+ **Route every snapshot on a credential-bearing page through the redactor**,
296
+ [redact-a11y-snapshot.py](./scripts/redact-a11y-snapshot.py):
297
+
298
+ ```bash
299
+ agent-browser snapshot -i 2>&1 | python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/redact-a11y-snapshot.py"
300
+ ```
301
+
302
+ Stating the ceiling first, because the rule is otherwise read as "piping makes a
303
+ snapshot safe": the redactor is **defense-in-depth on one sink**, not a control
304
+ that makes snapshotting a credential page safe. It keys on the node's accessible
305
+ name, because neither surface serializes the input's `type` — measured, see the
306
+ [Phase 0.1 record](../../../../knowledge-base/project/specs/feat-one-shot-7946-7947-sentry-org-token-and-snapshot-redaction/phase-0-measurement.md).
307
+ It therefore cannot see a localised field name, a credential outside a
308
+ text-input role, or a value split across segmented inputs.
309
+
310
+ **A screenshot is safe for a `type=password` field** — the browser renders it as
311
+ dots — **and is NOT safe for a generated-credential panel.** Measured: a readonly
312
+ `type=text` box named "Token" renders its value in clear in the screenshot
313
+ exactly as it does in the snapshot. On a page displaying a credential, capture
314
+ neither: read the value with `agent-browser get value <sel>` into a file, use it,
315
+ and shred the file.
316
+
317
+ **When the credential is TEXT, not an input, `get value` finds nothing — use
318
+ `eval`, and never let its output reach the transcript.** Measured on the Anthropic
319
+ Console key panel (#8505): the fresh key is leaf text, zero `<input>` holds it.
320
+ Redirect `eval`'s stdout straight into a file created mode 0600, then print only
321
+ its length and prefix. Run both lines in ONE Bash call — `umask` does not carry
322
+ across calls — and note the file holds a JSON *string* (quoted); unwrap it with
323
+ `json.load`, never by printing it:
324
+
325
+ ```bash
326
+ umask 077
327
+ agent-browser eval "(()=>{const m=document.body.innerText.match(/sk-ant-[A-Za-z0-9_-]{20,}/);return m?m[0]:''})()" > "${SCRATCH:?}/key.json"
328
+ python3 -c 'import json,sys; v=json.load(open(sys.argv[1])); print(len(v), v.startswith("sk-ant-"))' "${SCRATCH:?}/key.json"
329
+ ```
330
+
331
+ Neither redactor is a backstop here: `redact-a11y-snapshot.py` and the MCP proxy
332
+ key on an accessibility node's NAME, so a raw key string returned by `eval` or by
333
+ the MCP's `browser_run_code_unsafe` passes both unredacted. Return a length or a
334
+ fixed code from any in-page script, never the value, and catch every error inside
335
+ the script so a thrown message cannot carry the value out either.
336
+
337
+ ### Login Flow
338
+
339
+ `fill @e2` needs a ref, and a ref comes from a snapshot — so the login step
340
+ snapshots **through the redactor** rather than not at all.
341
+
342
+ ```bash
343
+ agent-browser open https://app.example.com/login
344
+ agent-browser snapshot -i 2>&1 | python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/redact-a11y-snapshot.py"
345
+ # Output shows: textbox "Email" [ref=e1], textbox "Password" [ref=e2], button "Sign in" [ref=e3]
346
+ agent-browser fill @e1 "user@example.com"
347
+ # Pass the secret by env indirection -- never a literal, which lands in the
348
+ # transcript as the tool-call argument before any snapshot happens.
349
+ agent-browser fill @e2 "$APP_PASSWORD"
350
+ agent-browser click @e3
351
+ agent-browser wait 2000
352
+ # Verify logged in -- still through the redactor: the password manager may have
353
+ # refilled the field on the post-login page.
354
+ agent-browser snapshot -i 2>&1 | python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/redact-a11y-snapshot.py"
355
+ ```
356
+
357
+ ### Search and Extract
358
+
359
+ ```bash
360
+ agent-browser open https://news.ycombinator.com
361
+ agent-browser snapshot -i --json 2>&1 | python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/redact-a11y-snapshot.py"
362
+ # Parse JSON to find story links
363
+ agent-browser get text @e12 # Get headline text
364
+ agent-browser click @e12 # Click to open story
365
+ ```
366
+
367
+ ### Form Filling
368
+
369
+ ```bash
370
+ agent-browser open https://forms.example.com
371
+ agent-browser snapshot -i 2>&1 | python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/redact-a11y-snapshot.py"
372
+ agent-browser fill @e1 "John Doe"
373
+ agent-browser fill @e2 "john@example.com"
374
+ agent-browser select @e3 "United States"
375
+ agent-browser check @e4 # Agree to terms
376
+ agent-browser click @e5 # Submit button
377
+ agent-browser screenshot confirmation.png
378
+ ```
379
+
380
+ ### Debug Mode
381
+
382
+ ```bash
383
+ # Run with visible browser window
384
+ agent-browser --headed open https://example.com
385
+ agent-browser --headed snapshot -i 2>&1 | python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/redact-a11y-snapshot.py"
386
+ agent-browser --headed click @e1
387
+ ```
388
+
389
+ ## JSON Output
390
+
391
+ Add `--json` for structured output:
392
+
393
+ ```bash
394
+ agent-browser snapshot -i --json 2>&1 | python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/redact-a11y-snapshot.py"
395
+ ```
396
+
397
+ Returns:
398
+
399
+ ```json
400
+ {
401
+ "success": true,
402
+ "data": {
403
+ "refs": {
404
+ "e1": {"name": "Submit", "role": "button"},
405
+ "e2": {"name": "Email", "role": "textbox"}
406
+ },
407
+ "snapshot": "- button \"Submit\" [ref=e1]\n- textbox \"Email\" [ref=e2]"
408
+ }
409
+ }
410
+ ```
411
+
412
+ ## vs Playwright MCP
413
+
414
+ | Feature | agent-browser (CLI) | Playwright MCP |
415
+ |---------|---------------------|----------------|
416
+ | Interface | Bash commands | MCP tools |
417
+ | Selection | Refs (@e1) | Refs (e1) |
418
+ | Output | Text/JSON | Tool responses |
419
+ | Parallel | Session names | Tabs |
420
+ | Browser | Chrome for Testing | Chromium |
421
+ | Runtime | Rust native | Node.js |
422
+ | Best for | Quick automation | Tool integration |
423
+
424
+ Use agent-browser when:
425
+
426
+ - You prefer Bash-based workflows
427
+ - You want simpler CLI commands
428
+ - You need quick one-off automation
429
+
430
+ Use Playwright MCP when:
431
+
432
+ - You need deep MCP tool integration
433
+ - You want tool-based responses
434
+ - You're building complex automation
435
+
436
+ ### Wrapping the server
437
+
438
+ **The plugin registers the wrapped server.** `plugins/soleur/.mcp.json`
439
+ registers `playwright` with `python3` running
440
+ `"${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/playwright-mcp-redact-proxy.py"`
441
+ in front of `npx @playwright/mcp@0.0.78`, so on Claude Code its tools arrive as
442
+ `mcp__plugin_soleur_playwright__*` — already wrapped, no customer
443
+ configuration. The registration passes
444
+ `--user-data-dir-name soleur-playwright-mcp-profile` and `--chromium-fallback`, so the wrapped browser
445
+ runs on its own profile under `$XDG_CACHE_HOME` (default `~/.cache`), separate
446
+ from any `playwright` registration the customer configured themselves. On a
447
+ registration routed through the proxy, every `tools/call` result is rewritten
448
+ through `redact-a11y-snapshot.py` at the stdio boundary — between the server's
449
+ stdout and the client's stdin, before the model reads it — which is what
450
+ "redacted in flight" means: a content rewrite, not encryption and not
451
+ transport security. A registration not routed through it is not covered by
452
+ anything at runtime (#7980). **The registration ships no config; its `env` block carries only
453
+ `PLAYWRIGHT_MCP_PING_TIMEOUT_MS=0`, an inert guard on stdio that is not a fix for
454
+ anything (ADR-271). The server runs upstream defaults: headed — a visible Chrome
455
+ window opens when a tool drives the browser — on channel `chrome` (real Google
456
+ Chrome), except that when no Google Chrome executable exists at
457
+ `/opt/google/chrome/chrome` (Linux) or `/Applications/Google Chrome.app/Contents/MacOS/Google Chrome` (macOS)
458
+ and the launch names no browser, `--chromium-fallback` makes the proxy append
459
+ `--browser chromium --sandbox`, which Playwright maps to its bundled Chromium with the
460
+ Chromium sandbox kept on, like real Chrome. If that sandbox cannot start on the host (no
461
+ unprivileged user namespaces, an Ubuntu AppArmor restriction, running as root, a
462
+ default-seccomp container), the first browser call fails with a sandbox error and no
463
+ browser opens; the supported remedy is to install Google Chrome, never to disable the
464
+ sandbox, which the proxy refuses in every spelling.** Headed is deliberate: the
465
+ credential-handoff flows need an operator-visible window. On a display-less host
466
+ the server still connects but browser tools fail to launch — see the playbook at
467
+ the end of this section.
468
+
469
+ **Preconditions.** The plugin server exists only where all of these hold: the
470
+ session is Claude Code ≥2.1.139 with the soleur plugin installed; `python3`
471
+ and `npx` are on `PATH` and both scripts sit under `${CLAUDE_PLUGIN_ROOT}` (the
472
+ proxy refuses to start beside a missing redactor); and the server is not
473
+ toggled off in `/mcp`. Devin's local CLI also discovers a plugin-root
474
+ `.mcp.json` (its own documentation), so the tools may appear there too —
475
+ still wrapped; on Codex discovery is unverified. On any harness that does
476
+ not discover it, a disabled toggle, or a failed precondition,
477
+ `mcp__plugin_soleur_playwright__*` simply does not
478
+ exist — treat it as a missing registration and take the file-form path the
479
+ calling skill prescribes (the `filename:` + redactor + shred form on the
480
+ registration that does answer, or `agent-browser`), never a bare
481
+ `browser_snapshot` on an unwrapped server. **The `/mcp` toggle** can disable
482
+ the plugin's `playwright` server without uninstalling the plugin; while it is
483
+ off the tools are absent for the whole session and the same fallback applies.
484
+
485
+ **Wrap your own registration (advanced).** A customer's own `playwright`
486
+ registration is not covered by the plugin server — it stays unwrapped unless
487
+ the customer routes it through the proxy, with the proxy referenced through the
488
+ bare plugin-root anchor per ADR-179:
489
+
490
+ ```json
491
+ {
492
+ "mcpServers": {
493
+ "playwright": {
494
+ "command": "python3",
495
+ "args": [
496
+ "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/playwright-mcp-redact-proxy.py",
497
+ "--",
498
+ "npx", "@playwright/mcp@0.0.78",
499
+ "--user-data-dir=<profile-dir>"
500
+ ]
501
+ }
502
+ }
503
+ }
504
+ ```
505
+
506
+ Claude Code does not expand `${CLAUDE_PLUGIN_ROOT}` inside a project `.mcp.json`
507
+ (the variable exists for plugin-provided servers). Replace it with the
508
+ `installPath` that `claude plugin list --json` prints for `soleur`; that path
509
+ carries the plugin version, so re-check it after every plugin update.
510
+ `--user-data-dir=<profile-dir>` may instead be
511
+ `--user-data-dir-name <basename>` placed before the `--`: the proxy resolves it
512
+ under `$XDG_CACHE_HOME` (default `~/.cache`) and refuses a basename carrying a
513
+ separator or `..`. Add `--config=<file>` only when the project has that file:
514
+ the proxy refuses to start on a named config that does not exist. An
515
+ `.mcp.json` edit loads only on a full Claude Code restart, never on a `/mcp`
516
+ reconnect, and only the user can restart; afterwards verify with `ToolSearch
517
+ select:mcp__playwright__browser_snapshot` — a description ending with the marker
518
+ below means wrapped, no match means the server did not connect (see the end of
519
+ this section). This repository wraps the command in a `bash -c` prelude (it sources
520
+ `plugins/soleur/skills/agent-browser/scripts/playwright-mcp-profile-slot.sh`, which leases a profile directory by a
521
+ kernel `flock` and never kills a process by pattern — slot 0 is the persistent
522
+ `~/.cache/playwright-mcp-profile` and a launch whose slot is held by another live session
523
+ takes the next numbered slot `~/.cache/playwright-mcp-profile-<n>` at once, with a stderr
524
+ line in the MCP log saying the persistent profile's logins are not available in that
525
+ session; a `/mcp` reconnect waits up to 7 s for its own previous launch to release slot 0
526
+ (the wait needs `flock`: where it is missing a reconnect that finds the old Chrome still
527
+ alive lands on an empty `-p<pid>` profile).
528
+ When `flock` is missing (stock macOS) the first session still takes slot 0 without a lease
529
+ if no live Chrome owns it, and a second session that starts before the first one's browser
530
+ exists (Playwright starts it lazily) also gets slot 0 and Playwright's "already in use"
531
+ error; with no usable `flock` and slot 0 busy, or when all 32 slots
532
+ are busy, it uses a unique `playwright-mcp-profile-p<pid>` directory that nothing reaps;
533
+ `env -u WAYLAND_DISPLAY`; an X11 display) that is Linux-only; the proxy itself is POSIX
534
+ (stdlib `selectors` + `subprocess`) and does not run on Windows. **Cleaning up profile
535
+ directories:** these directories are at-rest credential stores (mode 700; they hold
536
+ whatever logins were done in them) and removal is manual. Only the `-p<pid>` fallbacks are
537
+ removable: remove one only when the pid in its name is dead (`kill -0 <pid>` fails) and its
538
+ `SingletonLock` (`readlink <dir>/SingletonLock`, target `host-<pid>`) names no live pid. The
539
+ numbered slots (`playwright-mcp-profile`, `-1` to `-31`) hold the persistent logins: do not
540
+ delete them as stale. A slot is in use when `flock -n <dir>/.pwslot.lock true` fails (rc 1)
541
+ (rc 66 means the directory is missing), but that test sees only sessions on the new launch
542
+ string: an old-string session holds no `flock`, so also require that `readlink
543
+ <dir>/SingletonLock` names no live pid (as above) before calling a slot free.
544
+
545
+ **Fail-closed in three arms, no bypass variable.**
546
+
547
+ 1. **At startup** — the proxy writes `playwright-mcp-redact-proxy: refusing to
548
+ start: <reason>` to stderr and exits 2, spawning no server, when it cannot
549
+ load and self-test the redactor, or when the launch opens a raw sink around
550
+ it: a disk/session sink or foreign browser — `--save-session`,
551
+ `--save-trace`, `--save-video`, `--storage-state`, `--secrets`,
552
+ `--output-dir`, `--init-script`, `--init-page`, `--cdp-endpoint`,
553
+ `--endpoint`, `--extension`, `--executable-path`, `--daemon`,
554
+ `--allow-unrestricted-file-access`, `--grant-permissions`,
555
+ `--ignore-https-errors`, `--no-sandbox`, and each setting's
556
+ `PLAYWRIGHT_MCP_*` env twin (`PLAYWRIGHT_MCP_SANDBOX` for `--no-sandbox`),
557
+ plus env-only `PLAYWRIGHT_MCP_USER_DATA_DIR` and
558
+ `PLAYWRIGHT_MCP_SNAPSHOT_MODE`; a trailing valued flag, which would swallow
559
+ the appended `--snapshot-mode none` as its value; a config file (from
560
+ `--config` or `PLAYWRIGHT_MCP_CONFIG`) that is missing, is not JSON, or sets
561
+ `saveSession`, `saveTrace`, `saveVideo`, `secrets`, `outputDir`,
562
+ `allowUnrestrictedFileAccess`, `extension`, `server.port` / `server.host`, a
563
+ capability other than `vision`, `browser.cdpEndpoint` /
564
+ `browser.remoteEndpoint`, `browser.initPage` / `browser.initScript`,
565
+ `browser.contextOptions.storageState` / `.permissions` /
566
+ `.ignoreHTTPSErrors`, `browser.launchOptions.executablePath` /
567
+ `.chromiumSandbox: false` / a remote-debugging `args` flag, or a
568
+ `browser.userDataDir` conflicting with `--user-data-dir-name`; `--port`,
569
+ `--host`, `PLAYWRIGHT_MCP_PORT` or `PLAYWRIGHT_MCP_HOST`
570
+ (an HTTP transport around the relay); `--caps` or `PLAYWRIGHT_MCP_CAPS` other
571
+ than `vision` (devtools, pdf and storage write raw page state);
572
+ `--output-mode file`; a `DEBUG` value that can enable any `pw:` logger (the
573
+ `debug` package splits on whitespace and commas and treats `*` as a wildcard,
574
+ so `pw:*` counts); `DEBUG_FILE`; or a `--user-data-dir-name` that is not a
575
+ bare basename (a separator or `..`), is combined with an explicit
576
+ `--user-data-dir` in the server argv, or resolves under a relative
577
+ `XDG_CACHE_HOME` / an unset `HOME`. The reason names the setting, never its
578
+ value.
579
+
580
+ 2. **Per call** — it appends `--snapshot-mode none` to the child so no action
581
+ tool writes a tree to disk, and refuses, before the server sees it, a
582
+ `browser_snapshot` call carrying a `filename` key and any `tools/call` whose
583
+ `arguments` carry `_meta` (measured: `_meta.json` returns the tree as one
584
+ escaped string the line-anchored predicate cannot see). A refusal is an
585
+ `isError` result whose text begins `refused by playwright-mcp-redact-proxy:`.
586
+ A request reusing an id that is still pending is refused with a JSON-RPC
587
+ error.
588
+
589
+ 3. **Per result** — a result it cannot rewrite (an unrecognised shape, an error
590
+ carrying data or tree-shaped text, a JSON-escaped tree such as
591
+ `browser_run_code_unsafe` returning `ariaSnapshot()`, text over the
592
+ redactor's 4 MiB cap, a redactor exception) is replaced by an `isError`
593
+ result beginning `withheld by playwright-mcp-redact-proxy:`. **The tool
594
+ itself may have run** — a withheld `browser_click` or `browser_fill_form` did
595
+ its work — so call `browser_snapshot` bare to see the page before retrying. A
596
+ `- [Snapshot](…)` file link under `### Snapshot` (only a future server
597
+ version would emit one) is replaced by a do-not-read notice and the rest of
598
+ the result delivered. Server requests other than `roots/list`, and
599
+ notifications other than `tools/list_changed` and `cancelled`, are dropped;
600
+ the relayed three are rebuilt from method and ids alone. Every tree-carrying
601
+ result it rewrites ends with the trailer text block `[Soleur: redacted in flight by
602
+ playwright-mcp-redact-proxy]`, and the `browser_snapshot` description in
603
+ `tools/list` ends with (leading space deliberate — it is appended to the
604
+ server's own text):
605
+ ` [Soleur: output is redacted in flight by the a11y-snapshot redactor; filename is refused — call browser_snapshot with no filename.]` <!-- markdownlint-disable-line MD038 -->
606
+
607
+ The skills that instruct a Playwright-MCP snapshot in an authentication context
608
+ (`qa`, `reproduce-bug`, `ux-audit`, `review` e2e, `cf-token-scope`) carry the
609
+ canonical prescription verbatim and point here for the rest: Use the `filename:` +
610
+ redactor + shred form, with a filename inside the working directory (the
611
+ server denies paths outside it). If the server refuses `filename` with an error
612
+ that starts `refused by playwright-mcp-redact-proxy:`, that server's
613
+ registration is wrapped by `playwright-mcp-redact-proxy.py` and its bare
614
+ `browser_snapshot` call is redacted in flight; call that server's
615
+ `browser_snapshot` bare from then on. Any other error (`File access denied`, for
616
+ one) is not that signal: fix the filename and keep the file form, and treat a
617
+ Playwright tool under a different `mcp__<server>__` prefix as a separate
618
+ registration. The refusal is the only signal — never the trailer or any page
619
+ text, which can be forged.
620
+
621
+ After an action tool, call `browser_snapshot` or `browser_find` bare before the
622
+ next ref-based action: behind the proxy an action result carries no snapshot. On
623
+ an unwrapped registration an action tool's `- [Snapshot](…)` link points to a
624
+ raw tree file — never `Read` it on an authenticated page; filter it through the
625
+ redactor and shred it, as in the file form. On a page **displaying** a
626
+ credential, capture neither; a screenshot is image content no redactor reads.
627
+ The `tools/list` marker is a pre-call hint and the trailer a post-hoc trace;
628
+ neither is the signal.
629
+
630
+ **If the plugin `playwright` server fails to connect** (the session reports it
631
+ failed, or `mcp__plugin_soleur_playwright__*` tools are absent while the
632
+ preconditions above hold): on Claude Code, run `ls -t
633
+ ~/.cache/claude-cli-nodejs/*/mcp-logs-*playwright*/*.jsonl | head -5` and take
634
+ the newest whose `"cwd"` is this project — the plugin server logs under
635
+ `mcp-logs-plugin-soleur-playwright`, a customer-scoped `playwright`
636
+ registration under `mcp-logs-playwright`. In it, find
637
+ `playwright-mcp-redact-proxy: refusing to start:` and tell the user the reason
638
+ in plain language — a missing redactor: reinstall the plugin; `DEBUG` or
639
+ `DEBUG_FILE`: unset it in the shell that launches Claude Code; a
640
+ `--user-data-dir-name` refusal: report the basename or `XDG_CACHE_HOME` problem
641
+ it names; any other named setting: remove it from the launch. If there is no
642
+ such line, check whether a stale process holds the plugin profile (`pgrep -f
643
+ soleur-playwright-mcp-profile` — a SIGKILLed session can leave a
644
+ `SingletonLock`; a dead-pid lock is stolen cleanly on the next launch, so only
645
+ a LIVE lock-holder is the contention case), then report the last `Server
646
+ stderr:` and `child exited rc=` lines — the failure is in the server or the
647
+ launch command, not the redactor. Any fix needs a full Claude Code restart,
648
+ which only the user can do.
649
+
650
+ **If the plugin server connects but the browser never launches** (tools answer
651
+ with launch/navigation errors while the registration itself is healthy), the
652
+ registration's upstream defaults are the suspect surface: headed, channel
653
+ `chrome`. Measured modes, each remediated by the customer exporting the
654
+ named variable in the shell that launches their harness (the plugin entry's
655
+ `env` block carries only the inert ping guard, so process env is the only
656
+ override path — `executable-path` is refused by the proxy as a foreign-browser
657
+ sink, so do not suggest it):
658
+
659
+ - **No display** (headless host, SSH, container): a headed browser cannot
660
+ open. `PLAYWRIGHT_MCP_HEADLESS=1` is the supported opt-out.
661
+ - **No real Chrome**: the plugin registration's `--chromium-fallback` already
662
+ switches to bundled Chromium, with its sandbox on. If Playwright then reports the
663
+ bundled browser is missing, install it with the PINNED command
664
+ `npx @playwright/mcp@0.0.78 install-browser chromium` (the pinned package's
665
+ `cli.js` rewrites `install-browser` to Playwright's `install`, its `--help`
666
+ prints Playwright's install usage, `install-browser chromium --dry-run` resolves
667
+ "playwright chromium v1232"; Playwright's own missing-browser error names the
668
+ UNPINNED form `npx @playwright/mcp install-browser <target>`, which can fetch a
669
+ newer package whose Chromium revision differs, so always use the pinned form; the
670
+ top-level `--help` does not list it, and the `npx playwright install` warning
671
+ banner it prints is cosmetic). Note the pinned server's
672
+ `--help` lists only `chrome, firefox, webkit, msedge` as `--browser` values, but
673
+ `chromium` is accepted and maps to the bundled browser. A registration
674
+ without the flag (a customer's own) still needs real Chrome or an explicit
675
+ `--browser chromium`.
676
+ - **`Chromium sandboxing failed!` / `No usable sandbox!` on the first browser call**
677
+ (bundled Chromium, sandbox kept on): the host does not allow unprivileged user
678
+ namespaces (common on Ubuntu 23.10+/24.04, in containers, or as root). Do NOT try
679
+ `chromiumSandbox: false`, `--no-sandbox` or `PLAYWRIGHT_MCP_SANDBOX`; Playwright's
680
+ message suggests it and the proxy refuses it. Install Google Chrome
681
+ (`google-chrome-stable`, which ships the AppArmor profile that lets its sandbox
682
+ run), asking the operator for the privilege prompt if one is needed, then restart
683
+ the session. Running as root: use a non-root user.
684
+ - **A second concurrent session gets `Browser is already in use for <dir>, use
685
+ --isolated ...` on the plugin registration**: the plugin registration
686
+ (`soleur-playwright-mcp-profile`) has NO lease, so the first session's browser holds
687
+ the profile for that session's whole lifetime (before ADR-271 the Stop hook freed it
688
+ at each turn end; now nothing does). Nothing is killed. Call `browser_close` in the
689
+ other session or end it. `--isolated` does not apply: the proxy always injects a
690
+ user-data-dir and the pinned server rejects the combination, and ADR-271 rejects
691
+ `--isolated` (it wipes OAuth sessions). This repository's own `.mcp.json` registration
692
+ does lease slots, so two sessions there each get a browser.
693
+ - **Wayland/GPU variance**: a headed launch on a Wayland host was measured
694
+ working with system Chromium (no Vulkan/ozone/crash lines), but the
695
+ 2026-06 dogfood crash class existed — on a crash-looping host,
696
+ `PLAYWRIGHT_MCP_HEADLESS=1` sidesteps the compositor path entirely, or the
697
+ customer keeps their own registration with an env-forcing prelude as this
698
+ repository's `.mcp.json` does.