kdcube-cli 0.0.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.
- kdcube_cli-0.0.0/LICENSE +21 -0
- kdcube_cli-0.0.0/PKG-INFO +5 -0
- kdcube_cli-0.0.0/README.md +540 -0
- kdcube_cli-0.0.0/pyproject.toml +0 -0
- kdcube_cli-0.0.0/setup.cfg +4 -0
- kdcube_cli-0.0.0/src/kdcube_cli/__init__.py +1 -0
- kdcube_cli-0.0.0/src/kdcube_cli/banner.py +476 -0
- kdcube_cli-0.0.0/src/kdcube_cli/cli.py +5468 -0
- kdcube_cli-0.0.0/src/kdcube_cli/export_live_bundles.py +500 -0
- kdcube_cli-0.0.0/src/kdcube_cli/frontend_config.py +387 -0
- kdcube_cli-0.0.0/src/kdcube_cli/installer.py +4959 -0
- kdcube_cli-0.0.0/src/kdcube_cli/tty_keys.py +74 -0
- kdcube_cli-0.0.0/src/kdcube_cli.egg-info/PKG-INFO +5 -0
- kdcube_cli-0.0.0/src/kdcube_cli.egg-info/SOURCES.txt +15 -0
- kdcube_cli-0.0.0/src/kdcube_cli.egg-info/dependency_links.txt +1 -0
- kdcube_cli-0.0.0/src/kdcube_cli.egg-info/top_level.txt +1 -0
- kdcube_cli-0.0.0/tests/test_cli_descriptors.py +3642 -0
kdcube_cli-0.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Elena Viter
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
# KDCube CLI
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Bootstrap and operate a KDCube platform stack from the command line.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pip install kdcube-cli
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Or with pipx (recommended):
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pipx install kdcube-cli
|
|
19
|
+
```
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## What You Build
|
|
23
|
+
|
|
24
|
+
With KDCube, you author **portable AI application bundles**.
|
|
25
|
+
|
|
26
|
+
A bundle can be a full AI application, an internal tool, a workflow backend,
|
|
27
|
+
a UI-backed product surface, an MCP server, a scheduled automation, or a mix of
|
|
28
|
+
these. It can use KDCube's built-in agent harnesses when agentic behavior is
|
|
29
|
+
needed, or it can be ordinary application code.
|
|
30
|
+
|
|
31
|
+
You focus on product behavior:
|
|
32
|
+
|
|
33
|
+
- what the app or workflow should do
|
|
34
|
+
- which APIs, screens, jobs, tools, MCP servers, or webhooks it exposes
|
|
35
|
+
- what state it reads and writes
|
|
36
|
+
- how users interact through chat, UI, messages, or external events
|
|
37
|
+
- which agent/runtime blocks it wants to use, if any
|
|
38
|
+
- how many conversations, tasks, or long-running threads it maintains
|
|
39
|
+
|
|
40
|
+
KDCube provides the hosting runtime around it: tenant/project isolation, auth,
|
|
41
|
+
routing, streaming, storage, conversation/message handling, service discovery,
|
|
42
|
+
hot reload, deployment wiring, and reusable AI runtime blocks.
|
|
43
|
+
|
|
44
|
+
Those AI runtime blocks can include ReAct-style agents, tool and skill
|
|
45
|
+
execution, isolated code execution, Claude Code integration, MCP access,
|
|
46
|
+
streaming progress, artifacts, and memory/search facilities.
|
|
47
|
+
|
|
48
|
+
In other words: you author the application module; KDCube hosts it and gives it
|
|
49
|
+
access to the platform and agent harnesses it needs.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## What is a bundle?
|
|
54
|
+
|
|
55
|
+
A **bundle** is the deployable application unit of the KDCube platform.
|
|
56
|
+
|
|
57
|
+
Concretely, it is a folder or git-backed source reference that contains bundle
|
|
58
|
+
code plus metadata describing the surfaces KDCube should expose. The platform
|
|
59
|
+
discovers the bundle, loads its entrypoint, wires its declared surfaces into the
|
|
60
|
+
runtime, and manages reload/lifecycle for it.
|
|
61
|
+
|
|
62
|
+
A bundle can expose any combination of:
|
|
63
|
+
|
|
64
|
+
- **HTTP APIs** — authenticated operations APIs or public webhook endpoints
|
|
65
|
+
- **Frontend assets** — bundle-owned UI/static assets served by the platform
|
|
66
|
+
- **MCP servers** — Model Context Protocol endpoints for agent/tool use
|
|
67
|
+
- **Scheduled jobs** — cron-driven background automation
|
|
68
|
+
- **Message handlers** — conversation/message workflows with attachments,
|
|
69
|
+
external events, `steer`, and `followup`
|
|
70
|
+
- **Agent workflows** — ReAct, tool/skill execution, code execution, or other
|
|
71
|
+
runtime blocks provided by KDCube
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Tenant, project, and workdir
|
|
76
|
+
|
|
77
|
+
Every KDCube runtime lives in a **namespaced workdir**:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
~/.kdcube/kdcube-runtime/<tenant>__<project>/
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
`tenant` and `project` together define one **isolated environment** — its own
|
|
84
|
+
config, data, credentials, Postgres/Redis stores, and running stack. Use
|
|
85
|
+
separate namespaces for separate customers, products, or lifecycle stages
|
|
86
|
+
(dev, staging, prod).
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
~/.kdcube/kdcube-runtime/
|
|
90
|
+
├── default__default/ # default scope
|
|
91
|
+
├── acme__staging/ # acme tenant, staging project
|
|
92
|
+
└── acme__prod/ # acme tenant, prod project
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Each scope is fully isolated — its own config, data, logs, and running stack.
|
|
96
|
+
|
|
97
|
+
For local seed descriptors, storage and host path fields may be left `null` or
|
|
98
|
+
omitted to use the tenant/project workdir defaults. For example,
|
|
99
|
+
`storage.kdcube: null` and `storage.bundles: null` resolve to:
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
~/.kdcube/kdcube-runtime/<tenant>__<project>/data/kdcube-storage
|
|
103
|
+
~/.kdcube/kdcube-runtime/<tenant>__<project>/data/bundle-storage
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Explicit `file:///...` values select a custom local host path. Explicit
|
|
107
|
+
`s3://...` values are preserved as remote storage URIs.
|
|
108
|
+
|
|
109
|
+
### One machine, one running stack
|
|
110
|
+
|
|
111
|
+
A machine can hold **many workdirs** on disk, but only **one stack can run at
|
|
112
|
+
a time**. Starting a second workdir while another is live aborts with a message
|
|
113
|
+
showing what is running and how to stop it first.
|
|
114
|
+
|
|
115
|
+
### One workdir, many bundles
|
|
116
|
+
|
|
117
|
+
Inside one `tenant/project` environment you can register and run **any number
|
|
118
|
+
of bundles**. They share the same platform infrastructure — storage, auth,
|
|
119
|
+
Postgres, Redis, and the same deployment boundary.
|
|
120
|
+
|
|
121
|
+
This is the normal model: one environment, multiple application modules running
|
|
122
|
+
side by side.
|
|
123
|
+
|
|
124
|
+
### Bundles are portable across workdirs
|
|
125
|
+
|
|
126
|
+
A bundle is just code (a local path or a git repo) plus a descriptor entry in
|
|
127
|
+
`bundles.yaml`. The same bundle can be registered in multiple workdirs
|
|
128
|
+
independently — each workdir maintains its own config, secrets, and runtime
|
|
129
|
+
state for that bundle. This makes it straightforward to promote a bundle from
|
|
130
|
+
a `dev` environment to `staging` or `prod` by registering it in the target
|
|
131
|
+
workdir and supplying the appropriate descriptor values.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
## Get started
|
|
138
|
+
|
|
139
|
+
### `init` is for first-time setup only
|
|
140
|
+
|
|
141
|
+
`kdcube init` creates a brand-new namespaced runtime workdir. It refuses if
|
|
142
|
+
the target workdir is already initialized (i.e. has `install-meta.json`).
|
|
143
|
+
To pick up platform code changes or rebuild images on an existing workdir,
|
|
144
|
+
use [`kdcube refresh`](#kdcube-refresh) instead.
|
|
145
|
+
|
|
146
|
+
### Plain init
|
|
147
|
+
|
|
148
|
+
The fastest way to get a local KDCube stack running — pick a tenant and a
|
|
149
|
+
project; the CLI creates the runtime under the platform default base
|
|
150
|
+
`~/.kdcube/kdcube-runtime/<tenant>__<project>/`:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
kdcube init --tenant acme --project staging
|
|
154
|
+
kdcube start --tenant acme --project staging
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
A plain init stages the **configured base complectation**: Connection Hub
|
|
158
|
+
(identity, consent, delegated credentials), KDCube Services (managed MCP +
|
|
159
|
+
named services), User Memories, and the workspace showcase app — as a pure
|
|
160
|
+
config overlay on the bundles shipped in the image. Default identity is the
|
|
161
|
+
bundle-session flavor (Google sign-in validated by the workspace app,
|
|
162
|
+
KDCube session issued by Connection Hub). Two env inputs are substituted
|
|
163
|
+
into the staged defaults when set:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
export KDCUBE_PUBLIC_HOST="kdcube.example.com" # OAuth redirects, webhooks
|
|
167
|
+
export KDCUBE_ADMIN_EMAIL="admin@example.com" # bootstrapped as super-admin
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Init ends with a **first-run checklist** of placeholders still unfilled;
|
|
171
|
+
features backed by an unfilled slot stay inactive, everything else runs.
|
|
172
|
+
Step-by-step recipes: [clean install](../../../docs/recipes/operations/install-clean-README.md) ·
|
|
173
|
+
[from a descriptor set](../../../docs/recipes/operations/install-from-descriptors-README.md) ·
|
|
174
|
+
[daily operations](../../../docs/recipes/operations/operate-runtime-README.md).
|
|
175
|
+
|
|
176
|
+
To fill common service secrets during init:
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
kdcube init --tenant acme --project staging --prompt-secrets
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
To stage known secret values without prompts, use dotted descriptor keys:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
kdcube init --tenant acme --project staging \
|
|
186
|
+
--set-secret services.openai.api_key "sk-..." \
|
|
187
|
+
--set-secret services.anthropic.api_key "sk-ant-..."
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Descriptor-driven init (reproducible / automated)
|
|
191
|
+
|
|
192
|
+
When you have a descriptor set (`assembly.yaml`, `bundles.yaml`, etc.):
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
kdcube init --tenant acme --project staging \
|
|
196
|
+
--descriptors-location /path/to/descriptors
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
With a local platform source tree and image build:
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
kdcube init --tenant acme --project staging \
|
|
203
|
+
--descriptors-location /path/to/descriptors \
|
|
204
|
+
--path /path/to/kdcube-ai-app \
|
|
205
|
+
--build
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Typical day-to-day flow
|
|
209
|
+
|
|
210
|
+
Pass `--tenant` / `--project` (or set them with `kdcube defaults`) to point
|
|
211
|
+
each command at the runtime you want. `--quiet` suppresses the banner; the
|
|
212
|
+
CLI auto-suppresses when stdout is not a TTY and when `--json` is requested.
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
# Start the stack
|
|
216
|
+
kdcube start --tenant acme --project staging
|
|
217
|
+
|
|
218
|
+
# Pick up platform code changes (rebuild images + restart)
|
|
219
|
+
kdcube refresh --tenant acme --project staging --build
|
|
220
|
+
kdcube refresh --tenant acme --project staging --release 2026.5.22.001 --build
|
|
221
|
+
|
|
222
|
+
# After editing a bundle's config or code — reload without a full restart
|
|
223
|
+
kdcube bundle reload <bundle_id> --tenant acme --project staging
|
|
224
|
+
|
|
225
|
+
# Stop the stack
|
|
226
|
+
kdcube stop --tenant acme --project staging
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
If you've set `kdcube defaults --default-tenant acme --default-project staging`,
|
|
230
|
+
you can drop `--tenant`/`--project` from these commands entirely.
|
|
231
|
+
|
|
232
|
+
### Runtime flow map
|
|
233
|
+
|
|
234
|
+
Use these three flows as the mental model for local KDCube operation.
|
|
235
|
+
|
|
236
|
+
Init is first-time setup for a runtime workdir:
|
|
237
|
+
|
|
238
|
+
```text
|
|
239
|
+
seed descriptors platform source
|
|
240
|
+
assembly.yaml / bundles.yaml / ... --path / --upstream / --latest / --release
|
|
241
|
+
| |
|
|
242
|
+
+---------------+----------------+
|
|
243
|
+
v
|
|
244
|
+
kdcube init --descriptors-location <dir> --build
|
|
245
|
+
|
|
|
246
|
+
v
|
|
247
|
+
~/.kdcube/kdcube-runtime/<tenant>__<project>/
|
|
248
|
+
config/*.yaml + repo/ + compose/env files + data/
|
|
249
|
+
|
|
|
250
|
+
v
|
|
251
|
+
kdcube start
|
|
252
|
+
|
|
|
253
|
+
v
|
|
254
|
+
http://localhost:<port>/platform/chat
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
Refresh is for an already initialized runtime. It preserves staged descriptors:
|
|
258
|
+
|
|
259
|
+
```text
|
|
260
|
+
existing runtime workdir
|
|
261
|
+
config/*.yaml ----------------------------- preserved
|
|
262
|
+
|
|
|
263
|
+
| optional platform source selector
|
|
264
|
+
| none / --path / --upstream / --latest / --release
|
|
265
|
+
v
|
|
266
|
+
kdcube refresh [selector] --build
|
|
267
|
+
|
|
|
268
|
+
+-- with --path: copy that local checkout into workdir/repo first
|
|
269
|
+
+-- with --upstream/--latest/--release: update workdir/repo to that ref
|
|
270
|
+
+-- with no selector: rebuild the already staged/recorded source
|
|
271
|
+
+-- with --build: rebuild images
|
|
272
|
+
+-- unless --no-restart: restart the stack
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
Bundle descriptor apply and reload are bundle-only operations. They do not
|
|
276
|
+
rebuild platform images or restart Docker:
|
|
277
|
+
|
|
278
|
+
```text
|
|
279
|
+
seed content descriptors
|
|
280
|
+
bundles.yaml + bundles.secrets.yaml
|
|
281
|
+
|
|
|
282
|
+
v
|
|
283
|
+
kdcube bundle config apply --descriptors-location <dir> [--dry-run]
|
|
284
|
+
|
|
|
285
|
+
v
|
|
286
|
+
active runtime bundle descriptors
|
|
287
|
+
workdir/config/bundles.yaml + bundles.secrets.yaml
|
|
288
|
+
|
|
|
289
|
+
v
|
|
290
|
+
kdcube bundle reload <bundle_id>
|
|
291
|
+
|
|
|
292
|
+
v
|
|
293
|
+
proc clears bundle cache and reloads code/config on the next request
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
Use `kdcube config export` before replacing live runtime descriptors with an
|
|
297
|
+
older seed copy. By default it writes `bundles.yaml` and
|
|
298
|
+
`bundles.secrets.yaml`; add `--include-platform-descriptors` to also export
|
|
299
|
+
`assembly.yaml`, `secrets.yaml`, and `gateway.yaml`. Local non-git bundle
|
|
300
|
+
paths are normalized back to host paths, while git-backed entries keep
|
|
301
|
+
repo/ref/subdir and drop materialized runtime paths. Local host-managed
|
|
302
|
+
Postgres/Redis entries are exported as descriptor-facing `localhost`, even
|
|
303
|
+
though the running containers use `host.docker.internal`. CLI-managed storage
|
|
304
|
+
and runtime host paths are exported as `null`; `host_bundles_path` is preserved
|
|
305
|
+
as the source root for unmanaged local bundles. Generated service `log_dir:
|
|
306
|
+
/logs` entries are omitted, so a later `init` can derive them from that
|
|
307
|
+
runtime's workdir.
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
kdcube config export \
|
|
311
|
+
--tenant acme \
|
|
312
|
+
--project staging \
|
|
313
|
+
--out-dir /tmp/kdcube-export \
|
|
314
|
+
--include-platform-descriptors
|
|
315
|
+
|
|
316
|
+
# after review/editing the exported files
|
|
317
|
+
kdcube config import \
|
|
318
|
+
--tenant acme \
|
|
319
|
+
--project staging \
|
|
320
|
+
--descriptors-location /tmp/kdcube-export \
|
|
321
|
+
--include-platform-descriptors
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
`config import --include-platform-descriptors` treats the reviewed descriptor
|
|
325
|
+
directory as the local runtime authority and overwrites `assembly.yaml`,
|
|
326
|
+
`secrets.yaml`, and `gateway.yaml` exactly. It also stages bundle descriptors
|
|
327
|
+
and regenerates runtime env/config files from the imported platform
|
|
328
|
+
descriptors. Restart the stack after importing platform descriptors so running
|
|
329
|
+
services pick up service-level env changes.
|
|
330
|
+
|
|
331
|
+
### Advanced workdir placement
|
|
332
|
+
|
|
333
|
+
When the runtime must live outside the default base (`~/.kdcube/kdcube-runtime`),
|
|
334
|
+
two advanced flags are available on `init` and `refresh`:
|
|
335
|
+
|
|
336
|
+
- `--workdir <full-path>` — explicit fully-qualified namespaced runtime
|
|
337
|
+
(trailing path segment must contain `__`, e.g.
|
|
338
|
+
`/opt/kdcube/acme__staging`).
|
|
339
|
+
- `--workdir-base <base> --tenant T --project P` — the CLI composes
|
|
340
|
+
`<base>/<tenant>__<project>/` for you.
|
|
341
|
+
|
|
342
|
+
```bash
|
|
343
|
+
# Explicit full path:
|
|
344
|
+
kdcube init --workdir /opt/kdcube/acme__staging
|
|
345
|
+
kdcube refresh --workdir /opt/kdcube/acme__staging --build
|
|
346
|
+
|
|
347
|
+
# Non-default base:
|
|
348
|
+
kdcube init --workdir-base /opt/kdcube --tenant acme --project staging
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
`--workdir` and `--workdir-base` are mutually exclusive. Other subcommands
|
|
352
|
+
(`start`, `stop`, `reload`, `bundle`, `config`, `info`, `export`) accept the same
|
|
353
|
+
`--tenant`/`--project` shape and a `--workdir` for the explicit form.
|
|
354
|
+
|
|
355
|
+
### `kdcube refresh`
|
|
356
|
+
|
|
357
|
+
Use `kdcube refresh` to apply platform-side changes (new images, updated
|
|
358
|
+
SDK code) on an existing initialized workdir. It stops the stack, rebuilds
|
|
359
|
+
images when `--build` is given, and restarts — **without** touching staged
|
|
360
|
+
descriptors (`bundles.yaml`, `bundles.secrets.yaml`, `assembly.yaml`,
|
|
361
|
+
`secrets.yaml`, `gateway.yaml`):
|
|
362
|
+
|
|
363
|
+
```bash
|
|
364
|
+
kdcube refresh --workdir ~/.kdcube/kdcube-runtime/<tenant>__<project> --build
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
In `custom-ui-managed-infra` mode, `--build` also rebuilds `proxylogin`
|
|
368
|
+
because delegated-auth behavior is part of the local platform surface.
|
|
369
|
+
|
|
370
|
+
Refresh also accepts the same platform source selectors as `init`:
|
|
371
|
+
`--latest`, `--upstream`, and `--release <ref>`. When you pass
|
|
372
|
+
`--path /path/to/kdcube-ai-app` without one of those selectors, refresh
|
|
373
|
+
restages that local platform source into `<workdir>/repo` before rebuilding.
|
|
374
|
+
When you do pass a selector, refresh checks out that selected ref and then
|
|
375
|
+
uses the staged `<workdir>/repo` copy. This keeps all compose build contexts
|
|
376
|
+
aligned with the same source tree while preserving staged descriptors.
|
|
377
|
+
|
|
378
|
+
`refresh` refuses if the workdir is not initialized; pair with
|
|
379
|
+
`kdcube init` for the first run, then use `refresh` for every subsequent
|
|
380
|
+
re-init.
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
## Persistent defaults
|
|
385
|
+
|
|
386
|
+
Save your most-used workdir so you can omit `--workdir` from every command:
|
|
387
|
+
|
|
388
|
+
```bash
|
|
389
|
+
kdcube defaults \
|
|
390
|
+
--default-workdir ~/.kdcube/kdcube-runtime/<tenant>__<project> \
|
|
391
|
+
--default-tenant <tenant> \
|
|
392
|
+
--default-project <project>
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
## Command groups
|
|
398
|
+
|
|
399
|
+
### Lifecycle
|
|
400
|
+
|
|
401
|
+
| Command | What it does |
|
|
402
|
+
|---|---|
|
|
403
|
+
| `kdcube init` | First-time setup of a fresh runtime workdir: stage descriptors, generate env files, optionally stage local secrets, optionally build images. Refuses if the target workdir is already initialized. |
|
|
404
|
+
| `kdcube refresh` | Re-init an existing workdir: optionally select platform source with `--latest`, `--upstream`, or `--release <ref>`, stop the stack, rebuild images with `--build`, restart. Never touches staged descriptors. |
|
|
405
|
+
| `kdcube start` | Start the platform stack for an initialized workdir |
|
|
406
|
+
| `kdcube stop` | Stop the stack; `--remove-volumes` also wipes local volumes |
|
|
407
|
+
|
|
408
|
+
### Runtime operations
|
|
409
|
+
|
|
410
|
+
| Command | What it does |
|
|
411
|
+
|---|---|
|
|
412
|
+
| `kdcube bundle reload <bundle_id> [--json] [--quiet]` | Reapply bundle config and clear proc caches — no full restart needed |
|
|
413
|
+
| `kdcube bundle <bundle_id>` | Create, update, or delete a staged bundle entry |
|
|
414
|
+
| `kdcube bundle config apply --descriptors-location <dir> [--dry-run] [--reload]` | User/operator flow to reapply seed `bundles.yaml` / `bundles.secrets.yaml` to an existing runtime — no platform refresh |
|
|
415
|
+
| `kdcube config export --out-dir <dir> [--include-platform-descriptors]` | Export live local runtime descriptors for review/reuse |
|
|
416
|
+
| `kdcube config export --tenant <t> --project <p> --aws-region <r> --out-dir <dir>` | Export deployment-scoped bundle descriptors from AWS Secrets Manager |
|
|
417
|
+
| `kdcube config import --descriptors-location <dir> [--include-platform-descriptors] [--dry-run] [--reload]` | Import reviewed runtime descriptors into an existing local runtime |
|
|
418
|
+
|
|
419
|
+
### Configuration
|
|
420
|
+
|
|
421
|
+
| Command | What it does |
|
|
422
|
+
|---|---|
|
|
423
|
+
| `kdcube defaults` | Save persistent `--workdir`, `--tenant`, `--project` defaults |
|
|
424
|
+
| `kdcube info` | Show global CLI state (defaults + running deployment) |
|
|
425
|
+
| `kdcube info --show-defaults` | Show only the stored CLI defaults |
|
|
426
|
+
| `kdcube info --show-current-running-runtime` | Show only the currently running deployment |
|
|
427
|
+
| `kdcube info --workdir <path>` | Show resolved runtime info for a specific workdir |
|
|
428
|
+
| `kdcube info --tenant <t> --project <p>` | Show runtime info for tenant/project under the default runtime base |
|
|
429
|
+
| `kdcube init --reset-config` | (Legacy) Re-prompt for config values on a fresh init. Not applicable to already-initialized workdirs; use `kdcube refresh` for re-init. |
|
|
430
|
+
| `kdcube clean` | Clean local Docker cache and unused KDCube images |
|
|
431
|
+
|
|
432
|
+
---
|
|
433
|
+
|
|
434
|
+
## `kdcube bundle` — manage bundles at runtime
|
|
435
|
+
|
|
436
|
+
Create, update, or delete a staged bundle entry without touching YAML files by
|
|
437
|
+
hand. Changes are staged and take effect after `kdcube bundle reload`.
|
|
438
|
+
|
|
439
|
+
**Source mode** — point the bundle at a local path or a git repo:
|
|
440
|
+
|
|
441
|
+
```bash
|
|
442
|
+
# Local host path under paths.host_bundles_path; CLI stores the /bundles/... path
|
|
443
|
+
kdcube bundle <bundle_id> --local-path /Users/you/src/my.bundle
|
|
444
|
+
|
|
445
|
+
# Already runtime-visible path is also accepted
|
|
446
|
+
kdcube bundle <bundle_id> --local-path /bundles/my.bundle
|
|
447
|
+
|
|
448
|
+
# Git repo (platform clones to /managed-bundles/ on reload)
|
|
449
|
+
kdcube bundle <bundle_id> \
|
|
450
|
+
--git-repo git@github.com:org/my-bundle.git \
|
|
451
|
+
--git-ref 2026.4.30
|
|
452
|
+
|
|
453
|
+
# Git monorepo — bundle lives in a subdirectory
|
|
454
|
+
kdcube bundle <bundle_id> \
|
|
455
|
+
--git-repo git@github.com:org/monorepo.git \
|
|
456
|
+
--git-ref main \
|
|
457
|
+
--git-subdir src/my.bundle
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
**Identity and config/secrets patch:**
|
|
461
|
+
|
|
462
|
+
```bash
|
|
463
|
+
# Set display name, entry module, singleton flag
|
|
464
|
+
kdcube bundle <bundle_id> \
|
|
465
|
+
--name "My Bundle" --module entrypoint --singleton
|
|
466
|
+
|
|
467
|
+
# Patch config and secrets by dotted key path
|
|
468
|
+
kdcube bundle <bundle_id> \
|
|
469
|
+
--set-config routines.heartbeat.cron "*/5 * * * *" \
|
|
470
|
+
--set-secret api.token "sk-..." \
|
|
471
|
+
--del-config features.legacy_mode
|
|
472
|
+
|
|
473
|
+
# Apply all staged changes
|
|
474
|
+
kdcube bundle reload <bundle_id>
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
Normal reload output is concise and operator-facing. Use `--verbose` only when
|
|
478
|
+
you need the raw Docker Compose command and full proc response. Use `--json`
|
|
479
|
+
for scriptable output.
|
|
480
|
+
|
|
481
|
+
```bash
|
|
482
|
+
# Delete a bundle entry (also removes its secrets entry)
|
|
483
|
+
kdcube bundle <bundle_id> --delete
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
**Descriptor apply** — when a user intentionally edits seed `bundles.yaml` /
|
|
487
|
+
`bundles.secrets.yaml` and wants to reapply that descriptor source of truth to
|
|
488
|
+
an existing runtime:
|
|
489
|
+
|
|
490
|
+
```bash
|
|
491
|
+
kdcube bundle config apply \
|
|
492
|
+
--tenant acme \
|
|
493
|
+
--project staging \
|
|
494
|
+
--descriptors-location /path/to/descriptors \
|
|
495
|
+
--dry-run
|
|
496
|
+
|
|
497
|
+
kdcube bundle config apply \
|
|
498
|
+
--tenant acme \
|
|
499
|
+
--project staging \
|
|
500
|
+
--descriptors-location /path/to/descriptors \
|
|
501
|
+
--reload
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
This is not a platform refresh: it touches only `bundles.yaml` and optional
|
|
505
|
+
`bundles.secrets.yaml` in the active runtime config directory. Host local
|
|
506
|
+
bundle paths from seed descriptors are translated to runtime `/bundles/...`
|
|
507
|
+
paths before staging.
|
|
508
|
+
|
|
509
|
+
**Status** — inspect one explicit bundle entry:
|
|
510
|
+
|
|
511
|
+
```bash
|
|
512
|
+
kdcube bundle status <bundle_id> --workdir ~/.kdcube/kdcube-runtime/<tenant>__<project>
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
By default this reports staged descriptor/path/runtime-service diagnostics only
|
|
516
|
+
and does not list other bundles. For local operator diagnostics, add `--live`
|
|
517
|
+
to ask localhost `chat-proc` to validate that same explicit bundle id:
|
|
518
|
+
|
|
519
|
+
```bash
|
|
520
|
+
kdcube bundle status <bundle_id> --live --json --workdir ~/.kdcube/kdcube-runtime/<tenant>__<project>
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
`--live` is an operator-level check for someone with local workdir and Docker
|
|
524
|
+
access. It does not emulate an end-user session or frontend visibility rules.
|
|
525
|
+
|
|
526
|
+
For scriptable runtime inspection, `kdcube info --json` emits defaults, the
|
|
527
|
+
running deployment lock, and runtime mount details when a workdir is selected.
|
|
528
|
+
|
|
529
|
+
When `--local-path` or `--git-repo` is given and the bundle doesn't exist yet,
|
|
530
|
+
the command creates a new entry (upsert). All other flags require an existing
|
|
531
|
+
entry. All non-delete flags can be combined in one invocation (single atomic
|
|
532
|
+
write). `--git-ref` is required with `--git-repo`. `--git-subdir` requires
|
|
533
|
+
`--git-repo`.
|
|
534
|
+
|
|
535
|
+
---
|
|
536
|
+
|
|
537
|
+
## Full documentation
|
|
538
|
+
|
|
539
|
+
See `additional-README.md` in this package or the platform docs:
|
|
540
|
+
https://github.com/kdcube/kdcube-ai-app/blob/main/app/ai-app/docs/service/cicd/cli-README.md
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|