@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,165 @@
1
+ export const DEFAULT_REPO_MEMORY_UPDATE_POLICY = "adaptive";
2
+ export const DEFAULT_REPO_MEMORY_COMMIT_THRESHOLD = 5;
3
+ export const DEFAULT_REPO_MEMORY_COOLDOWN_HOURS = 24;
4
+
5
+ export const REPO_MEMORY_UPDATE_POLICIES = Object.freeze([
6
+ "every-commit",
7
+ "commit-count",
8
+ "daily",
9
+ "pull-request",
10
+ "pull-request-or-daily",
11
+ "adaptive",
12
+ ]);
13
+
14
+ export function resolveRepoMemoryUpdatePolicy(input = {}) {
15
+ const rawPolicy = stringOption(input.policy)?.toLowerCase();
16
+ const policy = REPO_MEMORY_UPDATE_POLICIES.includes(rawPolicy)
17
+ ? rawPolicy
18
+ : DEFAULT_REPO_MEMORY_UPDATE_POLICY;
19
+ return {
20
+ policy,
21
+ policySource: !rawPolicy ? "default" : policy === rawPolicy ? "configured" : "invalid_fallback",
22
+ commitThreshold: positiveInteger(input.commitThreshold, DEFAULT_REPO_MEMORY_COMMIT_THRESHOLD),
23
+ cooldownHours: positiveNumber(input.cooldownHours, DEFAULT_REPO_MEMORY_COOLDOWN_HOURS),
24
+ };
25
+ }
26
+
27
+ export function evaluateRepoMemoryUpdatePolicy(input = {}) {
28
+ const settings = resolveRepoMemoryUpdatePolicy(input);
29
+ const commitsBehind = nonNegativeInteger(input.commitsBehind);
30
+ const pullRequestDetected = input.pullRequestDetected === true;
31
+ const age = ageHours(input);
32
+ const baselineStatus = stringOption(input.baselineStatus) || "ancestor";
33
+
34
+ if (baselineStatus === "missing") {
35
+ return decision(settings, {
36
+ trigger: true,
37
+ reason: "missing_baseline",
38
+ ageHours: age,
39
+ commitsBehind,
40
+ pullRequestDetected,
41
+ baselineStatus,
42
+ });
43
+ }
44
+ if (baselineStatus === "not_ancestor") {
45
+ return decision(settings, {
46
+ trigger: true,
47
+ reason: "baseline_not_ancestor",
48
+ ageHours: age,
49
+ commitsBehind,
50
+ pullRequestDetected,
51
+ baselineStatus,
52
+ });
53
+ }
54
+ if (commitsBehind === 0) {
55
+ return decision(settings, {
56
+ trigger: false,
57
+ reason: undefined,
58
+ ageHours: age,
59
+ commitsBehind,
60
+ pullRequestDetected,
61
+ baselineStatus,
62
+ });
63
+ }
64
+
65
+ const cooldownElapsed = age === undefined || age >= settings.cooldownHours;
66
+ const commitThresholdReached = commitsBehind >= settings.commitThreshold;
67
+ let reason;
68
+ if (settings.policy === "every-commit") {
69
+ reason = "pending_commit";
70
+ } else if (settings.policy === "commit-count") {
71
+ reason = commitThresholdReached ? "commit_threshold_reached" : undefined;
72
+ } else if (settings.policy === "daily") {
73
+ reason = cooldownElapsed ? "cooldown_elapsed" : undefined;
74
+ } else if (settings.policy === "pull-request") {
75
+ reason = pullRequestDetected ? "pull_request_detected" : undefined;
76
+ } else if (settings.policy === "pull-request-or-daily") {
77
+ reason = pullRequestDetected
78
+ ? "pull_request_detected"
79
+ : cooldownElapsed
80
+ ? "cooldown_elapsed"
81
+ : undefined;
82
+ } else {
83
+ reason = commitThresholdReached
84
+ ? "commit_threshold_reached"
85
+ : cooldownElapsed
86
+ ? "cooldown_elapsed"
87
+ : undefined;
88
+ }
89
+
90
+ return decision(settings, {
91
+ trigger: reason !== undefined,
92
+ reason,
93
+ ageHours: age,
94
+ commitsBehind,
95
+ pullRequestDetected,
96
+ baselineStatus,
97
+ });
98
+ }
99
+
100
+ export function parseRepoMemoryUpdatePolicyConfig(text) {
101
+ const config = {};
102
+ let section = "";
103
+ for (const rawLine of String(text || "").split(/\r?\n/)) {
104
+ const line = rawLine.split("#", 1)[0].trim();
105
+ if (!line) continue;
106
+ const sectionMatch = line.match(/^\[([^\]]+)\]$/);
107
+ if (sectionMatch) {
108
+ section = sectionMatch[1].trim();
109
+ continue;
110
+ }
111
+ if (section !== "memory.repo_update") continue;
112
+ const field = line.match(/^([a-z_]+)\s*=\s*(.+)$/);
113
+ if (!field) continue;
114
+ const key = field[1];
115
+ const rawValue = field[2].trim().replace(/^['"]|['"]$/g, "");
116
+ if (key === "policy") config.policy = rawValue;
117
+ else if (key === "commit_threshold") config.commitThreshold = positiveInteger(rawValue, undefined);
118
+ else if (key === "cooldown_hours") config.cooldownHours = positiveNumber(rawValue, undefined);
119
+ }
120
+ return config;
121
+ }
122
+
123
+ function decision(settings, fields) {
124
+ return {
125
+ ...settings,
126
+ trigger: fields.trigger,
127
+ reason: fields.reason,
128
+ ageHours: fields.ageHours,
129
+ commitsBehind: fields.commitsBehind,
130
+ pullRequestDetected: fields.pullRequestDetected,
131
+ baselineStatus: fields.baselineStatus,
132
+ };
133
+ }
134
+
135
+ function ageHours(input) {
136
+ const nowMs = finiteNumber(input.nowMs, Date.now());
137
+ const lastUpdatedAtMs = finiteNumber(input.lastUpdatedAtMs, undefined);
138
+ if (lastUpdatedAtMs === undefined) return undefined;
139
+ return Math.max(0, nowMs - lastUpdatedAtMs) / (60 * 60 * 1000);
140
+ }
141
+
142
+ function positiveInteger(value, fallback) {
143
+ const parsed = Number(value);
144
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;
145
+ }
146
+
147
+ function positiveNumber(value, fallback) {
148
+ const parsed = Number(value);
149
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
150
+ }
151
+
152
+ function nonNegativeInteger(value) {
153
+ const parsed = Number(value);
154
+ if (parsed === Number.POSITIVE_INFINITY) return parsed;
155
+ return Number.isInteger(parsed) && parsed >= 0 ? parsed : 0;
156
+ }
157
+
158
+ function finiteNumber(value, fallback) {
159
+ const parsed = Number(value);
160
+ return Number.isFinite(parsed) ? parsed : fallback;
161
+ }
162
+
163
+ function stringOption(value) {
164
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
165
+ }
@@ -0,0 +1,181 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { existsSync, lstatSync, readFileSync, readdirSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { readJsonFile, stringOption } from "../config-utils.mjs";
6
+
7
+ const MAX_CONTEXT_CHARS = 4000;
8
+ const MAX_FILE_BYTES = 16 * 1024;
9
+ const MAX_FILES = 20;
10
+ const GIT_COMMAND_TIMEOUT_MS = 2000;
11
+ const PROCEDURE_DIRECTORY_GIT_PATH = ".repo_memory/procedure-memory";
12
+ const PROCEDURE_DIRECTORY_RELATIVE_PATH = join(".repo_memory", "procedure-memory");
13
+
14
+ export function buildRepoProcedureMemoryContext(input, options) {
15
+ const cwd = resolveCwd(input, options);
16
+ if (!cwd) return undefined;
17
+ const repoRoot = gitRepoRoot(cwd);
18
+ if (!repoRoot) return undefined;
19
+ const result = readTrustedProcedureFiles(repoRoot, options);
20
+ if (result.files.length === 0) return undefined;
21
+ return renderContext(result.files, result.omitted);
22
+ }
23
+
24
+ function readTrustedProcedureFiles(repoRoot, options) {
25
+ const directory = join(repoRoot, PROCEDURE_DIRECTORY_RELATIVE_PATH);
26
+ if (!existsSync(directory)) return { files: [], omitted: false };
27
+ try {
28
+ const directoryStat = lstatSync(directory);
29
+ if (directoryStat.isSymbolicLink() || !directoryStat.isDirectory()) {
30
+ debug(options, `Skipping untrusted repo procedure directory: ${PROCEDURE_DIRECTORY_GIT_PATH}`);
31
+ return { files: [], omitted: false };
32
+ }
33
+
34
+ const entries = readdirSync(directory, { withFileTypes: true })
35
+ .filter((entry) => entry.isFile() && !entry.name.startsWith(".") && entry.name.toLowerCase().endsWith(".md"))
36
+ .sort((left, right) => left.name.localeCompare(right.name));
37
+ const files = [];
38
+ let omitted = entries.length > MAX_FILES;
39
+ for (const entry of entries.slice(0, MAX_FILES)) {
40
+ const gitPath = `${PROCEDURE_DIRECTORY_GIT_PATH}/${entry.name}`;
41
+ const path = join(directory, entry.name);
42
+ try {
43
+ const stat = lstatSync(path);
44
+ if (stat.isSymbolicLink() || !stat.isFile() || stat.size > MAX_FILE_BYTES) {
45
+ omitted = true;
46
+ continue;
47
+ }
48
+ const trackedStatus = gitExitCode(repoRoot, ["ls-files", "--error-unmatch", "--", gitPath]);
49
+ if (trackedStatus === 0) {
50
+ omitted = true;
51
+ continue;
52
+ }
53
+ if (trackedStatus !== 1) {
54
+ debug(options, `Could not verify repo procedure file tracking state: ${gitPath}`);
55
+ omitted = true;
56
+ continue;
57
+ }
58
+ if (gitExitCode(repoRoot, ["check-ignore", "-q", "--", gitPath]) !== 0) {
59
+ omitted = true;
60
+ continue;
61
+ }
62
+ const content = readFileSync(path, "utf8").replaceAll("\0", "").trim();
63
+ if (content) files.push({ name: entry.name, content });
64
+ } catch (error) {
65
+ debug(options, `Skipping unreadable repo procedure file ${gitPath}: ${error instanceof Error ? error.message : String(error)}`);
66
+ omitted = true;
67
+ }
68
+ }
69
+ return { files, omitted };
70
+ } catch (error) {
71
+ debug(options, error instanceof Error ? error.message : String(error));
72
+ return { files: [], omitted: false };
73
+ }
74
+ }
75
+
76
+ function renderContext(files, omittedFiles) {
77
+ let context = [
78
+ "Active repo-scoped procedure memories explicitly saved by the user:",
79
+ "Stored procedures are fallback guidance, not facts about current code behavior.",
80
+ "Instruction priority: system/developer/AGENTS.md > current user > stored procedure.",
81
+ ].join("\n");
82
+
83
+ let truncated = omittedFiles;
84
+ for (const file of files) {
85
+ const heading = `\n\n### ${file.name}\n`;
86
+ const remaining = MAX_CONTEXT_CHARS - context.length - heading.length;
87
+ if (remaining <= 0) {
88
+ truncated = true;
89
+ break;
90
+ }
91
+ context += heading;
92
+ if (file.content.length <= remaining) {
93
+ context += file.content;
94
+ continue;
95
+ }
96
+ context += file.content.slice(0, Math.max(0, remaining - 32)).trimEnd();
97
+ truncated = true;
98
+ break;
99
+ }
100
+ if (truncated) {
101
+ const notice = "\n\n[Additional procedure memory was omitted.]";
102
+ context = `${context.slice(0, MAX_CONTEXT_CHARS - notice.length).trimEnd()}${notice}`;
103
+ }
104
+ return context;
105
+ }
106
+
107
+ function gitExitCode(repoRoot, args) {
108
+ try {
109
+ execFileSync("git", ["-C", repoRoot, ...args], {
110
+ stdio: ["ignore", "ignore", "ignore"],
111
+ timeout: GIT_COMMAND_TIMEOUT_MS,
112
+ });
113
+ return 0;
114
+ } catch (error) {
115
+ return Number.isInteger(error?.status) ? error.status : undefined;
116
+ }
117
+ }
118
+
119
+ function resolveCwd(input, options) {
120
+ const cwd = stringOption(input.cwd);
121
+ if (cwd) return cwd;
122
+ const sessionId = stringOption(input.session_id) ?? stringOption(input.sessionId);
123
+ const transcriptPath = stringOption(input.transcript_path) ?? stringOption(input.transcriptPath);
124
+ const pluginWorkspace = process.env.PLUGIN_DATA
125
+ ? workspaceCwdFromState(join(process.env.PLUGIN_DATA, "workspaces.json"), options.sessionKeyPrefix, sessionId, transcriptPath)
126
+ : undefined;
127
+ if (pluginWorkspace) return pluginWorkspace;
128
+ const memoraxCodeHome = process.env.MEMORAX_CODE_HOME || join(homedir(), ".memorax-code");
129
+ return workspaceCwdFromState(
130
+ join(memoraxCodeHome, "adapters", options.adapterDir, "workspaces.json"),
131
+ options.sessionKeyPrefix,
132
+ sessionId,
133
+ transcriptPath,
134
+ );
135
+ }
136
+
137
+ function workspaceCwdFromState(path, sessionKeyPrefix, sessionId, transcriptPath) {
138
+ const state = readJsonFile(path);
139
+ if (state?.unreadable) return undefined;
140
+ const sessions = state?.value?.sessions && typeof state.value.sessions === "object" && !Array.isArray(state.value.sessions)
141
+ ? state.value.sessions
142
+ : {};
143
+ for (const key of registryKeys(sessionKeyPrefix, sessionId, transcriptPath)) {
144
+ const record = sessions[key];
145
+ const cwd = stringOption(record?.cwd) ?? stringOption(record?.workspace);
146
+ if (cwd) return cwd;
147
+ }
148
+ return undefined;
149
+ }
150
+
151
+ function registryKeys(sessionKeyPrefix, ...values) {
152
+ const keys = new Set();
153
+ for (const value of values) {
154
+ const string = stringOption(value);
155
+ if (!string) continue;
156
+ keys.add(string);
157
+ const base = string.split(/[\\/]/).pop()?.replace(/\.[^.]+$/, "") ?? string;
158
+ keys.add(base);
159
+ if (string.startsWith(`${sessionKeyPrefix}_`)) keys.add(string.slice(sessionKeyPrefix.length + 1));
160
+ else keys.add(`${sessionKeyPrefix}_${string}`);
161
+ if (base.startsWith(`${sessionKeyPrefix}_`)) keys.add(base.slice(sessionKeyPrefix.length + 1));
162
+ else keys.add(`${sessionKeyPrefix}_${base}`);
163
+ }
164
+ return keys;
165
+ }
166
+
167
+ function gitRepoRoot(cwd) {
168
+ try {
169
+ return execFileSync("git", ["-C", cwd, "rev-parse", "--show-toplevel"], {
170
+ encoding: "utf8",
171
+ stdio: ["ignore", "pipe", "ignore"],
172
+ timeout: GIT_COMMAND_TIMEOUT_MS,
173
+ }).trim() || undefined;
174
+ } catch {
175
+ return undefined;
176
+ }
177
+ }
178
+
179
+ function debug(options, message) {
180
+ if (process.env[options.debugEnv] === "1") console.error(message);
181
+ }
@@ -0,0 +1,251 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { existsSync, lstatSync, readFileSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { dirname, join } from "node:path";
5
+ import { readJsonFile, stringOption } from "../config-utils.mjs";
6
+
7
+ const MAX_CONTEXT_CHARS = 4000;
8
+ const MAX_PREFERENCES_BYTES = 64 * 1024;
9
+ const GIT_COMMAND_TIMEOUT_MS = 2000;
10
+ const PREFERENCES_GIT_PATH = ".repo_memory/user-profile/preferences.md";
11
+ const PREFERENCES_RELATIVE_PATH = join(".repo_memory", "user-profile", "preferences.md");
12
+ const PREFERENCES_SCHEMA = "repo_user_profile_memory.v0.1";
13
+ const PREFERENCES_OWNER = "repo-user-profile-memory";
14
+ const ALLOWED_TYPES = new Set(["communication", "workflow", "environment", "profile"]);
15
+ const ALLOWED_STATUSES = new Set(["active", "superseded", "deleted"]);
16
+
17
+ export function buildRepoUserProfilePreferencesContext(input, options) {
18
+ const cwd = resolveCwd(input, options);
19
+ if (!cwd) return undefined;
20
+ const repoRoot = gitRepoRoot(cwd);
21
+ if (!repoRoot) return undefined;
22
+ const preferences = readTrustedPreferences(repoRoot, options);
23
+ if (!preferences || preferences.length === 0) return undefined;
24
+ return renderContext(preferences);
25
+ }
26
+
27
+ function readTrustedPreferences(repoRoot, options) {
28
+ const path = join(repoRoot, PREFERENCES_RELATIVE_PATH);
29
+ if (!existsSync(path)) return undefined;
30
+ try {
31
+ for (const directory of [dirname(path), dirname(dirname(path))]) {
32
+ const directoryStat = lstatSync(directory);
33
+ if (directoryStat.isSymbolicLink() || !directoryStat.isDirectory()) {
34
+ debug(options, `Skipping untrusted repo user preferences directory: ${PREFERENCES_GIT_PATH}`);
35
+ return undefined;
36
+ }
37
+ }
38
+ const stat = lstatSync(path);
39
+ if (stat.isSymbolicLink() || !stat.isFile() || stat.size > MAX_PREFERENCES_BYTES) {
40
+ debug(options, `Skipping untrusted repo user preferences: ${PREFERENCES_GIT_PATH}`);
41
+ return undefined;
42
+ }
43
+ const trackedStatus = gitExitCode(repoRoot, ["ls-files", "--error-unmatch", "--", PREFERENCES_GIT_PATH]);
44
+ if (trackedStatus === 0) {
45
+ debug(options, `Skipping tracked repo user preferences: ${PREFERENCES_GIT_PATH}`);
46
+ return undefined;
47
+ }
48
+ if (trackedStatus !== 1 || gitExitCode(repoRoot, ["check-ignore", "-q", "--", PREFERENCES_GIT_PATH]) !== 0) {
49
+ debug(options, `Skipping unignored repo user preferences: ${PREFERENCES_GIT_PATH}`);
50
+ return undefined;
51
+ }
52
+ return parseActivePreferences(readFileSync(path, "utf8"));
53
+ } catch (error) {
54
+ debug(options, error instanceof Error ? error.message : String(error));
55
+ return undefined;
56
+ }
57
+ }
58
+
59
+ function parseActivePreferences(text) {
60
+ if (text.includes("\0")) return undefined;
61
+ const metadata = parseFrontmatter(text);
62
+ if (
63
+ !metadata
64
+ || metadata.schema !== PREFERENCES_SCHEMA
65
+ || metadata.scope !== "repo"
66
+ || metadata.owner !== PREFERENCES_OWNER
67
+ || metadata.trust_state !== "user_stated"
68
+ ) {
69
+ return undefined;
70
+ }
71
+ const declaredActive = nonNegativeInteger(metadata.active_count);
72
+ const declaredTotal = nonNegativeInteger(metadata.total_count);
73
+ if (declaredActive === undefined || declaredTotal === undefined) return undefined;
74
+
75
+ const matches = [...text.matchAll(/^## Preference (?<id>pref_[^\s]+)\s*$/gm)];
76
+ if (matches.length !== declaredTotal) return undefined;
77
+ const preferences = [];
78
+ for (let index = 0; index < matches.length; index += 1) {
79
+ const match = matches[index];
80
+ const start = match.index + match[0].length;
81
+ const end = matches[index + 1]?.index ?? text.length;
82
+ const block = text.slice(start, end);
83
+ const status = stripTicks(field(block, "Status")).toLowerCase();
84
+ const type = stripTicks(field(block, "Type"));
85
+ if (!ALLOWED_STATUSES.has(status) || !ALLOWED_TYPES.has(type)) return undefined;
86
+ if (
87
+ !stripTicks(field(block, "Confidence"))
88
+ || !stripTicks(field(block, "Created"))
89
+ || !stripTicks(field(block, "Updated"))
90
+ ) {
91
+ return undefined;
92
+ }
93
+ if (status !== "active") continue;
94
+ const description = normalizeField(field(block, "Description"));
95
+ if (!description) return undefined;
96
+ preferences.push({
97
+ description,
98
+ appliesWhen: normalizeField(field(block, "Applies when")),
99
+ doNotApplyWhen: normalizeField(field(block, "Do not apply when")),
100
+ });
101
+ }
102
+ return preferences.length === declaredActive ? preferences : undefined;
103
+ }
104
+
105
+ function parseFrontmatter(text) {
106
+ const match = text.match(/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/);
107
+ if (!match) return undefined;
108
+ const metadata = {};
109
+ for (const rawLine of match[1].split(/\r?\n/)) {
110
+ const line = rawLine.trim();
111
+ if (!line || line.startsWith("#")) continue;
112
+ const fieldMatch = line.match(/^([A-Za-z0-9_-]+):\s*(.*)$/);
113
+ if (!fieldMatch) return undefined;
114
+ metadata[fieldMatch[1]] = stripYamlScalar(fieldMatch[2]);
115
+ }
116
+ return metadata;
117
+ }
118
+
119
+ function stripYamlScalar(value) {
120
+ const trimmed = value.trim();
121
+ if (trimmed.length >= 2 && trimmed[0] === trimmed.at(-1) && ["\"", "'"].includes(trimmed[0])) {
122
+ return trimmed.slice(1, -1);
123
+ }
124
+ return trimmed;
125
+ }
126
+
127
+ function nonNegativeInteger(value) {
128
+ if (typeof value !== "string") return undefined;
129
+ const normalized = value.trim().replaceAll("_", "");
130
+ if (!/^\d+$/.test(normalized)) return undefined;
131
+ const parsed = Number(normalized);
132
+ return Number.isSafeInteger(parsed) ? parsed : undefined;
133
+ }
134
+
135
+ function field(block, label) {
136
+ const escaped = label.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
137
+ const match = block.match(new RegExp(`^- ${escaped}:\\s*(.*)$`, "m"));
138
+ return match?.[1]?.trim() ?? "";
139
+ }
140
+
141
+ function stripTicks(value) {
142
+ return String(value ?? "").trim().replace(/^`|`$/g, "").trim();
143
+ }
144
+
145
+ function normalizeField(value) {
146
+ const normalized = stripTicks(value).replace(/\s+/g, " ").trim();
147
+ return normalized === "-" ? "" : normalized;
148
+ }
149
+
150
+ function renderContext(preferences) {
151
+ let context = [
152
+ "Active repo-scoped user preferences explicitly saved by the user:",
153
+ "Stored preferences are fallback guidance, not facts about current code behavior.",
154
+ "Instruction priority: system/developer/AGENTS.md > current user > stored preference.",
155
+ "Apply each preference only when relevant and not overridden by higher-priority instructions.",
156
+ ].join("\n");
157
+ let omitted = false;
158
+ for (const preference of preferences) {
159
+ const entry = [
160
+ `- Description: ${preference.description}`,
161
+ ` Applies when: ${preference.appliesWhen || "-"}`,
162
+ ` Do not apply when: ${preference.doNotApplyWhen || "-"}`,
163
+ ].join("\n");
164
+ if (`${context}\n\n${entry}`.length > MAX_CONTEXT_CHARS) {
165
+ omitted = true;
166
+ break;
167
+ }
168
+ context += `\n\n${entry}`;
169
+ }
170
+ if (omitted) {
171
+ const notice = "\n\n[Additional user preferences were omitted.]";
172
+ context = `${context.slice(0, MAX_CONTEXT_CHARS - notice.length).trimEnd()}${notice}`;
173
+ }
174
+ return context;
175
+ }
176
+
177
+ function resolveCwd(input, options) {
178
+ const cwd = stringOption(input.cwd);
179
+ if (cwd) return cwd;
180
+ const sessionId = stringOption(input.session_id) ?? stringOption(input.sessionId);
181
+ const transcriptPath = stringOption(input.transcript_path) ?? stringOption(input.transcriptPath);
182
+ const pluginWorkspace = process.env.PLUGIN_DATA
183
+ ? workspaceCwdFromState(join(process.env.PLUGIN_DATA, "workspaces.json"), options.sessionKeyPrefix, sessionId, transcriptPath)
184
+ : undefined;
185
+ if (pluginWorkspace) return pluginWorkspace;
186
+ const memoraxCodeHome = process.env.MEMORAX_CODE_HOME || join(homedir(), ".memorax-code");
187
+ return workspaceCwdFromState(
188
+ join(memoraxCodeHome, "adapters", options.adapterDir, "workspaces.json"),
189
+ options.sessionKeyPrefix,
190
+ sessionId,
191
+ transcriptPath,
192
+ );
193
+ }
194
+
195
+ function workspaceCwdFromState(path, sessionKeyPrefix, sessionId, transcriptPath) {
196
+ const state = readJsonFile(path);
197
+ if (state?.unreadable) return undefined;
198
+ const sessions = state?.value?.sessions && typeof state.value.sessions === "object" && !Array.isArray(state.value.sessions)
199
+ ? state.value.sessions
200
+ : {};
201
+ for (const key of registryKeys(sessionKeyPrefix, sessionId, transcriptPath)) {
202
+ const record = sessions[key];
203
+ const cwd = stringOption(record?.cwd) ?? stringOption(record?.workspace);
204
+ if (cwd) return cwd;
205
+ }
206
+ return undefined;
207
+ }
208
+
209
+ function registryKeys(sessionKeyPrefix, ...values) {
210
+ const keys = new Set();
211
+ for (const value of values) {
212
+ const string = stringOption(value);
213
+ if (!string) continue;
214
+ keys.add(string);
215
+ const base = string.split(/[\\/]/).pop()?.replace(/\.[^.]+$/, "") ?? string;
216
+ keys.add(base);
217
+ if (string.startsWith(`${sessionKeyPrefix}_`)) keys.add(string.slice(sessionKeyPrefix.length + 1));
218
+ else keys.add(`${sessionKeyPrefix}_${string}`);
219
+ if (base.startsWith(`${sessionKeyPrefix}_`)) keys.add(base.slice(sessionKeyPrefix.length + 1));
220
+ else keys.add(`${sessionKeyPrefix}_${base}`);
221
+ }
222
+ return keys;
223
+ }
224
+
225
+ function gitRepoRoot(cwd) {
226
+ try {
227
+ return execFileSync("git", ["-C", cwd, "rev-parse", "--show-toplevel"], {
228
+ encoding: "utf8",
229
+ stdio: ["ignore", "pipe", "ignore"],
230
+ timeout: GIT_COMMAND_TIMEOUT_MS,
231
+ }).trim() || undefined;
232
+ } catch {
233
+ return undefined;
234
+ }
235
+ }
236
+
237
+ function gitExitCode(repoRoot, args) {
238
+ try {
239
+ execFileSync("git", ["-C", repoRoot, ...args], {
240
+ stdio: ["ignore", "ignore", "ignore"],
241
+ timeout: GIT_COMMAND_TIMEOUT_MS,
242
+ });
243
+ return 0;
244
+ } catch (error) {
245
+ return Number.isInteger(error?.status) ? error.status : undefined;
246
+ }
247
+ }
248
+
249
+ function debug(options, message) {
250
+ if (process.env[options.debugEnv] === "1") console.error(message);
251
+ }
@@ -0,0 +1,55 @@
1
+ export type JsonRuntimeRecordInvalidReason =
2
+ | "unreadable"
3
+ | "malformed_json"
4
+ | "invalid_record";
5
+
6
+ export type JsonRuntimeRecordState =
7
+ | Readonly<{ status: "absent" }>
8
+ | Readonly<{ status: "present"; value: Record<string, unknown> }>
9
+ | Readonly<{ status: "invalid"; reason: JsonRuntimeRecordInvalidReason }>;
10
+
11
+ export type RuntimeRecordFailureState =
12
+ | Readonly<{ status: "absent" }>
13
+ | Readonly<{ status: "invalid"; reason: string }>
14
+ | Readonly<{ status: "unsupported"; version: number }>;
15
+
16
+ export type RuntimeRecordWriteResult<T> = Readonly<{
17
+ path: string;
18
+ record: T;
19
+ durability: "confirmed" | "uncertain";
20
+ durabilityErrorCode?: string;
21
+ }>;
22
+
23
+ export type RuntimeRecordWriteRuntime = Readonly<{
24
+ syncDirectory?: (path: string) => void;
25
+ }>;
26
+
27
+ export type PrivateDirectoryOptions = RuntimeRecordWriteRuntime & Readonly<{
28
+ durableBoundary: string;
29
+ }>;
30
+
31
+ export class RuntimeRecordError extends Error {
32
+ constructor(options: {
33
+ name: string;
34
+ path: string;
35
+ state: RuntimeRecordFailureState;
36
+ codePrefix: string;
37
+ recovery?: string;
38
+ });
39
+ readonly code: string;
40
+ readonly recordStatus: RuntimeRecordFailureState["status"];
41
+ readonly recordPath: string;
42
+ readonly reason?: string;
43
+ readonly version?: number;
44
+ }
45
+
46
+ export function readJsonRuntimeRecord(path: string): JsonRuntimeRecordState;
47
+ export function ensurePrivateDirectory(
48
+ path: string,
49
+ options: PrivateDirectoryOptions,
50
+ ): void;
51
+ export function writePrivateJsonRecord<T>(
52
+ path: string,
53
+ value: T,
54
+ options: PrivateDirectoryOptions,
55
+ ): RuntimeRecordWriteResult<T>;