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 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
- fs.copyFileSync(path.join(skillsSrc, file), path.join(skillsDest, file));
275
+ installSkillFile(path.join(skillsSrc, file), skillsDest, runtimeKey);
246
276
  count++;
247
277
  }
248
278
  }
249
- success(`Installed ${count} slash commands to skills/`);
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
- const masterDest = path.join(skillsDest, 'godpowers.md');
272
- fs.copyFileSync(masterSkill, masterDest);
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 file of fs.readdirSync(skillsDir)) {
372
- if (file.startsWith('god-') || file === 'godpowers.md') {
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",
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"