{
  "$schema": "https://agentskills.io/schema/v0.2.0/index.json",
  "skills": [
    {
      "name": "add-auth",
      "type": "claude-skill",
      "description": "Drop session-based auth into a pracht app following the framework's recommended pattern (middleware checks the session, loaders read user info, API routes mutate it). Generates session utilities, the auth middleware, login/logout/signup API routes, and the matching `<Form>`-driven pages — then wires the manifest with public vs. protected groups. Use when asked to \"add auth\", \"set up login\", \"wire authentication\", \"add session middleware\", or \"I need users\".",
      "url": "https://pracht.resynapse.dev/skills/add-auth/SKILL.md",
      "sha256": "a605a1fdd46e1a3125dbbb74d178771b31423e32b0ed44bd071bab66618fb2ac"
    },
    {
      "name": "add-db",
      "type": "claude-skill",
      "description": "Wire Drizzle ORM into a pracht app. Asks the user which database to target (Cloudflare D1, PlanetScale, Neon, Supabase, Turso, Postgres, MySQL, SQLite, ...) and generates the matching driver setup, schema scaffold, migration workflow, and a typed client accessible from loaders, middleware, and API routes. Use when asked to \"add database\", \"set up Drizzle\", \"wire D1\", \"add Postgres\", \"set up an ORM\", or \"I need a DB\".",
      "url": "https://pracht.resynapse.dev/skills/add-db/SKILL.md",
      "sha256": "3d6352b99fce74dab9df7697c544d1236275d610b74eee377483eed4479f0949"
    },
    {
      "name": "add-i18n",
      "type": "claude-skill",
      "description": "Wire internationalization into a pracht app following the framework's recommended pattern (middleware detects locale, loaders return translations, components consume via route data). Generates locale dictionaries, the detection middleware (URL-prefix, cookie, or `Accept-Language`), and a helper for in-component translation. Use when asked to \"add i18n\", \"set up translations\", \"make my app multilingual\", \"add locale routing\", or \"extract strings\".",
      "url": "https://pracht.resynapse.dev/skills/add-i18n/SKILL.md",
      "sha256": "b74f7a559ee7893b1af998651341a2ddee44dcf53a321e9d3834e9bfd8182e03"
    },
    {
      "name": "add-observability",
      "type": "claude-skill",
      "description": "Wire error tracking, request tracing, and Web Vitals into a pracht app. Supports Sentry or OpenTelemetry on the server side (loader/middleware boundaries, API routes), and client-side Web Vitals reporting via the `web-vitals` package. Use when asked to \"add observability\", \"wire Sentry\", \"set up tracing\", \"add OpenTelemetry\", \"monitor Web Vitals\", or \"track errors\".",
      "url": "https://pracht.resynapse.dev/skills/add-observability/SKILL.md",
      "sha256": "6bdf87ec264e1d38e76777e5536af22339a5a47855dae486f246625f833d4a67"
    },
    {
      "name": "audit-a11y",
      "type": "claude-skill",
      "description": "Per-route accessibility audit for a pracht app. Drives a headless browser through every route in the manifest, runs axe-core, and reports issues grouped by severity and route. Catches alt-text gaps, contrast failures, missing landmarks, focus-order bugs, and form-label problems. Use when asked to \"audit a11y\", \"check accessibility\", \"axe my app\", \"WCAG compliance\", or \"screen reader test\".",
      "url": "https://pracht.resynapse.dev/skills/audit-a11y/SKILL.md",
      "sha256": "db2a55c5f8ac13fe0873e47239d34d35da4a0f592a22bf495fefac411fde2f45"
    },
    {
      "name": "audit-auth",
      "type": "claude-skill",
      "description": "Find pracht routes that look protected but aren't — missing auth middleware, middleware that augments context but never gates, client-side auth checks with no server enforcement, and API mutations exposed without guards. Use when asked to \"audit auth\", \"check route protection\", \"is my dashboard protected\", \"find unauthenticated routes\", or \"review middleware coverage\".",
      "url": "https://pracht.resynapse.dev/skills/audit-auth/SKILL.md",
      "sha256": "e168fefcf1222fe4f30a57ef203975f6db13a34f574f778a2df6116b109f1218"
    },
    {
      "name": "audit-bundles",
      "type": "claude-skill",
      "description": "Analyze a pracht production build. Report client bundle size per route, flag fat vendor chunks, find route components that ship large dependencies, and suggest dynamic `import()` and prefetch strategies based on observed navigation patterns. Use when asked to \"audit bundles\", \"why is my JS so big\", \"bundle size per route\", \"what's in my vendor chunk\", or \"tune prefetching\".",
      "url": "https://pracht.resynapse.dev/skills/audit-bundles/SKILL.md",
      "sha256": "da183cf943187a8ed68386acf6835dc725c9be2fe9f42b5a7a795eb07c8de98b"
    },
    {
      "name": "audit-csrf",
      "type": "claude-skill",
      "description": "Inventory every form submission and mutation API in the project, then verify the CSRF posture. Pracht enforces same-origin on mutation API requests by default (`api.requireSameOrigin`); this skill checks that the default is intact and that cookie strategy, middleware, or tokens cover whatever the built-in check does not. Use when asked to \"audit CSRF\", \"check CSRF protection\", \"are forms safe\", \"review session security\", or after enabling cross-origin form usage.",
      "url": "https://pracht.resynapse.dev/skills/audit-csrf/SKILL.md",
      "sha256": "f70389fa478c8963874a8cd6ce904f1ca90dd4a008da5b740977e0f70c54ee3b"
    },
    {
      "name": "audit-deps",
      "type": "claude-skill",
      "description": "Run a dependency vulnerability audit and map each finding to the pracht routes, loaders, middleware, or API handlers that import the affected package — so users know which surface area they need to test after upgrading. Use when asked to \"audit deps\", \"scan for CVEs\", \"which routes use this vulnerable package\", \"npm audit\", or \"dependency security review\".",
      "url": "https://pracht.resynapse.dev/skills/audit-deps/SKILL.md",
      "sha256": "990fe213d7d2eed24bcf9f1bda41546b353394b5e530e6144059ba294cae23cd"
    },
    {
      "name": "audit-headers",
      "type": "claude-skill",
      "description": "Audit security header coverage in a pracht app. The framework applies four default security headers on every response path; this skill audits the exceptions — static output served outside first-party adapters, `headers()` exports that weaken the defaults, and the headers only the user can decide (HSTS, CSP). Use when asked to \"audit security headers\", \"check CSP\", \"harden headers\", \"set up HSTS\", or \"review header policy\".",
      "url": "https://pracht.resynapse.dev/skills/audit-headers/SKILL.md",
      "sha256": "cdb6023f92920b98a57f470b5a30c58ca1bb30ddf354d546ce9e41993daa6193"
    },
    {
      "name": "audit-islands",
      "type": "claude-skill",
      "description": "Audit pracht islands usage: find over-hydrated routes that should use `hydration: \"islands\"` or `\"none\"`, dead interactivity outside the islands directory, non-serializable island props, mis-tuned client strategies, and invalid render/hydration combinations. Use when asked to \"audit islands\", \"reduce hydration\", \"why is this island not interactive\", \"should this page be an island\", or \"check partial hydration\".",
      "url": "https://pracht.resynapse.dev/skills/audit-islands/SKILL.md",
      "sha256": "8fa25e2e50be2cbb94cca9807df98187db59fa4cb98e41c00a5e7872cbb85fd7"
    },
    {
      "name": "audit-loaders",
      "type": "claude-skill",
      "description": "Audit pracht route loaders for serializability, leaked secrets, unsafe loader caching, browser-only API misuse, and missing AbortSignal plumbing. Use when asked to \"audit loaders\", \"check loader data\", \"find serialization bugs\", \"are my loaders safe\", or \"loader security review\".",
      "url": "https://pracht.resynapse.dev/skills/audit-loaders/SKILL.md",
      "sha256": "5dad861667bed6883254020316b531df42fa12dc8a87747e2946525bb4ca0e5b"
    },
    {
      "name": "audit-redirects",
      "type": "claude-skill",
      "description": "Find open-redirect vulnerabilities in pracht loaders, middleware, and navigation calls. The framework guards both ends — the client router drops unsafe URL schemes, and the server `redirect()` helper rejects unsafe schemes and CRLF injection — but a hand-rolled 3xx Response bypasses every guard, and even a guarded redirect to an attacker-chosen origin can phish. Use when asked to \"audit redirects\", \"check for open redirects\", \"is my ?redirect= param safe\", or \"review login redirect handling\".",
      "url": "https://pracht.resynapse.dev/skills/audit-redirects/SKILL.md",
      "sha256": "f3d999cddca84d6a297de6cba11e5bbe36e38e898d3e278e79ca9aae88449052"
    },
    {
      "name": "audit-secrets",
      "type": "claude-skill",
      "description": "Detect environment variables and secrets that leak from the server into the client bundle via loader return values, hydration state, or accidental imports of server-only modules from client code paths. Use when asked to \"audit secrets\", \"find leaked env vars\", \"is my API key exposed\", \"check client bundle for secrets\", or \"scan for credential leaks\".",
      "url": "https://pracht.resynapse.dev/skills/audit-secrets/SKILL.md",
      "sha256": "c39ba3cf8e297136359ef8e370e1f1e76a2104c52b6024f902e51945ff15c372"
    },
    {
      "name": "audit-seo",
      "type": "claude-skill",
      "description": "Per-route SEO audit for a pracht app: `head()` coverage, title/description presence, Open Graph and Twitter card completeness, canonical URLs, robots rules, and a generated `sitemap.xml` derived from the route manifest. Use when asked to \"audit SEO\", \"check meta tags\", \"generate a sitemap\", \"are my OG cards set\", or \"review robots.txt\".",
      "url": "https://pracht.resynapse.dev/skills/audit-seo/SKILL.md",
      "sha256": "beb310980d2526d63258dd6090de2b90f44833e82ec689c2d74c3e1b04cccf7f"
    },
    {
      "name": "audit-shells",
      "type": "claude-skill",
      "description": "Audit pracht shells for composition bugs: missing `Loading()` on SPA-using shells, accidental `<html>`/`<head>`/`<body>` rendering, shells that swallow children, unused shells, and redundant `ErrorBoundary` exports (shell-level boundaries are valid fallbacks; routes win when both declare one). Use when asked to \"audit shells\", \"check shell composition\", \"find unused shells\", or \"is my layout structured correctly\".",
      "url": "https://pracht.resynapse.dev/skills/audit-shells/SKILL.md",
      "sha256": "105768742e37bfc61ee302d257e222f0e2bfbd9ad6a33214d22a7dcd40d1ebd0"
    },
    {
      "name": "configure-isg",
      "type": "claude-skill",
      "description": "Wire ISG (incremental static generation) revalidation correctly for the project's adapter: route-level timeRevalidate/webhookRevalidate policies, the authenticated /__pracht/revalidate webhook, Cloudflare Workers Caching, Vercel native ISR, and cache-key pitfalls — then verify it locally. Use when asked to \"set up ISG\", \"configure revalidation\", \"add a revalidation webhook\", \"my ISG page never updates\", or \"cache this page at the edge\".",
      "url": "https://pracht.resynapse.dev/skills/configure-isg/SKILL.md",
      "sha256": "35f8cf21e8a912cdf860ba24065bf96ea62da20a41f70a7f96cfa2392c42a239"
    },
    {
      "name": "migrate-nextjs",
      "type": "claude-skill",
      "description": "Migrate a Next.js application to Pracht. Converts App Router pages, layouts, middleware, API routes, data fetching, and metadata to pracht equivalents. Handles React→Preact, className→class, server components→loaders, and manifest wiring. Use when asked to \"migrate from next\", \"convert next.js app\", \"port from next to pracht\", \"nextjs migration\", or \"switch from next\".",
      "url": "https://pracht.resynapse.dev/skills/migrate-nextjs/SKILL.md",
      "sha256": "914a6b436bcccd6c20f85c68bc7c4a182dba7eaf41557336f5416023d9a749fd"
    },
    {
      "name": "pracht-debug",
      "type": "claude-skill",
      "description": "Pracht framework-aware debugging. Systematically investigates route matching, loader/API route errors, rendering issues, middleware, API routes, HMR, and build problems. Uses pracht's architecture knowledge to find root causes fast. Use when asked to \"debug this\", \"fix this bug\", \"why is this broken\", \"blank page\", \"hydration mismatch\", or \"404 on my route\". Proactively suggest when the user reports errors or unexpected behavior in a pracht application.",
      "url": "https://pracht.resynapse.dev/skills/pracht-debug/SKILL.md",
      "sha256": "f7f1f2bf8267e3491175834cf2d34ccd36064b0ad520b1a1af286e417a15a4ec"
    },
    {
      "name": "pracht-deploy",
      "type": "claude-skill",
      "description": "Pracht deployment guide. Walks through adapter configuration, building, and deploying to Node.js, Cloudflare Workers, or Vercel. Handles wrangler config, Docker and production checklist. Use when asked to \"deploy\", \"set up deployment\", \"configure adapter\", \"deploy to cloudflare\", \"deploy to vercel\", or \"production build\".",
      "url": "https://pracht.resynapse.dev/skills/pracht-deploy/SKILL.md",
      "sha256": "a515b9e0c8d6bbc4f9ee0ab3444cdaa16d04fdc49cd36d6bc04d9d0d9f37459d"
    },
    {
      "name": "pracht-scaffold",
      "type": "claude-skill",
      "description": "Pracht code scaffolding. Prefer the framework-native CLI generators (`pracht generate route|shell|middleware|api`) and only fall back to manual edits when the CLI flags cannot express the requested shape. Knows pracht conventions (Preact idioms, render modes, route manifest). Use when asked to \"scaffold\", \"generate a route\", \"create a new page\", \"add middleware\", \"add an API route\", or \"create a shell\".",
      "url": "https://pracht.resynapse.dev/skills/pracht-scaffold/SKILL.md",
      "sha256": "6dfa8ead488ec16d9ba920f4cf1100887b5553206f77a28bab288f457d45c1ea"
    },
    {
      "name": "pracht-test-api",
      "type": "claude-skill",
      "description": "Auto-generate Vitest request/response tests for every handler in `src/api/`. Each test instantiates a `Request`, calls the exported HTTP method handler directly, and asserts on the returned `Response` — no server boot required. Use when asked to \"test my API routes\", \"scaffold API tests\", \"generate tests for src/api\", or \"add tests for this endpoint\".",
      "url": "https://pracht.resynapse.dev/skills/pracht-test-api/SKILL.md",
      "sha256": "720469e12bfbb356c32969fdbc492936efbcc3e18058b5a1587104bf22a90a28"
    },
    {
      "name": "pre-deploy",
      "type": "claude-skill",
      "description": "Adapter-aware pre-deployment checklist for pracht apps targeting Node, Cloudflare Workers, or Vercel. Catches the issues that only surface in the production runtime: missing env vars, Node-only APIs in edge bundles, ISG manifest absence, oversized edge bundles, missing wrangler/vercel config. Use when asked to \"pre-deploy check\", \"ready to ship?\", \"deployment checklist\", \"is my build production-safe\", or before running `wrangler deploy` / `vercel deploy`.",
      "url": "https://pracht.resynapse.dev/skills/pre-deploy/SKILL.md",
      "sha256": "d6afb7255a0fda061c33878e2802306c6024bfc1df414be5c645c0f06fd832f9"
    },
    {
      "name": "scaffold-e2e",
      "type": "claude-skill",
      "description": "Scaffold Playwright end-to-end tests for a pracht app: install Playwright, generate `playwright.config.ts` that boots `pracht dev` (or the production build via `pracht preview`), and emit a smoke test for every route in the manifest that asserts 200, head/title, no console errors, and basic navigation. Use when asked to \"scaffold E2E\", \"set up Playwright\", \"add browser tests\", or \"create smoke tests for my routes\".",
      "url": "https://pracht.resynapse.dev/skills/scaffold-e2e/SKILL.md",
      "sha256": "c1b283c79a150c9e5a1807197d628481d0c11857298c4f3d1f51fd4b2d07be33"
    },
    {
      "name": "scaffold-tests",
      "type": "claude-skill",
      "description": "Scaffold Vitest unit/integration tests for pracht routes, loaders, and middleware. Asks the user once whether to use vitest browser mode with `vitest-browser-preact` (real DOM, real events) or classic JSDOM-based tests with `@testing-library/preact`. Wires `vitest.config.ts`, mocks `LoaderArgs`, and emits ready-to-run files. Use when asked to \"scaffold tests\", \"set up Vitest\", \"add unit tests\", \"test this loader\", or \"test this route\".",
      "url": "https://pracht.resynapse.dev/skills/scaffold-tests/SKILL.md",
      "sha256": "25730f0ffea7cfdf6c6724ebe7fd5439d3b4ade17dccd84f272c956c450c4407"
    },
    {
      "name": "tune-render-mode",
      "type": "claude-skill",
      "description": "Recommend the right pracht render mode (ssg, isg, ssr, spa) for each route based on what its loader actually does. Most apps pick a mode once and never revisit; this skill surfaces routes that are mis-tuned. Use when asked to \"tune render modes\", \"make my site faster\", \"should this route be SSG\", \"audit render modes\", or \"review SSG/ISG/SSR choices\".",
      "url": "https://pracht.resynapse.dev/skills/tune-render-mode/SKILL.md",
      "sha256": "6f035c888d0e942c6903434829ab9b274a9b2a931abacdf0a69e1de1fe142fbb"
    },
    {
      "name": "typed-routes",
      "type": "claude-skill",
      "description": "Add or maintain pracht typed routes, typed links, route-object navigation, and generated href helpers. Use when asked to \"add typed routes\", \"fix typed links\", \"replace hard-coded hrefs\", \"run typegen\", or make navigation route-id based instead of string based.",
      "url": "https://pracht.resynapse.dev/skills/typed-routes/SKILL.md",
      "sha256": "bda4619329a2a652c7dfc77207dfb3d8fb5281c0015f1dd20324971f2bb8044b"
    },
    {
      "name": "upgrade-pracht",
      "type": "claude-skill",
      "description": "Upgrade the @pracht/* packages in an app safely: inventory installed versions, read the changelogs between installed and target, map breaking changes to actual usage in the codebase, apply the upgrade, and walk the verification ladder (doctor, typegen, verify, build, tests). Use when asked to \"upgrade pracht\", \"update @pracht packages\", \"bump the framework\", \"what changed in the new pracht version\", or \"is this pracht upgrade safe\".",
      "url": "https://pracht.resynapse.dev/skills/upgrade-pracht/SKILL.md",
      "sha256": "5a38e419bc93d2e988589f8e227249a50842ac4acf2528098ad0778c21a542c3"
    }
  ]
}
