@ucsandman/legcli 0.13.0 → 0.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.13.1 (2026-09-18)
4
+
5
+ A one-line fix in the terminal and the marketing site brought up to what 0.13.0 does.
6
+
7
+ - **The terminal's opening line names rungs.** `next: claude/opus →
8
+ claude/sonnet → codex → agy`, through the same `rungLabel` every other
9
+ surface uses; it read `next: claude → claude → codex → agy` on 0.12.0.
10
+ - **The site says what is underneath the handoff.** legcli.com is reorganised
11
+ around the product as it is now: the sample transcript shows a Fable wall
12
+ answered by Opus keeping the conversation and a login wall answered by Codex
13
+ from the bundle; new sections for the ladder, background cards (End as a
14
+ card, Run in the background, Take over), `leg history`, the portable
15
+ harness and custom adapters in one compact group, and a **Never spent
16
+ without you** column beside what is never touched. The structured data's
17
+ `softwareVersion` had been stuck at 0.8.0; the OG image gains Grok; the FAQ
18
+ no longer says a shared board has no TLS.
19
+
3
20
  ## 0.13.0 (2026-09-18)
4
21
 
5
22
  The first day on 0.12.0 with three real terminals found five things. Usage
package/README.md CHANGED
@@ -714,7 +714,7 @@ Leg is commercial software under the [Leg License Agreement](LICENSE).
714
714
  It ships as readable JavaScript so you can see what it does on your machine,
715
715
  and you may modify it for your own use, but not redistribute it or work
716
716
  around the license check. Versions 0.2.0 and 0.3.0 were published under MIT
717
- and remain available. The version in this source tree is 0.13.0; see
717
+ and remain available. The version in this source tree is 0.13.1; see
718
718
  [npm](https://www.npmjs.com/package/legcli) for published versions and
719
719
  [CHANGELOG.md](CHANGELOG.md) for release notes.
720
720
 
package/docs/ERRORS.md CHANGED
@@ -3,6 +3,21 @@
3
3
  What broke, why, and what fixed it. One entry per failure, newest first. A first
4
4
  occurrence has to be written down or a repeat is never countable.
5
5
 
6
+ ## 2026-09-18: the terminal's opening `next:` line named the same agent twice and no model
7
+
8
+ **Fixed in `src/attach.mjs`: the line maps the chain through `rungLabel`, so it
9
+ reads `next: claude/opus → claude/sonnet → codex → agy`.**
10
+
11
+ The ladder made destinations rungs of (agent, account, model), and every other
12
+ surface (the ledger's `handoff` event, the board's chain rail, `leg ladder`)
13
+ moved to `rungLabel`. The one line the human reads first, printed at session
14
+ start, kept its pre-ladder formatter of `agent[/account]`, so a claude/fable
15
+ terminal announced `next: claude → claude → codex → agy`. Found while writing
16
+ the marketing site's transcript from the source lines rather than from memory:
17
+ a transcript that mirrors the code cannot show a line the code prints wrongly.
18
+ The lesson is the same one as the site rule: a sample transcript is written
19
+ from the `say()` calls, and a `say()` that reads wrong there is a bug here.
20
+
6
21
  ## 2026-09-17: a new field on the session view leaked the owner's reset times to a guest, through the guest's own terminal
7
22
 
8
23
  **Fixed in `src/server.mjs` (`sessionsView` decides `guest` before the map and
package/docs/faq.md CHANGED
@@ -135,7 +135,9 @@ paths, no bundle, no events, no logs, and none of the pipeline side. The
135
135
  limit line keeps only the reason and the reset time, never the raw limit
136
136
  text. The one thing they can do on your terminal is ask for a hand-off, which
137
137
  you approve or dismiss on the row. `leg share off` ends it and every link
138
- stops working. There is no TLS, so keep it on Tailscale or a network you trust.
138
+ stops working. TLS is served from a certificate pair you supply (`leg share on
139
+ --tls-cert <file> --tls-key <file>`); Leg issues none, so without one keep it on
140
+ Tailscale or a network you trust.
139
141
 
140
142
  **What if the CLI I want isn't installed?**
141
143
  `node bin/leg.mjs up --dry` prints a preflight table with `ok`/`missing`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ucsandman/legcli",
3
- "version": "0.13.0",
3
+ "version": "0.13.1",
4
4
  "description": "Usage-limit monitor and automatic handoff for Claude Code, Codex, agy and Grok. Type leg claude|codex|agy|grok and get the same interactive agent with a board alongside, auto-approve on by default, usage tracking per agent and account, a live context handoff bundle, and at the limit the next agent continuing in the same terminal. $79 once, 30-day money-back guarantee.",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -199,13 +199,13 @@ function page ({ slug, title, description, body, headings }) {
199
199
  <meta property="og:url" content="${url}">
200
200
  <meta property="og:site_name" content="Leg">
201
201
  <meta property="og:title" content="${escapeHtml(title)}">
202
- <meta property="og:image" content="${ORIGIN}/og.png?v=3">
203
- <meta property="og:image:secure_url" content="${ORIGIN}/og.png?v=3">
202
+ <meta property="og:image" content="${ORIGIN}/og.png?v=4">
203
+ <meta property="og:image:secure_url" content="${ORIGIN}/og.png?v=4">
204
204
  <meta property="og:image:type" content="image/png">
205
205
  <meta name="twitter:card" content="summary_large_image">
206
206
  <meta name="twitter:title" content="${escapeHtml(title)}">
207
207
  <meta name="twitter:description" content="${escapeHtml(description)}">
208
- <meta name="twitter:image" content="${ORIGIN}/og.png?v=3">
208
+ <meta name="twitter:image" content="${ORIGIN}/og.png?v=4">
209
209
  <link rel="preload" href="/fonts/atkinson-hyperlegible-next-var.woff2" as="font" type="font/woff2" crossorigin>
210
210
  <link rel="preload" href="/fonts/azeret-mono-var.woff2" as="font" type="font/woff2" crossorigin>
211
211
  <link rel="stylesheet" href="/style.css">
package/src/attach.mjs CHANGED
@@ -902,7 +902,7 @@ export async function attach(agent, args = [], { open = true, cwd: cwdOpt = null
902
902
  }
903
903
  if (iso) updateSession(sid, { cwd: iso.cwd, branch: iso.branch, worktree: { path: iso.path, branch: iso.branch, base: iso.base } })
904
904
  updateSession(sid, { head_at_start: g.head, head: g.head, files_dirty: iso ? [] : g.dirty, board_url: board.url })
905
- say(`session ${sid} · ${agent}${account !== 'default' ? '/' + account : ''} · board ${board.url ?? 'off'}${board.started ? ' (started)' : ''} · next: ${chain.map((c) => c.agent + (c.account !== 'default' ? '/' + c.account : '')).join(' → ') || 'none'}`)
905
+ say(`session ${sid} · ${agent}${account !== 'default' ? '/' + account : ''} · board ${board.url ?? 'off'}${board.started ? ' (started)' : ''} · next: ${chain.map(rungLabel).join(' → ') || 'none'}`)
906
906
  if (iso) {
907
907
  const others = iso.live.map((s) => `${s.agent} ${s.session_id.split('-').pop()}`).join(', ')
908
908
  say(`another session is live in this checkout (${others}): this one works in ${iso.cwd} on ${iso.branch}; Land on its card brings it to ${iso.base ?? 'nothing (detached HEAD)'} · --no-worktree to share`)
@@ -68,7 +68,7 @@
68
68
  // release lands on disk under a board that was started before it: the page
69
69
  // then draws controls the process has no routes for (an empty agent select,
70
70
  // no buckets). test/files-version.test.mjs pins this to package.json.
71
- const FILES_VERSION = '0.13.0'
71
+ const FILES_VERSION = '0.13.1'
72
72
  const TIMELINE_CAP = 12
73
73
  // mirrors LOOPBACK in src/auth.mjs; state.bind is "<host>:<port>" and an IPv6
74
74
  // host arrives bracketed
@@ -50,7 +50,7 @@
50
50
  // name. test/board-updates.test.mjs pins `state.stopped` in this file by
51
51
  // source text, which is why the module object keeps the name.
52
52
  // pinned to package.json by test/files-version.test.mjs; see board.js FILES_VERSION
53
- const FILES_VERSION = '0.13.0'
53
+ const FILES_VERSION = '0.13.1'
54
54
  const state = { es: null, retryMs: 1000, timers: [], stopped: false, sseRequest: 0, floorRequest: 0, trunkRequest: 0, headRequest: 0, cardsRequest: 0, lastReadingAt: null, bind: (typeof location !== 'undefined' && location.host) || '127.0.0.1:4747', pendingFloor: null, pendingCards: null, cards: new Map(), blockers: new Map(), doneOpen: false, ringId: null, scheduler: {}, trunkOff: false }
55
55
 
56
56
  // What the entry row reads on every render: the terminals (for the repo it