exomind 0.3.1 → 0.3.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/README.md +8 -5
- package/dist/cli.js +37 -11
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -61,14 +61,17 @@ exomind install # 装 skill + hook + MCP,全部自动(幂等+备份)
|
|
|
61
61
|
|
|
62
62
|
完整接入步骤见服务端仓库 `myExoMindManager/docs/new-machine-setup.md`。
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
**升级**:`npm i -g exomind@latest && exomind install`(幂等,刷新 skill/hook/mcp;`~/.exomind/` 的 config 与 manifest 保留)。注意:`npm i -g` 只换二进制(CLI+MCP 自动用新),**skill 是拷贝的,需 `exomind install` 才刷新**。
|
|
65
65
|
|
|
66
|
-
|
|
66
|
+
## 关于 MCP 工具层(Claude Code + OpenCode 都已默认装)
|
|
67
67
|
|
|
68
|
-
|
|
69
|
-
-
|
|
68
|
+
`exomind install` 一次写**两个宿主**的 MCP 配置(都幂等+备份,互不干扰,各读各的):
|
|
69
|
+
- **Claude Code**:`~/.claude.json` → `mcpServers.exomind`
|
|
70
|
+
- **OpenCode**:`~/.config/opencode/opencode.json` → `mcp.exomind`
|
|
70
71
|
|
|
71
|
-
|
|
72
|
+
只关 MCP:`exomind install --no-mcp`(两个宿主都不写)。手写/其它宿主(如 Cursor)参考 [docs/mcp.md](./docs/mcp.md)。
|
|
73
|
+
|
|
74
|
+
`exomind mcp` 是本地 stdio MCP server,把 ingest/query/search/entity/relations/stats 暴露为 typed tool;复用同一份凭证,三平台都能跑(本地 stdio,不涉及远程 SSE 的 Windows 坑)。
|
|
72
75
|
|
|
73
76
|
## 命令一览
|
|
74
77
|
|
package/dist/cli.js
CHANGED
|
@@ -3119,7 +3119,7 @@ var {
|
|
|
3119
3119
|
// package.json
|
|
3120
3120
|
var package_default = {
|
|
3121
3121
|
name: "exomind",
|
|
3122
|
-
version: "0.3.
|
|
3122
|
+
version: "0.3.2",
|
|
3123
3123
|
description: "ExoMind \u8DE8\u5E73\u53F0\u547D\u4EE4\u884C\u5BA2\u6237\u7AEF \u2014 \u901A\u8FC7 REST \u4E0E ExoMind \u77E5\u8BC6\u5E93\u4EA4\u4E92(ingest/query/search/review),\u66FF\u4EE3 Windows \u4E0D\u53EF\u7528\u7684 MCP \u5BA2\u6237\u7AEF\u3002",
|
|
3124
3124
|
bin: {
|
|
3125
3125
|
exomind: "dist/cli.js"
|
|
@@ -4294,7 +4294,23 @@ function backup(file) {
|
|
|
4294
4294
|
const bak = `${file}.bak-${Date.now()}`;
|
|
4295
4295
|
try {
|
|
4296
4296
|
fs6.copyFileSync(file, bak);
|
|
4297
|
-
console.log(dim(` (\u5DF2\u5907\u4EFD
|
|
4297
|
+
console.log(dim(` (\u5DF2\u5907\u4EFD \u2192 ${path6.basename(bak)})`));
|
|
4298
|
+
} catch {
|
|
4299
|
+
return;
|
|
4300
|
+
}
|
|
4301
|
+
pruneBackups(file, 3);
|
|
4302
|
+
}
|
|
4303
|
+
function pruneBackups(file, keep) {
|
|
4304
|
+
try {
|
|
4305
|
+
const dir = path6.dirname(file);
|
|
4306
|
+
const prefix = path6.basename(file) + ".bak-";
|
|
4307
|
+
const olds = fs6.readdirSync(dir).filter((f) => f.startsWith(prefix)).map((f) => ({ f, mt: fs6.statSync(path6.join(dir, f)).mtimeMs })).sort((a, b) => b.mt - a.mt);
|
|
4308
|
+
for (const o of olds.slice(keep)) {
|
|
4309
|
+
try {
|
|
4310
|
+
fs6.unlinkSync(path6.join(dir, o.f));
|
|
4311
|
+
} catch {
|
|
4312
|
+
}
|
|
4313
|
+
}
|
|
4298
4314
|
} catch {
|
|
4299
4315
|
}
|
|
4300
4316
|
}
|
|
@@ -4328,15 +4344,25 @@ async function install(_client, opts) {
|
|
|
4328
4344
|
console.log(dim(" \u91CD\u542F Claude Code \u751F\u6548\u3002hook \u51FA\u9519\u4E0D\u4F1A\u963B\u585E\u4F60\u7684\u8F93\u5165(\u9519\u8BEF\u53EA\u8FDB stderr)\u3002"));
|
|
4329
4345
|
}
|
|
4330
4346
|
if (opts.mcp !== false) {
|
|
4331
|
-
const
|
|
4332
|
-
backup(
|
|
4333
|
-
const cc = readJson2(
|
|
4334
|
-
const
|
|
4335
|
-
|
|
4336
|
-
cc.mcpServers =
|
|
4337
|
-
fs6.writeFileSync(
|
|
4347
|
+
const ccJson = path6.join(os2.homedir(), ".claude.json");
|
|
4348
|
+
backup(ccJson);
|
|
4349
|
+
const cc = readJson2(ccJson) ?? {};
|
|
4350
|
+
const ccMcp = cc.mcpServers ?? {};
|
|
4351
|
+
ccMcp.exomind = { command: "exomind", args: ["mcp"] };
|
|
4352
|
+
cc.mcpServers = ccMcp;
|
|
4353
|
+
fs6.writeFileSync(ccJson, JSON.stringify(cc, null, 2) + "\n");
|
|
4354
|
+
const ocJson = path6.join(os2.homedir(), ".config", "opencode", "opencode.json");
|
|
4355
|
+
fs6.mkdirSync(path6.dirname(ocJson), { recursive: true });
|
|
4356
|
+
backup(ocJson);
|
|
4357
|
+
const oc = readJson2(ocJson) ?? {};
|
|
4358
|
+
const ocMcp = oc.mcp ?? {};
|
|
4359
|
+
ocMcp.exomind = { type: "local", command: ["exomind", "mcp"] };
|
|
4360
|
+
oc.mcp = ocMcp;
|
|
4361
|
+
fs6.writeFileSync(ocJson, JSON.stringify(oc, null, 2) + "\n");
|
|
4338
4362
|
console.log(ok("\u5DF2\u914D\u7F6E MCP server \u2192 exomind mcp"));
|
|
4339
|
-
console.log(dim(" \u2192 ~/.claude.json (mcpServers.exomind)
|
|
4363
|
+
console.log(dim(" \u2192 Claude Code: ~/.claude.json (mcpServers.exomind)"));
|
|
4364
|
+
console.log(dim(" \u2192 OpenCode: ~/.config/opencode/opencode.json (mcp.exomind)"));
|
|
4365
|
+
console.log(dim(" \u91CD\u542F\u5BF9\u5E94 Agent \u2192 \u62FF\u5230 mcp__exomind__* \u5DE5\u5177"));
|
|
4340
4366
|
}
|
|
4341
4367
|
console.log(yellow("\n\u4E0B\u4E00\u6B65:"));
|
|
4342
4368
|
console.log(dim(" 1. \u82E5\u672A\u914D\u7F6E\u51ED\u8BC1: exomind login"));
|
|
@@ -4424,7 +4450,7 @@ program2.command("mcp").description("\u542F\u52A8 stdio MCP server(\u4F9B Claude
|
|
|
4424
4450
|
const client = new ApiClient(cfg);
|
|
4425
4451
|
await runMcpServer(client);
|
|
4426
4452
|
});
|
|
4427
|
-
program2.command("install").description("\u5B89\u88C5 skill + hook + MCP(\u9ED8\u8BA4\u5168\u88C5;--no-hook / --no-mcp \u5173\u95ED\u67D0\u9879)").option("--no-hook", "\u4E0D\u5199 UserPromptSubmit hook").option("--no-mcp", "\u4E0D\u5199 MCP server \u914D\u7F6E").action(run(install));
|
|
4453
|
+
program2.command("install").description("\u5B89\u88C5 skill + hook + MCP(\u9ED8\u8BA4\u5168\u88C5;--no-hook / --no-mcp \u5173\u95ED\u67D0\u9879)").option("--no-hook", "\u4E0D\u5199 UserPromptSubmit hook").option("--no-mcp", "\u4E0D\u5199 MCP server \u914D\u7F6E(Claude Code + OpenCode \u90FD\u4E0D\u5199)").action(run(install));
|
|
4428
4454
|
async function main() {
|
|
4429
4455
|
const first = process.argv[2];
|
|
4430
4456
|
if (first && /^(-v|--version)$/.test(first)) {
|