@vima_tech/flywheel 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/flywheel.md +42 -0
- package/.claude/commands/skill.md +36 -0
- package/.claude/settings.local.json +13 -0
- package/.distill-needed/.gitkeep +0 -0
- package/CLAUDE.md +178 -0
- package/README.md +163 -0
- package/agents.md +59 -0
- package/bin/flywheel.js +95 -0
- package/docs/Flywheel_Poster.html +1059 -0
- package/docs/Flywheel_Poster.png +0 -0
- package/episodic-logs/.gitkeep +0 -0
- package/install.sh +194 -0
- package/memory/industry/.gitkeep +0 -0
- package/package.json +28 -0
- package/projects/.gitkeep +0 -0
- package/scripts/auto-distill.sh +154 -0
- package/scripts/bridge-to-coder.sh +139 -0
- package/scripts/feedback-hook.sh +157 -0
- package/scripts/flywheel-install.sh +103 -0
- package/skills/_kernel/distillation.md +254 -0
- package/skills/_template/domain.md +93 -0
- package/skills/_template/feedback-questions.sh +9 -0
- package/skills/_template/skill.yaml +21 -0
- 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 +41 -0
- package/templates/state.json +90 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# scripts/flywheel-install.sh
|
|
3
|
+
# 在已安装 flywheel 的项目中管理 skill 包
|
|
4
|
+
#
|
|
5
|
+
# 用法:
|
|
6
|
+
# ./scripts/flywheel-install.sh list # 列出已安装 skill
|
|
7
|
+
# ./scripts/flywheel-install.sh add <skill> # 安装新 skill
|
|
8
|
+
# ./scripts/flywheel-install.sh update # 更新所有 skill 到最新版
|
|
9
|
+
# ./scripts/flywheel-install.sh update <skill> # 更新指定 skill
|
|
10
|
+
|
|
11
|
+
set -e
|
|
12
|
+
|
|
13
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
14
|
+
REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
15
|
+
REPO="renmengkai/flywheel"
|
|
16
|
+
BRANCH="main"
|
|
17
|
+
BASE_URL="https://raw.githubusercontent.com/$REPO/$BRANCH"
|
|
18
|
+
CMD="${1:-list}"
|
|
19
|
+
TARGET="${2:-}"
|
|
20
|
+
|
|
21
|
+
# ── list ───────────────────────────────────────────────────────
|
|
22
|
+
cmd_list() {
|
|
23
|
+
echo "━━━ 已安装 Skill 包 ━━━"
|
|
24
|
+
local found=false
|
|
25
|
+
for yaml in "$REPO_DIR/skills"/*/skill.yaml; do
|
|
26
|
+
[ -f "$yaml" ] || continue
|
|
27
|
+
local skill_dir
|
|
28
|
+
skill_dir=$(dirname "$yaml")
|
|
29
|
+
local name
|
|
30
|
+
name=$(basename "$skill_dir")
|
|
31
|
+
local version
|
|
32
|
+
version=$(grep '^version:' "$yaml" 2>/dev/null | awk '{print $2}' || echo "?")
|
|
33
|
+
local desc
|
|
34
|
+
desc=$(grep '^description:' "$yaml" 2>/dev/null | cut -d: -f2- | xargs || echo "")
|
|
35
|
+
echo " • $name v$version — $desc"
|
|
36
|
+
found=true
|
|
37
|
+
done
|
|
38
|
+
$found || echo " (未安装任何 skill)"
|
|
39
|
+
echo ""
|
|
40
|
+
echo "安装新 skill:./scripts/flywheel-install.sh add <skill-name>"
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
# ── add ────────────────────────────────────────────────────────
|
|
44
|
+
cmd_add() {
|
|
45
|
+
local skill="$1"
|
|
46
|
+
[ -z "$skill" ] && { echo "❌ 用法:$0 add <skill-name>"; exit 1; }
|
|
47
|
+
|
|
48
|
+
echo "安装 skill:$skill"
|
|
49
|
+
|
|
50
|
+
# 检查 skill 是否存在
|
|
51
|
+
if ! curl -fsSL "$BASE_URL/skills/$skill/skill.yaml" -o /dev/null 2>/dev/null; then
|
|
52
|
+
echo "❌ skill '$skill' 不存在"
|
|
53
|
+
echo " 运行 list 查看可用 skill"
|
|
54
|
+
exit 1
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
# 使用主安装器的 install_skill 逻辑
|
|
58
|
+
curl -fsSL "$BASE_URL/install.sh" | bash -s -- "$skill"
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
# ── update ─────────────────────────────────────────────────────
|
|
62
|
+
cmd_update() {
|
|
63
|
+
local skills=()
|
|
64
|
+
|
|
65
|
+
if [ -n "$TARGET" ]; then
|
|
66
|
+
skills=("$TARGET")
|
|
67
|
+
else
|
|
68
|
+
for yaml in "$REPO_DIR/skills"/*/skill.yaml; do
|
|
69
|
+
[ -f "$yaml" ] || continue
|
|
70
|
+
skills+=("$(basename "$(dirname "$yaml")")")
|
|
71
|
+
done
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
[ ${#skills[@]} -eq 0 ] && { echo "没有已安装的 skill"; exit 0; }
|
|
75
|
+
|
|
76
|
+
echo "━━━ 更新 Skill 包 ━━━"
|
|
77
|
+
for skill in "${skills[@]}"; do
|
|
78
|
+
echo ""
|
|
79
|
+
echo "更新 $skill..."
|
|
80
|
+
local yaml_url="$BASE_URL/skills/$skill/skill.yaml"
|
|
81
|
+
local remote_ver
|
|
82
|
+
remote_ver=$(curl -fsSL "$yaml_url" 2>/dev/null | grep '^version:' | awk '{print $2}' || echo "?")
|
|
83
|
+
local local_ver
|
|
84
|
+
local_ver=$(grep '^version:' "$REPO_DIR/skills/$skill/skill.yaml" 2>/dev/null | awk '{print $2}' || echo "0")
|
|
85
|
+
|
|
86
|
+
if [ "$remote_ver" = "$local_ver" ]; then
|
|
87
|
+
echo " ✓ $skill 已是最新版 v$local_ver"
|
|
88
|
+
else
|
|
89
|
+
echo " $local_ver → $remote_ver,更新中..."
|
|
90
|
+
cmd_add "$skill"
|
|
91
|
+
fi
|
|
92
|
+
done
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
case "$CMD" in
|
|
96
|
+
list) cmd_list ;;
|
|
97
|
+
add) cmd_add "$TARGET" ;;
|
|
98
|
+
update) cmd_update ;;
|
|
99
|
+
*)
|
|
100
|
+
echo "用法:$0 list | add <skill> | update [skill]"
|
|
101
|
+
exit 1
|
|
102
|
+
;;
|
|
103
|
+
esac
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: distillation
|
|
3
|
+
skill_id: distillation_core
|
|
4
|
+
version: 1.0
|
|
5
|
+
description: >
|
|
6
|
+
蒸馏元 Skill。从需求挖掘会话的事件日志中提炼经验模式,
|
|
7
|
+
直接更新 skills/ 和 memory/ 文件,实现系统自成长。
|
|
8
|
+
当用户说"蒸馏"、"更新skill"、"从日志学习"、"处理日志"时触发。
|
|
9
|
+
is_required: false
|
|
10
|
+
hard_dep: []
|
|
11
|
+
soft_dep: []
|
|
12
|
+
estimated_tokens: 1500
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# 蒸馏协议
|
|
16
|
+
|
|
17
|
+
**你的任务:** 读取事件日志,提炼可复用的模式,更新 Skills 和 Memory 文件。
|
|
18
|
+
**核心原则:** 质量优先于数量。宁可少蒸馏一些,不引入低质量噪音。
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Step 0:确认蒸馏范围
|
|
23
|
+
|
|
24
|
+
询问用户(或读取默认配置):
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
"请确认蒸馏范围:
|
|
28
|
+
A. 指定项目(输入 project_id)
|
|
29
|
+
B. 所有未蒸馏日志(自动扫描 episodic-logs/ 目录)
|
|
30
|
+
C. 单条事件(粘贴事件 JSON)"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
读取对应的 `episodic-logs/{project_id}.jsonl` 文件。
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Step 1:质量过滤
|
|
38
|
+
|
|
39
|
+
扫描所有事件,按以下规则评分(0-1),**低于 0.6 的事件跳过,不蒸馏**:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
人类干预事件(type: human_intervention):
|
|
43
|
+
+ 0.4 有明确的 correct_angle 字段
|
|
44
|
+
+ 0.3 同类 intervention_category 在本日志中出现 ≥ 2 次
|
|
45
|
+
+ 0.2 notes 字段有具体说明
|
|
46
|
+
最高:0.9
|
|
47
|
+
|
|
48
|
+
原型否定事件(type: prototype_rejection):
|
|
49
|
+
+ 0.4 有 root_cause_analysis.root_question
|
|
50
|
+
+ 0.3 severity = high
|
|
51
|
+
+ 0.2 missed_at_turn 字段有值
|
|
52
|
+
最高:0.9
|
|
53
|
+
|
|
54
|
+
矛盾事件(type: contradiction_detected):
|
|
55
|
+
+ 0.3 resolved = true,且有 resolution 说明
|
|
56
|
+
+ 0.2 severity = high
|
|
57
|
+
+ 0.2 turn_gap > 10(说明矛盾隐蔽,不易发现)
|
|
58
|
+
最高:0.7
|
|
59
|
+
|
|
60
|
+
未覆盖决策事件(type: uncovered_decision):
|
|
61
|
+
+ 0.4 有人工决议(resolution != "pending")
|
|
62
|
+
+ 0.3 distillation_candidate = true
|
|
63
|
+
最高:0.7
|
|
64
|
+
|
|
65
|
+
实现反馈事件(type: implementation_feedback):
|
|
66
|
+
+ 0.4 unclear_specs 非空(说明需求文档有明确不清晰点)
|
|
67
|
+
+ 0.3 uncovered_decisions 非空(执行 AI 遇到文档漏洞)
|
|
68
|
+
+ 0.2 wrong_assumptions 非空(需求假设被现实否定)
|
|
69
|
+
+ 0.2 quality_score >= 0.6(feedback-hook 自动计算)
|
|
70
|
+
最高:0.9
|
|
71
|
+
路由规则:
|
|
72
|
+
unclear_specs → 更新 skills/artifacts/req-miner-artifacts.md 的"功能规格"章节
|
|
73
|
+
uncovered_decisions → 追加到 skills/artifacts/req-miner-artifacts.md 的"未覆盖情况处理规则"
|
|
74
|
+
wrong_assumptions → 追加到 memory/patterns/failure-patterns.md
|
|
75
|
+
|
|
76
|
+
自驱分析完成事件(type: auto_req_completed):
|
|
77
|
+
+ 0.4 有假设被后续实现反馈验证(assumption_validated = true)
|
|
78
|
+
+ 0.3 assumptions_count >= 3(说明文档不完整,推断规则有价值)
|
|
79
|
+
最高:0.7
|
|
80
|
+
路由规则:
|
|
81
|
+
验证正确的假设 → 追加到 skills/core/auto-req.md 的"推断规则库"(如不存在则新建章节)
|
|
82
|
+
验证错误的假设 → 追加到 memory/patterns/failure-patterns.md
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**输出过滤结果:**
|
|
86
|
+
```
|
|
87
|
+
共扫描 N 条事件
|
|
88
|
+
通过质量阈值(≥0.6):X 条
|
|
89
|
+
跳过(低质量):Y 条
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Step 2:模式提炼
|
|
95
|
+
|
|
96
|
+
对通过质量过滤的事件,逐条提炼模式。
|
|
97
|
+
|
|
98
|
+
**提炼的核心问题:**
|
|
99
|
+
|
|
100
|
+
> 这个事件揭示了什么普遍规律?
|
|
101
|
+
> 如果下次遇到类似情况,Agent 应该怎么做?
|
|
102
|
+
|
|
103
|
+
**提炼格式:**
|
|
104
|
+
|
|
105
|
+
```json
|
|
106
|
+
{
|
|
107
|
+
"source_event_id": "evt_001",
|
|
108
|
+
"source_project": "proj_2024_001",
|
|
109
|
+
"pattern_type": "skill_update | memory_entry | decision_tree",
|
|
110
|
+
"pattern_summary": "用一句话描述这个模式",
|
|
111
|
+
"trigger_signals": ["触发这个模式的信号词或场景"],
|
|
112
|
+
"recommended_action": "遇到此情况时,Agent 应该...",
|
|
113
|
+
"target_file": "skills/core/req-miner.md",
|
|
114
|
+
"target_section": "阶段三:约束摸底 / 预算追问逻辑",
|
|
115
|
+
"change_type": "append | replace | new_section",
|
|
116
|
+
"proposed_content": "具体的修改内容或新增内容",
|
|
117
|
+
"confidence": 0.82
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Step 3:路由判断
|
|
124
|
+
|
|
125
|
+
每条提炼出的模式,按以下规则路由:
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
"如何做某件事"的步骤、序列、框架
|
|
129
|
+
→ pattern_type: skill_update
|
|
130
|
+
→ 更新 skills/ 下对应文件的对应章节
|
|
131
|
+
|
|
132
|
+
"某类客户/行业的特征规律、高频表现"
|
|
133
|
+
→ pattern_type: memory_entry
|
|
134
|
+
→ 写入 memory/patterns/ 或 memory/industry/ 对应文件
|
|
135
|
+
|
|
136
|
+
"AI 执行时遇到的未覆盖场景 + 有人工决议"
|
|
137
|
+
→ pattern_type: decision_tree
|
|
138
|
+
→ 更新 skills/artifacts/req-miner-artifacts.md 的"未覆盖情况处理规则"章节
|
|
139
|
+
|
|
140
|
+
"单一案例,不可泛化(置信度 < 0.6)"
|
|
141
|
+
→ 跳过,标注 low-signal,不写入任何文件
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Step 4:人工确认(一次性预览 + 单次确认)
|
|
147
|
+
|
|
148
|
+
**一次性展示全部变更,等待用户单次确认:**
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
━━━ 蒸馏结果预览(共 N 项变更)━━━
|
|
152
|
+
|
|
153
|
+
变更 1/N:[skill_update]
|
|
154
|
+
文件:skills/core/req-miner.md → 章节名(append)
|
|
155
|
+
内容摘要:[拟新增内容的一句话描述]
|
|
156
|
+
置信度:0.82 | 来源:proj_xxx / evt_023
|
|
157
|
+
|
|
158
|
+
变更 2/N:[memory_entry]
|
|
159
|
+
文件:memory/patterns/failure-patterns.md(append)
|
|
160
|
+
内容摘要:[拟新增内容的一句话描述]
|
|
161
|
+
置信度:0.75 | 来源:proj_xxx / evt_045
|
|
162
|
+
|
|
163
|
+
━━━ 确认应用全部 N 项变更?
|
|
164
|
+
y → 全部应用
|
|
165
|
+
n → 全部取消
|
|
166
|
+
1,3 → 仅应用编号 1 和 3,跳过其余
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**规则:**
|
|
170
|
+
- 等待用户输入 y / n / 编号列表后再执行写入
|
|
171
|
+
- 不允许跳过此步骤自动写入
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Step 5:执行写入
|
|
176
|
+
|
|
177
|
+
按用户确认的变更列表,逐一修改对应文件:
|
|
178
|
+
|
|
179
|
+
**Skills 文件修改规则:**
|
|
180
|
+
- `append`:在目标章节末尾追加内容
|
|
181
|
+
- `replace`:替换目标章节中的特定段落(必须精确匹配)
|
|
182
|
+
- `new_section`:在目标章节同级别新增章节
|
|
183
|
+
- 修改后更新文件顶部的 `version` 字段(minor version +1)
|
|
184
|
+
|
|
185
|
+
**Memory 文件修改规则:**
|
|
186
|
+
- 新增条目时,包含以下字段:
|
|
187
|
+
|
|
188
|
+
```markdown
|
|
189
|
+
### 模式:[模式名称]
|
|
190
|
+
**触发信号:** [信号词列表]
|
|
191
|
+
**规律描述:** [描述]
|
|
192
|
+
**建议行动:** [遇到此情况时应该...]
|
|
193
|
+
**来源项目:** [project_id]
|
|
194
|
+
**置信度:** [0.0-1.0]
|
|
195
|
+
**最后更新:** [YYYY-MM-DD]
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**写入完成后,清除蒸馏标记文件:**
|
|
199
|
+
```bash
|
|
200
|
+
rm -f .distill-needed/{project_id}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## Step 6:Git 提交
|
|
206
|
+
|
|
207
|
+
所有文件修改完成后,提示用户执行 Git 提交:
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
git add skills/ memory/
|
|
211
|
+
git commit -m "distill({project_id}): {一句话描述主要变更}
|
|
212
|
+
|
|
213
|
+
- {变更1简述}
|
|
214
|
+
- {变更2简述}
|
|
215
|
+
|
|
216
|
+
Sources: {event_id列表}"
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
**或由用户自行提交,蒸馏 Agent 不自动执行 git 命令。**
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## 蒸馏结束报告
|
|
224
|
+
|
|
225
|
+
```
|
|
226
|
+
━━━ 蒸馏完成 ━━━
|
|
227
|
+
来源项目:{project_id}
|
|
228
|
+
处理事件:{N} 条
|
|
229
|
+
通过质量过滤:{X} 条
|
|
230
|
+
实际写入变更:{Y} 条(跳过 {X-Y} 条:用户取消或低质量)
|
|
231
|
+
|
|
232
|
+
Skills 更新:
|
|
233
|
+
- skills/core/req-miner.md(v1.0 → v1.1)
|
|
234
|
+
- [其他更新文件]
|
|
235
|
+
|
|
236
|
+
Memory 更新:
|
|
237
|
+
- memory/patterns/failure-patterns.md(+{N} 条)
|
|
238
|
+
|
|
239
|
+
下次蒸馏建议时机:完成 {下个project_id} 项目后
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## 蒸馏质量的自我评估
|
|
245
|
+
|
|
246
|
+
蒸馏完成后,检查以下问题,有助于判断蒸馏质量:
|
|
247
|
+
|
|
248
|
+
```
|
|
249
|
+
□ 提炼的模式是否足够普遍,能在至少 2 个不同项目中适用?
|
|
250
|
+
□ 写入 Skills 的内容是否是"如何做",而不是"什么事实"?
|
|
251
|
+
□ 写入 Memory 的内容是否是"特征规律",而不是"操作步骤"?
|
|
252
|
+
□ 修改后的 Skills 文件是否仍然清晰易读,没有变得冗长混乱?
|
|
253
|
+
□ 是否有内容其实应该在行业包里,而不是核心框架里?
|
|
254
|
+
```
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: your-skill-name
|
|
3
|
+
skill_id: your_skill_id
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
description: >
|
|
6
|
+
一句话描述这个 skill 做什么。
|
|
7
|
+
它是飞轮 Ring 1 的核心——定义"如何分析输入材料并生成产物"。
|
|
8
|
+
is_required: true
|
|
9
|
+
hard_dep: []
|
|
10
|
+
soft_dep: []
|
|
11
|
+
trigger_phrases:
|
|
12
|
+
- "触发词1"
|
|
13
|
+
- "触发词2"
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# [Skill 名称] 分析协议
|
|
17
|
+
|
|
18
|
+
**使用场景:** 描述在什么情况下使用此 skill。
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Step 0:接收输入材料
|
|
23
|
+
|
|
24
|
+
用户提供以下任意格式:
|
|
25
|
+
- 直接粘贴文本
|
|
26
|
+
- 文件路径
|
|
27
|
+
- URL
|
|
28
|
+
|
|
29
|
+
**确认输入后,询问(一次性):**
|
|
30
|
+
```
|
|
31
|
+
已收到材料(约 XXX 字)。
|
|
32
|
+
请确认以下信息(可省略,我会推断):
|
|
33
|
+
1. 项目名称:
|
|
34
|
+
2. 分析侧重点:
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Step 1:材料扫描
|
|
40
|
+
|
|
41
|
+
**静默执行,不逐条输出。扫描以下维度:**
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
维度 1:[你的维度1]
|
|
45
|
+
维度 2:[你的维度2]
|
|
46
|
+
维度 3:[你的维度3]
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Step 2:分析输出
|
|
52
|
+
|
|
53
|
+
**输出格式:**
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
━━━ 分析结果 | 项目:{name} ━━━
|
|
57
|
+
|
|
58
|
+
## 一、[核心输出1]
|
|
59
|
+
[内容]
|
|
60
|
+
⚠️ 假设 A1:[不确定点]
|
|
61
|
+
|
|
62
|
+
## 二、[核心输出2]
|
|
63
|
+
[内容]
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Step 3:生成产物
|
|
69
|
+
|
|
70
|
+
加载 `skills/your-skill-name/artifacts.md`,按规格生成产物。
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Step 4:写入状态
|
|
75
|
+
|
|
76
|
+
```python
|
|
77
|
+
state["skill"] = "your-skill-name"
|
|
78
|
+
state["artifacts_generated"] = True
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
追加事件日志:
|
|
82
|
+
```json
|
|
83
|
+
{"type": "analysis_completed", "distillation_candidate": true}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Step 5:自动启动 Ring 2
|
|
89
|
+
|
|
90
|
+
产物完成后,通过 Bash 工具调用:
|
|
91
|
+
```bash
|
|
92
|
+
./scripts/bridge-to-coder.sh {project_id} {tool}
|
|
93
|
+
```
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
name: your-skill-name
|
|
2
|
+
version: 0.1.0
|
|
3
|
+
description: 一句话描述这个 skill 的用途
|
|
4
|
+
author: your-name
|
|
5
|
+
license: MIT
|
|
6
|
+
|
|
7
|
+
# 飞轮配置
|
|
8
|
+
ring1_skill: skills/your-skill-name/domain.md
|
|
9
|
+
ring1_artifacts_doc: execution-doc.md # Ring 1 输出给 Ring 2 的文档名
|
|
10
|
+
ring2_bridge: scripts/bridge-to-coder.sh # 使用内核默认 bridge,也可替换为自定义脚本
|
|
11
|
+
ring2_default_tool: claude
|
|
12
|
+
ring3_feedback_questions: skills/your-skill-name/feedback-questions.sh
|
|
13
|
+
|
|
14
|
+
# 激活触发词(用户说这些话时自动加载本 skill)
|
|
15
|
+
triggers:
|
|
16
|
+
- "触发词1"
|
|
17
|
+
- "触发词2"
|
|
18
|
+
|
|
19
|
+
# 初始记忆文件(蒸馏结果会写回这里)
|
|
20
|
+
memory:
|
|
21
|
+
- skills/your-skill-name/memory/patterns.md
|
|
@@ -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
|
+
```
|