@juicesharp/rpiv-pi 1.14.2 → 1.14.4

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.
@@ -242,9 +242,13 @@ describe("session_start hook — notifications", () => {
242
242
  await captured.events.get("session_start")?.[0]({ reason: "startup" } as never, ctx as never);
243
243
  const warnCall = (ctx.ui.notify as ReturnType<typeof vi.fn>).mock.calls.find((c) => c[1] === "warning");
244
244
  expect(warnCall).toBeDefined();
245
- expect(warnCall?.[0]).toContain("rpiv-pi requires 2 sibling");
245
+ expect((warnCall?.[0] as string).startsWith("\n")).toBe(true);
246
+ expect(warnCall?.[0]).toContain("rpiv-pi: 2 sibling extensions missing");
246
247
  expect(warnCall?.[0]).toContain("@juicesharp/rpiv-advisor");
247
248
  expect(warnCall?.[0]).toContain("@juicesharp/rpiv-args");
249
+ expect(warnCall?.[0]).toContain("Run /rpiv-setup to install them.");
250
+ expect(warnCall?.[0]).toContain("╭");
251
+ expect(warnCall?.[0]).toContain("╯");
248
252
  expect(warnCall?.[0]).not.toContain("npm:");
249
253
  });
250
254
 
@@ -62,8 +62,16 @@ const msgAgentsAdded = (n: number) => `Copied ${n} rpiv-pi agent(s) to ~/.pi/age
62
62
  const msgAgentsHealed = (parts: string[]) => `Synced bundled agent(s): ${parts.join(", ")}.`;
63
63
  const msgAgentsDrift = (parts: string[]) => `${parts.join(", ")} agent(s). Run /rpiv-update-agents to sync.`;
64
64
  const msgAgentsErrors = (n: number) => `Agent sync reported ${n} error(s). Run /rpiv-update-agents for details.`;
65
- const msgMissingSiblings = (n: number, list: string) =>
66
- `rpiv-pi requires ${n} sibling extension(s): ${list}. Run /rpiv-setup to install them.`;
65
+ function msgMissingSiblings(pkgs: string[]): string {
66
+ const n = pkgs.length;
67
+ const title = `rpiv-pi: ${n} sibling extension${n === 1 ? "" : "s"} missing`;
68
+ const body = [...pkgs.map((p) => `• ${p}`), "", "Run /rpiv-setup to install them."];
69
+ const total = Math.max(title.length + 6, ...body.map((l) => l.length + 4));
70
+ const top = `╭─ ${title} ${"─".repeat(total - title.length - 5)}╮`;
71
+ const middle = body.map((l) => `│ ${l.padEnd(total - 4)}│`).join("\n");
72
+ const bottom = `╰${"─".repeat(total - 2)}╯`;
73
+ return `${top}\n${middle}\n${bottom}`;
74
+ }
67
75
 
68
76
  type UI = { notify: (msg: string, sev: "info" | "warning" | "error") => void };
69
77
 
@@ -264,5 +272,8 @@ function notifyCleanup(ui: UI, result: CleanupResult): void {
264
272
  function warnMissingSiblings(ui: UI): void {
265
273
  const missing = findMissingSiblings();
266
274
  if (missing.length === 0) return;
267
- ui.notify(msgMissingSiblings(missing.length, missing.map((m) => m.pkg.replace(/^npm:/, "")).join(", ")), "warning");
275
+ // Leading newline so Pi's "Warning: " severity prefix sits on its own
276
+ // line; every box row then gets Pi's 1-space continuation indent
277
+ // uniformly and the border stays aligned.
278
+ ui.notify(`\n${msgMissingSiblings(missing.map((m) => m.pkg.replace(/^npm:/, "")))}`, "warning");
268
279
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juicesharp/rpiv-pi",
3
- "version": "1.14.2",
3
+ "version": "1.14.4",
4
4
  "description": "A skill-based development workflow for Pi Agent. Five skills (research, design, plan, implement, validate) and the shared subagents that compose its ship-loop.",
5
5
  "keywords": [
6
6
  "pi-package",