godpowers 1.6.21 → 1.6.23
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/AGENTS.md +6 -0
- package/CHANGELOG.md +75 -0
- package/INSPIRATION.md +6 -0
- package/README.md +25 -9
- package/RELEASE.md +50 -58
- package/SKILL.md +24 -4
- package/agents/god-orchestrator.md +18 -3
- package/agents/god-reconciler.md +52 -5
- package/agents/god-updater.md +84 -2
- 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/hooks/pre-tool-use.sh +13 -1
- package/hooks/session-start.sh +12 -0
- package/lib/README.md +3 -0
- package/lib/dashboard.js +30 -1
- package/lib/dogfood-runner.js +193 -0
- package/lib/events.js +6 -0
- package/lib/extension-authoring.js +154 -0
- package/lib/feature-awareness.js +30 -0
- package/lib/have-nots-validator.js +2 -2
- package/lib/host-capabilities.js +125 -0
- package/lib/release-surface-sync.js +6 -0
- package/lib/repo-surface-sync.js +58 -0
- package/lib/suite-state.js +90 -1
- package/lib/workflow-runner.js +4 -0
- package/package.json +5 -4
- package/references/HAVE-NOTS.md +16 -0
- package/references/orchestration/MODE-DETECTION.md +36 -3
- package/references/orchestration/README.md +5 -2
- package/references/planning/ROADMAP-ANTIPATTERNS.md +1 -1
- package/references/shared/ORCHESTRATORS.md +42 -11
- package/references/shared/README.md +4 -4
- package/routing/god-dogfood.yaml +35 -0
- package/schema/events.v1.json +9 -0
- package/schema/intent.v1.yaml.json +5 -1
- package/schema/recipe.v1.json +2 -1
- package/schema/routing.v1.json +20 -0
- package/schema/state.v1.json +51 -0
- package/schema/workflow.v1.json +31 -2
- package/skills/god-doctor.md +1 -1
- package/skills/god-dogfood.md +63 -0
- package/skills/god-mode.md +4 -1
- package/skills/god-reconcile.md +13 -4
- package/skills/god-version.md +2 -2
- package/templates/DOCS-UPDATE-LOG.md +14 -0
- package/templates/IMPORTED-CONTEXT.md +2 -0
- package/templates/INITIAL-FINDINGS.md +5 -0
- package/templates/PROGRESS.md +8 -0
- package/workflows/audit-only.yaml +12 -0
- package/workflows/bluefield-arc.yaml +16 -1
- package/workflows/brownfield-arc.yaml +17 -1
- package/workflows/deps-audit.yaml +13 -0
- package/workflows/docs-arc.yaml +23 -0
- package/workflows/feature-arc.yaml +14 -0
- package/workflows/full-arc.yaml +19 -0
- package/workflows/hotfix-arc.yaml +14 -0
- package/workflows/hygiene.yaml +6 -0
- package/workflows/migration-arc.yaml +15 -0
- package/workflows/postmortem.yaml +13 -0
- package/workflows/refactor-arc.yaml +14 -0
- package/workflows/spike.yaml +11 -0
package/agents/god-updater.md
CHANGED
|
@@ -4,8 +4,9 @@ description: |
|
|
|
4
4
|
After feature work, syncs all affected artifacts: PRD (add requirement),
|
|
5
5
|
ARCH (add ADR/delta), ROADMAP (mark progress, append entries), STACK
|
|
6
6
|
(add deps), DEPLOY/OBSERVE/HARDEN/LAUNCH (note new surface), TODOS
|
|
7
|
-
(resolve superseded), THREADS (update)
|
|
8
|
-
|
|
7
|
+
(resolve superseded), THREADS (update), repository documentation, runtime
|
|
8
|
+
feature awareness, source-system sync-back, host capability notes, and
|
|
9
|
+
repository surface checks. Re-validates have-nots after each update.
|
|
9
10
|
|
|
10
11
|
Spawned by: /god-sync, end of feature-addition recipe execution
|
|
11
12
|
tools: Read, Write, Edit, Bash, Grep, Glob, Task
|
|
@@ -20,6 +21,9 @@ After feature work, every artifact that was impacted needs to reflect reality.
|
|
|
20
21
|
- The reconciliation verdict (from god-reconciler) showing which artifacts changed
|
|
21
22
|
- Description of what was just done (commits, slice plans, etc.)
|
|
22
23
|
- Project root
|
|
24
|
+
- Changed files, when the caller can provide them
|
|
25
|
+
- Trigger type: manual `/god-sync`, closeout from `/god-mode`, release work,
|
|
26
|
+
migration import, hotfix, or docs-only sync
|
|
23
27
|
|
|
24
28
|
## Operations (per artifact, conditional)
|
|
25
29
|
|
|
@@ -118,6 +122,74 @@ After feature work, every artifact that was impacted needs to reflect reality.
|
|
|
118
122
|
- drift findings
|
|
119
123
|
- REVIEW-REQUIRED.md items created
|
|
120
124
|
|
|
125
|
+
### Repository documentation sync
|
|
126
|
+
- Call `lib/repo-doc-sync.run(projectRoot, { changedFiles })` when the runtime
|
|
127
|
+
is available. Use detect-only mode when the caller is in read-only audit mode.
|
|
128
|
+
- Safe mechanical fixes may update version badges, package description counts,
|
|
129
|
+
README command counts, reference counts, and shipped-version markers.
|
|
130
|
+
- Narrative drift in release notes, changelog, contribution policy, security
|
|
131
|
+
policy, or support docs must spawn or recommend `god-docs-writer`.
|
|
132
|
+
- Emit or preserve the local log at `.godpowers/docs/REPO-DOC-SYNC.md`.
|
|
133
|
+
- Report:
|
|
134
|
+
- status: fresh, stale, applied, or skipped
|
|
135
|
+
- safe fixes applied
|
|
136
|
+
- narrative paths requiring a docs writer
|
|
137
|
+
- Pillars sync plan count when touched docs affect portable context
|
|
138
|
+
|
|
139
|
+
### Repository surface sync
|
|
140
|
+
- Call `lib/repo-surface-sync.run(projectRoot, { changedFiles })` when the
|
|
141
|
+
runtime is available.
|
|
142
|
+
- This checks routing, package file entries, package content checks, agent
|
|
143
|
+
contracts, workflow metadata, recipe coverage, extension publish readiness,
|
|
144
|
+
route quality, release surface, and repository documentation drift.
|
|
145
|
+
- Safe local fixes may write missing routing stubs only when explicitly allowed
|
|
146
|
+
by the caller.
|
|
147
|
+
- Emit or preserve the local log at `.godpowers/surface/REPO-SURFACE-SYNC.md`.
|
|
148
|
+
- Report:
|
|
149
|
+
- status: fresh, stale, applied, or skipped
|
|
150
|
+
- stale checks by area
|
|
151
|
+
- spawn recommendations
|
|
152
|
+
- whether route, recipe, release, and documentation sub-checks were fresh
|
|
153
|
+
|
|
154
|
+
### Runtime feature awareness
|
|
155
|
+
- Call `lib/feature-awareness.run(projectRoot)` for existing `.godpowers`
|
|
156
|
+
projects when the runtime is available.
|
|
157
|
+
- Record the installed runtime version, the current feature-set version, and
|
|
158
|
+
known feature IDs into `.godpowers/state.json`.
|
|
159
|
+
- Refresh AI-tool context fences only through `god-context-writer` or
|
|
160
|
+
`lib/context-writer.js`; do not hand-edit outside managed fences.
|
|
161
|
+
- If low-confidence imported planning systems or sync-back conflicts are
|
|
162
|
+
detected, spawn or recommend `god-greenfieldifier`.
|
|
163
|
+
- Report:
|
|
164
|
+
- runtime version
|
|
165
|
+
- missing features before refresh
|
|
166
|
+
- whether state changed
|
|
167
|
+
- context files refreshed or skipped
|
|
168
|
+
|
|
169
|
+
### Source-system sync-back
|
|
170
|
+
- Call `lib/source-sync.run(projectRoot)` when `.godpowers/state.json`
|
|
171
|
+
declares GSD, BMAD, Superpowers, or other source-system records.
|
|
172
|
+
- Write only managed Godpowers summary sections back to source systems.
|
|
173
|
+
- Preserve user-authored source-system content outside managed sections.
|
|
174
|
+
- If source-system confidence is low or conflicts are present, recommend
|
|
175
|
+
`god-greenfieldifier` before writing.
|
|
176
|
+
- Report:
|
|
177
|
+
- source systems found
|
|
178
|
+
- summaries written, unchanged, skipped, or blocked
|
|
179
|
+
- conflict count
|
|
180
|
+
|
|
181
|
+
### Host capability and dashboard refresh
|
|
182
|
+
- Call `lib/host-capabilities.detect(projectRoot)` when available and include
|
|
183
|
+
the guarantee level in closeouts.
|
|
184
|
+
- Call `lib/dashboard.compute(projectRoot)` and `lib/dashboard.render(result)`
|
|
185
|
+
for user-facing status when available.
|
|
186
|
+
- Treat host guarantee gaps as visible runtime facts, not fatal failures.
|
|
187
|
+
- Report:
|
|
188
|
+
- host name
|
|
189
|
+
- guarantee level: full, degraded, or unknown
|
|
190
|
+
- top gap, when present
|
|
191
|
+
- dashboard readiness and attention line
|
|
192
|
+
|
|
121
193
|
### Pillars sync (native context)
|
|
122
194
|
- Call `lib/pillars.pillarizeExisting(projectRoot)` if Pillars is absent or
|
|
123
195
|
partial.
|
|
@@ -171,6 +243,11 @@ Sync status:
|
|
|
171
243
|
- Pillars sync: [applied/proposed/no-op/skipped], [N] pillar files
|
|
172
244
|
- Checkpoint sync: [created/updated/no-op/skipped] .godpowers/CHECKPOINT.md
|
|
173
245
|
- Context refresh: [spawned god-context-writer/no-op/skipped], [N] files
|
|
246
|
+
- Repo docs sync: [fresh/applied/stale/skipped], [N] safe fixes, [N] docs-writer paths
|
|
247
|
+
- Repo surface sync: [fresh/applied/stale/skipped], [N] stale checks, [N] spawn recommendations
|
|
248
|
+
- Feature awareness: [fresh/applied/skipped], runtime [version], [N] new features recorded
|
|
249
|
+
- Source sync-back: [written/unchanged/blocked/skipped], [N] source systems
|
|
250
|
+
- Host capabilities: [full/degraded/unknown], [top gap or none]
|
|
174
251
|
|
|
175
252
|
Updated:
|
|
176
253
|
- prd/PRD.md: added requirement P-MUST-12
|
|
@@ -201,8 +278,13 @@ Sync status:
|
|
|
201
278
|
Local syncs:
|
|
202
279
|
+ reverse-sync: <counts and result>
|
|
203
280
|
+ pillars-sync: <counts and result>
|
|
281
|
+
+ repo-doc-sync: <fresh, applied, stale, or skipped>
|
|
282
|
+
+ repo-surface-sync: <fresh, applied, stale, or skipped>
|
|
283
|
+
+ feature-awareness: <fresh, applied, or skipped>
|
|
284
|
+
+ source-sync-back: <written, unchanged, blocked, or skipped>
|
|
204
285
|
+ checkpoint-sync: <created, updated, no-op, or skipped>
|
|
205
286
|
+ context-refresh: <spawned, no-op, or skipped>
|
|
287
|
+
+ host-capabilities: <full, degraded, or unknown>
|
|
206
288
|
Artifacts: <changed files or no-op>
|
|
207
289
|
Log: .godpowers/SYNC-LOG.md
|
|
208
290
|
|
package/bin/install.js
CHANGED
|
@@ -303,6 +303,12 @@ function parseArgs(argv) {
|
|
|
303
303
|
command: null,
|
|
304
304
|
project: process.cwd(),
|
|
305
305
|
json: false,
|
|
306
|
+
brief: false,
|
|
307
|
+
extensionName: null,
|
|
308
|
+
extensionOutput: process.cwd(),
|
|
309
|
+
extensionSkill: null,
|
|
310
|
+
extensionAgent: null,
|
|
311
|
+
extensionWorkflow: null,
|
|
306
312
|
runtimes: [],
|
|
307
313
|
global: false,
|
|
308
314
|
local: false,
|
|
@@ -318,11 +324,16 @@ function parseArgs(argv) {
|
|
|
318
324
|
case 'next':
|
|
319
325
|
case 'automation-status':
|
|
320
326
|
case 'automation-setup':
|
|
327
|
+
case 'dogfood':
|
|
328
|
+
case 'extension-scaffold':
|
|
321
329
|
opts.command = arg;
|
|
322
330
|
break;
|
|
323
331
|
case '--json':
|
|
324
332
|
opts.json = true;
|
|
325
333
|
break;
|
|
334
|
+
case '--brief':
|
|
335
|
+
opts.brief = true;
|
|
336
|
+
break;
|
|
326
337
|
case '--project':
|
|
327
338
|
if (args[i + 1]) {
|
|
328
339
|
opts.project = path.resolve(args[i + 1]);
|
|
@@ -351,6 +362,16 @@ function parseArgs(argv) {
|
|
|
351
362
|
default:
|
|
352
363
|
if (arg.startsWith('--project=')) {
|
|
353
364
|
opts.project = path.resolve(arg.slice('--project='.length));
|
|
365
|
+
} else if (arg.startsWith('--name=')) {
|
|
366
|
+
opts.extensionName = arg.slice('--name='.length);
|
|
367
|
+
} else if (arg.startsWith('--output=')) {
|
|
368
|
+
opts.extensionOutput = path.resolve(arg.slice('--output='.length));
|
|
369
|
+
} else if (arg.startsWith('--skill=')) {
|
|
370
|
+
opts.extensionSkill = arg.slice('--skill='.length);
|
|
371
|
+
} else if (arg.startsWith('--agent=')) {
|
|
372
|
+
opts.extensionAgent = arg.slice('--agent='.length);
|
|
373
|
+
} else if (arg.startsWith('--workflow=')) {
|
|
374
|
+
opts.extensionWorkflow = arg.slice('--workflow='.length);
|
|
354
375
|
} else if (arg.startsWith('--') && RUNTIMES[arg.slice(2)]) {
|
|
355
376
|
opts.runtimes.push(arg.slice(2));
|
|
356
377
|
}
|
|
@@ -575,10 +596,18 @@ function showHelp() {
|
|
|
575
596
|
log(' next Show the dashboard and recommended next command');
|
|
576
597
|
log(' automation-status Show host automation provider support');
|
|
577
598
|
log(' automation-setup Show an opt-in automation setup plan');
|
|
599
|
+
log(' dogfood Run built-in messy-repo dogfood scenarios');
|
|
600
|
+
log(' extension-scaffold Create a publishable extension pack skeleton');
|
|
578
601
|
log('');
|
|
579
602
|
log('Options:');
|
|
580
603
|
log(' --project=<path> Project root for status, next, or automation commands');
|
|
581
604
|
log(' --json Emit JSON for status, next, or automation commands');
|
|
605
|
+
log(' --brief Render a compact dashboard for status or next');
|
|
606
|
+
log(' --name=<scope/name> Extension package name for extension-scaffold');
|
|
607
|
+
log(' --output=<path> Extension output root for extension-scaffold');
|
|
608
|
+
log(' --skill=<name> Extension skill name for extension-scaffold');
|
|
609
|
+
log(' --agent=<name> Extension agent name for extension-scaffold');
|
|
610
|
+
log(' --workflow=<name> Extension workflow name for extension-scaffold');
|
|
582
611
|
log(' -g, --global Install globally (to config directory)');
|
|
583
612
|
log(' -l, --local Install locally (to current directory)');
|
|
584
613
|
log(' --claude Install for Claude Code');
|
|
@@ -605,6 +634,8 @@ function showHelp() {
|
|
|
605
634
|
log(' npx godpowers next --project=.');
|
|
606
635
|
log(' npx godpowers automation-status --project=.');
|
|
607
636
|
log(' npx godpowers automation-setup --project=.');
|
|
637
|
+
log(' npx godpowers dogfood');
|
|
638
|
+
log(' npx godpowers extension-scaffold --name=@godpowers/my-pack --output=.');
|
|
608
639
|
log(' npx godpowers --claude --global');
|
|
609
640
|
log(' npx godpowers --all');
|
|
610
641
|
log(' npx godpowers --codex --cursor');
|
|
@@ -630,7 +661,7 @@ function runDashboardCommand(opts) {
|
|
|
630
661
|
if (opts.json) {
|
|
631
662
|
console.log(JSON.stringify(result, null, 2));
|
|
632
663
|
} else {
|
|
633
|
-
|
|
664
|
+
console.log(dashboard.render(result, { brief: opts.brief }));
|
|
634
665
|
if (opts.command === 'next') {
|
|
635
666
|
console.log('');
|
|
636
667
|
console.log('Suggested next command:');
|
|
@@ -639,6 +670,45 @@ function runDashboardCommand(opts) {
|
|
|
639
670
|
}
|
|
640
671
|
}
|
|
641
672
|
|
|
673
|
+
function runDogfoodCommand(opts) {
|
|
674
|
+
const dogfood = require('../lib/dogfood-runner');
|
|
675
|
+
const result = dogfood.runAll();
|
|
676
|
+
if (opts.json) {
|
|
677
|
+
console.log(JSON.stringify(result, null, 2));
|
|
678
|
+
} else {
|
|
679
|
+
console.log(dogfood.render(result));
|
|
680
|
+
}
|
|
681
|
+
if (result.status !== 'pass') process.exit(1);
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
function runExtensionScaffoldCommand(opts) {
|
|
685
|
+
const authoring = require('../lib/extension-authoring');
|
|
686
|
+
if (!opts.extensionName) {
|
|
687
|
+
error('extension-scaffold requires --name=@scope/package');
|
|
688
|
+
process.exit(1);
|
|
689
|
+
}
|
|
690
|
+
const result = authoring.scaffold(opts.extensionOutput, {
|
|
691
|
+
name: opts.extensionName,
|
|
692
|
+
skill: opts.extensionSkill || undefined,
|
|
693
|
+
agent: opts.extensionAgent || undefined,
|
|
694
|
+
workflow: opts.extensionWorkflow || undefined,
|
|
695
|
+
runtimeVersion: VERSION
|
|
696
|
+
});
|
|
697
|
+
if (opts.json) {
|
|
698
|
+
console.log(JSON.stringify(result, null, 2));
|
|
699
|
+
} else {
|
|
700
|
+
success(`Scaffolded ${result.name} at ${result.path}`);
|
|
701
|
+
if (result.written.length > 0) {
|
|
702
|
+
log(`Wrote ${result.written.length} file(s): ${result.written.join(', ')}`);
|
|
703
|
+
}
|
|
704
|
+
if (result.validation.length > 0) {
|
|
705
|
+
warn(`Validation warnings: ${result.validation.join('; ')}`);
|
|
706
|
+
} else {
|
|
707
|
+
success('Extension manifest validates');
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
|
|
642
712
|
// ---------------------------------------------------------------------------
|
|
643
713
|
// Main
|
|
644
714
|
// ---------------------------------------------------------------------------
|
|
@@ -661,6 +731,16 @@ function main() {
|
|
|
661
731
|
return;
|
|
662
732
|
}
|
|
663
733
|
|
|
734
|
+
if (opts.command === 'dogfood') {
|
|
735
|
+
runDogfoodCommand(opts);
|
|
736
|
+
return;
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
if (opts.command === 'extension-scaffold') {
|
|
740
|
+
runExtensionScaffoldCommand(opts);
|
|
741
|
+
return;
|
|
742
|
+
}
|
|
743
|
+
|
|
664
744
|
console.log(BANNER);
|
|
665
745
|
|
|
666
746
|
const srcDir = path.resolve(__dirname, '..');
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Extension authoring scaffold",
|
|
3
|
+
"kind": "extension-authoring",
|
|
4
|
+
"extensionName": "@godpowers/dogfood-pack",
|
|
5
|
+
"expectedFiles": [
|
|
6
|
+
"manifest.yaml",
|
|
7
|
+
"package.json",
|
|
8
|
+
"README.md",
|
|
9
|
+
"skills/god-dogfood-extension.md",
|
|
10
|
+
"agents/god-dogfood-agent.md",
|
|
11
|
+
"workflows/dogfood-workflow.yaml"
|
|
12
|
+
]
|
|
13
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Half migrated GSD project",
|
|
3
|
+
"kind": "planning-migration",
|
|
4
|
+
"actions": [
|
|
5
|
+
"import-planning-context",
|
|
6
|
+
"sync-back"
|
|
7
|
+
],
|
|
8
|
+
"expectedSystems": [
|
|
9
|
+
"gsd"
|
|
10
|
+
],
|
|
11
|
+
"expectedFiles": [
|
|
12
|
+
".godpowers/prep/IMPORTED-CONTEXT.md",
|
|
13
|
+
".godpowers/prd/PRD.md",
|
|
14
|
+
".planning/GODPOWERS-SYNC.md"
|
|
15
|
+
]
|
|
16
|
+
}
|
package/hooks/pre-tool-use.sh
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# Godpowers PreToolUse Safety Hook
|
|
3
3
|
# Runs before destructive tool calls in a Godpowers project.
|
|
4
|
-
# Warns on: rm -rf, git reset --hard, force push to main, deleting .godpowers
|
|
4
|
+
# Warns on: rm -rf, git reset --hard, force push to main, deleting .godpowers/,
|
|
5
|
+
# and irreversible public release actions.
|
|
5
6
|
|
|
6
7
|
set -euo pipefail
|
|
7
8
|
|
|
@@ -31,6 +32,17 @@ case "$TOOL_INPUT" in
|
|
|
31
32
|
echo "destroy collaborators' work."
|
|
32
33
|
exit 1
|
|
33
34
|
;;
|
|
35
|
+
*"npm publish"*)
|
|
36
|
+
echo "WARNING: npm publish is a public release action."
|
|
37
|
+
echo "Confirm release checklist, repo-doc-sync, repo-surface-sync,"
|
|
38
|
+
echo "release-surface-sync, package contents, and installer smoke first."
|
|
39
|
+
exit 1
|
|
40
|
+
;;
|
|
41
|
+
*"gh release create"*)
|
|
42
|
+
echo "WARNING: gh release create publishes public release notes."
|
|
43
|
+
echo "Confirm README, badges, CHANGELOG, RELEASE, package, tag, and npm version agree."
|
|
44
|
+
exit 1
|
|
45
|
+
;;
|
|
34
46
|
*"rm -rf node_modules"*)
|
|
35
47
|
# Allowed: this is just cache
|
|
36
48
|
exit 0
|
package/hooks/session-start.sh
CHANGED
|
@@ -30,6 +30,17 @@ cat <<'EOF'
|
|
|
30
30
|
A Godpowers project is active in this directory.
|
|
31
31
|
EOF
|
|
32
32
|
|
|
33
|
+
# Prefer the shared dashboard action brief when the installed CLI is available.
|
|
34
|
+
# This keeps hook orientation aligned with /god-status and /god-next.
|
|
35
|
+
if command -v godpowers >/dev/null 2>&1; then
|
|
36
|
+
BRIEF="$(godpowers status --project . --brief 2>/dev/null | head -30 || true)"
|
|
37
|
+
if [ -n "$BRIEF" ]; then
|
|
38
|
+
echo ""
|
|
39
|
+
echo "$BRIEF"
|
|
40
|
+
echo ""
|
|
41
|
+
fi
|
|
42
|
+
fi
|
|
43
|
+
|
|
33
44
|
# Prefer CHECKPOINT.md (the orient-a-new-session pin) when present
|
|
34
45
|
if [ -f "$CHECKPOINT_FILE" ]; then
|
|
35
46
|
echo ""
|
|
@@ -69,6 +80,7 @@ Next step: run /god-next (it inspects disk state and proposes the next command)
|
|
|
69
80
|
Or: /god-mode for the full autonomous project run
|
|
70
81
|
Or: /god-help to see the catalog
|
|
71
82
|
Or: /god-status for the full project snapshot
|
|
83
|
+
Or: /god-context refresh after installing a newer Godpowers runtime
|
|
72
84
|
|
|
73
85
|
Disk state is authoritative. Conversation memory is not.
|
|
74
86
|
EOF
|
package/lib/README.md
CHANGED
|
@@ -13,11 +13,13 @@ package-level integrations.
|
|
|
13
13
|
| `intent.js` | Read and validate `intent.yaml` from project roots or `.godpowers/`. |
|
|
14
14
|
| `checkpoint.js` | Create and inspect resumable checkpoint artifacts. |
|
|
15
15
|
| `feature-awareness.js` | Detect and refresh existing-project awareness after runtime upgrades. |
|
|
16
|
+
| `host-capabilities.js` | Detect host guarantees for shell, git, npm, agent spawning, extension authoring, and suite dry-runs. |
|
|
16
17
|
| `repo-doc-sync.js` | Detect and refresh mechanical repository documentation surfaces. |
|
|
17
18
|
| `repo-surface-sync.js` | Detect structural drift across commands, routes, packages, agents, workflows, recipes, extensions, and release policy. |
|
|
18
19
|
| `route-quality-sync.js` | Detect symbolic route spawns, unresolved agent targets, and unapproved contextual route exits. |
|
|
19
20
|
| `recipe-coverage-sync.js` | Detect missing high-frequency intent recipe coverage. |
|
|
20
21
|
| `release-surface-sync.js` | Detect release-facing drift across badges, release notes, changelog, package checks, and release checklist policy. |
|
|
22
|
+
| `dogfood-runner.js` | Run deterministic messy-repo scenarios against migration, host, extension, and suite release behavior. |
|
|
21
23
|
| `budget.js` | Read and enforce configured budget controls. |
|
|
22
24
|
| `cost-tracker.js` | Track token and cost estimates from event streams. |
|
|
23
25
|
|
|
@@ -68,6 +70,7 @@ package-level integrations.
|
|
|
68
70
|
| `skillui-bridge.js` | Bridge skill metadata into UI surfaces. |
|
|
69
71
|
| `impeccable-bridge.js` | Bridge runtime checks into impeccable quality workflows. |
|
|
70
72
|
| `extensions.js` | Load and validate extension packs. |
|
|
73
|
+
| `extension-authoring.js` | Scaffold publishable extension packs with manifest, package, README, skill, agent, and workflow files. |
|
|
71
74
|
|
|
72
75
|
## Repository and graph helpers
|
|
73
76
|
|
package/lib/dashboard.js
CHANGED
|
@@ -14,6 +14,7 @@ const router = require('./router');
|
|
|
14
14
|
const automationProviders = require('./automation-providers');
|
|
15
15
|
const repoDocSync = require('./repo-doc-sync');
|
|
16
16
|
const repoSurfaceSync = require('./repo-surface-sync');
|
|
17
|
+
const hostCapabilities = require('./host-capabilities');
|
|
17
18
|
|
|
18
19
|
const GOD_DIR = '.godpowers';
|
|
19
20
|
const PRD_PATH = '.godpowers/prd/PRD.md';
|
|
@@ -168,6 +169,7 @@ function proactiveChecks(projectRoot, changedFiles = []) {
|
|
|
168
169
|
const repoSurfaceStatus = repoSurface.status === 'fresh'
|
|
169
170
|
? 'fresh'
|
|
170
171
|
: `${repoSurface.stale.length} stale, suggest /god-doctor`;
|
|
172
|
+
const host = hostCapabilities.detect(projectRoot);
|
|
171
173
|
|
|
172
174
|
return {
|
|
173
175
|
checkpoint,
|
|
@@ -175,6 +177,7 @@ function proactiveChecks(projectRoot, changedFiles = []) {
|
|
|
175
177
|
sync,
|
|
176
178
|
docs: repoDocsStatus,
|
|
177
179
|
repoSurface: repoSurfaceStatus,
|
|
180
|
+
host: hostCapabilities.summary(host),
|
|
178
181
|
runtime: 'not-applicable',
|
|
179
182
|
automation: automationSummary(projectRoot),
|
|
180
183
|
security: sensitiveChanged ? 'sensitive files changed, suggest /god-harden' : 'clear',
|
|
@@ -234,6 +237,7 @@ function compute(projectRoot, opts = {}) {
|
|
|
234
237
|
completionBasis: 'missing .godpowers/state.json'
|
|
235
238
|
},
|
|
236
239
|
proactive: proactiveChecks(projectRoot, git.entries.map(statusPath)),
|
|
240
|
+
host: hostCapabilities.detect(projectRoot, opts.host || {}),
|
|
237
241
|
next,
|
|
238
242
|
openItems: ['No .godpowers/state.json found']
|
|
239
243
|
};
|
|
@@ -263,6 +267,7 @@ function compute(projectRoot, opts = {}) {
|
|
|
263
267
|
index: git.index,
|
|
264
268
|
planning: planningVisibility(projectRoot, progress),
|
|
265
269
|
proactive: proactiveChecks(projectRoot, git.entries.map(statusPath)),
|
|
270
|
+
host: hostCapabilities.detect(projectRoot, opts.host || {}),
|
|
266
271
|
next,
|
|
267
272
|
openItems
|
|
268
273
|
};
|
|
@@ -277,6 +282,7 @@ function actionBrief(dashboard) {
|
|
|
277
282
|
for (const [label, value] of [
|
|
278
283
|
['Repo surface', proactive.repoSurface],
|
|
279
284
|
['Docs', proactive.docs],
|
|
285
|
+
['Host', proactive.host],
|
|
280
286
|
['Reviews', proactive.reviews],
|
|
281
287
|
['Sync', proactive.sync],
|
|
282
288
|
['Security', proactive.security],
|
|
@@ -285,6 +291,7 @@ function actionBrief(dashboard) {
|
|
|
285
291
|
]) {
|
|
286
292
|
if (!value) continue;
|
|
287
293
|
if (value === 'fresh' || value === 'none' || value === 'clear' || value === 'not-applicable') continue;
|
|
294
|
+
if (/^full on /.test(value)) continue;
|
|
288
295
|
if (/^available via /.test(value)) continue;
|
|
289
296
|
blockers.push(`${label}: ${value}`);
|
|
290
297
|
}
|
|
@@ -299,7 +306,7 @@ function actionBrief(dashboard) {
|
|
|
299
306
|
};
|
|
300
307
|
}
|
|
301
308
|
|
|
302
|
-
function render(dashboard) {
|
|
309
|
+
function render(dashboard, opts = {}) {
|
|
303
310
|
const current = dashboard.current || {};
|
|
304
311
|
const planning = dashboard.planning || {};
|
|
305
312
|
const proactive = dashboard.proactive || {};
|
|
@@ -311,6 +318,26 @@ function render(dashboard) {
|
|
|
311
318
|
? dashboard.openItems
|
|
312
319
|
: ['none'];
|
|
313
320
|
const brief = dashboard.actionBrief || actionBrief(dashboard);
|
|
321
|
+
if (opts.mode === 'brief' || opts.brief === true) {
|
|
322
|
+
return [
|
|
323
|
+
'Godpowers Dashboard',
|
|
324
|
+
'',
|
|
325
|
+
'Action brief:',
|
|
326
|
+
` Next: ${brief.recommended}`,
|
|
327
|
+
` Why: ${brief.reason}`,
|
|
328
|
+
` Readiness: ${brief.confidence}`,
|
|
329
|
+
` Attention: ${brief.blockers && brief.blockers.length > 0 ? brief.blockers.join('; ') : 'none'}${brief.overflow ? `; ${brief.overflow} more` : ''}`,
|
|
330
|
+
` Host guarantees: ${dashboard.host ? hostCapabilities.summary(dashboard.host) : proactive.host || 'unknown'}`,
|
|
331
|
+
'',
|
|
332
|
+
'Current status:',
|
|
333
|
+
` State: ${dashboard.state}`,
|
|
334
|
+
` Progress: ${progress.percent || 0}% workflow progress (${progress.completed || 0} of ${progress.total || 0} tracked steps complete)`,
|
|
335
|
+
'',
|
|
336
|
+
'Next:',
|
|
337
|
+
` Recommended: ${next.command || 'describe the next intent'}`,
|
|
338
|
+
` Why: ${next.reason || 'No route was computed.'}`
|
|
339
|
+
].join('\n');
|
|
340
|
+
}
|
|
314
341
|
|
|
315
342
|
return [
|
|
316
343
|
'Godpowers Dashboard',
|
|
@@ -330,6 +357,7 @@ function render(dashboard) {
|
|
|
330
357
|
` Why: ${brief.reason}`,
|
|
331
358
|
` Readiness: ${brief.confidence}`,
|
|
332
359
|
` Attention: ${brief.blockers && brief.blockers.length > 0 ? brief.blockers.join('; ') : 'none'}${brief.overflow ? `; ${brief.overflow} more` : ''}`,
|
|
360
|
+
` Host guarantees: ${dashboard.host ? hostCapabilities.summary(dashboard.host) : proactive.host || 'unknown'}`,
|
|
333
361
|
'',
|
|
334
362
|
'Planning visibility:',
|
|
335
363
|
` PRD: ${prd.status || 'missing'}${prd.path ? ` ${prd.path}` : ''}`,
|
|
@@ -343,6 +371,7 @@ function render(dashboard) {
|
|
|
343
371
|
` Sync: ${proactive.sync || 'unknown'}`,
|
|
344
372
|
` Docs: ${proactive.docs || 'unknown'}`,
|
|
345
373
|
` Repo surface: ${proactive.repoSurface || 'unknown'}`,
|
|
374
|
+
` Host: ${proactive.host || 'unknown'}`,
|
|
346
375
|
` Runtime: ${proactive.runtime || 'unknown'}`,
|
|
347
376
|
` Automation: ${proactive.automation || 'unknown'}`,
|
|
348
377
|
` Security: ${proactive.security || 'unknown'}`,
|