init-project · git:20260927.7653d70 · 2026-09-27 · sha256 c276c53c1fa90998

init-project git:20260927.7653d70A

Immutable. This exact content never changes and is served at /api/v1/blob/c276c53c1fa90998.

---
name: init-project
description: >
  Initializes a Spring Boot project from scratch with a selectable architecture. Manual
  ritual — interview, validate the blueprint, generate the structure, install the hooks
  and verify the build. Explicit invocation only.
argument-hint: "[--blueprint <id>] [--build maven|gradle] [--groupId <groupId>] [--name <artifactId>] [--bounded-context <name>]"
disable-model-invocation: true
allowed-tools: Agent, Read, Write, Bash, Glob, AskUserQuestion
---

## Available blueprints

!`find "${CLAUDE_PROJECT_DIR:-.}/.claude/blueprints" -mindepth 2 -maxdepth 2 -name '*.yaml' 2>/dev/null | xargs -n1 basename | sed 's/\.yaml$//'`

## Directory state

!`ls -a "${CLAUDE_PROJECT_DIR:-.}" | head -30`

## Arguments

$ARGUMENTS

---

## Procedure

1. If the directory already contains `pom.xml` or `build.gradle`, **do not initialize**:
   report what you found and suggest `/new-feature` instead. Stop here.
2. Delegate to the `project-initializer` agent, passing the arguments above. The agent
   exists for two of the three legitimate reasons: generation produces verbose output that
   shouldn't fill this conversation, and it runs with a restricted set of tools.
3. Return the agent's report without rewriting it — the format is fixed in the
   § Output contract of `.claude/skills/project-bootstrap/SKILL.md`.
4. Chain `git-publish` once the report says the project was created, and only then.

## Why this is a manually-invoked skill

Form 2: creating a project is a ritual a person starts (axis 2 — `/init-project`), and the
interview it leads to cannot be triggered by inference from a sentence. Form 1 was rejected
for exactly that: a skill that can scaffold a whole tree on the model's own judgment is a
directory rewritten by accident. Form 3 was rejected here and used one level down instead —
the isolation belongs to the generation, which is why `project-initializer` exists.

## Contract

**Class:** orchestrator — the territory is `skill_classes.orchestrator`'s override for this
skill in `@.claude/schemas/extensions.json`, and it is **empty**: this skill writes no file
itself. Everything is written by `project-initializer`, which the guard bypasses as an
executor agent, and by `project-bootstrap` under it. `ArchHook.java guard` enforces it.

**Reads** the blueprint listing and the directory state injected above, and the arguments.

**Delegates** to `project-initializer` — never generates a file inline, not even a single
`pom.xml`. A partial generation from this thread is the failure mode the agent exists to
prevent: the report would describe a tree nobody wrote in full.