feat(cli): friendly missing-project status and per-project daemon state (#87)

- Block project-aware commands when ktx.yaml is absent and render a
  friendly "run ktx setup" message (plain or JSON) instead of leaking
  ENOENT or "Project: ..." noise.
- Make ktx status project detect the missing config and emit the same
  message via a shared renderMissingProjectMessage helper.
- Move the managed Python daemon state, stdout, and stderr files out of
  the shared runtime root into {projectDir}/.ktx/runtime so multiple
  projects no longer share a single daemon record.
- Simplify the runtime install root to ~/.ktx/runtime on every platform
  and split the daemon-specific paths into managedPythonDaemonLayout,
  threading projectDir through start, stop, and stop-all paths.
This commit is contained in:
Andrey Avtomonov 2026-05-14 14:35:55 +02:00 committed by GitHub
parent 6d7d90571e
commit e28b10454a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
23 changed files with 450 additions and 248 deletions

View file

@ -34,6 +34,7 @@ export type ManagedPythonHttpPostJson = (
export interface ManagedPythonCoreDaemonOptions {
cliVersion: string;
projectDir: string;
installPolicy: KtxManagedPythonInstallPolicy;
io: KtxCliIo;
ensureRuntime?: (options: {
@ -44,6 +45,7 @@ export interface ManagedPythonCoreDaemonOptions {
}) => Promise<ManagedPythonCommandRuntime>;
startDaemon?: (options: {
cliVersion: string;
projectDir: string;
features: ['core'];
force: false;
}) => Promise<ManagedPythonDaemonStartResult>;
@ -135,6 +137,7 @@ export function createManagedPythonDaemonBaseUrlResolver(
});
const daemon = await startDaemon({
cliVersion: options.cliVersion,
projectDir: options.projectDir,
features: ['core'],
force: false,
});