@memorax/memorax-code 0.1.9 → 0.1.11

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 (101) hide show
  1. package/README.md +10 -0
  2. package/bin/memorax-code-codebuddy.mjs +4 -0
  3. package/bin/memorax-code-setup.mjs +182 -65
  4. package/bin/memorax-code.mjs +74 -45
  5. package/docs/configuration.md +85 -22
  6. package/docs/troubleshooting.md +72 -5
  7. package/lib/automatic-update.mjs +233 -0
  8. package/lib/memorax-code-adapter-common/src/automatic-update-state.d.mts +24 -0
  9. package/lib/memorax-code-adapter-common/src/automatic-update-state.mjs +73 -0
  10. package/lib/memorax-code-adapter-common/src/clients/codebuddy-command.mjs +82 -0
  11. package/lib/memorax-code-adapter-common/src/config-utils.d.mts +2 -0
  12. package/lib/memorax-code-adapter-common/src/config-utils.mjs +11 -0
  13. package/lib/memorax-code-adapter-common/src/hooks/client-hook-launcher.mjs +3 -0
  14. package/lib/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +45 -10
  15. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-worker.mjs +88 -3
  16. package/lib/memorax-code-adapter-common/src/windows-cli-invocation.mjs +11 -1
  17. package/lib/memorax-code-backend/dist/app/backend-server.js +2 -2
  18. package/lib/memorax-code-backend/dist/app/memory-observability.js +2 -2
  19. package/lib/memorax-code-backend/dist/clients/codebuddy/jsonl-history.js +208 -0
  20. package/lib/memorax-code-backend/dist/clients/codebuddy/lifecycle.js +44 -0
  21. package/lib/memorax-code-backend/dist/clients/codebuddy/memory-hook-runtime.js +250 -0
  22. package/lib/memorax-code-backend/dist/clients/codebuddy/turn-id.js +16 -0
  23. package/lib/memorax-code-backend/dist/clients/codex/plugin-install.js +129 -7
  24. package/lib/memorax-code-backend/dist/config/memorax-code.js +14 -1
  25. package/lib/memorax-code-backend/dist/entrypoints/backend-cli.js +43 -6
  26. package/lib/memorax-code-backend/dist/lifecycle/active-clients.js +3 -0
  27. package/lib/memorax-code-backend/dist/lifecycle/automatic-update-scheduler.js +133 -0
  28. package/lib/memorax-code-backend/dist/lifecycle/client-plugin-removal.js +14 -2
  29. package/lib/memorax-code-backend/dist/lifecycle/client-selection.js +6 -4
  30. package/lib/memorax-code-backend/dist/lifecycle/orchestrator.js +48 -9
  31. package/lib/memorax-code-backend/dist/memory/cli.js +4 -2
  32. package/lib/memorax-code-backend/dist/memory/hook-command.js +31 -1
  33. package/lib/memorax-code-backend/dist/memory/reminder-trace-recorder.js +5 -1
  34. package/lib/memorax-code-backend/dist/memory/service.js +12 -0
  35. package/lib/memorax-code-backend/dist/shared/windows-cli-invocation.js +10 -1
  36. package/lib/memorax-code-backend/dist/trace/config.js +12 -0
  37. package/lib/memorax-code-backend/dist/trace/context.js +21 -1
  38. package/lib/memorax-code-backend/dist/trace/store.js +12 -1
  39. package/lib/memorax-code-backend/package.json +1 -1
  40. package/lib/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
  41. package/lib/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
  42. package/lib/memorax-code-claude-adapter/package.json +1 -1
  43. package/lib/memorax-code-claude-adapter/runtime-hooks/ensure-backend.mjs +2 -0
  44. package/lib/memorax-code-claude-adapter/src/plugin-install.mjs +3 -0
  45. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/.claude-plugin/plugin.json +1 -1
  46. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-shell.json +1 -1
  47. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/automatic-update-state.d.mts +24 -0
  48. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/automatic-update-state.mjs +73 -0
  49. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/codebuddy-command.mjs +82 -0
  50. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/config-utils.d.mts +2 -0
  51. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/config-utils.mjs +11 -0
  52. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/client-hook-launcher.mjs +3 -0
  53. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +45 -10
  54. 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
  55. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/windows-cli-invocation.mjs +11 -1
  56. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/package.json +1 -1
  57. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/ensure-backend.mjs +2 -0
  58. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-install.mjs +3 -0
  59. package/lib/memorax-code-codebuddy-adapter/.codebuddy-plugin/plugin.json +7 -0
  60. package/lib/memorax-code-codebuddy-adapter/hooks/common-runtime.mjs +13 -0
  61. package/lib/memorax-code-codebuddy-adapter/hooks/hooks.json +38 -0
  62. package/lib/memorax-code-codebuddy-adapter/hooks/repo-memory-job.mjs +40 -0
  63. package/lib/memorax-code-codebuddy-adapter/hooks/runtime-hook.mjs +289 -0
  64. package/lib/memorax-code-codebuddy-adapter/package.json +9 -0
  65. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/SKILL.md +85 -0
  66. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/agents/claude.yaml +10 -0
  67. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/agents/openai.yaml +7 -0
  68. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/defaults.json +12 -0
  69. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/references/memorax-add.md +88 -0
  70. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/references/memorax-search.md +93 -0
  71. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/references/personal-read.md +46 -0
  72. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/references/personal-write.md +120 -0
  73. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/references/repo-build.md +319 -0
  74. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/references/repo-read.md +103 -0
  75. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/references/repo-templates.md +390 -0
  76. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/references/repo-update.md +127 -0
  77. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/scripts/collect_all.py +579 -0
  78. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/scripts/detect_updates.py +919 -0
  79. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
  80. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/scripts/github_resource_facets.py +512 -0
  81. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +517 -0
  82. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
  83. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
  84. package/lib/memorax-code-codebuddy-adapter/skills/memorax-code/scripts/validate_memory.py +248 -0
  85. package/lib/memorax-code-codebuddy-adapter/src/cli.mjs +58 -0
  86. package/lib/memorax-code-codebuddy-adapter/src/config.mjs +340 -0
  87. package/lib/memorax-code-codebuddy-adapter/src/hook-manifest.mjs +47 -0
  88. package/lib/memorax-code-codebuddy-adapter/src/runtime-observation.mjs +65 -0
  89. package/lib/memorax-code-codex-adapter/.codex-plugin/plugin.json +1 -1
  90. package/lib/memorax-code-codex-adapter/hooks/runtime-shell.json +1 -1
  91. package/lib/memorax-code-codex-adapter/package.json +1 -1
  92. package/lib/memorax-code-codex-adapter/runtime-hooks/ensure-backend.mjs +4 -1
  93. package/lib/memorax-code-dsh-adapter/package.json +2 -1
  94. package/lib/memorax-code-dsh-adapter/src/profile-lifecycle.mjs +1 -0
  95. package/lib/memorax-code-opencode-adapter/package.json +1 -1
  96. package/lib/npm-invocation.mjs +51 -8
  97. package/lib/resolve-codebuddy-command.mjs +123 -0
  98. package/lib/run-entrypoint.mjs +25 -1
  99. package/lib/windows-cli-invocation.mjs +11 -1
  100. package/lib/windows-user-path.mjs +218 -0
  101. package/package.json +5 -3
@@ -0,0 +1,218 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import path from "node:path";
4
+ import { resolveNpmInvocation } from "./npm-invocation.mjs";
5
+
6
+ const WINDOWS_USER_PATH_SCRIPT = String.raw`
7
+ $ErrorActionPreference = "Stop"
8
+ $globalBin = $env:MEMORAX_CODE_WINDOWS_NPM_GLOBAL_BIN
9
+
10
+ function Normalize-PathEntry([string]$Value) {
11
+ if ([string]::IsNullOrWhiteSpace($Value)) { return "" }
12
+ return [Environment]::ExpandEnvironmentVariables(
13
+ $Value.Trim().Trim('"')
14
+ ).TrimEnd('\')
15
+ }
16
+
17
+ $normalizedGlobalBin = Normalize-PathEntry $globalBin
18
+ $changed = $false
19
+ $completed = $false
20
+
21
+ for ($attempt = 0; $attempt -lt 3; $attempt++) {
22
+ $userPath = [Environment]::GetEnvironmentVariable("Path", "User")
23
+ $entries = @($userPath -split ";" | Where-Object {
24
+ -not [string]::IsNullOrWhiteSpace($_)
25
+ })
26
+ $present = @($entries | Where-Object {
27
+ (Normalize-PathEntry $_) -ieq $normalizedGlobalBin
28
+ }).Count -gt 0
29
+
30
+ if ($present) {
31
+ $completed = $true
32
+ break
33
+ }
34
+
35
+ $separator = if ([string]::IsNullOrWhiteSpace($userPath) -or $userPath.TrimEnd().EndsWith(";")) { "" } else { ";" }
36
+ $updatedPath = "$userPath$separator$globalBin"
37
+ if ($updatedPath.Length -ge 32767) {
38
+ throw "The updated user PATH would exceed the Windows environment limit."
39
+ }
40
+
41
+ $latestUserPath = [Environment]::GetEnvironmentVariable("Path", "User")
42
+ if (-not [string]::Equals([string]$latestUserPath, [string]$userPath, [StringComparison]::Ordinal)) {
43
+ continue
44
+ }
45
+
46
+ [Environment]::SetEnvironmentVariable("Path", $updatedPath, "User")
47
+ $changed = $true
48
+ $writtenUserPath = [Environment]::GetEnvironmentVariable("Path", "User")
49
+ if ([string]::Equals([string]$writtenUserPath, [string]$updatedPath, [StringComparison]::Ordinal)) {
50
+ $completed = $true
51
+ break
52
+ }
53
+ }
54
+
55
+ if (-not $completed) {
56
+ throw "The Windows user PATH changed concurrently; retry setup."
57
+ }
58
+
59
+ [Console]::Out.Write((@{ changed = $changed } | ConvertTo-Json -Compress))
60
+ `;
61
+
62
+ export function ensureWindowsNpmGlobalPath(options = {}) {
63
+ const platform = options.platform ?? process.platform;
64
+ const env = options.env ?? process.env;
65
+ if (platform !== "win32") return result("skipped", "unsupported_platform");
66
+
67
+ let globalBin;
68
+ try {
69
+ globalBin = (options.resolveGlobalPrefix ?? resolveWindowsNpmGlobalPrefix)({
70
+ ...options,
71
+ env,
72
+ platform,
73
+ });
74
+ } catch {
75
+ return result("warning", "npm_prefix_unavailable");
76
+ }
77
+ if (typeof globalBin !== "string"
78
+ || globalBin.includes(";")
79
+ || !path.win32.isAbsolute(globalBin.trim())) {
80
+ return result("warning", "npm_prefix_unavailable");
81
+ }
82
+ globalBin = path.win32.normalize(globalBin.trim());
83
+
84
+ const fileExists = options.existsSync ?? existsSync;
85
+ const requiredShims = ["memorax-code.cmd", "memorax-cli.cmd"];
86
+ if (!requiredShims.every((name) => fileExists(path.win32.join(globalBin, name)))) {
87
+ return result("warning", "global_shims_missing");
88
+ }
89
+
90
+ const pathKey = windowsPathKey(env);
91
+ const currentPath = typeof env[pathKey] === "string" ? env[pathKey] : "";
92
+ const processPathChanged = !windowsPathContains(currentPath, globalBin, env);
93
+ if (processPathChanged) {
94
+ env[pathKey] = currentPath
95
+ ? `${currentPath}${currentPath.trimEnd().endsWith(";") ? "" : ";"}${globalBin}`
96
+ : globalBin;
97
+ }
98
+
99
+ let userPathChanged = false;
100
+ try {
101
+ const update = (options.updateUserPath ?? updateWindowsUserPath)(globalBin, {
102
+ ...options,
103
+ env,
104
+ platform,
105
+ });
106
+ if (typeof update?.changed !== "boolean") throw new Error("invalid user PATH update result");
107
+ userPathChanged = update.changed;
108
+ } catch {
109
+ return result("warning", "user_path_update_failed", {
110
+ processPathChanged,
111
+ });
112
+ }
113
+
114
+ const changed = processPathChanged || userPathChanged;
115
+ return result(changed ? "updated" : "unchanged", undefined, {
116
+ processPathChanged,
117
+ userPathChanged,
118
+ restartRecommended: changed,
119
+ });
120
+ }
121
+
122
+ export function resolveWindowsNpmGlobalPrefix(options = {}) {
123
+ const env = options.env ?? process.env;
124
+ const invocation = resolveNpmInvocation(["prefix", "-g"], options);
125
+ const run = options.spawnSync ?? spawnSync;
126
+ const resolved = run(invocation.command, invocation.args, {
127
+ encoding: "utf8",
128
+ env,
129
+ stdio: ["ignore", "pipe", "pipe"],
130
+ timeout: 10_000,
131
+ windowsHide: true,
132
+ });
133
+ if (resolved.error || resolved.signal || resolved.status !== 0) {
134
+ throw new Error("npm global prefix command failed");
135
+ }
136
+ const lines = String(resolved.stdout ?? "").split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
137
+ const prefix = lines.at(-1);
138
+ if (!prefix || !path.win32.isAbsolute(prefix)) throw new Error("npm global prefix is invalid");
139
+ return prefix;
140
+ }
141
+
142
+ export function updateWindowsUserPath(globalBin, options = {}) {
143
+ const env = options.env ?? process.env;
144
+ const run = options.spawnSync ?? spawnSync;
145
+ const powerShell = windowsPowerShellCommand(env, options.existsSync ?? existsSync);
146
+ const encodedCommand = Buffer.from(WINDOWS_USER_PATH_SCRIPT, "utf16le").toString("base64");
147
+ const updated = run(powerShell, [
148
+ "-NoLogo",
149
+ "-NoProfile",
150
+ "-NonInteractive",
151
+ "-EncodedCommand",
152
+ encodedCommand,
153
+ ], {
154
+ encoding: "utf8",
155
+ env: { ...env, MEMORAX_CODE_WINDOWS_NPM_GLOBAL_BIN: globalBin },
156
+ stdio: ["ignore", "pipe", "pipe"],
157
+ timeout: 10_000,
158
+ windowsHide: true,
159
+ });
160
+ if (updated.error || updated.signal || updated.status !== 0) {
161
+ throw new Error("Windows user PATH update failed");
162
+ }
163
+ let parsed;
164
+ try {
165
+ parsed = JSON.parse(String(updated.stdout ?? "").trim());
166
+ } catch {
167
+ throw new Error("Windows user PATH update returned invalid output");
168
+ }
169
+ if (typeof parsed?.changed !== "boolean") {
170
+ throw new Error("Windows user PATH update returned an invalid result");
171
+ }
172
+ return { changed: parsed.changed };
173
+ }
174
+
175
+ function windowsPathKey(env) {
176
+ return Object.keys(env).find((key) => key.toLowerCase() === "path") ?? "Path";
177
+ }
178
+
179
+ function windowsPathContains(pathValue, expected, env) {
180
+ const normalizedExpected = normalizeWindowsPathEntry(expected, env);
181
+ return String(pathValue ?? "").split(";").some((entry) => (
182
+ normalizeWindowsPathEntry(entry, env) === normalizedExpected
183
+ ));
184
+ }
185
+
186
+ function normalizeWindowsPathEntry(value, env) {
187
+ const expanded = String(value ?? "")
188
+ .trim()
189
+ .replace(/^"|"$/g, "")
190
+ .replace(/%([^%]+)%/g, (match, name) => environmentValue(env, name) ?? match);
191
+ if (!expanded) return "";
192
+ return path.win32.normalize(expanded).replace(/[\\/]+$/, "").toLowerCase();
193
+ }
194
+
195
+ function environmentValue(env, name) {
196
+ const key = Object.keys(env).find((candidate) => candidate.toLowerCase() === name.toLowerCase());
197
+ return key === undefined ? undefined : env[key];
198
+ }
199
+
200
+ function windowsPowerShellCommand(env, fileExists) {
201
+ const systemRoot = environmentValue(env, "SystemRoot") ?? environmentValue(env, "WINDIR");
202
+ if (systemRoot) {
203
+ const candidate = path.win32.join(systemRoot, "System32", "WindowsPowerShell", "v1.0", "powershell.exe");
204
+ if (fileExists(candidate)) return candidate;
205
+ }
206
+ return "powershell.exe";
207
+ }
208
+
209
+ function result(status, reason, overrides = {}) {
210
+ return {
211
+ status,
212
+ ...(reason ? { reason } : {}),
213
+ processPathChanged: false,
214
+ userPathChanged: false,
215
+ restartRecommended: false,
216
+ ...overrides,
217
+ };
218
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@memorax/memorax-code",
3
- "version": "0.1.9",
4
- "description": "Persistent coding memory for Codex, Claude Code, DeepSeek Harness, and OpenCode.",
3
+ "version": "0.1.11",
4
+ "description": "Persistent coding memory for Codex, Claude Code, CodeBuddy/WorkBuddy, DeepSeek Harness, and OpenCode.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "homepage": "https://github.com/memorax-ai/memorax-code#readme",
@@ -18,6 +18,7 @@
18
18
  "deepseek-harness",
19
19
  "dsh",
20
20
  "opencode",
21
+ "codebuddy",
21
22
  "memory",
22
23
  "memorax"
23
24
  ],
@@ -27,7 +28,8 @@
27
28
  "memorax-code-backend": "bin/memorax-code-backend.mjs",
28
29
  "memorax-code-claude": "bin/memorax-code-claude.mjs",
29
30
  "memorax-code-codex": "bin/memorax-code-codex.mjs",
30
- "memorax-code-opencode": "bin/memorax-code-opencode.mjs"
31
+ "memorax-code-opencode": "bin/memorax-code-opencode.mjs",
32
+ "memorax-code-codebuddy": "bin/memorax-code-codebuddy.mjs"
31
33
  },
32
34
  "files": [
33
35
  "bin",