with one click
with one click
Menu
Read every doc in www and packages/kitcn/skills/kitcn, sync to active changeset(s), and track with checkmarks.
Use for Convex/kitcn setup and feature work: cRPC, ORM, auth, React.
Work heavyweight framework or library tasks with planning-first research, selective deep analysis, and rigorous handoff
Work a task end-to-end with lean context gathering, implementation, and verification
Generate structured video transcripts from local files or video URLs using Gemini Files API. Use when a GitHub or Linear tracker item, comment, or attachment includes a screen recording, .mov, .mp4, or tracker-hosted video and you need a <video-transcripts> block instead of hand-written notes.
Open a concise GitHub follow-up for reusable browser-use limitations. Use when browser automation is blocked by a likely tool-side issue that is worth fixing separately, especially for clicks, dropdowns, file inputs, focus traps, or other repeatable agent/browser failures.
| name | shadcn-parity |
| description | Skill: shadcn-parity |
| metadata | {"skiller":{"source":".agents/rules/shadcn-parity.mdc"}} |
Use this for UI/component parity work, including shadcn-owned shell files, registry-style component authorship, React component patterns, and React Compiler/Effect decisions inside shadcn-compatible surfaces.
Load these only when the task needs the detail:
.agents/rules/shadcn-parity/references/components.md — comprehensive component architecture reference: accessibility, asChild, composition, data attributes, artifact taxonomy, polymorphism, controlled/uncontrolled state, and component typing..agents/rules/shadcn-parity/references/react.md — comprehensive React reference: React Compiler, manual memoization escape hatches, Effects, useEffectEvent, ref access, derived state, Tailwind v4 syntax, data attributes, and UI constraints.When the user asks for shadcn parity, treat ../shadcn as the source of
truth. Do not give them "inspired by shadcn". Do not abstract away the parts
that matter. Clone the methodology:
Only diverge when:
If you diverge, say exactly why.
For kitcn init -t next, shadcn owns the app shell. kitcn
owns the integration layer.
Shadcn-owned files stay shadcn-owned:
app/layout.tsxapp/page.tsxapp/globals.csscomponents/theme-provider.tsxlib/utils.tscomponents.jsoneslint.config.mjsnext.config.mjspostcss.config.mjskitcn-owned files stay kitcn-owned:
components/providers.tsxlib/convex/*.env.localconvex/*concave.json<functionsDir>/tsconfig.jsontsconfig.json alias patch for @convex/*The rule is simple:
For the current Next scaffold, the acceptable shell patches are narrow:
layout.tsx to mount Providerstsconfig.json to add @convex/*components.json only when tailwind.css must follow src/ vs rootFor kitcn init, overwrite behavior must match that ownership split:
--yes skips conflicting owned replacements--overwrite is the only bulk replacement hammerIf you find yourself authoring a full replacement for a shadcn-owned file, you are probably doing it wrong.
Public templates stay concrete:
kitcn init -t nextkitcn init -t viteInternally, kitcn only has two scaffold modes:
next-appreactFramework detection should feel like shadcn, not like a fake kitcn abstraction:
next-app maps to next-appnext-pages, vite, react-router, tanstack-start, and manual map to
reactinit -t stays universal. Keep it narrow.
init -t always owns:
convex/functions/schema.tsconvex/functions/http.tsconvex/lib/crpc.tsconvex/lib/get-env.ts<functionsDir>/tsconfig.jsontsconfig.json patch.gitignore entries for .convex/ and .concave/components/providers.tsxlib/convex/*.env.localcodegen, convex:dev, typecheck:convex, root typecheckNext-only baseline pieces:
/convex messages demolib/convex/server.tslib/convex/rsc.tsxlayout.tsxtsconfig.jsoncomponents.jsonReact-mode baseline keeps the client core only:
/convex demo in v1init -t options stay narrow:
-t next-t vite--backend convex|concave--cwd--name--defaults--yes--prod--preview-name--deployment-name--env-fileDo not grow init -t with fake feature flags.
Optional capability belongs in add:
kitcn add authkitcn add ratelimitkitcn add resendAuth is the first real bundle. It patches the init -t baseline and owns:
get-envoptionalAuth*auth*Mode split:
next-app: minimal /auth page + provider/client/server wiringreact: auth server config/runtime, auth client, provider wiring, auth env,
and auth cRPC families onlyAuth v1 does not own:
Rule:
init -tinitaddinit -tkitcn should match shadcn on the data model as closely as possible.
Same shape:
packages/kitcn/src/cli/registry/items/<item>/<item>-item.tsCurrent kitcn divergence:
That extra install layer is what kitcn adds beyond plain shadcn registry resolution:
schema.tscrpc.ts, http.ts, providers, and get-env.tsnext-app vs reactplugins.lock.jsonRule:
RegistryItem as possiblefixtures/* is not hand-authored. It is a normalized snapshot of real
CLI output.
The important bit:
_generated/* output comes from real kitcn
codegen during kitcn init -tinit -t must fail if real codegen cannot be producedkitcn codegen directly from the fixture scriptWhy not direct kitcn codegen?
kitcn init -t next already owns the whole sequence:
scaffold -> dependency install -> codegen -> bootstrap retry -> codegen retryRepo automation adds two deliberate details:
tooling/fixtures.ts owns committed starters:
next, next-auth, vite, vite-authconvex unless config or --backend says otherwisetooling/scenarios.ts, materialized under
tmp/scenarios/*To regenerate the checked-in fixture:
bun run fixtures:sync
To verify the fixture still matches fresh CLI output:
bun run fixtures:check
To materialize runnable tmp apps for manual runtime:
bun run scenario:prepare all
Why this exists:
fixtures/*/package.json stays normalized to workspace:*fixtures:check swaps that to a packed local tarball before validationtmp/scenarios/*, never in fixtures/*scenario:dev, which ones add
test:auth and test:e2e, and which ones must use scenario:checkfixtures:check is not just a diff. It validates the fresh generated app with:
bun install
bun typecheck
Next starters also run bun lint. Vite starters intentionally skip lint in
this lane because shadcn's default eslint . sweeps generated/runtime files.
It validates against the current local package under test, not the last published npm version:
kitcn package to a tarballIf you need the slower rebuild-first lane, use:
bun run fixtures:check:full
When checking parity or drift:
bun run fixtures:sync instead of editing fixtures/* by handbun run fixtures:checkkitcn init -t next, not the fixturetooling/fixtures.ts does this:
create a temp directory
for each committed starter, run the local CLI:
bunx kitcn --backend concave init -t <next|vite> --yes --cwd <tmp> --name <starter>
For auth starters, follow with:
bunx kitcn --backend concave add auth --yes
let create run the actual scaffold flow:
shadcn init -t nextif codegen needs Convex bootstrap, create bootstraps Convex and reruns real
codegen
validate the fresh generated app:
kitcn to a tarballbun installbun typecheckbun lint only for templates whose registry entry enables lintcopy the generated app into fixtures/<starter>
apply repo-only normalization:
node_modules, .next, lockfiles, etc.)kitcn to workspace:*CONVEX_DEPLOYMENT noise from .env.localThat means the fixture is allowed to normalize repo-local junk, but it is not allowed to invent user-facing files.
Do not change this into:
bunx kitcn init -t next --yes --cwd <tmp> --name next
cd <tmp>/next
bunx kitcn codegen
That skips the point of create owning bootstrap/codegen orchestration and can reintroduce interactive or half-bootstrapped failure modes.
If fixtures/next differs from fresh output, assume the CLI is wrong first.
Do not "fix" fixture drift by patching the fixture directly unless the change is
strictly part of repo-only normalization.
Start here before editing:
../shadcn/packages/shadcn/src/commands../shadcn/packages/shadcn/src/utils../shadcn/packages/shadcn/testPrefer shadcn's non-e2e tests over guessing intended behavior.
Build a parity map between the local surface and the shadcn surface.
Check:
If there is a direct analog, mirror it.
Read the matching shadcn implementation and the relevant unit tests before changing local code.
Do not stop at the happy path source file. Read the tests too. That is where the real contract usually lives.
For parity work, the first useful move is usually test porting.
Port/adapt shadcn's non-e2e tests for:
Adjust only the domain-specific payloads, paths, and names.
Do not add dead legacy tests like "old API no longer exists". Just delete the old path.
If shadcn splits logic into command modules and shared utilities, mirror that split locally.
Prefer:
Avoid:
Parity includes UX, not just logic.
Mirror:
If local dependencies differ, keep the behavior and shape the same with the closest local equivalent.
If the repo needs a stronger behavior than shadcn, keep it behind the same surface.
Good:
Bad:
If an old local abstraction conflicts with the parity target, remove it.
Do not keep:
Make the result look like it was built that way from the start.
Before calling the work done, verify:
If you catch yourself doing any of these, stop:
That is how parity rots into fan fiction.
When reporting parity work back to the user, state:
If there was no divergence, say so plainly.