execweave 0.6.5__tar.gz → 0.6.7__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 (353) hide show
  1. {execweave-0.6.5 → execweave-0.6.7}/PKG-INFO +14 -9
  2. {execweave-0.6.5 → execweave-0.6.7}/README.md +13 -8
  3. execweave-0.6.7/docs/antigravity-hooks.md +55 -0
  4. {execweave-0.6.5 → execweave-0.6.7}/docs/cursor-hooks.md +4 -0
  5. {execweave-0.6.5 → execweave-0.6.7}/pyproject.toml +4 -1
  6. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/__init__.py +1 -1
  7. execweave-0.6.7/src/execweave/agent_bootstrap.py +340 -0
  8. execweave-0.6.7/src/execweave/antigravity_adapter.py +359 -0
  9. execweave-0.6.7/src/execweave/antigravity_full_fidelity.py +99 -0
  10. execweave-0.6.7/src/execweave/antigravity_hook_cli.py +117 -0
  11. execweave-0.6.7/src/execweave/antigravity_record.py +96 -0
  12. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/claude_hook_cli.py +13 -0
  13. execweave-0.6.7/src/execweave/claude_model_observer.py +353 -0
  14. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/codex_hook_cli.py +7 -0
  15. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/codex_record.py +3 -3
  16. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/collector.py +2 -0
  17. execweave-0.6.7/src/execweave/command.py +113 -0
  18. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/cursor_hook_cli.py +4 -0
  19. execweave-0.6.7/src/execweave/entry.py +81 -0
  20. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/gemini_hook_cli.py +4 -0
  21. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/graph.py +11 -1
  22. execweave-0.6.7/src/execweave/live.py +258 -0
  23. execweave-0.6.7/src/execweave/live_view.py +64 -0
  24. execweave-0.6.7/src/execweave/live_view_extra_style.py +11 -0
  25. execweave-0.6.7/src/execweave/live_view_markup.py +29 -0
  26. execweave-0.6.7/src/execweave/live_view_script_a.py +44 -0
  27. execweave-0.6.7/src/execweave/live_view_script_b.py +19 -0
  28. execweave-0.6.7/src/execweave/live_view_script_c.py +19 -0
  29. execweave-0.6.7/src/execweave/live_view_script_d.py +47 -0
  30. execweave-0.6.7/src/execweave/live_view_style.py +33 -0
  31. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/opencode_hook_cli.py +4 -0
  32. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/opencode_plugin_cli.py +5 -2
  33. execweave-0.6.7/src/execweave/provider_lifecycle.py +167 -0
  34. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/provider_record.py +18 -7
  35. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/view_cli.py +1 -1
  36. execweave-0.6.7/src/execweave/viewer_content_inspector.py +196 -0
  37. execweave-0.6.7/src/execweave/viewer_projection.py +517 -0
  38. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/workflow.py +2 -2
  39. execweave-0.6.7/tests/test_agent_bootstrap.py +274 -0
  40. execweave-0.6.7/tests/test_antigravity_cursor_launch.py +142 -0
  41. execweave-0.6.7/tests/test_claude_model_observer.py +393 -0
  42. execweave-0.6.7/tests/test_dashboard_ux_and_hook_projection.py +381 -0
  43. execweave-0.6.7/tests/test_live_dashboard.py +31 -0
  44. execweave-0.6.7/tests/test_live_dashboard_js.py +48 -0
  45. execweave-0.6.7/tests/test_live_logs_export.py +90 -0
  46. execweave-0.6.7/tests/test_provider_lifecycle.py +239 -0
  47. execweave-0.6.7/tests/test_viewer_content_inspector.py +178 -0
  48. execweave-0.6.7/tests/test_viewer_projection.py +334 -0
  49. execweave-0.6.5/src/execweave/command.py +0 -70
  50. execweave-0.6.5/src/execweave/entry.py +0 -18
  51. execweave-0.6.5/src/execweave/live_view.py +0 -79
  52. {execweave-0.6.5 → execweave-0.6.7}/.github/workflows/ci.yml +0 -0
  53. {execweave-0.6.5 → execweave-0.6.7}/.github/workflows/i18n.yml +0 -0
  54. {execweave-0.6.5 → execweave-0.6.7}/.github/workflows/package-benchmark.yml +0 -0
  55. {execweave-0.6.5 → execweave-0.6.7}/.github/workflows/package-smoke.yml +0 -0
  56. {execweave-0.6.5 → execweave-0.6.7}/.github/workflows/publish.yml +0 -0
  57. {execweave-0.6.5 → execweave-0.6.7}/.github/workflows/scalability.yml +0 -0
  58. {execweave-0.6.5 → execweave-0.6.7}/.github/workflows/wheel-smoke.yml +0 -0
  59. {execweave-0.6.5 → execweave-0.6.7}/.github/workflows/windows-launcher.yml +0 -0
  60. {execweave-0.6.5 → execweave-0.6.7}/.gitignore +0 -0
  61. {execweave-0.6.5 → execweave-0.6.7}/LICENSE +0 -0
  62. {execweave-0.6.5 → execweave-0.6.7}/README.de.md +0 -0
  63. {execweave-0.6.5 → execweave-0.6.7}/README.fr.md +0 -0
  64. {execweave-0.6.5 → execweave-0.6.7}/README.ja.md +0 -0
  65. {execweave-0.6.5 → execweave-0.6.7}/README.ko.md +0 -0
  66. {execweave-0.6.5 → execweave-0.6.7}/README.ru.md +0 -0
  67. {execweave-0.6.5 → execweave-0.6.7}/README.zh-CN.md +0 -0
  68. {execweave-0.6.5 → execweave-0.6.7}/README.zh-TW.md +0 -0
  69. {execweave-0.6.5 → execweave-0.6.7}/benchmarks/phase1_overhead.py +0 -0
  70. {execweave-0.6.5 → execweave-0.6.7}/docs/assets/execweave-launch-demo-v5-x.gif +0 -0
  71. {execweave-0.6.5 → execweave-0.6.7}/docs/benchmarks/README.md +0 -0
  72. {execweave-0.6.5 → execweave-0.6.7}/docs/benchmarks/v0.6.0-github-actions.json +0 -0
  73. {execweave-0.6.5 → execweave-0.6.7}/docs/benchmarks/v0.6.0-github-actions.svg +0 -0
  74. {execweave-0.6.5 → execweave-0.6.7}/docs/claude-code-hooks.de.md +0 -0
  75. {execweave-0.6.5 → execweave-0.6.7}/docs/claude-code-hooks.fr.md +0 -0
  76. {execweave-0.6.5 → execweave-0.6.7}/docs/claude-code-hooks.ja.md +0 -0
  77. {execweave-0.6.5 → execweave-0.6.7}/docs/claude-code-hooks.ko.md +0 -0
  78. {execweave-0.6.5 → execweave-0.6.7}/docs/claude-code-hooks.md +0 -0
  79. {execweave-0.6.5 → execweave-0.6.7}/docs/claude-code-hooks.ru.md +0 -0
  80. {execweave-0.6.5 → execweave-0.6.7}/docs/claude-code-hooks.zh-CN.md +0 -0
  81. {execweave-0.6.5 → execweave-0.6.7}/docs/claude-code-hooks.zh-TW.md +0 -0
  82. {execweave-0.6.5 → execweave-0.6.7}/docs/codex-hooks.de.md +0 -0
  83. {execweave-0.6.5 → execweave-0.6.7}/docs/codex-hooks.fr.md +0 -0
  84. {execweave-0.6.5 → execweave-0.6.7}/docs/codex-hooks.ja.md +0 -0
  85. {execweave-0.6.5 → execweave-0.6.7}/docs/codex-hooks.ko.md +0 -0
  86. {execweave-0.6.5 → execweave-0.6.7}/docs/codex-hooks.md +0 -0
  87. {execweave-0.6.5 → execweave-0.6.7}/docs/codex-hooks.ru.md +0 -0
  88. {execweave-0.6.5 → execweave-0.6.7}/docs/codex-hooks.zh-CN.md +0 -0
  89. {execweave-0.6.5 → execweave-0.6.7}/docs/codex-hooks.zh-TW.md +0 -0
  90. {execweave-0.6.5 → execweave-0.6.7}/docs/cursor-hooks.de.md +0 -0
  91. {execweave-0.6.5 → execweave-0.6.7}/docs/cursor-hooks.fr.md +0 -0
  92. {execweave-0.6.5 → execweave-0.6.7}/docs/cursor-hooks.ja.md +0 -0
  93. {execweave-0.6.5 → execweave-0.6.7}/docs/cursor-hooks.ko.md +0 -0
  94. {execweave-0.6.5 → execweave-0.6.7}/docs/cursor-hooks.ru.md +0 -0
  95. {execweave-0.6.5 → execweave-0.6.7}/docs/cursor-hooks.zh-CN.md +0 -0
  96. {execweave-0.6.5 → execweave-0.6.7}/docs/cursor-hooks.zh-TW.md +0 -0
  97. {execweave-0.6.5 → execweave-0.6.7}/docs/evidence-grades.de.md +0 -0
  98. {execweave-0.6.5 → execweave-0.6.7}/docs/evidence-grades.fr.md +0 -0
  99. {execweave-0.6.5 → execweave-0.6.7}/docs/evidence-grades.ja.md +0 -0
  100. {execweave-0.6.5 → execweave-0.6.7}/docs/evidence-grades.ko.md +0 -0
  101. {execweave-0.6.5 → execweave-0.6.7}/docs/evidence-grades.md +0 -0
  102. {execweave-0.6.5 → execweave-0.6.7}/docs/evidence-grades.ru.md +0 -0
  103. {execweave-0.6.5 → execweave-0.6.7}/docs/evidence-grades.zh-CN.md +0 -0
  104. {execweave-0.6.5 → execweave-0.6.7}/docs/evidence-grades.zh-TW.md +0 -0
  105. {execweave-0.6.5 → execweave-0.6.7}/docs/gemini-hooks.de.md +0 -0
  106. {execweave-0.6.5 → execweave-0.6.7}/docs/gemini-hooks.fr.md +0 -0
  107. {execweave-0.6.5 → execweave-0.6.7}/docs/gemini-hooks.ja.md +0 -0
  108. {execweave-0.6.5 → execweave-0.6.7}/docs/gemini-hooks.ko.md +0 -0
  109. {execweave-0.6.5 → execweave-0.6.7}/docs/gemini-hooks.md +0 -0
  110. {execweave-0.6.5 → execweave-0.6.7}/docs/gemini-hooks.ru.md +0 -0
  111. {execweave-0.6.5 → execweave-0.6.7}/docs/gemini-hooks.zh-CN.md +0 -0
  112. {execweave-0.6.5 → execweave-0.6.7}/docs/gemini-hooks.zh-TW.md +0 -0
  113. {execweave-0.6.5 → execweave-0.6.7}/docs/inference-gateway.de.md +0 -0
  114. {execweave-0.6.5 → execweave-0.6.7}/docs/inference-gateway.fr.md +0 -0
  115. {execweave-0.6.5 → execweave-0.6.7}/docs/inference-gateway.ja.md +0 -0
  116. {execweave-0.6.5 → execweave-0.6.7}/docs/inference-gateway.ko.md +0 -0
  117. {execweave-0.6.5 → execweave-0.6.7}/docs/inference-gateway.md +0 -0
  118. {execweave-0.6.5 → execweave-0.6.7}/docs/inference-gateway.ru.md +0 -0
  119. {execweave-0.6.5 → execweave-0.6.7}/docs/inference-gateway.zh-CN.md +0 -0
  120. {execweave-0.6.5 → execweave-0.6.7}/docs/inference-gateway.zh-TW.md +0 -0
  121. {execweave-0.6.5 → execweave-0.6.7}/docs/live-graph.de.md +0 -0
  122. {execweave-0.6.5 → execweave-0.6.7}/docs/live-graph.fr.md +0 -0
  123. {execweave-0.6.5 → execweave-0.6.7}/docs/live-graph.ja.md +0 -0
  124. {execweave-0.6.5 → execweave-0.6.7}/docs/live-graph.ko.md +0 -0
  125. {execweave-0.6.5 → execweave-0.6.7}/docs/live-graph.md +0 -0
  126. {execweave-0.6.5 → execweave-0.6.7}/docs/live-graph.ru.md +0 -0
  127. {execweave-0.6.5 → execweave-0.6.7}/docs/live-graph.zh-CN.md +0 -0
  128. {execweave-0.6.5 → execweave-0.6.7}/docs/live-graph.zh-TW.md +0 -0
  129. {execweave-0.6.5 → execweave-0.6.7}/docs/model-runtime.de.md +0 -0
  130. {execweave-0.6.5 → execweave-0.6.7}/docs/model-runtime.fr.md +0 -0
  131. {execweave-0.6.5 → execweave-0.6.7}/docs/model-runtime.ja.md +0 -0
  132. {execweave-0.6.5 → execweave-0.6.7}/docs/model-runtime.ko.md +0 -0
  133. {execweave-0.6.5 → execweave-0.6.7}/docs/model-runtime.md +0 -0
  134. {execweave-0.6.5 → execweave-0.6.7}/docs/model-runtime.ru.md +0 -0
  135. {execweave-0.6.5 → execweave-0.6.7}/docs/model-runtime.zh-CN.md +0 -0
  136. {execweave-0.6.5 → execweave-0.6.7}/docs/model-runtime.zh-TW.md +0 -0
  137. {execweave-0.6.5 → execweave-0.6.7}/docs/opencode-plugin.de.md +0 -0
  138. {execweave-0.6.5 → execweave-0.6.7}/docs/opencode-plugin.fr.md +0 -0
  139. {execweave-0.6.5 → execweave-0.6.7}/docs/opencode-plugin.ja.md +0 -0
  140. {execweave-0.6.5 → execweave-0.6.7}/docs/opencode-plugin.ko.md +0 -0
  141. {execweave-0.6.5 → execweave-0.6.7}/docs/opencode-plugin.md +0 -0
  142. {execweave-0.6.5 → execweave-0.6.7}/docs/opencode-plugin.ru.md +0 -0
  143. {execweave-0.6.5 → execweave-0.6.7}/docs/opencode-plugin.zh-CN.md +0 -0
  144. {execweave-0.6.5 → execweave-0.6.7}/docs/opencode-plugin.zh-TW.md +0 -0
  145. {execweave-0.6.5 → execweave-0.6.7}/docs/phase-1-runtime-collection.de.md +0 -0
  146. {execweave-0.6.5 → execweave-0.6.7}/docs/phase-1-runtime-collection.fr.md +0 -0
  147. {execweave-0.6.5 → execweave-0.6.7}/docs/phase-1-runtime-collection.ja.md +0 -0
  148. {execweave-0.6.5 → execweave-0.6.7}/docs/phase-1-runtime-collection.ko.md +0 -0
  149. {execweave-0.6.5 → execweave-0.6.7}/docs/phase-1-runtime-collection.md +0 -0
  150. {execweave-0.6.5 → execweave-0.6.7}/docs/phase-1-runtime-collection.ru.md +0 -0
  151. {execweave-0.6.5 → execweave-0.6.7}/docs/phase-1-runtime-collection.zh-CN.md +0 -0
  152. {execweave-0.6.5 → execweave-0.6.7}/docs/phase-1-runtime-collection.zh-TW.md +0 -0
  153. {execweave-0.6.5 → execweave-0.6.7}/docs/phase-2-execution-graph.de.md +0 -0
  154. {execweave-0.6.5 → execweave-0.6.7}/docs/phase-2-execution-graph.fr.md +0 -0
  155. {execweave-0.6.5 → execweave-0.6.7}/docs/phase-2-execution-graph.ja.md +0 -0
  156. {execweave-0.6.5 → execweave-0.6.7}/docs/phase-2-execution-graph.ko.md +0 -0
  157. {execweave-0.6.5 → execweave-0.6.7}/docs/phase-2-execution-graph.md +0 -0
  158. {execweave-0.6.5 → execweave-0.6.7}/docs/phase-2-execution-graph.ru.md +0 -0
  159. {execweave-0.6.5 → execweave-0.6.7}/docs/phase-2-execution-graph.zh-CN.md +0 -0
  160. {execweave-0.6.5 → execweave-0.6.7}/docs/phase-2-execution-graph.zh-TW.md +0 -0
  161. {execweave-0.6.5 → execweave-0.6.7}/docs/rule-packs.de.md +0 -0
  162. {execweave-0.6.5 → execweave-0.6.7}/docs/rule-packs.fr.md +0 -0
  163. {execweave-0.6.5 → execweave-0.6.7}/docs/rule-packs.ja.md +0 -0
  164. {execweave-0.6.5 → execweave-0.6.7}/docs/rule-packs.ko.md +0 -0
  165. {execweave-0.6.5 → execweave-0.6.7}/docs/rule-packs.md +0 -0
  166. {execweave-0.6.5 → execweave-0.6.7}/docs/rule-packs.ru.md +0 -0
  167. {execweave-0.6.5 → execweave-0.6.7}/docs/rule-packs.zh-CN.md +0 -0
  168. {execweave-0.6.5 → execweave-0.6.7}/docs/rule-packs.zh-TW.md +0 -0
  169. {execweave-0.6.5 → execweave-0.6.7}/docs/run-integrity.de.md +0 -0
  170. {execweave-0.6.5 → execweave-0.6.7}/docs/run-integrity.fr.md +0 -0
  171. {execweave-0.6.5 → execweave-0.6.7}/docs/run-integrity.ja.md +0 -0
  172. {execweave-0.6.5 → execweave-0.6.7}/docs/run-integrity.ko.md +0 -0
  173. {execweave-0.6.5 → execweave-0.6.7}/docs/run-integrity.md +0 -0
  174. {execweave-0.6.5 → execweave-0.6.7}/docs/run-integrity.ru.md +0 -0
  175. {execweave-0.6.5 → execweave-0.6.7}/docs/run-integrity.zh-CN.md +0 -0
  176. {execweave-0.6.5 → execweave-0.6.7}/docs/run-integrity.zh-TW.md +0 -0
  177. {execweave-0.6.5 → execweave-0.6.7}/docs/runtime-threat-model.de.md +0 -0
  178. {execweave-0.6.5 → execweave-0.6.7}/docs/runtime-threat-model.fr.md +0 -0
  179. {execweave-0.6.5 → execweave-0.6.7}/docs/runtime-threat-model.ja.md +0 -0
  180. {execweave-0.6.5 → execweave-0.6.7}/docs/runtime-threat-model.ko.md +0 -0
  181. {execweave-0.6.5 → execweave-0.6.7}/docs/runtime-threat-model.md +0 -0
  182. {execweave-0.6.5 → execweave-0.6.7}/docs/runtime-threat-model.ru.md +0 -0
  183. {execweave-0.6.5 → execweave-0.6.7}/docs/runtime-threat-model.zh-CN.md +0 -0
  184. {execweave-0.6.5 → execweave-0.6.7}/docs/runtime-threat-model.zh-TW.md +0 -0
  185. {execweave-0.6.5 → execweave-0.6.7}/docs/security-analysis.de.md +0 -0
  186. {execweave-0.6.5 → execweave-0.6.7}/docs/security-analysis.fr.md +0 -0
  187. {execweave-0.6.5 → execweave-0.6.7}/docs/security-analysis.ja.md +0 -0
  188. {execweave-0.6.5 → execweave-0.6.7}/docs/security-analysis.ko.md +0 -0
  189. {execweave-0.6.5 → execweave-0.6.7}/docs/security-analysis.md +0 -0
  190. {execweave-0.6.5 → execweave-0.6.7}/docs/security-analysis.ru.md +0 -0
  191. {execweave-0.6.5 → execweave-0.6.7}/docs/security-analysis.zh-CN.md +0 -0
  192. {execweave-0.6.5 → execweave-0.6.7}/docs/security-analysis.zh-TW.md +0 -0
  193. {execweave-0.6.5 → execweave-0.6.7}/docs/semantic-telemetry.de.md +0 -0
  194. {execweave-0.6.5 → execweave-0.6.7}/docs/semantic-telemetry.fr.md +0 -0
  195. {execweave-0.6.5 → execweave-0.6.7}/docs/semantic-telemetry.ja.md +0 -0
  196. {execweave-0.6.5 → execweave-0.6.7}/docs/semantic-telemetry.ko.md +0 -0
  197. {execweave-0.6.5 → execweave-0.6.7}/docs/semantic-telemetry.md +0 -0
  198. {execweave-0.6.5 → execweave-0.6.7}/docs/semantic-telemetry.ru.md +0 -0
  199. {execweave-0.6.5 → execweave-0.6.7}/docs/semantic-telemetry.zh-CN.md +0 -0
  200. {execweave-0.6.5 → execweave-0.6.7}/docs/semantic-telemetry.zh-TW.md +0 -0
  201. {execweave-0.6.5 → execweave-0.6.7}/docs/v0.6.5-hardening-decisions.md +0 -0
  202. {execweave-0.6.5 → execweave-0.6.7}/scripts/audit_i18n_parity.py +0 -0
  203. {execweave-0.6.5 → execweave-0.6.7}/scripts/check_claude_hook.py +0 -0
  204. {execweave-0.6.5 → execweave-0.6.7}/scripts/check_claude_record_graph.py +0 -0
  205. {execweave-0.6.5 → execweave-0.6.7}/scripts/check_codex_hook.py +0 -0
  206. {execweave-0.6.5 → execweave-0.6.7}/scripts/check_correlation_graph.py +0 -0
  207. {execweave-0.6.5 → execweave-0.6.7}/scripts/check_inference_gateway_cli.py +0 -0
  208. {execweave-0.6.5 → execweave-0.6.7}/scripts/check_model_runtime_cli.py +0 -0
  209. {execweave-0.6.5 → execweave-0.6.7}/scripts/check_openai_compatible_cli.py +0 -0
  210. {execweave-0.6.5 → execweave-0.6.7}/scripts/check_semantic_graph.py +0 -0
  211. {execweave-0.6.5 → execweave-0.6.7}/scripts/check_viewer_js.py +0 -0
  212. {execweave-0.6.5 → execweave-0.6.7}/scripts/check_wheel_install.py +0 -0
  213. {execweave-0.6.5 → execweave-0.6.7}/scripts/check_windows_launchers.py +0 -0
  214. {execweave-0.6.5 → execweave-0.6.7}/scripts/emit_claude_hook_smoke.py +0 -0
  215. {execweave-0.6.5 → execweave-0.6.7}/scripts/emit_cursor_hook_smoke.py +0 -0
  216. {execweave-0.6.5 → execweave-0.6.7}/scripts/emit_gemini_hook_smoke.py +0 -0
  217. {execweave-0.6.5 → execweave-0.6.7}/scripts/emit_opencode_plugin_smoke.py +0 -0
  218. {execweave-0.6.5 → execweave-0.6.7}/scripts/make_semantic_smoke.py +0 -0
  219. {execweave-0.6.5 → execweave-0.6.7}/scripts/sync_i18n_nav.py +0 -0
  220. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/__main__.py +0 -0
  221. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/analysis.py +0 -0
  222. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/anthropic.py +0 -0
  223. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/anthropic_cli.py +0 -0
  224. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/anthropic_full_fidelity.py +0 -0
  225. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/auto_specialized.py +0 -0
  226. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/backends.py +0 -0
  227. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/benchmark.py +0 -0
  228. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/claude_adapter.py +0 -0
  229. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/claude_full_fidelity.py +0 -0
  230. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/claude_record.py +0 -0
  231. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/cli.py +0 -0
  232. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/codex_adapter.py +0 -0
  233. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/codex_full_fidelity.py +0 -0
  234. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/content_evidence.py +0 -0
  235. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/content_store.py +0 -0
  236. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/correlation.py +0 -0
  237. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/cursor_adapter.py +0 -0
  238. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/cursor_full_fidelity.py +0 -0
  239. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/cursor_record.py +0 -0
  240. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/evidence_grade.py +0 -0
  241. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/fidelity.py +0 -0
  242. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/filesystem.py +0 -0
  243. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/focus.py +0 -0
  244. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/gemini_adapter.py +0 -0
  245. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/gemini_full_fidelity.py +0 -0
  246. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/gemini_record.py +0 -0
  247. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/graph_ops.py +0 -0
  248. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/http_proxy.py +0 -0
  249. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/http_proxy_cli.py +0 -0
  250. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/inference_gateway.py +0 -0
  251. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/inference_gateway_cli.py +0 -0
  252. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/inference_gateway_full_fidelity.py +0 -0
  253. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/inference_identity.py +0 -0
  254. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/inference_identity_cli.py +0 -0
  255. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/integrity.py +0 -0
  256. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/integrity_cli.py +0 -0
  257. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/litellm_callback.py +0 -0
  258. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/litellm_callback_cli.py +0 -0
  259. /execweave-0.6.5/src/execweave/live.py → /execweave-0.6.7/src/execweave/live_core.py +0 -0
  260. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/model_runtime.py +0 -0
  261. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/model_runtime_cli.py +0 -0
  262. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/model_runtime_full_fidelity.py +0 -0
  263. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/openai_compatible.py +0 -0
  264. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/openai_compatible_cli.py +0 -0
  265. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/openai_compatible_full_fidelity.py +0 -0
  266. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/opencode_adapter.py +0 -0
  267. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/opencode_full_fidelity.py +0 -0
  268. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/opencode_record.py +0 -0
  269. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/overhead_benchmark.py +0 -0
  270. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/rule_pack.py +0 -0
  271. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/rule_pack_cli.py +0 -0
  272. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/scalability_benchmark.py +0 -0
  273. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/schema.py +0 -0
  274. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/scope.py +0 -0
  275. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/semantic.py +0 -0
  276. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/sink.py +0 -0
  277. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/strace_backend.py +0 -0
  278. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/theme.py +0 -0
  279. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/top.py +0 -0
  280. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/top_cli.py +0 -0
  281. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/validate.py +0 -0
  282. {execweave-0.6.5 → execweave-0.6.7}/src/execweave/viewer.py +0 -0
  283. {execweave-0.6.5 → execweave-0.6.7}/tests/fixtures/hooks/README.md +0 -0
  284. {execweave-0.6.5 → execweave-0.6.7}/tests/fixtures/hooks/claude.json +0 -0
  285. {execweave-0.6.5 → execweave-0.6.7}/tests/fixtures/hooks/codex.json +0 -0
  286. {execweave-0.6.5 → execweave-0.6.7}/tests/fixtures/hooks/cursor.json +0 -0
  287. {execweave-0.6.5 → execweave-0.6.7}/tests/fixtures/hooks/gemini.json +0 -0
  288. {execweave-0.6.5 → execweave-0.6.7}/tests/fixtures/hooks/manifest.json +0 -0
  289. {execweave-0.6.5 → execweave-0.6.7}/tests/fixtures/hooks/opencode.json +0 -0
  290. {execweave-0.6.5 → execweave-0.6.7}/tests/test_analysis.py +0 -0
  291. {execweave-0.6.5 → execweave-0.6.7}/tests/test_anthropic.py +0 -0
  292. {execweave-0.6.5 → execweave-0.6.7}/tests/test_auto_specialized.py +0 -0
  293. {execweave-0.6.5 → execweave-0.6.7}/tests/test_backends.py +0 -0
  294. {execweave-0.6.5 → execweave-0.6.7}/tests/test_claude_adapter.py +0 -0
  295. {execweave-0.6.5 → execweave-0.6.7}/tests/test_claude_full_fidelity.py +0 -0
  296. {execweave-0.6.5 → execweave-0.6.7}/tests/test_claude_record.py +0 -0
  297. {execweave-0.6.5 → execweave-0.6.7}/tests/test_codex_adapter.py +0 -0
  298. {execweave-0.6.5 → execweave-0.6.7}/tests/test_codex_full_fidelity.py +0 -0
  299. {execweave-0.6.5 → execweave-0.6.7}/tests/test_codex_record.py +0 -0
  300. {execweave-0.6.5 → execweave-0.6.7}/tests/test_collector.py +0 -0
  301. {execweave-0.6.5 → execweave-0.6.7}/tests/test_command.py +0 -0
  302. {execweave-0.6.5 → execweave-0.6.7}/tests/test_condense.py +0 -0
  303. {execweave-0.6.5 → execweave-0.6.7}/tests/test_correlation.py +0 -0
  304. {execweave-0.6.5 → execweave-0.6.7}/tests/test_correlation_canonical_path.py +0 -0
  305. {execweave-0.6.5 → execweave-0.6.7}/tests/test_correlation_checker.py +0 -0
  306. {execweave-0.6.5 → execweave-0.6.7}/tests/test_correlation_process_exe.py +0 -0
  307. {execweave-0.6.5 → execweave-0.6.7}/tests/test_cursor_adapter.py +0 -0
  308. {execweave-0.6.5 → execweave-0.6.7}/tests/test_cursor_full_fidelity.py +0 -0
  309. {execweave-0.6.5 → execweave-0.6.7}/tests/test_cursor_record.py +0 -0
  310. {execweave-0.6.5 → execweave-0.6.7}/tests/test_evidence_grade.py +0 -0
  311. {execweave-0.6.5 → execweave-0.6.7}/tests/test_fidelity.py +0 -0
  312. {execweave-0.6.5 → execweave-0.6.7}/tests/test_filesystem_resilience.py +0 -0
  313. {execweave-0.6.5 → execweave-0.6.7}/tests/test_focus.py +0 -0
  314. {execweave-0.6.5 → execweave-0.6.7}/tests/test_full_fidelity.py +0 -0
  315. {execweave-0.6.5 → execweave-0.6.7}/tests/test_gemini_adapter.py +0 -0
  316. {execweave-0.6.5 → execweave-0.6.7}/tests/test_gemini_full_fidelity.py +0 -0
  317. {execweave-0.6.5 → execweave-0.6.7}/tests/test_gemini_record.py +0 -0
  318. {execweave-0.6.5 → execweave-0.6.7}/tests/test_graph.py +0 -0
  319. {execweave-0.6.5 → execweave-0.6.7}/tests/test_graph_ops.py +0 -0
  320. {execweave-0.6.5 → execweave-0.6.7}/tests/test_hook_fixture_corpus.py +0 -0
  321. {execweave-0.6.5 → execweave-0.6.7}/tests/test_http_proxy.py +0 -0
  322. {execweave-0.6.5 → execweave-0.6.7}/tests/test_inference_gateway.py +0 -0
  323. {execweave-0.6.5 → execweave-0.6.7}/tests/test_inference_gateway_full_fidelity.py +0 -0
  324. {execweave-0.6.5 → execweave-0.6.7}/tests/test_inference_identity.py +0 -0
  325. {execweave-0.6.5 → execweave-0.6.7}/tests/test_integrity.py +0 -0
  326. {execweave-0.6.5 → execweave-0.6.7}/tests/test_litellm_callback.py +0 -0
  327. {execweave-0.6.5 → execweave-0.6.7}/tests/test_live.py +0 -0
  328. {execweave-0.6.5 → execweave-0.6.7}/tests/test_live_auth.py +0 -0
  329. {execweave-0.6.5 → execweave-0.6.7}/tests/test_live_delta.py +0 -0
  330. {execweave-0.6.5 → execweave-0.6.7}/tests/test_live_theme.py +0 -0
  331. {execweave-0.6.5 → execweave-0.6.7}/tests/test_lmstudio_auto_specialized.py +0 -0
  332. {execweave-0.6.5 → execweave-0.6.7}/tests/test_model_runtime.py +0 -0
  333. {execweave-0.6.5 → execweave-0.6.7}/tests/test_model_runtime_full_fidelity.py +0 -0
  334. {execweave-0.6.5 → execweave-0.6.7}/tests/test_openai_compatible.py +0 -0
  335. {execweave-0.6.5 → execweave-0.6.7}/tests/test_opencode_adapter.py +0 -0
  336. {execweave-0.6.5 → execweave-0.6.7}/tests/test_opencode_full_fidelity.py +0 -0
  337. {execweave-0.6.5 → execweave-0.6.7}/tests/test_opencode_plugin.py +0 -0
  338. {execweave-0.6.5 → execweave-0.6.7}/tests/test_opencode_record.py +0 -0
  339. {execweave-0.6.5 → execweave-0.6.7}/tests/test_overhead_benchmark.py +0 -0
  340. {execweave-0.6.5 → execweave-0.6.7}/tests/test_rule_pack.py +0 -0
  341. {execweave-0.6.5 → execweave-0.6.7}/tests/test_schema.py +0 -0
  342. {execweave-0.6.5 → execweave-0.6.7}/tests/test_scope.py +0 -0
  343. {execweave-0.6.5 → execweave-0.6.7}/tests/test_semantic.py +0 -0
  344. {execweave-0.6.5 → execweave-0.6.7}/tests/test_strace_backend.py +0 -0
  345. {execweave-0.6.5 → execweave-0.6.7}/tests/test_threat_model.py +0 -0
  346. {execweave-0.6.5 → execweave-0.6.7}/tests/test_top_detached.py +0 -0
  347. {execweave-0.6.5 → execweave-0.6.7}/tests/test_v063_features.py +0 -0
  348. {execweave-0.6.5 → execweave-0.6.7}/tests/test_v064_live_auto_integrations.py +0 -0
  349. {execweave-0.6.5 → execweave-0.6.7}/tests/test_v064_live_evidence.py +0 -0
  350. {execweave-0.6.5 → execweave-0.6.7}/tests/test_validate.py +0 -0
  351. {execweave-0.6.5 → execweave-0.6.7}/tests/test_version.py +0 -0
  352. {execweave-0.6.5 → execweave-0.6.7}/tests/test_viewer.py +0 -0
  353. {execweave-0.6.5 → execweave-0.6.7}/tests/test_workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: execweave
3
- Version: 0.6.5
3
+ Version: 0.6.7
4
4
  Summary: Turn AI-agent runtime behavior into a local interactive execution graph.
5
5
  Project-URL: Homepage, https://github.com/Irish-kw/ExecWeave
6
6
  Project-URL: Repository, https://github.com/Irish-kw/ExecWeave
@@ -87,7 +87,7 @@ Install the latest published wheel/sdist from PyPI:
87
87
  python -m pip install -U execweave
88
88
  ```
89
89
 
90
- The package version on `main` is currently **v0.6.5**. The published release may lag main; test the exact mainline build with:
90
+ The package version on `main` is currently **v0.6.6**. The published release may lag main; test the exact mainline build with:
91
91
 
92
92
  ```bash
93
93
  python -m pip install --upgrade --force-reinstall "execweave @ git+https://github.com/Irish-kw/ExecWeave.git@main"
@@ -108,13 +108,17 @@ Live OS-runtime telemetry works with **any local command**. Agent/runtime names
108
108
  ```bash
109
109
  execweave live --open -- claude
110
110
  execweave live --open -- codex
111
- execweave live --open -- gemini
111
+ execweave live --open -- antigravity
112
112
  execweave live --open -- cursor
113
113
  execweave live --open -- opencode
114
114
  execweave live --open -- ollama serve
115
115
  execweave live --open -- python my_agent.py
116
116
  ```
117
117
 
118
+ > **Approve the hook when prompted.** On the first provider-integrated run, the Agent/IDE may ask whether ExecWeave is allowed to enable its local hook integration. Choose **Allow / Yes**. If the hook is not approved, OS-runtime telemetry can still work, but provider-level tool, model, and supplied-content observability will be reduced or unavailable.
119
+
120
+ Google Antigravity uses the current `agy` CLI command; ExecWeave also accepts `antigravity` as a friendly alias and resolves it to `agy`. For Cursor, `execweave live --open -- cursor` first uses a normal PATH launcher when one exists, then falls back to the standard Cursor desktop application binary on macOS and Windows.
121
+
118
122
  Or build the finalized artifact pipeline:
119
123
 
120
124
  ```bash
@@ -143,7 +147,7 @@ Full fidelity also changes the privacy boundary: application-level secrets embed
143
147
  | --- | --- | --- |
144
148
  | Claude Code | Yes | native hooks + full-fidelity supplied hook content |
145
149
  | OpenAI Codex | Yes | lifecycle hooks + full-fidelity supplied hook content |
146
- | Gemini CLI | Yes | native hooks + full-fidelity supplied hook content |
150
+ | Google Antigravity / Antigravity CLI | Yes | passive native hooks for invocation/tool evidence + full-fidelity values explicitly supplied to those hooks |
147
151
  | Cursor | Yes | native hooks + full-fidelity supplied hook content |
148
152
  | OpenCode | Yes | project plugin + full-fidelity supplied plugin content |
149
153
  | Ollama | Yes | `execweave-model-runtime event/exchange/probe --runtime ollama` |
@@ -193,8 +197,8 @@ execweave-claude-record --open -- claude
193
197
  execweave-codex-hook --print-config
194
198
  execweave-codex-record --open -- codex
195
199
 
196
- execweave-gemini-hook --print-config
197
- execweave-gemini-record --open -- gemini
200
+ execweave-antigravity-hook --print-config
201
+ execweave-antigravity-record --open -- antigravity
198
202
 
199
203
  execweave-cursor-hook --print-config
200
204
  execweave-cursor-record --open -- cursor
@@ -203,7 +207,7 @@ execweave-opencode-plugin --install
203
207
  execweave-opencode-record --open -- opencode
204
208
  ```
205
209
 
206
- Provider-integrated recorders keep raw runtime, semantic, and correlated artifacts separate. Stable provider identifiers such as Cursor `tool_use_id` or OpenCode `sessionID + callID` prove logical provider identity; they are not OS PIDs.
210
+ Provider-integrated recorders keep raw runtime, semantic, and correlated artifacts separate. Stable provider identifiers such as Cursor `tool_use_id` or OpenCode `sessionID + callID` prove logical provider identity; they are not OS PIDs. Legacy Gemini CLI hook entry points remain packaged for existing installations, but Gemini CLI is no longer advertised as a current integration; new Google CLI usage should use Antigravity (`agy`).
207
211
 
208
212
  ## Inference gateways and model runtimes
209
213
 
@@ -274,6 +278,7 @@ execweave doctor
274
278
  execweave run --backend portable -- your-command
275
279
  execweave run --backend strace -- your-command
276
280
  execweave graph-summary run.graph.json
281
+ execweave graph-filter run.graph.json --causal-only --output causal.graph.json
277
282
  execweave graph-focus run.graph.json NODE_ID --hops 2 --output focused.graph.json
278
283
  execweave path run.graph.json SOURCE TARGET --causal-only
279
284
  ```
@@ -325,7 +330,7 @@ Do not assume content has been secret-redacted. Commands, paths, endpoint metada
325
330
 
326
331
  ## Current status
327
332
 
328
- ExecWeave `main` is currently **v0.6.5** and under active release hardening. The latest published package/release can lag main until a GitHub Release is explicitly published; the publish workflow verifies that the release tag exactly matches the package version before PyPI upload.
333
+ ExecWeave `main` is currently **v0.6.6** and under active release hardening. The latest published package/release can lag main until a GitHub Release is explicitly published; the publish workflow verifies that the release tag exactly matches the package version before PyPI upload.
329
334
 
330
335
  v0.6.5 combines cross-platform runtime collection, materialized execution graphs, standalone/live viewing, conservative provider↔runtime correlation, full-fidelity content-addressed provider evidence, evidence grades, bounded rule packs, an explicit runtime threat/fidelity contract, and honest local run-integrity sealing. Observed evidence and inference remain separate by design.
331
336
 
@@ -337,7 +342,7 @@ v0.6.5 combines cross-platform runtime collection, materialized execution graphs
337
342
  - [`Semantic Telemetry`](docs/semantic-telemetry.md)
338
343
  - [`Claude Code Hooks`](docs/claude-code-hooks.md)
339
344
  - [`OpenAI Codex Hooks`](docs/codex-hooks.md)
340
- - [`Gemini CLI Hooks`](docs/gemini-hooks.md)
345
+ - [`Google Antigravity Hooks`](docs/antigravity-hooks.md)
341
346
  - [`Cursor Hooks`](docs/cursor-hooks.md)
342
347
  - [`OpenCode Plugin`](docs/opencode-plugin.md)
343
348
  - [`Inference Gateway / OpenRouter / LiteLLM`](docs/inference-gateway.md)
@@ -31,7 +31,7 @@ Install the latest published wheel/sdist from PyPI:
31
31
  python -m pip install -U execweave
32
32
  ```
33
33
 
34
- The package version on `main` is currently **v0.6.5**. The published release may lag main; test the exact mainline build with:
34
+ The package version on `main` is currently **v0.6.6**. The published release may lag main; test the exact mainline build with:
35
35
 
36
36
  ```bash
37
37
  python -m pip install --upgrade --force-reinstall "execweave @ git+https://github.com/Irish-kw/ExecWeave.git@main"
@@ -52,13 +52,17 @@ Live OS-runtime telemetry works with **any local command**. Agent/runtime names
52
52
  ```bash
53
53
  execweave live --open -- claude
54
54
  execweave live --open -- codex
55
- execweave live --open -- gemini
55
+ execweave live --open -- antigravity
56
56
  execweave live --open -- cursor
57
57
  execweave live --open -- opencode
58
58
  execweave live --open -- ollama serve
59
59
  execweave live --open -- python my_agent.py
60
60
  ```
61
61
 
62
+ > **Approve the hook when prompted.** On the first provider-integrated run, the Agent/IDE may ask whether ExecWeave is allowed to enable its local hook integration. Choose **Allow / Yes**. If the hook is not approved, OS-runtime telemetry can still work, but provider-level tool, model, and supplied-content observability will be reduced or unavailable.
63
+
64
+ Google Antigravity uses the current `agy` CLI command; ExecWeave also accepts `antigravity` as a friendly alias and resolves it to `agy`. For Cursor, `execweave live --open -- cursor` first uses a normal PATH launcher when one exists, then falls back to the standard Cursor desktop application binary on macOS and Windows.
65
+
62
66
  Or build the finalized artifact pipeline:
63
67
 
64
68
  ```bash
@@ -87,7 +91,7 @@ Full fidelity also changes the privacy boundary: application-level secrets embed
87
91
  | --- | --- | --- |
88
92
  | Claude Code | Yes | native hooks + full-fidelity supplied hook content |
89
93
  | OpenAI Codex | Yes | lifecycle hooks + full-fidelity supplied hook content |
90
- | Gemini CLI | Yes | native hooks + full-fidelity supplied hook content |
94
+ | Google Antigravity / Antigravity CLI | Yes | passive native hooks for invocation/tool evidence + full-fidelity values explicitly supplied to those hooks |
91
95
  | Cursor | Yes | native hooks + full-fidelity supplied hook content |
92
96
  | OpenCode | Yes | project plugin + full-fidelity supplied plugin content |
93
97
  | Ollama | Yes | `execweave-model-runtime event/exchange/probe --runtime ollama` |
@@ -137,8 +141,8 @@ execweave-claude-record --open -- claude
137
141
  execweave-codex-hook --print-config
138
142
  execweave-codex-record --open -- codex
139
143
 
140
- execweave-gemini-hook --print-config
141
- execweave-gemini-record --open -- gemini
144
+ execweave-antigravity-hook --print-config
145
+ execweave-antigravity-record --open -- antigravity
142
146
 
143
147
  execweave-cursor-hook --print-config
144
148
  execweave-cursor-record --open -- cursor
@@ -147,7 +151,7 @@ execweave-opencode-plugin --install
147
151
  execweave-opencode-record --open -- opencode
148
152
  ```
149
153
 
150
- Provider-integrated recorders keep raw runtime, semantic, and correlated artifacts separate. Stable provider identifiers such as Cursor `tool_use_id` or OpenCode `sessionID + callID` prove logical provider identity; they are not OS PIDs.
154
+ Provider-integrated recorders keep raw runtime, semantic, and correlated artifacts separate. Stable provider identifiers such as Cursor `tool_use_id` or OpenCode `sessionID + callID` prove logical provider identity; they are not OS PIDs. Legacy Gemini CLI hook entry points remain packaged for existing installations, but Gemini CLI is no longer advertised as a current integration; new Google CLI usage should use Antigravity (`agy`).
151
155
 
152
156
  ## Inference gateways and model runtimes
153
157
 
@@ -218,6 +222,7 @@ execweave doctor
218
222
  execweave run --backend portable -- your-command
219
223
  execweave run --backend strace -- your-command
220
224
  execweave graph-summary run.graph.json
225
+ execweave graph-filter run.graph.json --causal-only --output causal.graph.json
221
226
  execweave graph-focus run.graph.json NODE_ID --hops 2 --output focused.graph.json
222
227
  execweave path run.graph.json SOURCE TARGET --causal-only
223
228
  ```
@@ -269,7 +274,7 @@ Do not assume content has been secret-redacted. Commands, paths, endpoint metada
269
274
 
270
275
  ## Current status
271
276
 
272
- ExecWeave `main` is currently **v0.6.5** and under active release hardening. The latest published package/release can lag main until a GitHub Release is explicitly published; the publish workflow verifies that the release tag exactly matches the package version before PyPI upload.
277
+ ExecWeave `main` is currently **v0.6.6** and under active release hardening. The latest published package/release can lag main until a GitHub Release is explicitly published; the publish workflow verifies that the release tag exactly matches the package version before PyPI upload.
273
278
 
274
279
  v0.6.5 combines cross-platform runtime collection, materialized execution graphs, standalone/live viewing, conservative provider↔runtime correlation, full-fidelity content-addressed provider evidence, evidence grades, bounded rule packs, an explicit runtime threat/fidelity contract, and honest local run-integrity sealing. Observed evidence and inference remain separate by design.
275
280
 
@@ -281,7 +286,7 @@ v0.6.5 combines cross-platform runtime collection, materialized execution graphs
281
286
  - [`Semantic Telemetry`](docs/semantic-telemetry.md)
282
287
  - [`Claude Code Hooks`](docs/claude-code-hooks.md)
283
288
  - [`OpenAI Codex Hooks`](docs/codex-hooks.md)
284
- - [`Gemini CLI Hooks`](docs/gemini-hooks.md)
289
+ - [`Google Antigravity Hooks`](docs/antigravity-hooks.md)
285
290
  - [`Cursor Hooks`](docs/cursor-hooks.md)
286
291
  - [`OpenCode Plugin`](docs/opencode-plugin.md)
287
292
  - [`Inference Gateway / OpenRouter / LiteLLM`](docs/inference-gateway.md)
@@ -0,0 +1,55 @@
1
+ # Google Antigravity hooks
2
+
3
+ ExecWeave supports the current Google Antigravity CLI through its native hooks and OS-runtime collection. The Antigravity CLI executable is `agy`.
4
+
5
+ ```bash
6
+ execweave live --open -- antigravity
7
+ # ExecWeave resolves this friendly name to the official `agy` CLI binary.
8
+ ```
9
+
10
+ On the first provider-integrated run, Antigravity may ask whether the ExecWeave hook should be allowed. Choose **Allow / Yes** if you want provider-level tool and invocation evidence in addition to OS-runtime telemetry.
11
+
12
+ ## Automatic bootstrap
13
+
14
+ For `agy` / `antigravity`, ExecWeave conservatively merges one named hook definition into:
15
+
16
+ ```text
17
+ ~/.gemini/config/hooks.json
18
+ ```
19
+
20
+ The generated configuration can be inspected without writing it:
21
+
22
+ ```bash
23
+ execweave-antigravity-hook --print-config
24
+ ```
25
+
26
+ ExecWeave deliberately uses passive observation points:
27
+
28
+ - `PostToolUse` for tool-call/result evidence.
29
+ - `PreInvocation` and `PostInvocation` for invocation lifecycle metadata.
30
+ - **No `PreToolUse` hook is installed**, because that hook participates in Antigravity's permission decision and ExecWeave must not approve, deny, or alter a user's tool permission flow.
31
+
32
+ Existing unrelated named hooks are preserved. ExecWeave refuses to replace an existing hook definition with the same name rather than silently overwriting it.
33
+
34
+ ## Layered recorder
35
+
36
+ ```bash
37
+ execweave-antigravity-record --open -- antigravity
38
+ ```
39
+
40
+ The recorder keeps runtime evidence, Antigravity semantic evidence, and derived correlation artifacts separate. Normal `execweave live --open -- antigravity` also auto-bootstraps the hook integration and exposes the live graph.
41
+
42
+ ## Evidence scope
43
+
44
+ Current Antigravity hook evidence is intentionally bounded to values actually supplied by the hook contract. ExecWeave can record:
45
+
46
+ - invocation lifecycle metadata exposed by `PreInvocation` / `PostInvocation`;
47
+ - tool identity, arguments, result/error status exposed by `PostToolUse`;
48
+ - declared command or file targets when those fields are present in the supplied tool arguments;
49
+ - complete hook-supplied values in the local content-addressed store where supported.
50
+
51
+ This does **not** claim access to hidden model state, private chain-of-thought, an unseen provider-side request, or any content not delivered to the hook. OS-runtime evidence remains a separate layer.
52
+
53
+ ## Legacy Gemini CLI
54
+
55
+ The older `execweave-gemini-*` entry points remain available for compatibility with existing installations and archived workflows. They are not the current Google CLI path documented by ExecWeave; new usage should target Antigravity with `agy`.
@@ -22,6 +22,10 @@ execweave-cursor-hook --print-config
22
22
  execweave-cursor-record --open -- cursor
23
23
  ```
24
24
 
25
+ `cursor` does not have to be a shell-installed CLI launcher. ExecWeave first uses a normal PATH launcher when one exists; if it does not, macOS and Windows fall back to the standard Cursor desktop application binary. This also applies to `execweave live --open -- cursor`.
26
+
27
+ If Cursor asks whether to allow the ExecWeave hook integration, choose **Allow / Yes** to enable provider-level tool/content evidence. OS-runtime observation can still operate without provider hook approval, but specialized evidence will be reduced or unavailable.
28
+
25
29
  The run-bound recorder keeps runtime, semantic, and correlated artifacts separate.
26
30
 
27
31
  ## Observation surface
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "execweave"
7
- version = "0.6.5"
7
+ version = "0.6.7"
8
8
  description = "Turn AI-agent runtime behavior into a local interactive execution graph."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -63,6 +63,9 @@ execweave-claude-hook = "execweave.claude_hook_cli:main"
63
63
  execweave-claude-record = "execweave.claude_record:main"
64
64
  execweave-codex-hook = "execweave.codex_hook_cli:main"
65
65
  execweave-codex-record = "execweave.codex_record:main"
66
+ execweave-antigravity-hook = "execweave.antigravity_hook_cli:main"
67
+ execweave-antigravity-record = "execweave.antigravity_record:main"
68
+ # Legacy Gemini CLI entry points remain for compatibility with existing installs.
66
69
  execweave-gemini-hook = "execweave.gemini_hook_cli:main"
67
70
  execweave-gemini-record = "execweave.gemini_record:main"
68
71
  execweave-cursor-hook = "execweave.cursor_hook_cli:main"
@@ -1,3 +1,3 @@
1
1
  """ExecWeave runtime graph package."""
2
2
 
3
- __version__ = "0.6.5"
3
+ __version__ = "0.6.7"
@@ -0,0 +1,340 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import os
5
+ import stat
6
+ from copy import deepcopy
7
+ from dataclasses import asdict, dataclass
8
+ from pathlib import Path
9
+ from typing import Any, Mapping
10
+
11
+ _AUTO_FLAG = "--auto"
12
+ _CONFIG_RETRIES = 3
13
+ _SUPPORTED_AGENTS = {
14
+ "claude": "claude",
15
+ "codex": "codex",
16
+ "agy": "antigravity",
17
+ "antigravity": "antigravity",
18
+ "cursor": "cursor",
19
+ "opencode": "opencode",
20
+ # Legacy compatibility only. Gemini CLI is no longer advertised as current.
21
+ "gemini": "gemini",
22
+ }
23
+
24
+
25
+ @dataclass(frozen=True)
26
+ class AgentBootstrapResult:
27
+ provider: str | None
28
+ status: str
29
+ path: str | None = None
30
+ changed: bool = False
31
+ detail: str | None = None
32
+
33
+ def to_dict(self) -> dict[str, object]:
34
+ return asdict(self)
35
+
36
+
37
+ def _command_name(value: str) -> str:
38
+ name = value.replace("\\", "/").rsplit("/", 1)[-1].lower()
39
+ for suffix in (".exe", ".cmd", ".bat", ".ps1"):
40
+ if name.endswith(suffix):
41
+ return name[: -len(suffix)]
42
+ return name
43
+
44
+
45
+ def supported_agent(command: list[str]) -> str | None:
46
+ if not command:
47
+ return None
48
+ return _SUPPORTED_AGENTS.get(_command_name(command[0]))
49
+
50
+
51
+ def _bounded_detail(value: object, limit: int = 240) -> str:
52
+ text = " ".join(str(value).split())
53
+ return text if len(text) <= limit else text[: limit - 3] + "..."
54
+
55
+
56
+ def _load_json_object(raw: bytes, *, path: Path) -> dict[str, Any]:
57
+ if not raw:
58
+ return {}
59
+ try:
60
+ payload = json.loads(raw.decode("utf-8"))
61
+ except (UnicodeDecodeError, json.JSONDecodeError) as exc:
62
+ raise ValueError(f"invalid JSON in {path}: {exc}") from exc
63
+ if not isinstance(payload, dict):
64
+ raise ValueError(f"configuration root must be an object: {path}")
65
+ return payload
66
+
67
+
68
+ def _read_bytes(path: Path) -> bytes | None:
69
+ try:
70
+ return path.read_bytes()
71
+ except FileNotFoundError:
72
+ return None
73
+
74
+
75
+ def _contains_execweave_command(value: object, marker: str) -> bool:
76
+ if isinstance(value, dict):
77
+ command = value.get("command")
78
+ if isinstance(command, str) and marker in command:
79
+ return True
80
+ return any(_contains_execweave_command(child, marker) for child in value.values())
81
+ if isinstance(value, list):
82
+ return any(_contains_execweave_command(child, marker) for child in value)
83
+ return False
84
+
85
+
86
+ def _merge_hook_fragment(
87
+ current: dict[str, Any],
88
+ fragment: dict[str, Any],
89
+ *,
90
+ marker: str,
91
+ ) -> tuple[dict[str, Any], bool]:
92
+ merged = deepcopy(current)
93
+ changed = False
94
+
95
+ for key, value in fragment.items():
96
+ if key == "hooks":
97
+ continue
98
+ if key not in merged:
99
+ merged[key] = deepcopy(value)
100
+ changed = True
101
+
102
+ incoming_hooks = fragment.get("hooks")
103
+ if not isinstance(incoming_hooks, dict):
104
+ raise ValueError("ExecWeave hook fragment has no hooks object")
105
+
106
+ existing_hooks = merged.get("hooks")
107
+ if existing_hooks is None:
108
+ existing_hooks = {}
109
+ merged["hooks"] = existing_hooks
110
+ changed = True
111
+ if not isinstance(existing_hooks, dict):
112
+ raise ValueError("existing hooks value is not an object")
113
+
114
+ for event_name, incoming_groups in incoming_hooks.items():
115
+ if not isinstance(incoming_groups, list):
116
+ raise ValueError(f"ExecWeave hook event is not a list: {event_name}")
117
+ existing_groups = existing_hooks.get(event_name)
118
+ if existing_groups is None:
119
+ existing_hooks[event_name] = deepcopy(incoming_groups)
120
+ changed = True
121
+ continue
122
+ if not isinstance(existing_groups, list):
123
+ raise ValueError(f"existing hook event is not a list: {event_name}")
124
+ if _contains_execweave_command(existing_groups, marker):
125
+ continue
126
+ existing_groups.extend(deepcopy(incoming_groups))
127
+ changed = True
128
+
129
+ return merged, changed
130
+
131
+
132
+ def _merge_named_hook_fragment(
133
+ current: dict[str, Any],
134
+ fragment: dict[str, Any],
135
+ *,
136
+ marker: str,
137
+ ) -> tuple[dict[str, Any], bool]:
138
+ """Merge Antigravity's named-hook ``hooks.json`` schema conservatively."""
139
+ merged = deepcopy(current)
140
+ if _contains_execweave_command(merged, marker):
141
+ return merged, False
142
+ for name, definition in fragment.items():
143
+ if name in merged:
144
+ raise FileExistsError(
145
+ f"refusing to replace existing Antigravity hook definition: {name}"
146
+ )
147
+ merged[name] = deepcopy(definition)
148
+ return merged, bool(fragment)
149
+
150
+
151
+ def _write_bytes_optimistic(path: Path, original: bytes | None, payload: bytes) -> bool:
152
+ path.parent.mkdir(parents=True, exist_ok=True)
153
+ current = _read_bytes(path)
154
+ if current != original:
155
+ return False
156
+
157
+ mode = None
158
+ if path.exists():
159
+ try:
160
+ mode = stat.S_IMODE(path.stat().st_mode)
161
+ except OSError:
162
+ mode = None
163
+
164
+ temporary = path.with_name(f".{path.name}.execweave-{os.getpid()}.tmp")
165
+ try:
166
+ temporary.write_bytes(payload)
167
+ if mode is not None:
168
+ try:
169
+ temporary.chmod(mode)
170
+ except OSError:
171
+ pass
172
+ os.replace(temporary, path)
173
+ finally:
174
+ try:
175
+ temporary.unlink()
176
+ except FileNotFoundError:
177
+ pass
178
+ return True
179
+
180
+
181
+ def _merge_json_file(path: Path, fragment: dict[str, Any], *, marker: str) -> bool:
182
+ for _ in range(_CONFIG_RETRIES):
183
+ original = _read_bytes(path)
184
+ current = _load_json_object(original or b"", path=path)
185
+ merged, changed = _merge_hook_fragment(current, fragment, marker=marker)
186
+ if not changed:
187
+ return False
188
+ encoded = (
189
+ json.dumps(merged, ensure_ascii=False, indent=2, sort_keys=True) + "\n"
190
+ ).encode("utf-8")
191
+ if _write_bytes_optimistic(path, original, encoded):
192
+ return True
193
+ raise RuntimeError(f"configuration changed concurrently while updating {path}")
194
+
195
+
196
+ def _merge_named_hook_file(path: Path, fragment: dict[str, Any], *, marker: str) -> bool:
197
+ for _ in range(_CONFIG_RETRIES):
198
+ original = _read_bytes(path)
199
+ current = _load_json_object(original or b"", path=path)
200
+ merged, changed = _merge_named_hook_fragment(current, fragment, marker=marker)
201
+ if not changed:
202
+ return False
203
+ encoded = (
204
+ json.dumps(merged, ensure_ascii=False, indent=2, sort_keys=True) + "\n"
205
+ ).encode("utf-8")
206
+ if _write_bytes_optimistic(path, original, encoded):
207
+ return True
208
+ raise RuntimeError(f"configuration changed concurrently while updating {path}")
209
+
210
+
211
+ def _write_plugin_file(path: Path, content: str, *, marker: str) -> bool:
212
+ encoded = content.encode("utf-8")
213
+ for _ in range(_CONFIG_RETRIES):
214
+ original = _read_bytes(path)
215
+ if original is not None:
216
+ try:
217
+ existing = original.decode("utf-8")
218
+ except UnicodeDecodeError as exc:
219
+ raise ValueError(f"existing OpenCode plugin is not UTF-8: {path}") from exc
220
+ if existing == content or marker in existing:
221
+ return False
222
+ raise FileExistsError(f"refusing to replace existing OpenCode plugin: {path}")
223
+ if _write_bytes_optimistic(path, original, encoded):
224
+ return True
225
+ raise RuntimeError(f"plugin path changed concurrently while updating {path}")
226
+
227
+
228
+ def _config_dir_from_env(environment: Mapping[str, str], key: str) -> Path | None:
229
+ raw = environment.get(key, "").strip()
230
+ return Path(raw).expanduser() if raw else None
231
+
232
+
233
+ def _provider_target(
234
+ provider: str,
235
+ *,
236
+ home: Path,
237
+ environment: Mapping[str, str],
238
+ ) -> Path:
239
+ if provider == "claude":
240
+ root = _config_dir_from_env(environment, "CLAUDE_CONFIG_DIR") or home / ".claude"
241
+ return root / "settings.json"
242
+ if provider == "codex":
243
+ root = _config_dir_from_env(environment, "CODEX_HOME") or home / ".codex"
244
+ return root / "hooks.json"
245
+ if provider == "antigravity":
246
+ return home / ".gemini" / "config" / "hooks.json"
247
+ if provider == "gemini":
248
+ return home / ".gemini" / "settings.json"
249
+ if provider == "cursor":
250
+ return home / ".cursor" / "hooks.json"
251
+ if provider == "opencode":
252
+ root = _config_dir_from_env(environment, "XDG_CONFIG_HOME") or home / ".config"
253
+ return root / "opencode" / "plugins" / "execweave.ts"
254
+ raise ValueError(f"unsupported provider: {provider}")
255
+
256
+
257
+ def _provider_fragment(provider: str) -> tuple[dict[str, Any], str]:
258
+ if provider == "claude":
259
+ from .claude_hook_cli import claude_hook_config
260
+
261
+ return claude_hook_config(f"execweave-claude-hook {_AUTO_FLAG}"), "execweave-claude-hook"
262
+ if provider == "codex":
263
+ from .codex_hook_cli import codex_hook_config
264
+
265
+ return codex_hook_config(f"execweave-codex-hook {_AUTO_FLAG}"), "execweave-codex-hook"
266
+ if provider == "antigravity":
267
+ from .antigravity_hook_cli import antigravity_hook_config
268
+
269
+ return antigravity_hook_config(), "execweave-antigravity-hook"
270
+ if provider == "gemini":
271
+ from .gemini_hook_cli import gemini_hook_config
272
+
273
+ return gemini_hook_config(f"execweave-gemini-hook {_AUTO_FLAG}"), "execweave-gemini-hook"
274
+ if provider == "cursor":
275
+ from .cursor_hook_cli import cursor_hook_config
276
+
277
+ return cursor_hook_config(f"execweave-cursor-hook {_AUTO_FLAG}"), "execweave-cursor-hook"
278
+ raise ValueError(f"provider does not use JSON hooks: {provider}")
279
+
280
+
281
+ def bootstrap_supported_agent(
282
+ command: list[str],
283
+ *,
284
+ home: str | Path | None = None,
285
+ environment: Mapping[str, str] | None = None,
286
+ ) -> AgentBootstrapResult:
287
+ provider = supported_agent(command)
288
+ if provider is None:
289
+ command_name = _command_name(command[0]) if command else "unknown"
290
+ return AgentBootstrapResult(
291
+ provider=None,
292
+ status="unavailable",
293
+ detail=f"no specialized lifecycle integration for {command_name}",
294
+ )
295
+
296
+ env = os.environ if environment is None else environment
297
+ home_path = Path.home() if home is None else Path(home).expanduser()
298
+ target = _provider_target(provider, home=home_path, environment=env)
299
+
300
+ try:
301
+ if provider == "opencode":
302
+ from .opencode_plugin_cli import plugin_text
303
+
304
+ content = plugin_text(("execweave-opencode-hook", _AUTO_FLAG))
305
+ changed = _write_plugin_file(target, content, marker="execweave-opencode-hook")
306
+ else:
307
+ fragment, marker = _provider_fragment(provider)
308
+ changed = (
309
+ _merge_named_hook_file(target, fragment, marker=marker)
310
+ if provider == "antigravity"
311
+ else _merge_json_file(target, fragment, marker=marker)
312
+ )
313
+
314
+ if provider == "claude":
315
+ raw = _read_bytes(target)
316
+ payload = _load_json_object(raw or b"", path=target)
317
+ if payload.get("disableAllHooks") is True:
318
+ return AgentBootstrapResult(
319
+ provider=provider,
320
+ status="unavailable",
321
+ path=str(target),
322
+ changed=changed,
323
+ detail="Claude hooks are disabled by disableAllHooks",
324
+ )
325
+
326
+ return AgentBootstrapResult(
327
+ provider=provider,
328
+ status="active",
329
+ path=str(target),
330
+ changed=changed,
331
+ detail="specialized hook/plugin bootstrap is configured",
332
+ )
333
+ except (FileExistsError, OSError, RuntimeError, TypeError, ValueError) as exc:
334
+ return AgentBootstrapResult(
335
+ provider=provider,
336
+ status="bootstrap_failed",
337
+ path=str(target),
338
+ changed=False,
339
+ detail=_bounded_detail(exc),
340
+ )