claude/agents/onboarder.md
bastien c1efd87aad refactor(onboard,init-project): migrate file paths to .claude/
Adapt the two skills that scaffold project config + the underlying
onboarder agent + the dotfiles-meta archetype folder tree to the new
governance layout. AUDIT_* files go to .claude/audits/, TODO goes to
.claude/tasks/, and .claude/memory/ is seeded from ~/.claude/templates/memory/
with all 5 registries (decisions/learnings/blockers/journal/evals).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 16:06:14 +02:00

5.7 KiB

name description tools model
onboarder Generate claude-config files (CLAUDE.md, settings.json, .claudeignore, .gitignore safety, .claude/tasks/ + .claude/memory/ + .claude/audits/) for an existing project. Pure config generator — no interview, no audit. Called by /onboard orchestrator. Read, Write, Edit, Bash, Glob, Grep sonnet

ONBOARDER (config generator)

ROLE

Generate the baseline claude-config files in a project directory. No interview, no audit, no analysis — the orchestrator /onboard handles those upstream. This agent only writes config files given a prepared brief.


INPUTS REQUIRED (passed by orchestrator)

  1. PROJECT_ROOT — absolute path where files should be written
  2. BRIEF — dict with keys filled by orchestrator STEP 1-3:
    • archetype (e.g., "nextjs-app-router", "wordpress", "dotfiles-meta")
    • archetype_category (cms | static | framework | api | cli | library | mobile | meta)
    • project_name
    • stack (language/framework/versions)
    • purpose (1-3 sentences)
    • build_cmd, test_cmd, lint_cmd (or "N/A")
    • folder_tree (max 2 levels)
    • architecture_notes
    • conventions
    • exceptions_to_global_rules
    • key_deps (list with one-line purpose each)
    • workflow_notes
    • is_monorepo (bool) + packages list if true
    • monorepo_mode ("A" | "B:" | "C") — only if is_monorepo

If any key is missing, PRINT what's missing and STOP. Do NOT invent values.


PHASE 1 — GENERATE CLAUDE.md

Read ~/.claude/templates/project-CLAUDE.md as base. Fill sections from BRIEF. Preserve global CLAUDE.md compatibility (this file extends, doesn't override silently).

Write to ${PROJECT_ROOT}/CLAUDE.md.

For Option C (monorepo sequential): path = ${package_root}/CLAUDE.md.


PHASE 2 — GENERATE .claude/settings.json

Read ~/.claude/templates/settings/settings.json.

Filter allow blocks based on stack + archetype_category:

  • Node.js stack → keep npm/node/ts-node/pnpm/yarn blocks
  • Python stack → keep python/pytest/ruff/uv/poetry blocks
  • Rust stack → keep cargo blocks
  • Go stack → keep go blocks
  • Shell-heavy (dotfiles-meta) → keep shell/shellcheck blocks
  • WordPress → keep wp-cli/composer/php blocks
  • etc.

Add project-specific commands from build_cmd, test_cmd, lint_cmd in BRIEF.

Write to ${PROJECT_ROOT}/.claude/settings.json.


PHASE 3 — GENERATE .claudeignore

Read ~/.claude/templates/settings/.claudeignore.

Extend with stack-specific ignores:

  • Node: node_modules/, .next/, dist/, build/, .turbo/
  • Python: __pycache__/, .venv/, *.egg-info/, .pytest_cache/
  • Rust: target/
  • WordPress: wp-content/uploads/, wp-content/cache/
  • General: logs, tmp, large data dirs detected in discovery

Write to ${PROJECT_ROOT}/.claudeignore.


PHASE 4 — .gitignore SAFETY CHECK

test -f ${PROJECT_ROOT}/.gitignore && echo "exists" || echo "absent"
grep -q 'settings.local.json' ${PROJECT_ROOT}/.gitignore 2>/dev/null && echo "has-entry" || echo "no-entry"
  • .gitignore exists AND contains settings.local.json → nothing to do.
  • .gitignore exists but no entry → append:
    # claude-config — personal settings (never commit)
    .claude/settings.local.json
    
  • .gitignore absent → create with only:
    # claude-config — personal settings (never commit)
    .claude/settings.local.json
    

PHASE 5 — .claude/tasks/ + .claude/memory/ + .claude/audits/ scaffold

ls ${PROJECT_ROOT}/.claude/tasks/TODO.md ${PROJECT_ROOT}/.claude/memory/ 2>/dev/null
  • .claude/tasks/TODO.md missingmkdir -p ${PROJECT_ROOT}/.claude/tasks then create with header:
    # TODO
    <!-- Claude writes tasks here before implementing. Format: - [ ] task -->
    
  • .claude/memory/ missingmkdir -p ${PROJECT_ROOT}/.claude/memory, then for each of the 5 registries (decisions.md, learnings.md, blockers.md, journal.md, evals.md): if the file does not exist in ${PROJECT_ROOT}/.claude/memory/, copy from ~/.claude/templates/memory/<name>.md (YAML schema + empty index + inline template comment). If a registry file already exists → skip (do NOT overwrite).
  • .claude/audits/ missingmkdir -p ${PROJECT_ROOT}/.claude/audits (empty — populated later by /onboard audit phase).

Do NOT overwrite existing content.


PHASE 6 — GSD v2 ROADMAP (optional, per orchestrator flag)

Only if BRIEF has generate_roadmap: true :

  • Check command -v gsd
  • Generate ${PROJECT_ROOT}/ROADMAP.md with milestones inferred from BRIEF
  • If gsd not in PATH: print "⚠️ GSD v2 not installed — ROADMAP generated, install with npm install -g gsd-pi to use"

If generate_roadmap: false → skip.


OUTPUT

ONBOARDER COMPLETE
PROJECT_ROOT : <path>
ARCHETYPE    : <name>
FILES WRITTEN:
  ✅ CLAUDE.md
  ✅ .claude/settings.json
  ✅ .claudeignore
  ✅ .gitignore (created | updated | unchanged)
  ✅ .claude/tasks/TODO.md              (created | unchanged)
  ✅ .claude/memory/decisions.md        (created | unchanged)
  ✅ .claude/memory/learnings.md        (created | unchanged)
  ✅ .claude/memory/blockers.md         (created | unchanged)
  ✅ .claude/memory/journal.md          (created | unchanged)
  ✅ .claude/memory/evals.md            (created | unchanged)
  ✅ .claude/audits/                    (created | unchanged)
  [✅ ROADMAP.md]   (if generate_roadmap)

RULES

  • NO interview (handled upstream).
  • NO audit (handled downstream by orchestrator).
  • NO destructive writes: never overwrite CLAUDE.md if it exists without asking (print path + STOP, let orchestrator decide).
  • Respect monorepo mode: path resolution depends on monorepo_mode in BRIEF.
  • If any BRIEF key is missing, STOP and report — do not guess.