rimlike/CLAUDE.md

50 lines
6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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.

# Project: rimlike
A 2D, tile-based **cute-farming-RPG-meets-colony-sim** for mobile / handheld. Rimworld DNA, Going Medieval × Stardew lodestars. Touch-first UI, sandbox + light storyteller, Rimworld-fidelity depth (5-priority work matrix, 16-chip stockpiles, mood + soft breaks, lighting, room beauty, Quality, dirtiness, production chains, combat, burial). Built on Godot 4 with the ElvGames "Ultimate Farming RPG" Humble bundle as primary art and Ventilatore Fantasy Tileset as medieval accent.
Working title `rimlike` — rename TBD.
## Working agreement
- This is a git repo with `origin` on Forgejo at `https://git.rdx4.com/megaproxy/rimlike.git` (private). HTTPS auth uses the token in `~/.git-credentials` — pushes are non-interactive.
- Commit after each logical change with a one-line imperative message; `git push` after each commit (or at minimum before ending the session).
- Read `memory.md` at session start. Update it before ending the session.
- Read the relevant `docs/` companion (design / architecture / ui / art) for any task in that area — `memory.md` is the index, the companions are the depth.
- Never commit secrets — see `.gitignore` and the rules in `~/claude/CLAUDE.md`.
## Project-specific notes
- **Engine:** Godot 4 (GDScript). 2D-first. Mobile and Steam-Deck export targets; iOS export needs Mac/Xcode, Android from Linux is fine.
- **Tile size:** 16×16 pixel art (locked).
- **Art:** ElvGames "Ultimate Farming RPG" Humble bundle is the primary visual layer; local path `/mnt/d/godot/assets/humble set new/`. Ventilatore Fantasy Tileset Bundle is owned and used as medieval accent. License attribution is required — maintain a credits string for every pack used (see `docs/art.md`).
- **Tick rate:** sim 20 Hz, render 60 Hz decoupled. Default speed Fast (5×) — 1 in-game day ≈ 5 min real time. Auto-pause on threats / pawn-down / dialog events.
- **Save format:** Mid-tick suspend safe; we save **between** sim ticks. JobRunner state must round-trip from day one.
- **i18n from day one:** all player-visible strings live in a string table; English-only ship plan but no hardcoded copy in code.
- **Conventions:** GDScript with Godot's standard idioms. Class-per-file. Snake_case for files and variables. Tilesets imported from the bundle's `Tilesets/*.png` directly (skip the .unitypackage / .yymps / RPG Maker variants).
- **Open scope:** the `Vertical slice` in `memory.md` is the MVP target — realistic timeline 36 months solo. Do not silently expand scope; fork choices live in `memory.md` Open questions.
### MCP Pro integration
AI assistant tools come from **Godot MCP Pro** (172 tools, paid, proprietary). Two pieces:
- **Server** at `D:\godot\mcp\server\` (= `/mnt/d/godot/mcp/server/` from WSL) — Node.js, shared across all Godot projects on this machine, **not** part of this repo.
- **Editor plugin** at `addons/godot_mcp/` — copied from the paid zip, **gitignored** (proprietary license, not redistributed). Re-copy on a fresh clone (once the Godot project is scaffolded): `cp -r /mnt/d/godot/mcp/addons/godot_mcp ./addons/`, then in Godot: Project → Project Settings → Plugins → Godot MCP Pro → Enable.
- `.mcp.json` here wires Claude Code → server. `.claude/settings.local.json` is the pre-built read-only-tool allowlist from the zip (committed).
- The Godot editor must be running with the plugin enabled before Claude can use MCP tools — look for the green dot in the "MCP Pro" bottom panel.
- **Editor vs runtime tools**: editor tools always work; runtime tools (`get_game_*`, `simulate_*`, `assert_*`, etc.) need `play_scene` first. Full split in `addons/godot_mcp/skills.*.md` or `D:\godot\mcp\instructions\CLAUDE.md`.
- Don't set `GODOT_MCP_PORT` in `.mcp.json` — server auto-scans 65056509; fixed port causes silent failures with stale Node processes. If "Editor not connected" persists, kill any leftover `node.exe` in Task Manager.
### Delegation: tiered subagents (cost/speed)
The main conversation runs on Opus. Three project-local subagents in `.claude/agents/` exist to offload work to cheaper, faster models. **Default to delegation** for any well-defined task that fits an agent's description — including small mechanical edits. Don't skip delegation just because the edit is tiny; the user wants the tiered system visibly firing on its natural workload.
- **`quick-edit`** (Haiku) — mechanical edits to `.gd` files: typos, renames, removing `print()`s, removing unused imports, single-line fixes. **Default for any rename or search-and-replace.** Tools restricted to file-edit + grep.
- **`researcher`** (Haiku) — read-only codebase exploration: "where is X defined", "what connects to signal Y", "which scenes reference resource Z". Returns a digested summary, not raw grep output. **Default for any exploration or audit question** before designing a feature.
- **`gdscript-refactor`** (Sonnet) — medium-scope GDScript work that needs reasoning but no architecture decisions: extract a method, thread a parameter through several call sites, add a save/load seam, write a small new autoload.
**Keep on Opus only when:**
- the file/files are already loaded in your context from an earlier turn in this conversation (Haiku would re-read from scratch, blowing the savings), OR
- the task needs MCP Pro editor tools (scenes, runtime, `play_scene`, `execute_game_script`), OR
- the user is iterating tightly with you and a subagent would break the loop, OR
- the work is genuinely architectural / ambiguous and needs your judgement.
When in doubt, delegate — overhead on a wasted dispatch is cheap; missed savings on Opus-doing-Haiku-work compound across the session.
**Report delegation in the final summary.** When you finish a task, briefly say which subagents you used and what for — e.g. *"Used `researcher` (Haiku) to locate the JobRunner call sites; did the refactor on Opus."* If you handled everything yourself, say *"No delegation — handled on Opus."* One short line at the end of the response is enough; the user wants to see whether the tiered-model system is actually firing.