[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f14yxoqxwh6f4b":3},{"entry":4,"body":9,"data":520},{"slug":5,"title":6,"file":7,"description":8},"start-here","Start here","start-here.md","Get the whole setup into a project, from the web or from a terminal.",{"type":10,"children":11},"root",[12,19,42,49,93,104,116,136,155,180,209,215,242,279,316,336,348,361,386,413,430,470,495,501,514],{"type":13,"tag":14,"props":15,"children":16},"element","h1",{"id":5},[17],{"type":18,"value":6},"text",{"type":13,"tag":20,"props":21,"children":22},"p",{},[23,25,32,34,40],{"type":18,"value":24},"The setup is a ",{"type":13,"tag":26,"props":27,"children":29},"code",{"className":28},[],[30],{"type":18,"value":31},"CLAUDE.md",{"type":18,"value":33}," assembled from your answers plus a ",{"type":13,"tag":26,"props":35,"children":37},{"className":36},[],[38],{"type":18,"value":39},".claude\u002F",{"type":18,"value":41}," directory of skills, rules and hooks. Two paths write it, and they write the same files. If you only want one piece of it, skip to step 5.",{"type":13,"tag":43,"props":44,"children":46},"h2",{"id":45},"_1-build-it-on-the-web",[47],{"type":18,"value":48},"1. Build it on the web",{"type":13,"tag":20,"props":50,"children":51},{},[52,54,61,63,69,71,77,78,84,86,91],{"type":18,"value":53},"Open ",{"type":13,"tag":55,"props":56,"children":58},"a",{"href":57},"\u002Fbuild",[59],{"type":18,"value":60},"the builder",{"type":18,"value":62},". Pick a preset (",{"type":13,"tag":26,"props":64,"children":66},{"className":65},[],[67],{"type":18,"value":68},"nuxt-app",{"type":18,"value":70},", ",{"type":13,"tag":26,"props":72,"children":74},{"className":73},[],[75],{"type":18,"value":76},"library",{"type":18,"value":70},{"type":13,"tag":26,"props":79,"children":81},{"className":80},[],[82],{"type":18,"value":83},"docs-only",{"type":18,"value":85},", or Custom), name the project, and work down the questions. The right pane shows the composed ",{"type":13,"tag":26,"props":87,"children":89},{"className":88},[],[90],{"type":18,"value":31},{"type":18,"value":92}," while you answer; the Files tab lists everything the zip will hold.",{"type":13,"tag":20,"props":94,"children":95},{},[96,102],{"type":13,"tag":97,"props":98,"children":99},"strong",{},[100],{"type":18,"value":101},"Download setup",{"type":18,"value":103}," gives you a zip of exactly that:",{"type":13,"tag":105,"props":106,"children":111},"pre",{"className":107,"code":109,"language":18,"meta":110},[108],"language-text","CLAUDE.md\n.claude\u002Fskills\u002F…             skills from the bundles you ticked\n.claude\u002Frules\u002F…              rules, globs rewritten for your app directory\n.claude\u002Fhooks\u002F…              hook scripts, executable\n.claude\u002Fsettings.json        committed: hooks — only if a bundle contributes some\n.claude\u002Fsettings.local.json  per-machine: permission allowlists — same\n.claude\u002F.env.example         only if a bundle you picked declares variables\n.claude\u002Fskills.lock.json     what is installed, at which sha, and your answers\n.gitignore                   one managed block, only if there is anything to ignore\n","",[112],{"type":13,"tag":26,"props":113,"children":114},{"__ignoreMap":110},[115],{"type":18,"value":109},{"type":13,"tag":20,"props":117,"children":118},{},[119,121,127,129,134],{"type":18,"value":120},"The lines that say ",{"type":13,"tag":122,"props":123,"children":124},"em",{},[125],{"type":18,"value":126},"only if",{"type":18,"value":128}," are exactly that: a zip of documentation bundles alone comes out as a ",{"type":13,"tag":26,"props":130,"children":132},{"className":131},[],[133],{"type":18,"value":31},{"type":18,"value":135},", a lockfile and a couple of skill files.",{"type":13,"tag":20,"props":137,"children":138},{},[139,141,146,148,153],{"type":18,"value":140},"Unzip it into a new project folder. There is no wrapper directory: the paths are already relative to a project root. Nothing in the zip is merged with files you have, so if the folder already holds a ",{"type":13,"tag":26,"props":142,"children":144},{"className":143},[],[145],{"type":18,"value":31},{"type":18,"value":147}," or a ",{"type":13,"tag":26,"props":149,"children":151},{"className":150},[],[152],{"type":18,"value":39},{"type":18,"value":154},", run the CLI there instead.",{"type":13,"tag":20,"props":156,"children":157},{},[158,163,165,170,172,178],{"type":13,"tag":97,"props":159,"children":160},{},[161],{"type":18,"value":162},"Copy share link",{"type":18,"value":164}," puts the whole form state in the URL hash, which is the only way this site remembers anything — send the link and someone else opens your exact answers. ",{"type":13,"tag":97,"props":166,"children":167},{},[168],{"type":18,"value":169},"Copy CLI command",{"type":18,"value":171}," copies the ",{"type":13,"tag":26,"props":173,"children":175},{"className":174},[],[176],{"type":18,"value":177},"pnpx @patrity\u002Fskills init --yes …",{"type":18,"value":179}," invocation that reproduces the same state.",{"type":13,"tag":20,"props":181,"children":182},{},[183,185,191,193,199,201,207],{"type":18,"value":184},"One catch with that command. Untick something the preset recommends and the command drops ",{"type":13,"tag":26,"props":186,"children":188},{"className":187},[],[189],{"type":18,"value":190},"--profile",{"type":18,"value":192}," and spells your answers out instead, so the preset itself cannot put it back — but an answer still can. Saying you test in a browser selects ",{"type":13,"tag":26,"props":194,"children":196},{"className":195},[],[197],{"type":18,"value":198},"browser-testing",{"type":18,"value":200}," however you got there, and a bundle you kept may suggest one you dropped. When that happens, take it out again with ",{"type":13,"tag":26,"props":202,"children":204},{"className":203},[],[205],{"type":18,"value":206},"remove",{"type":18,"value":208},", or download the zip instead.",{"type":13,"tag":43,"props":210,"children":212},{"id":211},"_2-or-run-the-cli",[213],{"type":18,"value":214},"2. Or run the CLI",{"type":13,"tag":105,"props":216,"children":220},{"className":217,"code":218,"language":219,"meta":110,"style":110},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","pnpx @patrity\u002Fskills\n","bash",[221],{"type":13,"tag":26,"props":222,"children":223},{"__ignoreMap":110},[224],{"type":13,"tag":225,"props":226,"children":229},"span",{"class":227,"line":228},"line",1,[230,236],{"type":13,"tag":225,"props":231,"children":233},{"style":232},"--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0",[234],{"type":18,"value":235},"pnpx",{"type":13,"tag":225,"props":237,"children":239},{"style":238},"--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF",[240],{"type":18,"value":241}," @patrity\u002Fskills\n",{"type":13,"tag":20,"props":243,"children":244},{},[245,247,253,255,261,263,269,271,277],{"type":18,"value":246},"With no subcommand it runs ",{"type":13,"tag":26,"props":248,"children":250},{"className":249},[],[251],{"type":18,"value":252},"init",{"type":18,"value":254},", the same wizard in a terminal. Node 22 or newer; ",{"type":13,"tag":26,"props":256,"children":258},{"className":257},[],[259],{"type":18,"value":260},"npx",{"type":18,"value":262}," and ",{"type":13,"tag":26,"props":264,"children":266},{"className":265},[],[267],{"type":18,"value":268},"bunx",{"type":18,"value":270}," work too. It prints the plan before it writes anything, and if you decline you get ",{"type":13,"tag":26,"props":272,"children":274},{"className":273},[],[275],{"type":18,"value":276},"Nothing written.",{"type":18,"value":278}," and an untouched directory.",{"type":13,"tag":20,"props":280,"children":281},{},[282,284,290,292,298,300,306,308,314],{"type":18,"value":283},"After that, ",{"type":13,"tag":26,"props":285,"children":287},{"className":286},[],[288],{"type":18,"value":289},"add \u003Cslug>",{"type":18,"value":291}," installs another bundle, ",{"type":13,"tag":26,"props":293,"children":295},{"className":294},[],[296],{"type":18,"value":297},"update",{"type":18,"value":299}," re-renders everything against the current registry, and ",{"type":13,"tag":26,"props":301,"children":303},{"className":302},[],[304],{"type":18,"value":305},"diff",{"type":18,"value":307}," shows what drifted — your hand edits on one side, upstream changes on the other. The ",{"type":13,"tag":55,"props":309,"children":311},{"href":310},"\u002Fdocs\u002Fcli",[312],{"type":18,"value":313},"CLI reference",{"type":18,"value":315}," has every command and flag.",{"type":13,"tag":20,"props":317,"children":318},{},[319,321,326,328,334],{"type":18,"value":320},"The CLI also picks up where the builder left off. A zip holds what ",{"type":13,"tag":26,"props":322,"children":324},{"className":323},[],[325],{"type":18,"value":252},{"type":18,"value":327}," writes into an empty directory, lockfile included, so unzip one and ",{"type":13,"tag":26,"props":329,"children":331},{"className":330},[],[332],{"type":18,"value":333},"pnpx @patrity\u002Fskills diff",{"type":18,"value":335}," should report no local drift.",{"type":13,"tag":43,"props":337,"children":339},{"id":338},"_3-fill-in-claudeenv",[340,342],{"type":18,"value":341},"3. Fill in ",{"type":13,"tag":26,"props":343,"children":345},{"className":344},[],[346],{"type":18,"value":347},".claude\u002F.env",{"type":13,"tag":20,"props":349,"children":350},{},[351,353,359],{"type":18,"value":352},"If the run wrote ",{"type":13,"tag":26,"props":354,"children":356},{"className":355},[],[357],{"type":18,"value":358},".claude\u002F.env.example",{"type":18,"value":360},", copy it and fill in the values:",{"type":13,"tag":105,"props":362,"children":364},{"className":217,"code":363,"language":219,"meta":110,"style":110},"cp .claude\u002F.env.example .claude\u002F.env\n",[365],{"type":13,"tag":26,"props":366,"children":367},{"__ignoreMap":110},[368],{"type":13,"tag":225,"props":369,"children":370},{"class":227,"line":228},[371,376,381],{"type":13,"tag":225,"props":372,"children":373},{"style":232},[374],{"type":18,"value":375},"cp",{"type":13,"tag":225,"props":377,"children":378},{"style":238},[379],{"type":18,"value":380}," .claude\u002F.env.example",{"type":13,"tag":225,"props":382,"children":383},{"style":238},[384],{"type":18,"value":385}," .claude\u002F.env\n",{"type":13,"tag":20,"props":387,"children":388},{},[389,391,396,398,404,406,411],{"type":18,"value":390},"Skills read ",{"type":13,"tag":26,"props":392,"children":394},{"className":393},[],[395],{"type":18,"value":347},{"type":18,"value":397}," rather than the repo root ",{"type":13,"tag":26,"props":399,"children":401},{"className":400},[],[402],{"type":18,"value":403},".env",{"type":18,"value":405},", so you can point Claude at a read-only database replica while the app keeps its own connection string. The example file is fully managed and regenerated on every run, so edit ",{"type":13,"tag":26,"props":407,"children":409},{"className":408},[],[410],{"type":18,"value":347},{"type":18,"value":412}," and leave the example alone.",{"type":13,"tag":43,"props":414,"children":416},{"id":415},"_4-commit-claudemd-and-claude",[417,419,424,425],{"type":18,"value":418},"4. Commit ",{"type":13,"tag":26,"props":420,"children":422},{"className":421},[],[423],{"type":18,"value":31},{"type":18,"value":262},{"type":13,"tag":26,"props":426,"children":428},{"className":427},[],[429],{"type":18,"value":39},{"type":13,"tag":20,"props":431,"children":432},{},[433,435,441,443,449,450,455,456,461,462,468],{"type":18,"value":434},"Commit both, including ",{"type":13,"tag":26,"props":436,"children":438},{"className":437},[],[439],{"type":18,"value":440},".claude\u002Fskills.lock.json",{"type":18,"value":442},". The lockfile is the only state the CLI keeps: which bundles are installed, at which registry sha, and the answers you gave. Delete it and ",{"type":13,"tag":26,"props":444,"children":446},{"className":445},[],[447],{"type":18,"value":448},"add",{"type":18,"value":70},{"type":13,"tag":26,"props":451,"children":453},{"className":452},[],[454],{"type":18,"value":297},{"type":18,"value":70},{"type":13,"tag":26,"props":457,"children":459},{"className":458},[],[460],{"type":18,"value":305},{"type":18,"value":262},{"type":13,"tag":26,"props":463,"children":465},{"className":464},[],[466],{"type":18,"value":467},"list",{"type":18,"value":469}," have nothing to read.",{"type":13,"tag":20,"props":471,"children":472},{},[473,479,480,485,487,493],{"type":13,"tag":26,"props":474,"children":476},{"className":475},[],[477],{"type":18,"value":478},".claude\u002Fsettings.local.json",{"type":18,"value":262},{"type":13,"tag":26,"props":481,"children":483},{"className":482},[],[484],{"type":18,"value":347},{"type":18,"value":486}," stay out of git. The managed ",{"type":13,"tag":26,"props":488,"children":490},{"className":489},[],[491],{"type":18,"value":492},".gitignore",{"type":18,"value":494}," block already lists them, along with any cache directory an installed bundle declares.",{"type":13,"tag":43,"props":496,"children":498},{"id":497},"_5-or-take-a-single-bundle",[499],{"type":18,"value":500},"5. Or take a single bundle",{"type":13,"tag":20,"props":502,"children":503},{},[504,506,512],{"type":18,"value":505},"None of this is all-or-nothing. Every skill, rule and hook here is also published as a bundle you can download on its own — see ",{"type":13,"tag":55,"props":507,"children":509},{"href":508},"\u002Fdocs\u002Fsingle-bundle",[510],{"type":18,"value":511},"Single bundle",{"type":18,"value":513},".",{"type":13,"tag":515,"props":516,"children":517},"style",{},[518],{"type":18,"value":519},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{}]