| Repo | Cloned to | Purpose |
|---|---|---|
joeycastilloUS/joeycastillo.us web |
Cloudflare Pages | Website. Serves install scripts, Li, Na, product page, architecture, history at joeycastillo.us/metal/ |
joeycastilloUS/metal |
C:\metal or ~/metal |
Everything: launcher, tilde commands, settings, Fe, artifacts |
gh auth login before cloning.
joeycastillo.us/metal/C:\metal or ~/metalIron (Go.Fe) installs these tools. Idempotent — skips what's already there.
| Category | Tools | Installer |
|---|---|---|
| Core | Git, GCC (MinGW-w64), Make | winget / brew / apt / dnf / pacman |
| Languages | Python 3.12, Node.js LTS, Rust (rustup) | winget / brew / apt / dnf / pacman |
| Cloud + CLI | GitHub CLI (gh), Google Cloud CLI (gcloud) | winget / brew / apt / dnf / pacman |
| npm | Claude Code, Wrangler (Cloudflare), Snowflake CLI | npm / pip |
| Browsers | Chrome, Firefox, Brave, Opera | winget / brew cask (Mac only) |
Every tool Claude Code can use, whitelisted. Zero approval prompts.
| Category | Tools |
|---|---|
| Shell | Bash(*) — all shell commands |
| File ops | Read, Write, Edit, Glob, Grep |
| Web | WebFetch, WebSearch |
| Agents | Agent, Skill |
| Tasks | TaskCreate, TaskUpdate, TaskGet, TaskList, TaskStop, TaskOutput |
| Workspace | EnterWorktree, ExitWorktree, EnterPlanMode, ExitPlanMode, NotebookEdit |
| Scheduling | CronCreate, CronDelete, CronList, RemoteTrigger |
| Interactive | AskUserQuestion |
| MCP | mcp__* — all MCP server tools (Slack, etc.) |
The tilde-command system. Defined in CLAUDE.md (kernel, ~14k chars) with full specs lazy-loaded from be/docs/commands.md and be/docs/conventions.md.
| Command | Name | What it does |
|---|---|---|
~N | New | Create a new project — repo, be/ scaffold, CLAUDE.md |
~LI | List | List all projects — local, remote, open transfers |
~L | Load | Load a repo — clone, sync, switch context |
~UL | Unload | Close out a project — housekeep, report, switch back |
~I | Inspect | Read a repo, URL, or codebase — report what's there |
~P | Plan | Plan it, render it, save it |
~PU | User Story | Plan as a user story with acceptance criteria |
~PT | Plan Test | Plan the test strategy |
~E | Estimate | Break a plan into sized kanban boards |
~A | Add | Add something new — review, report, commit, demo |
~U | Update | Update existing code or feature |
~D | Delete | Remove code, feature, or files |
~F | Fix | Fix a bug — diagnose, fix, write a test, ship proof |
~B | Build | Build it — or pull next from the board |
~BT | Build Test | Build the tests for a feature |
~T | Test | Test it, fix what's broken |
~S | Ship | Commit, push, version bump, deploy |
~Monitor | Monitor | Watch the deploy — verify it's live and healthy |
~Demo | Demo | Demo, review, or refactor code |
~R | Retro | Retrospect recent work — what went well, what didn't |
~M | MCP | Manage MCP servers — add, remove, diagnose, setup |
~CR | Recover | Crash recovery — read the dirt, resume the chain |
~Transfer | Transfer | Project handoff — scan, clean, manifest for recipient |
~H | Help | Three-column workflow guide with use cases |
~JC | Joey's Take | 40 years of architecture advice, on demand |
~H) produces an HTML report. Chain reaction: do the work → review → render report → update index → commit → push → launch demo.
Named workflow macros with loop segments. Define a chain once, run it forever.
Every tilde command that produces an artifact must pass all 7 items before the command is considered complete. If any item fails, the command is not Done. Fix in-place and re-verify.
Before the first edit of a session, verify:
CLAUDE.md was 45k characters — too large. Split into a lean kernel (~14k) with full specs lazy-loaded from be/docs/.
| File | What it does |
|---|---|
install.bat |
Windows first-time setup. Downloaded to %TEMP% and run.Shows 6 steps → [Y] yes / [S] skip [1/6] Install Git (winget) [2/6] Install GitHub CLI (winget) [3/6] gh auth login (browser OAuth)[4/6] gh repo clone metal → C:\metal[5/6] call "C:\metal\Go.Fe.bat" — Iron (dev tools + auth)[5b/6] call "C:\metal\Go.Sign.bat" — per-laptop GPG + signing setup[5c/6] git ls-remote origin in C:\metal — push-auth smoke[6/6] call "C:\metal\go.bat" — launches Claude Code (Be) |
install.sh |
Mac/Linux first-time setup. Piped to bash. Same 6 + 2 steps as install.bat but uses xcode-select/brew/apt/dnf/pacman. gh auth login < /dev/tty for stdin.[5b/6] bash $METAL_DIR/Go.Sign.sh — per-laptop GPG + signing[5c/6] git ls-remote origin in $METAL_DIR — push-auth smokeEnds with bash ~/metal/go.sh |
Go.Li.bat |
Lithium (Li) — Windows diet. Self-contained, zero deps. Shows 12 steps → [A] all / [P] pick / [S] skip. Registry tweaks, PowerShell bloatware removal. Standalone add-on — not part of the main install flow. |
Go.Li.sh |
Lithium (Li) — Mac/Linux diet. Mac: 9 steps (dark mode, dock, finder, keyboard, remap, trackpad, screenshots, privacy, power). Linux: 4 steps (dark mode, keyboard, file manager, power). Same [A] / [P] / [S] menu. Standalone add-on — not part of the main install flow. |
Go.Na.bat |
Windows reset. Confirms [y/N], then rmdir /s /q C:\metal. |
Go.Na.sh |
Mac/Linux reset. Confirms [y/N], then rm -rf ~/metal. |
Type go from C:\metal or ~/metal. Checks for dirty working tree (offers Stash/Discard/Ignore/Delete/Keep), pulls latest if clean, counts revision and points via be/pts.py, prints the Be banner with v0 · rN · date · pts, then launches Claude Code.
| File | What it does |
|---|---|
go.bat103 lines |
1. git status --porcelain → dirty-tree handler (5 options with file preview)2. Clean path: git pull --ff-only --no-rebase3. git rev-list --count HEAD → revision4. py be/pts.py → total points5. Print Be banner 6. claude --permission-mode bypassPermissions--settings settings.json--append-system-prompt-file CLAUDE.md--max-budget-usd 50--model opus "~h" |
go.sh98 lines |
Same flow. exec < /dev/tty (fix stdin for curl|bash). python3 be/pts.py with fallback to python. |
File-based tool whitelist. Zero approval prompts. Loaded by go.bat/go.sh via --settings.
| Key | Value |
|---|---|
permissions.allow |
Bash(*), Edit, Write, Read, Glob, Grep, WebFetch, WebSearch, Agent, Task*, Skill, NotebookEdit, Worktree, PlanMode, AskUserQuestion, Cron*, RemoteTrigger, mcp__* |
effortLevel |
max |
skipDangerousModePermissionPrompt |
true |
Dev tools + identity + auth. Does its job and returns.
| Step | Detail | What happens |
|---|---|---|
| Fe 1/3 Dev tools |
Version gate | Reads .tools-done. If version matches VERSION, skips entire step.Otherwise asks [Y/n] to install. |
| Winget phase | Creates logs/tools_YYYYMMDD_HHMM.log.Each tool: where X → skip if found, else :run_install.:run_install writes a temp .cmd, wraps it in PowerShell with 300s timeout.Installs: Git, GCC (MinGW-w64), GitHub CLI, Python 3.12, Node.js LTS, Google Cloud CLI, Rust, Make |
|
| npm + pip phase | Extends PATH with %APPDATA%\npm and Python dirs.Upgrades pip. Installs: Claude Code, Wrangler, Snowflake CLI Then browsers: Chrome, Firefox, Brave, Opera (checks .exe paths, not winget list). Refreshes PATH from registry via :refresh_path.Writes version to .tools-done. |
|
| Fe 2/3 Identity |
Inline | call "C:\metal\Go.Sign.ps1" — per-machine GPG + git config globalcopy claude\settings.json → %USERPROFILE%\.claude\settings.jsoncopy claude\settings.local.json → %USERPROFILE%\.claude\settings.local.jsonNote: .gitconfig ships [filter "lfs"] only; identity is per-laptop. |
| Fe 3/3 Auth |
Inline | gh auth status → skip or gh auth logingcloud auth print-access-token → skip or gcloud auth login |
| Label | What it does |
|---|---|
:refresh_path |
Reads PATH from HKLM\...\Environment and HKCU\Environment registry keys.Rebuilds the PATH variable from scratch. Warning: can drop System32. |
:log |
Appends timestamped line to LOGFILE. No-op if LOGFILE not set. |
:skip |
Logs skip, prints "already installed", increments SKIP_COUNT. |
:run_install |
Writes command to %TEMP%\metal_run.cmd.Wraps in PowerShell Start-Process with WaitForExit(300000).Captures stdout/stderr to temp files, appends to log. Exit 258 = timeout. Nonzero = fail. Zero = OK. |
Mac/Linux version. Same three steps as .bat, different package managers.
| Step | Detail | What happens |
|---|---|---|
| Fe 1/3 Dev tools |
Version gate | Reads .tools-done, strips whitespace. If matches VERSION, skips.Otherwise asks [Y/n]. |
| Core tools | Mac: xcode-select → Homebrew → brew install. Linux: apt/dnf/pacman auto-detected for each tool. install_pkg() helper checks command -v before install.Installs: git, gh, python3, node, make, Rust (rustup), gcloud Each wrapped in run_install() with timeout via timeout/gtimeout. |
|
| npm + pip + browsers | Claude Code, Wrangler, Snowflake CLI via npm/pip. Mac browsers: Chrome, Firefox, Brave, Opera via brew --cask.Linux: Firefox only (others vary by distro). Writes version to .tools-done. |
|
| Fe 2/3 Identity |
Inline | bash Go.Sign.sh — per-machine GPG + git config globalCopies Claude settings to ~/.claude/Note: .gitconfig ships [filter "lfs"] only; identity is per-laptop. |
| Fe 3/3 Auth |
Inline | gh auth status → skip or gh auth login < /dev/ttygcloud auth print-access-token → skip or gcloud auth login < /dev/tty |
| Function | What it does |
|---|---|
log() |
Appends timestamped line to $LOGFILE. |
run_install() |
Runs command with timeout/gtimeout wrapper (300s default).Exit 124 = timeout. Nonzero = fail. Zero = OK. Logs everything. |
install_pkg() |
Checks command -v first. Then auto-selects: brew (Mac), apt/dnf/pacman (Linux). |
OS diet scripts. Standalone add-on, run separately.
| File | What it does |
|---|---|
Go.Li.bat |
Self-contained Windows OS diet. 12 steps: bloatware, Cortana, taskbar, dark mode, explorer, power, privacy, notifications, keyboard, start, clock, OneDrive. [A] all / [P] pick / [S] skip. Zero deps. |
Go.Li.sh |
Self-contained Mac/Linux OS diet. Mac: 9 steps. Linux: 4 steps. [A] all / [P] pick / [S] skip. |
One marker file in the metal repo prevents re-running completed steps:
.tools-done — contains the version string (e.g. "3.0"). If it matches VERSION in Go.Fe, tools are skipped.Bumping VERSION in Go.Fe forces tools to re-run on next launch.
Version is 0. Always. No semantic versions. Every change is a revision — the git commit count: git rev-list --count HEAD.
Display format: v0 · r388 · 2026-04-09 · 626 pts (version zero + revision + date + total board points).
Total points come from be/board.md — summed by be/pts.py. The launcher computes revision and points at launch time.
Version/revision appears in:
| Repo | File | Where |
|---|---|---|
go.bat / go.sh | computed at launch: git rev-list --count HEAD + be/pts.py | |
README.md | v0 — every change is a revision | |
Go.Fe.bat / Go.Fe.sh | VERSION=... (tools-done gate only) | |
| web | index.html | hero version line |
| web | architecture.html | subtitle |
| web | history.html | revision entries |
:refresh_path rebuilds PATH from registry. Use %SystemRoot%\System32\curl.exe not bare curl.if/else blocks with setlocal enabledelayedexpansion, use !errorlevel! not %errorlevel%. Or avoid checking errorlevel inside compound blocks entirely.${var,,}, no associative arrays. Use case statements.read commands must use < /dev/tty. go.sh uses exec < /dev/tty before launching claude.