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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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>/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
30-day change not yet available: not enough history.
Individual skills in this repository
- capture-site
skills/capture-site - convert-site
skills/convert-site - launch-audit
skills/launch-audit - parity-gates
skills/parity-gates - post-launch
skills/post-launch - pre-launch
skills/pre-launch - suggest-improvements
skills/suggest-improvements - visual-review
skills/visual-review
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 tokensAlways available to the agent
SKILL.md
6,081 tokensWhen the skill is activated
Reference documents
106,541 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- The golden rule
- When to use
- Pacing
- The command sequence
- On exit 3
- Protected sites
- What lands in capture/
- What you write by hand
- Size, time and address limits
- Platform references
- Not covered
Scripts executed separately
scripts/assets.mjsscripts/capture.mjsscripts/fingerprint.mjsscripts/lib/challenge.mjsscripts/lib/css-urls.mjsscripts/lib/exclude.mjsscripts/lib/extract.mjsscripts/lib/http.mjsscripts/lib/node-version.mjsscripts/lib/page-rules.mjsscripts/lib/sitemaps.mjsscripts/lib/slug.mjsscripts/lib/state.mjsscripts/lib/wayback.mjsscripts/lib/wp-rest.mjsscripts/media.mjsscripts/readme.mjsscripts/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 bytesSKILL.mdcore24,362 bytesreferences/drupal.mddoc3,026 bytesreferences/static-and-unknown.mddoc2,507 bytesreferences/webflow-squarespace-wix.mddoc2,789 bytesreferences/wordpress.mddoc5,274 bytesscripts/assets.mjsruns18,593 bytesscripts/capture.mjsruns69,737 bytesscripts/fingerprint.mjsruns10,950 bytesscripts/lib/challenge.mjsruns4,625 bytesscripts/lib/css-urls.mjsruns2,351 bytesscripts/lib/exclude.mjsruns1,593 bytesscripts/lib/extract.mjsruns8,372 bytesscripts/lib/http.mjsruns17,191 bytesscripts/lib/node-version.mjsruns1,083 bytesscripts/lib/page-rules.mjsruns765 bytesscripts/lib/sitemaps.mjsruns4,523 bytesscripts/lib/slug.mjsruns966 bytesscripts/lib/state.mjsruns1,548 bytesscripts/lib/wayback.mjsruns2,744 bytesscripts/lib/wp-rest.mjsruns3,538 bytesscripts/media.mjsruns29,782 bytesscripts/readme.mjsruns16,207 bytesscripts/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 GitHubconvert-site
When your agent uses it
Convert a live website (WordPress first; Drupal, Webflow, Squarespace, Wix and static sites too) into a static Astro site with the same URLs, content, head tags, media, redirects and look, proven by parity gates and a pixel-level visual review, ending in one pull request, a noindexed staging deploy and a launch runbook. Use when asked to convert, rebuild, migrate or clone a site to Astro, when handed a site URL with this kit's link, to resume a conversion from .conversion/state.json, or with --apply <id> to apply one suggestion as a proposal.
What it loads into context
Frontmatter
131 tokensAlways available to the agent
SKILL.md
3,643 tokensWhen the skill is activated
Reference documents
29,818 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- The golden rules
- Names used below
- Step 0a: a kit that can run
- Step 0: preflight and fingerprint (before the intake message)
- Step 1: intake (the one message)
- The phases
- The build, in one paragraph
- Decisions, exceptions, proposals
- Hosting
- The one message after the plan
- The pull request (phase 12)
- The final report (to the person)
- Resuming
- References
Scripts executed separately
scripts/copy-assets.mjsscripts/css-coverage.mjsscripts/css-prune.mjsscripts/init-site.mjsscripts/lib/blocked-hosts.mjsscripts/lib/excluded.mjsscripts/lib/head-css.mjsscripts/lib/inline-scope.mjsscripts/lib/link-records.mjsscripts/lib/node-version.mjsscripts/lib/page-head.mjsscripts/lib/review-routes.mjsscripts/lib/state-selectors.mjsscripts/lib/stores/blob.mjsscripts/lib/stores/r2.mjsscripts/lib/stores/retry.mjsscripts/link-exceptions.mjsscripts/media-plan.mjsscripts/media-upload.mjsscripts/preflight.mjsscripts/prelaunch-reconcile.mjsscripts/review-serve.mjsscripts/state.mjstemplates/cloudflare/r2-media-function.jstemplates/site/astro.config.mjstemplates/site/package.jsontemplates/site/src/lib/exceptions.mjstemplates/site/src/lib/site.mjstemplates/site/src/pages/robots.txt.js
Files
SKILL.mdcore14,379 bytesSKILL.mdcore14,379 bytesSKILL.mdcore14,379 bytesSKILL.mdcore14,379 bytesSKILL.mdcore14,379 bytesSKILL.mdcore14,379 bytesreferences/apply-suggestion.mddoc4,820 bytesreferences/build-rules.mddoc18,222 bytesreferences/components-optional.mddoc2,541 bytesreferences/forms.mddoc6,639 bytesreferences/hosting-cloudflare.mddoc5,953 bytesreferences/hosting-vercel.mddoc14,097 bytesreferences/intake.mddoc9,701 bytesreferences/phases.mddoc30,799 bytesreferences/runbook.mddoc7,197 bytesreferences/third-party.mddoc2,570 bytesscripts/copy-assets.mjsruns10,908 bytesscripts/css-coverage.mjsruns14,717 bytesscripts/css-prune.mjsruns55,340 bytesscripts/init-site.mjsruns13,787 bytesscripts/lib/blocked-hosts.mjsruns2,825 bytesscripts/lib/excluded.mjsruns1,380 bytesscripts/lib/head-css.mjsruns1,804 bytesscripts/lib/inline-scope.mjsruns5,369 bytesscripts/lib/link-records.mjsruns2,574 bytesscripts/lib/node-version.mjsruns1,083 bytesscripts/lib/page-head.mjsruns1,605 bytesscripts/lib/review-routes.mjsruns7,607 bytesscripts/lib/state-selectors.mjsruns2,807 bytesscripts/lib/stores/blob.mjsruns3,952 bytesscripts/lib/stores/r2.mjsruns4,302 bytesscripts/lib/stores/retry.mjsruns645 bytesscripts/link-exceptions.mjsruns7,469 bytesscripts/media-plan.mjsruns13,108 bytesscripts/media-upload.mjsruns8,119 bytesscripts/preflight.mjsruns12,693 bytesscripts/prelaunch-reconcile.mjsruns38,338 bytesscripts/review-serve.mjsruns15,174 bytesscripts/state.mjsruns6,836 bytestemplates/cloudflare/r2-media-function.jsruns1,692 bytestemplates/site/.gitignoreasset361 bytestemplates/site/.nvmrcasset8 bytestemplates/site/.vercelignoreasset397 bytestemplates/site/AGENTS.mddoc3,669 bytestemplates/site/CLAUDE.mddoc3,669 bytestemplates/site/README.mddoc1,586 bytestemplates/site/astro.config.mjsruns286 bytestemplates/site/docs/LAUNCH.mddoc3,967 bytestemplates/site/docs/plan.mddoc1,293 bytestemplates/site/docs/third-party.mddoc397 bytestemplates/site/exceptions.jsonasset3 bytestemplates/site/package.jsonruns1,427 bytestemplates/site/proposals.jsonasset3 bytestemplates/site/public/_headersasset413 bytestemplates/site/src/layouts/Base.astroasset2,449 bytestemplates/site/src/lib/exceptions.mjsruns1,173 bytestemplates/site/src/lib/site.mjsruns304 bytestemplates/site/src/pages/404.astroasset330 bytestemplates/site/src/pages/robots.txt.jsruns492 bytestemplates/site/src/styles/site.cssasset91 bytestemplates/site/vercel.jsonasset433 bytes
Read SKILL.md
# convert-site
The orchestrator. It asks one message of questions, then runs every other skill in order without
stopping again, and ends with a pull request the person merges and a runbook they launch from.
## The golden rules
1. **One intake message, then no stops.** Every question carries a default. Anything that later
needs an account, a login or a token you do not have goes on the "needs you" list
(`state.needsYou` and `docs/LAUNCH.md` section A) and the run carries on.
2. **The live site is read-only.** Only these read it, paced: the capture scripts, `shoot.mjs`
and `styles.mjs` on live, `css-coverage.mjs`, `launch-audit --old-url` and `pre-launch
--predecessor-url`. Analytics are blocked on their live page loads, so no visit is counted.
Never submit a form on it, log in, or fetch a page by hand to fill a gap.View the complete source on GitHublaunch-audit
When your agent uses it
Audit a live or staging website and report what would go wrong at launch — crawl and inventory, indexability, redirects for a domain cutover, links, images, forms, accessibility, performance, analytics, content sanity, and full-page screenshots for a visual pass. Use before or right after a site launch, when asked to QA, audit, or review a website, when a site is moving to a new domain, or when somebody asks whether a site is ready to go live. Read-only: it never submits a form, clicks a control, or edits anything.
What it loads into context
Frontmatter
122 tokensAlways available to the agent
SKILL.md
2,130 tokensWhen the skill is activated
Reference documents
29,985 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- The golden rule
- 1. Gather the inputs
- 2. Run the script
- 3. Read the bundle
- 4. Do the three judgment passes yourself
- 5. Present the report
- The two checks that never run
- References
- Where this sits
Scripts executed separately
scripts/launch-audit.mjsscripts/lib/args.mjsscripts/lib/baseline.mjsscripts/lib/browser.mjsscripts/lib/checks/_ctx.mjsscripts/lib/checks/a11y.mjsscripts/lib/checks/analytics.mjsscripts/lib/checks/browser-tier.mjsscripts/lib/checks/content.mjsscripts/lib/checks/forms.mjsscripts/lib/checks/head.mjsscripts/lib/checks/host.mjsscripts/lib/checks/images.mjsscripts/lib/checks/indexability.mjsscripts/lib/checks/inventory.mjsscripts/lib/checks/links.mjsscripts/lib/checks/ops.mjsscripts/lib/checks/perf.mjsscripts/lib/checks/redirects.mjsscripts/lib/crawl.mjsscripts/lib/csv.mjsscripts/lib/detect/analytics.mjsscripts/lib/detect/framework.mjsscripts/lib/detect/placeholders.mjsscripts/lib/dns.mjsscripts/lib/findings.mjsscripts/lib/fs-util.mjsscripts/lib/html.mjsscripts/lib/image-dims.mjsscripts/lib/net.mjsscripts/lib/recorded-net.mjsscripts/lib/registry.mjsscripts/lib/report.mjsscripts/lib/robots.mjsscripts/lib/schema/required.mjsscripts/lib/sitemap.mjsscripts/lib/slug.mjs
Files
SKILL.mdcore9,156 bytesSKILL.mdcore9,156 bytesreferences/accessibility.mddoc8,309 bytesreferences/analytics.mddoc7,831 bytesreferences/content.mddoc7,915 bytesreferences/forms.mddoc8,808 bytesreferences/head.mddoc13,547 bytesreferences/host.mddoc13,044 bytesreferences/images.mddoc8,177 bytesreferences/indexability.mddoc18,257 bytesreferences/links.mddoc8,350 bytesreferences/ops.mddoc7,780 bytesreferences/performance.mddoc8,902 bytesreferences/reading-the-report.mddoc8,873 bytesreferences/redirects.mddoc8,595 bytesscripts/launch-audit.mjsruns27,656 bytesscripts/lib/args.mjsruns6,579 bytesscripts/lib/baseline.mjsruns4,882 bytesscripts/lib/browser.mjsruns21,277 bytesscripts/lib/checks/_ctx.mjsruns23,127 bytesscripts/lib/checks/a11y.mjsruns13,745 bytesscripts/lib/checks/analytics.mjsruns10,100 bytesscripts/lib/checks/browser-tier.mjsruns24,073 bytesscripts/lib/checks/content.mjsruns17,592 bytesscripts/lib/checks/forms.mjsruns15,863 bytesscripts/lib/checks/head.mjsruns41,742 bytesscripts/lib/checks/host.mjsruns36,136 bytesscripts/lib/checks/images.mjsruns14,943 bytesscripts/lib/checks/indexability.mjsruns31,759 bytesscripts/lib/checks/inventory.mjsruns15,339 bytesscripts/lib/checks/links.mjsruns23,268 bytesscripts/lib/checks/ops.mjsruns9,119 bytesscripts/lib/checks/perf.mjsruns18,970 bytesscripts/lib/checks/redirects.mjsruns20,738 bytesscripts/lib/crawl.mjsruns8,092 bytesscripts/lib/csv.mjsruns4,956 bytesscripts/lib/detect/analytics.mjsruns4,704 bytesscripts/lib/detect/framework.mjsruns12,870 bytesscripts/lib/detect/placeholders.mjsruns3,332 bytesscripts/lib/dns.mjsruns9,157 bytesscripts/lib/findings.mjsruns1,809 bytesscripts/lib/fs-util.mjsruns713 bytesscripts/lib/headers/owasp.jsonasset4,019 bytesscripts/lib/html.mjsruns28,481 bytesscripts/lib/image-dims.mjsruns6,508 bytesscripts/lib/net.mjsruns11,764 bytesscripts/lib/recorded-net.mjsruns4,608 bytesscripts/lib/registry.mjsruns1,607 bytesscripts/lib/report.mjsruns15,193 bytesscripts/lib/robots.mjsruns5,263 bytesscripts/lib/schema/required.mjsruns4,358 bytesscripts/lib/sitemap.mjsruns5,583 bytesscripts/lib/slug.mjsruns280 bytes
Read SKILL.md
# launch-audit
Crawl a staging or live site, gather evidence, and hand a person a report they can act on.
## The golden rule
**Read-only, report-only.** Nothing in this skill edits a site, submits a form, flips a setting,
writes to a provider API, or clicks a destructive control. Every finding is a recommendation with
evidence for a human to act on.
Four more that follow from it, and that you restate when you present the report:
1. **No silent caps.** Every bound on coverage — max pages, depth, sampled pages, unverifiable
externals — is reported by name in **Not covered**.View the complete source on GitHubparity-gates
When your agent uses it
Freeze a site capture into baseline/ and prove an Astro build matches it — every route, redirect (one hop, through a simulation of the host), SEO head field, visible text, internal link, media file, sitemap entry, feed, form, third-party script and security header — with approved differences in exceptions.json and improvements in proposals.json. Use after a capture to build the baseline, when compiling redirects.csv for Vercel or Cloudflare, before calling any conversion page done, when a gate fails and needs reading, or to check a staging deploy against the baseline.
What it loads into context
Frontmatter
123 tokensAlways available to the agent
SKILL.md
4,130 tokensWhen the skill is activated
Reference documents
5,178 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- The golden rule
- Running the scripts
- 1. Baseline (once)
- 2. Redirects
- 3. Verify
- 4. Differences and decisions
- 5. Staging, proposals and release builds
- Present the result
- Not covered
- References
Scripts executed separately
scripts/build-baseline.mjsscripts/build-redirects.mjsscripts/lib/cloudflare-resolver.mjsscripts/lib/dist.mjsscripts/lib/exceptions.mjsscripts/lib/excluded.mjsscripts/lib/forms.mjsscripts/lib/gate-cli.mjsscripts/lib/head.mjsscripts/lib/host-resolver.mjsscripts/lib/html.mjsscripts/lib/node-version.mjsscripts/lib/redirects-csv.mjsscripts/lib/srcset.mjsscripts/lib/vendors.mjsscripts/lib/vercel-resolver.mjsscripts/lib/visible-text.mjsscripts/verify-live.mjsscripts/verify/forms.mjsscripts/verify/headers.mjsscripts/verify/links.mjsscripts/verify/media.mjsscripts/verify/redirects.mjsscripts/verify/routes.mjsscripts/verify/run-all.mjsscripts/verify/scripts.mjsscripts/verify/seo.mjsscripts/verify/sitemaps.mjsscripts/verify/text.mjs
Files
SKILL.mdcore16,229 bytesSKILL.mdcore16,229 bytesSKILL.mdcore16,229 bytesSKILL.mdcore16,229 bytesSKILL.mdcore16,229 bytesSKILL.mdcore16,229 bytesSKILL.mdcore16,229 bytesreferences/contracts.mddoc10,215 bytesreferences/exceptions.mddoc8,827 bytesscripts/build-baseline.mjsruns19,343 bytesscripts/build-redirects.mjsruns19,136 bytesscripts/lib/cloudflare-resolver.mjsruns3,966 bytesscripts/lib/dist.mjsruns3,796 bytesscripts/lib/exceptions.mjsruns5,868 bytesscripts/lib/excluded.mjsruns1,380 bytesscripts/lib/forms.mjsruns799 bytesscripts/lib/gate-cli.mjsruns7,165 bytesscripts/lib/head.mjsruns2,766 bytesscripts/lib/host-resolver.mjsruns1,929 bytesscripts/lib/html.mjsruns1,289 bytesscripts/lib/node-version.mjsruns1,083 bytesscripts/lib/redirects-csv.mjsruns6,357 bytesscripts/lib/srcset.mjsruns1,092 bytesscripts/lib/vendors.mjsruns2,918 bytesscripts/lib/vercel-resolver.mjsruns9,325 bytesscripts/lib/visible-text.mjsruns3,935 bytesscripts/verify-live.mjsruns21,203 bytesscripts/verify/forms.mjsruns16,316 bytesscripts/verify/headers.mjsruns7,269 bytesscripts/verify/links.mjsruns8,889 bytesscripts/verify/media.mjsruns9,192 bytesscripts/verify/redirects.mjsruns16,832 bytesscripts/verify/routes.mjsruns8,628 bytesscripts/verify/run-all.mjsruns3,462 bytesscripts/verify/scripts.mjsruns4,551 bytesscripts/verify/seo.mjsruns9,426 bytesscripts/verify/sitemaps.mjsruns10,840 bytesscripts/verify/text.mjsruns3,204 bytes
Read SKILL.md
# parity-gates
Build the baseline once from `capture/`, then gate every build against it until every gate
passes. The gates read only `baseline/`, never the live site, so a build can still be verified
after the old host is gone.
## The golden rule
**The default build equals live, and a gate is never softened.** No flag turns a failure into a
warning. Four more that follow from it:
1. **Never edit `baseline/` by hand.** The one exception: `keep` in `baseline/scripts.json`,
which is how a vendor is dropped (set it to `false`, and record the decision).
2. **A difference is an entry, not an edit.** Unavoidable: `exceptions.json`. An improvement:View the complete source on GitHubpost-launch
When your agent uses it
The moment DNS moves and for the thirty days after — verifies the cutover (DNS propagation, certificate, http and www redirects, the noindex, robots and sitemap on the live host, every redirect the audit mapped, forms, analytics, the staging copy, the old host, security headers), diffs production against the pre-launch baseline, and schedules the watch. Use when asked did the launch work, is the site live, what should I check after launch, the domain just switched, or when a site went live in the last month and something looks wrong. It is read-only and exits 0 whatever it finds.
What it loads into context
Frontmatter
132 tokensAlways available to the agent
SKILL.md
2,246 tokensWhen the skill is activated
Reference documents
6,298 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- The one rule
- Read-only
- The two modes
- 1. Gather the inputs
- 2. Run the cutover check
- 3. Read the report in this order
- 4. Work the six human items
- 5. Run the watch, daily
- 6. Day 30
- 7. Present the result
- The two checks that never run
- References
- Where this sits
Scripts executed separately
scripts/lib/checks/cutover.mjsscripts/lib/cutover.mjsscripts/lib/plan.mjsscripts/lib/watch.mjsscripts/post-launch.mjs
Files
SKILL.mdcore9,185 bytesSKILL.mdcore9,185 bytesreferences/baseline-diff.mddoc5,383 bytesreferences/cutover-day.mddoc9,159 bytesreferences/reading-the-report.mddoc5,794 bytesreferences/thirty-day-watch.mddoc5,728 bytesscripts/lib/checks/cutover.mjsruns47,096 bytesscripts/lib/cutover.mjsruns26,807 bytesscripts/lib/plan.mjsruns5,658 bytesscripts/lib/watch.mjsruns6,832 bytesscripts/post-launch.mjsruns15,077 bytes
Read SKILL.md
# post-launch
The watch. It runs the moment DNS has moved, and then once a day for thirty days. It reports; it
never gates, never fixes, and never announces anything.
## The one rule
**Blockers are read first and announced last.** Nothing about a launch is announced — no email, no
post, no client call — until this report comes back clean. An announcement is the only step of a
launch that cannot be taken back, and the two blockers here are exactly the two states where the
launch has not really happened: a certificate nobody can get past, and a noindex telling search
engines to forget the site. Both look fine in a browser you are already logged into.
If somebody asks you to announce while a blocker stands, say plainly what the blocker is and whatView the complete source on GitHubpre-launch
When your agent uses it
Gate a website launch from its repository — repo hygiene, placeholders and leaked dev hosts, the production build, the build output (404 page, internal references, icons, social cards, robots, sitemap, canonicals, titles, headings), framework configuration, and redirect coverage for the site being replaced — then walk the human checklist no script can verify. Use before any site launch, before a DNS cutover, when a site is replacing an existing one, or when somebody asks whether a site is ready to launch. Read-only apart from its own report and a progress file; it exits 1 if anything fails.
What it loads into context
Frontmatter
129 tokensAlways available to the agent
SKILL.md
2,545 tokensWhen the skill is activated
Reference documents
6,970 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- The two rules
- Read-only
- 1. Gather the inputs
- 2. Run the gate
- 3. Triage — every failure blocks
- 4. Walk the human checklist, one item at a time
- 5. If a site is being replaced
- 6. Present the result
- The two checks that never run
- References
- Where this sits
Scripts executed separately
scripts/lib/build.mjsscripts/lib/context.mjsscripts/lib/framework.mjsscripts/lib/gate.mjsscripts/lib/human.mjsscripts/lib/hygiene.mjsscripts/lib/output.mjsscripts/lib/placeholders.mjsscripts/lib/predecessor.mjsscripts/pre-launch.mjs
Files
SKILL.mdcore10,504 bytesSKILL.mdcore10,504 bytesSKILL.mdcore10,504 bytesSKILL.mdcore10,504 bytesreferences/config.mddoc3,327 bytesreferences/framework-hints.mddoc6,763 bytesreferences/human-checklist.mddoc7,504 bytesreferences/predecessor-redirects.mddoc6,385 bytesreferences/reading-the-gate.mddoc5,155 bytesscripts/lib/build.mjsruns3,460 bytesscripts/lib/context.mjsruns18,088 bytesscripts/lib/framework.mjsruns9,738 bytesscripts/lib/gate.mjsruns14,307 bytesscripts/lib/human.mjsruns9,388 bytesscripts/lib/hygiene.mjsruns15,393 bytesscripts/lib/output.mjsruns29,469 bytesscripts/lib/placeholders.mjsruns13,375 bytesscripts/lib/predecessor.mjsruns7,722 bytesscripts/pre-launch.mjsruns13,135 bytes
Read SKILL.md
# pre-launch
The gate. It inspects the repository and the build, and it blocks the launch if anything
mechanical is wrong. Then it hands you up to nine things no script can check.
## The two rules
**Never declare the site ready while any check fails.** There is no flag that turns a failure into
a warning, and adding one would be the wrong fix. Exit 1 means not ready. If you believe a check is
wrong about this site, say so plainly to the human and fix the check — do not route around it.
**Never reorder the human list.** Its order is a dependency order with two one-way doors in it:
the Search Console baseline must be exported **before DNS moves**, and the forms must reach a real
person **before the deploy** that makes them public. Both are unrecoverable if taken late.View the complete source on GitHubsuggest-improvements
When your agent uses it
List what is worth fixing on a site the conversion reproduced as-is — SEO, content, links, accessibility, performance, security, analytics and design — each item with its path, evidence, effort, risk and whether it can be applied mechanically, plus the agent's own design and content observations. Use after the parity gates and the visual review are green and before the pull request, or when someone asks what could be better on the converted site. It changes nothing.
What it loads into context
Frontmatter
101 tokensAlways available to the agent
SKILL.md
1,498 tokensWhen the skill is activated
Reference documents
1,330 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- The golden rule
- When to run
- The command
- Reading the report
- What you add by hand
- Acting on an item
- The checks
- Present the result
- References
Scripts executed separately
scripts/checks/broken-links.mjsscripts/checks/dead-analytics.mjsscripts/checks/duplicate-analytics.mjsscripts/checks/duplicate-titles.mjsscripts/checks/http-links.mjsscripts/checks/inconsistent-spacing.mjsscripts/checks/long-titles.mjsscripts/checks/missing-alt.mjsscripts/checks/missing-descriptions.mjsscripts/checks/missing-h1.mjsscripts/checks/missing-security-headers.mjsscripts/checks/mixed-content.mjsscripts/checks/mobile-overflow.mjsscripts/checks/multiple-h1.mjsscripts/checks/no-webp.mjsscripts/checks/noindex-in-sitemap.mjsscripts/checks/orphan-pages.mjsscripts/checks/oversized-images.mjsscripts/checks/placeholder-text.mjsscripts/checks/redirect-chains.mjsscripts/checks/render-blocking-scripts.mjsscripts/checks/shortcode-leftovers.mjsscripts/checks/stale-dates.mjsscripts/checks/thin-pages.mjsscripts/lib/item.mjsscripts/lib/load.mjsscripts/lib/node-version.mjsscripts/lib/pages.mjsscripts/lib/report.mjsscripts/suggest.mjs
Files
SKILL.mdcore6,217 bytesreferences/catalogue.mddoc5,134 bytesscripts/checks/broken-links.mjsruns1,817 bytesscripts/checks/dead-analytics.mjsruns1,637 bytesscripts/checks/duplicate-analytics.mjsruns1,270 bytesscripts/checks/duplicate-titles.mjsruns976 bytesscripts/checks/http-links.mjsruns1,129 bytesscripts/checks/inconsistent-spacing.mjsruns1,746 bytesscripts/checks/long-titles.mjsruns623 bytesscripts/checks/missing-alt.mjsruns1,069 bytesscripts/checks/missing-descriptions.mjsruns613 bytesscripts/checks/missing-h1.mjsruns474 bytesscripts/checks/missing-security-headers.mjsruns2,360 bytesscripts/checks/mixed-content.mjsruns1,383 bytesscripts/checks/mobile-overflow.mjsruns1,681 bytesscripts/checks/multiple-h1.mjsruns527 bytesscripts/checks/no-webp.mjsruns840 bytesscripts/checks/noindex-in-sitemap.mjsruns631 bytesscripts/checks/orphan-pages.mjsruns1,600 bytesscripts/checks/oversized-images.mjsruns2,942 bytesscripts/checks/placeholder-text.mjsruns1,355 bytesscripts/checks/redirect-chains.mjsruns609 bytesscripts/checks/render-blocking-scripts.mjsruns2,687 bytesscripts/checks/shortcode-leftovers.mjsruns1,848 bytesscripts/checks/stale-dates.mjsruns1,175 bytesscripts/checks/thin-pages.mjsruns1,188 bytesscripts/lib/item.mjsruns2,297 bytesscripts/lib/load.mjsruns3,724 bytesscripts/lib/node-version.mjsruns1,083 bytesscripts/lib/pages.mjsruns3,091 bytesscripts/lib/report.mjsruns4,808 bytesscripts/suggest.mjsruns5,785 bytes
Read SKILL.md
# suggest-improvements
The converted site reproduces the live site on purpose, flaws included. This skill writes down
the flaws, with evidence, so the site owner can decide which to fix. It never fixes them.
## The golden rule
**Nothing from here is applied directly.** An improvement becomes a proposal: an entry in
`proposals.json` that ships only in a `PROPOSALS=on` build until a person approves it, or a later
`convert-site --apply <id>` run that does the same on its own commit. Editing the default build
because this report said so breaks parity, and the gates will say so.
## When to run
View the complete source on GitHubvisual-review
When your agent uses it
Prove an Astro rebuild looks like the live site it replaces — full-page screenshots of both sides with motion frozen, a pixel diff with a 0.5 % pass line, a computed-style comparison of typography, colour and spacing, and one contact sheet to look at every pair. Use after a template is built, before calling a conversion page done, when someone asks whether the new site matches the old one, or when a diff or style row fails and needs fixing.
What it loads into context
Frontmatter
102 tokensAlways available to the agent
SKILL.md
2,689 tokensWhen the skill is activated
Reference documents
4,637 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- The golden rule
- What the scripts do
- Where things live
- The loop
- If your agent has a browser of its own
- Present the result
- References
Scripts executed separately
scripts/check.mjsscripts/diff.mjsscripts/lib/blocked-hosts.mjsscripts/lib/browser.mjsscripts/lib/node-version.mjsscripts/lib/routes.mjsscripts/lib/selectors.mjsscripts/sheet.mjsscripts/shoot.mjsscripts/styles.mjs
Files
SKILL.mdcore10,837 bytesreferences/review-procedure.mddoc18,141 bytesscripts/check.mjsruns5,315 bytesscripts/diff.mjsruns10,830 bytesscripts/lib/blocked-hosts.mjsruns2,825 bytesscripts/lib/browser.mjsruns8,665 bytesscripts/lib/freeze.cssasset239 bytesscripts/lib/node-version.mjsruns1,083 bytesscripts/lib/routes.mjsruns2,484 bytesscripts/lib/selectors.mjsruns1,116 bytesscripts/sheet.mjsruns12,652 bytesscripts/shoot.mjsruns9,872 bytesscripts/styles.mjsruns10,358 bytes
Read SKILL.md
# visual-review
Screenshot the live site and the new build at the same widths, measure every difference, look at
every pair yourself, fix, and repeat until every template passes. Then do it again for every page.
## The golden rule
**The diff decides, your eyes explain.** A pair passes only when `review:diff` says it passes and
`review:styles` has no failing row for it. Looking at a screenshot and finding it "close enough" is
never a pass. Four more that follow from it:
1. **Write down every visible difference before you change code.** Per pair, in words, from the
contact sheet. Fixing what you noticed first and skipping the rest is how a page ships wrong.
2. **Parity, not better.** A deliberate improvement (a fixed typo, a tidier spacing, a sharperView the complete source on GitHubSkills 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 shellAutomated 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:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/convert-site/templates/site/package.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/convert-site/templates/site/package.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/convert-site/templates/site/package.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/convert-site/templates/site/package.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/convert-site/templates/site/package.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/convert-site/templates/site/package.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/convert-site/templates/site/package.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/convert-site/templates/site/package.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/convert-site/templates/site/package.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/convert-site/templates/site/package.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/convert-site/templates/site/package.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/convert-site/templates/site/package.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/convert-site/templates/site/package.json:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/convert-site/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/convert-site/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/convert-site/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/convert-site/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/convert-site/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/launch-audit/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 13 dangerous shell commandsin 3 files: skills/pre-launch/scripts/lib/context.mjs:15 skills/pre-launch/scripts/lib/hygiene.mjs:254 capture-site/scripts/lib/http.mjs:29
- 518 network referencesin 59 files: skills/launch-audit/scripts/lib/checks/host.mjs:164 skills/convert-site/scripts/review-serve.mjs:19 skills/parity-gates/SKILL.md:70 and 56 more
- No instruction overrides
- 332 executable scriptsin 168 files: skills/convert-site/templates/site/package.json:1 skills/convert-site/scripts/copy-assets.mjs:1 skills/convert-site/scripts/css-coverage.mjs:1 and 165 more
- 22 references to secretsin 9 files: skills/convert-site/references/hosting-vercel.md:38 skills/convert-site/references/phases.md:431 skills/convert-site/scripts/lib/stores/blob.mjs:55 and 6 more
- No requests to vote in Hot
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
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
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
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
skills/convert-site/scripts/css-coverage.mjs
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
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
skills/convert-site/scripts/lib/inline-scope.mjs
skills/convert-site/scripts/lib/link-records.mjs
skills/convert-site/scripts/lib/node-version.mjs
skills/convert-site/scripts/lib/page-head.mjs
skills/convert-site/scripts/lib/review-routes.mjs
skills/convert-site/scripts/lib/state-selectors.mjs
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
skills/convert-site/scripts/media-upload.mjs
skills/convert-site/scripts/preflight.mjs
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
skills/convert-site/templates/cloudflare/r2-media-function.js
skills/convert-site/templates/site/astro.config.mjs
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
skills/convert-site/templates/site/src/lib/site.mjs
skills/convert-site/templates/site/src/pages/robots.txt.js
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
skills/launch-audit/scripts/lib/args.mjs
skills/launch-audit/scripts/lib/baseline.mjs
skills/launch-audit/scripts/lib/browser.mjs
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
skills/launch-audit/scripts/lib/checks/analytics.mjs
skills/launch-audit/scripts/lib/checks/browser-tier.mjs
skills/launch-audit/scripts/lib/checks/content.mjs
skills/launch-audit/scripts/lib/checks/forms.mjs
skills/launch-audit/scripts/lib/checks/head.mjs
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
skills/launch-audit/scripts/lib/checks/indexability.mjs
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
skills/launch-audit/scripts/lib/checks/ops.mjs
skills/launch-audit/scripts/lib/checks/perf.mjs
skills/launch-audit/scripts/lib/checks/redirects.mjs
skills/launch-audit/scripts/lib/crawl.mjs
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
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
skills/launch-audit/scripts/lib/dns.mjs
skills/launch-audit/scripts/lib/findings.mjs
skills/launch-audit/scripts/lib/fs-util.mjs
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
skills/launch-audit/scripts/lib/image-dims.mjs
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
skills/launch-audit/scripts/lib/report.mjs
skills/launch-audit/scripts/lib/robots.mjs
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
skills/launch-audit/scripts/lib/slug.mjs
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
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
skills/parity-gates/scripts/lib/dist.mjs
skills/parity-gates/scripts/lib/exceptions.mjs
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
skills/parity-gates/scripts/lib/gate-cli.mjs
skills/parity-gates/scripts/lib/head.mjs
skills/parity-gates/scripts/lib/host-resolver.mjs
skills/parity-gates/scripts/lib/html.mjs
skills/parity-gates/scripts/lib/node-version.mjs
skills/parity-gates/scripts/lib/redirects-csv.mjs
skills/parity-gates/scripts/lib/srcset.mjs
skills/parity-gates/scripts/lib/vendors.mjs
skills/parity-gates/scripts/lib/vercel-resolver.mjs
skills/parity-gates/scripts/lib/visible-text.mjs
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
skills/parity-gates/scripts/verify/redirects.mjs
skills/parity-gates/scripts/verify/routes.mjs
skills/parity-gates/scripts/verify/run-all.mjs
skills/parity-gates/scripts/verify/scripts.mjs
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
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
skills/post-launch/scripts/lib/plan.mjs
skills/post-launch/scripts/lib/watch.mjs
skills/post-launch/scripts/post-launch.mjs
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
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
skills/pre-launch/scripts/lib/gate.mjs
skills/pre-launch/scripts/lib/human.mjs
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
skills/pre-launch/scripts/lib/placeholders.mjs
skills/pre-launch/scripts/lib/predecessor.mjs
skills/pre-launch/scripts/pre-launch.mjs
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
skills/suggest-improvements/scripts/checks/dead-analytics.mjs
skills/suggest-improvements/scripts/checks/duplicate-analytics.mjs
skills/suggest-improvements/scripts/checks/duplicate-titles.mjs
skills/suggest-improvements/scripts/checks/http-links.mjs
skills/suggest-improvements/scripts/checks/inconsistent-spacing.mjs
skills/suggest-improvements/scripts/checks/long-titles.mjs
skills/suggest-improvements/scripts/checks/missing-alt.mjs
skills/suggest-improvements/scripts/checks/missing-descriptions.mjs
skills/suggest-improvements/scripts/checks/missing-h1.mjs
skills/suggest-improvements/scripts/checks/missing-security-headers.mjs
skills/suggest-improvements/scripts/checks/mixed-content.mjs
skills/suggest-improvements/scripts/checks/mobile-overflow.mjs
skills/suggest-improvements/scripts/checks/multiple-h1.mjs
skills/suggest-improvements/scripts/checks/no-webp.mjs
skills/suggest-improvements/scripts/checks/noindex-in-sitemap.mjs
skills/suggest-improvements/scripts/checks/orphan-pages.mjs
skills/suggest-improvements/scripts/checks/oversized-images.mjs
skills/suggest-improvements/scripts/checks/placeholder-text.mjs
skills/suggest-improvements/scripts/checks/redirect-chains.mjs
skills/suggest-improvements/scripts/checks/render-blocking-scripts.mjs
skills/suggest-improvements/scripts/checks/shortcode-leftovers.mjs
skills/suggest-improvements/scripts/checks/stale-dates.mjs
skills/suggest-improvements/scripts/checks/thin-pages.mjs
skills/suggest-improvements/scripts/lib/item.mjs
skills/suggest-improvements/scripts/lib/load.mjs
skills/suggest-improvements/scripts/lib/node-version.mjs
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
skills/suggest-improvements/scripts/suggest.mjs
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
skills/visual-review/scripts/diff.mjs
skills/visual-review/scripts/lib/blocked-hosts.mjs
skills/visual-review/scripts/lib/browser.mjs
skills/visual-review/scripts/lib/node-version.mjs
skills/visual-review/scripts/lib/routes.mjs
skills/visual-review/scripts/lib/selectors.mjs
skills/visual-review/scripts/sheet.mjs
skills/visual-review/scripts/shoot.mjs
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
- Contacts www.w3.org, which SKILL.md, the README and the plugin manifest do not mentioncapture-site/scripts/assets.mjs:91High confidence
- Contacts web.archive.org, which SKILL.md, the README and the plugin manifest do not mentioncapture-site/scripts/lib/wayback.mjs:12High confidence
- Contacts api.w.org, which SKILL.md, the README and the plugin manifest do not mentionconvert-site/scripts/lib/link-records.mjs:25High confidence
- Contacts api.w.org, which SKILL.md, the README and the plugin manifest do not mentionconvert-site/scripts/link-exceptions.mjs:22High confidence
- Uses a credential store, which the skill description does not mentionconvert-site/scripts/preflight.mjs:59High confidence
- Uses a credential store, which the skill description does not mentionconvert-site/scripts/preflight.mjs:59High confidence
Signal confidence: 492 facts
- Network access in prose of the SKILL.mdcapture-site/SKILL.md:65Low confidence
- Network access in prose of the SKILL.mdcapture-site/SKILL.md:103Low confidence
- Network access in prose of the SKILL.mdcapture-site/SKILL.md:111Low confidence
- Network access in prose of the SKILL.mdcapture-site/SKILL.md:171Low confidence
- Network access in prose of the SKILL.mdcapture-site/SKILL.md:177Low confidence
- Network access in prose of the SKILL.mdcapture-site/SKILL.md:247Low confidence
- Executable script in code of a file that runscapture-site/scripts/assets.mjs:1High confidence
- Network access in code of a file that runscapture-site/scripts/assets.mjs:90High confidence
- Network access in code of a file that runscapture-site/scripts/assets.mjs:91High confidence
- Network access in code of a file that runscapture-site/scripts/assets.mjs:92High confidence
- Executable script in code of a file that runscapture-site/scripts/capture.mjs:1High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:57High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:387High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:388High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:389High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:635High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:636High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:637High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:703High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:704High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:705High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:737High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:738High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:739High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:755High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:756High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:757High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:944High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:945High confidence
- Network access in code of a file that runscapture-site/scripts/capture.mjs:946High confidence
- Executable script in code of a file that runscapture-site/scripts/fingerprint.mjs:1High confidence
- Network access in code of a file that runscapture-site/scripts/fingerprint.mjs:36High confidence
- Network access in code of a file that runscapture-site/scripts/fingerprint.mjs:126High confidence
- Network access in code of a file that runscapture-site/scripts/fingerprint.mjs:127High confidence
- Network access in a comment of a file that runscapture-site/scripts/fingerprint.mjs:137Low confidence
- Network access in code of a file that runscapture-site/scripts/fingerprint.mjs:138High confidence
- Network access in code of a file that runscapture-site/scripts/fingerprint.mjs:139High confidence
- Network access in code of a file that runscapture-site/scripts/fingerprint.mjs:140High confidence
- Network access in code of a file that runscapture-site/scripts/fingerprint.mjs:171High confidence
- Executable script in a comment of a file that runscapture-site/scripts/lib/challenge.mjs:1Low confidence
- Executable script in a comment of a file that runscapture-site/scripts/lib/css-urls.mjs:1Low confidence
- Executable script in a comment of a file that runscapture-site/scripts/lib/exclude.mjs:1Low confidence
- Executable script in a comment of a file that runscapture-site/scripts/lib/extract.mjs:1Low confidence
- Executable script in a comment of a file that runscapture-site/scripts/lib/http.mjs:1Low confidence
- Dangerous shell operation in code of a file that runscapture-site/scripts/lib/http.mjs:29High confidence
- Network access in code of a file that runscapture-site/scripts/lib/http.mjs:354High confidence
- Network access in code of a file that runscapture-site/scripts/lib/http.mjs:355High confidence
- Network access in code of a file that runscapture-site/scripts/lib/http.mjs:356High confidence
- Executable script in a comment of a file that runscapture-site/scripts/lib/node-version.mjs:1Low confidence
- Executable script in a comment of a file that runscapture-site/scripts/lib/page-rules.mjs:1Low confidence
and 442 more
Only the first 500 facts are listed.
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Manifest .claude-plugin/marketplace.json | .claude/skills/<skill-name>/ |
| Codex | Native | Manifest AGENTS.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md skills/capture-site/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md skills/capture-site/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md skills/capture-site/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard 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.