code-context-control 2.149.1__tar.gz → 2.152.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.149.1 → code_context_control-2.152.0}/PKG-INFO +1 -1
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/c3.py +1 -1
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/guide/tools.html +1 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/mcp_server.py +7 -4
- code_context_control-2.152.0/cli/tools/_edit_report.py +186 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/edit.py +196 -118
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/edit_verify.py +7 -4
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/edits.py +112 -2
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/read.py +2 -1
- {code_context_control-2.149.1 → code_context_control-2.152.0}/code_context_control.egg-info/PKG-INFO +1 -1
- {code_context_control-2.149.1 → code_context_control-2.152.0}/code_context_control.egg-info/SOURCES.txt +7 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/pyproject.toml +1 -1
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/access_guard.py +1 -1
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/atomic_json.py +25 -8
- code_context_control-2.152.0/services/edit_blobs.py +192 -0
- code_context_control-2.152.0/services/read_stamps.py +287 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_access_guard_meta.py +1 -0
- code_context_control-2.152.0/tests/test_edit_eol_atomic.py +223 -0
- code_context_control-2.152.0/tests/test_edit_report.py +142 -0
- code_context_control-2.152.0/tests/test_edit_revert.py +204 -0
- code_context_control-2.152.0/tests/test_edit_stale.py +214 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/LICENSE +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/README.md +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/__init__.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/_hook_utils.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/_shell_writes.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/commands/__init__.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/commands/common.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/commands/parser.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/docs.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/edits.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/guide/access.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/guide/bitbucket.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/guide/ci.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/guide/credentials.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/guide/delegate.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/guide/getting-started.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/guide/index.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/guide/jira.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/guide/masking.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/guide/oracle.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/guide/sessions.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/guide/shared.css +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/guide/workflow.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_access_guard.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_agent_model.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_artifact.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_auto_snapshot.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_c3_signal.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_c3read.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_codex_lifecycle.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_dispatch.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_edit_ledger.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_edit_unlock.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_filter.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_ghost_files.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_pretool_enforce.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_prompt_recall.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_read.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_session_end.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_session_open.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_session_stats.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hook_terse_advisor.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_server.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/app.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/add_project.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/config_editor.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/drill_artifacts.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/drill_health.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/drill_panel.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/drill_subprojects.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/drill_tasks.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/drill_views.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/global_search.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/hub_access.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/hub_ci.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/hub_cred_audit.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/hub_credentials.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/hub_enforcement.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/hub_locks.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/hub_sessions.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/hub_tokens.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/mcp_manager.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/modals.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/project_card.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/project_tree.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/session_drawer.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/settings_modal.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/sidebar.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/summary_bar.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/task_board.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/toasts.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/components/topbar.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui/state.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/hub_ui.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/mcp_proxy.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/progress.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/server.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/__init__.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/_grants.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/_helpers.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/agent.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/artifacts.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/bitbucket.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/ci.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/compress.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/credentials.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/delegate.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/federate.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/filter.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/impact.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/jira.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/locks.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/memory.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/override.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/project.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/search.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/session.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/shell.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/shell_job.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/shell_nudge.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/shell_parsers.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/shell_render.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/status.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/tasks.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/tools/validate.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/api.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/app.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/components/access.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/components/bitbucket.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/components/chat.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/components/credentials.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/components/dashboard.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/components/edits.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/components/enforcement.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/components/instructions.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/components/jira.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/components/memory.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/components/sessions.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/components/settings.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/components/sidebar.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/components/tasks.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/icons.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/pm_shared.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/shared.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui/theme.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui_legacy.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/cli/ui_nano.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/code_context_control.egg-info/dependency_links.txt +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/code_context_control.egg-info/entry_points.txt +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/code_context_control.egg-info/requires.txt +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/code_context_control.egg-info/top_level.txt +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/core/__init__.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/core/codex_patch.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/core/config.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/core/grok_payload.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/core/hook_command.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/core/host.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/core/ide.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/core/mcp_toml.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/core/web_security.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/__init__.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/config.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/listeners.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/mcp_oracle.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/oracle_server.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/oracle_ui.html +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/__init__.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/activity_reporter.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/api_auth.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/c3_bridge.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/chat_engine.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/chat_poll.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/chat_store.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/client_tokens.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/cross_memory.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/discovery_audit.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/federated_graph.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/health_checker.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/insight_engine.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/local_session.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/memory_reader.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/memory_writer.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/mobile_api.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/project_scanner.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/review_agent.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/tool_executor.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/services/tool_registry.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/activity.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/agents.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/app.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/busy.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/chat/conversations.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/chat/input.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/chat/markdown.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/chat/send.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/chat/stream_renderer.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/chat/toolbar.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/core.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/crossgraph.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/header.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/insights.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/projects.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/qrcode.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/settings.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/suggestions.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/oracle/ui/theme_tabs.js +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/__init__.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/access_telemetry.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/activity_log.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/agent_base.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/agent_downshift.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/agent_locks.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/agents.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/agents_workflow.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/artifact_defs.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/artifact_store.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/auto_memory.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/background_service.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/bench/__init__.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/bench/delegate_eval.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/bench/delegate_write_eval.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/bench/external/__init__.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/bench/external/aider_polyglot.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/bench/external/swe_bench.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/bench/map_eval.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/bench/search_eval.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/bench/shell_eval.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/benchmark_dashboard.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/bitbucket_client.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/bitbucket_credentials.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/builtin_leases.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/ci_act.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/ci_cache.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/ci_expr.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/ci_failures.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/ci_github.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/ci_impact.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/ci_intel.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/ci_runner.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/ci_workflow.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/circuit_breaker.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/claude_md.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/codex_integration.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/codex_transcript.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/compressor.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/context_snapshot.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/conversation_store.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/cred_audit.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/cred_telemetry.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/credential_backup.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/credential_store.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/delegate_agents.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/delegate_hints.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/delegate_write.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/dir_map.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/doc_index.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/e2e_benchmark.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/e2e_evaluator.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/e2e_tasks.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/edit_ledger.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/embedding_index.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/enforcement_policy.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/error_reporting.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/file_map.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/file_memory.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/git_context.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/grok_integration.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/grok_transcript.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/host_sessions.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/hub_service.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/index_store.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/indexer.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/jira_client.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/jira_cloud.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/jira_credentials.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/jira_data_center.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/jira_links.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/lexical_index.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/mask_activation.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/mask_mirror.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/mask_presets.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/memory.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/memory_consolidator.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/memory_distiller.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/memory_graph.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/memory_grounder.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/memory_queue.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/memory_scorer.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/metrics.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/notifications.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/ollama_bridge.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/ollama_client.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/ollama_credentials.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/oracle_service.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/output_filter.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/override_costs.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/override_grants.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/override_policy.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/override_requests.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/override_wake.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/parser.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/project_manager.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/project_runtime.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/protocol.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/proxy_state.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/repo_map.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/repo_shape.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/reranker.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/retention.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/retrieval.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/retrieval_broker.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/router.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/runtime.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/scanner.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/session_benchmark.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/session_catalog.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/session_live.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/session_manager.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/session_preloader.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/shell_jobs.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/shell_output.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/subprojects.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/task_store.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/telemetry.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/terminal_launch.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/text_index.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/time_tracker.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/tool_classifier.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/transcript_index.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/validation_cache.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/vector_store.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/watcher.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/services/win_subprocess.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/setup.cfg +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_access_builtin_optout.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_access_guard.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_access_guard_shell_project.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_access_guard_surfaces.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_access_guard_wiring.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_activity_log_find_last.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_activity_reporter.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_agent_locks.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_aider_polyglot.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_antigravity_transition.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_artifact_store.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_artifact_tool.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_atomic_json.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_background_service.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_bitbucket_cli_smoke.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_bitbucket_client.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_bitbucket_config_fallback.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_bitbucket_credentials.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_bitbucket_tool.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_builtin_leases.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_builtin_modes.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_c3_bridge_project_artifacts.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_c3_shell.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_chat_poll.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_ci_act.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_ci_cache.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_ci_dag_ownership.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_ci_expr.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_ci_impact.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_ci_intel.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_ci_runner.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_ci_workflow.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_circuit_breaker.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_claude_md_merge.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_claude_md_updater.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_cli_smoke.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_codex_mcp_transport.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_codex_native.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_compressor_large_file.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_confirm_guard.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_confirm_guard_wiring.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_cooccurrence_bounds.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_cred_audit.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_cred_telemetry.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_credential_backup.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_credential_login_kind.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_credential_store.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_credential_ui_parity.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_credentials_routes.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_credentials_tool.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_creds_cli_smoke.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_delegate_adoption_d4.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_delegate_auto.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_delegate_cascade.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_delegate_claude_d1.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_delegate_eval.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_delegate_grok.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_delegate_host_d2.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_delegate_scout_d3.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_delegate_telemetry_d0.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_delegate_thinking_cap.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_delegate_tuning.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_delegate_version_probe.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_delegate_write.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_delegate_write_eval.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_dir_map_c3.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_e2e_benchmark.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_edit_ledger_deadline.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_edit_ledger_hook.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_edit_locking.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_edit_normalization.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_edit_verify.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_embedding_index_corrupt_store.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_embedding_index_deadlock.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_enforcement_flip.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_enforcement_policy.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_enforcement_routes.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_env_parser.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_failed_calls_do_not_unlock.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_federated_graph.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_file_map_c1.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_filter_backoff.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_ghost_files.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_ghost_generation.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_git_branch_awareness.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_grok_native.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hook_access_guard.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hook_codex_compat.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hook_dispatch.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hook_grok_compat.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hook_pretool_enforce.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hook_prompt_recall.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hook_session_end.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hook_smoke.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hook_state.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hook_utf8_stdio.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hub_access_routes.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hub_builtin_routes.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hub_credentials_route.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hub_credentials_routes_write.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hub_enforcement_routes.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hub_hook_migration.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hub_ide_cmd.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hub_inspect_api.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hub_locks_routes.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hub_oracle_service_routes.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hub_override_policy_routes.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hub_override_routes.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hub_rules_routes.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hub_server_smoke.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hub_sessions_routes.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_hub_subproject_links.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_ide_workflow_adaptation.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_index_cap_not_hardcoded.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_init_clear_preserves_user_content.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_init_scan.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_install_mcp_entrypoint.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_jira_cli_smoke.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_jira_client.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_jira_config_fallback.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_jira_credentials.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_jira_links.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_jira_routes.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_jira_tool.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_large_files_c4.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_lazy_store_init.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_map_eval.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_map_telemetry_c0.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_mask_guard.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_mask_routes.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_mask_surfaces.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_mcp_host_guard.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_mcp_memory_timeout.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_mcp_server_smoke.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_mcp_toml.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_memory_distiller.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_memory_graph_api.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_memory_queue.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_memory_system.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_mobile_api.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_mobile_clients.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_mobile_extras.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_mobile_jobs_ci.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_mobile_override_costs.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_mobile_override_routes.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_mobile_security_api.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_no_stale_model_pins.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_notification_dedup.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_notification_discipline.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_notification_kinds.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_ollama_credentials.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_oracle_api_auth.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_oracle_apikey_api.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_oracle_c3_bridge.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_oracle_chat_engine.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_oracle_chat_store.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_oracle_discovery_api.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_oracle_discovery_audit.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_oracle_health_probe.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_oracle_local_auth.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_oracle_loopback.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_oracle_ollama_bridge.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_oracle_scanner_cache.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_oracle_security_fixes.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_oracle_session_bootstrap.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_oracle_subproject_awareness.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_oracle_ui_bundle.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_output_filter.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_override_costs.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_override_grants.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_override_grants_mcp.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_override_requests.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_override_wake.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_permissions.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_pm_api.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_project_manager.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_project_manager_merge.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_project_tool.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_read_coercion.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_read_edit_parity.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_read_outside_root.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_related_facts.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_repo_map.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_repo_shape.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_response_boilerplate.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_retention.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_review_digest.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_search_eval.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_search_p1.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_search_p2.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_search_p2b.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_search_p3.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_search_p4.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_search_p5.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_service_durability.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_session_benchmark.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_session_budget.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_session_catalog.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_session_live.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_session_tool.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_shell_budget_s1.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_shell_creds.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_shell_eval.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_shell_jobs_s3.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_shell_nudge_s4.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_shell_output.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_shell_parsers_s2.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_shell_robustness.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_shell_telemetry_s0.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_shell_write_ledger.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_shell_writes.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_subproject_clear_scope.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_subproject_depth_consumers.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_subproject_exclusion.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_subproject_federation.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_subproject_linkage_api.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_subprojects.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_swe_bench.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_task_store.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_task_tool.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_time_tracker.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_token_telemetry.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_token_tracking.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_tool_registry.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_ui_jsx_syntax.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_upgrade_and_version.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_validate.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_vault_write_guard.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_version_sync.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_watcher_pruning.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_web_security.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tests/test_windows_reliability.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tui/__init__.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tui/backend.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tui/main.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tui/screens/__init__.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tui/screens/benchmark_view.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tui/screens/claudemd_view.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tui/screens/compress_view.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tui/screens/index_view.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tui/screens/init_view.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tui/screens/mcp_view.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tui/screens/optimize_view.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tui/screens/pipe_view.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tui/screens/projects_view.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tui/screens/search_view.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tui/screens/session_view.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tui/screens/stats.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tui/screens/ui_view.py +0 -0
- {code_context_control-2.149.1 → code_context_control-2.152.0}/tui/theme.tcss +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-context-control
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.152.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
|
|
@@ -91,7 +91,7 @@ console = Console() if HAS_RICH else None
|
|
|
91
91
|
# Config
|
|
92
92
|
CONFIG_DIR = ".c3"
|
|
93
93
|
CONFIG_FILE = ".c3/config.json"
|
|
94
|
-
__version__ = "2.
|
|
94
|
+
__version__ = "2.152.0"
|
|
95
95
|
|
|
96
96
|
# The PreToolUse matcher for native subagent calls (installer and hub migration).
|
|
97
97
|
AGENT_MATCHER = "Agent|Task"
|
|
@@ -1507,6 +1507,7 @@ c3_agent(workflow=<span class="str">'investigate'</span>, context=<span class="s
|
|
|
1507
1507
|
<tr><td class="param-name">stats</td><td class="param-desc">Aggregate stats: most-edited files, change frequency</td></tr>
|
|
1508
1508
|
<tr><td class="param-name">tag</td><td class="param-desc">Tag an edit entry with a label</td></tr>
|
|
1509
1509
|
<tr><td class="param-name">verify</td><td class="param-desc"><strong>v2.75.0</strong> — did an edit land? Pass the SAME <code>file</code>/<code>old_string</code>/<code>new_string</code> (or <code>edits</code>) a failed or timed-out <code>c3_edit</code> call took. Answers APPLIED (do not retry) / NOT_APPLIED (safe to retry) / INCONCLUSIVE (read the file)</td></tr>
|
|
1510
|
+
<tr><td class="param-name">revert</td><td class="param-desc">Put a file back to the bytes it had before <code>edit_id</code>, from the pre-image <code>c3_edit</code> stored in <code>.c3/edit_blobs/</code>. Refuses if the file changed since (lists the later edit ids to revert first) or if no pre-image was kept (native Edit/shell rows, files over 5 MB, read-denied or masked paths, evicted blobs). Logs its own <code>reverted</code> row, which can itself be reverted.</td></tr>
|
|
1510
1511
|
</tbody>
|
|
1511
1512
|
</table>
|
|
1512
1513
|
|
|
@@ -903,11 +903,11 @@ async def c3_agent(workflow: str, scope: str = "", context: str = "",
|
|
|
903
903
|
@mcp.tool()
|
|
904
904
|
async def c3_edit(file_path: str, old_string: str = "", new_string: str = "",
|
|
905
905
|
summary: str = "", tags: str = "", replace_all: bool = False,
|
|
906
|
-
edits: str = "",
|
|
906
|
+
edits: str | list[dict] = "",
|
|
907
907
|
ctx: Context = None) -> str:
|
|
908
908
|
"""EDIT — read+patch+write+log in one step. Primary code-change tool; always prefer over native Edit.
|
|
909
909
|
old_string: text to replace. new_string: replacement. summary: ledger description.
|
|
910
|
-
edits: JSON
|
|
910
|
+
edits: list (or JSON string) of {old_string, new_string, summary?} for multi-hunk batch on one file.
|
|
911
911
|
Parallel across files. Create new file: non-existent file_path + old_string='' + new_string=<content>.
|
|
912
912
|
If this call ERRORS OR TIMES OUT, do not retry blind — a failed c3_edit may still have
|
|
913
913
|
written the file. Re-send the same args to c3_edits(action='verify') for a verdict."""
|
|
@@ -930,10 +930,13 @@ async def c3_edits(action: str, file: str = "", change_type: str = "modified",
|
|
|
930
930
|
summary: str = "", lines_changed: str = "", tags: str = "",
|
|
931
931
|
limit: int = 50, since: str = "", edit_id: str = "",
|
|
932
932
|
tag: str = "", branch: str = "", old_string: str = "",
|
|
933
|
-
new_string: str = "", edits: str = "",
|
|
933
|
+
new_string: str = "", edits: str | list[dict] = "",
|
|
934
|
+
ctx: Context = None) -> str:
|
|
934
935
|
"""EDIT HISTORY — inspect the ledger. Different from c3_edit (which writes); this one reads.
|
|
935
936
|
actions: log (append entry), history (recent edits), versions (per-file), stats, tag (mark edit_id),
|
|
936
|
-
verify (did an edit land?).
|
|
937
|
+
verify (did an edit land?), revert (edit_id: put the file back to that c3_edit's pre-image).
|
|
938
|
+
revert refuses when the file changed since that edit (revert the later edit_ids it lists first)
|
|
939
|
+
or when no pre-image was kept (native Edit/shell rows, big or read-denied files, evicted).
|
|
937
940
|
branch: filter history to edits stamped with a given git branch.
|
|
938
941
|
verify: pass the SAME file/old_string/new_string (or edits) you gave the c3_edit that errored or
|
|
939
942
|
timed out. Answers APPLIED (do not retry) / NOT_APPLIED (safe to retry) / INCONCLUSIVE (read the
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"""What c3_edit says about an edit besides the ✓ line: where it landed, what changed.
|
|
2
|
+
|
|
3
|
+
Two concerns, both read-only:
|
|
4
|
+
- ``locate``: a RELATIVE file_path resolves against the project root, which is
|
|
5
|
+
the main checkout. When the repo has other git worktrees, the caller may have
|
|
6
|
+
meant one of them, so the response names the resolved path and any worktree
|
|
7
|
+
holding the same relative path, and refuses outright when the path exists only
|
|
8
|
+
in a worktree.
|
|
9
|
+
- ``diff_block``: a compact unified diff of the whole file, before → after.
|
|
10
|
+
"""
|
|
11
|
+
import difflib
|
|
12
|
+
import json
|
|
13
|
+
import subprocess
|
|
14
|
+
import sys
|
|
15
|
+
import threading
|
|
16
|
+
import time
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
|
|
19
|
+
_WORKTREE_TTL_S = 60.0
|
|
20
|
+
_GIT_TIMEOUT_S = 3.0
|
|
21
|
+
_worktree_cache: dict[str, tuple[float, list[Path]]] = {}
|
|
22
|
+
_cache_lock = threading.Lock()
|
|
23
|
+
|
|
24
|
+
DIFF_MAX_LINES = 24
|
|
25
|
+
DIFF_MAX_CHARS = 1500
|
|
26
|
+
_LINE_MAX_CHARS = 200
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _git_worktree_roots(cwd: Path) -> list[Path]:
|
|
30
|
+
"""Every non-bare worktree root of the repo containing ``cwd``, main first.
|
|
31
|
+
|
|
32
|
+
Returns [] when git is missing, times out, or ``cwd`` is not in a repo.
|
|
33
|
+
"""
|
|
34
|
+
kwargs = {}
|
|
35
|
+
if sys.platform == "win32":
|
|
36
|
+
kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW
|
|
37
|
+
try:
|
|
38
|
+
proc = subprocess.Popen(
|
|
39
|
+
["git", "worktree", "list", "--porcelain"], cwd=str(cwd),
|
|
40
|
+
stdout=subprocess.PIPE, stderr=subprocess.DEVNULL,
|
|
41
|
+
stdin=subprocess.DEVNULL, text=True, encoding="utf-8",
|
|
42
|
+
errors="replace", **kwargs)
|
|
43
|
+
except OSError:
|
|
44
|
+
return []
|
|
45
|
+
try:
|
|
46
|
+
out, _ = proc.communicate(timeout=_GIT_TIMEOUT_S)
|
|
47
|
+
except subprocess.TimeoutExpired:
|
|
48
|
+
if sys.platform == "win32":
|
|
49
|
+
subprocess.run(["taskkill", "/F", "/T", "/PID", str(proc.pid)],
|
|
50
|
+
capture_output=True, stdin=subprocess.DEVNULL, **kwargs)
|
|
51
|
+
else:
|
|
52
|
+
proc.kill()
|
|
53
|
+
proc.communicate()
|
|
54
|
+
return []
|
|
55
|
+
if proc.returncode != 0:
|
|
56
|
+
return []
|
|
57
|
+
roots, current, bare = [], None, False
|
|
58
|
+
for line in (out or "").splitlines() + [""]:
|
|
59
|
+
if line.startswith("worktree "):
|
|
60
|
+
current, bare = line[len("worktree "):].strip(), False
|
|
61
|
+
elif line == "bare":
|
|
62
|
+
bare = True
|
|
63
|
+
elif not line and current:
|
|
64
|
+
if not bare:
|
|
65
|
+
roots.append(Path(current).resolve())
|
|
66
|
+
current = None
|
|
67
|
+
return roots
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def worktree_roots(project_path: str) -> list[Path]:
|
|
71
|
+
"""Cached ``_git_worktree_roots`` for a project, refreshed every 60s."""
|
|
72
|
+
key = str(Path(project_path).resolve())
|
|
73
|
+
now = time.monotonic()
|
|
74
|
+
with _cache_lock:
|
|
75
|
+
hit = _worktree_cache.get(key)
|
|
76
|
+
if hit and now - hit[0] < _WORKTREE_TTL_S:
|
|
77
|
+
return hit[1]
|
|
78
|
+
roots = _git_worktree_roots(Path(key))
|
|
79
|
+
with _cache_lock:
|
|
80
|
+
_worktree_cache[key] = (now, roots)
|
|
81
|
+
return roots
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _other_trees(project_root: Path, roots: list[Path]) -> list[tuple[Path, Path]]:
|
|
85
|
+
"""(worktree root, project dir inside it) for every worktree but our own.
|
|
86
|
+
|
|
87
|
+
A project that is a subdirectory of its repo maps to the same subdirectory
|
|
88
|
+
in each worktree.
|
|
89
|
+
"""
|
|
90
|
+
own = None
|
|
91
|
+
for root in roots:
|
|
92
|
+
if (project_root == root or root in project_root.parents) and (
|
|
93
|
+
own is None or len(root.parts) > len(own.parts)):
|
|
94
|
+
own = root
|
|
95
|
+
if own is None:
|
|
96
|
+
return []
|
|
97
|
+
prefix = project_root.relative_to(own)
|
|
98
|
+
return [(root, root / prefix) for root in roots if root != own]
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def locate(file_path: str, path: Path, project_path: str) -> tuple[str, str]:
|
|
102
|
+
"""Check a resolved edit target against the repo's other worktrees.
|
|
103
|
+
|
|
104
|
+
Returns ``(refusal, note)``, at most one non-empty. ``refusal`` is set when a
|
|
105
|
+
relative ``file_path`` does not exist in this checkout but does in another
|
|
106
|
+
worktree. ``note`` is extra response text for a relative path in a repo
|
|
107
|
+
with other worktrees. Absolute paths always return ``("", "")``.
|
|
108
|
+
"""
|
|
109
|
+
if Path(file_path).is_absolute():
|
|
110
|
+
return "", ""
|
|
111
|
+
project_root = Path(project_path).resolve()
|
|
112
|
+
others = _other_trees(project_root, worktree_roots(project_path))
|
|
113
|
+
if not others:
|
|
114
|
+
return "", ""
|
|
115
|
+
try:
|
|
116
|
+
rel = path.relative_to(project_root)
|
|
117
|
+
except ValueError:
|
|
118
|
+
return "", ""
|
|
119
|
+
hits = [proj / rel for _, proj in others if (proj / rel).exists()]
|
|
120
|
+
if not path.exists() and hits:
|
|
121
|
+
listed = "\n".join(f" {h}" for h in hits)
|
|
122
|
+
return (f"[c3_edit:wrong-tree] {file_path} does not exist in this checkout "
|
|
123
|
+
f"({project_root}) but does in another git worktree:\n{listed}\n"
|
|
124
|
+
f" Nothing was written. Pass the absolute path of the copy you mean; "
|
|
125
|
+
f"to create a new file here, pass its absolute path in this checkout."), ""
|
|
126
|
+
if not path.exists():
|
|
127
|
+
return "", (f"\n ⚠ created in the MAIN checkout: {path} — this repo has "
|
|
128
|
+
f"{len(others)} other worktree(s). If you meant one of them, "
|
|
129
|
+
f"delete this file and pass an absolute path.")
|
|
130
|
+
note = f"\n → {path}"
|
|
131
|
+
if hits:
|
|
132
|
+
note += (f"\n ⚠ relative path edited this checkout; the same path also exists "
|
|
133
|
+
f"in: {', '.join(str(h) for h in hits)}. Pass an absolute path to "
|
|
134
|
+
f"edit a worktree.")
|
|
135
|
+
return "", note
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def show_diff(project_path: str) -> bool:
|
|
139
|
+
"""``.c3/config.json`` key ``edit.show_diff``; true unless set to false."""
|
|
140
|
+
cfg = Path(project_path) / ".c3" / "config.json"
|
|
141
|
+
if not cfg.is_file():
|
|
142
|
+
return True
|
|
143
|
+
try:
|
|
144
|
+
section = (json.loads(cfg.read_text(encoding="utf-8")) or {}).get("edit")
|
|
145
|
+
except (OSError, ValueError, AttributeError):
|
|
146
|
+
return True
|
|
147
|
+
if isinstance(section, dict) and isinstance(section.get("show_diff"), bool):
|
|
148
|
+
return section["show_diff"]
|
|
149
|
+
return True
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _lines(text: str) -> list[str]:
|
|
153
|
+
lines = text.split("\n")
|
|
154
|
+
if lines[-1] == "":
|
|
155
|
+
lines.pop()
|
|
156
|
+
return [ln[:-1] if ln.endswith("\r") else ln for ln in lines]
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _clip(line: str) -> str:
|
|
160
|
+
return line if len(line) <= _LINE_MAX_CHARS else line[:_LINE_MAX_CHARS] + "…"
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def diff_block(before: str, after: str, project_path: str) -> str:
|
|
164
|
+
"""Response text for a whole-file before → after diff, or "" when disabled/unchanged.
|
|
165
|
+
|
|
166
|
+
Unified diff, 2 context lines, ``@@`` hunk headers with real line numbers,
|
|
167
|
+
no file headers, EOL-stripped lines, capped at DIFF_MAX_LINES lines and
|
|
168
|
+
DIFF_MAX_CHARS characters with a trailing count of what was cut.
|
|
169
|
+
"""
|
|
170
|
+
if not show_diff(project_path):
|
|
171
|
+
return ""
|
|
172
|
+
body = list(difflib.unified_diff(_lines(before), _lines(after), n=2,
|
|
173
|
+
lineterm=""))[2:]
|
|
174
|
+
if not body:
|
|
175
|
+
return ""
|
|
176
|
+
shown, used = [], 0
|
|
177
|
+
for line in body:
|
|
178
|
+
line = _clip(line)
|
|
179
|
+
if len(shown) >= DIFF_MAX_LINES or used + len(line) + 3 > DIFF_MAX_CHARS:
|
|
180
|
+
break
|
|
181
|
+
shown.append(" " + line)
|
|
182
|
+
used += len(line) + 3
|
|
183
|
+
out = "\n" + "\n".join(shown)
|
|
184
|
+
if len(shown) < len(body):
|
|
185
|
+
out += f"\n … {len(body) - len(shown)} more diff lines"
|
|
186
|
+
return out
|