diff --git a/CLAUDE.md b/CLAUDE.md index fe2ecf0..28a4481 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,7 +9,7 @@ its status — there is no other source of truth. ├── install.py ← Wires the project via the agent adapter (see below) ├── start.sh ← One-command start: install + port handling + board ├── stop.sh ← Safe stop: refuses while agents run (--force overrides) -├── update.sh ← Replace core/ from the distribution repo; local/ survives +├── update.sh ← Replace core/ from the published release; local/ survives ├── tasks/ ← Task state, nothing else. Works as a plain folder │ ├── backlog/…done/ ← kanban even if manager/ is deleted or ignored. │ └── archive/ ← Archived cards: out of the flow, never deleted @@ -110,11 +110,17 @@ Commands arm on first click and run on the second. ## Updating -`./.task-manager/update.sh` fetches the distribution repo (`BENCH_SOURCE` -in `local/.env`), replaces `manager/core/` wholesale plus the top-level -scripts, and touches nothing else — tasks, driver, prompt overrides, `.env` -and state all survive. Then re-run `install.py` (idempotent re-wire) and -restart the board. +`./.task-manager/update.sh` downloads the latest GitHub Release of the +distribution repo (`BENCH_REF=v3` pins a tag; the source is stamped into +the script at build time, `BENCH_SOURCE` in `local/.env` overrides it), +replaces `manager/core/` wholesale plus the top-level files named in the +artifact's `manager/core/release-manifest`, and touches nothing else — +tasks, driver, prompt overrides, `.env` and state all survive. No release +published → it says so and changes nothing; developers working on bench +itself update their clone with git instead. Then re-run `install.py` +(idempotent re-wire) and restart the board. Releases are cut from the +bench repo with `release.sh` (never shipped in the artifact): it builds +the tarball from the manifest, tags `v` and publishes via `gh`. ## Installing into a project diff --git a/README.md b/README.md index 17f1a10..62b3e7a 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,14 @@ branch, and an archive that is never a delete. ## Install into a repo ```bash -git clone .task-manager && rm -rf .task-manager/.git +mkdir .task-manager && curl -L \ + https://github.com/12vectors/bench/releases/latest/download/bench.tar.gz \ + | tar -xz -C .task-manager ./.task-manager/start.sh # wires the project (idempotent) and serves ``` -The first `start.sh` clears the distribution's own cards from `tasks/`, -`plans/` and `reference/` (printing each removal), so a fresh install -starts with an empty board. +No token, no clone: releases are curated artifacts that never contained +bench's own cards or settings, so the board starts empty by construction. Commit `.task-manager/` into the host repo — core is vendored on purpose, so clones work offline and updates show up in the host's own diffs. @@ -23,16 +24,33 @@ so clones work offline and updates show up in the host's own diffs. ## Update ```bash -# in manager/local/.env: BENCH_SOURCE= -./.task-manager/update.sh # latest -BENCH_REF=v1 ./.task-manager/update.sh # a specific release tag +./.task-manager/update.sh # latest release +BENCH_REF=v2 ./.task-manager/update.sh # an exact release tag ``` -Updates replace `manager/core/` and the top-level scripts wholesale and -touch nothing else — tasks, plans, reference, and everything under -`manager/local/` (your driver, commands, prompt overrides, settings, -state) survive every update. Then `python3 .task-manager/install.py` and -restart the board. +The artifact is stamped with the repo it was built from, so updating +needs no configuration; `BENCH_SOURCE=` in +`manager/local/.env` overrides the stamp. Updates replace +`manager/core/` and the top-level scripts wholesale and touch nothing +else — tasks, plans, reference, and everything under `manager/local/` +(your driver, commands, prompt overrides, settings, state) survive every +update. Then `python3 .task-manager/install.py` and restart the board. +If the source repo has no published release yet, `update.sh` says so and +changes nothing. + +## Working on bench itself + +```bash +git clone git@github.com:12vectors/bench.git && cd bench && ./start.sh +``` + +A clone carries bench's own cards and local/ content — that is dev mode, +not an install. (Installing from a clone anyway works: `install.py` +clears the shipped cards on its first boot in a host repo.) Releases are +built by `./release.sh` from the manifest at +`manager/core/release-manifest`: tag = `v`, one stable asset +name (`bench.tar.gz`), contents at the tarball root — the two things the +install one-liner above depends on. ## The three-layer law diff --git a/manager/core/.env.example b/manager/core/.env.example index b3e4790..1fe11ac 100644 --- a/manager/core/.env.example +++ b/manager/core/.env.example @@ -46,7 +46,9 @@ BOARD_WATCH_INTERVAL=2 BOARD_EVENTS_CAP=800 BOARD_HISTORY_CAP=300 -# Where update.sh fetches the task-manager distribution from (a git URL). +# Where update.sh fetches the task-manager's releases from (owner/repo, or +# any GitHub URL). Normally unset: the shipped update.sh is stamped at +# build time with the repo it came from, and this overrides the stamp. # Updates replace manager/core/ and the top-level scripts; they never touch # tasks/, plans/, reference/ or manager/local/. BENCH_SOURCE=