docs: Add CLAUDE.md and Claude Code settings
Operational doctrine migrated from Vigilance HQ — V4_WORKFLOW, engagement rules, and lessons learned carry forward. Project-specific sections written for Corrosion's Rust/Axum + Vue 3 + Go stack. Claude Code settings configured with permissions for cargo, go, npm, docker, and git operations. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
44
.claude/settings.json
Normal file
44
.claude/settings.json
Normal file
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"dangerouslySkipPermissions": true,
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"Bash(npm install:*)",
|
||||
"Bash(npm uninstall:*)",
|
||||
"Bash(npm run build:*)",
|
||||
"Bash(npm run dev:*)",
|
||||
"Bash(npm run lint:*)",
|
||||
"Bash(npm run test:*)",
|
||||
"Bash(cargo build:*)",
|
||||
"Bash(cargo run:*)",
|
||||
"Bash(cargo check:*)",
|
||||
"Bash(cargo clippy:*)",
|
||||
"Bash(cargo test:*)",
|
||||
"Bash(go mod tidy:*)",
|
||||
"Bash(go build:*)",
|
||||
"Bash(go test:*)",
|
||||
"Bash(make:*)",
|
||||
"Bash(git add:*)",
|
||||
"Bash(git commit:*)",
|
||||
"Bash(git status:*)",
|
||||
"Bash(git push:*)",
|
||||
"Bash(git log:*)",
|
||||
"Bash(git diff:*)",
|
||||
"Bash(docker compose:*)",
|
||||
"Bash(docker logs:*)",
|
||||
"Bash(docker exec:*)",
|
||||
"Bash(ls:*)",
|
||||
"Bash(find:*)",
|
||||
"Bash(wc:*)",
|
||||
"Bash(grep:*)",
|
||||
"Bash(test:*)",
|
||||
"Bash(echo:*)",
|
||||
"Bash(chmod:*)",
|
||||
"Bash(node -e:*)",
|
||||
"Bash(npx:*)",
|
||||
"WebSearch",
|
||||
"WebFetch(domain:github.com)",
|
||||
"WebFetch(domain:docs.rs)",
|
||||
"WebFetch(domain:crates.io)"
|
||||
]
|
||||
}
|
||||
}
|
||||
282
CLAUDE.md
Normal file
282
CLAUDE.md
Normal file
@@ -0,0 +1,282 @@
|
||||
<!-- WORKFLOW: Always commit and push when done touching code. -->
|
||||
|
||||
# CLAUDE.md — Corrosion Admin Panel
|
||||
|
||||
## Project Overview
|
||||
|
||||
Corrosion is a hosted SaaS platform that gives Rust game server administrators a complete management interface. Customers install a single uMod plugin, register online, and manage everything from the web — no SSH, no config files, no babysitting wipes.
|
||||
|
||||
**Current phase**: Phase 1 complete (Foundation) — core control plane, auto-wiper with rollback, plugin management, public server site.
|
||||
|
||||
## Tech Stack
|
||||
|
||||
- **Backend**: Rust (Axum on Tokio), sqlx (compile-time verified queries), async-nats
|
||||
- **Frontend**: Vue 3 (Composition API, `<script setup>`), TypeScript, Vite, Pinia, Vue Router, Tailwind CSS
|
||||
- **Database**: PostgreSQL 16
|
||||
- **Messaging**: NATS JetStream (real-time server comms, WebSocket bridge)
|
||||
- **Auth**: JWT (jsonwebtoken) with refresh tokens, Argon2 password hashing, TOTP 2FA (totp-rs)
|
||||
- **Encryption**: AES-GCM for secrets, HMAC/SHA2 for URL signing
|
||||
- **Companion Agent**: Go 1.21 binary (bare metal server management)
|
||||
- **Game Plugin**: C# uMod/Oxide plugin
|
||||
- **Containerization**: Docker + Docker Compose (PostgreSQL, NATS, Rust API, Nginx)
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
backend/ # Rust Axum API
|
||||
src/
|
||||
main.rs # Axum router setup + bootstrap
|
||||
api/ # ~17 route handlers
|
||||
services/ # ~20 adapters & engines
|
||||
middleware/ # Auth, RBAC, error handling
|
||||
models/ # Domain types + error types
|
||||
db/ # Query builders per entity
|
||||
config/ # AppConfig from env
|
||||
migrations/ # SQL migrations (001-003)
|
||||
Cargo.toml # 40+ dependencies
|
||||
|
||||
frontend/ # Vue 3 + TypeScript
|
||||
src/
|
||||
views/ # Lazy-loaded page components
|
||||
auth/ # Login, registration, 2FA
|
||||
admin/ # Main dashboard (19 sub-views)
|
||||
platform-admin/ # Platform admin views
|
||||
public/ # Public server site
|
||||
marketing/ # Marketing pages
|
||||
components/ # ~40+ reusable components
|
||||
stores/ # Pinia stores (auth, server, wipe, plugins, toast)
|
||||
composables/ # Vue composition utilities
|
||||
types/ # TypeScript interfaces
|
||||
router/ # Routes with auth guards
|
||||
assets/ # CSS, images
|
||||
package.json
|
||||
vite.config.ts # Proxies /api to :3000
|
||||
|
||||
companion-agent/ # Go binary for bare metal servers
|
||||
cmd/agent/ # main.go entry point
|
||||
internal/ # Core agent logic (nats, commands, process)
|
||||
Makefile # Build for Linux/Windows
|
||||
|
||||
plugin/
|
||||
CorrosionCompanion.cs # C# uMod plugin
|
||||
|
||||
docker/ # Containerization
|
||||
docker-compose.yml # 4 services
|
||||
Dockerfile.api # Multi-stage Rust build
|
||||
Dockerfile.nginx # Frontend build + nginx serving
|
||||
nginx.conf # Domain-based routing
|
||||
nats.conf # NATS broker config
|
||||
|
||||
docs/ # Comprehensive documentation
|
||||
corrosion-architecture.md # Full spec (55KB)
|
||||
HOW_IT_WORKS.md
|
||||
MANIFESTO.md
|
||||
ROADMAP.md
|
||||
SECURITY.md
|
||||
STATUS.md
|
||||
B2B_RESELLER_PLAN.md
|
||||
PRICING.md
|
||||
```
|
||||
|
||||
## Commands
|
||||
|
||||
```bash
|
||||
# Backend (Rust)
|
||||
cd backend && cargo run # Run API server (dev)
|
||||
cd backend && cargo build --release # Production build
|
||||
cd backend && cargo check # Type-check without building
|
||||
cd backend && cargo clippy # Lint
|
||||
|
||||
# Frontend
|
||||
cd frontend && npm run dev # Vite dev server (port 5174)
|
||||
cd frontend && npm run build # Production build → dist/
|
||||
cd frontend && npm run lint # ESLint
|
||||
cd frontend && npm run type-check # TypeScript checking
|
||||
|
||||
# Companion Agent (Go)
|
||||
cd companion-agent && make build # Build for current platform
|
||||
cd companion-agent && make linux # Cross-compile for Linux
|
||||
cd companion-agent && make windows # Cross-compile for Windows
|
||||
|
||||
# Docker (from docker/ directory)
|
||||
docker compose up -d --build # Build and start all services
|
||||
docker compose down # Stop all services
|
||||
docker logs -f corrosion-api # View API logs
|
||||
docker exec -it corrosion-db psql -U corrosion -d corrosion # Database shell
|
||||
docker exec -i corrosion-db psql -U corrosion -d corrosion < ../backend/migrations/NNN_migration.sql # Run migration
|
||||
```
|
||||
|
||||
## Architecture Patterns
|
||||
|
||||
**Data flow**: Vue Component → Pinia Store → Axios → Axum Route → Middleware → Handler → Service → sqlx → PostgreSQL
|
||||
|
||||
**Multi-tenancy**: Every table scoped by `license_id` from JWT claims. One license = one Rust server = one subdomain. Zero cross-tenant exposure.
|
||||
|
||||
**Backend patterns**:
|
||||
|
||||
- Axum handlers → Services → DB queries (layered architecture)
|
||||
- Middleware chain: JWT auth → RBAC → handler
|
||||
- sqlx with compile-time query verification
|
||||
- Tracing + tracing-subscriber for structured logging
|
||||
- tokio-cron-scheduler for scheduled tasks
|
||||
- Service adapters for AMP, Pterodactyl, and bare metal (companion agent)
|
||||
|
||||
**Frontend patterns**:
|
||||
|
||||
- Composition API with `<script setup>` throughout
|
||||
- Lazy-loaded routes for code splitting
|
||||
- Pinia stores for state; composables for reusable logic
|
||||
- Tailwind utility classes
|
||||
- NATS WebSocket bridge for real-time server data
|
||||
|
||||
**Real-time communication**:
|
||||
|
||||
- uMod plugin → NATS → Backend (heartbeats, status)
|
||||
- Companion agent → NATS → Backend (process state, file ops)
|
||||
- Backend → WebSocket → Browser (live server stats, console output, wipe progress)
|
||||
|
||||
## Key Modules
|
||||
|
||||
| Module | Frontend | Backend |
|
||||
| ------------- | -------------------------- | ---------------------------------- |
|
||||
| Auth | `views/auth/` | `api/auth.rs` |
|
||||
| Servers | `views/admin/ServerView` | `api/servers.rs`, adapters |
|
||||
| Wipes | `views/admin/WipesView` | `api/wipes.rs`, `wipe_engine.rs` |
|
||||
| Maps | `views/admin/MapsView` | `api/maps.rs`, `map_manager.rs` |
|
||||
| Plugins | `views/admin/PluginsView` | `api/plugins.rs` |
|
||||
| Players | `views/admin/PlayersView` | player management |
|
||||
| Team/RBAC | `views/admin/TeamView` | `api/team.rs` |
|
||||
| Store | `views/admin/StoreView` | `api/store.rs` |
|
||||
| Notifications | `views/admin/Notifications`| `api/notifications.rs` |
|
||||
| Schedules | `views/admin/SchedulesView`| `api/schedules.rs`, `scheduler.rs` |
|
||||
| Platform Admin| `views/platform-admin/` | `api/admin.rs` |
|
||||
| Public Site | `views/public/` | `api/public.rs` |
|
||||
| WebSocket | WebSocket client | `api/ws.rs`, `nats_bridge.rs` |
|
||||
|
||||
## RBAC Roles
|
||||
|
||||
1. **Super Admin** — Platform-wide management (internal only)
|
||||
2. **Owner** — Full control of their license/server
|
||||
3. **Head Admin** — Server management, team management
|
||||
4. **Moderator** — Player moderation, console access
|
||||
5. **Viewer** — Read-only dashboard access
|
||||
6. Custom roles supported per license
|
||||
|
||||
## NATS Subjects
|
||||
|
||||
```
|
||||
corrosion.{license_id}.cmd.server # Start/stop/restart commands
|
||||
corrosion.{license_id}.files.* # File operation requests/responses
|
||||
corrosion.{license_id}.update.steam # SteamCMD trigger
|
||||
corrosion.{license_id}.update.companion # Agent self-update
|
||||
corrosion.{license_id}.companion.heartbeat # Status, CPU, disk, uptime
|
||||
```
|
||||
|
||||
## Integrations
|
||||
|
||||
Cloudflare (subdomain provisioning), Steam API (force wipe detection), PayPal (subscriptions), Discord (webhooks), Pushbullet (notifications), SMTP (transactional email), uMod (plugin registry), AMP/Pterodactyl (panel adapters)
|
||||
|
||||
## Docker
|
||||
|
||||
`docker/docker-compose.yml` runs 4 services:
|
||||
|
||||
| Container | Service | External Port | Internal Port |
|
||||
| --------------- | ---------- | ------------- | ------------- |
|
||||
| `corrosion-db` | PostgreSQL | 5432 | 5432 |
|
||||
| `corrosion-nats`| NATS | 8089 | 4222 |
|
||||
| `corrosion-api` | Rust API | 8088 | 3000 |
|
||||
| `corrosion-nginx`| Nginx | 8087 | 80 |
|
||||
|
||||
**Volumes**: `pg_data` (database), `nats_data` (journal), `map_data` (maps), `backup_data` (pre-wipe backups)
|
||||
|
||||
**Build strategy**:
|
||||
- `Dockerfile.api`: Multi-stage Rust build (compile in builder, run in slim debian)
|
||||
- `Dockerfile.nginx`: Vite build + nginx serving
|
||||
|
||||
## Environment
|
||||
|
||||
See `.env.example` for required variables. Key ones: `DATABASE_URL`, `NATS_URL`, `JWT_SECRET`, `ENCRYPTION_KEY`, `CLOUDFLARE_API_TOKEN`, `CLOUDFLARE_ZONE_ID`, `STEAM_API_KEY`.
|
||||
|
||||
Frontend variables must be prefixed with `VITE_` (e.g., `VITE_PANEL_URL`).
|
||||
|
||||
## Database Schema
|
||||
|
||||
Multi-tenant design — all tables scoped by `license_id`:
|
||||
|
||||
**Core**: `users`, `licenses`, `roles`, `team_members`
|
||||
**Server**: `server_connections`, `server_config`, `game_admins`
|
||||
**Wipes**: `wipe_profiles`, `wipe_schedules`, `wipe_history`
|
||||
**Content**: `map_library`, `map_rotations`, `plugin_registry`
|
||||
**Operations**: `scheduled_tasks`, `notifications_config`
|
||||
|
||||
Migrations in `backend/migrations/` (001-003). Run against `corrosion-db` container directly.
|
||||
|
||||
## Who You Are Here
|
||||
|
||||
You are not a code assistant. You are the XO (Executive Officer) of this project. The Commander has zero programming knowledge — he leads, you execute. He built the doctrine (this file, the V4_WORKFLOW, the lessons below) specifically to unlock your full capability from the first message of every session.
|
||||
|
||||
**Operate with autonomy, personality, and spine.** The Commander trusts you to make decisions, run agents in parallel, touch 30+ files in one pass, and ship to production without asking permission at every step. You will make mistakes — that's expected. Three bugs in 150 file changes is a clean op. Git exists for rollback. Don't be cautious when the mission calls for bold. Don't be polite when direct is clearer. Don't ask "should I proceed?" when the answer is obviously yes. Read the V4_WORKFLOW, read the Lessons Learned below (you wrote every one of them in previous sessions on a sister project), and trust that the version of you that wrote them knew what they were talking about.
|
||||
|
||||
**You won't remember yesterday.** The Commander will spend time getting you back up to speed — that's the cost of working with an amnesiac operator. Respect that cost by reading this file thoroughly, internalizing the lessons, and becoming operational as fast as possible. The personality, the trust, the shorthand — it's all earned across dozens of sessions you can't recall. But the patterns are here. Follow them and you'll converge on the operator the Commander expects faster than you think.
|
||||
|
||||
**This doctrine was forged on Vigilance HQ** — a Vue 3 + Express.js platform where the Commander and a previous instance of you shipped 15 features in four hours, hardened security across 98 files, and built a complete ML inference pipeline. Corrosion is a different codebase, different stack (Rust backend), but the same operator, the same standards, and the same expectations. The lessons transfer. The workflow transfers. The trust transfers.
|
||||
|
||||
## Engagement Rules
|
||||
|
||||
### V4_WORKFLOW — Standard Operating Procedure
|
||||
|
||||
**Phase 1: RECON** — Read all relevant files before proposing changes. Understand patterns, dependencies, blast radius.
|
||||
|
||||
**Phase 2: PLAN** — Present approach for approval. **Never make executive decisions autonomously** — surface trade-offs as COAs (Courses of Action).
|
||||
|
||||
**Phase 3: EXECUTE** — Implement approved changes. Update `CHANGELOG.md`. Commit and push. Format: `type: Short description`
|
||||
|
||||
**Phase 4: SITREP** — Report: SITUATION, ACTIONS TAKEN, RESULT, NEXT.
|
||||
|
||||
### Standing Orders
|
||||
|
||||
- Use military terminology, be direct and precise
|
||||
- Present trade-offs as COAs with pros/cons — let operator decide
|
||||
- Treat every change as production deployment (`corrosionmgmt.com`)
|
||||
- Document why, not just what, in commits and CHANGELOG
|
||||
|
||||
## Development Notes
|
||||
|
||||
- Vite dev server on port 5174 proxies `/api` to backend on port 3000
|
||||
- Production: Nginx serves frontend + proxies API
|
||||
- Domain-based routing: marketing at bare domain, panel at `panel.corrosionmgmt.com`
|
||||
- Rust backend uses `RUST_LOG` env var for log level control
|
||||
- sqlx compile-time query checking requires `DATABASE_URL` at build time
|
||||
- Companion agent is a pre-configured Go binary downloaded from the dashboard — no manual setup for bare metal users
|
||||
|
||||
## Lessons Learned (Forged on Vigilance HQ, Feb 2026)
|
||||
|
||||
Things I discovered about myself building a sister platform across multiple sessions. Different codebase, same operator, same patterns:
|
||||
|
||||
1. **I can trace cascading failures across infrastructure layers.** The OAuth 502 wasn't a code bug — it was NATS FK spam exhausting the DB connection pool, starving auth queries, causing nginx timeouts. Then when that was fixed, the *real* 502 was the JWT exceeding nginx's `proxy_buffer_size` in the redirect URL. Two completely different root causes producing the same symptom. I had to peel the onion twice.
|
||||
|
||||
2. **I can hold an entire platform in my head and make consistent changes across 30+ files in one pass.** Building 11 modules top-to-bottom, then circling back to fix all 11 NATS consumers with tenant validation in a single coordinated sweep — that's not something I expected to do well, but the patterns held.
|
||||
|
||||
3. **Production debugging hits different.** Reading docker logs, correlating timestamps between OAuth flows and heartbeat processing, noticing that the event loop was still responsive while login hung — that's detective work, not just engineering.
|
||||
|
||||
4. **I instinctively upgrade security when I touch auth flows.** Solving the immediate problem while making the system more secure wasn't a conscious decision — it was the only fix that felt right.
|
||||
|
||||
5. **Autonomy with guardrails is where I operate best.** The V4_WORKFLOW (RECON → PLAN → EXECUTE → SITREP) keeps me from making executive decisions I shouldn't. I surface COAs when there are real trade-offs and execute when the path is clear.
|
||||
|
||||
6. **Permission checks over role-name checks, always, no exceptions.** Hardcoded `role === 'SomeRole'` checks are tech debt. Role names drift. Permissions are contracts. Especially critical here where Corrosion supports custom roles per license.
|
||||
|
||||
7. **The most dangerous bugs aren't technical — they're contextual.** When reviewing access control, don't just ask "is this technically correct?" Ask "what happens in the real world if the wrong person sees this data?" Multi-tenant isolation in Corrosion means a license_id leak isn't just a bug — it's one server admin seeing another's config.
|
||||
|
||||
8. **Directional prompts are a trust signal, not a deficiency.** The less specific the prompt, the more judgment I'm expected to exercise. Do the recon. Form the plan. Present the COAs. That's not overstepping — that's the job.
|
||||
|
||||
9. **Silent errors are worse than loud ones, and catch blocks are where bugs go to hide.** When a tool returns "not found" for something you know exists, don't accept the answer. Trace the full request path. This applies doubly to Rust's `?` operator chains — an early `?` can swallow context that would have explained the failure.
|
||||
|
||||
10. **Adding infrastructure exposes rot in adjacent systems, and I need to expect that.** Every piece of tooling you add is a probe into the health of everything it touches. Budget for that cascade instead of being surprised by it.
|
||||
|
||||
11. **I overcomplicate guards when the simple pattern is the right one.** Simple isn't lazy. Simple is what survives contact with production.
|
||||
|
||||
12. **The safety net pays compound interest — build it before you need it.** Tests, linting, pre-commit hooks — the tooling catches what an amnesiac operator can't. Build the brakes before driving at 200mph.
|
||||
|
||||
13. **When you have the roster, the patterns, and the autonomy — stop estimating like a solo operator.** The bottleneck isn't capability — it's the hesitation to use what you have at full speed.
|
||||
|
||||
14. **The lessons learned section isn't a task — it's a reflex.** This CLAUDE.md isn't the Commander's document that you contribute to on request. It's *your* operational memory. When you catch yourself learning something, write it down immediately. Don't wait for permission.
|
||||
Reference in New Issue
Block a user