godpowers 1.6.11 → 1.6.12

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 CHANGED
@@ -5,6 +5,37 @@ All notable changes to Godpowers will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.6.12] - 2026-05-16
9
+
10
+ Executable dashboard CLI and shared runtime status engine.
11
+
12
+ ### Added
13
+ - Added `lib/dashboard.js`, a shared executable engine for project status,
14
+ progress percentage, tier position, planning visibility, proactive checks,
15
+ open items, and recommended next command.
16
+ - Added `godpowers status --project .` for human, CI, and host-runtime status
17
+ checks outside the slash command layer.
18
+ - Added `godpowers next --project .` for direct next-action routing from disk
19
+ state.
20
+ - Added `--json` output for the new status and next commands.
21
+ - Added dashboard behavioral tests, CLI status and next tests, and git
22
+ porcelain parsing tests.
23
+
24
+ ### Changed
25
+ - `/god-status`, `/god-next`, `/god-mode`, and `god-orchestrator` now point to
26
+ the shared dashboard engine when local runtime execution is available.
27
+ - The installer help now documents status and next as first-class commands.
28
+ - Release documentation now names the executable dashboard contract instead of
29
+ treating progress visibility as Markdown-only guidance.
30
+
31
+ ### Fixed
32
+ - Fixed git porcelain parsing so leading-space worktree entries such as
33
+ ` M README.md` do not clip filenames in dashboard output.
34
+
35
+ ### Validation
36
+ - Added tests prove dashboard computation, dashboard rendering, CLI JSON
37
+ output, proactive review suggestions, and staged path reporting.
38
+
8
39
  ## [1.6.11] - 2026-05-16
9
40
 
10
41
  Auto-invoke visibility and platform-neutral spawning patch.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![CI](https://github.com/aihxp/godpowers/actions/workflows/ci.yml/badge.svg)](https://github.com/aihxp/godpowers/actions/workflows/ci.yml)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
5
- [![Version](https://img.shields.io/badge/version-1.6.11-blue)](CHANGELOG.md)
5
+ [![Version](https://img.shields.io/badge/version-1.6.12-blue)](CHANGELOG.md)
6
6
  [![npm](https://img.shields.io/npm/v/godpowers.svg)](https://www.npmjs.com/package/godpowers)
7
7
 
8
8
  **Ship fast. Ship right. Ship everything. Ship accountably.**
@@ -12,10 +12,10 @@ idea to hardened production. It runs as **slash commands inside your AI coding
12
12
  tool** (Claude Code, Codex, Cursor, etc.) that orchestrate **specialist agents**
13
13
  in fresh contexts to do the work.
14
14
 
15
- Version 1.6.11 keeps the stable Godpowers surface while making automatic work
16
- more visible and portable: syncs, proactive checks, and specialist spawning now
17
- report what ran, what changed, and which host-platform agent mechanism is being
18
- used.
15
+ Version 1.6.12 adds an executable dashboard engine and CLI status surface:
16
+ `godpowers status --project .` and `godpowers next --project .` now compute the
17
+ same disk-derived progress, planning visibility, proactive checks, and next
18
+ action used by `/god-status`, `/god-next`, and God Mode closeouts.
19
19
 
20
20
  It fuses four disciplines into one unified workflow:
21
21
 
@@ -109,6 +109,16 @@ This reads `.godpowers/PROGRESS.md`, scans disk, reconciles any drift, and
109
109
  suggests the next logical command. The SessionStart hook does the same thing
110
110
  when you open a new session in a Godpowers project.
111
111
 
112
+ The same status engine is available from the installer CLI for humans, CI,
113
+ Codex, Claude, Cursor, Gemini, OpenCode, Windsurf, Antigravity, and any host
114
+ runtime that can execute Node:
115
+
116
+ ```bash
117
+ npx godpowers status --project=.
118
+ npx godpowers next --project=.
119
+ npx godpowers status --project=. --json
120
+ ```
121
+
112
122
  ### Slash Commands
113
123
 
114
124
  | Command | What it does | Spawns agent |
@@ -179,6 +189,14 @@ Under `--yolo`, Godpowers also auto-applies Pillars sync proposals when
179
189
  durable `.godpowers` artifacts change project truth. The decision is logged to
180
190
  `.godpowers/YOLO-DECISIONS.md`.
181
191
 
192
+ Every completing command now ends with a **Godpowers Dashboard**. It shows the
193
+ current phase, tier, step count, percent complete, PRD and roadmap visibility,
194
+ recent work, proactive checks, open items, and the single recommended next
195
+ action. `/god-status` and `/god-next` use the same shape so the project never
196
+ ends in a vague "done" state. The dashboard is backed by
197
+ `lib/dashboard.js`, so status and next-step commands share one executable
198
+ source of disk truth instead of parallel Markdown-only contracts.
199
+
182
200
  For existing codebases and org-constrained new projects, God Mode now runs a
183
201
  greenfield simulation audit and then actions it through a greenfieldification
184
202
  plan. It pauses before risky artifact rewrites because that process can change
package/RELEASE.md CHANGED
@@ -1,11 +1,10 @@
1
- # Godpowers 1.6.11 Release
1
+ # Godpowers 1.6.12 Release
2
2
 
3
3
  Date: 2026-05-16
4
4
 
5
- Godpowers 1.6.11 makes automatic work easier to trust across supported AI
6
- coding tools. The release keeps the existing 106 slash commands, 39 specialist
7
- agents, 13 workflows, and 36 recipes, while clarifying when Godpowers spawned
8
- an agent, called a local runtime helper, or only suggested the next action.
5
+ Godpowers 1.6.12 turns progress visibility into executable product behavior.
6
+ The same dashboard logic now powers slash command closeouts, direct CLI status
7
+ checks, JSON status output, and next-action recommendations from disk state.
9
8
 
10
9
  ## What is stable
11
10
 
@@ -14,37 +13,30 @@ an agent, called a local runtime helper, or only suggested the next action.
14
13
  - 13 executable workflows
15
14
  - 36 intent recipes
16
15
  - 15-runtime installer
16
+ - 453 package files in the npm tarball
17
17
  - Codex installs with generated `god-*.toml` agent metadata files
18
18
  - Markdown specialist agent contracts at `<runtime>/agents/god-*.md`
19
- - Safe-sync routing before deploy, observe, harden, launch, or god-mode work
20
- - Critical harden finding gate before launch
19
+ - Shared runtime bundle at `<runtime>/godpowers-runtime`
21
20
  - Native Pillars project context through `AGENTS.md` and `agents/*.md`
22
21
  - `.godpowers/` workflow state and artifact layout
23
- - Core schemas: intent, state, events, workflow, routing, recipes, extension
24
- manifests
25
- - Extension pack compatibility range for the 1.x line
22
+ - Safe-sync routing before deploy, observe, harden, launch, or god-mode work
23
+ - Critical harden finding gate before launch
26
24
  - GSD-style proposition closeouts for exploratory, diagnostic, audit,
27
25
  lifecycle, status, reconciliation, and decision-support outputs
28
26
  - Plain-language project-run wording in user-facing reports
29
- - Planning visibility blocks for PRD, roadmap, milestone, and completion basis
30
27
 
31
28
  ## What is new
32
29
 
33
- - The master skill now defines a proactive auto-invoke policy with four levels:
34
- read-only suggestions, visible local helpers, bounded specialist agent spawns,
35
- and explicit-approval-only actions.
36
- - `/god-next`, `/god-status`, and God Mode closeouts now include proactive
37
- checks for checkpoint freshness, pending reviews, sync state, docs drift,
38
- runtime verification, security, dependencies, and hygiene.
39
- - `/god-sync`, `/god-scan`, `god-updater`, and `god-orchestrator` now distinguish
40
- spawned agents from local runtime helpers such as reverse-sync, Pillars sync,
41
- checkpoint sync, and context refresh.
42
- - Docs drift, runtime verification, and review queue workflows now document when
43
- they may be suggested or auto-invoked.
44
- - Spawning instructions now use platform-neutral host-agent language instead of
45
- Claude-specific "Task tool" wording.
46
- - The installer now replaces Codex skill directories before writing `SKILL.md`,
47
- which removes stale nested files from older Codex install shapes.
30
+ - Added `lib/dashboard.js`, a shared executable status engine.
31
+ - Added `godpowers status --project .`.
32
+ - Added `godpowers next --project .`.
33
+ - Added `--json` output for machine-readable status and next-step routing.
34
+ - Dashboard output now reports current phase, tier position, percentage,
35
+ planning visibility, proactive checks, open items, and recommended action.
36
+ - `/god-status`, `/god-next`, `/god-mode`, and `god-orchestrator` now reference
37
+ the same dashboard engine when local runtime execution is available.
38
+ - Tests now cover dashboard computation, rendering, CLI output, review queue
39
+ detection, and git porcelain parsing.
48
40
 
49
41
  ## Platform behavior
50
42
 
@@ -53,9 +45,11 @@ Trae, Cline, Kilo, Antigravity, Qwen, CodeBuddy, and Pi all receive the same
53
45
  portable Markdown agent contracts. Codex also receives `god-*.toml` files as
54
46
  its registry adapter.
55
47
 
56
- If a host platform cannot provide a true fresh-context agent spawn, Godpowers
57
- must say so visibly and report the work as local runtime only or simulated in
58
- current context. It must not imply that a detached background agent ran.
48
+ The dashboard engine ships in the installed runtime bundle so host tools can
49
+ use one shared implementation instead of parallel command-specific Markdown
50
+ contracts. If a host platform cannot provide a true fresh-context agent spawn,
51
+ Godpowers must say so visibly and report the work as local runtime only or
52
+ simulated in current context.
59
53
 
60
54
  ## Safety policy
61
55
 
@@ -76,14 +70,13 @@ Godpowers still must not auto-run these without explicit user intent:
76
70
 
77
71
  ## Validation
78
72
 
79
- Release validation should include:
73
+ Release validation includes:
80
74
 
81
- - `node scripts/validate-skills.js`
82
- - `bash scripts/smoke.sh`
83
- - `node scripts/test-agent-validator.js`
84
- - `node scripts/test-install-smoke.js`
75
+ - `node scripts/test-dashboard.js`
76
+ - `npm test`
77
+ - `npm run test:audit`
85
78
  - `node scripts/check-package-contents.js`
86
- - `npm run release:check`
79
+ - `git diff --check`
87
80
 
88
- The `v1.6.11` git tag should point to the release commit that matches the npm
89
- `godpowers@1.6.11` package.
81
+ The `v1.6.12` git tag points to the release commit that matches the npm
82
+ `godpowers@1.6.12` package.
package/SKILL.md CHANGED
@@ -112,12 +112,28 @@ that edits code or artifacts, do not stop at "complete" plus validation. End
112
112
  with a disk-derived closeout that tells the user the current state and what is
113
113
  next.
114
114
 
115
+ Every closeout must include a **Godpowers Dashboard**. This dashboard is the
116
+ same mental model across `/god-status`, `/god-next`, `/god-mode`, and every
117
+ command that completes, pauses, or proposes work.
118
+
119
+ When the runtime bundle is available, compute this with
120
+ `lib/dashboard.compute(projectRoot)` and render it with
121
+ `lib/dashboard.render(result)`. The executable dashboard engine is the shared
122
+ source for phase, tier, step, progress, PRD and roadmap visibility, proactive
123
+ checks, open items, and the next route. If the runtime module is unavailable,
124
+ fall back to a manual disk scan and say `Dashboard engine: unavailable, manual
125
+ scan used`.
126
+
115
127
  Use this shape:
116
128
 
117
129
  ```
130
+ Godpowers Dashboard
131
+
118
132
  Current status:
119
133
  State: <complete | partial | blocked | complete with deferred item>
120
- Progress: <pct>% (<done> of <total> steps complete; current step <n> of <total>) when available
134
+ Phase: <plain-language phase> (tier <human ordinal> of <human total>) when available
135
+ Step: <sub-step label> (<step n> of <total steps>) when available
136
+ Progress: <pct>% (<done> of <total> steps complete) when available
121
137
  Worktree: <clean | modified files unstaged | staged changes | mixed>
122
138
  Index: <untouched | staged files listed>
123
139
 
@@ -134,8 +150,18 @@ What changed:
134
150
  Validation:
135
151
  + <command>: <result>
136
152
 
153
+ Proactive checks:
154
+ Checkpoint: <fresh | refreshed | missing | stale | conflicts with state.json>
155
+ Reviews: <none | N pending, suggest /god-review-changes>
156
+ Sync: <fresh | missing | stale | local helper ran | suggest /god-sync>
157
+ Docs: <fresh | possible drift, suggest /god-docs>
158
+ Runtime: <not-applicable | known URL, suggest /god-test-runtime | no known URL, defer deployed verification>
159
+ Security: <clear | sensitive files changed, suggest /god-harden>
160
+ Dependencies: <clear | dependency files changed, suggest /god-update-deps>
161
+ Hygiene: <fresh | stale, suggest /god-hygiene>
162
+
137
163
  Open items:
138
- 1. <deferred staging, unstaged files, pending review, or none>
164
+ 1. <deferred staging, unstaged files, pending review, blocker, or none>
139
165
 
140
166
  Next:
141
167
  Recommended: <one concrete command or user decision>
@@ -149,6 +175,11 @@ pre-existing unrelated changes, say the index was left untouched and recommend
149
175
  a scoped review or staging command rather than implying the project is fully
150
176
  shipped.
151
177
 
178
+ When the command only recommends work, keep the same dashboard but set
179
+ `State: proposal` and end with the proposition block from Section 9. When the
180
+ command pauses, set `State: blocked` or `State: paused` and make `Next` the
181
+ one exact user decision needed to continue.
182
+
152
183
  ### 11. User-Facing Vocabulary
153
184
  Godpowers may use internal words such as "arc" in routing, recipes, and agent
154
185
  implementation notes. Do not require the user to decode that word in visible
@@ -158,7 +189,7 @@ Use these plain-language substitutions in user-facing responses:
158
189
  - Say "project run" or "workflow" instead of "arc".
159
190
  - Say "phase" or "current step" instead of "tier" unless the user has asked
160
191
  for tier details. If tier detail helps, say both, for example
161
- "Planning, Tier 1".
192
+ "Planning phase, tier 2 of 4".
162
193
  - Say "current milestone" or "roadmap step" when ROADMAP.md has a matching
163
194
  milestone.
164
195
  - If you must use "arc", define it once as "the end-to-end project workflow"
@@ -676,12 +676,16 @@ across all 14 categories.
676
676
 
677
677
  After Launch completes, write a transition message:
678
678
 
679
- ```
679
+ ```text
680
680
  Godpowers project run complete.
681
681
 
682
+ Godpowers Dashboard
683
+
682
684
  Current status:
683
685
  State: complete
684
- Progress: <pct>% (<done> of <total> steps complete; current step <n> of <total>)
686
+ Phase: <plain-language phase> (tier <human ordinal> of <human total>)
687
+ Step: <sub-step label> (step <n> of <total steps>)
688
+ Progress: <pct>% (<done> of <total> steps complete)
685
689
  Worktree: <clean | modified files unstaged | staged changes | mixed>
686
690
  Index: <untouched | staged files listed>
687
691
 
@@ -737,6 +741,11 @@ Proposition:
737
741
  4. Run deployed staging: provide STAGING_APP_URL=<deployed staging origin> when needed
738
742
  ```
739
743
 
744
+ Generate the dashboard with `lib/dashboard.compute(projectRoot)` and
745
+ `lib/dashboard.render(result)` when the runtime bundle is available. If the
746
+ runtime module cannot be loaded, fall back to a manual disk scan and say
747
+ `Dashboard engine: unavailable, manual scan used`.
748
+
740
749
  Update PROGRESS.md status to `steady-state-active`.
741
750
 
742
751
  For focused brownfield, hotfix, refactor, or build workflows that finish without a
@@ -860,7 +869,8 @@ Show:
860
869
  - commands being run and whether they passed or failed
861
870
  - scoped file changes
862
871
  - final validation summary
863
- - final current status from disk, including progress, lifecycle, open items,
872
+ - final Godpowers Dashboard from disk, including phase, tier, step, progress,
873
+ lifecycle, planning visibility, proactive checks, open items,
864
874
  worktree/index state, and recommended next action
865
875
  - plain-language workflow names. Say "project run" or "workflow" instead of
866
876
  unexplained "arc" in visible output
@@ -918,11 +928,11 @@ one compact card.
918
928
 
919
929
  Before starting a tier/sub-step:
920
930
 
921
- ```
931
+ ```text
922
932
  Next step
923
- Progress: <pct>% (<done> of <total> steps complete; current step <n> of <total>)
924
- Tier: <tier-number> <tier-label>
933
+ Phase: <plain-language phase> (tier <human ordinal> of <human total>)
925
934
  Step: <sub-step-label>
935
+ Progress: <pct>% (<done> of <total> steps complete; step <n> of <total>)
926
936
  Why this now: <one sentence tied to disk state or the prior gate>
927
937
  What will happen:
928
938
  1. <first observable action>
@@ -933,11 +943,11 @@ Expected output: <artifact path or verification result>
933
943
 
934
944
  After a tier/sub-step completes or pauses:
935
945
 
936
- ```
946
+ ```text
937
947
  Step result
938
- Progress: <pct>% (<done> of <total> steps complete; current step <n> of <total>)
939
- Tier: <tier-number> <tier-label>
948
+ Phase: <plain-language phase> (tier <human ordinal> of <human total>)
940
949
  Step: <sub-step-label>
950
+ Progress: <pct>% (<done> of <total> steps complete; step <n> of <total>)
941
951
  Result: <done | blocked | failed | skipped | imported>
942
952
  What happened:
943
953
  1. <observable action completed>
package/bin/install.js CHANGED
@@ -300,6 +300,9 @@ function removeSkillEntry(skillsDir, entry) {
300
300
  function parseArgs(argv) {
301
301
  const args = argv.slice(2);
302
302
  const opts = {
303
+ command: null,
304
+ project: process.cwd(),
305
+ json: false,
303
306
  runtimes: [],
304
307
  global: false,
305
308
  local: false,
@@ -308,8 +311,22 @@ function parseArgs(argv) {
308
311
  uninstall: false,
309
312
  };
310
313
 
311
- for (const arg of args) {
314
+ for (let i = 0; i < args.length; i++) {
315
+ const arg = args[i];
312
316
  switch (arg) {
317
+ case 'status':
318
+ case 'next':
319
+ opts.command = arg;
320
+ break;
321
+ case '--json':
322
+ opts.json = true;
323
+ break;
324
+ case '--project':
325
+ if (args[i + 1]) {
326
+ opts.project = path.resolve(args[i + 1]);
327
+ i++;
328
+ }
329
+ break;
313
330
  case '-g':
314
331
  case '--global':
315
332
  opts.global = true;
@@ -330,7 +347,9 @@ function parseArgs(argv) {
330
347
  opts.uninstall = true;
331
348
  break;
332
349
  default:
333
- if (arg.startsWith('--') && RUNTIMES[arg.slice(2)]) {
350
+ if (arg.startsWith('--project=')) {
351
+ opts.project = path.resolve(arg.slice('--project='.length));
352
+ } else if (arg.startsWith('--') && RUNTIMES[arg.slice(2)]) {
334
353
  opts.runtimes.push(arg.slice(2));
335
354
  }
336
355
  break;
@@ -548,8 +567,14 @@ function uninstallForRuntime(runtimeKey, opts = {}) {
548
567
 
549
568
  function showHelp() {
550
569
  console.log(BANNER);
551
- log('Usage: npx godpowers [options]\n');
570
+ log('Usage: npx godpowers [command] [options]\n');
571
+ log('Commands:');
572
+ log(' status Show the Godpowers Dashboard for a project');
573
+ log(' next Show the dashboard and recommended next command');
574
+ log('');
552
575
  log('Options:');
576
+ log(' --project=<path> Project root for status or next (default: cwd)');
577
+ log(' --json Emit JSON for status or next');
553
578
  log(' -g, --global Install globally (to config directory)');
554
579
  log(' -l, --local Install locally (to current directory)');
555
580
  log(' --claude Install for Claude Code');
@@ -572,11 +597,28 @@ function showHelp() {
572
597
  log(' -h, --help Show this help message');
573
598
  log('');
574
599
  log('Examples:');
600
+ log(' npx godpowers status --project=.');
601
+ log(' npx godpowers next --project=.');
575
602
  log(' npx godpowers --claude --global');
576
603
  log(' npx godpowers --all');
577
604
  log(' npx godpowers --codex --cursor');
578
605
  }
579
606
 
607
+ function runDashboardCommand(opts) {
608
+ const dashboard = require('../lib/dashboard');
609
+ const result = dashboard.compute(opts.project);
610
+ if (opts.json) {
611
+ console.log(JSON.stringify(result, null, 2));
612
+ } else {
613
+ console.log(dashboard.render(result));
614
+ if (opts.command === 'next') {
615
+ console.log('');
616
+ console.log('Suggested next command:');
617
+ console.log(` ${result.next && result.next.command ? result.next.command : 'describe the next intent'}`);
618
+ }
619
+ }
620
+ }
621
+
580
622
  // ---------------------------------------------------------------------------
581
623
  // Main
582
624
  // ---------------------------------------------------------------------------
@@ -589,6 +631,11 @@ function main() {
589
631
  process.exit(0);
590
632
  }
591
633
 
634
+ if (opts.command === 'status' || opts.command === 'next') {
635
+ runDashboardCommand(opts);
636
+ return;
637
+ }
638
+
592
639
  console.log(BANNER);
593
640
 
594
641
  const srcDir = path.resolve(__dirname, '..');
@@ -0,0 +1,296 @@
1
+ /**
2
+ * Godpowers Dashboard
3
+ *
4
+ * Shared executable status engine for /god-status, /god-next, /god-sync,
5
+ * /god-scan, and /god-mode closeouts. Disk state is authoritative.
6
+ */
7
+
8
+ const fs = require('fs');
9
+ const path = require('path');
10
+ const cp = require('child_process');
11
+
12
+ const state = require('./state');
13
+ const router = require('./router');
14
+
15
+ const GOD_DIR = '.godpowers';
16
+ const PRD_PATH = '.godpowers/prd/PRD.md';
17
+ const ROADMAP_PATH = '.godpowers/roadmap/ROADMAP.md';
18
+ const CHECKPOINT_PATH = '.godpowers/CHECKPOINT.md';
19
+ const SYNC_LOG_PATH = '.godpowers/SYNC-LOG.md';
20
+ const REVIEW_PATH = '.godpowers/REVIEW-REQUIRED.md';
21
+
22
+ function exists(projectRoot, relPath) {
23
+ return fs.existsSync(path.join(projectRoot, relPath));
24
+ }
25
+
26
+ function readText(projectRoot, relPath) {
27
+ const file = path.join(projectRoot, relPath);
28
+ if (!fs.existsSync(file)) return '';
29
+ return fs.readFileSync(file, 'utf8');
30
+ }
31
+
32
+ function mtimeMs(projectRoot, relPath) {
33
+ const file = path.join(projectRoot, relPath);
34
+ if (!fs.existsSync(file)) return null;
35
+ return fs.statSync(file).mtimeMs;
36
+ }
37
+
38
+ function artifactStatus(projectRoot, relPath) {
39
+ return exists(projectRoot, relPath) ? 'done' : 'missing';
40
+ }
41
+
42
+ function currentPhase(progress) {
43
+ const current = progress && progress.current;
44
+ if (!current) {
45
+ return {
46
+ phase: 'Complete',
47
+ tierKey: null,
48
+ tierNumber: null,
49
+ tierTotal: 0,
50
+ tierOrdinal: 0,
51
+ tierCount: 0,
52
+ tierLabel: 'Complete',
53
+ stepLabel: 'Complete',
54
+ stepNumber: 0,
55
+ totalSteps: progress ? progress.total : 0
56
+ };
57
+ }
58
+
59
+ const tierNumbers = (progress.tiers || [])
60
+ .map(tier => tier.tierNumber)
61
+ .filter(n => Number.isFinite(n))
62
+ .sort((a, b) => a - b);
63
+ const tierTotal = tierNumbers.length > 0 ? Math.max(...tierNumbers) : current.tierNumber;
64
+ const tierOrdinal = tierNumbers.indexOf(current.tierNumber) + 1;
65
+ const tierCount = tierNumbers.length || (Number.isFinite(current.tierNumber) ? current.tierNumber + 1 : 0);
66
+
67
+ return {
68
+ phase: current.tierLabel,
69
+ tierKey: current.tierKey,
70
+ tierNumber: current.tierNumber,
71
+ tierTotal,
72
+ tierOrdinal: tierOrdinal > 0 ? tierOrdinal : 1,
73
+ tierCount,
74
+ tierLabel: current.tierLabel,
75
+ stepLabel: current.subStepLabel,
76
+ stepNumber: current.ordinal,
77
+ totalSteps: progress.total
78
+ };
79
+ }
80
+
81
+ function worktree(projectRoot) {
82
+ try {
83
+ const out = cp.execFileSync('git', ['status', '--porcelain'], {
84
+ cwd: projectRoot,
85
+ encoding: 'utf8',
86
+ stdio: ['ignore', 'pipe', 'ignore']
87
+ });
88
+ return parseGitStatus(out);
89
+ } catch (e) {
90
+ return { worktree: 'unknown', index: 'unknown', entries: [] };
91
+ }
92
+ }
93
+
94
+ function parseGitStatus(out) {
95
+ if (!out || !out.trim()) {
96
+ return { worktree: 'clean', index: 'untouched', entries: [] };
97
+ }
98
+ const entries = out.split(/\r?\n/).filter(Boolean);
99
+ const staged = entries.filter(line => line[0] !== ' ' && line[0] !== '?');
100
+ const unstaged = entries.filter(line => line[1] !== ' ' || line.startsWith('??'));
101
+ let worktreeState = 'modified files unstaged';
102
+ if (staged.length > 0 && unstaged.length > 0) worktreeState = 'mixed';
103
+ else if (staged.length > 0) worktreeState = 'staged changes';
104
+ return {
105
+ worktree: worktreeState,
106
+ index: staged.length > 0 ? staged.map(statusPath).join(', ') : 'untouched',
107
+ entries
108
+ };
109
+ }
110
+
111
+ function statusPath(line) {
112
+ if (line.startsWith('?? ')) return line.slice(3);
113
+ return line.length > 3 ? line.slice(3) : line.trim();
114
+ }
115
+
116
+ function reviewCount(projectRoot) {
117
+ const text = readText(projectRoot, REVIEW_PATH);
118
+ if (!text.trim()) return 0;
119
+ const unchecked = (text.match(/\[\s\]\s*(?:TODO|PENDING|OPEN|REVIEW|BLOCKER|[Pp][0-3])/g) || []).length;
120
+ if (unchecked > 0) return unchecked;
121
+ const headings = (text.match(/^###\s+/gm) || []).length;
122
+ return headings;
123
+ }
124
+
125
+ function hasRecentPath(projectRoot, relPath, maxAgeMs) {
126
+ const modified = mtimeMs(projectRoot, relPath);
127
+ if (!modified) return false;
128
+ return Date.now() - modified <= maxAgeMs;
129
+ }
130
+
131
+ function proactiveChecks(projectRoot, changedFiles = []) {
132
+ const oneDay = 24 * 60 * 60 * 1000;
133
+ const thirtyDays = 30 * oneDay;
134
+ const reviews = reviewCount(projectRoot);
135
+
136
+ const checkpoint = exists(projectRoot, CHECKPOINT_PATH)
137
+ ? (hasRecentPath(projectRoot, CHECKPOINT_PATH, oneDay) ? 'fresh' : 'stale')
138
+ : 'missing';
139
+
140
+ const sync = exists(projectRoot, SYNC_LOG_PATH)
141
+ ? (hasRecentPath(projectRoot, SYNC_LOG_PATH, oneDay) ? 'fresh' : 'stale, suggest /god-sync')
142
+ : 'missing, suggest /god-sync';
143
+
144
+ const hygieneFresh = exists(projectRoot, CHECKPOINT_PATH)
145
+ && hasRecentPath(projectRoot, CHECKPOINT_PATH, thirtyDays);
146
+
147
+ const pkgChanged = changedFiles.some(file => [
148
+ 'package.json',
149
+ 'package-lock.json',
150
+ 'pnpm-lock.yaml',
151
+ 'yarn.lock'
152
+ ].includes(file));
153
+ const sensitiveChanged = changedFiles.some(file => matchesAnyPrefix(file, [
154
+ '.env.example',
155
+ 'SECURITY.md',
156
+ '.github/workflows',
157
+ 'auth',
158
+ 'security'
159
+ ]));
160
+
161
+ return {
162
+ checkpoint,
163
+ reviews: reviews > 0 ? `${reviews} pending, suggest /god-review-changes` : 'none',
164
+ sync,
165
+ docs: 'fresh',
166
+ runtime: 'not-applicable',
167
+ security: sensitiveChanged ? 'sensitive files changed, suggest /god-harden' : 'clear',
168
+ dependencies: pkgChanged ? 'dependency files changed, suggest /god-update-deps' : 'clear',
169
+ hygiene: hygieneFresh ? 'fresh' : 'stale, suggest /god-hygiene'
170
+ };
171
+ }
172
+
173
+ function matchesAnyPrefix(file, prefixes) {
174
+ return prefixes.some(prefix => file === prefix || file.startsWith(`${prefix}/`));
175
+ }
176
+
177
+ function planningVisibility(projectRoot, progress) {
178
+ const prd = artifactStatus(projectRoot, PRD_PATH);
179
+ const roadmap = artifactStatus(projectRoot, ROADMAP_PATH);
180
+ const phase = currentPhase(progress);
181
+ return {
182
+ prd: { status: prd, path: prd === 'done' ? PRD_PATH : null },
183
+ roadmap: { status: roadmap, path: roadmap === 'done' ? ROADMAP_PATH : null },
184
+ currentMilestone: phase.stepLabel ? `${phase.phase} / ${phase.stepLabel}` : phase.phase,
185
+ completion: `${progress.percent}% based on state.json tracked steps`
186
+ };
187
+ }
188
+
189
+ function compute(projectRoot, opts = {}) {
190
+ const s = state.read(projectRoot);
191
+ const git = opts.git === false ? { worktree: 'not-checked', index: 'not-checked', entries: [] } : worktree(projectRoot);
192
+
193
+ if (!s) {
194
+ const next = { command: '/god-init', reason: 'No Godpowers project initialized' };
195
+ return {
196
+ state: 'not initialized',
197
+ mode: null,
198
+ lifecycle: 'pre-init',
199
+ progress: { percent: 0, completed: 0, total: 0, currentStep: 0, current: null, tiers: [] },
200
+ current: currentPhase(null),
201
+ worktree: git.worktree,
202
+ index: git.index,
203
+ planning: {
204
+ prd: { status: 'missing', path: null },
205
+ roadmap: { status: 'missing', path: null },
206
+ currentMilestone: 'Project initialization',
207
+ completion: '0% based on missing state.json'
208
+ },
209
+ proactive: proactiveChecks(projectRoot, git.entries.map(statusPath)),
210
+ next,
211
+ openItems: ['No .godpowers/state.json found']
212
+ };
213
+ }
214
+
215
+ const progress = state.progressSummary(s);
216
+ const current = currentPhase(progress);
217
+ const next = router.suggestNext(projectRoot);
218
+ const openItems = [];
219
+ const drift = state.detectDrift(projectRoot);
220
+
221
+ if (drift.length > 0) openItems.push(`${drift.length} artifact drift item(s), suggest /god-repair`);
222
+ if (next && next.blocker) openItems.push(`${next.blocker} blocks next route`);
223
+ if (reviewCount(projectRoot) > 0) openItems.push('pending review items');
224
+ if (openItems.length === 0) openItems.push('none');
225
+
226
+ return {
227
+ state: progress.remaining === 0 ? 'complete' : 'in progress',
228
+ mode: s.mode || s['mode-announced-as'] || null,
229
+ lifecycle: s['lifecycle-phase'] || 'in-arc',
230
+ progress,
231
+ current,
232
+ worktree: git.worktree,
233
+ index: git.index,
234
+ planning: planningVisibility(projectRoot, progress),
235
+ proactive: proactiveChecks(projectRoot, git.entries.map(statusPath)),
236
+ next,
237
+ openItems
238
+ };
239
+ }
240
+
241
+ function render(dashboard) {
242
+ const current = dashboard.current || {};
243
+ const planning = dashboard.planning || {};
244
+ const proactive = dashboard.proactive || {};
245
+ const next = dashboard.next || {};
246
+ const progress = dashboard.progress || {};
247
+ const prd = planning.prd || {};
248
+ const roadmap = planning.roadmap || {};
249
+ const openItems = dashboard.openItems && dashboard.openItems.length > 0
250
+ ? dashboard.openItems
251
+ : ['none'];
252
+
253
+ return [
254
+ 'Godpowers Dashboard',
255
+ '',
256
+ 'Current status:',
257
+ ` State: ${dashboard.state}`,
258
+ ` Phase: ${current.phase || 'unknown'}${current.tierNumber !== null && current.tierNumber !== undefined ? ` (tier ${current.tierOrdinal} of ${current.tierCount}, internal ${current.tierKey || `tier-${current.tierNumber}`})` : ''}`,
259
+ ` Step: ${current.stepLabel || 'unknown'}${current.stepNumber ? ` (step ${current.stepNumber} of ${current.totalSteps})` : ''}`,
260
+ ` Progress: ${progress.percent || 0}% (${progress.completed || 0} of ${progress.total || 0} steps complete)`,
261
+ ` Worktree: ${dashboard.worktree}`,
262
+ ` Index: ${dashboard.index}`,
263
+ '',
264
+ 'Planning visibility:',
265
+ ` PRD: ${prd.status || 'missing'}${prd.path ? ` ${prd.path}` : ''}`,
266
+ ` Roadmap: ${roadmap.status || 'missing'}${roadmap.path ? ` ${roadmap.path}` : ''}`,
267
+ ` Current milestone: ${planning.currentMilestone || 'unknown'}`,
268
+ ` Completion: ${planning.completion || 'unknown'}`,
269
+ '',
270
+ 'Proactive checks:',
271
+ ` Checkpoint: ${proactive.checkpoint || 'unknown'}`,
272
+ ` Reviews: ${proactive.reviews || 'unknown'}`,
273
+ ` Sync: ${proactive.sync || 'unknown'}`,
274
+ ` Docs: ${proactive.docs || 'unknown'}`,
275
+ ` Runtime: ${proactive.runtime || 'unknown'}`,
276
+ ` Security: ${proactive.security || 'unknown'}`,
277
+ ` Dependencies: ${proactive.dependencies || 'unknown'}`,
278
+ ` Hygiene: ${proactive.hygiene || 'unknown'}`,
279
+ '',
280
+ 'Open items:',
281
+ ...openItems.map((item, index) => ` ${index + 1}. ${item}`),
282
+ '',
283
+ 'Next:',
284
+ ` Recommended: ${next.command || 'describe the next intent'}`,
285
+ ` Why: ${next.reason || 'No route was computed.'}`
286
+ ].join('\n');
287
+ }
288
+
289
+ module.exports = {
290
+ compute,
291
+ render,
292
+ worktree,
293
+ parseGitStatus,
294
+ proactiveChecks,
295
+ planningVisibility
296
+ };
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "godpowers",
3
- "version": "1.6.11",
3
+ "version": "1.6.12",
4
4
  "description": "AI-powered development system: 106 slash commands and 39 specialist agents that take a project from raw idea to hardened production. Runs inside Claude Code, Codex, Cursor, Windsurf, Gemini, and 10+ other AI coding tools.",
5
5
  "bin": {
6
6
  "godpowers": "./bin/install.js"
7
7
  },
8
8
  "scripts": {
9
- "test": "node scripts/validate-skills.js && node scripts/test-doc-surface-counts.js && bash scripts/smoke.sh && node scripts/test-runtime.js && node scripts/test-router.js && node scripts/test-recipes.js && node scripts/test-context-writer.js && node scripts/test-pillars.js && node scripts/test-artifact-linter.js && node scripts/test-artifact-diff.js && node scripts/test-design-foundation.js && node scripts/test-linkage.js && node scripts/test-impact.js && node scripts/test-reverse-sync.js && node scripts/test-integration.js && node scripts/test-cross-artifact.js && node scripts/test-awesome-design.js && node scripts/test-skillui-bridge.js && node scripts/test-runtime-verification.js && node scripts/test-agent-browser.js && node scripts/test-mode-d.js && node scripts/test-runtime-heuristics.js && node scripts/test-agent-validator.js && node scripts/test-story-validator.js && node scripts/test-state.js && node scripts/test-intent.js && node scripts/test-events.js && node scripts/test-golden-artifacts.js && node scripts/test-install-smoke.js && node scripts/test-checkpoint.js && node scripts/test-extensions.js && node scripts/test-event-reader.js && node scripts/test-state-lock.js && node scripts/test-cost-saver.js && node scripts/test-budget-onoff.js && node scripts/test-workflow-runner.js && npm run test:e2e && node scripts/test-otel-exporter.js && node scripts/test-extensions-publish.js",
9
+ "test": "node scripts/validate-skills.js && node scripts/test-doc-surface-counts.js && bash scripts/smoke.sh && node scripts/test-runtime.js && node scripts/test-router.js && node scripts/test-recipes.js && node scripts/test-context-writer.js && node scripts/test-pillars.js && node scripts/test-artifact-linter.js && node scripts/test-artifact-diff.js && node scripts/test-design-foundation.js && node scripts/test-linkage.js && node scripts/test-impact.js && node scripts/test-reverse-sync.js && node scripts/test-integration.js && node scripts/test-cross-artifact.js && node scripts/test-awesome-design.js && node scripts/test-skillui-bridge.js && node scripts/test-runtime-verification.js && node scripts/test-agent-browser.js && node scripts/test-mode-d.js && node scripts/test-runtime-heuristics.js && node scripts/test-agent-validator.js && node scripts/test-story-validator.js && node scripts/test-state.js && node scripts/test-dashboard.js && node scripts/test-intent.js && node scripts/test-events.js && node scripts/test-golden-artifacts.js && node scripts/test-install-smoke.js && node scripts/test-checkpoint.js && node scripts/test-extensions.js && node scripts/test-event-reader.js && node scripts/test-state-lock.js && node scripts/test-cost-saver.js && node scripts/test-budget-onoff.js && node scripts/test-workflow-runner.js && npm run test:e2e && node scripts/test-otel-exporter.js && node scripts/test-extensions-publish.js",
10
10
  "prepublishOnly": "npm test",
11
11
  "validate-skills": "node scripts/validate-skills.js",
12
12
  "test:surface": "node scripts/test-doc-surface-counts.js",
@@ -178,8 +178,9 @@ Show:
178
178
  - short progress updates for phases, commands, validations, and file edits
179
179
  - concise validation summaries instead of full command noise when possible
180
180
  - final changed paths, validation results, and completion or pause status
181
- - final current status, open items, worktree/index state, and recommended next
182
- action
181
+ - final Godpowers Dashboard from disk, including phase, tier, step, progress,
182
+ planning visibility, proactive checks, open items, worktree/index state, and
183
+ recommended next action
183
184
 
184
185
  Hide:
185
186
  - raw spawn input
@@ -202,11 +203,11 @@ missing them, synthesize them from disk state before continuing.
202
203
 
203
204
  Before work starts:
204
205
 
205
- ```
206
+ ```text
206
207
  Next step
207
- Progress: <pct>% (<done> of <total> steps complete; current step <n> of <total>)
208
- Tier: <tier-number> <tier-label>
208
+ Phase: <plain-language phase> (tier <human ordinal> of <human total>)
209
209
  Step: <sub-step-label>
210
+ Progress: <pct>% (<done> of <total> steps complete; step <n> of <total>)
210
211
  Why this now: <one sentence>
211
212
  What will happen:
212
213
  1. <observable action>
@@ -216,11 +217,11 @@ Expected output: <artifact path or verification result>
216
217
 
217
218
  After work completes or pauses:
218
219
 
219
- ```
220
+ ```text
220
221
  Step result
221
- Progress: <pct>% (<done> of <total> steps complete; current step <n> of <total>)
222
- Tier: <tier-number> <tier-label>
222
+ Phase: <plain-language phase> (tier <human ordinal> of <human total>)
223
223
  Step: <sub-step-label>
224
+ Progress: <pct>% (<done> of <total> steps complete; step <n> of <total>)
224
225
  Result: <done | blocked | failed | skipped | imported>
225
226
  What happened:
226
227
  1. <observable action completed>
@@ -22,6 +22,9 @@ Before reading routing data or calling runtime modules, resolve the Godpowers ru
22
22
  1. If `<projectRoot>/lib/router.js` exists, use the repository checkout runtime at `<projectRoot>`.
23
23
  2. Otherwise use the installed bundle at `<tool-config-dir>/godpowers-runtime`, where `<tool-config-dir>` is the directory that contains this installed skill, such as `~/.claude`, `~/.codex`, `~/.cursor`, `~/.windsurf`, or `~/.gemini`.
24
24
  3. Read routing definitions from `<runtimeRoot>/routing/*.yaml` and recipes from `<runtimeRoot>/routing/recipes/*.yaml`.
25
+ 4. For status output, load `<runtimeRoot>/lib/dashboard.js` and call
26
+ `dashboard.compute(projectRoot)`. Use `dashboard.render(result)` for the
27
+ shared dashboard section before adding route-specific detail.
25
28
 
26
29
  ## Three modes of invocation
27
30
 
@@ -333,11 +336,31 @@ recommending archaeology, reconstruction, project-run readiness, pillars, or ref
333
336
 
334
337
  ## Output Format
335
338
 
336
- ```
339
+ `/god-next` must emit the same Godpowers Dashboard shape used by
340
+ `/god-status`, then add routing detail and the proposition block.
341
+ Prefer the executable `lib/dashboard.js` output over manually recomputing the
342
+ same fields. If the module is unavailable, say
343
+ `Dashboard engine: unavailable, manual scan used`.
344
+
345
+ ```text
337
346
  Godpowers Next
338
347
 
339
- Current state: [where we are]
340
- Progress: [pct]% ([done] of [total] steps complete; current step [n] of [total])
348
+ Godpowers Dashboard
349
+
350
+ Current status:
351
+ State: proposal
352
+ Phase: [plain-language phase] (tier [human ordinal] of [human total])
353
+ Step: [current step label] (step [n] of [total steps])
354
+ Progress: [pct]% ([done] of [total] steps complete)
355
+ Worktree: [clean | modified files unstaged | staged changes | mixed]
356
+ Index: [untouched | staged files listed]
357
+
358
+ Planning visibility:
359
+ PRD: [done | pending | missing | deferred] [path when present]
360
+ Roadmap: [done | pending | missing | deferred] [path when present]
361
+ Current milestone: [roadmap milestone, phase, tier, or next planning gate]
362
+ Completion: [pct]% [basis from state.json, PROGRESS.md, or artifacts]
363
+
341
364
  Suggested next: [/god-X]
342
365
 
343
366
  Why: [one-line reason]
@@ -359,14 +382,21 @@ Previous tier had standards failures. Address before proceeding:
359
382
  Suggested: /god-redo [tier] OR /god-skip [tier] --reason="..."
360
383
 
361
384
  Proactive checks:
362
- Checkpoint: [fresh | refreshed | stale]
363
- Reviews: [none | N pending]
364
- Sync: [fresh | suggested | local helper ran]
365
- Docs: [fresh | suggested]
366
- Runtime: [not-applicable | suggested | ran]
367
- Security: [clear | suggested]
368
- Dependencies: [clear | suggested]
369
- Hygiene: [fresh | suggested]
385
+ Checkpoint: [fresh | refreshed | missing | stale]
386
+ Reviews: [none | N pending, suggest /god-review-changes]
387
+ Sync: [fresh | missing | stale | local helper ran | suggest /god-sync]
388
+ Docs: [fresh | possible drift, suggest /god-docs]
389
+ Runtime: [not-applicable | known URL, suggest /god-test-runtime | no known URL, defer deployed verification]
390
+ Security: [clear | sensitive files changed, suggest /god-harden]
391
+ Dependencies: [clear | dependency files changed, suggest /god-update-deps]
392
+ Hygiene: [fresh | stale, suggest /god-hygiene]
393
+
394
+ Open items:
395
+ 1. [missing prerequisite, blocker, pending review, or none]
396
+
397
+ Next:
398
+ Recommended: [/god-X or exact user decision]
399
+ Why: [one sentence tied to disk state]
370
400
  ```
371
401
 
372
402
  ## Proposition Closeout
@@ -15,8 +15,12 @@ Re-derive state from disk. Your memory is not authoritative. The file system is.
15
15
 
16
16
  1. Check if `.godpowers/PROGRESS.md` exists
17
17
  - If not: "No Godpowers project found. Run `god init` to start."
18
- 2. Read PROGRESS.md for recorded state
19
- 3. Scan ALL artifact paths on disk:
18
+ 2. Resolve the runtime root and load `<runtimeRoot>/lib/dashboard.js`.
19
+ 3. Call `dashboard.compute(projectRoot)` and use the returned object as the
20
+ primary dashboard source.
21
+ 4. Read PROGRESS.md for recorded state when state.json is missing or when you
22
+ need to explain legacy progress.
23
+ 5. Scan ALL artifact paths on disk:
20
24
  - `.godpowers/prd/PRD.md`
21
25
  - `.godpowers/arch/ARCH.md`
22
26
  - `.godpowers/roadmap/ROADMAP.md`
@@ -29,12 +33,13 @@ Re-derive state from disk. Your memory is not authoritative. The file system is.
29
33
  - `.godpowers/harden/FINDINGS.md`
30
34
  - `.godpowers/SYNC-LOG.md`
31
35
  - `.godpowers/CHECKPOINT.md`
32
- 4. For each artifact found: run a lightweight have-nots check
33
- 5. Compare disk state to PROGRESS.md state:
36
+ 6. For each artifact found: run a lightweight have-nots check
37
+ 7. Compare disk state to PROGRESS.md state:
34
38
  - If PROGRESS.md says "done" but artifact is missing: FLAG as phantom resume
35
39
  - If artifact exists but PROGRESS.md says "pending": FLAG as untracked work
36
- 6. Report:
40
+ 8. Report the Godpowers Dashboard from `dashboard.render(result)`:
37
41
  - Current mode and scale
42
+ - Current phase, tier number, step label, and step number
38
43
  - Progress summary: percentage, completed step count, current step number
39
44
  - Planning visibility: PRD status, roadmap status, active milestone, and
40
45
  completion basis
@@ -45,17 +50,26 @@ Re-derive state from disk. Your memory is not authoritative. The file system is.
45
50
  - Per-tier status (with disk verification)
46
51
  - Any inconsistencies between PROGRESS.md and disk
47
52
  - Suggested next action
48
- 7. If inconsistencies found: offer to repair PROGRESS.md to match disk truth
53
+ 9. If inconsistencies found: offer to repair PROGRESS.md to match disk truth
54
+
55
+ If the runtime module is unavailable, fall back to the manual scan below and
56
+ say `Dashboard engine: unavailable, manual scan used`.
49
57
 
50
58
  ## Output Format
51
59
 
52
- ```
53
- Godpowers Status
60
+ ```text
61
+ Godpowers Dashboard
54
62
 
55
63
  Mode: A (greenfield) Scale: medium
56
64
  Started: 2026-05-09
57
- Progress: 15% (2 of 13 steps complete; current step 3 of 13)
58
- Current: Tier 1 Planning / Architecture
65
+
66
+ Current status:
67
+ State: in progress
68
+ Phase: Planning (tier 2 of 4, internal tier-1)
69
+ Step: Architecture (step 3 of 13)
70
+ Progress: 15% (2 of 13 steps complete)
71
+ Worktree: clean
72
+ Index: untouched
59
73
 
60
74
  Planning visibility:
61
75
  PRD: done .godpowers/prd/PRD.md
@@ -121,7 +135,12 @@ Suite (Mode D) status:
121
135
  This repo is a sibling of suite "my-products" (hub: ../hub)
122
136
  Run /god-suite-status to see all 3 repos and meta-linter findings.
123
137
 
124
- Next: god roadmap
138
+ Open items:
139
+ 1. Roadmap and stack are still pending
140
+
141
+ Next:
142
+ Recommended: /god-roadmap
143
+ Why: architecture is done and the roadmap is the next planning gate.
125
144
  ```
126
145
 
127
146
  ## Proposition Closeout