@memorax/memorax-code 0.1.0

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 (282) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +53 -0
  3. package/bin/memorax-cli.mjs +28 -0
  4. package/bin/memorax-code-backend.mjs +4 -0
  5. package/bin/memorax-code-claude.mjs +4 -0
  6. package/bin/memorax-code-codex.mjs +4 -0
  7. package/bin/memorax-code-npm-preinstall.mjs +55 -0
  8. package/bin/memorax-code-plugin-postinstall.mjs +1236 -0
  9. package/bin/memorax-code.mjs +204 -0
  10. package/docs/configuration.md +232 -0
  11. package/docs/troubleshooting.md +179 -0
  12. package/lib/client-hook-runtime.mjs +32 -0
  13. package/lib/memorax-code-adapter-common/src/backend-connection.d.mts +111 -0
  14. package/lib/memorax-code-adapter-common/src/backend-connection.mjs +304 -0
  15. package/lib/memorax-code-adapter-common/src/clients/claude-command.mjs +38 -0
  16. package/lib/memorax-code-adapter-common/src/clients/codex-command.mjs +41 -0
  17. package/lib/memorax-code-adapter-common/src/clients/codex-plugin-artifact.d.mts +3 -0
  18. package/lib/memorax-code-adapter-common/src/clients/codex-plugin-artifact.mjs +38 -0
  19. package/lib/memorax-code-adapter-common/src/config-utils.d.mts +27 -0
  20. package/lib/memorax-code-adapter-common/src/config-utils.mjs +391 -0
  21. package/lib/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +137 -0
  22. package/lib/memorax-code-adapter-common/src/hooks/client-hook-launcher.mjs +324 -0
  23. package/lib/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +142 -0
  24. package/lib/memorax-code-adapter-common/src/hooks/hook-runtime-generation.d.mts +38 -0
  25. package/lib/memorax-code-adapter-common/src/hooks/hook-runtime-generation.mjs +501 -0
  26. package/lib/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +277 -0
  27. package/lib/memorax-code-adapter-common/src/memorax-code-config-file.d.mts +28 -0
  28. package/lib/memorax-code-adapter-common/src/memorax-code-config-file.mjs +296 -0
  29. package/lib/memorax-code-adapter-common/src/memorax-defaults.d.mts +10 -0
  30. package/lib/memorax-code-adapter-common/src/memorax-defaults.mjs +12 -0
  31. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-context.mjs +28 -0
  32. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-marker.mjs +252 -0
  33. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +559 -0
  34. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-job-worker.mjs +411 -0
  35. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy-evaluator.mjs +185 -0
  36. package/lib/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy.mjs +165 -0
  37. package/lib/memorax-code-adapter-common/src/repo-memory/repo-procedure-memory-context.mjs +181 -0
  38. package/lib/memorax-code-adapter-common/src/repo-memory/repo-user-profile-context.mjs +251 -0
  39. package/lib/memorax-code-adapter-common/src/runtime-record.d.mts +55 -0
  40. package/lib/memorax-code-adapter-common/src/runtime-record.mjs +152 -0
  41. package/lib/memorax-code-adapter-common/src/windows-cli-invocation.mjs +100 -0
  42. package/lib/memorax-code-backend/dist/active-client-selection.js +35 -0
  43. package/lib/memorax-code-backend/dist/adapter-lifecycle-participant.js +1 -0
  44. package/lib/memorax-code-backend/dist/automatic-memory-retrieval.js +113 -0
  45. package/lib/memorax-code-backend/dist/automatic-memory-writeback.js +297 -0
  46. package/lib/memorax-code-backend/dist/backend-env.js +13 -0
  47. package/lib/memorax-code-backend/dist/backend-lifecycle-lock.js +42 -0
  48. package/lib/memorax-code-backend/dist/backend-process.js +147 -0
  49. package/lib/memorax-code-backend/dist/backend-service-cleanup.js +18 -0
  50. package/lib/memorax-code-backend/dist/backend-service-record.js +206 -0
  51. package/lib/memorax-code-backend/dist/backend-service-result.js +37 -0
  52. package/lib/memorax-code-backend/dist/backend-service-token.js +11 -0
  53. package/lib/memorax-code-backend/dist/backend-shutdown-request.js +133 -0
  54. package/lib/memorax-code-backend/dist/backend-state.js +58 -0
  55. package/lib/memorax-code-backend/dist/backend-status.js +53 -0
  56. package/lib/memorax-code-backend/dist/backend-token-record.js +79 -0
  57. package/lib/memorax-code-backend/dist/claude-adapter-lifecycle.js +134 -0
  58. package/lib/memorax-code-backend/dist/claude-local-transcript.js +648 -0
  59. package/lib/memorax-code-backend/dist/claude-memory-hook-runtime.js +472 -0
  60. package/lib/memorax-code-backend/dist/claude-transcript-turn.js +876 -0
  61. package/lib/memorax-code-backend/dist/client-plugin-removal.js +67 -0
  62. package/lib/memorax-code-backend/dist/client-selection.js +36 -0
  63. package/lib/memorax-code-backend/dist/codex-adapter-lifecycle.js +131 -0
  64. package/lib/memorax-code-backend/dist/codex-effective-prompt.js +54 -0
  65. package/lib/memorax-code-backend/dist/codex-memory-hook-runtime.js +541 -0
  66. package/lib/memorax-code-backend/dist/codex-plugin-hooks.js +421 -0
  67. package/lib/memorax-code-backend/dist/codex-plugin-install.js +523 -0
  68. package/lib/memorax-code-backend/dist/codex-rollout-turn.js +402 -0
  69. package/lib/memorax-code-backend/dist/codex-session-turn-index.js +88 -0
  70. package/lib/memorax-code-backend/dist/codex-workspace-links.js +55 -0
  71. package/lib/memorax-code-backend/dist/debug-log.js +21 -0
  72. package/lib/memorax-code-backend/dist/entrypoint.js +14 -0
  73. package/lib/memorax-code-backend/dist/incremental-jsonl-projection.js +271 -0
  74. package/lib/memorax-code-backend/dist/install-watchdog.js +71 -0
  75. package/lib/memorax-code-backend/dist/jsonl-append.js +75 -0
  76. package/lib/memorax-code-backend/dist/memorax-adapter.js +451 -0
  77. package/lib/memorax-code-backend/dist/memorax-cli.js +14 -0
  78. package/lib/memorax-code-backend/dist/memorax-code-config.js +279 -0
  79. package/lib/memorax-code-backend/dist/memorax-code-lifecycle.js +523 -0
  80. package/lib/memorax-code-backend/dist/memorax-code.js +3 -0
  81. package/lib/memorax-code-backend/dist/memorax-config.js +283 -0
  82. package/lib/memorax-code-backend/dist/memorax-http.js +142 -0
  83. package/lib/memorax-code-backend/dist/memory-cli.js +345 -0
  84. package/lib/memorax-code-backend/dist/memory-hook-command.js +200 -0
  85. package/lib/memorax-code-backend/dist/memory-observability.js +1 -0
  86. package/lib/memorax-code-backend/dist/memory-project.js +89 -0
  87. package/lib/memorax-code-backend/dist/memory-reminder-trace-recorder.js +58 -0
  88. package/lib/memorax-code-backend/dist/memory-service.js +66 -0
  89. package/lib/memorax-code-backend/dist/memory-turn-coordinator.js +139 -0
  90. package/lib/memorax-code-backend/dist/memory-viewer-activity.js +113 -0
  91. package/lib/memorax-code-backend/dist/memory-viewer-data-projection-cache.js +69 -0
  92. package/lib/memorax-code-backend/dist/memory-viewer-event-identity.js +3 -0
  93. package/lib/memorax-code-backend/dist/memory-viewer-history-projection.js +79 -0
  94. package/lib/memorax-code-backend/dist/memory-viewer-logo.js +1 -0
  95. package/lib/memorax-code-backend/dist/memory-viewer-observability.js +8 -0
  96. package/lib/memorax-code-backend/dist/memory-viewer-redaction.js +52 -0
  97. package/lib/memorax-code-backend/dist/memory-viewer-session-title.js +93 -0
  98. package/lib/memorax-code-backend/dist/memory-viewer-store.js +964 -0
  99. package/lib/memorax-code-backend/dist/memory-viewer-turn-reference.js +12 -0
  100. package/lib/memorax-code-backend/dist/memory-viewer-user-html.js +115 -0
  101. package/lib/memorax-code-backend/dist/memory-viewer-user-projection.js +168 -0
  102. package/lib/memorax-code-backend/dist/memory-viewer-writeback-status.js +97 -0
  103. package/lib/memorax-code-backend/dist/memory-writeback-buffer.js +217 -0
  104. package/lib/memorax-code-backend/dist/memory-writeback-chunk.js +120 -0
  105. package/lib/memorax-code-backend/dist/memory-writeback-reconciler.js +244 -0
  106. package/lib/memorax-code-backend/dist/memory-writeback-task-projection.js +377 -0
  107. package/lib/memorax-code-backend/dist/proxy-env.js +54 -0
  108. package/lib/memorax-code-backend/dist/repo-memory-readiness.js +188 -0
  109. package/lib/memorax-code-backend/dist/repository-memory-context.js +134 -0
  110. package/lib/memorax-code-backend/dist/repository-memory-scope.js +490 -0
  111. package/lib/memorax-code-backend/dist/server-cli.js +787 -0
  112. package/lib/memorax-code-backend/dist/server-health.js +16 -0
  113. package/lib/memorax-code-backend/dist/server-http.js +110 -0
  114. package/lib/memorax-code-backend/dist/server-json.js +4 -0
  115. package/lib/memorax-code-backend/dist/server-memory-hook.js +32 -0
  116. package/lib/memorax-code-backend/dist/server-memory-viewer.js +135 -0
  117. package/lib/memorax-code-backend/dist/server-observability.js +102 -0
  118. package/lib/memorax-code-backend/dist/server.js +220 -0
  119. package/lib/memorax-code-backend/dist/service-entrypoint.js +10 -0
  120. package/lib/memorax-code-backend/dist/service.js +567 -0
  121. package/lib/memorax-code-backend/dist/trace-config.js +112 -0
  122. package/lib/memorax-code-backend/dist/trace-context.js +111 -0
  123. package/lib/memorax-code-backend/dist/trace-store.js +571 -0
  124. package/lib/memorax-code-backend/dist/utils.js +3 -0
  125. package/lib/memorax-code-backend/dist/windows-cli-invocation.js +148 -0
  126. package/lib/memorax-code-backend/package.json +26 -0
  127. package/lib/memorax-code-claude-adapter/.claude-plugin/plugin.json +15 -0
  128. package/lib/memorax-code-claude-adapter/hooks/hook-launcher.mjs +27 -0
  129. package/lib/memorax-code-claude-adapter/hooks/hooks.json +66 -0
  130. package/lib/memorax-code-claude-adapter/hooks/repo-memory-job.mjs +37 -0
  131. package/lib/memorax-code-claude-adapter/hooks/runtime-hook.mjs +4 -0
  132. package/lib/memorax-code-claude-adapter/hooks/runtime-shell.json +5 -0
  133. package/lib/memorax-code-claude-adapter/package.json +13 -0
  134. package/lib/memorax-code-claude-adapter/runtime-hooks/capture-cwd.mjs +17 -0
  135. package/lib/memorax-code-claude-adapter/runtime-hooks/ensure-backend.mjs +59 -0
  136. package/lib/memorax-code-claude-adapter/runtime-hooks/memory-cli-session.mjs +33 -0
  137. package/lib/memorax-code-claude-adapter/runtime-hooks/memory-skill-reminder.mjs +73 -0
  138. package/lib/memorax-code-claude-adapter/runtime-hooks/memory-turn.mjs +91 -0
  139. package/lib/memorax-code-claude-adapter/scripts/build-marketplace.mjs +99 -0
  140. package/lib/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +83 -0
  141. package/lib/memorax-code-claude-adapter/skills/memorax-code/agents/claude.yaml +10 -0
  142. package/lib/memorax-code-claude-adapter/skills/memorax-code/agents/openai.yaml +7 -0
  143. package/lib/memorax-code-claude-adapter/skills/memorax-code/defaults.json +9 -0
  144. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +82 -0
  145. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +61 -0
  146. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +46 -0
  147. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +100 -0
  148. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +270 -0
  149. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +96 -0
  150. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +270 -0
  151. package/lib/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +116 -0
  152. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +496 -0
  153. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +856 -0
  154. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
  155. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +504 -0
  156. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +509 -0
  157. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
  158. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
  159. package/lib/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +226 -0
  160. package/lib/memorax-code-claude-adapter/src/adapter-paths.mjs +46 -0
  161. package/lib/memorax-code-claude-adapter/src/cli.mjs +363 -0
  162. package/lib/memorax-code-claude-adapter/src/config-utils.mjs +1 -0
  163. package/lib/memorax-code-claude-adapter/src/config.mjs +544 -0
  164. package/lib/memorax-code-claude-adapter/src/plugin-artifact-contract.mjs +148 -0
  165. package/lib/memorax-code-claude-adapter/src/plugin-install.mjs +566 -0
  166. package/lib/memorax-code-claude-marketplace/.claude-plugin/marketplace.json +15 -0
  167. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/.claude-plugin/plugin.json +15 -0
  168. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/hook-launcher.mjs +27 -0
  169. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/hooks.json +66 -0
  170. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/repo-memory-job.mjs +37 -0
  171. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-hook.mjs +4 -0
  172. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/hooks/runtime-shell.json +5 -0
  173. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/backend-connection.d.mts +111 -0
  174. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/backend-connection.mjs +304 -0
  175. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/claude-command.mjs +38 -0
  176. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/codex-command.mjs +41 -0
  177. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/codex-plugin-artifact.d.mts +3 -0
  178. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/clients/codex-plugin-artifact.mjs +38 -0
  179. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/config-utils.d.mts +27 -0
  180. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/config-utils.mjs +391 -0
  181. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs +137 -0
  182. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/client-hook-launcher.mjs +324 -0
  183. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs +142 -0
  184. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/hook-runtime-generation.d.mts +38 -0
  185. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/hook-runtime-generation.mjs +501 -0
  186. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs +277 -0
  187. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-code-config-file.d.mts +28 -0
  188. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-code-config-file.mjs +296 -0
  189. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-defaults.d.mts +10 -0
  190. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/memorax-defaults.mjs +12 -0
  191. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-context.mjs +28 -0
  192. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-marker.mjs +252 -0
  193. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-supervisor.mjs +559 -0
  194. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-job-worker.mjs +411 -0
  195. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy-evaluator.mjs +185 -0
  196. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-memory-update-policy.mjs +165 -0
  197. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-procedure-memory-context.mjs +181 -0
  198. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/repo-memory/repo-user-profile-context.mjs +251 -0
  199. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/runtime-record.d.mts +55 -0
  200. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/runtime-record.mjs +152 -0
  201. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/memorax-code-adapter-common/src/windows-cli-invocation.mjs +100 -0
  202. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/package.json +13 -0
  203. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/capture-cwd.mjs +17 -0
  204. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/ensure-backend.mjs +59 -0
  205. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/memory-cli-session.mjs +33 -0
  206. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/memory-skill-reminder.mjs +73 -0
  207. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/runtime-hooks/memory-turn.mjs +91 -0
  208. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/scripts/build-marketplace.mjs +99 -0
  209. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/SKILL.md +83 -0
  210. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/agents/claude.yaml +10 -0
  211. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/agents/openai.yaml +7 -0
  212. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/defaults.json +9 -0
  213. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-add.md +82 -0
  214. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/memorax-search.md +61 -0
  215. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-read.md +46 -0
  216. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/personal-write.md +100 -0
  217. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-build.md +270 -0
  218. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-read.md +96 -0
  219. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-templates.md +270 -0
  220. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/references/repo-update.md +116 -0
  221. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/collect_all.py +496 -0
  222. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/detect_updates.py +856 -0
  223. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
  224. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/github_resource_facets.py +504 -0
  225. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +509 -0
  226. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
  227. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
  228. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/skills/memorax-code/scripts/validate_memory.py +226 -0
  229. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/adapter-paths.mjs +46 -0
  230. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/cli.mjs +363 -0
  231. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/config-utils.mjs +1 -0
  232. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/config.mjs +544 -0
  233. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-artifact-contract.mjs +148 -0
  234. package/lib/memorax-code-claude-marketplace/plugins/memorax-code-claude-adapter/src/plugin-install.mjs +566 -0
  235. package/lib/memorax-code-codex-adapter/.codex-plugin/plugin.json +33 -0
  236. package/lib/memorax-code-codex-adapter/assets/composer-icon.png +0 -0
  237. package/lib/memorax-code-codex-adapter/assets/logo.png +0 -0
  238. package/lib/memorax-code-codex-adapter/hooks/hook-launcher.mjs +26 -0
  239. package/lib/memorax-code-codex-adapter/hooks/hooks.json +61 -0
  240. package/lib/memorax-code-codex-adapter/hooks/repo-memory-job.mjs +38 -0
  241. package/lib/memorax-code-codex-adapter/hooks/repo-memory-update-policy.mjs +10 -0
  242. package/lib/memorax-code-codex-adapter/hooks/runtime-hook.mjs +4 -0
  243. package/lib/memorax-code-codex-adapter/hooks/runtime-shell.json +5 -0
  244. package/lib/memorax-code-codex-adapter/package.json +13 -0
  245. package/lib/memorax-code-codex-adapter/runtime-hooks/capture-cwd.mjs +18 -0
  246. package/lib/memorax-code-codex-adapter/runtime-hooks/ensure-backend.mjs +82 -0
  247. package/lib/memorax-code-codex-adapter/runtime-hooks/memory-skill-reminder.mjs +125 -0
  248. package/lib/memorax-code-codex-adapter/runtime-hooks/memory-writeback.mjs +52 -0
  249. package/lib/memorax-code-codex-adapter/skills/memorax-code/SKILL.md +83 -0
  250. package/lib/memorax-code-codex-adapter/skills/memorax-code/agents/claude.yaml +10 -0
  251. package/lib/memorax-code-codex-adapter/skills/memorax-code/agents/openai.yaml +7 -0
  252. package/lib/memorax-code-codex-adapter/skills/memorax-code/defaults.json +9 -0
  253. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-add.md +82 -0
  254. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/memorax-search.md +61 -0
  255. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-read.md +46 -0
  256. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/personal-write.md +100 -0
  257. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-build.md +270 -0
  258. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-read.md +96 -0
  259. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-templates.md +270 -0
  260. package/lib/memorax-code-codex-adapter/skills/memorax-code/references/repo-update.md +116 -0
  261. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/collect_all.py +496 -0
  262. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/detect_updates.py +856 -0
  263. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/git_commit_facets.py +222 -0
  264. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/github_resource_facets.py +504 -0
  265. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/gitlab_resource_facets.py +509 -0
  266. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/prepare_repo_memory.py +411 -0
  267. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/user_profile_memory.py +528 -0
  268. package/lib/memorax-code-codex-adapter/skills/memorax-code/scripts/validate_memory.py +226 -0
  269. package/lib/memorax-code-codex-adapter/src/adapter-paths.mjs +29 -0
  270. package/lib/memorax-code-codex-adapter/src/cli.mjs +368 -0
  271. package/lib/memorax-code-codex-adapter/src/config-utils.mjs +1 -0
  272. package/lib/memorax-code-codex-adapter/src/config.mjs +226 -0
  273. package/lib/memorax-code-codex-adapter/src/session-registry.mjs +331 -0
  274. package/lib/memorax-code-codex-adapter/src/workspace-kind.mjs +68 -0
  275. package/lib/node-version.mjs +11 -0
  276. package/lib/npm-invocation.mjs +31 -0
  277. package/lib/resolve-claude-command.mjs +47 -0
  278. package/lib/resolve-codex-command.mjs +94 -0
  279. package/lib/run-entrypoint.mjs +83 -0
  280. package/lib/vscode-extension-command.mjs +119 -0
  281. package/lib/windows-cli-invocation.mjs +100 -0
  282. package/package.json +45 -0
@@ -0,0 +1,566 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { existsSync, lstatSync, mkdirSync, realpathSync, rmSync } from "node:fs";
4
+ import { dirname, join, resolve } from "node:path";
5
+ import { isDeepStrictEqual } from "node:util";
6
+ import { fileURLToPath } from "node:url";
7
+ import { claudeSettingsPath, defaultClaudeHome, defaultMemoraxCodeHome, installedMarketplacePath } from "./adapter-paths.mjs";
8
+ import { atomicWriteJson, readJsonFile, stringOption } from "./config-utils.mjs";
9
+ import {
10
+ CLAUDE_PLUGIN_HOOK_COMMAND_FILES,
11
+ collectClaudePluginArtifactSources,
12
+ describeClaudePluginArtifactProblems,
13
+ inspectClaudePluginArtifact,
14
+ } from "./plugin-artifact-contract.mjs";
15
+ import { resolveWindowsCliInvocation } from "../memorax-code-adapter-common/src/windows-cli-invocation.mjs";
16
+
17
+ const MARKETPLACE_NAME = "memorax-code-local";
18
+ const PLUGIN_ID = "memorax-code-claude-adapter@memorax-code-local";
19
+ const ADAPTER_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
20
+ const STABLE_SHELL_REQUIRED_FILES = Object.freeze([
21
+ ".claude-plugin/plugin.json",
22
+ "hooks/hooks.json",
23
+ "hooks/runtime-shell.json",
24
+ "hooks/runtime-hook.mjs",
25
+ "hooks/hook-launcher.mjs",
26
+ "runtime-hooks/capture-cwd.mjs",
27
+ "runtime-hooks/ensure-backend.mjs",
28
+ "runtime-hooks/memory-cli-session.mjs",
29
+ "runtime-hooks/memory-skill-reminder.mjs",
30
+ "runtime-hooks/memory-turn.mjs",
31
+ "memorax-code-adapter-common/src/backend-connection.mjs",
32
+ "memorax-code-adapter-common/src/hooks/capture-cwd-hook.mjs",
33
+ "memorax-code-adapter-common/src/hooks/client-hook-launcher.mjs",
34
+ "memorax-code-adapter-common/src/config-utils.mjs",
35
+ "memorax-code-adapter-common/src/hooks/ensure-backend-runner.mjs",
36
+ "memorax-code-adapter-common/src/hooks/hook-runtime-generation.mjs",
37
+ "memorax-code-adapter-common/src/hooks/memory-skill-reminder-hook.mjs",
38
+ "memorax-code-adapter-common/src/repo-memory/repo-memory-job-context.mjs",
39
+ "memorax-code-adapter-common/src/repo-memory/repo-procedure-memory-context.mjs",
40
+ "memorax-code-adapter-common/src/repo-memory/repo-user-profile-context.mjs",
41
+ "memorax-code-adapter-common/src/runtime-record.mjs",
42
+ ]);
43
+
44
+ export function ensureClaudePluginInstalled(options = {}) {
45
+ const claudeHome = options.claudeHome ?? defaultClaudeHome();
46
+ const memoraxCodeHome = options.memoraxCodeHome ?? defaultMemoraxCodeHome();
47
+ const configuredPath = configuredMarketplacePath(claudeHome);
48
+ const marketplacePath = options.marketplacePath
49
+ ?? (marketplaceExists(configuredPath) ? configuredPath : installedMarketplacePath(memoraxCodeHome));
50
+ const claudeCommand = stringOption(options.claudeCommand) ?? process.env.MEMORAX_CODE_CLAUDE_COMMAND ?? "claude";
51
+ if (!marketplacePath || !existsSync(join(marketplacePath, ".claude-plugin", "marketplace.json"))) {
52
+ return {
53
+ ok: false,
54
+ action: "claude-plugin-install",
55
+ reason: "marketplace_missing",
56
+ message: `MemoraX Code Claude marketplace is missing: ${marketplacePath}`,
57
+ claudeHome,
58
+ marketplacePath,
59
+ };
60
+ }
61
+
62
+ mkdirSync(claudeHome, { recursive: true });
63
+ const current = listClaudePlugins(claudeCommand, claudeHome, options);
64
+ if (!current.ok) return installFailure("plugin_status_failed", current, claudeHome, marketplacePath);
65
+ const marketplaceStatus = listClaudeMarketplaces(claudeCommand, claudeHome, options);
66
+ if (!marketplaceStatus.ok) {
67
+ return installFailure("marketplace_status_failed", marketplaceStatus, claudeHome, marketplacePath);
68
+ }
69
+ const registeredMarketplace = marketplaceStatus.marketplaces.find((entry) => entry?.name === MARKETPLACE_NAME);
70
+ const marketplaceReplaced = Boolean(
71
+ registeredMarketplace && !marketplaceUsesPath(registeredMarketplace, marketplacePath),
72
+ );
73
+ const previouslyInstalled = current.plugins.find((entry) => entry?.id === PLUGIN_ID);
74
+ const expectedVersion = expectedPluginVersion();
75
+ if (registeredMarketplace
76
+ && !marketplaceReplaced
77
+ && installedPluginShellIsCurrent(previouslyInstalled, expectedVersion)) {
78
+ let installedPlugin = previouslyInstalled;
79
+ const wasEnabled = installedPlugin.enabled === true;
80
+ if (installedPlugin.enabled !== true) {
81
+ const enable = runClaudePluginCommand(
82
+ claudeCommand,
83
+ claudeHome,
84
+ ["plugin", "enable", PLUGIN_ID, "--scope", "user"],
85
+ options,
86
+ );
87
+ if (!enable.ok) return installFailure("plugin_enable_failed", enable, claudeHome, marketplacePath);
88
+ const refreshed = listClaudePlugins(claudeCommand, claudeHome, options);
89
+ if (!refreshed.ok) return installFailure("plugin_verify_failed", refreshed, claudeHome, marketplacePath);
90
+ installedPlugin = refreshed.plugins.find((entry) => entry?.id === PLUGIN_ID);
91
+ if (!installedPluginShellIsCurrent(installedPlugin, expectedVersion)
92
+ || installedPlugin?.enabled !== true) {
93
+ return {
94
+ ok: false,
95
+ action: "claude-plugin-install",
96
+ reason: "plugin_shell_verify_failed",
97
+ message: "Claude did not preserve the current MemoraX Code plugin shell after enablement.",
98
+ claudeHome,
99
+ marketplacePath,
100
+ };
101
+ }
102
+ }
103
+ const installPath = stringOption(installedPlugin.installPath);
104
+ writeInstalledPluginMetadata(installPath, claudeCommand);
105
+ writePluginState({
106
+ claudeHome,
107
+ memoraxCodeHome,
108
+ installPath,
109
+ marketplacePath,
110
+ pluginVersion: expectedVersion,
111
+ });
112
+ return {
113
+ ok: true,
114
+ action: "claude-plugin-install",
115
+ claudeHome,
116
+ marketplacePath,
117
+ marketplace: MARKETPLACE_NAME,
118
+ plugin: PLUGIN_ID,
119
+ pluginVersion: expectedVersion,
120
+ installPath,
121
+ enabled: true,
122
+ updated: false,
123
+ shellUnchanged: true,
124
+ restartRequired: !wasEnabled,
125
+ message: wasEnabled
126
+ ? "Claude plugin shell is current; active sessions keep their loaded shell and select runtime generations per turn."
127
+ : "Claude plugin shell is current and has been enabled. Restart or refresh Claude Code to load it.",
128
+ };
129
+ }
130
+ let installed = previouslyInstalled;
131
+ if (marketplaceReplaced) {
132
+ if (installed) {
133
+ const uninstall = runClaudePluginCommand(
134
+ claudeCommand,
135
+ claudeHome,
136
+ ["plugin", "uninstall", PLUGIN_ID, "--scope", "user", "--yes", "--keep-data"],
137
+ { ...options, allowNotFound: true },
138
+ );
139
+ if (!uninstall.ok) {
140
+ return installFailure("stale_plugin_uninstall_failed", uninstall, claudeHome, marketplacePath);
141
+ }
142
+ installed = undefined;
143
+ }
144
+ const remove = removeClaudeMarketplace(claudeCommand, claudeHome, options);
145
+ if (!remove.ok) return installFailure("marketplace_replace_failed", remove, claudeHome, marketplacePath);
146
+ }
147
+ const marketplaceArgs = registeredMarketplace && !marketplaceReplaced
148
+ ? ["plugin", "marketplace", "update", MARKETPLACE_NAME]
149
+ : ["plugin", "marketplace", "add", marketplacePath];
150
+ const marketplace = runClaudePluginCommand(claudeCommand, claudeHome, marketplaceArgs, options);
151
+ if (!marketplace.ok) {
152
+ return installFailure(
153
+ installed ? "marketplace_update_failed" : "marketplace_add_failed",
154
+ marketplace,
155
+ claudeHome,
156
+ marketplacePath,
157
+ );
158
+ }
159
+ const pluginArgs = installed
160
+ ? ["plugin", "update", PLUGIN_ID, "--scope", "user"]
161
+ : ["plugin", "install", PLUGIN_ID, "--scope", "user"];
162
+ const plugin = runClaudePluginCommand(claudeCommand, claudeHome, pluginArgs, options);
163
+ if (!plugin.ok) {
164
+ return installFailure(
165
+ installed ? "plugin_update_failed" : "plugin_install_failed",
166
+ plugin,
167
+ claudeHome,
168
+ marketplacePath,
169
+ );
170
+ }
171
+ let refreshed = listClaudePlugins(claudeCommand, claudeHome, options);
172
+ if (!refreshed.ok) return installFailure("plugin_verify_failed", refreshed, claudeHome, marketplacePath);
173
+ let installedPlugin = refreshed.plugins.find((entry) => entry?.id === PLUGIN_ID);
174
+ if (installedPlugin && installedPlugin.enabled !== true) {
175
+ const enable = runClaudePluginCommand(
176
+ claudeCommand,
177
+ claudeHome,
178
+ ["plugin", "enable", PLUGIN_ID, "--scope", "user"],
179
+ options,
180
+ );
181
+ if (!enable.ok) return installFailure("plugin_enable_failed", enable, claudeHome, marketplacePath);
182
+ refreshed = listClaudePlugins(claudeCommand, claudeHome, options);
183
+ if (!refreshed.ok) return installFailure("plugin_verify_failed", refreshed, claudeHome, marketplacePath);
184
+ installedPlugin = refreshed.plugins.find((entry) => entry?.id === PLUGIN_ID);
185
+ }
186
+ const verification = verifyInstalledPlugin(installedPlugin, expectedVersion);
187
+ if (!verification.ok) {
188
+ return {
189
+ ok: false,
190
+ action: "claude-plugin-install",
191
+ reason: verification.reason,
192
+ message: verification.message,
193
+ claudeHome,
194
+ marketplacePath,
195
+ expectedVersion,
196
+ installedVersion: stringOption(installedPlugin?.version),
197
+ installPath: stringOption(installedPlugin?.installPath),
198
+ };
199
+ }
200
+ writeInstalledPluginMetadata(verification.installPath, claudeCommand);
201
+ writePluginState({
202
+ claudeHome,
203
+ memoraxCodeHome,
204
+ installPath: verification.installPath,
205
+ marketplacePath,
206
+ pluginVersion: expectedVersion,
207
+ });
208
+
209
+ return {
210
+ ok: true,
211
+ action: "claude-plugin-install",
212
+ claudeHome,
213
+ marketplacePath,
214
+ marketplace: MARKETPLACE_NAME,
215
+ plugin: PLUGIN_ID,
216
+ pluginVersion: expectedVersion,
217
+ installPath: verification.installPath,
218
+ enabled: true,
219
+ updated: Boolean(previouslyInstalled),
220
+ ...(marketplaceReplaced ? { marketplaceReplaced: true } : {}),
221
+ restartRequired: true,
222
+ message: "Restart or refresh Claude Code to load the verified MemoraX Code memory Hooks.",
223
+ };
224
+ }
225
+
226
+ function writeInstalledPluginMetadata(installPath, claudeCommand) {
227
+ atomicWriteJson(join(installPath, ".memorax-code-package.json"), {
228
+ version: 1,
229
+ memoraxCodeCommand: process.argv[1],
230
+ claudeCommand,
231
+ writtenAt: new Date().toISOString(),
232
+ });
233
+ }
234
+
235
+ function writePluginState({
236
+ claudeHome,
237
+ memoraxCodeHome,
238
+ installPath,
239
+ marketplacePath,
240
+ pluginVersion,
241
+ }) {
242
+ atomicWriteJson(pluginStatePath(memoraxCodeHome, claudeHome), {
243
+ version: 1,
244
+ plugin: PLUGIN_ID,
245
+ pluginVersion,
246
+ installPath,
247
+ marketplace: MARKETPLACE_NAME,
248
+ claudeHome: resolve(claudeHome),
249
+ marketplacePath,
250
+ updatedAt: new Date().toISOString(),
251
+ });
252
+ }
253
+
254
+ function configuredMarketplacePath(claudeHome) {
255
+ const settings = readJsonFile(claudeSettingsPath(claudeHome));
256
+ if (settings?.unreadable) return undefined;
257
+ return stringOption(settings?.value?.extraKnownMarketplaces?.[MARKETPLACE_NAME]?.source?.path);
258
+ }
259
+
260
+ export function removeClaudePluginInstallation(options = {}) {
261
+ const claudeHome = options.claudeHome ?? defaultClaudeHome();
262
+ const memoraxCodeHome = options.memoraxCodeHome ?? defaultMemoraxCodeHome();
263
+ const claudeCommand = stringOption(options.claudeCommand) ?? process.env.MEMORAX_CODE_CLAUDE_COMMAND ?? "claude";
264
+ const statePath = pluginStatePath(memoraxCodeHome, claudeHome);
265
+ if (!hasPluginRegistration(claudeHome) && !existsSync(statePath)) {
266
+ return {
267
+ ok: true,
268
+ action: "claude-plugin-remove",
269
+ skipped: true,
270
+ reason: "not_registered",
271
+ claudeHome,
272
+ marketplace: MARKETPLACE_NAME,
273
+ plugin: PLUGIN_ID,
274
+ };
275
+ }
276
+ mkdirSync(claudeHome, { recursive: true });
277
+
278
+ const plugin = runClaudePluginCommand(
279
+ claudeCommand,
280
+ claudeHome,
281
+ ["plugin", "uninstall", PLUGIN_ID, "--scope", "user", "--yes", "--keep-data"],
282
+ { ...options, allowNotFound: true },
283
+ );
284
+ if (!plugin.ok) return removeFailure("plugin_uninstall_failed", plugin, claudeHome);
285
+ const marketplace = removeClaudeMarketplace(claudeCommand, claudeHome, options);
286
+ if (!marketplace.ok) return removeFailure("marketplace_remove_failed", marketplace, claudeHome);
287
+ rmSync(statePath, { force: true });
288
+
289
+ return {
290
+ ok: true,
291
+ action: "claude-plugin-remove",
292
+ claudeHome,
293
+ marketplace: MARKETPLACE_NAME,
294
+ plugin: PLUGIN_ID,
295
+ };
296
+ }
297
+
298
+ export function readClaudePluginStatus(options = {}) {
299
+ const claudeHome = options.claudeHome ?? defaultClaudeHome();
300
+ const memoraxCodeHome = options.memoraxCodeHome ?? defaultMemoraxCodeHome();
301
+ const managed = hasPluginRegistration(claudeHome) || existsSync(pluginStatePath(memoraxCodeHome, claudeHome));
302
+ if (!managed) {
303
+ return { ok: true, action: "claude-plugin-status", installed: false, enabled: false, managed: false, skipped: true, reason: "not_managed" };
304
+ }
305
+ const claudeCommand = stringOption(options.claudeCommand) ?? process.env.MEMORAX_CODE_CLAUDE_COMMAND ?? "claude";
306
+ const result = listClaudePlugins(claudeCommand, claudeHome, options);
307
+ if (!result.ok) return { ok: false, action: "claude-plugin-status", installed: false, enabled: false, managed: true, reason: result.reason, message: result.error };
308
+ const plugin = result.plugins.find((entry) => entry?.id === PLUGIN_ID);
309
+ const installed = Boolean(plugin);
310
+ const enabled = plugin?.enabled === true;
311
+ return {
312
+ ok: installed && enabled,
313
+ action: "claude-plugin-status",
314
+ installed,
315
+ enabled,
316
+ managed: true,
317
+ plugin: PLUGIN_ID,
318
+ ...(plugin?.version ? { pluginVersion: plugin.version } : {}),
319
+ ...(plugin?.installPath ? { installPath: plugin.installPath } : {}),
320
+ ...(!installed ? { reason: "plugin_not_installed", message: "MemoraX Code Claude plugin is not installed." } : {}),
321
+ ...(installed && !enabled ? { reason: "plugin_disabled", message: "MemoraX Code Claude plugin is installed but disabled." } : {}),
322
+ };
323
+ }
324
+
325
+ function marketplaceExists(path) {
326
+ return Boolean(path && existsSync(join(path, ".claude-plugin", "marketplace.json")));
327
+ }
328
+
329
+ function pluginStatePath(memoraxCodeHome, claudeHome) {
330
+ const resolvedHome = resolve(claudeHome);
331
+ let canonicalHome = resolvedHome;
332
+ try {
333
+ canonicalHome = realpathSync(resolvedHome);
334
+ } catch {
335
+ // A not-yet-created home has no symlink identity to preserve.
336
+ }
337
+ const homeKey = createHash("sha256").update(canonicalHome).digest("hex").slice(0, 16);
338
+ return join(memoraxCodeHome, "adapters", "claude-code", "plugins", `${homeKey}.json`);
339
+ }
340
+
341
+ function hasPluginRegistration(claudeHome) {
342
+ const settings = readJsonFile(claudeSettingsPath(claudeHome));
343
+ if (settings?.unreadable) return false;
344
+ const marketplaces = settings?.value?.extraKnownMarketplaces;
345
+ const plugins = settings?.value?.enabledPlugins;
346
+ return Boolean(
347
+ (marketplaces && Object.prototype.hasOwnProperty.call(marketplaces, MARKETPLACE_NAME))
348
+ || (plugins && Object.prototype.hasOwnProperty.call(plugins, PLUGIN_ID)),
349
+ );
350
+ }
351
+
352
+ function expectedPluginVersion() {
353
+ const manifest = readJsonFile(join(ADAPTER_ROOT, ".claude-plugin", "plugin.json"));
354
+ const version = stringOption(manifest?.value?.version);
355
+ if (!version) throw new Error("MemoraX Code Claude plugin manifest has no version.");
356
+ return version;
357
+ }
358
+
359
+ function installedPluginShellIsCurrent(plugin, expectedVersion) {
360
+ if (!plugin
361
+ || plugin.version !== expectedVersion
362
+ || !stringOption(plugin.installPath)) {
363
+ return false;
364
+ }
365
+ const installPath = plugin.installPath;
366
+ const expected = readJsonFile(join(ADAPTER_ROOT, "hooks", "runtime-shell.json"))?.value;
367
+ const installed = readJsonFile(join(installPath, "hooks", "runtime-shell.json"))?.value;
368
+ const expectedManifest = readJsonFile(join(ADAPTER_ROOT, ".claude-plugin", "plugin.json"))?.value;
369
+ const installedManifest = readJsonFile(join(installPath, ".claude-plugin", "plugin.json"))?.value;
370
+ const expectedHooks = readJsonFile(join(ADAPTER_ROOT, "hooks", "hooks.json"))?.value;
371
+ const installedHooks = readJsonFile(join(installPath, "hooks", "hooks.json"))?.value;
372
+ if (expected?.version !== 1
373
+ || expectedManifest?.version !== expectedVersion
374
+ || installedManifest?.version !== expectedManifest.version
375
+ || installed?.version !== expected.version
376
+ || installed?.runtimeAbi !== expected.runtimeAbi
377
+ || installed?.shellVersion !== expected.shellVersion
378
+ || !expectedHooks
379
+ || !isDeepStrictEqual(installedHooks, expectedHooks)) {
380
+ return false;
381
+ }
382
+ return STABLE_SHELL_REQUIRED_FILES.every((relativePath) => regularFile(join(
383
+ installPath,
384
+ ...relativePath.split("/"),
385
+ )));
386
+ }
387
+
388
+ function regularFile(path) {
389
+ try {
390
+ const metadata = lstatSync(path);
391
+ return metadata.isFile() && !metadata.isSymbolicLink();
392
+ } catch {
393
+ return false;
394
+ }
395
+ }
396
+
397
+ function listClaudePlugins(command, claudeHome, options = {}) {
398
+ const result = runClaudePluginCommand(
399
+ command,
400
+ claudeHome,
401
+ ["plugin", "list", "--json"],
402
+ { ...options, captureOutput: true },
403
+ );
404
+ if (!result.ok) {
405
+ return { ok: false, reason: result.reason ?? "plugin_status_failed", error: result.error };
406
+ }
407
+ try {
408
+ const plugins = JSON.parse(result.output || "[]");
409
+ if (!Array.isArray(plugins)) throw new Error("plugin list is not an array");
410
+ return { ok: true, plugins };
411
+ } catch {
412
+ return { ok: false, reason: "plugin_status_invalid", error: "Claude CLI returned invalid plugin status JSON." };
413
+ }
414
+ }
415
+
416
+ function listClaudeMarketplaces(command, claudeHome, options = {}) {
417
+ const result = runClaudePluginCommand(
418
+ command,
419
+ claudeHome,
420
+ ["plugin", "marketplace", "list", "--json"],
421
+ { ...options, captureOutput: true },
422
+ );
423
+ if (!result.ok) {
424
+ return { ok: false, reason: result.reason ?? "marketplace_status_failed", error: result.error };
425
+ }
426
+ try {
427
+ const marketplaces = JSON.parse(result.output || "[]");
428
+ if (!Array.isArray(marketplaces)) throw new Error("marketplace list is not an array");
429
+ return { ok: true, marketplaces };
430
+ } catch {
431
+ return {
432
+ ok: false,
433
+ reason: "marketplace_status_invalid",
434
+ error: "Claude CLI returned invalid marketplace status JSON.",
435
+ };
436
+ }
437
+ }
438
+
439
+ function marketplaceUsesPath(marketplace, marketplacePath) {
440
+ if (marketplace?.source !== "directory") return false;
441
+ const registeredPath = stringOption(marketplace.path);
442
+ if (!registeredPath) return false;
443
+ try {
444
+ return realpathSync(registeredPath) === realpathSync(marketplacePath);
445
+ } catch {
446
+ return resolve(registeredPath) === resolve(marketplacePath);
447
+ }
448
+ }
449
+
450
+ function removeClaudeMarketplace(command, claudeHome, options = {}) {
451
+ return runClaudePluginCommand(
452
+ command,
453
+ claudeHome,
454
+ ["plugin", "marketplace", "remove", MARKETPLACE_NAME],
455
+ { ...options, allowNotFound: true },
456
+ );
457
+ }
458
+
459
+ function verifyInstalledPlugin(plugin, expectedVersion) {
460
+ if (!plugin) {
461
+ return { ok: false, reason: "plugin_not_installed", message: "Claude CLI did not report the MemoraX Code plugin after installation." };
462
+ }
463
+ if (plugin.enabled !== true) {
464
+ return { ok: false, reason: "plugin_disabled", message: "Claude reported the MemoraX Code plugin as disabled after enablement." };
465
+ }
466
+ if (plugin.version !== expectedVersion) {
467
+ return {
468
+ ok: false,
469
+ reason: "plugin_version_mismatch",
470
+ message: `Claude installed MemoraX Code plugin ${plugin.version ?? "unknown"}; expected ${expectedVersion}.`,
471
+ };
472
+ }
473
+ const installPath = stringOption(plugin.installPath);
474
+ if (!installPath) {
475
+ return { ok: false, reason: "plugin_install_path_missing", message: "Claude did not report the MemoraX Code plugin install path." };
476
+ }
477
+ const artifactVerification = verifyInstalledPluginArtifacts(installPath);
478
+ if (!artifactVerification.ok) return artifactVerification;
479
+ return { ok: true, installPath };
480
+ }
481
+
482
+ function verifyInstalledPluginArtifacts(installPath) {
483
+ let artifactSources;
484
+ try {
485
+ artifactSources = collectClaudePluginArtifactSources({ adapterRoot: ADAPTER_ROOT });
486
+ } catch (error) {
487
+ return {
488
+ ok: false,
489
+ reason: "plugin_artifact_contract_invalid",
490
+ message: `MemoraX Code's Claude plugin source contract is invalid: ${error instanceof Error ? error.message : String(error)}`,
491
+ };
492
+ }
493
+ const artifactInspection = inspectClaudePluginArtifact(installPath, artifactSources);
494
+ if (!artifactInspection.ok) {
495
+ return {
496
+ ok: false,
497
+ reason: "plugin_artifacts_invalid",
498
+ message: `Claude MemoraX Code plugin has incomplete or unsafe installed artifacts: ${describeClaudePluginArtifactProblems(artifactInspection)}`,
499
+ };
500
+ }
501
+ const hooks = readJsonFile(join(installPath, "hooks", "hooks.json"));
502
+ const serializedHooks = hooks?.value ? JSON.stringify(hooks.value) : "";
503
+ if (CLAUDE_PLUGIN_HOOK_COMMAND_FILES.some((file) => !serializedHooks.includes(file))) {
504
+ return {
505
+ ok: false,
506
+ reason: "plugin_hooks_invalid",
507
+ message: "Claude MemoraX Code plugin Hook manifest does not register the memory authority Hooks.",
508
+ };
509
+ }
510
+ return { ok: true };
511
+ }
512
+
513
+ function runClaudePluginCommand(command, claudeHome, args, options = {}) {
514
+ const env = { ...process.env, CLAUDE_CONFIG_DIR: claudeHome };
515
+ let invocation;
516
+ try {
517
+ invocation = resolveWindowsCliInvocation(command, args, {
518
+ ...options.windowsCliResolution,
519
+ env,
520
+ });
521
+ } catch (error) {
522
+ return { ok: false, error: error instanceof Error ? error.message : String(error) };
523
+ }
524
+ const result = spawnSync(invocation.command, invocation.args, {
525
+ encoding: "utf8",
526
+ env,
527
+ stdio: ["ignore", "pipe", "pipe"],
528
+ timeout: 30_000,
529
+ });
530
+ const output = [result.stdout, result.stderr].filter(Boolean).join("\n").trim();
531
+ if (options.allowNotFound && result.status === 1 && /not found/i.test(output)) {
532
+ return { ok: true, status: result.status, skipped: true };
533
+ }
534
+ if (result.error) {
535
+ return {
536
+ ok: false,
537
+ ...(result.error.code === "ENOENT" ? { reason: "claude_cli_unavailable" } : {}),
538
+ error: result.error.message,
539
+ };
540
+ }
541
+ if (result.status !== 0) {
542
+ return { ok: false, status: result.status, error: output || `Claude CLI exited with status ${result.status}` };
543
+ }
544
+ return { ok: true, status: result.status, ...(options.captureOutput ? { output: result.stdout } : {}) };
545
+ }
546
+
547
+ function installFailure(reason, command, claudeHome, marketplacePath) {
548
+ return {
549
+ ok: false,
550
+ action: "claude-plugin-install",
551
+ reason: command.reason ?? reason,
552
+ message: command.error,
553
+ claudeHome,
554
+ marketplacePath,
555
+ };
556
+ }
557
+
558
+ function removeFailure(reason, command, claudeHome) {
559
+ return {
560
+ ok: false,
561
+ action: "claude-plugin-remove",
562
+ reason,
563
+ message: command.error,
564
+ claudeHome,
565
+ };
566
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "memorax-code-codex-adapter",
3
+ "version": "0.1.0",
4
+ "description": "Codex adapter, memory skill, and local hooks for MemoraX Code.",
5
+ "author": {
6
+ "name": "MemoraX AI"
7
+ },
8
+ "homepage": "https://code.memorax.net/",
9
+ "license": "MIT",
10
+ "keywords": [
11
+ "memorax-code",
12
+ "codex",
13
+ "memory"
14
+ ],
15
+ "skills": "./skills/",
16
+ "hooks": "./hooks/hooks.json",
17
+ "interface": {
18
+ "displayName": "MemoraX Code",
19
+ "shortDescription": "Connect Codex to MemoraX Code memory.",
20
+ "longDescription": "Provides Codex-facing memory skills and local hooks for MemoraX Code.",
21
+ "developerName": "MemoraX AI",
22
+ "category": "Productivity",
23
+ "capabilities": [
24
+ "Coding Memory"
25
+ ],
26
+ "websiteURL": "https://code.memorax.net/",
27
+ "composerIcon": "./assets/composer-icon.png",
28
+ "logo": "./assets/logo.png",
29
+ "defaultPrompt": [
30
+ "Use $memorax-code to route coding memory, repo memory, and personal memory in this workspace."
31
+ ]
32
+ }
33
+ }
@@ -0,0 +1,26 @@
1
+ import { dirname } from "node:path";
2
+ import { fileURLToPath } from "node:url";
3
+ import {
4
+ readClientHookShellVersion,
5
+ runClientHookLauncher,
6
+ } from "../../memorax-code-adapter-common/src/hooks/client-hook-launcher.mjs";
7
+
8
+ const COMPONENTS = new Set([
9
+ "capture-cwd",
10
+ "ensure-backend",
11
+ "memory-skill-reminder",
12
+ "memory-writeback",
13
+ ]);
14
+ const pluginRoot = dirname(dirname(fileURLToPath(import.meta.url)));
15
+
16
+ export async function runCodexHookComponent(component) {
17
+ if (!COMPONENTS.has(component)) throw new Error(`unsupported Codex Hook component: ${component}`);
18
+ await runClientHookLauncher({
19
+ client: "codex",
20
+ component,
21
+ debugEnv: "MEMORAX_CODE_CODEX_HOOK_DEBUG",
22
+ fallbackModuleUrl: new URL(`../runtime-hooks/${component}.mjs`, import.meta.url),
23
+ pluginRoot,
24
+ shellVersion: readClientHookShellVersion(pluginRoot),
25
+ });
26
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "matcher": "startup|resume|clear|compact",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "node \"$PLUGIN_ROOT/hooks/runtime-hook.mjs\" ensure-backend",
10
+ "commandWindows": "node \"${PLUGIN_ROOT}/hooks/runtime-hook.mjs\" ensure-backend",
11
+ "statusMessage": "Checking MemoraX Code backend",
12
+ "timeout": 35
13
+ },
14
+ {
15
+ "type": "command",
16
+ "command": "node \"$PLUGIN_ROOT/hooks/runtime-hook.mjs\" capture-cwd",
17
+ "commandWindows": "node \"${PLUGIN_ROOT}/hooks/runtime-hook.mjs\" capture-cwd",
18
+ "statusMessage": "Capturing MemoraX Code workspace"
19
+ }
20
+ ]
21
+ }
22
+ ],
23
+ "UserPromptSubmit": [
24
+ {
25
+ "hooks": [
26
+ {
27
+ "type": "command",
28
+ "command": "node \"$PLUGIN_ROOT/hooks/runtime-hook.mjs\" capture-cwd",
29
+ "commandWindows": "node \"${PLUGIN_ROOT}/hooks/runtime-hook.mjs\" capture-cwd",
30
+ "statusMessage": "Capturing MemoraX Code workspace"
31
+ },
32
+ {
33
+ "type": "command",
34
+ "command": "node \"$PLUGIN_ROOT/hooks/runtime-hook.mjs\" memory-skill-reminder",
35
+ "commandWindows": "node \"${PLUGIN_ROOT}/hooks/runtime-hook.mjs\" memory-skill-reminder",
36
+ "statusMessage": "Retrieving MemoraX Code memory and checking reminders",
37
+ "timeout": 20
38
+ }
39
+ ]
40
+ }
41
+ ],
42
+ "Stop": [
43
+ {
44
+ "hooks": [
45
+ {
46
+ "type": "command",
47
+ "command": "node \"$PLUGIN_ROOT/hooks/runtime-hook.mjs\" capture-cwd",
48
+ "commandWindows": "node \"${PLUGIN_ROOT}/hooks/runtime-hook.mjs\" capture-cwd",
49
+ "statusMessage": "Capturing MemoraX Code workspace"
50
+ },
51
+ {
52
+ "type": "command",
53
+ "command": "node \"$PLUGIN_ROOT/hooks/runtime-hook.mjs\" memory-writeback",
54
+ "commandWindows": "node \"${PLUGIN_ROOT}/hooks/runtime-hook.mjs\" memory-writeback",
55
+ "statusMessage": "Saving memory"
56
+ }
57
+ ]
58
+ }
59
+ ]
60
+ }
61
+ }