agentic-flow-kit 2.0.0 → 2.1.0

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.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +92 -23
  3. package/bin/flow-kit.mjs +3 -1
  4. package/locales/en/installer.json +87 -2
  5. package/locales/en/overrides/.codebuddy/skills/tfs-pr/SKILL.md +1 -1
  6. package/locales/en/overrides/workflow/README.md +2 -0
  7. package/locales/zh-CN/installer.json +87 -2
  8. package/package.json +2 -2
  9. package/schemas/install-manifest.schema.json +3 -1
  10. package/schemas/project-profile.schema.json +1 -1
  11. package/src/cli/args.mjs +3 -1
  12. package/src/cli/main.mjs +9 -2
  13. package/src/commands/doctor.mjs +50 -4
  14. package/src/commands/install.mjs +160 -13
  15. package/src/hosts/registry.mjs +154 -10
  16. package/src/i18n.mjs +3 -0
  17. package/src/install/apply.mjs +17 -3
  18. package/src/install/frontmatter.mjs +84 -0
  19. package/src/install/plan.mjs +174 -16
  20. package/src/models/known.mjs +13 -0
  21. package/src/models/probe.mjs +163 -0
  22. package/src/models/resolve.mjs +312 -0
  23. package/src/render/tokens.mjs +56 -9
  24. package/src/tui/ansi.mjs +55 -0
  25. package/src/tui/flows.mjs +306 -0
  26. package/src/tui/prompts.mjs +139 -0
  27. package/src/tui/screen.mjs +217 -0
  28. package/src/tui/widgets.mjs +111 -0
  29. package/src/tui/wizard.mjs +68 -0
  30. package/templates/engine/.agents/commands/new-task.md +2 -2
  31. package/templates/engine/.agents/commands/pipeline-run.md +5 -1
  32. package/templates/engine/.agents/commands/stages.md +2 -1
  33. package/templates/engine/.agents/config/agent-eval.json +17 -0
  34. package/templates/engine/.agents/config/mechanism-registry.md +2 -1
  35. package/templates/engine/.agents/config/memory-tiers.json +13 -0
  36. package/templates/engine/.agents/config/pipeline.json +36 -0
  37. package/templates/engine/.agents/config/steering.json +28 -0
  38. package/templates/engine/.agents/evals/README.md +49 -0
  39. package/templates/engine/.agents/evals/tasks.tsv +6 -0
  40. package/templates/engine/.agents/hooks/pre-write-check.cjs +27 -0
  41. package/templates/engine/.agents/notes/injected-memory.md +14 -0
  42. package/templates/engine/.agents/notes/steering-tiers.md +28 -0
  43. package/templates/engine/.agents/scripts/agent-eval.mjs +268 -0
  44. package/templates/engine/.agents/scripts/check-pipeline-state.mjs +85 -0
  45. package/templates/engine/.agents/scripts/claims.mjs +166 -0
  46. package/templates/engine/.agents/scripts/dream-run.mjs +78 -3
  47. package/templates/engine/.agents/scripts/fix-task.mjs +77 -0
  48. package/templates/engine/.agents/scripts/memory-tier.mjs +196 -0
  49. package/templates/engine/.agents/scripts/memory-wiki.mjs +296 -0
  50. package/templates/engine/.agents/scripts/outcome-metrics.mjs +195 -0
  51. package/templates/engine/.agents/scripts/path-lease.mjs +177 -0
  52. package/templates/engine/.agents/scripts/session-log.mjs +157 -0
  53. package/templates/engine/.agents/scripts/steering.mjs +75 -0
  54. package/templates/engine/.agents/scripts/verify.mjs +16 -5
  55. package/templates/engine/.agents/skills/arena/SKILL.md +4 -0
  56. package/templates/engine/.agents/skills/dream/SKILL.md +21 -2
  57. package/templates/engine/.agents/skills/eval/SKILL.md +16 -0
  58. package/templates/engine/.agents/skills/model-upgrade/SKILL.md +41 -0
  59. package/templates/engine/.agents/skills/session-resume/SKILL.md +7 -0
  60. package/templates/engine/.agents/skills/show-me-your-work/SKILL.md +14 -0
  61. package/templates/engine/.agents/skills/wiki/SKILL.md +4 -1
  62. package/templates/git/.gitattributes +1 -0
  63. package/templates/git/.githooks/package.json +3 -0
  64. package/templates/git/.github/workflows/ci.yml +32 -0
  65. package/templates/git/azure-pipelines.yml +46 -0
  66. package/templates/host-meta/SKILLS.md +3 -0
  67. package/templates/host-meta/claude/skill-pointer.md +6 -0
  68. package/templates/host-meta/cline/skill-index.md +6 -0
  69. package/templates/host-meta/codebuddy/skill-pointer.md +6 -0
  70. package/templates/host-meta/commandcode/skill-index.md +5 -0
  71. package/templates/host-meta/opencode/skill-pointer.md +6 -0
  72. package/templates/host-meta/qoder/skill-index.md +5 -0
  73. package/templates/host-meta/qwen/skill-index.md +5 -0
  74. package/templates/host-meta/trae/skill-index.md +6 -0
  75. package/templates/hosts/claude/settings.hardened.json +94 -0
  76. package/templates/hosts/claude/settings.json +1 -3
  77. package/templates/hosts/commandcode/settings.json +1 -3
  78. package/templates/hosts/qoder/settings.json +1 -3
  79. package/templates/hosts/qwen/settings.json +1 -3
  80. package/templates/profiles/go/AGENTS.md +52 -0
  81. package/templates/profiles/java/AGENTS.md +52 -0
  82. package/templates/profiles/rust/AGENTS.md +52 -0
  83. package/templates/profiles/typescript/AGENTS.md +52 -0
  84. package/templates/scaffold/workflow/INDEX.md +16 -0
  85. package/templates/scaffold/workflow/README.md +2 -0
  86. package/templates/scaffold/workflow/artifact-sources.md +25 -0
  87. package/templates/scaffold/workflow/non-engineer-intent.md +51 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 dc
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.
package/README.md CHANGED
@@ -3,33 +3,38 @@
3
3
  AI-Native 工作流驱动开发引擎的独立安装器。把现行仓的 `.agents/` 引擎、git 门禁、宿主适配层与 `wiki`/`workflow` 数据资产脚手架,从零生成到任意项目;功能与现行引擎保持 parity。
4
4
 
5
5
  - 零运行时依赖:只用 Node.js ≥ 22 内置模块。
6
- - 指定 agent:一次可装一个或多个宿主壳(命令 / 角色 / 规则 / hooks 接线)。
6
+ - 指定 agent:一次可装一个或多个宿主壳(命令 / 角色 / 规则 / hooks / 技能接线),按各宿主原生规范落盘。
7
+ - 技能单源:技能正文只保留在 `.agents/skills/`;原生支持技能的宿主生成指针壳,其余宿主生成 `wf-skills` 索引。
8
+ - 模型按角色配置:安装时探测宿主配置 / 环境变量(可选只读 CLI),按 `code` / `judgment` / `review` 推荐,也可 `--model` 或 TUI 手填。
7
9
  - 可选语言:`--lang zh-CN`(默认)或 `--lang en`;语言包覆盖文档、提示词、记忆文件、脚手架与安装器输出。
8
10
  - 幂等升级:`.agents/install-manifest.json` 记录版本、宿主、语言与文件哈希;冲突默认跳过,`--force` 才覆盖。
11
+ - 交互式 TUI 向导:交互终端不带参数直接运行进入菜单(安装 / 升级 / 追加宿主 / 体检 / 宿主列表),零依赖;非交互终端自动降级为编号问答或打印帮助。
9
12
 
10
13
  ## 快速开始
11
14
 
12
- kit 源码独立于业务仓,位于 `E:/Demo/cli-tools/agentic-flow-kit`。在目标项目根运行:
15
+ 在目标项目根运行:
13
16
 
14
17
  ```bash
15
- node E:/Demo/cli-tools/agentic-flow-kit/bin/flow-kit.mjs install \
18
+ npx agentic-flow-kit install \
16
19
  --agent trae --agent codebuddy \
17
20
  --lang zh-CN \
18
21
  --stack dotnet \
19
22
  --target .
20
23
  ```
21
24
 
22
- 发布到包源后也可以:
25
+ 从本仓库源码运行时,把 `npx agentic-flow-kit` 换成 `node <仓库路径>/bin/flow-kit.mjs`。
26
+
27
+ 也可以用交互式向导:在交互终端不带任何参数直接运行,进入 TUI 菜单,按提示选宿主 / 语言 / 栈与开关:
23
28
 
24
29
  ```bash
25
- npx agentic-flow-kit install --agent claude --lang en --target .
30
+ npx agentic-flow-kit
26
31
  ```
27
32
 
28
33
  安装后:
29
34
 
30
35
  ```bash
31
36
  node .agents/scripts/check-local-gates.mjs --fix
32
- node E:/Demo/cli-tools/agentic-flow-kit/bin/flow-kit.mjs doctor --target .
37
+ npx agentic-flow-kit doctor --target .
33
38
  ```
34
39
 
35
40
  ## 子命令
@@ -48,40 +53,100 @@ node E:/Demo/cli-tools/agentic-flow-kit/bin/flow-kit.mjs doctor --target .
48
53
  |---|---|
49
54
  | `--target <dir>` | 目标项目根,默认当前目录 |
50
55
  | `--lang zh-CN\|en` | 语言包,默认 `zh-CN` |
51
- | `--stack dotnet\|node\|empty` | 项目栈 profile;缺省按 `.sln`/`.csproj`/`package.json` 探测 |
56
+ | `--stack dotnet\|node\|typescript\|rust\|go\|java\|empty` | 项目栈 profile;缺省按根目录标记探测:`.sln`/`.csproj` → dotnet,`Cargo.toml` → rust,`go.mod` → go,`pom.xml`/`build.gradle` → java,`tsconfig.json` → typescript,`package.json` → node |
57
+ | `--tier lean\|standard\|enterprise` | 安装档位。`lean` 不生成 CI,适合小项目;`standard`(默认)生成 CI;`enterprise` 另启用加固配置(sandbox / 凭据读拒绝 / MCP 白名单 / 版本基线) |
58
+ | `--hardened` | 等价于 `--tier enterprise`;加固配置写入 `.claude/settings.json`,其中 managed-only 键需由平台/IT 以 managed settings 部署才不可覆盖 |
52
59
  | `--name <name>` | 渲染 `{{projectName}}`,默认目标目录名 |
53
60
  | `--dry-run` | 只打印计划,不写盘 |
54
61
  | `--force` | 覆盖冲突/非本工具安装的既有文件 |
55
62
  | `--no-git-config` | 不自动写三条例行 git 配置 |
56
63
  | `--track-hosts` | 不把本机宿主目录写进 `.gitignore` |
64
+ | `--model [host:]role=<id>` | 可重复。指定模型角色;`role` 为 `code` / `judgment` / `review`,省略宿主则全局生效 |
65
+ | `--model-mode recommend\|detect\|inherit` | `recommend`(默认,探测 + 推荐)、`detect`(强制重新探测)、`inherit`(全部继承宿主默认) |
66
+ | `--probe-models` | 允许执行宿主注册表中声明的只读模型列表命令(1.5s 超时,失败静默) |
67
+ | `--no-model-config` | 跳过模型探测 / 注入,也不写 `.agents/config/model-roles.local.json` |
57
68
 
58
69
  ## 宿主
59
70
 
60
71
  v1 支持 10 个现行宿主:
61
72
 
62
- | 宿主 | 目录 | 说明 |
63
- |---|---|---|
64
- | `trae` | `.trae/` | 命令 / 角色 / 规则 / hooks.json |
65
- | `codebuddy` | `.codebuddy/` | 命令 / 角色 / 规则 / 技能 / settings / 记忆 |
66
- | `claude` | `.claude/` + 根 `CLAUDE.md` | 命令 / 角色 / settings / 根记忆 |
67
- | `opencode` | `.opencode/` | 命令 / 角色 |
68
- | `qwen` | `.qwen/` | 命令 / 角色 / settings |
69
- | `pi` | `.pi/` | 角色 / 扩展 / settings |
70
- | `cline` | `.cline/` | workflows / 角色 YAML / hook |
71
- | `commandcode` | `.commandcode/` | 命令 / 角色 / settings |
72
- | `qoder` | `.qoder/` | 命令 / 角色 / settings |
73
- | `zcode` | `.zcode/` | 角色 / config / workflows |
73
+ | 宿主 | 命令 | 子代理 | 技能 | hooks | 模型注入 |
74
+ |---|---|---|---|---|---|
75
+ | `trae` | `.trae/commands/` | `.trae/agents/*.md` | index → `wf-skills` | `hooks.json` | 否 |
76
+ | `codebuddy` | `.codebuddy/commands/` | `.codebuddy/agents/*.md` | native `.codebuddy/skills/<name>/SKILL.md` | `settings.json` | 否 |
77
+ | `claude` | `.claude/commands/` | `.claude/agents/*.md`(`model`) | native `.claude/skills/<name>/SKILL.md` | `settings.json` | 是(`inherit` / 别名) |
78
+ | `opencode` | `.opencode/commands/` | `.opencode/agents/*.md`(`model`) | native `.opencode/skills/<name>/SKILL.md` | 插件式(保持现状) | 是(省略 = 继承) |
79
+ | `qwen` | `.qwen/commands/` | `.qwen/agents/*.md`(`model`) | shared `.agents/skills`(不复制) | `settings.json` | 是(`inherit`) |
80
+ | `pi` | 无 | `.pi/agents/*.md`(`model`) | index → `.pi/SKILLS.md` | `extensions/` | 是(网关 ID,无 `inherit`) |
81
+ | `cline` | `.cline/workflows/` | `.cline/agents/*.yml` | index → `wf-skills` | `hooks/` 适配器 | 否 |
82
+ | `commandcode` | `.commandcode/commands/` | `.commandcode/agents/*.md`(`model`) | shared `.agents/skills`(不复制) | `settings.json` | 是(`inherit`) |
83
+ | `qoder` | `.qoder/commands/` | `.qoder/agents/*.md` | index → `wf-skills` | `settings.json` | 否 |
84
+ | `zcode` | `.zcode/workflows/*.dwf.ts` | `.zcode/agents/*.md` | index → `wf-skills` | `config.json` | 否 |
74
85
 
75
86
  宿主壳全部是指针壳:正文权威仍在 `.agents/commands/`、`.agents/roles/`、`.agents/skills/`,安装器不复制正文,避免双源漂移。
76
87
 
88
+ 技能安装分三种模式(由注册表 `skills.mode` 驱动):
89
+
90
+ - **native**:宿主会自行发现 `<宿主目录>/skills/<name>/SKILL.md`。安装器按 `.agents/skills/*/SKILL.md` 的语言覆盖后内容动态生成指针壳(原生 frontmatter + 指向权威正文),不手写 22 × N 份静态副本。
91
+ - **shared**:宿主原生读取 `.agents/skills`(Qwen、Command Code)。不生成宿主技能副本,只生成 `wf-skills` 索引入口。
92
+ - **index**:无法确认原生技能目录的宿主生成一个索引(有命令目录时是 `wf-skills.md`,否则是 `SKILLS.md`),逐行列出技能名、描述与 `.agents/skills/<name>/SKILL.md` 路径。
93
+
94
+ ## 模型配置
95
+
96
+ 安装器按三个角色为子代理选模型:
97
+
98
+ | 角色 | 用途 | 典型分工 |
99
+ |---|---|---|
100
+ | `code` | 实现 / 改代码 | 低成本、高吞吐(如 `haiku` / `sonnet`) |
101
+ | `judgment` | 判断 / 规划 / 仲裁 | 强推理(如 `opus`) |
102
+ | `review` | 独立复核 | 强推理,且建议与 `code` 不同 |
103
+
104
+ 解析优先级(高 → 低):
105
+
106
+ 1. CLI `--model [host:]role=<id>`
107
+ 2. TUI 交互选择
108
+ 3. 已存在的 `.agents/config/model-roles.local.json`(宿主级 > 角色级)
109
+ 4. 探测 + 内置推荐
110
+ 5. 宿主 `inherit`
111
+
112
+ 探测来源:
113
+
114
+ - 宿主配置:如 `~/.claude/settings.json`、`~/.qwen/settings.json`(JSONC 容错)。
115
+ - 环境变量:如 `ANTHROPIC_MODEL`、`CLAUDE_CODE_SUBAGENT_MODEL`、`QWEN_MODEL`。
116
+ - 只读 CLI:仅注册表中声明且已核实的命令(当前为 Command Code 的 `--list-models`);默认不执行,交互安装或 `--probe-models` 才启用,1.5s 超时,失败静默。
117
+ - 内置推荐:只写已核实的别名(当前仅 Claude 的 `sonnet` / `haiku` / `opus`),不合成未知模型 ID。
118
+
119
+ 解析结果写入 `.agents/config/model-roles.local.json`(用户所有,不进 manifest、升级不覆盖);宿主子代理的 `model` 字段在渲染与语言覆盖之后注入,manifest 哈希记录最终文本。升级时若本地配置缺失(例如被 gitignore 后换机),会从已安装子代理的 `model` 字段回收,避免把用户已配置的模型静默改回 `inherit`。仅注册表声明了 `agents.modelField` 的宿主会注入;其余宿主只在输出与本地配置中记录角色模型,并提示该宿主不支持按角色指定子代理模型。
120
+
121
+ `review` 与 `code` 解析为同一模型时给出 `REVIEW_SAME_AS_CODE` 警告(不阻断安装);`doctor` 也会对现有配置做同样提示;本地配置与已安装子代理的 `model` 字段不一致时,doctor 报 `model drift`,要求先按 `.agents/skills/model-upgrade/SKILL.md` 评测再升级。
122
+
123
+ ## 治理、评测与记忆
124
+
125
+ 安装后的引擎在静态门之外还带一层 AI-Native 治理面(全部零依赖):
126
+
127
+ | 面 | 入口 | 作用 |
128
+ |---|---|---|
129
+ | 行为评测 | `.agents/scripts/agent-eval.mjs` + `.agents/skills/eval/` | 技能/命令/角色/模型变更后,用固定任务集跑 A/B,凭证绑定“评测敏感面”的内容签名;CI 先 `--advisory`,稳定后转硬门 |
130
+ | 测试不可弱化 | `.agents/hooks/pre-write-check.cjs` §2.5 + `fix-task.mjs` | 修复窗口内禁改既有测试;新建复现测试放行;`TEST-GUARD-ALLOW:` 留逃生口 |
131
+ | 离线梦境 | `.agents/scripts/dream-run.mjs` | 归档、索引、主张依据、**经验回放**、**记忆表示**、**注入层预算**、结果指标 |
132
+ | 经验日志 | `.agents/scripts/session-log.mjs` | 记录 failure/correction/refusal,供 dreaming 对照纠错 |
133
+ | 记忆表示 | `.agents/scripts/memory-wiki.mjs` | 从 claims/incidents/session-logs 生成 `wiki/_memory/` 链接地图 |
134
+ | 注入层预算 | `.agents/scripts/memory-tier.mjs` | 200 行 / 25KB 上限;只出上浮候选,不自动改 |
135
+ | 单写者租约 | `.agents/scripts/path-lease.mjs` | 并行 agent 写同一页面前加租约,防共享页丢事实 |
136
+ | 结果指标 | `.agents/scripts/outcome-metrics.mjs` | 首次过门率、复核采纳率、逃逸缺陷、评测通过率、返工占比 |
137
+ | 闭环状态机 | `.agents/scripts/check-pipeline-state.mjs` | stage/stopType 闭包检查;真实端到端 run 仍需小任务验证 |
138
+
139
+ `--tier standard`(默认)会生成 `azure-pipelines.yml` 与 `.github/workflows/ci.yml`,在 `verify --full` 之后跑上述 advisory 检查;`lean` 不生成 CI,`enterprise` 另装加固配置。未完成项与验收口径见 [BACKLOG.md](BACKLOG.md)。
140
+
77
141
  ## 模板 / Profile / State 三层
78
142
 
79
143
  | 层 | 位置 | 内容 |
80
144
  |---|---|---|
81
145
  | engine | `templates/engine/` | `.agents/` 通用引擎(commands / skills / roles / hooks / scripts / config / pipelines / tests / board / notes) |
82
- | profile | `templates/profiles/<stack>/` | 栈相关配置与 `AGENTS.md`:`test-impact-map.json`、`lane-surfaces.txt`、`rule-budgets.txt`、`workflow-modules.txt`、`commit-check.config.json`、`delete-guard-allowlist.txt` |
146
+ | profile | `templates/profiles/<stack>/` | 栈相关 `AGENTS.md`。栈:`dotnet` / `node` / `typescript` / `rust` / `go` / `java` / `empty` |
83
147
  | scaffold | `templates/scaffold/` | `wiki/` 目录骨架 + INDEX + 看板;`workflow/` 状态机骨架 + 空台账 + `_TEMPLATE.md` |
84
148
  | git | `templates/git/` | `.githooks/` 五钩子、`.gitattributes` 合并块、`.gitignore` 运行态块 |
149
+ | host-meta | `templates/host-meta/` | 宿主原生技能指针 / 技能索引模板;按能力动态生成,不参与 `templates/hosts/` 静态枚举 |
85
150
  | locale | `locales/<lang>/overrides/` | 按目标路径镜像的语言覆盖;缺省回退模板 |
86
151
 
87
152
  运行态(`cache/`、`tmp/`、`*.jsonl` 台账、`confirmations.d/`、`workflow/archive`、`.agents/tools/`)不打包,由引擎在装户内产生。
@@ -109,7 +174,7 @@ v1 支持 10 个现行宿主:
109
174
  1. `engine.json` 用 `{{installedAt}}` / `{{hostsJson}}` / `{{stack}}` / `{{language}}` 占位;
110
175
  2. `check-local-gates.mjs`:dotnet 与 `TEST_DB_CONN` 检查只在 `stack=dotnet` 时执行;
111
176
  3. `check-scripts-syntax.mjs`:缺失 `scripts/verify` 时跳过(存在但为空仍 fail-closed);
112
- 4. `verify.mjs`:按 `engine.json options.stack` 过滤 dotnet/Vue 专用 product 门,node 栈追加 `npm test`;
177
+ 4. `verify.mjs`:按 `engine.json options.stack` 过滤 dotnet/Vue 专用 product 门;`node`/`typescript` 在 `package.json` 有 `test` 脚本时追加 `npm test`,`rust` 追加 `cargo test`,`go` 追加 `go test ./...`,`java` 按 `pom.xml` 或 Gradle 追加测试门;
113
178
  5. `.githooks/pre-push`:宿主接线面扩到 10 宿主;
114
179
  6. `.agents/board/dev-tour.html`:项目名改为 `{{projectName}}` 占位;
115
180
  7. `check-ledger-invariant.mjs`:本仓历史基线哈希在新仓解析不出时按无基线处理,避免装户报警。
@@ -120,9 +185,9 @@ v1 支持 10 个现行宿主:
120
185
  ## 开发
121
186
 
122
187
  ```bash
123
- node tools/extract-from-project.mjs --project E:/Git/Shipyard.Material # 重新提取模板(一次性迁移工具)
188
+ node tools/extract-from-project.mjs --project 项目目录 # 重新提取模板(一次性迁移工具)
124
189
  node tools/make-en-host-overrides.mjs # 重新生成英文宿主指针壳
125
- node tools/parity-report.mjs --project E:/Git/Shipyard.Material # 对比现行引擎
190
+ node tools/parity-report.mjs --project 项目目录 # 对比现行引擎
126
191
  node --test tests/*.test.mjs # 安装器测试
127
192
  ```
128
193
 
@@ -138,3 +203,7 @@ agentic-flow-kit/
138
203
  ├── tests/
139
204
  └── tools/
140
205
  ```
206
+
207
+ ## 许可证
208
+
209
+ [MIT](LICENSE) © dc
package/bin/flow-kit.mjs CHANGED
@@ -2,6 +2,8 @@
2
2
  import { main } from '../src/cli/main.mjs';
3
3
 
4
4
  main(process.argv.slice(2)).catch((err) => {
5
- console.error(err && err.stack ? err.stack : String(err));
5
+ // 预期内的用户错误(code 已标注)只打印消息;未预期错误保留堆栈便于定位。
6
+ if (err?.code) console.error(err.message);
7
+ else console.error(err && err.stack ? err.stack : String(err));
6
8
  process.exit(1);
7
9
  });
@@ -1,5 +1,5 @@
1
1
  {
2
- "help": "agentic-flow-kit v{{version}}\n\nUsage:\n flow-kit install --agent <host> [--agent <host>...] [--lang zh-CN|en] [--stack dotnet|node|empty] [--target <dir>] [--dry-run] [--force] [--no-git-config] [--track-hosts]\n flow-kit add-host <host> [--target <dir>] [--dry-run] [--force]\n flow-kit upgrade [--target <dir>] [--dry-run] [--force]\n flow-kit doctor [--target <dir>] [--deep] [--fix]\n flow-kit list-hosts\n\nHosts: trae, codebuddy, claude, opencode, qwen, pi, cline, commandcode, qoder, zcode\n\nExample:\n node cli-tools/agentic-flow-kit/bin/flow-kit.mjs install --agent trae --agent codebuddy --lang en --target .\n",
2
+ "help": "agentic-flow-kit v{{version}}\n\nUsage:\n flow-kit install --agent <host> [--agent <host>...] [--lang zh-CN|en] [--stack dotnet|node|typescript|rust|go|java|empty] [--tier lean|standard|enterprise] [--hardened] [--target <dir>] [--model [host:]role=<id>] [--model-mode recommend|detect|inherit] [--probe-models] [--no-model-config] [--dry-run] [--force] [--no-git-config] [--track-hosts]\n flow-kit add-host <host> [--target <dir>] [--model [host:]role=<id>] [--model-mode recommend|detect|inherit] [--probe-models] [--no-model-config] [--dry-run] [--force]\n flow-kit upgrade [--target <dir>] [--model [host:]role=<id>] [--model-mode recommend|detect|inherit] [--probe-models] [--dry-run] [--force]\n flow-kit doctor [--target <dir>] [--deep] [--fix]\n flow-kit list-hosts\n\nHosts: trae, codebuddy, claude, opencode, qwen, pi, cline, commandcode, qoder, zcode\n\nModel roles: code (implementation) / judgment (reasoning) / review (independent verification; prefer different from code)\n\nExample:\n node cli-tools/agentic-flow-kit/bin/flow-kit.mjs install --agent claude --lang en --model claude:code=haiku --model claude:review=opus --target .\n",
3
3
  "install.start": "▶ {{command}} → {{target}}",
4
4
  "install.plan": " hosts={{hosts}} stack={{stack}} lang={{lang}} planned={{count}} files",
5
5
  "install.dryRun": " (dry-run: print the plan only, write nothing)",
@@ -19,7 +19,92 @@
19
19
  "doctor.fail": "doctor failed: {{failed}}/{{total}} checks",
20
20
  "error.noHosts": "No host specified. Use --agent <host>; available: {{hosts}}",
21
21
  "error.unknownHost": "Unknown host: {{name}}. Available: {{hosts}}",
22
+ "error.badModel": "Invalid --model: {{value}} (expected [host:]role=<id>; roles: code / judgment / review)",
22
23
  "error.noManifest": "Engine is not installed in the target; run install first",
23
24
  "error.noHostsInManifest": "No hosts recorded in manifest; run install first",
24
- "listHosts.title": "Supported hosts:"
25
+ "error.badTier": "Invalid --tier: {{value}} (expected lean / standard / enterprise)",
26
+ "listHosts.title": "Supported hosts:",
27
+ "tui.title": "agentic-flow-kit wizard",
28
+ "tui.menuQuestion": "Select an action",
29
+ "tui.menu.install": "Install",
30
+ "tui.menu.upgrade": "Upgrade",
31
+ "tui.menu.addHost": "Add host",
32
+ "tui.menu.doctor": "Doctor",
33
+ "tui.menu.listHosts": "List hosts",
34
+ "tui.menu.quit": "Quit",
35
+ "tui.hint.moveEnter": "Up/Down to select, Enter to confirm",
36
+ "tui.hint.toggle": "Space to toggle, Enter to confirm",
37
+ "tui.hostsQuestion": "Select hosts to install",
38
+ "tui.langQuestion": "Select language",
39
+ "tui.stackQuestion": "Select stack",
40
+ "tui.optsQuestion": "Select install options",
41
+ "tui.opt.gitConfig": "Configure git gates (recommended)",
42
+ "tui.opt.dryRun": "dry-run: print the plan only, write nothing",
43
+ "tui.opt.force": "Force overwrite conflicting files",
44
+ "tui.detected": "detected",
45
+ "tui.detectedFile": "detected {{file}}",
46
+ "tui.stack.dotnet": ".NET",
47
+ "tui.stack.node": "Node.js",
48
+ "tui.stack.typescript": "TypeScript",
49
+ "tui.stack.rust": "Rust",
50
+ "tui.stack.go": "Go",
51
+ "tui.stack.java": "Java",
52
+ "tui.stack.empty": "Unspecified",
53
+ "tui.currentStack": "current",
54
+ "tui.upgradeStackQuestion": "Select the stack for this upgrade",
55
+ "tui.installed": "installed",
56
+ "tui.planTitle": "Install plan",
57
+ "tui.plan.target": "Target: {{target}}",
58
+ "tui.plan.hosts": "Hosts: {{hosts}}",
59
+ "tui.plan.lang": "Language: {{lang}}",
60
+ "tui.plan.stack": "Stack: {{stack}}",
61
+ "tui.confirmInstall": "Start install?",
62
+ "tui.confirmUpgrade": "Start upgrade?",
63
+ "tui.askDoctor": "Run doctor right after install?",
64
+ "tui.running": "Running…",
65
+ "tui.done": "Done",
66
+ "tui.dryDone": "Dry-run done, nothing written",
67
+ "tui.doctorQuestion": "Select doctor mode",
68
+ "tui.doctor.normal": "Standard checks",
69
+ "tui.doctor.deep": "Deep checks (includes check-local-gates)",
70
+ "tui.addHostQuestion": "Select hosts to add",
71
+ "tui.backOrQuit": "Back to menu?",
72
+ "tui.errorTitle": "Error",
73
+ "tui.yes": "Yes",
74
+ "tui.no": "No",
75
+ "tui.inputNumber": "Type a number and press Enter:",
76
+ "tui.toggleNumber": "Number toggles a choice, empty Enter finishes:",
77
+ "tui.invalidNumber": "Invalid number, try again",
78
+ "tui.minSelection": "Select at least {{min}}",
79
+ "install.models": "Models: {{models}}",
80
+ "install.modelWarning": "Model warning: {{host}} {{role}} equals the implementation model; heterogeneous review unavailable",
81
+ "install.localModels": "Local model config: {{path}}",
82
+ "install.tier": "Tier: {{tier}} (hardened: {{hardened}})",
83
+ "doctor.modelConfigInvalid": "model-roles.local.json cannot be parsed",
84
+ "doctor.reviewSameAsCode": "review equals code; heterogeneous review unavailable",
85
+ "doctor.tier": "Tier: {{tier}}",
86
+ "doctor.ciMissing": "Missing CI template: {{paths}} (ignorable for tier=lean)",
87
+ "doctor.guaranteeGap": "Host {{host}} does not support {{capability}}; this guarantee can only be advisory, not a deterministic gate",
88
+ "doctor.modelDrift": "Model drift: {{host}}/{{role}} installed {{installed}} != local {{local}}; run the model-upgrade eval before upgrading",
89
+ "doctor.hardenedHint": "Hardened config contains managed-only keys; deploy it as managed settings so it cannot be overridden",
90
+ "tui.model.useRecommended": "Use recommended models for {{host}}?",
91
+ "tui.model.role": "Select the {{role}} model",
92
+ "tui.model.role.code": "implementation (code)",
93
+ "tui.model.role.judgment": "judgment",
94
+ "tui.model.role.review": "review",
95
+ "tui.model.recommended": "recommended",
96
+ "tui.model.inherit": "inherit (follow main model)",
97
+ "tui.model.manual": "Enter manually…",
98
+ "tui.model.skip": "Skip (leave unspecified)",
99
+ "tui.model.manualPrompt": "Model ID:",
100
+ "tui.model.invalid": "Model ID cannot be empty",
101
+ "tui.model.allowProbe": "Run {{host}}'s read-only model list command?",
102
+ "tui.model.sameAsCode": "review equals code; heterogeneous review unavailable",
103
+ "tui.plan.models": "Models: {{models}}",
104
+ "tui.hint.typeEnter": "Type, then press Enter",
105
+ "host.skillPointer": "Authoritative skill: `{{path}}`. This file is a pointer shell; read the authoritative source at execution time. Relative paths (scripts/, references/, …) resolve from that directory.",
106
+ "host.skillsIndexTitle": "# Skills index",
107
+ "host.skillsIndexDescription": "Skills index; authoritative bodies live under .agents/skills/",
108
+ "host.skillsIndexLine": "- `{{name}}` — {{description}} (authoritative: `{{path}}`)",
109
+ "host.skillsIndexEmpty": "(no skills)"
25
110
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: tfs-pr
3
- description: 内网自托管 TFS / Azure DevOps Server PR 技能,项目无关:自动识别 git 仓库与远端推导 collection/project/repo,PAT 缺失时引导创建并保存环境变量;查 PR / 建 PR(context 拉 diff 提炼标题与描述)/ 改 PR 描述 / 冲突预检与 worktree 隔离解决,走 REST API + PAT(az devops 扩展拒 http 组织 URL,az 不可用)。命令入口 .agents/skills/tfs-pr/scripts/tfs-pr.mjs。
3
+ description: Internal self-hosted TFS / Azure DevOps Server PR skill, project-agnostic — auto-detects the git repository and remote to derive collection/project/repo, guides creation and saves an env var when PAT is missing; query PR / create PR (context pulls diff to distill title and description) / update PR description / conflict pre-check and worktree-isolated resolution, via REST API + PAT (the az devops extension rejects http organization URLs, so az is unavailable). Command entry .agents/skills/tfs-pr/scripts/tfs-pr.mjs.
4
4
  ---
5
5
 
6
6
  Authoritative skill: `.agents/skills/tfs-pr/SKILL.md`. This file is a pointer shell; read the authoritative source at execution time and do not copy the body here.
@@ -25,6 +25,8 @@ The root `regression-checklist.md` is a **living regression checklist**: the uni
25
25
 
26
26
  **Gate judgment monthly shards** (2026-10-22 gate-metrics-shard): `workflow/gate-metrics.d/<YYYY-MM>.jsonl` holds one row per month (rule × WARN/BLOCK), generated by `node .agents/scripts/agg-judgments.mjs --emit-month` and committed with the change; pre-push monthly checks automatically backfill the previous month's shard. The retirement criterion (N consecutive months = 0) reads the union of local `.agents/judgments.jsonl` and the shards and takes the max—machine/worktree changes no longer reset it to zero; multi-machine union (`.gitattributes` reuses `jsonl-union`).
27
27
 
28
+ **Claims ledger** (append-only, monthly): `workflow/claims.d/<YYYY-MM>.jsonl` records one sentence a future session might take as given, plus a quote that already exists in the repo. Append with `node .agents/scripts/claims.mjs add`. `recheck` only reports whether that quote is still in the file. Its exit code is always 0. It is not a gate, and it does not rewrite past lines. Merges use `jsonl-union`.
29
+
28
30
  ## Usage
29
31
 
30
32
  - **Start a new task**: run `.agents/commands/new-task.md` (leveling + L0 minimal path / L1 fast path entrance); L2/L3 enter the four chapters of `.agents/commands/stages.md` (Plan → Design → Build → Test, 2026-11-08 tier 2-F four-in-one)
@@ -1,5 +1,5 @@
1
1
  {
2
- "help": "agentic-flow-kit v{{version}}\n\n用法:\n flow-kit install --agent <host> [--agent <host>...] [--lang zh-CN|en] [--stack dotnet|node|empty] [--target <dir>] [--dry-run] [--force] [--no-git-config] [--track-hosts]\n flow-kit add-host <host> [--target <dir>] [--dry-run] [--force]\n flow-kit upgrade [--target <dir>] [--dry-run] [--force]\n flow-kit doctor [--target <dir>] [--deep] [--fix]\n flow-kit list-hosts\n\n宿主:trae, codebuddy, claude, opencode, qwen, pi, cline, commandcode, qoder, zcode\n\n示例:\n node cli-tools/agentic-flow-kit/bin/flow-kit.mjs install --agent trae --agent codebuddy --lang zh-CN --target .\n",
2
+ "help": "agentic-flow-kit v{{version}}\n\n用法:\n flow-kit install --agent <host> [--agent <host>...] [--lang zh-CN|en] [--stack dotnet|node|typescript|rust|go|java|empty] [--tier lean|standard|enterprise] [--hardened] [--target <dir>] [--model [host:]role=<id>] [--model-mode recommend|detect|inherit] [--probe-models] [--no-model-config] [--dry-run] [--force] [--no-git-config] [--track-hosts]\n flow-kit add-host <host> [--target <dir>] [--model [host:]role=<id>] [--model-mode recommend|detect|inherit] [--probe-models] [--no-model-config] [--dry-run] [--force]\n flow-kit upgrade [--target <dir>] [--model [host:]role=<id>] [--model-mode recommend|detect|inherit] [--probe-models] [--dry-run] [--force]\n flow-kit doctor [--target <dir>] [--deep] [--fix]\n flow-kit list-hosts\n\n宿主:trae, codebuddy, claude, opencode, qwen, pi, cline, commandcode, qoder, zcode\n\n模型角色:code(实现)/ judgment(判断)/ review(独立复核,建议与 code 不同)\n\n示例:\n node cli-tools/agentic-flow-kit/bin/flow-kit.mjs install --agent claude --lang zh-CN --model claude:code=haiku --model claude:review=opus --target .\n",
3
3
  "install.start": "▶ {{command}} → {{target}}",
4
4
  "install.plan": " 宿主={{hosts}} 栈={{stack}} 语言={{lang}} 计划={{count}} 个文件",
5
5
  "install.dryRun": " (dry-run:只打印计划,不写盘)",
@@ -19,7 +19,92 @@
19
19
  "doctor.fail": "doctor 失败:{{failed}}/{{total}} 项",
20
20
  "error.noHosts": "未指定宿主。用 --agent <host> 指定,可选:{{hosts}}",
21
21
  "error.unknownHost": "未知宿主:{{name}}。可选:{{hosts}}",
22
+ "error.badModel": "无效的 --model:{{value}}(格式:[宿主:]角色=模型,角色:code / judgment / review)",
22
23
  "error.noManifest": "目标未安装本引擎;先运行 install",
23
24
  "error.noHostsInManifest": "manifest 未登记宿主;先运行 install",
24
- "listHosts.title": "支持的宿主:"
25
+ "error.badTier": "无效的 --tier:{{value}}(可选 lean / standard / enterprise)",
26
+ "listHosts.title": "支持的宿主:",
27
+ "tui.title": "agentic-flow-kit 向导",
28
+ "tui.menuQuestion": "选择操作",
29
+ "tui.menu.install": "安装",
30
+ "tui.menu.upgrade": "升级",
31
+ "tui.menu.addHost": "追加宿主",
32
+ "tui.menu.doctor": "体检",
33
+ "tui.menu.listHosts": "宿主列表",
34
+ "tui.menu.quit": "退出",
35
+ "tui.hint.moveEnter": "↑/↓ 选择,回车确认",
36
+ "tui.hint.toggle": "空格勾选,回车确认",
37
+ "tui.hostsQuestion": "选择要安装的宿主",
38
+ "tui.langQuestion": "选择语言",
39
+ "tui.stackQuestion": "选择技术栈",
40
+ "tui.optsQuestion": "选择安装选项",
41
+ "tui.opt.gitConfig": "配置 git 门禁(推荐)",
42
+ "tui.opt.dryRun": "dry-run:只打印计划,不写盘",
43
+ "tui.opt.force": "强制覆盖冲突文件",
44
+ "tui.detected": "检测到",
45
+ "tui.detectedFile": "检测到 {{file}}",
46
+ "tui.stack.dotnet": ".NET",
47
+ "tui.stack.node": "Node.js",
48
+ "tui.stack.typescript": "TypeScript",
49
+ "tui.stack.rust": "Rust",
50
+ "tui.stack.go": "Go",
51
+ "tui.stack.java": "Java",
52
+ "tui.stack.empty": "未指定",
53
+ "tui.currentStack": "当前",
54
+ "tui.upgradeStackQuestion": "选择本次升级的技术栈",
55
+ "tui.installed": "已安装",
56
+ "tui.planTitle": "安装计划",
57
+ "tui.plan.target": "目标:{{target}}",
58
+ "tui.plan.hosts": "宿主:{{hosts}}",
59
+ "tui.plan.lang": "语言:{{lang}}",
60
+ "tui.plan.stack": "栈:{{stack}}",
61
+ "tui.confirmInstall": "开始安装?",
62
+ "tui.confirmUpgrade": "开始升级?",
63
+ "tui.askDoctor": "安装后立即体检?",
64
+ "tui.running": "执行中…",
65
+ "tui.done": "完成",
66
+ "tui.dryDone": "dry-run 完成,未写盘",
67
+ "tui.doctorQuestion": "选择体检模式",
68
+ "tui.doctor.normal": "普通体检",
69
+ "tui.doctor.deep": "深度体检(含 check-local-gates)",
70
+ "tui.addHostQuestion": "选择要追加的宿主",
71
+ "tui.backOrQuit": "返回菜单?",
72
+ "tui.errorTitle": "出错了",
73
+ "tui.yes": "是",
74
+ "tui.no": "否",
75
+ "tui.inputNumber": "输入序号后回车:",
76
+ "tui.toggleNumber": "输入序号切换勾选,直接回车完成:",
77
+ "tui.invalidNumber": "无效序号,请重试",
78
+ "tui.minSelection": "至少选择 {{min}} 项",
79
+ "install.models": "模型:{{models}}",
80
+ "install.modelWarning": "模型提示:{{host}} 的 {{role}} 与实现模型相同,跨模型复核不可用",
81
+ "install.localModels": "本地模型配置:{{path}}",
82
+ "install.tier": "安装档位:{{tier}}(加固:{{hardened}})",
83
+ "doctor.modelConfigInvalid": "model-roles.local.json 无法解析",
84
+ "doctor.reviewSameAsCode": "review 与 code 相同,跨模型复核不可用",
85
+ "doctor.tier": "安装档位:{{tier}}",
86
+ "doctor.ciMissing": "缺少 CI 模板:{{paths}}(tier=lean 可忽略)",
87
+ "doctor.guaranteeGap": "宿主 {{host}} 不支持 {{capability}};该保证只能是 advisory,不能当 deterministic 门",
88
+ "doctor.modelDrift": "模型漂移:{{host}}/{{role}} 安装值 {{installed}} ≠ 本地 {{local}};按 model-upgrade 技能先评测再升级",
89
+ "doctor.hardenedHint": "加固配置含 managed-only 键;需由平台/IT 以 managed settings 部署才不可被覆盖",
90
+ "tui.model.useRecommended": "{{host}} 使用推荐模型?",
91
+ "tui.model.role": "选择 {{role}} 模型",
92
+ "tui.model.role.code": "实现(code)",
93
+ "tui.model.role.judgment": "判断(judgment)",
94
+ "tui.model.role.review": "复核(review)",
95
+ "tui.model.recommended": "推荐",
96
+ "tui.model.inherit": "inherit(跟随主模型)",
97
+ "tui.model.manual": "手动输入…",
98
+ "tui.model.skip": "跳过(不指定)",
99
+ "tui.model.manualPrompt": "输入模型 ID:",
100
+ "tui.model.invalid": "模型 ID 不能为空",
101
+ "tui.model.allowProbe": "允许执行 {{host}} 的只读模型列表命令?",
102
+ "tui.model.sameAsCode": "review 与 code 相同,跨模型复核不可用",
103
+ "tui.plan.models": "模型:{{models}}",
104
+ "tui.hint.typeEnter": "输入后回车",
105
+ "host.skillPointer": "权威技能:`{{path}}`。本文件是指针壳,执行时读取权威源;相对路径(scripts/、references/ 等)以该目录为基准。",
106
+ "host.skillsIndexTitle": "# 技能索引",
107
+ "host.skillsIndexDescription": "技能索引:权威正文在 .agents/skills/",
108
+ "host.skillsIndexLine": "- `{{name}}` — {{description}}(权威:`{{path}}`)",
109
+ "host.skillsIndexEmpty": "(暂无技能)"
25
110
  }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "agentic-flow-kit",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "AI-Native workflow engine installer: generate .agents, git hooks, host adapters, wiki/workflow scaffolds from zero.",
5
- "license": "UNLICENSED",
5
+ "license": "MIT",
6
6
  "type": "module",
7
7
  "bin": {
8
8
  "flow-kit": "bin/flow-kit.mjs"
@@ -14,7 +14,9 @@
14
14
  "items": { "enum": ["trae", "codebuddy", "claude", "opencode", "qwen", "pi", "cline", "commandcode", "qoder", "zcode"] },
15
15
  "uniqueItems": true
16
16
  },
17
- "stack": { "enum": ["dotnet", "node", "empty"] },
17
+ "stack": { "enum": ["dotnet", "node", "typescript", "rust", "go", "java", "empty"] },
18
+ "tier": { "enum": ["lean", "standard", "enterprise"] },
19
+ "hardened": { "type": "boolean" },
18
20
  "files": {
19
21
  "type": "object",
20
22
  "additionalProperties": { "type": "string", "pattern": "^[a-f0-9]{64}$" }
@@ -5,7 +5,7 @@
5
5
  "type": "object",
6
6
  "required": ["stack"],
7
7
  "properties": {
8
- "stack": { "enum": ["dotnet", "node", "empty"] },
8
+ "stack": { "enum": ["dotnet", "node", "typescript", "rust", "go", "java", "empty"] },
9
9
  "ports": {
10
10
  "type": "object",
11
11
  "properties": {
package/src/cli/args.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  // 极简参数解析:--key value / --flag / --key=value;--agent 可重复。
2
2
  export function parseArgs(argv) {
3
- const args = { _: [], agents: [], flags: new Set() };
3
+ const args = { _: [], agents: [], models: [], flags: new Set() };
4
4
  const takeValue = (i) => {
5
5
  const next = argv[i + 1];
6
6
  if (next == null || (next.startsWith('--') && next !== '-')) return null;
@@ -17,6 +17,7 @@ export function parseArgs(argv) {
17
17
  const key = raw.slice(2, eq);
18
18
  const value = raw.slice(eq + 1);
19
19
  if (key === 'agent') args.agents.push(value);
20
+ else if (key === 'model') args.models.push(value);
20
21
  else args[key] = value;
21
22
  continue;
22
23
  }
@@ -24,6 +25,7 @@ export function parseArgs(argv) {
24
25
  const value = takeValue(i);
25
26
  if (value != null) {
26
27
  if (key === 'agent') args.agents.push(value);
28
+ else if (key === 'model') args.models.push(value);
27
29
  else args[key] = value;
28
30
  i += 1;
29
31
  } else {
package/src/cli/main.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { parseArgs, flag } from './args.mjs';
4
- import { makeT } from '../i18n.mjs';
4
+ import { makeT, LANGUAGES } from '../i18n.mjs';
5
5
  import { HOST_NAMES, resolveHost } from '../hosts/registry.mjs';
6
6
  import { installCommand } from '../commands/install.mjs';
7
7
  import { doctorCommand } from '../commands/doctor.mjs';
@@ -9,7 +9,7 @@ import { addHostCommand } from '../commands/add-host.mjs';
9
9
  import { upgradeCommand } from '../commands/upgrade.mjs';
10
10
  import { KIT_ROOT } from '../install/plan.mjs';
11
11
 
12
- const SUPPORTED_LANGS = new Set(['zh-CN', 'en']);
12
+ const SUPPORTED_LANGS = new Set(LANGUAGES);
13
13
 
14
14
  function normalizeLang(input) {
15
15
  const lang = String(input || 'zh-CN');
@@ -27,6 +27,13 @@ async function main(argv) {
27
27
  const lang = normalizeLang(args.lang);
28
28
  const t = makeT(lang);
29
29
 
30
+ // 无位置参数且无任何选项(含 --agent/--target 等值形参数,它们不进 flags.size)、交互终端 → 进入 TUI 向导(懒加载,避免影响脚本路径)
31
+ if (!args._.length && args.flags.size === 0 && args.lang == null && args.agents.length === 0 && args.target == null
32
+ && process.stdin.isTTY && process.stdout.isTTY) {
33
+ const { wizardCommand } = await import('../tui/wizard.mjs');
34
+ return wizardCommand({ t, lang });
35
+ }
36
+
30
37
  if (flag(args, 'version') || flag(args, 'v')) {
31
38
  console.log(readVersion());
32
39
  return 0;