@geminilight/mindos 0.5.7 → 0.5.8

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.
Files changed (38) hide show
  1. package/README.md +10 -8
  2. package/README_zh.md +7 -5
  3. package/app/app/api/mcp/install-skill/route.ts +1 -1
  4. package/app/lib/mcp-agents.ts +0 -10
  5. package/bin/lib/build.js +25 -0
  6. package/package.json +11 -1
  7. package/skills/project-wiki/SKILL.md +223 -0
  8. package/skills/project-wiki/assets/api-reference.tmpl.md +49 -0
  9. package/skills/project-wiki/assets/backlog.tmpl.md +15 -0
  10. package/skills/project-wiki/assets/changelog.tmpl.md +16 -0
  11. package/skills/project-wiki/assets/conventions.tmpl.md +29 -0
  12. package/skills/project-wiki/assets/design-exploration.tmpl.md +26 -0
  13. package/skills/project-wiki/assets/design-principle.tmpl.md +48 -0
  14. package/skills/project-wiki/assets/development-guide.tmpl.md +38 -0
  15. package/skills/project-wiki/assets/glossary.tmpl.md +9 -0
  16. package/skills/project-wiki/assets/known-pitfalls.tmpl.md +21 -0
  17. package/skills/project-wiki/assets/postmortem.tmpl.md +38 -0
  18. package/skills/project-wiki/assets/product-proposal.tmpl.md +41 -0
  19. package/skills/project-wiki/assets/project-roadmap.tmpl.md +23 -0
  20. package/skills/project-wiki/assets/stage-x.tmpl.md +78 -0
  21. package/skills/project-wiki/assets/system-architecture.tmpl.md +62 -0
  22. package/skills/project-wiki/references/file-reference.md +254 -0
  23. package/skills/project-wiki/references/writing-guide.md +28 -0
  24. package/app/data/pages/home-dark.png +0 -0
  25. package/app/data/pages/home-mobile-crop.png +0 -0
  26. package/app/data/pages/home-mobile.png +0 -0
  27. package/app/data/pages/home.png +0 -0
  28. package/app/data/pages/view-dir.png +0 -0
  29. package/app/data/pages/view-file-bot.png +0 -0
  30. package/app/data/pages/view-file-dark-crop.png +0 -0
  31. package/app/data/pages/view-file-dark.png +0 -0
  32. package/app/data/pages/view-file-mobile.png +0 -0
  33. package/app/data/pages/view-file-sm.png +0 -0
  34. package/app/data/pages/view-file-top.png +0 -0
  35. package/app/data/pages/view-file.png +0 -0
  36. package/app/eslint.config.mjs +0 -18
  37. package/app/vitest.config.ts +0 -14
  38. package/assets/demo-flow-zh.html +0 -622
@@ -1,622 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="zh-CN">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>MindOS Demo Flow</title>
7
- <style>
8
- @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&family=Lora:wght@400;500;600;700&display=swap');
9
-
10
- * { margin: 0; padding: 0; box-sizing: border-box; }
11
-
12
- :root {
13
- --bg: #0a0906;
14
- --fg: #e8e4dc;
15
- --accent: #d4954a;
16
- --accent-glow: rgba(212, 149, 74, 0.35);
17
- --accent-dim: rgba(212, 149, 74, 0.10);
18
- --muted: #1c1a17;
19
- --muted-fg: #8a8275;
20
- --border: rgba(232, 228, 220, 0.08);
21
- --success: #7aad80;
22
- --info: #7a9ec4;
23
- }
24
-
25
- body.light {
26
- --bg: #fdfbf7;
27
- --fg: #1c1a17;
28
- --accent: #c8873a;
29
- --accent-glow: rgba(200, 135, 58, 0.25);
30
- --accent-dim: rgba(200, 135, 58, 0.08);
31
- --muted: #f2efe9;
32
- --muted-fg: #7a7568;
33
- --border: rgba(28, 26, 23, 0.1);
34
- --success: #5a9460;
35
- --info: #5a82a8;
36
- }
37
-
38
- body {
39
- font-family: 'Inter', 'Noto Sans SC', -apple-system, BlinkMacSystemFont, sans-serif;
40
- background: var(--bg);
41
- color: var(--fg);
42
- display: flex;
43
- align-items: center;
44
- justify-content: center;
45
- min-height: 100vh;
46
- padding: 40px;
47
- line-height: 1.6;
48
- }
49
-
50
- .canvas {
51
- width: 1520px;
52
- background: var(--bg);
53
- border-radius: 20px;
54
- padding: 44px 44px 56px;
55
- position: relative;
56
- overflow: visible;
57
- border: 1px solid var(--border);
58
- }
59
- .canvas::before {
60
- content: '';
61
- position: absolute;
62
- top: -250px; left: 50%;
63
- transform: translateX(-50%);
64
- width: 800px; height: 500px;
65
- background: radial-gradient(ellipse, var(--accent-dim) 0%, transparent 70%);
66
- pointer-events: none;
67
- }
68
-
69
- /* Header */
70
- .header { text-align: center; margin-bottom: 40px; }
71
- .header h1 {
72
- font-family: 'Lora', Georgia, serif;
73
- font-size: 26px; font-weight: 500; color: var(--fg);
74
- margin-bottom: 6px; letter-spacing: -0.01em;
75
- }
76
- .header p {
77
- font-family: 'JetBrains Mono', monospace;
78
- font-size: 13px; color: var(--muted-fg); letter-spacing: 0.05em;
79
- }
80
-
81
- /* Three columns with wide gaps for arrow labels */
82
- .flow {
83
- display: grid;
84
- grid-template-columns: 300px 1fr 430px 1fr 370px;
85
- align-items: start;
86
- position: relative;
87
- }
88
- /* Gap columns (for arrows) */
89
- .arrow-gap {
90
- display: flex;
91
- align-items: center;
92
- justify-content: center;
93
- align-self: center;
94
- min-height: 40px;
95
- }
96
-
97
- .column-label {
98
- display: flex; align-items: center; gap: 8px;
99
- margin-bottom: 14px; padding: 0 4px;
100
- }
101
- .column-label .step {
102
- width: 24px; height: 24px; border-radius: 50%;
103
- display: flex; align-items: center; justify-content: center;
104
- font-size: 12px; font-weight: 700; color: var(--bg);
105
- font-family: 'JetBrains Mono', monospace;
106
- }
107
- .column-label .text {
108
- font-size: 14px; font-weight: 600; color: var(--fg); opacity: 0.85;
109
- }
110
- .column-label .subtext {
111
- font-family: 'JetBrains Mono', monospace;
112
- font-size: 11px; color: var(--muted-fg); margin-left: auto;
113
- }
114
-
115
- /* Step colors */
116
- .step-1 .step { background: var(--accent); }
117
- .step-2 .step { background: var(--success); }
118
- .step-3 .step { background: var(--info); }
119
-
120
- /* ============ LEFT: Mobile ============ */
121
- .mobile-frame {
122
- background: var(--muted); border-radius: 28px;
123
- border: 1.5px solid rgba(232,228,220,0.06);
124
- overflow: hidden; box-shadow: 0 24px 48px rgba(0,0,0,0.4);
125
- }
126
- .mobile-status-bar {
127
- display: flex; justify-content: space-between; align-items: center;
128
- padding: 8px 20px; font-size: 11px;
129
- font-family: 'JetBrains Mono', monospace;
130
- color: var(--muted-fg); background: var(--bg);
131
- }
132
- .mobile-nav {
133
- display: flex; align-items: center; padding: 10px 16px;
134
- background: var(--bg); border-bottom: 1px solid var(--border);
135
- }
136
- .mobile-nav .back { color: var(--accent); font-size: 18px; margin-right: 10px; }
137
- .mobile-nav .title { font-size: 14px; font-weight: 600; color: var(--fg); }
138
- .mobile-body { padding: 12px; min-height: 260px; background: var(--muted); }
139
- .mobile-note {
140
- background: var(--bg); border-radius: 10px; padding: 11px;
141
- margin-bottom: 8px; border-left: 3px solid var(--accent);
142
- }
143
- .mobile-note .note-time {
144
- font-size: 10px; font-family: 'JetBrains Mono', monospace;
145
- color: var(--muted-fg); margin-bottom: 4px;
146
- }
147
- .mobile-note .note-text { font-size: 12px; color: var(--fg); line-height: 1.5; opacity: 0.9; }
148
- .mobile-note .note-tag {
149
- display: inline-block; margin-top: 5px; padding: 2px 7px;
150
- border-radius: 4px; font-size: 10px;
151
- font-family: 'JetBrains Mono', monospace;
152
- background: var(--accent-dim); color: var(--accent);
153
- }
154
- .mobile-input {
155
- display: flex; align-items: center; gap: 8px; padding: 10px 12px;
156
- background: var(--bg); border-top: 1px solid var(--border);
157
- }
158
- .mobile-input input {
159
- flex: 1; background: var(--muted); border: 1px solid var(--border);
160
- border-radius: 18px; padding: 6px 12px; font-size: 11px;
161
- font-family: 'Inter', sans-serif; color: var(--fg); outline: none;
162
- }
163
- .mobile-input .send-btn {
164
- width: 28px; height: 28px; border-radius: 50%; background: var(--accent);
165
- display: flex; align-items: center; justify-content: center;
166
- font-size: 12px; color: var(--bg); font-weight: 700;
167
- }
168
-
169
- /* ============ MIDDLE: Desktop GUI ============ */
170
- .desktop-frame {
171
- background: var(--muted); border-radius: 12px;
172
- border: 1px solid var(--border); overflow: hidden;
173
- box-shadow: 0 24px 48px rgba(0,0,0,0.4);
174
- }
175
- .desktop-titlebar {
176
- display: flex; align-items: center; padding: 9px 14px;
177
- background: var(--bg); border-bottom: 1px solid var(--border); gap: 7px;
178
- }
179
- .dot { width: 10px; height: 10px; border-radius: 50%; }
180
- .dot-r { background: #e06c6c; }
181
- .dot-y { background: var(--accent); }
182
- .dot-g { background: var(--success); }
183
- .desktop-titlebar .title {
184
- margin-left: 8px; font-size: 11px;
185
- font-family: 'JetBrains Mono', monospace; color: var(--muted-fg);
186
- }
187
- .desktop-layout { display: flex; min-height: 360px; }
188
- .sidebar {
189
- width: 140px; background: var(--bg); opacity: 0.85;
190
- border-right: 1px solid var(--border); padding: 10px 0;
191
- }
192
- .sidebar-item {
193
- display: flex; align-items: center; gap: 7px; padding: 6px 12px;
194
- font-size: 11.5px; color: var(--muted-fg); cursor: default;
195
- }
196
- .sidebar-item.active {
197
- background: var(--accent-dim); color: var(--accent);
198
- border-right: 2px solid var(--accent);
199
- }
200
- .sidebar-item .icon {
201
- width: 15px; height: 15px;
202
- display: inline-flex; align-items: center; justify-content: center;
203
- font-size: 9px; font-family: 'JetBrains Mono', monospace;
204
- border-radius: 3px; background: rgba(232,228,220,0.04);
205
- color: var(--muted-fg); font-weight: 600;
206
- }
207
- .sidebar-item.active .icon { background: rgba(212,149,74,0.15); color: var(--accent); }
208
- .main-content { flex: 1; padding: 14px 18px; overflow: hidden; }
209
- .file-path {
210
- font-size: 10px; color: var(--muted-fg); margin-bottom: 8px;
211
- font-family: 'JetBrains Mono', monospace;
212
- }
213
- .content-title {
214
- font-family: 'Lora', Georgia, serif; font-size: 16px; font-weight: 500;
215
- color: var(--fg); margin-bottom: 10px;
216
- }
217
- .content-section { margin-bottom: 12px; }
218
- .content-section h3 {
219
- font-size: 11.5px; font-weight: 600; color: var(--accent);
220
- margin-bottom: 4px; letter-spacing: 0.02em;
221
- }
222
- .content-section li { font-size: 11.5px; color: var(--fg); opacity: 0.8; line-height: 1.6; }
223
- .content-section ul { list-style: none; padding: 0; }
224
- .content-section li::before { content: '\2022'; color: var(--accent); margin-right: 6px; opacity: 0.5; }
225
- .badge-row { display: flex; gap: 5px; flex-wrap: wrap; margin-top: 4px; }
226
- .badge {
227
- padding: 2px 7px; border-radius: 4px; font-size: 10px;
228
- font-family: 'JetBrains Mono', monospace;
229
- background: rgba(232,228,220,0.04); color: var(--muted-fg); border: 1px solid var(--border);
230
- }
231
- .updated-tag {
232
- display: inline-flex; align-items: center; gap: 4px;
233
- padding: 3px 9px; border-radius: 6px; font-size: 10px;
234
- font-family: 'JetBrains Mono', monospace;
235
- background: var(--accent-dim); color: var(--accent);
236
- border: 1px solid rgba(212,149,74,0.15); margin-bottom: 10px;
237
- }
238
-
239
- /* ============ RIGHT: Agent Group ============ */
240
- .agent-group {
241
- border: 1.5px solid rgba(122,158,196,0.2);
242
- border-radius: 14px; padding: 14px 12px 12px;
243
- background: rgba(122,158,196,0.03); position: relative;
244
- }
245
- .agent-group-label {
246
- position: absolute; top: -10px; left: 14px;
247
- padding: 1px 10px; font-size: 10px;
248
- font-family: 'JetBrains Mono', monospace;
249
- color: var(--info); background: var(--bg); border-radius: 4px;
250
- letter-spacing: 0.04em;
251
- }
252
- .agent-stack { display: flex; flex-direction: column; gap: 8px; }
253
-
254
- /* CLI terminal card */
255
- .cli-frame {
256
- background: var(--bg); border-radius: 9px;
257
- border: 1px solid var(--border); overflow: hidden;
258
- box-shadow: 0 8px 20px rgba(0,0,0,0.25);
259
- }
260
- .cli-titlebar {
261
- display: flex; align-items: center; padding: 6px 10px;
262
- background: var(--muted); border-bottom: 1px solid var(--border); gap: 5px;
263
- }
264
- .cli-titlebar .dots { display: flex; gap: 4px; }
265
- .cli-titlebar .dots span { width: 7px; height: 7px; border-radius: 50%; }
266
- .dot-r-sm { background: #e06c6c; }
267
- .dot-y-sm { background: var(--accent); }
268
- .dot-g-sm { background: var(--success); }
269
- .cli-titlebar .name {
270
- margin-left: 5px; font-size: 10.5px;
271
- font-family: 'JetBrains Mono', monospace; color: var(--muted-fg);
272
- }
273
- .cli-body {
274
- padding: 8px 12px; font-family: 'JetBrains Mono', monospace;
275
- font-size: 10.5px; line-height: 1.6;
276
- }
277
- .cli-line { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
278
- .cli-prompt { color: var(--accent); opacity: 0.8; }
279
- .cli-cmd { color: var(--fg); opacity: 0.9; }
280
- .cli-output { color: var(--muted-fg); }
281
- .cli-highlight { color: var(--accent); }
282
- .cli-reading { color: var(--info); }
283
-
284
- /* Telegram-style chat card for OpenClaw */
285
- .tg-frame {
286
- background: var(--bg); border-radius: 9px;
287
- border: 1px solid var(--accent-glow); overflow: hidden;
288
- box-shadow: 0 8px 20px rgba(0,0,0,0.25);
289
- }
290
- .tg-header {
291
- display: flex; align-items: center; gap: 8px;
292
- padding: 7px 12px; background: var(--accent-dim);
293
- border-bottom: 1px solid rgba(212,149,74,0.12);
294
- }
295
- .tg-avatar {
296
- width: 22px; height: 22px; border-radius: 50%;
297
- background: var(--accent); display: flex; align-items: center;
298
- justify-content: center; font-size: 10px; font-weight: 700; color: var(--bg);
299
- }
300
- .tg-name {
301
- font-size: 11px; font-weight: 600; color: var(--accent);
302
- font-family: 'Inter', sans-serif;
303
- }
304
- .tg-badge {
305
- margin-left: auto; font-size: 9px; padding: 1px 6px;
306
- border-radius: 3px; background: var(--accent); color: var(--bg);
307
- font-family: 'JetBrains Mono', monospace; font-weight: 600;
308
- }
309
- .tg-body { padding: 8px 12px; }
310
- .tg-bubble {
311
- padding: 7px 10px; border-radius: 8px 8px 8px 2px;
312
- font-size: 11px; line-height: 1.5; margin-bottom: 5px;
313
- }
314
- .tg-bubble.user {
315
- background: var(--accent-dim); color: var(--fg);
316
- border-radius: 8px 8px 2px 8px; margin-left: 30px;
317
- }
318
- .tg-bubble.bot {
319
- background: var(--muted); color: var(--fg); margin-right: 30px;
320
- }
321
- .tg-bubble .tg-hl { color: var(--accent); }
322
-
323
- /* SVG overlay */
324
- .arrows-svg {
325
- position: absolute; top: 0; left: 0; width: 100%; height: 100%;
326
- pointer-events: none; z-index: 50;
327
- }
328
-
329
- /* Bottom tagline */
330
- .tagline {
331
- text-align: center; margin-top: 44px; padding-top: 18px;
332
- border-top: 1px solid var(--border);
333
- }
334
- .tagline p {
335
- font-size: 13px; color: var(--muted-fg);
336
- }
337
- .tagline span { color: var(--accent); font-weight: 600; }
338
-
339
- /* CTA card */
340
- .cta-card {
341
- margin: 20px auto 0; max-width: 680px; text-align: center;
342
- background: var(--accent-dim); border: 1px solid rgba(212,149,74,0.15);
343
- border-radius: 12px; padding: 16px 24px;
344
- }
345
- .cta-label {
346
- font-size: 13px; font-weight: 600; color: var(--accent);
347
- margin-bottom: 8px; letter-spacing: 0.02em;
348
- }
349
- .cta-code {
350
- background: var(--bg); border: 1px solid var(--border);
351
- border-radius: 8px; padding: 9px 14px;
352
- font-family: 'JetBrains Mono', monospace; font-size: 11.5px;
353
- color: var(--fg); opacity: 0.85; line-height: 1.5;
354
- text-align: left;
355
- }
356
- </style>
357
- </head>
358
- <body>
359
- <div class="canvas" id="canvas">
360
- <div class="header">
361
- <h1>MindOS:想法、执行到复盘,一条线贯穿</h1>
362
- <p>记一句想法,剩下的全自动</p>
363
- </div>
364
-
365
- <div class="flow" id="flow">
366
- <!-- COL 1: Mobile -->
367
- <div id="col-left">
368
- <div class="column-label step-1">
369
- <div class="step">1</div>
370
- <div class="text">随时记录想法</div>
371
- <div class="subtext">手机 / 任意设备</div>
372
- </div>
373
- <div class="mobile-frame" id="mobile-frame">
374
- <div class="mobile-status-bar"><span>9:41</span><span>MindOS</span><span>Wi-Fi</span></div>
375
- <div class="mobile-nav"><span class="back">&lsaquo;</span><span class="title">Quick Capture</span></div>
376
- <div class="mobile-body">
377
- <div class="mobile-note">
378
- <div class="note-time">今天 11:30</div>
379
- <div class="note-text">想好了新项目:先理清思路,<br/>代码开搞,顺便发个帖宣传下</div>
380
- <div class="note-tag">#想法</div>
381
- </div>
382
- <div class="mobile-note" style="border-left-color: var(--muted-fg);">
383
- <div class="note-time">昨天 16:00</div>
384
- <div class="note-text">之前调研过竞品,用 React + Tailwind 方案</div>
385
- <div class="note-tag" style="background:rgba(138,130,117,0.1);color:var(--muted-fg);">#技术选型</div>
386
- </div>
387
- </div>
388
- <div class="mobile-input">
389
- <input type="text" value="记一下新项目的想法..." readonly />
390
- <div class="send-btn">&uarr;</div>
391
- </div>
392
- </div>
393
- </div>
394
-
395
- <!-- GAP 1: arrow placeholder -->
396
- <div class="arrow-gap" id="gap1"></div>
397
-
398
- <!-- COL 2: Desktop GUI -->
399
- <div id="col-mid">
400
- <div class="column-label step-2">
401
- <div class="step">2</div>
402
- <div class="text">Agent 自动整理</div>
403
- <div class="subtext">MindOS GUI</div>
404
- </div>
405
- <div class="desktop-frame" id="desktop-frame">
406
- <div class="desktop-titlebar">
407
- <div class="dot dot-r"></div><div class="dot dot-y"></div><div class="dot dot-g"></div>
408
- <span class="title">MindOS &mdash; localhost:3000</span>
409
- </div>
410
- <div class="desktop-layout">
411
- <div class="sidebar">
412
- <div class="sidebar-item"><span class="icon">P</span> Profile</div>
413
- <div class="sidebar-item"><span class="icon">W</span> Workflows</div>
414
- <div class="sidebar-item active"><span class="icon">J</span> Projects</div>
415
- <div class="sidebar-item"><span class="icon">C</span> Configs</div>
416
- <div class="sidebar-item"><span class="icon">R</span> Resources</div>
417
- <div class="sidebar-item"><span class="icon">G</span> Graph</div>
418
- </div>
419
- <div class="main-content">
420
- <div class="file-path">Projects/新项目计划.md</div>
421
- <div class="updated-tag">* Agent 已自动更新 3 个文件</div>
422
- <div class="content-title">新项目计划</div>
423
- <div class="content-section">
424
- <h3>核心思路</h3>
425
- <ul>
426
- <li>先理清项目方案和架构</li>
427
- <li>搭建代码骨架,快速出原型</li>
428
- <li>发帖宣传,收集早期反馈</li>
429
- </ul>
430
- </div>
431
- <div class="content-section">
432
- <h3>关联更新</h3>
433
- <div class="badge-row">
434
- <span class="badge">Projects/Project-Plan.md</span>
435
- <span class="badge">Workflows/Launch-SOP.md</span>
436
- <span class="badge">TODO.md</span>
437
- </div>
438
- </div>
439
- </div>
440
- </div>
441
- </div>
442
- </div>
443
-
444
- <!-- GAP 2: arrow placeholder -->
445
- <div class="arrow-gap" id="gap2"></div>
446
-
447
- <!-- COL 3: Agent Group -->
448
- <div id="col-right">
449
- <div class="column-label step-3">
450
- <div class="step">3</div>
451
- <div class="text">所有 Agent 同步执行</div>
452
- <div class="subtext">via MCP &amp; Skills</div>
453
- </div>
454
- <div class="agent-group" id="agent-group">
455
- <div class="agent-group-label">ALL AGENTS via MCP</div>
456
- <div class="agent-stack">
457
- <!-- Claude Code -->
458
- <div class="cli-frame">
459
- <div class="cli-titlebar">
460
- <div class="dots"><span class="dot-r-sm"></span><span class="dot-y-sm"></span><span class="dot-g-sm"></span></div>
461
- <span class="name">Gemini</span>
462
- </div>
463
- <div class="cli-body">
464
- <div class="cli-line"><span class="cli-prompt">&gt; </span><span class="cli-cmd">梳理项目方案和架构</span></div>
465
- <div class="cli-line"><span class="cli-reading"> Reading MindOS &rarr; Project-Plan.md</span></div>
466
- <div class="cli-line"><span class="cli-output"> Done. 已整理项目方案 + 技术架构文档</span></div>
467
- </div>
468
- </div>
469
- <!-- Cursor -->
470
- <div class="cli-frame">
471
- <div class="cli-titlebar">
472
- <div class="dots"><span class="dot-r-sm"></span><span class="dot-y-sm"></span><span class="dot-g-sm"></span></div>
473
- <span class="name">Cursor</span>
474
- </div>
475
- <div class="cli-body">
476
- <div class="cli-line"><span class="cli-prompt">&gt; </span><span class="cli-cmd">搭建项目骨架</span></div>
477
- <div class="cli-line"><span class="cli-reading"> Reading MindOS &rarr; Project-Plan.md</span></div>
478
- <div class="cli-line"><span class="cli-output"> Done. 已初始化项目结构 + 基础配置</span></div>
479
- </div>
480
- </div>
481
- <!-- OpenClaw (Telegram style) -->
482
- <div class="tg-frame" id="cli-feedback">
483
- <div class="tg-header">
484
- <div class="tg-avatar">O</div>
485
- <span class="tg-name">OpenClaw</span>
486
- <span class="tg-badge">BOT</span>
487
- </div>
488
- <div class="tg-body">
489
- <div class="tg-bubble user">发帖宣传项目,收集大家反馈</div>
490
- <div class="tg-bubble bot"><span class="tg-hl">Writing &rarr; Workflows/Launch-SOP.md</span><br/>Done. 已发布宣传帖 + 汇总反馈沉淀到 SOP</div>
491
- </div>
492
- </div>
493
- </div>
494
- </div>
495
- </div>
496
- </div>
497
-
498
- <svg class="arrows-svg" id="arrows-svg" xmlns="http://www.w3.org/2000/svg"></svg>
499
-
500
- <div class="tagline">
501
- <p>一句想法 &rarr; <span>MindOS</span> 归档 + 关联 &rarr; 所有 Agent 各就各位 &rarr; <span>经验自动沉淀</span></p>
502
- </div>
503
-
504
- <div class="cta-card">
505
- <div class="cta-label">&#9889; 立即体验 &mdash; 把这句话发给你的 Agent</div>
506
- <div class="cta-code">帮我从 https://github.com/GeminiLight/MindOS 安装 MindOS,包含 MCP 和 Skills,使用中文模板。</div>
507
- </div>
508
- </div>
509
-
510
- <script>
511
- function drawArrows() {
512
- const canvas = document.getElementById('canvas');
513
- const svg = document.getElementById('arrows-svg');
514
- const cr = canvas.getBoundingClientRect();
515
-
516
- function rel(el) {
517
- const r = el.getBoundingClientRect();
518
- return {
519
- left: r.left - cr.left, right: r.right - cr.left,
520
- top: r.top - cr.top, bottom: r.bottom - cr.top,
521
- cx: (r.left + r.right) / 2 - cr.left,
522
- cy: (r.top + r.bottom) / 2 - cr.top,
523
- };
524
- }
525
-
526
- const mobile = rel(document.getElementById('mobile-frame'));
527
- const desktop = rel(document.getElementById('desktop-frame'));
528
- const group = rel(document.getElementById('agent-group'));
529
- const feedback = rel(document.getElementById('cli-feedback'));
530
- const gap1 = rel(document.getElementById('gap1'));
531
- const gap2 = rel(document.getElementById('gap2'));
532
-
533
- svg.setAttribute('width', cr.width);
534
- svg.setAttribute('height', cr.height);
535
- svg.setAttribute('viewBox', `0 0 ${cr.width} ${cr.height}`);
536
-
537
- const cs = getComputedStyle(document.body);
538
- const accent = cs.getPropertyValue('--accent').trim();
539
- const info = cs.getPropertyValue('--info').trim();
540
-
541
- // Arrow 1: Mobile -> Desktop (想法同步)
542
- const a1y = mobile.cy;
543
- const a1x1 = mobile.right + 2;
544
- const a1x2 = desktop.left - 2;
545
- const a1mx = gap1.cx;
546
-
547
- // Arrow 2: Desktop -> Agent Group (MCP 读取)
548
- const a2y = group.cy;
549
- const a2x1 = desktop.right + 2;
550
- const a2x2 = group.left - 2;
551
- const a2mx = gap2.cx;
552
-
553
- // Arrow 3: Feedback -> Desktop bottom (经验回流)
554
- // Start: bottom center of OpenClaw
555
- const a3sx = feedback.cx;
556
- const a3sy = feedback.bottom + 2;
557
- // End: bottom center of Desktop GUI
558
- const a3ex = desktop.cx;
559
- const a3ey = desktop.bottom + 2;
560
- // Horizontal line runs below both panels
561
- const a3by = Math.max(feedback.bottom, desktop.bottom) + 36;
562
- const r = 10; // corner radius
563
- // Label position: closer to the right (OpenClaw) side
564
- const a3labelX = a3sx - (a3sx - a3ex) * 0.25;
565
-
566
- svg.innerHTML = `
567
- <defs>
568
- <marker id="ah-a" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
569
- <path d="M0,0.5 L7,3 L0,5.5" fill="none" stroke="${accent}" stroke-width="1.2"/>
570
- </marker>
571
- <marker id="ah-i" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
572
- <path d="M0,0.5 L7,3 L0,5.5" fill="none" stroke="${info}" stroke-width="1.2"/>
573
- </marker>
574
- </defs>
575
-
576
- <!-- Arrow 1: 想法同步 -->
577
- <line x1="${a1x1}" y1="${a1y}" x2="${a1mx - 36}" y2="${a1y}"
578
- stroke="${accent}" stroke-width="1.5" stroke-dasharray="5,4" opacity="0.55"/>
579
- <line x1="${a1mx + 36}" y1="${a1y}" x2="${a1x2}" y2="${a1y}"
580
- stroke="${accent}" stroke-width="1.5" stroke-dasharray="5,4" opacity="0.55"
581
- marker-end="url(#ah-a)"/>
582
- <rect x="${a1mx - 32}" y="${a1y - 11}" width="64" height="20" rx="10"
583
- fill="var(--bg)" stroke="${accent}" stroke-width="0.7" opacity="0.85"/>
584
- <text x="${a1mx}" y="${a1y + 3}" text-anchor="middle" fill="${accent}"
585
- font-size="10.5" font-weight="500" font-family="'Inter',sans-serif">想法同步</text>
586
-
587
- <!-- Arrow 2: MCP 读取 -->
588
- <line x1="${a2x1}" y1="${a2y}" x2="${a2mx - 38}" y2="${a2y}"
589
- stroke="${info}" stroke-width="1.5" stroke-dasharray="5,4" opacity="0.55"/>
590
- <line x1="${a2mx + 38}" y1="${a2y}" x2="${a2x2}" y2="${a2y}"
591
- stroke="${info}" stroke-width="1.5" stroke-dasharray="5,4" opacity="0.55"
592
- marker-end="url(#ah-i)"/>
593
- <rect x="${a2mx - 34}" y="${a2y - 11}" width="68" height="20" rx="10"
594
- fill="var(--bg)" stroke="${info}" stroke-width="0.7" opacity="0.85"/>
595
- <text x="${a2mx}" y="${a2y + 3}" text-anchor="middle" fill="${info}"
596
- font-size="10.5" font-weight="500" font-family="'Inter',sans-serif">MCP 读取</text>
597
-
598
- <!-- Arrow 3: 经验回流 (U-shape, split into segments with label gap) -->
599
- <!-- Right vertical: OpenClaw bottom -> corner -> toward label -->
600
- <path d="M ${a3sx} ${a3sy}
601
- L ${a3sx} ${a3by - r}
602
- Q ${a3sx} ${a3by} ${a3sx - r} ${a3by}
603
- L ${a3labelX + 36} ${a3by}"
604
- fill="none" stroke="${accent}" stroke-width="1.5" stroke-dasharray="5,4" opacity="0.55"/>
605
- <!-- Left vertical: label -> corner -> up to Desktop bottom -->
606
- <path d="M ${a3labelX - 36} ${a3by}
607
- L ${a3ex + r} ${a3by}
608
- Q ${a3ex} ${a3by} ${a3ex} ${a3by - r}
609
- L ${a3ex} ${a3ey}"
610
- fill="none" stroke="${accent}" stroke-width="1.5" stroke-dasharray="5,4" opacity="0.55"
611
- marker-end="url(#ah-a)"/>
612
- <rect x="${a3labelX - 32}" y="${a3by - 11}" width="64" height="20" rx="10"
613
- fill="var(--bg)" stroke="${accent}" stroke-width="0.7" opacity="0.85"/>
614
- <text x="${a3labelX}" y="${a3by + 3}" text-anchor="middle" fill="${accent}"
615
- font-size="10.5" font-weight="500" font-family="'Inter',sans-serif">经验回流</text>
616
- `;
617
- }
618
-
619
- window.addEventListener('load', () => setTimeout(drawArrows, 500));
620
- </script>
621
- </body>
622
- </html>