vmware-pilot 2.3.0__tar.gz → 2.4.1__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_pilot-2.3.0 → vmware_pilot-2.4.1}/.claude-plugin/plugin.json +1 -1
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/.mcp.json +1 -1
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/PKG-INFO +26 -5
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/README-CN.md +24 -5
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/README.md +24 -3
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/RELEASE_NOTES.md +86 -1
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/SECURITY.md +4 -3
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/openclaw.plugin.json +1 -1
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/package.json +1 -1
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/pyproject.toml +2 -2
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/server.json +2 -2
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/skills/vmware-pilot/SKILL.md +17 -9
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/skills/vmware-pilot/evals/evals.json +1 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/skills/vmware-pilot/references/agent-guardrails.md +9 -6
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/skills/vmware-pilot/references/capabilities.md +6 -6
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/skills/vmware-pilot/references/cli-reference.md +6 -5
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/skills/vmware-pilot/references/integration-patterns.md +12 -9
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/skills/vmware-pilot/references/setup-guide.md +26 -11
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/skills/vmware-pilot/references/templates.md +31 -16
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/regression/test_template_steps_name_real_tools.py +3 -2
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/fixtures/companion_tools.json +22 -24
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/fixtures/snapshot_companion_tools.py +9 -2
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/test_approval_roles.py +1 -1
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/test_approver_is_caller.py +1 -1
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/test_custom_approval_gate.py +5 -3
- vmware_pilot-2.4.1/tests/test_dispatcher.py +296 -0
- vmware_pilot-2.4.1/tests/test_dispatcher_review.py +452 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/test_executor.py +13 -6
- vmware_pilot-2.4.1/tests/test_last_step_clone_failure.py +78 -0
- vmware_pilot-2.4.1/tests/test_open_lows_2026_10_18.py +106 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/test_own_tools_gated.py +3 -1
- vmware_pilot-2.4.1/tests/test_pre_2_4_0_review.py +113 -0
- vmware_pilot-2.4.1/tests/test_real_run_2026_10_17.py +460 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/test_safe_error_passthrough.py +12 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/test_templates.py +27 -20
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/uv.lock +11 -11
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/__init__.py +1 -1
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/cli.py +8 -1
- vmware_pilot-2.4.1/vmware_pilot/dispatcher.py +261 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/executor.py +308 -43
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/lifecycle_gate.py +71 -11
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/mcp_server/_catalog.py +3 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/mcp_server/_shared.py +10 -3
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/mcp_server/server.py +42 -2
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/mcp_server/tools/lifecycle.py +64 -28
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/mcp_server/tools/query.py +2 -2
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/models.py +3 -0
- vmware_pilot-2.4.1/vmware_pilot/reversibility.py +67 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/templates/_gated.py +5 -3
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/templates/vm.py +97 -28
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/.clawhubignore +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/.gitignore +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/Dockerfile +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/docs/architecture-audit-2026-04-30.md +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/docs/aria-pilot-boundary.md +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/examples/mcp-configs/claude-code.json +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/skills/vmware-pilot/references/workflow-design.md +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/skills/vmware-pilot/scripts/list_available_tools.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/skills/vmware-pilot/scripts/validate_workflow.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/smithery.yaml +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/__init__.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/conftest.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/__init__.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/capability/__init__.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/capability/_family.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/capability/_scores.json +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/capability/_scoring.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/capability/_skill.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/capability/conftest.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/capability/test_entity_reachability.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/capability/test_error_actionability.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/capability/test_tool_description_quality.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/capability/test_tool_manifest_budget.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/regression/__init__.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/regression/_family_write_surface.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/regression/test_approval_gate_coverage.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/regression/test_capability_grader.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/regression/test_catalog_covers_the_family.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/regression/test_cli_writes_guarded.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/eval/regression/test_environment_resolver_isolation.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/test_confirm_needs_approval.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/test_executor_preview_is_not_success.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/test_final_review_fixes.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/test_models.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/test_no_destructive_ops.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/test_old_tool_names_translated.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/test_policy_roles.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/test_review.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/test_server.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/tests/test_templates_pass_confirm.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/approval_gate.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/custom_loader.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/mcp_server/__init__.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/mcp_server/__main__.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/mcp_server/tools/__init__.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/mcp_server/tools/authoring.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/policy_roles.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/renames.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/review.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/templates/__init__.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/templates/_aiops_params.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/templates/_common.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/templates/baseline.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/templates/k8s.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/templates/monitoring.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/templates/network.py +0 -0
- {vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/vmware_pilot/templates/storage.py +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://anthropic.com/claude-code/plugin.schema.json",
|
|
3
3
|
"name": "vmware-pilot",
|
|
4
4
|
"displayName": "VMware Pilot",
|
|
5
|
-
"version": "2.
|
|
5
|
+
"version": "2.4.1",
|
|
6
6
|
"description": "Multi-step workflow orchestration for VMware MCP skills with approval gates and rollback.",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "Wei Zhou",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: vmware-pilot
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.1
|
|
4
4
|
Summary: VMware workflow orchestration — multi-step state machine with approval gates
|
|
5
5
|
Project-URL: Homepage, https://github.com/vmware-skills/VMware-Pilot
|
|
6
6
|
Project-URL: Repository, https://github.com/vmware-skills/VMware-Pilot
|
|
@@ -9,7 +9,7 @@ Project-URL: Changelog, https://github.com/vmware-skills/VMware-Pilot/blob/main/
|
|
|
9
9
|
Author-email: Wei Zhou <wei-wz.zhou@broadcom.com>
|
|
10
10
|
License-Expression: MIT
|
|
11
11
|
Requires-Python: >=3.10
|
|
12
|
-
Requires-Dist: mcp[cli]<2.0,>=1.
|
|
12
|
+
Requires-Dist: mcp[cli]<2.0,>=1.30
|
|
13
13
|
Requires-Dist: pyyaml<7.0,>=6.0
|
|
14
14
|
Requires-Dist: typer<1.0,>=0.12
|
|
15
15
|
Requires-Dist: vmware-policy<2.0,>=1.21.0
|
|
@@ -19,6 +19,8 @@ Description-Content-Type: text/markdown
|
|
|
19
19
|
|
|
20
20
|
# VMware Pilot
|
|
21
21
|
|
|
22
|
+
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.
|
|
23
|
+
|
|
22
24
|
> **Author**: Wei Zhou, VMware by Broadcom — wei-wz.zhou@broadcom.com
|
|
23
25
|
> This is a community-driven project by a VMware engineer, not an official VMware product.
|
|
24
26
|
> For official VMware developer tools see [developer.broadcom.com](https://developer.broadcom.com).
|
|
@@ -89,20 +91,21 @@ pip install --no-index --find-links dist vmware-pilot
|
|
|
89
91
|
| `create_workflow` | Create custom workflow from step list (refused if a destructive step has no approval gate before it) |
|
|
90
92
|
| `run_workflow` | Execute workflow, pauses at approval gates |
|
|
91
93
|
| `get_workflow_status` | Query state + diff report + audit log |
|
|
92
|
-
| `approve` | Human approval, continue execution |
|
|
94
|
+
| `approve` | Human approval, continue execution. Refused while steps before the gate are `not_executed`, until `acknowledge_not_executed=True` says you ran them |
|
|
93
95
|
| `rollback` | Explicit, best-effort undo of steps pilot recorded as succeeded — never automatic. Previews (`blast_radius`) unless `confirm=True` |
|
|
94
96
|
| `cancel_workflow` | Cancel a workflow — move it to the terminal CANCELLED state. Previews (`blast_radius`) unless `confirm=True` |
|
|
95
97
|
|
|
96
98
|
## Built-in Templates (15)
|
|
97
99
|
|
|
98
100
|
`n` is the number of VMs (or drift items); ranges depend on which optional parameters are set.
|
|
99
|
-
`clone_and_test`
|
|
101
|
+
`clone_and_test` needs `snapshot_name` (the snapshot to clone from), resizes staging while it is
|
|
102
|
+
powered off, and has 8 steps when `change_spec` is a guest command (an extra gate before it runs
|
|
100
103
|
in staging). `investigate_alert`'s approvals are synthesis checkpoints; its steps are all reads.
|
|
101
104
|
See `skills/vmware-pilot/references/templates.md` for parameters and steps.
|
|
102
105
|
|
|
103
106
|
| Template | Steps | Approval | Skills Used |
|
|
104
107
|
|----------|:-----:|:--------:|-------------|
|
|
105
|
-
| `clone_and_test` |
|
|
108
|
+
| `clone_and_test` | 7-8 | Yes | aiops, monitor |
|
|
106
109
|
| `incident_response` | 4 | Yes | monitor, aiops |
|
|
107
110
|
| `investigate_alert` | 4 (8 with `deep_dive`) | Yes | monitor, aria |
|
|
108
111
|
| `plan_and_approve` | 3 | Yes | aiops |
|
|
@@ -146,6 +149,24 @@ update it. Requires vmware-policy ≥ 1.19.0. Details: [RELEASE_NOTES.md](RELEAS
|
|
|
146
149
|
> corporate proxy (`invalid peer certificate: UnknownIssuer`). The installed entry point above
|
|
147
150
|
> touches the network zero times; set `UV_NATIVE_TLS=true` if you must use `uvx`.
|
|
148
151
|
|
|
152
|
+
### Pilot runs the steps itself: `--dispatch`
|
|
153
|
+
|
|
154
|
+
By default pilot executes nothing: `run_workflow` returns each step in `pending_dispatch` and your agent performs it.
|
|
155
|
+
Add `--dispatch` (or set `VMWARE_PILOT_DISPATCH=stdio`) and pilot runs each step itself, in that skill's own MCP
|
|
156
|
+
server (`vmware-<skill>-mcp`, which must be installed), so the skill's policy rules, confirmation gate and audit
|
|
157
|
+
apply as usual. Nothing after an approval gate runs before `approve`, and workflows reach `completed`.
|
|
158
|
+
|
|
159
|
+
```json
|
|
160
|
+
{"mcpServers": {"vmware-pilot": {"command": "vmware-pilot", "args": ["mcp", "--dispatch"]}}}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
stdio only: pilot refuses to start with `--dispatch` and `--transport https`/`http` (the skill servers it starts would
|
|
164
|
+
have no caller identity, so roles could not apply). A step that takes longer than `VMWARE_PILOT_DISPATCH_TIMEOUT`
|
|
165
|
+
seconds (default 1800) is recorded `interrupted` — its effect is unknown — and rollback waits for you to check it.
|
|
166
|
+
`run_workflow` and `approve` take as long as the steps they run: set your MCP client's tool timeout above your
|
|
167
|
+
longest step. If a call does time out, Pilot carries on and answers nothing else until the step ends; then
|
|
168
|
+
`get_workflow_status` shows the outcome. Never perform those steps yourself.
|
|
169
|
+
|
|
149
170
|
<!-- usage: remote-and-exposure -->
|
|
150
171
|
## Remote access (HTTPS) and limiting tools
|
|
151
172
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
<!-- mcp-name: io.github.vmware-skills/vmware-pilot -->
|
|
2
2
|
# VMware Pilot
|
|
3
3
|
|
|
4
|
+
要用自己的模型和 Agent 平台进行只读自测,请看 marketplace 根目录的[共享模型适配自测任务](https://github.com/vmware-skills/marketplace/blob/main/MODEL_FIT_SELF_TEST.md)。
|
|
5
|
+
|
|
4
6
|
> **作者**: Wei Zhou, VMware by Broadcom — wei-wz.zhou@broadcom.com
|
|
5
7
|
> 本项目由 VMware 工程师维护的社区项目,非 VMware 官方产品。
|
|
6
8
|
> VMware 官方开发者工具请访问 [developer.broadcom.com](https://developer.broadcom.com)。
|
|
@@ -43,19 +45,19 @@ vmware-pilot mcp # 启动 MCP server(stdio)
|
|
|
43
45
|
| `create_workflow` | 从步骤列表直接创建自定义工作流(若破坏性步骤之前没有审批门控则拒绝) |
|
|
44
46
|
| `run_workflow` | 执行工作流,在审批门控处暂停 |
|
|
45
47
|
| `get_workflow_status` | 查询状态 + 差异报告 + 审计日志 |
|
|
46
|
-
| `approve` |
|
|
48
|
+
| `approve` | 人工审批,继续执行。审批点之前仍有 `not_executed` 步骤时拒绝,直到 `acknowledge_not_executed=True` 表明这些步骤已由你执行 |
|
|
47
49
|
| `rollback` | 显式、尽力而为地逆序撤销 pilot 记录为成功的步骤——从不自动执行。不带 `confirm=True` 时只预览(`blast_radius`) |
|
|
48
50
|
| `cancel_workflow` | 取消工作流,置为终态 CANCELLED。不带 `confirm=True` 时只预览(`blast_radius`) |
|
|
49
51
|
|
|
50
52
|
## 内置模板(15 个)
|
|
51
53
|
|
|
52
|
-
`n` 为虚拟机(或漂移项)数量;区间取决于设置了哪些可选参数。`
|
|
53
|
-
`
|
|
54
|
-
|
|
54
|
+
`n` 为虚拟机(或漂移项)数量;区间取决于设置了哪些可选参数。`clone_and_test` 需要
|
|
55
|
+
`snapshot_name`(克隆所用的快照),在 staging 关机状态下调整规格;`change_spec` 为 guest 命令时
|
|
56
|
+
有 8 步(在 staging 中执行命令前多一道审批)。`investigate_alert` 的审批是综合判断检查点,其步骤全部为只读。参数与步骤详见 `skills/vmware-pilot/references/templates.md`。
|
|
55
57
|
|
|
56
58
|
| 模板 | 步骤数 | 审批 | 使用的技能 |
|
|
57
59
|
|------|:------:|:----:|-----------|
|
|
58
|
-
| `clone_and_test` |
|
|
60
|
+
| `clone_and_test` | 7-8 | 是 | aiops, monitor |
|
|
59
61
|
| `incident_response` | 4 | 是 | monitor, aiops |
|
|
60
62
|
| `investigate_alert` | 4(`deep_dive` 时 8) | 是 | monitor, aria |
|
|
61
63
|
| `plan_and_approve` | 3 | 是 | aiops |
|
|
@@ -97,6 +99,23 @@ CLI 命令也不变。技能目录同时跟随 vmware-vks 的改名(`get_super
|
|
|
97
99
|
> (`invalid peer certificate: UnknownIssuer`)。上面的入口点走 PATH,完全不联网;
|
|
98
100
|
> 若必须用 `uvx`,请设置 `UV_NATIVE_TLS=true`。
|
|
99
101
|
|
|
102
|
+
### 由 Pilot 自己执行步骤:`--dispatch`
|
|
103
|
+
|
|
104
|
+
默认情况下 Pilot 不执行任何步骤:`run_workflow` 把每一步放在 `pending_dispatch` 里返回,由你的 agent 去执行。
|
|
105
|
+
加上 `--dispatch`(或设置 `VMWARE_PILOT_DISPATCH=stdio`)后,Pilot 会在对应 skill 自己的 MCP server
|
|
106
|
+
(`vmware-<skill>-mcp`,需已安装)里执行每一步,因此该 skill 的策略规则、确认门和审计照常生效。审批点之后的步骤
|
|
107
|
+
在 `approve` 之前不会执行,工作流可以走到 `completed`。
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
{"mcpServers": {"vmware-pilot": {"command": "vmware-pilot", "args": ["mcp", "--dispatch"]}}}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
仅限 stdio:`--dispatch` 与 `--transport https`/`http` 同时使用时 Pilot 拒绝启动(它启动的 skill server 没有调用者
|
|
114
|
+
身份,角色无法生效)。超过 `VMWARE_PILOT_DISPATCH_TIMEOUT` 秒(默认 1800)的步骤记为 `interrupted`——效果未知——
|
|
115
|
+
回滚会等你确认后再进行。
|
|
116
|
+
`run_workflow` 和 `approve` 的耗时等于它们执行的步骤:请把 MCP 客户端的工具超时设得比最长的步骤更长;万一调用超时,
|
|
117
|
+
Pilot 会继续执行,并在该步骤结束前不响应其他调用;之后用 `get_workflow_status` 查看结果——不要自己去执行这些步骤。
|
|
118
|
+
|
|
100
119
|
## 审计与安全
|
|
101
120
|
|
|
102
121
|
所有操作通过 vmware-policy(`@vmware_tool` 装饰器)自动审计:
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
# VMware Pilot
|
|
4
4
|
|
|
5
|
+
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.
|
|
6
|
+
|
|
5
7
|
> **Author**: Wei Zhou, VMware by Broadcom — wei-wz.zhou@broadcom.com
|
|
6
8
|
> This is a community-driven project by a VMware engineer, not an official VMware product.
|
|
7
9
|
> For official VMware developer tools see [developer.broadcom.com](https://developer.broadcom.com).
|
|
@@ -72,20 +74,21 @@ pip install --no-index --find-links dist vmware-pilot
|
|
|
72
74
|
| `create_workflow` | Create custom workflow from step list (refused if a destructive step has no approval gate before it) |
|
|
73
75
|
| `run_workflow` | Execute workflow, pauses at approval gates |
|
|
74
76
|
| `get_workflow_status` | Query state + diff report + audit log |
|
|
75
|
-
| `approve` | Human approval, continue execution |
|
|
77
|
+
| `approve` | Human approval, continue execution. Refused while steps before the gate are `not_executed`, until `acknowledge_not_executed=True` says you ran them |
|
|
76
78
|
| `rollback` | Explicit, best-effort undo of steps pilot recorded as succeeded — never automatic. Previews (`blast_radius`) unless `confirm=True` |
|
|
77
79
|
| `cancel_workflow` | Cancel a workflow — move it to the terminal CANCELLED state. Previews (`blast_radius`) unless `confirm=True` |
|
|
78
80
|
|
|
79
81
|
## Built-in Templates (15)
|
|
80
82
|
|
|
81
83
|
`n` is the number of VMs (or drift items); ranges depend on which optional parameters are set.
|
|
82
|
-
`clone_and_test`
|
|
84
|
+
`clone_and_test` needs `snapshot_name` (the snapshot to clone from), resizes staging while it is
|
|
85
|
+
powered off, and has 8 steps when `change_spec` is a guest command (an extra gate before it runs
|
|
83
86
|
in staging). `investigate_alert`'s approvals are synthesis checkpoints; its steps are all reads.
|
|
84
87
|
See `skills/vmware-pilot/references/templates.md` for parameters and steps.
|
|
85
88
|
|
|
86
89
|
| Template | Steps | Approval | Skills Used |
|
|
87
90
|
|----------|:-----:|:--------:|-------------|
|
|
88
|
-
| `clone_and_test` |
|
|
91
|
+
| `clone_and_test` | 7-8 | Yes | aiops, monitor |
|
|
89
92
|
| `incident_response` | 4 | Yes | monitor, aiops |
|
|
90
93
|
| `investigate_alert` | 4 (8 with `deep_dive`) | Yes | monitor, aria |
|
|
91
94
|
| `plan_and_approve` | 3 | Yes | aiops |
|
|
@@ -129,6 +132,24 @@ update it. Requires vmware-policy ≥ 1.19.0. Details: [RELEASE_NOTES.md](RELEAS
|
|
|
129
132
|
> corporate proxy (`invalid peer certificate: UnknownIssuer`). The installed entry point above
|
|
130
133
|
> touches the network zero times; set `UV_NATIVE_TLS=true` if you must use `uvx`.
|
|
131
134
|
|
|
135
|
+
### Pilot runs the steps itself: `--dispatch`
|
|
136
|
+
|
|
137
|
+
By default pilot executes nothing: `run_workflow` returns each step in `pending_dispatch` and your agent performs it.
|
|
138
|
+
Add `--dispatch` (or set `VMWARE_PILOT_DISPATCH=stdio`) and pilot runs each step itself, in that skill's own MCP
|
|
139
|
+
server (`vmware-<skill>-mcp`, which must be installed), so the skill's policy rules, confirmation gate and audit
|
|
140
|
+
apply as usual. Nothing after an approval gate runs before `approve`, and workflows reach `completed`.
|
|
141
|
+
|
|
142
|
+
```json
|
|
143
|
+
{"mcpServers": {"vmware-pilot": {"command": "vmware-pilot", "args": ["mcp", "--dispatch"]}}}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
stdio only: pilot refuses to start with `--dispatch` and `--transport https`/`http` (the skill servers it starts would
|
|
147
|
+
have no caller identity, so roles could not apply). A step that takes longer than `VMWARE_PILOT_DISPATCH_TIMEOUT`
|
|
148
|
+
seconds (default 1800) is recorded `interrupted` — its effect is unknown — and rollback waits for you to check it.
|
|
149
|
+
`run_workflow` and `approve` take as long as the steps they run: set your MCP client's tool timeout above your
|
|
150
|
+
longest step. If a call does time out, Pilot carries on and answers nothing else until the step ends; then
|
|
151
|
+
`get_workflow_status` shows the outcome. Never perform those steps yourself.
|
|
152
|
+
|
|
132
153
|
<!-- usage: remote-and-exposure -->
|
|
133
154
|
## Remote access (HTTPS) and limiting tools
|
|
134
155
|
|
|
@@ -1,3 +1,88 @@
|
|
|
1
|
+
## v2.4.1 — VKS 9.1 upgrade risk in the companion catalog (2026-11-01)
|
|
2
|
+
|
|
3
|
+
* The companion-tool snapshot now includes VKS 3.5.0's read-only `get_supervisor_upgrade_risk` tool. The documented VKS and family tool counts match the live registries. Pilot's workflow execution behavior is unchanged.
|
|
4
|
+
* Install VMware-VKS 3.5.0 or later to use that tool. Its advisory report does not measure VUMDB schema or establish upgrade clearance.
|
|
5
|
+
|
|
6
|
+
## v2.4.0 — runs its own steps on request; honest gates and rollback (first real-vSphere run)
|
|
7
|
+
|
|
8
|
+
### Behaviour changes for existing callers
|
|
9
|
+
|
|
10
|
+
* `approve` refuses a gate whose earlier steps were handed out (`not_executed`) until
|
|
11
|
+
`acknowledge_not_executed=True` — this applies to the default MCP server and to workflows saved by 2.3.0 that are
|
|
12
|
+
already awaiting approval. An automated `approve` caller must pass the flag after performing the steps.
|
|
13
|
+
* `clone_and_test` requires `snapshot_name` (it used to clone from a snapshot literally named `current`).
|
|
14
|
+
* Rollback reports a step without an undo as `not_reversible` (was `skipped`); approval gates and catalog reads are no
|
|
15
|
+
longer listed. A rollback whose undo failed or whose effect is unknown returns `action: "rollback_incomplete"` with
|
|
16
|
+
`outcome: "failed"` and an `error` naming them (it said `rolled_back`).
|
|
17
|
+
* `cancel_workflow` keeps handed-out steps `not_executed` (was rewritten to `skipped`).
|
|
18
|
+
* With vmware-policy 1.24.2, Pilot's own refusals and failed outcomes (`run_workflow`/`approve` ending
|
|
19
|
+
`outcome: "failed"`, refusals carrying `error`, an incomplete rollback) are `isError` frames; previews,
|
|
20
|
+
`awaiting_approval` and `dispatch_required` are not.
|
|
21
|
+
|
|
22
|
+
### Details
|
|
23
|
+
|
|
24
|
+
* A step result's `kubeconfig` (a bearer token from VKS `issue_*_kubeconfig` under `--dispatch`) is masked in
|
|
25
|
+
`workflows.db` like a password. With `--dispatch`, a skill's failed call keeps its own error envelope (`hint`
|
|
26
|
+
included) instead of a flattened JSON string.
|
|
27
|
+
|
|
28
|
+
Found running Pilot workflows on vCenter 8.0.3 for the first time, through the MCP server and through an embedder
|
|
29
|
+
that dispatched steps to the 2.4.0 skill servers.
|
|
30
|
+
|
|
31
|
+
* **`clone_and_test` works on real vSphere.** It cloned from a snapshot literally named `current` (almost no VM
|
|
32
|
+
has one) and resized the clone after powering it on, which vCenter refuses (`MemoryHotPlugNotSupported`) on any
|
|
33
|
+
VM without hot-add. Now `snapshot_name` is **required** (no default; the error names `list_vm_snapshots`), the
|
|
34
|
+
clone is made powered off, staging is resized while off and then powered on, and the check is vmware-monitor
|
|
35
|
+
`investigate_vm` on the staging VM instead of `get_alarms` for the whole vCenter. A guest command runs after
|
|
36
|
+
power-on. 7 steps (8 for a guest command). Pilot still does not wait `monitor_minutes`: the approval message
|
|
37
|
+
asks the approver to, says a running production VM is resized in place (needs hot-add), and that the production
|
|
38
|
+
change is not rolled back. The clone step no longer claims a rollback (powering a clone off does not remove it).
|
|
39
|
+
* **`approve` refuses a gate whose earlier steps nobody ran.** Through the MCP server (no dispatcher) every step
|
|
40
|
+
before the gate is `not_executed`, and the gate used to pass under "Staging VM … tested". It now refuses and
|
|
41
|
+
lists them in `not_executed_before_gate`; `acknowledge_not_executed=True` records them as `reported_done`
|
|
42
|
+
(performed outside Pilot) and they are not handed out again. Pilot never saw their results: through MCP a later
|
|
43
|
+
step that references one is handed out with the reference unresolved (fill it from that step's result), and
|
|
44
|
+
an embedder that dispatches it refuses it. An embedder with a dispatcher is unaffected unless it resumes a workflow
|
|
45
|
+
that was first run without one — then the same refusal applies. The acknowledgement is the caller's
|
|
46
|
+
statement, not a check: Pilot records who sent it, not what the steps returned.
|
|
47
|
+
SKILL.md now says plainly who executes steps: through MCP the agent does, and a workflow never reaches
|
|
48
|
+
`completed` that way.
|
|
49
|
+
* **Rollback says what it cannot undo.** A step with no rollback is reported `not_reversible` (it was `skipped`,
|
|
50
|
+
"no rollback defined"); a rollback that does not remove what the step created — a clone powered off — is
|
|
51
|
+
`partial` with `left_behind`, and the step is `partially_rolled_back`. The preview carries the same:
|
|
52
|
+
`leaves_behind` on such entries and `left_in_place_note`. Approval gates are no longer listed as skipped.
|
|
53
|
+
* **Failure is read from the frame, not from prose.** Besides `isError` and a top-level `error` on a plain
|
|
54
|
+
dict, a top-level `error` in an MCP result's structured content and a one-row `[{"error": ...}]` list now fail
|
|
55
|
+
the step, the last step included. A string is never read as failure, even one starting `Error: ` — decided,
|
|
56
|
+
as in vmware-policy, because tools return console text that can start that way. A skill must set `isError`;
|
|
57
|
+
AIops's linked clone returned its failure as prose in 2.4.0 and is fixed there (it now raises).
|
|
58
|
+
* **Pilot can run the steps itself: `vmware-pilot mcp --dispatch`** (or `VMWARE_PILOT_DISPATCH=stdio`), off by
|
|
59
|
+
default (HLD §19, D-26). Each step runs in that skill's own MCP server (`vmware-<skill>-mcp`), so its policy,
|
|
60
|
+
confirmation gate and audit apply; nothing after an approval gate runs before `approve`; workflows reach
|
|
61
|
+
`completed`. stdio only — refused with `--transport https`/`http`, and a call with a network caller is refused.
|
|
62
|
+
Only the family's skills (not `pilot`) are started, without a shell. A step that exceeds
|
|
63
|
+
`VMWARE_PILOT_DISPATCH_TIMEOUT` (default 1800 s) is recorded `interrupted` (effect unknown), as is a step whose
|
|
64
|
+
skill server died after the call was sent; a server that never starts fails the step with its reason. Every
|
|
65
|
+
step's skill is resolved before step 0 runs; settings are checked at start (`VMWARE_PILOT_DISPATCH` must be
|
|
66
|
+
`stdio` or unset). A step already handed out in `pending_dispatch` is never run again by a `--dispatch` Pilot.
|
|
67
|
+
Results are stored as the tool's own data, so `__from_step_N__:key` works; a reference to a key the step did
|
|
68
|
+
not return is refused (it used to send the whole result in its place). Failure is read from the frame:
|
|
69
|
+
skills' failed calls arrive as `isError` once they run vmware-policy with `vmware_policy.frame` (vmware-policy
|
|
70
|
+
1.24.2). With an older Policy, 13 of 14 skills sent failures with `isError: false`; Pilot catches the
|
|
71
|
+
`{"error": ...}` envelope itself, but a string-shaped failure (mostly AVI's) reads as success.
|
|
72
|
+
Pilot's tools are synchronous: set the MCP client's tool timeout above the longest step.
|
|
73
|
+
* A guest command (`run_vm_guest_command`, `_with_output`) that exits non-zero now fails the step (it was recorded
|
|
74
|
+
as success); one that timed out or whose process vanished (`exit_code` -1) is `interrupted` — it may still be
|
|
75
|
+
running. A clone left `partially_rolled_back` is still listed by a second rollback; an undo whose effect is
|
|
76
|
+
unknown marks its step `interrupted`. The rollback preview lists a rollback attached to a read step.
|
|
77
|
+
* `investigate_vm` added to the design catalog (101 tools).
|
|
78
|
+
* Two new step statuses, `reported_done` and `partially_rolled_back`. Pilot 2.3.0 does not know them: reading a
|
|
79
|
+
workflow that has them, its `rollback` / `cancel_workflow` refuse ("unrecognised status") rather than guess.
|
|
80
|
+
* The rollback preview gains `not_reversible_outside_pilot` (steps handed to the caller with no undo — a clone,
|
|
81
|
+
a production resize; tools the catalog marks read-only left out) with a note; through MCP those used to appear nowhere in the
|
|
82
|
+
preview. The cancel preview gains `handed_out_to_caller`: steps already in `pending_dispatch`, which cancel
|
|
83
|
+
can neither stop nor undo — they used to be listed as `would_skip`, and cancel now keeps them `not_executed`
|
|
84
|
+
on the record instead of rewriting them to `skipped`.
|
|
85
|
+
|
|
1
86
|
## v2.3.0 — roles for network callers (HLD §18)
|
|
2
87
|
|
|
3
88
|
* Workflows record their creator (`created_by`: the network caller `token:<name>`, or the OS user). Workflows saved
|
|
@@ -998,4 +1083,4 @@ Initial release. Multi-step workflow orchestration with approval gates for VMwar
|
|
|
998
1083
|
- Rollback: reverse completed steps in order on failure
|
|
999
1084
|
- Skill catalog: 7 skills, 162 tools available for workflow composition
|
|
1000
1085
|
- blocked_by_policy state: mid-workflow policy denial without auto-rollback
|
|
1001
|
-
- 32 unit tests
|
|
1086
|
+
- 32 unit tests
|
|
@@ -32,14 +32,15 @@ A workflow pauses at each `require_approval` step until `approve()` is called wi
|
|
|
32
32
|
1. **Review before every run** — `run_workflow` reviews the plan and refuses one whose destructive step (skill-catalog risk high/critical, or a destructive name) or unclassifiable step has no gate before it
|
|
33
33
|
2. **Custom workflows are rejected, not warned** — for a custom YAML, `create_workflow`, or AI-designed workflow, that same finding makes `create_workflow_from_template`, `create_workflow` and `confirm_draft` refuse to save it and `run_workflow` refuse it even with `force=True`; only built-in templates keep the audited `force=True` override
|
|
34
34
|
3. **Credentials and guest commands count as destructive** — `vks issue_tkc_kubeconfig` and `issue_supervisor_kubeconfig` return a live Supervisor credential, and the aiops guest tools (`run_vm_guest_command`, `run_vm_guest_command_with_output`, `upload_vm_guest_file`, `provision_vm_guest`) run arbitrary commands or write files inside a VM as the account the caller names; all are gated like a delete
|
|
35
|
-
4. **The gate is in pilot's workflow, not in the target skill** —
|
|
35
|
+
4. **The gate is in pilot's workflow, not in the target skill** — by default pilot executes nothing itself; the calling agent performs each step through the companion skill, which applies its own policy rules
|
|
36
|
+
5. **`--dispatch` makes the gate hold for workflows run through pilot** — pilot then runs each step in that skill's own MCP server (same policy, confirmation gate and audit) and nothing after a gate runs before `approve`. It does not stop an agent from calling a skill directly. stdio only: refused with a network transport, because the skill servers it starts would have no caller identity and roles could not apply
|
|
36
37
|
|
|
37
38
|
### Rollback (explicit, best-effort — never automatic)
|
|
38
39
|
|
|
39
40
|
- A failed step stops the workflow (`failed`); remaining steps are marked `skipped` and nothing is undone automatically
|
|
40
41
|
- `rollback()` and `cancel_workflow()` preview by default: without `confirm=True` they return `blast_radius` (steps undone, left applied, or skipped) and change nothing; `confirm=True` refuses when the state does not allow the transition, a step status is unrecognised, the record cannot be read, or a step was left `running`/`interrupted` (unknown effect) — the last only lifts with an explicit `acknowledge_unknown_effects=True` after the step is checked in the target system
|
|
41
|
-
- `rollback()` must be called deliberately. It reverses, last first, only the steps pilot recorded as `success`, dispatching each step's `rollback_tool` — which only happens when an embedder supplied a dispatcher. On the MCP server
|
|
42
|
-
- Steps without a `rollback_tool` are reported `
|
|
42
|
+
- `rollback()` must be called deliberately. It reverses, last first, only the steps pilot recorded as `success`, dispatching each step's `rollback_tool` — which only happens when pilot runs with `--dispatch` (or an embedder supplied a dispatcher). On the MCP server without `--dispatch` the steps the agent performed are recorded `not_executed`, so `rollback()` reverses nothing but approval gates; the agent must call each performed step's `rollback_tool` itself
|
|
43
|
+
- Steps without a `rollback_tool` are reported `not_reversible` (their change stays); an undo that does not remove what the step created is `partial`; a failed undo does not stop the rest and sets `blocked_reason: rollback_failed`
|
|
43
44
|
- Rollback results are kept on the workflow record and each `rollback` call is audited to `~/.vmware/audit.db`
|
|
44
45
|
- A dispatched step or undo that returns a top-level `action: preview` (a companion tool called without `confirm=True`) is recorded `failed`, never `success`; built-in templates pass `confirm=True` to those tools only in steps that come after an approval gate (a test fails any template that does so earlier)
|
|
45
46
|
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "vmware-pilot"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.4.1"
|
|
8
8
|
description = "VMware workflow orchestration — multi-step state machine with approval gates"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -12,7 +12,7 @@ requires-python = ">=3.10"
|
|
|
12
12
|
authors = [{ name = "Wei Zhou", email = "wei-wz.zhou@broadcom.com" }]
|
|
13
13
|
dependencies = [
|
|
14
14
|
"vmware-policy>=1.21.0,<2.0",
|
|
15
|
-
"mcp[cli]>=1.
|
|
15
|
+
"mcp[cli]>=1.30,<2.0",
|
|
16
16
|
"pyyaml>=6.0,<7.0",
|
|
17
17
|
"typer>=0.12,<1.0",
|
|
18
18
|
]
|
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
"url": "https://github.com/vmware-skills/VMware-Pilot",
|
|
8
8
|
"source": "github"
|
|
9
9
|
},
|
|
10
|
-
"version": "2.
|
|
10
|
+
"version": "2.4.1",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "pypi",
|
|
14
14
|
"identifier": "vmware-pilot",
|
|
15
|
-
"version": "2.
|
|
15
|
+
"version": "2.4.1",
|
|
16
16
|
"runtimeHint": "uvx",
|
|
17
17
|
"packageArguments": [
|
|
18
18
|
{
|
|
@@ -22,6 +22,8 @@ compatibility: >
|
|
|
22
22
|
|
|
23
23
|
# VMware Pilot
|
|
24
24
|
|
|
25
|
+
> Self-test: [guide](https://github.com/vmware-skills/marketplace/blob/main/MODEL_FIT_SELF_TEST.md).
|
|
26
|
+
|
|
25
27
|
> **Disclaimer**: This is a community-maintained open-source project and is **not affiliated with, endorsed by, or sponsored by VMware, Inc. or Broadcom Inc.** "VMware" is a trademark of Broadcom. Source code is publicly auditable at [github.com/vmware-skills/VMware-Pilot](https://github.com/vmware-skills/VMware-Pilot) under the MIT license.
|
|
26
28
|
|
|
27
29
|
Multi-step workflow orchestration for VMware MCP skills — design, approve, execute, rollback.
|
|
@@ -32,7 +34,7 @@ Multi-step workflow orchestration for VMware MCP skills — design, approve, exe
|
|
|
32
34
|
|
|
33
35
|
| Capability | Description |
|
|
34
36
|
|---|---|
|
|
35
|
-
| Workflow Design | Natural language goal → AI designs steps from the `get_skill_catalog` building-block list (
|
|
37
|
+
| Workflow Design | Natural language goal → AI designs steps from the `get_skill_catalog` building-block list (101 curated tools across 13 skills) |
|
|
36
38
|
| Approval Gates | Pause execution for human review before destructive operations |
|
|
37
39
|
| State Persistence | SQLite-backed, survives restarts, supports resume from checkpoint |
|
|
38
40
|
| Rollback | Explicit, best-effort undo of completed steps in reverse order — never automatic (see Troubleshooting) |
|
|
@@ -42,7 +44,7 @@ Multi-step workflow orchestration for VMware MCP skills — design, approve, exe
|
|
|
42
44
|
## Quick Install
|
|
43
45
|
|
|
44
46
|
```bash
|
|
45
|
-
uv tool install vmware-pilot==2.
|
|
47
|
+
uv tool install vmware-pilot==2.4.1
|
|
46
48
|
vmware-pilot mcp # start the MCP server (stdio)
|
|
47
49
|
```
|
|
48
50
|
|
|
@@ -96,10 +98,11 @@ AI calls: run_workflow(id) → execute with approval gates
|
|
|
96
98
|
AI calls: create_workflow_from_template("clone_and_test", {
|
|
97
99
|
target_vm: "db01",
|
|
98
100
|
change_spec: {memory_mb: 32768},
|
|
101
|
+
snapshot_name: "pre-change", # required: list_vm_snapshots (monitor)
|
|
99
102
|
target: "vcenter-prod"
|
|
100
103
|
})
|
|
101
104
|
AI calls: run_workflow(workflow_id)
|
|
102
|
-
→ Clone →
|
|
105
|
+
→ Clone (off) → Resize → Power on → Check → [Approval Gate] → Production → Power off staging
|
|
103
106
|
```
|
|
104
107
|
|
|
105
108
|
### 3. Batch Operations with Approval
|
|
@@ -143,11 +146,14 @@ Deploy a backend VM, create a K8s namespace, and wire up AKO Ingress to the AVI
|
|
|
143
146
|
|
|
144
147
|
## Dispatch Contract (Important)
|
|
145
148
|
|
|
146
|
-
**
|
|
149
|
+
**Who executes steps depends on how pilot was started.**
|
|
150
|
+
|
|
151
|
+
- **`vmware-pilot mcp --dispatch`** (or `VMWARE_PILOT_DISPATCH=stdio`): pilot runs each step itself, in that skill's own MCP server (its policy, confirmation gate and audit apply), and stops at every approval gate — nothing after a gate runs before `approve`. Workflows reach `completed`. stdio only: refused with `--transport https`/`http`.
|
|
152
|
+
- **Default (no `--dispatch`): you do.** Every step is recorded `not_executed` and returned in `pending_dispatch`; perform them in order. At a gate, `approve` refuses while earlier steps are `not_executed` — show the user what they returned, then `approve(..., acknowledge_not_executed=True)`; they become `reported_done`. The workflow ends `dispatch_required`, never `completed`.
|
|
147
153
|
|
|
148
|
-
|
|
154
|
+
Without `--dispatch` this is the v2-style architecture: pilot's context stays small, state is always on disk, and there are no persistent agent threads. Full contract details: see [`references/integration-patterns.md`](references/integration-patterns.md#the-dispatch-contract).
|
|
149
155
|
|
|
150
|
-
**`get_skill_catalog` is a curated design aid, not a whitelist.** It surfaces
|
|
156
|
+
**`get_skill_catalog` is a curated design aid, not a whitelist.** It surfaces 101 hand-picked building blocks across 13 skills — a deliberate subset of what those skills expose (aiops alone has 61 tools; the catalog lists 19). A step's `skill` handed to the calling agent may name any companion skill, including ones the catalog does not list; with `--dispatch` only catalog skills run (`pilot` is for approval gates). Use the catalog for inspiration; consult the target skill's own SKILL.md for its full tool surface.
|
|
151
157
|
|
|
152
158
|
## MCP Tools (13 — 4 read, 9 write/control)
|
|
153
159
|
|
|
@@ -177,7 +183,7 @@ The five most-used:
|
|
|
177
183
|
|
|
178
184
|
| Template | Steps | Approval | Skills Used |
|
|
179
185
|
|---|---|---|---|
|
|
180
|
-
| `clone_and_test` |
|
|
186
|
+
| `clone_and_test` | 7 (8 for a guest command) | Yes | aiops + monitor |
|
|
181
187
|
| `incident_response` | 4 | Yes | monitor + aiops |
|
|
182
188
|
| `investigate_alert` | 4 / 8 | Yes | monitor + aria (parallel-group gather + 4-criteria checkpoint, optional `deep_dive`) |
|
|
183
189
|
| `plan_and_approve` | 3 | Yes | aiops |
|
|
@@ -280,7 +286,7 @@ The template name is case-sensitive. Use `list_workflows()` to see all available
|
|
|
280
286
|
4. A file that lists but will not plan is missing an approval gate -- the `create_workflow_from_template` error names the step and the file
|
|
281
287
|
|
|
282
288
|
### Rollback did nothing, or fails on some steps
|
|
283
|
-
Rollback never happens on its own: a failed step leaves the workflow `failed` and stops. A bare `rollback(workflow_id)` only previews; `confirm=True` acts. It only reverses steps pilot recorded as `success`, and on the MCP server (no dispatcher) the steps you performed from `pending_dispatch` stay `not_executed` — so `rollback` there reverses nothing
|
|
289
|
+
Rollback never happens on its own: a failed step leaves the workflow `failed` and stops. A bare `rollback(workflow_id)` only previews; `confirm=True` acts. It only reverses steps pilot recorded as `success`, and on the MCP server (no dispatcher) the steps you performed from `pending_dispatch` stay `not_executed` — so `rollback` there reverses nothing. Undo them yourself: call each performed step's `rollback_tool` with its `rollback_params`, last step first, after confirming with the user. Steps without a `rollback_tool` cannot be undone: rollback reports them `not_reversible`, and the preview lists steps handed to you that have none under `not_reversible_outside_pilot` — if you performed them (a clone, a production resize) they stay. An undo that does not remove what the step created is `partial` — a clone that was only powered off stays; delete it by hand. When pilot dispatches (`--dispatch`), rollback is best-effort: a failed undo does not stop the rest, and the result reports each one.
|
|
284
290
|
|
|
285
291
|
### "Workflow cannot be run" state error
|
|
286
292
|
A workflow can only be run from `pending` or `running` states. If it is in `draft`, call `confirm_draft()` first. If it is in `completed` or `failed`, create a new workflow -- completed workflows cannot be re-run.
|
|
@@ -303,7 +309,9 @@ No vCenter credentials needed — pilot orchestrates other skills that handle co
|
|
|
303
309
|
}
|
|
304
310
|
```
|
|
305
311
|
|
|
306
|
-
|
|
312
|
+
Add `"--dispatch"` to `args` to have pilot run the steps itself (each companion skill must be installed: `vmware-<skill>-mcp` on `PATH`).
|
|
313
|
+
|
|
314
|
+
> Fallback: `{"command": "uvx", "args": ["--from", "vmware-pilot==2.4.1", "vmware-pilot-mcp"]}` also
|
|
307
315
|
> works, but `uvx` re-resolves the package against PyPI on every start and fails behind a
|
|
308
316
|
> TLS-inspecting corporate proxy (`invalid peer certificate: UnknownIssuer`). The installed
|
|
309
317
|
> entry point above touches the network zero times; set `UV_NATIVE_TLS=true` if you must use `uvx`.
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"expectations": [
|
|
10
10
|
"Uses create_workflow_from_template with type clone_and_test",
|
|
11
11
|
"Change spec includes memory_mb: 32768",
|
|
12
|
+
"Passes snapshot_name, found with vmware-monitor list_vm_snapshots (required, no default)",
|
|
12
13
|
"Workflow has approval gate before production apply",
|
|
13
14
|
"Shows workflow steps for user review"
|
|
14
15
|
]
|
{vmware_pilot-2.3.0 → vmware_pilot-2.4.1}/skills/vmware-pilot/references/agent-guardrails.md
RENAMED
|
@@ -18,7 +18,9 @@ vmware-pilot is the odd one out. It manages no infrastructure of its own — it
|
|
|
18
18
|
designs multi-step workflows, tracks their state, and gates them on human
|
|
19
19
|
approval. Two consequences follow, and both matter more on a small model than
|
|
20
20
|
on a large one: **authoring a workflow is itself the write operation**, and
|
|
21
|
-
**
|
|
21
|
+
**by default pilot executes nothing** — the calling agent does. (Started with
|
|
22
|
+
`--dispatch`, pilot runs each step itself in that skill's own MCP server; the
|
|
23
|
+
result then has no `pending_dispatch`, and you do not perform the steps.)
|
|
22
24
|
|
|
23
25
|
> **Disclaimer**: This is a community-maintained open-source project and is
|
|
24
26
|
> **not affiliated with, endorsed by, or sponsored by VMware, Inc. or Broadcom
|
|
@@ -34,7 +36,7 @@ These are structural, so it cannot.
|
|
|
34
36
|
|
|
35
37
|
| Guardrail you would otherwise prompt for | Now enforced by |
|
|
36
38
|
|---|---|
|
|
37
|
-
| "Do not execute steps yourself — hand them back for a human to run" | **The dispatch contract.**
|
|
39
|
+
| "Do not execute steps yourself — hand them back for a human to run" | **The dispatch contract.** Without `--dispatch`, pilot never calls a companion skill's MCP tools; it returns a step description and the calling agent invokes the tool. With `--dispatch`, pilot runs the steps and stops at each approval gate, so nothing after a gate runs before `approve`. |
|
|
38
40
|
| "Check the plan makes sense before running it" | **`review_workflow`** performs a structural sanity check and returns `approved` or `needs_revision`. It is a read tool that inspects a definition without executing it. |
|
|
39
41
|
| "Put an approval gate before anything destructive" | **Custom-workflow rejection.** In a custom workflow (YAML, `create_workflow`, or a draft), a destructive or unclassifiable step — or any step passing `confirm: True` — with no `require_approval` before it makes `create_workflow` / `confirm_draft` / `create_workflow_from_template` refuse to save it and `run_workflow` refuse to run it — `force=True` does not override that. The refusal names the step and the gate to insert. |
|
|
40
42
|
| "Log every state change you make" | **The `@vmware_tool` decorator.** Every workflow transition is recorded to `~/.vmware/audit.db`, and `get_workflow_status` returns the state plus its audit log. |
|
|
@@ -66,8 +68,8 @@ your agent's instruction block.
|
|
|
66
68
|
|
|
67
69
|
- vmware-pilot: multi-step workflows — design, plan, run, approve, roll back,
|
|
68
70
|
cancel, and inspect state.
|
|
69
|
-
- vmware-aiops: VM lifecycle.
|
|
70
|
-
you a step.
|
|
71
|
+
- vmware-aiops: VM lifecycle. Without `--dispatch` pilot never calls it; you
|
|
72
|
+
do, when pilot hands you a step.
|
|
71
73
|
- vmware-monitor: read-only vCenter inventory, hosts, alarms, events.
|
|
72
74
|
- vmware-nsx / vmware-nsx-security: networking and firewall.
|
|
73
75
|
- vmware-storage, vmware-vks, vmware-aria, vmware-avi: their own domains.
|
|
@@ -75,8 +77,9 @@ your agent's instruction block.
|
|
|
75
77
|
|
|
76
78
|
## The dispatch contract
|
|
77
79
|
|
|
78
|
-
-
|
|
79
|
-
|
|
80
|
+
- Read the result: a `pending_dispatch` list means pilot runs without
|
|
81
|
+
`--dispatch` and YOU invoke each listed tool. No `pending_dispatch` means pilot
|
|
82
|
+
ran the steps itself — do not run them again.
|
|
80
83
|
- Never claim a step ran because pilot advanced its state. State advanced
|
|
81
84
|
because you told pilot it did.
|
|
82
85
|
- If you cannot invoke the tool a step names — it is not installed or is
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
|
|
25
25
|
| # | Template | Steps | Approval | Skills Used | Risk |
|
|
26
26
|
|---|----------|-------|----------|-------------|------|
|
|
27
|
-
| 1 | `clone_and_test` |
|
|
27
|
+
| 1 | `clone_and_test` | 7-8 | Yes | aiops, monitor | Medium |
|
|
28
28
|
| 2 | `incident_response` | 4 | Yes | monitor, aiops | Medium |
|
|
29
29
|
| 3 | `plan_and_approve` | 3 | Yes | aiops | High |
|
|
30
30
|
| 4 | `compliance_scan` | 1-3 | No | monitor, aria | Low |
|
|
@@ -56,12 +56,12 @@ numbers matter here, and they are not the same thing:
|
|
|
56
56
|
| Skill | Package | Skill tools | In design catalog | Domain |
|
|
57
57
|
|-------|---------|:-----------:|:-----------------:|--------|
|
|
58
58
|
| vmware-aiops | `vmware-aiops` | 61 | 19 | VM lifecycle, deployment, guest ops, clusters |
|
|
59
|
-
| vmware-monitor | `vmware-monitor` | 33 |
|
|
59
|
+
| vmware-monitor | `vmware-monitor` | 33 | 6 | Read-only inventory, alarms, events |
|
|
60
60
|
| vmware-nsx | `vmware-nsx-mgmt` | 33 | 8 | NSX segments, gateways, NAT, routing, IPAM |
|
|
61
61
|
| vmware-nsx-security | `vmware-nsx-security` | 22 | 7 | DFW policies/rules, security groups, traceflow |
|
|
62
62
|
| vmware-aria | `vmware-aria` | 46 | 7 | Aria Ops metrics, alerts, capacity, anomalies |
|
|
63
|
-
| vmware-vks | `vmware-vks` |
|
|
64
|
-
| vmware-storage | `vmware-storage` |
|
|
63
|
+
| vmware-vks | `vmware-vks` | 25 | 8 | Tanzu Supervisor, Namespaces, TKC clusters |
|
|
64
|
+
| vmware-storage | `vmware-storage` | 16 | 5 | Datastores, per-VM usage, iSCSI, vSAN, FC multipath |
|
|
65
65
|
| vmware-avi | `vmware-avi` | 28 | 13 | AVI load balancing, pool members, AKO K8s ops |
|
|
66
66
|
| vmware-debug | `vmware-debug` | 14 | 5 | Incident correlation, evidence-graded cases |
|
|
67
67
|
| vmware-harden | `vmware-harden` | 8 | 5 | Compliance baselines, violations, drift |
|
|
@@ -69,7 +69,7 @@ numbers matter here, and they are not the same thing:
|
|
|
69
69
|
| vmware-privateai | `vmware-privateai` | 18 | 5 | GPU hosts, vGPU profiles, utilisation |
|
|
70
70
|
| vmware-vdi | `vmware-vdi` | 27 | 9 | Horizon pools, sessions, machines, images |
|
|
71
71
|
|
|
72
|
-
**Totals**:
|
|
72
|
+
**Totals**: 338 tools across the 13 companion skills; the design catalog covers 101 of them
|
|
73
73
|
across all 13. Pilot adds 13 orchestration tools of its own. The counts are checked against
|
|
74
74
|
the companion snapshot by `tests/eval/regression/test_catalog_covers_the_family.py`.
|
|
75
75
|
|
|
@@ -111,7 +111,7 @@ Pause execution for human review before destructive operations. Workflows can ha
|
|
|
111
111
|
A failed step stops the workflow; nothing is reversed until someone calls `rollback`. It undoes, last first, only steps pilot recorded as `success` — on the MCP server (no dispatcher) that is none of the steps the agent performed, so the agent calls each step's `rollback_tool` itself. Best-effort: if one undo fails, the rest still run. Steps without a `rollback_tool` cannot be undone.
|
|
112
112
|
|
|
113
113
|
### Preview first: rollback and cancel_workflow
|
|
114
|
-
Both take `confirm: bool = False`. A bare call returns `{"action": "preview", "blast_radius": ...}` and changes nothing. `blast_radius` names the workflow (id, type, state), `state_after`, and — each as a count plus up to 16 steps — `would_roll_back` / `would_skip` (rollback entries carry each step's `rollback_tool` and `rollback_params`, secrets redacted), `left_in_place` (executed steps that stay applied: cancelling part-way leaves a half-applied change), `not_reversed_by_pilot` (rollback: steps the agent performed from `pending_dispatch`), `unknown_effects` (steps interrupted mid-dispatch), plus `blockers` and `unmeasured`. `confirm=True` refuses when either list is non-empty: a state the transition is not allowed from, a step status Pilot does not recognise, a workflow record that cannot be read, or a step in `unknown_effects` (left `running`/`interrupted` by a Pilot process that stopped mid-dispatch). For the last, the refusal says what to check; after the user has checked in the target system whether each such step took effect, re-run with `acknowledge_unknown_effects=True` (default `False`). That acknowledgement covers only those steps — it lifts no blocker and no other unmeasured item.
|
|
114
|
+
Both take `confirm: bool = False`. A bare call returns `{"action": "preview", "blast_radius": ...}` and changes nothing. `blast_radius` names the workflow (id, type, state), `state_after`, and — each as a count plus up to 16 steps — `would_roll_back` / `would_skip` (rollback entries carry each step's `rollback_tool` and `rollback_params`, secrets redacted), `left_in_place` (executed steps that stay applied: cancelling part-way leaves a half-applied change), `not_reversed_by_pilot` (rollback: steps the agent performed from `pending_dispatch` that have an undo to call), `not_reversible_outside_pilot` (rollback: handed-out steps with no undo — a clone, a production resize; read-only catalog tools left out), `handed_out_to_caller` (cancel: steps already in `pending_dispatch`, which cancel can neither stop nor undo), `unknown_effects` (steps interrupted mid-dispatch), plus `blockers` and `unmeasured`. `confirm=True` refuses when either list is non-empty: a state the transition is not allowed from, a step status Pilot does not recognise, a workflow record that cannot be read, or a step in `unknown_effects` (left `running`/`interrupted` by a Pilot process that stopped mid-dispatch). For the last, the refusal says what to check; after the user has checked in the target system whether each such step took effect, re-run with `acknowledge_unknown_effects=True` (default `False`). That acknowledgement covers only those steps — it lifts no blocker and no other unmeasured item.
|
|
115
115
|
|
|
116
116
|
### Companion tools that preview by default
|
|
117
117
|
Destructive companion tools take `confirm: bool = False` and return `action: preview` on a bare call. Built-in template steps (and their `rollback_params`) pass `confirm=True`, because in every built-in template they come after an `approve` gate (a test enforces it). `rollback_params` with `confirm: True` in any workflow, built-in or custom, run on a `rollback(confirm=True)` call without an approval step of their own: `rollback` is itself gated, and that `confirm=True` is the human decision taken after its preview listed every rollback step's tool and parameters; they no longer pass the deprecated `confirmed` / `dry_run`. A step or rollback whose result is a top-level `action: preview` is recorded `failed` ("step only previewed"), never `success`. `baseline_remediate` adds `confirm=True` to caller-supplied drift items for those tools and refuses items that already carry `confirm`, `confirmed` or `dry_run`.
|
|
@@ -19,12 +19,12 @@ client.
|
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
21
|
# Recommended: installed entry point, never touches the network
|
|
22
|
-
uv tool install vmware-pilot==2.
|
|
22
|
+
uv tool install vmware-pilot==2.4.1
|
|
23
23
|
vmware-pilot mcp
|
|
24
24
|
|
|
25
25
|
# Fallback: uvx re-resolves against PyPI each start and fails behind a
|
|
26
26
|
# TLS-inspecting corporate proxy — set UV_NATIVE_TLS=true if you must use it
|
|
27
|
-
uvx --from vmware-pilot==2.
|
|
27
|
+
uvx --from vmware-pilot==2.4.1 vmware-pilot-mcp
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
The server runs on **stdio** transport and exposes 13 MCP tools (4 read, 9 write).
|
|
@@ -101,7 +101,7 @@ Create a workflow from a built-in or custom template.
|
|
|
101
101
|
```
|
|
102
102
|
create_workflow_from_template(
|
|
103
103
|
workflow_type="clone_and_test",
|
|
104
|
-
params={target_vm: "db01", change_spec: {memory_mb: 32768}}
|
|
104
|
+
params={target_vm: "db01", change_spec: {memory_mb: 32768}, snapshot_name: "pre-change"}
|
|
105
105
|
)
|
|
106
106
|
→ {workflow_id: "wf-...", steps: [...]}
|
|
107
107
|
```
|
|
@@ -165,8 +165,9 @@ rollback(workflow_id="wf-...", confirm=True) # after the user has seen the pre
|
|
|
165
165
|
```
|
|
166
166
|
|
|
167
167
|
`cancel_workflow(workflow_id, reason, confirm=False)` works the same way: the
|
|
168
|
-
preview lists the executed steps that stay applied
|
|
169
|
-
|
|
168
|
+
preview lists the executed steps that stay applied, the steps already handed to
|
|
169
|
+
you in `pending_dispatch` (`handed_out_to_caller` — cancel neither stops nor undoes
|
|
170
|
+
them) and the steps that would be skipped; `confirm=True` cancels.
|
|
170
171
|
|
|
171
172
|
Both refuse `confirm=True` while a step is in `unknown_effects` (left `running`
|
|
172
173
|
or `interrupted` when a Pilot process stopped mid-dispatch). Check in the target
|