godpowers 2.1.0 → 2.2.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 +58 -0
- package/README.md +14 -3
- package/RELEASE.md +43 -71
- package/SKILL.md +3 -3
- package/agents/god-architect.md +3 -0
- package/agents/god-executor.md +17 -0
- package/agents/god-greenfieldifier.md +10 -2
- package/agents/god-launch-strategist.md +3 -0
- package/agents/god-orchestrator.md +27 -1
- package/agents/god-planner.md +9 -1
- package/agents/god-pm.md +23 -1
- package/agents/god-quality-reviewer.md +8 -1
- package/agents/god-reconstructor.md +17 -0
- package/agents/god-roadmap-reconciler.md +7 -0
- package/agents/god-roadmap-updater.md +16 -1
- package/agents/god-roadmapper.md +18 -7
- package/agents/god-spec-reviewer.md +8 -0
- package/agents/god-storyteller.md +5 -0
- package/agents/god-updater.md +6 -0
- package/bin/install.js +1 -1
- package/hooks/session-start.sh +1 -0
- package/lib/README.md +16 -0
- package/lib/context-writer.js +17 -6
- package/lib/dashboard.js +20 -0
- package/lib/feature-awareness.js +6 -0
- package/lib/requirements.js +524 -0
- package/lib/reverse-sync.js +19 -1
- package/lib/route-quality-sync.js +1 -0
- package/lib/state.js +5 -0
- package/package.json +2 -2
- package/routing/god-progress.yaml +27 -0
- package/routing/recipes/whats-done.yaml +28 -0
- package/schema/state.v1.json +25 -0
- package/skills/god-doctor.md +2 -2
- package/skills/god-locate.md +1 -0
- package/skills/god-progress.md +105 -0
- package/skills/god-status.md +11 -0
- package/skills/god-version.md +2 -2
- package/templates/PRD.md +12 -4
- package/templates/PROGRESS.md +2 -0
- package/templates/REQUIREMENTS.md +45 -0
- package/templates/ROADMAP.md +23 -5
package/agents/god-roadmapper.md
CHANGED
|
@@ -70,13 +70,20 @@ Rules:
|
|
|
70
70
|
## Process
|
|
71
71
|
|
|
72
72
|
1. Read PRD (priorities) and ARCH (technical dependencies)
|
|
73
|
-
2. List all
|
|
73
|
+
2. List all requirements from PRD by their stable id
|
|
74
|
+
(P-MUST-NN / P-SHOULD-NN / P-COULD-NN) and priority
|
|
74
75
|
3. Build dependency graph from ARCH (component A depends on component B)
|
|
75
76
|
4. Topologically sort
|
|
76
|
-
5. Group
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
-
|
|
77
|
+
5. Group requirements into delivery increments. Each increment gets:
|
|
78
|
+
- A stable id `M-<slug>` derived from the increment name
|
|
79
|
+
- An initial `Status: pending`. Status is later derived from the linkage map
|
|
80
|
+
(code linked to the increment's requirements); set `done` explicitly only
|
|
81
|
+
when the completion gate has been verified
|
|
82
|
+
- A clear, substitution-tested goal
|
|
83
|
+
- An observable completion gate
|
|
84
|
+
- A size: S/M/L (no day-level precision without capacity input)
|
|
85
|
+
- A Features list of the exact PRD requirement ids it delivers
|
|
86
|
+
(P-MUST-01, P-MUST-02, ...), so each requirement maps to one increment
|
|
80
87
|
6. Assign Now/Next/Later horizons:
|
|
81
88
|
- **Now**: building right now, committed
|
|
82
89
|
- **Next**: planned next, flexible
|
|
@@ -92,11 +99,13 @@ as the structural starting point. Write `.godpowers/roadmap/ROADMAP.md`:
|
|
|
92
99
|
|
|
93
100
|
## Now
|
|
94
101
|
### Delivery Increment 1: [substitution-tested name]
|
|
102
|
+
- ID: M-[slug]
|
|
103
|
+
- Status: pending
|
|
95
104
|
- Goal: [what users can do when this ships]
|
|
96
105
|
- Gate: [observable completion criteria]
|
|
97
106
|
- Size: S/M/L
|
|
98
|
-
- Depends on: [list]
|
|
99
|
-
- Features: [
|
|
107
|
+
- Depends on: [M-slug list]
|
|
108
|
+
- Features (from PRD): [P-MUST-01, P-MUST-02, ...]
|
|
100
109
|
|
|
101
110
|
## Next
|
|
102
111
|
[delivery increments]
|
|
@@ -111,6 +120,8 @@ Roadmap FAILS if:
|
|
|
111
120
|
- Delivery increment goal passes substitution test
|
|
112
121
|
- Completion gate is not observable
|
|
113
122
|
- Feature appears that is not in the PRD
|
|
123
|
+
- Any increment has no stable M-slug id
|
|
124
|
+
- A committed (Now or Next) increment lists no PRD requirement ids
|
|
114
125
|
- All increments the same size (no prioritization)
|
|
115
126
|
- No dependency edges between increments
|
|
116
127
|
- Day-level precision without capacity input
|
|
@@ -50,6 +50,13 @@ Answer each with EVIDENCE from the code:
|
|
|
50
50
|
- Did the executor add future options, broad configurability, or generic
|
|
51
51
|
interfaces that the current slice does not need?
|
|
52
52
|
|
|
53
|
+
6. **Is each planned requirement id annotated in the code?**
|
|
54
|
+
- For each PRD requirement id listed in the slice plan (its `Requirements:`
|
|
55
|
+
field): does the code carry the corresponding `// Implements: P-...`
|
|
56
|
+
annotation that god-executor follows?
|
|
57
|
+
- A planned requirement id with no annotation is a finding, because the
|
|
58
|
+
deliverable ledger derives requirement status from those annotations.
|
|
59
|
+
|
|
53
60
|
## Output
|
|
54
61
|
|
|
55
62
|
Return verdict to orchestrator:
|
|
@@ -75,6 +82,7 @@ Return verdict to orchestrator:
|
|
|
75
82
|
- No scope creep without justification
|
|
76
83
|
- Every touched file has request-trace evidence
|
|
77
84
|
- No speculative flexibility or unrelated cleanup entered the diff
|
|
85
|
+
- Every planned requirement id carries its `// Implements: P-...` annotation
|
|
78
86
|
|
|
79
87
|
If FAIL: orchestrator returns the slice to god-executor with the failures.
|
|
80
88
|
If PASS: orchestrator spawns god-quality-reviewer next.
|
|
@@ -33,6 +33,7 @@ title: "Short noun phrase"
|
|
|
33
33
|
status: pending
|
|
34
34
|
owner: <name>
|
|
35
35
|
deps: []
|
|
36
|
+
requirement: P-MUST-01 # optional; the PRD requirement id this story decomposes
|
|
36
37
|
created: <ISO date>
|
|
37
38
|
---
|
|
38
39
|
|
|
@@ -61,6 +62,10 @@ As a [persona], I want [capability] so that [outcome].
|
|
|
61
62
|
1. Read PRD.md and ARCH.md for context.
|
|
62
63
|
2. If `--with-stories` from /god-feature: decompose the feature spec
|
|
63
64
|
into 3-7 stories (don't exceed 10).
|
|
65
|
+
- When a story decomposes a specific PRD functional requirement, reference
|
|
66
|
+
that requirement id (set `requirement: P-MUST-01` in the frontmatter, or
|
|
67
|
+
mention it in the acceptance criteria) so the story traces back to the PRD
|
|
68
|
+
requirement and the deliverable ledger.
|
|
64
69
|
3. Determine next ID number:
|
|
65
70
|
- List `.godpowers/stories/<feature-slug>/STORY-*.md`
|
|
66
71
|
- Use max + 1, zero-padded to 3 digits
|
package/agents/god-updater.md
CHANGED
|
@@ -113,6 +113,11 @@ After feature work, every artifact that was impacted needs to reflect reality.
|
|
|
113
113
|
- Surfaces drift + impeccable findings to `REVIEW-REQUIRED.md`
|
|
114
114
|
- Update `state.json.linkage` with current `coverage-pct`, `orphan-count`,
|
|
115
115
|
`drift-count`, `review-required-items`
|
|
116
|
+
- Refresh deliverable tracking from the updated linkage map:
|
|
117
|
+
- Call `lib/requirements.writeLedger(projectRoot)` to regenerate
|
|
118
|
+
`.godpowers/REQUIREMENTS.md`
|
|
119
|
+
- Cache the summary into `state.json.deliverables` via
|
|
120
|
+
`lib/requirements.summarizeForState`
|
|
116
121
|
- Emit events: `linkage.snapshot`, `drift.detected` (per finding),
|
|
117
122
|
`review-required.populated`
|
|
118
123
|
- Report counts in the final sync status:
|
|
@@ -121,6 +126,7 @@ After feature work, every artifact that was impacted needs to reflect reality.
|
|
|
121
126
|
- fenced footers updated
|
|
122
127
|
- drift findings
|
|
123
128
|
- REVIEW-REQUIRED.md items created
|
|
129
|
+
- requirement coverage: `<done>/<total> done` and any gaps
|
|
124
130
|
|
|
125
131
|
### Repository documentation sync
|
|
126
132
|
- Call `lib/repo-doc-sync.run(projectRoot, { changedFiles })` when the runtime
|
package/bin/install.js
CHANGED
|
@@ -248,7 +248,7 @@ function runInstall(opts, srcDir) {
|
|
|
248
248
|
log(`\x1b[32mDone!\x1b[0m Installed Godpowers v${VERSION} for ${installed} runtime(s).`);
|
|
249
249
|
log('');
|
|
250
250
|
log(`\x1b[36mInstalled:\x1b[0m`);
|
|
251
|
-
log(` ${surface.skills} slash commands (try: /god-mode, /god-next, /god-status)`);
|
|
251
|
+
log(` ${surface.skills} slash commands (try: /god-mode, /god-next, /god-status, /god-progress)`);
|
|
252
252
|
log(` ${surface.agents} specialist agents`);
|
|
253
253
|
log(' Templates and references for artifact discipline');
|
|
254
254
|
log('');
|
package/hooks/session-start.sh
CHANGED
|
@@ -80,6 +80,7 @@ Next step: run /god-next (it inspects disk state and proposes the next command)
|
|
|
80
80
|
Or: /god-mode for the full autonomous project run
|
|
81
81
|
Or: /god-help to see the catalog
|
|
82
82
|
Or: /god-status for the full project snapshot
|
|
83
|
+
Or: /god-progress for deliverable progress (requirements done / left)
|
|
83
84
|
Or: /god-context refresh after installing a newer Godpowers runtime
|
|
84
85
|
|
|
85
86
|
Disk state is authoritative. Conversation memory is not.
|
package/lib/README.md
CHANGED
|
@@ -22,6 +22,7 @@ package-level integrations.
|
|
|
22
22
|
| `dogfood-runner.js` | Run deterministic messy-repo scenarios against migration, host, extension, and suite release behavior. |
|
|
23
23
|
| `budget.js` | Read and enforce configured budget controls. |
|
|
24
24
|
| `cost-tracker.js` | Track token and cost estimates from event streams. |
|
|
25
|
+
| `fs-async.js` | Promise-based file read/write helpers for non-blocking runtime paths. |
|
|
25
26
|
|
|
26
27
|
## Events and observability
|
|
27
28
|
|
|
@@ -43,6 +44,8 @@ package-level integrations.
|
|
|
43
44
|
| `workflow-runner.js` | Execute workflow steps with validation hooks. |
|
|
44
45
|
| `agent-cache.js` | Cache agent metadata for faster routing. |
|
|
45
46
|
| `agent-validator.js` | Validate agent frontmatter and contracts. |
|
|
47
|
+
| `agent-refs.js` | Validate workflow agent references and scan skill/agent prose for phantom references. |
|
|
48
|
+
| `skill-surface.js` | Derive slash-command metadata from the individual `skills/` files. |
|
|
46
49
|
|
|
47
50
|
## Artifact quality
|
|
48
51
|
|
|
@@ -71,6 +74,7 @@ package-level integrations.
|
|
|
71
74
|
| `impeccable-bridge.js` | Bridge runtime checks into impeccable quality workflows. |
|
|
72
75
|
| `extensions.js` | Load and validate extension packs. |
|
|
73
76
|
| `extension-authoring.js` | Scaffold publishable extension packs with manifest, package, README, skill, agent, and workflow files. |
|
|
77
|
+
| `pillars.js` | Manage the Pillars project-context layer (`AGENTS.md` plus routed `agents/*.md`). |
|
|
74
78
|
|
|
75
79
|
## Repository and graph helpers
|
|
76
80
|
|
|
@@ -87,5 +91,17 @@ package-level integrations.
|
|
|
87
91
|
| `review-required.js` | Decide when review gates should block progress. |
|
|
88
92
|
| `suite-state.js` | Manage state across registered project suites. |
|
|
89
93
|
|
|
94
|
+
## Installer, dashboard, and CLI helpers
|
|
95
|
+
|
|
96
|
+
| Module | Purpose |
|
|
97
|
+
|--------|---------|
|
|
98
|
+
| `installer-core.js` | Install and uninstall the Godpowers surface for each runtime. |
|
|
99
|
+
| `installer-files.js` | File-copy helpers shared by the installer and its tests. |
|
|
100
|
+
| `installer-args.js` | Parse `bin/install.js` arguments and subcommands. |
|
|
101
|
+
| `installer-runtimes.js` | Map supported runtimes to their config directories. |
|
|
102
|
+
| `automation-providers.js` | Detect and configure host-native automation providers. |
|
|
103
|
+
| `dashboard.js` | Compute the next-step action brief and host guarantee line. |
|
|
104
|
+
| `quick-proof.js` | Render the shipped proof fixture for `godpowers quick-proof`. |
|
|
105
|
+
|
|
90
106
|
See `../ARCHITECTURE.md` for system design and `../docs/ROADMAP.md` for planned
|
|
91
107
|
runtime work.
|
package/lib/context-writer.js
CHANGED
|
@@ -216,15 +216,21 @@ function writeFenced(filePath, sectionContent) {
|
|
|
216
216
|
}
|
|
217
217
|
|
|
218
218
|
/**
|
|
219
|
-
* Remove the Godpowers fence from a file. Leaves the rest untouched. If
|
|
220
|
-
*
|
|
219
|
+
* Remove the Godpowers fence from a file. Leaves the rest untouched. If only
|
|
220
|
+
* the fence remained, an auto-generated pointer file is deleted; with
|
|
221
|
+
* { preserveFile: true } the file is emptied instead of deleted (used for the
|
|
222
|
+
* canonical AGENTS.md so the off-switch never removes the user's primary file).
|
|
221
223
|
*/
|
|
222
|
-
function removeFenced(filePath) {
|
|
224
|
+
function removeFenced(filePath, opts = {}) {
|
|
223
225
|
if (!fs.existsSync(filePath)) return { removed: false, reason: 'missing' };
|
|
224
226
|
const parsed = readFenced(filePath);
|
|
225
227
|
if (parsed.fenced === '') return { removed: false, reason: 'no-fence' };
|
|
226
228
|
let remaining = `${parsed.before}${parsed.after}`.replace(/\n{3,}/g, '\n\n').trim();
|
|
227
229
|
if (remaining === '') {
|
|
230
|
+
if (opts.preserveFile) {
|
|
231
|
+
fs.writeFileSync(filePath, '');
|
|
232
|
+
return { removed: true, fileDeleted: false, emptied: true };
|
|
233
|
+
}
|
|
228
234
|
fs.unlinkSync(filePath);
|
|
229
235
|
return { removed: true, fileDeleted: true };
|
|
230
236
|
}
|
|
@@ -284,8 +290,11 @@ function apply(projectRoot, state, opts = {}) {
|
|
|
284
290
|
* Remove all Godpowers fences from canonical + pointers (off-switch).
|
|
285
291
|
*/
|
|
286
292
|
function clearAll(projectRoot) {
|
|
287
|
-
|
|
288
|
-
|
|
293
|
+
// The canonical AGENTS.md is the user's primary context file: empty it rather
|
|
294
|
+
// than delete it. The remaining targets are auto-generated pointer files that
|
|
295
|
+
// Godpowers owns outright, so they are deleted when only the fence remains.
|
|
296
|
+
const canonical = path.join(projectRoot, 'AGENTS.md');
|
|
297
|
+
const pointers = [
|
|
289
298
|
path.join(projectRoot, 'CLAUDE.md'),
|
|
290
299
|
path.join(projectRoot, 'GEMINI.md'),
|
|
291
300
|
path.join(projectRoot, '.cursorrules'),
|
|
@@ -300,7 +309,9 @@ function clearAll(projectRoot) {
|
|
|
300
309
|
path.join(projectRoot, '.agents', 'skills', 'godpowers.md')
|
|
301
310
|
];
|
|
302
311
|
const results = [];
|
|
303
|
-
|
|
312
|
+
const rc = removeFenced(canonical, { preserveFile: true });
|
|
313
|
+
if (rc.removed) results.push({ path: canonical, ...rc });
|
|
314
|
+
for (const t of pointers) {
|
|
304
315
|
const r = removeFenced(t);
|
|
305
316
|
if (r.removed) results.push({ path: t, ...r });
|
|
306
317
|
}
|
package/lib/dashboard.js
CHANGED
|
@@ -10,6 +10,7 @@ const path = require('path');
|
|
|
10
10
|
const cp = require('child_process');
|
|
11
11
|
|
|
12
12
|
const state = require('./state');
|
|
13
|
+
const requirements = require('./requirements');
|
|
13
14
|
const router = require('./router');
|
|
14
15
|
const automationProviders = require('./automation-providers');
|
|
15
16
|
const repoDocSync = require('./repo-doc-sync');
|
|
@@ -239,6 +240,7 @@ function compute(projectRoot, opts = {}) {
|
|
|
239
240
|
proactive: proactiveChecks(projectRoot, git.entries.map(statusPath)),
|
|
240
241
|
host: hostCapabilities.detect(projectRoot, opts.host || {}),
|
|
241
242
|
next,
|
|
243
|
+
deliverables: { hasRequirements: false },
|
|
242
244
|
openItems: ['No .godpowers/state.json found']
|
|
243
245
|
};
|
|
244
246
|
result.actionBrief = actionBrief(result);
|
|
@@ -251,6 +253,14 @@ function compute(projectRoot, opts = {}) {
|
|
|
251
253
|
const openItems = [];
|
|
252
254
|
const drift = state.detectDrift(projectRoot);
|
|
253
255
|
|
|
256
|
+
const buildSub = s.tiers && s.tiers['tier-2'] && s.tiers['tier-2'].build;
|
|
257
|
+
const deliverables = requirements.derive(projectRoot, {
|
|
258
|
+
buildComplete: Boolean(buildSub && state.isCompleteStatus(buildSub.status))
|
|
259
|
+
});
|
|
260
|
+
if (deliverables.gaps.length > 0) {
|
|
261
|
+
openItems.push(`${deliverables.gaps.length} requirement(s) in a done increment with no linked code, see ${requirements.LEDGER_PATH}`);
|
|
262
|
+
}
|
|
263
|
+
|
|
254
264
|
if (drift.length > 0) openItems.push(`${drift.length} artifact drift item(s), suggest /god-repair`);
|
|
255
265
|
if (next && next.blocker) openItems.push(`${next.blocker} blocks next route`);
|
|
256
266
|
if (reviewCount(projectRoot) > 0) openItems.push('pending review items');
|
|
@@ -269,6 +279,7 @@ function compute(projectRoot, opts = {}) {
|
|
|
269
279
|
proactive: proactiveChecks(projectRoot, git.entries.map(statusPath)),
|
|
270
280
|
host: hostCapabilities.detect(projectRoot, opts.host || {}),
|
|
271
281
|
next,
|
|
282
|
+
deliverables,
|
|
272
283
|
openItems
|
|
273
284
|
};
|
|
274
285
|
result.actionBrief = actionBrief(result);
|
|
@@ -314,6 +325,11 @@ function render(dashboard, opts = {}) {
|
|
|
314
325
|
const progress = dashboard.progress || {};
|
|
315
326
|
const prd = planning.prd || {};
|
|
316
327
|
const roadmap = planning.roadmap || {};
|
|
328
|
+
const deliverables = dashboard.deliverables || { hasRequirements: false };
|
|
329
|
+
const deliverableLines = requirements.renderProgressLines(deliverables);
|
|
330
|
+
const deliverableBrief = deliverables.hasRequirements
|
|
331
|
+
? ` Requirements: ${requirements.progressBar(deliverables.summary.done, deliverables.summary.total)} done (${deliverables.summary.percent}%)`
|
|
332
|
+
: null;
|
|
317
333
|
const openItems = dashboard.openItems && dashboard.openItems.length > 0
|
|
318
334
|
? dashboard.openItems
|
|
319
335
|
: ['none'];
|
|
@@ -332,6 +348,7 @@ function render(dashboard, opts = {}) {
|
|
|
332
348
|
'Current status:',
|
|
333
349
|
` State: ${dashboard.state}`,
|
|
334
350
|
` Progress: ${progress.percent || 0}% workflow progress (${progress.completed || 0} of ${progress.total || 0} tracked steps complete)`,
|
|
351
|
+
...(deliverableBrief ? [deliverableBrief] : []),
|
|
335
352
|
'',
|
|
336
353
|
'Next:',
|
|
337
354
|
` Recommended: ${next.command || 'describe the next intent'}`,
|
|
@@ -365,6 +382,9 @@ function render(dashboard, opts = {}) {
|
|
|
365
382
|
` Current milestone: ${planning.currentMilestone || 'unknown'}`,
|
|
366
383
|
` Completion basis: ${planning.completionBasis || planning.completion || 'unknown'}`,
|
|
367
384
|
'',
|
|
385
|
+
'Deliverable progress:',
|
|
386
|
+
...deliverableLines,
|
|
387
|
+
'',
|
|
368
388
|
'Proactive checks:',
|
|
369
389
|
` Checkpoint: ${proactive.checkpoint || 'unknown'}`,
|
|
370
390
|
` Reviews: ${proactive.reviews || 'unknown'}`,
|
package/lib/feature-awareness.js
CHANGED
|
@@ -118,6 +118,12 @@ const FEATURES = [
|
|
|
118
118
|
since: '1.6.22',
|
|
119
119
|
commands: ['/god-suite-release'],
|
|
120
120
|
description: 'Plan Mode D suite releases with impacted dependents and planned writes before mutation.'
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
id: 'deliverable-progress-tracking',
|
|
124
|
+
since: '2.2.0',
|
|
125
|
+
commands: ['/god-progress', '/god-status', '/god-sync'],
|
|
126
|
+
description: 'Track which PRD requirements and roadmap increments are done, in progress, or not started, derived from the linkage map and surfaced in the .godpowers/REQUIREMENTS.md ledger.'
|
|
121
127
|
}
|
|
122
128
|
];
|
|
123
129
|
|