From enu
Plans multi-unit Enu builds before placing voxels. Use for multi-room buildings, multi-structure layouts, or any build with more than ~3 units.
How this skill is triggered — by the user, by Claude, or both
Slash command
/enu:build-planThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Multi-room buildings, multi-structure layouts, and any build with more than
Multi-room buildings, multi-structure layouts, and any build with more than ~3 units don't survive piece-by-piece freestyling. Layout a plan first, then execute against it.
Why this is
/build-planand not/plan: Claude Code has a built-in/plancommand that activates plan mode; a skill namedplanis shadowed by it. Use/build-planto invoke this skill.
/build-plan <description>
A markdown plan file at <level_dir>/plan.md (or appended to it). Each plan
section is self-contained: someone reading just that section should be able
to act on it without scrolling.
# <Project Name>
## Goal
One paragraph. What the user asked for, in concrete terms.
## Layout
Coordinate system reminder + a text sketch.
\`\`\`
-Z (north)
↑
|
-X ←──┼──→ +X
|
↓
+Z (south)
\`\`\`
**Stay on the ground.** The ground is a 1000×1000 plane centred on the
origin: solid floor from x/z = -500 to +500, surface at y = 0. Keep every
build's *full footprint* (not just its origin) inside ±500 with a margin —
a build whose extent crosses -500 hangs half-off into the void. Place
origins at **y = 0** so the lowest voxel rests on the ground (y = 1 floats
the build 1 m up).
**Keep the spawn clear.** The player spawns at (0, 0, 0); leave at least
5 m of open ground in every direction around it.
Top-down ASCII for the major structures, with coordinates marked. Use a
grid scale that fits (e.g. 1 char = 5 voxels):
\`\`\`
z=-20 ─────────────────────────
│ N wall │
z=-30 │ [castle ]│ walls 49 wide
z=-65 │ S wall (gate) │
└─────────────────┘
z=-100 [castle_main keep]
\`\`\`
## Inventory
What gets built, with sizes and positions:
| Unit | Position (origin) | Footprint (m) | Notes |
|------|-------------------|---------------|-------|
| `build_castle_outer_wall` | (0, 0, -20) → (0, 0, -65) | 49 × 6 × 45 | uses Wall proto |
| `build_keep` | (-12, 0, -120) | 24 × 25 × 20 | main building |
| `BedQueen` instance #1 | (4, 0, -116) | 2 × 0.5 × 3 (after scale 0.25) | master bedroom |
| ... |
**Always include the world-space footprint** (extent in metres) for scaled
prototype instances — see the *Scale math* section below.
## Dependencies
Things that must exist before others, in order:
1. Outer walls (perimeter + corners)
2. Floor/courtyard
3. Inner buildings (keep, towers)
4. Furniture protos (must be defined before any `.new` call references them)
5. Decorations (torches, banners, signs)
## Clearance & Walkability
> **The 1 m rule:** every furniture piece needs ≥ 1 m of clear space from
> walls and other objects, *except* the wall a headboard / counter / back of
> sofa naturally rests against. A queen bed wedged into a 3 m room with the
> headboard and footboard both touching walls reads as "wrong" — it doesn't
> matter that the dimensions are technically realistic.
> **Doors are choke points.** Walking-through clearance is non-negotiable:
> – 2 voxels wide × 3 tall is the minimum interior door
> – Hallways should be ≥ 2 voxels deep (1-deep hallways feel claustrophobic)
> – Nothing inside the room should be within 2 voxels of a doorway in the
> axis perpendicular to the wall (otherwise you walk into a chair / counter
> / table immediately on entry)
Before declaring done, **mentally walk through every door from both sides**
and confirm there's no piece of furniture in the entry path. This catches
more bugs than screenshots do.
## Verification Plan
How will I know each phase worked?
- After perimeter: `find_voxel_overlaps` clean for the walls
- After floor: top-down screenshot shows enclosed shape
- After buildings: `for u in units_in_box(-25,0,-65, 25,30,-20): echo u.id` shows expected list
- **Walk-through pass**: have the human (or `screenshot_from_player`) walk
through every door — confirm passable, no clipping, furniture readable
from inside
## Open Questions
Anything I'm unsure of — confirm with the human before acting:
- Should the keep have multiple floors? Default yes.
- East/West sides — does the gate face N or S? Assuming N.
- ...
box_is_free (or units_overlapping for the list)
to verify nothing already occupies the target space.Plan sections should be executable verbatim — explicit coordinates and
complete scripts — so they can be handed to parallel subagents, each
passing its own agent_id for its own bot. Prefer Sonnet for
well-specified build sections and Opus for sections needing design
judgment or debugging; keep verification (bounds checks, screenshots,
walk-throughs) with the orchestrator.
1 m³ voxels read as Tetris blocks, not objects. A "chair" made from a single cube is a cube; three cubes in a row is not a couch. Only things that really are boxy at human scale read at 1:1:
Everything else needs a scaled prototype — a separate build prototype
defined at higher internal voxel resolution with scale = 0.25 or similar,
then instantiated via .new(...). See /build-script for the prototype
mechanism.
Examples (not an exhaustive catalog — design new protos as your build needs them):
BedQueen, BedTwin — frame, mattress, headboard, pillows, blanketSofa — base, cushions, back, armsDiningTable — tabletop slab + 4 corner legsDiningChair — seat + 4 legs + backrestToilet, Bathtub — bathroom fixturesIf the build the human asks for needs a CoffeeTable, Lamp, Bookshelf,
Workbench, etc., create new protos for them — don't try to render them
as 1:1 voxel cubes.
Each prototype draws voxels in its own local coords. With scale = 0.25:
box(width = 8, height = 1, depth = 12, …) covers 8 voxels wide
along the proto's +X and 12 voxels deep along its -Z.voxel_count × scale:
8 × 0.25 = 2 m wide, 12 × 0.25 = 3 m deep.position = vec3(X, Y, Z) occupies
(X..X+2, Y..Y+0.5, Z..Z+3). By default the proto's local
(0, 0, 0) is the NW-bottom corner — not the centre — of the
displayed object. A proto with an anchor: block reports its
declared pivot point at position instead; use the anchor pose to
reason about footprints in that case.To place a queen bed against the north wall of a 5 m × 5 m bedroom (world
x = 3..8, z = −116..−111):
z = -116 (north wall) means position.z = -116x = 4
(bed extends 4..6, leaves 1 m clearance on east, 1 m on west)BedQueen.new(position = vec3(4, 0, -116))Check clearance before placing with the bounds queries:
box_is_free(DiningChair.bounds_at(vec3(4, 0, -103), rotation = 90))
predicts the world AABB of a hypothetical instance; unit.bounds,
a.overlaps(b), and units_overlapping(box) cover already-placed
units. Still list each instance's footprint in the Inventory table —
the plan should be checkable on paper — and verify by walk-through
after building.
Rotation is a built-in .new(...) parameter and a mutable instance
field — pass rotation = 90 to spawn rotated, or assign
inst.rotation = 90 after. For a proto that needs to rotate cleanly
in place (chairs around a table, etc.) declare an anchor: block in
the proto so position places the pivot and rotation spins around
it without half-extent offset arithmetic in the call site. See
/build-script.
Real-life dimensions feel cramped through a flat-screen camera. For interiors that read as "a normal room" when you walk into them, scale 1.5–2× larger than reality:
If plan.md exists, append a new section (## <Date> — <change>) rather
than rewriting. The plan is a history of decisions, not a final document.
npx claudepluginhub getenu/enu --plugin enuCreates voxel structures via Nim build scripts using box/sphere/cylinder/wall/floor primitives and turtle commands. Use for building static structures or furniture in Enu.
Plan furniture placement, traffic flow, and functional zones for any interior room or open-plan space using scaled floor plans and clearance standards.
Generates a unified modular environment kit (walls, floors, doors, pillars, arches) using a style-anchor pattern so all pieces share visual consistency. Useful when building level tilesets.