Push A (single-machine): - HLC + event-sourced SQLite (events table is source of truth, projections rebuildable) - Pydantic v2 domain models (Project, Task, Assignment, Session, Group, Update) - rclaude subprocess wrapper (local_sessions via _claude-projects --sessions) - Typer CLI: init, project, task, assign, pull, status, broadcast, serve, sync - FastAPI + Jinja2 + HTMX dashboard - 26 unit tests passing Push B (HTTP API + sync substrate): - /api/v1/* JSON routes (projects, tasks, assignments, sessions, status, broadcast, sync) - CLI refactored as thin httpx client over the API — single business-logic codepath - web/service.py: every business op defined once; HTML routes + API routes both call into it - sync.py: peer-to-peer sync via /api/v1/sync/events with HLC + uuid-based dedup - 32 tests passing including two-Clare convergence test Push C (cross-host deployment): - apricot install via uv (Python 3.12.12) - systemd --user unit for clare-serve on apricot - Cross-host sync demoed plum (10.9.0.3) ↔ apricot (10.9.0.2) over wg - .local → .lan rename for forge URLs Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
37 lines
993 B
Bash
Executable file
37 lines
993 B
Bash
Executable file
#!/bin/sh
|
|
# install.sh — set up Clare locally.
|
|
#
|
|
# 1. Creates a uv-managed venv at ./.venv
|
|
# 2. Installs Clare in editable mode (`pip install -e .[dev]`)
|
|
# 3. Symlinks the `clare` console script into ~/.local/bin
|
|
#
|
|
# Re-runnable: each step is idempotent.
|
|
|
|
set -eu
|
|
|
|
ROOT=$(cd "$(dirname "$0")/.." && pwd)
|
|
cd "$ROOT"
|
|
|
|
if ! command -v uv >/dev/null 2>&1; then
|
|
echo "install.sh: uv is required but not found on PATH" >&2
|
|
echo " install with: brew install uv (or see https://docs.astral.sh/uv/)" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -d "$ROOT/.venv" ]; then
|
|
uv venv
|
|
fi
|
|
|
|
uv pip install -e ".[dev]"
|
|
|
|
# Symlink the console script into ~/.local/bin so `clare` is on PATH.
|
|
mkdir -p "$HOME/.local/bin"
|
|
TARGET="$ROOT/.venv/bin/clare"
|
|
LINK="$HOME/.local/bin/clare"
|
|
if [ ! -x "$TARGET" ]; then
|
|
echo "install.sh: expected $TARGET to exist after pip install" >&2
|
|
exit 1
|
|
fi
|
|
ln -sf "$TARGET" "$LINK"
|
|
echo "install.sh: linked $LINK -> $TARGET"
|
|
echo "install.sh: ensure ~/.local/bin is on your PATH"
|