vmware-debug 2.0.0__tar.gz → 2.1.0__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_debug-2.0.0 → vmware_debug-2.1.0}/.claude-plugin/plugin.json +1 -1
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/.mcp.json +1 -1
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/PKG-INFO +39 -2
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/README-CN.md +28 -1
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/README.md +37 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/RELEASE_NOTES.md +17 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/openclaw.plugin.json +1 -1
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/package.json +1 -1
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/pyproject.toml +2 -2
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/server.json +2 -2
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/skills/vmware-debug/SKILL.md +1 -1
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/skills/vmware-debug/references/setup-guide.md +27 -2
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/capability/_family.py +9 -7
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/uv.lock +5 -5
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/__init__.py +1 -1
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/cli.py +14 -2
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/mcp_server/server.py +5 -2
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/.clawhubignore +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/.gitignore +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/SECURITY.md +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/docs/plans/2026-08-28-investigation-layer-design.md +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/skills/vmware-debug/references/agent-guardrails.md +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/skills/vmware-debug/references/capabilities.md +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/skills/vmware-debug/references/cli-reference.md +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/skills/vmware-debug/references/event-envelope.md +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/skills/vmware-debug/references/routing.md +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/__init__.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/conftest.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/__init__.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/capability/__init__.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/capability/_scores.json +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/capability/_scoring.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/capability/_skill.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/capability/conftest.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/capability/test_entity_reachability.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/capability/test_error_actionability.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/capability/test_tool_description_quality.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/capability/test_tool_manifest_budget.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/__init__.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/_vsphere_event_vocabulary.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_audit_isolation.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_capability_grader.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_case_id_non_ascii.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_case_plan_max_steps.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_classification_against_vsphere_vocabulary.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_debug_regressions.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_environment_resolver_isolation.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_every_tool_parameter_is_documented.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_evidence_payload_contract.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_host_lifecycle_classification.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_investigation_metrics.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_real_alert_titles_classify.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_result_envelope.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_skill_name_aliases.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_spike_resolution.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_tool_annotations.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/test_case_conclusion.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/test_case_evidence.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/test_case_grading.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/test_case_grading_per_hypothesis.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/test_case_hypotheses.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/test_case_ids.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/test_case_ledger_concurrency.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/test_case_plan.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/test_case_readiness.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/test_case_store.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/test_case_timeline_close.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/test_case_tools.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/test_knowledge.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/test_mcp_audit.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/test_safe_error_passthrough.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/test_timeline.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/envelope.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/mcp/__init__.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/mcp/tools.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/mcp_server/__init__.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/ops/__init__.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/ops/cases/__init__.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/ops/cases/api.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/ops/cases/conclusion.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/ops/cases/evidence.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/ops/cases/grading.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/ops/cases/hypotheses.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/ops/cases/ids.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/ops/cases/knowledge.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/ops/cases/model.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/ops/cases/payloads.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/ops/cases/plan.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/ops/cases/readiness.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/ops/cases/sources.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/ops/cases/store.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/ops/cases/timeline.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/ops/skill_names.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/ops/timeline.py +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/rules/evidence_sources.yaml +0 -0
- {vmware_debug-2.0.0 → vmware_debug-2.1.0}/vmware_debug/rules/grading_rules.yaml +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://anthropic.com/claude-code/plugin.schema.json",
|
|
3
3
|
"name": "vmware-debug",
|
|
4
4
|
"displayName": "VMware Debug",
|
|
5
|
-
"version": "2.
|
|
5
|
+
"version": "2.1.0",
|
|
6
6
|
"description": "VMware incident timeline, root-cause routing, local case ledger; no vSphere access. 14 MCP tools.",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "Wei Zhou",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: vmware-debug
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.1.0
|
|
4
4
|
Summary: VMware diagnostic brain — offline incident triage, log/event correlation, and root-cause routing across the VMware skill family
|
|
5
5
|
Project-URL: Homepage, https://github.com/vmware-skills/VMware-Debug
|
|
6
6
|
Project-URL: Repository, https://github.com/vmware-skills/VMware-Debug
|
|
@@ -18,7 +18,7 @@ Requires-Dist: mcp[cli]<2.0,>=1.10
|
|
|
18
18
|
Requires-Dist: pyyaml<7.0,>=6.0
|
|
19
19
|
Requires-Dist: rich<15.0,>=13.0
|
|
20
20
|
Requires-Dist: typer<1.0,>=0.12
|
|
21
|
-
Requires-Dist: vmware-policy<2.0,>=1.
|
|
21
|
+
Requires-Dist: vmware-policy<2.0,>=1.20.0
|
|
22
22
|
Description-Content-Type: text/markdown
|
|
23
23
|
|
|
24
24
|
<!-- mcp-name: io.github.vmware-skills/vmware-debug -->
|
|
@@ -52,6 +52,23 @@ renames widened), and vmware-pilot ≥ 1.13 translates old names in saved workfl
|
|
|
52
52
|
If an install older than 2.0 shares that `rules.yaml`, give it vmware-policy ≥ 1.18.2 too: it matches each rule
|
|
53
53
|
against both the old and the new name, so one file serves both.
|
|
54
54
|
|
|
55
|
+
## Companion Skills
|
|
56
|
+
|
|
57
|
+
| Need | Skill |
|
|
58
|
+
|---|---|
|
|
59
|
+
| Incident correlation / root cause | **vmware-debug** (this project) |
|
|
60
|
+
| Centralized log search | vmware-log-insight (feed its `search_logs` results here) |
|
|
61
|
+
| vCenter events and alarms | vmware-monitor |
|
|
62
|
+
| Metrics / anomalies | vmware-aria |
|
|
63
|
+
| Executing a fix | vmware-aiops (single op) / vmware-pilot (multi-step, gated) |
|
|
64
|
+
|
|
65
|
+
## Install
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
uv tool install vmware-debug
|
|
69
|
+
vmware-debug categories # see which symptom categories it can diagnose
|
|
70
|
+
```
|
|
71
|
+
|
|
55
72
|
## MCP tools (14 — 7 read, 7 write)
|
|
56
73
|
|
|
57
74
|
The seven writes go to the local case ledger only; none reaches a VMware system.
|
|
@@ -80,6 +97,26 @@ The seven writes go to the local case ledger only; none reaches a VMware system.
|
|
|
80
97
|
| `grade_case` | [WRITE] Recompute the conclusion grade from the ledger and record it |
|
|
81
98
|
| `close_case` | [WRITE] Record the final grade, archive, and name what was left open |
|
|
82
99
|
|
|
100
|
+
**Event envelope**: `{ts, source, severity, entity, text, fields}`. The agent normalizes events from each source
|
|
101
|
+
into this shape before handing them to debug, so debug has zero runtime dependency on the other packages.
|
|
102
|
+
**Keep each event's `event_type` in `fields`** — the classifier matches it as well as the text, and most modern
|
|
103
|
+
vSphere events are `EventEx`: the text is a generic boilerplate sentence, and only `eventTypeId` says what the
|
|
104
|
+
event actually is.
|
|
105
|
+
|
|
106
|
+
## Security
|
|
107
|
+
|
|
108
|
+
Offline and credential-free by construction: it connects to no vCenter/NSX/Aria, has no destructive surface on
|
|
109
|
+
VMware, and holds no secret to leak. The only writes are the local case ledger: evidence, gaps, hypotheses and
|
|
110
|
+
grade history are append-only; `timeline.md` is regenerated from the evidence, and `case.json` holds the current
|
|
111
|
+
grade and status. The same holds with several writers: every write to a case first takes that case's lock file
|
|
112
|
+
(`.ledger.lock`, exclusive create), so two processes writing the same case in a shared `$OPS_HOME` are serialized
|
|
113
|
+
instead of dropping each other's entries; every file is written under a temporary name and then moved into place,
|
|
114
|
+
so a reader never sees a half-written file (on a file system without hard links, a new evidence file is instead
|
|
115
|
+
created in place: still never overwritten, but it can be read half-written). A lock left behind by a crashed
|
|
116
|
+
process is reported together with its holder and never deleted automatically; delete it by hand once you have
|
|
117
|
+
confirmed no process is writing that case. Released versions 1.11.3 and earlier do not take this lock, so every
|
|
118
|
+
machine sharing a case directory must upgrade. See [SECURITY.md](SECURITY.md).
|
|
119
|
+
|
|
83
120
|
## Offline / Air-Gapped Install (from source)
|
|
84
121
|
|
|
85
122
|
This project uses the modern PEP 517 build system (hatchling), so there is **no
|
|
@@ -10,6 +10,8 @@ VMware skill 家族的**诊断大脑**。你给出症状(报错、日志、变
|
|
|
10
10
|
它**从不触碰 vSphere**——不连接任何东西,也从不执行修复;唯一的写入是 `$OPS_HOME` 下的本地案卷。修复一律路由给 vmware-aiops(单步)或
|
|
11
11
|
vmware-pilot(多步、带审批门控),完全复刻 vmware-harden → vmware-pilot 的「顾问/执行」分工。
|
|
12
12
|
|
|
13
|
+
完整的方法论、事件信封约定和症状路由见 [`skills/vmware-debug/SKILL.md`](skills/vmware-debug/SKILL.md)。
|
|
14
|
+
|
|
13
15
|
## 升级到 2.0
|
|
14
16
|
|
|
15
17
|
2.0 把 14 个 MCP 工具中的 13 个改成动词在前(例如 `case_close` → `close_case`, `case_get` → `get_case`, `case_grade` → `grade_case`),完整的新旧名对照表见
|
|
@@ -42,7 +44,7 @@ vmware-debug categories # 看它能诊断哪些症状类别
|
|
|
42
44
|
**关联**——无状态,看一眼用:
|
|
43
45
|
|
|
44
46
|
- `build_incident_timeline`:[READ] 把已取到的事件关联成 时间线 + 突刺 + 排序后的根因假设 + 下一步检查建议
|
|
45
|
-
- `list_symptom_categories`:[READ]
|
|
47
|
+
- `list_symptom_categories`:[READ] 列出能识别的症状类别 + 每类该查什么
|
|
46
48
|
|
|
47
49
|
**调查案卷**——需要持续推理的事件:
|
|
48
50
|
|
|
@@ -75,6 +77,31 @@ debug;debug 因此与其它包零运行时依赖。**请把每条事件的 `ev
|
|
|
75
77
|
确认没有进程在写该案卷后再手动删除。已发布的 1.11.3 及更早版本不拿这个锁,共享案卷目录的每台机器都要升级。
|
|
76
78
|
详见 [SECURITY.md](SECURITY.md)。
|
|
77
79
|
|
|
80
|
+
## 离线 / 隔离网络安装(从源码)
|
|
81
|
+
|
|
82
|
+
本项目使用现代 PEP 517 构建系统(hatchling),所以**按设计就没有 `setup.py`**——这是预期行为,不是缺文件。
|
|
83
|
+
如果你克隆了源码后遇到 `ERROR: File "setup.py" or "setup.cfg" not found ... editable mode
|
|
84
|
+
currently requires a setuptools-based build`,说明你的 `pip` 低于 21.3,无法对非 setuptools 后端做*可编辑*(`-e`)安装。
|
|
85
|
+
可编辑模式只是开发便利,运行这个工具并不需要——任选其一:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# 在源码目录里——普通(非可编辑)安装会构建 wheel:
|
|
89
|
+
pip install . # 不是 pip install -e .
|
|
90
|
+
|
|
91
|
+
# ……或者先升级 pip,可编辑安装也能用:
|
|
92
|
+
pip install --upgrade pip && pip install -e .
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
对于**真正隔离网络的主机**,在联网机器上构建 wheel 再拷过去——目标主机就不需要网络:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
# 在联网机器上,把本包及其依赖收集成 wheel:
|
|
99
|
+
pip wheel . -w dist # → dist/*.whl (或:uv build,只构建本包)
|
|
100
|
+
|
|
101
|
+
# 把 dist/ 拷到隔离主机,然后离线安装:
|
|
102
|
+
pip install --no-index --find-links dist vmware-debug
|
|
103
|
+
```
|
|
104
|
+
|
|
78
105
|
## 许可证
|
|
79
106
|
|
|
80
107
|
MIT。
|
|
@@ -29,6 +29,23 @@ renames widened), and vmware-pilot ≥ 1.13 translates old names in saved workfl
|
|
|
29
29
|
If an install older than 2.0 shares that `rules.yaml`, give it vmware-policy ≥ 1.18.2 too: it matches each rule
|
|
30
30
|
against both the old and the new name, so one file serves both.
|
|
31
31
|
|
|
32
|
+
## Companion Skills
|
|
33
|
+
|
|
34
|
+
| Need | Skill |
|
|
35
|
+
|---|---|
|
|
36
|
+
| Incident correlation / root cause | **vmware-debug** (this project) |
|
|
37
|
+
| Centralized log search | vmware-log-insight (feed its `search_logs` results here) |
|
|
38
|
+
| vCenter events and alarms | vmware-monitor |
|
|
39
|
+
| Metrics / anomalies | vmware-aria |
|
|
40
|
+
| Executing a fix | vmware-aiops (single op) / vmware-pilot (multi-step, gated) |
|
|
41
|
+
|
|
42
|
+
## Install
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
uv tool install vmware-debug
|
|
46
|
+
vmware-debug categories # see which symptom categories it can diagnose
|
|
47
|
+
```
|
|
48
|
+
|
|
32
49
|
## MCP tools (14 — 7 read, 7 write)
|
|
33
50
|
|
|
34
51
|
The seven writes go to the local case ledger only; none reaches a VMware system.
|
|
@@ -57,6 +74,26 @@ The seven writes go to the local case ledger only; none reaches a VMware system.
|
|
|
57
74
|
| `grade_case` | [WRITE] Recompute the conclusion grade from the ledger and record it |
|
|
58
75
|
| `close_case` | [WRITE] Record the final grade, archive, and name what was left open |
|
|
59
76
|
|
|
77
|
+
**Event envelope**: `{ts, source, severity, entity, text, fields}`. The agent normalizes events from each source
|
|
78
|
+
into this shape before handing them to debug, so debug has zero runtime dependency on the other packages.
|
|
79
|
+
**Keep each event's `event_type` in `fields`** — the classifier matches it as well as the text, and most modern
|
|
80
|
+
vSphere events are `EventEx`: the text is a generic boilerplate sentence, and only `eventTypeId` says what the
|
|
81
|
+
event actually is.
|
|
82
|
+
|
|
83
|
+
## Security
|
|
84
|
+
|
|
85
|
+
Offline and credential-free by construction: it connects to no vCenter/NSX/Aria, has no destructive surface on
|
|
86
|
+
VMware, and holds no secret to leak. The only writes are the local case ledger: evidence, gaps, hypotheses and
|
|
87
|
+
grade history are append-only; `timeline.md` is regenerated from the evidence, and `case.json` holds the current
|
|
88
|
+
grade and status. The same holds with several writers: every write to a case first takes that case's lock file
|
|
89
|
+
(`.ledger.lock`, exclusive create), so two processes writing the same case in a shared `$OPS_HOME` are serialized
|
|
90
|
+
instead of dropping each other's entries; every file is written under a temporary name and then moved into place,
|
|
91
|
+
so a reader never sees a half-written file (on a file system without hard links, a new evidence file is instead
|
|
92
|
+
created in place: still never overwritten, but it can be read half-written). A lock left behind by a crashed
|
|
93
|
+
process is reported together with its holder and never deleted automatically; delete it by hand once you have
|
|
94
|
+
confirmed no process is writing that case. Released versions 1.11.3 and earlier do not take this lock, so every
|
|
95
|
+
machine sharing a case directory must upgrade. See [SECURITY.md](SECURITY.md).
|
|
96
|
+
|
|
60
97
|
## Offline / Air-Gapped Install (from source)
|
|
61
98
|
|
|
62
99
|
This project uses the modern PEP 517 build system (hatchling), so there is **no
|
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
## v2.1.0 — offer only read tools, plus chosen write tools
|
|
2
|
+
|
|
3
|
+
`vmware-debug mcp` can now offer a subset of this server's tools (HLD §17 D-16, via vmware-policy 1.20.0):
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
vmware-debug mcp --expose read --allow-write close_case
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
* `--expose read` (or `VMWARE_DEBUG_MCP_EXPOSE=read`) keeps only tools annotated `readOnlyHint: true`; `--allow-write a,b`
|
|
10
|
+
(or `VMWARE_DEBUG_MCP_ALLOW_WRITE`) keeps chosen write tools on top. The default is unchanged: every tool.
|
|
11
|
+
* A bad value, or a name that is not a write tool of this server, stops the server before it serves (exit 2).
|
|
12
|
+
Flags and environment variables are not mixed; a blank flag counts as not given. Pre-2.0 names are accepted.
|
|
13
|
+
* This limits what clients are offered; it is not authorization. See "Limiting which tools are offered" in
|
|
14
|
+
`references/setup-guide.md`, which also notes that an agent with a shell can bypass MCP, so the account itself
|
|
15
|
+
must be least-privilege.
|
|
16
|
+
* Requires `vmware-policy>=1.20.0`.
|
|
17
|
+
|
|
1
18
|
## v2.0.0 — MCP tools renamed verb-first
|
|
2
19
|
|
|
3
20
|
Every MCP tool in the VMware skill family now follows one naming convention: the verb comes first
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "vmware-debug"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.1.0"
|
|
8
8
|
description = "VMware diagnostic brain — offline incident triage, log/event correlation, and root-cause routing across the VMware skill family"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -21,7 +21,7 @@ dependencies = [
|
|
|
21
21
|
"typer>=0.12,<1.0",
|
|
22
22
|
"rich>=13.0,<15.0",
|
|
23
23
|
"mcp[cli]>=1.10,<2.0",
|
|
24
|
-
"vmware-policy>=1.
|
|
24
|
+
"vmware-policy>=1.20.0,<2.0",
|
|
25
25
|
# Imported directly by ops/cases/grading.py for the rules file. It has
|
|
26
26
|
# always arrived transitively via vmware-policy; a package should
|
|
27
27
|
# declare what it imports rather than rely on a dependency's dependency.
|
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
"url": "https://github.com/vmware-skills/VMware-Debug",
|
|
8
8
|
"source": "github"
|
|
9
9
|
},
|
|
10
|
-
"version": "2.
|
|
10
|
+
"version": "2.1.0",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "pypi",
|
|
14
14
|
"identifier": "vmware-debug",
|
|
15
|
-
"version": "2.
|
|
15
|
+
"version": "2.1.0",
|
|
16
16
|
"runtimeHint": "uvx",
|
|
17
17
|
"packageArguments": [
|
|
18
18
|
{
|
|
@@ -6,7 +6,7 @@ is a pure, offline correlation engine. There is no `config.yaml` and no `.env`.
|
|
|
6
6
|
## Install
|
|
7
7
|
|
|
8
8
|
```bash
|
|
9
|
-
uv tool install vmware-debug==2.
|
|
9
|
+
uv tool install vmware-debug==2.1.0
|
|
10
10
|
vmware-debug categories # verify it runs
|
|
11
11
|
```
|
|
12
12
|
|
|
@@ -15,7 +15,7 @@ vmware-debug categories # verify it runs
|
|
|
15
15
|
```json
|
|
16
16
|
{
|
|
17
17
|
"command": "uvx",
|
|
18
|
-
"args": ["--from", "vmware-debug==2.
|
|
18
|
+
"args": ["--from", "vmware-debug==2.1.0", "vmware-debug-mcp"]
|
|
19
19
|
}
|
|
20
20
|
```
|
|
21
21
|
|
|
@@ -26,6 +26,31 @@ For full cross-skill diagnosis, also install the data-source skills it correlate
|
|
|
26
26
|
(vmware-monitor, vmware-log-insight, vmware-aria, vmware-nsx) and the executors it
|
|
27
27
|
routes fixes to (vmware-aiops, vmware-pilot).
|
|
28
28
|
|
|
29
|
+
## Limiting which tools are offered
|
|
30
|
+
|
|
31
|
+
By default the MCP server offers every tool. To offer only read tools, start it with `--expose read`, or set
|
|
32
|
+
`VMWARE_DEBUG_MCP_EXPOSE=read` in the MCP client's `env` block (useful when the client launches `vmware-debug mcp` itself). To offer
|
|
33
|
+
chosen write tools as well, add `--allow-write` with a comma-separated list (or `VMWARE_DEBUG_MCP_ALLOW_WRITE`):
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
vmware-debug mcp --expose read --allow-write close_case
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
- A read tool is one annotated `readOnlyHint: true`; every other tool counts as a write.
|
|
40
|
+
- An unknown setting, or a name that is not a write tool of this server, stops the server before it serves (exit
|
|
41
|
+
code 2), so it never offers more than you asked for. Pre-2.0 tool names are accepted.
|
|
42
|
+
- With `--expose read`, the server prints one line to stderr saying what it exposes.
|
|
43
|
+
- Flags and environment variables are not mixed: if either flag is given, both environment variables are
|
|
44
|
+
ignored, so a leftover `_ALLOW_WRITE` in the shell cannot widen `--expose read`. A blank flag value counts as
|
|
45
|
+
not given.
|
|
46
|
+
- A tool that runs other steps (a plan, workflow or batch tool) carries every write it can execute, including
|
|
47
|
+
writes this setting hides. Expose such a tool only if you would expose those writes too.
|
|
48
|
+
- A launcher that imports the server object can call
|
|
49
|
+
`vmware_policy.exposure.restrict_tools(mcp, skill="debug", expose="read", allow_write=[...])` before running it,
|
|
50
|
+
instead of editing the SDK's tool registry.
|
|
51
|
+
- This limits what clients are offered. It is **not** authorization. This server's write tools change case records on this machine;
|
|
52
|
+
deny rules in `~/.vmware/rules.yaml` still apply to every exposed tool.
|
|
53
|
+
|
|
29
54
|
## Security
|
|
30
55
|
|
|
31
56
|
> **Disclaimer**: Community-maintained open-source project, **not affiliated with,
|
|
@@ -104,9 +104,10 @@ FAMILY_TOOLS: dict[str, frozenset[str]] = {
|
|
|
104
104
|
'update_dfw_policy', 'update_dfw_rule',
|
|
105
105
|
}),
|
|
106
106
|
'vmware-pilot': frozenset({
|
|
107
|
-
'approve', 'cancel_workflow', 'confirm_draft', 'create_workflow',
|
|
108
|
-
'
|
|
109
|
-
'
|
|
107
|
+
'approve', 'cancel_workflow', 'confirm_draft', 'create_workflow',
|
|
108
|
+
'create_workflow_from_template', 'design_workflow', 'get_skill_catalog',
|
|
109
|
+
'get_workflow_status', 'list_workflows', 'review_workflow', 'rollback',
|
|
110
|
+
'run_workflow', 'update_draft',
|
|
110
111
|
}),
|
|
111
112
|
'vmware-storage': frozenset({
|
|
112
113
|
'add_iscsi_target', 'browse_datastore', 'enable_iscsi', 'get_iscsi_status',
|
|
@@ -118,10 +119,11 @@ FAMILY_TOOLS: dict[str, frozenset[str]] = {
|
|
|
118
119
|
'vmware-vks': frozenset({
|
|
119
120
|
'check_vks_compatibility', 'create_namespace', 'create_tkc_cluster',
|
|
120
121
|
'delete_namespace', 'delete_tkc_cluster', 'get_harbor_info', 'get_namespace',
|
|
121
|
-
'
|
|
122
|
-
'
|
|
123
|
-
'
|
|
124
|
-
'
|
|
122
|
+
'get_supervisor_status', 'get_tkc_available_versions', 'get_tkc_cluster',
|
|
123
|
+
'issue_supervisor_kubeconfig', 'issue_tkc_kubeconfig',
|
|
124
|
+
'list_namespace_storage_usage', 'list_namespaces',
|
|
125
|
+
'list_supervisor_storage_policies', 'list_tkc_clusters', 'list_vm_classes',
|
|
126
|
+
'list_vm_service_groups', 'list_vm_service_network_interfaces',
|
|
125
127
|
'list_vm_service_snapshots', 'scale_tkc_cluster', 'update_namespace',
|
|
126
128
|
'upgrade_tkc_cluster',
|
|
127
129
|
}),
|
|
@@ -1293,7 +1293,7 @@ wheels = [
|
|
|
1293
1293
|
|
|
1294
1294
|
[[package]]
|
|
1295
1295
|
name = "vmware-debug"
|
|
1296
|
-
version = "2.
|
|
1296
|
+
version = "2.1.0"
|
|
1297
1297
|
source = { editable = "." }
|
|
1298
1298
|
dependencies = [
|
|
1299
1299
|
{ name = "mcp", extra = ["cli"] },
|
|
@@ -1316,7 +1316,7 @@ requires-dist = [
|
|
|
1316
1316
|
{ name = "pyyaml", specifier = ">=6.0,<7.0" },
|
|
1317
1317
|
{ name = "rich", specifier = ">=13.0,<15.0" },
|
|
1318
1318
|
{ name = "typer", specifier = ">=0.12,<1.0" },
|
|
1319
|
-
{ name = "vmware-policy", specifier = ">=1.
|
|
1319
|
+
{ name = "vmware-policy", specifier = ">=1.20.0,<2.0" },
|
|
1320
1320
|
]
|
|
1321
1321
|
|
|
1322
1322
|
[package.metadata.requires-dev]
|
|
@@ -1328,14 +1328,14 @@ dev = [
|
|
|
1328
1328
|
|
|
1329
1329
|
[[package]]
|
|
1330
1330
|
name = "vmware-policy"
|
|
1331
|
-
version = "1.
|
|
1331
|
+
version = "1.20.0"
|
|
1332
1332
|
source = { registry = "https://pypi.org/simple" }
|
|
1333
1333
|
dependencies = [
|
|
1334
1334
|
{ name = "pyyaml" },
|
|
1335
1335
|
{ name = "rich" },
|
|
1336
1336
|
{ name = "typer" },
|
|
1337
1337
|
]
|
|
1338
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1338
|
+
sdist = { url = "https://files.pythonhosted.org/packages/66/f3/cae0e18d269bd4764d5f9b34a838174e9668f931e44d41effab620aeecf4/vmware_policy-1.20.0.tar.gz", hash = "sha256:eb9875d3e94435a18d1dd6cf2c71905c46e2e812808556db3fb741ef322bee99", size = 220048, upload-time = "2026-10-15T06:33:35.174Z" }
|
|
1339
1339
|
wheels = [
|
|
1340
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1340
|
+
{ url = "https://files.pythonhosted.org/packages/b2/cf/6c87f6b5439407c1c3b83b84a5ef53def7544b687efd6f16a6cb187acf78/vmware_policy-1.20.0-py3-none-any.whl", hash = "sha256:cea9451c70be96e3d7adc420a2ac001cf431c29b61350dd58c3771378058737a", size = 86684, upload-time = "2026-10-15T06:33:33.413Z" },
|
|
1341
1341
|
]
|
|
@@ -104,11 +104,23 @@ def triage(
|
|
|
104
104
|
|
|
105
105
|
@app.command()
|
|
106
106
|
@cli_local("starts the MCP server; its tools audit themselves")
|
|
107
|
-
def mcp(
|
|
107
|
+
def mcp(
|
|
108
|
+
expose: Optional[str] = typer.Option(
|
|
109
|
+
None,
|
|
110
|
+
"--expose",
|
|
111
|
+
help="Which tools to offer: all (default) or read. Limits what clients see; "
|
|
112
|
+
"not authorization: the account's permissions still decide.",
|
|
113
|
+
),
|
|
114
|
+
allow_write: Optional[str] = typer.Option(
|
|
115
|
+
None,
|
|
116
|
+
"--allow-write",
|
|
117
|
+
help="With --expose read: comma-separated write tools to offer as well.",
|
|
118
|
+
),
|
|
119
|
+
) -> None:
|
|
108
120
|
"""Start the stdio MCP server (no network access; proxy-safe)."""
|
|
109
121
|
from vmware_debug.mcp_server.server import main as _main
|
|
110
122
|
|
|
111
|
-
_main()
|
|
123
|
+
_main(expose=expose, allow_write=allow_write)
|
|
112
124
|
|
|
113
125
|
|
|
114
126
|
if __name__ == "__main__":
|
|
@@ -862,7 +862,7 @@ def build_server() -> FastMCP:
|
|
|
862
862
|
|
|
863
863
|
|
|
864
864
|
return server
|
|
865
|
-
def main() -> None:
|
|
865
|
+
def main(expose: Optional[str] = None, allow_write: Optional[str] = None) -> None:
|
|
866
866
|
"""Entry point for `vmware-debug-mcp` (stdio transport)."""
|
|
867
867
|
# Floor is 3.10, matching `requires-python` and the other eleven skills.
|
|
868
868
|
# This guard used to demand 3.11 on the grounds that FastMCP schema
|
|
@@ -878,7 +878,10 @@ def main() -> None:
|
|
|
878
878
|
"Reinstall on a newer interpreter: "
|
|
879
879
|
"uv tool install --python 3.12 --force vmware-debug"
|
|
880
880
|
)
|
|
881
|
-
|
|
881
|
+
from vmware_policy.exposure import apply_or_exit
|
|
882
|
+
server = build_server()
|
|
883
|
+
apply_or_exit(server, skill="debug", expose=expose, allow_write=allow_write)
|
|
884
|
+
server.run()
|
|
882
885
|
|
|
883
886
|
|
|
884
887
|
if __name__ == "__main__":
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vmware_debug-2.0.0 → vmware_debug-2.1.0}/docs/plans/2026-08-28-investigation-layer-design.md
RENAMED
|
File without changes
|
{vmware_debug-2.0.0 → vmware_debug-2.1.0}/skills/vmware-debug/references/agent-guardrails.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/capability/test_tool_description_quality.py
RENAMED
|
File without changes
|
{vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/capability/test_tool_manifest_budget.py
RENAMED
|
File without changes
|
|
File without changes
|
{vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/_vsphere_event_vocabulary.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_evidence_payload_contract.py
RENAMED
|
File without changes
|
|
File without changes
|
{vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_investigation_metrics.py
RENAMED
|
File without changes
|
{vmware_debug-2.0.0 → vmware_debug-2.1.0}/tests/eval/regression/test_real_alert_titles_classify.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|