Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
a882171
claude-current and claude-restart-check: launch only the newest publi…
brettheap Sep 29, 2026
359c460
claude-current: the watchdog ends the whole tree, and one launch reap…
brettheap Sep 29, 2026
3c33ec4
lane-start: an unset CLAUDE_BIN launches what claude-current names, a…
brettheap Sep 29, 2026
ea1dcb5
--install places claude-current and claude-restart-check, and their m…
brettheap Sep 29, 2026
b8e2ad1
claude-current: a malformed bound exits 64, the usage status, and not 1
brettheap Sep 29, 2026
e2644af
Copilot's second round on #134: SemVer pre-release order, the install…
brettheap Sep 29, 2026
9ba858d
Copilot's third round on #134: the lock without flock names its owner…
brettheap Sep 29, 2026
c7e3e3c
claude-current: a copy ahead of npm that appears during the lock wait…
brettheap Sep 29, 2026
da83af3
claude-current and claude-restart-check: a relative npm prefix is tak…
brettheap Sep 29, 2026
b90f4dc
Copilot's overview at da83af3: KILL after a grace on every bound, a m…
brettheap Sep 29, 2026
544d8af
claude-current: one symlink lock for every launch, whatever its PATH …
brettheap Sep 30, 2026
715b7ac
AGENTS.md: the installer places fifteen files
brettheap Sep 30, 2026
900aa92
Merge current main into Claude resolver feature
brettheap Oct 4, 2026
66d7862
fix(claude): share relative cache locks across checkouts
brettheap Oct 4, 2026
208e506
fix(claude): preflight lane launches and qualify newer-copy notices
brettheap Oct 4, 2026
9ef4c0d
fix(lanes): approve handoffs before resolver preflight
brettheap Oct 4, 2026
6ed4189
fix(lanes): reject directories in resolved Claude paths
brettheap Oct 4, 2026
2110ff7
fix(claude): recheck bindings and reject watchdog timeout output
brettheap Oct 4, 2026
11037f0
fix(claude): contain timed-out children and preflight local fences
brettheap Oct 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,8 @@ jobs:
/bin/bash -n lane-start
/bin/bash -n lane-end
/bin/bash -n link-estates
/bin/bash -n claude-current
/bin/bash -n claude-restart-check
/bin/bash -n tests/test_lane_helpers.sh
/bin/bash -n tests/run.sh

Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
Three estate commands, `park`, `resume` and `status`; the lane tooling
`lanes-edit.sh`, `lane-start`, `lane-end` and `link-estates`, which came here
with their history under lane-collision-protocol Amendment 9; and the
`openRepoTools` that places all thirteen files and creates the workspace they read.
`openRepoTools` that places all fifteen files and creates the workspace they read.
**The verbs add no mechanics.**
They find the estate and run its own `make park` / `make resume`, which run
the Speckit git extension's scripts — one implementation, ruled 2026-09-09
Expand Down
20 changes: 10 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ and 5 put it and where it stays. What moved here is the CODE. A `<user>-wip` is
a private repository whose own rules file says "No secrets and no code", nobody
would look inside somebody else's for a command, and until this move the four
helpers existed in exactly one place in the world: one person's private
repository. `docs/README-lanes.md` is the manual.
repository. `docs/README-lanes.md` is the manual; `docs/README-claude-current.md` is the one for the Claude Code `lane-start` launches and the RESTART NEEDED line.

Every one of them finds that data through `$AGENT_PROTOCOL_ROOT/workspace.yaml`
— `repository:` and `path:`, the same pointer file `resume` and `status`
Expand Down Expand Up @@ -237,14 +237,14 @@ gh api repos/opensoft/openRepoTools/contents/openRepoTools \
-H 'Accept: application/vnd.github.raw' | bash -s -- --install
```

It places THIRTEEN files into `~/.local/bin` — `openRepoTools`, `park`, `resume`,
It places FIFTEEN files into `~/.local/bin` — `openRepoTools`, `park`, `resume`,
`status`, `lane`, `lanes`, `lane-handoff`, `lane-rename`, `lanes-edit.sh`,
`lane-start`, `lane-end`, `link-estates` and the alias table `repos.tsv` — 755,
idempotently: a
`lane-start`, `lane-end`, `link-estates`, the alias table `repos.tsv`,
`claude-current` and `claude-restart-check` — 755, idempotently: a
second run prints `already installed … (unchanged)` per file, one whose bytes have
drifted prints `updated at`, and one whose bytes were right and whose MODE was not
prints `(mode restored to 755)`: the mode is stamped on every artifact on every
run, whether or not the bytes moved. ALL THIRTEEN ARE IN HAND BEFORE ANY IS
run, whether or not the bytes moved. ALL FIFTEEN ARE IN HAND BEFORE ANY IS
PLACED, so a fetch that failed replaces nothing and names the file it could not
get. A mode stamp that FAILS is a refusal naming the file it could not mode
(exit 2), never the shell's own 1: every `chmod` this command performs goes
Expand All @@ -259,7 +259,7 @@ THAT EXISTS, so a bin directory that is not there yet is refused for the parent
that would not take it, and a create needs a directory's search bit as well as
its write bit. A refusal creates none of those directories either. `cp` follows
a symlink, and an install through one leaves the command uninstalled and writes
these bytes into whatever it points at. Then a `13 of 13 placed in <dir>` line,
these bytes into whatever it points at. Then a `15 of 15 placed in <dir>` line,
and the `export PATH=…` line if that directory is not on your `PATH`.

It also places **fourteen things that are not files in that directory**: THREE
Expand Down Expand Up @@ -288,7 +288,7 @@ changes no byte of them. An entry that runs
string — a second writer of one of these hooks — a
file it cannot parse, or a `hooks` that is not an object → it **refuses, prints
the exact block, and places nothing at all**, because both merges are computed
with the thirteen files in hand before either is placed. An installer that
with the fifteen files in hand before either is placed. An installer that
repairs a file it does not understand is how you lose a setting you meant.
A SECOND WRITER REFUSES WHETHER OR NOT OUR OWN ENTRY IS BESIDE IT: the read asks
for a rival BEFORE it asks whether ours is already there, so a file carrying
Expand All @@ -299,7 +299,7 @@ own `UserPromptSubmit` hooks are left exactly where they are, which is why that
arm keys on the VERB and not on the word anywhere in a path. It
never writes a profile's own `settings.json`: the launcher owns that one.

Twenty-seven artifacts, and the count is the invariant. It was sixteen until A11
Twenty-nine artifacts, and the count is the invariant. It was sixteen until A11
Addendum 4 ruling 9 gave `--install` a command-file list and `commands/swap.md`
in it, at the same pair of paths a skill takes — because `opensoft/workBenches#74`
deletes the launcher's copy and `/swap` would otherwise be installed by nobody;
Expand All @@ -313,7 +313,7 @@ respawned with a new session whose first prompt is that handoff's top block.
Twenty-six until **Amendment 16** (ratified the same day) put `lane-rename` on
`PATH`: a lane is renamed by one word, in one commit — the row, the object log,
the handoff and `lanes/aliases.tsv` — and its old name resolves for ever
afterwards, in every reader that takes a lane name.
afterwards, in every reader that takes a lane name. Twenty-seven, with THIRTEEN files and a `13 of 13 placed` line, until opensoft/workBenches#119 put `claude-current` and `claude-restart-check` on `PATH` (Brett Heap, 2026-09-29, verbatim *"this work is really for openRepoTools repo"*): the Claude Code a launch starts, and the RESTART NEEDED line the status line prints.

**And it writes down what it placed.** A RECEIPT (#57) — one row of
`<name> <destination> <sha256> <UTC>` per regular file placed, in
Expand All @@ -335,7 +335,7 @@ where `raw.githubusercontent.com` is blocked.
|---|---|---|
| `$OPENREPOTOOLS_REPO` | `opensoft/openRepoTools` | the `owner/name` to fetch from — a fork or a mirror, named once |
| `$OPENREPOTOOLS_REF` | `main` | the ref to fetch it at |
| `$OPENREPOTOOLS_BIN_DIR` | `~/.local/bin` | where `--install` puts the thirteen |
| `$OPENREPOTOOLS_BIN_DIR` | `~/.local/bin` | where `--install` puts the fifteen, and where `lane-start` looks for `claude-current` |
| `$OPENREPOTOOLS_DATA_DIR` | `${XDG_DATA_HOME:-~/.local/share}/openRepoTools` | where `--install` writes the receipt of what it placed |
| `$AGENT_PROTOCOL_ROOT` | `~/.agents` | where `workspace.yaml` lives — the one pointer to your data |
| `$CLAUDE_PROFILES_HOME` | `~/.claude-profiles` | the profiles root `--install` places the shared skills under |
Expand Down
Loading
Loading