@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,496 @@
1
+ #!/usr/bin/env python3
2
+ """Run the mechanical repo-memory collection steps."""
3
+
4
+ import argparse
5
+ import json
6
+ import subprocess
7
+ import sys
8
+ from collections import Counter
9
+ from pathlib import Path
10
+ from typing import Any, Optional
11
+
12
+
13
+ SCRIPT_DIR = Path(__file__).resolve().parent
14
+ DEFAULTS_PATH = SCRIPT_DIR.parent / "defaults.json"
15
+ FALLBACK_DEFAULTS = {
16
+ "limits": {
17
+ "commits": 30,
18
+ "prs": 30,
19
+ "issues": 30,
20
+ },
21
+ "summaryChars": 4000,
22
+ }
23
+
24
+
25
+ class ProgressBar:
26
+ def __init__(self, enabled: bool, total: int) -> None:
27
+ self.enabled = enabled
28
+ self.total = total
29
+ self.width = 20
30
+ self._last_line_len = 0
31
+ self._is_tty = sys.stderr.isatty()
32
+
33
+ def update(self, completed: int, label: str) -> None:
34
+ if not self.enabled:
35
+ return
36
+ completed = max(0, min(completed, self.total))
37
+ filled = round((completed / self.total) * self.width) if self.total else self.width
38
+ bar = "#" * filled + "-" * (self.width - filled)
39
+ line = f"memorax-code repo-build [{bar}] {completed}/{self.total} {label}"
40
+ if self._is_tty:
41
+ padding = " " * max(0, self._last_line_len - len(line))
42
+ print(f"\r{line}{padding}", end="", file=sys.stderr, flush=True)
43
+ self._last_line_len = len(line)
44
+ else:
45
+ print(line, file=sys.stderr, flush=True)
46
+
47
+ def fail(self, completed: int, label: str) -> None:
48
+ self.update(completed, label)
49
+ self.finish()
50
+
51
+ def finish(self) -> None:
52
+ if self.enabled and self._is_tty:
53
+ print(file=sys.stderr, flush=True)
54
+
55
+
56
+ def run_step(cmd: list[str], cwd: Path) -> subprocess.CompletedProcess[str]:
57
+ return subprocess.run(cmd, cwd=cwd, text=True, capture_output=True)
58
+
59
+
60
+ def json_step(result: subprocess.CompletedProcess[str]) -> dict[str, Any]:
61
+ return {
62
+ "ok": result.returncode == 0,
63
+ "exit_code": result.returncode,
64
+ "stdout": result.stdout.strip(),
65
+ "stderr": result.stderr.strip(),
66
+ }
67
+
68
+
69
+ def load_json(path: Path) -> Any:
70
+ return json.loads(path.read_text(encoding="utf-8"))
71
+
72
+
73
+ def raw_source_counts(path: Path) -> dict[str, int]:
74
+ if not path.exists():
75
+ return {}
76
+ data = load_json(path)
77
+ if not isinstance(data, list):
78
+ return {}
79
+ counts = Counter(str(item.get("sourceType") or "unknown") for item in data if isinstance(item, dict))
80
+ return dict(sorted(counts.items()))
81
+
82
+
83
+ def emit_process_output(result: subprocess.CompletedProcess[str]) -> None:
84
+ if result.stderr:
85
+ print(result.stderr, file=sys.stderr)
86
+ if result.stdout:
87
+ print(result.stdout, file=sys.stderr)
88
+
89
+
90
+ def write_report(report: dict[str, Any], pretty: bool) -> None:
91
+ print(json.dumps(report, ensure_ascii=False, indent=2 if pretty else None))
92
+
93
+
94
+ def write_failure(
95
+ failed_step: str,
96
+ result: subprocess.CompletedProcess[str],
97
+ pretty: bool,
98
+ *,
99
+ repo: Optional[Path] = None,
100
+ memory: Optional[Path] = None,
101
+ provider: Optional[dict[str, Any]] = None,
102
+ steps: Optional[dict[str, Any]] = None,
103
+ outputs: Optional[dict[str, str]] = None,
104
+ notices: Optional[list[dict[str, Any]]] = None,
105
+ ) -> int:
106
+ emit_process_output(result)
107
+ step_reports = dict(steps or {})
108
+ step_reports[failed_step] = json_step(result)
109
+ report = {
110
+ "ok": False,
111
+ "failed_step": failed_step,
112
+ "steps": step_reports,
113
+ }
114
+ if repo is not None:
115
+ report["repo_path"] = str(repo)
116
+ if memory is not None:
117
+ report["memory_path"] = str(memory)
118
+ if provider is not None:
119
+ report["provider"] = provider
120
+ if outputs:
121
+ report["outputs"] = outputs
122
+ if notices:
123
+ report["notices"] = notices
124
+ write_report(report, pretty)
125
+ return result.returncode or 1
126
+
127
+
128
+ def provider_report(prepare_report: dict[str, Any]) -> dict[str, Any]:
129
+ return {
130
+ "name": prepare_report.get("git_provider", ""),
131
+ "repo": prepare_report.get("git_remote_repo", ""),
132
+ "host": prepare_report.get("git_remote_host", ""),
133
+ "remote_name": prepare_report.get("git_remote_name", ""),
134
+ "selection_reason": prepare_report.get("git_remote_selection_reason", ""),
135
+ "cli": prepare_report.get("provider_cli", ""),
136
+ "cli_available": bool(prepare_report.get("provider_cli_available")),
137
+ "authenticated": bool(prepare_report.get("provider_authenticated")),
138
+ "auth_status": prepare_report.get("provider_auth_status", ""),
139
+ "evidence_state": prepare_report.get("provider_evidence_state", ""),
140
+ "login_hint": prepare_report.get("provider_login_hint", ""),
141
+ "notice_level": prepare_report.get("provider_notice_level", ""),
142
+ "user_notice": prepare_report.get("provider_user_notice", ""),
143
+ "notice_markdown": prepare_report.get("provider_notice_markdown", ""),
144
+ "next_steps": prepare_report.get("provider_next_steps", []),
145
+ }
146
+
147
+
148
+ def provider_notices(prepare_report: dict[str, Any]) -> list[dict[str, Any]]:
149
+ if prepare_report.get("provider_notice_level") != "warning":
150
+ return []
151
+ message = str(prepare_report.get("provider_user_notice", "")).replace("`", "")
152
+ return [
153
+ {
154
+ "level": "warning",
155
+ "title": "Provider Evidence Unavailable",
156
+ "message": message,
157
+ "command": prepare_report.get("provider_login_hint", ""),
158
+ "next_steps": prepare_report.get("provider_next_steps", []),
159
+ "render_as": "assistant_message",
160
+ }
161
+ ]
162
+
163
+
164
+ def provider_failure_notice(provider: dict[str, Any], result: subprocess.CompletedProcess[str], *, continuing: bool) -> dict[str, Any]:
165
+ stderr = result.stderr.strip()
166
+ stdout = result.stdout.strip()
167
+ detail = (stderr or stdout or "provider facet collection failed").replace("`", "")
168
+ if len(detail) > 800:
169
+ detail = f"{detail[:800]}..."
170
+ label = str(provider.get("name") or "provider")
171
+ evidence = "GitHub PR/issue" if label == "github" else "GitLab MR/issue" if label == "gitlab" else "provider"
172
+ continuation = (
173
+ "Continuing with local-only repo memory now."
174
+ if continuing
175
+ else "Provider evidence was required, so the run stopped before authoring provider resources."
176
+ )
177
+ return {
178
+ "level": "warning",
179
+ "title": "Provider Evidence Unavailable",
180
+ "message": (
181
+ f"{evidence} evidence could not be collected even though the provider CLI appeared ready. "
182
+ f"{continuation} Provider error: {detail}"
183
+ ),
184
+ "command": "",
185
+ "next_steps": [
186
+ "Fix provider repository access or remote URL.",
187
+ f"Rerun $memorax-code repo-build to collect {evidence} evidence.",
188
+ ],
189
+ "render_as": "assistant_message",
190
+ }
191
+
192
+
193
+ def provider_script(provider: str) -> str:
194
+ if provider == "github":
195
+ return "github_resource_facets.py"
196
+ if provider == "gitlab":
197
+ return "gitlab_resource_facets.py"
198
+ return ""
199
+
200
+
201
+ def provider_raw_name(provider: str) -> str:
202
+ if provider == "github":
203
+ return "github-facets.json"
204
+ if provider == "gitlab":
205
+ return "gitlab-facets.json"
206
+ return "provider-facets.json"
207
+
208
+
209
+ def load_default_settings() -> tuple[dict[str, Any], str]:
210
+ if not DEFAULTS_PATH.exists():
211
+ return FALLBACK_DEFAULTS, "hardcoded_fallback"
212
+ try:
213
+ data = json.loads(DEFAULTS_PATH.read_text(encoding="utf-8"))
214
+ except json.JSONDecodeError as exc:
215
+ raise ValueError(f"{DEFAULTS_PATH}: invalid JSON at line {exc.lineno}, column {exc.colno}: {exc.msg}") from exc
216
+ if not isinstance(data, dict):
217
+ raise ValueError(f"{DEFAULTS_PATH}: expected a JSON object")
218
+ return data, str(DEFAULTS_PATH)
219
+
220
+
221
+ def default_int(settings: dict[str, Any], path: list[str], fallback: int) -> int:
222
+ value: Any = settings
223
+ for key in path:
224
+ value = value.get(key) if isinstance(value, dict) else None
225
+ if value is None:
226
+ return fallback
227
+ if isinstance(value, bool) or not isinstance(value, int):
228
+ raise ValueError(f"{DEFAULTS_PATH}: {'.'.join(path)} must be an integer")
229
+ return value
230
+
231
+
232
+ def validate_range(parser: argparse.ArgumentParser, name: str, value: int, minimum: int, maximum: int) -> None:
233
+ if value < minimum or value > maximum:
234
+ parser.error(f"{name} must be from {minimum} to {maximum}")
235
+
236
+
237
+ def apply_effective_settings(args: argparse.Namespace, parser: argparse.ArgumentParser) -> argparse.Namespace:
238
+ try:
239
+ defaults, source = load_default_settings()
240
+ default_commit_limit = default_int(defaults, ["limits", "commits"], FALLBACK_DEFAULTS["limits"]["commits"])
241
+ default_pr_limit = default_int(defaults, ["limits", "prs"], FALLBACK_DEFAULTS["limits"]["prs"])
242
+ default_issue_limit = default_int(defaults, ["limits", "issues"], FALLBACK_DEFAULTS["limits"]["issues"])
243
+ default_summary_chars = default_int(defaults, ["summaryChars"], FALLBACK_DEFAULTS["summaryChars"])
244
+ except ValueError as exc:
245
+ parser.error(str(exc))
246
+
247
+ commit_limit = args.commit_limit if args.commit_limit is not None else default_commit_limit
248
+ pr_limit = args.pr_limit if args.pr_limit is not None else default_pr_limit
249
+ issue_limit = args.issue_limit if args.issue_limit is not None else default_issue_limit
250
+ summary_chars = args.summary_chars if args.summary_chars is not None else default_summary_chars
251
+
252
+ validate_range(parser, "--commit-limit", commit_limit, 1, 500)
253
+ validate_range(parser, "--pr-limit", pr_limit, 1, 100)
254
+ validate_range(parser, "--issue-limit", issue_limit, 1, 100)
255
+ if summary_chars < 100:
256
+ parser.error("--summary-chars must be at least 100")
257
+
258
+ overrides: dict[str, int] = {}
259
+ if args.commit_limit is not None:
260
+ overrides["commit_limit"] = args.commit_limit
261
+ if args.pr_limit is not None:
262
+ overrides["pr_limit"] = args.pr_limit
263
+ if args.issue_limit is not None:
264
+ overrides["issue_limit"] = args.issue_limit
265
+ if args.summary_chars is not None:
266
+ overrides["summary_chars"] = args.summary_chars
267
+
268
+ args.commit_limit = commit_limit
269
+ args.pr_limit = pr_limit
270
+ args.issue_limit = issue_limit
271
+ args.summary_chars = summary_chars
272
+ args.effective_settings = {
273
+ "limits": {
274
+ "commits": commit_limit,
275
+ "prs": pr_limit,
276
+ "issues": issue_limit,
277
+ },
278
+ "summary_chars": summary_chars,
279
+ "source": source,
280
+ "overrides": overrides,
281
+ }
282
+ return args
283
+
284
+
285
+ def parse_args(argv: list[str]) -> argparse.Namespace:
286
+ parser = argparse.ArgumentParser(description="Prepare repo memory and collect raw facets for agent-authored resources.")
287
+ parser.add_argument("--repo-path", default=".", help="Local git repository path")
288
+ parser.add_argument("--reuse", action="store_true", help="Reuse/update an existing .repo_memory directory")
289
+ parser.add_argument("--snapshot-ref", default="HEAD", help="Local git ref whose history should be collected")
290
+ parser.add_argument("--commit-limit", type=int, default=None, help="Maximum local commits retained from the snapshot history")
291
+ parser.add_argument("--pr-limit", type=int, default=None, help="Maximum snapshot-filtered PRs/MRs retained")
292
+ parser.add_argument("--issue-limit", type=int, default=None, help="Maximum provider issues retained")
293
+ parser.add_argument("--summary-chars", type=int, default=None)
294
+ parser.add_argument("--skip-provider", action="store_true", help="Skip GitHub/GitLab PR/MR/issue collection and build local-only memory")
295
+ parser.add_argument("--require-provider", action="store_true", help="Fail if provider PR/MR/issue evidence cannot be collected")
296
+ parser.add_argument("--pretty", action="store_true", help="Pretty-print JSON")
297
+ parser.add_argument(
298
+ "--progress",
299
+ action="store_true",
300
+ help="Render a stderr progress bar while keeping stdout as the final JSON report",
301
+ )
302
+ args = parser.parse_args(argv)
303
+ if args.skip_provider and args.require_provider:
304
+ parser.error("--skip-provider and --require-provider cannot be used together")
305
+ args.repo_path = Path(args.repo_path).expanduser().resolve()
306
+ return apply_effective_settings(args, parser)
307
+
308
+
309
+ def main(argv: list[str]) -> int:
310
+ args = parse_args(argv)
311
+ repo = args.repo_path
312
+ progress = ProgressBar(args.progress, 3)
313
+ command_cwd = repo if repo.exists() else SCRIPT_DIR
314
+ prepare_cmd = [sys.executable, str(SCRIPT_DIR / "prepare_repo_memory.py"), str(repo)]
315
+ if args.reuse:
316
+ prepare_cmd.append("--reuse")
317
+ progress.update(0, "prepare")
318
+ prepare = run_step(prepare_cmd, command_cwd)
319
+ if prepare.returncode != 0:
320
+ progress.fail(0, "prepare failed")
321
+ return write_failure("prepare", prepare, args.pretty, repo=repo)
322
+ if prepare.stderr:
323
+ print(prepare.stderr, file=sys.stderr)
324
+ progress.update(1, "prepare")
325
+
326
+ memory = repo / ".repo_memory"
327
+ raw_dir = memory / "raw"
328
+ prepare_report_path = raw_dir / "prepare-report.json"
329
+ prepare_data = load_json(prepare_report_path)
330
+ notices = provider_notices(prepare_data)
331
+
332
+ git_commits_path = raw_dir / "git-commits.json"
333
+ git_commits = run_step(
334
+ [
335
+ sys.executable,
336
+ str(SCRIPT_DIR / "git_commit_facets.py"),
337
+ "--repo-path",
338
+ str(repo),
339
+ "--snapshot-ref",
340
+ args.snapshot_ref,
341
+ "--limit",
342
+ str(args.commit_limit),
343
+ "--summary-chars",
344
+ str(args.summary_chars),
345
+ "--out",
346
+ str(git_commits_path),
347
+ ],
348
+ repo,
349
+ )
350
+ outputs = {
351
+ "prepare_report": str(prepare_report_path),
352
+ "git_commits": str(git_commits_path),
353
+ }
354
+ if git_commits.returncode != 0:
355
+ progress.fail(1, "git commits failed")
356
+ return write_failure(
357
+ "git_commits",
358
+ git_commits,
359
+ args.pretty,
360
+ repo=repo,
361
+ memory=memory,
362
+ steps={"prepare": json_step(prepare)},
363
+ outputs=outputs,
364
+ )
365
+ progress.update(2, "git commits")
366
+
367
+ provider = provider_report(prepare_data)
368
+ provider_name = str(provider["name"])
369
+ provider_facets: dict[str, Any]
370
+ provider_output = raw_dir / provider_raw_name(provider_name)
371
+ provider_script_name = provider_script(provider_name)
372
+ if args.skip_provider:
373
+ provider_facets = {
374
+ "ok": True,
375
+ "skipped": True,
376
+ "reason": "provider_skipped_by_user",
377
+ "output": "",
378
+ }
379
+ elif provider["evidence_state"] == "ready" and provider_script_name and provider["repo"]:
380
+ provider_cmd = [
381
+ sys.executable,
382
+ str(SCRIPT_DIR / provider_script_name),
383
+ "--repo",
384
+ str(provider["repo"]),
385
+ "--repo-path",
386
+ str(repo),
387
+ "--snapshot-ref",
388
+ args.snapshot_ref,
389
+ "--include",
390
+ "prs,issues",
391
+ "--pr-limit",
392
+ str(args.pr_limit),
393
+ "--issue-limit",
394
+ str(args.issue_limit),
395
+ "--state",
396
+ "all",
397
+ "--summary-chars",
398
+ str(args.summary_chars),
399
+ "--out",
400
+ str(provider_output),
401
+ ]
402
+ if provider.get("host"):
403
+ provider_cmd.extend(["--hostname", str(provider["host"])])
404
+ provider_result = run_step(provider_cmd, repo)
405
+ provider_facets = {
406
+ **json_step(provider_result),
407
+ "skipped": False,
408
+ "output": str(provider_output),
409
+ }
410
+ if provider_result.returncode != 0:
411
+ provider_facets["degraded_to_local_only"] = not args.require_provider
412
+ provider_facets["reason"] = "provider_facets_failed"
413
+ provider_facets["output"] = ""
414
+ if provider_output.exists():
415
+ provider_output.unlink()
416
+ if args.require_provider:
417
+ progress.fail(2, "provider facets failed")
418
+ return write_failure(
419
+ "provider_facets",
420
+ provider_result,
421
+ args.pretty,
422
+ repo=repo,
423
+ memory=memory,
424
+ provider=provider,
425
+ steps={
426
+ "prepare": json_step(prepare),
427
+ "git_commits": json_step(git_commits),
428
+ },
429
+ outputs=outputs,
430
+ notices=[provider_failure_notice(provider, provider_result, continuing=False)],
431
+ )
432
+ notices.append(provider_failure_notice(provider, provider_result, continuing=True))
433
+ else:
434
+ outputs["provider_facets"] = provider_facets["output"]
435
+ else:
436
+ if args.require_provider:
437
+ provider_result = subprocess.CompletedProcess(
438
+ args=[],
439
+ returncode=1,
440
+ stdout="",
441
+ stderr=f"provider evidence is required but provider_evidence_state={provider['evidence_state']}",
442
+ )
443
+ progress.fail(2, "provider facets unavailable")
444
+ return write_failure(
445
+ "provider_facets",
446
+ provider_result,
447
+ args.pretty,
448
+ repo=repo,
449
+ memory=memory,
450
+ provider=provider,
451
+ steps={
452
+ "prepare": json_step(prepare),
453
+ "git_commits": json_step(git_commits),
454
+ },
455
+ outputs=outputs,
456
+ notices=notices,
457
+ )
458
+ provider_facets = {
459
+ "ok": True,
460
+ "skipped": True,
461
+ "reason": f"provider_evidence_state={provider['evidence_state']}",
462
+ "output": "",
463
+ }
464
+ progress.update(3, "provider facets")
465
+ progress.finish()
466
+
467
+ counts = {
468
+ "raw": {
469
+ "git_commits": raw_source_counts(git_commits_path),
470
+ },
471
+ }
472
+ if provider_facets.get("output"):
473
+ counts["raw"]["provider_facets"] = raw_source_counts(Path(str(provider_facets["output"])))
474
+
475
+ report = {
476
+ "ok": True,
477
+ "repo_path": str(repo),
478
+ "memory_path": str(memory),
479
+ "provider": provider,
480
+ "notices": notices,
481
+ "effective_settings": args.effective_settings,
482
+ "steps": {
483
+ "prepare": json_step(prepare),
484
+ "git_commits": json_step(git_commits),
485
+ "provider_facets": provider_facets,
486
+ },
487
+ "outputs": outputs,
488
+ "counts": counts,
489
+ "next_step": "Inspect raw evidence, then author PROFILE.md and resources/*.md.",
490
+ }
491
+ write_report(report, args.pretty)
492
+ return 0
493
+
494
+
495
+ if __name__ == "__main__":
496
+ raise SystemExit(main(sys.argv[1:]))