Contributing
Ground rules
- Keep it opinionated — don't add options for everything. A new flag must justify itself.
- Prefer incremental module extraction over rewrites. New capability → new module.
- Never merge changes that break smoke verification. All generated profiles must pass lint, typecheck, test, and build.
Development setup
git clone https://github.com/jocage/skit.git
cd skit
pnpm installThe repo is a pnpm workspace. The main packages are apps/cli (the generator) and apps/docs (this site).
pnpm dev # start the docs site on localhost:3000
pnpm cli:dev # watch-rebuild the CLI during developmentOpening an issue
Before opening a PR, open an issue first unless the fix is trivially obvious (typo, broken link).
A good issue includes:
- What — what behavior you observed vs. what you expected
- Repro — the exact
create-skitcommand or the relevant generated file - Why — why you think this is a bug or worth changing
For feature requests, explain the use case, not just the desired API.
Submitting a pull request
1. Branch naming
fix/short-description
feat/short-description
docs/short-description
chore/short-description2. Make your changes
Keep changes focused. A PR that fixes one thing is easier to review than one that fixes five. If you find unrelated issues, open separate PRs.
Relevant directories by change type:
| What you're changing | Where |
|---|---|
| Generated file content | templates/base-web/src/ or templates/dashboard/src/ |
| A specific module | modules/<name>/ |
| Which modules a preset includes | presets/<name>.json |
| CLI prompts or flags | apps/cli/bin/create-skit.mjs |
| Module resolution logic | apps/cli/lib/module-resolver.mjs |
| Docs content | apps/docs/content/docs/ |
3. Run smoke tests
Before pushing, verify all profiles pass end-to-end:
pnpm smoke:verify:blank
pnpm smoke:verify:dashboard
pnpm smoke:verify:postgresjsEach command generates a full project, installs dependencies, then runs:
lint → typecheck → test → buildIf any step fails, the PR will not be merged.
4. Sync CLI assets
If you changed anything under templates/, modules/, or presets/, sync the assets into apps/cli/:
pnpm cli:sync-assetsThis copies the source files so the CLI tarball reflects your changes.
5. PR description
A useful PR description covers:
- What changed — a short summary of the diff
- Why — the motivation or linked issue
- Smoke result — confirm which smoke profiles you ran and that they passed
- Token changes (if any) — list new or modified
__TOKEN_NAME__placeholders
Adding a new module
See Adding a Module for the full walkthrough.
The short version:
- Create
modules/<name>/module.json - Add files to
modules/<name>/files/(if the module contributes new files) - Add token replacements to
module.jsonif the module modifies existing files - Register the module in
apps/cli/lib/module-resolver.mjs - Add any new CLI options to
apps/cli/bin/create-skit.mjs - Add the module to relevant presets if it should be auto-included
- Run smoke tests
- Sync CLI assets
Release process
See the Release Guide for the full checklist.
Version policy
| Bump | When |
|---|---|
patch | Packaging fixes, docs, non-breaking template fixes |
minor | New scaffold options, new modules, additive generated files |
major | Breaking changes to generated output, removed CLI options |
Internal docs
- Specification — product requirements and design decisions
- Module System — full module system spec
- Release Guide — publishing checklist