vmware-debug 1.8.4__tar.gz → 1.8.7__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 (49) hide show
  1. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/PKG-INFO +27 -40
  2. vmware_debug-1.8.7/README-CN.md +45 -0
  3. vmware_debug-1.8.7/README.md +62 -0
  4. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/RELEASE_NOTES.md +119 -0
  5. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/pyproject.toml +2 -2
  6. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/server.json +2 -2
  7. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/skills/vmware-debug/SKILL.md +6 -12
  8. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/skills/vmware-debug/references/agent-guardrails.md +1 -38
  9. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/skills/vmware-debug/references/capabilities.md +0 -5
  10. vmware_debug-1.8.7/skills/vmware-debug/references/setup-guide.md +49 -0
  11. vmware_debug-1.8.7/tests/eval/capability/_family.py +204 -0
  12. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/tests/eval/capability/_scores.json +15 -17
  13. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/tests/eval/capability/_scoring.py +26 -2
  14. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/tests/eval/capability/conftest.py +6 -23
  15. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/tests/eval/capability/test_entity_reachability.py +6 -36
  16. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/tests/eval/capability/test_error_actionability.py +132 -28
  17. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/tests/eval/capability/test_tool_manifest_budget.py +3 -42
  18. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/tests/eval/regression/test_capability_grader.py +136 -0
  19. vmware_debug-1.8.7/tests/eval/regression/test_tool_annotations.py +42 -0
  20. vmware_debug-1.8.7/tests/test_safe_error_passthrough.py +193 -0
  21. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/uv.lock +5 -5
  22. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/vmware_debug/__init__.py +1 -1
  23. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/vmware_debug/envelope.py +64 -10
  24. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/vmware_debug/mcp_server/server.py +2 -19
  25. vmware_debug-1.8.4/README-CN.md +0 -79
  26. vmware_debug-1.8.4/README.md +0 -75
  27. vmware_debug-1.8.4/skills/vmware-debug/references/setup-guide.md +0 -90
  28. vmware_debug-1.8.4/tests/eval/regression/test_read_only_mode.py +0 -158
  29. vmware_debug-1.8.4/tests/test_safe_error_passthrough.py +0 -84
  30. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/.gitignore +0 -0
  31. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/SECURITY.md +0 -0
  32. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/skills/vmware-debug/references/cli-reference.md +0 -0
  33. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/skills/vmware-debug/references/event-envelope.md +0 -0
  34. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/skills/vmware-debug/references/routing.md +0 -0
  35. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/tests/eval/__init__.py +0 -0
  36. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/tests/eval/capability/__init__.py +0 -0
  37. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/tests/eval/capability/_skill.py +0 -0
  38. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/tests/eval/capability/test_tool_description_quality.py +0 -0
  39. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/tests/eval/regression/__init__.py +0 -0
  40. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/tests/eval/regression/test_debug_regressions.py +0 -0
  41. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/tests/eval/regression/test_declared_environment.py +0 -0
  42. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/tests/eval/regression/test_result_envelope.py +0 -0
  43. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/tests/test_timeline.py +0 -0
  44. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/vmware_debug/cli.py +0 -0
  45. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/vmware_debug/mcp/__init__.py +0 -0
  46. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/vmware_debug/mcp/tools.py +0 -0
  47. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/vmware_debug/mcp_server/__init__.py +0 -0
  48. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/vmware_debug/ops/__init__.py +0 -0
  49. {vmware_debug-1.8.4 → vmware_debug-1.8.7}/vmware_debug/ops/timeline.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vmware-debug
3
- Version: 1.8.4
3
+ Version: 1.8.7
4
4
  Summary: VMware diagnostic brain — read-only incident triage, log/event correlation, and root-cause routing across the VMware skill family
5
5
  Author-email: Wei Zhou <wei-wz.zhou@broadcom.com>
6
6
  License-Expression: MIT
@@ -13,7 +13,7 @@ Requires-Python: >=3.10
13
13
  Requires-Dist: mcp[cli]<2.0,>=1.10
14
14
  Requires-Dist: rich<15.0,>=13.0
15
15
  Requires-Dist: typer<1.0,>=0.12
16
- Requires-Dist: vmware-policy<2.0,>=1.8.4
16
+ Requires-Dist: vmware-policy<2.0,>=1.8.5
17
17
  Description-Content-Type: text/markdown
18
18
 
19
19
  <!-- mcp-name: io.github.zw008/vmware-debug -->
@@ -40,8 +40,6 @@ advisor/executor split.
40
40
  See [`skills/vmware-debug/SKILL.md`](skills/vmware-debug/SKILL.md) for the full
41
41
  methodology, the event-envelope contract, and symptom routing.
42
42
 
43
- - **Read-only by design — and provable** (v1.8.0): both MCP tools are read, none write; set `VMWARE_READ_ONLY=true` (or the per-skill `VMWARE_DEBUG_READ_ONLY`) and the family read-only gate verifies that at startup instead of taking the docs' word for it — env vars are the only switch here, this skill has no config file. See [Read-Only Mode](#read-only-mode).
44
-
45
43
  ## MCP tools
46
44
 
47
45
  | Tool | What |
@@ -49,44 +47,33 @@ methodology, the event-envelope contract, and symptom routing.
49
47
  | `incident_timeline` | [READ] Correlate pre-fetched events → timeline + spikes + ranked hypotheses + next-check ideas |
50
48
  | `list_symptom_categories` | [READ] List recognised symptom categories + what to check for each |
51
49
 
52
- ## Read-Only Mode
53
-
54
- vmware-debug is read-only by design — both MCP tools carry the `[READ]` marker, take no
55
- credentials, and make no network calls at all; they only correlate event dicts the
56
- calling agent has already fetched with the other skills' read tools. Since v1.8.0 that
57
- is **provable rather than merely documented**: set `VMWARE_READ_ONLY=true` and the
58
- family read-only gate enumerates the registry at startup and verifies that zero write
59
- tools are exposed — structural, not a prompt instruction a model can ignore. **Off by
60
- default.** Fail-closed: if the mode is requested but cannot be guaranteed, the server
61
- refuses to start rather than running open.
62
-
63
- The same variable is family-wide: one env var also strips every write tool from the
64
- write-capable siblings (aiops, storage, vks, nsx, ...), so a whole-estate read-only
65
- posture is a single setting.
66
-
67
- ```json
68
- {
69
- "mcpServers": {
70
- "vmware-debug": {
71
- "command": "vmware-debug",
72
- "args": ["mcp"],
73
- "env": {
74
- "VMWARE_READ_ONLY": "true"
75
- }
76
- }
77
- }
78
- }
50
+ ## Offline / Air-Gapped Install (from source)
51
+
52
+ This project uses the modern PEP 517 build system (hatchling), so there is **no
53
+ `setup.py`** by design — that is expected, not a missing file. If you cloned the
54
+ source and hit `ERROR: File "setup.py" or "setup.cfg" not found ... editable mode
55
+ currently requires a setuptools-based build`, your `pip` is older than 21.3 and
56
+ cannot do an *editable* (`-e`) install with a non-setuptools backend. Editable
57
+ mode is a developer convenience, not needed to run the tool — do one of:
58
+
59
+ ```bash
60
+ # From the source tree — a normal (non-editable) install builds a wheel:
61
+ pip install . # NOT pip install -e .
62
+
63
+ # ...or upgrade pip first, and editable works too:
64
+ pip install --upgrade pip && pip install -e .
79
65
  ```
80
66
 
81
- - **Per-skill override**: `VMWARE_DEBUG_READ_ONLY` beats the family-wide
82
- `VMWARE_READ_ONLY`. vmware-debug has no `config.yaml`, so the env vars are the only
83
- switch. Precedence: per-skill env → family env → off.
84
- - **Classification**: this skill registers its tools through a `build_server()` factory,
85
- so the gate classifies from the `[READ]`/`[WRITE]` docstring marker rather than from
86
- MCP annotations. Anything not provably read-only is treated as a write.
87
- - **Startup log**: nothing is logged as withheld because nothing is — the gate's empty
88
- result *is* the assertion (write-capable siblings log
89
- `Read-only mode active ... withheld N write tool(s)` instead).
67
+ For a **truly air-gapped host**, build the wheels on a connected machine and copy
68
+ them over — the target then needs no network:
69
+
70
+ ```bash
71
+ # On a connected machine, collect this package + its dependencies as wheels:
72
+ pip wheel . -w dist # → dist/*.whl (or: uv build, for just this package)
73
+
74
+ # Copy dist/ to the air-gapped host, then install offline:
75
+ pip install --no-index --find-links dist vmware-debug
76
+ ```
90
77
 
91
78
  ## License
92
79
 
@@ -0,0 +1,45 @@
1
+ <!-- mcp-name: io.github.zw008/vmware-debug -->
2
+
3
+ # VMware Debug(中文)
4
+
5
+ > **声明**:本项目为社区维护的开源项目,**与 VMware, Inc. 或 Broadcom Inc. 无任何隶属、
6
+ > 背书或赞助关系。** "VMware"、"vSphere" 为 Broadcom 商标。源码以 MIT 许可证公开可审计。
7
+
8
+ VMware skill 家族的**诊断大脑**。你给出症状(报错、日志、变慢的 VM),它来跑系统化排查:
9
+ 把其它 skill 取到的事件关联成一条时间线、检测突刺、给根因假设排序,并告诉你下一步该查什么。
10
+ **只读**——从不修改任何东西,也从不执行修复。修复一律路由给 vmware-aiops(单步)或
11
+ vmware-pilot(多步、带审批门控),完全复刻 vmware-harden → vmware-pilot 的「顾问/执行」分工。
12
+
13
+ ## 配套 Skill
14
+
15
+ | 需求 | Skill |
16
+ |---|---|
17
+ | 故障关联 / 根因 | **vmware-debug**(本项目) |
18
+ | 集中日志检索 | vmware-log-insight(把 `log_search` 结果喂给它) |
19
+ | vCenter 事件与告警 | vmware-monitor |
20
+ | 指标 / 异常 | vmware-aria |
21
+ | 执行修复 | vmware-aiops(单步)/ vmware-pilot(多步门控) |
22
+
23
+ ## 安装
24
+
25
+ ```bash
26
+ uv tool install vmware-debug
27
+ vmware-debug categories # 看它能诊断哪些症状类别
28
+ ```
29
+
30
+ ## MCP 工具(2 个,全只读)
31
+
32
+ - `incident_timeline`:把已取到的事件关联成 时间线 + 突刺 + 排序后的根因假设 + 下一步检查建议
33
+ - `list_symptom_categories`:症状类别及对应的排查路由(不知道查什么时用它)
34
+
35
+ **事件信封**:`{ts, source, severity, entity, text, fields}`。agent 把各源事件归一成此形状再交给
36
+ debug;debug 因此与其它包零运行时依赖。
37
+
38
+ ## 安全
39
+
40
+ 结构上只读、离线、无凭据:不连任何 vCenter/NSX/Aria,没有可破坏面,也没有秘密可泄露。
41
+ 详见 [SECURITY.md](SECURITY.md)。
42
+
43
+ ## 许可证
44
+
45
+ MIT。
@@ -0,0 +1,62 @@
1
+ <!-- mcp-name: io.github.zw008/vmware-debug -->
2
+
3
+ # VMware Debug
4
+
5
+ > ⚠️ **Work in progress** — the core (event correlation engine, MCP tools, CLI)
6
+ > is built and tested; README, `server.json`, full reference docs, and packaging
7
+ > polish are still landing. Not yet published to PyPI.
8
+
9
+ > **Disclaimer**: Community-maintained open-source project, **not affiliated with,
10
+ > endorsed by, or sponsored by VMware, Inc. or Broadcom Inc.** "VMware" and
11
+ > "vSphere" are trademarks of Broadcom. Source is publicly auditable under the MIT
12
+ > license.
13
+
14
+ The diagnostic brain of the VMware skill family. You bring the symptom (an error,
15
+ a log dump, a slow VM); this skill runs a systematic investigation, correlates
16
+ events from the other skills into one timeline, ranks root-cause hypotheses, and
17
+ tells you what to check next. It is **read-only** — it never changes anything and
18
+ never executes fixes. Remediation is routed to `vmware-aiops` (single op) or
19
+ `vmware-pilot` (multi-step, gated), mirroring the `vmware-harden → vmware-pilot`
20
+ advisor/executor split.
21
+
22
+ See [`skills/vmware-debug/SKILL.md`](skills/vmware-debug/SKILL.md) for the full
23
+ methodology, the event-envelope contract, and symptom routing.
24
+
25
+ ## MCP tools
26
+
27
+ | Tool | What |
28
+ |---|---|
29
+ | `incident_timeline` | [READ] Correlate pre-fetched events → timeline + spikes + ranked hypotheses + next-check ideas |
30
+ | `list_symptom_categories` | [READ] List recognised symptom categories + what to check for each |
31
+
32
+ ## Offline / Air-Gapped Install (from source)
33
+
34
+ This project uses the modern PEP 517 build system (hatchling), so there is **no
35
+ `setup.py`** by design — that is expected, not a missing file. If you cloned the
36
+ source and hit `ERROR: File "setup.py" or "setup.cfg" not found ... editable mode
37
+ currently requires a setuptools-based build`, your `pip` is older than 21.3 and
38
+ cannot do an *editable* (`-e`) install with a non-setuptools backend. Editable
39
+ mode is a developer convenience, not needed to run the tool — do one of:
40
+
41
+ ```bash
42
+ # From the source tree — a normal (non-editable) install builds a wheel:
43
+ pip install . # NOT pip install -e .
44
+
45
+ # ...or upgrade pip first, and editable works too:
46
+ pip install --upgrade pip && pip install -e .
47
+ ```
48
+
49
+ For a **truly air-gapped host**, build the wheels on a connected machine and copy
50
+ them over — the target then needs no network:
51
+
52
+ ```bash
53
+ # On a connected machine, collect this package + its dependencies as wheels:
54
+ pip wheel . -w dist # → dist/*.whl (or: uv build, for just this package)
55
+
56
+ # Copy dist/ to the air-gapped host, then install offline:
57
+ pip install --no-index --find-links dist vmware-debug
58
+ ```
59
+
60
+ ## License
61
+
62
+ MIT.
@@ -1,3 +1,122 @@
1
+ ## v1.8.7 (2026-07-21) — the skill-level read-only switch is removed; read/write authorization is the vCenter account's job (RBAC)
2
+
3
+ ### Removed: `VMWARE_READ_ONLY` / `read_only:` — give the agent a read-only service account instead
4
+
5
+ The skill-level read-only switch is gone. It was enforced only on the MCP tool
6
+ registry, and any agent with a shell (every SKILL.md grants `allowed-tools: Bash`)
7
+ could reach the same change one CLI command away — so it withheld the *tool*, not
8
+ the *capability*. It was never a real boundary.
9
+
10
+ To run an agent read-only, give it a **read-only vCenter/NSX service account
11
+ (RBAC)**. Writes are then refused at the platform, un-bypassably, regardless of
12
+ surface or shell — the one place read/write control cannot be stepped around. A
13
+ config still carrying `read_only: true` is ignored, with a one-time warning that
14
+ names the replacement (no silent behavior change).
15
+
16
+ ### Removed: approval tiers and the declared-environment gate (via vmware-policy)
17
+
18
+ The graduated-autonomy approval tiers (`confirm`/`dual`/`review`) and the "declare
19
+ an environment or be refused" baseline are removed — they only ever fired on the
20
+ rarest configuration while carrying the family's most complex machinery. Opt-in
21
+ `deny` rules and the maintenance window remain, and apply identically wherever a
22
+ tool runs.
23
+
24
+ ### Added: offline / air-gapped install docs
25
+
26
+ The README now covers installing from source without editable mode (for older
27
+ `pip`) and building wheels to carry onto an air-gapped host — the modern PEP 517
28
+ layout has no `setup.py` by design, which is expected, not a missing file.
29
+
30
+ This release also carries the accumulated fixes staged since 1.8.5.
31
+
32
+ ## v1.8.5 (2026-07-20) — the two fixes v1.8.4 announced now actually work
33
+
34
+ Four adversarial reviews of v1.8.4 found that both of its headline fixes were
35
+ incomplete in ways the release notes did not reflect. This release makes them
36
+ real. If you are on 1.8.4, this is the one to take.
37
+
38
+ ### Fixed — a failure that was *returned* was still audited as a success
39
+
40
+ vmware-policy 1.8.4 added `report_tool_failure()` for tools that catch an
41
+ exception and return an error payload instead of raising. **No skill called it.**
42
+
43
+ Every string-returning tool therefore kept doing exactly what 1.8.4 said it had
44
+ stopped doing: writing `status=ok` to `~/.vmware/audit.db` for an operation that
45
+ failed, recording an undo token for a change that never happened, and telling the
46
+ circuit breaker the call succeeded so repeated failures never tripped it.
47
+
48
+ The surface this covered is not marginal:
49
+
50
+ | Skill | What was mis-audited |
51
+ |---|---|
52
+ | vmware-aiops | 25 of 49 tools, including **every undo-bearing write** — a failed `vm_power_on` left an undo token saying "power it back off" |
53
+ | vmware-avi | all 28 tools, including `vs_toggle` and `ako_restart` |
54
+ | vmware-storage | all 4 write tools |
55
+ | vmware-nsx | the 5 delete tools |
56
+
57
+ vmware-avi is worth calling out: before 1.8.4 its exceptions propagated and the
58
+ audit was correct. 1.8.4 caught them and returned a string, so **that release made
59
+ its audit trail worse than it had been.**
60
+
61
+ Skills whose tools already return dict payloads (vmware-monitor, vmware-vks,
62
+ vmware-aria, vmware-log-insight, vmware-harden, vmware-debug, vmware-pilot) were
63
+ already detected correctly. They gained a test proving it rather than a redundant
64
+ call.
65
+
66
+ ### Fixed — narrowing `OSError` did not close the leak it was meant to close
67
+
68
+ 1.8.4 narrowed the `_safe_error` passthrough because bare `OSError` let TLS and
69
+ DNS failures reach the agent with hostnames and certificate subjects in them.
70
+ That narrowing had no effect on the error it was written for:
71
+
72
+ ```
73
+ ssl.SSLCertVerificationError → ssl.SSLError → OSError, ValueError
74
+ ```
75
+
76
+ `ValueError` has been on every allowlist since long before 1.8.4, so a
77
+ certificate failure kept passing through — the commonest self-signed-certificate
78
+ failure in this family, carrying the hostname it was checked against. An
79
+ allowlist structurally cannot express "not this one".
80
+
81
+ Where `ssl.SSLError` can actually surface — the pyVmomi skills — it is now
82
+ reduced *ahead* of the allowlist. In the httpx skills TLS arrives wrapped as
83
+ `httpx.ConnectError`, and in vmware-avi as `requests.exceptions.SSLError`, so the
84
+ guard cannot fire there; in those skills the leak was the raw exception
85
+ interpolated into an already-allowlisted `*ApiError`, and that is now authored
86
+ text naming the config target and `verify_ssl` instead of the exception.
87
+
88
+ The missing-password error — this family's most common first-run failure, whose
89
+ entire remedy is the environment variable name it carries — keeps its message
90
+ through a narrow `ConfigError(OSError)` rather than the base class. Connection
91
+ failures are translated at the connection layer into an authored remedy that
92
+ names the target and the setting to change, with the raw detail left on
93
+ `__cause__` for the server log.
94
+
95
+ ### Also fixed
96
+
97
+ - **vmware-vks**: the quickstart documented a password variable the code never
98
+ reads — following `README.md` verbatim produced "Password not found". Five
99
+ places, plus six references to a `doctor` command this CLI has never had, two
100
+ descriptions promising fields the tools do not return, and eight teaching
101
+ messages that `RuntimeError` was masking.
102
+ - **vmware-nsx**: an error cited `--route-advertisement`; the flag is `--advertise`.
103
+ - **vmware-pilot**: `get_workflow_status` told the model to call `approve` — a
104
+ tool the read-only gate withholds — as the required next step; and a hint
105
+ pointed at a filename that could never appear in that message.
106
+ - **vmware-aiops**: `vm_task_status` polling a *failed task* returned
107
+ `{"state": "error", "error": ...}` from a successful read, which the new
108
+ detection read as the call itself failing. The field is now `task_error`.
109
+ **This is a breaking change for anything parsing that payload.**
110
+ - Several remedies that were still being cut by the 300-character cap the 1.8.4
111
+ notes claimed to have addressed.
112
+
113
+ ### Known and not fixed
114
+
115
+ `ConnectionError` remains one type from two sources in several skills — a
116
+ skill's own authored message and urllib3's `HTTPSConnectionPool(host=..., port=...)`
117
+ share it, and an allowlist cannot separate them. vmware-vks is converted; the
118
+ rest need their own domain type and are deferred rather than half-done.
119
+
1
120
  ## v1.8.4 (2026-07-20) — errors that teach, and tool descriptions a small model can route from
2
121
 
3
122
  A capability eval was rolled out across the family and asked two open questions:
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "vmware-debug"
7
- version = "1.8.4"
7
+ version = "1.8.7"
8
8
  description = "VMware diagnostic brain — read-only 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.8.4,<2.0",
24
+ "vmware-policy>=1.8.5,<2.0",
25
25
  ]
26
26
 
27
27
  [project.scripts]
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/zw008/VMware-Debug",
8
8
  "source": "github"
9
9
  },
10
- "version": "1.8.4",
10
+ "version": "1.8.7",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "pypi",
14
14
  "identifier": "vmware-debug",
15
- "version": "1.8.4",
15
+ "version": "1.8.7",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }
@@ -19,7 +19,7 @@ installer:
19
19
  package: vmware-debug
20
20
  allowed-tools:
21
21
  - Bash
22
- metadata: {"openclaw":{"requires":{"bins":["vmware-debug"]},"optional":{"env":["VMWARE_READ_ONLY","VMWARE_DEBUG_READ_ONLY","VMWARE_AUDIT_APPROVED_BY","VMWARE_AUDIT_RATIONALE"],"bins":["vmware-policy"]},"primaryEnv":"NONE","homepage":"https://github.com/zw008/VMware-Debug","os":["macos","linux"]}}
22
+ metadata: {"openclaw":{"requires":{"bins":["vmware-debug"]},"optional":{"env":["VMWARE_AUDIT_APPROVED_BY","VMWARE_AUDIT_RATIONALE"],"bins":["vmware-policy"]},"primaryEnv":"NONE","homepage":"https://github.com/zw008/VMware-Debug","os":["macos","linux"]}}
23
23
  ---
24
24
 
25
25
  # VMware Debug
@@ -113,17 +113,11 @@ a recommended plan.
113
113
  See `references/event-envelope.md`. The agent normalises each source's events into this
114
114
  shape; debug stays source-agnostic and has no dependency on the other packages.
115
115
 
116
- ## Read-Only Mode
117
-
118
- Both tools here are reads, so read-only mode withholds nothing — but
119
- `VMWARE_DEBUG_READ_ONLY=true` or the family-wide `VMWARE_READ_ONLY=true` still applies, and
120
- the gate verifies at start-up that zero write tools are exposed rather than taking this
121
- document's word for it. Debug has no config file, so the env vars are the only switch. The
122
- same family variable withholds write tools across every companion skill, so a whole-estate
123
- audit posture is one setting — and when you route a fix to vmware-aiops or vmware-pilot and
124
- the tool is missing from *their* `list_tools()`, that is the lockdown, not a fault. Do not
125
- retry or hunt for another route: name the blocked operation and say an operator must clear
126
- the switch and restart that server. Running with local or small models? See [`references/agent-guardrails.md`](references/agent-guardrails.md).
116
+ ## Read-Only by Design
117
+
118
+ Both tools here are reads — zero write tools, zero network access of its own.
119
+ Running with local or small models? See
120
+ [`references/agent-guardrails.md`](references/agent-guardrails.md).
127
121
 
128
122
  ## CLI Quick Reference
129
123
 
@@ -34,50 +34,13 @@ These are structural, so it cannot.
34
34
 
35
35
  | Guardrail you would otherwise prompt for | Now enforced by |
36
36
  |---|---|
37
- | "Work exclusively in read-only mode and never modify anything" | **The tool surface, and the gate that proves it.** Both tools are reads, so read-only mode withholds nothing here — but setting it makes the guarantee checkable: the gate verifies at start-up that zero write tools are exposed rather than taking this document's word for it. |
37
+ | "Work read-only and never modify anything" | **The tool surface itself.** Both tools are reads — this skill has no write tool at all, so there is nothing to withhold and nothing to switch off. |
38
38
  | "Diagnose only — never apply the fix you propose" | **Structural.** This skill has no tool that changes anything, and it holds no connection to vCenter, NSX or anything else. Remediation is routed to vmware-aiops or vmware-pilot by the calling agent. |
39
39
  | "Do not fabricate a timeline — build it from the events I gave you" | **`incident_timeline` correlates only its input.** It is source-agnostic and has no way to fetch anything, so the timeline cannot contain an event the agent did not supply. |
40
40
  | "Tell me when the symptom is outside what you can recognise" | **`list_symptom_categories`** states the catalogue, and unmatched symptoms come back as `uncategorized` rather than being forced into the nearest signature. |
41
41
  | "Use explicit limits for queries that may return large amounts of data" | **The list envelope.** `list_symptom_categories` returns `{items, returned, limit, total, truncated, hint}` with `truncated` always `false` — which is the point: it states that the catalogue is complete instead of leaving you to infer it. |
42
42
  | "Log everything you looked at" | **The `@vmware_tool` decorator.** Every call is recorded to `~/.vmware/audit.db`, reads included. |
43
43
 
44
- ### Turning read-only mode on
45
-
46
- One variable covers every skill in the family:
47
-
48
- ```json
49
- {
50
- "mcpServers": {
51
- "vmware-debug": {
52
- "command": "vmware-debug",
53
- "args": ["mcp"],
54
- "env": { "VMWARE_READ_ONLY": "true" }
55
- }
56
- }
57
- }
58
- ```
59
-
60
- Per-skill override:
61
-
62
- ```bash
63
- VMWARE_READ_ONLY=true # whole family read-only
64
- VMWARE_DEBUG_READ_ONLY=false # …except this skill
65
- ```
66
-
67
- **This skill has no `config.yaml`**, so the two environment variables are the
68
- only switch — there is no `read_only:` configuration setting to fall back on.
69
- Precedence is per-skill env → family env → off. An unparseable value
70
- (`VMWARE_READ_ONLY=ture`) enables read-only mode rather than silently ignoring
71
- the typo.
72
-
73
- Setting it here is worth doing even though nothing is withheld: the same
74
- variable withholds write tools across every companion skill, so a whole-estate
75
- diagnostic posture is one setting. That matters especially in this skill's
76
- workflow — you gather signals read-only, correlate, and then route a fix. When
77
- the fix tool is missing from vmware-aiops's or vmware-pilot's `list_tools()`,
78
- that is the lockdown working, not a fault: name the blocked operation and stop,
79
- rather than retrying or hunting for another route.
80
-
81
44
  ---
82
45
 
83
46
  ## The system prompt
@@ -7,11 +7,6 @@ Read-only, offline incident correlation. No network, no credentials, no writes.
7
7
  | `incident_timeline` | `{event_count, window, spikes:[{start,end,count,zscore}], hypotheses:[{category, score, summary, evidence_count, first_seen, last_seen, sample_text, suggested_check}], next_checks:[...]}` | 300–2000 (scales with hypotheses) |
8
8
  | `list_symptom_categories` | `{items: [{category, example_keywords, suggested_check}], returned, limit, total, truncated, hint}` | ~400 |
9
9
 
10
- > Read-only mode (`VMWARE_DEBUG_READ_ONLY=true` or the family-wide `VMWARE_READ_ONLY=true`;
11
- > debug has no config file) removes nothing from this table — both tools are `[READ]`, and
12
- > the gate proves that at start-up rather than trusting the marker. Classification comes
13
- > from the `[READ]`/`[WRITE]` docstring marker — see README.
14
-
15
10
  `list_symptom_categories` returns the family list envelope — read the rows from
16
11
  `items`. It has no `limit` parameter, which is exactly why the envelope matters:
17
12
  `truncated: false` states that this is every category there is, rather than
@@ -0,0 +1,49 @@
1
+ # vmware-debug Setup Guide
2
+
3
+ vmware-debug has **no configuration, no credentials, and no network access** — it
4
+ is a pure, offline correlation engine. There is no `config.yaml` and no `.env`.
5
+
6
+ ## Install
7
+
8
+ ```bash
9
+ uv tool install vmware-debug
10
+ vmware-debug categories # verify it runs
11
+ ```
12
+
13
+ ## MCP client configuration
14
+
15
+ ```json
16
+ {
17
+ "command": "uvx",
18
+ "args": ["--from", "vmware-debug", "vmware-debug-mcp"]
19
+ }
20
+ ```
21
+
22
+ If installed with `uv tool install`, prefer the entry point `vmware-debug mcp`
23
+ (no PyPI resolution at startup — robust behind corporate TLS proxies, 踩坑 #25).
24
+
25
+ For full cross-skill diagnosis, also install the data-source skills it correlates
26
+ (vmware-monitor, vmware-log-insight, vmware-aria, vmware-nsx) and the executors it
27
+ routes fixes to (vmware-aiops, vmware-pilot).
28
+
29
+ ## Security
30
+
31
+ > **Disclaimer**: Community-maintained open-source project, **not affiliated with,
32
+ > endorsed by, or sponsored by VMware, Inc. or Broadcom Inc.**
33
+
34
+ 1. **Source Code** — https://github.com/zw008/VMware-Debug (MIT).
35
+ 2. **Credentials** — none. debug holds no secrets and connects to nothing.
36
+ 3. **Network** — none. All tools are local pure functions over event data the
37
+ agent supplies.
38
+ 4. **Writes** — none. debug only diagnoses and recommends; remediation is routed
39
+ to vmware-aiops / vmware-pilot, where confirmation/approval/audit live.
40
+ 5. **No cross-skill coupling** — events arrive as plain dicts (the event
41
+ envelope); debug imports no other skill package at runtime.
42
+ 6. **Environment scoping** — policy rules can scope by environment, and skills
43
+ that connect to a VMware estate may declare `environment:` (`production` /
44
+ `staging` / `lab`) per target in their own `config.yaml` as an optional label
45
+ an environment-scoped `deny` rule can match on. debug has no config and no
46
+ connection to declare one about, so it reports a constant `local`. Since it
47
+ ships no operation above read risk, nothing here is gated either way.
48
+ 7. **Static analysis** — `uvx bandit -r vmware_debug/` (release bar:
49
+ 0 Medium+).