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.
- package/.claude-plugin/marketplace.json +3 -3
- package/README.md +1 -1
- package/bin/claude-smart.js +2 -2
- package/package.json +9 -3
- package/plugin/.claude-plugin/plugin.json +9 -3
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/README.md +23 -3
- package/plugin/pyproject.toml +3 -3
- package/plugin/scripts/_lib.sh +91 -0
- package/plugin/scripts/backend-service.sh +51 -4
- package/plugin/scripts/cli.sh +3 -1
- package/plugin/scripts/codex-hook.js +72 -4
- package/plugin/scripts/dashboard-build.sh +1 -0
- package/plugin/scripts/dashboard-service.sh +1 -0
- package/plugin/scripts/ensure-plugin-root.sh +1 -0
- package/plugin/scripts/hook_entry.sh +6 -3
- package/plugin/scripts/smart-install.sh +3 -2
- package/plugin/src/README.md +57 -0
- package/plugin/src/claude_smart/context_format.py +11 -12
- package/plugin/src/claude_smart/cs_cite.py +26 -12
- package/plugin/src/claude_smart/ids.py +13 -5
- package/plugin/uv.lock +126 -5
- package/plugin/vendor/reflexio/.env.example +62 -0
- package/plugin/vendor/reflexio/LICENSE +201 -0
- package/plugin/vendor/reflexio/README.md +338 -0
- package/plugin/vendor/reflexio/pyproject.toml +274 -0
- package/plugin/vendor/reflexio/reflexio/README.md +184 -0
- package/plugin/vendor/reflexio/reflexio/__init__.py +166 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/__init__.py +1 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/README.md +109 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/__init__.py +1 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/backends.py +175 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/bench.py +642 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/embed_cache.py +330 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/report.py +317 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/results/report.md +43 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/results/results.json +4478 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/scenarios.py +134 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/seed.py +255 -0
- package/plugin/vendor/reflexio/reflexio/cli/README.md +287 -0
- package/plugin/vendor/reflexio/reflexio/cli/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/cli/__main__.py +56 -0
- package/plugin/vendor/reflexio/reflexio/cli/_client.py +86 -0
- package/plugin/vendor/reflexio/reflexio/cli/app.py +127 -0
- package/plugin/vendor/reflexio/reflexio/cli/bootstrap_config.py +265 -0
- package/plugin/vendor/reflexio/reflexio/cli/codex_auth.py +503 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/admin_cmd.py +65 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/agent_playbooks.py +503 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/api.py +114 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/auth.py +109 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/config_cmd.py +511 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/doctor.py +127 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/embeddings.py +53 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/interactions.py +478 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/profiles.py +303 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/services.py +289 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/setup_cmd.py +964 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/shortcuts.py +285 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/status_cmd.py +143 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/user_playbooks.py +373 -0
- package/plugin/vendor/reflexio/reflexio/cli/env_loader.py +284 -0
- package/plugin/vendor/reflexio/reflexio/cli/errors.py +217 -0
- package/plugin/vendor/reflexio/reflexio/cli/log_format.py +247 -0
- package/plugin/vendor/reflexio/reflexio/cli/output.py +867 -0
- package/plugin/vendor/reflexio/reflexio/cli/paths.py +41 -0
- package/plugin/vendor/reflexio/reflexio/cli/run_services.py +391 -0
- package/plugin/vendor/reflexio/reflexio/cli/state.py +204 -0
- package/plugin/vendor/reflexio/reflexio/cli/stop_services.py +96 -0
- package/plugin/vendor/reflexio/reflexio/cli/utils.py +329 -0
- package/plugin/vendor/reflexio/reflexio/client/__init__.py +3 -0
- package/plugin/vendor/reflexio/reflexio/client/cache.py +150 -0
- package/plugin/vendor/reflexio/reflexio/client/client.py +2613 -0
- package/plugin/vendor/reflexio/reflexio/defaults.py +23 -0
- package/plugin/vendor/reflexio/reflexio/integrations/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/.clawhubignore +7 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/README.md +274 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/TESTING.md +517 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/hook/handler.js +473 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package-lock.json +2156 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package.json +18 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/handler.ts +241 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/setup.ts +140 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/index.ts +130 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/publish.ts +113 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/search.ts +52 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/server.ts +103 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/sqlite-buffer.ts +156 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/user-id.ts +134 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/openclaw.plugin.json +41 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/package.json +17 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/rules/reflexio.md +24 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/reflexio/SKILL.md +48 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/publish_clawhub.sh +278 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/references/HOOK.md +164 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/install.sh +36 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/uninstall.sh +35 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/publish.test.ts +27 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/search.test.ts +31 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/server.test.ts +42 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/setup.test.ts +49 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/sqlite-buffer.test.ts +91 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/user-id.test.ts +50 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tsconfig.json +16 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/types/openclaw.d.ts +230 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/vitest.config.ts +13 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/README.md +120 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/TESTING.md +168 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/package-lock.json +1657 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/package.json +16 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/HEARTBEAT.md +6 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/README.md +84 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/SKILL.md +194 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/_meta.json +6 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/agents/reflexio-extractor.md +45 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/hook/handler.ts +214 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/hook/setup.ts +55 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/index.ts +327 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/consolidate.ts +233 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/dedup.ts +80 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/io.ts +155 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/openclaw-cli.ts +67 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/search.ts +33 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/write-playbook.ts +76 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/write-profile.ts +79 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/openclaw.plugin.json +46 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/package.json +18 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/README.md +36 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/full_consolidation.md +56 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/playbook_extraction.md +217 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/profile_extraction.md +132 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/skills/reflexio-consolidate/SKILL.md +33 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/skills/reflexio-embedded/SKILL.md +194 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/HOOK.md +18 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/architecture.md +49 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/comparison.md +31 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/future-work.md +47 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/porting-notes.md +52 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/scripts/install.sh +52 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/scripts/uninstall.sh +36 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/consolidate.test.ts +135 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/dedup.test.ts +104 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/io.test.ts +175 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/search.test.ts +66 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/smoke-test.ts +140 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/write-playbook.test.ts +93 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/write-profile.test.ts +174 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tsconfig.json +16 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/types/openclaw.d.ts +230 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/vitest.config.ts +7 -0
- package/plugin/vendor/reflexio/reflexio/lib/__init__.py +23 -0
- package/plugin/vendor/reflexio/reflexio/lib/_agent_playbook.py +310 -0
- package/plugin/vendor/reflexio/reflexio/lib/_base.py +225 -0
- package/plugin/vendor/reflexio/reflexio/lib/_config.py +83 -0
- package/plugin/vendor/reflexio/reflexio/lib/_dashboard.py +266 -0
- package/plugin/vendor/reflexio/reflexio/lib/_generation.py +176 -0
- package/plugin/vendor/reflexio/reflexio/lib/_interactions.py +334 -0
- package/plugin/vendor/reflexio/reflexio/lib/_operations.py +153 -0
- package/plugin/vendor/reflexio/reflexio/lib/_profiles.py +545 -0
- package/plugin/vendor/reflexio/reflexio/lib/_reflection.py +52 -0
- package/plugin/vendor/reflexio/reflexio/lib/_search.py +167 -0
- package/plugin/vendor/reflexio/reflexio/lib/_storage_labels.py +103 -0
- package/plugin/vendor/reflexio/reflexio/lib/_user_playbook.py +288 -0
- package/plugin/vendor/reflexio/reflexio/lib/reflexio_lib.py +27 -0
- package/plugin/vendor/reflexio/reflexio/models/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/braintrust_schema.py +141 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/common.py +41 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/__init__.py +3 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/entities.py +1112 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/enums.py +63 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/eval_overview_schema.py +487 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/internal_schema.py +28 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/pending_tool_call_schema.py +83 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/retriever_schema.py +768 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/service_schemas.py +9 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/stall_state_schema.py +32 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/__init__.py +3 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/converters.py +177 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/entities.py +129 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/enums.py +25 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/validators.py +333 -0
- package/plugin/vendor/reflexio/reflexio/models/config_schema.py +908 -0
- package/plugin/vendor/reflexio/reflexio/models/py.typed +0 -0
- package/plugin/vendor/reflexio/reflexio/server/OVERVIEW.md +90 -0
- package/plugin/vendor/reflexio/reflexio/server/README.md +622 -0
- package/plugin/vendor/reflexio/reflexio/server/__init__.py +210 -0
- package/plugin/vendor/reflexio/reflexio/server/__main__.py +132 -0
- package/plugin/vendor/reflexio/reflexio/server/_auth.py +25 -0
- package/plugin/vendor/reflexio/reflexio/server/api.py +2868 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/README.md +34 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/account_api.py +143 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/health_api.py +91 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/pending_tool_call_api.py +572 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/precondition_checks.py +66 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/publisher_api.py +562 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/request_context.py +50 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/stall_state_api.py +100 -0
- package/plugin/vendor/reflexio/reflexio/server/cache/__init__.py +15 -0
- package/plugin/vendor/reflexio/reflexio/server/cache/reflexio_cache.py +208 -0
- package/plugin/vendor/reflexio/reflexio/server/correlation.py +46 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/__init__.py +30 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/embedding_service.py +359 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/image_utils.py +55 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/litellm_client.py +1871 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/llm_utils.py +140 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/model_defaults.py +479 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/__init__.py +1 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/claude_code_provider.py +1122 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/claude_code_stream_parser.py +197 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/embedding_service_provider.py +338 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/local_embedding_provider.py +213 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/nomic_embedding_provider.py +288 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/rerank/__init__.py +6 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/rerank/cross_encoder_reranker.py +187 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/rerank/llm_reranker.py +148 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/tools.py +716 -0
- package/plugin/vendor/reflexio/reflexio/server/operation_limiter.py +179 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/_dispatchers.py +54 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/README.md +121 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/agent_success_evaluation/v1.0.0.prompt.md +58 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/agent_success_evaluation_with_comparison/v1.0.0.prompt.md +76 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/answer_synthesis/v1.5.2.prompt.md +88 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/compress_session_for_query/v1.3.0.prompt.md +31 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/document_expansion/v1.0.0.prompt.md +20 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.0.0.prompt.md +53 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.1.0.prompt.md +57 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.2.0.prompt.md +68 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.3.0.prompt.md +70 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.4.0.prompt.md +77 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.5.0.prompt.md +82 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.6.0.prompt.md +83 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.1.0.prompt.md +193 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.2.0.prompt.md +206 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.0.0-deprecated.prompt.md +66 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.0.0.prompt.md +43 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.1.0.prompt.md +46 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.0.0-deprecated.prompt.md +64 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.0.0.prompt.md +39 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.1.0.prompt.md +39 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.2.0.prompt.md +47 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.0.prompt.md +58 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.1.prompt.md +69 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.2.prompt.md +71 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.0.2.prompt.md +254 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.1.0.prompt.md +274 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.2.0.prompt.md +283 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.2.2.prompt.md +234 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.2.3.prompt.md +244 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v1.0.0.prompt.md +73 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v2.0.0.prompt.md +86 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.0.0.prompt.md +97 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.1.0.prompt.md +119 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.2.0.prompt.md +123 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.3.0.prompt.md +137 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.0.0.prompt.md +14 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.1.0.prompt.md +24 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.2.0.prompt.md +29 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.0.0.prompt.md +11 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.1.0.prompt.md +21 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.2.0.prompt.md +25 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.0.0.prompt.md +37 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.1.0.prompt.md +40 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.2.0.prompt.md +36 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v1.0.0.prompt.md +45 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v2.0.0.prompt.md +81 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v3.0.0.prompt.md +80 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate_expert/v1.0.0.prompt.md +34 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_deduplication/v1.0.0.prompt.md +116 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_should_generate/v1.0.0.prompt.md +33 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_should_generate_override/v1.0.0.prompt.md +16 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.0.0.prompt.md +140 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.1.0.prompt.md +160 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_main/v1.0.0.prompt.md +14 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/query_reformulation/v1.0.0.prompt.md +19 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/rerank_relevance/v1.1.0.prompt.md +44 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/shadow_comparison/v1.0.0.prompt.md +43 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/shadow_content_evaluation/v1.0.0.prompt.md +33 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_evaluation/prompt_evaluation_dataset/feedback_extraction_main_v1.jsonl +10 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_evaluation/prompt_evaluation_dataset/profile_update_main_v1.jsonl +10 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_manager.py +280 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_schema.py +11 -0
- package/plugin/vendor/reflexio/reflexio/server/services/README.md +58 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/_eval_health.py +131 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_constants.py +60 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_service.py +228 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_utils.py +87 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluator.py +372 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/delayed_group_evaluator.py +156 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/group_evaluation_runner.py +336 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/regen_jobs.py +471 -0
- package/plugin/vendor/reflexio/reflexio/server/services/base_generation_service.py +1668 -0
- package/plugin/vendor/reflexio/reflexio/server/services/braintrust/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/services/braintrust/_cron.py +196 -0
- package/plugin/vendor/reflexio/reflexio/server/services/braintrust/_encryption.py +101 -0
- package/plugin/vendor/reflexio/reflexio/server/services/braintrust/client.py +167 -0
- package/plugin/vendor/reflexio/reflexio/server/services/braintrust/service.py +281 -0
- package/plugin/vendor/reflexio/reflexio/server/services/configurator/base_configurator.py +179 -0
- package/plugin/vendor/reflexio/reflexio/server/services/configurator/config_storage.py +62 -0
- package/plugin/vendor/reflexio/reflexio/server/services/configurator/configurator.py +87 -0
- package/plugin/vendor/reflexio/reflexio/server/services/configurator/local_file_config_storage.py +187 -0
- package/plugin/vendor/reflexio/reflexio/server/services/configurator/test_config_storage.py +162 -0
- package/plugin/vendor/reflexio/reflexio/server/services/deduplication_utils.py +112 -0
- package/plugin/vendor/reflexio/reflexio/server/services/embedding_text.py +62 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/distribution.py +33 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/eval_sampler.py +126 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/group_aggregation.py +192 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/hero_state.py +75 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/rule_attribution.py +97 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/service.py +515 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/shadow_aggregation.py +90 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/agent_run_records.py +91 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/invariants.py +303 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/outcome.py +25 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/pending_tool_call_dispatch.py +358 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/plan.py +138 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/prior_answer_search.py +217 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/resumable_agent.py +535 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_scheduler.py +171 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_worker.py +779 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/tools.py +1125 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extractor_config_utils.py +94 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extractor_interaction_utils.py +251 -0
- package/plugin/vendor/reflexio/reflexio/server/services/generation_service.py +702 -0
- package/plugin/vendor/reflexio/reflexio/server/services/operation_state_utils.py +835 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/README.md +89 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_aggregator.py +1388 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_consolidator.py +1045 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_extractor.py +436 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_generation_service.py +808 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_service_constants.py +28 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_service_utils.py +362 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/__init__.py +24 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/assistant_webhook.py +246 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/gepa_adapter.py +291 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/judge.py +97 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/models.py +96 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/optimizer.py +645 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/rollout.py +35 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/scenario_resolver.py +93 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/scheduler.py +174 -0
- package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/__init__.py +26 -0
- package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/_document_expander.py +179 -0
- package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/_query_reformulator.py +297 -0
- package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_deduplicator.py +772 -0
- package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_extractor.py +462 -0
- package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_generation_service.py +737 -0
- package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_generation_service_utils.py +290 -0
- package/plugin/vendor/reflexio/reflexio/server/services/reflection/__init__.py +17 -0
- package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_extractor.py +247 -0
- package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_service.py +803 -0
- package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_service_utils.py +146 -0
- package/plugin/vendor/reflexio/reflexio/server/services/retrieval/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/services/retrieval/relevance_floor.py +80 -0
- package/plugin/vendor/reflexio/reflexio/server/services/search/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/services/service_utils.py +756 -0
- package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/__init__.py +1 -0
- package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/judge.py +184 -0
- package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/outcome.py +81 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/constants.py +2 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/error.py +11 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/retention.py +154 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/retention_mixin.py +155 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/__init__.py +59 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_agent_run.py +1298 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_base.py +1945 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_extras.py +600 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_operations.py +346 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_playbook.py +1378 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_profiles.py +747 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_requests.py +263 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_shadow_verdicts.py +193 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_share_links.py +166 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_stall_state.py +217 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/__init__.py +153 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_agent_run.py +384 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_base.py +71 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_extras.py +235 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_operations.py +170 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_playbook.py +677 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_profiles.py +250 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_requests.py +154 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_shadow_verdicts.py +130 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_share_links.py +93 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_stall_state.py +76 -0
- package/plugin/vendor/reflexio/reflexio/server/services/unified_search_service.py +572 -0
- package/plugin/vendor/reflexio/reflexio/server/site_var/README.md +77 -0
- package/plugin/vendor/reflexio/reflexio/server/site_var/feature_flags.py +116 -0
- package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_manager.py +263 -0
- package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/feature_flags.json +13 -0
- package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/llm_model_setting.json +7 -0
- package/plugin/vendor/reflexio/reflexio/server/tracing.py +158 -0
- package/plugin/vendor/reflexio/reflexio/server/usage_metrics.py +113 -0
- package/plugin/vendor/reflexio/reflexio/server/uvicorn_logging.py +76 -0
- package/plugin/vendor/reflexio/reflexio/test_support/__init__.py +1 -0
- package/plugin/vendor/reflexio/reflexio/test_support/llm_fixtures.py +62 -0
- package/plugin/vendor/reflexio/reflexio/test_support/llm_mock.py +242 -0
- package/plugin/vendor/reflexio/reflexio/test_support/llm_model_registry.py +129 -0
- 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.
|
|
12
|
+
"version": "0.2.44",
|
|
13
13
|
"source": "./plugin",
|
|
14
|
-
"description": "
|
|
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.
|
|
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">
|
package/bin/claude-smart.js
CHANGED
|
@@ -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", "-
|
|
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, "-
|
|
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.
|
|
4
|
-
"description": "Self-improving Claude Code plugin —
|
|
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
|
-
"
|
|
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.
|
|
4
|
-
"description": "Self-improving Claude Code plugin —
|
|
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
|
-
"
|
|
19
|
+
"self-improving-agents",
|
|
20
|
+
"skills",
|
|
15
21
|
"learning"
|
|
16
22
|
]
|
|
17
23
|
}
|
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
|
|
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
|
-
|
|
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
|
|
package/plugin/pyproject.toml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "claude-smart"
|
|
3
|
-
version = "0.2.
|
|
4
|
-
description = "Self-improving Claude Code plugin —
|
|
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.
|
|
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.
|
package/plugin/scripts/_lib.sh
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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;
|
package/plugin/scripts/cli.sh
CHANGED
|
@@ -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
|
-
|
|
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"
|
|
@@ -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
|
|
7
|
-
#
|
|
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
|
-
|
|
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 -
|
|
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" -
|
|
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.
|