diff --git a/README.md b/README.md index 7a70cd3e..a8a69e70 100644 --- a/README.md +++ b/README.md @@ -198,7 +198,12 @@ or `--url file:PATH` over literal credential URLs. KTX installs its Python runtime only when a Python-backed command needs it. The runtime lives outside the npm cache, is versioned by the installed CLI -version, and is managed by `ktx runtime` commands: +version, and is managed by `ktx runtime` commands. + +KTX requires `uv` on `PATH` to create the managed runtime. Install `uv` with +your system package manager or the official installer before running Python- +backed KTX commands. KTX doesn't download `uv` automatically; run +`ktx runtime doctor` if runtime installation fails: ```bash npx ktx runtime install --yes diff --git a/examples/package-artifacts/README.md b/examples/package-artifacts/README.md index bd5704db..089bcbbe 100644 --- a/examples/package-artifacts/README.md +++ b/examples/package-artifacts/README.md @@ -11,12 +11,12 @@ The npm smoke project installs the generated public `@kaelio/ktx` tarball, imports the package entry point, and runs installed `ktx` commands against a generated local project. -The managed Python runtime smoke isolates `KTX_RUNTIME_ROOT`, verifies -`ktx runtime status`, runs `ktx sl query --yes` to install the core runtime from -the bundled wheel, checks `ktx runtime doctor`, starts and reuses the managed -daemon, stops it, previews a stale runtime with `ktx runtime prune --dry-run`, -verifies confirmation is required, and removes the stale runtime with -`ktx runtime prune --yes`. +The managed Python runtime smoke requires `uv` on `PATH`, isolates +`KTX_RUNTIME_ROOT`, verifies `ktx runtime status`, runs `ktx sl query --yes` to +install the core runtime from the bundled wheel, checks `ktx runtime doctor`, +starts and reuses the managed daemon, stops it, previews a stale runtime with +`ktx runtime prune --dry-run`, verifies confirmation is required, and removes +the stale runtime with `ktx runtime prune --yes`. The Python smoke project still installs the Python artifacts directly because it verifies the standalone Python distributions that feed the bundled runtime diff --git a/scripts/examples-docs.test.mjs b/scripts/examples-docs.test.mjs index 671ec89a..213b6b25 100644 --- a/scripts/examples-docs.test.mjs +++ b/scripts/examples-docs.test.mjs @@ -148,6 +148,8 @@ describe('standalone example docs', () => { assert.match(rootReadme, /ktx runtime stop/); assert.match(rootReadme, /ktx runtime prune --dry-run/); assert.match(rootReadme, /ktx runtime prune --yes/); + assert.match(rootReadme, /KTX requires `uv` on `PATH`/); + assert.match(rootReadme, /KTX doesn't download `uv` automatically/); assert.match(rootReadme, /ktx serve --mcp stdio/); assert.doesNotMatch(rootReadme, /uv run ktx-daemon serve-http/); assert.doesNotMatch(rootReadme, /--semantic-compute-url http:\/\/127\.0\.0\.1:8765/); @@ -158,6 +160,7 @@ describe('standalone example docs', () => { assert.match(readme, publicPackagePattern('{package}')); assert.match(readme, /managed Python runtime/); + assert.match(readme, /requires `uv` on `PATH`/); assert.match(readme, /ktx runtime status/); assert.match(readme, /ktx runtime doctor/); assert.match(readme, /ktx runtime prune --dry-run/);