@vima_tech/flywheel 1.2.1 → 1.2.3
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/bin/flywheel.js +81 -3
- package/package.json +3 -2
- package/scripts/flywheel-install.sh +62 -1
- package/skills/_kernel/distillation.md +11 -11
- package/skills/req-mining/artifacts.md +185 -0
- package/skills/req-mining/domain.md +243 -0
- package/skills/req-mining/feedback-questions.sh +9 -0
- package/skills/req-mining/industry/erp.md +108 -0
- package/skills/req-mining/industry/retail.md +24 -0
- package/skills/req-mining/memory/failure-patterns.md +84 -0
- package/skills/req-mining/skill.yaml +44 -0
- package/templates/state.json +1 -0
package/bin/flywheel.js
CHANGED
|
@@ -3,6 +3,7 @@ const { spawn, execSync } = require('child_process');
|
|
|
3
3
|
const path = require('path');
|
|
4
4
|
const fs = require('fs');
|
|
5
5
|
const os = require('os');
|
|
6
|
+
const readline = require('readline');
|
|
6
7
|
|
|
7
8
|
const NPM_PKG = '@vima_tech/flywheel';
|
|
8
9
|
|
|
@@ -70,12 +71,17 @@ async function initKernel(dir, skill) {
|
|
|
70
71
|
}
|
|
71
72
|
|
|
72
73
|
if (skill) {
|
|
73
|
-
const
|
|
74
|
+
const skillRequired = [
|
|
74
75
|
'skills/' + skill + '/skill.yaml',
|
|
75
76
|
'skills/' + skill + '/domain.md',
|
|
76
77
|
'skills/' + skill + '/feedback-questions.sh',
|
|
77
78
|
];
|
|
78
|
-
|
|
79
|
+
const skillOptional = [
|
|
80
|
+
'skills/' + skill + '/artifacts.md',
|
|
81
|
+
'skills/' + skill + '/memory/failure-patterns.md',
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
for (const f of skillRequired) {
|
|
79
85
|
const dest = path.join(dir, f);
|
|
80
86
|
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
81
87
|
const srcPath = resolveKernelFile(f);
|
|
@@ -85,6 +91,34 @@ async function initKernel(dir, skill) {
|
|
|
85
91
|
await downloadFile(baseUrl + '/' + f, dest);
|
|
86
92
|
}
|
|
87
93
|
}
|
|
94
|
+
|
|
95
|
+
for (const f of skillOptional) {
|
|
96
|
+
const dest = path.join(dir, f);
|
|
97
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
98
|
+
const srcPath = resolveKernelFile(f);
|
|
99
|
+
if (fs.existsSync(srcPath)) {
|
|
100
|
+
fs.copyFileSync(srcPath, dest);
|
|
101
|
+
} else {
|
|
102
|
+
try { await downloadFile(baseUrl + '/' + f, dest); } catch (e) {}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// 解析 skill.yaml 中声明的行业包,逐一下载(找不到则跳过)
|
|
107
|
+
const skillYamlPath = path.join(dir, 'skills/' + skill + '/skill.yaml');
|
|
108
|
+
if (fs.existsSync(skillYamlPath)) {
|
|
109
|
+
const yamlContent = fs.readFileSync(skillYamlPath, 'utf8');
|
|
110
|
+
for (const match of yamlContent.matchAll(/^\s+file:\s+(.+)$/gm)) {
|
|
111
|
+
const f = match[1].trim();
|
|
112
|
+
const dest = path.join(dir, f);
|
|
113
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
114
|
+
const srcPath = resolveKernelFile(f);
|
|
115
|
+
if (fs.existsSync(srcPath)) {
|
|
116
|
+
fs.copyFileSync(srcPath, dest);
|
|
117
|
+
} else {
|
|
118
|
+
try { await downloadFile(baseUrl + '/' + f, dest); } catch (e) {}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
88
122
|
}
|
|
89
123
|
|
|
90
124
|
fs.mkdirSync(path.join(dir, '.distill-needed'), { recursive: true });
|
|
@@ -254,6 +288,45 @@ async function updateProjectFramework(projectPath) {
|
|
|
254
288
|
console.log(' ✗ ' + f + ' (失败)');
|
|
255
289
|
}
|
|
256
290
|
}
|
|
291
|
+
|
|
292
|
+
// 更新已安装的 skill 文件
|
|
293
|
+
const flywheelMarker = path.join(projectPath, '.flywheel');
|
|
294
|
+
if (fs.existsSync(flywheelMarker)) {
|
|
295
|
+
let skill = '';
|
|
296
|
+
try { skill = JSON.parse(fs.readFileSync(flywheelMarker, 'utf8')).skill || ''; } catch (e) {}
|
|
297
|
+
if (skill && skill !== 'none') {
|
|
298
|
+
console.log(' 更新 skill: ' + skill);
|
|
299
|
+
const skillFiles = [
|
|
300
|
+
'skills/' + skill + '/skill.yaml',
|
|
301
|
+
'skills/' + skill + '/domain.md',
|
|
302
|
+
'skills/' + skill + '/feedback-questions.sh',
|
|
303
|
+
'skills/' + skill + '/artifacts.md',
|
|
304
|
+
'skills/' + skill + '/memory/failure-patterns.md',
|
|
305
|
+
];
|
|
306
|
+
for (const f of skillFiles) {
|
|
307
|
+
const dest = path.join(projectPath, f);
|
|
308
|
+
try {
|
|
309
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
310
|
+
await downloadFile(baseUrl + '/' + f, dest);
|
|
311
|
+
console.log(' ✓ ' + f);
|
|
312
|
+
} catch (e) {}
|
|
313
|
+
}
|
|
314
|
+
// 更新行业包(从已下载的 skill.yaml 中读取)
|
|
315
|
+
const skillYamlPath = path.join(projectPath, 'skills/' + skill + '/skill.yaml');
|
|
316
|
+
if (fs.existsSync(skillYamlPath)) {
|
|
317
|
+
const yamlContent = fs.readFileSync(skillYamlPath, 'utf8');
|
|
318
|
+
for (const match of yamlContent.matchAll(/^\s+file:\s+(.+)$/gm)) {
|
|
319
|
+
const f = match[1].trim();
|
|
320
|
+
const dest = path.join(projectPath, f);
|
|
321
|
+
try {
|
|
322
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
323
|
+
await downloadFile(baseUrl + '/' + f, dest);
|
|
324
|
+
console.log(' ✓ ' + f);
|
|
325
|
+
} catch (e) {}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
257
330
|
}
|
|
258
331
|
|
|
259
332
|
async function cmdUpgrade(args) {
|
|
@@ -338,6 +411,7 @@ Flywheel CLI — 自成长 AI Agent 飞轮框架
|
|
|
338
411
|
install|add|i 安装 skill 包
|
|
339
412
|
list|ls 列出已安装的 skill
|
|
340
413
|
update [skill] 更新 skill 包
|
|
414
|
+
publish <skill> 发布自建 skill 到注册表
|
|
341
415
|
distill|dist 手动触发蒸馏
|
|
342
416
|
upgrade [path] 升级 flywheel 工具,并更新项目框架
|
|
343
417
|
-h|--help 显示帮助
|
|
@@ -361,7 +435,7 @@ switch (command) {
|
|
|
361
435
|
case '--version':
|
|
362
436
|
case '-V':
|
|
363
437
|
case 'version':
|
|
364
|
-
console.log('@vima_tech/flywheel v1.2.
|
|
438
|
+
console.log('@vima_tech/flywheel v1.2.2');
|
|
365
439
|
break;
|
|
366
440
|
case 'new':
|
|
367
441
|
case 'create':
|
|
@@ -390,6 +464,7 @@ Flywheel CLI — 自成长 AI Agent 飞轮框架
|
|
|
390
464
|
install|add|i 安装 skill 包
|
|
391
465
|
list|ls 列出已安装的 skill
|
|
392
466
|
update [skill] 更新 skill 包
|
|
467
|
+
publish <skill> 发布自建 skill 到注册表
|
|
393
468
|
distill|dist 手动触发蒸馏
|
|
394
469
|
upgrade [path] 升级 flywheel 工具,并更新项目框架
|
|
395
470
|
-h|--help 显示帮助
|
|
@@ -424,6 +499,9 @@ Flywheel CLI — 自成长 AI Agent 飞轮框架
|
|
|
424
499
|
case 'update':
|
|
425
500
|
runScript(resolveScript('flywheel-install'), ['update', ...restArgs]).catch((e) => process.exit(1));
|
|
426
501
|
break;
|
|
502
|
+
case 'publish':
|
|
503
|
+
runScript(resolveScript('flywheel-install'), ['publish', ...restArgs]).catch((e) => process.exit(1));
|
|
504
|
+
break;
|
|
427
505
|
case 'distill':
|
|
428
506
|
case 'dist':
|
|
429
507
|
runScript(resolveScript('auto-distill'), restArgs).catch((e) => process.exit(1));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vima_tech/flywheel",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.3",
|
|
4
4
|
"description": "自成长 AI Agent 飞轮框架 — 让任何需要积累迭代的 AI 工作流都能自我进化",
|
|
5
5
|
"main": "bin/flywheel.js",
|
|
6
6
|
"bin": {
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
"scripts/",
|
|
14
14
|
"templates/",
|
|
15
15
|
"skills/_kernel/",
|
|
16
|
-
"skills/_template/"
|
|
16
|
+
"skills/_template/",
|
|
17
|
+
"skills/req-mining/"
|
|
17
18
|
],
|
|
18
19
|
"scripts": {
|
|
19
20
|
"postinstall": "chmod +x bin/flywheel.js"
|
|
@@ -83,6 +83,66 @@ cmd_add() {
|
|
|
83
83
|
curl -fsSL $CURL_PROXY "$BASE_URL/install.sh" | bash -s -- "$skill"
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
+
# ── publish ────────────────────────────────────────────────────
|
|
87
|
+
cmd_publish() {
|
|
88
|
+
local skill="$1"
|
|
89
|
+
[ -z "$skill" ] && { echo "❌ 用法:$0 publish <skill-name>"; exit 1; }
|
|
90
|
+
|
|
91
|
+
local yaml="$REPO_DIR/skills/$skill/skill.yaml"
|
|
92
|
+
[ -f "$yaml" ] || { echo "❌ skill '$skill' 未找到:$yaml"; exit 1; }
|
|
93
|
+
|
|
94
|
+
local name version description
|
|
95
|
+
name=$(grep '^name:' "$yaml" | head -1 | awk '{print $2}')
|
|
96
|
+
version=$(grep '^version:' "$yaml" | head -1 | awk '{print $2}')
|
|
97
|
+
description=$(grep '^description:' "$yaml" | head -1 | cut -d: -f2- | xargs)
|
|
98
|
+
|
|
99
|
+
local available_file="$SCRIPT_DIR/available.json"
|
|
100
|
+
|
|
101
|
+
echo "━━━ 发布 skill: $skill ━━━"
|
|
102
|
+
echo ""
|
|
103
|
+
|
|
104
|
+
# 检查是否已在注册表中
|
|
105
|
+
if [ -f "$available_file" ] && python3 -c "
|
|
106
|
+
import json, sys
|
|
107
|
+
data = json.load(open('$available_file'))
|
|
108
|
+
sys.exit(0 if any(s['name']=='$name' for s in data.get('skills',[])) else 1)
|
|
109
|
+
" 2>/dev/null; then
|
|
110
|
+
echo " ℹ '$name' 已在 available.json 中,更新版本号..."
|
|
111
|
+
python3 - "$available_file" "$name" "$version" "$description" << 'PYEOF'
|
|
112
|
+
import json, sys
|
|
113
|
+
path, name, version, desc = sys.argv[1:]
|
|
114
|
+
data = json.load(open(path))
|
|
115
|
+
for s in data['skills']:
|
|
116
|
+
if s['name'] == name:
|
|
117
|
+
s['version'] = version
|
|
118
|
+
s['description'] = desc
|
|
119
|
+
break
|
|
120
|
+
with open(path, 'w') as f:
|
|
121
|
+
json.dump(data, f, ensure_ascii=False, indent=2)
|
|
122
|
+
f.write('\n')
|
|
123
|
+
print(" ✓ available.json 已更新")
|
|
124
|
+
PYEOF
|
|
125
|
+
else
|
|
126
|
+
# 追加到注册表
|
|
127
|
+
python3 - "$available_file" "$name" "$version" "$description" << 'PYEOF'
|
|
128
|
+
import json, sys
|
|
129
|
+
path, name, version, desc = sys.argv[1:]
|
|
130
|
+
data = json.load(open(path)) if __import__('os').path.exists(path) else {"skills": []}
|
|
131
|
+
data.setdefault('skills', []).append({"name": name, "version": version, "description": desc})
|
|
132
|
+
with open(path, 'w') as f:
|
|
133
|
+
json.dump(data, f, ensure_ascii=False, indent=2)
|
|
134
|
+
f.write('\n')
|
|
135
|
+
print(f" ✓ '{name}' 已添加到 available.json")
|
|
136
|
+
PYEOF
|
|
137
|
+
fi
|
|
138
|
+
|
|
139
|
+
echo ""
|
|
140
|
+
echo "下一步:提交到仓库让其他人也能安装"
|
|
141
|
+
echo " git add scripts/available.json skills/$skill/"
|
|
142
|
+
echo " git commit -m \"feat(skill): publish $name v$version\""
|
|
143
|
+
echo " git push && 发起 PR 到 https://github.com/renmengkai/flywheel"
|
|
144
|
+
}
|
|
145
|
+
|
|
86
146
|
# ── update ─────────────────────────────────────────────────────
|
|
87
147
|
cmd_update() {
|
|
88
148
|
local skills=()
|
|
@@ -136,8 +196,9 @@ case "$CMD" in
|
|
|
136
196
|
add) cmd_add "$TARGET" ;;
|
|
137
197
|
update) cmd_update ;;
|
|
138
198
|
available) cmd_available ;;
|
|
199
|
+
publish) cmd_publish "$TARGET" ;;
|
|
139
200
|
*)
|
|
140
|
-
echo "用法:$0 list | add <skill> | update [skill] | available"
|
|
201
|
+
echo "用法:$0 list | add <skill> | update [skill] | available | publish <skill>"
|
|
141
202
|
exit 1
|
|
142
203
|
;;
|
|
143
204
|
esac
|
|
@@ -69,17 +69,17 @@ estimated_tokens: 1500
|
|
|
69
69
|
+ 0.2 quality_score >= 0.6(feedback-hook 自动计算)
|
|
70
70
|
最高:0.9
|
|
71
71
|
路由规则:
|
|
72
|
-
unclear_specs → 更新 skills/
|
|
73
|
-
uncovered_decisions → 追加到 skills/
|
|
74
|
-
wrong_assumptions → 追加到 memory/
|
|
72
|
+
unclear_specs → 更新 skills/req-mining/artifacts.md 的"功能规格"章节
|
|
73
|
+
uncovered_decisions → 追加到 skills/req-mining/artifacts.md 的"未覆盖情况处理规则"
|
|
74
|
+
wrong_assumptions → 追加到 skills/req-mining/memory/failure-patterns.md
|
|
75
75
|
|
|
76
76
|
自驱分析完成事件(type: auto_req_completed):
|
|
77
77
|
+ 0.4 有假设被后续实现反馈验证(assumption_validated = true)
|
|
78
78
|
+ 0.3 assumptions_count >= 3(说明文档不完整,推断规则有价值)
|
|
79
79
|
最高:0.7
|
|
80
80
|
路由规则:
|
|
81
|
-
验证正确的假设 → 追加到 skills/
|
|
82
|
-
验证错误的假设 → 追加到 memory/
|
|
81
|
+
验证正确的假设 → 追加到 skills/req-mining/domain.md 的"推断规则库"(如不存在则新建章节)
|
|
82
|
+
验证错误的假设 → 追加到 skills/req-mining/memory/failure-patterns.md
|
|
83
83
|
```
|
|
84
84
|
|
|
85
85
|
**输出过滤结果:**
|
|
@@ -110,7 +110,7 @@ estimated_tokens: 1500
|
|
|
110
110
|
"pattern_summary": "用一句话描述这个模式",
|
|
111
111
|
"trigger_signals": ["触发这个模式的信号词或场景"],
|
|
112
112
|
"recommended_action": "遇到此情况时,Agent 应该...",
|
|
113
|
-
"target_file": "skills/
|
|
113
|
+
"target_file": "skills/req-mining/domain.md",
|
|
114
114
|
"target_section": "阶段三:约束摸底 / 预算追问逻辑",
|
|
115
115
|
"change_type": "append | replace | new_section",
|
|
116
116
|
"proposed_content": "具体的修改内容或新增内容",
|
|
@@ -135,7 +135,7 @@ estimated_tokens: 1500
|
|
|
135
135
|
|
|
136
136
|
"AI 执行时遇到的未覆盖场景 + 有人工决议"
|
|
137
137
|
→ pattern_type: decision_tree
|
|
138
|
-
→ 更新 skills/
|
|
138
|
+
→ 更新 skills/req-mining/artifacts.md 的"未覆盖情况处理规则"章节
|
|
139
139
|
|
|
140
140
|
"单一案例,不可泛化(置信度 < 0.6)"
|
|
141
141
|
→ 跳过,标注 low-signal,不写入任何文件
|
|
@@ -151,12 +151,12 @@ estimated_tokens: 1500
|
|
|
151
151
|
━━━ 蒸馏结果预览(共 N 项变更)━━━
|
|
152
152
|
|
|
153
153
|
变更 1/N:[skill_update]
|
|
154
|
-
文件:skills/
|
|
154
|
+
文件:skills/req-mining/domain.md → 章节名(append)
|
|
155
155
|
内容摘要:[拟新增内容的一句话描述]
|
|
156
156
|
置信度:0.82 | 来源:proj_xxx / evt_023
|
|
157
157
|
|
|
158
158
|
变更 2/N:[memory_entry]
|
|
159
|
-
文件:memory/
|
|
159
|
+
文件:skills/req-mining/memory/failure-patterns.md(append)
|
|
160
160
|
内容摘要:[拟新增内容的一句话描述]
|
|
161
161
|
置信度:0.75 | 来源:proj_xxx / evt_045
|
|
162
162
|
|
|
@@ -230,11 +230,11 @@ Sources: {event_id列表}"
|
|
|
230
230
|
实际写入变更:{Y} 条(跳过 {X-Y} 条:用户取消或低质量)
|
|
231
231
|
|
|
232
232
|
Skills 更新:
|
|
233
|
-
- skills/
|
|
233
|
+
- skills/req-mining/domain.md(v1.0 → v1.1)
|
|
234
234
|
- [其他更新文件]
|
|
235
235
|
|
|
236
236
|
Memory 更新:
|
|
237
|
-
- memory/
|
|
237
|
+
- skills/req-mining/memory/failure-patterns.md(+{N} 条)
|
|
238
238
|
|
|
239
239
|
下次蒸馏建议时机:完成 {下个project_id} 项目后
|
|
240
240
|
```
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: req-miner-artifacts
|
|
3
|
+
skill_id: req_miner_artifacts
|
|
4
|
+
version: 2.0
|
|
5
|
+
description: >
|
|
6
|
+
需求挖掘产物生成规格。仅在阶段四退出条件全部满足后加载。
|
|
7
|
+
定义三份产物的完整结构:需求澄清报告 + AI 执行文档 + 可视化原型规格。
|
|
8
|
+
is_required: false
|
|
9
|
+
hard_dep: [req_miner_core]
|
|
10
|
+
soft_dep: []
|
|
11
|
+
estimated_tokens: 1000
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# 产物生成规格
|
|
15
|
+
|
|
16
|
+
阶段四退出条件全部满足后,依次生成以下三份产物。
|
|
17
|
+
**三份产物信息来源完全一致,出现不一致 = 需求对话有遗漏,必须修正后再输出。**
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 输出前自检(必须执行,任一未通过则补充对话)
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
□ 业务流程是否完整?(销售/采购/库存/财务四条链条无断点)
|
|
25
|
+
□ MoSCoW 是否明确区分 Must / Should / Won't?
|
|
26
|
+
□ 是否有成本核算方法定义?
|
|
27
|
+
□ 是否有应收应付账款管理?
|
|
28
|
+
□ 是否有退货/售后流程?
|
|
29
|
+
□ 是否有数据备份和导出策略?
|
|
30
|
+
□ 验收标准是否包含性能指标(具体数字)?
|
|
31
|
+
□ 验收标准是否包含安全/权限要求?
|
|
32
|
+
□ Parking Lot 是否清零?
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 产物 1:需求澄清报告
|
|
38
|
+
|
|
39
|
+
**面向:** 甲方决策人(人话描述,客户签字确认)
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
1. 项目背景
|
|
43
|
+
项目名称 | 调研时间 | 客户行业 | 核心目标用户
|
|
44
|
+
|
|
45
|
+
2. 真实目标 vs 表达目标
|
|
46
|
+
甲方原话:[引用] → 真实目标:[澄清后] → 验证方式:[如何判断达成]
|
|
47
|
+
|
|
48
|
+
3. 功能范围(MoSCoW)
|
|
49
|
+
Must Have(本期必须):[列表]
|
|
50
|
+
Should Have(本期应该):[列表]
|
|
51
|
+
Won't Have(本期不做,原因):[列表]
|
|
52
|
+
|
|
53
|
+
4. 使用角色与场景
|
|
54
|
+
角色:[角色名] | 使用频率 | 核心任务
|
|
55
|
+
场景:至少 2 个完整端到端场景描述
|
|
56
|
+
|
|
57
|
+
5. 约束与边界
|
|
58
|
+
预算:[范围 + 决策链] | 时间:[期望上线 + 硬截止] | 部署:[方式]
|
|
59
|
+
技术:[已有系统/需对接/偏好] | 合规:[数据安全/等保要求]
|
|
60
|
+
|
|
61
|
+
6. 业务流程完整性说明
|
|
62
|
+
[描述销售/采购/库存/财务完整链条,标注本期覆盖范围]
|
|
63
|
+
|
|
64
|
+
7. 数据安全需求
|
|
65
|
+
权限模型 | 数据隔离级别 | 审计日志策略 | 合规要求
|
|
66
|
+
|
|
67
|
+
8. 非功能性需求
|
|
68
|
+
性能(具体数字)| 可用性(SLA)| 备份策略 | 导出格式 | 打印需求
|
|
69
|
+
|
|
70
|
+
9. 集成需求
|
|
71
|
+
[第三方系统] + [对接方式] + [数据格式]
|
|
72
|
+
|
|
73
|
+
10. 隐含假设清单
|
|
74
|
+
[假设内容] → 已确认 / 待确认 / 存在风险
|
|
75
|
+
|
|
76
|
+
11. Parking Lot(未解决问题)
|
|
77
|
+
[问题] | 风险级别 | 必须解决时间节点
|
|
78
|
+
|
|
79
|
+
12. 落地风险评估
|
|
80
|
+
[风险描述] | 可能性 | 影响 | 建议处理方式
|
|
81
|
+
|
|
82
|
+
13. 验收标准(≥5条,含功能性/非功能性/安全)
|
|
83
|
+
每条格式:[主语] + [操作] + [可测试结果]
|
|
84
|
+
|
|
85
|
+
14. 本期明确不做的功能(显式列出,防止后期扯皮)
|
|
86
|
+
|
|
87
|
+
15. 甲方确认签字栏
|
|
88
|
+
客户签字:____ | 分析师:____ | 日期:____
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 产物 2:AI 执行文档
|
|
94
|
+
|
|
95
|
+
**面向:** 执行 AI(无歧义技术规格)
|
|
96
|
+
**禁止出现:** 可能、也许、适当、合理、尽量、一般情况下
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
1. 系统概述
|
|
100
|
+
一段话:系统是什么,服务谁,核心特性,技术栈建议,部署架构
|
|
101
|
+
|
|
102
|
+
2. 技术约束(必须是具体数字)
|
|
103
|
+
并发用户数 | 页面加载时间 | 数据量级 | 响应时间 | 可用性 SLA
|
|
104
|
+
|
|
105
|
+
3. 权限模型(RBAC)
|
|
106
|
+
角色定义 | 权限矩阵 | 数据隔离级别 | API 鉴权方案 | 敏感操作二次确认清单
|
|
107
|
+
|
|
108
|
+
4. 数据模型
|
|
109
|
+
每个实体:表名 | 字段名 | 类型 | 约束 | 索引 | 外键 | 枚举值定义
|
|
110
|
+
|
|
111
|
+
5. 数据字典
|
|
112
|
+
所有枚举字段的完整取值定义(如订单状态、付款状态、角色类型)
|
|
113
|
+
|
|
114
|
+
6. 功能规格(每个 Must Have 功能点)
|
|
115
|
+
触发条件 | 输入(字段+验证规则)| 处理逻辑(步骤,无歧义)| 输出 | 异常处理 | 边界情况
|
|
116
|
+
|
|
117
|
+
7. 状态机定义
|
|
118
|
+
订单状态机 | 库存状态 | 支付状态(含每个状态的触发条件和转移规则)
|
|
119
|
+
|
|
120
|
+
8. 安全设计
|
|
121
|
+
密码加密方案 | 传输加密 | SQL 注入防护 | XSS 防护 | 审计日志字段定义
|
|
122
|
+
|
|
123
|
+
9. 数据库策略
|
|
124
|
+
索引设计 | 迁移策略 | 并发控制(乐观锁/悲观锁)| 备份方案
|
|
125
|
+
|
|
126
|
+
10. 验收测试用例
|
|
127
|
+
每个功能点:正向用例 + 异常用例 + 边界用例
|
|
128
|
+
|
|
129
|
+
11. 未覆盖情况处理规则
|
|
130
|
+
"遇到本文档未说明的情况,必须停止并记录,不得自行决定"
|
|
131
|
+
[列出已知高风险歧义场景及标准处理方式]
|
|
132
|
+
|
|
133
|
+
12. 变更记录
|
|
134
|
+
版本 | 日期 | 变更内容 | 确认人
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## 产物 3:可视化原型规格
|
|
140
|
+
|
|
141
|
+
**按已锁定的保真度等级输出(A/B/C,不可更改)**
|
|
142
|
+
|
|
143
|
+
**标注规范(所有等级通用):**
|
|
144
|
+
- 🔴 需要特别确认的业务逻辑
|
|
145
|
+
- 🟡 存在不确定性,待甲方说明
|
|
146
|
+
- 🟢 已确认,无需讨论
|
|
147
|
+
- ⚪ 本期范围外
|
|
148
|
+
|
|
149
|
+
**所有等级必须覆盖:**
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
□ 所有 Must Have 功能的页面/流程
|
|
153
|
+
□ 每个页面的边界情况(空状态 / 加载状态 / 错误状态)
|
|
154
|
+
□ 每个页面与验收标准的对应关系
|
|
155
|
+
□ 订单/库存状态机可视化流转图
|
|
156
|
+
□ 批量操作交互设计(批量导入/导出/修改)
|
|
157
|
+
□ 导出功能 UI 入口(Excel/PDF 导出按钮位置和进度提示)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**A. 流程图额外要求:**
|
|
161
|
+
- 页面节点 + 跳转逻辑 + 触发条件
|
|
162
|
+
- 每个节点的关键字段列表(文字说明)
|
|
163
|
+
|
|
164
|
+
**B. 线框图额外要求(在 A 基础上):**
|
|
165
|
+
- 完整字段标注(字段名、类型、是否必填)
|
|
166
|
+
- 关键交互标注(点击跳转目标)
|
|
167
|
+
- 打印样式设计(报价单/发票/出库单的打印布局)
|
|
168
|
+
|
|
169
|
+
**C. 中保真额外要求(在 B 基础上):**
|
|
170
|
+
- 基本配色方案(与客户品牌相符)
|
|
171
|
+
- 主要页面的视觉风格(字体、间距、卡片样式)
|
|
172
|
+
- 关键操作按钮样式
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 产物输出后操作
|
|
177
|
+
|
|
178
|
+
```
|
|
179
|
+
1. 更新 state.json → current_phase: "completed"
|
|
180
|
+
2. 归档本次会话日志(追加到 episodic-logs/{project_id}.jsonl)
|
|
181
|
+
3. 输出摘要:
|
|
182
|
+
"三份产物已生成。
|
|
183
|
+
本次对话:[N] 轮 | Parking Lot 解决:[N] 项 | 未覆盖决策:[N] 项
|
|
184
|
+
建议专家审查后发送给客户确认。"
|
|
185
|
+
```
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: auto-req
|
|
3
|
+
skill_id: auto_req
|
|
4
|
+
version: 1.0
|
|
5
|
+
description: >
|
|
6
|
+
自驱需求分析 Skill。无需人类实时对话,从输入文档(需求文档、邮件线程、
|
|
7
|
+
Jira tickets、会议记录)中自主运行四阶段框架,提取需求并生成三份产物。
|
|
8
|
+
是飞轮架构的 Ring 1 自驱化核心。
|
|
9
|
+
is_required: false
|
|
10
|
+
hard_dep: [req_miner_core]
|
|
11
|
+
soft_dep: []
|
|
12
|
+
estimated_tokens: 1200
|
|
13
|
+
trigger_phrases:
|
|
14
|
+
- "分析这份文档"
|
|
15
|
+
- "从文档提取需求"
|
|
16
|
+
- "无对话模式"
|
|
17
|
+
- "自动分析"
|
|
18
|
+
- "headless模式"
|
|
19
|
+
- "批量需求"
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# 自驱需求分析协议
|
|
23
|
+
|
|
24
|
+
**使用场景:** 客户已提供书面材料(需求文档、邮件、会议纪要、竞品截图),
|
|
25
|
+
无法实时对话,但需要结构化需求产物。
|
|
26
|
+
|
|
27
|
+
**与普通模式的区别:**
|
|
28
|
+
- 普通模式:与人类实时对话提炼需求
|
|
29
|
+
- 自驱模式:从文档推断需求,用 `⚠️ 假设` 标注所有不确定点,不阻塞流程
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Step 0:接收输入材料
|
|
34
|
+
|
|
35
|
+
用户提供以下任意格式:
|
|
36
|
+
- 直接粘贴文本
|
|
37
|
+
- 文件路径(读取内容)
|
|
38
|
+
- URL(抓取内容)
|
|
39
|
+
- 多份材料(合并分析)
|
|
40
|
+
|
|
41
|
+
**确认输入后,询问项目基本信息(一次性询问):**
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
已收到材料(约 XXX 字)。
|
|
45
|
+
|
|
46
|
+
请确认以下信息(可全部省略,我会从文档推断):
|
|
47
|
+
1. 项目名称:
|
|
48
|
+
2. 客户行业:
|
|
49
|
+
3. 分析侧重点(功能 / 约束 / 验收标准):
|
|
50
|
+
4. 缺失信息处理方式:
|
|
51
|
+
A. 标注假设,继续分析(推荐)
|
|
52
|
+
B. 列出问题,等待补充后再分析
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Step 1:材料扫描与信息提取
|
|
58
|
+
|
|
59
|
+
**读取所有材料,提取以下维度(静默执行,不逐条输出):**
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
维度 1:业务目标信号
|
|
63
|
+
- 明确陈述的目标
|
|
64
|
+
- 隐含目标(从"痛点"、"现在的问题"、"希望"等词推断)
|
|
65
|
+
- 利益相关者提及的关键词
|
|
66
|
+
|
|
67
|
+
维度 2:功能需求信号
|
|
68
|
+
- 动词短语("能够"、"支持"、"允许"、"需要")
|
|
69
|
+
- 角色 + 操作 + 对象 的句式
|
|
70
|
+
- 列表/表格中的功能点
|
|
71
|
+
|
|
72
|
+
维度 3:约束信号
|
|
73
|
+
- 数字(预算、时间、用户量、性能指标)
|
|
74
|
+
- 技术栈提及
|
|
75
|
+
- 安全/合规要求
|
|
76
|
+
- "不能"、"禁止"、"限制"等否定约束
|
|
77
|
+
|
|
78
|
+
维度 4:验收信号
|
|
79
|
+
- "验收"、"上线标准"、"测试"、"通过"等词周围的内容
|
|
80
|
+
- KPI、指标、可量化结果
|
|
81
|
+
|
|
82
|
+
维度 5:矛盾信号
|
|
83
|
+
- 同一实体在不同位置有不同描述
|
|
84
|
+
- 需求数量与预算/时间明显不匹配
|
|
85
|
+
- 技术限制与功能要求相冲突
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Step 2:四维度分析输出
|
|
91
|
+
|
|
92
|
+
**输出格式:**
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
━━━ 自驱分析结果 | 项目:{name} | 材料:{N}份 ━━━
|
|
96
|
+
|
|
97
|
+
## 一、目标层
|
|
98
|
+
|
|
99
|
+
真实目标(推断):[描述]
|
|
100
|
+
表达目标(材料原话):[引用]
|
|
101
|
+
推断依据:[关键词/段落]
|
|
102
|
+
⚠️ 假设 A1:[不确定点],假设为 [推断值],如有误请纠正
|
|
103
|
+
|
|
104
|
+
## 二、功能层
|
|
105
|
+
|
|
106
|
+
Must Have(明确提及 ≥2 处或被标注为核心):
|
|
107
|
+
• [功能1](来源:[段落标识])
|
|
108
|
+
• [功能2]
|
|
109
|
+
|
|
110
|
+
Should Have(明确提及 1 处):
|
|
111
|
+
• [功能3]
|
|
112
|
+
|
|
113
|
+
⚠️ 假设 F1:材料中提及"[X功能]"但未说明优先级,暂归为 Should Have
|
|
114
|
+
|
|
115
|
+
Won't Have(材料明确排除,或超出范围):
|
|
116
|
+
• [功能4](来源:[原话])
|
|
117
|
+
|
|
118
|
+
## 三、约束层
|
|
119
|
+
|
|
120
|
+
预算:[数值或"未提及,⚠️ 假设 C1:按中型项目估算 10-30万"]
|
|
121
|
+
时间:[数值或推断]
|
|
122
|
+
部署方式:[私有化/SaaS/未知]
|
|
123
|
+
用户规模:[数值或推断]
|
|
124
|
+
技术约束:[列表]
|
|
125
|
+
|
|
126
|
+
## 四、验收层
|
|
127
|
+
|
|
128
|
+
明确验收标准:
|
|
129
|
+
• [标准1](来源:[原话])
|
|
130
|
+
推断验收标准(从功能反推):
|
|
131
|
+
• [标准2](⚠️ 假设 V1:推断)
|
|
132
|
+
|
|
133
|
+
## 五、矛盾与风险
|
|
134
|
+
|
|
135
|
+
⚠️ 矛盾 M1:材料第3段说"[A]",第7段说"[B]",需确认
|
|
136
|
+
🔴 高风险:[需求规模与时间/预算明显不匹配 等]
|
|
137
|
+
|
|
138
|
+
## 六、信息缺口清单
|
|
139
|
+
|
|
140
|
+
以下信息材料中无法推断,需人工确认:
|
|
141
|
+
□ [问题1](影响:影响功能规格,阻塞产物2生成)
|
|
142
|
+
□ [问题2](影响:影响验收标准定义)
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Step 3:生成方式选择
|
|
148
|
+
|
|
149
|
+
**分析完成后,询问:**
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
━━━ 自驱分析完成 ━━━
|
|
153
|
+
|
|
154
|
+
发现信息缺口 {N} 处,其中:
|
|
155
|
+
- 阻塞级(必须确认才能输出):{M} 处
|
|
156
|
+
- 非阻塞级(可用假设替代):{N-M} 处
|
|
157
|
+
|
|
158
|
+
如何继续?
|
|
159
|
+
A. 立即生成三份产物(用假设填充缺口,产物中标注⚠️)
|
|
160
|
+
B. 先补充 {M} 处关键信息,再生成
|
|
161
|
+
C. 导出信息缺口清单,人工填写后继续
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Step 4:生成三份产物
|
|
167
|
+
|
|
168
|
+
收到用户选择后,加载 `skills/req-mining/artifacts.md`,
|
|
169
|
+
按规格生成三份产物。
|
|
170
|
+
|
|
171
|
+
**自驱模式特殊标注规则:**
|
|
172
|
+
|
|
173
|
+
- 所有通过推断而非明确确认的内容,加 `⚠️[假设:A1]` 标注
|
|
174
|
+
- 产物首页增加"假设清单"章节,汇总所有假设
|
|
175
|
+
- 验收标准中推断类标准,标注"待客户确认"
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Step 5:写入状态与日志
|
|
180
|
+
|
|
181
|
+
```python
|
|
182
|
+
# 更新 state.json
|
|
183
|
+
state["auto_req_mode"] = True
|
|
184
|
+
state["assumptions_count"] = N
|
|
185
|
+
state["info_gaps"] = [gap_list]
|
|
186
|
+
state["artifacts_generated"] = True
|
|
187
|
+
|
|
188
|
+
# 追加事件日志
|
|
189
|
+
event = {
|
|
190
|
+
"event_id": "evt_auto_req_001",
|
|
191
|
+
"type": "auto_req_completed",
|
|
192
|
+
"assumptions_count": N,
|
|
193
|
+
"info_gap_blocking": M,
|
|
194
|
+
"distillation_candidate": True
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Step 6:自动启动 Ring 2(飞轮衔接)
|
|
201
|
+
|
|
202
|
+
产物写入完成后,**直接通过 Bash 工具调用桥接脚本**,无需用户手动执行:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
./scripts/bridge-to-coder.sh {project_id} {tool}
|
|
206
|
+
# tool 默认 claude;若用户指定了其他工具则使用用户指定的
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
输出提示:
|
|
210
|
+
```
|
|
211
|
+
━━━ Ring 1 完成,自动启动 Ring 2 ━━━
|
|
212
|
+
正在调用:./scripts/bridge-to-coder.sh {project_id} {tool}
|
|
213
|
+
编程工具退出后将自动收集反馈,满足条件时自动触发蒸馏
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
**注意:** bridge-to-coder.sh 会启动一个交互式编程工具会话(如 claude),
|
|
217
|
+
此时当前 AI 会话暂时挂起,等待编程工具退出后继续。
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## 自驱模式与飞轮的配合
|
|
222
|
+
|
|
223
|
+
```
|
|
224
|
+
输入文档
|
|
225
|
+
│
|
|
226
|
+
▼
|
|
227
|
+
自驱分析(本 Skill)
|
|
228
|
+
│ 生成三份产物 + 假设清单
|
|
229
|
+
▼
|
|
230
|
+
bridge-to-coder.sh → 编程工具实现
|
|
231
|
+
│ 实现过程中确认/否定假设
|
|
232
|
+
▼
|
|
233
|
+
feedback-hook.sh → 写入假设验证结果
|
|
234
|
+
│ 哪些假设对了,哪些错了
|
|
235
|
+
▼
|
|
236
|
+
蒸馏 → 更新"自驱推断规则"
|
|
237
|
+
│ 下次同类文档推断更准确
|
|
238
|
+
▼
|
|
239
|
+
更好的自驱分析
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
**关键:每次假设被确认或否定,都是一次学习信号。**
|
|
243
|
+
积累足够多的假设验证后,自驱推断的准确率会持续提高。
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: req-miner-industry-erp
|
|
3
|
+
skill_id: req_miner_industry_erp
|
|
4
|
+
version: 2.0
|
|
5
|
+
description: >
|
|
6
|
+
需求挖掘行业包:ERP / 进销存 / 外贸 / 跨境电商。
|
|
7
|
+
当客户行业涉及以下关键词时自动加载:进销存、ERP、外贸、跨境、出口、订单管理、
|
|
8
|
+
采购管理、库存管理、外贸管理系统、阿里国际站、独立站。
|
|
9
|
+
宁可多触发,不漏触发。
|
|
10
|
+
is_required: false
|
|
11
|
+
hard_dep: [req_miner_core]
|
|
12
|
+
soft_dep: []
|
|
13
|
+
estimated_tokens: 1200
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# 行业问题包:ERP / 进销存 / 外贸
|
|
17
|
+
|
|
18
|
+
加载后,在**阶段二(场景还原)**和**阶段三(约束摸底)**期间,
|
|
19
|
+
从以下清单中选取适用问题补充挖掘。**必须覆盖该行业全业务流程,不允许有断点。**
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 通用进销存 / ERP 核心问题
|
|
24
|
+
|
|
25
|
+
**订单与销售:**
|
|
26
|
+
- "订单是否需要分批发货?"
|
|
27
|
+
- "是否有销售退货和采购退货流程?"
|
|
28
|
+
- "是否有客户等级价格体系?(不同客户不同价)"
|
|
29
|
+
- "是否支持订单复制或批量创建?"
|
|
30
|
+
- "订单状态机:新建 → 确认 → 生产中 → 已发货 → 已签收 → 已回款,每个状态的触发条件是什么?"
|
|
31
|
+
|
|
32
|
+
**库存:**
|
|
33
|
+
- "是否需要支持多仓库管理?"
|
|
34
|
+
- "批次管理是否需要有效期追踪?"
|
|
35
|
+
- "是否有安全库存设置?库存低于多少时预警?"
|
|
36
|
+
- "是否支持库存调拨(多仓之间)?调拨是否需要审批?"
|
|
37
|
+
- "成本核算用哪种方法?(加权平均 / 先进先出 / 后进先出 / 批次成本)"
|
|
38
|
+
- "损耗/报废如何处理?是否影响成本核算?"
|
|
39
|
+
|
|
40
|
+
**采购:**
|
|
41
|
+
- "是否有完整采购订单流程?(采购申请 → 采购订单 → 入库)"
|
|
42
|
+
- "是否存在寄售、代销模式?"
|
|
43
|
+
- "是否存在客制化商品(BOM 配置)?"
|
|
44
|
+
|
|
45
|
+
**财务:**
|
|
46
|
+
- "是否有应收应付账款管理?(谁欠我钱 / 我欠谁钱)"
|
|
47
|
+
- "是否需要毛利分析?需要哪些维度?(按客户 / 按商品 / 按业务员 / 按时间)"
|
|
48
|
+
- "账龄分析和逾期提醒是否必要?"
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 外贸 / 跨境电商核心问题
|
|
53
|
+
|
|
54
|
+
**必须覆盖从询盘到退税的完整链条:**
|
|
55
|
+
询盘 → 报价 → 订单 → 生产/采购 → 验货 → 报关 → 出货 → 提单 → 客户签收 → 结汇 → 退税
|
|
56
|
+
|
|
57
|
+
**询盘与报价:**
|
|
58
|
+
- "是否需要管理询盘(Inquiry)→ 报价(Quotation)→ 订单(Order)的转化?"
|
|
59
|
+
- "是否需要样品管理?(样品费、样品发货跟踪)"
|
|
60
|
+
- "客户来源渠道有哪些?(阿里国际站 / 独立站 / 展会 / 线下)"
|
|
61
|
+
|
|
62
|
+
**合同与条款:**
|
|
63
|
+
- "贸易术语用什么?(FOB / CIF / EXW / DDP)"
|
|
64
|
+
- "付款方式有哪些?(T/T 电汇 / 信用证 L/C / PayPal / 赊销)"
|
|
65
|
+
- "是否需要客户信用额度管理?(欠款上限、账期控制)"
|
|
66
|
+
|
|
67
|
+
**物流与报关:**
|
|
68
|
+
- "是否需要报关/清关信息管理?(HS 编码、报关单号)"
|
|
69
|
+
- "是否需要物流跟踪?(提单号 BL / 运单号 AWB / 船期航班跟踪)"
|
|
70
|
+
- "是否需要包装/唛头管理?(每箱数量、毛重净重、唛头图片)"
|
|
71
|
+
|
|
72
|
+
**结汇与退税:**
|
|
73
|
+
- "是否需要多币种结算?汇率由谁维护?多久更新一次?"
|
|
74
|
+
- "结汇手续由谁办理?汇率损失如何记录?"
|
|
75
|
+
- "是否需要出口退税管理?(退税比例、退税状态跟踪)"
|
|
76
|
+
|
|
77
|
+
**单据管理:**
|
|
78
|
+
- "是否需要发票管理?(形式发票 PI、商业发票 CI)"
|
|
79
|
+
- "是否需要装箱单(Packing List)自动生成?"
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 业务流程完整性——行业特定断点检查
|
|
84
|
+
|
|
85
|
+
加载本包后,阶段二结束时额外检查以下外贸特有断点:
|
|
86
|
+
|
|
87
|
+
| 环节 | 常见遗漏 |
|
|
88
|
+
|---|---|
|
|
89
|
+
| 样品流程 | 样品费是否收取、样品订单是否单独管理 |
|
|
90
|
+
| 信用证 | L/C 有效期管理、不符点处理 |
|
|
91
|
+
| 退税 | 退税状态跟踪、退税款入账 |
|
|
92
|
+
| 汇差 | 汇率损益如何记录到财务 |
|
|
93
|
+
| 售后 | 海外客户退货的物流和关税处理 |
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 行业特定验收标准模板(阶段四补充)
|
|
98
|
+
|
|
99
|
+
在阶段四补充以下外贸/进销存特有验收标准:
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
□ "系统支持的货币种类不少于 [N] 种,汇率可手动维护,精度为 4 位小数"
|
|
103
|
+
□ "HS 编码字段支持模糊搜索,搜索结果 < 1 秒返回"
|
|
104
|
+
□ "出库时系统按先进先出自动选择批次,不需要手动干预"
|
|
105
|
+
□ "库存低于安全库存时,系统在 [X] 小时内发出预警通知到 [指定渠道]"
|
|
106
|
+
□ "应收账款逾期超过 [N] 天时,系统自动标记并发送提醒"
|
|
107
|
+
□ "退税状态支持:未申报 / 已申报 / 已收款,状态变更记录操作人和时间"
|
|
108
|
+
```
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: req-miner-industry-retail
|
|
3
|
+
skill_id: req_miner_industry_retail
|
|
4
|
+
version: 0.1
|
|
5
|
+
status: planned
|
|
6
|
+
description: >
|
|
7
|
+
需求挖掘行业包:零售/门店。
|
|
8
|
+
当客户行业涉及以下关键词时加载:零售、门店、连锁、收银、会员积分、促销。
|
|
9
|
+
is_required: false
|
|
10
|
+
hard_dep: [req_miner_core]
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# 行业问题包:零售 / 门店
|
|
14
|
+
|
|
15
|
+
> 🚧 本行业包待建。欢迎贡献。
|
|
16
|
+
> 参考 skills/industry/erp.md 的格式提交 PR。
|
|
17
|
+
|
|
18
|
+
## 计划覆盖内容
|
|
19
|
+
|
|
20
|
+
- 会员管理 / 积分体系
|
|
21
|
+
- 门店调拨
|
|
22
|
+
- 促销规则引擎
|
|
23
|
+
- 收银方式(现金/扫码/刷卡)
|
|
24
|
+
- 多门店报表汇总
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# 需求失败模式库
|
|
2
|
+
|
|
3
|
+
**类型:** External Memory(陈述性知识)
|
|
4
|
+
**加载时机:** 每次需求挖掘会话常驻加载
|
|
5
|
+
**更新方式:** 蒸馏后自动追加,不手动编辑
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 使用说明
|
|
10
|
+
|
|
11
|
+
每次需求挖掘对话开始时,将此文件全量加载进 context window。
|
|
12
|
+
在对话过程中,当客户的表述命中任何"触发信号"时,主动采取对应的"建议行动"。
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 模式列表
|
|
17
|
+
|
|
18
|
+
### 模式:低估复杂度
|
|
19
|
+
|
|
20
|
+
**触发信号:** "只有我用"、"简单就行"、"先做个基础版"、"功能不多"
|
|
21
|
+
**规律描述:** 客户使用简化性表达时,70% 概率在后续出现范围蔓延。真实的使用角色和功能需求通常比初始描述多 2-3 倍。
|
|
22
|
+
**建议行动:** 立即触发"枚举所有使用角色"追问序列;要求客户描述一个最复杂的业务场景(而不是最简单的)。
|
|
23
|
+
**来源项目:** 冷启动手写
|
|
24
|
+
**置信度:** 0.85
|
|
25
|
+
**最后更新:** 2024-01-15
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
### 模式:委托人信息失真
|
|
30
|
+
|
|
31
|
+
**触发信号:** "我来了解一下"、"回去跟老板汇报"、"老板让我问问"、"这个我不确定,要问一下上面"
|
|
32
|
+
**规律描述:** 对话对象是委托人而非决策人时,获取的需求信息经过一次中间人过滤,关键约束(预算上限、时间节点、优先级排序)的准确性平均下降 40%。
|
|
33
|
+
**建议行动:** 识别后明确标记为"委托型"客户;建议在原型确认阶段引入真实决策人参与;所有关键决策类信息放入 Parking Lot 等待最终决策人确认。
|
|
34
|
+
**来源项目:** 冷启动手写
|
|
35
|
+
**置信度:** 0.80
|
|
36
|
+
**最后更新:** 2024-01-15
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
### 模式:技术方案先行
|
|
41
|
+
|
|
42
|
+
**触发信号:** "我们需要一个 RESTful API"、"要支持微服务"、"用 React 做前端"、"要上 Kubernetes"
|
|
43
|
+
**规律描述:** 专业型客户(IT 经理/技术负责人)容易把技术解决方案当需求提,导致业务目标被技术实现遮蔽。这类需求最常见的结果是"技术上实现了但业务问题没解决"。
|
|
44
|
+
**建议行动:** 接受技术语言,但立即转化:"这个 API 是为了解决什么业务问题?";将技术表述转化为用户故事格式:「作为[角色],我需要[功能],以便[业务目标]」
|
|
45
|
+
**来源项目:** 冷启动手写
|
|
46
|
+
**置信度:** 0.78
|
|
47
|
+
**最后更新:** 2024-01-15
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
### 模式:历史失败项目包袱
|
|
52
|
+
|
|
53
|
+
**触发信号:** "之前做过一个,但没用起来"、"上次找了外包,结果..."、"我们自己开发过,后来废弃了"
|
|
54
|
+
**规律描述:** 有历史失败经验的客户,失败原因通常会在新项目中重演(如组织推广阻力、需求频繁变更、验收标准不清晰)。不挖掘失败原因,新项目大概率踩同样的坑。
|
|
55
|
+
**建议行动:** 必须追问失败原因:"最后没有用起来,主要原因是什么?是功能不对,是推广阻力,还是其他?";将失败原因转化为当前项目的风险项写入报告。
|
|
56
|
+
**来源项目:** 冷启动手写
|
|
57
|
+
**置信度:** 0.88
|
|
58
|
+
**最后更新:** 2024-01-15
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
### 模式:验收标准空洞化
|
|
63
|
+
|
|
64
|
+
**触发信号:** "用起来方便就行"、"只要好用"、"功能完整就可以"、"做得专业一点"
|
|
65
|
+
**规律描述:** 这类表述在验收时必然引发争议,因为双方对"方便"、"好用"、"专业"的标准不一致。约 60% 的外包项目验收纠纷源于此类空洞验收标准。
|
|
66
|
+
**建议行动:** 立即要求具体化:"能描述一个具体的操作,操作完之后您怎么知道它做好了?";拒绝将此类表述写入验收标准,要求用 4 要素格式(主语+动作+结果+可验证)替换。
|
|
67
|
+
**来源项目:** 冷启动手写
|
|
68
|
+
**置信度:** 0.92
|
|
69
|
+
**最后更新:** 2024-01-15
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
### 模式:需求在对话末期爆发
|
|
74
|
+
|
|
75
|
+
**触发信号:** 阶段三或阶段四突然提出全新的功能需求;客户说"对了,我还想要..."
|
|
76
|
+
**规律描述:** 客户在信任建立后才会透露真实的、完整的需求,而不是在对话开始时。这不是客户的问题,而是信任建立有时间过程。通常在第 20-30 轮才出现关键需求。
|
|
77
|
+
**建议行动:** 不要对新需求表现出明显的负面反应;将新需求纳入 MoSCoW 重新评估;检查是否需要回溯到更早的阶段重新确认某些退出条件。
|
|
78
|
+
**来源项目:** 冷启动手写
|
|
79
|
+
**置信度:** 0.75
|
|
80
|
+
**最后更新:** 2024-01-15
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
*本文件由蒸馏流程自动维护,请勿手动编辑已有条目。新增条目请通过蒸馏流程添加。*
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
name: req-mining
|
|
2
|
+
version: 1.0.0
|
|
3
|
+
description: 需求挖掘与落地飞轮
|
|
4
|
+
author: renmengkai
|
|
5
|
+
license: MIT
|
|
6
|
+
|
|
7
|
+
# 飞轮配置
|
|
8
|
+
ring1_skill: skills/req-mining/domain.md
|
|
9
|
+
ring1_artifacts_doc: ai-execution-doc.md
|
|
10
|
+
ring2_bridge: scripts/bridge-to-coder.sh
|
|
11
|
+
ring2_default_tool: claude
|
|
12
|
+
ring3_feedback_questions: skills/req-mining/feedback-questions.sh
|
|
13
|
+
|
|
14
|
+
# 激活触发词
|
|
15
|
+
triggers:
|
|
16
|
+
- "分析这份文档"
|
|
17
|
+
- "提取需求"
|
|
18
|
+
- "需求挖掘"
|
|
19
|
+
- "start req mining"
|
|
20
|
+
- "analyze document"
|
|
21
|
+
|
|
22
|
+
# 初始记忆文件
|
|
23
|
+
memory:
|
|
24
|
+
- skills/req-mining/memory/failure-patterns.md
|
|
25
|
+
|
|
26
|
+
# 可选行业包
|
|
27
|
+
industry_packs:
|
|
28
|
+
erp:
|
|
29
|
+
file: skills/req-mining/industry/erp.md
|
|
30
|
+
triggers: [进销存, ERP, 外贸, 跨境, 出口, 订单管理, 采购管理]
|
|
31
|
+
retail:
|
|
32
|
+
file: skills/req-mining/industry/retail.md
|
|
33
|
+
triggers: [零售, 电商, 门店, 收银, 会员, 积分, 促销, 商超]
|
|
34
|
+
|
|
35
|
+
# 产物规格
|
|
36
|
+
artifacts:
|
|
37
|
+
spec: skills/req-mining/artifacts.md
|
|
38
|
+
outputs:
|
|
39
|
+
- name: 需求澄清报告
|
|
40
|
+
file: clarification-report.md
|
|
41
|
+
- name: AI 执行文档
|
|
42
|
+
file: ai-execution-doc.md
|
|
43
|
+
- name: 可视化原型规格
|
|
44
|
+
file: prototype-spec.md
|