| name | jterrazz-new-project |
| description | Scaffolds a new @jterrazz project with all conventions — package.json, tsconfig, Makefile, CI workflows, linting. Use when creating a new app or library from scratch. |
Create a new @jterrazz project
For a new library (package-{name})
mkdir package-{name} && cd package-{name}
git init
npm init -y
package.json:
{
"name": "@jterrazz/{name}",
"version": "0.1.0",
"author": "Jean-Baptiste Terrazzoni <contact@jterrazz.com>",
"type": "module",
"files": ["dist"],
"exports": {
".": {
"require": "./dist/index.cjs",
"import": "./dist/index.js"
}
},
"publishConfig": { "registry": "https://registry.npmjs.org/" },
"repository": { "type": "git", "url": "https://github.com/jterrazz/package-{name}" },
"scripts": {
"build": "typescript bundle",
"lint": "typescript check",
"lint:fix": "typescript fix",
"test": "vitest --run"
},
"devDependencies": {
"@jterrazz/test": "latest",
"@jterrazz/typescript": "latest",
"@types/node": "latest",
"vitest": "latest"
}
}
tsconfig.json:
{ "extends": "@jterrazz/typescript/tsconfig/node" }
oxlint.config.ts:
import { oxlint } from '@jterrazz/typescript';
import { defineConfig } from 'oxlint';
export default defineConfig({ extends: [oxlint.node] });
oxfmt.config.ts:
import { oxfmt } from '@jterrazz/typescript';
import { defineConfig } from 'oxfmt';
export default defineConfig(oxfmt);
.gitignore:
node_modules/
dist
.DS_Store
.idea
Makefile:
.PHONY: build lint test install
node_modules/.install: package-lock.json
npm ci
@touch node_modules/.install
install: node_modules/.install
build: node_modules/.install
npm run build
lint: node_modules/.install
npm run lint
test: node_modules/.install
npm test
Create src/index.ts, then npm install && npm run build.
For a new application ({product}-{role})
Same as library but with these differences:
package.json scripts:
{
"build": "typescript build",
"start": "typescript start",
"dev": "typescript dev",
"lint": "typescript check",
"lint:fix": "typescript fix",
"test": "vitest --run"
}
No exports or publishConfig needed.
CI workflows
.github/workflows/validate.yaml:
name: Validate
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
validate:
uses: jterrazz/jterrazz-actions/.github/workflows/validate.yaml@main
with:
node-version: "24"
For libraries, also add .github/workflows/publish.yaml:
name: Publish
on:
release:
types: [created]
permissions:
contents: read
id-token: write
jobs:
publish:
uses: jterrazz/jterrazz-actions/.github/workflows/release-npm.yaml@main
with:
node-version: "24"
secrets: inherit
Repo structure — born structured
A new project starts with the corpus + injection layout, not just code. Do not author layout advice here — follow the jterrazz-repo-structure skill / package-typescript docs/06-repo-structure.md:
README.md — the vitrine (what it is, install, a pointer into docs/), not a manual.
AGENTS.md — the agent brief (mental model + routing table into docs/); CLAUDE.md is a symlink to it (ln -s AGENTS.md CLAUDE.md).
docs/ — the corpus of numbered chapters; write only real authored knowledge.
- Packages generate the
docs/reference/ projection with typescript docs; applications skip it.
Never
- Never use pnpm or yarn
- Never skip the Makefile
- Never put business logic in
src/index.ts — it's only for exports
- Never author repo-layout advice in a skill — route to
jterrazz-repo-structure