-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathopencode-analysis.html
More file actions
1013 lines (979 loc) · 47.4 KB
/
Copy pathopencode-analysis.html
File metadata and controls
1013 lines (979 loc) · 47.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>OpenCode — 深度架构分析报告</title>
<style>
:root {
--bg: #0a0a0f;
--bg-card: #12121a;
--bg-elevated: #1a1a25;
--border: #2a2a3a;
--border-light: #353548;
--text: #e0e0ec;
--text-dim: #8888a0;
--text-muted: #555568;
--accent: #6366f1;
--accent-glow: rgba(99,102,241,0.15);
--green: #10b981;
--red: #ef4444;
--amber: #f59e0b;
--blue: #3b82f6;
--cyan: #06b6d4;
--purple: #a855f7;
--pink: #ec4899;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: var(--bg);
color: var(--text);
font-family: -apple-system, 'SF Pro Text', 'Segoe UI', system-ui, sans-serif;
line-height: 1.6;
overflow-x: hidden;
}
.container { max-width: 1200px; margin: 0 auto; padding: 0 24px; }
/* Hero */
.hero {
padding: 80px 0 60px;
text-align: center;
background: radial-gradient(ellipse at 50% 0%, rgba(99,102,241,0.12) 0%, transparent 60%),
radial-gradient(ellipse at 30% 30%, rgba(168,85,247,0.08) 0%, transparent 50%);
border-bottom: 1px solid var(--border);
}
.hero-badge {
display: inline-block;
padding: 4px 14px;
border-radius: 100px;
background: var(--accent-glow);
border: 1px solid rgba(99,102,241,0.3);
color: var(--accent);
font-size: 12px;
font-weight: 600;
letter-spacing: 0.5px;
margin-bottom: 24px;
}
.hero h1 {
font-size: 48px;
font-weight: 800;
letter-spacing: -1px;
margin-bottom: 16px;
background: linear-gradient(135deg, #e0e0ec 0%, #6366f1 50%, #a855f7 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.hero p { color: var(--text-dim); font-size: 18px; max-width: 640px; margin: 0 auto; }
.hero-stats {
display: flex;
justify-content: center;
gap: 48px;
margin-top: 40px;
flex-wrap: wrap;
}
.hero-stat { text-align: center; }
.hero-stat-num {
font-size: 36px;
font-weight: 800;
font-variant-numeric: tabular-nums;
}
.hero-stat-label { font-size: 13px; color: var(--text-muted); margin-top: 4px; }
/* Section */
.section { padding: 56px 0; border-bottom: 1px solid var(--border); }
.section-header { margin-bottom: 32px; }
.section-tag {
font-size: 12px;
font-weight: 700;
letter-spacing: 2px;
text-transform: uppercase;
color: var(--accent);
margin-bottom: 8px;
}
.section-title { font-size: 28px; font-weight: 700; letter-spacing: -0.5px; }
.section-sub { color: var(--text-dim); font-size: 15px; margin-top: 8px; }
/* Cards */
.card {
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 12px;
padding: 24px;
transition: border-color 0.2s;
}
.card:hover { border-color: var(--border-light); }
/* Pros & Cons */
.pros-cons-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
@media (max-width: 768px) { .pros-cons-grid { grid-template-columns: 1fr; } }
.pros-card { border-color: rgba(16,185,129,0.2); }
.pros-card h3 { color: var(--green); }
.cons-card { border-color: rgba(239,68,68,0.2); }
.cons-card h3 { color: var(--red); }
.list-item {
display: flex;
gap: 12px;
padding: 12px 0;
border-bottom: 1px solid var(--border);
}
.list-item:last-child { border-bottom: none; }
.list-icon {
flex-shrink: 0;
width: 24px;
height: 24px;
border-radius: 6px;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
font-weight: 700;
}
.list-icon.pro { background: rgba(16,185,129,0.15); color: var(--green); }
.list-icon.con { background: rgba(239,68,68,0.15); color: var(--red); }
.list-content h4 { font-size: 14px; font-weight: 600; margin-bottom: 4px; }
.list-content p { font-size: 13px; color: var(--text-dim); }
/* Architecture Diagram */
.arch-layer {
display: flex;
align-items: stretch;
gap: 0;
margin-bottom: 3px;
min-height: 56px;
}
.arch-layer-label {
width: 140px;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: flex-end;
padding-right: 16px;
font-size: 12px;
font-weight: 600;
color: var(--text-dim);
text-align: right;
}
.arch-blocks { display: flex; gap: 6px; flex: 1; flex-wrap: wrap; }
.arch-block {
padding: 8px 16px;
border-radius: 8px;
font-size: 12px;
font-weight: 600;
display: flex;
align-items: center;
gap: 6px;
white-space: nowrap;
}
.arch-block.core { background: rgba(99,102,241,0.12); border: 1px solid rgba(99,102,241,0.3); color: var(--accent); }
.arch-block.ui { background: rgba(168,85,247,0.12); border: 1px solid rgba(168,85,247,0.3); color: var(--purple); }
.arch-block.infra { background: rgba(6,182,212,0.12); border: 1px solid rgba(6,182,212,0.3); color: var(--cyan); }
.arch-block.svc { background: rgba(245,158,11,0.12); border: 1px solid rgba(245,158,11,0.3); color: var(--amber); }
.arch-block.data { background: rgba(16,185,129,0.12); border: 1px solid rgba(16,185,129,0.3); color: var(--green); }
.arch-block code { font-size: 10px; opacity: 0.7; }
/* Package Table */
.pkg-table {
width: 100%;
border-collapse: collapse;
font-size: 13px;
}
.pkg-table th {
text-align: left;
padding: 10px 12px;
font-weight: 600;
color: var(--text-dim);
border-bottom: 1px solid var(--border);
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.pkg-table td {
padding: 10px 12px;
border-bottom: 1px solid var(--border);
}
.pkg-table tr:hover { background: var(--bg-elevated); }
.pkg-name { font-weight: 600; color: var(--accent); }
.pkg-num { font-variant-numeric: tabular-nums; text-align: right; }
/* Score Bars */
.score-row { margin-bottom: 20px; }
.score-header {
display: flex;
justify-content: space-between;
align-items: baseline;
margin-bottom: 6px;
}
.score-label { font-size: 13px; font-weight: 600; }
.score-value { font-size: 20px; font-weight: 800; font-variant-numeric: tabular-nums; }
.score-bar {
height: 8px;
background: var(--bg-elevated);
border-radius: 100px;
overflow: hidden;
}
.score-fill {
height: 100%;
border-radius: 100px;
transition: width 1s ease;
}
.score-fill.green { background: linear-gradient(90deg, var(--green), #34d399); }
.score-fill.amber { background: linear-gradient(90deg, var(--amber), #fbbf24); }
.score-fill.red { background: linear-gradient(90deg, var(--red), #f87171); }
.score-fill.blue { background: linear-gradient(90deg, var(--blue), #60a5fa); }
.score-fill.purple { background: linear-gradient(90deg, var(--purple), #c084fc); }
/* Metric Grid */
.metric-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
gap: 16px;
}
.metric-card {
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 10px;
padding: 20px;
text-align: center;
}
.metric-num {
font-size: 28px;
font-weight: 800;
font-variant-numeric: tabular-nums;
}
.metric-desc { font-size: 12px; color: var(--text-muted); margin-top: 4px; }
/* Comparison Table */
.cmp-table {
width: 100%;
border-collapse: collapse;
font-size: 13px;
}
.cmp-table th, .cmp-table td {
padding: 10px 14px;
border-bottom: 1px solid var(--border);
text-align: left;
}
.cmp-table th {
font-weight: 600;
color: var(--text-dim);
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.cmp-table td:first-child { font-weight: 600; }
.cmp-yes { color: var(--green); }
.cmp-no { color: var(--red); }
.cmp-partial { color: var(--amber); }
/* Feature Grid */
.feature-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 16px;
}
.feature-card {
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 10px;
padding: 20px;
}
.feature-icon {
width: 36px;
height: 36px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
margin-bottom: 12px;
}
.feature-card h4 { font-size: 14px; font-weight: 600; margin-bottom: 6px; }
.feature-card p { font-size: 13px; color: var(--text-dim); }
/* Verdict */
.verdict-box {
background: linear-gradient(135deg, rgba(99,102,241,0.08), rgba(168,85,247,0.08));
border: 1px solid rgba(99,102,241,0.2);
border-radius: 16px;
padding: 32px;
text-align: center;
}
.verdict-box h3 { font-size: 20px; font-weight: 700; margin-bottom: 12px; }
.verdict-box p { color: var(--text-dim); font-size: 15px; max-width: 700px; margin: 0 auto; }
.verdict-score {
font-size: 56px;
font-weight: 900;
margin: 16px 0;
background: linear-gradient(135deg, var(--green), var(--blue));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
/* Footer */
.footer {
padding: 32px 0;
text-align: center;
color: var(--text-muted);
font-size: 12px;
}
/* Growth Chart */
.growth-chart {
position: relative;
height: 120px;
background: var(--bg-elevated);
border-radius: 8px;
padding: 16px;
overflow: hidden;
}
.growth-bar {
position: absolute;
bottom: 0;
background: linear-gradient(180deg, var(--accent), rgba(99,102,241,0.3));
border-radius: 2px 2px 0 0;
transition: height 0.5s;
}
</style>
</head>
<body>
<!-- HERO -->
<div class="hero">
<div class="container">
<div class="hero-badge">⚡ 深度架构分析报告</div>
<h1>OpenCode</h1>
<p>开源 AI 编程 Agent — 基于 Bun + Effect + SolidJS 的 Monorepo 架构<br>从代码、架构、工程化到竞品对比的全维度剖析</p>
<div class="hero-stats">
<div class="hero-stat">
<div class="hero-stat-num" style="color:var(--blue)">666K</div>
<div class="hero-stat-label">TypeScript 总行数</div>
</div>
<div class="hero-stat">
<div class="hero-stat-num" style="color:var(--purple)">32</div>
<div class="hero-stat-label">Monorepo 子包</div>
</div>
<div class="hero-stat">
<div class="hero-stat-num" style="color:var(--green)">704</div>
<div class="hero-stat-label">测试文件数</div>
</div>
<div class="hero-stat">
<div class="hero-stat-num" style="color:var(--amber)">17</div>
<div class="hero-stat-label">依赖 Patch</div>
</div>
<div class="hero-stat">
<div class="hero-stat-num" style="color:var(--cyan)">10M+</div>
<div class="hero-stat-label">总下载量</div>
</div>
</div>
</div>
</div>
<!-- 一句话总结 -->
<div class="section">
<div class="container">
<div class="verdict-box">
<h3>核心评价</h3>
<p>OpenCode 是目前<strong>架构最先进</strong>的开源 AI 编程 Agent。它用 Effect 框架把"会话持久化 → 上下文组装 → 模型调用 → 工具执行 → 事件流投影"做成了完整的 Function Pipeline,还自己造了 <strong>opentui</strong>(终端 UI 框架)和 <strong>httpapi-codegen</strong>(SDK 代码生成器)。但先进也意味着复杂——Effect beta、17 个 patch、668 个文件的 opencode 核心包,对贡献者门槛极高。</p>
<div class="verdict-score">8.5<span style="font-size:24px;color:var(--text-dim)">/10</span></div>
</div>
</div>
</div>
<!-- 评分总览 -->
<div class="section">
<div class="container">
<div class="section-header">
<div class="section-tag">EVALUATION</div>
<div class="section-title">维度评分</div>
</div>
<div style="display:grid; grid-template-columns:1fr 1fr; gap:32px;">
<div>
<div class="score-row">
<div class="score-header"><span class="score-label">🏗️ 架构设计</span><span class="score-value" style="color:var(--green)">9.5</span></div>
<div class="score-bar"><div class="score-fill green" style="width:95%"></div></div>
</div>
<div class="score-row">
<div class="score-header"><span class="score-label">🧠 Session/Context 工程</span><span class="score-value" style="color:var(--green)">9.5</span></div>
<div class="score-bar"><div class="score-fill green" style="width:95%"></div></div>
</div>
<div class="score-row">
<div class="score-header"><span class="score-label">🔌 LLM Provider 支持</span><span class="score-value" style="color:var(--green)">9.0</span></div>
<div class="score-bar"><div class="score-fill green" style="width:90%"></div></div>
</div>
<div class="score-row">
<div class="score-header"><span class="score-label">🧪 测试覆盖</span><span class="score-value" style="color:var(--green)">8.5</span></div>
<div class="score-bar"><div class="score-fill green" style="width:85%"></div></div>
</div>
<div class="score-row">
<div class="score-header"><span class="score-label">🌍 国际化</span><span class="score-value" style="color:var(--green)">9.0</span></div>
<div class="score-bar"><div class="score-fill green" style="width:90%"></div></div>
</div>
</div>
<div>
<div class="score-row">
<div class="score-header"><span class="score-label">📚 学习曲线</span><span class="score-value" style="color:var(--red)">3.0</span></div>
<div class="score-bar"><div class="score-fill red" style="width:30%"></div></div>
</div>
<div class="score-row">
<div class="score-header"><span class="score-label">🔧 依赖健康度</span><span class="score-value" style="color:var(--red)">4.0</span></div>
<div class="score-bar"><div class="score-fill red" style="width:40%"></div></div>
</div>
<div class="score-row">
<div class="score-header"><span class="score-label">📝 文档可读性</span><span class="score-value" style="color:var(--amber)">6.0</span></div>
<div class="score-bar"><div class="score-fill amber" style="width:60%"></div></div>
</div>
<div class="score-row">
<div class="score-header"><span class="score-label">🛠️ 贡献者门槛</span><span class="score-value" style="color:var(--red)">3.5</span></div>
<div class="score-bar"><div class="score-fill red" style="width:35%"></div></div>
</div>
<div class="score-row">
<div class="score-header"><span class="score-label">🚀 工程化自动化</span><span class="score-value" style="color:var(--green)">8.0</span></div>
<div class="score-bar"><div class="score-fill green" style="width:80%"></div></div>
</div>
</div>
</div>
</div>
</div>
<!-- 架构图 -->
<div class="section">
<div class="container">
<div class="section-header">
<div class="section-tag">ARCHITECTURE</div>
<div class="section-title">Monorepo 分层架构</div>
<div class="section-sub">依赖方向:上层依赖下层,严禁反向引用。Schema → Core → Protocol → Server,Client 独立于 Core/Server。</div>
</div>
<div class="card" style="padding:32px;">
<!-- UI 层 -->
<div class="arch-layer">
<div class="arch-layer-label">UI 层<br><span style="font-size:10px;color:var(--text-muted)">用户界面</span></div>
<div class="arch-blocks">
<div class="arch-block ui">📱 app <code>170K</code></div>
<div class="arch-block ui">🖥️ desktop <code>Electron</code></div>
<div class="arch-block ui">⌨️ tui <code>opentui</code></div>
<div class="arch-block ui">💬 session-ui <code>Solid</code></div>
<div class="arch-block ui">🎨 ui <code>34K</code></div>
<div class="arch-block ui">📊 stats</div>
<div class="arch-block ui">🏢 enterprise</div>
<div class="arch-block ui">📖 storybook</div>
</div>
</div>
<!-- SDK 层 -->
<div class="arch-layer">
<div class="arch-layer-label">SDK / Client<br><span style="font-size:10px;color:var(--text-muted)">类型安全接口</span></div>
<div class="arch-blocks">
<div class="arch-block svc">🔌 sdk <code>30K</code></div>
<div class="arch-block svc">📦 sdk-next</div>
<div class="arch-block svc">📞 client <code>generated</code></div>
<div class="arch-block svc">⚙️ httpapi-codegen <code>IR→SDK</code></div>
</div>
</div>
<!-- 核心层 -->
<div class="arch-layer">
<div class="arch-layer-label">核心运行时<br><span style="font-size:10px;color:var(--text-muted)">Agent 引擎</span></div>
<div class="arch-blocks">
<div class="arch-block core">🤖 opencode <code>176K</code></div>
<div class="arch-block core">🧩 core <code>68K</code></div>
<div class="arch-block core">🔌 plugin <code>v1+v2</code></div>
<div class="arch-block core">🔒 permission</div>
<div class="arch-block core">📝 codemode</div>
</div>
</div>
<!-- 服务层 -->
<div class="arch-layer">
<div class="arch-layer-label">服务 / 协议<br><span style="font-size:10px;color:var(--text-muted)">HTTP + 事件</span></div>
<div class="arch-blocks">
<div class="arch-block svc">🌐 server <code>Hono</code></div>
<div class="arch-block svc">📡 protocol</div>
<div class="arch-block svc">📨 event-manifest</div>
<div class="arch-block svc">🔍 http-recorder</div>
<div class="arch-block svc">🪝 slack</div>
</div>
</div>
<!-- LLM 层 -->
<div class="arch-layer">
<div class="arch-layer-label">LLM 层<br><span style="font-size:10px;color:var(--text-muted)">模型路由</span></div>
<div class="arch-blocks">
<div class="arch-block data">🧠 llm <code>20K</code></div>
<div class="arch-block data">Anthropic</div>
<div class="arch-block data">OpenAI</div>
<div class="arch-block data">Gemini</div>
<div class="arch-block data">Bedrock</div>
<div class="arch-block data">xAI</div>
<div class="arch-block data">Copilot</div>
<div class="arch-block data">OpenRouter</div>
</div>
</div>
<!-- 基础层 -->
<div class="arch-layer">
<div class="arch-layer-label">基础层<br><span style="font-size:10px;color:var(--text-muted)">数据 + 验证</span></div>
<div class="arch-blocks">
<div class="arch-block infra">📐 schema <code>Effect</code></div>
<div class="arch-block infra">🗄️ effect-drizzle-sqlite</div>
<div class="arch-block infra">💎 effect-sqlite-node</div>
<div class="arch-block infra">🌐 web</div>
<div class="arch-block infra">📜 script</div>
<div class="arch-block infra">📦 containers</div>
</div>
</div>
</div>
</div>
</div>
<!-- Package 统计 -->
<div class="section">
<div class="container">
<div class="section-header">
<div class="section-tag">CODEBASE</div>
<div class="section-title">核心子包规模</div>
</div>
<div class="card">
<table class="pkg-table">
<thead>
<tr><th>包名</th><th>定位</th><th class="pkg-num">TS 文件数</th><th class="pkg-num">代码行数</th><th>技术亮点</th></tr>
</thead>
<tbody>
<tr><td class="pkg-name">opencode</td><td>Agent 核心运行时</td><td class="pkg-num">668</td><td class="pkg-num">176,238</td><td>Effect + 40+ 模块</td></tr>
<tr><td class="pkg-name">app</td><td>Web 应用 (SolidStart)</td><td class="pkg-num">595</td><td class="pkg-num">170,619</td><td>SolidJS + Tailwind</td></tr>
<tr><td class="pkg-name">core</td><td>Domain 核心 (Session/Tool)</td><td class="pkg-num">477</td><td class="pkg-num">67,545</td><td>V2 Session Runner</td></tr>
<tr><td class="pkg-name">ui</td><td>共享 UI 组件库</td><td class="pkg-num">247</td><td class="pkg-num">33,853</td><td>Solid + Shiki 高亮</td></tr>
<tr><td class="pkg-name">tui</td><td>终端 UI (opentui)</td><td class="pkg-num">204</td><td class="pkg-num">31,849</td><td>自研 TUI 框架</td></tr>
<tr><td class="pkg-name">sdk</td><td>JS SDK (自动生成)</td><td class="pkg-num">44</td><td class="pkg-num">30,328</td><td>types.gen.ts 13K行</td></tr>
<tr><td class="pkg-name">session-ui</td><td>聊天会话渲染</td><td class="pkg-num">96</td><td class="pkg-num">21,433</td><td>Markdown + Diff</td></tr>
<tr><td class="pkg-name">llm</td><td>LLM Provider 适配</td><td class="pkg-num">105</td><td class="pkg-num">20,526</td><td>3协议×12 Provider</td></tr>
<tr><td class="pkg-name">stats</td><td>数据统计仪表盘</td><td class="pkg-num">81</td><td class="pkg-num">17,410</td><td>SolidStart + Charts</td></tr>
<tr><td class="pkg-name">console</td><td>管理控制台</td><td class="pkg-num">235</td><td class="pkg-num">41,519</td><td>Hono + OpenAPI</td></tr>
<tr><td class="pkg-name">codemode</td><td>沙箱代码执行</td><td class="pkg-num">33</td><td class="pkg-num">11,218</td><td>Effect 沙箱解释器</td></tr>
<tr><td class="pkg-name">desktop</td><td>Electron 桌面端</td><td class="pkg-num">137</td><td class="pkg-num">9,432</td><td>electron-vite</td></tr>
<tr><td class="pkg-name">web</td><td>官网落地页</td><td class="pkg-num">19</td><td class="pkg-num">6,952</td><td>SolidStart SSR</td></tr>
<tr><td class="pkg-name">client</td><td>生成 API Client</td><td class="pkg-num">16</td><td class="pkg-num">5,309</td><td>Effect HttpApiClient</td></tr>
<tr><td class="pkg-name">plugin</td><td>插件 SDK</td><td class="pkg-num">36</td><td class="pkg-num">1,659</td><td>v1 Promise + v2 Effect</td></tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- 优点 -->
<div class="section">
<div class="container">
<div class="section-header">
<div class="section-tag">PROS</div>
<div class="section-title">核心优势 ✅</div>
</div>
<div class="pros-cons-grid">
<div class="card pros-card">
<h3 style="font-size:16px; margin-bottom:16px;">🏗️ 架构与工程</h3>
<div class="list-item">
<div class="list-icon pro">1</div>
<div class="list-content">
<h4>Effect 框架贯穿全局</h4>
<p>3116 处 yield*、306 处 Effect.gen。Session/LLM/Tool 全部以 Effect generator 组织,天然支持并发取消、资源管理、错误通道分离、可观测性。不是"用了一点 Effect",而是"整个项目 Effect-first"。</p>
</div>
</div>
<div class="list-item">
<div class="list-icon pro">2</div>
<div class="list-content">
<h4>V2 Session Core — 持久化优先设计</h4>
<p>Session 不是内存对象,而是 SQLite 持久化的 "durable inbox"。Prompt 先写入 session_input 行,再通过 SessionExecution.wake() 调度。支持 crash recovery、多 prompt 排队、Context Epoch 缓存基线管理。这是比 Claude Code 更先进的 session 架构。</p>
</div>
</div>
<div class="list-item">
<div class="list-icon pro">3</div>
<div class="list-content">
<h4>Context Source 注册表系统</h4>
<p>System Context 不是硬编码 system prompt,而是可注册的 ContextSource 生产者。每个 Source 有独立的 key、JSON codec、loader、baseline/update renderer。支持中途变更并产生 Mid-Conversation System Message。这是声明式上下文管理的最佳实践。</p>
</div>
</div>
<div class="list-item">
<div class="list-icon pro">4</div>
<div class="list-content">
<h4>SDK Contract IR 自动生成</h4>
<p>packages/httpapi-codegen 把 HttpApi 定义编译成 SDK Contract IR,再发射出 Effect client 和 Promise client 两套 SDK。生成的 types.gen.ts 有 13,622 行。不需要手写 SDK,API 变了重新生成即可。</p>
</div>
</div>
<div class="list-item">
<div class="list-icon pro">5</div>
<div class="list-content">
<h4>自研 opentui TUI 框架</h4>
<p>不依赖 blessed/ink,自己用 React-like 的 SolidJS 信号系统做了终端渲染器(@opentui/core + @opentui/solid),支持组件化、虚拟滚动、keymap。TUI 包 204 个文件、31K 行,是完整的终端应用。</p>
</div>
</div>
</div>
<div class="card pros-card">
<h3 style="font-size:16px; margin-bottom:16px;">🧠 能力与生态</h3>
<div class="list-item">
<div class="list-icon pro">1</div>
<div class="list-content">
<h4>全协议 LLM Provider 支持</h4>
<p>3 套协议适配器(Anthropic Messages、OpenAI Chat/Responses、Bedrock Converse、Gemini),12+ Provider(含 Copilot、OpenRouter、xAI)。Provider 切换只改配置不改代码。Provider 测试有 recorded cassette 回放机制。</p>
</div>
</div>
<div class="list-item">
<div class="list-icon pro">2</div>
<div class="list-content">
<h4>14 种 Provider-Specific Prompt 模板</h4>
<p>不同模型有不同的 prompt 文件(anthropic.txt、gemini.txt、gpt.txt、codex.txt、kimi.txt、copilot-gpt-5.txt…),每种模型用最适合的指令格式。还有 plan-mode.txt 等模式切换模板。</p>
</div>
</div>
<div class="list-item">
<div class="list-icon pro">3</div>
<div class="list-content">
<h4>多形态部署:CLI / TUI / Desktop / Web / Embedded</h4>
<p>同一个 core,渲染层可以是终端(tui)、桌面(Electron)、Web(SolidStart SSR)。还有 Embedded OpenCode 模式——在进程内通过内存 HttpClient 复用 Server 路由。</p>
</div>
</div>
<div class="list-item">
<div class="list-icon pro">4</div>
<div class="list-content">
<h4>codemode — 沙箱代码执行</h4>
<p>Effect 原生的沙箱 JS 解释器,可以在受限环境中执行 schema 描述的工具代码。runtime.ts 有 3465 行,是一个完整的 AST 解释器。用于安全地执行模型生成的代码。</p>
</div>
</div>
<div class="list-item">
<div class="list-icon pro">5</div>
<div class="list-content">
<h4>21 种语言 README + 18 种 i18n</h4>
<p>README 翻译了 21 种语言(含中文简繁、日语、阿拉伯语、孟加拉语…),术语表(glossary)也有 16 种语言。国际化做到了极致。</p>
</div>
</div>
</div>
</div>
<!-- 更多优点 -->
<div style="margin-top:20px;">
<div class="feature-grid">
<div class="feature-card">
<div class="feature-icon" style="background:rgba(99,102,241,0.15);">🔧</div>
<h4>丰富的工具系统</h4>
<p>read/write/edit/grep/glob/shell/task/webfetch/websearch/plan/todo/lsp/apply_patch/skill/mcp,每个工具有 .ts 实现和 .txt 模型描述文件。支持 truncate 大输出到临时文件。</p>
</div>
<div class="feature-card">
<div class="feature-icon" style="background:rgba(16,185,129,0.15);">🧪</div>
<h4>704 个测试文件</h4>
<p>包含 provider recorded cassette(回放真实 API 响应)、session runner 集成测试、compaction 测试。Provider 测试支持 cache.recorded 模式。</p>
</div>
<div class="feature-card">
<div class="feature-icon" style="background:rgba(245,158,11,0.15);">🤖</div>
<h4>双 Agent 模式</h4>
<p>build(全权限)和 plan(只读分析)。还有 @general 子 Agent 用于复杂搜索和多步任务。plan Agent 默认拒绝文件编辑,执行 bash 前要权限。</p>
</div>
<div class="feature-card">
<div class="feature-icon" style="background:rgba(168,85,247,0.15);">🔌</div>
<h4>MCP + Plugin 双扩展</h4>
<p>支持 MCP 协议(含 OAuth),还有自有的 Plugin SDK(v1 Promise 风格 + v2 Effect 风格)。Plugin 可以注册自定义工具、命令、Provider、Skill。</p>
</div>
<div class="feature-card">
<div class="feature-icon" style="background:rgba(6,182,212,0.15);">📋</div>
<h4>完整的 Compaction 策略</h4>
<p>当上下文窗口溢出时,有 summary.ts 做摘要压缩。支持 overflow.ts 检测窗口边界,revert.ts 支持回退到压缩前状态。这是生产级的长会话管理。</p>
</div>
<div class="feature-card">
<div class="feature-icon" style="background:rgba(236,72,153,0.15);">📈</div>
<h4>爆发式增长</h4>
<p>从 2025-06-29 的 5.8 万总下载到 2026-01-29 的 1019 万。日均增长 30 万+。GitHub Star 和 npm 趋势极陡。这是真实的产品吸引力。</p>
</div>
</div>
</div>
</div>
</div>
<!-- 缺点 -->
<div class="section">
<div class="container">
<div class="section-header">
<div class="section-tag">CONS</div>
<div class="section-title">核心问题 ❌</div>
</div>
<div class="pros-cons-grid">
<div class="card cons-card">
<h3 style="font-size:16px; margin-bottom:16px;">⚠️ 架构债务</h3>
<div class="list-item">
<div class="list-icon con">1</div>
<div class="list-content">
<h4>Effect 4.0 beta 依赖 — 全线未稳定</h4>
<p>effect@4.0.0-beta.83、@effect/platform-node@4.0.0-beta.83、@effect/opentelemetry@4.0.0-beta.83 全是 beta。而且需要 patch(patches/effect@4.0.0-beta.83.patch)。一旦 Effect 4.0 正式发布 breaking change,整个项目要改 300+ 处 Effect.gen。</p>
</div>
</div>
<div class="list-item">
<div class="list-icon con">2</div>
<div class="list-content">
<h4>17 个 Patch — 依赖维护噩梦</h4>
<p>patch 了 solid-js、ai-sdk(google/xai/mistral/openai-compatible)、modelcontextprotocol/sdk、effect、tanstack/virtual-core 等。每个 patch 都是"上游不修就得永远维护"。Bun 的 patchedDependencies 机制虽好,但 patch 文件积累到 17 个已经是技术债信号。</p>
</div>
</div>
<div class="list-item">
<div class="list-icon con">3</div>
<div class="list-content">
<h4>opencode 包膨胀 — 668 文件 / 176K 行</h4>
<p>核心的 packages/opencode 有 668 个 TS 文件。单包包含 session、tool、provider、config、server、lsp、mcp、git、snapshot、worktree… 等几十个子模块。虽然内部有 src/ 目录分层,但没有进一步拆成独立包。对比 packages/core 已经拆出来了,opencode 本身还是太重。</p>
</div>
</div>
<div class="list-item">
<div class="list-icon con">4</div>
<div class="list-content">
<h4>V1 / V2 双轨并存</h4>
<p>packages/core/src/ 下有 v1/ 目录,packages/plugin/src/ 下有 v1/ 和 v2/ 两套。opencode/src/session/ 有 V1 和 V2 的桥接代码(event-v2-bridge.ts、message-v2.ts)。迁移没完成,维护两套 API 的成本很高。</p>
</div>
</div>
</div>
<div class="card cons-card">
<h3 style="font-size:16px; margin-bottom:16px;">🚨 实践风险</h3>
<div class="list-item">
<div class="list-icon con">5</div>
<div class="list-content">
<h4>Effect 学习曲线极高</h4>
<p>Effect 的 generator 函数、Layer 依赖注入、Stream、Schema、TaggedError 对绝大多数前端/Node 开发者是全新的。AGENTS.md 用大量篇幅解释 Effect 编码规范("不要嵌套 yield*"、"Effect 中同步逻辑不要返回 Effect"),本身就说明需要严格的规范来约束开发者。</p>
</div>
</div>
<div class="list-item">
<div class="list-icon con">6</div>
<div class="list-content">
<h4>Bun 独占 — 非 Node 兼容</h4>
<p>packageManager: bun@1.3.14。大量使用 Bun.file()、bun test、Bun 特有 API。放弃 Node.js 生态意味着:CI 必须用 Bun、开发者必须安装 Bun、某些 Node-only 的库不兼容。虽然 Bun 性能更好,但这是一个排他性选择。</p>
</div>
</div>
<div class="list-item">
<div class="list-icon con">7</div>
<div class="list-content">
<h4>CONTEXT.md 过度工程化</h4>
<p>CONTEXT.md 有 32,094 字,定义了 30+ 个专有名词(Context Epoch、Safe Provider-Turn Boundary、Admitted Prompt、Prompt Promotion、Session Drain…)。这种概念密度对贡献者极不友好。一个人能维护这套词汇表,但社区贡献者很难上手。</p>
</div>
</div>
<div class="list-item">
<div class="list-icon con">8</div>
<div class="list-content">
<h4>SST + Cloudflare 强绑定</h4>
<p>部署层用了 SST (sst.config.ts) + Cloudflare Workers。infra/ 目录有 lake.ts、enterprise.ts、monitoring.ts 等。这意味着 OpenCode 的后端服务(share、auth、console)绑定了特定云厂商。自托管需要绕过这些基础设施。</p>
</div>
</div>
</div>
</div>
<!-- 潜在风险 -->
<div style="margin-top:20px;">
<div class="card" style="border-color:rgba(245,158,11,0.2);">
<h4 style="color:var(--amber); margin-bottom:16px;">⚡ 潜在风险点</h4>
<div style="display:grid; grid-template-columns:1fr 1fr; gap:16px; font-size:13px; color:var(--text-dim);">
<div><strong style="color:var(--text);">typescript 7.0-native-preview</strong> — 用了 @typescript/native-preview(Go 重写的 tsc),还是 dev tag。正式版行为可能不同。</div>
<div><strong style="color:var(--text);">node-pty patch</strong> — @lydell/node-pty 1.2.0-beta.12 + postinstall fix-node-pty。终端模拟依赖不稳定。</div>
<div><strong style="color:var(--text);">opentui 自研风险</strong> — 不用 blessed/ink 是创新,但 TUI 框架只有这一个用户。如果团队放弃维护,迁移成本无限大。</div>
<div><strong style="color:var(--text);">anomalyco 组织</strong> — 从 sst-community/anomaly 看似是 SST 团队孵化。商业化路径(enterprise 包)可能影响开源方向。</div>
</div>
</div>
</div>
</div>
</div>
<!-- 工具系统 -->
<div class="section">
<div class="container">
<div class="section-header">
<div class="section-tag">TOOL SYSTEM</div>
<div class="section-title">内置工具体系</div>
<div class="section-sub">每个工具有 .ts 实现 + .txt 模型描述。Registry 基于 Effect Layer 注入,支持权限拦截。</div>
</div>
<div class="card" style="padding:32px;">
<table class="cmp-table">
<thead>
<tr><th>工具名</th><th>功能</th><th>特点</th></tr>
</thead>
<tbody>
<tr><td>read</td><td>读取文件</td><td>行范围读取,大文件截断</td></tr>
<tr><td>write</td><td>写入文件</td><td>全量覆盖写入</td></tr>
<tr><td>edit</td><td>精确替换</td><td>old_string → new_string 匹配</td></tr>
<tr><td>apply_patch</td><td>批量补丁</td><td>支持多文件 patch 格式</td></tr>
<tr><td>shell</td><td>执行命令</td><td>子目录 shell/ 有完整实现</td></tr>
<tr><td>grep</td><td>正则搜索</td><td>基于 ripgrep</td></tr>
<tr><td>glob</td><td>文件匹配</td><td>glob pattern 列出文件</td></tr>
<tr><td>task</td><td>子 Agent 派发</td><td>独立上下文的子任务</td></tr>
<tr><td>webfetch</td><td>抓取网页</td><td>URL → Markdown</td></tr>
<tr><td>websearch</td><td>网络搜索</td><td>Exa / Parallel 搜索引擎</td></tr>
<tr><td>plan</td><td>计划制定</td><td>plan-enter/plan-exit 模式切换</td></tr>
<tr><td>todo</td><td>待办清单</td><td>todowrite 工具写入</td></tr>
<tr><td>lsp</td><td>语言服务</td><td>诊断、定义跳转</td></tr>
<tr><td>skill</td><td>技能调用</td><td>可注册的自定义技能</td></tr>
<tr><td>question</td><td>用户交互</td><td>向用户提问并等待回复</td></tr>
<tr><td>mcp-websearch</td><td>MCP 搜索</td><td>通过 MCP 协议搜索</td></tr>
<tr><td>code-mode</td><td>沙箱代码</td><td>codemode 包安全执行</td></tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- 竞品对比 -->
<div class="section">
<div class="container">
<div class="section-header">
<div class="section-tag">COMPARISON</div>
<div class="section-title">竞品横向对比</div>
</div>
<div class="card" style="padding:24px;">
<table class="cmp-table">
<thead>
<tr>
<th style="width:140px;">维度</th>
<th>OpenCode</th>
<th>Claude Code</th>
<th>Cline / Roo</th>
<th>Aider</th>
</tr>
</thead>
<tbody>
<tr><td>开源协议</td><td class="cmp-yes">MIT ✅</td><td class="cmp-no">闭源 ❌</td><td class="cmp-yes">Apache 2.0 ✅</td><td class="cmp-yes">Apache 2.0 ✅</td></tr>
<tr><td>Provider 自由度</td><td class="cmp-yes">12+ Provider ✅</td><td class="cmp-no">仅 Anthropic ❌</td><td class="cmp-yes">多 Provider ✅</td><td class="cmp-yes">多 Provider ✅</td></tr>
<tr><td>终端 TUI</td><td class="cmp-yes">自研 opentui ✅</td><td class="cmp-yes">内置 ✅</td><td class="cmp-no">VSCode 扩展 ❌</td><td class="cmp-yes">内置 ✅</td></tr>
<tr><td>桌面 App</td><td class="cmp-yes">Electron ✅</td><td class="cmp-yes">原生 ✅</td><td class="cmp-partial">VSCode 内 ⚠️</td><td class="cmp-no">无 ❌</td></tr>
<tr><td>Web 版</td><td class="cmp-yes">SolidStart SSR ✅</td><td class="cmp-no">无 ❌</td><td class="cmp-no">无 ❌</td><td class="cmp-no">无 ❌</td></tr>
<tr><td>Session 持久化</td><td class="cmp-yes">SQLite + Durable ✅</td><td class="cmp-yes">Session ID ✅</td><td class="cmp-partial">VSCode state ⚠️</td><td class="cmp-yes">Git commits ✅</td></tr>
<tr><td>Context 管理</td><td class="cmp-yes">Context Epoch ✅</td><td class="cmp-partial">隐式 ⚠️</td><td class="cmp-partial">手动 ⚠️</td><td class="cmp-partial">Repo map ⚠️</td></tr>
<tr><td>Effect 框架</td><td class="cmp-yes">全栈 ✅</td><td class="cmp-no">—</td><td class="cmp-no">—</td><td class="cmp-no">—</td></tr>
<tr><td>插件系统</td><td class="cmp-yes">v1+v2+MCP ✅</td><td class="cmp-partial">MCP ⚠️</td><td class="cmp-partial">MCP ⚠️</td><td class="cmp-no">无 ❌</td></tr>
<tr><td>沙箱代码执行</td><td class="cmp-yes">codemode ✅</td><td class="cmp-no">无 ❌</td><td class="cmp-no">无 ❌</td><td class="cmp-no">无 ❌</td></tr>
<tr><td>SDK 自动生成</td><td class="cmp-yes">IR Codegen ✅</td><td class="cmp-no">手动 ❌</td><td class="cmp-no">无 ❌</td><td class="cmp-no">无 ❌</td></tr>
<tr><td>i18n</td><td class="cmp-yes">21 语言 ✅</td><td class="cmp-no">英语 ❌</td><td class="cmp-partial">部分 ⚠️</td><td class="cmp-no">英语 ❌</td></tr>
<tr><td>学习曲线</td><td class="cmp-no">极高 ❌</td><td class="cmp-yes">低 ✅</td><td class="cmp-yes">低 ✅</td><td class="cmp-yes">中 ✅</td></tr>
<tr><td>代码规模</td><td>666K 行</td><td>闭源</td><td>~100K</td><td>~50K</td></tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- 增长趋势 -->
<div class="section">
<div class="container">
<div class="section-header">
<div class="section-tag">GROWTH</div>
<div class="section-title">下载量增长趋势</div>
<div class="section-sub">7 个月内从 5.8 万到 1019 万总下载,日均 +30 万。增长曲线指数级。</div>
</div>
<div class="card" style="padding:24px;">
<div class="growth-chart" id="chart"></div>
<div style="display:flex; justify-content:space-between; margin-top:12px; font-size:11px; color:var(--text-muted);">
<span>2025-06 (5.8万)</span>
<span>2025-09 (50万)</span>
<span>2025-11 (~200万)</span>
<span>2026-01 (1019万)</span>
</div>
<div class="metric-grid" style="margin-top:24px;">
<div class="metric-card">
<div class="metric-num" style="color:var(--green)">7.8M</div>
<div class="metric-desc">GitHub 下载</div>
</div>
<div class="metric-card">
<div class="metric-num" style="color:var(--blue)">2.4M</div>
<div class="metric-desc">npm 下载</div>
</div>
<div class="metric-card">
<div class="metric-num" style="color:var(--purple)">386K</div>
<div class="metric-desc">最近单日增量</div>
</div>
<div class="metric-card">
<div class="metric-num" style="color:var(--amber)">176×</div>
<div class="metric-desc">7个月增长倍数</div>
</div>
</div>
</div>
</div>
</div>
<!-- CI/CD -->
<div class="section">
<div class="container">
<div class="section-header">
<div class="section-tag">ENGINEERING</div>
<div class="section-title">工程化实践</div>
</div>
<div class="feature-grid">
<div class="feature-card">
<div class="feature-icon" style="background:rgba(99,102,241,0.15);">🔄</div>
<h4>27 个 GitHub Actions</h4>
<p>publish、test、typecheck、storybook、docs-locale-sync、pr-standards、compliance-close、nix-eval、stats… 极度自动化的 CI。</p>
</div>
<div class="feature-card">
<div class="feature-icon" style="background:rgba(16,185,129,0.15);">🏗️</div>
<h4>Turborepo + Bun Workspaces</h4>
<p>turbo.json 编排多包构建,Bun workspaces + catalog 统一版本。catalog 机制让 30+ 依赖版本在根 package.json 一处管理。</p>
</div>
<div class="feature-card">
<div class="feature-icon" style="background:rgba(245,158,11,0.15);">🔒</div>
<h4>Husky + OxLint + tsgo</h4>
<p>Git hooks 做提交前检查。OxLint(Rust linter)替代 ESLint,tsgo(Go 编译器)替代 tsc。追求极致的 typecheck 速度。</p>
</div>
<div class="feature-card">
<div class="feature-icon" style="background:rgba(168,85,247,0.15);">📋</div>
<h4>specs/ 规范文档</h4>
<p>V2 迁移有 specs/v2/ 下的完整设计文档(session、config、provider-model、catalog-config-plugin-lifecycle)。不只是写代码,先写 spec。</p>
</div>
<div class="feature-card">
<div class="feature-icon" style="background:rgba(6,182,212,0.15);">🐳</div>
<h4>Nix Flake + Docker</h4>
<p>flake.nix 提供 Nix 确定性构建。packages/containers + containers.yml CI 做容器化。多管齐下确保可复现。</p>
</div>
<div class="feature-card">
<div class="feature-icon" style="background:rgba(236,72,153,0.15);">📊</div>
<h4>SST + Cloudflare</h4>
<p>infra/ 目录定义了 8 个 SST stage(lake、enterprise、app、stats、console…)。share/auth/monitoring 全部署在 Cloudflare。</p>
</div>
</div>
</div>
</div>
<!-- 对 KinetAios 的启示 -->
<div class="section">
<div class="container">
<div class="section-header">
<div class="section-tag">INSIGHTS</div>
<div class="section-title">对 KinetAios 的启示</div>
</div>
<div class="card" style="padding:32px;">
<div style="display:grid; gap:16px;">
<div style="padding:16px; background:var(--bg-elevated); border-radius:8px; border-left:3px solid var(--green);">
<h4 style="color:var(--green); margin-bottom:8px;">✅ 可以借鉴</h4>
<p style="font-size:13px; color:var(--text-dim);">
<strong>Context Source 注册表</strong> — KinetAios 目前 system prompt 是硬编码的。可以学习 OpenCode 的 ContextSource 模式,让 memory block、project context、agent config 等成为独立的注册式 context producer,支持动态更新和 Mid-Conversation System Message。
</p>
</div>
<div style="padding:16px; background:var(--bg-elevated); border-radius:8px; border-left:3px solid var(--blue);">
<h4 style="color:var(--blue); margin-bottom:8px;">📌 值得关注</h4>
<p style="font-size:13px; color:var(--text-dim);">
<strong>Session Durable Inbox</strong> — prompt 先持久化再执行的设计很优雅。KinetAios 目前的 session model 可以参考:把 prompt 作为 durable input 写入 SQLite,再通过 wake/schedule 执行。这样 crash 后可以恢复未完成的 prompt。
</p>
</div>
<div style="padding:16px; background:var(--bg-elevated); border-radius:8px; border-left:3px solid var(--amber);">
<h4 style="color:var(--amber); margin-bottom:8px;">⚠️ 不要照搬</h4>
<p style="font-size:13px; color:var(--text-dim);">
<strong>Effect 全家桶</strong> — OpenCode 用 Effect 是因为团队(SST/anomaly)本身就是 Effect 生态核心贡献者。KinetAios 用纯 TypeScript 更合适:对贡献者友好、调试简单、不需要理解 Effect 的 Layer/Stream/Schema 概念。Effect 的类型体操(yield* 类型推断)在 IDE 中也有性能问题。
</p>
</div>
<div style="padding:16px; background:var(--bg-elevated); border-radius:8px; border-left:3px solid var(--purple);">
<h4 style="color:var(--purple); margin-bottom:8px;">💡 差异化机会</h4>
<p style="font-size:13px; color:var(--text-dim);">
<strong>NEXUS 可视化</strong> — OpenCode 没有会话关系可视化(只有列表)。KinetAios 的 NEXUS 轨道视图是独特优势。<br>
<strong>多引擎实时切换</strong> — OpenCode 切 Provider 改配置,KinetAios 的 Direct/Claude Code/Codex 三引擎热切是更强。<br>
<strong>长期记忆</strong> — OpenCode 有 snapshot 但不是语义检索。KinetAios 的 FTS5 + embedding recall 是差异化。
</p>
</div>
<div style="padding:16px; background:var(--bg-elevated); border-radius:8px; border-left:3px solid var(--red);">
<h4 style="color:var(--red); margin-bottom:8px;">🚨 需要警惕</h4>
<p style="font-size:13px; color:var(--text-dim);">
<strong>过度抽象的代价</strong> — OpenCode 的 CONTEXT.md 有 32K 字定义 30+ 概念。KinetAios 要保持简单:一个概念能用一句话解释就不要发明术语。<br>
<strong>patch 堆积</strong> — OpenCode 有 17 个 patch。KinetAios 应该尽量用原生依赖,patch 是最后的手段。
</p>
</div>
</div>
</div>
</div>
</div>
<!-- Footer -->
<div class="footer">
<div class="container">
<p>OpenCode 深度架构分析报告 · 基于 opencode-dev 代码库 · 2026-08-11</p>
<p style="margin-top:8px;">分析范围:32 个 packages · 666K 行 TypeScript · 704 测试文件 · 17 patches · 27 CI workflows</p>
</div>
</div>
<script>
// Growth chart
(function() {
const data = [
{label:'Jun25', v:58}, {label:'Jul25', v:120}, {label:'Aug25', v:250},
{label:'Sep25', v:500}, {label:'Oct25', v:1200}, {label:'Nov25', v:2500},
{label:'Dec25', v:5000}, {label:'Jan26', v:10190}
];
const max = 10190;
const chart = document.getElementById('chart');
const barWidth = (100 / data.length);
data.forEach((d, i) => {
const bar = document.createElement('div');
bar.className = 'growth-bar';