godpowers 0.15.3 → 0.15.5

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,34 @@ 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.5] - 2026-05-11
9
+
10
+ Godpowers init UX release. Makes explicit command invocation behave like
11
+ project setup instead of asking an obvious follow-up.
12
+
13
+ ### Changed
14
+ - `god init` and `/god-init` now automatically write the Godpowers AI-tool
15
+ context fence after initialization.
16
+ - Generic init triggers such as "start a project" and "initialize" still ask
17
+ once before writing AI-tool instruction files.
18
+
19
+ ## [0.15.4] - 2026-05-11
20
+
21
+ Codex command discovery release. Installs Godpowers commands in the directory
22
+ shape Codex loads as individual skills.
23
+
24
+ ### Fixed
25
+ - Codex installs now write each command as `~/.codex/skills/<command>/SKILL.md`,
26
+ so commands like `/god-next`, `/god-status`, and `/god-init` show up as
27
+ separate Codex skills instead of only exposing the umbrella `godpowers`
28
+ skill.
29
+ - Codex uninstall now removes those command directories while preserving
30
+ unrelated user skills.
31
+
32
+ ### Tests
33
+ - Added installer smoke coverage for Codex skill-directory installs and
34
+ uninstalls.
35
+
8
36
  ## [0.15.3] - 2026-05-11
9
37
 
10
38
  Documentation refresh release. Aligns the public docs, architecture map,
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![CI](https://github.com/aihxp/godpowers/actions/workflows/ci.yml/badge.svg)](https://github.com/aihxp/godpowers/actions/workflows/ci.yml)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
5
- [![Version](https://img.shields.io/badge/version-0.15.3-blue)](CHANGELOG.md)
5
+ [![Version](https://img.shields.io/badge/version-0.15.5-blue)](CHANGELOG.md)
6
6
  [![npm](https://img.shields.io/npm/v/godpowers.svg)](https://www.npmjs.com/package/godpowers)
7
7
 
8
8
  **Ship fast. Ship right. Ship everything. Ship accountably.**
@@ -104,7 +104,8 @@ is the source of truth.
104
104
  ## Never do these
105
105
 
106
106
  - Never overwrite content outside the fence.
107
- - Never silently create AGENTS.md without consent on first /god-init.
107
+ - Never silently create AGENTS.md for generic init triggers. Explicit
108
+ `god init` and `/god-init` are consent to write the Godpowers context fence.
108
109
  - Never write to a tool's file if the tool's signal directory/file is missing.
109
110
  - Never fork the canonical section across multiple files; everything
110
111
  non-pointer goes only to AGENTS.md.
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.5",
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"
@@ -99,9 +99,17 @@ needs to specify a mode.
99
99
 
100
100
  `.godpowers/PROGRESS.md` created with initial state.
101
101
 
102
- ## AI-tool context (one-time prompt)
102
+ ## AI-tool context (automatic for explicit init)
103
103
 
104
- After PROGRESS.md is written, ask the user once:
104
+ After PROGRESS.md is written, decide from the trigger phrase:
105
+
106
+ - If the user explicitly invoked `god init` or `/god-init`, write AI-tool
107
+ context automatically. The command itself is explicit consent to initialize
108
+ Godpowers project context for the active AI coding tool.
109
+ - If the user used a generic trigger such as "start a project", "new project",
110
+ or "initialize", ask once before writing AI-tool instruction files.
111
+
112
+ Prompt for generic triggers only:
105
113
 
106
114
  ```
107
115
  Tell your AI coding tools (Claude Code, Codex, Gemini, Cursor, Windsurf,
@@ -114,10 +122,12 @@ files detected in this project.
114
122
  never-ask - never ask again on this project
115
123
  ```
116
124
 
117
- Persist the answer to `state.json` under `project.context-prompt-answered`.
118
- On `yes`, spawn `god-context-writer` in `write` mode. On `never-ask`, store
119
- that flag so future runs of /god-init and /god-sync skip the prompt and the
120
- auto-refresh.
125
+ Persist the resolved answer to `state.json` under
126
+ `project.context-prompt-answered`. For explicit `god init` and `/god-init`,
127
+ store `yes` and spawn `god-context-writer` in `write` mode. For generic
128
+ triggers, on `yes`, spawn `god-context-writer` in `write` mode. On
129
+ `never-ask`, store that flag so future runs of /god-init and /god-sync skip
130
+ the prompt and the auto-refresh.
121
131
 
122
132
  If the user later wants to enable it manually, they run `/god-context on`.
123
133