@bongos/core 1.25.7 → 1.25.8

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.
@@ -134,6 +134,9 @@ function githubChecklist(status, appSlug, facts = {}) {
134
134
  // what "is alive" waits for — device flow is optional by design
135
135
  connected: approve === 'done' && install === 'done' && signIn === 'done',
136
136
  wired_elsewhere: elsewhere,
137
+ // GitHub sent the founder back from the install page (or they asked for a check) and
138
+ // the runner has not confirmed it yet: the page shows the step as being checked
139
+ install_checking: install !== 'done' && !!(facts.installReportedAt || facts.checkRequestedAt),
137
140
  };
138
141
  }
139
142
 
@@ -533,7 +533,10 @@ body:has(#view-new:not([hidden])) footer.foot{position:relative;z-index:1;backgr
533
533
  .setFact .optional{margin-left:8px;font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:uppercase;color:var(--ink-faint);}
534
534
  .setFact.done .d{background:color-mix(in srgb,var(--ok) 12%,transparent);color:var(--ok);border-color:var(--ok);}
535
535
  .setFact.done .t,.setFact.now .t,.setFact.you .t{color:var(--ink);}
536
- .setFact.now .d{border:2px solid var(--accent);}
536
+ .setFact.now .d{border:2px solid var(--accent);border-top-color:transparent;animation:factSpin 1s linear infinite;}
537
+ /* a loading wheel is essential, so it turns even with reduced motion (slower, no pulse) */
538
+ @media (prefers-reduced-motion:reduce){.setFact.now .d{animation-duration:2s;}}
539
+ @keyframes factSpin{to{transform:rotate(360deg)}}
537
540
  .setFact.you .d{background:color-mix(in srgb,var(--accent) 16%,transparent);border-color:color-mix(in srgb,var(--accent) 60%,transparent);color:var(--ink);}
538
541
  .setFact.bad .d{background:color-mix(in srgb,var(--err) 10%,transparent);color:var(--err);border-color:var(--err);}
539
542
  .setFact.bad .t{color:var(--err);}
@@ -548,8 +551,7 @@ body:has(#view-new:not([hidden])) footer.foot{position:relative;z-index:1;backgr
548
551
  .setFact .acctPick .acctTyped{margin-top:10px;}
549
552
  .setFact .acctPick .hint{min-height:0;}
550
553
  @media (prefers-reduced-motion:no-preference){
551
- .setFact.now .d{animation:factBreathe 1.4s ease-in-out infinite,factSpin 1s linear infinite;border-top-color:transparent;}
552
- @keyframes factSpin{to{transform:rotate(360deg)}}
554
+ .setFact.now .d{animation:factBreathe 1.4s ease-in-out infinite,factSpin 1s linear infinite;}
553
555
  .setNow.working::after{content:"";display:inline-block;width:1.2em;text-align:left;animation:workDots 1.4s steps(4,end) infinite;}
554
556
  @keyframes workDots{0%{content:""}25%{content:"."}50%{content:".."}75%{content:"..."}}
555
557
  @keyframes factBreathe{0%,100%{border-color:var(--accent)}50%{border-color:color-mix(in srgb,var(--accent) 35%,transparent)}}
@@ -6933,6 +6935,7 @@ summary{min-height:24px;padding:3px 0;}
6933
6935
  sentence and carries the action that fixes it, with the app GitHub already made, never a
6934
6936
  second one. live.pickUp is the server's word for what that action does (github-setup.js
6935
6937
  pickUpFor); live.verifying is whether the runner is still checking. */
6938
+ var installOpened = false; /* this page sent the founder to GitHub's install page */
6936
6939
  var ghTabTrouble = null; /* 'behind' | 'closed': what this page saw of the GitHub tab it opened */
6937
6940
  var NO_SECOND_APP = 'Nothing is lost, and no second app will be made.';
6938
6941
  function projectName() { return state.name || state.slug || 'your project'; }
@@ -7067,6 +7070,10 @@ summary{min-height:24px;padding:3px 0;}
7067
7070
  /* the runner stopped checking and GitHub never confirmed the install: the link opens the
7068
7071
  SAME app's install page, and the click asks the runner to look again */
7069
7072
  else if (live.pickUp === 'check') { install.state = 'bad'; install.sub = 'GitHub stopped before the app was on ' + (repo || 'your repo') + '.'; install.right = checked; install.act = 'pick-up-link'; install.href = installUrl; }
7073
+ /* the founder came back from GitHub's install page (GitHub reported it, or they pressed
7074
+ the link here): the runner is checking with GitHub, so the step spins until it ticks,
7075
+ and the link stays in case they never finished */
7076
+ else if ((live.setup && live.setup.install_checking) || installOpened) { install.state = 'now'; install.sub = (repo ? repo + '. ' : '') + 'Checking with GitHub. This ticks by itself.'; install.right = checked; install.act = 'install-link'; install.href = installUrl; }
7070
7077
  else { install.state = 'you'; install.right = 'not yet seen'; install.act = 'install-link'; install.href = installUrl; }
7071
7078
 
7072
7079
  var signIn = { key: 'sign_in', title: 'Builders can sign in' };
@@ -7313,6 +7320,7 @@ summary{min-height:24px;padding:3px 0;}
7313
7320
  var ib = $('installBtn'), instRow = gh[1];
7314
7321
  var instHref = instRow && instRow.state !== 'done' && homeUp && (instRow.act === 'install-link' || instRow.act === 'pick-up-link') ? installHrefOf(instRow) : '';
7315
7322
  if (instHref) ib.setAttribute('href', instHref); else ib.removeAttribute('href');
7323
+ if (!ib.getAttribute('data-wired')) { ib.setAttribute('data-wired', '1'); ib.addEventListener('click', function () { installOpened = true; paintFacts(); }); }
7316
7324
  ib.hidden = !instHref;
7317
7325
  paintSetDone(ready, home, gh);
7318
7326
  tipsRun(!ready);
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.25.7",
3
+ "version": "1.25.8",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.25.7",
9
+ "version": "1.25.8",
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.25.7",
3
+ "version": "1.25.8",
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",
@@ -11753,5 +11753,6 @@
11753
11753
  "id": "1005219",
11754
11754
  "text": "Opening the builders' hall now starts on the Game or Classic choice. Signed out, your pick takes you to sign in and then straight to that menu."
11755
11755
  }
11756
- ]
11756
+ ],
11757
+ "1.25.8": []
11757
11758
  }
package/src/module-api.js CHANGED
@@ -81,7 +81,7 @@ const { sleep } = require('./sleep');
81
81
  // MAJOR (see allowBoxScope below): passes the request through untouched.
82
82
  function deprecatedNoopMiddleware(_req, _res, next) { next(); }
83
83
 
84
- const CORE_VERSION = '1.25.7'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
84
+ const CORE_VERSION = '1.25.8'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
85
85
 
86
86
  // A namespaced logger so a module's log lines are attributable + consistent.
87
87
  // Usage: const log = api.logger('discord'); log.info('mounted');
@@ -35,7 +35,7 @@ const SCRIPT = HUB.slice(HUB.lastIndexOf('<script>'), HUB.lastIndexOf('</script>
35
35
 
36
36
  test('each step reads only what the server has seen — the honest "not yet" states included', () => {
37
37
  const none = GS.githubChecklist(null, null);
38
- assert.deepEqual(none, { approve: 'todo', install: 'todo', sign_in: 'todo', device_flow: 'todo', connected: false, wired_elsewhere: false }, 'never started');
38
+ assert.deepEqual(none, { approve: 'todo', install: 'todo', sign_in: 'todo', device_flow: 'todo', connected: false, wired_elsewhere: false, install_checking: false }, 'never started');
39
39
  assert.equal(GS.githubChecklist('pending', null).approve, 'now', 'waiting for the approval on GitHub');
40
40
  for (const s of ['code_received', 'converting']) {
41
41
  const c = GS.githubChecklist(s, null);
@@ -327,3 +327,10 @@ test('the device-flow finding lives in the direction doc, and the code points at
327
327
  assert.match(doc, /Device flow cannot be switched on for the founder \(spike, task 1004649\)/);
328
328
  assert.match(fs.readFileSync(path.join(ROOT, 'modules', 'provisioning', 'github-setup.js'), 'utf8'), /docs\/design\/project-startup-direction\.md/);
329
329
  });
330
+
331
+ test('back from the install page, the install step reads as being checked until GitHub confirms it', () => {
332
+ const { githubChecklist } = require('../modules/provisioning/github-setup.js');
333
+ assert.equal(githubChecklist('done', 'kestrel', {}).install_checking, false, 'not reported yet');
334
+ assert.equal(githubChecklist('done', 'kestrel', { installReportedAt: '2026-10-25T10:00:00Z' }).install_checking, true, 'reported, not yet seen');
335
+ assert.equal(githubChecklist('done', 'kestrel', { installReportedAt: '2026-10-25T10:00:00Z', installedAt: '2026-10-25T10:01:00Z' }).install_checking, false, 'seen: done');
336
+ });
@@ -53,7 +53,7 @@ test('the project saying sign-in works ticks sign-in, whatever the attempt row s
53
53
 
54
54
  test('without that answer, nothing changes: a pending attempt still waits on GitHub', () => {
55
55
  const c = gs.githubChecklist('pending', null, {});
56
- assert.deepEqual(c, { approve: 'now', install: 'todo', sign_in: 'todo', device_flow: 'todo', connected: false, wired_elsewhere: false });
56
+ assert.deepEqual(c, { approve: 'now', install: 'todo', sign_in: 'todo', device_flow: 'todo', connected: false, wired_elsewhere: false, install_checking: false });
57
57
  });
58
58
 
59
59
  test('with our app recorded, the answer ticks sign-in and the install keeps its own fact', () => {