godpowers 1.6.20 → 1.6.22
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 +59 -0
- package/README.md +28 -9
- package/RELEASE.md +38 -21
- package/bin/install.js +81 -1
- package/fixtures/dogfood/extension-authoring/manifest.json +13 -0
- package/fixtures/dogfood/half-migrated-gsd/.planning/PROJECT.md +5 -0
- package/fixtures/dogfood/half-migrated-gsd/.planning/REQUIREMENTS.md +5 -0
- package/fixtures/dogfood/half-migrated-gsd/.planning/ROADMAP.md +5 -0
- package/fixtures/dogfood/half-migrated-gsd/manifest.json +16 -0
- package/fixtures/dogfood/host-degraded/manifest.json +5 -0
- package/fixtures/dogfood/host-full/home/.codex/agents/god-orchestrator.toml +2 -0
- package/fixtures/dogfood/host-full/manifest.json +5 -0
- package/fixtures/dogfood/suite-release-dry-run/.godpowers/suite-config.yaml +9 -0
- package/fixtures/dogfood/suite-release-dry-run/manifest.json +7 -0
- package/fixtures/dogfood/suite-release-dry-run/repo-a/package.json +4 -0
- package/fixtures/dogfood/suite-release-dry-run/repo-b/package.json +7 -0
- package/lib/README.md +3 -0
- package/lib/dashboard.js +73 -3
- package/lib/dogfood-runner.js +193 -0
- package/lib/extension-authoring.js +154 -0
- package/lib/feature-awareness.js +18 -0
- package/lib/host-capabilities.js +125 -0
- package/lib/release-surface-sync.js +30 -0
- package/lib/repo-surface-sync.js +128 -0
- package/lib/route-quality-sync.js +31 -4
- package/lib/suite-state.js +90 -1
- package/package.json +4 -3
- package/routing/god-dogfood.yaml +35 -0
- package/routing/god-init.yaml +1 -1
- package/routing/god-roadmap-update.yaml +1 -1
- package/routing/god-sync.yaml +1 -1
- package/skills/god-doctor.md +1 -1
- package/skills/god-dogfood.md +63 -0
- package/skills/god-version.md +1 -1
|
@@ -12,11 +12,25 @@ const path = require('path');
|
|
|
12
12
|
const LOG_PATH = '.godpowers/surface/RELEASE-SURFACE-SYNC.md';
|
|
13
13
|
|
|
14
14
|
const REQUIRED_PACKAGE_GUARDS = [
|
|
15
|
+
'lib/dogfood-runner.js',
|
|
16
|
+
'lib/extension-authoring.js',
|
|
17
|
+
'lib/host-capabilities.js',
|
|
15
18
|
'lib/route-quality-sync.js',
|
|
16
19
|
'lib/recipe-coverage-sync.js',
|
|
17
20
|
'lib/release-surface-sync.js'
|
|
18
21
|
];
|
|
19
22
|
|
|
23
|
+
const REQUIRED_RELEASE_TESTS = [
|
|
24
|
+
'scripts/test-dogfood-runner.js',
|
|
25
|
+
'scripts/test-extension-authoring.js',
|
|
26
|
+
'scripts/test-host-capabilities.js',
|
|
27
|
+
'scripts/test-automation-surface-sync.js',
|
|
28
|
+
'scripts/test-repo-surface-sync.js',
|
|
29
|
+
'scripts/test-extensions-publish.js',
|
|
30
|
+
'scripts/test-mode-d.js',
|
|
31
|
+
'scripts/test-install-smoke.js'
|
|
32
|
+
];
|
|
33
|
+
|
|
20
34
|
function read(projectRoot, relPath) {
|
|
21
35
|
const file = path.join(projectRoot, relPath);
|
|
22
36
|
if (!fs.existsSync(file)) return '';
|
|
@@ -100,6 +114,21 @@ function detect(projectRoot) {
|
|
|
100
114
|
);
|
|
101
115
|
}
|
|
102
116
|
|
|
117
|
+
const scriptsText = JSON.stringify(pkg.scripts || {});
|
|
118
|
+
for (const required of REQUIRED_RELEASE_TESTS) {
|
|
119
|
+
const ok = scriptsText.includes(required);
|
|
120
|
+
addCheck(
|
|
121
|
+
checks,
|
|
122
|
+
`release-test-${required.replace(/[^a-z0-9]+/gi, '-')}`,
|
|
123
|
+
ok ? 'fresh' : 'stale',
|
|
124
|
+
'package.json',
|
|
125
|
+
ok
|
|
126
|
+
? `Release gate includes ${required}.`
|
|
127
|
+
: `Release gate does not include ${required}.`,
|
|
128
|
+
{ spawn: ok ? null : 'god-auditor' }
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
|
|
103
132
|
const stale = checks.filter((check) => check.status !== 'fresh');
|
|
104
133
|
return {
|
|
105
134
|
status: stale.length === 0 ? 'fresh' : 'stale',
|
|
@@ -147,6 +176,7 @@ function summary(report) {
|
|
|
147
176
|
module.exports = {
|
|
148
177
|
LOG_PATH,
|
|
149
178
|
REQUIRED_PACKAGE_GUARDS,
|
|
179
|
+
REQUIRED_RELEASE_TESTS,
|
|
150
180
|
detect,
|
|
151
181
|
run,
|
|
152
182
|
summary
|
package/lib/repo-surface-sync.js
CHANGED
|
@@ -29,6 +29,7 @@ const REQUIRED_PACKAGE_FILE_ENTRIES = [
|
|
|
29
29
|
'workflows/',
|
|
30
30
|
'schema/',
|
|
31
31
|
'lib/',
|
|
32
|
+
'fixtures/',
|
|
32
33
|
'extensions/',
|
|
33
34
|
'RELEASE.md',
|
|
34
35
|
'SKILL.md',
|
|
@@ -41,6 +42,9 @@ const REQUIRED_PACKAGE_CHECKS = [
|
|
|
41
42
|
'lib/feature-awareness.js',
|
|
42
43
|
'lib/repo-doc-sync.js',
|
|
43
44
|
'lib/repo-surface-sync.js',
|
|
45
|
+
'lib/dogfood-runner.js',
|
|
46
|
+
'lib/extension-authoring.js',
|
|
47
|
+
'lib/host-capabilities.js',
|
|
44
48
|
'lib/route-quality-sync.js',
|
|
45
49
|
'lib/recipe-coverage-sync.js',
|
|
46
50
|
'lib/release-surface-sync.js',
|
|
@@ -357,6 +361,128 @@ function extensionChecks(projectRoot) {
|
|
|
357
361
|
return checks;
|
|
358
362
|
}
|
|
359
363
|
|
|
364
|
+
function suiteChecks(projectRoot) {
|
|
365
|
+
const checks = [];
|
|
366
|
+
const pkg = readJson(projectRoot, 'package.json') || {};
|
|
367
|
+
const scriptsText = JSON.stringify(pkg.scripts || {});
|
|
368
|
+
const roadmap = read(projectRoot, 'docs/ROADMAP.md');
|
|
369
|
+
const suiteCommands = [
|
|
370
|
+
'god-suite-init',
|
|
371
|
+
'god-suite-status',
|
|
372
|
+
'god-suite-sync',
|
|
373
|
+
'god-suite-patch',
|
|
374
|
+
'god-suite-release'
|
|
375
|
+
];
|
|
376
|
+
|
|
377
|
+
addCheck(
|
|
378
|
+
checks,
|
|
379
|
+
'suite',
|
|
380
|
+
'suite-runtime-helper',
|
|
381
|
+
exists(projectRoot, 'lib/suite-state.js') ? 'fresh' : 'stale',
|
|
382
|
+
'lib/suite-state.js',
|
|
383
|
+
exists(projectRoot, 'lib/suite-state.js')
|
|
384
|
+
? 'Mode D suite state helper exists.'
|
|
385
|
+
: 'Mode D suite state helper is missing.',
|
|
386
|
+
{ spawn: exists(projectRoot, 'lib/suite-state.js') ? null : 'god-coordinator' }
|
|
387
|
+
);
|
|
388
|
+
|
|
389
|
+
addCheck(
|
|
390
|
+
checks,
|
|
391
|
+
'suite',
|
|
392
|
+
'suite-test-gate',
|
|
393
|
+
scriptsText.includes('scripts/test-mode-d.js') ? 'fresh' : 'stale',
|
|
394
|
+
'package.json',
|
|
395
|
+
scriptsText.includes('scripts/test-mode-d.js')
|
|
396
|
+
? 'Release gate includes Mode D suite tests.'
|
|
397
|
+
: 'Release gate does not include Mode D suite tests.',
|
|
398
|
+
{ spawn: scriptsText.includes('scripts/test-mode-d.js') ? null : 'god-coordinator' }
|
|
399
|
+
);
|
|
400
|
+
|
|
401
|
+
addCheck(
|
|
402
|
+
checks,
|
|
403
|
+
'suite',
|
|
404
|
+
'suite-docs',
|
|
405
|
+
roadmap.includes('Mode D') ? 'fresh' : 'stale',
|
|
406
|
+
'docs/ROADMAP.md',
|
|
407
|
+
roadmap.includes('Mode D')
|
|
408
|
+
? 'Roadmap documents Mode D suite support.'
|
|
409
|
+
: 'Roadmap does not document Mode D suite support.',
|
|
410
|
+
{ spawn: roadmap.includes('Mode D') ? null : 'god-coordinator' }
|
|
411
|
+
);
|
|
412
|
+
|
|
413
|
+
for (const command of suiteCommands) {
|
|
414
|
+
const skill = `skills/${command}.md`;
|
|
415
|
+
const route = `routing/${command}.yaml`;
|
|
416
|
+
const ok = exists(projectRoot, skill) && exists(projectRoot, route);
|
|
417
|
+
addCheck(
|
|
418
|
+
checks,
|
|
419
|
+
'suite',
|
|
420
|
+
`suite-command-${command}`,
|
|
421
|
+
ok ? 'fresh' : 'stale',
|
|
422
|
+
skill,
|
|
423
|
+
ok
|
|
424
|
+
? `/${command} has skill and routing metadata.`
|
|
425
|
+
: `/${command} is missing a skill or route.`,
|
|
426
|
+
{ spawn: ok ? null : 'god-coordinator' }
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
return checks;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
function dogfoodChecks(projectRoot) {
|
|
434
|
+
const checks = [];
|
|
435
|
+
const pkg = readJson(projectRoot, 'package.json') || {};
|
|
436
|
+
const scriptsText = JSON.stringify(pkg.scripts || {});
|
|
437
|
+
const scenarios = [
|
|
438
|
+
'fixtures/dogfood/half-migrated-gsd/manifest.json',
|
|
439
|
+
'fixtures/dogfood/host-degraded/manifest.json',
|
|
440
|
+
'fixtures/dogfood/host-full/manifest.json',
|
|
441
|
+
'fixtures/dogfood/extension-authoring/manifest.json',
|
|
442
|
+
'fixtures/dogfood/suite-release-dry-run/manifest.json'
|
|
443
|
+
];
|
|
444
|
+
|
|
445
|
+
addCheck(
|
|
446
|
+
checks,
|
|
447
|
+
'dogfood',
|
|
448
|
+
'dogfood-runtime-helper',
|
|
449
|
+
exists(projectRoot, 'lib/dogfood-runner.js') ? 'fresh' : 'stale',
|
|
450
|
+
'lib/dogfood-runner.js',
|
|
451
|
+
exists(projectRoot, 'lib/dogfood-runner.js')
|
|
452
|
+
? 'Dogfood runner helper exists.'
|
|
453
|
+
: 'Dogfood runner helper is missing.',
|
|
454
|
+
{ spawn: exists(projectRoot, 'lib/dogfood-runner.js') ? null : 'god-auditor' }
|
|
455
|
+
);
|
|
456
|
+
|
|
457
|
+
addCheck(
|
|
458
|
+
checks,
|
|
459
|
+
'dogfood',
|
|
460
|
+
'dogfood-test-gate',
|
|
461
|
+
scriptsText.includes('scripts/test-dogfood-runner.js') ? 'fresh' : 'stale',
|
|
462
|
+
'package.json',
|
|
463
|
+
scriptsText.includes('scripts/test-dogfood-runner.js')
|
|
464
|
+
? 'Release gate includes dogfood runner tests.'
|
|
465
|
+
: 'Release gate does not include dogfood runner tests.',
|
|
466
|
+
{ spawn: scriptsText.includes('scripts/test-dogfood-runner.js') ? null : 'god-auditor' }
|
|
467
|
+
);
|
|
468
|
+
|
|
469
|
+
for (const scenario of scenarios) {
|
|
470
|
+
addCheck(
|
|
471
|
+
checks,
|
|
472
|
+
'dogfood',
|
|
473
|
+
`dogfood-scenario-${path.basename(path.dirname(scenario))}`,
|
|
474
|
+
exists(projectRoot, scenario) ? 'fresh' : 'stale',
|
|
475
|
+
scenario,
|
|
476
|
+
exists(projectRoot, scenario)
|
|
477
|
+
? `${scenario} exists.`
|
|
478
|
+
: `${scenario} is missing.`,
|
|
479
|
+
{ spawn: exists(projectRoot, scenario) ? null : 'god-auditor' }
|
|
480
|
+
);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
return checks;
|
|
484
|
+
}
|
|
485
|
+
|
|
360
486
|
function releasePolicyChecks(projectRoot) {
|
|
361
487
|
const checks = [];
|
|
362
488
|
const docs = repoDocSync.detect(projectRoot);
|
|
@@ -393,6 +519,8 @@ function detect(projectRoot) {
|
|
|
393
519
|
...agentChecks(projectRoot),
|
|
394
520
|
...workflowRecipeChecks(projectRoot),
|
|
395
521
|
...extensionChecks(projectRoot),
|
|
522
|
+
...suiteChecks(projectRoot),
|
|
523
|
+
...dogfoodChecks(projectRoot),
|
|
396
524
|
...releasePolicyChecks(projectRoot),
|
|
397
525
|
...routeQualitySync.detect(projectRoot).checks,
|
|
398
526
|
...recipeCoverageSync.detect(projectRoot).checks,
|
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
* Route quality sync.
|
|
3
3
|
*
|
|
4
4
|
* Detects disconnected route automation surfaces: symbolic spawn tokens,
|
|
5
|
-
* unresolved agent targets, contextual exits without an approved reason,
|
|
6
|
-
*
|
|
7
|
-
* parallel spawns.
|
|
5
|
+
* unresolved agent targets, contextual exits without an approved reason,
|
|
6
|
+
* missing standards coverage, and agent-spawn routes without trace events.
|
|
8
7
|
*/
|
|
9
8
|
|
|
10
9
|
const fs = require('fs');
|
|
@@ -141,14 +140,16 @@ function detect(projectRoot) {
|
|
|
141
140
|
let unresolvedCount = 0;
|
|
142
141
|
let contextualExitCount = 0;
|
|
143
142
|
let standardsExemptCount = 0;
|
|
143
|
+
let traceEventMissingCount = 0;
|
|
144
144
|
|
|
145
145
|
for (const routePath of routes) {
|
|
146
146
|
const route = parseRoute(projectRoot, routePath);
|
|
147
147
|
const command = route.metadata && route.metadata.command
|
|
148
148
|
? route.metadata.command
|
|
149
149
|
: `/${path.basename(routePath, '.yaml')}`;
|
|
150
|
+
const tokens = spawnTokens(route);
|
|
150
151
|
|
|
151
|
-
for (const token of
|
|
152
|
+
for (const token of tokens) {
|
|
152
153
|
if (!isAtomicSpawn(String(token))) {
|
|
153
154
|
symbolicCount++;
|
|
154
155
|
addCheck(
|
|
@@ -174,6 +175,22 @@ function detect(projectRoot) {
|
|
|
174
175
|
}
|
|
175
176
|
}
|
|
176
177
|
|
|
178
|
+
const agentTokens = tokens
|
|
179
|
+
.map((token) => String(token))
|
|
180
|
+
.filter((token) => /^god-[a-z0-9-]+$/.test(token));
|
|
181
|
+
const events = arr(route.endoff && route.endoff.events).map((event) => String(event));
|
|
182
|
+
if (agentTokens.length > 0 && (!events.includes('agent.start') || !events.includes('agent.end'))) {
|
|
183
|
+
traceEventMissingCount++;
|
|
184
|
+
addCheck(
|
|
185
|
+
checks,
|
|
186
|
+
`missing-trace-events-${command.replace(/[^a-z0-9]+/gi, '-')}`,
|
|
187
|
+
'stale',
|
|
188
|
+
routePath,
|
|
189
|
+
`${command} spawns agents but does not declare both agent.start and agent.end trace events.`,
|
|
190
|
+
{ spawn: 'god-auditor' }
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
|
|
177
194
|
const next = route['success-path'] && route['success-path']['next-recommended'];
|
|
178
195
|
const conditionalNext = route['success-path'] && arr(route['success-path']['conditional-next']);
|
|
179
196
|
if (next === 'varies' && conditionalNext.length === 0) {
|
|
@@ -231,6 +248,16 @@ function detect(projectRoot) {
|
|
|
231
248
|
`${standardsExemptCount} durable-writing routes have approved standards exemptions and all other writing routes declare standards.`,
|
|
232
249
|
{ spawn: checks.some((check) => check.id.startsWith('missing-standards-')) ? 'god-auditor' : null }
|
|
233
250
|
);
|
|
251
|
+
addCheck(
|
|
252
|
+
checks,
|
|
253
|
+
'agent-trace-policy',
|
|
254
|
+
traceEventMissingCount === 0 ? 'fresh' : 'stale',
|
|
255
|
+
'routing/',
|
|
256
|
+
traceEventMissingCount === 0
|
|
257
|
+
? 'All agent-spawning routes declare agent.start and agent.end trace events.'
|
|
258
|
+
: `${traceEventMissingCount} agent-spawning routes are missing required trace events.`,
|
|
259
|
+
{ spawn: traceEventMissingCount === 0 ? null : 'god-auditor' }
|
|
260
|
+
);
|
|
234
261
|
|
|
235
262
|
const stale = checks.filter((check) => check.status !== 'fresh');
|
|
236
263
|
return {
|
package/lib/suite-state.js
CHANGED
|
@@ -143,6 +143,94 @@ function refreshFromRepos(hubPath) {
|
|
|
143
143
|
return data;
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
+
function readPackageName(repoPath) {
|
|
147
|
+
const file = path.join(repoPath, 'package.json');
|
|
148
|
+
if (!fs.existsSync(file)) return path.basename(repoPath);
|
|
149
|
+
try {
|
|
150
|
+
const pkg = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
151
|
+
return pkg.name || path.basename(repoPath);
|
|
152
|
+
} catch (err) {
|
|
153
|
+
return path.basename(repoPath);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function readPackageDeps(repoPath) {
|
|
158
|
+
const file = path.join(repoPath, 'package.json');
|
|
159
|
+
if (!fs.existsSync(file)) return {};
|
|
160
|
+
try {
|
|
161
|
+
const pkg = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
162
|
+
return {
|
|
163
|
+
...(pkg.dependencies || {}),
|
|
164
|
+
...(pkg.devDependencies || {}),
|
|
165
|
+
...(pkg.peerDependencies || {}),
|
|
166
|
+
...(pkg.optionalDependencies || {})
|
|
167
|
+
};
|
|
168
|
+
} catch (err) {
|
|
169
|
+
return {};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function siblingRecords(hubPath) {
|
|
174
|
+
const config = detector.readSuiteConfig(hubPath);
|
|
175
|
+
if (!config) return [];
|
|
176
|
+
return (config.siblings || []).map((sib) => {
|
|
177
|
+
if (typeof sib === 'string') {
|
|
178
|
+
const repoPath = path.resolve(hubPath, sib);
|
|
179
|
+
return { name: sib, path: repoPath, packageName: readPackageName(repoPath) };
|
|
180
|
+
}
|
|
181
|
+
const repoPath = path.resolve(hubPath, sib.path || sib.name);
|
|
182
|
+
return { name: sib.name, path: repoPath, packageName: readPackageName(repoPath) };
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function planRelease(hubPath, repoName, version, opts = {}) {
|
|
187
|
+
const siblings = siblingRecords(hubPath);
|
|
188
|
+
const target = siblings.find((repo) => repo.name === repoName || repo.packageName === repoName);
|
|
189
|
+
if (!target) {
|
|
190
|
+
return {
|
|
191
|
+
mode: 'dry-run',
|
|
192
|
+
status: 'blocked',
|
|
193
|
+
repo: repoName,
|
|
194
|
+
version,
|
|
195
|
+
impacted: [],
|
|
196
|
+
blockers: [`${repoName} is not registered in suite-config.yaml`],
|
|
197
|
+
writes: []
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const impacted = [];
|
|
202
|
+
for (const repo of siblings) {
|
|
203
|
+
if (repo.name === target.name) continue;
|
|
204
|
+
const deps = readPackageDeps(repo.path);
|
|
205
|
+
if (Object.prototype.hasOwnProperty.call(deps, target.packageName)
|
|
206
|
+
|| Object.prototype.hasOwnProperty.call(deps, target.name)) {
|
|
207
|
+
impacted.push({
|
|
208
|
+
name: repo.name,
|
|
209
|
+
packageName: repo.packageName,
|
|
210
|
+
path: repo.path,
|
|
211
|
+
dependsOn: target.packageName,
|
|
212
|
+
currentRange: deps[target.packageName] || deps[target.name]
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return {
|
|
218
|
+
mode: opts.apply ? 'apply-plan' : 'dry-run',
|
|
219
|
+
status: 'ready',
|
|
220
|
+
repo: target.name,
|
|
221
|
+
packageName: target.packageName,
|
|
222
|
+
version,
|
|
223
|
+
impacted,
|
|
224
|
+
blockers: [],
|
|
225
|
+
writes: [
|
|
226
|
+
{ path: path.join(target.path, 'package.json'), action: 'bump-version' },
|
|
227
|
+
...impacted.map((repo) => ({ path: path.join(repo.path, 'package.json'), action: 'update-dependency-range' })),
|
|
228
|
+
{ path: path.join(hubPath, '.godpowers', 'suite-config.yaml'), action: 'update-version-table' },
|
|
229
|
+
{ path: suiteSyncLogPath(hubPath), action: 'append-release-plan' }
|
|
230
|
+
]
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
|
|
146
234
|
/**
|
|
147
235
|
* Write a human-readable STATE.md from the aggregate.
|
|
148
236
|
*/
|
|
@@ -216,5 +304,6 @@ module.exports = {
|
|
|
216
304
|
writeSuiteState,
|
|
217
305
|
refreshFromRepos,
|
|
218
306
|
appendSyncLog,
|
|
219
|
-
format
|
|
307
|
+
format,
|
|
308
|
+
planRelease
|
|
220
309
|
};
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "godpowers",
|
|
3
|
-
"version": "1.6.
|
|
4
|
-
"description": "AI-powered development system:
|
|
3
|
+
"version": "1.6.22",
|
|
4
|
+
"description": "AI-powered development system: 110 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"
|
|
7
7
|
},
|
|
8
8
|
"scripts": {
|
|
9
|
-
"test": "node scripts/validate-skills.js && node scripts/test-doc-surface-counts.js && bash scripts/smoke.sh && node scripts/test-runtime.js && node scripts/test-router.js && node scripts/test-recipes.js && node scripts/test-context-writer.js && node scripts/test-pillars.js && node scripts/test-artifact-linter.js && node scripts/test-artifact-diff.js && node scripts/test-design-foundation.js && node scripts/test-linkage.js && node scripts/test-impact.js && node scripts/test-reverse-sync.js && node scripts/test-planning-systems.js && node scripts/test-feature-awareness.js && node scripts/test-repo-doc-sync.js && node scripts/test-repo-surface-sync.js && node scripts/test-automation-surface-sync.js && node scripts/test-integration.js && node scripts/test-cross-artifact.js && node scripts/test-awesome-design.js && node scripts/test-skillui-bridge.js && node scripts/test-runtime-verification.js && node scripts/test-agent-browser.js && node scripts/test-mode-d.js && node scripts/test-runtime-heuristics.js && node scripts/test-agent-validator.js && node scripts/test-story-validator.js && node scripts/test-state.js && node scripts/test-dashboard.js && node scripts/test-automation-providers.js && node scripts/test-intent.js && node scripts/test-events.js && node scripts/test-golden-artifacts.js && node scripts/test-install-smoke.js && node scripts/test-checkpoint.js && node scripts/test-extensions.js && node scripts/test-event-reader.js && node scripts/test-state-lock.js && node scripts/test-cost-saver.js && node scripts/test-budget-onoff.js && node scripts/test-workflow-runner.js && npm run test:e2e && node scripts/test-otel-exporter.js && node scripts/test-extensions-publish.js",
|
|
9
|
+
"test": "node scripts/validate-skills.js && node scripts/test-doc-surface-counts.js && bash scripts/smoke.sh && node scripts/test-runtime.js && node scripts/test-router.js && node scripts/test-recipes.js && node scripts/test-context-writer.js && node scripts/test-pillars.js && node scripts/test-artifact-linter.js && node scripts/test-artifact-diff.js && node scripts/test-design-foundation.js && node scripts/test-linkage.js && node scripts/test-impact.js && node scripts/test-reverse-sync.js && node scripts/test-planning-systems.js && node scripts/test-feature-awareness.js && node scripts/test-repo-doc-sync.js && node scripts/test-repo-surface-sync.js && node scripts/test-automation-surface-sync.js && node scripts/test-host-capabilities.js && node scripts/test-extension-authoring.js && node scripts/test-dogfood-runner.js && node scripts/test-integration.js && node scripts/test-cross-artifact.js && node scripts/test-awesome-design.js && node scripts/test-skillui-bridge.js && node scripts/test-runtime-verification.js && node scripts/test-agent-browser.js && node scripts/test-mode-d.js && node scripts/test-runtime-heuristics.js && node scripts/test-agent-validator.js && node scripts/test-story-validator.js && node scripts/test-state.js && node scripts/test-dashboard.js && node scripts/test-automation-providers.js && node scripts/test-intent.js && node scripts/test-events.js && node scripts/test-golden-artifacts.js && node scripts/test-install-smoke.js && node scripts/test-checkpoint.js && node scripts/test-extensions.js && node scripts/test-event-reader.js && node scripts/test-state-lock.js && node scripts/test-cost-saver.js && node scripts/test-budget-onoff.js && node scripts/test-workflow-runner.js && npm run test:e2e && node scripts/test-otel-exporter.js && node scripts/test-extensions-publish.js",
|
|
10
10
|
"prepublishOnly": "npm test",
|
|
11
11
|
"validate-skills": "node scripts/validate-skills.js",
|
|
12
12
|
"test:surface": "node scripts/test-doc-surface-counts.js",
|
|
@@ -74,6 +74,7 @@
|
|
|
74
74
|
"workflows/",
|
|
75
75
|
"schema/",
|
|
76
76
|
"lib/",
|
|
77
|
+
"fixtures/",
|
|
77
78
|
"extensions/",
|
|
78
79
|
"INSPIRATION.md",
|
|
79
80
|
"RELEASE.md",
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
apiVersion: godpowers/v1
|
|
2
|
+
kind: CommandRouting
|
|
3
|
+
metadata:
|
|
4
|
+
command: /god-dogfood
|
|
5
|
+
description: Run messy-repo dogfood scenarios for release and autonomy readiness.
|
|
6
|
+
tier: 0
|
|
7
|
+
|
|
8
|
+
prerequisites:
|
|
9
|
+
required: []
|
|
10
|
+
|
|
11
|
+
execution:
|
|
12
|
+
spawns:
|
|
13
|
+
- built-in
|
|
14
|
+
secondary-spawns:
|
|
15
|
+
- god-greenfieldifier
|
|
16
|
+
- god-context-writer
|
|
17
|
+
- god-coordinator
|
|
18
|
+
context: current
|
|
19
|
+
writes: []
|
|
20
|
+
|
|
21
|
+
success-path:
|
|
22
|
+
next-recommended: /god-status
|
|
23
|
+
|
|
24
|
+
failure-path:
|
|
25
|
+
on-error: /god-repair
|
|
26
|
+
auto-spawn:
|
|
27
|
+
- god-greenfieldifier
|
|
28
|
+
- god-context-writer
|
|
29
|
+
- god-coordinator
|
|
30
|
+
|
|
31
|
+
endoff:
|
|
32
|
+
state-update: none
|
|
33
|
+
events:
|
|
34
|
+
- agent.start
|
|
35
|
+
- agent.end
|
package/routing/god-init.yaml
CHANGED
package/routing/god-sync.yaml
CHANGED
package/skills/god-doctor.md
CHANGED
|
@@ -48,7 +48,7 @@ Plain-text report grouped by severity:
|
|
|
48
48
|
GODPOWERS DOCTOR
|
|
49
49
|
|
|
50
50
|
Install: claude (~/.claude/)
|
|
51
|
-
[OK]
|
|
51
|
+
[OK] 110 skills installed
|
|
52
52
|
[OK] 40 agents installed
|
|
53
53
|
[OK] VERSION matches (1.6.6)
|
|
54
54
|
[WARN] routing/god-doctor.yaml exists but skill file did not until now
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: god-dogfood
|
|
3
|
+
description: |
|
|
4
|
+
Run built-in messy-repo dogfood scenarios against Godpowers automation,
|
|
5
|
+
migration, host capability, extension authoring, and suite release surfaces.
|
|
6
|
+
|
|
7
|
+
Triggers on: "god dogfood", "/god-dogfood", "dogfood godpowers",
|
|
8
|
+
"test messy repos", "real-project dogfooding"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# /god-dogfood
|
|
12
|
+
|
|
13
|
+
Run deterministic messy-repo scenarios before release or after automation changes.
|
|
14
|
+
|
|
15
|
+
## When To Use
|
|
16
|
+
|
|
17
|
+
- [DECISION] Use `/god-dogfood` before a release when migration, host autonomy,
|
|
18
|
+
extension authoring, or Mode D suite release behavior changes.
|
|
19
|
+
- [DECISION] Use `/god-dogfood` when a project already contains GSD, BMAD, or
|
|
20
|
+
Superpowers context and you need confidence that Godpowers can import and
|
|
21
|
+
sync back without deleting prior-system files.
|
|
22
|
+
- [DECISION] Use `/god-dogfood` when host-spawn guarantees are unclear and the
|
|
23
|
+
dashboard reports degraded or unknown host capability.
|
|
24
|
+
|
|
25
|
+
## Process
|
|
26
|
+
|
|
27
|
+
1. Resolve the runtime root and load `lib/dogfood-runner.js`.
|
|
28
|
+
2. Run `dogfood.runAll()` against `fixtures/dogfood/`.
|
|
29
|
+
3. Report each scenario with pass or fail status.
|
|
30
|
+
4. If any scenario fails, auto-invoke the matching specialist by visible card:
|
|
31
|
+
- `god-greenfieldifier` for planning-system import failures.
|
|
32
|
+
- `god-context-writer` for host capability or install surface failures.
|
|
33
|
+
- `god-coordinator` for extension authoring or suite release failures.
|
|
34
|
+
5. Do not edit user projects while running fixture scenarios.
|
|
35
|
+
6. End with the Godpowers Dashboard and make `/god-repair` the recommended
|
|
36
|
+
route when dogfood is red.
|
|
37
|
+
|
|
38
|
+
## CLI Equivalent
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npx godpowers dogfood
|
|
42
|
+
npx godpowers dogfood --json
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Expected Coverage
|
|
46
|
+
|
|
47
|
+
- [DECISION] The dogfood suite includes a half-migrated GSD project.
|
|
48
|
+
- [DECISION] The dogfood suite includes degraded and full host capability
|
|
49
|
+
scenarios.
|
|
50
|
+
- [DECISION] The dogfood suite includes extension scaffold validation.
|
|
51
|
+
- [DECISION] The dogfood suite includes a Mode D suite release dry-run.
|
|
52
|
+
|
|
53
|
+
## Auto-Invoke Card
|
|
54
|
+
|
|
55
|
+
```text
|
|
56
|
+
Auto-invoked:
|
|
57
|
+
Trigger: /god-dogfood scenario failure
|
|
58
|
+
Agent: <god-greenfieldifier | god-context-writer | god-coordinator | none, local runtime only>
|
|
59
|
+
Local syncs:
|
|
60
|
+
+ dogfood-runner: <pass, fail, or skipped reason>
|
|
61
|
+
Artifacts: fixture-only unless repair is explicitly requested
|
|
62
|
+
Log: none
|
|
63
|
+
```
|
package/skills/god-version.md
CHANGED
|
@@ -16,7 +16,7 @@ Print version and a short capability summary.
|
|
|
16
16
|
```
|
|
17
17
|
Godpowers v1.6.19
|
|
18
18
|
Install: /Users/.../.claude/ (matches package.json)
|
|
19
|
-
Surface:
|
|
19
|
+
Surface: 110 skills, 40 agents, 13 workflows, 40 recipes
|
|
20
20
|
Schema: intent.v1, state.v1, events.v1, workflow.v1, routing.v1, recipe.v1
|
|
21
21
|
External integrations available: impeccable, agent-browser (others lazy)
|
|
22
22
|
Feature awareness: planning-system migration, source-system sync-back, context refresh, dashboard status labels, repo documentation sync, repo surface sync
|