@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,523 @@
1
+ import { spawn } from "node:child_process";
2
+ import { randomUUID } from "node:crypto";
3
+ import { cp, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
4
+ import { existsSync, readdirSync } from "node:fs";
5
+ import { homedir } from "node:os";
6
+ import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
7
+ import { fileURLToPath } from "node:url";
8
+ import { activeCodexPluginRoot, isCompleteCodexPluginArtifact, } from "../../memorax-code-adapter-common/src/clients/codex-plugin-artifact.mjs";
9
+ import { atomicWriteJson } from "../../memorax-code-adapter-common/src/config-utils.mjs";
10
+ import { confirmHookTrust, listMemoraxCodeHooks, trustCodexPluginHookSelection, } from "./codex-plugin-hooks.js";
11
+ import { resolveWindowsCliInvocation } from "./windows-cli-invocation.js";
12
+ const PLUGIN_NAME = "memorax-code-codex-adapter";
13
+ const CLI_MARKETPLACE_NAME = "memorax-code";
14
+ const ADAPTER_COMMON_NAME = "memorax-code-adapter-common";
15
+ export async function installCodexPlugin(options = {}) {
16
+ const home = resolveHome(options.homeDir);
17
+ const codexHome = resolveCodexHome(options.codexHome, home);
18
+ const marketplacePath = resolve(options.marketplacePath ?? join(home, ".agents", "plugins", "marketplace.json"));
19
+ const pluginSourcePath = resolve(options.pluginSourcePath ?? defaultPluginSourcePath(codexHome));
20
+ const sourceRoot = adapterSourceRoot();
21
+ const canonicalMarketplacePath = join(codexCliMarketplaceRoot(codexHome), ".agents", "plugins", "marketplace.json");
22
+ if (!options.marketplacePath
23
+ && !options.pluginSourcePath
24
+ && existsSync(canonicalMarketplacePath)
25
+ && activeCodexPluginRoot(codexHome)) {
26
+ return await updateVersionedCodexPlugin(codexHome, sourceRoot, options.codexCommand ?? process.env.CODEX_CLI_PATH);
27
+ }
28
+ const sourcePath = marketplaceSourcePath(marketplacePath, pluginSourcePath);
29
+ await stagePluginSource(sourceRoot, pluginSourcePath);
30
+ await writePluginMetadata(pluginSourcePath, options.codexCommand ?? process.env.CODEX_CLI_PATH);
31
+ const changed = await upsertPersonalMarketplace(marketplacePath, pluginEntry(sourcePath));
32
+ const marketplace = await readMarketplace(marketplacePath);
33
+ const report = {
34
+ ok: true,
35
+ action: "codex-plugin-install",
36
+ registrationMode: "bootstrap",
37
+ codexHome,
38
+ marketplacePath,
39
+ marketplaceName: marketplaceName(marketplace),
40
+ pluginSourcePath,
41
+ marketplaceSourcePath: sourcePath,
42
+ startsBackend: false,
43
+ changed,
44
+ };
45
+ if (existsSync(codexCliMarketplaceRoot(codexHome)))
46
+ await stageCodexCliMarketplace(report);
47
+ return report;
48
+ }
49
+ async function updateVersionedCodexPlugin(codexHome, sourceRoot, codexCommand) {
50
+ const manifest = await readJsonRecord(join(sourceRoot, ".codex-plugin", "plugin.json"));
51
+ const version = stringField(manifest, "version");
52
+ if (!version)
53
+ throw new Error("bundled Codex plugin manifest is missing version");
54
+ const marketplaceRoot = codexCliMarketplaceRoot(codexHome);
55
+ const marketplacePath = join(marketplaceRoot, ".agents", "plugins", "marketplace.json");
56
+ const pluginSourcePath = join(marketplaceRoot, "versions", version, "plugins", PLUGIN_NAME);
57
+ await publishImmutableDirectory(pluginSourcePath, dirname(pluginSourcePath), version, async (temporaryRoot) => {
58
+ await stagePluginSource(sourceRoot, temporaryRoot);
59
+ await writePluginMetadata(temporaryRoot, codexCommand);
60
+ });
61
+ const cacheRoot = join(codexHome, "plugins", "cache", CLI_MARKETPLACE_NAME, PLUGIN_NAME);
62
+ const cachePath = join(cacheRoot, version);
63
+ await publishImmutableDirectory(cachePath, dirname(cacheRoot), version, async (temporaryRoot) => {
64
+ await cp(pluginSourcePath, temporaryRoot, { recursive: true });
65
+ });
66
+ const marketplace = await readMarketplace(marketplacePath);
67
+ const plugins = Array.isArray(marketplace.plugins) ? marketplace.plugins : [];
68
+ const index = plugins.findIndex((item) => isRecord(item) && item.name === PLUGIN_NAME);
69
+ const sourcePath = marketplaceSourcePath(marketplacePath, pluginSourcePath);
70
+ if (index < 0) {
71
+ plugins.push(pluginEntry(sourcePath));
72
+ }
73
+ else {
74
+ const current = isRecord(plugins[index]) ? plugins[index] : {};
75
+ plugins[index] = { ...current, source: { source: "local", path: sourcePath } };
76
+ }
77
+ marketplace.plugins = plugins;
78
+ const previousMarketplace = await readFile(marketplacePath, "utf8");
79
+ const nextMarketplace = `${JSON.stringify(marketplace, null, 2)}\n`;
80
+ const changed = previousMarketplace !== nextMarketplace;
81
+ if (changed)
82
+ atomicWriteJson(marketplacePath, marketplace);
83
+ return {
84
+ ok: true,
85
+ action: "codex-plugin-install",
86
+ registrationMode: "versioned-update",
87
+ codexHome,
88
+ marketplacePath,
89
+ marketplaceName: CLI_MARKETPLACE_NAME,
90
+ pluginSourcePath,
91
+ marketplaceSourcePath: sourcePath,
92
+ startsBackend: false,
93
+ changed,
94
+ };
95
+ }
96
+ export async function cleanupCodexAfterBackendRemoval(options = {}) {
97
+ const home = resolveHome(options.homeDir);
98
+ const memoraxCodeHome = resolve(options.memoraxCodeHome ?? process.env.MEMORAX_CODE_HOME ?? join(home, ".memorax-code"));
99
+ const statePath = join(memoraxCodeHome, "adapters", "codex", "state.json");
100
+ const state = await readJsonRecord(statePath);
101
+ const codexHome = resolveCodexHome(options.codexHome ?? stringField(state, "codexHome"), home);
102
+ const codexPlugin = await removeCodexPlugin({ ...options, codexHome, homeDir: home });
103
+ return {
104
+ ok: codexPlugin.ok,
105
+ action: "backend-removal-cleanup",
106
+ memoraxCodeHome,
107
+ codexHome,
108
+ statePath,
109
+ codexPlugin,
110
+ };
111
+ }
112
+ export async function activateCodexPlugin(options = {}) {
113
+ const home = resolveHome(options.homeDir);
114
+ const bootstrapMarketplacePath = resolve(options.marketplacePath ?? join(home, ".agents", "plugins", "marketplace.json"));
115
+ const install = await installCodexPlugin(options);
116
+ const codexCommand = options.codexCommand ?? process.env.CODEX_CLI_PATH ?? "codex";
117
+ const workspace = resolve(options.workspace ?? process.cwd());
118
+ const env = {
119
+ ...process.env,
120
+ HOME: home,
121
+ CODEX_HOME: install.codexHome,
122
+ };
123
+ const cliMarketplaceRoot = codexCliMarketplaceRoot(install.codexHome);
124
+ if (!existsSync(join(cliMarketplaceRoot, ".agents", "plugins", "marketplace.json"))) {
125
+ await stageCodexCliMarketplace(install);
126
+ }
127
+ let marketplaceAdd;
128
+ let pluginAdd;
129
+ if (install.registrationMode === "bootstrap") {
130
+ marketplaceAdd = await runCommand(codexCommand, ["plugin", "marketplace", "add", cliMarketplaceRoot, "--json"], { cwd: workspace, env });
131
+ if (!marketplaceAdd.ok) {
132
+ throw new Error(`codex plugin marketplace add failed: ${marketplaceAdd.stderr || marketplaceAdd.stdout || "unknown error"}`);
133
+ }
134
+ pluginAdd = await runCommand(codexCommand, ["plugin", "add", `${PLUGIN_NAME}@${CLI_MARKETPLACE_NAME}`, "--json"], { cwd: workspace, env });
135
+ if (!pluginAdd.ok) {
136
+ throw new Error(`codex plugin add failed: ${pluginAdd.stderr || pluginAdd.stdout || "unknown error"}`);
137
+ }
138
+ }
139
+ else {
140
+ marketplaceAdd = skippedPluginCommand("versioned_installation_preserved");
141
+ pluginAdd = skippedPluginCommand("versioned_installation_preserved");
142
+ }
143
+ await removePersonalMarketplaceEntry(bootstrapMarketplacePath);
144
+ const hooks = await listMemoraxCodeHooks(codexCommand, workspace, env);
145
+ if (hooks.length === 0) {
146
+ throw new Error("no MemoraX Code plugin hooks found after installing the Codex plugin");
147
+ }
148
+ if (!options.yes)
149
+ await confirmHookTrust(hooks);
150
+ const configPath = join(install.codexHome, "config.toml");
151
+ await trustCodexPluginHookSelection({
152
+ codexHome: install.codexHome,
153
+ homeDir: options.homeDir,
154
+ codexCommand,
155
+ workspace,
156
+ hooks,
157
+ });
158
+ return {
159
+ ok: true,
160
+ action: "codex-plugin-activate",
161
+ install,
162
+ codexCommand,
163
+ workspace,
164
+ marketplaceAdd,
165
+ pluginAdd,
166
+ hooks,
167
+ trustedHooks: hooks.length,
168
+ configPath,
169
+ startsBackend: false,
170
+ };
171
+ }
172
+ export async function removeCodexPlugin(options = {}) {
173
+ const home = resolveHome(options.homeDir);
174
+ const codexHome = resolveCodexHome(options.codexHome, home);
175
+ const marketplacePath = resolve(options.marketplacePath ?? join(home, ".agents", "plugins", "marketplace.json"));
176
+ const pluginSourcePath = resolve(options.pluginSourcePath ?? defaultPluginSourcePath(codexHome));
177
+ const removedPaths = [];
178
+ const pluginRemove = await removeActivatedCodexPlugin(options, home, codexHome);
179
+ const marketplaceChanged = await removePersonalMarketplaceEntry(marketplacePath);
180
+ await removeStagedPluginSource(pluginSourcePath, removedPaths);
181
+ await removeCachedPluginRoots(codexHome, removedPaths);
182
+ return {
183
+ ok: true,
184
+ action: "codex-plugin-remove",
185
+ codexHome,
186
+ marketplacePath,
187
+ pluginSourcePath,
188
+ pluginRemove,
189
+ removedPaths,
190
+ marketplaceChanged,
191
+ startsBackend: false,
192
+ };
193
+ }
194
+ async function removeActivatedCodexPlugin(options, home, codexHome) {
195
+ const codexCommand = options.codexCommand ?? process.env.CODEX_CLI_PATH ?? "codex";
196
+ const workspace = resolve(options.workspace ?? process.cwd());
197
+ const env = { ...process.env, HOME: home, CODEX_HOME: codexHome };
198
+ const explicit = await runCommand(codexCommand, ["plugin", "remove", `${PLUGIN_NAME}@${CLI_MARKETPLACE_NAME}`], { cwd: workspace, env });
199
+ if (commandUnavailable(explicit))
200
+ return { ...explicit, ok: true, skipped: true, reason: "codex_cli_unavailable" };
201
+ const marketplace = await runCommand(codexCommand, ["plugin", "marketplace", "remove", CLI_MARKETPLACE_NAME], { cwd: workspace, env });
202
+ if (commandUnavailable(marketplace))
203
+ return { ...marketplace, ok: true, skipped: true, reason: "codex_cli_unavailable" };
204
+ const results = [explicit, marketplace];
205
+ const failed = results.find((result) => !result.ok && !/not found|not installed|unknown marketplace/i.test(result.stderr || result.stdout));
206
+ if (failed)
207
+ return failed;
208
+ return {
209
+ ok: true,
210
+ stdout: results.map((result) => result.stdout).filter(Boolean).join("\n"),
211
+ stderr: results.map((result) => result.stderr).filter(Boolean).join("\n"),
212
+ };
213
+ }
214
+ async function stageCodexCliMarketplace(install) {
215
+ const root = codexCliMarketplaceRoot(install.codexHome);
216
+ const pluginPath = join(root, "plugins", PLUGIN_NAME);
217
+ await rm(root, { recursive: true, force: true });
218
+ await mkdir(join(root, ".agents", "plugins"), { recursive: true });
219
+ await mkdir(dirname(pluginPath), { recursive: true });
220
+ await cp(install.pluginSourcePath, pluginPath, { recursive: true });
221
+ await writeFile(join(root, ".agents", "plugins", "marketplace.json"), `${JSON.stringify({
222
+ name: CLI_MARKETPLACE_NAME,
223
+ interface: { displayName: "MemoraX Code" },
224
+ plugins: [pluginEntry(`./plugins/${PLUGIN_NAME}`)],
225
+ }, null, 2)}\n`, "utf8");
226
+ return root;
227
+ }
228
+ function codexCliMarketplaceRoot(codexHome) {
229
+ return join(codexHome, ".memorax-code", "marketplaces", CLI_MARKETPLACE_NAME);
230
+ }
231
+ export function isCodexPluginStaged(options = {}) {
232
+ const home = resolveHome(options.homeDir);
233
+ const codexHome = resolveCodexHome(options.codexHome, home);
234
+ return isCompleteCodexPluginArtifact(defaultPluginSourcePath(codexHome));
235
+ }
236
+ export function isCodexPluginActive(options = {}) {
237
+ const home = resolveHome(options.homeDir);
238
+ const codexHome = resolveCodexHome(options.codexHome, home);
239
+ return activeCodexPluginRoot(codexHome) !== undefined;
240
+ }
241
+ export function resolveCodexHome(value, homeDir = homedir()) {
242
+ const configured = nonEmpty(value) ?? nonEmpty(process.env.CODEX_HOME);
243
+ return resolve(expandHome(configured ?? join(homeDir, ".codex"), homeDir));
244
+ }
245
+ function resolveHome(value) {
246
+ return resolve(expandHome(nonEmpty(value) ?? process.env.HOME ?? homedir(), homedir()));
247
+ }
248
+ async function readJsonRecord(path) {
249
+ if (!existsSync(path))
250
+ return undefined;
251
+ try {
252
+ const parsed = JSON.parse(await readFile(path, "utf8"));
253
+ return isRecord(parsed) ? parsed : undefined;
254
+ }
255
+ catch {
256
+ return undefined;
257
+ }
258
+ }
259
+ function stringField(record, key) {
260
+ const value = record?.[key];
261
+ return typeof value === "string" && value.trim() ? value : undefined;
262
+ }
263
+ function adapterSourceRoot() {
264
+ const current = dirname(fileURLToPath(import.meta.url));
265
+ const candidates = [
266
+ resolve(current, "..", "..", "memorax-code-codex-adapter"),
267
+ resolve(current, "..", "memorax-code-codex-adapter"),
268
+ ];
269
+ const found = candidates.find((candidate) => existsSync(join(candidate, ".codex-plugin", "plugin.json")));
270
+ if (!found)
271
+ throw new Error("bundled Codex plugin source is missing .codex-plugin/plugin.json");
272
+ return found;
273
+ }
274
+ function defaultPluginSourcePath(codexHome) {
275
+ return join(codexHome, ".memorax-code", "plugins", PLUGIN_NAME);
276
+ }
277
+ async function publishImmutableDirectory(targetRoot, temporaryParent, version, stage) {
278
+ if (existsSync(targetRoot)) {
279
+ await verifyVersionedPlugin(targetRoot, version);
280
+ return;
281
+ }
282
+ await mkdir(temporaryParent, { recursive: true });
283
+ const temporaryRoot = join(temporaryParent, `.${PLUGIN_NAME}-${process.pid}-${randomUUID()}.tmp`);
284
+ try {
285
+ await stage(temporaryRoot);
286
+ await verifyVersionedPlugin(temporaryRoot, version);
287
+ await mkdir(dirname(targetRoot), { recursive: true });
288
+ await rename(temporaryRoot, targetRoot);
289
+ }
290
+ finally {
291
+ await rm(temporaryRoot, { recursive: true, force: true });
292
+ }
293
+ }
294
+ async function verifyVersionedPlugin(root, version) {
295
+ const manifest = await readJsonRecord(join(root, ".codex-plugin", "plugin.json"));
296
+ const pluginInterface = isRecord(manifest?.interface) ? manifest.interface : undefined;
297
+ const shell = await readJsonRecord(join(root, "hooks", "runtime-shell.json"));
298
+ const metadata = await readJsonRecord(join(root, ".memorax-code-package.json"));
299
+ if (stringField(manifest, "name") !== PLUGIN_NAME
300
+ || stringField(manifest, "version") !== version
301
+ || stringField(pluginInterface, "composerIcon") !== "./assets/composer-icon.png"
302
+ || stringField(pluginInterface, "logo") !== "./assets/logo.png"
303
+ || shell?.version !== 1
304
+ || shell.runtimeAbi !== 1
305
+ || stringField(shell, "shellVersion") !== version
306
+ || !stringField(metadata, "memoraxCodeCommand")) {
307
+ throw new Error(`Codex plugin artifact version does not match ${version}`);
308
+ }
309
+ if (!isCompleteCodexPluginArtifact(root)) {
310
+ throw new Error("Codex plugin artifact is missing the manifest or memory skill");
311
+ }
312
+ if (!await readJsonRecord(join(root, "hooks", "hooks.json"))) {
313
+ throw new Error("Codex plugin artifact has invalid hooks/hooks.json");
314
+ }
315
+ for (const path of [
316
+ "assets/composer-icon.png",
317
+ "assets/logo.png",
318
+ "hooks/hook-launcher.mjs",
319
+ "hooks/runtime-hook.mjs",
320
+ ]) {
321
+ if (!existsSync(join(root, ...path.split("/")))) {
322
+ throw new Error(`Codex plugin artifact is missing ${path}`);
323
+ }
324
+ }
325
+ }
326
+ async function stagePluginSource(sourceRoot, targetRoot) {
327
+ await mkdir(dirname(targetRoot), { recursive: true });
328
+ await rm(targetRoot, { recursive: true, force: true });
329
+ await rm(join(dirname(targetRoot), ADAPTER_COMMON_NAME), { recursive: true, force: true });
330
+ await mkdir(targetRoot, { recursive: true });
331
+ for (const entry of [".codex-plugin", "assets", "hooks", "runtime-hooks", "skills", "src", "package.json"]) {
332
+ await cp(join(sourceRoot, entry), join(targetRoot, entry), { recursive: true });
333
+ }
334
+ await stageAdapterCommonSource(sourceRoot, targetRoot);
335
+ }
336
+ async function stageAdapterCommonSource(sourceRoot, targetRoot) {
337
+ const commonSourceRoot = resolve(sourceRoot, "..", ADAPTER_COMMON_NAME);
338
+ if (!existsSync(join(commonSourceRoot, "src"))) {
339
+ throw new Error(`bundled adapter common source is missing: ${commonSourceRoot}`);
340
+ }
341
+ const commonTargetRoot = join(targetRoot, ADAPTER_COMMON_NAME);
342
+ await rm(commonTargetRoot, { recursive: true, force: true });
343
+ await cp(commonSourceRoot, commonTargetRoot, { recursive: true });
344
+ await rewriteAdapterCommonImports(targetRoot);
345
+ }
346
+ async function rewriteAdapterCommonImports(targetRoot) {
347
+ for (const dir of ["hooks", "runtime-hooks", "src"]) {
348
+ for (const path of mjsFiles(join(targetRoot, dir))) {
349
+ const text = await readFile(path, "utf8");
350
+ const next = text.replaceAll("../../memorax-code-adapter-common/src/", "../memorax-code-adapter-common/src/");
351
+ if (next !== text)
352
+ await writeFile(path, next, "utf8");
353
+ }
354
+ }
355
+ }
356
+ function mjsFiles(root) {
357
+ if (!existsSync(root))
358
+ return [];
359
+ const files = [];
360
+ for (const entry of readdirSync(root, { withFileTypes: true })) {
361
+ const path = join(root, entry.name);
362
+ if (entry.isDirectory())
363
+ files.push(...mjsFiles(path));
364
+ else if (entry.isFile() && entry.name.endsWith(".mjs"))
365
+ files.push(path);
366
+ }
367
+ return files;
368
+ }
369
+ async function writePluginMetadata(pluginSourcePath, codexCommand) {
370
+ const normalizedCodexCommand = nonEmpty(codexCommand);
371
+ const metadata = {
372
+ version: 1,
373
+ memoraxCodeCommand: process.argv[1],
374
+ ...(normalizedCodexCommand ? { codexCommand: normalizedCodexCommand } : {}),
375
+ writtenAt: new Date().toISOString(),
376
+ };
377
+ await writeFile(join(pluginSourcePath, ".memorax-code-package.json"), `${JSON.stringify(metadata, null, 2)}\n`, "utf8");
378
+ }
379
+ async function upsertPersonalMarketplace(marketplacePath, entry) {
380
+ const before = existsSync(marketplacePath) ? await readFile(marketplacePath, "utf8") : undefined;
381
+ const marketplace = await readMarketplace(marketplacePath);
382
+ marketplace.interface ??= { displayName: "Personal" };
383
+ const plugins = Array.isArray(marketplace.plugins) ? marketplace.plugins : [];
384
+ const nextPlugins = [...plugins];
385
+ const index = nextPlugins.findIndex((item) => isRecord(item) && item.name === entry.name);
386
+ if (index >= 0) {
387
+ const existing = isRecord(nextPlugins[index]) ? nextPlugins[index] : {};
388
+ nextPlugins[index] = { ...existing, ...entry };
389
+ }
390
+ else {
391
+ nextPlugins.push(entry);
392
+ }
393
+ marketplace.plugins = nextPlugins;
394
+ await mkdir(dirname(marketplacePath), { recursive: true });
395
+ const next = `${JSON.stringify(marketplace, null, 2)}\n`;
396
+ await writeFile(marketplacePath, next, "utf8");
397
+ return before !== next;
398
+ }
399
+ async function removePersonalMarketplaceEntry(marketplacePath) {
400
+ if (!existsSync(marketplacePath))
401
+ return false;
402
+ const before = await readFile(marketplacePath, "utf8");
403
+ const marketplace = await readMarketplace(marketplacePath);
404
+ const plugins = Array.isArray(marketplace.plugins) ? marketplace.plugins : [];
405
+ marketplace.plugins = plugins.filter((item) => !(isRecord(item) && item.name === PLUGIN_NAME));
406
+ const next = `${JSON.stringify(marketplace, null, 2)}\n`;
407
+ if (before === next)
408
+ return false;
409
+ await writeFile(marketplacePath, next, "utf8");
410
+ return true;
411
+ }
412
+ async function removeStagedPluginSource(pluginSourcePath, removedPaths) {
413
+ for (const entry of [".codex-plugin", "assets", "hooks", "runtime-hooks", "skills", "src", "package.json", ".memorax-code-package.json", ADAPTER_COMMON_NAME]) {
414
+ const target = join(pluginSourcePath, entry);
415
+ if (!existsSync(target))
416
+ continue;
417
+ await rm(target, { recursive: true, force: true });
418
+ removedPaths.push(target);
419
+ }
420
+ const commonTargetRoot = join(dirname(pluginSourcePath), ADAPTER_COMMON_NAME);
421
+ if (existsSync(commonTargetRoot)) {
422
+ await rm(commonTargetRoot, { recursive: true, force: true });
423
+ removedPaths.push(commonTargetRoot);
424
+ }
425
+ }
426
+ async function removeCachedPluginRoots(codexHome, removedPaths) {
427
+ for (const cacheRoot of [
428
+ join(codexHome, "plugins", "cache", CLI_MARKETPLACE_NAME, PLUGIN_NAME),
429
+ codexCliMarketplaceRoot(codexHome),
430
+ ]) {
431
+ if (!existsSync(cacheRoot))
432
+ continue;
433
+ await rm(cacheRoot, { recursive: true, force: true });
434
+ removedPaths.push(cacheRoot);
435
+ }
436
+ }
437
+ async function readMarketplace(marketplacePath) {
438
+ if (!existsSync(marketplacePath))
439
+ return { name: "personal", interface: { displayName: "Personal" }, plugins: [] };
440
+ const parsed = JSON.parse(await readFile(marketplacePath, "utf8"));
441
+ if (!isRecord(parsed))
442
+ throw new Error(`${marketplacePath} must contain a JSON object`);
443
+ if (!nonEmpty(typeof parsed.name === "string" ? parsed.name : undefined))
444
+ parsed.name = "personal";
445
+ return parsed;
446
+ }
447
+ function skippedPluginCommand(reason) {
448
+ return { ok: true, stdout: "", stderr: "", skipped: true, reason };
449
+ }
450
+ function pluginEntry(sourcePath) {
451
+ return {
452
+ name: PLUGIN_NAME,
453
+ source: { source: "local", path: sourcePath },
454
+ policy: { installation: "AVAILABLE", authentication: "ON_INSTALL" },
455
+ category: "Productivity",
456
+ };
457
+ }
458
+ function marketplaceSourcePath(marketplacePath, pluginSourcePath) {
459
+ const root = marketplaceRoot(marketplacePath);
460
+ const rel = relative(root, pluginSourcePath).split(sep).join("/");
461
+ if (rel && !rel.startsWith("..") && !isAbsolute(rel))
462
+ return rel.startsWith("./") ? rel : `./${rel}`;
463
+ return pluginSourcePath;
464
+ }
465
+ function marketplaceRoot(marketplacePath) {
466
+ const normalized = resolve(marketplacePath);
467
+ const parts = normalized.split(sep);
468
+ const last = parts.at(-1);
469
+ if (last === "marketplace.json" && parts.at(-2) === "plugins" && parts.at(-3) === ".agents") {
470
+ return parts.slice(0, -3).join(sep) || sep;
471
+ }
472
+ return dirname(normalized);
473
+ }
474
+ function marketplaceName(marketplace) {
475
+ return nonEmpty(typeof marketplace.name === "string" ? marketplace.name : undefined) ?? "personal";
476
+ }
477
+ function runCommand(command, args, options) {
478
+ return new Promise((resolveResult) => {
479
+ let invocation;
480
+ try {
481
+ invocation = resolveWindowsCliInvocation(command, args, { env: options.env });
482
+ }
483
+ catch (error) {
484
+ resolveResult({
485
+ ok: false,
486
+ stdout: "",
487
+ stderr: error instanceof Error ? error.message : String(error),
488
+ });
489
+ return;
490
+ }
491
+ const child = spawn(invocation.command, invocation.args, {
492
+ cwd: options.cwd,
493
+ env: options.env,
494
+ stdio: ["ignore", "pipe", "pipe"],
495
+ });
496
+ let stdout = "";
497
+ let stderr = "";
498
+ child.stdout.on("data", (chunk) => { stdout += String(chunk); });
499
+ child.stderr.on("data", (chunk) => { stderr += String(chunk); });
500
+ child.on("error", (error) => {
501
+ resolveResult({ ok: false, stdout, stderr: stderr || error.message });
502
+ });
503
+ child.on("close", (code) => {
504
+ resolveResult({ ok: code === 0, stdout, stderr });
505
+ });
506
+ });
507
+ }
508
+ function commandUnavailable(result) {
509
+ return /ENOENT|command not found/i.test(result.stderr || result.stdout);
510
+ }
511
+ function expandHome(value, homeDir) {
512
+ if (value === "~")
513
+ return homeDir;
514
+ if (value.startsWith(`~${sep}`) || value.startsWith("~/"))
515
+ return join(homeDir, value.slice(2));
516
+ return value;
517
+ }
518
+ function nonEmpty(value) {
519
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
520
+ }
521
+ function isRecord(value) {
522
+ return typeof value === "object" && value !== null && !Array.isArray(value);
523
+ }