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.
- package/CHANGELOG.md +18 -0
- package/README.md +4 -2
- package/assets/star-history-dark.svg +5 -5
- package/assets/star-history-light.svg +5 -5
- package/assets/star-history.json +35 -5
- package/dist/cli/index.js +309 -131
- package/dist/index.js +75 -11
- package/dist/memcode-runtime/CHANGELOG.md +18 -0
- package/dist/sdk.js +74 -10
- package/dist/types.d.ts +1 -1
- package/docs/API_REFERENCE.md +1 -1
- package/docs/DEVELOPMENT.md +2 -2
- package/docs/INTEGRATIONS.md +1 -0
- package/docs/MODULES.md +1 -1
- package/docs/README.md +3 -3
- package/docs/SETUP.md +1 -0
- package/package.json +1 -1
- package/plugins/antigravity/memorix/plugin.json +1 -1
- package/plugins/claude/memorix/.claude-plugin/plugin.json +1 -1
- package/plugins/codebuddy/memorix/.codebuddy-plugin/plugin.json +1 -1
- package/plugins/codex/memorix/.codex-plugin/plugin.json +1 -1
- package/plugins/copilot/memorix/plugin.json +1 -1
- package/plugins/gemini/memorix/gemini-extension.json +1 -1
- package/plugins/hermes/memorix/plugin.yaml +1 -1
- package/plugins/omp/memorix/package.json +1 -1
- package/plugins/openclaw/memorix/.codex-plugin/plugin.json +1 -1
- package/plugins/pi/memorix/package.json +1 -1
- package/server.json +2 -2
- package/src/cli/commands/agent-integrations.ts +1 -0
- package/src/cli/commands/hooks-install.ts +9 -2
- package/src/cli/commands/hooks-preview.ts +5 -0
- package/src/cli/commands/integrate.ts +2 -0
- package/src/cli/commands/setup.ts +11 -1
- package/src/cli/commands/uninstall.ts +24 -2
- package/src/codegraph/task-lens.ts +72 -7
- package/src/hooks/installers/index.ts +55 -0
- package/src/hooks/types.ts +2 -0
- package/src/integrations/registry.ts +9 -0
- package/src/types.ts +1 -1
- 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
|
-
|
|
150031
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
"
|
|
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.
|
|
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.
|
|
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
|
-
|
|
150019
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
"
|
|
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.
|
|
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 */
|
package/docs/API_REFERENCE.md
CHANGED
|
@@ -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.
|
|
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.
|
package/docs/DEVELOPMENT.md
CHANGED
|
@@ -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.
|
|
17
|
-
is kept at `1.8.
|
|
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/INTEGRATIONS.md
CHANGED
|
@@ -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
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|
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.
|
|
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.
|
|
25
|
+
"version": "1.8.6",
|
|
26
26
|
"runtimeHint": "npx",
|
|
27
27
|
"packageArguments": [
|
|
28
28
|
{
|
|
@@ -115,8 +115,14 @@ async function installSingleAgent(agent: string, cwd: string, global: boolean):
|
|
|
115
115
|
cwd,
|
|
116
116
|
global,
|
|
117
117
|
);
|
|
118
|
-
|
|
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] || '';
|