godpowers 1.6.11 → 1.6.13
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 +61 -0
- package/README.md +42 -6
- package/RELEASE.md +35 -38
- package/SKILL.md +42 -3
- package/agents/god-orchestrator.md +23 -10
- package/bin/install.js +75 -3
- package/lib/automation-providers.js +411 -0
- package/lib/dashboard.js +311 -0
- package/package.json +3 -3
- package/routing/god-automation-setup.yaml +25 -0
- package/routing/god-automation-status.yaml +24 -0
- package/skills/god-automation-setup.md +105 -0
- package/skills/god-automation-status.md +76 -0
- package/skills/god-doctor.md +1 -1
- package/skills/god-mode.md +9 -8
- package/skills/god-next.md +41 -11
- package/skills/god-status.md +33 -11
- package/skills/god-version.md +1 -1
package/lib/dashboard.js
ADDED
|
@@ -0,0 +1,311 @@
|
|
|
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
|
+
const automationProviders = require('./automation-providers');
|
|
15
|
+
|
|
16
|
+
const GOD_DIR = '.godpowers';
|
|
17
|
+
const PRD_PATH = '.godpowers/prd/PRD.md';
|
|
18
|
+
const ROADMAP_PATH = '.godpowers/roadmap/ROADMAP.md';
|
|
19
|
+
const CHECKPOINT_PATH = '.godpowers/CHECKPOINT.md';
|
|
20
|
+
const SYNC_LOG_PATH = '.godpowers/SYNC-LOG.md';
|
|
21
|
+
const REVIEW_PATH = '.godpowers/REVIEW-REQUIRED.md';
|
|
22
|
+
|
|
23
|
+
function exists(projectRoot, relPath) {
|
|
24
|
+
return fs.existsSync(path.join(projectRoot, relPath));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function readText(projectRoot, relPath) {
|
|
28
|
+
const file = path.join(projectRoot, relPath);
|
|
29
|
+
if (!fs.existsSync(file)) return '';
|
|
30
|
+
return fs.readFileSync(file, 'utf8');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function mtimeMs(projectRoot, relPath) {
|
|
34
|
+
const file = path.join(projectRoot, relPath);
|
|
35
|
+
if (!fs.existsSync(file)) return null;
|
|
36
|
+
return fs.statSync(file).mtimeMs;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function artifactStatus(projectRoot, relPath) {
|
|
40
|
+
return exists(projectRoot, relPath) ? 'done' : 'missing';
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function currentPhase(progress) {
|
|
44
|
+
const current = progress && progress.current;
|
|
45
|
+
if (!current) {
|
|
46
|
+
return {
|
|
47
|
+
phase: 'Complete',
|
|
48
|
+
tierKey: null,
|
|
49
|
+
tierNumber: null,
|
|
50
|
+
tierTotal: 0,
|
|
51
|
+
tierOrdinal: 0,
|
|
52
|
+
tierCount: 0,
|
|
53
|
+
tierLabel: 'Complete',
|
|
54
|
+
stepLabel: 'Complete',
|
|
55
|
+
stepNumber: 0,
|
|
56
|
+
totalSteps: progress ? progress.total : 0
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const tierNumbers = (progress.tiers || [])
|
|
61
|
+
.map(tier => tier.tierNumber)
|
|
62
|
+
.filter(n => Number.isFinite(n))
|
|
63
|
+
.sort((a, b) => a - b);
|
|
64
|
+
const tierTotal = tierNumbers.length > 0 ? Math.max(...tierNumbers) : current.tierNumber;
|
|
65
|
+
const tierOrdinal = tierNumbers.indexOf(current.tierNumber) + 1;
|
|
66
|
+
const tierCount = tierNumbers.length || (Number.isFinite(current.tierNumber) ? current.tierNumber + 1 : 0);
|
|
67
|
+
|
|
68
|
+
return {
|
|
69
|
+
phase: current.tierLabel,
|
|
70
|
+
tierKey: current.tierKey,
|
|
71
|
+
tierNumber: current.tierNumber,
|
|
72
|
+
tierTotal,
|
|
73
|
+
tierOrdinal: tierOrdinal > 0 ? tierOrdinal : 1,
|
|
74
|
+
tierCount,
|
|
75
|
+
tierLabel: current.tierLabel,
|
|
76
|
+
stepLabel: current.subStepLabel,
|
|
77
|
+
stepNumber: current.ordinal,
|
|
78
|
+
totalSteps: progress.total
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function worktree(projectRoot) {
|
|
83
|
+
try {
|
|
84
|
+
const out = cp.execFileSync('git', ['status', '--porcelain'], {
|
|
85
|
+
cwd: projectRoot,
|
|
86
|
+
encoding: 'utf8',
|
|
87
|
+
stdio: ['ignore', 'pipe', 'ignore']
|
|
88
|
+
});
|
|
89
|
+
return parseGitStatus(out);
|
|
90
|
+
} catch (e) {
|
|
91
|
+
return { worktree: 'unknown', index: 'unknown', entries: [] };
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function parseGitStatus(out) {
|
|
96
|
+
if (!out || !out.trim()) {
|
|
97
|
+
return { worktree: 'clean', index: 'untouched', entries: [] };
|
|
98
|
+
}
|
|
99
|
+
const entries = out.split(/\r?\n/).filter(Boolean);
|
|
100
|
+
const staged = entries.filter(line => line[0] !== ' ' && line[0] !== '?');
|
|
101
|
+
const unstaged = entries.filter(line => line[1] !== ' ' || line.startsWith('??'));
|
|
102
|
+
let worktreeState = 'modified files unstaged';
|
|
103
|
+
if (staged.length > 0 && unstaged.length > 0) worktreeState = 'mixed';
|
|
104
|
+
else if (staged.length > 0) worktreeState = 'staged changes';
|
|
105
|
+
return {
|
|
106
|
+
worktree: worktreeState,
|
|
107
|
+
index: staged.length > 0 ? staged.map(statusPath).join(', ') : 'untouched',
|
|
108
|
+
entries
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function statusPath(line) {
|
|
113
|
+
if (line.startsWith('?? ')) return line.slice(3);
|
|
114
|
+
return line.length > 3 ? line.slice(3) : line.trim();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function reviewCount(projectRoot) {
|
|
118
|
+
const text = readText(projectRoot, REVIEW_PATH);
|
|
119
|
+
if (!text.trim()) return 0;
|
|
120
|
+
const unchecked = (text.match(/\[\s\]\s*(?:TODO|PENDING|OPEN|REVIEW|BLOCKER|[Pp][0-3])/g) || []).length;
|
|
121
|
+
if (unchecked > 0) return unchecked;
|
|
122
|
+
const headings = (text.match(/^###\s+/gm) || []).length;
|
|
123
|
+
return headings;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function hasRecentPath(projectRoot, relPath, maxAgeMs) {
|
|
127
|
+
const modified = mtimeMs(projectRoot, relPath);
|
|
128
|
+
if (!modified) return false;
|
|
129
|
+
return Date.now() - modified <= maxAgeMs;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function proactiveChecks(projectRoot, changedFiles = []) {
|
|
133
|
+
const oneDay = 24 * 60 * 60 * 1000;
|
|
134
|
+
const thirtyDays = 30 * oneDay;
|
|
135
|
+
const reviews = reviewCount(projectRoot);
|
|
136
|
+
|
|
137
|
+
const checkpoint = exists(projectRoot, CHECKPOINT_PATH)
|
|
138
|
+
? (hasRecentPath(projectRoot, CHECKPOINT_PATH, oneDay) ? 'fresh' : 'stale')
|
|
139
|
+
: 'missing';
|
|
140
|
+
|
|
141
|
+
const sync = exists(projectRoot, SYNC_LOG_PATH)
|
|
142
|
+
? (hasRecentPath(projectRoot, SYNC_LOG_PATH, oneDay) ? 'fresh' : 'stale, suggest /god-sync')
|
|
143
|
+
: 'missing, suggest /god-sync';
|
|
144
|
+
|
|
145
|
+
const hygieneFresh = exists(projectRoot, CHECKPOINT_PATH)
|
|
146
|
+
&& hasRecentPath(projectRoot, CHECKPOINT_PATH, thirtyDays);
|
|
147
|
+
|
|
148
|
+
const pkgChanged = changedFiles.some(file => [
|
|
149
|
+
'package.json',
|
|
150
|
+
'package-lock.json',
|
|
151
|
+
'pnpm-lock.yaml',
|
|
152
|
+
'yarn.lock'
|
|
153
|
+
].includes(file));
|
|
154
|
+
const sensitiveChanged = changedFiles.some(file => matchesAnyPrefix(file, [
|
|
155
|
+
'.env.example',
|
|
156
|
+
'SECURITY.md',
|
|
157
|
+
'.github/workflows',
|
|
158
|
+
'auth',
|
|
159
|
+
'security'
|
|
160
|
+
]));
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
checkpoint,
|
|
164
|
+
reviews: reviews > 0 ? `${reviews} pending, suggest /god-review-changes` : 'none',
|
|
165
|
+
sync,
|
|
166
|
+
docs: 'fresh',
|
|
167
|
+
runtime: 'not-applicable',
|
|
168
|
+
automation: automationSummary(projectRoot),
|
|
169
|
+
security: sensitiveChanged ? 'sensitive files changed, suggest /god-harden' : 'clear',
|
|
170
|
+
dependencies: pkgChanged ? 'dependency files changed, suggest /god-update-deps' : 'clear',
|
|
171
|
+
hygiene: hygieneFresh ? 'fresh' : 'stale, suggest /god-hygiene'
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function automationSummary(projectRoot) {
|
|
176
|
+
const report = automationProviders.detect(projectRoot);
|
|
177
|
+
if (report.active.length > 0) {
|
|
178
|
+
return `${report.active.length} active`;
|
|
179
|
+
}
|
|
180
|
+
if (report.recommendedProvider) {
|
|
181
|
+
return `available via ${report.recommendedProvider.id}, suggest /god-automation-setup`;
|
|
182
|
+
}
|
|
183
|
+
return 'not configured';
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function matchesAnyPrefix(file, prefixes) {
|
|
187
|
+
return prefixes.some(prefix => file === prefix || file.startsWith(`${prefix}/`));
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function planningVisibility(projectRoot, progress) {
|
|
191
|
+
const prd = artifactStatus(projectRoot, PRD_PATH);
|
|
192
|
+
const roadmap = artifactStatus(projectRoot, ROADMAP_PATH);
|
|
193
|
+
const phase = currentPhase(progress);
|
|
194
|
+
return {
|
|
195
|
+
prd: { status: prd, path: prd === 'done' ? PRD_PATH : null },
|
|
196
|
+
roadmap: { status: roadmap, path: roadmap === 'done' ? ROADMAP_PATH : null },
|
|
197
|
+
currentMilestone: phase.stepLabel ? `${phase.phase} / ${phase.stepLabel}` : phase.phase,
|
|
198
|
+
completion: `${progress.percent}% based on state.json tracked steps`
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function compute(projectRoot, opts = {}) {
|
|
203
|
+
const s = state.read(projectRoot);
|
|
204
|
+
const git = opts.git === false ? { worktree: 'not-checked', index: 'not-checked', entries: [] } : worktree(projectRoot);
|
|
205
|
+
|
|
206
|
+
if (!s) {
|
|
207
|
+
const next = { command: '/god-init', reason: 'No Godpowers project initialized' };
|
|
208
|
+
return {
|
|
209
|
+
state: 'not initialized',
|
|
210
|
+
mode: null,
|
|
211
|
+
lifecycle: 'pre-init',
|
|
212
|
+
progress: { percent: 0, completed: 0, total: 0, currentStep: 0, current: null, tiers: [] },
|
|
213
|
+
current: currentPhase(null),
|
|
214
|
+
worktree: git.worktree,
|
|
215
|
+
index: git.index,
|
|
216
|
+
planning: {
|
|
217
|
+
prd: { status: 'missing', path: null },
|
|
218
|
+
roadmap: { status: 'missing', path: null },
|
|
219
|
+
currentMilestone: 'Project initialization',
|
|
220
|
+
completion: '0% based on missing state.json'
|
|
221
|
+
},
|
|
222
|
+
proactive: proactiveChecks(projectRoot, git.entries.map(statusPath)),
|
|
223
|
+
next,
|
|
224
|
+
openItems: ['No .godpowers/state.json found']
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const progress = state.progressSummary(s);
|
|
229
|
+
const current = currentPhase(progress);
|
|
230
|
+
const next = router.suggestNext(projectRoot);
|
|
231
|
+
const openItems = [];
|
|
232
|
+
const drift = state.detectDrift(projectRoot);
|
|
233
|
+
|
|
234
|
+
if (drift.length > 0) openItems.push(`${drift.length} artifact drift item(s), suggest /god-repair`);
|
|
235
|
+
if (next && next.blocker) openItems.push(`${next.blocker} blocks next route`);
|
|
236
|
+
if (reviewCount(projectRoot) > 0) openItems.push('pending review items');
|
|
237
|
+
if (openItems.length === 0) openItems.push('none');
|
|
238
|
+
|
|
239
|
+
return {
|
|
240
|
+
state: progress.remaining === 0 ? 'complete' : 'in progress',
|
|
241
|
+
mode: s.mode || s['mode-announced-as'] || null,
|
|
242
|
+
lifecycle: s['lifecycle-phase'] || 'in-arc',
|
|
243
|
+
progress,
|
|
244
|
+
current,
|
|
245
|
+
worktree: git.worktree,
|
|
246
|
+
index: git.index,
|
|
247
|
+
planning: planningVisibility(projectRoot, progress),
|
|
248
|
+
proactive: proactiveChecks(projectRoot, git.entries.map(statusPath)),
|
|
249
|
+
next,
|
|
250
|
+
openItems
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function render(dashboard) {
|
|
255
|
+
const current = dashboard.current || {};
|
|
256
|
+
const planning = dashboard.planning || {};
|
|
257
|
+
const proactive = dashboard.proactive || {};
|
|
258
|
+
const next = dashboard.next || {};
|
|
259
|
+
const progress = dashboard.progress || {};
|
|
260
|
+
const prd = planning.prd || {};
|
|
261
|
+
const roadmap = planning.roadmap || {};
|
|
262
|
+
const openItems = dashboard.openItems && dashboard.openItems.length > 0
|
|
263
|
+
? dashboard.openItems
|
|
264
|
+
: ['none'];
|
|
265
|
+
|
|
266
|
+
return [
|
|
267
|
+
'Godpowers Dashboard',
|
|
268
|
+
'',
|
|
269
|
+
'Current status:',
|
|
270
|
+
` State: ${dashboard.state}`,
|
|
271
|
+
` Phase: ${current.phase || 'unknown'}${current.tierNumber !== null && current.tierNumber !== undefined ? ` (tier ${current.tierOrdinal} of ${current.tierCount}, internal ${current.tierKey || `tier-${current.tierNumber}`})` : ''}`,
|
|
272
|
+
` Step: ${current.stepLabel || 'unknown'}${current.stepNumber ? ` (step ${current.stepNumber} of ${current.totalSteps})` : ''}`,
|
|
273
|
+
` Progress: ${progress.percent || 0}% (${progress.completed || 0} of ${progress.total || 0} steps complete)`,
|
|
274
|
+
` Worktree: ${dashboard.worktree}`,
|
|
275
|
+
` Index: ${dashboard.index}`,
|
|
276
|
+
'',
|
|
277
|
+
'Planning visibility:',
|
|
278
|
+
` PRD: ${prd.status || 'missing'}${prd.path ? ` ${prd.path}` : ''}`,
|
|
279
|
+
` Roadmap: ${roadmap.status || 'missing'}${roadmap.path ? ` ${roadmap.path}` : ''}`,
|
|
280
|
+
` Current milestone: ${planning.currentMilestone || 'unknown'}`,
|
|
281
|
+
` Completion: ${planning.completion || 'unknown'}`,
|
|
282
|
+
'',
|
|
283
|
+
'Proactive checks:',
|
|
284
|
+
` Checkpoint: ${proactive.checkpoint || 'unknown'}`,
|
|
285
|
+
` Reviews: ${proactive.reviews || 'unknown'}`,
|
|
286
|
+
` Sync: ${proactive.sync || 'unknown'}`,
|
|
287
|
+
` Docs: ${proactive.docs || 'unknown'}`,
|
|
288
|
+
` Runtime: ${proactive.runtime || 'unknown'}`,
|
|
289
|
+
` Automation: ${proactive.automation || 'unknown'}`,
|
|
290
|
+
` Security: ${proactive.security || 'unknown'}`,
|
|
291
|
+
` Dependencies: ${proactive.dependencies || 'unknown'}`,
|
|
292
|
+
` Hygiene: ${proactive.hygiene || 'unknown'}`,
|
|
293
|
+
'',
|
|
294
|
+
'Open items:',
|
|
295
|
+
...openItems.map((item, index) => ` ${index + 1}. ${item}`),
|
|
296
|
+
'',
|
|
297
|
+
'Next:',
|
|
298
|
+
` Recommended: ${next.command || 'describe the next intent'}`,
|
|
299
|
+
` Why: ${next.reason || 'No route was computed.'}`
|
|
300
|
+
].join('\n');
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
module.exports = {
|
|
304
|
+
compute,
|
|
305
|
+
render,
|
|
306
|
+
worktree,
|
|
307
|
+
parseGitStatus,
|
|
308
|
+
proactiveChecks,
|
|
309
|
+
automationSummary,
|
|
310
|
+
planningVisibility
|
|
311
|
+
};
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "godpowers",
|
|
3
|
-
"version": "1.6.
|
|
4
|
-
"description": "AI-powered development system:
|
|
3
|
+
"version": "1.6.13",
|
|
4
|
+
"description": "AI-powered development system: 108 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-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",
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
apiVersion: godpowers/v1
|
|
2
|
+
kind: CommandRouting
|
|
3
|
+
metadata:
|
|
4
|
+
command: /god-automation-setup
|
|
5
|
+
description: Prepare opt-in host automation setup
|
|
6
|
+
tier: 0
|
|
7
|
+
|
|
8
|
+
prerequisites:
|
|
9
|
+
required: []
|
|
10
|
+
|
|
11
|
+
execution:
|
|
12
|
+
spawns: [built-in]
|
|
13
|
+
context: fresh
|
|
14
|
+
writes:
|
|
15
|
+
- .godpowers/automations.json
|
|
16
|
+
|
|
17
|
+
success-path:
|
|
18
|
+
next-recommended: /god-automation-status
|
|
19
|
+
|
|
20
|
+
failure-path:
|
|
21
|
+
on-error: /god-doctor
|
|
22
|
+
|
|
23
|
+
endoff:
|
|
24
|
+
state-update: tier-0 updated for /god-automation-setup
|
|
25
|
+
events: [agent.start, artifact.created, agent.end]
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
apiVersion: godpowers/v1
|
|
2
|
+
kind: CommandRouting
|
|
3
|
+
metadata:
|
|
4
|
+
command: /god-automation-status
|
|
5
|
+
description: Show host automation provider support
|
|
6
|
+
tier: 0
|
|
7
|
+
|
|
8
|
+
prerequisites:
|
|
9
|
+
required: []
|
|
10
|
+
|
|
11
|
+
execution:
|
|
12
|
+
spawns: [built-in]
|
|
13
|
+
context: fresh
|
|
14
|
+
writes: []
|
|
15
|
+
|
|
16
|
+
success-path:
|
|
17
|
+
next-recommended: /god-automation-setup
|
|
18
|
+
|
|
19
|
+
failure-path:
|
|
20
|
+
on-error: /god-doctor
|
|
21
|
+
|
|
22
|
+
endoff:
|
|
23
|
+
state-update: tier-0 updated for /god-automation-status
|
|
24
|
+
events: [agent.start, agent.end]
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: god-automation-setup
|
|
3
|
+
description: |
|
|
4
|
+
Prepare an explicit opt-in setup plan for host-native Godpowers automation.
|
|
5
|
+
Never creates schedules, routines, background agents, API triggers, or CI
|
|
6
|
+
workflows without user approval.
|
|
7
|
+
|
|
8
|
+
Triggers on: "god automation setup", "set up background automation", "make godpowers proactive"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# /god-automation-setup
|
|
12
|
+
|
|
13
|
+
Prepare a safe, host-native automation setup plan.
|
|
14
|
+
|
|
15
|
+
## Process
|
|
16
|
+
|
|
17
|
+
1. Resolve the runtime root and load `<runtimeRoot>/lib/automation-providers.js`.
|
|
18
|
+
2. Call `automation.setupPlan(projectRoot)`.
|
|
19
|
+
3. Print `automation.renderSetupPlan(plan)`.
|
|
20
|
+
4. Ask the user to choose:
|
|
21
|
+
- provider
|
|
22
|
+
- templates
|
|
23
|
+
- cadence
|
|
24
|
+
- connector or repository scope
|
|
25
|
+
- whether write actions are allowed
|
|
26
|
+
5. Create provider-native automation only if the current host exposes a safe
|
|
27
|
+
automation tool and the user explicitly approved the exact provider,
|
|
28
|
+
template, cadence, and scope.
|
|
29
|
+
6. After creation, write or update `.godpowers/automations.json` with:
|
|
30
|
+
- automation id
|
|
31
|
+
- provider id
|
|
32
|
+
- status
|
|
33
|
+
- cadence
|
|
34
|
+
- prompt summary
|
|
35
|
+
- created timestamp
|
|
36
|
+
- host surface used
|
|
37
|
+
7. Run `/god-automation-status` after setup and show the result.
|
|
38
|
+
|
|
39
|
+
## Hard Stops
|
|
40
|
+
|
|
41
|
+
Do not create automations during install.
|
|
42
|
+
|
|
43
|
+
Do not create any automation that can do these unless the user explicitly asks
|
|
44
|
+
for that exact write-capable automation:
|
|
45
|
+
|
|
46
|
+
- stage, commit, push, merge, package, publish, or release
|
|
47
|
+
- deploy to staging or production
|
|
48
|
+
- access provider dashboards, DNS, credentials, secrets, or billing
|
|
49
|
+
- clear `.godpowers/REVIEW-REQUIRED.md`
|
|
50
|
+
- accept Critical security findings
|
|
51
|
+
- run broad dependency upgrades
|
|
52
|
+
- delete files, reset branches, or clean worktrees
|
|
53
|
+
|
|
54
|
+
## Safe Starting Templates
|
|
55
|
+
|
|
56
|
+
- `daily-status`: run `godpowers status --project .` and summarize current phase, progress, open items, and next action
|
|
57
|
+
- `stale-checkpoint`: inspect checkpoint freshness and suggest `/god-sync` or `/god-resume-work`
|
|
58
|
+
- `review-queue`: report unresolved review items without clearing them
|
|
59
|
+
- `weekly-hygiene`: report docs, dependencies, checkpoint, reviews, and hygiene signals
|
|
60
|
+
- `release-readiness`: report release readiness without publishing
|
|
61
|
+
|
|
62
|
+
## Provider Guidance
|
|
63
|
+
|
|
64
|
+
- Codex App: use native Codex automations when the host exposes them.
|
|
65
|
+
- Claude Code: use `/schedule` for scheduled routines. Use Claude web for API or GitHub triggers.
|
|
66
|
+
- Cline: use `cline schedule` or the Cline SDK scheduler.
|
|
67
|
+
- Kilo: use KiloClaw Scheduled Triggers.
|
|
68
|
+
- Qwen Code: use `/loop` only for session-scoped checks and report that it is not durable.
|
|
69
|
+
- Cursor: use Background Agents or the Background Agent API for branch-scoped async work.
|
|
70
|
+
- GitHub Copilot: use issues, pull requests, or Copilot cloud agent entry points.
|
|
71
|
+
- Windsurf: install workflows or skills, but report that workflows are manual-only.
|
|
72
|
+
- Gemini CLI, OpenCode, CodeBuddy, and Pi: use headless or SDK execution only with an approved scheduler.
|
|
73
|
+
- Trae and Antigravity: report scheduled automation as unknown unless the host proves otherwise.
|
|
74
|
+
|
|
75
|
+
## Output Shape
|
|
76
|
+
|
|
77
|
+
```text
|
|
78
|
+
Godpowers Automation Setup Plan
|
|
79
|
+
|
|
80
|
+
Recommended provider: <provider>
|
|
81
|
+
|
|
82
|
+
Setup steps:
|
|
83
|
+
1. <host-native setup step>
|
|
84
|
+
|
|
85
|
+
Recommended safe templates:
|
|
86
|
+
- <template id>: <prompt>
|
|
87
|
+
|
|
88
|
+
Approval required:
|
|
89
|
+
- Choose a provider
|
|
90
|
+
- Choose one or more templates
|
|
91
|
+
- Confirm any host-native schedule, routine, background agent, API trigger, or connector scope
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Proposition Closeout
|
|
95
|
+
|
|
96
|
+
End with:
|
|
97
|
+
|
|
98
|
+
```text
|
|
99
|
+
Proposition:
|
|
100
|
+
1. Implement partial: create one read-only automation after approval
|
|
101
|
+
2. Implement complete: create all safe read-only automations after approval
|
|
102
|
+
3. Discuss more: tune provider, cadence, or safety rules
|
|
103
|
+
4. Inspect status: /god-automation-status
|
|
104
|
+
Recommended: <one option tied to provider capability and user risk>
|
|
105
|
+
```
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: god-automation-status
|
|
3
|
+
description: |
|
|
4
|
+
Show host-native automation provider support for the current project.
|
|
5
|
+
Reports Codex App, Claude Routines, Cline schedules, Qwen loops, Cursor
|
|
6
|
+
background agents, Copilot cloud agent, and scriptable CLI providers.
|
|
7
|
+
|
|
8
|
+
Triggers on: "god automation status", "automation support", "background automation status"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# /god-automation-status
|
|
12
|
+
|
|
13
|
+
Show which automation providers Godpowers can safely use in this project.
|
|
14
|
+
|
|
15
|
+
## Process
|
|
16
|
+
|
|
17
|
+
1. Resolve the runtime root and load `<runtimeRoot>/lib/automation-providers.js`.
|
|
18
|
+
2. Call `automation.detect(projectRoot)`.
|
|
19
|
+
3. Print `automation.render(result)`.
|
|
20
|
+
4. Read `.godpowers/automations.json` if present and report active automations.
|
|
21
|
+
5. Do not create, update, trigger, pause, resume, or delete schedules.
|
|
22
|
+
6. Do not stage, commit, push, publish, deploy, clear review queues, or access
|
|
23
|
+
provider dashboards.
|
|
24
|
+
|
|
25
|
+
If the executable runtime module is unavailable, manually report these provider
|
|
26
|
+
classes:
|
|
27
|
+
|
|
28
|
+
- native-scheduler: Codex App automations, Claude Code routines, Cline schedules, Kilo scheduled triggers
|
|
29
|
+
- session-scheduler: Qwen Code `/loop`
|
|
30
|
+
- background-agent: Cursor Background Agents, GitHub Copilot cloud agent
|
|
31
|
+
- scriptable-headless: Gemini CLI, OpenCode, CodeBuddy SDK, Pi SDK
|
|
32
|
+
- manual-workflow: Windsurf workflows, Augment subagents
|
|
33
|
+
- unknown: Trae, Antigravity scheduled automation
|
|
34
|
+
|
|
35
|
+
## Output Shape
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
Godpowers Automation Providers
|
|
39
|
+
|
|
40
|
+
Config: .godpowers/automations.json
|
|
41
|
+
Recommended provider: <provider or none available>
|
|
42
|
+
|
|
43
|
+
Active automations:
|
|
44
|
+
- <id via provider: status or none recorded>
|
|
45
|
+
|
|
46
|
+
Provider status:
|
|
47
|
+
- <provider>: <status> (<class>)
|
|
48
|
+
|
|
49
|
+
Safe templates:
|
|
50
|
+
- daily-status: Daily Godpowers status, Daily at 9am local time, read-only
|
|
51
|
+
- stale-checkpoint: Stale checkpoint watcher, Weekdays at 9am local time, read-only
|
|
52
|
+
- review-queue: Review queue watcher, Daily at 10am local time, read-only
|
|
53
|
+
- weekly-hygiene: Weekly hygiene report, Monday at 9am local time, read-only
|
|
54
|
+
- release-readiness: Release readiness report, Manual or before release, read-only
|
|
55
|
+
|
|
56
|
+
Safety rules:
|
|
57
|
+
- Do not create automations during install.
|
|
58
|
+
- Create schedules, routines, background agents, or API triggers only after explicit user approval.
|
|
59
|
+
- Default templates are read-only.
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Proposition Closeout
|
|
63
|
+
|
|
64
|
+
End with:
|
|
65
|
+
|
|
66
|
+
```text
|
|
67
|
+
Proposition:
|
|
68
|
+
1. Implement partial: /god-automation-setup for one safe read-only template
|
|
69
|
+
2. Implement complete: /god-automation-setup for all safe templates supported by the current host
|
|
70
|
+
3. Discuss more: /god-discuss automation policy and provider choice
|
|
71
|
+
4. Inspect status: /god-status to see project progress and automation status together
|
|
72
|
+
Recommended: <one option tied to the detected provider>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
If no provider is available, recommend manual `/god-next` or
|
|
76
|
+
`godpowers next --project .`.
|
package/skills/god-doctor.md
CHANGED
|
@@ -46,7 +46,7 @@ Plain-text report grouped by severity:
|
|
|
46
46
|
GODPOWERS DOCTOR
|
|
47
47
|
|
|
48
48
|
Install: claude (~/.claude/)
|
|
49
|
-
[OK]
|
|
49
|
+
[OK] 108 skills installed
|
|
50
50
|
[OK] 39 agents installed
|
|
51
51
|
[OK] VERSION matches (1.6.6)
|
|
52
52
|
[WARN] routing/god-doctor.yaml exists but skill file did not until now
|
package/skills/god-mode.md
CHANGED
|
@@ -178,8 +178,9 @@ Show:
|
|
|
178
178
|
- short progress updates for phases, commands, validations, and file edits
|
|
179
179
|
- concise validation summaries instead of full command noise when possible
|
|
180
180
|
- final changed paths, validation results, and completion or pause status
|
|
181
|
-
- final
|
|
182
|
-
|
|
181
|
+
- final Godpowers Dashboard from disk, including phase, tier, step, progress,
|
|
182
|
+
planning visibility, proactive checks, open items, worktree/index state, and
|
|
183
|
+
recommended next action
|
|
183
184
|
|
|
184
185
|
Hide:
|
|
185
186
|
- raw spawn input
|
|
@@ -202,11 +203,11 @@ missing them, synthesize them from disk state before continuing.
|
|
|
202
203
|
|
|
203
204
|
Before work starts:
|
|
204
205
|
|
|
205
|
-
```
|
|
206
|
+
```text
|
|
206
207
|
Next step
|
|
207
|
-
|
|
208
|
-
Tier: <tier-number> <tier-label>
|
|
208
|
+
Phase: <plain-language phase> (tier <human ordinal> of <human total>)
|
|
209
209
|
Step: <sub-step-label>
|
|
210
|
+
Progress: <pct>% (<done> of <total> steps complete; step <n> of <total>)
|
|
210
211
|
Why this now: <one sentence>
|
|
211
212
|
What will happen:
|
|
212
213
|
1. <observable action>
|
|
@@ -216,11 +217,11 @@ Expected output: <artifact path or verification result>
|
|
|
216
217
|
|
|
217
218
|
After work completes or pauses:
|
|
218
219
|
|
|
219
|
-
```
|
|
220
|
+
```text
|
|
220
221
|
Step result
|
|
221
|
-
|
|
222
|
-
Tier: <tier-number> <tier-label>
|
|
222
|
+
Phase: <plain-language phase> (tier <human ordinal> of <human total>)
|
|
223
223
|
Step: <sub-step-label>
|
|
224
|
+
Progress: <pct>% (<done> of <total> steps complete; step <n> of <total>)
|
|
224
225
|
Result: <done | blocked | failed | skipped | imported>
|
|
225
226
|
What happened:
|
|
226
227
|
1. <observable action completed>
|