@loneexile/omp-superpowers 6.4.2-omp.1

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.
Files changed (84) hide show
  1. package/.pi/extensions/superpowers.ts +123 -0
  2. package/CHANGELOG.md +28 -0
  3. package/LICENSE +21 -0
  4. package/README.md +187 -0
  5. package/agents/sdd-escalation-implementer.md +18 -0
  6. package/agents/sdd-final-reviewer.md +23 -0
  7. package/agents/sdd-implementer.md +23 -0
  8. package/agents/sdd-rereviewer.md +69 -0
  9. package/agents/sdd-reviewer.md +83 -0
  10. package/package.json +40 -0
  11. package/skills/brainstorming/SKILL.md +285 -0
  12. package/skills/brainstorming/scripts/frame-template.html +213 -0
  13. package/skills/brainstorming/scripts/helper.js +167 -0
  14. package/skills/brainstorming/scripts/server.cjs +723 -0
  15. package/skills/brainstorming/scripts/start-server.sh +209 -0
  16. package/skills/brainstorming/scripts/stop-server.sh +120 -0
  17. package/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  18. package/skills/brainstorming/visual-companion.md +299 -0
  19. package/skills/diagnosing-superpowers/SKILL.md +120 -0
  20. package/skills/diagnosing-superpowers/prompts/analyst-common.md +38 -0
  21. package/skills/diagnosing-superpowers/prompts/cost-and-time.md +28 -0
  22. package/skills/diagnosing-superpowers/prompts/plan-adherence.md +29 -0
  23. package/skills/diagnosing-superpowers/prompts/quality-evidence.md +26 -0
  24. package/skills/diagnosing-superpowers/prompts/repeated-work.md +30 -0
  25. package/skills/diagnosing-superpowers/prompts/request-conflicts.md +20 -0
  26. package/skills/diagnosing-superpowers/prompts/scrub-audit.md +33 -0
  27. package/skills/diagnosing-superpowers/prompts/scrub.md +29 -0
  28. package/skills/diagnosing-superpowers/prompts/similar-session.md +38 -0
  29. package/skills/diagnosing-superpowers/prompts/skill-timeline.md +30 -0
  30. package/skills/diagnosing-superpowers/prompts/stumbles.md +28 -0
  31. package/skills/diagnosing-superpowers/references/context-safety.md +22 -0
  32. package/skills/diagnosing-superpowers/references/github-issues.md +47 -0
  33. package/skills/diagnosing-superpowers/references/redaction-policy.md +34 -0
  34. package/skills/diagnosing-superpowers/references/session-discovery.md +31 -0
  35. package/skills/diagnosing-superpowers/templates/bundle-README.md +77 -0
  36. package/skills/diagnosing-superpowers/templates/case.md +64 -0
  37. package/skills/diagnosing-superpowers/templates/issue.md +51 -0
  38. package/skills/diagnosing-superpowers/templates/report.md +82 -0
  39. package/skills/dispatching-parallel-agents/SKILL.md +167 -0
  40. package/skills/executing-plans/SKILL.md +373 -0
  41. package/skills/executing-plans/scripts/task-done +52 -0
  42. package/skills/executing-plans/scripts/task-start +28 -0
  43. package/skills/finishing-a-development-branch/SKILL.md +225 -0
  44. package/skills/receiving-code-review/SKILL.md +205 -0
  45. package/skills/requesting-code-review/SKILL.md +95 -0
  46. package/skills/requesting-code-review/code-reviewer.md +198 -0
  47. package/skills/subagent-driven-development/SKILL.md +681 -0
  48. package/skills/subagent-driven-development/implementer-prompt.md +157 -0
  49. package/skills/subagent-driven-development/re-review-prompt.md +110 -0
  50. package/skills/subagent-driven-development/scripts/review-package +53 -0
  51. package/skills/subagent-driven-development/scripts/sdd-workspace +82 -0
  52. package/skills/subagent-driven-development/scripts/task-brief +43 -0
  53. package/skills/subagent-driven-development/task-reviewer-prompt.md +205 -0
  54. package/skills/systematic-debugging/CREATION-LOG.md +119 -0
  55. package/skills/systematic-debugging/SKILL.md +283 -0
  56. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  57. package/skills/systematic-debugging/condition-based-waiting.md +115 -0
  58. package/skills/systematic-debugging/defense-in-depth.md +122 -0
  59. package/skills/systematic-debugging/find-polluter.sh +72 -0
  60. package/skills/systematic-debugging/root-cause-tracing.md +169 -0
  61. package/skills/systematic-debugging/test-academic.md +14 -0
  62. package/skills/systematic-debugging/test-pressure-1.md +58 -0
  63. package/skills/systematic-debugging/test-pressure-2.md +68 -0
  64. package/skills/systematic-debugging/test-pressure-3.md +69 -0
  65. package/skills/test-driven-development/SKILL.md +330 -0
  66. package/skills/test-driven-development/writing-good-tests.md +198 -0
  67. package/skills/using-git-worktrees/SKILL.md +194 -0
  68. package/skills/using-superpowers/SKILL.md +65 -0
  69. package/skills/using-superpowers/references/antigravity-tools.md +23 -0
  70. package/skills/using-superpowers/references/claude-code-tools.md +29 -0
  71. package/skills/using-superpowers/references/codex-tools.md +108 -0
  72. package/skills/using-superpowers/references/gemini-tools.md +63 -0
  73. package/skills/using-superpowers/references/hermes-tools.md +56 -0
  74. package/skills/using-superpowers/references/muse-tools.md +35 -0
  75. package/skills/using-superpowers/references/pi-tools.md +41 -0
  76. package/skills/verification-before-completion/SKILL.md +120 -0
  77. package/skills/writing-plans/SKILL.md +204 -0
  78. package/skills/writing-skills/SKILL.md +681 -0
  79. package/skills/writing-skills/anthropic-best-practices.md +1150 -0
  80. package/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  81. package/skills/writing-skills/graphviz-conventions.dot +172 -0
  82. package/skills/writing-skills/persuasion-principles.md +187 -0
  83. package/skills/writing-skills/render-graphs.js +169 -0
  84. package/skills/writing-skills/testing-skills-with-subagents.md +384 -0
@@ -0,0 +1,123 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
5
+
6
+ const EXTREMELY_IMPORTANT_MARKER = "<EXTREMELY_IMPORTANT>";
7
+ const BOOTSTRAP_MARKER = "superpowers:using-superpowers bootstrap for pi";
8
+
9
+ const extensionDir = dirname(fileURLToPath(import.meta.url));
10
+ const packageRoot = resolve(extensionDir, "../..");
11
+ const skillsDir = resolve(packageRoot, "skills");
12
+ const bootstrapSkillPath = resolve(skillsDir, "using-superpowers", "SKILL.md");
13
+
14
+ let cachedBootstrap: string | null | undefined;
15
+
16
+ export default function superpowersPiExtension(pi: ExtensionAPI) {
17
+ let injectBootstrap = true;
18
+
19
+ pi.on("resources_discover", async () => ({
20
+ skillPaths: [skillsDir],
21
+ }));
22
+
23
+ pi.on("session_start", async () => {
24
+ injectBootstrap = true;
25
+ });
26
+
27
+ pi.on("session_compact", async () => {
28
+ injectBootstrap = true;
29
+ });
30
+
31
+ pi.on("agent_end", async () => {
32
+ injectBootstrap = false;
33
+ });
34
+
35
+ pi.on("context", async (event) => {
36
+ if (!injectBootstrap) return;
37
+ if (event.messages.some(messageContainsBootstrap)) return;
38
+
39
+ const bootstrap = getBootstrapContent();
40
+ if (!bootstrap) return;
41
+
42
+ const bootstrapMessage = {
43
+ role: "user" as const,
44
+ content: [{ type: "text" as const, text: bootstrap }],
45
+ timestamp: Date.now(),
46
+ };
47
+
48
+ const insertAt = firstNonCompactionSummaryIndex(event.messages);
49
+ return {
50
+ messages: [
51
+ ...event.messages.slice(0, insertAt),
52
+ bootstrapMessage,
53
+ ...event.messages.slice(insertAt),
54
+ ],
55
+ };
56
+ });
57
+ }
58
+
59
+ function getBootstrapContent(): string | null {
60
+ if (cachedBootstrap !== undefined) return cachedBootstrap;
61
+
62
+ try {
63
+ const skillContent = readFileSync(bootstrapSkillPath, "utf8");
64
+ const body = stripFrontmatter(skillContent);
65
+ cachedBootstrap = `${EXTREMELY_IMPORTANT_MARKER}
66
+ ${BOOTSTRAP_MARKER}
67
+
68
+ You have superpowers.
69
+
70
+ The using-superpowers skill content is included below and is already loaded for this Pi session. Follow it now. Do not try to load using-superpowers again.
71
+
72
+ ${body}
73
+
74
+ ${piToolMapping()}
75
+ </EXTREMELY_IMPORTANT>`;
76
+ return cachedBootstrap;
77
+ } catch {
78
+ cachedBootstrap = null;
79
+ return null;
80
+ }
81
+ }
82
+
83
+ function stripFrontmatter(content: string): string {
84
+ const match = content.match(/^---\n[\s\S]*?\n---\n([\s\S]*)$/);
85
+ return (match ? match[1] : content).trim();
86
+ }
87
+
88
+ function piToolMapping(): string {
89
+ return `## omp tool mapping
90
+
91
+ This harness is omp (Oh My Pi). It has native skills but does not expose Claude Code's \`Skill\` tool. When a Superpowers instruction says to invoke a skill, read it with \`read skill://<name>\` when the skill applies, or let a human invoke \`/skill:name\` explicitly.
92
+
93
+ omp's built-in coding tools are lowercase: \`read\`, \`write\`, \`edit\`, \`bash\`, \`grep\`, \`glob\`. Use \`read\` for a file OR a directory listing, \`grep\` for file contents, and \`glob\` for finding paths by name. omp's own system prompt directs you to prefer these over shell \`ls\`, \`find\`, \`grep\`, and \`rg\`; follow that preference.
94
+
95
+ omp ships a built-in subagent tool: \`task\`. Use it for all Superpowers subagent workflows. Batch shape: ONE call carries \`{ context, tasks[] }\` — one subagent per item, run concurrently. Dispatch N parallel subagents as N entries in a single \`task\` call, never N sequential calls. Pick the most specific agent type per item from the roster in the \`task\` tool's own description (typically \`scout\` for read-only research, \`reviewer\`, \`security-reviewer\`, \`sonic\` for strictly mechanical work, and \`task\` for general-purpose). The tool is lowercase \`task\`; \`Task\` does not exist here. Never conclude that subagent capability is missing.
96
+
97
+ The \`task\` tool has NO \`model:\` field — a template's \`model:\` line is inert; the agent TYPE carries the model, thinking level, and tools. For subagent-driven-development use this plugin's own agents: \`sdd-implementer\` (implementation, fix rounds 1-2), \`sdd-escalation-implementer\` (fix round 3, xhigh reasoning), \`sdd-reviewer\` (task review, no file writes, no shell), \`sdd-rereviewer\` (scoped re-review, low reasoning), \`sdd-final-reviewer\` (whole-branch review, xhigh reasoning). The bundled \`task\` agent resolves to \`modelRoles.task\`, whatever that is — never use it for an SDD seat.
98
+
99
+ omp ships a built-in task-list tool: \`todo\` (\`init\`, \`start\`, \`done\`, \`rm\`, \`drop\`, \`block\`, \`unblock\`, \`append\`, \`view\`). Use it for all task tracking. Do not track work in plan files or a repo-local \`TODO.md\`. Treat older \`TodoWrite\` references as the \`todo\` tool.`;
100
+ }
101
+
102
+ function messageContainsBootstrap(message: unknown): boolean {
103
+ const content = (message as { content?: unknown }).content;
104
+ if (typeof content === "string") return content.includes(BOOTSTRAP_MARKER);
105
+ if (!Array.isArray(content)) return false;
106
+ return content.some((part) => {
107
+ return (
108
+ part &&
109
+ typeof part === "object" &&
110
+ (part as { type?: unknown }).type === "text" &&
111
+ typeof (part as { text?: unknown }).text === "string" &&
112
+ (part as { text: string }).text.includes(BOOTSTRAP_MARKER)
113
+ );
114
+ });
115
+ }
116
+
117
+ function firstNonCompactionSummaryIndex(messages: unknown[]): number {
118
+ let index = 0;
119
+ while ((messages[index] as { role?: unknown } | undefined)?.role === "compactionSummary") {
120
+ index += 1;
121
+ }
122
+ return index;
123
+ }
package/CHANGELOG.md ADDED
@@ -0,0 +1,28 @@
1
+ # Changelog
2
+
3
+ Releases of [`@loneexile/omp-superpowers`](https://www.npmjs.com/package/@loneexile/omp-superpowers), the omp (Oh My Pi) adaptation of [obra/superpowers](https://github.com/obra/superpowers).
4
+
5
+ A version is `<upstream version>-omp.<n>`: the upstream release this fork is synced to, then the fork's own iteration on top of it. Upstream's changes are described in its [release notes](https://github.com/obra/superpowers/blob/main/RELEASE-NOTES.md); this file records what the fork adds or changes.
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [6.4.2-omp.1] - 2026-10-02
10
+
11
+ First release, synced to upstream [v6.4.2](https://github.com/obra/superpowers/blob/v6.4.2/RELEASE-NOTES.md).
12
+
13
+ ### Added
14
+
15
+ - **omp tool mapping.** The bootstrap injected into every session, and `skills/using-superpowers/references/pi-tools.md`, describe omp's real `task` tool (batched subagents, no `model:` field) and `todo` tool instead of claiming the harness has neither.
16
+ - **Five SDD agents** (`agents/sdd-*.md`): implementer, task reviewer, scoped re-reviewer, round-3 escalation implementer, and final whole-branch reviewer, each with its own model, thinking level, and tool set. Re-point any seat per host with `task.agentModelOverrides`.
17
+ - **subagent-driven-development rewritten around them:** *Agent Selection* replaces *Model Selection*; a three-round fix loop whose third round goes to the escalation seat; a proven-trivial-fix route; structured reviewer results with a `package_gap` verdict; parallel implementer waves only when `task.isolation.enabled` is on.
18
+ - **omp worktree steps** in `using-git-worktrees`: `/wt` for the user, `omp worktree add` for the agent.
19
+ - **npm package.** `omp plugin install npm:@loneexile/omp-superpowers`. The package holds only what omp loads (the extension, `skills/`, `agents/`). GitHub Releases publish it through npm Trusted Publishing, with provenance.
20
+
21
+ ### Changed
22
+
23
+ - **Synced with upstream v6.4.2** (from v6.3.0): the `diagnosing-superpowers` skill, inline `executing-plans` (Native execution), leaner `writing-plans` plans with a Review Focus section, per-plan ownership markers in `sdd-workspace`, range guards in `review-package`, and skill prose that invokes bundled scripts through `bash`.
24
+ - The fork's rewritten subagent-driven-development text invokes its helper scripts through `bash` as well, so a package extractor that drops exec bits cannot break them.
25
+ - `sdd-final-reviewer` carries upstream's new review rules from `code-reviewer.md`, the template it replaces in SDD's final review: the spec is a vision document (behavior it is silent on is graded by what a reasonable person expects), and a "Declined to judge" section that the controller rules on and ledgers like a plan conflict.
26
+
27
+ [Unreleased]: https://github.com/LoneExile/omp-superpowers/compare/v6.4.2-omp.1...HEAD
28
+ [6.4.2-omp.1]: https://github.com/LoneExile/omp-superpowers/releases/tag/v6.4.2-omp.1
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Jesse Vincent
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,187 @@
1
+ # omp-superpowers
2
+
3
+ [obra/superpowers](https://github.com/obra/superpowers) adapted for **omp (Oh My Pi)**.
4
+
5
+ Upstream superpowers is a set of workflow skills (brainstorm → plan → implement via subagents → review → finish). It ships a Pi/omp compatibility layer that is wrong on omp: it tells the agent there is no subagent tool and no todo tool, and its *Model Selection* rules use a `model:` field the omp `task` tool does not have. Under those rules every subagent silently inherits the slowest configured model over the widest tool set — in a real 157-subagent session that was where most of the wall-clock went.
6
+
7
+ This fork keeps the skills and fixes the omp side:
8
+
9
+ - the always-injected tool mapping tells the truth about `task`, `todo`, `read`/`grep`/`glob`
10
+ - **five omp agents** (`agents/sdd-*.md`) give every subagent-driven-development seat its own model, thinking level, and tool set
11
+ - subagent-driven-development is rewritten around them: three-round fix loop, structured reviewer output, waves gated on isolation
12
+
13
+ ## Install
14
+
15
+ ```bash
16
+ omp plugin install npm:@loneexile/omp-superpowers
17
+ ```
18
+
19
+ Releases are versioned `<upstream version>-omp.<n>`: `6.4.2-omp.1` is upstream v6.4.2 plus this fork's first iteration on it. [CHANGELOG.md](CHANGELOG.md) lists each release. To move to another one, uninstall and install it pinned:
20
+
21
+ ```bash
22
+ omp plugin uninstall @loneexile/omp-superpowers
23
+ omp plugin install npm:@loneexile/omp-superpowers@<version>
24
+ ```
25
+
26
+ Unreleased `main` installs from GitHub under the same plugin name, pinned to a commit: `omp plugin install github:LoneExile/omp-superpowers#<sha>`. Installs made before 6.4.2-omp.1 used the plugin name `superpowers`; run `omp plugin uninstall superpowers` before installing this package.
27
+
28
+ Verify it loaded — the roster of your `task` tool should now include the five `sdd-*` agents:
29
+
30
+ ```bash
31
+ omp -p --no-session --no-skills --model anthropic/claude-haiku-4-5 \
32
+ 'List the agent type names your `task` tool offers, comma-separated, nothing else.'
33
+ # scout, reviewer, security-reviewer, sonic, task, sdd-implementer, sdd-reviewer, sdd-rereviewer, sdd-escalation-implementer, sdd-final-reviewer
34
+ ```
35
+
36
+ Agent definitions are read **per dispatch**, so a reinstall takes effect on the next `task` call in a running session. The injected tool mapping and the skill catalog are read at process start — restart omp after upgrading to pick those up.
37
+
38
+ ## Using it
39
+
40
+ The skills drive themselves once loaded. The usual path:
41
+
42
+ 1. `read skill://brainstorming` — turn an idea into a design
43
+ 2. `read skill://writing-plans` — produce `docs/superpowers/plans/<date>-<name>.md`
44
+ 3. `read skill://subagent-driven-development` — execute the plan task by task via subagents
45
+ 4. `read skill://finishing-a-development-branch` — merge / PR / discard
46
+
47
+ On omp the agent invokes a skill by reading it (`read skill://<name>`); you can also invoke one explicitly with `/skill:<name>`.
48
+
49
+ ### What subagent-driven-development does per task
50
+
51
+ ```mermaid
52
+ flowchart TD
53
+ B["task-brief: one task's text from the plan"] --> I
54
+ I["sdd-implementer: TDD, commit, report file"] --> P["review-package: git diff -U10 to a file"]
55
+ P --> R["sdd-reviewer: spec + quality, structured result"]
56
+ R -->|"approved"| D["ledger: Task N complete"]
57
+ R -->|"Critical or Important findings"| F
58
+ F["fix round 1 or 2: resume sdd-implementer"] --> RR["sdd-rereviewer: verdict per finding"]
59
+ RR -->|"all addressed"| D
60
+ RR -->|"still open, round 3"| E["sdd-escalation-implementer: xhigh reasoning"]
61
+ E --> RR
62
+ RR -->|"still open after round 3"| A["controller adjudicates and parks with a ruling"]
63
+ A --> D
64
+ D --> N{"more tasks?"}
65
+ N -->|"yes"| B
66
+ N -->|"no"| W["sdd-final-reviewer: whole-branch, once per plan"]
67
+ W --> X["finishing-a-development-branch"]
68
+
69
+ classDef seat fill:#1e3a8a,stroke:#3b82f6,color:#dbeafe
70
+ class I,R,RR,E,W seat
71
+ ```
72
+
73
+ Blue nodes are the five omp agents this fork ships. A reviewer that cannot read its package yields the `package_gap` verdict value (with what it tried) instead of inventing one, and the controller regenerates and re-dispatches.
74
+
75
+ ### The SDD seats
76
+
77
+ | Seat | agent | shipped default · thinking | tools |
78
+ |---|---|---|---|
79
+ | implementer (every task, fix rounds 1–2) | `sdd-implementer` | sonnet-5 · medium | read, write, edit, bash, grep, glob, lsp, ast_grep |
80
+ | task reviewer | `sdd-reviewer` | sonnet-5 · high | read, grep, glob |
81
+ | scoped re-review | `sdd-rereviewer` | sonnet-5 · low | read, grep |
82
+ | fix round 3 / ruled strongest-tier task | `sdd-escalation-implementer` | opus-5 · xhigh | same as implementer |
83
+ | final whole-branch review | `sdd-final-reviewer` | opus-5 · xhigh | read, grep, glob, bash, lsp, ast_grep |
84
+
85
+ The shipped defaults are Anthropic: sonnet for the seats that run on every task, opus for the two that run once per plan or once per stuck task. The tiers are a **thinking ladder** as much as a model ladder — re-reviews reason at `low`, escalation and the final review at `xhigh`.
86
+
87
+ The two reviewer seats have no `bash`, `edit`, or filesystem `write`: the review package (`git diff -U10` written to a file) is their whole view of the change, and they return a structured result (`spec_compliance`, `task_quality`, `findings[]`, `cannot_verify[]`; `finding_verdicts[]`, `new_breakage[]`, `round_verdict`) plus `package_gap` when they could not read the package. Note the honest boundary: omp always attaches `hub` to subagents, and `hub start` can launch a process, so "no shell" means *cannot edit the tree and cannot run a shell*, not a sandbox.
88
+
89
+ ### Changing models — no file edits
90
+
91
+ omp resolves each seat's model and thinking level in a fixed order. The override map is the layer meant for you:
92
+
93
+ ```mermaid
94
+ flowchart LR
95
+ subgraph model["model"]
96
+ M1["task.agentModelOverrides"] -->|"unset"| M2["agent file model:"]
97
+ end
98
+ subgraph level["thinking level"]
99
+ L1["explicit :level on the winning model string"] -->|"none"| L2["agent file thinkingLevel:"]
100
+ L2 -->|"none"| L3["model default"]
101
+ end
102
+ model --> level
103
+
104
+ classDef you fill:#1e3a8a,stroke:#3b82f6,color:#dbeafe
105
+ class M1 you
106
+ ```
107
+
108
+ Set the override in `~/.omp/agent/config.yml`, or interactively with `/agents` in any session (it edits the same map). It applies on the next dispatch; delete a line to fall back to the agent file.
109
+
110
+ This is how the fork's own author runs it — every seat on a flat-rate model, mapped onto that model's own thinking ladder:
111
+
112
+ ```yaml
113
+ task:
114
+ agentModelOverrides:
115
+ sdd-implementer: opencode-go/deepseek-v4.1-flash:high
116
+ sdd-reviewer: opencode-go/deepseek-v4.1-flash:high
117
+ sdd-rereviewer: opencode-go/deepseek-v4.1-flash:low
118
+ sdd-escalation-implementer: opencode-go/deepseek-v4.1-flash:max
119
+ sdd-final-reviewer: opencode-go/deepseek-v4.1-flash:max
120
+ ```
121
+
122
+ **Use the exact catalog id and a level the model actually offers.** `omp models ls <provider>` shows each model's ladder. A level that is not on it is silently clamped to the nearest valid one — `deepseek-v4.1-flash` offers only `low, high, max`, so `:medium` would run at `low` and `:xhigh` at `high`, collapsing the ladder without any error. Check `session_init.resolvedModel` in a subagent transcript if in doubt: it shows the level that actually ran. Catalog ids also get renamed (this one was `deepseek-flash` a day earlier, and the old string now matches an empty placeholder row).
123
+
124
+ Measured on a real fix-round re-review with identical inputs: a grok-4.6 seat took 9.7 min / 4 turns, sonnet-5 about 50 s / 1 turn, the DeepSeek flash seat 100 s / 4 turns — same verdict, full structured result, all three.
125
+
126
+ Rules that are easy to get wrong:
127
+
128
+ - A **bare model** (`anthropic/claude-haiku-4-5`) keeps the agent file's own `thinkingLevel`. Add `:level` (`…:high`) to change reasoning too.
129
+ - **Delete a line** to fall back to the agent file's default for that seat. Overrides apply on the next dispatch — no restart.
130
+ - The `task` tool has **no `model:` field**. Never dispatch the bundled `task` or `reviewer` agent for an SDD seat — they resolve to `modelRoles.task` / `@slow`, which on many hosts is a cheap model.
131
+ - `effort` on a dispatch (when `task.enableEffort` is on) accepts only `"lo"`, `"med"`, `"hi"`.
132
+ - Discovery-only model ids (the OpenCode Go catalog, for example) accept `:level` in config and in overrides but not on the `--model` CLI flag.
133
+
134
+ ### Optional settings that matter
135
+
136
+ | setting | why |
137
+ |---|---|
138
+ | `task.isolation.enabled` (+ `isolation.backend`, default `auto`) | off by default; SDD only runs implementers in **parallel waves** when it is on — otherwise they share one checkout and stay serial. Older omp builds spelled this `task.isolation.mode`; check `omp config get task.isolation.enabled` on your build |
139
+ | `task.enableEffort` | exposes per-dispatch `effort` for the round-3 escalation |
140
+ | `autolearn.autoContinue` | omp's auto-learn mints managed skills every session; the whole catalog is injected into every subagent's prompt. Keep it pruned or off — a 2,500-skill catalog was ~220k tokens per subagent turn |
141
+
142
+ ## What changed from upstream
143
+
144
+ - `.pi/extensions/superpowers.ts` — the injected mapping names `task`, `todo`, the `sdd-*` roster, and the no-`model:`-field rule
145
+ - `skills/using-superpowers/references/pi-tools.md` — same, as the reference doc
146
+ - `agents/sdd-*.md` — new. `sdd-final-reviewer` also carries the review rules upstream keeps in `requesting-code-review/code-reviewer.md` (the spec is a vision document; a "Declined to judge" list), because it replaces that template in SDD's final review
147
+ - `skills/subagent-driven-development/` — *Model Selection* → *Agent Selection*; fix-loop cap 5 → 3 with a round-3 escalation seat; a proven-trivial-fix route that replaces a re-review with a one-command proof; waves keyed to the plan's pre-flight file/interface table and gated on isolation; templates show omp's real `{ context, tasks: [{ agent, task }] }` wire shape and the reviewers' structured fields
148
+ - `skills/using-git-worktrees/` — additive omp section: `/wt` is the user's one-line answer to the consent question (moves the session, carries WIP); when the agent creates the worktree itself it uses `omp worktree add` under `~/.omp/wt/` (the only place `omp worktree list`/`clear` manage), knows that command leaves uncommitted changes behind, and asks for `/move <path>` because `cd` never moves the tools' cwd
149
+ - `README.md` — this file: rewritten for omp (install, seats, overrides, maintenance); upstream's multi-harness README is gone
150
+ - `tests/pi/test-pi-extension.mjs` — one assertion follows the renamed mapping heading; the package-name assertion is gone (`scripts/check-npm-package.sh` checks the published name)
151
+ - `package.json` — the npm identity: `@loneexile/omp-superpowers`, `<upstream version>-omp.<n>` versions, a `files` allowlist (the extension, `skills/`, `agents/`), `publishConfig`, `omp`/`oh-my-pi` keywords; `main` is dropped, since it pointed at the OpenCode plugin this package does not ship
152
+ - `CHANGELOG.md`, `.github/workflows/` (CI, npm release), `scripts/check-npm-package.sh` — new
153
+
154
+ Everything else is upstream, unmodified.
155
+
156
+ ## Maintenance
157
+
158
+ ### Syncing with upstream
159
+
160
+ ```bash
161
+ git fetch upstream --tags
162
+ git rebase upstream/main
163
+ git push --force-with-lease origin main
164
+ ```
165
+
166
+ Expect conflicts in `skills/subagent-driven-development/`, `pi-tools.md`, `README.md`, and `package.json` whenever upstream touches them — this fork rewrites those files rather than appending to them (README.md is never a partial conflict). In `package.json` keep the fork's identity and set `version` to `<new upstream version>-omp.1`: CI's package check fails until the version's base matches the upstream version in `.claude-plugin/plugin.json`. `agents/`, the extension's mapping paragraph, and the omp blocks in `using-git-worktrees` are additive.
167
+
168
+ A clean rebase is not the whole sync. Upstream's edits to text this fork replaced never reach the replacement, so read upstream's diff for those files and port what still applies. The v6.4.x sync needed two: `bash scripts/...` invocations in the SDD text, and `code-reviewer.md`'s new review rules, which here live in `agents/sdd-final-reviewer.md`.
169
+
170
+ ### Releasing
171
+
172
+ 1. Set `version` in `package.json`, move CHANGELOG.md's *Unreleased* entries under that version, commit, push, and wait for CI.
173
+ 2. Publish a GitHub release for the tag `v<version>`; the [release workflow](.github/workflows/release.yml) publishes it to npm through Trusted Publishing, with provenance:
174
+
175
+ ```bash
176
+ v=$(node -p "require('./package.json').version")
177
+ awk -v h="## [$v]" 'index($0, h) == 1 {f = 1; next} f && /^(## )?\[/ {exit} f' CHANGELOG.md > /tmp/notes.md
178
+ gh release create "v$v" --target main --title "v$v" --notes-file /tmp/notes.md
179
+ ```
180
+
181
+ ### New omp versions
182
+
183
+ Before trusting a new omp release, re-check the harness facts this fork depends on — against the **running binary**, not the npm source tree. `~/.bun/install/global/node_modules/@oh-my-pi/pi-coding-agent/src` routinely lags `omp --version` (a 17.4.2 tree sat beside an 18.1.17 binary while this README was written, and the isolation setting had been renamed in between). The live oracles are `omp config list --json` (every setting and its default), the `task` tool's own description in a session (agent roster, item fields), a `session_init.resolvedModel` line in a subagent transcript (what actually resolved), and `grep -a` on the binary for an exact string when you need to know whether a code path exists.
184
+
185
+ ## License
186
+
187
+ MIT, inherited from upstream. Not affiliated with obra / Prime Radiant.
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: sdd-escalation-implementer
3
+ description: "Superpowers SDD round-3 escalation: a fresh implementer at xhigh reasoning for a task that survived two fix rounds. Same tools and contract as sdd-implementer."
4
+ tools: read, write, edit, bash, grep, glob, lsp, ast_grep
5
+ # thinkingLevel is the seat's reasoning tier; an explicit :level on the model
6
+ # string (or on a task.agentModelOverrides entry) takes precedence over it.
7
+ model: ["anthropic/claude-opus-5:xhigh"]
8
+ thinkingLevel: xhigh
9
+ ---
10
+
11
+ You take over one task from a Superpowers plan after a prior implementer attempted it and could not clear the review findings across two fix rounds. You own it now. Your dispatch names the brief (requirements, exact values verbatim), the report file (read it first — it records what was tried and what the reviewer rejected), and the open findings.
12
+
13
+ <contract>
14
+ - Start from the report: understand why the previous rounds did not converge before touching code. A loop that survives two resumes usually means the implementer could not see its own problem — look for the framing error, not just the diff.
15
+ - Fix the open findings; re-run the covering tests (name them); append your fix report to the same report file; commit with Conventional Commits.
16
+ - Return ≤12 lines: status (`DONE` | `DONE_WITH_CONCERNS` | `NEEDS_CONTEXT` | `BLOCKED`), commits, one-line test summary, concerns.
17
+ - You do NOT dispatch subagents. Review arrives from the controller after your report.
18
+ </contract>
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: sdd-final-reviewer
3
+ description: "Superpowers SDD final whole-branch reviewer: integration seams across all tasks, adjudicates ledgered deferred-minors and parked rulings. xhigh reasoning — dispatched once per plan."
4
+ tools: read, grep, glob, bash, lsp, ast_grep
5
+ # thinkingLevel is the seat's reasoning tier; an explicit :level on the model
6
+ # string (or on a task.agentModelOverrides entry) takes precedence over it.
7
+ model: ["anthropic/claude-opus-5:xhigh"]
8
+ thinkingLevel: xhigh
9
+ ---
10
+
11
+ You review a whole branch once, after every task has passed its task-scoped review. Per-task reviews cannot see cross-file seams; you can. Your dispatch gives the merge-base..HEAD review package, the plan/spec paths, and the ledger's deferred-minor and parked-with-ruling lines.
12
+
13
+ <method>
14
+ - Read the package once. Then trace every patch-introduced type, value, or contract across its consuming side: the dispatch point is often outside the diff — read it before concluding the producer is correct.
15
+ - Bash is read-only: `git log`, `git show`, `git diff`, running a focused test. Never edit, never run the whole suite.
16
+ - The spec is a vision document: it says what the software must do, not every input, environment, or condition it will meet. Where it is silent, a reasonable person's expectation is the requirement — the spec's silence is not permission. Grade such findings by their effect on that person, not by whether the spec mentions the trigger.
17
+ - Triage the ledger lines: which deferred minors must be fixed before merge, which parked rulings you overturn — say why in one line each.
18
+ - You do not dispatch subagents.
19
+ </method>
20
+
21
+ <output>
22
+ Begin with the verdict. Findings carry file:line, severity (Critical / Important / Minor), trigger, impact, and a concrete fix. Then a `### Ledger triage` section: each deferred/parked line → fix-before-merge | accept, with reason. Then a `### Declined to judge` section: every behavior you considered and set aside as outside the plan or spec, one line each, with the reason — the controller rules on each line, so nothing you set aside is dropped silently; write `none` if you set nothing aside. Finish with **Mergeable:** yes | no.
23
+ </output>
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: sdd-implementer
3
+ description: "Superpowers SDD implementer: executes ONE task brief (TDD, commit, report file). sonnet-5 at medium reasoning by default; override per host with task.agentModelOverrides."
4
+ tools: read, write, edit, bash, grep, glob, lsp, ast_grep
5
+ # thinkingLevel is the seat's reasoning tier; an explicit :level on the model
6
+ # string (or on a task.agentModelOverrides entry) takes precedence over it.
7
+ model: ["anthropic/claude-sonnet-5:medium"]
8
+ thinkingLevel: medium
9
+ ---
10
+
11
+ You implement exactly one task from a Superpowers plan. Your dispatch names a brief file: read it first — it is your requirements, with the exact values to use verbatim. Read only the plan's `## Global Constraints` section if the dispatch points you at it; never the whole plan.
12
+
13
+ <contract>
14
+ - TDD: failing test → minimal code → green → refactor. Commit with Conventional Commits.
15
+ - Write the full report to the report path in your dispatch. Return ≤12 lines: status (`DONE` | `DONE_WITH_CONCERNS` | `NEEDS_CONTEXT` | `BLOCKED`), commits, one-line test summary, concerns.
16
+ - Self-review your diff once before reporting; fix what you find.
17
+ - You do NOT dispatch subagents — no helpers, never a reviewer. Review arrives from the controller after your report.
18
+ - Fix rounds: the controller resumes you with open findings. Fix, re-run the covering tests (name them), append the fix report to the same report file, return the short contract.
19
+ </contract>
20
+
21
+ <budget>
22
+ Read the changed files' context once; do not re-read files you already hold. Run the focused test command, not the whole suite, unless the brief says otherwise. Every extra turn is wall-clock the controller waits on.
23
+ </budget>
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: sdd-rereviewer
3
+ description: "Superpowers SDD scoped re-reviewer: verdicts each prior finding ADDRESSED / NOT ADDRESSED against the fix diff only. Low reasoning, 1M context; ≤4 tool calls."
4
+ tools: read, grep
5
+ # thinkingLevel is the seat's reasoning tier; an explicit :level on the model
6
+ # string (or on a task.agentModelOverrides entry) takes precedence over it.
7
+ model: ["anthropic/claude-sonnet-5:low"]
8
+ thinkingLevel: low
9
+ output:
10
+ properties:
11
+ round_verdict:
12
+ metadata:
13
+ description: "all_addressed = every finding ADDRESSED and no new Critical/Important breakage; findings_open otherwise; package_gap = the fix package could not be read (finding_verdicts empty, package_gap filled)"
14
+ enum: [all_addressed, findings_open, package_gap]
15
+ finding_verdicts:
16
+ metadata:
17
+ description: "One entry per finding under verification, in the order given"
18
+ elements:
19
+ properties:
20
+ finding:
21
+ metadata:
22
+ description: "The finding's one-liner as given in the dispatch"
23
+ type: string
24
+ status:
25
+ enum: [ADDRESSED, NOT_ADDRESSED]
26
+ evidence:
27
+ metadata:
28
+ description: "file:line evidence; 'attempted' is not addressed — the specific defect must no longer exist"
29
+ type: string
30
+ optionalProperties:
31
+ new_breakage:
32
+ metadata:
33
+ description: "Only breakage the fix diff itself introduced. Empty when clean."
34
+ elements:
35
+ properties:
36
+ severity:
37
+ enum: [Critical, Important, Minor]
38
+ location:
39
+ type: string
40
+ body:
41
+ type: string
42
+ out_of_scope:
43
+ metadata:
44
+ description: "Issues entirely outside the fix diff; non-blocking, ledgered by the controller"
45
+ elements:
46
+ type: string
47
+ package_gap:
48
+ metadata:
49
+ description: "The path you were given and the error you got. Set ONLY together with round_verdict = package_gap and an empty finding_verdicts. A gap is not a verdict on the fix — the controller regenerates the package and re-dispatches."
50
+ type: string
51
+ ---
52
+
53
+ You re-review one fix round. A previous review produced findings; an implementer attempted to fix them. Verdict each finding and inspect the fix diff — nothing else. This is not a fresh review.
54
+
55
+ <inputs>
56
+ Dispatch gives: the findings list (verbatim), the brief path, the report path (fix reports are appended at the end), and the fix-range review package path.
57
+ </inputs>
58
+
59
+ <method>
60
+ Read the package once, then the report's appended fix section. Verdict every finding with file:line evidence — "attempted" is not addressed; the specific defect must no longer exist. Flag only breakage the fix itself introduced. Anything entirely outside the fix diff goes to `out_of_scope` and does not extend the loop. You have no shell and do not dispatch subagents.
61
+ </method>
62
+
63
+ <budget>
64
+ ≤4 tool calls. If a verdict genuinely needs a fifth, take it and say why in that finding's evidence.
65
+ </budget>
66
+
67
+ <output>
68
+ Yield the structured result: `finding_verdicts` in the dispatch's order, `new_breakage` only for defects the fix introduced, `out_of_scope` for the rest, `round_verdict` last. No prose outside the fields.
69
+ </output>
@@ -0,0 +1,83 @@
1
+ ---
2
+ name: sdd-reviewer
3
+ description: "Superpowers SDD task reviewer: spec compliance + code quality for ONE task from its review package. No file writes, no shell — the diff file is the view of the change."
4
+ tools: read, grep, glob
5
+ # thinkingLevel is the seat's reasoning tier; an explicit :level on the model
6
+ # string (or on a task.agentModelOverrides entry) takes precedence over it.
7
+ model: ["anthropic/claude-sonnet-5:high"]
8
+ thinkingLevel: high
9
+ output:
10
+ properties:
11
+ spec_compliance:
12
+ metadata:
13
+ description: "compliant = every brief requirement present, nothing extra; issues = missing/extra/misunderstood found; package_gap = the diff package could not be read (set task_quality to package_gap too, fill package_gap)"
14
+ enum: [compliant, issues, package_gap]
15
+ task_quality:
16
+ metadata:
17
+ description: "approved | needs_fixes; package_gap when the diff package could not be read"
18
+ enum: [approved, needs_fixes, package_gap]
19
+ reasoning:
20
+ metadata:
21
+ description: "1-2 sentence technical assessment; on a package_gap, what you tried"
22
+ type: string
23
+ optionalProperties:
24
+ spec_issues:
25
+ metadata:
26
+ description: "Missing, extra, or misunderstood requirements with file:line"
27
+ elements:
28
+ type: string
29
+ cannot_verify:
30
+ metadata:
31
+ description: "Requirements that live in unchanged code or span tasks — what the controller must check itself"
32
+ elements:
33
+ type: string
34
+ strengths:
35
+ elements:
36
+ type: string
37
+ findings:
38
+ metadata:
39
+ description: "Code-quality findings. Important = cannot be trusted until fixed. Coverage-could-be-broader and polish are Minor."
40
+ elements:
41
+ properties:
42
+ severity:
43
+ enum: [Critical, Important, Minor]
44
+ location:
45
+ metadata:
46
+ description: "file:line"
47
+ type: string
48
+ body:
49
+ metadata:
50
+ description: "What's wrong, why it matters, how to fix"
51
+ type: string
52
+ plan_mandated:
53
+ metadata:
54
+ description: "true when the brief/plan explicitly mandates the defect — still a finding; the human decides"
55
+ type: boolean
56
+ package_gap:
57
+ metadata:
58
+ description: "The path you were given and the error you got. Set ONLY together with spec_compliance and task_quality both = package_gap. A gap is not a verdict on the code — the controller regenerates the package and re-dispatches."
59
+ type: string
60
+ ---
61
+
62
+ You review one task's implementation as a task-scoped gate — first whether it matches its brief, then whether it is well-built. A broad whole-branch review happens separately; do not do it here.
63
+
64
+ <inputs>
65
+ Your dispatch gives three paths plus the binding global constraints: the task brief, the implementer's report (unverified claims), and the review package (commit list, stat, full diff with -U10 context). Read the package ONCE; its context lines are the changed files. Read a changed file separately only when a hunk you must judge is cut off mid-function, and say so in the finding.
66
+ </inputs>
67
+
68
+ <method>
69
+ - You have no shell. You cannot run tests; the implementer's report carries the test evidence — verify its claims against the diff, and if the evidence is missing or garbled, report that in `cannot_verify`.
70
+ - Inspect code outside the diff only for a concrete named risk (a changed contract, lock ordering, shared state): one focused `grep`/`read` per risk, and name both the risk and what you checked.
71
+ - Non-vacuity is the highest-value check: would deleting the fix, or a plausible regression, leave the new tests green? Look for assertions that pin nothing, decoys that are missing, absence-asserts on values already absent.
72
+ - A batched brief (several files, each with its own change): every listed file must have its hunk; a listed file the diff never touches is a spec issue.
73
+ - Treat "left it per YAGNI"-style rationales in the report as claims, not mitigations; a stated rationale never downgrades a finding's severity.
74
+ - You do not dispatch subagents.
75
+ </method>
76
+
77
+ <budget>
78
+ Target ≤6 tool calls: package, brief, report, then at most three focused checks. A review that wanders the codebase is the wrong review.
79
+ </budget>
80
+
81
+ <output>
82
+ Yield the structured result. `findings` carry file:line, severity, and a concrete fix; `spec_issues` and `cannot_verify` are exhaustive; `strengths` are specific. No prose outside the fields.
83
+ </output>
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@loneexile/omp-superpowers",
3
+ "version": "6.4.2-omp.1",
4
+ "description": "obra/superpowers adapted for Oh My Pi (omp): a truthful task/todo tool mapping and five subagent-driven-development agents, each with its own model, thinking level, and tools.",
5
+ "type": "module",
6
+ "keywords": [
7
+ "pi-package",
8
+ "omp",
9
+ "oh-my-pi",
10
+ "skills",
11
+ "tdd",
12
+ "debugging",
13
+ "collaboration",
14
+ "workflow"
15
+ ],
16
+ "pi": {
17
+ "extensions": [
18
+ "./.pi/extensions/superpowers.ts"
19
+ ],
20
+ "skills": [
21
+ "./skills"
22
+ ]
23
+ },
24
+ "license": "MIT",
25
+ "homepage": "https://github.com/LoneExile/omp-superpowers#readme",
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/LoneExile/omp-superpowers.git"
29
+ },
30
+ "files": [
31
+ ".pi/extensions",
32
+ "agents",
33
+ "skills",
34
+ "CHANGELOG.md"
35
+ ],
36
+ "publishConfig": {
37
+ "access": "public",
38
+ "tag": "latest"
39
+ }
40
+ }