2.5 KiB
2.5 KiB
Server CLAUDE.md
Clojure backend for Spiceflow.
Commands
clj -M:dev # REPL with dev tools
clj -M:run # Production mode
clj -M:test # Unit tests
clj -M:test --focus ns # Specific namespace
REPL commands (in dev/user.clj):
(go) ; Start server + auto-reload
(reset) ; Reload code + restart
(stop) ; Stop server
(reload) ; Reload code only
(reload-all) ; Force reload all namespaces
Directory Structure
server/
├── src/spiceflow/
│ ├── core.clj # Entry point, Mount states
│ ├── config.clj # Configuration (aero)
│ ├── db/ # Database layer
│ ├── adapters/ # CLI integrations
│ ├── api/ # HTTP & WebSocket
│ ├── session/ # Session lifecycle
│ ├── push/ # Push notifications
│ └── terminal/ # Terminal diff caching
├── dev/user.clj # REPL helpers
├── test/ # Unit tests
├── resources/config.edn # Configuration
└── deps.edn # Dependencies
Mount States (start order)
store- SQLite databasepush- Push notification storeserver- Jetty HTTP server
Namespaces
| Namespace | Purpose |
|---|---|
spiceflow.core |
Entry point, Mount states |
spiceflow.config |
Configuration |
spiceflow.db.protocol |
DataStore protocol |
spiceflow.db.sqlite |
SQLite implementation |
spiceflow.db.memory |
In-memory (tests) |
spiceflow.adapters.protocol |
AgentAdapter protocol |
spiceflow.adapters.claude |
Claude Code CLI |
spiceflow.adapters.opencode |
OpenCode CLI |
spiceflow.adapters.tmux |
Tmux terminal |
spiceflow.api.routes |
HTTP handlers |
spiceflow.api.websocket |
WebSocket management |
spiceflow.session.manager |
Session lifecycle |
Configuration (aero)
{:server {:port #long #or [#env SPICEFLOW_PORT 3000]
:host #or [#env SPICEFLOW_HOST "0.0.0.0"]}
:database {:type :sqlite
:dbname #or [#env SPICEFLOW_DB "spiceflow.db"]}}
Access: (get-in config/config [:server :port])
Conventions
| Thing | Convention |
|---|---|
| Files | kebab-case |
| Namespaces | kebab-case |
| Functions | kebab-case |
| Protocols | PascalCase |
| Records | PascalCase |
| Private vars | ^:private |
Thread safety: ConcurrentHashMap for processes, atom for simpler state.