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.
Files changed (221) hide show
  1. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.claude-plugin/plugin.json +1 -1
  2. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.mcp.json +1 -1
  3. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/PKG-INFO +8 -4
  4. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/README-CN.md +6 -2
  5. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/README.md +6 -2
  6. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/RELEASE_NOTES.md +11 -1
  7. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/SECURITY.md +2 -2
  8. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/openclaw.plugin.json +1 -1
  9. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/package.json +1 -1
  10. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/pyproject.toml +2 -2
  11. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/server.json +2 -2
  12. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/skills/vmware-aiops/SKILL.md +11 -7
  13. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/skills/vmware-aiops/references/setup-guide.md +5 -5
  14. vmware_aiops-2.4.4/tests/test_webhook_secret_logging.py +66 -0
  15. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/uv.lock +4 -4
  16. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/__init__.py +1 -1
  17. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/notify/webhook.py +2 -7
  18. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/scanner/scheduler.py +5 -4
  19. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.clawhubignore +0 -0
  20. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.env.example +0 -0
  21. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  22. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  23. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  24. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  25. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.github/dependabot.yml +0 -0
  26. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.github/workflows/windows-file-lock.yml +0 -0
  27. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/.gitignore +0 -0
  28. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/Dockerfile +0 -0
  29. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/LICENSE +0 -0
  30. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/config.example.yaml +0 -0
  31. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/docker-compose.yml +0 -0
  32. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/docs/integrations/continue.md +0 -0
  33. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/docs/integrations/cursor.md +0 -0
  34. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/docs/integrations/goose.md +0 -0
  35. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/docs/integrations/localcowork.md +0 -0
  36. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/docs/integrations/mcp-agent.md +0 -0
  37. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/docs/integrations/vscode-copilot.md +0 -0
  38. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/docs/plans/2026-03-09-plan-apply-design.md +0 -0
  39. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/deploy.yaml +0 -0
  40. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/mcp-configs/README.md +0 -0
  41. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/mcp-configs/claude-code.json +0 -0
  42. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/mcp-configs/continue.yaml +0 -0
  43. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/mcp-configs/cursor.json +0 -0
  44. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/mcp-configs/goose.json +0 -0
  45. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/mcp-configs/localcowork.json +0 -0
  46. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/mcp-configs/mcp-agent.yaml +0 -0
  47. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/mcp-configs/vscode-copilot.json +0 -0
  48. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/examples/ollama-local-setup.md +0 -0
  49. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/skills/vmware-aiops/evals/evals.json +0 -0
  50. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/skills/vmware-aiops/references/agent-guardrails.md +0 -0
  51. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/skills/vmware-aiops/references/capabilities.md +0 -0
  52. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/skills/vmware-aiops/references/cli-reference.md +0 -0
  53. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/skills/vmware-aiops/references/investigation-protocol.md +0 -0
  54. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/smithery.yaml +0 -0
  55. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/__init__.py +0 -0
  56. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/conftest.py +0 -0
  57. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/__init__.py +0 -0
  58. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/__init__.py +0 -0
  59. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/_family.py +0 -0
  60. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/_scores.json +0 -0
  61. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/_scoring.py +0 -0
  62. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/_skill.py +0 -0
  63. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/conftest.py +0 -0
  64. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/test_entity_reachability.py +0 -0
  65. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/test_error_actionability.py +0 -0
  66. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/test_tool_description_quality.py +0 -0
  67. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/capability/test_tool_manifest_budget.py +0 -0
  68. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/__init__.py +0 -0
  69. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/_diag_fakes.py +0 -0
  70. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/_pc_fakes.py +0 -0
  71. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_aiops_specific.py +0 -0
  72. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_alarm_health_scale_n1.py +0 -0
  73. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_atexit_handlers_do_not_accumulate.py +0 -0
  74. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_browse_ds_path_join.py +0 -0
  75. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_browse_sees_every_file.py +0 -0
  76. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_capability_grader.py +0 -0
  77. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_cli_destructive_guards.py +0 -0
  78. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_cli_writes_guarded.py +0 -0
  79. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_cluster_health_summary_delegation.py +0 -0
  80. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_code_review_fixes.py +0 -0
  81. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_config_path_resolution_is_shared.py +0 -0
  82. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_daemon_calls_are_audited.py +0 -0
  83. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_daemon_host_log_cycles.py +0 -0
  84. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_delegated_lookup_errors.py +0 -0
  85. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_deploy_correctness.py +0 -0
  86. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_deploy_failures_are_failures.py +0 -0
  87. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_doctor_authenticates_every_target.py +0 -0
  88. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_documented_gates_match_the_registry.py +0 -0
  89. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_enum_params_match_implementation.py +0 -0
  90. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_env_secret_obfuscation.py +0 -0
  91. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_error_hints_fit_the_surface.py +0 -0
  92. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_event_sets_match_real_class_names.py +0 -0
  93. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_events_are_read_newest_first.py +0 -0
  94. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_guest_download_writes_the_local_disk.py +0 -0
  95. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_guest_username_is_explicit.py +0 -0
  96. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_host_log_scan_reads_real_logs.py +0 -0
  97. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_host_paths_protected.py +0 -0
  98. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_image_registry_cross_process.py +0 -0
  99. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_image_registry_legacy_rows.py +0 -0
  100. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_image_registry_per_target.py +0 -0
  101. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_instructions_name_targets.py +0 -0
  102. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_inventory_scale_issue31.py +0 -0
  103. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_linked_clone_failure_on_the_wire.py +0 -0
  104. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_list_envelope_conformance.py +0 -0
  105. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_list_plans_is_non_destructive.py +0 -0
  106. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_login_without_vsphere_role.py +0 -0
  107. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_mcp_frame_marks_failures.py +0 -0
  108. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_ova_network_mapping.py +0 -0
  109. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_release_blockers.py +0 -0
  110. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_result_envelope.py +0 -0
  111. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_returned_failure_is_audited.py +0 -0
  112. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_session_probe_eviction.py +0 -0
  113. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_set_ttl_safety.py +0 -0
  114. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_snapshot_async.py +0 -0
  115. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_text_io_declares_encoding.py +0 -0
  116. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_tool_annotations_match_behaviour.py +0 -0
  117. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_unreachable_host_vmks.py +0 -0
  118. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_v1_5_25_blockers.py +0 -0
  119. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_vim_attribute_conformance.py +0 -0
  120. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/eval/regression/test_write_round_low_findings.py +0 -0
  121. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_access_info.py +0 -0
  122. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_ambiguous_inventory_names.py +0 -0
  123. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_cluster_mgmt_sanitize.py +0 -0
  124. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_cluster_ttl_plan_gate.py +0 -0
  125. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_composite_tools_obey_policy.py +0 -0
  126. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_concurrent_local_state.py +0 -0
  127. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_config.py +0 -0
  128. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_drs_rules.py +0 -0
  129. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_executors_act_on_the_previewed_vm.py +0 -0
  130. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_filelock.py +0 -0
  131. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_fsutil.py +0 -0
  132. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_gate_review_fixes.py +0 -0
  133. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_guest_tools_gate.py +0 -0
  134. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_host_network_mgmt.py +0 -0
  135. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_init_and_onboarding.py +0 -0
  136. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_migrate_compatibility_check.py +0 -0
  137. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_network_mgmt.py +0 -0
  138. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_no_destructive_ops.py +0 -0
  139. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_plan_gate_narrow_fixes.py +0 -0
  140. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_plan_rollback_final_fixes.py +0 -0
  141. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_plan_steps_obey_policy.py +0 -0
  142. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_policy_roles.py +0 -0
  143. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_power_off_and_preview_policy.py +0 -0
  144. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_reset_alarm_gate.py +0 -0
  145. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_results_name_their_target.py +0 -0
  146. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_safe_error_passthrough.py +0 -0
  147. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_session_pool.py +0 -0
  148. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_stop_signal_runs_atexit.py +0 -0
  149. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_vm_delete_blast_radius.py +0 -0
  150. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/test_vm_tools_gate.py +0 -0
  151. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/tests/windows_lock_check.py +0 -0
  152. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/_filelock.py +0 -0
  153. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/_fsutil.py +0 -0
  154. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/access_requirements.py +0 -0
  155. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/__init__.py +0 -0
  156. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/_common.py +0 -0
  157. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/_root.py +0 -0
  158. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/access.py +0 -0
  159. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/alarm.py +0 -0
  160. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/cluster.py +0 -0
  161. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/deploy.py +0 -0
  162. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/doctor.py +0 -0
  163. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/hub.py +0 -0
  164. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/investigate.py +0 -0
  165. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/mcp_config.py +0 -0
  166. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/plan.py +0 -0
  167. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/scan.py +0 -0
  168. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/summary.py +0 -0
  169. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/cli/vm.py +0 -0
  170. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/config.py +0 -0
  171. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/connection.py +0 -0
  172. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/doctor.py +0 -0
  173. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/init_wizard.py +0 -0
  174. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/__init__.py +0 -0
  175. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/__main__.py +0 -0
  176. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/_shared.py +0 -0
  177. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/server.py +0 -0
  178. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/__init__.py +0 -0
  179. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/access.py +0 -0
  180. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/alarm.py +0 -0
  181. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/cluster.py +0 -0
  182. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/datastore.py +0 -0
  183. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/deploy.py +0 -0
  184. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/guest.py +0 -0
  185. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/network.py +0 -0
  186. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/plan.py +0 -0
  187. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/summary.py +0 -0
  188. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/ttl.py +0 -0
  189. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/mcp_server/tools/vm.py +0 -0
  190. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/notify/__init__.py +0 -0
  191. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/notify/audit.py +0 -0
  192. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/notify/logger.py +0 -0
  193. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/__init__.py +0 -0
  194. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/_paging.py +0 -0
  195. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/alarm_mgmt.py +0 -0
  196. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/cluster_gate.py +0 -0
  197. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/cluster_mgmt.py +0 -0
  198. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/datastore_browser.py +0 -0
  199. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/gate.py +0 -0
  200. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/guest_gate.py +0 -0
  201. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/guest_ops.py +0 -0
  202. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/health.py +0 -0
  203. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/host_network_mgmt.py +0 -0
  204. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/inventory.py +0 -0
  205. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/iscsi_config.py +0 -0
  206. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/network_mgmt.py +0 -0
  207. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/ova_deploy.py +0 -0
  208. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/plan_executor.py +0 -0
  209. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/plan_gate.py +0 -0
  210. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/planner.py +0 -0
  211. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/step_policy.py +0 -0
  212. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/ttl.py +0 -0
  213. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/vm_delete_gate.py +0 -0
  214. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/vm_deploy.py +0 -0
  215. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/vm_gate.py +0 -0
  216. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/ops/vm_lifecycle.py +0 -0
  217. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/policy_environment.py +0 -0
  218. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/policy_roles.py +0 -0
  219. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/scanner/__init__.py +0 -0
  220. {vmware_aiops-2.4.3 → vmware_aiops-2.4.4}/vmware_aiops/scanner/alarm_scanner.py +0 -0
  221. {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.3",
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",
@@ -5,7 +5,7 @@
5
5
  "command": "uvx",
6
6
  "args": [
7
7
  "--from",
8
- "vmware-aiops==2.4.3",
8
+ "vmware-aiops==2.4.4",
9
9
  "vmware-aiops-mcp"
10
10
  ]
11
11
  }
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: vmware-aiops
3
- Version: 2.4.3
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 <wei-wz.zhou@broadcom.com>
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 — wei-wz.zhou@broadcom.com
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 the connection error, which can include host names, IP addresses, and user names. No credentials from the skill's config or `.env` are sent |
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 — wei-wz.zhou@broadcom.com
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 日志文本,或连接错误信息,其中可能含主机名、IP 地址和用户名。不会发送 skill 配置或 `.env` 里的任何凭据 |
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 — wei-wz.zhou@broadcom.com
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 the connection error, which can include host names, IP addresses, and user names. No credentials from the skill's config or `.env` are sent |
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 (wei-wz.zhou@broadcom.com) to resolve Snyk E005 brand warnings
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 — wei-wz.zhou@broadcom.com
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**: wei-wz.zhou@broadcom.com
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.
@@ -11,7 +11,7 @@
11
11
  "command": "uvx",
12
12
  "args": [
13
13
  "--from",
14
- "vmware-aiops==2.4.3",
14
+ "vmware-aiops==2.4.4",
15
15
  "vmware-aiops-mcp"
16
16
  ]
17
17
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zw008/vmware-aiops",
3
- "version": "2.4.3",
3
+ "version": "2.4.4",
4
4
  "description": "AI-powered VMware vCenter/ESXi VM lifecycle and deployment with 61 MCP tools.",
5
5
  "private": true,
6
6
  "license": "MIT",
@@ -4,12 +4,12 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "vmware-aiops"
7
- version = "2.4.3"
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 = "wei-wz.zhou@broadcom.com" }]
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.3",
10
+ "version": "2.4.4",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "pypi",
14
14
  "identifier": "vmware-aiops",
15
- "version": "2.4.3",
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 this skill whenever the user needs to manage VMs in VMware/vSphere/ESXi — it's the entry point for all VM operations.
5
- Directly handles: power on/off, clone, snapshot, migrate, deploy from OVA or templates, run commands inside VMs, batch operations, cluster management, vCenter alarm acknowledgment, a one-glance cluster-health triage ("is anything on fire?"), and VM/host/datastore investigation drill-downs.
6
- Always use this skill for any "power on", "clone", "deploy", "migrate", "batch", "guest exec", "alarm", or VM lifecycle task, and for triage like "is anything on fire" / "what needs attention now" / "investigate this VM", when the context is explicitly VMware, vSphere, or ESXi.
7
- Do NOT use for general read-only queries (inventory/events/VM details — use vmware-monitor), NSX networking (use vmware-nsx), storage/iSCSI/vSAN (use vmware-storage), or Kubernetes cluster lifecycle (use vmware-vks).
8
- For multi-step workflows use vmware-pilot. For load balancing/AVI/AKO use vmware-avi.
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.3
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.3
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.3
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.3
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.3
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.3
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.3 https://github.com/vmware-skills/VMware-AIops.git
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 = 3
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", marker = "python_full_version < '3.13'" },
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.3"
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.5.0"
1245
+ version = "2.6.0"
1246
1246
  source = { editable = "../VMware-Monitor" }
1247
1247
  dependencies = [
1248
1248
  { name = "apscheduler" },
@@ -1,3 +1,3 @@
1
1
  """VMware AIops - AI-powered vCenter/ESXi monitoring and operations."""
2
2
 
3
- __version__ = "2.4.3"
3
+ __version__ = "2.4.4"
@@ -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: %s", e)
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": sanitize(f"{type(exc).__name__}: {exc}", 500)}
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}: {e}",
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": sanitize(f"{type(exc).__name__}: {exc}", 500)}
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