code-context-control 2.62.0__tar.gz → 2.63.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.
Files changed (377) hide show
  1. {code_context_control-2.62.0 → code_context_control-2.63.0}/PKG-INFO +1 -1
  2. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/c3.py +184 -6
  3. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/commands/parser.py +42 -0
  4. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/guide/access.html +2 -1
  5. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/guide/bitbucket.html +1 -0
  6. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/guide/credentials.html +1 -0
  7. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/guide/getting-started.html +1 -0
  8. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/guide/index.html +9 -0
  9. code_context_control-2.63.0/cli/guide/masking.html +400 -0
  10. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/guide/oracle.html +1 -0
  11. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/guide/tools.html +1 -0
  12. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/guide/workflow.html +1 -0
  13. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/server.py +112 -2
  14. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/compress.py +34 -6
  15. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/read.py +28 -3
  16. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/search.py +23 -10
  17. code_context_control-2.63.0/cli/ui/components/access.js +675 -0
  18. {code_context_control-2.62.0 → code_context_control-2.63.0}/code_context_control.egg-info/PKG-INFO +1 -1
  19. {code_context_control-2.62.0 → code_context_control-2.63.0}/code_context_control.egg-info/SOURCES.txt +7 -0
  20. {code_context_control-2.62.0 → code_context_control-2.63.0}/pyproject.toml +1 -1
  21. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/access_guard.py +419 -30
  22. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/auto_memory.py +25 -7
  23. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/claude_md.py +1 -0
  24. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/compressor.py +51 -2
  25. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/file_memory.py +23 -0
  26. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/indexer.py +40 -1
  27. code_context_control-2.63.0/services/mask_activation.py +295 -0
  28. code_context_control-2.63.0/services/mask_mirror.py +341 -0
  29. code_context_control-2.63.0/services/mask_presets.py +293 -0
  30. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/memory.py +71 -1
  31. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_access_guard_meta.py +3 -1
  32. code_context_control-2.63.0/tests/test_mask_guard.py +496 -0
  33. code_context_control-2.63.0/tests/test_mask_routes.py +207 -0
  34. code_context_control-2.63.0/tests/test_mask_surfaces.py +256 -0
  35. code_context_control-2.62.0/cli/ui/components/access.js +0 -332
  36. {code_context_control-2.62.0 → code_context_control-2.63.0}/LICENSE +0 -0
  37. {code_context_control-2.62.0 → code_context_control-2.63.0}/README.md +0 -0
  38. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/__init__.py +0 -0
  39. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/_hook_utils.py +0 -0
  40. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/commands/__init__.py +0 -0
  41. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/commands/common.py +0 -0
  42. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/docs.html +0 -0
  43. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/edits.html +0 -0
  44. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/guide/shared.css +0 -0
  45. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hook_access_guard.py +0 -0
  46. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hook_artifact.py +0 -0
  47. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hook_auto_snapshot.py +0 -0
  48. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hook_c3_signal.py +0 -0
  49. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hook_c3read.py +0 -0
  50. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hook_dispatch.py +0 -0
  51. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hook_edit_ledger.py +0 -0
  52. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hook_edit_unlock.py +0 -0
  53. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hook_filter.py +0 -0
  54. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hook_ghost_files.py +0 -0
  55. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hook_pretool_enforce.py +0 -0
  56. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hook_prompt_recall.py +0 -0
  57. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hook_read.py +0 -0
  58. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hook_session_stats.py +0 -0
  59. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hook_terse_advisor.py +0 -0
  60. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub.html +0 -0
  61. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_server.py +0 -0
  62. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/app.js +0 -0
  63. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/add_project.js +0 -0
  64. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/config_editor.js +0 -0
  65. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/drill_artifacts.js +0 -0
  66. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/drill_health.js +0 -0
  67. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/drill_panel.js +0 -0
  68. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/drill_subprojects.js +0 -0
  69. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/drill_tasks.js +0 -0
  70. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/drill_views.js +0 -0
  71. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/global_search.js +0 -0
  72. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/hub_credentials.js +0 -0
  73. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/mcp_manager.js +0 -0
  74. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/modals.js +0 -0
  75. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/project_card.js +0 -0
  76. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/project_tree.js +0 -0
  77. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/session_drawer.js +0 -0
  78. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/settings_modal.js +0 -0
  79. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/sidebar.js +0 -0
  80. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/summary_bar.js +0 -0
  81. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/task_board.js +0 -0
  82. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/toasts.js +0 -0
  83. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/components/topbar.js +0 -0
  84. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui/state.js +0 -0
  85. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/hub_ui.html +0 -0
  86. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/mcp_proxy.py +0 -0
  87. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/mcp_server.py +0 -0
  88. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/progress.py +0 -0
  89. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/__init__.py +0 -0
  90. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/_helpers.py +0 -0
  91. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/agent.py +0 -0
  92. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/artifacts.py +0 -0
  93. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/bitbucket.py +0 -0
  94. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/credentials.py +0 -0
  95. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/delegate.py +0 -0
  96. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/edit.py +0 -0
  97. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/edits.py +0 -0
  98. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/federate.py +0 -0
  99. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/filter.py +0 -0
  100. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/impact.py +0 -0
  101. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/jira.py +0 -0
  102. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/memory.py +0 -0
  103. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/project.py +0 -0
  104. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/session.py +0 -0
  105. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/shell.py +0 -0
  106. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/status.py +0 -0
  107. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/tasks.py +0 -0
  108. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/tools/validate.py +0 -0
  109. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui/api.js +0 -0
  110. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui/app.js +0 -0
  111. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui/components/bitbucket.js +0 -0
  112. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui/components/chat.js +0 -0
  113. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui/components/credentials.js +0 -0
  114. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui/components/dashboard.js +0 -0
  115. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui/components/edits.js +0 -0
  116. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui/components/instructions.js +0 -0
  117. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui/components/jira.js +0 -0
  118. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui/components/memory.js +0 -0
  119. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui/components/sessions.js +0 -0
  120. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui/components/settings.js +0 -0
  121. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui/components/sidebar.js +0 -0
  122. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui/components/tasks.js +0 -0
  123. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui/icons.js +0 -0
  124. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui/pm_shared.js +0 -0
  125. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui/shared.js +0 -0
  126. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui/theme.js +0 -0
  127. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui.html +0 -0
  128. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui_legacy.html +0 -0
  129. {code_context_control-2.62.0 → code_context_control-2.63.0}/cli/ui_nano.html +0 -0
  130. {code_context_control-2.62.0 → code_context_control-2.63.0}/code_context_control.egg-info/dependency_links.txt +0 -0
  131. {code_context_control-2.62.0 → code_context_control-2.63.0}/code_context_control.egg-info/entry_points.txt +0 -0
  132. {code_context_control-2.62.0 → code_context_control-2.63.0}/code_context_control.egg-info/requires.txt +0 -0
  133. {code_context_control-2.62.0 → code_context_control-2.63.0}/code_context_control.egg-info/top_level.txt +0 -0
  134. {code_context_control-2.62.0 → code_context_control-2.63.0}/core/__init__.py +0 -0
  135. {code_context_control-2.62.0 → code_context_control-2.63.0}/core/config.py +0 -0
  136. {code_context_control-2.62.0 → code_context_control-2.63.0}/core/ide.py +0 -0
  137. {code_context_control-2.62.0 → code_context_control-2.63.0}/core/mcp_toml.py +0 -0
  138. {code_context_control-2.62.0 → code_context_control-2.63.0}/core/web_security.py +0 -0
  139. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/__init__.py +0 -0
  140. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/config.py +0 -0
  141. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/mcp_oracle.py +0 -0
  142. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/oracle_server.py +0 -0
  143. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/oracle_ui.html +0 -0
  144. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/services/__init__.py +0 -0
  145. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/services/activity_reporter.py +0 -0
  146. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/services/api_auth.py +0 -0
  147. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/services/c3_bridge.py +0 -0
  148. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/services/chat_engine.py +0 -0
  149. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/services/chat_store.py +0 -0
  150. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/services/cross_memory.py +0 -0
  151. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/services/federated_graph.py +0 -0
  152. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/services/health_checker.py +0 -0
  153. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/services/insight_engine.py +0 -0
  154. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/services/local_session.py +0 -0
  155. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/services/memory_reader.py +0 -0
  156. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/services/memory_writer.py +0 -0
  157. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/services/project_scanner.py +0 -0
  158. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/services/review_agent.py +0 -0
  159. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/services/tool_executor.py +0 -0
  160. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/services/tool_registry.py +0 -0
  161. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/ui/activity.js +0 -0
  162. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/ui/agents.js +0 -0
  163. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/ui/app.js +0 -0
  164. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/ui/busy.js +0 -0
  165. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/ui/chat/conversations.js +0 -0
  166. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/ui/chat/input.js +0 -0
  167. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/ui/chat/markdown.js +0 -0
  168. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/ui/chat/send.js +0 -0
  169. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/ui/chat/stream_renderer.js +0 -0
  170. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/ui/chat/toolbar.js +0 -0
  171. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/ui/core.js +0 -0
  172. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/ui/crossgraph.js +0 -0
  173. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/ui/header.js +0 -0
  174. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/ui/insights.js +0 -0
  175. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/ui/projects.js +0 -0
  176. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/ui/settings.js +0 -0
  177. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/ui/suggestions.js +0 -0
  178. {code_context_control-2.62.0 → code_context_control-2.63.0}/oracle/ui/theme_tabs.js +0 -0
  179. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/__init__.py +0 -0
  180. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/activity_log.py +0 -0
  181. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/agent_base.py +0 -0
  182. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/agents.py +0 -0
  183. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/artifact_defs.py +0 -0
  184. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/artifact_store.py +0 -0
  185. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/bench/__init__.py +0 -0
  186. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/bench/external/__init__.py +0 -0
  187. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/bench/external/aider_polyglot.py +0 -0
  188. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/bench/external/swe_bench.py +0 -0
  189. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/benchmark_dashboard.py +0 -0
  190. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/bitbucket_client.py +0 -0
  191. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/bitbucket_credentials.py +0 -0
  192. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/circuit_breaker.py +0 -0
  193. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/context_snapshot.py +0 -0
  194. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/conversation_store.py +0 -0
  195. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/credential_store.py +0 -0
  196. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/doc_index.py +0 -0
  197. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/e2e_benchmark.py +0 -0
  198. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/e2e_evaluator.py +0 -0
  199. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/e2e_tasks.py +0 -0
  200. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/edit_ledger.py +0 -0
  201. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/embedding_index.py +0 -0
  202. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/error_reporting.py +0 -0
  203. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/git_context.py +0 -0
  204. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/hub_service.py +0 -0
  205. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/jira_client.py +0 -0
  206. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/jira_cloud.py +0 -0
  207. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/jira_credentials.py +0 -0
  208. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/jira_data_center.py +0 -0
  209. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/jira_links.py +0 -0
  210. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/memory_consolidator.py +0 -0
  211. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/memory_distiller.py +0 -0
  212. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/memory_graph.py +0 -0
  213. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/memory_grounder.py +0 -0
  214. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/memory_queue.py +0 -0
  215. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/memory_scorer.py +0 -0
  216. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/metrics.py +0 -0
  217. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/notifications.py +0 -0
  218. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/ollama_bridge.py +0 -0
  219. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/ollama_client.py +0 -0
  220. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/ollama_credentials.py +0 -0
  221. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/output_filter.py +0 -0
  222. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/parser.py +0 -0
  223. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/project_manager.py +0 -0
  224. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/project_runtime.py +0 -0
  225. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/protocol.py +0 -0
  226. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/proxy_state.py +0 -0
  227. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/repo_map.py +0 -0
  228. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/retention.py +0 -0
  229. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/retrieval_broker.py +0 -0
  230. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/router.py +0 -0
  231. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/runtime.py +0 -0
  232. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/scanner.py +0 -0
  233. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/session_benchmark.py +0 -0
  234. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/session_manager.py +0 -0
  235. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/session_preloader.py +0 -0
  236. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/subprojects.py +0 -0
  237. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/task_store.py +0 -0
  238. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/telemetry.py +0 -0
  239. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/text_index.py +0 -0
  240. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/time_tracker.py +0 -0
  241. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/tool_classifier.py +0 -0
  242. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/transcript_index.py +0 -0
  243. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/validation_cache.py +0 -0
  244. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/vector_store.py +0 -0
  245. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/watcher.py +0 -0
  246. {code_context_control-2.62.0 → code_context_control-2.63.0}/services/win_subprocess.py +0 -0
  247. {code_context_control-2.62.0 → code_context_control-2.63.0}/setup.cfg +0 -0
  248. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_access_guard.py +0 -0
  249. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_access_guard_shell_project.py +0 -0
  250. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_access_guard_surfaces.py +0 -0
  251. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_access_guard_wiring.py +0 -0
  252. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_activity_reporter.py +0 -0
  253. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_aider_polyglot.py +0 -0
  254. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_antigravity_transition.py +0 -0
  255. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_artifact_store.py +0 -0
  256. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_artifact_tool.py +0 -0
  257. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_bitbucket_cli_smoke.py +0 -0
  258. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_bitbucket_client.py +0 -0
  259. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_bitbucket_config_fallback.py +0 -0
  260. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_bitbucket_credentials.py +0 -0
  261. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_bitbucket_tool.py +0 -0
  262. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_c3_bridge_project_artifacts.py +0 -0
  263. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_c3_shell.py +0 -0
  264. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_circuit_breaker.py +0 -0
  265. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_claude_md_merge.py +0 -0
  266. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_cli_smoke.py +0 -0
  267. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_compressor_large_file.py +0 -0
  268. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_credential_store.py +0 -0
  269. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_credentials_routes.py +0 -0
  270. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_credentials_tool.py +0 -0
  271. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_creds_cli_smoke.py +0 -0
  272. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_delegate_cascade.py +0 -0
  273. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_e2e_benchmark.py +0 -0
  274. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_edit_ledger_hook.py +0 -0
  275. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_edit_normalization.py +0 -0
  276. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_enforcement_flip.py +0 -0
  277. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_federated_graph.py +0 -0
  278. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_filter_backoff.py +0 -0
  279. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_ghost_files.py +0 -0
  280. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_ghost_generation.py +0 -0
  281. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_git_branch_awareness.py +0 -0
  282. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_hook_access_guard.py +0 -0
  283. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_hook_dispatch.py +0 -0
  284. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_hook_pretool_enforce.py +0 -0
  285. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_hook_prompt_recall.py +0 -0
  286. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_hook_smoke.py +0 -0
  287. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_hook_state.py +0 -0
  288. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_hook_utf8_stdio.py +0 -0
  289. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_hub_credentials_route.py +0 -0
  290. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_hub_credentials_routes_write.py +0 -0
  291. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_hub_inspect_api.py +0 -0
  292. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_hub_server_smoke.py +0 -0
  293. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_hub_subproject_links.py +0 -0
  294. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_init_scan.py +0 -0
  295. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_install_mcp_entrypoint.py +0 -0
  296. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_jira_cli_smoke.py +0 -0
  297. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_jira_client.py +0 -0
  298. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_jira_config_fallback.py +0 -0
  299. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_jira_credentials.py +0 -0
  300. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_jira_links.py +0 -0
  301. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_jira_routes.py +0 -0
  302. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_jira_tool.py +0 -0
  303. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_lazy_store_init.py +0 -0
  304. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_mcp_host_guard.py +0 -0
  305. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_mcp_memory_timeout.py +0 -0
  306. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_mcp_server_smoke.py +0 -0
  307. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_mcp_toml.py +0 -0
  308. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_memory_distiller.py +0 -0
  309. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_memory_graph_api.py +0 -0
  310. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_memory_queue.py +0 -0
  311. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_memory_system.py +0 -0
  312. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_no_stale_model_pins.py +0 -0
  313. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_notification_dedup.py +0 -0
  314. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_notification_discipline.py +0 -0
  315. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_ollama_credentials.py +0 -0
  316. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_oracle_api_auth.py +0 -0
  317. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_oracle_apikey_api.py +0 -0
  318. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_oracle_c3_bridge.py +0 -0
  319. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_oracle_chat_engine.py +0 -0
  320. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_oracle_discovery_api.py +0 -0
  321. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_oracle_local_auth.py +0 -0
  322. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_oracle_ollama_bridge.py +0 -0
  323. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_oracle_scanner_cache.py +0 -0
  324. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_oracle_security_fixes.py +0 -0
  325. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_oracle_subproject_awareness.py +0 -0
  326. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_oracle_ui_bundle.py +0 -0
  327. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_output_filter.py +0 -0
  328. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_permissions.py +0 -0
  329. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_pm_api.py +0 -0
  330. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_project_manager.py +0 -0
  331. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_project_manager_merge.py +0 -0
  332. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_project_tool.py +0 -0
  333. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_read_coercion.py +0 -0
  334. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_read_edit_parity.py +0 -0
  335. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_related_facts.py +0 -0
  336. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_repo_map.py +0 -0
  337. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_response_boilerplate.py +0 -0
  338. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_retention.py +0 -0
  339. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_review_digest.py +0 -0
  340. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_service_durability.py +0 -0
  341. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_session_benchmark.py +0 -0
  342. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_session_budget.py +0 -0
  343. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_shell_creds.py +0 -0
  344. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_shell_robustness.py +0 -0
  345. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_subproject_exclusion.py +0 -0
  346. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_subproject_federation.py +0 -0
  347. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_subprojects.py +0 -0
  348. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_swe_bench.py +0 -0
  349. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_task_store.py +0 -0
  350. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_task_tool.py +0 -0
  351. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_time_tracker.py +0 -0
  352. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_token_telemetry.py +0 -0
  353. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_tool_registry.py +0 -0
  354. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_upgrade_and_version.py +0 -0
  355. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_validate.py +0 -0
  356. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_vault_write_guard.py +0 -0
  357. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_version_sync.py +0 -0
  358. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_web_security.py +0 -0
  359. {code_context_control-2.62.0 → code_context_control-2.63.0}/tests/test_windows_reliability.py +0 -0
  360. {code_context_control-2.62.0 → code_context_control-2.63.0}/tui/__init__.py +0 -0
  361. {code_context_control-2.62.0 → code_context_control-2.63.0}/tui/backend.py +0 -0
  362. {code_context_control-2.62.0 → code_context_control-2.63.0}/tui/main.py +0 -0
  363. {code_context_control-2.62.0 → code_context_control-2.63.0}/tui/screens/__init__.py +0 -0
  364. {code_context_control-2.62.0 → code_context_control-2.63.0}/tui/screens/benchmark_view.py +0 -0
  365. {code_context_control-2.62.0 → code_context_control-2.63.0}/tui/screens/claudemd_view.py +0 -0
  366. {code_context_control-2.62.0 → code_context_control-2.63.0}/tui/screens/compress_view.py +0 -0
  367. {code_context_control-2.62.0 → code_context_control-2.63.0}/tui/screens/index_view.py +0 -0
  368. {code_context_control-2.62.0 → code_context_control-2.63.0}/tui/screens/init_view.py +0 -0
  369. {code_context_control-2.62.0 → code_context_control-2.63.0}/tui/screens/mcp_view.py +0 -0
  370. {code_context_control-2.62.0 → code_context_control-2.63.0}/tui/screens/optimize_view.py +0 -0
  371. {code_context_control-2.62.0 → code_context_control-2.63.0}/tui/screens/pipe_view.py +0 -0
  372. {code_context_control-2.62.0 → code_context_control-2.63.0}/tui/screens/projects_view.py +0 -0
  373. {code_context_control-2.62.0 → code_context_control-2.63.0}/tui/screens/search_view.py +0 -0
  374. {code_context_control-2.62.0 → code_context_control-2.63.0}/tui/screens/session_view.py +0 -0
  375. {code_context_control-2.62.0 → code_context_control-2.63.0}/tui/screens/stats.py +0 -0
  376. {code_context_control-2.62.0 → code_context_control-2.63.0}/tui/screens/ui_view.py +0 -0
  377. {code_context_control-2.62.0 → code_context_control-2.63.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.62.0
3
+ Version: 2.63.0
4
4
  Summary: Local code-intelligence layer for AI coding tools (Claude Code, Codex, Copilot, Cursor, Antigravity). Retrieve less, read less, edit safer — version the configs that shape your agent (CLAUDE.md, skills, hooks, MCP), and manage multi-project + sub-project hierarchies from a local hub.
5
5
  Author-email: Dimitri Tselenchuk <dtselenc@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -92,7 +92,7 @@ console = Console() if HAS_RICH else None
92
92
  # Config
93
93
  CONFIG_DIR = ".c3"
94
94
  CONFIG_FILE = ".c3/config.json"
95
- __version__ = "2.62.0"
95
+ __version__ = "2.63.0"
96
96
 
97
97
 
98
98
  def _compress_file_cli(compressor, path, mode="smart", **kw):
@@ -4670,6 +4670,7 @@ back to native tools as the task progresses.
4670
4670
  - **Delegate**: `c3_delegate(task, backend='ollama|codex|gemini|claude|auto')` — offload to other models
4671
4671
  - **Bitbucket** (v2.30.0+, when `c3 bitbucket login` has run): `c3_bitbucket(action='list_prs|get_pr|merge_pr|...')` — self-hosted Bitbucket Data Center / Server. Token in OS keyring; mutating actions auto-log to the edit ledger.
4672
4672
  - **Cross-project** (v2.31.0+): `c3_project(action='list|scan|search|read|edit|...', project='<name|path>')` — discover and operate on OTHER c3-installed projects. Reads run freely; writes (edit/shell/memory) need `allow_write=true`.
4673
+ - **Masked paths** (v2.63.0+): content prefixed `[c3-mask:transformed]` is a policy-transformed VIEW, not the file. Values may be synthetic, rows withheld, bodies stripped — don't copy literals out of it or infer completeness from it. Masked paths are read-only and refuse shell/git/validate/impact/filter/delegate (`[c3-mask:unsupported]`). That's policy, not a transient error — report the block instead of routing around it.
4673
4674
 
4674
4675
  ## Self-Check
4675
4676
  If you haven't called a c3_* tool in several turns during active development, re-engage
@@ -5918,7 +5919,8 @@ def cmd_access(args):
5918
5919
  """Access Guard rule management — human-only mutation surface (spec §1)."""
5919
5920
  sub = getattr(args, "access_cmd", None)
5920
5921
  if not sub:
5921
- print("Usage: c3 access {list,add,remove,check} [args]")
5922
+ print("Usage: c3 access {list,add,remove,check,mask} [args]")
5923
+ print(" c3 access mask {add,rm,status,activate,preview} [args]")
5922
5924
  return
5923
5925
 
5924
5926
  project_path = getattr(args, "project_path", ".") or "."
@@ -5931,6 +5933,8 @@ def cmd_access(args):
5931
5933
  _access_cmd_remove(args, project_path)
5932
5934
  elif sub == "check":
5933
5935
  _access_cmd_check(args, project_path)
5936
+ elif sub == "mask":
5937
+ _access_cmd_mask(args, project_path)
5934
5938
  else:
5935
5939
  print(f"Unknown access subcommand: {sub}")
5936
5940
 
@@ -5973,13 +5977,24 @@ def _access_cmd_list(args, project_path: str) -> None:
5973
5977
  for scope in ("builtin", "global", "project"):
5974
5978
  sec = scopes.get(scope) or {}
5975
5979
  rules = [(k, g) for k in ("deny", "read_only") for g in sec.get(k, [])]
5976
- print(f"[{scope}] ({notes[scope]}) — {len(rules)} rule(s)")
5980
+ masks = sec.get("mask") or []
5981
+ print(f"[{scope}] ({notes[scope]}) — {len(rules) + len(masks)} rule(s)")
5977
5982
  for kind, glob in rules:
5978
5983
  print(f" {kind:<10} {glob}")
5984
+ for entry in masks:
5985
+ params = entry.get("params") or {}
5986
+ detail = ", ".join(f"{k}={v}" for k, v in sorted(params.items()))
5987
+ print(f" {'mask':<10} {entry.get('glob')} -> "
5988
+ f"{entry.get('preset')}" + (f"({detail})" if detail else ""))
5979
5989
  if sec.get("corrupt"):
5980
5990
  print(" [warn] access section invalid — scope fails closed "
5981
5991
  "(deny-all); fix config.json 'access' by hand")
5982
5992
  print()
5993
+ from services import mask_activation
5994
+ summary = mask_activation.summary_line(project_path)
5995
+ if summary:
5996
+ print(summary)
5997
+ print()
5983
5998
  print(access_guard.COVERAGE_MATRIX)
5984
5999
 
5985
6000
 
@@ -6021,11 +6036,174 @@ def _access_cmd_check(args, project_path: str) -> None:
6021
6036
  from services import access_guard
6022
6037
 
6023
6038
  op = getattr(args, "op", "read") or "read"
6024
- denial = access_guard.check(args.target, op, project_path)
6025
- if denial is None:
6039
+ v = access_guard.verdict(args.target, op, project_path)
6040
+ if v.masked:
6041
+ rule = v.mask_rule
6042
+ print(f"[MASKED] {op} served as a transformed view: {args.target}")
6043
+ print(f" rule '{rule.glob}' ({rule.scope} scope) -> {rule.preset}")
6044
+ print(" Preview what the agent sees: "
6045
+ f"c3 access mask preview {args.target}")
6046
+ elif v.denial is None:
6026
6047
  print(f"[OK] {op} allowed: {args.target}")
6027
6048
  else:
6028
- print(access_guard.refusal(denial, args.target, op))
6049
+ print(access_guard.refusal(v.denial, args.target, op))
6050
+
6051
+
6052
+ # ── mask subcommands ────────────────────────────────────────────────────────
6053
+
6054
+ def _parse_mask_params(raw: str, preset: str) -> dict:
6055
+ """`count=20,strategy=first` / `columns=email,name` -> typed params."""
6056
+ from services import access_guard
6057
+
6058
+ schema = (access_guard.MASK_PRESETS.get(preset) or {}).get("params", {})
6059
+ params: dict = {}
6060
+ for chunk in (raw or "").split(","):
6061
+ chunk = chunk.strip()
6062
+ if not chunk:
6063
+ continue
6064
+ if "=" not in chunk:
6065
+ # bare value continues the previous list param (columns=a,b,c)
6066
+ last = next((k for k in reversed(list(params))
6067
+ if schema.get(k) is list), None)
6068
+ if last:
6069
+ params[last].append(chunk)
6070
+ continue
6071
+ raise ValueError(f"cannot parse param '{chunk}' — use key=value")
6072
+ key, value = (part.strip() for part in chunk.split("=", 1))
6073
+ expected = schema.get(key)
6074
+ if expected is int:
6075
+ params[key] = int(value)
6076
+ elif expected is list:
6077
+ params[key] = [value]
6078
+ else:
6079
+ params[key] = value
6080
+ return params
6081
+
6082
+
6083
+ def _access_cmd_mask_add(args, project_path: str) -> None:
6084
+ from services import access_guard, mask_activation
6085
+
6086
+ scope = _access_scope(args)
6087
+ try:
6088
+ params = _parse_mask_params(getattr(args, "params", "") or "",
6089
+ args.preset)
6090
+ result = access_guard.set_mask_rule(args.glob, args.preset, params,
6091
+ scope, project_path)
6092
+ except ValueError as exc:
6093
+ print(f"[error] {exc}")
6094
+ return
6095
+ _access_audit("mask-add", result["glob"], args.preset, scope, project_path)
6096
+ verb = "Replaced" if result["replaced"] else "Added"
6097
+ print(f"[OK] {verb} mask rule '{result['glob']}' -> {args.preset} "
6098
+ f"(scope={scope})")
6099
+ print()
6100
+ print(mask_activation.summary_line(project_path))
6101
+ print("Run `c3 access mask activate` to purge pre-mask derived artifacts.")
6102
+
6103
+
6104
+ def _access_cmd_mask_remove(args, project_path: str) -> None:
6105
+ from services import access_guard
6106
+
6107
+ scope = _access_scope(args)
6108
+ try:
6109
+ result = access_guard.remove_mask_rule(args.glob, scope, project_path)
6110
+ except ValueError as exc:
6111
+ print(f"[error] {exc}")
6112
+ return
6113
+ if result["removed"]:
6114
+ _access_audit("mask-remove", result["glob"], "mask", scope,
6115
+ project_path)
6116
+ print(f"[OK] Removed mask rule '{result['glob']}' (scope={scope})")
6117
+ else:
6118
+ print(f"[error] no mask rule matching '{result['glob']}' "
6119
+ f"in {scope} scope")
6120
+
6121
+
6122
+ def _access_cmd_mask_status(args, project_path: str) -> None:
6123
+ from services import mask_activation
6124
+
6125
+ st = mask_activation.status(project_path)
6126
+ print(f"rules : {st['rule_count']}")
6127
+ print(f"status : {st['status']}")
6128
+ print(f"stale : {st['stale']}")
6129
+ if st["corrupt_scopes"]:
6130
+ print(f"corrupt : {', '.join(st['corrupt_scopes'])}")
6131
+ report = st.get("last_report") or {}
6132
+ if report:
6133
+ print(f"last run : {report.get('views_built', 0)} view(s) built, "
6134
+ f"{len(report.get('failures') or [])} failure(s)")
6135
+ for failure in (report.get("failures") or [])[:10]:
6136
+ print(f" [fail] {failure['path']}: {failure['detail']}")
6137
+ print()
6138
+ print(mask_activation.summary_line(project_path) or "no mask rules")
6139
+
6140
+
6141
+ def _access_cmd_mask_activate(args, project_path: str) -> None:
6142
+ from services import mask_activation
6143
+
6144
+ print("Activating mask rules (purge -> build -> validate)...")
6145
+ report = mask_activation.activate(
6146
+ project_path, rebuild_index=bool(getattr(args, "reindex", False)))
6147
+ print(f" files matched : {report['files']}")
6148
+ print(f" views built : {report['views_built']}")
6149
+ print(f" cache entries wiped: {report['cache_entries_removed']}")
6150
+ print(f" index dropped : {report['index_dropped']}")
6151
+ print(f" file memory dropped: {report['file_memory_dropped']}")
6152
+ facts = report.get("facts") or {}
6153
+ print(f" facts purged : {facts.get('purged', 0)} "
6154
+ f"(+{facts.get('unknown_purged', 0)} unknown-provenance)")
6155
+ for failure in report.get("failures") or []:
6156
+ print(f" [fail] {failure['path']}: {failure['detail']}")
6157
+ _access_audit("mask-activate", f"{report['files']} file(s)", "mask",
6158
+ "project", project_path)
6159
+ print()
6160
+ print(mask_activation.summary_line(project_path))
6161
+
6162
+
6163
+ def _access_cmd_mask_preview(args, project_path: str) -> None:
6164
+ """Show exactly what the agent will see. Human surface only."""
6165
+ from pathlib import Path as _Path
6166
+
6167
+ from services import access_guard, mask_mirror
6168
+
6169
+ target = _Path(args.target)
6170
+ if not target.is_absolute():
6171
+ target = _Path(project_path) / args.target
6172
+ v = access_guard.verdict(str(target), "read", project_path)
6173
+ if v.denial:
6174
+ print(access_guard.refusal(v.denial, str(target), "read"))
6175
+ return
6176
+ if not v.masked:
6177
+ print(f"[=] Not masked: {args.target} — the agent sees the real file.")
6178
+ return
6179
+ try:
6180
+ view = mask_mirror.render_for_path(target, project_path)
6181
+ except mask_mirror.MaskUnavailable as exc:
6182
+ print(f"[error] {exc.message}")
6183
+ return
6184
+ print(f"rule : '{v.mask_rule.glob}' ({v.mask_rule.scope} scope)")
6185
+ print(f"preset : {v.mask_rule.preset} {v.mask_rule.params_dict or ''}")
6186
+ print(f"stats : {view.stats}")
6187
+ print("-" * 70)
6188
+ print(view.with_header(args.target))
6189
+
6190
+
6191
+ def _access_cmd_mask(args, project_path: str) -> None:
6192
+ sub = getattr(args, "mask_cmd", None) or "status"
6193
+ handlers = {
6194
+ "add": _access_cmd_mask_add,
6195
+ "rm": _access_cmd_mask_remove,
6196
+ "remove": _access_cmd_mask_remove,
6197
+ "status": _access_cmd_mask_status,
6198
+ "activate": _access_cmd_mask_activate,
6199
+ "preview": _access_cmd_mask_preview,
6200
+ }
6201
+ handler = handlers.get(sub)
6202
+ if handler is None:
6203
+ print(f"[error] unknown mask subcommand '{sub}' — expected one of: "
6204
+ f"{', '.join(sorted(handlers))}")
6205
+ return
6206
+ handler(args, project_path)
6029
6207
 
6030
6208
 
6031
6209
  def cmd_jira(args):
@@ -483,6 +483,48 @@ def build_parser(version: str, parse_cli_ide_arg):
483
483
  help="Operation to evaluate (default: read)")
484
484
  ac_check.add_argument("--path", dest="project_path", default=".", help="Project directory (default: current)")
485
485
 
486
+ # ── Mask Guard (v2.63.0, docs/mask-guard.md) ────────────────────────
487
+ # Masking exposes a path but transforms what the agent sees. Rules are
488
+ # human-only, like the rest of Access Guard.
489
+ ac_mask = access_subs.add_parser(
490
+ "mask", help="Mask Guard — expose a path but transform what the agent sees")
491
+ mask_subs = ac_mask.add_subparsers(dest="mask_cmd")
492
+
493
+ am_add = mask_subs.add_parser("add", help="Add or replace a mask rule")
494
+ am_add.add_argument("glob", help="POSIX glob, e.g. 'data/**' or '*.csv'")
495
+ am_add.add_argument("--preset", required=True,
496
+ choices=["redact_secrets", "redact_columns",
497
+ "sample_rows", "signatures_only"],
498
+ help="Deterministic transform applied to matching files")
499
+ am_add.add_argument("--params", default="",
500
+ help="Preset params, e.g. 'count=20,strategy=first' "
501
+ "or 'columns=email,name'")
502
+ am_add.add_argument("--global", dest="use_global", action="store_true",
503
+ help="Store in the global scope (~/.c3)")
504
+ am_add.add_argument("--path", dest="project_path", default=".", help="Project directory (default: current)")
505
+
506
+ am_rm = mask_subs.add_parser("rm", help="Remove a mask rule")
507
+ am_rm.add_argument("glob", help="The stored glob to remove")
508
+ am_rm.add_argument("--global", dest="use_global", action="store_true",
509
+ help="Remove from the global scope (~/.c3)")
510
+ am_rm.add_argument("--path", dest="project_path", default=".", help="Project directory (default: current)")
511
+
512
+ am_status = mask_subs.add_parser(
513
+ "status", help="Activation state — whether masking is actually in effect")
514
+ am_status.add_argument("--path", dest="project_path", default=".", help="Project directory (default: current)")
515
+
516
+ am_act = mask_subs.add_parser(
517
+ "activate",
518
+ help="Purge pre-mask derived artifacts, then build + validate views")
519
+ am_act.add_argument("--reindex", action="store_true",
520
+ help="Also rebuild the code index in the same pass")
521
+ am_act.add_argument("--path", dest="project_path", default=".", help="Project directory (default: current)")
522
+
523
+ am_prev = mask_subs.add_parser(
524
+ "preview", help="Show exactly what the agent sees for one path")
525
+ am_prev.add_argument("target", help="Path to preview (absolute or project-relative)")
526
+ am_prev.add_argument("--path", dest="project_path", default=".", help="Project directory (default: current)")
527
+
486
528
  # ── Oracle Discovery API (v2.32.0) ──────────────────────────────────
487
529
  p_oracle = subparsers.add_parser(
488
530
  "oracle",
@@ -74,11 +74,12 @@
74
74
  <a href="tools.html">Tools</a>
75
75
  <a href="credentials.html">Credentials</a>
76
76
  <a href="access.html" class="active">Access</a>
77
+ <a href="masking.html">Masking</a>
77
78
  <a href="bitbucket.html">Bitbucket</a>
78
79
  <a href="oracle.html">Oracle</a>
79
80
  <a href="https://github.com/sponsors/drknowhow" target="_blank" rel="noopener" style="color:#EA4AAA">&#9829; Sponsor</a>
80
81
  </nav>
81
- <span class="header-version">v2.62.0</span>
82
+ <span class="header-version">v2.63.0</span>
82
83
  </header>
83
84
 
84
85
  <!-- Sidebar -->
@@ -79,6 +79,7 @@
79
79
  <a href="tools.html">Tools</a>
80
80
  <a href="credentials.html">Credentials</a>
81
81
  <a href="access.html">Access</a>
82
+ <a href="masking.html">Masking</a>
82
83
  <a href="bitbucket.html" class="active">Bitbucket</a>
83
84
  <a href="oracle.html">Oracle</a>
84
85
  <a href="https://github.com/sponsors/drknowhow" target="_blank" rel="noopener" style="color:#EA4AAA">&#9829; Sponsor</a>
@@ -88,6 +88,7 @@
88
88
  <a href="tools.html">Tools</a>
89
89
  <a href="credentials.html" class="active">Credentials</a>
90
90
  <a href="access.html">Access</a>
91
+ <a href="masking.html">Masking</a>
91
92
  <a href="bitbucket.html">Bitbucket</a>
92
93
  <a href="oracle.html">Oracle</a>
93
94
  <a href="https://github.com/sponsors/drknowhow" target="_blank" rel="noopener" style="color:#EA4AAA">&#9829; Sponsor</a>
@@ -22,6 +22,7 @@
22
22
  <a href="tools.html">Tools</a>
23
23
  <a href="credentials.html">Credentials</a>
24
24
  <a href="access.html">Access</a>
25
+ <a href="masking.html">Masking</a>
25
26
  <a href="bitbucket.html">Bitbucket</a>
26
27
  <a href="oracle.html">Oracle</a>
27
28
  <a href="https://github.com/sponsors/drknowhow" target="_blank" rel="noopener" style="color:#EA4AAA">&#9829; Sponsor</a>
@@ -224,6 +224,7 @@
224
224
  <a href="tools.html">Tools</a>
225
225
  <a href="credentials.html">Credentials</a>
226
226
  <a href="access.html">Access</a>
227
+ <a href="masking.html">Masking</a>
227
228
  <a href="bitbucket.html">Bitbucket</a>
228
229
  <a href="oracle.html">Oracle</a>
229
230
  <a href="https://github.com/sponsors/drknowhow" target="_blank" rel="noopener" style="color:#EA4AAA">&#9829; Sponsor</a>
@@ -262,6 +263,9 @@
262
263
  <a href="access.html" class="sidebar-link">
263
264
  <span class="icon">🛡️</span> Access Guard
264
265
  </a>
266
+ <a href="masking.html" class="sidebar-link">
267
+ <span class="icon">🎭</span> Mask Guard
268
+ </a>
265
269
  <a href="bitbucket.html" class="sidebar-link">
266
270
  <span class="icon">🪣</span> Bitbucket
267
271
  </a>
@@ -330,6 +334,11 @@
330
334
  <div class="nav-card-title">Access Guard</div>
331
335
  <div class="nav-card-desc">Paths agents must never read or write — deny/read-only globs enforced at every C3 surface, with honest coverage limits (v2.62.0+)</div>
332
336
  </a>
337
+ <a href="masking.html" class="nav-card">
338
+ <span class="nav-card-icon">🎭</span>
339
+ <div class="nav-card-title">Mask Guard</div>
340
+ <div class="nav-card-desc">Expose a path but control what the agent sees — redact secrets, pseudonymise columns, sample rows, signatures only. Deterministic, read-only, fail-closed (v2.63.0+)</div>
341
+ </a>
333
342
  <a href="bitbucket.html" class="nav-card">
334
343
  <span class="nav-card-icon">🪣</span>
335
344
  <div class="nav-card-title">Bitbucket Data Center</div>