code-context-control 2.42.0__tar.gz → 2.44.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 (267) hide show
  1. {code_context_control-2.42.0 → code_context_control-2.44.0}/PKG-INFO +13 -6
  2. {code_context_control-2.42.0 → code_context_control-2.44.0}/README.md +12 -5
  3. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/c3.py +165 -3
  4. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/commands/parser.py +27 -0
  5. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/hook_ghost_files.py +15 -0
  6. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/hub_server.py +598 -1
  7. code_context_control-2.44.0/cli/hub_ui/app.js +131 -0
  8. code_context_control-2.44.0/cli/hub_ui/components/add_project.js +79 -0
  9. code_context_control-2.44.0/cli/hub_ui/components/config_editor.js +233 -0
  10. code_context_control-2.44.0/cli/hub_ui/components/drill_health.js +297 -0
  11. code_context_control-2.44.0/cli/hub_ui/components/drill_panel.js +166 -0
  12. code_context_control-2.44.0/cli/hub_ui/components/drill_views.js +333 -0
  13. code_context_control-2.44.0/cli/hub_ui/components/global_search.js +184 -0
  14. code_context_control-2.44.0/cli/hub_ui/components/mcp_manager.js +379 -0
  15. code_context_control-2.44.0/cli/hub_ui/components/modals.js +619 -0
  16. code_context_control-2.44.0/cli/hub_ui/components/project_card.js +408 -0
  17. code_context_control-2.44.0/cli/hub_ui/components/project_tree.js +103 -0
  18. code_context_control-2.44.0/cli/hub_ui/components/session_drawer.js +178 -0
  19. code_context_control-2.44.0/cli/hub_ui/components/settings_modal.js +210 -0
  20. code_context_control-2.44.0/cli/hub_ui/components/sidebar.js +106 -0
  21. code_context_control-2.44.0/cli/hub_ui/components/summary_bar.js +71 -0
  22. code_context_control-2.44.0/cli/hub_ui/components/toasts.js +70 -0
  23. code_context_control-2.44.0/cli/hub_ui/components/topbar.js +64 -0
  24. code_context_control-2.44.0/cli/hub_ui/state.js +147 -0
  25. code_context_control-2.44.0/cli/hub_ui.html +138 -0
  26. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/mcp_server.py +12 -6
  27. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/tools/_helpers.py +20 -0
  28. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/tools/compress.py +47 -19
  29. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/tools/delegate.py +4 -3
  30. code_context_control-2.44.0/cli/tools/federate.py +121 -0
  31. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/tools/filter.py +22 -9
  32. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/tools/memory.py +32 -8
  33. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/tools/project.py +103 -2
  34. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/tools/search.py +42 -9
  35. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/tools/status.py +21 -6
  36. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/ui/icons.js +11 -0
  37. {code_context_control-2.42.0 → code_context_control-2.44.0}/code_context_control.egg-info/PKG-INFO +13 -6
  38. {code_context_control-2.42.0 → code_context_control-2.44.0}/code_context_control.egg-info/SOURCES.txt +30 -0
  39. {code_context_control-2.42.0 → code_context_control-2.44.0}/core/config.py +7 -0
  40. {code_context_control-2.42.0 → code_context_control-2.44.0}/pyproject.toml +5 -1
  41. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/activity_log.py +32 -1
  42. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/agents.py +33 -1
  43. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/bench/external/aider_polyglot.py +3 -1
  44. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/bench/external/swe_bench.py +3 -1
  45. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/doc_index.py +12 -0
  46. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/e2e_benchmark.py +4 -3
  47. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/e2e_evaluator.py +3 -1
  48. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/edit_ledger.py +216 -3
  49. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/file_memory.py +46 -0
  50. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/indexer.py +18 -0
  51. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/notifications.py +39 -0
  52. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/project_manager.py +29 -1
  53. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/project_runtime.py +6 -1
  54. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/protocol.py +8 -0
  55. code_context_control-2.44.0/services/retention.py +438 -0
  56. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/runtime.py +11 -0
  57. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/session_manager.py +29 -0
  58. code_context_control-2.44.0/services/subprojects.py +591 -0
  59. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/telemetry.py +92 -6
  60. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/watcher.py +10 -2
  61. code_context_control-2.44.0/services/win_subprocess.py +98 -0
  62. code_context_control-2.44.0/tests/test_cli_smoke.py +132 -0
  63. code_context_control-2.44.0/tests/test_ghost_generation.py +200 -0
  64. code_context_control-2.44.0/tests/test_hub_inspect_api.py +221 -0
  65. code_context_control-2.44.0/tests/test_hub_server_smoke.py +141 -0
  66. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_project_tool.py +83 -0
  67. code_context_control-2.44.0/tests/test_response_boilerplate.py +438 -0
  68. code_context_control-2.44.0/tests/test_retention.py +612 -0
  69. code_context_control-2.44.0/tests/test_subproject_exclusion.py +84 -0
  70. code_context_control-2.44.0/tests/test_subproject_federation.py +207 -0
  71. code_context_control-2.44.0/tests/test_subprojects.py +294 -0
  72. code_context_control-2.42.0/tests/test_cli_smoke.py +0 -58
  73. code_context_control-2.42.0/tests/test_hub_server_smoke.py +0 -63
  74. {code_context_control-2.42.0 → code_context_control-2.44.0}/LICENSE +0 -0
  75. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/__init__.py +0 -0
  76. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/_hook_utils.py +0 -0
  77. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/commands/__init__.py +0 -0
  78. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/commands/common.py +0 -0
  79. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/docs.html +0 -0
  80. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/edits.html +0 -0
  81. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/guide/bitbucket.html +0 -0
  82. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/guide/getting-started.html +0 -0
  83. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/guide/index.html +0 -0
  84. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/guide/oracle.html +0 -0
  85. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/guide/shared.css +0 -0
  86. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/guide/tools.html +0 -0
  87. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/guide/workflow.html +0 -0
  88. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/hook_auto_snapshot.py +0 -0
  89. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/hook_c3_signal.py +0 -0
  90. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/hook_c3read.py +0 -0
  91. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/hook_dispatch.py +0 -0
  92. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/hook_edit_ledger.py +0 -0
  93. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/hook_edit_unlock.py +0 -0
  94. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/hook_filter.py +0 -0
  95. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/hook_pretool_enforce.py +0 -0
  96. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/hook_read.py +0 -0
  97. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/hook_session_stats.py +0 -0
  98. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/hook_terse_advisor.py +0 -0
  99. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/hub.html +0 -0
  100. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/mcp_proxy.py +0 -0
  101. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/server.py +0 -0
  102. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/tools/__init__.py +0 -0
  103. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/tools/agent.py +0 -0
  104. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/tools/bitbucket.py +0 -0
  105. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/tools/edit.py +0 -0
  106. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/tools/edits.py +0 -0
  107. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/tools/impact.py +0 -0
  108. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/tools/read.py +0 -0
  109. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/tools/session.py +0 -0
  110. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/tools/shell.py +0 -0
  111. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/tools/validate.py +0 -0
  112. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/ui/api.js +0 -0
  113. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/ui/app.js +0 -0
  114. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/ui/components/bitbucket.js +0 -0
  115. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/ui/components/chat.js +0 -0
  116. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/ui/components/dashboard.js +0 -0
  117. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/ui/components/edits.js +0 -0
  118. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/ui/components/instructions.js +0 -0
  119. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/ui/components/memory.js +0 -0
  120. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/ui/components/sessions.js +0 -0
  121. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/ui/components/settings.js +0 -0
  122. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/ui/components/sidebar.js +0 -0
  123. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/ui/shared.js +0 -0
  124. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/ui/theme.js +0 -0
  125. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/ui.html +0 -0
  126. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/ui_legacy.html +0 -0
  127. {code_context_control-2.42.0 → code_context_control-2.44.0}/cli/ui_nano.html +0 -0
  128. {code_context_control-2.42.0 → code_context_control-2.44.0}/code_context_control.egg-info/dependency_links.txt +0 -0
  129. {code_context_control-2.42.0 → code_context_control-2.44.0}/code_context_control.egg-info/entry_points.txt +0 -0
  130. {code_context_control-2.42.0 → code_context_control-2.44.0}/code_context_control.egg-info/requires.txt +0 -0
  131. {code_context_control-2.42.0 → code_context_control-2.44.0}/code_context_control.egg-info/top_level.txt +0 -0
  132. {code_context_control-2.42.0 → code_context_control-2.44.0}/core/__init__.py +0 -0
  133. {code_context_control-2.42.0 → code_context_control-2.44.0}/core/ide.py +0 -0
  134. {code_context_control-2.42.0 → code_context_control-2.44.0}/core/mcp_toml.py +0 -0
  135. {code_context_control-2.42.0 → code_context_control-2.44.0}/core/web_security.py +0 -0
  136. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/__init__.py +0 -0
  137. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/config.py +0 -0
  138. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/mcp_oracle.py +0 -0
  139. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/oracle.html +0 -0
  140. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/oracle_server.py +0 -0
  141. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/services/__init__.py +0 -0
  142. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/services/activity_reporter.py +0 -0
  143. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/services/api_auth.py +0 -0
  144. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/services/c3_bridge.py +0 -0
  145. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/services/chat_engine.py +0 -0
  146. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/services/chat_store.py +0 -0
  147. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/services/cross_memory.py +0 -0
  148. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/services/federated_graph.py +0 -0
  149. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/services/health_checker.py +0 -0
  150. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/services/insight_engine.py +0 -0
  151. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/services/memory_reader.py +0 -0
  152. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/services/memory_writer.py +0 -0
  153. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/services/ollama_bridge.py +0 -0
  154. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/services/project_scanner.py +0 -0
  155. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/services/review_agent.py +0 -0
  156. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/services/tool_executor.py +0 -0
  157. {code_context_control-2.42.0 → code_context_control-2.44.0}/oracle/services/tool_registry.py +0 -0
  158. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/__init__.py +0 -0
  159. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/agent_base.py +0 -0
  160. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/auto_memory.py +0 -0
  161. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/bench/__init__.py +0 -0
  162. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/bench/external/__init__.py +0 -0
  163. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/benchmark_dashboard.py +0 -0
  164. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/bitbucket_client.py +0 -0
  165. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/bitbucket_credentials.py +0 -0
  166. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/circuit_breaker.py +0 -0
  167. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/claude_md.py +0 -0
  168. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/compressor.py +0 -0
  169. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/context_snapshot.py +0 -0
  170. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/conversation_store.py +0 -0
  171. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/e2e_tasks.py +0 -0
  172. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/embedding_index.py +0 -0
  173. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/error_reporting.py +0 -0
  174. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/git_context.py +0 -0
  175. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/hub_service.py +0 -0
  176. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/memory.py +0 -0
  177. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/memory_consolidator.py +0 -0
  178. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/memory_graph.py +0 -0
  179. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/memory_grounder.py +0 -0
  180. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/memory_scorer.py +0 -0
  181. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/metrics.py +0 -0
  182. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/ollama_client.py +0 -0
  183. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/output_filter.py +0 -0
  184. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/parser.py +0 -0
  185. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/proxy_state.py +0 -0
  186. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/retrieval_broker.py +0 -0
  187. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/router.py +0 -0
  188. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/session_benchmark.py +0 -0
  189. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/session_preloader.py +0 -0
  190. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/text_index.py +0 -0
  191. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/tool_classifier.py +0 -0
  192. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/transcript_index.py +0 -0
  193. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/validation_cache.py +0 -0
  194. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/vector_store.py +0 -0
  195. {code_context_control-2.42.0 → code_context_control-2.44.0}/services/version_tracker.py +0 -0
  196. {code_context_control-2.42.0 → code_context_control-2.44.0}/setup.cfg +0 -0
  197. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_activity_reporter.py +0 -0
  198. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_aider_polyglot.py +0 -0
  199. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_bitbucket_cli_smoke.py +0 -0
  200. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_bitbucket_client.py +0 -0
  201. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_bitbucket_config_fallback.py +0 -0
  202. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_bitbucket_credentials.py +0 -0
  203. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_bitbucket_tool.py +0 -0
  204. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_c3_shell.py +0 -0
  205. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_circuit_breaker.py +0 -0
  206. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_claude_md_merge.py +0 -0
  207. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_compressor_large_file.py +0 -0
  208. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_delegate_cascade.py +0 -0
  209. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_e2e_benchmark.py +0 -0
  210. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_edit_ledger_hook.py +0 -0
  211. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_edit_normalization.py +0 -0
  212. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_enforcement_flip.py +0 -0
  213. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_federated_graph.py +0 -0
  214. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_filter_backoff.py +0 -0
  215. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_ghost_files.py +0 -0
  216. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_git_branch_awareness.py +0 -0
  217. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_hook_dispatch.py +0 -0
  218. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_hook_pretool_enforce.py +0 -0
  219. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_hook_smoke.py +0 -0
  220. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_hook_state.py +0 -0
  221. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_install_mcp_entrypoint.py +0 -0
  222. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_lazy_store_init.py +0 -0
  223. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_mcp_host_guard.py +0 -0
  224. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_mcp_server_smoke.py +0 -0
  225. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_mcp_toml.py +0 -0
  226. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_memory_graph_api.py +0 -0
  227. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_memory_system.py +0 -0
  228. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_notification_dedup.py +0 -0
  229. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_notification_discipline.py +0 -0
  230. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_oracle_api_auth.py +0 -0
  231. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_oracle_apikey_api.py +0 -0
  232. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_oracle_discovery_api.py +0 -0
  233. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_oracle_security_fixes.py +0 -0
  234. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_output_filter.py +0 -0
  235. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_permissions.py +0 -0
  236. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_project_manager.py +0 -0
  237. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_project_manager_merge.py +0 -0
  238. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_read_coercion.py +0 -0
  239. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_service_durability.py +0 -0
  240. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_session_benchmark.py +0 -0
  241. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_session_budget.py +0 -0
  242. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_shell_robustness.py +0 -0
  243. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_swe_bench.py +0 -0
  244. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_token_telemetry.py +0 -0
  245. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_tool_registry.py +0 -0
  246. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_upgrade_and_version.py +0 -0
  247. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_validate.py +0 -0
  248. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_web_security.py +0 -0
  249. {code_context_control-2.42.0 → code_context_control-2.44.0}/tests/test_windows_reliability.py +0 -0
  250. {code_context_control-2.42.0 → code_context_control-2.44.0}/tui/__init__.py +0 -0
  251. {code_context_control-2.42.0 → code_context_control-2.44.0}/tui/backend.py +0 -0
  252. {code_context_control-2.42.0 → code_context_control-2.44.0}/tui/main.py +0 -0
  253. {code_context_control-2.42.0 → code_context_control-2.44.0}/tui/screens/__init__.py +0 -0
  254. {code_context_control-2.42.0 → code_context_control-2.44.0}/tui/screens/benchmark_view.py +0 -0
  255. {code_context_control-2.42.0 → code_context_control-2.44.0}/tui/screens/claudemd_view.py +0 -0
  256. {code_context_control-2.42.0 → code_context_control-2.44.0}/tui/screens/compress_view.py +0 -0
  257. {code_context_control-2.42.0 → code_context_control-2.44.0}/tui/screens/index_view.py +0 -0
  258. {code_context_control-2.42.0 → code_context_control-2.44.0}/tui/screens/init_view.py +0 -0
  259. {code_context_control-2.42.0 → code_context_control-2.44.0}/tui/screens/mcp_view.py +0 -0
  260. {code_context_control-2.42.0 → code_context_control-2.44.0}/tui/screens/optimize_view.py +0 -0
  261. {code_context_control-2.42.0 → code_context_control-2.44.0}/tui/screens/pipe_view.py +0 -0
  262. {code_context_control-2.42.0 → code_context_control-2.44.0}/tui/screens/projects_view.py +0 -0
  263. {code_context_control-2.42.0 → code_context_control-2.44.0}/tui/screens/search_view.py +0 -0
  264. {code_context_control-2.42.0 → code_context_control-2.44.0}/tui/screens/session_view.py +0 -0
  265. {code_context_control-2.42.0 → code_context_control-2.44.0}/tui/screens/stats.py +0 -0
  266. {code_context_control-2.42.0 → code_context_control-2.44.0}/tui/screens/ui_view.py +0 -0
  267. {code_context_control-2.42.0 → code_context_control-2.44.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.42.0
3
+ Version: 2.44.0
4
4
  Summary: Local code-intelligence layer for AI coding tools (Claude Code, Codex, Gemini, Copilot). Retrieve less, read less, edit safer.
5
5
  Author-email: Dimitri Tselenchuk <dtselenc@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -197,7 +197,7 @@ c3 ui # opens http://127.0.0.1:3333
197
197
  <img src="https://raw.githubusercontent.com/drknowhow/code-context-control/main/docs/screenshots/ui_dashboard.png" alt="C3 per-project dashboard" width="900">
198
198
  </p>
199
199
 
200
- Illustrative example from one project's dashboard (numbers vary by project): **448K tokens saved** (89.9% rate) — C3's estimate versus a full-file-read baseline — plus 208 files indexed, 20 sessions, codebase breakdown by language, current-session live counters (in/out tokens, cache reads, services online), and a stream of recent tool calls and file changes.
200
+ Illustrative example from one project's dashboard (numbers vary by project): **448K tokens saved** (89.9% rate) — C3's estimate versus a full-file-read baseline — plus 208 files indexed, 20 sessions, codebase breakdown by language, current-session live counters (in/out tokens, cache reads, services online), and a stream of recent tool calls and file changes. Run `c3 bench session` on your own project to generate your own scorecard.
201
201
 
202
202
  ### 3. Edit Ledger — every AI-driven edit tracked
203
203
 
@@ -395,13 +395,20 @@ Applying or switching a tier **preserves your own `allow`/`deny` rules** (and ke
395
395
 
396
396
  ## Benchmarks
397
397
 
398
+ Don't take our word for it — every number C3 advertises is reproducible on your own machine, against your own project:
399
+
398
400
  ```bash
399
- c3 benchmark /path/to/project
400
- c3 bench aider # Aider Polyglot suite
401
- c3 bench swe # SWE-bench Lite
401
+ c3 bench session # six realistic workflow scenarios, A/B with vs without C3
402
+ c3 benchmark /path/to/project # per-operation micro-benchmarks (compression, retrieval, filtering, validation)
403
+ c3 bench aider # Aider Polyglot suite (external; burns real API tokens)
404
+ c3 bench swe # SWE-bench Lite (external)
402
405
  ```
403
406
 
404
- Real-world A/B tests: same task, with and without C3 mounted. Reports include token deltas, cost deltas, win rates, tool-usage analysis, and per-task breakdowns. See the **Benchmark Dashboard** under Settings Background Agents in the Hub.
407
+ The session benchmark's baseline models a *competent* agent working without C3 one targeted search, each file read once — not a strawman that re-reads everything, and it scores answer quality alongside tokens. For reference, a run against C3's own repository (v2.43.0, 2026-07-02) measured **51.8% token savings (2.07×)** across the six scenarios at quality parity. Your numbers will differ with your project's shape — that's why the harness ships with the tool.
408
+
409
+ Beyond synthetic scenarios, C3 records real per-tool usage to `.c3/tool_telemetry.jsonl`, so estimated savings can always be checked against what actually happened in your sessions.
410
+
411
+ Reports include token deltas, cost deltas, win rates, tool-usage analysis, and per-task breakdowns. See the **Benchmark Dashboard** under Settings → Background Agents in the Hub.
405
412
 
406
413
  ---
407
414
 
@@ -135,7 +135,7 @@ c3 ui # opens http://127.0.0.1:3333
135
135
  <img src="https://raw.githubusercontent.com/drknowhow/code-context-control/main/docs/screenshots/ui_dashboard.png" alt="C3 per-project dashboard" width="900">
136
136
  </p>
137
137
 
138
- Illustrative example from one project's dashboard (numbers vary by project): **448K tokens saved** (89.9% rate) — C3's estimate versus a full-file-read baseline — plus 208 files indexed, 20 sessions, codebase breakdown by language, current-session live counters (in/out tokens, cache reads, services online), and a stream of recent tool calls and file changes.
138
+ Illustrative example from one project's dashboard (numbers vary by project): **448K tokens saved** (89.9% rate) — C3's estimate versus a full-file-read baseline — plus 208 files indexed, 20 sessions, codebase breakdown by language, current-session live counters (in/out tokens, cache reads, services online), and a stream of recent tool calls and file changes. Run `c3 bench session` on your own project to generate your own scorecard.
139
139
 
140
140
  ### 3. Edit Ledger — every AI-driven edit tracked
141
141
 
@@ -333,13 +333,20 @@ Applying or switching a tier **preserves your own `allow`/`deny` rules** (and ke
333
333
 
334
334
  ## Benchmarks
335
335
 
336
+ Don't take our word for it — every number C3 advertises is reproducible on your own machine, against your own project:
337
+
336
338
  ```bash
337
- c3 benchmark /path/to/project
338
- c3 bench aider # Aider Polyglot suite
339
- c3 bench swe # SWE-bench Lite
339
+ c3 bench session # six realistic workflow scenarios, A/B with vs without C3
340
+ c3 benchmark /path/to/project # per-operation micro-benchmarks (compression, retrieval, filtering, validation)
341
+ c3 bench aider # Aider Polyglot suite (external; burns real API tokens)
342
+ c3 bench swe # SWE-bench Lite (external)
340
343
  ```
341
344
 
342
- Real-world A/B tests: same task, with and without C3 mounted. Reports include token deltas, cost deltas, win rates, tool-usage analysis, and per-task breakdowns. See the **Benchmark Dashboard** under Settings Background Agents in the Hub.
345
+ The session benchmark's baseline models a *competent* agent working without C3 one targeted search, each file read once — not a strawman that re-reads everything, and it scores answer quality alongside tokens. For reference, a run against C3's own repository (v2.43.0, 2026-07-02) measured **51.8% token savings (2.07×)** across the six scenarios at quality parity. Your numbers will differ with your project's shape — that's why the harness ships with the tool.
346
+
347
+ Beyond synthetic scenarios, C3 records real per-tool usage to `.c3/tool_telemetry.jsonl`, so estimated savings can always be checked against what actually happened in your sessions.
348
+
349
+ Reports include token deltas, cost deltas, win rates, tool-usage analysis, and per-task breakdowns. See the **Benchmark Dashboard** under Settings → Background Agents in the Hub.
343
350
 
344
351
  ---
345
352
 
@@ -85,7 +85,7 @@ console = Console() if HAS_RICH else None
85
85
  # Config
86
86
  CONFIG_DIR = ".c3"
87
87
  CONFIG_FILE = ".c3/config.json"
88
- __version__ = "2.42.0"
88
+ __version__ = "2.44.0"
89
89
 
90
90
 
91
91
  def _command_deps() -> CommandDeps:
@@ -1051,6 +1051,10 @@ def cmd_init(args):
1051
1051
  # ── Non-interactive (--clear) ──────────────────────────────
1052
1052
  if getattr(args, "clear", False):
1053
1053
  print("\n[--clear] Wiping C3 files...")
1054
+ parent_link = (load_config(project_path) or {}).get("parent") or {}
1055
+ if parent_link.get("path"):
1056
+ print(f" [!] This project is a sub-project of {parent_link['path']}")
1057
+ print(" The parent still lists it -- run 'c3 sub check --fix' there.")
1054
1058
  _uninstall_mcp_all(project_path)
1055
1059
  if c3_dir.exists():
1056
1060
  shutil.rmtree(c3_dir)
@@ -5733,6 +5737,137 @@ def cmd_projects(args):
5733
5737
  print(f" Port {s['port']:>5} {s.get('project_name', '?'):<25} {s.get('project_path', '')}")
5734
5738
 
5735
5739
 
5740
+ def cmd_sub(args):
5741
+ """Manage sub-projects: designated sub-folders with linked .c3 branches."""
5742
+ parent = str(Path(getattr(args, "parent", ".") or ".").resolve())
5743
+ if not (Path(parent) / CONFIG_DIR).is_dir():
5744
+ print(f"No .c3 found in {parent}. Run 'c3 init' there first.")
5745
+ return
5746
+ # Import after the cheap guard — the registry module needs a resolvable home.
5747
+ from services.subprojects import VALID_CASCADE_OPS, SubprojectManager
5748
+
5749
+ sm = SubprojectManager(parent)
5750
+ sub = getattr(args, "sub_cmd", "list") or "list"
5751
+ target = getattr(args, "target", None)
5752
+ as_json = getattr(args, "json", False)
5753
+
5754
+ if sub == "add":
5755
+ if not target:
5756
+ print("Usage: c3 sub add <folder> [--parent PATH] [--name NAME]")
5757
+ return
5758
+ result = sm.add(
5759
+ target,
5760
+ name=getattr(args, "name", None),
5761
+ ide=getattr(args, "ide", None),
5762
+ run_init=not getattr(args, "no_init", False),
5763
+ reindex_parent=not getattr(args, "no_reindex_parent", False),
5764
+ )
5765
+ if as_json:
5766
+ print(json.dumps(result, indent=2))
5767
+ return
5768
+ if not result.get("added"):
5769
+ print(f"Failed: {result.get('error')}")
5770
+ return
5771
+ verb = "Adopted (existing .c3 kept)" if result.get("adopted") else "Initialized"
5772
+ print(f"\n[OK] {verb}: {result['name']} ({result['path']})")
5773
+ code = (result.get("parent_reindex") or {}).get("code")
5774
+ if code:
5775
+ print(f" Parent reindexed: {code.get('files_indexed', '?')} files, "
5776
+ f"{code.get('chunks_created', '?')} chunks (sub-project now excluded)")
5777
+
5778
+ elif sub == "list":
5779
+ report = sm.reconcile(fix=False) # report-only consistency pass
5780
+ children = sm.list()
5781
+ if as_json:
5782
+ print(json.dumps({"children": children, "orphans": report.get("orphans", [])}, indent=2))
5783
+ return
5784
+ if not children:
5785
+ print("No sub-projects designated. Use `c3 sub add <folder>`.")
5786
+ return
5787
+ fmt = "{:<22} {:<16} {:>6} {:>7} {}"
5788
+ print(fmt.format("NAME", "STATUS", "FACTS", "ALERTS", "REL PATH"))
5789
+ print("-" * 76)
5790
+ for c in children:
5791
+ print(fmt.format(
5792
+ (c.get("name") or "?")[:21],
5793
+ c.get("status", "?"),
5794
+ c.get("facts_count", 0),
5795
+ c.get("notification_count", 0),
5796
+ c.get("rel_path", ""),
5797
+ ))
5798
+ issues = sum(1 for c in children if c["status"] != "ok")
5799
+ line = f"\n{len(children)} sub-project(s)"
5800
+ if issues:
5801
+ line += f" -- {issues} with issues (run `c3 sub check --fix`)"
5802
+ if report.get("orphans"):
5803
+ line += f" -- {len(report['orphans'])} registry orphan(s)"
5804
+ print(line)
5805
+
5806
+ elif sub == "remove":
5807
+ if not target:
5808
+ print("Usage: c3 sub remove <name|path> [--clear] [--yes]")
5809
+ return
5810
+ mode = "clear" if getattr(args, "clear", False) else "unlink"
5811
+ if mode == "clear" and not getattr(args, "yes", False):
5812
+ print("This will DELETE the sub-project's .c3 directory and instruction docs.")
5813
+ confirm = input("Type 'clear' to confirm: ").strip().lower()
5814
+ if confirm != "clear":
5815
+ print("Aborted.")
5816
+ return
5817
+ result = sm.remove(target, mode=mode,
5818
+ reindex_parent=not getattr(args, "no_reindex_parent", False))
5819
+ if as_json:
5820
+ print(json.dumps(result, indent=2))
5821
+ return
5822
+ if not result.get("removed"):
5823
+ print(f"Failed: {result.get('error')}")
5824
+ return
5825
+ print(f"\n[OK] {'Cleared' if mode == 'clear' else 'Unlinked'}: "
5826
+ f"{result.get('name')} ({result.get('path')})")
5827
+ for w in result.get("warnings", []):
5828
+ print(f" warning: {w}")
5829
+
5830
+ elif sub == "run":
5831
+ if target not in VALID_CASCADE_OPS:
5832
+ print(f"Usage: c3 sub run {{{'|'.join(VALID_CASCADE_OPS)}}} [--include-parent] [--json]")
5833
+ return
5834
+ result = sm.cascade(target,
5835
+ include_parent=getattr(args, "include_parent", False),
5836
+ mcp=getattr(args, "mcp", False))
5837
+ if as_json:
5838
+ print(json.dumps(result, indent=2))
5839
+ return
5840
+ for row in result["results"]:
5841
+ mark = "OK " if row["ok"] else "FAIL"
5842
+ extra = f" -- {row.get('error')}" if row.get("error") else ""
5843
+ print(f" [{mark}] {row['name']:<22} {row['elapsed_ms']:>6}ms{extra}")
5844
+ s = result["summary"]
5845
+ print(f"\n{target}: {s['ok']}/{s['total']} ok, {s['failed']} failed")
5846
+
5847
+ elif sub == "check":
5848
+ result = sm.reconcile(fix=getattr(args, "fix", False),
5849
+ prune=getattr(args, "prune", False))
5850
+ if as_json:
5851
+ print(json.dumps(result, indent=2))
5852
+ return
5853
+ if not result["children"] and not result["orphans"] and not result["pruned"]:
5854
+ print("No sub-projects designated.")
5855
+ return
5856
+ for c in result["children"]:
5857
+ print(f" [{c['status']:<16}] {c.get('name') or '?':<22} {c.get('rel_path', '')}")
5858
+ for o in result["orphans"]:
5859
+ print(f" [orphan_registry ] {o}")
5860
+ for f in result.get("fixed", []):
5861
+ print(f" fixed: {f.get('action')} -> {f.get('path') or f.get('rel_path')}")
5862
+ for p in result.get("pruned", []):
5863
+ print(f" pruned: {p.get('rel_path')}")
5864
+ if result["ok"]:
5865
+ print("\nAll links consistent.")
5866
+ else:
5867
+ hint = "" if getattr(args, "fix", False) else " Run `c3 sub check --fix` to repair."
5868
+ print(f"\nIssues found.{hint}")
5869
+
5870
+
5736
5871
  def cmd_session_benchmark(args):
5737
5872
  """Run real-world session workflow benchmark."""
5738
5873
  if getattr(args, "command", "") == "session-benchmark":
@@ -6475,6 +6610,24 @@ def cmd_upgrade(args):
6475
6610
  print(" In each project, run c3 init . --force to apply any migrations.")
6476
6611
 
6477
6612
 
6613
+ def _stdio_is_interactive() -> bool:
6614
+ """True when stdin AND stdout are attached to a real terminal.
6615
+
6616
+ Used to decide whether bare `c3` may launch the full-screen TUI. With
6617
+ redirected stdio (pytest capture_output, CI, shell pipes) a TUI child
6618
+ would inherit our pipe handles and keep them open past our own death;
6619
+ on Windows the caller's communicate() then blocks forever because
6620
+ subprocess timeouts kill only the direct child, never the tree.
6621
+ """
6622
+ try:
6623
+ return bool(
6624
+ sys.stdin is not None and sys.stdin.isatty()
6625
+ and sys.stdout is not None and sys.stdout.isatty()
6626
+ )
6627
+ except Exception:
6628
+ return False
6629
+
6630
+
6478
6631
  def _launch_tui() -> None:
6479
6632
  """Launch the interactive TUI — what `c3` with no arguments does.
6480
6633
 
@@ -6524,8 +6677,16 @@ def main():
6524
6677
  args = parser.parse_args()
6525
6678
 
6526
6679
  if not args.command:
6527
- # Bare `c3` launches the interactive TUI (replaces the old c3.bat wrapper).
6528
- _launch_tui()
6680
+ # Bare `c3` launches the interactive TUI (replaces the old c3.bat
6681
+ # wrapper) — but only when attached to a real console. With redirected
6682
+ # stdio there is no terminal for a full-screen app anyway, and the TUI
6683
+ # child would inherit our stdout/stderr pipe handles and hold them
6684
+ # open past our own death (a caller's communicate() then hangs forever
6685
+ # on Windows). Print help instead of spawning anything.
6686
+ if _stdio_is_interactive():
6687
+ _launch_tui()
6688
+ else:
6689
+ parser.print_help()
6529
6690
  return
6530
6691
 
6531
6692
  commands = {
@@ -6551,6 +6712,7 @@ def main():
6551
6712
  "terse": cmd_terse,
6552
6713
  "ui": cmd_ui,
6553
6714
  "projects": cmd_projects,
6715
+ "sub": cmd_sub,
6554
6716
  "hub": cmd_hub,
6555
6717
  "bitbucket": cmd_bitbucket,
6556
6718
  "oracle": cmd_oracle,
@@ -138,6 +138,33 @@ def build_parser(version: str, parse_cli_ide_arg):
138
138
  )
139
139
  p_projects.add_argument("--name", default=None, help="Display name (for add)")
140
140
 
141
+ p_sub = subparsers.add_parser("sub", help="Manage sub-projects (linked child .c3 branches)")
142
+ p_sub.add_argument(
143
+ "sub_cmd",
144
+ nargs="?",
145
+ choices=["add", "list", "remove", "run", "check"],
146
+ default="list",
147
+ help="Sub-command (default: list)",
148
+ )
149
+ p_sub.add_argument(
150
+ "target",
151
+ nargs="?",
152
+ default=None,
153
+ help="Folder (add), sub-project name/path (remove), or operation update|reindex|health (run)",
154
+ )
155
+ p_sub.add_argument("--parent", default=".", help="Parent project path (default: current directory)")
156
+ p_sub.add_argument("--name", default=None, help="Display name for the sub-project (add)")
157
+ p_sub.add_argument("--ide", default=None, type=parse_cli_ide_arg, help="IDE for the sub-project init (add)")
158
+ p_sub.add_argument("--no-reindex-parent", action="store_true", help="Skip the parent reindex after add/remove")
159
+ p_sub.add_argument("--no-init", action="store_true", help="Link only; skip running init in the folder (add)")
160
+ p_sub.add_argument("--clear", action="store_true", help="Also wipe the sub-project's .c3 and unregister it (remove; default keeps .c3)")
161
+ p_sub.add_argument("--yes", action="store_true", help="Skip confirmation prompts")
162
+ p_sub.add_argument("--include-parent", action="store_true", help="Also run the operation on the parent (run)")
163
+ p_sub.add_argument("--mcp", action="store_true", help="Also reinstall MCP config on update (run update)")
164
+ p_sub.add_argument("--fix", action="store_true", help="Repair links from the parent config (check)")
165
+ p_sub.add_argument("--prune", action="store_true", help="With --fix: drop entries whose folder is gone (check)")
166
+ p_sub.add_argument("--json", action="store_true", help="Emit JSON output")
167
+
141
168
  p_perms = subparsers.add_parser("permissions",
142
169
  help="Manage Claude Code permissions — show | preview <tier> | diff | clean | <tier>")
143
170
  p_perms.add_argument("tier", nargs="?", default="show",
@@ -212,6 +212,21 @@ def cleanup_ghost_files(ghosts: list[dict]) -> list[str]:
212
212
  return deleted
213
213
 
214
214
 
215
+ def sweep_ghost_files(project_root) -> list[str]:
216
+ """Scan *project_root* and delete any ghost files in one call.
217
+
218
+ Convenience wrapper (scan + cleanup) so callers outside the Bash PostToolUse
219
+ hook — e.g. long-lived MCP-server background agents whose cwd is the project
220
+ root, or git worktrees where no PostToolUse hook runs — can self-clean the
221
+ root. Returns the list of deleted file names (empty if none). Never raises.
222
+ """
223
+ try:
224
+ root = project_root if isinstance(project_root, Path) else Path(project_root)
225
+ return cleanup_ghost_files(scan_ghost_files(root))
226
+ except Exception:
227
+ return []
228
+
229
+
215
230
  # Tools whose output can carry shell-meta text that leaks into 0-byte files:
216
231
  # native shells, c3_shell (its `N->Mtok` filter header), and file reads whose
217
232
  # content has `-> Type` hints. A downstream shell sees `> word` and creates an