claude-smart 0.2.42 → 0.2.44

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 (402) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/README.md +1 -1
  3. package/bin/claude-smart.js +2 -2
  4. package/package.json +9 -3
  5. package/plugin/.claude-plugin/plugin.json +9 -3
  6. package/plugin/.codex-plugin/plugin.json +1 -1
  7. package/plugin/README.md +23 -3
  8. package/plugin/pyproject.toml +3 -3
  9. package/plugin/scripts/_lib.sh +91 -0
  10. package/plugin/scripts/backend-service.sh +51 -4
  11. package/plugin/scripts/cli.sh +3 -1
  12. package/plugin/scripts/codex-hook.js +72 -4
  13. package/plugin/scripts/dashboard-build.sh +1 -0
  14. package/plugin/scripts/dashboard-service.sh +1 -0
  15. package/plugin/scripts/ensure-plugin-root.sh +1 -0
  16. package/plugin/scripts/hook_entry.sh +6 -3
  17. package/plugin/scripts/smart-install.sh +3 -2
  18. package/plugin/src/README.md +57 -0
  19. package/plugin/src/claude_smart/context_format.py +11 -12
  20. package/plugin/src/claude_smart/cs_cite.py +26 -12
  21. package/plugin/src/claude_smart/ids.py +13 -5
  22. package/plugin/uv.lock +126 -5
  23. package/plugin/vendor/reflexio/.env.example +62 -0
  24. package/plugin/vendor/reflexio/LICENSE +201 -0
  25. package/plugin/vendor/reflexio/README.md +338 -0
  26. package/plugin/vendor/reflexio/pyproject.toml +274 -0
  27. package/plugin/vendor/reflexio/reflexio/README.md +184 -0
  28. package/plugin/vendor/reflexio/reflexio/__init__.py +166 -0
  29. package/plugin/vendor/reflexio/reflexio/benchmarks/__init__.py +1 -0
  30. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/README.md +109 -0
  31. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/__init__.py +1 -0
  32. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/backends.py +175 -0
  33. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/bench.py +642 -0
  34. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/embed_cache.py +330 -0
  35. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/report.py +317 -0
  36. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/results/report.md +43 -0
  37. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/results/results.json +4478 -0
  38. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/scenarios.py +134 -0
  39. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/seed.py +255 -0
  40. package/plugin/vendor/reflexio/reflexio/cli/README.md +287 -0
  41. package/plugin/vendor/reflexio/reflexio/cli/__init__.py +0 -0
  42. package/plugin/vendor/reflexio/reflexio/cli/__main__.py +56 -0
  43. package/plugin/vendor/reflexio/reflexio/cli/_client.py +86 -0
  44. package/plugin/vendor/reflexio/reflexio/cli/app.py +127 -0
  45. package/plugin/vendor/reflexio/reflexio/cli/bootstrap_config.py +265 -0
  46. package/plugin/vendor/reflexio/reflexio/cli/codex_auth.py +503 -0
  47. package/plugin/vendor/reflexio/reflexio/cli/commands/__init__.py +0 -0
  48. package/plugin/vendor/reflexio/reflexio/cli/commands/admin_cmd.py +65 -0
  49. package/plugin/vendor/reflexio/reflexio/cli/commands/agent_playbooks.py +503 -0
  50. package/plugin/vendor/reflexio/reflexio/cli/commands/api.py +114 -0
  51. package/plugin/vendor/reflexio/reflexio/cli/commands/auth.py +109 -0
  52. package/plugin/vendor/reflexio/reflexio/cli/commands/config_cmd.py +511 -0
  53. package/plugin/vendor/reflexio/reflexio/cli/commands/doctor.py +127 -0
  54. package/plugin/vendor/reflexio/reflexio/cli/commands/embeddings.py +53 -0
  55. package/plugin/vendor/reflexio/reflexio/cli/commands/interactions.py +478 -0
  56. package/plugin/vendor/reflexio/reflexio/cli/commands/profiles.py +303 -0
  57. package/plugin/vendor/reflexio/reflexio/cli/commands/services.py +289 -0
  58. package/plugin/vendor/reflexio/reflexio/cli/commands/setup_cmd.py +964 -0
  59. package/plugin/vendor/reflexio/reflexio/cli/commands/shortcuts.py +285 -0
  60. package/plugin/vendor/reflexio/reflexio/cli/commands/status_cmd.py +143 -0
  61. package/plugin/vendor/reflexio/reflexio/cli/commands/user_playbooks.py +373 -0
  62. package/plugin/vendor/reflexio/reflexio/cli/env_loader.py +284 -0
  63. package/plugin/vendor/reflexio/reflexio/cli/errors.py +217 -0
  64. package/plugin/vendor/reflexio/reflexio/cli/log_format.py +247 -0
  65. package/plugin/vendor/reflexio/reflexio/cli/output.py +867 -0
  66. package/plugin/vendor/reflexio/reflexio/cli/paths.py +41 -0
  67. package/plugin/vendor/reflexio/reflexio/cli/run_services.py +391 -0
  68. package/plugin/vendor/reflexio/reflexio/cli/state.py +204 -0
  69. package/plugin/vendor/reflexio/reflexio/cli/stop_services.py +96 -0
  70. package/plugin/vendor/reflexio/reflexio/cli/utils.py +329 -0
  71. package/plugin/vendor/reflexio/reflexio/client/__init__.py +3 -0
  72. package/plugin/vendor/reflexio/reflexio/client/cache.py +150 -0
  73. package/plugin/vendor/reflexio/reflexio/client/client.py +2613 -0
  74. package/plugin/vendor/reflexio/reflexio/defaults.py +23 -0
  75. package/plugin/vendor/reflexio/reflexio/integrations/__init__.py +0 -0
  76. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/.clawhubignore +7 -0
  77. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/README.md +274 -0
  78. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/TESTING.md +517 -0
  79. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/hook/handler.js +473 -0
  80. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package-lock.json +2156 -0
  81. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package.json +18 -0
  82. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/handler.ts +241 -0
  83. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/setup.ts +140 -0
  84. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/index.ts +130 -0
  85. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/publish.ts +113 -0
  86. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/search.ts +52 -0
  87. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/server.ts +103 -0
  88. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/sqlite-buffer.ts +156 -0
  89. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/user-id.ts +134 -0
  90. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/openclaw.plugin.json +41 -0
  91. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/package.json +17 -0
  92. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/rules/reflexio.md +24 -0
  93. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/reflexio/SKILL.md +48 -0
  94. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/publish_clawhub.sh +278 -0
  95. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/references/HOOK.md +164 -0
  96. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/install.sh +36 -0
  97. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/uninstall.sh +35 -0
  98. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/publish.test.ts +27 -0
  99. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/search.test.ts +31 -0
  100. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/server.test.ts +42 -0
  101. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/setup.test.ts +49 -0
  102. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/sqlite-buffer.test.ts +91 -0
  103. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/user-id.test.ts +50 -0
  104. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tsconfig.json +16 -0
  105. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/types/openclaw.d.ts +230 -0
  106. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/vitest.config.ts +13 -0
  107. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/README.md +120 -0
  108. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/TESTING.md +168 -0
  109. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/package-lock.json +1657 -0
  110. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/package.json +16 -0
  111. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/HEARTBEAT.md +6 -0
  112. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/README.md +84 -0
  113. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/SKILL.md +194 -0
  114. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/_meta.json +6 -0
  115. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/agents/reflexio-extractor.md +45 -0
  116. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/hook/handler.ts +214 -0
  117. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/hook/setup.ts +55 -0
  118. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/index.ts +327 -0
  119. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/consolidate.ts +233 -0
  120. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/dedup.ts +80 -0
  121. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/io.ts +155 -0
  122. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/openclaw-cli.ts +67 -0
  123. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/search.ts +33 -0
  124. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/write-playbook.ts +76 -0
  125. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/write-profile.ts +79 -0
  126. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/openclaw.plugin.json +46 -0
  127. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/package.json +18 -0
  128. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/README.md +36 -0
  129. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/full_consolidation.md +56 -0
  130. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/playbook_extraction.md +217 -0
  131. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/profile_extraction.md +132 -0
  132. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/skills/reflexio-consolidate/SKILL.md +33 -0
  133. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/skills/reflexio-embedded/SKILL.md +194 -0
  134. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/HOOK.md +18 -0
  135. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/architecture.md +49 -0
  136. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/comparison.md +31 -0
  137. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/future-work.md +47 -0
  138. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/porting-notes.md +52 -0
  139. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/scripts/install.sh +52 -0
  140. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/scripts/uninstall.sh +36 -0
  141. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/consolidate.test.ts +135 -0
  142. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/dedup.test.ts +104 -0
  143. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/io.test.ts +175 -0
  144. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/search.test.ts +66 -0
  145. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/smoke-test.ts +140 -0
  146. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/write-playbook.test.ts +93 -0
  147. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/write-profile.test.ts +174 -0
  148. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tsconfig.json +16 -0
  149. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/types/openclaw.d.ts +230 -0
  150. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/vitest.config.ts +7 -0
  151. package/plugin/vendor/reflexio/reflexio/lib/__init__.py +23 -0
  152. package/plugin/vendor/reflexio/reflexio/lib/_agent_playbook.py +310 -0
  153. package/plugin/vendor/reflexio/reflexio/lib/_base.py +225 -0
  154. package/plugin/vendor/reflexio/reflexio/lib/_config.py +83 -0
  155. package/plugin/vendor/reflexio/reflexio/lib/_dashboard.py +266 -0
  156. package/plugin/vendor/reflexio/reflexio/lib/_generation.py +176 -0
  157. package/plugin/vendor/reflexio/reflexio/lib/_interactions.py +334 -0
  158. package/plugin/vendor/reflexio/reflexio/lib/_operations.py +153 -0
  159. package/plugin/vendor/reflexio/reflexio/lib/_profiles.py +545 -0
  160. package/plugin/vendor/reflexio/reflexio/lib/_reflection.py +52 -0
  161. package/plugin/vendor/reflexio/reflexio/lib/_search.py +167 -0
  162. package/plugin/vendor/reflexio/reflexio/lib/_storage_labels.py +103 -0
  163. package/plugin/vendor/reflexio/reflexio/lib/_user_playbook.py +288 -0
  164. package/plugin/vendor/reflexio/reflexio/lib/reflexio_lib.py +27 -0
  165. package/plugin/vendor/reflexio/reflexio/models/__init__.py +0 -0
  166. package/plugin/vendor/reflexio/reflexio/models/api_schema/__init__.py +0 -0
  167. package/plugin/vendor/reflexio/reflexio/models/api_schema/braintrust_schema.py +141 -0
  168. package/plugin/vendor/reflexio/reflexio/models/api_schema/common.py +41 -0
  169. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/__init__.py +3 -0
  170. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/entities.py +1112 -0
  171. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/enums.py +63 -0
  172. package/plugin/vendor/reflexio/reflexio/models/api_schema/eval_overview_schema.py +487 -0
  173. package/plugin/vendor/reflexio/reflexio/models/api_schema/internal_schema.py +28 -0
  174. package/plugin/vendor/reflexio/reflexio/models/api_schema/pending_tool_call_schema.py +83 -0
  175. package/plugin/vendor/reflexio/reflexio/models/api_schema/retriever_schema.py +768 -0
  176. package/plugin/vendor/reflexio/reflexio/models/api_schema/service_schemas.py +9 -0
  177. package/plugin/vendor/reflexio/reflexio/models/api_schema/stall_state_schema.py +32 -0
  178. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/__init__.py +3 -0
  179. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/converters.py +177 -0
  180. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/entities.py +129 -0
  181. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/enums.py +25 -0
  182. package/plugin/vendor/reflexio/reflexio/models/api_schema/validators.py +333 -0
  183. package/plugin/vendor/reflexio/reflexio/models/config_schema.py +908 -0
  184. package/plugin/vendor/reflexio/reflexio/models/py.typed +0 -0
  185. package/plugin/vendor/reflexio/reflexio/server/OVERVIEW.md +90 -0
  186. package/plugin/vendor/reflexio/reflexio/server/README.md +622 -0
  187. package/plugin/vendor/reflexio/reflexio/server/__init__.py +210 -0
  188. package/plugin/vendor/reflexio/reflexio/server/__main__.py +132 -0
  189. package/plugin/vendor/reflexio/reflexio/server/_auth.py +25 -0
  190. package/plugin/vendor/reflexio/reflexio/server/api.py +2868 -0
  191. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/README.md +34 -0
  192. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/account_api.py +143 -0
  193. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/health_api.py +91 -0
  194. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/pending_tool_call_api.py +572 -0
  195. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/precondition_checks.py +66 -0
  196. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/publisher_api.py +562 -0
  197. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/request_context.py +50 -0
  198. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/stall_state_api.py +100 -0
  199. package/plugin/vendor/reflexio/reflexio/server/cache/__init__.py +15 -0
  200. package/plugin/vendor/reflexio/reflexio/server/cache/reflexio_cache.py +208 -0
  201. package/plugin/vendor/reflexio/reflexio/server/correlation.py +46 -0
  202. package/plugin/vendor/reflexio/reflexio/server/llm/__init__.py +30 -0
  203. package/plugin/vendor/reflexio/reflexio/server/llm/embedding_service.py +359 -0
  204. package/plugin/vendor/reflexio/reflexio/server/llm/image_utils.py +55 -0
  205. package/plugin/vendor/reflexio/reflexio/server/llm/litellm_client.py +1871 -0
  206. package/plugin/vendor/reflexio/reflexio/server/llm/llm_utils.py +140 -0
  207. package/plugin/vendor/reflexio/reflexio/server/llm/model_defaults.py +479 -0
  208. package/plugin/vendor/reflexio/reflexio/server/llm/providers/__init__.py +1 -0
  209. package/plugin/vendor/reflexio/reflexio/server/llm/providers/claude_code_provider.py +1122 -0
  210. package/plugin/vendor/reflexio/reflexio/server/llm/providers/claude_code_stream_parser.py +197 -0
  211. package/plugin/vendor/reflexio/reflexio/server/llm/providers/embedding_service_provider.py +338 -0
  212. package/plugin/vendor/reflexio/reflexio/server/llm/providers/local_embedding_provider.py +213 -0
  213. package/plugin/vendor/reflexio/reflexio/server/llm/providers/nomic_embedding_provider.py +288 -0
  214. package/plugin/vendor/reflexio/reflexio/server/llm/rerank/__init__.py +6 -0
  215. package/plugin/vendor/reflexio/reflexio/server/llm/rerank/cross_encoder_reranker.py +187 -0
  216. package/plugin/vendor/reflexio/reflexio/server/llm/rerank/llm_reranker.py +148 -0
  217. package/plugin/vendor/reflexio/reflexio/server/llm/tools.py +716 -0
  218. package/plugin/vendor/reflexio/reflexio/server/operation_limiter.py +179 -0
  219. package/plugin/vendor/reflexio/reflexio/server/prompt/__init__.py +0 -0
  220. package/plugin/vendor/reflexio/reflexio/server/prompt/_dispatchers.py +54 -0
  221. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/README.md +121 -0
  222. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/agent_success_evaluation/v1.0.0.prompt.md +58 -0
  223. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/agent_success_evaluation_with_comparison/v1.0.0.prompt.md +76 -0
  224. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/answer_synthesis/v1.5.2.prompt.md +88 -0
  225. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/compress_session_for_query/v1.3.0.prompt.md +31 -0
  226. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/document_expansion/v1.0.0.prompt.md +20 -0
  227. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.0.0.prompt.md +53 -0
  228. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.1.0.prompt.md +57 -0
  229. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.2.0.prompt.md +68 -0
  230. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.3.0.prompt.md +70 -0
  231. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.4.0.prompt.md +77 -0
  232. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.5.0.prompt.md +82 -0
  233. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.6.0.prompt.md +83 -0
  234. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.1.0.prompt.md +193 -0
  235. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.2.0.prompt.md +206 -0
  236. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.0.0-deprecated.prompt.md +66 -0
  237. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.0.0.prompt.md +43 -0
  238. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.1.0.prompt.md +46 -0
  239. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.0.0-deprecated.prompt.md +64 -0
  240. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.0.0.prompt.md +39 -0
  241. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.1.0.prompt.md +39 -0
  242. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.2.0.prompt.md +47 -0
  243. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.0.prompt.md +58 -0
  244. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.1.prompt.md +69 -0
  245. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.2.prompt.md +71 -0
  246. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.0.2.prompt.md +254 -0
  247. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.1.0.prompt.md +274 -0
  248. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.2.0.prompt.md +283 -0
  249. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.2.2.prompt.md +234 -0
  250. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.2.3.prompt.md +244 -0
  251. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v1.0.0.prompt.md +73 -0
  252. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v2.0.0.prompt.md +86 -0
  253. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.0.0.prompt.md +97 -0
  254. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.1.0.prompt.md +119 -0
  255. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.2.0.prompt.md +123 -0
  256. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.3.0.prompt.md +137 -0
  257. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.0.0.prompt.md +14 -0
  258. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.1.0.prompt.md +24 -0
  259. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.2.0.prompt.md +29 -0
  260. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.0.0.prompt.md +11 -0
  261. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.1.0.prompt.md +21 -0
  262. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.2.0.prompt.md +25 -0
  263. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.0.0.prompt.md +37 -0
  264. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.1.0.prompt.md +40 -0
  265. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.2.0.prompt.md +36 -0
  266. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v1.0.0.prompt.md +45 -0
  267. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v2.0.0.prompt.md +81 -0
  268. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v3.0.0.prompt.md +80 -0
  269. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate_expert/v1.0.0.prompt.md +34 -0
  270. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_deduplication/v1.0.0.prompt.md +116 -0
  271. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_should_generate/v1.0.0.prompt.md +33 -0
  272. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_should_generate_override/v1.0.0.prompt.md +16 -0
  273. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.0.0.prompt.md +140 -0
  274. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.1.0.prompt.md +160 -0
  275. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_main/v1.0.0.prompt.md +14 -0
  276. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/query_reformulation/v1.0.0.prompt.md +19 -0
  277. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/rerank_relevance/v1.1.0.prompt.md +44 -0
  278. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/shadow_comparison/v1.0.0.prompt.md +43 -0
  279. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/shadow_content_evaluation/v1.0.0.prompt.md +33 -0
  280. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_evaluation/prompt_evaluation_dataset/feedback_extraction_main_v1.jsonl +10 -0
  281. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_evaluation/prompt_evaluation_dataset/profile_update_main_v1.jsonl +10 -0
  282. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_manager.py +280 -0
  283. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_schema.py +11 -0
  284. package/plugin/vendor/reflexio/reflexio/server/services/README.md +58 -0
  285. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/_eval_health.py +131 -0
  286. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_constants.py +60 -0
  287. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_service.py +228 -0
  288. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_utils.py +87 -0
  289. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluator.py +372 -0
  290. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/delayed_group_evaluator.py +156 -0
  291. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/group_evaluation_runner.py +336 -0
  292. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/regen_jobs.py +471 -0
  293. package/plugin/vendor/reflexio/reflexio/server/services/base_generation_service.py +1668 -0
  294. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/__init__.py +0 -0
  295. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/_cron.py +196 -0
  296. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/_encryption.py +101 -0
  297. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/client.py +167 -0
  298. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/service.py +281 -0
  299. package/plugin/vendor/reflexio/reflexio/server/services/configurator/base_configurator.py +179 -0
  300. package/plugin/vendor/reflexio/reflexio/server/services/configurator/config_storage.py +62 -0
  301. package/plugin/vendor/reflexio/reflexio/server/services/configurator/configurator.py +87 -0
  302. package/plugin/vendor/reflexio/reflexio/server/services/configurator/local_file_config_storage.py +187 -0
  303. package/plugin/vendor/reflexio/reflexio/server/services/configurator/test_config_storage.py +162 -0
  304. package/plugin/vendor/reflexio/reflexio/server/services/deduplication_utils.py +112 -0
  305. package/plugin/vendor/reflexio/reflexio/server/services/embedding_text.py +62 -0
  306. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/__init__.py +0 -0
  307. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/distribution.py +33 -0
  308. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/eval_sampler.py +126 -0
  309. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/group_aggregation.py +192 -0
  310. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/hero_state.py +75 -0
  311. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/rule_attribution.py +97 -0
  312. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/service.py +515 -0
  313. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/shadow_aggregation.py +90 -0
  314. package/plugin/vendor/reflexio/reflexio/server/services/extraction/__init__.py +0 -0
  315. package/plugin/vendor/reflexio/reflexio/server/services/extraction/agent_run_records.py +91 -0
  316. package/plugin/vendor/reflexio/reflexio/server/services/extraction/invariants.py +303 -0
  317. package/plugin/vendor/reflexio/reflexio/server/services/extraction/outcome.py +25 -0
  318. package/plugin/vendor/reflexio/reflexio/server/services/extraction/pending_tool_call_dispatch.py +358 -0
  319. package/plugin/vendor/reflexio/reflexio/server/services/extraction/plan.py +138 -0
  320. package/plugin/vendor/reflexio/reflexio/server/services/extraction/prior_answer_search.py +217 -0
  321. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resumable_agent.py +535 -0
  322. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_scheduler.py +171 -0
  323. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_worker.py +779 -0
  324. package/plugin/vendor/reflexio/reflexio/server/services/extraction/tools.py +1125 -0
  325. package/plugin/vendor/reflexio/reflexio/server/services/extractor_config_utils.py +94 -0
  326. package/plugin/vendor/reflexio/reflexio/server/services/extractor_interaction_utils.py +251 -0
  327. package/plugin/vendor/reflexio/reflexio/server/services/generation_service.py +702 -0
  328. package/plugin/vendor/reflexio/reflexio/server/services/operation_state_utils.py +835 -0
  329. package/plugin/vendor/reflexio/reflexio/server/services/playbook/README.md +89 -0
  330. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_aggregator.py +1388 -0
  331. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_consolidator.py +1045 -0
  332. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_extractor.py +436 -0
  333. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_generation_service.py +808 -0
  334. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_service_constants.py +28 -0
  335. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_service_utils.py +362 -0
  336. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/__init__.py +24 -0
  337. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/assistant_webhook.py +246 -0
  338. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/gepa_adapter.py +291 -0
  339. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/judge.py +97 -0
  340. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/models.py +96 -0
  341. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/optimizer.py +645 -0
  342. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/rollout.py +35 -0
  343. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/scenario_resolver.py +93 -0
  344. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/scheduler.py +174 -0
  345. package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/__init__.py +26 -0
  346. package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/_document_expander.py +179 -0
  347. package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/_query_reformulator.py +297 -0
  348. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_deduplicator.py +772 -0
  349. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_extractor.py +462 -0
  350. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_generation_service.py +737 -0
  351. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_generation_service_utils.py +290 -0
  352. package/plugin/vendor/reflexio/reflexio/server/services/reflection/__init__.py +17 -0
  353. package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_extractor.py +247 -0
  354. package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_service.py +803 -0
  355. package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_service_utils.py +146 -0
  356. package/plugin/vendor/reflexio/reflexio/server/services/retrieval/__init__.py +0 -0
  357. package/plugin/vendor/reflexio/reflexio/server/services/retrieval/relevance_floor.py +80 -0
  358. package/plugin/vendor/reflexio/reflexio/server/services/search/__init__.py +0 -0
  359. package/plugin/vendor/reflexio/reflexio/server/services/service_utils.py +756 -0
  360. package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/__init__.py +1 -0
  361. package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/judge.py +184 -0
  362. package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/outcome.py +81 -0
  363. package/plugin/vendor/reflexio/reflexio/server/services/storage/constants.py +2 -0
  364. package/plugin/vendor/reflexio/reflexio/server/services/storage/error.py +11 -0
  365. package/plugin/vendor/reflexio/reflexio/server/services/storage/retention.py +154 -0
  366. package/plugin/vendor/reflexio/reflexio/server/services/storage/retention_mixin.py +155 -0
  367. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/__init__.py +59 -0
  368. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_agent_run.py +1298 -0
  369. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_base.py +1945 -0
  370. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_extras.py +600 -0
  371. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_operations.py +346 -0
  372. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_playbook.py +1378 -0
  373. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_profiles.py +747 -0
  374. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_requests.py +263 -0
  375. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_shadow_verdicts.py +193 -0
  376. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_share_links.py +166 -0
  377. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_stall_state.py +217 -0
  378. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/__init__.py +153 -0
  379. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_agent_run.py +384 -0
  380. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_base.py +71 -0
  381. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_extras.py +235 -0
  382. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_operations.py +170 -0
  383. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_playbook.py +677 -0
  384. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_profiles.py +250 -0
  385. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_requests.py +154 -0
  386. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_shadow_verdicts.py +130 -0
  387. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_share_links.py +93 -0
  388. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_stall_state.py +76 -0
  389. package/plugin/vendor/reflexio/reflexio/server/services/unified_search_service.py +572 -0
  390. package/plugin/vendor/reflexio/reflexio/server/site_var/README.md +77 -0
  391. package/plugin/vendor/reflexio/reflexio/server/site_var/feature_flags.py +116 -0
  392. package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_manager.py +263 -0
  393. package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/feature_flags.json +13 -0
  394. package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/llm_model_setting.json +7 -0
  395. package/plugin/vendor/reflexio/reflexio/server/tracing.py +158 -0
  396. package/plugin/vendor/reflexio/reflexio/server/usage_metrics.py +113 -0
  397. package/plugin/vendor/reflexio/reflexio/server/uvicorn_logging.py +76 -0
  398. package/plugin/vendor/reflexio/reflexio/test_support/__init__.py +1 -0
  399. package/plugin/vendor/reflexio/reflexio/test_support/llm_fixtures.py +62 -0
  400. package/plugin/vendor/reflexio/reflexio/test_support/llm_mock.py +242 -0
  401. package/plugin/vendor/reflexio/reflexio/test_support/llm_model_registry.py +129 -0
  402. package/plugin/vendor/reflexio/reflexio/test_support/skip_decorators.py +43 -0
@@ -4,14 +4,14 @@
4
4
  "name": "Yi Lu"
5
5
  },
6
6
  "metadata": {
7
- "description": "claude-smart — self-improving Claude Code plugin via reflexio"
7
+ "description": "claude-smart — self-improving Claude Code and Codex plugin via reflexio"
8
8
  },
9
9
  "plugins": [
10
10
  {
11
11
  "name": "claude-smart",
12
- "version": "0.2.42",
12
+ "version": "0.2.44",
13
13
  "source": "./plugin",
14
- "description": "Learns user corrections and project playbooks via reflexio — uses Claude Code itself as the LLM backend (no external API key required)"
14
+ "description": "Turns user corrections into project-specific and shared skills via reflexio — uses Claude Code or Codex as the LLM backend (no external API key required)"
15
15
  }
16
16
  ]
17
17
  }
package/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
  <img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg" alt="License">
14
14
  </a>
15
15
  <a href="plugin/pyproject.toml">
16
- <img src="https://img.shields.io/badge/version-0.2.42-green.svg" alt="Version">
16
+ <img src="https://img.shields.io/badge/version-0.2.44-green.svg" alt="Version">
17
17
  </a>
18
18
  <a href="plugin/pyproject.toml">
19
19
  <img src="https://img.shields.io/badge/python-%3E%3D3.12-brightgreen.svg" alt="Python">
@@ -905,7 +905,7 @@ async function installVendoredReflexio(pluginRoot, uv, env) {
905
905
  process.stdout.write(`Installing bundled Reflexio source from ${vendorRoot}...\n`);
906
906
  let code = await runChecked(
907
907
  uv,
908
- ["pip", "install", "--project", pluginRoot, "--python", pythonPath, "--quiet", "-e", vendorRoot],
908
+ ["pip", "install", "--project", pluginRoot, "--python", pythonPath, "--quiet", "--reinstall", "--no-deps", vendorRoot],
909
909
  { cwd: pluginRoot, env },
910
910
  );
911
911
  if (code !== 0) {
@@ -914,7 +914,7 @@ async function installVendoredReflexio(pluginRoot, uv, env) {
914
914
  );
915
915
  code = await runChecked(
916
916
  uv,
917
- ["pip", "install", "--project", pluginRoot, "--python", pythonPath, "-e", vendorRoot],
917
+ ["pip", "install", "--project", pluginRoot, "--python", pythonPath, "--reinstall", "--no-deps", vendorRoot],
918
918
  { cwd: pluginRoot, env },
919
919
  );
920
920
  }
package/package.json CHANGED
@@ -1,14 +1,20 @@
1
1
  {
2
2
  "name": "claude-smart",
3
- "version": "0.2.42",
4
- "description": "Self-improving Claude Code plugin — learns from corrections via reflexio",
3
+ "version": "0.2.44",
4
+ "description": "Self-improving Claude Code and Codex plugin — turns corrections into durable skills via reflexio",
5
5
  "keywords": [
6
6
  "claude",
7
7
  "claude-code",
8
+ "claude-code-plugin",
9
+ "codex",
10
+ "codex-plugin",
11
+ "memory",
12
+ "agent-memory",
8
13
  "plugin",
9
14
  "reflexio",
10
15
  "self-improvement",
11
- "playbook",
16
+ "self-improving-agents",
17
+ "skills",
12
18
  "learning"
13
19
  ],
14
20
  "homepage": "https://github.com/ReflexioAI/claude-smart#readme",
@@ -1,17 +1,23 @@
1
1
  {
2
2
  "name": "claude-smart",
3
- "version": "0.2.42",
4
- "description": "Self-improving Claude Code plugin — learns from corrections across sessions via reflexio",
3
+ "version": "0.2.44",
4
+ "description": "Self-improving Claude Code and Codex plugin — turns corrections into durable skills via reflexio",
5
5
  "author": {
6
6
  "name": "Yi Lu"
7
7
  },
8
8
  "keywords": [
9
9
  "claude",
10
10
  "claude-code",
11
+ "claude-code-plugin",
12
+ "codex",
13
+ "codex-plugin",
14
+ "memory",
15
+ "agent-memory",
11
16
  "plugin",
12
17
  "reflexio",
13
18
  "self-improvement",
14
- "playbook",
19
+ "self-improving-agents",
20
+ "skills",
15
21
  "learning"
16
22
  ]
17
23
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-smart",
3
- "version": "0.2.42",
3
+ "version": "0.2.44",
4
4
  "description": "Self-improving coding assistant plugin — learns from corrections across sessions via reflexio",
5
5
  "author": {
6
6
  "name": "Yi Lu"
package/plugin/README.md CHANGED
@@ -1,11 +1,13 @@
1
1
  # claude-smart
2
2
 
3
- Self-improving [Claude Code](https://claude.com/claude-code) plugin — turns your corrections into durable rules that Claude Code follows in future sessions, via [reflexio](https://github.com/ReflexioAI/reflexio).
3
+ Self-improving [Claude Code](https://claude.com/claude-code) and Codex plugin — turns your corrections into durable skills that future sessions follow, via [reflexio](https://github.com/ReflexioAI/reflexio).
4
4
 
5
- This directory is the published Python package (`claude-smart` on PyPI) and the Claude Code plugin payload shipped through the marketplace. For the project overview, install instructions, benchmarks, and feature walkthrough, see the [top-level README](https://github.com/ReflexioAI/claude-smart#readme).
5
+ This directory is the published Python package (`claude-smart` on PyPI) and the Claude Code/Codex plugin payload shipped through the marketplace. For the project overview, install instructions, benchmarks, and feature walkthrough, see the [top-level README](https://github.com/ReflexioAI/claude-smart#readme).
6
6
 
7
7
  ## Install
8
8
 
9
+ ### Claude Code
10
+
9
11
  ```bash
10
12
  claude plugin marketplace add ReflexioAI/claude-smart
11
13
  claude plugin install claude-smart@reflexioai
@@ -25,8 +27,19 @@ embedding/ML dependency stack does not provide a complete native wheel set.
25
27
 
26
28
  Then restart Claude Code.
27
29
 
30
+ ### Codex
31
+
32
+ ```bash
33
+ npx claude-smart install --host codex
34
+ ```
35
+
36
+ Then fully quit and reopen Codex so hooks reload. Codex installs reuse the same
37
+ local Preferences, Project-specific skills, and Shared skills as Claude Code.
38
+
28
39
  ## Uninstall
29
40
 
41
+ ### Claude Code
42
+
30
43
  ```bash
31
44
  claude plugin uninstall claude-smart@reflexioai
32
45
  ```
@@ -37,7 +50,14 @@ Or, if Node.js or uv is already installed:
37
50
  npx claude-smart uninstall # or: uvx claude-smart uninstall
38
51
  ```
39
52
 
40
- Local data under `~/.reflexio/` and `~/.claude-smart/` is left in place — remove manually if desired.
53
+ ### Codex
54
+
55
+ ```bash
56
+ npx claude-smart uninstall --host codex
57
+ ```
58
+
59
+ Restart Codex after uninstalling. Local data under `~/.reflexio/` and
60
+ `~/.claude-smart/` is left in place for both hosts — remove manually if desired.
41
61
 
42
62
  ## License
43
63
 
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "claude-smart"
3
- version = "0.2.42"
4
- description = "Self-improving Claude Code plugin — learns from corrections via reflexio"
3
+ version = "0.2.44"
4
+ description = "Self-improving Claude Code and Codex plugin — turns corrections into durable skills via reflexio"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
7
7
  dependencies = [
@@ -9,7 +9,7 @@ dependencies = [
9
9
  # normal installs; vendor releases may override it after uv sync by
10
10
  # installing plugin/vendor/reflexio. Keep in sync via
11
11
  # scripts/sync-reflexio-dep.py.
12
- "reflexio-ai>=0.2.23",
12
+ "reflexio-ai>=0.2.25",
13
13
  # Needed when Reflexio runs the local embedding provider (ONNXMiniLM_L6_V2).
14
14
  # Pulls in onnxruntime + tokenizers; the ~80 MB ONNX model itself is
15
15
  # downloaded on first use, not at install time.
@@ -220,6 +220,97 @@ importlib.import_module(sys.argv[1])
220
220
  PY
221
221
  }
222
222
 
223
+ claude_smart_canonical_dir() {
224
+ local dir
225
+ dir="$1"
226
+ [ -d "$dir" ] || return 1
227
+ (cd "$dir" 2>/dev/null && pwd -P)
228
+ }
229
+
230
+ # True when $1 canonicalizes to a plugin directory that physically lives
231
+ # *inside* ~/.reflexio. claude-smart's real install never places the live
232
+ # plugin tree there: the only entry under ~/.reflexio is the `plugin-root`
233
+ # symlink, whose `pwd -P` resolves to a cache dir *outside* ~/.reflexio
234
+ # (~/.claude, ~/.codex, or the npm global). So any plugin root that resolves
235
+ # to a descendant of ~/.reflexio is a stray host-made copy — e.g. the Windows
236
+ # cwd-derived `CUsers...` directories from issue #65 — that we must not
237
+ # bootstrap a heavy .venv/node_modules into.
238
+ #
239
+ # Detection is structural (descendant-of-~/.reflexio + plugin markers) rather
240
+ # than name-based on purpose: the host mangles the cwd differently per drive
241
+ # and user dir (C:\Users -> CUsers..., D:\repos -> Drepos..., varying case),
242
+ # so matching a fixed prefix like `Cu*` misses most real copies.
243
+ claude_smart_is_reflexio_session_copy() {
244
+ local plugin_root reflexio_root
245
+ plugin_root="$(claude_smart_canonical_dir "$1" 2>/dev/null || true)"
246
+ [ -n "$plugin_root" ] || return 1
247
+ # Must look like a plugin root — not ~/.reflexio/data, /configs, or .env.
248
+ [ -f "$plugin_root/pyproject.toml" ] || return 1
249
+ [ -d "$plugin_root/scripts" ] || return 1
250
+ reflexio_root="$(claude_smart_canonical_dir "$HOME/.reflexio" 2>/dev/null || true)"
251
+ [ -n "$reflexio_root" ] || return 1
252
+ # Descendant of ~/.reflexio. The trailing slash on the subject plus the
253
+ # "/" before * pins the boundary so a sibling like ~/.reflexio-bak/plugin
254
+ # does not match.
255
+ case "$plugin_root/" in
256
+ "$reflexio_root"/*) return 0 ;;
257
+ esac
258
+ return 1
259
+ }
260
+
261
+ claude_smart_stable_plugin_root_for_session_copy() {
262
+ local current candidate current_real candidate_real glob
263
+ current="$1"
264
+ if ! claude_smart_is_reflexio_session_copy "$current"; then
265
+ return 1
266
+ fi
267
+ current_real="$(claude_smart_canonical_dir "$current" 2>/dev/null || true)"
268
+
269
+ for candidate in \
270
+ "$HOME/.reflexio/plugin-root" \
271
+ "$HOME/.claude/plugins/marketplaces/reflexioai/plugin" \
272
+ "$HOME/.codex/plugins/cache/reflexioai/claude-smart/current"
273
+ do
274
+ [ -f "$candidate/pyproject.toml" ] || continue
275
+ candidate_real="$(claude_smart_canonical_dir "$candidate" 2>/dev/null || true)"
276
+ [ -n "$candidate_real" ] || continue
277
+ [ "$candidate_real" != "$current_real" ] || continue
278
+ if claude_smart_is_reflexio_session_copy "$candidate_real"; then
279
+ continue
280
+ fi
281
+ printf '%s\n' "$candidate_real"
282
+ return 0
283
+ done
284
+
285
+ for glob in "$HOME/.claude/plugins/cache/reflexioai/claude-smart"/* "$HOME/.codex/plugins/cache/reflexioai/claude-smart"/*; do
286
+ [ -f "$glob/pyproject.toml" ] || continue
287
+ candidate_real="$(claude_smart_canonical_dir "$glob" 2>/dev/null || true)"
288
+ [ -n "$candidate_real" ] || continue
289
+ [ "$candidate_real" != "$current_real" ] || continue
290
+ if claude_smart_is_reflexio_session_copy "$candidate_real"; then
291
+ continue
292
+ fi
293
+ printf '%s\n' "$candidate_real"
294
+ return 0
295
+ done
296
+ return 1
297
+ }
298
+
299
+ claude_smart_reexec_stable_plugin_root_if_needed() {
300
+ local plugin_root script stable
301
+ plugin_root="$1"
302
+ script="$2"
303
+ stable="$(claude_smart_stable_plugin_root_for_session_copy "$plugin_root" 2>/dev/null || true)"
304
+ [ -n "$stable" ] || return 0
305
+ # `-f` not `-x`: we re-run via `exec bash <script>`, which does not need the
306
+ # executable bit. Cached copies on Windows/NTFS often lack +x, so requiring
307
+ # -x would no-op the guard on the very platform issue #65 affects.
308
+ [ -f "$stable/scripts/$script" ] || return 0
309
+ echo "[claude-smart] redirecting stray plugin copy under ~/.reflexio ($plugin_root) to stable root $stable" >&2
310
+ shift 2
311
+ exec bash "$stable/scripts/$script" "$@"
312
+ }
313
+
223
314
  claude_smart_download() {
224
315
  local url dest src _CS_PY
225
316
  url="$1"
@@ -5,8 +5,8 @@
5
5
  #
6
6
  # Subcommands:
7
7
  # start probe /health; if nothing we recognize is on the port,
8
- # spawn `uv run reflexio services start --only backend
9
- # --no-reload` detached. Polls /health briefly so first
8
+ # spawn the prepared venv's `reflexio services start --only
9
+ # backend --no-reload` detached. Polls /health briefly so first
10
10
  # use after session start lands on a warm server, then
11
11
  # returns a continue payload regardless.
12
12
  # stop SIGTERM the recorded process group, escalating to
@@ -45,6 +45,7 @@ fi
45
45
  # CLI dir (commonly ~/.local/bin or /opt/homebrew/bin). Pin the CLI
46
46
  # explicitly if we can resolve it from our own (post-login-path) PATH.
47
47
  PLUGIN_ROOT="$(cd "$HERE/.." && pwd)"
48
+ claude_smart_reexec_stable_plugin_root_if_needed "$PLUGIN_ROOT" "backend-service.sh" "$@"
48
49
 
49
50
  if [ -z "${CLAUDE_SMART_CLI_PATH:-}" ]; then
50
51
  if [ "${CLAUDE_SMART_HOST:-claude-code}" = "codex" ]; then
@@ -182,6 +183,35 @@ port_holder() {
182
183
  | awk 'NR==2 {print $1" (pid "$2")"; exit}'
183
184
  }
184
185
 
186
+ ensure_vendored_reflexio_active() {
187
+ vendor="$PLUGIN_ROOT/vendor/reflexio"
188
+ [ -f "$vendor/pyproject.toml" ] || return 0
189
+ plugin_python="$(claude_smart_plugin_python "$PLUGIN_ROOT")"
190
+ [ -x "$plugin_python" ] || return 0
191
+ if "$plugin_python" - "$vendor/pyproject.toml" <<'PY' >/dev/null 2>&1; then
192
+ import importlib.metadata
193
+ import re
194
+ import sys
195
+ from pathlib import Path
196
+
197
+ text = Path(sys.argv[1]).read_text(encoding="utf-8")
198
+ match = re.search(r'^version\s*=\s*"([^"]+)"', text, re.MULTILINE)
199
+ if not match:
200
+ raise SystemExit(1)
201
+ expected = match.group(1)
202
+ try:
203
+ installed = importlib.metadata.version("reflexio-ai")
204
+ except importlib.metadata.PackageNotFoundError:
205
+ raise SystemExit(1)
206
+ raise SystemExit(0 if installed == expected else 1)
207
+ PY
208
+ return 0
209
+ fi
210
+ claude_smart_append_capped_log "$LOG_FILE" "$LOG_MAX_BYTES" \
211
+ "[claude-smart] backend: repairing vendored Reflexio install before start"
212
+ uv pip install --project "$PLUGIN_ROOT" --python "$plugin_python" --quiet --reinstall --no-deps "$vendor" >&2
213
+ }
214
+
185
215
  # Full shutdown: kill the recorded process group (if any) then sweep
186
216
  # both the backend port and the embedding-service port for surviving
187
217
  # reflexio listeners. Used by both `stop` and the opt-in `session-end`
@@ -242,6 +272,7 @@ case "$CMD" in
242
272
  fi
243
273
  fi
244
274
  cd "$PLUGIN_ROOT"
275
+ ensure_vendored_reflexio_active
245
276
 
246
277
  # Cap local interaction history to keep the SQLite store small for
247
278
  # claude-smart users. Reflexio's library defaults are much higher
@@ -265,6 +296,21 @@ case "$CMD" in
265
296
  # without touching the file on disk.
266
297
  export REFLEXIO_STORAGE="sqlite"
267
298
 
299
+ backend_pythonpath="${PYTHONPATH:-}"
300
+ if [ -d "$PLUGIN_ROOT/vendor/reflexio/reflexio" ]; then
301
+ vendor_pythonpath="$PLUGIN_ROOT/vendor/reflexio"
302
+ pythonpath_sep=":"
303
+ if claude_smart_is_windows; then
304
+ # Native Windows Python expects ;-separated Windows-style paths in
305
+ # PYTHONPATH; MSYS does not auto-convert arbitrary env vars.
306
+ pythonpath_sep=";"
307
+ if command -v cygpath >/dev/null 2>&1; then
308
+ vendor_pythonpath="$(cygpath -w "$vendor_pythonpath")"
309
+ fi
310
+ fi
311
+ backend_pythonpath="$vendor_pythonpath${backend_pythonpath:+$pythonpath_sep$backend_pythonpath}"
312
+ fi
313
+
268
314
  # (nohup; no process groups). backend-log-runner.sh owns stdout/stderr
269
315
  # capture so process output cannot grow backend.log past its cap.
270
316
  #
@@ -276,11 +322,12 @@ case "$CMD" in
276
322
  # CLAUDE_SMART_BACKEND_WORKERS for power users running concurrent
277
323
  # Claude Code sessions or wanting zero-downtime recycling.
278
324
  workers="${CLAUDE_SMART_BACKEND_WORKERS:-1}"
325
+ backend_python="$(claude_smart_plugin_python "$PLUGIN_ROOT")"
279
326
  claude_smart_spawn_detached bash "$HERE/backend-log-runner.sh" \
280
327
  "$LOG_FILE" "$LOG_MAX_BYTES" -- \
281
328
  env PYTHONIOENCODING="${PYTHONIOENCODING:-utf-8}" \
282
- uv run --project "$PLUGIN_ROOT" --no-sync --quiet \
283
- reflexio services start --only backend --no-reload --workers "$workers"
329
+ PYTHONPATH="$backend_pythonpath" \
330
+ "$backend_python" -m reflexio.cli services start --only backend --no-reload --workers "$workers"
284
331
  svc_pid=$!
285
332
  # Record the spawned pid, not a pgid sampled with ps. On POSIX,
286
333
  # setsid/python os.setsid make this pid the new process group leader;
@@ -18,6 +18,7 @@ claude_smart_prepend_node_bins
18
18
  claude_smart_source_reflexio_env
19
19
 
20
20
  PLUGIN_ROOT="$(cd "$HERE/.." && pwd)"
21
+ claude_smart_reexec_stable_plugin_root_if_needed "$PLUGIN_ROOT" "cli.sh" "$@"
21
22
 
22
23
  # If the Setup hook recorded an install failure, surface that reason
23
24
  # instead of falling through to a generic "uv not found" — mirrors the
@@ -90,4 +91,5 @@ if ! claude_smart_python_imports "$PLUGIN_ROOT" claude_smart.cli; then
90
91
  fi
91
92
  fi
92
93
 
93
- exec uv run --project "$PLUGIN_ROOT" --no-sync --quiet python -m claude_smart.cli "$@"
94
+ PLUGIN_PYTHON="$(claude_smart_plugin_python "$PLUGIN_ROOT")"
95
+ exec "$PLUGIN_PYTHON" -m claude_smart.cli "$@"
@@ -89,14 +89,82 @@ function appendLog(name, line) {
89
89
  trimLog(file);
90
90
  }
91
91
 
92
+ function realDir(dir) {
93
+ try {
94
+ if (!fs.statSync(dir).isDirectory()) return null;
95
+ return fs.realpathSync(dir);
96
+ } catch {
97
+ return null;
98
+ }
99
+ }
100
+
101
+ function isInsideDir(parent, child) {
102
+ const rel = path.relative(parent, child);
103
+ return rel && !rel.startsWith("..") && !path.isAbsolute(rel);
104
+ }
105
+
106
+ function isPluginLikeRoot(root) {
107
+ return fs.existsSync(path.join(root, "pyproject.toml")) && fs.existsSync(path.join(root, "scripts"));
108
+ }
109
+
110
+ function isReflexioStrayPluginCopy(root) {
111
+ if (!isPluginLikeRoot(root)) return false;
112
+ const rootReal = realDir(root);
113
+ const reflexioReal = realDir(REFLEXIO_DIR);
114
+ if (!rootReal || !reflexioReal) return false;
115
+ return isInsideDir(reflexioReal, rootReal);
116
+ }
117
+
118
+ function stablePluginRootForStrayCopy(root) {
119
+ if (!isReflexioStrayPluginCopy(root)) return null;
120
+ const rootReal = realDir(root);
121
+ const candidates = [
122
+ path.join(REFLEXIO_DIR, "plugin-root"),
123
+ path.join(HOME, ".claude", "plugins", "marketplaces", "reflexioai", "plugin"),
124
+ path.join(HOME, ".codex", "plugins", "cache", "reflexioai", "claude-smart", "current"),
125
+ ];
126
+ for (const cacheRoot of [
127
+ path.join(HOME, ".claude", "plugins", "cache", "reflexioai", "claude-smart"),
128
+ path.join(HOME, ".codex", "plugins", "cache", "reflexioai", "claude-smart"),
129
+ ]) {
130
+ try {
131
+ const versions = fs
132
+ .readdirSync(cacheRoot, { withFileTypes: true })
133
+ .filter((entry) => entry.isDirectory())
134
+ .map((entry) => path.join(cacheRoot, entry.name))
135
+ .sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
136
+ candidates.push(...versions);
137
+ } catch {
138
+ // Missing cache roots are fine; try the next candidate family.
139
+ }
140
+ }
141
+ for (const candidate of candidates) {
142
+ if (!isPluginLikeRoot(candidate)) continue;
143
+ const candidateReal = realDir(candidate);
144
+ if (!candidateReal || candidateReal === rootReal) continue;
145
+ if (isReflexioStrayPluginCopy(candidateReal)) continue;
146
+ return candidateReal;
147
+ }
148
+ return null;
149
+ }
150
+
151
+ function stablePluginRoot(root) {
152
+ const stable = stablePluginRootForStrayCopy(root);
153
+ if (stable) {
154
+ appendLog("backend.log", `[claude-smart] redirecting stray plugin copy under ~/.reflexio (${root}) to stable root ${stable}`);
155
+ return stable;
156
+ }
157
+ return root;
158
+ }
159
+
92
160
  function pluginRoot() {
93
161
  for (const value of [process.env.CLAUDE_PLUGIN_ROOT, process.env.PLUGIN_ROOT]) {
94
162
  if (value && fs.existsSync(path.join(value, "pyproject.toml"))) {
95
- return path.resolve(value);
163
+ return stablePluginRoot(path.resolve(value));
96
164
  }
97
165
  }
98
166
  const fromScript = path.resolve(__dirname, "..");
99
- if (fs.existsSync(path.join(fromScript, "pyproject.toml"))) return fromScript;
167
+ if (fs.existsSync(path.join(fromScript, "pyproject.toml"))) return stablePluginRoot(fromScript);
100
168
  const cacheRoot = path.join(HOME, ".codex", "plugins", "cache", "reflexioai", "claude-smart");
101
169
  try {
102
170
  const versions = fs
@@ -105,12 +173,12 @@ function pluginRoot() {
105
173
  .map((entry) => path.join(cacheRoot, entry.name))
106
174
  .sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
107
175
  for (const candidate of versions) {
108
- if (fs.existsSync(path.join(candidate, "pyproject.toml"))) return candidate;
176
+ if (fs.existsSync(path.join(candidate, "pyproject.toml"))) return stablePluginRoot(candidate);
109
177
  }
110
178
  } catch {
111
179
  // Fall through to the stable plugin-root link.
112
180
  }
113
- return path.join(REFLEXIO_DIR, "plugin-root");
181
+ return stablePluginRoot(path.join(REFLEXIO_DIR, "plugin-root"));
114
182
  }
115
183
 
116
184
  function prependRuntimePath() {
@@ -27,6 +27,7 @@ claude_smart_source_login_path
27
27
  claude_smart_prepend_node_bins
28
28
 
29
29
  PLUGIN_ROOT="$(cd "$HERE/.." && pwd)"
30
+ claude_smart_reexec_stable_plugin_root_if_needed "$PLUGIN_ROOT" "dashboard-build.sh" "$@"
30
31
  DASHBOARD_DIR="$PLUGIN_ROOT/dashboard"
31
32
 
32
33
  STATE_DIR="$HOME/.claude-smart"
@@ -29,6 +29,7 @@ CMD="${1:-start}"
29
29
  PORT=3001
30
30
 
31
31
  PLUGIN_ROOT="$(cd "$HERE/.." && pwd)"
32
+ claude_smart_reexec_stable_plugin_root_if_needed "$PLUGIN_ROOT" "dashboard-service.sh" "$@"
32
33
  DASHBOARD_DIR="$PLUGIN_ROOT/dashboard"
33
34
  WORKSPACE_CWD="${PWD:-}"
34
35
 
@@ -20,6 +20,7 @@ if [ ! -f "$TARGET/pyproject.toml" ]; then
20
20
  echo "[claude-smart] ensure-plugin-root: $TARGET is not a plugin dir (no pyproject.toml)" >&2
21
21
  exit 1
22
22
  fi
23
+ TARGET="$(cd "$TARGET" && pwd -P)"
23
24
 
24
25
  LINK="$HOME/.reflexio/plugin-root"
25
26
  mkdir -p "$(dirname "$LINK")"
@@ -3,8 +3,9 @@
3
3
  # CLAUDE_PLUGIN_ROOT points at the plugin dir (dev: <repo>/plugin;
4
4
  # installed: ~/.claude/plugins/cache/reflexioai/claude-smart/<version>),
5
5
  # which is also the Python project root with pyproject.toml + uv.lock.
6
- # We invoke via `uv run --project --no-sync` so the prepared env is used without
7
- # undoing editable Reflexio installs from local development.
6
+ # We invoke the prepared venv Python directly so hooks use the dependency set
7
+ # produced by smart-install.sh, including the vendored Reflexio snapshot it
8
+ # installs non-editably (--reinstall --no-deps).
8
9
  #
9
10
  # If the Setup hook recorded an install failure at
10
11
  # ~/.claude-smart/install-failed, short-circuit with a user-visible
@@ -46,6 +47,7 @@ claude_smart_prepend_astral_bins
46
47
  claude_smart_source_reflexio_env
47
48
 
48
49
  PLUGIN_ROOT="$(cd "$HERE/.." && pwd)"
50
+ claude_smart_reexec_stable_plugin_root_if_needed "$PLUGIN_ROOT" "hook_entry.sh" "$@"
49
51
 
50
52
  FAILURE_MARKER="$HOME/.claude-smart/install-failed"
51
53
  STATE_DIR="$HOME/.claude-smart"
@@ -134,4 +136,5 @@ if ! ensure_hook_package_importable; then
134
136
  fi
135
137
 
136
138
  # Stdin is the hook payload JSON — stream it through to the Python CLI.
137
- exec uv run --project "$PLUGIN_ROOT" --no-sync --quiet python -m claude_smart.hook "$HOST" "$EVENT"
139
+ PLUGIN_PYTHON="$(claude_smart_plugin_python "$PLUGIN_ROOT")"
140
+ exec "$PLUGIN_PYTHON" -m claude_smart.hook "$HOST" "$EVENT"
@@ -17,6 +17,7 @@ claude_smart_prepend_node_bins
17
17
  claude_smart_source_reflexio_env
18
18
 
19
19
  PLUGIN_ROOT="$(cd "$HERE/.." && pwd)"
20
+ claude_smart_reexec_stable_plugin_root_if_needed "$PLUGIN_ROOT" "smart-install.sh" "$@"
20
21
  REPO_ROOT="$(cd "$HERE/../.." && pwd)"
21
22
 
22
23
  MARKER_DIR="$HOME/.claude-smart"
@@ -141,12 +142,12 @@ install_vendored_reflexio() {
141
142
  fi
142
143
 
143
144
  echo "[claude-smart] installing bundled Reflexio source from $VENDORED_REFLEXIO" >&2
144
- if uv pip install --project "$PLUGIN_ROOT" --python "$PLUGIN_PYTHON" --quiet -e "$VENDORED_REFLEXIO" >&2; then
145
+ if uv pip install --project "$PLUGIN_ROOT" --python "$PLUGIN_PYTHON" --quiet --reinstall --no-deps "$VENDORED_REFLEXIO" >&2; then
145
146
  return 0
146
147
  fi
147
148
 
148
149
  echo "[claude-smart] warning: quiet vendored Reflexio install failed in $PLUGIN_ROOT; retrying with full output." >&2
149
- if ! uv pip install --project "$PLUGIN_ROOT" --python "$PLUGIN_PYTHON" -e "$VENDORED_REFLEXIO" >&2; then
150
+ if ! uv pip install --project "$PLUGIN_ROOT" --python "$PLUGIN_PYTHON" --reinstall --no-deps "$VENDORED_REFLEXIO" >&2; then
150
151
  write_failure "vendored Reflexio install failed in $PLUGIN_ROOT"
151
152
  fi
152
153
  }
@@ -0,0 +1,57 @@
1
+ # claude_smart (plugin/src)
2
+ Description: Python package powering the claude-smart plugin — hook handlers that buffer Claude Code / Codex session activity, publish it to a local Reflexio backend, and inject the learned skills/preferences back into future sessions.
3
+
4
+ > User-facing install/usage docs live in [`../README.md`](../README.md). This is the code map for the `claude_smart` package.
5
+
6
+ ## Main Entry Points
7
+
8
+ | File | Purpose |
9
+ |------|---------|
10
+ | `hook.py` | Hook dispatcher. Parses the stdin JSON payload and routes each event (Setup, SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, Stop, SessionEnd) to its handler in `events/`. |
11
+ | `cli.py` | `claude-smart` CLI: `install`, `uninstall`, `show`, `learn`, `restart`, `dashboard`, `clear-all`. |
12
+ | `state.py` | Per-session JSONL buffer at `~/.claude-smart/sessions/{session_id}.jsonl`; high-water mark for idempotent publish retries. |
13
+ | `publish.py` | Drains the session buffer, calls the Reflexio adapter, and stamps the watermark. Used by Stop, SessionEnd, and `learn`. |
14
+ | `reflexio_adapter.py` | Thin wrapper over `reflexio.ReflexioClient` — isolates import failures, 5s HTTP timeout, injects/queries learnings, degrades gracefully when the backend is down. |
15
+
16
+ ## Event Handlers (`events/`)
17
+
18
+ | Handler | Hook | Role |
19
+ |---------|------|------|
20
+ | `session_start.py` | SessionStart | Apply extraction defaults, render stall banner, push optimizer context. |
21
+ | `user_prompt.py` | UserPromptSubmit | Inject learned playbooks/preferences into context. |
22
+ | `pre_tool.py` | PreToolUse (Edit/Write/Bash/NotebookEdit) | Inject project-specific context before tool execution. |
23
+ | `post_tool.py` | PostToolUse | Buffer the tool invocation (name, input, response, duration) into session state. |
24
+ | `stop.py` | Stop | Publish unpublished interactions (force extraction if configured). |
25
+ | `session_end.py` | SessionEnd | Final publish + aggregation; optional backend/dashboard shutdown. |
26
+
27
+ ## Supporting Modules
28
+
29
+ | File | Purpose |
30
+ |------|---------|
31
+ | `env_config.py` | Parses `~/.reflexio/.env` (`REFLEXIO_URL`, `REFLEXIO_API_KEY`, `CLAUDE_SMART_READ_ONLY`, local embedding/CLI flags). |
32
+ | `runtime.py` | Host detection (Claude Code vs Codex); shared agent version. |
33
+ | `ids.py` | Session / project ID generation and resolution. |
34
+ | `context_inject.py`, `context_format.py`, `query_compose.py`, `cs_cite.py` | Build search queries, format learned skills as markdown, inject into context, format citations. |
35
+ | `stall_banner.py` | User-facing message when the Reflexio provider hits an auth/billing stall. |
36
+ | `optimizer_assistant.py` | Claude-code CLI agent that extracts Reflexio optimization hints. |
37
+ | `hook_log.py`, `internal_call.py` | Structured JSON logging to `~/.claude-smart/hook.log`; detect internal/test invocations to skip learning. |
38
+
39
+ ## Architecture
40
+
41
+ ```
42
+ SessionStart -> bootstrap Reflexio backend (8071) + Next.js dashboard (3001)
43
+ PostToolUse -> state.py buffers each tool call to ~/.claude-smart/sessions/{id}.jsonl
44
+ Stop/SessionEnd -> publish.py -> reflexio_adapter -> Reflexio extracts playbooks + preferences
45
+ UserPromptSubmit / PreToolUse -> context_inject pulls relevant learnings back into context
46
+ ```
47
+
48
+ - **Dual-host** — the same package runs under Claude Code (native slash commands) and Codex (shell-script fallbacks in `../scripts/`); host shape is normalized in `runtime.py`.
49
+ - **Offline-resilient** — if Reflexio is unreachable, interactions stay buffered and drain on the next successful publish.
50
+ - **Hooks registered** in `../hooks/hooks.json` (Claude Code) and `../hooks/codex-hooks.json` (Codex), dispatched through `../scripts/hook_entry.sh`.
51
+
52
+ ## Requirements / Problems to Avoid
53
+
54
+ - **All learned state is external to the repo** — sessions buffer under `~/.claude-smart/`, Reflexio state under `~/.reflexio/`. Don't write generated runtime artifacts inside the plugin root.
55
+ - **Backend lives at `http://localhost:8071`**, dashboard at `http://localhost:3001`; both are long-lived across sessions (no hard shutdown on SessionEnd by default).
56
+ - **`CLAUDE_SMART_READ_ONLY`** skips publishing entirely — respect it in any new publish path.
57
+ - **Keep handlers fast** — tool-use hooks run on a 10–15s timeout; heavy work belongs in the backend, not the hook.