godpowers 2.7.0 → 3.0.1
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 +43 -1
- package/README.md +32 -31
- package/RELEASE.md +32 -42
- package/SKILL.md +4 -1
- package/agents/god-archaeologist.md +11 -0
- package/agents/god-architect.md +12 -0
- package/agents/god-auditor.md +13 -0
- package/agents/god-automation-engineer.md +13 -0
- package/agents/god-browser-tester.md +15 -0
- package/agents/god-context-writer.md +14 -0
- package/agents/god-coordinator.md +14 -0
- package/agents/god-debt-assessor.md +11 -0
- package/agents/god-debugger.md +13 -0
- package/agents/god-deploy-engineer.md +13 -0
- package/agents/god-deps-auditor.md +13 -0
- package/agents/god-design-reviewer.md +14 -0
- package/agents/god-designer.md +15 -0
- package/agents/god-docs-writer.md +13 -0
- package/agents/god-executor.md +14 -0
- package/agents/god-explorer.md +14 -0
- package/agents/god-greenfieldifier.md +13 -0
- package/agents/god-harden-auditor.md +12 -0
- package/agents/god-incident-investigator.md +13 -0
- package/agents/god-launch-strategist.md +14 -0
- package/agents/god-migration-strategist.md +13 -0
- package/agents/god-observability-engineer.md +14 -0
- package/agents/god-orchestrator.md +16 -2
- package/agents/god-org-context-loader.md +11 -0
- package/agents/god-planner.md +11 -0
- package/agents/god-pm.md +14 -0
- package/agents/god-quality-reviewer.md +12 -0
- package/agents/god-reconciler.md +14 -1
- package/agents/god-reconstructor.md +16 -0
- package/agents/god-repo-scaffolder.md +11 -0
- package/agents/god-retrospective.md +11 -0
- package/agents/god-roadmap-reconciler.md +42 -87
- package/agents/god-roadmap-updater.md +11 -0
- package/agents/god-roadmapper.md +12 -0
- package/agents/god-spec-reviewer.md +14 -0
- package/agents/god-spike-runner.md +13 -0
- package/agents/god-stack-selector.md +12 -0
- package/agents/god-standards-check.md +13 -0
- package/agents/god-storyteller.md +14 -0
- package/agents/god-updater.md +14 -0
- package/bin/install.js +5 -5
- package/extensions/data-pack/manifest.yaml +1 -1
- package/extensions/data-pack/package.json +1 -1
- package/extensions/launch-pack/manifest.yaml +1 -1
- package/extensions/launch-pack/package.json +1 -1
- package/extensions/security-pack/manifest.yaml +1 -1
- package/extensions/security-pack/package.json +1 -1
- package/lib/README.md +3 -0
- package/lib/agent-validator.js +67 -2
- package/lib/command-families.js +13 -8
- package/lib/install-profiles.js +39 -13
- package/lib/installer-args.js +1 -1
- package/lib/recipe-coverage-sync.js +1 -1
- package/lib/release-surface-sync.js +3 -0
- package/lib/repo-doc-sync.js +1 -1
- package/lib/repo-surface-sync.js +3 -3
- package/lib/route-quality-sync.js +2 -2
- package/lib/router.js +6 -0
- package/package.json +2 -2
- package/references/orchestration/GOD-ORCHESTRATOR-RUNBOOK.md +12 -3
- package/routing/god-capture.yaml +41 -0
- package/routing/god-extend.yaml +47 -0
- package/routing/god-fix.yaml +37 -0
- package/routing/god-lifecycle.yaml +1 -1
- package/routing/god-locate.yaml +1 -1
- package/routing/god-plan.yaml +45 -0
- package/routing/god-roadmap-check.yaml +2 -2
- package/routing/god-ship.yaml +39 -0
- package/skills/god-agent-audit.md +12 -9
- package/skills/god-arch.md +1 -3
- package/skills/god-build.md +1 -3
- package/skills/god-capture.md +45 -0
- package/skills/god-deploy.md +1 -3
- package/skills/god-design.md +9 -3
- package/skills/god-doctor.md +1 -1
- package/skills/god-extend.md +48 -0
- package/skills/god-feature.md +1 -3
- package/skills/god-fix.md +43 -0
- package/skills/god-harden.md +1 -3
- package/skills/god-hotfix.md +1 -3
- package/skills/god-launch.md +1 -3
- package/skills/god-lifecycle.md +6 -0
- package/skills/god-link.md +1 -3
- package/skills/god-locate.md +6 -0
- package/skills/god-migrate.md +1 -3
- package/skills/god-mode.md +5 -0
- package/skills/god-observe.md +1 -3
- package/skills/god-plan.md +51 -0
- package/skills/god-prd.md +1 -3
- package/skills/god-reconcile.md +4 -4
- package/skills/god-redo.md +1 -3
- package/skills/god-refactor.md +1 -3
- package/skills/god-repair.md +1 -3
- package/skills/god-repo.md +1 -3
- package/skills/god-restore.md +1 -3
- package/skills/god-roadmap-check.md +5 -3
- package/skills/god-roadmap.md +1 -3
- package/skills/god-rollback.md +1 -3
- package/skills/god-scan.md +1 -3
- package/skills/god-ship.md +44 -0
- package/skills/god-skip.md +1 -3
- package/skills/god-stack.md +1 -3
- package/skills/god-status.md +13 -8
- package/skills/god-story-build.md +1 -3
- package/skills/god-story-close.md +1 -3
- package/skills/god-story.md +1 -3
- package/skills/god-sync.md +3 -5
- package/skills/god-undo.md +1 -3
- package/skills/god-update-deps.md +1 -3
- package/skills/god-upgrade.md +1 -3
- package/skills/god-version.md +1 -1
package/bin/install.js
CHANGED
|
@@ -95,7 +95,7 @@ function showHelp() {
|
|
|
95
95
|
log(' --codebuddy Install for CodeBuddy');
|
|
96
96
|
log(' --pi Install for Pi');
|
|
97
97
|
log(' --all Install for all 15 runtimes');
|
|
98
|
-
log(' --profile=<name> Install profile: core, builder, maintainer, suite, or full');
|
|
98
|
+
log(' --profile=<name> Install profile: core, builder, maintainer, suite, or full (default: core)');
|
|
99
99
|
log(' --minimal Alias for --profile=core');
|
|
100
100
|
log(' -u, --uninstall Uninstall Godpowers');
|
|
101
101
|
log(' -h, --help Show this help message');
|
|
@@ -166,15 +166,15 @@ function runInstall(opts, srcDir) {
|
|
|
166
166
|
log('');
|
|
167
167
|
log(`\x1b[36mProfile:\x1b[0m ${describeProfiles(opts.profile)}`);
|
|
168
168
|
log(`\x1b[36mInstalled:\x1b[0m`);
|
|
169
|
-
log(` ${surface.skills} slash commands (try: /god
|
|
169
|
+
log(` ${surface.skills} slash commands (try: /god, /god-plan, /god-status, /god-mode)`);
|
|
170
170
|
log(` ${surface.agents} specialist agents`);
|
|
171
171
|
log(' Templates and references for artifact discipline');
|
|
172
172
|
log('');
|
|
173
173
|
log(`\x1b[36mNext steps:\x1b[0m`);
|
|
174
174
|
log(' 1. Open your AI coding tool in any project directory');
|
|
175
|
-
log(` 2. Type: \x1b[36m/god
|
|
176
|
-
log(` Or: \x1b[36m/god-
|
|
177
|
-
log(` Or: \x1b[36m/god-
|
|
175
|
+
log(` 2. Type: \x1b[36m/god\x1b[0m for the front door`);
|
|
176
|
+
log(` Or: \x1b[36m/god-plan\x1b[0m to start planning`);
|
|
177
|
+
log(` Or: \x1b[36m/god-mode\x1b[0m for the full autonomous project run`);
|
|
178
178
|
log('');
|
|
179
179
|
log(`\x1b[36mDocs:\x1b[0m ${identity.HOMEPAGE_URL}`);
|
|
180
180
|
log('');
|
package/lib/README.md
CHANGED
|
@@ -59,8 +59,10 @@ package-level integrations.
|
|
|
59
59
|
|
|
60
60
|
| Module | Purpose |
|
|
61
61
|
|--------|---------|
|
|
62
|
+
| `artifact-map.js` | Centralize canonical artifact paths for dashboards, gates, and helpers. |
|
|
62
63
|
| `artifact-linter.js` | Check artifacts for required labels, evidence, and domain precision. |
|
|
63
64
|
| `artifact-diff.js` | Compare artifact changes for review and release workflows. |
|
|
65
|
+
| `gate.js` | Run executable artifact gates for Phase 1 tier completion checks. |
|
|
64
66
|
| `have-nots-validator.js` | Check artifacts against known failure modes. |
|
|
65
67
|
| `meta-linter.js` | Validate Godpowers documentation and skill metadata. |
|
|
66
68
|
| `story-validator.js` | Validate story artifacts and story lifecycle state. |
|
|
@@ -108,6 +110,7 @@ package-level integrations.
|
|
|
108
110
|
| `installer-core.js` | Install and uninstall the Godpowers surface for each runtime. |
|
|
109
111
|
| `installer-files.js` | File-copy helpers shared by the installer and its tests. |
|
|
110
112
|
| `installer-args.js` | Parse `bin/install.js` arguments and subcommands. |
|
|
113
|
+
| `cli-dispatch.js` | Dispatch local CLI helper commands such as status, quick-proof, gate, dogfood, and extension-scaffold. |
|
|
111
114
|
| `install-profiles.js` | Select smaller role-specific slash-command install surfaces. |
|
|
112
115
|
| `installer-runtimes.js` | Map supported runtimes to their config directories. |
|
|
113
116
|
| `package-identity.js` | Centralize package name, version, repository, docs, and command identity. |
|
package/lib/agent-validator.js
CHANGED
|
@@ -22,6 +22,7 @@ const frontmatter = require('./frontmatter');
|
|
|
22
22
|
|
|
23
23
|
const REQUIRED_FRONTMATTER = ['name', 'description'];
|
|
24
24
|
const RECOMMENDED_FRONTMATTER = ['tools'];
|
|
25
|
+
const STRUCTURED_CONTRACT_FRONTMATTER = ['inputs', 'outputs', 'gates', 'handoff'];
|
|
25
26
|
const RECOMMENDED_SECTIONS = ['Have-Nots', 'Inputs', 'Outputs', 'Handoff'];
|
|
26
27
|
|
|
27
28
|
/**
|
|
@@ -68,6 +69,7 @@ function parseAgentFile(filePath) {
|
|
|
68
69
|
*/
|
|
69
70
|
function validateAgent(agent, opts = {}) {
|
|
70
71
|
const findings = [];
|
|
72
|
+
const contractSeverity = opts.contractSeverity || 'info';
|
|
71
73
|
|
|
72
74
|
// Required frontmatter
|
|
73
75
|
for (const field of REQUIRED_FRONTMATTER) {
|
|
@@ -93,6 +95,30 @@ function validateAgent(agent, opts = {}) {
|
|
|
93
95
|
}
|
|
94
96
|
}
|
|
95
97
|
|
|
98
|
+
// Structured contract frontmatter
|
|
99
|
+
for (const field of STRUCTURED_CONTRACT_FRONTMATTER) {
|
|
100
|
+
const value = agent.frontmatter[field];
|
|
101
|
+
if (!value) {
|
|
102
|
+
findings.push({
|
|
103
|
+
severity: contractSeverity,
|
|
104
|
+
kind: 'missing-contract-frontmatter',
|
|
105
|
+
agent: agent.name,
|
|
106
|
+
field,
|
|
107
|
+
message: `Missing contract frontmatter field: \`${field}\``
|
|
108
|
+
});
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (!Array.isArray(value) || value.length === 0 || value.some(item => typeof item !== 'string' || !item.trim())) {
|
|
112
|
+
findings.push({
|
|
113
|
+
severity: contractSeverity,
|
|
114
|
+
kind: 'invalid-contract-frontmatter',
|
|
115
|
+
agent: agent.name,
|
|
116
|
+
field,
|
|
117
|
+
message: `Contract frontmatter field \`${field}\` must be a non-empty string array.`
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
96
122
|
// Recommended sections (case-insensitive substring match)
|
|
97
123
|
const sectionTitles = Object.keys(agent.sections).map(s => s.toLowerCase());
|
|
98
124
|
for (const section of RECOMMENDED_SECTIONS) {
|
|
@@ -114,6 +140,15 @@ function validateAgent(agent, opts = {}) {
|
|
|
114
140
|
return findings;
|
|
115
141
|
}
|
|
116
142
|
|
|
143
|
+
function hasStructuredContract(agent) {
|
|
144
|
+
return STRUCTURED_CONTRACT_FRONTMATTER.every(field => {
|
|
145
|
+
const value = agent.frontmatter[field];
|
|
146
|
+
return Array.isArray(value) &&
|
|
147
|
+
value.length > 0 &&
|
|
148
|
+
value.every(item => typeof item === 'string' && item.trim());
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
|
|
117
152
|
/**
|
|
118
153
|
* Extract claimed hand-off targets (other agents this agent spawns).
|
|
119
154
|
*/
|
|
@@ -133,11 +168,33 @@ function findHandoffTargets(agent) {
|
|
|
133
168
|
return [...targets];
|
|
134
169
|
}
|
|
135
170
|
|
|
171
|
+
function extractPathClaims(text) {
|
|
172
|
+
const paths = new Set();
|
|
173
|
+
const dotPathRegex = /\.godpowers\/[\w\/.-]+(?:\.(?:md|json|jsonl|yaml))?/g;
|
|
174
|
+
let m;
|
|
175
|
+
while ((m = dotPathRegex.exec(text)) !== null) {
|
|
176
|
+
paths.add(m[0]);
|
|
177
|
+
}
|
|
178
|
+
const rootRegex = /\b[A-Z]+\.md\b/g;
|
|
179
|
+
while ((m = rootRegex.exec(text)) !== null) {
|
|
180
|
+
paths.add(m[0]);
|
|
181
|
+
}
|
|
182
|
+
return [...paths];
|
|
183
|
+
}
|
|
184
|
+
|
|
136
185
|
/**
|
|
137
186
|
* Extract output paths the agent claims to write.
|
|
138
187
|
*/
|
|
139
188
|
function findOutputPaths(agent) {
|
|
140
189
|
const paths = new Set();
|
|
190
|
+
if (Array.isArray(agent.frontmatter.outputs)) {
|
|
191
|
+
for (const output of agent.frontmatter.outputs) {
|
|
192
|
+
if (typeof output !== 'string') continue;
|
|
193
|
+
for (const out of extractPathClaims(output)) paths.add(out);
|
|
194
|
+
}
|
|
195
|
+
return [...paths];
|
|
196
|
+
}
|
|
197
|
+
|
|
141
198
|
const text = agent.raw;
|
|
142
199
|
|
|
143
200
|
// .godpowers/*.md or .godpowers/*.json
|
|
@@ -218,11 +275,15 @@ function auditAll(projectRoot, opts = {}) {
|
|
|
218
275
|
}
|
|
219
276
|
const files = fs.readdirSync(agentsDir).filter(f => /^god-.*\.md$/.test(f));
|
|
220
277
|
const agents = files.map(f => parseAgentFile(path.join(agentsDir, f)));
|
|
278
|
+
const structuredContractCount = agents.filter(hasStructuredContract).length;
|
|
279
|
+
const contractWarningThreshold = opts.contractWarningThreshold || 20;
|
|
280
|
+
const contractSeverity = opts.contractSeverity ||
|
|
281
|
+
(structuredContractCount >= contractWarningThreshold ? 'warning' : 'info');
|
|
221
282
|
|
|
222
283
|
const allFindings = [];
|
|
223
284
|
const results = [];
|
|
224
285
|
for (const agent of agents) {
|
|
225
|
-
const f = validateAgent(agent, opts);
|
|
286
|
+
const f = validateAgent(agent, { ...opts, contractSeverity });
|
|
226
287
|
results.push({ agent: agent.name, findings: f });
|
|
227
288
|
allFindings.push(...f);
|
|
228
289
|
}
|
|
@@ -235,7 +296,9 @@ function auditAll(projectRoot, opts = {}) {
|
|
|
235
296
|
warnings: allFindings.filter(f => f.severity === 'warning').length,
|
|
236
297
|
infos: allFindings.filter(f => f.severity === 'info').length,
|
|
237
298
|
crossFindings,
|
|
238
|
-
agentCount: agents.length
|
|
299
|
+
agentCount: agents.length,
|
|
300
|
+
structuredContractCount,
|
|
301
|
+
contractWarningThreshold
|
|
239
302
|
};
|
|
240
303
|
|
|
241
304
|
return { results, summary, allFindings };
|
|
@@ -248,7 +311,9 @@ module.exports = {
|
|
|
248
311
|
findOutputPaths,
|
|
249
312
|
crossValidate,
|
|
250
313
|
auditAll,
|
|
314
|
+
hasStructuredContract,
|
|
251
315
|
REQUIRED_FRONTMATTER,
|
|
252
316
|
RECOMMENDED_FRONTMATTER,
|
|
317
|
+
STRUCTURED_CONTRACT_FRONTMATTER,
|
|
253
318
|
RECOMMENDED_SECTIONS
|
|
254
319
|
};
|
package/lib/command-families.js
CHANGED
|
@@ -17,6 +17,7 @@ const COMMAND_FAMILIES = [
|
|
|
17
17
|
'/god',
|
|
18
18
|
'/god-init',
|
|
19
19
|
'/god-mode',
|
|
20
|
+
'/god-plan',
|
|
20
21
|
'/god-explore',
|
|
21
22
|
'/god-discuss',
|
|
22
23
|
'/god-list-assumptions',
|
|
@@ -42,8 +43,6 @@ const COMMAND_FAMILIES = [
|
|
|
42
43
|
'/god-status',
|
|
43
44
|
'/god-next',
|
|
44
45
|
'/god-progress',
|
|
45
|
-
'/god-lifecycle',
|
|
46
|
-
'/god-locate',
|
|
47
46
|
'/god-resume-work',
|
|
48
47
|
'/god-pause-work'
|
|
49
48
|
]
|
|
@@ -54,6 +53,7 @@ const COMMAND_FAMILIES = [
|
|
|
54
53
|
purpose: 'Plan, implement, test, and ship product work.',
|
|
55
54
|
commands: [
|
|
56
55
|
'/god-build',
|
|
56
|
+
'/god-fix',
|
|
57
57
|
'/god-feature',
|
|
58
58
|
'/god-story',
|
|
59
59
|
'/god-stories',
|
|
@@ -91,6 +91,7 @@ const COMMAND_FAMILIES = [
|
|
|
91
91
|
purpose: 'Deploy, observe, harden, launch, and respond in production.',
|
|
92
92
|
commands: [
|
|
93
93
|
'/god-deploy',
|
|
94
|
+
'/god-ship',
|
|
94
95
|
'/god-observe',
|
|
95
96
|
'/god-harden',
|
|
96
97
|
'/god-launch',
|
|
@@ -128,6 +129,7 @@ const COMMAND_FAMILIES = [
|
|
|
128
129
|
purpose: 'Save thoughts, tasks, backlog items, seeds, and learnings.',
|
|
129
130
|
commands: [
|
|
130
131
|
'/god-note',
|
|
132
|
+
'/god-capture',
|
|
131
133
|
'/god-add-todo',
|
|
132
134
|
'/god-check-todos',
|
|
133
135
|
'/god-add-backlog',
|
|
@@ -158,6 +160,7 @@ const COMMAND_FAMILIES = [
|
|
|
158
160
|
purpose: 'Install, inspect, test, remove, or author extension packs.',
|
|
159
161
|
commands: [
|
|
160
162
|
'/god-extension-scaffold',
|
|
163
|
+
'/god-extend',
|
|
161
164
|
'/god-extension-add',
|
|
162
165
|
'/god-extension-list',
|
|
163
166
|
'/god-extension-info',
|
|
@@ -204,7 +207,9 @@ const COMMAND_FAMILIES = [
|
|
|
204
207
|
purpose: 'Deprecated full-profile commands kept for backward compatibility.',
|
|
205
208
|
visibility: 'hidden',
|
|
206
209
|
commands: [
|
|
207
|
-
'/god-roadmap-check'
|
|
210
|
+
'/god-roadmap-check',
|
|
211
|
+
'/god-lifecycle',
|
|
212
|
+
'/god-locate'
|
|
208
213
|
]
|
|
209
214
|
}
|
|
210
215
|
];
|
|
@@ -212,8 +217,8 @@ const COMMAND_FAMILIES = [
|
|
|
212
217
|
const STATUS_VIEWS = [
|
|
213
218
|
{ id: 'overview', command: '/god-status', label: 'Overview', purpose: 'Operational state, proactive checks, and blockers.' },
|
|
214
219
|
{ id: 'progress', command: '/god-progress', label: 'Progress', purpose: 'Requirement and roadmap increment completion.' },
|
|
215
|
-
{ id: 'lifecycle', command: '/god-lifecycle', label: 'Lifecycle', purpose: 'Project phase and fitting workflows.' },
|
|
216
|
-
{ id: 'locate', command: '/god-locate', label: 'Locate', purpose: 'Resume orientation from checkpoint and disk state.' },
|
|
220
|
+
{ id: 'lifecycle', command: '/god-status --lifecycle', label: 'Lifecycle', purpose: 'Project phase and fitting workflows.' },
|
|
221
|
+
{ id: 'locate', command: '/god-status --locate', label: 'Locate', purpose: 'Resume orientation from checkpoint and disk state.' },
|
|
217
222
|
{ id: 'next', command: '/god-next', label: 'Next', purpose: 'Single recommended command with reason.' }
|
|
218
223
|
];
|
|
219
224
|
|
|
@@ -275,11 +280,11 @@ const TRIGGER_PRECEDENCE = {
|
|
|
275
280
|
reason: 'Progress answers deliverables while status answers operational state.'
|
|
276
281
|
},
|
|
277
282
|
'where am i': {
|
|
278
|
-
default: '/god-lifecycle',
|
|
283
|
+
default: '/god-status --lifecycle',
|
|
279
284
|
conditional: [
|
|
280
|
-
{ command: '/god-locate', when: 'checkpoint-or-handoff-exists', reason: 'Resume artifacts exist on disk.' }
|
|
285
|
+
{ command: '/god-status --locate', when: 'checkpoint-or-handoff-exists', reason: 'Resume artifacts exist on disk.' }
|
|
281
286
|
],
|
|
282
|
-
reason: '
|
|
287
|
+
reason: 'Status flags explain the phase or orient a resumed session.'
|
|
283
288
|
}
|
|
284
289
|
};
|
|
285
290
|
|
package/lib/install-profiles.js
CHANGED
|
@@ -2,27 +2,33 @@ const COMMON = [
|
|
|
2
2
|
'god',
|
|
3
3
|
'god-help',
|
|
4
4
|
'god-version',
|
|
5
|
-
'god-
|
|
6
|
-
'god-status',
|
|
7
|
-
'god-progress',
|
|
8
|
-
'god-doctor',
|
|
9
|
-
'god-settings'
|
|
5
|
+
'god-status'
|
|
10
6
|
];
|
|
11
7
|
|
|
12
8
|
const PROFILE_SKILLS = {
|
|
13
9
|
core: [
|
|
14
10
|
...COMMON,
|
|
15
11
|
'god-init',
|
|
12
|
+
'god-plan',
|
|
16
13
|
'god-mode',
|
|
17
14
|
'god-build',
|
|
15
|
+
'god-fix',
|
|
18
16
|
'god-review',
|
|
17
|
+
'god-ship',
|
|
18
|
+
'god-audit',
|
|
19
|
+
'god-capture',
|
|
19
20
|
'god-sync',
|
|
20
|
-
'god-
|
|
21
|
-
'god-
|
|
21
|
+
'god-undo',
|
|
22
|
+
'god-extend'
|
|
22
23
|
],
|
|
23
24
|
builder: [
|
|
24
25
|
...COMMON,
|
|
26
|
+
'god-next',
|
|
27
|
+
'god-progress',
|
|
28
|
+
'god-doctor',
|
|
29
|
+
'god-settings',
|
|
25
30
|
'god-init',
|
|
31
|
+
'god-plan',
|
|
26
32
|
'god-mode',
|
|
27
33
|
'god-discuss',
|
|
28
34
|
'god-explore',
|
|
@@ -35,6 +41,7 @@ const PROFILE_SKILLS = {
|
|
|
35
41
|
'god-stack',
|
|
36
42
|
'god-repo',
|
|
37
43
|
'god-build',
|
|
44
|
+
'god-fix',
|
|
38
45
|
'god-add-tests',
|
|
39
46
|
'god-feature',
|
|
40
47
|
'god-story',
|
|
@@ -43,13 +50,28 @@ const PROFILE_SKILLS = {
|
|
|
43
50
|
'god-story-verify',
|
|
44
51
|
'god-story-close',
|
|
45
52
|
'god-review',
|
|
53
|
+
'god-ship',
|
|
54
|
+
'god-audit',
|
|
55
|
+
'god-capture',
|
|
46
56
|
'god-test-runtime',
|
|
47
57
|
'god-sync',
|
|
58
|
+
'god-undo',
|
|
59
|
+
'god-extend',
|
|
48
60
|
'god-quick',
|
|
49
61
|
'god-fast'
|
|
50
62
|
],
|
|
51
63
|
maintainer: [
|
|
52
64
|
...COMMON,
|
|
65
|
+
'god-next',
|
|
66
|
+
'god-progress',
|
|
67
|
+
'god-doctor',
|
|
68
|
+
'god-settings',
|
|
69
|
+
'god-audit',
|
|
70
|
+
'god-fix',
|
|
71
|
+
'god-ship',
|
|
72
|
+
'god-capture',
|
|
73
|
+
'god-undo',
|
|
74
|
+
'god-extend',
|
|
53
75
|
'god-hygiene',
|
|
54
76
|
'god-update-deps',
|
|
55
77
|
'god-docs',
|
|
@@ -61,7 +83,6 @@ const PROFILE_SKILLS = {
|
|
|
61
83
|
'god-agent-audit',
|
|
62
84
|
'god-context',
|
|
63
85
|
'god-context-scan',
|
|
64
|
-
'god-locate',
|
|
65
86
|
'god-scan',
|
|
66
87
|
'god-link',
|
|
67
88
|
'god-review-changes',
|
|
@@ -89,6 +110,12 @@ const PROFILE_SKILLS = {
|
|
|
89
110
|
],
|
|
90
111
|
suite: [
|
|
91
112
|
...COMMON,
|
|
113
|
+
'god-next',
|
|
114
|
+
'god-progress',
|
|
115
|
+
'god-doctor',
|
|
116
|
+
'god-settings',
|
|
117
|
+
'god-sync',
|
|
118
|
+
'god-undo',
|
|
92
119
|
'god-suite-init',
|
|
93
120
|
'god-suite-status',
|
|
94
121
|
'god-suite-sync',
|
|
@@ -96,7 +123,6 @@ const PROFILE_SKILLS = {
|
|
|
96
123
|
'god-suite-release',
|
|
97
124
|
'god-workstream',
|
|
98
125
|
'god-pr-branch',
|
|
99
|
-
'god-sync',
|
|
100
126
|
'god-reconcile',
|
|
101
127
|
'god-review',
|
|
102
128
|
'god-quick',
|
|
@@ -105,20 +131,20 @@ const PROFILE_SKILLS = {
|
|
|
105
131
|
};
|
|
106
132
|
|
|
107
133
|
const PROFILE_DESCRIPTIONS = {
|
|
108
|
-
core: 'front door, status,
|
|
109
|
-
builder: 'core plus planning
|
|
134
|
+
core: 'front door, status, verbs, and autonomous compatibility',
|
|
135
|
+
builder: 'core plus planning leaves, stories, and runtime verification',
|
|
110
136
|
maintainer: 'core plus hygiene, deps, docs, repair, automation, and extensions',
|
|
111
137
|
suite: 'core plus multi-repo suite and workstream coordination',
|
|
112
138
|
full: 'all shipped slash commands'
|
|
113
139
|
};
|
|
114
140
|
|
|
115
141
|
function normalizeProfiles(value) {
|
|
116
|
-
if (!value) return ['
|
|
142
|
+
if (!value) return ['core'];
|
|
117
143
|
const raw = String(value)
|
|
118
144
|
.split(',')
|
|
119
145
|
.map(part => part.trim().toLowerCase())
|
|
120
146
|
.filter(Boolean);
|
|
121
|
-
const profiles = raw.length > 0 ? raw : ['
|
|
147
|
+
const profiles = raw.length > 0 ? raw : ['core'];
|
|
122
148
|
for (const profile of profiles) {
|
|
123
149
|
if (profile !== 'full' && !PROFILE_SKILLS[profile]) {
|
|
124
150
|
throw new Error(`Unknown install profile: ${profile}`);
|
package/lib/installer-args.js
CHANGED
|
@@ -92,7 +92,7 @@ function detect(projectRoot) {
|
|
|
92
92
|
matched.length > 0
|
|
93
93
|
? `Recipe coverage exists for ${required.description}.`
|
|
94
94
|
: `No recipe covers ${required.description} with ${required.commands.join(', ')}.`,
|
|
95
|
-
{ spawn: matched.length > 0 ? null : 'god-
|
|
95
|
+
{ spawn: matched.length > 0 ? null : 'god-reconciler' }
|
|
96
96
|
);
|
|
97
97
|
}
|
|
98
98
|
|
|
@@ -12,9 +12,12 @@ 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/artifact-map.js',
|
|
16
|
+
'lib/cli-dispatch.js',
|
|
15
17
|
'lib/command-families.js',
|
|
16
18
|
'lib/dogfood-runner.js',
|
|
17
19
|
'lib/extension-authoring.js',
|
|
20
|
+
'lib/gate.js',
|
|
18
21
|
'lib/host-capabilities.js',
|
|
19
22
|
'lib/route-quality-sync.js',
|
|
20
23
|
'lib/recipe-coverage-sync.js',
|
package/lib/repo-doc-sync.js
CHANGED
|
@@ -371,7 +371,7 @@ function adjacentOpportunities() {
|
|
|
371
371
|
id: 'workflow-recipe-graph-sync',
|
|
372
372
|
trigger: '/god-next, /god-mode, /god-doctor',
|
|
373
373
|
behavior: 'compare workflow YAML, recipes, command flows, and orchestrator guidance',
|
|
374
|
-
escalation: 'spawn god-
|
|
374
|
+
escalation: 'spawn god-reconciler when lifecycle intent is ambiguous'
|
|
375
375
|
},
|
|
376
376
|
{
|
|
377
377
|
id: 'extension-pack-sync',
|
package/lib/repo-surface-sync.js
CHANGED
|
@@ -270,7 +270,7 @@ function workflowRecipeChecks(projectRoot) {
|
|
|
270
270
|
hasMetadata ? 'fresh' : 'stale',
|
|
271
271
|
workflow,
|
|
272
272
|
hasMetadata ? `${workflow} has metadata.` : `${workflow} is missing parseable metadata.`,
|
|
273
|
-
{ spawn: hasMetadata ? null : 'god-
|
|
273
|
+
{ spawn: hasMetadata ? null : 'god-reconciler' }
|
|
274
274
|
);
|
|
275
275
|
}
|
|
276
276
|
|
|
@@ -285,7 +285,7 @@ function workflowRecipeChecks(projectRoot) {
|
|
|
285
285
|
hasCommand ? 'fresh' : 'stale',
|
|
286
286
|
recipe,
|
|
287
287
|
hasCommand ? `${recipe} includes a slash-command route.` : `${recipe} has no slash-command route.`,
|
|
288
|
-
{ spawn: hasCommand ? null : 'god-
|
|
288
|
+
{ spawn: hasCommand ? null : 'god-reconciler' }
|
|
289
289
|
);
|
|
290
290
|
}
|
|
291
291
|
|
|
@@ -297,7 +297,7 @@ function workflowRecipeChecks(projectRoot) {
|
|
|
297
297
|
commandFlows.includes('/god-docs') && commandFlows.includes('/god-sync') ? 'fresh' : 'stale',
|
|
298
298
|
'docs/command-flows.md',
|
|
299
299
|
'docs/command-flows.md includes core docs and sync flows.',
|
|
300
|
-
{ spawn: 'god-
|
|
300
|
+
{ spawn: 'god-reconciler' }
|
|
301
301
|
);
|
|
302
302
|
}
|
|
303
303
|
return checks;
|
|
@@ -244,7 +244,7 @@ function detect(projectRoot) {
|
|
|
244
244
|
'stale',
|
|
245
245
|
routePath,
|
|
246
246
|
`${command} uses contextual next route ${next} without a typed success-path.outcome.`,
|
|
247
|
-
{ spawn: 'god-
|
|
247
|
+
{ spawn: 'god-reconciler' }
|
|
248
248
|
);
|
|
249
249
|
}
|
|
250
250
|
}
|
|
@@ -297,7 +297,7 @@ function detect(projectRoot) {
|
|
|
297
297
|
checks.some((check) => check.id.startsWith('missing-route-outcome-')) ? 'stale' : 'fresh',
|
|
298
298
|
'routing/',
|
|
299
299
|
`${typedOutcomeCount} contextual route exits have typed outcomes and all other next routes are explicit.`,
|
|
300
|
-
{ spawn: checks.some((check) => check.id.startsWith('missing-route-outcome-')) ? 'god-
|
|
300
|
+
{ spawn: checks.some((check) => check.id.startsWith('missing-route-outcome-')) ? 'god-reconciler' : null }
|
|
301
301
|
);
|
|
302
302
|
addCheck(
|
|
303
303
|
checks,
|
package/lib/router.js
CHANGED
|
@@ -264,6 +264,11 @@ function getStandards(command) {
|
|
|
264
264
|
return routing.standards;
|
|
265
265
|
}
|
|
266
266
|
|
|
267
|
+
function getGateCommand(command) {
|
|
268
|
+
const standards = getStandards(command);
|
|
269
|
+
return standards && standards['gate-command'] ? standards['gate-command'] : null;
|
|
270
|
+
}
|
|
271
|
+
|
|
267
272
|
/**
|
|
268
273
|
* Get the list of agents this command spawns (primary + secondary).
|
|
269
274
|
*/
|
|
@@ -403,6 +408,7 @@ module.exports = {
|
|
|
403
408
|
getRouteOutcome,
|
|
404
409
|
getAlternatives,
|
|
405
410
|
getStandards,
|
|
411
|
+
getGateCommand,
|
|
406
412
|
getSpawnedAgents,
|
|
407
413
|
getCommandFamily: commandFamilies.familyForCommand,
|
|
408
414
|
resolveTrigger: commandFamilies.resolveTrigger,
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "godpowers",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "AI-powered development system:
|
|
3
|
+
"version": "3.0.1",
|
|
4
|
+
"description": "AI-powered development system: 117 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
|
},
|
|
@@ -182,6 +182,7 @@ When deciding what to spawn next, query the routing definition:
|
|
|
182
182
|
- `execution.spawns` -> primary agent to spawn
|
|
183
183
|
- `execution.secondary-spawns` -> downstream agents (e.g., reviewers)
|
|
184
184
|
- `standards.have-nots` -> which have-nots to verify
|
|
185
|
+
- `standards.gate-command` -> executable artifact gate to run after output exists
|
|
185
186
|
- `success-path.next-recommended` -> what to suggest next
|
|
186
187
|
|
|
187
188
|
Before spawning a command, evaluate `lib/router.js checkPrerequisites(command,
|
|
@@ -197,6 +198,12 @@ the routing config has a `standards` section). Standards check uses fresh
|
|
|
197
198
|
context, independent of the producing agent, so it catches drift the
|
|
198
199
|
producing agent's own self-check would miss.
|
|
199
200
|
|
|
201
|
+
When `standards.gate-command` is present, run that exact command from the
|
|
202
|
+
project root after the producing tier skill returns and before any downstream
|
|
203
|
+
tier starts. A non-zero exit means the tier is not complete. Report the gate
|
|
204
|
+
output, repair the artifact, and rerun the gate before updating durable state
|
|
205
|
+
to done.
|
|
206
|
+
|
|
200
207
|
## Recipe-Driven Decisions (for fuzzy intent)
|
|
201
208
|
|
|
202
209
|
When the user describes intent in plain English instead of running a specific
|
|
@@ -217,7 +224,7 @@ with the "why" annotations for each step.
|
|
|
217
224
|
This is the third layer of decision support:
|
|
218
225
|
1. **Routing** (`<runtimeRoot>/routing/<command>.yaml`): structural prerequisites and gates
|
|
219
226
|
2. **Recipes** (`<runtimeRoot>/routing/recipes/<recipe>.yaml`): scenario-based sequences
|
|
220
|
-
3. **Standards** (god-standards-check): quality gates between stages
|
|
227
|
+
3. **Standards** (god-standards-check plus standards.gate-command): quality gates between stages
|
|
221
228
|
|
|
222
229
|
## Proactive Auto-Invoke Matrix
|
|
223
230
|
|
|
@@ -479,7 +486,7 @@ requested or final sign-off begins.
|
|
|
479
486
|
4. Print the "Next step" card from the Step Narration Protocol
|
|
480
487
|
5. Spawn the appropriate specialist agent in a fresh context
|
|
481
488
|
6. Verify their output exists on disk
|
|
482
|
-
7. Run have-nots check on the artifact
|
|
489
|
+
7. Run have-nots check on the artifact and run `standards.gate-command` when configured
|
|
483
490
|
8. If pass: update PROGRESS.md, sync CHECKPOINT.md, run the proactive
|
|
484
491
|
auto-invoke sweep, print the "Step result" card, then move to next sub-step
|
|
485
492
|
9. If fail and repairable: print the failed result card, then enter the
|
|
@@ -1256,4 +1263,6 @@ For preflight auto-routing, append:
|
|
|
1256
1263
|
|
|
1257
1264
|
The canonical have-nots catalog lives at `references/HAVE-NOTS.md` (115 named
|
|
1258
1265
|
failure modes). When verifying an artifact, run the relevant tier's have-nots
|
|
1259
|
-
against it. When
|
|
1266
|
+
against it. When the route has `standards.gate-command`, run that exact command
|
|
1267
|
+
after have-nots and block on any non-zero exit. When in doubt, spawn
|
|
1268
|
+
god-auditor to do the check.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
apiVersion: godpowers/v1
|
|
2
|
+
kind: CommandRouting
|
|
3
|
+
metadata:
|
|
4
|
+
command: /god-capture
|
|
5
|
+
description: Capture verb dispatcher
|
|
6
|
+
tier: 0
|
|
7
|
+
family: capture
|
|
8
|
+
|
|
9
|
+
prerequisites:
|
|
10
|
+
required: []
|
|
11
|
+
|
|
12
|
+
execution:
|
|
13
|
+
spawns: [built-in]
|
|
14
|
+
context: fresh
|
|
15
|
+
reads:
|
|
16
|
+
- routing/god-note.yaml
|
|
17
|
+
- routing/god-add-todo.yaml
|
|
18
|
+
- routing/god-add-backlog.yaml
|
|
19
|
+
- routing/god-plant-seed.yaml
|
|
20
|
+
writes: []
|
|
21
|
+
|
|
22
|
+
dispatch:
|
|
23
|
+
note: /god-note
|
|
24
|
+
todo: /god-add-todo
|
|
25
|
+
backlog: /god-add-backlog
|
|
26
|
+
seed: /god-plant-seed
|
|
27
|
+
|
|
28
|
+
success-path:
|
|
29
|
+
next-recommended: varies
|
|
30
|
+
outcome:
|
|
31
|
+
type: contextual
|
|
32
|
+
label: Capture dispatch route
|
|
33
|
+
reason: The next route depends on whether the item is a note, todo, backlog item, or seed.
|
|
34
|
+
allowed-next: [/god-note, /god-add-todo, /god-add-backlog, /god-plant-seed]
|
|
35
|
+
|
|
36
|
+
failure-path:
|
|
37
|
+
on-error: /god-doctor
|
|
38
|
+
|
|
39
|
+
endoff:
|
|
40
|
+
state-update: no direct state update; selected leaf command owns state
|
|
41
|
+
events: [agent.start, decision.route, agent.end]
|