@pi-unipi/unipi 2.6.0 → 2.6.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.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,25 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [2.6.1] — 2026-08-20
10
+
11
+ This release fixes the notify settings overlay and recap model selector in terminals using the kitty keyboard protocol (Ghostty under Herdr), and makes the model selector reflect Pi's live model registry.
12
+
13
+ ### Fixed
14
+
15
+ - `notify`: settings overlay and recap model selector match Up/Down/Escape/Enter/Tab/Space/Backspace via `matchesKey()` from `@earendil-works/pi-tui` instead of raw byte comparison — under the kitty keyboard protocol Escape arrives as `\x1b[27u` (Ctrl+C as `\x1b[99;5u`), so arrows/Escape silently did nothing and the selector could trap the user (issue #27).
16
+ - `notify`: Ctrl+C now always closes both overlays, even mid-filter.
17
+ - `notify`: recap model selector lists models injected from Pi's live `ctx.modelRegistry` instead of relying solely on `~/.unipi/config/models-cache.json`; when neither source has models it shows an actionable hint instead of a bare "No models found".
18
+ - `core`: model-cache paths are resolved per call (respects `HOME` changes; enables isolated tests).
19
+
20
+ ### Added
21
+
22
+ - `/unipi:notify-event <event> <on|off>` — toggle a notify event without the TUI (escape hatch for terminals with overlay input problems); reports the resulting value and reminds that `/reload` re-registers listeners.
23
+
24
+ ### Changed
25
+
26
+ - `notify`: arrows navigate inside selector filter mode without leaving it; `m` and `M` both open the model selector from the Recap tab.
27
+
9
28
  ## [2.6.0] — 2026-08-14
10
29
 
11
30
  This release completes UniPi's provider prefix-cache preservation rollout, making model-visible state append-only within explicit cache epochs while adding privacy-safe diagnostics and bounded external results.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/unipi",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "All-in-one extension suite for Pi coding agent",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -77,26 +77,26 @@
77
77
  "typebox": "^1.1.38"
78
78
  },
79
79
  "dependencies": {
80
- "@pi-unipi/ask-user": "2.6.0",
81
- "@pi-unipi/btw": "2.6.0",
82
- "@pi-unipi/compactor": "2.6.0",
83
- "@pi-unipi/notify": "2.6.0",
84
- "@pi-unipi/command-enchantment": "2.6.0",
85
- "@pi-unipi/core": "2.6.0",
86
- "@pi-unipi/info-screen": "2.6.0",
87
- "@pi-unipi/mcp": "2.6.0",
88
- "@pi-unipi/memory": "2.6.0",
89
- "@pi-unipi/ralph": "2.6.0",
90
- "@pi-unipi/subagents": "2.6.0",
91
- "@pi-unipi/utility": "2.6.0",
92
- "@pi-unipi/milestone": "2.6.0",
93
- "@pi-unipi/kanboard": "2.6.0",
94
- "@pi-unipi/web-api": "2.6.0",
95
- "@pi-unipi/workflow": "2.6.0",
96
- "@pi-unipi/footer": "2.6.0",
97
- "@pi-unipi/updater": "2.6.0",
98
- "@pi-unipi/input-shortcuts": "2.6.0",
99
- "@pi-unipi/cocoindex": "2.6.0"
80
+ "@pi-unipi/ask-user": "2.6.1",
81
+ "@pi-unipi/btw": "2.6.1",
82
+ "@pi-unipi/compactor": "2.6.1",
83
+ "@pi-unipi/notify": "2.6.1",
84
+ "@pi-unipi/command-enchantment": "2.6.1",
85
+ "@pi-unipi/core": "2.6.1",
86
+ "@pi-unipi/info-screen": "2.6.1",
87
+ "@pi-unipi/mcp": "2.6.1",
88
+ "@pi-unipi/memory": "2.6.1",
89
+ "@pi-unipi/ralph": "2.6.1",
90
+ "@pi-unipi/subagents": "2.6.1",
91
+ "@pi-unipi/utility": "2.6.1",
92
+ "@pi-unipi/milestone": "2.6.1",
93
+ "@pi-unipi/kanboard": "2.6.1",
94
+ "@pi-unipi/web-api": "2.6.1",
95
+ "@pi-unipi/workflow": "2.6.1",
96
+ "@pi-unipi/footer": "2.6.1",
97
+ "@pi-unipi/updater": "2.6.1",
98
+ "@pi-unipi/input-shortcuts": "2.6.1",
99
+ "@pi-unipi/cocoindex": "2.6.1"
100
100
  },
101
101
  "devDependencies": {
102
102
  "@earendil-works/pi-agent-core": "^0.80.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/ask-user",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "Structured user input tool for Pi coding agent — single-select, multi-select, freeform",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -40,7 +40,7 @@
40
40
  "access": "public"
41
41
  },
42
42
  "dependencies": {
43
- "@pi-unipi/core": "2.6.0"
43
+ "@pi-unipi/core": "2.6.1"
44
44
  },
45
45
  "peerDependencies": {
46
46
  "@earendil-works/pi-coding-agent": "^0.80.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/command-enchantment",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "Enhanced TUI autocomplete for /unipi:* commands — colored, sorted, and grouped by package",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -169,6 +169,7 @@ export const COMMAND_REGISTRY: Record<string, string> = {
169
169
  "unipi:notify-set-ntfy": "notify",
170
170
  "unipi:notify-test": "notify",
171
171
  "unipi:notify-recap-model": "notify",
172
+ "unipi:notify-event": "notify",
172
173
 
173
174
  // kanboard (2 commands)
174
175
  "unipi:kanboard": "kanboard",
@@ -282,6 +283,7 @@ export const COMMAND_DESCRIPTIONS: Record<string, string> = {
282
283
  "unipi:notify-set-ntfy": "Set up ntfy push notifications",
283
284
  "unipi:notify-test": "Test all enabled notification platforms",
284
285
  "unipi:notify-recap-model": "Select model for notification recaps",
286
+ "unipi:notify-event": "Toggle a notify event without the TUI: <event> <on|off>",
285
287
 
286
288
  "unipi:milestone-onboard": "Create MILESTONES.md from existing workflow docs",
287
289
  "unipi:milestone-update": "Sync MILESTONES.md with completed work",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/btw",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "A pi extension for parallel side conversations with /unipi:btw — part of the Unipi suite",
5
5
  "type": "module",
6
6
  "main": "extensions/btw.ts",
@@ -37,7 +37,7 @@
37
37
  "@earendil-works/pi-tui": "^0.80.0"
38
38
  },
39
39
  "dependencies": {
40
- "@pi-unipi/core": "2.6.0"
40
+ "@pi-unipi/core": "2.6.1"
41
41
  },
42
42
  "pi": {
43
43
  "extensions": [],
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/cocoindex",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "CocoIndex integration for Pi — AST-aware content indexing, semantic vector search, and incremental pipeline management",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -26,7 +26,7 @@
26
26
  "typebox": "^1.1.38"
27
27
  },
28
28
  "dependencies": {
29
- "@pi-unipi/core": "2.6.0"
29
+ "@pi-unipi/core": "2.6.1"
30
30
  },
31
31
  "optionalDependencies": {
32
32
  "@lancedb/lancedb": "^0.21.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/compactor",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "Context engine for Pi — zero-LLM compaction, session continuity, sandbox execution, and tool display optimization",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -34,8 +34,8 @@
34
34
  "access": "public"
35
35
  },
36
36
  "dependencies": {
37
- "@pi-unipi/core": "2.6.0",
38
- "@pi-unipi/info-screen": "2.6.0",
37
+ "@pi-unipi/core": "2.6.1",
38
+ "@pi-unipi/info-screen": "2.6.1",
39
39
  "@earendil-works/pi-agent-core": "^0.80.0"
40
40
  },
41
41
  "peerDependencies": {
@@ -297,6 +297,7 @@ export const NOTIFY_COMMANDS = {
297
297
  SET_NTFY: "notify-set-ntfy",
298
298
  TEST: "notify-test",
299
299
  RECAP_MODEL: "notify-recap-model",
300
+ NOTIFY_EVENT: "notify-event",
300
301
  } as const;
301
302
 
302
303
  /** Notify tool names */
@@ -9,14 +9,18 @@
9
9
  import * as fs from "node:fs";
10
10
  import * as path from "node:path";
11
11
 
12
- /** Path to the model cache directory */
13
- const CACHE_DIR = path.join(
14
- process.env.HOME ?? process.env.USERPROFILE ?? "~",
15
- ".unipi/config",
16
- );
12
+ /** Resolve the model cache directory at call time (respects HOME changes). */
13
+ function cacheDir(): string {
14
+ return path.join(
15
+ process.env.HOME ?? process.env.USERPROFILE ?? "~",
16
+ ".unipi/config",
17
+ );
18
+ }
17
19
 
18
- /** Path to the model cache file */
19
- const CACHE_FILE = path.join(CACHE_DIR, "models-cache.json");
20
+ /** Resolve the model cache file path at call time. */
21
+ function cacheFile(): string {
22
+ return path.join(cacheDir(), "models-cache.json");
23
+ }
20
24
 
21
25
  /** A single cached model entry */
22
26
  export interface CachedModel {
@@ -42,8 +46,9 @@ export interface ModelCache {
42
46
  */
43
47
  export function readModelCache(): CachedModel[] {
44
48
  try {
45
- if (!fs.existsSync(CACHE_FILE)) return [];
46
- const parsed = JSON.parse(fs.readFileSync(CACHE_FILE, "utf-8"));
49
+ const file = cacheFile();
50
+ if (!fs.existsSync(file)) return [];
51
+ const parsed = JSON.parse(fs.readFileSync(file, "utf-8"));
47
52
  return Array.isArray(parsed.models) ? parsed.models : [];
48
53
  } catch {
49
54
  return [];
@@ -56,14 +61,15 @@ export function readModelCache(): CachedModel[] {
56
61
  */
57
62
  export function writeModelCache(models: CachedModel[]): void {
58
63
  try {
59
- if (!fs.existsSync(CACHE_DIR)) {
60
- fs.mkdirSync(CACHE_DIR, { recursive: true });
64
+ const dir = cacheDir();
65
+ if (!fs.existsSync(dir)) {
66
+ fs.mkdirSync(dir, { recursive: true });
61
67
  }
62
68
  const cache: ModelCache = {
63
69
  updatedAt: new Date().toISOString(),
64
70
  models,
65
71
  };
66
- fs.writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2) + "\n", "utf-8");
72
+ fs.writeFileSync(cacheFile(), JSON.stringify(cache, null, 2) + "\n", "utf-8");
67
73
  } catch {
68
74
  // Best effort — cache is optional
69
75
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/core",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "Shared utilities, event types, and constants for Unipi extension suite",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/footer",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "Persistent status bar for Unipi — subscribes to UNIPI_EVENTS and renders key stats from all unipi packages",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -32,7 +32,7 @@
32
32
  "access": "public"
33
33
  },
34
34
  "dependencies": {
35
- "@pi-unipi/core": "2.6.0"
35
+ "@pi-unipi/core": "2.6.1"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "@earendil-works/pi-coding-agent": "^0.80.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/image",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "Image generation and image recognition tools for the Pi coding agent",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -34,7 +34,7 @@
34
34
  "access": "public"
35
35
  },
36
36
  "dependencies": {
37
- "@pi-unipi/core": "2.6.0"
37
+ "@pi-unipi/core": "2.6.1"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "@earendil-works/pi-ai": "^0.80.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/info-screen",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "Dashboard and module registry for Unipi — configurable info overlay with tabbed groups",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -33,7 +33,7 @@
33
33
  "access": "public"
34
34
  },
35
35
  "dependencies": {
36
- "@pi-unipi/core": "2.6.0"
36
+ "@pi-unipi/core": "2.6.1"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@earendil-works/pi-coding-agent": "^0.80.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/input-shortcuts",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "Keyboard shortcuts for stash/restore, undo/redo, clipboard, and thinking toggle — chord-based overlay system",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -33,7 +33,7 @@
33
33
  "access": "public"
34
34
  },
35
35
  "dependencies": {
36
- "@pi-unipi/core": "2.6.0"
36
+ "@pi-unipi/core": "2.6.1"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@earendil-works/pi-coding-agent": "^0.80.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/kanboard",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "Visualization layer for unipi workflow — HTTP server with htmx/Alpine.js UI, modular parsers, TUI overlay, and kanban board",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -39,7 +39,7 @@
39
39
  "access": "public"
40
40
  },
41
41
  "dependencies": {
42
- "@pi-unipi/core": "2.6.0"
42
+ "@pi-unipi/core": "2.6.1"
43
43
  },
44
44
  "peerDependencies": {
45
45
  "@earendil-works/pi-coding-agent": "^0.80.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/mcp",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "MCP server management extension for Pi coding agent — browse, add, configure, and use MCP servers",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -30,7 +30,7 @@
30
30
  "test": "npx tsx --test tests/**/*.test.ts"
31
31
  },
32
32
  "dependencies": {
33
- "@pi-unipi/core": "2.6.0"
33
+ "@pi-unipi/core": "2.6.1"
34
34
  },
35
35
  "peerDependencies": {
36
36
  "@earendil-works/pi-coding-agent": "^0.80.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/memory",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "Persistent cross-session memory with MemPalace backend (auto-installed) and SQLite fallback for Pi coding agent",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -43,8 +43,8 @@
43
43
  "better-sqlite3": "^12.9.0",
44
44
  "sqlite-vec": "^0.1.9",
45
45
  "js-yaml": "^4.1.0",
46
- "@pi-unipi/core": "2.6.0",
47
- "@pi-unipi/info-screen": "2.6.0"
46
+ "@pi-unipi/core": "2.6.1",
47
+ "@pi-unipi/info-screen": "2.6.1"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "@earendil-works/pi-coding-agent": "^0.80.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/milestone",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "Lifecycle layer for project-level goals — MILESTONES.md tracking, session hooks, auto-sync",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -32,7 +32,7 @@
32
32
  "access": "public"
33
33
  },
34
34
  "dependencies": {
35
- "@pi-unipi/core": "2.6.0"
35
+ "@pi-unipi/core": "2.6.1"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "@earendil-works/pi-coding-agent": "^0.80.0",
@@ -13,6 +13,7 @@ Configure once, get alerts everywhere. Per-event platform routing lets you send
13
13
  | `/unipi:notify-set-tg` | Interactive Telegram bot setup |
14
14
  | `/unipi:notify-set-ntfy` | Configure ntfy topic and server |
15
15
  | `/unipi:notify-recap-model` | Set model for notification recaps |
16
+ | `/unipi:notify-event` | Toggle a single event without the TUI (`<event> <on\|off>`) — reports the new value; run `/reload` to re-register listeners |
16
17
  | `/unipi:notify-test` | Send test notification to all enabled platforms |
17
18
 
18
19
  ## Special Triggers
@@ -12,13 +12,32 @@ import { GotifySetupOverlay } from "./tui/gotify-setup.js";
12
12
  import { TelegramSetupOverlay } from "./tui/telegram-setup.js";
13
13
  import { NtfySetupOverlay } from "./tui/ntfy-setup.js";
14
14
  import { RecapModelSelectorOverlay } from "./tui/recap-model-selector.js";
15
- import { loadConfig } from "./settings.js";
15
+ import type { CachedModel } from "@pi-unipi/core";
16
+ import { loadConfig, saveConfig } from "./settings.js";
16
17
  import { loadNtfyConfig } from "./ntfy-config.js";
17
18
  import { sendNativeNotification, SuppressedError } from "./platforms/native.js";
18
19
  import { sendGotifyNotification } from "./platforms/gotify.js";
19
20
  import { sendTelegramNotification } from "./platforms/telegram.js";
20
21
  import { sendNtfyNotification } from "./platforms/ntfy.js";
21
22
 
23
+ /**
24
+ * Collect models for the recap selector from Pi's live model registry.
25
+ * Returns undefined when the registry is unavailable so the overlay can fall
26
+ * back to the project-wide model cache (issue #27: selector was empty because
27
+ * it only read ~/.unipi/config/models-cache.json, which may not exist even
28
+ * when models are configured in ~/.pi/agent/models.json).
29
+ */
30
+ function registryModels(ctx: ExtensionContext): CachedModel[] | undefined {
31
+ const registry = ctx.modelRegistry;
32
+ if (!registry) return undefined;
33
+ try {
34
+ const models = registry.getAvailable?.() ?? registry.getAll() ?? [];
35
+ return models.map((m) => ({ provider: m.provider, id: m.id, name: m.name }));
36
+ } catch {
37
+ return undefined;
38
+ }
39
+ }
40
+
22
41
  /**
23
42
  * Register notify commands.
24
43
  */
@@ -44,7 +63,7 @@ export function registerNotifyCommands(pi: ExtensionAPI): void {
44
63
  // Open model selector as nested overlay
45
64
  ctx.ui.custom(
46
65
  (innerTui: any, innerTheme: any, _innerKb: any, innerDone: any) => {
47
- const selector = new RecapModelSelectorOverlay();
66
+ const selector = new RecapModelSelectorOverlay(registryModels(ctx));
48
67
  selector.setTheme(innerTheme);
49
68
  selector.onClose = () => innerDone(undefined);
50
69
  selector.requestRender = () => innerTui.requestRender();
@@ -102,9 +121,10 @@ export function registerNotifyCommands(pi: ExtensionAPI): void {
102
121
  return;
103
122
  }
104
123
 
124
+ const models = registryModels(ctx);
105
125
  ctx.ui.custom(
106
126
  (tui, theme, _keybindings, done) => {
107
- const overlay = new RecapModelSelectorOverlay();
127
+ const overlay = new RecapModelSelectorOverlay(models);
108
128
  overlay.setTheme(theme);
109
129
  overlay.onClose = () => done(undefined);
110
130
  overlay.requestRender = () => tui.requestRender();
@@ -251,6 +271,44 @@ export function registerNotifyCommands(pi: ExtensionAPI): void {
251
271
  }
252
272
  );
253
273
 
274
+ // /unipi:notify-event <event> <on|off> — Non-TUI event toggle (issue #27 escape
275
+ // hatch for terminals where overlay input is unusable)
276
+ pi.registerCommand(
277
+ `${UNIPI_PREFIX}${NOTIFY_COMMANDS.NOTIFY_EVENT}`,
278
+ {
279
+ description: "Toggle a notify event without the TUI: <event> <on|off>",
280
+ handler: async (args: string, ctx: ExtensionContext) => {
281
+ const parts = args.trim().split(/\s+/).filter(Boolean);
282
+ const [event, value] = parts;
283
+
284
+ if (parts.length !== 2 || (value !== "on" && value !== "off")) {
285
+ ctx.ui.notify(
286
+ "Usage: /unipi:notify-event <event> <on|off>",
287
+ "warning"
288
+ );
289
+ return;
290
+ }
291
+
292
+ const config = loadConfig();
293
+ if (!(event in config.events)) {
294
+ const known = Object.keys(config.events).join(", ");
295
+ ctx.ui.notify(
296
+ `Unknown event "${event}". Known events: ${known}`,
297
+ "error"
298
+ );
299
+ return;
300
+ }
301
+
302
+ config.events[event].enabled = value === "on";
303
+ saveConfig(config);
304
+ ctx.ui.notify(
305
+ `notify: ${event} is now ${value}. Run /reload to re-register listeners.`,
306
+ "info"
307
+ );
308
+ },
309
+ }
310
+ );
311
+
254
312
  // /unipi:notify-test — Send test notification to all enabled platforms
255
313
  pi.registerCommand(
256
314
  `${UNIPI_PREFIX}${NOTIFY_COMMANDS.TEST}`,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/notify",
3
- "version": "2.6.0",
3
+ "version": "2.6.1",
4
4
  "description": "Cross-platform notification extension for Pi — native OS, Gotify, and Telegram notifications for agent lifecycle events",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -34,7 +34,7 @@
34
34
  "access": "public"
35
35
  },
36
36
  "dependencies": {
37
- "@pi-unipi/core": "2.6.0",
37
+ "@pi-unipi/core": "2.6.1",
38
38
  "node-notifier": "^10.0.1"
39
39
  },
40
40
  "peerDependencies": {