@kaged/local-config

TOML-backed operator-local configuration with Zod validation, file I/O, provider management, tool overrides, and Langfuse tracing settings

6
source files
2
test files
~1.5k
lines
✓ 95 pass
tests
pass
typecheck
clean
lint

Test results 95

resolveLocalConfigPath > per-user mode with xdgConfigHome [0.100ms]
resolveLocalConfigPath > per-user mode falls back to userHome/.config [0.030ms]
resolveLocalConfigPath > per-user mode throws without userHome or xdgConfigHome [0.070ms]
resolveLocalConfigPath > xdgConfigHome takes priority over userHome in per-user mode [0.030ms]
resolveLocalConfigPath > system-wide mode builds user-specific path [0.020ms]
resolveLocalConfigPath > system-wide mode throws without kagedHome [0.030ms]
resolveLocalConfigPath > system-wide mode throws without userId [0.020ms]
resolveLocalConfigPath > override takes precedence over everything [0.030ms]
resolveLocalConfigPath > override works in system-wide mode too [0.020ms]
serializeLocalConfig > empty config produces valid TOML [1.12ms]
serializeLocalConfig > config with operator_name round-trips [1.33ms]
serializeLocalConfig > config with aliases round-trips [0.390ms]
serializeLocalConfig > config with providers round-trips [0.300ms]
serializeLocalConfig > config with projects round-trips [1.18ms]
serializeLocalConfig > config with audit section round-trips [0.220ms]
serializeLocalConfig > config with plugins round-trips [0.540ms]
serializeLocalConfig > full config round-trips [0.520ms]
generateDefaultLocalToml > produces valid TOML [0.170ms]
generateDefaultLocalToml > starts with comment header [0.030ms]
generateDefaultLocalToml > parses to config with no projects and no aliases [0.110ms]
readLocalConfigFile > file I/O > reads and parses valid TOML file [2.83ms]
readLocalConfigFile > file I/O > throws ENOENT for missing file [0.480ms]
readLocalConfigFile > file I/O > returns parse errors for invalid TOML [1.28ms]
readLocalConfigFile > file I/O > reads empty file as empty config [0.550ms]
writeLocalConfigFile > file I/O > writes valid TOML that can be read back [1.05ms]
writeLocalConfigFile > file I/O > creates parent directories [0.640ms]
writeLocalConfigFile > file I/O > file has mode 0600 [0.400ms]
writeLocalConfigFile > file I/O > overwrites existing file [0.550ms]
ensureLocalConfigFile > file I/O > creates file if missing and returns created=true [0.850ms]
ensureLocalConfigFile > file I/O > returns existing file with created=false [0.430ms]
ensureLocalConfigFile > file I/O > created file starts with comment header [0.430ms]
ensureLocalConfigFile > file I/O > created file has mode 0600 [0.560ms]
ensureLocalConfigFile > file I/O > idempotent — second call returns created=false [0.460ms]
addProjectEntry > file I/O > adds entry to empty config [0.750ms]
addProjectEntry > file I/O > appends to existing projects list [0.940ms]
addProjectEntry > file I/O > upserts entry with same id [0.760ms]
addProjectEntry > file I/O > preserves other config sections [0.660ms]
addProjectEntry > file I/O > creates file if it does not exist [0.480ms]
addProjectEntry > file I/O > persists to disk — survives re-read [0.680ms]
removeProjectEntry > file I/O > removes existing entry [0.980ms]
removeProjectEntry > file I/O > no-op for unknown id [0.630ms]
removeProjectEntry > file I/O > preserves other entries [1.92ms]
removeProjectEntry > file I/O > preserves other config sections [0.680ms]
removeProjectEntry > file I/O > persists to disk — survives re-read [0.850ms]
TOML parsing > parses full config successfully [0.440ms]
TOML parsing > parses minimal config [0.190ms]
TOML parsing > empty string parses to empty config [0.080ms]
TOML parsing > invalid TOML returns error [0.090ms]
TOML parsing > ui section parsed correctly [0.330ms]
TOML parsing > invalid ui theme rejected [0.600ms]
TOML parsing > provider fields parsed [0.310ms]
TOML parsing > plugin entries parsed [0.270ms]
TOML parsing > project registry parsed [0.250ms]
TOML parsing > invalid project status rejected [0.140ms]
TOML parsing > audit config parsed [0.290ms]
alias name validation > valid alias names accepted [0.050ms]
alias name validation > alias with colon rejected [0.030ms]
alias name validation > reserved names rejected [0.050ms]
alias name validation > invalid pattern rejected [0.020ms]
alias name validation > parse warns on invalid alias names [0.080ms]
alias target validation > valid targets accepted [0.020ms]
alias target validation > target without colon rejected [0.020ms]
alias target validation > empty provider rejected [0.020ms]
alias target validation > empty model rejected [0.020ms]
alias target validation > parse warns on invalid alias targets [0.050ms]
alias resolution > resolves known alias to provider + model [0.120ms]
alias resolution > resolves local provider alias [0.040ms]
alias resolution > unresolved alias returns alias_unresolved [0.030ms]
alias resolution > alias with missing provider returns provider_missing [0.030ms]
alias resolution > alias chaining (alias → alias) is rejected [0.030ms]
alias resolution > direct provider:model passthrough resolves [0.030ms]
alias resolution > direct provider:model with missing provider [0.030ms]
checkProjectAliases > all aliases resolved [0.090ms]
checkProjectAliases > unresolved alias reported [0.030ms]
checkProjectAliases > empty required list returns empty results [0.030ms]
secret redaction > api_key is redacted [0.180ms]
secret redaction > api_key_env is NOT redacted [0.080ms]
secret redaction > original config is not mutated [0.070ms]
secret redaction > config without providers is unchanged [0.050ms]
plugin store > local plugin is available to all projects [0.080ms]
plugin store > project-scoped plugin has project list [0.110ms]
plugin store > plugin with config [0.090ms]
plugin store > plugin with system_config [0.070ms]
project registry > project with all fields [0.200ms]
project registry > project accent_color is optional [0.120ms]
project registry > project label is parsed [0.100ms]
project registry > project label is optional [0.060ms]
project registry > legacy nickname field still parses (back-compat) [0.070ms]
project registry > multiple projects [0.080ms]
project registry > all three status values accepted [0.140ms]
provider config > provider with api_key_env [0.060ms]
provider config > provider with inline api_key [0.060ms]
provider config > provider without any auth (ollama-style) [0.060ms]
provider config > quoted provider name with dash [0.130ms]
provider config > invalid base_url rejected [0.480ms]

Mentioned in

Type Document
adr ADR-0008: Plugins are subprocesses over JSON-RPC on stdio
adr ADR-0010: kaged supports per-user and system-wide deployment, equally
adr ADR-0011: Projects are portable; operator-local concerns live in local config
adr ADR-0014: All LLM providers route through @kaged/llm; Mastra integrates via a LanguageModelV2 shim
adr ADR-0023: Project-plugin lifecycle hooks, per-agent declaration, isolation as a core principle
adr ADR-0024: Context compaction is kaged-owned, layered, observable, and operator-tunable
adr ADR-0033: Tool dot-namespace convention
spec Spec: Agent Harness
spec Spec: Daemon
spec Spec: HTTP + WebSocket API
spec Spec: LLM Provider Interface
spec Spec: Local config
spec Spec: Operational Logging
spec Spec: Plugin Host
spec Spec: Project DSL
spec Spec: Session Manager