godpowers 1.6.10 → 1.6.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,296 @@
1
+ /**
2
+ * Godpowers Dashboard
3
+ *
4
+ * Shared executable status engine for /god-status, /god-next, /god-sync,
5
+ * /god-scan, and /god-mode closeouts. Disk state is authoritative.
6
+ */
7
+
8
+ const fs = require('fs');
9
+ const path = require('path');
10
+ const cp = require('child_process');
11
+
12
+ const state = require('./state');
13
+ const router = require('./router');
14
+
15
+ const GOD_DIR = '.godpowers';
16
+ const PRD_PATH = '.godpowers/prd/PRD.md';
17
+ const ROADMAP_PATH = '.godpowers/roadmap/ROADMAP.md';
18
+ const CHECKPOINT_PATH = '.godpowers/CHECKPOINT.md';
19
+ const SYNC_LOG_PATH = '.godpowers/SYNC-LOG.md';
20
+ const REVIEW_PATH = '.godpowers/REVIEW-REQUIRED.md';
21
+
22
+ function exists(projectRoot, relPath) {
23
+ return fs.existsSync(path.join(projectRoot, relPath));
24
+ }
25
+
26
+ function readText(projectRoot, relPath) {
27
+ const file = path.join(projectRoot, relPath);
28
+ if (!fs.existsSync(file)) return '';
29
+ return fs.readFileSync(file, 'utf8');
30
+ }
31
+
32
+ function mtimeMs(projectRoot, relPath) {
33
+ const file = path.join(projectRoot, relPath);
34
+ if (!fs.existsSync(file)) return null;
35
+ return fs.statSync(file).mtimeMs;
36
+ }
37
+
38
+ function artifactStatus(projectRoot, relPath) {
39
+ return exists(projectRoot, relPath) ? 'done' : 'missing';
40
+ }
41
+
42
+ function currentPhase(progress) {
43
+ const current = progress && progress.current;
44
+ if (!current) {
45
+ return {
46
+ phase: 'Complete',
47
+ tierKey: null,
48
+ tierNumber: null,
49
+ tierTotal: 0,
50
+ tierOrdinal: 0,
51
+ tierCount: 0,
52
+ tierLabel: 'Complete',
53
+ stepLabel: 'Complete',
54
+ stepNumber: 0,
55
+ totalSteps: progress ? progress.total : 0
56
+ };
57
+ }
58
+
59
+ const tierNumbers = (progress.tiers || [])
60
+ .map(tier => tier.tierNumber)
61
+ .filter(n => Number.isFinite(n))
62
+ .sort((a, b) => a - b);
63
+ const tierTotal = tierNumbers.length > 0 ? Math.max(...tierNumbers) : current.tierNumber;
64
+ const tierOrdinal = tierNumbers.indexOf(current.tierNumber) + 1;
65
+ const tierCount = tierNumbers.length || (Number.isFinite(current.tierNumber) ? current.tierNumber + 1 : 0);
66
+
67
+ return {
68
+ phase: current.tierLabel,
69
+ tierKey: current.tierKey,
70
+ tierNumber: current.tierNumber,
71
+ tierTotal,
72
+ tierOrdinal: tierOrdinal > 0 ? tierOrdinal : 1,
73
+ tierCount,
74
+ tierLabel: current.tierLabel,
75
+ stepLabel: current.subStepLabel,
76
+ stepNumber: current.ordinal,
77
+ totalSteps: progress.total
78
+ };
79
+ }
80
+
81
+ function worktree(projectRoot) {
82
+ try {
83
+ const out = cp.execFileSync('git', ['status', '--porcelain'], {
84
+ cwd: projectRoot,
85
+ encoding: 'utf8',
86
+ stdio: ['ignore', 'pipe', 'ignore']
87
+ });
88
+ return parseGitStatus(out);
89
+ } catch (e) {
90
+ return { worktree: 'unknown', index: 'unknown', entries: [] };
91
+ }
92
+ }
93
+
94
+ function parseGitStatus(out) {
95
+ if (!out || !out.trim()) {
96
+ return { worktree: 'clean', index: 'untouched', entries: [] };
97
+ }
98
+ const entries = out.split(/\r?\n/).filter(Boolean);
99
+ const staged = entries.filter(line => line[0] !== ' ' && line[0] !== '?');
100
+ const unstaged = entries.filter(line => line[1] !== ' ' || line.startsWith('??'));
101
+ let worktreeState = 'modified files unstaged';
102
+ if (staged.length > 0 && unstaged.length > 0) worktreeState = 'mixed';
103
+ else if (staged.length > 0) worktreeState = 'staged changes';
104
+ return {
105
+ worktree: worktreeState,
106
+ index: staged.length > 0 ? staged.map(statusPath).join(', ') : 'untouched',
107
+ entries
108
+ };
109
+ }
110
+
111
+ function statusPath(line) {
112
+ if (line.startsWith('?? ')) return line.slice(3);
113
+ return line.length > 3 ? line.slice(3) : line.trim();
114
+ }
115
+
116
+ function reviewCount(projectRoot) {
117
+ const text = readText(projectRoot, REVIEW_PATH);
118
+ if (!text.trim()) return 0;
119
+ const unchecked = (text.match(/\[\s\]\s*(?:TODO|PENDING|OPEN|REVIEW|BLOCKER|[Pp][0-3])/g) || []).length;
120
+ if (unchecked > 0) return unchecked;
121
+ const headings = (text.match(/^###\s+/gm) || []).length;
122
+ return headings;
123
+ }
124
+
125
+ function hasRecentPath(projectRoot, relPath, maxAgeMs) {
126
+ const modified = mtimeMs(projectRoot, relPath);
127
+ if (!modified) return false;
128
+ return Date.now() - modified <= maxAgeMs;
129
+ }
130
+
131
+ function proactiveChecks(projectRoot, changedFiles = []) {
132
+ const oneDay = 24 * 60 * 60 * 1000;
133
+ const thirtyDays = 30 * oneDay;
134
+ const reviews = reviewCount(projectRoot);
135
+
136
+ const checkpoint = exists(projectRoot, CHECKPOINT_PATH)
137
+ ? (hasRecentPath(projectRoot, CHECKPOINT_PATH, oneDay) ? 'fresh' : 'stale')
138
+ : 'missing';
139
+
140
+ const sync = exists(projectRoot, SYNC_LOG_PATH)
141
+ ? (hasRecentPath(projectRoot, SYNC_LOG_PATH, oneDay) ? 'fresh' : 'stale, suggest /god-sync')
142
+ : 'missing, suggest /god-sync';
143
+
144
+ const hygieneFresh = exists(projectRoot, CHECKPOINT_PATH)
145
+ && hasRecentPath(projectRoot, CHECKPOINT_PATH, thirtyDays);
146
+
147
+ const pkgChanged = changedFiles.some(file => [
148
+ 'package.json',
149
+ 'package-lock.json',
150
+ 'pnpm-lock.yaml',
151
+ 'yarn.lock'
152
+ ].includes(file));
153
+ const sensitiveChanged = changedFiles.some(file => matchesAnyPrefix(file, [
154
+ '.env.example',
155
+ 'SECURITY.md',
156
+ '.github/workflows',
157
+ 'auth',
158
+ 'security'
159
+ ]));
160
+
161
+ return {
162
+ checkpoint,
163
+ reviews: reviews > 0 ? `${reviews} pending, suggest /god-review-changes` : 'none',
164
+ sync,
165
+ docs: 'fresh',
166
+ runtime: 'not-applicable',
167
+ security: sensitiveChanged ? 'sensitive files changed, suggest /god-harden' : 'clear',
168
+ dependencies: pkgChanged ? 'dependency files changed, suggest /god-update-deps' : 'clear',
169
+ hygiene: hygieneFresh ? 'fresh' : 'stale, suggest /god-hygiene'
170
+ };
171
+ }
172
+
173
+ function matchesAnyPrefix(file, prefixes) {
174
+ return prefixes.some(prefix => file === prefix || file.startsWith(`${prefix}/`));
175
+ }
176
+
177
+ function planningVisibility(projectRoot, progress) {
178
+ const prd = artifactStatus(projectRoot, PRD_PATH);
179
+ const roadmap = artifactStatus(projectRoot, ROADMAP_PATH);
180
+ const phase = currentPhase(progress);
181
+ return {
182
+ prd: { status: prd, path: prd === 'done' ? PRD_PATH : null },
183
+ roadmap: { status: roadmap, path: roadmap === 'done' ? ROADMAP_PATH : null },
184
+ currentMilestone: phase.stepLabel ? `${phase.phase} / ${phase.stepLabel}` : phase.phase,
185
+ completion: `${progress.percent}% based on state.json tracked steps`
186
+ };
187
+ }
188
+
189
+ function compute(projectRoot, opts = {}) {
190
+ const s = state.read(projectRoot);
191
+ const git = opts.git === false ? { worktree: 'not-checked', index: 'not-checked', entries: [] } : worktree(projectRoot);
192
+
193
+ if (!s) {
194
+ const next = { command: '/god-init', reason: 'No Godpowers project initialized' };
195
+ return {
196
+ state: 'not initialized',
197
+ mode: null,
198
+ lifecycle: 'pre-init',
199
+ progress: { percent: 0, completed: 0, total: 0, currentStep: 0, current: null, tiers: [] },
200
+ current: currentPhase(null),
201
+ worktree: git.worktree,
202
+ index: git.index,
203
+ planning: {
204
+ prd: { status: 'missing', path: null },
205
+ roadmap: { status: 'missing', path: null },
206
+ currentMilestone: 'Project initialization',
207
+ completion: '0% based on missing state.json'
208
+ },
209
+ proactive: proactiveChecks(projectRoot, git.entries.map(statusPath)),
210
+ next,
211
+ openItems: ['No .godpowers/state.json found']
212
+ };
213
+ }
214
+
215
+ const progress = state.progressSummary(s);
216
+ const current = currentPhase(progress);
217
+ const next = router.suggestNext(projectRoot);
218
+ const openItems = [];
219
+ const drift = state.detectDrift(projectRoot);
220
+
221
+ if (drift.length > 0) openItems.push(`${drift.length} artifact drift item(s), suggest /god-repair`);
222
+ if (next && next.blocker) openItems.push(`${next.blocker} blocks next route`);
223
+ if (reviewCount(projectRoot) > 0) openItems.push('pending review items');
224
+ if (openItems.length === 0) openItems.push('none');
225
+
226
+ return {
227
+ state: progress.remaining === 0 ? 'complete' : 'in progress',
228
+ mode: s.mode || s['mode-announced-as'] || null,
229
+ lifecycle: s['lifecycle-phase'] || 'in-arc',
230
+ progress,
231
+ current,
232
+ worktree: git.worktree,
233
+ index: git.index,
234
+ planning: planningVisibility(projectRoot, progress),
235
+ proactive: proactiveChecks(projectRoot, git.entries.map(statusPath)),
236
+ next,
237
+ openItems
238
+ };
239
+ }
240
+
241
+ function render(dashboard) {
242
+ const current = dashboard.current || {};
243
+ const planning = dashboard.planning || {};
244
+ const proactive = dashboard.proactive || {};
245
+ const next = dashboard.next || {};
246
+ const progress = dashboard.progress || {};
247
+ const prd = planning.prd || {};
248
+ const roadmap = planning.roadmap || {};
249
+ const openItems = dashboard.openItems && dashboard.openItems.length > 0
250
+ ? dashboard.openItems
251
+ : ['none'];
252
+
253
+ return [
254
+ 'Godpowers Dashboard',
255
+ '',
256
+ 'Current status:',
257
+ ` State: ${dashboard.state}`,
258
+ ` Phase: ${current.phase || 'unknown'}${current.tierNumber !== null && current.tierNumber !== undefined ? ` (tier ${current.tierOrdinal} of ${current.tierCount}, internal ${current.tierKey || `tier-${current.tierNumber}`})` : ''}`,
259
+ ` Step: ${current.stepLabel || 'unknown'}${current.stepNumber ? ` (step ${current.stepNumber} of ${current.totalSteps})` : ''}`,
260
+ ` Progress: ${progress.percent || 0}% (${progress.completed || 0} of ${progress.total || 0} steps complete)`,
261
+ ` Worktree: ${dashboard.worktree}`,
262
+ ` Index: ${dashboard.index}`,
263
+ '',
264
+ 'Planning visibility:',
265
+ ` PRD: ${prd.status || 'missing'}${prd.path ? ` ${prd.path}` : ''}`,
266
+ ` Roadmap: ${roadmap.status || 'missing'}${roadmap.path ? ` ${roadmap.path}` : ''}`,
267
+ ` Current milestone: ${planning.currentMilestone || 'unknown'}`,
268
+ ` Completion: ${planning.completion || 'unknown'}`,
269
+ '',
270
+ 'Proactive checks:',
271
+ ` Checkpoint: ${proactive.checkpoint || 'unknown'}`,
272
+ ` Reviews: ${proactive.reviews || 'unknown'}`,
273
+ ` Sync: ${proactive.sync || 'unknown'}`,
274
+ ` Docs: ${proactive.docs || 'unknown'}`,
275
+ ` Runtime: ${proactive.runtime || 'unknown'}`,
276
+ ` Security: ${proactive.security || 'unknown'}`,
277
+ ` Dependencies: ${proactive.dependencies || 'unknown'}`,
278
+ ` Hygiene: ${proactive.hygiene || 'unknown'}`,
279
+ '',
280
+ 'Open items:',
281
+ ...openItems.map((item, index) => ` ${index + 1}. ${item}`),
282
+ '',
283
+ 'Next:',
284
+ ` Recommended: ${next.command || 'describe the next intent'}`,
285
+ ` Why: ${next.reason || 'No route was computed.'}`
286
+ ].join('\n');
287
+ }
288
+
289
+ module.exports = {
290
+ compute,
291
+ render,
292
+ worktree,
293
+ parseGitStatus,
294
+ proactiveChecks,
295
+ planningVisibility
296
+ };
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "godpowers",
3
- "version": "1.6.10",
3
+ "version": "1.6.12",
4
4
  "description": "AI-powered development system: 106 slash commands and 39 specialist agents that take a project from raw idea to hardened production. Runs inside Claude Code, Codex, Cursor, Windsurf, Gemini, and 10+ other AI coding tools.",
5
5
  "bin": {
6
6
  "godpowers": "./bin/install.js"
7
7
  },
8
8
  "scripts": {
9
- "test": "node scripts/validate-skills.js && node scripts/test-doc-surface-counts.js && bash scripts/smoke.sh && node scripts/test-runtime.js && node scripts/test-router.js && node scripts/test-recipes.js && node scripts/test-context-writer.js && node scripts/test-pillars.js && node scripts/test-artifact-linter.js && node scripts/test-artifact-diff.js && node scripts/test-design-foundation.js && node scripts/test-linkage.js && node scripts/test-impact.js && node scripts/test-reverse-sync.js && node scripts/test-integration.js && node scripts/test-cross-artifact.js && node scripts/test-awesome-design.js && node scripts/test-skillui-bridge.js && node scripts/test-runtime-verification.js && node scripts/test-agent-browser.js && node scripts/test-mode-d.js && node scripts/test-runtime-heuristics.js && node scripts/test-agent-validator.js && node scripts/test-story-validator.js && node scripts/test-state.js && node scripts/test-intent.js && node scripts/test-events.js && node scripts/test-golden-artifacts.js && node scripts/test-install-smoke.js && node scripts/test-checkpoint.js && node scripts/test-extensions.js && node scripts/test-event-reader.js && node scripts/test-state-lock.js && node scripts/test-cost-saver.js && node scripts/test-budget-onoff.js && node scripts/test-workflow-runner.js && npm run test:e2e && node scripts/test-otel-exporter.js && node scripts/test-extensions-publish.js",
9
+ "test": "node scripts/validate-skills.js && node scripts/test-doc-surface-counts.js && bash scripts/smoke.sh && node scripts/test-runtime.js && node scripts/test-router.js && node scripts/test-recipes.js && node scripts/test-context-writer.js && node scripts/test-pillars.js && node scripts/test-artifact-linter.js && node scripts/test-artifact-diff.js && node scripts/test-design-foundation.js && node scripts/test-linkage.js && node scripts/test-impact.js && node scripts/test-reverse-sync.js && node scripts/test-integration.js && node scripts/test-cross-artifact.js && node scripts/test-awesome-design.js && node scripts/test-skillui-bridge.js && node scripts/test-runtime-verification.js && node scripts/test-agent-browser.js && node scripts/test-mode-d.js && node scripts/test-runtime-heuristics.js && node scripts/test-agent-validator.js && node scripts/test-story-validator.js && node scripts/test-state.js && node scripts/test-dashboard.js && node scripts/test-intent.js && node scripts/test-events.js && node scripts/test-golden-artifacts.js && node scripts/test-install-smoke.js && node scripts/test-checkpoint.js && node scripts/test-extensions.js && node scripts/test-event-reader.js && node scripts/test-state-lock.js && node scripts/test-cost-saver.js && node scripts/test-budget-onoff.js && node scripts/test-workflow-runner.js && npm run test:e2e && node scripts/test-otel-exporter.js && node scripts/test-extensions-publish.js",
10
10
  "prepublishOnly": "npm test",
11
11
  "validate-skills": "node scripts/validate-skills.js",
12
12
  "test:surface": "node scripts/test-doc-surface-counts.js",
@@ -9,7 +9,7 @@ description: |
9
9
 
10
10
  # /god-arch
11
11
 
12
- Spawn the **god-architect** agent in a fresh context via Task tool.
12
+ Spawn the **god-architect** agent in a fresh context via the host platform's native agent spawning mechanism.
13
13
 
14
14
  ## Setup
15
15
 
@@ -9,7 +9,7 @@ description: |
9
9
 
10
10
  # /god-audit
11
11
 
12
- Spawn the **god-auditor** agent in a fresh context via Task tool.
12
+ Spawn the **god-auditor** agent in a fresh context via the host platform's native agent spawning mechanism.
13
13
 
14
14
  ## Setup
15
15
 
@@ -9,7 +9,7 @@ description: |
9
9
 
10
10
  # /god-debug
11
11
 
12
- Spawn the **god-debugger** agent in a fresh context via Task tool.
12
+ Spawn the **god-debugger** agent in a fresh context via the host platform's native agent spawning mechanism.
13
13
 
14
14
  ## Setup
15
15
 
@@ -9,7 +9,7 @@ description: |
9
9
 
10
10
  # /god-deploy
11
11
 
12
- Spawn the **god-deploy-engineer** agent in a fresh context via Task tool.
12
+ Spawn the **god-deploy-engineer** agent in a fresh context via the host platform's native agent spawning mechanism.
13
13
 
14
14
  ## Setup
15
15
 
@@ -48,6 +48,28 @@ Update log: .godpowers/docs/UPDATE-LOG.md
48
48
  Suggested next: /god-status or continue with feature work
49
49
  ```
50
50
 
51
+ ## Proactive docs drift
52
+
53
+ Godpowers may invoke docs work proactively in two ways:
54
+
55
+ | Trigger | Action | Guardrail |
56
+ |---|---|---|
57
+ | Docs changed after code changed | Spawn `god-docs-writer` in drift-check mode when current workflow owns docs | Do not invent new docs scope |
58
+ | Code changed after docs that claim current behavior | Suggest `/god-docs` or spawn drift-check inside `/god-mode`, `/god-feature`, `/god-refactor`, or `/god-sync` closeout | Verify claims against code before editing |
59
+ | `REVIEW-REQUIRED.md` contains docs drift items | Suggest `/god-review-changes` first | Do not auto-clear review items |
60
+
61
+ When auto-invoked, show:
62
+
63
+ ```text
64
+ Auto-invoked:
65
+ Trigger: docs and code changed in the same workflow
66
+ Agent: god-docs-writer
67
+ Local syncs:
68
+ + docs-drift-check: <N claims checked, N drift items>
69
+ Artifacts: .godpowers/docs/UPDATE-LOG.md or no-op
70
+ Log: .godpowers/docs/UPDATE-LOG.md
71
+ ```
72
+
51
73
  ## Have-Nots
52
74
 
53
75
  Docs FAIL if:
@@ -9,7 +9,7 @@ description: |
9
9
 
10
10
  # /god-harden
11
11
 
12
- Spawn the **god-harden-auditor** agent in a fresh context via Task tool.
12
+ Spawn the **god-harden-auditor** agent in a fresh context via the host platform's native agent spawning mechanism.
13
13
 
14
14
  ## Setup
15
15
 
@@ -9,7 +9,7 @@ description: |
9
9
 
10
10
  # /god-launch
11
11
 
12
- Spawn the **god-launch-strategist** agent in a fresh context via Task tool.
12
+ Spawn the **god-launch-strategist** agent in a fresh context via the host platform's native agent spawning mechanism.
13
13
 
14
14
  ## Setup
15
15
 
@@ -125,7 +125,7 @@ workflow.
125
125
  unresolved Critical harden findings. These are release-truth gates, not
126
126
  preference pauses.
127
127
 
128
- 6. Spawn the **god-orchestrator** agent via Task tool with only a
128
+ 6. Spawn the **god-orchestrator** agent via the host platform's native agent spawning mechanism with only a
129
129
  display-safe payload:
130
130
  - Name the project root.
131
131
  - Name the invocation flags.
@@ -137,7 +137,7 @@ workflow.
137
137
  hidden routing rules, or detailed instructions in the spawn message.
138
138
  Assume the host UI may display the raw spawn message to the user.
139
139
 
140
- 7. Keep the spawn payload display-safe. Do not echo or summarize raw Task input,
140
+ 7. Keep the spawn payload display-safe. Do not echo or summarize raw spawn input,
141
141
  "Hard instructions", hidden orchestration rules, agent prompts, file
142
142
  loadout lists, or internal routing payloads into the user-visible transcript.
143
143
  The visible transcript may say only what phase is running, what durable state
@@ -169,6 +169,8 @@ Show:
169
169
  - detected resume or project mode in plain language
170
170
  - a compact "Next step" card before each visible phase or tier sub-step
171
171
  - a compact "Step result" card after each visible phase or tier sub-step
172
+ - every auto-invoked command, agent, and local runtime helper using an
173
+ `Auto-invoked:` or `Sync status:` card
172
174
  - plain-language workflow names. Say "project run" or "workflow" instead of
173
175
  unexplained "arc" in visible output
174
176
  - PRD and roadmap visibility in status and closeout blocks when artifacts
@@ -176,11 +178,12 @@ Show:
176
178
  - short progress updates for phases, commands, validations, and file edits
177
179
  - concise validation summaries instead of full command noise when possible
178
180
  - final changed paths, validation results, and completion or pause status
179
- - final current status, open items, worktree/index state, and recommended next
180
- action
181
+ - final Godpowers Dashboard from disk, including phase, tier, step, progress,
182
+ planning visibility, proactive checks, open items, worktree/index state, and
183
+ recommended next action
181
184
 
182
185
  Hide:
183
- - raw Task input
186
+ - raw spawn input
184
187
  - "Hard instructions" sections
185
188
  - spawned-agent prompt text
186
189
  - detailed handoff file contents
@@ -200,11 +203,11 @@ missing them, synthesize them from disk state before continuing.
200
203
 
201
204
  Before work starts:
202
205
 
203
- ```
206
+ ```text
204
207
  Next step
205
- Progress: <pct>% (<done> of <total> steps complete; current step <n> of <total>)
206
- Tier: <tier-number> <tier-label>
208
+ Phase: <plain-language phase> (tier <human ordinal> of <human total>)
207
209
  Step: <sub-step-label>
210
+ Progress: <pct>% (<done> of <total> steps complete; step <n> of <total>)
208
211
  Why this now: <one sentence>
209
212
  What will happen:
210
213
  1. <observable action>
@@ -214,11 +217,11 @@ Expected output: <artifact path or verification result>
214
217
 
215
218
  After work completes or pauses:
216
219
 
217
- ```
220
+ ```text
218
221
  Step result
219
- Progress: <pct>% (<done> of <total> steps complete; current step <n> of <total>)
220
- Tier: <tier-number> <tier-label>
222
+ Phase: <plain-language phase> (tier <human ordinal> of <human total>)
221
223
  Step: <sub-step-label>
224
+ Progress: <pct>% (<done> of <total> steps complete; step <n> of <total>)
222
225
  Result: <done | blocked | failed | skipped | imported>
223
226
  What happened:
224
227
  1. <observable action completed>
@@ -294,6 +297,21 @@ Under `--yolo`, the sync step auto-applies (no pause). Under
294
297
  `--conservative`, it pauses for confirmation. Under `--with-hygiene`,
295
298
  it runs alongside the hygiene pass.
296
299
 
300
+ Display this before the final completion block:
301
+
302
+ ```
303
+ Sync status:
304
+ Trigger: /god-mode final sync
305
+ Agent: god-updater spawned
306
+ Local syncs:
307
+ + reverse-sync: <counts and result>
308
+ + pillars-sync: <counts and result>
309
+ + checkpoint-sync: <created, updated, no-op, or skipped>
310
+ + context-refresh: <spawned, no-op, or skipped>
311
+ Artifacts: <changed files or no-op>
312
+ Log: .godpowers/SYNC-LOG.md
313
+ ```
314
+
297
315
  The sync step also reconciles native Pillars context. When `.godpowers`
298
316
  artifacts create or change durable project truth, Godpowers maps those changes
299
317
  to relevant pillar files through `lib/pillars.planArtifactSync`. Default mode
@@ -315,6 +333,17 @@ When orchestrator returns "complete", display:
315
333
  ```
316
334
  Godpowers project run complete.
317
335
 
336
+ Sync status:
337
+ Trigger: /god-mode final sync
338
+ Agent: god-updater spawned
339
+ Local syncs:
340
+ + reverse-sync: <counts and result>
341
+ + pillars-sync: <counts and result>
342
+ + checkpoint-sync: <created, updated, no-op, or skipped>
343
+ + context-refresh: <spawned, no-op, or skipped>
344
+ Artifacts: <changed files or no-op>
345
+ Log: .godpowers/SYNC-LOG.md
346
+
318
347
  Current status:
319
348
  State: complete
320
349
  Progress: <pct>% (<done> of <total> steps complete; current step <n> of <total>)
@@ -22,6 +22,9 @@ Before reading routing data or calling runtime modules, resolve the Godpowers ru
22
22
  1. If `<projectRoot>/lib/router.js` exists, use the repository checkout runtime at `<projectRoot>`.
23
23
  2. Otherwise use the installed bundle at `<tool-config-dir>/godpowers-runtime`, where `<tool-config-dir>` is the directory that contains this installed skill, such as `~/.claude`, `~/.codex`, `~/.cursor`, `~/.windsurf`, or `~/.gemini`.
24
24
  3. Read routing definitions from `<runtimeRoot>/routing/*.yaml` and recipes from `<runtimeRoot>/routing/recipes/*.yaml`.
25
+ 4. For status output, load `<runtimeRoot>/lib/dashboard.js` and call
26
+ `dashboard.compute(projectRoot)`. Use `dashboard.render(result)` for the
27
+ shared dashboard section before adding route-specific detail.
25
28
 
26
29
  ## Three modes of invocation
27
30
 
@@ -168,6 +171,42 @@ Planning visibility:
168
171
  Completion: <pct>% <basis from state.json or PROGRESS.md>
169
172
  ```
170
173
 
174
+ ## Proactive Sweep
175
+
176
+ Before returning a suggestion, run the proactive auto-invoke policy from the
177
+ master skill against disk state. This is read-only unless a Level 2 local helper
178
+ has a direct trigger.
179
+
180
+ Check these signals:
181
+ - `.godpowers/CHECKPOINT.md` missing, stale, or conflicting with `state.json`
182
+ - `.godpowers/REVIEW-REQUIRED.md` contains pending entries
183
+ - `.godpowers/SYNC-LOG.md` missing after code or artifact edits
184
+ - docs changed after code changed, or code changed after docs that claim
185
+ current behavior
186
+ - frontend-visible files changed and a known local, preview, staging, or
187
+ production URL is evidenced
188
+ - security-sensitive files changed
189
+ - dependency files changed
190
+ - full project run completed and hygiene has not run recently
191
+
192
+ Display the result:
193
+
194
+ ```text
195
+ Proactive checks:
196
+ Checkpoint: <fresh | refreshed | stale, suggest /god-locate>
197
+ Reviews: <none | N pending, suggest /god-review-changes>
198
+ Sync: <fresh | suggest /god-sync | local linkage scan ran>
199
+ Docs: <fresh | suggest /god-docs | drift-check spawned>
200
+ Runtime: <not-applicable | suggest /god-test-runtime | browser test spawned>
201
+ Security: <clear | suggest /god-harden>
202
+ Dependencies: <clear | suggest /god-update-deps>
203
+ Hygiene: <fresh | suggest /god-hygiene>
204
+ ```
205
+
206
+ Do not auto-run Level 3 agents from standalone `/god-next` unless the user
207
+ explicitly asked it to continue work. In standalone mode, Level 3 items become
208
+ the recommended command or a proposition option.
209
+
171
210
  ## Process for Mode 4 (intent-based)
172
211
 
173
212
  ```
@@ -297,11 +336,31 @@ recommending archaeology, reconstruction, project-run readiness, pillars, or ref
297
336
 
298
337
  ## Output Format
299
338
 
300
- ```
339
+ `/god-next` must emit the same Godpowers Dashboard shape used by
340
+ `/god-status`, then add routing detail and the proposition block.
341
+ Prefer the executable `lib/dashboard.js` output over manually recomputing the
342
+ same fields. If the module is unavailable, say
343
+ `Dashboard engine: unavailable, manual scan used`.
344
+
345
+ ```text
301
346
  Godpowers Next
302
347
 
303
- Current state: [where we are]
304
- Progress: [pct]% ([done] of [total] steps complete; current step [n] of [total])
348
+ Godpowers Dashboard
349
+
350
+ Current status:
351
+ State: proposal
352
+ Phase: [plain-language phase] (tier [human ordinal] of [human total])
353
+ Step: [current step label] (step [n] of [total steps])
354
+ Progress: [pct]% ([done] of [total] steps complete)
355
+ Worktree: [clean | modified files unstaged | staged changes | mixed]
356
+ Index: [untouched | staged files listed]
357
+
358
+ Planning visibility:
359
+ PRD: [done | pending | missing | deferred] [path when present]
360
+ Roadmap: [done | pending | missing | deferred] [path when present]
361
+ Current milestone: [roadmap milestone, phase, tier, or next planning gate]
362
+ Completion: [pct]% [basis from state.json, PROGRESS.md, or artifacts]
363
+
305
364
  Suggested next: [/god-X]
306
365
 
307
366
  Why: [one-line reason]
@@ -321,6 +380,23 @@ Previous tier had standards failures. Address before proceeding:
321
380
  - [failure 1]
322
381
  - [failure 2]
323
382
  Suggested: /god-redo [tier] OR /god-skip [tier] --reason="..."
383
+
384
+ Proactive checks:
385
+ Checkpoint: [fresh | refreshed | missing | stale]
386
+ Reviews: [none | N pending, suggest /god-review-changes]
387
+ Sync: [fresh | missing | stale | local helper ran | suggest /god-sync]
388
+ Docs: [fresh | possible drift, suggest /god-docs]
389
+ Runtime: [not-applicable | known URL, suggest /god-test-runtime | no known URL, defer deployed verification]
390
+ Security: [clear | sensitive files changed, suggest /god-harden]
391
+ Dependencies: [clear | dependency files changed, suggest /god-update-deps]
392
+ Hygiene: [fresh | stale, suggest /god-hygiene]
393
+
394
+ Open items:
395
+ 1. [missing prerequisite, blocker, pending review, or none]
396
+
397
+ Next:
398
+ Recommended: [/god-X or exact user decision]
399
+ Why: [one sentence tied to disk state]
324
400
  ```
325
401
 
326
402
  ## Proposition Closeout
@@ -9,7 +9,7 @@ description: |
9
9
 
10
10
  # /god-observe
11
11
 
12
- Spawn the **god-observability-engineer** agent in a fresh context via Task tool.
12
+ Spawn the **god-observability-engineer** agent in a fresh context via the host platform's native agent spawning mechanism.
13
13
 
14
14
  ## Setup
15
15
 
@@ -30,7 +30,7 @@ Get multiple specialist perspectives on a single question.
30
30
  - Harden auditor (god-harden-auditor) - security implications
31
31
  - Launch strategist (god-launch-strategist) - go-to-market implications
32
32
 
33
- 3. Spawn each selected persona IN PARALLEL via Task tool:
33
+ 3. Spawn each selected persona IN PARALLEL via the host platform's native agent spawning mechanism:
34
34
  - Each gets fresh context
35
35
  - Each receives ONLY the question and the relevant artifact subset
36
36
  - Each is instructed: respond as your specialist, do not soften or hedge
package/skills/god-prd.md CHANGED
@@ -9,7 +9,7 @@ description: |
9
9
 
10
10
  # /god-prd
11
11
 
12
- Spawn the **god-pm** agent in a fresh context via Task tool.
12
+ Spawn the **god-pm** agent in a fresh context via the host platform's native agent spawning mechanism.
13
13
 
14
14
  ## Setup
15
15
 
@@ -9,7 +9,7 @@ description: |
9
9
 
10
10
  # /god-repo
11
11
 
12
- Spawn the **god-repo-scaffolder** agent in a fresh context via Task tool.
12
+ Spawn the **god-repo-scaffolder** agent in a fresh context via the host platform's native agent spawning mechanism.
13
13
 
14
14
  ## Setup
15
15