code-muse 0.1.0__tar.gz → 0.1.3__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 (414) hide show
  1. {code_muse-0.1.0 → code_muse-0.1.3}/PKG-INFO +1 -1
  2. code_muse-0.1.3/code_muse/__init__.py +87 -0
  3. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/_compaction.py +116 -5
  4. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/_history.py +8 -1
  5. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/fs_scan_cache/scan_cache_core.cpython-314-darwin.so +0 -0
  6. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/registry.py +1 -1
  7. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/validator.py +2 -0
  8. code_muse-0.1.3/code_muse/models.json +1 -0
  9. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/models_cache/sha256_hash.cpython-314-darwin.so +0 -0
  10. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/__init__.py +27 -0
  11. code_muse-0.1.3/code_muse/plugins/auto_review/__init__.py +6 -0
  12. code_muse-0.1.3/code_muse/plugins/auto_review/cache.py +33 -0
  13. code_muse-0.1.3/code_muse/plugins/auto_review/config.py +35 -0
  14. code_muse-0.1.3/code_muse/plugins/auto_review/register_callbacks.py +122 -0
  15. code_muse-0.1.3/code_muse/plugins/auto_review/review_prompt.py +23 -0
  16. code_muse-0.1.3/code_muse/plugins/auto_review/reviewer.py +314 -0
  17. code_muse-0.1.3/code_muse/plugins/auto_review/visibility.py +45 -0
  18. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-darwin.so +0 -0
  19. code_muse-0.1.3/code_muse/plugins/delegation_manager/__init__.py +24 -0
  20. code_muse-0.1.3/code_muse/plugins/delegation_manager/delegation_manager.py +183 -0
  21. code_muse-0.1.3/code_muse/plugins/delegation_manager/register_callbacks.py +109 -0
  22. code_muse-0.1.3/code_muse/plugins/delegation_manager/supervisor_agent.py +52 -0
  23. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-darwin.so +0 -0
  24. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/code.cpython-314-darwin.so +0 -0
  25. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/git.cpython-314-darwin.so +0 -0
  26. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/lint.cpython-314-darwin.so +0 -0
  27. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/test.cpython-314-darwin.so +0 -0
  28. code_muse-0.1.3/code_muse/plugins/history_store/__init__.py +13 -0
  29. code_muse-0.1.3/code_muse/plugins/history_store/register_callbacks.py +68 -0
  30. code_muse-0.1.3/code_muse/plugins/history_store/store.py +95 -0
  31. code_muse-0.1.3/code_muse/plugins/tool_registry/__init__.py +17 -0
  32. code_muse-0.1.3/code_muse/plugins/tool_registry/definitions.py +150 -0
  33. code_muse-0.1.3/code_muse/plugins/tool_registry/register_callbacks.py +129 -0
  34. code_muse-0.1.3/code_muse/plugins/tool_registry/registry.py +117 -0
  35. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/security/redaction.cpython-314-darwin.so +0 -0
  36. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/tagged_line_parser.cpython-314-darwin.so +0 -0
  37. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/utf8_stream_parser.cpython-314-darwin.so +0 -0
  38. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/terminal_utils.cpython-314-darwin.so +0 -0
  39. {code_muse-0.1.0 → code_muse-0.1.3}/pyproject.toml +1 -1
  40. code_muse-0.1.0/code_muse/__init__.py +0 -26
  41. code_muse-0.1.0/code_muse/models.json +0 -66
  42. code_muse-0.1.0/code_muse/plugins/autonomous_memory/bm25_scorer.cpython-314-x86_64-linux-gnu.so +0 -0
  43. code_muse-0.1.0/code_muse/plugins/filter_engine/strategies/ast_compressor.cpython-314-x86_64-linux-gnu.so +0 -0
  44. code_muse-0.1.0/code_muse/plugins/filter_engine/strategies/code.cpython-314-x86_64-linux-gnu.so +0 -0
  45. code_muse-0.1.0/code_muse/plugins/filter_engine/strategies/git.cpython-314-x86_64-linux-gnu.so +0 -0
  46. code_muse-0.1.0/code_muse/plugins/filter_engine/strategies/json_compressor.cpython-314-darwin.so +0 -0
  47. code_muse-0.1.0/code_muse/plugins/filter_engine/strategies/json_patterns.cpython-314-darwin.so +0 -0
  48. code_muse-0.1.0/code_muse/plugins/filter_engine/strategies/lint.cpython-314-x86_64-linux-gnu.so +0 -0
  49. code_muse-0.1.0/code_muse/plugins/filter_engine/strategies/test.cpython-314-x86_64-linux-gnu.so +0 -0
  50. code_muse-0.1.0/code_muse/security/redaction.cpython-314-x86_64-linux-gnu.so +0 -0
  51. code_muse-0.1.0/code_muse/terminal_utils.cpython-314-x86_64-linux-gnu.so +0 -0
  52. {code_muse-0.1.0 → code_muse-0.1.3}/.gitignore +0 -0
  53. {code_muse-0.1.0 → code_muse-0.1.3}/LICENSE +0 -0
  54. {code_muse-0.1.0 → code_muse-0.1.3}/README.md +0 -0
  55. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/__main__.py +0 -0
  56. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/__init__.py +0 -0
  57. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/_builder.py +0 -0
  58. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/_diagnostics.py +0 -0
  59. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/_key_listeners.py +0 -0
  60. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/_non_streaming_render.py +0 -0
  61. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/_runtime.py +0 -0
  62. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/agent_creator_agent.py +0 -0
  63. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/agent_helios.py +0 -0
  64. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/agent_manager.py +0 -0
  65. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/agent_muse.py +0 -0
  66. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/agent_planning.py +0 -0
  67. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/agent_qa_iris.py +0 -0
  68. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/base_agent.py +0 -0
  69. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/event_stream_handler.py +0 -0
  70. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/json_agent.py +0 -0
  71. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/prompt_v3.py +0 -0
  72. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/agents/subagent_stream_handler.py +0 -0
  73. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/callbacks.py +0 -0
  74. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/chatgpt_codex_client.py +0 -0
  75. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/claude_cache_client.py +0 -0
  76. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/cli_runner/__init__.py +0 -0
  77. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/cli_runner/args.py +0 -0
  78. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/cli_runner/loop.py +0 -0
  79. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/cli_runner/resume.py +0 -0
  80. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/cli_runner/runner.py +0 -0
  81. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/__init__.py +0 -0
  82. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/add_model_menu.py +0 -0
  83. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/agent_menu.py +0 -0
  84. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/attachments.py +0 -0
  85. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/autosave_menu.py +0 -0
  86. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/clipboard.py +0 -0
  87. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/colors_menu.py +0 -0
  88. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/command_handler.py +0 -0
  89. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/command_registry.py +0 -0
  90. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/config_commands.py +0 -0
  91. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/core_commands.py +0 -0
  92. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/diff_menu.py +0 -0
  93. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/file_path_completion.py +0 -0
  94. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/load_context_completion.py +0 -0
  95. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/model_picker_completion.py +0 -0
  96. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/model_settings_menu.py +0 -0
  97. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/onboarding_slides.py +0 -0
  98. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/onboarding_wizard.py +0 -0
  99. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/pagination.py +0 -0
  100. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/pin_command_completion.py +0 -0
  101. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/prompt_toolkit_completion.py +0 -0
  102. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/session_commands.py +0 -0
  103. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/shell_passthrough.py +0 -0
  104. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/skills_completion.py +0 -0
  105. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/types.py +0 -0
  106. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/uc_menu.py +0 -0
  107. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/utils.py +0 -0
  108. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/command_line/wiggum_state.py +0 -0
  109. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/config.py +0 -0
  110. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/config_agent.py +0 -0
  111. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/config_appearance.py +0 -0
  112. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/config_model.py +0 -0
  113. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/config_security.py +0 -0
  114. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/error_logging.py +0 -0
  115. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/evals/__init__.py +0 -0
  116. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/evals/eval_helpers.py +0 -0
  117. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/evals/eval_runner.py +0 -0
  118. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/evals/sample_evals/__init__.py +0 -0
  119. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/evals/sample_evals/eval_frugal_reads.py +0 -0
  120. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/evals/sample_evals/eval_memory_planning.py +0 -0
  121. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/evals/sample_evals/eval_shell_efficiency.py +0 -0
  122. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/evals/sample_evals/eval_tool_masking.py +0 -0
  123. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/fs_scan_cache/__init__.py +0 -0
  124. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/fs_scan_cache/invalidation_hooks.py +0 -0
  125. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/fs_scan_cache/scan_cache_core.pyx +0 -0
  126. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/fs_scan_cache/tool_integration.py +0 -0
  127. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/fs_scan_cache/ttl_policy.py +0 -0
  128. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/gemini_code_assist.py +0 -0
  129. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/gemini_model.py +0 -0
  130. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/README.md +0 -0
  131. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/__init__.py +0 -0
  132. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/aliases.py +0 -0
  133. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/engine.py +0 -0
  134. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/executor.py +0 -0
  135. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/matcher.py +0 -0
  136. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/models.py +0 -0
  137. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/hook_engine/trust.py +0 -0
  138. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/http_utils.py +0 -0
  139. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/keymap.py +0 -0
  140. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/list_filtering.py +0 -0
  141. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/main.py +0 -0
  142. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/__init__.py +0 -0
  143. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/bus.py +0 -0
  144. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/commands.py +0 -0
  145. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/markdown_patches.py +0 -0
  146. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/message_queue.py +0 -0
  147. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/messages.py +0 -0
  148. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/queue_console.py +0 -0
  149. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/renderers.py +0 -0
  150. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/rich_renderer.py +0 -0
  151. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/shimmer.py +0 -0
  152. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/spinner/__init__.py +0 -0
  153. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/spinner/console_spinner.py +0 -0
  154. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/spinner/spinner_base.py +0 -0
  155. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/messaging/subagent_console.py +0 -0
  156. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/model_factory.py +0 -0
  157. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/model_switching.py +0 -0
  158. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/model_utils.py +0 -0
  159. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/models_cache/__init__.py +0 -0
  160. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/models_cache/blocking_lru_cache.py +0 -0
  161. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/models_cache/cache_writer.py +0 -0
  162. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/models_cache/sha256_hash.pyx +0 -0
  163. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/models_cache/startup_integration.py +0 -0
  164. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/models_dev_api.json +0 -0
  165. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/models_dev_parser.py +0 -0
  166. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/motion.py +0 -0
  167. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/__init__.py +0 -0
  168. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/config.py +0 -0
  169. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/discovery.py +0 -0
  170. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/downloader.py +0 -0
  171. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/installer.py +0 -0
  172. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/metadata.py +0 -0
  173. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/prompt_builder.py +0 -0
  174. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/register_callbacks.py +0 -0
  175. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/remote_catalog.py +0 -0
  176. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/skill_catalog.py +0 -0
  177. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/skills_install_menu.py +0 -0
  178. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/agent_skills/skills_menu.py +0 -0
  179. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/__init__.py +0 -0
  180. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/bm25_scorer.pyx +0 -0
  181. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/consolidation.py +0 -0
  182. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/extraction.py +0 -0
  183. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/lease_lock.py +0 -0
  184. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/memory_injection.py +0 -0
  185. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/register_callbacks.py +0 -0
  186. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/secret_scanner.py +0 -0
  187. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/autonomous_memory/session_scanner.py +0 -0
  188. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/aws_bedrock/__init__.py +0 -0
  189. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/aws_bedrock/config.py +0 -0
  190. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/aws_bedrock/register_callbacks.py +0 -0
  191. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/aws_bedrock/utils.py +0 -0
  192. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/README.md +0 -0
  193. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/__init__.py +0 -0
  194. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/config.py +0 -0
  195. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/discovery.py +0 -0
  196. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/register_callbacks.py +0 -0
  197. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/token.py +0 -0
  198. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/azure_foundry/utils.py +0 -0
  199. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/build_filter/__init__.py +0 -0
  200. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/build_filter/register_callbacks.py +0 -0
  201. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/build_filter/strategies/__init__.py +0 -0
  202. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/build_filter/strategies/build.py +0 -0
  203. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/__init__.py +0 -0
  204. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/config.py +0 -0
  205. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  206. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/register_callbacks.py +0 -0
  207. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/test_plugin.py +0 -0
  208. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/chatgpt_oauth/utils.py +0 -0
  209. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/checkpointing/__init__.py +0 -0
  210. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/checkpointing/checkpoint_hook.py +0 -0
  211. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/checkpointing/conversation_snapshots.py +0 -0
  212. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/checkpointing/register_callbacks.py +0 -0
  213. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/checkpointing/restore_command.py +0 -0
  214. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/checkpointing/rewind_shortcut.py +0 -0
  215. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/checkpointing/shadow_git.py +0 -0
  216. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_hooks/__init__.py +0 -0
  217. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_hooks/config.py +0 -0
  218. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_hooks/register_callbacks.py +0 -0
  219. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/README.md +0 -0
  220. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/SETUP.md +0 -0
  221. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/__init__.py +0 -0
  222. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/config.py +0 -0
  223. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/fast_mode.py +0 -0
  224. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/prompt_handler.py +0 -0
  225. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/register_callbacks.py +0 -0
  226. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/test_fast_mode.py +0 -0
  227. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/test_plugin.py +0 -0
  228. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  229. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/claude_code_oauth/utils.py +0 -0
  230. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/__init__.py +0 -0
  231. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/config.py +0 -0
  232. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/reasoning_client.py +0 -0
  233. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/register_callbacks.py +0 -0
  234. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/copilot_auth/utils.py +0 -0
  235. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/custom_commands/__init__.py +0 -0
  236. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/custom_commands/args_injection.py +0 -0
  237. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/custom_commands/command_discovery.py +0 -0
  238. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/custom_commands/command_toml_schema.py +0 -0
  239. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/custom_commands/register_callbacks.py +0 -0
  240. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/customizable_commands/__init__.py +0 -0
  241. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/customizable_commands/register_callbacks.py +0 -0
  242. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/destructive_command_guard/__init__.py +0 -0
  243. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/destructive_command_guard/detector.py +0 -0
  244. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/destructive_command_guard/register_callbacks.py +0 -0
  245. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/example_custom_command/README.md +0 -0
  246. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/example_custom_command/register_callbacks.py +0 -0
  247. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/file_permission_handler/__init__.py +0 -0
  248. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/file_permission_handler/register_callbacks.py +0 -0
  249. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/__init__.py +0 -0
  250. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/classifier.py +0 -0
  251. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/content_detector.py +0 -0
  252. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/dispatcher.py +0 -0
  253. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/register_callbacks.py +0 -0
  254. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/registry.py +0 -0
  255. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/__init__.py +0 -0
  256. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/ast_compressor.pyx +0 -0
  257. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/ast_parser.py +0 -0
  258. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/code.pyx +0 -0
  259. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/git.pyx +0 -0
  260. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/json_compressor.pyx +0 -0
  261. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/json_patterns.pyx +0 -0
  262. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/lint.pyx +0 -0
  263. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/strategies/test.pyx +0 -0
  264. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/filter_engine/verbosity.py +0 -0
  265. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/force_push_guard/__init__.py +0 -0
  266. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/force_push_guard/detector.py +0 -0
  267. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/force_push_guard/register_callbacks.py +0 -0
  268. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/force_push_guard/test_detector.py +0 -0
  269. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/frontend_emitter/__init__.py +0 -0
  270. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/frontend_emitter/emitter.py +0 -0
  271. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/frontend_emitter/register_callbacks.py +0 -0
  272. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/gac/__init__.py +0 -0
  273. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/gac/git_ops.py +0 -0
  274. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/gac/prompt.py +0 -0
  275. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/gac/register_callbacks.py +0 -0
  276. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/hook_creator/__init__.py +0 -0
  277. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/hook_creator/register_callbacks.py +0 -0
  278. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/hook_manager/__init__.py +0 -0
  279. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/hook_manager/config.py +0 -0
  280. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/hook_manager/hooks_menu.py +0 -0
  281. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/hook_manager/register_callbacks.py +0 -0
  282. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/hook_monitor/register_callbacks.py +0 -0
  283. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/mindpack/__init__.py +0 -0
  284. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/mindpack/factory.py +0 -0
  285. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/mindpack/judge.py +0 -0
  286. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/mindpack/memory.py +0 -0
  287. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/mindpack/mindpack_menu.py +0 -0
  288. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/mindpack/orchestration.py +0 -0
  289. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/mindpack/register_callbacks.py +0 -0
  290. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/mindpack/schemas.py +0 -0
  291. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/mindpack/tools.py +0 -0
  292. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/oauth_muse_html.py +0 -0
  293. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/ollama_setup/__init__.py +0 -0
  294. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/ollama_setup/completer.py +0 -0
  295. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/ollama_setup/register_callbacks.py +0 -0
  296. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/plan_command/__init__.py +0 -0
  297. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/plan_command/register_callbacks.py +0 -0
  298. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/plan_mode/__init__.py +0 -0
  299. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/plan_mode/mode_cycling.py +0 -0
  300. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/plan_mode/plan_generation.py +0 -0
  301. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/plan_mode/plan_hooks.py +0 -0
  302. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/plan_mode/plan_mode_tools.py +0 -0
  303. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/plan_mode/register_callbacks.py +0 -0
  304. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/plugin_trust/register_callbacks.py +0 -0
  305. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/policy_engine/__init__.py +0 -0
  306. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/policy_engine/approval_flow_integration.py +0 -0
  307. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/policy_engine/policy_evaluator.py +0 -0
  308. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/policy_engine/policy_file_discovery.py +0 -0
  309. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/policy_engine/policy_toml_schema.py +0 -0
  310. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/policy_engine/register_callbacks.py +0 -0
  311. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/pop_command/__init__.py +0 -0
  312. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/pop_command/register_callbacks.py +0 -0
  313. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/prompt_newline/__init__.py +0 -0
  314. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/prompt_newline/config.py +0 -0
  315. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/prompt_newline/register_callbacks.py +0 -0
  316. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/safety_status/__init__.py +0 -0
  317. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/safety_status/register_callbacks.py +0 -0
  318. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/semantic_compression/__init__.py +0 -0
  319. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/semantic_compression/compressor.py +0 -0
  320. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/semantic_compression/config.py +0 -0
  321. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/semantic_compression/register_callbacks.py +0 -0
  322. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/__init__.py +0 -0
  323. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/builtin_filters.toml +0 -0
  324. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/pipeline.py +0 -0
  325. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/primitives.py +0 -0
  326. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/shell_minimizer/register_callbacks.py +0 -0
  327. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/shell_safety/__init__.py +0 -0
  328. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/shell_safety/agent_shell_safety.py +0 -0
  329. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/shell_safety/command_cache.py +0 -0
  330. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/shell_safety/register_callbacks.py +0 -0
  331. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/synthetic_status/__init__.py +0 -0
  332. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/synthetic_status/register_callbacks.py +0 -0
  333. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/synthetic_status/status_api.py +0 -0
  334. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_caching/__init__.py +0 -0
  335. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_caching/cache_hit_tracking.py +0 -0
  336. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_caching/cacheable_prefix_detection.py +0 -0
  337. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_caching/register_callbacks.py +0 -0
  338. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_caching/stats_display.py +0 -0
  339. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_tracking/__init__.py +0 -0
  340. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_tracking/database.py +0 -0
  341. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_tracking/edit_analyzer.py +0 -0
  342. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_tracking/record.py +0 -0
  343. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_tracking/register_callbacks.py +0 -0
  344. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/token_tracking/reports.py +0 -0
  345. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/tps_meter/__init__.py +0 -0
  346. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/tps_meter/register_callbacks.py +0 -0
  347. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/__init__.py +0 -0
  348. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/models.py +0 -0
  349. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/register_callbacks.py +0 -0
  350. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/registry.py +0 -0
  351. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/runner.py +0 -0
  352. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/safety.py +0 -0
  353. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/plugins/universal_constructor/sandbox.py +0 -0
  354. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/provider_identity.py +0 -0
  355. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/pydantic_patches.py +0 -0
  356. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/reopenable_async_client.py +0 -0
  357. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/round_robin_model.py +0 -0
  358. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/secret_storage.py +0 -0
  359. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/security/__init__.py +0 -0
  360. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/security/redaction.pyx +0 -0
  361. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/session_storage.py +0 -0
  362. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/status_display.py +0 -0
  363. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/__init__.py +0 -0
  364. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/assistant_text_parser.py +0 -0
  365. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/citation_parser.py +0 -0
  366. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/inline_hidden_tag_parser.py +0 -0
  367. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/proposed_plan_parser.py +0 -0
  368. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/stream_text_chunk.py +0 -0
  369. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/stream_text_parser.py +0 -0
  370. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/tagged_line_parser.pyx +0 -0
  371. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/stream_parser/utf8_stream_parser.pyx +0 -0
  372. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/summarization_agent.py +0 -0
  373. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/terminal_utils.pyx +0 -0
  374. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/__init__.py +0 -0
  375. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/agent_tools.py +0 -0
  376. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/__init__.py +0 -0
  377. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/constants.py +0 -0
  378. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/demo_tui.py +0 -0
  379. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/handler.py +0 -0
  380. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/models.py +0 -0
  381. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/registration.py +0 -0
  382. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/renderers.py +0 -0
  383. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/terminal_ui.py +0 -0
  384. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/theme.py +0 -0
  385. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/ask_user_question/tui_loop.py +0 -0
  386. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/background_jobs.py +0 -0
  387. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/browser/__init__.py +0 -0
  388. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/browser/browser_control.py +0 -0
  389. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/browser/browser_interactions.py +0 -0
  390. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/browser/browser_locators.py +0 -0
  391. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/browser/browser_manager.py +0 -0
  392. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/browser/browser_navigation.py +0 -0
  393. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/browser/browser_screenshot.py +0 -0
  394. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/browser/browser_scripts.py +0 -0
  395. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/browser/browser_workflows.py +0 -0
  396. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/chrome_cdp/__init__.py +0 -0
  397. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/chrome_cdp/register_callbacks.py +0 -0
  398. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/command_runner.py +0 -0
  399. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/common.py +0 -0
  400. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/display.py +0 -0
  401. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/file_modifications.py +0 -0
  402. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/file_operations.py +0 -0
  403. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/image_tools.py +0 -0
  404. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/meetin_proxy/__init__.py +0 -0
  405. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/meetin_proxy/capture_addon.py +0 -0
  406. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/meetin_proxy/proxy_manager.py +0 -0
  407. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/meetin_proxy/register_callbacks.py +0 -0
  408. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/path_policy.py +0 -0
  409. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/skills_tools.py +0 -0
  410. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/subagent_context.py +0 -0
  411. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/tools_content.py +0 -0
  412. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/tools/universal_constructor.py +0 -0
  413. {code_muse-0.1.0 → code_muse-0.1.3}/code_muse/uvx_detection.py +0 -0
  414. {code_muse-0.1.0 → code_muse-0.1.3}/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.0
3
+ Version: 0.1.3
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,87 @@
1
+ import importlib.metadata
2
+ import logging
3
+ import os
4
+ from pathlib import Path
5
+
6
+ logger = logging.getLogger(__name__)
7
+
8
+ # Biscuit was here.
9
+ try:
10
+ _detected_version = importlib.metadata.version("code-muse")
11
+ # Ensure we never end up with None or empty string
12
+ __version__ = _detected_version if _detected_version else "0.0.0-dev"
13
+ except Exception:
14
+ # Fallback for dev environments where metadata might not be available
15
+ __version__ = "0.0.0-dev"
16
+
17
+
18
+ def _rebuild_stale_cython_modules(package_root: Path) -> None:
19
+ """Delete stale compiled extensions so pyximport rebuilds them.
20
+
21
+ Checks both file mtime AND embedded module name to catch extensions
22
+ compiled from an older package version (e.g. after a rename from
23
+ ``code_puppy`` to ``code_muse``).
24
+
25
+ Safe no-op when no ``.pyx`` files exist or no stale extensions found.
26
+ """
27
+ if not list(package_root.rglob("*.pyx")):
28
+ return
29
+
30
+ import importlib.util
31
+
32
+ # Read first 4 KB of each .so to check for old module names.
33
+ # Compiled Cython modules embed their source package path (e.g.
34
+ # ``code_puppy.plugins.…``) in the binary.
35
+ _OLD_NAMES = [b"code_puppy", b"code.puppy"]
36
+
37
+ stale_count = 0
38
+ for pyx_file in package_root.rglob("*.pyx"):
39
+ pyx_mtime = pyx_file.stat().st_mtime
40
+ parent = pyx_file.parent
41
+ stem = pyx_file.stem
42
+
43
+ for so_file in parent.glob(f"{stem}*.so"):
44
+ if not so_file.is_file():
45
+ continue
46
+
47
+ # 1. Mtime check: .so is older than .pyx source
48
+ # 2. Content check: .so still references old package name
49
+ is_stale = so_file.stat().st_mtime < pyx_mtime
50
+ if not is_stale:
51
+ try:
52
+ header = so_file.read_bytes()[:4096]
53
+ is_stale = any(old in header for old in _OLD_NAMES)
54
+ except OSError:
55
+ pass
56
+
57
+ if is_stale:
58
+ try:
59
+ so_file.unlink()
60
+ stale_count += 1
61
+ logger.debug("Removed stale extension: %s", so_file)
62
+ except OSError:
63
+ pass
64
+
65
+ if stale_count:
66
+ logger.info(
67
+ "Removed %d stale Cython extension(s) — will rebuild on next import",
68
+ stale_count,
69
+ )
70
+
71
+
72
+ # Enable Cython JIT compilation for .pyx modules throughout the package.
73
+ _CYTHON_AVAILABLE = False
74
+ _PACKAGE_ROOT = Path(__file__).parent
75
+ try:
76
+ import pyximport
77
+
78
+ pyximport.install(language_level=3, build_in_temp=True, inplace=True)
79
+ _CYTHON_AVAILABLE = True
80
+ _rebuild_stale_cython_modules(_PACKAGE_ROOT)
81
+ except Exception:
82
+ pass # Cython not available — .pyx modules will need pre-compiled extension files
83
+
84
+ # Scan the package tree for .pyx modules and record Cython status.
85
+ _pyx_files = list(_PACKAGE_ROOT.rglob("*.pyx"))
86
+ PYX_MODULE_COUNT: int = len(_pyx_files)
87
+ CYTHON_ENABLED: bool = _CYTHON_AVAILABLE and PYX_MODULE_COUNT > 0
@@ -21,6 +21,7 @@ from pydantic_ai.messages import (
21
21
  ModelResponse,
22
22
  TextPart,
23
23
  ThinkingPart,
24
+ ToolReturnPart,
24
25
  )
25
26
 
26
27
  from code_muse.agents._history import (
@@ -49,7 +50,8 @@ _SUMMARIZATION_INSTRUCTIONS = (
49
50
  " as well as user queries, etc. Summarize the contents of these steps."
50
51
  " The high level details should remain but the bulk of the content from tool-call"
51
52
  " responses should be compacted and summarized. For example if you see a tool-call"
52
- " reading a file, and the file contents are large, then in your summary you might just"
53
+ " reading a file, and the file contents are large, then in your"
54
+ " summary you might just"
53
55
  " write: * used read_file on space_invaders.cpp - contents removed."
54
56
  "\n Make sure your result is a bulleted list of all steps and interactions."
55
57
  "\n\nNOTE: This summary represents older conversation history. "
@@ -147,7 +149,8 @@ def truncate(
147
149
  model_name: str | None = None,
148
150
  cache: CompactionCache | None = None,
149
151
  ) -> list[ModelMessage]:
150
- """Drop middle messages, keeping system prompt, optional thinking, and recent tail."""
152
+ """Drop middle messages, keeping system prompt, optional thinking,
153
+ and recent tail."""
151
154
  import queue
152
155
 
153
156
  if not messages:
@@ -223,7 +226,8 @@ def _run_summarization_core(
223
226
 
224
227
  if not isinstance(new_messages, list):
225
228
  emit_warning(
226
- "Summarization agent returned non-list output; wrapping into message request"
229
+ "Summarization agent returned non-list output;"
230
+ " wrapping into message request"
227
231
  )
228
232
  new_messages = [ModelRequest([TextPart(str(new_messages))])]
229
233
 
@@ -425,7 +429,7 @@ def make_history_processor(agent: Any) -> Callable[..., list[ModelMessage]]:
425
429
  1. Fires ``on_message_history_processor_start``.
426
430
  2. Merges any incoming messages not already in ``agent._message_history``
427
431
  (preserving the last-message regardless of compacted-hash collisions).
428
- 3. Runs ``compact(...)`` if we're over threshold.
432
+ 3. Runs ``compact_with_tool_truncation(...)`` if we're over threshold — truncates older tool-result content first, then falls through to compact().
429
433
  4. Records dropped-message hashes in ``agent._compacted_message_hashes``.
430
434
  5. Strips empty ThinkingParts.
431
435
  6. Trims trailing ModelResponse messages so history ends with a ModelRequest.
@@ -467,7 +471,7 @@ def make_history_processor(agent: Any) -> Callable[..., list[ModelMessage]]:
467
471
  history.append(msg)
468
472
  messages_added += 1
469
473
 
470
- new_history, dropped = compact(
474
+ new_history, dropped = compact_with_tool_truncation(
471
475
  agent,
472
476
  history,
473
477
  agent._get_model_context_length(),
@@ -504,3 +508,110 @@ def make_history_processor(agent: Any) -> Callable[..., list[ModelMessage]]:
504
508
  return cleaned
505
509
 
506
510
  return history_processor
511
+
512
+
513
+ # --- Phase 3: Enhanced History Compression ---
514
+ PROTECTION_ZONE_MESSAGES = 6 # Last N messages never pruned
515
+ RECENT_TOOL_RESULTS_TO_KEEP = 7 # Keep last N tool results in full
516
+
517
+
518
+ def _truncate_tool_result_content(
519
+ messages: list[ModelMessage],
520
+ keep_count: int = RECENT_TOOL_RESULTS_TO_KEEP,
521
+ ) -> list[ModelMessage]:
522
+ """Replace older tool result content with a truncation marker.
523
+
524
+ Keeps the last `keep_count` tool results in full.
525
+ Older tool results get their content replaced with a short notice.
526
+ The structural pairing (tool_call ↔ tool_return) stays intact.
527
+
528
+ Only affects ToolReturnPart content — all other parts preserved.
529
+ """
530
+ # Reverse-scan: collect tool_call_ids of the most recent N tool results
531
+ protected_ids: set[str] = set()
532
+ seen = 0
533
+ for i in range(len(messages) - 1, -1, -1):
534
+ msg = messages[i]
535
+ if isinstance(msg, ModelRequest):
536
+ for part in msg.parts:
537
+ if isinstance(part, ToolReturnPart):
538
+ seen += 1
539
+ if seen <= keep_count:
540
+ protected_ids.add(part.tool_call_id)
541
+
542
+ # Forward-pass: truncate old results
543
+ result: list[ModelMessage] = []
544
+ TRUNCATION_MSG = "[Result truncated — re-call tool if full output is needed]"
545
+
546
+ for msg in messages:
547
+ if not isinstance(msg, ModelRequest):
548
+ result.append(msg)
549
+ continue
550
+ new_parts = []
551
+ for part in msg.parts:
552
+ if (
553
+ isinstance(part, ToolReturnPart)
554
+ and part.tool_call_id not in protected_ids
555
+ ):
556
+ # Replace content, keep structure
557
+ try:
558
+ if hasattr(part, "model_copy"):
559
+ new_parts.append(
560
+ part.model_copy(update={"content": TRUNCATION_MSG})
561
+ )
562
+ else:
563
+ new_parts.append(part)
564
+ except Exception:
565
+ new_parts.append(part)
566
+ else:
567
+ new_parts.append(part)
568
+ result.append(ModelRequest(parts=new_parts))
569
+
570
+ return result
571
+
572
+
573
+ def compact_with_tool_truncation(
574
+ agent: Any,
575
+ messages: list[ModelMessage],
576
+ model_max: int,
577
+ context_overhead: int,
578
+ ) -> tuple[list[ModelMessage], list[ModelMessage]]:
579
+ """Enhanced compact() that first truncates old tool results,
580
+ then runs normal compaction.
581
+
582
+ This is the Phase 3 replacement for compact(). It:
583
+ 1. Truncates old tool result content first (always reduces tokens)
584
+ 2. Then runs the existing compact() logic on the cleaner history
585
+ 3. Falls through to summarization/truncation if still over threshold
586
+
587
+ Returns: (new_messages, dropped_messages_for_hash_tracking)
588
+ """
589
+ # Step 1: Truncate old tool results (always safe, always reduces tokens)
590
+ truncated = _truncate_tool_result_content(messages)
591
+
592
+ # Step 2: Run existing compaction on the already-trimmed history
593
+ # The existing compact() handles summarization or truncation if still over threshold
594
+ return compact(agent, truncated, model_max, context_overhead)
595
+
596
+
597
+ def _protect_zone_messages(
598
+ messages: list[ModelMessage],
599
+ zone_size: int = PROTECTION_ZONE_MESSAGES,
600
+ ) -> tuple[list[ModelMessage], list[ModelMessage]]:
601
+ """Split messages into (middle_for_summarization, protected_tail).
602
+
603
+ The last `zone_size` messages (or fewer if history is short) are protected
604
+ and never summarized/truncated. Returns (middle, protected).
605
+
606
+ System message (index 0) is always protected.
607
+ """
608
+ if len(messages) <= zone_size + 1:
609
+ return [], messages
610
+
611
+ split_idx = max(1, len(messages) - zone_size)
612
+ # Adjust split to not sever tool_call/tool_return pairs (use existing logic)
613
+ adjusted_idx = _find_safe_split_index(messages, split_idx)
614
+
615
+ middle = messages[1:adjusted_idx]
616
+ protected = messages[:1] + messages[adjusted_idx:]
617
+ return middle, protected
@@ -20,7 +20,7 @@ from typing import Any
20
20
 
21
21
  import pydantic
22
22
  from pydantic_ai import BinaryContent
23
- from pydantic_ai.messages import ModelMessage
23
+ from pydantic_ai.messages import ModelMessage, ModelRequest, ToolReturnPart
24
24
 
25
25
 
26
26
  def _json_safe(obj):
@@ -380,3 +380,10 @@ class CompactionCache:
380
380
  ) -> int:
381
381
  """Sum estimated tokens across all messages using the cache."""
382
382
  return sum(self.estimate_tokens(m, model_name) for m in messages)
383
+
384
+
385
+ def is_tool_result_message(msg: ModelMessage) -> bool:
386
+ """Check if a message contains tool return parts."""
387
+ if isinstance(msg, ModelRequest):
388
+ return any(isinstance(p, ToolReturnPart) for p in msg.parts)
389
+ return False
@@ -56,7 +56,7 @@ def build_registry_from_config(
56
56
  if not isinstance(group, dict):
57
57
  continue
58
58
 
59
- matcher = group.get("matcher", "*")
59
+ matcher = group.get("matcher") or "*"
60
60
  hooks_data = group.get("hooks", [])
61
61
 
62
62
  for hook_data in hooks_data:
@@ -60,6 +60,8 @@ def validate_hooks_config(config: dict[str, Any]) -> tuple[bool, list[str]]:
60
60
 
61
61
  if "matcher" not in group:
62
62
  errors.append(f"'{event_type}[{i}]' missing required field 'matcher'")
63
+ elif not group["matcher"]:
64
+ errors.append(f"'{event_type}[{i}]' matcher cannot be empty string — use '*' to match all events")
63
65
 
64
66
  if "hooks" not in group:
65
67
  errors.append(f"'{event_type}[{i}]' missing required field 'hooks'")
@@ -0,0 +1 @@
1
+ {}
@@ -28,6 +28,30 @@ USER_PLUGINS_DIR = Path.home() / ".muse" / "plugins"
28
28
  # Track if plugins have already been loaded to prevent duplicate registration
29
29
  _PLUGINS_LOADED = False
30
30
 
31
+ def _clean_stale_pycache(root_dir: Path) -> None:
32
+ """Remove stale __pycache__ directories to prevent import ghosts.
33
+
34
+ Deletes any __pycache__ directory whose containing .py file no longer
35
+ exists. This prevents stale bytecode from old package names (e.g.
36
+ after a rename) from causing ``No module named X`` errors.
37
+ """
38
+ import shutil
39
+
40
+ for pycache_dir in list(root_dir.rglob("__pycache__")):
41
+ if not pycache_dir.is_dir():
42
+ continue
43
+ # Check if any .py file in parent directory still exists
44
+ parent = pycache_dir.parent
45
+ has_py_files = any(parent.glob("*.py"))
46
+ if not has_py_files:
47
+ # Parent dir has no .py files anymore — likely a removed module
48
+ try:
49
+ shutil.rmtree(pycache_dir)
50
+ logger.debug("Cleaned stale __pycache__: %s", pycache_dir)
51
+ except OSError:
52
+ pass
53
+
54
+
31
55
  # ---------------------------------------------------------------------------
32
56
  # Trust manifest helpers
33
57
  # ---------------------------------------------------------------------------
@@ -420,6 +444,9 @@ def load_plugin_callbacks() -> dict[str, list[str]]:
420
444
  NOTE: This function is idempotent - calling it multiple times will only
421
445
  load plugins once. Subsequent calls return empty lists.
422
446
  """
447
+ # Clean stale __pycache__ to prevent import ghosts from renames
448
+ _clean_stale_pycache(Path(__file__).parent)
449
+
423
450
  global _PLUGINS_LOADED
424
451
 
425
452
  # Prevent duplicate loading - plugins register callbacks at import time,
@@ -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
+ """