code-context-control 2.51.0__tar.gz → 2.52.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 (321) hide show
  1. {code_context_control-2.51.0/code_context_control.egg-info → code_context_control-2.52.0}/PKG-INFO +9 -5
  2. {code_context_control-2.51.0 → code_context_control-2.52.0}/README.md +7 -3
  3. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/_hook_utils.py +22 -0
  4. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/c3.py +99 -137
  5. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/commands/parser.py +3 -3
  6. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/docs.html +10 -30
  7. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/guide/getting-started.html +6 -8
  8. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/guide/tools.html +6 -3
  9. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hook_dispatch.py +3 -0
  10. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hook_edit_ledger.py +7 -1
  11. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hook_terse_advisor.py +3 -1
  12. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/mcp_server.py +21 -3
  13. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/shell.py +141 -20
  14. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui/components/settings.js +0 -2
  15. {code_context_control-2.51.0 → code_context_control-2.52.0/code_context_control.egg-info}/PKG-INFO +9 -5
  16. {code_context_control-2.51.0 → code_context_control-2.52.0}/code_context_control.egg-info/SOURCES.txt +3 -0
  17. {code_context_control-2.51.0 → code_context_control-2.52.0}/core/ide.py +5 -23
  18. {code_context_control-2.51.0 → code_context_control-2.52.0}/pyproject.toml +2 -2
  19. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/artifact_defs.py +6 -0
  20. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/embedding_index.py +16 -5
  21. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/vector_store.py +21 -5
  22. code_context_control-2.52.0/tests/test_antigravity_transition.py +80 -0
  23. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_c3_shell.py +102 -3
  24. code_context_control-2.52.0/tests/test_hook_utf8_stdio.py +128 -0
  25. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_lazy_store_init.py +28 -0
  26. code_context_control-2.52.0/tests/test_mcp_memory_timeout.py +37 -0
  27. {code_context_control-2.51.0 → code_context_control-2.52.0}/tui/screens/claudemd_view.py +1 -1
  28. {code_context_control-2.51.0 → code_context_control-2.52.0}/tui/screens/init_view.py +1 -1
  29. {code_context_control-2.51.0 → code_context_control-2.52.0}/tui/screens/mcp_view.py +1 -1
  30. {code_context_control-2.51.0 → code_context_control-2.52.0}/LICENSE +0 -0
  31. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/__init__.py +0 -0
  32. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/commands/__init__.py +0 -0
  33. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/commands/common.py +0 -0
  34. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/edits.html +0 -0
  35. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/guide/bitbucket.html +0 -0
  36. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/guide/index.html +0 -0
  37. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/guide/oracle.html +0 -0
  38. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/guide/shared.css +0 -0
  39. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/guide/workflow.html +0 -0
  40. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hook_artifact.py +0 -0
  41. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hook_auto_snapshot.py +0 -0
  42. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hook_c3_signal.py +0 -0
  43. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hook_c3read.py +0 -0
  44. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hook_edit_unlock.py +0 -0
  45. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hook_filter.py +0 -0
  46. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hook_ghost_files.py +0 -0
  47. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hook_pretool_enforce.py +0 -0
  48. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hook_prompt_recall.py +0 -0
  49. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hook_read.py +0 -0
  50. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hook_session_stats.py +0 -0
  51. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub.html +0 -0
  52. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_server.py +0 -0
  53. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/app.js +0 -0
  54. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/add_project.js +0 -0
  55. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/config_editor.js +0 -0
  56. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/drill_artifacts.js +0 -0
  57. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/drill_health.js +0 -0
  58. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/drill_panel.js +0 -0
  59. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/drill_tasks.js +0 -0
  60. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/drill_views.js +0 -0
  61. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/global_search.js +0 -0
  62. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/mcp_manager.js +0 -0
  63. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/modals.js +0 -0
  64. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/project_card.js +0 -0
  65. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/project_tree.js +0 -0
  66. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/session_drawer.js +0 -0
  67. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/settings_modal.js +0 -0
  68. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/sidebar.js +0 -0
  69. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/summary_bar.js +0 -0
  70. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/task_board.js +0 -0
  71. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/toasts.js +0 -0
  72. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/components/topbar.js +0 -0
  73. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui/state.js +0 -0
  74. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/hub_ui.html +0 -0
  75. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/mcp_proxy.py +0 -0
  76. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/server.py +0 -0
  77. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/__init__.py +0 -0
  78. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/_helpers.py +0 -0
  79. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/agent.py +0 -0
  80. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/artifacts.py +0 -0
  81. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/bitbucket.py +0 -0
  82. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/compress.py +0 -0
  83. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/delegate.py +0 -0
  84. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/edit.py +0 -0
  85. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/edits.py +0 -0
  86. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/federate.py +0 -0
  87. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/filter.py +0 -0
  88. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/impact.py +0 -0
  89. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/memory.py +0 -0
  90. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/project.py +0 -0
  91. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/read.py +0 -0
  92. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/search.py +0 -0
  93. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/session.py +0 -0
  94. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/status.py +0 -0
  95. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/tasks.py +0 -0
  96. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/tools/validate.py +0 -0
  97. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui/api.js +0 -0
  98. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui/app.js +0 -0
  99. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui/components/bitbucket.js +0 -0
  100. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui/components/chat.js +0 -0
  101. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui/components/dashboard.js +0 -0
  102. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui/components/edits.js +0 -0
  103. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui/components/instructions.js +0 -0
  104. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui/components/memory.js +0 -0
  105. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui/components/sessions.js +0 -0
  106. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui/components/sidebar.js +0 -0
  107. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui/components/tasks.js +0 -0
  108. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui/icons.js +0 -0
  109. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui/pm_shared.js +0 -0
  110. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui/shared.js +0 -0
  111. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui/theme.js +0 -0
  112. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui.html +0 -0
  113. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui_legacy.html +0 -0
  114. {code_context_control-2.51.0 → code_context_control-2.52.0}/cli/ui_nano.html +0 -0
  115. {code_context_control-2.51.0 → code_context_control-2.52.0}/code_context_control.egg-info/dependency_links.txt +0 -0
  116. {code_context_control-2.51.0 → code_context_control-2.52.0}/code_context_control.egg-info/entry_points.txt +0 -0
  117. {code_context_control-2.51.0 → code_context_control-2.52.0}/code_context_control.egg-info/requires.txt +0 -0
  118. {code_context_control-2.51.0 → code_context_control-2.52.0}/code_context_control.egg-info/top_level.txt +0 -0
  119. {code_context_control-2.51.0 → code_context_control-2.52.0}/core/__init__.py +0 -0
  120. {code_context_control-2.51.0 → code_context_control-2.52.0}/core/config.py +0 -0
  121. {code_context_control-2.51.0 → code_context_control-2.52.0}/core/mcp_toml.py +0 -0
  122. {code_context_control-2.51.0 → code_context_control-2.52.0}/core/web_security.py +0 -0
  123. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/__init__.py +0 -0
  124. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/config.py +0 -0
  125. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/mcp_oracle.py +0 -0
  126. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/oracle_server.py +0 -0
  127. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/oracle_ui.html +0 -0
  128. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/services/__init__.py +0 -0
  129. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/services/activity_reporter.py +0 -0
  130. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/services/api_auth.py +0 -0
  131. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/services/c3_bridge.py +0 -0
  132. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/services/chat_engine.py +0 -0
  133. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/services/chat_store.py +0 -0
  134. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/services/cross_memory.py +0 -0
  135. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/services/federated_graph.py +0 -0
  136. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/services/health_checker.py +0 -0
  137. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/services/insight_engine.py +0 -0
  138. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/services/local_session.py +0 -0
  139. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/services/memory_reader.py +0 -0
  140. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/services/memory_writer.py +0 -0
  141. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/services/project_scanner.py +0 -0
  142. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/services/review_agent.py +0 -0
  143. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/services/tool_executor.py +0 -0
  144. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/services/tool_registry.py +0 -0
  145. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/ui/activity.js +0 -0
  146. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/ui/agents.js +0 -0
  147. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/ui/app.js +0 -0
  148. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/ui/busy.js +0 -0
  149. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/ui/chat/conversations.js +0 -0
  150. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/ui/chat/input.js +0 -0
  151. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/ui/chat/markdown.js +0 -0
  152. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/ui/chat/send.js +0 -0
  153. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/ui/chat/stream_renderer.js +0 -0
  154. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/ui/chat/toolbar.js +0 -0
  155. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/ui/core.js +0 -0
  156. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/ui/crossgraph.js +0 -0
  157. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/ui/header.js +0 -0
  158. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/ui/insights.js +0 -0
  159. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/ui/projects.js +0 -0
  160. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/ui/settings.js +0 -0
  161. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/ui/suggestions.js +0 -0
  162. {code_context_control-2.51.0 → code_context_control-2.52.0}/oracle/ui/theme_tabs.js +0 -0
  163. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/__init__.py +0 -0
  164. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/activity_log.py +0 -0
  165. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/agent_base.py +0 -0
  166. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/agents.py +0 -0
  167. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/artifact_store.py +0 -0
  168. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/auto_memory.py +0 -0
  169. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/bench/__init__.py +0 -0
  170. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/bench/external/__init__.py +0 -0
  171. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/bench/external/aider_polyglot.py +0 -0
  172. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/bench/external/swe_bench.py +0 -0
  173. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/benchmark_dashboard.py +0 -0
  174. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/bitbucket_client.py +0 -0
  175. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/bitbucket_credentials.py +0 -0
  176. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/circuit_breaker.py +0 -0
  177. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/claude_md.py +0 -0
  178. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/compressor.py +0 -0
  179. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/context_snapshot.py +0 -0
  180. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/conversation_store.py +0 -0
  181. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/doc_index.py +0 -0
  182. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/e2e_benchmark.py +0 -0
  183. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/e2e_evaluator.py +0 -0
  184. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/e2e_tasks.py +0 -0
  185. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/edit_ledger.py +0 -0
  186. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/error_reporting.py +0 -0
  187. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/file_memory.py +0 -0
  188. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/git_context.py +0 -0
  189. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/hub_service.py +0 -0
  190. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/indexer.py +0 -0
  191. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/memory.py +0 -0
  192. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/memory_consolidator.py +0 -0
  193. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/memory_distiller.py +0 -0
  194. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/memory_graph.py +0 -0
  195. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/memory_grounder.py +0 -0
  196. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/memory_queue.py +0 -0
  197. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/memory_scorer.py +0 -0
  198. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/metrics.py +0 -0
  199. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/notifications.py +0 -0
  200. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/ollama_bridge.py +0 -0
  201. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/ollama_client.py +0 -0
  202. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/ollama_credentials.py +0 -0
  203. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/output_filter.py +0 -0
  204. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/parser.py +0 -0
  205. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/project_manager.py +0 -0
  206. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/project_runtime.py +0 -0
  207. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/protocol.py +0 -0
  208. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/proxy_state.py +0 -0
  209. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/retention.py +0 -0
  210. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/retrieval_broker.py +0 -0
  211. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/router.py +0 -0
  212. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/runtime.py +0 -0
  213. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/session_benchmark.py +0 -0
  214. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/session_manager.py +0 -0
  215. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/session_preloader.py +0 -0
  216. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/subprojects.py +0 -0
  217. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/task_store.py +0 -0
  218. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/telemetry.py +0 -0
  219. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/text_index.py +0 -0
  220. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/tool_classifier.py +0 -0
  221. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/transcript_index.py +0 -0
  222. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/validation_cache.py +0 -0
  223. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/watcher.py +0 -0
  224. {code_context_control-2.51.0 → code_context_control-2.52.0}/services/win_subprocess.py +0 -0
  225. {code_context_control-2.51.0 → code_context_control-2.52.0}/setup.cfg +0 -0
  226. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_activity_reporter.py +0 -0
  227. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_aider_polyglot.py +0 -0
  228. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_artifact_store.py +0 -0
  229. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_artifact_tool.py +0 -0
  230. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_bitbucket_cli_smoke.py +0 -0
  231. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_bitbucket_client.py +0 -0
  232. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_bitbucket_config_fallback.py +0 -0
  233. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_bitbucket_credentials.py +0 -0
  234. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_bitbucket_tool.py +0 -0
  235. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_c3_bridge_project_artifacts.py +0 -0
  236. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_circuit_breaker.py +0 -0
  237. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_claude_md_merge.py +0 -0
  238. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_cli_smoke.py +0 -0
  239. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_compressor_large_file.py +0 -0
  240. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_delegate_cascade.py +0 -0
  241. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_e2e_benchmark.py +0 -0
  242. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_edit_ledger_hook.py +0 -0
  243. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_edit_normalization.py +0 -0
  244. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_enforcement_flip.py +0 -0
  245. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_federated_graph.py +0 -0
  246. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_filter_backoff.py +0 -0
  247. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_ghost_files.py +0 -0
  248. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_ghost_generation.py +0 -0
  249. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_git_branch_awareness.py +0 -0
  250. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_hook_dispatch.py +0 -0
  251. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_hook_pretool_enforce.py +0 -0
  252. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_hook_prompt_recall.py +0 -0
  253. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_hook_smoke.py +0 -0
  254. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_hook_state.py +0 -0
  255. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_hub_inspect_api.py +0 -0
  256. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_hub_server_smoke.py +0 -0
  257. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_install_mcp_entrypoint.py +0 -0
  258. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_mcp_host_guard.py +0 -0
  259. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_mcp_server_smoke.py +0 -0
  260. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_mcp_toml.py +0 -0
  261. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_memory_distiller.py +0 -0
  262. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_memory_graph_api.py +0 -0
  263. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_memory_queue.py +0 -0
  264. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_memory_system.py +0 -0
  265. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_notification_dedup.py +0 -0
  266. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_notification_discipline.py +0 -0
  267. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_ollama_credentials.py +0 -0
  268. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_oracle_api_auth.py +0 -0
  269. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_oracle_apikey_api.py +0 -0
  270. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_oracle_c3_bridge.py +0 -0
  271. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_oracle_chat_engine.py +0 -0
  272. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_oracle_discovery_api.py +0 -0
  273. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_oracle_local_auth.py +0 -0
  274. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_oracle_ollama_bridge.py +0 -0
  275. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_oracle_scanner_cache.py +0 -0
  276. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_oracle_security_fixes.py +0 -0
  277. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_oracle_subproject_awareness.py +0 -0
  278. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_oracle_ui_bundle.py +0 -0
  279. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_output_filter.py +0 -0
  280. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_permissions.py +0 -0
  281. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_pm_api.py +0 -0
  282. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_project_manager.py +0 -0
  283. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_project_manager_merge.py +0 -0
  284. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_project_tool.py +0 -0
  285. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_read_coercion.py +0 -0
  286. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_read_edit_parity.py +0 -0
  287. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_related_facts.py +0 -0
  288. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_response_boilerplate.py +0 -0
  289. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_retention.py +0 -0
  290. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_review_digest.py +0 -0
  291. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_service_durability.py +0 -0
  292. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_session_benchmark.py +0 -0
  293. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_session_budget.py +0 -0
  294. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_shell_robustness.py +0 -0
  295. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_subproject_exclusion.py +0 -0
  296. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_subproject_federation.py +0 -0
  297. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_subprojects.py +0 -0
  298. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_swe_bench.py +0 -0
  299. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_task_store.py +0 -0
  300. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_task_tool.py +0 -0
  301. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_token_telemetry.py +0 -0
  302. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_tool_registry.py +0 -0
  303. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_upgrade_and_version.py +0 -0
  304. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_validate.py +0 -0
  305. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_web_security.py +0 -0
  306. {code_context_control-2.51.0 → code_context_control-2.52.0}/tests/test_windows_reliability.py +0 -0
  307. {code_context_control-2.51.0 → code_context_control-2.52.0}/tui/__init__.py +0 -0
  308. {code_context_control-2.51.0 → code_context_control-2.52.0}/tui/backend.py +0 -0
  309. {code_context_control-2.51.0 → code_context_control-2.52.0}/tui/main.py +0 -0
  310. {code_context_control-2.51.0 → code_context_control-2.52.0}/tui/screens/__init__.py +0 -0
  311. {code_context_control-2.51.0 → code_context_control-2.52.0}/tui/screens/benchmark_view.py +0 -0
  312. {code_context_control-2.51.0 → code_context_control-2.52.0}/tui/screens/compress_view.py +0 -0
  313. {code_context_control-2.51.0 → code_context_control-2.52.0}/tui/screens/index_view.py +0 -0
  314. {code_context_control-2.51.0 → code_context_control-2.52.0}/tui/screens/optimize_view.py +0 -0
  315. {code_context_control-2.51.0 → code_context_control-2.52.0}/tui/screens/pipe_view.py +0 -0
  316. {code_context_control-2.51.0 → code_context_control-2.52.0}/tui/screens/projects_view.py +0 -0
  317. {code_context_control-2.51.0 → code_context_control-2.52.0}/tui/screens/search_view.py +0 -0
  318. {code_context_control-2.51.0 → code_context_control-2.52.0}/tui/screens/session_view.py +0 -0
  319. {code_context_control-2.51.0 → code_context_control-2.52.0}/tui/screens/stats.py +0 -0
  320. {code_context_control-2.51.0 → code_context_control-2.52.0}/tui/screens/ui_view.py +0 -0
  321. {code_context_control-2.51.0 → code_context_control-2.52.0}/tui/theme.tcss +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-context-control
3
- Version: 2.51.0
4
- Summary: Local code-intelligence layer for AI coding tools (Claude Code, Codex, Gemini, Copilot). Retrieve less, read less, edit safer — and version the configs that shape your agent (CLAUDE.md, skills, hooks, MCP).
3
+ Version: 2.52.0
4
+ Summary: Local code-intelligence layer for AI coding tools (Claude Code, Codex, Copilot, Cursor, Antigravity). Retrieve less, read less, edit safer — and version the configs that shape your agent (CLAUDE.md, skills, hooks, MCP).
5
5
  Author-email: Dimitri Tselenchuk <dtselenc@gmail.com>
6
6
  License-Expression: Apache-2.0
7
7
  Project-URL: Homepage, https://github.com/drknowhow/code-context-control
@@ -66,7 +66,7 @@ Dynamic: license-file
66
66
  <p align="center">
67
67
  <strong>The local code-intelligence layer for AI coding tools.</strong><br>
68
68
  Stop burning tokens on whole-file reads, blind greps, and unbounded log dumps.<br>
69
- Works with Claude Code, Codex, Gemini CLI, Copilot, Cursor, and Antigravity.
69
+ Works with Claude Code, Codex, Copilot, Cursor, and Antigravity.
70
70
  </p>
71
71
 
72
72
  <p align="center">
@@ -100,7 +100,7 @@ A thin **local** layer that sits between your IDE and your repo. Every AI tool c
100
100
  | Edit, hope it compiled | `c3_edit` writes via a ledger + `c3_validate` runs `pyright`/`tsc` automatically |
101
101
  | `Bash` test runs that hang on Windows | `c3_shell` returns structured `{exit_code, stdout, stderr, duration}` with auto-filter |
102
102
  | Lose all context on `/clear` | `c3_session(snapshot)` + `c3_memory` persist decisions across sessions |
103
- | Re-explain the project every session | Auto-synced `CLAUDE.md` / `AGENTS.md` / `GEMINI.md` / `copilot-instructions.md` from a single source of truth |
103
+ | Re-explain the project every session | Auto-synced `CLAUDE.md` / `AGENTS.md` / `copilot-instructions.md` from a single source of truth |
104
104
 
105
105
  Everything runs **locally**. No source code, prompts, or model output ever leaves your machine unless you explicitly opt into a third-party model API.
106
106
 
@@ -125,7 +125,7 @@ c3 init /path/to/your/project
125
125
  ```
126
126
 
127
127
  Running `c3` with no arguments opens the interactive TUI. `c3 init` walks you through:
128
- 1. **IDE selection** (Claude Code CLI/App, Codex CLI, Gemini CLI, VS Code, Cursor, Antigravity, or Custom)
128
+ 1. **IDE selection** (Claude Code CLI/App, Codex CLI, VS Code, Cursor, Antigravity, or Custom — the Gemini CLI profile was removed in v2.52; use Antigravity, which reads AGENTS.md)
129
129
  2. Optional local `git init`
130
130
  3. MCP server registration (auto-wired into your IDE)
131
131
  4. (Claude Code only) Permission tier selection
@@ -278,6 +278,10 @@ C3 exposes 18 tools as a native MCP server. Your IDE calls them directly:
278
278
  | `c3_task` | Durable per-project tasks, milestones, and decision notes (v2.45.0) |
279
279
  | `c3_artifacts` | Agent-config tracking — version history, diff & restore for CLAUDE.md, settings/hooks, MCP configs, skills (v2.46.0) |
280
280
 
281
+ On Windows, `c3_shell` uses Git Bash when available. Git Bash does not bundle
282
+ optional utilities such as `jq`; use `python -m json.tool` for portable JSON
283
+ formatting, or install `jq` separately when filter expressions are required.
284
+
281
285
  Every tool is **read-only safe in plan mode** (except `c3_edit`, `c3_shell`, `c3_artifacts(action='restore')`, and write actions on `c3_bitbucket` / `c3_project` / `c3_task`).
282
286
 
283
287
  ### Bitbucket Data Center / Server (v2.30.0)
@@ -3,7 +3,7 @@
3
3
  <p align="center">
4
4
  <strong>The local code-intelligence layer for AI coding tools.</strong><br>
5
5
  Stop burning tokens on whole-file reads, blind greps, and unbounded log dumps.<br>
6
- Works with Claude Code, Codex, Gemini CLI, Copilot, Cursor, and Antigravity.
6
+ Works with Claude Code, Codex, Copilot, Cursor, and Antigravity.
7
7
  </p>
8
8
 
9
9
  <p align="center">
@@ -37,7 +37,7 @@ A thin **local** layer that sits between your IDE and your repo. Every AI tool c
37
37
  | Edit, hope it compiled | `c3_edit` writes via a ledger + `c3_validate` runs `pyright`/`tsc` automatically |
38
38
  | `Bash` test runs that hang on Windows | `c3_shell` returns structured `{exit_code, stdout, stderr, duration}` with auto-filter |
39
39
  | Lose all context on `/clear` | `c3_session(snapshot)` + `c3_memory` persist decisions across sessions |
40
- | Re-explain the project every session | Auto-synced `CLAUDE.md` / `AGENTS.md` / `GEMINI.md` / `copilot-instructions.md` from a single source of truth |
40
+ | Re-explain the project every session | Auto-synced `CLAUDE.md` / `AGENTS.md` / `copilot-instructions.md` from a single source of truth |
41
41
 
42
42
  Everything runs **locally**. No source code, prompts, or model output ever leaves your machine unless you explicitly opt into a third-party model API.
43
43
 
@@ -62,7 +62,7 @@ c3 init /path/to/your/project
62
62
  ```
63
63
 
64
64
  Running `c3` with no arguments opens the interactive TUI. `c3 init` walks you through:
65
- 1. **IDE selection** (Claude Code CLI/App, Codex CLI, Gemini CLI, VS Code, Cursor, Antigravity, or Custom)
65
+ 1. **IDE selection** (Claude Code CLI/App, Codex CLI, VS Code, Cursor, Antigravity, or Custom — the Gemini CLI profile was removed in v2.52; use Antigravity, which reads AGENTS.md)
66
66
  2. Optional local `git init`
67
67
  3. MCP server registration (auto-wired into your IDE)
68
68
  4. (Claude Code only) Permission tier selection
@@ -215,6 +215,10 @@ C3 exposes 18 tools as a native MCP server. Your IDE calls them directly:
215
215
  | `c3_task` | Durable per-project tasks, milestones, and decision notes (v2.45.0) |
216
216
  | `c3_artifacts` | Agent-config tracking — version history, diff & restore for CLAUDE.md, settings/hooks, MCP configs, skills (v2.46.0) |
217
217
 
218
+ On Windows, `c3_shell` uses Git Bash when available. Git Bash does not bundle
219
+ optional utilities such as `jq`; use `python -m json.tool` for portable JSON
220
+ formatting, or install `jq` separately when filter expressions are required.
221
+
218
222
  Every tool is **read-only safe in plan mode** (except `c3_edit`, `c3_shell`, `c3_artifacts(action='restore')`, and write actions on `c3_bitbucket` / `c3_project` / `c3_task`).
219
223
 
220
224
  ### Bitbucket Data Center / Server (v2.30.0)
@@ -33,6 +33,28 @@ LEGACY_UNLOCK_FILE = ".c3/unlocked_files.json"
33
33
  STATE_WARNINGS: list = []
34
34
 
35
35
 
36
+ def ensure_utf8_stdio() -> None:
37
+ """Force UTF-8 on the hook process's stdio pipes.
38
+
39
+ On Windows a hook subprocess gets cp1252 stdout/stdin (piped, non-TTY),
40
+ so printing user-visible text containing box-drawing chars ("─") or emoji
41
+ raises UnicodeEncodeError and surfaces as a "Stop hook error" in the IDE.
42
+ Claude Code reads hook stdout as UTF-8. Call this at the top of every
43
+ entrypoint that prints raw (non-json.dumps) text. Never raises.
44
+ """
45
+ for stream in (sys.stdout, sys.stderr):
46
+ try:
47
+ if hasattr(stream, "reconfigure"):
48
+ stream.reconfigure(encoding="utf-8", errors="replace")
49
+ except Exception:
50
+ pass
51
+ try:
52
+ if hasattr(sys.stdin, "reconfigure"):
53
+ sys.stdin.reconfigure(encoding="utf-8", errors="strict")
54
+ except Exception:
55
+ pass
56
+
57
+
36
58
  def log_hook_error(hook_name: str, exc: BaseException) -> None:
37
59
  """Append a timestamped error entry to .c3/hook_errors.log.
38
60
 
@@ -92,7 +92,7 @@ console = Console() if HAS_RICH else None
92
92
  # Config
93
93
  CONFIG_DIR = ".c3"
94
94
  CONFIG_FILE = ".c3/config.json"
95
- __version__ = "2.51.0"
95
+ __version__ = "2.52.0"
96
96
 
97
97
 
98
98
  def _command_deps() -> CommandDeps:
@@ -711,8 +711,7 @@ def _select_init_ide(default_ide: str) -> str:
711
711
  "VS Code — .vscode/mcp.json + Copilot instructions",
712
712
  "Cursor — .cursor/mcp.json",
713
713
  "Codex — .codex/config.toml + AGENTS.md",
714
- "Gemini .gemini/settings.json + GEMINI.md",
715
- "Antigravity — ~/.gemini/antigravity/mcp_config.json",
714
+ "Antigravity ~/.gemini/antigravity/mcp_config.json + AGENTS.md",
716
715
  ]
717
716
  selected = _prompt_choice("Step 1/3 — Choose IDE profile", choices)
718
717
  mapping = {
@@ -721,8 +720,7 @@ def _select_init_ide(default_ide: str) -> str:
721
720
  choices[2]: "vscode",
722
721
  choices[3]: "cursor",
723
722
  choices[4]: "codex",
724
- choices[5]: "gemini",
725
- choices[6]: "antigravity",
723
+ choices[5]: "antigravity",
726
724
  }
727
725
  chosen = mapping.get(selected or "", normalize_ide_name(default_ide) if default_ide != "auto" else "auto")
728
726
  print(f" IDE profile: {chosen}")
@@ -887,7 +885,7 @@ def _parse_cli_ide_arg(value: str) -> str:
887
885
  normalized = normalize_ide_name(raw)
888
886
  if normalized not in PROFILES:
889
887
  raise argparse.ArgumentTypeError(
890
- "Unsupported IDE. Use one of: auto, claude, vscode, cursor, codex, gemini, antigravity."
888
+ "Unsupported IDE. Use one of: auto, claude, vscode, cursor, codex, antigravity."
891
889
  )
892
890
  return normalized
893
891
 
@@ -4013,29 +4011,6 @@ enabled = true
4013
4011
  ```
4014
4012
  """
4015
4013
 
4016
- _GEMINI_MD_CONTENT = _C3_COMPACT_WORKFLOW + """
4017
-
4018
- ## IDE Configuration (Gemini CLI)
4019
- This project uses project-scoped MCP servers. Ensure your `.gemini/settings.json` includes:
4020
- ```json
4021
- {
4022
- "mcpServers": {
4023
- "c3": {
4024
- "command": "c3-mcp",
4025
- "args": ["--project", "."]
4026
- }
4027
- }
4028
- }
4029
- ```
4030
-
4031
- ## Gemini Enforcement
4032
- - `c3 init` and `c3 install-mcp` install this file as a required workflow, not a suggestion.
4033
- - After install, use the `c3` MCP server for recall, search, structural mapping, surgical reads, filtering, and session logging before native Gemini repo exploration.
4034
- - Do not bypass C3 with broad native search/read steps unless a matching `c3_*` tool failed or was too narrow for a final follow-up.
4035
- - If fallback is necessary, say which `c3_*` tool was attempted or skipped and why.
4036
- """
4037
-
4038
-
4039
4014
  _TERSE_SKILL_CONTENT = """\
4040
4015
  # /terse — Terse Output Mode
4041
4016
 
@@ -4113,28 +4088,16 @@ Say "normal mode", start a new session, or let the turn counter expire.
4113
4088
  _TERSE_SKILL_MARKER = "# /terse — Terse Output Mode"
4114
4089
 
4115
4090
 
4116
- _TERSE_GEMINI_TOML = (
4117
- 'description = "Terse output mode. Usage: /terse [lite|full|ultra] (default: full)."\n'
4118
- "prompt = '''\n"
4119
- + _TERSE_SKILL_CONTENT.replace("'''", "''\\''")
4120
- + "\n'''\n"
4121
- )
4122
-
4123
-
4124
4091
  def _ensure_terse_skill(ide: str = "claude-code") -> None:
4125
4092
  """Install the /terse slash command for the given IDE profile.
4126
4093
 
4127
4094
  claude-code -> ~/.claude/commands/terse.md
4128
4095
  codex -> ~/.codex/prompts/terse.md
4129
- gemini -> ~/.gemini/commands/terse.toml
4130
4096
  """
4131
4097
  home = Path.home()
4132
4098
  if ide == "codex":
4133
4099
  skill_path = home / ".codex" / "prompts" / "terse.md"
4134
4100
  content = _TERSE_SKILL_CONTENT
4135
- elif ide == "gemini":
4136
- skill_path = home / ".gemini" / "commands" / "terse.toml"
4137
- content = _TERSE_GEMINI_TOML
4138
4101
  else:
4139
4102
  skill_path = home / ".claude" / "commands" / "terse.md"
4140
4103
  content = _TERSE_SKILL_CONTENT
@@ -4357,7 +4320,7 @@ def _upsert_json_mcp_server(config_path: Path, config_key: str, server_name: str
4357
4320
 
4358
4321
  def _ensure_project_session_configs(target: Path, server_script: str, primary_profile: str | None = None,
4359
4322
  c3_mcp_exe: str | None = None) -> None:
4360
- """Keep project-local Codex and Gemini MCP configs in sync for new sessions."""
4323
+ """Keep the project-local Codex MCP config in sync for new sessions."""
4361
4324
  # Ensure forward slashes for config portability and avoid Windows path-splitting issues
4362
4325
  server_script_posix = Path(server_script).as_posix()
4363
4326
  if c3_mcp_exe:
@@ -4381,26 +4344,16 @@ def _ensure_project_session_configs(target: Path, server_script: str, primary_pr
4381
4344
  )
4382
4345
  print(f"{codex_state.capitalize()} {codex_path}")
4383
4346
 
4384
- if primary_profile != "gemini":
4385
- gemini_path = target / ".gemini" / "settings.json"
4386
- gemini_state = _upsert_json_mcp_server(
4387
- gemini_path,
4388
- "mcpServers",
4389
- "c3",
4390
- {
4391
- "command": mcp_command,
4392
- "args": server_args,
4393
- },
4394
- )
4395
- print(f"{gemini_state.capitalize()} {gemini_path}")
4396
4347
 
4397
4348
 
4398
- def _ensure_global_session_fallbacks(server_script: str, c3_mcp_exe: str | None = None) -> None:
4399
- """Keep user-global Codex/Gemini MCP configs pointing at C3.
4349
+
4350
+ def _ensure_global_session_fallbacks(server_script: str, c3_mcp_exe: str | None = None,
4351
+ primary_profile: str | None = None) -> None:
4352
+ """Keep user-global Codex/Antigravity MCP configs pointing at C3.
4400
4353
 
4401
4354
  These fallback entries omit `--project` so the MCP server can resolve the
4402
4355
  active working directory dynamically when a session starts in a project that
4403
- does not yet have project-local Codex/Gemini config files.
4356
+ does not yet have a project-local Codex config file.
4404
4357
  """
4405
4358
  server_script_posix = Path(server_script).as_posix()
4406
4359
  # With the installed entry point, no script path is needed; --project stays
@@ -4423,20 +4376,25 @@ def _ensure_global_session_fallbacks(server_script: str, c3_mcp_exe: str | None
4423
4376
  except PermissionError:
4424
4377
  print(f"Warning: Could not update {codex_path} (global fallback skipped)")
4425
4378
 
4426
- gemini_path = Path.home() / ".gemini" / "settings.json"
4427
- try:
4428
- gemini_state = _upsert_json_mcp_server(
4429
- gemini_path,
4430
- "mcpServers",
4431
- "c3",
4432
- {
4433
- "command": c3_mcp_exe or sys.executable,
4434
- "args": fallback_args,
4435
- },
4436
- )
4437
- print(f"{gemini_state.capitalize()} {gemini_path} (global fallback)")
4438
- except PermissionError:
4439
- print(f"Warning: Could not update {gemini_path} (global fallback skipped)")
4379
+ # Antigravity shares the ~/.gemini home dir but reads its own MCP config.
4380
+ # When Antigravity is the primary profile, the main install flow already
4381
+ # wrote this file — here we only keep it fresh for codex installs
4382
+ # on machines that have Antigravity (its config dir exists).
4383
+ antigravity_path = Path.home() / ".gemini" / "antigravity" / "mcp_config.json"
4384
+ if primary_profile != "antigravity" and antigravity_path.parent.is_dir():
4385
+ try:
4386
+ ag_state = _upsert_json_mcp_server(
4387
+ antigravity_path,
4388
+ "mcpServers",
4389
+ "c3",
4390
+ {
4391
+ "command": c3_mcp_exe or sys.executable,
4392
+ "args": fallback_args,
4393
+ },
4394
+ )
4395
+ print(f"{ag_state.capitalize()} {antigravity_path} (global fallback)")
4396
+ except PermissionError:
4397
+ print(f"Warning: Could not update {antigravity_path} (global fallback skipped)")
4440
4398
 
4441
4399
 
4442
4400
  def _uninstall_mcp_all(project_path: str):
@@ -4474,8 +4432,8 @@ def _uninstall_mcp_all(project_path: str):
4474
4432
  config_paths.append(Path.home() / profile.config_path)
4475
4433
  else:
4476
4434
  config_paths.append(target / profile.config_path)
4477
- # For Codex and Gemini, also check the global fallback in home dir
4478
- if ide_name in ("codex", "gemini"):
4435
+ # For Codex, also check the global fallback in home dir
4436
+ if ide_name == "codex":
4479
4437
  config_paths.append(Path.home() / profile.config_path)
4480
4438
 
4481
4439
  for mcp_config_path in config_paths:
@@ -4597,6 +4555,22 @@ def _uninstall_mcp_all(project_path: str):
4597
4555
  except Exception as e:
4598
4556
  print(f" Warning: Could not update {vscode_settings_path}: {e}")
4599
4557
 
4558
+ # Legacy Gemini CLI configs (profile removed in v2.52) — still strip the c3 entry.
4559
+ for legacy_cfg in (target / ".gemini" / "settings.json",
4560
+ Path.home() / ".gemini" / "settings.json"):
4561
+ if not legacy_cfg.exists():
4562
+ continue
4563
+ try:
4564
+ with open(legacy_cfg, encoding="utf-8") as f:
4565
+ legacy_data = json.load(f)
4566
+ if "c3" in (legacy_data.get("mcpServers") or {}):
4567
+ del legacy_data["mcpServers"]["c3"]
4568
+ with open(legacy_cfg, "w", encoding="utf-8") as f:
4569
+ json.dump(legacy_data, f, indent=2)
4570
+ print(f" Removed C3 from {legacy_cfg}")
4571
+ except Exception as e:
4572
+ print(f" Warning: Could not update {legacy_cfg}: {e}")
4573
+
4600
4574
  # Final pass: clean up empty IDE directories (.claude, .codex, .gemini, .vscode, .github)
4601
4575
  dirs_to_check = [".claude", ".codex", ".gemini", ".vscode", ".github"]
4602
4576
  for dname in dirs_to_check:
@@ -4715,11 +4689,27 @@ def _ensure_global_claude_md() -> None:
4715
4689
 
4716
4690
 
4717
4691
  def _instruction_documents_for_project() -> list[tuple[str, str]]:
4718
- """Return the project-local instruction documents C3 should keep in sync."""
4692
+ """Return every project-local instruction document C3 has ever managed.
4693
+
4694
+ Used by uninstall/cleanup paths, so it must keep listing legacy docs
4695
+ (GEMINI.md — profile removed in v2.52; empty template, never generated).
4696
+ """
4719
4697
  return [
4720
4698
  ("CLAUDE.md", _CLAUDE_MD_CONTENT),
4721
4699
  ("AGENTS.md", _AGENTS_MD_CONTENT),
4722
- ("GEMINI.md", _GEMINI_MD_CONTENT),
4700
+ ("GEMINI.md", ""),
4701
+ ]
4702
+
4703
+
4704
+ _LEGACY_INSTRUCTION_DOCS = ("GEMINI.md",) # Gemini CLI profile removed in v2.52
4705
+
4706
+
4707
+ def _instruction_documents_to_generate() -> list[tuple[str, str]]:
4708
+ """Instruction docs to write for a project (legacy docs excluded)."""
4709
+ return [
4710
+ (name, template)
4711
+ for name, template in _instruction_documents_for_project()
4712
+ if name not in _LEGACY_INSTRUCTION_DOCS
4723
4713
  ]
4724
4714
 
4725
4715
 
@@ -4727,7 +4717,7 @@ def _sync_project_instruction_docs(project_path: str, sm: SessionManager) -> Non
4727
4717
  """Write the current C3 instruction docs into the project root."""
4728
4718
  repo_root = Path(__file__).resolve().parent.parent
4729
4719
  synced: list[str] = []
4730
- for instructions_file, template in _instruction_documents_for_project():
4720
+ for instructions_file, template in _instruction_documents_to_generate():
4731
4721
  print(f"Generating {instructions_file}...")
4732
4722
  # Resolve placeholder for project-scoped MCP configs
4733
4723
  resolved_template = template.replace("<path-to-c3>", str(repo_root).replace("\\", "/"))
@@ -4993,8 +4983,8 @@ def cmd_install_mcp(args):
4993
4983
  if _found:
4994
4984
  c3_mcp_exe = Path(_found).resolve().as_posix()
4995
4985
 
4996
- # On Windows, Gemini CLI splits command args by space, so the script path stays a
4997
- # single arg. 'python' keeps the source fallback portable across platforms.
4986
+ # Keep the script path as a single arg; 'python' keeps the source fallback
4987
+ # portable across platforms.
4998
4988
  if c3_mcp_exe:
4999
4989
  new_entry = {"command": c3_mcp_exe, "args": ["--project", "."]}
5000
4990
  else:
@@ -5069,9 +5059,9 @@ def cmd_install_mcp(args):
5069
5059
  # instead of letting it surface as anonymous out-of-band drift.
5070
5060
  from services.artifact_defs import note_pending_write
5071
5061
  note_pending_write(target, profile.config_path, "install_mcp")
5072
- if profile.name in {"codex", "gemini"}:
5062
+ if profile.name in {"codex", "antigravity"}:
5073
5063
  _ensure_project_session_configs(target, server_script, primary_profile=profile.name, c3_mcp_exe=c3_mcp_exe)
5074
- _ensure_global_session_fallbacks(server_script, c3_mcp_exe=c3_mcp_exe)
5064
+ _ensure_global_session_fallbacks(server_script, c3_mcp_exe=c3_mcp_exe, primary_profile=profile.name)
5075
5065
 
5076
5066
  # ── Persist IDE choice to .c3/config.json ──
5077
5067
  c3_config_dir = target / ".c3"
@@ -5085,7 +5075,7 @@ def cmd_install_mcp(args):
5085
5075
  with open(c3_config_path, 'w', encoding="utf-8") as f:
5086
5076
  json.dump(c3_config, f, indent=2)
5087
5077
 
5088
- # ── Install hooks (Claude Code + Gemini CLI) ──
5078
+ # ── Install hooks (Claude Code) ──
5089
5079
  if profile.supports_hooks and profile.settings_path:
5090
5080
  settings_dir = target / Path(profile.settings_path).parent
5091
5081
  settings_dir.mkdir(parents=True, exist_ok=True)
@@ -5116,26 +5106,15 @@ def cmd_install_mcp(args):
5116
5106
  hook_stop_cmd = f"{_dispatch_base} stop"
5117
5107
  hook_prompt_cmd = f"{_dispatch_base} prompt"
5118
5108
 
5119
- # Tool matcher names differ by IDE: Gemini uses snake_case built-in names.
5120
- if profile.name == "gemini":
5121
- shell_matcher = "run_shell_command"
5122
- read_matcher = "read_file"
5123
- grep_matcher = "grep"
5124
- glob_matcher = "find_files"
5125
- edit_matcher = "edit_file"
5126
- write_matcher = "write_file"
5127
- # Gemini has no MultiEdit / NotebookEdit equivalents.
5128
- extra_edit_matchers = []
5129
- else:
5130
- shell_matcher = "Bash"
5131
- read_matcher = "Read"
5132
- grep_matcher = "Grep"
5133
- glob_matcher = "Glob"
5134
- edit_matcher = "Edit"
5135
- write_matcher = "Write"
5136
- # Claude Code also exposes MultiEdit (batch edits) and NotebookEdit;
5137
- # both bypass enforcement/logging unless their matchers are registered.
5138
- extra_edit_matchers = ["MultiEdit", "NotebookEdit"]
5109
+ shell_matcher = "Bash"
5110
+ read_matcher = "Read"
5111
+ grep_matcher = "Grep"
5112
+ glob_matcher = "Glob"
5113
+ edit_matcher = "Edit"
5114
+ write_matcher = "Write"
5115
+ # Claude Code also exposes MultiEdit (batch edits) and NotebookEdit;
5116
+ # both bypass enforcement/logging unless their matchers are registered.
5117
+ extra_edit_matchers = ["MultiEdit", "NotebookEdit"]
5139
5118
 
5140
5119
  # ── PostToolUse hooks ──
5141
5120
  # Matcher set is unchanged from pre-v2.42; every matcher now points at
@@ -5193,8 +5172,7 @@ def cmd_install_mcp(args):
5193
5172
  existing_post.extend(desired_post_hooks)
5194
5173
  settings.setdefault("hooks", {})[hook_event] = existing_post
5195
5174
 
5196
- # PreToolUse hooks (Claude Code: "PreToolUse", Gemini: "BeforeTool")
5197
- pre_event = "BeforeTool" if profile.name == "gemini" else "PreToolUse"
5175
+ pre_event = "PreToolUse"
5198
5176
  pre_matchers = {h.get("matcher") for h in desired_pre_hooks}
5199
5177
  existing_pre = [
5200
5178
  h for h in settings.get("hooks", {}).get(pre_event, [])
@@ -5204,7 +5182,6 @@ def cmd_install_mcp(args):
5204
5182
  settings.setdefault("hooks", {})[pre_event] = existing_pre
5205
5183
 
5206
5184
  # ── Stop hooks (auto-snapshot + session stats on session end / Ctrl+C) ──
5207
- # Stop hooks fire for both Claude Code ("Stop") and Gemini ("Stop").
5208
5185
  desired_stop_hooks = [
5209
5186
  {
5210
5187
  "matcher": "",
@@ -5239,26 +5216,25 @@ def cmd_install_mcp(args):
5239
5216
  settings.setdefault("hooks", {})[stop_event] = existing_stop
5240
5217
 
5241
5218
  # ── UserPromptSubmit hook (per-prompt project-memory injection) ──
5242
- # Claude Code only: Gemini CLI has no equivalent hook event. Same
5243
- # merge discipline as Stop: replace only C3's own entries (identified
5244
- # by the dispatcher script in the command), keep user-added ones.
5245
- if profile.name != "gemini":
5246
- prompt_event = "UserPromptSubmit"
5247
-
5248
- def _is_c3_prompt_hook(entry: dict) -> bool:
5249
- return any(
5250
- "hook_dispatch.py" in (hk.get("command") or "")
5251
- for hk in entry.get("hooks", [])
5252
- )
5219
+ # Same merge discipline as Stop: replace only C3's own entries
5220
+ # (identified by the dispatcher script in the command), keep
5221
+ # user-added ones.
5222
+ prompt_event = "UserPromptSubmit"
5253
5223
 
5254
- existing_prompt = [
5255
- h for h in settings.get("hooks", {}).get(prompt_event, [])
5256
- if not _is_c3_prompt_hook(h)
5257
- ]
5258
- existing_prompt.append(
5259
- {"matcher": "", "hooks": [{"type": "command", "command": hook_prompt_cmd}]}
5224
+ def _is_c3_prompt_hook(entry: dict) -> bool:
5225
+ return any(
5226
+ "hook_dispatch.py" in (hk.get("command") or "")
5227
+ for hk in entry.get("hooks", [])
5260
5228
  )
5261
- settings.setdefault("hooks", {})[prompt_event] = existing_prompt
5229
+
5230
+ existing_prompt = [
5231
+ h for h in settings.get("hooks", {}).get(prompt_event, [])
5232
+ if not _is_c3_prompt_hook(h)
5233
+ ]
5234
+ existing_prompt.append(
5235
+ {"matcher": "", "hooks": [{"type": "command", "command": hook_prompt_cmd}]}
5236
+ )
5237
+ settings.setdefault("hooks", {})[prompt_event] = existing_prompt
5262
5238
 
5263
5239
  # Claude Code only: enable MCP server prompt settings
5264
5240
  if profile.name == "claude-code":
@@ -5364,20 +5340,6 @@ def cmd_install_mcp(args):
5364
5340
  print(f"Warning: {global_codex_cfg} has [mcp_servers.c3] enabled = false.")
5365
5341
  print(" This can make C3 look disabled. Set it to true or remove that global c3 section.")
5366
5342
 
5367
- # ── Gemini settings.json enforcement file ──────────────────
5368
- if profile.name == "gemini":
5369
- # Warn about a common conflict: global Gemini config pointing elsewhere.
5370
- global_gemini_cfg = Path.home() / ".gemini" / "settings.json"
5371
- if global_gemini_cfg.exists():
5372
- try:
5373
- with open(global_gemini_cfg, 'r', encoding="utf-8") as f:
5374
- g_data = json.load(f)
5375
- if "mcpServers" in g_data and "c3" in g_data["mcpServers"]:
5376
- print(f"Note: Global config {global_gemini_cfg} also defines 'c3'.")
5377
- print(" The project-local config at .gemini/settings.json should take precedence.")
5378
- except Exception:
5379
- pass
5380
-
5381
5343
  _sync_project_instruction_docs(str(target), sm)
5382
5344
 
5383
5345
  # ── User-global C3 enforcement ──────────────────────────────
@@ -5387,7 +5349,7 @@ def cmd_install_mcp(args):
5387
5349
  print(f"Warning: Could not update global CLAUDE.md: {e}")
5388
5350
 
5389
5351
  # ── Install /terse skill for supported IDEs ──────────────────
5390
- if profile.name in ("claude-code", "codex", "gemini"):
5352
+ if profile.name in ("claude-code", "codex"):
5391
5353
  try:
5392
5354
  _ensure_terse_skill(profile.name)
5393
5355
  except Exception as e:
@@ -21,7 +21,7 @@ def build_parser(version: str, parse_cli_ide_arg):
21
21
  p_init.add_argument("project_path", nargs="?", default=".")
22
22
  p_init.add_argument("--force", action="store_true", help="Skip prompts and apply update non-interactively")
23
23
  p_init.add_argument("--clear", action="store_true", help="Remove all C3 files and exit without rebuilding")
24
- p_init.add_argument("--ide", default="auto", type=parse_cli_ide_arg, metavar="{auto,claude,vscode,cursor,codex,gemini,antigravity}", help="Target IDE for MCP config (default: auto-detect)")
24
+ p_init.add_argument("--ide", default="auto", type=parse_cli_ide_arg, metavar="{auto,claude,vscode,cursor,codex,antigravity}", help="Target IDE for MCP config (default: auto-detect)")
25
25
  p_init.add_argument("--mcp-mode", choices=["direct", "proxy"], default="direct", help="Default MCP mode if install is selected during init (default: direct)")
26
26
  p_init.add_argument("--git", action="store_true", help="Initialize a local Git repository during init/update")
27
27
  p_init.add_argument("--permissions", choices=["read-only", "c3-strict", "standard", "permissive"], default=None, help="Apply Claude Code permission tier (Claude Code only, used with --force)")
@@ -93,14 +93,14 @@ def build_parser(version: str, parse_cli_ide_arg):
93
93
 
94
94
  p_install_mcp = subparsers.add_parser("install-mcp", help="Generate MCP config for your IDE")
95
95
  p_install_mcp.add_argument("targets", nargs="*", help="Optional project path and/or IDE shorthand (for example: `claude` or `. codex`)")
96
- p_install_mcp.add_argument("--ide", default="auto", type=parse_cli_ide_arg, metavar="{auto,claude,vscode,cursor,codex,gemini,antigravity}", help="Target IDE (default: auto-detect)")
96
+ p_install_mcp.add_argument("--ide", default="auto", type=parse_cli_ide_arg, metavar="{auto,claude,vscode,cursor,codex,antigravity}", help="Target IDE (default: auto-detect)")
97
97
  p_install_mcp.add_argument("--mcp-mode", choices=["direct", "proxy"], default="direct", help="MCP entrypoint mode (default: direct)")
98
98
  p_install_mcp.add_argument("--permissions", choices=["read-only", "c3-strict", "standard", "permissive"], default=None, help="Apply Claude Code permission tier (Claude Code only)")
99
99
  p_install_mcp.add_argument("--include-mcp-wildcard", action="store_true", help="Add mcp__* wildcard so non-C3 MCP servers don't prompt per-call")
100
100
 
101
101
  p_mcp_install = subparsers.add_parser("mcp-install", help="Alias for install-mcp")
102
102
  p_mcp_install.add_argument("targets", nargs="*", help="Optional project path and/or IDE shorthand")
103
- p_mcp_install.add_argument("--ide", default="auto", type=parse_cli_ide_arg, metavar="{auto,claude,vscode,cursor,codex,gemini,antigravity}", help="Target IDE (default: auto-detect)")
103
+ p_mcp_install.add_argument("--ide", default="auto", type=parse_cli_ide_arg, metavar="{auto,claude,vscode,cursor,codex,antigravity}", help="Target IDE (default: auto-detect)")
104
104
  p_mcp_install.add_argument("--mcp-mode", choices=["direct", "proxy"], default="direct", help="MCP entrypoint mode (default: direct)")
105
105
  p_mcp_install.add_argument("--permissions", choices=["read-only", "c3-strict", "standard", "permissive"], default=None, help="Apply Claude Code permission tier (Claude Code only)")
106
106
  p_mcp_install.add_argument("--include-mcp-wildcard", action="store_true", help="Add mcp__* wildcard so non-C3 MCP servers don't prompt per-call")