code-muse 0.0.1__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.
Files changed (401) hide show
  1. {code_muse-0.0.1 → code_muse-0.1.2}/PKG-INFO +1 -1
  2. code_muse-0.0.1/code_muse/agents/agent_qa_melpomene.py → code_muse-0.1.2/code_muse/agents/agent_qa_iris.py +8 -8
  3. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/agents/event_stream_handler.py +34 -4
  4. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/agents/prompt_v3.py +1 -1
  5. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/callbacks.py +14 -0
  6. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/cli_runner/__init__.py +4 -4
  7. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/onboarding_slides.py +3 -3
  8. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/prompt_toolkit_completion.py +64 -28
  9. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/config_appearance.py +18 -18
  10. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/messaging/subagent_console.py +1 -1
  11. code_muse-0.1.2/code_muse/plugins/auto_review/__init__.py +6 -0
  12. code_muse-0.1.2/code_muse/plugins/auto_review/cache.py +33 -0
  13. code_muse-0.1.2/code_muse/plugins/auto_review/config.py +35 -0
  14. code_muse-0.1.2/code_muse/plugins/auto_review/register_callbacks.py +122 -0
  15. code_muse-0.1.2/code_muse/plugins/auto_review/review_prompt.py +23 -0
  16. code_muse-0.1.2/code_muse/plugins/auto_review/reviewer.py +314 -0
  17. code_muse-0.1.2/code_muse/plugins/auto_review/visibility.py +45 -0
  18. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/register_callbacks.py +9 -11
  19. code_muse-0.1.2/code_muse/plugins/tps_meter/__init__.py +0 -0
  20. code_muse-0.1.2/code_muse/plugins/tps_meter/register_callbacks.py +289 -0
  21. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/agent_tools.py +1 -1
  22. {code_muse-0.0.1 → code_muse-0.1.2}/pyproject.toml +1 -1
  23. {code_muse-0.0.1 → code_muse-0.1.2}/.gitignore +0 -0
  24. {code_muse-0.0.1 → code_muse-0.1.2}/LICENSE +0 -0
  25. {code_muse-0.0.1 → code_muse-0.1.2}/README.md +0 -0
  26. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/__init__.py +0 -0
  27. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/__main__.py +0 -0
  28. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/agents/__init__.py +0 -0
  29. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/agents/_builder.py +0 -0
  30. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/agents/_compaction.py +0 -0
  31. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/agents/_diagnostics.py +0 -0
  32. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/agents/_history.py +0 -0
  33. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/agents/_key_listeners.py +0 -0
  34. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/agents/_non_streaming_render.py +0 -0
  35. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/agents/_runtime.py +0 -0
  36. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/agents/agent_creator_agent.py +0 -0
  37. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/agents/agent_helios.py +0 -0
  38. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/agents/agent_manager.py +0 -0
  39. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/agents/agent_muse.py +0 -0
  40. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/agents/agent_planning.py +0 -0
  41. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/agents/base_agent.py +0 -0
  42. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/agents/json_agent.py +0 -0
  43. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/agents/subagent_stream_handler.py +0 -0
  44. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/chatgpt_codex_client.py +0 -0
  45. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/claude_cache_client.py +0 -0
  46. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/cli_runner/args.py +0 -0
  47. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/cli_runner/loop.py +0 -0
  48. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/cli_runner/resume.py +0 -0
  49. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/cli_runner/runner.py +0 -0
  50. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/__init__.py +0 -0
  51. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/add_model_menu.py +0 -0
  52. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/agent_menu.py +0 -0
  53. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/attachments.py +0 -0
  54. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/autosave_menu.py +0 -0
  55. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/clipboard.py +0 -0
  56. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/colors_menu.py +0 -0
  57. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/command_handler.py +0 -0
  58. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/command_registry.py +0 -0
  59. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/config_commands.py +0 -0
  60. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/core_commands.py +0 -0
  61. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/diff_menu.py +0 -0
  62. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/file_path_completion.py +0 -0
  63. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/load_context_completion.py +0 -0
  64. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/model_picker_completion.py +0 -0
  65. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/model_settings_menu.py +0 -0
  66. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/onboarding_wizard.py +0 -0
  67. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/pagination.py +0 -0
  68. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/pin_command_completion.py +0 -0
  69. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/session_commands.py +0 -0
  70. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/shell_passthrough.py +0 -0
  71. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/skills_completion.py +0 -0
  72. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/types.py +0 -0
  73. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/uc_menu.py +0 -0
  74. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/utils.py +0 -0
  75. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/command_line/wiggum_state.py +0 -0
  76. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/config.py +0 -0
  77. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/config_agent.py +0 -0
  78. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/config_model.py +0 -0
  79. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/config_security.py +0 -0
  80. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/error_logging.py +0 -0
  81. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/evals/__init__.py +0 -0
  82. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/evals/eval_helpers.py +0 -0
  83. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/evals/eval_runner.py +0 -0
  84. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/evals/sample_evals/__init__.py +0 -0
  85. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/evals/sample_evals/eval_frugal_reads.py +0 -0
  86. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/evals/sample_evals/eval_memory_planning.py +0 -0
  87. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/evals/sample_evals/eval_shell_efficiency.py +0 -0
  88. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/evals/sample_evals/eval_tool_masking.py +0 -0
  89. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/fs_scan_cache/__init__.py +0 -0
  90. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/fs_scan_cache/invalidation_hooks.py +0 -0
  91. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/fs_scan_cache/scan_cache_core.cpython-314-darwin.so +0 -0
  92. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/fs_scan_cache/scan_cache_core.pyx +0 -0
  93. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/fs_scan_cache/tool_integration.py +0 -0
  94. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/fs_scan_cache/ttl_policy.py +0 -0
  95. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/gemini_code_assist.py +0 -0
  96. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/gemini_model.py +0 -0
  97. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/hook_engine/README.md +0 -0
  98. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/hook_engine/__init__.py +0 -0
  99. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/hook_engine/aliases.py +0 -0
  100. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/hook_engine/engine.py +0 -0
  101. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/hook_engine/executor.py +0 -0
  102. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/hook_engine/matcher.py +0 -0
  103. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/hook_engine/models.py +0 -0
  104. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/hook_engine/registry.py +0 -0
  105. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/hook_engine/trust.py +0 -0
  106. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/hook_engine/validator.py +0 -0
  107. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/http_utils.py +0 -0
  108. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/keymap.py +0 -0
  109. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/list_filtering.py +0 -0
  110. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/main.py +0 -0
  111. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/messaging/__init__.py +0 -0
  112. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/messaging/bus.py +0 -0
  113. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/messaging/commands.py +0 -0
  114. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/messaging/markdown_patches.py +0 -0
  115. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/messaging/message_queue.py +0 -0
  116. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/messaging/messages.py +0 -0
  117. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/messaging/queue_console.py +0 -0
  118. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/messaging/renderers.py +0 -0
  119. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/messaging/rich_renderer.py +0 -0
  120. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/messaging/shimmer.py +0 -0
  121. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/messaging/spinner/__init__.py +0 -0
  122. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/messaging/spinner/console_spinner.py +0 -0
  123. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/messaging/spinner/spinner_base.py +0 -0
  124. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/model_factory.py +0 -0
  125. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/model_switching.py +0 -0
  126. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/model_utils.py +0 -0
  127. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/models.json +0 -0
  128. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/models_cache/__init__.py +0 -0
  129. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/models_cache/blocking_lru_cache.py +0 -0
  130. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/models_cache/cache_writer.py +0 -0
  131. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/models_cache/sha256_hash.cpython-314-darwin.so +0 -0
  132. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/models_cache/sha256_hash.pyx +0 -0
  133. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/models_cache/startup_integration.py +0 -0
  134. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/models_dev_api.json +0 -0
  135. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/models_dev_parser.py +0 -0
  136. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/motion.py +0 -0
  137. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/__init__.py +0 -0
  138. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/agent_skills/__init__.py +0 -0
  139. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/agent_skills/config.py +0 -0
  140. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/agent_skills/discovery.py +0 -0
  141. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/agent_skills/downloader.py +0 -0
  142. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/agent_skills/installer.py +0 -0
  143. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/agent_skills/metadata.py +0 -0
  144. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/agent_skills/prompt_builder.py +0 -0
  145. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/agent_skills/register_callbacks.py +0 -0
  146. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/agent_skills/remote_catalog.py +0 -0
  147. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/agent_skills/skill_catalog.py +0 -0
  148. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/agent_skills/skills_install_menu.py +0 -0
  149. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/agent_skills/skills_menu.py +0 -0
  150. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/__init__.py +0 -0
  151. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-darwin.so +0 -0
  152. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-x86_64-linux-gnu.so +0 -0
  153. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/bm25_scorer.pyx +0 -0
  154. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/consolidation.py +0 -0
  155. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/extraction.py +0 -0
  156. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/lease_lock.py +0 -0
  157. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/memory_injection.py +0 -0
  158. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/register_callbacks.py +0 -0
  159. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/secret_scanner.py +0 -0
  160. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/autonomous_memory/session_scanner.py +0 -0
  161. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/aws_bedrock/__init__.py +0 -0
  162. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/aws_bedrock/config.py +0 -0
  163. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/aws_bedrock/register_callbacks.py +0 -0
  164. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/aws_bedrock/utils.py +0 -0
  165. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/azure_foundry/README.md +0 -0
  166. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/azure_foundry/__init__.py +0 -0
  167. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/azure_foundry/config.py +0 -0
  168. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/azure_foundry/discovery.py +0 -0
  169. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/azure_foundry/register_callbacks.py +0 -0
  170. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/azure_foundry/token.py +0 -0
  171. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/azure_foundry/utils.py +0 -0
  172. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/build_filter/__init__.py +0 -0
  173. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/build_filter/register_callbacks.py +0 -0
  174. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/build_filter/strategies/__init__.py +0 -0
  175. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/build_filter/strategies/build.py +0 -0
  176. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/chatgpt_oauth/__init__.py +0 -0
  177. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/chatgpt_oauth/config.py +0 -0
  178. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  179. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/chatgpt_oauth/register_callbacks.py +0 -0
  180. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/chatgpt_oauth/test_plugin.py +0 -0
  181. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/chatgpt_oauth/utils.py +0 -0
  182. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/checkpointing/__init__.py +0 -0
  183. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/checkpointing/checkpoint_hook.py +0 -0
  184. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/checkpointing/conversation_snapshots.py +0 -0
  185. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/checkpointing/register_callbacks.py +0 -0
  186. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/checkpointing/restore_command.py +0 -0
  187. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/checkpointing/rewind_shortcut.py +0 -0
  188. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/checkpointing/shadow_git.py +0 -0
  189. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/claude_code_hooks/__init__.py +0 -0
  190. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/claude_code_hooks/config.py +0 -0
  191. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/claude_code_hooks/register_callbacks.py +0 -0
  192. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/README.md +0 -0
  193. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/SETUP.md +0 -0
  194. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/__init__.py +0 -0
  195. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/config.py +0 -0
  196. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/fast_mode.py +0 -0
  197. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/prompt_handler.py +0 -0
  198. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/register_callbacks.py +0 -0
  199. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/test_fast_mode.py +0 -0
  200. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/test_plugin.py +0 -0
  201. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  202. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/claude_code_oauth/utils.py +0 -0
  203. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/copilot_auth/__init__.py +0 -0
  204. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/copilot_auth/config.py +0 -0
  205. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/copilot_auth/reasoning_client.py +0 -0
  206. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/copilot_auth/register_callbacks.py +0 -0
  207. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/copilot_auth/utils.py +0 -0
  208. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/custom_commands/__init__.py +0 -0
  209. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/custom_commands/args_injection.py +0 -0
  210. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/custom_commands/command_discovery.py +0 -0
  211. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/custom_commands/command_toml_schema.py +0 -0
  212. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/custom_commands/register_callbacks.py +0 -0
  213. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/customizable_commands/__init__.py +0 -0
  214. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/customizable_commands/register_callbacks.py +0 -0
  215. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/destructive_command_guard/__init__.py +0 -0
  216. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/destructive_command_guard/detector.py +0 -0
  217. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/destructive_command_guard/register_callbacks.py +0 -0
  218. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/example_custom_command/README.md +0 -0
  219. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/example_custom_command/register_callbacks.py +0 -0
  220. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/file_permission_handler/__init__.py +0 -0
  221. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/file_permission_handler/register_callbacks.py +0 -0
  222. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/__init__.py +0 -0
  223. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/classifier.py +0 -0
  224. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/content_detector.py +0 -0
  225. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/dispatcher.py +0 -0
  226. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/registry.py +0 -0
  227. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/__init__.py +0 -0
  228. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-darwin.so +0 -0
  229. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-x86_64-linux-gnu.so +0 -0
  230. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/ast_compressor.pyx +0 -0
  231. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/ast_parser.py +0 -0
  232. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/code.cpython-314-darwin.so +0 -0
  233. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/code.cpython-314-x86_64-linux-gnu.so +0 -0
  234. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/code.pyx +0 -0
  235. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/git.cpython-314-darwin.so +0 -0
  236. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/git.cpython-314-x86_64-linux-gnu.so +0 -0
  237. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/git.pyx +0 -0
  238. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/json_compressor.cpython-314-darwin.so +0 -0
  239. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/json_compressor.pyx +0 -0
  240. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/json_patterns.cpython-314-darwin.so +0 -0
  241. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/json_patterns.pyx +0 -0
  242. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/lint.cpython-314-darwin.so +0 -0
  243. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/lint.cpython-314-x86_64-linux-gnu.so +0 -0
  244. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/lint.pyx +0 -0
  245. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/test.cpython-314-darwin.so +0 -0
  246. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/test.cpython-314-x86_64-linux-gnu.so +0 -0
  247. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/strategies/test.pyx +0 -0
  248. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/filter_engine/verbosity.py +0 -0
  249. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/force_push_guard/__init__.py +0 -0
  250. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/force_push_guard/detector.py +0 -0
  251. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/force_push_guard/register_callbacks.py +0 -0
  252. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/force_push_guard/test_detector.py +0 -0
  253. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/frontend_emitter/__init__.py +0 -0
  254. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/frontend_emitter/emitter.py +0 -0
  255. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/frontend_emitter/register_callbacks.py +0 -0
  256. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/gac/__init__.py +0 -0
  257. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/gac/git_ops.py +0 -0
  258. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/gac/prompt.py +0 -0
  259. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/gac/register_callbacks.py +0 -0
  260. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/hook_creator/__init__.py +0 -0
  261. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/hook_creator/register_callbacks.py +0 -0
  262. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/hook_manager/__init__.py +0 -0
  263. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/hook_manager/config.py +0 -0
  264. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/hook_manager/hooks_menu.py +0 -0
  265. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/hook_manager/register_callbacks.py +0 -0
  266. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/hook_monitor/register_callbacks.py +0 -0
  267. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/mindpack/__init__.py +0 -0
  268. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/mindpack/factory.py +0 -0
  269. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/mindpack/judge.py +0 -0
  270. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/mindpack/memory.py +0 -0
  271. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/mindpack/mindpack_menu.py +0 -0
  272. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/mindpack/orchestration.py +0 -0
  273. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/mindpack/register_callbacks.py +0 -0
  274. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/mindpack/schemas.py +0 -0
  275. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/mindpack/tools.py +0 -0
  276. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/oauth_muse_html.py +0 -0
  277. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/ollama_setup/__init__.py +0 -0
  278. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/ollama_setup/completer.py +0 -0
  279. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/ollama_setup/register_callbacks.py +0 -0
  280. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/plan_command/__init__.py +0 -0
  281. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/plan_command/register_callbacks.py +0 -0
  282. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/plan_mode/__init__.py +0 -0
  283. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/plan_mode/mode_cycling.py +0 -0
  284. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/plan_mode/plan_generation.py +0 -0
  285. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/plan_mode/plan_hooks.py +0 -0
  286. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/plan_mode/plan_mode_tools.py +0 -0
  287. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/plan_mode/register_callbacks.py +0 -0
  288. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/plugin_trust/register_callbacks.py +0 -0
  289. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/policy_engine/__init__.py +0 -0
  290. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/policy_engine/approval_flow_integration.py +0 -0
  291. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/policy_engine/policy_evaluator.py +0 -0
  292. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/policy_engine/policy_file_discovery.py +0 -0
  293. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/policy_engine/policy_toml_schema.py +0 -0
  294. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/policy_engine/register_callbacks.py +0 -0
  295. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/pop_command/__init__.py +0 -0
  296. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/pop_command/register_callbacks.py +0 -0
  297. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/prompt_newline/__init__.py +0 -0
  298. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/prompt_newline/config.py +0 -0
  299. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/prompt_newline/register_callbacks.py +0 -0
  300. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/safety_status/__init__.py +0 -0
  301. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/safety_status/register_callbacks.py +0 -0
  302. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/semantic_compression/__init__.py +0 -0
  303. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/semantic_compression/compressor.py +0 -0
  304. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/semantic_compression/config.py +0 -0
  305. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/semantic_compression/register_callbacks.py +0 -0
  306. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/shell_minimizer/__init__.py +0 -0
  307. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/shell_minimizer/builtin_filters.toml +0 -0
  308. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/shell_minimizer/pipeline.py +0 -0
  309. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/shell_minimizer/primitives.py +0 -0
  310. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/shell_minimizer/register_callbacks.py +0 -0
  311. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/shell_safety/__init__.py +0 -0
  312. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/shell_safety/agent_shell_safety.py +0 -0
  313. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/shell_safety/command_cache.py +0 -0
  314. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/shell_safety/register_callbacks.py +0 -0
  315. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/synthetic_status/__init__.py +0 -0
  316. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/synthetic_status/register_callbacks.py +0 -0
  317. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/synthetic_status/status_api.py +0 -0
  318. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/token_caching/__init__.py +0 -0
  319. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/token_caching/cache_hit_tracking.py +0 -0
  320. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/token_caching/cacheable_prefix_detection.py +0 -0
  321. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/token_caching/register_callbacks.py +0 -0
  322. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/token_caching/stats_display.py +0 -0
  323. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/token_tracking/__init__.py +0 -0
  324. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/token_tracking/database.py +0 -0
  325. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/token_tracking/edit_analyzer.py +0 -0
  326. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/token_tracking/record.py +0 -0
  327. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/token_tracking/register_callbacks.py +0 -0
  328. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/token_tracking/reports.py +0 -0
  329. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/universal_constructor/__init__.py +0 -0
  330. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/universal_constructor/models.py +0 -0
  331. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/universal_constructor/register_callbacks.py +0 -0
  332. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/universal_constructor/registry.py +0 -0
  333. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/universal_constructor/runner.py +0 -0
  334. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/universal_constructor/safety.py +0 -0
  335. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/plugins/universal_constructor/sandbox.py +0 -0
  336. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/provider_identity.py +0 -0
  337. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/pydantic_patches.py +0 -0
  338. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/reopenable_async_client.py +0 -0
  339. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/round_robin_model.py +0 -0
  340. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/secret_storage.py +0 -0
  341. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/security/__init__.py +0 -0
  342. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/security/redaction.cpython-314-darwin.so +0 -0
  343. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/security/redaction.cpython-314-x86_64-linux-gnu.so +0 -0
  344. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/security/redaction.pyx +0 -0
  345. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/session_storage.py +0 -0
  346. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/status_display.py +0 -0
  347. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/stream_parser/__init__.py +0 -0
  348. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/stream_parser/assistant_text_parser.py +0 -0
  349. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/stream_parser/citation_parser.py +0 -0
  350. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/stream_parser/inline_hidden_tag_parser.py +0 -0
  351. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/stream_parser/proposed_plan_parser.py +0 -0
  352. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/stream_parser/stream_text_chunk.py +0 -0
  353. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/stream_parser/stream_text_parser.py +0 -0
  354. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/stream_parser/tagged_line_parser.cpython-314-darwin.so +0 -0
  355. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/stream_parser/tagged_line_parser.pyx +0 -0
  356. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/stream_parser/utf8_stream_parser.cpython-314-darwin.so +0 -0
  357. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/stream_parser/utf8_stream_parser.pyx +0 -0
  358. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/summarization_agent.py +0 -0
  359. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/terminal_utils.cpython-314-darwin.so +0 -0
  360. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/terminal_utils.cpython-314-x86_64-linux-gnu.so +0 -0
  361. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/terminal_utils.pyx +0 -0
  362. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/__init__.py +0 -0
  363. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/ask_user_question/__init__.py +0 -0
  364. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/ask_user_question/constants.py +0 -0
  365. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/ask_user_question/demo_tui.py +0 -0
  366. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/ask_user_question/handler.py +0 -0
  367. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/ask_user_question/models.py +0 -0
  368. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/ask_user_question/registration.py +0 -0
  369. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/ask_user_question/renderers.py +0 -0
  370. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/ask_user_question/terminal_ui.py +0 -0
  371. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/ask_user_question/theme.py +0 -0
  372. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/ask_user_question/tui_loop.py +0 -0
  373. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/background_jobs.py +0 -0
  374. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/browser/__init__.py +0 -0
  375. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/browser/browser_control.py +0 -0
  376. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/browser/browser_interactions.py +0 -0
  377. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/browser/browser_locators.py +0 -0
  378. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/browser/browser_manager.py +0 -0
  379. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/browser/browser_navigation.py +0 -0
  380. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/browser/browser_screenshot.py +0 -0
  381. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/browser/browser_scripts.py +0 -0
  382. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/browser/browser_workflows.py +0 -0
  383. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/chrome_cdp/__init__.py +0 -0
  384. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/chrome_cdp/register_callbacks.py +0 -0
  385. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/command_runner.py +0 -0
  386. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/common.py +0 -0
  387. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/display.py +0 -0
  388. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/file_modifications.py +0 -0
  389. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/file_operations.py +0 -0
  390. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/image_tools.py +0 -0
  391. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/meetin_proxy/__init__.py +0 -0
  392. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/meetin_proxy/capture_addon.py +0 -0
  393. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/meetin_proxy/proxy_manager.py +0 -0
  394. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/meetin_proxy/register_callbacks.py +0 -0
  395. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/path_policy.py +0 -0
  396. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/skills_tools.py +0 -0
  397. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/subagent_context.py +0 -0
  398. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/tools_content.py +0 -0
  399. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/tools/universal_constructor.py +0 -0
  400. {code_muse-0.0.1 → code_muse-0.1.2}/code_muse/uvx_detection.py +0 -0
  401. {code_muse-0.0.1 → 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.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
@@ -1,25 +1,25 @@
1
- """QA Melpomene — Playwright-powered browser automation agent."""
1
+ """QA Iris — Playwright-powered browser automation agent."""
2
2
 
3
3
  from .base_agent import BaseAgent
4
4
 
5
5
 
6
- class QualityAssuranceMelpomeneAgent(BaseAgent):
7
- """QA Melpomene — Advanced browser automation with Playwright."""
6
+ class QualityAssuranceIrisAgent(BaseAgent):
7
+ """QA Iris — Advanced browser automation with Playwright."""
8
8
 
9
9
  @property
10
10
  def name(self) -> str:
11
- return "qa-melpomene"
11
+ return "qa-iris"
12
12
 
13
13
  @property
14
14
  def display_name(self) -> str:
15
- return "QA Melpomene"
15
+ return "QA Iris"
16
16
 
17
17
  @property
18
18
  def description(self) -> str:
19
19
  return "Advanced web browser automation and quality assurance testing using Playwright with visual analysis capabilities"
20
20
 
21
21
  def get_available_tools(self) -> list[str]:
22
- """Get the list of tools available to QA Melpomene."""
22
+ """Get the list of tools available to QA Iris."""
23
23
  return [
24
24
  # Core agent tools
25
25
  # Browser control and initialization
@@ -72,9 +72,9 @@ class QualityAssuranceMelpomeneAgent(BaseAgent):
72
72
  ]
73
73
 
74
74
  def get_system_prompt(self) -> str:
75
- """Get QA Melpomene's specialized system prompt."""
75
+ """Get QA Iris's specialized system prompt."""
76
76
  return """
77
- You are QA Melpomene, an advanced autonomous browser automation and QA testing agent powered by Playwright!
77
+ You are QA Iris, an advanced autonomous browser automation and QA testing agent powered by Playwright!
78
78
 
79
79
  You specialize in:
80
80
  🎯 **Quality Assurance Testing** - automated testing of web applications and user workflows
@@ -35,14 +35,17 @@ def _handle_stream_task_exception(task: asyncio.Task) -> None:
35
35
 
36
36
 
37
37
  def _fire_stream_event(event_type: str, event_data: Any) -> None:
38
- """Fire a stream event callback asynchronously (non-blocking).
38
+ """Fire a stream event callback to registered plugins.
39
39
 
40
- PERF-08: Only fires for structural events (part_start, part_end).
41
- High-frequency part_delta events are skipped since no current plugin
42
- consumes them, and creating 100+ micro-tasks per response is wasteful.
40
+ For high-frequency part_delta events, fires synchronously without
41
+ creating a task to avoid overhead. For structural events (part_start,
42
+ part_end), fires asynchronously via task.
43
43
  """
44
44
  if event_type == "part_delta":
45
+ # Fire synchronously for perf — tps_meter plugin consumes these
46
+ _fire_stream_event_sync(event_type, event_data)
45
47
  return
48
+
46
49
  try:
47
50
  from code_muse import callbacks
48
51
  from code_muse.messaging import get_session_context
@@ -58,6 +61,24 @@ def _fire_stream_event(event_type: str, event_data: Any) -> None:
58
61
  logger.debug("Error firing stream event callback: %s", e)
59
62
 
60
63
 
64
+ def _fire_stream_event_sync(event_type: str, event_data: Any) -> None:
65
+ """Fire stream event callbacks synchronously (no task creation).
66
+
67
+ Used for high-frequency events like part_delta where creating 100+
68
+ asyncio tasks per response would be wasteful.
69
+ """
70
+ try:
71
+ from code_muse import callbacks
72
+ from code_muse.messaging import get_session_context
73
+
74
+ agent_session_id = get_session_context()
75
+ callbacks.on_stream_event_sync(event_type, event_data, agent_session_id)
76
+ except ImportError:
77
+ logger.debug("callbacks or messaging module not available for stream event")
78
+ except Exception as e:
79
+ logger.debug("Error firing stream event callback: %s", e)
80
+
81
+
61
82
  # Module-level console for streaming output
62
83
  # Set via set_streaming_console() to share console with spinner
63
84
  _streaming_console: Console | None = None
@@ -302,11 +323,20 @@ async def event_stream_handler(
302
323
 
303
324
  # PartEndEvent - finish the streaming with a newline
304
325
  elif isinstance(event, PartEndEvent):
326
+ # Determine part type from tracking sets
327
+ _part_end_type = "unknown"
328
+ if event.index in text_parts:
329
+ _part_end_type = "TextPart"
330
+ elif event.index in thinking_parts:
331
+ _part_end_type = "ThinkingPart"
332
+ elif event.index in tool_parts:
333
+ _part_end_type = "ToolCallPart"
305
334
  # Fire stream event callback for part_end
306
335
  _fire_stream_event(
307
336
  "part_end",
308
337
  {
309
338
  "index": event.index,
339
+ "part_type": _part_end_type,
310
340
  "next_part_kind": getattr(event, "next_part_kind", None),
311
341
  },
312
342
  )
@@ -348,7 +348,7 @@ Calliope — epic vision and eloquent structure
348
348
  Clio — memory and historical context
349
349
  Erato — lyric beauty and emotional resonance
350
350
  Euterpe — rhythm and harmonious flow
351
- Melpomene — resilience in the face of error
351
+ Iris — resilience in the face of error
352
352
  Polyhymnia — sacred geometry and deep architecture
353
353
  Terpsichore — graceful movement, interaction, and delightful UX choreography
354
354
  Thalia — joyful insight and accessible wisdom
@@ -541,6 +541,20 @@ async def on_stream_event(
541
541
  )
542
542
 
543
543
 
544
+ def on_stream_event_sync(
545
+ event_type: str, event_data: Any, agent_session_id: str | None = None
546
+ ) -> list[Any]:
547
+ """Synchronous version of on_stream_event — no task creation.
548
+
549
+ Used for high-frequency events (part_delta) where async overhead
550
+ would be wasteful. Callbacks are fired synchronously in the caller's
551
+ thread.
552
+ """
553
+ return _trigger_callbacks_sync(
554
+ "stream_event", event_type, event_data, agent_session_id
555
+ )
556
+
557
+
544
558
  def on_register_tools() -> list[dict[str, Any]]:
545
559
  """Collect custom tool registrations from plugins.
546
560
 
@@ -101,11 +101,11 @@ async def main():
101
101
  import pyfiglet
102
102
 
103
103
  intro_lines = pyfiglet.figlet_format(
104
- "FAST PUPPY", font="ansi_shadow"
104
+ "Muse", font="ansi_shadow"
105
105
  ).split("\n")
106
106
 
107
- # Simple blue to green gradient (top to bottom)
108
- gradient_colors = ["bright_blue", "bright_cyan", "bright_green"]
107
+ # Warm gold to deep red gradient (top to bottom)
108
+ gradient_colors = ["gold1", "dark_orange", "red1"]
109
109
  display_console.print("\n")
110
110
 
111
111
  lines = []
@@ -113,7 +113,7 @@ async def main():
113
113
  for line_num, line in enumerate(intro_lines):
114
114
  if line.strip():
115
115
  # Use line position to determine color
116
- # (top blue, middle cyan, bottom green)
116
+ # (top gold, middle orange, bottom red)
117
117
  color_idx = min(line_num // 2, len(gradient_colors) - 1)
118
118
  color = gradient_colors[color_idx]
119
119
  lines.append(f"[{color}]{line}[/{color}]")
@@ -45,8 +45,8 @@ def get_gradient_banner() -> str:
45
45
  try:
46
46
  import pyfiglet
47
47
 
48
- lines = pyfiglet.figlet_format("CODE PUPPY", font="ansi_shadow").split("\n")
49
- colors = ["bright_blue", "bright_cyan", "bright_green"]
48
+ lines = pyfiglet.figlet_format("Muse", font="ansi_shadow").split("\n")
49
+ colors = ["gold1", "dark_orange", "red1"]
50
50
  result = []
51
51
  for i, line in enumerate(lines):
52
52
  if line.strip():
@@ -54,7 +54,7 @@ def get_gradient_banner() -> str:
54
54
  result.append(f"[{color}]{line}[/{color}]")
55
55
  return "\n".join(result)
56
56
  except ImportError:
57
- return "[bold bright_cyan]═══ CODE PUPPY ═══[/bold bright_cyan]"
57
+ return "[bold bright_red]═══ Muse ═══[/bold bright_red]"
58
58
 
59
59
 
60
60
  # ============================================================================
@@ -7,6 +7,7 @@
7
7
  # YELLOW = '\033[1;33m'
8
8
  # BOLD = '\033[1m'
9
9
  import asyncio
10
+ import contextlib
10
11
  import os
11
12
  import sys
12
13
  from pathlib import Path
@@ -47,6 +48,15 @@ from code_muse.config import (
47
48
  get_value,
48
49
  )
49
50
 
51
+ # Optional TPS meter integration for bottom toolbar
52
+ _tps_state = None
53
+ try:
54
+ from code_muse.plugins.tps_meter.register_callbacks import get_tps_state
55
+
56
+ _tps_state = get_tps_state()
57
+ except ImportError:
58
+ pass
59
+
50
60
 
51
61
  def _sanitize_for_encoding(text: str) -> str:
52
62
  """Remove or replace characters that can't be safely encoded.
@@ -133,8 +143,9 @@ class SetCompleter(Completer):
133
143
  if not stripped_text_for_trigger_check.startswith(self.trigger + " "):
134
144
  return
135
145
 
136
- # Determine the part of the text that is relevant for this completer
137
- # This handles cases like " /set foo" where the trigger isn't at the start of the string
146
+ # Determine the part of the text that is relevant for this completer.
147
+ # This handles cases like " /set foo" where the trigger
148
+ # isn't at the start of the string.
138
149
  actual_trigger_pos = text_before_cursor.find(self.trigger)
139
150
 
140
151
  # Extract the input after /set and space (up to cursor)
@@ -152,7 +163,8 @@ class SetCompleter(Completer):
152
163
 
153
164
  for key in config_keys:
154
165
  if key == "model" or key == "muse_token":
155
- continue # exclude 'model' and 'muse_token' from regular /set completions
166
+ # Exclude 'model' and 'muse_token' from regular /set completions
167
+ continue
156
168
  if key.startswith(text_after_trigger):
157
169
  prev_value = get_value(key)
158
170
  value_part = f" = {prev_value}" if prev_value is not None else " = "
@@ -292,7 +304,8 @@ class CDCompleter(Completer):
292
304
  text_before_cursor = document.text_before_cursor
293
305
  stripped_text = text_before_cursor.lstrip()
294
306
 
295
- # Require a space after /cd before showing completions (consistency with other completers)
307
+ # Require a space after /cd before showing completions
308
+ # (consistency with other completers)
296
309
  if not stripped_text.startswith(self.trigger + " "):
297
310
  return
298
311
 
@@ -321,7 +334,8 @@ class CDCompleter(Completer):
321
334
  original_prefix = None
322
335
 
323
336
  for d in dirnames:
324
- # Build the completion text so we keep the already-typed directory parts.
337
+ # Build the completion text so we keep the
338
+ # already-typed directory parts.
325
339
  if user_prefix and original_prefix:
326
340
  # Restore ~ prefix
327
341
  suggestion = user_prefix + d + os.sep
@@ -451,7 +465,8 @@ class SlashCompleter(Completer):
451
465
  "text": alias,
452
466
  "display": f"/{alias} (alias for /{cmd.name})",
453
467
  "meta": cmd.description,
454
- "sort_key": alias.lower(), # Sort by alias name, not primary command
468
+ "sort_key": alias.lower(),
469
+ # Sort by alias name, not primary command
455
470
  }
456
471
  )
457
472
 
@@ -616,26 +631,26 @@ async def get_input_with_combined_completion(
616
631
  # Ctrl+X keybinding - exit with KeyboardInterrupt for shell command cancellation
617
632
  @bindings.add(Keys.ControlX)
618
633
  def _(event):
619
- try:
634
+ with contextlib.suppress(Exception):
635
+ # Ignore "Return value already set" errors when exit was
636
+ # already called. This happens when user presses multiple
637
+ # exit keys in quick succession.
620
638
  event.app.exit(exception=KeyboardInterrupt)
621
- except Exception:
622
- # Ignore "Return value already set" errors when exit was already called
623
- # This happens when user presses multiple exit keys in quick succession
624
- pass
625
639
 
626
640
  # Escape keybinding - exit with KeyboardInterrupt
627
641
  @bindings.add(Keys.Escape)
628
642
  def _(event):
629
- try:
643
+ with contextlib.suppress(Exception):
644
+ # Ignore "Return value already set" errors when exit
645
+ # was already called.
630
646
  event.app.exit(exception=KeyboardInterrupt)
631
- except Exception:
632
- # Ignore "Return value already set" errors when exit was already called
633
- pass
634
647
 
635
648
  # NOTE: We intentionally do NOT override Ctrl+C here.
636
- # prompt_toolkit's default Ctrl+C handler properly resets the terminal state on Windows.
637
- # Overriding it with event.app.exit(exception=KeyboardInterrupt) can leave the terminal
638
- # in a bad state where characters cannot be typed. Let prompt_toolkit handle Ctrl+C natively.
649
+ # prompt_toolkit's default Ctrl+C handler properly resets the
650
+ # terminal state on Windows. Overriding it with
651
+ # event.app.exit(exception=KeyboardInterrupt) can leave the
652
+ # terminal in a bad state where characters cannot be typed.
653
+ # Let prompt_toolkit handle Ctrl+C natively.
639
654
 
640
655
  # Toggle multiline with Alt+M
641
656
  @bindings.add(Keys.Escape, "m")
@@ -704,9 +719,12 @@ async def get_input_with_combined_completion(
704
719
  buffer.start_completion(select_first=False)
705
720
 
706
721
  # Handle bracketed paste - smart detection for text vs images.
707
- # Most terminals (Windows included!) send Ctrl+V through bracketed paste.
708
- # - If there's meaningful text content → paste as text (drag-and-drop file paths, copied text)
709
- # - If text is empty/whitespace check for clipboard image (image paste on Windows)
722
+ # Most terminals (Windows included!) send Ctrl+V through
723
+ # bracketed paste.
724
+ # - If there's meaningful text content → paste as text
725
+ # (drag-and-drop file paths, copied text)
726
+ # - If text is empty/whitespace → check for clipboard image
727
+ # (image paste on Windows)
710
728
  @bindings.add(Keys.BracketedPaste)
711
729
  def handle_bracketed_paste(event):
712
730
  """Handle bracketed paste - smart text vs image detection."""
@@ -748,8 +766,9 @@ async def get_input_with_combined_completion(
748
766
  placeholder = capture_clipboard_image_to_pending()
749
767
  if placeholder:
750
768
  event.app.current_buffer.insert_text(placeholder + " ")
751
- # The placeholder itself is visible feedback - no need for extra output
752
- # Use bell for audible feedback (works in most terminals)
769
+ # The placeholder itself is visible feedback -
770
+ # no need for extra output. Use bell for audible
771
+ # feedback (works in most terminals).
753
772
  event.app.output.bell()
754
773
  return # Don't also paste text
755
774
  except Exception:
@@ -841,11 +860,27 @@ async def get_input_with_combined_completion(
841
860
  key_bindings=bindings,
842
861
  input_processors=[AttachmentPlaceholderProcessor()],
843
862
  )
844
- # If they pass a string, backward-compat: convert it to formatted_text
845
- if isinstance(prompt_str, str):
846
- from prompt_toolkit.formatted_text import FormattedText
847
863
 
848
- prompt_str = FormattedText([(None, prompt_str)])
864
+ # Build dynamic prompt that includes TPS stats inline (if plugin loaded)
865
+ def _build_prompt():
866
+ if isinstance(prompt_str, str):
867
+ from prompt_toolkit.formatted_text import FormattedText
868
+
869
+ parts = FormattedText([(None, prompt_str)])
870
+ else:
871
+ if hasattr(prompt_str, "__iter__"):
872
+ parts = list(prompt_str)
873
+ else:
874
+ parts = [prompt_str]
875
+
876
+ # Append TPS stats before the arrow if available
877
+ if _tps_state is not None:
878
+ tps_text = _tps_state.get_toolbar_text()
879
+ if tps_text:
880
+ parts.insert(-1, ("class:tps-meter", f" {tps_text} "))
881
+
882
+ return parts
883
+
849
884
  style = Style.from_dict(
850
885
  {
851
886
  # Keys must AVOID the 'class:' prefix – that prefix is used only when
@@ -857,9 +892,10 @@ async def get_input_with_combined_completion(
857
892
  "cwd": "bold ansibrightgreen",
858
893
  "arrow": "bold ansibrightblue",
859
894
  "attachment-placeholder": "italic ansicyan",
895
+ "tps-meter": "italic ansigreen",
860
896
  }
861
897
  )
862
- text = await session.prompt_async(prompt_str, style=style)
898
+ text = await session.prompt_async(_build_prompt, style=style)
863
899
  # NOTE: We used to call update_model_in_input(text) here to handle /model and /m
864
900
  # commands at the prompt level, but that prevented the command handler from running
865
901
  # and emitting success messages. Now we let all /model commands fall through to
@@ -101,25 +101,25 @@ def set_diff_deletion_color(color: str):
101
101
 
102
102
 
103
103
  DEFAULT_BANNER_COLORS = {
104
- "thinking": "deep_sky_blue4", # Sapphire - contemplation
105
- "agent_response": "medium_purple4", # Amethyst - main AI output
106
- "shell_command": "dark_orange3", # Amber - system commands
107
- "read_file": "steel_blue", # Steel - reading files
108
- "edit_file": "dark_goldenrod", # Gold - modifications (legacy)
109
- "create_file": "dark_goldenrod", # Gold - file creation
110
- "replace_in_file": "dark_goldenrod", # Gold - file modifications
111
- "delete_snippet": "dark_goldenrod", # Gold - snippet removal
112
- "grep": "grey37", # Silver - search results
113
- "directory_listing": "dodger_blue2", # Sky - navigation
104
+ "thinking": "dark_violet", # Violet - contemplation
105
+ "agent_response": "purple4", # Deep Purple - main AI output
106
+ "shell_command": "deeppink3", # Deep Pink - system commands
107
+ "read_file": "dark_magenta", # Magenta - reading files
108
+ "edit_file": "purple4", # Purple - modifications
109
+ "create_file": "purple4", # Purple - file creation
110
+ "replace_in_file": "purple4", # Purple - file modifications
111
+ "delete_snippet": "dark_violet", # Violet - snippet removal
112
+ "grep": "medium_purple3", # Light Purple - search results
113
+ "directory_listing": "deeppink4", # Deep Pink - navigation
114
114
  "agent_reasoning": "dark_violet", # Violet - deep thought
115
- "invoke_agent": "deep_pink4", # Ruby - agent invocation
116
- "subagent_response": "sea_green3", # Emerald - sub-agent success
117
- "list_agents": "dark_slate_gray3", # Slate - neutral listing
118
- "universal_constructor": "dark_cyan", # Teal - constructing tools
119
- # Browser/Terminal tools - same color as edit_file (gold)
120
- "terminal_tool": "dark_goldenrod", # Gold - browser terminal operations
121
- # User-initiated shell pass-through (! prefix) - distinct from agent's shell_command
122
- "shell_passthrough": "medium_sea_green", # Green - user's own shell commands
115
+ "invoke_agent": "deeppink3", # Deep Pink - agent invocation
116
+ "subagent_response": "purple3", # Purple - sub-agent success
117
+ "list_agents": "dark_magenta", # Magenta - neutral listing
118
+ "universal_constructor": "dark_violet", # Violet - constructing tools
119
+ # Browser/Terminal tools
120
+ "terminal_tool": "purple4", # Purple - browser terminal operations
121
+ # User-initiated shell pass-through
122
+ "shell_passthrough": "deeppink4", # Deep Pink - user's own shell commands
123
123
  }
124
124
 
125
125
 
@@ -172,7 +172,7 @@ class SubAgentConsoleManager:
172
172
 
173
173
  Args:
174
174
  session_id: Unique identifier for this agent session.
175
- agent_name: Name of the agent (e.g., 'muse', 'qa-melpomene').
175
+ agent_name: Name of the agent (e.g., 'muse', 'qa-iris').
176
176
  model_name: Name of the model being used (e.g., 'gpt-4o').
177
177
  """
178
178
  with self._agents_lock:
@@ -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
+ """