A modern TypeScript monorepo template (pnpm workspaces, Turborepo, oxlint, oxfmt, tsdown, Vitest, and Changesets).
A drop-in monorepo starter. Fork it, rename a few fields, and you have a production-ready repository with build, test, lint, format, release and CI already wired up.
This template is set up for AI coding agents. It builds on two open formats, AGENTS.md and Agent Skills, and uses symlinks so every tool reads from one source instead of drifting copies.
AGENTS.md is the canonical instruction file. The shared toolset (skills, commands,
code-reviewer agent, output styles, and conventions) lives in tools/claude/, which doubles as
a Claude Code plugin (installable as toolkit@stijnvanhulle). The workspace paths under .claude/ and .agents/
symlink into that folder, so the template repo and any project that installs the plugin run
the same content from a single source of truth. See tools/claude/README.md
for install steps.
The cross-provider skills are the canonical shared asset and live in .agents/skills/. Both
plugins symlink their skills/ to it, so they never drift. The same toolset ships as a Cursor
plugin in tools/cursor/, with the conventions expressed as Cursor rules (rules/*.mdc). The
workspace paths under .cursor/ symlink into it, and .cursor-plugin/marketplace.json makes it
installable from Cursor's marketplace. See tools/cursor/README.md for
install steps.
AGENTS.md # canonical instructions every agent reads
CLAUDE.md → AGENTS.md # Claude Code
GEMINI.md → AGENTS.md # Gemini CLI
.github/copilot-instructions.md → AGENTS.md # GitHub Copilot in VS Code
.agents/
└── skills/ # canonical cross-provider Agent Skills, one SKILL.md folder each
├── changelog, deslop, documentation, humanizer, jsdoc, pr, spec-driven
└── conventions/ # always-on rules: code-style, jsdoc, markdown, security, testing, usa-english
tools/claude/ # distributable Claude Code plugin
├── .claude-plugin/plugin.json # plugin manifest
├── README.md # install + usage
├── skills → ../../.agents/skills # shared skills (canonical home is .agents/skills)
├── commands/ # slash commands: /changeset, /deslop, /spec, /plan, /implement, /verify
├── agents/ # subagents: code-reviewer
└── output-styles/ # system-prompt modes: house (default), plan, diagrams-first
tools/cursor/ # distributable Cursor plugin (same toolset, Cursor formats)
├── .cursor-plugin/plugin.json # plugin manifest
├── README.md # install + usage
├── rules/ # Cursor rules (.mdc): code-style, jsdoc, markdown, security, testing, usa-english
├── commands/ # slash commands: /changeset, /deslop, /spec, /plan, /implement, /verify
├── agents/ # subagents: code-reviewer
└── skills → ../../.agents/skills # shared skills (canonical home is .agents/skills)
.cursor-plugin/marketplace.json # Cursor marketplace manifest (lists the toolkit plugin)
.claude/ # Claude-specific workspace config
├── settings.json # permissions and hook registration
├── hooks/ # shell hooks: session-start, format-lint, guard-edit
├── skills → ../.agents/skills # the shared skills, including conventions
├── commands → ../tools/claude/commands
├── agents → ../tools/claude/agents
├── output-styles → ../tools/claude/output-styles
└── rules → ../.agents/skills/conventions/rules # the conventions rule files, exposed as rules
.cursor/ # Cursor workspace config, symlinked into tools/cursor/
├── rules → ../tools/cursor/rules
├── commands → ../tools/cursor/commands
├── agents → ../tools/cursor/agents
└── skills → ../.agents/skills
plans/ # spec-driven workflow
├── README.md # workflow guide
├── templates/ # blank docs, copied per feature
│ ├── spec.md # requirements and acceptance criteria
│ ├── research.md # decisions, open questions, constraints
│ ├── plan.md # architecture and numbered slices
│ ├── verification.md # end-to-end scenarios, one per AC
│ └── slice.md # one implementation slice
└── <feature>/ # one folder per plan
├── spec.md research.md plan.md verification.md
└── NNN-<slug>.md # slices, copied from templates/slice.md
Supported agents:
- Claude Code reads
CLAUDE.md(symlink toAGENTS.md) and.claude/skills(symlink to.agents/skills), plus the Claude-specific extensions below. Other projects can install the same toolset as a marketplace plugin (see tools/claude/README.md). - OpenAI Codex / ChatGPT reads
AGENTS.mdand Agent Skills natively. - GitHub Copilot reads
AGENTS.mdnatively, and.github/copilot-instructions.md(symlink toAGENTS.md) in VS Code. - Cursor reads
AGENTS.mdnatively, and the toolkit also ships as a Cursor plugin undertools/cursor/(rules, commands, code-reviewer agent, and the shared skills). This repo wires it in through.cursor/, and other projects install it from the.cursor-plugin/marketplace.jsonmarketplace. See tools/cursor/README.md. - OpenCode reads
AGENTS.mdand Agent Skills natively. - Gemini CLI reads
GEMINI.md(symlink toAGENTS.md). - Windsurf and other AGENTS.md runtimes read
AGENTS.mdnatively.
| Entry point | Tool | Mechanism |
|---|---|---|
AGENTS.md |
Codex / ChatGPT, Cursor, Copilot, OpenCode, Windsurf | Read natively |
CLAUDE.md → AGENTS.md |
Claude Code | Symlink |
GEMINI.md → AGENTS.md |
Gemini CLI | Symlink |
.github/copilot-instructions.md → AGENTS.md |
Copilot (VS Code) | Symlink |
.agents/skills/ |
Any Agent Skills runtime | Open SKILL.md format (canonical home) |
.claude/skills → .agents/skills |
Claude Code | Symlink |
.cursor/ → tools/cursor/ |
Cursor | Symlink |
tools/claude/skills, tools/cursor/skills → .agents/skills |
Both plugins | Symlink |
tools/claude/.claude-plugin/plugin.json |
Other projects, via marketplace install | Claude Code plugin |
tools/cursor/.cursor-plugin/plugin.json |
Other projects, via marketplace install | Cursor plugin |
Claude-specific extensions layer on top. The pieces, and when each one loads:
| Path | What it does | When it loads |
|---|---|---|
.claude/rules/ → .agents/skills/conventions/rules/ |
Always-on conventions: code style, JSDoc, markdown, security, testing | Session start, or when a matching file opens for path-scoped rules |
.claude/skills/ → .agents/skills/ |
Playbooks: changelog, deslop, documentation, humanizer, jsdoc, pr, spec-driven, conventions | On demand, when the task matches the skill description |
.claude/commands/ → tools/claude/commands/ |
Explicit slash-command actions, such as /changeset and /deslop |
When you type the command |
.claude/agents/ → tools/claude/agents/ |
Subagents with their own context window, such as code-reviewer |
When delegated a matching task |
.claude/output-styles/ → tools/claude/output-styles/ |
System-prompt modes: house (the default, set in settings.json), plan, and diagrams-first |
At session start (house), or when selected |
.claude/hooks/ |
Scripts that install deps on session start and format files on edit | On the matching event |
.claude/settings.json |
Permissions and hook registration | Always |
The guiding split: rules always apply, skills are optional expertise loaded only when relevant, and commands are actions you trigger yourself.
For larger features, plans/ holds a spec-driven workflow (spec, research, plan, slices,
verification) driven by the spec-driven skill and the /spec, /plan, and /verify
commands. See plans/README.md. For quick changes, use the plan output
style instead.
- Click Use this template on GitHub.
- Update
package.jsonname/namespace,repository.url, and the author block. - Replace
packages/coreandpackages/demowith your own packages (keepinternals/utilsif useful). - Update
oxlint.config.ts/oxfmt.config.tsignore patterns if needed. - Update
.changeset/config.jsonchangelog.repoandfixed/ignorearrays. - Update
tsconfig.jsonpathsto match the new packages. - Edit
README.md,AGENTS.md,CLAUDE.md,CONTRIBUTING.md,SECURITY.mdfor the new project. - Push to
main. CI runs immediately.
This template uses Changesets:
pnpm changeset # Add a changeset entry describing the change
git commit -am "feat: ..."
git pushWhen changesets land on main, the release.yml workflow opens a "Version
Packages" PR. Merging that PR publishes the affected packages to npm with
provenance.
pnpm upgrade && pnpm installThe upgrade script runs taze
with --maturity-period 3 so new releases need at least 3 days of soak
time before being adopted.
See CONTRIBUTING.md for the project structure, prerequisites, local setup, and commands.
MIT © Stijn Van Hulle