@hivemindai/mcp-server 0.5.1 → 0.6.2

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 (192) hide show
  1. package/dist/__tests__/config.test.js +1 -1
  2. package/dist/__tests__/config.test.js 2.map +1 -0
  3. package/dist/__tests__/config.test.js.map +1 -1
  4. package/dist/__tests__/credentials.test 2.js +126 -0
  5. package/dist/__tests__/credentials.test.d.ts 2.map +1 -0
  6. package/dist/__tests__/credentials.test.js +5 -5
  7. package/dist/__tests__/credentials.test.js.map +1 -1
  8. package/dist/__tests__/editor-config.test.d 2.ts +2 -0
  9. package/dist/__tests__/editor-config.test.js 2.map +1 -0
  10. package/dist/__tests__/format.test.d.ts 2.map +1 -0
  11. package/dist/__tests__/format.test.js 2.map +1 -0
  12. package/dist/__tests__/helpers/mock-server 2.js +107 -0
  13. package/dist/__tests__/helpers/mock-server.d 2.ts +79 -0
  14. package/dist/__tests__/helpers/mock-server.d.ts +79 -0
  15. package/dist/__tests__/helpers/mock-server.d.ts 2.map +1 -0
  16. package/dist/__tests__/helpers/mock-server.d.ts.map +1 -0
  17. package/dist/__tests__/helpers/mock-server.js +107 -0
  18. package/dist/__tests__/helpers/mock-server.js 2.map +1 -0
  19. package/dist/__tests__/helpers/mock-server.js.map +1 -0
  20. package/dist/__tests__/remember.test 2.js +152 -0
  21. package/dist/__tests__/remember.test.d.ts +2 -0
  22. package/dist/__tests__/remember.test.d.ts.map +1 -0
  23. package/dist/__tests__/remember.test.js +152 -0
  24. package/dist/__tests__/remember.test.js.map +1 -0
  25. package/dist/__tests__/tools-approvals.test.d.ts +2 -0
  26. package/dist/__tests__/tools-approvals.test.d.ts.map +1 -0
  27. package/dist/__tests__/tools-approvals.test.js +219 -0
  28. package/dist/__tests__/tools-approvals.test.js.map +1 -0
  29. package/dist/__tests__/tools-context.test 2.js +107 -0
  30. package/dist/__tests__/tools-context.test.d.ts +2 -0
  31. package/dist/__tests__/tools-context.test.d.ts.map +1 -0
  32. package/dist/__tests__/tools-context.test.js +107 -0
  33. package/dist/__tests__/tools-context.test.js 2.map +1 -0
  34. package/dist/__tests__/tools-context.test.js.map +1 -0
  35. package/dist/__tests__/tools-handoffs.test.d.ts +2 -0
  36. package/dist/__tests__/tools-handoffs.test.d.ts.map +1 -0
  37. package/dist/__tests__/tools-handoffs.test.js +153 -0
  38. package/dist/__tests__/tools-handoffs.test.js.map +1 -0
  39. package/dist/__tests__/tools-knowledge.test.d 2.ts +2 -0
  40. package/dist/__tests__/tools-knowledge.test.d.ts +2 -0
  41. package/dist/__tests__/tools-knowledge.test.d.ts 2.map +1 -0
  42. package/dist/__tests__/tools-knowledge.test.d.ts.map +1 -0
  43. package/dist/__tests__/tools-knowledge.test.js +169 -0
  44. package/dist/__tests__/tools-knowledge.test.js.map +1 -0
  45. package/dist/__tests__/tools-plans.test.d 2.ts +2 -0
  46. package/dist/__tests__/tools-plans.test.d.ts +2 -0
  47. package/dist/__tests__/tools-plans.test.d.ts.map +1 -0
  48. package/dist/__tests__/tools-plans.test.js +307 -0
  49. package/dist/__tests__/tools-plans.test.js 2.map +1 -0
  50. package/dist/__tests__/tools-plans.test.js.map +1 -0
  51. package/dist/__tests__/tools-schedules.test.d.ts +2 -0
  52. package/dist/__tests__/tools-schedules.test.d.ts.map +1 -0
  53. package/dist/__tests__/tools-schedules.test.js +153 -0
  54. package/dist/__tests__/tools-schedules.test.js 2.map +1 -0
  55. package/dist/__tests__/tools-schedules.test.js.map +1 -0
  56. package/dist/__tests__/tools-skills.test.d 2.ts +2 -0
  57. package/dist/__tests__/tools-skills.test.d.ts +2 -0
  58. package/dist/__tests__/tools-skills.test.d.ts 2.map +1 -0
  59. package/dist/__tests__/tools-skills.test.d.ts.map +1 -0
  60. package/dist/__tests__/tools-skills.test.js +187 -0
  61. package/dist/__tests__/tools-skills.test.js 2.map +1 -0
  62. package/dist/__tests__/tools-skills.test.js.map +1 -0
  63. package/dist/__tests__/tools-tasks.test 2.js +83 -0
  64. package/dist/__tests__/tools-tasks.test.d 2.ts +2 -0
  65. package/dist/__tests__/tools-tasks.test.d.ts +2 -0
  66. package/dist/__tests__/tools-tasks.test.d.ts.map +1 -0
  67. package/dist/__tests__/tools-tasks.test.js +83 -0
  68. package/dist/__tests__/tools-tasks.test.js.map +1 -0
  69. package/dist/__tests__/tools-triggers.test.d 2.ts +2 -0
  70. package/dist/__tests__/tools-triggers.test.d.ts +2 -0
  71. package/dist/__tests__/tools-triggers.test.d.ts.map +1 -0
  72. package/dist/__tests__/tools-triggers.test.js +119 -0
  73. package/dist/__tests__/tools-triggers.test.js.map +1 -0
  74. package/dist/__tests__/tools-workflows.test.d.ts +2 -0
  75. package/dist/__tests__/tools-workflows.test.d.ts 2.map +1 -0
  76. package/dist/__tests__/tools-workflows.test.d.ts.map +1 -0
  77. package/dist/__tests__/tools-workflows.test.js +203 -0
  78. package/dist/__tests__/tools-workflows.test.js.map +1 -0
  79. package/dist/__tests__/tools.test.d.ts 2.map +1 -0
  80. package/dist/__tests__/tools.test.js +2 -2
  81. package/dist/__tests__/tools.test.js.map +1 -1
  82. package/dist/cli/commands/context-inject 2.js +112 -0
  83. package/dist/cli/commands/context-inject.d 2.ts +2 -0
  84. package/dist/cli/commands/context-inject.d.ts 2.map +1 -0
  85. package/dist/cli/commands/context-inject.js 2.map +1 -0
  86. package/dist/cli/commands/doc 2.js +144 -0
  87. package/dist/cli/commands/doc.d.ts 2.map +1 -0
  88. package/dist/cli/commands/doc.js 2.map +1 -0
  89. package/dist/cli/commands/git-hook 2.js +79 -0
  90. package/dist/cli/commands/git-hook.d 2.ts +2 -0
  91. package/dist/cli/commands/git-hook.d 3.ts +2 -0
  92. package/dist/cli/commands/git-hook.js 2.map +1 -0
  93. package/dist/cli/commands/guard 2.js +122 -0
  94. package/dist/cli/commands/guard.d.ts 2.map +1 -0
  95. package/dist/cli/commands/init 2.js +227 -0
  96. package/dist/cli/commands/init.d 2.ts +2 -0
  97. package/dist/cli/commands/init.d.ts 2.map +1 -0
  98. package/dist/cli/commands/init.js 2.map +1 -0
  99. package/dist/cli/commands/login 2.js +120 -0
  100. package/dist/cli/commands/login.d 2.ts +2 -0
  101. package/dist/cli/commands/login.d.ts 2.map +1 -0
  102. package/dist/cli/commands/login.d.ts 3.map +1 -0
  103. package/dist/cli/commands/login.js +1 -1
  104. package/dist/cli/commands/login.js.map +1 -1
  105. package/dist/cli/commands/logout 2.js +21 -0
  106. package/dist/cli/commands/logout.js 2.map +1 -0
  107. package/dist/cli/commands/logout.js 3.map +1 -0
  108. package/dist/cli/commands/release.d 2.ts +2 -0
  109. package/dist/cli/commands/release.d 3.ts +2 -0
  110. package/dist/cli/commands/release.d.ts 2.map +1 -0
  111. package/dist/cli/commands/release.js 2.map +1 -0
  112. package/dist/cli/commands/skill 2.js +185 -0
  113. package/dist/cli/commands/skill-inject 2.js +194 -0
  114. package/dist/cli/commands/skill-inject.d 2.ts +2 -0
  115. package/dist/cli/commands/skill-inject.d.ts 2.map +1 -0
  116. package/dist/cli/commands/skill-inject.d.ts.map +1 -1
  117. package/dist/cli/commands/skill-inject.js +23 -4
  118. package/dist/cli/commands/skill-inject.js 2.map +1 -0
  119. package/dist/cli/commands/skill-inject.js.map +1 -1
  120. package/dist/cli/commands/skill.d 2.ts +2 -0
  121. package/dist/cli/commands/status 2.js +45 -0
  122. package/dist/cli/commands/status.d.ts 2.map +1 -0
  123. package/dist/cli/commands/status.d.ts 3.map +1 -0
  124. package/dist/cli/commands/status.js 2.map +1 -0
  125. package/dist/cli/commands/switch 2.js +88 -0
  126. package/dist/cli/commands/switch 3.js +88 -0
  127. package/dist/cli/commands/switch.js 2.map +1 -0
  128. package/dist/cli/commands/whoami.d 2.ts +2 -0
  129. package/dist/cli/commands/whoami.d 3.ts +2 -0
  130. package/dist/cli/commands/whoami.d.ts 2.map +1 -0
  131. package/dist/cli/commands/whoami.js 2.map +1 -0
  132. package/dist/cli/commands/whoami.js 3.map +1 -0
  133. package/dist/cli/credentials.js +1 -1
  134. package/dist/cli/credentials.js 2.map +1 -0
  135. package/dist/cli/credentials.js.map +1 -1
  136. package/dist/cli/editor-config 2.js +109 -0
  137. package/dist/cli/editor-config.d 2.ts +9 -0
  138. package/dist/cli/editor-config.d.ts 2.map +1 -0
  139. package/dist/cli/editor-config.js 2.map +1 -0
  140. package/dist/cli/index 2.d 2.ts +2 -0
  141. package/dist/cli/index 2.d.ts +2 -0
  142. package/dist/cli/index 2.d.ts 2.map +1 -0
  143. package/dist/cli/index 2.d.ts.map +1 -0
  144. package/dist/cli/index 2.js +63 -0
  145. package/dist/cli/index 2.js 2.map +1 -0
  146. package/dist/cli/index 2.js.map +1 -0
  147. package/dist/cli/index 3.js +63 -0
  148. package/dist/cli/index 4.js +68 -0
  149. package/dist/cli/index.js 2.map +1 -0
  150. package/dist/config.js +1 -1
  151. package/dist/config.js.map +1 -1
  152. package/dist/index.js +2 -0
  153. package/dist/index.js.map +1 -1
  154. package/dist/tools/approvals.d.ts 2.map +1 -0
  155. package/dist/tools/blockers 2.js +24 -0
  156. package/dist/tools/blockers.d 2.ts +21 -0
  157. package/dist/tools/blockers.d.ts 2.map +1 -0
  158. package/dist/tools/handoffs.d.ts 2.map +1 -0
  159. package/dist/tools/knowledge.d.ts 2.map +1 -0
  160. package/dist/tools/knowledge.d.ts.map +1 -1
  161. package/dist/tools/knowledge.js +26 -3
  162. package/dist/tools/knowledge.js 2.map +1 -0
  163. package/dist/tools/knowledge.js 3.map +1 -0
  164. package/dist/tools/knowledge.js.map +1 -1
  165. package/dist/tools/lock.d 2.ts +24 -0
  166. package/dist/tools/lock.d.ts 2.map +1 -0
  167. package/dist/tools/lock.js 2.map +1 -0
  168. package/dist/tools/plans.d 2.ts +5 -0
  169. package/dist/tools/plans.d.ts +5 -0
  170. package/dist/tools/plans.d.ts.map +1 -0
  171. package/dist/tools/plans.js +359 -0
  172. package/dist/tools/plans.js.map +1 -0
  173. package/dist/tools/publish.d 2.ts +24 -0
  174. package/dist/tools/publish.d.ts 2.map +1 -0
  175. package/dist/tools/query 2.js +41 -0
  176. package/dist/tools/query.d 2.ts +27 -0
  177. package/dist/tools/query.js 2.map +1 -0
  178. package/dist/tools/remember.js 2.map +1 -0
  179. package/dist/tools/skills 2.js +273 -0
  180. package/dist/tools/skills.js 2.map +1 -0
  181. package/dist/tools/status.d.ts 2.map +1 -0
  182. package/dist/tools/status.js 2.map +1 -0
  183. package/dist/tools/subscribe.js 2.map +1 -0
  184. package/dist/tools/tasks 2.js +51 -0
  185. package/dist/tools/teams.d 2.ts +4 -0
  186. package/dist/tools/teams.js 2.map +1 -0
  187. package/dist/tools/triggers 2.js +212 -0
  188. package/dist/tools/triggers.d 2.ts +5 -0
  189. package/dist/tools/triggers.d.ts 2.map +1 -0
  190. package/dist/tools/triggers.d.ts 3.map +1 -0
  191. package/dist/tools/workflows.d.ts 2.map +1 -0
  192. package/package.json +11 -11
@@ -0,0 +1,120 @@
1
+ import { createServer } from "node:http";
2
+ import { execSync } from "node:child_process";
3
+ import { URL } from "node:url";
4
+ import { writeCredentials, readCredentials } from "../credentials.js";
5
+ import { configureMcpEditors } from "../editor-config.js";
6
+ const LOGIN_TIMEOUT_MS = 120_000;
7
+ const PROD_DASHBOARD_URL = "https://hivemindai.dev";
8
+ const LOCAL_DASHBOARD_URL = "http://localhost:3000";
9
+ async function detectDashboardUrl() {
10
+ if (process.env.HIVEMIND_DASHBOARD_URL) {
11
+ return process.env.HIVEMIND_DASHBOARD_URL;
12
+ }
13
+ // Check if local dashboard is running
14
+ try {
15
+ const controller = new AbortController();
16
+ const timeout = setTimeout(() => controller.abort(), 1000);
17
+ const res = await fetch(LOCAL_DASHBOARD_URL, { signal: controller.signal, method: "HEAD" });
18
+ clearTimeout(timeout);
19
+ if (res.ok || res.status === 307) {
20
+ console.log("Local dashboard detected at localhost:3000\n");
21
+ return LOCAL_DASHBOARD_URL;
22
+ }
23
+ }
24
+ catch {
25
+ // not running
26
+ }
27
+ return PROD_DASHBOARD_URL;
28
+ }
29
+ function openBrowser(url) {
30
+ const platform = process.platform;
31
+ try {
32
+ if (platform === "darwin") {
33
+ execSync(`open "${url}"`);
34
+ }
35
+ else if (platform === "win32") {
36
+ execSync(`start "" "${url}"`);
37
+ }
38
+ else {
39
+ execSync(`xdg-open "${url}"`);
40
+ }
41
+ }
42
+ catch {
43
+ console.log(`\nOpen this URL in your browser:\n ${url}\n`);
44
+ }
45
+ }
46
+ export async function login() {
47
+ const existing = readCredentials();
48
+ if (existing) {
49
+ console.log(`Already logged in as ${existing.email} (org: ${existing.org_name}).`);
50
+ console.log(`Run "hivemind logout" first to re-authenticate.`);
51
+ process.exit(0);
52
+ }
53
+ const dashboardUrl = await detectDashboardUrl();
54
+ const creds = await new Promise((resolve, reject) => {
55
+ const server = createServer((req, res) => {
56
+ if (!req.url?.startsWith("/callback")) {
57
+ res.writeHead(404);
58
+ res.end("Not found");
59
+ return;
60
+ }
61
+ const url = new URL(req.url, `http://localhost`);
62
+ const apiKey = url.searchParams.get("key");
63
+ // Support both new (org_id) and legacy (project_id) dashboard responses
64
+ const orgId = url.searchParams.get("org_id") || url.searchParams.get("project_id") || "";
65
+ const orgName = url.searchParams.get("org_name") || url.searchParams.get("project_name") || "";
66
+ const orgSlug = url.searchParams.get("org_slug") || "";
67
+ const email = url.searchParams.get("email") || "";
68
+ const apiUrl = url.searchParams.get("api_url");
69
+ if (!apiKey) {
70
+ res.writeHead(400, { "Content-Type": "text/html" });
71
+ res.end("<html><body><h2>Missing required parameters.</h2><p>Please try again.</p></body></html>");
72
+ return;
73
+ }
74
+ const credentials = {
75
+ api_key: apiKey,
76
+ api_url: apiUrl ?? "https://hivemind.convex.site",
77
+ org_id: orgId,
78
+ org_name: orgName,
79
+ org_slug: orgSlug,
80
+ email,
81
+ };
82
+ res.writeHead(200, { "Content-Type": "text/html" });
83
+ res.end(`<html><body>
84
+ <h2>Authenticated!</h2>
85
+ <p>You can close this tab and return to your terminal.</p>
86
+ </body></html>`);
87
+ server.close();
88
+ resolve(credentials);
89
+ });
90
+ server.listen(0, "127.0.0.1", () => {
91
+ const addr = server.address();
92
+ if (!addr || typeof addr === "string") {
93
+ reject(new Error("Failed to start local server"));
94
+ return;
95
+ }
96
+ const port = addr.port;
97
+ const callbackUrl = encodeURIComponent(`http://localhost:${port}/callback`);
98
+ const authUrl = `${dashboardUrl}/cli-auth?port=${port}&callback_url=${callbackUrl}`;
99
+ console.log("Opening browser to sign in...\n");
100
+ openBrowser(authUrl);
101
+ });
102
+ setTimeout(() => {
103
+ server.close();
104
+ reject(new Error("Login timed out. Please try again."));
105
+ }, LOGIN_TIMEOUT_MS);
106
+ });
107
+ writeCredentials(creds);
108
+ const editors = configureMcpEditors();
109
+ console.log(`Authenticated as ${creds.email}`);
110
+ console.log(`Org: ${creds.org_name} (${creds.org_id})`);
111
+ console.log(`API key stored in ~/.hivemind/credentials.json`);
112
+ if (editors.claudeCode) {
113
+ console.log(`Claude Code MCP config updated`);
114
+ }
115
+ if (editors.cursor) {
116
+ console.log(`Cursor MCP config updated`);
117
+ }
118
+ console.log(`\nRestart Claude Code to start using Hivemind.`);
119
+ }
120
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1,2 @@
1
+ export declare function login(): Promise<void>;
2
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AA6CA,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAwF3C"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AA6CA,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAwF3C"}
@@ -73,7 +73,7 @@ export async function login() {
73
73
  }
74
74
  const credentials = {
75
75
  api_key: apiKey,
76
- api_url: apiUrl ?? "https://hivemind.convex.site",
76
+ api_url: apiUrl ?? "https://jovial-tern-168.convex.site",
77
77
  org_id: orgId,
78
78
  org_name: orgName,
79
79
  org_slug: orgSlug,
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { deleteCredentials } from "../credentials.js";
2
+ import { removeMcpEditorConfigs } from "../editor-config.js";
3
+ export async function logout() {
4
+ const deleted = deleteCredentials();
5
+ const editors = removeMcpEditorConfigs();
6
+ if (!deleted && !editors.claudeCode && !editors.cursor) {
7
+ console.log("Already logged out.");
8
+ return;
9
+ }
10
+ if (deleted) {
11
+ console.log("✓ Credentials removed");
12
+ }
13
+ if (editors.claudeCode) {
14
+ console.log("✓ Claude Code MCP config removed");
15
+ }
16
+ if (editors.cursor) {
17
+ console.log("✓ Cursor MCP config removed");
18
+ }
19
+ console.log("\nLogged out successfully.");
20
+ }
21
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/cli/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,sBAAsB,EAAE,CAAC;IAEzC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/cli/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,sBAAsB,EAAE,CAAC;IAEzC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function release(): Promise<void>;
2
+ //# sourceMappingURL=release.d.ts.map
@@ -0,0 +1,2 @@
1
+ export declare function release(): Promise<void>;
2
+ //# sourceMappingURL=release.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/release.ts"],"names":[],"mappings":"AAgCA,wBAAsB,OAAO,kBA0C5B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release.js","sourceRoot":"","sources":["../../../src/cli/commands/release.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAYjC,SAAS,eAAe;IACtB,MAAM,QAAQ,GAAG,IAAI,CACnB,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,EAClD,WAAW,EACX,kBAAkB,CACnB,CAAC;IACF,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAgB;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AACpH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,IAAI,KAAgB,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACrC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC;IAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAElC,qBAAqB;IACrB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACvC,IAAI,QAAQ,GAAG,QAAQ,CAAC;IACxB,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,mBAAmB;IACnB,IAAI,CAAC;QACH,MAAM,KAAK,CACT,GAAG,KAAK,CAAC,OAAO,aAAa,kBAAkB,CAAC,QAAQ,CAAC,UAAU,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAC9F;YACE,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE,EAAE;SACtD,CACF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,185 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { HivemindClient } from "@hivemindai/sdk-ts";
3
+ import { readCredentials } from "../credentials.js";
4
+ export async function skill(args) {
5
+ const creds = readCredentials();
6
+ if (!creds) {
7
+ console.log("Not logged in. Run `hivemind login` to authenticate.");
8
+ process.exit(1);
9
+ }
10
+ const client = new HivemindClient({
11
+ apiKey: creds.api_key,
12
+ baseUrl: creds.api_url,
13
+ });
14
+ const subcommand = args[0];
15
+ if (!subcommand || subcommand === "--help") {
16
+ console.log(`
17
+ Usage: hivemind skill <subcommand>
18
+
19
+ Subcommands:
20
+ add --name <name> --description <desc> --instructions <text> | --file <path>
21
+ [--tags t1,t2] [--trigger-files "*.tsx,*.ts"] [--trigger-tools "Edit,Write"]
22
+ [--trigger-keywords "test,deploy"]
23
+ list List all skills
24
+ search <query> Semantic search
25
+ get <id> Get skill details
26
+ update <id> Update skill fields
27
+ delete <id> Delete skill
28
+ `.trim());
29
+ return;
30
+ }
31
+ try {
32
+ if (subcommand === "add") {
33
+ const name = getFlag(args, "--name");
34
+ if (!name) {
35
+ console.error("Usage: hivemind skill add --name <name> --description <desc> --instructions <text>");
36
+ process.exit(1);
37
+ }
38
+ const description = getFlag(args, "--description");
39
+ if (!description) {
40
+ console.error("--description is required");
41
+ process.exit(1);
42
+ }
43
+ let instructions = getFlag(args, "--instructions");
44
+ const filePath = getFlag(args, "--file");
45
+ if (filePath) {
46
+ instructions = readFileSync(filePath, "utf-8");
47
+ }
48
+ if (!instructions) {
49
+ console.error("Provide instructions via --instructions or --file");
50
+ process.exit(1);
51
+ }
52
+ const tags = getFlag(args, "--tags")?.split(",").map((t) => t.trim());
53
+ const triggers = {};
54
+ const triggerFiles = getFlag(args, "--trigger-files");
55
+ if (triggerFiles)
56
+ triggers.file_patterns = triggerFiles.split(",").map((t) => t.trim());
57
+ const triggerTools = getFlag(args, "--trigger-tools");
58
+ if (triggerTools)
59
+ triggers.tools = triggerTools.split(",").map((t) => t.trim());
60
+ const triggerKeywords = getFlag(args, "--trigger-keywords");
61
+ if (triggerKeywords)
62
+ triggers.keywords = triggerKeywords.split(",").map((t) => t.trim());
63
+ const result = await client.addSkill({
64
+ name,
65
+ description,
66
+ instructions,
67
+ tags,
68
+ triggers: Object.keys(triggers).length > 0 ? triggers : undefined,
69
+ });
70
+ console.log(`Skill created: ${result.id}`);
71
+ return;
72
+ }
73
+ if (subcommand === "list") {
74
+ const result = await client.listSkills();
75
+ if (result.skills.length === 0) {
76
+ console.log("No skills found.");
77
+ return;
78
+ }
79
+ console.log(`Skills (${result.total})\n`);
80
+ for (const s of result.skills) {
81
+ const tags = s.tags?.length ? ` [${s.tags.join(", ")}]` : "";
82
+ console.log(` ${s.id} ${s.name}${tags} — ${s.description}`);
83
+ }
84
+ if (result.has_more) {
85
+ console.log("\n (more skills available)");
86
+ }
87
+ return;
88
+ }
89
+ if (subcommand === "search") {
90
+ const query = args[1];
91
+ if (!query) {
92
+ console.error("Usage: hivemind skill search <query>");
93
+ process.exit(1);
94
+ }
95
+ const result = await client.searchSkills(query);
96
+ if (result.skills.length === 0) {
97
+ console.log("No matching skills found.");
98
+ return;
99
+ }
100
+ console.log(`Search Results (${result.total})\n`);
101
+ for (const s of result.skills) {
102
+ const score = s._score !== undefined ? ` (${(s._score * 100).toFixed(0)}%)` : "";
103
+ console.log(` ${s.id} ${s.name}${score} — ${s.description}`);
104
+ }
105
+ return;
106
+ }
107
+ if (subcommand === "get") {
108
+ const skillId = args[1];
109
+ if (!skillId) {
110
+ console.error("Usage: hivemind skill get <skill_id>");
111
+ process.exit(1);
112
+ }
113
+ const result = await client.getSkill(skillId);
114
+ const s = result.skill;
115
+ const tags = s.tags?.length ? `\nTags: ${s.tags.join(", ")}` : "";
116
+ const triggers = s.triggers && Object.keys(s.triggers).length > 0
117
+ ? `\nTriggers: ${JSON.stringify(s.triggers)}`
118
+ : "";
119
+ console.log(`${s.name}\nID: ${s.id}\nDescription: ${s.description}${tags}${triggers}\nUpdated: ${s.updated_at}\n\n${s.instructions}`);
120
+ return;
121
+ }
122
+ if (subcommand === "update") {
123
+ const skillId = args[1];
124
+ if (!skillId) {
125
+ console.error("Usage: hivemind skill update <skill_id> [--name ...] [--description ...] [--instructions ...] [--file ...]");
126
+ process.exit(1);
127
+ }
128
+ const updateParams = {};
129
+ const name = getFlag(args, "--name");
130
+ if (name)
131
+ updateParams.name = name;
132
+ const description = getFlag(args, "--description");
133
+ if (description)
134
+ updateParams.description = description;
135
+ let instructions = getFlag(args, "--instructions");
136
+ const filePath = getFlag(args, "--file");
137
+ if (filePath)
138
+ instructions = readFileSync(filePath, "utf-8");
139
+ if (instructions)
140
+ updateParams.instructions = instructions;
141
+ const tagsStr = getFlag(args, "--tags");
142
+ if (tagsStr)
143
+ updateParams.tags = tagsStr.split(",").map((t) => t.trim());
144
+ const triggers = {};
145
+ const triggerFiles = getFlag(args, "--trigger-files");
146
+ if (triggerFiles)
147
+ triggers.file_patterns = triggerFiles.split(",").map((t) => t.trim());
148
+ const triggerTools = getFlag(args, "--trigger-tools");
149
+ if (triggerTools)
150
+ triggers.tools = triggerTools.split(",").map((t) => t.trim());
151
+ const triggerKeywords = getFlag(args, "--trigger-keywords");
152
+ if (triggerKeywords)
153
+ triggers.keywords = triggerKeywords.split(",").map((t) => t.trim());
154
+ if (Object.keys(triggers).length > 0)
155
+ updateParams.triggers = triggers;
156
+ const result = await client.updateSkill(skillId, updateParams);
157
+ console.log(result.updated ? `Skill ${skillId} updated.` : `Skill ${skillId} not found.`);
158
+ return;
159
+ }
160
+ if (subcommand === "delete") {
161
+ const skillId = args[1];
162
+ if (!skillId) {
163
+ console.error("Usage: hivemind skill delete <skill_id>");
164
+ process.exit(1);
165
+ }
166
+ const result = await client.deleteSkill(skillId);
167
+ console.log(result.deleted ? `Skill ${skillId} deleted.` : `Skill ${skillId} not found.`);
168
+ return;
169
+ }
170
+ console.error(`Unknown subcommand: ${subcommand}`);
171
+ console.error('Run "hivemind skill --help" for usage.');
172
+ process.exit(1);
173
+ }
174
+ catch (err) {
175
+ console.error(`Failed: ${err instanceof Error ? err.message : String(err)}`);
176
+ process.exit(1);
177
+ }
178
+ }
179
+ function getFlag(args, flag) {
180
+ const idx = args.indexOf(flag);
181
+ if (idx === -1 || idx + 1 >= args.length)
182
+ return undefined;
183
+ return args[idx + 1];
184
+ }
185
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1,194 @@
1
+ import { readFileSync, existsSync, writeFileSync, mkdirSync, readdirSync, unlinkSync, statSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ function loadCredentials() {
4
+ const credPath = join(process.env.HOME ?? process.env.USERPROFILE ?? ".", ".hivemind", "credentials.json");
5
+ if (!existsSync(credPath))
6
+ return null;
7
+ try {
8
+ const creds = JSON.parse(readFileSync(credPath, "utf-8"));
9
+ return { api_key: creds.api_key, api_url: creds.api_url };
10
+ }
11
+ catch {
12
+ return null;
13
+ }
14
+ }
15
+ function getSessionsDir() {
16
+ const home = process.env.HOME ?? process.env.USERPROFILE ?? ".";
17
+ return join(home, ".hivemind", "sessions");
18
+ }
19
+ function isFirstCall(sessionId) {
20
+ const sessionsDir = getSessionsDir();
21
+ const flagFile = join(sessionsDir, `${sessionId}.first`);
22
+ if (existsSync(flagFile))
23
+ return false;
24
+ try {
25
+ mkdirSync(sessionsDir, { recursive: true });
26
+ writeFileSync(flagFile, new Date().toISOString());
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ // Cleanup old flag files (>24h) — non-blocking best-effort
32
+ try {
33
+ const cutoff = Date.now() - 24 * 60 * 60 * 1000;
34
+ for (const f of readdirSync(sessionsDir)) {
35
+ if (!f.endsWith(".first"))
36
+ continue;
37
+ const fullPath = join(sessionsDir, f);
38
+ try {
39
+ const stat = statSync(fullPath);
40
+ if (stat.mtimeMs < cutoff)
41
+ unlinkSync(fullPath);
42
+ }
43
+ catch { /* ignore */ }
44
+ }
45
+ }
46
+ catch { /* ignore */ }
47
+ return true;
48
+ }
49
+ async function injectSessionContext(creds, headers) {
50
+ const output = [];
51
+ // Fetch onboarding context, raw context, patterns, and stale docs in parallel
52
+ const [onboardingRes, contextRes, patternsRes, staleRes] = await Promise.all([
53
+ fetch(`${creds.api_url}/v1/intelligence/onboarding`, { headers }).catch(() => null),
54
+ fetch(`${creds.api_url}/v1/intelligence/context`, { headers }).catch(() => null),
55
+ fetch(`${creds.api_url}/v1/intelligence/patterns?limit=5`, { headers }).catch(() => null),
56
+ fetch(`${creds.api_url}/v1/knowledge/stale`, { headers }).catch(() => null),
57
+ ]);
58
+ // If onboarding context exists, use it as the primary context
59
+ let usedOnboarding = false;
60
+ if (onboardingRes?.ok) {
61
+ const data = await onboardingRes.json();
62
+ if (data.content) {
63
+ output.push(data.content);
64
+ usedOnboarding = true;
65
+ }
66
+ }
67
+ // Fall back to raw context if no onboarding brief
68
+ if (!usedOnboarding && contextRes?.ok) {
69
+ const ctx = await contextRes.json();
70
+ if (ctx.active_tasks?.length > 0) {
71
+ output.push(`Active Tasks (${ctx.active_tasks.length}):`);
72
+ for (const t of ctx.active_tasks.slice(0, 5)) {
73
+ output.push(` - [${t.channel}] ${t.description ?? t.id} (by ${t.source?.agent ?? "unknown"})`);
74
+ }
75
+ }
76
+ if (ctx.blockers?.length > 0) {
77
+ output.push(`Blockers (${ctx.blockers.length}):`);
78
+ for (const b of ctx.blockers) {
79
+ output.push(` - [${b.channel}] ${b.description ?? b.id}`);
80
+ }
81
+ }
82
+ if (ctx.recent_decisions?.length > 0) {
83
+ output.push(`Recent Decisions:`);
84
+ for (const d of ctx.recent_decisions.slice(0, 3)) {
85
+ output.push(` - [${d.channel}] ${d.description ?? JSON.stringify(d.data)}`);
86
+ }
87
+ }
88
+ if (ctx.active_locks?.length > 0) {
89
+ output.push(`Active Locks:`);
90
+ for (const l of ctx.active_locks) {
91
+ output.push(` - ${l.resource} (held by ${l.agent})`);
92
+ }
93
+ }
94
+ }
95
+ if (!usedOnboarding && patternsRes?.ok) {
96
+ const data = await patternsRes.json();
97
+ if (data.patterns?.length > 0) {
98
+ output.push(`Learned Patterns:`);
99
+ for (const p of data.patterns) {
100
+ output.push(` - [${p.pattern_type}] ${p.description} (seen ${p.frequency}x)`);
101
+ }
102
+ }
103
+ }
104
+ // Add stale knowledge warning
105
+ if (staleRes?.ok) {
106
+ const data = await staleRes.json();
107
+ if (data.docs?.length > 0) {
108
+ output.push(`\nWarning: ${data.docs.length} knowledge doc${data.docs.length > 1 ? "s" : ""} may be outdated — run \`hivemind_knowledge(action: 'list-stale')\` to review.`);
109
+ }
110
+ }
111
+ if (output.length > 0) {
112
+ process.stderr.write(`=== Hivemind Session Context ===\n${output.join("\n")}\n===\n\n`);
113
+ }
114
+ }
115
+ export async function skillInject() {
116
+ // 1. Read hook input from stdin
117
+ let input;
118
+ try {
119
+ const raw = readFileSync(0, "utf-8");
120
+ input = JSON.parse(raw);
121
+ }
122
+ catch {
123
+ process.exit(0);
124
+ }
125
+ // 2. Load credentials (cloud only)
126
+ const creds = loadCredentials();
127
+ if (!creds)
128
+ process.exit(0);
129
+ const headers = { Authorization: `Bearer ${creds.api_key}` };
130
+ // 3. First-call session context injection
131
+ const sessionId = input.session_id ?? `pid-${process.ppid}`;
132
+ if (isFirstCall(sessionId)) {
133
+ try {
134
+ await injectSessionContext(creds, headers);
135
+ }
136
+ catch {
137
+ // Don't block on errors
138
+ }
139
+ }
140
+ // 4. Extract context
141
+ const filePath = input.tool_input?.file_path;
142
+ const command = input.tool_input?.command;
143
+ const toolName = input.tool_name;
144
+ // 5. Make relative path
145
+ const cwd = input.cwd ?? process.cwd();
146
+ let resource = filePath ?? "";
147
+ if (resource.startsWith(cwd)) {
148
+ resource = resource.slice(cwd.length).replace(/^\//, "");
149
+ }
150
+ // 6. Call match endpoint + decision replay in parallel
151
+ const params = new URLSearchParams();
152
+ if (toolName)
153
+ params.set("tool", toolName);
154
+ if (resource)
155
+ params.set("file", resource);
156
+ if (command)
157
+ params.set("command", command);
158
+ const fetches = [];
159
+ // Skill match
160
+ fetches.push((async () => {
161
+ try {
162
+ const res = await fetch(`${creds.api_url}/v1/skills/match?${params}`, { headers });
163
+ if (!res.ok)
164
+ return;
165
+ const data = await res.json();
166
+ if (data.skills?.length > 0) {
167
+ const output = data.skills
168
+ .map((s) => `--- Skill: ${s.name} ---\n${s.instructions}\n---`)
169
+ .join("\n\n");
170
+ process.stderr.write(output);
171
+ }
172
+ }
173
+ catch { /* ignore */ }
174
+ })());
175
+ // Decision replay by file context (Part 5)
176
+ if (resource) {
177
+ fetches.push((async () => {
178
+ try {
179
+ const res = await fetch(`${creds.api_url}/v1/intelligence/context?file=${encodeURIComponent(resource)}`, { headers });
180
+ if (!res.ok)
181
+ return;
182
+ const ctx = await res.json();
183
+ if (ctx.recent_decisions?.length > 0) {
184
+ const lines = ctx.recent_decisions.map((d) => ` - ${d.description ?? JSON.stringify(d.data)} (${d.created_at})`);
185
+ process.stderr.write(`\n--- Decisions affecting ${resource} ---\n${lines.join("\n")}\n---\n`);
186
+ }
187
+ }
188
+ catch { /* ignore */ }
189
+ })());
190
+ }
191
+ await Promise.all(fetches);
192
+ process.exit(0); // Always allow — skills never block
193
+ }
194
+ //# sourceMappingURL=skill-inject.js.map
@@ -0,0 +1,2 @@
1
+ export declare function skillInject(): Promise<void>;
2
+ //# sourceMappingURL=skill-inject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-inject.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/skill-inject.ts"],"names":[],"mappings":"AA+IA,wBAAsB,WAAW,kBA+FhC"}
@@ -1 +1 @@
1
- {"version":3,"file":"skill-inject.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/skill-inject.ts"],"names":[],"mappings":"AA0HA,wBAAsB,WAAW,kBA+FhC"}
1
+ {"version":3,"file":"skill-inject.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/skill-inject.ts"],"names":[],"mappings":"AA+IA,wBAAsB,WAAW,kBA+FhC"}
@@ -48,12 +48,24 @@ function isFirstCall(sessionId) {
48
48
  }
49
49
  async function injectSessionContext(creds, headers) {
50
50
  const output = [];
51
- // Fetch context and patterns in parallel
52
- const [contextRes, patternsRes] = await Promise.all([
51
+ // Fetch onboarding context, raw context, patterns, and stale docs in parallel
52
+ const [onboardingRes, contextRes, patternsRes, staleRes] = await Promise.all([
53
+ fetch(`${creds.api_url}/v1/intelligence/onboarding`, { headers }).catch(() => null),
53
54
  fetch(`${creds.api_url}/v1/intelligence/context`, { headers }).catch(() => null),
54
55
  fetch(`${creds.api_url}/v1/intelligence/patterns?limit=5`, { headers }).catch(() => null),
56
+ fetch(`${creds.api_url}/v1/knowledge/stale`, { headers }).catch(() => null),
55
57
  ]);
56
- if (contextRes?.ok) {
58
+ // If onboarding context exists, use it as the primary context
59
+ let usedOnboarding = false;
60
+ if (onboardingRes?.ok) {
61
+ const data = await onboardingRes.json();
62
+ if (data.content) {
63
+ output.push(data.content);
64
+ usedOnboarding = true;
65
+ }
66
+ }
67
+ // Fall back to raw context if no onboarding brief
68
+ if (!usedOnboarding && contextRes?.ok) {
57
69
  const ctx = await contextRes.json();
58
70
  if (ctx.active_tasks?.length > 0) {
59
71
  output.push(`Active Tasks (${ctx.active_tasks.length}):`);
@@ -80,7 +92,7 @@ async function injectSessionContext(creds, headers) {
80
92
  }
81
93
  }
82
94
  }
83
- if (patternsRes?.ok) {
95
+ if (!usedOnboarding && patternsRes?.ok) {
84
96
  const data = await patternsRes.json();
85
97
  if (data.patterns?.length > 0) {
86
98
  output.push(`Learned Patterns:`);
@@ -89,6 +101,13 @@ async function injectSessionContext(creds, headers) {
89
101
  }
90
102
  }
91
103
  }
104
+ // Add stale knowledge warning
105
+ if (staleRes?.ok) {
106
+ const data = await staleRes.json();
107
+ if (data.docs?.length > 0) {
108
+ output.push(`\nWarning: ${data.docs.length} knowledge doc${data.docs.length > 1 ? "s" : ""} may be outdated — run \`hivemind_knowledge(action: 'list-stale')\` to review.`);
109
+ }
110
+ }
92
111
  if (output.length > 0) {
93
112
  process.stderr.write(`=== Hivemind Session Context ===\n${output.join("\n")}\n===\n\n`);
94
113
  }