@bongos/core 1.19.122 → 1.19.124

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,22 +2,22 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/gds/package-core.js",
5
- "core_version": "1.19.122",
6
- "core_contract": "1.19.122",
7
- "source_commit": "b8e5d6f6d62653ae415e42551ccb3c3c4e6c6f8a",
5
+ "core_version": "1.19.124",
6
+ "core_contract": "1.19.124",
7
+ "source_commit": "1b39368056a8f66b989d44a29bf23106497e1f61",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-08-14T21:05:40.247Z",
9
+ "built_at": "2026-08-14T21:52:54.130Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 303,
13
13
  "agent_docs_stubbed": 21,
14
- "functional_verbatim": 1244,
14
+ "functional_verbatim": 1245,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 1568,
20
- "tree_sha256": "03f0574ec4219110a53d6b8faaa4b93bcc96f0371d85d2a2e412d06d21364892",
19
+ "file_count": 1569,
20
+ "tree_sha256": "582a4f5e59904421feb7b95deaa1e4c386cf327462d0746b3b27e7160ea67abc",
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": "969a257b3ae8148774d7d64cef01f68be0eec703043a129ae34984f3399208d9"
4170
+ "sha256": "b596ffed4e442327f612e616590c1dc64e53c8b1a0ccca011b29678569f272eb"
4171
4171
  },
4172
4172
  {
4173
4173
  "path": "package.json",
4174
4174
  "mode": "0000644",
4175
- "sha256": "904c4fce25eeb089d80da1a5a0cfced1a96b99aea4f2bc28e5ce07d66bd8a880"
4175
+ "sha256": "ea424af2d952a539697392ddb1467606d5b48417f4093d9ee91eba3a818bfc87"
4176
4176
  },
4177
4177
  {
4178
4178
  "path": "public-docs/index.html",
@@ -5254,6 +5254,11 @@
5254
5254
  "mode": "0000644",
5255
5255
  "sha256": "b937f7d320afc561b5d836d4bb3b5b0a244a6e326e04c13c70d98e787bfc1d59"
5256
5256
  },
5257
+ {
5258
+ "path": "scripts/gds/seed-project-admin-console-tasks.js",
5259
+ "mode": "0000644",
5260
+ "sha256": "0aa529c70605cdaaa43b111a224b189c672da865931637ac33cf7bb300bf806e"
5261
+ },
5257
5262
  {
5258
5263
  "path": "scripts/gds/seed-provisioning-tasks.js",
5259
5264
  "mode": "0000644",
@@ -5752,7 +5757,7 @@
5752
5757
  {
5753
5758
  "path": "src/module-api.js",
5754
5759
  "mode": "0000644",
5755
- "sha256": "79041166a496039eff11ecc00334671609fadace4a54645cf2b287a5b5ff1a53"
5760
+ "sha256": "64773898c77a0786d85960b90c05b25c5148c3992561284c91d011d703745e22"
5756
5761
  },
5757
5762
  {
5758
5763
  "path": "src/module-loader/catalog.js",
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.122",
3
+ "version": "1.19.124",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.19.122",
9
+ "version": "1.19.124",
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.122",
3
+ "version": "1.19.124",
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",
@@ -0,0 +1,88 @@
1
+ // Seed the build tasks for the project admin console (BONGOS-V1, internal).
2
+ // Source of truth: docs/specs/bongos-v1-project-admin-console.md (status: draft —
3
+ // spike task 1002786's output). Idempotent on (source, source_ref); re-running
4
+ // resolves to the existing rows. The console wave is recommended as its OWN goal
5
+ // (the spec's "where it lives" section): create it with /goal-create, then re-run
6
+ // with --goal <id> to home the rows.
7
+ //
8
+ // Run: node scripts/gds/seed-project-admin-console-tasks.js [--goal <id>]
9
+ const { apiCall, requireSession, cliExit } = require('./cli-lib');
10
+ const VER = 'BONGOS-V1';
11
+ const gIdx = process.argv.indexOf('--goal');
12
+ const GOAL = gIdx >= 0 ? Number(process.argv[gIdx + 1]) : null;
13
+ const SRC = 'planning-session';
14
+
15
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
16
+ async function api(method, path, body, _tries = 0) {
17
+ await sleep(400); // base throttle to stay under the per-IP rate limit
18
+ const r = await apiCall(method, `/api/gds${path}`, body);
19
+ const json = r.data || {};
20
+ if (r.status === 429 && _tries < 8) {
21
+ const wait = ((json.error && json.error.details && json.error.details.retry_after_seconds) || 30) + 1;
22
+ console.log(` …rate-limited, waiting ${wait}s`);
23
+ await sleep(wait * 1000);
24
+ return api(method, path, body, _tries + 1);
25
+ }
26
+ return { status: r.status, ok: r.status >= 200 && r.status < 300, json };
27
+ }
28
+
29
+ // disc: engineer (backend/API/ADR) | ui (frontend). All refs per the spec's task table.
30
+ const TASKS = [
31
+ { ref: 'R1', kind: 'spike', disc: 'engineer', prio: 4, est: 120, deps: [],
32
+ title: 'R1 · ADR: the project admin console model (planes reconciled, authority local)',
33
+ desc: 'Record the spike decisions as an ADR: the instance IS the project (standalone model) so authority lives on the project instance; a recruit invite is a pre-approved access_requests row (kind=invite, status=invited — sign-in is the acceptance act, firstTimeAdmissionBlocked untouched); a new grantable project.recruit atom (floor archon) carries "which rank may recruit", with the raw admission verdict (access_request.review) staying archon; the hub role is notification/relay only, retiring the authority-less resolveInvite loop. Supersedes the ADR 0141 §5 deferred-slice note. See docs/specs/bongos-v1-project-admin-console.md.' },
34
+ { ref: 'R2', kind: 'feature', disc: 'engineer', prio: 4, est: 240, deps: ['R1'],
35
+ title: 'R2 · Instance outbound recruit: invite rows on access_requests + rescind + sender list',
36
+ desc: 'Additive migration: access_requests gains kind (application|invite), created_by, note-for-invites. POST /access-requests/invite (gated by the new project.recruit atom) inserts kind=invite status=invited so the login can sign straight in; a rescind route re-locks before first sign-in; the sender can list outstanding invites. Done-when: an archon invites a login that never applied, that login signs in; rescind re-locks; tests extend the access-requests suite. Spec: docs/specs/bongos-v1-project-admin-console.md D2.' },
37
+ { ref: 'R3', kind: 'feature', disc: 'engineer', prio: 4, est: 120, deps: ['R1'],
38
+ title: 'R3 · Governance: the project.recruit atom (floor archon, grantable) + route pins',
39
+ desc: 'catalog.js gains project.recruit (floor archon, grantable, guards naming the console routes); a governance grant migration seeds the archon role; src/bongos/route-rank-check.js gets a platform-identity/console pins block (none exists today). Done-when: granting metic via the existing /governance UI lets a metic send an invite on that instance, revoking re-locks. Spec D3.' },
40
+ { ref: 'R4', kind: 'feature', disc: 'ui', prio: 4, est: 300, deps: ['R2', 'R3'],
41
+ title: 'R4 · The console page: applications + invites + settings on the project hall',
42
+ desc: 'New hall page on the project instance following watch.js (page floor + per-section 403-degrade) and settings.html (section rail) patterns: the applications queue (absorbing The Watch\'s access-requests section — Watch keeps the count tile linking over), outgoing invites with rescind, the join-policy toggle, and a "who may recruit" pointer into /governance. Done-when: one page shows both queues with working act buttons. Spec §Where it lives.' },
43
+ { ref: 'R5', kind: 'feature', disc: 'engineer', prio: 3, est: 120, deps: ['R1'],
44
+ title: 'R5 · Join policy: open|closed enforced at the public application door',
45
+ desc: 'An instance setting join_policy (open|closed) read by the public POST /access-requests — closed refuses with honest copy; the hub join relay surfaces the same truth on the button. Flipping takes effect without deploy. Four-state visibility stays with goal 1000046 (deferred per spec). Done-when: a closed project cannot be applied to, and the UI says why, both venues.' },
46
+ { ref: 'R6', kind: 'feature', disc: 'engineer', prio: 3, est: 180, deps: ['R2'],
47
+ title: 'R6 · Hub loop repair: invites notify the hub; accept = go sign in; rescind cleans both',
48
+ desc: 'The instance invite (R2) seeds the hub pending-membership row as a NOTIFICATION so the invitee sees it in My Projects; accepting links to the project sign-in (admission already granted instance-side); rescind cleans both sides. Retire the dead-end resolveInvite accept semantics (today accepting a hub invite admits nobody). Done-when: no state where an accepted invite leads to a locked door. Spec D2.' },
49
+ { ref: 'R7', kind: 'feature', disc: 'ui', prio: 3, est: 90, deps: ['R4'],
50
+ title: 'R7 · Apex entry: "Manage members" on the mine-view card links to the console',
51
+ desc: 'public-landing/projects.html ?view=mine: each owned project card grows a "Manage members" link to that project\'s own hall console (cross-host, riding the ADR 0141 SSO path). The one goal-1000059-surface touch this wave makes. Done-when: an owner clicks from cloudbongos.com/projects into their project\'s console signed in.' },
52
+ ];
53
+
54
+ (async () => {
55
+ await requireSession(); // friendly guidance (not a stack trace) when signed out
56
+ const idByRef = {};
57
+ let created = 0, existing = 0;
58
+ console.log(`Seeding ${TASKS.length} console tasks (${VER}${GOAL ? `, goal ${GOAL}` : ', no goal — re-run with --goal after /goal-create'})…`);
59
+ for (const t of TASKS) {
60
+ const body = {
61
+ version_id: VER, title: t.title, description: t.desc,
62
+ kind: t.kind, discipline: t.disc, priority: t.prio, est_minutes: t.est,
63
+ source: SRC, source_ref: `admin-console-${t.ref}`,
64
+ };
65
+ if (GOAL) body.goal_id = GOAL;
66
+ const r = await api('POST', '/tasks', body);
67
+ if (!r.ok) { console.log(` ${t.ref}: FAILED ${r.status} ${JSON.stringify(r.json)}`); continue; }
68
+ const task = r.json.task || r.json;
69
+ idByRef[t.ref] = task.id;
70
+ if (r.json.idempotent || r.json.existing) existing++; else created++;
71
+ console.log(` ${t.ref} → task ${task.id} (${t.kind}/${t.disc}, P${t.prio})`);
72
+ }
73
+
74
+ console.log('Wiring dependencies…');
75
+ let edges = 0;
76
+ for (const t of TASKS) {
77
+ if (!t.deps.length) continue;
78
+ const id = idByRef[t.ref];
79
+ const depIds = t.deps.map((d) => idByRef[d]).filter(Boolean);
80
+ if (!id || depIds.length !== t.deps.length) { console.log(` ${t.ref}: dep resolve gap, skipping`); continue; }
81
+ const r = await api('POST', `/tasks/${id}/dependencies`, { depends_on_task_ids: depIds });
82
+ if (!r.ok) { console.log(` ${t.ref}: dep FAILED ${r.status} ${JSON.stringify(r.json)}`); continue; }
83
+ edges += depIds.length;
84
+ console.log(` ${t.ref} depends on ${t.deps.join(',')}`);
85
+ }
86
+ console.log(`Done: ${created} created, ${existing} existing, ${edges} dependency edges.`);
87
+ cliExit(0); // never process.exit() after a request (scripts/gds/CLAUDE.md — the win/async.c abort)
88
+ })();
package/src/module-api.js CHANGED
@@ -671,8 +671,12 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
671
671
  // landed since 1.19.120 with no explicit bump. run 31838955115. (task 1002620)
672
672
  // 1.19.122 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
673
673
  // landed since 1.19.121 with no explicit bump. run 31840810826. (task 1002620)
674
+ // 1.19.123 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
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)
674
678
  // ---------------------------------------------------------------------------
675
- const CORE_VERSION = '1.19.122'; // CI auto-patch carrier (ADR 0161); see changelog above
679
+ const CORE_VERSION = '1.19.124'; // CI auto-patch carrier (ADR 0161); see changelog above
676
680
 
677
681
  // A namespaced logger so a module's log lines are attributable + consistent.
678
682
  // Usage: const log = api.logger('dev-box'); log.info('mounted');