supipowers 1.5.1 → 1.5.2

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/README.md CHANGED
@@ -23,7 +23,7 @@ Run the interactive installer:
23
23
  bunx supipowers
24
24
  ```
25
25
 
26
- The installer detects your agent, registers the extension, removes legacy external context-mode MCP registrations, and can install missing optional tooling such as LSP servers, `mcpc`, and Playwright CLI.
26
+ The installer detects Pi (`~/.pi`) and OMP (`~/.omp`) — when both are present it offers a multiselect to install to one or both. It registers the extension, removes legacy external context-mode MCP registrations from `agent/mcp.json` and cleans up the old `settings/mcp.json` if present, and can install missing optional tooling such as LSP servers, `mcpc`, and Playwright CLI.
27
27
 
28
28
  > [!TIP]
29
29
  > Run `/supi:update` at any time to upgrade to the latest version, or `/supi:doctor` to check your setup.
@@ -159,6 +159,15 @@ Configuration is a three-layer deep-merge (lowest to highest priority):
159
159
 
160
160
  Three built-in channels are available: `github` (GitHub Release via `gh` CLI), `gitlab` (GitLab Release via `glab` CLI), and `gitea` (Gitea Release via `tea` CLI). Channels are selected per-project in `release.channels`.
161
161
 
162
+ Release notes are generated from conventional commits scoped to the paths listed in `package.json`'s `files` field — commits touching files outside those paths are excluded.
163
+
164
+ `/supi:release` accepts two optional flags:
165
+
166
+ | Flag | Effect |
167
+ | ----------- | ------ |
168
+ | `--raw` | Skip AI polish of release notes; use raw conventional-commit output |
169
+ | `--dry-run` | Run the full release flow without publishing |
170
+
162
171
  Custom channels can be defined in `release.customChannels`:
163
172
 
164
173
  ```json
package/bin/install.ts CHANGED
@@ -229,6 +229,12 @@ function installToPlatform(platformDir: string, packageRoot: string): string {
229
229
  cpSync(join(packageRoot, "src"), join(extDir, "src"), { recursive: true });
230
230
  cpSync(join(packageRoot, "bin"), join(extDir, "bin"), { recursive: true });
231
231
  cpSync(join(packageRoot, "package.json"), join(extDir, "package.json"));
232
+ // skills/ must live inside the extension dir — src/commands/agents.ts
233
+ // uses a static `import from "../../skills/..."` resolved relative to src/.
234
+ const skillsSrc = join(packageRoot, "skills");
235
+ if (existsSync(skillsSrc)) {
236
+ cpSync(skillsSrc, join(extDir, "skills"), { recursive: true });
237
+ }
232
238
  log(` files copied to ${extDir}`);
233
239
 
234
240
  // Rewrite package.json for the installed extension.
@@ -242,13 +248,12 @@ function installToPlatform(platformDir: string, packageRoot: string): string {
242
248
  type: sourcePkg.type,
243
249
  omp: sourcePkg.omp,
244
250
  dependencies: {
245
- // Only packages imported at runtime by src/ code:
246
- // - config/schema.ts @sinclair/typebox
247
- // - commands/model.ts, model-picker.ts @oh-my-pi/pi-ai
248
- // - commands/model-picker.ts @oh-my-pi/pi-tui
249
- "@sinclair/typebox": "*",
250
- "@oh-my-pi/pi-ai": "*",
251
- "@oh-my-pi/pi-tui": "*",
251
+ // Runtime deps from the published package.json (handlebars, etc.)
252
+ ...(sourcePkg.dependencies ?? {}),
253
+ // Peer deps that OMP provides at its global level. On macOS Bun resolves
254
+ // these from the global install, but on Windows the extension's own
255
+ // node_modules must contain them or Bun's import fails.
256
+ ...(sourcePkg.peerDependencies ?? {}),
252
257
  },
253
258
  };
254
259
  writeFileSync(join(extDir, "package.json"), JSON.stringify(runtimePkg, null, 2));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "supipowers",
3
- "version": "1.5.1",
3
+ "version": "1.5.2",
4
4
  "description": "Workflow extension for OMP coding agents.",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -98,7 +98,44 @@ async function updateSupipowers(
98
98
  if (existsSync(binSource)) {
99
99
  cpSync(binSource, join(extDir, "bin"), { recursive: true });
100
100
  }
101
- cpSync(join(downloadedRoot, "package.json"), join(extDir, "package.json"));
101
+ // skills/ must live inside the extension dir — src/commands/agents.ts
102
+ // uses a static `import from "../../skills/..."` resolved relative to src/.
103
+ const skillsDirSource = join(downloadedRoot, "skills");
104
+ if (existsSync(skillsDirSource)) {
105
+ cpSync(skillsDirSource, join(extDir, "skills"), { recursive: true });
106
+ }
107
+
108
+ // Rewrite package.json: merge runtime deps + peer deps so Bun on Windows
109
+ // can resolve all imports from the extension's own node_modules.
110
+ const sourcePkg = JSON.parse(readFileSync(join(downloadedRoot, "package.json"), "utf8"));
111
+ const runtimePkg = {
112
+ name: sourcePkg.name,
113
+ version: sourcePkg.version,
114
+ type: sourcePkg.type,
115
+ omp: sourcePkg.omp,
116
+ dependencies: {
117
+ ...(sourcePkg.dependencies ?? {}),
118
+ ...(sourcePkg.peerDependencies ?? {}),
119
+ },
120
+ };
121
+ writeFileSync(join(extDir, "package.json"), JSON.stringify(runtimePkg, null, 2));
122
+
123
+ // Install runtime dependencies (handlebars, etc.)
124
+ // Without this, the extension fails to load because node_modules/ was deleted above.
125
+ ctx.ui.notify("Installing dependencies...", "info");
126
+ const bunInstall = await platform.exec("bun", ["install", "--production"], { cwd: extDir });
127
+ if (bunInstall.code !== 0) {
128
+ // Fallback to npm if bun is not available (e.g. Windows without global bun)
129
+ const npmInstall = await platform.exec("npm", ["install", "--omit=dev"], { cwd: extDir });
130
+ if (npmInstall.code !== 0) {
131
+ ctx.ui.notify(
132
+ "Could not install extension dependencies.\n" +
133
+ "Commands may not appear. Run manually:\n" +
134
+ ` cd ${extDir} && bun install`,
135
+ "warning",
136
+ );
137
+ }
138
+ }
102
139
 
103
140
  // Copy skills
104
141
  const skillsSource = join(downloadedRoot, "skills");