@mmmbuto/nexuscrew 0.8.12 → 0.8.14
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 +90 -36
- package/frontend/dist/assets/index-BR2Qfqi2.js +91 -0
- package/frontend/dist/assets/{index-PkKeNfT7.css → index-CopPQTMk.css} +2 -2
- package/frontend/dist/index.html +2 -2
- package/frontend/dist/version.json +1 -1
- package/lib/cells/routes.js +137 -0
- package/lib/cli/service.js +18 -6
- package/lib/config.js +14 -0
- package/lib/fleet/builtin.js +243 -38
- package/lib/fleet/cell-exec.js +81 -0
- package/lib/fleet/credentials.js +135 -0
- package/lib/fleet/env-key.js +12 -0
- package/lib/fleet/launch-broker.js +136 -0
- package/lib/fleet/managed.js +139 -19
- package/lib/fleet/routes.js +16 -1
- package/lib/mcp/server.js +131 -3
- package/lib/proxy/federation.js +47 -7
- package/lib/pty/attach.js +3 -2
- package/lib/runtime/env.js +50 -0
- package/lib/server.js +26 -2
- package/lib/settings/routes.js +4 -3
- package/lib/tmux/actions.js +96 -1
- package/lib/tmux/list.js +22 -3
- package/lib/update/core.js +35 -8
- package/lib/update/manager.js +6 -3
- package/lib/update/runner.js +7 -3
- package/package.json +1 -1
- package/skills/nexuscrew-agent/SKILL.md +14 -3
- package/frontend/dist/assets/index-DrroT7uq.js +0 -91
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.
|
|
19
|
+
## What it is (v0.8.14 "Private Launch")
|
|
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
|
|
@@ -25,14 +25,19 @@ panes, windows. tmux does the work; the browser is just a faithful client.
|
|
|
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
27
|
- **Ordered Fleet roster**: desktop and mobile share the same per-location model. Local and
|
|
28
|
-
every Hydra route are independently collapsible and filterable by all, pinned, active,
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
every Hydra route are independently collapsible and filterable by all, pinned, active, off,
|
|
29
|
+
or technical. Technical tmux sessions stay out of the normal roster until explicitly shown,
|
|
30
|
+
and every location count reflects the rows actually displayed. Route-qualified pins keep
|
|
31
|
+
priority, while cells can be reordered from the dedicated handle with Pointer Events on
|
|
32
|
+
mouse, touch, or pen, or with keyboard move controls. Reorder highlights the destination,
|
|
33
|
+
scrolls at list edges, commits only on release and can be cancelled without changing the
|
|
34
|
+
saved order. The owner-qualified order survives reloads and is shared by compact and expanded
|
|
35
|
+
views. Desktop chrome and the mobile header stay fixed while their lists scroll, and the
|
|
36
|
+
compact version/endpoint/language footer remains readable on narrow screens.
|
|
33
37
|
- **Attached decks by default**: named workspaces switch as tabs inside the same PWA without
|
|
34
38
|
reloading terminals or losing a pending layout save. Use `↗` only when you want to detach a
|
|
35
|
-
deck into another browser window or monitor.
|
|
39
|
+
deck into another browser window or monitor. Every Local or remote owner group ends with its
|
|
40
|
+
own compact `+ new`, so the creation destination is explicit and never falls back elsewhere.
|
|
36
41
|
- **Federated Hydra inventory**: connect existing NexusCrew installations through the SSH
|
|
37
42
|
configuration you already control and see local, direct, and relayed tmux fleets in one UI.
|
|
38
43
|
Route labels show where every session lives; creation, attach, files, lifecycle and Fleet
|
|
@@ -47,12 +52,20 @@ panes, windows. tmux does the work; the browser is just a faithful client.
|
|
|
47
52
|
- **Cell lifecycle from the UI**: the primary `+` creates a managed Fleet cell at Local or
|
|
48
53
|
any reachable node. Power opens one shared launch sheet where engine, model, permission
|
|
49
54
|
policy and boot can be reviewed before every start; deletion lives in Settings → Fleet.
|
|
55
|
+
An immediately exiting client reports bounded, redacted diagnostics and cannot leave a
|
|
56
|
+
zero-window phantom beside the configured cell.
|
|
50
57
|
- **Legacy session adoption**: Settings → Fleet lists managed and unmanaged tmux sessions on
|
|
51
58
|
every route. A live unmanaged session can be explicitly imported as a managed cell without
|
|
52
59
|
inventing its engine, provider or model.
|
|
53
|
-
- **Selective cell backup**: export chosen cells
|
|
54
|
-
then select exactly
|
|
55
|
-
|
|
60
|
+
- **Selective cell and engine backup**: export chosen cells, reusable engine definitions,
|
|
61
|
+
engine mapping and system prompts, then select exactly what to restore. Archives contain
|
|
62
|
+
credential-variable names but never their values, provider keys or runtime session state;
|
|
63
|
+
conflicts and active cells that need a restart are reported explicitly.
|
|
64
|
+
- **Private provider credentials**: each node resolves a required key from its runtime
|
|
65
|
+
environment, compatible user-owned provider files, or an optional local write-only store.
|
|
66
|
+
The PWA can set, replace, or forget a missing key on that exact node without displaying it.
|
|
67
|
+
Values never enter Fleet definitions, backups, API responses, tmux state, process arguments,
|
|
68
|
+
temporary files, or logs.
|
|
56
69
|
- **Rich cards**: last activity, current command, a sanitized one-line preview per session.
|
|
57
70
|
- **Fleet control**: a built-in schema-driven fleet manager handles cells, engines, model
|
|
58
71
|
selection, and boot persistence; an existing external `fleet` CLI can take ownership through
|
|
@@ -70,6 +83,13 @@ panes, windows. tmux does the work; the browser is just a faithful client.
|
|
|
70
83
|
serialize installation across processes, verify the restarted runtime and roll back once
|
|
71
84
|
to the exact previous version if the new server does not become healthy. On Linux, stopping
|
|
72
85
|
or restarting the HTTP service preserves the independent shared tmux server and every session.
|
|
86
|
+
Registry checks and service processes use a stable NexusCrew working directory, so deleting
|
|
87
|
+
the directory from which NexusCrew was originally launched cannot break future updates.
|
|
88
|
+
- **Authenticated cell network**: AI cells can discover the owner-qualified Fleet directory
|
|
89
|
+
visible through the authorized Hydra topology and submit bounded text to one exact active
|
|
90
|
+
destination. Inactive cells remain visible but are never presented as queued recipients;
|
|
91
|
+
a `submitted` receipt confirms only paste plus Enter in the target TUI, not that its model
|
|
92
|
+
accepted, processed or completed the task.
|
|
73
93
|
- **Universal**: a PTY is a PTY — a coding agent, a REPL, a plain shell, anything tmux holds.
|
|
74
94
|
|
|
75
95
|
## Screenshots
|
|
@@ -107,10 +127,19 @@ The concise provider catalog is scoped per CLI:
|
|
|
107
127
|
GitHub Copilot, OpenRouter, local Ollama, DeepSeek, Z.AI, and a custom provider.
|
|
108
128
|
|
|
109
129
|
Provider credentials are resolved from the selected CLI's native login or from an environment
|
|
110
|
-
variable named in the PWA
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
130
|
+
variable named in the PWA. A named variable is read first from the service environment, then
|
|
131
|
+
from the optional node-local NexusCrew store, then—when present—from the user-owned
|
|
132
|
+
`~/.config/ai-shell/providers.zsh`, `~/.config/keys/ai.env`, or
|
|
133
|
+
`~/.config/secure/.env`, parsed strictly as assignment data and never sourced or executed.
|
|
134
|
+
The PWA shows only whether the requested name is configured and its source category; a missing
|
|
135
|
+
value can be saved locally in `~/.nexuscrew/credentials.json` under a user-owned `0700`
|
|
136
|
+
directory and `0600` file, or removed again. The store is write-only through the API and is
|
|
137
|
+
never included in config, services, Fleet backups, federation payloads, logs, or responses.
|
|
138
|
+
At launch, secret-bearing environment data crosses a private one-shot Unix socket and reaches
|
|
139
|
+
the CLI by direct process spawn; it never enters tmux environment state, argv, or a temporary
|
|
140
|
+
file. Legacy Z.AI A/P engines remain launch-compatible for existing fleets but are not provider
|
|
141
|
+
choices for new engines. Model discovery is used where the CLI/provider documents it, with a
|
|
142
|
+
manual model field as the portable fallback.
|
|
114
143
|
|
|
115
144
|
Managed engines expose a permission selector both in their definition and in the cell launch
|
|
116
145
|
sheet. New Claude engines (native, Z.AI, Ollama, or custom) default to **Bypass permissions**
|
|
@@ -123,11 +152,14 @@ auto-compaction window variables, including one-million-token profiles where dec
|
|
|
123
152
|
Custom argv-based engines remain supported. Their command, environment, cwd, and prompt are
|
|
124
153
|
validated against a strict trust boundary and launched without a shell.
|
|
125
154
|
|
|
126
|
-
Settings → Fleet also provides a selective **Cells backup** flow. The JSON file
|
|
127
|
-
portable cell definitions (cwd, engine choice, model mapping, boot flag and system
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
155
|
+
Settings → Fleet also provides a selective **Cells and engines backup** flow. The v2 JSON file
|
|
156
|
+
contains portable cell definitions (cwd, engine choice, model mapping, boot flag and system
|
|
157
|
+
prompt) plus only the selected reusable engine definitions. Custom-engine environment-variable
|
|
158
|
+
names are portable; their values, provider credentials, PWA tokens and live tmux identifiers
|
|
159
|
+
are never exported. Legacy cell-only v1 files remain importable. Restore previews conflicts,
|
|
160
|
+
lets you choose each section independently, confirms every overwrite before mutation, preserves
|
|
161
|
+
only matching values already configured on the destination, and reports which active cells need
|
|
162
|
+
a restart.
|
|
131
163
|
|
|
132
164
|
### External fleet manager
|
|
133
165
|
|
|
@@ -209,13 +241,17 @@ The link never contains an SSH key, identity file, API key or PWA token. Its onl
|
|
|
209
241
|
the random, one-time pairing invite; SSH routing fields are non-secret configuration. A
|
|
210
242
|
successful pairing creates one supervised SSH connection to the hub. Its normal `-L` channel
|
|
211
243
|
is private and provides access to the hub. The optional `-R` channel is added to that same SSH
|
|
212
|
-
process only when the user enables **Share this
|
|
213
|
-
|
|
244
|
+
process only when the user enables **Share this device through the selected hub** in the local
|
|
245
|
+
device card. The hub verifies the authenticated reverse channel before advertising the device;
|
|
246
|
+
its inbound-node controls then decide whether authorized clients see the whole network,
|
|
247
|
+
relay-only or a selected set. Both sides exchange only redacted topology.
|
|
214
248
|
|
|
215
249
|
A newly paired phone or laptop is private by default: the hub keeps it in Settings without
|
|
216
|
-
probing it as a server or showing a false red error.
|
|
217
|
-
|
|
218
|
-
|
|
250
|
+
probing it as a server or showing a false red error. Share always refers to the current local
|
|
251
|
+
device—not to the remote hub card—and uses its already selected hub connection; no direct
|
|
252
|
+
peer-to-peer SSH is required. Enabling Share makes it routable and turns authenticated
|
|
253
|
+
reverse-channel health into a real requirement; a shared node that stops responding, or a live
|
|
254
|
+
endpoint that rejects authentication, remains a real health error.
|
|
219
255
|
|
|
220
256
|
NexusCrew does not create SSH keys or edit `authorized_keys`. OpenSSH remains authoritative for
|
|
221
257
|
identity files, agents, host keys, ports, ProxyJump and forwarding policy. NexusCrew uses
|
|
@@ -228,8 +264,9 @@ PWA token never crosses a peer link.
|
|
|
228
264
|
A relay controls what its peers can see. The default is the whole network; a peer can be reduced
|
|
229
265
|
to relay-only or a selected set. HTTP and WebSocket routing enforce that policy at every hop,
|
|
230
266
|
with stable instance IDs, cycle rejection and a four-hop ceiling. Session creation, terminal,
|
|
231
|
-
files, termination,
|
|
232
|
-
transitive nodes remain listed as offline with their last-seen time while
|
|
267
|
+
files, termination, Fleet editing and authorized cell discovery work on Local or any reachable
|
|
268
|
+
route. Previously seen transitive nodes remain listed as offline with their last-seen time while
|
|
269
|
+
a relay is down.
|
|
233
270
|
|
|
234
271
|
## Install & run
|
|
235
272
|
|
|
@@ -273,7 +310,10 @@ nexuscrew
|
|
|
273
310
|
Termux uses the Android ARM64 PTY provider. The normal command starts NexusCrew in the
|
|
274
311
|
background and exits. `nexuscrew boot` installs the Termux:Boot script explicitly; install the
|
|
275
312
|
Termux:Boot app and launch it once, because Android app activation cannot be verified by the
|
|
276
|
-
CLI. `nexuscrew doctor` reports that limitation even when the script itself is valid.
|
|
313
|
+
CLI. `nexuscrew doctor` reports that limitation even when the script itself is valid. Inside
|
|
314
|
+
managed cells, npm-installed Codex and Codex-VL scripts are launched through the active Node
|
|
315
|
+
executable when their shebang depends on the unavailable `/usr/bin/env`; native executables
|
|
316
|
+
such as Pi remain direct launches.
|
|
277
317
|
|
|
278
318
|
On every platform the first run starts the server in the background and opens the PWA wizard.
|
|
279
319
|
After onboarding, the same command starts or reuses it, prints a compact status and guide, and
|
|
@@ -308,8 +348,10 @@ and the active service or detached runtime is restarted on the same loopback por
|
|
|
308
348
|
runtime fails its bounded health check, NexusCrew reinstalls the exact previous version and
|
|
309
349
|
restarts once; that failed version is then blocked from automatic retry. The updater never
|
|
310
350
|
accepts a prerelease from `latest`, never downgrades, and redacts registry credentials and local
|
|
311
|
-
paths from PWA errors.
|
|
312
|
-
|
|
351
|
+
paths from PWA errors. Registry commands run from a stable directory owned by NexusCrew and
|
|
352
|
+
accept npm's JSON scalar or plain semantic-version output. Its current state and manual
|
|
353
|
+
check/apply controls live in Settings → System. Set `NEXUSCREW_AUTO_UPDATE=0` (or `false`,
|
|
354
|
+
`no`, `off`) to disable scheduling.
|
|
313
355
|
|
|
314
356
|
On Linux, the installed service uses `KillMode=process`: service lifecycle affects NexusCrew,
|
|
315
357
|
not the shared tmux server. Existing units are protected by an atomic drop-in before any CLI or
|
|
@@ -336,8 +378,8 @@ by normal startup, help, doctor, or service output.
|
|
|
336
378
|
|
|
337
379
|
`nexuscrew mcp` runs a minimal **stdio MCP server** (JSON-RPC 2.0, one JSON message per
|
|
338
380
|
line, zero SDK dependencies) that brings NexusCrew *inside* your AI sessions. An agent
|
|
339
|
-
running in a tmux session gets
|
|
340
|
-
|
|
381
|
+
running in a tmux session gets eight tools: the cell→human channel, read-only deck context,
|
|
382
|
+
and an authenticated active-cell network:
|
|
341
383
|
|
|
342
384
|
- `nc_notify {title, body?, urgency?}` — human notification: toast on every open UI +
|
|
343
385
|
web push on subscribed devices (enable push from Settings → System).
|
|
@@ -351,13 +393,24 @@ read-only deck context:
|
|
|
351
393
|
authorized shared-owner deck that contains it. Deck identity is owner-qualified; members
|
|
352
394
|
include stable owner ID, Fleet cell name (when managed), exact tmux session and the Hydra
|
|
353
395
|
route valid from the caller. Unavailable members remain visible with `cell: null`.
|
|
396
|
+
- `nc_cells {}` — returns the owner-qualified Fleet directory visible through the caller's
|
|
397
|
+
authorized, non-stale Hydra topology. Every entry has a stable `<instanceId>:<cell>` ID,
|
|
398
|
+
exact tmux session and route, activity state and `canReceive`; duplicate cell names on
|
|
399
|
+
different devices remain unambiguous.
|
|
400
|
+
- `nc_send_cell {to, message}` — submits bounded text to one exact ID returned by `nc_cells`.
|
|
401
|
+
The caller must itself be an active local Fleet cell, the destination must still be active,
|
|
402
|
+
and every remote hop rechecks identity and ACL. There is no silent offline queue. A
|
|
403
|
+
`submitted` receipt means only that bracketed paste and a separate Enter reached the target
|
|
404
|
+
TUI; it does not mean accepted, working or completed.
|
|
354
405
|
- `nc_status {}` / `nc_inbox {}` — read-only: live sessions + fleet cells / inbox files.
|
|
355
406
|
|
|
356
407
|
The caller's identity is the tmux session name (`$TMUX` → `tmux display-message`), with
|
|
357
408
|
`NEXUSCREW_MCP_SESSION` as fallback for non-tmux contexts. The bridge talks to the local
|
|
358
|
-
HTTP API (loopback + token from `~/.nexuscrew/token`)
|
|
359
|
-
`
|
|
360
|
-
|
|
409
|
+
HTTP API (loopback + token from `~/.nexuscrew/token`). Use `nc_deck` for visual workspace
|
|
410
|
+
neighbours and `nc_cells` for the global authorized directory; use `nc_send_cell` for managed
|
|
411
|
+
cell delivery. Direct tmux injection is only a declared same-host compatibility or repair
|
|
412
|
+
fallback and must never bypass Fleet membership or Hydra ACLs. Never scrape `decks.json`
|
|
413
|
+
directly.
|
|
361
414
|
|
|
362
415
|
Register it in **Claude Code** (`.mcp.json` in your project root, or `~/.claude.json`):
|
|
363
416
|
|
|
@@ -404,8 +457,9 @@ node bin/nexuscrew.js serve
|
|
|
404
457
|
|
|
405
458
|
## Status
|
|
406
459
|
|
|
407
|
-
The current release candidate is **v0.8.
|
|
408
|
-
|
|
460
|
+
The current release candidate is **v0.8.14**. npm **`latest`** is promoted from the verified
|
|
461
|
+
artifact first; the GitHub tag and release follow the operator field test from the same source
|
|
462
|
+
candidate.
|
|
409
463
|
|
|
410
464
|
## License
|
|
411
465
|
|