pclshm-kit
Built for Claude Code

My personal Claude Code kit.
Fork it, rename it, make it yours.

My personal Claude Code conventions + brownfield/greenfield scaffolding CLI — one repo, many stacks, consistent setup across my machines.

The idea: combine a shared Claude Code setup with brownfield onboarding — apply to the projects I already have, not only to greenfield scaffolds. Inspired by Adam Bien’s bce.design and airails.dev.

Vibe-coded personal toolbox, not a product. If it’s useful, copy the pattern — don’t depend on the repo.

Install bash
# Fork pclshm/pclshm-kit on GitHub, rename it to <you>-kit, then:
git clone git@github.com:<you>/<you>-kit.git ~/<you>-kit
cd ~/<you>-kit && ./bootstrap.sh

Why I built this

I didn't want to relearn conventions every time I switched frameworks.

I use different stacks for different projects, but I want the same Claude Code workflow applied consistently across all of them — and most AI-dev tooling I see is greenfield-only. This kit is the opposite: the idea is to combine a shared Claude Code setup with brownfield onboarding, so I can drop it into a project I already have (or one I just forked) and have it preconfigured in one command.

It’s shaped by two things I keep coming back to: Adam Bien’s bce.design (Boundary–Control–Entity as a universal feature layout) and airails.dev (AI-assisted development that respects how real projects are built). This is the kit I built for myself — fork it and shape it into the one you would build.

  • Different stacks, same workflow

    Next.js, Expo, Astro, SvelteKit, Python, Quarkus — one mental model for skills, commands, agents, hooks, and rules across all of them.

  • Drop into existing projects

    Brownfield-first. `pk init` auto-detects the stack and merges conventions into `.claude/` without clobbering local edits.

  • Reproducible across my machines

    Clone my fork, run one bootstrap script, and the `pk` CLI plus my global Claude defaults are ready — macOS, Linux, WSL, or Windows. Fork it yourself to get the same on yours.

How it works

Three layers, merged on init.

Conventions stack like the logo: a shared core at the bottom, your stack in the middle, project edits on top. A manifest tracks what the kit installed so pk update can refresh safely without touching your project-specific edits.

  1. 3

    Project

    project

    Whatever you add or edit inside a project's `.claude/`. Preserved on every update.

  2. 2

    Stack

    conventions/stacks/<id>/

    Stack-specific skills, commands, and a `CLAUDE.md` addendum mapping BCE onto that framework.

  3. 1

    Core

    conventions/core/

    Stack-agnostic skills, commands, and rules — the shared baseline every project gets.

Supported stacks

Six stacks today. Add yours in minutes.

Each stack is a self-describing folder under conventions/stacks/<id>/ with a stack.json manifest — no code edits required to add one.

N

Next.js

nextjs

App Router, Server Actions, Drizzle, shadcn/ui, Tailwind.

E

Expo (React Native)

expo

Expo SDK 52+, Expo Router, EAS Build, expo-secure-store.

A

Astro

astro

Content collections, islands, endpoints, Astro Actions.

S

SvelteKit

svelte

Svelte 5 Runes, form actions, typed `load`.

P

Python

python

3.12+, uv, Pydantic v2, FastAPI, ruff, pytest.

Q

Quarkus (MicroProfile)

quarkus-microprofile

Java 21+, Maven, JAX-RS, CDI, SmallRye Health.

Quickstart

Fork it, then go from zero to a running BCE slice in three commands.

After you’ve forked: the CLI is a tiny Node 18+ / Bun 1.1+ script with one runtime dependency. Distributed only via this repo — no npm package.

0. Fork it first

This repo is opinionated to how I work. Fork it, rename it to <you>-kit, and edit the conventions to match your stack choices before using it. Don’t depend on upstream — there’s no stability contract.

Fork bash
gh repo fork pclshm/pclshm-kit --fork-name <you>-kit --clone=false
# or click "Fork" on github.com/pclshm/pclshm-kit and rename it there

1. Set up your machine

One-shot bootstrap drops the global Claude defaults into ~/.claude/.

Fresh machine bash
pk bootstrap

2. Scaffold a new project

Greenfield: stack-aware scaffolder + BCE layout + a runnable hello slice.

Greenfield bash
pk new my-app --stack nextjs               # uses your default package manager
pk new my-app --stack nextjs --pm bun      # force bun
pk new my-api --stack python               # ignores --pm; runs `uv init`

3. Or apply to an existing project

Brownfield: interactive wizard auto-detects the stack and merges conventions.

Brownfield bash
cd ~/projects/existing-app
pk init

Want the full walkthrough?

A 10-step CRUD example that validates your setup end-to-end.

Read EXAMPLE.md

CLI reference

Nine commands, one tool.

Everything pk does, in one place. Run pk help for full flag lists.

Command Purpose
pk new <name> [--stack id] Bootstrap a greenfield project with BCE layout, conventions, and a runnable hello slice.
pk init Interactive wizard: detect stack, install global layer, merge conventions into an existing project.
pk bootstrap One-shot machine setup. Runs link-global and prints next-step hints.
pk update Refresh conventions from pclshm-kit without touching your edits.
pk sync-back Promote local .claude/ edits back into pclshm-kit.
pk link-global Install pclshm-kit/global/* into ~/.claude/.
pk list List available stacks.
pk stack new <id> Scaffold a new stack folder with a template stack.json + BCE skill dirs.
pk stack validate Lint stack.json manifests. Exits non-zero on failure (CI-friendly).

Extend it

Add a new stack with zero code edits.

Stacks are data, not code. Drop a folder with a stack.json manifest under conventions/stacks/, add a few skills, and pk new picks it up.

3 commands bash
pk stack new nuxt --label "Nuxt.js" --description "Nuxt 3, Nitro, auto-imports"
pk stack validate nuxt
pk new my-nuxt-app --stack nuxt
conventions/stacks/nuxt/stack.json json
{
  "id": "nuxt",
  "label": "Nuxt.js",
  "description": "Nuxt 3, Nitro, auto-imports",
  "priority": 35,
  "detect": {
    "any": [
      { "file": "nuxt.config.ts" },
      { "file": "nuxt.config.js" },
      { "dep": "nuxt" }
    ]
  },
  "bootstrap": {
    "command": "npx",
    "args": ["--yes", "create-nuxt@latest", "{{name}}"],
    "srcRoot": "app"
  }
}

Lower priority = more specific = evaluated first by pk init's auto-detection. Detect rules compose via any / all.