@hivemindai/mcp-server 0.1.0 → 0.1.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/bin/hivemind.js +2 -0
- package/dist/__tests__/config.test.js +51 -7
- package/dist/__tests__/config.test.js.map +1 -1
- package/dist/__tests__/credentials.test.d.ts +2 -0
- package/dist/__tests__/credentials.test.d.ts.map +1 -0
- package/dist/__tests__/credentials.test.js +117 -0
- package/dist/__tests__/credentials.test.js.map +1 -0
- package/dist/__tests__/editor-config.test.d.ts +2 -0
- package/dist/__tests__/editor-config.test.d.ts.map +1 -0
- package/dist/__tests__/editor-config.test.js +109 -0
- package/dist/__tests__/editor-config.test.js.map +1 -0
- package/dist/__tests__/tools.test.js +2 -1
- package/dist/__tests__/tools.test.js.map +1 -1
- package/dist/cli/commands/login.d.ts +2 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +95 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/logout.d.ts +2 -0
- package/dist/cli/commands/logout.d.ts.map +1 -0
- package/dist/cli/commands/logout.js +21 -0
- package/dist/cli/commands/logout.js.map +1 -0
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +45 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/whoami.d.ts +2 -0
- package/dist/cli/commands/whoami.d.ts.map +1 -0
- package/dist/cli/commands/whoami.js +14 -0
- package/dist/cli/commands/whoami.js.map +1 -0
- package/dist/cli/credentials.d.ts +12 -0
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/cli/credentials.js +42 -0
- package/dist/cli/credentials.js.map +1 -0
- package/dist/cli/editor-config.d.ts +9 -0
- package/dist/cli/editor-config.d.ts.map +1 -0
- package/dist/cli/editor-config.js +105 -0
- package/dist/cli/editor-config.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +40 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config.d.ts +2 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -6
- package/dist/config.js.map +1 -1
- package/dist/http-db.d.ts +8 -0
- package/dist/http-db.d.ts.map +1 -0
- package/dist/http-db.js +128 -0
- package/dist/http-db.js.map +1 -0
- package/dist/index.js +18 -5
- package/dist/index.js.map +1 -1
- package/package.json +7 -4
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { HivemindClient } from "@hivemindai/sdk-ts";
|
|
2
|
+
import { readCredentials } from "../credentials.js";
|
|
3
|
+
export async function status() {
|
|
4
|
+
const creds = readCredentials();
|
|
5
|
+
if (!creds) {
|
|
6
|
+
console.log("Not logged in. Run `hivemind login` to authenticate.");
|
|
7
|
+
process.exit(1);
|
|
8
|
+
}
|
|
9
|
+
const client = new HivemindClient({
|
|
10
|
+
apiKey: creds.api_key,
|
|
11
|
+
baseUrl: creds.api_url,
|
|
12
|
+
});
|
|
13
|
+
try {
|
|
14
|
+
const res = await client.status();
|
|
15
|
+
console.log(`Project: ${creds.project_name}\n`);
|
|
16
|
+
console.log(`Events (24h): ${res.event_count_24h}`);
|
|
17
|
+
console.log(`Last event: ${res.last_event_at ?? "none"}`);
|
|
18
|
+
if (res.active_tasks.length > 0) {
|
|
19
|
+
console.log(`\nActive tasks (${res.active_tasks.length}):`);
|
|
20
|
+
for (const task of res.active_tasks) {
|
|
21
|
+
const summary = task.data.summary ?? task.channel;
|
|
22
|
+
console.log(` - ${summary}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (res.blockers.length > 0) {
|
|
26
|
+
console.log(`\nBlockers (${res.blockers.length}):`);
|
|
27
|
+
for (const blocker of res.blockers) {
|
|
28
|
+
const summary = blocker.data.summary ?? blocker.channel;
|
|
29
|
+
console.log(` - ${summary}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (res.recent_completions.length > 0) {
|
|
33
|
+
console.log(`\nRecent completions (${res.recent_completions.length}):`);
|
|
34
|
+
for (const c of res.recent_completions) {
|
|
35
|
+
const summary = c.data.summary ?? c.channel;
|
|
36
|
+
console.log(` - ${summary}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
console.error(`Failed to fetch status: ${err instanceof Error ? err.message : String(err)}`);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAEhC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;QAChC,MAAM,EAAE,KAAK,CAAC,OAAO;QACrB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QAElC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,CAAC,aAAa,IAAI,MAAM,EAAE,CAAC,CAAC;QAE7D,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,CAAC;YAC5D,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAI,IAAI,CAAC,IAAgC,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;gBAC/E,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;YACpD,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAI,OAAO,CAAC,IAAgC,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;gBACrF,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,IAAI,GAAG,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,CAAC,kBAAkB,CAAC,MAAM,IAAI,CAAC,CAAC;YACxE,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,kBAAkB,EAAE,CAAC;gBACvC,MAAM,OAAO,GAAI,CAAC,CAAC,IAAgC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/whoami.ts"],"names":[],"mappings":"AAEA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAc5C"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { readCredentials } from "../credentials.js";
|
|
2
|
+
export async function whoami() {
|
|
3
|
+
const creds = readCredentials();
|
|
4
|
+
if (!creds) {
|
|
5
|
+
console.log("Not logged in. Run `hivemind login` to authenticate.");
|
|
6
|
+
process.exit(1);
|
|
7
|
+
}
|
|
8
|
+
const keyPrefix = creds.api_key.slice(0, 12) + "...";
|
|
9
|
+
console.log(`Email: ${creds.email}`);
|
|
10
|
+
console.log(`Project: ${creds.project_name} (${creds.project_id})`);
|
|
11
|
+
console.log(`API URL: ${creds.api_url}`);
|
|
12
|
+
console.log(`API Key: ${keyPrefix}`);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/cli/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAEhC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;IAErD,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,EAAE,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface Credentials {
|
|
2
|
+
api_key: string;
|
|
3
|
+
api_url: string;
|
|
4
|
+
project_id: string;
|
|
5
|
+
project_name: string;
|
|
6
|
+
email: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function getCredentialsPath(): string;
|
|
9
|
+
export declare function readCredentials(): Credentials | null;
|
|
10
|
+
export declare function writeCredentials(creds: Credentials): void;
|
|
11
|
+
export declare function deleteCredentials(): boolean;
|
|
12
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/cli/credentials.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAID,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAmBpD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAKzD;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAO3C"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, unlinkSync, mkdirSync, chmodSync } from "node:fs";
|
|
2
|
+
import { join, dirname } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
const CREDENTIALS_PATH = join(homedir(), ".hivemind", "credentials.json");
|
|
5
|
+
export function getCredentialsPath() {
|
|
6
|
+
return CREDENTIALS_PATH;
|
|
7
|
+
}
|
|
8
|
+
export function readCredentials() {
|
|
9
|
+
try {
|
|
10
|
+
const raw = readFileSync(CREDENTIALS_PATH, "utf-8");
|
|
11
|
+
const parsed = JSON.parse(raw);
|
|
12
|
+
if (!parsed.api_key || typeof parsed.api_key !== "string") {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
api_key: parsed.api_key,
|
|
17
|
+
api_url: parsed.api_url ?? "https://api.hivemind.dev",
|
|
18
|
+
project_id: parsed.project_id ?? "",
|
|
19
|
+
project_name: parsed.project_name ?? "",
|
|
20
|
+
email: parsed.email ?? "",
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function writeCredentials(creds) {
|
|
28
|
+
const dir = dirname(CREDENTIALS_PATH);
|
|
29
|
+
mkdirSync(dir, { recursive: true });
|
|
30
|
+
writeFileSync(CREDENTIALS_PATH, JSON.stringify(creds, null, 2) + "\n", "utf-8");
|
|
31
|
+
chmodSync(CREDENTIALS_PATH, 0o600);
|
|
32
|
+
}
|
|
33
|
+
export function deleteCredentials() {
|
|
34
|
+
try {
|
|
35
|
+
unlinkSync(CREDENTIALS_PATH);
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/cli/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAUlC,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;AAE1E,MAAM,UAAU,kBAAkB;IAChC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE/B,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,0BAA0B;YACrD,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;YACnC,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE;YACvC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;SAC1B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAkB;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAChF,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC;QACH,UAAU,CAAC,gBAAgB,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-config.d.ts","sourceRoot":"","sources":["../../src/cli/editor-config.ts"],"names":[],"mappings":"AAgEA,wBAAgB,mBAAmB,IAAI;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CA6B9E;AAED,wBAAgB,sBAAsB,IAAI;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CA4BjF"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { join, dirname } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
function readJsonFile(path) {
|
|
5
|
+
try {
|
|
6
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return {};
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function writeJsonFile(path, data) {
|
|
13
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
14
|
+
writeFileSync(path, JSON.stringify(data, null, 2) + "\n", "utf-8");
|
|
15
|
+
}
|
|
16
|
+
function getMcpServerEntry() {
|
|
17
|
+
return {
|
|
18
|
+
command: "npx",
|
|
19
|
+
args: ["-y", "@hivemindai/mcp-server"],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function getClaudeConfigPath() {
|
|
23
|
+
return join(homedir(), ".claude.json");
|
|
24
|
+
}
|
|
25
|
+
function getCursorConfigPath() {
|
|
26
|
+
return join(homedir(), ".cursor", "mcp.json");
|
|
27
|
+
}
|
|
28
|
+
function getCursorDir() {
|
|
29
|
+
return join(homedir(), ".cursor");
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Remove hivemind MCP entries with hardcoded HIVEMIND_API_KEY env vars
|
|
33
|
+
* from project-specific configs in ~/.claude.json. These conflict with
|
|
34
|
+
* the credentials file approach used by `hivemind login`.
|
|
35
|
+
*/
|
|
36
|
+
function cleanProjectSpecificConfigs(config) {
|
|
37
|
+
for (const [key, value] of Object.entries(config)) {
|
|
38
|
+
if (!value || typeof value !== "object" || key === "mcpServers")
|
|
39
|
+
continue;
|
|
40
|
+
const block = value;
|
|
41
|
+
// Look for project-specific mcpServers blocks (keyed by path)
|
|
42
|
+
const servers = block.mcpServers;
|
|
43
|
+
if (servers && typeof servers === "object" && servers.hivemind) {
|
|
44
|
+
const entry = servers.hivemind;
|
|
45
|
+
const env = entry.env;
|
|
46
|
+
if (env && "HIVEMIND_API_KEY" in env) {
|
|
47
|
+
delete servers.hivemind;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export function configureMcpEditors() {
|
|
53
|
+
const result = { claudeCode: false, cursor: false };
|
|
54
|
+
const entry = getMcpServerEntry();
|
|
55
|
+
// Claude Code: ~/.claude.json
|
|
56
|
+
const claudePath = getClaudeConfigPath();
|
|
57
|
+
const claudeConfig = readJsonFile(claudePath);
|
|
58
|
+
if (!claudeConfig.mcpServers || typeof claudeConfig.mcpServers !== "object") {
|
|
59
|
+
claudeConfig.mcpServers = {};
|
|
60
|
+
}
|
|
61
|
+
claudeConfig.mcpServers.hivemind = entry;
|
|
62
|
+
// Remove project-specific entries with stale hardcoded API keys
|
|
63
|
+
cleanProjectSpecificConfigs(claudeConfig);
|
|
64
|
+
writeJsonFile(claudePath, claudeConfig);
|
|
65
|
+
result.claudeCode = true;
|
|
66
|
+
// Cursor: ~/.cursor/mcp.json (only if ~/.cursor/ exists)
|
|
67
|
+
if (existsSync(getCursorDir())) {
|
|
68
|
+
const cursorPath = getCursorConfigPath();
|
|
69
|
+
const cursorConfig = readJsonFile(cursorPath);
|
|
70
|
+
if (!cursorConfig.mcpServers || typeof cursorConfig.mcpServers !== "object") {
|
|
71
|
+
cursorConfig.mcpServers = {};
|
|
72
|
+
}
|
|
73
|
+
cursorConfig.mcpServers.hivemind = entry;
|
|
74
|
+
writeJsonFile(cursorPath, cursorConfig);
|
|
75
|
+
result.cursor = true;
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
export function removeMcpEditorConfigs() {
|
|
80
|
+
const result = { claudeCode: false, cursor: false };
|
|
81
|
+
// Claude Code
|
|
82
|
+
const claudePath = getClaudeConfigPath();
|
|
83
|
+
if (existsSync(claudePath)) {
|
|
84
|
+
const claudeConfig = readJsonFile(claudePath);
|
|
85
|
+
const servers = claudeConfig.mcpServers;
|
|
86
|
+
if (servers && "hivemind" in servers) {
|
|
87
|
+
delete servers.hivemind;
|
|
88
|
+
writeJsonFile(claudePath, claudeConfig);
|
|
89
|
+
result.claudeCode = true;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Cursor
|
|
93
|
+
const cursorPath = getCursorConfigPath();
|
|
94
|
+
if (existsSync(cursorPath)) {
|
|
95
|
+
const cursorConfig = readJsonFile(cursorPath);
|
|
96
|
+
const servers = cursorConfig.mcpServers;
|
|
97
|
+
if (servers && "hivemind" in servers) {
|
|
98
|
+
delete servers.hivemind;
|
|
99
|
+
writeJsonFile(cursorPath, cursorConfig);
|
|
100
|
+
result.cursor = true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=editor-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-config.js","sourceRoot":"","sources":["../../src/cli/editor-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { login } from "./commands/login.js";
|
|
2
|
+
import { whoami } from "./commands/whoami.js";
|
|
3
|
+
import { logout } from "./commands/logout.js";
|
|
4
|
+
import { status } from "./commands/status.js";
|
|
5
|
+
const command = process.argv[2];
|
|
6
|
+
const commands = {
|
|
7
|
+
login,
|
|
8
|
+
whoami,
|
|
9
|
+
logout,
|
|
10
|
+
status,
|
|
11
|
+
};
|
|
12
|
+
async function main() {
|
|
13
|
+
if (!command || command === "--help" || command === "-h") {
|
|
14
|
+
console.log(`
|
|
15
|
+
Usage: hivemind <command>
|
|
16
|
+
|
|
17
|
+
Commands:
|
|
18
|
+
login Sign in via browser and configure editors
|
|
19
|
+
whoami Show current authentication info
|
|
20
|
+
logout Remove stored credentials and editor configs
|
|
21
|
+
status Show project status (active tasks, blockers)
|
|
22
|
+
|
|
23
|
+
Options:
|
|
24
|
+
--help Show this help message
|
|
25
|
+
`.trim());
|
|
26
|
+
process.exit(0);
|
|
27
|
+
}
|
|
28
|
+
const handler = commands[command];
|
|
29
|
+
if (!handler) {
|
|
30
|
+
console.error(`Unknown command: ${command}`);
|
|
31
|
+
console.error(`Run "hivemind --help" for usage.`);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
await handler();
|
|
35
|
+
}
|
|
36
|
+
main().catch((err) => {
|
|
37
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
38
|
+
process.exit(1);
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,MAAM,QAAQ,GAAwC;IACpD,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;CACP,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;CAWf,CAAC,IAAI,EAAE,CAAC,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,EAAE,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/config.d.ts
CHANGED
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAcD,wBAAgB,UAAU,IAAI,YAAY,CA4CzC"}
|
package/dist/config.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { homedir } from "node:os";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
+
import { readCredentials } from "./cli/credentials.js";
|
|
3
4
|
function detectTool() {
|
|
4
5
|
if (process.env.CURSOR_SESSION)
|
|
5
6
|
return "cursor";
|
|
@@ -23,15 +24,24 @@ export function loadConfig() {
|
|
|
23
24
|
},
|
|
24
25
|
};
|
|
25
26
|
if (apiKey) {
|
|
26
|
-
// Cloud mode
|
|
27
|
-
const
|
|
28
|
-
if (!databaseUrl) {
|
|
29
|
-
throw new Error("DATABASE_URL environment variable is required in cloud mode (HIVEMIND_API_KEY is set)");
|
|
30
|
-
}
|
|
27
|
+
// Cloud mode — connect via REST API (env var takes priority)
|
|
28
|
+
const apiUrl = process.env.HIVEMIND_API_URL ?? "http://localhost:3001";
|
|
31
29
|
return {
|
|
32
30
|
...base,
|
|
33
31
|
mode: "cloud",
|
|
34
|
-
|
|
32
|
+
apiKey,
|
|
33
|
+
apiUrl,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// Credentials file fallback (from `hivemind login`)
|
|
37
|
+
const creds = readCredentials();
|
|
38
|
+
if (creds?.api_key) {
|
|
39
|
+
return {
|
|
40
|
+
...base,
|
|
41
|
+
mode: "cloud",
|
|
42
|
+
apiKey: creds.api_key,
|
|
43
|
+
apiUrl: creds.api_url,
|
|
44
|
+
projectId: creds.project_id || base.projectId,
|
|
35
45
|
};
|
|
36
46
|
}
|
|
37
47
|
// Local mode — SQLite
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAevD,SAAS,UAAU;IACjB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,QAAQ,CAAC;IAChD,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW;QAAE,OAAO,aAAa,CAAC;IAClD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,OAAO,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAE5C,MAAM,IAAI,GAAG;QACX,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,SAAS;QACvD,MAAM,EAAE;YACN,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,cAAc;YACnD,IAAI,EAAE,UAAU,EAAE;YAClB,OAAO,EAAE,iBAAiB,EAAE;SAC7B;KACF,CAAC;IAEF,IAAI,MAAM,EAAE,CAAC;QACX,6DAA6D;QAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,uBAAuB,CAAC;QAEvE,OAAO;YACL,GAAG,IAAI;YACP,IAAI,EAAE,OAAO;YACb,MAAM;YACN,MAAM;SACP,CAAC;IACJ,CAAC;IAED,oDAAoD;IACpD,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;QACnB,OAAO;YACL,GAAG,IAAI;YACP,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,KAAK,CAAC,OAAO;YACrB,MAAM,EAAE,KAAK,CAAC,OAAO;YACrB,SAAS,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS;SAC9C,CAAC;IACJ,CAAC;IAED,sBAAsB;IACtB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAE7F,OAAO;QACL,GAAG,IAAI;QACP,IAAI,EAAE,OAAO;QACb,UAAU;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { HivemindClient } from "@hivemindai/sdk-ts";
|
|
2
|
+
import type { HivemindDB } from "@hivemindai/core";
|
|
3
|
+
/**
|
|
4
|
+
* Implements HivemindDB by delegating to the REST API via the TypeScript SDK.
|
|
5
|
+
* Used in cloud mode so the MCP server doesn't need direct database access.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createHttpDb(client: HivemindClient): HivemindDB;
|
|
8
|
+
//# sourceMappingURL=http-db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-db.d.ts","sourceRoot":"","sources":["../src/http-db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EACV,UAAU,EAQX,MAAM,kBAAkB,CAAC;AAE1B;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,UAAU,CAyI/D"}
|
package/dist/http-db.js
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Implements HivemindDB by delegating to the REST API via the TypeScript SDK.
|
|
3
|
+
* Used in cloud mode so the MCP server doesn't need direct database access.
|
|
4
|
+
*/
|
|
5
|
+
export function createHttpDb(client) {
|
|
6
|
+
return {
|
|
7
|
+
async insertEvent(params) {
|
|
8
|
+
const result = await client.publish({
|
|
9
|
+
channel: params.channel,
|
|
10
|
+
event_type: params.event_type,
|
|
11
|
+
source: params.source,
|
|
12
|
+
data: params.data,
|
|
13
|
+
confidence: params.confidence,
|
|
14
|
+
});
|
|
15
|
+
// Return a minimal HivemindEvent — the REST API only returns id + created_at
|
|
16
|
+
return {
|
|
17
|
+
id: result.id,
|
|
18
|
+
project_id: params.project_id,
|
|
19
|
+
channel: params.channel,
|
|
20
|
+
event_type: params.event_type,
|
|
21
|
+
source: params.source,
|
|
22
|
+
data: params.data,
|
|
23
|
+
confidence: params.confidence ?? null,
|
|
24
|
+
embedding: null,
|
|
25
|
+
created_at: new Date(result.created_at),
|
|
26
|
+
};
|
|
27
|
+
},
|
|
28
|
+
async getEventById(_projectId, eventId) {
|
|
29
|
+
try {
|
|
30
|
+
const event = await client.getEvent(eventId);
|
|
31
|
+
return {
|
|
32
|
+
...event,
|
|
33
|
+
confidence: event.confidence ?? null,
|
|
34
|
+
embedding: null,
|
|
35
|
+
created_at: new Date(event.created_at),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
async queryEvents(params) {
|
|
43
|
+
const result = await client.query({
|
|
44
|
+
q: params.embedding ? undefined : undefined, // semantic search handled server-side
|
|
45
|
+
channel: params.channel,
|
|
46
|
+
event_type: params.event_type,
|
|
47
|
+
since: params.since,
|
|
48
|
+
until: params.until,
|
|
49
|
+
source_tool: params.source_tool,
|
|
50
|
+
limit: params.limit,
|
|
51
|
+
offset: params.offset,
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
events: result.events.map((e) => ({
|
|
55
|
+
...e,
|
|
56
|
+
confidence: e.confidence ?? null,
|
|
57
|
+
embedding: null,
|
|
58
|
+
created_at: new Date(e.created_at),
|
|
59
|
+
})),
|
|
60
|
+
total: result.total,
|
|
61
|
+
};
|
|
62
|
+
},
|
|
63
|
+
async acquireLock(params) {
|
|
64
|
+
const result = await client.lock(params.resource, {
|
|
65
|
+
agent: params.agent,
|
|
66
|
+
tool: params.tool,
|
|
67
|
+
ttl_seconds: params.ttl_seconds,
|
|
68
|
+
});
|
|
69
|
+
if (result.locked && result.lock) {
|
|
70
|
+
return {
|
|
71
|
+
locked: true,
|
|
72
|
+
lock: {
|
|
73
|
+
...result.lock,
|
|
74
|
+
tool: result.lock.tool ?? null,
|
|
75
|
+
acquired_at: new Date(result.lock.acquired_at),
|
|
76
|
+
expires_at: new Date(result.lock.expires_at),
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
locked: false,
|
|
82
|
+
held_by: result.held_by,
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
async releaseLock(_projectId, resource) {
|
|
86
|
+
const result = await client.unlock(resource);
|
|
87
|
+
return result.released;
|
|
88
|
+
},
|
|
89
|
+
async checkLock(_projectId, _resource) {
|
|
90
|
+
// REST API doesn't have a dedicated check-lock endpoint
|
|
91
|
+
// Return null — lock status is checked via acquire attempts
|
|
92
|
+
return null;
|
|
93
|
+
},
|
|
94
|
+
async getUnresolvedBlockers(_projectId, channel) {
|
|
95
|
+
const status = await client.status(channel);
|
|
96
|
+
return status.blockers.map((b) => ({
|
|
97
|
+
id: b.id,
|
|
98
|
+
channel: b.channel,
|
|
99
|
+
data: b.data,
|
|
100
|
+
source: b.source,
|
|
101
|
+
created_at: new Date(b.created_at),
|
|
102
|
+
}));
|
|
103
|
+
},
|
|
104
|
+
async getActiveStatus(_projectId, channel) {
|
|
105
|
+
const status = await client.status(channel);
|
|
106
|
+
return {
|
|
107
|
+
activeTasks: status.active_tasks.map((t) => ({
|
|
108
|
+
...t,
|
|
109
|
+
created_at: new Date(t.created_at),
|
|
110
|
+
})),
|
|
111
|
+
recentCompletions: status.recent_completions.map((t) => ({
|
|
112
|
+
...t,
|
|
113
|
+
created_at: new Date(t.created_at),
|
|
114
|
+
})),
|
|
115
|
+
blockers: status.blockers.map((b) => ({
|
|
116
|
+
...b,
|
|
117
|
+
created_at: new Date(b.created_at),
|
|
118
|
+
})),
|
|
119
|
+
eventCount24h: status.event_count_24h,
|
|
120
|
+
lastEventAt: status.last_event_at ? new Date(status.last_event_at) : null,
|
|
121
|
+
};
|
|
122
|
+
},
|
|
123
|
+
async close() {
|
|
124
|
+
// No-op for HTTP client
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=http-db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-db.js","sourceRoot":"","sources":["../src/http-db.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -2,8 +2,10 @@ import { mkdirSync } from "node:fs";
|
|
|
2
2
|
import { dirname } from "node:path";
|
|
3
3
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
4
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
-
import {
|
|
5
|
+
import { createSqliteHivemindDB, createEmbeddingProvider, } from "@hivemindai/core";
|
|
6
|
+
import { HivemindClient } from "@hivemindai/sdk-ts";
|
|
6
7
|
import { loadConfig } from "./config.js";
|
|
8
|
+
import { createHttpDb } from "./http-db.js";
|
|
7
9
|
import { registerPublishTool } from "./tools/publish.js";
|
|
8
10
|
import { registerQueryTool } from "./tools/query.js";
|
|
9
11
|
import { registerSubscribeTool } from "./tools/subscribe.js";
|
|
@@ -12,14 +14,25 @@ import { registerLockTool } from "./tools/lock.js";
|
|
|
12
14
|
import { registerBlockersTool } from "./tools/blockers.js";
|
|
13
15
|
async function main() {
|
|
14
16
|
const config = loadConfig();
|
|
15
|
-
const embeddingProvider = await createEmbeddingProvider();
|
|
16
17
|
let db;
|
|
18
|
+
let embeddingProvider;
|
|
17
19
|
if (config.mode === "cloud") {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
// Cloud mode: delegate everything to the REST API via HTTP.
|
|
21
|
+
// Embeddings are generated server-side, so we use a no-op provider.
|
|
22
|
+
const client = new HivemindClient({
|
|
23
|
+
apiKey: config.apiKey,
|
|
24
|
+
baseUrl: config.apiUrl,
|
|
25
|
+
});
|
|
26
|
+
db = createHttpDb(client);
|
|
27
|
+
embeddingProvider = {
|
|
28
|
+
generateEmbedding: async () => null,
|
|
29
|
+
generateEmbeddings: async (texts) => texts.map(() => null),
|
|
30
|
+
dimensions: 0,
|
|
31
|
+
};
|
|
20
32
|
}
|
|
21
33
|
else {
|
|
22
|
-
//
|
|
34
|
+
// Local mode: SQLite with local embeddings
|
|
35
|
+
embeddingProvider = await createEmbeddingProvider();
|
|
23
36
|
mkdirSync(dirname(config.sqlitePath), { recursive: true });
|
|
24
37
|
db = createSqliteHivemindDB(config.sqlitePath, embeddingProvider.dimensions);
|
|
25
38
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hivemindai/mcp-server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "MCP server for Hivemind — persistent event log for AI agent coordination",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
8
|
"bin": {
|
|
9
|
-
"hivemind-mcp": "./bin/hivemind-mcp.js"
|
|
9
|
+
"hivemind-mcp": "./bin/hivemind-mcp.js",
|
|
10
|
+
"hivemind": "./bin/hivemind.js"
|
|
10
11
|
},
|
|
11
12
|
"files": [
|
|
12
13
|
"dist",
|
|
@@ -22,9 +23,10 @@
|
|
|
22
23
|
"cursor"
|
|
23
24
|
],
|
|
24
25
|
"license": "MIT",
|
|
26
|
+
"mcpName": "io.github.gbram1/hivemind",
|
|
25
27
|
"repository": {
|
|
26
28
|
"type": "git",
|
|
27
|
-
"url": "https://github.com/
|
|
29
|
+
"url": "https://github.com/gbram1/hivemind",
|
|
28
30
|
"directory": "packages/mcp-server"
|
|
29
31
|
},
|
|
30
32
|
"publishConfig": {
|
|
@@ -33,7 +35,8 @@
|
|
|
33
35
|
"dependencies": {
|
|
34
36
|
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
35
37
|
"zod": "^3.25.76",
|
|
36
|
-
"@hivemindai/core": "0.1.0"
|
|
38
|
+
"@hivemindai/core": "0.1.0",
|
|
39
|
+
"@hivemindai/sdk-ts": "0.1.0"
|
|
37
40
|
},
|
|
38
41
|
"scripts": {
|
|
39
42
|
"build": "tsc",
|