code-context-control 2.88.2__tar.gz → 2.89.1__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 (440) hide show
  1. {code_context_control-2.88.2/code_context_control.egg-info → code_context_control-2.89.1}/PKG-INFO +1 -1
  2. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/c3.py +19 -8
  3. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/guide/bitbucket.html +12 -3
  4. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/guide/tools.html +33 -6
  5. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/mcp_server.py +54 -9
  6. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/bitbucket.py +190 -6
  7. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/jira.py +299 -10
  8. {code_context_control-2.88.2 → code_context_control-2.89.1/code_context_control.egg-info}/PKG-INFO +1 -1
  9. {code_context_control-2.88.2 → code_context_control-2.89.1}/pyproject.toml +1 -1
  10. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/bitbucket_client.py +127 -0
  11. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/claude_md.py +1 -1
  12. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/jira_client.py +174 -3
  13. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/jira_cloud.py +126 -2
  14. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/jira_data_center.py +180 -4
  15. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/parser.py +11 -1
  16. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/project_manager.py +3 -1
  17. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_bitbucket_client.py +141 -0
  18. code_context_control-2.89.1/tests/test_bitbucket_tool.py +364 -0
  19. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_jira_client.py +295 -1
  20. code_context_control-2.89.1/tests/test_jira_tool.py +598 -0
  21. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_project_manager_merge.py +68 -0
  22. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_validate.py +28 -0
  23. code_context_control-2.88.2/tests/test_bitbucket_tool.py +0 -189
  24. code_context_control-2.88.2/tests/test_jira_tool.py +0 -293
  25. {code_context_control-2.88.2 → code_context_control-2.89.1}/LICENSE +0 -0
  26. {code_context_control-2.88.2 → code_context_control-2.89.1}/README.md +0 -0
  27. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/__init__.py +0 -0
  28. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/_hook_utils.py +0 -0
  29. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/commands/__init__.py +0 -0
  30. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/commands/common.py +0 -0
  31. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/commands/parser.py +0 -0
  32. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/docs.html +0 -0
  33. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/edits.html +0 -0
  34. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/guide/access.html +0 -0
  35. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/guide/credentials.html +0 -0
  36. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/guide/getting-started.html +0 -0
  37. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/guide/index.html +0 -0
  38. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/guide/masking.html +0 -0
  39. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/guide/oracle.html +0 -0
  40. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/guide/shared.css +0 -0
  41. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/guide/workflow.html +0 -0
  42. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hook_access_guard.py +0 -0
  43. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hook_artifact.py +0 -0
  44. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hook_auto_snapshot.py +0 -0
  45. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hook_c3_signal.py +0 -0
  46. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hook_c3read.py +0 -0
  47. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hook_dispatch.py +0 -0
  48. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hook_edit_ledger.py +0 -0
  49. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hook_edit_unlock.py +0 -0
  50. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hook_filter.py +0 -0
  51. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hook_ghost_files.py +0 -0
  52. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hook_pretool_enforce.py +0 -0
  53. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hook_prompt_recall.py +0 -0
  54. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hook_read.py +0 -0
  55. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hook_session_stats.py +0 -0
  56. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hook_terse_advisor.py +0 -0
  57. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_server.py +0 -0
  58. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/app.js +0 -0
  59. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/add_project.js +0 -0
  60. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/config_editor.js +0 -0
  61. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/drill_artifacts.js +0 -0
  62. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/drill_health.js +0 -0
  63. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/drill_panel.js +0 -0
  64. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/drill_subprojects.js +0 -0
  65. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/drill_tasks.js +0 -0
  66. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/drill_views.js +0 -0
  67. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/global_search.js +0 -0
  68. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/hub_ci.js +0 -0
  69. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/hub_credentials.js +0 -0
  70. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/hub_enforcement.js +0 -0
  71. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/hub_locks.js +0 -0
  72. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/mcp_manager.js +0 -0
  73. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/modals.js +0 -0
  74. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/project_card.js +0 -0
  75. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/project_tree.js +0 -0
  76. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/session_drawer.js +0 -0
  77. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/settings_modal.js +0 -0
  78. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/sidebar.js +0 -0
  79. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/summary_bar.js +0 -0
  80. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/task_board.js +0 -0
  81. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/toasts.js +0 -0
  82. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/components/topbar.js +0 -0
  83. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui/state.js +0 -0
  84. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/hub_ui.html +0 -0
  85. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/mcp_proxy.py +0 -0
  86. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/progress.py +0 -0
  87. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/server.py +0 -0
  88. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/__init__.py +0 -0
  89. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/_grants.py +0 -0
  90. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/_helpers.py +0 -0
  91. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/agent.py +0 -0
  92. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/artifacts.py +0 -0
  93. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/ci.py +0 -0
  94. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/compress.py +0 -0
  95. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/credentials.py +0 -0
  96. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/delegate.py +0 -0
  97. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/edit.py +0 -0
  98. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/edit_verify.py +0 -0
  99. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/edits.py +0 -0
  100. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/federate.py +0 -0
  101. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/filter.py +0 -0
  102. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/impact.py +0 -0
  103. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/locks.py +0 -0
  104. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/memory.py +0 -0
  105. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/override.py +0 -0
  106. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/project.py +0 -0
  107. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/read.py +0 -0
  108. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/search.py +0 -0
  109. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/session.py +0 -0
  110. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/shell.py +0 -0
  111. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/status.py +0 -0
  112. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/tasks.py +0 -0
  113. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/tools/validate.py +0 -0
  114. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/api.js +0 -0
  115. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/app.js +0 -0
  116. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/components/access.js +0 -0
  117. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/components/bitbucket.js +0 -0
  118. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/components/chat.js +0 -0
  119. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/components/credentials.js +0 -0
  120. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/components/dashboard.js +0 -0
  121. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/components/edits.js +0 -0
  122. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/components/enforcement.js +0 -0
  123. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/components/instructions.js +0 -0
  124. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/components/jira.js +0 -0
  125. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/components/memory.js +0 -0
  126. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/components/sessions.js +0 -0
  127. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/components/settings.js +0 -0
  128. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/components/sidebar.js +0 -0
  129. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/components/tasks.js +0 -0
  130. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/icons.js +0 -0
  131. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/pm_shared.js +0 -0
  132. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/shared.js +0 -0
  133. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui/theme.js +0 -0
  134. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui.html +0 -0
  135. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui_legacy.html +0 -0
  136. {code_context_control-2.88.2 → code_context_control-2.89.1}/cli/ui_nano.html +0 -0
  137. {code_context_control-2.88.2 → code_context_control-2.89.1}/code_context_control.egg-info/SOURCES.txt +0 -0
  138. {code_context_control-2.88.2 → code_context_control-2.89.1}/code_context_control.egg-info/dependency_links.txt +0 -0
  139. {code_context_control-2.88.2 → code_context_control-2.89.1}/code_context_control.egg-info/entry_points.txt +0 -0
  140. {code_context_control-2.88.2 → code_context_control-2.89.1}/code_context_control.egg-info/requires.txt +0 -0
  141. {code_context_control-2.88.2 → code_context_control-2.89.1}/code_context_control.egg-info/top_level.txt +0 -0
  142. {code_context_control-2.88.2 → code_context_control-2.89.1}/core/__init__.py +0 -0
  143. {code_context_control-2.88.2 → code_context_control-2.89.1}/core/config.py +0 -0
  144. {code_context_control-2.88.2 → code_context_control-2.89.1}/core/ide.py +0 -0
  145. {code_context_control-2.88.2 → code_context_control-2.89.1}/core/mcp_toml.py +0 -0
  146. {code_context_control-2.88.2 → code_context_control-2.89.1}/core/web_security.py +0 -0
  147. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/__init__.py +0 -0
  148. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/config.py +0 -0
  149. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/mcp_oracle.py +0 -0
  150. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/oracle_server.py +0 -0
  151. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/oracle_ui.html +0 -0
  152. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/__init__.py +0 -0
  153. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/activity_reporter.py +0 -0
  154. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/api_auth.py +0 -0
  155. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/c3_bridge.py +0 -0
  156. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/chat_engine.py +0 -0
  157. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/chat_poll.py +0 -0
  158. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/chat_store.py +0 -0
  159. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/cross_memory.py +0 -0
  160. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/discovery_audit.py +0 -0
  161. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/federated_graph.py +0 -0
  162. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/health_checker.py +0 -0
  163. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/insight_engine.py +0 -0
  164. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/local_session.py +0 -0
  165. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/memory_reader.py +0 -0
  166. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/memory_writer.py +0 -0
  167. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/mobile_api.py +0 -0
  168. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/project_scanner.py +0 -0
  169. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/review_agent.py +0 -0
  170. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/tool_executor.py +0 -0
  171. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/services/tool_registry.py +0 -0
  172. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/activity.js +0 -0
  173. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/agents.js +0 -0
  174. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/app.js +0 -0
  175. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/busy.js +0 -0
  176. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/chat/conversations.js +0 -0
  177. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/chat/input.js +0 -0
  178. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/chat/markdown.js +0 -0
  179. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/chat/send.js +0 -0
  180. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/chat/stream_renderer.js +0 -0
  181. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/chat/toolbar.js +0 -0
  182. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/core.js +0 -0
  183. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/crossgraph.js +0 -0
  184. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/header.js +0 -0
  185. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/insights.js +0 -0
  186. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/projects.js +0 -0
  187. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/qrcode.js +0 -0
  188. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/settings.js +0 -0
  189. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/suggestions.js +0 -0
  190. {code_context_control-2.88.2 → code_context_control-2.89.1}/oracle/ui/theme_tabs.js +0 -0
  191. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/__init__.py +0 -0
  192. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/access_guard.py +0 -0
  193. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/access_telemetry.py +0 -0
  194. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/activity_log.py +0 -0
  195. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/agent_base.py +0 -0
  196. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/agent_locks.py +0 -0
  197. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/agents.py +0 -0
  198. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/artifact_defs.py +0 -0
  199. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/artifact_store.py +0 -0
  200. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/auto_memory.py +0 -0
  201. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/bench/__init__.py +0 -0
  202. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/bench/external/__init__.py +0 -0
  203. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/bench/external/aider_polyglot.py +0 -0
  204. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/bench/external/swe_bench.py +0 -0
  205. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/benchmark_dashboard.py +0 -0
  206. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/bitbucket_credentials.py +0 -0
  207. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/ci_act.py +0 -0
  208. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/ci_cache.py +0 -0
  209. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/ci_expr.py +0 -0
  210. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/ci_failures.py +0 -0
  211. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/ci_github.py +0 -0
  212. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/ci_impact.py +0 -0
  213. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/ci_intel.py +0 -0
  214. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/ci_runner.py +0 -0
  215. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/ci_workflow.py +0 -0
  216. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/circuit_breaker.py +0 -0
  217. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/compressor.py +0 -0
  218. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/context_snapshot.py +0 -0
  219. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/conversation_store.py +0 -0
  220. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/cred_telemetry.py +0 -0
  221. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/credential_store.py +0 -0
  222. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/doc_index.py +0 -0
  223. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/e2e_benchmark.py +0 -0
  224. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/e2e_evaluator.py +0 -0
  225. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/e2e_tasks.py +0 -0
  226. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/edit_ledger.py +0 -0
  227. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/embedding_index.py +0 -0
  228. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/enforcement_policy.py +0 -0
  229. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/error_reporting.py +0 -0
  230. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/file_memory.py +0 -0
  231. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/git_context.py +0 -0
  232. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/hub_service.py +0 -0
  233. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/indexer.py +0 -0
  234. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/jira_credentials.py +0 -0
  235. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/jira_links.py +0 -0
  236. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/mask_activation.py +0 -0
  237. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/mask_mirror.py +0 -0
  238. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/mask_presets.py +0 -0
  239. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/memory.py +0 -0
  240. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/memory_consolidator.py +0 -0
  241. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/memory_distiller.py +0 -0
  242. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/memory_graph.py +0 -0
  243. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/memory_grounder.py +0 -0
  244. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/memory_queue.py +0 -0
  245. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/memory_scorer.py +0 -0
  246. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/metrics.py +0 -0
  247. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/notifications.py +0 -0
  248. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/ollama_bridge.py +0 -0
  249. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/ollama_client.py +0 -0
  250. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/ollama_credentials.py +0 -0
  251. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/output_filter.py +0 -0
  252. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/override_grants.py +0 -0
  253. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/override_policy.py +0 -0
  254. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/override_requests.py +0 -0
  255. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/override_wake.py +0 -0
  256. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/project_runtime.py +0 -0
  257. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/protocol.py +0 -0
  258. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/proxy_state.py +0 -0
  259. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/repo_map.py +0 -0
  260. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/retention.py +0 -0
  261. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/retrieval_broker.py +0 -0
  262. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/router.py +0 -0
  263. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/runtime.py +0 -0
  264. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/scanner.py +0 -0
  265. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/session_benchmark.py +0 -0
  266. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/session_manager.py +0 -0
  267. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/session_preloader.py +0 -0
  268. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/subprojects.py +0 -0
  269. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/task_store.py +0 -0
  270. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/telemetry.py +0 -0
  271. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/text_index.py +0 -0
  272. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/time_tracker.py +0 -0
  273. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/tool_classifier.py +0 -0
  274. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/transcript_index.py +0 -0
  275. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/validation_cache.py +0 -0
  276. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/vector_store.py +0 -0
  277. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/watcher.py +0 -0
  278. {code_context_control-2.88.2 → code_context_control-2.89.1}/services/win_subprocess.py +0 -0
  279. {code_context_control-2.88.2 → code_context_control-2.89.1}/setup.cfg +0 -0
  280. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_access_builtin_optout.py +0 -0
  281. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_access_guard.py +0 -0
  282. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_access_guard_meta.py +0 -0
  283. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_access_guard_shell_project.py +0 -0
  284. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_access_guard_surfaces.py +0 -0
  285. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_access_guard_wiring.py +0 -0
  286. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_activity_reporter.py +0 -0
  287. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_agent_locks.py +0 -0
  288. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_aider_polyglot.py +0 -0
  289. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_antigravity_transition.py +0 -0
  290. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_artifact_store.py +0 -0
  291. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_artifact_tool.py +0 -0
  292. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_bitbucket_cli_smoke.py +0 -0
  293. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_bitbucket_config_fallback.py +0 -0
  294. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_bitbucket_credentials.py +0 -0
  295. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_c3_bridge_project_artifacts.py +0 -0
  296. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_c3_shell.py +0 -0
  297. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_chat_poll.py +0 -0
  298. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_ci_act.py +0 -0
  299. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_ci_cache.py +0 -0
  300. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_ci_expr.py +0 -0
  301. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_ci_impact.py +0 -0
  302. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_ci_intel.py +0 -0
  303. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_ci_runner.py +0 -0
  304. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_ci_workflow.py +0 -0
  305. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_circuit_breaker.py +0 -0
  306. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_claude_md_merge.py +0 -0
  307. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_cli_smoke.py +0 -0
  308. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_compressor_large_file.py +0 -0
  309. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_cred_telemetry.py +0 -0
  310. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_credential_store.py +0 -0
  311. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_credentials_routes.py +0 -0
  312. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_credentials_tool.py +0 -0
  313. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_creds_cli_smoke.py +0 -0
  314. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_delegate_cascade.py +0 -0
  315. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_delegate_version_probe.py +0 -0
  316. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_e2e_benchmark.py +0 -0
  317. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_edit_ledger_deadline.py +0 -0
  318. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_edit_ledger_hook.py +0 -0
  319. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_edit_locking.py +0 -0
  320. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_edit_normalization.py +0 -0
  321. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_edit_verify.py +0 -0
  322. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_embedding_index_deadlock.py +0 -0
  323. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_enforcement_flip.py +0 -0
  324. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_enforcement_policy.py +0 -0
  325. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_enforcement_routes.py +0 -0
  326. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_federated_graph.py +0 -0
  327. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_filter_backoff.py +0 -0
  328. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_ghost_files.py +0 -0
  329. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_ghost_generation.py +0 -0
  330. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_git_branch_awareness.py +0 -0
  331. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_hook_access_guard.py +0 -0
  332. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_hook_codex_compat.py +0 -0
  333. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_hook_dispatch.py +0 -0
  334. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_hook_pretool_enforce.py +0 -0
  335. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_hook_prompt_recall.py +0 -0
  336. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_hook_smoke.py +0 -0
  337. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_hook_state.py +0 -0
  338. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_hook_utf8_stdio.py +0 -0
  339. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_hub_credentials_route.py +0 -0
  340. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_hub_credentials_routes_write.py +0 -0
  341. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_hub_enforcement_routes.py +0 -0
  342. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_hub_inspect_api.py +0 -0
  343. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_hub_locks_routes.py +0 -0
  344. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_hub_server_smoke.py +0 -0
  345. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_hub_subproject_links.py +0 -0
  346. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_ide_workflow_adaptation.py +0 -0
  347. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_init_scan.py +0 -0
  348. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_install_mcp_entrypoint.py +0 -0
  349. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_jira_cli_smoke.py +0 -0
  350. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_jira_config_fallback.py +0 -0
  351. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_jira_credentials.py +0 -0
  352. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_jira_links.py +0 -0
  353. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_jira_routes.py +0 -0
  354. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_lazy_store_init.py +0 -0
  355. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_mask_guard.py +0 -0
  356. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_mask_routes.py +0 -0
  357. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_mask_surfaces.py +0 -0
  358. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_mcp_host_guard.py +0 -0
  359. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_mcp_memory_timeout.py +0 -0
  360. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_mcp_server_smoke.py +0 -0
  361. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_mcp_toml.py +0 -0
  362. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_memory_distiller.py +0 -0
  363. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_memory_graph_api.py +0 -0
  364. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_memory_queue.py +0 -0
  365. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_memory_system.py +0 -0
  366. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_mobile_api.py +0 -0
  367. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_mobile_extras.py +0 -0
  368. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_mobile_override_routes.py +0 -0
  369. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_mobile_security_api.py +0 -0
  370. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_no_stale_model_pins.py +0 -0
  371. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_notification_dedup.py +0 -0
  372. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_notification_discipline.py +0 -0
  373. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_ollama_credentials.py +0 -0
  374. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_oracle_api_auth.py +0 -0
  375. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_oracle_apikey_api.py +0 -0
  376. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_oracle_c3_bridge.py +0 -0
  377. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_oracle_chat_engine.py +0 -0
  378. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_oracle_chat_store.py +0 -0
  379. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_oracle_discovery_api.py +0 -0
  380. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_oracle_discovery_audit.py +0 -0
  381. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_oracle_local_auth.py +0 -0
  382. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_oracle_ollama_bridge.py +0 -0
  383. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_oracle_scanner_cache.py +0 -0
  384. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_oracle_security_fixes.py +0 -0
  385. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_oracle_session_bootstrap.py +0 -0
  386. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_oracle_subproject_awareness.py +0 -0
  387. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_oracle_ui_bundle.py +0 -0
  388. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_output_filter.py +0 -0
  389. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_override_grants.py +0 -0
  390. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_override_grants_mcp.py +0 -0
  391. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_override_requests.py +0 -0
  392. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_override_wake.py +0 -0
  393. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_permissions.py +0 -0
  394. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_pm_api.py +0 -0
  395. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_project_manager.py +0 -0
  396. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_project_tool.py +0 -0
  397. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_read_coercion.py +0 -0
  398. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_read_edit_parity.py +0 -0
  399. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_related_facts.py +0 -0
  400. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_repo_map.py +0 -0
  401. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_response_boilerplate.py +0 -0
  402. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_retention.py +0 -0
  403. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_review_digest.py +0 -0
  404. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_service_durability.py +0 -0
  405. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_session_benchmark.py +0 -0
  406. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_session_budget.py +0 -0
  407. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_shell_creds.py +0 -0
  408. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_shell_robustness.py +0 -0
  409. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_subproject_exclusion.py +0 -0
  410. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_subproject_federation.py +0 -0
  411. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_subprojects.py +0 -0
  412. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_swe_bench.py +0 -0
  413. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_task_store.py +0 -0
  414. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_task_tool.py +0 -0
  415. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_time_tracker.py +0 -0
  416. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_token_telemetry.py +0 -0
  417. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_tool_registry.py +0 -0
  418. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_upgrade_and_version.py +0 -0
  419. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_vault_write_guard.py +0 -0
  420. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_version_sync.py +0 -0
  421. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_web_security.py +0 -0
  422. {code_context_control-2.88.2 → code_context_control-2.89.1}/tests/test_windows_reliability.py +0 -0
  423. {code_context_control-2.88.2 → code_context_control-2.89.1}/tui/__init__.py +0 -0
  424. {code_context_control-2.88.2 → code_context_control-2.89.1}/tui/backend.py +0 -0
  425. {code_context_control-2.88.2 → code_context_control-2.89.1}/tui/main.py +0 -0
  426. {code_context_control-2.88.2 → code_context_control-2.89.1}/tui/screens/__init__.py +0 -0
  427. {code_context_control-2.88.2 → code_context_control-2.89.1}/tui/screens/benchmark_view.py +0 -0
  428. {code_context_control-2.88.2 → code_context_control-2.89.1}/tui/screens/claudemd_view.py +0 -0
  429. {code_context_control-2.88.2 → code_context_control-2.89.1}/tui/screens/compress_view.py +0 -0
  430. {code_context_control-2.88.2 → code_context_control-2.89.1}/tui/screens/index_view.py +0 -0
  431. {code_context_control-2.88.2 → code_context_control-2.89.1}/tui/screens/init_view.py +0 -0
  432. {code_context_control-2.88.2 → code_context_control-2.89.1}/tui/screens/mcp_view.py +0 -0
  433. {code_context_control-2.88.2 → code_context_control-2.89.1}/tui/screens/optimize_view.py +0 -0
  434. {code_context_control-2.88.2 → code_context_control-2.89.1}/tui/screens/pipe_view.py +0 -0
  435. {code_context_control-2.88.2 → code_context_control-2.89.1}/tui/screens/projects_view.py +0 -0
  436. {code_context_control-2.88.2 → code_context_control-2.89.1}/tui/screens/search_view.py +0 -0
  437. {code_context_control-2.88.2 → code_context_control-2.89.1}/tui/screens/session_view.py +0 -0
  438. {code_context_control-2.88.2 → code_context_control-2.89.1}/tui/screens/stats.py +0 -0
  439. {code_context_control-2.88.2 → code_context_control-2.89.1}/tui/screens/ui_view.py +0 -0
  440. {code_context_control-2.88.2 → code_context_control-2.89.1}/tui/theme.tcss +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-context-control
3
- Version: 2.88.2
3
+ Version: 2.89.1
4
4
  Summary: Local MCP code-intelligence for AI coding tools: surgical search/read/edit, agent-config version history, path-level access + masking guards, and a multi-project hub.
5
5
  Author-email: Dimitri Tselenchuk <dtselenc@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -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.88.2"
95
+ __version__ = "2.89.1"
96
96
 
97
97
 
98
98
  def _compress_file_cli(compressor, path, mode="smart", **kw):
@@ -4555,14 +4555,22 @@ def _ensure_global_session_fallbacks(server_script: str, c3_mcp_exe: str | None
4555
4555
  print(f"Warning: Could not update {antigravity_path} (global fallback skipped)")
4556
4556
 
4557
4557
 
4558
- def _uninstall_mcp_all(project_path: str):
4559
- """Remove C3 MCP server configurations from all supported IDEs."""
4558
+ def _uninstall_mcp_all(project_path: str, include_global: bool = True):
4559
+ """Remove C3 MCP server configurations from all supported IDEs.
4560
+
4561
+ ``include_global=False`` restricts removal to PROJECT-scoped config files
4562
+ (the project's .mcp.json, .codex/config.toml, settings/hooks). Home-level
4563
+ configs (~/.codex, Antigravity's mcp_config.json) are machine-wide and
4564
+ shared by every C3 project, so per-project cleanup — the merge action's
4565
+ ``cleanup='clear'`` — must never touch them; only a real machine
4566
+ uninstall (the default) may."""
4560
4567
  import shutil
4561
4568
  from pathlib import Path
4562
4569
 
4563
4570
  from core.ide import PROFILES
4564
4571
 
4565
- print("\nRemoving C3 MCP server configurations...")
4572
+ scope = "" if include_global else " (project-scoped only)"
4573
+ print(f"\nRemoving C3 MCP server configurations...{scope}")
4566
4574
  target = Path(project_path).resolve()
4567
4575
 
4568
4576
  # Remove .mcp.json if it exists (standard MCP config file)
@@ -4587,11 +4595,12 @@ def _uninstall_mcp_all(project_path: str):
4587
4595
  # MCP Config paths to check
4588
4596
  config_paths = []
4589
4597
  if profile.config_path_global:
4590
- config_paths.append(Path.home() / profile.config_path)
4598
+ if include_global:
4599
+ config_paths.append(Path.home() / profile.config_path)
4591
4600
  else:
4592
4601
  config_paths.append(target / profile.config_path)
4593
4602
  # For Codex, also check the global fallback in home dir
4594
- if ide_name == "codex":
4603
+ if ide_name == "codex" and include_global:
4595
4604
  config_paths.append(Path.home() / profile.config_path)
4596
4605
 
4597
4606
  for mcp_config_path in config_paths:
@@ -4714,8 +4723,10 @@ def _uninstall_mcp_all(project_path: str):
4714
4723
  print(f" Warning: Could not update {vscode_settings_path}: {e}")
4715
4724
 
4716
4725
  # Legacy Gemini CLI configs (profile removed in v2.52) — still strip the c3 entry.
4717
- for legacy_cfg in (target / ".gemini" / "settings.json",
4718
- Path.home() / ".gemini" / "settings.json"):
4726
+ legacy_cfgs = [target / ".gemini" / "settings.json"]
4727
+ if include_global:
4728
+ legacy_cfgs.append(Path.home() / ".gemini" / "settings.json")
4729
+ for legacy_cfg in legacy_cfgs:
4719
4730
  if not legacy_cfg.exists():
4720
4731
  continue
4721
4732
  try:
@@ -266,6 +266,8 @@ c3_bitbucket(action=<span class="str">'get_pr'</span>, pr_id=<span class="num">4
266
266
  <tr><td class="grp-read"><code>get_pr</code></td> <td><code>project, repo, pr_id</code></td><td>Full PR detail incl. version, reviewers, description, open-tasks</td></tr>
267
267
  <tr><td class="grp-read"><code>get_pr_diff</code></td> <td><code>project, repo, pr_id, context_lines?</code></td><td>Unified diff (truncated to 6000 chars in the response)</td></tr>
268
268
  <tr><td class="grp-read"><code>get_pr_activities</code></td><td><code>project, repo, pr_id</code></td><td>PR event timeline (comments, approvals, reviewer changes)</td></tr>
269
+ <tr><td class="grp-read"><code>get_pr_commits</code></td><td><code>project, repo, pr_id</code></td><td>Commits on the PR, newest first</td></tr>
270
+ <tr><td class="grp-read"><code>list_pr_tasks</code></td><td><code>project, repo, pr_id, state?</code></td><td>PR tasks (BLOCKER-severity comments); <code>state=OPEN|RESOLVED</code> filters</td></tr>
269
271
  <tr><td class="grp-read"><code>list_branches</code></td><td><code>project, repo, filter?</code></td><td>Branches with ahead/behind counts and default-branch flag</td></tr>
270
272
  <tr><td class="grp-read"><code>list_commits</code></td> <td><code>project, repo, branch?, path?, limit?</code></td><td>Commit log on a branch / path</td></tr>
271
273
  <tr><td class="grp-read"><code>list_activity</code></td><td><code>project, repo, limit?</code></td><td>Repo activity feed (commit-based)</td></tr>
@@ -278,9 +280,15 @@ c3_bitbucket(action=<span class="str">'get_pr'</span>, pr_id=<span class="num">4
278
280
  <thead><tr><th>Action</th><th>Args</th><th>Description</th></tr></thead>
279
281
  <tbody>
280
282
  <tr><td class="grp-write"><code>create_pr</code></td> <td><code>title, from_branch, to_branch, description?, reviewers?</code></td><td>Open a new PR. <code>reviewers</code> may be a list or comma-separated string.</td></tr>
283
+ <tr><td class="grp-write"><code>update_pr</code></td> <td><code>pr_id, title?, description?, to_branch?, reviewers?</code></td><td>Edit an open PR. Unchanged fields are merged from the live PR; the current version is auto-fetched. <code>reviewers</code> is the full replacement set.</td></tr>
281
284
  <tr><td class="grp-write"><code>comment_pr</code></td> <td><code>pr_id, body</code></td> <td>Add a top-level comment</td></tr>
285
+ <tr><td class="grp-write"><code>update_pr_comment</code></td><td><code>pr_id, comment_id, body</code></td><td>Edit a comment's text. The comment's current version is auto-fetched.</td></tr>
286
+ <tr><td class="grp-write"><code>delete_pr_comment</code></td><td><code>pr_id, comment_id</code></td> <td>Delete a comment (version auto-fetched)</td></tr>
287
+ <tr><td class="grp-write"><code>create_pr_task</code></td><td><code>pr_id, body</code></td> <td>Open a task on the PR — a BLOCKER-severity comment that gates merge</td></tr>
288
+ <tr><td class="grp-write"><code>resolve_pr_task</code></td><td><code>pr_id, comment_id</code></td> <td>Resolve a task by its id (from <code>list_pr_tasks</code>)</td></tr>
282
289
  <tr><td class="grp-write"><code>approve_pr</code></td> <td><code>pr_id</code></td> <td>Mark the PR approved as the current user</td></tr>
283
290
  <tr><td class="grp-write"><code>unapprove_pr</code></td><td><code>pr_id</code></td> <td>Withdraw approval</td></tr>
291
+ <tr><td class="grp-write"><code>needs_work_pr</code></td><td><code>pr_id</code></td> <td>Mark the PR "needs work" as the current user (the third reviewer verdict)</td></tr>
284
292
  <tr><td class="grp-write"><code>decline_pr</code></td> <td><code>pr_id</code></td> <td>Decline the PR. Auto-fetches the current PR version first.</td></tr>
285
293
  <tr><td class="grp-write"><code>merge_pr</code></td> <td><code>pr_id, message?</code></td> <td>Merge the PR. Auto-fetches the current PR version first; logs to the C3 edit ledger.</td></tr>
286
294
  </tbody>
@@ -365,9 +373,10 @@ c3_bitbucket(action=<span class="str">'get_pr'</span>, pr_id=<span class="num">4
365
373
  <table class="params-table">
366
374
  <thead><tr><th>Action</th><th>Why it's logged</th></tr></thead>
367
375
  <tbody>
368
- <tr><td><code>create_pr</code></td> <td>New PR opened — relevant for review timeline</td></tr>
369
- <tr><td><code>comment_pr</code></td> <td>Discussion contribution worth recovering on / clear</td></tr>
370
- <tr><td><code>approve_pr</code> / <code>unapprove_pr</code></td><td>Reviewer state changes</td></tr>
376
+ <tr><td><code>create_pr</code> / <code>update_pr</code></td><td>PR opened or its title/description/reviewers/target edited — relevant for review timeline</td></tr>
377
+ <tr><td><code>comment_pr</code> / <code>update_pr_comment</code> / <code>delete_pr_comment</code></td><td>Discussion contributions worth recovering on / clear</td></tr>
378
+ <tr><td><code>create_pr_task</code> / <code>resolve_pr_task</code></td><td>Merge-gating task opened or closed</td></tr>
379
+ <tr><td><code>approve_pr</code> / <code>unapprove_pr</code> / <code>needs_work_pr</code></td><td>Reviewer state changes</td></tr>
371
380
  <tr><td><code>decline_pr</code></td> <td>PR closed without merge</td></tr>
372
381
  <tr><td><code>merge_pr</code></td> <td>Code now lives in the target branch — high-impact</td></tr>
373
382
  <tr><td><code>create_branch</code> / <code>delete_branch</code></td><td>Branch topology changed</td></tr>
@@ -1217,8 +1217,10 @@ c3_artifacts(action=<span class="str">'show'</span>, artifact=<span class="str">
1217
1217
  <tr><td class="param-name">status</td><td>Read</td><td class="param-desc">Active account, accounts list, defaults, server-version probe</td></tr>
1218
1218
  <tr><td class="param-name">whoami</td><td>Read</td><td class="param-desc">Current authenticated user (PAT owner)</td></tr>
1219
1219
  <tr><td class="param-name">list_projects, list_repos, get_repo</td><td>Read</td><td class="param-desc">Project / repository discovery</td></tr>
1220
- <tr><td class="param-name">list_prs, get_pr, get_pr_diff, get_pr_activities</td><td>Read</td><td class="param-desc">PR browsing + diff + activity feed</td></tr>
1221
- <tr><td class="param-name">create_pr, comment_pr, approve_pr, unapprove_pr, decline_pr, merge_pr</td><td>Write</td><td class="param-desc">PR write actions. <code>merge_pr</code> and <code>decline_pr</code> auto-fetch the PR's current version</td></tr>
1220
+ <tr><td class="param-name">list_prs, get_pr, get_pr_diff, get_pr_activities, get_pr_commits</td><td>Read</td><td class="param-desc">PR browsing + diff + activity feed + commit list</td></tr>
1221
+ <tr><td class="param-name">create_pr, update_pr, comment_pr, approve_pr, unapprove_pr, needs_work_pr, decline_pr, merge_pr</td><td>Write</td><td class="param-desc">PR write actions. <code>update_pr</code> edits title/description/reviewers/to_branch (unchanged fields preserved); <code>merge_pr</code>, <code>decline_pr</code>, and <code>update_pr</code> auto-fetch the PR's current version; <code>needs_work_pr</code> marks "needs work" as the current user</td></tr>
1222
+ <tr><td class="param-name">update_pr_comment, delete_pr_comment</td><td>Write</td><td class="param-desc">Edit or remove a PR comment by <code>comment_id</code> — the comment's current version is fetched automatically</td></tr>
1223
+ <tr><td class="param-name">list_pr_tasks, create_pr_task, resolve_pr_task</td><td>Tasks</td><td class="param-desc">PR tasks (Bitbucket 7.2+ model: a task is a BLOCKER-severity comment). <code>list_pr_tasks</code> filters by <code>state=OPEN|RESOLVED</code>; resolve takes the task's <code>comment_id</code></td></tr>
1222
1224
  <tr><td class="param-name">list_branches, create_branch, delete_branch</td><td>Branch</td><td class="param-desc">Branch listing and admin (uses the <code>branch-utils</code> API)</td></tr>
1223
1225
  <tr><td class="param-name">list_commits, list_activity, build_status</td><td>Read</td><td class="param-desc">Recent commits, activity, build/CI status (defaults to default-branch HEAD)</td></tr>
1224
1226
  <tr><td class="param-name">repo_settings, update_repo_settings, list_webhooks, create_webhook, delete_webhook, list_permissions</td><td>Admin</td><td class="param-desc">Repository administration</td></tr>
@@ -1310,9 +1312,15 @@ c3_shell(cmd=<span class="str">'curl -H "Authorization: Bearer {{cred:API_KEY}}"
1310
1312
  <tr><td class="param-name">status, whoami</td><td>Read</td><td class="param-desc">Active account, deployment, defaults, server probe / authenticated user</td></tr>
1311
1313
  <tr><td class="param-name">search</td><td>Read</td><td class="param-desc">Raw JQL, paginated (helper-built JQL elsewhere is always quoted)</td></tr>
1312
1314
  <tr><td class="param-name">my_issues</td><td>Read</td><td class="param-desc">Open issues assigned to the token's user (statusCategory-aware)</td></tr>
1313
- <tr><td class="param-name">get_issue, list_projects, list_transitions</td><td>Read</td><td class="param-desc">Issue detail with comments / project discovery / legal transitions for an issue</td></tr>
1314
- <tr><td class="param-name">get_create_metadata, search_users</td><td>Read</td><td class="param-desc">Required + allowed fields per project/type; user lookup for assignment</td></tr>
1315
- <tr><td class="param-name">create_issue</td><td>Write</td><td class="param-desc">Pre-validates against create metadata and returns machine-readable missing required fields instead of guessing defaults</td></tr>
1315
+ <tr><td class="param-name">get_issue, list_projects, list_transitions</td><td>Read</td><td class="param-desc">Issue detail with comments, parent, and typed links / project discovery / legal transitions for an issue</td></tr>
1316
+ <tr><td class="param-name">get_create_metadata, search_users, list_link_types</td><td>Read</td><td class="param-desc">Field configuration per project/type (ids + names; the create screen may accept fewer — Jira over-reports, Epic Link is the classic case); user lookup for assignment; the server's issue-link type catalog</td></tr>
1317
+ <tr><td class="param-name">list_boards, list_sprints, list_worklogs</td><td>Read</td><td class="param-desc">Agile boards (project fallback applies) &rarr; sprints per board (<code>sprint_state=active|future|closed</code>); an issue's logged time</td></tr>
1318
+ <tr><td class="param-name">move_to_sprint, move_to_backlog</td><td>Write</td><td class="param-desc">Sprint assignment via the Agile API — <code>issue</code> takes one key or a comma-list; <code>sprint_id</code> comes from <code>list_sprints</code></td></tr>
1319
+ <tr><td class="param-name">add_worklog, attach_file</td><td>Write</td><td class="param-desc">Log time (<code>time_spent='2h 30m'</code>, optional <code>body</code> comment); upload one local file as an attachment (20MB local cap)</td></tr>
1320
+ <tr><td class="param-name">unlink_issues, delete_issue</td><td>Write</td><td class="param-desc">Remove a typed link by <code>link_id</code> (shown on get_issue); permanently delete an issue — refuses one with subtasks unless <code>delete_subtasks=true</code></td></tr>
1321
+ <tr><td class="param-name">create_issue</td><td>Write</td><td class="param-desc">Pre-validates against create metadata and returns machine-readable missing required fields instead of guessing defaults. <code>parent=EPIC-KEY</code> files the new issue under an epic (deployment-mapped)</td></tr>
1322
+ <tr><td class="param-name">update_issue</td><td>Write</td><td class="param-desc">Edit an existing issue: summary, description, <code>parent</code> (epic/parent key; <code>'none'</code> clears), or a fields JSON of field ids &rarr; values — the fallback when the create screen rejects a field ("not on the appropriate screen")</td></tr>
1323
+ <tr><td class="param-name">link_issues</td><td>Write</td><td class="param-desc">Typed link reading <code>&lt;issue&gt; &lt;link_type&gt; &lt;target&gt;</code> — accepts a type name or either directional phrasing (an inward match flips the pair); unknown types answer with the catalog</td></tr>
1316
1324
  <tr><td class="param-name">comment, transition, assign</td><td>Write</td><td class="param-desc">Comment on / move (accepts transition id <em>or</em> name) / assign an issue</td></tr>
1317
1325
  </tbody>
1318
1326
  </table>
@@ -1330,12 +1338,31 @@ c3_jira(action=<span class="str">'get_create_metadata'</span>, project=<span cla
1330
1338
  c3_jira(action=<span class="str">'create_issue'</span>, project=<span class="str">'PROJ'</span>, issue_type=<span class="str">'Task'</span>,
1331
1339
  summary=<span class="str">'Fix login flow'</span>, description=<span class="str">'Steps in thread'</span>)
1332
1340
 
1341
+ <span class="com"># Field rejected on create ("not on the appropriate screen")? Set it post-create</span>
1342
+ c3_jira(action=<span class="str">'update_issue'</span>, issue=<span class="str">'PROJ-124'</span>, fields=<span class="str">'{"customfield_10014": "PROJ-42"}'</span>)
1343
+
1344
+ <span class="com"># Put an issue under an epic — no customfield hunting (Cloud parent field
1345
+ # vs Data Center Epic Link customfield is resolved for you)</span>
1346
+ c3_jira(action=<span class="str">'update_issue'</span>, issue=<span class="str">'PROJ-124'</span>, parent=<span class="str">'PROJ-42'</span>)
1347
+
1348
+ <span class="com"># Typed links: reads "PROJ-1 blocks PROJ-2"</span>
1349
+ c3_jira(action=<span class="str">'link_issues'</span>, issue=<span class="str">'PROJ-1'</span>, link_type=<span class="str">'blocks'</span>, target=<span class="str">'PROJ-2'</span>)
1350
+
1351
+ <span class="com"># Sprint flow: board -> sprint -> assign</span>
1352
+ c3_jira(action=<span class="str">'list_boards'</span>)
1353
+ c3_jira(action=<span class="str">'list_sprints'</span>, board_id=<span class="num">7</span>, sprint_state=<span class="str">'active'</span>)
1354
+ c3_jira(action=<span class="str">'move_to_sprint'</span>, issue=<span class="str">'PROJ-1, PROJ-2'</span>, sprint_id=<span class="num">42</span>)
1355
+
1356
+ <span class="com"># Time + evidence</span>
1357
+ c3_jira(action=<span class="str">'add_worklog'</span>, issue=<span class="str">'PROJ-1'</span>, time_spent=<span class="str">'2h 30m'</span>, body=<span class="str">'pairing'</span>)
1358
+ c3_jira(action=<span class="str">'attach_file'</span>, issue=<span class="str">'PROJ-1'</span>, file_path=<span class="str">'logs/build.log'</span>)
1359
+
1333
1360
  <span class="com"># Move it along — id or name both work</span>
1334
1361
  c3_jira(action=<span class="str">'list_transitions'</span>, issue=<span class="str">'PROJ-123'</span>)
1335
1362
  c3_jira(action=<span class="str">'transition'</span>, issue=<span class="str">'PROJ-123'</span>, transition=<span class="str">'In Progress'</span>)
1336
1363
  c3_jira(action=<span class="str">'comment'</span>, issue=<span class="str">'PROJ-123'</span>, body=<span class="str">'Deployed to staging'</span>)</code></pre>
1337
1364
 
1338
- <p class="tool-desc"><strong>Surfaces &amp; audit:</strong> the per-project dashboard gets a <strong>Jira tab</strong> (My Work board grouped by statusCategory, JQL search, an issue drawer with transition buttons + comments, and an Activity view) backed by <code>/api/jira/*</code> routes. Issue keys like <code>PROJ-123</code> are auto-linked from branch names and edit-ledger entries (acronym denylist, so UTF-8 / SHA-256 / CVE-2024 never match), and the issue drawer shows the local ledger activity for the open issue — that Activity view works with no account configured. Mutations (<code>create_issue</code>, <code>comment</code>, <code>transition</code>, <code>assign</code>) are edit-ledger-logged with identifiers only — bodies are never logged. Read actions are safe in plan mode.</p>
1365
+ <p class="tool-desc"><strong>Surfaces &amp; audit:</strong> the per-project dashboard gets a <strong>Jira tab</strong> (My Work board grouped by statusCategory, JQL search, an issue drawer with transition buttons + comments, and an Activity view) backed by <code>/api/jira/*</code> routes. Issue keys like <code>PROJ-123</code> are auto-linked from branch names and edit-ledger entries (acronym denylist, so UTF-8 / SHA-256 / CVE-2024 never match), and the issue drawer shows the local ledger activity for the open issue — that Activity view works with no account configured. Mutations (<code>create_issue</code>, <code>update_issue</code>, <code>comment</code>, <code>transition</code>, <code>assign</code>, <code>link_issues</code>, <code>unlink_issues</code>, <code>move_to_sprint</code>, <code>move_to_backlog</code>, <code>add_worklog</code>, <code>attach_file</code>, <code>delete_issue</code>) are edit-ledger-logged with identifiers only — bodies are never logged. Read actions are safe in plan mode.</p>
1339
1366
  </div>
1340
1367
  </div>
1341
1368
  </div>
@@ -902,13 +902,24 @@ async def c3_bitbucket(
902
902
  commit: str = "",
903
903
  settings: str = "",
904
904
  webhook_id: int = 0,
905
+ comment_id: int = 0,
905
906
  limit: int = 50,
906
907
  ctx: Context = None,
907
908
  ) -> str:
908
909
  """BITBUCKET (Data Center / Server) — see and act on PRs, branches, builds, repo admin.
909
910
  actions: status, whoami, list_projects, list_repos, get_repo,
910
- list_prs, get_pr, get_pr_diff, get_pr_activities,
911
- create_pr, comment_pr, approve_pr, unapprove_pr, decline_pr, merge_pr,
911
+ list_prs, get_pr, get_pr_diff, get_pr_activities, get_pr_commits,
912
+ create_pr, update_pr (pr_id + any of title/description/reviewers/to_branch —
913
+ unchanged fields are preserved; reviewers is the FULL comma-separated
914
+ replacement set), comment_pr,
915
+ update_pr_comment / delete_pr_comment (pr_id, comment_id [body] — the
916
+ comment's current version is fetched automatically),
917
+ approve_pr, unapprove_pr,
918
+ needs_work_pr (mark 'needs work' as the authenticated reviewer),
919
+ decline_pr, merge_pr,
920
+ list_pr_tasks (state filters OPEN/RESOLVED), create_pr_task (pr_id, body —
921
+ a blocker task on the PR), resolve_pr_task (pr_id, comment_id from
922
+ list_pr_tasks),
912
923
  list_branches, create_branch, delete_branch,
913
924
  list_commits, list_activity, build_status,
914
925
  repo_settings, update_repo_settings, list_webhooks, create_webhook, delete_webhook,
@@ -927,7 +938,8 @@ async def c3_bitbucket(
927
938
  title=title, body=body, from_branch=from_branch, to_branch=to_branch,
928
939
  description=description, reviewers=reviewers, name=name, url=url,
929
940
  events=events, start_point=start_point, commit=commit,
930
- settings=settings, webhook_id=webhook_id, limit=limit,
941
+ settings=settings, webhook_id=webhook_id, comment_id=comment_id,
942
+ limit=limit,
931
943
  )
932
944
 
933
945
 
@@ -949,14 +961,43 @@ async def c3_jira(
949
961
  status_category: str = "",
950
962
  account: str = "",
951
963
  cursor: str = "",
964
+ target: str = "",
965
+ link_type: str = "",
966
+ parent: str = "",
967
+ link_id: str = "",
968
+ board_id: int = 0,
969
+ sprint_id: int = 0,
970
+ sprint_state: str = "",
971
+ time_spent: str = "",
972
+ file_path: str = "",
973
+ delete_subtasks: bool = False,
952
974
  limit: int = 25,
953
975
  ctx: Context = None,
954
976
  ) -> str:
955
- """JIRA (Cloud + Data Center) — search, read, create, comment, transition, assign issues.
956
- actions: status, whoami, search (jql), get_issue (issue), my_issues,
957
- list_projects, list_transitions (issue), get_create_metadata (project, issue_type),
958
- search_users (query), create_issue (project, issue_type, summary [description] [fields=JSON]),
959
- comment (issue, body), transition (issue, transition=id|name [body]), assign (issue, user).
977
+ """JIRA (Cloud + Data Center) — search, read, create, update, link, sprint, comment, transition, assign issues.
978
+ actions: status, whoami, search (jql), get_issue (issue — shows parent, links, attachments),
979
+ my_issues, list_projects, list_transitions (issue), get_create_metadata (project, issue_type),
980
+ search_users (query), list_link_types,
981
+ list_boards ([project]), list_sprints (board_id [sprint_state=active|future|closed]),
982
+ list_worklogs (issue),
983
+ create_issue (project, issue_type, summary [description] [parent=epic/parent key] [fields=JSON]),
984
+ update_issue (issue [summary] [description] [parent=epic/parent key, 'none' clears]
985
+ [fields=JSON: field ids -> values]),
986
+ link_issues (issue, link_type, target — reads '<issue> <link_type> <target>', e.g.
987
+ issue=PROJ-1 link_type=blocks target=PROJ-2; link_type takes a type name or either
988
+ directional phrasing from list_link_types),
989
+ unlink_issues (link_id — from get_issue's link lines),
990
+ move_to_sprint (issue [comma-list], sprint_id), move_to_backlog (issue [comma-list]),
991
+ add_worklog (issue, time_spent='2h 30m' [body=comment]),
992
+ attach_file (issue, file_path — uploads one local file, 20MB local cap),
993
+ comment (issue, body), transition (issue, transition=id|name [body]), assign (issue, user),
994
+ delete_issue (issue [delete_subtasks] — PERMANENT; Jira refuses an issue with
995
+ subtasks unless delete_subtasks=true).
996
+ To put an issue under an epic, pass parent=<EPIC-KEY> to create_issue/update_issue —
997
+ C3 maps it per deployment (Cloud parent field vs Data Center Epic Link custom field).
998
+ get_create_metadata reflects Jira's field configuration, not the create screen — if
999
+ create_issue rejects a listed field ('not on the appropriate screen'), create without
1000
+ it and set it via update_issue (the edit screen is configured separately).
960
1001
  project falls back to the account's default_project; account to jira.default_account.
961
1002
  Mutating actions are ledger-logged. Tokens live in the OS keyring — `c3 jira login` first."""
962
1003
  svc = _svc(ctx)
@@ -971,7 +1012,11 @@ async def c3_jira(
971
1012
  summary=summary, description=description, body=body,
972
1013
  body_format=body_format, transition=transition, user=user,
973
1014
  query=query, fields=fields, status_category=status_category,
974
- account=account, cursor=cursor, limit=limit,
1015
+ account=account, cursor=cursor, target=target, link_type=link_type,
1016
+ parent=parent, link_id=link_id, board_id=board_id,
1017
+ sprint_id=sprint_id, sprint_state=sprint_state,
1018
+ time_spent=time_spent, file_path=file_path,
1019
+ delete_subtasks=delete_subtasks, limit=limit,
975
1020
  )
976
1021
 
977
1022
 
@@ -23,8 +23,10 @@ _DIFF_PREVIEW_CHARS = 6000 # diffs above this are truncated
23
23
 
24
24
  # Actions that change repo state — flagged for ledger logging.
25
25
  _MUTATING_ACTIONS = {
26
- "create_pr", "comment_pr", "approve_pr", "unapprove_pr",
27
- "decline_pr", "merge_pr",
26
+ "create_pr", "update_pr", "comment_pr", "approve_pr", "unapprove_pr",
27
+ "needs_work_pr", "decline_pr", "merge_pr",
28
+ "update_pr_comment", "delete_pr_comment",
29
+ "create_pr_task", "resolve_pr_task",
28
30
  "create_branch", "delete_branch",
29
31
  "update_repo_settings", "create_webhook", "delete_webhook",
30
32
  }
@@ -32,8 +34,10 @@ _MUTATING_ACTIONS = {
32
34
  # Actions that can fall back to default_project/default_repo from config.
33
35
  _REPO_SCOPED = {
34
36
  "list_repos", "get_repo", "list_prs", "get_pr", "get_pr_diff",
35
- "get_pr_activities", "create_pr", "comment_pr", "approve_pr",
36
- "unapprove_pr", "decline_pr", "merge_pr", "list_branches",
37
+ "get_pr_activities", "get_pr_commits", "create_pr", "update_pr",
38
+ "comment_pr", "update_pr_comment", "delete_pr_comment", "approve_pr",
39
+ "unapprove_pr", "needs_work_pr", "decline_pr", "merge_pr",
40
+ "list_pr_tasks", "create_pr_task", "resolve_pr_task", "list_branches",
37
41
  "create_branch", "delete_branch", "list_commits", "list_activity",
38
42
  "repo_settings", "update_repo_settings", "list_webhooks",
39
43
  "create_webhook", "delete_webhook", "list_permissions",
@@ -303,6 +307,40 @@ def _act_create_pr(client, project: str, repo: str, kwargs: dict) -> str:
303
307
  return f"[bitbucket:created]\n{_format_pr_full(pr)}"
304
308
 
305
309
 
310
+ def _act_update_pr(client, project: str, repo: str, pr_id: int, kwargs: dict) -> str:
311
+ title = kwargs.get("title") or ""
312
+ description = kwargs.get("description", "") or kwargs.get("body", "")
313
+ to_b = kwargs.get("to_branch") or kwargs.get("target") or ""
314
+ reviewers_raw = kwargs.get("reviewers")
315
+ if not title and not description and not to_b and not reviewers_raw:
316
+ return (
317
+ "[bitbucket:update_pr:error] nothing to change — pass at least one "
318
+ "of title, description, to_branch, reviewers"
319
+ )
320
+ # PUT replaces the PR record, so merge unchanged fields from the live PR.
321
+ pr = client.get_pull_request(project, repo, pr_id)
322
+ reviewers: list[str] | None = None
323
+ if isinstance(reviewers_raw, str) and reviewers_raw.strip():
324
+ reviewers = [r.strip() for r in reviewers_raw.split(",") if r.strip()]
325
+ elif isinstance(reviewers_raw, list) and reviewers_raw:
326
+ reviewers = [str(r) for r in reviewers_raw]
327
+ else:
328
+ reviewers = [
329
+ ((r.get("user") or {}).get("name") or "")
330
+ for r in pr.get("reviewers") or []
331
+ ]
332
+ reviewers = [r for r in reviewers if r]
333
+ updated = client.update_pull_request(
334
+ project, repo, pr_id,
335
+ version=pr.get("version", 0),
336
+ title=title or pr.get("title", ""),
337
+ description=description or pr.get("description", ""),
338
+ to_branch=to_b,
339
+ reviewers=reviewers,
340
+ )
341
+ return f"[bitbucket:updated]\n{_format_pr_full(updated)}"
342
+
343
+
306
344
  def _act_comment_pr(client, project: str, repo: str, pr_id: int, kwargs: dict) -> str:
307
345
  text = kwargs.get("body") or kwargs.get("text") or ""
308
346
  if not text:
@@ -321,6 +359,115 @@ def _act_unapprove_pr(client, project: str, repo: str, pr_id: int) -> str:
321
359
  return f"[bitbucket:unapproved] {project}/{repo}#{pr_id}"
322
360
 
323
361
 
362
+ def _act_get_pr_commits(client, project: str, repo: str, pr_id: int) -> str:
363
+ commits = client.get_pr_commits(project, repo, pr_id)
364
+ if not commits:
365
+ return f"[bitbucket:pr_commits] {project}/{repo}#{pr_id}: 0 commits"
366
+ lines = [
367
+ f"[bitbucket:pr_commits] {project}/{repo}#{pr_id}: "
368
+ f"{len(commits)} commit(s)"
369
+ ]
370
+ lines.extend(f" {_format_commit(c)}" for c in commits)
371
+ return "\n".join(lines)
372
+
373
+
374
+ def _act_update_pr_comment(client, project: str, repo: str, pr_id: int,
375
+ kwargs: dict) -> str:
376
+ comment_id = int(kwargs.get("comment_id") or 0)
377
+ text = kwargs.get("body") or kwargs.get("text") or ""
378
+ if not comment_id or not text:
379
+ return "[bitbucket:update_pr_comment:error] comment_id and body are required"
380
+ current = client.get_pr_comment(project, repo, pr_id, comment_id)
381
+ res = client.update_pr_comment(
382
+ project, repo, pr_id, comment_id,
383
+ version=current.get("version", 0), text=text,
384
+ )
385
+ return (
386
+ f"[bitbucket:comment-updated] {project}/{repo}#{pr_id} "
387
+ f"comment-id={res.get('id', comment_id)}"
388
+ )
389
+
390
+
391
+ def _act_delete_pr_comment(client, project: str, repo: str, pr_id: int,
392
+ kwargs: dict) -> str:
393
+ comment_id = int(kwargs.get("comment_id") or 0)
394
+ if not comment_id:
395
+ return "[bitbucket:delete_pr_comment:error] comment_id is required"
396
+ current = client.get_pr_comment(project, repo, pr_id, comment_id)
397
+ client.delete_pr_comment(
398
+ project, repo, pr_id, comment_id, version=current.get("version", 0)
399
+ )
400
+ return (
401
+ f"[bitbucket:comment-deleted] {project}/{repo}#{pr_id} "
402
+ f"comment-id={comment_id}"
403
+ )
404
+
405
+
406
+ def _format_task(c: dict) -> str:
407
+ author = ((c.get("author") or {}).get("displayName")
408
+ or (c.get("author") or {}).get("name") or "?")
409
+ first_line = (c.get("text") or "").splitlines()[0][:120] \
410
+ if c.get("text") else ""
411
+ return f"[{c.get('state', 'OPEN')}] id={c.get('id', '?')} ({author}) {first_line}"
412
+
413
+
414
+ def _act_list_pr_tasks(client, project: str, repo: str, pr_id: int,
415
+ kwargs: dict) -> str:
416
+ state = (kwargs.get("state") or "").strip()
417
+ tasks = client.list_pr_tasks(project, repo, pr_id, state=state)
418
+ label = f" (state={state})" if state else ""
419
+ if not tasks:
420
+ return f"[bitbucket:pr_tasks] {project}/{repo}#{pr_id}: 0 task(s){label}"
421
+ lines = [
422
+ f"[bitbucket:pr_tasks] {project}/{repo}#{pr_id}: "
423
+ f"{len(tasks)} task(s){label}"
424
+ ]
425
+ lines.extend(f" {_format_task(t)}" for t in tasks)
426
+ return "\n".join(lines)
427
+
428
+
429
+ def _act_create_pr_task(client, project: str, repo: str, pr_id: int,
430
+ kwargs: dict) -> str:
431
+ text = kwargs.get("body") or kwargs.get("text") or ""
432
+ if not text:
433
+ return "[bitbucket:create_pr_task:error] body is required"
434
+ res = client.create_pr_task(project, repo, pr_id, text=text)
435
+ return (
436
+ f"[bitbucket:task-created] {project}/{repo}#{pr_id} "
437
+ f"task-id={res.get('id', '?')}"
438
+ )
439
+
440
+
441
+ def _act_resolve_pr_task(client, project: str, repo: str, pr_id: int,
442
+ kwargs: dict) -> str:
443
+ comment_id = int(kwargs.get("comment_id") or 0)
444
+ if not comment_id:
445
+ return (
446
+ "[bitbucket:resolve_pr_task:error] comment_id (the task id from "
447
+ "list_pr_tasks) is required"
448
+ )
449
+ current = client.get_pr_comment(project, repo, pr_id, comment_id)
450
+ client.set_pr_task_state(
451
+ project, repo, pr_id, comment_id,
452
+ version=current.get("version", 0), state="RESOLVED",
453
+ )
454
+ return f"[bitbucket:task-resolved] {project}/{repo}#{pr_id} task-id={comment_id}"
455
+
456
+
457
+ def _act_needs_work_pr(client, project: str, repo: str, pr_id: int) -> str:
458
+ me = client.whoami()
459
+ slug = me.get("slug") or me.get("name") or ""
460
+ if not slug:
461
+ return (
462
+ "[bitbucket:needs_work_pr:error] could not resolve the "
463
+ "authenticated user's slug (whoami returned no identity)"
464
+ )
465
+ client.set_pr_reviewer_status(
466
+ project, repo, pr_id, user_slug=slug, status="NEEDS_WORK"
467
+ )
468
+ return f"[bitbucket:needs-work] {project}/{repo}#{pr_id} marked by {slug}"
469
+
470
+
324
471
  def _act_decline_pr(client, project: str, repo: str, pr_id: int) -> str:
325
472
  pr = client.get_pull_request(project, repo, pr_id)
326
473
  version = pr.get("version", 0)
@@ -493,6 +640,8 @@ def _log_mutation(svc, action: str, project: str, repo: str, kwargs: dict, respo
493
640
  reflects platform-side state changes too. Never raises."""
494
641
  if action not in _MUTATING_ACTIONS:
495
642
  return
643
+ if ":error]" in response.split("\n", 1)[0]:
644
+ return # validation failed — nothing actually mutated (matches jira)
496
645
  if not getattr(svc, "edit_ledger", None):
497
646
  return
498
647
  detail: dict[str, Any] = {
@@ -580,12 +729,40 @@ def handle_bitbucket(action: str, svc, finalize, **kwargs) -> str:
580
729
  if not pr_id:
581
730
  return finalize(_TOOL, args_for_log, "[bitbucket:error] pr_id required", "missing-arg")
582
731
  resp = _act_get_pr_activities(client, project, repo, pr_id)
732
+ elif action == "get_pr_commits":
733
+ if not pr_id:
734
+ return finalize(_TOOL, args_for_log, "[bitbucket:error] pr_id required", "missing-arg")
735
+ resp = _act_get_pr_commits(client, project, repo, pr_id)
583
736
  elif action == "create_pr":
584
737
  resp = _act_create_pr(client, project, repo, kwargs)
738
+ elif action == "update_pr":
739
+ if not pr_id:
740
+ return finalize(_TOOL, args_for_log, "[bitbucket:error] pr_id required", "missing-arg")
741
+ resp = _act_update_pr(client, project, repo, pr_id, kwargs)
585
742
  elif action == "comment_pr":
586
743
  if not pr_id:
587
744
  return finalize(_TOOL, args_for_log, "[bitbucket:error] pr_id required", "missing-arg")
588
745
  resp = _act_comment_pr(client, project, repo, pr_id, kwargs)
746
+ elif action == "update_pr_comment":
747
+ if not pr_id:
748
+ return finalize(_TOOL, args_for_log, "[bitbucket:error] pr_id required", "missing-arg")
749
+ resp = _act_update_pr_comment(client, project, repo, pr_id, kwargs)
750
+ elif action == "delete_pr_comment":
751
+ if not pr_id:
752
+ return finalize(_TOOL, args_for_log, "[bitbucket:error] pr_id required", "missing-arg")
753
+ resp = _act_delete_pr_comment(client, project, repo, pr_id, kwargs)
754
+ elif action == "list_pr_tasks":
755
+ if not pr_id:
756
+ return finalize(_TOOL, args_for_log, "[bitbucket:error] pr_id required", "missing-arg")
757
+ resp = _act_list_pr_tasks(client, project, repo, pr_id, kwargs)
758
+ elif action == "create_pr_task":
759
+ if not pr_id:
760
+ return finalize(_TOOL, args_for_log, "[bitbucket:error] pr_id required", "missing-arg")
761
+ resp = _act_create_pr_task(client, project, repo, pr_id, kwargs)
762
+ elif action == "resolve_pr_task":
763
+ if not pr_id:
764
+ return finalize(_TOOL, args_for_log, "[bitbucket:error] pr_id required", "missing-arg")
765
+ resp = _act_resolve_pr_task(client, project, repo, pr_id, kwargs)
589
766
  elif action == "approve_pr":
590
767
  if not pr_id:
591
768
  return finalize(_TOOL, args_for_log, "[bitbucket:error] pr_id required", "missing-arg")
@@ -594,6 +771,10 @@ def handle_bitbucket(action: str, svc, finalize, **kwargs) -> str:
594
771
  if not pr_id:
595
772
  return finalize(_TOOL, args_for_log, "[bitbucket:error] pr_id required", "missing-arg")
596
773
  resp = _act_unapprove_pr(client, project, repo, pr_id)
774
+ elif action == "needs_work_pr":
775
+ if not pr_id:
776
+ return finalize(_TOOL, args_for_log, "[bitbucket:error] pr_id required", "missing-arg")
777
+ resp = _act_needs_work_pr(client, project, repo, pr_id)
597
778
  elif action == "decline_pr":
598
779
  if not pr_id:
599
780
  return finalize(_TOOL, args_for_log, "[bitbucket:error] pr_id required", "missing-arg")
@@ -631,8 +812,11 @@ def handle_bitbucket(action: str, svc, finalize, **kwargs) -> str:
631
812
  "status", "whoami",
632
813
  "list_projects", "list_repos", "get_repo",
633
814
  "list_prs", "get_pr", "get_pr_diff", "get_pr_activities",
634
- "create_pr", "comment_pr", "approve_pr", "unapprove_pr",
635
- "decline_pr", "merge_pr",
815
+ "get_pr_commits",
816
+ "create_pr", "update_pr", "comment_pr", "update_pr_comment",
817
+ "delete_pr_comment", "approve_pr",
818
+ "unapprove_pr", "needs_work_pr", "decline_pr", "merge_pr",
819
+ "list_pr_tasks", "create_pr_task", "resolve_pr_task",
636
820
  "list_branches", "create_branch", "delete_branch",
637
821
  "list_commits", "list_activity", "build_status",
638
822
  "repo_settings", "update_repo_settings",