exomind 0.2.3 → 0.2.5

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/cli.js CHANGED
@@ -965,7 +965,7 @@ var require_command = __commonJS({
965
965
  "use strict";
966
966
  var EventEmitter = require("events").EventEmitter;
967
967
  var childProcess = require("child_process");
968
- var path6 = require("path");
968
+ var path7 = require("path");
969
969
  var fs7 = require("fs");
970
970
  var process2 = require("process");
971
971
  var { Argument: Argument2, humanReadableArgName } = require_argument();
@@ -1898,9 +1898,9 @@ Expecting one of '${allowedValues.join("', '")}'`);
1898
1898
  let launchWithNode = false;
1899
1899
  const sourceExt = [".js", ".ts", ".tsx", ".mjs", ".cjs"];
1900
1900
  function findFile(baseDir, baseName) {
1901
- const localBin = path6.resolve(baseDir, baseName);
1901
+ const localBin = path7.resolve(baseDir, baseName);
1902
1902
  if (fs7.existsSync(localBin)) return localBin;
1903
- if (sourceExt.includes(path6.extname(baseName))) return void 0;
1903
+ if (sourceExt.includes(path7.extname(baseName))) return void 0;
1904
1904
  const foundExt = sourceExt.find(
1905
1905
  (ext) => fs7.existsSync(`${localBin}${ext}`)
1906
1906
  );
@@ -1918,17 +1918,17 @@ Expecting one of '${allowedValues.join("', '")}'`);
1918
1918
  } catch (err) {
1919
1919
  resolvedScriptPath = this._scriptPath;
1920
1920
  }
1921
- executableDir = path6.resolve(
1922
- path6.dirname(resolvedScriptPath),
1921
+ executableDir = path7.resolve(
1922
+ path7.dirname(resolvedScriptPath),
1923
1923
  executableDir
1924
1924
  );
1925
1925
  }
1926
1926
  if (executableDir) {
1927
1927
  let localFile = findFile(executableDir, executableFile);
1928
1928
  if (!localFile && !subcommand._executableFile && this._scriptPath) {
1929
- const legacyName = path6.basename(
1929
+ const legacyName = path7.basename(
1930
1930
  this._scriptPath,
1931
- path6.extname(this._scriptPath)
1931
+ path7.extname(this._scriptPath)
1932
1932
  );
1933
1933
  if (legacyName !== this._name) {
1934
1934
  localFile = findFile(
@@ -1939,7 +1939,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
1939
1939
  }
1940
1940
  executableFile = localFile || executableFile;
1941
1941
  }
1942
- launchWithNode = sourceExt.includes(path6.extname(executableFile));
1942
+ launchWithNode = sourceExt.includes(path7.extname(executableFile));
1943
1943
  let proc;
1944
1944
  if (process2.platform !== "win32") {
1945
1945
  if (launchWithNode) {
@@ -2779,7 +2779,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
2779
2779
  * @return {Command}
2780
2780
  */
2781
2781
  nameFromFilename(filename) {
2782
- this._name = path6.basename(filename, path6.extname(filename));
2782
+ this._name = path7.basename(filename, path7.extname(filename));
2783
2783
  return this;
2784
2784
  }
2785
2785
  /**
@@ -2793,9 +2793,9 @@ Expecting one of '${allowedValues.join("', '")}'`);
2793
2793
  * @param {string} [path]
2794
2794
  * @return {(string|null|Command)}
2795
2795
  */
2796
- executableDir(path7) {
2797
- if (path7 === void 0) return this._executableDir;
2798
- this._executableDir = path7;
2796
+ executableDir(path8) {
2797
+ if (path8 === void 0) return this._executableDir;
2798
+ this._executableDir = path8;
2799
2799
  return this;
2800
2800
  }
2801
2801
  /**
@@ -3119,7 +3119,7 @@ var {
3119
3119
  // package.json
3120
3120
  var package_default = {
3121
3121
  name: "exomind",
3122
- version: "0.2.3",
3122
+ version: "0.2.5",
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"
@@ -3624,6 +3624,9 @@ async function runHook(client) {
3624
3624
  }
3625
3625
  }
3626
3626
 
3627
+ // src/commands/ingest.ts
3628
+ var path5 = __toESM(require("path"));
3629
+
3627
3630
  // src/ingest_dir.ts
3628
3631
  var fs5 = __toESM(require("fs"));
3629
3632
  var path4 = __toESM(require("path"));
@@ -3651,6 +3654,14 @@ function saveManifest(m) {
3651
3654
  } catch {
3652
3655
  }
3653
3656
  }
3657
+ function recordFile(manifest, absPath, rawContent, title) {
3658
+ manifest[absPath] = {
3659
+ hash: sha256(rawContent),
3660
+ ingested_at: (/* @__PURE__ */ new Date()).toISOString(),
3661
+ title,
3662
+ size: rawContent.length
3663
+ };
3664
+ }
3654
3665
  function cleanupStale(m, dir, currentFiles) {
3655
3666
  const prefix = path3.resolve(dir) + path3.sep;
3656
3667
  const current = new Set(currentFiles);
@@ -3726,7 +3737,7 @@ async function runDirIngestest(client, opts, dir) {
3726
3737
  const plan = planIngestest(files, manifest, !!opts.force);
3727
3738
  const total = files.length;
3728
3739
  process.stderr.write(
3729
- `\u76EE\u5F55 ${dir}: ${total} \u6587\u4EF6 \u2192 \u65B0\u589E/\u66F4\u65B0 ${plan.toIngest.length},\u8DF3\u8FC7 ${plan.toSkip.length}
3740
+ `\u76EE\u5F55 ${dir}: ${total} \u6587\u4EF6 \u2014 \u5F85\u6444\u5165 ${plan.toIngest.length},\u8DF3\u8FC7 ${plan.toSkip.length}
3730
3741
  `
3731
3742
  );
3732
3743
  let added = 0;
@@ -3735,40 +3746,48 @@ async function runDirIngestest(client, opts, dir) {
3735
3746
  for (let i = 0; i < plan.toIngest.length; i++) {
3736
3747
  const f = plan.toIngest[i];
3737
3748
  const prev = manifest[f.path];
3738
- process.stderr.write(
3739
- `\u23F3 [${i + 1}/${plan.toIngest.length}] ${path4.basename(f.path)} ${prev ? "(\u66F4\u65B0)" : "(\u65B0\u589E)"}\u2026
3740
- `
3741
- );
3749
+ process.stderr.write(`\u23F3 [${i + 1}/${plan.toIngest.length}] ${path4.basename(f.path)}\u2026
3750
+ `);
3742
3751
  try {
3743
- await client.post(
3752
+ const res = await client.post(
3744
3753
  "/ingest",
3745
3754
  { content: f.content, title: f.title, tags: opts.tag },
3746
3755
  { timeoutMs: opTimeout(3e5) }
3747
3756
  );
3748
- manifest[f.path] = {
3749
- hash: f.hash,
3750
- ingested_at: (/* @__PURE__ */ new Date()).toISOString(),
3751
- title: f.title,
3752
- size: f.content.length
3753
- };
3754
- if (prev) updated++;
3755
- else added++;
3757
+ recordFile(manifest, f.path, f.content, f.title);
3756
3758
  saveManifest(manifest);
3759
+ if (prev) {
3760
+ updated++;
3761
+ process.stderr.write(` ${green("\u2713")} \u66F4\u65B0 \u2014 \u5B9E\u4F53 ${res.entities ?? 0}/\u6982\u5FF5 ${res.concepts ?? 0}
3762
+ `);
3763
+ } else {
3764
+ added++;
3765
+ process.stderr.write(` ${green("\u2713")} \u65B0\u589E \u2014 \u5B9E\u4F53 ${res.entities ?? 0}/\u6982\u5FF5 ${res.concepts ?? 0}
3766
+ `);
3767
+ }
3757
3768
  } catch (e) {
3758
3769
  failed++;
3759
- process.stderr.write(` ${red("\u2717")} ${path4.basename(f.path)}: ${e.message}
3770
+ process.stderr.write(` ${red("\u2717")} ${e.message}
3760
3771
  `);
3761
3772
  }
3762
3773
  }
3763
3774
  cleanupStale(manifest, dir, files);
3764
3775
  saveManifest(manifest);
3776
+ const allUpToDate = added + updated === 0 && plan.toSkip.length > 0 && failed === 0;
3765
3777
  output(
3766
- { added, updated, skipped: plan.toSkip.length, failed, total, dir },
3767
- () => console.log(
3768
- green("\u2713 \u76EE\u5F55\u6444\u5165\u5B8C\u6210") + dim(
3769
- `: \u65B0\u589E ${added} / \u66F4\u65B0 ${updated} / \u8DF3\u8FC7 ${plan.toSkip.length} / \u5931\u8D25 ${failed} (\u5171 ${total})`
3770
- )
3771
- )
3778
+ { added, updated, skipped: plan.toSkip.length, failed, total, dir, allUpToDate },
3779
+ () => {
3780
+ console.log(
3781
+ green("\u2713 \u76EE\u5F55\u6444\u5165\u5B8C\u6210") + dim(
3782
+ `: \u65B0\u589E ${added} / \u66F4\u65B0 ${updated} / \u8DF3\u8FC7 ${plan.toSkip.length} / \u5931\u8D25 ${failed} (\u5171 ${total})`
3783
+ )
3784
+ );
3785
+ if (allUpToDate) {
3786
+ console.log(
3787
+ dim("\uFF08\u5168\u90E8\u5DF2\u662F\u6700\u65B0,\u65E0\u9700\u91CD\u6444;\u9664\u975E\u7528\u6237\u660E\u786E\u8981\u6C42\u5F3A\u5236\u5237\u65B0,\u5426\u5219\u4E0D\u8981\u52A0 --force\uFF09")
3788
+ );
3789
+ }
3790
+ }
3772
3791
  );
3773
3792
  }
3774
3793
 
@@ -3776,8 +3795,12 @@ async function runDirIngestest(client, opts, dir) {
3776
3795
  async function ingest(client, opts, args) {
3777
3796
  if (opts.dir) return runDirIngestest(client, opts, opts.dir);
3778
3797
  let content = "";
3798
+ let fileAbs = null;
3799
+ let fileRaw = null;
3779
3800
  if (opts.file) {
3780
- content = readFileText(opts.file);
3801
+ fileRaw = readFileText(opts.file);
3802
+ content = fileRaw;
3803
+ fileAbs = path5.resolve(opts.file);
3781
3804
  } else if (args.length && args[0] === "-") {
3782
3805
  content = await readStdinForced();
3783
3806
  } else if (args.length) {
@@ -3797,6 +3820,11 @@ async function ingest(client, opts, args) {
3797
3820
  if (opts.tag && opts.tag.length) body.tags = opts.tag;
3798
3821
  hint("\u23F3 \u6444\u5165\u4E2D: \u670D\u52A1\u5668\u7528 LLM \u62BD\u53D6\u5B9E\u4F53/\u5173\u7CFB,\u957F\u5185\u5BB9\u53EF\u80FD 1-3 \u5206\u949F\u2026");
3799
3822
  const result = await client.post("/ingest", body, { timeoutMs: opTimeout(3e5) });
3823
+ if (fileAbs && fileRaw !== null) {
3824
+ const man = loadManifest();
3825
+ recordFile(man, fileAbs, fileRaw, opts.title || path5.basename(fileAbs));
3826
+ saveManifest(man);
3827
+ }
3800
3828
  output(result, () => {
3801
3829
  console.log(ok("\u5DF2\u5BFC\u5165\u670D\u52A1\u5668\u77E5\u8BC6\u5E93"));
3802
3830
  if (opts.title) console.log(dim(` \u6807\u9898: ${opts.title}`));
@@ -4096,10 +4124,10 @@ async function whoami(client) {
4096
4124
 
4097
4125
  // src/commands/install.ts
4098
4126
  var fs6 = __toESM(require("fs"));
4099
- var path5 = __toESM(require("path"));
4127
+ var path6 = __toESM(require("path"));
4100
4128
  var os2 = __toESM(require("os"));
4101
- var PKG_ROOT = path5.resolve(__dirname, "..");
4102
- var SKILL_SRC = path5.join(PKG_ROOT, "skill", "SKILL.md");
4129
+ var PKG_ROOT = path6.resolve(__dirname, "..");
4130
+ var SKILL_SRC = path6.join(PKG_ROOT, "skill", "SKILL.md");
4103
4131
  function readJson2(file) {
4104
4132
  try {
4105
4133
  return JSON.parse(fs6.readFileSync(file, "utf-8"));
@@ -4112,22 +4140,22 @@ function backup(file) {
4112
4140
  const bak = `${file}.bak-${Date.now()}`;
4113
4141
  try {
4114
4142
  fs6.copyFileSync(file, bak);
4115
- console.log(dim(` (\u5DF2\u5907\u4EFD\u539F\u914D\u7F6E \u2192 ${path5.basename(bak)})`));
4143
+ console.log(dim(` (\u5DF2\u5907\u4EFD\u539F\u914D\u7F6E \u2192 ${path6.basename(bak)})`));
4116
4144
  } catch {
4117
4145
  }
4118
4146
  }
4119
4147
  async function install(_client, opts) {
4120
- const claudeDir = path5.join(os2.homedir(), ".claude");
4121
- const skillDestDir = path5.join(claudeDir, "skills", "exomind");
4148
+ const claudeDir = path6.join(os2.homedir(), ".claude");
4149
+ const skillDestDir = path6.join(claudeDir, "skills", "exomind");
4122
4150
  if (!fs6.existsSync(SKILL_SRC)) {
4123
4151
  throw new Error(`skill \u6E90\u4E0D\u5B58\u5728: ${SKILL_SRC}(npm \u5305\u53EF\u80FD\u635F\u574F,\u6216\u5F00\u53D1\u6A21\u5F0F\u4E0B\u672A\u6784\u5EFA)`);
4124
4152
  }
4125
4153
  fs6.mkdirSync(skillDestDir, { recursive: true });
4126
- fs6.copyFileSync(SKILL_SRC, path5.join(skillDestDir, "SKILL.md"));
4154
+ fs6.copyFileSync(SKILL_SRC, path6.join(skillDestDir, "SKILL.md"));
4127
4155
  console.log(ok("\u5DF2\u5B89\u88C5 Claude Code skill"));
4128
4156
  console.log(dim(` \u2192 ${skillDestDir}/SKILL.md`));
4129
4157
  if (opts.withHook) {
4130
- const settingsFile = path5.join(claudeDir, "settings.json");
4158
+ const settingsFile = path6.join(claudeDir, "settings.json");
4131
4159
  fs6.mkdirSync(claudeDir, { recursive: true });
4132
4160
  backup(settingsFile);
4133
4161
  const settings = readJson2(settingsFile) ?? {};
@@ -4223,7 +4251,7 @@ program2.command("hook").description("UserPromptSubmit \u94A9\u5B50(\u7531 Claud
4223
4251
  program2.command("install").description("\u5B89\u88C5 Claude Code skill(\u53EF\u9009 --with-hook \u5199\u5165 UserPromptSubmit)").option("--with-hook", "\u540C\u65F6\u5199\u5165 ~/.claude/settings.json \u7684 hook").action(run(install));
4224
4252
  async function main() {
4225
4253
  const first = process.argv[2];
4226
- if (first && /^--?v(ersion)?$/i.test(first)) {
4254
+ if (first && /^(-v|--version)$/.test(first)) {
4227
4255
  console.log(VERSION);
4228
4256
  process.exit(0);
4229
4257
  }