supipowers 0.2.3 → 0.2.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/README.md CHANGED
@@ -10,30 +10,33 @@ Agentic workflows for [OMP](https://github.com/can1357/oh-my-pi). Plan features,
10
10
  bunx supipowers@latest
11
11
  ```
12
12
 
13
- The installer checks for OMP, helps you install it if needed, sets up supipowers, and optionally configures LSP servers for your project.
13
+ The installer checks for OMP, helps you install it if needed, copies supipowers into `~/.omp/agent/`, and optionally installs LSP servers for better code intelligence.
14
14
 
15
- ### Manual install
15
+ Re-running the installer updates supipowers if a newer version is available. Already up-to-date installs are detected and skipped.
16
16
 
17
- ```bash
18
- # Global (all projects)
19
- omp install npm:supipowers
17
+ ### Update from inside OMP
20
18
 
21
- # Project-local
22
- omp install npm:supipowers -l
23
19
  ```
20
+ /supi:update
21
+ ```
22
+
23
+ Checks npm for the latest version, downloads and installs it — no prompts, no restart needed.
24
24
 
25
25
  ## Commands
26
26
 
27
- | Command | What it does |
28
- | --------------- | ------------------------------------------------ |
29
- | `/supi` | Overviewavailable commands and project status |
30
- | `/supi:plan` | Collaborative planning with task breakdown |
31
- | `/supi:run` | Execute a plan with parallel sub-agents |
32
- | `/supi:review` | Quality gates at chosen depth |
33
- | `/supi:qa` | Run test suite and E2E pipeline |
34
- | `/supi:release` | Version bump, release notes, publish |
35
- | `/supi:config` | View and edit configuration |
36
- | `/supi:status` | Check running sub-agents and progress |
27
+ | Command | What it does |
28
+ | ---------------- | ------------------------------------------------ |
29
+ | `/supi` | Interactive menu — commands and project status |
30
+ | `/supi:plan` | Collaborative planning with task breakdown |
31
+ | `/supi:run` | Execute a plan with parallel sub-agents |
32
+ | `/supi:review` | Quality gates at chosen depth |
33
+ | `/supi:qa` | Run test suite and E2E pipeline |
34
+ | `/supi:release` | Version bump, release notes, publish |
35
+ | `/supi:config` | Interactive settings (TUI) |
36
+ | `/supi:status` | Check running sub-agents and progress |
37
+ | `/supi:update` | Update supipowers to latest version |
38
+
39
+ Commands like `/supi`, `/supi:config`, `/supi:status`, and `/supi:update` open native OMP TUI dialogs — they don't send chat messages or trigger the AI.
37
40
 
38
41
  ### Planning
39
42
 
@@ -62,21 +65,23 @@ The orchestration loop: dispatch batch → collect results → detect conflicts
62
65
  ### Quality review
63
66
 
64
67
  ```
65
- /supi:review # uses default profile
68
+ /supi:review # opens profile picker
66
69
  /supi:review --quick # fast: LSP diagnostics + AI scan
67
70
  /supi:review --thorough # deep: full AI review + code quality
68
71
  /supi:review --full # everything: tests + E2E + all gates
69
72
  ```
70
73
 
74
+ When no flag is provided, a TUI picker lets you choose the review profile interactively.
75
+
71
76
  ### QA
72
77
 
73
78
  ```
74
- /supi:qa # full test suite
79
+ /supi:qa # opens scope picker
75
80
  /supi:qa --changed # tests for changed files only
76
81
  /supi:qa --e2e # Playwright / E2E only
77
82
  ```
78
83
 
79
- Detects your test framework on first run (vitest, jest, pytest, cargo test, go test) and caches it.
84
+ Detects your test framework on first run (vitest, jest, pytest, cargo test, go test) and caches it. When no flag is provided, a TUI picker lets you choose the scope.
80
85
 
81
86
  ### Release
82
87
 
@@ -84,18 +89,16 @@ Detects your test framework on first run (vitest, jest, pytest, cargo test, go t
84
89
  /supi:release
85
90
  ```
86
91
 
87
- Analyzes commits since last tag, suggests a version bump, generates release notes, and publishes (npm, GitHub release, or manual — configured on first run).
92
+ Analyzes commits since last tag, suggests a version bump, generates release notes, and publishes. On first run, a TUI picker lets you choose your pipeline (npm, GitHub release, or manual).
88
93
 
89
94
  ## Configuration
90
95
 
91
- Layered config: project (`.omp/supipowers/config.json`) overrides global (`~/.omp/supipowers/config.json`).
92
-
93
96
  ```
94
- /supi:config # view current config
95
- /supi:config set orchestration.maxParallelAgents 5
96
- /supi:config set defaultProfile thorough
97
+ /supi:config
97
98
  ```
98
99
 
100
+ Opens an interactive settings screen with all configuration options. Select a setting to change its value — toggles flip instantly, selects open a picker, text fields open an input dialog.
101
+
99
102
  ### Profiles
100
103
 
101
104
  Three built-in profiles control quality gate depth:
@@ -115,21 +118,22 @@ Create custom profiles in `.omp/supipowers/profiles/`.
115
118
  "defaultProfile": "thorough",
116
119
  "orchestration": {
117
120
  "maxParallelAgents": 3, // concurrent sub-agents per batch
118
- "maxFixRetries": 2, // retry failed tasks
119
- "maxNestingDepth": 2, // sub-agent nesting limit
120
- "modelPreference": "auto", // "auto" | "fast" | "capable" | "<model-id>"
121
+ "maxFixRetries": 2, // retry failed tasks
122
+ "maxNestingDepth": 2, // sub-agent nesting limit
123
+ "modelPreference": "auto"
121
124
  },
122
125
  "lsp": {
123
- "autoDetect": true,
124
- "setupGuide": true,
126
+ "setupGuide": true
125
127
  },
126
128
  "qa": {
127
129
  "framework": null, // auto-detected and cached
128
- "command": null,
129
- },
130
+ "command": null
131
+ }
130
132
  }
131
133
  ```
132
134
 
135
+ Config is stored in `~/.omp/agent/extensions/supipowers/` and managed entirely through `/supi:config`.
136
+
133
137
  ## How it works
134
138
 
135
139
  Supipowers is built on OMP's extension API. Every command is an immediate action — no state machine, no workflow phases.
@@ -138,17 +142,21 @@ Supipowers is built on OMP's extension API. Every command is an immediate action
138
142
 
139
143
  **Quality gates**: Composable checks selected by profile. LSP diagnostics feed real type errors. AI review catches logic issues. Test gates run your actual test suite. Gates report issues with severity levels (error/warning/info).
140
144
 
141
- **LSP integration**: Sub-agents query LSP before making changes (find references, check diagnostics). If no LSP is active, everything still works — just better with it. Run `/supi:config` for setup guidance.
145
+ **LSP integration**: Sub-agents query LSP before making changes (find references, check diagnostics). If no LSP is active, everything still works — just better with it. The installer offers to set up LSP servers during installation.
146
+
147
+ **Update checking**: On session start, supipowers checks npm for a newer version in the background. If one is available, a notification tells you to run `/supi:update`.
142
148
 
143
149
  ## Project structure
144
150
 
145
151
  ```
146
152
  src/
147
- index.ts # extension entry point
153
+ index.ts # extension entry point + update checker
148
154
  commands/ # slash command handlers
149
- supi.ts, plan.ts, run.ts, review.ts, qa.ts, release.ts, config.ts, status.ts
155
+ supi.ts, plan.ts, run.ts, review.ts, qa.ts, release.ts,
156
+ config.ts, status.ts, update.ts
150
157
  orchestrator/ # sub-agent dispatch & coordination
151
- batch-scheduler.ts, dispatcher.ts, result-collector.ts, conflict-resolver.ts, prompts.ts
158
+ batch-scheduler.ts, dispatcher.ts, result-collector.ts,
159
+ conflict-resolver.ts, prompts.ts
152
160
  quality/ # composable quality gates
153
161
  gate-runner.ts, lsp-gate.ts, ai-review-gate.ts, test-gate.ts
154
162
  qa/ # QA pipeline
@@ -176,7 +184,7 @@ bin/
176
184
  ## Development
177
185
 
178
186
  ```bash
179
- git clone https://github.com/pedromendes/supipowers.git
187
+ git clone https://github.com/ogrodev/supipowers.git
180
188
  cd supipowers
181
189
  bun install
182
190
  bun run test # run tests
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "supipowers",
3
- "version": "0.2.3",
3
+ "version": "0.2.5",
4
4
  "description": "OMP-native workflow extension inspired by Superpowers.",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -1,4 +1,4 @@
1
- import type { ExtensionAPI } from "@oh-my-pi/pi-coding-agent";
1
+ import type { ExtensionAPI, ExtensionCommandContext } from "@oh-my-pi/pi-coding-agent";
2
2
  import { loadConfig, updateConfig } from "../config/loader.js";
3
3
  import { listProfiles } from "../config/profiles.js";
4
4
  import type { SupipowersConfig } from "../types.js";
@@ -96,7 +96,8 @@ function buildSettings(cwd: string): SettingDef[] {
96
96
  export function registerConfigCommand(pi: ExtensionAPI): void {
97
97
  pi.registerCommand("supi:config", {
98
98
  description: "View and manage Supipowers configuration",
99
- async handler(_args, ctx) {
99
+ // Synchronous handler — returning void (not a Promise) prevents OMP's "Working..." indicator
100
+ handler: ((_args: string, ctx: ExtensionCommandContext) => {
100
101
  if (!ctx.hasUI) {
101
102
  ctx.ui.notify("Config UI requires interactive mode", "warning");
102
103
  return;
@@ -153,6 +154,6 @@ export function registerConfigCommand(pi: ExtensionAPI): void {
153
154
  }
154
155
  }
155
156
  })();
156
- },
157
+ }) as any,
157
158
  });
158
159
  }
@@ -1,10 +1,11 @@
1
- import type { ExtensionAPI } from "@oh-my-pi/pi-coding-agent";
1
+ import type { ExtensionAPI, ExtensionCommandContext } from "@oh-my-pi/pi-coding-agent";
2
2
  import { findActiveRun, loadAllAgentResults } from "../storage/runs.js";
3
3
 
4
4
  export function registerStatusCommand(pi: ExtensionAPI): void {
5
5
  pi.registerCommand("supi:status", {
6
6
  description: "Check on running sub-agents and task progress",
7
- async handler(_args, ctx) {
7
+ // Synchronous handler — returning void (not a Promise) prevents OMP's "Working..." indicator
8
+ handler: ((_args: string, ctx: ExtensionCommandContext) => {
8
9
  ctx.ui.setEditorText("");
9
10
 
10
11
  const activeRun = findActiveRun(ctx.cwd);
@@ -41,6 +42,6 @@ export function registerStatusCommand(pi: ExtensionAPI): void {
41
42
  helpText: "Esc to close",
42
43
  });
43
44
  })();
44
- },
45
+ }) as any,
45
46
  });
46
47
  }
@@ -1,4 +1,4 @@
1
- import type { ExtensionAPI } from "@oh-my-pi/pi-coding-agent";
1
+ import type { ExtensionAPI, ExtensionCommandContext } from "@oh-my-pi/pi-coding-agent";
2
2
  import { loadConfig } from "../config/loader.js";
3
3
  import { findActiveRun } from "../storage/runs.js";
4
4
  import { loadLatestReport } from "../storage/reports.js";
@@ -7,7 +7,8 @@ import { listPlans } from "../storage/plans.js";
7
7
  export function registerSupiCommand(pi: ExtensionAPI): void {
8
8
  pi.registerCommand("supi", {
9
9
  description: "Supipowers overview — show available commands and project status",
10
- async handler(_args, ctx) {
10
+ // Synchronous handler — returning void (not a Promise) prevents OMP's "Working..." indicator
11
+ handler: ((_args: string, ctx: ExtensionCommandContext) => {
11
12
  ctx.ui.setEditorText("");
12
13
  void (async () => {
13
14
  const config = loadConfig(ctx.cwd);
@@ -47,6 +48,6 @@ export function registerSupiCommand(pi: ExtensionAPI): void {
47
48
  }
48
49
  }
49
50
  })();
50
- },
51
+ }) as any,
51
52
  });
52
53
  }
@@ -1,4 +1,4 @@
1
- import type { ExtensionAPI } from "@oh-my-pi/pi-coding-agent";
1
+ import type { ExtensionAPI, ExtensionCommandContext } from "@oh-my-pi/pi-coding-agent";
2
2
  import { readFileSync, existsSync, mkdirSync, cpSync, rmSync, readdirSync } from "node:fs";
3
3
  import { join } from "node:path";
4
4
  import { homedir, tmpdir } from "node:os";
@@ -6,7 +6,8 @@ import { homedir, tmpdir } from "node:os";
6
6
  export function registerUpdateCommand(pi: ExtensionAPI): void {
7
7
  pi.registerCommand("supi:update", {
8
8
  description: "Update supipowers to the latest version",
9
- async handler(_args, ctx) {
9
+ // Synchronous handler — returning void (not a Promise) prevents OMP's "Working..." indicator
10
+ handler: ((_args: string, ctx: ExtensionCommandContext) => {
10
11
  ctx.ui.setEditorText("");
11
12
  void (async () => {
12
13
  const ompAgent = join(homedir(), ".omp", "agent");
@@ -95,6 +96,6 @@ export function registerUpdateCommand(pi: ExtensionAPI): void {
95
96
  }
96
97
  }
97
98
  })();
98
- },
99
+ }) as any,
99
100
  });
100
101
  }