@bongos/core 1.19.123 → 1.19.125

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.123",
6
- "core_contract": "1.19.123",
7
- "source_commit": "a6d67f3e96b267de3803ac4305bc2060d724a3aa",
5
+ "core_version": "1.19.125",
6
+ "core_contract": "1.19.125",
7
+ "source_commit": "669cdd43ff95a6612999a3456ff5b68cdf8ccfd0",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-08-14T21:28:48.371Z",
9
+ "built_at": "2026-08-14T23:11:49.244Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 303,
@@ -17,7 +17,7 @@
17
17
  "gate": "passed"
18
18
  },
19
19
  "file_count": 1569,
20
- "tree_sha256": "e97bc4c41910c65bf8345eb53a384aa27b6dfa94b0537edca00d08b1cfc5da53",
20
+ "tree_sha256": "5310661ece545602d2be2b0c77f859959a02816dded3aeb8c6da211aaef421e9",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/blocker-review/SKILL.md",
@@ -4167,12 +4167,12 @@
4167
4167
  {
4168
4168
  "path": "package-lock.json",
4169
4169
  "mode": "0000644",
4170
- "sha256": "c9ed5cce824f84d002912a2c08791277ceb9db54cd5a88ad9e889cb8eea14a89"
4170
+ "sha256": "9d8c84867fb0a2470c1597ff6932dd8099f69ecbdaeddf1a8a2761d7e7e14cbd"
4171
4171
  },
4172
4172
  {
4173
4173
  "path": "package.json",
4174
4174
  "mode": "0000644",
4175
- "sha256": "d912eb0648770594fb7134ec646e5e30fc5155f582e6929195204530f1478389"
4175
+ "sha256": "d9d1ace99af356b2d7c958b93d94d14bb144eafdf8c75a0b7dd42ca50727a5a1"
4176
4176
  },
4177
4177
  {
4178
4178
  "path": "public-docs/index.html",
@@ -4412,7 +4412,7 @@
4412
4412
  {
4413
4413
  "path": "public-landing/assets/cosmos.css",
4414
4414
  "mode": "0000644",
4415
- "sha256": "bd0b17f7a21120a9e754c88206bd718fdda1fce568df15441272af0b9004c7cb"
4415
+ "sha256": "368015cca5170dffd39e3fae55c8feca512df12fbb0e8f4daf3758e2aa5cf5f4"
4416
4416
  },
4417
4417
  {
4418
4418
  "path": "public-landing/buddha.png",
@@ -5757,7 +5757,7 @@
5757
5757
  {
5758
5758
  "path": "src/module-api.js",
5759
5759
  "mode": "0000644",
5760
- "sha256": "dd7a7a0501241b3e51ea2bf9fb49199940c454173df41bd086525447631277b6"
5760
+ "sha256": "7319962aeeada78ddc037f8b3eb24c6ecf42e1edd295ee4edb6cd4e0b3247e66"
5761
5761
  },
5762
5762
  {
5763
5763
  "path": "src/module-loader/catalog.js",
@@ -6267,7 +6267,7 @@
6267
6267
  {
6268
6268
  "path": "tests/cosmos_token_contrast.mjs",
6269
6269
  "mode": "0000644",
6270
- "sha256": "257acb76f7b7e8bb925b005e8a7bad96d712f0a216201aacee11762a2a2ff328"
6270
+ "sha256": "3a727fd6bf78aa8e61643fea0a9418cd67f97dee8ffc3f620673d715da2fcc38"
6271
6271
  },
6272
6272
  {
6273
6273
  "path": "tests/cost.mjs",
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.123",
3
+ "version": "1.19.125",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.19.123",
9
+ "version": "1.19.125",
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.123",
3
+ "version": "1.19.125",
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",
@@ -207,8 +207,6 @@ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32
207
207
  .lede{font-size:15.5px;color:var(--ink-soft);font-weight:500;line-height:1.55;margin-bottom:24px;max-width:62ch;}
208
208
  .lede a{color:var(--accent-deep);font-weight:700;text-decoration:none;}
209
209
  .lede a:hover{text-decoration:underline;}
210
- :root[data-mode="dark"] .lede a{color:var(--sun-lit);}
211
- @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .lede a{color:var(--sun-lit);}}
212
210
 
213
211
  /* ── buttons ── */
214
212
  .btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;cursor:pointer;font-family:var(--font-display);font-weight:700;font-size:15px;color:#fff;background:var(--accent);border:none;border-radius:999px;padding:11px 22px;text-decoration:none;box-shadow:0 10px 22px -8px color-mix(in srgb,var(--accent) 70%,transparent);transition:transform .15s ease, box-shadow .15s ease, background .15s ease;}
@@ -217,15 +215,11 @@ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32
217
215
  .btn:disabled{background:color-mix(in srgb,var(--ink) 12%,var(--bg-deep));color:color-mix(in srgb,var(--ink) 40%,var(--bg-deep));box-shadow:none;cursor:not-allowed;transform:none;}
218
216
  .btn.ghost{background:transparent;color:var(--ink-soft);box-shadow:none;border:2px solid var(--line);}
219
217
  .btn.ghost:hover{border-color:var(--accent);color:var(--accent-deep);}
220
- :root[data-mode="dark"] .btn.ghost:hover{color:var(--sun-lit);}
221
- @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .btn.ghost:hover{color:var(--sun-lit);}}
222
218
  .btn.small{font-size:13.5px;padding:8px 16px;}
223
219
  .btn.danger{background:transparent;color:var(--err);box-shadow:none;border:2px solid color-mix(in srgb,var(--err) 35%,transparent);}
224
220
  .btn.danger:hover{background:var(--err-soft);border-color:var(--err);}
225
221
  .btn .gh{width:17px;height:17px;fill:currentColor;}
226
222
  .linklike{background:none;border:none;cursor:pointer;font-family:var(--font-body);font-weight:700;font-size:13.5px;color:var(--accent-deep);text-decoration:underline;padding:6px 4px;}
227
- :root[data-mode="dark"] .linklike{color:var(--sun-lit);}
228
- @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .linklike{color:var(--sun-lit);}}
229
223
 
230
224
  /* ── chips: the one status vocabulary (direction §4). Recency rides inside
231
225
  (.rec) — "live" always says when it was last verified. ── */
@@ -233,8 +227,6 @@ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32
233
227
  .chip .cdot{width:7px;height:7px;border-radius:50%;background:var(--ink-faint);flex:0 0 auto;}
234
228
  .chip .rec{font-weight:600;opacity:0.72;font-size:11.5px;}
235
229
  .chip.busy{background:var(--accent-soft);color:var(--accent-deep);}
236
- :root[data-mode="dark"] .chip.busy{color:var(--sun-lit);}
237
- @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .chip.busy{color:var(--sun-lit);}}
238
230
  .chip.busy .cdot{background:var(--accent);animation:chipPulse 1.4s ease-in-out infinite;}
239
231
  .chip.live{background:var(--ok-soft);color:var(--ok);}
240
232
  .chip.live .cdot{background:var(--ok);}
@@ -272,17 +264,11 @@ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32
272
264
  .projName{font-family:var(--font-display);font-weight:700;font-size:19px;letter-spacing:-0.3px;}
273
265
  .projMeta{font-size:13px;font-weight:600;color:var(--ink-faint);margin-top:6px;display:flex;gap:14px;flex-wrap:wrap;}
274
266
  .projMeta code{font-family:var(--font-mono);font-size:12.5px;background:var(--bg-deep);border-radius:6px;padding:1px 6px;color:var(--accent-deep);}
275
- :root[data-mode="dark"] .projMeta code{color:var(--sun-lit);}
276
- @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .projMeta code{color:var(--sun-lit);}}
277
267
  .addr{margin-top:12px;font-size:14.5px;font-weight:600;color:var(--ink-soft);}
278
268
  .addr a{color:var(--accent-deep);font-weight:700;text-decoration:none;font-family:var(--font-mono);font-size:13.5px;}
279
- :root[data-mode="dark"] .addr a{color:var(--sun-lit);}
280
- @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .addr a{color:var(--sun-lit);}}
281
269
  .addr a:hover{text-decoration:underline;}
282
270
  .addr .none{color:var(--ink-faint);font-style:italic;}
283
271
  .addr code{font-family:var(--font-mono);font-size:13px;background:var(--bg-deep);border-radius:6px;padding:1px 7px;color:var(--accent-deep);}
284
- :root[data-mode="dark"] .addr code{color:var(--sun-lit);}
285
- @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .addr code{color:var(--sun-lit);}}
286
272
  .attach{display:flex;gap:10px;margin-top:10px;flex-wrap:wrap;}
287
273
  .attach input[type=text]{flex:1;min-width:220px;font-family:var(--font-body);font-size:15px;font-weight:600;color:var(--ink);background:var(--bg-card);border:2px solid var(--line);border-radius:12px;padding:9px 14px;outline:none;transition:border-color .15s ease, box-shadow .15s ease;}
288
274
  .attach input[type=text]::placeholder{color:var(--ink-faint);font-weight:500;}
@@ -291,8 +277,6 @@ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32
291
277
  .projMsg.ok{color:var(--ok);}
292
278
  .projMsg.err{color:var(--err);}
293
279
  .projMsg a{color:var(--accent-deep);font-weight:700;text-decoration:none;}
294
- :root[data-mode="dark"] .projMsg a{color:var(--sun-lit);}
295
- @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .projMsg a{color:var(--sun-lit);}}
296
280
  .projMsg a:hover{text-decoration:underline;}
297
281
  .projMsg details{margin-top:8px;}
298
282
  .projMsg summary{cursor:pointer;font-size:12.5px;font-weight:700;color:var(--ink-faint);}
@@ -305,8 +289,6 @@ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32
305
289
  the browser's default blue, the one colour in the page that is not ours */
306
290
  .finePrint a{color:var(--accent-deep);font-weight:700;text-decoration:none;}
307
291
  .finePrint a:hover{text-decoration:underline;}
308
- :root[data-mode="dark"] .finePrint a{color:var(--sun-lit);}
309
- @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .finePrint a{color:var(--sun-lit);}}
310
292
 
311
293
  /* ── progress strips: one visual, per-flow vocabularies (direction §4).
312
294
  Default = the sea-blue "working" look; .isLive = verified-landed green;
@@ -525,8 +507,6 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
525
507
  0 0 0 2px color-mix(in srgb,var(--accent) 55%,transparent);}
526
508
  .worldOrb[data-rel="builder"] .badge{background:var(--accent-soft);color:var(--accent-deep);
527
509
  border:1px solid color-mix(in srgb,var(--accent) 45%,transparent);}
528
- :root[data-mode="dark"] .worldOrb[data-rel="builder"] .badge{color:var(--sun-lit);}
529
- @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .worldOrb[data-rel="builder"] .badge{color:var(--sun-lit);}}
530
510
  .worldOrb .chip{transform:scale(.88);white-space:nowrap;}
531
511
 
532
512
  /* what the only-mine filter shows when you are connected to nothing. Not a
@@ -570,8 +550,6 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
570
550
  border:1px solid var(--line);color:var(--ink-faint);white-space:nowrap;}
571
551
  .tbl .pill{display:inline-block;font-family:var(--font-mono);font-size:11px;padding:3px 10px;
572
552
  border-radius:999px;background:var(--accent-soft);color:var(--accent-deep);}
573
- :root[data-mode="dark"] .tbl .pill{color:var(--sun-lit);}
574
- @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .tbl .pill{color:var(--sun-lit);}}
575
553
  .tbl td.right{text-align:right;}
576
554
  /* Nothing in an action or status cell may wrap: "Manage →" breaking after the
577
555
  space and the chip's recency dropping to a second line both read as a broken
@@ -627,8 +605,6 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
627
605
  .projCard .cardTag{font-size:14px;color:var(--ink-faint);font-weight:600;line-height:1.5;margin-bottom:14px;}
628
606
  .projCard .cardRel{display:inline-block;font-family:var(--font-mono);font-size:11px;padding:3px 10px;
629
607
  border-radius:999px;background:var(--accent-soft);color:var(--accent-deep);margin-bottom:18px;}
630
- :root[data-mode="dark"] .projCard .cardRel{color:var(--sun-lit);}
631
- @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .projCard .cardRel{color:var(--sun-lit);}}
632
608
  /* the facts strip (task 1002778): a label/value grid, centered as a block but
633
609
  read left-aligned. A hidden pair leaves no gap — the grid row collapses. */
634
610
  .projCard .cardMeta{display:grid;grid-template-columns:auto auto;justify-content:center;
@@ -679,8 +655,6 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
679
655
  font-size:14px;color:var(--ink-faint);position:relative;z-index:1;}
680
656
  .steps li.done .snum{border-color:var(--accent);background:var(--accent);color:#fff;}
681
657
  .steps li.now .snum{border-color:var(--accent);color:var(--accent-deep);}
682
- :root[data-mode="dark"] .steps li.now .snum{color:var(--sun-lit);}
683
- @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .steps li.now .snum{color:var(--sun-lit);}}
684
658
  .steps .slbl{font-size:12.5px;font-weight:700;color:var(--ink-faint);}
685
659
  .steps li.now .slbl,.steps li.done .slbl{color:var(--ink-soft);}
686
660
  .createSplit{display:grid;grid-template-columns:1fr 300px;gap:var(--pad-md);align-items:center;}
package/src/module-api.js CHANGED
@@ -673,8 +673,12 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
673
673
  // landed since 1.19.121 with no explicit bump. run 31840810826. (task 1002620)
674
674
  // 1.19.123 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
675
675
  // landed since 1.19.122 with no explicit bump. run 31842559470. (task 1002620)
676
+ // 1.19.124 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
677
+ // landed since 1.19.123 with no explicit bump. run 31844281033. (task 1002620)
678
+ // 1.19.125 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
679
+ // landed since 1.19.124 with no explicit bump. run 31849445746. (task 1002620)
676
680
  // ---------------------------------------------------------------------------
677
- const CORE_VERSION = '1.19.123'; // CI auto-patch carrier (ADR 0161); see changelog above
681
+ const CORE_VERSION = '1.19.125'; // CI auto-patch carrier (ADR 0161); see changelog above
678
682
 
679
683
  // A namespaced logger so a module's log lines are attributable + consistent.
680
684
  // Usage: const log = api.logger('dev-box'); log.info('mounted');
@@ -143,14 +143,14 @@ const PAIRS = [
143
143
  ['.btn label on its fill', '#ffffff', 'var(--accent)', 4.5],
144
144
  ['.btn.ghost:hover label', 'var(--accent-deep)', CARD, 4.5],
145
145
  ['.btn.danger label', 'var(--err)', CARD, 4.5],
146
- // Inline links: cosmos.css recolors its own to --sun-lit in dark (:179-262), but
147
- // the ?view=new wizard styles (absorbed from create.html, task 1002763) carry
148
- // eleven --accent-deep consumers and zero dark rules of their own, so there the
149
- // token itself must carry dark.
146
+ // Inline links, code chips, pills, the now-step number: every accent-colored
147
+ // text consumer paints --accent-deep in BOTH modes (task 1002750 deleted the
148
+ // dark --sun-lit recolors — they pinned the locked space palette over the
149
+ // branding pack, so a re-themed instance got Cloud Bongos orange links).
150
+ // The dark blocks derive --accent-deep from the pack-settable --accent.
150
151
  ['inline link on a card', 'var(--accent-deep)', CARD, 4.5],
151
152
  ['inline link on the page ground', 'var(--accent-deep)', 'var(--bg)', 4.5],
152
153
  ['code chip on --bg-deep', 'var(--accent-deep)', 'var(--bg-deep)', 4.5],
153
- ['cosmos.css dark link (--sun-lit)', 'var(--sun-lit)', CARD, 4.5, 'dark'],
154
154
  // body copy
155
155
  ['--ink body copy', 'var(--ink)', CARD, 4.5],
156
156
  ['--ink-soft secondary copy', 'var(--ink-soft)', CARD, 4.5],
@@ -162,9 +162,9 @@ const PAIRS = [
162
162
  ['.chip.live label', 'var(--ok)', 'var(--ok-soft)', 4.5],
163
163
  ['.chip.maybe label', 'var(--warn)', 'var(--warn-soft)', 4.5],
164
164
  ['.chip.down/.bad label', 'var(--err)', 'var(--err-soft)', 4.5],
165
- // .chip.busy recolors in dark (cosmos.css:194-195) — assert what each mode paints
166
- ['.chip.busy label', 'var(--accent-deep)', 'var(--accent-soft)', 4.5, 'light'],
167
- ['.chip.busy label', 'var(--sun-lit)', 'var(--accent-soft)', 4.5, 'dark'],
165
+ // .chip.busy + the .tbl .pill / .cardRel / builder-badge family: accent-deep
166
+ // ink on the accent-soft tint, both modes
167
+ ['.chip.busy label', 'var(--accent-deep)', 'var(--accent-soft)', 4.5],
168
168
  // lifecycle strip: 12px/700
169
169
  ['.strip .slbl idle', 'var(--ink-faint)', CARD, 4.5],
170
170
  ['.strip .slbl now/done', 'color-mix(in srgb,var(--sea) 40%,var(--ink))', CARD, 4.5],
@@ -212,6 +212,48 @@ for (const mode of ['light', 'dark']) {
212
212
  });
213
213
  }
214
214
 
215
+ // The gate's LOCKED sky palette — deliberately absent from COLOR_VARS, so a
216
+ // branding pack can never re-theme these. Dark GROUNDS are allowed (dark mode IS
217
+ // the gate's space, by design); text painted with one shows Cloud Bongos orange
218
+ // on every re-themed instance, beside its own brand color (task 1002750; same
219
+ // class as the --chrome-accent leak in 1002749).
220
+ const LOCKED = ['sun-lit', 'gold', 'gold-soft', 'nebula', 'space-deep', 'space-mid', 'space-high'];
221
+ const LOCKED_REF = new RegExp(`var\\(\\s*--(?:${LOCKED.join('|')})\\s*[,)]`);
222
+
223
+ test('no rule paints text with the locked space palette', () => {
224
+ // The 2026-08-13 state: thirteen dark-mode pairs pinning links/chips/pills to
225
+ // --sun-lit. Property-anchored (background-color:/border-color: fills with
226
+ // their own fixed ink are fine) and value-wide, so color-mix()/fallback/padded
227
+ // spellings are caught too. Comments are stripped first — quoting the old rule
228
+ // in prose must not fail the build.
229
+ const stripped = src.replace(/\/\*[\s\S]*?\*\//g, '');
230
+ const leaks = [];
231
+ for (const m of stripped.matchAll(/(?:^|[;{\s])(color|fill|stroke)\s*:\s*([^;}]*)/g)) {
232
+ if (LOCKED_REF.test(m[2])) leaks.push(`${m[1]}:${m[2].trim()}`);
233
+ }
234
+ assert.deepEqual(leaks, [], `space-palette tokens used as text color:\n ${leaks.join('\n ')}\n`);
235
+ });
236
+
237
+ test('dark blocks never re-point a token at the locked space palette', () => {
238
+ // The seam the literal guard can't see: a dark block re-pointing a token the
239
+ // text consumers use (--accent-deep:var(--sun-lit)) paints every link orange
240
+ // while no color: declaration names a locked token — and at (0,2,0) no pack
241
+ // can ever win it back. Dark grounds that want the space look use literals.
242
+ // (The typeCard's 40%-gold-soft heading mix is fine: a per-TYPE tint in the
243
+ // light tier, where the pack still owns every brand token.)
244
+ for (const [where, block] of [
245
+ [':root[data-mode="dark"]', darkExplicit],
246
+ ['the prefers-color-scheme twin', darkMedia],
247
+ ]) {
248
+ for (const [name, value] of Object.entries(block)) {
249
+ assert.ok(
250
+ !LOCKED_REF.test(value),
251
+ `${where}: ${name}:${value} references a locked space-palette token`
252
+ );
253
+ }
254
+ }
255
+ });
256
+
215
257
  test('the two dark blocks stay in lockstep', () => {
216
258
  // cosmos.css carries dark twice — an explicit data-mode hook and a
217
259
  // prefers-color-scheme twin. A change to one and not the other is the