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.
- {execweave-0.6.5 → execweave-0.6.7}/PKG-INFO +14 -9
- {execweave-0.6.5 → execweave-0.6.7}/README.md +13 -8
- execweave-0.6.7/docs/antigravity-hooks.md +55 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/cursor-hooks.md +4 -0
- {execweave-0.6.5 → execweave-0.6.7}/pyproject.toml +4 -1
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/__init__.py +1 -1
- execweave-0.6.7/src/execweave/agent_bootstrap.py +340 -0
- execweave-0.6.7/src/execweave/antigravity_adapter.py +359 -0
- execweave-0.6.7/src/execweave/antigravity_full_fidelity.py +99 -0
- execweave-0.6.7/src/execweave/antigravity_hook_cli.py +117 -0
- execweave-0.6.7/src/execweave/antigravity_record.py +96 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/claude_hook_cli.py +13 -0
- execweave-0.6.7/src/execweave/claude_model_observer.py +353 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/codex_hook_cli.py +7 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/codex_record.py +3 -3
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/collector.py +2 -0
- execweave-0.6.7/src/execweave/command.py +113 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/cursor_hook_cli.py +4 -0
- execweave-0.6.7/src/execweave/entry.py +81 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/gemini_hook_cli.py +4 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/graph.py +11 -1
- execweave-0.6.7/src/execweave/live.py +258 -0
- execweave-0.6.7/src/execweave/live_view.py +64 -0
- execweave-0.6.7/src/execweave/live_view_extra_style.py +11 -0
- execweave-0.6.7/src/execweave/live_view_markup.py +29 -0
- execweave-0.6.7/src/execweave/live_view_script_a.py +44 -0
- execweave-0.6.7/src/execweave/live_view_script_b.py +19 -0
- execweave-0.6.7/src/execweave/live_view_script_c.py +19 -0
- execweave-0.6.7/src/execweave/live_view_script_d.py +47 -0
- execweave-0.6.7/src/execweave/live_view_style.py +33 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/opencode_hook_cli.py +4 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/opencode_plugin_cli.py +5 -2
- execweave-0.6.7/src/execweave/provider_lifecycle.py +167 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/provider_record.py +18 -7
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/view_cli.py +1 -1
- execweave-0.6.7/src/execweave/viewer_content_inspector.py +196 -0
- execweave-0.6.7/src/execweave/viewer_projection.py +517 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/workflow.py +2 -2
- execweave-0.6.7/tests/test_agent_bootstrap.py +274 -0
- execweave-0.6.7/tests/test_antigravity_cursor_launch.py +142 -0
- execweave-0.6.7/tests/test_claude_model_observer.py +393 -0
- execweave-0.6.7/tests/test_dashboard_ux_and_hook_projection.py +381 -0
- execweave-0.6.7/tests/test_live_dashboard.py +31 -0
- execweave-0.6.7/tests/test_live_dashboard_js.py +48 -0
- execweave-0.6.7/tests/test_live_logs_export.py +90 -0
- execweave-0.6.7/tests/test_provider_lifecycle.py +239 -0
- execweave-0.6.7/tests/test_viewer_content_inspector.py +178 -0
- execweave-0.6.7/tests/test_viewer_projection.py +334 -0
- execweave-0.6.5/src/execweave/command.py +0 -70
- execweave-0.6.5/src/execweave/entry.py +0 -18
- execweave-0.6.5/src/execweave/live_view.py +0 -79
- {execweave-0.6.5 → execweave-0.6.7}/.github/workflows/ci.yml +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/.github/workflows/i18n.yml +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/.github/workflows/package-benchmark.yml +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/.github/workflows/package-smoke.yml +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/.github/workflows/publish.yml +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/.github/workflows/scalability.yml +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/.github/workflows/wheel-smoke.yml +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/.github/workflows/windows-launcher.yml +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/.gitignore +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/LICENSE +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/README.de.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/README.fr.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/README.ja.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/README.ko.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/README.ru.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/README.zh-CN.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/README.zh-TW.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/benchmarks/phase1_overhead.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/assets/execweave-launch-demo-v5-x.gif +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/benchmarks/README.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/benchmarks/v0.6.0-github-actions.json +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/benchmarks/v0.6.0-github-actions.svg +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/claude-code-hooks.de.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/claude-code-hooks.fr.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/claude-code-hooks.ja.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/claude-code-hooks.ko.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/claude-code-hooks.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/claude-code-hooks.ru.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/claude-code-hooks.zh-CN.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/claude-code-hooks.zh-TW.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/codex-hooks.de.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/codex-hooks.fr.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/codex-hooks.ja.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/codex-hooks.ko.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/codex-hooks.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/codex-hooks.ru.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/codex-hooks.zh-CN.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/codex-hooks.zh-TW.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/cursor-hooks.de.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/cursor-hooks.fr.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/cursor-hooks.ja.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/cursor-hooks.ko.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/cursor-hooks.ru.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/cursor-hooks.zh-CN.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/cursor-hooks.zh-TW.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/evidence-grades.de.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/evidence-grades.fr.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/evidence-grades.ja.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/evidence-grades.ko.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/evidence-grades.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/evidence-grades.ru.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/evidence-grades.zh-CN.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/evidence-grades.zh-TW.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/gemini-hooks.de.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/gemini-hooks.fr.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/gemini-hooks.ja.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/gemini-hooks.ko.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/gemini-hooks.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/gemini-hooks.ru.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/gemini-hooks.zh-CN.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/gemini-hooks.zh-TW.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/inference-gateway.de.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/inference-gateway.fr.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/inference-gateway.ja.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/inference-gateway.ko.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/inference-gateway.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/inference-gateway.ru.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/inference-gateway.zh-CN.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/inference-gateway.zh-TW.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/live-graph.de.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/live-graph.fr.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/live-graph.ja.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/live-graph.ko.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/live-graph.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/live-graph.ru.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/live-graph.zh-CN.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/live-graph.zh-TW.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/model-runtime.de.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/model-runtime.fr.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/model-runtime.ja.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/model-runtime.ko.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/model-runtime.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/model-runtime.ru.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/model-runtime.zh-CN.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/model-runtime.zh-TW.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/opencode-plugin.de.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/opencode-plugin.fr.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/opencode-plugin.ja.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/opencode-plugin.ko.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/opencode-plugin.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/opencode-plugin.ru.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/opencode-plugin.zh-CN.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/opencode-plugin.zh-TW.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/phase-1-runtime-collection.de.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/phase-1-runtime-collection.fr.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/phase-1-runtime-collection.ja.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/phase-1-runtime-collection.ko.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/phase-1-runtime-collection.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/phase-1-runtime-collection.ru.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/phase-1-runtime-collection.zh-CN.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/phase-1-runtime-collection.zh-TW.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/phase-2-execution-graph.de.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/phase-2-execution-graph.fr.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/phase-2-execution-graph.ja.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/phase-2-execution-graph.ko.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/phase-2-execution-graph.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/phase-2-execution-graph.ru.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/phase-2-execution-graph.zh-CN.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/phase-2-execution-graph.zh-TW.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/rule-packs.de.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/rule-packs.fr.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/rule-packs.ja.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/rule-packs.ko.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/rule-packs.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/rule-packs.ru.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/rule-packs.zh-CN.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/rule-packs.zh-TW.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/run-integrity.de.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/run-integrity.fr.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/run-integrity.ja.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/run-integrity.ko.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/run-integrity.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/run-integrity.ru.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/run-integrity.zh-CN.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/run-integrity.zh-TW.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/runtime-threat-model.de.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/runtime-threat-model.fr.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/runtime-threat-model.ja.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/runtime-threat-model.ko.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/runtime-threat-model.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/runtime-threat-model.ru.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/runtime-threat-model.zh-CN.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/runtime-threat-model.zh-TW.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/security-analysis.de.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/security-analysis.fr.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/security-analysis.ja.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/security-analysis.ko.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/security-analysis.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/security-analysis.ru.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/security-analysis.zh-CN.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/security-analysis.zh-TW.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/semantic-telemetry.de.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/semantic-telemetry.fr.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/semantic-telemetry.ja.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/semantic-telemetry.ko.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/semantic-telemetry.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/semantic-telemetry.ru.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/semantic-telemetry.zh-CN.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/semantic-telemetry.zh-TW.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/docs/v0.6.5-hardening-decisions.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/scripts/audit_i18n_parity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/scripts/check_claude_hook.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/scripts/check_claude_record_graph.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/scripts/check_codex_hook.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/scripts/check_correlation_graph.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/scripts/check_inference_gateway_cli.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/scripts/check_model_runtime_cli.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/scripts/check_openai_compatible_cli.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/scripts/check_semantic_graph.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/scripts/check_viewer_js.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/scripts/check_wheel_install.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/scripts/check_windows_launchers.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/scripts/emit_claude_hook_smoke.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/scripts/emit_cursor_hook_smoke.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/scripts/emit_gemini_hook_smoke.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/scripts/emit_opencode_plugin_smoke.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/scripts/make_semantic_smoke.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/scripts/sync_i18n_nav.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/__main__.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/analysis.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/anthropic.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/anthropic_cli.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/anthropic_full_fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/auto_specialized.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/backends.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/benchmark.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/claude_adapter.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/claude_full_fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/claude_record.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/cli.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/codex_adapter.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/codex_full_fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/content_evidence.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/content_store.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/correlation.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/cursor_adapter.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/cursor_full_fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/cursor_record.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/evidence_grade.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/filesystem.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/focus.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/gemini_adapter.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/gemini_full_fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/gemini_record.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/graph_ops.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/http_proxy.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/http_proxy_cli.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/inference_gateway.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/inference_gateway_cli.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/inference_gateway_full_fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/inference_identity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/inference_identity_cli.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/integrity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/integrity_cli.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/litellm_callback.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/litellm_callback_cli.py +0 -0
- /execweave-0.6.5/src/execweave/live.py → /execweave-0.6.7/src/execweave/live_core.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/model_runtime.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/model_runtime_cli.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/model_runtime_full_fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/openai_compatible.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/openai_compatible_cli.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/openai_compatible_full_fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/opencode_adapter.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/opencode_full_fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/opencode_record.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/overhead_benchmark.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/rule_pack.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/rule_pack_cli.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/scalability_benchmark.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/schema.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/scope.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/semantic.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/sink.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/strace_backend.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/theme.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/top.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/top_cli.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/validate.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/src/execweave/viewer.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/fixtures/hooks/README.md +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/fixtures/hooks/claude.json +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/fixtures/hooks/codex.json +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/fixtures/hooks/cursor.json +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/fixtures/hooks/gemini.json +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/fixtures/hooks/manifest.json +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/fixtures/hooks/opencode.json +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_analysis.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_anthropic.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_auto_specialized.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_backends.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_claude_adapter.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_claude_full_fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_claude_record.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_codex_adapter.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_codex_full_fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_codex_record.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_collector.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_command.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_condense.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_correlation.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_correlation_canonical_path.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_correlation_checker.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_correlation_process_exe.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_cursor_adapter.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_cursor_full_fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_cursor_record.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_evidence_grade.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_filesystem_resilience.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_focus.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_full_fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_gemini_adapter.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_gemini_full_fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_gemini_record.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_graph.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_graph_ops.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_hook_fixture_corpus.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_http_proxy.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_inference_gateway.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_inference_gateway_full_fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_inference_identity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_integrity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_litellm_callback.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_live.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_live_auth.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_live_delta.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_live_theme.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_lmstudio_auto_specialized.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_model_runtime.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_model_runtime_full_fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_openai_compatible.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_opencode_adapter.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_opencode_full_fidelity.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_opencode_plugin.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_opencode_record.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_overhead_benchmark.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_rule_pack.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_schema.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_scope.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_semantic.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_strace_backend.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_threat_model.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_top_detached.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_v063_features.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_v064_live_auto_integrations.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_v064_live_evidence.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_validate.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_version.py +0 -0
- {execweave-0.6.5 → execweave-0.6.7}/tests/test_viewer.py +0 -0
- {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.
|
|
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.
|
|
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 --
|
|
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
|
-
|
|
|
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-
|
|
197
|
-
execweave-
|
|
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.
|
|
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
|
-
- [`
|
|
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.
|
|
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 --
|
|
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
|
-
|
|
|
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-
|
|
141
|
-
execweave-
|
|
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.
|
|
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
|
-
- [`
|
|
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.
|
|
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"
|
|
@@ -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
|
+
)
|