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.
Files changed (72) hide show
  1. package/AGENTS.md +6 -0
  2. package/CHANGELOG.md +75 -0
  3. package/INSPIRATION.md +6 -0
  4. package/README.md +25 -9
  5. package/RELEASE.md +50 -58
  6. package/SKILL.md +24 -4
  7. package/agents/god-orchestrator.md +18 -3
  8. package/agents/god-reconciler.md +52 -5
  9. package/agents/god-updater.md +84 -2
  10. package/bin/install.js +81 -1
  11. package/fixtures/dogfood/extension-authoring/manifest.json +13 -0
  12. package/fixtures/dogfood/half-migrated-gsd/.planning/PROJECT.md +5 -0
  13. package/fixtures/dogfood/half-migrated-gsd/.planning/REQUIREMENTS.md +5 -0
  14. package/fixtures/dogfood/half-migrated-gsd/.planning/ROADMAP.md +5 -0
  15. package/fixtures/dogfood/half-migrated-gsd/manifest.json +16 -0
  16. package/fixtures/dogfood/host-degraded/manifest.json +5 -0
  17. package/fixtures/dogfood/host-full/home/.codex/agents/god-orchestrator.toml +2 -0
  18. package/fixtures/dogfood/host-full/manifest.json +5 -0
  19. package/fixtures/dogfood/suite-release-dry-run/.godpowers/suite-config.yaml +9 -0
  20. package/fixtures/dogfood/suite-release-dry-run/manifest.json +7 -0
  21. package/fixtures/dogfood/suite-release-dry-run/repo-a/package.json +4 -0
  22. package/fixtures/dogfood/suite-release-dry-run/repo-b/package.json +7 -0
  23. package/hooks/pre-tool-use.sh +13 -1
  24. package/hooks/session-start.sh +12 -0
  25. package/lib/README.md +3 -0
  26. package/lib/dashboard.js +30 -1
  27. package/lib/dogfood-runner.js +193 -0
  28. package/lib/events.js +6 -0
  29. package/lib/extension-authoring.js +154 -0
  30. package/lib/feature-awareness.js +30 -0
  31. package/lib/have-nots-validator.js +2 -2
  32. package/lib/host-capabilities.js +125 -0
  33. package/lib/release-surface-sync.js +6 -0
  34. package/lib/repo-surface-sync.js +58 -0
  35. package/lib/suite-state.js +90 -1
  36. package/lib/workflow-runner.js +4 -0
  37. package/package.json +5 -4
  38. package/references/HAVE-NOTS.md +16 -0
  39. package/references/orchestration/MODE-DETECTION.md +36 -3
  40. package/references/orchestration/README.md +5 -2
  41. package/references/planning/ROADMAP-ANTIPATTERNS.md +1 -1
  42. package/references/shared/ORCHESTRATORS.md +42 -11
  43. package/references/shared/README.md +4 -4
  44. package/routing/god-dogfood.yaml +35 -0
  45. package/schema/events.v1.json +9 -0
  46. package/schema/intent.v1.yaml.json +5 -1
  47. package/schema/recipe.v1.json +2 -1
  48. package/schema/routing.v1.json +20 -0
  49. package/schema/state.v1.json +51 -0
  50. package/schema/workflow.v1.json +31 -2
  51. package/skills/god-doctor.md +1 -1
  52. package/skills/god-dogfood.md +63 -0
  53. package/skills/god-mode.md +4 -1
  54. package/skills/god-reconcile.md +13 -4
  55. package/skills/god-version.md +2 -2
  56. package/templates/DOCS-UPDATE-LOG.md +14 -0
  57. package/templates/IMPORTED-CONTEXT.md +2 -0
  58. package/templates/INITIAL-FINDINGS.md +5 -0
  59. package/templates/PROGRESS.md +8 -0
  60. package/workflows/audit-only.yaml +12 -0
  61. package/workflows/bluefield-arc.yaml +16 -1
  62. package/workflows/brownfield-arc.yaml +17 -1
  63. package/workflows/deps-audit.yaml +13 -0
  64. package/workflows/docs-arc.yaml +23 -0
  65. package/workflows/feature-arc.yaml +14 -0
  66. package/workflows/full-arc.yaml +19 -0
  67. package/workflows/hotfix-arc.yaml +14 -0
  68. package/workflows/hygiene.yaml +6 -0
  69. package/workflows/migration-arc.yaml +15 -0
  70. package/workflows/postmortem.yaml +13 -0
  71. package/workflows/refactor-arc.yaml +14 -0
  72. package/workflows/spike.yaml +11 -0
@@ -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). Re-validates have-nots after
8
- each update.
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
- console.log(dashboard.render(result));
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,5 @@
1
+ # Project
2
+
3
+ ## Users
4
+
5
+ - [ ] Operators need a planning import that keeps prior state visible.
@@ -0,0 +1,5 @@
1
+ # Requirements
2
+
3
+ ## Functional Requirements
4
+
5
+ - [ ] Import prior requirements into Godpowers preparation context.
@@ -0,0 +1,5 @@
1
+ # Roadmap
2
+
3
+ ## Phase 1
4
+
5
+ - [ ] Migrate the project without deleting GSD files.
@@ -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
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "Host guarantee degraded mode",
3
+ "kind": "host-capabilities",
4
+ "expectedLevel": "degraded"
5
+ }
@@ -0,0 +1,2 @@
1
+ name = "god-orchestrator"
2
+ description = "Fixture agent metadata."
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "Host guarantee full mode",
3
+ "kind": "host-capabilities",
4
+ "expectedLevel": "full"
5
+ }
@@ -0,0 +1,9 @@
1
+ name: dogfood-suite
2
+ siblings:
3
+ - repo-a
4
+ - repo-b
5
+ version-table:
6
+ repo-a:
7
+ repo-a: 1.2.3
8
+ repo-b:
9
+ repo-b: 1.2.3
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "Mode D suite release dry-run",
3
+ "kind": "suite-release",
4
+ "repo": "repo-a",
5
+ "version": "1.2.4",
6
+ "expectedImpacted": 1
7
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "name": "repo-a",
3
+ "version": "1.2.3"
4
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "repo-b",
3
+ "version": "1.2.3",
4
+ "dependencies": {
5
+ "repo-a": "^1.2.3"
6
+ }
7
+ }
@@ -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
@@ -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'}`,