@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.
- package/dist/__tests__/config.test.js +1 -1
- package/dist/__tests__/config.test.js 2.map +1 -0
- package/dist/__tests__/config.test.js.map +1 -1
- package/dist/__tests__/credentials.test 2.js +126 -0
- package/dist/__tests__/credentials.test.d.ts 2.map +1 -0
- package/dist/__tests__/credentials.test.js +5 -5
- package/dist/__tests__/credentials.test.js.map +1 -1
- package/dist/__tests__/editor-config.test.d 2.ts +2 -0
- package/dist/__tests__/editor-config.test.js 2.map +1 -0
- package/dist/__tests__/format.test.d.ts 2.map +1 -0
- package/dist/__tests__/format.test.js 2.map +1 -0
- package/dist/__tests__/helpers/mock-server 2.js +107 -0
- package/dist/__tests__/helpers/mock-server.d 2.ts +79 -0
- package/dist/__tests__/helpers/mock-server.d.ts +79 -0
- package/dist/__tests__/helpers/mock-server.d.ts 2.map +1 -0
- package/dist/__tests__/helpers/mock-server.d.ts.map +1 -0
- package/dist/__tests__/helpers/mock-server.js +107 -0
- package/dist/__tests__/helpers/mock-server.js 2.map +1 -0
- package/dist/__tests__/helpers/mock-server.js.map +1 -0
- package/dist/__tests__/remember.test 2.js +152 -0
- package/dist/__tests__/remember.test.d.ts +2 -0
- package/dist/__tests__/remember.test.d.ts.map +1 -0
- package/dist/__tests__/remember.test.js +152 -0
- package/dist/__tests__/remember.test.js.map +1 -0
- package/dist/__tests__/tools-approvals.test.d.ts +2 -0
- package/dist/__tests__/tools-approvals.test.d.ts.map +1 -0
- package/dist/__tests__/tools-approvals.test.js +219 -0
- package/dist/__tests__/tools-approvals.test.js.map +1 -0
- package/dist/__tests__/tools-context.test 2.js +107 -0
- package/dist/__tests__/tools-context.test.d.ts +2 -0
- package/dist/__tests__/tools-context.test.d.ts.map +1 -0
- package/dist/__tests__/tools-context.test.js +107 -0
- package/dist/__tests__/tools-context.test.js 2.map +1 -0
- package/dist/__tests__/tools-context.test.js.map +1 -0
- package/dist/__tests__/tools-handoffs.test.d.ts +2 -0
- package/dist/__tests__/tools-handoffs.test.d.ts.map +1 -0
- package/dist/__tests__/tools-handoffs.test.js +153 -0
- package/dist/__tests__/tools-handoffs.test.js.map +1 -0
- package/dist/__tests__/tools-knowledge.test.d 2.ts +2 -0
- package/dist/__tests__/tools-knowledge.test.d.ts +2 -0
- package/dist/__tests__/tools-knowledge.test.d.ts 2.map +1 -0
- package/dist/__tests__/tools-knowledge.test.d.ts.map +1 -0
- package/dist/__tests__/tools-knowledge.test.js +169 -0
- package/dist/__tests__/tools-knowledge.test.js.map +1 -0
- package/dist/__tests__/tools-plans.test.d 2.ts +2 -0
- package/dist/__tests__/tools-plans.test.d.ts +2 -0
- package/dist/__tests__/tools-plans.test.d.ts.map +1 -0
- package/dist/__tests__/tools-plans.test.js +307 -0
- package/dist/__tests__/tools-plans.test.js 2.map +1 -0
- package/dist/__tests__/tools-plans.test.js.map +1 -0
- package/dist/__tests__/tools-schedules.test.d.ts +2 -0
- package/dist/__tests__/tools-schedules.test.d.ts.map +1 -0
- package/dist/__tests__/tools-schedules.test.js +153 -0
- package/dist/__tests__/tools-schedules.test.js 2.map +1 -0
- package/dist/__tests__/tools-schedules.test.js.map +1 -0
- package/dist/__tests__/tools-skills.test.d 2.ts +2 -0
- package/dist/__tests__/tools-skills.test.d.ts +2 -0
- package/dist/__tests__/tools-skills.test.d.ts 2.map +1 -0
- package/dist/__tests__/tools-skills.test.d.ts.map +1 -0
- package/dist/__tests__/tools-skills.test.js +187 -0
- package/dist/__tests__/tools-skills.test.js 2.map +1 -0
- package/dist/__tests__/tools-skills.test.js.map +1 -0
- package/dist/__tests__/tools-tasks.test 2.js +83 -0
- package/dist/__tests__/tools-tasks.test.d 2.ts +2 -0
- package/dist/__tests__/tools-tasks.test.d.ts +2 -0
- package/dist/__tests__/tools-tasks.test.d.ts.map +1 -0
- package/dist/__tests__/tools-tasks.test.js +83 -0
- package/dist/__tests__/tools-tasks.test.js.map +1 -0
- package/dist/__tests__/tools-triggers.test.d 2.ts +2 -0
- package/dist/__tests__/tools-triggers.test.d.ts +2 -0
- package/dist/__tests__/tools-triggers.test.d.ts.map +1 -0
- package/dist/__tests__/tools-triggers.test.js +119 -0
- package/dist/__tests__/tools-triggers.test.js.map +1 -0
- package/dist/__tests__/tools-workflows.test.d.ts +2 -0
- package/dist/__tests__/tools-workflows.test.d.ts 2.map +1 -0
- package/dist/__tests__/tools-workflows.test.d.ts.map +1 -0
- package/dist/__tests__/tools-workflows.test.js +203 -0
- package/dist/__tests__/tools-workflows.test.js.map +1 -0
- package/dist/__tests__/tools.test.d.ts 2.map +1 -0
- package/dist/__tests__/tools.test.js +2 -2
- package/dist/__tests__/tools.test.js.map +1 -1
- package/dist/cli/commands/context-inject 2.js +112 -0
- package/dist/cli/commands/context-inject.d 2.ts +2 -0
- package/dist/cli/commands/context-inject.d.ts 2.map +1 -0
- package/dist/cli/commands/context-inject.js 2.map +1 -0
- package/dist/cli/commands/doc 2.js +144 -0
- package/dist/cli/commands/doc.d.ts 2.map +1 -0
- package/dist/cli/commands/doc.js 2.map +1 -0
- package/dist/cli/commands/git-hook 2.js +79 -0
- package/dist/cli/commands/git-hook.d 2.ts +2 -0
- package/dist/cli/commands/git-hook.d 3.ts +2 -0
- package/dist/cli/commands/git-hook.js 2.map +1 -0
- package/dist/cli/commands/guard 2.js +122 -0
- package/dist/cli/commands/guard.d.ts 2.map +1 -0
- package/dist/cli/commands/init 2.js +227 -0
- package/dist/cli/commands/init.d 2.ts +2 -0
- package/dist/cli/commands/init.d.ts 2.map +1 -0
- package/dist/cli/commands/init.js 2.map +1 -0
- package/dist/cli/commands/login 2.js +120 -0
- package/dist/cli/commands/login.d 2.ts +2 -0
- package/dist/cli/commands/login.d.ts 2.map +1 -0
- package/dist/cli/commands/login.d.ts 3.map +1 -0
- package/dist/cli/commands/login.js +1 -1
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/logout 2.js +21 -0
- package/dist/cli/commands/logout.js 2.map +1 -0
- package/dist/cli/commands/logout.js 3.map +1 -0
- package/dist/cli/commands/release.d 2.ts +2 -0
- package/dist/cli/commands/release.d 3.ts +2 -0
- package/dist/cli/commands/release.d.ts 2.map +1 -0
- package/dist/cli/commands/release.js 2.map +1 -0
- package/dist/cli/commands/skill 2.js +185 -0
- package/dist/cli/commands/skill-inject 2.js +194 -0
- package/dist/cli/commands/skill-inject.d 2.ts +2 -0
- package/dist/cli/commands/skill-inject.d.ts 2.map +1 -0
- package/dist/cli/commands/skill-inject.d.ts.map +1 -1
- package/dist/cli/commands/skill-inject.js +23 -4
- package/dist/cli/commands/skill-inject.js 2.map +1 -0
- package/dist/cli/commands/skill-inject.js.map +1 -1
- package/dist/cli/commands/skill.d 2.ts +2 -0
- package/dist/cli/commands/status 2.js +45 -0
- package/dist/cli/commands/status.d.ts 2.map +1 -0
- package/dist/cli/commands/status.d.ts 3.map +1 -0
- package/dist/cli/commands/status.js 2.map +1 -0
- package/dist/cli/commands/switch 2.js +88 -0
- package/dist/cli/commands/switch 3.js +88 -0
- package/dist/cli/commands/switch.js 2.map +1 -0
- package/dist/cli/commands/whoami.d 2.ts +2 -0
- package/dist/cli/commands/whoami.d 3.ts +2 -0
- package/dist/cli/commands/whoami.d.ts 2.map +1 -0
- package/dist/cli/commands/whoami.js 2.map +1 -0
- package/dist/cli/commands/whoami.js 3.map +1 -0
- package/dist/cli/credentials.js +1 -1
- package/dist/cli/credentials.js 2.map +1 -0
- package/dist/cli/credentials.js.map +1 -1
- package/dist/cli/editor-config 2.js +109 -0
- package/dist/cli/editor-config.d 2.ts +9 -0
- package/dist/cli/editor-config.d.ts 2.map +1 -0
- package/dist/cli/editor-config.js 2.map +1 -0
- package/dist/cli/index 2.d 2.ts +2 -0
- package/dist/cli/index 2.d.ts +2 -0
- package/dist/cli/index 2.d.ts 2.map +1 -0
- package/dist/cli/index 2.d.ts.map +1 -0
- package/dist/cli/index 2.js +63 -0
- package/dist/cli/index 2.js 2.map +1 -0
- package/dist/cli/index 2.js.map +1 -0
- package/dist/cli/index 3.js +63 -0
- package/dist/cli/index 4.js +68 -0
- package/dist/cli/index.js 2.map +1 -0
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/tools/approvals.d.ts 2.map +1 -0
- package/dist/tools/blockers 2.js +24 -0
- package/dist/tools/blockers.d 2.ts +21 -0
- package/dist/tools/blockers.d.ts 2.map +1 -0
- package/dist/tools/handoffs.d.ts 2.map +1 -0
- package/dist/tools/knowledge.d.ts 2.map +1 -0
- package/dist/tools/knowledge.d.ts.map +1 -1
- package/dist/tools/knowledge.js +26 -3
- package/dist/tools/knowledge.js 2.map +1 -0
- package/dist/tools/knowledge.js 3.map +1 -0
- package/dist/tools/knowledge.js.map +1 -1
- package/dist/tools/lock.d 2.ts +24 -0
- package/dist/tools/lock.d.ts 2.map +1 -0
- package/dist/tools/lock.js 2.map +1 -0
- package/dist/tools/plans.d 2.ts +5 -0
- package/dist/tools/plans.d.ts +5 -0
- package/dist/tools/plans.d.ts.map +1 -0
- package/dist/tools/plans.js +359 -0
- package/dist/tools/plans.js.map +1 -0
- package/dist/tools/publish.d 2.ts +24 -0
- package/dist/tools/publish.d.ts 2.map +1 -0
- package/dist/tools/query 2.js +41 -0
- package/dist/tools/query.d 2.ts +27 -0
- package/dist/tools/query.js 2.map +1 -0
- package/dist/tools/remember.js 2.map +1 -0
- package/dist/tools/skills 2.js +273 -0
- package/dist/tools/skills.js 2.map +1 -0
- package/dist/tools/status.d.ts 2.map +1 -0
- package/dist/tools/status.js 2.map +1 -0
- package/dist/tools/subscribe.js 2.map +1 -0
- package/dist/tools/tasks 2.js +51 -0
- package/dist/tools/teams.d 2.ts +4 -0
- package/dist/tools/teams.js 2.map +1 -0
- package/dist/tools/triggers 2.js +212 -0
- package/dist/tools/triggers.d 2.ts +5 -0
- package/dist/tools/triggers.d.ts 2.map +1 -0
- package/dist/tools/triggers.d.ts 3.map +1 -0
- package/dist/tools/workflows.d.ts 2.map +1 -0
- 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 @@
|
|
|
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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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":"
|
|
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
|
|
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
|
-
|
|
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
|
}
|