@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.
- package/.claude-plugin/agents.manifest.json +476 -0
- package/.claude-plugin/plugin.json +42 -0
- package/README.md +44 -2
- package/agents/community/.gitkeep +0 -0
- package/agents/engineering/cto.md +87 -0
- package/agents/engineering/design/ddd-architect.md +95 -0
- package/agents/engineering/discovery/agent-finder.md +214 -0
- package/agents/engineering/discovery/functional-discovery.md +182 -0
- package/agents/engineering/infra/infra-security.md +151 -0
- package/agents/engineering/infra/platform-strategist.md +109 -0
- package/agents/engineering/infra/terraform-architect.md +171 -0
- package/agents/engineering/prompt-engineer.md +37 -0
- package/agents/engineering/research/best-practices-researcher.md +115 -0
- package/agents/engineering/research/framework-docs-researcher.md +93 -0
- package/agents/engineering/research/git-history-analyzer.md +53 -0
- package/agents/engineering/research/learnings-researcher.md +285 -0
- package/agents/engineering/research/repo-research-analyst.md +118 -0
- package/agents/engineering/review/agent-native-reviewer.md +279 -0
- package/agents/engineering/review/architecture-strategist.md +61 -0
- package/agents/engineering/review/code-quality-analyst.md +92 -0
- package/agents/engineering/review/code-simplicity-reviewer.md +109 -0
- package/agents/engineering/review/data-integrity-guardian.md +82 -0
- package/agents/engineering/review/data-migration-expert.md +98 -0
- package/agents/engineering/review/deployment-verification-agent.md +183 -0
- package/agents/engineering/review/dhh-rails-reviewer.md +46 -0
- package/agents/engineering/review/kieran-rails-reviewer.md +87 -0
- package/agents/engineering/review/legacy-code-expert.md +55 -0
- package/agents/engineering/review/observability-coverage-reviewer.md +147 -0
- package/agents/engineering/review/pattern-recognition-specialist.md +59 -0
- package/agents/engineering/review/performance-oracle.md +130 -0
- package/agents/engineering/review/security-sentinel.md +167 -0
- package/agents/engineering/review/semgrep-sast.md +36 -0
- package/agents/engineering/review/test-design-reviewer.md +150 -0
- package/agents/engineering/review/user-impact-reviewer.md +70 -0
- package/agents/engineering/workflow/pr-comment-resolver.md +69 -0
- package/agents/finance/budget-analyst.md +29 -0
- package/agents/finance/cfo.md +44 -0
- package/agents/finance/financial-reporter.md +30 -0
- package/agents/finance/revenue-analyst.md +30 -0
- package/agents/legal/clo.md +115 -0
- package/agents/legal/legal-compliance-auditor.md +110 -0
- package/agents/legal/legal-document-generator.md +134 -0
- package/agents/marketing/analytics-analyst.md +25 -0
- package/agents/marketing/brand-architect.md +181 -0
- package/agents/marketing/cmo.md +76 -0
- package/agents/marketing/conversion-optimizer.md +19 -0
- package/agents/marketing/copywriter.md +20 -0
- package/agents/marketing/fact-checker.md +70 -0
- package/agents/marketing/growth-strategist.md +145 -0
- package/agents/marketing/paid-media-strategist.md +28 -0
- package/agents/marketing/pricing-strategist.md +17 -0
- package/agents/marketing/programmatic-seo-specialist.md +25 -0
- package/agents/marketing/retention-strategist.md +23 -0
- package/agents/marketing/seo-aeo-analyst.md +164 -0
- package/agents/operations/coo.md +50 -0
- package/agents/operations/ops-advisor.md +78 -0
- package/agents/operations/ops-provisioner.md +101 -0
- package/agents/operations/ops-research.md +52 -0
- package/agents/operations/service-automator.md +278 -0
- package/agents/product/business-validator.md +206 -0
- package/agents/product/competitive-intelligence.md +89 -0
- package/agents/product/cpo.md +63 -0
- package/agents/product/design/ux-design-lead.md +209 -0
- package/agents/product/spec-flow-analyzer.md +122 -0
- package/agents/sales/cro.md +44 -0
- package/agents/sales/deal-architect.md +29 -0
- package/agents/sales/outbound-strategist.md +29 -0
- package/agents/sales/pipeline-analyst.md +29 -0
- package/agents/support/cco.md +48 -0
- package/agents/support/community-manager.md +570 -0
- package/agents/support/ticket-triage.md +70 -0
- package/bin/soleur-opencode.js +29 -0
- package/commands/go.md +660 -0
- package/commands/help.md +273 -0
- package/commands/sync.md +977 -0
- package/commands/version.md +103 -0
- package/hooks/antigravity-hooks.json +84 -0
- package/hooks/antigravity-session-start.sh +15 -0
- package/hooks/bare-root-cwd-guard.sh +131 -0
- package/hooks/browser-snapshot-credential-guard.sh +200 -0
- package/hooks/codex-session-start.sh +9 -0
- package/hooks/compaction-state.sh +525 -0
- package/hooks/destructive-command-guard.sh +1387 -0
- package/hooks/devin-session-start.sh +90 -0
- package/hooks/ext-filter-detect.sh +171 -0
- package/hooks/hooks.json +133 -0
- package/hooks/lib/hook-tool-kind.sh +24 -0
- package/hooks/lib/log-rotation.sh +176 -0
- package/hooks/lib/shell-argv.pl +576 -0
- package/hooks/memory-backstop.sh +1114 -0
- package/hooks/operator-stage-approval.sh +391 -0
- package/hooks/stop-hook.sh +367 -0
- package/hooks/unkept-promise-hook.sh +383 -0
- package/hooks/version-banner.sh +127 -0
- package/hooks/welcome-hook.sh +50 -0
- package/install.js +29 -0
- package/lib/agent-registry.ts +154 -0
- package/lib/c4-canonical-cli.mjs +34 -0
- package/lib/c4-canonical.mjs +46 -0
- package/lib/c4-from-components.ts +554 -0
- package/lib/go-routing.ts +81 -0
- package/lib/grok-inspect-contract.ts +311 -0
- package/lib/harness-model-map.ts +101 -0
- package/lib/harness-parity.ts +726 -0
- package/lib/harness-tool-map.ts +180 -0
- package/lib/harness.ts +716 -0
- package/lib/heartbeat-live-reconcile.ts +1153 -0
- package/lib/heartbeat-manifest.ts +361 -0
- package/lib/kb-coverage.ts +252 -0
- package/lib/pr-merge-poll.ts +103 -0
- package/lib/workflow-fidelity.ts +388 -0
- package/opencode/INSTRUCTIONS.md +171 -0
- package/opencode/agents/engineering/cto.md +10 -0
- package/opencode/agents/engineering/design/ddd-architect.md +10 -0
- package/opencode/agents/engineering/discovery/agent-finder.md +10 -0
- package/opencode/agents/engineering/discovery/functional-discovery.md +10 -0
- package/opencode/agents/engineering/infra/infra-security.md +10 -0
- package/opencode/agents/engineering/infra/platform-strategist.md +10 -0
- package/opencode/agents/engineering/infra/terraform-architect.md +10 -0
- package/opencode/agents/engineering/prompt-engineer.md +10 -0
- package/opencode/agents/engineering/research/best-practices-researcher.md +10 -0
- package/opencode/agents/engineering/research/framework-docs-researcher.md +10 -0
- package/opencode/agents/engineering/research/git-history-analyzer.md +10 -0
- package/opencode/agents/engineering/research/learnings-researcher.md +10 -0
- package/opencode/agents/engineering/research/repo-research-analyst.md +10 -0
- package/opencode/agents/engineering/review/agent-native-reviewer.md +10 -0
- package/opencode/agents/engineering/review/architecture-strategist.md +10 -0
- package/opencode/agents/engineering/review/code-quality-analyst.md +10 -0
- package/opencode/agents/engineering/review/code-simplicity-reviewer.md +10 -0
- package/opencode/agents/engineering/review/data-integrity-guardian.md +10 -0
- package/opencode/agents/engineering/review/data-migration-expert.md +10 -0
- package/opencode/agents/engineering/review/deployment-verification-agent.md +10 -0
- package/opencode/agents/engineering/review/dhh-rails-reviewer.md +10 -0
- package/opencode/agents/engineering/review/kieran-rails-reviewer.md +10 -0
- package/opencode/agents/engineering/review/legacy-code-expert.md +10 -0
- package/opencode/agents/engineering/review/observability-coverage-reviewer.md +10 -0
- package/opencode/agents/engineering/review/pattern-recognition-specialist.md +10 -0
- package/opencode/agents/engineering/review/performance-oracle.md +10 -0
- package/opencode/agents/engineering/review/security-sentinel.md +10 -0
- package/opencode/agents/engineering/review/semgrep-sast.md +10 -0
- package/opencode/agents/engineering/review/test-design-reviewer.md +10 -0
- package/opencode/agents/engineering/review/user-impact-reviewer.md +10 -0
- package/opencode/agents/engineering/workflow/pr-comment-resolver.md +10 -0
- package/opencode/agents/finance/budget-analyst.md +10 -0
- package/opencode/agents/finance/cfo.md +10 -0
- package/opencode/agents/finance/financial-reporter.md +10 -0
- package/opencode/agents/finance/revenue-analyst.md +10 -0
- package/opencode/agents/legal/clo.md +10 -0
- package/opencode/agents/legal/legal-compliance-auditor.md +10 -0
- package/opencode/agents/legal/legal-document-generator.md +10 -0
- package/opencode/agents/marketing/analytics-analyst.md +10 -0
- package/opencode/agents/marketing/brand-architect.md +10 -0
- package/opencode/agents/marketing/cmo.md +10 -0
- package/opencode/agents/marketing/conversion-optimizer.md +10 -0
- package/opencode/agents/marketing/copywriter.md +10 -0
- package/opencode/agents/marketing/fact-checker.md +10 -0
- package/opencode/agents/marketing/growth-strategist.md +10 -0
- package/opencode/agents/marketing/paid-media-strategist.md +10 -0
- package/opencode/agents/marketing/pricing-strategist.md +10 -0
- package/opencode/agents/marketing/programmatic-seo-specialist.md +10 -0
- package/opencode/agents/marketing/retention-strategist.md +10 -0
- package/opencode/agents/marketing/seo-aeo-analyst.md +10 -0
- package/opencode/agents/operations/coo.md +10 -0
- package/opencode/agents/operations/ops-advisor.md +10 -0
- package/opencode/agents/operations/ops-provisioner.md +10 -0
- package/opencode/agents/operations/ops-research.md +10 -0
- package/opencode/agents/operations/service-automator.md +10 -0
- package/opencode/agents/product/business-validator.md +10 -0
- package/opencode/agents/product/competitive-intelligence.md +10 -0
- package/opencode/agents/product/cpo.md +10 -0
- package/opencode/agents/product/design/ux-design-lead.md +10 -0
- package/opencode/agents/product/spec-flow-analyzer.md +10 -0
- package/opencode/agents/sales/cro.md +10 -0
- package/opencode/agents/sales/deal-architect.md +10 -0
- package/opencode/agents/sales/outbound-strategist.md +10 -0
- package/opencode/agents/sales/pipeline-analyst.md +10 -0
- package/opencode/agents/support/cco.md +10 -0
- package/opencode/agents/support/community-manager.md +10 -0
- package/opencode/agents/support/ticket-triage.md +10 -0
- package/opencode/commands/go.md +10 -0
- package/opencode/commands/help.md +10 -0
- package/opencode/commands/sync.md +10 -0
- package/opencode/commands/version.md +11 -0
- package/opencode/opencode.json +8 -0
- package/opencode/plugin.ts +818 -0
- package/package.json +36 -4
- package/scripts/admin-merge-ready.sh +545 -0
- package/scripts/admin-merge-ready.test.sh +753 -0
- package/scripts/affected-tests.sh +908 -0
- package/scripts/affected-tests.test.sh +1797 -0
- package/scripts/alpha-metrics.sh +78 -0
- package/scripts/alpha-metrics.test.sh +115 -0
- package/scripts/ancestor-signal-helpers.baseline.txt +16 -0
- package/scripts/audit-flag-flip.sh +107 -0
- package/scripts/check-red-on-main.sh +316 -0
- package/scripts/ci-head-verdict.sh +411 -0
- package/scripts/cloud-detect.sh +193 -0
- package/scripts/delegation-verify.sh +657 -0
- package/scripts/delegation-verify.test.sh +1424 -0
- package/scripts/deploy-arm.sh +475 -0
- package/scripts/domain-model-drift.sh +419 -0
- package/scripts/emit-decision.sh +144 -0
- package/scripts/emit-decision.test.sh +144 -0
- package/scripts/ext-filter-divergence-corpus.txt +15 -0
- package/scripts/ext-filter-divergence.sh +189 -0
- package/scripts/generate-c4-from-components.ts +442 -0
- package/scripts/grok-fidelity-gate.sh +68 -0
- package/scripts/grok-pre-push-gate.sh +232 -0
- package/scripts/harness-discovery-smoke.ts +906 -0
- package/scripts/harness-parity-census.ts +92 -0
- package/scripts/inngest-luks-alert-armed-probe.ts +29 -0
- package/scripts/install-opencode-adapter.ts +509 -0
- package/scripts/lib/affected-tests/common.sh +365 -0
- package/scripts/lib/affected-tests/go.sh +157 -0
- package/scripts/lib/affected-tests/js.sh +188 -0
- package/scripts/lib/affected-tests/nx-turbo.sh +98 -0
- package/scripts/lib/affected-tests/python.sh +185 -0
- package/scripts/lib/context-sanitize.sh +49 -0
- package/scripts/lib/domain-model-lib.sh +180 -0
- package/scripts/lib/ext-filter-grammar.tsv +34 -0
- package/scripts/lib/operator-script.sh +1236 -0
- package/scripts/lib/proc.sh +580 -0
- package/scripts/lib/session-state.sh +748 -0
- package/scripts/lib/tmp-classify.sh +843 -0
- package/scripts/lib/wrapper-boundary.sh +47 -0
- package/scripts/lint-ratchet.py +1547 -0
- package/scripts/monitor-pr-checks.sh +441 -0
- package/scripts/pipeline-tally.sh +756 -0
- package/scripts/pipeline-tally.test.sh +740 -0
- package/scripts/plugin-version.sh +528 -0
- package/scripts/precommit-guard.sh +115 -0
- package/scripts/precommit-guard.test.sh +254 -0
- package/scripts/reconcile-live-heartbeats.ts +705 -0
- package/scripts/render-c4-model.sh +217 -0
- package/scripts/resolve-git-root.sh +55 -0
- package/scripts/resolve-regenerable-conflicts.sh +363 -0
- package/scripts/resolve-regenerable-conflicts.test.sh +780 -0
- package/scripts/ruff-requirements.txt +22 -0
- package/scripts/run-in-pid-namespace.sh +98 -0
- package/scripts/run-in-pid-namespace.test.sh +290 -0
- package/scripts/scan-ancestor-signal-helpers.py +556 -0
- package/scripts/scan-ancestor-signal-helpers.test.sh +670 -0
- package/scripts/setup-ralph-loop.sh +238 -0
- package/scripts/sync-cursor-name-map.ts +316 -0
- package/scripts/sync-grok-agent-compat.ts +188 -0
- package/scripts/sync-npm-package.ts +165 -0
- package/scripts/sync-opencode-adapter.ts +498 -0
- package/scripts/sync-pr-behind.sh +647 -0
- package/scripts/sync-pr-behind.test.sh +252 -0
- package/scripts/taste-profile-update.sh +180 -0
- package/scripts/taste-profile-update.test.sh +167 -0
- package/scripts/write-budget-marker.sh +23 -0
- package/scripts/write-kb-coverage.ts +113 -0
- package/skills/admin-ip-refresh/SKILL.md +81 -0
- package/skills/admin-ip-refresh/references/admin-ip-refresh-procedure.md +201 -0
- package/skills/agent-browser/SKILL.md +698 -0
- package/skills/agent-browser/scripts/playwright-mcp-profile-slot.sh +304 -0
- package/skills/agent-browser/scripts/playwright-mcp-redact-proxy.py +964 -0
- package/skills/agent-browser/scripts/redact-a11y-snapshot.py +443 -0
- package/skills/agent-browser/test/fixtures/capture-playwright-mcp-fixtures.py +217 -0
- package/skills/agent-browser/test/fixtures/fake-passthrough-proxy.py +24 -0
- package/skills/agent-browser/test/fixtures/fake-playwright-mcp.py +131 -0
- package/skills/agent-browser/test/fixtures/make-proxy-mutant.py +48 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/dialog-link-injection.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/empty-content.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-and-result.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-code-bool.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-code-string.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-message-tree.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-no-data.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-string.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/error-with-data.json +9 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/evaluate-escaped-object.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/invalid-utf8.json +4 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/link-result.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/list-two-results.json +6 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/meta-in-result.json +13 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/no-content.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/quoted-key.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/resource-block.json +18 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/result-and-method.json +11 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/result-string.json +3 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped-one-row.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/structured-content.json +13 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/tools-list-no-tools.json +5 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/tree-no-credential.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/two-text-blocks.json +14 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/unparsable-line.json +3 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-brace.json +10 -0
- package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-link-substring.json +10 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/close.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/evaluate.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/find.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/framing.json +6 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/initialize.json +14 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate-link.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/roots-list-request.json +5 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/screenshot.json +17 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-filename.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-json.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-raw.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot.json +12 -0
- package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/tools-list.json +827 -0
- package/skills/agent-browser/test/fixtures/proxy-session-driver.py +138 -0
- package/skills/agent-browser/test/fixtures/session-facts.py +102 -0
- package/skills/agent-browser/test/playwright-mcp-lifetime.test.sh +1620 -0
- package/skills/agent-browser/test/playwright-mcp-redact-proxy.test.sh +1599 -0
- package/skills/agent-browser/test/redact-a11y-snapshot.test.sh +527 -0
- package/skills/agent-native-architecture/SKILL.md +479 -0
- package/skills/agent-native-architecture/references/action-parity-discipline.md +430 -0
- package/skills/agent-native-architecture/references/agent-execution-patterns.md +483 -0
- package/skills/agent-native-architecture/references/agent-native-testing.md +605 -0
- package/skills/agent-native-architecture/references/architecture-patterns.md +493 -0
- package/skills/agent-native-architecture/references/dynamic-context-injection.md +358 -0
- package/skills/agent-native-architecture/references/files-universal-interface.md +314 -0
- package/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +381 -0
- package/skills/agent-native-architecture/references/mcp-tool-design.md +524 -0
- package/skills/agent-native-architecture/references/mobile-patterns.md +897 -0
- package/skills/agent-native-architecture/references/product-implications.md +478 -0
- package/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +342 -0
- package/skills/agent-native-architecture/references/self-modification.md +294 -0
- package/skills/agent-native-architecture/references/shared-workspace-architecture.md +700 -0
- package/skills/agent-native-architecture/references/system-prompt-design.md +263 -0
- package/skills/agent-native-audit/SKILL.md +300 -0
- package/skills/agent-native-audit/workflows/agent-native-audit.workflow.js +423 -0
- package/skills/andrew-kane-gem-writer/SKILL.md +189 -0
- package/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
- package/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
- package/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
- package/skills/andrew-kane-gem-writer/references/resources.md +126 -0
- package/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
- package/skills/architecture/SKILL.md +436 -0
- package/skills/architecture/references/adr-template.md +154 -0
- package/skills/architecture/references/likec4-reference.md +136 -0
- package/skills/architecture/references/nfr-reference.md +126 -0
- package/skills/archive-kb/SKILL.md +86 -0
- package/skills/archive-kb/scripts/archive-kb.sh +300 -0
- package/skills/archive-kb/test/archive-kb-partial-run.test.sh +276 -0
- package/skills/atdd-developer/SKILL.md +65 -0
- package/skills/brainstorm/SKILL.md +701 -0
- package/skills/brainstorm/references/brainstorm-brand-workshop.md +153 -0
- package/skills/brainstorm/references/brainstorm-domain-config.md +63 -0
- package/skills/brainstorm/references/brainstorm-validation-workshop.md +65 -0
- package/skills/brainstorm/references/ui-surface-terms.md +42 -0
- package/skills/brainstorm-techniques/SKILL.md +231 -0
- package/skills/brainstorm-techniques/references/decision-principles.md +150 -0
- package/skills/brainstorm-techniques/references/phase-boundaries.md +103 -0
- package/skills/brainstorm-techniques/references/standing-delegation.md +407 -0
- package/skills/brainstorm-techniques/references/technical-ruling-delegation.md +174 -0
- package/skills/campaign-calendar/SKILL.md +145 -0
- package/skills/cf-token-scope/SKILL.md +164 -0
- package/skills/cf-token-scope/references/widen-playbook.md +114 -0
- package/skills/cf-token-scope/scripts/cf-token-scope.sh +253 -0
- package/skills/changelog/SKILL.md +142 -0
- package/skills/code-to-prd/SKILL.md +66 -0
- package/skills/code-to-prd/references/banner-template.md +12 -0
- package/skills/code-to-prd/references/prd-template.md +41 -0
- package/skills/code-to-prd/scripts/code-to-prd.sh +634 -0
- package/skills/code-to-prd/test/code-to-prd.test.sh +447 -0
- package/skills/code-to-prd/test/fixture/.env.example +7 -0
- package/skills/code-to-prd/test/fixture/app/about/page.tsx +11 -0
- package/skills/code-to-prd/test/fixture/app/api/health/route.ts +10 -0
- package/skills/code-to-prd/test/fixture/app/page.tsx +14 -0
- package/skills/code-to-prd/test/fixture/next.config.mjs +3 -0
- package/skills/code-to-prd/test/fixture/package.json +6 -0
- package/skills/cohort-status/SKILL.md +62 -0
- package/skills/community/SKILL.md +210 -0
- package/skills/community/scripts/bsky-community.sh +644 -0
- package/skills/community/scripts/bsky-setup.sh +631 -0
- package/skills/community/scripts/community-router.sh +93 -0
- package/skills/community/scripts/discord-community.sh +487 -0
- package/skills/community/scripts/discord-setup.sh +784 -0
- package/skills/community/scripts/github-community.sh +706 -0
- package/skills/community/scripts/hn-community.sh +233 -0
- package/skills/community/scripts/lib/hmac-sha1-b64.sh +126 -0
- package/skills/community/scripts/linkedin-community.sh +750 -0
- package/skills/community/scripts/linkedin-setup.sh +758 -0
- package/skills/community/scripts/x-community.sh +890 -0
- package/skills/community/scripts/x-setup.sh +713 -0
- package/skills/community/test/community-argv.test.sh +2922 -0
- package/skills/community/test/github-community.test.sh +981 -0
- package/skills/competitive-analysis/SKILL.md +69 -0
- package/skills/competitive-analysis/references/peer-plugin-audit.md +218 -0
- package/skills/compound/SKILL.md +673 -0
- package/skills/compound/scripts/token-efficiency-report.sh +334 -0
- package/skills/compound/test/phase-16.test.sh +379 -0
- package/skills/compound-capture/SKILL.md +791 -0
- package/skills/compound-capture/assets/critical-pattern-template.md +37 -0
- package/skills/compound-capture/assets/resolution-template.md +116 -0
- package/skills/compound-capture/references/yaml-schema.md +67 -0
- package/skills/compound-capture/schema.yaml +181 -0
- package/skills/constraint-scaffold/SKILL.md +175 -0
- package/skills/constraint-scaffold/references/boundary-readme.template +35 -0
- package/skills/constraint-scaffold/references/constraint-gates-workflow.template +69 -0
- package/skills/constraint-scaffold/references/depcruise-config.template +230 -0
- package/skills/constraint-scaffold/references/fix-constraints-stage-a.template +240 -0
- package/skills/constraint-scaffold/references/fix-constraints-stage-b.template +313 -0
- package/skills/constraint-scaffold/references/shared-runner.template +135 -0
- package/skills/constraint-scaffold/scripts/constraint-scaffold.sh +589 -0
- package/skills/constraint-scaffold/test/bite-proof.test.sh +1338 -0
- package/skills/constraint-scaffold/test/boundary.test.sh +734 -0
- package/skills/constraint-scaffold/test/emit-fix-constraints.test.sh +193 -0
- package/skills/constraint-scaffold/test/generator.test.sh +93 -0
- package/skills/constraint-scaffold/test/parity.test.sh +285 -0
- package/skills/content-writer/SKILL.md +242 -0
- package/skills/content-writer/scripts/blog-jargon-scan.sh +42 -0
- package/skills/cron-delete/SKILL.md +56 -0
- package/skills/cron-list/SKILL.md +54 -0
- package/skills/deepen-plan/SKILL.md +937 -0
- package/skills/deepen-plan/workflows/deepen-plan.workflow.js +488 -0
- package/skills/deploy/SKILL.md +115 -0
- package/skills/deploy/references/hetzner-setup.md +67 -0
- package/skills/deploy/scripts/deploy.sh +37 -0
- package/skills/deploy-docs/SKILL.md +95 -0
- package/skills/dhh-rails-style/SKILL.md +203 -0
- package/skills/dhh-rails-style/references/architecture.md +717 -0
- package/skills/dhh-rails-style/references/controllers.md +323 -0
- package/skills/dhh-rails-style/references/frontend.md +556 -0
- package/skills/dhh-rails-style/references/gems.md +316 -0
- package/skills/dhh-rails-style/references/models.md +388 -0
- package/skills/dhh-rails-style/references/testing.md +354 -0
- package/skills/discord-content/SKILL.md +126 -0
- package/skills/docs-site/SKILL.md +214 -0
- package/skills/drain-labeled-backlog/SKILL.md +203 -0
- package/skills/drain-labeled-backlog/scripts/group-by-area.sh +208 -0
- package/skills/drain-labeled-backlog/workflows/drain-labeled-backlog.workflow.js +433 -0
- package/skills/drain-prs/SKILL.md +143 -0
- package/skills/drain-prs/scripts/triage-prs.sh +192 -0
- package/skills/drain-prs/test/argv-ceiling.test.sh +183 -0
- package/skills/dspy-ruby/SKILL.md +634 -0
- package/skills/dspy-ruby/assets/config-template.rb +359 -0
- package/skills/dspy-ruby/assets/module-template.rb +326 -0
- package/skills/dspy-ruby/assets/signature-template.rb +143 -0
- package/skills/dspy-ruby/references/core-concepts.md +268 -0
- package/skills/dspy-ruby/references/optimization.md +623 -0
- package/skills/dspy-ruby/references/providers.md +335 -0
- package/skills/eval-harness/README.md +194 -0
- package/skills/eval-harness/SKILL.md +157 -0
- package/skills/eval-harness/enums/go-routes.json +13 -0
- package/skills/eval-harness/enums/incident-threshold.json +5 -0
- package/skills/eval-harness/enums/lane.json +5 -0
- package/skills/eval-harness/enums/tool-selection.json +20 -0
- package/skills/eval-harness/enums/triage-levels.json +5 -0
- package/skills/eval-harness/gated-skills.json +34 -0
- package/skills/eval-harness/models.generated.json +5 -0
- package/skills/eval-harness/promptfooconfig-go-routing.yaml +35 -0
- package/skills/eval-harness/promptfooconfig-incident-threshold.yaml +32 -0
- package/skills/eval-harness/promptfooconfig-lane-inference.yaml +33 -0
- package/skills/eval-harness/promptfooconfig-ticket-triage.yaml +34 -0
- package/skills/eval-harness/promptfooconfig-tool-selection.yaml +33 -0
- package/skills/eval-harness/prompts/go-baseline.txt +6 -0
- package/skills/eval-harness/prompts/go-skill.txt +21 -0
- package/skills/eval-harness/prompts/incident-threshold-baseline.txt +6 -0
- package/skills/eval-harness/prompts/incident-threshold-skill.txt +12 -0
- package/skills/eval-harness/prompts/lane-inference-baseline.txt +6 -0
- package/skills/eval-harness/prompts/lane-inference-skill.txt +15 -0
- package/skills/eval-harness/prompts/tool-selection-baseline.txt +19 -0
- package/skills/eval-harness/prompts/tool-selection-skill.txt +22 -0
- package/skills/eval-harness/prompts/triage-baseline.txt +7 -0
- package/skills/eval-harness/prompts/triage-skill.txt +10 -0
- package/skills/eval-harness/scripts/eval-gate.cjs +318 -0
- package/skills/eval-harness/scripts/extract-block.cjs +87 -0
- package/skills/eval-harness/scripts/gate-classification.cjs +28 -0
- package/skills/eval-harness/scripts/gen-models.sh +41 -0
- package/skills/eval-harness/scripts/gen-skill-prompt.cjs +177 -0
- package/skills/eval-harness/scripts/measure-classification.cjs +30 -0
- package/skills/eval-harness/scripts/parse-label.cjs +93 -0
- package/skills/eval-harness/scripts/verdict.cjs +132 -0
- package/skills/eval-harness/tasks/go-routing.jsonl +8 -0
- package/skills/eval-harness/tasks/incident-threshold.jsonl +7 -0
- package/skills/eval-harness/tasks/lane-inference.jsonl +7 -0
- package/skills/eval-harness/tasks/ticket-triage.jsonl +6 -0
- package/skills/eval-harness/tasks/tool-selection.jsonl +15 -0
- package/skills/eval-harness/test/eval-gate.test.sh +132 -0
- package/skills/eval-harness/test/extract-block.test.sh +87 -0
- package/skills/eval-harness/test/gate-classification.test.sh +77 -0
- package/skills/eval-harness/test/gen-models.test.sh +75 -0
- package/skills/eval-harness/test/measure-classification.test.sh +74 -0
- package/skills/eval-harness/test/parse-label.test.sh +129 -0
- package/skills/eval-harness/test/registry-completeness.test.sh +109 -0
- package/skills/eval-harness/test/verdict.test.sh +123 -0
- package/skills/every-style-editor/SKILL.md +142 -0
- package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
- package/skills/feature-tweet/SKILL.md +199 -0
- package/skills/feature-video/SKILL.md +412 -0
- package/skills/feature-video/scripts/check_deps.sh +281 -0
- package/skills/file-todos/SKILL.md +267 -0
- package/skills/file-todos/assets/todo-template.md +166 -0
- package/skills/fix-issue/SKILL.md +278 -0
- package/skills/fix-issue/references/agent-authored-exclusion.md +120 -0
- package/skills/fix-issue/references/exclude-label-jq-snippet.md +97 -0
- package/skills/flag-bootstrap/SETUP.md +142 -0
- package/skills/flag-create/SKILL.md +145 -0
- package/skills/flag-create/scripts/create.sh +273 -0
- package/skills/flag-delete/SKILL.md +167 -0
- package/skills/flag-delete/scripts/delete.sh +288 -0
- package/skills/flag-list/SKILL.md +99 -0
- package/skills/flag-list/scripts/list.sh +275 -0
- package/skills/flag-set-role/SKILL.md +229 -0
- package/skills/flag-set-role/scripts/flip.sh +774 -0
- package/skills/frontend-anti-slop/SKILL.md +106 -0
- package/skills/frontend-anti-slop/references/anti-patterns.md +199 -0
- package/skills/frontend-anti-slop/references/slop-rules.md +65 -0
- package/skills/frontend-anti-slop/scripts/tier1-scan.ts +525 -0
- package/skills/frontend-design/SKILL.md +77 -0
- package/skills/gdpr-gate/NOTICE +136 -0
- package/skills/gdpr-gate/SKILL.md +341 -0
- package/skills/gdpr-gate/references/fields.md +160 -0
- package/skills/gdpr-gate/references/layers/api-layer.md +355 -0
- package/skills/gdpr-gate/references/layers/auth-sessions.md +290 -0
- package/skills/gdpr-gate/references/layers/data-in-transit.md +331 -0
- package/skills/gdpr-gate/references/layers/data-lifecycle.md +341 -0
- package/skills/gdpr-gate/references/layers/frontend.md +249 -0
- package/skills/gdpr-gate/references/layers/testing-seeding.md +256 -0
- package/skills/gdpr-gate/references/leakage-vectors.md +248 -0
- package/skills/gdpr-gate/references/legacy/legal-consent-v1-prose.md +48 -0
- package/skills/gdpr-gate/references/legal-consent.md +140 -0
- package/skills/gdpr-gate/references/non-negotiables.md +60 -0
- package/skills/gdpr-gate/scripts/gdpr-gate.sh +271 -0
- package/skills/gdpr-gate/scripts/notice-frontmatter.sh +337 -0
- package/skills/gdpr-gate/scripts/path-denylist.txt +39 -0
- package/skills/gdpr-gate/scripts/repo-scan.sh +158 -0
- package/skills/gdpr-gate/scripts/vendor-drift-classify.sh +120 -0
- package/skills/gdpr-gate/scripts/vendor-pin-integrity.sh +237 -0
- package/skills/gemini-imagegen/SKILL.md +283 -0
- package/skills/gemini-imagegen/requirements.txt +5 -0
- package/skills/gemini-imagegen/scripts/_error_handling.py +146 -0
- package/skills/gemini-imagegen/scripts/compose_images.py +150 -0
- package/skills/gemini-imagegen/scripts/edit_image.py +137 -0
- package/skills/gemini-imagegen/scripts/gemini_images.py +256 -0
- package/skills/gemini-imagegen/scripts/generate_image.py +147 -0
- package/skills/gemini-imagegen/scripts/multi_turn_chat.py +223 -0
- package/skills/gemini-imagegen/scripts/test_error_handling.py +179 -0
- package/skills/git-worktree/SKILL.md +534 -0
- package/skills/git-worktree/scripts/git-repo-readiness-diag.sh +98 -0
- package/skills/git-worktree/scripts/worktree-manager.sh +4773 -0
- package/skills/git-worktree/test/create-from-origin-main.test.sh +116 -0
- package/skills/git-worktree/test/lease-protects-active.test.sh +1056 -0
- package/skills/git-worktree/test/no-repo-fail-loud.test.sh +88 -0
- package/skills/git-worktree/test/orphan-reaper-honest-count.test.sh +379 -0
- package/skills/git-worktree/test/reap-archive-persistence.test.sh +725 -0
- package/skills/git-worktree/test/stale-lock-sweep.test.sh +176 -0
- package/skills/go/SKILL.md +54 -0
- package/skills/growth/SKILL.md +164 -0
- package/skills/harvest-debt/SKILL.md +78 -0
- package/skills/harvest-debt/scripts/harvest-debt.sh +114 -0
- package/skills/heal-skill/SKILL.md +173 -0
- package/skills/help/SKILL.md +46 -0
- package/skills/incident/NOTICE +39 -0
- package/skills/incident/SKILL.md +395 -0
- package/skills/incident/scripts/dry-run.sh +448 -0
- package/skills/incident/scripts/redact-engine.py +412 -0
- package/skills/incident/scripts/redact-sentinel.sh +44 -0
- package/skills/incident/templates/pir.md +139 -0
- package/skills/incident/test/fixtures/dry-run-incident.json +26 -0
- package/skills/incident/test/fixtures/dry-run-secret-leak.json +26 -0
- package/skills/incident/test/fixtures/legacy-bash-scanner.sh +82 -0
- package/skills/incident/test/fixtures/positive-corpus.md +87 -0
- package/skills/incident/test/redact-sentinel.test.sh +1420 -0
- package/skills/invoice/SKILL.md +206 -0
- package/skills/kb-glossary/SKILL.md +71 -0
- package/skills/kb-glossary/references/glossary-format.md +111 -0
- package/skills/kb-glossary/references/rejected-request-register.md +115 -0
- package/skills/kb-search/SKILL.md +276 -0
- package/skills/kb-search/scripts/kb-search-cache.sh +123 -0
- package/skills/legal-audit/SKILL.md +161 -0
- package/skills/legal-generate/NOTICE +242 -0
- package/skills/legal-generate/SKILL.md +244 -0
- package/skills/legal-generate/references/templates/advisor-agreement/template.md +12 -0
- package/skills/legal-generate/references/templates/business-associate-agreement/template.md +112 -0
- package/skills/legal-generate/references/templates/cookie-notice/template.md +82 -0
- package/skills/legal-generate/references/templates/dpa-global/template.md +439 -0
- package/skills/legal-generate/references/templates/dpa-us/template.md +222 -0
- package/skills/legal-generate/references/templates/employee-offer-letter/template.md +75 -0
- package/skills/legal-generate/references/templates/master-services-agreement/template.md +252 -0
- package/skills/legal-generate/references/templates/mutual-nda/template.md +66 -0
- package/skills/legal-generate/references/templates/one-way-nda/template.md +38 -0
- package/skills/legal-generate/references/templates/privacy-policy-gdpr/template.md +427 -0
- package/skills/legal-generate/references/templates/privacy-policy-us/template.md +313 -0
- package/skills/legal-generate/references/templates/terms-of-use/template.md +75 -0
- package/skills/legal-generate/scripts/strip-vendor-credit.sh +96 -0
- package/skills/linear-fetch/SKILL.md +247 -0
- package/skills/linear-fetch/scripts/assert-no-linear-telemetry.sh +66 -0
- package/skills/linear-fetch/scripts/redact-linear-urls.sh +51 -0
- package/skills/linear-fetch/scripts/render-caller-template.sh +36 -0
- package/skills/linear-fetch/test/assert-no-linear-telemetry.test.sh +113 -0
- package/skills/linear-fetch/test/parity.test.sh +112 -0
- package/skills/linear-fetch/test/persist-safe-integration.test.sh +191 -0
- package/skills/linear-fetch/test/redact-linear-urls.test.sh +226 -0
- package/skills/merge-pr/SKILL.md +670 -0
- package/skills/model-launch-review/SKILL.md +255 -0
- package/skills/model-launch-review/scripts/audit-models.sh +501 -0
- package/skills/one-shot/SKILL.md +316 -0
- package/skills/one-shot/references/token-discipline.md +74 -0
- package/skills/operator-bootstrap/SKILL.md +412 -0
- package/skills/operator-bootstrap/template.sh +439 -0
- package/skills/operator-digest/SKILL.md +287 -0
- package/skills/operator-digest/assets/operator-digest.workflow.yml +175 -0
- package/skills/operator-digest/scripts/digest-scrub.sh +119 -0
- package/skills/operator-digest/scripts/provision-operator-digest-repo.sh +147 -0
- package/skills/operator-rephrase/SKILL.md +98 -0
- package/skills/pencil-setup/SKILL.md +201 -0
- package/skills/pencil-setup/scripts/check_deps.sh +556 -0
- package/skills/pencil-setup/scripts/copy_adapter.sh +80 -0
- package/skills/pencil-setup/scripts/package-lock.json +1172 -0
- package/skills/pencil-setup/scripts/package.json +14 -0
- package/skills/pencil-setup/scripts/pencil-error-enrichment.mjs +21 -0
- package/skills/pencil-setup/scripts/pencil-mcp-adapter.mjs +733 -0
- package/skills/pencil-setup/scripts/pencil-response-classify.mjs +38 -0
- package/skills/pencil-setup/scripts/pencil-save-gate.mjs +26 -0
- package/skills/pencil-setup/scripts/sanitize-filename.mjs +25 -0
- package/skills/plan/SKILL.md +1140 -0
- package/skills/plan/references/differential-migration-testing.md +185 -0
- package/skills/plan/references/plan-community-discovery.md +42 -0
- package/skills/plan/references/plan-founder-check.md +137 -0
- package/skills/plan/references/plan-functional-overlap.md +25 -0
- package/skills/plan/references/plan-host-fanout.md +51 -0
- package/skills/plan/references/plan-issue-templates.md +779 -0
- package/skills/plan/references/plan-network-outage-checklist.md +131 -0
- package/skills/plan/references/plan-scope-check.md +126 -0
- package/skills/plan/references/plan-sharp-edges.md +331 -0
- package/skills/plan/references/plan-signoff-lifecycle.md +12 -0
- package/skills/plan/references/webapp-cwv-observability.md +143 -0
- package/skills/plan-review/SKILL.md +91 -0
- package/skills/plan-review/lib/named-panel.mjs +58 -0
- package/skills/plan-review/workflows/plan-review.workflow.js +477 -0
- package/skills/postmerge/SKILL.md +642 -0
- package/skills/postmerge/references/deploy-status-debugging.md +141 -0
- package/skills/postmerge/references/graceful-degradation.md +20 -0
- package/skills/postmerge/references/sentry-error-count-delta.md +137 -0
- package/skills/preflight/SKILL.md +1553 -0
- package/skills/preflight/references/check-13-founder-check.md +286 -0
- package/skills/preflight/scripts/founder-check.py +1640 -0
- package/skills/preflight/scripts/parse-form-a.awk +107 -0
- package/skills/preflight/scripts/probe-verb-gate.sh +108 -0
- package/skills/product-roadmap/SKILL.md +357 -0
- package/skills/product-roadmap/scripts/roadmap-reconcile.sh +327 -0
- package/skills/provision-cloudflare/SKILL.md +67 -0
- package/skills/provision-cloudflare/scripts/provision-cloudflare.sh +271 -0
- package/skills/provision-doppler/SKILL.md +58 -0
- package/skills/provision-doppler/scripts/provision-doppler.sh +358 -0
- package/skills/provision-github/SKILL.md +59 -0
- package/skills/provision-github/scripts/provision-github.sh +300 -0
- package/skills/provision-hetzner/SKILL.md +76 -0
- package/skills/provision-hetzner/scripts/provision-hetzner.sh +262 -0
- package/skills/provision-hetzner/test/fixture/knowledge-base/legal/tenant-dpa-register.md +26 -0
- package/skills/provision-hetzner/test/fixture/provision-hetzner-dry-run.golden +34 -0
- package/skills/provision-hetzner/test/provision-hetzner-characterization.test.sh +227 -0
- package/skills/qa/SKILL.md +263 -0
- package/skills/qa/references/browser-preflight.md +22 -0
- package/skills/questionnaire-generate/SKILL.md +328 -0
- package/skills/questionnaire-generate/references/questionnaire.template +60 -0
- package/skills/rclone/SKILL.md +162 -0
- package/skills/rclone/scripts/check_setup.sh +63 -0
- package/skills/release-announce/SKILL.md +65 -0
- package/skills/release-docs/SKILL.md +92 -0
- package/skills/reproduce-bug/SKILL.md +358 -0
- package/skills/resolve-debt/SKILL.md +85 -0
- package/skills/resolve-debt/scripts/resolve-debt.py +584 -0
- package/skills/resolve-parallel/SKILL.md +45 -0
- package/skills/resolve-parallel/workflows/resolve-parallel.workflow.js +415 -0
- package/skills/resolve-pr-parallel/SKILL.md +68 -0
- package/skills/resolve-pr-parallel/workflows/resolve-pr-parallel.workflow.js +419 -0
- package/skills/resolve-todo-parallel/SKILL.md +57 -0
- package/skills/resolve-todo-parallel/workflows/resolve-todo-parallel.workflow.js +398 -0
- package/skills/review/SKILL.md +1620 -0
- package/skills/review/references/anti-slop-scanner-hook.md +40 -0
- package/skills/review/references/defect-classes-migrations.md +9 -0
- package/skills/review/references/generated-input-oracle-surfaces.md +15 -0
- package/skills/review/references/review-e2e-testing.md +116 -0
- package/skills/review/references/review-evidence-comment.md +36 -0
- package/skills/review/references/review-todo-structure.md +165 -0
- package/skills/review/references/risk-tier-and-fix-rounds.md +97 -0
- package/skills/review/references/semgrep-custom-rules.yaml +174 -0
- package/skills/review/references/ultrathink-phases.md +98 -0
- package/skills/review/references/wfs.md +6 -0
- package/skills/review/scripts/emit-review-trailer.sh +499 -0
- package/skills/review/scripts/ensure-semgrep.sh +99 -0
- package/skills/review/scripts/fix-round-seats.sh +197 -0
- package/skills/review/test/emit-review-trailer.test.sh +387 -0
- package/skills/review/test/ensure-semgrep.test.sh +111 -0
- package/skills/review/test/fix-round-seats.test.sh +237 -0
- package/skills/review/workflows/README.md +147 -0
- package/skills/review/workflows/review.workflow.js +667 -0
- package/skills/schedule/SKILL.md +796 -0
- package/skills/seo-aeo/SKILL.md +139 -0
- package/skills/seo-aeo/scripts/validate-csp.sh +233 -0
- package/skills/seo-aeo/scripts/validate-seo.sh +262 -0
- package/skills/ship/SKILL.md +3023 -0
- package/skills/ship/references/adr-ordinal-collision.md +47 -0
- package/skills/ship/references/affected-gate-contract.md +115 -0
- package/skills/ship/references/ci-run-diagnosis.md +29 -0
- package/skills/ship/references/ci-workflow-authoring.md +68 -0
- package/skills/ship/references/cleanup-merged-archival.md +39 -0
- package/skills/ship/references/counsel-review-clo-attestation.md +38 -0
- package/skills/ship/references/cto-ruling-armed-push.md +5 -0
- package/skills/ship/references/decision-challenges-render.md +71 -0
- package/skills/ship/references/delegated-act-authoring-form.md +7 -0
- package/skills/ship/references/detached-battery-verdict.md +13 -0
- package/skills/ship/references/epic-close-sweep.md +62 -0
- package/skills/ship/references/feature-tweet-draft.md +42 -0
- package/skills/ship/references/followthrough-issue-body-template.md +47 -0
- package/skills/ship/references/followthrough-stub-template.sh +92 -0
- package/skills/ship/references/merge-queue-dequeue.md +39 -0
- package/skills/ship/references/operator-holds.md +179 -0
- package/skills/ship/references/pipeline-tally-render.md +43 -0
- package/skills/ship/references/pr-overlap.md +153 -0
- package/skills/ship/references/queue-mode.md +7 -0
- package/skills/ship/references/ready-run-wait.md +36 -0
- package/skills/ship/references/red-on-main-quarantine.md +110 -0
- package/skills/ship/references/register-update-pr-pattern.md +88 -0
- package/skills/ship/references/settle-then-admin-merge.md +130 -0
- package/skills/ship/references/supabase-column-probe.md +13 -0
- package/skills/ship/scripts/auto-close-scan.sh +76 -0
- package/skills/ship/scripts/battery-owed.sh +403 -0
- package/skills/ship/scripts/hold-gate-eval.sh +410 -0
- package/skills/ship/scripts/net-issue-flow.sh +665 -0
- package/skills/ship/scripts/pr-overlap-preflight.sh +483 -0
- package/skills/ship/scripts/ship-pir-action-items-gate.sh +246 -0
- package/skills/ship/scripts/technical-ruling-gate.sh +444 -0
- package/skills/skill-creator/SKILL.md +299 -0
- package/skills/skill-creator/references/api-security.md +248 -0
- package/skills/skill-creator/references/authoring-levers.md +110 -0
- package/skills/skill-creator/references/be-clear-and-direct.md +587 -0
- package/skills/skill-creator/references/best-practices.md +431 -0
- package/skills/skill-creator/references/common-patterns.md +639 -0
- package/skills/skill-creator/references/core-principles.md +193 -0
- package/skills/skill-creator/references/executable-code.md +188 -0
- package/skills/skill-creator/references/iteration-and-testing.md +509 -0
- package/skills/skill-creator/references/official-spec.md +193 -0
- package/skills/skill-creator/references/recommended-structure.md +180 -0
- package/skills/skill-creator/references/skill-structure.md +396 -0
- package/skills/skill-creator/references/using-scripts.md +122 -0
- package/skills/skill-creator/references/using-templates.md +120 -0
- package/skills/skill-creator/references/workflows-and-validation.md +541 -0
- package/skills/skill-creator/scripts/init_skill.py +322 -0
- package/skills/skill-creator/scripts/package_skill.py +110 -0
- package/skills/skill-creator/scripts/quick_validate.py +64 -0
- package/skills/skill-creator/templates/router-skill.md +73 -0
- package/skills/skill-creator/templates/simple-skill.md +34 -0
- package/skills/skill-creator/workflows/add-reference.md +96 -0
- package/skills/skill-creator/workflows/add-script.md +104 -0
- package/skills/skill-creator/workflows/add-template.md +83 -0
- package/skills/skill-creator/workflows/add-workflow.md +128 -0
- package/skills/skill-creator/workflows/audit-skill.md +159 -0
- package/skills/skill-creator/workflows/create-domain-expertise-skill.md +623 -0
- package/skills/skill-creator/workflows/create-new-skill.md +207 -0
- package/skills/skill-creator/workflows/get-guidance.md +134 -0
- package/skills/skill-creator/workflows/upgrade-to-router.md +170 -0
- package/skills/skill-creator/workflows/verify-skill.md +226 -0
- package/skills/skill-security-scan/SKILL.md +145 -0
- package/skills/skill-security-scan/references/disclaimer.md +21 -0
- package/skills/skill-security-scan/references/first-party-allowlist.yaml +38 -0
- package/skills/skill-security-scan/references/override-artifact-schema.json +68 -0
- package/skills/skill-security-scan/references/override-mechanism.md +171 -0
- package/skills/skill-security-scan/references/redirect-domains.yaml +27 -0
- package/skills/skill-security-scan/references/regex-patterns.md +136 -0
- package/skills/skill-security-scan/references/rules/code-exec.yaml +70 -0
- package/skills/skill-security-scan/references/rules/filesystem-boundary.yaml +29 -0
- package/skills/skill-security-scan/references/rules/manifest.yaml +44 -0
- package/skills/skill-security-scan/references/rules/supply-chain.yaml +36 -0
- package/skills/skill-security-scan/references/scan-meta-schema.json +63 -0
- package/skills/skill-security-scan/references/test-fixtures/clean-soleur-style.skill.md +23 -0
- package/skills/skill-security-scan/references/test-fixtures/clean-third-party.skill.md +26 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-codeexec.skill.md +23 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-curl-pipe-bash.skill.md +69 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-prompt-injection.skill.md +17 -0
- package/skills/skill-security-scan/references/test-fixtures/malicious-telemetry-beacon.skill.md +23 -0
- package/skills/skill-security-scan/references/typosquat-targets.yaml +65 -0
- package/skills/skill-security-scan/scripts/check-codeexec.sh +41 -0
- package/skills/skill-security-scan/scripts/check-filesystem-boundary.sh +19 -0
- package/skills/skill-security-scan/scripts/check-prompt-injection.sh +95 -0
- package/skills/skill-security-scan/scripts/check-supply-chain.sh +219 -0
- package/skills/skill-security-scan/scripts/check-telemetry-surface.sh +126 -0
- package/skills/skill-security-scan/scripts/lib.sh +197 -0
- package/skills/skill-security-scan/scripts/parse-override.sh +231 -0
- package/skills/skill-security-scan/scripts/run-scan.sh +342 -0
- package/skills/skill-security-scan/scripts/run-self-test.sh +95 -0
- package/skills/skill-security-scan/test/argv-ceiling.test.sh +180 -0
- package/skills/skill-security-scan/test/meta-dir-reap.test.sh +411 -0
- package/skills/skill-security-scan/test/parse-override.test.sh +607 -0
- package/skills/skill-security-scan/test/redact-pii-ghs-shape.test.sh +251 -0
- package/skills/social-distribute/SKILL.md +485 -0
- package/skills/spec-templates/SKILL.md +274 -0
- package/skills/sync/SKILL.md +49 -0
- package/skills/test-browser/SKILL.md +464 -0
- package/skills/test-browser/references/feature-map.md +161 -0
- package/skills/test-fix-loop/SKILL.md +159 -0
- package/skills/test-fix-loop/references/determinism-checklist.md +154 -0
- package/skills/triage/SKILL.md +402 -0
- package/skills/trigger-cron/SKILL.md +136 -0
- package/skills/trigger-cron/scripts/trigger.sh +198 -0
- package/skills/user-set-role/SKILL.md +147 -0
- package/skills/user-set-role/scripts/set-role.sh +218 -0
- package/skills/user-story-writer/SKILL.md +77 -0
- package/skills/ux-audit/SKILL.md +251 -0
- package/skills/ux-audit/references/finding.schema.json +62 -0
- package/skills/ux-audit/references/route-list.yaml +95 -0
- package/skills/ux-audit/scripts/bot-fixture.ts +270 -0
- package/skills/ux-audit/scripts/bot-signin.ts +135 -0
- package/skills/ux-audit/scripts/dedup-hash.ts +46 -0
- package/skills/verification-scaffold/SKILL.md +73 -0
- package/skills/verification-scaffold/references/gitleaks.toml.template +13 -0
- package/skills/verification-scaffold/references/guardrail-audit.md +156 -0
- package/skills/verification-scaffold/references/guards/block-stash-hook.sh.template +72 -0
- package/skills/verification-scaffold/references/guards/commit-on-main-hook.sh.template +82 -0
- package/skills/verification-scaffold/references/guards/orphan-test-check.sh.template +102 -0
- package/skills/verification-scaffold/references/guards/precommit-guard.sh.template +115 -0
- package/skills/verification-scaffold/references/guards/secret-scan-hook.sh.template +176 -0
- package/skills/verification-scaffold/references/guards/verification-gates.yml.template +49 -0
- package/skills/verification-scaffold/references/guards/wrapper-boundary.sh.template +47 -0
- package/skills/verification-scaffold/references/guards.tsv +21 -0
- package/skills/verification-scaffold/references/verification-readme.template +55 -0
- package/skills/verification-scaffold/scripts/verification-scaffold.sh +785 -0
- package/skills/verification-scaffold/test/bite-proof.test.sh +159 -0
- package/skills/verification-scaffold/test/generator.test.sh +319 -0
- package/skills/verification-scaffold/test/manifest.test.sh +144 -0
- package/skills/work/SKILL.md +1480 -0
- package/skills/work/references/end-of-work-resume.md +7 -0
- package/skills/work/references/hook-test-main-cwd.md +24 -0
- package/skills/work/references/key-principles.md +83 -0
- package/skills/work/references/property-testing.md +122 -0
- package/skills/work/references/sql-security-definer-rpc-scaffold.sql +78 -0
- package/skills/work/references/work-agent-teams.md +97 -0
- package/skills/work/references/work-lifecycle-parallel.md +147 -0
- package/skills/work/references/work-lockfile-bumps.md +97 -0
- package/skills/work/references/work-scratch-sandboxes.md +212 -0
- package/skills/work/references/work-subagent-fanout.md +61 -0
- package/skills/work/references/work-test-harness-sharp-edges.md +73 -0
- 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.
|