Skip to content

Add JS Asset Auditor plugin with Playwright CLI#633

Open
ChristianPavilonis wants to merge 12 commits intomainfrom
feature/js-asset-auditor
Open

Add JS Asset Auditor plugin with Playwright CLI#633
ChristianPavilonis wants to merge 12 commits intomainfrom
feature/js-asset-auditor

Conversation

@ChristianPavilonis
Copy link
Copy Markdown
Collaborator

@ChristianPavilonis ChristianPavilonis commented Apr 13, 2026

Summary

  • Add JS Asset Auditor as a Claude Code plugin at packages/js-asset-auditor/ with a standalone Playwright CLI that sweeps publisher pages for third-party JS assets
  • Auto-detect integrations (GPT, GTM, Didomi, DataDome, Lockr, Permutive, Prebid, APS) from swept URLs and generate trusted-server.toml config with --config flag
  • Expanded heuristic filters for Google ad rendering, ad verification, ad fraud detection, and reCAPTCHA to reduce noise
  • Auto-include target URL host as first-party, make trusted-server.toml optional with --domain flag for portability
  • Browser launches headed by default to avoid bot detection (captchas, DataDome, etc.)

Try it out

1. Check out the branch

git fetch origin
git checkout feature/js-asset-auditor

2. Install dependencies

cd packages/js-asset-auditor && npm install && npx playwright install chromium
cd ../..

3. Run the CLI directly

# Basic audit — opens a browser, sweeps the page, writes js-assets.toml
node packages/js-asset-auditor/lib/audit.mjs https://www.publisher.com

# Also generate trusted-server.toml with detected integrations
node packages/js-asset-auditor/lib/audit.mjs https://www.publisher.com --config

# Custom output paths
node packages/js-asset-auditor/lib/audit.mjs https://www.publisher.com \
  --output /tmp/assets.toml --config /tmp/config.toml

# Headless mode (for CI, may be blocked by bot protection)
node packages/js-asset-auditor/lib/audit.mjs https://www.publisher.com --headless

4. Use as a Claude Code plugin

claude --plugin-dir packages/js-asset-auditor

Then in Claude Code:

/js-asset-auditor:audit-js-assets https://www.publisher.com
/js-asset-auditor:audit-js-assets https://www.publisher.com --config

CLI flags

Flag Description
--diff Compare sweep against existing js-assets.toml
--settle <ms> Settle window after page load (default: 6000)
--first-party <hosts> Additional first-party hosts (comma-separated)
--domain <host> Publisher domain (falls back to trusted-server.toml or URL)
--no-filter Bypass heuristic filtering
--headless Run browser without UI (default is headed)
--output <path> Output file for js-assets.toml (default: js-assets.toml)
--config [path] Generate trusted-server.toml with detected integrations
--force Overwrite existing config file

Test plan

  • Run against a publisher page and verify js-assets.toml output
  • Run with --config and verify detected integrations in generated trusted-server.toml
  • Run with --diff against an existing js-assets.toml and verify confirmed/new/missing
  • Run without trusted-server.toml (e.g., from /tmp) and verify domain inference
  • Load as Claude Code plugin and test the skill
  • Verify --config without --force errors when file already exists
  • Verify bot-protected sites work in headed mode (e.g., autoblog.com)

Closes #631

jevansnyc and others added 12 commits April 1, 2026 13:17
Engineering spec for the /audit-js-assets .
Covers sweep protocol, Chrome DevTools MCP tooling, heuristic filtering,
slug generation, init and diff modes.

Closes #606
Fix incorrect MCP tool name prefix, replace misused wait_for with
evaluate_script setTimeout, correct list_network_requests filtering to
use resourceTypes, resolve path derivation contradiction with consistent
/js-assets/{prefix}/{stem}.js formula, pin slug separator and base62
charset, add URL Processing section with normalization rules and
first-party boundary definition, tighten wildcard regex to require mixed
character classes, and move skill location to .claude/commands/.
Implement the /audit-js-assets command that sweeps a publisher page via
Chrome DevTools MCP, detects third-party JS assets, and generates
js-assets.toml entries. Includes a shared slug generation script
(SHA-256 + base62) and adds MCP permission grants for navigate_page,
list_network_requests, and close_page.
Move URL normalization, filtering, wildcard detection, slug generation,
and TOML formatting into scripts/audit-js-assets.mjs. The skill now
collects raw browser data and delegates processing to the script,
replacing fragile LLM-side URL manipulation.

Expand heuristic filter with Google ad rendering, ad fraud detection,
ad verification, and reCAPTCHA categories. Auto-include target URL host
as first-party. Add --no-filter flag. Fix semver regex to match alpha
suffixes like 1.19.8-hcskhn.
Replace MCP-driven browser automation with a standalone Playwright CLI
at tools/js-asset-auditor/audit.mjs. One command sweeps a publisher
page, collects script URLs, processes them through the shared pipeline,
and writes js-assets.toml.

Refactor scripts/audit-js-assets.mjs to export processAssets() so both
the stdin-based pipeline and the Playwright CLI share the same processing
logic. Simplify the Claude skill from 115 to 59 lines — it now calls the
CLI and formats the JSON summary.
Rewrite sweep protocol, implementation, and verification sections to
describe the three-component architecture: Playwright CLI, processing
library, and Claude Code skill wrapper. Add direct CLI invocation
examples, --headed flag, first-party auto-detection verification, and
ad-rendering filter verification steps.
Restructure into packages/js-asset-auditor/ as a self-contained Claude
Code plugin with .claude-plugin/plugin.json manifest, skills/ directory,
bin/ executable, and lib/ processing modules. The plugin provides the
audit-js-assets skill and CLI automatically when enabled.

Remove tools/js-asset-auditor/, scripts/audit-js-assets.mjs, and
.claude/commands/audit-js-assets.md — all replaced by the plugin.
Enables installing the JS Asset Auditor plugin from this repo via
/plugin marketplace add <org>/trusted-server followed by
/plugin install js-asset-auditor.
Add --domain flag and fall back to inferring from the target URL when
trusted-server.toml is not present. Enables using the plugin in any
project without project-specific config.
Reflect the plugin layout at packages/js-asset-auditor/, update all file
paths, document the domain resolution fallback chain (--domain flag >
trusted-server.toml > infer from URL), and update skill invocation to
use the namespaced /js-asset-auditor:audit-js-assets format.
New --config [path] flag auto-detects integrations (GPT, GTM, Didomi,
DataDome, Lockr, Permutive, Prebid, APS) from swept script URLs and
generates a trusted-server.toml with appropriate [integrations.*]
sections. Auto-extracts fields like GTM container_id from query params
and Permutive org/workspace IDs from URL paths. Fields needing manual
input are marked with TODO comments.
Switch from headless-by-default to headed-by-default. Sites with bot
protection (DataDome, Cloudflare, etc.) block headless browsers. The
--headed flag becomes --headless for CI/automation use cases.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement JS Auditor - claude code

2 participants