bigpowers 2.88.1 → 2.88.3

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.88.1",
3
+ "version": "2.88.3",
4
4
  "description": "81 skills — 73 agent skills synthesizing 17 years of software engineering discipline into a prescriptive methodology for solo developers",
5
5
  "keywords": [
6
6
  "gemini-extension"
package/.pi/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.88.1",
3
+ "version": "2.88.3",
4
4
  "description": "81 skills — 73 agent skills synthesizing 17 years of software engineering discipline into a prescriptive methodology for solo developers",
5
5
  "keywords": [
6
6
  "pi-package"
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [2.88.3](https://github.com/danielvm-git/bigpowers/compare/v2.88.2...v2.88.3) (2026-09-13)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **pi:** prevent duplicate Bigpowers slash commands ([#121](https://github.com/danielvm-git/bigpowers/issues/121)) ([#124](https://github.com/danielvm-git/bigpowers/issues/124)) ([45870e2](https://github.com/danielvm-git/bigpowers/commit/45870e2e8e041ba3e21996fb98c96ec2a2484552))
7
+
8
+ ## [2.88.2](https://github.com/danielvm-git/bigpowers/compare/v2.88.1...v2.88.2) (2026-09-06)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **ci:** run npm ci before verification gates so omp-extension smoke resolves typebox ([#120](https://github.com/danielvm-git/bigpowers/issues/120)) ([9a457e6](https://github.com/danielvm-git/bigpowers/commit/9a457e62959dd0d5cdf5139502adfbf1031179d4))
14
+
1
15
  ## [2.88.1](https://github.com/danielvm-git/bigpowers/compare/v2.88.0...v2.88.1) (2026-09-05)
2
16
 
3
17
 
package/CONTRIBUTORS.md CHANGED
@@ -36,7 +36,7 @@ Discovered via fork audit on 2026-09-01.
36
36
 
37
37
  XcluEzy7 built a native [oh-my-pi](https://github.com/oh-my-pi) OMP plugin that:
38
38
 
39
- - Discovers every skill in `skills/` at runtime and registers each as a slash command.
39
+ - Discovers every skill in `skills/` at runtime for dynamic tool invocation.
40
40
  - Exposes a unified `bigpowers_skill` LLM tool with `list`/`get`/`run` operations.
41
41
  - Ports bigpowers' git-safety pre-tool-use hook into OMP's `tool_call` event API,
42
42
  blocking dangerous patterns and enforcing Conventional Commits.
package/README.md CHANGED
@@ -391,7 +391,7 @@ bigpowers has been shaped by contributors who extended it in their own forks.
391
391
  See [CONTRIBUTORS.md](CONTRIBUTORS.md) for the full list.
392
392
 
393
393
  - **[Kevin Oberlies (favilo)](https://github.com/favilo/bigpowers)** — Jujutsu VCS support across lifecycle skills + `project-runtime.sh` configurable settings library.
394
- - **[XcluEzy7](https://github.com/XcluEzy7/bigpowers)** — OMP plugin extension (`extensions/omp-hooks.ts`): native skill discovery, slash commands, and git-safety hooks for the oh-my-pi runtime.
394
+ - **[XcluEzy7](https://github.com/XcluEzy7/bigpowers)** — OMP plugin extension (`extensions/omp-hooks.ts`): native skill discovery, unified skill tooling, and git-safety hooks for the oh-my-pi runtime.
395
395
 
396
396
  ---
397
397
 
@@ -1,7 +1,8 @@
1
1
  // story: e82s03
2
2
  // extensions/omp-hooks.ts
3
- // bigpowers — Single OMP extension entry exposing every source skill as a
4
- // slash command, a bigpowers_skill LLM tool, and safety policy guards.
3
+ // bigpowers — Single OMP extension entry exposing source skills through the
4
+ // bigpowers_skill LLM tool and enforcing safety policy guards. Pi prompt
5
+ // templates own slash-command registration so each workflow appears once.
5
6
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
6
7
  import { Type } from "typebox";
7
8
  import { execSync } from "node:child_process";
@@ -247,18 +248,6 @@ export default function bigpowers(pi: ExtensionAPI) {
247
248
  // Discover skills from skills/ in the installed plugin package root.
248
249
  const skills = discoverSkills(join(pluginRoot(), "skills"));
249
250
 
250
- // ----- Slash commands --------------------------------------------------
251
-
252
- for (const skill of skills) {
253
- pi.registerCommand(skill.name, {
254
- description: skill.description,
255
- handler: async (args, _ctx) => {
256
- const prompt = buildSkillPrompt(skill, args);
257
- await injectSkillPrompt(pi, prompt);
258
- },
259
- });
260
- }
261
-
262
251
  // ----- bigpowers_skill tool --------------------------------------------
263
252
 
264
253
  pi.registerTool({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.88.1",
3
+ "version": "2.88.3",
4
4
  "description": "73 agent skills synthesizing 17 years of software engineering discipline into a prescriptive methodology for solo developers",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -30,6 +30,11 @@ epics_wiki_assign_tier() {
30
30
  for epic_yaml in "$ROOT"/specs/epics/*/epic.yaml "$ROOT"/specs/epics/archive/*/epic.yaml; do
31
31
  [ -f "$epic_yaml" ] || continue
32
32
 
33
+ # Emit a repo-relative path — an absolute $ROOT path bakes the generating
34
+ # machine/worktree into the committed wiki, producing spurious diffs whenever
35
+ # a different checkout regenerates it (BUG-2026-09-05 follow-up).
36
+ epic_yaml_rel="${epic_yaml#"$ROOT"/}"
37
+
33
38
  epic_dir=$(dirname "$epic_yaml")
34
39
  epic_slug=$(basename "$epic_dir")
35
40
 
@@ -82,7 +87,7 @@ ${refs}
82
87
  **Epic:** ${epic_id} | **WSJF:** ${wsjf:-0} | **BCP:** ${bcps:-0} | **Status:** ${status:-proposed}
83
88
  **Release:** ${release:-unknown} | **Tier:** ${tier}
84
89
 
85
- ${story_count} stories. See \`${epic_yaml}\` for full specifications.
90
+ ${story_count} stories. See \`${epic_yaml_rel}\` for full specifications.
86
91
  OKFEOF
87
92
 
88
93
  count=$((count + 1))
@@ -1,7 +1,7 @@
1
1
  // story: e82s03
2
2
  // Runtime smoke for extensions/omp-hooks.ts.
3
- // Imports the extension, registers a fake ExtensionAPI, calls registered hooks,
4
- // and asserts the slash-command handler awaits injection.
3
+ // Imports the extension, registers a fake ExtensionAPI, and verifies the
4
+ // extension leaves commands to prompt templates while skill-tool injection works.
5
5
  //
6
6
  // Load-phase contract (BUG-2026-09-05, #119): pi installs throwing stubs for
7
7
  // ACTION methods during extension loading and only binds real implementations
@@ -10,6 +10,7 @@
10
10
  // fails here exactly as it does in real pi, instead of silently passing.
11
11
  // See pi 0.85.1 src/core/extensions/loader.ts (createExtensionRuntime).
12
12
 
13
+ import { readFileSync } from "node:fs";
13
14
  import bigpowers from "../extensions/omp-hooks.ts";
14
15
 
15
16
  type AnyObj = Record<string, unknown>;
@@ -82,23 +83,26 @@ await bigpowers(pi as unknown as never);
82
83
  // are callable from here on (handlers, tool executions).
83
84
  loading = false;
84
85
 
86
+ const packageManifest = JSON.parse(
87
+ readFileSync(new URL("../package.json", import.meta.url), "utf8"),
88
+ ) as { pi?: { prompts?: string[] } };
89
+ const promptTemplates = packageManifest.pi?.prompts ?? [];
90
+
91
+ if (commands.size !== 0) {
92
+ throw new Error(`extension registered ${commands.size} duplicate workflow commands`);
93
+ }
94
+ if (!promptTemplates.includes("./.pi/prompts")) {
95
+ throw new Error("package does not declare the canonical Pi prompt templates");
96
+ }
97
+
85
98
  console.log(JSON.stringify({
86
99
  commands: commands.size,
100
+ promptTemplates,
87
101
  tool: tools[0]?.name,
88
102
  events: [...events.keys()],
89
- firstCommand: [...commands.keys()].slice(0, 5),
90
103
  sendUserMessageAwaitable: typeof pi.sendUserMessage === "function",
91
104
  }));
92
105
 
93
- // Exercise the /survey-context handler end-to-end.
94
- const handler = commands.get("survey-context")?.handler;
95
- if (!handler) throw new Error("survey-context command not registered");
96
- await handler("", {});
97
-
98
- // Verify a nonexistent command is not present.
99
- const fallback = commands.get("nonexistent-skill-for-test")?.handler;
100
- if (fallback) throw new Error("unexpected command registered");
101
-
102
106
  // Test bigpowers_skill run path.
103
107
  const skillTool = tools[0];
104
108
  if (!skillTool?.execute) throw new Error("bigpowers_skill tool missing execute");
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bash
2
2
  # story: e82s03
3
- # OMP extension integrity guard — validates the extension entry is wired
4
- # correctly and all source skills are discoverable via skills/<name>/SKILL.md.
3
+ # OMP extension integrity guard — validates the extension entry is wired,
4
+ # leaves slash commands to Pi prompt templates, and discovers all source skills.
5
5
  # Run before merging any branch that touches extensions/.
6
6
  set -euo pipefail
7
7
 
@@ -43,20 +43,32 @@ else
43
43
  fi
44
44
  fi
45
45
 
46
- # ── 3. Extension source contains required symbols ──────────────────────────
47
- echo "--- [OMP] required runtime symbols in extension ---"
46
+ # ── 3. Extension owns tools/hooks; prompt templates own slash commands ─────
47
+ echo "--- [OMP] separated runtime responsibilities ---"
48
48
  if [[ -n "$EXT_PATH" && -f "$EXT_PATH" ]]; then
49
- for sym in "registerCommand" "registerTool" "tool_call"; do
49
+ for sym in "registerTool" "tool_call"; do
50
50
  if grep -q "$sym" "$EXT_PATH" 2>/dev/null; then
51
51
  pass "symbol '$sym' found in extension source"
52
52
  else
53
53
  fail "symbol '$sym' NOT found in extension source"
54
54
  fi
55
55
  done
56
+ if grep -q 'pi\.registerCommand' "$EXT_PATH" 2>/dev/null; then
57
+ fail "extension registers commands already supplied by Pi prompt templates"
58
+ else
59
+ pass "extension leaves slash-command registration to Pi prompt templates"
60
+ fi
56
61
  else
57
62
  fail "Cannot scan extension symbols — file not resolved"
58
63
  fi
59
64
 
65
+ PROMPT_COUNT=$(node -e "const p = require('./package.json'); console.log(p.pi?.prompts?.length || 0)")
66
+ if [[ "$PROMPT_COUNT" -eq 1 ]]; then
67
+ pass "pi.prompts has exactly 1 canonical prompt-template entry"
68
+ else
69
+ fail "pi.prompts has $PROMPT_COUNT entries (expected 1)"
70
+ fi
71
+
60
72
  # ── 4. Skill discovery root is skills/ ────────────────────────────────────
61
73
  echo "--- [OMP] source skill discoverability (skills/<name>/SKILL.md) ---"
62
74
  SKILLS_ROOT="$REPO_ROOT/skills"