memorix 1.8.5 → 1.8.6

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 (40) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +4 -2
  3. package/assets/star-history-dark.svg +5 -5
  4. package/assets/star-history-light.svg +5 -5
  5. package/assets/star-history.json +35 -5
  6. package/dist/cli/index.js +309 -131
  7. package/dist/index.js +75 -11
  8. package/dist/memcode-runtime/CHANGELOG.md +18 -0
  9. package/dist/sdk.js +74 -10
  10. package/dist/types.d.ts +1 -1
  11. package/docs/API_REFERENCE.md +1 -1
  12. package/docs/DEVELOPMENT.md +2 -2
  13. package/docs/INTEGRATIONS.md +1 -0
  14. package/docs/MODULES.md +1 -1
  15. package/docs/README.md +3 -3
  16. package/docs/SETUP.md +1 -0
  17. package/package.json +1 -1
  18. package/plugins/antigravity/memorix/plugin.json +1 -1
  19. package/plugins/claude/memorix/.claude-plugin/plugin.json +1 -1
  20. package/plugins/codebuddy/memorix/.codebuddy-plugin/plugin.json +1 -1
  21. package/plugins/codex/memorix/.codex-plugin/plugin.json +1 -1
  22. package/plugins/copilot/memorix/plugin.json +1 -1
  23. package/plugins/gemini/memorix/gemini-extension.json +1 -1
  24. package/plugins/hermes/memorix/plugin.yaml +1 -1
  25. package/plugins/omp/memorix/package.json +1 -1
  26. package/plugins/openclaw/memorix/.codex-plugin/plugin.json +1 -1
  27. package/plugins/pi/memorix/package.json +1 -1
  28. package/server.json +2 -2
  29. package/src/cli/commands/agent-integrations.ts +1 -0
  30. package/src/cli/commands/hooks-install.ts +9 -2
  31. package/src/cli/commands/hooks-preview.ts +5 -0
  32. package/src/cli/commands/integrate.ts +2 -0
  33. package/src/cli/commands/setup.ts +11 -1
  34. package/src/cli/commands/uninstall.ts +24 -2
  35. package/src/codegraph/task-lens.ts +72 -7
  36. package/src/hooks/installers/index.ts +55 -0
  37. package/src/hooks/types.ts +2 -0
  38. package/src/integrations/registry.ts +9 -0
  39. package/src/types.ts +1 -1
  40. package/src/workspace/mcp-adapters/workbuddy.ts +71 -0
package/dist/index.js CHANGED
@@ -149968,6 +149968,15 @@ __export(task_lens_exports, {
149968
149968
  scoreLensSource: () => scoreLensSource,
149969
149969
  shouldShowLensSource: () => shouldShowLensSource
149970
149970
  });
149971
+ function hasSubstantiveTask(text2, keyword) {
149972
+ const withoutKeyword = text2.replace(
149973
+ new RegExp(keyword.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "gi"),
149974
+ " "
149975
+ );
149976
+ const residual = withoutKeyword.replace(TASK_FILLER_WORDS, " ").replace(TASK_FILLER_PHRASES, " ").replace(/[\s\p{P}]/gu, "");
149977
+ if (/^(?:任务|工作|一下|一起|接着)$/u.test(residual)) return false;
149978
+ return Array.from(residual).length >= MIN_TASK_SUBSTANCE;
149979
+ }
149971
149980
  function normalizePath2(path37) {
149972
149981
  return path37.replace(/\\/g, "/");
149973
149982
  }
@@ -150027,8 +150036,12 @@ function resolveTaskLens(task) {
150027
150036
  }
150028
150037
  function isContinuationTask(task) {
150029
150038
  const normalized = (task ?? "").trim().toLowerCase();
150030
- return normalized.length > 0 && CONTINUATION_KEYWORDS.some(
150031
- (keyword) => containsTaskKeyword(normalized, keyword)
150039
+ if (normalized.length === 0) return false;
150040
+ if (EXPLICIT_HANDOFF_KEYWORDS.some((keyword) => containsTaskKeyword(normalized, keyword))) {
150041
+ return true;
150042
+ }
150043
+ return AMBIGUOUS_CONTINUATION_KEYWORDS.some(
150044
+ (keyword) => containsTaskKeyword(normalized, keyword) && hasSubstantiveTask(normalized, keyword)
150032
150045
  );
150033
150046
  }
150034
150047
  function pathKindScore(path37, lens) {
@@ -150174,7 +150187,7 @@ function shouldShowLensSource(source, lens, task) {
150174
150187
  if (lens.id === "onboarding" || lens.id === "release" || lens.id === "docs") return score >= 40;
150175
150188
  return score > 0;
150176
150189
  }
150177
- var STOP_WORDS, LENSES, KEYWORDS, CONTINUATION_KEYWORDS, LENS_PRIORITY;
150190
+ var STOP_WORDS, LENSES, KEYWORDS, EXPLICIT_HANDOFF_KEYWORDS, AMBIGUOUS_CONTINUATION_KEYWORDS, TASK_FILLER_WORDS, TASK_FILLER_PHRASES, MIN_TASK_SUBSTANCE, LENS_PRIORITY;
150178
150191
  var init_task_lens = __esm({
150179
150192
  "src/codegraph/task-lens.ts"() {
150180
150193
  "use strict";
@@ -150295,18 +150308,31 @@ var init_task_lens = __esm({
150295
150308
  docs: ["doc", "docs", "readme", "\u6587\u6863", "\u8BF4\u660E"],
150296
150309
  test: ["coverage", "fixture", "smoke", "spec", "test", "tests", "testing", "vitest", "\u6D4B\u8BD5"]
150297
150310
  };
150298
- CONTINUATION_KEYWORDS = [
150311
+ EXPLICIT_HANDOFF_KEYWORDS = [
150312
+ "handoff",
150313
+ "hand off",
150314
+ "hand over",
150315
+ "previous session",
150316
+ "last session",
150317
+ "pick up where",
150318
+ "\u4EA4\u63A5",
150319
+ // 覆盖「任务交接」「工作交接」
150320
+ "\u63A5\u624B",
150321
+ "\u4E0A\u6B21\u4F1A\u8BDD",
150322
+ "\u4E0A\u6B21\u7684\u4F1A\u8BDD"
150323
+ ];
150324
+ AMBIGUOUS_CONTINUATION_KEYWORDS = [
150299
150325
  "continue",
150300
150326
  "resume",
150301
- "pick up",
150302
150327
  "carry on",
150303
- "previous session",
150328
+ "pick up",
150304
150329
  "\u7EE7\u7EED",
150305
- "\u63A5\u624B",
150306
150330
  "\u6062\u590D",
150307
- "\u5EF6\u7EED",
150308
- "\u4E0A\u6B21\u4F1A\u8BDD"
150331
+ "\u5EF6\u7EED"
150309
150332
  ];
150333
+ TASK_FILLER_WORDS = /\b(?:please|task|work|the|a|an)\b/giu;
150334
+ TASK_FILLER_PHRASES = /(?:吧|了|呢|啊|吗|嘛|呀|哦|噢|一下|一起|接着|请|帮我)/gu;
150335
+ MIN_TASK_SUBSTANCE = 2;
150310
150336
  LENS_PRIORITY = [
150311
150337
  "bugfix",
150312
150338
  "release",
@@ -158129,7 +158155,7 @@ var init_request_context = __esm({
158129
158155
  function getMcpServerInfo() {
158130
158156
  return {
158131
158157
  name: "memorix",
158132
- version: true ? "1.8.5" : "1.0.1"
158158
+ version: true ? "1.8.6" : "1.0.1"
158133
158159
  };
158134
158160
  }
158135
158161
  function createMcpDiscoverResult(capabilities, serverInfo) {
@@ -167333,6 +167359,8 @@ function getProjectConfigPath(agent, projectRoot) {
167333
167359
  return path33.join(projectRoot, ".agents", "hooks.json");
167334
167360
  case "gemini-cli":
167335
167361
  return path33.join(projectRoot, ".gemini", "settings.json");
167362
+ case "workbuddy":
167363
+ return "";
167336
167364
  default:
167337
167365
  return path33.join(projectRoot, ".memorix", "hooks.json");
167338
167366
  }
@@ -167366,6 +167394,8 @@ function getGlobalConfigPath(agent) {
167366
167394
  return path33.join(home, ".trae", "rules", "project_rules.md");
167367
167395
  case "dsh":
167368
167396
  return path33.join(process.env.DSH_HOME?.trim() || path33.join(home, ".dsh"), "AGENTS.md");
167397
+ case "workbuddy":
167398
+ return "";
167369
167399
  default:
167370
167400
  return path33.join(home, ".memorix", "hooks.json");
167371
167401
  }
@@ -167392,6 +167422,8 @@ function getAgentRulesPath(agent, root, global2 = false) {
167392
167422
  return path33.join(root, ".trae", "rules", "project_rules.md");
167393
167423
  case "dsh":
167394
167424
  return path33.join(process.env.DSH_HOME?.trim() || path33.join(root, ".dsh"), "AGENTS.md");
167425
+ case "workbuddy":
167426
+ return "";
167395
167427
  default:
167396
167428
  return path33.join(root, ".agent", "rules", "memorix.md");
167397
167429
  }
@@ -167418,6 +167450,8 @@ function getAgentRulesPath(agent, root, global2 = false) {
167418
167450
  return path33.join(root, ".trae", "rules", "project_rules.md");
167419
167451
  case "dsh":
167420
167452
  return path33.join(root, "AGENTS.md");
167453
+ case "workbuddy":
167454
+ return path33.join(root, "AGENTS.md");
167421
167455
  default:
167422
167456
  return path33.join(root, ".agent", "rules", "memorix.md");
167423
167457
  }
@@ -167506,6 +167540,11 @@ async function detectInstalledAgents() {
167506
167540
  agents.push("dsh");
167507
167541
  } catch {
167508
167542
  }
167543
+ try {
167544
+ await fs21.access(path33.join(home, ".workbuddy"));
167545
+ agents.push("workbuddy");
167546
+ } catch {
167547
+ }
167509
167548
  return agents;
167510
167549
  }
167511
167550
  async function installHooks(agent, projectRoot, global2 = false) {
@@ -167519,6 +167558,16 @@ async function installHooks(agent, projectRoot, global2 = false) {
167519
167558
  }
167520
167559
  };
167521
167560
  }
167561
+ if (agent === "workbuddy" && global2) {
167562
+ return {
167563
+ agent,
167564
+ configPath: "",
167565
+ events: [],
167566
+ generated: {
167567
+ note: "WorkBuddy has no hook system and no user-global guidance file \u2014 MCP only; no global guidance/hooks. Run `memorix setup --agent workbuddy` (without --global) to install project MCP config and AGENTS.md guidance."
167568
+ }
167569
+ };
167570
+ }
167522
167571
  if (global2 && getGlobalConfigPath(agent) === "") {
167523
167572
  return {
167524
167573
  agent,
@@ -167601,6 +167650,17 @@ async function installHooks(agent, projectRoot, global2 = false) {
167601
167650
  }
167602
167651
  };
167603
167652
  }
167653
+ case "workbuddy": {
167654
+ const rulesPath = await installAgentRules(agent, projectRoot, global2);
167655
+ return {
167656
+ agent,
167657
+ configPath: rulesPath,
167658
+ events: [],
167659
+ generated: {
167660
+ note: "WorkBuddy has no hook system \u2014 installed AGENTS.md guidance only; the MCP row is installed by `memorix setup --agent workbuddy`."
167661
+ }
167662
+ };
167663
+ }
167604
167664
  case "opencode": {
167605
167665
  const pluginContent = generateOpenCodePlugin();
167606
167666
  const pluginPath = global2 ? getGlobalConfigPath(agent) : getProjectConfigPath(agent, projectRoot);
@@ -167730,6 +167790,7 @@ async function installHooks(agent, projectRoot, global2 = false) {
167730
167790
  };
167731
167791
  }
167732
167792
  async function installAgentRules(agent, projectRoot, global2 = false) {
167793
+ if (agent === "workbuddy" && global2) return "";
167733
167794
  const rulesContent = getAgentRulesContent(agent, global2 ? "global" : "project");
167734
167795
  const rulesRoot = global2 ? os5.homedir() : projectRoot;
167735
167796
  const rulesPath = getAgentRulesPath(agent, rulesRoot, global2);
@@ -167895,6 +167956,9 @@ async function uninstallHooks(agent, projectRoot, global2 = false) {
167895
167956
  if (agent === "pi") {
167896
167957
  return false;
167897
167958
  }
167959
+ if (agent === "workbuddy") {
167960
+ return false;
167961
+ }
167898
167962
  if (global2 && getGlobalConfigPath(agent) === "") {
167899
167963
  return false;
167900
167964
  }
@@ -173353,7 +173417,7 @@ var init_serve_shared = __esm({
173353
173417
 
173354
173418
  // src/cli/version.ts
173355
173419
  function getCliVersion() {
173356
- return true ? "1.8.5" : pkg.version;
173420
+ return true ? "1.8.6" : pkg.version;
173357
173421
  }
173358
173422
  var init_version3 = __esm({
173359
173423
  "src/cli/version.ts"() {
@@ -4,6 +4,24 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [1.8.6] - 2026-09-01
8
+
9
+ ### Added
10
+ - **WorkBuddy integration (#204)** -- adds project and user-level MCP setup,
11
+ project `AGENTS.md` guidance, safe no-op behavior for WorkBuddy's absent
12
+ hooks surface, and uninstall discovery. Thanks to @wjxn13 for the original
13
+ implementation and follow-up fixes; the contributor commits remain in the
14
+ merge history.
15
+
16
+ ### Fixed
17
+ - **Continuation intent (#266)** -- a bare `继续`, `continue`, or `resume`
18
+ no longer triggers an expensive prior-work brief, while short substantive
19
+ requests such as `继续修复`, `resume bug`, and `继续 API` still receive
20
+ continuity context. Explicit handoff vocabulary remains supported. Thanks
21
+ to @Tom-Ma-Ming for the original fix and regression cases.
22
+ - **Star History assets** -- refreshed the self-hosted chart data and light /
23
+ dark SVG assets.
24
+
7
25
  ## [1.8.5] - 2026-08-30
8
26
 
9
27
  ### Fixed
package/dist/sdk.js CHANGED
@@ -149956,6 +149956,15 @@ __export(task_lens_exports, {
149956
149956
  scoreLensSource: () => scoreLensSource,
149957
149957
  shouldShowLensSource: () => shouldShowLensSource
149958
149958
  });
149959
+ function hasSubstantiveTask(text2, keyword) {
149960
+ const withoutKeyword = text2.replace(
149961
+ new RegExp(keyword.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "gi"),
149962
+ " "
149963
+ );
149964
+ const residual = withoutKeyword.replace(TASK_FILLER_WORDS, " ").replace(TASK_FILLER_PHRASES, " ").replace(/[\s\p{P}]/gu, "");
149965
+ if (/^(?:任务|工作|一下|一起|接着)$/u.test(residual)) return false;
149966
+ return Array.from(residual).length >= MIN_TASK_SUBSTANCE;
149967
+ }
149959
149968
  function normalizePath2(path35) {
149960
149969
  return path35.replace(/\\/g, "/");
149961
149970
  }
@@ -150015,8 +150024,12 @@ function resolveTaskLens(task) {
150015
150024
  }
150016
150025
  function isContinuationTask(task) {
150017
150026
  const normalized = (task ?? "").trim().toLowerCase();
150018
- return normalized.length > 0 && CONTINUATION_KEYWORDS.some(
150019
- (keyword) => containsTaskKeyword(normalized, keyword)
150027
+ if (normalized.length === 0) return false;
150028
+ if (EXPLICIT_HANDOFF_KEYWORDS.some((keyword) => containsTaskKeyword(normalized, keyword))) {
150029
+ return true;
150030
+ }
150031
+ return AMBIGUOUS_CONTINUATION_KEYWORDS.some(
150032
+ (keyword) => containsTaskKeyword(normalized, keyword) && hasSubstantiveTask(normalized, keyword)
150020
150033
  );
150021
150034
  }
150022
150035
  function pathKindScore(path35, lens) {
@@ -150162,7 +150175,7 @@ function shouldShowLensSource(source, lens, task) {
150162
150175
  if (lens.id === "onboarding" || lens.id === "release" || lens.id === "docs") return score >= 40;
150163
150176
  return score > 0;
150164
150177
  }
150165
- var STOP_WORDS, LENSES, KEYWORDS, CONTINUATION_KEYWORDS, LENS_PRIORITY;
150178
+ var STOP_WORDS, LENSES, KEYWORDS, EXPLICIT_HANDOFF_KEYWORDS, AMBIGUOUS_CONTINUATION_KEYWORDS, TASK_FILLER_WORDS, TASK_FILLER_PHRASES, MIN_TASK_SUBSTANCE, LENS_PRIORITY;
150166
150179
  var init_task_lens = __esm({
150167
150180
  "src/codegraph/task-lens.ts"() {
150168
150181
  "use strict";
@@ -150283,18 +150296,31 @@ var init_task_lens = __esm({
150283
150296
  docs: ["doc", "docs", "readme", "\u6587\u6863", "\u8BF4\u660E"],
150284
150297
  test: ["coverage", "fixture", "smoke", "spec", "test", "tests", "testing", "vitest", "\u6D4B\u8BD5"]
150285
150298
  };
150286
- CONTINUATION_KEYWORDS = [
150299
+ EXPLICIT_HANDOFF_KEYWORDS = [
150300
+ "handoff",
150301
+ "hand off",
150302
+ "hand over",
150303
+ "previous session",
150304
+ "last session",
150305
+ "pick up where",
150306
+ "\u4EA4\u63A5",
150307
+ // 覆盖「任务交接」「工作交接」
150308
+ "\u63A5\u624B",
150309
+ "\u4E0A\u6B21\u4F1A\u8BDD",
150310
+ "\u4E0A\u6B21\u7684\u4F1A\u8BDD"
150311
+ ];
150312
+ AMBIGUOUS_CONTINUATION_KEYWORDS = [
150287
150313
  "continue",
150288
150314
  "resume",
150289
- "pick up",
150290
150315
  "carry on",
150291
- "previous session",
150316
+ "pick up",
150292
150317
  "\u7EE7\u7EED",
150293
- "\u63A5\u624B",
150294
150318
  "\u6062\u590D",
150295
- "\u5EF6\u7EED",
150296
- "\u4E0A\u6B21\u4F1A\u8BDD"
150319
+ "\u5EF6\u7EED"
150297
150320
  ];
150321
+ TASK_FILLER_WORDS = /\b(?:please|task|work|the|a|an)\b/giu;
150322
+ TASK_FILLER_PHRASES = /(?:吧|了|呢|啊|吗|嘛|呀|哦|噢|一下|一起|接着|请|帮我)/gu;
150323
+ MIN_TASK_SUBSTANCE = 2;
150298
150324
  LENS_PRIORITY = [
150299
150325
  "bugfix",
150300
150326
  "release",
@@ -163238,6 +163264,8 @@ function getProjectConfigPath(agent, projectRoot) {
163238
163264
  return path33.join(projectRoot, ".agents", "hooks.json");
163239
163265
  case "gemini-cli":
163240
163266
  return path33.join(projectRoot, ".gemini", "settings.json");
163267
+ case "workbuddy":
163268
+ return "";
163241
163269
  default:
163242
163270
  return path33.join(projectRoot, ".memorix", "hooks.json");
163243
163271
  }
@@ -163271,6 +163299,8 @@ function getGlobalConfigPath(agent) {
163271
163299
  return path33.join(home, ".trae", "rules", "project_rules.md");
163272
163300
  case "dsh":
163273
163301
  return path33.join(process.env.DSH_HOME?.trim() || path33.join(home, ".dsh"), "AGENTS.md");
163302
+ case "workbuddy":
163303
+ return "";
163274
163304
  default:
163275
163305
  return path33.join(home, ".memorix", "hooks.json");
163276
163306
  }
@@ -163297,6 +163327,8 @@ function getAgentRulesPath(agent, root, global2 = false) {
163297
163327
  return path33.join(root, ".trae", "rules", "project_rules.md");
163298
163328
  case "dsh":
163299
163329
  return path33.join(process.env.DSH_HOME?.trim() || path33.join(root, ".dsh"), "AGENTS.md");
163330
+ case "workbuddy":
163331
+ return "";
163300
163332
  default:
163301
163333
  return path33.join(root, ".agent", "rules", "memorix.md");
163302
163334
  }
@@ -163323,6 +163355,8 @@ function getAgentRulesPath(agent, root, global2 = false) {
163323
163355
  return path33.join(root, ".trae", "rules", "project_rules.md");
163324
163356
  case "dsh":
163325
163357
  return path33.join(root, "AGENTS.md");
163358
+ case "workbuddy":
163359
+ return path33.join(root, "AGENTS.md");
163326
163360
  default:
163327
163361
  return path33.join(root, ".agent", "rules", "memorix.md");
163328
163362
  }
@@ -163411,6 +163445,11 @@ async function detectInstalledAgents() {
163411
163445
  agents.push("dsh");
163412
163446
  } catch {
163413
163447
  }
163448
+ try {
163449
+ await fs21.access(path33.join(home, ".workbuddy"));
163450
+ agents.push("workbuddy");
163451
+ } catch {
163452
+ }
163414
163453
  return agents;
163415
163454
  }
163416
163455
  async function installHooks(agent, projectRoot, global2 = false) {
@@ -163424,6 +163463,16 @@ async function installHooks(agent, projectRoot, global2 = false) {
163424
163463
  }
163425
163464
  };
163426
163465
  }
163466
+ if (agent === "workbuddy" && global2) {
163467
+ return {
163468
+ agent,
163469
+ configPath: "",
163470
+ events: [],
163471
+ generated: {
163472
+ note: "WorkBuddy has no hook system and no user-global guidance file \u2014 MCP only; no global guidance/hooks. Run `memorix setup --agent workbuddy` (without --global) to install project MCP config and AGENTS.md guidance."
163473
+ }
163474
+ };
163475
+ }
163427
163476
  if (global2 && getGlobalConfigPath(agent) === "") {
163428
163477
  return {
163429
163478
  agent,
@@ -163506,6 +163555,17 @@ async function installHooks(agent, projectRoot, global2 = false) {
163506
163555
  }
163507
163556
  };
163508
163557
  }
163558
+ case "workbuddy": {
163559
+ const rulesPath = await installAgentRules(agent, projectRoot, global2);
163560
+ return {
163561
+ agent,
163562
+ configPath: rulesPath,
163563
+ events: [],
163564
+ generated: {
163565
+ note: "WorkBuddy has no hook system \u2014 installed AGENTS.md guidance only; the MCP row is installed by `memorix setup --agent workbuddy`."
163566
+ }
163567
+ };
163568
+ }
163509
163569
  case "opencode": {
163510
163570
  const pluginContent = generateOpenCodePlugin();
163511
163571
  const pluginPath = global2 ? getGlobalConfigPath(agent) : getProjectConfigPath(agent, projectRoot);
@@ -163635,6 +163695,7 @@ async function installHooks(agent, projectRoot, global2 = false) {
163635
163695
  };
163636
163696
  }
163637
163697
  async function installAgentRules(agent, projectRoot, global2 = false) {
163698
+ if (agent === "workbuddy" && global2) return "";
163638
163699
  const rulesContent = getAgentRulesContent(agent, global2 ? "global" : "project");
163639
163700
  const rulesRoot = global2 ? os5.homedir() : projectRoot;
163640
163701
  const rulesPath = getAgentRulesPath(agent, rulesRoot, global2);
@@ -163800,6 +163861,9 @@ async function uninstallHooks(agent, projectRoot, global2 = false) {
163800
163861
  if (agent === "pi") {
163801
163862
  return false;
163802
163863
  }
163864
+ if (agent === "workbuddy") {
163865
+ return false;
163866
+ }
163803
163867
  if (global2 && getGlobalConfigPath(agent) === "") {
163804
163868
  return false;
163805
163869
  }
@@ -167834,7 +167898,7 @@ var MCP_SERVER_INFO_META_KEY = "io.modelcontextprotocol/serverInfo";
167834
167898
  function getMcpServerInfo() {
167835
167899
  return {
167836
167900
  name: "memorix",
167837
- version: true ? "1.8.5" : "1.0.1"
167901
+ version: true ? "1.8.6" : "1.0.1"
167838
167902
  };
167839
167903
  }
167840
167904
  function createMcpDiscoverResult(capabilities, serverInfo) {
package/dist/types.d.ts CHANGED
@@ -608,7 +608,7 @@ interface MemoryRef {
608
608
  /** MCP config format adapter interface */
609
609
  interface MCPConfigAdapter {
610
610
  /** Setup-only adapters may support a host that does not participate in workspace sync. */
611
- readonly source: AgentTarget | 'codebuddy' | 'dsh';
611
+ readonly source: AgentTarget | 'codebuddy' | 'dsh' | 'workbuddy';
612
612
  /** Parse MCP server entries from a config file */
613
613
  parse(content: string): MCPServerEntry[];
614
614
  /** Generate config file content from MCP server entries */
@@ -150,7 +150,7 @@ feedback projection.
150
150
  ### MCP Compatibility
151
151
 
152
152
  Legacy clients use stateful Streamable HTTP with `Mcp-Session-Id` and the
153
- 2025-era `initialize` handshake. The 1.8.5 stdio server starts a bounded
153
+ 2025-era `initialize` handshake. The 1.8.6 stdio server starts a bounded
154
154
  newline-delimited JSON-RPC gate before project initialization: it answers the
155
155
  2026-07-28 `server/discover` request before `initialize`, then replays other
156
156
  requests, notifications, and responses in order into the pinned SDK transport.
@@ -13,8 +13,8 @@ Memorix is a TypeScript project built around:
13
13
 
14
14
  ## Current Development Baseline
15
15
 
16
- The current release work targets the **1.8.5 release line** and package metadata
17
- is kept at `1.8.5` for this release commit.
16
+ The current release work targets the **1.8.6 release line** and package metadata
17
+ is kept at `1.8.6` for this release commit.
18
18
 
19
19
  Contributors should assume the following areas are part of the current release line:
20
20
 
@@ -64,6 +64,7 @@ Generated guidance also has scope:
64
64
  | Antigravity | `memorix setup --agent antigravity --global` | **Primary supported target** | Plugin under `~/.gemini/config/plugins/memorix` or `.agents/plugins/memorix`, with `plugin.json`, `mcp_config.json`, `hooks.json`, rules, and skills | Uses Antigravity's official plugin layout. Dedicated MCP configs live at `~/.gemini/config/mcp_config.json` or `.agents/mcp_config.json`; legacy Gemini settings are read only for compatibility. |
65
65
  | Trae | `memorix setup --agent trae --global` | Trae MCP/rules config | MCP config and `.trae/rules/project_rules.md` | Current support is MCP plus project rules. |
66
66
  | DeepSeek Harness | `memorix setup --agent dsh --global` | DeepSeek Harness MCP patch | Memorix `@deepseek-ai/dsh-mcp-client` row in `$DSH_HOME/cordis.patch.yml` (default `~/.dsh/cordis.patch.yml`), guidance in the harness `AGENTS.md`, and official skills under `$DSH_HOME/skills` | Tools appear as `mcp__memorix__*`. No hooks surface. Project-local setup writes project `AGENTS.md` guidance and `.dsh/skills`; the MCP row always lives in the harness-level patch file. |
67
+ | WorkBuddy | `memorix setup --agent workbuddy [--global]` | WorkBuddy MCP config | Memorix MCP server row in `<project>/.workbuddy/mcp.json` (project install) or `~/.workbuddy/mcp.json` (global), plus `AGENTS.md` guidance | Tools appear as `mcp__memorix__*`. No hooks surface. |
67
68
  | memcode | `memorix` or `memcode` | Bundled terminal agent | Built-in Memorix memory access | memcode uses the same project memory pool; it is not a separate memory silo. |
68
69
  | Any MCP client | Manual MCP config | MCP stdio or HTTP | `memorix serve` or `memorix background start` | Use stdio first unless you need a shared HTTP endpoint. |
69
70
 
package/docs/MODULES.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Memorix 模块详解
2
2
 
3
- > 最后更新: 2026-08-30(当前发布线 v1.8.5)
3
+ > 最后更新: 2026-09-01(当前发布线 v1.8.6)
4
4
  > 本文档记录当前模块边界、关键算法和兼容层,不把历史实现误写成运行时主路径。
5
5
 
6
6
  > 当前真实主路径先看下面的模块总览,再看各模块的细节。早期 JSON/Orama
package/docs/README.md CHANGED
@@ -95,7 +95,7 @@ The public docs are organized by user intent:
95
95
  | 1.2 honest Lite and optional semantic CodeGraph provider contract | [1.2 Provider Quality](1.2.0-PROVIDER-QUALITY.md) |
96
96
  | 1.3 long-term memory model, source boundary, and lifecycle | [1.3 Memory Architecture](1.3-MEMORY-ARCHITECTURE.md) |
97
97
  | Active context-control work | [1.2.2 Memory Control Plane](1.2.2-MEMORY-CONTROL-PLANE.md) |
98
- | 1.8.5 MCP compatibility acceptance contract | [1.8.0 Release Specification](1.8.0-RELEASE-CANDIDATE-SPEC.md) |
98
+ | 1.8.6 MCP compatibility acceptance contract | [1.8.0 Release Specification](1.8.0-RELEASE-CANDIDATE-SPEC.md) |
99
99
  | Historical cloud sync and multi-agent research | [CLOUD_SYNC_AND_MULTI_AGENT_RESEARCH.md](CLOUD_SYNC_AND_MULTI_AGENT_RESEARCH.md) |
100
100
  | Known issues and old roadmap notes | [KNOWN_ISSUES_AND_ROADMAP.md](KNOWN_ISSUES_AND_ROADMAP.md) |
101
101
 
@@ -123,7 +123,7 @@ Historical/deep-reference documents may describe older designs. If they conflict
123
123
 
124
124
  ## Current Product Line
125
125
 
126
- The current product line is **1.8.5**. The authoritative acceptance contract is
126
+ The current product line is **1.8.6**. The authoritative acceptance contract is
127
127
  [1.8.0 Release Specification](1.8.0-RELEASE-CANDIDATE-SPEC.md).
128
128
  The current baseline has:
129
129
 
@@ -142,7 +142,7 @@ The current baseline has:
142
142
  - `~/.memorix/config.toml` and project `memorix.toml` are the user-facing configuration model
143
143
  - legacy `memorix.yml`, `.env`, and `config.json` files are still read for compatibility, but new setups should use TOML
144
144
 
145
- For MCP compatibility, 1.8.5 preserves legacy 2025-era initialize and
145
+ For MCP compatibility, 1.8.6 preserves legacy 2025-era initialize and
146
146
  stateful Streamable HTTP behavior. `memorix serve` starts a bounded stdio
147
147
  startup gate: pre-initialize 2026-07-28 `server/discover` is answered with a
148
148
  complete discovery result, and other early JSON-RPC messages replay in order
package/docs/SETUP.md CHANGED
@@ -683,6 +683,7 @@ Common MCP config locations:
683
683
  | Oh-my-Pi | `.omp/mcp.json` or `~/.omp/agent/mcp.json` |
684
684
  | Trae | `%APPDATA%/Trae/User/mcp.json` on Windows |
685
685
  | DeepSeek Harness | `$DSH_HOME/cordis.patch.yml` (default `~/.dsh/cordis.patch.yml`) |
686
+ | WorkBuddy | `~/.workbuddy/mcp.json` (user) or `<project>/.workbuddy/mcp.json` (project) |
686
687
 
687
688
  ---
688
689
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "memorix",
3
3
  "mcpName": "io.github.AVIDS2/memorix",
4
- "version": "1.8.5",
4
+ "version": "1.8.6",
5
5
  "description": "Local-first shared memory layer for AI coding agents across MCP clients, Git history, reasoning context, and project sessions.",
6
6
  "type": "module",
7
7
  "sideEffects": false,
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "name": "memorix",
3
- "version": "1.8.5"
3
+ "version": "1.8.6"
4
4
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://anthropic.com/claude-code/plugin.schema.json",
3
3
  "name": "memorix",
4
- "version": "1.8.5",
4
+ "version": "1.8.6",
5
5
  "description": "Shared workspace memory for Claude Code and other AI coding agents.",
6
6
  "author": {
7
7
  "name": "AVIDS2",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memorix",
3
- "version": "1.8.5",
3
+ "version": "1.8.6",
4
4
  "description": "Local-first project memory for CodeBuddy Code and other coding agents.",
5
5
  "author": {
6
6
  "name": "AVIDS2",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memorix",
3
- "version": "1.8.5",
3
+ "version": "1.8.6",
4
4
  "description": "Shared workspace memory for Codex and other AI coding agents.",
5
5
  "author": {
6
6
  "name": "AVIDS2",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memorix",
3
- "version": "1.8.5",
3
+ "version": "1.8.6",
4
4
  "description": "Shared local workspace memory for GitHub Copilot CLI and other AI coding agents.",
5
5
  "author": {
6
6
  "name": "AVIDS2",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memorix",
3
- "version": "1.8.5",
3
+ "version": "1.8.6",
4
4
  "mcpServers": {
5
5
  "memorix": {
6
6
  "command": "memorix",
@@ -1,5 +1,5 @@
1
1
  name: memorix
2
- version: "1.8.5"
2
+ version: "1.8.6"
3
3
  description: Shared workspace memory bridge for Hermes Agent.
4
4
  author: AVIDS2
5
5
  license: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memorix-omp-package",
3
- "version": "1.8.5",
3
+ "version": "1.8.6",
4
4
  "description": "Memorix shared workspace memory package for Oh-my-Pi.",
5
5
  "license": "Apache-2.0",
6
6
  "keywords": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memorix",
3
- "version": "1.8.5",
3
+ "version": "1.8.6",
4
4
  "description": "Shared workspace memory for OpenClaw and other AI coding agents.",
5
5
  "author": {
6
6
  "name": "AVIDS2",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memorix-pi-package",
3
- "version": "1.8.5",
3
+ "version": "1.8.6",
4
4
  "description": "Memorix shared workspace memory package for Pi coding agent.",
5
5
  "license": "Apache-2.0",
6
6
  "keywords": [
package/server.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "url": "https://github.com/AVIDS2/memorix",
8
8
  "source": "github"
9
9
  },
10
- "version": "1.8.5",
10
+ "version": "1.8.6",
11
11
  "websiteUrl": "https://github.com/AVIDS2/memorix#readme",
12
12
  "icons": [
13
13
  {
@@ -22,7 +22,7 @@
22
22
  {
23
23
  "registryType": "npm",
24
24
  "identifier": "memorix",
25
- "version": "1.8.5",
25
+ "version": "1.8.6",
26
26
  "runtimeHint": "npx",
27
27
  "packageArguments": [
28
28
  {
@@ -125,6 +125,7 @@ const GUIDANCE_AGENTS = new Set<AgentName>([
125
125
  'opencode',
126
126
  'trae',
127
127
  'dsh',
128
+ 'workbuddy',
128
129
  ]);
129
130
 
130
131
  const CODEX_PLUGIN_NAME = 'memorix';
@@ -115,8 +115,14 @@ async function installSingleAgent(agent: string, cwd: string, global: boolean):
115
115
  cwd,
116
116
  global,
117
117
  );
118
- console.log(`[OK] ${agent}: hooks installed -> ${config.configPath}`);
118
+ const note = (config.generated as Record<string, unknown>)?.note;
119
+ if (config.configPath) {
120
+ console.log(`[OK] ${agent}: hooks installed -> ${config.configPath}`);
121
+ } else {
122
+ console.log(`[OK] ${agent}: no hooks installed at this scope (MCP-only integration)`);
123
+ }
119
124
  console.log(` Events: ${config.events.join(', ')}`);
125
+ if (!config.configPath && note) console.log(` Note: ${note}`);
120
126
 
121
127
  // Copilot on Windows without pwsh: warn about runtime compatibility
122
128
  if (agent === 'copilot' && process.platform === 'win32') {
@@ -136,7 +142,6 @@ async function installSingleAgent(agent: string, cwd: string, global: boolean):
136
142
 
137
143
  // Copilot global not supported
138
144
  if (agent === 'copilot' && global) {
139
- const note = (config.generated as Record<string, unknown>)?.note;
140
145
  if (note) console.warn(`[WARN] ${note}`);
141
146
  }
142
147
  } catch (err) {
@@ -160,6 +165,7 @@ function getAgentLabel(agent: string): string {
160
165
  omp: 'Oh-my-Pi',
161
166
  trae: 'Trae',
162
167
  dsh: 'DeepSeek Harness',
168
+ workbuddy: 'WorkBuddy',
163
169
  };
164
170
  return labels[agent] || agent;
165
171
  }
@@ -179,6 +185,7 @@ function getAgentHint(agent: string): string {
179
185
  omp: 'Oh-my-Pi package hooks; use `memorix setup --agent omp`',
180
186
  trae: '.trae/rules/project_rules.md (rules only, no hooks system)',
181
187
  dsh: '~/.dsh/cordis.patch.yml MCP row via `memorix setup --agent dsh` (no hooks system)',
188
+ workbuddy: '~/.workbuddy/mcp.json MCP row via `memorix setup --agent workbuddy` (no hooks system)',
182
189
  codex: 'Codex plugin hooks; use `memorix setup --agent codex`',
183
190
  };
184
191
  return hints[agent] || '';