code-context-control 2.40.0__tar.gz → 2.41.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.40.0 → code_context_control-2.41.0}/PKG-INFO +1 -1
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/c3.py +1 -1
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/shell.py +71 -1
- {code_context_control-2.40.0 → code_context_control-2.41.0}/code_context_control.egg-info/PKG-INFO +1 -1
- {code_context_control-2.40.0 → code_context_control-2.41.0}/pyproject.toml +1 -1
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_c3_shell.py +75 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/LICENSE +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/README.md +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/__init__.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/_hook_utils.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/commands/__init__.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/commands/common.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/commands/parser.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/docs.html +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/edits.html +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/guide/bitbucket.html +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/guide/getting-started.html +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/guide/index.html +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/guide/oracle.html +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/guide/shared.css +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/guide/tools.html +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/guide/workflow.html +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_auto_snapshot.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_c3_signal.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_c3read.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_edit_ledger.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_edit_unlock.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_filter.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_ghost_files.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_pretool_enforce.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_read.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_session_stats.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hook_terse_advisor.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hub.html +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/hub_server.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/mcp_proxy.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/mcp_server.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/server.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/__init__.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/_helpers.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/agent.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/bitbucket.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/compress.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/delegate.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/edit.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/edits.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/filter.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/impact.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/memory.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/project.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/read.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/search.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/session.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/status.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/tools/validate.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/api.js +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/app.js +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/bitbucket.js +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/chat.js +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/dashboard.js +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/edits.js +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/instructions.js +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/memory.js +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/sessions.js +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/settings.js +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/sidebar.js +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/icons.js +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/shared.js +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/theme.js +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui.html +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui_legacy.html +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui_nano.html +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/code_context_control.egg-info/SOURCES.txt +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/code_context_control.egg-info/dependency_links.txt +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/code_context_control.egg-info/entry_points.txt +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/code_context_control.egg-info/requires.txt +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/code_context_control.egg-info/top_level.txt +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/core/__init__.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/core/config.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/core/ide.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/core/mcp_toml.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/core/web_security.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/__init__.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/config.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/mcp_oracle.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/oracle.html +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/oracle_server.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/__init__.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/activity_reporter.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/api_auth.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/c3_bridge.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/chat_engine.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/chat_store.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/cross_memory.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/federated_graph.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/health_checker.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/insight_engine.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/memory_reader.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/memory_writer.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/ollama_bridge.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/project_scanner.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/review_agent.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/tool_executor.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/tool_registry.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/__init__.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/activity_log.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/agent_base.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/agents.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/auto_memory.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/bench/__init__.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/bench/external/__init__.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/bench/external/aider_polyglot.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/bench/external/swe_bench.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/benchmark_dashboard.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/bitbucket_client.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/bitbucket_credentials.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/circuit_breaker.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/claude_md.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/compressor.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/context_snapshot.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/conversation_store.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/doc_index.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/e2e_benchmark.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/e2e_evaluator.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/e2e_tasks.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/edit_ledger.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/embedding_index.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/error_reporting.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/file_memory.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/git_context.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/hub_service.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/indexer.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/memory.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/memory_consolidator.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/memory_graph.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/memory_grounder.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/memory_scorer.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/metrics.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/notifications.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/ollama_client.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/output_filter.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/parser.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/project_manager.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/project_runtime.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/protocol.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/proxy_state.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/retrieval_broker.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/router.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/runtime.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/session_benchmark.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/session_manager.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/session_preloader.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/text_index.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/tool_classifier.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/transcript_index.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/validation_cache.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/vector_store.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/version_tracker.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/services/watcher.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/setup.cfg +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_activity_reporter.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_aider_polyglot.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_bitbucket_cli_smoke.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_bitbucket_client.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_bitbucket_config_fallback.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_bitbucket_credentials.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_bitbucket_tool.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_circuit_breaker.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_claude_md_merge.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_cli_smoke.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_e2e_benchmark.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_edit_ledger_hook.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_edit_normalization.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_enforcement_flip.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_federated_graph.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_ghost_files.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_git_branch_awareness.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_hub_server_smoke.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_install_mcp_entrypoint.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_lazy_store_init.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_mcp_host_guard.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_mcp_server_smoke.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_mcp_toml.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_memory_graph_api.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_memory_system.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_notification_discipline.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_oracle_api_auth.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_oracle_apikey_api.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_oracle_discovery_api.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_oracle_security_fixes.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_output_filter.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_permissions.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_project_manager.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_project_manager_merge.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_project_tool.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_read_coercion.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_service_durability.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_session_benchmark.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_session_budget.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_shell_robustness.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_swe_bench.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_tool_registry.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_upgrade_and_version.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_validate.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_web_security.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_windows_reliability.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/__init__.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/backend.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/main.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/__init__.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/benchmark_view.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/claudemd_view.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/compress_view.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/index_view.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/init_view.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/mcp_view.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/optimize_view.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/pipe_view.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/projects_view.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/search_view.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/session_view.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/stats.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.0}/tui/screens/ui_view.py +0 -0
- {code_context_control-2.40.0 → code_context_control-2.41.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.41.0
|
|
4
4
|
Summary: Local code-intelligence layer for AI coding tools (Claude Code, Codex, Gemini, Copilot). Retrieve less, read less, edit safer.
|
|
5
5
|
Author-email: Dimitri Tselenchuk <dtselenc@gmail.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -4,12 +4,21 @@ Wraps subprocess.Popen with the Windows-safe pattern from
|
|
|
4
4
|
services/edit_ledger.py::_git_combined (Popen + taskkill /F /T + stdin=DEVNULL).
|
|
5
5
|
Auto-filters long stdout via handle_filter, auto-logs git mutations
|
|
6
6
|
to the edit ledger, and accounts stdout tokens against session budget.
|
|
7
|
+
|
|
8
|
+
Shell selection: on Windows, commands are run through Git Bash (bash.exe) when
|
|
9
|
+
it is available, so c3_shell speaks the same POSIX dialect as the native Bash
|
|
10
|
+
tool (forward-slash paths, single quotes, `$VAR`, ls/grep/cat, heredocs). This
|
|
11
|
+
avoids the cmd.exe/POSIX mismatch that forced callers to fall back to native
|
|
12
|
+
Bash for bash-flavored commands. Set C3_SHELL_BASH=0 to force cmd.exe, or point
|
|
13
|
+
C3_SHELL_BASH at a specific bash.exe to override discovery. POSIX platforms are
|
|
14
|
+
unchanged (shell=True → /bin/sh).
|
|
7
15
|
"""
|
|
8
16
|
from __future__ import annotations
|
|
9
17
|
|
|
10
18
|
import asyncio
|
|
11
19
|
import os
|
|
12
20
|
import re
|
|
21
|
+
import shutil
|
|
13
22
|
import subprocess
|
|
14
23
|
import sys
|
|
15
24
|
import time
|
|
@@ -59,6 +68,58 @@ _MAX_TIMEOUT = 600
|
|
|
59
68
|
_FILTER_THRESHOLD_LINES = 30
|
|
60
69
|
|
|
61
70
|
|
|
71
|
+
# Cache for discovered Git Bash path: [] = uncomputed, [None]/[path] = computed.
|
|
72
|
+
_bash_cache: list = []
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _discover_git_bash() -> str | None:
|
|
76
|
+
"""Locate a Git-for-Windows bash.exe, never WSL/System32 bash.
|
|
77
|
+
|
|
78
|
+
WSL's bash runs in a Linux subsystem with /mnt/c paths, which would break
|
|
79
|
+
the Windows `cwd` semantics every caller relies on — so it is rejected.
|
|
80
|
+
"""
|
|
81
|
+
candidates: list[str] = []
|
|
82
|
+
for base_env in ("ProgramW6432", "ProgramFiles", "ProgramFiles(x86)"):
|
|
83
|
+
base = os.environ.get(base_env)
|
|
84
|
+
if base:
|
|
85
|
+
candidates.append(os.path.join(base, "Git", "bin", "bash.exe"))
|
|
86
|
+
candidates.append(os.path.join(base, "Git", "usr", "bin", "bash.exe"))
|
|
87
|
+
candidates.append(r"C:\Program Files\Git\bin\bash.exe")
|
|
88
|
+
candidates.append(r"C:\Program Files\Git\usr\bin\bash.exe")
|
|
89
|
+
for path in candidates:
|
|
90
|
+
if os.path.isfile(path):
|
|
91
|
+
return path
|
|
92
|
+
# Last resort: PATH lookup, but reject WSL/Store bash (System32/WindowsApps).
|
|
93
|
+
found = shutil.which("bash")
|
|
94
|
+
if found:
|
|
95
|
+
low = found.lower()
|
|
96
|
+
if "system32" not in low and "windowsapps" not in low:
|
|
97
|
+
return found
|
|
98
|
+
return None
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def _select_bash() -> str | None:
|
|
102
|
+
"""Return the bash.exe to run commands through on Windows, else None.
|
|
103
|
+
|
|
104
|
+
None means "use the platform default shell" (cmd.exe on Windows via
|
|
105
|
+
shell=True, /bin/sh on POSIX). Honors the C3_SHELL_BASH override:
|
|
106
|
+
'0'/'cmd' forces the platform default; an existing file path forces that
|
|
107
|
+
bash. Discovery is cached after the first call.
|
|
108
|
+
"""
|
|
109
|
+
if sys.platform != "win32":
|
|
110
|
+
return None
|
|
111
|
+
override = os.environ.get("C3_SHELL_BASH")
|
|
112
|
+
if override is not None:
|
|
113
|
+
if override.strip().lower() in ("0", "", "cmd", "false", "off"):
|
|
114
|
+
return None
|
|
115
|
+
if os.path.isfile(override):
|
|
116
|
+
return override
|
|
117
|
+
# Unrecognized override → fall through to discovery.
|
|
118
|
+
if not _bash_cache:
|
|
119
|
+
_bash_cache.append(_discover_git_bash())
|
|
120
|
+
return _bash_cache[0]
|
|
121
|
+
|
|
122
|
+
|
|
62
123
|
def _popen_kwargs() -> dict:
|
|
63
124
|
# Force UTF-8 in child processes so Unicode output (→, box-drawing, emoji)
|
|
64
125
|
# doesn't crash on Windows' legacy cp1252 console encoding. setdefault so an
|
|
@@ -89,8 +150,17 @@ def _kill_tree(proc: subprocess.Popen) -> None:
|
|
|
89
150
|
def _run_sync(cmd: str, cwd: str, timeout: int) -> dict:
|
|
90
151
|
"""Blocking subprocess run with hard kill on timeout. Returns structured dict."""
|
|
91
152
|
start = time.time()
|
|
153
|
+
bash = _select_bash()
|
|
154
|
+
if bash:
|
|
155
|
+
# POSIX dialect via Git Bash — matches the native Bash tool.
|
|
156
|
+
popen_target: object = [bash, "-c", cmd]
|
|
157
|
+
use_shell = False
|
|
158
|
+
else:
|
|
159
|
+
# Platform default: cmd.exe on Windows, /bin/sh on POSIX.
|
|
160
|
+
popen_target = cmd
|
|
161
|
+
use_shell = True
|
|
92
162
|
proc = subprocess.Popen(
|
|
93
|
-
|
|
163
|
+
popen_target, shell=use_shell, cwd=cwd,
|
|
94
164
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
|
|
95
165
|
text=True, encoding="utf-8", errors="replace",
|
|
96
166
|
**_popen_kwargs(),
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/code_context_control.egg-info/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.41.0
|
|
4
4
|
Summary: Local code-intelligence layer for AI coding tools (Claude Code, Codex, Gemini, Copilot). Retrieve less, read less, edit safer.
|
|
5
5
|
Author-email: Dimitri Tselenchuk <dtselenc@gmail.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "code-context-control"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.41.0"
|
|
8
8
|
description = "Local code-intelligence layer for AI coding tools (Claude Code, Codex, Gemini, Copilot). Retrieve less, read less, edit safer."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -11,6 +11,7 @@ Covers:
|
|
|
11
11
|
from __future__ import annotations
|
|
12
12
|
|
|
13
13
|
import asyncio
|
|
14
|
+
import os
|
|
14
15
|
import sys
|
|
15
16
|
import unittest
|
|
16
17
|
from pathlib import Path
|
|
@@ -211,5 +212,79 @@ class TestShellRealSubprocess(unittest.TestCase):
|
|
|
211
212
|
self.assertIn("c3_smoke", out)
|
|
212
213
|
|
|
213
214
|
|
|
215
|
+
class _FakePopen:
|
|
216
|
+
"""Captures Popen construction args; emulates a clean exit."""
|
|
217
|
+
|
|
218
|
+
last_args: tuple = ()
|
|
219
|
+
last_kwargs: dict = {}
|
|
220
|
+
|
|
221
|
+
def __init__(self, *args, **kwargs):
|
|
222
|
+
_FakePopen.last_args = args
|
|
223
|
+
_FakePopen.last_kwargs = kwargs
|
|
224
|
+
self.returncode = 0
|
|
225
|
+
|
|
226
|
+
def communicate(self, timeout=None):
|
|
227
|
+
return ("out\n", "")
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
class TestShellSelection(unittest.TestCase):
|
|
231
|
+
"""Windows Git Bash discovery/selection and _run_sync shell routing."""
|
|
232
|
+
|
|
233
|
+
def setUp(self):
|
|
234
|
+
shell_mod._bash_cache.clear()
|
|
235
|
+
os.environ.pop("C3_SHELL_BASH", None)
|
|
236
|
+
|
|
237
|
+
def tearDown(self):
|
|
238
|
+
shell_mod._bash_cache.clear()
|
|
239
|
+
os.environ.pop("C3_SHELL_BASH", None)
|
|
240
|
+
|
|
241
|
+
def test_non_win32_returns_none(self):
|
|
242
|
+
with patch.object(shell_mod.sys, "platform", "linux"):
|
|
243
|
+
self.assertIsNone(shell_mod._select_bash())
|
|
244
|
+
|
|
245
|
+
def test_env_override_zero_forces_default_shell(self):
|
|
246
|
+
os.environ["C3_SHELL_BASH"] = "0"
|
|
247
|
+
with patch.object(shell_mod.sys, "platform", "win32"):
|
|
248
|
+
self.assertIsNone(shell_mod._select_bash())
|
|
249
|
+
|
|
250
|
+
def test_env_override_explicit_path_honored(self):
|
|
251
|
+
os.environ["C3_SHELL_BASH"] = __file__ # an existing file stands in for bash
|
|
252
|
+
with patch.object(shell_mod.sys, "platform", "win32"):
|
|
253
|
+
self.assertEqual(shell_mod._select_bash(), __file__)
|
|
254
|
+
|
|
255
|
+
def test_discovers_git_bash_from_program_files(self):
|
|
256
|
+
base = r"C:\PF"
|
|
257
|
+
expected = os.path.join(base, "Git", "bin", "bash.exe")
|
|
258
|
+
with patch.dict(os.environ, {"ProgramFiles": base}, clear=False), \
|
|
259
|
+
patch.object(shell_mod.os.path, "isfile", lambda p: p == expected):
|
|
260
|
+
self.assertEqual(shell_mod._discover_git_bash(), expected)
|
|
261
|
+
|
|
262
|
+
def test_rejects_wsl_system32_bash(self):
|
|
263
|
+
with patch.object(shell_mod.os.path, "isfile", lambda p: False), \
|
|
264
|
+
patch.object(shell_mod.shutil, "which",
|
|
265
|
+
return_value=r"C:\Windows\System32\bash.exe"):
|
|
266
|
+
self.assertIsNone(shell_mod._discover_git_bash())
|
|
267
|
+
|
|
268
|
+
def test_accepts_non_system_path_bash_from_which(self):
|
|
269
|
+
with patch.object(shell_mod.os.path, "isfile", lambda p: False), \
|
|
270
|
+
patch.object(shell_mod.shutil, "which",
|
|
271
|
+
return_value=r"C:\tools\msys\bash.exe"):
|
|
272
|
+
self.assertEqual(shell_mod._discover_git_bash(), r"C:\tools\msys\bash.exe")
|
|
273
|
+
|
|
274
|
+
def test_run_sync_uses_bash_argv_when_selected(self):
|
|
275
|
+
with patch.object(shell_mod, "_select_bash", return_value="FAKEBASH"), \
|
|
276
|
+
patch.object(shell_mod.subprocess, "Popen", _FakePopen):
|
|
277
|
+
shell_mod._run_sync("echo hi", ".", 5)
|
|
278
|
+
self.assertEqual(_FakePopen.last_args[0], ["FAKEBASH", "-c", "echo hi"])
|
|
279
|
+
self.assertIs(_FakePopen.last_kwargs["shell"], False)
|
|
280
|
+
|
|
281
|
+
def test_run_sync_falls_back_to_default_shell_string(self):
|
|
282
|
+
with patch.object(shell_mod, "_select_bash", return_value=None), \
|
|
283
|
+
patch.object(shell_mod.subprocess, "Popen", _FakePopen):
|
|
284
|
+
shell_mod._run_sync("echo hi", ".", 5)
|
|
285
|
+
self.assertEqual(_FakePopen.last_args[0], "echo hi")
|
|
286
|
+
self.assertIs(_FakePopen.last_kwargs["shell"], True)
|
|
287
|
+
|
|
288
|
+
|
|
214
289
|
if __name__ == "__main__":
|
|
215
290
|
unittest.main()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/cli/ui/components/instructions.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/activity_reporter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/federated_graph.py
RENAMED
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/health_checker.py
RENAMED
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/insight_engine.py
RENAMED
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/memory_reader.py
RENAMED
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/memory_writer.py
RENAMED
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/ollama_bridge.py
RENAMED
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/project_scanner.py
RENAMED
|
File without changes
|
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/tool_executor.py
RENAMED
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/oracle/services/tool_registry.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/services/bench/external/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/services/bench/external/swe_bench.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/services/bitbucket_credentials.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_bitbucket_cli_smoke.py
RENAMED
|
File without changes
|
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_bitbucket_config_fallback.py
RENAMED
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_bitbucket_credentials.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_edit_normalization.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_git_branch_awareness.py
RENAMED
|
File without changes
|
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_install_mcp_entrypoint.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_notification_discipline.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_oracle_discovery_api.py
RENAMED
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_oracle_security_fixes.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_project_manager_merge.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_service_durability.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_upgrade_and_version.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.40.0 → code_context_control-2.41.0}/tests/test_windows_reliability.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|