Not in the top 1,000 by GitHub stars

ethanplusai/astro-conversion-kit

Agent Skills that convert a WordPress site (or any live site) into a static Astro site with URL, SEO, content and pixel parity, then take it through launch. Works in Claude Code, Codex and any agent that reads SKILL.md.

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

skills/capture-site/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Not checked yet → After Network or broad shell

e551e9717ed8 → 8beb1de5099a

Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Not checked yet

First observation → e551e9717ed8

No earlier version was observed for comparison.

Compare on GitHub

skills/convert-site/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Not checked yet → After Network or broad shell

e551e9717ed8 → 8beb1de5099a

Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Not checked yet

First observation → e551e9717ed8

No earlier version was observed for comparison.

Compare on GitHub

skills/launch-audit/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Not checked yet → After Network or broad shell

e551e9717ed8 → 8beb1de5099a

Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Not checked yet

First observation → e551e9717ed8

No earlier version was observed for comparison.

Compare on GitHub

skills/parity-gates/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Not checked yet → After Network or broad shell

e551e9717ed8 → 8beb1de5099a

Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Not checked yet

First observation → e551e9717ed8

No earlier version was observed for comparison.

Compare on GitHub

skills/post-launch/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Not checked yet → After Network or broad shell

e551e9717ed8 → 8beb1de5099a

Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Not checked yet

First observation → e551e9717ed8

No earlier version was observed for comparison.

Compare on GitHub

skills/pre-launch/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Not checked yet → After Network or broad shell

e551e9717ed8 → 8beb1de5099a

Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Not checked yet

First observation → e551e9717ed8

No earlier version was observed for comparison.

Compare on GitHub

skills/suggest-improvements/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Not checked yet → After Network or broad shell

e551e9717ed8 → 8beb1de5099a

Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Not checked yet

First observation → e551e9717ed8

No earlier version was observed for comparison.

Compare on GitHub

skills/visual-review/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Not checked yet → After Network or broad shell

e551e9717ed8 → 8beb1de5099a

Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Not checked yet

First observation → e551e9717ed8

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 8beb1de5099a2be1ddb1d98ffc7b3682343bc420

git clone --filter=blob:none --no-checkout https://github.com/ethanplusai/astro-conversion-kit.git .hotskills/ethanplusai-astro-conversion-kit && git -C .hotskills/ethanplusai-astro-conversion-kit checkout --detach 8beb1de5099a2be1ddb1d98ffc7b3682343bc420 # Copy each selected skill directory from .hotskills/ethanplusai-astro-conversion-kit into .claude/skills/<skill-name>/
git clone --filter=blob:none --no-checkout https://github.com/ethanplusai/astro-conversion-kit.git .hotskills/ethanplusai-astro-conversion-kit && git -C .hotskills/ethanplusai-astro-conversion-kit checkout --detach 8beb1de5099a2be1ddb1d98ffc7b3682343bc420 # Copy each selected skill directory from .hotskills/ethanplusai-astro-conversion-kit into .agents/skills/<skill-name>/
122GitHub stars
12stars in 7 days
8skills in this repository
192commits in 30 days

Heat

7.4
  • Star growth, last 7 daysNot available
  • Star growth, last 24 hoursNot available
  • Rank movement, last 7 daysNot available
  • Commits, last 30 daysNot available
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekNot available

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Oct 25, 2026Nov 6, 2026122

30-day change not yet available: not enough history.

Individual skills in this repository

How it works

capture-site

When your agent uses it

Crawl a live website, read-only and paced, into a capture/ folder that a rebuild is checked against — every page's HTML, text and head tags, redirects with every hop, links, third-party scripts, the media set, stylesheets, fonts, logo and icons, feeds, templates, and live screenshots at three widths. Use before converting or rebuilding a site, when asked to crawl, capture, snapshot or inventory a site, or when a capture stopped on blocks and needs resuming.

What it loads into context

Frontmatter

107 tokens

Always available to the agent

SKILL.md

6,081 tokens

When the skill is activated

Reference documents

106,541 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. The golden rule
  2. When to use
  3. Pacing
  4. The command sequence
  5. On exit 3
  6. Protected sites
  7. What lands in capture/
  8. What you write by hand
  9. Size, time and address limits
  10. Platform references
  11. Not covered

Scripts executed separately

  • scripts/assets.mjs
  • scripts/capture.mjs
  • scripts/fingerprint.mjs
  • scripts/lib/challenge.mjs
  • scripts/lib/css-urls.mjs
  • scripts/lib/exclude.mjs
  • scripts/lib/extract.mjs
  • scripts/lib/http.mjs
  • scripts/lib/node-version.mjs
  • scripts/lib/page-rules.mjs
  • scripts/lib/sitemaps.mjs
  • scripts/lib/slug.mjs
  • scripts/lib/state.mjs
  • scripts/lib/wayback.mjs
  • scripts/lib/wp-rest.mjs
  • scripts/media.mjs
  • scripts/readme.mjs
  • scripts/templates.mjs
  • ../convert-site/scripts/copy-assets.mjs
  • ../convert-site/scripts/css-coverage.mjs
  • ../convert-site/scripts/css-prune.mjs
  • ../convert-site/scripts/init-site.mjs
  • ../convert-site/scripts/lib/blocked-hosts.mjs
  • ../convert-site/scripts/lib/excluded.mjs
  • ../convert-site/scripts/lib/head-css.mjs
  • ../convert-site/scripts/lib/inline-scope.mjs
  • ../convert-site/scripts/lib/link-records.mjs
  • ../convert-site/scripts/lib/node-version.mjs
  • ../convert-site/scripts/lib/page-head.mjs
  • ../convert-site/scripts/lib/review-routes.mjs
  • ../convert-site/scripts/lib/state-selectors.mjs
  • ../convert-site/scripts/lib/stores/blob.mjs
  • ../convert-site/scripts/lib/stores/r2.mjs
  • ../convert-site/scripts/lib/stores/retry.mjs
  • ../convert-site/scripts/link-exceptions.mjs
  • ../convert-site/scripts/media-plan.mjs
  • ../convert-site/scripts/media-upload.mjs
  • ../convert-site/scripts/preflight.mjs
  • ../convert-site/scripts/prelaunch-reconcile.mjs
  • ../convert-site/scripts/review-serve.mjs
  • ../convert-site/scripts/state.mjs
  • ../convert-site/templates/cloudflare/r2-media-function.js
  • ../convert-site/templates/site/astro.config.mjs
  • ../convert-site/templates/site/package.json
  • ../convert-site/templates/site/package.json
  • ../convert-site/templates/site/package.json
  • ../convert-site/templates/site/package.json
  • ../convert-site/templates/site/package.json
  • ../convert-site/templates/site/package.json
  • ../convert-site/templates/site/package.json
  • ../convert-site/templates/site/package.json
  • ../convert-site/templates/site/package.json
  • ../convert-site/templates/site/package.json
  • ../convert-site/templates/site/package.json
  • ../convert-site/templates/site/package.json
  • ../convert-site/templates/site/package.json
  • ../convert-site/templates/site/package.json
  • ../convert-site/templates/site/package.json
  • ../convert-site/templates/site/src/lib/exceptions.mjs
  • ../convert-site/templates/site/src/lib/site.mjs
  • ../convert-site/templates/site/src/pages/robots.txt.js
  • ../launch-audit/scripts/launch-audit.mjs
  • ../launch-audit/scripts/lib/args.mjs
  • ../launch-audit/scripts/lib/baseline.mjs
  • ../launch-audit/scripts/lib/browser.mjs
  • ../launch-audit/scripts/lib/checks/_ctx.mjs
  • ../launch-audit/scripts/lib/checks/a11y.mjs
  • ../launch-audit/scripts/lib/checks/analytics.mjs
  • ../launch-audit/scripts/lib/checks/browser-tier.mjs
  • ../launch-audit/scripts/lib/checks/content.mjs
  • ../launch-audit/scripts/lib/checks/forms.mjs
  • ../launch-audit/scripts/lib/checks/head.mjs
  • ../launch-audit/scripts/lib/checks/host.mjs
  • ../launch-audit/scripts/lib/checks/images.mjs
  • ../launch-audit/scripts/lib/checks/indexability.mjs
  • ../launch-audit/scripts/lib/checks/inventory.mjs
  • ../launch-audit/scripts/lib/checks/links.mjs
  • ../launch-audit/scripts/lib/checks/ops.mjs
  • ../launch-audit/scripts/lib/checks/perf.mjs
  • ../launch-audit/scripts/lib/checks/redirects.mjs
  • ../launch-audit/scripts/lib/crawl.mjs
  • ../launch-audit/scripts/lib/csv.mjs
  • ../launch-audit/scripts/lib/detect/analytics.mjs
  • ../launch-audit/scripts/lib/detect/framework.mjs
  • ../launch-audit/scripts/lib/detect/placeholders.mjs
  • ../launch-audit/scripts/lib/dns.mjs
  • ../launch-audit/scripts/lib/findings.mjs
  • ../launch-audit/scripts/lib/fs-util.mjs
  • ../launch-audit/scripts/lib/html.mjs
  • ../launch-audit/scripts/lib/image-dims.mjs
  • ../launch-audit/scripts/lib/net.mjs
  • ../launch-audit/scripts/lib/recorded-net.mjs
  • ../launch-audit/scripts/lib/registry.mjs
  • ../launch-audit/scripts/lib/report.mjs
  • ../launch-audit/scripts/lib/robots.mjs
  • ../launch-audit/scripts/lib/schema/required.mjs
  • ../launch-audit/scripts/lib/sitemap.mjs
  • ../launch-audit/scripts/lib/slug.mjs
  • ../parity-gates/scripts/build-baseline.mjs
  • ../parity-gates/scripts/build-redirects.mjs
  • ../parity-gates/scripts/lib/cloudflare-resolver.mjs
  • ../parity-gates/scripts/lib/dist.mjs
  • ../parity-gates/scripts/lib/exceptions.mjs
  • ../parity-gates/scripts/lib/excluded.mjs
  • ../parity-gates/scripts/lib/forms.mjs
  • ../parity-gates/scripts/lib/gate-cli.mjs
  • ../parity-gates/scripts/lib/head.mjs
  • ../parity-gates/scripts/lib/host-resolver.mjs
  • ../parity-gates/scripts/lib/html.mjs
  • ../parity-gates/scripts/lib/node-version.mjs
  • ../parity-gates/scripts/lib/redirects-csv.mjs
  • ../parity-gates/scripts/lib/srcset.mjs
  • ../parity-gates/scripts/lib/vendors.mjs
  • ../parity-gates/scripts/lib/vercel-resolver.mjs
  • ../parity-gates/scripts/lib/visible-text.mjs
  • ../parity-gates/scripts/verify-live.mjs
  • ../parity-gates/scripts/verify/forms.mjs
  • ../parity-gates/scripts/verify/headers.mjs
  • ../parity-gates/scripts/verify/links.mjs
  • ../parity-gates/scripts/verify/media.mjs
  • ../parity-gates/scripts/verify/redirects.mjs
  • ../parity-gates/scripts/verify/routes.mjs
  • ../parity-gates/scripts/verify/run-all.mjs
  • ../parity-gates/scripts/verify/scripts.mjs
  • ../parity-gates/scripts/verify/seo.mjs
  • ../parity-gates/scripts/verify/sitemaps.mjs
  • ../parity-gates/scripts/verify/text.mjs
  • ../post-launch/scripts/lib/checks/cutover.mjs
  • ../post-launch/scripts/lib/cutover.mjs
  • ../post-launch/scripts/lib/plan.mjs
  • ../post-launch/scripts/lib/watch.mjs
  • ../post-launch/scripts/post-launch.mjs
  • ../pre-launch/scripts/lib/build.mjs
  • ../pre-launch/scripts/lib/context.mjs
  • ../pre-launch/scripts/lib/framework.mjs
  • ../pre-launch/scripts/lib/gate.mjs
  • ../pre-launch/scripts/lib/human.mjs
  • ../pre-launch/scripts/lib/hygiene.mjs
  • ../pre-launch/scripts/lib/output.mjs
  • ../pre-launch/scripts/lib/placeholders.mjs
  • ../pre-launch/scripts/lib/predecessor.mjs
  • ../pre-launch/scripts/pre-launch.mjs
  • ../suggest-improvements/scripts/checks/broken-links.mjs
  • ../suggest-improvements/scripts/checks/dead-analytics.mjs
  • ../suggest-improvements/scripts/checks/duplicate-analytics.mjs
  • ../suggest-improvements/scripts/checks/duplicate-titles.mjs
  • ../suggest-improvements/scripts/checks/http-links.mjs
  • ../suggest-improvements/scripts/checks/inconsistent-spacing.mjs
  • ../suggest-improvements/scripts/checks/long-titles.mjs
  • ../suggest-improvements/scripts/checks/missing-alt.mjs
  • ../suggest-improvements/scripts/checks/missing-descriptions.mjs
  • ../suggest-improvements/scripts/checks/missing-h1.mjs
  • ../suggest-improvements/scripts/checks/missing-security-headers.mjs
  • ../suggest-improvements/scripts/checks/mixed-content.mjs
  • ../suggest-improvements/scripts/checks/mobile-overflow.mjs
  • ../suggest-improvements/scripts/checks/multiple-h1.mjs
  • ../suggest-improvements/scripts/checks/no-webp.mjs
  • ../suggest-improvements/scripts/checks/noindex-in-sitemap.mjs
  • ../suggest-improvements/scripts/checks/orphan-pages.mjs
  • ../suggest-improvements/scripts/checks/oversized-images.mjs
  • ../suggest-improvements/scripts/checks/placeholder-text.mjs
  • ../suggest-improvements/scripts/checks/redirect-chains.mjs
  • ../suggest-improvements/scripts/checks/render-blocking-scripts.mjs
  • ../suggest-improvements/scripts/checks/shortcode-leftovers.mjs
  • ../suggest-improvements/scripts/checks/stale-dates.mjs
  • ../suggest-improvements/scripts/checks/thin-pages.mjs
  • ../suggest-improvements/scripts/lib/item.mjs
  • ../suggest-improvements/scripts/lib/load.mjs
  • ../suggest-improvements/scripts/lib/node-version.mjs
  • ../suggest-improvements/scripts/lib/pages.mjs
  • ../suggest-improvements/scripts/lib/report.mjs
  • ../suggest-improvements/scripts/suggest.mjs
  • ../visual-review/scripts/check.mjs
  • ../visual-review/scripts/diff.mjs
  • ../visual-review/scripts/lib/blocked-hosts.mjs
  • ../visual-review/scripts/lib/browser.mjs
  • ../visual-review/scripts/lib/node-version.mjs
  • ../visual-review/scripts/lib/routes.mjs
  • ../visual-review/scripts/lib/selectors.mjs
  • ../visual-review/scripts/sheet.mjs
  • ../visual-review/scripts/shoot.mjs
  • ../visual-review/scripts/styles.mjs

Files

  • ../../.claude-plugin/marketplace.jsonasset629 bytes
  • SKILL.mdcore24,362 bytes
  • references/drupal.mddoc3,026 bytes
  • references/static-and-unknown.mddoc2,507 bytes
  • references/webflow-squarespace-wix.mddoc2,789 bytes
  • references/wordpress.mddoc5,274 bytes
  • scripts/assets.mjsruns18,593 bytes
  • scripts/capture.mjsruns69,737 bytes
  • scripts/fingerprint.mjsruns10,950 bytes
  • scripts/lib/challenge.mjsruns4,625 bytes
  • scripts/lib/css-urls.mjsruns2,351 bytes
  • scripts/lib/exclude.mjsruns1,593 bytes
  • scripts/lib/extract.mjsruns8,372 bytes
  • scripts/lib/http.mjsruns17,191 bytes
  • scripts/lib/node-version.mjsruns1,083 bytes
  • scripts/lib/page-rules.mjsruns765 bytes
  • scripts/lib/sitemaps.mjsruns4,523 bytes
  • scripts/lib/slug.mjsruns966 bytes
  • scripts/lib/state.mjsruns1,548 bytes
  • scripts/lib/wayback.mjsruns2,744 bytes
  • scripts/lib/wp-rest.mjsruns3,538 bytes
  • scripts/media.mjsruns29,782 bytes
  • scripts/readme.mjsruns16,207 bytes
  • scripts/templates.mjsruns10,629 bytes
  • ../convert-site/SKILL.mddoc14,379 bytes
  • ../convert-site/references/apply-suggestion.mddoc4,820 bytes
  • ../convert-site/references/build-rules.mddoc18,222 bytes
  • ../convert-site/references/components-optional.mddoc2,541 bytes
  • ../convert-site/references/forms.mddoc6,639 bytes
  • ../convert-site/references/hosting-cloudflare.mddoc5,953 bytes
  • ../convert-site/references/hosting-vercel.mddoc14,097 bytes
  • ../convert-site/references/intake.mddoc9,701 bytes
  • ../convert-site/references/phases.mddoc30,799 bytes
  • ../convert-site/references/runbook.mddoc7,197 bytes
  • ../convert-site/references/third-party.mddoc2,570 bytes
  • ../convert-site/scripts/copy-assets.mjsruns10,908 bytes
  • ../convert-site/scripts/css-coverage.mjsruns14,717 bytes
  • ../convert-site/scripts/css-prune.mjsruns55,340 bytes
  • ../convert-site/scripts/init-site.mjsruns13,787 bytes
  • ../convert-site/scripts/lib/blocked-hosts.mjsruns2,825 bytes
  • ../convert-site/scripts/lib/excluded.mjsruns1,380 bytes
  • ../convert-site/scripts/lib/head-css.mjsruns1,804 bytes
  • ../convert-site/scripts/lib/inline-scope.mjsruns5,369 bytes
  • ../convert-site/scripts/lib/link-records.mjsruns2,574 bytes
  • ../convert-site/scripts/lib/node-version.mjsruns1,083 bytes
  • ../convert-site/scripts/lib/page-head.mjsruns1,605 bytes
  • ../convert-site/scripts/lib/review-routes.mjsruns7,607 bytes
  • ../convert-site/scripts/lib/state-selectors.mjsruns2,807 bytes
  • ../convert-site/scripts/lib/stores/blob.mjsruns3,952 bytes
  • ../convert-site/scripts/lib/stores/r2.mjsruns4,302 bytes
  • ../convert-site/scripts/lib/stores/retry.mjsruns645 bytes
  • ../convert-site/scripts/link-exceptions.mjsruns7,469 bytes
  • ../convert-site/scripts/media-plan.mjsruns13,108 bytes
  • ../convert-site/scripts/media-upload.mjsruns8,119 bytes
  • ../convert-site/scripts/preflight.mjsruns12,693 bytes
  • ../convert-site/scripts/prelaunch-reconcile.mjsruns38,338 bytes
  • ../convert-site/scripts/review-serve.mjsruns15,174 bytes
  • ../convert-site/scripts/state.mjsruns6,836 bytes
  • ../convert-site/templates/cloudflare/r2-media-function.jsruns1,692 bytes
  • ../convert-site/templates/site/.gitignoreasset361 bytes
  • ../convert-site/templates/site/.nvmrcasset8 bytes
  • ../convert-site/templates/site/.vercelignoreasset397 bytes
  • ../convert-site/templates/site/AGENTS.mddoc3,669 bytes
  • ../convert-site/templates/site/CLAUDE.mddoc3,669 bytes
  • ../convert-site/templates/site/README.mddoc1,586 bytes
  • ../convert-site/templates/site/astro.config.mjsruns286 bytes
  • ../convert-site/templates/site/docs/LAUNCH.mddoc3,967 bytes
  • ../convert-site/templates/site/docs/plan.mddoc1,293 bytes
  • ../convert-site/templates/site/docs/third-party.mddoc397 bytes
  • ../convert-site/templates/site/exceptions.jsonasset3 bytes
  • ../convert-site/templates/site/package.jsonruns1,427 bytes
  • ../convert-site/templates/site/package.jsonruns1,427 bytes
  • ../convert-site/templates/site/package.jsonruns1,427 bytes
  • ../convert-site/templates/site/package.jsonruns1,427 bytes
  • ../convert-site/templates/site/package.jsonruns1,427 bytes
  • ../convert-site/templates/site/package.jsonruns1,427 bytes
  • ../convert-site/templates/site/package.jsonruns1,427 bytes
  • ../convert-site/templates/site/package.jsonruns1,427 bytes
  • ../convert-site/templates/site/package.jsonruns1,427 bytes
  • ../convert-site/templates/site/package.jsonruns1,427 bytes
  • ../convert-site/templates/site/package.jsonruns1,427 bytes
  • ../convert-site/templates/site/package.jsonruns1,427 bytes
  • ../convert-site/templates/site/package.jsonruns1,427 bytes
  • ../convert-site/templates/site/package.jsonruns1,427 bytes
  • ../convert-site/templates/site/package.jsonruns1,427 bytes
  • ../convert-site/templates/site/proposals.jsonasset3 bytes
  • ../convert-site/templates/site/public/_headersasset413 bytes
  • ../convert-site/templates/site/src/layouts/Base.astroasset2,449 bytes
  • ../convert-site/templates/site/src/lib/exceptions.mjsruns1,173 bytes
  • ../convert-site/templates/site/src/lib/site.mjsruns304 bytes
  • ../convert-site/templates/site/src/pages/404.astroasset330 bytes
  • ../convert-site/templates/site/src/pages/robots.txt.jsruns492 bytes
  • ../convert-site/templates/site/src/styles/site.cssasset91 bytes
  • ../convert-site/templates/site/vercel.jsonasset433 bytes
  • ../launch-audit/SKILL.mddoc9,156 bytes
  • ../launch-audit/references/accessibility.mddoc8,309 bytes
  • ../launch-audit/references/analytics.mddoc7,831 bytes
  • ../launch-audit/references/content.mddoc7,915 bytes
  • ../launch-audit/references/forms.mddoc8,808 bytes
  • ../launch-audit/references/head.mddoc13,547 bytes
  • ../launch-audit/references/host.mddoc13,044 bytes
  • ../launch-audit/references/images.mddoc8,177 bytes
  • ../launch-audit/references/indexability.mddoc18,257 bytes
  • ../launch-audit/references/links.mddoc8,350 bytes
  • ../launch-audit/references/ops.mddoc7,780 bytes
  • ../launch-audit/references/performance.mddoc8,902 bytes
  • ../launch-audit/references/reading-the-report.mddoc8,873 bytes
  • ../launch-audit/references/redirects.mddoc8,595 bytes
  • ../launch-audit/scripts/launch-audit.mjsruns27,656 bytes
  • ../launch-audit/scripts/lib/args.mjsruns6,579 bytes
  • ../launch-audit/scripts/lib/baseline.mjsruns4,882 bytes
  • ../launch-audit/scripts/lib/browser.mjsruns21,277 bytes
  • ../launch-audit/scripts/lib/checks/_ctx.mjsruns23,127 bytes
  • ../launch-audit/scripts/lib/checks/a11y.mjsruns13,745 bytes
  • ../launch-audit/scripts/lib/checks/analytics.mjsruns10,100 bytes
  • ../launch-audit/scripts/lib/checks/browser-tier.mjsruns24,073 bytes
  • ../launch-audit/scripts/lib/checks/content.mjsruns17,592 bytes
  • ../launch-audit/scripts/lib/checks/forms.mjsruns15,863 bytes
  • ../launch-audit/scripts/lib/checks/head.mjsruns41,742 bytes
  • ../launch-audit/scripts/lib/checks/host.mjsruns36,136 bytes
  • ../launch-audit/scripts/lib/checks/images.mjsruns14,943 bytes
  • ../launch-audit/scripts/lib/checks/indexability.mjsruns31,759 bytes
  • ../launch-audit/scripts/lib/checks/inventory.mjsruns15,339 bytes
  • ../launch-audit/scripts/lib/checks/links.mjsruns23,268 bytes
  • ../launch-audit/scripts/lib/checks/ops.mjsruns9,119 bytes
  • ../launch-audit/scripts/lib/checks/perf.mjsruns18,970 bytes
  • ../launch-audit/scripts/lib/checks/redirects.mjsruns20,738 bytes
  • ../launch-audit/scripts/lib/crawl.mjsruns8,092 bytes
  • ../launch-audit/scripts/lib/csv.mjsruns4,956 bytes
  • ../launch-audit/scripts/lib/detect/analytics.mjsruns4,704 bytes
  • ../launch-audit/scripts/lib/detect/framework.mjsruns12,870 bytes
  • ../launch-audit/scripts/lib/detect/placeholders.mjsruns3,332 bytes
  • ../launch-audit/scripts/lib/dns.mjsruns9,157 bytes
  • ../launch-audit/scripts/lib/findings.mjsruns1,809 bytes
  • ../launch-audit/scripts/lib/fs-util.mjsruns713 bytes
  • ../launch-audit/scripts/lib/headers/owasp.jsonasset4,019 bytes
  • ../launch-audit/scripts/lib/html.mjsruns28,481 bytes
  • ../launch-audit/scripts/lib/image-dims.mjsruns6,508 bytes
  • ../launch-audit/scripts/lib/net.mjsruns11,764 bytes
  • ../launch-audit/scripts/lib/recorded-net.mjsruns4,608 bytes
  • ../launch-audit/scripts/lib/registry.mjsruns1,607 bytes
  • ../launch-audit/scripts/lib/report.mjsruns15,193 bytes
  • ../launch-audit/scripts/lib/robots.mjsruns5,263 bytes
  • ../launch-audit/scripts/lib/schema/required.mjsruns4,358 bytes
  • ../launch-audit/scripts/lib/sitemap.mjsruns5,583 bytes
  • ../launch-audit/scripts/lib/slug.mjsruns280 bytes
  • ../parity-gates/SKILL.mddoc16,229 bytes
  • ../parity-gates/references/contracts.mddoc10,215 bytes
  • ../parity-gates/references/exceptions.mddoc8,827 bytes
  • ../parity-gates/scripts/build-baseline.mjsruns19,343 bytes
  • ../parity-gates/scripts/build-redirects.mjsruns19,136 bytes
  • ../parity-gates/scripts/lib/cloudflare-resolver.mjsruns3,966 bytes
  • ../parity-gates/scripts/lib/dist.mjsruns3,796 bytes
  • ../parity-gates/scripts/lib/exceptions.mjsruns5,868 bytes
  • ../parity-gates/scripts/lib/excluded.mjsruns1,380 bytes
  • ../parity-gates/scripts/lib/forms.mjsruns799 bytes
  • ../parity-gates/scripts/lib/gate-cli.mjsruns7,165 bytes
  • ../parity-gates/scripts/lib/head.mjsruns2,766 bytes
  • ../parity-gates/scripts/lib/host-resolver.mjsruns1,929 bytes
  • ../parity-gates/scripts/lib/html.mjsruns1,289 bytes
  • ../parity-gates/scripts/lib/node-version.mjsruns1,083 bytes
  • ../parity-gates/scripts/lib/redirects-csv.mjsruns6,357 bytes
  • ../parity-gates/scripts/lib/srcset.mjsruns1,092 bytes
  • ../parity-gates/scripts/lib/vendors.mjsruns2,918 bytes
  • ../parity-gates/scripts/lib/vercel-resolver.mjsruns9,325 bytes
  • ../parity-gates/scripts/lib/visible-text.mjsruns3,935 bytes
  • ../parity-gates/scripts/verify-live.mjsruns21,203 bytes
  • ../parity-gates/scripts/verify/forms.mjsruns16,316 bytes
  • ../parity-gates/scripts/verify/headers.mjsruns7,269 bytes
  • ../parity-gates/scripts/verify/links.mjsruns8,889 bytes
  • ../parity-gates/scripts/verify/media.mjsruns9,192 bytes
  • ../parity-gates/scripts/verify/redirects.mjsruns16,832 bytes
  • ../parity-gates/scripts/verify/routes.mjsruns8,628 bytes
  • ../parity-gates/scripts/verify/run-all.mjsruns3,462 bytes
  • ../parity-gates/scripts/verify/scripts.mjsruns4,551 bytes
  • ../parity-gates/scripts/verify/seo.mjsruns9,426 bytes
  • ../parity-gates/scripts/verify/sitemaps.mjsruns10,840 bytes
  • ../parity-gates/scripts/verify/text.mjsruns3,204 bytes
  • ../post-launch/SKILL.mddoc9,185 bytes
  • ../post-launch/references/baseline-diff.mddoc5,383 bytes
  • ../post-launch/references/cutover-day.mddoc9,159 bytes
  • ../post-launch/references/reading-the-report.mddoc5,794 bytes
  • ../post-launch/references/thirty-day-watch.mddoc5,728 bytes
  • ../post-launch/scripts/lib/checks/cutover.mjsruns47,096 bytes
  • ../post-launch/scripts/lib/cutover.mjsruns26,807 bytes
  • ../post-launch/scripts/lib/plan.mjsruns5,658 bytes
  • ../post-launch/scripts/lib/watch.mjsruns6,832 bytes
  • ../post-launch/scripts/post-launch.mjsruns15,077 bytes
  • ../pre-launch/SKILL.mddoc10,504 bytes
  • ../pre-launch/references/config.mddoc3,327 bytes
  • ../pre-launch/references/framework-hints.mddoc6,763 bytes
  • ../pre-launch/references/human-checklist.mddoc7,504 bytes
  • ../pre-launch/references/predecessor-redirects.mddoc6,385 bytes
  • ../pre-launch/references/reading-the-gate.mddoc5,155 bytes
  • ../pre-launch/scripts/lib/build.mjsruns3,460 bytes
  • ../pre-launch/scripts/lib/context.mjsruns18,088 bytes
  • ../pre-launch/scripts/lib/framework.mjsruns9,738 bytes
  • ../pre-launch/scripts/lib/gate.mjsruns14,307 bytes
  • ../pre-launch/scripts/lib/human.mjsruns9,388 bytes
  • ../pre-launch/scripts/lib/hygiene.mjsruns15,393 bytes
  • ../pre-launch/scripts/lib/output.mjsruns29,469 bytes
  • ../pre-launch/scripts/lib/placeholders.mjsruns13,375 bytes
  • ../pre-launch/scripts/lib/predecessor.mjsruns7,722 bytes
  • ../pre-launch/scripts/pre-launch.mjsruns13,135 bytes
  • ../suggest-improvements/SKILL.mddoc6,217 bytes
  • ../suggest-improvements/references/catalogue.mddoc5,134 bytes
  • ../suggest-improvements/scripts/checks/broken-links.mjsruns1,817 bytes
  • ../suggest-improvements/scripts/checks/dead-analytics.mjsruns1,637 bytes
  • ../suggest-improvements/scripts/checks/duplicate-analytics.mjsruns1,270 bytes
  • ../suggest-improvements/scripts/checks/duplicate-titles.mjsruns976 bytes
  • ../suggest-improvements/scripts/checks/http-links.mjsruns1,129 bytes
  • ../suggest-improvements/scripts/checks/inconsistent-spacing.mjsruns1,746 bytes
  • ../suggest-improvements/scripts/checks/long-titles.mjsruns623 bytes
  • ../suggest-improvements/scripts/checks/missing-alt.mjsruns1,069 bytes
  • ../suggest-improvements/scripts/checks/missing-descriptions.mjsruns613 bytes
  • ../suggest-improvements/scripts/checks/missing-h1.mjsruns474 bytes
  • ../suggest-improvements/scripts/checks/missing-security-headers.mjsruns2,360 bytes
  • ../suggest-improvements/scripts/checks/mixed-content.mjsruns1,383 bytes
  • ../suggest-improvements/scripts/checks/mobile-overflow.mjsruns1,681 bytes
  • ../suggest-improvements/scripts/checks/multiple-h1.mjsruns527 bytes
  • ../suggest-improvements/scripts/checks/no-webp.mjsruns840 bytes
  • ../suggest-improvements/scripts/checks/noindex-in-sitemap.mjsruns631 bytes
  • ../suggest-improvements/scripts/checks/orphan-pages.mjsruns1,600 bytes
  • ../suggest-improvements/scripts/checks/oversized-images.mjsruns2,942 bytes
  • ../suggest-improvements/scripts/checks/placeholder-text.mjsruns1,355 bytes
  • ../suggest-improvements/scripts/checks/redirect-chains.mjsruns609 bytes
  • ../suggest-improvements/scripts/checks/render-blocking-scripts.mjsruns2,687 bytes
  • ../suggest-improvements/scripts/checks/shortcode-leftovers.mjsruns1,848 bytes
  • ../suggest-improvements/scripts/checks/stale-dates.mjsruns1,175 bytes
  • ../suggest-improvements/scripts/checks/thin-pages.mjsruns1,188 bytes
  • ../suggest-improvements/scripts/lib/item.mjsruns2,297 bytes
  • ../suggest-improvements/scripts/lib/load.mjsruns3,724 bytes
  • ../suggest-improvements/scripts/lib/node-version.mjsruns1,083 bytes
  • ../suggest-improvements/scripts/lib/pages.mjsruns3,091 bytes
  • ../suggest-improvements/scripts/lib/report.mjsruns4,808 bytes
  • ../suggest-improvements/scripts/suggest.mjsruns5,785 bytes
  • ../visual-review/SKILL.mddoc10,837 bytes
  • ../visual-review/references/review-procedure.mddoc18,141 bytes
  • ../visual-review/scripts/check.mjsruns5,315 bytes
  • ../visual-review/scripts/diff.mjsruns10,830 bytes
  • ../visual-review/scripts/lib/blocked-hosts.mjsruns2,825 bytes
  • ../visual-review/scripts/lib/browser.mjsruns8,665 bytes
  • ../visual-review/scripts/lib/freeze.cssasset239 bytes
  • ../visual-review/scripts/lib/node-version.mjsruns1,083 bytes
  • ../visual-review/scripts/lib/routes.mjsruns2,484 bytes
  • ../visual-review/scripts/lib/selectors.mjsruns1,116 bytes
  • ../visual-review/scripts/sheet.mjsruns12,652 bytes
  • ../visual-review/scripts/shoot.mjsruns9,872 bytes
  • ../visual-review/scripts/styles.mjsruns10,358 bytes
Read SKILL.md

# capture-site

Save everything the live site serves, once, so every later step works from the capture.

## The golden rule

**The live site is read-only, and the capture is read-only afterwards.** The scripts only make
paced GET and HEAD requests; never submit a form, log in, or fetch by hand to fill a gap. Once the
notes are written, nothing under `capture/` is edited: it is the evidence every gate reads.

## When to use

Step 2 of a conversion (`convert-site` runs it), or any time a live site has to be inventoried
(a staging or new site is `launch-audit`'s job). A capture that exited 3 resumes, as below.
View the complete source on GitHub

Skills included

  • capture-site
  • convert-site
  • launch-audit
  • parity-gates
  • post-launch
  • pre-launch
  • suggest-improvements
  • visual-review

Repository facts

License
MIT
Created
Oct 22, 2026
Last pushed
Oct 31, 2026
Forks
24
Open issues
1
Project activity
Active

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 6, 2026

Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

Show 32 notes
  • skills/convert-site/templates/site/package.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/convert-site/templates/site/package.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/convert-site/templates/site/package.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/convert-site/templates/site/package.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/convert-site/templates/site/package.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/convert-site/templates/site/package.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/convert-site/templates/site/package.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/convert-site/templates/site/package.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/convert-site/templates/site/package.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/convert-site/templates/site/package.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/convert-site/templates/site/package.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/convert-site/templates/site/package.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/convert-site/templates/site/package.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/convert-site/templates/site/package.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/convert-site/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/convert-site/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/convert-site/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/convert-site/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/convert-site/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/launch-audit/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 891 signals by file

skills/capture-site/SKILL.md

  • Network accessline 65
    node <skill-dir>/scripts/fingerprint.mjs https://www.example.com
  • Network accessline 103
    node <skill-dir>/scripts/capture.mjs https://www.example.com --out capture
  • Network accessline 111
    node <skill-dir>/scripts/capture.mjs https://www.example.com --out capture --resume --seed-file capture/wayback-unverified.txt
  • Network accessline 171
    node <skill-dir>/../visual-review/scripts/shoot.mjs --base https://www.example.com --routes capture/templates.json --widths 390,768,1440 --out capture/screens/live
  • Network accessline 177
    npx --no-install lighthouse https://www.example.com/ --quiet --chrome-flags="--headless=new" --output json --output html --output-path capture/lighthouse-live/home
  • Network accessline 247
    node <skill-dir>/scripts/capture.mjs https://www.example.com --out capture --resume

skills/capture-site/scripts/assets.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 90
    const LOGO = /(^|[^A-Za-z]|[a-z](?=L))[Ll][Oo][Gg][Oo][Ss]?([^A-Za-z]|$)/; const SVG_NS = 'http://www.w3.org/2000/svg';
  • Network accessline 91
    const SVG_NS = 'http://www.w3.org/2000/svg';
  • Network accessline 92
    const XLINK_NS = 'http://www.w3.org/1999/xlink';

skills/capture-site/scripts/capture.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 57
    <origin>              the site, e.g. https://www.example.com
  • Network accessline 387
    }       for (let attempt = 1; ; attempt += 1) {         const res = await this.fetch(url, options);
  • Network accessline 388
    for (let attempt = 1; ; attempt += 1) {         const res = await this.fetch(url, options);         const verdict = this.judge(res, url);
  • Network accessline 389
    const res = await this.fetch(url, options);
  • Network accessline 635
    const path = `/${randomBytes(16).toString('hex')}/`;     const url = new URL(path, this.state.canonicalOrigin).href;     const res = await this.fetch(url, { redirect: 'manual' });
  • Network accessline 636
    const url = new URL(path, this.state.canonicalOrigin).href;     const res = await this.fetch(url, { redirect: 'manual' });     const verdict = this.judge(res, url);
  • Network accessline 637
    const res = await this.fetch(url, { redirect: 'manual' });
  • Network accessline 703
    let current = url;     for (let hop = 0; ; hop += 1) {       const res = await this.fetch(current, { ...options, redirect: 'manual' });
  • Network accessline 704
    for (let hop = 0; ; hop += 1) {       const res = await this.fetch(current, { ...options, redirect: 'manual' });       const location = res.headers?.location;
  • Network accessline 705
    const res = await this.fetch(current, { ...options, redirect: 'manual' });
  • Network accessline 737
    let current = start;     for (let hop = 0; hop <= MAX_HOPS; hop += 1) {       const res = await this.fetch(current, { redirect: 'manual' });
  • Network accessline 738
    for (let hop = 0; hop <= MAX_HOPS; hop += 1) {       const res = await this.fetch(current, { redirect: 'manual' });       hops.push({ url: current, res });
  • Network accessline 739
    const res = await this.fetch(current, { redirect: 'manual' });
  • Network accessline 755
    let current = start;     for (let hop = 0; hop <= MAX_HOPS; hop += 1) {       const res = hops[hop]?.url === current ? hops[hop].res : await this.fetch(current, { redirect: 'manual' });
  • Network accessline 756
    for (let hop = 0; hop <= MAX_HOPS; hop += 1) {       const res = hops[hop]?.url === current ? hops[hop].res : await this.fetch(current, { redirect: 'manual' });       const verdict = this.judge(res, current, item);
  • Network accessline 757
    const res = hops[hop]?.url === current ? hops[hop].res : await this.fetch(current, { redirect: 'manual' });
  • Network accessline 944
    let url = item.url;     for (let hop = 0; ; hop += 1) {       const res = await this.fetch(url, { raw: true, maxBytes: JS_MAX_BYTES });
  • Network accessline 945
    for (let hop = 0; ; hop += 1) {       const res = await this.fetch(url, { raw: true, maxBytes: JS_MAX_BYTES });       if (BLOCK_STATUSES.has(res.status)) return { res };
  • Network accessline 946
    const res = await this.fetch(url, { raw: true, maxBytes: JS_MAX_BYTES });

skills/capture-site/scripts/fingerprint.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 36
    <origin>      the site, e.g. https://www.example.com   --json        print the result as JSON   --delay <ms>  wait between requests (default ${DEFAULT_DELAY_MS})
  • Network accessline 126
    for (const url of candidates) {     const res = await fetch(url, { redirect: 'follow' });
  • Network accessline 127
    const res = await fetch(url, { redirect: 'follow' });
  • Network accessline 137
    // detect: false leaves challenge detection to the caller's fetch (capture.mjs judges every answer).
  • Network accessline 138
    export async function fingerprint(origin, { fetch = fetchPaced, detect = true } = {}) {   const base = new URL(origin).origin;   const home = await fetch(new URL('/', base).href, { redirect: 'follow' });
  • Network accessline 139
    const base = new URL(origin).origin;   const home = await fetch(new URL('/', base).href, { redirect: 'follow' });   const html = home.status === 200 ? String(home.body) : '';
  • Network accessline 140
    const home = await fetch(new URL('/', base).href, { redirect: 'follow' });
  • Network accessline 171
    const robotsRes = await fetch(new URL('/robots.txt', base).href, { redirect: 'follow' });

skills/capture-site/scripts/lib/challenge.mjs

  • Executable scriptline 1
    Executable file

skills/capture-site/scripts/lib/css-urls.mjs

  • Executable scriptline 1
    Executable file

skills/capture-site/scripts/lib/exclude.mjs

  • Executable scriptline 1
    Executable file

skills/capture-site/scripts/lib/extract.mjs

  • Executable scriptline 1
    Executable file

skills/capture-site/scripts/lib/http.mjs

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 29
    import { mkdir, open, rename, rm } from 'node:fs/promises';
  • Network accessline 354
    let hopMethod = method;     for (let hop = 0; ; hop += 1) {       res = await fetch(target, { method: hopMethod, redirect: 'manual', headers: { 'User-Agent': ua, Accept: '*/*' }, signal });
  • Network accessline 355
    for (let hop = 0; ; hop += 1) {       res = await fetch(target, { method: hopMethod, redirect: 'manual', headers: { 'User-Agent': ua, Accept: '*/*' }, signal });       if (hop === 0) answered();
  • Network accessline 356
    res = await fetch(target, { method: hopMethod, redirect: 'manual', headers: { 'User-Agent': ua, Accept: '*/*' }, signal });

skills/capture-site/scripts/lib/node-version.mjs

  • Executable scriptline 1
    Executable file

skills/capture-site/scripts/lib/page-rules.mjs

  • Executable scriptline 1
    Executable file

skills/capture-site/scripts/lib/sitemaps.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 86
    const load = async (url) => {     visited.add(url);     const res = await fetch(url, { redirect: 'follow' });
  • Network accessline 87
    visited.add(url);     const res = await fetch(url, { redirect: 'follow' });     if (res.status !== 200) return null;
  • Network accessline 88
    const res = await fetch(url, { redirect: 'follow' });

skills/capture-site/scripts/lib/slug.mjs

  • Executable scriptline 1
    Executable file

skills/capture-site/scripts/lib/state.mjs

  • Executable scriptline 1
    Executable file

skills/capture-site/scripts/lib/wayback.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 12
    export const CDX_ENDPOINT = 'http://web.archive.org/cdx/search/cdx';
  • Network accessline 27
    export async function waybackPaths(host, { fetch, known = [], out = null, endpoint = CDX_ENDPOINT, skip = () => false } = {}) {   const res = await fetch(cdxUrl(host, endpoint), { ...CDX_OPTIONS });
  • Network accessline 28
    const res = await fetch(cdxUrl(host, endpoint), { ...CDX_OPTIONS });

skills/capture-site/scripts/lib/wp-rest.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 63
    }       const url = pageUrl(type, page);       const res = await fetch(url);
  • Network accessline 64
    const url = pageUrl(type, page);       const res = await fetch(url);       const data = parseList(res);
  • Network accessline 65
    const res = await fetch(url);

skills/capture-site/scripts/media.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 60
    (streamed to disk; a download with no data for 30 s is a network error)   --sizes referenced|all  which REST-only image sizes and query-string variants to fetch                     (default referenced: none; all: every registered size and e
  • Network accessline 61
    --sizes referenced|all  which REST-only image sizes and query-string variants to fetch                     (default referenced: none; all: every registered size and every                     variant, for when old emails or other sites may l

skills/capture-site/scripts/readme.mjs

  • Executable scriptline 1
    #!/usr/bin/env node

skills/capture-site/scripts/templates.mjs

  • Executable scriptline 1
    #!/usr/bin/env node

skills/convert-site/SKILL.md

  • Network accessline 47
    git clone https://github.com/ethanplusai/astro-conversion-kit <folder>/astro-conversion-kit
  • Network accessline 47
    git clone https://github.com/ethanplusai/astro-conversion-kit <folder>/astro-conversion-kit

skills/convert-site/references/apply-suggestion.md

  • Network accessline 28
    { "id": "d12", "path": "/about/", "field": "link", "from": "http://partner.example.com/",
  • Network accessline 28
    { "id": "d12", "path": "/about/", "field": "link", "from": "http://partner.example.com/",
  • Network accessline 29
    "to": "https://partner.example.com/", "reason": "suggestion http-links: <why>",
  • Network accessline 29
    "to": "https://partner.example.com/", "reason": "suggestion http-links: <why>",
  • Network accessline 48
    npm run review:shoot -- --base http://localhost:4321 --routes <pages> --widths 390,1440 --out review/new-<id> --delay 0
  • Network accessline 48
    npm run review:shoot -- --base http://localhost:4321 --routes <pages> --widths 390,1440 --out review/new-<id> --delay 0

skills/convert-site/references/build-rules.md

  • Network accessline 48
    can be clicked through, offer it as a proposal: one decision, and a `proposalOn(id)` switch in   a small helper the page body passes through, that rewrites body `<a href>` on the live origin   (`https://`, `http://` or `//`, with or without
  • Network accessline 48
    can be clicked through, offer it as a proposal: one decision, and a `proposalOn(id)` switch in   a small helper the page body passes through, that rewrites body `<a href>` on the live origin   (`https://`, `http://` or `//`, with or without
  • Network accessline 49
    a small helper the page body passes through, that rewrites body `<a href>` on the live origin   (`https://`, `http://` or `//`, with or without `www.`) to root-relative. It leaves head tags   (canonical, alternate, og) alone and keeps any h
  • Network accessline 49
    a small helper the page body passes through, that rewrites body `<a href>` on the live origin   (`https://`, `http://` or `//`, with or without `www.`) to root-relative. It leaves head tags   (canonical, alternate, og) alone and keeps any h
  • Network accessline 50
    (`https://`, `http://` or `//`, with or without `www.`) to root-relative. It leaves head tags
  • Network accessline 50
    (`https://`, `http://` or `//`, with or without `www.`) to root-relative. It leaves head tags
  • Network accessline 53
    changes (`from` the live href form, `to` the root-relative one); no gate compares it, since the   links gate already counts both forms as internal. The helper is a dozen lines: match   `href="https://www.example.com/..."` (and the `http://`
  • Network accessline 53
    changes (`from` the live href form, `to` the root-relative one); no gate compares it, since the   links gate already counts both forms as internal. The helper is a dozen lines: match   `href="https://www.example.com/..."` (and the `http://`
  • Network accessline 54
    links gate already counts both forms as internal. The helper is a dozen lines: match   `href="https://www.example.com/..."` (and the `http://`, `//` and apex forms) in the body   markup, replace the origin with nothing when `proposalOn(id)`
  • Network accessline 54
    links gate already counts both forms as internal. The helper is a dozen lines: match   `href="https://www.example.com/..."` (and the `http://`, `//` and apex forms) in the body   markup, replace the origin with nothing when `proposalOn(id)`
  • Network accessline 55
    `href="https://www.example.com/..."` (and the `http://`, `//` and apex forms) in the body
  • Network accessline 55
    `href="https://www.example.com/..."` (and the `http://`, `//` and apex forms) in the body
  • Network accessline 56
    markup, replace the origin with nothing when `proposalOn(id)` is true, and return the markup   unchanged otherwise. - **WordPress API head links are kept as captured.** `wp-json/` (`rel="https://api.w.org/"`),
  • Network accessline 56
    markup, replace the origin with nothing when `proposalOn(id)` is true, and return the markup   unchanged otherwise. - **WordPress API head links are kept as captured.** `wp-json/` (`rel="https://api.w.org/"`),
  • Network accessline 57
    unchanged otherwise. - **WordPress API head links are kept as captured.** `wp-json/` (`rel="https://api.w.org/"`),   `xmlrpc.php?rsd` (`EditURI`) and `wp-json/wp/v2/pages/N` (`alternate`) stay in the head
  • Network accessline 57
    unchanged otherwise. - **WordPress API head links are kept as captured.** `wp-json/` (`rel="https://api.w.org/"`),   `xmlrpc.php?rsd` (`EditURI`) and `wp-json/wp/v2/pages/N` (`alternate`) stay in the head
  • Network accessline 58
    - **WordPress API head links are kept as captured.** `wp-json/` (`rel="https://api.w.org/"`),
  • Network accessline 58
    - **WordPress API head links are kept as captured.** `wp-json/` (`rel="https://api.w.org/"`),

skills/convert-site/references/forms.md

  • Network accessline 45
    - `action` to the endpoint (`https://formspree.io/f/<form id>`), `method="POST"`;
  • Network accessline 45
    - `action` to the endpoint (`https://formspree.io/f/<form id>`), `method="POST"`;
  • Network accessline 50
    Asked here, at the forms step, never at intake, and never a stop: send the person one line ("create a form at formspree.io, send me the id after /f/; ids are not secret") and carry on with the placeholder `https://formspree.io/f/REPLACE`. A
  • Network accessline 50
    Asked here, at the forms step, never at intake, and never a stop: send the person one line ("create a form at formspree.io, send me the id after /f/; ids are not secret") and carry on with the placeholder `https://formspree.io/f/REPLACE`. A
  • Network accessline 51
    ("create a form at formspree.io, send me the id after /f/; ids are not secret") and carry on with the placeholder `https://formspree.io/f/REPLACE`. Add the needs-you item. While the placeholder is in the build, `pre-launch` fails `placehold
  • Network accessline 51
    ("create a form at formspree.io, send me the id after /f/; ids are not secret") and carry on with the placeholder `https://formspree.io/f/REPLACE`. Add the needs-you item. While the placeholder is in the build, `pre-launch` fails `placehold
  • Network accessline 52
    the placeholder `https://formspree.io/f/REPLACE`. Add the needs-you item. While the placeholder is
  • Network accessline 52
    the placeholder `https://formspree.io/f/REPLACE`. Add the needs-you item. While the placeholder is
  • Network accessline 94
    npm run verify -- --endpoint https://formspree.io/f/<id> --honeypot _gotcha --thank-you /thank-you/
  • Network accessline 94
    npm run verify -- --endpoint https://formspree.io/f/<id> --honeypot _gotcha --thank-you /thank-you/

skills/convert-site/references/hosting-cloudflare.md

  • Network accessline 19
    The preview is `https://astro-rebuild.<slug>.pages.dev`: that is the staging URL,
  • Network accessline 19
    The preview is `https://astro-rebuild.<slug>.pages.dev`: that is the staging URL,
  • Network accessline 33
    https://*.pages.dev/*
  • Network accessline 33
    https://*.pages.dev/*

skills/convert-site/references/hosting-vercel.md

  • Access to secretsline 38
    [Credential-related source omitted]
  • Access to secretsline 38
    [Credential-related source omitted]
  • Network accessline 186
    This applies only when `publicStaging` is `false`; on the default path there is no bypass secret and no needs-you line for one. A protected deployment answers a request without the bypass with a `302` to `https://vercel.com/sso-api?...`, no
  • Network accessline 186
    This applies only when `publicStaging` is `false`; on the default path there is no bypass secret and no needs-you line for one. A protected deployment answers a request without the bypass with a `302` to `https://vercel.com/sso-api?...`, no
  • Network accessline 187
    secret and no needs-you line for one. A protected deployment answers a request without the bypass with a `302` to `https://vercel.com/sso-api?...`, not a 401 or a login page. `verify-live` recognises it and stops with exit 3 and `deployment
  • Network accessline 187
    secret and no needs-you line for one. A protected deployment answers a request without the bypass with a `302` to `https://vercel.com/sso-api?...`, not a 401 or a login page. `verify-live` recognises it and stops with exit 3 and `deployment
  • Network accessline 188
    bypass with a `302` to `https://vercel.com/sso-api?...`, not a 401 or a login page. `verify-live` recognises it and stops
  • Network accessline 188
    bypass with a `302` to `https://vercel.com/sso-api?...`, not a 401 or a login page. `verify-live` recognises it and stops
  • Access to secretsline 192
    [Credential-related source omitted]
  • Access to secretsline 192
    [Credential-related source omitted]
  • Access to secretsline 195
    [Credential-related source omitted]
  • Access to secretsline 195
    [Credential-related source omitted]

skills/convert-site/references/intake.md

  • Network accessline 80
    | `gh` not logged in | The repo stays local; "create the repo, push `main` and `astro-rebuild`, open the PR from `.conversion/pr-body.md`" goes on your list | | Hosting CLI not logged in | No staging deploy; `npm run review:serve` locally; 
  • Network accessline 80
    | `gh` not logged in | The repo stays local; "create the repo, push `main` and `astro-rebuild`, open the PR from `.conversion/pr-body.md`" goes on your list | | Hosting CLI not logged in | No staging deploy; `npm run review:serve` locally; 
  • Network accessline 81
    | Hosting CLI not logged in | No staging deploy; `npm run review:serve` locally; the staging audit and `verify-live` are "Not covered"; "deploy staging" goes on your list | | No form id yet (asked at the forms step, never here; only when th
  • Network accessline 81
    | Hosting CLI not logged in | No staging deploy; `npm run review:serve` locally; the staging audit and `verify-live` are "Not covered"; "deploy staging" goes on your list | | No form id yet (asked at the forms step, never here; only when th
  • Network accessline 82
    | No form id yet (asked at the forms step, never here; only when the capture found a POST form) | Forms post to `https://formspree.io/f/REPLACE`; `pre-launch` fails on `placeholders.form-id` until you give the id; the PR opens as a draft; "
  • Network accessline 82
    | No form id yet (asked at the forms step, never here; only when the capture found a POST form) | Forms post to `https://formspree.io/f/REPLACE`; `pre-launch` fails on `placeholders.form-id` until you give the id; the PR opens as a draft; "

skills/convert-site/references/phases.md

  • Network accessline 141
    5. **Oddities**, one decision each, default "reproduce live": a missing or second H1, a dead    tag, a broken internal link, a redirect chain, a sitemap URL that 404s, a slug claimed twice    (category base), a shortcode printed as text, an
  • Network accessline 141
    5. **Oddities**, one decision each, default "reproduce live": a missing or second H1, a dead    tag, a broken internal link, a redirect chain, a sitemap URL that 404s, a slug claimed twice    (category base), a shortcode printed as text, an
  • Network accessline 142
    tag, a broken internal link, a redirect chain, a sitemap URL that 404s, a slug claimed twice    (category base), a shortcode printed as text, an `http://` canonical, mixed content, a    noindex page in the sitemap, a font loaded from a font
  • Network accessline 142
    tag, a broken internal link, a redirect chain, a sitemap URL that 404s, a slug claimed twice    (category base), a shortcode printed as text, an `http://` canonical, mixed content, a    noindex page in the sitemap, a font loaded from a font
  • Network accessline 143
    (category base), a shortcode printed as text, an `http://` canonical, mixed content, a
  • Network accessline 143
    (category base), a shortcode printed as text, an `http://` canonical, mixed content, a
  • Network accessline 178
    node $KIT/skills/convert-site/scripts/init-site.mjs --dir $SITE --origin $LIVE --name "<site name>" --host <hosting> --trailing-slash <always|never> --repo https://github.com/<owner>/<slug>.git
  • Network accessline 178
    node $KIT/skills/convert-site/scripts/init-site.mjs --dir $SITE --origin $LIVE --name "<site name>" --host <hosting> --trailing-slash <always|never> --repo https://github.com/<owner>/<slug>.git
  • Network accessline 279
    look, write down every difference, fix from `capture/`, repeat. Never reshoot live to get a match. The proof is `npm run review:diff -- --a capture/screens/live --b review/new --out review/diff` and `npm run review:styles -- --live $LIVE --
  • Network accessline 279
    look, write down every difference, fix from `capture/`, repeat. Never reshoot live to get a match. The proof is `npm run review:diff -- --a capture/screens/live --b review/new --out review/diff` and `npm run review:styles -- --live $LIVE --
  • Network accessline 280
    match. The proof is `npm run review:diff -- --a capture/screens/live --b review/new --out review/diff` and `npm run review:styles -- --live $LIVE --new http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review
  • Network accessline 280
    match. The proof is `npm run review:diff -- --a capture/screens/live --b review/new --out review/diff` and `npm run review:styles -- --live $LIVE --new http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review
  • Network accessline 281
    review/diff` and `npm run review:styles -- --live $LIVE --new http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review/styles.json` exiting 0 for the template set (with `npm run review:serve` serving the buil
  • Network accessline 281
    review/diff` and `npm run review:styles -- --live $LIVE --new http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review/styles.json` exiting 0 for the template set (with `npm run review:serve` serving the buil
  • Access to secretsline 431
    [Credential-related source omitted]
  • Access to secretsline 431
    [Credential-related source omitted]

skills/convert-site/scripts/copy-assets.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node

skills/convert-site/scripts/css-coverage.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 41
    --base     origin to load, e.g. https://www.example.com
  • Network accessline 41
    --base     origin to load, e.g. https://www.example.com

skills/convert-site/scripts/css-prune.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 17
    [--public public] [--inline-out src/styles/inline]                          [--capture <capture dir>]                          [--widths 390,768,1440] [--origin https://www.example.com]
  • Network accessline 17
    [--public public] [--inline-out src/styles/inline]                          [--capture <capture dir>]                          [--widths 390,768,1440] [--origin https://www.example.com]
  • Network accessline 18
    [--capture <capture dir>]                          [--widths 390,768,1440] [--origin https://www.example.com]        node css-prune.mjs --single-sheet --css <capture/css dir> --coverage coverage.json
  • Network accessline 18
    [--capture <capture dir>]                          [--widths 390,768,1440] [--origin https://www.example.com]        node css-prune.mjs --single-sheet --css <capture/css dir> --coverage coverage.json
  • Network accessline 19
    [--widths 390,768,1440] [--origin https://www.example.com]
  • Network accessline 19
    [--widths 390,768,1440] [--origin https://www.example.com]
  • Network accessline 153
    const DEFAULT_WIDTHS = [390, 768, 1440]; const VIEWPORT_HEIGHT = 900; const PLACEHOLDER = 'http://placeholder.invalid';
  • Network accessline 153
    const DEFAULT_WIDTHS = [390, 768, 1440]; const VIEWPORT_HEIGHT = 900; const PLACEHOLDER = 'http://placeholder.invalid';
  • Network accessline 155
    const PLACEHOLDER = 'http://placeholder.invalid';
  • Network accessline 155
    const PLACEHOLDER = 'http://placeholder.invalid';
  • Network accessline 252
    // A live URL with a doubled slash (https://site//a.ttf) must not become protocol-relative.
  • Network accessline 252
    // A live URL with a doubled slash (https://site//a.ttf) must not become protocol-relative.

skills/convert-site/scripts/init-site.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 21
    Options:   --dir <path>              target directory (required)   --origin <url>            live site origin, e.g. https://www.example.com (required)
  • Network accessline 21
    Options:   --dir <path>              target directory (required)   --origin <url>            live site origin, e.g. https://www.example.com (required)
  • Network accessline 22
    --dir <path>              target directory (required)   --origin <url>            live site origin, e.g. https://www.example.com (required)   --name <name>             site name (required)
  • Network accessline 22
    --dir <path>              target directory (required)   --origin <url>            live site origin, e.g. https://www.example.com (required)   --name <name>             site name (required)
  • Network accessline 23
    --origin <url>            live site origin, e.g. https://www.example.com (required)
  • Network accessline 23
    --origin <url>            live site origin, e.g. https://www.example.com (required)

skills/convert-site/scripts/lib/blocked-hosts.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/convert-site/scripts/lib/excluded.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Network accessline 11
    let pathname;   try {     pathname = new URL(path, 'http://x').pathname;
  • Network accessline 11
    let pathname;   try {     pathname = new URL(path, 'http://x').pathname;
  • Network accessline 12
    try {     pathname = new URL(path, 'http://x').pathname;   } catch {
  • Network accessline 12
    try {     pathname = new URL(path, 'http://x').pathname;   } catch {
  • Network accessline 13
    pathname = new URL(path, 'http://x').pathname;
  • Network accessline 13
    pathname = new URL(path, 'http://x').pathname;

skills/convert-site/scripts/lib/head-css.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/convert-site/scripts/lib/inline-scope.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/convert-site/scripts/lib/link-records.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Network accessline 25
    const API_RELS = new Set(['https://api.w.org/', 'edituri']);
  • Network accessline 25
    const API_RELS = new Set(['https://api.w.org/', 'edituri']);

skills/convert-site/scripts/lib/node-version.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/convert-site/scripts/lib/page-head.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/convert-site/scripts/lib/review-routes.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/convert-site/scripts/lib/state-selectors.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/convert-site/scripts/lib/stores/blob.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Network accessline 3
    // // The request mirrors @vercel/blob 2.8.2's put() for a read-write token (dist/chunk-XKVPKJPO.js, // requestApi and createPutHeaders): PUT https://vercel.com/api/blob/?pathname=<key> with the raw
  • Network accessline 3
    // // The request mirrors @vercel/blob 2.8.2's put() for a read-write token (dist/chunk-XKVPKJPO.js, // requestApi and createPutHeaders): PUT https://vercel.com/api/blob/?pathname=<key> with the raw
  • Network accessline 4
    // The request mirrors @vercel/blob 2.8.2's put() for a read-write token (dist/chunk-XKVPKJPO.js, // requestApi and createPutHeaders): PUT https://vercel.com/api/blob/?pathname=<key> with the raw // body, x-api-version 13, the store id pars
  • Network accessline 4
    // The request mirrors @vercel/blob 2.8.2's put() for a read-write token (dist/chunk-XKVPKJPO.js, // requestApi and createPutHeaders): PUT https://vercel.com/api/blob/?pathname=<key> with the raw // body, x-api-version 13, the store id pars
  • Network accessline 5
    // requestApi and createPutHeaders): PUT https://vercel.com/api/blob/?pathname=<key> with the raw
  • Network accessline 5
    // requestApi and createPutHeaders): PUT https://vercel.com/api/blob/?pathname=<key> with the raw
  • Network accessline 18
    export const BLOB_ENDPOINT = 'https://vercel.com/api/blob';
  • Network accessline 18
    export const BLOB_ENDPOINT = 'https://vercel.com/api/blob';
  • Access to secretsline 55
    [Credential-related source omitted]
  • Access to secretsline 55
    [Credential-related source omitted]

skills/convert-site/scripts/lib/stores/r2.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Network accessline 65
    export function createR2Store({ env = process.env, endpoint } = {}) {   const base = (endpoint ?? `https://${env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`).replace(/\/+$/, '');
  • Network accessline 65
    export function createR2Store({ env = process.env, endpoint } = {}) {   const base = (endpoint ?? `https://${env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`).replace(/\/+$/, '');
  • Network accessline 66
    const base = (endpoint ?? `https://${env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`).replace(/\/+$/, '');
  • Network accessline 66
    const base = (endpoint ?? `https://${env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`).replace(/\/+$/, '');
  • Access to secretsline 67
    [Credential-related source omitted]
  • Access to secretsline 67
    [Credential-related source omitted]

skills/convert-site/scripts/lib/stores/retry.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Network accessline 8
    export async function fetchWithRetry(url, init, { delays = RETRY_DELAYS_MS } = {}) {   for (let attempt = 0; ; attempt += 1) {     const res = await fetch(url, init);
  • Network accessline 8
    export async function fetchWithRetry(url, init, { delays = RETRY_DELAYS_MS } = {}) {   for (let attempt = 0; ; attempt += 1) {     const res = await fetch(url, init);
  • Network accessline 9
    for (let attempt = 0; ; attempt += 1) {     const res = await fetch(url, init);     if (!retryable(res.status) || attempt >= delays.length) return res;
  • Network accessline 9
    for (let attempt = 0; ; attempt += 1) {     const res = await fetch(url, init);     if (!retryable(res.status) || attempt >= delays.length) return res;
  • Network accessline 10
    const res = await fetch(url, init);
  • Network accessline 10
    const res = await fetch(url, init);

skills/convert-site/scripts/link-exceptions.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 20
    Appends to --out one "link" exception per href the links gate would find broken in a build that keeps the captured markup:   - every WordPress API head link of each page: wp-json/ (rel="https://api.w.org/"),
  • Network accessline 20
    Appends to --out one "link" exception per href the links gate would find broken in a build that keeps the captured markup:   - every WordPress API head link of each page: wp-json/ (rel="https://api.w.org/"),
  • Network accessline 21
    that keeps the captured markup:   - every WordPress API head link of each page: wp-json/ (rel="https://api.w.org/"),     xmlrpc.php?rsd (rel="EditURI"), wp-json/wp/v2/* (rel="alternate") and the oEmbed
  • Network accessline 21
    that keeps the captured markup:   - every WordPress API head link of each page: wp-json/ (rel="https://api.w.org/"),     xmlrpc.php?rsd (rel="EditURI"), wp-json/wp/v2/* (rel="alternate") and the oEmbed
  • Network accessline 22
    - every WordPress API head link of each page: wp-json/ (rel="https://api.w.org/"),
  • Network accessline 22
    - every WordPress API head link of each page: wp-json/ (rel="https://api.w.org/"),
  • Network accessline 79
    const meta = readJson(join(baseline, 'meta.json'), {});   const captureMeta = readJson(join(capture, 'meta.json'), {});   const origin = originOf(meta.canonicalOrigin ?? '') ?? originOf(meta.origin ?? '') ?? 'http://site.invalid';
  • Network accessline 79
    const meta = readJson(join(baseline, 'meta.json'), {});   const captureMeta = readJson(join(capture, 'meta.json'), {});   const origin = originOf(meta.canonicalOrigin ?? '') ?? originOf(meta.origin ?? '') ?? 'http://site.invalid';
  • Network accessline 80
    const captureMeta = readJson(join(capture, 'meta.json'), {});   const origin = originOf(meta.canonicalOrigin ?? '') ?? originOf(meta.origin ?? '') ?? 'http://site.invalid';   const internalOrigins = new Set([originOf(meta.origin ?? ''), ori
  • Network accessline 80
    const captureMeta = readJson(join(capture, 'meta.json'), {});   const origin = originOf(meta.canonicalOrigin ?? '') ?? originOf(meta.origin ?? '') ?? 'http://site.invalid';   const internalOrigins = new Set([originOf(meta.origin ?? ''), ori
  • Network accessline 81
    const origin = originOf(meta.canonicalOrigin ?? '') ?? originOf(meta.origin ?? '') ?? 'http://site.invalid';
  • Network accessline 81
    const origin = originOf(meta.canonicalOrigin ?? '') ?? originOf(meta.origin ?? '') ?? 'http://site.invalid';

skills/convert-site/scripts/media-plan.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node

skills/convert-site/scripts/media-upload.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node

skills/convert-site/scripts/preflight.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node
  • Access to secretsline 59
    [Credential-related source omitted]
  • Access to secretsline 59
    [Credential-related source omitted]

skills/convert-site/scripts/prelaunch-reconcile.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 124
    function pathnameOf(value) {   try {     return new URL(value, 'http://x.invalid').pathname;
  • Network accessline 124
    function pathnameOf(value) {   try {     return new URL(value, 'http://x.invalid').pathname;
  • Network accessline 125
    try {     return new URL(value, 'http://x.invalid').pathname;   } catch {
  • Network accessline 125
    try {     return new URL(value, 'http://x.invalid').pathname;   } catch {
  • Network accessline 126
    return new URL(value, 'http://x.invalid').pathname;
  • Network accessline 126
    return new URL(value, 'http://x.invalid').pathname;

skills/convert-site/scripts/review-serve.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 19
    Serves <site>/dist/ at http://localhost:<port> for the review:* steps and applies <site>/vercel.json
  • Network accessline 19
    Serves <site>/dist/ at http://localhost:<port> for the review:* steps and applies <site>/vercel.json
  • Network accessline 142
    let upstream;   try {     upstream = await fetch(destination, { method: req.method, headers, redirect: 'follow' });
  • Network accessline 142
    let upstream;   try {     upstream = await fetch(destination, { method: req.method, headers, redirect: 'follow' });
  • Network accessline 143
    try {     upstream = await fetch(destination, { method: req.method, headers, redirect: 'follow' });   } catch (err) {
  • Network accessline 143
    try {     upstream = await fetch(destination, { method: req.method, headers, redirect: 'follow' });   } catch (err) {
  • Network accessline 144
    upstream = await fetch(destination, { method: req.method, headers, redirect: 'follow' });
  • Network accessline 144
    upstream = await fetch(destination, { method: req.method, headers, redirect: 'follow' });
  • Network accessline 207
    return res.end(`review-serve: ${err.message}\n`);     }     const url = new URL(req.url, 'http://localhost');
  • Network accessline 207
    return res.end(`review-serve: ${err.message}\n`);     }     const url = new URL(req.url, 'http://localhost');
  • Network accessline 208
    }     const url = new URL(req.url, 'http://localhost');     const { pathname: path, search } = url;
  • Network accessline 208
    }     const url = new URL(req.url, 'http://localhost');     const { pathname: path, search } = url;
  • Network accessline 209
    const url = new URL(req.url, 'http://localhost');
  • Network accessline 209
    const url = new URL(req.url, 'http://localhost');
  • Network accessline 284
    process.once('SIGTERM', stop);   process.once('SIGINT', stop);   console.log(`review-serve: serving ${dist} at http://localhost:${port}`);
  • Network accessline 284
    process.once('SIGTERM', stop);   process.once('SIGINT', stop);   console.log(`review-serve: serving ${dist} at http://localhost:${port}`);
  • Network accessline 285
    process.once('SIGINT', stop);   console.log(`review-serve: serving ${dist} at http://localhost:${port}`); }
  • Network accessline 285
    process.once('SIGINT', stop);   console.log(`review-serve: serving ${dist} at http://localhost:${port}`); }
  • Network accessline 286
    console.log(`review-serve: serving ${dist} at http://localhost:${port}`);
  • Network accessline 286
    console.log(`review-serve: serving ${dist} at http://localhost:${port}`);
  • Network accessline 305
    writeFileSync(join(dir, PID_FILE), `${child.pid}\n`);       child.unref();       console.log(`review-serve: running in the background (pid ${child.pid}) at http://localhost:${port}; stop it with --stop`);
  • Network accessline 305
    writeFileSync(join(dir, PID_FILE), `${child.pid}\n`);       child.unref();       console.log(`review-serve: running in the background (pid ${child.pid}) at http://localhost:${port}; stop it with --stop`);
  • Network accessline 306
    child.unref();       console.log(`review-serve: running in the background (pid ${child.pid}) at http://localhost:${port}; stop it with --stop`);       return;
  • Network accessline 306
    child.unref();       console.log(`review-serve: running in the background (pid ${child.pid}) at http://localhost:${port}; stop it with --stop`);       return;
  • Network accessline 307
    console.log(`review-serve: running in the background (pid ${child.pid}) at http://localhost:${port}; stop it with --stop`);
  • Network accessline 307
    console.log(`review-serve: running in the background (pid ${child.pid}) at http://localhost:${port}; stop it with --stop`);

skills/convert-site/scripts/state.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node

skills/convert-site/templates/cloudflare/r2-media-function.js

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/convert-site/templates/site/astro.config.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/convert-site/templates/site/docs/LAUNCH.md

  • Network accessline 9
    export STAGING_URL=""     export FORM_ENDPOINT="https://formspree.io/f/REPLACE"
  • Network accessline 9
    export STAGING_URL=""     export FORM_ENDPOINT="https://formspree.io/f/REPLACE"
  • Network accessline 10
    export FORM_ENDPOINT="https://formspree.io/f/REPLACE"
  • Network accessline 10
    export FORM_ENDPOINT="https://formspree.io/f/REPLACE"
  • Network accessline 30
    are not committed, so a fresh clone cannot run it; there, read the `npm run review:check`       output quoted in the pull request instead. With `npm run review:serve` running in a second terminal,       `npm run review:shoot -- --base http:
  • Network accessline 30
    are not committed, so a fresh clone cannot run it; there, read the `npm run review:check`       output quoted in the pull request instead. With `npm run review:serve` running in a second terminal,       `npm run review:shoot -- --base http:
  • Network accessline 31
    output quoted in the pull request instead. With `npm run review:serve` running in a second terminal,       `npm run review:shoot -- --base http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review/new`,       
  • Network accessline 31
    output quoted in the pull request instead. With `npm run review:serve` running in a second terminal,       `npm run review:shoot -- --base http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review/new`,       
  • Network accessline 32
    `npm run review:shoot -- --base http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review/new`,
  • Network accessline 32
    `npm run review:shoot -- --base http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review/new`,
  • Network accessline 33
    then `npm run review:diff -- --a capture/screens/live --b review/new --out review/diff`       exits 0,       `npm run review:styles -- --live {{ORIGIN}} --new http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out
  • Network accessline 33
    then `npm run review:diff -- --a capture/screens/live --b review/new --out review/diff`       exits 0,       `npm run review:styles -- --live {{ORIGIN}} --new http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out
  • Network accessline 34
    exits 0,       `npm run review:styles -- --live {{ORIGIN}} --new http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review/styles.json`       (it reads the live site, paced),
  • Network accessline 34
    exits 0,       `npm run review:styles -- --live {{ORIGIN}} --new http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review/styles.json`       (it reads the live site, paced),
  • Network accessline 35
    `npm run review:styles -- --live {{ORIGIN}} --new http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review/styles.json`
  • Network accessline 35
    `npm run review:styles -- --live {{ORIGIN}} --new http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review/styles.json`

skills/convert-site/templates/site/package.json

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file; content unavailable
  • Executable scriptline 1
    Executable file; content unavailable
  • Executable scriptline 1
    Executable file; content unavailable
  • Executable scriptline 1
    Executable file; content unavailable
  • Executable scriptline 1
    Executable file; content unavailable
  • Executable scriptline 1
    Executable file; content unavailable
  • Executable scriptline 1
    Executable file; content unavailable
  • Executable scriptline 1
    Executable file; content unavailable
  • Executable scriptline 1
    Executable file; content unavailable
  • Executable scriptline 1
    Executable file; content unavailable
  • Executable scriptline 1
    Executable file; content unavailable
  • Executable scriptline 1
    Executable file; content unavailable
  • Executable scriptline 1
    Executable file; content unavailable
  • Executable scriptline 1
    Executable file; content unavailable
  • Executable scriptline 1
    Executable file

skills/convert-site/templates/site/public/_headers

  • Network accessline 9
    # Cloudflare Pages preview deployments (*.pages.dev) stay out of search; the production # host has no such rule, and the build adds a meta robots noindex unless PUBLIC_INDEXABLE=true. https://*.pages.dev/*
  • Network accessline 9
    # Cloudflare Pages preview deployments (*.pages.dev) stay out of search; the production # host has no such rule, and the build adds a meta robots noindex unless PUBLIC_INDEXABLE=true. https://*.pages.dev/*
  • Network accessline 10
    # host has no such rule, and the build adds a meta robots noindex unless PUBLIC_INDEXABLE=true. https://*.pages.dev/*   X-Robots-Tag: noindex
  • Network accessline 10
    # host has no such rule, and the build adds a meta robots noindex unless PUBLIC_INDEXABLE=true. https://*.pages.dev/*   X-Robots-Tag: noindex
  • Network accessline 11
    https://*.pages.dev/*
  • Network accessline 11
    https://*.pages.dev/*

skills/convert-site/templates/site/src/lib/exceptions.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/convert-site/templates/site/src/lib/site.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/convert-site/templates/site/src/pages/robots.txt.js

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/references/host.md

  • Network accessline 38
    ### `host.http-not-redirected` — high **Means.** Plain `http://` serves the site instead of redirecting to `https://`.
  • Network accessline 38
    ### `host.http-not-redirected` — high **Means.** Plain `http://` serves the site instead of redirecting to `https://`.
  • Network accessline 39
    **Means.** Plain `http://` serves the site instead of redirecting to `https://`.
  • Network accessline 39
    **Means.** Plain `http://` serves the site instead of redirecting to `https://`.
  • Network accessline 99
    ### `host.mixed-content` — high **Means.** A page served over https references a subresource — a script, a stylesheet, an image, an iframe — over plain `http://`.
  • Network accessline 99
    ### `host.mixed-content` — high **Means.** A page served over https references a subresource — a script, a stylesheet, an image, an iframe — over plain `http://`.
  • Network accessline 100
    **Means.** A page served over https references a subresource — a script, a stylesheet, an image, an iframe — over plain `http://`. **At launch.** Browsers block active mixed content outright, so the script or stylesheet simply
  • Network accessline 100
    **Means.** A page served over https references a subresource — a script, a stylesheet, an image, an iframe — over plain `http://`. **At launch.** Browsers block active mixed content outright, so the script or stylesheet simply
  • Network accessline 101
    an iframe — over plain `http://`.
  • Network accessline 101
    an iframe — over plain `http://`.
  • Network accessline 104
    content (an image) loads with a warning and strips the padlock, which visitors read as "this site is not safe". **Fix.** Rewrite the reference to `https://`, or to a protocol-relative path if the asset lives on
  • Network accessline 104
    content (an image) loads with a warning and strips the padlock, which visitors read as "this site is not safe". **Fix.** Rewrite the reference to `https://`, or to a protocol-relative path if the asset lives on
  • Network accessline 105
    is not safe". **Fix.** Rewrite the reference to `https://`, or to a protocol-relative path if the asset lives on this site. Then find where the url came from — a hard-coded absolute url in a template, a CMS
  • Network accessline 105
    is not safe". **Fix.** Rewrite the reference to `https://`, or to a protocol-relative path if the asset lives on this site. Then find where the url came from — a hard-coded absolute url in a template, a CMS
  • Network accessline 106
    **Fix.** Rewrite the reference to `https://`, or to a protocol-relative path if the asset lives on
  • Network accessline 106
    **Fix.** Rewrite the reference to `https://`, or to a protocol-relative path if the asset lives on

skills/launch-audit/scripts/launch-audit.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node

skills/launch-audit/scripts/lib/args.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/baseline.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/browser.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/checks/_ctx.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Network accessline 8
    //   2. sitemaps            — discovery, then one-level expansion of the FIRST sitemap found //   3. crawl               — seeded with the start url and every expanded sitemap loc //   4. root variants       — http://host/, https://host/, t
  • Network accessline 8
    //   2. sitemaps            — discovery, then one-level expansion of the FIRST sitemap found //   3. crawl               — seeded with the start url and every expanded sitemap loc //   4. root variants       — http://host/, https://host/, t
  • Network accessline 9
    //   3. crawl               — seeded with the start url and every expanded sitemap loc //   4. root variants       — http://host/, https://host/, the apex root, the www counterpart when //                            the host is one that cou
  • Network accessline 9
    //   3. crawl               — seeded with the start url and every expanded sitemap loc //   4. root variants       — http://host/, https://host/, the apex root, the www counterpart when //                            the host is one that cou
  • Network accessline 10
    //   4. root variants       — http://host/, https://host/, the apex root, the www counterpart when
  • Network accessline 10
    //   4. root variants       — http://host/, https://host/, the apex root, the www counterpart when
  • Network accessline 228
    // off-origin from a host that exists to host forms, wherever it sits on the page. Off-origin is // required for the host-list branch, because a site *hosted* on one of those domains matches its // own host: `https://acme.netlify.app/widget
  • Network accessline 228
    // off-origin from a host that exists to host forms, wherever it sits on the page. Off-origin is // required for the host-list branch, because a site *hosted* on one of those domains matches its // own host: `https://acme.netlify.app/widget
  • Network accessline 229
    // required for the host-list branch, because a site *hosted* on one of those domains matches its // own host: `https://acme.netlify.app/widget.html` in an <iframe> is that site's own page, not an // embedded form. A same-origin script outs
  • Network accessline 229
    // required for the host-list branch, because a site *hosted* on one of those domains matches its // own host: `https://acme.netlify.app/widget.html` in an <iframe> is that site's own page, not an // embedded form. A same-origin script outs
  • Network accessline 230
    // own host: `https://acme.netlify.app/widget.html` in an <iframe> is that site's own page, not an
  • Network accessline 230
    // own host: `https://acme.netlify.app/widget.html` in an <iframe> is that site's own page, not an
  • Network accessline 334
    const wwwUrl = wwwCounterpart ? `${start.protocol}//${www}/` : null   const variantUrls = [     `http://${host}/`,
  • Network accessline 334
    const wwwUrl = wwwCounterpart ? `${start.protocol}//${www}/` : null   const variantUrls = [     `http://${host}/`,
  • Network accessline 335
    const variantUrls = [     `http://${host}/`,     `https://${host}/`,
  • Network accessline 335
    const variantUrls = [     `http://${host}/`,     `https://${host}/`,
  • Network accessline 336
    `http://${host}/`,
  • Network accessline 336
    `http://${host}/`,
  • Network accessline 337
    `https://${host}/`,
  • Network accessline 337
    `https://${host}/`,

skills/launch-audit/scripts/lib/checks/a11y.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/checks/analytics.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/checks/browser-tier.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/checks/content.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/checks/forms.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/checks/head.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/checks/host.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Network accessline 164
    return [emit(httpNotRedirected, {       page: probe.url,       detail: 'The http:// origin serves the site rather than redirecting to https://. Anyone who types the bare domain, or follows an old link, gets an unencrypted page.',
  • Network accessline 164
    return [emit(httpNotRedirected, {       page: probe.url,       detail: 'The http:// origin serves the site rather than redirecting to https://. Anyone who types the bare domain, or follows an old link, gets an unencrypted page.',
  • Network accessline 165
    page: probe.url,       detail: 'The http:// origin serves the site rather than redirecting to https://. Anyone who types the bare domain, or follows an old link, gets an unencrypted page.',       evidence: [url(probe.url), status(`HTTP ${pr
  • Network accessline 165
    page: probe.url,       detail: 'The http:// origin serves the site rather than redirecting to https://. Anyone who types the bare domain, or follows an old link, gets an unencrypted page.',       evidence: [url(probe.url), status(`HTTP ${pr
  • Network accessline 166
    detail: 'The http:// origin serves the site rather than redirecting to https://. Anyone who types the bare domain, or follows an old link, gets an unencrypted page.',
  • Network accessline 166
    detail: 'The http:// origin serves the site rather than redirecting to https://. Anyone who types the bare domain, or follows an old link, gets an unencrypted page.',
  • Network accessline 186
    detail: `The upgrade to https answers ${first.status}, a temporary redirect. Browsers and search engines keep asking for the http url instead of remembering the move.`,       evidence: [url(probe.url), status(`HTTP ${first.status} → ${resol
  • Network accessline 186
    detail: `The upgrade to https answers ${first.status}, a temporary redirect. Browsers and search engines keep asking for the http url instead of remembering the move.`,       evidence: [url(probe.url), status(`HTTP ${first.status} → ${resol
  • Network accessline 187
    evidence: [url(probe.url), status(`HTTP ${first.status} → ${resolveHop(first.location, first.url) ?? first.location}`)],       fix: 'Return 301 (or 308) from http:// to https://.',     })]
  • Network accessline 187
    evidence: [url(probe.url), status(`HTTP ${first.status} → ${resolveHop(first.location, first.url) ?? first.location}`)],       fix: 'Return 301 (or 308) from http:// to https://.',     })]
  • Network accessline 188
    fix: 'Return 301 (or 308) from http:// to https://.',
  • Network accessline 188
    fix: 'Return 301 (or 308) from http:// to https://.',
  • Network accessline 238
    if (!ctx.cert || ctx.cert.valid === true) return []     return [emit(certInvalid, {       page: `https://${ctx.target.host}/`,
  • Network accessline 238
    if (!ctx.cert || ctx.cert.valid === true) return []     return [emit(certInvalid, {       page: `https://${ctx.target.host}/`,
  • Network accessline 239
    return [emit(certInvalid, {       page: `https://${ctx.target.host}/`,       detail: 'The certificate served for this host does not validate, so every visitor gets an interstitial security warning before they see anything.',
  • Network accessline 239
    return [emit(certInvalid, {       page: `https://${ctx.target.host}/`,       detail: 'The certificate served for this host does not validate, so every visitor gets an interstitial security warning before they see anything.',
  • Network accessline 240
    page: `https://${ctx.target.host}/`,
  • Network accessline 240
    page: `https://${ctx.target.host}/`,
  • Network accessline 241
    detail: 'The certificate served for this host does not validate, so every visitor gets an interstitial security warning before they see anything.',       evidence: [         url(`https://${ctx.target.host}/`),
  • Network accessline 241
    detail: 'The certificate served for this host does not validate, so every visitor gets an interstitial security warning before they see anything.',       evidence: [         url(`https://${ctx.target.host}/`),
  • Network accessline 242
    evidence: [         url(`https://${ctx.target.host}/`),         cert(`certificate for ${ctx.target.host} did not validate${ctx.cert.error ? `: ${ctx.cert.error}` : ''}`),
  • Network accessline 242
    evidence: [         url(`https://${ctx.target.host}/`),         cert(`certificate for ${ctx.target.host} did not validate${ctx.cert.error ? `: ${ctx.cert.error}` : ''}`),
  • Network accessline 243
    url(`https://${ctx.target.host}/`),
  • Network accessline 243
    url(`https://${ctx.target.host}/`),
  • Network accessline 263
    if (days === null || days === undefined || days >= CERT_EXPIRY_DAYS) return []     return [emit(certExpiring, {       page: `https://${ctx.target.host}/`,
  • Network accessline 263
    if (days === null || days === undefined || days >= CERT_EXPIRY_DAYS) return []     return [emit(certExpiring, {       page: `https://${ctx.target.host}/`,
  • Network accessline 264
    return [emit(certExpiring, {       page: `https://${ctx.target.host}/`,       detail: `The certificate expires in ${days} day${days === 1 ? '' : 's'}. When it does, the site goes down behind a browser warning.`,
  • Network accessline 264
    return [emit(certExpiring, {       page: `https://${ctx.target.host}/`,       detail: `The certificate expires in ${days} day${days === 1 ? '' : 's'}. When it does, the site goes down behind a browser warning.`,
  • Network accessline 265
    page: `https://${ctx.target.host}/`,
  • Network accessline 265
    page: `https://${ctx.target.host}/`,
  • Network accessline 266
    detail: `The certificate expires in ${days} day${days === 1 ? '' : 's'}. When it does, the site goes down behind a browser warning.`,       evidence: [         url(`https://${ctx.target.host}/`),
  • Network accessline 266
    detail: `The certificate expires in ${days} day${days === 1 ? '' : 's'}. When it does, the site goes down behind a browser warning.`,       evidence: [         url(`https://${ctx.target.host}/`),
  • Network accessline 267
    evidence: [         url(`https://${ctx.target.host}/`),         cert(`${days} days left (notAfter ${ctx.cert.validTo ?? 'unknown'})`),
  • Network accessline 267
    evidence: [         url(`https://${ctx.target.host}/`),         cert(`${days} days left (notAfter ${ctx.cert.validTo ?? 'unknown'})`),
  • Network accessline 268
    url(`https://${ctx.target.host}/`),
  • Network accessline 268
    url(`https://${ctx.target.host}/`),
  • Network accessline 313
    if (uncovered.length === 0) return []     return [emit(certMissingSan, {       page: `https://${ctx.target.host}/`,
  • Network accessline 313
    if (uncovered.length === 0) return []     return [emit(certMissingSan, {       page: `https://${ctx.target.host}/`,
  • Network accessline 314
    return [emit(certMissingSan, {       page: `https://${ctx.target.host}/`,       detail: `The certificate's subject alternative names do not cover ${uncovered.join(' or ')}. Any visitor who reaches an uncovered host gets a name-mismatch warn
  • Network accessline 314
    return [emit(certMissingSan, {       page: `https://${ctx.target.host}/`,       detail: `The certificate's subject alternative names do not cover ${uncovered.join(' or ')}. Any visitor who reaches an uncovered host gets a name-mismatch warn
  • Network accessline 315
    page: `https://${ctx.target.host}/`,
  • Network accessline 315
    page: `https://${ctx.target.host}/`,
  • Network accessline 316
    detail: `The certificate's subject alternative names do not cover ${uncovered.join(' or ')}. Any visitor who reaches an uncovered host gets a name-mismatch warning.`,       evidence: [         url(`https://${ctx.target.host}/`),
  • Network accessline 316
    detail: `The certificate's subject alternative names do not cover ${uncovered.join(' or ')}. Any visitor who reaches an uncovered host gets a name-mismatch warning.`,       evidence: [         url(`https://${ctx.target.host}/`),
  • Network accessline 317
    evidence: [         url(`https://${ctx.target.host}/`),         cert(`altNames: ${names.join(', ')}`),
  • Network accessline 317
    evidence: [         url(`https://${ctx.target.host}/`),         cert(`altNames: ${names.join(', ')}`),
  • Network accessline 318
    url(`https://${ctx.target.host}/`),
  • Network accessline 318
    url(`https://${ctx.target.host}/`),

skills/launch-audit/scripts/lib/checks/images.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/checks/indexability.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/checks/inventory.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Network accessline 154
    // // `ctx.target.url` is what the operator typed; the crawl seeds through `normalizeUrl()`, which // strips the fragment. A person who pastes `https://example.com/#top` out of a browser's address
  • Network accessline 154
    // // `ctx.target.url` is what the operator typed; the crawl seeds through `normalizeUrl()`, which // strips the fragment. A person who pastes `https://example.com/#top` out of a browser's address
  • Network accessline 155
    // `ctx.target.url` is what the operator typed; the crawl seeds through `normalizeUrl()`, which // strips the fragment. A person who pastes `https://example.com/#top` out of a browser's address // bar therefore had the two compared by equal
  • Network accessline 155
    // `ctx.target.url` is what the operator typed; the crawl seeds through `normalizeUrl()`, which // strips the fragment. A person who pastes `https://example.com/#top` out of a browser's address // bar therefore had the two compared by equal
  • Network accessline 156
    // strips the fragment. A person who pastes `https://example.com/#top` out of a browser's address
  • Network accessline 156
    // strips the fragment. A person who pastes `https://example.com/#top` out of a browser's address

skills/launch-audit/scripts/lib/checks/links.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/checks/ops.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/checks/perf.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/checks/redirects.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/crawl.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/csv.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Possible obfuscationline 31
    const src = typeof text === 'string' ? text.replace(/^<U+FEFF>/, '') : String(text ?? '')
  • Possible obfuscationline 31
    const src = typeof text === 'string' ? text.replace(/^<U+FEFF>/, '') : String(text ?? '')

skills/launch-audit/scripts/lib/detect/analytics.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Access to secretsline 91
    [Credential-related source omitted]
  • Access to secretsline 91
    [Credential-related source omitted]

skills/launch-audit/scripts/lib/detect/framework.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Network accessline 11
    //   every field, and the checks that would have used those fields skip with a reason. A wrong //   framework hint sends somebody looking for a sitemap integration nobody configured. // - **Regexes read config, they do not evaluate it.** `s
  • Network accessline 11
    //   every field, and the checks that would have used those fields skip with a reason. A wrong //   framework hint sends somebody looking for a sitemap integration nobody configured. // - **Regexes read config, they do not evaluate it.** `s
  • Network accessline 12
    //   framework hint sends somebody looking for a sitemap integration nobody configured. // - **Regexes read config, they do not evaluate it.** `site: 'https://x'` written across two lines //   or built from a variable is simply not found, w
  • Network accessline 12
    //   framework hint sends somebody looking for a sitemap integration nobody configured. // - **Regexes read config, they do not evaluate it.** `site: 'https://x'` written across two lines //   or built from a variable is simply not found, w
  • Network accessline 13
    // - **Regexes read config, they do not evaluate it.** `site: 'https://x'` written across two lines
  • Network accessline 13
    // - **Regexes read config, they do not evaluate it.** `site: 'https://x'` written across two lines

skills/launch-audit/scripts/lib/detect/placeholders.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/dns.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/findings.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/fs-util.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/headers/owasp.json

  • Network accessline 1
    {   "fetched": "2026-09-13",   "source": "https://github.com/OWASP/www-project-secure-headers (ci/headers_add.json, ci/headers_remove.json)",
  • Network accessline 1
    {   "fetched": "2026-09-13",   "source": "https://github.com/OWASP/www-project-secure-headers (ci/headers_add.json, ci/headers_remove.json)",
  • Network accessline 2
    "fetched": "2026-09-13",   "source": "https://github.com/OWASP/www-project-secure-headers (ci/headers_add.json, ci/headers_remove.json)",   "add": [
  • Network accessline 2
    "fetched": "2026-09-13",   "source": "https://github.com/OWASP/www-project-secure-headers (ci/headers_add.json, ci/headers_remove.json)",   "add": [
  • Network accessline 3
    "source": "https://github.com/OWASP/www-project-secure-headers (ci/headers_add.json, ci/headers_remove.json)",
  • Network accessline 3
    "source": "https://github.com/OWASP/www-project-secure-headers (ci/headers_add.json, ci/headers_remove.json)",

skills/launch-audit/scripts/lib/html.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/image-dims.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/net.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Network accessline 18
    export const USER_AGENT = 'website-launch-skills/0.1 (+https://github.com/ethanplusai/website-launch-skills)'
  • Network accessline 18
    export const USER_AGENT = 'website-launch-skills/0.1 (+https://github.com/ethanplusai/website-launch-skills)'

skills/launch-audit/scripts/lib/recorded-net.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Network accessline 9
    // The fixture shape is a flat map of absolute url to recording: // //   { "https://example.test/": { "status": 200, "headers": {...}, "body": "<html>…" } }
  • Network accessline 9
    // The fixture shape is a flat map of absolute url to recording: // //   { "https://example.test/": { "status": 200, "headers": {...}, "body": "<html>…" } }
  • Network accessline 10
    // //   { "https://example.test/": { "status": 200, "headers": {...}, "body": "<html>…" } } //
  • Network accessline 10
    // //   { "https://example.test/": { "status": 200, "headers": {...}, "body": "<html>…" } } //
  • Network accessline 11
    //   { "https://example.test/": { "status": 200, "headers": {...}, "body": "<html>…" } }
  • Network accessline 11
    //   { "https://example.test/": { "status": 200, "headers": {...}, "body": "<html>…" } }

skills/launch-audit/scripts/lib/registry.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/report.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/robots.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/schema/required.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Network accessline 9
    // returns one entry per typed node: // //   { type: 'Organization', missing: ['url'], urlsToVerify: ['https://acme.test/logo.png'] }
  • Network accessline 9
    // returns one entry per typed node: // //   { type: 'Organization', missing: ['url'], urlsToVerify: ['https://acme.test/logo.png'] }
  • Network accessline 10
    // //   { type: 'Organization', missing: ['url'], urlsToVerify: ['https://acme.test/logo.png'] } //
  • Network accessline 10
    // //   { type: 'Organization', missing: ['url'], urlsToVerify: ['https://acme.test/logo.png'] } //
  • Network accessline 11
    //   { type: 'Organization', missing: ['url'], urlsToVerify: ['https://acme.test/logo.png'] }
  • Network accessline 11
    //   { type: 'Organization', missing: ['url'], urlsToVerify: ['https://acme.test/logo.png'] }

skills/launch-audit/scripts/lib/sitemap.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/launch-audit/scripts/lib/slug.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/parity-gates/SKILL.md

  • Network accessline 70
    A captured row (any `source` but `decision`) is a live URL and holds no parameters: for Vercel every `:` and `*` in it is escaped (`/foo:bar/` is written `/foo\:bar/`, and so is `/trackshttps://www.example.com/x/`, a broken live href the ca
  • Network accessline 70
    A captured row (any `source` but `decision`) is a live URL and holds no parameters: for Vercel every `:` and `*` in it is escaped (`/foo:bar/` is written `/foo\:bar/`, and so is `/trackshttps://www.example.com/x/`, a broken live href the ca
  • Network accessline 71
    every `:` and `*` in it is escaped (`/foo:bar/` is written `/foo\:bar/`, and so is `/trackshttps://www.example.com/x/`, a broken live href the capture followed); `//` is kept. Only a `decision` row uses `:name` parameters and `*` splats, an
  • Network accessline 71
    every `:` and `*` in it is escaped (`/foo:bar/` is written `/foo\:bar/`, and so is `/trackshttps://www.example.com/x/`, a broken live href the capture followed); `//` is kept. Only a `decision` row uses `:name` parameters and `*` splats, an
  • Network accessline 72
    `/trackshttps://www.example.com/x/`, a broken live href the capture followed); `//` is kept.
  • Network accessline 72
    `/trackshttps://www.example.com/x/`, a broken live href the capture followed); `//` is kept.
  • Network accessline 84
    npm run build     npm run verify -- --endpoint https://forms.example.com/f/abc --thank-you /thank-you/
  • Network accessline 84
    npm run build     npm run verify -- --endpoint https://forms.example.com/f/abc --thank-you /thank-you/
  • Network accessline 85
    npm run verify -- --endpoint https://forms.example.com/f/abc --thank-you /thank-you/
  • Network accessline 85
    npm run verify -- --endpoint https://forms.example.com/f/abc --thank-you /thank-you/
  • Network accessline 86
    node <skill-dir>/scripts/verify/run-all.mjs --endpoint https://forms.example.com/f/abc --thank-you /thank-you/    # fallback
  • Network accessline 86
    node <skill-dir>/scripts/verify/run-all.mjs --endpoint https://forms.example.com/f/abc --thank-you /thank-you/    # fallback
  • Network accessline 96
    |---|---|---| | `forms` | Each live form is on its page with the same field names in order and method; a POST form's action is `--endpoint` and it carries `--honeypot`; a GET form (a search box) keeps live's action path and needs neither ("
  • Network accessline 96
    |---|---|---| | `forms` | Each live form is on its page with the same field names in order and method; a POST form's action is `--endpoint` and it carries `--honeypot`; a GET form (a search box) keeps live's action path and needs neither ("
  • Network accessline 97
    | `forms` | Each live form is on its page with the same field names in order and method; a POST form's action is `--endpoint` and it carries `--honeypot`; a GET form (a search box) keeps live's action path and needs neither ("N search/GET f
  • Network accessline 97
    | `forms` | Each live form is on its page with the same field names in order and method; a POST form's action is `--endpoint` and it carries `--honeypot`; a GET form (a search box) keeps live's action path and needs neither ("N search/GET f
  • Network accessline 98
    | `headers` | Host config sends nosniff, Referrer-Policy, X-Frame-Options or CSP frame-ancestors on every path, and, when not indexable, `X-Robots-Tag: noindex` on every path or (Vercel) the meta robots noindex on every built page; a previe
  • Network accessline 98
    | `headers` | Host config sends nosniff, Referrer-Policy, X-Frame-Options or CSP frame-ancestors on every path, and, when not indexable, `X-Robots-Tag: noindex` on every path or (Vercel) the meta robots noindex on every built page; a previe
  • Network accessline 144
    npm run verify:live -- --base https://my-site.vercel.app --expect-noindex
  • Network accessline 144
    npm run verify:live -- --base https://my-site.vercel.app --expect-noindex
  • Network accessline 145
    node <skill-dir>/scripts/verify-live.mjs --base https://my-site.vercel.app --expect-noindex    # fallback
  • Network accessline 145
    node <skill-dir>/scripts/verify-live.mjs --base https://my-site.vercel.app --expect-noindex    # fallback
  • Access to secretsline 147
    [Credential-related source omitted]
  • Access to secretsline 147
    [Credential-related source omitted]

skills/parity-gates/references/contracts.md

  • Network accessline 27
    { "/about/": { "title": "About Us | Example", "description": "...", "canonical": "https://www.example.com/about/",
  • Network accessline 27
    { "/about/": { "title": "About Us | Example", "description": "...", "canonical": "https://www.example.com/about/",
  • Network accessline 54
    { "/contact/": [{ "action": "https://www.example.com/wp-admin/admin-post.php", "method": "post",
  • Network accessline 54
    { "/contact/": [{ "action": "https://www.example.com/wp-admin/admin-post.php", "method": "post",
  • Network accessline 74
    [{ "src": "https://www.example.com/wp-content/themes/x/js/menu.js?ver=1.2", "file": "js/1.js",
  • Network accessline 74
    [{ "src": "https://www.example.com/wp-content/themes/x/js/menu.js?ver=1.2", "file": "js/1.js",
  • Network accessline 83
    [{ "href": "https://www.example.com/wp-content/themes/x/style.css?ver=1.2", "file": "css/1.css",
  • Network accessline 83
    [{ "href": "https://www.example.com/wp-content/themes/x/style.css?ver=1.2", "file": "css/1.css",
  • Network accessline 118
    { "origin": "https://www.example.com", "canonicalOrigin": "https://www.example.com",
  • Network accessline 118
    { "origin": "https://www.example.com", "canonicalOrigin": "https://www.example.com",

skills/parity-gates/references/exceptions.md

  • Network accessline 75
    | `text` | text | the page | a phrase in the captured text (or all of it) / its replacement | | `link` | links | the page | the live href (recorded, not compared) / the built href the gate reports as broken | | `redirect` | redirects | the 
  • Network accessline 75
    | `text` | text | the page | a phrase in the captured text (or all of it) / its replacement | | `link` | links | the page | the live href (recorded, not compared) / the built href the gate reports as broken | | `redirect` | redirects | the 
  • Network accessline 76
    | `link` | links | the page | the live href (recorded, not compared) / the built href the gate reports as broken | | `redirect` | redirects | the redirect source | the baseline target with the site's origin stripped (`/services/`, not `http
  • Network accessline 76
    | `link` | links | the page | the live href (recorded, not compared) / the built href the gate reports as broken | | `redirect` | redirects | the redirect source | the baseline target with the site's origin stripped (`/services/`, not `http
  • Network accessline 77
    | `redirect` | redirects | the redirect source | the baseline target with the site's origin stripped (`/services/`, not `https://www.example.com/services/`) / the new target |
  • Network accessline 77
    | `redirect` | redirects | the redirect source | the baseline target with the site's origin stripped (`/services/`, not `https://www.example.com/services/`) / the new target |
  • Network accessline 78
    | `media` | media | the media path | the baseline bytes (a number) / the built bytes, or `""` for a file the build drops | | `markup` | none | the page | a description of the markup before / after (`<a href="https://www.example.com/contact/
  • Network accessline 78
    | `media` | media | the media path | the baseline bytes (a number) / the built bytes, or `""` for a file the build drops | | `markup` | none | the page | a description of the markup before / after (`<a href="https://www.example.com/contact/
  • Network accessline 79
    | `markup` | none | the page | a description of the markup before / after (`<a href="https://www.example.com/contact/">` / `<a href="/contact/">`) |
  • Network accessline 79
    | `markup` | none | the page | a description of the markup before / after (`<a href="https://www.example.com/contact/">` / `<a href="/contact/">`) |
  • Network accessline 98
    { "kind": "redirect", "path": "/trackshttps://www.example.com/exhibitor-contact/",
  • Network accessline 98
    { "kind": "redirect", "path": "/trackshttps://www.example.com/exhibitor-contact/",

skills/parity-gates/scripts/build-baseline.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node

skills/parity-gates/scripts/build-redirects.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 88
    // Escape path-to-regexp's special characters, keeping :name, :name*, :name+ and :name? parameters // (a name starts with a letter or "_"). Any other ":" (/trackshttps://..., a port :8080) becomes
  • Network accessline 88
    // Escape path-to-regexp's special characters, keeping :name, :name*, :name+ and :name? parameters // (a name starts with a letter or "_"). Any other ":" (/trackshttps://..., a port :8080) becomes
  • Network accessline 89
    // (a name starts with a letter or "_"). Any other ":" (/trackshttps://..., a port :8080) becomes
  • Network accessline 89
    // (a name starts with a letter or "_"). Any other ":" (/trackshttps://..., a port :8080) becomes

skills/parity-gates/scripts/lib/cloudflare-resolver.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/parity-gates/scripts/lib/dist.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/parity-gates/scripts/lib/exceptions.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/parity-gates/scripts/lib/excluded.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Network accessline 11
    let pathname;   try {     pathname = new URL(path, 'http://x').pathname;
  • Network accessline 11
    let pathname;   try {     pathname = new URL(path, 'http://x').pathname;
  • Network accessline 12
    try {     pathname = new URL(path, 'http://x').pathname;   } catch {
  • Network accessline 12
    try {     pathname = new URL(path, 'http://x').pathname;   } catch {
  • Network accessline 13
    pathname = new URL(path, 'http://x').pathname;
  • Network accessline 13
    pathname = new URL(path, 'http://x').pathname;

skills/parity-gates/scripts/lib/forms.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/parity-gates/scripts/lib/gate-cli.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/parity-gates/scripts/lib/head.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/parity-gates/scripts/lib/host-resolver.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/parity-gates/scripts/lib/html.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/parity-gates/scripts/lib/node-version.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/parity-gates/scripts/lib/redirects-csv.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Possible obfuscationline 93
    const [header, ...rows] = parseCsvText(text.replace(/^<U+FEFF>/, ''));
  • Possible obfuscationline 93
    const [header, ...rows] = parseCsvText(text.replace(/^<U+FEFF>/, ''));

skills/parity-gates/scripts/lib/srcset.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/parity-gates/scripts/lib/vendors.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/parity-gates/scripts/lib/vercel-resolver.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/parity-gates/scripts/lib/visible-text.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Possible obfuscationline 30
    .replace(/<U+00AD>/g, '')
  • Possible obfuscationline 30
    .replace(/<U+00AD>/g, '')

skills/parity-gates/scripts/verify-live.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 34
    --base <url>            the deploy to check, e.g. https://my-site.vercel.app (required)
  • Network accessline 34
    --base <url>            the deploy to check, e.g. https://my-site.vercel.app (required)
  • Network accessline 88
    // Vercel Authentication answers a request without a valid bypass with a 302 to // https://vercel.com/sso-api?url=...: any redirect to a vercel.com host whose URL names sso-api.
  • Network accessline 88
    // Vercel Authentication answers a request without a valid bypass with a 302 to // https://vercel.com/sso-api?url=...: any redirect to a vercel.com host whose URL names sso-api.
  • Network accessline 89
    // https://vercel.com/sso-api?url=...: any redirect to a vercel.com host whose URL names sso-api.
  • Network accessline 89
    // https://vercel.com/sso-api?url=...: any redirect to a vercel.com host whose URL names sso-api.

skills/parity-gates/scripts/verify/forms.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 94
    export function actionTarget(action, page, origins = []) {   const base = 'http://forms.invalid';
  • Network accessline 94
    export function actionTarget(action, page, origins = []) {   const base = 'http://forms.invalid';
  • Network accessline 95
    const base = 'http://forms.invalid';
  • Network accessline 95
    const base = 'http://forms.invalid';
  • Network accessline 142
    const action = (form.action ?? '').trim();   if (!action) return null;   const base = origins[0] ?? 'http://forms.invalid';
  • Network accessline 142
    const action = (form.action ?? '').trim();   if (!action) return null;   const base = origins[0] ?? 'http://forms.invalid';
  • Network accessline 143
    if (!action) return null;   const base = origins[0] ?? 'http://forms.invalid';   let url;
  • Network accessline 143
    if (!action) return null;   const base = origins[0] ?? 'http://forms.invalid';   let url;
  • Network accessline 144
    const base = origins[0] ?? 'http://forms.invalid';
  • Network accessline 144
    const base = origins[0] ?? 'http://forms.invalid';

skills/parity-gates/scripts/verify/headers.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 21
    Only rules for every path count: vercel.json sources /(.*), /:path* and /:path(.*) without has/missing conditions, and the _headers path /*. A _headers whole-host pattern such as https://*.pages.dev/* counts only as the preview host's noind
  • Network accessline 21
    Only rules for every path count: vercel.json sources /(.*), /:path* and /:path(.*) without has/missing conditions, and the _headers path /*. A _headers whole-host pattern such as https://*.pages.dev/* counts only as the preview host's noind
  • Network accessline 22
    has/missing conditions, and the _headers path /*. A _headers whole-host pattern such as https://*.pages.dev/* counts only as the preview host's noindex: it meets the noindex requirement, and is ignored when PUBLIC_INDEXABLE=true. PUBLIC_IND
  • Network accessline 22
    has/missing conditions, and the _headers path /*. A _headers whole-host pattern such as https://*.pages.dev/* counts only as the preview host's noindex: it meets the noindex requirement, and is ignored when PUBLIC_INDEXABLE=true. PUBLIC_IND
  • Network accessline 23
    https://*.pages.dev/* counts only as the preview host's noindex: it meets the
  • Network accessline 23
    https://*.pages.dev/* counts only as the preview host's noindex: it meets the
  • Network accessline 52
    // The same from a _headers file: a path line, then indented "Name: value" lines. Headers of a // whole-host pattern (https://*.pages.dev/*) go to hostHeaders: they cover that host only.
  • Network accessline 52
    // The same from a _headers file: a path line, then indented "Name: value" lines. Headers of a // whole-host pattern (https://*.pages.dev/*) go to hostHeaders: they cover that host only.
  • Network accessline 53
    // whole-host pattern (https://*.pages.dev/*) go to hostHeaders: they cover that host only.
  • Network accessline 53
    // whole-host pattern (https://*.pages.dev/*) go to hostHeaders: they cover that host only.

skills/parity-gates/scripts/verify/links.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 102
    mediaPaths: new Set(media.map((m) => decode(m.path))),   };   const base = 'http://links.invalid';
  • Network accessline 102
    mediaPaths: new Set(media.map((m) => decode(m.path))),   };   const base = 'http://links.invalid';
  • Network accessline 103
    };   const base = 'http://links.invalid';   const internal = new Set([base, originOf(origin), originOf(meta.origin ?? ''), originOf(meta.canonicalOrigin ?? '')].filter(Boolean));
  • Network accessline 103
    };   const base = 'http://links.invalid';   const internal = new Set([base, originOf(origin), originOf(meta.origin ?? ''), originOf(meta.canonicalOrigin ?? '')].filter(Boolean));
  • Network accessline 104
    const base = 'http://links.invalid';
  • Network accessline 104
    const base = 'http://links.invalid';
  • Network accessline 149
    const args = gateArgs(process.argv.slice(2), NAME, { options: OPTIONS, notes: NOTES });   if (args.origin && !originOf(args.origin)) {     process.stderr.write(`${NAME}: --origin must be a URL such as https://www.example.com, got ${args.ori
  • Network accessline 149
    const args = gateArgs(process.argv.slice(2), NAME, { options: OPTIONS, notes: NOTES });   if (args.origin && !originOf(args.origin)) {     process.stderr.write(`${NAME}: --origin must be a URL such as https://www.example.com, got ${args.ori
  • Network accessline 150
    if (args.origin && !originOf(args.origin)) {     process.stderr.write(`${NAME}: --origin must be a URL such as https://www.example.com, got ${args.origin}\n`);     process.exit(2);
  • Network accessline 150
    if (args.origin && !originOf(args.origin)) {     process.stderr.write(`${NAME}: --origin must be a URL such as https://www.example.com, got ${args.origin}\n`);     process.exit(2);
  • Network accessline 151
    process.stderr.write(`${NAME}: --origin must be a URL such as https://www.example.com, got ${args.origin}\n`);
  • Network accessline 151
    process.stderr.write(`${NAME}: --origin must be a URL such as https://www.example.com, got ${args.origin}\n`);

skills/parity-gates/scripts/verify/media.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node

skills/parity-gates/scripts/verify/redirects.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node

skills/parity-gates/scripts/verify/routes.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node

skills/parity-gates/scripts/verify/run-all.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node

skills/parity-gates/scripts/verify/scripts.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node

skills/parity-gates/scripts/verify/seo.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 167
    const args = gateArgs(process.argv.slice(2), NAME, { options: OPTIONS, notes: NOTES });   if (args.origin && !originOf(args.origin)) {     process.stderr.write(`${NAME}: --origin must be a URL such as https://www.example.com, got ${args.ori
  • Network accessline 167
    const args = gateArgs(process.argv.slice(2), NAME, { options: OPTIONS, notes: NOTES });   if (args.origin && !originOf(args.origin)) {     process.stderr.write(`${NAME}: --origin must be a URL such as https://www.example.com, got ${args.ori
  • Network accessline 168
    if (args.origin && !originOf(args.origin)) {     process.stderr.write(`${NAME}: --origin must be a URL such as https://www.example.com, got ${args.origin}\n`);     process.exit(2);
  • Network accessline 168
    if (args.origin && !originOf(args.origin)) {     process.stderr.write(`${NAME}: --origin must be a URL such as https://www.example.com, got ${args.origin}\n`);     process.exit(2);
  • Network accessline 169
    process.stderr.write(`${NAME}: --origin must be a URL such as https://www.example.com, got ${args.origin}\n`);
  • Network accessline 169
    process.stderr.write(`${NAME}: --origin must be a URL such as https://www.example.com, got ${args.origin}\n`);

skills/parity-gates/scripts/verify/sitemaps.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 174
    const args = gateArgs(process.argv.slice(2), NAME, { options: OPTIONS, notes: NOTES });   if (args.origin && !originOf(args.origin)) {     process.stderr.write(`${NAME}: --origin must be a URL such as https://www.example.com, got ${args.ori
  • Network accessline 174
    const args = gateArgs(process.argv.slice(2), NAME, { options: OPTIONS, notes: NOTES });   if (args.origin && !originOf(args.origin)) {     process.stderr.write(`${NAME}: --origin must be a URL such as https://www.example.com, got ${args.ori
  • Network accessline 175
    if (args.origin && !originOf(args.origin)) {     process.stderr.write(`${NAME}: --origin must be a URL such as https://www.example.com, got ${args.origin}\n`);     process.exit(2);
  • Network accessline 175
    if (args.origin && !originOf(args.origin)) {     process.stderr.write(`${NAME}: --origin must be a URL such as https://www.example.com, got ${args.origin}\n`);     process.exit(2);
  • Network accessline 176
    process.stderr.write(`${NAME}: --origin must be a URL such as https://www.example.com, got ${args.origin}\n`);
  • Network accessline 176
    process.stderr.write(`${NAME}: --origin must be a URL such as https://www.example.com, got ${args.origin}\n`);

skills/parity-gates/scripts/verify/text.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node

skills/post-launch/scripts/lib/checks/cutover.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Network accessline 165
    if (wrong.length === 0) continue       out.push(emit(dnsUnexpected, {         page: `https://${host}/`,
  • Network accessline 165
    if (wrong.length === 0) continue       out.push(emit(dnsUnexpected, {         page: `https://${host}/`,
  • Network accessline 166
    out.push(emit(dnsUnexpected, {         page: `https://${host}/`,         detail: `${wrong.length} of the ${answers.length} public resolvers that answered for ${host} do not carry ${expected.join(', ')}. Until every resolver has it, some sha
  • Network accessline 166
    out.push(emit(dnsUnexpected, {         page: `https://${host}/`,         detail: `${wrong.length} of the ${answers.length} public resolvers that answered for ${host} do not carry ${expected.join(', ')}. Until every resolver has it, some sha
  • Network accessline 167
    page: `https://${host}/`,
  • Network accessline 167
    page: `https://${host}/`,
  • Network accessline 233
    catches: 'A certificate that did not validate, or that was issued before the host moved and never covered it — every visitor gets an interstitial warning.',   run(ctx) {     const at = `https://${ctx.target.host}/`
  • Network accessline 233
    catches: 'A certificate that did not validate, or that was issued before the host moved and never covered it — every visitor gets an interstitial warning.',   run(ctx) {     const at = `https://${ctx.target.host}/`
  • Network accessline 235
    const at = `https://${ctx.target.host}/`
  • Network accessline 235
    const at = `https://${ctx.target.host}/`
  • Network accessline 295
    status(chain.length === 0 ? `HTTP ${probe.status} with no redirect` : `HTTP ${first.status} → ${probe.finalUrl}`),       ],       fix: 'Return 301 (or 308) from every http:// url to the same path on https://, at the edge rather than in the 
  • Network accessline 295
    status(chain.length === 0 ? `HTTP ${probe.status} with no redirect` : `HTTP ${first.status} → ${probe.finalUrl}`),       ],       fix: 'Return 301 (or 308) from every http:// url to the same path on https://, at the edge rather than in the 
  • Network accessline 296
    ],       fix: 'Return 301 (or 308) from every http:// url to the same path on https://, at the edge rather than in the application.',     })]
  • Network accessline 296
    ],       fix: 'Return 301 (or 308) from every http:// url to the same path on https://, at the edge rather than in the application.',     })]
  • Network accessline 297
    fix: 'Return 301 (or 308) from every http:// url to the same path on https://, at the edge rather than in the application.',
  • Network accessline 297
    fix: 'Return 301 (or 308) from every http:// url to the same path on https://, at the edge rather than in the application.',

skills/post-launch/scripts/lib/cutover.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/post-launch/scripts/lib/plan.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/post-launch/scripts/lib/watch.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/post-launch/scripts/post-launch.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node

skills/pre-launch/references/config.md

  • Network accessline 38
    {   "production-url": "https://ridgeline-survey.example",
  • Network accessline 38
    {   "production-url": "https://ridgeline-survey.example",
  • Network accessline 39
    "production-url": "https://ridgeline-survey.example",
  • Network accessline 39
    "production-url": "https://ridgeline-survey.example",
  • Network accessline 40
    "predecessor-url": "https://old.ridgeline-survey.example",
  • Network accessline 40
    "predecessor-url": "https://old.ridgeline-survey.example",

skills/pre-launch/references/framework-hints.md

  • Network accessline 17
    | Astro | `astro` dep, or `astro.config.*` | `dist` | `site: '…'` | `@astrojs/sitemap` in deps or config | `sitemap-index.xml` | | Next | `next` dep, or `next.config.*` | `.next` | `siteUrl: '…'` (config, or `next-sitemap.config.js`) | `nex
  • Network accessline 17
    | Astro | `astro` dep, or `astro.config.*` | `dist` | `site: '…'` | `@astrojs/sitemap` in deps or config | `sitemap-index.xml` | | Next | `next` dep, or `next.config.*` | `.next` | `siteUrl: '…'` (config, or `next-sitemap.config.js`) | `nex
  • Network accessline 18
    | Next | `next` dep, or `next.config.*` | `.next` | `siteUrl: '…'` (config, or `next-sitemap.config.js`) | `next-sitemap` dep | `sitemap.xml` | | Nuxt | `nuxt` dep, or `nuxt.config.*` | `.output/public` | `siteUrl:` / `url: 'https://…'` | `
  • Network accessline 18
    | Next | `next` dep, or `next.config.*` | `.next` | `siteUrl: '…'` (config, or `next-sitemap.config.js`) | `next-sitemap` dep | `sitemap.xml` | | Nuxt | `nuxt` dep, or `nuxt.config.*` | `.output/public` | `siteUrl:` / `url: 'https://…'` | `
  • Network accessline 19
    | Nuxt | `nuxt` dep, or `nuxt.config.*` | `.output/public` | `siteUrl:` / `url: 'https://…'` | `@nuxtjs/sitemap`, `nuxt-simple-sitemap` | `sitemap.xml` |
  • Network accessline 19
    | Nuxt | `nuxt` dep, or `nuxt.config.*` | `.output/public` | `siteUrl:` / `url: 'https://…'` | `@nuxtjs/sitemap`, `nuxt-simple-sitemap` | `sitemap.xml` |

skills/pre-launch/scripts/lib/build.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/pre-launch/scripts/lib/context.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 15
    //   exec(cmd, args, { cwd, env }) → { code, stdout, stderr }   never throws
  • Dangerous shell operationline 15
    //   exec(cmd, args, { cwd, env }) → { code, stdout, stderr }   never throws
  • Dangerous shell operationline 34
    return function exec(cmd, args = [], { cwd, env } = {}) {
  • Dangerous shell operationline 34
    return function exec(cmd, args = [], { cwd, env } = {}) {
  • Dangerous shell operationline 181
    const run = (...args) => exec('git', args, { cwd: dir })
  • Dangerous shell operationline 181
    const run = (...args) => exec('git', args, { cwd: dir })
  • Access to secretsline 249
    [Credential-related source omitted]
  • Access to secretsline 249
    [Credential-related source omitted]
  • Dangerous shell operationline 345
    const command = `${pm} run build   const result = exec(pm, ['run', 'build'], { cwd: dir })
  • Dangerous shell operationline 345
    const command = `${pm} run build   const result = exec(pm, ['run', 'build'], { cwd: dir })
  • Dangerous shell operationline 346
    const result = exec(pm, ['run', 'build'], { cwd: dir })
  • Dangerous shell operationline 346
    const result = exec(pm, ['run', 'build'], { cwd: dir })

skills/pre-launch/scripts/lib/framework.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/pre-launch/scripts/lib/gate.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/pre-launch/scripts/lib/human.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/pre-launch/scripts/lib/hygiene.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Access to secretsline 252
    [Credential-related source omitted]
  • Access to secretsline 252
    [Credential-related source omitted]
  • Dangerous shell operationline 254
    fix: 'git rm --cached the file, add it to .gitignore, rotate every credential it held, and keep a .env.example instead.',
  • Dangerous shell operationline 254
    fix: 'git rm --cached the file, add it to .gitignore, rotate every credential it held, and keep a .env.example instead.',

skills/pre-launch/scripts/lib/output.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/pre-launch/scripts/lib/placeholders.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/pre-launch/scripts/lib/predecessor.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/pre-launch/scripts/pre-launch.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node

skills/suggest-improvements/references/catalogue.md

  • Network accessline 27
    | `broken-links` | links | internal links and sitemap entries that answer 4xx/5xx, plus any `links.json` `broken` list | status and linking pages | S | low | no | | `redirect-chains` | links | redirects with intermediate hops | the chain fr
  • Network accessline 27
    | `broken-links` | links | internal links and sitemap entries that answer 4xx/5xx, plus any `links.json` `broken` list | status and linking pages | S | low | no | | `redirect-chains` | links | redirects with intermediate hops | the chain fr
  • Network accessline 28
    | `redirect-chains` | links | redirects with intermediate hops | the chain from `redirects.json` `hops[]` | S | low | yes | | `http-links` | links | external links written `http://`; on an https site, an http canonical or og:url | the links
  • Network accessline 28
    | `redirect-chains` | links | redirects with intermediate hops | the chain from `redirects.json` `hops[]` | S | low | yes | | `http-links` | links | external links written `http://`; on an https site, an http canonical or og:url | the links
  • Network accessline 29
    | `http-links` | links | external links written `http://`; on an https site, an http canonical or og:url | the links | S | low | yes |
  • Network accessline 29
    | `http-links` | links | external links written `http://`; on an https site, an http canonical or og:url | the links | S | low | yes |

skills/suggest-improvements/scripts/checks/broken-links.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/dead-analytics.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/duplicate-analytics.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/duplicate-titles.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/http-links.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/inconsistent-spacing.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/long-titles.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/missing-alt.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/missing-descriptions.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/missing-h1.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/missing-security-headers.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/mixed-content.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/mobile-overflow.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/multiple-h1.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/no-webp.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/noindex-in-sitemap.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/orphan-pages.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/oversized-images.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/placeholder-text.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/redirect-chains.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/render-blocking-scripts.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/shortcode-leftovers.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/stale-dates.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/checks/thin-pages.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/lib/item.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/lib/load.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/lib/node-version.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/lib/pages.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Network accessline 23
    if (!src) return src;   try {     const url = new URL(src, origin ?? 'http://localhost');
  • Network accessline 23
    if (!src) return src;   try {     const url = new URL(src, origin ?? 'http://localhost');
  • Network accessline 24
    try {     const url = new URL(src, origin ?? 'http://localhost');     if (origin && url.origin !== new URL(origin).origin) return url.href;
  • Network accessline 24
    try {     const url = new URL(src, origin ?? 'http://localhost');     if (origin && url.origin !== new URL(origin).origin) return url.href;
  • Network accessline 25
    const url = new URL(src, origin ?? 'http://localhost');
  • Network accessline 25
    const url = new URL(src, origin ?? 'http://localhost');

skills/suggest-improvements/scripts/lib/report.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/suggest-improvements/scripts/suggest.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node

skills/visual-review/SKILL.md

  • Network accessline 105
    1. **Serve the new site.** `npm run build`, then serve the build with `npm run review:serve`    (it applies `vercel.json` like staging does, so media and scripts rewritten to another origin    load) and use that origin, e.g. `http://localho
  • Network accessline 105
    1. **Serve the new site.** `npm run build`, then serve the build with `npm run review:serve`    (it applies `vercel.json` like staging does, so media and scripts rewritten to another origin    load) and use that origin, e.g. `http://localho
  • Network accessline 106
    (it applies `vercel.json` like staging does, so media and scripts rewritten to another origin    load) and use that origin, e.g. `http://localhost:4321`, for every `review:*` step.    `npm run preview` is only for sites whose media is in th
  • Network accessline 106
    (it applies `vercel.json` like staging does, so media and scripts rewritten to another origin    load) and use that origin, e.g. `http://localhost:4321`, for every `review:*` step.    `npm run preview` is only for sites whose media is in th
  • Network accessline 107
    load) and use that origin, e.g. `http://localhost:4321`, for every `review:*` step.
  • Network accessline 107
    load) and use that origin, e.g. `http://localhost:4321`, for every `review:*` step.
  • Network accessline 111
    npm run review:shoot -- --base http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review/new --delay 0
  • Network accessline 111
    npm run review:shoot -- --base http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review/new --delay 0
  • Network accessline 120
    npm run review:styles -- --live https://www.example.com --new http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review/styles.json
  • Network accessline 120
    npm run review:styles -- --live https://www.example.com --new http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review/styles.json

skills/visual-review/references/review-procedure.md

  • Network accessline 37
    `vercel.json` (or `dist/_redirects`) like staging does, so media and scripts rewritten to   another origin load. `npm run preview` only when the site's media is in the repo. Either is a   local origin such as `http://localhost:4321`.
  • Network accessline 37
    `vercel.json` (or `dist/_redirects`) like staging does, so media and scripts rewritten to   another origin load. `npm run preview` only when the site's media is in the repo. Either is a   local origin such as `http://localhost:4321`.
  • Network accessline 39
    local origin such as `http://localhost:4321`.
  • Network accessline 39
    local origin such as `http://localhost:4321`.
  • Network accessline 43
    npm run review:shoot -- --base http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review/new --delay 0
  • Network accessline 43
    npm run review:shoot -- --base http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review/new --delay 0
  • Network accessline 130
    npm run review:styles -- --live https://www.example.com --new http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review/styles.json
  • Network accessline 130
    npm run review:styles -- --live https://www.example.com --new http://localhost:4321 --routes capture/templates.json --widths 390,768,1440 --out review/styles.json
  • Network accessline 251
    npm run review:shoot -- --base https://www.example.com --routes capture/templates.json --full --widths 390,1440 --out capture/screens/live-all
  • Network accessline 251
    npm run review:shoot -- --base https://www.example.com --routes capture/templates.json --full --widths 390,1440 --out capture/screens/live-all
  • Network accessline 255
    npm run review:shoot -- --base http://localhost:4321 --routes capture/templates.json --full --widths 390,1440 --out review/new-all --delay 0
  • Network accessline 255
    npm run review:shoot -- --base http://localhost:4321 --routes capture/templates.json --full --widths 390,1440 --out review/new-all --delay 0

skills/visual-review/scripts/check.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node

skills/visual-review/scripts/diff.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node

skills/visual-review/scripts/lib/blocked-hosts.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/visual-review/scripts/lib/browser.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/visual-review/scripts/lib/node-version.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/visual-review/scripts/lib/routes.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/visual-review/scripts/lib/selectors.mjs

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

skills/visual-review/scripts/sheet.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node

skills/visual-review/scripts/shoot.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 23
    --base     origin to shoot, e.g. https://www.example.com
  • Network accessline 23
    --base     origin to shoot, e.g. https://www.example.com

skills/visual-review/scripts/styles.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 195
    new URL(values[name]);     } catch {       throw new UsageError(`--${name} must be an origin such as https://example.com`);
  • Network accessline 195
    new URL(values[name]);     } catch {       throw new UsageError(`--${name} must be an origin such as https://example.com`);
  • Network accessline 196
    } catch {       throw new UsageError(`--${name} must be an origin such as https://example.com`);     }
  • Network accessline 196
    } catch {       throw new UsageError(`--${name} must be an origin such as https://example.com`);     }
  • Network accessline 197
    throw new UsageError(`--${name} must be an origin such as https://example.com`);
  • Network accessline 197
    throw new UsageError(`--${name} must be an origin such as https://example.com`);

How the signals fit together

Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

Some files could not be read; the facts below still hold.

Combined signals: 2 facts
  • Reads a credential store; another file of the same skill sends data over the network or runs a command (convert-site/scripts/css-coverage.mjs, line 41)convert-site/scripts/preflight.mjs:59Low confidence
  • Reads a credential store; another file of the same skill sends data over the network or runs a command (convert-site/scripts/css-coverage.mjs, line 41)convert-site/scripts/preflight.mjs:59Low confidence
Declared and executed: 6 facts
Signal confidence: 492 facts

and 442 more

Only the first 500 facts are listed.

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeNativeManifest .claude-plugin/marketplace.json.claude/skills/<skill-name>/
CodexNativeManifest AGENTS.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md skills/capture-site/SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md skills/capture-site/SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md skills/capture-site/SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md skills/capture-site/SKILL.md.opencode/skills/<skill-name>/
  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.