code-context-control 2.143.0__tar.gz → 2.145.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {code_context_control-2.143.0 → code_context_control-2.145.1}/PKG-INFO +2 -1
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/c3.py +132 -13
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/commands/parser.py +21 -6
- code_context_control-2.145.1/cli/guide/access.html +811 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/guide/bitbucket.html +19 -7
- code_context_control-2.145.1/cli/guide/ci.html +478 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/guide/credentials.html +87 -25
- code_context_control-2.145.1/cli/guide/delegate.html +549 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/guide/getting-started.html +120 -52
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/guide/index.html +134 -35
- code_context_control-2.145.1/cli/guide/jira.html +533 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/guide/masking.html +20 -11
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/guide/oracle.html +58 -7
- code_context_control-2.145.1/cli/guide/sessions.html +416 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/guide/tools.html +566 -149
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/guide/workflow.html +248 -71
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_pretool_enforce.py +1 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_server.py +32 -24
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/hub_credentials.js +32 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/server.py +7 -21
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/credentials.py +25 -8
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/components/credentials.js +1 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/code_context_control.egg-info/PKG-INFO +2 -1
- {code_context_control-2.143.0 → code_context_control-2.145.1}/code_context_control.egg-info/SOURCES.txt +6 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/code_context_control.egg-info/requires.txt +1 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/mobile_api.py +7 -15
- {code_context_control-2.143.0 → code_context_control-2.145.1}/pyproject.toml +2 -1
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/access_guard.py +2 -1
- code_context_control-2.145.1/services/credential_backup.py +333 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/credential_store.py +92 -25
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/override_policy.py +3 -1
- code_context_control-2.145.1/tests/test_credential_backup.py +245 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_credential_store.py +33 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_credentials_routes.py +19 -1
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_credentials_tool.py +16 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_creds_cli_smoke.py +20 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hub_credentials_routes_write.py +14 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_mobile_security_api.py +12 -0
- code_context_control-2.143.0/cli/guide/access.html +0 -289
- {code_context_control-2.143.0 → code_context_control-2.145.1}/LICENSE +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/README.md +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/__init__.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/_hook_utils.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/_shell_writes.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/commands/__init__.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/commands/common.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/docs.html +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/edits.html +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/guide/shared.css +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_access_guard.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_agent_model.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_artifact.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_auto_snapshot.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_c3_signal.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_c3read.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_codex_lifecycle.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_dispatch.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_edit_ledger.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_edit_unlock.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_filter.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_ghost_files.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_prompt_recall.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_read.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_session_end.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_session_open.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_session_stats.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hook_terse_advisor.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/app.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/add_project.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/config_editor.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/drill_artifacts.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/drill_health.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/drill_panel.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/drill_subprojects.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/drill_tasks.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/drill_views.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/global_search.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/hub_access.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/hub_ci.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/hub_cred_audit.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/hub_enforcement.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/hub_locks.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/hub_sessions.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/hub_tokens.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/mcp_manager.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/modals.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/project_card.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/project_tree.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/session_drawer.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/settings_modal.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/sidebar.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/summary_bar.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/task_board.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/toasts.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/components/topbar.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui/state.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/hub_ui.html +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/mcp_proxy.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/mcp_server.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/progress.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/__init__.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/_grants.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/_helpers.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/agent.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/artifacts.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/bitbucket.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/ci.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/compress.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/delegate.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/edit.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/edit_verify.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/edits.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/federate.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/filter.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/impact.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/jira.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/locks.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/memory.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/override.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/project.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/read.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/search.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/session.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/shell.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/shell_job.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/shell_nudge.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/shell_parsers.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/shell_render.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/status.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/tasks.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/tools/validate.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/api.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/app.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/components/access.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/components/bitbucket.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/components/chat.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/components/dashboard.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/components/edits.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/components/enforcement.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/components/instructions.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/components/jira.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/components/memory.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/components/sessions.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/components/settings.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/components/sidebar.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/components/tasks.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/icons.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/pm_shared.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/shared.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui/theme.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui.html +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui_legacy.html +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/cli/ui_nano.html +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/code_context_control.egg-info/dependency_links.txt +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/code_context_control.egg-info/entry_points.txt +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/code_context_control.egg-info/top_level.txt +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/core/__init__.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/core/codex_patch.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/core/config.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/core/grok_payload.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/core/hook_command.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/core/host.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/core/ide.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/core/mcp_toml.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/core/web_security.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/__init__.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/config.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/listeners.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/mcp_oracle.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/oracle_server.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/oracle_ui.html +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/__init__.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/activity_reporter.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/api_auth.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/c3_bridge.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/chat_engine.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/chat_poll.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/chat_store.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/client_tokens.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/cross_memory.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/discovery_audit.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/federated_graph.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/health_checker.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/insight_engine.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/local_session.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/memory_reader.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/memory_writer.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/project_scanner.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/review_agent.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/tool_executor.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/services/tool_registry.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/activity.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/agents.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/app.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/busy.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/chat/conversations.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/chat/input.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/chat/markdown.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/chat/send.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/chat/stream_renderer.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/chat/toolbar.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/core.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/crossgraph.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/header.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/insights.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/projects.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/qrcode.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/settings.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/suggestions.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/oracle/ui/theme_tabs.js +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/__init__.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/access_telemetry.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/activity_log.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/agent_base.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/agent_downshift.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/agent_locks.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/agents.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/agents_workflow.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/artifact_defs.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/artifact_store.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/atomic_json.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/auto_memory.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/background_service.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/bench/__init__.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/bench/delegate_eval.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/bench/delegate_write_eval.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/bench/external/__init__.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/bench/external/aider_polyglot.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/bench/external/swe_bench.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/bench/map_eval.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/bench/search_eval.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/bench/shell_eval.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/benchmark_dashboard.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/bitbucket_client.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/bitbucket_credentials.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/ci_act.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/ci_cache.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/ci_expr.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/ci_failures.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/ci_github.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/ci_impact.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/ci_intel.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/ci_runner.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/ci_workflow.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/circuit_breaker.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/claude_md.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/codex_integration.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/codex_transcript.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/compressor.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/context_snapshot.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/conversation_store.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/cred_audit.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/cred_telemetry.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/delegate_agents.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/delegate_hints.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/delegate_write.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/dir_map.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/doc_index.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/e2e_benchmark.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/e2e_evaluator.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/e2e_tasks.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/edit_ledger.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/embedding_index.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/enforcement_policy.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/error_reporting.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/file_map.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/file_memory.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/git_context.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/grok_integration.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/grok_transcript.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/host_sessions.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/hub_service.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/index_store.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/indexer.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/jira_client.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/jira_cloud.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/jira_credentials.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/jira_data_center.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/jira_links.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/lexical_index.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/mask_activation.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/mask_mirror.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/mask_presets.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/memory.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/memory_consolidator.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/memory_distiller.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/memory_graph.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/memory_grounder.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/memory_queue.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/memory_scorer.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/metrics.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/notifications.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/ollama_bridge.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/ollama_client.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/ollama_credentials.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/oracle_service.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/output_filter.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/override_costs.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/override_grants.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/override_requests.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/override_wake.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/parser.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/project_manager.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/project_runtime.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/protocol.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/proxy_state.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/repo_map.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/repo_shape.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/reranker.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/retention.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/retrieval.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/retrieval_broker.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/router.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/runtime.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/scanner.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/session_benchmark.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/session_catalog.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/session_live.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/session_manager.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/session_preloader.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/shell_jobs.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/shell_output.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/subprojects.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/task_store.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/telemetry.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/terminal_launch.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/text_index.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/time_tracker.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/tool_classifier.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/transcript_index.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/validation_cache.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/vector_store.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/watcher.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/services/win_subprocess.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/setup.cfg +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_access_builtin_optout.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_access_guard.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_access_guard_meta.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_access_guard_shell_project.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_access_guard_surfaces.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_access_guard_wiring.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_activity_log_find_last.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_activity_reporter.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_agent_locks.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_aider_polyglot.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_antigravity_transition.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_artifact_store.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_artifact_tool.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_atomic_json.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_background_service.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_bitbucket_cli_smoke.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_bitbucket_client.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_bitbucket_config_fallback.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_bitbucket_credentials.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_bitbucket_tool.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_builtin_modes.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_c3_bridge_project_artifacts.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_c3_shell.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_chat_poll.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_ci_act.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_ci_cache.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_ci_dag_ownership.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_ci_expr.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_ci_impact.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_ci_intel.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_ci_runner.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_ci_workflow.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_circuit_breaker.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_claude_md_merge.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_claude_md_updater.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_cli_smoke.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_codex_mcp_transport.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_codex_native.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_compressor_large_file.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_confirm_guard.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_confirm_guard_wiring.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_cooccurrence_bounds.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_cred_audit.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_cred_telemetry.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_credential_login_kind.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_credential_ui_parity.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_delegate_adoption_d4.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_delegate_auto.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_delegate_cascade.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_delegate_claude_d1.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_delegate_eval.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_delegate_grok.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_delegate_host_d2.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_delegate_scout_d3.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_delegate_telemetry_d0.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_delegate_thinking_cap.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_delegate_tuning.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_delegate_version_probe.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_delegate_write.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_delegate_write_eval.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_dir_map_c3.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_e2e_benchmark.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_edit_ledger_deadline.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_edit_ledger_hook.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_edit_locking.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_edit_normalization.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_edit_verify.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_embedding_index_deadlock.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_enforcement_flip.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_enforcement_policy.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_enforcement_routes.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_env_parser.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_failed_calls_do_not_unlock.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_federated_graph.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_file_map_c1.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_filter_backoff.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_ghost_files.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_ghost_generation.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_git_branch_awareness.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_grok_native.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hook_access_guard.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hook_codex_compat.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hook_dispatch.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hook_grok_compat.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hook_pretool_enforce.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hook_prompt_recall.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hook_session_end.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hook_smoke.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hook_state.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hook_utf8_stdio.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hub_access_routes.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hub_credentials_route.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hub_enforcement_routes.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hub_hook_migration.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hub_inspect_api.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hub_locks_routes.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hub_oracle_service_routes.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hub_override_policy_routes.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hub_override_routes.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hub_rules_routes.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hub_server_smoke.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hub_sessions_routes.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_hub_subproject_links.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_ide_workflow_adaptation.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_index_cap_not_hardcoded.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_init_clear_preserves_user_content.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_init_scan.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_install_mcp_entrypoint.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_jira_cli_smoke.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_jira_client.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_jira_config_fallback.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_jira_credentials.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_jira_links.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_jira_routes.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_jira_tool.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_large_files_c4.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_lazy_store_init.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_map_eval.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_map_telemetry_c0.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_mask_guard.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_mask_routes.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_mask_surfaces.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_mcp_host_guard.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_mcp_memory_timeout.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_mcp_server_smoke.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_mcp_toml.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_memory_distiller.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_memory_graph_api.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_memory_queue.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_memory_system.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_mobile_api.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_mobile_clients.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_mobile_extras.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_mobile_jobs_ci.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_mobile_override_costs.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_mobile_override_routes.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_no_stale_model_pins.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_notification_dedup.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_notification_discipline.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_notification_kinds.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_ollama_credentials.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_oracle_api_auth.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_oracle_apikey_api.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_oracle_c3_bridge.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_oracle_chat_engine.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_oracle_chat_store.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_oracle_discovery_api.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_oracle_discovery_audit.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_oracle_health_probe.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_oracle_local_auth.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_oracle_loopback.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_oracle_ollama_bridge.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_oracle_scanner_cache.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_oracle_security_fixes.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_oracle_session_bootstrap.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_oracle_subproject_awareness.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_oracle_ui_bundle.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_output_filter.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_override_costs.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_override_grants.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_override_grants_mcp.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_override_requests.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_override_wake.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_permissions.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_pm_api.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_project_manager.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_project_manager_merge.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_project_tool.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_read_coercion.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_read_edit_parity.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_read_outside_root.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_related_facts.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_repo_map.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_repo_shape.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_response_boilerplate.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_retention.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_review_digest.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_search_eval.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_search_p1.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_search_p2.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_search_p2b.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_search_p3.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_search_p4.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_search_p5.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_service_durability.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_session_benchmark.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_session_budget.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_session_catalog.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_session_live.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_session_tool.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_shell_budget_s1.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_shell_creds.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_shell_eval.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_shell_jobs_s3.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_shell_nudge_s4.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_shell_output.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_shell_parsers_s2.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_shell_robustness.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_shell_telemetry_s0.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_shell_write_ledger.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_shell_writes.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_subproject_clear_scope.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_subproject_depth_consumers.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_subproject_exclusion.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_subproject_federation.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_subproject_linkage_api.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_subprojects.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_swe_bench.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_task_store.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_task_tool.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_time_tracker.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_token_telemetry.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_token_tracking.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_tool_registry.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_ui_jsx_syntax.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_upgrade_and_version.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_validate.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_vault_write_guard.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_version_sync.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_watcher_pruning.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_web_security.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tests/test_windows_reliability.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tui/__init__.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tui/backend.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tui/main.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tui/screens/__init__.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tui/screens/benchmark_view.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tui/screens/claudemd_view.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tui/screens/compress_view.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tui/screens/index_view.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tui/screens/init_view.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tui/screens/mcp_view.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tui/screens/optimize_view.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tui/screens/pipe_view.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tui/screens/projects_view.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tui/screens/search_view.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tui/screens/session_view.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tui/screens/stats.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/tui/screens/ui_view.py +0 -0
- {code_context_control-2.143.0 → code_context_control-2.145.1}/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.145.1
|
|
4
4
|
Summary: Local MCP code-intelligence for AI coding tools: surgical search/read/edit, agent-config version history, path-level access + masking guards, and a multi-project hub.
|
|
5
5
|
Author-email: Dimitri Tselenchuk <dtselenc@gmail.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -44,6 +44,7 @@ Requires-Dist: rich>=13.0.0
|
|
|
44
44
|
Requires-Dist: click>=8.0.0
|
|
45
45
|
Requires-Dist: pyyaml>=6.0.0
|
|
46
46
|
Requires-Dist: keyring>=24.0
|
|
47
|
+
Requires-Dist: cryptography>=41.0
|
|
47
48
|
Provides-Extra: vector
|
|
48
49
|
Requires-Dist: scikit-learn>=1.3.0; extra == "vector"
|
|
49
50
|
Requires-Dist: numpy>=1.24.0; extra == "vector"
|
|
@@ -91,7 +91,7 @@ console = Console() if HAS_RICH else None
|
|
|
91
91
|
# Config
|
|
92
92
|
CONFIG_DIR = ".c3"
|
|
93
93
|
CONFIG_FILE = ".c3/config.json"
|
|
94
|
-
__version__ = "2.
|
|
94
|
+
__version__ = "2.145.1"
|
|
95
95
|
|
|
96
96
|
# The PreToolUse matcher for native subagent calls (installer and hub migration).
|
|
97
97
|
AGENT_MATCHER = "Agent|Task"
|
|
@@ -5063,7 +5063,7 @@ _GLOBAL_CLAUDE_MD_CONTENT = """\
|
|
|
5063
5063
|
# C3 - Global Enforcement (applies to all projects with C3 installed)
|
|
5064
5064
|
|
|
5065
5065
|
## Tool Discipline
|
|
5066
|
-
When C3 MCP tools are available (c3_search, c3_read,
|
|
5066
|
+
When C3 MCP tools are available (c3_search, c3_read, c3_edit, c3_validate, etc.),
|
|
5067
5067
|
you MUST use them instead of native tools (Read, Grep, Glob, Edit, Write).
|
|
5068
5068
|
|
|
5069
5069
|
Native tools are blocked by PreToolUse hooks in C3 projects. Do NOT attempt them without
|
|
@@ -6371,7 +6371,7 @@ def cmd_creds(args):
|
|
|
6371
6371
|
"""Credential vault management (global + per-project scopes)."""
|
|
6372
6372
|
sub = getattr(args, "creds_cmd", None)
|
|
6373
6373
|
if not sub:
|
|
6374
|
-
print("Usage: c3 creds {set,get,list,rm,import,usage,audit} [args]")
|
|
6374
|
+
print("Usage: c3 creds {set,get,list,rm,import,usage,audit,backup} [args]")
|
|
6375
6375
|
return
|
|
6376
6376
|
|
|
6377
6377
|
project_path = getattr(args, "project_path", ".") or "."
|
|
@@ -6390,6 +6390,8 @@ def cmd_creds(args):
|
|
|
6390
6390
|
_creds_cmd_usage(args, project_path)
|
|
6391
6391
|
elif sub == "audit":
|
|
6392
6392
|
_creds_cmd_audit(args, project_path)
|
|
6393
|
+
elif sub == "backup":
|
|
6394
|
+
_creds_cmd_backup(args, project_path)
|
|
6393
6395
|
else:
|
|
6394
6396
|
print(f"Unknown creds subcommand: {sub}")
|
|
6395
6397
|
|
|
@@ -6398,11 +6400,12 @@ def _creds_scope(args) -> str:
|
|
|
6398
6400
|
return "global" if getattr(args, "use_global", False) else "project"
|
|
6399
6401
|
|
|
6400
6402
|
|
|
6401
|
-
def _creds_entry_line(name: str, entry: dict) -> str:
|
|
6403
|
+
def _creds_entry_line(name: str, entry: dict, missing: bool = False) -> str:
|
|
6402
6404
|
flags = [f for f in ("inject", "agent_readable") if entry.get(f)]
|
|
6405
|
+
size = "VALUE MISSING" if missing else f"len={entry.get('value_len', '?')}"
|
|
6403
6406
|
parts = [
|
|
6404
6407
|
f"{name:<24} {entry.get('scope', '?'):<8} {entry.get('type', 'token'):<10}"
|
|
6405
|
-
f"
|
|
6408
|
+
f" {size}",
|
|
6406
6409
|
]
|
|
6407
6410
|
display = entry.get("display") or {}
|
|
6408
6411
|
if display:
|
|
@@ -6465,13 +6468,15 @@ def _creds_cmd_set(args, project_path: str) -> None:
|
|
|
6465
6468
|
|
|
6466
6469
|
from services import credential_store as cred_store
|
|
6467
6470
|
|
|
6468
|
-
ctype = getattr(args, "ctype",
|
|
6471
|
+
ctype = getattr(args, "ctype", None)
|
|
6472
|
+
prompt_type = ctype or cred_store.get_entry(
|
|
6473
|
+
args.name, project_path=project_path).get("type", "token")
|
|
6469
6474
|
value = getattr(args, "value", "") or ""
|
|
6470
6475
|
if getattr(args, "stdin", False):
|
|
6471
6476
|
value = sys.stdin.read().rstrip("\n")
|
|
6472
6477
|
if not value:
|
|
6473
|
-
if
|
|
6474
|
-
value = _creds_prompt_structured(args.name,
|
|
6478
|
+
if prompt_type in cred_store.STRUCTURED_TYPES:
|
|
6479
|
+
value = _creds_prompt_structured(args.name, prompt_type)
|
|
6475
6480
|
if value == "{}":
|
|
6476
6481
|
print("Cancelled -- no fields entered.")
|
|
6477
6482
|
return
|
|
@@ -6485,11 +6490,11 @@ def _creds_cmd_set(args, project_path: str) -> None:
|
|
|
6485
6490
|
entry = cred_store.set_credential(
|
|
6486
6491
|
args.name, value,
|
|
6487
6492
|
scope=scope, project_path=project_path,
|
|
6488
|
-
description=getattr(args, "desc",
|
|
6493
|
+
description=getattr(args, "desc", None),
|
|
6489
6494
|
ctype=ctype,
|
|
6490
|
-
env_var=getattr(args, "env_var",
|
|
6491
|
-
agent_readable=
|
|
6492
|
-
inject=
|
|
6495
|
+
env_var=getattr(args, "env_var", None),
|
|
6496
|
+
agent_readable=getattr(args, "agent_readable", None),
|
|
6497
|
+
inject=getattr(args, "inject", None),
|
|
6493
6498
|
)
|
|
6494
6499
|
except (cred_store.CredentialError, RuntimeError) as exc:
|
|
6495
6500
|
print(f"[error] {exc}")
|
|
@@ -6499,6 +6504,111 @@ def _creds_cmd_set(args, project_path: str) -> None:
|
|
|
6499
6504
|
if entry["agent_readable"]:
|
|
6500
6505
|
print("[warn] agent_readable=true -- the agent can read this value "
|
|
6501
6506
|
"into its context and transcripts.")
|
|
6507
|
+
_creds_print_backup_note(entry.get("backup", ""))
|
|
6508
|
+
|
|
6509
|
+
|
|
6510
|
+
def _creds_print_backup_note(backup: str) -> None:
|
|
6511
|
+
if backup == "off":
|
|
6512
|
+
print("[note] no vault backup: this value exists only in the OS keychain. "
|
|
6513
|
+
"`c3 creds backup init` keeps a copy that survives a keychain wipe.")
|
|
6514
|
+
elif backup.startswith("failed"):
|
|
6515
|
+
print(f"[warn] the vault backup was not updated ({backup}); "
|
|
6516
|
+
"run `c3 creds backup sync`.")
|
|
6517
|
+
|
|
6518
|
+
|
|
6519
|
+
def _creds_known_projects(project_path: str) -> list:
|
|
6520
|
+
"""The current project plus every project the hub knows about."""
|
|
6521
|
+
from services.project_manager import ProjectManager
|
|
6522
|
+
paths = [str(Path(project_path).resolve())]
|
|
6523
|
+
paths += [str(p.get("path")) for p in ProjectManager().list_projects()
|
|
6524
|
+
if p.get("path")]
|
|
6525
|
+
return paths
|
|
6526
|
+
|
|
6527
|
+
|
|
6528
|
+
def _creds_read_passphrase(prompt: str, *, confirm: bool = False) -> str:
|
|
6529
|
+
import getpass
|
|
6530
|
+
first = getpass.getpass(prompt)
|
|
6531
|
+
if confirm and getpass.getpass("Repeat it: ") != first:
|
|
6532
|
+
print("[error] the passphrases did not match -- nothing changed.")
|
|
6533
|
+
return ""
|
|
6534
|
+
return first
|
|
6535
|
+
|
|
6536
|
+
|
|
6537
|
+
def _creds_cmd_backup(args, project_path: str) -> None:
|
|
6538
|
+
from services import credential_backup as backup
|
|
6539
|
+
|
|
6540
|
+
action = args.backup_cmd
|
|
6541
|
+
if action in ("init", "restore", "passphrase") and not sys.stdin.isatty():
|
|
6542
|
+
print("[error] run this in your own terminal: the passphrase is read from "
|
|
6543
|
+
"the keyboard, never from a pipe or an argument.")
|
|
6544
|
+
return
|
|
6545
|
+
try:
|
|
6546
|
+
if action == "init":
|
|
6547
|
+
print("Choose a passphrase for the vault backup. Without it the backup "
|
|
6548
|
+
"cannot be opened -- keep it in your password manager.")
|
|
6549
|
+
passphrase = _creds_read_passphrase(
|
|
6550
|
+
f"New passphrase (min {backup.MIN_PASSPHRASE} chars): ", confirm=True)
|
|
6551
|
+
if not passphrase:
|
|
6552
|
+
return
|
|
6553
|
+
backup.init(passphrase)
|
|
6554
|
+
done = backup.sync(_creds_known_projects(project_path))
|
|
6555
|
+
print(f"[OK] Vault backup on: {backup.backup_path()} -- "
|
|
6556
|
+
f"{done['saved']} value(s) copied. Every value you set from now "
|
|
6557
|
+
"on is copied automatically.")
|
|
6558
|
+
if done["missing"]:
|
|
6559
|
+
print(f" no value to copy (re-enter these): {', '.join(done['missing'])}")
|
|
6560
|
+
elif action == "sync":
|
|
6561
|
+
done = backup.sync(_creds_known_projects(project_path))
|
|
6562
|
+
print(f"[OK] {done['saved']} value(s) copied to the vault backup.")
|
|
6563
|
+
for label, names in (("no value to copy", done["missing"]),
|
|
6564
|
+
("failed", done["failed"])):
|
|
6565
|
+
if names:
|
|
6566
|
+
print(f" {label}: {', '.join(names)}")
|
|
6567
|
+
elif action == "status":
|
|
6568
|
+
st = backup.status(_creds_known_projects(project_path))
|
|
6569
|
+
if st["enabled"]:
|
|
6570
|
+
print(f"Vault backup: on ({st['path']}, created {st['created']}) -- "
|
|
6571
|
+
f"{st['backed_up']} value(s) held.")
|
|
6572
|
+
else:
|
|
6573
|
+
print("Vault backup: off -- values live only in the OS keychain. "
|
|
6574
|
+
"Turn it on with `c3 creds backup init`.")
|
|
6575
|
+
for label, key in (("restorable (`c3 creds backup restore`)", "restorable"),
|
|
6576
|
+
("lost, no copy (re-enter with `c3 creds set`)", "lost"),
|
|
6577
|
+
("not backed up yet (`c3 creds backup sync`)", "not_backed_up")):
|
|
6578
|
+
if st[key] and (st["enabled"] or key == "lost"):
|
|
6579
|
+
print(f" {label}: {', '.join(st[key])}")
|
|
6580
|
+
elif action == "restore":
|
|
6581
|
+
passphrase = _creds_read_passphrase("Backup passphrase: ")
|
|
6582
|
+
only = [n.strip() for n in (args.only or "").split(",") if n.strip()]
|
|
6583
|
+
out = backup.restore(passphrase, only=only or None)
|
|
6584
|
+
print(f"[OK] Restored {len(out['restored'])} value(s)"
|
|
6585
|
+
+ (f": {', '.join(out['restored'])}" if out["restored"] else "."))
|
|
6586
|
+
for label, key in (("still in the keychain, left alone", "present"),
|
|
6587
|
+
("entry or project gone, skipped", "orphaned"),
|
|
6588
|
+
("failed", "failed")):
|
|
6589
|
+
if out[key]:
|
|
6590
|
+
print(f" {label}: {', '.join(out[key])}")
|
|
6591
|
+
if out["restored"]:
|
|
6592
|
+
_creds_log_restore(out["restored"])
|
|
6593
|
+
else: # passphrase
|
|
6594
|
+
old = _creds_read_passphrase("Current passphrase: ")
|
|
6595
|
+
new = _creds_read_passphrase(
|
|
6596
|
+
f"New passphrase (min {backup.MIN_PASSPHRASE} chars): ", confirm=True)
|
|
6597
|
+
if old and new:
|
|
6598
|
+
backup.change_passphrase(old, new)
|
|
6599
|
+
print("[OK] Backup passphrase changed.")
|
|
6600
|
+
except backup.BackupError as exc:
|
|
6601
|
+
print(f"[error] {exc}")
|
|
6602
|
+
|
|
6603
|
+
|
|
6604
|
+
def _creds_log_restore(names: list) -> None:
|
|
6605
|
+
"""Names only, to the global activity log that `c3 creds audit` reads."""
|
|
6606
|
+
from services import credential_store as cred_store
|
|
6607
|
+
from services.activity_log import ActivityLog
|
|
6608
|
+
home = cred_store.global_base()
|
|
6609
|
+
if home is not None:
|
|
6610
|
+
ActivityLog(str(home)).log("cred_action", {
|
|
6611
|
+
"kind": "creds", "action": "restore", "names": names, "via": "cli"})
|
|
6502
6612
|
|
|
6503
6613
|
|
|
6504
6614
|
def _creds_count_show(refs, project_path: str) -> None:
|
|
@@ -6575,8 +6685,17 @@ def _creds_cmd_list(args, project_path: str) -> None:
|
|
|
6575
6685
|
"(add --global for all projects).")
|
|
6576
6686
|
return
|
|
6577
6687
|
print(f"{len(entries)} credential(s) — project scope shadows global:")
|
|
6688
|
+
missing = 0
|
|
6578
6689
|
for name, entry in entries.items():
|
|
6579
|
-
|
|
6690
|
+
gone = not cred_store.is_resolvable(
|
|
6691
|
+
name, project_path=project_path, scope=entry["scope"])
|
|
6692
|
+
missing += gone
|
|
6693
|
+
print(" " + _creds_entry_line(name, entry, gone))
|
|
6694
|
+
if missing:
|
|
6695
|
+
print(f"\n{missing} entr{'y has' if missing == 1 else 'ies have'} no stored "
|
|
6696
|
+
"value (the OS keychain no longer holds it). Re-enter with "
|
|
6697
|
+
"`c3 creds set NAME` (add --global for global entries); the "
|
|
6698
|
+
"entry keeps its env var, description and flags.")
|
|
6580
6699
|
|
|
6581
6700
|
|
|
6582
6701
|
def _creds_cmd_rm(args, project_path: str) -> None:
|
|
@@ -520,16 +520,21 @@ def build_parser(version: str, parse_cli_ide_arg):
|
|
|
520
520
|
cr_set.add_argument("name", help="Entry name (env-var safe: [A-Za-z_][A-Za-z0-9_]*)")
|
|
521
521
|
cr_set.add_argument("--value", default="", help="Secret value (prompted via getpass if omitted — preferred). Structured types take a JSON object of fields")
|
|
522
522
|
cr_set.add_argument("--stdin", action="store_true", help="Read the value from stdin (piped/multiline values)")
|
|
523
|
+
# Every metadata option defaults to None = keep what an existing entry
|
|
524
|
+
# has, so re-entering a value does not reset its settings.
|
|
523
525
|
cr_set.add_argument("--type", dest="ctype",
|
|
524
526
|
choices=["token", "env", "multiline",
|
|
525
527
|
"address", "identity", "card", "login"],
|
|
526
|
-
default=
|
|
527
|
-
help="Entry type;
|
|
528
|
+
default=None,
|
|
529
|
+
help="Entry type (default: keep the entry's type; token for a new one); "
|
|
530
|
+
"address/identity/card/login are structured "
|
|
528
531
|
"(field payload, inject-only, never revealable to the agent)")
|
|
529
|
-
cr_set.add_argument("--desc", default=
|
|
530
|
-
cr_set.add_argument("--env-var", default=
|
|
531
|
-
cr_set.add_argument("--agent-readable", action=
|
|
532
|
-
|
|
532
|
+
cr_set.add_argument("--desc", default=None, help="Human description shown in list/UI (default: keep)")
|
|
533
|
+
cr_set.add_argument("--env-var", default=None, help="Env var name used at injection (default: keep; entry name for a new one)")
|
|
534
|
+
cr_set.add_argument("--agent-readable", action=argparse.BooleanOptionalAction, default=None,
|
|
535
|
+
help="Allow the agent to reveal the decoded value into its context (default: keep; injection-only for a new one)")
|
|
536
|
+
cr_set.add_argument("--inject", action=argparse.BooleanOptionalAction, default=None,
|
|
537
|
+
help="Auto-inject into every c3_shell run (default: keep; off for a new one)")
|
|
533
538
|
cr_set.add_argument("--global", dest="use_global", action="store_true", help="Store in the global scope (~/.c3) so every C3 project can use it")
|
|
534
539
|
# --path (not a trailing positional): a second positional after options
|
|
535
540
|
# breaks argparse on py<3.12 ("unrecognized arguments").
|
|
@@ -578,6 +583,16 @@ def build_parser(version: str, parse_cli_ide_arg):
|
|
|
578
583
|
cr_audit.add_argument("--json", dest="as_json", action="store_true", help="Emit raw JSON")
|
|
579
584
|
cr_audit.add_argument("--path", dest="project_path", default=".", help="Project directory (default: current)")
|
|
580
585
|
|
|
586
|
+
cr_backup = creds_subs.add_parser(
|
|
587
|
+
"backup", help="Passphrase-locked copy of every value that survives an OS keychain wipe")
|
|
588
|
+
cr_backup.add_argument(
|
|
589
|
+
"backup_cmd", choices=["init", "status", "sync", "restore", "passphrase"],
|
|
590
|
+
help="init: turn it on (asks for a passphrase) · status · sync: copy every live "
|
|
591
|
+
"value now · restore: put lost values back (asks for the passphrase) · "
|
|
592
|
+
"passphrase: change it")
|
|
593
|
+
cr_backup.add_argument("--only", default="", help="restore: comma-separated names (default: all lost values)")
|
|
594
|
+
cr_backup.add_argument("--path", dest="project_path", default=".", help="Project directory (default: current)")
|
|
595
|
+
|
|
581
596
|
# ── Agent Locks (docs/agent-locks.md) ───────────────────────────────
|
|
582
597
|
# force-release is human-only: it bumps the fencing counter so a holder
|
|
583
598
|
# that comes back is stale by construction. Agents get c3_locks instead,
|