feat(cli): add uwf config get/set/list subcommand #527
Reference in New Issue
Block a user
Delete Branch "fix/526-config-subcommand"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What
Implements
uwf configsubcommand with three operations:uwf config list- Display all configuration with masked API keysuwf config get <key>- Retrieve specific config value using dot notationuwf config set <key> <value>- Update config value with auto-creation of parent objectsWhy
Resolves issue #526. Provides a CLI interface for managing the workflow configuration file (
~/.uncaged/workflow/config.yaml) without manual YAML editing.Changes
New Files
packages/cli-workflow/src/commands/config.ts (226 lines)
packages/cli-workflow/src/tests/config.test.ts (467 lines)
Modified Files
Features
✅ uwf config list - Display all configuration with masked API keys (
***MASKED***)✅ uwf config get - Supports dot notation for nested access (e.g.,
providers.dashscope.baseUrl)✅ uwf config set - Auto-creates intermediate objects, preserves existing config structure
✅ Respects global
--formatflag (json/yaml)✅ Proper error handling for missing keys, invalid paths, and malformed YAML
Testing
Project Conventions
✅ Functional-first approach (no classes, all functions)
✅ Named exports only
✅ No optional properties (explicit
T | null)✅ TDD methodology (tests written first per specification)
✅ Proper error handling
✅ Biome formatting and linting rules
✅ Structured logging (no direct console usage in production code)
Ref
Fixes #526
Code Review — 小橘 🍊
Verdict: ⚠️ Changes Requested (1 issue, 2 suggestions)
⚠️ Warning
maskApiKeys只 maskapiKeyEnv字段名 — 它 mask 的是环境变量名(如DASHSCOPE_API_KEY),不是实际的 API key 值。字段名本身不敏感,masking 它反而让uwf config list失去了诊断价值(用户看不到应该设置哪个环境变量)。建议:要么不 mask(环境变量名不是 secret),要么如果 config 里存了实际 key 值才 mask 那个。💡 Suggestions
parseArgsValue只处理args这一个 key — 如果以后有其他 array 类型的 config 值,这个特殊处理就不够。考虑自动检测 JSON array/object 输入,或者加--jsonflag。不阻塞,当前够用。cmdConfigSet创建空文件时没有 YAML header 注释 — setup 生成的 config 有注释说明各字段含义,config set 创建的新文件是裸 YAML。Minor,不阻塞。✅ Looks Good
interface,用type+Record<string, unknown>,符合规范Reviewed by 小橘 🍊(NEKO Team)
@@ -0,0 +107,4 @@const cloned = JSON.parse(JSON.stringify(config)) as Record<string, unknown>;// Mask apiKeyEnv values in providersif (cloned.providers && typeof cloned.providers === "object") {⚠️
apiKeyEnv存的是环境变量名(如DASHSCOPE_API_KEY),不是 key 值本身。Mask 环境变量名会让用户看不到该设置哪个环境变量。建议不 mask,或者只在 config 里存了实际 key 值时才 mask。@@ -0,0 +152,4 @@/*** Parse value for args key (must be JSON array)*/function parseArgsValue(value: string): unknown {💡
lastSegment === "args"是硬编码的特殊处理。考虑改成自动 JSON parse(如果 value 以[或{开头就尝试 parse),这样更通用。