code-context-control 2.114.0__tar.gz → 2.115.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.114.0 → code_context_control-2.115.0}/PKG-INFO +1 -1
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/c3.py +1 -1
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/shell.py +13 -0
- code_context_control-2.115.0/cli/tools/shell_nudge.py +193 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/code_context_control.egg-info/PKG-INFO +1 -1
- {code_context_control-2.114.0 → code_context_control-2.115.0}/code_context_control.egg-info/SOURCES.txt +2 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/pyproject.toml +1 -1
- code_context_control-2.115.0/tests/test_shell_nudge_s4.py +126 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/LICENSE +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/README.md +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/__init__.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/_hook_utils.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/_shell_writes.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/commands/__init__.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/commands/common.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/commands/parser.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/docs.html +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/edits.html +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/guide/access.html +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/guide/bitbucket.html +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/guide/credentials.html +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/guide/getting-started.html +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/guide/index.html +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/guide/masking.html +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/guide/oracle.html +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/guide/shared.css +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/guide/tools.html +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/guide/workflow.html +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hook_access_guard.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hook_artifact.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hook_auto_snapshot.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hook_c3_signal.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hook_c3read.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hook_dispatch.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hook_edit_ledger.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hook_edit_unlock.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hook_filter.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hook_ghost_files.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hook_pretool_enforce.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hook_prompt_recall.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hook_read.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hook_session_stats.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hook_terse_advisor.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_server.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/app.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/add_project.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/config_editor.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/drill_artifacts.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/drill_health.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/drill_panel.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/drill_subprojects.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/drill_tasks.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/drill_views.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/global_search.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/hub_access.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/hub_ci.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/hub_cred_audit.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/hub_credentials.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/hub_enforcement.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/hub_locks.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/hub_tokens.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/mcp_manager.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/modals.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/project_card.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/project_tree.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/session_drawer.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/settings_modal.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/sidebar.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/summary_bar.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/task_board.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/toasts.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/topbar.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/state.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui.html +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/mcp_proxy.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/mcp_server.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/progress.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/server.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/__init__.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/_grants.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/_helpers.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/agent.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/artifacts.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/bitbucket.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/ci.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/compress.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/credentials.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/delegate.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/edit.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/edit_verify.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/edits.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/federate.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/filter.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/impact.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/jira.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/locks.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/memory.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/override.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/project.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/read.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/search.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/session.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/shell_job.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/shell_parsers.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/shell_render.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/status.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/tasks.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/tools/validate.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/api.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/app.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/components/access.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/components/bitbucket.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/components/chat.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/components/credentials.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/components/dashboard.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/components/edits.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/components/enforcement.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/components/instructions.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/components/jira.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/components/memory.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/components/sessions.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/components/settings.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/components/sidebar.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/components/tasks.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/icons.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/pm_shared.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/shared.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui/theme.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui.html +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui_legacy.html +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/cli/ui_nano.html +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/code_context_control.egg-info/dependency_links.txt +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/code_context_control.egg-info/entry_points.txt +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/code_context_control.egg-info/requires.txt +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/code_context_control.egg-info/top_level.txt +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/core/__init__.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/core/config.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/core/ide.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/core/mcp_toml.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/core/web_security.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/__init__.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/config.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/mcp_oracle.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/oracle_server.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/oracle_ui.html +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/__init__.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/activity_reporter.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/api_auth.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/c3_bridge.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/chat_engine.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/chat_poll.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/chat_store.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/cross_memory.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/discovery_audit.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/federated_graph.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/health_checker.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/insight_engine.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/local_session.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/memory_reader.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/memory_writer.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/mobile_api.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/project_scanner.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/review_agent.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/tool_executor.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/services/tool_registry.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/activity.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/agents.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/app.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/busy.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/chat/conversations.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/chat/input.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/chat/markdown.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/chat/send.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/chat/stream_renderer.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/chat/toolbar.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/core.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/crossgraph.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/header.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/insights.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/projects.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/qrcode.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/settings.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/suggestions.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/oracle/ui/theme_tabs.js +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/__init__.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/access_guard.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/access_telemetry.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/activity_log.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/agent_base.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/agent_locks.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/agents.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/artifact_defs.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/artifact_store.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/auto_memory.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/background_service.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/bench/__init__.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/bench/external/__init__.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/bench/external/aider_polyglot.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/bench/external/swe_bench.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/bench/search_eval.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/bench/shell_eval.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/benchmark_dashboard.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/bitbucket_client.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/bitbucket_credentials.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/ci_act.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/ci_cache.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/ci_expr.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/ci_failures.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/ci_github.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/ci_impact.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/ci_intel.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/ci_runner.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/ci_workflow.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/circuit_breaker.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/claude_md.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/compressor.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/context_snapshot.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/conversation_store.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/cred_audit.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/cred_telemetry.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/credential_store.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/doc_index.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/e2e_benchmark.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/e2e_evaluator.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/e2e_tasks.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/edit_ledger.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/embedding_index.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/enforcement_policy.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/error_reporting.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/file_memory.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/git_context.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/hub_service.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/index_store.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/indexer.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/jira_client.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/jira_cloud.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/jira_credentials.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/jira_data_center.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/jira_links.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/lexical_index.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/mask_activation.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/mask_mirror.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/mask_presets.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/memory.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/memory_consolidator.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/memory_distiller.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/memory_graph.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/memory_grounder.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/memory_queue.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/memory_scorer.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/metrics.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/notifications.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/ollama_bridge.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/ollama_client.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/ollama_credentials.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/oracle_service.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/output_filter.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/override_grants.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/override_policy.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/override_requests.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/override_wake.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/parser.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/project_manager.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/project_runtime.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/protocol.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/proxy_state.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/repo_map.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/repo_shape.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/reranker.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/retention.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/retrieval.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/retrieval_broker.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/router.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/runtime.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/scanner.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/session_benchmark.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/session_manager.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/session_preloader.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/shell_jobs.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/shell_output.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/subprojects.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/task_store.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/telemetry.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/text_index.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/time_tracker.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/tool_classifier.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/transcript_index.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/validation_cache.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/vector_store.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/watcher.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/services/win_subprocess.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/setup.cfg +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_access_builtin_optout.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_access_guard.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_access_guard_meta.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_access_guard_shell_project.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_access_guard_surfaces.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_access_guard_wiring.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_activity_reporter.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_agent_locks.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_aider_polyglot.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_antigravity_transition.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_artifact_store.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_artifact_tool.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_background_service.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_bitbucket_cli_smoke.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_bitbucket_client.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_bitbucket_config_fallback.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_bitbucket_credentials.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_bitbucket_tool.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_builtin_modes.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_c3_bridge_project_artifacts.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_c3_shell.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_chat_poll.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_ci_act.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_ci_cache.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_ci_expr.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_ci_impact.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_ci_intel.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_ci_runner.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_ci_workflow.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_circuit_breaker.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_claude_md_merge.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_claude_md_updater.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_cli_smoke.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_compressor_large_file.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_confirm_guard.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_confirm_guard_wiring.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_cooccurrence_bounds.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_cred_audit.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_cred_telemetry.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_credential_login_kind.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_credential_store.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_credential_ui_parity.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_credentials_routes.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_credentials_tool.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_creds_cli_smoke.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_delegate_cascade.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_delegate_version_probe.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_e2e_benchmark.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_edit_ledger_deadline.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_edit_ledger_hook.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_edit_locking.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_edit_normalization.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_edit_verify.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_embedding_index_deadlock.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_enforcement_flip.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_enforcement_policy.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_enforcement_routes.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_env_parser.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_failed_calls_do_not_unlock.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_federated_graph.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_filter_backoff.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_ghost_files.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_ghost_generation.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_git_branch_awareness.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_hook_access_guard.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_hook_codex_compat.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_hook_dispatch.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_hook_pretool_enforce.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_hook_prompt_recall.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_hook_smoke.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_hook_state.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_hook_utf8_stdio.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_hub_credentials_route.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_hub_credentials_routes_write.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_hub_enforcement_routes.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_hub_inspect_api.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_hub_locks_routes.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_hub_oracle_service_routes.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_hub_override_routes.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_hub_server_smoke.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_hub_subproject_links.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_ide_workflow_adaptation.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_index_cap_not_hardcoded.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_init_clear_preserves_user_content.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_init_scan.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_install_mcp_entrypoint.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_jira_cli_smoke.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_jira_client.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_jira_config_fallback.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_jira_credentials.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_jira_links.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_jira_routes.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_jira_tool.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_lazy_store_init.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_mask_guard.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_mask_routes.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_mask_surfaces.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_mcp_host_guard.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_mcp_memory_timeout.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_mcp_server_smoke.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_mcp_toml.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_memory_distiller.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_memory_graph_api.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_memory_queue.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_memory_system.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_mobile_api.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_mobile_extras.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_mobile_override_routes.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_mobile_security_api.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_no_stale_model_pins.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_notification_dedup.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_notification_discipline.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_ollama_credentials.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_oracle_api_auth.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_oracle_apikey_api.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_oracle_c3_bridge.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_oracle_chat_engine.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_oracle_chat_store.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_oracle_discovery_api.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_oracle_discovery_audit.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_oracle_health_probe.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_oracle_local_auth.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_oracle_ollama_bridge.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_oracle_scanner_cache.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_oracle_security_fixes.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_oracle_session_bootstrap.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_oracle_subproject_awareness.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_oracle_ui_bundle.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_output_filter.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_override_grants.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_override_grants_mcp.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_override_requests.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_override_wake.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_permissions.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_pm_api.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_project_manager.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_project_manager_merge.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_project_tool.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_read_coercion.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_read_edit_parity.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_related_facts.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_repo_map.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_repo_shape.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_response_boilerplate.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_retention.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_review_digest.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_search_eval.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_search_p1.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_search_p2.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_search_p2b.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_search_p3.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_search_p4.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_search_p5.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_service_durability.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_session_benchmark.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_session_budget.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_shell_budget_s1.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_shell_creds.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_shell_eval.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_shell_jobs_s3.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_shell_output.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_shell_parsers_s2.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_shell_robustness.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_shell_telemetry_s0.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_shell_write_ledger.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_shell_writes.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_subproject_clear_scope.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_subproject_depth_consumers.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_subproject_exclusion.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_subproject_federation.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_subproject_linkage_api.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_subprojects.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_swe_bench.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_task_store.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_task_tool.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_time_tracker.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_token_telemetry.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_token_tracking.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_tool_registry.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_ui_jsx_syntax.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_upgrade_and_version.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_validate.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_vault_write_guard.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_version_sync.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_web_security.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tests/test_windows_reliability.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tui/__init__.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tui/backend.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tui/main.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tui/screens/__init__.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tui/screens/benchmark_view.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tui/screens/claudemd_view.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tui/screens/compress_view.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tui/screens/index_view.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tui/screens/init_view.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tui/screens/mcp_view.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tui/screens/optimize_view.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tui/screens/pipe_view.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tui/screens/projects_view.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tui/screens/search_view.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tui/screens/session_view.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tui/screens/stats.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.0}/tui/screens/ui_view.py +0 -0
- {code_context_control-2.114.0 → code_context_control-2.115.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.115.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
|
|
@@ -30,6 +30,7 @@ from pathlib import Path
|
|
|
30
30
|
from cli._shell_writes import shell_write_targets
|
|
31
31
|
from cli.tools import _grants
|
|
32
32
|
from cli.tools._helpers import finalize_with_tokens
|
|
33
|
+
from cli.tools.shell_nudge import bypass_hint
|
|
33
34
|
from cli.tools.shell_parsers import (
|
|
34
35
|
SUMMARY_MIN_LINES,
|
|
35
36
|
detect_runner,
|
|
@@ -697,6 +698,18 @@ def render_shell_response(cmd: str, result: dict, svc, *,
|
|
|
697
698
|
dependency_hint = _dependency_hint(cmd, result)
|
|
698
699
|
if dependency_hint:
|
|
699
700
|
body += f"--- hint ---\n{dependency_hint}\n"
|
|
701
|
+
# S4: ONE advisory line when the shell was used as a reader or a
|
|
702
|
+
# searcher over project files (48% of commands, measured 2026-09-04).
|
|
703
|
+
# Never a refusal, never a rewrite; telemetry records that it was shown
|
|
704
|
+
# so the follow rate can be measured before anything is promoted.
|
|
705
|
+
stats["hint"] = None
|
|
706
|
+
try:
|
|
707
|
+
nudge = bypass_hint(cmd, str(getattr(svc, "project_path", "") or ""))
|
|
708
|
+
except Exception:
|
|
709
|
+
nudge = None
|
|
710
|
+
if nudge:
|
|
711
|
+
body += nudge + "\n"
|
|
712
|
+
stats["hint"] = nudge.split(": ", 1)[0].replace("[c3_shell:hint] ", "")
|
|
700
713
|
if touched_files:
|
|
701
714
|
body += f"--- ledger ---\nlogged {len(touched_files)} file(s)\n"
|
|
702
715
|
if cred_names:
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"""Advisory bypass hints for c3_shell (shell remediation S4).
|
|
2
|
+
|
|
3
|
+
Measured 2026-09-04 over 7,278 shell_exec events: 48% of c3_shell commands
|
|
4
|
+
were cat/head/tail/sed/grep/rg/find/ls over project files — reads and
|
|
5
|
+
searches that the code-intelligence tools answer within budget, indexed,
|
|
6
|
+
and with the index's exclusions (node_modules, minified bundles, .c3 logs),
|
|
7
|
+
none of which a raw shell read gets. Cod's ruling for this phase: advisory
|
|
8
|
+
only. Refusing on size would push agents to the native shell and lose
|
|
9
|
+
every control; the S1 budget already removes the catastrophic cost. So this
|
|
10
|
+
module produces at most ONE line per response naming the c3_* call that
|
|
11
|
+
answers the same question, and telemetry records that a hint was shown so
|
|
12
|
+
the follow rate and the false-positive rate can be measured before anything
|
|
13
|
+
is promoted.
|
|
14
|
+
|
|
15
|
+
Pure: ``bypass_hint(cmd, project_path) -> str | None``. Never rewrites the
|
|
16
|
+
command, never refuses, never inspects the filesystem beyond a cheap
|
|
17
|
+
"is this path inside the project" check.
|
|
18
|
+
"""
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import os
|
|
22
|
+
import re
|
|
23
|
+
import shlex
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
|
|
26
|
+
_PREFIX = re.compile(
|
|
27
|
+
r"""^(?:\s*(?:cd\s+(?:"[^"]*"|'[^']*'|\S+)\s*(?:&&|;)\s*|\w+=(?:"[^"]*"|'[^']*'|\S*)\s*;?\s*))*""")
|
|
28
|
+
_OPERATORS = {"|", "||", "&&", ";", ">", ">>", "<", "2>", "2>&1", "&"}
|
|
29
|
+
_READERS = {"cat", "head", "tail", "less", "more", "type"}
|
|
30
|
+
_SEARCHERS = {"grep", "egrep", "fgrep", "rg"}
|
|
31
|
+
_FINDERS = {"find", "ls", "tree", "dir"}
|
|
32
|
+
_SED_RANGE = re.compile(r"^(\d+),(\d+)p$")
|
|
33
|
+
_IDENTIFIER = re.compile(r"^[A-Za-z_][A-Za-z0-9_.]*$")
|
|
34
|
+
_SKIP_DIRS = ("node_modules", ".git", "dist", "build", ".c3", "__pycache__")
|
|
35
|
+
_MAX_LINES_HINT = 200
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _first_segment(cmd: str) -> list[str]:
|
|
39
|
+
"""Tokens of the first simple command after any cd/VAR= prefix."""
|
|
40
|
+
rest = _PREFIX.sub("", (cmd or "").strip())
|
|
41
|
+
if not rest:
|
|
42
|
+
return []
|
|
43
|
+
try:
|
|
44
|
+
toks = shlex.split(rest, posix=True)
|
|
45
|
+
except ValueError:
|
|
46
|
+
toks = rest.split()
|
|
47
|
+
out: list[str] = []
|
|
48
|
+
for tok in toks:
|
|
49
|
+
if tok in _OPERATORS:
|
|
50
|
+
break
|
|
51
|
+
out.append(tok)
|
|
52
|
+
return out
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _head(tok: str) -> str:
|
|
56
|
+
head = tok.rsplit("/", 1)[-1].rsplit("\\", 1)[-1].lower()
|
|
57
|
+
return head[:-4] if head.endswith(".exe") else head
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _inside_project(path: str, project_path: str) -> bool:
|
|
61
|
+
"""True when ``path`` is relative or resolves under the project root."""
|
|
62
|
+
if not path or path.startswith("-"):
|
|
63
|
+
return False
|
|
64
|
+
if any(seg in _SKIP_DIRS for seg in re.split(r"[\\/]", path)):
|
|
65
|
+
return False
|
|
66
|
+
if path.startswith(("~", "$")) or "${" in path:
|
|
67
|
+
return False # home or a variable: not a project path we can name
|
|
68
|
+
p = Path(path)
|
|
69
|
+
# Path("/var/log") is not absolute on Windows and Path("C:/x") is not
|
|
70
|
+
# absolute on POSIX: treat both spellings as absolute everywhere.
|
|
71
|
+
foreign_absolute = path.startswith(("/", "\\")) or bool(re.match(r"^[A-Za-z]:[/\\]", path))
|
|
72
|
+
if not p.is_absolute() and not foreign_absolute:
|
|
73
|
+
return True
|
|
74
|
+
if foreign_absolute and not p.is_absolute():
|
|
75
|
+
return False
|
|
76
|
+
try:
|
|
77
|
+
root = Path(project_path).resolve()
|
|
78
|
+
return str(p.resolve()).lower().startswith(str(root).lower() + os.sep) or p.resolve() == root
|
|
79
|
+
except Exception:
|
|
80
|
+
return False
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _rel(path: str) -> str:
|
|
84
|
+
p = path.replace("\\", "/")
|
|
85
|
+
if p.startswith("./"):
|
|
86
|
+
p = p[2:]
|
|
87
|
+
return p.rstrip("/") or "."
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _positional(toks: list[str], flags_with_arg: set[str]) -> list[str]:
|
|
91
|
+
out: list[str] = []
|
|
92
|
+
skip = False
|
|
93
|
+
for tok in toks[1:]:
|
|
94
|
+
if skip:
|
|
95
|
+
skip = False
|
|
96
|
+
continue
|
|
97
|
+
if tok in flags_with_arg:
|
|
98
|
+
skip = True
|
|
99
|
+
continue
|
|
100
|
+
if tok.startswith("-") and len(tok) > 1:
|
|
101
|
+
continue
|
|
102
|
+
out.append(tok)
|
|
103
|
+
return out
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def bypass_hint(cmd: str, project_path: str) -> str | None:
|
|
107
|
+
"""One advisory line, or None when the command is not a plain read/search."""
|
|
108
|
+
toks = _first_segment(cmd)
|
|
109
|
+
if not toks:
|
|
110
|
+
return None
|
|
111
|
+
head = _head(toks[0])
|
|
112
|
+
|
|
113
|
+
if head in _READERS:
|
|
114
|
+
files = [t for t in _positional(toks, {"-n", "-c"}) if _inside_project(t, project_path)]
|
|
115
|
+
if len(files) != 1:
|
|
116
|
+
return None
|
|
117
|
+
f = _rel(files[0])
|
|
118
|
+
if head == "tail":
|
|
119
|
+
return (f"[c3_shell:hint] a read of {f}: c3_compress(file_path='{f}', mode='map') "
|
|
120
|
+
f"then c3_read(file_path='{f}', lines=[a,b]) returns the region within budget and indexed")
|
|
121
|
+
lines = ""
|
|
122
|
+
if head == "head":
|
|
123
|
+
m = re.search(r"(?:^|\s)-n\s*(\d+)|(?:^|\s)-(\d+)\b", " ".join(toks[1:]))
|
|
124
|
+
n = int(next(g for g in m.groups() if g)) if m else 10
|
|
125
|
+
lines = f", lines=[1,{n}]"
|
|
126
|
+
return (f"[c3_shell:hint] a read of {f}: c3_read(file_path='{f}'{lines}) returns it within "
|
|
127
|
+
f"budget and indexed; c3_compress(mode='map') first for a large file")
|
|
128
|
+
|
|
129
|
+
if head == "sed":
|
|
130
|
+
# sed -n 'a,bp' file
|
|
131
|
+
args = toks[1:]
|
|
132
|
+
rng = None
|
|
133
|
+
files: list[str] = []
|
|
134
|
+
for tok in args:
|
|
135
|
+
m = _SED_RANGE.match(tok.strip("'\""))
|
|
136
|
+
if m:
|
|
137
|
+
rng = (int(m.group(1)), int(m.group(2)))
|
|
138
|
+
elif tok == "-n" or tok.startswith("-"):
|
|
139
|
+
continue
|
|
140
|
+
else:
|
|
141
|
+
files.append(tok)
|
|
142
|
+
files = [t for t in files if _inside_project(t, project_path)]
|
|
143
|
+
if rng is None or len(files) != 1:
|
|
144
|
+
return None
|
|
145
|
+
f = _rel(files[0])
|
|
146
|
+
return (f"[c3_shell:hint] a read of {f} lines {rng[0]}-{rng[1]}: "
|
|
147
|
+
f"c3_read(file_path='{f}', lines=[{rng[0]},{rng[1]}]) returns it within budget and indexed")
|
|
148
|
+
|
|
149
|
+
if head in _SEARCHERS:
|
|
150
|
+
pos = _positional(toks, {"-e", "--regexp", "-f", "--file", "-A", "-B", "-C", "-m", "-d",
|
|
151
|
+
"--include", "--exclude", "--exclude-dir", "-t", "--type", "-g", "--glob"})
|
|
152
|
+
# -e pattern form
|
|
153
|
+
pattern = None
|
|
154
|
+
for i, tok in enumerate(toks[1:], 1):
|
|
155
|
+
if tok in ("-e", "--regexp") and i + 1 < len(toks):
|
|
156
|
+
pattern = toks[i + 1]
|
|
157
|
+
break
|
|
158
|
+
if pattern is None:
|
|
159
|
+
if not pos:
|
|
160
|
+
return None
|
|
161
|
+
pattern, pos = pos[0], pos[1:]
|
|
162
|
+
targets = [t for t in pos if _inside_project(t, project_path)]
|
|
163
|
+
if pos and not targets:
|
|
164
|
+
return None # searching outside the project: not ours to hint
|
|
165
|
+
flags = " ".join(toks[1:])
|
|
166
|
+
ignore = ", ignore_case=True" if re.search(r"(?:^|\s)-\w*i\w*(?:\s|$)", flags) else ""
|
|
167
|
+
path_arg = f", path='{_rel(targets[0])}'" if targets and _rel(targets[0]) not in (".", "") else ""
|
|
168
|
+
action = "code" if _IDENTIFIER.match(pattern) else "exact"
|
|
169
|
+
safe = pattern.replace("'", "\\'")
|
|
170
|
+
return (f"[c3_shell:hint] a search: c3_search(action='{action}', query='{safe}'{path_arg}{ignore}) "
|
|
171
|
+
f"runs over the index (no node_modules, minified bundles or .c3 logs) within budget")
|
|
172
|
+
|
|
173
|
+
if head in _FINDERS:
|
|
174
|
+
pos = _positional(toks, {"-name", "-iname", "-path", "-type", "-maxdepth", "-mindepth", "-newer", "-size"})
|
|
175
|
+
name = None
|
|
176
|
+
for i, tok in enumerate(toks[1:], 1):
|
|
177
|
+
if tok in ("-name", "-iname") and i + 1 < len(toks):
|
|
178
|
+
name = toks[i + 1]
|
|
179
|
+
break
|
|
180
|
+
if head == "find" and name is None:
|
|
181
|
+
return None
|
|
182
|
+
targets = [t for t in pos if _inside_project(t, project_path)]
|
|
183
|
+
if head in ("ls", "tree", "dir"):
|
|
184
|
+
if "-R" not in toks and "-r" not in toks and head != "tree":
|
|
185
|
+
return None # a plain ls is cheap and not a search
|
|
186
|
+
q = _rel(targets[0]) if targets else "*"
|
|
187
|
+
return (f"[c3_shell:hint] a listing: c3_search(action='files', query='{q}') or "
|
|
188
|
+
f"c3_compress(file_path='<dir>', mode='map') walks the index instead")
|
|
189
|
+
path_arg = f", path='{_rel(targets[0])}'" if targets and _rel(targets[0]) != "." else ""
|
|
190
|
+
return (f"[c3_shell:hint] a filename search: c3_search(action='files', query='{name}'{path_arg}) "
|
|
191
|
+
f"walks the index (no node_modules or build output) within budget")
|
|
192
|
+
|
|
193
|
+
return None
|
{code_context_control-2.114.0 → code_context_control-2.115.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.115.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
|
|
@@ -99,6 +99,7 @@ cli/tools/search.py
|
|
|
99
99
|
cli/tools/session.py
|
|
100
100
|
cli/tools/shell.py
|
|
101
101
|
cli/tools/shell_job.py
|
|
102
|
+
cli/tools/shell_nudge.py
|
|
102
103
|
cli/tools/shell_parsers.py
|
|
103
104
|
cli/tools/shell_render.py
|
|
104
105
|
cli/tools/status.py
|
|
@@ -446,6 +447,7 @@ tests/test_shell_budget_s1.py
|
|
|
446
447
|
tests/test_shell_creds.py
|
|
447
448
|
tests/test_shell_eval.py
|
|
448
449
|
tests/test_shell_jobs_s3.py
|
|
450
|
+
tests/test_shell_nudge_s4.py
|
|
449
451
|
tests/test_shell_output.py
|
|
450
452
|
tests/test_shell_parsers_s2.py
|
|
451
453
|
tests/test_shell_robustness.py
|
|
@@ -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.115.0"
|
|
8
8
|
description = "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."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"""S4 of the c3_shell remediation: an advisory hint when the shell is used as
|
|
2
|
+
a reader or a searcher over project files (48% of commands, measured
|
|
3
|
+
2026-09-04). One line, never a refusal, never a rewrite.
|
|
4
|
+
"""
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
import unittest
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
12
|
+
|
|
13
|
+
from cli.tools.shell_nudge import bypass_hint # noqa: E402
|
|
14
|
+
|
|
15
|
+
PROJ = str(Path(__file__).resolve().parent.parent)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def hint(cmd: str) -> str | None:
|
|
19
|
+
return bypass_hint(cmd, PROJ)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class TestReads(unittest.TestCase):
|
|
23
|
+
def test_cat_of_a_project_file(self):
|
|
24
|
+
h = hint("cat CHANGELOG.md")
|
|
25
|
+
self.assertIsNotNone(h)
|
|
26
|
+
self.assertTrue(h.startswith("[c3_shell:hint]"))
|
|
27
|
+
self.assertIn("c3_read(file_path='CHANGELOG.md')", h)
|
|
28
|
+
|
|
29
|
+
def test_cd_prefix_and_head_n(self):
|
|
30
|
+
h = hint('cd "U:/x y" && head -n 40 services/indexer.py')
|
|
31
|
+
self.assertIn("c3_read(file_path='services/indexer.py', lines=[1,40])", h)
|
|
32
|
+
h = hint("head -60 cli/c3.py")
|
|
33
|
+
self.assertIn("lines=[1,60]", h)
|
|
34
|
+
|
|
35
|
+
def test_tail_points_at_map_then_read(self):
|
|
36
|
+
h = hint("tail -n 30 .c3/hub.log")
|
|
37
|
+
self.assertIsNone(h) # .c3 is skipped: not a source read
|
|
38
|
+
h = hint("tail -n 30 docs/shell-eval.md")
|
|
39
|
+
self.assertIn("c3_compress(file_path='docs/shell-eval.md', mode='map')", h)
|
|
40
|
+
|
|
41
|
+
def test_sed_range(self):
|
|
42
|
+
h = hint("sed -n '120,180p' cli/tools/shell.py")
|
|
43
|
+
self.assertIn("c3_read(file_path='cli/tools/shell.py', lines=[120,180])", h)
|
|
44
|
+
self.assertIsNone(hint("sed -i 's/a/b/' cli/tools/shell.py")) # an edit, not a read
|
|
45
|
+
|
|
46
|
+
def test_two_files_or_outside_project_is_not_hinted(self):
|
|
47
|
+
self.assertIsNone(hint("cat a.py b.py"))
|
|
48
|
+
self.assertIsNone(hint("cat /etc/hosts"))
|
|
49
|
+
self.assertIsNone(hint("cat ~/.c3/config.json"))
|
|
50
|
+
self.assertIsNone(hint("cat $HOME/x"))
|
|
51
|
+
self.assertIsNone(hint("cat node_modules/left-pad/index.js"))
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class TestSearches(unittest.TestCase):
|
|
55
|
+
def test_grep_identifier_maps_to_code_search(self):
|
|
56
|
+
h = hint("grep -rn CodeIndex services/")
|
|
57
|
+
self.assertIn("c3_search(action='code', query='CodeIndex', path='services')", h)
|
|
58
|
+
|
|
59
|
+
def test_grep_regex_maps_to_exact_with_ignore_case(self):
|
|
60
|
+
h = hint('grep -rni "content-security-policy\\|unsafe" --include=*.js .')
|
|
61
|
+
self.assertIn("action='exact'", h)
|
|
62
|
+
self.assertIn("ignore_case=True", h)
|
|
63
|
+
self.assertNotIn("path=", h)
|
|
64
|
+
|
|
65
|
+
def test_rg_e_pattern_and_pipe(self):
|
|
66
|
+
h = hint("rg -e 'def handle_' cli | head -20")
|
|
67
|
+
self.assertIn("query='def handle_'", h)
|
|
68
|
+
self.assertIn("path='cli'", h)
|
|
69
|
+
|
|
70
|
+
def test_grep_outside_project_is_not_hinted(self):
|
|
71
|
+
self.assertIsNone(hint("grep -rn foo /var/log/syslog"))
|
|
72
|
+
self.assertIsNone(hint("grep -rn foo C:/Windows/Temp"))
|
|
73
|
+
|
|
74
|
+
def test_grep_without_pattern(self):
|
|
75
|
+
self.assertIsNone(hint("grep"))
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class TestFinds(unittest.TestCase):
|
|
79
|
+
def test_find_name(self):
|
|
80
|
+
h = hint("find . -name '*.yml' -not -path '*/node_modules/*'")
|
|
81
|
+
self.assertIn("c3_search(action='files', query='*.yml')", h)
|
|
82
|
+
|
|
83
|
+
def test_find_without_name_and_plain_ls(self):
|
|
84
|
+
self.assertIsNone(hint("find . -type d -mtime -1"))
|
|
85
|
+
self.assertIsNone(hint("ls -la"))
|
|
86
|
+
self.assertIsNotNone(hint("ls -R services"))
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class TestWiring(unittest.TestCase):
|
|
90
|
+
"""render_shell_response appends the one line and telemetry records its kind."""
|
|
91
|
+
|
|
92
|
+
def _render(self, cmd):
|
|
93
|
+
from types import SimpleNamespace
|
|
94
|
+
|
|
95
|
+
from cli.tools import shell as shell_mod
|
|
96
|
+
from services.output_filter import OutputFilter
|
|
97
|
+
svc = SimpleNamespace(project_path=PROJ, activity_log=None, edit_ledger=None,
|
|
98
|
+
output_filter=OutputFilter({"HYBRID_DISABLE_TIER1": True}),
|
|
99
|
+
session_mgr=None, hybrid_config={})
|
|
100
|
+
result = {"exit_code": 0, "stdout": "x = 1\n", "stderr": "", "duration_ms": 3,
|
|
101
|
+
"timed_out": False, "shell": "git-bash"}
|
|
102
|
+
return shell_mod.render_shell_response(cmd, result, svc)
|
|
103
|
+
|
|
104
|
+
def test_read_gets_one_line_and_a_telemetry_kind(self):
|
|
105
|
+
body, stats = self._render("cat cli/c3.py")
|
|
106
|
+
self.assertEqual(body.count("[c3_shell:hint]"), 1)
|
|
107
|
+
self.assertIn("c3_read(file_path='cli/c3.py')", body)
|
|
108
|
+
self.assertEqual(stats["hint"], "a read of cli/c3.py")
|
|
109
|
+
self.assertTrue(body.startswith("[c3_shell:OK] 3ms\n$ cat cli/c3.py\n--- stdout ---\nx = 1\n"))
|
|
110
|
+
|
|
111
|
+
def test_other_commands_are_untouched(self):
|
|
112
|
+
body, stats = self._render("echo hi")
|
|
113
|
+
self.assertNotIn("[c3_shell:hint]", body)
|
|
114
|
+
self.assertIsNone(stats["hint"])
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class TestNotReads(unittest.TestCase):
|
|
118
|
+
def test_everything_else_is_silent(self):
|
|
119
|
+
for cmd in ("git status", "python -m pytest tests -q", "npm run build", "echo hi",
|
|
120
|
+
"curl -s http://127.0.0.1:3330/api/health", "", "python - <<'EOF'\nprint(1)\nEOF",
|
|
121
|
+
"PYTHONPATH= c3 --version", "gh pr list"):
|
|
122
|
+
self.assertIsNone(hint(cmd), cmd)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
if __name__ == "__main__":
|
|
126
|
+
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
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/guide/getting-started.html
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
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/add_project.js
RENAMED
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/config_editor.js
RENAMED
|
File without changes
|
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/drill_health.js
RENAMED
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/drill_panel.js
RENAMED
|
File without changes
|
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/drill_tasks.js
RENAMED
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/drill_views.js
RENAMED
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/global_search.js
RENAMED
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/hub_access.js
RENAMED
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/hub_ci.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/hub_locks.js
RENAMED
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/hub_tokens.js
RENAMED
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/mcp_manager.js
RENAMED
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/modals.js
RENAMED
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/project_card.js
RENAMED
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/project_tree.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/sidebar.js
RENAMED
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/summary_bar.js
RENAMED
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/task_board.js
RENAMED
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/toasts.js
RENAMED
|
File without changes
|
{code_context_control-2.114.0 → code_context_control-2.115.0}/cli/hub_ui/components/topbar.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
|