AGENTS.md is the front door, not the handbook.
Start here, then jump to the right doc.
If you're making code changes, these are the docs that matter most:
- docs/GETTING_STARTED.md — project setup, build commands, testing, and day-to-day workflow
- docs/ARCHITECTURE.md — client patterns, server state architecture, and guardrails
- docs/web-testing-strategy.md — orbitdock-web testing principles: what to test where, mocking rules, hard lines
- docs/OPERATIONS.md — server deployment, persistence, debugging, and troubleshooting
OrbitDock has two main parts:
OrbitDockNative/OrbitDock/— SwiftUI app for macOS and iOSorbitdock-server/— Rust server, CLI, persistence, and provider integrations
The repo rules are simple:
- keep durable business truth on the server
- apply authoritative
POST/PATCH/PUTresponses to local state immediately, then let subscriptions reconcile - use
make rust-*targets instead of plaincargo - keep shared Make config in the root
Makefileand target families inmake/*.mk - keep SQLite ownership in the Rust server
- prefer focused docs in
docs/over growing this file again
For Swift app work, prefer the newer plugin skills and MCP tools over ad hoc shell workflows.
- use the
Build iOS Appsplugin for iOS build, simulator, UI inspection, screenshots, logs, and debugger flows - use the
Build macOS Appsplugin for macOS build, run, test, debug, telemetry, and packaging flows - when the task clearly matches one of the native skills, load it first instead of reaching straight for raw
xcodebuild - prefer
build-ios-apps:ios-debugger-agentfor simulator runs and interactive iOS debugging - prefer
build-macos-apps:build-run-debugfor local macOS build and launch work, andbuild-macos-apps:test-triagewhen macOS tests fail - prefer the
mcp__xcodebuildmcp__*tool family for simulator control, screenshots, UI snapshots, log capture, and Xcode-backed build/test actions - use shell
xcodebuildorswift buildas a fallback when the MCP/plugin path does not cover the task cleanly
Selected-session boot order is defined in docs/data-flow.md. The control deck is composer UI only; it must not own session bootstrap, WebSocket subscription, or business-state truth.
Functional. Pure. Immutable. Single mutation path.
- All database writes go through
PersistCommand— no direct SQL outside persistence layer - Immutable fields (
claude_sdk_session_id,codex_thread_id) cannot be overwritten once set - In-memory state is frozen after initial write
- SQLite triggers enforce immutability as hard stop — code bugs cannot corrupt data
Hooks are passive reporters — they observe and report, nothing more.
- Hooks NEVER mutate direct session state
- Hooks NEVER write to
claude_sdk_session_idorcodex_thread_idof a direct session - Hook sessions are ephemeral sugar — they report events, they don't own state
- If a hook is touching direct session state, the architecture is backwards
- docs/GETTING_STARTED.md — setup, build commands, testing, key patterns
- docs/ARCHITECTURE.md — client patterns, server state architecture, and guardrails
- docs/web-testing-strategy.md — orbitdock-web testing principles and hard lines
- docs/OPERATIONS.md — deployment, database, debugging, and troubleshooting
- docs/data-flow.md — REST/WS data contract and surface model
- docs/design-system.md — unified design system (Cosmic Harbor) and typography
- docs/tool-rendering-spec.md — tool display contracts and rendering specs
- docs/FEATURES.md — product capabilities and user-facing features
If a section starts turning into a handbook, move it into docs/ and link it here.