Files
claude-skills/skills/project-bootstrap/SKILL.md
vitya 68fe9a8c1c feat(project-bootstrap): v1.3.0 — idempotent CLAUDE.md merge on upgrade
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>
2026-04-30 15:06:06 +03:00

400 lines
13 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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"