godpowers 2.5.0 → 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,35 @@ 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
+
26
+ ## [2.5.1] - 2026-06-10
27
+
28
+ ### Added
29
+ - Added three Codex host-run proof case studies for slugify-cli, Countdown, and
30
+ react-github-readme-button.
31
+ - Added Phase 2 proof evidence for successful CLI and web app runs plus one
32
+ blocked harden run with Critical dev-tooling findings preserved as a public
33
+ blocker.
34
+
35
+ ### Changed
36
+ - Updated USERS, README, roadmap, reference, architecture, release notes, and
37
+ bridge-plan status for the Phase 2 host proof campaign.
38
+
10
39
  ## [2.5.0] - 2026-06-10
11
40
 
12
41
  ### 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.0-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.**
@@ -21,15 +21,18 @@ CLI-verifiable canaries now cover [sindresorhus/is](docs/case-studies/sindresorh
21
21
  [expressjs/cors](docs/case-studies/expressjs-cors-adoption-canary.md), and
22
22
  [tinyhttp/tinyhttp](docs/case-studies/tinyhttp-adoption-canary.md), with host
23
23
  slash-command gaps called out rather than hidden.
24
+ Host-run proof studies now cover [slugify-cli](docs/case-studies/run-a.md),
25
+ [Countdown](docs/case-studies/run-b.md), and
26
+ [react-github-readme-button](docs/case-studies/run-c.md), including one
27
+ blocked harden run recorded as evidence instead of hidden as success.
24
28
 
25
29
  Godpowers makes AI coding accountable: every serious run should leave disk
26
30
  state, artifacts, validation gates, host guarantees, and a next action. Code is
27
31
  only one output. The project memory and proof trail matter too.
28
32
 
29
- Version 2.5.0 adds executable tier gates through `npx godpowers gate` while
30
- keeping the 2.4 command-family UX, external CLI canary evidence, prompt-size
31
- guardrails, legacy command quarantine, lib coverage gating, and package
32
- 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.
33
36
 
34
37
  Maintainer hardening continues on the 2.x line with small, audited public
35
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.0 Release
1
+ # Godpowers 2.5.2 Release
2
2
 
3
- > Status: Ready for package verification
3
+ > Status: Ready for protected merge
4
4
  > Date: 2026-06-10
5
5
 
6
- Godpowers 2.5.0 ships executable tier gates for the code-first kernel
7
- migration. It keeps the slash-command workflow intact while giving command
8
- capable hosts a stable JSON gate contract and non-zero exit codes for blocked
9
- tier transitions.
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
- - `npx godpowers gate --tier=<tier> --project=.` checks PRD, design,
22
- architecture, roadmap, stack, repo, build, and harden artifacts.
23
- - Gate JSON returns `{tier, verdict, artifacts, checks, findings, summary}` for
24
- host-visible evidence.
25
- - Build gates require `.godpowers/build/STATE.md` to record exact verification
26
- commands that passed.
27
- - Harden gates fail unresolved Critical findings and blocked launch gates.
28
- - `/god-mode` now runs executable gates between tier transitions.
29
- - Tier routes declare `standards.gate-command`, and static checks enforce the
30
- skill and route metadata.
31
- - CLI command dispatch now lives in `lib/cli-dispatch.js`, keeping
32
- `bin/install.js` thin.
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
- - `node scripts/test-gate.js` green
37
- - `node scripts/test-cli-dispatch.js` green
38
- - `node scripts/static-check.js` green
39
- - `npm run release:check` required 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.0` or `npx godpowers@2.5.0`
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 creation for `v2.5.0`.
50
- - The tag should match the npm package version.
51
- - The `v2.5.0` tag should point to the release commit that matches the npm
52
- `godpowers@2.5.0` 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.0",
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"