godpowers 0.15.3 → 0.15.4
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 +17 -0
- package/bin/install.js +37 -8
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,23 @@ 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
|
+
## [0.15.4] - 2026-05-11
|
|
9
|
+
|
|
10
|
+
Codex command discovery release. Installs Godpowers commands in the directory
|
|
11
|
+
shape Codex loads as individual skills.
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
- Codex installs now write each command as `~/.codex/skills/<command>/SKILL.md`,
|
|
15
|
+
so commands like `/god-next`, `/god-status`, and `/god-init` show up as
|
|
16
|
+
separate Codex skills instead of only exposing the umbrella `godpowers`
|
|
17
|
+
skill.
|
|
18
|
+
- Codex uninstall now removes those command directories while preserving
|
|
19
|
+
unrelated user skills.
|
|
20
|
+
|
|
21
|
+
### Tests
|
|
22
|
+
- Added installer smoke coverage for Codex skill-directory installs and
|
|
23
|
+
uninstalls.
|
|
24
|
+
|
|
8
25
|
## [0.15.3] - 2026-05-11
|
|
9
26
|
|
|
10
27
|
Documentation refresh release. Aligns the public docs, architecture map,
|
package/bin/install.js
CHANGED
|
@@ -171,6 +171,36 @@ function copyRuntimeBundle(srcDir, destDir) {
|
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
173
|
|
|
174
|
+
function installSkillFile(srcFile, skillsDest, runtimeKey, targetName = null) {
|
|
175
|
+
const baseName = targetName || path.basename(srcFile, '.md');
|
|
176
|
+
if (runtimeKey === 'codex') {
|
|
177
|
+
const skillDir = path.join(skillsDest, baseName);
|
|
178
|
+
ensureDir(skillDir);
|
|
179
|
+
fs.copyFileSync(srcFile, path.join(skillDir, 'SKILL.md'));
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
fs.copyFileSync(srcFile, path.join(skillsDest, `${baseName}.md`));
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function removeSkillEntry(skillsDir, entry) {
|
|
186
|
+
const entryPath = path.join(skillsDir, entry.name);
|
|
187
|
+
if (entry.isDirectory()) {
|
|
188
|
+
const skillFile = path.join(entryPath, 'SKILL.md');
|
|
189
|
+
if (entry.name.startsWith('god-') || entry.name === 'god' || entry.name === 'godpowers') {
|
|
190
|
+
if (fs.existsSync(skillFile)) {
|
|
191
|
+
fs.rmSync(entryPath, { recursive: true, force: true });
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
if (entry.name.startsWith('god-') || entry.name === 'god.md' || entry.name === 'godpowers.md') {
|
|
198
|
+
fs.unlinkSync(entryPath);
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
|
|
174
204
|
// ---------------------------------------------------------------------------
|
|
175
205
|
// Parse args
|
|
176
206
|
// ---------------------------------------------------------------------------
|
|
@@ -242,11 +272,12 @@ function installForRuntime(runtimeKey, srcDir) {
|
|
|
242
272
|
let count = 0;
|
|
243
273
|
for (const file of fs.readdirSync(skillsSrc)) {
|
|
244
274
|
if (file.endsWith('.md')) {
|
|
245
|
-
|
|
275
|
+
installSkillFile(path.join(skillsSrc, file), skillsDest, runtimeKey);
|
|
246
276
|
count++;
|
|
247
277
|
}
|
|
248
278
|
}
|
|
249
|
-
|
|
279
|
+
const shape = runtimeKey === 'codex' ? 'Codex skill directories' : 'skills/';
|
|
280
|
+
success(`Installed ${count} slash commands to ${shape}`);
|
|
250
281
|
}
|
|
251
282
|
|
|
252
283
|
// 2. Install specialist agents to agents/
|
|
@@ -268,9 +299,8 @@ function installForRuntime(runtimeKey, srcDir) {
|
|
|
268
299
|
// 3. Install the master SKILL.md (always-on context)
|
|
269
300
|
const masterSkill = path.join(srcDir, 'SKILL.md');
|
|
270
301
|
if (fs.existsSync(masterSkill)) {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
success('Installed master SKILL.md as godpowers.md');
|
|
302
|
+
installSkillFile(masterSkill, skillsDest, runtimeKey, 'godpowers');
|
|
303
|
+
success('Installed master SKILL.md as godpowers');
|
|
274
304
|
}
|
|
275
305
|
|
|
276
306
|
// 4. Install templates
|
|
@@ -368,9 +398,8 @@ function uninstallForRuntime(runtimeKey) {
|
|
|
368
398
|
|
|
369
399
|
// Remove all god-* skills
|
|
370
400
|
if (fs.existsSync(skillsDir)) {
|
|
371
|
-
for (const
|
|
372
|
-
if (
|
|
373
|
-
fs.unlinkSync(path.join(skillsDir, file));
|
|
401
|
+
for (const entry of fs.readdirSync(skillsDir, { withFileTypes: true })) {
|
|
402
|
+
if (removeSkillEntry(skillsDir, entry)) {
|
|
374
403
|
removed++;
|
|
375
404
|
}
|
|
376
405
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "godpowers",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.4",
|
|
4
4
|
"description": "AI-powered development system: 104 slash commands and 38 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"
|