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 +31 -0
- package/README.md +23 -5
- package/RELEASE.md +30 -37
- package/SKILL.md +34 -3
- package/agents/god-orchestrator.md +19 -9
- package/bin/install.js +50 -3
- package/lib/dashboard.js +296 -0
- package/package.json +2 -2
- package/skills/god-mode.md +9 -8
- package/skills/god-next.md +41 -11
- package/skills/god-status.md +30 -11
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
|
[](https://github.com/aihxp/godpowers/actions/workflows/ci.yml)
|
|
4
4
|
[](LICENSE)
|
|
5
|
-
[](CHANGELOG.md)
|
|
6
6
|
[](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.
|
|
16
|
-
|
|
17
|
-
|
|
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.
|
|
1
|
+
# Godpowers 1.6.12 Release
|
|
2
2
|
|
|
3
3
|
Date: 2026-05-16
|
|
4
4
|
|
|
5
|
-
Godpowers 1.6.
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
-
|
|
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
|
-
-
|
|
24
|
-
|
|
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
|
-
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
- `/god-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
|
73
|
+
Release validation includes:
|
|
80
74
|
|
|
81
|
-
- `node scripts/
|
|
82
|
-
- `
|
|
83
|
-
- `
|
|
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
|
-
- `
|
|
79
|
+
- `git diff --check`
|
|
87
80
|
|
|
88
|
-
The `v1.6.
|
|
89
|
-
`godpowers@1.6.
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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('--')
|
|
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, '..');
|
package/lib/dashboard.js
ADDED
|
@@ -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.
|
|
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",
|
package/skills/god-mode.md
CHANGED
|
@@ -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
|
|
182
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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>
|
package/skills/god-next.md
CHANGED
|
@@ -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
|
-
|
|
340
|
-
|
|
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 |
|
|
365
|
-
Docs: [fresh |
|
|
366
|
-
Runtime: [not-applicable |
|
|
367
|
-
Security: [clear |
|
|
368
|
-
Dependencies: [clear |
|
|
369
|
-
Hygiene: [fresh |
|
|
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
|
package/skills/god-status.md
CHANGED
|
@@ -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.
|
|
19
|
-
3.
|
|
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
|
-
|
|
33
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
60
|
+
```text
|
|
61
|
+
Godpowers Dashboard
|
|
54
62
|
|
|
55
63
|
Mode: A (greenfield) Scale: medium
|
|
56
64
|
Started: 2026-05-09
|
|
57
|
-
|
|
58
|
-
Current:
|
|
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
|
-
|
|
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
|