godpowers 2.5.1 → 2.5.2
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/CHANGELOG.md +16 -0
- package/README.md +4 -5
- package/RELEASE.md +33 -34
- package/lib/gate.js +69 -8
- package/lib/installer-files.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.5.2] - 2026-06-10
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Added regression coverage proving an installed `godpowers-runtime` bundle can
|
|
14
|
+
be used as a local npm package for `godpowers gate`.
|
|
15
|
+
- Added regression coverage proving build gates fail when build state records a
|
|
16
|
+
failed verification command.
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
- Fixed installed runtime bundles so `godpowers-runtime` includes `bin/` next
|
|
20
|
+
to `package.json`, allowing host workflows to call the documented
|
|
21
|
+
`godpowers gate` command from the installed runtime package.
|
|
22
|
+
- Fixed the build gate so `.godpowers/build/STATE.md` fails closed when any
|
|
23
|
+
verification command is recorded as failed, instead of passing because a
|
|
24
|
+
different command passed.
|
|
25
|
+
|
|
10
26
|
## [2.5.1] - 2026-06-10
|
|
11
27
|
|
|
12
28
|
### Added
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://github.com/aihxp/godpowers/actions/workflows/ci.yml)
|
|
4
4
|
[](LICENSE)
|
|
5
|
-
[](CHANGELOG.md)
|
|
6
6
|
[](https://www.npmjs.com/package/godpowers)
|
|
7
7
|
|
|
8
8
|
**Ship fast. Ship right. Ship everything. Ship accountably.**
|
|
@@ -30,10 +30,9 @@ Godpowers makes AI coding accountable: every serious run should leave disk
|
|
|
30
30
|
state, artifacts, validation gates, host guarantees, and a next action. Code is
|
|
31
31
|
only one output. The project memory and proof trail matter too.
|
|
32
32
|
|
|
33
|
-
Version 2.5.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
coverage gating, and package verification before publish.
|
|
33
|
+
Version 2.5.2 keeps the 2.5.1 Codex host-run proof studies and patches two
|
|
34
|
+
Phase 2 blocker defects: installed runtime gate command access and build-gate
|
|
35
|
+
false passes when verification evidence is red.
|
|
37
36
|
|
|
38
37
|
Maintainer hardening continues on the 2.x line with small, audited public
|
|
39
38
|
surface updates when they close real workflow gaps. The 2.1.0 patch closes a command-injection vector in the
|
package/RELEASE.md
CHANGED
|
@@ -1,52 +1,51 @@
|
|
|
1
|
-
# Godpowers 2.5.
|
|
1
|
+
# Godpowers 2.5.2 Release
|
|
2
2
|
|
|
3
|
-
> Status:
|
|
3
|
+
> Status: Ready for protected merge
|
|
4
4
|
> Date: 2026-06-10
|
|
5
5
|
|
|
6
|
-
Godpowers 2.5.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
project.
|
|
6
|
+
[DECISION] Godpowers 2.5.2 is a Phase 2 blocker patch after the 2.5.1 host-proof docs release.
|
|
7
|
+
[DECISION] This release fixes the installed-runtime gate command gap and build-gate false-pass gap captured during Phase 2 proof work.
|
|
8
|
+
[DECISION] This release does not change the 2.5.1 host-proof case-study claims.
|
|
10
9
|
|
|
11
10
|
## What's in this release
|
|
12
11
|
|
|
13
|
-
- 112 slash commands
|
|
14
|
-
- 40 specialist agents
|
|
15
|
-
- 13 executable workflows
|
|
16
|
-
- 42 intent recipes
|
|
17
|
-
- 8 installer CLI helpers
|
|
12
|
+
- [DECISION] 112 slash commands.
|
|
13
|
+
- [DECISION] 40 specialist agents.
|
|
14
|
+
- [DECISION] 13 executable workflows.
|
|
15
|
+
- [DECISION] 42 intent recipes.
|
|
16
|
+
- [DECISION] 8 installer CLI helpers.
|
|
18
17
|
|
|
19
18
|
## Highlights
|
|
20
19
|
|
|
21
|
-
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
- Run B completed a Codex host proof on Countdown with local browser evidence,
|
|
25
|
-
6 of 7 requirements done, dependency audit repair, and deployed-origin proof
|
|
26
|
-
deferred pending a staging URL.
|
|
27
|
-
- Run C completed a documented failed Codex host proof on
|
|
28
|
-
react-github-readme-button, with local tests, lint, build, browser smoke, and
|
|
29
|
-
production audit passing before the run blocked on Critical dev-tooling audit
|
|
30
|
-
findings.
|
|
31
|
-
- The host proof campaign captured command usage, gate failures, repairs,
|
|
32
|
-
blocker files, cost availability, and proof limits in `docs/case-studies/`.
|
|
20
|
+
- [DECISION] `godpowers-runtime` now includes `bin/` next to `package.json`, so host workflows can run `npm exec --package <runtime> -- godpowers gate`.
|
|
21
|
+
- [DECISION] Build gates now fail closed when `.godpowers/build/STATE.md` records any failed verification command.
|
|
22
|
+
- [DECISION] Slot A, Slot B, and Slot C evidence remains the repository state shipped in 2.5.1.
|
|
33
23
|
|
|
34
24
|
## Validation
|
|
35
25
|
|
|
36
|
-
- `
|
|
37
|
-
- `node scripts/test-
|
|
38
|
-
- `
|
|
39
|
-
- `
|
|
26
|
+
- [DECISION] `node scripts/test-gate.js` passed before the latest `main` merge.
|
|
27
|
+
- [DECISION] `node scripts/test-install-smoke.js` passed before the latest `main` merge.
|
|
28
|
+
- [DECISION] `npm run test:e2e` passed before the latest `main` merge.
|
|
29
|
+
- [DECISION] `node scripts/test-runtime-verification.js` passed before the latest `main` merge.
|
|
30
|
+
- [DECISION] `node scripts/test-agent-browser.js` passed before the latest `main` merge.
|
|
31
|
+
- [DECISION] `node scripts/static-check.js` passed before the latest `main` merge.
|
|
32
|
+
- [DECISION] `npm run release:check` passed before the latest `main` merge with `coverage:lib` at 92.9 percent line coverage, `npm audit --omit=dev` reporting 0 vulnerabilities, public surface docs matching version 2.5.1, and package contents verified at 534 files.
|
|
33
|
+
- [DECISION] Post-merge 2.5.2 `npm run test:surface` passed.
|
|
34
|
+
- [DECISION] Post-merge 2.5.2 `node scripts/test-gate.js` passed.
|
|
35
|
+
- [DECISION] Post-merge 2.5.2 `node scripts/test-install-smoke.js` passed.
|
|
36
|
+
- [DECISION] Post-merge 2.5.2 `node scripts/static-check.js` passed.
|
|
37
|
+
- [DECISION] Post-merge 2.5.2 `npm run test:e2e` passed.
|
|
38
|
+
- [DECISION] Post-merge 2.5.2 `node scripts/test-runtime-verification.js` passed.
|
|
39
|
+
- [DECISION] Post-merge 2.5.2 `node scripts/test-agent-browser.js` passed.
|
|
40
|
+
- [DECISION] Post-merge 2.5.2 `npm run release:check` passed with `coverage:lib` at 92.9 percent line coverage, `npm audit --omit=dev` reporting 0 vulnerabilities, public surface docs matching version 2.5.2, and package contents verified at 534 files.
|
|
40
41
|
|
|
41
42
|
## Upgrade
|
|
42
43
|
|
|
43
|
-
- `npm install -g godpowers@2.5.
|
|
44
|
-
-
|
|
45
|
-
- Existing `.godpowers/` state remains compatible.
|
|
44
|
+
- [DECISION] Use `npm install -g godpowers@2.5.2` or `npx godpowers@2.5.2` after the package is published.
|
|
45
|
+
- [DECISION] Reinstall Godpowers in host runtimes to refresh the installed runtime bundle.
|
|
46
|
+
- [DECISION] Existing `.godpowers/` state remains compatible.
|
|
46
47
|
|
|
47
48
|
## Notes
|
|
48
49
|
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
- The `v2.5.1` tag points to the release commit that matches the npm
|
|
52
|
-
`godpowers@2.5.1` package.
|
|
50
|
+
- [DECISION] The npm `godpowers@2.5.1` package is already published.
|
|
51
|
+
- [DECISION] Publishing 2.5.2 remains pending until protected merge, tag, and npm provenance publish complete.
|
package/lib/gate.js
CHANGED
|
@@ -115,17 +115,57 @@ function checkArtifacts(projectRoot, tier, artifacts, opts, result) {
|
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
function extractPassedCommands(text) {
|
|
118
|
-
|
|
118
|
+
return extractCommandStatuses(text)
|
|
119
|
+
.filter((entry) => entry.status === 'pass')
|
|
120
|
+
.map((entry) => entry.command)
|
|
121
|
+
.filter((command, index, commands) => commands.indexOf(command) === index);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function extractFailedCommands(text) {
|
|
125
|
+
return extractCommandStatuses(text)
|
|
126
|
+
.filter((entry) => entry.status === 'fail')
|
|
127
|
+
.map((entry) => entry.command)
|
|
128
|
+
.filter((command, index, commands) => commands.indexOf(command) === index);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function extractCommand(line) {
|
|
132
|
+
const exact = line.match(/\b(?:exact\s+executed\s+command|verification\s+command|command)\s*:\s*`([^`\n]+)`/i);
|
|
133
|
+
if (exact) return exact[1].trim();
|
|
134
|
+
const backtickWithStatus = line.match(/`([^`\n]+)`\s*:\s*(pass|passed|green|success|succeeded|ok|fail|failed|red|error)\b/i);
|
|
135
|
+
if (backtickWithStatus) return backtickWithStatus[1].trim();
|
|
136
|
+
const labeled = line.match(/\bcommand\s*:\s*([^;]+?)(?:\s{2,}|\s+status\s*:|\s+result\s*:|$)/i);
|
|
137
|
+
return labeled ? labeled[1].trim() : null;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function explicitStatus(line) {
|
|
141
|
+
const status = line.match(/\b(?:status|result|gate status)\s*:\s*(pass|passed|green|success|succeeded|ok|fail|failed|red|error)\b/i);
|
|
142
|
+
if (!status) return null;
|
|
143
|
+
return /fail|red|error/i.test(status[1]) ? 'fail' : 'pass';
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function inlineCommandStatus(line) {
|
|
147
|
+
if (/\b(fail|failed|red|error)\b/i.test(line)) return 'fail';
|
|
148
|
+
if (/\b(pass|passed|green|success|succeeded|ok)\b/i.test(line)) return 'pass';
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function extractCommandStatuses(text) {
|
|
153
|
+
const entries = [];
|
|
154
|
+
let currentCommand = null;
|
|
119
155
|
for (const line of text.split(/\r?\n/)) {
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
156
|
+
const command = extractCommand(line);
|
|
157
|
+
if (command) {
|
|
158
|
+
currentCommand = command;
|
|
159
|
+
const status = explicitStatus(line) || inlineCommandStatus(line);
|
|
160
|
+
if (status) entries.push({ command, status });
|
|
161
|
+
continue;
|
|
126
162
|
}
|
|
163
|
+
|
|
164
|
+
if (!currentCommand) continue;
|
|
165
|
+
const status = explicitStatus(line);
|
|
166
|
+
if (status) entries.push({ command: currentCommand, status });
|
|
127
167
|
}
|
|
128
|
-
return
|
|
168
|
+
return entries;
|
|
129
169
|
}
|
|
130
170
|
|
|
131
171
|
function checkBuildEvidence(projectRoot, result) {
|
|
@@ -133,6 +173,25 @@ function checkBuildEvidence(projectRoot, result) {
|
|
|
133
173
|
const file = relToAbs(projectRoot, relPath);
|
|
134
174
|
if (!fs.existsSync(file)) return;
|
|
135
175
|
const text = fs.readFileSync(file, 'utf8');
|
|
176
|
+
const failedCommands = extractFailedCommands(text);
|
|
177
|
+
if (failedCommands.length > 0) {
|
|
178
|
+
const finding = makeFinding(
|
|
179
|
+
'build-verification-failed-command',
|
|
180
|
+
'error',
|
|
181
|
+
relPath,
|
|
182
|
+
`Build state records failed verification command(s): ${failedCommands.join(', ')}.`
|
|
183
|
+
);
|
|
184
|
+
result.findings.push(finding);
|
|
185
|
+
addFindingSummary(result.summary, finding.severity);
|
|
186
|
+
result.checks.push(makeCheck(
|
|
187
|
+
'build-verification-failed-command',
|
|
188
|
+
'fail',
|
|
189
|
+
relPath,
|
|
190
|
+
finding.reason
|
|
191
|
+
));
|
|
192
|
+
result.summary.buildVerificationFailedCommands = failedCommands;
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
136
195
|
const passedCommands = extractPassedCommands(text);
|
|
137
196
|
if (passedCommands.length === 0) {
|
|
138
197
|
const finding = makeFinding(
|
|
@@ -265,6 +324,8 @@ function render(result) {
|
|
|
265
324
|
module.exports = {
|
|
266
325
|
check,
|
|
267
326
|
checkAsync,
|
|
327
|
+
extractCommandStatuses,
|
|
328
|
+
extractFailedCommands,
|
|
268
329
|
extractPassedCommands,
|
|
269
330
|
exitCode,
|
|
270
331
|
render
|
package/lib/installer-files.js
CHANGED
|
@@ -65,7 +65,7 @@ function copyRecursive(src, dest, root) {
|
|
|
65
65
|
|
|
66
66
|
function copyRuntimeBundle(srcDir, destDir) {
|
|
67
67
|
ensureDir(destDir);
|
|
68
|
-
for (const dir of ['lib', 'routing', 'workflows', 'schema', 'templates', 'references']) {
|
|
68
|
+
for (const dir of ['bin', 'lib', 'routing', 'workflows', 'schema', 'templates', 'references']) {
|
|
69
69
|
const src = path.join(srcDir, dir);
|
|
70
70
|
if (fs.existsSync(src)) {
|
|
71
71
|
copyRecursive(src, path.join(destDir, dir));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "godpowers",
|
|
3
|
-
"version": "2.5.
|
|
3
|
+
"version": "2.5.2",
|
|
4
4
|
"description": "AI-powered development system: 112 slash commands and 40 specialist agents that take a project from raw idea to hardened production. Runs inside Claude Code, Codex, Cursor, Windsurf, Gemini, and 10+ other AI coding tools.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"godpowers": "./bin/install.js"
|