code-context-control 2.55.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.
- {code_context_control-2.55.0/code_context_control.egg-info → code_context_control-2.56.0}/PKG-INFO +37 -2
- {code_context_control-2.55.0 → code_context_control-2.56.0}/README.md +36 -1
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/c3.py +200 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/commands/parser.py +42 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/mcp_server.py +44 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/server.py +229 -0
- code_context_control-2.56.0/cli/tools/jira.py +459 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui/app.js +4 -0
- code_context_control-2.56.0/cli/ui/components/jira.js +345 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0/code_context_control.egg-info}/PKG-INFO +37 -2
- {code_context_control-2.55.0 → code_context_control-2.56.0}/code_context_control.egg-info/SOURCES.txt +14 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/core/config.py +66 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/pyproject.toml +1 -1
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/claude_md.py +1 -0
- code_context_control-2.56.0/services/jira_client.py +319 -0
- code_context_control-2.56.0/services/jira_cloud.py +222 -0
- code_context_control-2.56.0/services/jira_credentials.py +250 -0
- code_context_control-2.56.0/services/jira_data_center.py +196 -0
- code_context_control-2.56.0/services/jira_links.py +117 -0
- code_context_control-2.56.0/tests/test_jira_cli_smoke.py +156 -0
- code_context_control-2.56.0/tests/test_jira_client.py +308 -0
- code_context_control-2.56.0/tests/test_jira_config_fallback.py +120 -0
- code_context_control-2.56.0/tests/test_jira_credentials.py +181 -0
- code_context_control-2.56.0/tests/test_jira_links.py +128 -0
- code_context_control-2.56.0/tests/test_jira_routes.py +234 -0
- code_context_control-2.56.0/tests/test_jira_tool.py +293 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/LICENSE +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/__init__.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/_hook_utils.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/commands/__init__.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/commands/common.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/docs.html +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/edits.html +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/guide/bitbucket.html +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/guide/getting-started.html +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/guide/index.html +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/guide/oracle.html +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/guide/shared.css +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/guide/tools.html +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/guide/workflow.html +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hook_artifact.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hook_auto_snapshot.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hook_c3_signal.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hook_c3read.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hook_dispatch.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hook_edit_ledger.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hook_edit_unlock.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hook_filter.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hook_ghost_files.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hook_pretool_enforce.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hook_prompt_recall.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hook_read.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hook_session_stats.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hook_terse_advisor.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub.html +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_server.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/app.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/add_project.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/config_editor.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/drill_artifacts.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/drill_health.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/drill_panel.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/drill_tasks.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/drill_views.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/global_search.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/mcp_manager.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/modals.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/project_card.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/project_tree.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/session_drawer.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/settings_modal.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/sidebar.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/summary_bar.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/task_board.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/toasts.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/components/topbar.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui/state.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/hub_ui.html +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/mcp_proxy.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/progress.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/__init__.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/_helpers.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/agent.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/artifacts.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/bitbucket.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/compress.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/delegate.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/edit.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/edits.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/federate.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/filter.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/impact.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/memory.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/project.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/read.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/search.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/session.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/shell.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/status.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/tasks.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/tools/validate.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui/api.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui/components/bitbucket.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui/components/chat.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui/components/dashboard.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui/components/edits.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui/components/instructions.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui/components/memory.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui/components/sessions.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui/components/settings.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui/components/sidebar.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui/components/tasks.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui/icons.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui/pm_shared.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui/shared.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui/theme.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui.html +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui_legacy.html +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/cli/ui_nano.html +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/code_context_control.egg-info/dependency_links.txt +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/code_context_control.egg-info/entry_points.txt +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/code_context_control.egg-info/requires.txt +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/code_context_control.egg-info/top_level.txt +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/core/__init__.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/core/ide.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/core/mcp_toml.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/core/web_security.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/__init__.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/config.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/mcp_oracle.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/oracle_server.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/oracle_ui.html +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/services/__init__.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/services/activity_reporter.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/services/api_auth.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/services/c3_bridge.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/services/chat_engine.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/services/chat_store.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/services/cross_memory.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/services/federated_graph.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/services/health_checker.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/services/insight_engine.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/services/local_session.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/services/memory_reader.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/services/memory_writer.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/services/project_scanner.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/services/review_agent.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/services/tool_executor.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/services/tool_registry.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/ui/activity.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/ui/agents.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/ui/app.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/ui/busy.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/ui/chat/conversations.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/ui/chat/input.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/ui/chat/markdown.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/ui/chat/send.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/ui/chat/stream_renderer.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/ui/chat/toolbar.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/ui/core.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/ui/crossgraph.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/ui/header.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/ui/insights.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/ui/projects.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/ui/settings.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/ui/suggestions.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/oracle/ui/theme_tabs.js +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/__init__.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/activity_log.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/agent_base.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/agents.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/artifact_defs.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/artifact_store.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/auto_memory.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/bench/__init__.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/bench/external/__init__.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/bench/external/aider_polyglot.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/bench/external/swe_bench.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/benchmark_dashboard.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/bitbucket_client.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/bitbucket_credentials.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/circuit_breaker.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/compressor.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/context_snapshot.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/conversation_store.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/doc_index.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/e2e_benchmark.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/e2e_evaluator.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/e2e_tasks.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/edit_ledger.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/embedding_index.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/error_reporting.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/file_memory.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/git_context.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/hub_service.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/indexer.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/memory.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/memory_consolidator.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/memory_distiller.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/memory_graph.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/memory_grounder.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/memory_queue.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/memory_scorer.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/metrics.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/notifications.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/ollama_bridge.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/ollama_client.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/ollama_credentials.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/output_filter.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/parser.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/project_manager.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/project_runtime.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/protocol.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/proxy_state.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/retention.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/retrieval_broker.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/router.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/runtime.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/scanner.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/session_benchmark.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/session_manager.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/session_preloader.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/subprojects.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/task_store.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/telemetry.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/text_index.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/time_tracker.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/tool_classifier.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/transcript_index.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/validation_cache.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/vector_store.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/watcher.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/services/win_subprocess.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/setup.cfg +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_activity_reporter.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_aider_polyglot.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_antigravity_transition.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_artifact_store.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_artifact_tool.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_bitbucket_cli_smoke.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_bitbucket_client.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_bitbucket_config_fallback.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_bitbucket_credentials.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_bitbucket_tool.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_c3_bridge_project_artifacts.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_c3_shell.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_circuit_breaker.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_claude_md_merge.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_cli_smoke.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_compressor_large_file.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_delegate_cascade.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_e2e_benchmark.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_edit_ledger_hook.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_edit_normalization.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_enforcement_flip.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_federated_graph.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_filter_backoff.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_ghost_files.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_ghost_generation.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_git_branch_awareness.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_hook_dispatch.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_hook_pretool_enforce.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_hook_prompt_recall.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_hook_smoke.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_hook_state.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_hook_utf8_stdio.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_hub_inspect_api.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_hub_server_smoke.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_init_scan.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_install_mcp_entrypoint.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_lazy_store_init.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_mcp_host_guard.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_mcp_memory_timeout.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_mcp_server_smoke.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_mcp_toml.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_memory_distiller.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_memory_graph_api.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_memory_queue.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_memory_system.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_notification_dedup.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_notification_discipline.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_ollama_credentials.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_oracle_api_auth.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_oracle_apikey_api.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_oracle_c3_bridge.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_oracle_chat_engine.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_oracle_discovery_api.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_oracle_local_auth.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_oracle_ollama_bridge.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_oracle_scanner_cache.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_oracle_security_fixes.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_oracle_subproject_awareness.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_oracle_ui_bundle.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_output_filter.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_permissions.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_pm_api.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_project_manager.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_project_manager_merge.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_project_tool.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_read_coercion.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_read_edit_parity.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_related_facts.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_response_boilerplate.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_retention.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_review_digest.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_service_durability.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_session_benchmark.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_session_budget.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_shell_robustness.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_subproject_exclusion.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_subproject_federation.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_subprojects.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_swe_bench.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_task_store.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_task_tool.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_time_tracker.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_token_telemetry.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_tool_registry.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_upgrade_and_version.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_validate.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_web_security.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tests/test_windows_reliability.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tui/__init__.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tui/backend.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tui/main.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tui/screens/__init__.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tui/screens/benchmark_view.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tui/screens/claudemd_view.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tui/screens/compress_view.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tui/screens/index_view.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tui/screens/init_view.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tui/screens/mcp_view.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tui/screens/optimize_view.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tui/screens/pipe_view.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tui/screens/projects_view.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tui/screens/search_view.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tui/screens/session_view.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tui/screens/stats.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tui/screens/ui_view.py +0 -0
- {code_context_control-2.55.0 → code_context_control-2.56.0}/tui/theme.tcss +0 -0
{code_context_control-2.55.0/code_context_control.egg-info → code_context_control-2.56.0}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-context-control
|
|
3
|
-
Version: 2.
|
|
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
|
|
@@ -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,
|