@bongos/core 1.19.98 → 1.19.100
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 +38 -23
- package/clients/bongos-client/index.d.ts +1 -1
- package/docs/adr/0167-module-catalog-source-vs-provenance.md +44 -0
- package/docs/adr/README.md +1 -0
- package/docs/api/openapi.json +2 -0
- package/docs/file-map.md +2 -0
- package/docs/modules-contract.md +2 -0
- package/modules/hall-ui/public/modules.css +30 -1
- package/modules/hall-ui/public/modules.html +24 -13
- package/modules/hall-ui/public/modules.js +86 -25
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/module.js +135 -1
- package/src/bongos/routes/modules.js +23 -24
- package/src/module-api.js +5 -1
- package/src/module-loader/catalog.js +217 -0
- package/src/platform-server.js +47 -1
- package/tests/module_catalog.mjs +304 -0
- package/tests/public_landing_projects.mjs +59 -0
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.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.100",
|
|
6
|
+
"core_contract": "1.19.100",
|
|
7
|
+
"source_commit": "7b80b662d17af4b1be962ab5d755604ad8a8723f",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-13T22:
|
|
9
|
+
"built_at": "2026-08-13T22:46:41.158Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
|
-
"docs_redacted":
|
|
12
|
+
"docs_redacted": 299,
|
|
13
13
|
"agent_docs_stubbed": 21,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 1232,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 1552,
|
|
20
|
+
"tree_sha256": "9a68e40f31c8eeee4090d108b208194fa3338756974d81dcc6a967456a3715b7",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -367,7 +367,7 @@
|
|
|
367
367
|
{
|
|
368
368
|
"path": "clients/bongos-client/index.d.ts",
|
|
369
369
|
"mode": "0000644",
|
|
370
|
-
"sha256": "
|
|
370
|
+
"sha256": "e7bc974c5ea756d1c197c1c8e52b902049af23e335149ff76e1ade248eb623d1"
|
|
371
371
|
},
|
|
372
372
|
{
|
|
373
373
|
"path": "clients/bongos-client/index.mjs",
|
|
@@ -1309,6 +1309,11 @@
|
|
|
1309
1309
|
"mode": "0000644",
|
|
1310
1310
|
"sha256": "bb187a29953ba5c316977f09fe86e26ca200693b23cf5c41ece93e9dd24f337e"
|
|
1311
1311
|
},
|
|
1312
|
+
{
|
|
1313
|
+
"path": "docs/adr/0167-module-catalog-source-vs-provenance.md",
|
|
1314
|
+
"mode": "0000644",
|
|
1315
|
+
"sha256": "fb36d5641ff0829a453815351cbf790d56982089558854a97ec18bebecca8949"
|
|
1316
|
+
},
|
|
1312
1317
|
{
|
|
1313
1318
|
"path": "docs/adr/0168-scaffold-packs-installed-core.md",
|
|
1314
1319
|
"mode": "0000644",
|
|
@@ -1317,7 +1322,7 @@
|
|
|
1317
1322
|
{
|
|
1318
1323
|
"path": "docs/adr/README.md",
|
|
1319
1324
|
"mode": "0000644",
|
|
1320
|
-
"sha256": "
|
|
1325
|
+
"sha256": "fad8c85a5e99cb222616afcdc2efaa139f3795e1a71f13f9f6fac2cf0bacddef"
|
|
1321
1326
|
},
|
|
1322
1327
|
{
|
|
1323
1328
|
"path": "docs/api-reference.md",
|
|
@@ -1327,7 +1332,7 @@
|
|
|
1327
1332
|
{
|
|
1328
1333
|
"path": "docs/api/openapi.json",
|
|
1329
1334
|
"mode": "0000644",
|
|
1330
|
-
"sha256": "
|
|
1335
|
+
"sha256": "2cb65f1332abf4cb1a232df38caedf38399f34edd7058b27458b75e51cd564c7"
|
|
1331
1336
|
},
|
|
1332
1337
|
{
|
|
1333
1338
|
"path": "docs/architecture.md",
|
|
@@ -1452,7 +1457,7 @@
|
|
|
1452
1457
|
{
|
|
1453
1458
|
"path": "docs/file-map.md",
|
|
1454
1459
|
"mode": "0000644",
|
|
1455
|
-
"sha256": "
|
|
1460
|
+
"sha256": "e4df7e072247c388228632abf5cb2ed0fdae535d09ea06c4f87e9bcae056769e"
|
|
1456
1461
|
},
|
|
1457
1462
|
{
|
|
1458
1463
|
"path": "docs/handoff-template.md",
|
|
@@ -1462,7 +1467,7 @@
|
|
|
1462
1467
|
{
|
|
1463
1468
|
"path": "docs/modules-contract.md",
|
|
1464
1469
|
"mode": "0000644",
|
|
1465
|
-
"sha256": "
|
|
1470
|
+
"sha256": "23df6c619e715cf6dab1890a27b3885f624f006407bc89f2f90664c32aa6c7fa"
|
|
1466
1471
|
},
|
|
1467
1472
|
{
|
|
1468
1473
|
"path": "docs/onboarding/browser-terminal-guide.md",
|
|
@@ -3202,17 +3207,17 @@
|
|
|
3202
3207
|
{
|
|
3203
3208
|
"path": "modules/hall-ui/public/modules.css",
|
|
3204
3209
|
"mode": "0000644",
|
|
3205
|
-
"sha256": "
|
|
3210
|
+
"sha256": "2d97352fa1b8d11dc29e83f824faf9cc14ffe8b1977d02bf8824d87cbc4a9c78"
|
|
3206
3211
|
},
|
|
3207
3212
|
{
|
|
3208
3213
|
"path": "modules/hall-ui/public/modules.html",
|
|
3209
3214
|
"mode": "0000644",
|
|
3210
|
-
"sha256": "
|
|
3215
|
+
"sha256": "0d24557440ae02e3aba8e70246ce1e25d5e3ba5ad2c6c53643749062ec2bd5a8"
|
|
3211
3216
|
},
|
|
3212
3217
|
{
|
|
3213
3218
|
"path": "modules/hall-ui/public/modules.js",
|
|
3214
3219
|
"mode": "0000644",
|
|
3215
|
-
"sha256": "
|
|
3220
|
+
"sha256": "9df48fd541deabb6765cb622fc00f829edc4d6605c746f28a6d76cbfc07e22ad"
|
|
3216
3221
|
},
|
|
3217
3222
|
{
|
|
3218
3223
|
"path": "modules/hall-ui/public/my-projects.html",
|
|
@@ -4127,12 +4132,12 @@
|
|
|
4127
4132
|
{
|
|
4128
4133
|
"path": "package-lock.json",
|
|
4129
4134
|
"mode": "0000644",
|
|
4130
|
-
"sha256": "
|
|
4135
|
+
"sha256": "0d50d0845267723058ce6795117975622643fe75f7fc8314bcc1e47a5660fd7e"
|
|
4131
4136
|
},
|
|
4132
4137
|
{
|
|
4133
4138
|
"path": "package.json",
|
|
4134
4139
|
"mode": "0000644",
|
|
4135
|
-
"sha256": "
|
|
4140
|
+
"sha256": "fb9adb2ceb26de87deae215aa38c85b6408a5d7b8555a090482357044bd938eb"
|
|
4136
4141
|
},
|
|
4137
4142
|
{
|
|
4138
4143
|
"path": "public-docs/index.html",
|
|
@@ -4962,7 +4967,7 @@
|
|
|
4962
4967
|
{
|
|
4963
4968
|
"path": "scripts/gds/module.js",
|
|
4964
4969
|
"mode": "0000644",
|
|
4965
|
-
"sha256": "
|
|
4970
|
+
"sha256": "1ae452fc21ade9a39d7b0f9e13825f45e4a3402eddb1cbfee3c2d63ba35dd5df"
|
|
4966
4971
|
},
|
|
4967
4972
|
{
|
|
4968
4973
|
"path": "scripts/gds/newcomer-floor.config.json",
|
|
@@ -5642,7 +5647,7 @@
|
|
|
5642
5647
|
{
|
|
5643
5648
|
"path": "src/bongos/routes/modules.js",
|
|
5644
5649
|
"mode": "0000644",
|
|
5645
|
-
"sha256": "
|
|
5650
|
+
"sha256": "54a42c37d4afd403a13aa5e9fda6a7d95cb0fca70dfe3cb4daef318c099a5f00"
|
|
5646
5651
|
},
|
|
5647
5652
|
{
|
|
5648
5653
|
"path": "src/bongos/routes/optimizer.js",
|
|
@@ -5702,7 +5707,12 @@
|
|
|
5702
5707
|
{
|
|
5703
5708
|
"path": "src/module-api.js",
|
|
5704
5709
|
"mode": "0000644",
|
|
5705
|
-
"sha256": "
|
|
5710
|
+
"sha256": "4ac4d646de8c683999e2767139efbcee06b0f05d5435707e281bca8498081aa8"
|
|
5711
|
+
},
|
|
5712
|
+
{
|
|
5713
|
+
"path": "src/module-loader/catalog.js",
|
|
5714
|
+
"mode": "0000644",
|
|
5715
|
+
"sha256": "a1af1014d2face153e6e0a93fff67a479faee452f3cdf3d0fbeaee3bf2e933ee"
|
|
5706
5716
|
},
|
|
5707
5717
|
{
|
|
5708
5718
|
"path": "src/module-loader/loader.js",
|
|
@@ -5737,7 +5747,7 @@
|
|
|
5737
5747
|
{
|
|
5738
5748
|
"path": "src/platform-server.js",
|
|
5739
5749
|
"mode": "0000644",
|
|
5740
|
-
"sha256": "
|
|
5750
|
+
"sha256": "6ffe23398bc452b4224e7c4aa49dbd3c4f61a61da0fd51d43bb6c5ce0bd51aa7"
|
|
5741
5751
|
},
|
|
5742
5752
|
{
|
|
5743
5753
|
"path": "src/ui/adapters/claude-design/index.js",
|
|
@@ -7004,6 +7014,11 @@
|
|
|
7004
7014
|
"mode": "0000644",
|
|
7005
7015
|
"sha256": "f9142ae695964882ef4d6c4b83fec12c9ab32d0e31b3135333c27d695afb3262"
|
|
7006
7016
|
},
|
|
7017
|
+
{
|
|
7018
|
+
"path": "tests/module_catalog.mjs",
|
|
7019
|
+
"mode": "0000644",
|
|
7020
|
+
"sha256": "e559a037714bd0b0e1cfb03c8560e07a24a050e4a2bbe4dd3c4c2e291eea2601"
|
|
7021
|
+
},
|
|
7007
7022
|
{
|
|
7008
7023
|
"path": "tests/module_cli.mjs",
|
|
7009
7024
|
"mode": "0000644",
|
|
@@ -7247,7 +7262,7 @@
|
|
|
7247
7262
|
{
|
|
7248
7263
|
"path": "tests/public_landing_projects.mjs",
|
|
7249
7264
|
"mode": "0000644",
|
|
7250
|
-
"sha256": "
|
|
7265
|
+
"sha256": "e03bbf258cb4b8ffd3e242ab2ddd927d1f52706347d06b539a386ca502caf1e4"
|
|
7251
7266
|
},
|
|
7252
7267
|
{
|
|
7253
7268
|
"path": "tests/public_mirror_export.mjs",
|
|
@@ -62,7 +62,7 @@ export interface GetMemoryBuildersBuilderIdFileResponse { builder_id: unknown; f
|
|
|
62
62
|
export interface GetMemoryBuildersBuilderIdFilesResponse { builder_id: unknown; forensic: boolean; count: unknown; files: unknown }
|
|
63
63
|
export interface GetMemoryFileResponse { builder_id: unknown; path: unknown; content: unknown; sha256: unknown; byte_len: unknown; mtime: unknown; updated_at: unknown; created_at: unknown }
|
|
64
64
|
export interface GetMemoryFilesResponse { builder_id: unknown; count: unknown; files: unknown }
|
|
65
|
-
export interface GetModulesResponse { modules: unknown; own_built: unknown; core_loaded: unknown; submit_pipeline_live: boolean }
|
|
65
|
+
export interface GetModulesResponse { modules: unknown; own_built: unknown; core_loaded: unknown; catalog: unknown; submit_pipeline_live: boolean }
|
|
66
66
|
export interface GetModulesSubmissionsResponse { submissions: unknown }
|
|
67
67
|
export interface GetMyProjectsInvitesResponse { invites: unknown }
|
|
68
68
|
export interface GetMyProjectsResponse { owned: unknown; building: unknown }
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# 0167 — The module catalog: `source` (which tree) and `provenance` (who built it) are two axes
|
|
2
|
+
|
|
3
|
+
- **Status:** Accepted
|
|
4
|
+
- **Date:** 2026-08-12
|
|
5
|
+
- **Track:** internal
|
|
6
|
+
- **Task:** [#1001772](https://cloudbongos.com/builders#/task/1001772) (BONGOS-V1, goal 1000029) — the browsable module catalog with author + origin credit.
|
|
7
|
+
- **Builds on:** [ADR 0107](<redacted>.md) §2/§3/§6/§9 (upstreaming, attribution-as-portable-record, credit-now-money-later, default-off, the hall Modules tab), [ADR 0108](<redacted>.md) §1 (the loader discovers across BOTH the core package's `modules/` and the instance's own), [ADR 0083](<redacted>.md) (the manifest + loader), [ADR 0166](<redacted>.md) (the `maintenance` block the catalog surfaces).
|
|
8
|
+
|
|
9
|
+
## Context
|
|
10
|
+
|
|
11
|
+
ADR 0107 §9 shipped a hall "Modules" tab that split modules into **"built by this project"** vs **"core-loaded from Cloud Bongos"**. That split was derived from one field: the manifest's `origin` string (`src/module-loader/provenance.js` — no origin, or an origin naming this instance, means own-built).
|
|
12
|
+
|
|
13
|
+
Closing out the goal with the catalog itself (§2/§3 — "a browsable catalog of available core modules, each shown with its author + origin credit") exposed that this single field is being asked two different questions at once:
|
|
14
|
+
|
|
15
|
+
1. **Can this instance enable it?** — i.e. did the core ship it. This is what makes a catalog a catalog.
|
|
16
|
+
2. **Who gets the credit?** — the attribution record ADR 0107 §2 defined.
|
|
17
|
+
|
|
18
|
+
`origin` only answers the second. Attribution is **optional** in the manifest schema, and core's own modules mostly leave it unset because none of them was upstreamed from anywhere — so on a split instance every core module (`economy`, `governance`, `hall-ui`, …) classified as *built here*, and the catalog of things you could opt into read as empty. The two questions had been collapsed into the one field that cannot answer the first.
|
|
19
|
+
|
|
20
|
+
A second, smaller problem: a catalog whose author/origin columns are blank for most rows is not a credit surface. But filling them by writing `"author": "Cloud Bongos"` into fifteen core manifests would be a large, self-repeating diff that a sixteenth module would immediately forget.
|
|
21
|
+
|
|
22
|
+
## Decision
|
|
23
|
+
|
|
24
|
+
**Split the two questions into two fields on one shared model** — `src/module-loader/catalog.js`, which the hall route (`GET /api/bongos/modules`) and the CLI (`bongos module list --catalog`) both build from, so the two surfaces cannot drift.
|
|
25
|
+
|
|
26
|
+
- **`source` — which tree the module ships from.** Read *structurally* from the loader's discovery root (ADR 0108 §1): a module found under `resolveCoreRoot()/modules` is `core` (the catalog an instance opts into); one under `resolveInstanceRoot()/modules` is `instance`. This is the catalog axis and it needs no manifest cooperation, so it cannot rot.
|
|
27
|
+
- **When the roots coincide** (a single checkout — the two candidates dedupe to one directory), structure can no longer answer it. There we fall back to what the checkout *says it is*: a `package.json` naming `@bongos/core` / `cloud-bongos` means this is the core repo and its `modules/` **is** the catalog; any other checkout's `modules/` are that instance's own. Fail-soft — an unreadable `package.json` degrades to "instance", which understates the catalog rather than inventing one.
|
|
28
|
+
- **`provenance` — who built it.** Unchanged: still `deriveProvenance(manifest.origin, ownProjectName)`, still derived from the **declared** manifest fields, which is why the row keeps `author`/`origin` verbatim (null when the manifest says nothing) beside the display credit below.
|
|
29
|
+
|
|
30
|
+
**Credit is resolved for display, and an inferred value is marked as inferred.** A `credit: { author, origin, inferred }` field falls back to the platform name for a core-shipped module that declares no attribution — so no catalog row is blank — while `inferred: true` makes both surfaces mark it (`*` in the CLI, a hoverable `<abbr>` in the hall). An instance module that declares nothing stays uncredited rather than borrowing the platform's name.
|
|
31
|
+
|
|
32
|
+
## Alternatives considered (rejected)
|
|
33
|
+
|
|
34
|
+
- **Stamp `author`/`origin` into all ~15 core manifests.** Rejected: a repetitive diff that states the same fact fifteen times, and nothing keeps module sixteen from omitting it. The fallback derives it once, for every module, forever. (A module that *wants* a specific credit still declares one and wins — the fallback only fills a hole.)
|
|
35
|
+
- **Overload `origin` to also mean "core-shipped".** Rejected — it is the attribution record ADR 0107 §2 deliberately defined as portable metadata, and `tests/modules_route.mjs` correctly pins provenance to the declared value. Writing a derived value into it would silently reclassify every core module as *core-loaded* and destroy the credit axis to fix the catalog one.
|
|
36
|
+
- **Decide `source` from `default: true`** (core modules mostly ship default-on). Rejected as a coincidence, not a rule: ADR 0107 §6 requires *accepted* catalog modules to ship `default: false`, so the newest and most interesting catalog entries are exactly the ones this heuristic gets wrong.
|
|
37
|
+
- **A `catalog` table in the DB.** Rejected as premature — the on-disk manifests already are the catalog, and a table would need writing at deploy time and could disagree with what actually mounted. Revisit if/when accepted submissions land from a real cross-repo channel ([ADR 0135](<redacted>.md)'s open question).
|
|
38
|
+
|
|
39
|
+
## Consequences
|
|
40
|
+
|
|
41
|
+
- **The hall's Modules tab sections by `source`, not `provenance`** — "Module catalog" (what the core ships, opt-in) and "Built by this project". The credit axis moved to the per-card chips where it belongs, and the "Submit for review" list is now drawn from `source: 'instance'`: a module that already ships with the core is by definition already in the catalog and cannot be submitted into it.
|
|
42
|
+
- **The catalog is browsable from both surfaces with the same filter rule** — `searchCatalog()` over key/title/description/credit/licence, mirrored in the page's `matchesQuery()`. The hall filters client-side (the whole payload is already there); the CLI takes `--search`.
|
|
43
|
+
- **`GET /modules` grew a `catalog` roll-up** and each row grew `source` + `credit`. Every pre-existing field is byte-identical, so an un-redeployed hall keeps working — `modules.js` falls back to the credit axis when `source` is absent.
|
|
44
|
+
- **The credit fallback names the platform, not the host instance.** That string is the core's own name (like `CORE_PKG`), not host identity, so it does not cross the [ADR 0062](<redacted>.md) §7 core/host line and the BV1.R76 hardcoded-identity fitness check stays green.
|
package/docs/adr/README.md
CHANGED
|
@@ -239,6 +239,7 @@ This keeps the decision history honest and traceable.
|
|
|
239
239
|
| 0164 | [**The implausible-pass guard reads substance + evidence; the Metic+ honor-system residual is explicit** ([task 1002658](https://cloudbongos.com/builders#/task/1002658); grader-hardening goal 1000056). The guard fired only on `issues.length===0` — one fabricated `{}` defeated it, its magnitude inputs are client-supplied, and every in-sample firing (eval 2-for-2, tasks 1002643 ×2, 1002663) was a false positive on an honest unanimous zero-issue panel PASS. Redesign: count only SUBSTANTIVE issues (known severity + non-empty summary — padding trips the guard regardless), and waive the zero-issue pass when `signals.workers` carries the full ≥3-worker panel shape, stamped `implausible_pass_waived` for /grade-audit. The residual is named, not hidden: every grade-time input is client-authored, so plausibility at grade time is honest-mistake hygiene; the binding authorities on the real diff are land-time (CI unit, gate-review, main audit) — Metic+ grade-time honesty is accepted honor-system per this ADR. The ADR-0042 CI grade-gate (land it vs record permanent deferral) goes to the owner as a blocker, not decided here. No approval step added or removed (ADR 0162).](<redacted>.md) | GDS / grading |
|
|
240
240
|
| 0165 | [**Instances are hookless by default: no scaffolded `.husky/`; local hooks stay an instance-owned opt-in** ([task 1002641](https://cloudbongos.com/builders#/task/1002641); idea 1000655). Task 1002608 delivered the ADR 0043 Layer 1 pre-push gate for the CORE repo, but nothing materializes `.husky/` on a scaffolded standalone instance (`publish-manifest.js` excludes it by design). Decision: that is the accepted posture, not a gap. Sub-Metic instance builders hold no push credential at all (server-mediated publish, ADR 0053/0055) — a client pre-push hook guards a push that cannot happen; a client hook is not a security boundary (ADR 0016); the core cannot maintain hooks it deliberately does not ship (scaffolded hooks would be born orphans — the audit-authorship rot lesson, task 1002640); and ADR 0162 puts gates in CI, rank-consistent and hands-free. Secrets hooks follow the same rule (the PR-time CI secret scan enforces). The opt-in stays real and instance-owned: an instance commits its own `.husky/` and the core's `install-git-hooks.js` (already run by `/builder-setup`) activates it. Rejected: scaffolding wrappers at init, an `--with-hooks` flag (speculative), treating hooklessness as a regression. Revisit if an instance model has builders pushing directly with their own credentials.](<redacted>.md) | provisioning / trust boundary |
|
|
241
241
|
| 0166 | [**Module maintenance & deprecation policy: upkeep is a declared `maintenance` block, and `bongos upgrade` surfaces rot in DISABLED modules too** ([task 1001773](https://cloudbongos.com/builders#/task/1001773)). Implements [ADR 0107](<redacted>.md) §7, which named the catalog-rot problem and deferred the mechanics. `module.json` gains an optional-in-schema, required-to-upstream `maintenance` block — `status` one of `core-maintained` / `maintained` / `deprecated` / `orphaned`, plus `since` / `removeAfter` / `successor` / `note`. Each status owes something the validator enforces: `maintained` requires a named top-level `maintainer` (an unnamed owner IS the orphaning failure), a sunset status requires a deprecation path, and `removeAfter` is rejected on a non-sunset status. `orphaned` is deliberately first-class — a policy that only permits happy statuses gets satisfied by lying. The load-bearing fix: accepted modules ship `default:false` (§6), so every rotted catalog entry is DISABLED by construction — and `preflightModules()` returned only `blocking`, discarding `warnings`, so a real `bongos upgrade --to X` reported `"all enabled modules satisfy the target"` while saying nothing about them. It now returns + prints `warnings`/`deprecations`/`expired` with the maintainer NAMED, before the blocking check returns (so a refused bump reports them too). Enabled mismatches still refuse; disabled ones still never block — report, don't block, because blocking an instance's bump on a catalog entry it never opted into makes the shared catalog a liability. `bongos module check`/`submit` refuse an undeclared posture or an already-sunset module; `GET /modules` + the hall Modules tab show an `upkeep:` chip (incl. `undeclared`); all 17 bundled modules stamped `core-maintained` with a unit test holding the line. Rejected: blocking on disabled rot, a required manifest field (breaks every existing manifest), DB-tracked upkeep (must travel with the module, ADR 0107 §2), auto-deprecating on incompatibility (a fact is not a decision), a separate MAINTAINERS file.](<redacted>.md) | modules / upstreaming |
|
|
242
|
+
| 0167 | [**The module catalog: `source` (which tree ships it) and `provenance` (who built it) are two axes** ([task 1001772](https://cloudbongos.com/builders#/task/1001772) — the last task of goal 1000029). Closes [ADR 0107](<redacted>.md) §2/§3: a browsable catalog of enable-able core modules, each with author + origin credit, in the hall AND via `bongos module list --catalog`. The bug it fixes: the Modules tab derived its own/core-loaded split from the manifest's `origin` alone, but attribution is OPTIONAL and core's own modules declare none (nothing upstreamed them) — so on a split instance every core module read as *built here* and the catalog you could opt into read as empty. One field was answering two questions. Fix: a shared model (`src/module-loader/catalog.js`) that both the hall route and the CLI build from, carrying `source` — read STRUCTURALLY from the loader's discovery root ([ADR 0108](<redacted>.md) §1: core package vs instance tree), falling back on coincident roots to whether `package.json` names the core — beside the unchanged `provenance` credit axis. Plus `credit: {author, origin, inferred}`, which fills a core module's blank attribution with the platform name and MARKS it inferred (`*` in the CLI, a hoverable `<abbr>` in the hall) so it never reads as a claim the author typed. The tab now sections by `source` ("Module catalog" / "Built by this project"), gains a search box, and draws "Submit for review" from instance-source modules only. Rejected: stamping author/origin into 15 core manifests (repetitive, and module 16 forgets), overloading `origin` (destroys the credit axis), inferring from `default:true` (§6 makes accepted catalog modules default-OFF — exactly backwards), a DB catalog table (premature; the manifests already are the catalog).](<redacted>.md) | modules / upstreaming |
|
|
242
243
|
| 0168 | [**The scaffold vendors the hub's RUNNING core (`npm pack` of the installed package); registry-default deferred to the go-public step** ([task 1002706](https://cloudbongos.com/builders#/task/1002706); gap 13 of the project-creation audit). Two collided facts: children were born pinned to a frozen `file:vendor/bongos-core-1.19.2.tgz` (installedCoreTarball reuses the hub's own file: pin — task 1002275 — and the hub's pin sat at 1.19.2), and the task-1002621 registry cutover (hub pin now `"@bongos/core": "1.19.56"`, verified on the box) made installedCoreTarball return null — dropping the scaffold into the package-core.js source rebuild that ABORTS on a consumer instance (empty core set → empty child repo, the 1002275 failure resurrected). Fix: a three-rung ladder — file:-pin reuse → NEW `installedCorePackDir()` + `npm pack` of the hub's installed core (child pins the SAME, CURRENT core, stays file:-pinned, owner needs no token) → source rebuild. The brief's "make registry the default now that the package is public" was verified FALSE (both npm scopes 404 anonymously; ADR 0134 keeps them private until go-public) — a registry-default child would be born UNINSTALLABLE for a tokenless owner. Registry-default is deferred to the go-public step (idea 1000700); the gap-13 "flip the box env" ops leg is explicitly a no-op until then; child freshness rides this ladder + the hub-pin lane (task 1002708). Rejected: registry-default now, dropping NPM_TOKEN, vendoring from the npm cacache.](<redacted>.md) | provisioning / distribution |
|
|
243
244
|
| 0167 | [**The /create gate trust link defaults to the AGPL-3.0 license text, not the npm package page** ([task 1002705](https://cloudbongos.com/builders#/task/1002705); gap 1 of the project-creation audit). The gate's "open source" link pointed at a nonexistent repo (404); the task brief's suggested default — the npm package page — is ALSO dead for the gate's actual audience (signed-out visitors): `@cloudbongos/core` and `@bongos/core` both 404 anonymously (private scopes, ADR 0134), and the ADR 0099 public mirror stays dormant until ~2026-11. The license text is the one live, instance-neutral artifact behind the claim today. The browsable-code upgrade is the owner's filed choice (idea 1000700): public repo now (forfeits the ADR 0065 §4 redaction window) / public npm package / wait for the mirror. Rejected: the npm link (verified dead), flipping the repo public (not a builder's call), plain unlinked text (less information, same cost).](<redacted>.md) | public landing / governance |
|
|
244
245
|
|
package/docs/api/openapi.json
CHANGED
|
@@ -12964,6 +12964,7 @@
|
|
|
12964
12964
|
"modules": {},
|
|
12965
12965
|
"own_built": {},
|
|
12966
12966
|
"core_loaded": {},
|
|
12967
|
+
"catalog": {},
|
|
12967
12968
|
"submit_pipeline_live": {
|
|
12968
12969
|
"type": "boolean"
|
|
12969
12970
|
}
|
|
@@ -12972,6 +12973,7 @@
|
|
|
12972
12973
|
"modules",
|
|
12973
12974
|
"own_built",
|
|
12974
12975
|
"core_loaded",
|
|
12976
|
+
"catalog",
|
|
12975
12977
|
"submit_pipeline_live"
|
|
12976
12978
|
]
|
|
12977
12979
|
},
|
package/docs/file-map.md
CHANGED
|
@@ -188,6 +188,8 @@
|
|
|
188
188
|
│ ├── module-loader/ ← the loader that makes `modules/<key>/` discoverable (BV1.R38–R41)
|
|
189
189
|
│ │ ├── loader.js ← discover modules/*/module.json → validate manifest → coreVersion-check → enabled-filter → mount routes behind kernel auth → start pollers. <redacted> on empty modules/. Used by modules.js + routes.js.
|
|
190
190
|
│ │ ├── manifest-schema.js ← module.json schema + validator (key, title, description, coreVersion, default, contributes, provides, consumes, prerequisites). Unknown keys throw. Used by loader + bongos module new.
|
|
191
|
+
│ │ ├── provenance.js ← pure "who BUILT this module" classifier from manifest.origin — the CREDIT axis (ADR 0107 §9). own-built vs core-loaded.
|
|
192
|
+
│ │ ├── catalog.js ← the browsable module catalog model (ADR 0167 / ADR 0107 §2/§3): `source` (which TREE ships it — core package vs instance, read off the loader's discovery root) + resolved author/origin `credit` with an `inferred` flag. The ONE builder behind both `GET /api/bongos/modules` and `bongos module list --catalog`, so the hall + CLI can't drift.
|
|
191
193
|
│ │ └── semver.js ← minimal semver `satisfies(version, range)` used by the loader (no npm dep).
|
|
192
194
|
│ ├── platform-server.js ← GDS-ONLY entrypoint (ADR 0062 R51, task 1190): boots Express + the shared internal surface (API + hall + status) with NO game in the process; the inverse of preview-server.js. `node src/platform-server.js`
|
|
193
195
|
│ ├── preview-server.js ← GAME-ONLY entrypoint for the per-box sandbox (ADR 0052): Phaser/Colyseus + tiles, NO /api/gds
|
package/docs/modules-contract.md
CHANGED
|
@@ -115,6 +115,8 @@ An unknown key throws at validate time — typos fail loud (top-level attributio
|
|
|
115
115
|
|
|
116
116
|
**Attribution (`author`/`origin`/`license`/`maintainer`) is portable metadata, not a cross-GDS link** — each repo runs its own GDS with its own builder identities ([ADR 0100](adr/<redacted>.md) §3), so credit travels *with the module* rather than through a foreign key ([ADR 0107](adr/<redacted>.md) §2). `bongos module new` stamps all four as TODO placeholders (license defaults to `AGPL-3.0`) so a module carries its authorship from the day it's scaffolded, not bolted on later at upstream-submit time.
|
|
117
117
|
|
|
118
|
+
**`bongos module list [--catalog] [--search <text>] [--json]`** ([ADR 0107](adr/<redacted>.md) §2/§3, [ADR 0167](adr/<redacted>.md)) is the browsable catalog from the terminal: every module on disk with its enabled state, its author + origin credit, and its upkeep posture. `--catalog` narrows to the **core-shipped** modules — the shared catalog an instance opts into (§6, default-off). Two axes travel on each row and they are *not* the same question: **`source`** (which tree ships it — the core package or this instance's own repo, read structurally from the loader's discovery root, [ADR 0108](adr/<redacted>.md) §1) and **`provenance`** (who built it, derived from the declared `origin`). A core module that declares no attribution is credited to the platform and the credit is **marked inferred** (`*`) rather than left blank or silently invented. The hall's Modules tab renders the same model (`src/module-loader/catalog.js`) via `GET /modules`, so the two surfaces cannot drift.
|
|
119
|
+
|
|
118
120
|
**`bongos module check <key> [--sign-off "Name <email>"]`** ([ADR 0107](adr/<redacted>.md) §4) is the submit-time pre-check a module must clear before it can be upstreamed. It reuses (never re-types) the public-mirror publish denylist (`scripts/gds/publish-manifest.js`'s `matchesDeny`) to reject content that cannot ship under AGPL (game content, pixel art, copyrighted reference material) — deliberately the DENY half only, since a brand-new module is never on the publish ALLOWLIST until it's accepted into core (§6). It also requires `module.json`'s `license` to be AGPL-3.0 (inbound = outbound) and a declared `maintenance` posture — acceptance is a commitment to upkeep, so a module with no `maintenance.status`, or one already `deprecated`/`orphaned`, is refused ([ADR 0166](adr/<redacted>.md); see below). On a pass, `--sign-off` records a lightweight DCO-style affirmation (own work, licensed AGPL-3.0 — never a copyright-assignment CLA) to `modules/<key>/.upstream-signoff.json`.
|
|
119
121
|
|
|
120
122
|
### `maintenance` — who keeps this module true as the core advances ([ADR 0166](adr/<redacted>.md))
|
|
@@ -60,4 +60,33 @@ button.mod-submit {
|
|
|
60
60
|
}
|
|
61
61
|
button.mod-submit:disabled { opacity: 0.45; cursor: not-allowed; }
|
|
62
62
|
.mod-empty { color: var(--ink-faint); font-style: italic; font-size: 13px; padding: 10px 0; }
|
|
63
|
-
.mod-note { font-size: 12px; color: var(--ink-faint); margin-top: 4px; }
|
|
63
|
+
.mod-note { font-size: 12px; color: var(--ink-faint); margin-top: 4px; }
|
|
64
|
+
|
|
65
|
+
/* Catalog browse bar (task 1001772) — one filter over both grids. */
|
|
66
|
+
.mod-browse { margin: 0 0 16px; }
|
|
67
|
+
.mod-browse__label {
|
|
68
|
+
display: block;
|
|
69
|
+
font-size: 12px;
|
|
70
|
+
font-weight: 600;
|
|
71
|
+
color: var(--ink-soft);
|
|
72
|
+
margin-bottom: 6px;
|
|
73
|
+
}
|
|
74
|
+
.mod-browse__input {
|
|
75
|
+
font-family: var(--font-body);
|
|
76
|
+
font-size: 13.5px;
|
|
77
|
+
width: 100%;
|
|
78
|
+
max-width: 420px;
|
|
79
|
+
padding: 8px 12px;
|
|
80
|
+
border-radius: var(--radius-sm);
|
|
81
|
+
border: 1px solid var(--border-strong);
|
|
82
|
+
background: var(--surface);
|
|
83
|
+
color: var(--ink);
|
|
84
|
+
}
|
|
85
|
+
/* The marker on an inferred credit — quiet, but hoverable for the reason. */
|
|
86
|
+
.mod-inferred {
|
|
87
|
+
border: 0;
|
|
88
|
+
text-decoration: none;
|
|
89
|
+
cursor: help;
|
|
90
|
+
color: var(--ink-faint);
|
|
91
|
+
margin-left: 1px;
|
|
92
|
+
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="utf-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
6
|
<title>Modules — {{worldName}}</title>
|
|
7
|
-
<meta name="description" content="
|
|
7
|
+
<meta name="description" content="Browse the Cloud Bongos module catalog: what the core ships, who built each module and where it came from, what this instance runs, and how to submit one upstream.">
|
|
8
8
|
<link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
|
|
9
9
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
10
10
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
@@ -23,19 +23,30 @@
|
|
|
23
23
|
<div class="page-head"><p class="page-head__sub" id="modules-sub">Loading modules…</p></div>
|
|
24
24
|
|
|
25
25
|
<main>
|
|
26
|
-
<!--
|
|
27
|
-
<
|
|
28
|
-
<
|
|
29
|
-
<
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
<!-- Browse — one filter over both grids below (task 1001772). -->
|
|
27
|
+
<div class="mod-browse">
|
|
28
|
+
<label class="mod-browse__label" for="mod-search">Search the catalog</label>
|
|
29
|
+
<input type="search" id="mod-search" class="mod-browse__input" autocomplete="off"
|
|
30
|
+
placeholder="name, author, origin project, or licence…">
|
|
31
|
+
<p class="mod-note" id="mod-browse-count" role="status" aria-live="polite"></p>
|
|
32
|
+
</div>
|
|
32
33
|
|
|
33
|
-
<!--
|
|
34
|
-
|
|
34
|
+
<!-- The catalog — every module the CORE ships, which this instance can
|
|
35
|
+
opt into (ADR 0107 §6: accepted modules land default-off). Each row
|
|
36
|
+
carries its author + origin credit (§2/§3: credit now, money later). -->
|
|
35
37
|
<section class="scroll" id="core-scroll" aria-labelledby="core-h">
|
|
36
|
-
<h2 id="core-h" class="scroll__h">
|
|
37
|
-
<p class="scroll__lede">Modules built by
|
|
38
|
-
<div class="mod-grid" id="core-grid"><div class="mod-empty">
|
|
38
|
+
<h2 id="core-h" class="scroll__h">Module catalog</h2>
|
|
39
|
+
<p class="scroll__lede">Modules the Cloud Bongos core ships — the shared repository built by its sub-projects, each credited to its author and the project it came from. Enable the ones you want; Metic+ can flip the switch, everyone can see the state.</p>
|
|
40
|
+
<div class="mod-grid" id="core-grid"><div class="mod-empty">Loading…</div></div>
|
|
41
|
+
</section>
|
|
42
|
+
|
|
43
|
+
<!-- This instance's own modules — the pool `bongos module submit` draws
|
|
44
|
+
from. Separate from the catalog because these ship from this repo,
|
|
45
|
+
not from the core package. -->
|
|
46
|
+
<section class="scroll" id="own-scroll" aria-labelledby="own-h">
|
|
47
|
+
<h2 id="own-h" class="scroll__h">Built by this project</h2>
|
|
48
|
+
<p class="scroll__lede">Modules that live in this instance's own repo rather than arriving with the core. Submit one upstream below to offer it to every other instance.</p>
|
|
49
|
+
<div class="mod-grid" id="own-grid"><div class="mod-empty">None on disk.</div></div>
|
|
39
50
|
</section>
|
|
40
51
|
|
|
41
52
|
<!-- Submit for review — the front door to bongos module submit (ADR 0107 §1/§9). -->
|
|
@@ -57,6 +68,6 @@
|
|
|
57
68
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
58
69
|
<script src="/builders/palette.js" defer></script>
|
|
59
70
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
60
|
-
<script src="/builders/modules.js?v=2026-
|
|
71
|
+
<script src="/builders/modules.js?v=2026-08-12-catalog"></script>
|
|
61
72
|
</body>
|
|
62
73
|
</html>
|
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
// public-builders/modules.js — the hall "Modules" tab (/builders/modules).
|
|
2
2
|
//
|
|
3
|
-
// ADR 0107 §9
|
|
4
|
-
// 1.
|
|
5
|
-
//
|
|
6
|
-
//
|
|
3
|
+
// ADR 0107 §9 (task 1776) + §2/§3 the browsable catalog (task 1001772). Jobs:
|
|
4
|
+
// 1. BROWSE the catalog — every module the core ships that this instance can
|
|
5
|
+
// enable, each with its author + origin credit, filterable by a single
|
|
6
|
+
// search box over name/author/origin/licence. Split from the instance's
|
|
7
|
+
// OWN modules by `source` (which TREE it ships from — the core package or
|
|
8
|
+
// this repo), which GET /api/bongos/modules reads structurally off the
|
|
9
|
+
// loader's discovery roots. That is a different axis from `provenance`
|
|
10
|
+
// (WHO built it, read off the manifest's origin) and both are shown: the
|
|
11
|
+
// section says where it ships from, the chips say who to credit.
|
|
7
12
|
// 2. Enable/disable — a toggle over config/modules.json (POST /modules/:key/enable).
|
|
8
13
|
// Any signed-in builder sees the state; only metic+archon can flip it (the
|
|
9
14
|
// server enforces this — a lower-rank click just gets a 403 + a friendly
|
|
10
15
|
// toast, same as every other rank-gated write in this hall).
|
|
11
|
-
// 3. "Submit for review" front door —
|
|
12
|
-
//
|
|
13
|
-
//
|
|
16
|
+
// 3. "Submit for review" front door — files one of this project's own modules
|
|
17
|
+
// into the upstreaming review queue (POST /modules/:key/submit, task 1770).
|
|
18
|
+
//
|
|
19
|
+
// The rows come from the SAME builder as `bongos module list --catalog`
|
|
20
|
+
// (src/module-loader/catalog.js), so the two surfaces cannot drift.
|
|
14
21
|
|
|
15
22
|
(() => {
|
|
16
23
|
'use strict';
|
|
@@ -24,6 +31,8 @@
|
|
|
24
31
|
|
|
25
32
|
let viewerRank = 'xenos';
|
|
26
33
|
let canToggle = false;
|
|
34
|
+
// The last payload, held so the search box can re-filter without a refetch.
|
|
35
|
+
let allModules = [];
|
|
27
36
|
|
|
28
37
|
function provenanceChip(m) {
|
|
29
38
|
return m.provenance === 'core'
|
|
@@ -31,14 +40,30 @@
|
|
|
31
40
|
: '<span class="mod-chip mod-chip--own">built here</span>';
|
|
32
41
|
}
|
|
33
42
|
|
|
43
|
+
// Author + origin credit (ADR 0107 §2/§3 — credit now, money later). Reads
|
|
44
|
+
// `credit`, not the raw manifest fields, so a core module whose manifest
|
|
45
|
+
// declares no author still shows who ships it rather than a blank card; an
|
|
46
|
+
// INFERRED credit is marked so it never reads as something the author typed.
|
|
34
47
|
function attributionChips(m) {
|
|
48
|
+
const credit = m.credit || { author: m.author, origin: m.origin, inferred: false };
|
|
49
|
+
const mark = credit.inferred ? '<abbr class="mod-inferred" title="Not declared in module.json — this is who ships the module.">*</abbr>' : '';
|
|
35
50
|
const chips = [];
|
|
36
|
-
if (
|
|
37
|
-
if (
|
|
51
|
+
if (credit.author) chips.push(`<span class="mod-chip">by ${escapeHtml(credit.author)}${mark}</span>`);
|
|
52
|
+
if (credit.origin && credit.origin !== credit.author) chips.push(`<span class="mod-chip">from ${escapeHtml(credit.origin)}${mark}</span>`);
|
|
38
53
|
if (m.license) chips.push(`<span class="mod-chip">${escapeHtml(m.license)}</span>`);
|
|
39
54
|
return chips.join('');
|
|
40
55
|
}
|
|
41
56
|
|
|
57
|
+
// Free-text browse over the fields a builder would search by. Mirrors
|
|
58
|
+
// searchCatalog() in src/module-loader/catalog.js — same fields, same
|
|
59
|
+
// case-insensitive substring rule — so the hall and the CLI filter alike.
|
|
60
|
+
function matchesQuery(m, q) {
|
|
61
|
+
if (!q) return true;
|
|
62
|
+
const credit = m.credit || {};
|
|
63
|
+
return [m.key, m.title, m.description, credit.author, credit.origin, m.license]
|
|
64
|
+
.some((f) => f && String(f).toLowerCase().includes(q));
|
|
65
|
+
}
|
|
66
|
+
|
|
42
67
|
// Upkeep posture (ADR 0107 §7 / ADR 0166) — who keeps this module true as the
|
|
43
68
|
// core advances. A module with no declared maintenance is shown as such rather
|
|
44
69
|
// than silently: an unowned catalog entry is the thing the policy exists to
|
|
@@ -75,19 +100,59 @@
|
|
|
75
100
|
</div>`;
|
|
76
101
|
}
|
|
77
102
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
103
|
+
// `source` splits the page: 'core' = shipped by the core package (the
|
|
104
|
+
// catalog you opt into), 'instance' = lives in this repo. Older payloads
|
|
105
|
+
// predate the field, so fall back to the credit axis rather than emptying
|
|
106
|
+
// the page against a server that hasn't been redeployed yet.
|
|
107
|
+
function sourceOf(m) {
|
|
108
|
+
if (m.source) return m.source;
|
|
109
|
+
return m.provenance === 'core' ? 'core' : 'instance';
|
|
110
|
+
}
|
|
81
111
|
|
|
82
|
-
|
|
83
|
-
|
|
112
|
+
function renderGrids() {
|
|
113
|
+
const input = $('#mod-search');
|
|
114
|
+
const q = input ? input.value.trim().toLowerCase() : '';
|
|
115
|
+
const matching = allModules.filter((m) => matchesQuery(m, q));
|
|
116
|
+
const core = matching.filter((m) => sourceOf(m) === 'core');
|
|
117
|
+
const own = matching.filter((m) => sourceOf(m) === 'instance');
|
|
84
118
|
|
|
119
|
+
const coreGrid = $('#core-grid');
|
|
120
|
+
if (coreGrid) {
|
|
121
|
+
coreGrid.innerHTML = core.length ? core.map(cardHTML).join('')
|
|
122
|
+
: `<div class="mod-empty">${q ? 'No catalog module matches that search.' : 'The core ships no modules this instance can see.'}</div>`;
|
|
123
|
+
}
|
|
85
124
|
const ownGrid = $('#own-grid');
|
|
86
|
-
if (ownGrid)
|
|
125
|
+
if (ownGrid) {
|
|
126
|
+
ownGrid.innerHTML = own.length ? own.map(cardHTML).join('')
|
|
127
|
+
: `<div class="mod-empty">${q ? 'None of this project\'s own modules match that search.' : 'None on disk — everything here ships with the core.'}</div>`;
|
|
128
|
+
}
|
|
87
129
|
|
|
88
|
-
const
|
|
89
|
-
if (
|
|
130
|
+
const count = $('#mod-browse-count');
|
|
131
|
+
if (count) {
|
|
132
|
+
count.textContent = q
|
|
133
|
+
? `${matching.length} of ${allModules.length} module(s) match “${input.value.trim()}”.`
|
|
134
|
+
: '';
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
document.querySelectorAll('.mod-toggle').forEach((btn) => btn.addEventListener('click', onToggle));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function render(data) {
|
|
141
|
+
allModules = Array.isArray(data.modules) ? data.modules : [];
|
|
142
|
+
const core = allModules.filter((m) => sourceOf(m) === 'core');
|
|
143
|
+
const own = allModules.filter((m) => sourceOf(m) === 'instance');
|
|
144
|
+
const enabled = core.filter((m) => m.enabled).length;
|
|
145
|
+
|
|
146
|
+
const sub = $('#modules-sub');
|
|
147
|
+
if (sub) {
|
|
148
|
+
sub.textContent = `${allModules.length} module(s) — ${core.length} in the core catalog (${enabled} enabled here), `
|
|
149
|
+
+ `${own.length} built by this project.`;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
renderGrids();
|
|
90
153
|
|
|
154
|
+
// Only this project's OWN modules can be submitted upstream: a module that
|
|
155
|
+
// already ships with the core is, by definition, already in the catalog.
|
|
91
156
|
const submitStatus = $('#submit-status');
|
|
92
157
|
if (submitStatus) {
|
|
93
158
|
submitStatus.innerHTML = own.length
|
|
@@ -98,16 +163,12 @@
|
|
|
98
163
|
Submit "${escapeHtml(m.key)}" for review
|
|
99
164
|
</button>
|
|
100
165
|
</span>`).join('')
|
|
101
|
-
: '<span class="mod-note">
|
|
166
|
+
: '<span class="mod-note">Nothing to submit — every module here already ships with the core.</span>';
|
|
167
|
+
document.querySelectorAll('[data-submit-key]').forEach((btn) => btn.addEventListener('click', onSubmit));
|
|
102
168
|
}
|
|
103
169
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
btn.addEventListener('click', onToggle);
|
|
107
|
-
});
|
|
108
|
-
document.querySelectorAll('[data-submit-key]').forEach((btn) => {
|
|
109
|
-
btn.addEventListener('click', onSubmit);
|
|
110
|
-
});
|
|
170
|
+
const search = $('#mod-search');
|
|
171
|
+
if (search) search.addEventListener('input', renderGrids);
|
|
111
172
|
}
|
|
112
173
|
|
|
113
174
|
async function onToggle(ev) {
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.100",
|
|
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.100",
|
|
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.100",
|
|
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",
|