All checks were successful
ci/woodpecker/pr/ci Pipeline was successful
P1 of the `mosaic yolo claudex` launcher (#790): pure, dependency-injected preflight and lifecycle helpers for `raine/claude-code-proxy` (the local Anthropic->Codex translation proxy on 127.0.0.1:18765). No session launch yet; the isolated CLAUDE_CONFIG_DIR composition + env-injection land in PR-2. Authored test-first (spec written and run red before implementation, then green). 39 unit tests, 89.6% statement/line coverage on the new module; the only uncovered lines are the process-spawning system wrappers (systemd/nohup/wait), which are integration glue unsuitable for unit spawning. Helpers: - checkProxyBinary — binary presence via an injectable `which` resolver. - parseAuthStatus / checkAuthStatus — coarse OAuth state from `codex auth status`. Carries NO token material (state + optional expiry only) so token-shaped output can never leak downstream. - runDeviceReauth — `codex auth device` with stdio:'inherit' so the device code streams to the user's TTY; the launcher never captures/logs it or sees the resulting token. - probeLiveness — gotcha #1: ANY HTTP response (incl. non-2xx) = alive; only a transport failure/timeout = dead. NEVER `curl -f` (that spawned duplicate proxies). Bounded by an explicit timeout race so a hung socket can't wedge. - buildSystemdUnitContent / systemdUnitPath / installSystemdUnit — systemd --user unit management; unit carries no credential material. - runProxyPreflight — structured binary+auth+liveness report. - ensureProxyRunning — no-op when live, else systemd-preferred with nohup fallback, re-probing after each attempt so it never spawns a duplicate. Refs #790. Not part of the #758 fleet DAG. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@mosaicstack/mosaic
CLI package for the Mosaic self-hosted AI agent platform.
Usage
mosaic wizard # First-run setup wizard
mosaic gateway install # Install the gateway daemon
mosaic config show # View current configuration
mosaic config hooks list # Manage Claude hooks
Headless / CI Installation
Set MOSAIC_ASSUME_YES=1 (or ensure stdin is not a TTY) to skip all interactive prompts. The following environment variables control the install:
Gateway configuration (mosaic gateway install)
| Variable | Default | Required |
|---|---|---|
MOSAIC_STORAGE_TIER |
local |
No |
MOSAIC_GATEWAY_PORT |
14242 |
No |
MOSAIC_DATABASE_URL |
(none) | Yes if tier=team |
MOSAIC_VALKEY_URL |
(none) | Yes if tier=team |
MOSAIC_ANTHROPIC_API_KEY |
(none) | No |
MOSAIC_CORS_ORIGIN |
http://localhost:3000 |
No |
Admin user bootstrap
| Variable | Default | Required |
|---|---|---|
MOSAIC_ADMIN_NAME |
(none) | Yes (headless) |
MOSAIC_ADMIN_EMAIL |
(none) | Yes (headless) |
MOSAIC_ADMIN_PASSWORD |
(none) | Yes (headless) |
MOSAIC_ADMIN_PASSWORD must be at least 8 characters. In headless mode a missing or too-short password causes a non-zero exit.
Example: Docker / CI install
export MOSAIC_ASSUME_YES=1
export MOSAIC_ADMIN_NAME="Admin"
export MOSAIC_ADMIN_EMAIL="admin@example.com"
export MOSAIC_ADMIN_PASSWORD="securepass123"
mosaic gateway install
Hooks management
After running mosaic wizard, Claude hooks are installed in ~/.claude/hooks-config.json.
mosaic config hooks list # Show all hooks and enabled/disabled status
mosaic config hooks disable PostToolUse # Disable a hook (reversible)
mosaic config hooks enable PostToolUse # Re-enable a disabled hook
Set CLAUDE_HOME to override the default ~/.claude directory.