@bongos/core 1.20.14 → 1.20.15
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 +13 -13
- package/docs/module-api-changelog.md +2 -0
- package/docs/recipes/autobongos-windows-host.md +19 -3
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +6 -0
- package/scripts/gds/autobongos-service.ps1 +25 -2
- package/src/module-api.js +1 -1
- package/tests/autobongos_service_ps1.mjs +52 -0
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.20.
|
|
6
|
-
"core_contract": "1.20.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.20.15",
|
|
6
|
+
"core_contract": "1.20.15",
|
|
7
|
+
"source_commit": "139b563191ef97af7e538f783d3fb256baa6c075",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-30T12:
|
|
9
|
+
"built_at": "2026-09-30T12:16:56.172Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 556,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 3210,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "814cbc7e5df7346b441a3ac6faa4217852105b51708505d98b9e090d68bd8b6a",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -2772,7 +2772,7 @@
|
|
|
2772
2772
|
{
|
|
2773
2773
|
"path": "docs/module-api-changelog.md",
|
|
2774
2774
|
"mode": "0000644",
|
|
2775
|
-
"sha256": "
|
|
2775
|
+
"sha256": "05833e301ee659bde426bdae2d327183b03a6e40b08230a07ce99ba8ccef9705"
|
|
2776
2776
|
},
|
|
2777
2777
|
{
|
|
2778
2778
|
"path": "docs/modules-contract.md",
|
|
@@ -2882,7 +2882,7 @@
|
|
|
2882
2882
|
{
|
|
2883
2883
|
"path": "docs/recipes/autobongos-windows-host.md",
|
|
2884
2884
|
"mode": "0000644",
|
|
2885
|
-
"sha256": "
|
|
2885
|
+
"sha256": "e70faa969725827307388ccb0620bde203500333ed299d860ca7a001cc8577a1"
|
|
2886
2886
|
},
|
|
2887
2887
|
{
|
|
2888
2888
|
"path": "docs/recipes/bongos-cli-release.md",
|
|
@@ -8862,12 +8862,12 @@
|
|
|
8862
8862
|
{
|
|
8863
8863
|
"path": "package-lock.json",
|
|
8864
8864
|
"mode": "0000644",
|
|
8865
|
-
"sha256": "
|
|
8865
|
+
"sha256": "cc8381c4866cb96ae92e56199b4666a515f8c4fb6aa0214fe332a2c960f5c9df"
|
|
8866
8866
|
},
|
|
8867
8867
|
{
|
|
8868
8868
|
"path": "package.json",
|
|
8869
8869
|
"mode": "0000644",
|
|
8870
|
-
"sha256": "
|
|
8870
|
+
"sha256": "5125b2ece4cbf29c1c89b0eec97b4bce224fa0b25c8b3351e0b6253ade41c8e5"
|
|
8871
8871
|
},
|
|
8872
8872
|
{
|
|
8873
8873
|
"path": "public-docs/index.html",
|
|
@@ -8887,7 +8887,7 @@
|
|
|
8887
8887
|
{
|
|
8888
8888
|
"path": "release-notes.json",
|
|
8889
8889
|
"mode": "0000644",
|
|
8890
|
-
"sha256": "
|
|
8890
|
+
"sha256": "d12e72f6946fb8c0884d7b014d8673e58314ad5ff4d01593d397f5d96d8c8a6e"
|
|
8891
8891
|
},
|
|
8892
8892
|
{
|
|
8893
8893
|
"path": "scripts/bongos-mcp.js",
|
|
@@ -9057,7 +9057,7 @@
|
|
|
9057
9057
|
{
|
|
9058
9058
|
"path": "scripts/gds/autobongos-service.ps1",
|
|
9059
9059
|
"mode": "0000644",
|
|
9060
|
-
"sha256": "
|
|
9060
|
+
"sha256": "b1e038bb70ace1652b85a4d29f5a68761c6b432fd50fbfdafb5e1e38d93627de"
|
|
9061
9061
|
},
|
|
9062
9062
|
{
|
|
9063
9063
|
"path": "scripts/gds/autobongos-verify.js",
|
|
@@ -11002,7 +11002,7 @@
|
|
|
11002
11002
|
{
|
|
11003
11003
|
"path": "src/module-api.js",
|
|
11004
11004
|
"mode": "0000644",
|
|
11005
|
-
"sha256": "
|
|
11005
|
+
"sha256": "d97c483c3599928877210a4ceea2c9a384cf61dc86d1fec156de8a95dce743e5"
|
|
11006
11006
|
},
|
|
11007
11007
|
{
|
|
11008
11008
|
"path": "src/module-loader/catalog.js",
|
|
@@ -11457,7 +11457,7 @@
|
|
|
11457
11457
|
{
|
|
11458
11458
|
"path": "tests/autobongos_service_ps1.mjs",
|
|
11459
11459
|
"mode": "0000644",
|
|
11460
|
-
"sha256": "
|
|
11460
|
+
"sha256": "34ca7d75bc83d9c4a77706dd06ecc170011ef52b7ee77eea5c3b77ac514389d0"
|
|
11461
11461
|
},
|
|
11462
11462
|
{
|
|
11463
11463
|
"path": "tests/autobongos_verify.mjs",
|
|
@@ -2685,5 +2685,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
2685
2685
|
landed since 1.20.12 with no explicit bump. run 36710762884. (task 1002620)
|
|
2686
2686
|
1.20.14 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2687
2687
|
landed since 1.20.13 with no explicit bump. run 36712510525. (task 1002620)
|
|
2688
|
+
1.20.15 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2689
|
+
landed since 1.20.14 with no explicit bump. run 36713710510. (task 1002620)
|
|
2688
2690
|
---------------------------------------------------------------------------
|
|
2689
2691
|
```
|
|
@@ -18,7 +18,7 @@ Task [1003905](https://cloudbongos.com/builders#/task/1003905).
|
|
|
18
18
|
|
|
19
19
|
## What you need on the box first
|
|
20
20
|
|
|
21
|
-
Open PowerShell as your
|
|
21
|
+
Open PowerShell as your own user and check all three:
|
|
22
22
|
|
|
23
23
|
```powershell
|
|
24
24
|
node --version ; git --version ; claude --version
|
|
@@ -28,7 +28,7 @@ All three must print a version. The installer refuses to proceed otherwise —
|
|
|
28
28
|
a runner that starts without `claude` on its PATH fails every worker and looks
|
|
29
29
|
like a mysterious outage in the log rather than a missing program.
|
|
30
30
|
|
|
31
|
-
You also need, as **your own user** (not
|
|
31
|
+
You also need, as **your own user** (not a separate administrator account):
|
|
32
32
|
|
|
33
33
|
- a `git` credential that can fetch the repo,
|
|
34
34
|
- a signed-in Claude Code session,
|
|
@@ -53,13 +53,29 @@ machine can write, the worker running on it can write too.
|
|
|
53
53
|
|
|
54
54
|
## 2. Install the scheduled task
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
**This step, and only this step, needs an Administrator shell.** Right-click
|
|
57
|
+
PowerShell, choose **Run as administrator**, and sign in to the prompt as the
|
|
58
|
+
**same user** you checked the prerequisites with — then, from the checkout:
|
|
57
59
|
|
|
58
60
|
```powershell
|
|
59
61
|
powershell -ExecutionPolicy Bypass -File scripts\gds\autobongos-service.ps1 install
|
|
60
62
|
powershell -ExecutionPolicy Bypass -File scripts\gds\autobongos-service.ps1 start
|
|
61
63
|
```
|
|
62
64
|
|
|
65
|
+
Why admin, when the runner deliberately is not: two different things happen
|
|
66
|
+
here. **Registering** the task needs admin, because it uses the S4U logon type
|
|
67
|
+
(run whether or not anyone is signed in), and Windows only lets an elevated
|
|
68
|
+
shell register one — from a normal shell `install` stops and says so, rather
|
|
69
|
+
than failing with a bare *Access is denied*. **Running** the task does not: it
|
|
70
|
+
runs as you, unelevated (`-RunLevel Limited`), which is what lets it use your
|
|
71
|
+
git credential and Claude session. Elevating the same account keeps your
|
|
72
|
+
username, so the task is still registered to run as you.
|
|
73
|
+
|
|
74
|
+
Do **not** install it as SYSTEM, or from a different administrator account:
|
|
75
|
+
the task would run as that account, which has none of your credentials. If
|
|
76
|
+
your own account is not an administrator on this PC, make it one for the
|
|
77
|
+
install rather than elevating as someone else.
|
|
78
|
+
|
|
63
79
|
That registers a task called `Autobongos` that starts **at boot** (not at sign-in
|
|
64
80
|
— nobody should have to log in), restarts if it crashes, and never times out.
|
|
65
81
|
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.20.
|
|
3
|
+
"version": "1.20.15",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.20.
|
|
9
|
+
"version": "1.20.15",
|
|
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.20.
|
|
3
|
+
"version": "1.20.15",
|
|
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",
|
package/release-notes.json
CHANGED
|
@@ -8140,5 +8140,11 @@
|
|
|
8140
8140
|
"id": "1004397",
|
|
8141
8141
|
"text": "The unattended runner now records which version of the code it is running from its very first check-in, instead of leaving that blank for its first minute, which is exactly when someone is trying to find out."
|
|
8142
8142
|
}
|
|
8143
|
+
],
|
|
8144
|
+
"1.20.15": [
|
|
8145
|
+
{
|
|
8146
|
+
"id": "1004177",
|
|
8147
|
+
"text": "Installing the Windows runner now tells you up front that it needs an administrator window, and why, instead of failing with a bare \"access denied\"; the setup guide no longer says the opposite."
|
|
8148
|
+
}
|
|
8143
8149
|
]
|
|
8144
8150
|
}
|
|
@@ -25,7 +25,8 @@
|
|
|
25
25
|
# UNPRIVILEGED ON PURPOSE. It runs as the logged-in user, not SYSTEM: the runner
|
|
26
26
|
# needs that user's git credential, npm config and Claude session, and SYSTEM has
|
|
27
27
|
# none of them. It is also the smaller blast radius for a process that spawns
|
|
28
|
-
# workers with blanket bypassPermissions.
|
|
28
|
+
# workers with blanket bypassPermissions. (INSTALLING it is the one step that
|
|
29
|
+
# needs an elevated shell of that same user -- see Assert-Prereqs, task 1004177.)
|
|
29
30
|
|
|
30
31
|
[CmdletBinding()]
|
|
31
32
|
param(
|
|
@@ -49,10 +50,32 @@ $LogDir = Join-Path $env:LOCALAPPDATA 'cloudbongos'
|
|
|
49
50
|
$LogFile = Join-Path $LogDir 'autobongos.log'
|
|
50
51
|
$Wrapper = Join-Path $RepoRoot 'scripts\gds\autobongos-service.cmd'
|
|
51
52
|
|
|
53
|
+
# Is this shell elevated (Run as administrator)? Its own function so the tests
|
|
54
|
+
# can stand it in: the check is Windows-only, and CI runs on Linux.
|
|
55
|
+
function Test-Elevated {
|
|
56
|
+
$id = [Security.Principal.WindowsIdentity]::GetCurrent()
|
|
57
|
+
return ([Security.Principal.WindowsPrincipal]$id).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
# REGISTERING vs RUNNING (task 1004177). The task RUNS as this user, unelevated
|
|
61
|
+
# (-RunLevel Limited): that is what reaches the user's git credential and Claude
|
|
62
|
+
# session, and it is load-bearing. But REGISTERING a task with an S4U principal
|
|
63
|
+
# needs an elevated shell -- unelevated, Register-ScheduledTask fails with a bare
|
|
64
|
+
# "Access is denied" (0x80070005) that says nothing about why. Elevating the SAME
|
|
65
|
+
# account keeps $env:USERNAME, so the principal below is still this user. So
|
|
66
|
+
# install -- and only install -- checks, and says so in words, before trying.
|
|
67
|
+
$ElevationNeeded = @(
|
|
68
|
+
'install needs an elevated shell: registering a task that runs whether or not you are signed in (the S4U logon type) requires Administrator.',
|
|
69
|
+
'Open PowerShell with "Run as administrator" AS THIS SAME USER and run install again. The task still RUNS as you, unelevated (-RunLevel Limited) -- only the registration needs admin.',
|
|
70
|
+
'Do NOT install it as SYSTEM or another admin account: the runner needs your git credential and Claude session, and SYSTEM has neither.'
|
|
71
|
+
) -join ' '
|
|
72
|
+
|
|
52
73
|
function Assert-Prereqs {
|
|
74
|
+
param([switch]$ForInstall)
|
|
53
75
|
if (-not (Test-Path (Join-Path $RepoRoot 'scripts\gds\autobongos-run.js'))) {
|
|
54
76
|
throw "No autobongos-run.js under $RepoRoot -- pass -RepoRoot <path to the checkout>."
|
|
55
77
|
}
|
|
78
|
+
if ($ForInstall -and -not (Test-Elevated)) { throw $ElevationNeeded }
|
|
56
79
|
foreach ($exe in @('node', 'git', 'claude')) {
|
|
57
80
|
if (-not (Get-Command $exe -ErrorAction SilentlyContinue)) {
|
|
58
81
|
# Named, not guessed at: a runner that starts without `claude` on PATH will
|
|
@@ -191,7 +214,7 @@ if ($MyInvocation.InvocationName -eq '.') { return }
|
|
|
191
214
|
|
|
192
215
|
switch ($Action) {
|
|
193
216
|
'install' {
|
|
194
|
-
Assert-Prereqs
|
|
217
|
+
Assert-Prereqs -ForInstall
|
|
195
218
|
New-Item -ItemType Directory -Force -Path $LogDir | Out-Null
|
|
196
219
|
|
|
197
220
|
# NOT $action: PowerShell variable names are CASE-INSENSITIVE, so $action IS the
|
package/src/module-api.js
CHANGED
|
@@ -75,7 +75,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
|
|
|
75
75
|
// MAJOR (see allowBoxScope below): passes the request through untouched.
|
|
76
76
|
function deprecatedNoopMiddleware(_req, _res, next) { next(); }
|
|
77
77
|
|
|
78
|
-
const CORE_VERSION = '1.20.
|
|
78
|
+
const CORE_VERSION = '1.20.15'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
79
79
|
|
|
80
80
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
81
81
|
// Usage: const log = api.logger('discord'); log.info('mounted');
|
|
@@ -152,3 +152,55 @@ test('stop honours AUTOBONGOS_HEARTBEAT_FILE exactly as the runner does', { skip
|
|
|
152
152
|
const r = await ps("'HB=' + (Get-HeartbeatFile)", { AUTOBONGOS_HEARTBEAT_FILE: override });
|
|
153
153
|
assert.equal(path.resolve(r.out.match(/HB=(.*)/)[1].trim()), path.resolve(override), r.out);
|
|
154
154
|
});
|
|
155
|
+
|
|
156
|
+
// --- install needs an elevated shell, and says why (task 1004177) -------------
|
|
157
|
+
//
|
|
158
|
+
// Registering an S4U task needs Administrator; unelevated, Register-ScheduledTask
|
|
159
|
+
// throws a bare "Access is denied". The recipe used to say the opposite. Test-
|
|
160
|
+
// Elevated is stood in (it is Windows-only), everything else is the real script.
|
|
161
|
+
// The stub runs AFTER the dot-source, so it replaces the script's own definition.
|
|
162
|
+
|
|
163
|
+
const assertPrereqs = (elevated, args) =>
|
|
164
|
+
`function Test-Elevated { $${elevated} }; ` +
|
|
165
|
+
`try { Assert-Prereqs ${args}; 'PASSED' } catch { 'THREW=' + $_.Exception.Message }`;
|
|
166
|
+
|
|
167
|
+
test('install from an unelevated shell is refused with the reason, not a bare access-denied', { skip }, async () => {
|
|
168
|
+
const r = await ps(assertPrereqs('false', '-ForInstall'));
|
|
169
|
+
assert.match(r.out, /THREW=install needs an elevated shell/, r.out);
|
|
170
|
+
assert.match(r.out, /S4U/);
|
|
171
|
+
assert.match(r.out, /Run as administrator/);
|
|
172
|
+
assert.match(r.out, /SAME USER/, 'elevating the same account is what keeps the principal right');
|
|
173
|
+
assert.match(r.out, /still RUNS as you, unelevated/);
|
|
174
|
+
assert.match(r.out, /Do NOT install it as SYSTEM/);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
test('an elevated shell passes the elevation check', { skip }, async () => {
|
|
178
|
+
const r = await ps(assertPrereqs('true', '-ForInstall'));
|
|
179
|
+
// It may still stop on a later prereq (a CI runner has no `claude`), but
|
|
180
|
+
// never on elevation.
|
|
181
|
+
assert.doesNotMatch(r.out, /elevated shell/, r.out);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
test('only install asks for elevation', { skip }, async () => {
|
|
185
|
+
const r = await ps(assertPrereqs('false', ''));
|
|
186
|
+
assert.doesNotMatch(r.out, /elevated shell/, r.out);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
test('the install arm runs the install-only check', () => {
|
|
190
|
+
const live = readFileSync(PS1, 'utf8').split(/\r?\n/).map((l) => l.replace(/#.*$/, '')).join('\n');
|
|
191
|
+
const installArm = live.slice(live.indexOf("'install' {"), live.indexOf("'uninstall' {"));
|
|
192
|
+
assert.match(installArm, /Assert-Prereqs -ForInstall/);
|
|
193
|
+
assert.ok(installArm.indexOf('Assert-Prereqs -ForInstall') < installArm.indexOf('Register-ScheduledTask'),
|
|
194
|
+
'the check must run before the registration it explains');
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
test('the recipe says install needs Administrator, and why, and not SYSTEM', () => {
|
|
198
|
+
const doc = readFileSync(fileURLToPath(new URL('../docs/recipes/autobongos-windows-host.md', import.meta.url)), 'utf8');
|
|
199
|
+
assert.doesNotMatch(doc, /normal user \(not Administrator\)/, 'the instruction that made install fail');
|
|
200
|
+
const install = doc.slice(doc.indexOf('## 2. Install the scheduled task'), doc.indexOf('## 3.'));
|
|
201
|
+
assert.match(install, /Run as administrator/);
|
|
202
|
+
assert.match(install, /S4U/);
|
|
203
|
+
assert.match(install, /same (user|account)/i);
|
|
204
|
+
assert.match(install, /SYSTEM/);
|
|
205
|
+
assert.match(install, /-RunLevel Limited/);
|
|
206
|
+
});
|