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 +34 -0
- package/README.md +33 -8
- package/RELEASE.md +41 -33
- package/bin/install.js +3 -0
- package/lib/cli-dispatch.js +12 -0
- package/lib/gate.js +69 -8
- package/lib/host-capabilities.js +53 -3
- package/lib/installer-args.js +1 -0
- package/lib/installer-files.js +1 -1
- package/lib/mcp-info.js +93 -0
- package/package.json +7 -2
- package/skills/god-next.md +2 -1
- package/skills/god-status.md +5 -4
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
|
[](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,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.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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.
|
|
292
|
-
|
|
293
|
-
|
|
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.
|
|
1
|
+
# Godpowers 2.6.0 Release
|
|
2
2
|
|
|
3
3
|
> Status: Release candidate
|
|
4
4
|
> Date: 2026-06-10
|
|
5
5
|
|
|
6
|
-
Godpowers 2.
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
-
|
|
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
|
-
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
-
|
|
25
|
-
|
|
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
|
|
37
|
-
- `
|
|
38
|
-
- `
|
|
39
|
-
- `
|
|
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.
|
|
44
|
-
-
|
|
45
|
-
-
|
|
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
|
-
-
|
|
50
|
-
-
|
|
51
|
-
- The
|
|
52
|
-
|
|
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,
|
package/lib/cli-dispatch.js
CHANGED
|
@@ -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
|
-
|
|
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/host-capabilities.js
CHANGED
|
@@ -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
|
-
|
|
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
|
};
|
package/lib/installer-args.js
CHANGED
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/lib/mcp-info.js
ADDED
|
@@ -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.
|
|
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
|
-
"
|
|
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",
|
package/skills/god-next.md
CHANGED
|
@@ -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.
|
|
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
|
|
package/skills/god-status.md
CHANGED
|
@@ -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.
|
|
35
|
-
5.
|
|
36
|
-
6.
|
|
37
|
-
7.
|
|
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
|
|