code-context-control 2.78.0__tar.gz → 2.80.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.78.0/code_context_control.egg-info → code_context_control-2.80.0}/PKG-INFO +3 -2
- {code_context_control-2.78.0 → code_context_control-2.80.0}/README.md +2 -1
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/c3.py +80 -2
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/commands/parser.py +49 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_server.py +129 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/app.js +4 -2
- code_context_control-2.80.0/cli/hub_ui/components/hub_ci.js +361 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/topbar.js +1 -1
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/mcp_server.py +33 -0
- code_context_control-2.80.0/cli/tools/ci.py +229 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0/code_context_control.egg-info}/PKG-INFO +3 -2
- {code_context_control-2.78.0 → code_context_control-2.80.0}/code_context_control.egg-info/SOURCES.txt +9 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/pyproject.toml +1 -1
- code_context_control-2.80.0/services/ci_expr.py +435 -0
- code_context_control-2.80.0/services/ci_failures.py +195 -0
- code_context_control-2.80.0/services/ci_runner.py +655 -0
- code_context_control-2.80.0/services/ci_workflow.py +675 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/claude_md.py +1 -0
- code_context_control-2.80.0/tests/test_ci_expr.py +340 -0
- code_context_control-2.80.0/tests/test_ci_runner.py +529 -0
- code_context_control-2.80.0/tests/test_ci_workflow.py +294 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/LICENSE +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/__init__.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/_hook_utils.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/commands/__init__.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/commands/common.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/docs.html +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/edits.html +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/guide/access.html +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/guide/bitbucket.html +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/guide/credentials.html +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/guide/getting-started.html +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/guide/index.html +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/guide/masking.html +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/guide/oracle.html +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/guide/shared.css +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/guide/tools.html +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/guide/workflow.html +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hook_access_guard.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hook_artifact.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hook_auto_snapshot.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hook_c3_signal.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hook_c3read.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hook_dispatch.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hook_edit_ledger.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hook_edit_unlock.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hook_filter.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hook_ghost_files.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hook_pretool_enforce.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hook_prompt_recall.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hook_read.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hook_session_stats.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hook_terse_advisor.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/add_project.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/config_editor.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/drill_artifacts.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/drill_health.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/drill_panel.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/drill_subprojects.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/drill_tasks.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/drill_views.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/global_search.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/hub_credentials.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/hub_enforcement.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/hub_locks.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/mcp_manager.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/modals.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/project_card.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/project_tree.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/session_drawer.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/settings_modal.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/sidebar.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/summary_bar.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/task_board.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/components/toasts.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui/state.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/hub_ui.html +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/mcp_proxy.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/progress.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/server.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/__init__.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/_grants.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/_helpers.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/agent.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/artifacts.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/bitbucket.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/compress.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/credentials.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/delegate.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/edit.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/edit_verify.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/edits.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/federate.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/filter.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/impact.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/jira.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/locks.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/memory.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/override.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/project.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/read.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/search.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/session.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/shell.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/status.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/tasks.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/tools/validate.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/api.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/app.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/components/access.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/components/bitbucket.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/components/chat.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/components/credentials.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/components/dashboard.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/components/edits.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/components/enforcement.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/components/instructions.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/components/jira.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/components/memory.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/components/sessions.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/components/settings.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/components/sidebar.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/components/tasks.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/icons.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/pm_shared.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/shared.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui/theme.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui.html +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui_legacy.html +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/cli/ui_nano.html +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/code_context_control.egg-info/dependency_links.txt +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/code_context_control.egg-info/entry_points.txt +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/code_context_control.egg-info/requires.txt +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/code_context_control.egg-info/top_level.txt +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/core/__init__.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/core/config.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/core/ide.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/core/mcp_toml.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/core/web_security.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/__init__.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/config.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/mcp_oracle.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/oracle_server.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/oracle_ui.html +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/__init__.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/activity_reporter.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/api_auth.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/c3_bridge.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/chat_engine.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/chat_poll.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/chat_store.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/cross_memory.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/discovery_audit.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/federated_graph.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/health_checker.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/insight_engine.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/local_session.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/memory_reader.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/memory_writer.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/mobile_api.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/project_scanner.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/review_agent.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/tool_executor.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/services/tool_registry.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/activity.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/agents.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/app.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/busy.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/chat/conversations.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/chat/input.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/chat/markdown.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/chat/send.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/chat/stream_renderer.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/chat/toolbar.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/core.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/crossgraph.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/header.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/insights.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/projects.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/qrcode.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/settings.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/suggestions.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/oracle/ui/theme_tabs.js +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/__init__.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/access_guard.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/access_telemetry.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/activity_log.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/agent_base.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/agent_locks.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/agents.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/artifact_defs.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/artifact_store.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/auto_memory.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/bench/__init__.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/bench/external/__init__.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/bench/external/aider_polyglot.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/bench/external/swe_bench.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/benchmark_dashboard.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/bitbucket_client.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/bitbucket_credentials.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/circuit_breaker.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/compressor.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/context_snapshot.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/conversation_store.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/credential_store.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/doc_index.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/e2e_benchmark.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/e2e_evaluator.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/e2e_tasks.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/edit_ledger.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/embedding_index.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/enforcement_policy.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/error_reporting.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/file_memory.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/git_context.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/hub_service.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/indexer.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/jira_client.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/jira_cloud.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/jira_credentials.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/jira_data_center.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/jira_links.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/mask_activation.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/mask_mirror.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/mask_presets.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/memory.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/memory_consolidator.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/memory_distiller.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/memory_graph.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/memory_grounder.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/memory_queue.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/memory_scorer.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/metrics.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/notifications.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/ollama_bridge.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/ollama_client.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/ollama_credentials.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/output_filter.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/override_grants.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/override_policy.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/override_requests.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/override_wake.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/parser.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/project_manager.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/project_runtime.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/protocol.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/proxy_state.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/repo_map.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/retention.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/retrieval_broker.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/router.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/runtime.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/scanner.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/session_benchmark.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/session_manager.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/session_preloader.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/subprojects.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/task_store.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/telemetry.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/text_index.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/time_tracker.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/tool_classifier.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/transcript_index.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/validation_cache.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/vector_store.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/watcher.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/services/win_subprocess.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/setup.cfg +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_access_builtin_optout.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_access_guard.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_access_guard_meta.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_access_guard_shell_project.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_access_guard_surfaces.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_access_guard_wiring.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_activity_reporter.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_agent_locks.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_aider_polyglot.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_antigravity_transition.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_artifact_store.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_artifact_tool.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_bitbucket_cli_smoke.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_bitbucket_client.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_bitbucket_config_fallback.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_bitbucket_credentials.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_bitbucket_tool.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_c3_bridge_project_artifacts.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_c3_shell.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_chat_poll.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_circuit_breaker.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_claude_md_merge.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_cli_smoke.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_compressor_large_file.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_credential_store.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_credentials_routes.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_credentials_tool.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_creds_cli_smoke.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_delegate_cascade.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_delegate_version_probe.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_e2e_benchmark.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_edit_ledger_deadline.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_edit_ledger_hook.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_edit_locking.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_edit_normalization.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_edit_verify.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_embedding_index_deadlock.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_enforcement_flip.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_enforcement_policy.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_enforcement_routes.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_federated_graph.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_filter_backoff.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_ghost_files.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_ghost_generation.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_git_branch_awareness.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_hook_access_guard.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_hook_codex_compat.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_hook_dispatch.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_hook_pretool_enforce.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_hook_prompt_recall.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_hook_smoke.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_hook_state.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_hook_utf8_stdio.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_hub_credentials_route.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_hub_credentials_routes_write.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_hub_enforcement_routes.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_hub_inspect_api.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_hub_locks_routes.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_hub_server_smoke.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_hub_subproject_links.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_ide_workflow_adaptation.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_init_scan.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_install_mcp_entrypoint.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_jira_cli_smoke.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_jira_client.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_jira_config_fallback.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_jira_credentials.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_jira_links.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_jira_routes.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_jira_tool.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_lazy_store_init.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_mask_guard.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_mask_routes.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_mask_surfaces.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_mcp_host_guard.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_mcp_memory_timeout.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_mcp_server_smoke.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_mcp_toml.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_memory_distiller.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_memory_graph_api.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_memory_queue.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_memory_system.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_mobile_api.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_mobile_extras.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_mobile_override_routes.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_mobile_security_api.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_no_stale_model_pins.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_notification_dedup.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_notification_discipline.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_ollama_credentials.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_oracle_api_auth.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_oracle_apikey_api.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_oracle_c3_bridge.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_oracle_chat_engine.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_oracle_chat_store.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_oracle_discovery_api.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_oracle_discovery_audit.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_oracle_local_auth.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_oracle_ollama_bridge.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_oracle_scanner_cache.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_oracle_security_fixes.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_oracle_session_bootstrap.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_oracle_subproject_awareness.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_oracle_ui_bundle.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_output_filter.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_override_grants.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_override_grants_mcp.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_override_requests.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_override_wake.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_permissions.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_pm_api.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_project_manager.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_project_manager_merge.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_project_tool.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_read_coercion.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_read_edit_parity.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_related_facts.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_repo_map.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_response_boilerplate.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_retention.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_review_digest.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_service_durability.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_session_benchmark.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_session_budget.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_shell_creds.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_shell_robustness.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_subproject_exclusion.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_subproject_federation.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_subprojects.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_swe_bench.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_task_store.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_task_tool.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_time_tracker.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_token_telemetry.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_tool_registry.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_upgrade_and_version.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_validate.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_vault_write_guard.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_version_sync.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_web_security.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tests/test_windows_reliability.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tui/__init__.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tui/backend.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tui/main.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tui/screens/__init__.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tui/screens/benchmark_view.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tui/screens/claudemd_view.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tui/screens/compress_view.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tui/screens/index_view.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tui/screens/init_view.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tui/screens/mcp_view.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tui/screens/optimize_view.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tui/screens/pipe_view.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tui/screens/projects_view.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tui/screens/search_view.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tui/screens/session_view.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tui/screens/stats.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tui/screens/ui_view.py +0 -0
- {code_context_control-2.78.0 → code_context_control-2.80.0}/tui/theme.tcss +0 -0
{code_context_control-2.78.0/code_context_control.egg-info → code_context_control-2.80.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.80.0
|
|
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
|
|
@@ -202,6 +202,7 @@ C3 exposes **21 tools** as a native MCP server. Your IDE calls them directly:
|
|
|
202
202
|
| `c3_session` | Snapshot, restore, log decisions, compact history |
|
|
203
203
|
| `c3_impact` | Blast-radius analysis before editing shared symbols |
|
|
204
204
|
| `c3_locks` | Agent leases — who is working on which file, so two agents don't collide (v2.65.0) |
|
|
205
|
+
| `c3_ci` | Run this repo's real `.github/workflows` locally, with structured failures, before pushing (v2.79.0) |
|
|
205
206
|
| `c3_delegate` | Offload heavy work to local Ollama / Codex / Gemini |
|
|
206
207
|
| `c3_agent` | Workflows: `review_changes`, `investigate`, `preflight`, `prepare_context`, `validate_compress` |
|
|
207
208
|
| `c3_edits` | Edit-ledger queries, version diffs, restore points, per-branch filter, `verify` (did a failed `c3_edit` still land?) |
|
|
@@ -212,7 +213,7 @@ C3 exposes **21 tools** as a native MCP server. Your IDE calls them directly:
|
|
|
212
213
|
| `c3_jira` | Jira Cloud + Data Center — JQL, issues, transitions (v2.56.0) |
|
|
213
214
|
| `c3_project` | Cross-project discovery & operations; guarded writes (v2.31.0) |
|
|
214
215
|
|
|
215
|
-
Every tool is **read-only safe in plan mode** except `c3_edit`, `c3_shell`, `c3_artifacts(action='restore')`, `c3_delegate` with write delegation enabled, and write actions on `c3_bitbucket` / `c3_jira` / `c3_credentials` / `c3_project` / `c3_task` / `c3_locks`.
|
|
216
|
+
Every tool is **read-only safe in plan mode** except `c3_edit`, `c3_shell`, `c3_ci(action='run'|'rerun')`, `c3_artifacts(action='restore')`, `c3_delegate` with write delegation enabled, and write actions on `c3_bitbucket` / `c3_jira` / `c3_credentials` / `c3_project` / `c3_task` / `c3_locks`.
|
|
216
217
|
|
|
217
218
|
On Windows `c3_shell` uses Git Bash when available. Git Bash bundles no `jq`; use `python -m json.tool` for portable JSON formatting.
|
|
218
219
|
|
|
@@ -139,6 +139,7 @@ C3 exposes **21 tools** as a native MCP server. Your IDE calls them directly:
|
|
|
139
139
|
| `c3_session` | Snapshot, restore, log decisions, compact history |
|
|
140
140
|
| `c3_impact` | Blast-radius analysis before editing shared symbols |
|
|
141
141
|
| `c3_locks` | Agent leases — who is working on which file, so two agents don't collide (v2.65.0) |
|
|
142
|
+
| `c3_ci` | Run this repo's real `.github/workflows` locally, with structured failures, before pushing (v2.79.0) |
|
|
142
143
|
| `c3_delegate` | Offload heavy work to local Ollama / Codex / Gemini |
|
|
143
144
|
| `c3_agent` | Workflows: `review_changes`, `investigate`, `preflight`, `prepare_context`, `validate_compress` |
|
|
144
145
|
| `c3_edits` | Edit-ledger queries, version diffs, restore points, per-branch filter, `verify` (did a failed `c3_edit` still land?) |
|
|
@@ -149,7 +150,7 @@ C3 exposes **21 tools** as a native MCP server. Your IDE calls them directly:
|
|
|
149
150
|
| `c3_jira` | Jira Cloud + Data Center — JQL, issues, transitions (v2.56.0) |
|
|
150
151
|
| `c3_project` | Cross-project discovery & operations; guarded writes (v2.31.0) |
|
|
151
152
|
|
|
152
|
-
Every tool is **read-only safe in plan mode** except `c3_edit`, `c3_shell`, `c3_artifacts(action='restore')`, `c3_delegate` with write delegation enabled, and write actions on `c3_bitbucket` / `c3_jira` / `c3_credentials` / `c3_project` / `c3_task` / `c3_locks`.
|
|
153
|
+
Every tool is **read-only safe in plan mode** except `c3_edit`, `c3_shell`, `c3_ci(action='run'|'rerun')`, `c3_artifacts(action='restore')`, `c3_delegate` with write delegation enabled, and write actions on `c3_bitbucket` / `c3_jira` / `c3_credentials` / `c3_project` / `c3_task` / `c3_locks`.
|
|
153
154
|
|
|
154
155
|
On Windows `c3_shell` uses Git Bash when available. Git Bash bundles no `jq`; use `python -m json.tool` for portable JSON formatting.
|
|
155
156
|
|
|
@@ -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.80.0"
|
|
96
96
|
|
|
97
97
|
|
|
98
98
|
def _compress_file_cli(compressor, path, mode="smart", **kw):
|
|
@@ -261,7 +261,7 @@ _C3_MCP_ALLOW = [
|
|
|
261
261
|
"mcp__c3__c3_bitbucket",
|
|
262
262
|
"mcp__c3__c3_jira", "mcp__c3__c3_credentials",
|
|
263
263
|
"mcp__c3__c3_project", "mcp__c3__c3_task", "mcp__c3__c3_artifacts",
|
|
264
|
-
"mcp__c3__c3_override",
|
|
264
|
+
"mcp__c3__c3_override", "mcp__c3__c3_ci",
|
|
265
265
|
]
|
|
266
266
|
|
|
267
267
|
# Obsolete MCP tool names from earlier C3 versions. `c3 permissions clean`
|
|
@@ -4772,6 +4772,7 @@ back to native tools as the task progresses.
|
|
|
4772
4772
|
- **Shell**: `c3_shell(cmd, timeout=60)` — structured shell exec (tests/git/build). Auto-filters output, logs git mutations to the ledger. Native Bash for interactive/TTY only
|
|
4773
4773
|
- **Memory**: `c3_memory(action='recall')` — full recall. `index` + `fetch` for token-efficient two-step retrieval
|
|
4774
4774
|
- **Delegate**: `c3_delegate(task, backend='ollama|codex|gemini|claude|auto')` — offload to other models
|
|
4775
|
+
- **Local CI** (v2.79.0+): `c3_ci(action='inspect|run|rerun|failures')` — run THIS repo's real `.github/workflows` here instead of pushing for feedback. `run` executes in `needs` order; `failures` gives {file,line,message}; `rerun` retries only what failed. Only `FULL_CI_PASS` means safe to push — `PARTIAL_PASS` means something did not run (other OS, unsupported action, or your selection).
|
|
4775
4776
|
- **Bitbucket** (v2.30.0+, when `c3 bitbucket login` has run): `c3_bitbucket(action='list_prs|get_pr|merge_pr|...')` — self-hosted Bitbucket Data Center / Server. Token in OS keyring; mutating actions auto-log to the edit ledger.
|
|
4776
4777
|
- **Cross-project** (v2.31.0+): `c3_project(action='list|scan|search|read|edit|...', project='<name|path>')` — discover and operate on OTHER c3-installed projects. Reads run freely; writes (edit/shell/memory) need `allow_write=true`.
|
|
4777
4778
|
- **Masked paths** (v2.63.0+): content prefixed `[c3-mask:transformed]` is a policy-transformed VIEW, not the file. Values may be synthetic, rows withheld, bodies stripped — don't copy literals out of it or infer completeness from it. Masked paths are read-only and refuse shell/git/validate/impact/filter/delegate (`[c3-mask:unsupported]`). That's policy, not a transient error — report the block instead of routing around it.
|
|
@@ -6030,6 +6031,82 @@ def _creds_cmd_import(args, project_path: str) -> None:
|
|
|
6030
6031
|
"(use --overwrite to replace)")
|
|
6031
6032
|
|
|
6032
6033
|
|
|
6034
|
+
def cmd_ci(args):
|
|
6035
|
+
"""AgentCI entry point — exits with the finding.
|
|
6036
|
+
|
|
6037
|
+
The shared dispatcher below discards every command's return value, so
|
|
6038
|
+
`ci` exits for itself rather than changing exit-code behaviour for the
|
|
6039
|
+
other twenty commands. A pre-push hook or a script has to be able to read
|
|
6040
|
+
"not a full pass" from `$?`, which is the whole point of the verdict.
|
|
6041
|
+
"""
|
|
6042
|
+
sys.exit(_ci_main(args))
|
|
6043
|
+
|
|
6044
|
+
|
|
6045
|
+
def _ci_main(args) -> int:
|
|
6046
|
+
"""AgentCI — run this repo's real CI locally (docs/agent-ci.md).
|
|
6047
|
+
|
|
6048
|
+
The human mirror of the c3_ci tool. It deliberately reuses the same
|
|
6049
|
+
handler, so the CLI and the agent surface can never drift into disagreeing
|
|
6050
|
+
about what a verdict means. Returns the process exit code.
|
|
6051
|
+
"""
|
|
6052
|
+
import json as _json
|
|
6053
|
+
from types import SimpleNamespace
|
|
6054
|
+
|
|
6055
|
+
from cli.tools.ci import handle_ci
|
|
6056
|
+
|
|
6057
|
+
sub = getattr(args, "ci_cmd", None) or "inspect"
|
|
6058
|
+
project_path = getattr(args, "project_path", ".") or "."
|
|
6059
|
+
as_json = bool(getattr(args, "json", False))
|
|
6060
|
+
|
|
6061
|
+
if as_json:
|
|
6062
|
+
# Structured mode answers from the services directly — the text
|
|
6063
|
+
# handler formats for reading, and reformatting prose into JSON would
|
|
6064
|
+
# be a second, lossier schema.
|
|
6065
|
+
from services import ci_runner as cr
|
|
6066
|
+
from services.ci_workflow import inspect_project
|
|
6067
|
+
if sub == "inspect":
|
|
6068
|
+
payload = inspect_project(project_path, event=getattr(args, "event", "") or "")
|
|
6069
|
+
elif sub in ("run", "rerun"):
|
|
6070
|
+
only = None
|
|
6071
|
+
if sub == "rerun":
|
|
6072
|
+
prior = cr.load_run(project_path, getattr(args, "run_id", ""))
|
|
6073
|
+
only = (prior or {}).get("failed") or []
|
|
6074
|
+
if not only:
|
|
6075
|
+
print(_json.dumps({"error": "no failed jobs to rerun"}))
|
|
6076
|
+
return 1
|
|
6077
|
+
payload = cr.run_ci(
|
|
6078
|
+
project_path, selector=getattr(args, "job", ""),
|
|
6079
|
+
allow_foreign=bool(getattr(args, "allow_foreign", False)),
|
|
6080
|
+
only=only, timeout=getattr(args, "timeout", 0) or cr.DEFAULT_STEP_TIMEOUT,
|
|
6081
|
+
workflow=getattr(args, "workflow", ""),
|
|
6082
|
+
event=getattr(args, "event", "") or "").to_dict()
|
|
6083
|
+
elif sub == "runs":
|
|
6084
|
+
payload = {"runs": cr.list_runs(project_path)}
|
|
6085
|
+
else:
|
|
6086
|
+
payload = cr.load_run(project_path, getattr(args, "run_id", ""))
|
|
6087
|
+
print(_json.dumps(payload, indent=2))
|
|
6088
|
+
verdict = payload.get("verdict") if isinstance(payload, dict) else ""
|
|
6089
|
+
return 0 if verdict in (cr.FULL_PASS, None, "") else 1
|
|
6090
|
+
|
|
6091
|
+
svc = SimpleNamespace(project_path=project_path)
|
|
6092
|
+
|
|
6093
|
+
def finalize(_name, _args, resp, _summ, **_kw):
|
|
6094
|
+
return resp
|
|
6095
|
+
|
|
6096
|
+
out = handle_ci(
|
|
6097
|
+
sub, getattr(args, "job", "") or "", getattr(args, "run_id", "") or "",
|
|
6098
|
+
bool(getattr(args, "allow_foreign", False)),
|
|
6099
|
+
getattr(args, "workflow", "") or "", getattr(args, "tail", 200) or 200,
|
|
6100
|
+
getattr(args, "timeout", 0) or 0, svc, finalize,
|
|
6101
|
+
getattr(args, "event", "") or "")
|
|
6102
|
+
print(out)
|
|
6103
|
+
# Exit code is the finding: a non-full verdict must not read as success to
|
|
6104
|
+
# a shell script or a pre-push hook.
|
|
6105
|
+
if sub in ("run", "rerun") and "FULL_CI_PASS" not in out:
|
|
6106
|
+
return 1
|
|
6107
|
+
return 0
|
|
6108
|
+
|
|
6109
|
+
|
|
6033
6110
|
def cmd_locks(args):
|
|
6034
6111
|
"""Agent Locks — human surface. force-release lives here, never in c3_locks."""
|
|
6035
6112
|
from services import agent_locks as al
|
|
@@ -8290,6 +8367,7 @@ def main():
|
|
|
8290
8367
|
"enforce": cmd_enforce,
|
|
8291
8368
|
"override": cmd_override,
|
|
8292
8369
|
"locks": cmd_locks,
|
|
8370
|
+
"ci": cmd_ci,
|
|
8293
8371
|
"oracle": cmd_oracle,
|
|
8294
8372
|
"upgrade": cmd_upgrade,
|
|
8295
8373
|
}
|
|
@@ -472,6 +472,55 @@ def build_parser(version: str, parse_cli_ide_arg):
|
|
|
472
472
|
lk_sweep = locks_subs.add_parser("sweep", help="Drop expired leases now")
|
|
473
473
|
lk_sweep.add_argument("--path", dest="project_path", default=".")
|
|
474
474
|
|
|
475
|
+
# ── AgentCI — local CI execution (docs/agent-ci.md) ─────────────────
|
|
476
|
+
# Reads .github/workflows/*.yml as the source of truth. The CLI mirrors
|
|
477
|
+
# the c3_ci tool so a human can drive the same loop an agent does.
|
|
478
|
+
p_ci = subparsers.add_parser(
|
|
479
|
+
"ci", help="Run this repo's real CI locally instead of pushing for feedback")
|
|
480
|
+
ci_subs = p_ci.add_subparsers(dest="ci_cmd")
|
|
481
|
+
|
|
482
|
+
def _ci_common(sub):
|
|
483
|
+
sub.add_argument("--path", dest="project_path", default=".",
|
|
484
|
+
help="Project directory (default: current)")
|
|
485
|
+
sub.add_argument("--json", action="store_true", help="Machine-readable output")
|
|
486
|
+
sub.add_argument("--event", default="",
|
|
487
|
+
help="GitHub event to simulate (push, pull_request) — "
|
|
488
|
+
"only needed when an `if:` reads github.event_name")
|
|
489
|
+
return sub
|
|
490
|
+
|
|
491
|
+
_ci_common(ci_subs.add_parser(
|
|
492
|
+
"inspect", help="Show workflows, the job DAG, and what runs on this host"))
|
|
493
|
+
|
|
494
|
+
ci_run = _ci_common(ci_subs.add_parser("run", help="Execute jobs locally"))
|
|
495
|
+
ci_run.add_argument("--job", default="",
|
|
496
|
+
help="Job id, matrix cell, or workflow::job (default: all)")
|
|
497
|
+
ci_run.add_argument("--workflow", default="", help="Limit to one workflow by name")
|
|
498
|
+
ci_run.add_argument("--allow-foreign", action="store_true",
|
|
499
|
+
help="Also run jobs targeting another OS (labelled cross-OS; "
|
|
500
|
+
"can never yield FULL_CI_PASS)")
|
|
501
|
+
ci_run.add_argument("--timeout", type=int, default=0,
|
|
502
|
+
help="Per-step timeout in seconds (default 900)")
|
|
503
|
+
|
|
504
|
+
ci_rerun = _ci_common(ci_subs.add_parser(
|
|
505
|
+
"rerun", help="Re-run only the jobs that failed in the last run"))
|
|
506
|
+
ci_rerun.add_argument("--run", dest="run_id", default="", help="Run id (default: latest)")
|
|
507
|
+
ci_rerun.add_argument("--allow-foreign", action="store_true")
|
|
508
|
+
ci_rerun.add_argument("--timeout", type=int, default=0)
|
|
509
|
+
|
|
510
|
+
ci_status = _ci_common(ci_subs.add_parser("status", help="Last run's verdict and jobs"))
|
|
511
|
+
ci_status.add_argument("--run", dest="run_id", default="")
|
|
512
|
+
|
|
513
|
+
ci_fail = _ci_common(ci_subs.add_parser(
|
|
514
|
+
"failures", help="Structured failures from the last run"))
|
|
515
|
+
ci_fail.add_argument("--run", dest="run_id", default="")
|
|
516
|
+
|
|
517
|
+
ci_logs = _ci_common(ci_subs.add_parser("logs", help="Tail one job's log"))
|
|
518
|
+
ci_logs.add_argument("job", nargs="?", default="", help="Job key")
|
|
519
|
+
ci_logs.add_argument("--run", dest="run_id", default="")
|
|
520
|
+
ci_logs.add_argument("--tail", type=int, default=200)
|
|
521
|
+
|
|
522
|
+
_ci_common(ci_subs.add_parser("runs", help="Recent local CI runs"))
|
|
523
|
+
|
|
475
524
|
# ── Override Requests (v2.69.0, docs/override-requests.md) ──────────
|
|
476
525
|
# Human-only approval surface. A grant is single-use, session-bound,
|
|
477
526
|
# path-exact and TTL-capped, and it never edits policy: the rule that
|
|
@@ -337,6 +337,7 @@ _HUB_JS_FILES = [
|
|
|
337
337
|
"hub_ui/components/hub_credentials.js",
|
|
338
338
|
"hub_ui/components/hub_locks.js",
|
|
339
339
|
"hub_ui/components/hub_enforcement.js",
|
|
340
|
+
"hub_ui/components/hub_ci.js",
|
|
340
341
|
"hub_ui/components/drill_subprojects.js",
|
|
341
342
|
"hub_ui/components/drill_health.js",
|
|
342
343
|
"hub_ui/components/drill_tasks.js",
|
|
@@ -1282,6 +1283,134 @@ def api_batch_cancel():
|
|
|
1282
1283
|
return jsonify({"cancelled": True})
|
|
1283
1284
|
|
|
1284
1285
|
|
|
1286
|
+
# ── AgentCI: local CI execution (docs/agent-ci.md) ────────────────────────
|
|
1287
|
+
# A CI run is minutes long, so the POST starts a worker and returns; the UI
|
|
1288
|
+
# polls. One run per project at a time — two concurrent runs would interleave
|
|
1289
|
+
# their writes into the same .c3/ci run index and neither result would be
|
|
1290
|
+
# trustworthy.
|
|
1291
|
+
|
|
1292
|
+
_ci_runs: dict = {} # project path -> in-flight state
|
|
1293
|
+
_ci_lock = threading.Lock()
|
|
1294
|
+
|
|
1295
|
+
|
|
1296
|
+
def _ci_worker(project: str, job: str, allow_foreign: bool, workflow: str) -> None:
|
|
1297
|
+
from services import ci_runner as cr
|
|
1298
|
+
try:
|
|
1299
|
+
result = cr.run_ci(project, selector=job, allow_foreign=allow_foreign,
|
|
1300
|
+
workflow=workflow)
|
|
1301
|
+
payload = {"running": False, "done": True, "error": None,
|
|
1302
|
+
"run_id": result.run_id, "verdict": result.verdict,
|
|
1303
|
+
"note": result.note}
|
|
1304
|
+
except Exception as exc: # a crashed worker must not look idle
|
|
1305
|
+
payload = {"running": False, "done": True, "run_id": "",
|
|
1306
|
+
"error": f"{type(exc).__name__}: {exc}"}
|
|
1307
|
+
with _ci_lock:
|
|
1308
|
+
_ci_runs[project] = payload
|
|
1309
|
+
|
|
1310
|
+
|
|
1311
|
+
@app.route("/api/ci/inspect", methods=["GET"])
|
|
1312
|
+
def api_ci_inspect():
|
|
1313
|
+
"""Workflows, the normalized job DAG, and what is runnable on this host."""
|
|
1314
|
+
from services.ci_workflow import inspect_project
|
|
1315
|
+
path = (request.args.get("path") or "").strip()
|
|
1316
|
+
if not path:
|
|
1317
|
+
return jsonify({"error": "path is required"}), 400
|
|
1318
|
+
try:
|
|
1319
|
+
resolved = _resolve_project_path(path)
|
|
1320
|
+
except ValueError as e:
|
|
1321
|
+
return jsonify({"error": str(e)}), 404
|
|
1322
|
+
try:
|
|
1323
|
+
return jsonify(inspect_project(resolved))
|
|
1324
|
+
except Exception as e:
|
|
1325
|
+
return jsonify({"error": f"{type(e).__name__}: {e}"}), 500
|
|
1326
|
+
|
|
1327
|
+
|
|
1328
|
+
@app.route("/api/ci/runs", methods=["GET"])
|
|
1329
|
+
def api_ci_runs():
|
|
1330
|
+
from services import ci_runner as cr
|
|
1331
|
+
path = (request.args.get("path") or "").strip()
|
|
1332
|
+
if not path:
|
|
1333
|
+
return jsonify({"error": "path is required"}), 400
|
|
1334
|
+
try:
|
|
1335
|
+
resolved = _resolve_project_path(path)
|
|
1336
|
+
except ValueError as e:
|
|
1337
|
+
return jsonify({"error": str(e)}), 404
|
|
1338
|
+
limit = max(1, min(100, int(request.args.get("limit") or 20)))
|
|
1339
|
+
return jsonify({"runs": cr.list_runs(resolved, limit=limit)})
|
|
1340
|
+
|
|
1341
|
+
|
|
1342
|
+
@app.route("/api/ci/run", methods=["GET"])
|
|
1343
|
+
def api_ci_run_detail():
|
|
1344
|
+
from services import ci_runner as cr
|
|
1345
|
+
path = (request.args.get("path") or "").strip()
|
|
1346
|
+
if not path:
|
|
1347
|
+
return jsonify({"error": "path is required"}), 400
|
|
1348
|
+
try:
|
|
1349
|
+
resolved = _resolve_project_path(path)
|
|
1350
|
+
except ValueError as e:
|
|
1351
|
+
return jsonify({"error": str(e)}), 404
|
|
1352
|
+
return jsonify(cr.load_run(resolved, (request.args.get("run_id") or "").strip())
|
|
1353
|
+
or {})
|
|
1354
|
+
|
|
1355
|
+
|
|
1356
|
+
@app.route("/api/ci/logs", methods=["GET"])
|
|
1357
|
+
def api_ci_logs():
|
|
1358
|
+
from services import ci_runner as cr
|
|
1359
|
+
path = (request.args.get("path") or "").strip()
|
|
1360
|
+
run_id = (request.args.get("run_id") or "").strip()
|
|
1361
|
+
job = (request.args.get("job") or "").strip()
|
|
1362
|
+
if not (path and run_id and job):
|
|
1363
|
+
return jsonify({"error": "path, run_id and job are required"}), 400
|
|
1364
|
+
try:
|
|
1365
|
+
resolved = _resolve_project_path(path)
|
|
1366
|
+
except ValueError as e:
|
|
1367
|
+
return jsonify({"error": str(e)}), 404
|
|
1368
|
+
tail = max(1, min(2000, int(request.args.get("tail") or 300)))
|
|
1369
|
+
return jsonify({"log": cr.read_log(resolved, run_id, job, tail=tail)})
|
|
1370
|
+
|
|
1371
|
+
|
|
1372
|
+
@app.route("/api/ci/run", methods=["POST"])
|
|
1373
|
+
def api_ci_run_start():
|
|
1374
|
+
"""Start a local CI run in the background. Poll /api/ci/status."""
|
|
1375
|
+
data = request.get_json(force=True) or {}
|
|
1376
|
+
path = str(data.get("path") or "").strip()
|
|
1377
|
+
if not path:
|
|
1378
|
+
return jsonify({"error": "path is required"}), 400
|
|
1379
|
+
try:
|
|
1380
|
+
resolved = str(_resolve_project_path(path))
|
|
1381
|
+
except ValueError as e:
|
|
1382
|
+
return jsonify({"error": str(e)}), 404
|
|
1383
|
+
|
|
1384
|
+
with _ci_lock:
|
|
1385
|
+
state = _ci_runs.get(resolved) or {}
|
|
1386
|
+
if state.get("running"):
|
|
1387
|
+
return jsonify({"error": "a CI run is already in progress here"}), 409
|
|
1388
|
+
_ci_runs[resolved] = {"running": True, "done": False, "error": None,
|
|
1389
|
+
"run_id": "", "verdict": "", "note": ""}
|
|
1390
|
+
|
|
1391
|
+
threading.Thread(
|
|
1392
|
+
target=_ci_worker,
|
|
1393
|
+
args=(resolved, str(data.get("job") or ""),
|
|
1394
|
+
bool(data.get("allow_foreign")), str(data.get("workflow") or "")),
|
|
1395
|
+
daemon=True,
|
|
1396
|
+
).start()
|
|
1397
|
+
return jsonify({"started": True})
|
|
1398
|
+
|
|
1399
|
+
|
|
1400
|
+
@app.route("/api/ci/status", methods=["GET"])
|
|
1401
|
+
def api_ci_status():
|
|
1402
|
+
path = (request.args.get("path") or "").strip()
|
|
1403
|
+
if not path:
|
|
1404
|
+
return jsonify({"error": "path is required"}), 400
|
|
1405
|
+
try:
|
|
1406
|
+
resolved = str(_resolve_project_path(path))
|
|
1407
|
+
except ValueError as e:
|
|
1408
|
+
return jsonify({"error": str(e)}), 404
|
|
1409
|
+
with _ci_lock:
|
|
1410
|
+
return jsonify(dict(_ci_runs.get(resolved)
|
|
1411
|
+
or {"running": False, "done": False}))
|
|
1412
|
+
|
|
1413
|
+
|
|
1285
1414
|
# ── Sub-projects: linked child .c3 branches (v2.44.0) ─────────────────────
|
|
1286
1415
|
|
|
1287
1416
|
def _sub_manager(parent: str):
|
|
@@ -17,7 +17,7 @@ function App() {
|
|
|
17
17
|
const [version, setVersion] = useState('');
|
|
18
18
|
const [projects, setProjects] = useState([]);
|
|
19
19
|
const [loaded, setLoaded] = useState(false);
|
|
20
|
-
const [mainView, setMainView] = useState('projects'); // projects | board | creds | locks
|
|
20
|
+
const [mainView, setMainView] = useState('projects'); // projects | board | ci | creds | locks | enforce
|
|
21
21
|
const [filter, setFilter] = useState('all'); // all | active | idle | tag:<x>
|
|
22
22
|
const [search, setSearch] = useState('');
|
|
23
23
|
const [view, setView] = useState('list'); // list | grid
|
|
@@ -44,7 +44,7 @@ function App() {
|
|
|
44
44
|
if (cfg.projects_view === 'grid') setView('grid');
|
|
45
45
|
if (cfg.sidebar_collapsed != null) setSidebarCollapsed(!!cfg.sidebar_collapsed);
|
|
46
46
|
if (cfg.sidebar_group) setFilter(cfg.sidebar_group);
|
|
47
|
-
if (['board', 'creds', 'locks', 'enforce'].includes(cfg.main_view)) setMainView(cfg.main_view);
|
|
47
|
+
if (['board', 'ci', 'creds', 'locks', 'enforce'].includes(cfg.main_view)) setMainView(cfg.main_view);
|
|
48
48
|
} catch { }
|
|
49
49
|
try { const v = await api.get('/api/version'); setVersion(v.c3_version || ''); } catch { }
|
|
50
50
|
}, []);
|
|
@@ -112,6 +112,8 @@ function App() {
|
|
|
112
112
|
}}>
|
|
113
113
|
{mainView === 'board' ? (
|
|
114
114
|
<TaskBoard projects={projects} onOpenDrill={openDrill} />
|
|
115
|
+
) : mainView === 'ci' ? (
|
|
116
|
+
<HubCI projects={projects} onOpenDrill={openDrill} />
|
|
115
117
|
) : mainView === 'creds' ? (
|
|
116
118
|
<HubCredentials projects={projects} onOpenDrill={openDrill} />
|
|
117
119
|
) : mainView === 'locks' ? (
|