code-context-control 2.54.0__tar.gz → 2.56.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 (340) hide show
  1. {code_context_control-2.54.0/code_context_control.egg-info → code_context_control-2.56.0}/PKG-INFO +37 -2
  2. {code_context_control-2.54.0 → code_context_control-2.56.0}/README.md +36 -1
  3. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/c3.py +201 -1
  4. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/commands/parser.py +42 -0
  5. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/mcp_server.py +44 -0
  6. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/server.py +229 -0
  7. code_context_control-2.56.0/cli/tools/jira.py +459 -0
  8. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui/app.js +4 -0
  9. code_context_control-2.56.0/cli/ui/components/jira.js +345 -0
  10. {code_context_control-2.54.0 → code_context_control-2.56.0/code_context_control.egg-info}/PKG-INFO +37 -2
  11. {code_context_control-2.54.0 → code_context_control-2.56.0}/code_context_control.egg-info/SOURCES.txt +14 -0
  12. {code_context_control-2.54.0 → code_context_control-2.56.0}/core/config.py +66 -0
  13. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/services/chat_engine.py +161 -380
  14. {code_context_control-2.54.0 → code_context_control-2.56.0}/pyproject.toml +1 -1
  15. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/claude_md.py +6 -4
  16. code_context_control-2.56.0/services/jira_client.py +319 -0
  17. code_context_control-2.56.0/services/jira_cloud.py +222 -0
  18. code_context_control-2.56.0/services/jira_credentials.py +250 -0
  19. code_context_control-2.56.0/services/jira_data_center.py +196 -0
  20. code_context_control-2.56.0/services/jira_links.py +117 -0
  21. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/scanner.py +48 -13
  22. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/session_manager.py +9 -4
  23. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_init_scan.py +55 -0
  24. code_context_control-2.56.0/tests/test_jira_cli_smoke.py +156 -0
  25. code_context_control-2.56.0/tests/test_jira_client.py +308 -0
  26. code_context_control-2.56.0/tests/test_jira_config_fallback.py +120 -0
  27. code_context_control-2.56.0/tests/test_jira_credentials.py +181 -0
  28. code_context_control-2.56.0/tests/test_jira_links.py +128 -0
  29. code_context_control-2.56.0/tests/test_jira_routes.py +234 -0
  30. code_context_control-2.56.0/tests/test_jira_tool.py +293 -0
  31. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_oracle_chat_engine.py +63 -92
  32. {code_context_control-2.54.0 → code_context_control-2.56.0}/LICENSE +0 -0
  33. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/__init__.py +0 -0
  34. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/_hook_utils.py +0 -0
  35. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/commands/__init__.py +0 -0
  36. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/commands/common.py +0 -0
  37. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/docs.html +0 -0
  38. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/edits.html +0 -0
  39. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/guide/bitbucket.html +0 -0
  40. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/guide/getting-started.html +0 -0
  41. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/guide/index.html +0 -0
  42. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/guide/oracle.html +0 -0
  43. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/guide/shared.css +0 -0
  44. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/guide/tools.html +0 -0
  45. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/guide/workflow.html +0 -0
  46. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hook_artifact.py +0 -0
  47. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hook_auto_snapshot.py +0 -0
  48. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hook_c3_signal.py +0 -0
  49. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hook_c3read.py +0 -0
  50. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hook_dispatch.py +0 -0
  51. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hook_edit_ledger.py +0 -0
  52. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hook_edit_unlock.py +0 -0
  53. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hook_filter.py +0 -0
  54. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hook_ghost_files.py +0 -0
  55. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hook_pretool_enforce.py +0 -0
  56. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hook_prompt_recall.py +0 -0
  57. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hook_read.py +0 -0
  58. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hook_session_stats.py +0 -0
  59. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hook_terse_advisor.py +0 -0
  60. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub.html +0 -0
  61. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_server.py +0 -0
  62. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/app.js +0 -0
  63. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/add_project.js +0 -0
  64. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/config_editor.js +0 -0
  65. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/drill_artifacts.js +0 -0
  66. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/drill_health.js +0 -0
  67. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/drill_panel.js +0 -0
  68. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/drill_tasks.js +0 -0
  69. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/drill_views.js +0 -0
  70. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/global_search.js +0 -0
  71. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/mcp_manager.js +0 -0
  72. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/modals.js +0 -0
  73. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/project_card.js +0 -0
  74. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/project_tree.js +0 -0
  75. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/session_drawer.js +0 -0
  76. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/settings_modal.js +0 -0
  77. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/sidebar.js +0 -0
  78. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/summary_bar.js +0 -0
  79. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/task_board.js +0 -0
  80. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/toasts.js +0 -0
  81. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/components/topbar.js +0 -0
  82. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui/state.js +0 -0
  83. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/hub_ui.html +0 -0
  84. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/mcp_proxy.py +0 -0
  85. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/progress.py +0 -0
  86. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/__init__.py +0 -0
  87. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/_helpers.py +0 -0
  88. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/agent.py +0 -0
  89. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/artifacts.py +0 -0
  90. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/bitbucket.py +0 -0
  91. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/compress.py +0 -0
  92. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/delegate.py +0 -0
  93. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/edit.py +0 -0
  94. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/edits.py +0 -0
  95. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/federate.py +0 -0
  96. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/filter.py +0 -0
  97. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/impact.py +0 -0
  98. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/memory.py +0 -0
  99. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/project.py +0 -0
  100. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/read.py +0 -0
  101. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/search.py +0 -0
  102. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/session.py +0 -0
  103. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/shell.py +0 -0
  104. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/status.py +0 -0
  105. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/tasks.py +0 -0
  106. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/tools/validate.py +0 -0
  107. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui/api.js +0 -0
  108. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui/components/bitbucket.js +0 -0
  109. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui/components/chat.js +0 -0
  110. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui/components/dashboard.js +0 -0
  111. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui/components/edits.js +0 -0
  112. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui/components/instructions.js +0 -0
  113. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui/components/memory.js +0 -0
  114. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui/components/sessions.js +0 -0
  115. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui/components/settings.js +0 -0
  116. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui/components/sidebar.js +0 -0
  117. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui/components/tasks.js +0 -0
  118. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui/icons.js +0 -0
  119. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui/pm_shared.js +0 -0
  120. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui/shared.js +0 -0
  121. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui/theme.js +0 -0
  122. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui.html +0 -0
  123. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui_legacy.html +0 -0
  124. {code_context_control-2.54.0 → code_context_control-2.56.0}/cli/ui_nano.html +0 -0
  125. {code_context_control-2.54.0 → code_context_control-2.56.0}/code_context_control.egg-info/dependency_links.txt +0 -0
  126. {code_context_control-2.54.0 → code_context_control-2.56.0}/code_context_control.egg-info/entry_points.txt +0 -0
  127. {code_context_control-2.54.0 → code_context_control-2.56.0}/code_context_control.egg-info/requires.txt +0 -0
  128. {code_context_control-2.54.0 → code_context_control-2.56.0}/code_context_control.egg-info/top_level.txt +0 -0
  129. {code_context_control-2.54.0 → code_context_control-2.56.0}/core/__init__.py +0 -0
  130. {code_context_control-2.54.0 → code_context_control-2.56.0}/core/ide.py +0 -0
  131. {code_context_control-2.54.0 → code_context_control-2.56.0}/core/mcp_toml.py +0 -0
  132. {code_context_control-2.54.0 → code_context_control-2.56.0}/core/web_security.py +0 -0
  133. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/__init__.py +0 -0
  134. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/config.py +0 -0
  135. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/mcp_oracle.py +0 -0
  136. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/oracle_server.py +0 -0
  137. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/oracle_ui.html +0 -0
  138. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/services/__init__.py +0 -0
  139. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/services/activity_reporter.py +0 -0
  140. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/services/api_auth.py +0 -0
  141. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/services/c3_bridge.py +0 -0
  142. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/services/chat_store.py +0 -0
  143. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/services/cross_memory.py +0 -0
  144. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/services/federated_graph.py +0 -0
  145. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/services/health_checker.py +0 -0
  146. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/services/insight_engine.py +0 -0
  147. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/services/local_session.py +0 -0
  148. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/services/memory_reader.py +0 -0
  149. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/services/memory_writer.py +0 -0
  150. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/services/project_scanner.py +0 -0
  151. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/services/review_agent.py +0 -0
  152. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/services/tool_executor.py +0 -0
  153. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/services/tool_registry.py +0 -0
  154. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/ui/activity.js +0 -0
  155. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/ui/agents.js +0 -0
  156. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/ui/app.js +0 -0
  157. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/ui/busy.js +0 -0
  158. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/ui/chat/conversations.js +0 -0
  159. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/ui/chat/input.js +0 -0
  160. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/ui/chat/markdown.js +0 -0
  161. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/ui/chat/send.js +0 -0
  162. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/ui/chat/stream_renderer.js +0 -0
  163. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/ui/chat/toolbar.js +0 -0
  164. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/ui/core.js +0 -0
  165. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/ui/crossgraph.js +0 -0
  166. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/ui/header.js +0 -0
  167. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/ui/insights.js +0 -0
  168. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/ui/projects.js +0 -0
  169. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/ui/settings.js +0 -0
  170. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/ui/suggestions.js +0 -0
  171. {code_context_control-2.54.0 → code_context_control-2.56.0}/oracle/ui/theme_tabs.js +0 -0
  172. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/__init__.py +0 -0
  173. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/activity_log.py +0 -0
  174. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/agent_base.py +0 -0
  175. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/agents.py +0 -0
  176. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/artifact_defs.py +0 -0
  177. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/artifact_store.py +0 -0
  178. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/auto_memory.py +0 -0
  179. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/bench/__init__.py +0 -0
  180. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/bench/external/__init__.py +0 -0
  181. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/bench/external/aider_polyglot.py +0 -0
  182. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/bench/external/swe_bench.py +0 -0
  183. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/benchmark_dashboard.py +0 -0
  184. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/bitbucket_client.py +0 -0
  185. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/bitbucket_credentials.py +0 -0
  186. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/circuit_breaker.py +0 -0
  187. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/compressor.py +0 -0
  188. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/context_snapshot.py +0 -0
  189. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/conversation_store.py +0 -0
  190. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/doc_index.py +0 -0
  191. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/e2e_benchmark.py +0 -0
  192. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/e2e_evaluator.py +0 -0
  193. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/e2e_tasks.py +0 -0
  194. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/edit_ledger.py +0 -0
  195. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/embedding_index.py +0 -0
  196. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/error_reporting.py +0 -0
  197. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/file_memory.py +0 -0
  198. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/git_context.py +0 -0
  199. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/hub_service.py +0 -0
  200. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/indexer.py +0 -0
  201. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/memory.py +0 -0
  202. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/memory_consolidator.py +0 -0
  203. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/memory_distiller.py +0 -0
  204. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/memory_graph.py +0 -0
  205. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/memory_grounder.py +0 -0
  206. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/memory_queue.py +0 -0
  207. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/memory_scorer.py +0 -0
  208. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/metrics.py +0 -0
  209. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/notifications.py +0 -0
  210. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/ollama_bridge.py +0 -0
  211. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/ollama_client.py +0 -0
  212. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/ollama_credentials.py +0 -0
  213. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/output_filter.py +0 -0
  214. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/parser.py +0 -0
  215. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/project_manager.py +0 -0
  216. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/project_runtime.py +0 -0
  217. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/protocol.py +0 -0
  218. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/proxy_state.py +0 -0
  219. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/retention.py +0 -0
  220. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/retrieval_broker.py +0 -0
  221. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/router.py +0 -0
  222. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/runtime.py +0 -0
  223. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/session_benchmark.py +0 -0
  224. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/session_preloader.py +0 -0
  225. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/subprojects.py +0 -0
  226. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/task_store.py +0 -0
  227. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/telemetry.py +0 -0
  228. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/text_index.py +0 -0
  229. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/time_tracker.py +0 -0
  230. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/tool_classifier.py +0 -0
  231. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/transcript_index.py +0 -0
  232. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/validation_cache.py +0 -0
  233. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/vector_store.py +0 -0
  234. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/watcher.py +0 -0
  235. {code_context_control-2.54.0 → code_context_control-2.56.0}/services/win_subprocess.py +0 -0
  236. {code_context_control-2.54.0 → code_context_control-2.56.0}/setup.cfg +0 -0
  237. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_activity_reporter.py +0 -0
  238. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_aider_polyglot.py +0 -0
  239. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_antigravity_transition.py +0 -0
  240. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_artifact_store.py +0 -0
  241. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_artifact_tool.py +0 -0
  242. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_bitbucket_cli_smoke.py +0 -0
  243. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_bitbucket_client.py +0 -0
  244. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_bitbucket_config_fallback.py +0 -0
  245. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_bitbucket_credentials.py +0 -0
  246. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_bitbucket_tool.py +0 -0
  247. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_c3_bridge_project_artifacts.py +0 -0
  248. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_c3_shell.py +0 -0
  249. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_circuit_breaker.py +0 -0
  250. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_claude_md_merge.py +0 -0
  251. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_cli_smoke.py +0 -0
  252. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_compressor_large_file.py +0 -0
  253. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_delegate_cascade.py +0 -0
  254. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_e2e_benchmark.py +0 -0
  255. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_edit_ledger_hook.py +0 -0
  256. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_edit_normalization.py +0 -0
  257. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_enforcement_flip.py +0 -0
  258. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_federated_graph.py +0 -0
  259. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_filter_backoff.py +0 -0
  260. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_ghost_files.py +0 -0
  261. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_ghost_generation.py +0 -0
  262. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_git_branch_awareness.py +0 -0
  263. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_hook_dispatch.py +0 -0
  264. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_hook_pretool_enforce.py +0 -0
  265. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_hook_prompt_recall.py +0 -0
  266. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_hook_smoke.py +0 -0
  267. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_hook_state.py +0 -0
  268. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_hook_utf8_stdio.py +0 -0
  269. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_hub_inspect_api.py +0 -0
  270. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_hub_server_smoke.py +0 -0
  271. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_install_mcp_entrypoint.py +0 -0
  272. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_lazy_store_init.py +0 -0
  273. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_mcp_host_guard.py +0 -0
  274. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_mcp_memory_timeout.py +0 -0
  275. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_mcp_server_smoke.py +0 -0
  276. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_mcp_toml.py +0 -0
  277. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_memory_distiller.py +0 -0
  278. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_memory_graph_api.py +0 -0
  279. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_memory_queue.py +0 -0
  280. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_memory_system.py +0 -0
  281. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_notification_dedup.py +0 -0
  282. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_notification_discipline.py +0 -0
  283. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_ollama_credentials.py +0 -0
  284. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_oracle_api_auth.py +0 -0
  285. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_oracle_apikey_api.py +0 -0
  286. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_oracle_c3_bridge.py +0 -0
  287. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_oracle_discovery_api.py +0 -0
  288. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_oracle_local_auth.py +0 -0
  289. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_oracle_ollama_bridge.py +0 -0
  290. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_oracle_scanner_cache.py +0 -0
  291. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_oracle_security_fixes.py +0 -0
  292. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_oracle_subproject_awareness.py +0 -0
  293. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_oracle_ui_bundle.py +0 -0
  294. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_output_filter.py +0 -0
  295. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_permissions.py +0 -0
  296. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_pm_api.py +0 -0
  297. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_project_manager.py +0 -0
  298. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_project_manager_merge.py +0 -0
  299. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_project_tool.py +0 -0
  300. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_read_coercion.py +0 -0
  301. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_read_edit_parity.py +0 -0
  302. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_related_facts.py +0 -0
  303. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_response_boilerplate.py +0 -0
  304. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_retention.py +0 -0
  305. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_review_digest.py +0 -0
  306. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_service_durability.py +0 -0
  307. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_session_benchmark.py +0 -0
  308. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_session_budget.py +0 -0
  309. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_shell_robustness.py +0 -0
  310. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_subproject_exclusion.py +0 -0
  311. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_subproject_federation.py +0 -0
  312. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_subprojects.py +0 -0
  313. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_swe_bench.py +0 -0
  314. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_task_store.py +0 -0
  315. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_task_tool.py +0 -0
  316. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_time_tracker.py +0 -0
  317. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_token_telemetry.py +0 -0
  318. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_tool_registry.py +0 -0
  319. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_upgrade_and_version.py +0 -0
  320. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_validate.py +0 -0
  321. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_web_security.py +0 -0
  322. {code_context_control-2.54.0 → code_context_control-2.56.0}/tests/test_windows_reliability.py +0 -0
  323. {code_context_control-2.54.0 → code_context_control-2.56.0}/tui/__init__.py +0 -0
  324. {code_context_control-2.54.0 → code_context_control-2.56.0}/tui/backend.py +0 -0
  325. {code_context_control-2.54.0 → code_context_control-2.56.0}/tui/main.py +0 -0
  326. {code_context_control-2.54.0 → code_context_control-2.56.0}/tui/screens/__init__.py +0 -0
  327. {code_context_control-2.54.0 → code_context_control-2.56.0}/tui/screens/benchmark_view.py +0 -0
  328. {code_context_control-2.54.0 → code_context_control-2.56.0}/tui/screens/claudemd_view.py +0 -0
  329. {code_context_control-2.54.0 → code_context_control-2.56.0}/tui/screens/compress_view.py +0 -0
  330. {code_context_control-2.54.0 → code_context_control-2.56.0}/tui/screens/index_view.py +0 -0
  331. {code_context_control-2.54.0 → code_context_control-2.56.0}/tui/screens/init_view.py +0 -0
  332. {code_context_control-2.54.0 → code_context_control-2.56.0}/tui/screens/mcp_view.py +0 -0
  333. {code_context_control-2.54.0 → code_context_control-2.56.0}/tui/screens/optimize_view.py +0 -0
  334. {code_context_control-2.54.0 → code_context_control-2.56.0}/tui/screens/pipe_view.py +0 -0
  335. {code_context_control-2.54.0 → code_context_control-2.56.0}/tui/screens/projects_view.py +0 -0
  336. {code_context_control-2.54.0 → code_context_control-2.56.0}/tui/screens/search_view.py +0 -0
  337. {code_context_control-2.54.0 → code_context_control-2.56.0}/tui/screens/session_view.py +0 -0
  338. {code_context_control-2.54.0 → code_context_control-2.56.0}/tui/screens/stats.py +0 -0
  339. {code_context_control-2.54.0 → code_context_control-2.56.0}/tui/screens/ui_view.py +0 -0
  340. {code_context_control-2.54.0 → code_context_control-2.56.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.54.0
3
+ Version: 2.56.0
4
4
  Summary: Local code-intelligence layer for AI coding tools (Claude Code, Codex, Copilot, Cursor, Antigravity). Retrieve less, read less, edit safer — and version the configs that shape your agent (CLAUDE.md, skills, hooks, MCP).
5
5
  Author-email: Dimitri Tselenchuk <dtselenc@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -274,6 +274,7 @@ C3 exposes 18 tools as a native MCP server. Your IDE calls them directly:
274
274
  | `c3_agent` | Multi-step agentic workflows (review, investigate, refactor) |
275
275
  | `c3_edits` | Edit-ledger queries + version diffs + restore points + per-branch filter |
276
276
  | `c3_bitbucket` | Bitbucket Data Center integration — PRs, branches, builds, repo admin (v2.30.0) |
277
+ | `c3_jira` | Jira integration — Cloud + Data Center: JQL search, issues, transitions, My Work board (v2.56.0) |
277
278
  | `c3_project` | Cross-project — discover & operate on other c3-installed projects; guarded writes (v2.31.0) |
278
279
  | `c3_task` | Durable per-project PM — tasks with dependencies & subtasks, milestones, decision notes, event history, health reports, and auto+manual time tracking (v2.53.0) |
279
280
  | `c3_artifacts` | Agent-config tracking — version history, diff & restore for CLAUDE.md, settings/hooks, MCP configs, skills (v2.46.0) |
@@ -282,7 +283,7 @@ On Windows, `c3_shell` uses Git Bash when available. Git Bash does not bundle
282
283
  optional utilities such as `jq`; use `python -m json.tool` for portable JSON
283
284
  formatting, or install `jq` separately when filter expressions are required.
284
285
 
285
- Every tool is **read-only safe in plan mode** (except `c3_edit`, `c3_shell`, `c3_artifacts(action='restore')`, and write actions on `c3_bitbucket` / `c3_project` / `c3_task`).
286
+ Every tool is **read-only safe in plan mode** (except `c3_edit`, `c3_shell`, `c3_artifacts(action='restore')`, and write actions on `c3_bitbucket` / `c3_jira` / `c3_project` / `c3_task`).
286
287
 
287
288
  ### Bitbucket Data Center / Server (v2.30.0)
288
289
 
@@ -310,6 +311,40 @@ it has no active account C3 falls back to the global `~/.c3/config.json`. So a
310
311
  single `login --global` (or any login done from your home directory) is reusable
311
312
  across every C3 project — the PAT always lives in the OS keyring, never on disk.
312
313
 
314
+ ### Jira — Cloud + Data Center (v2.56.0)
315
+
316
+ `c3_jira` connects to Jira Cloud (REST v3, email + API token) or self-hosted
317
+ Jira Data Center / Server (REST v2, PAT) behind one tool. Tokens live in the
318
+ **OS keyring** — never in `.c3/config.json`.
319
+
320
+ ```bash
321
+ # One-time login — Cloud is inferred for *.atlassian.net
322
+ c3 jira login --url https://yoursite.atlassian.net
323
+ # -> prompts for email + API token (masked)
324
+
325
+ # Self-hosted Data Center / Server
326
+ c3 jira login --url https://jira.example.com --deployment data_center
327
+
328
+ # ...or store it globally so every C3 project can use it
329
+ c3 jira login --global --url https://yoursite.atlassian.net
330
+
331
+ # Pin a default project; check connectivity
332
+ c3 jira set-default --project PROJ
333
+ c3 jira status
334
+ ```
335
+
336
+ The agent gets `c3_jira`: raw-JQL `search`, `my_issues`, issue reads, and
337
+ ledger-logged mutations (`create_issue` is pre-validated against create
338
+ metadata and returns machine-readable missing required fields; `transition`
339
+ accepts an id or a name). The web UI gains a **Jira tab** — a My Work board
340
+ grouped by status category, JQL search, an issue drawer with transitions and
341
+ comments, and an Activity view that links edit-ledger work to issue keys
342
+ (`PROJ-123` detected in branch names and edit summaries; works even before
343
+ login). Named accounts support multiple sites (`--name work`, `--name
344
+ internal`); the registry resolves project → home **wholesale from one file**,
345
+ so a repository's config can never override the credential-bound server URL
346
+ or TLS settings of a globally registered account.
347
+
313
348
  > **Upgrading:** stop the running `c3-mcp` server / CLI before `c3 upgrade`. A live
314
349
  > process can hold package files open, leaving pip's `~`-prefixed backup dirs
315
350
  > (`~ervices`, `~ools`, …) in `site-packages`; those are inert and safe to delete
@@ -211,6 +211,7 @@ C3 exposes 18 tools as a native MCP server. Your IDE calls them directly:
211
211
  | `c3_agent` | Multi-step agentic workflows (review, investigate, refactor) |
212
212
  | `c3_edits` | Edit-ledger queries + version diffs + restore points + per-branch filter |
213
213
  | `c3_bitbucket` | Bitbucket Data Center integration — PRs, branches, builds, repo admin (v2.30.0) |
214
+ | `c3_jira` | Jira integration — Cloud + Data Center: JQL search, issues, transitions, My Work board (v2.56.0) |
214
215
  | `c3_project` | Cross-project — discover & operate on other c3-installed projects; guarded writes (v2.31.0) |
215
216
  | `c3_task` | Durable per-project PM — tasks with dependencies & subtasks, milestones, decision notes, event history, health reports, and auto+manual time tracking (v2.53.0) |
216
217
  | `c3_artifacts` | Agent-config tracking — version history, diff & restore for CLAUDE.md, settings/hooks, MCP configs, skills (v2.46.0) |
@@ -219,7 +220,7 @@ On Windows, `c3_shell` uses Git Bash when available. Git Bash does not bundle
219
220
  optional utilities such as `jq`; use `python -m json.tool` for portable JSON
220
221
  formatting, or install `jq` separately when filter expressions are required.
221
222
 
222
- Every tool is **read-only safe in plan mode** (except `c3_edit`, `c3_shell`, `c3_artifacts(action='restore')`, and write actions on `c3_bitbucket` / `c3_project` / `c3_task`).
223
+ Every tool is **read-only safe in plan mode** (except `c3_edit`, `c3_shell`, `c3_artifacts(action='restore')`, and write actions on `c3_bitbucket` / `c3_jira` / `c3_project` / `c3_task`).
223
224
 
224
225
  ### Bitbucket Data Center / Server (v2.30.0)
225
226
 
@@ -247,6 +248,40 @@ it has no active account C3 falls back to the global `~/.c3/config.json`. So a
247
248
  single `login --global` (or any login done from your home directory) is reusable
248
249
  across every C3 project — the PAT always lives in the OS keyring, never on disk.
249
250
 
251
+ ### Jira — Cloud + Data Center (v2.56.0)
252
+
253
+ `c3_jira` connects to Jira Cloud (REST v3, email + API token) or self-hosted
254
+ Jira Data Center / Server (REST v2, PAT) behind one tool. Tokens live in the
255
+ **OS keyring** — never in `.c3/config.json`.
256
+
257
+ ```bash
258
+ # One-time login — Cloud is inferred for *.atlassian.net
259
+ c3 jira login --url https://yoursite.atlassian.net
260
+ # -> prompts for email + API token (masked)
261
+
262
+ # Self-hosted Data Center / Server
263
+ c3 jira login --url https://jira.example.com --deployment data_center
264
+
265
+ # ...or store it globally so every C3 project can use it
266
+ c3 jira login --global --url https://yoursite.atlassian.net
267
+
268
+ # Pin a default project; check connectivity
269
+ c3 jira set-default --project PROJ
270
+ c3 jira status
271
+ ```
272
+
273
+ The agent gets `c3_jira`: raw-JQL `search`, `my_issues`, issue reads, and
274
+ ledger-logged mutations (`create_issue` is pre-validated against create
275
+ metadata and returns machine-readable missing required fields; `transition`
276
+ accepts an id or a name). The web UI gains a **Jira tab** — a My Work board
277
+ grouped by status category, JQL search, an issue drawer with transitions and
278
+ comments, and an Activity view that links edit-ledger work to issue keys
279
+ (`PROJ-123` detected in branch names and edit summaries; works even before
280
+ login). Named accounts support multiple sites (`--name work`, `--name
281
+ internal`); the registry resolves project → home **wholesale from one file**,
282
+ so a repository's config can never override the credential-bound server URL
283
+ or TLS settings of a globally registered account.
284
+
250
285
  > **Upgrading:** stop the running `c3-mcp` server / CLI before `c3 upgrade`. A live
251
286
  > process can hold package files open, leaving pip's `~`-prefixed backup dirs
252
287
  > (`~ervices`, `~ools`, …) in `site-packages`; those are inert and safe to delete
@@ -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.54.0"
95
+ __version__ = "2.55.0"
96
96
 
97
97
 
98
98
  def _command_deps() -> CommandDeps:
@@ -248,6 +248,7 @@ _C3_MCP_ALLOW = [
248
248
  "mcp__c3__c3_memory", "mcp__c3__c3_validate", "mcp__c3__c3_edit",
249
249
  "mcp__c3__c3_agent", "mcp__c3__c3_delegate", "mcp__c3__c3_edits",
250
250
  "mcp__c3__c3_impact", "mcp__c3__c3_shell", "mcp__c3__c3_bitbucket",
251
+ "mcp__c3__c3_jira",
251
252
  "mcp__c3__c3_project", "mcp__c3__c3_task", "mcp__c3__c3_artifacts",
252
253
  ]
253
254
 
@@ -5737,6 +5738,204 @@ def _bb_cmd_set_default(args, project_path: str) -> None:
5737
5738
  print(f"[OK] Default repo: {args.project}/{args.repo}")
5738
5739
 
5739
5740
 
5741
+ def cmd_jira(args):
5742
+ """Jira Cloud / Data Center credential + workspace management."""
5743
+ sub = getattr(args, "jira_cmd", None)
5744
+ if not sub:
5745
+ print("Usage: c3 jira {login,logout,status,use,set-default} [args]")
5746
+ return
5747
+
5748
+ project_path = getattr(args, "project_path", ".") or "."
5749
+
5750
+ if sub == "login":
5751
+ _jira_cmd_login(args, project_path)
5752
+ elif sub == "logout":
5753
+ _jira_cmd_logout(args, project_path)
5754
+ elif sub == "status":
5755
+ _jira_cmd_status(args, project_path)
5756
+ elif sub == "use":
5757
+ _jira_cmd_use(args, project_path)
5758
+ elif sub == "set-default":
5759
+ _jira_cmd_set_default(args, project_path)
5760
+ else:
5761
+ print(f"Unknown jira subcommand: {sub}")
5762
+
5763
+
5764
+ def _jira_deployment_for(args, base_url: str) -> str:
5765
+ """Explicit --deployment wins; *.atlassian.net infers cloud; else unknown."""
5766
+ dep = getattr(args, "deployment", "") or ""
5767
+ if dep:
5768
+ return dep
5769
+ host = base_url.split("//", 1)[-1].split("/", 1)[0].lower()
5770
+ if host.endswith(".atlassian.net") or host.endswith(".jira.com"):
5771
+ return "cloud"
5772
+ return ""
5773
+
5774
+
5775
+ def _jira_cmd_login(args, project_path: str) -> None:
5776
+ import getpass
5777
+
5778
+ from services import jira_credentials as jr_creds
5779
+ from services.jira_client import JiraClient, JiraError
5780
+
5781
+ # --global stores the account in ~/.c3/config.json so it is reusable in
5782
+ # every C3 project (load_jira_config falls back to it automatically).
5783
+ if getattr(args, "use_global", False):
5784
+ project_path = str(Path.home())
5785
+
5786
+ base_url = (args.url or "").rstrip("/")
5787
+ deployment = _jira_deployment_for(args, base_url)
5788
+ if not deployment:
5789
+ print("[error] --deployment cloud|data_center is required for self-hosted URLs.")
5790
+ return
5791
+ name = getattr(args, "name", "") or ""
5792
+ if not name:
5793
+ host = base_url.split("//", 1)[-1].split("/", 1)[0]
5794
+ name = host.split(".")[0] or "default"
5795
+
5796
+ prompt_label = "Email" if deployment == "cloud" else "Username"
5797
+ username = args.username or input(f"{prompt_label} for {base_url}: ").strip()
5798
+ if not username:
5799
+ print("Login cancelled -- username required.")
5800
+ return
5801
+ token_label = "API token" if deployment == "cloud" else "Personal Access Token"
5802
+ token = args.token or getpass.getpass(f"{token_label} for {username}: ").strip()
5803
+ if not token:
5804
+ print("Login cancelled -- token required.")
5805
+ return
5806
+
5807
+ try:
5808
+ jr_creds.save_credentials(
5809
+ name, base_url, username, token,
5810
+ deployment=deployment,
5811
+ project_path=project_path,
5812
+ set_default=not getattr(args, "no_set_default", False),
5813
+ verify_tls=not getattr(args, "insecure", False),
5814
+ ca_bundle=getattr(args, "ca_bundle", "") or "",
5815
+ allow_insecure=getattr(args, "insecure", False),
5816
+ )
5817
+ except jr_creds.JiraCredentialError as exc:
5818
+ print(f"[error] {exc}")
5819
+ return
5820
+
5821
+ scope = "global (~/.c3)" if getattr(args, "use_global", False) else "project"
5822
+ print(f"[OK] Stored credentials for {username}@{base_url} as '{name}' [{deployment}, {scope}]")
5823
+
5824
+ # Connection probe -- skippable for offline setup (--no-verify-login) and
5825
+ # non-fatal on failure (token might be valid but the network blocked).
5826
+ if getattr(args, "no_verify_login", False):
5827
+ print(" Connection probe skipped (--no-verify-login) -- verify later with `c3 jira status`.")
5828
+ return
5829
+ try:
5830
+ client = JiraClient(
5831
+ base_url, username, token,
5832
+ deployment=deployment,
5833
+ verify_tls=not getattr(args, "insecure", False),
5834
+ ca_bundle=getattr(args, "ca_bundle", "") or "",
5835
+ )
5836
+ info = client.server_info()
5837
+ print(f" Server: Jira {info.get('version', '?')} ({base_url})")
5838
+ except (JiraError, ValueError) as exc:
5839
+ print(f"[warn] Connection probe failed: {exc}")
5840
+ print(" Token saved anyway -- re-test with `c3 jira status`.")
5841
+ return
5842
+ try:
5843
+ me = client.myself()
5844
+ if me:
5845
+ print(
5846
+ f" Auth as: {me.get('displayName', username)} "
5847
+ f"<{me.get('emailAddress', '?')}>"
5848
+ )
5849
+ except JiraError:
5850
+ pass
5851
+
5852
+
5853
+ def _jira_cmd_logout(args, project_path: str) -> None:
5854
+ from core.config import load_jira_config
5855
+ from services import jira_credentials as jr_creds
5856
+
5857
+ name = getattr(args, "name", "") or ""
5858
+ if not name:
5859
+ name = load_jira_config(project_path).get("default_account", "")
5860
+ if not name:
5861
+ print("[error] No account specified and no default account configured.")
5862
+ return
5863
+ removed = jr_creds.delete_credentials(name, project_path=project_path)
5864
+ if removed:
5865
+ print(f"[OK] Removed Jira account '{name}'")
5866
+ else:
5867
+ print(f"[warn] Nothing to remove for '{name}'")
5868
+
5869
+
5870
+ def _jira_cmd_status(args, project_path: str) -> None:
5871
+ from core.config import load_jira_config
5872
+ from services import jira_credentials as jr_creds
5873
+ from services.jira_client import JiraClient, JiraError
5874
+
5875
+ cfg = load_jira_config(project_path)
5876
+ accounts = cfg.get("accounts") or {}
5877
+ default = cfg.get("default_account", "")
5878
+
5879
+ print("[jira:status]")
5880
+ print(f" Default : {default or '-'}")
5881
+ print(f" Accounts ({len(accounts)}):")
5882
+ for acct_name, a in accounts.items():
5883
+ if not isinstance(a, dict):
5884
+ continue
5885
+ marker = "*" if acct_name == default else " "
5886
+ print(
5887
+ f" {marker} {acct_name}: {a.get('username', '?')}@{a.get('base_url', '?')} "
5888
+ f"[{a.get('deployment', '?')}] project={a.get('default_project') or '-'}"
5889
+ )
5890
+
5891
+ entry = accounts.get(default) if isinstance(accounts.get(default), dict) else None
5892
+ if not entry:
5893
+ print(" Connection: (no default account)")
5894
+ return
5895
+ token = jr_creds.load_token(entry.get("base_url", ""), entry.get("username", ""))
5896
+ if not token:
5897
+ print(" Connection: FAIL -- no token in keyring")
5898
+ return
5899
+ try:
5900
+ client = JiraClient(
5901
+ entry["base_url"], entry.get("username", ""), token,
5902
+ deployment=entry.get("deployment", "cloud"),
5903
+ verify_tls=bool(entry.get("verify_tls", True)),
5904
+ ca_bundle=entry.get("ca_bundle", ""),
5905
+ )
5906
+ info = client.server_info()
5907
+ me = client.myself()
5908
+ print(
5909
+ f" Connection: OK (Jira {info.get('version', '?')} "
5910
+ f"as {me.get('displayName', '?')})"
5911
+ )
5912
+ except (JiraError, ValueError) as exc:
5913
+ print(f" Connection: FAIL -- {exc}")
5914
+
5915
+
5916
+ def _jira_cmd_use(args, project_path: str) -> None:
5917
+ from services import jira_credentials as jr_creds
5918
+ try:
5919
+ jr_creds.set_default_account(args.name, project_path=project_path)
5920
+ except jr_creds.JiraCredentialError as exc:
5921
+ print(f"[error] {exc}")
5922
+ return
5923
+ print(f"[OK] Default Jira account: {args.name}")
5924
+
5925
+
5926
+ def _jira_cmd_set_default(args, project_path: str) -> None:
5927
+ from services import jira_credentials as jr_creds
5928
+ try:
5929
+ jr_creds.set_default_project(
5930
+ args.project, name=getattr(args, "name", "") or "",
5931
+ project_path=project_path,
5932
+ )
5933
+ except jr_creds.JiraCredentialError as exc:
5934
+ print(f"[error] {exc}")
5935
+ return
5936
+ print(f"[OK] Default Jira project: {args.project}")
5937
+
5938
+
5740
5939
  def cmd_oracle(args):
5741
5940
  """Oracle dashboard server + Discovery API key management."""
5742
5941
  sub = getattr(args, "oracle_cmd", None)
@@ -6836,6 +7035,7 @@ def main():
6836
7035
  "sub": cmd_sub,
6837
7036
  "hub": cmd_hub,
6838
7037
  "bitbucket": cmd_bitbucket,
7038
+ "jira": cmd_jira,
6839
7039
  "oracle": cmd_oracle,
6840
7040
  "upgrade": cmd_upgrade,
6841
7041
  }
@@ -359,6 +359,48 @@ def build_parser(version: str, parse_cli_ide_arg):
359
359
  bb_default.add_argument("--repo", required=True, help="Repository slug")
360
360
  bb_default.add_argument("project_path", nargs="?", default=".")
361
361
 
362
+ # ── Jira Cloud / Data Center (v2.56.0) ──────────────────────────────
363
+ p_jira = subparsers.add_parser(
364
+ "jira",
365
+ help="Jira Cloud / Data Center credential + workspace management",
366
+ )
367
+ jira_subs = p_jira.add_subparsers(dest="jira_cmd")
368
+
369
+ jr_login = jira_subs.add_parser(
370
+ "login",
371
+ help="Authenticate with a Jira site (interactive token prompt)",
372
+ )
373
+ jr_login.add_argument("--url", required=True, help="Jira base URL (e.g. https://yoursite.atlassian.net)")
374
+ jr_login.add_argument("--deployment", choices=["cloud", "data_center"], default="", help="Deployment type (inferred as 'cloud' for *.atlassian.net URLs; required otherwise)")
375
+ jr_login.add_argument("--name", default="", help="Account name in the registry (default: derived from URL host)")
376
+ jr_login.add_argument("--username", help="Email (Cloud) or username (Data Center); prompted if omitted")
377
+ jr_login.add_argument("--token", help="API token (Cloud) / PAT (Data Center); prompted via getpass if omitted — preferred")
378
+ jr_login.add_argument("--no-set-default", action="store_true", help="Do not make this the default account")
379
+ jr_login.add_argument("--no-verify-login", action="store_true", help="Skip the connection probe (store credentials offline)")
380
+ jr_login.add_argument("--insecure", action="store_true", help="Disable TLS verification / allow http:// (local dev only)")
381
+ jr_login.add_argument("--ca-bundle", default="", help="Path to a custom CA bundle for self-signed enterprise certs")
382
+ jr_login.add_argument("--global", dest="use_global", action="store_true", help="Store the account in the global ~/.c3/config.json so it is reusable in every C3 project")
383
+ jr_login.add_argument("project_path", nargs="?", default=".")
384
+
385
+ jr_logout = jira_subs.add_parser("logout", help="Remove a Jira account from keyring + config")
386
+ jr_logout.add_argument("--name", default="", help="Account name (defaults to the default account)")
387
+ jr_logout.add_argument("project_path", nargs="?", default=".")
388
+
389
+ jr_status = jira_subs.add_parser("status", help="Show configured Jira accounts and connectivity")
390
+ jr_status.add_argument("project_path", nargs="?", default=".")
391
+
392
+ jr_use = jira_subs.add_parser("use", help="Switch the default Jira account")
393
+ jr_use.add_argument("--name", required=True, help="Registered account name")
394
+ jr_use.add_argument("project_path", nargs="?", default=".")
395
+
396
+ jr_default = jira_subs.add_parser(
397
+ "set-default",
398
+ help="Set the default Jira project key on an account",
399
+ )
400
+ jr_default.add_argument("--project", required=True, help="Jira project key (e.g. PROJ)")
401
+ jr_default.add_argument("--name", default="", help="Account name (defaults to the default account)")
402
+ jr_default.add_argument("project_path", nargs="?", default=".")
403
+
362
404
  # ── Oracle Discovery API (v2.32.0) ──────────────────────────────────
363
405
  p_oracle = subparsers.add_parser(
364
406
  "oracle",
@@ -778,6 +778,50 @@ async def c3_bitbucket(
778
778
  )
779
779
 
780
780
 
781
+ @mcp.tool()
782
+ async def c3_jira(
783
+ action: str,
784
+ issue: str = "",
785
+ jql: str = "",
786
+ project: str = "",
787
+ issue_type: str = "",
788
+ summary: str = "",
789
+ description: str = "",
790
+ body: str = "",
791
+ body_format: str = "text",
792
+ transition: str = "",
793
+ user: str = "",
794
+ query: str = "",
795
+ fields: str = "",
796
+ status_category: str = "",
797
+ account: str = "",
798
+ cursor: str = "",
799
+ limit: int = 25,
800
+ ctx: Context = None,
801
+ ) -> str:
802
+ """JIRA (Cloud + Data Center) — search, read, create, comment, transition, assign issues.
803
+ actions: status, whoami, search (jql), get_issue (issue), my_issues,
804
+ list_projects, list_transitions (issue), get_create_metadata (project, issue_type),
805
+ search_users (query), create_issue (project, issue_type, summary [description] [fields=JSON]),
806
+ comment (issue, body), transition (issue, transition=id|name [body]), assign (issue, user).
807
+ project falls back to the account's default_project; account to jira.default_account.
808
+ Mutating actions are ledger-logged. Tokens live in the OS keyring — `c3 jira login` first."""
809
+ svc = _svc(ctx)
810
+
811
+ def finalize(fname, fargs, fresp, fsumm, **kw):
812
+ return _finalize_response(ctx, fname, fargs, fresp, fsumm, **kw)
813
+
814
+ from cli.tools.jira import handle_jira
815
+ return await asyncio.to_thread(
816
+ handle_jira, action, svc, finalize,
817
+ issue=issue, jql=jql, project=project, issue_type=issue_type,
818
+ summary=summary, description=description, body=body,
819
+ body_format=body_format, transition=transition, user=user,
820
+ query=query, fields=fields, status_category=status_category,
821
+ account=account, cursor=cursor, limit=limit,
822
+ )
823
+
824
+
781
825
  @mcp.tool()
782
826
  async def c3_project(
783
827
  action: str,