mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-26 02:11:53 +00:00
* add documentation for ai agents * docs: consolidate CLAUDE.md and CONTRIBUTING.md, add style guidelines - Refactor CLAUDE.md to reference CONTRIBUTING.md for build/test/format info - Expand CONTRIBUTING.md with comprehensive build targets, env vars, and testing - Add code style guidelines section with conventional commits - Standardize SDK prettier config to use single quotes (matching web) - Add project-level Claude Code settings to disable co-author attribution * style(sdk): apply prettier with single quotes Run prettier across sdk/base and sdk/package to apply the standardized quote style (single quotes matching web). * docs: add USER.md for per-developer TODO filtering - Add agents/USER.md to .gitignore (contains user identifier) - Document session startup flow in CLAUDE.md: - Create USER.md if missing, prompting for identifier - Filter TODOs by @username tags - Offer relevant TODOs on session start * docs: add i18n documentation task to agent TODOs * docs: document i18n ID patterns in core/ Add agents/i18n-patterns.md covering rust-i18n setup, translation file format, t!() macro usage, key naming conventions, and locale selection. Remove completed TODO item and add reference in CLAUDE.md. * chore: clarify that all builds work on any OS with Docker
147 lines
5.9 KiB
Markdown
147 lines
5.9 KiB
Markdown
# CLAUDE.md
|
|
|
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
|
|
## Project Overview
|
|
|
|
StartOS is an open-source Linux distribution for running personal servers. It manages discovery, installation, network configuration, backups, and health monitoring of self-hosted services.
|
|
|
|
**Tech Stack:**
|
|
- Backend: Rust (async/Tokio, Axum web framework)
|
|
- Frontend: Angular 20 + TypeScript + TaigaUI
|
|
- Container runtime: Node.js/TypeScript with LXC
|
|
- Database/State: Patch-DB (git submodule) - storage layer with reactive frontend sync
|
|
- API: JSON-RPC via rpc-toolkit (see `agents/rpc-toolkit.md`)
|
|
- Auth: Password + session cookie, public/private key signatures, local authcookie (see `core/src/middleware/auth/`)
|
|
|
|
## Build & Development
|
|
|
|
See [CONTRIBUTING.md](CONTRIBUTING.md) for:
|
|
- Environment setup and requirements
|
|
- Build commands and make targets
|
|
- Testing and formatting commands
|
|
- Environment variables
|
|
|
|
**Quick reference:**
|
|
```bash
|
|
. ./devmode.sh # Enable dev mode
|
|
make update-startbox REMOTE=start9@<ip> # Fastest iteration (binary + UI)
|
|
make test-core # Run Rust tests
|
|
```
|
|
|
|
## Architecture
|
|
|
|
### Core (`/core`)
|
|
The Rust backend daemon. Main binaries:
|
|
- `startbox` - Main daemon (runs as `startd`)
|
|
- `start-cli` - CLI interface
|
|
- `start-container` - Runs inside LXC containers; communicates with host and manages subcontainers
|
|
- `registrybox` - Registry daemon
|
|
- `tunnelbox` - VPN/tunnel daemon
|
|
|
|
**Key modules:**
|
|
- `src/context/` - Context types (RpcContext, CliContext, InitContext, DiagnosticContext)
|
|
- `src/service/` - Service lifecycle management with actor pattern (`service_actor.rs`)
|
|
- `src/db/model/` - Patch-DB models (`public.rs` synced to frontend, `private.rs` backend-only)
|
|
- `src/net/` - Networking (DNS, ACME, WiFi, Tor via Arti, WireGuard)
|
|
- `src/s9pk/` - S9PK package format (merkle archive)
|
|
- `src/registry/` - Package registry management
|
|
|
|
**RPC Pattern:** See `agents/rpc-toolkit.md`
|
|
|
|
### Web (`/web`)
|
|
Angular projects sharing common code:
|
|
- `projects/ui/` - Main admin interface
|
|
- `projects/setup-wizard/` - Initial setup
|
|
- `projects/start-tunnel/` - VPN management UI
|
|
- `projects/shared/` - Common library (API clients, components)
|
|
- `projects/marketplace/` - Service discovery
|
|
|
|
**Development:**
|
|
```bash
|
|
cd web
|
|
npm ci
|
|
npm run start:ui # Dev server with mocks
|
|
npm run build:ui # Production build
|
|
npm run check # Type check all projects
|
|
```
|
|
|
|
### Container Runtime (`/container-runtime`)
|
|
Node.js runtime that manages service containers via RPC. See `RPCSpec.md` for protocol.
|
|
|
|
**Container Architecture:**
|
|
```
|
|
LXC Container (uniform base for all services)
|
|
└── systemd
|
|
└── container-runtime.service
|
|
└── Loads /usr/lib/startos/package/index.js (from s9pk javascript.squashfs)
|
|
└── Package JS launches subcontainers (from images in s9pk)
|
|
```
|
|
|
|
The container runtime communicates with the host via JSON-RPC over Unix socket. Package JavaScript must export functions conforming to the `ABI` type defined in `sdk/base/lib/types.ts`.
|
|
|
|
**`/media/startos/` directory (mounted by host into container):**
|
|
|
|
| Path | Description |
|
|
|------|-------------|
|
|
| `volumes/<name>/` | Package data volumes (id-mapped, persistent) |
|
|
| `assets/` | Read-only assets from s9pk `assets.squashfs` |
|
|
| `images/<name>/` | Container images (squashfs, used for subcontainers) |
|
|
| `images/<name>.env` | Environment variables for image |
|
|
| `images/<name>.json` | Image metadata |
|
|
| `backup/` | Backup mount point (mounted during backup operations) |
|
|
| `rpc/service.sock` | RPC socket (container runtime listens here) |
|
|
| `rpc/host.sock` | Host RPC socket (for effects callbacks to host) |
|
|
|
|
**S9PK Structure:** See `agents/s9pk-structure.md`
|
|
|
|
### SDK (`/sdk`)
|
|
TypeScript SDK for packaging services (`@start9labs/start-sdk`).
|
|
|
|
- `base/` - Core types, ABI definitions, effects interface (`@start9labs/start-sdk-base`)
|
|
- `package/` - Full SDK for package developers, re-exports base
|
|
|
|
### Patch-DB (`/patch-db`)
|
|
Git submodule providing diff-based state synchronization. Changes to `db/model/public.rs` automatically sync to the frontend.
|
|
|
|
**Key patterns:**
|
|
- `db.peek().await` - Get a read-only snapshot of the database state
|
|
- `db.mutate(|db| { ... }).await` - Apply mutations atomically, returns `MutateResult`
|
|
- `#[derive(HasModel)]` - Derive macro for types stored in the database, generates typed accessors
|
|
|
|
**Generated accessor types** (from `HasModel` derive):
|
|
- `as_field()` - Immutable reference: `&Model<T>`
|
|
- `as_field_mut()` - Mutable reference: `&mut Model<T>`
|
|
- `into_field()` - Owned value: `Model<T>`
|
|
|
|
**`Model<T>` APIs** (from `db/prelude.rs`):
|
|
- `.de()` - Deserialize to `T`
|
|
- `.ser(&value)` - Serialize from `T`
|
|
- `.mutate(|v| ...)` - Deserialize, mutate, reserialize
|
|
- For maps: `.keys()`, `.as_idx(&key)`, `.as_idx_mut(&key)`, `.insert()`, `.remove()`, `.contains_key()`
|
|
|
|
## Supplementary Documentation
|
|
|
|
The `agents/` directory contains detailed documentation for AI assistants:
|
|
|
|
- `TODO.md` - Pending tasks for AI agents (check this first, remove items when completed)
|
|
- `USER.md` - Current user identifier (gitignored, see below)
|
|
- `rpc-toolkit.md` - JSON-RPC patterns and handler configuration
|
|
- `core-rust-patterns.md` - Common utilities and patterns for Rust code in `/core` (guard pattern, mount guards, etc.)
|
|
- `s9pk-structure.md` - S9PK package format structure
|
|
- `i18n-patterns.md` - Internationalization key conventions and usage in `/core`
|
|
|
|
### Session Startup
|
|
|
|
On startup:
|
|
|
|
1. **Check for `agents/USER.md`** - If it doesn't exist, prompt the user for their name/identifier and create it. This file is gitignored since it varies per developer.
|
|
|
|
2. **Check `agents/TODO.md` for relevant tasks** - Show TODOs that either:
|
|
- Have no `@username` tag (relevant to everyone)
|
|
- Are tagged with the current user's identifier
|
|
|
|
Skip TODOs tagged with a different user.
|
|
|
|
3. **Ask "What would you like to do today?"** - Offer options for each relevant TODO item, plus "Something else" for other requests.
|