vmware-aiops 2.4.3__tar.gz → 2.4.4__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.
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.claude-plugin/plugin.json +1 -1
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.mcp.json +1 -1
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/PKG-INFO +8 -4
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/README-CN.md +6 -2
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/README.md +6 -2
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/RELEASE_NOTES.md +11 -1
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/SECURITY.md +2 -2
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/openclaw.plugin.json +1 -1
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/package.json +1 -1
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/pyproject.toml +2 -2
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/server.json +2 -2
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/skills/vmware-aiops/SKILL.md +11 -7
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/skills/vmware-aiops/references/setup-guide.md +5 -5
- vmware_aiops-2.4.4/tests/test_webhook_secret_logging.py +66 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/uv.lock +4 -4
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/__init__.py +1 -1
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/notify/webhook.py +2 -7
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/scanner/scheduler.py +5 -4
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.clawhubignore +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.env.example +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.github/dependabot.yml +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.github/workflows/windows-file-lock.yml +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.gitignore +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/Dockerfile +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/LICENSE +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/config.example.yaml +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/docker-compose.yml +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/docs/integrations/continue.md +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/docs/integrations/cursor.md +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/docs/integrations/goose.md +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/docs/integrations/localcowork.md +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/docs/integrations/mcp-agent.md +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/docs/integrations/vscode-copilot.md +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/docs/plans/2026-03-09-plan-apply-design.md +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/deploy.yaml +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/mcp-configs/README.md +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/mcp-configs/claude-code.json +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/mcp-configs/continue.yaml +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/mcp-configs/cursor.json +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/mcp-configs/goose.json +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/mcp-configs/localcowork.json +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/mcp-configs/mcp-agent.yaml +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/mcp-configs/vscode-copilot.json +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/ollama-local-setup.md +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/skills/vmware-aiops/evals/evals.json +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/skills/vmware-aiops/references/agent-guardrails.md +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/skills/vmware-aiops/references/capabilities.md +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/skills/vmware-aiops/references/cli-reference.md +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/skills/vmware-aiops/references/investigation-protocol.md +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/smithery.yaml +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/__init__.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/conftest.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/__init__.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/__init__.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/_family.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/_scores.json +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/_scoring.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/_skill.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/conftest.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/test_entity_reachability.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/test_error_actionability.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/test_tool_description_quality.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/test_tool_manifest_budget.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/__init__.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/_diag_fakes.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/_pc_fakes.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_aiops_specific.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_alarm_health_scale_n1.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_atexit_handlers_do_not_accumulate.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_browse_ds_path_join.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_browse_sees_every_file.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_capability_grader.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_cli_destructive_guards.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_cli_writes_guarded.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_cluster_health_summary_delegation.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_code_review_fixes.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_config_path_resolution_is_shared.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_daemon_calls_are_audited.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_daemon_host_log_cycles.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_delegated_lookup_errors.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_deploy_correctness.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_deploy_failures_are_failures.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_doctor_authenticates_every_target.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_documented_gates_match_the_registry.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_enum_params_match_implementation.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_env_secret_obfuscation.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_error_hints_fit_the_surface.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_event_sets_match_real_class_names.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_events_are_read_newest_first.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_guest_download_writes_the_local_disk.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_guest_username_is_explicit.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_host_log_scan_reads_real_logs.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_host_paths_protected.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_image_registry_cross_process.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_image_registry_legacy_rows.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_image_registry_per_target.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_instructions_name_targets.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_inventory_scale_issue31.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_linked_clone_failure_on_the_wire.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_list_envelope_conformance.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_list_plans_is_non_destructive.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_login_without_vsphere_role.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_mcp_frame_marks_failures.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_ova_network_mapping.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_release_blockers.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_result_envelope.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_returned_failure_is_audited.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_session_probe_eviction.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_set_ttl_safety.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_snapshot_async.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_text_io_declares_encoding.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_tool_annotations_match_behaviour.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_unreachable_host_vmks.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_v1_5_25_blockers.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_vim_attribute_conformance.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_write_round_low_findings.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_access_info.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_ambiguous_inventory_names.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_cluster_mgmt_sanitize.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_cluster_ttl_plan_gate.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_composite_tools_obey_policy.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_concurrent_local_state.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_config.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_drs_rules.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_executors_act_on_the_previewed_vm.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_filelock.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_fsutil.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_gate_review_fixes.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_guest_tools_gate.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_host_network_mgmt.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_init_and_onboarding.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_migrate_compatibility_check.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_network_mgmt.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_no_destructive_ops.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_plan_gate_narrow_fixes.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_plan_rollback_final_fixes.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_plan_steps_obey_policy.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_policy_roles.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_power_off_and_preview_policy.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_reset_alarm_gate.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_results_name_their_target.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_safe_error_passthrough.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_session_pool.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_stop_signal_runs_atexit.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_vm_delete_blast_radius.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_vm_tools_gate.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/windows_lock_check.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/_filelock.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/_fsutil.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/access_requirements.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/__init__.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/_common.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/_root.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/access.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/alarm.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/cluster.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/deploy.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/doctor.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/hub.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/investigate.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/mcp_config.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/plan.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/scan.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/summary.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/vm.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/config.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/connection.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/doctor.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/init_wizard.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/__init__.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/__main__.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/_shared.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/server.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/__init__.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/access.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/alarm.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/cluster.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/datastore.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/deploy.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/guest.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/network.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/plan.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/summary.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/ttl.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/vm.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/notify/__init__.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/notify/audit.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/notify/logger.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/__init__.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/_paging.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/alarm_mgmt.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/cluster_gate.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/cluster_mgmt.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/datastore_browser.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/gate.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/guest_gate.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/guest_ops.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/health.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/host_network_mgmt.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/inventory.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/iscsi_config.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/network_mgmt.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/ova_deploy.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/plan_executor.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/plan_gate.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/planner.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/step_policy.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/ttl.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/vm_delete_gate.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/vm_deploy.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/vm_gate.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/vm_lifecycle.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/policy_environment.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/policy_roles.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/scanner/__init__.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/scanner/alarm_scanner.py +0 -0
- {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/scanner/log_scanner.py +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://anthropic.com/claude-code/plugin.schema.json",
|
|
3
3
|
"name": "vmware-aiops",
|
|
4
4
|
"displayName": "VMware AIops",
|
|
5
|
-
"version": "2.4.
|
|
5
|
+
"version": "2.4.4",
|
|
6
6
|
"description": "AI-powered VMware vCenter/ESXi VM lifecycle and deployment with 61 MCP tools.",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "Wei Zhou",
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: vmware-aiops
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.4
|
|
4
4
|
Summary: VMware vCenter/ESXi AI-powered VM lifecycle and deployment tool
|
|
5
5
|
Project-URL: Homepage, https://github.com/vmware-skills/VMware-AIops
|
|
6
6
|
Project-URL: Repository, https://github.com/vmware-skills/VMware-AIops
|
|
7
7
|
Project-URL: Issues, https://github.com/vmware-skills/VMware-AIops/issues
|
|
8
8
|
Project-URL: Changelog, https://github.com/vmware-skills/VMware-AIops/blob/main/RELEASE_NOTES.md
|
|
9
|
-
Author-email: Wei Zhou <
|
|
9
|
+
Author-email: Wei Zhou <zhouwei008@gmail.com>
|
|
10
10
|
License-Expression: MIT
|
|
11
11
|
License-File: LICENSE
|
|
12
12
|
Requires-Python: >=3.10
|
|
@@ -28,7 +28,7 @@ Description-Content-Type: text/markdown
|
|
|
28
28
|
|
|
29
29
|
For a read-only check of this skill with your model and agent host, use the shared [model-fit self-test](https://github.com/vmware-skills/marketplace/blob/main/MODEL_FIT_SELF_TEST.md) in the marketplace root.
|
|
30
30
|
|
|
31
|
-
> **Author**: Wei Zhou, VMware by Broadcom —
|
|
31
|
+
> **Author**: Wei Zhou, VMware by Broadcom — zhouwei008@gmail.com
|
|
32
32
|
> This is a community-driven project by a VMware engineer, not an official VMware product.
|
|
33
33
|
> For official VMware developer tools see [developer.broadcom.com](https://developer.broadcom.com).
|
|
34
34
|
|
|
@@ -36,6 +36,8 @@ English | [中文](README-CN.md)
|
|
|
36
36
|
|
|
37
37
|
AI-powered VMware vCenter/ESXi VM lifecycle and deployment tool — 61 tools.
|
|
38
38
|
|
|
39
|
+
Scope also includes datastore file browsing and deployment image discovery, alarm acknowledgment and reset, and an explicitly started scanning/TTL daemon with optional configured webhooks. Alarm reset can clear multiple matching alarms; guest commands and file transfers retain the account and file-access boundaries documented in the [capabilities reference](skills/vmware-aiops/references/capabilities.md).
|
|
40
|
+
|
|
39
41
|
> **Companion skills** handle everything else:
|
|
40
42
|
>
|
|
41
43
|
> | Skill | Scope | Install |
|
|
@@ -368,7 +370,7 @@ Plans stored in `~/.vmware-aiops/plans/`, auto-deleted on success, auto-cleaned
|
|
|
368
370
|
| **Password Protection** | `.env` file loading with permission check; never in shell history |
|
|
369
371
|
| **SSL Self-signed Support** | `verify_ssl: false` — only for ESXi with self-signed certs in isolated labs; production should use CA-signed certificates |
|
|
370
372
|
| **Prompt Injection Protection** | vSphere event messages and host logs are truncated, stripped of control characters, and wrapped in boundary markers before output |
|
|
371
|
-
| **Webhook Data Scope** | Disabled by default. When configured, the daemon posts to your URL only: every critical issue (alarms, events, ESXi log lines matching critical/panic/corrupt, targets it could not connect to) and every alarm/event warning — host-log warnings stay in the scan log, and `info` rows are never sent. Each issue carries its entity name and message: sanitized alarm, event, or ESXi log text, or
|
|
373
|
+
| **Webhook Data Scope** | Disabled by default. When configured, the daemon posts to your URL only: every critical issue (alarms, events, ESXi log lines matching critical/panic/corrupt, targets it could not connect to) and every alarm/event warning — host-log warnings stay in the scan log, and `info` rows are never sent. Each issue carries its entity name and message: sanitized alarm, event, or ESXi log text, or a generic connection failure class; operational text can include host names, IP addresses, and user names. No credentials from the skill's config or `.env` are sent |
|
|
372
374
|
| **Task Waiting** | All async operations wait for completion and report result |
|
|
373
375
|
| **State Validation** | Pre-operation checks (VM exists, power state correct) |
|
|
374
376
|
|
|
@@ -574,6 +576,8 @@ VMWARE_{TARGET_NAME_UPPER}_PASSWORD
|
|
|
574
576
|
|
|
575
577
|
### Security Best Practices
|
|
576
578
|
|
|
579
|
+
Scanner notification failures report an HTTP status or exception class. Raw webhook response bodies, transport errors and connection exceptions are excluded from notification diagnostics and audit summaries to keep endpoint tokens out of them.
|
|
580
|
+
|
|
577
581
|
- **NEVER** hardcode passwords in scripts or config files
|
|
578
582
|
- **NEVER** pass passwords as command-line arguments (visible in `ps`)
|
|
579
583
|
- **ALWAYS** use `~/.vmware-aiops/.env` with `chmod 600`
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
要用自己的模型和 Agent 平台进行只读自测,请看 marketplace 根目录的[共享模型适配自测任务](https://github.com/vmware-skills/marketplace/blob/main/MODEL_FIT_SELF_TEST.md)。
|
|
5
5
|
|
|
6
|
-
> **作者**: Wei Zhou, VMware by Broadcom —
|
|
6
|
+
> **作者**: Wei Zhou, VMware by Broadcom — zhouwei008@gmail.com
|
|
7
7
|
> 本项目由 VMware 工程师维护的社区项目,非 VMware 官方产品。
|
|
8
8
|
> VMware 官方开发者工具请访问 [developer.broadcom.com](https://developer.broadcom.com)。
|
|
9
9
|
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
|
|
12
12
|
AI 驱动的 VMware vCenter/ESXi VM 生命周期管理与部署工具 — 61 个工具。
|
|
13
13
|
|
|
14
|
+
范围还包括数据存储文件浏览与部署镜像发现、告警确认与重置,以及需显式启动的扫描/TTL daemon(可选配置 webhook)。告警重置可能清除多个匹配告警;guest 命令与文件传输仍受[能力参考](skills/vmware-aiops/references/capabilities.md)所述的账户和文件访问边界约束。
|
|
15
|
+
|
|
14
16
|
> **配套技能**负责其他领域:
|
|
15
17
|
>
|
|
16
18
|
> | 技能 | 范围 | 安装 |
|
|
@@ -289,6 +291,8 @@ Plan 存储在 `~/.vmware-aiops/plans/`,成功后自动删除,超过 24 小
|
|
|
289
291
|
|
|
290
292
|
## 安全特性
|
|
291
293
|
|
|
294
|
+
扫描通知失败只报告 HTTP 状态或异常类型。通知诊断与审计摘要不引用原始 webhook 响应、传输错误或连接异常,避免写入其中可能包含的端点令牌。
|
|
295
|
+
|
|
292
296
|
| 功能 | 说明 |
|
|
293
297
|
|------|------|
|
|
294
298
|
| 预演模式(Dry-Run,**仅 CLI**) | 加 `--dry-run` 只打印将要发出的 API 调用而不执行;除 `deploy iso`、`deploy mark-template`、`vm cancel-ttl`、`vm guest-download` 外,每个 CLI 写操作都支持 |
|
|
@@ -302,7 +306,7 @@ Plan 存储在 `~/.vmware-aiops/plans/`,成功后自动删除,超过 24 小
|
|
|
302
306
|
| 配置文件内容 | `config.yaml` 仅存储主机名、端口和 `.env` 引用路径,**不含密码或 Token** |
|
|
303
307
|
| SSL 自签名 | 仅用于 ESXi 自签名证书的隔离实验环境;生产环境应使用 CA 签名证书 |
|
|
304
308
|
| Prompt 注入防护 | vSphere 事件消息和主机日志在输出前进行截断、控制字符清理和边界标记包裹 |
|
|
305
|
-
| Webhook 数据范围 | **默认禁用**。配置后,daemon 只向你配置的 URL 发送:所有 critical 问题(告警、事件、匹配 critical/panic/corrupt 的 ESXi 日志行、连不上的目标)和所有告警/事件类 warning——主机日志的 warning 只写入扫描日志,`info` 记录从不发送。每条问题带实体名和消息:经过清洗的告警、事件或 ESXi
|
|
309
|
+
| Webhook 数据范围 | **默认禁用**。配置后,daemon 只向你配置的 URL 发送:所有 critical 问题(告警、事件、匹配 critical/panic/corrupt 的 ESXi 日志行、连不上的目标)和所有告警/事件类 warning——主机日志的 warning 只写入扫描日志,`info` 记录从不发送。每条问题带实体名和消息:经过清洗的告警、事件或 ESXi 日志文本,或不含原始异常的连接失败类型;运维文本可能含主机名、IP 地址和用户名。不会发送 skill 配置或 `.env` 里的任何凭据 |
|
|
306
310
|
| 最小权限 | 推荐使用专用 vCenter 服务账户,仅授予所需最小权限。仅需监控时使用 [VMware-Monitor](https://github.com/vmware-skills/VMware-Monitor) |
|
|
307
311
|
| 任务等待 | 所有异步操作等待完成并报告结果 |
|
|
308
312
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
For a read-only check of this skill with your model and agent host, use the shared [model-fit self-test](https://github.com/vmware-skills/marketplace/blob/main/MODEL_FIT_SELF_TEST.md) in the marketplace root.
|
|
5
5
|
|
|
6
|
-
> **Author**: Wei Zhou, VMware by Broadcom —
|
|
6
|
+
> **Author**: Wei Zhou, VMware by Broadcom — zhouwei008@gmail.com
|
|
7
7
|
> This is a community-driven project by a VMware engineer, not an official VMware product.
|
|
8
8
|
> For official VMware developer tools see [developer.broadcom.com](https://developer.broadcom.com).
|
|
9
9
|
|
|
@@ -11,6 +11,8 @@ English | [中文](README-CN.md)
|
|
|
11
11
|
|
|
12
12
|
AI-powered VMware vCenter/ESXi VM lifecycle and deployment tool — 61 tools.
|
|
13
13
|
|
|
14
|
+
Scope also includes datastore file browsing and deployment image discovery, alarm acknowledgment and reset, and an explicitly started scanning/TTL daemon with optional configured webhooks. Alarm reset can clear multiple matching alarms; guest commands and file transfers retain the account and file-access boundaries documented in the [capabilities reference](skills/vmware-aiops/references/capabilities.md).
|
|
15
|
+
|
|
14
16
|
> **Companion skills** handle everything else:
|
|
15
17
|
>
|
|
16
18
|
> | Skill | Scope | Install |
|
|
@@ -343,7 +345,7 @@ Plans stored in `~/.vmware-aiops/plans/`, auto-deleted on success, auto-cleaned
|
|
|
343
345
|
| **Password Protection** | `.env` file loading with permission check; never in shell history |
|
|
344
346
|
| **SSL Self-signed Support** | `verify_ssl: false` — only for ESXi with self-signed certs in isolated labs; production should use CA-signed certificates |
|
|
345
347
|
| **Prompt Injection Protection** | vSphere event messages and host logs are truncated, stripped of control characters, and wrapped in boundary markers before output |
|
|
346
|
-
| **Webhook Data Scope** | Disabled by default. When configured, the daemon posts to your URL only: every critical issue (alarms, events, ESXi log lines matching critical/panic/corrupt, targets it could not connect to) and every alarm/event warning — host-log warnings stay in the scan log, and `info` rows are never sent. Each issue carries its entity name and message: sanitized alarm, event, or ESXi log text, or
|
|
348
|
+
| **Webhook Data Scope** | Disabled by default. When configured, the daemon posts to your URL only: every critical issue (alarms, events, ESXi log lines matching critical/panic/corrupt, targets it could not connect to) and every alarm/event warning — host-log warnings stay in the scan log, and `info` rows are never sent. Each issue carries its entity name and message: sanitized alarm, event, or ESXi log text, or a generic connection failure class; operational text can include host names, IP addresses, and user names. No credentials from the skill's config or `.env` are sent |
|
|
347
349
|
| **Task Waiting** | All async operations wait for completion and report result |
|
|
348
350
|
| **State Validation** | Pre-operation checks (VM exists, power state correct) |
|
|
349
351
|
|
|
@@ -549,6 +551,8 @@ VMWARE_{TARGET_NAME_UPPER}_PASSWORD
|
|
|
549
551
|
|
|
550
552
|
### Security Best Practices
|
|
551
553
|
|
|
554
|
+
Scanner notification failures report an HTTP status or exception class. Raw webhook response bodies, transport errors and connection exceptions are excluded from notification diagnostics and audit summaries to keep endpoint tokens out of them.
|
|
555
|
+
|
|
552
556
|
- **NEVER** hardcode passwords in scripts or config files
|
|
553
557
|
- **NEVER** pass passwords as command-line arguments (visible in `ps`)
|
|
554
558
|
- **ALWAYS** use `~/.vmware-aiops/.env` with `chmod 600`
|
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
## v2.4.4 — minimize notification and audit secrets (2026-11-08)
|
|
2
|
+
|
|
3
|
+
* Update public author/project contact metadata to `zhouwei008@gmail.com`.
|
|
4
|
+
|
|
5
|
+
### notification secret minimization
|
|
6
|
+
* Webhook status/transport logs and unexpected scan/send audit failures retain HTTP status or exception class without raw response/exception text. Connection-failure notifications no longer forward raw exceptions that can contain credential-bearing URLs or opaque tokens.
|
|
7
|
+
|
|
8
|
+
### scope declaration
|
|
9
|
+
* Explicitly declare the existing datastore browsing/image discovery, multi-alarm reset and user-started scanning/TTL daemon capabilities in the canonical skill description and both READMEs. Runtime behavior, permission boundaries and risk disclosures are unchanged.
|
|
10
|
+
|
|
1
11
|
## v2.4.3 — bind confirmed writes to measured identities; reject ambiguous inventory names (2026-11-08)
|
|
2
12
|
|
|
3
13
|
* **Confirmed MCP writes re-check the identities measured during that call.** The eight confirm-gated VM and snapshot tools pass the current blast-radius measurement's VM instance UUID and snapshot id into execution, refusing a replacement object found by the executor. Each `confirm=True` invocation measures afresh; the separate earlier preview supplies no identity token. The existing `delete_vm` acknowledgement requirement is unchanged, as are the CLI and plan-executor paths (AIops#49).
|
|
@@ -1952,7 +1962,7 @@ This release tracks vmware-pilot v1.5.17 (new `investigate_alert` template + `re
|
|
|
1952
1962
|
- **[READ]/[WRITE] tool prefixes**: All MCP tool descriptions now start with [READ] or [WRITE] to clearly indicate operation type
|
|
1953
1963
|
- **Read/write split counts**: SKILL.md MCP Tools section header shows exact read vs write tool counts
|
|
1954
1964
|
- **Negative routing**: Description frontmatter includes "Do NOT use when..." clause to prevent misrouting
|
|
1955
|
-
- **Broadcom author attestation**: README.md, README-CN.md, and pyproject.toml include VMware by Broadcom author identity (
|
|
1965
|
+
- **Broadcom author attestation**: README.md, README-CN.md, and pyproject.toml include VMware by Broadcom author identity (zhouwei008@gmail.com) to resolve Snyk E005 brand warnings
|
|
1956
1966
|
|
|
1957
1967
|
### AIops-specific
|
|
1958
1968
|
|
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
This is a community-maintained open-source project and is **not affiliated with, endorsed by, or sponsored by VMware, Inc. or Broadcom Inc.** "VMware" and "vSphere" are trademarks of Broadcom Inc.
|
|
6
6
|
|
|
7
|
-
**Author**: Wei Zhou, VMware by Broadcom —
|
|
7
|
+
**Author**: Wei Zhou, VMware by Broadcom — zhouwei008@gmail.com
|
|
8
8
|
|
|
9
9
|
## Reporting Vulnerabilities
|
|
10
10
|
|
|
11
11
|
If you discover a security vulnerability, please report it privately:
|
|
12
12
|
|
|
13
|
-
- **Email**:
|
|
13
|
+
- **Email**: zhouwei008@gmail.com
|
|
14
14
|
- **GitHub**: Open a [private security advisory](https://github.com/vmware-skills/VMware-AIops/security/advisories/new)
|
|
15
15
|
|
|
16
16
|
Do **not** open a public GitHub issue for security vulnerabilities.
|
|
@@ -4,12 +4,12 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "vmware-aiops"
|
|
7
|
-
version = "2.4.
|
|
7
|
+
version = "2.4.4"
|
|
8
8
|
description = "VMware vCenter/ESXi AI-powered VM lifecycle and deployment tool"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
11
11
|
requires-python = ">=3.10"
|
|
12
|
-
authors = [{ name = "Wei Zhou", email = "
|
|
12
|
+
authors = [{ name = "Wei Zhou", email = "zhouwei008@gmail.com" }]
|
|
13
13
|
dependencies = [
|
|
14
14
|
"pyvmomi>=8.0.3.0,<10.0",
|
|
15
15
|
"pyaml>=24.0,<27.0",
|
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
"url": "https://github.com/vmware-skills/VMware-AIops",
|
|
8
8
|
"source": "github"
|
|
9
9
|
},
|
|
10
|
-
"version": "2.4.
|
|
10
|
+
"version": "2.4.4",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "pypi",
|
|
14
14
|
"identifier": "vmware-aiops",
|
|
15
|
-
"version": "2.4.
|
|
15
|
+
"version": "2.4.4",
|
|
16
16
|
"runtimeHint": "uvx",
|
|
17
17
|
"packageArguments": [
|
|
18
18
|
{
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: vmware-aiops
|
|
3
3
|
description: >
|
|
4
|
-
Use
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
Use for VMware/vSphere/ESXi VM lifecycle: power on/off, clone, snapshot, migrate,
|
|
5
|
+
OVA/template deployment, guest commands and file transfer, batch operations, plans and clusters.
|
|
6
|
+
Also handles datastore file browsing and deployment image scanning; alarm acknowledgment
|
|
7
|
+
and reset (which can clear multiple matching alarms); read-only cluster/VM/host/datastore
|
|
8
|
+
triage; and a user-started scanning/TTL daemon with optional configured webhooks.
|
|
9
|
+
Always use for power on, clone, deploy, migrate, guest exec, batch, alarms or VM investigation
|
|
10
|
+
in VMware. Use vmware-monitor for general read-only inventory/events/VM details;
|
|
11
|
+
vmware-storage for iSCSI/vSAN/storage configuration; vmware-nsx for NSX;
|
|
12
|
+
vmware-vks for Kubernetes; vmware-pilot for workflows; vmware-avi for load balancing.
|
|
9
13
|
installer:
|
|
10
14
|
kind: uv
|
|
11
15
|
package: vmware-aiops
|
|
@@ -65,7 +69,7 @@ Read before connecting an agent. Per-tool inventory: `references/capabilities.md
|
|
|
65
69
|
## Quick Install
|
|
66
70
|
|
|
67
71
|
```bash
|
|
68
|
-
uv tool install vmware-aiops==2.4.
|
|
72
|
+
uv tool install vmware-aiops==2.4.4
|
|
69
73
|
vmware-aiops doctor
|
|
70
74
|
vmware-aiops hub status # see which family members are installed
|
|
71
75
|
```
|
|
@@ -305,7 +309,7 @@ The account has no vSphere role. Assign one (Read-Only or higher) on the vCenter
|
|
|
305
309
|
## Setup
|
|
306
310
|
|
|
307
311
|
```bash
|
|
308
|
-
uv tool install vmware-aiops==2.4.
|
|
312
|
+
uv tool install vmware-aiops==2.4.4
|
|
309
313
|
mkdir -p ~/.vmware-aiops
|
|
310
314
|
vmware-aiops init # generates config.yaml and .env templates
|
|
311
315
|
chmod 600 ~/.vmware-aiops/.env
|
|
@@ -6,13 +6,13 @@ All install methods fetch from the same source: [github.com/vmware-skills/VMware
|
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
8
|
# Via PyPI (recommended for version pinning)
|
|
9
|
-
uv tool install vmware-aiops==2.4.
|
|
9
|
+
uv tool install vmware-aiops==2.4.4
|
|
10
10
|
|
|
11
11
|
# Via Skills.sh (fetches from GitHub)
|
|
12
|
-
npx skills add vmware-skills/VMware-AIops#v2.4.
|
|
12
|
+
npx skills add vmware-skills/VMware-AIops#v2.4.4
|
|
13
13
|
|
|
14
14
|
# Via ClawHub (fetches from ClawHub registry snapshot of GitHub)
|
|
15
|
-
clawhub install @zw008/vmware-aiops --version 2.4.
|
|
15
|
+
clawhub install @zw008/vmware-aiops --version 2.4.4
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
### Claude Code
|
|
@@ -35,7 +35,7 @@ claude mcp add vmware-aiops -- vmware-aiops mcp
|
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
37
|
# 1. Install from PyPI (source: github.com/vmware-skills/VMware-AIops)
|
|
38
|
-
uv tool install vmware-aiops==2.4.
|
|
38
|
+
uv tool install vmware-aiops==2.4.4
|
|
39
39
|
|
|
40
40
|
# 2. Verify installation source
|
|
41
41
|
vmware-aiops --version # confirms installed version
|
|
@@ -73,7 +73,7 @@ The `vmware-aiops` package installs a Python CLI binary and its dependencies (py
|
|
|
73
73
|
## Development Install
|
|
74
74
|
|
|
75
75
|
```bash
|
|
76
|
-
git clone --branch v2.4.
|
|
76
|
+
git clone --branch v2.4.4 https://github.com/vmware-skills/VMware-AIops.git
|
|
77
77
|
cd VMware-AIops
|
|
78
78
|
uv venv && source .venv/bin/activate
|
|
79
79
|
# --no-sources: pyproject's [tool.uv.sources] points vmware-monitor at a sibling
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""Notification failures cannot publish opaque endpoint tokens or remote bodies."""
|
|
2
|
+
|
|
3
|
+
from types import SimpleNamespace
|
|
4
|
+
|
|
5
|
+
import httpx
|
|
6
|
+
import pytest
|
|
7
|
+
|
|
8
|
+
from vmware_aiops.notify.webhook import WebhookNotifier
|
|
9
|
+
from vmware_aiops.scanner import scheduler
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@pytest.mark.parametrize("failure", ["transport", "status"])
|
|
13
|
+
def test_notifier_logs_only_error_class_or_status(monkeypatch, caplog, failure):
|
|
14
|
+
def post(*args, **kwargs):
|
|
15
|
+
if failure == "transport":
|
|
16
|
+
raise httpx.ConnectError("https://hook.example/opaque-private-token")
|
|
17
|
+
return httpx.Response(500, text="opaque-private-token echoed remotely")
|
|
18
|
+
|
|
19
|
+
monkeypatch.setattr(httpx, "post", post)
|
|
20
|
+
assert not WebhookNotifier("https://hook.example/opaque-private-token", timeout=1).send(
|
|
21
|
+
[{"severity": "critical", "message": "incident text"}]
|
|
22
|
+
)
|
|
23
|
+
assert "opaque-private-token" not in caplog.text
|
|
24
|
+
assert "incident text" not in caplog.text
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def test_unexpected_sender_exception_is_not_copied_into_audit(monkeypatch):
|
|
28
|
+
rows = []
|
|
29
|
+
monkeypatch.setattr(scheduler, "_audit", lambda *args: rows.append(args))
|
|
30
|
+
|
|
31
|
+
def fail(issues):
|
|
32
|
+
raise RuntimeError("https://hook.example/opaque-private-token")
|
|
33
|
+
|
|
34
|
+
with pytest.raises(RuntimeError):
|
|
35
|
+
scheduler._send_webhook(SimpleNamespace(send=fail), [])
|
|
36
|
+
assert rows and rows[0][2] == "error"
|
|
37
|
+
assert "opaque-private-token" not in str(rows)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def test_connection_exception_is_not_sent_to_webhook(monkeypatch):
|
|
41
|
+
sent = []
|
|
42
|
+
monkeypatch.setattr(
|
|
43
|
+
scheduler, "ScanLogger", lambda *a: SimpleNamespace(log_issue=lambda i: None)
|
|
44
|
+
)
|
|
45
|
+
monkeypatch.setattr(
|
|
46
|
+
scheduler,
|
|
47
|
+
"WebhookNotifier",
|
|
48
|
+
lambda **k: SimpleNamespace(send=lambda issues: sent.extend(issues) or True),
|
|
49
|
+
)
|
|
50
|
+
monkeypatch.setattr(scheduler, "_audit", lambda *a: None)
|
|
51
|
+
|
|
52
|
+
def fail(name):
|
|
53
|
+
raise ConnectionError("https://user:password@host/opaque-private-token")
|
|
54
|
+
|
|
55
|
+
conn = SimpleNamespace(list_targets=lambda: ["vc"], connect=fail)
|
|
56
|
+
config = SimpleNamespace(
|
|
57
|
+
scanner=SimpleNamespace(),
|
|
58
|
+
notify=SimpleNamespace(
|
|
59
|
+
log_file="unused",
|
|
60
|
+
webhook_url="https://hook.example/opaque-private-token",
|
|
61
|
+
webhook_timeout=1,
|
|
62
|
+
),
|
|
63
|
+
)
|
|
64
|
+
scheduler._run_scan(config, conn)
|
|
65
|
+
assert sent and "ConnectionError" in str(sent)
|
|
66
|
+
assert "opaque-private-token" not in str(sent) and "password" not in str(sent)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
version = 1
|
|
2
|
-
revision =
|
|
2
|
+
revision = 5
|
|
3
3
|
requires-python = ">=3.10"
|
|
4
4
|
resolution-markers = [
|
|
5
5
|
"python_full_version >= '3.14' and sys_platform == 'win32'",
|
|
@@ -353,7 +353,7 @@ name = "exceptiongroup"
|
|
|
353
353
|
version = "1.3.1"
|
|
354
354
|
source = { registry = "https://pypi.org/simple" }
|
|
355
355
|
dependencies = [
|
|
356
|
-
{ name = "typing-extensions"
|
|
356
|
+
{ name = "typing-extensions" },
|
|
357
357
|
]
|
|
358
358
|
sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" }
|
|
359
359
|
wheels = [
|
|
@@ -1195,7 +1195,7 @@ wheels = [
|
|
|
1195
1195
|
|
|
1196
1196
|
[[package]]
|
|
1197
1197
|
name = "vmware-aiops"
|
|
1198
|
-
version = "2.4.
|
|
1198
|
+
version = "2.4.4"
|
|
1199
1199
|
source = { editable = "." }
|
|
1200
1200
|
dependencies = [
|
|
1201
1201
|
{ name = "apscheduler" },
|
|
@@ -1242,7 +1242,7 @@ dev = [
|
|
|
1242
1242
|
|
|
1243
1243
|
[[package]]
|
|
1244
1244
|
name = "vmware-monitor"
|
|
1245
|
-
version = "2.
|
|
1245
|
+
version = "2.6.0"
|
|
1246
1246
|
source = { editable = "../VMware-Monitor" }
|
|
1247
1247
|
dependencies = [
|
|
1248
1248
|
{ name = "apscheduler" },
|
|
@@ -52,15 +52,10 @@ class WebhookNotifier:
|
|
|
52
52
|
if response.status_code < 300:
|
|
53
53
|
logger.info("Webhook sent successfully (%d issues)", len(issues))
|
|
54
54
|
return True
|
|
55
|
-
logger.warning(
|
|
56
|
-
"Webhook returned %d: %s",
|
|
57
|
-
response.status_code,
|
|
58
|
-
# Strip CR/LF so a hostile endpoint can't inject forged log lines.
|
|
59
|
-
response.text[:200].replace("\n", " ").replace("\r", " "),
|
|
60
|
-
)
|
|
55
|
+
logger.warning("Webhook returned HTTP %d", response.status_code)
|
|
61
56
|
return False
|
|
62
57
|
except httpx.HTTPError as e:
|
|
63
|
-
logger.error("Webhook failed
|
|
58
|
+
logger.error("Webhook failed (%s)", type(e).__name__)
|
|
64
59
|
return False
|
|
65
60
|
|
|
66
61
|
|
|
@@ -22,13 +22,13 @@ from vmware_aiops.connection import ConnectionManager
|
|
|
22
22
|
from vmware_aiops.notify.logger import ScanLogger
|
|
23
23
|
from vmware_aiops.notify.webhook import WebhookNotifier
|
|
24
24
|
from vmware_aiops.ops.inventory import AmbiguousVMError
|
|
25
|
+
from vmware_aiops.ops.step_policy import TOOL_RISK
|
|
25
26
|
from vmware_aiops.ops.ttl import (
|
|
26
27
|
TTLIdentityError,
|
|
27
28
|
get_expired_entries,
|
|
28
29
|
remove_entry,
|
|
29
30
|
verify_ttl_identity,
|
|
30
31
|
)
|
|
31
|
-
from vmware_aiops.ops.step_policy import TOOL_RISK
|
|
32
32
|
from vmware_aiops.ops.vm_lifecycle import VMNotFoundError, delete_vm
|
|
33
33
|
from vmware_aiops.scanner.alarm_scanner import scan_alarms
|
|
34
34
|
from vmware_aiops.scanner.log_scanner import scan_host_logs_since, scan_logs
|
|
@@ -192,7 +192,7 @@ def _send_webhook(webhook: WebhookNotifier, paged: list[dict]) -> None:
|
|
|
192
192
|
"error": "webhook send failed; the daemon log has the HTTP status or exception"
|
|
193
193
|
}
|
|
194
194
|
except Exception as exc:
|
|
195
|
-
status, result = "error", {"error":
|
|
195
|
+
status, result = "error", {"error": type(exc).__name__}
|
|
196
196
|
raise
|
|
197
197
|
except BaseException as exc:
|
|
198
198
|
# Ctrl+C / shutdown mid-send: not delivered, and not a plain failure.
|
|
@@ -235,7 +235,8 @@ def _run_scan(
|
|
|
235
235
|
issue = {
|
|
236
236
|
"severity": "critical",
|
|
237
237
|
"source": "connection",
|
|
238
|
-
"message": f"Failed to connect to {target_name}
|
|
238
|
+
"message": f"Failed to connect to {target_name} ({type(e).__name__}); "
|
|
239
|
+
"run vmware-aiops doctor",
|
|
239
240
|
"time": "",
|
|
240
241
|
"entity": target_name,
|
|
241
242
|
}
|
|
@@ -261,7 +262,7 @@ def _run_scan(
|
|
|
261
262
|
status = "error"
|
|
262
263
|
outcome["error"] = sanitize("incomplete scan: " + "; ".join(failed), 500)
|
|
263
264
|
except Exception as exc:
|
|
264
|
-
status, outcome = "error", {"error":
|
|
265
|
+
status, outcome = "error", {"error": type(exc).__name__}
|
|
265
266
|
raise
|
|
266
267
|
except BaseException as exc:
|
|
267
268
|
# Ctrl+C during the first scan (before signal handlers are installed) or a
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/skills/vmware-aiops/references/agent-guardrails.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/skills/vmware-aiops/references/investigation-protocol.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/test_tool_description_quality.py
RENAMED
|
File without changes
|
{vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/test_tool_manifest_budget.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|