Skip to content

Releases: aron98/load-lock

v1.5.0 — updating and staleness made honest

Choose a tag to compare

@aron98 aron98 released this 20 Oct 15:01

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. --check dry run with script-friendly exit codes, --json for 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 / version command.

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

Choose a tag to compare

@aron98 aron98 released this 20 Oct 13:54
  • New wait_for_completion primitive: agents sleep honestly while their heavy job runs and wake promptly when it finishes — no more job_status polling or guessed sleeps (completes the loop: wait_for_turn for the queue, wait_for_completion for 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_permit gains wait: 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

Choose a tag to compare

@aron98 aron98 released this 20 Oct 11:35
  • Version handshake: clients send clientVersion, daemon answers with daemonVersion (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 stop hardening: SIGTERM → bounded wait (default 5s) → SIGKILL → verifies the endpoint is verifiably free before reporting success
  • service start honesty: refusals name the conflicting pid ("socket answered from pid X") instead of a bare 10s timeout
  • Skew + multi-copy drift visibility: doctor reports every detected copy (CLI on PATH, opencode npm-cache copies) and warns on daemon skew and version drift; status and 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

Choose a tag to compare

@aron98 aron98 released this 20 Oct 10:51
  • 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 all LOAD_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

Choose a tag to compare

@aron98 aron98 released this 20 Oct 10:30
  • 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_PREFIX env, --label-prefix CLI flag and MCP label_prefix input 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 gl keymap binding, which swallowed plain g typing; the dashboard opens via /load-lock, the command palette, or the sidebar widget click (#28)

Tests: 120/120 green.

v1.1.0 — dashboard everywhere

Choose a tag to compare

@aron98 aron98 released this 20 Oct 05:58

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 dashboard is now the primary CLI command for the live read-only dashboard (pools, holders, offers, queue, machine panel, event feed) in any terminal. load-lock top stays as a hidden compatibility alias (#22).
  • load-lock help prints a grouped, one-screen usage of every command; bare load-lock, --help and -h do 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).
  • Esc closes 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; gl is 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

Choose a tag to compare

@aron98 aron98 released this 19 Oct 14:54
  • 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 /T job-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

Choose a tag to compare

@aron98 aron98 released this 15 Oct 13:34
  • install (opencode): registers the published npm package @aron98/load-lock in the plugins array instead of a local stub with a file: symlink dep — fixes bun failing to resolve the stub in the shared service, and /plugins now 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

Choose a tag to compare

@aron98 aron98 released this 15 Oct 11:17

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.