code-muse 0.0.1__py3-none-any.whl
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.
- code_muse/__init__.py +26 -0
- code_muse/__main__.py +10 -0
- code_muse/agents/__init__.py +31 -0
- code_muse/agents/_builder.py +214 -0
- code_muse/agents/_compaction.py +506 -0
- code_muse/agents/_diagnostics.py +171 -0
- code_muse/agents/_history.py +382 -0
- code_muse/agents/_key_listeners.py +148 -0
- code_muse/agents/_non_streaming_render.py +148 -0
- code_muse/agents/_runtime.py +596 -0
- code_muse/agents/agent_creator_agent.py +603 -0
- code_muse/agents/agent_helios.py +47 -0
- code_muse/agents/agent_manager.py +740 -0
- code_muse/agents/agent_muse.py +78 -0
- code_muse/agents/agent_planning.py +44 -0
- code_muse/agents/agent_qa_melpomene.py +207 -0
- code_muse/agents/base_agent.py +194 -0
- code_muse/agents/event_stream_handler.py +361 -0
- code_muse/agents/json_agent.py +201 -0
- code_muse/agents/prompt_v3.py +521 -0
- code_muse/agents/subagent_stream_handler.py +273 -0
- code_muse/callbacks.py +941 -0
- code_muse/chatgpt_codex_client.py +333 -0
- code_muse/claude_cache_client.py +853 -0
- code_muse/cli_runner/__init__.py +319 -0
- code_muse/cli_runner/args.py +63 -0
- code_muse/cli_runner/loop.py +510 -0
- code_muse/cli_runner/resume.py +72 -0
- code_muse/cli_runner/runner.py +161 -0
- code_muse/command_line/__init__.py +1 -0
- code_muse/command_line/add_model_menu.py +1331 -0
- code_muse/command_line/agent_menu.py +674 -0
- code_muse/command_line/attachments.py +397 -0
- code_muse/command_line/autosave_menu.py +709 -0
- code_muse/command_line/clipboard.py +528 -0
- code_muse/command_line/colors_menu.py +530 -0
- code_muse/command_line/command_handler.py +262 -0
- code_muse/command_line/command_registry.py +150 -0
- code_muse/command_line/config_commands.py +711 -0
- code_muse/command_line/core_commands.py +740 -0
- code_muse/command_line/diff_menu.py +865 -0
- code_muse/command_line/file_path_completion.py +73 -0
- code_muse/command_line/load_context_completion.py +57 -0
- code_muse/command_line/model_picker_completion.py +512 -0
- code_muse/command_line/model_settings_menu.py +983 -0
- code_muse/command_line/onboarding_slides.py +162 -0
- code_muse/command_line/onboarding_wizard.py +337 -0
- code_muse/command_line/pagination.py +41 -0
- code_muse/command_line/pin_command_completion.py +329 -0
- code_muse/command_line/prompt_toolkit_completion.py +886 -0
- code_muse/command_line/session_commands.py +304 -0
- code_muse/command_line/shell_passthrough.py +145 -0
- code_muse/command_line/skills_completion.py +158 -0
- code_muse/command_line/types.py +18 -0
- code_muse/command_line/uc_menu.py +908 -0
- code_muse/command_line/utils.py +105 -0
- code_muse/command_line/wiggum_state.py +77 -0
- code_muse/config.py +1138 -0
- code_muse/config_agent.py +168 -0
- code_muse/config_appearance.py +241 -0
- code_muse/config_model.py +357 -0
- code_muse/config_security.py +73 -0
- code_muse/error_logging.py +132 -0
- code_muse/evals/__init__.py +35 -0
- code_muse/evals/eval_helpers.py +81 -0
- code_muse/evals/eval_runner.py +299 -0
- code_muse/evals/sample_evals/__init__.py +1 -0
- code_muse/evals/sample_evals/eval_frugal_reads.py +59 -0
- code_muse/evals/sample_evals/eval_memory_planning.py +31 -0
- code_muse/evals/sample_evals/eval_shell_efficiency.py +39 -0
- code_muse/evals/sample_evals/eval_tool_masking.py +33 -0
- code_muse/fs_scan_cache/__init__.py +31 -0
- code_muse/fs_scan_cache/invalidation_hooks.py +89 -0
- code_muse/fs_scan_cache/scan_cache_core.cpython-314-darwin.so +0 -0
- code_muse/fs_scan_cache/scan_cache_core.pyx +203 -0
- code_muse/fs_scan_cache/tool_integration.py +309 -0
- code_muse/fs_scan_cache/ttl_policy.py +44 -0
- code_muse/gemini_code_assist.py +383 -0
- code_muse/gemini_model.py +838 -0
- code_muse/hook_engine/README.md +105 -0
- code_muse/hook_engine/__init__.py +21 -0
- code_muse/hook_engine/aliases.py +153 -0
- code_muse/hook_engine/engine.py +221 -0
- code_muse/hook_engine/executor.py +347 -0
- code_muse/hook_engine/matcher.py +154 -0
- code_muse/hook_engine/models.py +245 -0
- code_muse/hook_engine/registry.py +114 -0
- code_muse/hook_engine/trust.py +268 -0
- code_muse/hook_engine/validator.py +144 -0
- code_muse/http_utils.py +360 -0
- code_muse/keymap.py +128 -0
- code_muse/list_filtering.py +26 -0
- code_muse/main.py +10 -0
- code_muse/messaging/__init__.py +259 -0
- code_muse/messaging/bus.py +621 -0
- code_muse/messaging/commands.py +166 -0
- code_muse/messaging/markdown_patches.py +57 -0
- code_muse/messaging/message_queue.py +397 -0
- code_muse/messaging/messages.py +591 -0
- code_muse/messaging/queue_console.py +269 -0
- code_muse/messaging/renderers.py +308 -0
- code_muse/messaging/rich_renderer.py +1158 -0
- code_muse/messaging/shimmer.py +154 -0
- code_muse/messaging/spinner/__init__.py +87 -0
- code_muse/messaging/spinner/console_spinner.py +250 -0
- code_muse/messaging/spinner/spinner_base.py +82 -0
- code_muse/messaging/subagent_console.py +458 -0
- code_muse/model_factory.py +1203 -0
- code_muse/model_switching.py +59 -0
- code_muse/model_utils.py +156 -0
- code_muse/models.json +66 -0
- code_muse/models_cache/__init__.py +26 -0
- code_muse/models_cache/blocking_lru_cache.py +98 -0
- code_muse/models_cache/cache_writer.py +86 -0
- code_muse/models_cache/sha256_hash.cpython-314-darwin.so +0 -0
- code_muse/models_cache/sha256_hash.pyx +34 -0
- code_muse/models_cache/startup_integration.py +75 -0
- code_muse/models_dev_api.json +1 -0
- code_muse/models_dev_parser.py +590 -0
- code_muse/motion.py +126 -0
- code_muse/plugins/__init__.py +471 -0
- code_muse/plugins/agent_skills/__init__.py +32 -0
- code_muse/plugins/agent_skills/config.py +176 -0
- code_muse/plugins/agent_skills/discovery.py +309 -0
- code_muse/plugins/agent_skills/downloader.py +389 -0
- code_muse/plugins/agent_skills/installer.py +19 -0
- code_muse/plugins/agent_skills/metadata.py +293 -0
- code_muse/plugins/agent_skills/prompt_builder.py +66 -0
- code_muse/plugins/agent_skills/register_callbacks.py +298 -0
- code_muse/plugins/agent_skills/remote_catalog.py +320 -0
- code_muse/plugins/agent_skills/skill_catalog.py +254 -0
- code_muse/plugins/agent_skills/skills_install_menu.py +690 -0
- code_muse/plugins/agent_skills/skills_menu.py +791 -0
- code_muse/plugins/autonomous_memory/__init__.py +39 -0
- code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-darwin.so +0 -0
- code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/plugins/autonomous_memory/bm25_scorer.pyx +291 -0
- code_muse/plugins/autonomous_memory/consolidation.py +82 -0
- code_muse/plugins/autonomous_memory/extraction.py +382 -0
- code_muse/plugins/autonomous_memory/lease_lock.py +105 -0
- code_muse/plugins/autonomous_memory/memory_injection.py +59 -0
- code_muse/plugins/autonomous_memory/register_callbacks.py +268 -0
- code_muse/plugins/autonomous_memory/secret_scanner.py +62 -0
- code_muse/plugins/autonomous_memory/session_scanner.py +163 -0
- code_muse/plugins/aws_bedrock/__init__.py +14 -0
- code_muse/plugins/aws_bedrock/config.py +99 -0
- code_muse/plugins/aws_bedrock/register_callbacks.py +241 -0
- code_muse/plugins/aws_bedrock/utils.py +153 -0
- code_muse/plugins/azure_foundry/README.md +238 -0
- code_muse/plugins/azure_foundry/__init__.py +15 -0
- code_muse/plugins/azure_foundry/config.py +125 -0
- code_muse/plugins/azure_foundry/discovery.py +187 -0
- code_muse/plugins/azure_foundry/register_callbacks.py +495 -0
- code_muse/plugins/azure_foundry/token.py +180 -0
- code_muse/plugins/azure_foundry/utils.py +345 -0
- code_muse/plugins/build_filter/__init__.py +1 -0
- code_muse/plugins/build_filter/register_callbacks.py +201 -0
- code_muse/plugins/build_filter/strategies/__init__.py +1 -0
- code_muse/plugins/build_filter/strategies/build.py +397 -0
- code_muse/plugins/chatgpt_oauth/__init__.py +6 -0
- code_muse/plugins/chatgpt_oauth/config.py +52 -0
- code_muse/plugins/chatgpt_oauth/oauth_flow.py +338 -0
- code_muse/plugins/chatgpt_oauth/register_callbacks.py +172 -0
- code_muse/plugins/chatgpt_oauth/test_plugin.py +301 -0
- code_muse/plugins/chatgpt_oauth/utils.py +538 -0
- code_muse/plugins/checkpointing/__init__.py +29 -0
- code_muse/plugins/checkpointing/checkpoint_hook.py +51 -0
- code_muse/plugins/checkpointing/conversation_snapshots.py +117 -0
- code_muse/plugins/checkpointing/register_callbacks.py +51 -0
- code_muse/plugins/checkpointing/restore_command.py +263 -0
- code_muse/plugins/checkpointing/rewind_shortcut.py +88 -0
- code_muse/plugins/checkpointing/shadow_git.py +90 -0
- code_muse/plugins/claude_code_hooks/__init__.py +1 -0
- code_muse/plugins/claude_code_hooks/config.py +188 -0
- code_muse/plugins/claude_code_hooks/register_callbacks.py +208 -0
- code_muse/plugins/claude_code_oauth/README.md +167 -0
- code_muse/plugins/claude_code_oauth/SETUP.md +93 -0
- code_muse/plugins/claude_code_oauth/__init__.py +25 -0
- code_muse/plugins/claude_code_oauth/config.py +52 -0
- code_muse/plugins/claude_code_oauth/fast_mode.py +124 -0
- code_muse/plugins/claude_code_oauth/prompt_handler.py +63 -0
- code_muse/plugins/claude_code_oauth/register_callbacks.py +547 -0
- code_muse/plugins/claude_code_oauth/test_fast_mode.py +165 -0
- code_muse/plugins/claude_code_oauth/test_plugin.py +283 -0
- code_muse/plugins/claude_code_oauth/token_refresh_heartbeat.py +237 -0
- code_muse/plugins/claude_code_oauth/utils.py +664 -0
- code_muse/plugins/copilot_auth/__init__.py +11 -0
- code_muse/plugins/copilot_auth/config.py +91 -0
- code_muse/plugins/copilot_auth/reasoning_client.py +409 -0
- code_muse/plugins/copilot_auth/register_callbacks.py +461 -0
- code_muse/plugins/copilot_auth/utils.py +584 -0
- code_muse/plugins/custom_commands/__init__.py +14 -0
- code_muse/plugins/custom_commands/args_injection.py +82 -0
- code_muse/plugins/custom_commands/command_discovery.py +89 -0
- code_muse/plugins/custom_commands/command_toml_schema.py +71 -0
- code_muse/plugins/custom_commands/register_callbacks.py +176 -0
- code_muse/plugins/customizable_commands/__init__.py +0 -0
- code_muse/plugins/customizable_commands/register_callbacks.py +136 -0
- code_muse/plugins/destructive_command_guard/__init__.py +14 -0
- code_muse/plugins/destructive_command_guard/detector.py +375 -0
- code_muse/plugins/destructive_command_guard/register_callbacks.py +148 -0
- code_muse/plugins/example_custom_command/README.md +280 -0
- code_muse/plugins/example_custom_command/register_callbacks.py +51 -0
- code_muse/plugins/file_permission_handler/__init__.py +4 -0
- code_muse/plugins/file_permission_handler/register_callbacks.py +441 -0
- code_muse/plugins/filter_engine/__init__.py +30 -0
- code_muse/plugins/filter_engine/classifier.py +153 -0
- code_muse/plugins/filter_engine/content_detector.py +184 -0
- code_muse/plugins/filter_engine/dispatcher.py +244 -0
- code_muse/plugins/filter_engine/register_callbacks.py +188 -0
- code_muse/plugins/filter_engine/registry.py +279 -0
- code_muse/plugins/filter_engine/strategies/__init__.py +8 -0
- code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/plugins/filter_engine/strategies/ast_compressor.pyx +348 -0
- code_muse/plugins/filter_engine/strategies/ast_parser.py +167 -0
- code_muse/plugins/filter_engine/strategies/code.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/code.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/plugins/filter_engine/strategies/code.pyx +584 -0
- code_muse/plugins/filter_engine/strategies/git.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/git.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/plugins/filter_engine/strategies/git.pyx +438 -0
- code_muse/plugins/filter_engine/strategies/json_compressor.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/json_compressor.pyx +253 -0
- code_muse/plugins/filter_engine/strategies/json_patterns.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/json_patterns.pyx +178 -0
- code_muse/plugins/filter_engine/strategies/lint.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/lint.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/plugins/filter_engine/strategies/lint.pyx +626 -0
- code_muse/plugins/filter_engine/strategies/test.cpython-314-darwin.so +0 -0
- code_muse/plugins/filter_engine/strategies/test.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/plugins/filter_engine/strategies/test.pyx +431 -0
- code_muse/plugins/filter_engine/verbosity.py +63 -0
- code_muse/plugins/force_push_guard/__init__.py +5 -0
- code_muse/plugins/force_push_guard/detector.py +96 -0
- code_muse/plugins/force_push_guard/register_callbacks.py +144 -0
- code_muse/plugins/force_push_guard/test_detector.py +143 -0
- code_muse/plugins/frontend_emitter/__init__.py +25 -0
- code_muse/plugins/frontend_emitter/emitter.py +121 -0
- code_muse/plugins/frontend_emitter/register_callbacks.py +259 -0
- code_muse/plugins/gac/__init__.py +4 -0
- code_muse/plugins/gac/git_ops.py +136 -0
- code_muse/plugins/gac/prompt.py +191 -0
- code_muse/plugins/gac/register_callbacks.py +82 -0
- code_muse/plugins/hook_creator/__init__.py +1 -0
- code_muse/plugins/hook_creator/register_callbacks.py +34 -0
- code_muse/plugins/hook_manager/__init__.py +1 -0
- code_muse/plugins/hook_manager/config.py +289 -0
- code_muse/plugins/hook_manager/hooks_menu.py +563 -0
- code_muse/plugins/hook_manager/register_callbacks.py +227 -0
- code_muse/plugins/hook_monitor/register_callbacks.py +36 -0
- code_muse/plugins/mindpack/__init__.py +0 -0
- code_muse/plugins/mindpack/factory.py +930 -0
- code_muse/plugins/mindpack/judge.py +573 -0
- code_muse/plugins/mindpack/memory.py +100 -0
- code_muse/plugins/mindpack/mindpack_menu.py +1552 -0
- code_muse/plugins/mindpack/orchestration.py +605 -0
- code_muse/plugins/mindpack/register_callbacks.py +175 -0
- code_muse/plugins/mindpack/schemas.py +358 -0
- code_muse/plugins/mindpack/tools.py +387 -0
- code_muse/plugins/oauth_muse_html.py +226 -0
- code_muse/plugins/ollama_setup/__init__.py +5 -0
- code_muse/plugins/ollama_setup/completer.py +36 -0
- code_muse/plugins/ollama_setup/register_callbacks.py +410 -0
- code_muse/plugins/plan_command/__init__.py +0 -0
- code_muse/plugins/plan_command/register_callbacks.py +206 -0
- code_muse/plugins/plan_mode/__init__.py +37 -0
- code_muse/plugins/plan_mode/mode_cycling.py +40 -0
- code_muse/plugins/plan_mode/plan_generation.py +68 -0
- code_muse/plugins/plan_mode/plan_hooks.py +74 -0
- code_muse/plugins/plan_mode/plan_mode_tools.py +138 -0
- code_muse/plugins/plan_mode/register_callbacks.py +121 -0
- code_muse/plugins/plugin_trust/register_callbacks.py +140 -0
- code_muse/plugins/policy_engine/__init__.py +46 -0
- code_muse/plugins/policy_engine/approval_flow_integration.py +59 -0
- code_muse/plugins/policy_engine/policy_evaluator.py +75 -0
- code_muse/plugins/policy_engine/policy_file_discovery.py +90 -0
- code_muse/plugins/policy_engine/policy_toml_schema.py +115 -0
- code_muse/plugins/policy_engine/register_callbacks.py +112 -0
- code_muse/plugins/pop_command/__init__.py +1 -0
- code_muse/plugins/pop_command/register_callbacks.py +189 -0
- code_muse/plugins/prompt_newline/__init__.py +13 -0
- code_muse/plugins/prompt_newline/config.py +19 -0
- code_muse/plugins/prompt_newline/register_callbacks.py +159 -0
- code_muse/plugins/safety_status/__init__.py +0 -0
- code_muse/plugins/safety_status/register_callbacks.py +113 -0
- code_muse/plugins/semantic_compression/__init__.py +6 -0
- code_muse/plugins/semantic_compression/compressor.py +295 -0
- code_muse/plugins/semantic_compression/config.py +123 -0
- code_muse/plugins/semantic_compression/register_callbacks.py +320 -0
- code_muse/plugins/shell_minimizer/__init__.py +50 -0
- code_muse/plugins/shell_minimizer/builtin_filters.toml +393 -0
- code_muse/plugins/shell_minimizer/pipeline.py +556 -0
- code_muse/plugins/shell_minimizer/primitives.py +482 -0
- code_muse/plugins/shell_minimizer/register_callbacks.py +276 -0
- code_muse/plugins/shell_safety/__init__.py +6 -0
- code_muse/plugins/shell_safety/agent_shell_safety.py +69 -0
- code_muse/plugins/shell_safety/command_cache.py +149 -0
- code_muse/plugins/shell_safety/register_callbacks.py +202 -0
- code_muse/plugins/synthetic_status/__init__.py +1 -0
- code_muse/plugins/synthetic_status/register_callbacks.py +128 -0
- code_muse/plugins/synthetic_status/status_api.py +145 -0
- code_muse/plugins/token_caching/__init__.py +21 -0
- code_muse/plugins/token_caching/cache_hit_tracking.py +128 -0
- code_muse/plugins/token_caching/cacheable_prefix_detection.py +28 -0
- code_muse/plugins/token_caching/register_callbacks.py +54 -0
- code_muse/plugins/token_caching/stats_display.py +35 -0
- code_muse/plugins/token_tracking/__init__.py +26 -0
- code_muse/plugins/token_tracking/database.py +381 -0
- code_muse/plugins/token_tracking/edit_analyzer.py +97 -0
- code_muse/plugins/token_tracking/record.py +55 -0
- code_muse/plugins/token_tracking/register_callbacks.py +277 -0
- code_muse/plugins/token_tracking/reports.py +329 -0
- code_muse/plugins/universal_constructor/__init__.py +13 -0
- code_muse/plugins/universal_constructor/models.py +136 -0
- code_muse/plugins/universal_constructor/register_callbacks.py +47 -0
- code_muse/plugins/universal_constructor/registry.py +390 -0
- code_muse/plugins/universal_constructor/runner.py +474 -0
- code_muse/plugins/universal_constructor/safety.py +440 -0
- code_muse/plugins/universal_constructor/sandbox.py +584 -0
- code_muse/provider_identity.py +105 -0
- code_muse/pydantic_patches.py +410 -0
- code_muse/reopenable_async_client.py +233 -0
- code_muse/round_robin_model.py +151 -0
- code_muse/secret_storage.py +74 -0
- code_muse/security/__init__.py +1 -0
- code_muse/security/redaction.cpython-314-darwin.so +0 -0
- code_muse/security/redaction.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/security/redaction.pyx +135 -0
- code_muse/session_storage.py +565 -0
- code_muse/status_display.py +261 -0
- code_muse/stream_parser/__init__.py +76 -0
- code_muse/stream_parser/assistant_text_parser.py +90 -0
- code_muse/stream_parser/citation_parser.py +76 -0
- code_muse/stream_parser/inline_hidden_tag_parser.py +236 -0
- code_muse/stream_parser/proposed_plan_parser.py +158 -0
- code_muse/stream_parser/stream_text_chunk.py +23 -0
- code_muse/stream_parser/stream_text_parser.py +27 -0
- code_muse/stream_parser/tagged_line_parser.cpython-314-darwin.so +0 -0
- code_muse/stream_parser/tagged_line_parser.pyx +251 -0
- code_muse/stream_parser/utf8_stream_parser.cpython-314-darwin.so +0 -0
- code_muse/stream_parser/utf8_stream_parser.pyx +206 -0
- code_muse/summarization_agent.py +308 -0
- code_muse/terminal_utils.cpython-314-darwin.so +0 -0
- code_muse/terminal_utils.cpython-314-x86_64-linux-gnu.so +0 -0
- code_muse/terminal_utils.pyx +483 -0
- code_muse/tools/__init__.py +459 -0
- code_muse/tools/agent_tools.py +613 -0
- code_muse/tools/ask_user_question/__init__.py +26 -0
- code_muse/tools/ask_user_question/constants.py +73 -0
- code_muse/tools/ask_user_question/demo_tui.py +55 -0
- code_muse/tools/ask_user_question/handler.py +232 -0
- code_muse/tools/ask_user_question/models.py +302 -0
- code_muse/tools/ask_user_question/registration.py +37 -0
- code_muse/tools/ask_user_question/renderers.py +336 -0
- code_muse/tools/ask_user_question/terminal_ui.py +327 -0
- code_muse/tools/ask_user_question/theme.py +156 -0
- code_muse/tools/ask_user_question/tui_loop.py +422 -0
- code_muse/tools/background_jobs.py +99 -0
- code_muse/tools/browser/__init__.py +37 -0
- code_muse/tools/browser/browser_control.py +289 -0
- code_muse/tools/browser/browser_interactions.py +545 -0
- code_muse/tools/browser/browser_locators.py +640 -0
- code_muse/tools/browser/browser_manager.py +376 -0
- code_muse/tools/browser/browser_navigation.py +251 -0
- code_muse/tools/browser/browser_screenshot.py +180 -0
- code_muse/tools/browser/browser_scripts.py +462 -0
- code_muse/tools/browser/browser_workflows.py +222 -0
- code_muse/tools/chrome_cdp/__init__.py +1070 -0
- code_muse/tools/chrome_cdp/register_callbacks.py +61 -0
- code_muse/tools/command_runner.py +1401 -0
- code_muse/tools/common.py +1407 -0
- code_muse/tools/display.py +87 -0
- code_muse/tools/file_modifications.py +1099 -0
- code_muse/tools/file_operations.py +860 -0
- code_muse/tools/image_tools.py +185 -0
- code_muse/tools/meetin_proxy/__init__.py +243 -0
- code_muse/tools/meetin_proxy/capture_addon.py +82 -0
- code_muse/tools/meetin_proxy/proxy_manager.py +326 -0
- code_muse/tools/meetin_proxy/register_callbacks.py +45 -0
- code_muse/tools/path_policy.py +219 -0
- code_muse/tools/skills_tools.py +586 -0
- code_muse/tools/subagent_context.py +158 -0
- code_muse/tools/tools_content.py +50 -0
- code_muse/tools/universal_constructor.py +965 -0
- code_muse/uvx_detection.py +241 -0
- code_muse/version_checker.py +86 -0
- code_muse-0.0.1.data/data/code_muse/models.json +66 -0
- code_muse-0.0.1.data/data/code_muse/models_dev_api.json +1 -0
- code_muse-0.0.1.dist-info/METADATA +845 -0
- code_muse-0.0.1.dist-info/RECORD +394 -0
- code_muse-0.0.1.dist-info/WHEEL +4 -0
- code_muse-0.0.1.dist-info/entry_points.txt +2 -0
- code_muse-0.0.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
# Import to trigger command registration
|
|
2
|
+
import contextlib
|
|
3
|
+
|
|
4
|
+
import code_muse.command_line.config_commands # noqa: F401
|
|
5
|
+
import code_muse.command_line.core_commands # noqa: F401
|
|
6
|
+
import code_muse.command_line.session_commands # noqa: F401
|
|
7
|
+
import code_muse.command_line.uc_menu # noqa: F401
|
|
8
|
+
|
|
9
|
+
# Global flag to track if plugins have been loaded
|
|
10
|
+
_PLUGINS_LOADED = False
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def get_commands_help():
|
|
14
|
+
"""Generate aligned commands help using Rich Text for safe markup.
|
|
15
|
+
|
|
16
|
+
Now dynamically generates help from the command registry!
|
|
17
|
+
Only shows two sections: Built-in Commands and Custom Commands.
|
|
18
|
+
"""
|
|
19
|
+
from rich.text import Text
|
|
20
|
+
|
|
21
|
+
from code_muse.command_line.command_registry import get_unique_commands
|
|
22
|
+
|
|
23
|
+
# Ensure plugins are loaded so custom help can register
|
|
24
|
+
_ensure_plugins_loaded()
|
|
25
|
+
|
|
26
|
+
lines: list[Text] = []
|
|
27
|
+
# No global header needed - user already knows they're viewing help
|
|
28
|
+
|
|
29
|
+
# Collect all built-in commands (registered + legacy)
|
|
30
|
+
builtin_cmds: list[tuple[str, str]] = []
|
|
31
|
+
|
|
32
|
+
# Get registered commands (all categories are built-in)
|
|
33
|
+
registered_commands = get_unique_commands()
|
|
34
|
+
for cmd_info in sorted(registered_commands, key=lambda c: c.name):
|
|
35
|
+
builtin_cmds.append((cmd_info.usage, cmd_info.description))
|
|
36
|
+
|
|
37
|
+
# Get custom commands from plugins
|
|
38
|
+
custom_entries: list[tuple[str, str]] = []
|
|
39
|
+
try:
|
|
40
|
+
from code_muse import callbacks
|
|
41
|
+
|
|
42
|
+
custom_help_results = callbacks.on_custom_command_help()
|
|
43
|
+
for res in custom_help_results:
|
|
44
|
+
if not res:
|
|
45
|
+
continue
|
|
46
|
+
# Format 1: Tuple with (command_name, description)
|
|
47
|
+
if isinstance(res, tuple) and len(res) == 2:
|
|
48
|
+
cmd_name = str(res[0])
|
|
49
|
+
custom_entries.append((f"/{cmd_name}", str(res[1])))
|
|
50
|
+
# Format 2: List of tuples or strings
|
|
51
|
+
elif isinstance(res, list):
|
|
52
|
+
# Check if it's a list of tuples (preferred format)
|
|
53
|
+
if res and isinstance(res[0], tuple) and len(res[0]) == 2:
|
|
54
|
+
for item in res:
|
|
55
|
+
if isinstance(item, tuple) and len(item) == 2:
|
|
56
|
+
cmd_name = str(item[0])
|
|
57
|
+
custom_entries.append((f"/{cmd_name}", str(item[1])))
|
|
58
|
+
# Format 3: List of strings (legacy format)
|
|
59
|
+
# Extract command from first line like "/command_name - Description"
|
|
60
|
+
elif res and isinstance(res[0], str) and res[0].startswith("/"):
|
|
61
|
+
first_line = res[0]
|
|
62
|
+
if " - " in first_line:
|
|
63
|
+
parts = first_line.split(" - ", 1)
|
|
64
|
+
cmd_name = parts[0].lstrip("/").strip()
|
|
65
|
+
description = parts[1].strip()
|
|
66
|
+
custom_entries.append((f"/{cmd_name}", description))
|
|
67
|
+
except Exception:
|
|
68
|
+
pass
|
|
69
|
+
|
|
70
|
+
# Calculate global column width (longest command across ALL sections + padding)
|
|
71
|
+
all_commands = builtin_cmds + custom_entries
|
|
72
|
+
if all_commands:
|
|
73
|
+
max_cmd_width = max(len(cmd) for cmd, _ in all_commands)
|
|
74
|
+
column_width = max_cmd_width + 4 # Add 4 spaces padding
|
|
75
|
+
else:
|
|
76
|
+
column_width = 30
|
|
77
|
+
|
|
78
|
+
# Maximum description width before truncation (to prevent line wrapping)
|
|
79
|
+
max_desc_width = 80
|
|
80
|
+
|
|
81
|
+
def truncate_desc(desc: str, max_width: int) -> str:
|
|
82
|
+
"""Truncate description if too long, add ellipsis."""
|
|
83
|
+
if len(desc) <= max_width:
|
|
84
|
+
return desc
|
|
85
|
+
return desc[: max_width - 3] + "..."
|
|
86
|
+
|
|
87
|
+
# Display Built-in Commands section (starts immediately, no blank line)
|
|
88
|
+
lines.append(Text("Built-in Commands", style="bold magenta"))
|
|
89
|
+
for cmd, desc in sorted(builtin_cmds, key=lambda x: x[0]):
|
|
90
|
+
truncated_desc = truncate_desc(desc, max_desc_width)
|
|
91
|
+
left = Text(cmd.ljust(column_width), style="cyan")
|
|
92
|
+
right = Text(truncated_desc)
|
|
93
|
+
line = Text()
|
|
94
|
+
line.append_text(left)
|
|
95
|
+
line.append_text(right)
|
|
96
|
+
lines.append(line)
|
|
97
|
+
|
|
98
|
+
# Display Custom Commands section (if any)
|
|
99
|
+
if custom_entries:
|
|
100
|
+
lines.append(Text(""))
|
|
101
|
+
lines.append(Text("Custom Commands", style="bold magenta"))
|
|
102
|
+
for cmd, desc in sorted(custom_entries, key=lambda x: x[0]):
|
|
103
|
+
truncated_desc = truncate_desc(desc, max_desc_width)
|
|
104
|
+
left = Text(cmd.ljust(column_width), style="cyan")
|
|
105
|
+
right = Text(truncated_desc)
|
|
106
|
+
line = Text()
|
|
107
|
+
line.append_text(left)
|
|
108
|
+
line.append_text(right)
|
|
109
|
+
lines.append(line)
|
|
110
|
+
|
|
111
|
+
# Display Shell Pass-through section
|
|
112
|
+
lines.append(Text(""))
|
|
113
|
+
lines.append(Text("Shell Pass-through", style="bold magenta"))
|
|
114
|
+
shell_left = Text("!<command>".ljust(column_width), style="cyan")
|
|
115
|
+
shell_right = Text("Run a shell command directly (e.g., !git status)")
|
|
116
|
+
shell_line = Text()
|
|
117
|
+
shell_line.append_text(shell_left)
|
|
118
|
+
shell_line.append_text(shell_right)
|
|
119
|
+
lines.append(shell_line)
|
|
120
|
+
|
|
121
|
+
final_text = Text()
|
|
122
|
+
for i, line in enumerate(lines):
|
|
123
|
+
if i > 0:
|
|
124
|
+
final_text.append("\n")
|
|
125
|
+
final_text.append_text(line)
|
|
126
|
+
|
|
127
|
+
# Add trailing newline for spacing before next prompt
|
|
128
|
+
final_text.append("\n")
|
|
129
|
+
|
|
130
|
+
return final_text
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
# ============================================================================
|
|
134
|
+
# IMPORT BUILT-IN COMMAND HANDLERS
|
|
135
|
+
# ============================================================================
|
|
136
|
+
# All built-in command handlers have been split into category-specific files.
|
|
137
|
+
# These imports trigger their registration via @register_command decorators.
|
|
138
|
+
|
|
139
|
+
# ============================================================================
|
|
140
|
+
# UTILITY FUNCTIONS
|
|
141
|
+
# ============================================================================
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def _ensure_plugins_loaded() -> None:
|
|
145
|
+
global _PLUGINS_LOADED
|
|
146
|
+
if _PLUGINS_LOADED:
|
|
147
|
+
return
|
|
148
|
+
try:
|
|
149
|
+
from code_muse import plugins
|
|
150
|
+
|
|
151
|
+
plugins.load_plugin_callbacks()
|
|
152
|
+
_PLUGINS_LOADED = True
|
|
153
|
+
except Exception as e:
|
|
154
|
+
# If plugins fail to load, continue gracefully but note it
|
|
155
|
+
try:
|
|
156
|
+
from code_muse.messaging import emit_warning
|
|
157
|
+
|
|
158
|
+
emit_warning(f"Plugin load error: {e}")
|
|
159
|
+
except Exception:
|
|
160
|
+
pass
|
|
161
|
+
_PLUGINS_LOADED = True
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
# All command handlers moved to builtin_commands.py
|
|
165
|
+
# The import above triggers their registration
|
|
166
|
+
|
|
167
|
+
# ============================================================================
|
|
168
|
+
# MAIN COMMAND DISPATCHER
|
|
169
|
+
# ============================================================================
|
|
170
|
+
|
|
171
|
+
# _show_color_options has been moved to builtin_commands.py
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def handle_command(command: str):
|
|
175
|
+
"""
|
|
176
|
+
Handle commands prefixed with '/'.
|
|
177
|
+
|
|
178
|
+
Args:
|
|
179
|
+
command: The command string to handle
|
|
180
|
+
|
|
181
|
+
Returns:
|
|
182
|
+
True if the command was handled, False if not, or a string to be processed as user input
|
|
183
|
+
"""
|
|
184
|
+
from rich.text import Text
|
|
185
|
+
|
|
186
|
+
from code_muse.command_line.command_registry import get_command
|
|
187
|
+
from code_muse.messaging import emit_info, emit_warning
|
|
188
|
+
|
|
189
|
+
_ensure_plugins_loaded()
|
|
190
|
+
|
|
191
|
+
command = command.strip()
|
|
192
|
+
|
|
193
|
+
# Check if this is a registered command
|
|
194
|
+
if command.startswith("/"):
|
|
195
|
+
# Extract command name (first word after /)
|
|
196
|
+
cmd_name = command[1:].split()[0] if len(command) > 1 else ""
|
|
197
|
+
|
|
198
|
+
# Try to find in registry
|
|
199
|
+
cmd_info = get_command(cmd_name)
|
|
200
|
+
if cmd_info:
|
|
201
|
+
# Execute the registered handler
|
|
202
|
+
return cmd_info.handler(command)
|
|
203
|
+
|
|
204
|
+
# Try plugin-provided custom commands before unknown warning
|
|
205
|
+
if command.startswith("/"):
|
|
206
|
+
# Extract command name without leading slash and arguments intact
|
|
207
|
+
name = command[1:].split()[0] if len(command) > 1 else ""
|
|
208
|
+
try:
|
|
209
|
+
from code_muse import callbacks
|
|
210
|
+
|
|
211
|
+
# Import the special result classes for custom commands
|
|
212
|
+
from code_muse.command_line.types import MarkdownCommandResult
|
|
213
|
+
|
|
214
|
+
try:
|
|
215
|
+
from code_muse.plugins.custom_commands.register_callbacks import (
|
|
216
|
+
CustomCommandResult,
|
|
217
|
+
)
|
|
218
|
+
except ImportError:
|
|
219
|
+
CustomCommandResult = None
|
|
220
|
+
|
|
221
|
+
results = callbacks.on_custom_command(command=command, name=name)
|
|
222
|
+
# Iterate through callback results; treat str as handled (no model run)
|
|
223
|
+
for res in results:
|
|
224
|
+
if res is True:
|
|
225
|
+
return True
|
|
226
|
+
if isinstance(res, MarkdownCommandResult):
|
|
227
|
+
# Special case: markdown command that should be processed as input
|
|
228
|
+
# Replace the command with the markdown content and let it be processed
|
|
229
|
+
# This is handled by the caller, so return the content as string
|
|
230
|
+
return res.content
|
|
231
|
+
if CustomCommandResult and isinstance(res, CustomCommandResult):
|
|
232
|
+
# TOML custom command — send resolved prompt to the agent
|
|
233
|
+
return res.content
|
|
234
|
+
if isinstance(res, str):
|
|
235
|
+
# Display returned text to the user and treat as handled
|
|
236
|
+
with contextlib.suppress(Exception):
|
|
237
|
+
emit_info(res)
|
|
238
|
+
return True
|
|
239
|
+
except Exception as e:
|
|
240
|
+
# Log via emit_error but do not block default handling
|
|
241
|
+
emit_warning(f"Custom command '{name}' failed: {e}")
|
|
242
|
+
return True # Command was recognized but failed — don't say "Unknown"
|
|
243
|
+
|
|
244
|
+
if name:
|
|
245
|
+
emit_warning(
|
|
246
|
+
Text.from_markup(
|
|
247
|
+
f"Unknown command: {command}\n[dim]Type /help for options.[/dim]"
|
|
248
|
+
)
|
|
249
|
+
)
|
|
250
|
+
else:
|
|
251
|
+
# Show current model ONLY here
|
|
252
|
+
from code_muse.command_line.model_picker_completion import get_active_model
|
|
253
|
+
|
|
254
|
+
current_model = get_active_model()
|
|
255
|
+
emit_info(
|
|
256
|
+
Text.from_markup(
|
|
257
|
+
f"[bold green]Current Model:[/bold green] [cyan]{current_model}[/cyan]"
|
|
258
|
+
)
|
|
259
|
+
)
|
|
260
|
+
return True
|
|
261
|
+
|
|
262
|
+
return False
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"""Command registry for dynamic command discovery.
|
|
2
|
+
|
|
3
|
+
This module provides a decorator-based registration system for commands,
|
|
4
|
+
enabling automatic help generation and eliminating static command lists.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from collections.abc import Callable
|
|
8
|
+
from dataclasses import dataclass, field
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dataclass
|
|
12
|
+
class CommandInfo:
|
|
13
|
+
"""Metadata for a registered command."""
|
|
14
|
+
|
|
15
|
+
name: str
|
|
16
|
+
description: str
|
|
17
|
+
handler: Callable[[str], bool]
|
|
18
|
+
usage: str = ""
|
|
19
|
+
aliases: list[str] = field(default_factory=list)
|
|
20
|
+
category: str = "core"
|
|
21
|
+
detailed_help: str | None = None
|
|
22
|
+
|
|
23
|
+
def __post_init__(self):
|
|
24
|
+
"""Set default usage if not provided."""
|
|
25
|
+
if not self.usage:
|
|
26
|
+
self.usage = f"/{self.name}"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# Global registry: maps command name/alias -> CommandInfo
|
|
30
|
+
_COMMAND_REGISTRY: dict[str, CommandInfo] = {}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def register_command(
|
|
34
|
+
name: str,
|
|
35
|
+
description: str,
|
|
36
|
+
usage: str = "",
|
|
37
|
+
aliases: list[str | None] = None,
|
|
38
|
+
category: str = "core",
|
|
39
|
+
detailed_help: str | None = None,
|
|
40
|
+
):
|
|
41
|
+
"""Decorator to register a command handler.
|
|
42
|
+
|
|
43
|
+
This decorator registers a command function so it can be:
|
|
44
|
+
- Auto-discovered by the help system
|
|
45
|
+
- Invoked by handle_command() dynamically
|
|
46
|
+
- Grouped by category
|
|
47
|
+
- Documented with aliases and detailed help
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
name: Primary command name (without leading /)
|
|
51
|
+
description: Short one-line description for help text
|
|
52
|
+
usage: Full usage string (e.g., "/cd <dir>"). Defaults to "/{name}"
|
|
53
|
+
aliases: List of alternative names (without leading /)
|
|
54
|
+
category: Grouping category ("core", "session", "config", etc.)
|
|
55
|
+
detailed_help: Optional detailed help text for /help <command>
|
|
56
|
+
|
|
57
|
+
Example:
|
|
58
|
+
>>> @register_command(
|
|
59
|
+
... name="session",
|
|
60
|
+
... description="Show or rotate autosave session ID",
|
|
61
|
+
... usage="/session [id|new]",
|
|
62
|
+
... aliases=["s"],
|
|
63
|
+
... category="session",
|
|
64
|
+
... )
|
|
65
|
+
... def handle_session(command: str) -> bool:
|
|
66
|
+
... return True
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
The decorated function, unchanged
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
def decorator(func: Callable[[str], bool]) -> Callable[[str], bool]:
|
|
73
|
+
# Create CommandInfo instance
|
|
74
|
+
cmd_info = CommandInfo(
|
|
75
|
+
name=name,
|
|
76
|
+
description=description,
|
|
77
|
+
handler=func,
|
|
78
|
+
usage=usage,
|
|
79
|
+
aliases=aliases or [],
|
|
80
|
+
category=category,
|
|
81
|
+
detailed_help=detailed_help,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
# Register primary name
|
|
85
|
+
_COMMAND_REGISTRY[name] = cmd_info
|
|
86
|
+
|
|
87
|
+
# Register all aliases pointing to the same CommandInfo
|
|
88
|
+
for alias in aliases or []:
|
|
89
|
+
_COMMAND_REGISTRY[alias] = cmd_info
|
|
90
|
+
|
|
91
|
+
return func
|
|
92
|
+
|
|
93
|
+
return decorator
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def get_all_commands() -> dict[str, CommandInfo]:
|
|
97
|
+
"""Get all registered commands.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
Dictionary mapping command names/aliases to CommandInfo objects.
|
|
101
|
+
Note: Aliases point to the same CommandInfo as their primary command.
|
|
102
|
+
"""
|
|
103
|
+
return _COMMAND_REGISTRY.copy()
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def get_unique_commands() -> list[CommandInfo]:
|
|
107
|
+
"""Get unique registered commands (no duplicates from aliases).
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
List of unique CommandInfo objects (one per primary command).
|
|
111
|
+
"""
|
|
112
|
+
seen = set()
|
|
113
|
+
unique = []
|
|
114
|
+
for cmd_info in _COMMAND_REGISTRY.values():
|
|
115
|
+
# Use object id to avoid duplicates from aliases
|
|
116
|
+
if id(cmd_info) not in seen:
|
|
117
|
+
seen.add(id(cmd_info))
|
|
118
|
+
unique.append(cmd_info)
|
|
119
|
+
return unique
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def get_command(name: str) -> CommandInfo | None:
|
|
123
|
+
"""Get command info by name or alias (case-insensitive).
|
|
124
|
+
|
|
125
|
+
First tries exact match for backward compatibility, then falls back to
|
|
126
|
+
case-insensitive matching.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
name: Command name or alias (without leading /)
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
CommandInfo if found, None otherwise
|
|
133
|
+
"""
|
|
134
|
+
# First try exact match (for backward compatibility)
|
|
135
|
+
exact_match = _COMMAND_REGISTRY.get(name)
|
|
136
|
+
if exact_match is not None:
|
|
137
|
+
return exact_match
|
|
138
|
+
|
|
139
|
+
# If no exact match, try case-insensitive matching
|
|
140
|
+
name_lower = name.lower()
|
|
141
|
+
for registered_name, cmd_info in _COMMAND_REGISTRY.items():
|
|
142
|
+
if registered_name.lower() == name_lower:
|
|
143
|
+
return cmd_info
|
|
144
|
+
|
|
145
|
+
return None
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def clear_registry():
|
|
149
|
+
"""Clear all registered commands. Useful for testing."""
|
|
150
|
+
_COMMAND_REGISTRY.clear()
|