@mmmbuto/nexuscrew 0.9.63 → 0.9.64

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
@@ -2,6 +2,12 @@
2
2
 
3
3
  All notable changes to NexusCrew are tracked here.
4
4
 
5
+ ## 0.9.64 — 2026-10-07
6
+
7
+ - **The active quick list hides stopped cells.** The active mode keeps only live cells and active degraded rows, regardless of each node's saved all or pinned preference; ordering and pins remain intact.
8
+ - **Live has its own directory identity.** A persisted thread registry exposes a reserved Live entry, verifies message labels against the current thread, and removes entries only when the matching thread is gone. The interface shows a Live badge while a thread exists.
9
+ - **Public source and packages use neutral examples.** The README no longer includes screenshots, internal work references have been removed from public files, and source and package checks enforce the publication boundary.
10
+
5
11
  ## 0.9.63 — 2026-10-07
6
12
 
7
13
  - **Sidebar node names keep their own row.** The mode filter sits below the node name and aligns to the right, leaving the name readable without changing the node controls.
package/README.md CHANGED
@@ -19,10 +19,6 @@ stay yours, and your infrastructure stays under your control.
19
19
  > in what order, and what not to do. Every other NexusCrew skill assumes it,
20
20
  > and this README alone does not replace it.
21
21
 
22
- <p align="center">
23
- <img src="docs/img/fleet-deck-desktop.png" width="960" alt="NexusCrew desktop deck with multiple live tmux sessions">
24
- </p>
25
-
26
22
  ## One control plane. Every screen.
27
23
 
28
24
  The desktop deck keeps the whole fleet visible. Open any cell from a phone and
@@ -39,12 +35,6 @@ routed Fleet state while open, keeps a degraded cell visible as a warning, and
39
35
  has an explicit all-cells view when you need the complete inventory instead of
40
36
  a quick switch.
41
37
 
42
- <p align="center">
43
- <img src="docs/img/session-mobile.png" width="360" alt="NexusCrew mobile terminal connected to a real tmux session with touch controls">
44
- <br>
45
- <sub><strong>Real tmux on mobile.</strong> Terminal keys, dictation and file handoff stay within reach.</sub>
46
- </p>
47
-
48
38
  ## Install in 30 seconds
49
39
 
50
40
  Install the package globally:
@@ -117,20 +107,18 @@ session ownership to tmux.
117
107
 
118
108
  ### Pair only devices you own
119
109
 
120
- **A paired node is trusted as you are.** Pairing today grants a node the same
121
- authority over this machine that you have: it can create sessions, attach to
110
+ **A paired admin node is trusted as you are.** The `admin` access preset grants
111
+ a node the same authority over this machine that you have: it can create sessions, attach to
122
112
  them and type into them as the user running NexusCrew, define engines and cells,
123
- and read what the fleet exposes. There is no lesser class of peer yet.
113
+ and read what the fleet exposes. The `user` and `nexushost` access presets grant
114
+ less authority.
124
115
 
125
116
  Pair your own devices, and only those. Do not accept a pairing invite from
126
- someone else's installation, and do not hand one out expecting it to grant less
127
- than everything.
128
-
129
- This is a property of the current design, not an oversight: NexusCrew was built
130
- to put one person's machines on one control plane. Supporting a node that
131
- belongs to somebody else needs per-node authority that can be granted and
132
- revoked — a capability model, not a setting. It is on the roadmap and it is not
133
- here yet.
117
+ someone else's installation. Choose the access preset deliberately: `admin`
118
+ grants owner-equivalent authority; `user` and `nexushost` grant less.
119
+
120
+ Federated ASK creation and closure are delivered only to configured `admin`
121
+ peers, hop by hop: each hub applies this rule to its own next peer.
134
122
 
135
123
  Remote access is intentionally carried through SSH or a VPN you control:
136
124
 
package/docs/SECURITY.md CHANGED
@@ -86,9 +86,9 @@ their path is inserted into the terminal without automatically pressing Enter.
86
86
 
87
87
  ## Pairing and sharing
88
88
 
89
- **Pairing grants owner-equivalent authority. Pair only devices you own.**
89
+ **A paired admin node is trusted as you are. Pair only devices you own.**
90
90
 
91
- A paired node can create tmux sessions — including a shell — attach to them over
91
+ A node with the `admin` access preset can create tmux sessions — including a shell — attach to them over
92
92
  the federated WebSocket and write into them as the user running NexusCrew. It
93
93
  can define engines and cells, and a custom engine may name an existing
94
94
  executable with arguments of its choosing: the trust gate checks the binary's
@@ -98,9 +98,14 @@ Admission is the exception. Minting a pairing invite is not federated: an invite
98
98
  belongs to the installation that will host the new node, so it is issued there,
99
99
  locally. A paired node cannot admit a third party on your behalf.
100
100
 
101
- This is a deliberate boundary, not a defect list. NexusCrew was designed to put
102
- one person's machines on one control plane, and it treats a paired node the way
103
- it treats you.
101
+ The `user` preset grants event and file-read access, without administrative
102
+ operations or ASK replies. The `nexushost` preset grants no cell visibility or
103
+ those access rights. Choose the preset on the installation that owns the
104
+ resources. An `admin` peer is trusted as you are; the other presets grant less.
105
+
106
+ Federated ASK creation and closure go only to configured `admin` peers, hop by
107
+ hop. Each hub checks its own next peer before forwarding. This rule does not
108
+ change generic notifications or the relay of ASK replies.
104
109
 
105
110
  ### Cell scope
106
111
 
@@ -123,13 +128,9 @@ be able to create the cell it was not granted. The terminal attach is gated
123
128
  with the same predicate, and a tmux session that maps to no cell is outside
124
129
  every scope.
125
130
 
126
- What the scope does **not** change: the pairing itself is still
127
- owner-equivalent for everything it governs, and the granted cells are granted
128
- fully — inside its scope a node still creates sessions, attaches to them and
129
- writes into them as the user running NexusCrew. It attenuates reach, not the
130
- authority held within that reach. A capability model with proof of possession —
131
- authority granted, attenuated and revoked as a token rather than as
132
- configuration — remains on the roadmap and is not implemented.
131
+ Cell scope limits the cells a peer can reach; the access preset also limits
132
+ what it can do. Neither is a sandbox for an executable launched with
133
+ administrative authority.
133
134
 
134
135
  So: do not accept a pairing invite from an installation you do not own, and do
135
136
  not treat a cell scope as a sandbox for code you do not trust. It is a
@@ -1,4 +1,4 @@
1
- .nc-icon{display:block;flex:0 0 auto}.nc-popup-velo{position:fixed;top:0;right:0;bottom:0;left:0;z-index:60;display:flex;align-items:center;justify-content:center;padding:2vmin;background:#0000009e}.nc-popup{display:flex;flex-direction:column;width:min(1100px,96vw);height:min(820px,92vh);overflow:hidden;position:relative;border:1px solid var(--nc-border, #1f3f2f);border-radius:10px;background:var(--nc-bg, #0b0f0d);box-shadow:0 10px 40px #0000008c}.nc-popup-testa{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;border-bottom:1px solid var(--nc-border, #1f3f2f);flex:0 0 auto}.nc-popup-titolo{display:flex;align-items:baseline;gap:8px;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:600}.nc-popup-sub{opacity:.65;font-weight:400;font-size:.82em}.nc-popup-chiudi{flex:0 0 auto;min-width:40px;min-height:40px;border:1px solid var(--nc-border, #1f3f2f);border-radius:8px;background:transparent;color:inherit;cursor:pointer}.nc-popup-corpo{flex:1 1 auto;min-height:0;position:relative;overflow:auto}.nc-popup-corpo>iframe,.nc-popup-corpo>.nc-cellpanel{width:100%;height:100%;border:0}.nc-popup-libera{position:fixed;z-index:2}.nc-popup-angolo{position:absolute;right:0;bottom:0;width:18px;height:18px;cursor:nwse-resize;z-index:3}.nc-popup-angolo:after{content:"";position:absolute;right:4px;bottom:4px;width:8px;height:8px;border-right:2px solid var(--nc-border, #1f3f2f);border-bottom:2px solid var(--nc-border, #1f3f2f)}.nc-popup-velo-drag{position:fixed;top:0;right:0;bottom:0;left:0;z-index:4;background:transparent;cursor:grabbing}@media(max-width:720px){.nc-popup-velo{padding:0}.nc-popup{width:100vw;height:100vh;border:0;border-radius:0}.nc-popup-angolo{display:none}}/**
1
+ .nc-icon{display:block;flex:0 0 auto}.nc-live-badge{flex:0 0 auto;padding:1px 6px;border:1px solid #2e7d32;border-radius:8px;background:#0d2410;color:#7fe0a0;font:700 10px/1.4 inherit;letter-spacing:.4px}.nc-live-badge[data-mode=tmux]{border-color:#8a7a2e;background:#241f0d;color:#e0d27f}.nc-popup-velo{position:fixed;top:0;right:0;bottom:0;left:0;z-index:60;display:flex;align-items:center;justify-content:center;padding:2vmin;background:#0000009e}.nc-popup{display:flex;flex-direction:column;width:min(1100px,96vw);height:min(820px,92vh);overflow:hidden;position:relative;border:1px solid var(--nc-border, #1f3f2f);border-radius:10px;background:var(--nc-bg, #0b0f0d);box-shadow:0 10px 40px #0000008c}.nc-popup-testa{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;border-bottom:1px solid var(--nc-border, #1f3f2f);flex:0 0 auto}.nc-popup-titolo{display:flex;align-items:baseline;gap:8px;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:600}.nc-popup-sub{opacity:.65;font-weight:400;font-size:.82em}.nc-popup-chiudi{flex:0 0 auto;min-width:40px;min-height:40px;border:1px solid var(--nc-border, #1f3f2f);border-radius:8px;background:transparent;color:inherit;cursor:pointer}.nc-popup-corpo{flex:1 1 auto;min-height:0;position:relative;overflow:auto}.nc-popup-corpo>iframe,.nc-popup-corpo>.nc-cellpanel{width:100%;height:100%;border:0}.nc-popup-libera{position:fixed;z-index:2}.nc-popup-angolo{position:absolute;right:0;bottom:0;width:18px;height:18px;cursor:nwse-resize;z-index:3}.nc-popup-angolo:after{content:"";position:absolute;right:4px;bottom:4px;width:8px;height:8px;border-right:2px solid var(--nc-border, #1f3f2f);border-bottom:2px solid var(--nc-border, #1f3f2f)}.nc-popup-velo-drag{position:fixed;top:0;right:0;bottom:0;left:0;z-index:4;background:transparent;cursor:grabbing}@media(max-width:720px){.nc-popup-velo{padding:0}.nc-popup{width:100vw;height:100vh;border:0;border-radius:0}.nc-popup-angolo{display:none}}/**
2
2
  * Copyright (c) 2014 The xterm.js authors. All rights reserved.
3
3
  * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
4
4
  * https://github.com/chjj/term.js