@memorax/memorax-code 0.1.9 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/bin/memorax-code-codebuddy.mjs +4 -0
- package/bin/memorax-code-setup.mjs +182 -65
- package/bin/memorax-code.mjs +74 -45
- package/docs/configuration.md +82 -22
- package/docs/troubleshooting.md +69 -5
- package/lib/automatic-update.mjs +233 -0
- package/lib/memorax-code-adapter-common/src/automatic-update-state.d.mts +24 -0
- package/lib/memorax-code-adapter-common/src/automatic-update-state.mjs +73 -0
- package/lib/memorax-code-adapter-common/src/clients/codebuddy-command.mjs +82 -0
- package/lib/memorax-code-adapter-common/src/config-utils.d.mts +2 -0
- package/lib/memorax-code-adapter-common/src/config-utils.mjs +11 -0
- package/lib/memorax-code-adapter-common/src/hooks/client-hook-launcher.mjs +3 -0
- package/lib/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +45 -10
- package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-worker.mjs +88 -3
- package/lib/memorax-code-adapter-common/src/windows-cli-invocation.mjs +11 -1
- package/lib/memorax-code-backend/dist/app/backend-server.js +2 -2
- package/lib/memorax-code-backend/dist/app/memory-observability.js +2 -2
- package/lib/memorax-code-backend/dist/clients/codebuddy/jsonl-history.js +208 -0
- package/lib/memorax-code-backend/dist/clients/codebuddy/lifecycle.js +44 -0
- package/lib/memorax-code-backend/dist/clients/codebuddy/memory-hook-runtime.js +250 -0
- package/lib/memorax-code-backend/dist/clients/codebuddy/turn-id.js +16 -0
- package/lib/memorax-code-backend/dist/clients/codex/plugin-install.js +129 -7
- package/lib/memorax-code-backend/dist/config/memorax-code.js +14 -1
- package/lib/memorax-code-backend/dist/entrypoints/backend-cli.js +43 -6
- package/lib/memorax-code-backend/dist/lifecycle/active-clients.js +3 -0
- package/lib/memorax-code-backend/dist/lifecycle/automatic-update-scheduler.js +133 -0
- package/lib/memorax-code-backend/dist/lifecycle/client-plugin-removal.js +14 -2
- package/lib/memorax-code-backend/dist/lifecycle/client-selection.js +6 -4
- package/lib/memorax-code-backend/dist/lifecycle/orchestrator.js +48 -9
- package/lib/memorax-code-backend/dist/memory/cli.js +4 -2
- package/lib/memorax-code-backend/dist/memory/hook-command.js +31 -1
- package/lib/memorax-code-backend/dist/memory/reminder-trace-recorder.js +5 -1
- package/lib/memorax-code-backend/dist/memory/service.js +12 -0
- package/lib/memorax-code-backend/dist/shared/windows-cli-invocation.js +10 -1
- package/lib/memorax-code-backend/dist/trace/config.js +12 -0
- package/lib/memorax-code-backend/dist/trace/context.js +21 -1
- package/lib/memorax-code-backend/dist/trace/store.js +12 -1
- package/lib/memorax-code-backend/package.json +1 -1
- package/lib/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
- package/lib/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
- package/lib/memorax-code-claude-adapter/package.json +1 -1
- package/lib/memorax-code-claude-adapter/runtime-hooks/ensure-backend.mjs +2 -0
- package/lib/memorax-code-claude-adapter/src/plugin-install.mjs +3 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/automatic-update-state.d.mts +24 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/automatic-update-state.mjs +73 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/codebuddy-command.mjs +82 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/config-utils.d.mts +2 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/config-utils.mjs +11 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/client-hook-launcher.mjs +3 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +45 -10
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-worker.mjs +88 -3
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/windows-cli-invocation.mjs +11 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/package.json +1 -1
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/ensure-backend.mjs +2 -0
- package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-install.mjs +3 -0
- package/lib/memorax-code-codebuddy-adapter/.codebuddy-plugin/plugin.json +7 -0
- package/lib/memorax-code-codebuddy-adapter/hooks/common-runtime.mjs +13 -0
- package/lib/memorax-code-codebuddy-adapter/hooks/hooks.json +38 -0
- package/lib/memorax-code-codebuddy-adapter/hooks/repo-memory-job.mjs +40 -0
- package/lib/memorax-code-codebuddy-adapter/hooks/runtime-hook.mjs +279 -0
- package/lib/memorax-code-codebuddy-adapter/package.json +9 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/SKILL.md +85 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/agents/claude.yaml +10 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/agents/openai.yaml +7 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/defaults.json +12 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/references/memorax-add.md +88 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/references/memorax-search.md +93 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/references/personal-read.md +46 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/references/personal-write.md +120 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/references/repo-build.md +319 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/references/repo-read.md +103 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/references/repo-templates.md +390 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/references/repo-update.md +127 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/scripts/collect_all.py +579 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/scripts/detect_updates.py +919 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/scripts/github_resource_facets.py +512 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +517 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
- package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/scripts/validate_memory.py +248 -0
- package/lib/memorax-code-codebuddy-adapter/src/cli.mjs +58 -0
- package/lib/memorax-code-codebuddy-adapter/src/config.mjs +277 -0
- package/lib/memorax-code-codebuddy-adapter/src/hook-manifest.mjs +47 -0
- package/lib/memorax-code-codebuddy-adapter/src/runtime-observation.mjs +65 -0
- package/lib/memorax-code-codex-adapter/.codex-plugin/plugin.json +1 -1
- package/lib/memorax-code-codex-adapter/hooks/runtime-shell.json +1 -1
- package/lib/memorax-code-codex-adapter/package.json +1 -1
- package/lib/memorax-code-codex-adapter/runtime-hooks/ensure-backend.mjs +4 -1
- package/lib/memorax-code-dsh-adapter/package.json +2 -1
- package/lib/memorax-code-dsh-adapter/src/profile-lifecycle.mjs +1 -0
- package/lib/memorax-code-opencode-adapter/package.json +1 -1
- package/lib/npm-invocation.mjs +51 -8
- package/lib/resolve-codebuddy-command.mjs +112 -0
- package/lib/run-entrypoint.mjs +25 -1
- package/lib/windows-cli-invocation.mjs +11 -1
- package/lib/windows-user-path.mjs +218 -0
- package/package.json +5 -3
package/bin/memorax-code.mjs
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { spawn, spawnSync } from "node:child_process";
|
|
3
|
-
import {
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
4
|
import { homedir } from "node:os";
|
|
5
5
|
import { dirname, join, resolve } from "node:path";
|
|
6
6
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
7
|
+
import { runAutomaticUpdate } from "../lib/automatic-update.mjs";
|
|
7
8
|
import { stagePackagedClientHookRuntime } from "../lib/client-hook-runtime.mjs";
|
|
8
9
|
import { unsupportedNodeVersionMessage } from "../lib/node-version.mjs";
|
|
9
|
-
import {
|
|
10
|
-
import { runBackendEntrypoint } from "../lib/run-entrypoint.mjs";
|
|
10
|
+
import { runNpmCommand } from "../lib/npm-invocation.mjs";
|
|
11
|
+
import { ensureNpmPackageRuntimeEnv, runBackendEntrypoint } from "../lib/run-entrypoint.mjs";
|
|
12
|
+
import { ensureWindowsNpmGlobalPath } from "../lib/windows-user-path.mjs";
|
|
11
13
|
|
|
12
14
|
const nodeVersionError = unsupportedNodeVersionMessage();
|
|
13
15
|
if (nodeVersionError) {
|
|
@@ -86,13 +88,6 @@ function printCommand(command, args) {
|
|
|
86
88
|
console.log([command, ...args].join(" "));
|
|
87
89
|
}
|
|
88
90
|
|
|
89
|
-
function npmCommandCwd() {
|
|
90
|
-
for (const candidate of [process.env.HOME, homedir(), "/"]) {
|
|
91
|
-
if (candidate && existsSync(candidate)) return candidate;
|
|
92
|
-
}
|
|
93
|
-
return "/";
|
|
94
|
-
}
|
|
95
|
-
|
|
96
91
|
async function runAccountCommand(args) {
|
|
97
92
|
if (args.includes("--help") || args.includes("-h")) {
|
|
98
93
|
printAccountHelp();
|
|
@@ -127,6 +122,7 @@ async function runAccountCommand(args) {
|
|
|
127
122
|
}
|
|
128
123
|
|
|
129
124
|
async function runUpdateCommand(args) {
|
|
125
|
+
let automatic = false;
|
|
130
126
|
let dryRun = false;
|
|
131
127
|
let force = false;
|
|
132
128
|
let requestedChannel;
|
|
@@ -134,7 +130,9 @@ async function runUpdateCommand(args) {
|
|
|
134
130
|
|
|
135
131
|
for (let index = 0; index < args.length; index += 1) {
|
|
136
132
|
const arg = args[index];
|
|
137
|
-
if (arg === "--
|
|
133
|
+
if (arg === "--automatic") {
|
|
134
|
+
automatic = true;
|
|
135
|
+
} else if (arg === "--dry-run") {
|
|
138
136
|
dryRun = true;
|
|
139
137
|
} else if (arg === "--force") {
|
|
140
138
|
force = true;
|
|
@@ -173,6 +171,17 @@ async function runUpdateCommand(args) {
|
|
|
173
171
|
}
|
|
174
172
|
|
|
175
173
|
const pkg = readPackageJson();
|
|
174
|
+
if (automatic) {
|
|
175
|
+
if (dryRun || force || requestedChannel) {
|
|
176
|
+
console.error("memorax-code update: --automatic cannot be combined with channel, force, or dry-run options");
|
|
177
|
+
return 2;
|
|
178
|
+
}
|
|
179
|
+
return await runAutomaticUpdateCommand({
|
|
180
|
+
pkg,
|
|
181
|
+
memoraxCodeHome: requestedHome ?? requestedMemoraxCodeHome([]),
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
|
|
176
185
|
const channel = requestedChannel ?? (pkg.version.includes("-") ? "preview" : "latest");
|
|
177
186
|
const npmArgs = ["install", "-g", `${pkg.name}@${channel}`];
|
|
178
187
|
if (force) npmArgs.push("--force");
|
|
@@ -183,51 +192,47 @@ async function runUpdateCommand(args) {
|
|
|
183
192
|
}
|
|
184
193
|
|
|
185
194
|
console.error(`memorax-code update: running ${["npm", ...npmArgs].join(" ")}`);
|
|
186
|
-
|
|
187
|
-
let invocation;
|
|
195
|
+
let npmResult;
|
|
188
196
|
try {
|
|
189
|
-
|
|
197
|
+
npmResult = await runNpmCommand(npmArgs, {
|
|
198
|
+
env: {
|
|
199
|
+
...process.env,
|
|
200
|
+
...(requestedHome ? { MEMORAX_CODE_HOME: requestedHome } : {}),
|
|
201
|
+
},
|
|
202
|
+
stdio: "inherit",
|
|
203
|
+
});
|
|
190
204
|
} catch (error) {
|
|
191
|
-
console.error(`memorax-code update: ${error instanceof Error ? error.message : String(error)}`);
|
|
205
|
+
console.error(`memorax-code update: failed to start npm: ${error instanceof Error ? error.message : String(error)}`);
|
|
192
206
|
return 1;
|
|
193
207
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
...process.env,
|
|
199
|
-
PWD: cwd,
|
|
200
|
-
...(requestedHome ? { MEMORAX_CODE_HOME: requestedHome } : {}),
|
|
201
|
-
},
|
|
202
|
-
});
|
|
203
|
-
const npmExitCode = await new Promise((resolve) => {
|
|
204
|
-
child.on("error", (error) => {
|
|
205
|
-
console.error(`memorax-code update: failed to start npm: ${error.message}`);
|
|
206
|
-
resolve(1);
|
|
207
|
-
});
|
|
208
|
-
child.on("close", (code, signal) => {
|
|
209
|
-
if (signal) {
|
|
210
|
-
console.error(`memorax-code update: npm exited from signal ${signal}`);
|
|
211
|
-
resolve(1);
|
|
212
|
-
} else {
|
|
213
|
-
resolve(code ?? 1);
|
|
214
|
-
}
|
|
215
|
-
});
|
|
216
|
-
});
|
|
217
|
-
if (npmExitCode !== 0) return npmExitCode;
|
|
208
|
+
if (npmResult.signal) {
|
|
209
|
+
console.error(`memorax-code update: npm exited from signal ${npmResult.signal}`);
|
|
210
|
+
}
|
|
211
|
+
if (npmResult.exitCode !== 0) return npmResult.exitCode;
|
|
218
212
|
|
|
219
213
|
const memoraxCodeHome = requestedHome ?? requestedMemoraxCodeHome([]);
|
|
220
|
-
if (!existsSync(join(memoraxCodeHome, "runtime", "backend", "backend.pid.json"))) {
|
|
221
|
-
console.error("memorax-code update: package updated; the managed Backend remains stopped; run `memorax-code setup` from a terminal to review client and Hook changes");
|
|
222
|
-
return 0;
|
|
223
|
-
}
|
|
224
214
|
if (!setupCanPrompt()) {
|
|
225
|
-
console.error("memorax-code update: package updated; run `memorax-code setup` from a terminal to
|
|
215
|
+
console.error("memorax-code update: package updated; run `memorax-code setup` from a terminal to reconcile clients and verify Hook changes");
|
|
226
216
|
return 0;
|
|
227
217
|
}
|
|
228
218
|
return await runSetupCommand(["--home", memoraxCodeHome], { updateMode: true });
|
|
229
219
|
}
|
|
230
220
|
|
|
221
|
+
async function runAutomaticUpdateCommand({ pkg, memoraxCodeHome }) {
|
|
222
|
+
try {
|
|
223
|
+
const result = await runAutomaticUpdate({
|
|
224
|
+
env: process.env,
|
|
225
|
+
memoraxCodeHome,
|
|
226
|
+
packageRoot: packageRoot(),
|
|
227
|
+
packageName: pkg.name,
|
|
228
|
+
packageVersion: pkg.version,
|
|
229
|
+
});
|
|
230
|
+
return result.ok ? 0 : 1;
|
|
231
|
+
} catch {
|
|
232
|
+
return 1;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
231
236
|
async function runSetupCommand(args, { updateMode = false } = {}) {
|
|
232
237
|
if (args.includes("--help") || args.includes("-h")) {
|
|
233
238
|
printSetupHelp();
|
|
@@ -247,6 +252,7 @@ async function runSetupCommand(args, { updateMode = false } = {}) {
|
|
|
247
252
|
console.error("memorax-code setup: an interactive terminal is required");
|
|
248
253
|
return 1;
|
|
249
254
|
}
|
|
255
|
+
if (!updateMode) repairWindowsSetupPath();
|
|
250
256
|
try {
|
|
251
257
|
const { withSetupCompletionLock } = await loadSetupCompletionApi();
|
|
252
258
|
return await withSetupCompletionLock(memoraxCodeHome, async (completion) => {
|
|
@@ -259,7 +265,7 @@ async function runSetupCommand(args, { updateMode = false } = {}) {
|
|
|
259
265
|
return 0;
|
|
260
266
|
}
|
|
261
267
|
if (updateMode) {
|
|
262
|
-
console.error("memorax-code update:
|
|
268
|
+
console.error("memorax-code update: reconciling clients and verified Codex Hook changes in the foreground");
|
|
263
269
|
}
|
|
264
270
|
return await spawnSetupProcess(memoraxCodeHome, {
|
|
265
271
|
updateMode,
|
|
@@ -272,6 +278,28 @@ async function runSetupCommand(args, { updateMode = false } = {}) {
|
|
|
272
278
|
}
|
|
273
279
|
}
|
|
274
280
|
|
|
281
|
+
function repairWindowsSetupPath() {
|
|
282
|
+
if (readPackageJson().name !== "@memorax/memorax-code") return;
|
|
283
|
+
const repair = ensureWindowsNpmGlobalPath();
|
|
284
|
+
if (repair.userPathChanged) {
|
|
285
|
+
console.error("memorax-code setup: added npm's global command directory to the Windows user PATH");
|
|
286
|
+
}
|
|
287
|
+
if (repair.processPathChanged) {
|
|
288
|
+
console.error("memorax-code setup: npm global commands are available to the setup process");
|
|
289
|
+
}
|
|
290
|
+
if (repair.restartRecommended) {
|
|
291
|
+
console.error("memorax-code setup: restart or refresh coding agents that were already running so they inherit the updated PATH");
|
|
292
|
+
}
|
|
293
|
+
if (repair.status === "warning") {
|
|
294
|
+
const detail = repair.reason === "npm_prefix_unavailable"
|
|
295
|
+
? "the npm global command directory could not be determined"
|
|
296
|
+
: repair.reason === "global_shims_missing"
|
|
297
|
+
? "the installed MemoraX Code command shims could not be verified"
|
|
298
|
+
: "the Windows user PATH could not be updated";
|
|
299
|
+
console.error(`memorax-code setup: Windows PATH repair was not completed because ${detail}; setup will continue`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
275
303
|
async function routeDefaultCommand() {
|
|
276
304
|
const memoraxCodeHome = requestedMemoraxCodeHome([]);
|
|
277
305
|
try {
|
|
@@ -378,6 +406,7 @@ function hasReadyMemoraxConfiguration(memoraxCodeHome) {
|
|
|
378
406
|
}
|
|
379
407
|
|
|
380
408
|
async function spawnSetupProcess(memoraxCodeHome, { updateMode = false, setupMode = "automatic" } = {}) {
|
|
409
|
+
ensureNpmPackageRuntimeEnv();
|
|
381
410
|
const env = {
|
|
382
411
|
...process.env,
|
|
383
412
|
MEMORAX_CODE_HOME: memoraxCodeHome,
|
package/docs/configuration.md
CHANGED
|
@@ -39,13 +39,13 @@ are not a compatibility contract.
|
|
|
39
39
|
|
|
40
40
|
## New configuration
|
|
41
41
|
|
|
42
|
-
The generated template selects
|
|
42
|
+
The generated template selects the existing client integrations, including the optional CodeBuddy/WorkBuddy adapter, disables automatic
|
|
43
43
|
retrieval, enables automatic writeback, sets the preferred language to Chinese
|
|
44
44
|
(`zh`), uses a five-turn skill reminder and the adaptive repository-update
|
|
45
|
-
policy, and enables content-bearing local traces for Codex, Claude Code,
|
|
46
|
-
OpenCode. Foreground setup may narrow `[clients]` to
|
|
47
|
-
host. The tables below list all fallbacks, including
|
|
48
|
-
the generated file.
|
|
45
|
+
policy, and enables content-bearing local traces for Codex, Claude Code,
|
|
46
|
+
CodeBuddy/WorkBuddy, and OpenCode. Foreground setup may narrow `[clients]` to
|
|
47
|
+
clients detected on the host. The tables below list all fallbacks, including
|
|
48
|
+
tuning fields omitted from the generated file.
|
|
49
49
|
|
|
50
50
|
On POSIX systems MemoraX Code creates `$MEMORAX_CODE_HOME` with mode `0700`
|
|
51
51
|
and a new `config.toml` with mode `0600`. Windows relies on the current user's
|
|
@@ -54,7 +54,7 @@ filesystem ACLs.
|
|
|
54
54
|
## Client selection
|
|
55
55
|
|
|
56
56
|
If `[clients]` is absent, lifecycle commands select Codex, Claude Code, DSH,
|
|
57
|
-
and OpenCode. If it is present, `codex`, `claude`, `dsh`, and `
|
|
57
|
+
and OpenCode; CodeBuddy is opt-in unless detected during installation. If it is present, `codex`, `claude`, `dsh`, `opencode`, and `codebuddy` are
|
|
58
58
|
boolean fields. Omitted `codex`, `claude`, or `opencode` values are disabled;
|
|
59
59
|
an omitted `dsh` value remains enabled so configurations written before DSH
|
|
60
60
|
support can discover an existing local Harness. Set `dsh = false` explicitly
|
|
@@ -62,7 +62,7 @@ to disable that integration. The command-line override accepts a
|
|
|
62
62
|
comma-separated subset:
|
|
63
63
|
|
|
64
64
|
```text
|
|
65
|
-
--clients codex|claude|dsh|opencode|<comma-separated subset>|all|none
|
|
65
|
+
--clients codex|claude|dsh|opencode|codebuddy|<comma-separated subset>|all|none
|
|
66
66
|
```
|
|
67
67
|
|
|
68
68
|
Foreground `memorax-code setup` refreshes `[clients]` from the clients
|
|
@@ -77,12 +77,14 @@ disabled client is offered for activation with a default of yes; declining
|
|
|
77
77
|
keeps it disabled. A selected client that is temporarily unavailable remains
|
|
78
78
|
selected instead of being permanently disabled. Direct npm installation does
|
|
79
79
|
not detect clients or modify `[clients]`.
|
|
80
|
+
Automatic update reconciliation also preserves the exact persisted selection;
|
|
81
|
+
it does not offer or enable a newly detected client.
|
|
80
82
|
|
|
81
83
|
Client selection controls managed client-integration lifecycle only. It does
|
|
82
84
|
not change Codex, Claude Code, DSH, or OpenCode provider settings.
|
|
83
85
|
`--clients none` runs the Backend without managing a client integration.
|
|
84
86
|
|
|
85
|
-
## Setup and package-transition state
|
|
87
|
+
## Setup, automatic update, and package-transition state
|
|
86
88
|
|
|
87
89
|
npm installation and foreground setup are separate operations.
|
|
88
90
|
`npm install -g @memorax/memorax-code` installs or replaces package files
|
|
@@ -104,8 +106,9 @@ Successful setup writes a private versioned record at:
|
|
|
104
106
|
$MEMORAX_CODE_HOME/runtime/setup/setup-completion.json
|
|
105
107
|
```
|
|
106
108
|
|
|
107
|
-
The record controls
|
|
108
|
-
|
|
109
|
+
The record controls no-argument CLI routing and eligibility for background
|
|
110
|
+
update reconciliation. When it is valid, the command shows status. When it is
|
|
111
|
+
absent and an interactive terminal is available,
|
|
109
112
|
`memorax-code` validates and reuses a complete effective configuration, then
|
|
110
113
|
runs setup and reconciliation once to write the record. If the configuration
|
|
111
114
|
is incomplete or no interactive terminal is available, it points to
|
|
@@ -113,6 +116,32 @@ is incomplete or no interactive terminal is available, it points to
|
|
|
113
116
|
product uninstall removes this marker while retaining `config.toml`; stop and
|
|
114
117
|
partial client uninstall preserve it.
|
|
115
118
|
|
|
119
|
+
After setup completion, the managed Backend schedules detached update checks
|
|
120
|
+
while it remains running. It reads the next deadline from the private update
|
|
121
|
+
record, so an active Backend continues checking even when the user stays in one
|
|
122
|
+
client session. Stable installations follow npm `latest`; prerelease
|
|
123
|
+
installations follow `preview`. A successful result is reused for eight hours,
|
|
124
|
+
while a failed check, install, or reconciliation retries after 15 minutes. Set
|
|
125
|
+
`MEMORAX_CODE_AUTO_UPDATE=false` before starting or restarting the managed
|
|
126
|
+
Backend to disable the scheduler. Client startup Hooks only recover an
|
|
127
|
+
unavailable Backend and do not schedule updates.
|
|
128
|
+
|
|
129
|
+
The updater installs an exact published version and runs an internal
|
|
130
|
+
non-interactive setup mode. That mode preserves `[clients]`, connection data,
|
|
131
|
+
and memory preferences. For Codex, only new or changed Hooks returned by the
|
|
132
|
+
incremental check are trusted silently, and the exact Hook selection is
|
|
133
|
+
validated again before and after the config write. A changed marketplace
|
|
134
|
+
identity or unverifiable Hook set prevents reconciliation from completing.
|
|
135
|
+
The standalone `memorax-code codex-plugin trust-hooks` command still performs
|
|
136
|
+
explicit review.
|
|
137
|
+
|
|
138
|
+
The installed version and next check deadline are stored in another private
|
|
139
|
+
record:
|
|
140
|
+
|
|
141
|
+
```text
|
|
142
|
+
$MEMORAX_CODE_HOME/runtime/install/automatic-update.json
|
|
143
|
+
```
|
|
144
|
+
|
|
116
145
|
Replacing a running managed Backend uses a separate private record:
|
|
117
146
|
|
|
118
147
|
```text
|
|
@@ -121,8 +150,8 @@ $MEMORAX_CODE_HOME/runtime/install/package-transition.json
|
|
|
121
150
|
|
|
122
151
|
Preinstall records and retires the running installation. Postinstall restores
|
|
123
152
|
and verifies it before consuming the record. A fresh or already-stopped
|
|
124
|
-
installation has no transition and remains stopped.
|
|
125
|
-
|
|
153
|
+
installation has no transition and remains stopped. Direct npm installation
|
|
154
|
+
does not run product reconciliation. Do not edit these runtime records by hand.
|
|
126
155
|
|
|
127
156
|
## DeepSeek Harness integration paths
|
|
128
157
|
|
|
@@ -169,6 +198,28 @@ MemoraX Code does not add entries to or otherwise modify `opencode.json` or
|
|
|
169
198
|
`opencode.jsonc`. Restart or refresh OpenCode after installation or after these
|
|
170
199
|
managed assets change.
|
|
171
200
|
|
|
201
|
+
## CodeBuddy and WorkBuddy integration paths
|
|
202
|
+
|
|
203
|
+
The managed CodeBuddy/WorkBuddy marketplace plugin and shared Skill use the
|
|
204
|
+
native plugin layout:
|
|
205
|
+
|
|
206
|
+
```text
|
|
207
|
+
<CODEBUDDY_HOME>/plugins/marketplaces/memorax-code-local/plugins/memorax-code-codebuddy-adapter/
|
|
208
|
+
├── hooks/
|
|
209
|
+
└── skills/memorax-code/
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
`CODEBUDDY_HOME` or `WORKBUDDY_HOME` overrides the default root. Windows uses
|
|
213
|
+
`%USERPROFILE%\.codebuddy`; other platforms use `~/.workbuddy`. The Skill is
|
|
214
|
+
materialized from the canonical MemoraX Code Skill and is owned by the managed
|
|
215
|
+
marketplace plugin; user files outside that plugin are not modified.
|
|
216
|
+
|
|
217
|
+
On Windows, setup writes destination-specific native Hook paths so PowerShell
|
|
218
|
+
does not receive a `/c/Users/...` plugin path. `memorax-code-codebuddy status
|
|
219
|
+
--json` reports `codebuddyHooks.status` as `unverified` until a real WorkBuddy
|
|
220
|
+
Hook executes, `observed` afterward, and `invalid` when the installed Hook
|
|
221
|
+
manifest or runtime is incomplete. Restart or refresh WorkBuddy after setup.
|
|
222
|
+
|
|
172
223
|
The managed loader records the exact MemoraX Code home, OpenCode configuration
|
|
173
224
|
directory, installed Node runtime, and `memorax-code` entrypoint. When the
|
|
174
225
|
enabled plugin loads, it performs a best-effort Backend health check and uses
|
|
@@ -319,14 +370,22 @@ Supported policies are `every-commit`, `commit-count`, `daily`,
|
|
|
319
370
|
`pull-request`, `pull-request-or-daily`, and `adaptive`. Invalid policy values
|
|
320
371
|
fall back to `adaptive`.
|
|
321
372
|
|
|
322
|
-
In Codex, Claude Code, DSH, and OpenCode, the first eligible prompt starts a
|
|
373
|
+
In Codex, Claude Code, CodeBuddy/WorkBuddy, DSH, and OpenCode, the first eligible prompt starts a
|
|
323
374
|
background build only when the Backend has authorized a Git worktree and that
|
|
324
375
|
worktree has no `.repo_memory/PROFILE.md`. If the Backend or workspace
|
|
325
376
|
authority is unavailable, the client integration skips that attempt instead
|
|
326
377
|
of falling back to its local workspace path. DSH schedules this work through
|
|
327
378
|
its native pre-step integration rather than a Hook.
|
|
328
379
|
|
|
329
|
-
|
|
380
|
+
CodeBuddy/WorkBuddy repository jobs run the headless client under a bounded
|
|
381
|
+
worker. `MEMORAX_CODE_REPO_MEMORY_JOB_TIMEOUT_MS` sets the client execution
|
|
382
|
+
limit (default `600000` ms); `MEMORAX_CODE_REPO_MEMORY_JOB_KILL_GRACE_MS` sets
|
|
383
|
+
the grace period before the worker force-terminates a client that ignores
|
|
384
|
+
`SIGTERM` (default `5000` ms). A timeout is recorded as
|
|
385
|
+
`codebuddy_timeout` (or `<runner>_timeout`) in the job state, so a stalled
|
|
386
|
+
headless client cannot leave an active job and repository marker indefinitely.
|
|
387
|
+
|
|
388
|
+
A relevant repo-read runs supervised maintenance in all supported clients. The
|
|
330
389
|
configured policy may select a build, update, or no-op. DSH maintenance
|
|
331
390
|
requires an enabled, managed Profile that includes `@deepseek-ai/dsh-headless`.
|
|
332
391
|
OpenCode executes the job through its active local server. Desktop-only
|
|
@@ -334,16 +393,16 @@ installations do not require a standalone `opencode` executable in `PATH`.
|
|
|
334
393
|
|
|
335
394
|
## Local traces
|
|
336
395
|
|
|
337
|
-
`[trace.codex]`, `[trace.claude]`, `[trace.dsh]`, and `[trace.
|
|
396
|
+
`[trace.codex]`, `[trace.claude]`, `[trace.dsh]`, `[trace.opencode]`, and `[trace.codebuddy]`
|
|
338
397
|
support the same fields:
|
|
339
398
|
|
|
340
|
-
| Field | Codex environment | Claude environment | DSH environment | OpenCode environment | Fallback |
|
|
341
|
-
| --- | --- | --- | --- | --- | --- |
|
|
342
|
-
| `enabled` | `MEMORAX_CODE_CODEX_TRACE_ENABLED` | `MEMORAX_CODE_CLAUDE_TRACE_ENABLED` | `MEMORAX_CODE_DSH_TRACE_ENABLED` | `MEMORAX_CODE_OPENCODE_TRACE_ENABLED` | `true` |
|
|
343
|
-
| `capture_content` | `MEMORAX_CODE_CODEX_TRACE_CAPTURE_CONTENT` | `MEMORAX_CODE_CLAUDE_TRACE_CAPTURE_CONTENT` | `MEMORAX_CODE_DSH_TRACE_CAPTURE_CONTENT` | `MEMORAX_CODE_OPENCODE_TRACE_CAPTURE_CONTENT` | `true` |
|
|
344
|
-
| `retention_days` | `MEMORAX_CODE_CODEX_TRACE_RETENTION_DAYS` | `MEMORAX_CODE_CLAUDE_TRACE_RETENTION_DAYS` | `MEMORAX_CODE_DSH_TRACE_RETENTION_DAYS` | `MEMORAX_CODE_OPENCODE_TRACE_RETENTION_DAYS` | `7` |
|
|
345
|
-
| `max_event_chars` | `MEMORAX_CODE_CODEX_TRACE_MAX_EVENT_CHARS` | `MEMORAX_CODE_CLAUDE_TRACE_MAX_EVENT_CHARS` | `MEMORAX_CODE_DSH_TRACE_MAX_EVENT_CHARS` | `MEMORAX_CODE_OPENCODE_TRACE_MAX_EVENT_CHARS` | `20000` |
|
|
346
|
-
| `max_file_bytes` | `MEMORAX_CODE_CODEX_TRACE_MAX_FILE_BYTES` | `MEMORAX_CODE_CLAUDE_TRACE_MAX_FILE_BYTES` | `MEMORAX_CODE_DSH_TRACE_MAX_FILE_BYTES` | `MEMORAX_CODE_OPENCODE_TRACE_MAX_FILE_BYTES` | `52428800` |
|
|
399
|
+
| Field | Codex environment | Claude environment | DSH environment | OpenCode environment | CodeBuddy/WorkBuddy environment | Fallback |
|
|
400
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
401
|
+
| `enabled` | `MEMORAX_CODE_CODEX_TRACE_ENABLED` | `MEMORAX_CODE_CLAUDE_TRACE_ENABLED` | `MEMORAX_CODE_DSH_TRACE_ENABLED` | `MEMORAX_CODE_OPENCODE_TRACE_ENABLED` | `MEMORAX_CODE_CODEBUDDY_TRACE_ENABLED` | `true` |
|
|
402
|
+
| `capture_content` | `MEMORAX_CODE_CODEX_TRACE_CAPTURE_CONTENT` | `MEMORAX_CODE_CLAUDE_TRACE_CAPTURE_CONTENT` | `MEMORAX_CODE_DSH_TRACE_CAPTURE_CONTENT` | `MEMORAX_CODE_OPENCODE_TRACE_CAPTURE_CONTENT` | `MEMORAX_CODE_CODEBUDDY_TRACE_CAPTURE_CONTENT` | `true` |
|
|
403
|
+
| `retention_days` | `MEMORAX_CODE_CODEX_TRACE_RETENTION_DAYS` | `MEMORAX_CODE_CLAUDE_TRACE_RETENTION_DAYS` | `MEMORAX_CODE_DSH_TRACE_RETENTION_DAYS` | `MEMORAX_CODE_OPENCODE_TRACE_RETENTION_DAYS` | `MEMORAX_CODE_CODEBUDDY_TRACE_RETENTION_DAYS` | `7` |
|
|
404
|
+
| `max_event_chars` | `MEMORAX_CODE_CODEX_TRACE_MAX_EVENT_CHARS` | `MEMORAX_CODE_CLAUDE_TRACE_MAX_EVENT_CHARS` | `MEMORAX_CODE_DSH_TRACE_MAX_EVENT_CHARS` | `MEMORAX_CODE_OPENCODE_TRACE_MAX_EVENT_CHARS` | `MEMORAX_CODE_CODEBUDDY_TRACE_MAX_EVENT_CHARS` | `20000` |
|
|
405
|
+
| `max_file_bytes` | `MEMORAX_CODE_CODEX_TRACE_MAX_FILE_BYTES` | `MEMORAX_CODE_CLAUDE_TRACE_MAX_FILE_BYTES` | `MEMORAX_CODE_DSH_TRACE_MAX_FILE_BYTES` | `MEMORAX_CODE_OPENCODE_TRACE_MAX_FILE_BYTES` | `MEMORAX_CODE_CODEBUDDY_TRACE_MAX_FILE_BYTES` | `52428800` |
|
|
347
406
|
|
|
348
407
|
Depending on the enabled client capabilities, content capture can include
|
|
349
408
|
prompts, responses, recalled memory, writeback content, reminder text, and
|
|
@@ -364,6 +423,7 @@ Common operator settings are:
|
|
|
364
423
|
| Environment | Purpose |
|
|
365
424
|
| --- | --- |
|
|
366
425
|
| `MEMORAX_CODE_HOME` | Select the state and configuration root |
|
|
426
|
+
| `MEMORAX_CODE_AUTO_UPDATE` | Set to `false` to disable client-start background update checks |
|
|
367
427
|
| `MEMORAX_CODE_BACKEND_URL` | Override the Backend URL for one command or Hook |
|
|
368
428
|
| `MEMORAX_CODE_BACKEND_HOST` / `MEMORAX_CODE_BACKEND_PORT` | Select the managed bind; default `127.0.0.1:8787` |
|
|
369
429
|
| `MEMORAX_CODE_BACKEND_TOKEN` | Supply a transient Backend token |
|
package/docs/troubleshooting.md
CHANGED
|
@@ -42,6 +42,22 @@ Setup requires terminal input and terminal-visible stderr. A pipe, background
|
|
|
42
42
|
process, or redirected stdin/stderr cannot complete setup; rerun it in a normal
|
|
43
43
|
interactive terminal.
|
|
44
44
|
|
|
45
|
+
On Windows, interactive setup verifies npm's global command directory and adds
|
|
46
|
+
it to the current setup process and the Windows user `PATH` when needed. If the
|
|
47
|
+
current shell cannot find `memorax-code`, use npm's actual global prefix to
|
|
48
|
+
bootstrap setup:
|
|
49
|
+
|
|
50
|
+
```powershell
|
|
51
|
+
$NpmGlobalBin = (npm prefix -g).Trim()
|
|
52
|
+
$env:Path = "$NpmGlobalBin;$env:Path"
|
|
53
|
+
& (Join-Path $NpmGlobalBin "memorax-code.cmd") setup
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
The same npm package installs both `memorax-code` and `memorax-cli`; do not
|
|
57
|
+
install a separate CLI package. Open a new terminal after setup changes the
|
|
58
|
+
user `PATH`. Restart or refresh only coding agents that were already running
|
|
59
|
+
or still cannot find `memorax-cli`.
|
|
60
|
+
|
|
45
61
|
## Setup does not complete
|
|
46
62
|
|
|
47
63
|
Setup writes
|
|
@@ -99,6 +115,34 @@ migration. `memorax-code start` alone does not commit that migration. Once a
|
|
|
99
115
|
fixed release has started the Backend from its private runtime directory,
|
|
100
116
|
later updates do not require this workaround.
|
|
101
117
|
|
|
118
|
+
## Automatic update does not run or repeatedly retries
|
|
119
|
+
|
|
120
|
+
Background checks start only after setup has written a valid
|
|
121
|
+
`$MEMORAX_CODE_HOME/runtime/setup/setup-completion.json` record and the managed
|
|
122
|
+
Backend is running. Confirm that `MEMORAX_CODE_AUTO_UPDATE` was not set to
|
|
123
|
+
`false` when that Backend started. Client SessionStart events are not update
|
|
124
|
+
triggers. A successful check is reused for eight hours; failures retry after 15
|
|
125
|
+
minutes.
|
|
126
|
+
|
|
127
|
+
The installed version and next check deadline are recorded at:
|
|
128
|
+
|
|
129
|
+
```text
|
|
130
|
+
$MEMORAX_CODE_HOME/runtime/install/automatic-update.json
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Do not edit that record while an update may be running. For an immediate
|
|
134
|
+
foreground retry, run `memorax-code update` from an interactive terminal, then
|
|
135
|
+
check `memorax-code status`.
|
|
136
|
+
|
|
137
|
+
During Codex reconciliation, verified new or changed MemoraX Code Hooks are
|
|
138
|
+
trusted silently. A changed marketplace identity, malformed Hook response, or
|
|
139
|
+
Hook that changes again during the config write is not trusted; automatic
|
|
140
|
+
reconciliation remains incomplete and retries later. After confirming the
|
|
141
|
+
installed plugin source, use `memorax-code codex-plugin trust-hooks` for an
|
|
142
|
+
explicit diagnostic review, then rerun `memorax-code setup` if needed. Direct
|
|
143
|
+
npm installation replaces package files but does not perform this product
|
|
144
|
+
reconciliation.
|
|
145
|
+
|
|
102
146
|
## Installed, but memory is unavailable
|
|
103
147
|
|
|
104
148
|
The package and Backend can be healthy while MemoraX remains unconfigured. Run:
|
|
@@ -199,11 +243,12 @@ memorax-code start --clients codex
|
|
|
199
243
|
memorax-code-codex doctor
|
|
200
244
|
```
|
|
201
245
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
`memorax-code start --clients codex`,
|
|
246
|
+
MemoraX Code update reconciliation silently trusts only the exact new or changed
|
|
247
|
+
Hook hashes returned by Codex after the marketplace identity is verified.
|
|
248
|
+
Direct npm installation does not run that reconciliation and can leave changed
|
|
249
|
+
Hooks untrusted. Use the commands above instead of writing trust entries
|
|
250
|
+
directly. If the skill is missing, rerun `memorax-code start --clients codex`,
|
|
251
|
+
then restart or refresh Codex.
|
|
207
252
|
|
|
208
253
|
## Claude Code plugin or Hook is inactive
|
|
209
254
|
|
|
@@ -216,6 +261,25 @@ This reconciles the Claude Code marketplace plugin and Hooks. If the plugin is
|
|
|
216
261
|
still missing or stale, restart or refresh Claude Code. Do not manually copy
|
|
217
262
|
Hooks into Claude settings.
|
|
218
263
|
|
|
264
|
+
## CodeBuddy or WorkBuddy Hook is inactive
|
|
265
|
+
|
|
266
|
+
```sh
|
|
267
|
+
memorax-code start --clients codebuddy
|
|
268
|
+
memorax-code-codebuddy status --json
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
On Windows, the managed plugin defaults to `%USERPROFILE%\.codebuddy`, while
|
|
272
|
+
`CODEBUDDY_HOME` or `WORKBUDDY_HOME` remains an explicit override. A
|
|
273
|
+
`codebuddyHooks.status` value of `unverified` means the files are configured but
|
|
274
|
+
the current plugin version has not yet produced a real Hook event. Restart or
|
|
275
|
+
refresh WorkBuddy, submit one prompt, and check status again. `observed` means
|
|
276
|
+
the Hook entrypoint and its shared runtime loaded; `invalid` means setup should
|
|
277
|
+
be rerun.
|
|
278
|
+
|
|
279
|
+
If WorkBuddy still reports a Hook command containing `/c/Users/...`, it is
|
|
280
|
+
loading a stale plugin manifest. Rerun the start command above and fully
|
|
281
|
+
restart WorkBuddy. Do not manually edit the installed Hook command.
|
|
282
|
+
|
|
219
283
|
## DeepSeek Harness Profile integration is inactive
|
|
220
284
|
|
|
221
285
|
```sh
|