[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"cli:manifest":3},{"sha":4,"committedAt":5,"fetchedAt":6,"source":7,"registry":8,"base":9,"profiles":255,"skills":273,"errors":399},"396fd3bfff444518f1c54f69c88c06c18f147afc","2026-09-04T21:57:04.000Z","2026-09-05T00:29:36.020Z","github","https:\u002F\u002Fskills.patrity.com",{"version":10,"sections":11,"axes":51,"fragments":225,"always":248,"templates":252},1,[12,15,18,21,24,27,30,33,36,39,42,45,48],{"id":13,"title":14},"intro","",{"id":16,"title":17},"read-first","Read first",{"id":19,"title":20},"stack","Stack",{"id":22,"title":23},"commands","Commands",{"id":25,"title":26},"workflow","Workflow",{"id":28,"title":29},"testing","Testing",{"id":31,"title":32},"docs","Docs",{"id":34,"title":35},"git","Git",{"id":37,"title":38},"deploy","Deploy",{"id":40,"title":41},"constraints","Constraints that bit before",{"id":43,"title":44},"memory","Memory",{"id":46,"title":47},"skills-and-rules","Skills and rules",{"id":49,"title":50},"self-improvement","Self-improvement",[52,69,81,87,101,115,125,137,147,163,178,191,212,219],{"id":53,"question":54,"description":55,"options":56,"default":58},"pm","Which package manager does this project use?","Sets the commands Claude runs and the lockfile rule.",[57,60,63,66],{"id":58,"label":58,"fragment":59},"pnpm","pm\u002Fpnpm.md",{"id":61,"label":61,"fragment":62},"npm","pm\u002Fnpm.md",{"id":64,"label":64,"fragment":65},"yarn","pm\u002Fyarn.md",{"id":67,"label":67,"fragment":68},"bun","pm\u002Fbun.md",{"id":70,"question":71,"description":72,"options":73,"default":75},"layout","How is the repo laid out?","Every rule glob is rewritten for the app directory you pick.",[74,77],{"id":75,"label":76},"single","Single app (code under app\u002F",{"id":78,"label":79,"fragment":80},"monorepo","Monorepo (the app lives in a sub-package)","layout\u002Fmonorepo.md",{"id":82,"question":83,"when":84,"input":85},"appDir","Where does the app's srcDir live, relative to the repo root?",{"axis":70,"option":78},{"placeholder":86,"default":86},"apps\u002Fweb\u002Fapp",{"id":25,"question":88,"options":89,"default":91},"How much process should Claude follow?",[90,94,98],{"id":91,"label":92,"fragment":93},"full","Full: brainstorm → spec → plan → TDD → two-stage review","workflow\u002Ffull.md",{"id":95,"label":96,"fragment":97},"lightweight","Lightweight: spec + TDD, no handovers","workflow\u002Flightweight.md",{"id":99,"label":100},"none","None",{"id":31,"question":102,"options":103,"default":105},"How should project docs be kept?",[104,110,114],{"id":105,"label":106,"fragment":107,"selects":108},"mechanical","Three-tier docs with a wiki-parity test","docs\u002Fmechanical.md",[109],"docs-discipline",{"id":111,"label":112,"fragment":113},"reminder","Three-tier docs, reminder only","docs\u002Freminder.md",{"id":99,"label":100},{"id":43,"question":116,"options":117,"default":119},"Use the MyMind memory server?",[118,122],{"id":119,"label":120,"fragment":121},"on","Yes","memory\u002Fon.md",{"id":123,"label":124},"off","No",{"id":126,"question":127,"options":128,"default":130},"commits","May Claude commit without asking?",[129,133],{"id":130,"label":131,"fragment":132},"proactive","Yes — commit proactively, one concern per commit","git\u002Fcommits-proactive.md",{"id":134,"label":135,"fragment":136},"ask","No — ask before every commit","git\u002Fcommits-ask.md",{"id":138,"question":139,"options":140,"default":134},"pushes","May Claude push without asking?",[141,144],{"id":134,"label":142,"fragment":143},"No — always ask before pushing","git\u002Fpushes-ask.md",{"id":130,"label":145,"fragment":146},"Yes — push when the work is verified","git\u002Fpushes-proactive.md",{"id":148,"question":149,"options":150,"default":152},"browser","How is UI work validated?",[151,161],{"id":152,"label":153,"fragment":154,"selects":155,"scaffolds":157},"playwright-cli","playwright-cli in a real browser","testing\u002Fplaywright-cli.md",[156],"browser-testing",[158],{"template":159,"to":160},"browser-testing-project.md",".claude\u002Fskills\u002F{{projectName}}-browser-testing\u002FSKILL.md",{"id":99,"label":162},"No browser validation",{"id":164,"question":165,"when":166,"options":167,"default":169},"auth","Does the app have a login?",{"axis":148,"option":152},[168,170],{"id":169,"label":124},"no",{"id":171,"label":172,"fragment":173,"scaffolds":174},"yes","Yes — register a dev test account and store it in the project skill","testing\u002Fauth.md",[175],{"template":176,"to":160,"mode":177},"browser-testing-auth-section.md","append",{"id":179,"question":180,"options":181,"default":183},"enforcement","How should the rules be enforced?",[182,185],{"id":183,"label":184},"prose","Reminders in CLAUDE.md and rules",{"id":186,"label":187,"fragment":188,"selects":189},"hooks","Fail-closed hooks (protect .env, lint gate, insight capture)","enforcement\u002Fhooks.md",[190],"quality-hooks",{"id":37,"question":192,"options":193,"default":195},"Where does this deploy?",[194,198,202,206,210],{"id":195,"label":196,"fragment":197},"vercel","Vercel","deploy\u002Fvercel.md",{"id":199,"label":200,"fragment":201},"railway","Railway (persistent process)","deploy\u002Frailway.md",{"id":203,"label":204,"fragment":205},"homelab","Homelab (Proxmox + Docker)","deploy\u002Fhomelab.md",{"id":207,"label":208,"fragment":209},"static","Static hosting","deploy\u002Fstatic.md",{"id":99,"label":211},"Not deployed",{"id":213,"question":214,"options":215,"default":123},"domain","Is there a non-engineering domain Claude must not guess about?",[216,217],{"id":123,"label":124},{"id":119,"label":120,"fragment":218},"domain\u002Fon.md",{"id":220,"question":221,"when":222,"input":223},"domainName","Name the domain (e.g. construction EVM, personal finance, security consulting)",{"axis":213,"option":119},{"placeholder":224,"default":224},"the domain",{"deploy\u002Fhomelab.md":226,"deploy\u002Frailway.md":227,"deploy\u002Fstatic.md":228,"deploy\u002Fvercel.md":229,"docs\u002Fmechanical.md":230,"docs\u002Freminder.md":231,"domain\u002Fon.md":232,"enforcement\u002Fhooks.md":233,"git\u002Fcommits-ask.md":234,"git\u002Fcommits-proactive.md":235,"git\u002Fpushes-ask.md":236,"git\u002Fpushes-proactive.md":237,"layout\u002Fmonorepo.md":238,"memory\u002Fon.md":239,"pm\u002Fbun.md":240,"pm\u002Fnpm.md":241,"pm\u002Fpnpm.md":242,"pm\u002Fyarn.md":243,"testing\u002Fauth.md":244,"testing\u002Fplaywright-cli.md":245,"workflow\u002Ffull.md":246,"workflow\u002Flightweight.md":247},"## Deploy\n- Homelab (Proxmox + Docker), internet-exposed through a tunnel. Prod ops go through the host with `pct exec`; the `remote-ops` skill covers the nested-quoting trap that has silently run commands on the wrong machine before.\n- Never paste hostnames, IPs or credentials into skills or rules that could be published; keep them in the gitignored project notes.\n","## Deploy\n- Railway runs a persistent process: in-process state (SSE fan-out, caches, schedulers) only works with `numReplicas: 1`; say so in the config and the wiki before scaling.\n- Deploys follow the production branch; run migrations from CI, not from a laptop.\n","## Deploy\n- Static hosting: everything is built at deploy time. No runtime secrets, no server code; anything dynamic needs an explicit decision.\n","## Deploy\n- Vercel via the Git integration on the production branch. Module scope in a serverless function is shared across requests: never keep per-request or per-tenant state there.\n- ISR caches 200\u002F404 and keeps stale on 5xx: surface upstream failures as 5xx, never as an empty 200 or a synthetic 404. Each distinct query string is a separate cache entry.\n- Env changes need a redeploy; a redeploy of the same commit must not be skipped by an ignored-build step.\n","## Docs\n- Three tiers, each with one job: `docs\u002Fhandovers\u002F` (what shipped, what was deferred, next seam — written before user hand-off, updated through acceptance, accurate frontmatter always), `docs\u002Fwiki\u002F` (how the system works **today**, one page per system with a status ladder), `docs\u002Fsuperpowers\u002F{specs,plans}\u002F` (intent frozen at brainstorm time).\n- Code plus the newest handover are truth; the spec holds intent; the wiki holds current behaviour. Never let a wiki page describe shipped work as unbuilt — stale pages have misled past sessions.\n- Wiki parity is mechanical: `docs\u002Fwiki\u002F_systems.json` lists every system, and the parity test fails when a registered system has no page or a page nobody registered exists. Update the wiki in the same change that ships the system.\n","## Docs\n- Three tiers: `docs\u002Fhandovers\u002F` (what shipped and what's next, written before user hand-off and updated through acceptance), `docs\u002Fwiki\u002F` (how the system works today, one page per system), `docs\u002Fsuperpowers\u002F{specs,plans}\u002F` (frozen intent).\n- Code plus the newest handover are truth. Update the relevant wiki page in the same change that ships the behaviour; stale pages have misled past sessions.\n","## Constraints that bit before\n- We are software engineers, not domain experts in this project's field. Never fill a domain gap by inference: mark it as a question for the subject-matter expert (`SME:` in comments and docs) and keep going with what is verifiable.\n","## Constraints that bit before\n- Hooks are fail-closed: a check script that is tracked in git but missing on disk exits 2 instead of being silently allowed — on `PreToolUse` that blocks the call before it runs; on `PostToolUse` it hands Claude the reason back after the edit is already written to disk. If you cannot point at the refusal, you wrote a reminder, not a rule.\n- `.env*`, `credentials.json` and `secrets.*` cannot be edited by tools; ask the user to change them.\n","## Git\n- Do not commit without explicit approval; propose the commit message and wait.\n- Conventional-commit subjects; never add co-author trailers or mention AI models in commit messages.\n","## Git\n- Commit proactively as work is verified, one concern per commit, conventional-commit subjects (`feat:`, `fix:`, `docs:`, `chore:` …).\n- Never add co-author trailers or mention AI models in commit messages.\n","## Git\n- Never push without explicit approval, even after a commit was approved.\n","## Git\n- Push when the work is verified (tests, typecheck, build green) and committed; say what was pushed.\n","## Constraints that bit before\n- App code lives under `{{appDir}}`, inside the package rooted at `{{pkgDir}}`. Rule globs use `{{appDir}}\u002F…` for app code and `{{pkgDir}}…` for anything else in the package (`{{pkgDir}}server\u002F**`, `{{pkgDir}}nuxt.config.ts`); only genuinely repo-wide paths (`.claude\u002F**`, CI config) start at the root. A rule whose glob never matches is silently dead — it happened: a glob copied from a single-app repo matched nothing for ten tasks.\n","## Memory\n- Use memory religiously: always reach for the `mymind` MCP server. Its memories come from every Claude Code session and are project-scoped: search them (`search_memories`, `search_docs`, `search_passages`) before answering from recollection and whenever you start discovery or a new implementation.\n- Mirror project docs and wikis to MyMind when you write them; file them under the project slug.\n- Two inlets: the enrichment loop (preferred, distils session transcripts into confidence-scored memories) and `save_memory` (sparingly, for one durable sentence enrichment cannot see, always with a `confidence`). Architecture detail belongs in handovers and the wiki, not in memories.\n- Search MyMind tasks for open work fronts before starting; create or update a task whenever work is deferred or finished.\n","## Commands\n- This project uses bun (`bun.lock`). Never mix in npm, pnpm or yarn.\n- `bun dev`, `bun test`, `bun run typecheck`, `bun run lint`, `bun run build` — run typecheck and build often.\n","## Commands\n- This project uses npm (`package-lock.json`). Never mix in pnpm or yarn.\n- `npm run dev`, `npm test`, `npm run typecheck`, `npm run lint`, `npm run build` — run typecheck and build often.\n","## Commands\n- Always `pnpm` — never npm or yarn. If the project ever has a `package-lock.json` use npm; a `yarn.lock` means yarn.\n- `pnpm dev`, `pnpm test`, `pnpm typecheck`, `pnpm lint`, `pnpm build` — run typecheck and build often, not just at the end.\n","## Commands\n- This project uses yarn (`yarn.lock`). Never mix in npm or pnpm.\n- `yarn dev`, `yarn test`, `yarn typecheck`, `yarn lint`, `yarn build` — run typecheck and build often.\n","## Testing\n- Auth-gated pages: use the dev test account recorded in the project-local browser-testing skill. Register it in the dev environment only; never reuse production credentials; never paste credentials into a shared bundle or CLAUDE.md.\n","## Testing\n- Validate every UI change in a real browser with `playwright-cli` (never the Playwright MCP): dev server up → `snapshot` → act on refs → `eval` assertions → read a screenshot. The `browser-testing` skill has the workflow; the project-local `{{projectName}}-browser-testing` skill has this app's URL and routes.\n","## Workflow\n- Creative work follows the superpowers cycle: brainstorm → design spec (`docs\u002Fsuperpowers\u002Fspecs\u002F`) → implementation plan (`docs\u002Fsuperpowers\u002Fplans\u002F`) → subagent-driven build with TDD → two-stage review (spec compliance, then code quality). Never skip the review loop.\n- Verification before completion: run the tests, typecheck and build and paste the evidence before claiming anything is done. Green typecheck is not proof the UI works.\n\n## Testing\n- TDD: write the failing test first, watch it fail for the right reason, then implement. A test that never failed proves nothing.\n- Every new test is sabotage-proven before commit: break the code line it covers, confirm the test fails, revert.\n","## Workflow\n- Write a short spec in chat before non-trivial changes and get a yes before coding. No plan documents.\n- Verification before completion: run tests, typecheck and build and show the output before claiming done.\n\n## Testing\n- TDD where practical: failing test first, then the implementation.\n",{"no-secrets.md":249,"self-improvement.md":250,"skills-philosophy.md":251},"## Constraints that bit before\n- Credentials, tokens, private IPs and internal hostnames never go into CLAUDE.md, rules or skills that might be shared. Reference the env var or the gitignored local note instead. Real keys have been found committed in skill files before.\n","## Self-improvement\n- You are relentlessly self-improving. Update CLAUDE.md proactively but keep it concise; put directory- or filetype-specific guidance in `.claude\u002Frules\u002F` and how-tos in `.claude\u002Fskills\u002F`.\n- When a recurring lesson, gotcha or workflow emerges, add or update a rule or skill in the same session. When a documented step fails, fix the documentation before moving on.\n","## Skills and rules\n- Rules (`.claude\u002Frules\u002F*.md`, path-scoped) state direction, when, and constraints; skills (`.claude\u002Fskills\u002F*\u002FSKILL.md`) hold the how-to. A rule points at the skill; neither repeats the other.\n- Invoke a skill whenever there is even a small chance it applies; read its current version rather than working from memory of it.\n",{"browser-testing-auth-section.md":253,"browser-testing-project.md":254},"\n## Test account (dev only)\n- Register a dedicated account in the DEV environment the first time this skill is used and record it here — never a production credential, never in a shared bundle.\n- email: TODO · password: TODO · role: TODO\n- Login flow: `goto \u003Clogin-url>` → `snapshot` → `fill \u003Cemail-ref>` → `fill \u003Cpassword-ref>` → `click \u003Csubmit-ref>`; then `state-save auth.json` and reuse with `state-load auth.json` within a session. Delete the state file when done.\n","---\nname: {{projectName}}-browser-testing\ndescription: Use when validating UI or end-to-end behaviour of {{projectName}} in a real browser with playwright-cli — this app's URLs, routes and flows. Pairs with the generic browser-testing skill for the command workflow.\n---\n\n# Browser testing for {{projectName}}\n\n## Dev server\n- Start: `{{pm}} dev` — TODO: confirm the URL (default http:\u002F\u002Flocalhost:3000; pick another port if 3000 is taken).\n- Ready check: `until curl -sf \u003Cdev-url> >\u002Fdev\u002Fnull; do sleep 1; done`\n\n## Routes to cover after UI changes\n- TODO: list the routes that matter (home, main flows, an error page).\n\n## Workflow\nFollow the `browser-testing` skill: `open` → `snapshot` → act on refs → `eval` assertions → screenshot and read it. Headless-UI components need a real `click \u003Cref>`.\n",[256,261,266],{"name":257,"description":258,"answers":259,"bundles":260},"docs-only","A documentation or notes repo — docs discipline and memory, nothing else.",{"pm":58,"layout":75,"workflow":99,"docs":105,"memory":119,"commits":130,"pushes":134,"browser":99,"enforcement":183,"deploy":99,"domain":123},[109],{"name":262,"description":263,"answers":264,"bundles":265},"library","A package or library — lightweight process, hooks, no browser validation.",{"pm":58,"layout":75,"workflow":95,"docs":111,"memory":119,"commits":130,"pushes":134,"browser":99,"enforcement":186,"deploy":99,"domain":123},[190],{"name":267,"description":268,"answers":269,"bundles":270},"nuxt-app","Nuxt 4 + Nuxt UI app with the full workflow, mechanical docs, hooks and browser validation.",{"pm":58,"layout":75,"workflow":91,"docs":105,"memory":119,"commits":130,"pushes":134,"browser":152,"auth":169,"enforcement":186,"deploy":195,"domain":123},[271,272,156,190,109],"nuxt","nuxt-ui",[274,292,308,319,330,343,357,370,386],{"slug":156,"name":275,"description":276,"tags":277,"author":280,"authorUrl":281,"requires":282,"badges":284,"fileCount":289,"totalBytes":290,"errors":291},"Browser Testing","Prove UI changes in a real browser with playwright-cli — install-if-missing, snapshot→ref→act workflow, test-account convention and evidence discipline.",[28,278,279,148],"e2e","playwright","Patrity","https:\u002F\u002Fgithub.com\u002FPatrity",[283,61],"node",[285,286,287,288],"skills","rules","settings","claude-md",5,11703,[],{"slug":293,"name":294,"description":295,"tags":296,"author":280,"authorUrl":281,"requires":299,"gitignore":302,"badges":304,"fileCount":305,"totalBytes":306,"errors":307},"doc-fetcher","Doc Fetcher","A generator for per-library documentation skills — configure a template and Claude Code fetches a library's real docs from GitHub instead of recalling them.",[31,297,298],"generator","python",[300,301],"python3","curl",[303],".claude\u002Fskills\u002Fdoc-fetcher\u002Fcache\u002F",[285,288],4,20601,[],{"slug":109,"name":309,"description":310,"tags":311,"author":280,"authorUrl":281,"badges":315,"fileCount":316,"totalBytes":317,"errors":318},"Docs Discipline","The three-tier docs model (handovers, living wiki, frozen specs) with a handover skill and a mechanical wiki-parity test.",[31,312,313,314],"handovers","wiki","process",[285,286,288],7,17612,[],{"slug":320,"name":321,"description":322,"tags":323,"author":280,"authorUrl":281,"badges":326,"fileCount":327,"totalBytes":328,"errors":329},"iterative-spec-design","Iterative Spec Design","Design a system section by section with an approval checkpoint after each one, so a wrong assumption is caught in section two instead of in the finished spec.",[314,324,325],"planning","specs",[285,288],3,5868,[],{"slug":271,"name":331,"description":332,"tags":333,"author":280,"authorUrl":281,"requires":335,"suggests":336,"gitignore":337,"badges":339,"fileCount":340,"totalBytes":341,"errors":342},"Nuxt","Nuxt 4 framework docs fetcher and the rule that makes Claude Code check it before guessing a composable.",[271,334,31],"vue",[300],[272,156],[338],".claude\u002Fskills\u002Fnuxt-docs\u002Fcache\u002F",[285,286,288],11,34294,[],{"slug":272,"name":344,"description":345,"tags":346,"author":280,"authorUrl":281,"requires":348,"dependsOn":349,"gitignore":350,"badges":353,"fileCount":354,"totalBytes":355,"errors":356},"Nuxt UI","Nuxt UI v4 component docs and template fetchers plus the rule that makes Claude Code check them before touching a .vue file.",[272,334,347,31],"ui",[300],[271],[351,352],".claude\u002Fskills\u002Fnuxt-ui-docs\u002Fcache\u002F",".claude\u002Fskills\u002Fnuxt-ui-templates\u002Fcache\u002F",[285,286,288],9,45166,[],{"slug":190,"name":358,"description":359,"tags":360,"author":280,"authorUrl":281,"requires":363,"badges":366,"fileCount":367,"totalBytes":368,"errors":369},"Quality Hooks","Fail-closed Claude Code hooks: protect .env and credential files, lint after every edit, and flag an unwritten convention before context is compacted.",[186,361,362],"quality","safety",[364,365,34],"bash","jq",[286,186,287,288],6,12374,[],{"slug":371,"name":372,"description":373,"tags":374,"author":280,"authorUrl":281,"env":377,"badges":383,"fileCount":305,"totalBytes":384,"errors":385},"readonly-db","Read-only DB Access","A dedicated read-only role, a one-statement runner wrapped in BEGIN READ ONLY, and the rule that keeps destructive SQL out of Claude's hands.",[375,376,362],"database","postgres",[378],{"name":379,"description":380,"required":381,"example":382},"DATABASE_URL_RO","Read-only Postgres connection string for the db:q runner. Point it at a replica or a dedicated read-only role.",true,"postgres:\u002F\u002F\u003Capp>_claude_ro:\u003Cpassword>@\u003Chost>\u002F\u003Cdatabase>",[285,286,288],12933,[],{"slug":387,"name":388,"description":389,"tags":390,"author":280,"authorUrl":281,"requires":395,"badges":396,"fileCount":327,"totalBytes":397,"errors":398},"remote-ops","Remote Ops Quoting","The ssh argument-flattening trap that silently runs your command on the wrong machine, the two forms that work, and the base64 hop for anything with nested quotes or SQL.",[391,392,393,394],"ops","ssh","proxmox","shell",[392],[285,288],6903,[],[]]