@bongos/core 1.19.96 → 1.19.97

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.96",
6
- "core_contract": "1.19.96",
7
- "source_commit": "de62c4bfbfbe46d6479fdfbfb97dc0873611c6a5",
5
+ "core_version": "1.19.97",
6
+ "core_contract": "1.19.97",
7
+ "source_commit": "98de965667e063aac8e2bd2de7a3d05f588aa7b5",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-08-13T22:10:53.979Z",
9
+ "built_at": "2026-08-13T22:16:31.509Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 298,
@@ -17,7 +17,7 @@
17
17
  "gate": "passed"
18
18
  },
19
19
  "file_count": 1549,
20
- "tree_sha256": "fc9aca20647400c8086abd620cf8832fdc20b5695b0dc56bb6cae9c303d41182",
20
+ "tree_sha256": "5057e83f784804f0af10e3b926390ed83212d7b23656b12359d5bdfd429caa25",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/blocker-review/SKILL.md",
@@ -4127,12 +4127,12 @@
4127
4127
  {
4128
4128
  "path": "package-lock.json",
4129
4129
  "mode": "0000644",
4130
- "sha256": "5e745806419d6f06345f86548e6dab1997086a56087f87e06172fab999df9203"
4130
+ "sha256": "20f03a27edf41b5de61cd36c58e61d2e0acad8cfc68a4bfa23c19786ead8e1f1"
4131
4131
  },
4132
4132
  {
4133
4133
  "path": "package.json",
4134
4134
  "mode": "0000644",
4135
- "sha256": "5f0a6df46c69e1584b8ed6a9023858fbb769114c5912dcb87448effd645fe6b4"
4135
+ "sha256": "136d49d62b377412dcb7ad5884c8a7ca439bfc41544be3d3a5233a4cd11100e7"
4136
4136
  },
4137
4137
  {
4138
4138
  "path": "public-docs/index.html",
@@ -4392,7 +4392,7 @@
4392
4392
  {
4393
4393
  "path": "public-landing/projects.html",
4394
4394
  "mode": "0000644",
4395
- "sha256": "a79a9a26b3e33b539d3731c3629a6e4302352f9e89559e42df6bf5801dd86ef6"
4395
+ "sha256": "3a77a5f30acaa793ef82b434bf6a87033d580923231f7e66673cdc533a6767d1"
4396
4396
  },
4397
4397
  {
4398
4398
  "path": "public-landing/world/assets/clouds/cloud-island-large.png",
@@ -5702,7 +5702,7 @@
5702
5702
  {
5703
5703
  "path": "src/module-api.js",
5704
5704
  "mode": "0000644",
5705
- "sha256": "aae1ee2bdf9de2e173d26cfa7c1ad4af1b2f14e8be763903d70af840a08b1465"
5705
+ "sha256": "4b6c32f29637b84b0e11cd7e0fb7394e4f33d9b520f63c8c34c94de33aa65449"
5706
5706
  },
5707
5707
  {
5708
5708
  "path": "src/module-loader/loader.js",
@@ -7212,7 +7212,7 @@
7212
7212
  {
7213
7213
  "path": "tests/projects_hub.mjs",
7214
7214
  "mode": "0000644",
7215
- "sha256": "59a6bcd44d374802b31e8ccf487b8fbbf6322d6bfac7f079d69f39d7bd8a02db"
7215
+ "sha256": "cffae7809fb64eec684987895dc2b82b7de758cd950bea5d013cb210db3c6220"
7216
7216
  },
7217
7217
  {
7218
7218
  "path": "tests/provision.mjs",
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.96",
3
+ "version": "1.19.97",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.19.96",
9
+ "version": "1.19.97",
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.96",
3
+ "version": "1.19.97",
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",
@@ -457,13 +457,30 @@ try{var _m=localStorage.getItem('cb-color-mode');if(_m==='light'||_m==='dark')do
457
457
  $('markPrefix').textContent = prefix;
458
458
  if (REDUCED || prefix !== 'cloud' || word !== 'bongos') return;
459
459
  var PREFIXES = ['cloud', 'claude', 'chatgpt', 'gemini'];
460
- var wi = 0, ci = PREFIXES[0].length, dir = -1;
461
- setInterval(function () {
462
- ci += dir;
463
- if (ci <= 0) { dir = 1; wi = (wi + 1) % PREFIXES.length; ci = 0; }
464
- else if (ci >= PREFIXES[wi].length) { dir = -1; ci = PREFIXES[wi].length; }
465
- $('markPrefix').textContent = PREFIXES[wi].slice(0, ci);
466
- }, 190);
460
+
461
+ /* Type, HOLD, erase — the landing hero's cadence (index.html), not a
462
+ symmetric ping-pong. The single reversing interval this replaced turned
463
+ around on the very tick it completed a word, so `claude bongos` finished
464
+ and was already being deleted: the reader never got to see the word the
465
+ whole animation exists to show. A hold is the only part of the cycle that
466
+ carries meaning; the typing is just how it arrives.
467
+
468
+ `cloud` rests longest because it is the real wordmark and the state the
469
+ mark should sit in most — the others are the joke, and the joke lands
470
+ once. Same two numbers the hero uses, so the two surfaces read as one
471
+ system rather than two animations that happen to share a font. */
472
+ var TYPE = 72, ERASE = 38, HOLD = 900, HOLD_HOME = 2100;
473
+ var el = $('markPrefix'), wi = 0;
474
+ (function cycle() {
475
+ var w = PREFIXES[wi++ % PREFIXES.length], i = 0;
476
+ (function type() {
477
+ if (i <= w.length) { el.textContent = w.slice(0, i++); setTimeout(type, TYPE); }
478
+ else setTimeout(function erase() {
479
+ if (el.textContent.length) { el.textContent = el.textContent.slice(0, -1); setTimeout(erase, ERASE); }
480
+ else cycle();
481
+ }, w === 'cloud' ? HOLD_HOME : HOLD);
482
+ })();
483
+ })();
467
484
  })();
468
485
 
469
486
  /* ══ THE MAP ═══════════════════════════════════════════════════════════════
package/src/module-api.js CHANGED
@@ -619,8 +619,10 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
619
619
  // landed since 1.19.94 with no explicit bump. run 31746921919. (task 1002620)
620
620
  // 1.19.96 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
621
621
  // landed since 1.19.95 with no explicit bump. run 31748829423. (task 1002620)
622
+ // 1.19.97 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
623
+ // landed since 1.19.96 with no explicit bump. run 31749223878. (task 1002620)
622
624
  // ---------------------------------------------------------------------------
623
- const CORE_VERSION = '1.19.96'; // CI auto-patch carrier (ADR 0161); see changelog above
625
+ const CORE_VERSION = '1.19.97'; // CI auto-patch carrier (ADR 0161); see changelog above
624
626
 
625
627
  // A namespaced logger so a module's log lines are attributable + consistent.
626
628
  // Usage: const log = api.logger('dev-box'); log.info('mounted');
@@ -271,3 +271,39 @@ test('the count includes the platform when it is shown', () => {
271
271
  'the count must not ignore the self entry it is rendering beside');
272
272
  assert.match(SCRIPT, /var shown = list\.length \+ \(selfShown \? 1 : 0\)/);
273
273
  });
274
+
275
+ /* ── The wordmark's cadence (task 1002765) ──────────────────────────────────
276
+ The mark completed a word and erased it on the same tick, so the word the
277
+ animation exists to show was never legible. Owner-reported, twice. ── */
278
+
279
+ test('the wordmark HOLDS the finished word before erasing it', () => {
280
+ const mark = (SCRIPT.match(/function typeMark\(\)([\s\S]*?)\n \}\)\(\);/) || [, ''])[1];
281
+ assert.ok(mark, 'typeMark() must exist');
282
+ // the regression shape: one interval that flips direction the moment it
283
+ // completes a word, so there is no dwell at full length
284
+ assert.doesNotMatch(mark, /setInterval/,
285
+ 'a single reversing interval cannot hold — it turns around on the tick it completes');
286
+ assert.match(mark, /HOLD\s*=\s*\d+/, 'the hold must be a named duration, not an accident of timing');
287
+ // and it must actually be a pause worth reading, not a couple of frames
288
+ const hold = Number((mark.match(/HOLD\s*=\s*(\d+)/) || [, 0])[1]);
289
+ assert.ok(hold >= 600, `the hold must be legible; got ${hold}ms`);
290
+ });
291
+
292
+ test('the wordmark rests on the real product name, not on a joke', () => {
293
+ const mark = (SCRIPT.match(/function typeMark\(\)([\s\S]*?)\n \}\)\(\);/) || [, ''])[1];
294
+ assert.match(mark, /w === 'cloud' \? HOLD_HOME : HOLD/,
295
+ 'the canonical prefix should dwell longest — it is the wordmark, the others are the gag');
296
+ const home = Number((mark.match(/HOLD_HOME\s*=\s*(\d+)/) || [, 0])[1]);
297
+ const hold = Number((mark.match(/HOLD\s*=\s*(\d+)/) || [, 0])[1]);
298
+ assert.ok(home > hold, 'the resting state must outlast the alternates');
299
+ });
300
+
301
+ test('the hub and the landing hero share one typing cadence', () => {
302
+ // two surfaces, one system — a divergence here is a visible inconsistency
303
+ const LANDING = fs.readFileSync(path.join(ROOT, 'public-landing', 'index.html'), 'utf8');
304
+ const heroHolds = [...LANDING.matchAll(/\?\s*(\d+)\s*:\s*(\d+)\)/g)].map(m => [m[1], m[2]]).flat();
305
+ const mark = (SCRIPT.match(/function typeMark\(\)([\s\S]*?)\n \}\)\(\);/) || [, ''])[1];
306
+ for (const n of [mark.match(/HOLD_HOME\s*=\s*(\d+)/)[1], mark.match(/HOLD\s*=\s*(\d+)/)[1]]) {
307
+ assert.ok(heroHolds.includes(n), `hold ${n}ms should match the hero's cadence (${heroHolds.join('/')})`);
308
+ }
309
+ });