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 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
  [![CI](https://github.com/aihxp/godpowers/actions/workflows/ci.yml/badge.svg)](https://github.com/aihxp/godpowers/actions/workflows/ci.yml)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
5
- [![Version](https://img.shields.io/badge/version-1.6.6-blue)](CHANGELOG.md)
5
+ [![Version](https://img.shields.io/badge/version-1.6.8-blue)](CHANGELOG.md)
6
6
  [![npm](https://img.shields.io/npm/v/godpowers.svg)](https://www.npmjs.com/package/godpowers)
7
7
 
8
8
  **Ship fast. Ship right. Ship everything. Ship accountably.**
@@ -12,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.6 keeps the stable Godpowers surface while making more Codex
16
- orchestrator spawns transcript-safe: `/god-mode`, `/god-init`, and Mode D
17
- suite coordinator paths now use private handoff files with small display-safe
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.6 Release
1
+ # Godpowers 1.6.8 Release
2
2
 
3
3
  Date: 2026-05-16
4
4
 
5
- Godpowers 1.6.6 extends transcript-safe spawn handling beyond `/god-mode`.
6
- The goal of this patch is to keep Codex-visible spawn messages small and safe
7
- for `/god-init` and Mode D suite coordination while preserving the same
8
- orchestrator and coordinator behavior.
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
- - `/god-init` now writes detailed initialization context to
31
- `.godpowers/runs/<run-id>/INIT-ORCHESTRATOR-HANDOFF.md` before spawning
32
- `god-orchestrator`.
33
- - `/god-suite-init`, `/god-suite-release`, and `/god-suite-patch` now write
34
- suite coordination context to
35
- `.godpowers/runs/<run-id>/COORDINATOR-HANDOFF.md` before spawning
36
- `god-coordinator`.
37
- - `god-coordinator` now writes per-repo orchestrator context to
38
- `.godpowers/runs/<run-id>/COORDINATOR-ORCHESTRATOR-HANDOFF.md` before
39
- spawning a target repo's `god-orchestrator`.
40
- - `god-orchestrator` now treats handoff files as a general caller protocol,
41
- not only as a `/god-mode` protocol.
42
- - `/god-hygiene` routing no longer lists `god-orchestrator` as a secondary
43
- spawn because the skill only runs artifact, dependency, and documentation
44
- audits.
45
-
46
- ## What 1.6.6 means
47
-
48
- Godpowers 1.6.6 does not expand the public command surface. It fixes more
49
- Codex spawn integration paths so the right agent is still started, but the host
50
- UI only sees a small pointer to disk state instead of raw project description,
51
- suite metadata, release notes, patch directives, dependency graphs, routing
52
- rules, or local-file details.
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.6` git tag points to the release commit that matches the npm
63
- `godpowers@1.6.6` package. Public publishes should prefer the tag-triggered
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 first pause: ask only for `STAGING_APP_URL=<staging-origin>` so the
69
- real smoke command can run. Do not ask for provider keys, API tokens,
70
- dashboards, DNS tokens, production secrets, admin consoles, or test users
71
- until a named deploy, smoke, rollback, health, callback, webhook, export, or
72
- observability check cannot run without that exact item.
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 all provider keys before the staging URL smoke check has run
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 `waiting-for-external-access`.
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 `STAGING_APP_URL=<deployed staging origin>`.
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. Only pause when real external access is required and absent. The pause must
403
- ask for the smallest next input needed to run the next concrete check. The
404
- first pause should usually ask only for the deployed staging origin, for
405
- example `STAGING_APP_URL=<staging-origin>`. Do not ask for API keys,
406
- provider dashboards, DNS tokens, production secrets, or admin consoles until
407
- a specific scripted check cannot run without that exact access.
408
- 7. Do not say "Suggested next" for a blocked shipping tier. Say either
409
- `Arc complete` or `PAUSE: external access required`, with the exact artifact
410
- that lists the required bundle.
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. Ask for the deployed staging origin only if no live target URL is known from
417
- explicit evidence.
418
- 2. Run the real staging smoke command against that origin.
419
- 3. Ask for a provider key, dashboard, admin console, or test user only when a
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
- 4. Add at most one new access item per pause unless several items are required
442
+ 5. Add at most one new access item per pause unless several items are required
423
443
  by the same command invocation.
424
- 5. Every access request must include the command that will run next and the
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 and pause
445
- for `STAGING_APP_URL=<deployed staging origin>` before deployed staging smoke.
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. Spawn the appropriate specialist agent in a fresh context
474
- 5. Verify their output exists on disk
475
- 6. Run have-nots check on the artifact
476
- 7. If pass: update PROGRESS.md, move to next sub-step
477
- 8. If fail and repairable: enter the autonomous repair loop
478
- 9. If fail and human-only: pause with the smallest needed question
479
- 10. Repeat until all tiers complete and verification is green
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>` rather than showing the Shipping
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 = RUNTIMES[runtimeKey];
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.endsWith('.md')) {
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 = RUNTIMES[runtimeKey];
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 claude global
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 global install');
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.endsWith('.md')).length;
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
- return {
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: first one with status in-flight,
309
- // else last one done, else tier-0/orchestration.
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
- outer: for (const tierKey of Object.keys(s.tiers).sort()) {
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
- module.exports = { read, write, init, updateSubStep, hashFile, detectDrift, statePath };
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.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/",
@@ -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
- - paused on `.godpowers/deploy/WAITING-FOR-EXTERNAL-ACCESS.md` with one
31
- exact missing access bundle
32
- 4. Update `.godpowers/PROGRESS.md`: Deploy status = done only for a tested real
33
- target or tested local staging harness. If external access is missing, mark
34
- Deploy = waiting-for-external-access, not done.
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, pause on the single access bundle in
48
- `.godpowers/deploy/WAITING-FOR-EXTERNAL-ACCESS.md`.
49
-
50
- The single access bundle must be incremental. Ask for the smallest next item
51
- needed to run the next command. If no live target URL is known, ask only for
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 and pause for `STAGING_APP_URL=<deployed staging origin>`. If only
63
- production is known, do not use it as staging without explicit user approval.
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
@@ -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
- pause on the single access bundle from deploy or launch state.
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. If no
60
- live target URL is known, ask only for `STAGING_APP_URL=<staging-origin>`.
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.
@@ -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. Produce single-screen orientation summary.
77
- 6. Append `op:locate` event to events.jsonl.
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
 
@@ -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 and pause only
98
- for one exact external access bundle.
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. The first external pause
101
- should ask only for the smallest next item needed by a concrete command,
102
- usually `STAGING_APP_URL=<staging-origin>`. Ask for additional provider
103
- access only after a named check proves it is needed.
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, pause for
108
- `STAGING_APP_URL=<deployed staging origin>`.
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>` instead of exposing the full
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
 
@@ -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
@@ -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)
@@ -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 |