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.
- package/.claude/commands/git-commit.md +61 -0
- package/.claude/commands/init-project.md +83 -0
- package/.claude/commands/jarvis.md +6 -3
- package/README.md +136 -370
- package/bin/aigroup.mjs +11 -8
- package/cli/commands/init.mjs +3 -3
- package/cli/commands/menu.mjs +65 -0
- package/cli/utils/prompts.mjs +135 -48
- package/package.json +4 -5
|
@@ -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/
|
|
41
|
-
4. **按需** → `skills/jarvis/
|
|
42
|
-
5.
|
|
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
|
+
[](https://npmjs.com/package/aigroup-workflow)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
[](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
|
|
20
|
+
| Bash | 4.x+ | Harness 传感器(Windows 用 Git Bash) |
|
|
17
21
|
|
|
18
22
|
### 安装
|
|
19
23
|
|
|
20
24
|
```bash
|
|
21
|
-
#
|
|
25
|
+
# 方式一:全局安装(推荐,安装后可直接用 aig 命令)
|
|
22
26
|
npm install -g aigroup-workflow
|
|
23
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
`
|
|
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)
|
|
101
|
-
| 贾维斯 (Jarvis)
|
|
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)
|
|
202
|
+
受 [Superpowers](https://github.com/obra/superpowers) 和 [Harness Engineering](https://martinfowler.com/articles/harness-engineering.html) 启发,内置 8 阶段门禁管道:
|
|
249
203
|
|
|
250
204
|
```
|
|
251
|
-
|
|
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** |
|
|
263
|
-
| **writing-plans** |
|
|
264
|
-
| **subagent-driven-development** |
|
|
265
|
-
| **systematic-debugging** |
|
|
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 不通过 → 修复 → 重审
|
|
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
|
-
|
|
309
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
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
|
-
###
|
|
325
|
-
|
|
326
|
-
```
|
|
327
|
-
你: 用户登录后 token 刷新失败,返回 401
|
|
328
|
-
|
|
329
|
-
→ Max 检测到 Bug 信号,启动 systematic-debugging
|
|
330
|
-
→ 派遣 Jarvis 执行四阶段根因调查
|
|
331
|
-
→ 第一阶段:阅读错误信息、稳定复现
|
|
332
|
-
→ 第二阶段:找到可工作示例,对照差异
|
|
333
|
-
→ 第三阶段:假设验证(一次一个变量)
|
|
334
|
-
→ 第四阶段:创建失败测试 → 修复 → 验证
|
|
335
|
-
```
|
|
267
|
+
### 技能分布
|
|
336
268
|
|
|
337
|
-
|
|
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
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
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
|
|
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/ #
|
|
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
|
-
|
|
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
|
-
|
|
455
|
-
│ ├──
|
|
456
|
-
│ ├──
|
|
457
|
-
│
|
|
458
|
-
│
|
|
459
|
-
│
|
|
460
|
-
│
|
|
461
|
-
│
|
|
462
|
-
|
|
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/ #
|
|
471
|
-
├── skills/ #
|
|
472
|
-
│ ├── max/ # PM
|
|
473
|
-
│
|
|
474
|
-
│
|
|
475
|
-
│
|
|
476
|
-
|
|
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
|
-
| **前馈引导** |
|
|
595
|
-
| **计算型反馈** |
|
|
596
|
-
| **推理型反馈** | AI
|
|
597
|
-
| **熵管理** |
|
|
598
|
-
|
|
599
|
-
### Harness 传感器
|
|
362
|
+
| **前馈引导** | 行动前引导 | CLAUDE.md、Skills、工作流管道 |
|
|
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
|
-
|
|
606
|
-
|
|
607
|
-
### 转向循环
|
|
608
|
-
|
|
609
|
-
```
|
|
610
|
-
发现重复问题 → 编码为约束(Linter/文档/技能)→ 自动执行 → 更新质量评分
|
|
611
|
-
```
|
|
612
|
-
|
|
613
|
-
详见 `docs/steering-loop.md`。
|
|
614
|
-
|
|
615
|
-
### 知识库
|
|
371
|
+
## 常用命令速查
|
|
616
372
|
|
|
617
|
-
|
|
618
|
-
|
|
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
|
[](https://linux.do/) [](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
|
-
用法:
|
|
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
|
|
104
|
-
npx
|
|
105
|
-
npx
|
|
106
|
-
npx
|
|
106
|
+
npx aig init # 交互式初始化
|
|
107
|
+
npx aig init --yes # 使用默认配置初始化
|
|
108
|
+
npx aig update # 增量更新
|
|
109
|
+
npx aig check # 健康检查
|
|
107
110
|
`)
|
|
108
111
|
}
|
|
109
112
|
|
package/cli/commands/init.mjs
CHANGED
|
@@ -43,9 +43,9 @@ export async function init(ctx) {
|
|
|
43
43
|
log.info('使用默认配置:全部角色')
|
|
44
44
|
} else {
|
|
45
45
|
selectedAgents = await multiSelect('选择要安装的团队成员', [
|
|
46
|
-
{ name:
|
|
47
|
-
{ name:
|
|
48
|
-
{ name:
|
|
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
|
+
}
|
package/cli/utils/prompts.mjs
CHANGED
|
@@ -1,9 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 交互式提示工具 —
|
|
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(`
|
|
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(`
|
|
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
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
|
69
|
-
|
|
70
|
-
|
|
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(
|
|
94
|
-
|
|
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
|
-
//
|
|
105
|
-
if (key === '
|
|
106
|
-
if (
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
|
|
130
|
-
console.log('')
|
|
175
|
+
let cursor = 0
|
|
131
176
|
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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.
|
|
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
|
}
|