code-muse 0.1.0__tar.gz → 0.1.2__tar.gz
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-0.1.0 → code_muse-0.1.2}/PKG-INFO +1 -1
- code_muse-0.1.2/code_muse/plugins/auto_review/__init__.py +6 -0
- code_muse-0.1.2/code_muse/plugins/auto_review/cache.py +33 -0
- code_muse-0.1.2/code_muse/plugins/auto_review/config.py +35 -0
- code_muse-0.1.2/code_muse/plugins/auto_review/register_callbacks.py +122 -0
- code_muse-0.1.2/code_muse/plugins/auto_review/review_prompt.py +23 -0
- code_muse-0.1.2/code_muse/plugins/auto_review/reviewer.py +314 -0
- code_muse-0.1.2/code_muse/plugins/auto_review/visibility.py +45 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/pyproject.toml +1 -1
- {code_muse-0.1.0 → code_muse-0.1.2}/.gitignore +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/LICENSE +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/README.md +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/__main__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/_builder.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/_compaction.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/_diagnostics.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/_history.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/_key_listeners.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/_non_streaming_render.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/_runtime.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/agent_creator_agent.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/agent_helios.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/agent_manager.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/agent_muse.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/agent_planning.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/agent_qa_iris.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/base_agent.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/event_stream_handler.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/json_agent.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/prompt_v3.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/agents/subagent_stream_handler.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/chatgpt_codex_client.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/claude_cache_client.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/cli_runner/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/cli_runner/args.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/cli_runner/loop.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/cli_runner/resume.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/cli_runner/runner.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/add_model_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/agent_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/attachments.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/autosave_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/clipboard.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/colors_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/command_handler.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/command_registry.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/config_commands.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/core_commands.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/diff_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/file_path_completion.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/load_context_completion.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/model_picker_completion.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/model_settings_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/onboarding_slides.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/onboarding_wizard.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/pagination.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/pin_command_completion.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/prompt_toolkit_completion.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/session_commands.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/shell_passthrough.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/skills_completion.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/types.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/uc_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/utils.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/command_line/wiggum_state.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/config_agent.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/config_appearance.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/config_model.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/config_security.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/error_logging.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/evals/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/evals/eval_helpers.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/evals/eval_runner.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/evals/sample_evals/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/evals/sample_evals/eval_frugal_reads.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/evals/sample_evals/eval_memory_planning.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/evals/sample_evals/eval_shell_efficiency.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/evals/sample_evals/eval_tool_masking.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/fs_scan_cache/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/fs_scan_cache/invalidation_hooks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/fs_scan_cache/scan_cache_core.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/fs_scan_cache/scan_cache_core.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/fs_scan_cache/tool_integration.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/fs_scan_cache/ttl_policy.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/gemini_code_assist.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/gemini_model.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/hook_engine/README.md +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/hook_engine/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/hook_engine/aliases.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/hook_engine/engine.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/hook_engine/executor.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/hook_engine/matcher.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/hook_engine/models.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/hook_engine/registry.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/hook_engine/trust.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/hook_engine/validator.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/http_utils.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/keymap.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/list_filtering.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/main.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/messaging/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/messaging/bus.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/messaging/commands.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/messaging/markdown_patches.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/messaging/message_queue.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/messaging/messages.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/messaging/queue_console.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/messaging/renderers.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/messaging/rich_renderer.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/messaging/shimmer.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/messaging/spinner/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/messaging/spinner/console_spinner.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/messaging/spinner/spinner_base.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/messaging/subagent_console.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/model_factory.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/model_switching.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/model_utils.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/models.json +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/models_cache/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/models_cache/blocking_lru_cache.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/models_cache/cache_writer.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/models_cache/sha256_hash.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/models_cache/sha256_hash.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/models_cache/startup_integration.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/models_dev_api.json +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/models_dev_parser.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/motion.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/agent_skills/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/agent_skills/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/agent_skills/discovery.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/agent_skills/downloader.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/agent_skills/installer.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/agent_skills/metadata.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/agent_skills/prompt_builder.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/agent_skills/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/agent_skills/remote_catalog.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/agent_skills/skill_catalog.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/agent_skills/skills_install_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/agent_skills/skills_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-x86_64-linux-gnu.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/bm25_scorer.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/consolidation.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/extraction.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/lease_lock.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/memory_injection.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/secret_scanner.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/session_scanner.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/aws_bedrock/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/aws_bedrock/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/aws_bedrock/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/aws_bedrock/utils.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/azure_foundry/README.md +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/azure_foundry/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/azure_foundry/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/azure_foundry/discovery.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/azure_foundry/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/azure_foundry/token.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/azure_foundry/utils.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/build_filter/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/build_filter/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/build_filter/strategies/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/build_filter/strategies/build.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/chatgpt_oauth/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/chatgpt_oauth/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/chatgpt_oauth/oauth_flow.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/chatgpt_oauth/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/chatgpt_oauth/test_plugin.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/chatgpt_oauth/utils.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/checkpointing/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/checkpointing/checkpoint_hook.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/checkpointing/conversation_snapshots.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/checkpointing/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/checkpointing/restore_command.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/checkpointing/rewind_shortcut.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/checkpointing/shadow_git.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/claude_code_hooks/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/claude_code_hooks/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/claude_code_hooks/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/README.md +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/SETUP.md +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/fast_mode.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/prompt_handler.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/test_fast_mode.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/test_plugin.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/utils.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/copilot_auth/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/copilot_auth/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/copilot_auth/reasoning_client.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/copilot_auth/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/copilot_auth/utils.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/custom_commands/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/custom_commands/args_injection.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/custom_commands/command_discovery.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/custom_commands/command_toml_schema.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/custom_commands/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/customizable_commands/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/customizable_commands/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/destructive_command_guard/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/destructive_command_guard/detector.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/destructive_command_guard/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/example_custom_command/README.md +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/example_custom_command/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/file_permission_handler/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/file_permission_handler/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/classifier.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/content_detector.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/dispatcher.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/registry.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-x86_64-linux-gnu.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/ast_compressor.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/ast_parser.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/code.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/code.cpython-314-x86_64-linux-gnu.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/code.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/git.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/git.cpython-314-x86_64-linux-gnu.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/git.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/json_compressor.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/json_compressor.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/json_patterns.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/json_patterns.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/lint.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/lint.cpython-314-x86_64-linux-gnu.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/lint.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/test.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/test.cpython-314-x86_64-linux-gnu.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/test.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/filter_engine/verbosity.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/force_push_guard/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/force_push_guard/detector.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/force_push_guard/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/force_push_guard/test_detector.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/frontend_emitter/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/frontend_emitter/emitter.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/frontend_emitter/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/gac/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/gac/git_ops.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/gac/prompt.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/gac/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/hook_creator/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/hook_creator/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/hook_manager/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/hook_manager/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/hook_manager/hooks_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/hook_manager/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/hook_monitor/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/mindpack/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/mindpack/factory.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/mindpack/judge.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/mindpack/memory.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/mindpack/mindpack_menu.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/mindpack/orchestration.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/mindpack/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/mindpack/schemas.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/mindpack/tools.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/oauth_muse_html.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/ollama_setup/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/ollama_setup/completer.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/ollama_setup/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/plan_command/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/plan_command/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/plan_mode/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/plan_mode/mode_cycling.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/plan_mode/plan_generation.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/plan_mode/plan_hooks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/plan_mode/plan_mode_tools.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/plan_mode/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/plugin_trust/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/policy_engine/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/policy_engine/approval_flow_integration.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/policy_engine/policy_evaluator.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/policy_engine/policy_file_discovery.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/policy_engine/policy_toml_schema.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/policy_engine/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/pop_command/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/pop_command/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/prompt_newline/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/prompt_newline/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/prompt_newline/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/safety_status/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/safety_status/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/semantic_compression/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/semantic_compression/compressor.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/semantic_compression/config.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/semantic_compression/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/shell_minimizer/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/shell_minimizer/builtin_filters.toml +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/shell_minimizer/pipeline.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/shell_minimizer/primitives.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/shell_minimizer/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/shell_safety/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/shell_safety/agent_shell_safety.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/shell_safety/command_cache.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/shell_safety/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/synthetic_status/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/synthetic_status/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/synthetic_status/status_api.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/token_caching/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/token_caching/cache_hit_tracking.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/token_caching/cacheable_prefix_detection.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/token_caching/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/token_caching/stats_display.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/token_tracking/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/token_tracking/database.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/token_tracking/edit_analyzer.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/token_tracking/record.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/token_tracking/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/token_tracking/reports.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/tps_meter/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/tps_meter/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/universal_constructor/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/universal_constructor/models.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/universal_constructor/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/universal_constructor/registry.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/universal_constructor/runner.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/universal_constructor/safety.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/plugins/universal_constructor/sandbox.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/provider_identity.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/pydantic_patches.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/reopenable_async_client.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/round_robin_model.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/secret_storage.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/security/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/security/redaction.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/security/redaction.cpython-314-x86_64-linux-gnu.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/security/redaction.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/session_storage.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/status_display.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/stream_parser/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/stream_parser/assistant_text_parser.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/stream_parser/citation_parser.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/stream_parser/inline_hidden_tag_parser.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/stream_parser/proposed_plan_parser.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/stream_parser/stream_text_chunk.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/stream_parser/stream_text_parser.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/stream_parser/tagged_line_parser.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/stream_parser/tagged_line_parser.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/stream_parser/utf8_stream_parser.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/stream_parser/utf8_stream_parser.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/summarization_agent.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/terminal_utils.cpython-314-darwin.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/terminal_utils.cpython-314-x86_64-linux-gnu.so +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/terminal_utils.pyx +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/agent_tools.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/ask_user_question/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/ask_user_question/constants.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/ask_user_question/demo_tui.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/ask_user_question/handler.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/ask_user_question/models.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/ask_user_question/registration.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/ask_user_question/renderers.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/ask_user_question/terminal_ui.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/ask_user_question/theme.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/ask_user_question/tui_loop.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/background_jobs.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/browser/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/browser/browser_control.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/browser/browser_interactions.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/browser/browser_locators.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/browser/browser_manager.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/browser/browser_navigation.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/browser/browser_screenshot.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/browser/browser_scripts.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/browser/browser_workflows.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/chrome_cdp/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/chrome_cdp/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/command_runner.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/common.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/display.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/file_modifications.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/file_operations.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/image_tools.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/meetin_proxy/__init__.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/meetin_proxy/capture_addon.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/meetin_proxy/proxy_manager.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/meetin_proxy/register_callbacks.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/path_policy.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/skills_tools.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/subagent_context.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/tools_content.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/tools/universal_constructor.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/uvx_detection.py +0 -0
- {code_muse-0.1.0 → code_muse-0.1.2}/code_muse/version_checker.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-muse
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.2
|
|
4
4
|
Summary: Muse — eternal guide of creators in the arts and sciences. An elegant AI coding assistant.
|
|
5
5
|
Project-URL: Repository, https://github.com/asx8678/muse
|
|
6
6
|
Project-URL: Homepage, https://github.com/asx8678/muse
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"""Auto-Review plugin — second-agent review of file changes.
|
|
2
|
+
|
|
3
|
+
Hooks into ``post_tool_call`` to automatically review file modifications
|
|
4
|
+
using a separate LLM call. Displays visible review status so the user always
|
|
5
|
+
knows when a review is happening and what was found.
|
|
6
|
+
"""
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""In-memory cache for auto-review results."""
|
|
2
|
+
|
|
3
|
+
import hashlib
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class ReviewCache:
|
|
7
|
+
"""Simple cache keyed by SHA256(file_path + content_hash)."""
|
|
8
|
+
|
|
9
|
+
def __init__(self) -> None:
|
|
10
|
+
self._cache: dict[str, dict] = {}
|
|
11
|
+
|
|
12
|
+
def _key(self, file_path: str, content_hash: str) -> str:
|
|
13
|
+
return hashlib.sha256(f"{file_path}::{content_hash}".encode()).hexdigest()
|
|
14
|
+
|
|
15
|
+
def get(self, file_path: str, content_hash: str) -> dict | None:
|
|
16
|
+
"""Return cached review result or None."""
|
|
17
|
+
return self._cache.get(self._key(file_path, content_hash))
|
|
18
|
+
|
|
19
|
+
def set(self, file_path: str, content_hash: str, result: dict) -> None:
|
|
20
|
+
"""Store a review result in the cache."""
|
|
21
|
+
self._cache[self._key(file_path, content_hash)] = result
|
|
22
|
+
|
|
23
|
+
def clear(self) -> None:
|
|
24
|
+
"""Clear all cached entries."""
|
|
25
|
+
self._cache.clear()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
_review_cache = ReviewCache()
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def get_review_cache() -> ReviewCache:
|
|
32
|
+
"""Return the module-level ReviewCache singleton."""
|
|
33
|
+
return _review_cache
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Configuration accessors for the Auto-Review plugin."""
|
|
2
|
+
|
|
3
|
+
from code_muse.config import get_value
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def is_auto_review_enabled() -> bool:
|
|
7
|
+
"""Check if auto-review is enabled (default: True)."""
|
|
8
|
+
val = get_value("auto_review_enabled")
|
|
9
|
+
if val is None:
|
|
10
|
+
return True
|
|
11
|
+
return str(val).lower() in ("1", "true", "yes", "on")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def get_auto_review_model() -> str | None:
|
|
15
|
+
"""Get the model to use for auto-review, or None to use the global model."""
|
|
16
|
+
return get_value("auto_review_model")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def get_auto_review_mode() -> str:
|
|
20
|
+
"""Get the review mode: 'background' or 'blocking' (default: 'background')."""
|
|
21
|
+
val = get_value("auto_review_mode")
|
|
22
|
+
if val and val.strip().lower() in ("background", "blocking"):
|
|
23
|
+
return val.strip().lower()
|
|
24
|
+
return "background"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def get_auto_review_min_diff_length() -> int:
|
|
28
|
+
"""Minimum diff length (in characters) to trigger a review (default: 10)."""
|
|
29
|
+
val = get_value("auto_review_min_diff_length")
|
|
30
|
+
if val is not None:
|
|
31
|
+
try:
|
|
32
|
+
return max(0, int(val))
|
|
33
|
+
except (ValueError, TypeError):
|
|
34
|
+
pass
|
|
35
|
+
return 10
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"""Callback registration for the Auto-Review plugin.
|
|
2
|
+
|
|
3
|
+
Registers:
|
|
4
|
+
- ``post_tool_call`` hook — automatically reviews file changes
|
|
5
|
+
- ``request_code_review`` tool — manual review trigger
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from code_muse.callbacks import register_callback
|
|
12
|
+
from code_muse.plugins.auto_review.reviewer import (
|
|
13
|
+
request_manual_review,
|
|
14
|
+
run_auto_review,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# ---------------------------------------------------------------------------
|
|
21
|
+
# post_tool_call hook
|
|
22
|
+
# ---------------------------------------------------------------------------
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
async def _on_post_tool_call(
|
|
26
|
+
tool_name: str,
|
|
27
|
+
tool_args: dict,
|
|
28
|
+
result: dict,
|
|
29
|
+
duration_ms: float,
|
|
30
|
+
context: Any = None,
|
|
31
|
+
) -> None:
|
|
32
|
+
"""Review file changes after tool execution."""
|
|
33
|
+
try:
|
|
34
|
+
await run_auto_review(tool_name, tool_args, result)
|
|
35
|
+
except Exception as exc:
|
|
36
|
+
logger.error("Auto-review hook failed: %s", exc, exc_info=True)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# ---------------------------------------------------------------------------
|
|
40
|
+
# Tool registration
|
|
41
|
+
# ---------------------------------------------------------------------------
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _register_review_tools() -> list[dict]:
|
|
45
|
+
"""Return tool definitions for the auto-review plugin."""
|
|
46
|
+
|
|
47
|
+
def register_request_code_review(agent):
|
|
48
|
+
"""Register the request_code_review tool on an agent."""
|
|
49
|
+
|
|
50
|
+
@agent.tool
|
|
51
|
+
async def request_code_review(
|
|
52
|
+
context,
|
|
53
|
+
file_path: str = "",
|
|
54
|
+
reason: str | None = None,
|
|
55
|
+
) -> dict:
|
|
56
|
+
"""Request a code review for a specific file.
|
|
57
|
+
|
|
58
|
+
The reviewer analyzes the file for correctness, safety, style,
|
|
59
|
+
edge cases, and completeness. Returns structured feedback.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
file_path: Path to the file to review
|
|
63
|
+
reason: Optional focus area for the review \
|
|
64
|
+
(e.g., "security", "performance")
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
Dict with verdict, summary, issues, and suggestion
|
|
68
|
+
"""
|
|
69
|
+
return await request_manual_review(file_path, reason)
|
|
70
|
+
|
|
71
|
+
return [
|
|
72
|
+
{
|
|
73
|
+
"name": "request_code_review",
|
|
74
|
+
"register_func": register_request_code_review,
|
|
75
|
+
},
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# ---------------------------------------------------------------------------
|
|
80
|
+
# Help entry
|
|
81
|
+
# ---------------------------------------------------------------------------
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _on_custom_command_help() -> list[tuple[str, str]]:
|
|
85
|
+
return [
|
|
86
|
+
("review <path>", "Request an auto-review for a specific file"),
|
|
87
|
+
]
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _on_custom_command(command: str, name: str) -> bool | None:
|
|
91
|
+
"""Handle ``/review <path>`` command."""
|
|
92
|
+
if name == "review":
|
|
93
|
+
parts = command.split(maxsplit=1)
|
|
94
|
+
file_path = parts[1].strip() if len(parts) > 1 else ""
|
|
95
|
+
if not file_path:
|
|
96
|
+
from code_muse.messaging import emit_warning
|
|
97
|
+
|
|
98
|
+
emit_warning("Usage: /review <file_path>")
|
|
99
|
+
return True
|
|
100
|
+
|
|
101
|
+
import asyncio
|
|
102
|
+
|
|
103
|
+
try:
|
|
104
|
+
loop = asyncio.get_running_loop()
|
|
105
|
+
loop.create_task(request_manual_review(file_path))
|
|
106
|
+
except RuntimeError:
|
|
107
|
+
asyncio.run(request_manual_review(file_path))
|
|
108
|
+
|
|
109
|
+
return True
|
|
110
|
+
return None
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
# ---------------------------------------------------------------------------
|
|
114
|
+
# Register all callbacks
|
|
115
|
+
# ---------------------------------------------------------------------------
|
|
116
|
+
|
|
117
|
+
register_callback("post_tool_call", _on_post_tool_call)
|
|
118
|
+
register_callback("register_tools", _register_review_tools)
|
|
119
|
+
register_callback("custom_command_help", _on_custom_command_help)
|
|
120
|
+
register_callback("custom_command", _on_custom_command)
|
|
121
|
+
|
|
122
|
+
logger.debug("Auto-Review plugin callbacks registered")
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Reviewer system prompt templates."""
|
|
2
|
+
|
|
3
|
+
REVIEWER_SYSTEM_PROMPT = """\
|
|
4
|
+
You are a code reviewer. Review the following file change and \
|
|
5
|
+
provide structured feedback.
|
|
6
|
+
|
|
7
|
+
Evaluate:
|
|
8
|
+
1. CORRECTNESS — Does the change achieve its apparent goal? Any bugs?
|
|
9
|
+
2. SAFETY — Could this change introduce security issues, data loss, or breakage?
|
|
10
|
+
3. STYLE — Does it follow best practices for the language/framework?
|
|
11
|
+
4. EDGE CASES — Are there inputs or states where this fails?
|
|
12
|
+
5. COMPLETENESS — Is the change self-contained? Missing imports, error handling, tests?
|
|
13
|
+
|
|
14
|
+
Be concise. Focus on actionable issues. If the change looks good, say so.
|
|
15
|
+
|
|
16
|
+
Return your review as JSON with:
|
|
17
|
+
{
|
|
18
|
+
"verdict": "approved" | "flagged" | "rejected",
|
|
19
|
+
"summary": "One-line summary of findings",
|
|
20
|
+
"issues": ["list of specific issues, or empty list"],
|
|
21
|
+
"suggestion": "Optional improvement suggestion or null"
|
|
22
|
+
}
|
|
23
|
+
"""
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
"""Core review orchestration — builds context, calls LLM, parses result."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import logging
|
|
5
|
+
|
|
6
|
+
from code_muse.plugins.auto_review.cache import get_review_cache
|
|
7
|
+
from code_muse.plugins.auto_review.config import (
|
|
8
|
+
get_auto_review_min_diff_length,
|
|
9
|
+
get_auto_review_model,
|
|
10
|
+
is_auto_review_enabled,
|
|
11
|
+
)
|
|
12
|
+
from code_muse.plugins.auto_review.review_prompt import REVIEWER_SYSTEM_PROMPT
|
|
13
|
+
from code_muse.plugins.auto_review.visibility import (
|
|
14
|
+
emit_review_approved,
|
|
15
|
+
emit_review_error,
|
|
16
|
+
emit_review_flagged,
|
|
17
|
+
emit_review_rejected,
|
|
18
|
+
emit_review_started,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
# Known file-modification tools that trigger review
|
|
24
|
+
_FILE_MOD_TOOLS = frozenset(
|
|
25
|
+
{
|
|
26
|
+
"create_file",
|
|
27
|
+
"replace_in_file",
|
|
28
|
+
"delete_snippet",
|
|
29
|
+
"delete_file",
|
|
30
|
+
}
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _compute_content_hash(file_path: str, diff: str) -> str:
|
|
35
|
+
"""Compute a stable hash for cache key."""
|
|
36
|
+
import hashlib
|
|
37
|
+
|
|
38
|
+
return hashlib.sha256(f"{file_path}::{diff}".encode()).hexdigest()[:16]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _extract_review_context(
|
|
42
|
+
tool_name: str,
|
|
43
|
+
tool_args: dict,
|
|
44
|
+
result: dict,
|
|
45
|
+
) -> dict | None:
|
|
46
|
+
"""Extract review context from tool call data.
|
|
47
|
+
|
|
48
|
+
Returns dict with file_path, operation, diff, content_hash or None
|
|
49
|
+
if the operation doesn't warrant review (e.g. it failed).
|
|
50
|
+
"""
|
|
51
|
+
# Only review successful changes
|
|
52
|
+
if not result.get("success") and not result.get("changed"):
|
|
53
|
+
return None
|
|
54
|
+
|
|
55
|
+
file_path = tool_args.get("file_path", tool_args.get("path", ""))
|
|
56
|
+
if not file_path:
|
|
57
|
+
return None
|
|
58
|
+
|
|
59
|
+
# Build a review diff from the result
|
|
60
|
+
diff = ""
|
|
61
|
+
if "diff" in result:
|
|
62
|
+
diff = result["diff"]
|
|
63
|
+
|
|
64
|
+
# For create_file, the diff might be in the result as a message
|
|
65
|
+
if not diff and tool_name == "create_file":
|
|
66
|
+
content = tool_args.get("content", "")
|
|
67
|
+
if content:
|
|
68
|
+
lines = content.splitlines()
|
|
69
|
+
diff = (
|
|
70
|
+
f"--- /dev/null\n+++ b/{file_path}\n"
|
|
71
|
+
f"@@ -0,0 +1,{len(lines)} @@\n"
|
|
72
|
+
+ "\n".join(f"+{line}" for line in lines)
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
# For delete_file, note the deletion
|
|
76
|
+
if not diff and tool_name == "delete_file":
|
|
77
|
+
diff = f"--- a/{file_path}\n+++ /dev/null\n@@ -1,0 +0,0 @@\nFile deleted."
|
|
78
|
+
|
|
79
|
+
# Skip trivial changes
|
|
80
|
+
if len(diff.strip()) < get_auto_review_min_diff_length():
|
|
81
|
+
return None
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
"file_path": file_path,
|
|
85
|
+
"operation": tool_name,
|
|
86
|
+
"diff": diff,
|
|
87
|
+
"content_hash": _compute_content_hash(file_path, diff),
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _build_reviewer_prompt(context: dict) -> str:
|
|
92
|
+
"""Build the user prompt for the reviewer model."""
|
|
93
|
+
file_path = context["file_path"]
|
|
94
|
+
ext = file_path.rsplit(".", 1)[-1] if "." in file_path else "unknown"
|
|
95
|
+
return f"""Please review this file change:
|
|
96
|
+
|
|
97
|
+
File: {context["file_path"]}
|
|
98
|
+
Operation: {context["operation"]}
|
|
99
|
+
Language/type: {ext}
|
|
100
|
+
|
|
101
|
+
Diff:
|
|
102
|
+
```
|
|
103
|
+
{context["diff"][:4000]}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Provide your structured review as JSON with verdict, summary, issues, and suggestion.
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
async def _call_reviewer_llm(prompt: str) -> dict | None:
|
|
111
|
+
"""Call the reviewer LLM and parse the JSON response.
|
|
112
|
+
|
|
113
|
+
Uses ModelFactory to get a model instance, creates a temporary
|
|
114
|
+
pydantic-ai Agent with no tools, and extracts the review.
|
|
115
|
+
"""
|
|
116
|
+
try:
|
|
117
|
+
from pydantic_ai import Agent as PydanticAgent
|
|
118
|
+
|
|
119
|
+
from code_muse.agents._builder import load_muse_rules
|
|
120
|
+
from code_muse.config import get_global_model_name
|
|
121
|
+
from code_muse.model_factory import ModelFactory, make_model_settings
|
|
122
|
+
from code_muse.model_utils import prepare_prompt_for_model
|
|
123
|
+
|
|
124
|
+
model_name = get_auto_review_model() or get_global_model_name()
|
|
125
|
+
if not model_name:
|
|
126
|
+
logger.warning("No model available for auto-review")
|
|
127
|
+
return None
|
|
128
|
+
|
|
129
|
+
models_config = ModelFactory.load_config()
|
|
130
|
+
if model_name not in models_config:
|
|
131
|
+
logger.warning("Reviewer model '%s' not found in config", model_name)
|
|
132
|
+
return None
|
|
133
|
+
|
|
134
|
+
model = ModelFactory.get_model(model_name, models_config)
|
|
135
|
+
if model is None:
|
|
136
|
+
logger.warning("Could not create reviewer model instance")
|
|
137
|
+
return None
|
|
138
|
+
|
|
139
|
+
# Build reviewer instructions
|
|
140
|
+
instructions = REVIEWER_SYSTEM_PROMPT
|
|
141
|
+
rules = load_muse_rules()
|
|
142
|
+
if rules:
|
|
143
|
+
instructions += f"\n\nProject rules:\n{rules}"
|
|
144
|
+
|
|
145
|
+
prepared = prepare_prompt_for_model(
|
|
146
|
+
model_name,
|
|
147
|
+
instructions,
|
|
148
|
+
prompt,
|
|
149
|
+
prepend_system_to_user=False,
|
|
150
|
+
)
|
|
151
|
+
instructions = prepared.instructions
|
|
152
|
+
user_prompt = prepared.user_prompt or prompt
|
|
153
|
+
|
|
154
|
+
model_settings = make_model_settings(model_name)
|
|
155
|
+
|
|
156
|
+
# Create a temporary agent with no tools — just text in, text out
|
|
157
|
+
review_agent = PydanticAgent(
|
|
158
|
+
model=model,
|
|
159
|
+
instructions=instructions,
|
|
160
|
+
output_type=str,
|
|
161
|
+
retries=1,
|
|
162
|
+
model_settings=model_settings,
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
result = await review_agent.run(user_prompt, message_history=[])
|
|
166
|
+
text = result.data if hasattr(result, "data") else str(result)
|
|
167
|
+
|
|
168
|
+
# Try to parse JSON from the response
|
|
169
|
+
# Look for JSON block first
|
|
170
|
+
import re
|
|
171
|
+
|
|
172
|
+
json_match = re.search(r"\{[^{}]*\}", text, re.DOTALL)
|
|
173
|
+
if json_match:
|
|
174
|
+
# Expand to find complete JSON object
|
|
175
|
+
start = text.find("{")
|
|
176
|
+
end = text.rfind("}") + 1
|
|
177
|
+
if start >= 0 and end > start:
|
|
178
|
+
json_str = text[start:end]
|
|
179
|
+
return json.loads(json_str)
|
|
180
|
+
|
|
181
|
+
# Try parsing entire response as JSON
|
|
182
|
+
try:
|
|
183
|
+
return json.loads(text)
|
|
184
|
+
except json.JSONDecodeError:
|
|
185
|
+
pass
|
|
186
|
+
|
|
187
|
+
# Fallback: simple heuristic
|
|
188
|
+
text_lower = text.lower()
|
|
189
|
+
if (
|
|
190
|
+
"looks good" in text_lower
|
|
191
|
+
or "approved" in text_lower
|
|
192
|
+
or "no issues" in text_lower
|
|
193
|
+
):
|
|
194
|
+
return {
|
|
195
|
+
"verdict": "approved",
|
|
196
|
+
"summary": text[:200],
|
|
197
|
+
"issues": [],
|
|
198
|
+
"suggestion": None,
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
"verdict": "flagged",
|
|
202
|
+
"summary": text[:200],
|
|
203
|
+
"issues": ["Reviewer produced unstructured output"],
|
|
204
|
+
"suggestion": None,
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
except Exception as exc:
|
|
208
|
+
logger.error("Auto-review LLM call failed: %s", exc, exc_info=True)
|
|
209
|
+
return None
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
async def run_auto_review(
|
|
213
|
+
tool_name: str,
|
|
214
|
+
tool_args: dict,
|
|
215
|
+
result: dict,
|
|
216
|
+
) -> None:
|
|
217
|
+
"""Main entry point — run auto-review on a completed tool call.
|
|
218
|
+
|
|
219
|
+
Called from the ``post_tool_call`` hook. Checks eligibility,
|
|
220
|
+
extracts context, checks cache, calls reviewer, emits results.
|
|
221
|
+
"""
|
|
222
|
+
if not is_auto_review_enabled():
|
|
223
|
+
return
|
|
224
|
+
|
|
225
|
+
# Only review file modification tools
|
|
226
|
+
if tool_name not in _FILE_MOD_TOOLS:
|
|
227
|
+
return
|
|
228
|
+
|
|
229
|
+
context = _extract_review_context(tool_name, tool_args, result)
|
|
230
|
+
if context is None:
|
|
231
|
+
return
|
|
232
|
+
|
|
233
|
+
# Check cache
|
|
234
|
+
cache = get_review_cache()
|
|
235
|
+
cached = cache.get(context["file_path"], context["content_hash"])
|
|
236
|
+
if cached is not None:
|
|
237
|
+
emit_review_approved(context["file_path"], "Already reviewed (cached)")
|
|
238
|
+
return
|
|
239
|
+
|
|
240
|
+
# Emit visibility: review started
|
|
241
|
+
emit_review_started(context["file_path"])
|
|
242
|
+
|
|
243
|
+
# Build prompt and call reviewer
|
|
244
|
+
prompt = _build_reviewer_prompt(context)
|
|
245
|
+
review = await _call_reviewer_llm(prompt)
|
|
246
|
+
|
|
247
|
+
if review is None:
|
|
248
|
+
emit_review_error(context["file_path"], "Reviewer LLM call failed")
|
|
249
|
+
return
|
|
250
|
+
|
|
251
|
+
# Cache and emit result
|
|
252
|
+
cache.set(context["file_path"], context["content_hash"], review)
|
|
253
|
+
|
|
254
|
+
verdict = review.get("verdict", "flagged")
|
|
255
|
+
summary = review.get("summary", "No summary provided")
|
|
256
|
+
issues = review.get("issues", [])
|
|
257
|
+
suggestion = review.get("suggestion")
|
|
258
|
+
|
|
259
|
+
if verdict == "approved":
|
|
260
|
+
if suggestion:
|
|
261
|
+
summary += f" — Suggestion: {suggestion}"
|
|
262
|
+
emit_review_approved(context["file_path"], summary)
|
|
263
|
+
elif verdict == "rejected":
|
|
264
|
+
emit_review_rejected(context["file_path"], summary, issues)
|
|
265
|
+
else:
|
|
266
|
+
emit_review_flagged(context["file_path"], summary, issues)
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
# Tool: manual review request
|
|
270
|
+
async def request_manual_review(file_path: str, reason: str | None = None) -> dict:
|
|
271
|
+
"""Request a manual code review for a specific file.
|
|
272
|
+
|
|
273
|
+
This is registered as an agent tool so users can trigger review explicitly.
|
|
274
|
+
"""
|
|
275
|
+
try:
|
|
276
|
+
# Read the file content directly
|
|
277
|
+
file_content = ""
|
|
278
|
+
try:
|
|
279
|
+
from pathlib import Path
|
|
280
|
+
|
|
281
|
+
p = Path(file_path).expanduser().resolve()
|
|
282
|
+
if p.exists() and p.is_file():
|
|
283
|
+
file_content = p.read_text(encoding="utf-8", errors="replace")
|
|
284
|
+
except Exception:
|
|
285
|
+
pass
|
|
286
|
+
|
|
287
|
+
context = {
|
|
288
|
+
"file_path": file_path,
|
|
289
|
+
"operation": "manual_review",
|
|
290
|
+
"diff": file_content[:5000],
|
|
291
|
+
"content_hash": _compute_content_hash(file_path, file_content[:5000]),
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
prompt = _build_reviewer_prompt(context)
|
|
295
|
+
if reason:
|
|
296
|
+
prompt += f"\n\nReview focus: {reason}"
|
|
297
|
+
|
|
298
|
+
emit_review_started(file_path)
|
|
299
|
+
review = await _call_reviewer_llm(prompt)
|
|
300
|
+
|
|
301
|
+
if review is None:
|
|
302
|
+
return {"error": "Reviewer LLM call failed", "file_path": file_path}
|
|
303
|
+
|
|
304
|
+
return {
|
|
305
|
+
"file_path": file_path,
|
|
306
|
+
"verdict": review.get("verdict", "flagged"),
|
|
307
|
+
"summary": review.get("summary", ""),
|
|
308
|
+
"issues": review.get("issues", []),
|
|
309
|
+
"suggestion": review.get("suggestion"),
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
except Exception as exc:
|
|
313
|
+
logger.error("Manual review failed: %s", exc, exc_info=True)
|
|
314
|
+
return {"error": str(exc), "file_path": file_path}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""Visibility helpers for auto-review — emit visible status messages."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
|
|
5
|
+
from code_muse.messaging import emit_info, emit_success, emit_warning
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger(__name__)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def emit_review_started(file_path: str) -> None:
|
|
11
|
+
"""Emit a visible message that review is starting."""
|
|
12
|
+
emit_info(f"🔍 Auto-review in progress... ({file_path})")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def emit_review_approved(file_path: str, summary: str) -> None:
|
|
16
|
+
"""Emit a success message when review passes."""
|
|
17
|
+
emit_success(f"✅ Auto-review passed: {summary}")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def emit_review_flagged(file_path: str, summary: str, issues: list[str]) -> None:
|
|
21
|
+
"""Emit a warning when review flags issues."""
|
|
22
|
+
msg = f"⚠️ Auto-review: {summary}"
|
|
23
|
+
for issue in issues:
|
|
24
|
+
msg += f"\n • {issue}"
|
|
25
|
+
emit_warning(msg)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def emit_review_rejected(file_path: str, summary: str, issues: list[str]) -> None:
|
|
29
|
+
"""Emit an error when review rejects the change."""
|
|
30
|
+
from code_muse.messaging import emit_error
|
|
31
|
+
|
|
32
|
+
msg = f"❌ Auto-review rejected: {summary}"
|
|
33
|
+
for issue in issues:
|
|
34
|
+
msg += f"\n • {issue}"
|
|
35
|
+
emit_error(msg)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def emit_review_skipped(reason: str) -> None:
|
|
39
|
+
"""Emit info when review is skipped."""
|
|
40
|
+
emit_info(f"⏭️ Auto-review skipped: {reason}")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def emit_review_error(file_path: str, error_msg: str) -> None:
|
|
44
|
+
"""Emit warning when the review itself fails."""
|
|
45
|
+
emit_warning(f"⚠️ Auto-review error for {file_path}: {error_msg}")
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "code-muse"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.2"
|
|
8
8
|
description = "Muse — eternal guide of creators in the arts and sciences. An elegant AI coding assistant."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.14,<3.16"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|