proxy-aiops 0.9.3__tar.gz → 0.9.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/.claude-plugin/plugin.json +1 -1
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/.mcp.json +1 -1
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/CHANGELOG.md +12 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/PKG-INFO +1 -1
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/RELEASE_NOTES.md +3 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/openclaw.plugin.json +1 -1
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/package.json +1 -1
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/pyproject.toml +1 -1
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/server.json +2 -2
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/skills/proxy-aiops/references/agent-guardrails.md +14 -1
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/uv.lock +1 -1
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/.github/workflows/mcp-publish.yml +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/.github/workflows/publish.yml +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/.gitignore +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/Dockerfile +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/LICENSE +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/README.md +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/SECURITY.md +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/docs/VERIFICATION.md +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/glama.json +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/__init__.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/_shared.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/server.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/__init__.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/analysis.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/certs.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/configread.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/routes.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/services.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/status.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/traffic.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/undo.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/writes.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/__init__.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/__init__.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/_common.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/_root.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/analyze.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/certs.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/configcmd.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/doctor.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/init.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/overview.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/routes.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/secret.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/server.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/services.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/undo.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/config.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/connection.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/doctor.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/__init__.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/audit.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/budget.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/decorators.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/outcome.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/paths.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/patterns.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/policy.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/sanitize.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/undo.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/__init__.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/_util.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/analysis.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/certs.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/configread.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/overview.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/routes.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/services.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/status.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/traffic.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/writes.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/platform.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/secretstore.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/skills/proxy-aiops/SKILL.md +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/skills/proxy-aiops/references/capabilities.md +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/skills/proxy-aiops/references/cli-reference.md +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/skills/proxy-aiops/references/setup-guide.md +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/smithery.yaml +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/conftest.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_analysis.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_cli_audited.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_cli_governed_exit.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_cli_reads.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_cli_secret.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_cli_writes.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_connection.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_doctor.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_dpapi_version.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_gov_audit.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_gov_decorators.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_gov_patterns.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_gov_policy.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_governance_persistence.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_init.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_int_fidelity.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_mcp_read_tools.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_ops_extra.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_optional_fields.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_platform.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_reads.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_secretstore.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_self_lockout.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_smoke.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_undo_executor.py +0 -0
- {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_writes.py +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://anthropic.com/claude-code/plugin.schema.json",
|
|
3
3
|
"name": "proxy-aiops",
|
|
4
4
|
"displayName": "Proxy AIops",
|
|
5
|
-
"version": "0.9.
|
|
5
|
+
"version": "0.9.4",
|
|
6
6
|
"description": "Governed Traefik + Caddy + HAProxy ops: routes, upstreams, certs, 5xx RCA. 28 tools.",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "Wei Zhou",
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v0.9.4 — 2026-09-17
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
- `agent-guardrails.md` promised, in the table headed "what the tool enforces — do not
|
|
7
|
+
waste prompt budget on these", that all four RCAs "rank findings worst-first" with
|
|
8
|
+
"priority in the payload". `backend_health_rca` sorts its findings on an internal score
|
|
9
|
+
removed before return, and `route_conflict_analysis` is in the proxy's own evaluation
|
|
10
|
+
order — route priority, which is not returned, and which is match order rather than
|
|
11
|
+
severity. `error_rate_rca` and `cert_expiry_sweep` are genuinely checkable (`errorRatePct`
|
|
12
|
+
with a `critical`/`warning` `severity`, and `daysToExpiry`), and the row now says only
|
|
13
|
+
that. The copyable system prompt gained a line about not reading priority off position.
|
|
14
|
+
|
|
3
15
|
## v0.9.3 — 2026-09-15
|
|
4
16
|
|
|
5
17
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: proxy-aiops
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.4
|
|
4
4
|
Summary: Governed AI-ops for Traefik + Caddy + HAProxy reverse proxies / load balancers: routes, services, upstream health, TLS cert expiry sweep, 5xx error-rate RCA, route conflict analysis, and governed writes (caddy config, haproxy server state/weight) with a built-in governance harness (audit, budget, undo, risk tiers)
|
|
5
5
|
Author-email: Wei Zhou <zhouwei008@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# Release notes — proxy-aiops 0.5.0
|
|
2
2
|
|
|
3
|
+
> Historical — this file covers the 0.5.0 release only and is not updated.
|
|
4
|
+
> For every release since, see [CHANGELOG.md](CHANGELOG.md) and the GitHub releases.
|
|
5
|
+
|
|
3
6
|
Previous release: 0.4.0.
|
|
4
7
|
|
|
5
8
|
## BREAKING — the authorization layer is removed
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "proxy-aiops"
|
|
7
|
-
version = "0.9.
|
|
7
|
+
version = "0.9.4"
|
|
8
8
|
description = "Governed AI-ops for Traefik + Caddy + HAProxy reverse proxies / load balancers: routes, services, upstream health, TLS cert expiry sweep, 5xx error-rate RCA, route conflict analysis, and governed writes (caddy config, haproxy server state/weight) with a built-in governance harness (audit, budget, undo, risk tiers)"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
"url": "https://github.com/AIops-tools/Proxy-AIops",
|
|
8
8
|
"source": "github"
|
|
9
9
|
},
|
|
10
|
-
"version": "0.9.
|
|
10
|
+
"version": "0.9.4",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "pypi",
|
|
14
14
|
"identifier": "proxy-aiops",
|
|
15
|
-
"version": "0.9.
|
|
15
|
+
"version": "0.9.4",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
}
|
|
@@ -31,7 +31,7 @@ What the tool *does* guarantee is that you can always see what happened:
|
|
|
31
31
|
|---|---|
|
|
32
32
|
| "Don't invent a value when a field is missing" | Traefik, Caddy and HAProxy express the same concepts differently, so a field one platform has and another does not comes back as `null`, never as `""`. A Caddy route's `raw` rule string is `null` — Caddy matches on a match list and has no such string — rather than a misleading empty rule. |
|
|
33
33
|
| "Tell me if the output was cut off" | `search_config`, `traffic_stats` and `error_counters` return `{"matches"/"services": [...], "returned": N, "limit": L, "truncated": true/false}` — one convention across the repo. Truncation is measured (the config walk deliberately overshoots by one) and not guessed from the count reaching the cap. |
|
|
34
|
-
| "
|
|
34
|
+
| "Make it show the number it judged on" | `error_rate_rca` returns `errorRatePct`, `vsBaselineX` against the fleet baseline and a `severity` of `critical`/`warning` on every flagged service; `cert_expiry_sweep` returns `daysToExpiry` and a `bucket` per certificate, and orders by `daysToExpiry`. Both orderings are therefore checkable from the payload itself. |
|
|
35
35
|
| "Confirm before anything destructive" | `delete_config_path` and `load_config` require a `--dry-run`-able preview plus double confirmation at the CLI. Config writes capture the prior value so the undo token can restore it. |
|
|
36
36
|
| "Log what you did" | Every governed call is audited to `~/.proxy-aiops/audit.db` regardless of what the model says it did — and the CLI writes the same row the MCP path does, so there is no unaudited entry point. |
|
|
37
37
|
| "Don't get stuck retrying" | The runaway guard trips a circuit breaker if the same call is hammered in a tight loop — a stuck agent is stopped rather than left to burn calls and time. |
|
|
@@ -39,6 +39,15 @@ What the tool *does* guarantee is that you can always see what happened:
|
|
|
39
39
|
## What still needs a prompt
|
|
40
40
|
|
|
41
41
|
These are model-behaviour problems the harness cannot fix from the outside.
|
|
42
|
+
|
|
43
|
+
⚠️ **Two of the four orderings cannot be checked, for different reasons.**
|
|
44
|
+
`backend_health_rca` sorts its `findings` worst-first on an internal score that is removed
|
|
45
|
+
before the payload is returned, and its findings carry neither a `rank` nor a `severity`.
|
|
46
|
+
`route_conflict_analysis` is ordered by the proxy's own **evaluation order** (route priority,
|
|
47
|
+
which is not returned) — that is match order, not severity: a shadowed route appearing first
|
|
48
|
+
says nothing about how bad the shadowing is. `error_rate_rca` and `cert_expiry_sweep` are
|
|
49
|
+
different: they sort on `errorRatePct` and `daysToExpiry`, both of which are in the payload.
|
|
50
|
+
|
|
42
51
|
Copy this into your agent's system prompt:
|
|
43
52
|
|
|
44
53
|
```text
|
|
@@ -57,6 +66,10 @@ READING RESULTS
|
|
|
57
66
|
- Read the whole result before concluding. If a result contains a "truncated"
|
|
58
67
|
field that is true, say so and narrow the query instead of treating the
|
|
59
68
|
partial result as complete.
|
|
69
|
+
- `backend_health_rca` findings and `route_conflict_analysis` results are not ordered by
|
|
70
|
+
severity — the latter is in the proxy's match order. Weigh `backend_health_rca` findings on
|
|
71
|
+
their own `serversTotal`/`up`/`down`/`maint` counts. `route_conflict_analysis` results carry
|
|
72
|
+
no number at all — read `shadowedBy`, `reason` or `chain` and say which one you acted on.
|
|
60
73
|
- A null field means this platform does not express that concept, or did not
|
|
61
74
|
report it. Report it as "not available" — never infer it.
|
|
62
75
|
- An "unsupported" field is a capability statement about the platform, not an
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|