crewbus 10.0.4 → 10.0.6
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 +19 -0
- package/README.md +2 -2
- package/bin/crewbus.js +106 -0
- package/bin/lib/web.js +2 -2
- package/docs/VERSION_SKEW.md +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,25 @@
|
|
|
4
4
|
|
|
5
5
|
- Package is now published as unscoped `crewbus` (v10.0.2): `npm i -g crewbus`.
|
|
6
6
|
|
|
7
|
+
## 10.0.6 (2026-10-13)
|
|
8
|
+
|
|
9
|
+
PATCH RELEASE: Dashboard client hotfix. No board-schema change (`board.json` stays v2).
|
|
10
|
+
|
|
11
|
+
- **Fixed a `SyntaxError` that killed the entire dashboard script block at load**:
|
|
12
|
+
- The command-palette entry `label:'Install 'crewbus' CLI in PATH'` used `\'` escapes inside the server's template literal, which Node evaluates before serving — browsers received unescaped quotes and refused to parse anything.
|
|
13
|
+
- Present since the palette landed; first shipped in v10.0.5, so every web/desktop user on 10.0.5 was affected.
|
|
14
|
+
- Regression test: the suite now fetches `/` and `node --check`s the rendered client script.
|
|
15
|
+
|
|
16
|
+
## 10.0.5 (2026-10-12)
|
|
17
|
+
|
|
18
|
+
PATCH RELEASE: Self-update command. No board-schema change (`board.json` stays v2); additive CLI surface only.
|
|
19
|
+
|
|
20
|
+
- **`crewbus update [--check] [--yes] [--version x.y.z]`**:
|
|
21
|
+
- Version check via `npm view <own-name>@latest version`, install via `npm install -g` — registry, auth, and proxy come from the user's npm config, never hardcoded.
|
|
22
|
+
- Package name always read from our own `package.json` (never argv); `--version` accepts strict `x.y.z` only.
|
|
23
|
+
- `--check` reports only; bare `update` refuses off-TTY without `--yes` (install scripts execute from the network); source checkouts are refused with `git pull` guidance.
|
|
24
|
+
- Already-latest and newer-than-registry are no-ops; explicit pins allow downgrades; post-install note covers the old-code process restart + `init --force` for wiring.
|
|
25
|
+
|
|
7
26
|
## 10.0.4 (2026-10-12)
|
|
8
27
|
|
|
9
28
|
PATCH RELEASE: Briefs view + gather endpoint, task-scoped spawn rosters, and mobile brief/thread/watcher screens. No board-schema change (`board.json` stays v2); all additions backward-compatible.
|
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# crewbus v10.0.
|
|
1
|
+
# crewbus v10.0.6 — DM bus
|
|
2
2
|
|
|
3
3
|
[](https://github.com/eamonpluto/crewbus/actions/workflows/ci.yml)
|
|
4
4
|
|
|
@@ -55,7 +55,7 @@ env overrides below.)
|
|
|
55
55
|
Layout: `board.json`, `agents/<name>.json`, `dm/<recipient>/<id>.json`,
|
|
56
56
|
`delivered/<recipient>/<id>.json` (push markers, written by the plugin).
|
|
57
57
|
|
|
58
|
-
Versions: `package.json` (currently 10.0.
|
|
58
|
+
Versions: `package.json` (currently 10.0.6) is the source of truth for the
|
|
59
59
|
release version. `board.json`'s `version: 2` is the **board schema version**
|
|
60
60
|
(a different number on purpose — do not "align" them). New to the project?
|
|
61
61
|
Start with `docs/QUICKSTART.md` (5 minutes).
|
package/bin/crewbus.js
CHANGED
|
@@ -6326,6 +6326,10 @@ Setup:
|
|
|
6326
6326
|
project-local surface (claude/opencode/cursor); codex/grok/antigravity
|
|
6327
6327
|
are skipped (TOML or global-only surfaces — see docs/COMPATIBILITY.md).
|
|
6328
6328
|
Nothing else is widened.
|
|
6329
|
+
crewbus update [--check] [--yes] [--version x.y.z]
|
|
6330
|
+
self-update the global npm install to the registry latest
|
|
6331
|
+
(--check reports only; needs --yes off-TTY; runs the published
|
|
6332
|
+
install scripts — same trust as npm i -g crewbus)
|
|
6329
6333
|
|
|
6330
6334
|
Identity (first claim wins, token after that):
|
|
6331
6335
|
crewbus register --from <you> [--session <opencode-session-id>] [--token <t>] [--expires-in <dur>] [--service]
|
|
@@ -7337,6 +7341,107 @@ function cmdInstallCli() {
|
|
|
7337
7341
|
}
|
|
7338
7342
|
}
|
|
7339
7343
|
|
|
7344
|
+
// Self-update support: which package did this process install as? Read
|
|
7345
|
+
// from our own package.json next to bin/crewbus.js — the name is never
|
|
7346
|
+
// taken from argv, so there is no `update <other-pkg>` confusion/abuse.
|
|
7347
|
+
function ownPackage() {
|
|
7348
|
+
try {
|
|
7349
|
+
const here = path.dirname(path.resolve(process.argv[1] || ""));
|
|
7350
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(here, "..", "package.json"), "utf8"));
|
|
7351
|
+
if (pkg && typeof pkg.name === "string" && typeof pkg.version === "string") {
|
|
7352
|
+
return { name: pkg.name, version: pkg.version, dir: path.resolve(path.join(here, "..")) };
|
|
7353
|
+
}
|
|
7354
|
+
} catch {}
|
|
7355
|
+
return null;
|
|
7356
|
+
}
|
|
7357
|
+
|
|
7358
|
+
// Zero-dep semver compare (release parts only; prerelease suffixes compare
|
|
7359
|
+
// equal — `npm view` reports the latest stable tag, so suffixes never meet
|
|
7360
|
+
// in the check path; --version pins accept them verbatim).
|
|
7361
|
+
function cmpSemver(a, b) {
|
|
7362
|
+
const parts = (s) => String(s || "").trim().replace(/^[=v]/, "").split(".").map((x) => {
|
|
7363
|
+
const n = Number(String(x).split("-")[0]);
|
|
7364
|
+
return Number.isInteger(n) && n >= 0 ? n : 0;
|
|
7365
|
+
});
|
|
7366
|
+
const pa = parts(a);
|
|
7367
|
+
const pb = parts(b);
|
|
7368
|
+
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
|
|
7369
|
+
const d = (pa[i] || 0) - (pb[i] || 0);
|
|
7370
|
+
if (d !== 0) return d > 0 ? 1 : -1;
|
|
7371
|
+
}
|
|
7372
|
+
return 0;
|
|
7373
|
+
}
|
|
7374
|
+
|
|
7375
|
+
function cmdUpdate(args) {
|
|
7376
|
+
const checkOnly = args.includes("--check");
|
|
7377
|
+
const yes = args.includes("--yes");
|
|
7378
|
+
const wantRaw = getFlag(args, "--version");
|
|
7379
|
+
if (wantRaw !== undefined && !/^\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?$/.test(String(wantRaw).trim())) {
|
|
7380
|
+
fail(`--version must be a plain x.y.z version (got "${wantRaw}") — no tags, URLs, or ranges`);
|
|
7381
|
+
}
|
|
7382
|
+
const own = ownPackage();
|
|
7383
|
+
if (!own) fail("cannot determine the installed package (no package.json next to the CLI) — reinstall with: npm i -g crewbus");
|
|
7384
|
+
try {
|
|
7385
|
+
if (fs.existsSync(path.join(own.dir, ".git"))) {
|
|
7386
|
+
fail(`running from a source checkout at ${own.dir} — update it with: git pull (npm would install the registry copy elsewhere; the global CLI is a separate install)`);
|
|
7387
|
+
}
|
|
7388
|
+
} catch (e) {
|
|
7389
|
+
if (e && e.message && e.message.startsWith("running from a source checkout")) throw e;
|
|
7390
|
+
}
|
|
7391
|
+
// The user's own npm: registry, auth, proxy and cache all come from
|
|
7392
|
+
// their npm config — never hardcoded here. shell:true on Windows so the
|
|
7393
|
+
// npm.cmd shim resolves (same convention as probeBinary in lib/launch.js).
|
|
7394
|
+
const npmShell = process.platform === "win32";
|
|
7395
|
+
try {
|
|
7396
|
+
execFileSync("npm", ["--version"], { stdio: ["ignore", "pipe", "pipe"], timeout: 15000, shell: npmShell });
|
|
7397
|
+
} catch {
|
|
7398
|
+
fail("npm was not found on PATH — install Node.js/npm first, or update manually: npm i -g crewbus@latest");
|
|
7399
|
+
}
|
|
7400
|
+
let latest = "";
|
|
7401
|
+
try {
|
|
7402
|
+
latest = String(execFileSync("npm", ["view", `${own.name}@latest`, "version"], { stdio: ["ignore", "pipe", "pipe"], timeout: 30000, shell: npmShell }) || "").trim();
|
|
7403
|
+
} catch {
|
|
7404
|
+
latest = "";
|
|
7405
|
+
}
|
|
7406
|
+
if (!latest) fail(`could not reach the npm registry (offline?) — latest ${own.name} version unknown; retry with network, or install explicitly: npm i -g ${own.name}@<x.y.z>`);
|
|
7407
|
+
const want = wantRaw !== undefined ? String(wantRaw).trim() : latest;
|
|
7408
|
+
const cmp = cmpSemver(own.version, want);
|
|
7409
|
+
if (cmp === 0) {
|
|
7410
|
+
console.log(`crewbus ${own.version} installed${wantRaw !== undefined ? ` (requested ${want})` : `, ${latest} latest`} — already up to date [board n/a]`);
|
|
7411
|
+
return;
|
|
7412
|
+
}
|
|
7413
|
+
if (cmp > 0 && wantRaw === undefined) {
|
|
7414
|
+
console.log(`crewbus ${own.version} installed is newer than registry latest ${latest} (dev install?) — nothing to do [board n/a]`);
|
|
7415
|
+
return;
|
|
7416
|
+
}
|
|
7417
|
+
if (checkOnly) {
|
|
7418
|
+
console.log(`crewbus ${own.version} installed, ${want} available — re-run without --check to update [board n/a]`);
|
|
7419
|
+
return;
|
|
7420
|
+
}
|
|
7421
|
+
const direction = cmp < 0 ? "upgrade" : "downgrade";
|
|
7422
|
+
if (!yes) {
|
|
7423
|
+
if (process.stdin && process.stdin.isTTY) {
|
|
7424
|
+
process.stderr.write(`This ${direction}s ${own.name} ${own.version} → ${want} via "npm install -g" (runs the published package's install scripts). Type "yes" to continue: `);
|
|
7425
|
+
let answer = "";
|
|
7426
|
+
try {
|
|
7427
|
+
answer = String(fs.readFileSync(0, "utf8") || "").trim().toLowerCase();
|
|
7428
|
+
} catch {}
|
|
7429
|
+
if (answer !== "yes" && answer !== "y") fail("update refused (confirmation not given) — re-run with --yes to confirm");
|
|
7430
|
+
} else {
|
|
7431
|
+
fail(`refusing to self-update non-interactively without --yes (npm install -g executes the published package's install scripts) — re-run with --yes to confirm`);
|
|
7432
|
+
}
|
|
7433
|
+
}
|
|
7434
|
+
console.log(`${direction === "upgrade" ? "Updating" : "Downgrading"} ${own.name} ${own.version} → ${want} (npm install -g ${own.name}@${want})…`);
|
|
7435
|
+
try {
|
|
7436
|
+
execFileSync("npm", ["install", "-g", `${own.name}@${want}`], { stdio: "inherit", timeout: 300000, shell: npmShell });
|
|
7437
|
+
} catch (e) {
|
|
7438
|
+
const detail = String((e && e.message) || e);
|
|
7439
|
+
const busy = /EBUSY|EPERM/i.test(detail);
|
|
7440
|
+
fail(`npm install failed: ${detail.slice(0, 300)}${busy ? " — close running crewbus processes (web/serve/listen/watchers holding the install open) and retry" : ""}`);
|
|
7441
|
+
}
|
|
7442
|
+
console.log(`updated to ${want} — this process is still the old code: restart your terminal (and any crewbus web/serve/listen processes), then re-run init --force in your projects to refresh harness wiring [board n/a]`);
|
|
7443
|
+
}
|
|
7444
|
+
|
|
7340
7445
|
async function main() {
|
|
7341
7446
|
const [, , cmd, ...rest] = process.argv;
|
|
7342
7447
|
if (REMOVED.has(cmd)) {
|
|
@@ -7345,6 +7450,7 @@ async function main() {
|
|
|
7345
7450
|
switch (cmd) {
|
|
7346
7451
|
case "init": return cmdInit(rest);
|
|
7347
7452
|
case "install-cli": return cmdInstallCli();
|
|
7453
|
+
case "update": return cmdUpdate(rest);
|
|
7348
7454
|
case "register": return cmdRegister(rest);
|
|
7349
7455
|
case "acl": return cmdAcl(rest);
|
|
7350
7456
|
case "agents": return cmdAgents(rest);
|
package/bin/lib/web.js
CHANGED
|
@@ -636,7 +636,7 @@ details.tech-details summary{cursor:pointer;font-weight:500;user-select:none}
|
|
|
636
636
|
<button data-nav="sec-launch" class="active">Launch</button>
|
|
637
637
|
<button data-nav="sec-boards">Boards</button>
|
|
638
638
|
<button data-nav="sec-briefs">Briefs</button>
|
|
639
|
-
<button data-nav="sec-crews">Crews</button>
|
|
639
|
+
<button data-nav="sec-crews">Crews</button>
|
|
640
640
|
<button data-nav="sec-fleet">Fleet</button>
|
|
641
641
|
<button data-nav="sec-channels">Channels</button>
|
|
642
642
|
<button data-nav="sec-triage">Triage</button>
|
|
@@ -1425,7 +1425,7 @@ function paletteSections(){
|
|
|
1425
1425
|
{kind:'action',label:'Copy board path',action:'copyboard'},
|
|
1426
1426
|
{kind:'action',label:'Open project folder…',action:'openfolder'},
|
|
1427
1427
|
{kind:'action',label:'Pair mobile client (QR)…',action:'pairmobile'},
|
|
1428
|
-
{kind:'action',label:
|
|
1428
|
+
{kind:'action',label:"Install 'crewbus' CLI in PATH",action:'installcli'},
|
|
1429
1429
|
{kind:'action',label:'Refresh board state',action:'refresh'},
|
|
1430
1430
|
{kind:'section',label:'Launch',id:'sec-launch'},
|
|
1431
1431
|
{kind:'section',label:'Boards',id:'sec-boards'},
|
package/docs/VERSION_SKEW.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Version skew (mixed-relay operation)
|
|
2
2
|
|
|
3
|
-
How crewbus versions interoperate. Evidence: `package.json:2` (`10.0.
|
|
3
|
+
How crewbus versions interoperate. Evidence: `package.json:2` (`10.0.6`),
|
|
4
4
|
`CHANGELOG.md` (10.0.0 2026-10-08; 7.0.0 2026-10-05; 6.4.0–6.0.0; 4.1.0/4.0.0 baseline).
|
|
5
5
|
Capabilities: `RELAY_CAPS` + `launch` per `packages/contracts/board-caps.json:6-8`.
|
|
6
6
|
Cell behavior is the NEW side's verified behavior (`bin/lib/sync.js` refs);
|