memorix 1.8.4 → 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 (88) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/CLAUDE.md +3 -0
  3. package/README.md +8 -6
  4. package/README.zh-CN.md +5 -3
  5. package/assets/star-history-dark.svg +5 -5
  6. package/assets/star-history-light.svg +5 -5
  7. package/assets/star-history.json +35 -5
  8. package/dist/cli/index.js +1848 -754
  9. package/dist/dashboard/static/app.js +29 -885
  10. package/dist/dashboard/static/index.html +1 -5
  11. package/dist/dashboard/static/style.css +36 -503
  12. package/dist/index.d.ts +4 -4
  13. package/dist/index.js +286 -79
  14. package/dist/memcode/index.js +28035 -169
  15. package/dist/memcode-runtime/CHANGELOG.md +52 -0
  16. package/dist/sdk.js +103 -21
  17. package/dist/types.d.ts +1 -1
  18. package/docs/1.8.0-RELEASE-CANDIDATE-SPEC.md +22 -16
  19. package/docs/AGENT_OPERATOR_PLAYBOOK.md +2 -2
  20. package/docs/API_REFERENCE.md +10 -8
  21. package/docs/DASHBOARD.md +23 -0
  22. package/docs/DEVELOPMENT.md +2 -2
  23. package/docs/DOCKER.md +6 -3
  24. package/docs/INTEGRATIONS.md +2 -1
  25. package/docs/MODULES.md +46 -20
  26. package/docs/PERFORMANCE.md +1 -1
  27. package/docs/README.md +8 -7
  28. package/docs/SETUP.md +4 -3
  29. package/package.json +11 -11
  30. package/plugins/antigravity/memorix/plugin.json +1 -1
  31. package/plugins/antigravity/memorix/rules/memorix.md +5 -0
  32. package/plugins/claude/memorix/.claude-plugin/plugin.json +1 -1
  33. package/plugins/claude/memorix/skills/memorix-memory/SKILL.md +3 -0
  34. package/plugins/claude/memorix/skills/memorix-mini-skills/SKILL.md +2 -0
  35. package/plugins/claude/memorix/skills/memorix-orchestrate/SKILL.md +2 -0
  36. package/plugins/codebuddy/memorix/.codebuddy-plugin/plugin.json +1 -1
  37. package/plugins/codebuddy/memorix/skills/memorix-memory/SKILL.md +3 -0
  38. package/plugins/codebuddy/memorix/skills/memorix-mini-skills/SKILL.md +2 -0
  39. package/plugins/codebuddy/memorix/skills/memorix-orchestrate/SKILL.md +2 -0
  40. package/plugins/codex/memorix/.codex-plugin/plugin.json +1 -1
  41. package/plugins/codex/memorix/skills/memorix-memory/SKILL.md +3 -0
  42. package/plugins/codex/memorix/skills/memorix-mini-skills/SKILL.md +2 -0
  43. package/plugins/codex/memorix/skills/memorix-orchestrate/SKILL.md +2 -0
  44. package/plugins/copilot/memorix/plugin.json +1 -1
  45. package/plugins/copilot/memorix/skills/memorix-memory/SKILL.md +3 -0
  46. package/plugins/copilot/memorix/skills/memorix-mini-skills/SKILL.md +2 -0
  47. package/plugins/copilot/memorix/skills/memorix-orchestrate/SKILL.md +2 -0
  48. package/plugins/cursor/memorix/skills/memorix-memory/SKILL.md +3 -0
  49. package/plugins/cursor/memorix/skills/memorix-mini-skills/SKILL.md +2 -0
  50. package/plugins/cursor/memorix/skills/memorix-orchestrate/SKILL.md +2 -0
  51. package/plugins/gemini/memorix/GEMINI.md +5 -0
  52. package/plugins/gemini/memorix/gemini-extension.json +1 -1
  53. package/plugins/hermes/memorix/plugin.yaml +7 -1
  54. package/plugins/omp/memorix/package.json +1 -1
  55. package/plugins/openclaw/memorix/.codex-plugin/plugin.json +1 -1
  56. package/plugins/pi/memorix/package.json +1 -1
  57. package/plugins/pi/memorix/skills/memorix-memory/SKILL.md +3 -0
  58. package/plugins/pi/memorix/skills/memorix-mini-skills/SKILL.md +2 -0
  59. package/plugins/pi/memorix/skills/memorix-orchestrate/SKILL.md +2 -0
  60. package/server.json +2 -2
  61. package/src/cli/command-guide.ts +52 -1
  62. package/src/cli/commands/agent-integrations.ts +1 -0
  63. package/src/cli/commands/background.ts +166 -6
  64. package/src/cli/commands/hooks-install.ts +9 -2
  65. package/src/cli/commands/hooks-preview.ts +5 -0
  66. package/src/cli/commands/integrate.ts +2 -0
  67. package/src/cli/commands/serve-http.ts +73 -80
  68. package/src/cli/commands/serve.ts +95 -93
  69. package/src/cli/commands/setup.ts +11 -1
  70. package/src/cli/commands/uninstall.ts +24 -2
  71. package/src/cli/index.ts +1 -1
  72. package/src/codegraph/task-lens.ts +72 -7
  73. package/src/dashboard/static/index.html +1 -5
  74. package/src/dashboard/static/style.css +36 -503
  75. package/src/hooks/installers/index.ts +58 -0
  76. package/src/hooks/official-skills.ts +13 -6
  77. package/src/hooks/types.ts +2 -0
  78. package/src/integrations/registry.ts +9 -0
  79. package/src/memory/graph.ts +2 -2
  80. package/src/server/mcp-diagnostics.ts +9 -7
  81. package/src/server/modern-mcp-bridge.ts +108 -0
  82. package/src/server/stdio-startup-gate.ts +41 -2
  83. package/src/server/tool-profile.ts +7 -6
  84. package/src/server.ts +1 -1
  85. package/src/store/orama-store.ts +2 -2
  86. package/src/types.ts +1 -1
  87. package/src/wiki/types.ts +2 -2
  88. package/src/workspace/mcp-adapters/workbuddy.ts +71 -0
@@ -4,6 +4,58 @@ 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
+
25
+ ## [1.8.5] - 2026-08-30
26
+
27
+ ### Fixed
28
+ - **Modern MCP transport** -- `memorix serve` and the HTTP control plane now
29
+ use the official MCP v2 server path for 2026-07-28 discovery, request
30
+ metadata, result envelopes, response metadata, stateless requests, and the
31
+ subscriptions listen surface while forwarding business tools through the
32
+ existing Memorix implementation.
33
+ - **Background start race (#259)** -- background startup now holds an
34
+ exclusive, heartbeating lock across the check/spawn/readiness window. Lock
35
+ contention fails closed with a retry message instead of starting an unlocked
36
+ duplicate control plane; stale dead-owner locks are recoverable.
37
+ - **Windows and EOF behavior** -- stdio discovery remains compatible before
38
+ and after readiness, roots-based project switching and deferred maintenance
39
+ are preserved, and stdin EOF closes the official transport cleanly.
40
+ - **Local build reliability** -- the large runtime, CLI, and memcode bundles
41
+ build sequentially, reducing Windows memory pressure without changing
42
+ published entry points. Slow CLI uninstall tests now use asynchronous,
43
+ hidden child processes so the full test run exits cleanly.
44
+ - **Time-stable graph evaluation** -- graph-context fixtures pin their
45
+ reference date so retention policy changes do not make the test depend on the
46
+ calendar.
47
+
48
+ ### MCP Compatibility Boundary
49
+ - Modern Tasks are explicitly unsupported because Memorix does not expose a
50
+ durable task store for MCP task semantics.
51
+ - List responses expose a private zero-TTL protocol hint; Memorix does not
52
+ claim a reusable server-side list cache.
53
+ - The external `@hasmcp/mcp-spec-test` runner currently fails on this Windows
54
+ host before reaching the target because it imports drive-letter paths as ESM
55
+ URLs. Production verification therefore includes official v2 direct tests,
56
+ real stdio/HTTP smoke, and the legacy compatibility path; this external
57
+ runner result is not reported as a pass.
58
+
7
59
  ## [1.8.4] - 2026-08-27
8
60
 
9
61
  ### 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",
@@ -162443,6 +162469,9 @@ var init_official_skills = __esm({
162443
162469
  '| Specific past decision, bug, file, or change | `memorix_search` | `memorix memory search --query "<topic>"` |',
162444
162470
  "| Need the full source for a search hit | `memorix_detail` | `memorix memory detail --id <id>` |",
162445
162471
  "| Need the sequence around one memory | `memorix_timeline` | `memorix memory timeline --id <id>` |",
162472
+ "| Check source and freshness for a memory | `memorix_evidence` | `memorix evidence list|get|events` |",
162473
+ "| Record whether a memory helped, conflicted, or was corrected | `memorix_feedback` | `memorix feedback record|show|audit` |",
162474
+ "| Inspect or import controlled media | `memorix_media` | `memorix media import|attach|list|show|status` |",
162446
162475
  '| Learned reusable project knowledge | `memorix_store` | `memorix memory store --type <type> --entity <name> --title "<title>" "<text>"` |',
162447
162476
  "| Task or bug is complete/outdated | `memorix_resolve` | `memorix memory resolve --ids <ids>` |",
162448
162477
  "",
@@ -162573,6 +162602,8 @@ var init_official_skills = __esm({
162573
162602
  "",
162574
162603
  "Promote memories into mini-skills only when they are reusable instructions, not just historical notes.",
162575
162604
  "",
162605
+ "The standard setup uses the `lite` MCP profile. `memorix_skills` and `memorix_promote` are full-profile tools, so use the CLI fallback unless the current server was explicitly started with `MEMORIX_MODE=full` or `--mode full`. Do not probe hidden MCP tools repeatedly.",
162606
+ "",
162576
162607
  "## Tool Router",
162577
162608
  "",
162578
162609
  "| Situation | Prefer | CLI fallback |",
@@ -162608,15 +162639,17 @@ var init_official_skills = __esm({
162608
162639
  "| Situation | Prefer | CLI fallback |",
162609
162640
  "|---|---|---|",
162610
162641
  '| Run managed subagent execution | CLI | `memorix orchestrate --goal "<goal>" --agents claude:1,codex:1` |',
162611
- "| Register coordination identity | `team_manage` action `join` | `memorix team join --agentType <agent>` |",
162612
- "| Create or inspect tasks | `team_task` | `memorix task create|list|claim|complete` |",
162613
- "| Send or read coordination messages | `team_message` | `memorix message send|broadcast|inbox` |",
162614
- "| Share structured handoff | `memorix_handoff` | `memorix handoff send` |",
162615
- "| Avoid file conflicts | `team_file_lock` | `memorix lock lock|unlock|status` |",
162616
- "| Poll joined coordination state | `memorix_poll` | `memorix poll` |",
162642
+ "| Register coordination identity when team MCP tools are available | `team_manage` action `join` | `memorix team join --agentType <agent>` |",
162643
+ "| Create or inspect tasks when team MCP tools are available | `team_task` | `memorix task create|list|claim|complete` |",
162644
+ "| Send or read coordination messages when team MCP tools are available | `team_message` | `memorix message send|broadcast|inbox` |",
162645
+ "| Share structured handoff when team MCP tools are available | `memorix_handoff` | `memorix handoff send` |",
162646
+ "| Avoid file conflicts when team MCP tools are available | `team_file_lock` | `memorix lock lock|unlock|status` |",
162647
+ "| Poll joined coordination state when team MCP tools are available | `memorix_poll` | `memorix poll` |",
162617
162648
  "",
162618
162649
  "## Boundaries",
162619
162650
  "",
162651
+ "The standard setup uses the `lite` MCP profile. Coordination MCP tools are exposed only by `team` or `full`; use the CLI fallback for ordinary installations, or explicitly start the server with `--mode team`. Do not probe unavailable team tools in a loop.",
162652
+ "",
162620
162653
  "- For ordinary memory, do not join coordination state.",
162621
162654
  "- For production multi-agent execution, prefer `memorix orchestrate` so the main process owns planning, dispatch, retries, and verification gates.",
162622
162655
  "- `memorix orchestrate` uses the current checkout for single-worker runs and task worktrees for parallel runs. Use `--isolated` to force worktree isolation, `--no-worktree` to disable it, `--allow-dirty` to run with uncommitted changes, and `--no-auto-merge` to preserve task worktrees for manual review.",
@@ -163231,6 +163264,8 @@ function getProjectConfigPath(agent, projectRoot) {
163231
163264
  return path33.join(projectRoot, ".agents", "hooks.json");
163232
163265
  case "gemini-cli":
163233
163266
  return path33.join(projectRoot, ".gemini", "settings.json");
163267
+ case "workbuddy":
163268
+ return "";
163234
163269
  default:
163235
163270
  return path33.join(projectRoot, ".memorix", "hooks.json");
163236
163271
  }
@@ -163264,6 +163299,8 @@ function getGlobalConfigPath(agent) {
163264
163299
  return path33.join(home, ".trae", "rules", "project_rules.md");
163265
163300
  case "dsh":
163266
163301
  return path33.join(process.env.DSH_HOME?.trim() || path33.join(home, ".dsh"), "AGENTS.md");
163302
+ case "workbuddy":
163303
+ return "";
163267
163304
  default:
163268
163305
  return path33.join(home, ".memorix", "hooks.json");
163269
163306
  }
@@ -163290,6 +163327,8 @@ function getAgentRulesPath(agent, root, global2 = false) {
163290
163327
  return path33.join(root, ".trae", "rules", "project_rules.md");
163291
163328
  case "dsh":
163292
163329
  return path33.join(process.env.DSH_HOME?.trim() || path33.join(root, ".dsh"), "AGENTS.md");
163330
+ case "workbuddy":
163331
+ return "";
163293
163332
  default:
163294
163333
  return path33.join(root, ".agent", "rules", "memorix.md");
163295
163334
  }
@@ -163316,6 +163355,8 @@ function getAgentRulesPath(agent, root, global2 = false) {
163316
163355
  return path33.join(root, ".trae", "rules", "project_rules.md");
163317
163356
  case "dsh":
163318
163357
  return path33.join(root, "AGENTS.md");
163358
+ case "workbuddy":
163359
+ return path33.join(root, "AGENTS.md");
163319
163360
  default:
163320
163361
  return path33.join(root, ".agent", "rules", "memorix.md");
163321
163362
  }
@@ -163404,6 +163445,11 @@ async function detectInstalledAgents() {
163404
163445
  agents.push("dsh");
163405
163446
  } catch {
163406
163447
  }
163448
+ try {
163449
+ await fs21.access(path33.join(home, ".workbuddy"));
163450
+ agents.push("workbuddy");
163451
+ } catch {
163452
+ }
163407
163453
  return agents;
163408
163454
  }
163409
163455
  async function installHooks(agent, projectRoot, global2 = false) {
@@ -163417,6 +163463,16 @@ async function installHooks(agent, projectRoot, global2 = false) {
163417
163463
  }
163418
163464
  };
163419
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
+ }
163420
163476
  if (global2 && getGlobalConfigPath(agent) === "") {
163421
163477
  return {
163422
163478
  agent,
@@ -163499,6 +163555,17 @@ async function installHooks(agent, projectRoot, global2 = false) {
163499
163555
  }
163500
163556
  };
163501
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
+ }
163502
163569
  case "opencode": {
163503
163570
  const pluginContent = generateOpenCodePlugin();
163504
163571
  const pluginPath = global2 ? getGlobalConfigPath(agent) : getProjectConfigPath(agent, projectRoot);
@@ -163628,6 +163695,7 @@ async function installHooks(agent, projectRoot, global2 = false) {
163628
163695
  };
163629
163696
  }
163630
163697
  async function installAgentRules(agent, projectRoot, global2 = false) {
163698
+ if (agent === "workbuddy" && global2) return "";
163631
163699
  const rulesContent = getAgentRulesContent(agent, global2 ? "global" : "project");
163632
163700
  const rulesRoot = global2 ? os5.homedir() : projectRoot;
163633
163701
  const rulesPath = getAgentRulesPath(agent, rulesRoot, global2);
@@ -163780,7 +163848,10 @@ alwaysApply: true
163780
163848
  "| `memorix_store` | Save something worth persisting |",
163781
163849
  '| `memorix_store_reasoning` | Save the "why" behind a decision |',
163782
163850
  "| `memorix_resolve` | Mark completed/outdated memories |",
163783
- "| `memorix_session_start` | Load session context (handoff, orchestration coordination) |"
163851
+ "| `memorix_session_start` | Load session context (handoff, orchestration coordination) |",
163852
+ "| `memorix_evidence` | Check a memory source, freshness, and verification state |",
163853
+ "| `memorix_feedback` | Record whether a memory helped, conflicted, or was corrected |",
163854
+ "| `memorix_media` | Inspect or import controlled local media |"
163784
163855
  ].join("\n");
163785
163856
  }
163786
163857
  async function uninstallHooks(agent, projectRoot, global2 = false) {
@@ -163790,6 +163861,9 @@ async function uninstallHooks(agent, projectRoot, global2 = false) {
163790
163861
  if (agent === "pi") {
163791
163862
  return false;
163792
163863
  }
163864
+ if (agent === "workbuddy") {
163865
+ return false;
163866
+ }
163793
163867
  if (global2 && getGlobalConfigPath(agent) === "") {
163794
163868
  return false;
163795
163869
  }
@@ -167662,16 +167736,24 @@ function resolveToolProfile(opts) {
167662
167736
  return normalize(opts.explicit) ?? normalize(opts.envValue) ?? opts.fallback;
167663
167737
  }
167664
167738
  function describeProfile(profile) {
167739
+ const count2 = countToolsInProfile(profile);
167665
167740
  switch (profile) {
167666
167741
  case "micro":
167667
- return "micro (agent-ready context + bounded recovery/media, ~9 tools)";
167742
+ return `micro (agent-ready context + bounded recovery/media, ${count2} tools)`;
167668
167743
  case "lite":
167669
- return "lite (core memory + sessions, ~18 tools)";
167744
+ return `lite (core memory + sessions, ${count2} tools)`;
167670
167745
  case "team":
167671
- return "team (lite + coordination tools + dashboard + knowledge workspace, ~26 tools)";
167746
+ return `team (lite + coordination tools + dashboard + knowledge workspace, ${count2} tools)`;
167672
167747
  case "full":
167673
- return "full (all tools including advanced / KG-compat)";
167748
+ return `full (all tools including advanced / KG-compat, ${count2} tools)`;
167749
+ }
167750
+ }
167751
+ function countToolsInProfile(profile) {
167752
+ let n = 0;
167753
+ for (const name of Object.keys(TOOL_PROFILES)) {
167754
+ if (isToolInProfile(name, profile)) n++;
167674
167755
  }
167756
+ return n;
167675
167757
  }
167676
167758
 
167677
167759
  // src/server.ts
@@ -167816,7 +167898,7 @@ var MCP_SERVER_INFO_META_KEY = "io.modelcontextprotocol/serverInfo";
167816
167898
  function getMcpServerInfo() {
167817
167899
  return {
167818
167900
  name: "memorix",
167819
- version: true ? "1.8.4" : "1.0.1"
167901
+ version: true ? "1.8.6" : "1.0.1"
167820
167902
  };
167821
167903
  }
167822
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 */
@@ -1,6 +1,9 @@
1
- # Memorix 1.8.0 Release Candidate Specification
1
+ # Memorix 1.8.5 Release Acceptance Specification
2
2
 
3
- Status: accepted implementation contract for Memorix 1.8.0.
3
+ Status: accepted implementation contract for Memorix 1.8.5.
4
+
5
+ This document keeps its historical filename for link stability. The current
6
+ release contract supersedes the original 1.8.0 wording below.
4
7
 
5
8
  ## Acceptance Checklist
6
9
 
@@ -14,22 +17,25 @@ Status: accepted implementation contract for Memorix 1.8.0.
14
17
  - [x] Provide dashboard evidence/provenance views without replacing the existing UI.
15
18
  - [x] Preserve explicit project/session handles across restart and client shapes.
16
19
  - [x] Verify CLI fallback, Windows child-process hiding, HTTP old/new smoke, build, and package contents.
20
+ - [x] Add the official MCP v2 transport path while retaining legacy clients.
21
+ - [x] Reject unsupported durable Tasks explicitly instead of returning fake success.
17
22
 
18
23
  ## Compatibility Contract
19
24
 
20
25
  Memorix preserves the legacy 2025-era initialize contract, including stdio and
21
- stateful Streamable HTTP with `Mcp-Session-Id`. Memorix 1.8.4 also registers a
22
- low-level `server/discover` compatibility adapter for the 2026-07-28 request.
23
- Its `DiscoverResult` is complete for the required identity, versions,
24
- capabilities, and private zero-TTL cache hint. Versionless `tools/list` and
25
- `tools/call` are accepted by the pinned v1 SDK and retain its legacy result
26
- envelopes. The stdio startup gate reads bounded newline-delimited input before
27
- project initialization, answers discovery immediately, and replays all other
28
- messages in order; EOF is deferred until the queued input is released. HTTP
29
- stateless project handles remain a compatibility adapter: they
30
- own project routing, but do not turn the v1 SDK into a complete 2026 runtime.
31
- Tasks, subscriptions, and list-response caching are unsupported and are not
32
- advertised or simulated.
26
+ stateful Streamable HTTP with `Mcp-Session-Id`. Memorix 1.8.5 uses the official
27
+ MCP v2 transport for the modern stateless path and retains the legacy bridge
28
+ for existing clients. The `server/discover` result is complete for the
29
+ supported identity, versions, capabilities, result metadata, and private
30
+ zero-TTL cache hint. Versionless `tools/list` and `tools/call` remain accepted
31
+ for legacy clients. The stdio startup gate reads bounded newline-delimited
32
+ input before project initialization, answers early discovery, and replays all
33
+ other messages in order; EOF is deferred until queued input is released.
34
+ Stateless HTTP project handles own project routing on the modern path.
35
+ Subscriptions are supported with the official listen surface. Durable Tasks
36
+ remain unsupported and are rejected explicitly because Memorix does not yet
37
+ have a durable MCP task contract; list responses carry a zero-TTL hint rather
38
+ than pretending to have a reusable server-side cache.
33
39
 
34
40
  Antigravity is the primary setup target. Gemini CLI remains a compatibility and
35
41
  migration path. GitHub issue #204 (WorkBuddy) is intentionally not merged or
@@ -73,8 +79,8 @@ is rejected for that task window.
73
79
 
74
80
  ## Explicit Non-goals for 1.8.0
75
81
 
76
- - No fake MCP Tasks/polling implementation when the pinned SDK does not expose
77
- a durable server-side task contract.
82
+ - No fake MCP Tasks/polling implementation when Memorix does not expose a
83
+ durable server-side task contract.
78
84
  - No remote memory hub, proxying of model traffic, or upstream installer.
79
85
  - No claim that the bundled Lite parser is a semantic CodeGraph.
80
86
  - No marketing landing page in place of an operator evidence console.
@@ -137,7 +137,7 @@ when the user wants:
137
137
  - explicit task/message/handoff/lock coordination
138
138
  - one shared HTTP service process
139
139
 
140
- Default recommendation: if the user wants memory inside an existing IDE or agent, start with `memorix setup --agent <agent> --global`. Use `memorix serve` only for manual MCP wiring. Use the CLI for direct workflows and automation because it does not depend on an IDE's MCP session lifecycle. Use memcode only when the user wants the bundled terminal agent. Reach for HTTP only when a shared background service, multi-client MCP access, Docker, or a live dashboard endpoint is actually needed.
140
+ Default recommendation: if the user wants memory inside an existing IDE or agent, start with `memorix setup --agent <agent> --global`. Use `memorix serve` only for manual MCP wiring. Use the CLI for direct workflows and automation because it does not depend on an IDE's MCP session lifecycle. Use memcode only when the user wants the bundled terminal agent. Reach for HTTP only when a shared background service, multi-client MCP access, a VPS Docker deployment, or a live dashboard endpoint is actually needed. Local development runs Node directly.
141
141
 
142
142
  Use:
143
143
 
@@ -826,7 +826,7 @@ read this document first, then act.
826
826
  This playbook is the canonical AI-facing guide for installation, project binding, integration, hooks, troubleshooting, and safe usage.
827
827
  ## Docker Note
828
828
 
829
- When Memorix runs in Docker, treat it as an **HTTP service deployment**, not a stdio MCP process.
829
+ When Memorix runs in Docker on a VPS/hosted machine, treat it as an **HTTP service deployment**, not a stdio MCP process. Docker is not required for local development.
830
830
 
831
831
  - Connect IDEs and agents to `http://host:3211/mcp`
832
832
  - Use `memorix_session_start(projectRoot=...)` with a path that is visible **inside** the container
@@ -28,7 +28,7 @@ Use **MCP** when:
28
28
  Use the **CLI** when:
29
29
 
30
30
  - you want to inspect or change project state from a terminal
31
- - you are on SSH / Docker / CI / NAS and want direct commands
31
+ - you are on SSH / VPS Docker / CI / NAS and want direct commands
32
32
  - you want readable, namespaced actions instead of raw MCP tool payloads
33
33
  - you want full access to Memorix CLI capabilities without depending on an MCP client
34
34
 
@@ -150,17 +150,19 @@ 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.4 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.
157
157
  Versionless `tools/list` and `tools/call` use the SDK's legacy result envelopes.
158
- HTTP stateless clients may use a durable
159
- `Mcp-Project-Handle`; `/protocol-diagnostics` labels this as compatibility-only.
160
- Modern result metadata is discovery-only with a private zero-TTL hint. Tasks,
161
- subscriptions, and list-response caching are unsupported. When MCP discovery
162
- is unavailable, use one bounded `memorix context --fallback` request for a
163
- task; repeated fallback probing is rejected by the local budget.
158
+ HTTP modern clients may use the stateless `2026-07-28` path and a durable
159
+ `Mcp-Project-Handle`; `/protocol-diagnostics` reports this as supported.
160
+ Modern result metadata is returned for discovery, list, and call responses.
161
+ The official subscriptions listen surface is available, but Memorix has no
162
+ durable Tasks implementation, so task requests remain explicitly unsupported.
163
+ List responses carry a private zero-TTL hint, not a reusable server-side cache.
164
+ When MCP discovery is unavailable, use one bounded `memorix context --fallback`
165
+ request for a task; repeated fallback probing is rejected by the local budget.
164
166
 
165
167
  The built-in Lite provider indexes common code files with lightweight file, symbol, and import facts. It is a structural fallback, not a language-server-quality graph. When a project already has a healthy local CodeGraph index, `[codegraph].external_context = "auto"` may add a validated, bounded semantic outline to the Workset. Memorix never initializes, syncs, or exports that external index, and never stores its raw source output. `memorix codegraph status --json`, `memorix doctor --json`, and Project Context JSON identify the actual provider quality.
166
168
 
package/docs/DASHBOARD.md CHANGED
@@ -7,6 +7,19 @@ used by MCP and CLI. It shows each card's source reference, locator, captured
7
7
  hash, freshness, verification state, and audit-event count. It is project
8
8
  scoped and does not replace the underlying observation or code source.
9
9
 
10
+ ## Surface Boundaries
11
+
12
+ Each Dashboard page maps to a real data surface: Overview shows overall state,
13
+ Git Memory shows Git-derived memory, Knowledge shows source-backed knowledge
14
+ pages, Memory Map shows the evidence-backed relation projection, Observations
15
+ and Evidence show records and provenance, Retention/Config/Identity show
16
+ runtime health, and Sessions/Coordination show session and persistent
17
+ coordination state.
18
+
19
+ These pages are not demo panels. Empty data is shown as empty, and failed reads
20
+ are shown as unavailable; the UI does not substitute another data model or old
21
+ graph renderer to make a result look healthy.
22
+
10
23
  ## Start
11
24
 
12
25
  ```bash
@@ -25,6 +38,16 @@ The Coordination Status page is a read-only projection of the selected project's
25
38
 
26
39
  The page reports agents, task status, file locks, and handoffs for the selected project. It exposes no team or task write endpoints and is not a task execution or full orchestration platform. If the SQLite read fails, the API returns an explicit degraded/error status and the page shows that the status is unavailable instead of presenting an empty result as healthy.
27
40
 
41
+ ## Memory Map
42
+
43
+ The Graph page is the single visual graph surface. It renders the deterministic,
44
+ source-backed `GET /api/knowledge-graph` projection with Apache ECharts. The
45
+ older Cytoscape/Dagre renderer is removed from the Dashboard, so an empty or
46
+ failed Memory Map no longer silently falls back to a different graph model.
47
+
48
+ `GET /api/graph` remains available as a backend compatibility route for MCP,
49
+ CLI, scripts, and older clients. It is not the Dashboard's visual data source.
50
+
28
51
  ## Maintenance Workbench
29
52
 
30
53
  The Observations page exposes three explicit maintenance actions:
@@ -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.4 release line** and package metadata
17
- is kept at `1.8.4` 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
 
package/docs/DOCKER.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # Docker Deployment
2
2
 
3
- Memorix supports Docker as an **HTTP service deployment path**.
3
+ Memorix supports Docker as a **VPS/hosted HTTP service deployment path**.
4
+
5
+ Local development and verification should run the Node service directly. Do
6
+ not start Docker Desktop or build a local image just to use Memorix.
4
7
 
5
8
  This Docker flow is for:
6
9
 
@@ -83,7 +86,7 @@ It is not a promise that stdio MCP magically becomes container-friendly.
83
86
 
84
87
  ## Important Path Truth
85
88
 
86
- Docker works best when Memorix can **see the repositories it is asked to bind**.
89
+ VPS Docker works best when Memorix can **see the repositories it is asked to bind**.
87
90
 
88
91
  Project-scoped features such as:
89
92
 
@@ -97,7 +100,7 @@ depend on the HTTP service being able to access the repository path.
97
100
 
98
101
  ### Good fit
99
102
 
100
- - Docker Desktop on the same machine as your IDE
103
+ - a VPS or hosted machine that can see the repositories it is asked to bind
101
104
  - a compose setup that mounts the repo you are working on into the container
102
105
  - `memorix_session_start(projectRoot=...)` using a path visible **inside** the container
103
106
 
@@ -26,7 +26,7 @@ That command installs the recommended Memorix package or config for the target a
26
26
  | memcode | Opens a terminal coding agent that already uses Memorix memory | `memorix`, `memcode` |
27
27
  | HTTP service | Runs one shared MCP endpoint plus dashboard | `memorix background start` |
28
28
 
29
- HTTP is not required for normal agent setup. Use it when you intentionally want a shared background process, dashboard, Docker deployment, or multiple clients using the same MCP endpoint.
29
+ HTTP is not required for normal agent setup. Use it when you intentionally want a shared background process, dashboard, VPS Docker deployment, or multiple clients using the same MCP endpoint. Local verification runs the Node service directly; Docker is not required on a developer machine.
30
30
 
31
31
  CLI, MCP, and HTTP have separate jobs:
32
32
 
@@ -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