@xynogen/pix-core 0.4.3 → 0.4.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
@@ -18,10 +18,10 @@ Pi activates extensions per installed package via each package's `pi.extensions`
18
18
  | `pix-footer` | Status bar: mode / git branch / model / cost / live TPS |
19
19
  | `pix-models` | `/models` — enhanced model picker with BenchLM rank, context, cost |
20
20
  | `pix-update` | `/update` — self-update Pi + refresh extensions |
21
- | `pix-commands` | `/diff` and `/clear` slash commands |
21
+ | `pix-commands` | `/clear` slash command |
22
22
  | `pix-diagnostics` | Compact LSP diagnostic widget |
23
23
  | `pix-prompts` | System-prompt injection (AGENTS.md + repo directive files) |
24
- | `pix-skills` | Agent skill loader (`read_skills` tool + 23 bundled skills) |
24
+ | `pix-skills` | Agent skill loader (`read_skills` tool + 28 bundled skills) |
25
25
  | `pix-nudge` | Tool + capability nudge hooks |
26
26
 
27
27
  **Tool suite** (drop-in replacements for Pi's built-in tools)
@@ -44,6 +44,7 @@ Pi activates extensions per installed package via each package's `pi.extensions`
44
44
  |---|---|
45
45
  | `pix-optimizer` | Caveman mode + RTK tool rewriting + jq/TOON JSON compression (`/opt`) |
46
46
  | `pix-gate` | Permission gate for dangerous bash commands |
47
+ | `pix-subagent` | `agent` / `agent_result` / `agent_steer` — planner-driven sub-agents with live widget |
47
48
 
48
49
  ## Install
49
50
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xynogen/pix-core",
3
- "version": "0.4.3",
3
+ "version": "0.4.5",
4
4
  "description": "Pi extension bundle — installs and activates all core pix-* extensions",
5
5
  "type": "module",
6
6
  "main": "src/extension.ts",
@@ -57,7 +57,8 @@
57
57
  "@xynogen/pix-todo": "*",
58
58
  "@xynogen/pix-ask": "*",
59
59
  "@xynogen/pix-optimizer": "*",
60
- "@xynogen/pix-gate": "*"
60
+ "@xynogen/pix-gate": "*",
61
+ "@xynogen/pix-subagent": "*"
61
62
  },
62
63
  "peerDependencies": {
63
64
  "@earendil-works/pi-coding-agent": "*",
package/src/extension.ts CHANGED
@@ -28,6 +28,7 @@ import registerOptimizer from "@xynogen/pix-optimizer/src/index.ts";
28
28
  import registerPrompts from "@xynogen/pix-prompts/src/extension.ts";
29
29
  import registerRead from "@xynogen/pix-read/src/extension.ts";
30
30
  import registerSkills from "@xynogen/pix-skills/src/index.ts";
31
+ import registerSubagent from "@xynogen/pix-subagent/src/extension.ts";
31
32
  import registerTodo from "@xynogen/pix-todo/src/index.ts";
32
33
  import registerUpdate from "@xynogen/pix-update/src/extension.ts";
33
34
  import registerWelcome from "@xynogen/pix-welcome/src/extension.ts";
@@ -59,6 +60,7 @@ const MEMBERS: Factory[] = [
59
60
  registerAsk,
60
61
  registerOptimizer,
61
62
  registerGate,
63
+ registerSubagent,
62
64
  ];
63
65
 
64
66
  export default function (pi: ExtensionAPI): void {
package/src/once.test.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { afterEach, describe, expect, it } from "bun:test";
2
+ import registerSubagent from "@xynogen/pix-subagent/src/extension.ts";
2
3
  import registerTodo from "@xynogen/pix-todo/src/todo.ts";
3
4
 
4
5
  // Mirror of the per-instance guard. pix-core does not own once.ts (each member
@@ -141,3 +142,40 @@ describe("member factory dedupe (pix-todo)", () => {
141
142
  expect(tools2).toEqual(["todo"]);
142
143
  });
143
144
  });
145
+
146
+ describe("member factory dedupe (pix-subagent)", () => {
147
+ function makeHost() {
148
+ const toolNames: string[] = [];
149
+ const pi = {
150
+ registerTool(def: { name: string }) {
151
+ toolNames.push(def.name);
152
+ },
153
+ appendEntry() {},
154
+ on() {},
155
+ getAvailableAgentTypes() {
156
+ return [];
157
+ },
158
+ getAvailableModels() {
159
+ return [];
160
+ },
161
+ registerMessageRenderer() {},
162
+ } as never;
163
+ return { pi, toolNames };
164
+ }
165
+
166
+ it("registers agent tools once across core + standalone activation (same pi)", () => {
167
+ const { pi, toolNames } = makeHost();
168
+ registerSubagent(pi);
169
+ registerSubagent(pi);
170
+ expect(toolNames).toEqual(["agent", "agent_result", "agent_steer"]);
171
+ });
172
+
173
+ it("registers agent tools again for a fresh pi instance (/new rehydration)", () => {
174
+ const { pi: pi1, toolNames: tools1 } = makeHost();
175
+ const { pi: pi2, toolNames: tools2 } = makeHost();
176
+ registerSubagent(pi1);
177
+ registerSubagent(pi2);
178
+ expect(tools1).toEqual(["agent", "agent_result", "agent_steer"]);
179
+ expect(tools2).toEqual(["agent", "agent_result", "agent_steer"]);
180
+ });
181
+ });