Repository navigation
Releases: aron98/load-lock
Releases · aron98/load-lock
Release list
v1.5.0 — updating and staleness made honest
Two agent-visible reliability chapters: updating the tool without surprises, and knowing exactly what's stale after you do.
load-lock update: checks npm, classifies where this copy lives before touching anything (bun global / npm global get applied; opencode cache copies and repo checkouts are refused with a pointer to who owns them), then restarts the service explicitly.--checkdry run with script-friendly exit codes,--jsonfor structured reports.load-lock service restart: composes the hardened stop and honest start; names the failed phase and reason if either side fails.- Adapter-init drift notice: the OpenCode plugin and MCP server compare their version with the PATH CLI at startup and surface one clear notice naming
load-lock update. Notify only — nothing is auto-installed. - Dashboard staleness surfaces: the TUI panel now tells you when the running session's plugin code is older than the on-disk copy ("restart opencode to pick up vX") and reports "daemon restarted onto vX (was vY)" across daemon restarts via the version handshake.
- Reconnect hardening: a failed initial connect can no longer wedge the dashboard in "connecting" forever, and a pruned install can neither kill the host process nor wedge the daemon auto-spawn — the client falls back to the PATH-installed CLI's daemon entry.
load-lock --version/versioncommand.
Docs: OPERATIONS.md gains the plugin in-memory staleness section and updated service/restart guidance.
Tests: 181/181 green.
v1.4.0 — wait for completion
- New
wait_for_completionprimitive: agents sleep honestly while their heavy job runs and wake promptly when it finishes — no morejob_statuspolling or guessed sleeps (completes the loop:wait_for_turnfor the queue,wait_for_completionfor execution) - Structured result on every path:
finished(exit code, output tail, duration, permit-released flag),still_running(checkpoint: call again),timeout,job_unknown,stopped_by_request— never unbounded run_with_permitgainswait: true(+wait_timeout_ms) for fire-and-wait in a single call- Order guarantee: the permit is released before waiters wake, so a woken agent always sees free capacity
- Daemon-tracked jobs: waiters are held server-side and resolved by the daemon's liveness sweep; daemon restarts are transparent (waiters re-issue, tracked permits survive via the journal)
- Old-daemon compatibility: new clients fall back to a light events-based poll — same result shape, no missed wakeups (live-verified against a 1.3.0 daemon)
- Exposed on MCP, OpenCode plugin, and CLI (
load-lock wait --job <id>) - Policy text and docs (AGENT_GUIDE, ARCHITECTURE, OPERATIONS, ADAPTERS) now teach the start-then-wait flow
Tests: 150/150 green.
v1.3.0 — seamless updates
- Version handshake: clients send
clientVersion, daemon answers withdaemonVersion(additive, backward-compatible with pre-handshake daemons) - Daemon self-restart: when a newer client contacts an older daemon, the daemon persists state + queue journal, drains connections, and respawns itself with the same argv — first client contact after an update triggers a seamless restart (one attempt per version, no restart loops)
- Queue journaling: queued/offered requests survive daemon restarts, re-queued FIFO with the same request ids; offered entries come back as queued and are re-offered with fresh tokens
service stophardening: SIGTERM → bounded wait (default 5s) → SIGKILL → verifies the endpoint is verifiably free before reporting successservice starthonesty: refusals name the conflicting pid ("socket answered from pid X") instead of a bare 10s timeout- Skew + multi-copy drift visibility:
doctorreports every detected copy (CLI on PATH, opencode npm-cache copies) and warns on daemon skew and version drift;statusand dashboards show the daemon version with an "older than installed" note - Docs: new "Update lifecycle" section in OPERATIONS.md; COMPATIBILITY.md explains the opencode multi-copy reality
Tests: 134/134 green.
v1.2.1 — omac installer
load-lock install --harness omac(+ uninstall): merge-only, idempotent, reversible edit of omac's user-global sandbox profile (~/.config/omac/sandbox-profiles/default.json) — grants AF_UNIX connect to the host daemon socket (filesystem.allow_unix_dir), the installed package tree when needed (filesystem.read), and passes allLOAD_LOCK_*client vars through the sandbox env filter (environment.allow_vars) (#32)- omac recipe in the Sandboxes docs upgraded from contract-inspected to live-verified against omac 0.11.0 (bubblewrap + Landlock), including both gotchas: the package-tree read grant a global install needs, and the daemon >= 1.2.0 requirement for label prefixes (#32)
- 5 new omac installer contract tests (populated-profile preservation, idempotent re-install, missing-profile creation, global-install read grant, broken-profile refusal)
Tests: 125/125 green.
v1.2.0 — sandboxed agents + label prefixes
- Sandboxed agents: client-only mode (
LOAD_LOCK_NO_SPAWN) — sandboxed clients never auto-spawn a local daemon, and fail loudly with a pointer to the new docs (#29) - New Sandboxes section in docs/OPERATIONS.md: bridged-socket recipes for bubblewrap (live-verified), omac, Docker, macOS seatbelt (contract-inspected), and an honest statement on WSL2 (#29)
- Label prefixes:
LOAD_LOCK_LABEL_PREFIXenv,--label-prefixCLI flag and MCPlabel_prefixinput tag every acquire; the daemon composes holder labels (e.g.omac:issue-42 build) so the dashboard shows which sandbox an agent runs in (#29) - Lease-mode permit lifecycle (mark_started + heartbeat +
untrackedLeaseMs) documented as the cross-PID-namespace lifecycle, including the attach_pid hazard (#29) - OpenCode TUI: removed the
glkeymap binding, which swallowed plaingtyping; the dashboard opens via/load-lock, the command palette, or the sidebar widget click (#28)
Tests: 120/120 green.
v1.1.0 — dashboard everywhere
Dashboards everywhere: the CLI gets its own dashboard command and a help command, and the OpenCode TUI dashboard becomes an in-window panel with a clickable at-a-glance sidebar widget.
load-lock dashboardis now the primary CLI command for the live read-only dashboard (pools, holders, offers, queue, machine panel, event feed) in any terminal.load-lock topstays as a hidden compatibility alias (#22).load-lock helpprints a grouped, one-screen usage of every command; bareload-lock,--helpand-hdo the same, and unknown commands now point to it (#22).- The OpenCode TUI dashboard opens in-window (side panel, chat stays visible) instead of taking over the whole TUI (#24).
Esccloses the TUI dashboard panel — the footer always advertised it, now it's true. Deliberately inactive while a dialog (force-release, palette) is open, so Esc keeps cancelling the dialog instead (#23).- New at-a-glance widget at the bottom of the OpenCode right sidebar on every session screen: health-colored pool summary (
load-lock 0/3·Q2), click to open the dashboard;glis the always-works fallback for terminals that don't deliver mouse events (#24). - Live-verified in a real pty against opencode 2.0.32: sidebar widget render, click-to-open,
gl, in-window presentation.
Tests: 112/112 green.
v1.0.0 — first full release
- Dashboard: live lock-status dashboard — OpenCode TUI panel plus portable
load-lock top. (#12) - Adapters: Cursor stop-hook adapter built on the officially documented hooks v1 contract (
hook cursor stop, merge-only reversible installer, dedicated.cursor/rules/load-lock.mdc); contract-tested, not live-verified. (#18, #6) - Windows: named-pipe transport adapter — new cross-platform transport seam (
src/shared/transport.ts), daemon Windows branches (pipe claim, signal-0 liveness, no-unlink stop),taskkill /Tjob-tree kills, and 22 platform-injection tests. Windows end-to-end is documented as a ready-to-run procedure in docs/OPERATIONS.md (not live-verified); known limitations (no PID-reuse defense, no process-group scan, machine-wide pipe name) are listed there. (#20, #7) - Tools:
wait_for_turn— bounded blocking "sleep until it is my turn" for queued agents. (#17, #11) - Fix: hook installers now recognize their own entries (quoted-path + subcommand matching) — installing twice no longer duplicates hook entries and uninstall removes exactly what was added, for claude-code, codex, and cursor. (#21, #19)
- Verification: Claude Code and Codex CLI adapters live-verified in Docker harnesses; cgroup awareness under Docker/WSL2 documented honestly. (#14, #15, #16, #8)
- Installers: first-class Gemini CLI installer (#9) and MCP-fallback tier installers for Copilot CLI, Cline, Roo Code, and Goose (#13).
- Docs: AGENTS.md for coding agents; OPERATIONS / COMPATIBILITY / ADAPTERS guides updated throughout.
Tests: 100/100 green.
v0.1.2 — package-registration installer
- install (opencode): registers the published npm package
@aron98/load-lockin thepluginsarray instead of a local stub with afile:symlink dep — fixes bun failing to resolve the stub in the shared service, and/pluginsnow shows the real package version. Legacy stub installs are migrated away automatically. (#5) - install (codex): MCP TOML presence check is now line-anchored — no more false positives when a comment mentions
[mcp_servers.load-lock]. - docker: containerized harness-verification workspace added at repo level (not shipped in the npm tarball).
- Tests: 32/32 green.
v0.1.1 — npm trusted publishing verification
First release published via npm Trusted Publishing (OIDC from GitHub Actions, no npm tokens).
- Package now scoped as @aron98/load-lock (binaries stay load-lock / load-lock-mcp).
- Library surface for adapter authors (typed subpath exports: shared/client, shared/protocol, policy/text, mcp/server, core/daemon).
- docs/ADAPTERS.md: adapter-authoring guide.
- CI: install-from-tarball job now matches the scoped tarball name.
- Publish workflow bound to the npm environment (OIDC claim match), Node 24, NODE_AUTH_TOKEN cleared for OIDC.