@vima_tech/flywheel 1.0.0 → 1.1.1
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 +235 -34
- package/package.json +8 -1
- package/scripts/available.json +10 -0
- package/scripts/flywheel-install.sh +21 -1
- package/.claude/commands/flywheel.md +0 -42
- package/.claude/commands/skill.md +0 -36
- package/.claude/settings.local.json +0 -13
- package/.distill-needed/.gitkeep +0 -0
- package/CLAUDE.md +0 -178
- package/agents.md +0 -59
- package/docs/Flywheel_Poster.html +0 -1059
- package/docs/Flywheel_Poster.png +0 -0
- package/episodic-logs/.gitkeep +0 -0
- package/install.sh +0 -194
- package/memory/industry/.gitkeep +0 -0
- package/projects/.gitkeep +0 -0
- package/skills/req-mining/artifacts.md +0 -185
- package/skills/req-mining/domain.md +0 -243
- package/skills/req-mining/feedback-questions.sh +0 -9
- package/skills/req-mining/industry/erp.md +0 -108
- package/skills/req-mining/industry/retail.md +0 -24
- package/skills/req-mining/memory/failure-patterns.md +0 -84
- package/skills/req-mining/skill.yaml +0 -41
|
@@ -1,1059 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="zh-CN">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8" />
|
|
5
|
-
<title>Flywheel · 自成长 AI Agent 飞轮 — 宣讲海报</title>
|
|
6
|
-
<meta name="viewport" content="width=1680" />
|
|
7
|
-
<style>
|
|
8
|
-
:root {
|
|
9
|
-
--bg: #0b0d12;
|
|
10
|
-
--bg-2: #11141c;
|
|
11
|
-
--ink: #ecead6;
|
|
12
|
-
--ink-dim: #8c8b7d;
|
|
13
|
-
--ink-mute: #5a594e;
|
|
14
|
-
--line: #23262f;
|
|
15
|
-
--line-2: #2e323e;
|
|
16
|
-
--amber: #f3a23b;
|
|
17
|
-
--amber-soft: rgba(243,162,59,0.13);
|
|
18
|
-
--cyan: #6fd2e4;
|
|
19
|
-
--cyan-soft: rgba(111,210,228,0.13);
|
|
20
|
-
--rose: #e87a6e;
|
|
21
|
-
--rose-soft: rgba(232,122,110,0.13);
|
|
22
|
-
--mono: "JetBrains Mono", "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
23
|
-
--sans: "Inter", "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
|
|
24
|
-
--serif: "Source Serif Pro", "Times New Roman", "Songti SC", "STSong", serif;
|
|
25
|
-
}
|
|
26
|
-
* { box-sizing: border-box; }
|
|
27
|
-
html, body { margin: 0; padding: 0; }
|
|
28
|
-
body {
|
|
29
|
-
background: var(--bg);
|
|
30
|
-
color: var(--ink);
|
|
31
|
-
font-family: var(--sans);
|
|
32
|
-
-webkit-font-smoothing: antialiased;
|
|
33
|
-
min-height: 100vh;
|
|
34
|
-
}
|
|
35
|
-
.poster {
|
|
36
|
-
width: 1680px;
|
|
37
|
-
margin: 0 auto;
|
|
38
|
-
padding: 64px 72px 80px;
|
|
39
|
-
position: relative;
|
|
40
|
-
background:
|
|
41
|
-
radial-gradient(1200px 700px at 50% 38%, #15171f 0%, transparent 70%),
|
|
42
|
-
linear-gradient(180deg, #0b0d12 0%, #0a0c10 100%);
|
|
43
|
-
overflow: hidden;
|
|
44
|
-
}
|
|
45
|
-
.grid-bg {
|
|
46
|
-
position: absolute; inset: 0;
|
|
47
|
-
background-image:
|
|
48
|
-
linear-gradient(var(--line) 1px, transparent 1px),
|
|
49
|
-
linear-gradient(90deg, var(--line) 1px, transparent 1px);
|
|
50
|
-
background-size: 48px 48px;
|
|
51
|
-
opacity: 0.22;
|
|
52
|
-
-webkit-mask-image: radial-gradient(ellipse 90% 70% at 50% 50%, black 40%, transparent 100%);
|
|
53
|
-
mask-image: radial-gradient(ellipse 90% 70% at 50% 50%, black 40%, transparent 100%);
|
|
54
|
-
pointer-events: none;
|
|
55
|
-
}
|
|
56
|
-
.corner {
|
|
57
|
-
position: absolute;
|
|
58
|
-
font-family: var(--mono);
|
|
59
|
-
font-size: 11px;
|
|
60
|
-
color: var(--ink-mute);
|
|
61
|
-
letter-spacing: 0.08em;
|
|
62
|
-
}
|
|
63
|
-
.corner.tl { top: 24px; left: 28px; }
|
|
64
|
-
.corner.tr { top: 24px; right: 28px; }
|
|
65
|
-
.corner.bl { bottom: 22px; left: 28px; }
|
|
66
|
-
.corner.br { bottom: 22px; right: 28px; }
|
|
67
|
-
|
|
68
|
-
/* HEADER */
|
|
69
|
-
.header {
|
|
70
|
-
position: relative;
|
|
71
|
-
display: grid;
|
|
72
|
-
grid-template-columns: 1fr auto;
|
|
73
|
-
align-items: end;
|
|
74
|
-
gap: 32px;
|
|
75
|
-
padding-bottom: 28px;
|
|
76
|
-
border-bottom: 1px solid var(--line);
|
|
77
|
-
margin-bottom: 28px;
|
|
78
|
-
}
|
|
79
|
-
.eyebrow {
|
|
80
|
-
font-family: var(--mono);
|
|
81
|
-
font-size: 12px;
|
|
82
|
-
letter-spacing: 0.32em;
|
|
83
|
-
color: var(--amber);
|
|
84
|
-
text-transform: uppercase;
|
|
85
|
-
margin-bottom: 14px;
|
|
86
|
-
}
|
|
87
|
-
.eyebrow .dot { display: inline-block; width: 7px; height: 7px; background: var(--amber); border-radius: 50%; margin-right: 10px; transform: translateY(-2px); box-shadow: 0 0 14px var(--amber); }
|
|
88
|
-
h1 {
|
|
89
|
-
font-family: var(--serif);
|
|
90
|
-
font-weight: 400;
|
|
91
|
-
font-size: 76px;
|
|
92
|
-
line-height: 0.98;
|
|
93
|
-
letter-spacing: -0.02em;
|
|
94
|
-
margin: 0 0 14px;
|
|
95
|
-
}
|
|
96
|
-
h1 em {
|
|
97
|
-
font-style: italic;
|
|
98
|
-
color: var(--amber);
|
|
99
|
-
}
|
|
100
|
-
.subtitle {
|
|
101
|
-
font-size: 20px;
|
|
102
|
-
line-height: 1.5;
|
|
103
|
-
color: var(--ink-dim);
|
|
104
|
-
max-width: 780px;
|
|
105
|
-
text-wrap: pretty;
|
|
106
|
-
}
|
|
107
|
-
.subtitle b { color: var(--ink); font-weight: 500; }
|
|
108
|
-
.header-meta {
|
|
109
|
-
text-align: right;
|
|
110
|
-
font-family: var(--mono);
|
|
111
|
-
font-size: 12px;
|
|
112
|
-
color: var(--ink-mute);
|
|
113
|
-
line-height: 1.7;
|
|
114
|
-
}
|
|
115
|
-
.header-meta .v { color: var(--ink); }
|
|
116
|
-
|
|
117
|
-
/* THESIS STRIP */
|
|
118
|
-
.thesis {
|
|
119
|
-
display: grid;
|
|
120
|
-
grid-template-columns: repeat(4, 1fr);
|
|
121
|
-
border: 1px solid var(--line);
|
|
122
|
-
border-radius: 4px;
|
|
123
|
-
background: rgba(255,255,255,0.012);
|
|
124
|
-
margin-bottom: 44px;
|
|
125
|
-
}
|
|
126
|
-
.thesis > div {
|
|
127
|
-
padding: 20px 22px;
|
|
128
|
-
border-right: 1px solid var(--line);
|
|
129
|
-
}
|
|
130
|
-
.thesis > div:last-child { border-right: 0; }
|
|
131
|
-
.thesis .k {
|
|
132
|
-
font-family: var(--mono);
|
|
133
|
-
font-size: 11px;
|
|
134
|
-
color: var(--ink-mute);
|
|
135
|
-
letter-spacing: 0.18em;
|
|
136
|
-
text-transform: uppercase;
|
|
137
|
-
margin-bottom: 8px;
|
|
138
|
-
}
|
|
139
|
-
.thesis .v { font-size: 15px; line-height: 1.5; color: var(--ink); }
|
|
140
|
-
.thesis .v em { color: var(--amber); font-style: normal; }
|
|
141
|
-
|
|
142
|
-
/* WHEEL */
|
|
143
|
-
.stage { position: relative; margin-bottom: 64px; }
|
|
144
|
-
.wheel-wrap { position: relative; width: 100%; aspect-ratio: 1536 / 940; }
|
|
145
|
-
svg.wheel { width: 100%; height: 100%; display: block; overflow: visible; }
|
|
146
|
-
.nodes { position: absolute; inset: 0; pointer-events: none; }
|
|
147
|
-
.node {
|
|
148
|
-
position: absolute;
|
|
149
|
-
transform: translate(-50%, -50%);
|
|
150
|
-
width: 300px;
|
|
151
|
-
}
|
|
152
|
-
.node .tag {
|
|
153
|
-
font-family: var(--mono);
|
|
154
|
-
font-size: 11px;
|
|
155
|
-
letter-spacing: 0.22em;
|
|
156
|
-
text-transform: uppercase;
|
|
157
|
-
margin-bottom: 6px;
|
|
158
|
-
}
|
|
159
|
-
.node.ring1 .tag { color: var(--cyan); }
|
|
160
|
-
.node.ring2 .tag { color: var(--amber); }
|
|
161
|
-
.node.ring3 .tag { color: var(--rose); }
|
|
162
|
-
.node .name {
|
|
163
|
-
font-family: var(--serif);
|
|
164
|
-
font-size: 28px;
|
|
165
|
-
line-height: 1.1;
|
|
166
|
-
margin-bottom: 8px;
|
|
167
|
-
color: var(--ink);
|
|
168
|
-
letter-spacing: -0.01em;
|
|
169
|
-
}
|
|
170
|
-
.node .desc {
|
|
171
|
-
font-size: 13px;
|
|
172
|
-
line-height: 1.5;
|
|
173
|
-
color: var(--ink-dim);
|
|
174
|
-
margin-bottom: 10px;
|
|
175
|
-
text-wrap: pretty;
|
|
176
|
-
}
|
|
177
|
-
.node .files {
|
|
178
|
-
font-family: var(--mono);
|
|
179
|
-
font-size: 11.5px;
|
|
180
|
-
line-height: 1.75;
|
|
181
|
-
}
|
|
182
|
-
.node .files .f { display: block; color: var(--ink); }
|
|
183
|
-
.node .files .f::before { content: "▸ "; color: var(--ink-mute); }
|
|
184
|
-
.node .files .c { color: var(--ink-mute); }
|
|
185
|
-
|
|
186
|
-
.engine {
|
|
187
|
-
position: absolute;
|
|
188
|
-
left: 50%; top: 50%;
|
|
189
|
-
transform: translate(-50%, -50%);
|
|
190
|
-
width: 320px;
|
|
191
|
-
text-align: center;
|
|
192
|
-
}
|
|
193
|
-
.engine .badge {
|
|
194
|
-
font-family: var(--mono);
|
|
195
|
-
font-size: 10.5px;
|
|
196
|
-
letter-spacing: 0.32em;
|
|
197
|
-
color: var(--amber);
|
|
198
|
-
text-transform: uppercase;
|
|
199
|
-
margin-bottom: 10px;
|
|
200
|
-
}
|
|
201
|
-
.engine h2 {
|
|
202
|
-
font-family: var(--serif);
|
|
203
|
-
font-size: 32px;
|
|
204
|
-
margin: 0 0 8px;
|
|
205
|
-
letter-spacing: -0.01em;
|
|
206
|
-
}
|
|
207
|
-
.engine .sub {
|
|
208
|
-
font-size: 12.5px;
|
|
209
|
-
color: var(--ink-dim);
|
|
210
|
-
margin-bottom: 16px;
|
|
211
|
-
line-height: 1.5;
|
|
212
|
-
}
|
|
213
|
-
.engine .tools {
|
|
214
|
-
display: flex;
|
|
215
|
-
flex-wrap: wrap;
|
|
216
|
-
gap: 6px;
|
|
217
|
-
justify-content: center;
|
|
218
|
-
}
|
|
219
|
-
.engine .tool {
|
|
220
|
-
font-family: var(--mono);
|
|
221
|
-
font-size: 11px;
|
|
222
|
-
padding: 4px 9px;
|
|
223
|
-
border: 1px solid var(--amber);
|
|
224
|
-
color: var(--amber);
|
|
225
|
-
border-radius: 999px;
|
|
226
|
-
background: var(--amber-soft);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/* RING DETAIL CARDS */
|
|
230
|
-
.ring-details {
|
|
231
|
-
display: grid;
|
|
232
|
-
grid-template-columns: repeat(3, 1fr);
|
|
233
|
-
gap: 24px;
|
|
234
|
-
margin-bottom: 56px;
|
|
235
|
-
}
|
|
236
|
-
.rcard {
|
|
237
|
-
border: 1px solid var(--line);
|
|
238
|
-
border-radius: 4px;
|
|
239
|
-
padding: 24px 26px 26px;
|
|
240
|
-
background: linear-gradient(180deg, rgba(255,255,255,0.02), rgba(255,255,255,0.004));
|
|
241
|
-
position: relative;
|
|
242
|
-
overflow: hidden;
|
|
243
|
-
}
|
|
244
|
-
.rcard::before {
|
|
245
|
-
content: "";
|
|
246
|
-
position: absolute; top: 0; left: 0; right: 0;
|
|
247
|
-
height: 2px;
|
|
248
|
-
}
|
|
249
|
-
.rcard.r1::before { background: var(--cyan); }
|
|
250
|
-
.rcard.r2::before { background: var(--amber); }
|
|
251
|
-
.rcard.r3::before { background: var(--rose); }
|
|
252
|
-
.rcard .num {
|
|
253
|
-
font-family: var(--serif);
|
|
254
|
-
font-style: italic;
|
|
255
|
-
font-size: 14px;
|
|
256
|
-
color: var(--ink-mute);
|
|
257
|
-
margin-bottom: 6px;
|
|
258
|
-
}
|
|
259
|
-
.rcard h3 {
|
|
260
|
-
font-family: var(--serif);
|
|
261
|
-
font-size: 26px;
|
|
262
|
-
font-weight: 400;
|
|
263
|
-
margin: 0 0 6px;
|
|
264
|
-
letter-spacing: -0.01em;
|
|
265
|
-
}
|
|
266
|
-
.rcard .role {
|
|
267
|
-
font-family: var(--mono);
|
|
268
|
-
font-size: 11px;
|
|
269
|
-
letter-spacing: 0.16em;
|
|
270
|
-
text-transform: uppercase;
|
|
271
|
-
color: var(--ink-mute);
|
|
272
|
-
margin-bottom: 16px;
|
|
273
|
-
display: flex;
|
|
274
|
-
align-items: center;
|
|
275
|
-
gap: 8px;
|
|
276
|
-
}
|
|
277
|
-
.rcard .pill {
|
|
278
|
-
display: inline-block;
|
|
279
|
-
padding: 3px 8px;
|
|
280
|
-
border-radius: 2px;
|
|
281
|
-
}
|
|
282
|
-
.rcard.r1 .pill { background: var(--cyan-soft); color: var(--cyan); }
|
|
283
|
-
.rcard.r2 .pill { background: var(--amber-soft); color: var(--amber); }
|
|
284
|
-
.rcard.r3 .pill { background: var(--rose-soft); color: var(--rose); }
|
|
285
|
-
.rcard p {
|
|
286
|
-
font-size: 13.5px;
|
|
287
|
-
line-height: 1.6;
|
|
288
|
-
color: var(--ink-dim);
|
|
289
|
-
margin: 0 0 14px;
|
|
290
|
-
text-wrap: pretty;
|
|
291
|
-
}
|
|
292
|
-
.rcard p b { color: var(--ink); font-weight: 500; }
|
|
293
|
-
|
|
294
|
-
.impl-block {
|
|
295
|
-
background: rgba(0,0,0,0.32);
|
|
296
|
-
border: 1px solid var(--line);
|
|
297
|
-
border-radius: 3px;
|
|
298
|
-
padding: 12px 14px;
|
|
299
|
-
margin-bottom: 12px;
|
|
300
|
-
}
|
|
301
|
-
.impl-block .h {
|
|
302
|
-
font-family: var(--mono);
|
|
303
|
-
font-size: 10.5px;
|
|
304
|
-
letter-spacing: 0.2em;
|
|
305
|
-
text-transform: uppercase;
|
|
306
|
-
color: var(--ink-mute);
|
|
307
|
-
margin-bottom: 8px;
|
|
308
|
-
}
|
|
309
|
-
.impl-block code {
|
|
310
|
-
font-family: var(--mono);
|
|
311
|
-
font-size: 11.5px;
|
|
312
|
-
color: var(--ink);
|
|
313
|
-
display: block;
|
|
314
|
-
line-height: 1.75;
|
|
315
|
-
white-space: pre;
|
|
316
|
-
}
|
|
317
|
-
.impl-block .cmt { color: var(--ink-mute); }
|
|
318
|
-
.impl-block .key { color: var(--amber); }
|
|
319
|
-
.impl-block .str { color: var(--cyan); }
|
|
320
|
-
.impl-block .ann { color: var(--ink-mute); }
|
|
321
|
-
.impl-block .err { color: var(--rose); }
|
|
322
|
-
|
|
323
|
-
.checkrow {
|
|
324
|
-
display: flex;
|
|
325
|
-
align-items: flex-start;
|
|
326
|
-
gap: 8px;
|
|
327
|
-
font-family: var(--mono);
|
|
328
|
-
font-size: 11.5px;
|
|
329
|
-
color: var(--ink);
|
|
330
|
-
line-height: 1.55;
|
|
331
|
-
margin: 6px 0;
|
|
332
|
-
}
|
|
333
|
-
.checkrow::before {
|
|
334
|
-
content: "✓";
|
|
335
|
-
color: var(--amber);
|
|
336
|
-
font-weight: bold;
|
|
337
|
-
}
|
|
338
|
-
.rcard.r1 .checkrow::before { color: var(--cyan); }
|
|
339
|
-
.rcard.r3 .checkrow::before { color: var(--rose); }
|
|
340
|
-
|
|
341
|
-
/* PATTERN STRIP */
|
|
342
|
-
.pattern {
|
|
343
|
-
border: 1px solid var(--line);
|
|
344
|
-
border-radius: 4px;
|
|
345
|
-
padding: 32px 40px;
|
|
346
|
-
background: linear-gradient(180deg, rgba(243,162,59,0.05), rgba(243,162,59,0));
|
|
347
|
-
display: grid;
|
|
348
|
-
grid-template-columns: 340px 1fr;
|
|
349
|
-
gap: 48px;
|
|
350
|
-
align-items: center;
|
|
351
|
-
margin-bottom: 48px;
|
|
352
|
-
}
|
|
353
|
-
.pattern .ttl {
|
|
354
|
-
font-family: var(--serif);
|
|
355
|
-
font-size: 40px;
|
|
356
|
-
line-height: 1.05;
|
|
357
|
-
letter-spacing: -0.015em;
|
|
358
|
-
}
|
|
359
|
-
.pattern .ttl em { color: var(--amber); font-style: italic; }
|
|
360
|
-
.pattern .ttl .sm {
|
|
361
|
-
display: block;
|
|
362
|
-
font-family: var(--mono);
|
|
363
|
-
font-size: 11px;
|
|
364
|
-
color: var(--ink-mute);
|
|
365
|
-
letter-spacing: 0.24em;
|
|
366
|
-
text-transform: uppercase;
|
|
367
|
-
margin-bottom: 14px;
|
|
368
|
-
}
|
|
369
|
-
.formula {
|
|
370
|
-
display: flex;
|
|
371
|
-
align-items: center;
|
|
372
|
-
gap: 12px;
|
|
373
|
-
font-family: var(--mono);
|
|
374
|
-
flex-wrap: wrap;
|
|
375
|
-
}
|
|
376
|
-
.chip {
|
|
377
|
-
border: 1px solid var(--line-2);
|
|
378
|
-
padding: 12px 14px;
|
|
379
|
-
border-radius: 3px;
|
|
380
|
-
background: rgba(255,255,255,0.02);
|
|
381
|
-
min-width: 150px;
|
|
382
|
-
}
|
|
383
|
-
.chip .t { display: block; font-size: 10.5px; color: var(--ink-mute); letter-spacing: 0.2em; text-transform: uppercase; margin-bottom: 5px; }
|
|
384
|
-
.chip .v { display: block; font-size: 13px; color: var(--ink); }
|
|
385
|
-
.plus { color: var(--ink-mute); font-family: var(--serif); font-size: 24px; }
|
|
386
|
-
.eq { color: var(--amber); font-family: var(--serif); font-size: 24px; padding: 0 4px; }
|
|
387
|
-
.result { background: var(--amber); color: #1a1207; border-color: var(--amber); }
|
|
388
|
-
.result .t { color: #5b3e0c; }
|
|
389
|
-
.result .v { color: #1a1207; font-weight: 600; }
|
|
390
|
-
|
|
391
|
-
/* APPLICATIONS */
|
|
392
|
-
.applications {
|
|
393
|
-
display: grid;
|
|
394
|
-
grid-template-columns: 280px 1fr;
|
|
395
|
-
gap: 40px;
|
|
396
|
-
margin-bottom: 48px;
|
|
397
|
-
}
|
|
398
|
-
.applications h4 {
|
|
399
|
-
font-family: var(--serif);
|
|
400
|
-
font-size: 26px;
|
|
401
|
-
font-weight: 400;
|
|
402
|
-
margin: 0 0 10px;
|
|
403
|
-
letter-spacing: -0.01em;
|
|
404
|
-
line-height: 1.15;
|
|
405
|
-
}
|
|
406
|
-
.applications .lede {
|
|
407
|
-
font-size: 13.5px;
|
|
408
|
-
color: var(--ink-dim);
|
|
409
|
-
line-height: 1.55;
|
|
410
|
-
text-wrap: pretty;
|
|
411
|
-
}
|
|
412
|
-
.applications .lede b { color: var(--ink); font-weight: 500; }
|
|
413
|
-
.apps-grid {
|
|
414
|
-
display: grid;
|
|
415
|
-
grid-template-columns: repeat(4, 1fr);
|
|
416
|
-
gap: 14px;
|
|
417
|
-
}
|
|
418
|
-
.app {
|
|
419
|
-
border: 1px solid var(--line);
|
|
420
|
-
border-radius: 3px;
|
|
421
|
-
padding: 16px 18px;
|
|
422
|
-
background: rgba(255,255,255,0.012);
|
|
423
|
-
}
|
|
424
|
-
.app .ico {
|
|
425
|
-
font-family: var(--mono);
|
|
426
|
-
font-size: 10.5px;
|
|
427
|
-
color: var(--amber);
|
|
428
|
-
letter-spacing: 0.2em;
|
|
429
|
-
margin-bottom: 8px;
|
|
430
|
-
}
|
|
431
|
-
.app .nm {
|
|
432
|
-
font-size: 15px;
|
|
433
|
-
color: var(--ink);
|
|
434
|
-
margin-bottom: 6px;
|
|
435
|
-
font-weight: 500;
|
|
436
|
-
}
|
|
437
|
-
.app .ex {
|
|
438
|
-
font-family: var(--mono);
|
|
439
|
-
font-size: 11px;
|
|
440
|
-
color: var(--ink-mute);
|
|
441
|
-
line-height: 1.55;
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
/* SECRET REVEAL */
|
|
445
|
-
.reveal-box {
|
|
446
|
-
border: 1px solid var(--line);
|
|
447
|
-
border-radius: 4px;
|
|
448
|
-
padding: 36px 44px;
|
|
449
|
-
background:
|
|
450
|
-
radial-gradient(600px 200px at 0% 50%, rgba(243,162,59,0.06), transparent 60%),
|
|
451
|
-
linear-gradient(180deg, rgba(255,255,255,0.015), rgba(255,255,255,0));
|
|
452
|
-
margin-bottom: 40px;
|
|
453
|
-
display: grid;
|
|
454
|
-
grid-template-columns: 1fr 480px;
|
|
455
|
-
gap: 48px;
|
|
456
|
-
align-items: center;
|
|
457
|
-
}
|
|
458
|
-
.reveal-box .myth-truth {
|
|
459
|
-
display: grid;
|
|
460
|
-
grid-template-columns: 1fr 1fr;
|
|
461
|
-
gap: 24px;
|
|
462
|
-
}
|
|
463
|
-
.reveal-box .col .lbl {
|
|
464
|
-
font-family: var(--mono);
|
|
465
|
-
font-size: 11px;
|
|
466
|
-
letter-spacing: 0.24em;
|
|
467
|
-
text-transform: uppercase;
|
|
468
|
-
color: var(--ink-mute);
|
|
469
|
-
margin-bottom: 12px;
|
|
470
|
-
padding-bottom: 8px;
|
|
471
|
-
border-bottom: 1px solid var(--line);
|
|
472
|
-
}
|
|
473
|
-
.reveal-box .col.myth .lbl { color: var(--rose); }
|
|
474
|
-
.reveal-box .col.truth .lbl { color: var(--amber); }
|
|
475
|
-
.reveal-box .col ul {
|
|
476
|
-
margin: 0; padding: 0; list-style: none;
|
|
477
|
-
display: flex; flex-direction: column; gap: 10px;
|
|
478
|
-
}
|
|
479
|
-
.reveal-box .col li {
|
|
480
|
-
font-size: 13.5px;
|
|
481
|
-
line-height: 1.5;
|
|
482
|
-
color: var(--ink-dim);
|
|
483
|
-
padding-left: 18px;
|
|
484
|
-
position: relative;
|
|
485
|
-
}
|
|
486
|
-
.reveal-box .col.myth li::before {
|
|
487
|
-
content: "✕";
|
|
488
|
-
position: absolute; left: 0; top: 0;
|
|
489
|
-
color: var(--rose);
|
|
490
|
-
font-family: var(--mono);
|
|
491
|
-
font-size: 12px;
|
|
492
|
-
}
|
|
493
|
-
.reveal-box .col.truth li::before {
|
|
494
|
-
content: "→";
|
|
495
|
-
position: absolute; left: 0; top: 0;
|
|
496
|
-
color: var(--amber);
|
|
497
|
-
font-family: var(--mono);
|
|
498
|
-
}
|
|
499
|
-
.reveal-box .col li b { color: var(--ink); font-weight: 500; }
|
|
500
|
-
.reveal-headline {
|
|
501
|
-
font-family: var(--serif);
|
|
502
|
-
font-size: 42px;
|
|
503
|
-
line-height: 1.05;
|
|
504
|
-
letter-spacing: -0.015em;
|
|
505
|
-
}
|
|
506
|
-
.reveal-headline em { color: var(--amber); font-style: italic; }
|
|
507
|
-
.reveal-headline .sm {
|
|
508
|
-
display: block;
|
|
509
|
-
font-family: var(--mono);
|
|
510
|
-
font-size: 11px;
|
|
511
|
-
color: var(--ink-mute);
|
|
512
|
-
letter-spacing: 0.24em;
|
|
513
|
-
text-transform: uppercase;
|
|
514
|
-
margin-bottom: 16px;
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
/* FOOTER */
|
|
518
|
-
.footer {
|
|
519
|
-
display: grid;
|
|
520
|
-
grid-template-columns: 1fr auto;
|
|
521
|
-
align-items: end;
|
|
522
|
-
border-top: 1px solid var(--line);
|
|
523
|
-
padding-top: 28px;
|
|
524
|
-
gap: 40px;
|
|
525
|
-
}
|
|
526
|
-
.footer .lede {
|
|
527
|
-
font-family: var(--serif);
|
|
528
|
-
font-size: 26px;
|
|
529
|
-
line-height: 1.3;
|
|
530
|
-
letter-spacing: -0.01em;
|
|
531
|
-
max-width: 980px;
|
|
532
|
-
text-wrap: pretty;
|
|
533
|
-
}
|
|
534
|
-
.footer .lede em { color: var(--amber); font-style: italic; }
|
|
535
|
-
.footer .lede .small {
|
|
536
|
-
display: block;
|
|
537
|
-
font-family: var(--mono);
|
|
538
|
-
font-size: 11px;
|
|
539
|
-
color: var(--ink-mute);
|
|
540
|
-
letter-spacing: 0.22em;
|
|
541
|
-
text-transform: uppercase;
|
|
542
|
-
margin-bottom: 12px;
|
|
543
|
-
}
|
|
544
|
-
.footer .stamp {
|
|
545
|
-
text-align: right;
|
|
546
|
-
font-family: var(--mono);
|
|
547
|
-
font-size: 11px;
|
|
548
|
-
color: var(--ink-mute);
|
|
549
|
-
line-height: 1.7;
|
|
550
|
-
}
|
|
551
|
-
.footer .stamp .big {
|
|
552
|
-
display: block;
|
|
553
|
-
font-family: var(--serif);
|
|
554
|
-
font-size: 24px;
|
|
555
|
-
color: var(--ink);
|
|
556
|
-
letter-spacing: 0.04em;
|
|
557
|
-
margin-bottom: 6px;
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
/* === SVG animation === */
|
|
561
|
-
.arc-base { stroke: var(--line-2); stroke-width: 1.4; stroke-dasharray: 2 5; opacity: 0.6; fill: none; }
|
|
562
|
-
.ring-arc { fill: none; stroke-width: 1.6; opacity: 0.55; }
|
|
563
|
-
.ring-arc.r1 { stroke: var(--cyan); }
|
|
564
|
-
.ring-arc.r2 { stroke: var(--amber); }
|
|
565
|
-
.ring-arc.r3 { stroke: var(--rose); }
|
|
566
|
-
|
|
567
|
-
@keyframes flow {
|
|
568
|
-
to { stroke-dashoffset: -628; }
|
|
569
|
-
}
|
|
570
|
-
.flow-arc {
|
|
571
|
-
fill: none;
|
|
572
|
-
stroke-width: 3;
|
|
573
|
-
stroke-dasharray: 18 60 6 60 10 60 8 60 14 60 6 60 12 60 10 60;
|
|
574
|
-
stroke-linecap: round;
|
|
575
|
-
animation: flow 6s linear infinite;
|
|
576
|
-
filter: drop-shadow(0 0 6px currentColor);
|
|
577
|
-
}
|
|
578
|
-
.flow-arc.f1 { stroke: var(--cyan); color: var(--cyan); animation-delay: 0s; }
|
|
579
|
-
.flow-arc.f2 { stroke: var(--amber); color: var(--amber); animation-delay: -2s; }
|
|
580
|
-
.flow-arc.f3 { stroke: var(--rose); color: var(--rose); animation-delay: -4s; }
|
|
581
|
-
|
|
582
|
-
/* secondary tracer dots */
|
|
583
|
-
@keyframes orbit-r1 { to { offset-distance: 100%; } }
|
|
584
|
-
@keyframes orbit-r2 { to { offset-distance: 100%; } }
|
|
585
|
-
@keyframes orbit-r3 { to { offset-distance: 100%; } }
|
|
586
|
-
.tracer {
|
|
587
|
-
width: 14px; height: 14px;
|
|
588
|
-
position: absolute;
|
|
589
|
-
border-radius: 50%;
|
|
590
|
-
pointer-events: none;
|
|
591
|
-
will-change: transform;
|
|
592
|
-
}
|
|
593
|
-
.tracer .core {
|
|
594
|
-
width: 8px; height: 8px;
|
|
595
|
-
border-radius: 50%;
|
|
596
|
-
position: absolute; top: 3px; left: 3px;
|
|
597
|
-
}
|
|
598
|
-
.tracer .halo {
|
|
599
|
-
position: absolute; inset: -6px;
|
|
600
|
-
border-radius: 50%;
|
|
601
|
-
opacity: 0.5;
|
|
602
|
-
}
|
|
603
|
-
|
|
604
|
-
@keyframes pulse {
|
|
605
|
-
0%, 100% { opacity: 0.55; transform: scale(1); }
|
|
606
|
-
50% { opacity: 1; transform: scale(1.06); }
|
|
607
|
-
}
|
|
608
|
-
.engine-glow {
|
|
609
|
-
transform-box: fill-box;
|
|
610
|
-
transform-origin: center;
|
|
611
|
-
animation: pulse 3.6s ease-in-out infinite;
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
@keyframes spin-slow { to { transform: rotate(360deg); } }
|
|
615
|
-
.engine-ring {
|
|
616
|
-
transform-origin: 768px 470px;
|
|
617
|
-
transform-box: view-box;
|
|
618
|
-
animation: spin-slow 30s linear infinite;
|
|
619
|
-
}
|
|
620
|
-
.engine-ring-rev {
|
|
621
|
-
transform-origin: 768px 470px;
|
|
622
|
-
transform-box: view-box;
|
|
623
|
-
animation: spin-slow 45s linear infinite reverse;
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
.marker { fill: var(--bg-2); stroke-width: 2; }
|
|
627
|
-
.marker.r1 { stroke: var(--cyan); }
|
|
628
|
-
.marker.r2 { stroke: var(--amber); }
|
|
629
|
-
.marker.r3 { stroke: var(--rose); }
|
|
630
|
-
.marker-num {
|
|
631
|
-
font-family: var(--mono);
|
|
632
|
-
font-size: 14px;
|
|
633
|
-
font-weight: 600;
|
|
634
|
-
text-anchor: middle;
|
|
635
|
-
dominant-baseline: central;
|
|
636
|
-
}
|
|
637
|
-
.marker-num.r1 { fill: var(--cyan); }
|
|
638
|
-
.marker-num.r2 { fill: var(--amber); }
|
|
639
|
-
.marker-num.r3 { fill: var(--rose); }
|
|
640
|
-
.axis-label {
|
|
641
|
-
font-family: var(--mono);
|
|
642
|
-
font-size: 11px;
|
|
643
|
-
fill: var(--ink-mute);
|
|
644
|
-
letter-spacing: 0.18em;
|
|
645
|
-
text-anchor: middle;
|
|
646
|
-
text-transform: uppercase;
|
|
647
|
-
}
|
|
648
|
-
.axis-label.r1 { fill: var(--cyan); }
|
|
649
|
-
.axis-label.r2 { fill: var(--amber); }
|
|
650
|
-
.axis-label.r3 { fill: var(--rose); }
|
|
651
|
-
</style>
|
|
652
|
-
</head>
|
|
653
|
-
<body>
|
|
654
|
-
<div class="poster">
|
|
655
|
-
<div class="grid-bg"></div>
|
|
656
|
-
|
|
657
|
-
<div class="corner tl">FLYWHEEL · v1.0 / SELF-GROWING AGENT FRAMEWORK</div>
|
|
658
|
-
<div class="corner tr">POSTER № 001 · SHEET A</div>
|
|
659
|
-
<div class="corner bl">RING 1 → RING 2 → RING 3 → ∞</div>
|
|
660
|
-
<div class="corner br">github.com/renmengkai/Flywheel</div>
|
|
661
|
-
|
|
662
|
-
<!-- HEADER -->
|
|
663
|
-
<header class="header">
|
|
664
|
-
<div>
|
|
665
|
-
<div class="eyebrow"><span class="dot"></span>揭开 Agent 的神秘面纱 · The Anatomy of a Self-Growing Agent</div>
|
|
666
|
-
<h1>把 AI 编程工具<br/>装进<em>自成长飞轮</em>。</h1>
|
|
667
|
-
<p class="subtitle">
|
|
668
|
-
所谓 Agent,不是一个黑盒大模型,而是一组<b>朴素的 Markdown + Shell 脚本 + JSON 日志</b>。
|
|
669
|
-
以 <b>Claude Code / OpenCode / Trae / Codex</b> 等 AI 编程工具为<b>通用引擎</b>,
|
|
670
|
-
让"<b>分析 → 执行 → 反馈 → 蒸馏</b>"形成闭环。<br/>
|
|
671
|
-
每跑一圈,Skill 自动更新;下一圈,分析更准。这就是飞轮。
|
|
672
|
-
</p>
|
|
673
|
-
</div>
|
|
674
|
-
<div class="header-meta">
|
|
675
|
-
ARCH · <span class="v">Three-Ring Loop</span><br/>
|
|
676
|
-
ENGINE · <span class="v">AI Coding Agent</span><br/>
|
|
677
|
-
MEDIUM · <span class="v">*.md + *.sh + *.jsonl</span><br/>
|
|
678
|
-
OUTPUT · <span class="v">Skill v{n} → v{n+1}</span>
|
|
679
|
-
</div>
|
|
680
|
-
</header>
|
|
681
|
-
|
|
682
|
-
<!-- THESIS STRIP -->
|
|
683
|
-
<section class="thesis">
|
|
684
|
-
<div>
|
|
685
|
-
<div class="k">01 · 引擎 ENGINE</div>
|
|
686
|
-
<div class="v">任意 <em>AI 编程工具</em>作为通用执行核心 — 不绑定模型、不绑定 IDE</div>
|
|
687
|
-
</div>
|
|
688
|
-
<div>
|
|
689
|
-
<div class="k">02 · 燃料 FUEL</div>
|
|
690
|
-
<div class="v">输入材料 + 用户意图 + 过往蒸馏出的 <em>Skill 文件</em></div>
|
|
691
|
-
</div>
|
|
692
|
-
<div>
|
|
693
|
-
<div class="k">03 · 传动 TRANSMISSION</div>
|
|
694
|
-
<div class="v">三个 <em>shell 脚本</em>把分析 / 执行 / 反馈三环咬合在一起</div>
|
|
695
|
-
</div>
|
|
696
|
-
<div>
|
|
697
|
-
<div class="k">04 · 增长 GROWTH</div>
|
|
698
|
-
<div class="v">≥ 3 条反馈触发<em>蒸馏</em>,Skill 自动迭代,下一圈更准</div>
|
|
699
|
-
</div>
|
|
700
|
-
</section>
|
|
701
|
-
|
|
702
|
-
<!-- WHEEL STAGE -->
|
|
703
|
-
<section class="stage">
|
|
704
|
-
<div class="wheel-wrap">
|
|
705
|
-
<svg class="wheel" viewBox="0 0 1536 940" preserveAspectRatio="xMidYMid meet">
|
|
706
|
-
<defs>
|
|
707
|
-
<radialGradient id="engineGlow" cx="50%" cy="50%" r="50%">
|
|
708
|
-
<stop offset="0%" stop-color="#f3a23b" stop-opacity="0.55"/>
|
|
709
|
-
<stop offset="50%" stop-color="#f3a23b" stop-opacity="0.18"/>
|
|
710
|
-
<stop offset="100%" stop-color="#f3a23b" stop-opacity="0"/>
|
|
711
|
-
</radialGradient>
|
|
712
|
-
<radialGradient id="centerCore" cx="50%" cy="50%" r="50%">
|
|
713
|
-
<stop offset="0%" stop-color="#2a1f10"/>
|
|
714
|
-
<stop offset="100%" stop-color="#0a0805"/>
|
|
715
|
-
</radialGradient>
|
|
716
|
-
|
|
717
|
-
<marker id="ah-cyan" viewBox="0 0 12 12" refX="6" refY="6" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
|
|
718
|
-
<path d="M0,0 L12,6 L0,12 z" fill="#6fd2e4"/>
|
|
719
|
-
</marker>
|
|
720
|
-
<marker id="ah-amber" viewBox="0 0 12 12" refX="6" refY="6" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
|
|
721
|
-
<path d="M0,0 L12,6 L0,12 z" fill="#f3a23b"/>
|
|
722
|
-
</marker>
|
|
723
|
-
<marker id="ah-rose" viewBox="0 0 12 12" refX="6" refY="6" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
|
|
724
|
-
<path d="M0,0 L12,6 L0,12 z" fill="#e87a6e"/>
|
|
725
|
-
</marker>
|
|
726
|
-
</defs>
|
|
727
|
-
|
|
728
|
-
<!-- engine glow -->
|
|
729
|
-
<circle class="engine-glow" cx="768" cy="470" r="290" fill="url(#engineGlow)"/>
|
|
730
|
-
|
|
731
|
-
<!-- dashed orbits -->
|
|
732
|
-
<circle class="arc-base" cx="768" cy="470" r="400"/>
|
|
733
|
-
<circle class="arc-base" cx="768" cy="470" r="320"/>
|
|
734
|
-
|
|
735
|
-
<!-- 3 ring arcs at r=360 -->
|
|
736
|
-
<!-- markers at angles: -150°, -30°, 90° -->
|
|
737
|
-
<!-- pt(-150°) = (768 + 360*cos(-150°), 470 + 360*sin(-150°)) = (768 - 311.77, 470 - 180) = (456.23, 290) -->
|
|
738
|
-
<!-- pt(-30°) = (768 + 360*cos(-30°), 470 + 360*sin(-30°)) = (768 + 311.77, 470 - 180) = (1079.77, 290) -->
|
|
739
|
-
<!-- pt(90°) = (768, 830) -->
|
|
740
|
-
<!-- Ring 1: top arc (cyan), counter-clockwise from -150° to -30° via -90° (top): use large-arc=0, sweep=1 -->
|
|
741
|
-
<path class="ring-arc r1" d="M 456.23 290 A 360 360 0 0 1 1079.77 290"/>
|
|
742
|
-
<path class="ring-arc r2" d="M 1079.77 290 A 360 360 0 0 1 768 830"/>
|
|
743
|
-
<path class="ring-arc r3" d="M 768 830 A 360 360 0 0 1 456.23 290"/>
|
|
744
|
-
|
|
745
|
-
<!-- flowing arrows -->
|
|
746
|
-
<path id="flow-r1" class="flow-arc f1"
|
|
747
|
-
d="M 456.23 290 A 360 360 0 0 1 1079.77 290"
|
|
748
|
-
marker-end="url(#ah-cyan)"/>
|
|
749
|
-
<path id="flow-r2" class="flow-arc f2"
|
|
750
|
-
d="M 1079.77 290 A 360 360 0 0 1 768 830"
|
|
751
|
-
marker-end="url(#ah-amber)"/>
|
|
752
|
-
<path id="flow-r3" class="flow-arc f3"
|
|
753
|
-
d="M 768 830 A 360 360 0 0 1 456.23 290"
|
|
754
|
-
marker-end="url(#ah-rose)"/>
|
|
755
|
-
|
|
756
|
-
<!-- engine core -->
|
|
757
|
-
<g>
|
|
758
|
-
<circle class="engine-ring" cx="768" cy="470" r="200" fill="none" stroke="#f3a23b" stroke-width="0.8" stroke-opacity="0.35" stroke-dasharray="4 14"/>
|
|
759
|
-
<circle class="engine-ring-rev" cx="768" cy="470" r="220" fill="none" stroke="#f3a23b" stroke-width="0.6" stroke-opacity="0.22" stroke-dasharray="2 22"/>
|
|
760
|
-
<circle cx="768" cy="470" r="180" fill="url(#centerCore)" stroke="#f3a23b" stroke-width="1.5" stroke-opacity="0.85"/>
|
|
761
|
-
<circle cx="768" cy="470" r="155" fill="none" stroke="#f3a23b" stroke-width="0.6" stroke-opacity="0.35" stroke-dasharray="3 6"/>
|
|
762
|
-
|
|
763
|
-
<!-- engine spokes -->
|
|
764
|
-
<g stroke="#f3a23b" stroke-width="0.8" stroke-opacity="0.32">
|
|
765
|
-
<line x1="768" y1="315" x2="768" y2="625"/>
|
|
766
|
-
<line x1="613" y1="470" x2="923" y2="470"/>
|
|
767
|
-
<line x1="658" y1="360" x2="878" y2="580"/>
|
|
768
|
-
<line x1="878" y1="360" x2="658" y2="580"/>
|
|
769
|
-
</g>
|
|
770
|
-
</g>
|
|
771
|
-
|
|
772
|
-
<!-- node markers -->
|
|
773
|
-
<circle class="marker r1" cx="456.23" cy="290" r="22"/>
|
|
774
|
-
<text class="marker-num r1" x="456.23" y="290">1</text>
|
|
775
|
-
<circle class="marker r2" cx="1079.77" cy="290" r="22"/>
|
|
776
|
-
<text class="marker-num r2" x="1079.77" y="290">2</text>
|
|
777
|
-
<circle class="marker r3" cx="768" cy="830" r="22"/>
|
|
778
|
-
<text class="marker-num r3" x="768" y="830">3</text>
|
|
779
|
-
|
|
780
|
-
<!-- handoff labels near markers -->
|
|
781
|
-
<text class="axis-label" x="456.23" y="252">USER MATERIAL · /flywheel</text>
|
|
782
|
-
<text class="axis-label" x="1079.77" y="252">ARTIFACTS + ASSUMPTIONS</text>
|
|
783
|
-
<text class="axis-label" x="768" y="868">FEEDBACK ≥ 3 · QUALITY ≥ 0.6</text>
|
|
784
|
-
</svg>
|
|
785
|
-
|
|
786
|
-
<!-- HTML overlays -->
|
|
787
|
-
<div class="nodes">
|
|
788
|
-
<div class="engine">
|
|
789
|
-
<div class="badge">★ THE ENGINE</div>
|
|
790
|
-
<h2>AI 编程工具</h2>
|
|
791
|
-
<div class="sub">通用执行核心 · 把意图变成代码<br/>把代码喂回反馈</div>
|
|
792
|
-
<div class="tools">
|
|
793
|
-
<span class="tool">Claude Code</span>
|
|
794
|
-
<span class="tool">OpenCode</span>
|
|
795
|
-
<span class="tool">Trae</span>
|
|
796
|
-
<span class="tool">Codex</span>
|
|
797
|
-
<span class="tool">Cursor</span>
|
|
798
|
-
</div>
|
|
799
|
-
</div>
|
|
800
|
-
|
|
801
|
-
<!-- Ring 1 node (top) -->
|
|
802
|
-
<div class="node ring1" style="left:50%; top:10%;">
|
|
803
|
-
<div class="tag">▟ RING 1 · ANALYZE</div>
|
|
804
|
-
<div class="name">分析输入,生成产物</div>
|
|
805
|
-
<div class="desc">读入材料 → 加载 Skill 协议 → 五维度扫描 → 标记 <span style="color:var(--amber)">⚠️ 假设</span> → 产出可执行规格 + 信息缺口</div>
|
|
806
|
-
<div class="files">
|
|
807
|
-
<span class="f"><span class="c">skills/{skill}/</span>domain.md</span>
|
|
808
|
-
<span class="f"><span class="c">skills/{skill}/</span>artifacts.md</span>
|
|
809
|
-
<span class="f"><span class="c">skills/{skill}/</span>skill.yaml</span>
|
|
810
|
-
</div>
|
|
811
|
-
</div>
|
|
812
|
-
|
|
813
|
-
<!-- Ring 2 node (right) -->
|
|
814
|
-
<div class="node ring2" style="left:88%; top:50%; width:230px; text-align:right;">
|
|
815
|
-
<div class="tag">▟ RING 2 · EXECUTE</div>
|
|
816
|
-
<div class="name">桥接编程工具<br/>落地实现</div>
|
|
817
|
-
<div class="desc">产物自动注入 <span style="color:var(--ink)">CLAUDE.md</span>,启动 AI 编程工具;
|
|
818
|
-
过程中把模糊点写回 <span style="color:var(--cyan)">.flywheel-feedback.json</span></div>
|
|
819
|
-
<div class="files" style="text-align:right;">
|
|
820
|
-
<span class="f"><span class="c">scripts/</span>bridge-to-coder.sh</span>
|
|
821
|
-
<span class="f"><span class="c">{impl}/</span>CLAUDE.md</span>
|
|
822
|
-
<span class="f"><span class="c">{impl}/</span>.flywheel-feedback.json</span>
|
|
823
|
-
</div>
|
|
824
|
-
</div>
|
|
825
|
-
|
|
826
|
-
<!-- Ring 3 node (left) -->
|
|
827
|
-
<div class="node ring3" style="left:12%; top:50%; width:230px;">
|
|
828
|
-
<div class="tag">▟ RING 3 · DISTILL</div>
|
|
829
|
-
<div class="name">蒸馏反馈<br/>进化 Skill</div>
|
|
830
|
-
<div class="desc">事件落盘 → 质量过滤 ≥0.6 → 累计 ≥3 条触发<br/>蒸馏 → 一次性预览 → 单次 y/n 写盘</div>
|
|
831
|
-
<div class="files">
|
|
832
|
-
<span class="f"><span class="c">scripts/</span>feedback-hook.sh</span>
|
|
833
|
-
<span class="f"><span class="c">scripts/</span>auto-distill.sh</span>
|
|
834
|
-
<span class="f"><span class="c">skills/_kernel/</span>distillation.md</span>
|
|
835
|
-
<span class="f"><span class="c">episodic-logs/</span>{proj}.jsonl</span>
|
|
836
|
-
</div>
|
|
837
|
-
</div>
|
|
838
|
-
</div>
|
|
839
|
-
</div>
|
|
840
|
-
</section>
|
|
841
|
-
|
|
842
|
-
<!-- RING DETAILS -->
|
|
843
|
-
<section class="ring-details">
|
|
844
|
-
|
|
845
|
-
<article class="rcard r1">
|
|
846
|
-
<div class="num">Ring 01 — 分析</div>
|
|
847
|
-
<h3>从材料到可执行规格</h3>
|
|
848
|
-
<div class="role"><span class="pill">触发 · /flywheel</span><span>读 / 推 / 产出</span></div>
|
|
849
|
-
<p>
|
|
850
|
-
Agent 加载 <b>domain.md</b>(分析协议)与 <b>memory/failure-patterns.md</b>(已知失败模式)作为常驻上下文,
|
|
851
|
-
按协议扫描输入材料。<b>未覆盖的点</b>不允许大模型偷偷"脑补",必须写成<b>假设清单 + 信息缺口</b>。
|
|
852
|
-
</p>
|
|
853
|
-
<div class="impl-block">
|
|
854
|
-
<div class="h">关键文件 · skill.yaml</div>
|
|
855
|
-
<code><span class="cmt"># skills/req-mining/skill.yaml</span>
|
|
856
|
-
<span class="key">name</span>: <span class="str">req-mining</span>
|
|
857
|
-
<span class="key">version</span>: <span class="str">1.0.0</span>
|
|
858
|
-
<span class="key">ring1_skill</span>: <span class="str">skills/req-mining/domain.md</span>
|
|
859
|
-
<span class="key">ring2_bridge</span>: <span class="str">scripts/bridge-to-coder.sh</span>
|
|
860
|
-
<span class="key">memory</span>:
|
|
861
|
-
- <span class="str">skills/req-mining/memory/failure-patterns.md</span></code>
|
|
862
|
-
</div>
|
|
863
|
-
<div class="impl-block">
|
|
864
|
-
<div class="h">产物形态 · projects/{proj}/artifacts/</div>
|
|
865
|
-
<code>├─ clarification-report.md <span class="ann">← 甲方确认报告</span>
|
|
866
|
-
├─ ai-execution-doc.md <span class="ann">← 喂给编程工具</span>
|
|
867
|
-
└─ prototype-spec.md <span class="ann">← 可视化原型规格</span></code>
|
|
868
|
-
</div>
|
|
869
|
-
<div class="checkrow">输入:用户材料 / 文件路径 / URL</div>
|
|
870
|
-
<div class="checkrow">输出:含假设清单的可执行文档</div>
|
|
871
|
-
<div class="checkrow">状态:projects/{proj}/state.json</div>
|
|
872
|
-
</article>
|
|
873
|
-
|
|
874
|
-
<article class="rcard r2">
|
|
875
|
-
<div class="num">Ring 02 — 执行</div>
|
|
876
|
-
<h3>桥接到任意 AI 编程工具</h3>
|
|
877
|
-
<div class="role"><span class="pill">触发 · bridge-to-coder.sh</span><span>注入 / 执行 / 回写</span></div>
|
|
878
|
-
<p>
|
|
879
|
-
Ring 1 的产物被自动写入实现目录的 <b>CLAUDE.md</b>,作为编程工具的<b>唯一权威上下文</b>。
|
|
880
|
-
实现过程中遇到模糊点,编程工具把问题写回 <b>.flywheel-feedback.json</b>,工具退出时被自动收集。
|
|
881
|
-
</p>
|
|
882
|
-
<div class="impl-block">
|
|
883
|
-
<div class="h">桥接命令 · 一行启动</div>
|
|
884
|
-
<code><span class="cmt">$</span> ./scripts/bridge-to-coder.sh \
|
|
885
|
-
<span class="str">proj_20260515_01</span> \
|
|
886
|
-
<span class="key">claude</span> <span class="ann"># | opencode | trae | codex | cursor</span></code>
|
|
887
|
-
</div>
|
|
888
|
-
<div class="impl-block">
|
|
889
|
-
<div class="h">反馈契约 · .flywheel-feedback.json</div>
|
|
890
|
-
<code>{
|
|
891
|
-
<span class="key">"unclear_specs"</span>: [<span class="str">"..."</span>],
|
|
892
|
-
<span class="key">"uncovered_decisions"</span>: [<span class="str">"..."</span>],
|
|
893
|
-
<span class="key">"wrong_assumptions"</span>: [<span class="str">"..."</span>],
|
|
894
|
-
<span class="key">"untestable_criteria"</span>: [<span class="str">"..."</span>],
|
|
895
|
-
<span class="key">"general_feedback"</span>: <span class="str">"质量评分 1-10"</span>
|
|
896
|
-
}</code>
|
|
897
|
-
</div>
|
|
898
|
-
<div class="checkrow">引擎可换:本地工具遵循同一契约</div>
|
|
899
|
-
<div class="checkrow">退出即回收:feedback-hook.sh --auto</div>
|
|
900
|
-
<div class="checkrow">日志落盘:episodic-logs/{proj}.jsonl</div>
|
|
901
|
-
</article>
|
|
902
|
-
|
|
903
|
-
<article class="rcard r3">
|
|
904
|
-
<div class="num">Ring 03 — 蒸馏</div>
|
|
905
|
-
<h3>把反馈变成下一版 Skill</h3>
|
|
906
|
-
<div class="role"><span class="pill">触发 · ≥3 条 · quality≥0.6</span><span>扫 / 提炼 / 改写</span></div>
|
|
907
|
-
<p>
|
|
908
|
-
当 <b>.distill-needed/{proj}</b> 标记出现,下次会话自动加载 <b>distillation.md</b>,
|
|
909
|
-
对事件做质量过滤、模式提炼、路由判定,最终<b>一次性预览全部变更</b>,用户单次 y/n 即写盘。
|
|
910
|
-
</p>
|
|
911
|
-
<div class="impl-block">
|
|
912
|
-
<div class="h">蒸馏路由表 · 事件 → 文件</div>
|
|
913
|
-
<code>unclear_specs → artifacts.md
|
|
914
|
-
uncovered_decision → 决策树章节
|
|
915
|
-
wrong_assumption → failure-patterns.md
|
|
916
|
-
validated_pattern → domain.md 推断库</code>
|
|
917
|
-
</div>
|
|
918
|
-
<div class="impl-block">
|
|
919
|
-
<div class="h">触发条件 · auto-distill.sh</div>
|
|
920
|
-
<code><span class="key">DISTILL_THRESHOLD</span>=<span class="ann">3</span>
|
|
921
|
-
<span class="key">QUALITY_MIN</span>=<span class="ann">0.6</span>
|
|
922
|
-
<span class="cmt"># cron: 0 9 * * *</span>
|
|
923
|
-
<span class="cmt"># 或 bridge-to-coder.sh 退出时自动检测</span></code>
|
|
924
|
-
</div>
|
|
925
|
-
<div class="checkrow">单次确认:y / n / 1,3 选择性应用</div>
|
|
926
|
-
<div class="checkrow">写盘即提交:git commit -m "distill(...)"</div>
|
|
927
|
-
<div class="checkrow">版本号:minor + 1,飞轮闭合</div>
|
|
928
|
-
</article>
|
|
929
|
-
</section>
|
|
930
|
-
|
|
931
|
-
<!-- THE REVEAL -->
|
|
932
|
-
<section class="reveal-box">
|
|
933
|
-
<div class="reveal-headline">
|
|
934
|
-
<span class="sm">Demystifying the Agent · 揭晓神秘面纱</span>
|
|
935
|
-
Agent 不是黑魔法 —<br/><em>是文件、脚本和契约</em>。
|
|
936
|
-
</div>
|
|
937
|
-
<div class="myth-truth">
|
|
938
|
-
<div class="col myth">
|
|
939
|
-
<div class="lbl">误解 · MYTH</div>
|
|
940
|
-
<ul>
|
|
941
|
-
<li>Agent = 一个更聪明的<b>大模型</b></li>
|
|
942
|
-
<li>需要<b>专属服务器</b>和复杂框架</li>
|
|
943
|
-
<li>记忆只能靠<b>向量数据库</b></li>
|
|
944
|
-
<li>每个新场景都要<b>从头训练</b></li>
|
|
945
|
-
</ul>
|
|
946
|
-
</div>
|
|
947
|
-
<div class="col truth">
|
|
948
|
-
<div class="lbl">真相 · TRUTH</div>
|
|
949
|
-
<ul>
|
|
950
|
-
<li>Agent = <b>协议 + 引擎 + 反馈回路</b></li>
|
|
951
|
-
<li>一行 <b>curl install.sh</b> 即可运行</li>
|
|
952
|
-
<li>记忆是 <b>*.md + *.jsonl</b>,可读可 diff</li>
|
|
953
|
-
<li>换 <b>domain.md</b> 即换场景,引擎不变</li>
|
|
954
|
-
</ul>
|
|
955
|
-
</div>
|
|
956
|
-
</div>
|
|
957
|
-
</section>
|
|
958
|
-
|
|
959
|
-
<!-- PATTERN FORMULA -->
|
|
960
|
-
<section class="pattern">
|
|
961
|
-
<div class="ttl">
|
|
962
|
-
<span class="sm">THE UNIVERSAL FORMULA</span>
|
|
963
|
-
这不是某个 Agent —<br/><em>是 Agent 的通式</em>。
|
|
964
|
-
</div>
|
|
965
|
-
<div class="formula">
|
|
966
|
-
<div class="chip">
|
|
967
|
-
<span class="t">领域协议</span>
|
|
968
|
-
<span class="v">domain.md</span>
|
|
969
|
-
</div>
|
|
970
|
-
<span class="plus">+</span>
|
|
971
|
-
<div class="chip">
|
|
972
|
-
<span class="t">通用引擎</span>
|
|
973
|
-
<span class="v">AI 编程工具</span>
|
|
974
|
-
</div>
|
|
975
|
-
<span class="plus">+</span>
|
|
976
|
-
<div class="chip">
|
|
977
|
-
<span class="t">传动脚本</span>
|
|
978
|
-
<span class="v">3 × shell</span>
|
|
979
|
-
</div>
|
|
980
|
-
<span class="plus">+</span>
|
|
981
|
-
<div class="chip">
|
|
982
|
-
<span class="t">事件日志</span>
|
|
983
|
-
<span class="v">*.jsonl</span>
|
|
984
|
-
</div>
|
|
985
|
-
<span class="eq">⇒</span>
|
|
986
|
-
<div class="chip result">
|
|
987
|
-
<span class="t">飞轮</span>
|
|
988
|
-
<span class="v">Self-Growing Skill</span>
|
|
989
|
-
</div>
|
|
990
|
-
</div>
|
|
991
|
-
</section>
|
|
992
|
-
|
|
993
|
-
<!-- APPLICATIONS -->
|
|
994
|
-
<section class="applications">
|
|
995
|
-
<div>
|
|
996
|
-
<h4>这套飞轮可以装下<br/>任何"经验积累型"工作流。</h4>
|
|
997
|
-
<p class="lede">只要工作能被拆成 <b>分析 → 执行 → 反馈</b> 三段,就能套这套结构。<b>换掉 domain.md,引擎不变。</b></p>
|
|
998
|
-
</div>
|
|
999
|
-
<div class="apps-grid">
|
|
1000
|
-
<div class="app">
|
|
1001
|
-
<div class="ico">CASE · 01</div>
|
|
1002
|
-
<div class="nm">需求挖掘</div>
|
|
1003
|
-
<div class="ex">五维扫描 → PRD<br/>编码反馈 → 表达规律</div>
|
|
1004
|
-
</div>
|
|
1005
|
-
<div class="app">
|
|
1006
|
-
<div class="ico">CASE · 02</div>
|
|
1007
|
-
<div class="nm">代码评审</div>
|
|
1008
|
-
<div class="ex">checklist → diff<br/>修复结果 → 规则进化</div>
|
|
1009
|
-
</div>
|
|
1010
|
-
<div class="app">
|
|
1011
|
-
<div class="ico">CASE · 03</div>
|
|
1012
|
-
<div class="nm">事故复盘</div>
|
|
1013
|
-
<div class="ex">timeline → 验证<br/>真因 → runbook 沉淀</div>
|
|
1014
|
-
</div>
|
|
1015
|
-
<div class="app">
|
|
1016
|
-
<div class="ico">CASE · 04</div>
|
|
1017
|
-
<div class="nm">技术调研</div>
|
|
1018
|
-
<div class="ex">问题树 → PoC<br/>结论 → 选型矩阵</div>
|
|
1019
|
-
</div>
|
|
1020
|
-
<div class="app">
|
|
1021
|
-
<div class="ico">CASE · 05</div>
|
|
1022
|
-
<div class="nm">客户访谈</div>
|
|
1023
|
-
<div class="ex">提纲 → 访谈<br/>洞察 → 画像更新</div>
|
|
1024
|
-
</div>
|
|
1025
|
-
<div class="app">
|
|
1026
|
-
<div class="ico">CASE · 06</div>
|
|
1027
|
-
<div class="nm">教学辅导</div>
|
|
1028
|
-
<div class="ex">诊断 → 练习<br/>错题 → 知识图谱</div>
|
|
1029
|
-
</div>
|
|
1030
|
-
<div class="app">
|
|
1031
|
-
<div class="ico">CASE · 07</div>
|
|
1032
|
-
<div class="nm">学术写作</div>
|
|
1033
|
-
<div class="ex">提纲 → 草稿<br/>评审 → 风格规约</div>
|
|
1034
|
-
</div>
|
|
1035
|
-
<div class="app">
|
|
1036
|
-
<div class="ico">CASE · 08</div>
|
|
1037
|
-
<div class="nm">个人成长</div>
|
|
1038
|
-
<div class="ex">周计划 → 复盘<br/>偏差 → 习惯模式</div>
|
|
1039
|
-
</div>
|
|
1040
|
-
</div>
|
|
1041
|
-
</section>
|
|
1042
|
-
|
|
1043
|
-
<!-- FOOTER -->
|
|
1044
|
-
<footer class="footer">
|
|
1045
|
-
<div class="lede">
|
|
1046
|
-
<span class="small">Closing · 结语</span>
|
|
1047
|
-
引擎可以替换,协议自己进化。<br/>
|
|
1048
|
-
你拥有的不是一个 Agent — 而是一台<em>会越用越聪明的工具机</em>。
|
|
1049
|
-
</div>
|
|
1050
|
-
<div class="stamp">
|
|
1051
|
-
<span class="big">FLYWHEEL</span>
|
|
1052
|
-
OPEN SOURCE · MIT<br/>
|
|
1053
|
-
github.com / renmengkai / Flywheel<br/>
|
|
1054
|
-
curl -sSL https://raw.githubusercontent.com/renmengkai/flywheel/main/install.sh | bash
|
|
1055
|
-
</div>
|
|
1056
|
-
</footer>
|
|
1057
|
-
</div>
|
|
1058
|
-
</body>
|
|
1059
|
-
</html>
|