Skip to content

Commit 21c22b3

Browse files
feat: add AI assistant command with streaming output
Introduces `datumctl ai` — a natural-language assistant for managing Datum Cloud resources. Users can describe what they want in plain English and the assistant translates it into API operations, with confirmation gates before any write. NOTE: This is an early proof-of-concept shared to gather team feedback — not intended for production use yet. We'd love thoughts on the approach, tool design, and what you'd want to see next. Key capabilities: - Multi-provider LLM support: Anthropic Claude, OpenAI GPT, Google Gemini - Agentic loop with 7 built-in tools (list, get, apply, delete, validate, schema inspection, context switching) - Streaming responses with animated spinner: tokens are written to the terminal as they arrive rather than waiting for the full response - Interactive REPL mode and single-query / pipe mode - Confirmation gate for all mutating operations (apply, delete) - MCP server integration: same tools exposed via Model Context Protocol for use with Claude Desktop and other MCP clients - Per-user config at ~/.config/datumctl/ai.yaml (API keys, default model, default org/project) Supporting changes: - Extract RestConfigForContext helper from mcp command into client package - Add DiscoverResourceTypes and GetOpenAPISchema to K8sClient for environments where CRD access is restricted - Add CLI examples to auth and docs command groups Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent bcc5af0 commit 21c22b3

File tree

22 files changed

+2950
-83
lines changed

22 files changed

+2950
-83
lines changed

docs/ai.md

Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
---
2+
title: "AI Assistant"
3+
sidebar:
4+
order: 5
5+
---
6+
7+
`datumctl ai` is a natural-language interface for Datum Cloud. Describe what you
8+
want to do in plain English and the assistant translates it into resource
9+
operations — listing, inspecting, creating, updating, and deleting resources —
10+
with confirmation prompts before any changes are applied.
11+
12+
## Prerequisites
13+
14+
You need an API key from one of the supported LLM providers:
15+
16+
| Provider | Environment variable | Get a key at |
17+
|-----------|-----------------------|-------------------------------------|
18+
| Anthropic | `ANTHROPIC_API_KEY` | console.anthropic.com |
19+
| OpenAI | `OPENAI_API_KEY` | platform.openai.com |
20+
| Gemini | `GEMINI_API_KEY` | aistudio.google.com |
21+
22+
You also need to be logged in to Datum Cloud:
23+
24+
```
25+
datumctl auth login
26+
```
27+
28+
## Quick start
29+
30+
The fastest way to get started is to save your API key and default organization
31+
once, then never pass flags again:
32+
33+
```
34+
# Save your API key
35+
datumctl ai config set anthropic_api_key sk-ant-...
36+
37+
# Save your default organization or project
38+
datumctl ai config set organization my-org-id
39+
# or
40+
datumctl ai config set project my-project-id
41+
42+
# Now just run it
43+
datumctl ai "what resources do I have?"
44+
```
45+
46+
Find your organization ID with:
47+
48+
```
49+
datumctl get organizations
50+
```
51+
52+
## Usage
53+
54+
```
55+
datumctl ai [query] [flags]
56+
```
57+
58+
### Single query
59+
60+
```
61+
datumctl ai "list all DNS zones" --project my-project-id
62+
```
63+
64+
### Interactive session (REPL)
65+
66+
Omit the query argument to start a conversation. The assistant remembers
67+
context across turns so you can ask follow-up questions.
68+
69+
```
70+
datumctl ai --organization my-org-id
71+
```
72+
73+
Type `exit` or `quit` to end the session.
74+
75+
### Pipe mode
76+
77+
```
78+
echo "how many projects do I have?" | datumctl ai --organization my-org-id
79+
```
80+
81+
Read-only operations work in pipe mode. Write operations (apply, delete) are
82+
automatically declined — run interactively to apply changes.
83+
84+
## Configuration
85+
86+
`datumctl ai config` manages a configuration file that stores defaults for every
87+
`datumctl ai` invocation. On Linux/macOS the file is at
88+
`~/.config/datumctl/ai.yaml`; on Windows it is at `%AppData%\datumctl\ai.yaml`.
89+
90+
### Set a value
91+
92+
```
93+
datumctl ai config set <key> <value>
94+
```
95+
96+
| Key | Description |
97+
|---------------------|----------------------------------------------------------|
98+
| `organization` | Default organization ID |
99+
| `project` | Default project ID (mutually exclusive with organization)|
100+
| `namespace` | Default namespace (default: `default`) |
101+
| `provider` | LLM provider: `anthropic`, `openai`, or `gemini` |
102+
| `model` | Model name, e.g. `claude-sonnet-4-6`, `gpt-4o` |
103+
| `max_iterations` | Agentic loop iteration cap (default: `20`) |
104+
| `anthropic_api_key` | Anthropic API key |
105+
| `openai_api_key` | OpenAI API key |
106+
| `gemini_api_key` | Gemini API key |
107+
108+
### Show current configuration
109+
110+
API keys are redacted in the output.
111+
112+
```
113+
datumctl ai config show
114+
```
115+
116+
### Remove a value
117+
118+
```
119+
datumctl ai config unset organization
120+
```
121+
122+
### Priority order
123+
124+
Later entries override earlier ones:
125+
126+
1. Config file (`~/.config/datumctl/ai.yaml`)
127+
2. CLI flags (`--organization`, `--model`, etc.)
128+
3. Environment variables (`ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY`)
129+
130+
## Flags
131+
132+
| Flag | Description |
133+
|--------------------|----------------------------------------------------|
134+
| `--organization` | Organization context (overrides config file) |
135+
| `--project` | Project context (overrides config file) |
136+
| `--namespace` | Default namespace (overrides config file) |
137+
| `--model` | Model override, e.g. `claude-sonnet-4-6`, `gpt-4o`|
138+
| `--max-iterations` | Agentic loop iteration cap (default: `20`) |
139+
140+
## How it works
141+
142+
The assistant has access to the following tools, which map directly to the same
143+
operations available via `datumctl get`, `datumctl apply`, and the MCP server:
144+
145+
| Tool | Operation | Requires confirmation |
146+
|-----------------------|----------------------------------------|-----------------------|
147+
| `list_resource_types` | Discover available resource types | No |
148+
| `get_resource_schema` | Fetch the schema for a resource type | No |
149+
| `list_resources` | List resources of a given kind | No |
150+
| `get_resource` | Get a single resource by name | No |
151+
| `validate_manifest` | Server-side dry-run validation | No |
152+
| `apply_manifest` | Create or update a resource | **Yes** |
153+
| `delete_resource` | Delete a resource | **Yes** |
154+
| `change_context` | Switch organization/project/namespace | No |
155+
156+
Read operations execute immediately. For `apply_manifest` and `delete_resource`
157+
the assistant shows a preview of the proposed change and prompts:
158+
159+
```
160+
--- Proposed action ---
161+
Tool: apply_manifest
162+
Details:
163+
{
164+
"yaml": "apiVersion: ..."
165+
}
166+
-----------------------
167+
Apply changes? [y/N]:
168+
```
169+
170+
Type `y` to proceed. Any other input cancels the operation — the assistant is
171+
informed it was skipped and will ask what to do next.
172+
173+
## Provider selection
174+
175+
The provider is chosen automatically from whichever API key is available.
176+
When multiple keys are present the priority is Anthropic → OpenAI → Gemini.
177+
178+
Override with `--model` using a provider-prefixed model name:
179+
180+
```
181+
datumctl ai "list zones" --model claude-opus-4-6 # Anthropic
182+
datumctl ai "list zones" --model gpt-4o # OpenAI
183+
datumctl ai "list zones" --model gemini-2.0-flash # Gemini
184+
```
185+
186+
Or set a permanent default:
187+
188+
```
189+
datumctl ai config set model claude-sonnet-4-6
190+
```
191+
192+
## Default models
193+
194+
| Provider | Default model |
195+
|-----------|----------------------|
196+
| Anthropic | `claude-sonnet-4-6` |
197+
| OpenAI | `gpt-4o` |
198+
| Gemini | `gemini-2.0-flash` |

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ require (
1414
go.miloapis.com/activity v0.3.1
1515
go.miloapis.com/milo v0.21.0
1616
golang.org/x/oauth2 v0.36.0
17+
golang.org/x/term v0.39.0
1718
k8s.io/apiextensions-apiserver v0.35.2
1819
k8s.io/apimachinery v0.35.2
1920
k8s.io/cli-runtime v0.35.2
@@ -95,7 +96,6 @@ require (
9596
golang.org/x/net v0.49.0 // indirect
9697
golang.org/x/sync v0.19.0 // indirect
9798
golang.org/x/sys v0.40.0 // indirect
98-
golang.org/x/term v0.39.0 // indirect
9999
golang.org/x/text v0.33.0 // indirect
100100
golang.org/x/time v0.14.0 // indirect
101101
google.golang.org/protobuf v1.36.11 // indirect

go.sum

Lines changed: 4 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF
1616
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
1717
github.com/chai2010/gettext-go v1.0.3 h1:9liNh8t+u26xl5ddmWLmsOsdNLwkdRTg5AG+JnTiM80=
1818
github.com/chai2010/gettext-go v1.0.3/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA=
19+
github.com/clipperhouse/uax29/v2 v2.2.0 h1:ChwIKnQN3kcZteTXMgb1wztSgaU+ZemkgWdohwgs8tY=
20+
github.com/clipperhouse/uax29/v2 v2.2.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM=
1921
github.com/coreos/go-oidc/v3 v3.17.0 h1:hWBGaQfbi0iVviX4ibC7bk8OKT5qNr4klBaCHVNvehc=
2022
github.com/coreos/go-oidc/v3 v3.17.0/go.mod h1:wqPbKFrVnE90vty060SB40FCJ8fTHTxSwyXJqZH+sI8=
2123
github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0=
@@ -90,7 +92,6 @@ github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
9092
github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
9193
github.com/google/gnostic-models v0.7.1 h1:SisTfuFKJSKM5CPZkffwi6coztzzeYUhc3v4yxLWH8c=
9294
github.com/google/gnostic-models v0.7.1/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ=
93-
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
9495
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
9596
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
9697
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@@ -122,8 +123,8 @@ github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhn
122123
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE=
123124
github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY=
124125
github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc=
125-
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
126-
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
126+
github.com/mattn/go-runewidth v0.0.21 h1:jJKAZiQH+2mIinzCJIaIG9Be1+0NR+5sz/lYEEjdM8w=
127+
github.com/mattn/go-runewidth v0.0.21/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
127128
github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0=
128129
github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0=
129130
github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU=
@@ -163,10 +164,6 @@ github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9Z
163164
github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA=
164165
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
165166
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
166-
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
167-
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
168-
github.com/rodaine/table v1.3.0 h1:4/3S3SVkHnVZX91EHFvAMV7K42AnJ0XuymRR2C5HlGE=
169-
github.com/rodaine/table v1.3.0/go.mod h1:47zRsHar4zw0jgxGxL9YtFfs7EGN6B/TaS+/Dmk4WxU=
170167
github.com/rodaine/table v1.3.1 h1:jBVgg1bEu5EzEdYSrwUUlQpayDtkvtTmgFS0FPAxOq8=
171168
github.com/rodaine/table v1.3.1/go.mod h1:VYCJRCHa2DpD25uFALcB6hi5ECF3eEJQVhCXRjHgXc4=
172169
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
@@ -181,17 +178,11 @@ github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An
181178
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
182179
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
183180
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
184-
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
185-
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
186181
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
187182
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
188183
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
189184
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
190185
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
191-
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
192-
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
193-
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
194-
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
195186
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
196187
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
197188
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
@@ -200,12 +191,8 @@ github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ=
200191
github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0=
201192
github.com/zalando/go-keyring v0.2.6 h1:r7Yc3+H+Ux0+M72zacZoItR3UDxeWfKTcabvkI8ua9s=
202193
github.com/zalando/go-keyring v0.2.6/go.mod h1:2TCrxYrbUNYfNS/Kgy/LSrkSQzZ5UPVH85RwfczwvcI=
203-
go.miloapis.com/activity v0.3.0 h1:ajcl5U1UeNZZiA+iQ+NbCi0ysvCyQbQ1rKKdOEA06/c=
204-
go.miloapis.com/activity v0.3.0/go.mod h1:W6Y8qvMCY47DFZPnZ35H+ambSEAbROOw3RGS3RT4M0Q=
205194
go.miloapis.com/activity v0.3.1 h1:Yq8pdfphiAqr3DqZNQ0a50SadHrbdZyqng/HEwHe4WI=
206195
go.miloapis.com/activity v0.3.1/go.mod h1:W6Y8qvMCY47DFZPnZ35H+ambSEAbROOw3RGS3RT4M0Q=
207-
go.miloapis.com/milo v0.16.2 h1:MqrBQvTYWIWBlniJXqBe3ycO/sZxgkL2tYems4s1+LY=
208-
go.miloapis.com/milo v0.16.2/go.mod h1:xOFYvUsvSZV3z6eow5YdB5C/qRQf2s/5/arcfJs5XPg=
209196
go.miloapis.com/milo v0.21.0 h1:bTazLscUTQWSnBwD22sZ2dlUFHiQfZOz6rcYeX4PecU=
210197
go.miloapis.com/milo v0.21.0/go.mod h1:xOFYvUsvSZV3z6eow5YdB5C/qRQf2s/5/arcfJs5XPg=
211198
go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48=
@@ -226,8 +213,6 @@ golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI=
226213
golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg=
227214
golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o=
228215
golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8=
229-
golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw=
230-
golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
231216
golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs=
232217
golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q=
233218
golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
@@ -256,54 +241,32 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
256241
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
257242
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
258243
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
259-
k8s.io/api v0.35.0 h1:iBAU5LTyBI9vw3L5glmat1njFK34srdLmktWwLTprlY=
260-
k8s.io/api v0.35.0/go.mod h1:AQ0SNTzm4ZAczM03QH42c7l3bih1TbAXYo0DkF8ktnA=
261244
k8s.io/api v0.35.2 h1:tW7mWc2RpxW7HS4CoRXhtYHSzme1PN1UjGHJ1bdrtdw=
262245
k8s.io/api v0.35.2/go.mod h1:7AJfqGoAZcwSFhOjcGM7WV05QxMMgUaChNfLTXDRE60=
263-
k8s.io/apiextensions-apiserver v0.35.0 h1:3xHk2rTOdWXXJM+RDQZJvdx0yEOgC0FgQ1PlJatA5T4=
264-
k8s.io/apiextensions-apiserver v0.35.0/go.mod h1:E1Ahk9SADaLQ4qtzYFkwUqusXTcaV2uw3l14aqpL2LU=
265246
k8s.io/apiextensions-apiserver v0.35.2 h1:iyStXHoJZsUXPh/nFAsjC29rjJWdSgUmG1XpApE29c0=
266247
k8s.io/apiextensions-apiserver v0.35.2/go.mod h1:OdyGvcO1FtMDWQ+rRh/Ei3b6X3g2+ZDHd0MSRGeS8rU=
267-
k8s.io/apimachinery v0.35.0 h1:Z2L3IHvPVv/MJ7xRxHEtk6GoJElaAqDCCU0S6ncYok8=
268-
k8s.io/apimachinery v0.35.0/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns=
269248
k8s.io/apimachinery v0.35.2 h1:NqsM/mmZA7sHW02JZ9RTtk3wInRgbVxL8MPfzSANAK8=
270249
k8s.io/apimachinery v0.35.2/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns=
271-
k8s.io/apiserver v0.35.0 h1:CUGo5o+7hW9GcAEF3x3usT3fX4f9r8xmgQeCBDaOgX4=
272-
k8s.io/apiserver v0.35.0/go.mod h1:QUy1U4+PrzbJaM3XGu2tQ7U9A4udRRo5cyxkFX0GEds=
273250
k8s.io/apiserver v0.35.2 h1:rb52v0CZGEL0FkhjS+I6jHflAp7fZ4MIaKcEHX7wmDk=
274251
k8s.io/apiserver v0.35.2/go.mod h1:CROJUAu0tfjZLyYgSeBsBan2T7LUJGh0ucWwTCSSk7g=
275-
k8s.io/cli-runtime v0.35.0 h1:PEJtYS/Zr4p20PfZSLCbY6YvaoLrfByd6THQzPworUE=
276-
k8s.io/cli-runtime v0.35.0/go.mod h1:VBRvHzosVAoVdP3XwUQn1Oqkvaa8facnokNkD7jOTMY=
277252
k8s.io/cli-runtime v0.35.2 h1:3DNctzpPNXavqyrm/FFiT60TLk4UjUxuUMYbKOE970E=
278253
k8s.io/cli-runtime v0.35.2/go.mod h1:G2Ieu0JidLm5m1z9b0OkFhnykvJ1w+vjbz1tR5OFKL0=
279-
k8s.io/client-go v0.35.0 h1:IAW0ifFbfQQwQmga0UdoH0yvdqrbwMdq9vIFEhRpxBE=
280-
k8s.io/client-go v0.35.0/go.mod h1:q2E5AAyqcbeLGPdoRB+Nxe3KYTfPce1Dnu1myQdqz9o=
281254
k8s.io/client-go v0.35.2 h1:YUfPefdGJA4aljDdayAXkc98DnPkIetMl4PrKX97W9o=
282255
k8s.io/client-go v0.35.2/go.mod h1:4QqEwh4oQpeK8AaefZ0jwTFJw/9kIjdQi0jpKeYvz7g=
283-
k8s.io/component-base v0.35.0 h1:+yBrOhzri2S1BVqyVSvcM3PtPyx5GUxCK2tinZz1G94=
284-
k8s.io/component-base v0.35.0/go.mod h1:85SCX4UCa6SCFt6p3IKAPej7jSnF3L8EbfSyMZayJR0=
285256
k8s.io/component-base v0.35.2 h1:btgR+qNrpWuRSuvWSnQYsZy88yf5gVwemvz0yw79pGc=
286257
k8s.io/component-base v0.35.2/go.mod h1:B1iBJjooe6xIJYUucAxb26RwhAjzx0gHnqO9htWIX+0=
287-
k8s.io/component-helpers v0.35.0 h1:wcXv7HJRksgVjM4VlXJ1CNFBpyDHruRI99RrBtrJceA=
288-
k8s.io/component-helpers v0.35.0/go.mod h1:ahX0m/LTYmu7fL3W8zYiIwnQ/5gT28Ex4o2pymF63Co=
289258
k8s.io/component-helpers v0.35.2 h1:7Ea4CDgHnyOGrl3ZhD8e46SdTyf1itTONnreJ2Q52UM=
290259
k8s.io/component-helpers v0.35.2/go.mod h1:ybIoc8i92FG7xJFrBcEMzB8ul1wlZgfF0I4Z9w0V6VQ=
291260
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
292261
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
293262
k8s.io/kube-openapi v0.0.0-20260127142750-a19766b6e2d4 h1:HhDfevmPS+OalTjQRKbTHppRIz01AWi8s45TMXStgYY=
294263
k8s.io/kube-openapi v0.0.0-20260127142750-a19766b6e2d4/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ=
295-
k8s.io/kubectl v0.35.0 h1:cL/wJKHDe8E8+rP3G7avnymcMg6bH6JEcR5w5uo06wc=
296-
k8s.io/kubectl v0.35.0/go.mod h1:VR5/TSkYyxZwrRwY5I5dDq6l5KXmiCb+9w8IKplk3Qo=
297264
k8s.io/kubectl v0.35.2 h1:aSmqhSOfsoG9NR5oR8OD5eMKpLN9x8oncxfqLHbJJII=
298265
k8s.io/kubectl v0.35.2/go.mod h1:+OJC779UsDJGxNPbHxCwvb4e4w9Eh62v/DNYU2TlsyM=
299-
k8s.io/metrics v0.35.0 h1:xVFoqtAGm2dMNJAcB5TFZJPCen0uEqqNt52wW7ABbX8=
300-
k8s.io/metrics v0.35.0/go.mod h1:g2Up4dcBygZi2kQSEQVDByFs+VUwepJMzzQLJJLpq4M=
301266
k8s.io/metrics v0.35.2 h1:PJRP88qeadR5evg4ZKJAh3NR3ICchwM51/Aidd0LHjc=
302267
k8s.io/metrics v0.35.2/go.mod h1:w1pJmSu2j8ftVI26MGcJtMnpmZ06oKwb4Enm+xVl06Q=
303268
k8s.io/utils v0.0.0-20260108192941-914a6e750570 h1:JT4W8lsdrGENg9W+YwwdLJxklIuKWdRm+BC+xt33FOY=
304269
k8s.io/utils v0.0.0-20260108192941-914a6e750570/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
305-
sigs.k8s.io/controller-runtime v0.23.1 h1:TjJSM80Nf43Mg21+RCy3J70aj/W6KyvDtOlpKf+PupE=
306-
sigs.k8s.io/controller-runtime v0.23.1/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0=
307270
sigs.k8s.io/controller-runtime v0.23.3 h1:VjB/vhoPoA9l1kEKZHBMnQF33tdCLQKJtydy4iqwZ80=
308271
sigs.k8s.io/controller-runtime v0.23.3/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0=
309272
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=

0 commit comments

Comments
 (0)