with one click
repo-init
// Initialize a new repository with standard scaffolding - git, gitignore, AGENTS.md, justfile, mise, beads, and timbers. Use when starting a new project or setting up an existing repo for Claude Code workflows.
// Initialize a new repository with standard scaffolding - git, gitignore, AGENTS.md, justfile, mise, beads, and timbers. Use when starting a new project or setting up an existing repo for Claude Code workflows.
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | repo-init |
| description | Initialize a new repository with standard scaffolding - git, gitignore, AGENTS.md, justfile, mise, beads, and timbers. Use when starting a new project or setting up an existing repo for Claude Code workflows. |
Scaffold a new or existing repository with standard project infrastructure.
Related skills:
timbers init) - Development reasoning ledgerThis skill supports two modes. Prefer molecule mode when beads is available.
Use beads molecules for tracked, closeable tasks. Each step becomes an issue you can close as you complete it.
Prerequisites: beads installed (bd --version works)
Steps:
Find the dm-work plugin install path:
jq -r '.plugins["dm-work@dark-matter-marketplace"][0].installPath' ~/.claude/plugins/installed_plugins.json
Wisp the formula (ephemeral, no git pollution):
bd mol wisp <install-path>/skills/repo-init/references/repo-init.formula.json \
--var lang=<language> --var name=<project-name> --var type=<project-type>
Work through tasks:
bd ready # See next task
# ... do the work ...
bd close <step-id> # Mark complete
Clean up when done:
bd mol burn <wisp-id>
Variables:
| Variable | Required | Default | Values |
|---|---|---|---|
lang | Yes | - | go, rust, typescript, python |
name | Yes | - | Project name |
type | No | cli | cli, lib, web, api |
Use when beads is not installed or for quick setups without tracking.
Follow the steps below in order. Steps 3-6 can run in parallel after git-init.
Before scaffolding, clarify:
Use AskUserQuestion if unclear from context.
# Initialize git if needed
git init
Copy from the appropriate language skill's references/gitignore:
| Language | Source |
|---|---|
| Go | go-pro/references/gitignore |
| Rust | rust-pro/references/gitignore |
| TypeScript | typescript-pro/references/gitignore |
| Python | python-pro/references/gitignore |
For multi-language repos: Start with the primary language's gitignore, then merge patterns from others.
Minimal fallback (if language skill unavailable):
# Environment
.env
.env.local
.env.*.local
.envrc
# OS
.DS_Store
Thumbs.db
# IDE
.idea/
.vscode/
# Build (customize per language)
dist/
build/
target/
node_modules/
__pycache__/
Every repo should have a .claudeignore file. Claude Code indexes everything it can see ā without ignore patterns, it reads build artifacts, generated files, and large binaries, wasting massive token budget. This is the single highest-impact CC optimization.
Universal base (all projects):
# Secrets ā never leak into CC context
.env
.env.*
.envrc
secrets/
*.pem
*.key
*.p12
# Lock files (large, no signal)
pnpm-lock.yaml
package-lock.json
yarn.lock
bun.lockb
Cargo.lock
go.sum
Gemfile.lock
poetry.lock
# Source maps
*.map
# Binary assets (images, fonts)
*.png
*.jpg
*.jpeg
*.gif
*.ico
*.svg
*.woff
*.woff2
*.ttf
*.eot
# Logs and OS
*.log
logs/
.DS_Store
# Agent working dirs
.worktrees/
history/
Add language-specific patterns:
| Language | Patterns |
|---|---|
| TypeScript/Node | node_modules/, dist/, build/, .next/, coverage/, *.tsbuildinfo, .turbo/, .cache/ |
| Python | __pycache__/, .venv/, venv/, *.pyc, .mypy_cache/, .pytest_cache/, dist/, build/, *.egg-info/ |
| Go | vendor/, bin/ |
| Rust | target/ |
| AI/ML | output/, models/, *.safetensors, *.ckpt, *.pt, *.bin, checkpoints/ |
For multi-language repos: Combine all relevant language patterns.
Copy the AGENTS.md template from this skill's references/AGENTS.md to the project root, then create a symlink so Claude Code discovers it automatically:
cp "${CLAUDE_PLUGIN_ROOT}/skills/repo-init/references/AGENTS.md" ./AGENTS.md
ln -s AGENTS.md CLAUDE.md
AGENTS.md is the canonical file; CLAUDE.md is a symlink so Claude Code discovers it automatically. Verify after creation: readlink CLAUDE.md should print AGENTS.md, and test -e CLAUDE.md should succeed (catches dangling symlinks).
Customize the template for the specific project (update project description, add project-specific conventions).
Symlink fallback (Windows or FS without symlink support): if ln -s fails or symlinks aren't usable, use the stub pattern instead ā keep AGENTS.md canonical and make CLAUDE.md a one-line stub:
echo "See @AGENTS.md" > CLAUDE.md
Claude Code's @path import resolves the reference at session start. Higher maintenance than a symlink (two real files) but works everywhere.
Create CLAUDE.local.md for personal preferences that shouldn't be committed (it's auto-added to .gitignore):
cat > CLAUDE.local.md << 'EOF'
# Personal Project Preferences
# This file is gitignored ā safe for local paths, sandbox URLs, etc.
# For worktrees: import shared personal prefs so all worktrees stay in sync
# @~/.claude/my-project-instructions.md
EOF
Use this for sandbox URLs, test data paths, local tool overrides, and other per-developer settings.
For monorepos or projects with distinct subsystems, use .claude/rules/ instead of a single large CLAUDE.md:
.claude/
āāā CLAUDE.md # Core project instructions
āāā rules/
āāā go-backend.md # Go-specific rules
āāā ts-frontend.md # TypeScript-specific rules
āāā api-design.md # API conventions
All .md files in .claude/rules/ are auto-loaded. Rules can be path-scoped via YAML frontmatter to only activate when Claude touches matching files:
---
paths:
- "packages/api/**/*.go"
---
# API Backend Rules
- All handlers return structured errors
- Use slog for logging, never fmt.Print
Skip this for single-language repos ā a single CLAUDE.md is simpler.
# Project Build System
# Usage: just --list
default:
@just --list
# First-time setup
setup:
mise trust
mise install
@echo "Ready. Run 'just check' to verify."
# Quality gates - add language-specific checks
check:
@echo "Add fmt, lint, test recipes"
# Remove build artifacts
clean:
@echo "Add clean commands"
See just-pro skill for language-specific recipes.
Create .mise.toml:
[tools]
# Add tools with: mise use <tool>@<version>
# Examples:
# node = "22"
# go = "1.23"
# rust = "1.83"
# just = "latest"
CLI output compression reduces build/test/git noise before it reaches LLM context. See output-compression skill for full details.
# Option 1: RTK (zero-config baseline ā recommended)
command -v rtk &>/dev/null && rtk init --global || echo "Install: brew install rtk"
# Option 2: tokf (per-project customization ā add when RTK isn't enough)
command -v tokf &>/dev/null && tokf hook install || echo "Install: brew install mpecan/tokf/tokf"
Either or both tools can be active. RTK handles most CLI noise automatically. Add tokf with project-local .tokf/filters/ when you need surgical filtering for specific commands.
Create .envrc.example (committed) as template for .envrc (gitignored):
# Copy to .envrc and fill in values
# cp .envrc.example .envrc && direnv allow
# Mise integration
if command -v mise &> /dev/null; then
eval "$(mise hook-env -s bash)"
fi
# Project-specific environment
# export DATABASE_URL="postgres://localhost/myapp"
# export API_KEY=""
Create .claude/settings.local.json to wire DM orchestration, hooks, and session management for this project:
mkdir -p .claude
Write to .claude/settings.local.json:
{
"hooks": {
"SessionStart": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "if command -v timbers &>/dev/null && [ -d .timbers ]; then timbers prime; fi",
"timeout": 10
}
]
}
],
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "if command -v timbers &>/dev/null && [ -d .timbers ]; then timbers hook run claude-stop; fi",
"timeout": 30
}
]
}
]
}
}
This wires session-start context recovery and session-end enforcement. The DM plugin skills (orchestrator, subagent, language skills) are available globally from the plugin install ā this file adds project-specific hooks.
Customize per-project: Add project-specific SessionStart commands (e.g., bd prime if beads is initialized), adjust Stop hook timeout for heavy gate suites.
bd init # embedded Dolt is the default and works on macOS in 1.0+
bd init does several things automatically in beads 1.0+:
.beads/embeddeddolt/ (data, gitignored) and .beads/hooks/ (committed shims)core.hooksPath = .beads/hooks (relative)bd setup claude integration (CLAUDE.md beads section + .claude/settings.json)export.auto = true and export.git-add = true ā every bd mutation auto-exports .beads/issues.jsonl and stages it (60s throttle; pre-commit hook forces a flush)After bd init, install timbers hooks (they detect core.hooksPath and append into .beads/hooks/pre-commit "alongside beads hook"):
timbers hooks install
Quality gates and any other custom hook content go OUTSIDE the --- BEGIN/END BEADS INTEGRATION --- and --- BEGIN/END TIMBERS --- markers ā bd hooks install --force and timbers hooks install both preserve user content outside their managed sections.
Hook structure (.beads/hooks/pre-commit):
# --- BEGIN BEADS INTEGRATION v1.0.x --- (managed by bd hooks install)
# --- END BEADS INTEGRATION v1.0.x ---
# Quality gates (lint-staged, just check, etc.) ā preserved across reinstalls
# --- timbers section (managed by timbers hooks install)
# --- end timbers section ---
Add a just hooks recipe for onboarding that re-runs bd hooks install --force --beads (idempotent ā preserves user content). Verify with bd hooks list (shows shim version per hook) and git config core.hooksPath (should be .beads/hooks).
Note on core.hooksPath: bd hooks install --force may set this to an absolute path on first install. Fix to relative manually if needed: git config core.hooksPath .beads/hooks ā relative is required for worktrees, which share repo config.
If the user wants structured development reasoning logs (what/why/how per commit):
# Check if installed
command -v timbers || echo "Install: brew install gorewood/tap/timbers"
# Initialize (creates .timbers/, .gitattributes, git hooks, Claude Code integration)
timbers init --yes --git-hooks
# Add onboarding snippet to AGENTS.md
timbers onboard --target agents >> AGENTS.md
This sets up:
.timbers/ directory for entry storageTimbers captures the reasoning behind commits ā the "why" that git log can't tell you. Entries are files in .timbers/ that sync via regular git push.
Optional: Create .timbersignore at repo root to extend the default skip rules (lockfiles, reverts are already skipped by default in v0.19+). Use gitignore-style patterns for files that should never require a timbers entry:
# Generated files that don't need reasoning documented
*.generated.ts
db/migrations/*.sql
Skip timbers entirely if the project is trivial or short-lived.
Point user to language-specific setup:
| Language | Next Step |
|---|---|
| Go | Invoke go-pro skill, run go mod init |
| Rust | Invoke rust-pro skill, run cargo init |
| TypeScript | Invoke typescript-pro skill, run npm init |
| Python | Invoke python-pro skill, run uv init |
# Full manual init sequence
git init
# Create .gitignore, .claudeignore, AGENTS.md, CLAUDE.md symlink, justfile, .mise.toml, .envrc.example
bd init # embedded Dolt is the default (1.0+)
timbers init --yes --git-hooks # appends into .beads/hooks/ alongside beads
timbers onboard --target agents >> AGENTS.md
mise use just@latest
# Then follow language skill for specifics
For monorepos, the root gets:
justfile with module imports (see just-pro monorepo patterns).mise.toml with shared tooling.claudeignore combining patterns for all languages in the monorepo.beads/ at rootEach package gets:
justfile