godpowers 1.6.17 → 1.6.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/README.md +11 -9
- package/RELEASE.md +41 -31
- package/SKILL.md +11 -1
- package/agents/god-orchestrator.md +6 -1
- package/lib/README.md +1 -0
- package/lib/dashboard.js +17 -4
- package/lib/feature-awareness.js +6 -0
- package/lib/repo-surface-sync.js +512 -0
- package/package.json +2 -2
- package/skills/god-docs.md +6 -0
- package/skills/god-doctor.md +14 -0
- package/skills/god-mode.md +7 -0
- package/skills/god-next.md +7 -2
- package/skills/god-status.md +11 -3
- package/skills/god-sync.md +11 -4
- package/skills/god-version.md +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,36 @@ 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.19] - 2026-05-16
|
|
9
|
+
|
|
10
|
+
Repository surface sync and status truth closeout.
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Added `lib/repo-surface-sync.js` to detect structural drift across command
|
|
14
|
+
routing, package payload rules, agent handoffs, workflow metadata, recipe
|
|
15
|
+
routes, extension packs, and release policy checks.
|
|
16
|
+
- Added `docs/repo-surface-sync.md` with auto-invoke, auto-spawn, and guardrail
|
|
17
|
+
behavior.
|
|
18
|
+
- Added behavioral tests for missing route detection, explicit route stub
|
|
19
|
+
creation, sync logging, package checks, agent handoff checks, and current
|
|
20
|
+
repo freshness.
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
- `/god-sync`, `/god-docs`, `/god-doctor`, `/god-status`, and `/god-mode` now
|
|
24
|
+
document repo surface sync behavior.
|
|
25
|
+
- Dashboard proactive checks now include a repo surface status line.
|
|
26
|
+
- Feature awareness now records `repo-surface-sync` as a known runtime feature.
|
|
27
|
+
- Package contents checks now require `lib/repo-surface-sync.js`.
|
|
28
|
+
- README, release notes, command flows, release checklist, command reference,
|
|
29
|
+
and runtime docs now describe repo surface sync.
|
|
30
|
+
|
|
31
|
+
### Guardrails
|
|
32
|
+
- Detection is read-only by default.
|
|
33
|
+
- Safe apply can create missing routing stubs only when `fixRouting` is
|
|
34
|
+
explicitly enabled.
|
|
35
|
+
- Agent, workflow, recipe, extension, and release-policy ambiguity routes to
|
|
36
|
+
scoped specialists instead of being rewritten blindly.
|
|
37
|
+
|
|
8
38
|
## [1.6.17] - 2026-05-16
|
|
9
39
|
|
|
10
40
|
Autonomous repository documentation sync.
|
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,11 @@ 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
|
-
|
|
19
|
-
|
|
15
|
+
Version 1.6.19 sharpens Godpowers status truth and adds repository surface
|
|
16
|
+
sync. Dashboards now name whether they came from `lib/dashboard.js` or a manual
|
|
17
|
+
fallback, and Godpowers checks routing gaps, package payload drift, agent
|
|
18
|
+
handoff drift, workflow metadata drift, recipe route drift, extension pack
|
|
19
|
+
drift, and release-policy drift before closeout.
|
|
20
20
|
|
|
21
21
|
It fuses four disciplines into one unified workflow:
|
|
22
22
|
|
|
@@ -194,12 +194,13 @@ durable `.godpowers` artifacts change project truth. The decision is logged to
|
|
|
194
194
|
`.godpowers/YOLO-DECISIONS.md`.
|
|
195
195
|
|
|
196
196
|
Every completing command now ends with a **Godpowers Dashboard**. It shows the
|
|
197
|
-
current phase, tier, step count,
|
|
197
|
+
current phase, tier, step count, workflow progress, PRD and roadmap visibility,
|
|
198
198
|
recent work, proactive checks, open items, and the single recommended next
|
|
199
199
|
action. `/god-status` and `/god-next` use the same shape so the project never
|
|
200
200
|
ends in a vague "done" state. The dashboard is backed by
|
|
201
|
-
`lib/dashboard.js`,
|
|
202
|
-
|
|
201
|
+
`lib/dashboard.js`, and the rendered output names that source when the runtime
|
|
202
|
+
engine is available. Audit, hygiene, and remediation scores are reported as
|
|
203
|
+
separate scores rather than being reused as workflow progress.
|
|
203
204
|
|
|
204
205
|
Godpowers can also inspect automation support:
|
|
205
206
|
|
|
@@ -361,6 +362,7 @@ Pi. T3 Code inherits from the underlying agent (Codex / Claude / OpenCode).
|
|
|
361
362
|
- [Command reference (all 109 skills + 40 agents)](docs/reference.md)
|
|
362
363
|
- [Feature awareness](docs/feature-awareness.md)
|
|
363
364
|
- [Repository documentation sync](docs/repo-doc-sync.md)
|
|
365
|
+
- [Repository surface sync](docs/repo-surface-sync.md)
|
|
364
366
|
- [Roadmap](docs/ROADMAP.md)
|
|
365
367
|
- [Release Notes](RELEASE.md)
|
|
366
368
|
- [Changelog](CHANGELOG.md)
|
package/RELEASE.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
# Godpowers 1.6.
|
|
1
|
+
# Godpowers 1.6.19 Release
|
|
2
2
|
|
|
3
3
|
Date: 2026-05-16
|
|
4
4
|
|
|
5
|
-
Godpowers 1.6.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
Godpowers 1.6.19 adds repository surface sync and clarifies status truth across
|
|
6
|
+
`/god-status`, `/god-next`, God Mode closeouts, and installer CLI status
|
|
7
|
+
helpers. Godpowers can now detect structural drift across routes, package
|
|
8
|
+
payload rules, agent handoffs, workflow metadata, recipe routes, extension
|
|
9
|
+
packs, and release policy before declaring a project run current.
|
|
10
10
|
|
|
11
11
|
## What is stable
|
|
12
12
|
|
|
@@ -25,57 +25,67 @@ status, or god-mode closeout declares the repository current.
|
|
|
25
25
|
- Planning-system migration for GSD, BMAD, and Superpowers
|
|
26
26
|
- Managed sync-back companion files for imported source systems
|
|
27
27
|
- Feature awareness for existing Godpowers projects
|
|
28
|
+
- Repository documentation sync checks
|
|
29
|
+
- Repository surface sync checks
|
|
28
30
|
|
|
29
31
|
## What is new
|
|
30
32
|
|
|
31
|
-
- Added `lib/repo-
|
|
32
|
-
- Added `docs/repo-
|
|
33
|
-
- Added `scripts/test-repo-
|
|
34
|
-
- Added missing `/god-export-otel` routing metadata.
|
|
33
|
+
- Added `lib/repo-surface-sync.js`.
|
|
34
|
+
- Added `docs/repo-surface-sync.md`.
|
|
35
|
+
- Added `scripts/test-repo-surface-sync.js`.
|
|
35
36
|
- `/god-sync`, `/god-docs`, `/god-doctor`, `/god-status`, and `/god-mode` now
|
|
36
|
-
document repo
|
|
37
|
-
-
|
|
38
|
-
- Package contents checks now require
|
|
39
|
-
|
|
37
|
+
document repo surface sync integration.
|
|
38
|
+
- Dashboard proactive checks now include a repo surface status line.
|
|
39
|
+
- Package contents checks now require `lib/repo-surface-sync.js`.
|
|
40
|
+
- Feature awareness now records `repo-surface-sync` as a known runtime feature.
|
|
41
|
+
- Dashboard output keeps workflow progress distinct from audit, hygiene,
|
|
42
|
+
remediation, and launch-readiness scores.
|
|
40
43
|
|
|
41
|
-
##
|
|
44
|
+
## Surface sync behavior
|
|
42
45
|
|
|
43
|
-
For a Godpowers repository, the helper:
|
|
46
|
+
For a Godpowers repository, the helper checks:
|
|
44
47
|
|
|
45
|
-
-
|
|
46
|
-
-
|
|
47
|
-
|
|
48
|
-
-
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
|
|
48
|
+
- every `skills/god-*.md` command has matching `routing/god-*.yaml` metadata
|
|
49
|
+
- required package payload entries exist in `package.json`
|
|
50
|
+
- package content checks require load-bearing runtime helper files
|
|
51
|
+
- routed specialist spawns resolve to real agent files
|
|
52
|
+
- workflows have parseable metadata
|
|
53
|
+
- recipes contain slash-command routes
|
|
54
|
+
- extension manifests, package metadata, peer dependencies, and provided files agree
|
|
55
|
+
- release docs and release policy checks name repo documentation and repo surface sync
|
|
52
56
|
|
|
53
|
-
Detection is read-only by default. Applying sync
|
|
54
|
-
|
|
55
|
-
security support policy.
|
|
57
|
+
Detection is read-only by default. Applying sync only writes a log and may
|
|
58
|
+
create missing routing stubs when `fixRouting` is explicitly enabled.
|
|
56
59
|
|
|
57
60
|
## Auto-invoke and auto-spawn policy
|
|
58
61
|
|
|
59
|
-
Safe repo
|
|
62
|
+
Safe repo surface sync is local runtime work and must be reported as:
|
|
60
63
|
|
|
61
64
|
```text
|
|
62
65
|
Agent: none, local runtime only
|
|
63
66
|
```
|
|
64
67
|
|
|
65
|
-
Godpowers recommends
|
|
66
|
-
|
|
68
|
+
Godpowers recommends scoped specialists only when judgment is needed:
|
|
69
|
+
|
|
70
|
+
- `god-auditor` for agent contract or handoff drift
|
|
71
|
+
- `god-roadmap-reconciler` for workflow or recipe lifecycle drift
|
|
72
|
+
- `god-coordinator` for extension pack drift
|
|
73
|
+
- `god-docs-writer` for release prose drift
|
|
67
74
|
|
|
68
75
|
## Validation
|
|
69
76
|
|
|
70
77
|
Release validation includes:
|
|
71
78
|
|
|
79
|
+
- `node scripts/test-repo-surface-sync.js`
|
|
72
80
|
- `node scripts/test-repo-doc-sync.js`
|
|
73
81
|
- `node scripts/test-feature-awareness.js`
|
|
82
|
+
- `node scripts/test-dashboard.js`
|
|
74
83
|
- `node scripts/test-context-writer.js`
|
|
75
84
|
- `node scripts/test-planning-systems.js`
|
|
76
85
|
- `node scripts/test-doc-surface-counts.js`
|
|
77
86
|
- `node scripts/validate-skills.js`
|
|
78
87
|
- `git diff --check`
|
|
88
|
+
- `npm run release:check`
|
|
79
89
|
|
|
80
|
-
The `v1.6.
|
|
81
|
-
`godpowers@1.6.
|
|
90
|
+
The `v1.6.19` tag should point to the release commit that matches the npm
|
|
91
|
+
`godpowers@1.6.19` package.
|
package/SKILL.md
CHANGED
|
@@ -155,6 +155,7 @@ Proactive checks:
|
|
|
155
155
|
Reviews: <none | N pending, suggest /god-review-changes>
|
|
156
156
|
Sync: <fresh | missing | stale | local helper ran | suggest /god-sync>
|
|
157
157
|
Docs: <fresh | N stale, suggest /god-docs | repo-doc-sync ran>
|
|
158
|
+
Repo surface: <fresh | N stale, suggest /god-doctor | repo-surface-sync ran>
|
|
158
159
|
Runtime: <not-applicable | known URL, suggest /god-test-runtime | no known URL, defer deployed verification>
|
|
159
160
|
Automation: <not configured | N active | available via provider, suggest /god-automation-setup>
|
|
160
161
|
Security: <clear | sensitive files changed, suggest /god-harden>
|
|
@@ -214,7 +215,7 @@ Auto-invoked:
|
|
|
214
215
|
Trigger: <what caused this automatic step>
|
|
215
216
|
Agent: <god-updater | god-context-writer | none, local runtime only>
|
|
216
217
|
Local syncs:
|
|
217
|
-
+ <feature-awareness | planning-system-import | reverse-sync | source-sync | repo-doc-sync | pillars-sync | checkpoint-sync | context-refresh>: <result or skipped reason>
|
|
218
|
+
+ <feature-awareness | planning-system-import | reverse-sync | source-sync | repo-doc-sync | repo-surface-sync | pillars-sync | checkpoint-sync | context-refresh>: <result or skipped reason>
|
|
218
219
|
Artifacts: <changed files, no-op, or deferred>
|
|
219
220
|
Log: <SYNC-LOG.md, CHECKPOINT.md, REVIEW-REQUIRED.md, or none>
|
|
220
221
|
```
|
|
@@ -244,6 +245,8 @@ Automatic steps that especially need visible reporting:
|
|
|
244
245
|
`/god-sync`, or `/god-mode`
|
|
245
246
|
- repo documentation sync during `/god-sync`, `/god-docs`, `/god-doctor`,
|
|
246
247
|
`/god-status`, or `/god-mode`
|
|
248
|
+
- repo surface sync during `/god-sync`, `/god-docs`, `/god-doctor`,
|
|
249
|
+
`/god-status`, or `/god-mode`
|
|
247
250
|
|
|
248
251
|
### 13. Proactive Auto-Invoke Policy
|
|
249
252
|
Godpowers should be proactive from disk evidence, not from guesswork. Before
|
|
@@ -284,6 +287,10 @@ Run these local runtime helpers automatically when their trigger is present:
|
|
|
284
287
|
`lib/repo-doc-sync.run` during `/god-sync`, `/god-docs`, or `/god-mode`
|
|
285
288
|
when README badges, public surface counts, release docs, contribution docs,
|
|
286
289
|
or security policy may have drifted.
|
|
290
|
+
- `lib/repo-surface-sync.detect` during `/god-status` and `/god-doctor`, and
|
|
291
|
+
`lib/repo-surface-sync.run` during `/god-sync`, `/god-docs`, or
|
|
292
|
+
`/god-mode` when command routing, package payload, agent handoffs, workflow
|
|
293
|
+
metadata, recipe routes, extension packs, or release policy may have drifted.
|
|
287
294
|
- Context refresh dry-run after `AGENTS.md`, `CLAUDE.md`, `GEMINI.md`,
|
|
288
295
|
`.cursor/rules/`, `.windsurfrules`, `.github/copilot-instructions.md`,
|
|
289
296
|
`.clinerules`, `.roo/`, or `.continue/` changes.
|
|
@@ -300,6 +307,9 @@ Spawn these agents only when the trigger is direct and scope is bounded:
|
|
|
300
307
|
- `god-docs-writer` when repo-doc-sync reports narrative drift in
|
|
301
308
|
`CHANGELOG.md`, `RELEASE.md`, `CONTRIBUTING.md`, `SECURITY.md`, or
|
|
302
309
|
`SUPPORT.md` after local mechanical sync has finished.
|
|
310
|
+
- `god-auditor`, `god-roadmap-reconciler`, or `god-coordinator` when
|
|
311
|
+
repo-surface-sync reports structural drift that needs agent contract,
|
|
312
|
+
lifecycle graph, or extension-pack judgment.
|
|
303
313
|
- `god-browser-tester` when frontend-visible files changed and a known local,
|
|
304
314
|
preview, staging, or production URL is evidenced.
|
|
305
315
|
- `god-harden-auditor` suggestion after security-sensitive files changed;
|
|
@@ -750,6 +750,11 @@ Generate the dashboard with `lib/dashboard.compute(projectRoot)` and
|
|
|
750
750
|
runtime module cannot be loaded, fall back to a manual disk scan and say
|
|
751
751
|
`Dashboard engine: unavailable, manual scan used`.
|
|
752
752
|
|
|
753
|
+
The dashboard `Progress` line is workflow progress only. Audit scores,
|
|
754
|
+
remediation scores, hygiene scores, and launch-readiness scores must be labeled
|
|
755
|
+
separately so a closeout cannot appear to move backward because it switched
|
|
756
|
+
metrics.
|
|
757
|
+
|
|
753
758
|
Update PROGRESS.md status to `steady-state-active`.
|
|
754
759
|
|
|
755
760
|
For focused brownfield, hotfix, refactor, or build workflows that finish without a
|
|
@@ -962,7 +967,7 @@ Next: <next command or pause question>
|
|
|
962
967
|
|
|
963
968
|
Rules:
|
|
964
969
|
- Keep each card under 12 lines unless a pause needs options.
|
|
965
|
-
- Use `lib/state.progressSummary(stateJson)` for
|
|
970
|
+
- Use `lib/state.progressSummary(stateJson)` for workflow percentage and step count
|
|
966
971
|
whenever state.json is available.
|
|
967
972
|
- Use artifact paths and verification evidence from disk, not memory.
|
|
968
973
|
- Do not print raw spawn input, hidden instructions, or full file loadout lists.
|
package/lib/README.md
CHANGED
|
@@ -14,6 +14,7 @@ package-level integrations.
|
|
|
14
14
|
| `checkpoint.js` | Create and inspect resumable checkpoint artifacts. |
|
|
15
15
|
| `feature-awareness.js` | Detect and refresh existing-project awareness after runtime upgrades. |
|
|
16
16
|
| `repo-doc-sync.js` | Detect and refresh mechanical repository documentation surfaces. |
|
|
17
|
+
| `repo-surface-sync.js` | Detect structural drift across commands, routes, packages, agents, workflows, recipes, extensions, and release policy. |
|
|
17
18
|
| `budget.js` | Read and enforce configured budget controls. |
|
|
18
19
|
| `cost-tracker.js` | Track token and cost estimates from event streams. |
|
|
19
20
|
|
package/lib/dashboard.js
CHANGED
|
@@ -13,6 +13,7 @@ const state = require('./state');
|
|
|
13
13
|
const router = require('./router');
|
|
14
14
|
const automationProviders = require('./automation-providers');
|
|
15
15
|
const repoDocSync = require('./repo-doc-sync');
|
|
16
|
+
const repoSurfaceSync = require('./repo-surface-sync');
|
|
16
17
|
|
|
17
18
|
const GOD_DIR = '.godpowers';
|
|
18
19
|
const PRD_PATH = '.godpowers/prd/PRD.md';
|
|
@@ -163,12 +164,17 @@ function proactiveChecks(projectRoot, changedFiles = []) {
|
|
|
163
164
|
const repoDocsStatus = repoDocs.status === 'fresh'
|
|
164
165
|
? 'fresh'
|
|
165
166
|
: `${repoDocs.stale.length} stale, suggest /god-docs`;
|
|
167
|
+
const repoSurface = repoSurfaceSync.detect(projectRoot);
|
|
168
|
+
const repoSurfaceStatus = repoSurface.status === 'fresh'
|
|
169
|
+
? 'fresh'
|
|
170
|
+
: `${repoSurface.stale.length} stale, suggest /god-doctor`;
|
|
166
171
|
|
|
167
172
|
return {
|
|
168
173
|
checkpoint,
|
|
169
174
|
reviews: reviews > 0 ? `${reviews} pending, suggest /god-review-changes` : 'none',
|
|
170
175
|
sync,
|
|
171
176
|
docs: repoDocsStatus,
|
|
177
|
+
repoSurface: repoSurfaceStatus,
|
|
172
178
|
runtime: 'not-applicable',
|
|
173
179
|
automation: automationSummary(projectRoot),
|
|
174
180
|
security: sensitiveChanged ? 'sensitive files changed, suggest /god-harden' : 'clear',
|
|
@@ -200,7 +206,8 @@ function planningVisibility(projectRoot, progress) {
|
|
|
200
206
|
prd: { status: prd, path: prd === 'done' ? PRD_PATH : null },
|
|
201
207
|
roadmap: { status: roadmap, path: roadmap === 'done' ? ROADMAP_PATH : null },
|
|
202
208
|
currentMilestone: phase.stepLabel ? `${phase.phase} / ${phase.stepLabel}` : phase.phase,
|
|
203
|
-
completion: `${progress.percent}%
|
|
209
|
+
completion: `${progress.percent}% workflow progress from .godpowers/state.json tracked steps`,
|
|
210
|
+
completionBasis: '.godpowers/state.json workflow steps'
|
|
204
211
|
};
|
|
205
212
|
}
|
|
206
213
|
|
|
@@ -211,6 +218,7 @@ function compute(projectRoot, opts = {}) {
|
|
|
211
218
|
if (!s) {
|
|
212
219
|
const next = { command: '/god-init', reason: 'No Godpowers project initialized' };
|
|
213
220
|
return {
|
|
221
|
+
source: 'runtime dashboard (lib/dashboard.js)',
|
|
214
222
|
state: 'not initialized',
|
|
215
223
|
mode: null,
|
|
216
224
|
lifecycle: 'pre-init',
|
|
@@ -222,7 +230,8 @@ function compute(projectRoot, opts = {}) {
|
|
|
222
230
|
prd: { status: 'missing', path: null },
|
|
223
231
|
roadmap: { status: 'missing', path: null },
|
|
224
232
|
currentMilestone: 'Project initialization',
|
|
225
|
-
completion: '0%
|
|
233
|
+
completion: '0% workflow progress because .godpowers/state.json is missing',
|
|
234
|
+
completionBasis: 'missing .godpowers/state.json'
|
|
226
235
|
},
|
|
227
236
|
proactive: proactiveChecks(projectRoot, git.entries.map(statusPath)),
|
|
228
237
|
next,
|
|
@@ -242,6 +251,7 @@ function compute(projectRoot, opts = {}) {
|
|
|
242
251
|
if (openItems.length === 0) openItems.push('none');
|
|
243
252
|
|
|
244
253
|
return {
|
|
254
|
+
source: 'runtime dashboard (lib/dashboard.js)',
|
|
245
255
|
state: progress.remaining === 0 ? 'complete' : 'in progress',
|
|
246
256
|
mode: s.mode || s['mode-announced-as'] || null,
|
|
247
257
|
lifecycle: s['lifecycle-phase'] || 'in-arc',
|
|
@@ -271,11 +281,13 @@ function render(dashboard) {
|
|
|
271
281
|
return [
|
|
272
282
|
'Godpowers Dashboard',
|
|
273
283
|
'',
|
|
284
|
+
`Source: ${dashboard.source || 'manual disk scan'}`,
|
|
285
|
+
'',
|
|
274
286
|
'Current status:',
|
|
275
287
|
` State: ${dashboard.state}`,
|
|
276
288
|
` Phase: ${current.phase || 'unknown'}${current.tierNumber !== null && current.tierNumber !== undefined ? ` (tier ${current.tierOrdinal} of ${current.tierCount}, internal ${current.tierKey || `tier-${current.tierNumber}`})` : ''}`,
|
|
277
289
|
` Step: ${current.stepLabel || 'unknown'}${current.stepNumber ? ` (step ${current.stepNumber} of ${current.totalSteps})` : ''}`,
|
|
278
|
-
` Progress: ${progress.percent || 0}% (${progress.completed || 0} of ${progress.total || 0} steps complete)`,
|
|
290
|
+
` Progress: ${progress.percent || 0}% workflow progress (${progress.completed || 0} of ${progress.total || 0} tracked steps complete)`,
|
|
279
291
|
` Worktree: ${dashboard.worktree}`,
|
|
280
292
|
` Index: ${dashboard.index}`,
|
|
281
293
|
'',
|
|
@@ -283,13 +295,14 @@ function render(dashboard) {
|
|
|
283
295
|
` PRD: ${prd.status || 'missing'}${prd.path ? ` ${prd.path}` : ''}`,
|
|
284
296
|
` Roadmap: ${roadmap.status || 'missing'}${roadmap.path ? ` ${roadmap.path}` : ''}`,
|
|
285
297
|
` Current milestone: ${planning.currentMilestone || 'unknown'}`,
|
|
286
|
-
` Completion: ${planning.completion || 'unknown'}`,
|
|
298
|
+
` Completion basis: ${planning.completionBasis || planning.completion || 'unknown'}`,
|
|
287
299
|
'',
|
|
288
300
|
'Proactive checks:',
|
|
289
301
|
` Checkpoint: ${proactive.checkpoint || 'unknown'}`,
|
|
290
302
|
` Reviews: ${proactive.reviews || 'unknown'}`,
|
|
291
303
|
` Sync: ${proactive.sync || 'unknown'}`,
|
|
292
304
|
` Docs: ${proactive.docs || 'unknown'}`,
|
|
305
|
+
` Repo surface: ${proactive.repoSurface || 'unknown'}`,
|
|
293
306
|
` Runtime: ${proactive.runtime || 'unknown'}`,
|
|
294
307
|
` Automation: ${proactive.automation || 'unknown'}`,
|
|
295
308
|
` Security: ${proactive.security || 'unknown'}`,
|
package/lib/feature-awareness.js
CHANGED
|
@@ -40,6 +40,12 @@ const FEATURES = [
|
|
|
40
40
|
since: '1.6.17',
|
|
41
41
|
commands: ['/god-sync', '/god-docs', '/god-doctor', '/god-status', '/god-mode'],
|
|
42
42
|
description: 'Detect and refresh repository documentation surfaces, release docs, and Pillars planning signals.'
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: 'repo-surface-sync',
|
|
46
|
+
since: '1.6.19',
|
|
47
|
+
commands: ['/god-sync', '/god-docs', '/god-doctor', '/god-status', '/god-mode'],
|
|
48
|
+
description: 'Detect structural drift across routing, packages, agents, workflows, recipes, extensions, and release policy.'
|
|
43
49
|
}
|
|
44
50
|
];
|
|
45
51
|
|
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repository surface sync.
|
|
3
|
+
*
|
|
4
|
+
* Detects structural drift between commands, routing, package metadata,
|
|
5
|
+
* agent contracts, workflows, recipes, extensions, and release policy docs.
|
|
6
|
+
* The helper is read-only by default. The apply path writes only safe local
|
|
7
|
+
* logs and optional missing routing stubs when explicitly requested.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const fs = require('fs');
|
|
11
|
+
const path = require('path');
|
|
12
|
+
|
|
13
|
+
const { parseSimpleYaml } = require('./intent');
|
|
14
|
+
const extensions = require('./extensions');
|
|
15
|
+
const repoDocSync = require('./repo-doc-sync');
|
|
16
|
+
|
|
17
|
+
const LOG_PATH = '.godpowers/surface/REPO-SURFACE-SYNC.md';
|
|
18
|
+
|
|
19
|
+
const REQUIRED_PACKAGE_FILE_ENTRIES = [
|
|
20
|
+
'bin/',
|
|
21
|
+
'skills/',
|
|
22
|
+
'agents/god-*.md',
|
|
23
|
+
'templates/',
|
|
24
|
+
'references/',
|
|
25
|
+
'routing/',
|
|
26
|
+
'workflows/',
|
|
27
|
+
'schema/',
|
|
28
|
+
'lib/',
|
|
29
|
+
'extensions/',
|
|
30
|
+
'RELEASE.md',
|
|
31
|
+
'SKILL.md',
|
|
32
|
+
'AGENTS.md',
|
|
33
|
+
'CHANGELOG.md',
|
|
34
|
+
'LICENSE'
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
const REQUIRED_PACKAGE_CHECKS = [
|
|
38
|
+
'lib/feature-awareness.js',
|
|
39
|
+
'lib/repo-doc-sync.js',
|
|
40
|
+
'lib/repo-surface-sync.js',
|
|
41
|
+
'routing/god-export-otel.yaml'
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
function rel(projectRoot, absPath) {
|
|
45
|
+
return path.relative(projectRoot, absPath).split(path.sep).join('/');
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function exists(projectRoot, relPath) {
|
|
49
|
+
return fs.existsSync(path.join(projectRoot, relPath));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function read(projectRoot, relPath) {
|
|
53
|
+
const file = path.join(projectRoot, relPath);
|
|
54
|
+
if (!fs.existsSync(file)) return '';
|
|
55
|
+
return fs.readFileSync(file, 'utf8');
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function write(projectRoot, relPath, content) {
|
|
59
|
+
const file = path.join(projectRoot, relPath);
|
|
60
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
61
|
+
fs.writeFileSync(file, content);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function listFiles(projectRoot, relDir, pattern) {
|
|
65
|
+
const dir = path.join(projectRoot, relDir);
|
|
66
|
+
if (!fs.existsSync(dir)) return [];
|
|
67
|
+
return fs.readdirSync(dir)
|
|
68
|
+
.filter((name) => pattern.test(name))
|
|
69
|
+
.sort()
|
|
70
|
+
.map((name) => `${relDir}/${name}`.replace(/\\/g, '/'));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function readJson(projectRoot, relPath) {
|
|
74
|
+
try {
|
|
75
|
+
return JSON.parse(read(projectRoot, relPath));
|
|
76
|
+
} catch (err) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function routeForSkill(skillPath) {
|
|
82
|
+
const base = path.basename(skillPath, '.md');
|
|
83
|
+
return `routing/${base}.yaml`;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function commandForSkill(skillPath) {
|
|
87
|
+
return `/${path.basename(skillPath, '.md')}`;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function addCheck(checks, area, id, status, relPath, message, opts = {}) {
|
|
91
|
+
checks.push({
|
|
92
|
+
area,
|
|
93
|
+
id,
|
|
94
|
+
status,
|
|
95
|
+
path: relPath,
|
|
96
|
+
message,
|
|
97
|
+
severity: opts.severity || (status === 'fresh' ? 'info' : 'warning'),
|
|
98
|
+
safeFix: opts.safeFix === true,
|
|
99
|
+
spawn: opts.spawn || null
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function routingChecks(projectRoot) {
|
|
104
|
+
const checks = [];
|
|
105
|
+
const skills = listFiles(projectRoot, 'skills', /^god.*\.md$/);
|
|
106
|
+
const routes = listFiles(projectRoot, 'routing', /^god.*\.yaml$/);
|
|
107
|
+
const skillRoutes = new Set(skills.map(routeForSkill));
|
|
108
|
+
const routeSet = new Set(routes);
|
|
109
|
+
|
|
110
|
+
for (const skill of skills) {
|
|
111
|
+
const route = routeForSkill(skill);
|
|
112
|
+
addCheck(
|
|
113
|
+
checks,
|
|
114
|
+
'routing',
|
|
115
|
+
`route-for-${path.basename(skill, '.md')}`,
|
|
116
|
+
routeSet.has(route) ? 'fresh' : 'stale',
|
|
117
|
+
route,
|
|
118
|
+
routeSet.has(route)
|
|
119
|
+
? `${commandForSkill(skill)} has routing metadata.`
|
|
120
|
+
: `${commandForSkill(skill)} is missing routing metadata.`,
|
|
121
|
+
{ safeFix: !routeSet.has(route) }
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
for (const route of routes) {
|
|
126
|
+
if (!skillRoutes.has(route)) {
|
|
127
|
+
addCheck(
|
|
128
|
+
checks,
|
|
129
|
+
'routing',
|
|
130
|
+
`skill-for-${path.basename(route, '.yaml')}`,
|
|
131
|
+
'stale',
|
|
132
|
+
route,
|
|
133
|
+
`${route} has no matching skill file.`,
|
|
134
|
+
{ severity: 'warning' }
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return checks;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function packageChecks(projectRoot) {
|
|
142
|
+
const checks = [];
|
|
143
|
+
const pkg = readJson(projectRoot, 'package.json') || {};
|
|
144
|
+
const lock = readJson(projectRoot, 'package-lock.json');
|
|
145
|
+
const fileEntries = Array.isArray(pkg.files) ? pkg.files : [];
|
|
146
|
+
|
|
147
|
+
for (const entry of REQUIRED_PACKAGE_FILE_ENTRIES) {
|
|
148
|
+
addCheck(
|
|
149
|
+
checks,
|
|
150
|
+
'package',
|
|
151
|
+
`package-files-${entry.replace(/[^a-z0-9]+/gi, '-')}`,
|
|
152
|
+
fileEntries.includes(entry) ? 'fresh' : 'stale',
|
|
153
|
+
'package.json',
|
|
154
|
+
fileEntries.includes(entry)
|
|
155
|
+
? `package.json includes ${entry}.`
|
|
156
|
+
: `package.json files is missing ${entry}.`
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const packageCheckText = read(projectRoot, 'scripts/check-package-contents.js');
|
|
161
|
+
for (const required of REQUIRED_PACKAGE_CHECKS) {
|
|
162
|
+
addCheck(
|
|
163
|
+
checks,
|
|
164
|
+
'package',
|
|
165
|
+
`package-check-${required.replace(/[^a-z0-9]+/gi, '-')}`,
|
|
166
|
+
packageCheckText.includes(required) ? 'fresh' : 'stale',
|
|
167
|
+
'scripts/check-package-contents.js',
|
|
168
|
+
packageCheckText.includes(required)
|
|
169
|
+
? `package contents check requires ${required}.`
|
|
170
|
+
: `package contents check does not require ${required}.`
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (lock && lock.version) {
|
|
175
|
+
addCheck(
|
|
176
|
+
checks,
|
|
177
|
+
'package',
|
|
178
|
+
'package-lock-version',
|
|
179
|
+
lock.version === pkg.version ? 'fresh' : 'stale',
|
|
180
|
+
'package-lock.json',
|
|
181
|
+
lock.version === pkg.version
|
|
182
|
+
? 'package-lock.json version matches package.json.'
|
|
183
|
+
: `package-lock.json version ${lock.version} does not match package.json ${pkg.version}.`
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return checks;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function parseRoute(projectRoot, routePath) {
|
|
191
|
+
try {
|
|
192
|
+
return parseSimpleYaml(read(projectRoot, routePath));
|
|
193
|
+
} catch (err) {
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function agentChecks(projectRoot) {
|
|
199
|
+
const checks = [];
|
|
200
|
+
const agents = new Set(listFiles(projectRoot, 'agents', /^god.*\.md$/)
|
|
201
|
+
.map((file) => path.basename(file, '.md')));
|
|
202
|
+
const routes = listFiles(projectRoot, 'routing', /^god.*\.yaml$/);
|
|
203
|
+
const missing = new Set();
|
|
204
|
+
|
|
205
|
+
for (const route of routes) {
|
|
206
|
+
const parsed = parseRoute(projectRoot, route);
|
|
207
|
+
const spawns = parsed && parsed.execution && Array.isArray(parsed.execution.spawns)
|
|
208
|
+
? parsed.execution.spawns
|
|
209
|
+
: [];
|
|
210
|
+
for (const spawn of spawns) {
|
|
211
|
+
if (!String(spawn).startsWith('god-')) continue;
|
|
212
|
+
if (!/^god-[a-z0-9-]+$/.test(String(spawn))) continue;
|
|
213
|
+
if (!agents.has(spawn)) {
|
|
214
|
+
missing.add(`${route}:${spawn}`);
|
|
215
|
+
addCheck(
|
|
216
|
+
checks,
|
|
217
|
+
'agents',
|
|
218
|
+
`missing-agent-${spawn}`,
|
|
219
|
+
'stale',
|
|
220
|
+
route,
|
|
221
|
+
`${route} references missing agent ${spawn}.`,
|
|
222
|
+
{ spawn: 'god-auditor' }
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if (missing.size === 0) {
|
|
229
|
+
addCheck(checks, 'agents', 'route-spawn-targets', 'fresh',
|
|
230
|
+
'routing/', 'All routed specialist spawns resolve to agent files.');
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return checks;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function workflowRecipeChecks(projectRoot) {
|
|
237
|
+
const checks = [];
|
|
238
|
+
const workflows = listFiles(projectRoot, 'workflows', /\.yaml$/);
|
|
239
|
+
const recipes = listFiles(projectRoot, path.join('routing', 'recipes'), /\.yaml$/);
|
|
240
|
+
const commandFlows = read(projectRoot, 'docs/command-flows.md');
|
|
241
|
+
|
|
242
|
+
for (const workflow of workflows) {
|
|
243
|
+
const text = read(projectRoot, workflow);
|
|
244
|
+
const parsed = parseSimpleYaml(text);
|
|
245
|
+
const hasMetadata = Boolean(parsed.apiVersion || parsed.name || parsed.metadata);
|
|
246
|
+
addCheck(
|
|
247
|
+
checks,
|
|
248
|
+
'workflow',
|
|
249
|
+
`workflow-metadata-${path.basename(workflow, '.yaml')}`,
|
|
250
|
+
hasMetadata ? 'fresh' : 'stale',
|
|
251
|
+
workflow,
|
|
252
|
+
hasMetadata ? `${workflow} has metadata.` : `${workflow} is missing parseable metadata.`,
|
|
253
|
+
{ spawn: hasMetadata ? null : 'god-roadmap-reconciler' }
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
for (const recipe of recipes) {
|
|
258
|
+
const text = read(projectRoot, recipe);
|
|
259
|
+
const hasCommand = /\/god-[a-z0-9-]+/.test(text);
|
|
260
|
+
const recipeName = path.basename(recipe, '.yaml');
|
|
261
|
+
addCheck(
|
|
262
|
+
checks,
|
|
263
|
+
'workflow',
|
|
264
|
+
`recipe-command-${recipeName}`,
|
|
265
|
+
hasCommand ? 'fresh' : 'stale',
|
|
266
|
+
recipe,
|
|
267
|
+
hasCommand ? `${recipe} includes a slash-command route.` : `${recipe} has no slash-command route.`,
|
|
268
|
+
{ spawn: hasCommand ? null : 'god-roadmap-reconciler' }
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
if (workflows.length > 0) {
|
|
273
|
+
addCheck(
|
|
274
|
+
checks,
|
|
275
|
+
'workflow',
|
|
276
|
+
'command-flows-workflows',
|
|
277
|
+
commandFlows.includes('/god-docs') && commandFlows.includes('/god-sync') ? 'fresh' : 'stale',
|
|
278
|
+
'docs/command-flows.md',
|
|
279
|
+
'docs/command-flows.md includes core docs and sync flows.',
|
|
280
|
+
{ spawn: 'god-roadmap-reconciler' }
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
return checks;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
function extensionChecks(projectRoot) {
|
|
287
|
+
const checks = [];
|
|
288
|
+
const extRoot = path.join(projectRoot, 'extensions');
|
|
289
|
+
const pkg = readJson(projectRoot, 'package.json') || {};
|
|
290
|
+
if (!fs.existsSync(extRoot)) return checks;
|
|
291
|
+
for (const entry of fs.readdirSync(extRoot, { withFileTypes: true })) {
|
|
292
|
+
if (!entry.isDirectory()) continue;
|
|
293
|
+
const packRel = `extensions/${entry.name}`;
|
|
294
|
+
const manifestRel = `${packRel}/manifest.yaml`;
|
|
295
|
+
const packageRel = `${packRel}/package.json`;
|
|
296
|
+
const manifestText = read(projectRoot, manifestRel);
|
|
297
|
+
const packPkg = readJson(projectRoot, packageRel);
|
|
298
|
+
const parsed = manifestText ? extensions.parseManifest(manifestText).manifest : null;
|
|
299
|
+
const validation = parsed ? extensions.validateManifest(parsed, pkg.version || '0.0.0') : ['missing manifest'];
|
|
300
|
+
|
|
301
|
+
addCheck(
|
|
302
|
+
checks,
|
|
303
|
+
'extensions',
|
|
304
|
+
`extension-manifest-${entry.name}`,
|
|
305
|
+
validation.length === 0 ? 'fresh' : 'stale',
|
|
306
|
+
manifestRel,
|
|
307
|
+
validation.length === 0
|
|
308
|
+
? `${entry.name} manifest validates against current Godpowers.`
|
|
309
|
+
: `${entry.name} manifest validation failed: ${validation.join('; ')}.`,
|
|
310
|
+
{ spawn: validation.length === 0 ? null : 'god-coordinator' }
|
|
311
|
+
);
|
|
312
|
+
|
|
313
|
+
if (parsed && packPkg) {
|
|
314
|
+
const sameName = parsed.metadata && parsed.metadata.name === packPkg.name;
|
|
315
|
+
const sameVersion = parsed.metadata && parsed.metadata.version === packPkg.version;
|
|
316
|
+
const sameEngine = packPkg.peerDependencies
|
|
317
|
+
&& packPkg.peerDependencies.godpowers === parsed.engines.godpowers;
|
|
318
|
+
addCheck(checks, 'extensions', `extension-name-${entry.name}`,
|
|
319
|
+
sameName ? 'fresh' : 'stale', packageRel,
|
|
320
|
+
sameName ? `${entry.name} package name matches manifest.` : `${entry.name} package name does not match manifest.`,
|
|
321
|
+
{ spawn: sameName ? null : 'god-coordinator' });
|
|
322
|
+
addCheck(checks, 'extensions', `extension-version-${entry.name}`,
|
|
323
|
+
sameVersion ? 'fresh' : 'stale', packageRel,
|
|
324
|
+
sameVersion ? `${entry.name} package version matches manifest.` : `${entry.name} package version does not match manifest.`,
|
|
325
|
+
{ spawn: sameVersion ? null : 'god-coordinator' });
|
|
326
|
+
addCheck(checks, 'extensions', `extension-engine-${entry.name}`,
|
|
327
|
+
sameEngine ? 'fresh' : 'stale', packageRel,
|
|
328
|
+
sameEngine ? `${entry.name} peer dependency matches manifest engine.` : `${entry.name} peer dependency does not match manifest engine.`,
|
|
329
|
+
{ spawn: sameEngine ? null : 'god-coordinator' });
|
|
330
|
+
for (const kind of ['skills', 'agents', 'workflows']) {
|
|
331
|
+
const provided = parsed.provides && Array.isArray(parsed.provides[kind])
|
|
332
|
+
? parsed.provides[kind]
|
|
333
|
+
: [];
|
|
334
|
+
for (const item of provided) {
|
|
335
|
+
const ext = kind === 'workflows' ? 'yaml' : 'md';
|
|
336
|
+
const providedRel = `${packRel}/${kind}/${item}.${ext}`;
|
|
337
|
+
addCheck(checks, 'extensions', `extension-${kind}-${entry.name}-${item}`,
|
|
338
|
+
exists(projectRoot, providedRel) ? 'fresh' : 'stale',
|
|
339
|
+
providedRel,
|
|
340
|
+
exists(projectRoot, providedRel)
|
|
341
|
+
? `${providedRel} exists.`
|
|
342
|
+
: `${providedRel} is missing.`,
|
|
343
|
+
{ spawn: exists(projectRoot, providedRel) ? null : 'god-coordinator' });
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return checks;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
function releasePolicyChecks(projectRoot) {
|
|
352
|
+
const checks = [];
|
|
353
|
+
const docs = repoDocSync.detect(projectRoot);
|
|
354
|
+
addCheck(
|
|
355
|
+
checks,
|
|
356
|
+
'release',
|
|
357
|
+
'repo-doc-sync-fresh',
|
|
358
|
+
docs.status === 'fresh' ? 'fresh' : 'stale',
|
|
359
|
+
'docs/repo-doc-sync.md',
|
|
360
|
+
docs.status === 'fresh'
|
|
361
|
+
? 'Repository documentation sync reports fresh.'
|
|
362
|
+
: `Repository documentation sync reports ${docs.stale.length} stale checks.`,
|
|
363
|
+
{ spawn: docs.status === 'fresh' ? null : 'god-docs-writer' }
|
|
364
|
+
);
|
|
365
|
+
addCheck(
|
|
366
|
+
checks,
|
|
367
|
+
'release',
|
|
368
|
+
'release-checklist-surface-sync',
|
|
369
|
+
read(projectRoot, 'docs/RELEASE-CHECKLIST.md').includes('repo-surface-sync'),
|
|
370
|
+
'docs/RELEASE-CHECKLIST.md',
|
|
371
|
+
'Release checklist references repo-surface-sync readiness.',
|
|
372
|
+
{ spawn: 'god-docs-writer' }
|
|
373
|
+
);
|
|
374
|
+
return checks.map((check) => ({
|
|
375
|
+
...check,
|
|
376
|
+
status: check.status === true ? 'fresh' : (check.status === false ? 'stale' : check.status)
|
|
377
|
+
}));
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
function detect(projectRoot) {
|
|
381
|
+
const checks = [
|
|
382
|
+
...routingChecks(projectRoot),
|
|
383
|
+
...packageChecks(projectRoot),
|
|
384
|
+
...agentChecks(projectRoot),
|
|
385
|
+
...workflowRecipeChecks(projectRoot),
|
|
386
|
+
...extensionChecks(projectRoot),
|
|
387
|
+
...releasePolicyChecks(projectRoot)
|
|
388
|
+
];
|
|
389
|
+
const stale = checks.filter((check) => check.status !== 'fresh');
|
|
390
|
+
const byArea = {};
|
|
391
|
+
for (const check of checks) {
|
|
392
|
+
if (!byArea[check.area]) byArea[check.area] = { total: 0, stale: 0 };
|
|
393
|
+
byArea[check.area].total++;
|
|
394
|
+
if (check.status !== 'fresh') byArea[check.area].stale++;
|
|
395
|
+
}
|
|
396
|
+
const spawnRecommendations = [...new Set(stale.map((check) => check.spawn).filter(Boolean))]
|
|
397
|
+
.map((agent) => ({
|
|
398
|
+
agent,
|
|
399
|
+
reason: `Repo surface drift requires ${agent} judgment.`,
|
|
400
|
+
paths: [...new Set(stale.filter((check) => check.spawn === agent).map((check) => check.path))].sort()
|
|
401
|
+
}));
|
|
402
|
+
return {
|
|
403
|
+
status: stale.length === 0 ? 'fresh' : 'stale',
|
|
404
|
+
checks,
|
|
405
|
+
stale,
|
|
406
|
+
byArea,
|
|
407
|
+
spawnRecommendations
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
function routeTemplate(command) {
|
|
412
|
+
const name = command.replace(/^\//, '');
|
|
413
|
+
return [
|
|
414
|
+
'apiVersion: godpowers/v1',
|
|
415
|
+
'kind: CommandRouting',
|
|
416
|
+
'metadata:',
|
|
417
|
+
` command: ${command}`,
|
|
418
|
+
' description: ',
|
|
419
|
+
' tier: 0',
|
|
420
|
+
'',
|
|
421
|
+
'prerequisites:',
|
|
422
|
+
' required: []',
|
|
423
|
+
'',
|
|
424
|
+
'execution:',
|
|
425
|
+
' spawns: [built-in]',
|
|
426
|
+
' context: fresh',
|
|
427
|
+
' writes: []',
|
|
428
|
+
'',
|
|
429
|
+
'success-path:',
|
|
430
|
+
' next-recommended: /god-status',
|
|
431
|
+
'',
|
|
432
|
+
'failure-path:',
|
|
433
|
+
' on-error: /god-doctor',
|
|
434
|
+
'',
|
|
435
|
+
'endoff:',
|
|
436
|
+
' state-update: none',
|
|
437
|
+
' events: [agent.start, agent.end]',
|
|
438
|
+
''
|
|
439
|
+
].join('\n').replace('description: ', `description: Route metadata for /${name}`);
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
function applySafeFixes(projectRoot, report, opts = {}) {
|
|
443
|
+
const applied = [];
|
|
444
|
+
if (!opts.fixRouting) return applied;
|
|
445
|
+
for (const check of report.stale) {
|
|
446
|
+
if (check.area !== 'routing' || !check.safeFix || !check.path.startsWith('routing/')) continue;
|
|
447
|
+
if (exists(projectRoot, check.path)) continue;
|
|
448
|
+
const command = `/${path.basename(check.path, '.yaml')}`;
|
|
449
|
+
write(projectRoot, check.path, routeTemplate(command));
|
|
450
|
+
applied.push({ path: check.path, check: check.id });
|
|
451
|
+
}
|
|
452
|
+
return applied;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
function appendLog(projectRoot, before, after, applied) {
|
|
456
|
+
const now = new Date().toISOString();
|
|
457
|
+
const lines = [];
|
|
458
|
+
if (exists(projectRoot, LOG_PATH)) {
|
|
459
|
+
lines.push(read(projectRoot, LOG_PATH).replace(/\s*$/, ''));
|
|
460
|
+
lines.push('');
|
|
461
|
+
} else {
|
|
462
|
+
lines.push('# Repo Surface Sync Log');
|
|
463
|
+
lines.push('');
|
|
464
|
+
lines.push('- [DECISION] This file records structural repository surface sync checks run by Godpowers.');
|
|
465
|
+
lines.push('- [DECISION] Detection is read-only by default and safe fixes require explicit fix options.');
|
|
466
|
+
lines.push('');
|
|
467
|
+
}
|
|
468
|
+
lines.push(`## ${now}`);
|
|
469
|
+
lines.push('');
|
|
470
|
+
lines.push(`- [DECISION] Repo surface sync status before apply was ${before.status}.`);
|
|
471
|
+
lines.push(`- [DECISION] Repo surface sync status after apply is ${after.status}.`);
|
|
472
|
+
if (applied.length === 0) {
|
|
473
|
+
lines.push('- [DECISION] No structural repository surface files were changed.');
|
|
474
|
+
} else {
|
|
475
|
+
for (const item of applied) {
|
|
476
|
+
lines.push(`- [DECISION] Created or refreshed ${item.path} for ${item.check}.`);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
for (const rec of after.spawnRecommendations) {
|
|
480
|
+
lines.push(`- [HYPOTHESIS] ${rec.agent} should review ${rec.paths.join(', ')}.`);
|
|
481
|
+
}
|
|
482
|
+
lines.push('');
|
|
483
|
+
write(projectRoot, LOG_PATH, lines.join('\n'));
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
function run(projectRoot, opts = {}) {
|
|
487
|
+
const before = detect(projectRoot);
|
|
488
|
+
const applied = applySafeFixes(projectRoot, before, opts);
|
|
489
|
+
const after = detect(projectRoot);
|
|
490
|
+
if (opts.log !== false) appendLog(projectRoot, before, after, applied);
|
|
491
|
+
return {
|
|
492
|
+
before,
|
|
493
|
+
after,
|
|
494
|
+
applied,
|
|
495
|
+
logPath: opts.log === false ? null : LOG_PATH
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
function summary(report) {
|
|
500
|
+
if (report.status === 'fresh') return 'fresh';
|
|
501
|
+
return `${report.stale.length} stale across ${Object.keys(report.byArea).length} areas`;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
module.exports = {
|
|
505
|
+
LOG_PATH,
|
|
506
|
+
REQUIRED_PACKAGE_CHECKS,
|
|
507
|
+
REQUIRED_PACKAGE_FILE_ENTRIES,
|
|
508
|
+
detect,
|
|
509
|
+
run,
|
|
510
|
+
summary,
|
|
511
|
+
routeTemplate
|
|
512
|
+
};
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "godpowers",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.19",
|
|
4
4
|
"description": "AI-powered development system: 109 slash commands and 40 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-planning-systems.js && node scripts/test-feature-awareness.js && node scripts/test-repo-doc-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-automation-providers.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-planning-systems.js && node scripts/test-feature-awareness.js && node scripts/test-repo-doc-sync.js && node scripts/test-repo-surface-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-automation-providers.js && node scripts/test-intent.js && node scripts/test-events.js && node scripts/test-golden-artifacts.js && node scripts/test-install-smoke.js && node scripts/test-checkpoint.js && node scripts/test-extensions.js && node scripts/test-event-reader.js && node scripts/test-state-lock.js && node scripts/test-cost-saver.js && node scripts/test-budget-onoff.js && node scripts/test-workflow-runner.js && npm run test:e2e && node scripts/test-otel-exporter.js && node scripts/test-extensions-publish.js",
|
|
10
10
|
"prepublishOnly": "npm test",
|
|
11
11
|
"validate-skills": "node scripts/validate-skills.js",
|
|
12
12
|
"test:surface": "node scripts/test-doc-surface-counts.js",
|
package/skills/god-docs.md
CHANGED
|
@@ -28,6 +28,10 @@ documentation claims such as README badges, version references, public surface
|
|
|
28
28
|
counts, and `/god-doctor` sample counts. Report this as `Agent: none, local
|
|
29
29
|
runtime only`.
|
|
30
30
|
|
|
31
|
+
Then call `lib/repo-surface-sync.run(projectRoot)` so documentation work sees
|
|
32
|
+
whether route, package, agent, workflow, recipe, extension, or release policy
|
|
33
|
+
surfaces disagree before prose claims are rewritten.
|
|
34
|
+
|
|
31
35
|
Spawn **god-docs-writer** in fresh context.
|
|
32
36
|
|
|
33
37
|
The agent:
|
|
@@ -62,6 +66,7 @@ Godpowers may invoke docs work proactively in two ways:
|
|
|
62
66
|
| Docs changed after code changed | Spawn `god-docs-writer` in drift-check mode when current workflow owns docs | Do not invent new docs scope |
|
|
63
67
|
| 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 |
|
|
64
68
|
| Repo docs surface drift | Run `lib/repo-doc-sync.run` for safe mechanical fixes, then spawn `god-docs-writer` for prose | Do not auto-invent changelog or release notes |
|
|
69
|
+
| Repo structural surface drift | Run `lib/repo-surface-sync.run` and include findings in docs scope | Do not invent routing or agent ownership prose without evidence |
|
|
65
70
|
| `REVIEW-REQUIRED.md` contains docs drift items | Suggest `/god-review-changes` first | Do not auto-clear review items |
|
|
66
71
|
|
|
67
72
|
When auto-invoked, show:
|
|
@@ -72,6 +77,7 @@ Auto-invoked:
|
|
|
72
77
|
Agent: god-docs-writer
|
|
73
78
|
Local syncs:
|
|
74
79
|
+ repo-doc-sync: <safe mechanical fixes, prose review needed, or no-op>
|
|
80
|
+
+ repo-surface-sync: <structural surface fresh, scoped findings, or no-op>
|
|
75
81
|
+ docs-drift-check: <N claims checked, N drift items>
|
|
76
82
|
Artifacts: .godpowers/docs/UPDATE-LOG.md or no-op
|
|
77
83
|
Log: .godpowers/docs/UPDATE-LOG.md
|
package/skills/god-doctor.md
CHANGED
|
@@ -126,6 +126,18 @@ helper writes only safe mechanical version, badge, and count claims. It should
|
|
|
126
126
|
recommend `god-docs-writer` when narrative release, contribution, support, or
|
|
127
127
|
security prose needs judgment.
|
|
128
128
|
|
|
129
|
+
## Repo Surface Sync
|
|
130
|
+
|
|
131
|
+
For initialized projects, `/god-doctor` calls `lib/repo-surface-sync.detect`
|
|
132
|
+
as a read-only diagnostic. It reports structural drift across command routing,
|
|
133
|
+
package payload rules, agent spawn targets, workflow metadata, recipe command
|
|
134
|
+
routes, extension packs, and release policy checks.
|
|
135
|
+
|
|
136
|
+
`/god-doctor --fix` may call
|
|
137
|
+
`lib/repo-surface-sync.run(projectRoot, { fixRouting: true })` to create
|
|
138
|
+
missing routing metadata for shipped slash-command skills. Other structural
|
|
139
|
+
findings should recommend the scoped specialist named by the helper.
|
|
140
|
+
|
|
129
141
|
## Implementation
|
|
130
142
|
|
|
131
143
|
Built-in, no spawned agent. Reads:
|
|
@@ -135,6 +147,8 @@ Built-in, no spawned agent. Reads:
|
|
|
135
147
|
- `lib/feature-awareness.detect(projectRoot)` for existing-project upgrade
|
|
136
148
|
awareness
|
|
137
149
|
- `lib/repo-doc-sync.detect(projectRoot)` for repo documentation freshness
|
|
150
|
+
- `lib/repo-surface-sync.detect(projectRoot)` for structural repo surface
|
|
151
|
+
freshness
|
|
138
152
|
- `bin/install.js` VERSION constant
|
|
139
153
|
|
|
140
154
|
## Exit codes
|
package/skills/god-mode.md
CHANGED
|
@@ -307,6 +307,7 @@ Sync status:
|
|
|
307
307
|
+ feature-awareness: <recorded runtime features, refreshed context, or no-op>
|
|
308
308
|
+ reverse-sync: <counts and result>
|
|
309
309
|
+ repo-doc-sync: <refreshed repo docs, recommended god-docs-writer, or no-op>
|
|
310
|
+
+ repo-surface-sync: <checked structural surfaces, recommended scoped agents, or no-op>
|
|
310
311
|
+ pillars-sync: <counts and result>
|
|
311
312
|
+ checkpoint-sync: <created, updated, no-op, or skipped>
|
|
312
313
|
+ context-refresh: <spawned, no-op, or skipped>
|
|
@@ -330,6 +331,11 @@ The mandatory final sync also receives repo documentation sync through
|
|
|
330
331
|
security policy checks, and Pillars context planning arc-ready before the
|
|
331
332
|
project run is declared complete.
|
|
332
333
|
|
|
334
|
+
The mandatory final sync also receives repo surface sync through `/god-sync`.
|
|
335
|
+
This keeps routes, packages, agent handoffs, workflow metadata, recipe routes,
|
|
336
|
+
extension packs, and release policy checks aligned before the project run is
|
|
337
|
+
declared complete.
|
|
338
|
+
|
|
333
339
|
If `/god-mode` resumes an existing `.godpowers` project that lacks Pillars,
|
|
334
340
|
it Pillar-izes the project before continuing. Existing `.godpowers` artifacts
|
|
335
341
|
become managed source references in the relevant `agents/*.md` files.
|
|
@@ -352,6 +358,7 @@ Sync status:
|
|
|
352
358
|
+ feature-awareness: <recorded runtime features, refreshed context, or no-op>
|
|
353
359
|
+ reverse-sync: <counts and result>
|
|
354
360
|
+ repo-doc-sync: <refreshed repo docs, recommended god-docs-writer, or no-op>
|
|
361
|
+
+ repo-surface-sync: <checked structural surfaces, recommended scoped agents, or no-op>
|
|
355
362
|
+ pillars-sync: <counts and result>
|
|
356
363
|
+ checkpoint-sync: <created, updated, no-op, or skipped>
|
|
357
364
|
+ context-refresh: <spawned, no-op, or skipped>
|
package/skills/god-next.md
CHANGED
|
@@ -25,6 +25,9 @@ Before reading routing data or calling runtime modules, resolve the Godpowers ru
|
|
|
25
25
|
4. For status output, load `<runtimeRoot>/lib/dashboard.js` and call
|
|
26
26
|
`dashboard.compute(projectRoot)`. Use `dashboard.render(result)` for the
|
|
27
27
|
shared dashboard section before adding route-specific detail.
|
|
28
|
+
5. If the checkout runtime and installed runtime differ, say which runtime root
|
|
29
|
+
was used. Only call the output a manual disk scan when `lib/dashboard.js`
|
|
30
|
+
cannot be loaded at all.
|
|
28
31
|
|
|
29
32
|
## Three modes of invocation
|
|
30
33
|
|
|
@@ -347,11 +350,13 @@ Godpowers Next
|
|
|
347
350
|
|
|
348
351
|
Godpowers Dashboard
|
|
349
352
|
|
|
353
|
+
Source: runtime dashboard (lib/dashboard.js)
|
|
354
|
+
|
|
350
355
|
Current status:
|
|
351
356
|
State: proposal
|
|
352
357
|
Phase: [plain-language phase] (tier [human ordinal] of [human total])
|
|
353
358
|
Step: [current step label] (step [n] of [total steps])
|
|
354
|
-
Progress: [pct]% ([done] of [total] steps complete)
|
|
359
|
+
Progress: [pct]% workflow progress ([done] of [total] tracked steps complete)
|
|
355
360
|
Worktree: [clean | modified files unstaged | staged changes | mixed]
|
|
356
361
|
Index: [untouched | staged files listed]
|
|
357
362
|
|
|
@@ -359,7 +364,7 @@ Planning visibility:
|
|
|
359
364
|
PRD: [done | pending | missing | deferred] [path when present]
|
|
360
365
|
Roadmap: [done | pending | missing | deferred] [path when present]
|
|
361
366
|
Current milestone: [roadmap milestone, phase, tier, or next planning gate]
|
|
362
|
-
Completion: [
|
|
367
|
+
Completion basis: [state.json, PROGRESS.md, artifacts, or audit score source]
|
|
363
368
|
|
|
364
369
|
Suggested next: [/god-X]
|
|
365
370
|
|
package/skills/god-status.md
CHANGED
|
@@ -38,9 +38,10 @@ Re-derive state from disk. Your memory is not authoritative. The file system is.
|
|
|
38
38
|
- If PROGRESS.md says "done" but artifact is missing: FLAG as phantom resume
|
|
39
39
|
- If artifact exists but PROGRESS.md says "pending": FLAG as untracked work
|
|
40
40
|
8. Report the Godpowers Dashboard from `dashboard.render(result)`:
|
|
41
|
+
- Dashboard source: runtime dashboard or unavailable manual scan
|
|
41
42
|
- Current mode and scale
|
|
42
43
|
- Current phase, tier number, step label, and step number
|
|
43
|
-
-
|
|
44
|
+
- Workflow progress summary: percentage, completed step count, current step number
|
|
44
45
|
- Planning visibility: PRD status, roadmap status, active milestone, and
|
|
45
46
|
completion basis
|
|
46
47
|
- What happened recently, using CHECKPOINT.md actions when available
|
|
@@ -55,11 +56,16 @@ Re-derive state from disk. Your memory is not authoritative. The file system is.
|
|
|
55
56
|
If the runtime module is unavailable, fall back to the manual scan below and
|
|
56
57
|
say `Dashboard engine: unavailable, manual scan used`.
|
|
57
58
|
|
|
59
|
+
Never mix workflow progress with audit, hygiene, or remediation scores. If an
|
|
60
|
+
audit score is relevant, label it separately as `Audit score`.
|
|
61
|
+
|
|
58
62
|
## Output Format
|
|
59
63
|
|
|
60
64
|
```text
|
|
61
65
|
Godpowers Dashboard
|
|
62
66
|
|
|
67
|
+
Source: runtime dashboard (lib/dashboard.js)
|
|
68
|
+
|
|
63
69
|
Mode: A (greenfield) Scale: medium
|
|
64
70
|
Started: 2026-05-09
|
|
65
71
|
|
|
@@ -67,7 +73,7 @@ Current status:
|
|
|
67
73
|
State: in progress
|
|
68
74
|
Phase: Planning (tier 2 of 4, internal tier-1)
|
|
69
75
|
Step: Architecture (step 3 of 13)
|
|
70
|
-
Progress: 15% (2 of 13 steps complete)
|
|
76
|
+
Progress: 15% workflow progress (2 of 13 tracked steps complete)
|
|
71
77
|
Worktree: clean
|
|
72
78
|
Index: untouched
|
|
73
79
|
|
|
@@ -75,7 +81,7 @@ Planning visibility:
|
|
|
75
81
|
PRD: done .godpowers/prd/PRD.md
|
|
76
82
|
Roadmap: pending
|
|
77
83
|
Current milestone: Planning / Architecture
|
|
78
|
-
Completion:
|
|
84
|
+
Completion basis: .godpowers/state.json workflow steps
|
|
79
85
|
|
|
80
86
|
What happened recently:
|
|
81
87
|
1. PRD artifact verified on disk
|
|
@@ -173,6 +179,8 @@ Report:
|
|
|
173
179
|
- Sync: `fresh`, `missing`, `stale`, or `suggest /god-sync`
|
|
174
180
|
- Docs: `fresh`, `<N> stale, suggest /god-docs`, `possible drift, suggest
|
|
175
181
|
/god-docs`, or `repo-doc-sync ran`
|
|
182
|
+
- Repo surface: `fresh`, `<N> stale, suggest /god-doctor`, or
|
|
183
|
+
`repo-surface-sync ran`
|
|
176
184
|
- Runtime: `not-applicable`, `known URL, suggest /god-test-runtime`, or
|
|
177
185
|
`no known URL, defer deployed verification`
|
|
178
186
|
- Automation: `not configured`, `<N> active`, or
|
package/skills/god-sync.md
CHANGED
|
@@ -39,14 +39,19 @@ User runs `/god-sync` after manual changes. Useful for:
|
|
|
39
39
|
counts, release references, contribution docs, and security policy are
|
|
40
40
|
checked before sync closes. Safe mechanical updates are local runtime work.
|
|
41
41
|
Narrative drift should recommend or spawn `god-docs-writer`.
|
|
42
|
-
5.
|
|
42
|
+
5. Call `lib/repo-surface-sync.run(projectRoot)` so command routing, package
|
|
43
|
+
payload, agent handoffs, workflow metadata, recipe routes, extension packs,
|
|
44
|
+
and release policy are checked before sync closes. Structural drift should
|
|
45
|
+
recommend scoped agents such as `god-auditor`, `god-roadmap-reconciler`, or
|
|
46
|
+
`god-coordinator`.
|
|
47
|
+
6. If repo documentation changed durable project truth, plan or apply Pillars
|
|
43
48
|
updates through `lib/pillars.planArtifactSync` or
|
|
44
49
|
`lib/pillars.applyArtifactSync` under the active Pillars policy.
|
|
45
|
-
|
|
50
|
+
7. If `state.json` contains enabled `source-systems`, auto-invoke
|
|
46
51
|
`lib/source-sync.run(projectRoot)` so current Godpowers progress is written
|
|
47
52
|
back to imported GSD, BMAD, or Superpowers companion files. Report this as
|
|
48
53
|
`Agent: none, local runtime only`.
|
|
49
|
-
|
|
54
|
+
8. Spawn god-updater in fresh context with:
|
|
50
55
|
- The reconciliation verdict (if available from a prior /god-reconcile)
|
|
51
56
|
- Or: re-run reconciliation against current state to detect what changed
|
|
52
57
|
- Recent commits for context
|
|
@@ -58,7 +63,7 @@ Auto-invoked:
|
|
|
58
63
|
Trigger: <manual /god-sync, recipe closeout, /god-mode final sync, or other source>
|
|
59
64
|
Agent: god-updater
|
|
60
65
|
Local syncs:
|
|
61
|
-
- pending: feature-awareness, reverse-sync, source-sync, repo-doc-sync, pillars-sync, checkpoint-sync, context-refresh
|
|
66
|
+
- pending: feature-awareness, reverse-sync, source-sync, repo-doc-sync, repo-surface-sync, pillars-sync, checkpoint-sync, context-refresh
|
|
62
67
|
Artifacts: pending
|
|
63
68
|
Log: .godpowers/SYNC-LOG.md
|
|
64
69
|
```
|
|
@@ -86,6 +91,7 @@ Sync status:
|
|
|
86
91
|
+ feature-awareness: <recorded runtime features, refreshed context, or no-op>
|
|
87
92
|
+ source-sync: <written GSD/BMAD/Superpowers companion files, no-op, or skipped>
|
|
88
93
|
+ repo-doc-sync: <refreshed README badges/counts, recommended god-docs-writer, or no-op>
|
|
94
|
+
+ repo-surface-sync: <checked routes/package/agents/workflows/extensions, recommended scoped agents, or no-op>
|
|
89
95
|
+ pillars-sync: <updated N pillar files, no-op, or proposed>
|
|
90
96
|
+ checkpoint-sync: <CHECKPOINT.md updated or skipped>
|
|
91
97
|
+ context-refresh: <updated AGENTS.md/tool pointers, no-op, or skipped by setting>
|
|
@@ -131,6 +137,7 @@ Next:
|
|
|
131
137
|
| Lost threads | Active threads get progress notes |
|
|
132
138
|
| Pillars drift | Keeps `agents/*.md` aligned with current `.godpowers` artifacts |
|
|
133
139
|
| Repo docs drift | Keeps README badges, repo docs, and release surfaces aligned |
|
|
140
|
+
| Repo surface drift | Keeps routes, packages, agents, workflows, recipes, and extensions aligned |
|
|
134
141
|
|
|
135
142
|
The loop:
|
|
136
143
|
|
package/skills/god-version.md
CHANGED
|
@@ -14,12 +14,12 @@ Print version and a short capability summary.
|
|
|
14
14
|
## Output
|
|
15
15
|
|
|
16
16
|
```
|
|
17
|
-
Godpowers v1.6.
|
|
17
|
+
Godpowers v1.6.19
|
|
18
18
|
Install: /Users/.../.claude/ (matches package.json)
|
|
19
19
|
Surface: 109 skills, 40 agents, 13 workflows, 36 recipes
|
|
20
20
|
Schema: intent.v1, state.v1, events.v1, workflow.v1, routing.v1, recipe.v1
|
|
21
21
|
External integrations available: impeccable, agent-browser (others lazy)
|
|
22
|
-
Feature awareness: planning-system migration, source-system sync-back, context refresh
|
|
22
|
+
Feature awareness: planning-system migration, source-system sync-back, context refresh, dashboard status labels, repo documentation sync, repo surface sync
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
## Subcommands
|