code-context-control 2.59.0__tar.gz → 2.61.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 (359) hide show
  1. {code_context_control-2.59.0 → code_context_control-2.61.0}/PKG-INFO +27 -7
  2. {code_context_control-2.59.0 → code_context_control-2.61.0}/README.md +26 -6
  3. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/c3.py +30 -12
  4. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/commands/common.py +51 -0
  5. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/commands/parser.py +4 -0
  6. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/guide/bitbucket.html +1 -0
  7. code_context_control-2.61.0/cli/guide/credentials.html +554 -0
  8. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/guide/getting-started.html +37 -0
  9. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/guide/index.html +10 -1
  10. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/guide/oracle.html +1 -0
  11. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/guide/tools.html +57 -1
  12. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/guide/workflow.html +49 -0
  13. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hook_edit_ledger.py +9 -0
  14. code_context_control-2.61.0/cli/hub_ui/components/hub_credentials.js +1546 -0
  15. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/mcp_server.py +27 -1
  16. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/agent.py +4 -4
  17. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/delegate.py +35 -20
  18. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui/components/credentials.js +3 -3
  19. {code_context_control-2.59.0 → code_context_control-2.61.0}/code_context_control.egg-info/PKG-INFO +27 -7
  20. {code_context_control-2.59.0 → code_context_control-2.61.0}/code_context_control.egg-info/SOURCES.txt +4 -0
  21. {code_context_control-2.59.0 → code_context_control-2.61.0}/pyproject.toml +1 -1
  22. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/agents.py +1 -1
  23. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/claude_md.py +44 -14
  24. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/edit_ledger.py +7 -0
  25. code_context_control-2.61.0/services/repo_map.py +584 -0
  26. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/session_manager.py +29 -13
  27. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_install_mcp_entrypoint.py +34 -0
  28. code_context_control-2.61.0/tests/test_no_stale_model_pins.py +60 -0
  29. code_context_control-2.61.0/tests/test_repo_map.py +365 -0
  30. code_context_control-2.59.0/cli/hub_ui/components/hub_credentials.js +0 -516
  31. {code_context_control-2.59.0 → code_context_control-2.61.0}/LICENSE +0 -0
  32. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/__init__.py +0 -0
  33. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/_hook_utils.py +0 -0
  34. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/commands/__init__.py +0 -0
  35. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/docs.html +0 -0
  36. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/edits.html +0 -0
  37. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/guide/shared.css +0 -0
  38. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hook_artifact.py +0 -0
  39. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hook_auto_snapshot.py +0 -0
  40. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hook_c3_signal.py +0 -0
  41. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hook_c3read.py +0 -0
  42. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hook_dispatch.py +0 -0
  43. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hook_edit_unlock.py +0 -0
  44. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hook_filter.py +0 -0
  45. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hook_ghost_files.py +0 -0
  46. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hook_pretool_enforce.py +0 -0
  47. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hook_prompt_recall.py +0 -0
  48. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hook_read.py +0 -0
  49. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hook_session_stats.py +0 -0
  50. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hook_terse_advisor.py +0 -0
  51. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub.html +0 -0
  52. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_server.py +0 -0
  53. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/app.js +0 -0
  54. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/add_project.js +0 -0
  55. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/config_editor.js +0 -0
  56. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/drill_artifacts.js +0 -0
  57. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/drill_health.js +0 -0
  58. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/drill_panel.js +0 -0
  59. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/drill_subprojects.js +0 -0
  60. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/drill_tasks.js +0 -0
  61. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/drill_views.js +0 -0
  62. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/global_search.js +0 -0
  63. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/mcp_manager.js +0 -0
  64. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/modals.js +0 -0
  65. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/project_card.js +0 -0
  66. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/project_tree.js +0 -0
  67. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/session_drawer.js +0 -0
  68. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/settings_modal.js +0 -0
  69. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/sidebar.js +0 -0
  70. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/summary_bar.js +0 -0
  71. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/task_board.js +0 -0
  72. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/toasts.js +0 -0
  73. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/components/topbar.js +0 -0
  74. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui/state.js +0 -0
  75. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/hub_ui.html +0 -0
  76. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/mcp_proxy.py +0 -0
  77. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/progress.py +0 -0
  78. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/server.py +0 -0
  79. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/__init__.py +0 -0
  80. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/_helpers.py +0 -0
  81. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/artifacts.py +0 -0
  82. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/bitbucket.py +0 -0
  83. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/compress.py +0 -0
  84. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/credentials.py +0 -0
  85. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/edit.py +0 -0
  86. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/edits.py +0 -0
  87. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/federate.py +0 -0
  88. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/filter.py +0 -0
  89. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/impact.py +0 -0
  90. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/jira.py +0 -0
  91. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/memory.py +0 -0
  92. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/project.py +0 -0
  93. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/read.py +0 -0
  94. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/search.py +0 -0
  95. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/session.py +0 -0
  96. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/shell.py +0 -0
  97. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/status.py +0 -0
  98. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/tasks.py +0 -0
  99. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/tools/validate.py +0 -0
  100. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui/api.js +0 -0
  101. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui/app.js +0 -0
  102. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui/components/bitbucket.js +0 -0
  103. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui/components/chat.js +0 -0
  104. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui/components/dashboard.js +0 -0
  105. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui/components/edits.js +0 -0
  106. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui/components/instructions.js +0 -0
  107. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui/components/jira.js +0 -0
  108. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui/components/memory.js +0 -0
  109. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui/components/sessions.js +0 -0
  110. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui/components/settings.js +0 -0
  111. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui/components/sidebar.js +0 -0
  112. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui/components/tasks.js +0 -0
  113. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui/icons.js +0 -0
  114. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui/pm_shared.js +0 -0
  115. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui/shared.js +0 -0
  116. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui/theme.js +0 -0
  117. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui.html +0 -0
  118. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui_legacy.html +0 -0
  119. {code_context_control-2.59.0 → code_context_control-2.61.0}/cli/ui_nano.html +0 -0
  120. {code_context_control-2.59.0 → code_context_control-2.61.0}/code_context_control.egg-info/dependency_links.txt +0 -0
  121. {code_context_control-2.59.0 → code_context_control-2.61.0}/code_context_control.egg-info/entry_points.txt +0 -0
  122. {code_context_control-2.59.0 → code_context_control-2.61.0}/code_context_control.egg-info/requires.txt +0 -0
  123. {code_context_control-2.59.0 → code_context_control-2.61.0}/code_context_control.egg-info/top_level.txt +0 -0
  124. {code_context_control-2.59.0 → code_context_control-2.61.0}/core/__init__.py +0 -0
  125. {code_context_control-2.59.0 → code_context_control-2.61.0}/core/config.py +0 -0
  126. {code_context_control-2.59.0 → code_context_control-2.61.0}/core/ide.py +0 -0
  127. {code_context_control-2.59.0 → code_context_control-2.61.0}/core/mcp_toml.py +0 -0
  128. {code_context_control-2.59.0 → code_context_control-2.61.0}/core/web_security.py +0 -0
  129. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/__init__.py +0 -0
  130. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/config.py +0 -0
  131. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/mcp_oracle.py +0 -0
  132. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/oracle_server.py +0 -0
  133. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/oracle_ui.html +0 -0
  134. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/services/__init__.py +0 -0
  135. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/services/activity_reporter.py +0 -0
  136. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/services/api_auth.py +0 -0
  137. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/services/c3_bridge.py +0 -0
  138. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/services/chat_engine.py +0 -0
  139. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/services/chat_store.py +0 -0
  140. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/services/cross_memory.py +0 -0
  141. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/services/federated_graph.py +0 -0
  142. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/services/health_checker.py +0 -0
  143. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/services/insight_engine.py +0 -0
  144. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/services/local_session.py +0 -0
  145. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/services/memory_reader.py +0 -0
  146. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/services/memory_writer.py +0 -0
  147. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/services/project_scanner.py +0 -0
  148. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/services/review_agent.py +0 -0
  149. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/services/tool_executor.py +0 -0
  150. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/services/tool_registry.py +0 -0
  151. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/ui/activity.js +0 -0
  152. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/ui/agents.js +0 -0
  153. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/ui/app.js +0 -0
  154. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/ui/busy.js +0 -0
  155. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/ui/chat/conversations.js +0 -0
  156. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/ui/chat/input.js +0 -0
  157. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/ui/chat/markdown.js +0 -0
  158. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/ui/chat/send.js +0 -0
  159. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/ui/chat/stream_renderer.js +0 -0
  160. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/ui/chat/toolbar.js +0 -0
  161. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/ui/core.js +0 -0
  162. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/ui/crossgraph.js +0 -0
  163. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/ui/header.js +0 -0
  164. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/ui/insights.js +0 -0
  165. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/ui/projects.js +0 -0
  166. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/ui/settings.js +0 -0
  167. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/ui/suggestions.js +0 -0
  168. {code_context_control-2.59.0 → code_context_control-2.61.0}/oracle/ui/theme_tabs.js +0 -0
  169. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/__init__.py +0 -0
  170. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/activity_log.py +0 -0
  171. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/agent_base.py +0 -0
  172. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/artifact_defs.py +0 -0
  173. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/artifact_store.py +0 -0
  174. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/auto_memory.py +0 -0
  175. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/bench/__init__.py +0 -0
  176. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/bench/external/__init__.py +0 -0
  177. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/bench/external/aider_polyglot.py +0 -0
  178. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/bench/external/swe_bench.py +0 -0
  179. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/benchmark_dashboard.py +0 -0
  180. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/bitbucket_client.py +0 -0
  181. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/bitbucket_credentials.py +0 -0
  182. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/circuit_breaker.py +0 -0
  183. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/compressor.py +0 -0
  184. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/context_snapshot.py +0 -0
  185. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/conversation_store.py +0 -0
  186. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/credential_store.py +0 -0
  187. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/doc_index.py +0 -0
  188. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/e2e_benchmark.py +0 -0
  189. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/e2e_evaluator.py +0 -0
  190. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/e2e_tasks.py +0 -0
  191. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/embedding_index.py +0 -0
  192. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/error_reporting.py +0 -0
  193. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/file_memory.py +0 -0
  194. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/git_context.py +0 -0
  195. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/hub_service.py +0 -0
  196. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/indexer.py +0 -0
  197. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/jira_client.py +0 -0
  198. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/jira_cloud.py +0 -0
  199. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/jira_credentials.py +0 -0
  200. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/jira_data_center.py +0 -0
  201. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/jira_links.py +0 -0
  202. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/memory.py +0 -0
  203. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/memory_consolidator.py +0 -0
  204. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/memory_distiller.py +0 -0
  205. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/memory_graph.py +0 -0
  206. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/memory_grounder.py +0 -0
  207. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/memory_queue.py +0 -0
  208. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/memory_scorer.py +0 -0
  209. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/metrics.py +0 -0
  210. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/notifications.py +0 -0
  211. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/ollama_bridge.py +0 -0
  212. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/ollama_client.py +0 -0
  213. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/ollama_credentials.py +0 -0
  214. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/output_filter.py +0 -0
  215. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/parser.py +0 -0
  216. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/project_manager.py +0 -0
  217. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/project_runtime.py +0 -0
  218. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/protocol.py +0 -0
  219. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/proxy_state.py +0 -0
  220. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/retention.py +0 -0
  221. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/retrieval_broker.py +0 -0
  222. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/router.py +0 -0
  223. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/runtime.py +0 -0
  224. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/scanner.py +0 -0
  225. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/session_benchmark.py +0 -0
  226. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/session_preloader.py +0 -0
  227. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/subprojects.py +0 -0
  228. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/task_store.py +0 -0
  229. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/telemetry.py +0 -0
  230. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/text_index.py +0 -0
  231. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/time_tracker.py +0 -0
  232. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/tool_classifier.py +0 -0
  233. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/transcript_index.py +0 -0
  234. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/validation_cache.py +0 -0
  235. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/vector_store.py +0 -0
  236. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/watcher.py +0 -0
  237. {code_context_control-2.59.0 → code_context_control-2.61.0}/services/win_subprocess.py +0 -0
  238. {code_context_control-2.59.0 → code_context_control-2.61.0}/setup.cfg +0 -0
  239. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_activity_reporter.py +0 -0
  240. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_aider_polyglot.py +0 -0
  241. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_antigravity_transition.py +0 -0
  242. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_artifact_store.py +0 -0
  243. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_artifact_tool.py +0 -0
  244. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_bitbucket_cli_smoke.py +0 -0
  245. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_bitbucket_client.py +0 -0
  246. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_bitbucket_config_fallback.py +0 -0
  247. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_bitbucket_credentials.py +0 -0
  248. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_bitbucket_tool.py +0 -0
  249. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_c3_bridge_project_artifacts.py +0 -0
  250. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_c3_shell.py +0 -0
  251. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_circuit_breaker.py +0 -0
  252. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_claude_md_merge.py +0 -0
  253. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_cli_smoke.py +0 -0
  254. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_compressor_large_file.py +0 -0
  255. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_credential_store.py +0 -0
  256. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_credentials_routes.py +0 -0
  257. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_credentials_tool.py +0 -0
  258. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_creds_cli_smoke.py +0 -0
  259. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_delegate_cascade.py +0 -0
  260. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_e2e_benchmark.py +0 -0
  261. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_edit_ledger_hook.py +0 -0
  262. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_edit_normalization.py +0 -0
  263. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_enforcement_flip.py +0 -0
  264. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_federated_graph.py +0 -0
  265. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_filter_backoff.py +0 -0
  266. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_ghost_files.py +0 -0
  267. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_ghost_generation.py +0 -0
  268. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_git_branch_awareness.py +0 -0
  269. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_hook_dispatch.py +0 -0
  270. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_hook_pretool_enforce.py +0 -0
  271. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_hook_prompt_recall.py +0 -0
  272. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_hook_smoke.py +0 -0
  273. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_hook_state.py +0 -0
  274. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_hook_utf8_stdio.py +0 -0
  275. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_hub_credentials_route.py +0 -0
  276. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_hub_credentials_routes_write.py +0 -0
  277. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_hub_inspect_api.py +0 -0
  278. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_hub_server_smoke.py +0 -0
  279. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_hub_subproject_links.py +0 -0
  280. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_init_scan.py +0 -0
  281. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_jira_cli_smoke.py +0 -0
  282. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_jira_client.py +0 -0
  283. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_jira_config_fallback.py +0 -0
  284. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_jira_credentials.py +0 -0
  285. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_jira_links.py +0 -0
  286. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_jira_routes.py +0 -0
  287. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_jira_tool.py +0 -0
  288. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_lazy_store_init.py +0 -0
  289. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_mcp_host_guard.py +0 -0
  290. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_mcp_memory_timeout.py +0 -0
  291. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_mcp_server_smoke.py +0 -0
  292. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_mcp_toml.py +0 -0
  293. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_memory_distiller.py +0 -0
  294. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_memory_graph_api.py +0 -0
  295. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_memory_queue.py +0 -0
  296. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_memory_system.py +0 -0
  297. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_notification_dedup.py +0 -0
  298. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_notification_discipline.py +0 -0
  299. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_ollama_credentials.py +0 -0
  300. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_oracle_api_auth.py +0 -0
  301. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_oracle_apikey_api.py +0 -0
  302. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_oracle_c3_bridge.py +0 -0
  303. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_oracle_chat_engine.py +0 -0
  304. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_oracle_discovery_api.py +0 -0
  305. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_oracle_local_auth.py +0 -0
  306. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_oracle_ollama_bridge.py +0 -0
  307. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_oracle_scanner_cache.py +0 -0
  308. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_oracle_security_fixes.py +0 -0
  309. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_oracle_subproject_awareness.py +0 -0
  310. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_oracle_ui_bundle.py +0 -0
  311. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_output_filter.py +0 -0
  312. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_permissions.py +0 -0
  313. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_pm_api.py +0 -0
  314. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_project_manager.py +0 -0
  315. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_project_manager_merge.py +0 -0
  316. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_project_tool.py +0 -0
  317. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_read_coercion.py +0 -0
  318. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_read_edit_parity.py +0 -0
  319. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_related_facts.py +0 -0
  320. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_response_boilerplate.py +0 -0
  321. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_retention.py +0 -0
  322. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_review_digest.py +0 -0
  323. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_service_durability.py +0 -0
  324. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_session_benchmark.py +0 -0
  325. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_session_budget.py +0 -0
  326. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_shell_creds.py +0 -0
  327. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_shell_robustness.py +0 -0
  328. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_subproject_exclusion.py +0 -0
  329. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_subproject_federation.py +0 -0
  330. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_subprojects.py +0 -0
  331. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_swe_bench.py +0 -0
  332. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_task_store.py +0 -0
  333. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_task_tool.py +0 -0
  334. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_time_tracker.py +0 -0
  335. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_token_telemetry.py +0 -0
  336. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_tool_registry.py +0 -0
  337. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_upgrade_and_version.py +0 -0
  338. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_validate.py +0 -0
  339. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_version_sync.py +0 -0
  340. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_web_security.py +0 -0
  341. {code_context_control-2.59.0 → code_context_control-2.61.0}/tests/test_windows_reliability.py +0 -0
  342. {code_context_control-2.59.0 → code_context_control-2.61.0}/tui/__init__.py +0 -0
  343. {code_context_control-2.59.0 → code_context_control-2.61.0}/tui/backend.py +0 -0
  344. {code_context_control-2.59.0 → code_context_control-2.61.0}/tui/main.py +0 -0
  345. {code_context_control-2.59.0 → code_context_control-2.61.0}/tui/screens/__init__.py +0 -0
  346. {code_context_control-2.59.0 → code_context_control-2.61.0}/tui/screens/benchmark_view.py +0 -0
  347. {code_context_control-2.59.0 → code_context_control-2.61.0}/tui/screens/claudemd_view.py +0 -0
  348. {code_context_control-2.59.0 → code_context_control-2.61.0}/tui/screens/compress_view.py +0 -0
  349. {code_context_control-2.59.0 → code_context_control-2.61.0}/tui/screens/index_view.py +0 -0
  350. {code_context_control-2.59.0 → code_context_control-2.61.0}/tui/screens/init_view.py +0 -0
  351. {code_context_control-2.59.0 → code_context_control-2.61.0}/tui/screens/mcp_view.py +0 -0
  352. {code_context_control-2.59.0 → code_context_control-2.61.0}/tui/screens/optimize_view.py +0 -0
  353. {code_context_control-2.59.0 → code_context_control-2.61.0}/tui/screens/pipe_view.py +0 -0
  354. {code_context_control-2.59.0 → code_context_control-2.61.0}/tui/screens/projects_view.py +0 -0
  355. {code_context_control-2.59.0 → code_context_control-2.61.0}/tui/screens/search_view.py +0 -0
  356. {code_context_control-2.59.0 → code_context_control-2.61.0}/tui/screens/session_view.py +0 -0
  357. {code_context_control-2.59.0 → code_context_control-2.61.0}/tui/screens/stats.py +0 -0
  358. {code_context_control-2.59.0 → code_context_control-2.61.0}/tui/screens/ui_view.py +0 -0
  359. {code_context_control-2.59.0 → code_context_control-2.61.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.59.0
3
+ Version: 2.61.0
4
4
  Summary: Local code-intelligence layer for AI coding tools (Claude Code, Codex, Copilot, Cursor, Antigravity). Retrieve less, read less, edit safer — version the configs that shape your agent (CLAUDE.md, skills, hooks, MCP), and manage multi-project + sub-project hierarchies from a local hub.
5
5
  Author-email: Dimitri Tselenchuk <dtselenc@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -243,6 +243,8 @@ Manage `CLAUDE.md`, `AGENTS.md` (Codex), `GEMINI.md`, and `.github/copilot-instr
243
243
 
244
244
  C3-generated content is wrapped in a `<!-- C3:BEGIN … -->` / `<!-- C3:END -->` block. Regenerating (or `Compact`) only rewrites that block — **anything you write outside it is preserved**, so it's safe to keep your own notes in the same file.
245
245
 
246
+ **Live repo map (v2.60.0):** generated docs no longer embed a frozen project tree. They carry a stable pointer to `.c3/MAP.md` — a machine-owned, byte-stable map (commands, entry points, module one-liners, tree) that C3 refreshes automatically via edit hooks and a first-tool-call freshness check. Manage it with `c3 map status|ensure|refresh`; set `map.enabled=false` in `.c3/config.json` to restore the embedded tree.
247
+
246
248
  ### 7. Chat — browse prior AI conversations
247
249
 
248
250
  <p align="center">
@@ -359,12 +361,30 @@ with credentials disabled, and the vault is hard-excluded from the Oracle
359
361
  Discovery API.
360
362
 
361
363
  Since **v2.59.0** the Hub has a top-level **Credentials** view: manage the
362
- global vault (`~/.c3`) and every registered project's entries from one place
363
- create / edit / delete / `.env` import / flag toggles, with shadowing shown
364
- both ways ("shadows global" on project entries, "shadowed in N projects" on
365
- globals). The write-only wire contract extends to the hub: values are
366
- submitted inbound-only and **no hub route ever returns a stored value** (there
367
- is no `reveal` on the hub at all).
364
+ global vault (`~/.c3`) and every registered project's entries from one place,
365
+ with overriding shown both ways ("overrides global" on project entries,
366
+ "overridden ×N" on globals). **v2.61.0** makes it navigable at scale:
367
+
368
+ - **Cross-project search** <kbd>/</kbd> or <kbd>Ctrl/⌘-K</kbd>. Free words
369
+ match name / description / env var / project; `project:` `scope:` `type:`
370
+ `storage:` `name:` `env:` `inject:` `agent:` `shadow:` qualifiers narrow
371
+ further. Results are **grouped by credential name**, so "where is
372
+ `STRIPE_KEY` defined and which one wins?" is one glance instead of forty
373
+ accordions. `agent:true` and `inject:true` are one-key exposure audits.
374
+ - **Per-credential settings drawer** — metadata, the two exposure switches
375
+ with their blast radius written out, an on-demand resolution check +
376
+ fingerprint, write-only value replacement, usage and override
377
+ relationships, and a separated danger zone.
378
+ - **Right-click context menu** on any row (also `⋯` and <kbd>Shift</kbd>+<kbd>F10</kbd>),
379
+ with typed confirmations replacing `window.confirm`: deleting or granting
380
+ agent-read access requires typing the credential's name.
381
+
382
+ The write-only wire contract extends to the hub: values are submitted
383
+ inbound-only, **no hub route ever returns a stored value** (there is no
384
+ `reveal` on the hub at all), and search indexes metadata only.
385
+
386
+ Full documentation: [`cli/guide/credentials.html`](cli/guide/credentials.html)
387
+ — open it in the app at `/guide/credentials.html`.
368
388
 
369
389
  ### Jira — Cloud + Data Center (v2.56.0)
370
390
 
@@ -180,6 +180,8 @@ Manage `CLAUDE.md`, `AGENTS.md` (Codex), `GEMINI.md`, and `.github/copilot-instr
180
180
 
181
181
  C3-generated content is wrapped in a `<!-- C3:BEGIN … -->` / `<!-- C3:END -->` block. Regenerating (or `Compact`) only rewrites that block — **anything you write outside it is preserved**, so it's safe to keep your own notes in the same file.
182
182
 
183
+ **Live repo map (v2.60.0):** generated docs no longer embed a frozen project tree. They carry a stable pointer to `.c3/MAP.md` — a machine-owned, byte-stable map (commands, entry points, module one-liners, tree) that C3 refreshes automatically via edit hooks and a first-tool-call freshness check. Manage it with `c3 map status|ensure|refresh`; set `map.enabled=false` in `.c3/config.json` to restore the embedded tree.
184
+
183
185
  ### 7. Chat — browse prior AI conversations
184
186
 
185
187
  <p align="center">
@@ -296,12 +298,30 @@ with credentials disabled, and the vault is hard-excluded from the Oracle
296
298
  Discovery API.
297
299
 
298
300
  Since **v2.59.0** the Hub has a top-level **Credentials** view: manage the
299
- global vault (`~/.c3`) and every registered project's entries from one place
300
- create / edit / delete / `.env` import / flag toggles, with shadowing shown
301
- both ways ("shadows global" on project entries, "shadowed in N projects" on
302
- globals). The write-only wire contract extends to the hub: values are
303
- submitted inbound-only and **no hub route ever returns a stored value** (there
304
- is no `reveal` on the hub at all).
301
+ global vault (`~/.c3`) and every registered project's entries from one place,
302
+ with overriding shown both ways ("overrides global" on project entries,
303
+ "overridden ×N" on globals). **v2.61.0** makes it navigable at scale:
304
+
305
+ - **Cross-project search** <kbd>/</kbd> or <kbd>Ctrl/⌘-K</kbd>. Free words
306
+ match name / description / env var / project; `project:` `scope:` `type:`
307
+ `storage:` `name:` `env:` `inject:` `agent:` `shadow:` qualifiers narrow
308
+ further. Results are **grouped by credential name**, so "where is
309
+ `STRIPE_KEY` defined and which one wins?" is one glance instead of forty
310
+ accordions. `agent:true` and `inject:true` are one-key exposure audits.
311
+ - **Per-credential settings drawer** — metadata, the two exposure switches
312
+ with their blast radius written out, an on-demand resolution check +
313
+ fingerprint, write-only value replacement, usage and override
314
+ relationships, and a separated danger zone.
315
+ - **Right-click context menu** on any row (also `⋯` and <kbd>Shift</kbd>+<kbd>F10</kbd>),
316
+ with typed confirmations replacing `window.confirm`: deleting or granting
317
+ agent-read access requires typing the credential's name.
318
+
319
+ The write-only wire contract extends to the hub: values are submitted
320
+ inbound-only, **no hub route ever returns a stored value** (there is no
321
+ `reveal` on the hub at all), and search indexes metadata only.
322
+
323
+ Full documentation: [`cli/guide/credentials.html`](cli/guide/credentials.html)
324
+ — open it in the app at `/guide/credentials.html`.
305
325
 
306
326
  ### Jira — Cloud + Data Center (v2.56.0)
307
327
 
@@ -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.59.0"
95
+ __version__ = "2.61.0"
96
96
 
97
97
 
98
98
  def _command_deps() -> CommandDeps:
@@ -1313,6 +1313,12 @@ def cmd_claudemd(args):
1313
1313
  return common_cmd_claudemd(args, _command_deps())
1314
1314
 
1315
1315
 
1316
+ def cmd_map(args):
1317
+ """Live repo map (.c3/MAP.md) commands."""
1318
+ from cli.commands.common import cmd_map as common_cmd_map
1319
+ return common_cmd_map(args, _command_deps())
1320
+
1321
+
1316
1322
  def cmd_stats(args):
1317
1323
  """Show comprehensive stats."""
1318
1324
  return common_cmd_stats(args, _command_deps())
@@ -5122,22 +5128,33 @@ def cmd_install_mcp(args):
5122
5128
  settings = _safe_read_json(settings_path, str(settings_path))
5123
5129
 
5124
5130
  # Build hook commands using the Python executable that runs c3.
5125
- # On Windows, Claude Code executes hooks via /usr/bin/bash (Git Bash), which cannot
5126
- # parse Windows absolute paths containing parentheses (e.g. "(C3)"). Prefix with
5127
- # cmd.exe so it handles path resolution instead of bash.
5128
5131
  #
5129
- # Use "cmd.exe" WITH the extension, not bare "cmd": Git Bash does not resolve bare
5130
- # "cmd" on PATH, so the old "cmd /c" prefix silently failed to launch any hook
5131
- # (verified: under bash, "cmd.exe /c '<py>' '<hook>'" runs and writes the signal
5132
- # file; "cmd /c …" returns "cmd: command not found"). The single-quoted paths are
5133
- # correct bash strips them and re-quotes for cmd.exe, preserving spaces/parens.
5134
- _hook_prefix = "cmd.exe /c " if sys.platform == "win32" else ""
5132
+ # Windows: do NOT wrap in cmd.exe. Claude Code runs hooks through Git Bash,
5133
+ # whose MSYS argument conversion rewrites a standalone "/c" into "C:/" before
5134
+ # cmd.exe ever sees it — so cmd.exe starts INTERACTIVELY, prints its banner,
5135
+ # and reads the hook's stdin JSON payload as console commands. The hook never
5136
+ # runs, and any ">" token in the payload becomes a shell redirect that silently
5137
+ # creates junk files in the repo root.
5138
+ #
5139
+ # Verified 2026-07-26 under Git Bash on Windows 11:
5140
+ # python -c "import sys;print(sys.argv)" /c foo -> ['-c', 'C:/', 'foo']
5141
+ # cmd.exe /c '<py>' -c "print('x')" -> banner, no execution
5142
+ # '<py>' '<hook>' posttool -> runs, stdin intact
5143
+ # Both "cmd /c" (bash cannot resolve bare "cmd") and "cmd.exe /c" are broken;
5144
+ # the wrapper was never needed. A double-quoted forward-slash path is parsed
5145
+ # correctly by bash AND cmd, including paths containing spaces or parentheses
5146
+ # (e.g. "Claude Code Companion (C3)"), which is why the wrapper was added.
5147
+ def _hook_arg(raw: str) -> str:
5148
+ if sys.platform == "win32":
5149
+ return '"' + str(raw).replace("\\", "/") + '"'
5150
+ return shlex.quote(str(raw))
5151
+
5135
5152
  # v2.42: single dispatcher script per hook event instead of N separate
5136
5153
  # per-hook commands. One interpreter spawn per event; the dispatcher
5137
5154
  # (cli/hook_dispatch.py) runs all applicable sub-hooks in-process.
5138
5155
  _dispatch_base = (
5139
- f"{_hook_prefix}{shlex.quote(sys.executable)} "
5140
- f"{shlex.quote(str(cli_dir / 'hook_dispatch.py'))}"
5156
+ f"{_hook_arg(sys.executable)} "
5157
+ f"{_hook_arg(str(cli_dir / 'hook_dispatch.py'))}"
5141
5158
  )
5142
5159
  hook_pretool_cmd = f"{_dispatch_base} pretool"
5143
5160
  hook_posttool_cmd = f"{_dispatch_base} posttool"
@@ -7162,6 +7179,7 @@ def main():
7162
7179
  "decode": cmd_decode,
7163
7180
  "session": cmd_session,
7164
7181
  "claudemd": cmd_claudemd,
7182
+ "map": cmd_map,
7165
7183
  "stats": cmd_stats,
7166
7184
  "benchmark": cmd_benchmark,
7167
7185
  "session-benchmark": cmd_session_benchmark,
@@ -159,6 +159,57 @@ def cmd_session(args, deps: CommandDeps):
159
159
  print(context)
160
160
 
161
161
 
162
+ def cmd_map(args, deps: CommandDeps):
163
+ """Live repo map (.c3/MAP.md): status | ensure | refresh."""
164
+ config = deps.load_config()
165
+ project_path = config.get("project_path", ".")
166
+
167
+ from services.repo_map import RepoMapService
168
+
169
+ sm = deps.SessionManager(project_path)
170
+ svc = RepoMapService(project_path, session_mgr=sm)
171
+
172
+ if args.map_cmd == "status":
173
+ result = svc.status()
174
+ elif args.map_cmd == "ensure":
175
+ result = svc.ensure()
176
+ else:
177
+ result = svc.refresh()
178
+
179
+ if getattr(args, "json", False):
180
+ print(json.dumps(result, indent=2))
181
+ return
182
+
183
+ if args.map_cmd == "status":
184
+ state = "STALE" if result["stale"] else ("FRESH" if result["exists"] else "MISSING")
185
+ deps.print_header(f"Repo Map — {state}")
186
+ print(f" Path: {svc.map_path}")
187
+ if result.get("generated_at"):
188
+ print(f" Generated: {result['generated_at']}")
189
+ if result.get("tokens"):
190
+ print(f" Tokens: {result['tokens']}")
191
+ if result.get("reasons"):
192
+ print(f" Stale reasons: {', '.join(result['reasons'])}")
193
+ if result.get("truncated"):
194
+ print(" [WARN] Map is truncated (file cap or token budget hit)")
195
+ else:
196
+ action = result.get("action", "?")
197
+ label = {
198
+ "regenerated": "Map regenerated",
199
+ "meta_only": "Content unchanged (meta refreshed)",
200
+ "fresh": "Already fresh — nothing to do",
201
+ "locked": "Another process is regenerating — skipped",
202
+ "disabled": "Repo map disabled (map.enabled=false in .c3/config.json)",
203
+ }.get(action, action)
204
+ deps.print_header(f"Repo Map — {label}")
205
+ if result.get("tokens"):
206
+ print(f" Tokens: {result['tokens']}, duration: {result.get('duration_ms', '?')}ms")
207
+ if result.get("reasons"):
208
+ print(f" Triggered by: {', '.join(result['reasons'])}")
209
+ if result.get("truncated"):
210
+ print(" [WARN] Map is truncated (file cap or token budget hit)")
211
+
212
+
162
213
  def cmd_claudemd(args, deps: CommandDeps):
163
214
  """Instructions file generation commands."""
164
215
  config = deps.load_config()
@@ -61,6 +61,10 @@ def build_parser(version: str, parse_cli_ide_arg):
61
61
  p_claudemd.add_argument("claudemd_cmd", choices=["generate", "save", "check"])
62
62
  p_claudemd.add_argument("--nano", action="store_true", help="Generate nano mode (~250 tokens) instead of full compact mode")
63
63
 
64
+ p_map = subparsers.add_parser("map", help="Live repo map (.c3/MAP.md) management")
65
+ p_map.add_argument("map_cmd", choices=["status", "ensure", "refresh"])
66
+ p_map.add_argument("--json", action="store_true", help="Emit JSON result")
67
+
64
68
  subparsers.add_parser("stats", help="Show statistics")
65
69
 
66
70
  p_benchmark = subparsers.add_parser("benchmark", help="Run with/without-C3 workflow benchmark")
@@ -77,6 +77,7 @@
77
77
  <a href="getting-started.html">Get Started</a>
78
78
  <a href="workflow.html">Workflow</a>
79
79
  <a href="tools.html">Tools</a>
80
+ <a href="credentials.html">Credentials</a>
80
81
  <a href="bitbucket.html" class="active">Bitbucket</a>
81
82
  <a href="oracle.html">Oracle</a>
82
83
  <a href="https://github.com/sponsors/drknowhow" target="_blank" rel="noopener" style="color:#EA4AAA">&#9829; Sponsor</a>