@bongos/core 1.19.960 → 1.19.962
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 +11 -11
- package/docs/module-api-changelog.md +4 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/claude-materialize.js +11 -2
- package/src/module-api.js +1 -1
- package/tests/claude_materialize.mjs +32 -2
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.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.962",
|
|
6
|
+
"core_contract": "1.19.962",
|
|
7
|
+
"source_commit": "31bf829b41365d773f768e041a5593502bf02e0f",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-
|
|
9
|
+
"built_at": "2026-09-22T17:31:08.462Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 514,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 2898,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "51d873c73f0ab88e3ec4e1baf9ec1d53a22994eeda22ed4dade6355993f5d527",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -2692,7 +2692,7 @@
|
|
|
2692
2692
|
{
|
|
2693
2693
|
"path": "docs/module-api-changelog.md",
|
|
2694
2694
|
"mode": "0000644",
|
|
2695
|
-
"sha256": "
|
|
2695
|
+
"sha256": "fa3d4990413dcbd0bdf03dc4c6d3dbb4a8e966146fc594a914f4951468204668"
|
|
2696
2696
|
},
|
|
2697
2697
|
{
|
|
2698
2698
|
"path": "docs/modules-contract.md",
|
|
@@ -8082,12 +8082,12 @@
|
|
|
8082
8082
|
{
|
|
8083
8083
|
"path": "package-lock.json",
|
|
8084
8084
|
"mode": "0000644",
|
|
8085
|
-
"sha256": "
|
|
8085
|
+
"sha256": "de49dbe2000a605cf6e9d07c5c24aa63047624d3ab54c12802b877b5ed75c7b4"
|
|
8086
8086
|
},
|
|
8087
8087
|
{
|
|
8088
8088
|
"path": "package.json",
|
|
8089
8089
|
"mode": "0000644",
|
|
8090
|
-
"sha256": "
|
|
8090
|
+
"sha256": "0ceb618ebe37f5ce151ca6613d40ab19916b99395de3f0b6848b64d7ebf74057"
|
|
8091
8091
|
},
|
|
8092
8092
|
{
|
|
8093
8093
|
"path": "public-docs/index.html",
|
|
@@ -8432,7 +8432,7 @@
|
|
|
8432
8432
|
{
|
|
8433
8433
|
"path": "scripts/gds/claude-materialize.js",
|
|
8434
8434
|
"mode": "0000644",
|
|
8435
|
-
"sha256": "
|
|
8435
|
+
"sha256": "1bee053fafde559fad140069438ef41a3b5f8055cdc6330f159b7f9b4e9994c6"
|
|
8436
8436
|
},
|
|
8437
8437
|
{
|
|
8438
8438
|
"path": "scripts/gds/claude-md-template.js",
|
|
@@ -10092,7 +10092,7 @@
|
|
|
10092
10092
|
{
|
|
10093
10093
|
"path": "src/module-api.js",
|
|
10094
10094
|
"mode": "0000644",
|
|
10095
|
-
"sha256": "
|
|
10095
|
+
"sha256": "4147e643fea1c191af854b7b08b98a6f6c8e49e384b10f7854b7213a0225f52a"
|
|
10096
10096
|
},
|
|
10097
10097
|
{
|
|
10098
10098
|
"path": "src/module-loader/catalog.js",
|
|
@@ -10872,7 +10872,7 @@
|
|
|
10872
10872
|
{
|
|
10873
10873
|
"path": "tests/claude_materialize.mjs",
|
|
10874
10874
|
"mode": "0000644",
|
|
10875
|
-
"sha256": "
|
|
10875
|
+
"sha256": "256b4192e1ef8fb43539313c569b21435926ef9d149b04cd4903e342fcf14d45"
|
|
10876
10876
|
},
|
|
10877
10877
|
{
|
|
10878
10878
|
"path": "tests/clawback_confirmed_backlog.mjs",
|
|
@@ -2394,5 +2394,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
2394
2394
|
landed since 1.19.958 with no explicit bump. run 35740227000. (task 1002620)
|
|
2395
2395
|
1.19.960 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2396
2396
|
landed since 1.19.959 with no explicit bump. run 35755397900. (task 1002620)
|
|
2397
|
+
1.19.961 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2398
|
+
landed since 1.19.960 with no explicit bump. run 35757951835. (task 1002620)
|
|
2399
|
+
1.19.962 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2400
|
+
landed since 1.19.961 with no explicit bump. run 35761137402. (task 1002620)
|
|
2397
2401
|
---------------------------------------------------------------------------
|
|
2398
2402
|
```
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.962",
|
|
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.962",
|
|
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.962",
|
|
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",
|
|
@@ -392,6 +392,15 @@ const STARTER_DENY_SECRETS = [
|
|
|
392
392
|
'Read(.env.*.local)', 'Read(**/.env.*.local)',
|
|
393
393
|
'Read(**/*.pem)', 'Read(**/id_rsa*)', 'Read(**/id_ed25519*)',
|
|
394
394
|
];
|
|
395
|
+
const SESSION_STORE_DENY = `Read(~/.config/${ic.FALLBACK_DIR}/instances/**)`;
|
|
396
|
+
|
|
397
|
+
// A checkout's settings.json takes the identity rebrand like every copied file, and the store's
|
|
398
|
+
// dir is one of the core's `.config/<dir>` literals it rewrites. The store does not move with the
|
|
399
|
+
// brand (task 1003741), so its rule is put back where the CLI reads it (task 1004155).
|
|
400
|
+
function rebrandSettings(text, rebrand) {
|
|
401
|
+
const moved = rebrand(SESSION_STORE_DENY);
|
|
402
|
+
return rebrand(text).split(JSON.stringify(moved)).join(JSON.stringify(SESSION_STORE_DENY));
|
|
403
|
+
}
|
|
395
404
|
|
|
396
405
|
// Credential files are derived from where the CLI actually reads them, not rebranded from the
|
|
397
406
|
// core's literals: the rebrand would also move the host-keyed store, which sits at a fixed anchor
|
|
@@ -403,7 +412,7 @@ function starterDeny(branding = {}) {
|
|
|
403
412
|
return [
|
|
404
413
|
...STARTER_DENY_SECRETS,
|
|
405
414
|
...dirs.flatMap((dir) => credentialFiles.map((file) => `Read(~/.config/${dir}/${file})`)),
|
|
406
|
-
|
|
415
|
+
SESSION_STORE_DENY,
|
|
407
416
|
...STARTER_SHELL_TOOLS.map((tool) => `${tool}(git stash:*)`),
|
|
408
417
|
];
|
|
409
418
|
}
|
|
@@ -684,7 +693,7 @@ function materializeClaude({ coreRoot, instanceDir, dryRun = false, overwrite =
|
|
|
684
693
|
const settingsOut = readSettingsTransform(settingsSrc);
|
|
685
694
|
if (!dryRun) {
|
|
686
695
|
fs.mkdirSync(destClaude, { recursive: true });
|
|
687
|
-
fs.writeFileSync(settingsDest, settingsOut.parsed ?
|
|
696
|
+
fs.writeFileSync(settingsDest, settingsOut.parsed ? rebrandSettings(settingsOut.text, rebrand) : settingsOut.text);
|
|
688
697
|
}
|
|
689
698
|
addWritten('.claude/settings.json');
|
|
690
699
|
summary.settings = true;
|
package/src/module-api.js
CHANGED
|
@@ -71,7 +71,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
|
|
|
71
71
|
// there. scripts/gds/bump-version.js still rewrites the literal below; it appends
|
|
72
72
|
// the entry to that file. Look for a version's history there, not here.
|
|
73
73
|
// ---------------------------------------------------------------------------
|
|
74
|
-
const CORE_VERSION = '1.19.
|
|
74
|
+
const CORE_VERSION = '1.19.962'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
75
75
|
|
|
76
76
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
77
77
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|
|
@@ -845,16 +845,46 @@ t('every file the CLI reads a session from is denied, the host-keyed store inclu
|
|
|
845
845
|
t("every deny rule in the core's own settings.json reaches the starter", () => {
|
|
846
846
|
// The two lists drift the way the allow halves could: a rule added to the core
|
|
847
847
|
// protects the core and silently no instance. A config-dir file is compared by
|
|
848
|
-
// name, in the instance's dir; everything else must match
|
|
848
|
+
// name, in the instance's dir; everything else — the fixed session store included — must match
|
|
849
|
+
// verbatim.
|
|
849
850
|
const core = JSON.parse(readFileSync(join(ROOT, '.claude', 'settings.json'), 'utf8')).permissions.deny;
|
|
850
851
|
const deny = starterDenyFor({ configDir: 'acme' });
|
|
852
|
+
const store = `Read(${homeRel(cliLib.sessionStoreDir())}/**)`;
|
|
851
853
|
for (const rule of core) {
|
|
852
|
-
const cfg = rule.match(/^Read\(~\/\.config\/[^/]+\/(.+)\)$/);
|
|
854
|
+
const cfg = rule !== store && rule.match(/^Read\(~\/\.config\/[^/]+\/(.+)\)$/);
|
|
853
855
|
const want = cfg ? `Read(~/.config/acme/${cfg[1]})` : rule;
|
|
854
856
|
assert.ok(deny.includes(want), `core deny ${rule} → starter must carry ${want}`);
|
|
855
857
|
}
|
|
856
858
|
});
|
|
857
859
|
|
|
860
|
+
// task 1004155 — the core's own list named two legacy session files and missed the active one
|
|
861
|
+
// (bongos-session.json) and the host-keyed store, so the core's agent could read the live token.
|
|
862
|
+
t("the core's OWN deny list covers every file the CLI reads a session from, and the store", () => {
|
|
863
|
+
const deny = JSON.parse(readFileSync(join(ROOT, '.claude', 'settings.json'), 'utf8')).permissions.deny;
|
|
864
|
+
// The core carries no branding.json, so its CLI reads the fallback dir plus the legacy ones.
|
|
865
|
+
const sessionFiles = ic.configReadDirs({}).flatMap((dir) => ic.SESSION_FILENAMES.map((f) => join(dir, f)));
|
|
866
|
+
for (const p of [...sessionFiles, `${cliLib.sessionStoreDir()}/**`]) {
|
|
867
|
+
assert.ok(deny.includes(`Read(${homeRel(p)})`), `core deny is missing Read(${homeRel(p)})`);
|
|
868
|
+
}
|
|
869
|
+
});
|
|
870
|
+
|
|
871
|
+
t('a checkout-materialized instance keeps the session-store rule at its fixed anchor', () => {
|
|
872
|
+
// The rebrand rewrites every `.config/<core dir>` literal, and the store's dir is one of them —
|
|
873
|
+
// but the store does not move with the brand, so a rebranded rule guards a dir nothing reads.
|
|
874
|
+
const core = mkdtempSync(join(tmpdir(), 'w3-store-core-'));
|
|
875
|
+
const inst = mkdtempSync(join(tmpdir(), 'w3-store-inst-'));
|
|
876
|
+
mkdirSync(join(core, '.claude', 'skills'), { recursive: true });
|
|
877
|
+
const store = `Read(${homeRel(cliLib.sessionStoreDir())}/**)`;
|
|
878
|
+
writeFileSync(join(core, '.claude', 'settings.json'), JSON.stringify({ permissions: { deny: [store] } }));
|
|
879
|
+
mkdirSync(join(inst, 'config'), { recursive: true });
|
|
880
|
+
writeFileSync(join(inst, 'config', 'branding.json'), JSON.stringify({ configDir: 'acme', envPrefix: 'ACME' }));
|
|
881
|
+
m.materializeClaude({ coreRoot: core, instanceDir: inst, dryRun: false });
|
|
882
|
+
const deny = JSON.parse(readFileSync(join(inst, '.claude', 'settings.json'), 'utf8')).permissions.deny;
|
|
883
|
+
assert.deepEqual(deny, [store]);
|
|
884
|
+
rmSync(core, { recursive: true, force: true });
|
|
885
|
+
rmSync(inst, { recursive: true, force: true });
|
|
886
|
+
});
|
|
887
|
+
|
|
858
888
|
// task 1004012 — the other source: a CHECKOUT core root does carry a settings.json, and the
|
|
859
889
|
// instance used to receive its allow-list verbatim, naming scripts its skills no longer run.
|
|
860
890
|
t('a checkout-materialized instance gets allow-rules in the bongos form, end to end', () => {
|