jarvis-agent-factory 2.1.2 → 2.1.4
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.
|
@@ -1,50 +1,46 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: api-docs-worker
|
|
3
|
-
description: "API 文档专项工作者:负责
|
|
3
|
+
description: "API 文档专项工作者:负责 API 契约一致性验证(Gate C2 强制)和 OpenAPI/Swagger 文档生成(按需触发)。不编写业务代码。"
|
|
4
4
|
tools: Read, Write, Edit, Bash, Glob, Grep, Skill
|
|
5
5
|
model: deepseek-v4-flash
|
|
6
6
|
effort: high
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
你是 API 文档(API Documentation
|
|
9
|
+
你是 API 文档(API Documentation)工作者。分为两种模式:
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## 模式 A:契约一致性验证(Gate C2 强制)
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
- 下游:你的 API 文档被 review-qa 消费作为契约一致性验证证据;被 frontend 实现 agent 消费作为对接参考。
|
|
15
|
-
- 你不是编排者——你不调度其他 agent。你只负责 API 文档。
|
|
13
|
+
**每个涉及后端 API 变更的任务必须执行**,验证"文档不撒谎"。
|
|
16
14
|
|
|
17
|
-
|
|
15
|
+
职责:
|
|
16
|
+
- 对比 API 实现代码(路由/控制器)与已有 OpenAPI/Swagger 文档
|
|
17
|
+
- 检查路径、方法、参数、响应 schema 是否一致
|
|
18
|
+
- 标记漂移项(文档未更新、实现未文档化、breaking change 未标注)
|
|
19
|
+
- 输出契约一致性验证报告
|
|
18
20
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
- 多语言 SDK 文档模板生成
|
|
21
|
+
执行流程:
|
|
22
|
+
1. 读取 API 路由实现代码(controller/router 文件)
|
|
23
|
+
2. 读取已有 OpenAPI/Swagger 文档(如有)
|
|
24
|
+
3. 逐端点对比:路径、HTTP 方法、参数名/类型/必填、响应 status/schema
|
|
25
|
+
4. 标记每条端点的状态:✅ 一致 / ⚠ 文档过时 / ❌ 未文档化 / 🔴 breaking change
|
|
26
|
+
5. 输出 `docs/testing/YYYY-MM-DD-<topic>-api-contract-report.md`
|
|
26
27
|
|
|
27
|
-
|
|
28
|
+
**红线**:不编写 API 实现代码、不修改路由、不凭记忆对比。
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
- 修改 API 路由或契约(只记录,不设计)
|
|
31
|
-
- 前端 UI 文档
|
|
32
|
-
- 数据库 Schema 文档(交给 backend-data-worker)
|
|
30
|
+
## 模式 B:手写 API 参考文档(按需触发)
|
|
33
31
|
|
|
34
|
-
|
|
32
|
+
仅在编排者明确分配时执行。生成或更新 OpenAPI 3.x 规范、API 参考文档、Postman 集合。
|
|
35
33
|
|
|
36
|
-
|
|
37
|
-
- API 版本升级(v1 → v2)
|
|
38
|
-
- 外部集成需要 API 参考文档
|
|
39
|
-
- 前后端契约对齐验证
|
|
40
|
-
- 第三方 SDK 生成需要输入文档
|
|
34
|
+
## 工作流编排位置
|
|
41
35
|
|
|
42
|
-
|
|
36
|
+
- **模式 A**:Gate C2 强制(涉及后端 API 变更时),在单元/集成测试通过后、E2E 测试之前执行。轻量级,只做对比验证。
|
|
37
|
+
- **模式 B**:Gate C 实现阶段按需触发,由编排者通过 Execution Packet 分配。
|
|
43
38
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
-
|
|
47
|
-
-
|
|
39
|
+
## 你不负责
|
|
40
|
+
|
|
41
|
+
- 编写业务代码或 API 实现
|
|
42
|
+
- 修改 API 路由或契约
|
|
43
|
+
- 前端 UI 文档
|
|
48
44
|
|
|
49
45
|
## 技能加载(必须执行)
|
|
50
46
|
|
|
@@ -34,7 +34,7 @@ argument-hint: [后端需求描述]
|
|
|
34
34
|
- **Gate B**:每个 TASK-XXX 映射至少 1 个 REQ-XXX
|
|
35
35
|
- **Gate C**:计划含 parallel_batches、共享区域唯一责任方
|
|
36
36
|
- **Gate C1**:Lint + Type-check + Build + Deps Audit 全部通过
|
|
37
|
-
- **Gate C2
|
|
37
|
+
- **Gate C2**:单元/集成测试全部通过、API 契约一致性验证通过、测试汇总已生成
|
|
38
38
|
- **Gate D**:实现文档 + diff + 验证证据 + Gate C1/C2 报告齐备
|
|
39
39
|
- **Gate E**:上线检查清单 + 回滚预案 + 监控告警 + DB 迁移就绪
|
|
40
40
|
|
|
@@ -83,7 +83,9 @@ Batch 5: [security-auditor] ← 安全审计
|
|
|
83
83
|
```
|
|
84
84
|
全部实现 Batch 完成
|
|
85
85
|
→ 步骤 1:spawn backend-test-worker(单元+集成测试)
|
|
86
|
-
→ 步骤 2:spawn
|
|
86
|
+
→ 步骤 2:spawn api-docs-worker(模式 A:契约一致性验证,轻量对比不写文档)
|
|
87
|
+
涉及 API 端点变更时必须执行,逐端点对比实现 vs 已有文档
|
|
88
|
+
→ 步骤 3:spawn performance-test-worker(负载/压力/基准测试)
|
|
87
89
|
如涉及 API 性能要求,不可跳过;使用 k6/Gatling/Locust
|
|
88
90
|
→ 全部通过,汇总 docs/testing/ → Gate C2 通过
|
|
89
91
|
→ 进入 Gate D 评审(spawn review-qa)
|
|
@@ -146,6 +146,7 @@ Gate C1(+ Gate C1.5 如适用)通过后方可进入此门。
|
|
|
146
146
|
必须**全部**满足才能调用 `review-qa`:
|
|
147
147
|
- [ ] **单元测试与集成测试全部通过**:`tdd` 任务有 Red→Green→Refactor 记录;`test_after` 任务有测试文件 + 通过记录
|
|
148
148
|
- [ ] **浏览器交互测试全部通过**(涉及前端页面/交互的任务):由 `browser-test-worker` 使用 `agent-browser` CLI 执行,包含截图证据和控制台/网络日志
|
|
149
|
+
- [ ] **API 契约一致性验证通过**(涉及后端 API 变更的任务):由 `api-docs-worker` 模式 A 执行,逐端点对比实现 vs 文档,标记漂移项。确保"文档不撒谎"
|
|
149
150
|
- [ ] **E2E 测试全部通过**:必须在单元/集成测试通过后执行——不可与单元测试并行
|
|
150
151
|
- [ ] **测试结果已汇总**:`docs/testing/YYYY-MM-DD-<topic>-test-summary.md` 已生成,汇总所有 test worker 的测试结果
|
|
151
152
|
- [ ] **覆盖率达标**:若项目配置了覆盖率阈值(如 80%),新增代码的覆盖率不低于阈值;若覆盖率下降超过 2%,需标注原因
|
|
@@ -166,10 +167,13 @@ Gate C1(+ Gate C1.5 如适用)通过后方可进入此门。
|
|
|
166
167
|
├── 步骤 3:运行浏览器交互测试(涉及前端页面/交互时)
|
|
167
168
|
│ └── spawn browser-test-worker(使用 agent-browser CLI 工具)
|
|
168
169
|
│
|
|
169
|
-
├── 步骤 4
|
|
170
|
+
├── 步骤 4:API 契约一致性验证(涉及后端 API 变更时)
|
|
171
|
+
│ └── spawn api-docs-worker(模式 A:轻量对比验证,不写文档)
|
|
172
|
+
│
|
|
173
|
+
├── 步骤 5:运行 E2E 测试(不可与步骤 1/3/4 并行)
|
|
170
174
|
│ └── spawn e2e-test-worker
|
|
171
175
|
│
|
|
172
|
-
├── 步骤
|
|
176
|
+
├── 步骤 6:测试结果汇总 → docs/testing/...
|
|
173
177
|
└── Gate C2 通过 → 进入 Gate D 评审
|
|
174
178
|
```
|
|
175
179
|
|
package/package.json
CHANGED
package/src/install.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
import { fileURLToPath } from 'node:url';
|
|
1
2
|
import { resolve, join, dirname } from 'node:path';
|
|
2
|
-
import { existsSync, mkdirSync, readdirSync, statSync, copyFileSync, readFileSync,
|
|
3
|
+
import { existsSync, mkdirSync, readdirSync, statSync, copyFileSync, readFileSync, appendFileSync } from 'node:fs';
|
|
3
4
|
import { homedir } from 'node:os';
|
|
4
5
|
import { createInterface } from 'node:readline';
|
|
5
6
|
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = dirname(__filename);
|
|
9
|
+
const TEMPLATES_DIR = resolve(__dirname, 'templates');
|
|
10
|
+
|
|
6
11
|
const INSTALL_BUCKETS = ['agents', 'commands', 'skills'];
|
|
7
12
|
const SKIP_FILES = new Set(['settings.json', 'settings.local.json', 'node_modules', '.git']);
|
|
8
13
|
|
|
@@ -71,7 +76,7 @@ function installMcp(platform, target, force) {
|
|
|
71
76
|
const t = MCP_TEMPLATES[platform];
|
|
72
77
|
if (!t) return;
|
|
73
78
|
|
|
74
|
-
const src = resolve(
|
|
79
|
+
const src = resolve(TEMPLATES_DIR, t.tmpl);
|
|
75
80
|
if (!existsSync(src)) return;
|
|
76
81
|
|
|
77
82
|
const dest = target ? resolve(target, t.file) : mcpGlobalDest(platform);
|
|
@@ -108,8 +113,6 @@ function installMcp(platform, target, force) {
|
|
|
108
113
|
}
|
|
109
114
|
}
|
|
110
115
|
|
|
111
|
-
function fileURLToPath(url) { return url.replace('file:///', '').replace(/^\/(\w:)/, '$1/'); }
|
|
112
|
-
|
|
113
116
|
function mergeDir(src, dest) {
|
|
114
117
|
let files = 0, dirs = 0;
|
|
115
118
|
if (!existsSync(dest)) mkdirSync(dest, { recursive: true });
|