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.
Files changed (106) hide show
  1. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/.claude-plugin/plugin.json +1 -1
  2. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/.mcp.json +1 -1
  3. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/CHANGELOG.md +12 -0
  4. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/PKG-INFO +1 -1
  5. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/RELEASE_NOTES.md +3 -0
  6. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/openclaw.plugin.json +1 -1
  7. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/package.json +1 -1
  8. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/pyproject.toml +1 -1
  9. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/server.json +2 -2
  10. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/skills/proxy-aiops/references/agent-guardrails.md +14 -1
  11. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/uv.lock +1 -1
  12. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/.github/workflows/mcp-publish.yml +0 -0
  13. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/.github/workflows/publish.yml +0 -0
  14. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/.gitignore +0 -0
  15. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/Dockerfile +0 -0
  16. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/LICENSE +0 -0
  17. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/README.md +0 -0
  18. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/SECURITY.md +0 -0
  19. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/docs/VERIFICATION.md +0 -0
  20. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/glama.json +0 -0
  21. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/__init__.py +0 -0
  22. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/_shared.py +0 -0
  23. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/server.py +0 -0
  24. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/__init__.py +0 -0
  25. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/analysis.py +0 -0
  26. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/certs.py +0 -0
  27. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/configread.py +0 -0
  28. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/routes.py +0 -0
  29. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/services.py +0 -0
  30. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/status.py +0 -0
  31. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/traffic.py +0 -0
  32. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/undo.py +0 -0
  33. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/mcp_server/tools/writes.py +0 -0
  34. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/__init__.py +0 -0
  35. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/__init__.py +0 -0
  36. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/_common.py +0 -0
  37. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/_root.py +0 -0
  38. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/analyze.py +0 -0
  39. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/certs.py +0 -0
  40. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/configcmd.py +0 -0
  41. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/doctor.py +0 -0
  42. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/init.py +0 -0
  43. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/overview.py +0 -0
  44. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/routes.py +0 -0
  45. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/secret.py +0 -0
  46. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/server.py +0 -0
  47. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/services.py +0 -0
  48. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/cli/undo.py +0 -0
  49. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/config.py +0 -0
  50. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/connection.py +0 -0
  51. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/doctor.py +0 -0
  52. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/__init__.py +0 -0
  53. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/audit.py +0 -0
  54. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/budget.py +0 -0
  55. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/decorators.py +0 -0
  56. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/outcome.py +0 -0
  57. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/paths.py +0 -0
  58. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/patterns.py +0 -0
  59. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/policy.py +0 -0
  60. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/sanitize.py +0 -0
  61. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/governance/undo.py +0 -0
  62. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/__init__.py +0 -0
  63. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/_util.py +0 -0
  64. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/analysis.py +0 -0
  65. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/certs.py +0 -0
  66. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/configread.py +0 -0
  67. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/overview.py +0 -0
  68. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/routes.py +0 -0
  69. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/services.py +0 -0
  70. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/status.py +0 -0
  71. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/traffic.py +0 -0
  72. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/ops/writes.py +0 -0
  73. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/platform.py +0 -0
  74. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/proxy_aiops/secretstore.py +0 -0
  75. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/skills/proxy-aiops/SKILL.md +0 -0
  76. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/skills/proxy-aiops/references/capabilities.md +0 -0
  77. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/skills/proxy-aiops/references/cli-reference.md +0 -0
  78. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/skills/proxy-aiops/references/setup-guide.md +0 -0
  79. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/smithery.yaml +0 -0
  80. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/conftest.py +0 -0
  81. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_analysis.py +0 -0
  82. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_cli_audited.py +0 -0
  83. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_cli_governed_exit.py +0 -0
  84. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_cli_reads.py +0 -0
  85. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_cli_secret.py +0 -0
  86. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_cli_writes.py +0 -0
  87. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_connection.py +0 -0
  88. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_doctor.py +0 -0
  89. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_dpapi_version.py +0 -0
  90. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_gov_audit.py +0 -0
  91. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_gov_decorators.py +0 -0
  92. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_gov_patterns.py +0 -0
  93. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_gov_policy.py +0 -0
  94. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_governance_persistence.py +0 -0
  95. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_init.py +0 -0
  96. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_int_fidelity.py +0 -0
  97. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_mcp_read_tools.py +0 -0
  98. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_ops_extra.py +0 -0
  99. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_optional_fields.py +0 -0
  100. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_platform.py +0 -0
  101. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_reads.py +0 -0
  102. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_secretstore.py +0 -0
  103. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_self_lockout.py +0 -0
  104. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_smoke.py +0 -0
  105. {proxy_aiops-0.9.3 → proxy_aiops-0.9.4}/tests/test_undo_executor.py +0 -0
  106. {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.3",
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",
@@ -5,7 +5,7 @@
5
5
  "command": "uvx",
6
6
  "args": [
7
7
  "--from",
8
- "proxy-aiops==0.9.3",
8
+ "proxy-aiops==0.9.4",
9
9
  "proxy-aiops-mcp"
10
10
  ]
11
11
  }
@@ -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
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
@@ -11,7 +11,7 @@
11
11
  "command": "uvx",
12
12
  "args": [
13
13
  "--from",
14
- "proxy-aiops==0.9.3",
14
+ "proxy-aiops==0.9.4",
15
15
  "proxy-aiops-mcp"
16
16
  ]
17
17
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zw008/proxy-aiops",
3
- "version": "0.9.3",
3
+ "version": "0.9.4",
4
4
  "description": "Governed Traefik + Caddy + HAProxy ops: routes, upstreams, certs, 5xx RCA. 28 tools.",
5
5
  "private": true,
6
6
  "license": "MIT",
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "proxy-aiops"
7
- version = "0.9.3"
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.3",
10
+ "version": "0.9.4",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "pypi",
14
14
  "identifier": "proxy-aiops",
15
- "version": "0.9.3",
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
- | "Preserve the ordering / tell me what's most urgent" | `backend_health_rca`, `error_rate_rca`, `route_conflict_analysis` and `cert_expiry_sweep` rank findings worst-first with the measured number attached. Priority is in the payload, not implied by list position. |
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
@@ -529,7 +529,7 @@ wheels = [
529
529
 
530
530
  [[package]]
531
531
  name = "proxy-aiops"
532
- version = "0.9.3"
532
+ version = "0.9.4"
533
533
  source = { editable = "." }
534
534
  dependencies = [
535
535
  { name = "cryptography" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes