@mmmbuto/nexuscrew 0.8.9 → 0.8.10

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/README.md CHANGED
@@ -16,7 +16,7 @@ panes, windows. tmux does the work; the browser is just a faithful client.
16
16
 
17
17
  ---
18
18
 
19
- ## What it is (v0.8.9 "Hydra Workspaces")
19
+ ## What it is (v0.8.10 "Hydra Federation")
20
20
 
21
21
  - Runs a small server on the host where your tmux sessions live.
22
22
  - Each attach spawns a real PTY running `tmux attach` and bridges its bytes over a WebSocket
@@ -24,6 +24,9 @@ panes, windows. tmux does the work; the browser is just a faithful client.
24
24
  - **Desktop grid** (≥1024px): drag sessions from the sidebar into a tiling column layout —
25
25
  live terminals side by side, draggable dividers, per-tile composer, layout remembered.
26
26
  Tiles attach with `ignore-size` so they never resize your real terminals.
27
+ - **Ordered Fleet roster**: local and remote locations are independently collapsible and
28
+ filterable by all, pinned, active, or off. The desktop chrome stays fixed while the roster
29
+ scrolls; the mobile header stays visible above its own touch-scrolling list.
27
30
  - **Attached decks by default**: named workspaces switch as tabs inside the same PWA without
28
31
  reloading terminals or losing a pending layout save. Use `↗` only when you want to detach a
29
32
  deck into another browser window or monitor.
@@ -33,8 +36,9 @@ panes, windows. tmux does the work; the browser is just a faithful client.
33
36
  management use the selected location through a scoped single-origin route.
34
37
  - **One-link node pairing**: paste a link or scan its QR in Settings → Nodes. A complete
35
38
  link tests SSH, exchanges the one-time invitation, confirms both directions and verifies
36
- the peer automatically; failures identify the exact connection stage. Once a rendezvous
37
- is configured, creating the link needs no repeated host or port fields.
39
+ the peer automatically; failures identify the exact connection stage. A device already
40
+ connected to a hub creates invitations through that hub; a standalone hub asks only for
41
+ the SSH address by which the receiving device can reach it.
38
42
  - **Settings and wizard**: manage roles, nodes, token rotation, and service regeneration
39
43
  from the UI; the first-run wizard uses the same pairing flow as Settings.
40
44
  - **Cell lifecycle from the UI**: the primary `+` creates a managed Fleet cell at Local or
@@ -153,6 +157,9 @@ entirely.
153
157
  - **Node.js ≥ 18**
154
158
  - **tmux** on the host (3.4+; the non-destructive `ignore-size` attach is honored on 3.4 and
155
159
  later)
160
+ - **OpenSSH client (`ssh`)** for Hydra nodes and a clean `nexuscrew doctor`. A local-only tmux
161
+ session does not invoke it, but the installation is reported degraded until it is present.
162
+ `autossh` is detected by doctor but is not required.
156
163
  - A PTY backend is resolved automatically per platform: Darwin ARM64/x64 and Linux ARM64/x64
157
164
  scriptless prebuilds, including the native Android ARM64 provider on Termux.
158
165
 
@@ -168,7 +175,7 @@ ssh -L 41820:127.0.0.1:41820 user@your-host
168
175
  # then run `nexuscrew show` on the machine where the browser is available
169
176
  ```
170
177
 
171
- autossh reverse tunnels or a VPN work the same way. A local **authentication token** (0600 file,
178
+ A user-managed autossh tunnel or a VPN works the same way. A local **authentication token** (0600 file,
172
179
  auto-generated and passed directly to the browser by `nexuscrew show`) is a second factor on top of your SSH/VPN gate. The
173
180
  token travels in the URL **fragment** (`#token=…`), so it never reaches the server logs.
174
181
 
@@ -181,9 +188,9 @@ Every installation is always the local node and can join other NexusCrew nodes.
181
188
  flow stays entirely in the PWA:
182
189
 
183
190
  1. On the installation being shared, open **Settings → Nodes → Invite a node** and create the
184
- ten-minute link/QR. If its rendezvous is already configured, this is a zero-field action.
185
- Otherwise expand the advanced fields once and enter the OpenSSH target or Host alias that
186
- the *other device* uses to reach this installation.
191
+ ten-minute link/QR. A device already connected to a hub uses that hub automatically.
192
+ A standalone hub needs one value: the OpenSSH target or Host alias that the *other device*
193
+ uses to reach it. This is not `127.0.0.1` and not a NexusCrew HTTP URL.
187
194
  2. On the other device, open its own NexusCrew PWA (`nexuscrew show`), go to
188
195
  **Settings → Nodes**, and use the first card, **Connect with one link**. Paste the complete
189
196
  link in the prominent field or scan the QR. Do not navigate to the loopback address in the
@@ -196,17 +203,21 @@ flow stays entirely in the PWA:
196
203
 
197
204
  The link never contains an SSH key, identity file, API key or PWA token. Its only credential is
198
205
  the random, one-time pairing invite; SSH routing fields are non-secret configuration. A
199
- successful pairing creates a reciprocal loopback-only link and both sides exchange a redacted
200
- topology automatically.
206
+ successful pairing creates one supervised SSH connection to the hub. Its normal `-L` channel
207
+ is private and provides access to the hub. The optional `-R` channel is added to that same SSH
208
+ process only when the user enables **Share this node**, after which the hub verifies it before
209
+ advertising the device. Both sides exchange only redacted topology.
201
210
 
202
- Pairing also exchanges node roles. An inbound phone or laptop that is not advertising itself as
203
- an always-reachable node is shown as **passive** while away, not as a broken red peer. A declared
204
- server/node that stops responding, or a live endpoint that rejects authentication, remains a
205
- real health error.
211
+ A newly paired phone or laptop is private by default: the hub keeps it in Settings without
212
+ probing it as a server or showing a false red error. Enabling Share makes it routable and turns
213
+ authenticated reverse-channel health into a real requirement; a shared node that stops
214
+ responding, or a live endpoint that rejects authentication, remains a real health error.
206
215
 
207
216
  NexusCrew does not create SSH keys or edit `authorized_keys`. OpenSSH remains authoritative for
208
217
  identity files, agents, host keys, ports, ProxyJump and forwarding policy. NexusCrew uses
209
- `autossh` when available and otherwise its supervised `ssh`; configured links return at boot.
218
+ one built-in retry supervisor around `ssh`; it never nests `autossh`. `nexuscrew doctor` reports
219
+ whether both binaries are installed and states that OpenSSH is the transport actually used.
220
+ Missing `ssh` is a blocking error; `autossh` is optional. Configured links return at boot.
210
221
  Pair credentials are random, per-peer and scoped only to the federated session/file surface—the
211
222
  PWA token never crosses a peer link.
212
223
 
@@ -221,7 +232,7 @@ transitive nodes remain listed as offline with their last-seen time while a rela
221
232
  ### Linux
222
233
 
223
234
  ```bash
224
- # Install Node.js 18+ and tmux 3.4+ with your distribution package manager first.
235
+ # Install Node.js 18+, tmux 3.4+ and OpenSSH with your package manager first.
225
236
  npm install -g @mmmbuto/nexuscrew
226
237
  nexuscrew
227
238
  ```
@@ -248,7 +259,7 @@ distribution, so it does not require Developer ID signing.
248
259
 
249
260
  ```bash
250
261
  pkg update
251
- pkg install nodejs-lts tmux
262
+ pkg install nodejs-lts tmux openssh
252
263
  npm install -g @mmmbuto/nexuscrew
253
264
  nexuscrew
254
265
  ```
@@ -264,6 +275,9 @@ exits:
264
275
  nexuscrew # background start; opens only on first run
265
276
  nexuscrew show # background start when needed + open the authenticated PWA
266
277
  nexuscrew show token # print the clickable authenticated URL; do not open a browser
278
+ nexuscrew status # compact service, port and hub-connection state
279
+ nexuscrew stop # stop server and every NexusCrew-managed SSH supervisor
280
+ nexuscrew restart # restart server; restore only autostart-enabled hub links
267
281
  nexuscrew boot # opt in to startup persistence
268
282
  nexuscrew boot off # disable startup persistence, keep the current run alive
269
283
  ```
@@ -309,7 +323,8 @@ by normal startup, help, doctor, or service output.
309
323
 
310
324
  `nexuscrew mcp` runs a minimal **stdio MCP server** (JSON-RPC 2.0, one JSON message per
311
325
  line, zero SDK dependencies) that brings NexusCrew *inside* your AI sessions. An agent
312
- running in a tmux session gets five tools — the cell→human channel:
326
+ running in a tmux session gets six tools — the cell→human channel plus its
327
+ read-only deck context:
313
328
 
314
329
  - `nc_notify {title, body?, urgency?}` — human notification: toast on every open UI +
315
330
  web push on subscribed devices (enable push from Settings → System).
@@ -319,11 +334,17 @@ running in a tmux session gets five tools — the cell→human channel:
319
334
  `NEXUSCREW_REPLY_LABEL`; bracketed paste, never submits).
320
335
  - `nc_send_file {path, caption?}` — copies a file (absolute path under HOME) into the
321
336
  session outbox: badge + notification, downloadable from the Files panel.
337
+ - `nc_deck {}` — identifies the caller's tmux session and node, then returns every local or
338
+ authorized shared-owner deck that contains it. Deck identity is owner-qualified; members
339
+ include stable owner ID, Fleet cell name (when managed), exact tmux session and the Hydra
340
+ route valid from the caller. Unavailable members remain visible with `cell: null`.
322
341
  - `nc_status {}` / `nc_inbox {}` — read-only: live sessions + fleet cells / inbox files.
323
342
 
324
343
  The caller's identity is the tmux session name (`$TMUX` → `tmux display-message`), with
325
344
  `NEXUSCREW_MCP_SESSION` as fallback for non-tmux contexts. The bridge talks to the local
326
345
  HTTP API (loopback + token from `~/.nexuscrew/token`); the cell↔cell bus stays out of scope.
346
+ `nc_deck` is discovery only: use the AI client's verified tmux-messaging workflow to contact
347
+ another member, and never scrape `decks.json` directly.
327
348
 
328
349
  Register it in **Claude Code** (`.mcp.json` in your project root, or `~/.claude.json`):
329
350
 
@@ -370,7 +391,7 @@ node bin/nexuscrew.js serve
370
391
 
371
392
  ## Status
372
393
 
373
- The current stable release is **v0.8.9**. npm **`latest`**, the GitHub tag and the release
394
+ The current stable release is **v0.8.10**. npm **`latest`**, the GitHub tag and the release
374
395
  assets are promoted from the same verified artifact.
375
396
 
376
397
  ## License