godpowers 1.6.6 → 1.6.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +10 -0
- package/CHANGELOG.md +64 -0
- package/README.md +4 -6
- package/RELEASE.md +32 -30
- package/agents/god-deploy-engineer.md +11 -6
- package/agents/god-launch-strategist.md +6 -2
- package/agents/god-observability-engineer.md +5 -2
- package/agents/god-orchestrator.md +98 -26
- package/bin/install.js +22 -12
- package/lib/checkpoint.js +50 -13
- package/lib/state.js +144 -1
- package/package.json +2 -2
- package/skills/god-deploy.md +16 -12
- package/skills/god-launch.md +6 -3
- package/skills/god-locate.md +15 -2
- package/skills/god-mode.md +47 -10
- package/skills/god-next.md +17 -0
- package/skills/god-status.md +14 -0
- package/templates/PROGRESS.md +22 -0
package/AGENTS.md
CHANGED
|
@@ -35,3 +35,13 @@ projects from raw idea to hardened production.
|
|
|
35
35
|
- No emojis (use `+`, `-`, `x`, `!` for status indicators)
|
|
36
36
|
- Every sentence in generated artifacts must be labeled: DECISION, HYPOTHESIS, or OPEN QUESTION
|
|
37
37
|
- Every claim must fail the substitution test (swap in a competitor, sentence must break)
|
|
38
|
+
|
|
39
|
+
<!-- pillars:begin -->
|
|
40
|
+
## Godpowers Pillars Protocol
|
|
41
|
+
|
|
42
|
+
- [DECISION] Load `agents/context.md` and `agents/repo.md` before Godpowers commands make durable project decisions.
|
|
43
|
+
- [DECISION] Load additional `agents/*.md` pillar files only when their frontmatter matches the task.
|
|
44
|
+
- [DECISION] Treat `.godpowers/state.json`, `.godpowers/PROGRESS.md`, and `.godpowers/CHECKPOINT.md` as workflow state.
|
|
45
|
+
- [DECISION] Treat Pillars files as portable project context for any coding agent that opens this repository.
|
|
46
|
+
- [DECISION] Disk state wins over conversation memory when these sources disagree.
|
|
47
|
+
<!-- pillars:end -->
|
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,70 @@ 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.8] - 2026-05-16
|
|
9
|
+
|
|
10
|
+
Staging deferral patch. Keeps Godpowers moving through local and CI-verifiable
|
|
11
|
+
shipping work instead of pausing early for a deployed staging URL.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
- `god-orchestrator` now treats deployed staging verification as deferred by
|
|
15
|
+
default when no live target URL is evidenced and the user did not request
|
|
16
|
+
staging.
|
|
17
|
+
- `/god-mode`, `/god-deploy`, and `/god-launch` now ask for
|
|
18
|
+
`STAGING_APP_URL` only when the user explicitly requests staging, invokes
|
|
19
|
+
deployed verification, or reaches final project sign-off.
|
|
20
|
+
- Deploy, observe, and launch specialists now record missing deployed access in
|
|
21
|
+
`.godpowers/deploy/WAITING-FOR-EXTERNAL-ACCESS.md` while continuing through
|
|
22
|
+
local and CI-verifiable gates.
|
|
23
|
+
|
|
24
|
+
### Guardrails
|
|
25
|
+
- Godpowers still never invents staging or production domains from names,
|
|
26
|
+
brands, titles, or common TLDs.
|
|
27
|
+
- Provider keys, dashboards, DNS tokens, production secrets, and admin consoles
|
|
28
|
+
are requested only after a named scripted check proves that exact access is
|
|
29
|
+
needed.
|
|
30
|
+
- Final sign-off can still run deployed smoke immediately when the user
|
|
31
|
+
provides `STAGING_APP_URL=<deployed staging origin>`.
|
|
32
|
+
|
|
33
|
+
## [1.6.7] - 2026-05-16
|
|
34
|
+
|
|
35
|
+
Progress visibility patch. Makes Godpowers easier to follow while preserving
|
|
36
|
+
the stable 1.6 command surface.
|
|
37
|
+
|
|
38
|
+
### Added
|
|
39
|
+
- Added `lib/state.progressSummary`, `orderedSubSteps`, and
|
|
40
|
+
`renderProgressLine` so commands can report percentage complete, completed
|
|
41
|
+
step count, total step count, and current step number from state.json.
|
|
42
|
+
- Added checkpoint frontmatter fields for `progress-pct`,
|
|
43
|
+
`progress-complete`, `progress-total`, and `current-step`.
|
|
44
|
+
- Added `CHECKPOINT.md` sections for recent work and what happens next.
|
|
45
|
+
- Added a Step Narration Protocol for `god-orchestrator` so visible
|
|
46
|
+
tier/sub-step work gets compact "Next step" and "Step result" cards.
|
|
47
|
+
- Added `/god-mode`, `/god-next`, `/god-status`, and `/god-locate` guidance
|
|
48
|
+
for progress, path-ahead, recent work, and next-action summaries.
|
|
49
|
+
- Added `PROGRESS.md` template sections for the current step plan and recent
|
|
50
|
+
step results.
|
|
51
|
+
- Added root `AGENTS.md` Pillars Protocol guidance so coding agents know which
|
|
52
|
+
project context and workflow-state files are authoritative.
|
|
53
|
+
- Added installer coverage for `--local` Codex installs.
|
|
54
|
+
- Added regression coverage for progress math, checkpoint progress rendering,
|
|
55
|
+
checkpoint progress preservation, and checkpoint step summaries.
|
|
56
|
+
|
|
57
|
+
### Changed
|
|
58
|
+
- Package publication now allowlists `agents/god-*.md` instead of the entire
|
|
59
|
+
`agents/` directory so local Pillars files do not enter the npm payload.
|
|
60
|
+
- Package contents checks now fail when non-specialist files under `agents/`
|
|
61
|
+
would be included in the npm package.
|
|
62
|
+
- The installer now resolves local runtime destinations when `--local` is used
|
|
63
|
+
and only installs specialist agent files matching `god-*.md`.
|
|
64
|
+
|
|
65
|
+
### Guardrails
|
|
66
|
+
- This patch does not add slash commands, specialist agents, workflows,
|
|
67
|
+
recipes, schemas, or public artifact formats.
|
|
68
|
+
- Progress percentages are derived from disk state, not conversation memory.
|
|
69
|
+
- Optional or intentionally skipped steps count as complete when their state
|
|
70
|
+
is `imported`, `skipped`, or `not-required`.
|
|
71
|
+
|
|
8
72
|
## [1.6.6] - 2026-05-16
|
|
9
73
|
|
|
10
74
|
Non-God-Mode handoff privacy patch. Extends the display-safe handoff pattern
|
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,11 +12,9 @@ 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
|
-
pointers. Safe-sync and unresolved Critical harden findings still gate direct
|
|
19
|
-
Tier 3 commands, `/god-mode`, and `/god-mode --yolo`.
|
|
15
|
+
Version 1.6.8 keeps the stable Godpowers surface while making shipping less
|
|
16
|
+
interruptive: deployed staging verification is deferred until you request
|
|
17
|
+
staging, run deployed verification, or reach final project sign-off.
|
|
20
18
|
|
|
21
19
|
It fuses four disciplines into one unified workflow:
|
|
22
20
|
|
package/RELEASE.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
# Godpowers 1.6.
|
|
1
|
+
# Godpowers 1.6.8 Release
|
|
2
2
|
|
|
3
3
|
Date: 2026-05-16
|
|
4
4
|
|
|
5
|
-
Godpowers 1.6.
|
|
6
|
-
The goal of this patch is to
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
Godpowers 1.6.8 keeps shipping work moving when a deployed staging URL is not
|
|
6
|
+
ready yet. The goal of this patch is to finish local and CI-verifiable deploy,
|
|
7
|
+
observe, harden, and launch gates first, then ask for `STAGING_APP_URL` only
|
|
8
|
+
when the user requests staging or reaches final sign-off.
|
|
9
9
|
|
|
10
10
|
## What is stable
|
|
11
11
|
|
|
@@ -27,29 +27,31 @@ orchestrator and coordinator behavior.
|
|
|
27
27
|
|
|
28
28
|
## What is new
|
|
29
29
|
|
|
30
|
-
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
38
|
-
`.godpowers/
|
|
39
|
-
|
|
40
|
-
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
30
|
+
- `god-orchestrator` now documents staging URL deferral as the default shipping
|
|
31
|
+
closure policy.
|
|
32
|
+
- `/god-mode`, `/god-deploy`, and `/god-launch` now continue through local and
|
|
33
|
+
CI-verifiable gates when no live deployed origin is evidenced.
|
|
34
|
+
- `god-deploy-engineer`, `god-observability-engineer`, and
|
|
35
|
+
`god-launch-strategist` now treat missing deployed staging as deferred unless
|
|
36
|
+
the user explicitly requested staging.
|
|
37
|
+
- Missing deployed access is recorded in
|
|
38
|
+
`.godpowers/deploy/WAITING-FOR-EXTERNAL-ACCESS.md` with the exact command to
|
|
39
|
+
run later.
|
|
40
|
+
- At final sign-off, Godpowers offers three clear choices: provide
|
|
41
|
+
`STAGING_APP_URL=<deployed staging origin>`, sign off local-only with
|
|
42
|
+
deployed verification deferred, or run `/god-deploy --stage` later.
|
|
43
|
+
|
|
44
|
+
## What 1.6.8 means
|
|
45
|
+
|
|
46
|
+
Godpowers 1.6.8 does not expand the public command surface. It changes when
|
|
47
|
+
staging access is requested: not during ordinary mid-arc progress, but at an
|
|
48
|
+
explicit staging request, deployed verification command, or final project
|
|
49
|
+
sign-off.
|
|
50
|
+
|
|
51
|
+
The release keeps the no-guessed-domain rule intact. Godpowers must not invent
|
|
52
|
+
a staging URL from a product name, brand name, README title, or common TLD.
|
|
53
|
+
If only local URLs exist, it runs local smoke, records deployed verification as
|
|
54
|
+
deferred, and continues.
|
|
53
55
|
|
|
54
56
|
Safe sync and unresolved Critical harden findings remain release-truth gates.
|
|
55
57
|
Per-repo Quarterback ownership remains intact for Mode D suite work.
|
|
@@ -59,8 +61,8 @@ Per-repo Quarterback ownership remains intact for Mode D suite work.
|
|
|
59
61
|
During the 1.x stability window, do not add broad new command families, change
|
|
60
62
|
schema formats, or rename public artifacts without evidence from real use.
|
|
61
63
|
|
|
62
|
-
The `v1.6.
|
|
63
|
-
`godpowers@1.6.
|
|
64
|
+
The `v1.6.8` git tag points to the release commit that matches the npm
|
|
65
|
+
`godpowers@1.6.8` package. Public publishes should prefer the tag-triggered
|
|
64
66
|
GitHub workflow so npm provenance, git history, and release notes stay aligned.
|
|
65
67
|
|
|
66
68
|
Allowed changes:
|
|
@@ -65,11 +65,16 @@ Build is complete. All tests pass. `.godpowers/build/STATE.md` shows green.
|
|
|
65
65
|
only when needed by the next command, exact provider links only when a failed
|
|
66
66
|
check proves they are needed, and the command Godpowers will run after access
|
|
67
67
|
exists.
|
|
68
|
-
- Default
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
68
|
+
- Default behavior: do not pause mid-arc only to ask for
|
|
69
|
+
`STAGING_APP_URL=<staging-origin>`. Record deployed staging as deferred, keep
|
|
70
|
+
the exact smoke command in the waiting artifact, and continue through local
|
|
71
|
+
and CI-verifiable deploy readiness.
|
|
72
|
+
- Ask for `STAGING_APP_URL` only when the user explicitly requested deployed
|
|
73
|
+
staging, invokes `/god-deploy` for deployed verification, or reaches final
|
|
74
|
+
project sign-off. Do not ask for provider keys, API tokens, dashboards, DNS
|
|
75
|
+
tokens, production secrets, admin consoles, or test users until a named
|
|
76
|
+
deploy, smoke, rollback, health, callback, webhook, export, or observability
|
|
77
|
+
check cannot run without that exact item.
|
|
73
78
|
- Treat a staging or production origin as known only when it appears in direct
|
|
74
79
|
evidence: current user input, env/config values, deployment config, CI
|
|
75
80
|
variable references, IaC output, hosting CLI output, or deployment docs that
|
|
@@ -122,6 +127,6 @@ Write `.godpowers/deploy/STATE.md`:
|
|
|
122
127
|
- Paper canary (label without traffic split)
|
|
123
128
|
- Broad provider checklist with no scripts or exact access bundle
|
|
124
129
|
- Marks deploy done when the only verified target is missing
|
|
125
|
-
- Requests
|
|
130
|
+
- Requests provider keys before an exact scripted check proves they are needed
|
|
126
131
|
- Invents or guesses a staging or production domain
|
|
127
132
|
- Treats production as staging without explicit user approval
|
|
@@ -71,7 +71,8 @@ For each channel:
|
|
|
71
71
|
`.godpowers/observe/STATE.md`.
|
|
72
72
|
- If deploy or observe is waiting on external access, do not create a broad
|
|
73
73
|
dashboard checklist. Reference only the smallest next access item from the
|
|
74
|
-
waiting bundle and write launch state as
|
|
74
|
+
waiting bundle and write launch state as local-ready with deployed
|
|
75
|
+
verification deferred unless the user explicitly requested staging now.
|
|
75
76
|
- If a staging or production URL is available, run or specify the exact smoke
|
|
76
77
|
command and record the result.
|
|
77
78
|
- If only local staging is available, run local launch-readiness checks and
|
|
@@ -85,7 +86,10 @@ For each channel:
|
|
|
85
86
|
current. Never infer a launch URL from product name, repo name, package name,
|
|
86
87
|
README title, brand name, or common TLDs.
|
|
87
88
|
- If only production is known, do not treat it as staging. If no deployed
|
|
88
|
-
origin is known, pause for
|
|
89
|
+
origin is known, do not pause mid-arc for the staging URL. Record deployed
|
|
90
|
+
launch verification as deferred and ask for
|
|
91
|
+
`STAGING_APP_URL=<deployed staging origin>` only when the user requests
|
|
92
|
+
staging or final project sign-off begins.
|
|
89
93
|
|
|
90
94
|
## Output
|
|
91
95
|
|
|
@@ -17,7 +17,8 @@ Wire observability.
|
|
|
17
17
|
|
|
18
18
|
`.godpowers/deploy/STATE.md` exists. App is deployed and reachable, or deploy
|
|
19
19
|
state documents a tested local staging harness plus a single external access
|
|
20
|
-
bundle.
|
|
20
|
+
bundle. A deferred staging URL must not block observability setup when local or
|
|
21
|
+
CI-verifiable checks can still run.
|
|
21
22
|
|
|
22
23
|
## Process
|
|
23
24
|
|
|
@@ -69,7 +70,9 @@ For each PRD success metric, define an SLO:
|
|
|
69
70
|
Prefer local definitions as code, runbook dry-runs, log-shape checks, and CI
|
|
70
71
|
verification first.
|
|
71
72
|
- If a credential is truly required, append one exact access item to the single
|
|
72
|
-
waiting access bundle, with the command that will run next.
|
|
73
|
+
waiting access bundle, with the command that will run next. Do not pause
|
|
74
|
+
mid-arc just to request the deployed staging origin unless the user has
|
|
75
|
+
explicitly asked to stage now.
|
|
73
76
|
- Under `/god-mode --yolo`, continue through every local or CI-verifiable
|
|
74
77
|
observability check before pausing for external access.
|
|
75
78
|
|
|
@@ -382,6 +382,14 @@ The shipping tier must not end by listing a broad provider checklist. God Mode
|
|
|
382
382
|
either ships, creates the automation needed to ship, or pauses on one precise
|
|
383
383
|
external access bundle.
|
|
384
384
|
|
|
385
|
+
Default behavior: do not pause mid-arc just to ask for a staging URL. If the
|
|
386
|
+
user has not explicitly requested deployed staging verification and no live
|
|
387
|
+
target URL is evidenced, complete every local and CI-verifiable shipping gate,
|
|
388
|
+
write the missing deployed-origin item to
|
|
389
|
+
`.godpowers/deploy/WAITING-FOR-EXTERNAL-ACCESS.md`, and continue. Ask for
|
|
390
|
+
`STAGING_APP_URL` only when the user requests staging, invokes `/god-deploy`
|
|
391
|
+
or `/god-launch` for deployed verification, or reaches final project sign-off.
|
|
392
|
+
|
|
385
393
|
For deploy, observe, harden, and launch:
|
|
386
394
|
1. Detect the target environment from deploy config, org context, env files,
|
|
387
395
|
CI config, README, existing scripts, and provider CLIs.
|
|
@@ -399,29 +407,41 @@ For deploy, observe, harden, and launch:
|
|
|
399
407
|
access bundle needed
|
|
400
408
|
5. Under `--yolo`, auto-pick safe defaults for provider-neutral choices and
|
|
401
409
|
continue through every local and CI-verifiable gate.
|
|
402
|
-
6.
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
410
|
+
6. If deployed verification is deferred by default, mark the shipping artifact
|
|
411
|
+
as local/CI ready and continue. Do not pause for `STAGING_APP_URL` yet.
|
|
412
|
+
7. Only pause when the user explicitly requested deployed staging or final
|
|
413
|
+
sign-off requires a real deployed check. The pause must ask for the smallest
|
|
414
|
+
next input needed to run the next concrete check. The first external pause
|
|
415
|
+
should usually ask only for the deployed staging origin, for example
|
|
416
|
+
`STAGING_APP_URL=<staging-origin>`. Do not ask for API keys, provider
|
|
417
|
+
dashboards, DNS tokens, production secrets, or admin consoles until a
|
|
418
|
+
specific scripted check cannot run without that exact access.
|
|
419
|
+
8. At final sign-off, if deployed verification is still deferred, present:
|
|
420
|
+
"Local and CI-verifiable closure is complete. Provide
|
|
421
|
+
`STAGING_APP_URL=<deployed staging origin>` to run deployed smoke now, say
|
|
422
|
+
`sign off local-only` to finish with deployed verification deferred, or run
|
|
423
|
+
`/god-deploy --stage` later."
|
|
424
|
+
9. Do not say "Suggested next" for a blocked shipping tier. Say either
|
|
425
|
+
`Arc complete`, `Arc complete with deployed verification deferred`, or
|
|
426
|
+
`PAUSE: external access required`, with the exact artifact that lists the
|
|
427
|
+
required bundle.
|
|
411
428
|
|
|
412
429
|
### External Access Ladder
|
|
413
430
|
|
|
414
431
|
Use this order when external access is missing:
|
|
415
432
|
|
|
416
|
-
1.
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
433
|
+
1. If no live target URL is known from explicit evidence, defer the deployed
|
|
434
|
+
staging origin request unless the user asked to stage now or the arc has
|
|
435
|
+
reached final sign-off.
|
|
436
|
+
2. When staging is requested or final sign-off begins, ask for the deployed
|
|
437
|
+
staging origin only.
|
|
438
|
+
3. Run the real staging smoke command against that origin.
|
|
439
|
+
4. Ask for a provider key, dashboard, admin console, or test user only when a
|
|
420
440
|
named smoke, callback, webhook, export, observability, or rollback check
|
|
421
441
|
fails or cannot execute without that exact item.
|
|
422
|
-
|
|
442
|
+
5. Add at most one new access item per pause unless several items are required
|
|
423
443
|
by the same command invocation.
|
|
424
|
-
|
|
444
|
+
6. Every access request must include the command that will run next and the
|
|
425
445
|
artifact that will be updated after it runs.
|
|
426
446
|
|
|
427
447
|
Never request every possible key or API at the start of shipping. Keys and API
|
|
@@ -441,8 +461,10 @@ evidence:
|
|
|
441
461
|
Never invent domains from the product name, package name, repo name, README
|
|
442
462
|
title, brand name, or common TLDs. Never turn `scriven` into
|
|
443
463
|
`https://scriven.app`, or any similar guessed URL. If only production is known,
|
|
444
|
-
do not call it staging. If only local URLs exist, run local smoke only
|
|
445
|
-
|
|
464
|
+
do not call it staging. If only local URLs exist, run local smoke only, record
|
|
465
|
+
deployed staging as deferred, and ask for
|
|
466
|
+
`STAGING_APP_URL=<deployed staging origin>` only when staging is explicitly
|
|
467
|
+
requested or final sign-off begins.
|
|
446
468
|
|
|
447
469
|
## YOLO Behavior with Design + Linkage
|
|
448
470
|
|
|
@@ -470,13 +492,16 @@ for `STAGING_APP_URL=<deployed staging origin>` before deployed staging smoke.
|
|
|
470
492
|
1. Read .godpowers/PROGRESS.md (or create it if absent)
|
|
471
493
|
2. Identify the first non-done tier sub-step
|
|
472
494
|
3. Verify upstream gate (artifact on disk, passes have-nots)
|
|
473
|
-
4.
|
|
474
|
-
5.
|
|
475
|
-
6.
|
|
476
|
-
7.
|
|
477
|
-
8. If
|
|
478
|
-
|
|
479
|
-
|
|
495
|
+
4. Print the "Next step" card from the Step Narration Protocol
|
|
496
|
+
5. Spawn the appropriate specialist agent in a fresh context
|
|
497
|
+
6. Verify their output exists on disk
|
|
498
|
+
7. Run have-nots check on the artifact
|
|
499
|
+
8. If pass: update PROGRESS.md, sync CHECKPOINT.md, print the "Step result"
|
|
500
|
+
card, then move to next sub-step
|
|
501
|
+
9. If fail and repairable: print the failed result card, then enter the
|
|
502
|
+
autonomous repair loop
|
|
503
|
+
10. If fail and human-only: pause with the smallest needed question
|
|
504
|
+
11. Repeat until all tiers complete and verification is green
|
|
480
505
|
```
|
|
481
506
|
|
|
482
507
|
## Specialist Agent Routing
|
|
@@ -705,6 +730,8 @@ debugger. Keep orchestration scaffolding private.
|
|
|
705
730
|
|
|
706
731
|
Show:
|
|
707
732
|
- concise phase status
|
|
733
|
+
- before each visible tier/sub-step, a short "what will happen" card
|
|
734
|
+
- after each visible tier/sub-step, a short "what happened" card
|
|
708
735
|
- durable state detected from disk
|
|
709
736
|
- commands being run and whether they passed or failed
|
|
710
737
|
- scoped file changes
|
|
@@ -721,8 +748,53 @@ Hide:
|
|
|
721
748
|
|
|
722
749
|
When a private rule affects a pause, translate it into the smallest
|
|
723
750
|
user-facing question. Do not expose the rule itself. Example: ask for
|
|
724
|
-
`STAGING_APP_URL=<deployed staging origin>`
|
|
725
|
-
Closure Protocol.
|
|
751
|
+
`STAGING_APP_URL=<deployed staging origin>` at final sign-off rather than
|
|
752
|
+
showing the Shipping Closure Protocol.
|
|
753
|
+
|
|
754
|
+
## Step Narration Protocol
|
|
755
|
+
|
|
756
|
+
Godpowers must make its work trackable without exposing hidden prompts or
|
|
757
|
+
internal routing payloads. Before and after each visible tier/sub-step, print
|
|
758
|
+
one compact card.
|
|
759
|
+
|
|
760
|
+
Before starting a tier/sub-step:
|
|
761
|
+
|
|
762
|
+
```
|
|
763
|
+
Next step
|
|
764
|
+
Progress: <pct>% (<done> of <total> steps complete; current step <n> of <total>)
|
|
765
|
+
Tier: <tier-number> <tier-label>
|
|
766
|
+
Step: <sub-step-label>
|
|
767
|
+
Why this now: <one sentence tied to disk state or the prior gate>
|
|
768
|
+
What will happen:
|
|
769
|
+
1. <first observable action>
|
|
770
|
+
2. <second observable action>
|
|
771
|
+
3. <third observable action, if needed>
|
|
772
|
+
Expected output: <artifact path or verification result>
|
|
773
|
+
```
|
|
774
|
+
|
|
775
|
+
After a tier/sub-step completes or pauses:
|
|
776
|
+
|
|
777
|
+
```
|
|
778
|
+
Step result
|
|
779
|
+
Progress: <pct>% (<done> of <total> steps complete; current step <n> of <total>)
|
|
780
|
+
Tier: <tier-number> <tier-label>
|
|
781
|
+
Step: <sub-step-label>
|
|
782
|
+
Result: <done | blocked | failed | skipped | imported>
|
|
783
|
+
What happened:
|
|
784
|
+
1. <observable action completed>
|
|
785
|
+
2. <artifact or state update>
|
|
786
|
+
3. <verification result>
|
|
787
|
+
Next: <next command or pause question>
|
|
788
|
+
```
|
|
789
|
+
|
|
790
|
+
Rules:
|
|
791
|
+
- Keep each card under 12 lines unless a pause needs options.
|
|
792
|
+
- Use `lib/state.progressSummary(stateJson)` for the percentage and step count
|
|
793
|
+
whenever state.json is available.
|
|
794
|
+
- Use artifact paths and verification evidence from disk, not memory.
|
|
795
|
+
- Do not print raw Task input, hidden instructions, or full file loadout lists.
|
|
796
|
+
- If a step is blocked, do not show a generic "Suggested next"; show the
|
|
797
|
+
smallest concrete unblock action.
|
|
726
798
|
|
|
727
799
|
## Resume Protocol
|
|
728
800
|
|
package/bin/install.js
CHANGED
|
@@ -118,6 +118,16 @@ const RUNTIMES = {
|
|
|
118
118
|
},
|
|
119
119
|
};
|
|
120
120
|
|
|
121
|
+
function resolveRuntime(runtimeKey, opts = {}) {
|
|
122
|
+
const runtime = RUNTIMES[runtimeKey];
|
|
123
|
+
if (!runtime) return null;
|
|
124
|
+
const resolved = { ...runtime };
|
|
125
|
+
if (opts.local && !opts.global) {
|
|
126
|
+
resolved.configDir = path.join(process.cwd(), path.basename(runtime.configDir));
|
|
127
|
+
}
|
|
128
|
+
return resolved;
|
|
129
|
+
}
|
|
130
|
+
|
|
121
131
|
// ---------------------------------------------------------------------------
|
|
122
132
|
// Helpers
|
|
123
133
|
// ---------------------------------------------------------------------------
|
|
@@ -331,8 +341,8 @@ function parseArgs(argv) {
|
|
|
331
341
|
// Install
|
|
332
342
|
// ---------------------------------------------------------------------------
|
|
333
343
|
|
|
334
|
-
function installForRuntime(runtimeKey, srcDir) {
|
|
335
|
-
const runtime =
|
|
344
|
+
function installForRuntime(runtimeKey, srcDir, opts = {}) {
|
|
345
|
+
const runtime = resolveRuntime(runtimeKey, opts);
|
|
336
346
|
if (!runtime) {
|
|
337
347
|
error(`Unknown runtime: ${runtimeKey}`);
|
|
338
348
|
return false;
|
|
@@ -367,7 +377,7 @@ function installForRuntime(runtimeKey, srcDir) {
|
|
|
367
377
|
ensureDir(agentsDest);
|
|
368
378
|
let count = 0;
|
|
369
379
|
for (const file of fs.readdirSync(agentsSrc)) {
|
|
370
|
-
if (file
|
|
380
|
+
if (/^god-.*\.md$/.test(file)) {
|
|
371
381
|
const srcFile = path.join(agentsSrc, file);
|
|
372
382
|
installAgentFile(srcFile, agentsDest, runtime);
|
|
373
383
|
count++;
|
|
@@ -456,8 +466,8 @@ function installForRuntime(runtimeKey, srcDir) {
|
|
|
456
466
|
// Uninstall
|
|
457
467
|
// ---------------------------------------------------------------------------
|
|
458
468
|
|
|
459
|
-
function uninstallForRuntime(runtimeKey) {
|
|
460
|
-
const runtime =
|
|
469
|
+
function uninstallForRuntime(runtimeKey, opts = {}) {
|
|
470
|
+
const runtime = resolveRuntime(runtimeKey, opts);
|
|
461
471
|
if (!runtime) {
|
|
462
472
|
error(`Unknown runtime: ${runtimeKey}`);
|
|
463
473
|
return false;
|
|
@@ -580,16 +590,16 @@ function main() {
|
|
|
580
590
|
|
|
581
591
|
const srcDir = path.resolve(__dirname, '..');
|
|
582
592
|
|
|
583
|
-
// Detect non-interactive and default to
|
|
593
|
+
// Detect non-interactive and default to Claude Code.
|
|
584
594
|
if (opts.runtimes.length === 0 && !opts.all) {
|
|
585
595
|
if (!process.stdin.isTTY) {
|
|
586
|
-
warn('Non-interactive terminal detected, defaulting to Claude Code
|
|
596
|
+
warn('Non-interactive terminal detected, defaulting to Claude Code install');
|
|
587
597
|
opts.runtimes = ['claude'];
|
|
588
|
-
opts.global = true;
|
|
598
|
+
if (!opts.local) opts.global = true;
|
|
589
599
|
} else {
|
|
590
600
|
// Interactive mode: default to claude
|
|
591
601
|
opts.runtimes = ['claude'];
|
|
592
|
-
opts.global = true;
|
|
602
|
+
if (!opts.local) opts.global = true;
|
|
593
603
|
}
|
|
594
604
|
}
|
|
595
605
|
|
|
@@ -601,7 +611,7 @@ function main() {
|
|
|
601
611
|
if (opts.uninstall) {
|
|
602
612
|
let removed = 0;
|
|
603
613
|
for (const runtime of opts.runtimes) {
|
|
604
|
-
if (uninstallForRuntime(runtime)) {
|
|
614
|
+
if (uninstallForRuntime(runtime, opts)) {
|
|
605
615
|
removed++;
|
|
606
616
|
}
|
|
607
617
|
}
|
|
@@ -617,7 +627,7 @@ function main() {
|
|
|
617
627
|
|
|
618
628
|
let installed = 0;
|
|
619
629
|
for (const runtime of opts.runtimes) {
|
|
620
|
-
if (installForRuntime(runtime, srcDir)) {
|
|
630
|
+
if (installForRuntime(runtime, srcDir, opts)) {
|
|
621
631
|
installed++;
|
|
622
632
|
}
|
|
623
633
|
}
|
|
@@ -625,7 +635,7 @@ function main() {
|
|
|
625
635
|
if (installed > 0) {
|
|
626
636
|
// Count slash commands for verification message
|
|
627
637
|
const skillsCount = fs.readdirSync(path.join(srcDir, 'skills')).filter(f => f.endsWith('.md')).length;
|
|
628
|
-
const agentsCount = fs.readdirSync(path.join(srcDir, 'agents')).filter(f => f
|
|
638
|
+
const agentsCount = fs.readdirSync(path.join(srcDir, 'agents')).filter(f => /^god-.*\.md$/.test(f)).length;
|
|
629
639
|
|
|
630
640
|
log('');
|
|
631
641
|
log(`\x1b[32mDone!\x1b[0m Installed Godpowers v${VERSION} for ${installed} runtime(s).`);
|
package/lib/checkpoint.js
CHANGED
|
@@ -22,6 +22,10 @@
|
|
|
22
22
|
* lifecycle: {pre-init|in-arc|steady-state-active|...}
|
|
23
23
|
* current-tier: {tier-N}
|
|
24
24
|
* current-substep: {substep-key}
|
|
25
|
+
* progress-pct: {number}
|
|
26
|
+
* progress-complete: {number}
|
|
27
|
+
* progress-total: {number}
|
|
28
|
+
* current-step: {number}
|
|
25
29
|
* last-action: {action-name}
|
|
26
30
|
* last-actor: {agent or user}
|
|
27
31
|
* last-update: {ISO8601}
|
|
@@ -123,6 +127,7 @@ function write(projectRoot, state) {
|
|
|
123
127
|
const actions = (state.actions || []).slice(0, MAX_ACTIONS);
|
|
124
128
|
const facts = (state.facts || []).slice(0, MAX_FACTS);
|
|
125
129
|
const factsHash = sha256(JSON.stringify(facts));
|
|
130
|
+
const progress = state.progress || null;
|
|
126
131
|
|
|
127
132
|
const fm = [
|
|
128
133
|
'---',
|
|
@@ -133,13 +138,27 @@ function write(projectRoot, state) {
|
|
|
133
138
|
`lifecycle: ${state.lifecycle || 'in-arc'}`,
|
|
134
139
|
`current-tier: ${state.currentTier || 'tier-0'}`,
|
|
135
140
|
`current-substep: ${state.currentSubstep || 'orchestration'}`,
|
|
141
|
+
progress ? `progress-pct: ${progress.percent}` : null,
|
|
142
|
+
progress ? `progress-complete: ${progress.completed}` : null,
|
|
143
|
+
progress ? `progress-total: ${progress.total}` : null,
|
|
144
|
+
progress ? `current-step: ${progress.currentStep}` : null,
|
|
136
145
|
`last-action: ${state.lastAction || 'unknown'}`,
|
|
137
146
|
`last-actor: ${state.lastActor || 'unknown'}`,
|
|
138
147
|
`last-update: ${ts}`,
|
|
139
148
|
`facts-hash: sha256:${factsHash}`,
|
|
140
149
|
'---',
|
|
141
150
|
''
|
|
142
|
-
].join('\n');
|
|
151
|
+
].filter(line => line !== null).join('\n');
|
|
152
|
+
|
|
153
|
+
const progressLine = progress
|
|
154
|
+
? `- Progress: **${progress.percent}%** (${progress.completed} of ${progress.total} steps complete; current step ${progress.currentStep} of ${progress.total})`
|
|
155
|
+
: null;
|
|
156
|
+
const recentSummary = actions.length === 0
|
|
157
|
+
? '_(no recent actions recorded yet)_'
|
|
158
|
+
: actions.slice(0, 3).map(a => `- ${a}`).join('\n');
|
|
159
|
+
const nextSummary = state.nextCommand
|
|
160
|
+
? `- ${state.nextCommand}\n- ${state.nextReason || 'No reason recorded.'}`
|
|
161
|
+
: '- Run `/god-next` to compute the next command from disk state.';
|
|
143
162
|
|
|
144
163
|
const body = [
|
|
145
164
|
'# Checkpoint',
|
|
@@ -153,9 +172,18 @@ function write(projectRoot, state) {
|
|
|
153
172
|
`- Project: **${state.project || 'unnamed'}**`,
|
|
154
173
|
`- Mode: **${state.mode || '?'}**${state.modeDSuite ? ' (in multi-repo suite)' : ''}`,
|
|
155
174
|
`- Lifecycle phase: **${state.lifecycle || 'in-arc'}**`,
|
|
175
|
+
progressLine,
|
|
156
176
|
`- Current tier: **${state.currentTier || 'tier-0'}** / **${state.currentSubstep || 'orchestration'}**`,
|
|
157
177
|
`- Last action: \`${state.lastAction || 'unknown'}\` by ${state.lastActor || 'unknown'} at ${ts}`,
|
|
158
178
|
'',
|
|
179
|
+
'## What happened recently',
|
|
180
|
+
'',
|
|
181
|
+
recentSummary,
|
|
182
|
+
'',
|
|
183
|
+
'## What happens next',
|
|
184
|
+
'',
|
|
185
|
+
nextSummary,
|
|
186
|
+
'',
|
|
159
187
|
'## Next suggested command',
|
|
160
188
|
'',
|
|
161
189
|
state.nextCommand
|
|
@@ -191,7 +219,7 @@ function write(projectRoot, state) {
|
|
|
191
219
|
`- Authoritative state: \`.godpowers/state.json\``,
|
|
192
220
|
`- Authoritative history: \`.godpowers/runs/<id>/events.jsonl\` + \`.godpowers/log\``,
|
|
193
221
|
''
|
|
194
|
-
].join('\n');
|
|
222
|
+
].filter(line => line !== null).join('\n');
|
|
195
223
|
|
|
196
224
|
fs.writeFileSync(file, fm + body);
|
|
197
225
|
return file;
|
|
@@ -234,7 +262,7 @@ function recordFact(projectRoot, fact) {
|
|
|
234
262
|
}
|
|
235
263
|
|
|
236
264
|
function frontmatterToState(fm, facts) {
|
|
237
|
-
|
|
265
|
+
const result = {
|
|
238
266
|
project: fm.project,
|
|
239
267
|
mode: fm.mode,
|
|
240
268
|
modeDSuite: fm['mode-d-suite'] === true || fm['mode-d-suite'] === 'true',
|
|
@@ -245,6 +273,15 @@ function frontmatterToState(fm, facts) {
|
|
|
245
273
|
lastActor: fm['last-actor'],
|
|
246
274
|
facts: facts || []
|
|
247
275
|
};
|
|
276
|
+
if (fm['progress-total']) {
|
|
277
|
+
result.progress = {
|
|
278
|
+
percent: Number(fm['progress-pct'] || 0),
|
|
279
|
+
completed: Number(fm['progress-complete'] || 0),
|
|
280
|
+
total: Number(fm['progress-total'] || 0),
|
|
281
|
+
currentStep: Number(fm['current-step'] || 0)
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
return result;
|
|
248
285
|
}
|
|
249
286
|
|
|
250
287
|
/**
|
|
@@ -304,27 +341,26 @@ function syncFromState(projectRoot, opts = {}) {
|
|
|
304
341
|
|
|
305
342
|
const s = state.read(projectRoot);
|
|
306
343
|
if (!s) throw new Error('state.json not initialized');
|
|
344
|
+
const progress = state.progressSummary(s);
|
|
307
345
|
|
|
308
|
-
// Find the current tier + sub-step
|
|
309
|
-
//
|
|
346
|
+
// Find the current tier + sub-step from progressSummary, then keep a
|
|
347
|
+
// separate lastAction pointer to the newest completed step.
|
|
310
348
|
let currentTier = 'tier-0';
|
|
311
349
|
let currentSubstep = 'orchestration';
|
|
312
350
|
let lastAction = 'init';
|
|
313
351
|
let lastUpdate = null;
|
|
314
352
|
let lastActor = 'unknown';
|
|
353
|
+
if (progress.current) {
|
|
354
|
+
currentTier = progress.current.tierKey;
|
|
355
|
+
currentSubstep = progress.current.subStepKey;
|
|
356
|
+
}
|
|
357
|
+
|
|
315
358
|
if (s.tiers) {
|
|
316
|
-
|
|
359
|
+
for (const tierKey of Object.keys(s.tiers).sort()) {
|
|
317
360
|
for (const [substepKey, sub] of Object.entries(s.tiers[tierKey])) {
|
|
318
|
-
if (sub.status === 'in-flight') {
|
|
319
|
-
currentTier = tierKey;
|
|
320
|
-
currentSubstep = substepKey;
|
|
321
|
-
break outer;
|
|
322
|
-
}
|
|
323
361
|
if (sub.status === 'done' && sub.updated) {
|
|
324
362
|
if (!lastUpdate || sub.updated > lastUpdate) {
|
|
325
363
|
lastUpdate = sub.updated;
|
|
326
|
-
currentTier = tierKey;
|
|
327
|
-
currentSubstep = substepKey;
|
|
328
364
|
lastAction = `${tierKey}.${substepKey} done`;
|
|
329
365
|
}
|
|
330
366
|
}
|
|
@@ -372,6 +408,7 @@ function syncFromState(projectRoot, opts = {}) {
|
|
|
372
408
|
lastActor,
|
|
373
409
|
actions,
|
|
374
410
|
facts,
|
|
411
|
+
progress,
|
|
375
412
|
nextCommand: opts.nextCommand,
|
|
376
413
|
nextReason: opts.nextReason
|
|
377
414
|
});
|
package/lib/state.js
CHANGED
|
@@ -10,11 +10,52 @@ const path = require('path');
|
|
|
10
10
|
const crypto = require('crypto');
|
|
11
11
|
|
|
12
12
|
const STATE_VERSION = '1.0.0';
|
|
13
|
+
const COMPLETE_STATUSES = new Set(['done', 'imported', 'skipped', 'not-required']);
|
|
14
|
+
const ACTIVE_STATUSES = new Set(['in-flight', 'failed', 're-invoked']);
|
|
15
|
+
const TIER_LABELS = {
|
|
16
|
+
'tier-0': 'Orchestration',
|
|
17
|
+
'tier-1': 'Planning',
|
|
18
|
+
'tier-2': 'Building',
|
|
19
|
+
'tier-3': 'Shipping'
|
|
20
|
+
};
|
|
21
|
+
const SUBSTEP_LABELS = {
|
|
22
|
+
orchestration: 'Orchestration',
|
|
23
|
+
prd: 'PRD',
|
|
24
|
+
arch: 'Architecture',
|
|
25
|
+
roadmap: 'Roadmap',
|
|
26
|
+
stack: 'Stack',
|
|
27
|
+
design: 'Design',
|
|
28
|
+
product: 'Product',
|
|
29
|
+
repo: 'Repo',
|
|
30
|
+
build: 'Build',
|
|
31
|
+
deploy: 'Deploy',
|
|
32
|
+
observe: 'Observe',
|
|
33
|
+
launch: 'Launch',
|
|
34
|
+
harden: 'Harden'
|
|
35
|
+
};
|
|
13
36
|
|
|
14
37
|
function statePath(projectRoot) {
|
|
15
38
|
return path.join(projectRoot, '.godpowers', 'state.json');
|
|
16
39
|
}
|
|
17
40
|
|
|
41
|
+
function tierNumber(tierKey) {
|
|
42
|
+
const match = String(tierKey).match(/^tier-(\d+)$/);
|
|
43
|
+
return match ? Number(match[1]) : Number.MAX_SAFE_INTEGER;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function labelFromKey(key) {
|
|
47
|
+
return String(key)
|
|
48
|
+
.split(/[-_]/)
|
|
49
|
+
.filter(Boolean)
|
|
50
|
+
.map(part => part.charAt(0).toUpperCase() + part.slice(1))
|
|
51
|
+
.join(' ');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function tierComparator(a, b) {
|
|
55
|
+
const byNumber = tierNumber(a) - tierNumber(b);
|
|
56
|
+
return byNumber === 0 ? String(a).localeCompare(String(b)) : byNumber;
|
|
57
|
+
}
|
|
58
|
+
|
|
18
59
|
/**
|
|
19
60
|
* Read state.json from a project. Returns null if not initialized.
|
|
20
61
|
*/
|
|
@@ -139,4 +180,106 @@ function detectDrift(projectRoot) {
|
|
|
139
180
|
return drift;
|
|
140
181
|
}
|
|
141
182
|
|
|
142
|
-
|
|
183
|
+
function isCompleteStatus(status) {
|
|
184
|
+
return COMPLETE_STATUSES.has(status);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function isActiveStatus(status) {
|
|
188
|
+
return ACTIVE_STATUSES.has(status);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function orderedSubSteps(state) {
|
|
192
|
+
if (!state || !state.tiers) return [];
|
|
193
|
+
const steps = [];
|
|
194
|
+
for (const tierKey of Object.keys(state.tiers).sort(tierComparator)) {
|
|
195
|
+
const tier = state.tiers[tierKey] || {};
|
|
196
|
+
for (const [subStepKey, subStep] of Object.entries(tier)) {
|
|
197
|
+
const status = subStep && subStep.status ? subStep.status : 'pending';
|
|
198
|
+
steps.push({
|
|
199
|
+
tierKey,
|
|
200
|
+
tierNumber: tierNumber(tierKey),
|
|
201
|
+
tierLabel: TIER_LABELS[tierKey] || labelFromKey(tierKey),
|
|
202
|
+
subStepKey,
|
|
203
|
+
subStepLabel: SUBSTEP_LABELS[subStepKey] || labelFromKey(subStepKey),
|
|
204
|
+
status,
|
|
205
|
+
artifact: subStep && subStep.artifact,
|
|
206
|
+
updated: subStep && subStep.updated
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return steps.map((step, index) => ({ ...step, ordinal: index + 1 }));
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function progressSummary(state) {
|
|
214
|
+
const steps = orderedSubSteps(state);
|
|
215
|
+
const total = steps.length;
|
|
216
|
+
const completed = steps.filter(step => isCompleteStatus(step.status)).length;
|
|
217
|
+
|
|
218
|
+
let currentIndex = steps.findIndex(step => isActiveStatus(step.status));
|
|
219
|
+
if (currentIndex < 0) {
|
|
220
|
+
currentIndex = steps.findIndex(step => !isCompleteStatus(step.status));
|
|
221
|
+
}
|
|
222
|
+
if (currentIndex < 0 && total > 0) currentIndex = total - 1;
|
|
223
|
+
|
|
224
|
+
const current = currentIndex >= 0 ? steps[currentIndex] : null;
|
|
225
|
+
return {
|
|
226
|
+
percent: total === 0 ? 0 : Math.round((completed / total) * 100),
|
|
227
|
+
completed,
|
|
228
|
+
total,
|
|
229
|
+
remaining: Math.max(total - completed, 0),
|
|
230
|
+
currentStep: current ? current.ordinal : 0,
|
|
231
|
+
current,
|
|
232
|
+
tiers: summarizeTiers(steps)
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function summarizeTiers(steps) {
|
|
237
|
+
const byTier = new Map();
|
|
238
|
+
for (const step of steps) {
|
|
239
|
+
if (!byTier.has(step.tierKey)) {
|
|
240
|
+
byTier.set(step.tierKey, {
|
|
241
|
+
tierKey: step.tierKey,
|
|
242
|
+
tierNumber: step.tierNumber,
|
|
243
|
+
tierLabel: step.tierLabel,
|
|
244
|
+
completed: 0,
|
|
245
|
+
total: 0,
|
|
246
|
+
current: false
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
const tier = byTier.get(step.tierKey);
|
|
250
|
+
tier.total += 1;
|
|
251
|
+
if (isCompleteStatus(step.status)) tier.completed += 1;
|
|
252
|
+
if (isActiveStatus(step.status)) tier.current = true;
|
|
253
|
+
}
|
|
254
|
+
return Array.from(byTier.values()).map(tier => ({
|
|
255
|
+
...tier,
|
|
256
|
+
percent: tier.total === 0 ? 0 : Math.round((tier.completed / tier.total) * 100)
|
|
257
|
+
}));
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function renderProgressLine(summary) {
|
|
261
|
+
const progress = summary && typeof summary.total === 'number' ? summary : progressSummary(summary);
|
|
262
|
+
if (!progress || progress.total === 0) {
|
|
263
|
+
return 'Progress: unavailable, no tracked Godpowers steps found';
|
|
264
|
+
}
|
|
265
|
+
const current = progress.current;
|
|
266
|
+
const currentLabel = current
|
|
267
|
+
? `${current.tierLabel} / ${current.subStepLabel}`
|
|
268
|
+
: 'complete';
|
|
269
|
+
return `Progress: ${progress.percent}% (${progress.completed} of ${progress.total} steps complete; current step ${progress.currentStep} of ${progress.total}: ${currentLabel})`;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
module.exports = {
|
|
273
|
+
read,
|
|
274
|
+
write,
|
|
275
|
+
init,
|
|
276
|
+
updateSubStep,
|
|
277
|
+
hashFile,
|
|
278
|
+
detectDrift,
|
|
279
|
+
statePath,
|
|
280
|
+
orderedSubSteps,
|
|
281
|
+
progressSummary,
|
|
282
|
+
renderProgressLine,
|
|
283
|
+
isCompleteStatus,
|
|
284
|
+
isActiveStatus
|
|
285
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "godpowers",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.8",
|
|
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"
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"files": [
|
|
67
67
|
"bin/",
|
|
68
68
|
"skills/",
|
|
69
|
-
"agents/",
|
|
69
|
+
"agents/god-*.md",
|
|
70
70
|
"hooks/",
|
|
71
71
|
"templates/",
|
|
72
72
|
"references/",
|
package/skills/god-deploy.md
CHANGED
|
@@ -27,11 +27,12 @@ After god-deploy-engineer returns:
|
|
|
27
27
|
- real staging or production target tested
|
|
28
28
|
- local staging harness tested with equivalent health, smoke, and rollback
|
|
29
29
|
commands
|
|
30
|
-
-
|
|
31
|
-
|
|
32
|
-
4. Update `.godpowers/PROGRESS.md`: Deploy status
|
|
33
|
-
target or tested local staging harness. If
|
|
34
|
-
Deploy
|
|
30
|
+
- local/CI deploy readiness complete with deployed staging verification
|
|
31
|
+
deferred in `.godpowers/deploy/WAITING-FOR-EXTERNAL-ACCESS.md`
|
|
32
|
+
4. Update `.godpowers/PROGRESS.md`: Deploy status can be done when a tested
|
|
33
|
+
real target or tested local staging harness exists. If deployed staging is
|
|
34
|
+
deferred, annotate Deploy as done-local with the waiting artifact path and
|
|
35
|
+
do not pause unless the user explicitly requested staging.
|
|
35
36
|
|
|
36
37
|
## On Completion
|
|
37
38
|
|
|
@@ -44,11 +45,14 @@ Suggested next: /god-observe (wire SLOs, alerts, runbooks)
|
|
|
44
45
|
Under `/god-mode --yolo`, do not stop with a provider checklist. Create or
|
|
45
46
|
update the deploy scripts, smoke command, rollback command, health endpoints,
|
|
46
47
|
env manifest, and local staging harness first. If real external access is still
|
|
47
|
-
required,
|
|
48
|
-
`.godpowers/deploy/WAITING-FOR-EXTERNAL-ACCESS.md
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
required, record the single access bundle in
|
|
49
|
+
`.godpowers/deploy/WAITING-FOR-EXTERNAL-ACCESS.md` and continue until the user
|
|
50
|
+
requests staging or final sign-off begins.
|
|
51
|
+
|
|
52
|
+
The single access bundle must be incremental. Do not ask for
|
|
53
|
+
`STAGING_APP_URL` mid-arc unless the user requested deployed staging. At final
|
|
54
|
+
sign-off or explicit staging, ask for the smallest next item needed to run the
|
|
55
|
+
next command. If no live target URL is known, ask only for
|
|
52
56
|
`STAGING_APP_URL=<staging-origin>` and the exact smoke command that will run.
|
|
53
57
|
Do not ask for provider keys, API tokens, dashboards, DNS tokens, production
|
|
54
58
|
secrets, admin consoles, or test users until a specific scripted check proves
|
|
@@ -59,8 +63,8 @@ values, deployment config, CI variable references, IaC output, hosting CLI
|
|
|
59
63
|
output, or deployment docs that explicitly label the URL as owned and current.
|
|
60
64
|
Never invent a domain from the product name, repo name, package name, README
|
|
61
65
|
title, brand name, or common TLDs. If only local URLs exist, run local smoke
|
|
62
|
-
only
|
|
63
|
-
|
|
66
|
+
only, record deployed staging as deferred, and continue. If only production is
|
|
67
|
+
known, do not use it as staging without explicit user approval.
|
|
64
68
|
|
|
65
69
|
|
|
66
70
|
## Re-invocation contract
|
package/skills/god-launch.md
CHANGED
|
@@ -52,12 +52,15 @@ Or: /god-status (see the final state)
|
|
|
52
52
|
Under `/god-mode --yolo`, do not stop by listing provider dashboards. Create
|
|
53
53
|
the launch runbook, smoke command, source attribution plan, and local
|
|
54
54
|
launch-readiness checks. If real launch is blocked by missing external access,
|
|
55
|
-
|
|
55
|
+
record the single access bundle from deploy or launch state and continue until
|
|
56
|
+
the user requests staging or final sign-off begins.
|
|
56
57
|
|
|
57
58
|
The launch pause must not expand into every possible channel, analytics, or
|
|
58
59
|
provider credential. Ask only for the next missing access item needed to run a
|
|
59
|
-
named live smoke, launch-readiness, attribution, or monitoring check.
|
|
60
|
-
|
|
60
|
+
named live smoke, launch-readiness, attribution, or monitoring check. Do not
|
|
61
|
+
ask mid-arc for `STAGING_APP_URL` unless the user requested deployed staging.
|
|
62
|
+
At final sign-off, if no live target URL is known, ask only for
|
|
63
|
+
`STAGING_APP_URL=<staging-origin>`.
|
|
61
64
|
|
|
62
65
|
Live target URLs must be evidence-backed. Never invent a domain from the
|
|
63
66
|
product name, repo name, package name, README title, brand name, or common TLDs.
|
package/skills/god-locate.md
CHANGED
|
@@ -40,6 +40,7 @@ GODPOWERS LOCATE
|
|
|
40
40
|
|
|
41
41
|
Project: <name> Mode: <A/B/C/E> Suite: <yes/no>
|
|
42
42
|
Lifecycle: <phase> Current: <tier>/<substep>
|
|
43
|
+
Progress: <pct>% (<complete> of <total> steps complete; current step <n> of <total>)
|
|
43
44
|
|
|
44
45
|
Last action: <name> by <actor> at <ts>
|
|
45
46
|
Last user instruction: <if available>
|
|
@@ -55,6 +56,14 @@ Recent events (last 5):
|
|
|
55
56
|
- <event>
|
|
56
57
|
- ...
|
|
57
58
|
|
|
59
|
+
What happened recently:
|
|
60
|
+
- <checkpoint action or event summary>
|
|
61
|
+
- <checkpoint action or event summary>
|
|
62
|
+
|
|
63
|
+
What happens next:
|
|
64
|
+
- <next command>
|
|
65
|
+
- <one-line reason>
|
|
66
|
+
|
|
58
67
|
Next suggested: <command>
|
|
59
68
|
Reason: <why>
|
|
60
69
|
|
|
@@ -73,8 +82,12 @@ Drift check:
|
|
|
73
82
|
3. If state.json is missing: project is broken; run `/god-doctor`.
|
|
74
83
|
4. Compute age of CHECKPOINT last-update; flag staleness if > 1 hour
|
|
75
84
|
or > 100 events since last checkpoint write.
|
|
76
|
-
5.
|
|
77
|
-
|
|
85
|
+
5. Compute progress from `lib/state.progressSummary(stateJson)` and show
|
|
86
|
+
percentage, complete count, total count, and current step number.
|
|
87
|
+
6. Summarize "what happened recently" from CHECKPOINT.md actions or recent
|
|
88
|
+
events, then summarize "what happens next" from routing.
|
|
89
|
+
7. Produce single-screen orientation summary.
|
|
90
|
+
8. Append `op:locate` event to events.jsonl.
|
|
78
91
|
|
|
79
92
|
## Difference from /god-status
|
|
80
93
|
|
package/skills/god-mode.md
CHANGED
|
@@ -94,18 +94,20 @@ You are receiving a /god-mode invocation. Your job is to spawn the
|
|
|
94
94
|
security or a genuine human-only decision.
|
|
95
95
|
- Instruction that deploy, observe, harden, and launch must follow the
|
|
96
96
|
Shipping Closure Protocol: verify a real environment when available,
|
|
97
|
-
otherwise create local/CI-verifiable deploy automation
|
|
98
|
-
|
|
97
|
+
otherwise create local/CI-verifiable deploy automation, defer deployed
|
|
98
|
+
staging by default, and continue until the user requests staging or the
|
|
99
|
+
arc reaches final sign-off.
|
|
99
100
|
- Instruction that keys, API tokens, dashboards, admin consoles, and
|
|
100
|
-
provider-specific access are last-mile inputs.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
101
|
+
provider-specific access are last-mile inputs. Do not pause mid-arc for
|
|
102
|
+
`STAGING_APP_URL` unless the user requested deployed staging. At final
|
|
103
|
+
sign-off, ask only for the smallest next item needed by a concrete
|
|
104
|
+
command, usually `STAGING_APP_URL=<staging-origin>`. Ask for additional
|
|
105
|
+
provider access only after a named check proves it is needed.
|
|
104
106
|
- Instruction that staging, preview, and production URLs must come from
|
|
105
107
|
direct evidence. Never infer or invent a domain from project name,
|
|
106
108
|
package name, repo name, README title, or brand name. If no deployed
|
|
107
|
-
origin is evidenced,
|
|
108
|
-
|
|
109
|
+
origin is evidenced, record deployed staging as deferred and continue
|
|
110
|
+
until staging is requested or final sign-off begins.
|
|
109
111
|
- Instruction that brownfield and bluefield greenfield simulation audits
|
|
110
112
|
must be acted on by god-greenfieldifier. The greenfieldifier writes
|
|
111
113
|
`.godpowers/audit/GREENFIELDIFY-PLAN.md`, pauses before risky canonical
|
|
@@ -164,6 +166,8 @@ The God Mode transcript is an operator console, not a prompt debugger.
|
|
|
164
166
|
|
|
165
167
|
Show:
|
|
166
168
|
- detected resume or project mode in plain language
|
|
169
|
+
- a compact "Next step" card before each visible phase or tier sub-step
|
|
170
|
+
- a compact "Step result" card after each visible phase or tier sub-step
|
|
167
171
|
- short progress updates for phases, commands, validations, and file edits
|
|
168
172
|
- concise validation summaries instead of full command noise when possible
|
|
169
173
|
- final changed paths, validation results, and completion or pause status
|
|
@@ -179,8 +183,41 @@ Hide:
|
|
|
179
183
|
|
|
180
184
|
If an internal instruction must influence a pause, translate it into the
|
|
181
185
|
smallest user-facing question. For example, ask for
|
|
182
|
-
`STAGING_APP_URL=<deployed staging origin>`
|
|
183
|
-
Shipping Closure Protocol.
|
|
186
|
+
`STAGING_APP_URL=<deployed staging origin>` at final sign-off instead of
|
|
187
|
+
exposing the full Shipping Closure Protocol.
|
|
188
|
+
|
|
189
|
+
## Step Cards
|
|
190
|
+
|
|
191
|
+
Relay the orchestrator's step cards when present. If the orchestrator output is
|
|
192
|
+
missing them, synthesize them from disk state before continuing.
|
|
193
|
+
|
|
194
|
+
Before work starts:
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
Next step
|
|
198
|
+
Progress: <pct>% (<done> of <total> steps complete; current step <n> of <total>)
|
|
199
|
+
Tier: <tier-number> <tier-label>
|
|
200
|
+
Step: <sub-step-label>
|
|
201
|
+
Why this now: <one sentence>
|
|
202
|
+
What will happen:
|
|
203
|
+
1. <observable action>
|
|
204
|
+
2. <observable action>
|
|
205
|
+
Expected output: <artifact path or verification result>
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
After work completes or pauses:
|
|
209
|
+
|
|
210
|
+
```
|
|
211
|
+
Step result
|
|
212
|
+
Progress: <pct>% (<done> of <total> steps complete; current step <n> of <total>)
|
|
213
|
+
Tier: <tier-number> <tier-label>
|
|
214
|
+
Step: <sub-step-label>
|
|
215
|
+
Result: <done | blocked | failed | skipped | imported>
|
|
216
|
+
What happened:
|
|
217
|
+
1. <observable action completed>
|
|
218
|
+
2. <artifact or verification result>
|
|
219
|
+
Next: <next command or pause question>
|
|
220
|
+
```
|
|
184
221
|
|
|
185
222
|
## Pause Format (relay from orchestrator)
|
|
186
223
|
|
package/skills/god-next.md
CHANGED
|
@@ -147,6 +147,17 @@ Display: "Suggested next: /god-arch
|
|
|
147
147
|
Why: PRD is complete; architecture is the next gate"
|
|
148
148
|
```
|
|
149
149
|
|
|
150
|
+
When the suggestion is based on state.json, also show the immediate route:
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
Path ahead:
|
|
154
|
+
1. Current: <tier>/<substep> - <status>
|
|
155
|
+
2. Next: /god-X - <why>
|
|
156
|
+
3. Then: /god-Y - <next gate, if known>
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Keep the route to 3 lines unless the user asks for the full plan.
|
|
160
|
+
|
|
150
161
|
## Process for Mode 4 (intent-based)
|
|
151
162
|
|
|
152
163
|
```
|
|
@@ -280,10 +291,16 @@ recommending archaeology, reconstruction, arc-ready, pillars, or refactor work.
|
|
|
280
291
|
Godpowers Next
|
|
281
292
|
|
|
282
293
|
Current state: [where we are]
|
|
294
|
+
Progress: [pct]% ([done] of [total] steps complete; current step [n] of [total])
|
|
283
295
|
Suggested next: [/god-X]
|
|
284
296
|
|
|
285
297
|
Why: [one-line reason]
|
|
286
298
|
|
|
299
|
+
Path ahead:
|
|
300
|
+
1. Current: [tier/substep] - [status]
|
|
301
|
+
2. Next: [/god-X] - [why]
|
|
302
|
+
3. Then: [/god-Y or "recompute after gate"]
|
|
303
|
+
|
|
287
304
|
[If prereqs missing]:
|
|
288
305
|
Pre-flight: missing [prereq]
|
|
289
306
|
Auto-complete available: /god-Y
|
package/skills/god-status.md
CHANGED
|
@@ -33,6 +33,9 @@ Re-derive state from disk. Your memory is not authoritative. The file system is.
|
|
|
33
33
|
- If artifact exists but PROGRESS.md says "pending": FLAG as untracked work
|
|
34
34
|
6. Report:
|
|
35
35
|
- Current mode and scale
|
|
36
|
+
- Progress summary: percentage, completed step count, current step number
|
|
37
|
+
- What happened recently, using CHECKPOINT.md actions when available
|
|
38
|
+
- What happens next, using routing and disk state
|
|
36
39
|
- Per-tier status (with disk verification)
|
|
37
40
|
- Any inconsistencies between PROGRESS.md and disk
|
|
38
41
|
- Suggested next action
|
|
@@ -45,6 +48,17 @@ Godpowers Status
|
|
|
45
48
|
|
|
46
49
|
Mode: A (greenfield) Scale: medium
|
|
47
50
|
Started: 2026-05-09
|
|
51
|
+
Progress: 15% (2 of 13 steps complete; current step 3 of 13)
|
|
52
|
+
Current: Tier 1 Planning / Architecture
|
|
53
|
+
|
|
54
|
+
What happened recently:
|
|
55
|
+
1. PRD artifact verified on disk
|
|
56
|
+
2. Tier state refreshed from state.json
|
|
57
|
+
|
|
58
|
+
What happens next:
|
|
59
|
+
1. Run /god-arch
|
|
60
|
+
2. Verify architecture artifact
|
|
61
|
+
3. Recompute next gate with /god-next
|
|
48
62
|
|
|
49
63
|
Tier 1: Planning
|
|
50
64
|
+ PRD done .godpowers/prd/PRD.md (lint clean: 0 errors)
|
package/templates/PROGRESS.md
CHANGED
|
@@ -7,11 +7,33 @@ Mode: [A: greenfield | B: gap-fill | C: audit | D: multi-repo]
|
|
|
7
7
|
Scale: [trivial | small | medium | large | enterprise]
|
|
8
8
|
Started: [ISO 8601 timestamp]
|
|
9
9
|
Last updated: [ISO 8601 timestamp]
|
|
10
|
+
Progress: [0-100]% ([completed] of [total] steps complete; current step [n] of [total])
|
|
11
|
+
Current: [Tier N label] / [sub-step label]
|
|
10
12
|
|
|
11
13
|
## Project Description
|
|
12
14
|
|
|
13
15
|
[One paragraph from /god-init]
|
|
14
16
|
|
|
17
|
+
## Current Step
|
|
18
|
+
|
|
19
|
+
Why this now: [One sentence tied to disk state or the prior gate]
|
|
20
|
+
|
|
21
|
+
What will happen:
|
|
22
|
+
1. [Observable action]
|
|
23
|
+
2. [Observable action]
|
|
24
|
+
3. [Observable action, if needed]
|
|
25
|
+
|
|
26
|
+
Expected output: [Artifact path or verification result]
|
|
27
|
+
|
|
28
|
+
## Recent Step Results
|
|
29
|
+
|
|
30
|
+
What happened:
|
|
31
|
+
1. [Observable action completed]
|
|
32
|
+
2. [Artifact or state update]
|
|
33
|
+
3. [Verification result]
|
|
34
|
+
|
|
35
|
+
Next: [Next command or pause question]
|
|
36
|
+
|
|
15
37
|
## Tier Status
|
|
16
38
|
|
|
17
39
|
| Tier | Sub-step | Status | Artifact | Updated |
|