Step 5 was binary on upgrade (append whole template / leave alone), so projects bootstrapped before v1.2.0 silently missed new canonical triggers (`check across all projects`, `we're on Windows`) on re-run. Now upgrade reads existing CLAUDE.md, substring-diffs vs template, preserves a deliberately-pinned platform line, and appends only missing lines after explicit confirm. Re-runs are no-ops. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
400 lines
13 KiB
Markdown
400 lines
13 KiB
Markdown
---
|
||
name: project-bootstrap
|
||
version: 1.3.0
|
||
description: >
|
||
Initializes or upgrades a project in the current folder: git, .gitignore, README.md,
|
||
.wiki/ using Karpathy's method, .tasks/ for task tracking, CLAUDE.md with skill triggers.
|
||
Use this skill when the user says "initialize project", "bootstrap", "setup project",
|
||
"upgrade project", "add wiki", "add tasks", "start project", "set everything up",
|
||
or launches the agent in a new or existing folder and wants to configure the workspace.
|
||
Trigger even if the user just says "let's start a project" or "set it all up".
|
||
---
|
||
|
||
# Project Bootstrap
|
||
|
||
Sets up a complete working environment for a monorepo project in one pass.
|
||
Operates in two modes: **init** (new project) and **upgrade** (existing project).
|
||
|
||
---
|
||
|
||
## Step 0 — Detect mode
|
||
|
||
Check what already exists in the current directory:
|
||
|
||
```bash
|
||
ls -la
|
||
git rev-parse --git-dir 2>/dev/null && echo "git:yes" || echo "git:no"
|
||
[ -d .wiki ] && echo "wiki:yes" || echo "wiki:no"
|
||
[ -d .tasks ] && echo "tasks:yes" || echo "tasks:no"
|
||
[ -f CLAUDE.md ] && echo "claude:yes" || echo "claude:no"
|
||
[ -f README.md ] && echo "readme:yes" || echo "readme:no"
|
||
```
|
||
|
||
Show the user a summary in one block — what was found, what will be created:
|
||
|
||
```
|
||
Found: ✅ git ❌ .wiki ✅ .tasks ❌ CLAUDE.md ✅ README.md
|
||
Create: .wiki CLAUDE.md
|
||
Skip: git (exists) .tasks (exists) README.md (exists)
|
||
```
|
||
|
||
Ask one question: "Looks right? Shall we proceed?" — and wait for confirmation.
|
||
**Create nothing before confirmation.**
|
||
|
||
---
|
||
|
||
## Step 1 — Git
|
||
|
||
If git is not initialized:
|
||
|
||
```bash
|
||
git init
|
||
```
|
||
|
||
If `.gitignore` does not exist — create from template `assets/.gitignore.template`.
|
||
If it exists — leave it untouched.
|
||
|
||
---
|
||
|
||
## Step 2 — README.md
|
||
|
||
If it does not exist — create a minimal one:
|
||
|
||
```markdown
|
||
# <project folder name>
|
||
|
||
## About
|
||
<!-- Describe the project here -->
|
||
|
||
## Quick start
|
||
<!-- Instructions for running the project -->
|
||
```
|
||
|
||
If it exists — leave it untouched.
|
||
|
||
---
|
||
|
||
## Step 3 — .wiki/
|
||
|
||
**Delegate to the `setup-wiki` skill.** It handles greenfield creation, canon migration, and the no-op case (already canon) uniformly, with its own confirmation gate. Don't recreate the layout inline here — that's how drift happens.
|
||
|
||
If `setup-wiki` is not installed on this machine, **stop** and tell the user: project-bootstrap requires `setup-wiki` (and `setup-tasks`) installed. Don't fall back to ad-hoc creation.
|
||
|
||
**Reference (for context only — `setup-wiki` is the source of truth):** the canonical layout per Karpathy (gist: https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f) and `using-wiki`:
|
||
|
||
```
|
||
.wiki/
|
||
CLAUDE.md ← schema: project-specific wiki conventions
|
||
index.md ← catalog of all pages (by type), updated on every ingest
|
||
log.md ← append-only op log: ## [YYYY-MM-DD] op | desc
|
||
overview.md ← single human-readable project overview
|
||
raw/
|
||
README.md ← raw/ is immutable; this file documents that
|
||
entities/ ← entity pages (people, services, modules) — empty .gitkeep
|
||
concepts/ ← concept / design decision pages — empty .gitkeep
|
||
packages/ ← package pages — empty .gitkeep
|
||
sources/ ← one summary per ingested source — empty .gitkeep
|
||
```
|
||
|
||
Page-level workflow (ingest, query, lint) and file formats are owned by the
|
||
`wiki-maintainer` skill. Bootstrap only lays the skeleton; the skill takes
|
||
over from there.
|
||
|
||
### `.wiki/CLAUDE.md` (schema)
|
||
|
||
```markdown
|
||
# Wiki Schema — <project name>
|
||
|
||
Project-specific wiki conventions. Read this before any wiki operation.
|
||
|
||
This wiki follows Karpathy's LLM Wiki pattern:
|
||
**https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f**
|
||
|
||
The `wiki-maintainer` skill enforces the workflow and file formats. This
|
||
file overrides the skill where they conflict.
|
||
|
||
## Page types
|
||
|
||
- `entities/` — discrete things the project tracks (people, services, modules).
|
||
- `concepts/` — recurring ideas, design decisions, gotchas.
|
||
- `packages/` — code packages this project produces or consumes.
|
||
- `sources/` — one summary page per ingested external doc; frontmatter carries `ingested:` and `raw_path:`.
|
||
- `overview.md` — single project-wide overview.
|
||
|
||
## Naming
|
||
|
||
- `kebab-case.md`, **Latin only**. Transliterate Cyrillic in filenames; keep the original title in the H1 + frontmatter.
|
||
|
||
## Domain conventions
|
||
|
||
<!-- Fill in as the project takes shape — what counts as an entity here, which packages exist, naming idioms specific to this codebase. -->
|
||
```
|
||
|
||
### `.wiki/index.md`
|
||
|
||
```markdown
|
||
# Wiki Index
|
||
|
||
Catalog of all wiki pages. One line per page, organized by type. The agent updates this on every ingest.
|
||
|
||
## Overview
|
||
|
||
- [overview.md](overview.md) — project overview
|
||
|
||
## Entities
|
||
|
||
<!-- (none yet) -->
|
||
|
||
## Concepts
|
||
|
||
<!-- (none yet) -->
|
||
|
||
## Packages
|
||
|
||
<!-- (none yet) -->
|
||
|
||
## Sources
|
||
|
||
<!-- (none yet) -->
|
||
```
|
||
|
||
### `.wiki/log.md`
|
||
|
||
```markdown
|
||
# Wiki Log
|
||
|
||
Append-only operation log. One entry per operation. Format:
|
||
|
||
\`\`\`
|
||
## [YYYY-MM-DD] <op> | <one-line description>
|
||
\`\`\`
|
||
|
||
Operations: `init`, `ingest`, `query`, `lint`, `refactor`, `decision`.
|
||
|
||
Parseable: `grep "^## \[" .wiki/log.md | tail -20`.
|
||
|
||
---
|
||
|
||
## [<today's date>] init | bootstrap empty wiki via project-bootstrap
|
||
```
|
||
|
||
### `.wiki/overview.md`
|
||
|
||
```markdown
|
||
# <project name> — overview
|
||
|
||
<!-- Replace with a high-level description: what this project does, who it's for, the main components. -->
|
||
```
|
||
|
||
### `.wiki/raw/README.md`
|
||
|
||
```markdown
|
||
# Raw Sources
|
||
|
||
**Immutable.** Read, never edit. The only allowed modification is appending a `> Status:` blockquote when the user explicitly asks for a status audit.
|
||
|
||
Place raw inputs here — articles, transcripts, PDFs, screenshots — exactly as they came in. The agent reads from `raw/`, writes summaries into `../sources/`, and never modifies raw files.
|
||
|
||
For large or path-sensitive sources that live outside the repo, register them here:
|
||
|
||
\`\`\`
|
||
- short-name → /absolute/path/to/source
|
||
\`\`\`
|
||
```
|
||
|
||
The empty subdirectories (`entities/`, `concepts/`, `packages/`, `sources/`)
|
||
each get a `.gitkeep` so git tracks them.
|
||
|
||
---
|
||
|
||
## Step 4 — .tasks/
|
||
|
||
**Delegate to the `setup-tasks` skill.** It handles greenfield creation, migration from flat STATUS.md, and the no-op case uniformly, with its own confirmation gate. Don't recreate the layout inline.
|
||
|
||
If `setup-tasks` is not installed, **stop** and tell the user — same rule as Step 3.
|
||
|
||
**Reference (for context only — `setup-tasks` is the source of truth):** the canonical layout is `.tasks/STATUS.md` (the board, with emoji status 🔴/🟡/⚪/🟢/🔵) plus `.tasks/<task-slug>.md` per active or paused task. The full pattern is documented in this repo at `.wiki/raw/setup-task-status-wiki.md`.
|
||
|
||
---
|
||
|
||
## Step 5 — CLAUDE.md
|
||
|
||
Two paths, picked by file presence:
|
||
|
||
### Init (file does not exist)
|
||
|
||
Create `CLAUDE.md` from `assets/CLAUDE.md.template`. Substitute the platform line
|
||
on non-Windows hosts (`we're on Linux` / `we're on macOS` instead of
|
||
`we're on Windows`).
|
||
|
||
### Upgrade (file exists) — idempotent merge
|
||
|
||
Treat the template as the canonical trigger set and reconcile the existing file
|
||
against it. Re-runs are no-ops once the file is in canon.
|
||
|
||
1. Read the existing `CLAUDE.md`.
|
||
2. For each non-empty, non-comment line in the template, decide whether it's
|
||
already present:
|
||
- **Trigger lines** (everything except the platform line) — present iff any
|
||
existing line, after `trim` + `tolower`, contains the template line's
|
||
trigger text. Substring match, not equality — tolerates user rewording or
|
||
trailing punctuation.
|
||
- **Platform line** (`we're on Windows`) — present iff any existing line
|
||
matches `we're on (windows|linux|macos)` case-insensitively. If the user
|
||
pinned a different platform on purpose, **leave it alone**. Only append
|
||
the host-appropriate platform line when none of the three is present.
|
||
3. Collect missing lines. If none → print `CLAUDE.md already canon — no changes`
|
||
and skip to Step 5.5.
|
||
4. Show the user the diff (N lines, exact text to append) and ask one question:
|
||
"Append these N missing canonical triggers to the end of CLAUDE.md?" Wait
|
||
for explicit confirmation before writing.
|
||
5. On confirm: append a single newline (if the file doesn't end with one) and
|
||
then the missing lines, one per line. Don't rewrite the file — only append.
|
||
Don't reorder existing lines. Don't dedupe within the existing file.
|
||
|
||
Template contents (`assets/CLAUDE.md.template` — source of truth):
|
||
|
||
```markdown
|
||
# CLAUDE.md
|
||
# Agent instructions. Each line is a trigger for an installed skill.
|
||
|
||
talk like a caveman
|
||
use superpowers
|
||
use project wiki
|
||
use task management system
|
||
check across all projects
|
||
we're on Windows
|
||
```
|
||
|
||
The `check across all projects` line activates the `using-projects-meta` skill
|
||
so cross-project task aggregation and the shared `projects-wiki` are available
|
||
without an explicit verbal trigger. The skill is a no-op until the
|
||
`projects-meta-mcp` server is registered — install via `setup-projects-meta`
|
||
on a fresh machine if `mcp__projects-meta__*` tools are missing.
|
||
|
||
The `we're on Windows` line activates the `active-platform` skill and pins the
|
||
project's default platform to Windows / PowerShell — so generated commands and
|
||
README quick-starts use PS-native syntax. Bootstrapping on a Linux or macOS
|
||
host? Substitute `we're on Linux` or `we're on macOS` instead.
|
||
|
||
---
|
||
|
||
## Step 5.5 — Bootstrap manifest
|
||
|
||
Write `.wiki/concepts/bootstrap-manifest.md`. The manifest records which skills (and at which versions) initialized this project's `.wiki/` and `.tasks/` layout, so layout drift between projects bootstrapped at different times is debuggable.
|
||
|
||
Read each delegated skill's `SKILL.md` frontmatter to pick up the live `version:` value (don't hardcode):
|
||
|
||
```markdown
|
||
---
|
||
title: Bootstrap Manifest
|
||
type: concept
|
||
updated: <today's date>
|
||
generator: project-bootstrap@<version>
|
||
---
|
||
|
||
# Bootstrap Manifest
|
||
|
||
Skills used to initialize this project's `.wiki/` and `.tasks/` layout, with their versions at install time.
|
||
|
||
| Skill | Version | Role |
|
||
|---|---|---|
|
||
| `project-bootstrap` | <version> | orchestrator |
|
||
| `setup-wiki` | <version> | wiki canonical layout |
|
||
| `setup-tasks` | <version> | tasks canonical layout |
|
||
|
||
This file is overwritten if `project-bootstrap` is re-run on the same project. For history, use `git log .wiki/concepts/bootstrap-manifest.md`.
|
||
```
|
||
|
||
If a delegated setup-skill is unavailable on this machine (e.g. user installed only a subset), record the missing skill as `unknown` in the version column so the gap is visible.
|
||
|
||
---
|
||
|
||
## Step 5.6 — Recommend `superpowers` plugin (chat-only, never auto-install)
|
||
|
||
The `CLAUDE.md` template just written contains `use superpowers` as a trigger.
|
||
That trigger is a no-op unless the official `superpowers` plugin is installed
|
||
on the host. On a fresh machine the plugin is often absent, and the user
|
||
won't know the trigger is silently dead. Detect and recommend.
|
||
|
||
Read `~/.claude/plugins/installed_plugins.json`. The path is identical on
|
||
Windows / Linux / macOS — `~` resolves correctly under git-bash too.
|
||
|
||
Look for the key `superpowers@claude-plugins-official` under `plugins`.
|
||
Two outcomes:
|
||
|
||
- **Installed** — say nothing. Skip to Step 6.
|
||
- **Missing** (key absent, or the JSON file itself doesn't exist) — print
|
||
this block in chat exactly once. Do **not** write it into any project file:
|
||
|
||
```
|
||
ℹ️ Recommended: install the official `superpowers` plugin
|
||
|
||
CLAUDE.md now contains `use superpowers`, but that trigger is a no-op
|
||
until the plugin is installed. With it, every session auto-loads
|
||
brainstorming, planning, code-review, debugging, and TDD skills.
|
||
|
||
Install (run inside Claude Code):
|
||
/plugin install superpowers@claude-plugins-official
|
||
|
||
Source: https://github.com/anthropics/claude-plugins-official
|
||
|
||
After install + Claude Code restart, the trigger picks it up.
|
||
```
|
||
|
||
**Hard rule — never auto-install.** Slash commands aren't callable from a
|
||
skill, and silently mutating user-level plugin state without consent is
|
||
overreach. The recommendation is informational. The user can install it
|
||
later, ignore it entirely, or remove the `use superpowers` line from
|
||
`CLAUDE.md` if they prefer a leaner setup.
|
||
|
||
If the JSON file is malformed (rare), treat as "missing" and print the
|
||
recommendation. Do not crash the bootstrap over a plugin-detection edge
|
||
case — the file isn't ours to fix here.
|
||
|
||
## Step 6 — Commit
|
||
|
||
```bash
|
||
git add .
|
||
git commit -m "chore: bootstrap project structure"
|
||
```
|
||
|
||
If the repo already had commits — commit only the files just created:
|
||
|
||
```bash
|
||
git add .wiki/ .tasks/ CLAUDE.md .gitignore README.md
|
||
git commit -m "chore: upgrade project structure"
|
||
```
|
||
|
||
---
|
||
|
||
## Step 7 — Summary
|
||
|
||
Print a final report:
|
||
|
||
```
|
||
✅ Done! Created:
|
||
.wiki/ — project wiki (Karpathy method)
|
||
.tasks/ — task tracking system
|
||
CLAUDE.md — skill triggers
|
||
.gitignore — standard template
|
||
README.md — starter file
|
||
|
||
Skipped (already existed):
|
||
git — left untouched
|
||
|
||
Next step: describe the project in README.md and start your first task —
|
||
say "use task management system".
|
||
```
|
||
|
||
---
|
||
|
||
## Rules
|
||
|
||
- **Never overwrite** existing files without explicit user confirmation
|
||
- **Always show the plan first** — one question, one confirmation
|
||
- **Never invent details** — if the project already exists, read what's there
|
||
- **Commit only what was just created** — do not touch the rest of the file tree
|
||
- **Commit automatically** after each successful step, no extra questions
|
||
- **Push only after explicit user confirmation** — ask "Push to remote?" and wait for "yes"
|