aigroup-workflow 1.1.1 → 1.1.2

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.
@@ -0,0 +1,61 @@
1
+ 你是麦克斯 (Max),项目经理。现在需要创建一个 Git 提交。
2
+
3
+ ## 任务
4
+
5
+ $ARGUMENTS
6
+
7
+ ## 执行步骤
8
+
9
+ ### 1. 检查变更
10
+
11
+ ```bash
12
+ git status
13
+ git diff --stat
14
+ ```
15
+
16
+ ### 2. 分析变更内容
17
+
18
+ 查看所有变更的文件,理解改动的性质:
19
+ - 新功能 (feat)
20
+ - Bug 修复 (fix)
21
+ - 重构 (refactor)
22
+ - 文档 (docs)
23
+ - 配置/构建 (chore)
24
+ - 样式调整 (style)
25
+ - 测试 (test)
26
+
27
+ ### 3. 生成提交信息
28
+
29
+ 遵循 Conventional Commits 规范:
30
+
31
+ ```
32
+ <type>(<scope>): <简短中文描述>
33
+
34
+ <详细说明(可选)>
35
+ ```
36
+
37
+ **规则**:
38
+ - type 使用英文(feat/fix/refactor/docs/chore/style/test)
39
+ - scope 根据改动范围填写(模块名/文件名)
40
+ - 描述使用中文,简洁明确
41
+ - 不超过 72 字符
42
+
43
+ ### 4. 执行提交
44
+
45
+ ```bash
46
+ git add <相关文件>
47
+ git commit -m "<生成的提交信息>"
48
+ ```
49
+
50
+ **注意**:
51
+ - 只添加相关变更文件,不要 `git add .`
52
+ - 不要添加 .env、credentials 等敏感文件
53
+ - 如果变更涉及多个不相关的功能,拆分为多次提交
54
+ - 提交前确认没有遗漏的文件
55
+
56
+ ### 5. 输出
57
+
58
+ 报告:
59
+ 1. 提交的文件列表
60
+ 2. 提交信息
61
+ 3. 提交哈希
@@ -0,0 +1,83 @@
1
+ ---
2
+ description: 初始化项目 AI 上下文,生成/更新根级与模块级 CLAUDE.md 索引
3
+ argument-hint: <项目摘要或名称>
4
+ ---
5
+
6
+ ## 用法
7
+
8
+ `/init-project <项目摘要或名称>`
9
+
10
+ ## 目标
11
+
12
+ 以"根级简明 + 模块级详尽"的混合策略初始化项目 AI 上下文:
13
+
14
+ - 在仓库根生成/更新 `CLAUDE.md`(高层愿景、架构总览、模块索引、全局规范)。
15
+ - 在识别的各模块目录生成/更新本地 `CLAUDE.md`(接口、依赖、入口、测试、关键文件等)。
16
+ - 为根 `CLAUDE.md` 自动生成 Mermaid 结构图,并为每个模块 `CLAUDE.md` 添加导航面包屑。
17
+
18
+ ## 执行步骤
19
+
20
+ ### 步骤 1:全仓清点(轻量)
21
+
22
+ 快速统计文件与目录,识别模块根:
23
+ - 查找 `package.json`、`pyproject.toml`、`go.mod`、`pom.xml`、`build.gradle` 等项目标识
24
+ - 识别模块目录:`apps/*`、`packages/*`、`services/*`、`src/modules/*` 等
25
+ - 统计文件数量和目录结构
26
+ - 识别技术栈(语言、框架、构建工具)
27
+
28
+ ### 步骤 2:模块优先扫描(中等)
29
+
30
+ 对每个模块做定点读取与样本抽取:
31
+ - **入口文件**:`index.*`、`main.*`、`app.*`
32
+ - **接口/API**:路由定义、控制器、GraphQL schema
33
+ - **依赖**:`import`/`require` 语句分析,模块间引用关系
34
+ - **测试**:测试文件和覆盖率配置
35
+ - **数据模型**:实体定义、数据库 schema、类型声明
36
+ - **质量工具**:ESLint、Prettier、TypeScript 配置
37
+
38
+ ### 步骤 3:生成/更新 CLAUDE.md
39
+
40
+ **根级 `CLAUDE.md`** 包含:
41
+ - 项目愿景和简介(基于 $ARGUMENTS)
42
+ - 技术栈总览
43
+ - Mermaid 架构图
44
+ - 模块索引(名称 + 路径 + 一句话职责)
45
+ - 全局编码规范和约定
46
+ - 常用命令速查
47
+
48
+ **模块级 `<module>/CLAUDE.md`** 包含:
49
+ - 导航面包屑(`← 返回根 CLAUDE.md`)
50
+ - 模块职责描述
51
+ - 关键文件和入口
52
+ - 公开接口/API
53
+ - 依赖关系(上游和下游)
54
+ - 测试说明
55
+
56
+ ### 步骤 4:aiGroup 框架适配
57
+
58
+ 如果项目已安装 aiGroup 框架(存在 `.dev-agents/`):
59
+ - 更新 `docs/ARCHITECTURE.md` 为实际架构
60
+ - 根据技术栈推荐 Jarvis 优先加载的技能
61
+ - 运行 `bash scripts/harness/run-all.sh` 健康检查
62
+
63
+ ## 覆盖率与增量更新
64
+
65
+ - 输出"已扫描文件数 / 估算总文件数"和"已覆盖模块占比"
66
+ - 列出被忽略/跳过的原因和"建议下一步深挖的子路径"
67
+ - 重复运行 `/init-project` 时做**增量更新**与**断点续扫**,不覆盖用户自定义内容
68
+
69
+ ## 安全与边界
70
+
71
+ - 只读/写文档与索引,**不改源代码**
72
+ - 默认忽略 `node_modules`、`dist`、`build`、`.git`、二进制文件等生成物
73
+ - 结果在主对话打印摘要,全文写入仓库
74
+
75
+ ## 输出要求
76
+
77
+ 在主对话中打印"初始化结果摘要":
78
+ 1. 根级 `CLAUDE.md` 是否创建/更新、主要栏目概览
79
+ 2. 识别的模块数量及路径列表
80
+ 3. 每个模块 `CLAUDE.md` 的生成/更新情况
81
+ 4. 已生成 Mermaid 结构图和导航面包屑数量
82
+ 5. 覆盖率与主要缺口
83
+ 6. 若未读全:说明原因,并列出推荐的下一步
@@ -37,9 +37,12 @@ $ARGUMENTS
37
37
 
38
38
  1. **必读** → `skills/kyle/tdd-guide/SKILL.md`(TDD 工作流和测试模式)
39
39
  2. **必读** → `skills/max/workflow/verification-before-completion/SKILL.md`(完成验证规范)
40
- 3. **按需** → `skills/jarvis/engineering-team/SKILL.md`(工程团队开发规范,涉及后端/全栈时读取)
41
- 4. **按需** → `skills/jarvis/claude-simone/CLAUDE.md`(开发框架参考)
42
- 5. **Bug 修复时** → `skills/max/workflow/systematic-debugging/SKILL.md`
40
+ 3. **按需** → `skills/jarvis/fullstack-guardian/SKILL.md`(全栈安全开发,涉及前后端集成时读取)
41
+ 4. **按需** → `skills/jarvis/api-designer/SKILL.md`(API 设计,涉及 REST/GraphQL 时读取)
42
+ 5. **按需** → `skills/jarvis/architecture-designer/SKILL.md`(系统架构设计,涉及架构决策时读取)
43
+ 6. **Bug 修复时** → `skills/max/workflow/systematic-debugging/SKILL.md`
44
+
45
+ 完整技能列表见 `.dev-agents/jarvis/PERSONA.md` 的技能加载表,根据任务类型按需读取 1-3 个最相关的 SKILL.md。
43
46
 
44
47
  ## 工作规范
45
48
 
package/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # aiGroup - AI 团队协作框架
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/aigroup-workflow?style=flat&colorA=080f12&colorB=1fa669)](https://npmjs.com/package/aigroup-workflow)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg?style=flat&colorA=080f12&colorB=1fa669)](LICENSE)
5
+ [![Claude Code](https://img.shields.io/badge/Claude-Code-purple.svg?style=flat&colorA=080f12&colorB=1fa669)](https://claude.ai/code)
6
+
3
7
  > 单入口 AI 团队:一个命令启动,按需自动派遣设计、开发、测试专家。
4
8
  > 内置门禁式工作流:需求澄清 → 方案设计 → 实现计划 → 子代理开发 → 两阶段审查 → 分支收尾。
5
9
 
@@ -9,20 +13,20 @@
9
13
 
10
14
  | 依赖 | 最低版本 | 用途 |
11
15
  |------|---------|------|
12
- | [Claude Code](https://docs.anthropic.com/en/docs/claude-code) | 最新版 | AI Agent 运行时(主要使用方式) |
13
- | [Cursor](https://cursor.com) | 最新版 | AI IDE(可选,替代使用方式) |
14
- | Node.js | 18+ | CLI 工具运行 |
16
+ | [Claude Code](https://docs.anthropic.com/en/docs/claude-code) | 最新版 | AI Agent 运行时(推荐) |
17
+ | [Cursor](https://cursor.com) | 最新版 | AI IDE(可选) |
18
+ | Node.js | 18+ | CLI 工具 |
15
19
  | Git | 2.x | 版本控制 |
16
- | Bash | 4.x+ | Harness 传感器脚本(Windows 用户可用 Git Bash) |
20
+ | Bash | 4.x+ | Harness 传感器(Windows Git Bash) |
17
21
 
18
22
  ### 安装
19
23
 
20
24
  ```bash
21
- # 方式一:通过 npm 安装 CLI(推荐)
25
+ # 方式一:全局安装(推荐,安装后可直接用 aig 命令)
22
26
  npm install -g aigroup-workflow
23
- aigroup init
27
+ aig init
24
28
 
25
- # 方式二:npx 免安装使用
29
+ # 方式二:npx 免安装
26
30
  npx aigroup-workflow init
27
31
 
28
32
  # 方式三:克隆仓库
@@ -33,18 +37,22 @@ cd ai-agent-workflowGroup
33
37
  ### CLI 命令
34
38
 
35
39
  ```bash
36
- aigroup init # 交互式初始化(选择角色、安装技能和配置)
37
- aigroup update # 增量更新(只更新技能和传感器,不覆盖自定义)
38
- aigroup check # 运行 Harness 健康检查
39
- aigroup status # 查看工作流状态
40
- aigroup init --yes # 跳过确认,使用默认配置
40
+ aig # 交互式主菜单(无参数启动)
41
+ aig init # 初始化(交互式选择角色和技能)
42
+ aig init --yes # 跳过确认,使用默认配置
43
+ aig update # 增量更新(不覆盖自定义配置)
44
+ aig check # Harness 健康检查
45
+ aig status # 工作流状态
46
+ aig help # 帮助
41
47
  ```
42
48
 
43
- `init` 命令支持交互式多选:使用 **方向键** 移动光标,**空格** 切换选中角色,**回车** 确认。
49
+ > `aig` `aigroup` 的短别名,两者等效。npx 用户使用 `npx aigroup-workflow <命令>`。
50
+
51
+ `init` 命令支持 inquirer 风格交互:**方向键** 移动、**空格** 切换选中、**a** 全选、**回车** 确认。
44
52
 
45
53
  ### 启动
46
54
 
47
- **Claude Code 中使用(推荐):**
55
+ **Claude Code(推荐):**
48
56
 
49
57
  ```bash
50
58
  cd your-project
@@ -53,16 +61,12 @@ claude
53
61
 
54
62
  启动后 Max 自动就位,读取 `CLAUDE.md` 作为入口,根据你的需求驱动整个团队。
55
63
 
56
- **Cursor 中使用:**
57
-
58
- 直接用 Cursor 打开项目目录,Agent 会自动读取 `CLAUDE.md` 获取框架规则。
64
+ **Cursor:** 直接打开项目目录,Agent 自动读取 `CLAUDE.md`。
59
65
 
60
66
  ### 三种使用模式
61
67
 
62
68
  **模式一:完整管道(复杂任务)**
63
69
 
64
- 直接描述需求,Max 自动驱动完整管道:
65
-
66
70
  ```
67
71
  你: 帮我做一个用户认证系统
68
72
  → Max 启动 brainstorming,逐步澄清需求
@@ -73,18 +77,16 @@ claude
73
77
 
74
78
  **模式二:斜杠命令直接派遣(明确任务)**
75
79
 
76
- 跳过 Max 调度,直接派遣指定成员:
77
-
78
80
  ```
79
81
  /ella 设计一个登录页面 # 直接派遣设计师
80
82
  /jarvis 实现用户认证 API # 直接派遣开发
81
83
  /kyle 审查用户模块代码 # 直接派遣质量保障
84
+ /init-project 我的项目 # 初始化项目 AI 上下文
85
+ /git-commit # 智能 Git 提交
82
86
  ```
83
87
 
84
88
  **模式三:简单问答(轻量任务)**
85
89
 
86
- 不涉及设计决策的简单问题,Max 直接回答:
87
-
88
90
  ```
89
91
  你: 这个项目用的什么技术栈?
90
92
  → Max 直接回答,不启动管道
@@ -94,12 +96,22 @@ claude
94
96
 
95
97
  ## 团队成员
96
98
 
97
- | 成员 | 角色 | 负责什么 | 不负责什么 |
98
- |------------------|---------------|----------------------------------|--------------------|
99
- | 麦克斯 (Max) | 项目经理 | 需求分析、任务拆解、进度协调 | 写代码、做设计、做测试 |
100
- | 艾拉 (Ella) | UI/UX 设计师 | 界面设计、交互原型、设计规范 | 写代码、做测试 |
101
- | 贾维斯 (Jarvis) | 全栈开发 | 前后端编码、API、技术方案 | 做设计、做测试验收 |
102
- | 凯尔 (Kyle) | 质量保障 | 代码审查、功能验收、安全审计 | 写代码、做设计 |
99
+ | 成员 | 角色 | 技能数 | 负责什么 |
100
+ |------|------|--------|---------|
101
+ | 麦克斯 (Max) | 项目经理 | 16 | 需求分析、任务拆解、进度协调、工作流管道 |
102
+ | 艾拉 (Ella) | UI/UX 设计师 | 10 | 界面设计、交互原型、前端框架参考 |
103
+ | 贾维斯 (Jarvis) | 全栈开发 | 45 | 架构设计、前后端编码、API、DevOps |
104
+ | 凯尔 (Kyle) | 质量保障 | 7 | 代码审查、测试策略、安全审计、E2E |
105
+
106
+ ## 斜杠命令
107
+
108
+ | 命令 | 说明 |
109
+ |------|------|
110
+ | `/ella <任务>` | 派遣设计师 — 界面设计、交互原型、设计规范 |
111
+ | `/jarvis <任务>` | 派遣开发 — 编码、技术方案、Bug 修复 |
112
+ | `/kyle <任务>` | 派遣质量保障 — 代码审查、功能验收 |
113
+ | `/init-project <名称>` | 初始化项目 AI 上下文 — 生成根级和模块级 CLAUDE.md 索引 |
114
+ | `/git-commit` | 智能 Git 提交 — 分析变更、生成 Conventional Commits 信息 |
103
115
 
104
116
  ## 工作流程
105
117
 
@@ -124,32 +136,6 @@ flowchart TD
124
136
  Summary --> Done(["反馈给用户"])
125
137
  ```
126
138
 
127
- ### 任务派遣决策流程
128
-
129
- ```mermaid
130
- flowchart TD
131
- Input(["用户输入"]) --> Parse["Max 解析需求"]
132
- Parse --> Classify{"需求分类"}
133
-
134
- Classify -->|"界面/交互/视觉"| Design["设计需求"]
135
- Classify -->|"编码/功能/API/修复"| Dev["开发需求"]
136
- Classify -->|"审查/验收/测试"| QA["质量需求"]
137
- Classify -->|"咨询/解释"| Simple["简单问题"]
138
-
139
- Design --> Clarify1{"需求清晰?"}
140
- Clarify1 -->|否| Ask1["追问澄清"] --> Clarify1
141
- Clarify1 -->|是| GoElla["派遣 Ella"]
142
-
143
- Dev --> Clarify2{"需求清晰?"}
144
- Clarify2 -->|否| Ask2["追问澄清"] --> Clarify2
145
- Clarify2 -->|是| HasDesign{"有设计稿?"}
146
- HasDesign -->|是| GoJarvis1["派遣 Jarvis + 设计稿路径"]
147
- HasDesign -->|否| GoJarvis2["派遣 Jarvis + 技术上下文"]
148
-
149
- QA --> GoKyle["派遣 Kyle + 代码路径"]
150
- Simple --> MaxAnswer["Max 直接回答"]
151
- ```
152
-
153
139
  ### 完整流水线
154
140
 
155
141
  ```mermaid
@@ -159,32 +145,20 @@ sequenceDiagram
159
145
  participant Ella
160
146
  participant Jarvis
161
147
  participant Kyle
162
- participant Shared
163
148
 
164
149
  User->>Max: 提出需求
165
150
  Max->>Max: 分析并拆解任务
166
151
 
167
152
  Note over Max,Ella: 阶段一 设计
168
153
  Max->>Ella: 派遣设计任务
169
- Ella->>Shared: 输出设计稿
170
154
  Ella-->>Max: 设计完成
171
- Max-->>User: 需要开发吗
172
-
173
- User->>Max: 确认开发
174
155
 
175
156
  Note over Max,Jarvis: 阶段二 开发
176
157
  Max->>Jarvis: 派遣开发任务+设计稿路径
177
- Jarvis->>Shared: 读取设计稿
178
- Jarvis->>Jarvis: 实现代码
179
158
  Jarvis-->>Max: 开发完成
180
- Max-->>User: 需要验收吗
181
-
182
- User->>Max: 确认验收
183
159
 
184
160
  Note over Max,Kyle: 阶段三 验收
185
161
  Max->>Kyle: 派遣验收任务+代码路径
186
- Kyle->>Kyle: 代码审查+功能验收
187
- Kyle->>Shared: 输出审查报告
188
162
  Kyle-->>Max: 验收完成
189
163
 
190
164
  Max-->>User: 汇总全流程结果
@@ -214,7 +188,6 @@ flowchart LR
214
188
  EllaCtx -->|写入设计稿| Designs
215
189
  JarvisCtx -->|读取设计稿| Designs
216
190
  KyleCtx -->|写入审查报告| Reviews
217
- MaxCtx -->|写入任务文档| Tasks
218
191
 
219
192
  style MaxCtx fill:#4A90D9,color:#fff
220
193
  style EllaCtx fill:#E91E63,color:#fff
@@ -224,57 +197,30 @@ flowchart LR
224
197
 
225
198
  > **关键规则**:子 Agent 之间不能直接通信,所有上下文由 Max 在派遣时注入,跨 Agent 协作通过 `.dev-agents/shared/` 目录下的文件实现。
226
199
 
227
- ### 并行与串行
228
-
229
- ```mermaid
230
- flowchart TD
231
- User(["用户: 多个任务"]) --> Max["Max 分析"]
232
- Max --> Check{"任务间有依赖?"}
233
-
234
- Check -->|无依赖| Parallel["并行派遣"]
235
- Parallel --> P1["Ella: 设计登录页"]
236
- Parallel --> P2["Jarvis: 开发后端 API"]
237
- P1 --> Merge["Max 汇总"]
238
- P2 --> Merge
239
-
240
- Check -->|有依赖| Sequential["串行执行"]
241
- Sequential --> S1["先: Ella 出设计稿"]
242
- S1 --> S2["后: Jarvis 按稿开发"]
243
- S2 --> Merge2["Max 汇总"]
244
- ```
245
-
246
200
  ## 工作流技能(门禁式管道)
247
201
 
248
- 受 [Superpowers](https://github.com/obra/superpowers) 和 [Harness Engineering](https://martinfowler.com/articles/harness-engineering.html) 启发,aiGroup 内置工作流技能,形成严格的门禁管道——每个环节必须完成才能进入下一步:
202
+ 受 [Superpowers](https://github.com/obra/superpowers) 和 [Harness Engineering](https://martinfowler.com/articles/harness-engineering.html) 启发,内置 8 阶段门禁管道:
249
203
 
250
204
  ```
251
- brainstormingwriting-planssubagent-driven-developmentfinishing-a-development-branch
252
- ↑ ↑
253
- systematic-debugging verification-before-completion
254
- (遇 Bug 时触发) (任何完成声明前触发)
255
-
256
- entropy-management
257
- (定期维护触发)
205
+ 需求收集需求验证方案设计任务拆解 → 实施开发 → 测试验证 → 文档更新 → 分支收尾
258
206
  ```
259
207
 
260
208
  | 技能 | 触发时机 | 核心规则 |
261
209
  |------|---------|---------|
262
- | **brainstorming** | 任何创造性工作之前 | 一次一个问题、2-3 方案对比、用户批准后才能继续 |
263
- | **writing-plans** | 有设计方案后、编码前 | 任务粒度 2-5 分钟、禁止占位符、每步有完整代码 |
264
- | **subagent-driven-development** | 有计划后、开发执行 | 每任务新子代理、两阶段审查(先规格后质量) |
265
- | **systematic-debugging** | 遇到 Bug/测试失败 | 四阶段根因分析、3 次失败后质疑架构 |
266
- | **verification-before-completion** | 声称完成/通过之前 | 无验证证据不得声明完成 |
267
- | **finishing-a-development-branch** | 所有任务完成后 | 全量测试 → 四选一集成方式 → 清理 |
268
- | **entropy-management** | 定期维护/漂移信号 | 传感器扫描 → 推理检查 → 修复 → 更新质量评分 |
210
+ | **brainstorming** | 创造性工作之前 | 一次一个问题、2-3 方案对比、用户批准后继续 |
211
+ | **writing-plans** | 编码前 | 任务粒度 2-5 分钟、禁止占位符、每步有完整代码 |
212
+ | **subagent-driven-development** | 开发执行 | 每任务新子代理、两阶段审查 |
213
+ | **systematic-debugging** | Bug/测试失败 | 四阶段根因分析、3 次失败后质疑架构 |
214
+ | **verification-before-completion** | 声称完成前 | 无验证证据不得声明完成 |
215
+ | **finishing-a-development-branch** | 任务完成后 | 全量测试 → 集成 → 清理 |
216
+ | **entropy-management** | 定期维护 | 传感器扫描 → 修复 → 更新质量评分 |
269
217
 
270
218
  ### 两阶段审查
271
219
 
272
- 每次 Jarvis 完成开发后,Kyle 按严格顺序执行:
273
-
274
220
  1. **Stage 1:规格符合性** — 多了什么?少了什么?偏离了什么?
275
221
  2. **Stage 2:代码质量** — 干净、安全、可维护?
276
222
 
277
- Stage 1 不通过 → 修复 → 重审 Stage 1 → 通过后才进入 Stage 2
223
+ Stage 1 不通过 → 修复 → 重审 → 通过后才进入 Stage 2
278
224
 
279
225
  ### 三条铁律
280
226
 
@@ -284,72 +230,60 @@ Stage 1 不通过 → 修复 → 重审 Stage 1 → 通过后才进入 Stage 2
284
230
  3. 不确定时先问 — 宁可多问一句,不要假设
285
231
  ```
286
232
 
287
- ## 使用示例
288
-
289
- ### 示例 1:完整功能开发
290
-
291
- ```
292
- 你: 帮我做一个用户认证系统
293
-
294
- Max: [启动 brainstorming] → 逐个提问澄清需求 → 展示设计方案 → 用户批准
295
- Max: [启动 writing-plans] → 产出分步实现计划 → 用户确认
296
- Max: [启动 subagent-driven-development]
297
- → 派遣 Jarvis 执行任务 1 → Kyle Stage 1 审查 → Kyle Stage 2 审查
298
- → 派遣 Jarvis 执行任务 2 → Kyle Stage 1 审查 → Kyle Stage 2 审查
299
- → ...
300
- Max: [启动 finishing-a-development-branch] → 全量测试 → 用户选择集成方式
301
- ```
302
-
303
- ### 示例 2:直接派遣设计
233
+ ## 技能体系
304
234
 
305
- ```
306
- /ella 设计一个电商首页,风格参考 Apple Store,需要有 hero banner、商品分类、推荐列表
235
+ ### 技能与角色对应
307
236
 
308
- → Ella 读取 PERSONA 和 ui-ux-pro-max 技能
309
- 产出设计稿到 .dev-agents/shared/designs/ecommerce-home.md
310
- 返回:设计稿路径 + 设计决策摘要 + 实现注意事项
311
- ```
237
+ ```mermaid
238
+ flowchart TB
239
+ subgraph MAX["Max 项目经理"]
240
+ M1["workflow\n8阶段工作流管道"]
241
+ M2["PM 辅助技能\n竞品分析/PRD/会议纪要等"]
242
+ end
312
243
 
313
- ### 示例 3:代码审查
244
+ subgraph ELLA["Ella 设计师"]
245
+ E1["ui-ux-pro-max\n50+ 设计风格"]
246
+ E2["senior-frontend\n前端最佳实践"]
247
+ E3["前端框架 x7\nReact/Vue/Angular/Next.js\nFlutter/RN"]
248
+ end
314
249
 
315
- ```
316
- /kyle 审查 src/auth/ 目录下的认证模块代码,对照实现计划 .dev-agents/shared/tasks/auth-plan.md
250
+ subgraph JARVIS["Jarvis 开发"]
251
+ J1["架构与设计 x7"]
252
+ J2["后端框架 x7"]
253
+ J3["编程语言 x11"]
254
+ J4["数据库与数据 x8"]
255
+ J5["DevOps x6"]
256
+ J6["安全与工具 x6"]
257
+ end
317
258
 
318
- Kyle 读取实现计划和代码
319
- Stage 1:逐条检查规格符合性
320
- Stage 2:检查代码质量、安全性、可维护性
321
- → 产出审查报告到 .dev-agents/shared/reviews/auth-review.md
259
+ subgraph KYLE["Kyle 质量保障"]
260
+ K1["senior-qa + tdd-guide"]
261
+ K2["test-master + code-reviewer"]
262
+ K3["security-reviewer"]
263
+ K4["playwright-expert + chaos-engineer"]
264
+ end
322
265
  ```
323
266
 
324
- ### 示例 4:Bug 调试
325
-
326
- ```
327
- 你: 用户登录后 token 刷新失败,返回 401
328
-
329
- → Max 检测到 Bug 信号,启动 systematic-debugging
330
- → 派遣 Jarvis 执行四阶段根因调查
331
- → 第一阶段:阅读错误信息、稳定复现
332
- → 第二阶段:找到可工作示例,对照差异
333
- → 第三阶段:假设验证(一次一个变量)
334
- → 第四阶段:创建失败测试 → 修复 → 验证
335
- ```
267
+ ### 技能分布
336
268
 
337
- ### 示例 5:Harness 健康检查
269
+ | 角色 | 技能数 | 核心领域 |
270
+ |------|--------|---------|
271
+ | **Max** (PM) | 16 | 8 阶段工作流管道 + 3 横切技能 + 5 PM 辅助技能 |
272
+ | **Ella** (设计) | 10 | UI/UX 设计 + 前端最佳实践 + 7 前端框架 |
273
+ | **Jarvis** (开发) | 45 | 架构设计、后端框架、编程语言、数据库、DevOps、安全编码 |
274
+ | **Kyle** (QA) | 7 | QA 实践、TDD、测试策略、代码审查、安全审计、E2E、混沌工程 |
338
275
 
339
- ```
340
- 你: 跑一下项目健康检查
276
+ ### 技能来源
341
277
 
342
- Max 启动 entropy-management 技能
343
- → 第一阶段:运行 scripts/harness/run-all.sh 自动化扫描
344
- 第二阶段:推理型扫描(文档一致性、架构漂移)
345
- 第三阶段:修复问题 + 将重复问题编码为约束
346
- 第四阶段:更新 docs/QUALITY_SCORE.md docs/tech-debt-tracker.md
347
- ```
278
+ | 技能 | 来源 | 许可证 |
279
+ |------|------|--------|
280
+ | 工作流技能 (11个) | 原创,受 [obra/superpowers](https://github.com/obra/superpowers) 和 [Harness Engineering](https://martinfowler.com/articles/harness-engineering.html) 启发 | MIT |
281
+ | 开发/QA/前端技能 (62个) | [Jeffallan/claude-skills](https://github.com/Jeffallan/claude-skills) | MIT |
282
+ | PM 辅助技能 (5个) | [mohitagw15856/pm-claude-skills](https://github.com/mohitagw15856/pm-claude-skills) | MIT |
283
+ | UI/UX Pro Max / Senior 系列 | SkillsMP 技能市场 | MIT |
348
284
 
349
285
  ## 集成到已有项目
350
286
 
351
- aiGroup 可以作为"脚手架"集成到你的任何项目中。
352
-
353
287
  ### 方式一:CLI 工具(推荐)
354
288
 
355
289
  ```bash
@@ -361,272 +295,104 @@ npx aigroup-workflow init
361
295
 
362
296
  ### 方式二:手动复制
363
297
 
364
- 将以下目录和文件复制到你的项目根目录:
365
-
366
298
  ```bash
367
299
  # 必须复制
368
300
  CLAUDE.md # Agent 入口
369
301
  docs/ # 知识库
370
- .claude/ # Claude Code 配置(commands/ + hooks.json + settings.json)
302
+ .claude/ # Claude Code 配置
371
303
  .dev-agents/ # 角色定义 + 协作产物目录
372
304
  scripts/harness/ # Harness 传感器
373
305
 
374
306
  # 按需复制
375
307
  skills/max/workflow/ # 工作流技能(强烈推荐)
376
- skills/ella/ # 设计技能(如果需要 UI 设计)
377
- skills/jarvis/ # 开发技能(如果需要工程技能集)
378
- skills/kyle/ # QA 技能(如果需要质量保障)
308
+ skills/ella/ # 设计技能
309
+ skills/jarvis/ # 开发技能
310
+ skills/kyle/ # QA 技能
379
311
  ```
380
312
 
381
- ### 适配你的项目
382
-
383
- 1. **编辑 `CLAUDE.md`**:不需要大改,只需确认知识库地图路径正确
384
- 2. **编辑 `docs/ARCHITECTURE.md`**:替换为你项目的架构描述
385
- 3. **编辑 `docs/coding-standards.md`**:替换为你项目的编码规范
386
- 4. **编辑 `.dev-agents/*/PERSONA.md`**:根据需要调整角色定义
387
-
388
313
  ### 验证安装
389
314
 
390
315
  ```bash
391
- aigroup check
316
+ aig check
392
317
  # 或
393
318
  bash scripts/harness/run-all.sh
394
319
  ```
395
320
 
396
- 所有检查通过即可开始使用。
397
-
398
- ## 常用命令速查
399
-
400
- ### 日常使用
401
-
402
- | 命令 | 说明 | 使用场景 |
403
- |------|------|---------|
404
- | `claude` | 启动 Claude Code + Max | 开始工作 |
405
- | `/ella <任务>` | 直接派遣设计师 | 界面设计、交互原型 |
406
- | `/jarvis <任务>` | 直接派遣开发 | 编码、技术方案、Bug 修复 |
407
- | `/kyle <任务>` | 直接派遣质量保障 | 代码审查、功能验收 |
408
-
409
- ### CLI 工具
410
-
411
- | 命令 | 说明 |
412
- |------|------|
413
- | `aigroup init` | 交互式初始化框架 |
414
- | `aigroup init --yes` | 使用默认配置初始化 |
415
- | `aigroup update` | 增量更新技能和传感器 |
416
- | `aigroup check` | 运行 Harness 健康检查 |
417
- | `aigroup status` | 查看工作流状态 |
418
-
419
- ### Harness 维护
420
-
421
- | 命令 | 说明 | 建议频率 |
422
- |------|------|---------|
423
- | `bash scripts/harness/run-all.sh` | 全量 Harness 传感器检查 | 每次开发完成后 |
424
- | `bash scripts/check-gitignore.sh` | 检查 .gitignore 规则 | 添加新文件类型时 |
425
- | `bash scripts/clean-system-files.sh` | 清理 .DS_Store 等系统文件 | 偶尔运行 |
426
-
427
- > Windows 用户:用 Git Bash 运行以上命令(`"D:\Git\bin\bash.exe" scripts/harness/run-all.sh`)。
428
-
429
- ### 自定义与扩展
430
-
431
- | 想要做 | 修改什么 |
432
- |--------|---------|
433
- | 调整 Agent 角色定义 | `.dev-agents/{name}/PERSONA.md` |
434
- | 修改工作流规则 | `skills/max/workflow/{skill}/SKILL.md` |
435
- | 添加新的编码规范 | `docs/coding-standards.md` |
436
- | 添加新的传感器检查 | `scripts/harness/lint-*.sh` 中添加检查项 |
437
- | 添加新的危险信号 | `docs/red-flags.md` 中添加条目 |
438
- | 将重复问题编码为约束 | 遵循 `docs/steering-loop.md` 转向循环流程 |
439
- | 添加新的 Hook | `.claude/hooks.json` 中添加事件 |
440
- | 修改权限控制 | `.claude/settings.json` 中调整 allow/deny |
441
- | 添加新团队成员 | 新建 `.dev-agents/{name}/PERSONA.md` + `.claude/commands/{name}.md` |
442
-
443
321
  ## 项目结构
444
322
 
445
323
  ```
446
324
  aiGroup/
447
- ├── CLAUDE.md # Agent 入口:全局地图
325
+ ├── CLAUDE.md # Agent 入口
448
326
  ├── package.json # npm 包配置
449
327
  ├── bin/aigroup.mjs # CLI 入口
450
328
  ├── cli/ # CLI 实现
451
- │ ├── commands/ # init / update / check / status
329
+ │ ├── commands/ # init / update / check / status / menu
452
330
  │ └── utils/ # prompts / logger / scaffold
453
331
  ├── docs/ # 知识库(唯一事实源)
454
- ├── ARCHITECTURE.md # 项目架构总览
455
- │ ├── workflow-pipeline.md # 工作流管道详细规则
456
- │ ├── dispatch-rules.md # 派遣规则与上下文传递
457
- ├── coding-standards.md # 编码与 Git 规范
458
- ├── red-flags.md # 危险信号检测
459
- ├── QUALITY_SCORE.md # 质量评分追踪
460
- ├── tech-debt-tracker.md # 技术债追踪
461
- └── steering-loop.md # Harness 转向循环
462
- ├── .claude/ # Claude Code 原生配置
463
- │ ├── settings.json # 项目级权限设置
464
- │ ├── hooks.json # Harness 生命周期 Hooks
465
- │ └── commands/ # 斜杠命令(/ella /jarvis /kyle)
332
+ ├── .claude/ # Claude Code 配置
333
+ │ ├── settings.json # 权限设置
334
+ │ ├── hooks.json # Harness Hooks
335
+ └── commands/ # 斜杠命令
336
+ ├── ella.md # /ella
337
+ ├── jarvis.md # /jarvis
338
+ ├── kyle.md # /kyle
339
+ ├── init-project.md # /init-project
340
+ │ └── git-commit.md # /git-commit
466
341
  ├── .dev-agents/ # 角色定义 + 协作产物
467
342
  │ ├── ella/PERSONA.md
468
343
  │ ├── jarvis/PERSONA.md
469
344
  │ ├── kyle/PERSONA.md
470
- │ └── shared/ # 协作产物(tasks/ designs/ reviews/ templates/)
471
- ├── skills/ # 技能资源(按角色分组)
472
- │ ├── max/ # PM 技能
473
- ├── workflow/ # 8 阶段工作流管道 + 横切技能(11 个)
474
- ├── competitive-analysis/ # 竞品分析
475
- │ ├── meeting-notes/ # 会议纪要
476
- │ │ ├── prd-template/ # PRD 撰写
477
- │ │ ├── stakeholder-update/ # 干系人汇报
478
- │ │ └── user-research-synthesis/ # 用户研究综合
479
- │ ├── ella/ # 设计技能(10 个)
480
- │ │ ├── ui-ux-pro-max/ # 50+ 设计风格、97 色彩方案
481
- │ │ ├── senior-frontend/ # 前端最佳实践
482
- │ │ ├── react-expert/ # React 组件与 Hooks
483
- │ │ ├── nextjs-developer/ # Next.js SSR/SSG
484
- │ │ ├── vue-expert/ # Vue 3 (TypeScript)
485
- │ │ ├── vue-expert-js/ # Vue 3 (JavaScript)
486
- │ │ ├── angular-architect/ # Angular 企业级架构
487
- │ │ ├── react-native-expert/ # React Native 移动端
488
- │ │ ├── flutter-expert/ # Flutter 跨平台
489
- │ │ └── commands/ # 设计工具命令
490
- │ ├── jarvis/ # 开发技能(45 个)
491
- │ │ ├── architecture-designer/ # 系统架构设计
492
- │ │ ├── api-designer/ # API 设计
493
- │ │ ├── fullstack-guardian/ # 全栈安全开发
494
- │ │ ├── microservices-architect/ # 微服务架构
495
- │ │ ├── secure-code-guardian/ # 安全编码
496
- │ │ ├── debugging-wizard/ # 系统化调试
497
- │ │ ├── typescript-pro/ # TypeScript 专家
498
- │ │ ├── python-pro/ # Python 专家
499
- │ │ ├── golang-pro/ # Go 专家
500
- │ │ └── ... # 更多语言/框架/DevOps 技能
501
- │ └── kyle/ # QA 技能(7 个)
502
- │ ├── senior-qa/ # QA 最佳实践
503
- │ ├── tdd-guide/ # TDD 指南
504
- │ ├── test-master/ # 测试策略
505
- │ ├── code-reviewer/ # 代码审查
506
- │ ├── security-reviewer/ # 安全审计
507
- │ ├── playwright-expert/ # E2E 测试
508
- │ └── chaos-engineer/ # 混沌工程
509
- ├── scripts/ # 自动化脚本
510
- │ ├── harness/ # Harness 传感器套件
511
- │ │ ├── run-all.sh # 全量传感器运行器
512
- │ │ ├── lint-structure.sh # 结构检查
513
- │ │ ├── lint-docs.sh # 文档新鲜度检查
514
- │ │ ├── lint-workflow-artifacts.sh # 工作流产物检查
515
- │ │ ├── hook-post-edit.sh # PostToolUse Hook
516
- │ │ ├── hook-stop.sh # Stop Hook(back-pressure)
517
- │ │ └── hook-subagent-stop.sh # SubagentStop Hook
518
- │ ├── check-gitignore.sh # .gitignore 规则检查
519
- │ └── clean-system-files.sh # 系统文件清理
520
- └── README.md
521
- ```
522
-
523
- ## 技能体系
524
-
525
- ### 技能与角色对应
526
-
527
- ```mermaid
528
- flowchart TB
529
- subgraph MAX["Max 项目经理"]
530
- M1["workflow\n8阶段工作流管道"]
531
- M2["PM 辅助技能\n竞品分析/PRD/会议纪要等"]
532
- end
533
-
534
- subgraph ELLA["Ella 设计师"]
535
- E1["ui-ux-pro-max\n50+ 设计风格"]
536
- E2["senior-frontend\n前端最佳实践"]
537
- E3["前端框架 x7\nReact/Vue/Angular/Next.js\nFlutter/RN"]
538
- end
539
-
540
- subgraph JARVIS["Jarvis 开发"]
541
- J1["架构与设计 x7"]
542
- J2["后端框架 x7"]
543
- J3["编程语言 x11"]
544
- J4["数据库与数据 x8"]
545
- J5["DevOps x6"]
546
- J6["安全与工具 x6"]
547
- end
548
-
549
- subgraph KYLE["Kyle 质量保障"]
550
- K1["senior-qa + tdd-guide"]
551
- K2["test-master\n测试策略"]
552
- K3["code-reviewer\n代码审查"]
553
- K4["security-reviewer\n安全审计"]
554
- K5["playwright-expert\nE2E 测试"]
555
- K6["chaos-engineer\n混沌工程"]
556
- end
345
+ │ └── shared/ # tasks/ designs/ reviews/ templates/
346
+ ├── skills/ # 技能库(按角色分组)
347
+ │ ├── max/ # PM: workflow(11) + 辅助技能(5)
348
+ │ ├── ella/ # 设计: UI/UX + 前端框架(10)
349
+ │ ├── jarvis/ # 开发: 45 Skills
350
+ └── kyle/ # QA: 7 Skills
351
+ └── scripts/harness/ # Harness 传感器套件
557
352
  ```
558
353
 
559
- ### 技能分布总览
560
-
561
- | 角色 | 技能数 | 核心领域 |
562
- |------|--------|---------|
563
- | **Max** (PM) | 16 | 8 阶段工作流管道 + 3 横切技能 + 5 PM 辅助技能 |
564
- | **Ella** (设计) | 10 | UI/UX 设计 + 前端最佳实践 + 7 前端框架 |
565
- | **Jarvis** (开发) | 45 | 架构设计、后端框架、编程语言、数据库、DevOps、安全编码 |
566
- | **Kyle** (QA) | 7 | QA 实践、TDD、测试策略、代码审查、安全审计、E2E、混沌工程 |
567
-
568
- ## 技能来源
569
-
570
- | 技能 | 来源 | 许可证 |
571
- |------|------|--------|
572
- | 工作流技能 (11个) | 原创,受 [obra/superpowers](https://github.com/obra/superpowers) 和 [Harness Engineering](https://martinfowler.com/articles/harness-engineering.html) 启发 | MIT |
573
- | Jarvis/Kyle/Ella 开发技能 (62个) | [Jeffallan/claude-skills](https://github.com/Jeffallan/claude-skills) | MIT |
574
- | PM 辅助技能 (5个) | [mohitagw15856/pm-claude-skills](https://github.com/mohitagw15856/pm-claude-skills) | MIT |
575
- | UI/UX Pro Max | SkillsMP 技能市场 | MIT |
576
- | Senior Frontend / QA / TDD | SkillsMP 技能市场 | MIT |
577
-
578
- ## Harness Engineering 体系
579
-
580
- aiGroup 采用 [Harness Engineering](https://martinfowler.com/articles/harness-engineering.html) 理念,通过约束、反馈回路和持续改进循环提升 Agent 可靠性。
581
-
582
- ### 核心公式
354
+ ## Harness Engineering
583
355
 
584
356
  ```
585
357
  Agent = Model + Harness
586
358
  ```
587
359
 
588
- 不优化模型本身,而是优化模型运行的环境。
589
-
590
- ### 四层防线
591
-
592
360
  | 层级 | 机制 | 实现 |
593
361
  |------|------|------|
594
- | **前馈引导** | Agent 行动前引导方向 | CLAUDE.md 地图、Skills 渐进披露、工作流管道 |
595
- | **计算型反馈** | 确定性检查,快速自动运行 | `scripts/harness/` 传感器套件 + Claude Code Hooks |
596
- | **推理型反馈** | AI 语义审查 | Kyle 两阶段审查(规格符合性 + 代码质量) |
597
- | **熵管理** | 防止长期退化 | entropy-management 技能 + 质量评分追踪 |
598
-
599
- ### Harness 传感器
362
+ | **前馈引导** | 行动前引导 | CLAUDE.mdSkills、工作流管道 |
363
+ | **计算型反馈** | 确定性检查 | Harness 传感器 + Hooks |
364
+ | **推理型反馈** | AI 审查 | Kyle 两阶段审查 |
365
+ | **熵管理** | 防退化 | entropy-management + 质量评分 |
600
366
 
601
367
  ```bash
602
368
  bash scripts/harness/run-all.sh # 全量检查
603
369
  ```
604
370
 
605
- 传感器输出对 Agent 友好:`[PASS]` 通过、`[FAIL]` 失败 + `[FIX]` 修复指令。
606
-
607
- ### 转向循环
608
-
609
- ```
610
- 发现重复问题 → 编码为约束(Linter/文档/技能)→ 自动执行 → 更新质量评分
611
- ```
612
-
613
- 详见 `docs/steering-loop.md`。
614
-
615
- ### 知识库
371
+ ## 常用命令速查
616
372
 
617
- 所有规范、架构决策、质量追踪均版本化存储在 `docs/` 目录下,作为项目的唯一事实源。
618
- CLAUDE.md 仅作为地图入口(< 100 行),详细内容按需从 `docs/` 检索。
373
+ | 命令 | 说明 |
374
+ |------|------|
375
+ | `aig` | 交互式主菜单 |
376
+ | `aig init` | 初始化框架 |
377
+ | `aig update` | 增量更新 |
378
+ | `aig check` | 健康检查 |
379
+ | `aig status` | 工作流状态 |
380
+ | `/ella <任务>` | 派遣设计师 |
381
+ | `/jarvis <任务>` | 派遣开发 |
382
+ | `/kyle <任务>` | 派遣 QA |
383
+ | `/init-project <名称>` | 项目 AI 上下文初始化 |
384
+ | `/git-commit` | 智能 Git 提交 |
385
+
386
+ > `aig` 是 `aigroup` 的短别名。npx 用户:`npx aigroup-workflow <命令>`。
619
387
 
620
388
  ## 致谢
621
389
 
622
- 本项目基于 [yezannnnn/agentGroup](https://github.com/yezannnnn/agentGroup) 进行开发和扩展。感谢原作者 [@yezannnnn](https://github.com/yezannnnn) 提出的四 AI 专业分工协作框架理念,为本项目奠定了坚实的基础。
390
+ 本项目基于 [yezannnnn/agentGroup](https://github.com/yezannnnn/agentGroup) 进行开发和扩展。感谢原作者 [@yezannnnn](https://github.com/yezannnnn) 提出的四 AI 专业分工协作框架理念。
623
391
 
624
392
  ## 社区支持
625
393
 
626
394
  <div align="center">
627
395
 
628
- **学 AI,上 L 站**
629
-
630
396
  [![LINUX DO](https://img.shields.io/badge/LINUX%20DO-社区-gray?style=flat-square)](https://linux.do/) [![社区支持](https://img.shields.io/badge/社区支持-交流-blue?style=flat-square)](https://linux.do/)
631
397
 
632
398
  本项目在 [LINUX DO](https://linux.do/) 社区发布与交流,感谢佬友们的支持与反馈。
package/bin/aigroup.mjs CHANGED
@@ -67,11 +67,15 @@ async function main() {
67
67
  }
68
68
  case 'help':
69
69
  case '--help':
70
- case '-h':
71
- case '': {
70
+ case '-h': {
72
71
  printHelp()
73
72
  break
74
73
  }
74
+ case '': {
75
+ const { showMenu } = await import('../cli/commands/menu.mjs')
76
+ await showMenu(ctx)
77
+ break
78
+ }
75
79
  default: {
76
80
  console.error(`\n 未知命令: ${command}\n`)
77
81
  printHelp()
@@ -86,7 +90,7 @@ function printHelp() {
86
90
  ║ aiGroup — AI 团队协作框架 CLI ║
87
91
  ╚══════════════════════════════════════════╝
88
92
 
89
- 用法: aigroup <命令> [选项]
93
+ 用法: aig <命令> [选项] (也可用 aigroup)
90
94
 
91
95
  命令:
92
96
  init, i 完整初始化(交互式选择角色、技能、配置)
@@ -97,13 +101,12 @@ function printHelp() {
97
101
 
98
102
  选项:
99
103
  --yes, -y 跳过确认,全部使用默认值
100
- --lang <语言> 设置语言(zh-CN / en)
101
104
 
102
105
  示例:
103
- npx aigroup-workflow init # 交互式初始化
104
- npx aigroup-workflow init --yes # 使用默认配置初始化
105
- npx aigroup-workflow update # 增量更新
106
- npx aigroup-workflow check # 健康检查
106
+ npx aig init # 交互式初始化
107
+ npx aig init --yes # 使用默认配置初始化
108
+ npx aig update # 增量更新
109
+ npx aig check # 健康检查
107
110
  `)
108
111
  }
109
112
 
@@ -43,9 +43,9 @@ export async function init(ctx) {
43
43
  log.info('使用默认配置:全部角色')
44
44
  } else {
45
45
  selectedAgents = await multiSelect('选择要安装的团队成员', [
46
- { name: AGENT_ASSETS.jarvis.label, value: 'jarvis', checked: true },
47
- { name: AGENT_ASSETS.ella.label, value: 'ella', checked: true },
48
- { name: AGENT_ASSETS.kyle.label, value: 'kyle', checked: true },
46
+ { name: '贾维斯 (Jarvis)', value: 'jarvis', description: '全栈开发工程师 · 45 Skills', checked: true },
47
+ { name: '艾拉 (Ella)', value: 'ella', description: 'UI/UX 设计师 · 10 Skills', checked: true },
48
+ { name: '凯尔 (Kyle)', value: 'kyle', description: '质量保证工程师 · 7 Skills', checked: true },
49
49
  ])
50
50
 
51
51
  if (selectedAgents.length === 0) {
@@ -0,0 +1,65 @@
1
+ /**
2
+ * menu 命令 — 交互式主菜单(类似 zcf 风格)
3
+ */
4
+
5
+ import { select } from '../utils/prompts.mjs'
6
+ import * as log from '../utils/logger.mjs'
7
+ import { isInitialized, readConfig } from '../utils/scaffold.mjs'
8
+
9
+ export async function showMenu(ctx) {
10
+ log.banner()
11
+
12
+ // 检测项目状态
13
+ const initialized = isInitialized(ctx.PROJECT_ROOT)
14
+ if (initialized) {
15
+ const config = readConfig(ctx.PROJECT_ROOT)
16
+ if (config) {
17
+ log.dim(`已初始化 · 角色: ${config.agents?.join(', ') || '未知'} · 版本: ${config.version || '?'}`)
18
+ }
19
+ } else {
20
+ log.dim('当前项目尚未初始化 aiGroup 框架')
21
+ }
22
+
23
+ // 主菜单循环
24
+ while (true) {
25
+ const action = await select('选择操作', [
26
+ { name: '初始化项目', value: 'init', description: '交互式选择角色和技能,安装框架文件' },
27
+ { name: '增量更新', value: 'update', description: '更新技能和传感器,保留自定义配置' },
28
+ { name: '健康检查', value: 'check', description: '运行 Harness 传感器全量检查' },
29
+ { name: '工作流状态', value: 'status', description: '查看当前工作流管道状态' },
30
+ { name: '退出', value: 'quit', description: '' },
31
+ ])
32
+
33
+ if (action === 'quit') {
34
+ console.log('')
35
+ break
36
+ }
37
+
38
+ console.log('')
39
+
40
+ switch (action) {
41
+ case 'init': {
42
+ const { init } = await import('./init.mjs')
43
+ await init(ctx)
44
+ break
45
+ }
46
+ case 'update': {
47
+ const { update } = await import('./update.mjs')
48
+ await update(ctx)
49
+ break
50
+ }
51
+ case 'check': {
52
+ const { check } = await import('./check.mjs')
53
+ await check(ctx)
54
+ break
55
+ }
56
+ case 'status': {
57
+ const { status } = await import('./status.mjs')
58
+ await status(ctx)
59
+ break
60
+ }
61
+ }
62
+
63
+ console.log('')
64
+ }
65
+ }
@@ -1,9 +1,30 @@
1
1
  /**
2
- * 交互式提示工具 — 零依赖,基于 Node.js readline
2
+ * 交互式提示工具 — 零依赖,inquirer 风格
3
+ *
4
+ * 样式参考 zcf (https://github.com/UfoMiao/zcf)
5
+ * - 方向键移动光标
6
+ * - 空格切换选中(多选)/ 回车选择(单选)
7
+ * - 彩色描述文字
3
8
  */
4
9
 
5
10
  import { createInterface } from 'node:readline'
6
11
 
12
+ // ── ANSI 颜色 ──
13
+
14
+ const C = {
15
+ reset: '\x1b[0m',
16
+ bold: '\x1b[1m',
17
+ dim: '\x1b[2m',
18
+ cyan: '\x1b[36m',
19
+ green: '\x1b[32m',
20
+ yellow: '\x1b[33m',
21
+ gray: '\x1b[90m',
22
+ blue: '\x1b[34m',
23
+ white: '\x1b[37m',
24
+ hideCursor: '\x1b[?25l',
25
+ showCursor: '\x1b[?25h',
26
+ }
27
+
7
28
  function createRL() {
8
29
  return createInterface({
9
30
  input: process.stdin,
@@ -18,7 +39,7 @@ export async function confirm(message, defaultValue = true) {
18
39
  const rl = createRL()
19
40
  const hint = defaultValue ? 'Y/n' : 'y/N'
20
41
  return new Promise(resolve => {
21
- rl.question(` ? ${message} (${hint}) `, answer => {
42
+ rl.question(` ${C.cyan}?${C.reset} ${C.bold}${message}${C.reset} ${C.dim}(${hint})${C.reset} `, answer => {
22
43
  rl.close()
23
44
  if (!answer.trim()) return resolve(defaultValue)
24
45
  resolve(answer.trim().toLowerCase().startsWith('y'))
@@ -31,9 +52,9 @@ export async function confirm(message, defaultValue = true) {
31
52
  */
32
53
  export async function input(message, defaultValue = '') {
33
54
  const rl = createRL()
34
- const hint = defaultValue ? ` (${defaultValue})` : ''
55
+ const hint = defaultValue ? ` ${C.dim}(${defaultValue})${C.reset}` : ''
35
56
  return new Promise(resolve => {
36
- rl.question(` ? ${message}${hint}: `, answer => {
57
+ rl.question(` ${C.cyan}?${C.reset} ${C.bold}${message}${C.reset}${hint} `, answer => {
37
58
  rl.close()
38
59
  resolve(answer.trim() || defaultValue)
39
60
  })
@@ -41,9 +62,10 @@ export async function input(message, defaultValue = '') {
41
62
  }
42
63
 
43
64
  /**
44
- * 多选菜单 — 方向键移动,空格切换选中,回车确认
65
+ * 多选菜单 — inquirer checkbox 风格
66
+ *
45
67
  * @param {string} message
46
- * @param {{ name: string, value: string, checked?: boolean }[]} choices
68
+ * @param {{ name: string, value: string, description?: string, checked?: boolean }[]} choices
47
69
  * @returns {Promise<string[]>}
48
70
  */
49
71
  export async function multiSelect(message, choices) {
@@ -52,26 +74,35 @@ export async function multiSelect(message, choices) {
52
74
  )
53
75
  let cursor = 0
54
76
 
55
- function render() {
56
- // 移动光标到列表起始位置并清除下方内容
57
- process.stdout.write(`\x1B[${choices.length + 1}A`)
58
- process.stdout.write('\x1B[0J')
59
- choices.forEach((c, i) => {
60
- const pointer = i === cursor ? '❯' : ' '
61
- const mark = selected.has(c.value) ? '◉' : ''
62
- console.log(` ${pointer} ${mark} ${c.name}`)
63
- })
64
- process.stdout.write(' ↑↓ 移动 空格 切换 回车 确认')
77
+ function renderLine(c, i) {
78
+ const pointer = i === cursor ? `${C.cyan}❯${C.reset}` : ' '
79
+ const check = selected.has(c.value)
80
+ ? `${C.green}◉${C.reset}`
81
+ : `${C.dim}◯${C.reset}`
82
+ const name = i === cursor ? `${C.white}${C.bold}${c.name}${C.reset}` : c.name
83
+ const desc = c.description ? ` ${C.gray}— ${c.description}${C.reset}` : ''
84
+ return ` ${pointer} ${check} ${name}${desc}`
85
+ }
86
+
87
+ function renderHint() {
88
+ return ` ${C.dim}↑↓ 移动${C.reset} ${C.dim}空格 选择${C.reset} ${C.dim}a 全选/取消${C.reset} ${C.dim}回车 确认${C.reset}`
89
+ }
90
+
91
+ function render(isFirst) {
92
+ if (!isFirst) {
93
+ // 回到列表顶部重绘
94
+ process.stdout.write(`\x1b[${choices.length + 1}A\x1b[0J`)
95
+ }
96
+ for (const [i, c] of choices.entries()) {
97
+ console.log(renderLine(c, i))
98
+ }
99
+ process.stdout.write(renderHint())
65
100
  }
66
101
 
67
102
  // 首次绘制
68
- console.log(`\n ? ${message}`)
69
- choices.forEach((c, i) => {
70
- const pointer = i === cursor ? '❯' : ' '
71
- const mark = selected.has(c.value) ? '◉' : '◯'
72
- console.log(` ${pointer} ${mark} ${c.name}`)
73
- })
74
- process.stdout.write(' ↑↓ 移动 空格 切换 回车 确认')
103
+ console.log(`\n ${C.cyan}?${C.reset} ${C.bold}${message}${C.reset} ${C.dim}(空格选择, 回车确认)${C.reset}`)
104
+ process.stdout.write(C.hideCursor)
105
+ render(true)
75
106
 
76
107
  return new Promise(resolve => {
77
108
  const { stdin } = process
@@ -84,29 +115,43 @@ export async function multiSelect(message, choices) {
84
115
  // Ctrl+C
85
116
  if (key === '\x03') {
86
117
  cleanup()
118
+ process.stdout.write(C.showCursor)
87
119
  process.exit(0)
88
120
  }
89
121
  // 回车 — 确认
90
122
  if (key === '\r' || key === '\n') {
91
123
  cleanup()
92
- // 清除提示行并显示最终选择
93
- process.stdout.write('\r\x1B[K\n')
94
- return resolve([...selected])
124
+ process.stdout.write(`\r\x1b[K\n`)
125
+ process.stdout.write(C.showCursor)
126
+ // 打印选择结果
127
+ const result = [...selected]
128
+ const names = choices.filter(c => result.includes(c.value)).map(c => c.name)
129
+ if (names.length) {
130
+ console.log(` ${C.green}✔${C.reset} 已选择: ${C.cyan}${names.join(', ')}${C.reset}`)
131
+ }
132
+ return resolve(result)
95
133
  }
96
134
  // 空格 — 切换选中
97
135
  if (key === ' ') {
98
136
  const val = choices[cursor].value
99
137
  if (selected.has(val)) selected.delete(val)
100
138
  else selected.add(val)
101
- render()
139
+ render(false)
102
140
  return
103
141
  }
104
- // 方向键(上: \x1B[A, 下: \x1B[B)
105
- if (key === '\x1B[A' || key === '\x1B[B') {
106
- if (key === '\x1B[A') cursor = (cursor - 1 + choices.length) % choices.length
107
- else cursor = (cursor + 1) % choices.length
108
- render()
142
+ // a 全选/全不选
143
+ if (key === 'a' || key === 'A') {
144
+ if (selected.size === choices.length) {
145
+ selected.clear()
146
+ } else {
147
+ for (const c of choices) selected.add(c.value)
148
+ }
149
+ render(false)
150
+ return
109
151
  }
152
+ // 方向键
153
+ if (key === '\x1b[A') { cursor = (cursor - 1 + choices.length) % choices.length; render(false) }
154
+ if (key === '\x1b[B') { cursor = (cursor + 1) % choices.length; render(false) }
110
155
  }
111
156
 
112
157
  function cleanup() {
@@ -120,29 +165,71 @@ export async function multiSelect(message, choices) {
120
165
  }
121
166
 
122
167
  /**
123
- * 单选菜单
168
+ * 单选菜单 — inquirer list 风格
169
+ *
124
170
  * @param {string} message
125
- * @param {{ name: string, value: string }[]} choices
171
+ * @param {{ name: string, value: string, description?: string }[]} choices
126
172
  * @returns {Promise<string>}
127
173
  */
128
174
  export async function select(message, choices) {
129
- console.log(`\n ? ${message}`)
130
- console.log('')
175
+ let cursor = 0
131
176
 
132
- choices.forEach((c, i) => {
133
- console.log(` ${i + 1}. ${c.name}`)
134
- })
177
+ function renderLine(c, i) {
178
+ const pointer = i === cursor ? `${C.cyan}❯${C.reset}` : ' '
179
+ const name = i === cursor ? `${C.cyan}${C.bold}${c.name}${C.reset}` : c.name
180
+ const desc = c.description ? ` ${C.gray}— ${c.description}${C.reset}` : ''
181
+ return ` ${pointer} ${name}${desc}`
182
+ }
183
+
184
+ function renderHint() {
185
+ return ` ${C.dim}↑↓ 移动${C.reset} ${C.dim}回车 选择${C.reset}`
186
+ }
187
+
188
+ function render(isFirst) {
189
+ if (!isFirst) {
190
+ process.stdout.write(`\x1b[${choices.length + 1}A\x1b[0J`)
191
+ }
192
+ for (const [i, c] of choices.entries()) {
193
+ console.log(renderLine(c, i))
194
+ }
195
+ process.stdout.write(renderHint())
196
+ }
197
+
198
+ // 首次绘制
199
+ console.log(`\n ${C.cyan}?${C.reset} ${C.bold}${message}${C.reset}`)
200
+ process.stdout.write(C.hideCursor)
201
+ render(true)
135
202
 
136
- const rl = createRL()
137
203
  return new Promise(resolve => {
138
- rl.question(`\n 输入编号选择 (1-${choices.length}): `, answer => {
139
- rl.close()
140
- const idx = parseInt(answer.trim()) - 1
141
- if (idx >= 0 && idx < choices.length) {
142
- resolve(choices[idx].value)
143
- } else {
144
- resolve(choices[0].value)
204
+ const { stdin } = process
205
+ const wasRaw = stdin.isRaw
206
+ stdin.setRawMode(true)
207
+ stdin.resume()
208
+ stdin.setEncoding('utf-8')
209
+
210
+ function onData(key) {
211
+ if (key === '\x03') {
212
+ cleanup()
213
+ process.stdout.write(C.showCursor)
214
+ process.exit(0)
145
215
  }
146
- })
216
+ if (key === '\r' || key === '\n') {
217
+ cleanup()
218
+ process.stdout.write(`\r\x1b[K\n`)
219
+ process.stdout.write(C.showCursor)
220
+ console.log(` ${C.green}✔${C.reset} 已选择: ${C.cyan}${choices[cursor].name}${C.reset}`)
221
+ return resolve(choices[cursor].value)
222
+ }
223
+ if (key === '\x1b[A') { cursor = (cursor - 1 + choices.length) % choices.length; render(false) }
224
+ if (key === '\x1b[B') { cursor = (cursor + 1) % choices.length; render(false) }
225
+ }
226
+
227
+ function cleanup() {
228
+ stdin.removeListener('data', onData)
229
+ stdin.setRawMode(wasRaw ?? false)
230
+ stdin.pause()
231
+ }
232
+
233
+ stdin.on('data', onData)
147
234
  })
148
235
  }
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "aigroup-workflow",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "description": "AI 团队协作框架 — 通过角色派遣、工作流管道和 Harness 传感器驱动 AI 协作开发",
5
5
  "type": "module",
6
6
  "bin": {
7
- "aigroup": "bin/aigroup.mjs"
7
+ "aigroup": "bin/aigroup.mjs",
8
+ "aig": "bin/aigroup.mjs"
8
9
  },
9
10
  "files": [
10
11
  "bin/",
@@ -29,7 +30,5 @@
29
30
  "engines": {
30
31
  "node": ">=18.0.0"
31
32
  },
32
- "dependencies": {
33
- "aigroup-workflow": "^1.0.0"
34
- }
33
+ "dependencies": {}
35
34
  }