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 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
  [![CI](https://github.com/aihxp/godpowers/actions/workflows/ci.yml/badge.svg)](https://github.com/aihxp/godpowers/actions/workflows/ci.yml)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
5
- [![Version](https://img.shields.io/badge/version-2.5.1-blue)](CHANGELOG.md)
5
+ [![Version](https://img.shields.io/badge/version-2.5.2-blue)](CHANGELOG.md)
6
6
  [![npm](https://img.shields.io/npm/v/godpowers.svg)](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.1 adds three Codex host-run proof studies on top of the 2.5.0
34
- executable tier gates, while keeping the 2.4 command-family UX, external CLI
35
- canary evidence, prompt-size guardrails, legacy command quarantine, lib
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 Release
1
+ # Godpowers 2.5.2 Release
2
2
 
3
- > Status: Release candidate
3
+ > Status: Ready for protected merge
4
4
  > Date: 2026-06-10
5
5
 
6
- Godpowers 2.5.1 ships the Phase 2 host proof campaign as a docs patch release.
7
- It keeps the 2.5.0 executable tier gates intact while adding Codex host-run
8
- evidence for a CLI package, a browser app, and a TODO-backed React component
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
- - Run A completed a Codex host proof on slugify-cli with 13 of 13 workflow steps
22
- complete, 16 of 16 requirements done, passing tests, passing production
23
- audit, passing pack dry run, and no tracked source diff.
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
- - `npm run test:e2e` passed.
37
- - `node scripts/test-runtime-verification.js` passed.
38
- - `node scripts/test-agent-browser.js` passed.
39
- - `npm run release:check` passed before publish.
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.1` or `npx godpowers@2.5.1`
44
- - Re-run `/god-context` in each project to refresh installed runtime metadata.
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
- - GitHub release created for `v2.5.1`.
50
- - The tag matches the npm package version.
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
- const commands = [];
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 backtick = line.match(/`([^`\n]+)`/);
121
- const labeled = line.match(/\bcommand\s*:\s*([^;]+?)(?:\s{2,}|\s+status\s*:|\s+result\s*:|$)/i);
122
- const command = backtick ? backtick[1].trim() : (labeled ? labeled[1].trim() : null);
123
- if (!command) continue;
124
- if (/\b(pass|passed|green|success|succeeded|ok)\b/i.test(line)) {
125
- commands.push(command);
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 [...new Set(commands)];
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
@@ -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.1",
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"