@bongos/core 1.19.572 → 1.19.573
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/.bongos-core.json
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.19.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.573",
|
|
6
|
+
"core_contract": "1.19.573",
|
|
7
|
+
"source_commit": "4dac3d1041574ffba78b27c7586c270a75f23d2a",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-
|
|
9
|
+
"built_at": "2026-09-07T01:25:15.478Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 450,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 2516,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "3b3601c11e3adbff7e0520361632f5bebe355f1da99cdbc8f67b773da63a87d0",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
{
|
|
113
113
|
"path": ".claude/skills/builder-start/SKILL.md",
|
|
114
114
|
"mode": "0000644",
|
|
115
|
-
"sha256": "
|
|
115
|
+
"sha256": "5f67e62add4e4d2dd1d6cc26702d0b278dda25158a805b98f4da26541e92d749"
|
|
116
116
|
},
|
|
117
117
|
{
|
|
118
118
|
"path": ".claude/skills/builder-sync/SKILL.md",
|
|
@@ -2692,7 +2692,7 @@
|
|
|
2692
2692
|
{
|
|
2693
2693
|
"path": "docs/module-api-changelog.md",
|
|
2694
2694
|
"mode": "0000644",
|
|
2695
|
-
"sha256": "
|
|
2695
|
+
"sha256": "0b6c38bb0ded3d36a7024229c993f6d3271772f582af4b2b9aa2633805e55329"
|
|
2696
2696
|
},
|
|
2697
2697
|
{
|
|
2698
2698
|
"path": "docs/modules-contract.md",
|
|
@@ -7547,12 +7547,12 @@
|
|
|
7547
7547
|
{
|
|
7548
7548
|
"path": "package-lock.json",
|
|
7549
7549
|
"mode": "0000644",
|
|
7550
|
-
"sha256": "
|
|
7550
|
+
"sha256": "18bdddc767294c810ce9ee48f2e3dd0f56b4e4ac796762654ec092e1ca6a3d4d"
|
|
7551
7551
|
},
|
|
7552
7552
|
{
|
|
7553
7553
|
"path": "package.json",
|
|
7554
7554
|
"mode": "0000644",
|
|
7555
|
-
"sha256": "
|
|
7555
|
+
"sha256": "8b5e28c08069f6c10abad7791bac3829918e1fd7a2b8d5a126e6bcbb9348591b"
|
|
7556
7556
|
},
|
|
7557
7557
|
{
|
|
7558
7558
|
"path": "public-docs/index.html",
|
|
@@ -8782,7 +8782,7 @@
|
|
|
8782
8782
|
{
|
|
8783
8783
|
"path": "scripts/gds/start.js",
|
|
8784
8784
|
"mode": "0000644",
|
|
8785
|
-
"sha256": "
|
|
8785
|
+
"sha256": "81c60afdec1b7b05babe1eceaad38e0f27b932bef74e9dcb2cd3782c58524e30"
|
|
8786
8786
|
},
|
|
8787
8787
|
{
|
|
8788
8788
|
"path": "scripts/gds/status.js",
|
|
@@ -9252,7 +9252,7 @@
|
|
|
9252
9252
|
{
|
|
9253
9253
|
"path": "src/module-api.js",
|
|
9254
9254
|
"mode": "0000644",
|
|
9255
|
-
"sha256": "
|
|
9255
|
+
"sha256": "6f2d2cf5cb0bbe6626a121ee87675ed9596875e644221aa0c4e21b14cdc0bbfc"
|
|
9256
9256
|
},
|
|
9257
9257
|
{
|
|
9258
9258
|
"path": "src/module-loader/catalog.js",
|
|
@@ -12302,7 +12302,7 @@
|
|
|
12302
12302
|
{
|
|
12303
12303
|
"path": "tests/start_env_guard.mjs",
|
|
12304
12304
|
"mode": "0000644",
|
|
12305
|
-
"sha256": "
|
|
12305
|
+
"sha256": "9b0a7d7aeb761cb6fb0c5e1ae650e0848af12e92887ebd630814b35b434c1f41"
|
|
12306
12306
|
},
|
|
12307
12307
|
{
|
|
12308
12308
|
"path": "tests/start_rebase_warning.mjs",
|
|
@@ -31,8 +31,13 @@ Delivery is now deterministic (task 1288). The **card-delivery hook** (`.claude/
|
|
|
31
31
|
|
|
32
32
|
`/builder-start` is frequently the **first** command run in a freshly-cloned instance, where the local environment isn't set up yet. In that state the script can't produce a card — so **route the builder to the one missing step instead of surfacing a raw error**. Match what you see and relay the single fix, plainly:
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
> **FIRST, read WHERE THIS INSTANCE'S BOARD LIVES — `config/branding.json` → `domains.buildersOrigin`.** Every route below branches on it, and getting it wrong is worse than an error. A **remote `https://` origin** means the board is **HOSTED**: it is a running website with the builder's real tasks in it. A **`localhost`** origin means the instance is genuinely local and has to be brought up. Prescribing the local cure on a hosted instance walks the builder through three obedient steps to a board that is not theirs.
|
|
35
|
+
|
|
36
|
+
- **`bongos: command not found`, a "cannot find module" from `node scripts/gds/start.js`, or you can otherwise tell this is a fresh checkout** (a scaffolded instance whose `node_modules` is absent). The `bongos` CLI ships *inside* the not-yet-installed `@bongos/core` package, so nothing runs until deps are installed — this is the #1 fresh-clone wall. Note before prescribing anything: **`@bongos/core` is a PRIVATE package**, so a bare `npm install` **404s on any machine with no `NPM_TOKEN`**. That 404 is the expected tokenless outcome, **not** a yanked or missing version — never go hunting for "a version that still exists" to repoint the dependency at. Route by `buildersOrigin`:
|
|
37
|
+
- **Hosted (remote origin)** — lead with the fact that **nothing needs installing**: the board is a website, so open `<buildersOrigin>/builders` to see and claim work right now. The CLI is an optional second client and needs a token. **Never route to `bongos dev` here** — it stands up a *local* instance with its *own empty database*, so it cannot show the hosted board and quietly answers a different question than the one asked.
|
|
38
|
+
- **Local (`localhost` origin)** — the instance really is local: `npm install`, then `bongos dev` (one-command local bring-up), then re-run `/builder-start`.
|
|
39
|
+
Either way, don't hand-run internal scripts; the package isn't unpacked yet.
|
|
40
|
+
- **The card says the instance isn't reachable / running.** Same branch. **Hosted:** the server is not this machine's to start — check the origin is up (`curl -sI <buildersOrigin>/healthz`) and re-run; `bongos dev` cannot reach it, and starting a local instance instead would hide the outage behind an empty board. **Local:** the server was never brought up — route: `bongos dev`, then re-run. (`start.js` prints a guided card itself on a connection failure — relay it verbatim.)
|
|
36
41
|
- **Exit code 3 / "Wrong instance — refusing to act".** This machine's signed-in session targets a *different* instance than this project's `config/branding.json`. This is correct-by-design (it prevents writing to the wrong place). Route: run the exact `bongos login <origin>` line the message prints (the origin is right there), then re-run. **Do not** set an env override to force the mismatched instance.
|
|
37
42
|
- **"no Bongos session"** — the auth case above (`/builder-setup` for a first-timer, `/builder-reauth` for a stale session).
|
|
38
43
|
|
|
@@ -1593,5 +1593,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
1593
1593
|
landed since 1.19.570 with no explicit bump. run 34065943703. (task 1002620)
|
|
1594
1594
|
1.19.572 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1595
1595
|
landed since 1.19.571 with no explicit bump. run 34071078624. (task 1002620)
|
|
1596
|
+
1.19.573 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1597
|
+
landed since 1.19.572 with no explicit bump. run 34072921884. (task 1002620)
|
|
1596
1598
|
---------------------------------------------------------------------------
|
|
1597
1599
|
```
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.573",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.19.
|
|
9
|
+
"version": "1.19.573",
|
|
10
10
|
"license": "AGPL-3.0-or-later",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"express": "^4.21.2",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.573",
|
|
4
4
|
"description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"main": "src/platform-server.js",
|
package/scripts/gds/start.js
CHANGED
|
@@ -518,14 +518,56 @@ function isConnectionError(err) {
|
|
|
518
518
|
return /fetch failed|ECONNREFUSED|ENOTFOUND|EAI_AGAIN|network|socket hang up/i.test(msg);
|
|
519
519
|
}
|
|
520
520
|
|
|
521
|
+
// isLocalOrigin — does this origin name a server THIS MACHINE is supposed to run?
|
|
522
|
+
// The whole shape of the unreachable-instance advice turns on it, so it is its own
|
|
523
|
+
// named predicate rather than an inline regex (task 1003675). Anything that is not
|
|
524
|
+
// recognisably loopback is treated as REMOTE: guessing "local" for a hosted board
|
|
525
|
+
// is the failure this exists to prevent, and the remote branch degrades gracefully
|
|
526
|
+
// (it points at a URL) while the local branch would tell someone to stand up a
|
|
527
|
+
// second, empty instance.
|
|
528
|
+
function isLocalOrigin(origin) {
|
|
529
|
+
if (!origin) return true; // nothing to go on → the old local-first wording
|
|
530
|
+
let host;
|
|
531
|
+
try { host = new URL(origin).hostname.toLowerCase(); } catch (_) { return false; }
|
|
532
|
+
return host === 'localhost' || host.endsWith('.localhost')
|
|
533
|
+
|| host === '127.0.0.1' || host.startsWith('127.') || host === '::1' || host === '[::1]';
|
|
534
|
+
}
|
|
535
|
+
|
|
521
536
|
// The guided "instance isn't running" card. Markdown (never leads with `<`), so
|
|
522
|
-
// the builder-start skill relays it verbatim even in --widget mode.
|
|
523
|
-
//
|
|
524
|
-
//
|
|
537
|
+
// the builder-start skill relays it verbatim even in --widget mode.
|
|
538
|
+
//
|
|
539
|
+
// It branches on WHERE THE BOARD LIVES, because the same words are actively
|
|
540
|
+
// harmful in the two cases (task 1003675 — the owner hit this twice on a hosted
|
|
541
|
+
// instance). A HOSTED instance is not this machine's server to start: `bongos dev`
|
|
542
|
+
// would stand up a separate LOCAL instance with its OWN EMPTY DATABASE, so a
|
|
543
|
+
// builder who follows it obediently arrives at a board that is not theirs and the
|
|
544
|
+
// real outage stays hidden behind it. The hosted branch therefore leads with the
|
|
545
|
+
// thing that needs nothing installed — the board is a website — and offers the
|
|
546
|
+
// health probe instead of a bring-up.
|
|
547
|
+
//
|
|
548
|
+
// The local branch is unchanged, and still tailors its first step to whether deps
|
|
549
|
+
// are installed: a fresh clone needs `npm install` before the `bongos` CLI (which
|
|
550
|
+
// ships inside the PRIVATE @bongos/core package) even exists.
|
|
525
551
|
function instanceNotRunningCard({ origin, depsMissing } = {}) {
|
|
526
552
|
const out = [];
|
|
527
553
|
out.push(`**builder-start — this instance isn't reachable yet**`);
|
|
528
554
|
out.push('');
|
|
555
|
+
|
|
556
|
+
if (!isLocalOrigin(origin)) {
|
|
557
|
+
out.push(`I couldn't reach \`${origin}\`. That instance is **hosted** — it isn't this machine's server to start, so there's nothing to bring up here.`);
|
|
558
|
+
out.push('');
|
|
559
|
+
out.push(`1. **The board is a website, and it needs nothing installed** — open ${origin}/builders to see and claim work right now.`);
|
|
560
|
+
out.push(`2. If that doesn't load either, the instance itself is down: \`curl -sI ${origin}/healthz\` says whether it's answering.`);
|
|
561
|
+
out.push(`3. Once it answers, re-run \`/builder-start\`.`);
|
|
562
|
+
out.push('');
|
|
563
|
+
out.push(`**Don't run \`bongos dev\` for this.** It stands up a *separate local* instance with its own empty database — it cannot show you this board, and it would hide the outage behind an empty one.`);
|
|
564
|
+
if (depsMissing) {
|
|
565
|
+
out.push('');
|
|
566
|
+
out.push(`(The \`bongos\` CLI isn't installed here. It's optional — the website above is the same board. \`@bongos/core\` is a **private** package, so installing it needs an \`NPM_TOKEN\`; a 404 without one is expected, not a missing version.)`);
|
|
567
|
+
}
|
|
568
|
+
return out.join('\n');
|
|
569
|
+
}
|
|
570
|
+
|
|
529
571
|
out.push(`I couldn't reach the Cloud Bongos instance${origin ? ` at \`${origin}\`` : ''}. On a freshly-cloned project that almost always just means it hasn't been brought up yet. To start it locally:`);
|
|
530
572
|
out.push('');
|
|
531
573
|
let n = 1;
|
|
@@ -932,4 +974,5 @@ module.exports = {
|
|
|
932
974
|
rebaseWarningWidget,
|
|
933
975
|
isConnectionError,
|
|
934
976
|
instanceNotRunningCard,
|
|
977
|
+
isLocalOrigin,
|
|
935
978
|
};
|
package/src/module-api.js
CHANGED
|
@@ -49,7 +49,7 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
|
|
|
49
49
|
// there. scripts/gds/bump-version.js still rewrites the literal below; it appends
|
|
50
50
|
// the entry to that file. Look for a version's history there, not here.
|
|
51
51
|
// ---------------------------------------------------------------------------
|
|
52
|
-
const CORE_VERSION = '1.19.
|
|
52
|
+
const CORE_VERSION = '1.19.573'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
53
53
|
|
|
54
54
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
55
55
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|
|
@@ -18,7 +18,7 @@ import { strict as assert } from 'node:assert';
|
|
|
18
18
|
import { createRequire } from 'node:module';
|
|
19
19
|
|
|
20
20
|
const require = createRequire(import.meta.url);
|
|
21
|
-
const { isConnectionError, instanceNotRunningCard } = require('../scripts/gds/start.js');
|
|
21
|
+
const { isConnectionError, instanceNotRunningCard, isLocalOrigin } = require('../scripts/gds/start.js');
|
|
22
22
|
|
|
23
23
|
let passed = 0;
|
|
24
24
|
let failed = 0;
|
|
@@ -63,9 +63,12 @@ t('always points at bongos dev and the re-run', () => {
|
|
|
63
63
|
assert.ok(card.includes('localhost:3007'), 'names the unreachable origin when known');
|
|
64
64
|
});
|
|
65
65
|
|
|
66
|
+
// The origin must be LOOPBACK: these assert the LOCAL bring-up card, and since
|
|
67
|
+
// task 1003675 a non-loopback origin selects the hosted card, which deliberately
|
|
68
|
+
// says neither of these things. `http://x` used to work here only by accident.
|
|
66
69
|
t('mentions npm install ONLY when deps are missing', () => {
|
|
67
|
-
const missing = instanceNotRunningCard({ origin: 'http://
|
|
68
|
-
const present = instanceNotRunningCard({ origin: 'http://
|
|
70
|
+
const missing = instanceNotRunningCard({ origin: 'http://localhost:3007', depsMissing: true });
|
|
71
|
+
const present = instanceNotRunningCard({ origin: 'http://localhost:3007', depsMissing: false });
|
|
69
72
|
assert.ok(missing.includes('npm install'), 'fresh clone (no deps) → npm install step');
|
|
70
73
|
assert.ok(!present.includes('npm install'), 'deps present → skip the npm install step');
|
|
71
74
|
});
|
|
@@ -79,9 +82,49 @@ t('is markdown (never leads with `<`) so the skill relays it verbatim', () => {
|
|
|
79
82
|
});
|
|
80
83
|
|
|
81
84
|
t('offers the wrong-instance escape hatch (bongos login)', () => {
|
|
82
|
-
const card = instanceNotRunningCard({ origin: 'http://
|
|
85
|
+
const card = instanceNotRunningCard({ origin: 'http://localhost:3007', depsMissing: false });
|
|
83
86
|
assert.ok(/bongos login/.test(card), 'points at bongos login for a different running instance');
|
|
84
87
|
});
|
|
85
88
|
|
|
89
|
+
// --- the HOSTED branch (task 1003675) --------------------------------------
|
|
90
|
+
// A hosted instance is not this machine's server to start. Telling someone to run
|
|
91
|
+
// `bongos dev` there walks them to a SEPARATE, EMPTY local board — three obedient
|
|
92
|
+
// steps to the wrong destination, with the real outage hidden behind it. The
|
|
93
|
+
// owner hit this twice before it was fixed, so each half is pinned here.
|
|
94
|
+
t('a hosted origin never routes to bongos dev', () => {
|
|
95
|
+
for (const deps of [true, false]) {
|
|
96
|
+
const card = instanceNotRunningCard({ origin: 'https://example-instance.cloudbongos.com', depsMissing: deps });
|
|
97
|
+
assert.ok(!/^\s*\d+\.\s*`bongos dev`/m.test(card), 'must not list `bongos dev` as a step');
|
|
98
|
+
assert.ok(/Don't run `bongos dev`/.test(card), 'must say plainly not to, and why');
|
|
99
|
+
assert.ok(/empty database/.test(card), 'must name the consequence, not just forbid it');
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
t('a hosted origin leads with the board being a website that needs no install', () => {
|
|
104
|
+
const card = instanceNotRunningCard({ origin: 'https://example-instance.cloudbongos.com', depsMissing: true });
|
|
105
|
+
assert.ok(card.includes('https://example-instance.cloudbongos.com/builders'), 'hands over the actual board URL');
|
|
106
|
+
assert.ok(/nothing installed/.test(card), 'says it needs nothing installed');
|
|
107
|
+
assert.ok(/healthz/.test(card), 'offers the health probe instead of a bring-up');
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
t('a hosted origin explains the private-package 404 rather than implying a lost version', () => {
|
|
111
|
+
const card = instanceNotRunningCard({ origin: 'https://example-instance.cloudbongos.com', depsMissing: true });
|
|
112
|
+
assert.ok(/private/i.test(card) && /NPM_TOKEN/.test(card), 'names the real cause of a tokenless install failure');
|
|
113
|
+
assert.ok(/not a missing version/.test(card), 'kills the "go find a version that still exists" wild goose chase');
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
t('isLocalOrigin: loopback is local, everything else is remote', () => {
|
|
117
|
+
for (const o of ['http://localhost:3000', 'http://app.localhost:3000', 'http://127.0.0.1:3000', 'http://[::1]:3000']) {
|
|
118
|
+
assert.equal(isLocalOrigin(o), true, `${o} should be local`);
|
|
119
|
+
}
|
|
120
|
+
for (const o of ['https://example-instance.cloudbongos.com', 'http://x', 'https://10.0.0.5']) {
|
|
121
|
+
assert.equal(isLocalOrigin(o), false, `${o} should be remote`);
|
|
122
|
+
}
|
|
123
|
+
// Unknown → the old local-first wording; unparseable → treated as remote, which
|
|
124
|
+
// degrades to a URL rather than to "stand up a second instance".
|
|
125
|
+
assert.equal(isLocalOrigin(''), true, 'no origin at all → keep the local wording');
|
|
126
|
+
assert.equal(isLocalOrigin('not a url'), false, 'unparseable → remote (fail toward the safer card)');
|
|
127
|
+
});
|
|
128
|
+
|
|
86
129
|
console.log(`\nstart_env_guard: ${passed} passed, ${failed} failed`);
|
|
87
130
|
if (failed > 0) process.exitCode = 1;
|