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