godpowers 2.5.1 → 2.6.0

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,40 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.6.0] - 2026-06-10
11
+
12
+ ### Added
13
+ - Added the `@godpowers/mcp` companion package with read-only MCP tools for
14
+ status, next, gate checks, artifact linting, and requirement tracing.
15
+ - Added `godpowers mcp-info --project=.` as a read-only main-package helper
16
+ that prints setup instructions without loading the MCP SDK.
17
+ - Added MCP protocol tests that spawn the companion server over stdio, list
18
+ tools, and call each tool against the quick-proof fixture.
19
+
20
+ ### Changed
21
+ - Updated dashboard and quick-proof host guarantee output to include MCP
22
+ availability.
23
+ - Updated `/god-status` and `/god-next` to prefer MCP tools when available and
24
+ fall back to CLI or runtime modules otherwise.
25
+ - Updated release checks to verify the companion package protocol and package
26
+ contents while keeping the main `godpowers` package dependency-free.
27
+
28
+ ## [2.5.2] - 2026-06-10
29
+
30
+ ### Added
31
+ - Added regression coverage proving an installed `godpowers-runtime` bundle can
32
+ be used as a local npm package for `godpowers gate`.
33
+ - Added regression coverage proving build gates fail when build state records a
34
+ failed verification command.
35
+
36
+ ### Fixed
37
+ - Fixed installed runtime bundles so `godpowers-runtime` includes `bin/` next
38
+ to `package.json`, allowing host workflows to call the documented
39
+ `godpowers gate` command from the installed runtime package.
40
+ - Fixed the build gate so `.godpowers/build/STATE.md` fails closed when any
41
+ verification command is recorded as failed, instead of passing because a
42
+ different command passed.
43
+
10
44
  ## [2.5.1] - 2026-06-10
11
45
 
12
46
  ### 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.6.0-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,13 @@ 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.6.0 adds the optional `@godpowers/mcp` companion package with
34
+ read-only MCP tools for status, next-route, gate, artifact lint, and requirement
35
+ trace workflows. It keeps the 2.5.2 installed-runtime gate and build-gate
36
+ fixes, the 2.5.1 Codex host proof studies, executable tier gates, 2.4
37
+ command-family UX, external CLI canary evidence, prompt-size guardrails, legacy
38
+ command quarantine, lib coverage gating, and package verification before
39
+ publish.
37
40
 
38
41
  Maintainer hardening continues on the 2.x line with small, audited public
39
42
  surface updates when they close real workflow gaps. The 2.1.0 patch closes a command-injection vector in the
@@ -257,6 +260,7 @@ npx godpowers status --project=. --brief
257
260
  npx godpowers status --project=. --json
258
261
  npx godpowers quick-proof --project=.
259
262
  npx godpowers gate --tier=prd --project=.
263
+ npx godpowers mcp-info --project=.
260
264
  npx godpowers dogfood
261
265
  npx godpowers extension-scaffold --name=@godpowers/my-pack --output=.
262
266
  ```
@@ -288,9 +292,30 @@ npx godpowers gate --tier=harden --project=.
288
292
  The gate reads disk artifacts, runs the shared artifact linter, checks build
289
293
  verification evidence, and blocks unresolved Critical harden findings.
290
294
 
291
- The runtime remains dependency-free. YAML parsing is intentionally limited to
292
- the documented Godpowers subset used by intent, routing, workflow, and
293
- extension files, with parser coverage in `scripts/test-yaml-parser.js`.
295
+ The main `godpowers` runtime remains dependency-free. The optional
296
+ `@godpowers/mcp` companion package owns the MCP SDK dependency and exposes
297
+ read-only tools through explicit host setup. YAML parsing is intentionally
298
+ limited to the documented Godpowers subset used by intent, routing, workflow,
299
+ and extension files, with parser coverage in `scripts/test-yaml-parser.js`.
300
+
301
+ ### MCP Companion
302
+
303
+ MCP-capable hosts can use the optional companion package without adding an SDK
304
+ dependency to the main `godpowers` package:
305
+
306
+ ```bash
307
+ npx godpowers mcp-info --project=.
308
+ npx -y -p godpowers@2.6.0 -p @godpowers/mcp@2.6.0 godpowers-mcp serve --project=.
309
+ ```
310
+
311
+ The companion exposes `status`, `next`, `gate_check`, `lint_artifact`, and
312
+ `trace_requirement`. Host registration is opt-in:
313
+
314
+ ```bash
315
+ npx -y -p godpowers@2.6.0 -p @godpowers/mcp@2.6.0 godpowers-mcp setup --host=codex --project=. --write
316
+ ```
317
+
318
+ See [MCP Companion](docs/mcp.md) for package boundaries and setup details.
294
319
 
295
320
  ### Slash Commands
296
321
 
package/RELEASE.md CHANGED
@@ -1,52 +1,60 @@
1
- # Godpowers 2.5.1 Release
1
+ # Godpowers 2.6.0 Release
2
2
 
3
3
  > Status: Release candidate
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.6.0 is the Phase 3 MCP companion package release.
7
+ [DECISION] This release keeps the main `godpowers` package dependency-free while adding an optional `@godpowers/mcp` package for MCP-capable hosts.
8
+ [DECISION] This release preserves the 2.5.2 installed-runtime gate command fix and build-gate false-pass fix.
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] 9 installer CLI helpers.
17
+ - [DECISION] 5 read-only MCP tools in `@godpowers/mcp`.
18
18
 
19
19
  ## Highlights
20
20
 
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/`.
21
+ - [DECISION] `@godpowers/mcp` exposes `status`, `next`, `gate_check`, `lint_artifact`, and `trace_requirement` over stdio.
22
+ - [DECISION] `godpowers mcp-info --project=.` prints setup instructions without requiring or loading the MCP SDK in the main package.
23
+ - [DECISION] `godpowers-mcp setup --host=codex --project=. --write` writes a managed Codex MCP registration only after the user explicitly asks for it.
24
+ - [DECISION] Dashboard and Quick Proof host guarantee lines now include MCP availability.
25
+ - [DECISION] The main `godpowers` package still has no production dependencies.
33
26
 
34
27
  ## Validation
35
28
 
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.
29
+ - [DECISION] `npm --workspace @godpowers/mcp test` passed before the latest `main` merge.
30
+ - [DECISION] `npm --workspace @godpowers/mcp run pack:check` passed before the latest `main` merge.
31
+ - [DECISION] `npm run test:e2e` passed before the latest `main` merge.
32
+ - [DECISION] `node scripts/test-runtime-verification.js` passed before the latest `main` merge.
33
+ - [DECISION] `node scripts/test-agent-browser.js` passed before the latest `main` merge.
34
+ - [DECISION] `npm run release:check` passed before the latest `main` merge with `coverage:lib` at 92.85 percent line coverage, `npm audit --omit=dev` reporting 0 vulnerabilities, public surface docs matching version 2.6.0, root package contents verified at 535 files, and MCP package contents verified at 8 files.
35
+ - [DECISION] Post-merge 2.6.0 `npm --workspace @godpowers/mcp test` passed.
36
+ - [DECISION] Post-merge 2.6.0 `npm --workspace @godpowers/mcp run pack:check` passed.
37
+ - [DECISION] Post-merge 2.6.0 `node scripts/test-gate.js` passed.
38
+ - [DECISION] Post-merge 2.6.0 `node scripts/test-install-smoke.js` passed.
39
+ - [DECISION] Post-merge 2.6.0 `node scripts/static-check.js` passed.
40
+ - [DECISION] Post-merge 2.6.0 `npm run test:e2e` passed.
41
+ - [DECISION] Post-merge 2.6.0 `node scripts/test-runtime-verification.js` passed.
42
+ - [DECISION] Post-merge 2.6.0 `node scripts/test-agent-browser.js` passed.
43
+ - [DECISION] Post-merge 2.6.0 `npm run release:check` passed with `coverage:lib` at 92.88 percent line coverage, `npm audit --omit=dev` reporting 0 vulnerabilities, public surface docs matching version 2.6.0, root package contents verified at 535 files, and MCP package contents verified at 8 files.
40
44
 
41
45
  ## Upgrade
42
46
 
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.
47
+ - [DECISION] Use `npm install -g godpowers@2.6.0` or `npx godpowers@2.6.0` after the package is published.
48
+ - [DECISION] Use optional MCP package install `npm install -g godpowers @godpowers/mcp` when the host can register MCP servers.
49
+ - [DECISION] Re-run `/god-context` in each project to refresh installed runtime metadata.
50
+ - [DECISION] Existing `.godpowers/` state remains compatible.
46
51
 
47
52
  ## Notes
48
53
 
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.
54
+ - [DECISION] The npm `godpowers@2.5.2` package is published with provenance.
55
+ - [DECISION] GitHub release `v2.5.2` was created at `https://github.com/aihxp/godpowers/releases/tag/v2.5.2`.
56
+ - [DECISION] The 2.5.2 release-status closeout confirmed GitHub workflow `27289417888`, npm `latest` version 2.5.2, published-install verification, `npm run lint`, and `npm run release:check`.
57
+ - [DECISION] GitHub release `v2.6.0` should be created only after the release gate passes on the merged branch.
58
+ - [DECISION] The tag should match the npm package version.
59
+ - [DECISION] The companion package should publish as `@godpowers/mcp@2.6.0` after the release gate passes.
60
+ - [DECISION] The `v2.6.0` tag is not pushed yet because the current tag workflow publishes only the root `godpowers` package and does not publish `@godpowers/mcp`.
package/bin/install.js CHANGED
@@ -52,6 +52,7 @@ function showHelp() {
52
52
  log(' status Show the Godpowers Dashboard for a project');
53
53
  log(' next Show the dashboard and recommended next command');
54
54
  log(' gate Check a tier artifact gate');
55
+ log(' mcp-info Show read-only MCP companion setup instructions');
55
56
  log(' quick-proof Show a runnable proof from the shipped fixture');
56
57
  log(' automation-status Show host automation provider support');
57
58
  log(' automation-setup Show an opt-in automation setup plan');
@@ -100,6 +101,7 @@ function showHelp() {
100
101
  log(' npx godpowers status --project=.');
101
102
  log(' npx godpowers next --project=.');
102
103
  log(' npx godpowers gate --tier=prd --project=.');
104
+ log(' npx godpowers mcp-info --project=.');
103
105
  log(' npx godpowers quick-proof --project=.');
104
106
  log(' npx godpowers automation-status --project=.');
105
107
  log(' npx godpowers automation-setup --project=.');
@@ -211,6 +213,7 @@ module.exports = {
211
213
  runDashboardCommand: cliDispatch.runDashboardCommand,
212
214
  runDogfoodCommand: cliDispatch.runDogfoodCommand,
213
215
  runQuickProofCommand: cliDispatch.runQuickProofCommand,
216
+ runMcpInfoCommand: cliDispatch.runMcpInfoCommand,
214
217
  runExtensionScaffoldCommand: cliDispatch.runExtensionScaffoldCommand,
215
218
  runGateCommand: cliDispatch.runGateCommand,
216
219
  applyDefaultRuntimeSelection,
@@ -74,6 +74,16 @@ function runQuickProofCommand(opts) {
74
74
  }
75
75
  }
76
76
 
77
+ function runMcpInfoCommand(opts) {
78
+ const mcpInfo = require('./mcp-info');
79
+ const result = mcpInfo.info(opts.project);
80
+ if (opts.json) {
81
+ console.log(JSON.stringify(result, null, 2));
82
+ } else {
83
+ console.log(mcpInfo.render(result));
84
+ }
85
+ }
86
+
77
87
  function runExtensionScaffoldCommand(opts) {
78
88
  const authoring = require('./extension-authoring');
79
89
  if (!opts.extensionName) {
@@ -134,6 +144,7 @@ const COMMAND_RUNNERS = {
134
144
  status: runDashboardCommand,
135
145
  next: runDashboardCommand,
136
146
  'quick-proof': runQuickProofCommand,
147
+ 'mcp-info': runMcpInfoCommand,
137
148
  'automation-status': runAutomationCommand,
138
149
  'automation-setup': runAutomationCommand,
139
150
  dogfood: runDogfoodCommand,
@@ -157,6 +168,7 @@ module.exports = {
157
168
  runDashboardCommand,
158
169
  runDogfoodCommand,
159
170
  runQuickProofCommand,
171
+ runMcpInfoCommand,
160
172
  runExtensionScaffoldCommand,
161
173
  runGateCommand
162
174
  };
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
@@ -48,6 +48,48 @@ function installedAgentSurfaces(homeDir) {
48
48
  };
49
49
  }
50
50
 
51
+ function detectMcpAvailability(projectRoot, opts = {}) {
52
+ if (opts.mcp) return opts.mcp;
53
+ if (Object.prototype.hasOwnProperty.call(opts, 'mcpAvailable')) {
54
+ return {
55
+ available: Boolean(opts.mcpAvailable),
56
+ source: opts.mcpAvailable ? (opts.mcpSource || 'override') : 'override'
57
+ };
58
+ }
59
+
60
+ const env = opts.env || process.env;
61
+ if (env.GODPOWERS_MCP === '1' || env.GODPOWERS_MCP === 'true') {
62
+ return { available: true, source: 'environment' };
63
+ }
64
+
65
+ const root = projectRoot || process.cwd();
66
+ if (exists(path.join(root, 'packages', 'mcp', 'package.json'))) {
67
+ return { available: true, source: 'workspace package' };
68
+ }
69
+
70
+ try {
71
+ require.resolve('@godpowers/mcp/package.json', { paths: [root, __dirname] });
72
+ return { available: true, source: 'installed package' };
73
+ } catch (error) {
74
+ // Continue to host registration detection.
75
+ }
76
+
77
+ const homeDir = opts.homeDir || os.homedir();
78
+ const codexConfig = path.join(homeDir, '.codex', 'config.toml');
79
+ if (exists(codexConfig)) {
80
+ try {
81
+ const text = fs.readFileSync(codexConfig, 'utf8');
82
+ if (/\[mcp_servers\.godpowers\]/.test(text)) {
83
+ return { available: true, source: 'codex registration' };
84
+ }
85
+ } catch (error) {
86
+ return { available: false, source: 'codex registration unreadable' };
87
+ }
88
+ }
89
+
90
+ return { available: false, source: 'not configured' };
91
+ }
92
+
51
93
  function detect(projectRoot, opts = {}) {
52
94
  const env = opts.env || process.env;
53
95
  const homeDir = opts.homeDir || os.homedir();
@@ -62,6 +104,7 @@ function detect(projectRoot, opts = {}) {
62
104
  const extensionAuthoring = exists(path.join(root, 'lib', 'extension-authoring.js'))
63
105
  && exists(path.join(root, 'schema', 'extension-manifest.v1.json'));
64
106
  const suiteReleaseDryRun = exists(path.join(root, 'lib', 'suite-state.js'));
107
+ const mcp = detectMcpAvailability(root, opts);
65
108
 
66
109
  const gaps = [];
67
110
  if (!shell) gaps.push('shell unavailable');
@@ -86,6 +129,7 @@ function detect(projectRoot, opts = {}) {
86
129
  npm,
87
130
  gh,
88
131
  agentSpawn,
132
+ mcp,
89
133
  codeIntelligence: codeIntel,
90
134
  extensionAuthoring,
91
135
  suiteReleaseDryRun
@@ -97,9 +141,13 @@ function detect(projectRoot, opts = {}) {
97
141
 
98
142
  function summary(report) {
99
143
  if (!report) return 'unknown';
100
- if (report.level === 'full') return `full on ${report.host}`;
144
+ const mcp = report.guarantees && report.guarantees.mcp;
145
+ const mcpText = mcp && mcp.available
146
+ ? `; MCP available via ${mcp.source}`
147
+ : '; MCP not configured';
148
+ if (report.level === 'full') return `full on ${report.host}${mcpText}`;
101
149
  const gap = report.gaps && report.gaps.length > 0 ? `, ${report.gaps[0]}` : '';
102
- return `${report.level} on ${report.host}${gap}`;
150
+ return `${report.level} on ${report.host}${gap}${mcpText}`;
103
151
  }
104
152
 
105
153
  function render(report) {
@@ -112,6 +160,7 @@ function render(report) {
112
160
  lines.push(` Git: ${report.guarantees.git || 'not detected'}`);
113
161
  lines.push(` npm: ${report.guarantees.npm || 'not detected'}`);
114
162
  lines.push(` GitHub CLI: ${report.guarantees.gh || 'not detected'}`);
163
+ lines.push(` MCP: ${report.guarantees.mcp.available ? `available via ${report.guarantees.mcp.source}` : 'not configured'}`);
115
164
  lines.push(` Code intelligence: ${codeIntelligence.summary(report.guarantees.codeIntelligence)}`);
116
165
  lines.push(` Gaps: ${report.gaps.length > 0 ? report.gaps.join('; ') : 'none'}`);
117
166
  return lines.join('\n');
@@ -124,6 +173,7 @@ module.exports = {
124
173
  _private: {
125
174
  commandVersion,
126
175
  hostName,
127
- installedAgentSurfaces
176
+ installedAgentSurfaces,
177
+ detectMcpAvailability
128
178
  }
129
179
  };
@@ -5,6 +5,7 @@ const COMMANDS = new Set([
5
5
  'status',
6
6
  'next',
7
7
  'quick-proof',
8
+ 'mcp-info',
8
9
  'automation-status',
9
10
  'automation-setup',
10
11
  'dogfood',
@@ -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));
@@ -0,0 +1,93 @@
1
+ const path = require('path');
2
+
3
+ const identity = require('./package-identity');
4
+
5
+ const MCP_PACKAGE = '@godpowers/mcp';
6
+
7
+ function projectPath(projectRoot) {
8
+ return path.resolve(projectRoot || process.cwd());
9
+ }
10
+
11
+ function serverCommand(projectRoot, version = identity.PACKAGE_VERSION) {
12
+ return {
13
+ command: 'npx',
14
+ args: [
15
+ '-y',
16
+ '-p',
17
+ `${identity.PACKAGE_NAME}@${version}`,
18
+ '-p',
19
+ `${MCP_PACKAGE}@${version}`,
20
+ 'godpowers-mcp',
21
+ 'serve',
22
+ '--project',
23
+ projectPath(projectRoot)
24
+ ]
25
+ };
26
+ }
27
+
28
+ function setupCommand(projectRoot, version = identity.PACKAGE_VERSION) {
29
+ return {
30
+ command: 'npx',
31
+ args: [
32
+ '-y',
33
+ '-p',
34
+ `${identity.PACKAGE_NAME}@${version}`,
35
+ '-p',
36
+ `${MCP_PACKAGE}@${version}`,
37
+ 'godpowers-mcp',
38
+ 'setup',
39
+ '--host=codex',
40
+ '--project',
41
+ projectPath(projectRoot),
42
+ '--write'
43
+ ]
44
+ };
45
+ }
46
+
47
+ function info(projectRoot, version = identity.PACKAGE_VERSION) {
48
+ const project = projectPath(projectRoot);
49
+ return {
50
+ package: MCP_PACKAGE,
51
+ version,
52
+ project,
53
+ boundary: 'The MCP SDK dependency is isolated in @godpowers/mcp. The main godpowers package has no production dependencies.',
54
+ tools: ['status', 'next', 'gate_check', 'lint_artifact', 'trace_requirement'],
55
+ server: serverCommand(project, version),
56
+ setup: setupCommand(project, version),
57
+ automaticRegistration: false
58
+ };
59
+ }
60
+
61
+ function renderCommand(command) {
62
+ return `${command.command} ${command.args.join(' ')}`;
63
+ }
64
+
65
+ function render(result) {
66
+ return [
67
+ 'Godpowers MCP',
68
+ '',
69
+ `Package: ${result.package}@${result.version}`,
70
+ `Project: ${result.project}`,
71
+ `Boundary: ${result.boundary}`,
72
+ '',
73
+ 'Tools:',
74
+ ` ${result.tools.join(', ')}`,
75
+ '',
76
+ 'Run server:',
77
+ ` ${renderCommand(result.server)}`,
78
+ '',
79
+ 'Opt-in Codex setup:',
80
+ ` ${renderCommand(result.setup)}`,
81
+ '',
82
+ 'Automatic registration: disabled'
83
+ ].join('\n');
84
+ }
85
+
86
+ module.exports = {
87
+ MCP_PACKAGE,
88
+ serverCommand,
89
+ setupCommand,
90
+ info,
91
+ render,
92
+ renderCommand
93
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "godpowers",
3
- "version": "2.5.1",
3
+ "version": "2.6.0",
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"
@@ -22,13 +22,18 @@
22
22
  "test:linter": "node scripts/test-artifact-linter.js",
23
23
  "test:diff": "node scripts/test-artifact-diff.js",
24
24
  "test:e2e": "node tests/integration/full-arc.test.js",
25
+ "test:mcp": "npm --workspace @godpowers/mcp test",
25
26
  "coverage": "c8 --reporter=text --reporter=lcov node scripts/run-tests.js",
26
27
  "coverage:lib": "c8 --include=lib/**/*.js --check-coverage --lines 90 --reporter=text node scripts/run-tests.js",
27
28
  "test:audit": "npm audit --omit=dev && git diff --check && npm run test:surface",
28
29
  "pack:check": "node scripts/check-package-contents.js",
29
- "release:check": "npm run coverage:lib && npm run test:audit && npm run pack:check",
30
+ "pack:mcp:check": "npm --workspace @godpowers/mcp run pack:check",
31
+ "release:check": "npm run coverage:lib && npm run test:audit && npm run pack:check && npm run pack:mcp:check",
30
32
  "lint": "node scripts/static-check.js"
31
33
  },
34
+ "workspaces": [
35
+ "packages/mcp"
36
+ ],
32
37
  "keywords": [
33
38
  "ai",
34
39
  "ai-agent",
@@ -22,7 +22,8 @@ routing definitions, recipes, command families, and user intent.
22
22
  3. Read routing definitions from `<runtimeRoot>/routing/*.yaml` and recipes from `<runtimeRoot>/routing/recipes/*.yaml`.
23
23
  4. Load `<runtimeRoot>/lib/command-families.js` before resolving broad intent.
24
24
  5. Load `<runtimeRoot>/lib/dashboard.js` and render the shared dashboard before route-specific detail.
25
- 6. If no dashboard module is available, say `Dashboard engine: unavailable, manual scan used`.
25
+ 6. Prefer the MCP `next` tool when it is available, and fall back to the CLI or runtime module when it is not.
26
+ 7. If no dashboard module is available, say `Dashboard engine: unavailable, manual scan used`.
26
27
 
27
28
  ## Required references
28
29
 
@@ -31,10 +31,11 @@ proactive checks, blockers, planning visibility, and the next action first.
31
31
  1. Check whether `.godpowers/PROGRESS.md` or `.godpowers/state.json` exists. If neither exists, report that no Godpowers project was found and suggest `/god-init`.
32
32
  2. Resolve the runtime root and load `<runtimeRoot>/lib/dashboard.js`.
33
33
  3. Call `dashboard.compute(projectRoot)` and render with `dashboard.render(result)`.
34
- 4. Use PROGRESS.md only as fallback or legacy explanation when state.json is missing.
35
- 5. Scan canonical artifact paths for PRD, design, architecture, roadmap, stack, repo, build, deploy, observe, launch, harden, sync, checkpoint, and requirements evidence.
36
- 6. Compare disk state to recorded state and flag phantom resume or untracked work.
37
- 7. Offer `/god-repair` when recorded state and disk evidence conflict.
34
+ 4. Prefer the MCP `status` tool when it is available, and fall back to the CLI or runtime module when it is not.
35
+ 5. Use PROGRESS.md only as fallback or legacy explanation when state.json is missing.
36
+ 6. Scan canonical artifact paths for PRD, design, architecture, roadmap, stack, repo, build, deploy, observe, launch, harden, sync, checkpoint, and requirements evidence.
37
+ 7. Compare disk state to recorded state and flag phantom resume or untracked work.
38
+ 8. Offer `/god-repair` when recorded state and disk evidence conflict.
38
39
 
39
40
  ## Required reference
40
41