execweave 0.8.11__tar.gz → 0.8.13__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.8.11 → execweave-0.8.13}/.github/workflows/ci.yml +4 -1
- {execweave-0.8.11 → execweave-0.8.13}/.github/workflows/provider-capability-stage-integrity.yml +52 -1
- {execweave-0.8.11 → execweave-0.8.13}/.github/workflows/provider-dashboard-contract.yml +2 -0
- execweave-0.8.13/.github/workflows/viewer-agent-isolation.yml +89 -0
- {execweave-0.8.11 → execweave-0.8.13}/.gitignore +2 -0
- execweave-0.8.13/PKG-INFO +357 -0
- execweave-0.8.13/README.de.md +302 -0
- execweave-0.8.13/README.fr.md +302 -0
- execweave-0.8.13/README.ja.md +302 -0
- execweave-0.8.13/README.ko.md +302 -0
- execweave-0.8.13/README.md +302 -0
- execweave-0.8.13/README.ru.md +302 -0
- execweave-0.8.13/README.zh-CN.md +302 -0
- execweave-0.8.13/README.zh-TW.md +302 -0
- execweave-0.8.13/diagnostics/acceptance_hardening_20260906.md +202 -0
- execweave-0.8.13/diagnostics/audit_eight_children.py +134 -0
- execweave-0.8.13/diagnostics/audit_python_journey.py +215 -0
- execweave-0.8.13/diagnostics/audit_real_clicks.py +83 -0
- execweave-0.8.13/diagnostics/current_state_reaudit.md +101 -0
- execweave-0.8.13/diagnostics/execweave_full_audit.md +468 -0
- execweave-0.8.13/diagnostics/gate_status.md +69 -0
- execweave-0.8.13/diagnostics/gate_status_history_through_g3.md +171 -0
- execweave-0.8.13/diagnostics/github_pr_inventory.json +402 -0
- execweave-0.8.13/diagnostics/handoff_checkpoint_20260906.md +98 -0
- execweave-0.8.13/diagnostics/next_agent_handoff.md +154 -0
- execweave-0.8.13/diagnostics/pr_regression_map.md +803 -0
- {execweave-0.8.11 → execweave-0.8.13}/pyproject.toml +6 -3
- execweave-0.8.13/scripts/_dashboard_acceptance_impl.py +598 -0
- execweave-0.8.13/scripts/_ollama_interactive_acceptance_impl.py +806 -0
- execweave-0.8.13/scripts/_ollama_visible_acceptance_impl.py +852 -0
- execweave-0.8.13/scripts/_python_native_acceptance_impl.py +542 -0
- execweave-0.8.13/scripts/acceptance/__init__.py +1 -0
- execweave-0.8.13/scripts/acceptance/browser_diagnostics.py +81 -0
- execweave-0.8.13/scripts/acceptance/contracts.py +33 -0
- execweave-0.8.13/scripts/acceptance/g5_runner.py +468 -0
- execweave-0.8.13/scripts/acceptance/g6_runner.py +258 -0
- execweave-0.8.13/scripts/acceptance/interrupt_guard.py +88 -0
- execweave-0.8.13/scripts/acceptance/processes.py +207 -0
- execweave-0.8.13/scripts/acceptance/reporting.py +336 -0
- execweave-0.8.13/scripts/acceptance/terminal_output.py +242 -0
- execweave-0.8.13/scripts/annotate_pytest_failures.py +52 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/audit_i18n_parity.py +4 -13
- execweave-0.8.13/scripts/check_release_stage_integrity.py +79 -0
- execweave-0.8.13/scripts/dashboard_acceptance.py +49 -0
- execweave-0.8.13/scripts/measure_graph_metrics.py +932 -0
- execweave-0.8.13/scripts/ollama_interactive_acceptance.py +88 -0
- execweave-0.8.13/scripts/ollama_visible_acceptance.py +33 -0
- execweave-0.8.13/scripts/owned_cleanup_acceptance.py +164 -0
- execweave-0.8.13/scripts/python_native_acceptance.py +52 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/__init__.py +1 -1
- execweave-0.8.11/src/execweave/dashboard_shell.py → execweave-0.8.13/src/execweave/_dashboard_shell_base.py +31 -1
- execweave-0.8.11/src/execweave/http_proxy.py → execweave-0.8.13/src/execweave/_http_proxy_base.py +79 -26
- execweave-0.8.13/src/execweave/_http_proxy_bounded.py +519 -0
- execweave-0.8.13/src/execweave/_http_proxy_stage.py +506 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/codex_hook_cli.py +31 -3
- execweave-0.8.13/src/execweave/codex_hook_entry.py +204 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/codex_hook_lifecycle.py +34 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/collector.py +185 -31
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/command.py +6 -1
- execweave-0.8.13/src/execweave/dashboard_shell.py +273 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/fidelity.py +20 -7
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/filesystem.py +12 -5
- execweave-0.8.13/src/execweave/http_proxy.py +187 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/live.py +18 -13
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/live_core.py +22 -8
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/live_view.py +6 -4
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/live_view_process_layout.py +311 -25
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/live_view_readability.py +56 -16
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/live_view_script_a.py +2 -2
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/live_view_script_b.py +82 -4
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/live_view_script_d.py +3 -3
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/live_view_style.py +7 -7
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/semantic.py +12 -7
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer_dashboard_clean.py +13 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer_dashboard_hardening.py +1 -0
- execweave-0.8.13/src/execweave/viewer_external_endpoints.py +307 -0
- execweave-0.8.13/src/execweave/viewer_semantic_projection.py +332 -0
- execweave-0.8.13/tests/test_acceptance_browser_diagnostics_e2e.py +138 -0
- execweave-0.8.13/tests/test_acceptance_conpty_selection.py +43 -0
- execweave-0.8.13/tests/test_acceptance_interrupt_guard.py +65 -0
- execweave-0.8.13/tests/test_acceptance_owned_processes.py +112 -0
- execweave-0.8.13/tests/test_acceptance_required_capabilities.py +64 -0
- execweave-0.8.13/tests/test_acceptance_terminal_output.py +79 -0
- execweave-0.8.13/tests/test_acceptance_visible_pipe.py +47 -0
- execweave-0.8.13/tests/test_auto_specialized_ollama_two_phase.py +230 -0
- execweave-0.8.13/tests/test_cleanup_finalizer_identity.py +31 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_codex_adapter.py +5 -1
- execweave-0.8.13/tests/test_codex_hook_global_fail_open.py +99 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_codex_hook_lifecycle.py +18 -2
- execweave-0.8.13/tests/test_codex_interrupt_contract.py +73 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_command.py +3 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_conversation_access.py +6 -1
- execweave-0.8.13/tests/test_dagre_semantic_pipeline.py +254 -0
- execweave-0.8.13/tests/test_dashboard_acceptance_relative_output_e2e.py +36 -0
- execweave-0.8.13/tests/test_dashboard_acceptance_reporting.py +60 -0
- execweave-0.8.13/tests/test_dashboard_camera_scheduler_e2e.py +299 -0
- execweave-0.8.13/tests/test_dashboard_favicon.py +8 -0
- execweave-0.8.13/tests/test_dashboard_gif_export_e2e.py +108 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_dashboard_information_architecture.py +8 -1
- execweave-0.8.13/tests/test_dashboard_initial_fit_readability_e2e.py +107 -0
- execweave-0.8.13/tests/test_dashboard_node_drag_camera_e2e.py +67 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_external_endpoints_all_providers.py +66 -42
- execweave-0.8.13/tests/test_g5_hardening_contract.py +39 -0
- execweave-0.8.13/tests/test_g6_owned_parity_contract.py +133 -0
- execweave-0.8.13/tests/test_graph_arrange_constraints_e2e.py +111 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_graph_clear_focus_e2e.py +4 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_graph_edge_routing_e2e.py +4 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_graph_lane_separation_e2e.py +52 -47
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_graph_node_sizing_e2e.py +2 -0
- execweave-0.8.13/tests/test_http_proxy_request_phase.py +121 -0
- execweave-0.8.13/tests/test_http_proxy_response_memory.py +154 -0
- execweave-0.8.13/tests/test_http_proxy_streaming.py +116 -0
- execweave-0.8.13/tests/test_i18n_readme_policy.py +49 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_live_auth.py +47 -0
- execweave-0.8.13/tests/test_ollama_interactive_acceptance.py +269 -0
- execweave-0.8.13/tests/test_ollama_interactive_terminal_semantics.py +76 -0
- execweave-0.8.13/tests/test_ollama_visible_acceptance.py +254 -0
- execweave-0.8.13/tests/test_pro6_audit_regressions.py +228 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_process_tree_layout.py +4 -5
- execweave-0.8.13/tests/test_provider_neutral_viewer_semantics.py +190 -0
- execweave-0.8.13/tests/test_pypi_0812_regressions.py +171 -0
- execweave-0.8.13/tests/test_python_native_acceptance.py +107 -0
- execweave-0.8.13/tests/test_relay_prompt_live_e2e.py +179 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_semantic.py +39 -0
- execweave-0.8.13/tests/test_single_agent_barycenter.py +261 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_tool_traffic_e2e.py +4 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_v069_dashboard_release.py +16 -12
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_viewer_agent_isolation_e2e.py +2 -1
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_viewer_projection.py +102 -44
- execweave-0.8.13/tests/test_visual_ux_readability.py +256 -0
- execweave-0.8.13/tools/verify_metrics_tool.py +104 -0
- execweave-0.8.11/.github/workflows/viewer-agent-isolation.yml +0 -45
- execweave-0.8.11/PKG-INFO +0 -347
- execweave-0.8.11/README.de.md +0 -286
- execweave-0.8.11/README.fr.md +0 -286
- execweave-0.8.11/README.ja.md +0 -286
- execweave-0.8.11/README.ko.md +0 -286
- execweave-0.8.11/README.md +0 -294
- execweave-0.8.11/README.ru.md +0 -286
- execweave-0.8.11/README.zh-CN.md +0 -286
- execweave-0.8.11/README.zh-TW.md +0 -286
- execweave-0.8.11/src/execweave/viewer_external_endpoints.py +0 -199
- {execweave-0.8.11 → execweave-0.8.13}/.github/workflows/cleanup-workflow-history.yml +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/.github/workflows/i18n.yml +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/.github/workflows/package-benchmark.yml +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/.github/workflows/package-smoke.yml +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/.github/workflows/publish.yml +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/.github/workflows/scalability.yml +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/.github/workflows/wheel-smoke.yml +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/.github/workflows/windows-launcher.yml +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/LICENSE +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/benchmarks/phase1_overhead.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/antigravity-hooks.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/assets/codex.gif +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/benchmarks/README.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/benchmarks/v0.6.0-github-actions.json +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/benchmarks/v0.6.0-github-actions.svg +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/claude-code-hooks.de.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/claude-code-hooks.fr.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/claude-code-hooks.ja.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/claude-code-hooks.ko.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/claude-code-hooks.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/claude-code-hooks.ru.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/claude-code-hooks.zh-CN.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/claude-code-hooks.zh-TW.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/codex-hooks.de.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/codex-hooks.fr.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/codex-hooks.ja.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/codex-hooks.ko.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/codex-hooks.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/codex-hooks.ru.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/codex-hooks.zh-CN.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/codex-hooks.zh-TW.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/cursor-hooks.de.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/cursor-hooks.fr.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/cursor-hooks.ja.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/cursor-hooks.ko.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/cursor-hooks.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/cursor-hooks.ru.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/cursor-hooks.zh-CN.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/cursor-hooks.zh-TW.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/evidence-grades.de.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/evidence-grades.fr.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/evidence-grades.ja.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/evidence-grades.ko.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/evidence-grades.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/evidence-grades.ru.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/evidence-grades.zh-CN.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/evidence-grades.zh-TW.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/inference-gateway.de.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/inference-gateway.fr.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/inference-gateway.ja.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/inference-gateway.ko.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/inference-gateway.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/inference-gateway.ru.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/inference-gateway.zh-CN.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/inference-gateway.zh-TW.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/internal/provider-capability-matrix.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/live-graph.de.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/live-graph.fr.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/live-graph.ja.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/live-graph.ko.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/live-graph.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/live-graph.ru.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/live-graph.zh-CN.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/live-graph.zh-TW.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/model-runtime.de.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/model-runtime.fr.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/model-runtime.ja.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/model-runtime.ko.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/model-runtime.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/model-runtime.ru.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/model-runtime.zh-CN.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/model-runtime.zh-TW.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/opencode-plugin.de.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/opencode-plugin.fr.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/opencode-plugin.ja.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/opencode-plugin.ko.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/opencode-plugin.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/opencode-plugin.ru.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/opencode-plugin.zh-CN.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/opencode-plugin.zh-TW.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/phase-1-runtime-collection.de.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/phase-1-runtime-collection.fr.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/phase-1-runtime-collection.ja.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/phase-1-runtime-collection.ko.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/phase-1-runtime-collection.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/phase-1-runtime-collection.ru.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/phase-1-runtime-collection.zh-CN.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/phase-1-runtime-collection.zh-TW.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/phase-2-execution-graph.de.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/phase-2-execution-graph.fr.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/phase-2-execution-graph.ja.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/phase-2-execution-graph.ko.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/phase-2-execution-graph.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/phase-2-execution-graph.ru.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/phase-2-execution-graph.zh-CN.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/phase-2-execution-graph.zh-TW.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/remaining-provider-audit-v0.8.7.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/rule-packs.de.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/rule-packs.fr.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/rule-packs.ja.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/rule-packs.ko.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/rule-packs.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/rule-packs.ru.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/rule-packs.zh-CN.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/rule-packs.zh-TW.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/run-integrity.de.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/run-integrity.fr.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/run-integrity.ja.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/run-integrity.ko.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/run-integrity.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/run-integrity.ru.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/run-integrity.zh-CN.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/run-integrity.zh-TW.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/runtime-threat-model.de.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/runtime-threat-model.fr.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/runtime-threat-model.ja.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/runtime-threat-model.ko.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/runtime-threat-model.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/runtime-threat-model.ru.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/runtime-threat-model.zh-CN.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/runtime-threat-model.zh-TW.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/security-analysis.de.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/security-analysis.fr.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/security-analysis.ja.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/security-analysis.ko.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/security-analysis.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/security-analysis.ru.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/security-analysis.zh-CN.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/security-analysis.zh-TW.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/semantic-telemetry.de.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/semantic-telemetry.fr.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/semantic-telemetry.ja.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/semantic-telemetry.ko.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/semantic-telemetry.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/semantic-telemetry.ru.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/semantic-telemetry.zh-CN.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/semantic-telemetry.zh-TW.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/v0.6.5-hardening-decisions.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/docs/v0.8.3-graph-ergonomics.md +0 -0
- /execweave-0.8.11/scripts/check_release_stage_integrity.py → /execweave-0.8.13/scripts/_check_release_stage_integrity_impl.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/check_claude_hook.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/check_claude_record_graph.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/check_codex_hook.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/check_conversation_records.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/check_correlation_graph.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/check_inference_gateway_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/check_model_runtime_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/check_openai_compatible_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/check_semantic_graph.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/check_viewer_js.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/check_wheel_install.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/check_windows_launchers.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/emit_claude_hook_smoke.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/emit_codex_hook_smoke.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/emit_cursor_hook_smoke.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/emit_opencode_plugin_smoke.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/make_semantic_smoke.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/probe_provider_capability.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/scripts/sync_i18n_nav.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/__main__.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/_conversation_records_core.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/agent_bootstrap.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/agent_topology.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/agent_trace.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/agy_preview_sanitize.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/analysis.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/anthropic.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/anthropic_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/anthropic_full_fidelity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/antigravity_adapter.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/antigravity_adapter_base.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/antigravity_full_fidelity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/antigravity_full_fidelity_base.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/antigravity_full_fidelity_collaboration_base.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/antigravity_hook_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/antigravity_record.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/antigravity_subagent_linkage.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/antigravity_trace_capability.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/auto_specialized.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/backends.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/benchmark.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/claude_adapter.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/claude_child_transcript.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/claude_delegation.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/claude_full_fidelity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/claude_hook_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/claude_hook_contract.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/claude_model_observer.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/claude_record.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/codex_adapter.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/codex_conversation.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/codex_full_fidelity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/codex_message_diagnostics.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/codex_message_transport_diagnostics.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/codex_record.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/codex_rollout_structures.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/codex_rollout_trace.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/codex_rollout_trace_base.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/content_evidence.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/content_store.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/conversation_archive.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/conversation_message_identity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/conversation_preview.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/conversation_preview_antigravity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/conversation_preview_claude.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/conversation_preview_codex.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/conversation_preview_common.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/conversation_preview_generic.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/conversation_preview_lines.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/conversation_preview_transcript.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/conversation_records.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/conversation_records_antigravity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/conversation_records_codex.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/conversation_records_common.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/conversation_records_ollama.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/correlation.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/cursor_adapter.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/cursor_delegation.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/cursor_delegation_base.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/cursor_full_fidelity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/cursor_hook_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/cursor_hook_contract.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/cursor_record.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/entry.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/evidence_availability.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/evidence_grade.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/focus.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/graph.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/graph_ops.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/http_proxy_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/inference_gateway.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/inference_gateway_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/inference_gateway_full_fidelity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/inference_identity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/inference_identity_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/integrity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/integrity_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/litellm_callback.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/litellm_callback_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/live_view_extra_style.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/live_view_markup.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/live_view_script_c.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/model_runtime.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/model_runtime_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/model_runtime_full_fidelity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/openai_compatible.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/openai_compatible_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/openai_compatible_full_fidelity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/opencode_adapter.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/opencode_event_contract.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/opencode_full_fidelity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/opencode_hook_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/opencode_plugin_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/opencode_record.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/opencode_task_linkage.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/overhead_benchmark.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/provider_capability.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/provider_lifecycle.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/provider_record.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/rule_pack.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/rule_pack_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/scalability_benchmark.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/schema.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/scope.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/sink.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/strace_backend.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/stream_assembly.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/theme.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/top.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/top_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/validate.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/vendor/dagre.min.js +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/view_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer_agent_panel.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer_agent_panel_antigravity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer_agent_panel_claude.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer_agent_panel_codex.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer_agent_panel_cursor.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer_agent_panel_default.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer_agent_panel_ollama.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer_agent_panel_opencode.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer_agent_panel_registry.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer_content_inspector.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer_dashboard_focus.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer_dashboard_hardening_v2.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer_limits.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer_live_layout.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer_projection.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/viewer_projection_base.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/src/execweave/workflow.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/dashboard_readability_fixture.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/fixtures/codex_multi_agent/PROVENANCE.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/fixtures/codex_multi_agent/hook-payloads.json +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/fixtures/codex_multi_agent/rollout-main.jsonl +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/fixtures/hooks/README.md +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/fixtures/hooks/claude.json +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/fixtures/hooks/codex.json +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/fixtures/hooks/cursor.json +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/fixtures/hooks/manifest.json +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/fixtures/hooks/opencode.json +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/multi_agent_run_fixture.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_agent_bootstrap.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_agent_message_viewer.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_agent_node_labels.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_agent_said_panel.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_agent_topology_evidence.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_agent_trace_lifecycle.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_agent_trace_viewer_visibility.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_agy_windows_wire_acceptance.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_analysis.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_anthropic.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_antigravity_agent_collaboration.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_antigravity_child_panel_policy.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_antigravity_child_transcript_tools.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_antigravity_cursor_launch.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_antigravity_field_run_regressions.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_antigravity_history_replay.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_antigravity_identity_topology.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_antigravity_invocation_archive.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_antigravity_lifecycle.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_antigravity_linkage_projection.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_antigravity_multi_conversation_isolation.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_antigravity_official_contract.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_antigravity_role_path_fallback.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_antigravity_root_child_history_v2.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_antigravity_subagent_transcript_linkage.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_antigravity_trace_capability_cli.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_auto_specialized.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_backends.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_claude_adapter.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_claude_child_transcript_tools.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_claude_delegation.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_claude_full_fidelity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_claude_hook_contract.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_claude_hook_metadata.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_claude_hook_viewer.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_claude_model_observer.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_claude_record.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_codex_archive_full_fidelity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_codex_child_panel_policy.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_codex_conversation_isolation.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_codex_full_fidelity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_codex_hook_partial_capture.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_codex_message_diagnostics.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_codex_message_transport_diagnostics.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_codex_nickname_path_fallback.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_codex_plain_routed_agent_message.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_codex_real_multi_agent_conversation.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_codex_record.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_codex_reducer_command.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_codex_rollout_structures.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_codex_rollout_trace.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_codex_routing_native_identity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_collector.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_condense.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_conversation_agent_focus.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_conversation_agent_isolation.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_conversation_identity_merge.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_conversation_message_observation_dedupe.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_conversation_provider_parity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_conversation_root_authority.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_correlation.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_correlation_canonical_path.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_correlation_checker.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_correlation_process_exe.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_cross_provider_agent_trace.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_cursor_adapter.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_cursor_delegation.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_cursor_full_fidelity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_cursor_hook_contract.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_cursor_hook_fail_open.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_cursor_ollama_session_lifecycle.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_cursor_record.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_cursor_task_linkage.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_dashboard_readability_e2e.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_dashboard_round_fold_state_e2e.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_dashboard_simplification.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_dashboard_ux_and_hook_projection.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_delegation_viewer.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_evidence_grade.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_execution_viewer.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_fidelity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_filesystem_resilience.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_focus.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_fold_budget_setting.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_full_fidelity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_graph.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_graph_ops.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_hook_fixture_corpus.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_http_proxy.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_inference_endpoint_identity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_inference_gateway.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_inference_gateway_full_fidelity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_inference_identity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_integrity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_litellm_callback.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_live.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_live_dashboard.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_live_dashboard_js.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_live_delta.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_live_logs_export.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_live_theme.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_lmstudio_auto_specialized.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_local_runtime_live_capture.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_model_runtime.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_model_runtime_full_fidelity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_ollama_panel_policy.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_ollama_serve_runtime_integration.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_openai_compatible.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_opencode_adapter.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_opencode_event_contract.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_opencode_event_lifecycle.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_opencode_full_fidelity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_opencode_identity_unification.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_opencode_plugin.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_opencode_record.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_opencode_task_session_linkage.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_overhead_benchmark.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_per_agent_conversation_default.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_pr25_premerge_hardening_contract.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_pr25_premerge_hardening_e2e.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_provider_capability.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_provider_conversation_evidence.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_provider_conversation_history_integrity.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_provider_dashboard_contract.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_provider_lifecycle.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_release_stage_integrity_version_guard.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_rule_pack.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_schema.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_scope.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_shared_injected_context_scope.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_strace_backend.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_stream_assembly.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_threat_model.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_top_detached.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_v063_features.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_v064_live_auto_integrations.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_v064_live_evidence.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_v079_review_e2e.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_v079_review_regressions.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_v083_release_gate_p2.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_validate.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_version.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_viewer.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_viewer_child_authority.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_viewer_content_inspector.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_viewer_limits.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_windows_codex_agy_display_repair.py +0 -0
- {execweave-0.8.11 → execweave-0.8.13}/tests/test_workflow.py +0 -0
|
@@ -133,7 +133,10 @@ jobs:
|
|
|
133
133
|
- name: Ruff
|
|
134
134
|
run: ruff check .
|
|
135
135
|
- name: Tests
|
|
136
|
-
run: pytest -q
|
|
136
|
+
run: pytest -q --junitxml=pytest-results.xml
|
|
137
|
+
- name: Annotate pytest failures
|
|
138
|
+
if: failure() && hashFiles('pytest-results.xml') != ''
|
|
139
|
+
run: python scripts/annotate_pytest_failures.py pytest-results.xml
|
|
137
140
|
- name: Claude hook command smoke
|
|
138
141
|
run: python scripts/check_claude_hook.py
|
|
139
142
|
- name: Claude run-bound semantic and correlation smoke
|
{execweave-0.8.11 → execweave-0.8.13}/.github/workflows/provider-capability-stage-integrity.yml
RENAMED
|
@@ -147,11 +147,62 @@ jobs:
|
|
|
147
147
|
esac
|
|
148
148
|
done < <(git diff --name-only "$BASELINE_REF...HEAD" -- tests)
|
|
149
149
|
fi
|
|
150
|
+
if [[ "$HEAD_REF" == "test/live-dashboard-acceptance" ]]; then
|
|
151
|
+
while IFS= read -r path; do
|
|
152
|
+
case "$path" in
|
|
153
|
+
tests/test_command.py)
|
|
154
|
+
args+=(--allow-test-change "$path=acceptance branch isolates the historical Windows shim fallback from installed Cursor desktop candidates; native desktop preference and custom-install contracts remain separate and existing test node IDs are unchanged")
|
|
155
|
+
;;
|
|
156
|
+
tests/test_codex_adapter.py)
|
|
157
|
+
args+=(--allow-test-change "$path=Codex now documents Interrupt as a first-class hook with a bounded handler contract; the existing config test node ID is retained and now asserts the current official event and timeout semantics")
|
|
158
|
+
;;
|
|
159
|
+
tests/test_codex_hook_lifecycle.py)
|
|
160
|
+
args+=(--allow-test-change "$path=Codex now documents Interrupt as a first-class lifecycle event; the historical test node ID is retained while its assertion is corrected to the current official contract")
|
|
161
|
+
;;
|
|
162
|
+
tests/test_v069_dashboard_release.py)
|
|
163
|
+
args+=(--allow-test-change "$path=README policy is now stable product documentation instead of release notes; the historical test node IDs are retained while assertions require no hard-coded release tags and preserve dashboard/conversation/license anchors")
|
|
164
|
+
;;
|
|
165
|
+
tests/test_graph_clear_focus_e2e.py|tests/test_graph_edge_routing_e2e.py|tests/test_graph_node_sizing_e2e.py|tests/test_tool_traffic_e2e.py)
|
|
166
|
+
args+=(--allow-test-change "$path=existing browser assertions are unchanged; the module-level viewer_e2e marker makes the dedicated three-OS browser workflow collect tests that were previously omitted")
|
|
167
|
+
;;
|
|
168
|
+
tests/test_graph_lane_separation_e2e.py)
|
|
169
|
+
args+=(--allow-test-change "$path=layout acceptance separates endpoint projection from lane geometry using loopback fixtures and replaces obsolete fixed canvas coordinates with semantic lane/band invariants; historical test node IDs remain unchanged")
|
|
170
|
+
;;
|
|
171
|
+
tests/test_http_proxy.py)
|
|
172
|
+
args+=(--allow-test-change "$path=NEW-005 adds native streaming-order regressions for content-length and chunked responses; existing test assertions and node IDs are unchanged")
|
|
173
|
+
;;
|
|
174
|
+
tests/test_conversation_access.py)
|
|
175
|
+
args+=(--allow-test-change "$path=the historical live conversation-access test now requires bounded authenticated polling with AbortController cleanup at finished state; the test node ID and auth/path-boundary assertions remain unchanged")
|
|
176
|
+
;;
|
|
177
|
+
tests/test_semantic.py)
|
|
178
|
+
args+=(--allow-test-change "$path=NEW-006 adds contradictory and future PID identity regressions through merge and graph materialization; existing test assertions and node IDs are unchanged")
|
|
179
|
+
;;
|
|
180
|
+
tests/test_live_auth.py)
|
|
181
|
+
args+=(--allow-test-change "$path=acceptance branch adds the native client-reset regression proving expected Windows disconnects are suppressed without hiding unexpected server errors")
|
|
182
|
+
;;
|
|
183
|
+
tests/test_process_tree_layout.py)
|
|
184
|
+
args+=(--allow-test-change "$path=acceptance branch replaces obsolete fixed layout coordinates with semantic lane and ordering assertions while retaining the historical test node IDs")
|
|
185
|
+
;;
|
|
186
|
+
tests/test_external_endpoints_all_providers.py)
|
|
187
|
+
args+=(--allow-test-change "$path=loopback endpoint presentation intentionally changed from individual raw nodes to one provider-neutral Local endpoints cluster while External behavior remains; historical test node IDs are retained and raw endpoint evidence is unchanged")
|
|
188
|
+
;;
|
|
189
|
+
tests/test_viewer_projection.py)
|
|
190
|
+
args+=(--allow-test-change "$path=approved provider-neutral endpoint semantics retire the old four-endpoint threshold and per-process loopback cluster shape: every loopback endpoint now folds into one Local endpoints node while source edges, chronology, expansion evidence, and historical test node IDs are retained")
|
|
191
|
+
;;
|
|
192
|
+
tests/test_dashboard_information_architecture.py)
|
|
193
|
+
args+=(--allow-test-change "$path=approved orphan-file presentation now folds degree-zero file and directory nodes into the expandable Files / directories viewer cluster; the historical test node ID remains and the assertion now requires the original notes.txt evidence in cluster expansion")
|
|
194
|
+
;;
|
|
195
|
+
tests/test_viewer_agent_isolation_e2e.py)
|
|
196
|
+
args+=(--allow-test-change "$path=live conversation ownership now reads the raw observed graph before viewer-only endpoint, request, and orphan collapse; historical test IDs and conversation completeness assertions remain unchanged and only the live-index fixture injection seam follows _raw_graph_locked")
|
|
197
|
+
;;
|
|
198
|
+
esac
|
|
199
|
+
done < <(git diff --name-only "$BASELINE_REF...HEAD" -- tests)
|
|
200
|
+
fi
|
|
150
201
|
if [[ "$HEAD_REF" == "audit/remaining-providers-v0.8.7" ]]; then
|
|
151
202
|
args+=(--allow-retired-provider "gemini=Gemini integration was retired and replaced by the AGY/Antigravity provider; only Gemini-owned test IDs and files may disappear")
|
|
152
203
|
while IFS= read -r path; do
|
|
153
204
|
case "$path" in
|
|
154
|
-
tests/fixtures/hooks/manifest.json|tests/test_agent_bootstrap.py|tests/test_agent_topology_evidence.py|tests/test_agent_trace_viewer_visibility.py|tests/test_antigravity_agent_collaboration.py|tests/test_antigravity_child_transcript_tools.py|tests/test_antigravity_cursor_launch.py|tests/test_antigravity_identity_topology.py|tests/test_antigravity_invocation_archive.py|tests/test_antigravity_official_contract.py|tests/test_antigravity_subagent_transcript_linkage.py|tests/test_antigravity_trace_capability_cli.py|tests/test_claude_adapter.py|tests/test_codex_real_multi_agent_conversation.py|tests/test_collector.py|tests/test_command.py|tests/test_conversation_access.py|tests/test_conversation_agent_isolation.py|tests/test_conversation_identity_merge.py|tests/
|
|
205
|
+
tests/fixtures/hooks/manifest.json|tests/test_agent_bootstrap.py|tests/test_agent_topology_evidence.py|tests/test_agent_trace_viewer_visibility.py|tests/test_antigravity_agent_collaboration.py|tests/test_antigravity_child_transcript_tools.py|tests/test_antigravity_cursor_launch.py|tests/test_antigravity_identity_topology.py|tests/test_antigravity_invocation_archive.py|tests/test_antigravity_official_contract.py|tests/test_antigravity_subagent_transcript_linkage.py|tests/test_antigravity_trace_capability_cli.py|tests/test_claude_adapter.py|tests/test_codex_real_multi_agent_conversation.py|tests/test_collector.py|tests/test_command.py|tests/test_conversation_access.py|tests/test_conversation_agent_isolation.py|tests/test_conversation_identity_merge.py|tests/test_cross_provider_agent_trace.py|tests/test_cursor_adapter.py|tests/test_dashboard_information_architecture.py|tests/test_external_endpoints_all_providers.py|tests/test_hook_fixture_corpus.py|tests/test_provider_capability.py|tests/test_provider_conversation_evidence.py|tests/test_provider_lifecycle.py|tests/test_v064_live_auto_integrations.py)
|
|
155
206
|
args+=(--allow-test-change "$path=Gemini provider retirement and provider-neutral AGY/dashboard contract updates are intentional on this branch; existing test node IDs remain stable where the provider is still supported")
|
|
156
207
|
;;
|
|
157
208
|
esac
|
|
@@ -39,6 +39,7 @@ jobs:
|
|
|
39
39
|
tests/test_provider_conversation_evidence.py
|
|
40
40
|
tests/test_provider_conversation_history_integrity.py
|
|
41
41
|
tests/test_external_endpoints_all_providers.py
|
|
42
|
+
tests/test_provider_neutral_viewer_semantics.py
|
|
42
43
|
tests/test_graph.py
|
|
43
44
|
tests/test_antigravity_field_run_regressions.py
|
|
44
45
|
tests/test_antigravity_subagent_transcript_linkage.py
|
|
@@ -145,5 +146,6 @@ jobs:
|
|
|
145
146
|
python -m pytest -q
|
|
146
147
|
tests/test_provider_dashboard_contract.py
|
|
147
148
|
${{ matrix.tests }}
|
|
149
|
+
tests/test_provider_neutral_viewer_semantics.py
|
|
148
150
|
- name: Check dashboard JavaScript syntax
|
|
149
151
|
run: python -m pytest -q tests/test_live_dashboard_js.py tests/test_live_dashboard.py
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
name: Viewer Agent Isolation
|
|
2
|
+
|
|
3
|
+
# The release gate opens the actual dashboard in Chromium. It reads the visible
|
|
4
|
+
# root/subagent/non-agent inspectors, compares live with viewer.html, and archives
|
|
5
|
+
# screenshots plus the rendered live.html for a human visual pass.
|
|
6
|
+
on:
|
|
7
|
+
pull_request:
|
|
8
|
+
push:
|
|
9
|
+
branches: [main, test/live-dashboard-acceptance]
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
viewers:
|
|
17
|
+
strategy:
|
|
18
|
+
fail-fast: false
|
|
19
|
+
matrix:
|
|
20
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
21
|
+
runs-on: ${{ matrix.os }}
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v4
|
|
24
|
+
|
|
25
|
+
- uses: actions/setup-python@v5
|
|
26
|
+
with:
|
|
27
|
+
python-version: "3.12"
|
|
28
|
+
cache: pip
|
|
29
|
+
|
|
30
|
+
- name: Install
|
|
31
|
+
run: python -m pip install -e ".[dev,e2e]"
|
|
32
|
+
|
|
33
|
+
- name: Install Chromium
|
|
34
|
+
run: python -m playwright install --with-deps chromium
|
|
35
|
+
|
|
36
|
+
- name: Read live and viewer.html in a browser (Linux)
|
|
37
|
+
if: runner.os == 'Linux'
|
|
38
|
+
env:
|
|
39
|
+
EXECWEAVE_E2E_REQUIRED: "1"
|
|
40
|
+
EXECWEAVE_VISUAL_ARTIFACT_DIR: visual-artifacts
|
|
41
|
+
run: xvfb-run -a python -m pytest -m viewer_e2e -v --junitxml=viewer-pytest-results.xml
|
|
42
|
+
|
|
43
|
+
- name: Read live and viewer.html in a browser (macOS/Windows)
|
|
44
|
+
if: runner.os != 'Linux'
|
|
45
|
+
env:
|
|
46
|
+
EXECWEAVE_E2E_REQUIRED: "1"
|
|
47
|
+
EXECWEAVE_VISUAL_ARTIFACT_DIR: visual-artifacts
|
|
48
|
+
run: python -m pytest -m viewer_e2e -v --junitxml=viewer-pytest-results.xml
|
|
49
|
+
|
|
50
|
+
- name: Annotate viewer pytest failures
|
|
51
|
+
if: failure() && hashFiles('viewer-pytest-results.xml') != ''
|
|
52
|
+
run: python scripts/annotate_pytest_failures.py viewer-pytest-results.xml
|
|
53
|
+
|
|
54
|
+
- name: Run formal offline dashboard acceptance
|
|
55
|
+
run: >-
|
|
56
|
+
python scripts/dashboard_acceptance.py
|
|
57
|
+
--mode offline
|
|
58
|
+
--output-dir "${{ github.workspace }}/artifacts/dashboard-acceptance"
|
|
59
|
+
--require offline-ollama-fixture
|
|
60
|
+
|
|
61
|
+
- name: Run formal owned-process cleanup acceptance
|
|
62
|
+
run: >-
|
|
63
|
+
python scripts/owned_cleanup_acceptance.py
|
|
64
|
+
--output-dir "${{ github.workspace }}/artifacts/dashboard-acceptance/owned-cleanup"
|
|
65
|
+
|
|
66
|
+
- name: Run formal native Python OS acceptance (Linux)
|
|
67
|
+
if: runner.os == 'Linux'
|
|
68
|
+
run: >-
|
|
69
|
+
xvfb-run -a python scripts/python_native_acceptance.py
|
|
70
|
+
--output-dir "${{ github.workspace }}/artifacts/dashboard-acceptance/python-native"
|
|
71
|
+
--require python
|
|
72
|
+
|
|
73
|
+
- name: Run formal native Python OS acceptance (macOS/Windows)
|
|
74
|
+
if: runner.os != 'Linux'
|
|
75
|
+
run: >-
|
|
76
|
+
python scripts/python_native_acceptance.py
|
|
77
|
+
--output-dir "${{ github.workspace }}/artifacts/dashboard-acceptance/python-native"
|
|
78
|
+
--require python
|
|
79
|
+
|
|
80
|
+
- name: Upload visual release evidence
|
|
81
|
+
if: always()
|
|
82
|
+
uses: actions/upload-artifact@v4
|
|
83
|
+
with:
|
|
84
|
+
name: unified-dashboard-visuals-${{ matrix.os }}
|
|
85
|
+
path: |
|
|
86
|
+
visual-artifacts
|
|
87
|
+
artifacts/dashboard-acceptance
|
|
88
|
+
if-no-files-found: error
|
|
89
|
+
retention-days: 7
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: execweave
|
|
3
|
+
Version: 0.8.13
|
|
4
|
+
Summary: Turn AI-agent runtime behavior into a local interactive execution graph.
|
|
5
|
+
Project-URL: Homepage, https://github.com/Irish-kw/ExecWeave
|
|
6
|
+
Project-URL: Repository, https://github.com/Irish-kw/ExecWeave
|
|
7
|
+
Project-URL: Documentation, https://github.com/Irish-kw/ExecWeave#documentation
|
|
8
|
+
Project-URL: Issues, https://github.com/Irish-kw/ExecWeave/issues
|
|
9
|
+
Author: ExecWeave contributors
|
|
10
|
+
License: PolyForm Noncommercial License 1.0.0
|
|
11
|
+
|
|
12
|
+
This software is licensed under the PolyForm Noncommercial License 1.0.0.
|
|
13
|
+
The complete license terms are available at:
|
|
14
|
+
https://polyformproject.org/licenses/noncommercial/1.0.0
|
|
15
|
+
|
|
16
|
+
Required Notice: Copyright (c) 2026 GWW
|
|
17
|
+
|
|
18
|
+
Commercial use is not permitted under this license. Any commercial use,
|
|
19
|
+
including use in or for a commercial product or service, requires a separate
|
|
20
|
+
written commercial license from the licensor.
|
|
21
|
+
|
|
22
|
+
For the avoidance of doubt, this license change applies to versions released
|
|
23
|
+
under these terms. Earlier versions that were already distributed under the
|
|
24
|
+
MIT License remain available under the license terms that accompanied those
|
|
25
|
+
versions.
|
|
26
|
+
License-File: LICENSE
|
|
27
|
+
Keywords: ai-agents,execution-graph,observability,provenance,runtime,security
|
|
28
|
+
Classifier: Development Status :: 4 - Beta
|
|
29
|
+
Classifier: Environment :: Console
|
|
30
|
+
Classifier: Intended Audience :: Developers
|
|
31
|
+
Classifier: Intended Audience :: Information Technology
|
|
32
|
+
Classifier: License :: Other/Proprietary License
|
|
33
|
+
Classifier: Operating System :: OS Independent
|
|
34
|
+
Classifier: Programming Language :: Python :: 3
|
|
35
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
36
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
37
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
38
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
39
|
+
Classifier: Topic :: Software Development :: Debuggers
|
|
40
|
+
Classifier: Topic :: System :: Monitoring
|
|
41
|
+
Requires-Python: >=3.10
|
|
42
|
+
Requires-Dist: psutil>=5.9
|
|
43
|
+
Requires-Dist: watchdog>=4.0
|
|
44
|
+
Provides-Extra: dev
|
|
45
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
46
|
+
Requires-Dist: pywinpty<4,>=3.0.5; (platform_system == 'Windows') and extra == 'dev'
|
|
47
|
+
Requires-Dist: ruff<0.17,>=0.16; extra == 'dev'
|
|
48
|
+
Provides-Extra: e2e
|
|
49
|
+
Requires-Dist: playwright>=1.44; extra == 'e2e'
|
|
50
|
+
Requires-Dist: pywinpty<4,>=3.0.5; (platform_system == 'Windows') and extra == 'e2e'
|
|
51
|
+
Provides-Extra: release
|
|
52
|
+
Requires-Dist: build>=1.2; extra == 'release'
|
|
53
|
+
Requires-Dist: twine>=6.0; extra == 'release'
|
|
54
|
+
Description-Content-Type: text/markdown
|
|
55
|
+
|
|
56
|
+
# ExecWeave
|
|
57
|
+
|
|
58
|
+
<!-- i18n-nav:start -->
|
|
59
|
+
<p align="center">
|
|
60
|
+
<strong>English</strong> |
|
|
61
|
+
<a href="README.zh-TW.md">繁體中文</a> |
|
|
62
|
+
<a href="README.zh-CN.md">简体中文</a> |
|
|
63
|
+
<a href="README.ja.md">日本語</a> |
|
|
64
|
+
<a href="README.ko.md">한국어</a> |
|
|
65
|
+
<a href="README.fr.md">Français</a> |
|
|
66
|
+
<a href="README.de.md">Deutsch</a> |
|
|
67
|
+
<a href="README.ru.md">Русский</a>
|
|
68
|
+
</p>
|
|
69
|
+
<!-- i18n-nav:end -->
|
|
70
|
+
|
|
71
|
+
<p align="center">
|
|
72
|
+
<a href="https://pypi.org/project/execweave/"><img src="https://img.shields.io/pypi/v/execweave" alt="PyPI"></a>
|
|
73
|
+
<a href="https://github.com/Irish-kw/ExecWeave/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/Irish-kw/ExecWeave/ci.yml?branch=main" alt="CI"></a>
|
|
74
|
+
<img src="https://img.shields.io/badge/Python-3.10%2B-blue" alt="Python 3.10+">
|
|
75
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-PolyForm%20Noncommercial-blue" alt="License"></a>
|
|
76
|
+
</p>
|
|
77
|
+
|
|
78
|
+
**See what AI agents actually do on your machine.**
|
|
79
|
+
|
|
80
|
+
ExecWeave is a local-first observability project for AI agents and AI-assisted development tools. It combines provider-level semantics with operating-system runtime evidence and presents them as one interactive execution graph.
|
|
81
|
+
|
|
82
|
+
> **Events are evidence. The graph is a materialized view.**
|
|
83
|
+
|
|
84
|
+
<p align="center">
|
|
85
|
+
<img src="docs/assets/codex.gif" alt="ExecWeave live dashboard demo" width="100%">
|
|
86
|
+
</p>
|
|
87
|
+
|
|
88
|
+
## Why ExecWeave
|
|
89
|
+
|
|
90
|
+
An agent can say it used a tool, edited a file, or contacted a service. That is useful semantic evidence, but it is not the same as observing what happened on the machine. ExecWeave keeps those layers separate and lets you inspect them together.
|
|
91
|
+
|
|
92
|
+
- **One dashboard for live and finished runs.** The live page, completed run, and standalone `viewer.html` use the same graph and conversation model.
|
|
93
|
+
- **Provider-aware semantics.** Hooks, rollout transcripts, plugins, and runtime APIs are used when a provider exposes them.
|
|
94
|
+
- **OS-runtime evidence.** Processes, files, and network endpoints can be observed independently of provider semantics.
|
|
95
|
+
- **Evidence-aware attribution.** Direct observations, exact identities, conservative inference, and causal claims are not flattened into one label.
|
|
96
|
+
- **Local-first storage.** Run artifacts stay on the machine unless you choose to copy or share them.
|
|
97
|
+
- **Works beyond one agent.** You can wrap ordinary local commands even when no specialized provider adapter exists.
|
|
98
|
+
|
|
99
|
+
## Install
|
|
100
|
+
|
|
101
|
+
Install from PyPI:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
python -m pip install -U execweave
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
For development:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
git clone https://github.com/Irish-kw/ExecWeave.git
|
|
111
|
+
cd ExecWeave
|
|
112
|
+
python -m pip install -e ".[dev]"
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Quick start
|
|
116
|
+
|
|
117
|
+
Wrap any local command with `execweave live`:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
execweave live --open -- claude
|
|
121
|
+
execweave live --open -- codex
|
|
122
|
+
execweave live --open -- antigravity
|
|
123
|
+
execweave live --open -- cursor
|
|
124
|
+
execweave live --open -- opencode
|
|
125
|
+
execweave live --open -- python my_agent.py
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Use `record` when you mainly want finalized artifacts:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
execweave record --open -- python my_agent.py
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Use `top` when you want a detached overview while keeping the launched program interactive in the current terminal:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
execweave top -- codex
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Provider integration approval
|
|
141
|
+
|
|
142
|
+
Some agents and IDEs ask for permission before enabling a local hook or plugin. Approve the ExecWeave integration if you want provider-level prompt, response, tool, model, and conversation evidence. If you do not approve it, OS-runtime observation can still work, but semantic coverage may be reduced.
|
|
143
|
+
|
|
144
|
+
Google Antigravity currently uses the `agy` CLI command. ExecWeave also accepts `antigravity` as a friendly alias.
|
|
145
|
+
|
|
146
|
+
On Windows, bare `cursor` follows the Cursor installation referenced by the user's PATH. Explicit launcher paths are respected.
|
|
147
|
+
|
|
148
|
+
## Ollama
|
|
149
|
+
|
|
150
|
+
ExecWeave supports two common local Ollama workflows.
|
|
151
|
+
|
|
152
|
+
### Managed server capture
|
|
153
|
+
|
|
154
|
+
Start Ollama through ExecWeave:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
execweave live --open -- ollama serve
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Then use Ollama normally from another terminal:
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
ollama run deepseek-r1:1.5b
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
SDK calls, OpenAI-compatible local requests, and `curl` requests that reach the managed local endpoint can be associated with the same ExecWeave run. The second terminal does not need another ExecWeave wrapper.
|
|
167
|
+
|
|
168
|
+
Managed relay mode is intentionally limited to local loopback endpoints. ExecWeave does not rewrite wildcard or externally exposed Ollama listeners.
|
|
169
|
+
|
|
170
|
+
### Direct client capture
|
|
171
|
+
|
|
172
|
+
If an Ollama server is already running, you can wrap the client directly:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
execweave live --open -- ollama run deepseek-r1:1.5b
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
This mode does not start an Ollama server. A reachable upstream server is still required.
|
|
179
|
+
|
|
180
|
+
## Dashboard
|
|
181
|
+
|
|
182
|
+
The dashboard is designed to keep large, multi-agent runs inspectable without changing the underlying evidence.
|
|
183
|
+
|
|
184
|
+
- **Execution graph:** agents, processes, files, network endpoints, tools, model/runtime entities, and supported relations.
|
|
185
|
+
- **Conversation rounds:** recent and historical rounds remain associated with the correct agent instead of being overwritten by later messages.
|
|
186
|
+
- **Node details:** inspect process identity, file history, network endpoints, tools, and provider conversation content.
|
|
187
|
+
- **Stable live updates:** the dashboard updates in place instead of replacing the whole document when a run changes state.
|
|
188
|
+
- **Large-run folding:** high-cardinality node types can collapse older members while keeping them inspectable.
|
|
189
|
+
- **Selection-focused layout:** selecting an agent or runtime object de-emphasizes unrelated graph traffic.
|
|
190
|
+
|
|
191
|
+
You can tune large-run rendering with:
|
|
192
|
+
|
|
193
|
+
```text
|
|
194
|
+
--fold-budget N
|
|
195
|
+
--viewer-max-nodes N
|
|
196
|
+
--viewer-max-edges N
|
|
197
|
+
--viewer-max-dom-elements N
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Supported integrations
|
|
201
|
+
|
|
202
|
+
| Integration | OS-runtime observation | Specialized evidence |
|
|
203
|
+
| --- | --- | --- |
|
|
204
|
+
| Claude Code | Yes when launched under ExecWeave | native hooks and provider-supplied conversation/tool content |
|
|
205
|
+
| OpenAI Codex | Yes | lifecycle hooks, validated rollout transcripts, agent/subagent routing where exposed |
|
|
206
|
+
| Google Antigravity | Yes | passive hooks and conversation/subagent routing where exposed |
|
|
207
|
+
| Cursor | Yes | native hooks and task/subagent routing where exposed |
|
|
208
|
+
| OpenCode | Yes | project plugin, session/task routing, supplied plugin content |
|
|
209
|
+
| Ollama | Yes | managed local relay and model-runtime evidence |
|
|
210
|
+
| llama.cpp | Yes | model-runtime event/exchange/probe integration |
|
|
211
|
+
| vLLM | Yes | model-runtime event/exchange/probe integration |
|
|
212
|
+
| LM Studio | When the local process is observed | model-runtime catalog/runtime evidence |
|
|
213
|
+
| LiteLLM Proxy | When the local proxy is observed | gateway metadata and event integration |
|
|
214
|
+
| OpenRouter | Local client only; the remote service process is not observable | caller-supplied gateway event/exchange evidence |
|
|
215
|
+
|
|
216
|
+
Provider identifiers such as a tool-call ID, session ID, rollout thread ID, or subagent route are logical identities. They are not automatically OS process IDs. ExecWeave links layers only when the available evidence supports the link.
|
|
217
|
+
|
|
218
|
+
## Evidence model
|
|
219
|
+
|
|
220
|
+
ExecWeave separates four broad layers:
|
|
221
|
+
|
|
222
|
+
```text
|
|
223
|
+
Agent / IDE semantics and supplied content
|
|
224
|
+
↓
|
|
225
|
+
Inference gateway / routing evidence
|
|
226
|
+
↓
|
|
227
|
+
Model runtime / inference-server evidence
|
|
228
|
+
↓
|
|
229
|
+
OS runtime evidence: process / file / network
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
A relationship is marked causal only when the underlying telemetry supports a causal claim. Conservative bridges remain explicit derived evidence, for example:
|
|
233
|
+
|
|
234
|
+
```text
|
|
235
|
+
inferred: true
|
|
236
|
+
causal: false
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
An exact shared request identity can prove identity without proving causality:
|
|
240
|
+
|
|
241
|
+
```text
|
|
242
|
+
identity_exact: true
|
|
243
|
+
inferred: false
|
|
244
|
+
causal: false
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
If attribution is ambiguous, ExecWeave should leave the edge absent rather than invent a stronger relationship.
|
|
248
|
+
|
|
249
|
+
### Full-fidelity supplied content
|
|
250
|
+
|
|
251
|
+
Supported integrations can preserve complete values explicitly supplied by provider hooks, plugins, or APIs in a local SHA-256 content-addressed store:
|
|
252
|
+
|
|
253
|
+
```text
|
|
254
|
+
<run-root>/content/sha256/<sha256>.<json|txt|bin>
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
Depending on the integration, this can include prompts, messages, request/response objects, tool inputs/results, assistant responses, exposed reasoning text, shell output, and supplied file content.
|
|
258
|
+
|
|
259
|
+
`complete_from_source: true` means ExecWeave stored the complete value delivered by that integration point. It does **not** mean ExecWeave observed hidden model state or provider-side data that was never exposed.
|
|
260
|
+
|
|
261
|
+
## Common commands
|
|
262
|
+
|
|
263
|
+
### Agent and IDE recorders
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
execweave-claude-record --open -- claude
|
|
267
|
+
execweave-codex-record --open -- codex
|
|
268
|
+
execweave-antigravity-record --open -- antigravity
|
|
269
|
+
execweave-cursor-record --open -- cursor
|
|
270
|
+
execweave-opencode-plugin --install
|
|
271
|
+
execweave-opencode-record --open -- opencode
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Gateways and model runtimes
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
execweave-inference-gateway event --gateway openrouter --sidecar gateway.jsonl
|
|
278
|
+
execweave-inference-gateway exchange --gateway openrouter --sidecar gateway.jsonl
|
|
279
|
+
execweave-model-runtime event --runtime ollama --sidecar model-runtime.jsonl
|
|
280
|
+
execweave-model-runtime exchange --runtime ollama --sidecar model-runtime.jsonl
|
|
281
|
+
execweave-model-runtime probe --runtime ollama --sidecar model-runtime.jsonl
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
`event` records one-sided event evidence. `exchange` records a caller-supplied request/response pair; it does not claim transparent wire interception.
|
|
285
|
+
|
|
286
|
+
### Runtime, graph, security, and integrity
|
|
287
|
+
|
|
288
|
+
```bash
|
|
289
|
+
execweave doctor
|
|
290
|
+
execweave run --backend portable -- your-command
|
|
291
|
+
execweave run --backend strace -- your-command
|
|
292
|
+
execweave graph-summary run.graph.json
|
|
293
|
+
execweave graph-filter run.graph.json --causal-only --output causal.graph.json
|
|
294
|
+
execweave graph-focus run.graph.json NODE_ID --hops 2 --output focused.graph.json
|
|
295
|
+
execweave path run.graph.json SOURCE TARGET --causal-only
|
|
296
|
+
execweave analyze run.graph.json --output analysis.json
|
|
297
|
+
execweave-rule-pack graph.json --rule-pack local-policy.json --output report.json
|
|
298
|
+
execweave-integrity seal .execweave/runs/<run-id>
|
|
299
|
+
execweave-integrity verify .execweave/runs/<run-id>
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
## Run artifacts
|
|
303
|
+
|
|
304
|
+
A provider-integrated run can contain:
|
|
305
|
+
|
|
306
|
+
```text
|
|
307
|
+
.execweave/runs/<run-id>/
|
|
308
|
+
├── events.jsonl
|
|
309
|
+
├── graph.json
|
|
310
|
+
├── viewer.html
|
|
311
|
+
├── semantic.jsonl
|
|
312
|
+
├── content/sha256/...
|
|
313
|
+
├── conversations.md
|
|
314
|
+
├── conversations.json
|
|
315
|
+
├── events.semantic.jsonl
|
|
316
|
+
├── graph.semantic.json
|
|
317
|
+
├── viewer.semantic.html
|
|
318
|
+
├── events.correlated.jsonl
|
|
319
|
+
├── graph.correlated.json
|
|
320
|
+
├── viewer.correlated.html
|
|
321
|
+
└── integrity.json
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
Raw observations remain separate from derived semantic and correlation outputs.
|
|
325
|
+
|
|
326
|
+
## Limits and privacy
|
|
327
|
+
|
|
328
|
+
- The portable collector runs on Linux, macOS, and Windows. Portable filesystem observation is session-correlated rather than always process-causal, and polling can miss sufficiently short-lived activity.
|
|
329
|
+
- **Process lifetime identity:** portable process tracking distinguishes PID reuse with the process creation time. A reused PID is recorded as a new process lifetime instead of being collapsed into the earlier process.
|
|
330
|
+
- **Explicit degraded-state reporting:** terminal network collection health is reported as `available`, `degraded`, `unavailable`, `not_sampled`, or `not_requested`. A finished live conversation is considered synchronized only after the final conversation fetch succeeds; stopping polling alone is not treated as successful synchronization.
|
|
331
|
+
- **Failure ownership cleanup:** if the portable collector fails unexpectedly after launching a managed workload, it terminates the workload it owns before recording terminal session state. A filesystem observer that only partially starts is also torn down before the startup error propagates.
|
|
332
|
+
- Linux also provides a `strace` reference backend with stronger syscall-attributed evidence for supported executions.
|
|
333
|
+
- Provider semantics depend on what each integration actually exposes. Missing prompts, hidden reasoning, remote provider internals, and unexposed routing cannot be reconstructed reliably.
|
|
334
|
+
- Full-fidelity provider content may contain credentials, secrets, source code, prompts, tool values, model responses, shell output, and file contents.
|
|
335
|
+
- Conversation isolation is an attribution rule, not a redaction boundary. Explicitly routed content may legitimately appear at more than one participant.
|
|
336
|
+
- A local integrity manifest detects changes relative to the manifest; it is not an adversary-resistant trusted logging system if both evidence and manifest remain inside the same writable trust boundary.
|
|
337
|
+
- Review the complete run directory before sharing it.
|
|
338
|
+
|
|
339
|
+
## Development
|
|
340
|
+
|
|
341
|
+
Run the test suite:
|
|
342
|
+
|
|
343
|
+
```bash
|
|
344
|
+
python -m pytest
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
Run linting:
|
|
348
|
+
|
|
349
|
+
```bash
|
|
350
|
+
python -m ruff check .
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
Issues and pull requests are welcome. Keep new integrations evidence-aware: document what is directly observed, what is supplied by the provider, and what is derived.
|
|
354
|
+
|
|
355
|
+
## License
|
|
356
|
+
|
|
357
|
+
ExecWeave is distributed under the **PolyForm Noncommercial License 1.0.0**. See [LICENSE](LICENSE) for the full terms.
|