code-context-control 2.40.0__tar.gz → 2.41.0__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 (224) hide show
  1. {code_context_control-2.40.0 → code_context_control-2.41.0}/PKG-INFO +1 -1
  2. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/c3.py +1 -1
  3. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/shell.py +71 -1
  4. {code_context_control-2.40.0 → code_context_control-2.41.0}/code_context_control.egg-info/PKG-INFO +1 -1
  5. {code_context_control-2.40.0 → code_context_control-2.41.0}/pyproject.toml +1 -1
  6. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_c3_shell.py +75 -0
  7. {code_context_control-2.40.0 → code_context_control-2.41.0}/LICENSE +0 -0
  8. {code_context_control-2.40.0 → code_context_control-2.41.0}/README.md +0 -0
  9. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/__init__.py +0 -0
  10. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/_hook_utils.py +0 -0
  11. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/commands/__init__.py +0 -0
  12. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/commands/common.py +0 -0
  13. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/commands/parser.py +0 -0
  14. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/docs.html +0 -0
  15. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/edits.html +0 -0
  16. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/guide/bitbucket.html +0 -0
  17. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/guide/getting-started.html +0 -0
  18. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/guide/index.html +0 -0
  19. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/guide/oracle.html +0 -0
  20. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/guide/shared.css +0 -0
  21. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/guide/tools.html +0 -0
  22. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/guide/workflow.html +0 -0
  23. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_auto_snapshot.py +0 -0
  24. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_c3_signal.py +0 -0
  25. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_c3read.py +0 -0
  26. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_edit_ledger.py +0 -0
  27. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_edit_unlock.py +0 -0
  28. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_filter.py +0 -0
  29. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_ghost_files.py +0 -0
  30. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_pretool_enforce.py +0 -0
  31. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_read.py +0 -0
  32. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_session_stats.py +0 -0
  33. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_terse_advisor.py +0 -0
  34. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hub.html +0 -0
  35. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hub_server.py +0 -0
  36. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/mcp_proxy.py +0 -0
  37. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/mcp_server.py +0 -0
  38. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/server.py +0 -0
  39. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/__init__.py +0 -0
  40. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/_helpers.py +0 -0
  41. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/agent.py +0 -0
  42. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/bitbucket.py +0 -0
  43. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/compress.py +0 -0
  44. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/delegate.py +0 -0
  45. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/edit.py +0 -0
  46. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/edits.py +0 -0
  47. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/filter.py +0 -0
  48. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/impact.py +0 -0
  49. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/memory.py +0 -0
  50. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/project.py +0 -0
  51. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/read.py +0 -0
  52. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/search.py +0 -0
  53. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/session.py +0 -0
  54. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/status.py +0 -0
  55. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/validate.py +0 -0
  56. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/api.js +0 -0
  57. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/app.js +0 -0
  58. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/bitbucket.js +0 -0
  59. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/chat.js +0 -0
  60. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/dashboard.js +0 -0
  61. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/edits.js +0 -0
  62. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/instructions.js +0 -0
  63. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/memory.js +0 -0
  64. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/sessions.js +0 -0
  65. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/settings.js +0 -0
  66. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/sidebar.js +0 -0
  67. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/icons.js +0 -0
  68. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/shared.js +0 -0
  69. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/theme.js +0 -0
  70. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui.html +0 -0
  71. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui_legacy.html +0 -0
  72. {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui_nano.html +0 -0
  73. {code_context_control-2.40.0 → code_context_control-2.41.0}/code_context_control.egg-info/SOURCES.txt +0 -0
  74. {code_context_control-2.40.0 → code_context_control-2.41.0}/code_context_control.egg-info/dependency_links.txt +0 -0
  75. {code_context_control-2.40.0 → code_context_control-2.41.0}/code_context_control.egg-info/entry_points.txt +0 -0
  76. {code_context_control-2.40.0 → code_context_control-2.41.0}/code_context_control.egg-info/requires.txt +0 -0
  77. {code_context_control-2.40.0 → code_context_control-2.41.0}/code_context_control.egg-info/top_level.txt +0 -0
  78. {code_context_control-2.40.0 → code_context_control-2.41.0}/core/__init__.py +0 -0
  79. {code_context_control-2.40.0 → code_context_control-2.41.0}/core/config.py +0 -0
  80. {code_context_control-2.40.0 → code_context_control-2.41.0}/core/ide.py +0 -0
  81. {code_context_control-2.40.0 → code_context_control-2.41.0}/core/mcp_toml.py +0 -0
  82. {code_context_control-2.40.0 → code_context_control-2.41.0}/core/web_security.py +0 -0
  83. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/__init__.py +0 -0
  84. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/config.py +0 -0
  85. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/mcp_oracle.py +0 -0
  86. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/oracle.html +0 -0
  87. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/oracle_server.py +0 -0
  88. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/__init__.py +0 -0
  89. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/activity_reporter.py +0 -0
  90. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/api_auth.py +0 -0
  91. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/c3_bridge.py +0 -0
  92. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/chat_engine.py +0 -0
  93. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/chat_store.py +0 -0
  94. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/cross_memory.py +0 -0
  95. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/federated_graph.py +0 -0
  96. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/health_checker.py +0 -0
  97. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/insight_engine.py +0 -0
  98. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/memory_reader.py +0 -0
  99. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/memory_writer.py +0 -0
  100. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/ollama_bridge.py +0 -0
  101. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/project_scanner.py +0 -0
  102. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/review_agent.py +0 -0
  103. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/tool_executor.py +0 -0
  104. {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/tool_registry.py +0 -0
  105. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/__init__.py +0 -0
  106. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/activity_log.py +0 -0
  107. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/agent_base.py +0 -0
  108. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/agents.py +0 -0
  109. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/auto_memory.py +0 -0
  110. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/bench/__init__.py +0 -0
  111. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/bench/external/__init__.py +0 -0
  112. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/bench/external/aider_polyglot.py +0 -0
  113. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/bench/external/swe_bench.py +0 -0
  114. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/benchmark_dashboard.py +0 -0
  115. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/bitbucket_client.py +0 -0
  116. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/bitbucket_credentials.py +0 -0
  117. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/circuit_breaker.py +0 -0
  118. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/claude_md.py +0 -0
  119. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/compressor.py +0 -0
  120. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/context_snapshot.py +0 -0
  121. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/conversation_store.py +0 -0
  122. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/doc_index.py +0 -0
  123. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/e2e_benchmark.py +0 -0
  124. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/e2e_evaluator.py +0 -0
  125. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/e2e_tasks.py +0 -0
  126. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/edit_ledger.py +0 -0
  127. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/embedding_index.py +0 -0
  128. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/error_reporting.py +0 -0
  129. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/file_memory.py +0 -0
  130. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/git_context.py +0 -0
  131. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/hub_service.py +0 -0
  132. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/indexer.py +0 -0
  133. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/memory.py +0 -0
  134. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/memory_consolidator.py +0 -0
  135. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/memory_graph.py +0 -0
  136. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/memory_grounder.py +0 -0
  137. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/memory_scorer.py +0 -0
  138. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/metrics.py +0 -0
  139. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/notifications.py +0 -0
  140. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/ollama_client.py +0 -0
  141. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/output_filter.py +0 -0
  142. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/parser.py +0 -0
  143. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/project_manager.py +0 -0
  144. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/project_runtime.py +0 -0
  145. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/protocol.py +0 -0
  146. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/proxy_state.py +0 -0
  147. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/retrieval_broker.py +0 -0
  148. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/router.py +0 -0
  149. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/runtime.py +0 -0
  150. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/session_benchmark.py +0 -0
  151. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/session_manager.py +0 -0
  152. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/session_preloader.py +0 -0
  153. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/text_index.py +0 -0
  154. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/tool_classifier.py +0 -0
  155. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/transcript_index.py +0 -0
  156. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/validation_cache.py +0 -0
  157. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/vector_store.py +0 -0
  158. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/version_tracker.py +0 -0
  159. {code_context_control-2.40.0 → code_context_control-2.41.0}/services/watcher.py +0 -0
  160. {code_context_control-2.40.0 → code_context_control-2.41.0}/setup.cfg +0 -0
  161. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_activity_reporter.py +0 -0
  162. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_aider_polyglot.py +0 -0
  163. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_bitbucket_cli_smoke.py +0 -0
  164. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_bitbucket_client.py +0 -0
  165. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_bitbucket_config_fallback.py +0 -0
  166. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_bitbucket_credentials.py +0 -0
  167. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_bitbucket_tool.py +0 -0
  168. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_circuit_breaker.py +0 -0
  169. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_claude_md_merge.py +0 -0
  170. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_cli_smoke.py +0 -0
  171. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_e2e_benchmark.py +0 -0
  172. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_edit_ledger_hook.py +0 -0
  173. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_edit_normalization.py +0 -0
  174. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_enforcement_flip.py +0 -0
  175. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_federated_graph.py +0 -0
  176. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_ghost_files.py +0 -0
  177. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_git_branch_awareness.py +0 -0
  178. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_hub_server_smoke.py +0 -0
  179. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_install_mcp_entrypoint.py +0 -0
  180. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_lazy_store_init.py +0 -0
  181. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_mcp_host_guard.py +0 -0
  182. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_mcp_server_smoke.py +0 -0
  183. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_mcp_toml.py +0 -0
  184. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_memory_graph_api.py +0 -0
  185. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_memory_system.py +0 -0
  186. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_notification_discipline.py +0 -0
  187. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_oracle_api_auth.py +0 -0
  188. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_oracle_apikey_api.py +0 -0
  189. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_oracle_discovery_api.py +0 -0
  190. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_oracle_security_fixes.py +0 -0
  191. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_output_filter.py +0 -0
  192. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_permissions.py +0 -0
  193. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_project_manager.py +0 -0
  194. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_project_manager_merge.py +0 -0
  195. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_project_tool.py +0 -0
  196. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_read_coercion.py +0 -0
  197. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_service_durability.py +0 -0
  198. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_session_benchmark.py +0 -0
  199. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_session_budget.py +0 -0
  200. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_shell_robustness.py +0 -0
  201. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_swe_bench.py +0 -0
  202. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_tool_registry.py +0 -0
  203. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_upgrade_and_version.py +0 -0
  204. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_validate.py +0 -0
  205. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_web_security.py +0 -0
  206. {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_windows_reliability.py +0 -0
  207. {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/__init__.py +0 -0
  208. {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/backend.py +0 -0
  209. {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/main.py +0 -0
  210. {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/__init__.py +0 -0
  211. {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/benchmark_view.py +0 -0
  212. {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/claudemd_view.py +0 -0
  213. {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/compress_view.py +0 -0
  214. {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/index_view.py +0 -0
  215. {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/init_view.py +0 -0
  216. {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/mcp_view.py +0 -0
  217. {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/optimize_view.py +0 -0
  218. {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/pipe_view.py +0 -0
  219. {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/projects_view.py +0 -0
  220. {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/search_view.py +0 -0
  221. {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/session_view.py +0 -0
  222. {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/stats.py +0 -0
  223. {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/ui_view.py +0 -0
  224. {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/theme.tcss +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-context-control
3
- Version: 2.40.0
3
+ Version: 2.41.0
4
4
  Summary: Local code-intelligence layer for AI coding tools (Claude Code, Codex, Gemini, Copilot). Retrieve less, read less, edit safer.
5
5
  Author-email: Dimitri Tselenchuk <dtselenc@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -85,7 +85,7 @@ console = Console() if HAS_RICH else None
85
85
  # Config
86
86
  CONFIG_DIR = ".c3"
87
87
  CONFIG_FILE = ".c3/config.json"
88
- __version__ = "2.40.0"
88
+ __version__ = "2.41.0"
89
89
 
90
90
 
91
91
  def _command_deps() -> CommandDeps:
@@ -4,12 +4,21 @@ Wraps subprocess.Popen with the Windows-safe pattern from
4
4
  services/edit_ledger.py::_git_combined (Popen + taskkill /F /T + stdin=DEVNULL).
5
5
  Auto-filters long stdout via handle_filter, auto-logs git mutations
6
6
  to the edit ledger, and accounts stdout tokens against session budget.
7
+
8
+ Shell selection: on Windows, commands are run through Git Bash (bash.exe) when
9
+ it is available, so c3_shell speaks the same POSIX dialect as the native Bash
10
+ tool (forward-slash paths, single quotes, `$VAR`, ls/grep/cat, heredocs). This
11
+ avoids the cmd.exe/POSIX mismatch that forced callers to fall back to native
12
+ Bash for bash-flavored commands. Set C3_SHELL_BASH=0 to force cmd.exe, or point
13
+ C3_SHELL_BASH at a specific bash.exe to override discovery. POSIX platforms are
14
+ unchanged (shell=True → /bin/sh).
7
15
  """
8
16
  from __future__ import annotations
9
17
 
10
18
  import asyncio
11
19
  import os
12
20
  import re
21
+ import shutil
13
22
  import subprocess
14
23
  import sys
15
24
  import time
@@ -59,6 +68,58 @@ _MAX_TIMEOUT = 600
59
68
  _FILTER_THRESHOLD_LINES = 30
60
69
 
61
70
 
71
+ # Cache for discovered Git Bash path: [] = uncomputed, [None]/[path] = computed.
72
+ _bash_cache: list = []
73
+
74
+
75
+ def _discover_git_bash() -> str | None:
76
+ """Locate a Git-for-Windows bash.exe, never WSL/System32 bash.
77
+
78
+ WSL's bash runs in a Linux subsystem with /mnt/c paths, which would break
79
+ the Windows `cwd` semantics every caller relies on — so it is rejected.
80
+ """
81
+ candidates: list[str] = []
82
+ for base_env in ("ProgramW6432", "ProgramFiles", "ProgramFiles(x86)"):
83
+ base = os.environ.get(base_env)
84
+ if base:
85
+ candidates.append(os.path.join(base, "Git", "bin", "bash.exe"))
86
+ candidates.append(os.path.join(base, "Git", "usr", "bin", "bash.exe"))
87
+ candidates.append(r"C:\Program Files\Git\bin\bash.exe")
88
+ candidates.append(r"C:\Program Files\Git\usr\bin\bash.exe")
89
+ for path in candidates:
90
+ if os.path.isfile(path):
91
+ return path
92
+ # Last resort: PATH lookup, but reject WSL/Store bash (System32/WindowsApps).
93
+ found = shutil.which("bash")
94
+ if found:
95
+ low = found.lower()
96
+ if "system32" not in low and "windowsapps" not in low:
97
+ return found
98
+ return None
99
+
100
+
101
+ def _select_bash() -> str | None:
102
+ """Return the bash.exe to run commands through on Windows, else None.
103
+
104
+ None means "use the platform default shell" (cmd.exe on Windows via
105
+ shell=True, /bin/sh on POSIX). Honors the C3_SHELL_BASH override:
106
+ '0'/'cmd' forces the platform default; an existing file path forces that
107
+ bash. Discovery is cached after the first call.
108
+ """
109
+ if sys.platform != "win32":
110
+ return None
111
+ override = os.environ.get("C3_SHELL_BASH")
112
+ if override is not None:
113
+ if override.strip().lower() in ("0", "", "cmd", "false", "off"):
114
+ return None
115
+ if os.path.isfile(override):
116
+ return override
117
+ # Unrecognized override → fall through to discovery.
118
+ if not _bash_cache:
119
+ _bash_cache.append(_discover_git_bash())
120
+ return _bash_cache[0]
121
+
122
+
62
123
  def _popen_kwargs() -> dict:
63
124
  # Force UTF-8 in child processes so Unicode output (→, box-drawing, emoji)
64
125
  # doesn't crash on Windows' legacy cp1252 console encoding. setdefault so an
@@ -89,8 +150,17 @@ def _kill_tree(proc: subprocess.Popen) -> None:
89
150
  def _run_sync(cmd: str, cwd: str, timeout: int) -> dict:
90
151
  """Blocking subprocess run with hard kill on timeout. Returns structured dict."""
91
152
  start = time.time()
153
+ bash = _select_bash()
154
+ if bash:
155
+ # POSIX dialect via Git Bash — matches the native Bash tool.
156
+ popen_target: object = [bash, "-c", cmd]
157
+ use_shell = False
158
+ else:
159
+ # Platform default: cmd.exe on Windows, /bin/sh on POSIX.
160
+ popen_target = cmd
161
+ use_shell = True
92
162
  proc = subprocess.Popen(
93
- cmd, shell=True, cwd=cwd,
163
+ popen_target, shell=use_shell, cwd=cwd,
94
164
  stdout=subprocess.PIPE, stderr=subprocess.PIPE,
95
165
  text=True, encoding="utf-8", errors="replace",
96
166
  **_popen_kwargs(),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-context-control
3
- Version: 2.40.0
3
+ Version: 2.41.0
4
4
  Summary: Local code-intelligence layer for AI coding tools (Claude Code, Codex, Gemini, Copilot). Retrieve less, read less, edit safer.
5
5
  Author-email: Dimitri Tselenchuk <dtselenc@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code-context-control"
7
- version = "2.40.0"
7
+ version = "2.41.0"
8
8
  description = "Local code-intelligence layer for AI coding tools (Claude Code, Codex, Gemini, Copilot). Retrieve less, read less, edit safer."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -11,6 +11,7 @@ Covers:
11
11
  from __future__ import annotations
12
12
 
13
13
  import asyncio
14
+ import os
14
15
  import sys
15
16
  import unittest
16
17
  from pathlib import Path
@@ -211,5 +212,79 @@ class TestShellRealSubprocess(unittest.TestCase):
211
212
  self.assertIn("c3_smoke", out)
212
213
 
213
214
 
215
+ class _FakePopen:
216
+ """Captures Popen construction args; emulates a clean exit."""
217
+
218
+ last_args: tuple = ()
219
+ last_kwargs: dict = {}
220
+
221
+ def __init__(self, *args, **kwargs):
222
+ _FakePopen.last_args = args
223
+ _FakePopen.last_kwargs = kwargs
224
+ self.returncode = 0
225
+
226
+ def communicate(self, timeout=None):
227
+ return ("out\n", "")
228
+
229
+
230
+ class TestShellSelection(unittest.TestCase):
231
+ """Windows Git Bash discovery/selection and _run_sync shell routing."""
232
+
233
+ def setUp(self):
234
+ shell_mod._bash_cache.clear()
235
+ os.environ.pop("C3_SHELL_BASH", None)
236
+
237
+ def tearDown(self):
238
+ shell_mod._bash_cache.clear()
239
+ os.environ.pop("C3_SHELL_BASH", None)
240
+
241
+ def test_non_win32_returns_none(self):
242
+ with patch.object(shell_mod.sys, "platform", "linux"):
243
+ self.assertIsNone(shell_mod._select_bash())
244
+
245
+ def test_env_override_zero_forces_default_shell(self):
246
+ os.environ["C3_SHELL_BASH"] = "0"
247
+ with patch.object(shell_mod.sys, "platform", "win32"):
248
+ self.assertIsNone(shell_mod._select_bash())
249
+
250
+ def test_env_override_explicit_path_honored(self):
251
+ os.environ["C3_SHELL_BASH"] = __file__ # an existing file stands in for bash
252
+ with patch.object(shell_mod.sys, "platform", "win32"):
253
+ self.assertEqual(shell_mod._select_bash(), __file__)
254
+
255
+ def test_discovers_git_bash_from_program_files(self):
256
+ base = r"C:\PF"
257
+ expected = os.path.join(base, "Git", "bin", "bash.exe")
258
+ with patch.dict(os.environ, {"ProgramFiles": base}, clear=False), \
259
+ patch.object(shell_mod.os.path, "isfile", lambda p: p == expected):
260
+ self.assertEqual(shell_mod._discover_git_bash(), expected)
261
+
262
+ def test_rejects_wsl_system32_bash(self):
263
+ with patch.object(shell_mod.os.path, "isfile", lambda p: False), \
264
+ patch.object(shell_mod.shutil, "which",
265
+ return_value=r"C:\Windows\System32\bash.exe"):
266
+ self.assertIsNone(shell_mod._discover_git_bash())
267
+
268
+ def test_accepts_non_system_path_bash_from_which(self):
269
+ with patch.object(shell_mod.os.path, "isfile", lambda p: False), \
270
+ patch.object(shell_mod.shutil, "which",
271
+ return_value=r"C:\tools\msys\bash.exe"):
272
+ self.assertEqual(shell_mod._discover_git_bash(), r"C:\tools\msys\bash.exe")
273
+
274
+ def test_run_sync_uses_bash_argv_when_selected(self):
275
+ with patch.object(shell_mod, "_select_bash", return_value="FAKEBASH"), \
276
+ patch.object(shell_mod.subprocess, "Popen", _FakePopen):
277
+ shell_mod._run_sync("echo hi", ".", 5)
278
+ self.assertEqual(_FakePopen.last_args[0], ["FAKEBASH", "-c", "echo hi"])
279
+ self.assertIs(_FakePopen.last_kwargs["shell"], False)
280
+
281
+ def test_run_sync_falls_back_to_default_shell_string(self):
282
+ with patch.object(shell_mod, "_select_bash", return_value=None), \
283
+ patch.object(shell_mod.subprocess, "Popen", _FakePopen):
284
+ shell_mod._run_sync("echo hi", ".", 5)
285
+ self.assertEqual(_FakePopen.last_args[0], "echo hi")
286
+ self.assertIs(_FakePopen.last_kwargs["shell"], True)
287
+
288
+
214
289
  if __name__ == "__main__":
215
290
  unittest.main()