nano-brain 2026.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/AGENTS_SNIPPET.md +36 -0
  2. package/CHANGELOG.md +68 -0
  3. package/README.md +281 -0
  4. package/SKILL.md +153 -0
  5. package/bin/cli.js +18 -0
  6. package/index.html +929 -0
  7. package/nano-brain +4 -0
  8. package/opencode-mcp.json +9 -0
  9. package/openspec/changes/archive/2026-02-16-fix-mcp-server-bugs/.openspec.yaml +2 -0
  10. package/openspec/changes/archive/2026-02-16-fix-mcp-server-bugs/design.md +68 -0
  11. package/openspec/changes/archive/2026-02-16-fix-mcp-server-bugs/proposal.md +27 -0
  12. package/openspec/changes/archive/2026-02-16-fix-mcp-server-bugs/specs/mcp-integration-testing/spec.md +50 -0
  13. package/openspec/changes/archive/2026-02-16-fix-mcp-server-bugs/specs/mcp-server/spec.md +40 -0
  14. package/openspec/changes/archive/2026-02-16-fix-mcp-server-bugs/specs/search-pipeline/spec.md +29 -0
  15. package/openspec/changes/archive/2026-02-16-fix-mcp-server-bugs/tasks.md +37 -0
  16. package/openspec/changes/archive/2026-02-23-workspace-scoped-memory-and-storage-limits/.openspec.yaml +2 -0
  17. package/openspec/changes/archive/2026-02-23-workspace-scoped-memory-and-storage-limits/design.md +111 -0
  18. package/openspec/changes/archive/2026-02-23-workspace-scoped-memory-and-storage-limits/proposal.md +30 -0
  19. package/openspec/changes/archive/2026-02-23-workspace-scoped-memory-and-storage-limits/specs/mcp-server/spec.md +33 -0
  20. package/openspec/changes/archive/2026-02-23-workspace-scoped-memory-and-storage-limits/specs/storage-limits/spec.md +90 -0
  21. package/openspec/changes/archive/2026-02-23-workspace-scoped-memory-and-storage-limits/specs/workspace-scoping/spec.md +66 -0
  22. package/openspec/changes/archive/2026-02-23-workspace-scoped-memory-and-storage-limits/tasks.md +199 -0
  23. package/openspec/changes/codebase-indexing/.openspec.yaml +2 -0
  24. package/openspec/changes/codebase-indexing/design.md +169 -0
  25. package/openspec/changes/codebase-indexing/proposal.md +30 -0
  26. package/openspec/changes/codebase-indexing/specs/codebase-collection/spec.md +187 -0
  27. package/openspec/changes/codebase-indexing/specs/mcp-server/spec.md +36 -0
  28. package/openspec/changes/codebase-indexing/tasks.md +56 -0
  29. package/openspec/specs/mcp-integration-testing/spec.md +50 -0
  30. package/openspec/specs/mcp-server/spec.md +75 -0
  31. package/openspec/specs/search-pipeline/spec.md +29 -0
  32. package/openspec/specs/storage-limits/spec.md +94 -0
  33. package/openspec/specs/workspace-scoping/spec.md +70 -0
  34. package/package.json +34 -0
  35. package/site/build.js +66 -0
  36. package/site/partials/_api.html +83 -0
  37. package/site/partials/_compare.html +100 -0
  38. package/site/partials/_config.html +23 -0
  39. package/site/partials/_features.html +43 -0
  40. package/site/partials/_footer.html +6 -0
  41. package/site/partials/_hero.html +9 -0
  42. package/site/partials/_how-it-works.html +26 -0
  43. package/site/partials/_models.html +18 -0
  44. package/site/partials/_quick-start.html +15 -0
  45. package/site/partials/_stats.html +1 -0
  46. package/site/partials/_tech-stack.html +13 -0
  47. package/site/script.js +12 -0
  48. package/site/shell.html +44 -0
  49. package/site/styles.css +548 -0
  50. package/src/chunker.ts +427 -0
  51. package/src/codebase.ts +331 -0
  52. package/src/collections.ts +192 -0
  53. package/src/embeddings.ts +293 -0
  54. package/src/expansion.ts +79 -0
  55. package/src/harvester.ts +306 -0
  56. package/src/index.ts +503 -0
  57. package/src/reranker.ts +103 -0
  58. package/src/search.ts +294 -0
  59. package/src/server.ts +664 -0
  60. package/src/storage.ts +221 -0
  61. package/src/store.ts +623 -0
  62. package/src/types.ts +202 -0
  63. package/src/watcher.ts +384 -0
  64. package/test/chunker.test.ts +479 -0
  65. package/test/cli.test.ts +309 -0
  66. package/test/codebase-chunker.test.ts +446 -0
  67. package/test/codebase.test.ts +678 -0
  68. package/test/collections.test.ts +571 -0
  69. package/test/harvester.test.ts +636 -0
  70. package/test/integration.test.ts +150 -0
  71. package/test/llm.test.ts +322 -0
  72. package/test/search.test.ts +572 -0
  73. package/test/server.test.ts +541 -0
  74. package/test/storage.test.ts +302 -0
  75. package/test/store.test.ts +465 -0
  76. package/test/watcher.test.ts +656 -0
  77. package/test/workspace.test.ts +239 -0
  78. package/tsconfig.json +19 -0
  79. package/vitest.config.ts +16 -0
@@ -0,0 +1,548 @@
1
+ :root {
2
+ color-scheme: dark;
3
+ --bg: #0b1220;
4
+ --bg-2: #0f172a;
5
+ --bg-3: #121b2f;
6
+ --card: rgba(15, 23, 42, 0.7);
7
+ --glass: rgba(17, 25, 40, 0.6);
8
+ --border: rgba(148, 163, 184, 0.18);
9
+ --text: #e2e8f0;
10
+ --muted: #94a3b8;
11
+ --accent: #3b82f6;
12
+ --accent-2: #06b6d4;
13
+ --shadow: 0 30px 80px rgba(2, 6, 23, 0.6);
14
+ --radius-lg: 22px;
15
+ --radius-md: 16px;
16
+ --radius-sm: 12px;
17
+ }
18
+
19
+ * {
20
+ box-sizing: border-box;
21
+ }
22
+
23
+ html {
24
+ scroll-behavior: smooth;
25
+ }
26
+
27
+ body {
28
+ margin: 0;
29
+ font-family: system-ui, -apple-system, 'Segoe UI', sans-serif;
30
+ background: radial-gradient(circle at 20% 20%, rgba(59, 130, 246, 0.18), transparent 45%),
31
+ radial-gradient(circle at 80% 0%, rgba(6, 182, 212, 0.16), transparent 40%),
32
+ linear-gradient(180deg, #0a1020 0%, #0b1220 45%, #0c1224 100%);
33
+ color: var(--text);
34
+ min-height: 100vh;
35
+ }
36
+
37
+ a {
38
+ color: inherit;
39
+ text-decoration: none;
40
+ }
41
+
42
+ .page {
43
+ max-width: 1180px;
44
+ margin: 0 auto;
45
+ padding: 0 20px 80px;
46
+ }
47
+
48
+ .nav {
49
+ position: sticky;
50
+ top: 0;
51
+ z-index: 20;
52
+ backdrop-filter: blur(14px);
53
+ background: rgba(10, 16, 32, 0.75);
54
+ border-bottom: 1px solid var(--border);
55
+ }
56
+
57
+ .nav-inner {
58
+ max-width: 1180px;
59
+ margin: 0 auto;
60
+ display: flex;
61
+ align-items: center;
62
+ justify-content: space-between;
63
+ padding: 16px 20px;
64
+ gap: 16px;
65
+ }
66
+
67
+ .brand {
68
+ display: flex;
69
+ align-items: center;
70
+ gap: 12px;
71
+ font-weight: 700;
72
+ letter-spacing: 0.02em;
73
+ }
74
+
75
+ .brand-dot {
76
+ width: 10px;
77
+ height: 10px;
78
+ border-radius: 50%;
79
+ background: linear-gradient(135deg, var(--accent), var(--accent-2));
80
+ box-shadow: 0 0 18px rgba(59, 130, 246, 0.8);
81
+ }
82
+
83
+ .nav-links {
84
+ display: flex;
85
+ gap: 12px;
86
+ flex-wrap: wrap;
87
+ }
88
+
89
+ .nav-links a {
90
+ padding: 8px 12px;
91
+ border-radius: 999px;
92
+ border: 1px solid transparent;
93
+ color: var(--muted);
94
+ font-size: 0.9rem;
95
+ transition: color 200ms ease, background 200ms ease, border-color 200ms ease;
96
+ }
97
+
98
+ .nav-links a:hover {
99
+ color: var(--text);
100
+ background: rgba(59, 130, 246, 0.12);
101
+ border-color: rgba(59, 130, 246, 0.4);
102
+ }
103
+
104
+ .hero {
105
+ margin-top: 40px;
106
+ padding: 52px;
107
+ border-radius: var(--radius-lg);
108
+ background: linear-gradient(140deg, rgba(17, 24, 39, 0.85), rgba(2, 6, 23, 0.95));
109
+ border: 1px solid var(--border);
110
+ box-shadow: var(--shadow);
111
+ position: relative;
112
+ overflow: hidden;
113
+ }
114
+
115
+ .hero::after {
116
+ content: '';
117
+ position: absolute;
118
+ inset: 0;
119
+ background: radial-gradient(circle at 80% 20%, rgba(59, 130, 246, 0.25), transparent 40%);
120
+ pointer-events: none;
121
+ }
122
+
123
+ .badge {
124
+ display: inline-flex;
125
+ align-items: center;
126
+ gap: 8px;
127
+ padding: 6px 12px;
128
+ border-radius: 999px;
129
+ font-size: 0.8rem;
130
+ font-weight: 600;
131
+ background: rgba(59, 130, 246, 0.15);
132
+ border: 1px solid rgba(59, 130, 246, 0.4);
133
+ color: #bfdbfe;
134
+ }
135
+
136
+ .hero h1 {
137
+ font-size: clamp(2.6rem, 4.5vw, 3.8rem);
138
+ margin: 16px 0 12px;
139
+ letter-spacing: -0.02em;
140
+ }
141
+
142
+ .hero p {
143
+ font-size: 1.05rem;
144
+ color: var(--muted);
145
+ max-width: 700px;
146
+ line-height: 1.7;
147
+ }
148
+
149
+ .hero-actions {
150
+ display: flex;
151
+ flex-wrap: wrap;
152
+ gap: 14px;
153
+ margin-top: 26px;
154
+ }
155
+
156
+ .button {
157
+ display: inline-flex;
158
+ align-items: center;
159
+ gap: 10px;
160
+ padding: 12px 18px;
161
+ border-radius: 12px;
162
+ font-weight: 600;
163
+ border: 1px solid transparent;
164
+ transition: transform 200ms ease, box-shadow 200ms ease, background 200ms ease;
165
+ }
166
+
167
+ .button.primary {
168
+ background: linear-gradient(135deg, var(--accent), var(--accent-2));
169
+ color: #0b1220;
170
+ box-shadow: 0 18px 36px rgba(59, 130, 246, 0.35);
171
+ }
172
+
173
+ .button.secondary {
174
+ background: rgba(15, 23, 42, 0.7);
175
+ border-color: var(--border);
176
+ color: var(--text);
177
+ }
178
+
179
+ .button:hover {
180
+ transform: translateY(-2px);
181
+ }
182
+
183
+ section {
184
+ margin-top: 72px;
185
+ scroll-margin-top: 100px;
186
+ }
187
+
188
+ .section-title {
189
+ font-size: clamp(1.6rem, 2.4vw, 2.2rem);
190
+ margin-bottom: 12px;
191
+ }
192
+
193
+ .section-subtitle {
194
+ margin-bottom: 26px;
195
+ color: var(--muted);
196
+ max-width: 720px;
197
+ line-height: 1.7;
198
+ }
199
+
200
+ .grid {
201
+ display: grid;
202
+ gap: 18px;
203
+ }
204
+
205
+ .features {
206
+ grid-template-columns: repeat(3, minmax(0, 1fr));
207
+ }
208
+
209
+ .card {
210
+ background: var(--card);
211
+ border-radius: var(--radius-md);
212
+ border: 1px solid var(--border);
213
+ padding: 20px;
214
+ backdrop-filter: blur(12px);
215
+ transition: border-color 200ms ease, transform 200ms ease, box-shadow 200ms ease;
216
+ min-height: 160px;
217
+ }
218
+
219
+ .card:hover {
220
+ border-color: rgba(59, 130, 246, 0.5);
221
+ transform: translateY(-3px);
222
+ box-shadow: 0 20px 45px rgba(15, 23, 42, 0.6);
223
+ }
224
+
225
+ .icon {
226
+ width: 40px;
227
+ height: 40px;
228
+ border-radius: 12px;
229
+ display: grid;
230
+ place-items: center;
231
+ background: rgba(59, 130, 246, 0.16);
232
+ color: #93c5fd;
233
+ margin-bottom: 14px;
234
+ font-weight: 700;
235
+ }
236
+
237
+ .card h3 {
238
+ margin: 0 0 10px;
239
+ font-size: 1.05rem;
240
+ }
241
+
242
+ .card p {
243
+ margin: 0;
244
+ color: var(--muted);
245
+ line-height: 1.6;
246
+ }
247
+
248
+ .pipeline {
249
+ background: var(--glass);
250
+ border-radius: var(--radius-lg);
251
+ border: 1px solid var(--border);
252
+ padding: 28px;
253
+ display: grid;
254
+ gap: 18px;
255
+ }
256
+
257
+ .pipeline-row {
258
+ display: flex;
259
+ align-items: center;
260
+ justify-content: center;
261
+ gap: 14px;
262
+ flex-wrap: wrap;
263
+ }
264
+
265
+ .node {
266
+ padding: 12px 16px;
267
+ border-radius: var(--radius-sm);
268
+ border: 1px solid rgba(59, 130, 246, 0.45);
269
+ background: rgba(10, 16, 32, 0.9);
270
+ font-weight: 600;
271
+ min-width: 150px;
272
+ text-align: center;
273
+ }
274
+
275
+ .connector {
276
+ width: 52px;
277
+ height: 2px;
278
+ background: linear-gradient(90deg, transparent, rgba(59, 130, 246, 0.7), transparent);
279
+ position: relative;
280
+ }
281
+
282
+ .connector::after {
283
+ content: '';
284
+ position: absolute;
285
+ right: -6px;
286
+ top: 50%;
287
+ width: 8px;
288
+ height: 8px;
289
+ border-right: 2px solid rgba(59, 130, 246, 0.7);
290
+ border-top: 2px solid rgba(59, 130, 246, 0.7);
291
+ transform: translateY(-50%) rotate(45deg);
292
+ }
293
+
294
+ .split {
295
+ display: grid;
296
+ grid-template-columns: repeat(2, minmax(0, 1fr));
297
+ gap: 14px;
298
+ width: 100%;
299
+ }
300
+
301
+ .merge {
302
+ width: 2px;
303
+ height: 36px;
304
+ background: rgba(59, 130, 246, 0.7);
305
+ margin: 0 auto;
306
+ position: relative;
307
+ }
308
+
309
+ .merge::after {
310
+ content: '';
311
+ position: absolute;
312
+ bottom: -6px;
313
+ left: 50%;
314
+ width: 10px;
315
+ height: 10px;
316
+ border-right: 2px solid rgba(59, 130, 246, 0.7);
317
+ border-bottom: 2px solid rgba(59, 130, 246, 0.7);
318
+ transform: translateX(-50%) rotate(45deg);
319
+ }
320
+
321
+ .api-grid {
322
+ grid-template-columns: repeat(2, minmax(0, 1fr));
323
+ }
324
+
325
+ .api-card {
326
+ padding: 18px;
327
+ border-radius: var(--radius-md);
328
+ border: 1px solid var(--border);
329
+ background: rgba(12, 19, 35, 0.8);
330
+ }
331
+
332
+ .api-card h4 {
333
+ margin: 0 0 8px;
334
+ }
335
+
336
+ .api-card p {
337
+ margin: 0 0 10px;
338
+ color: var(--muted);
339
+ }
340
+
341
+ .params {
342
+ display: flex;
343
+ flex-wrap: wrap;
344
+ gap: 8px;
345
+ color: var(--muted);
346
+ font-size: 0.85rem;
347
+ }
348
+
349
+ .chip {
350
+ padding: 4px 8px;
351
+ border-radius: 999px;
352
+ background: rgba(59, 130, 246, 0.12);
353
+ border: 1px solid rgba(59, 130, 246, 0.35);
354
+ color: #c7d2fe;
355
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
356
+ }
357
+
358
+ .code-pill {
359
+ padding: 8px 12px;
360
+ border-radius: 999px;
361
+ background: rgba(15, 23, 42, 0.75);
362
+ border: 1px solid rgba(148, 163, 184, 0.3);
363
+ color: #cbd5f5;
364
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
365
+ font-weight: 600;
366
+ }
367
+
368
+ .codeblock {
369
+ background: #0b1220;
370
+ border-radius: var(--radius-md);
371
+ padding: 20px;
372
+ border: 1px solid rgba(148, 163, 184, 0.2);
373
+ overflow-x: auto;
374
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
375
+ font-size: 0.9rem;
376
+ line-height: 1.7;
377
+ color: #e2e8f0;
378
+ }
379
+
380
+ .token-key {
381
+ color: #93c5fd;
382
+ }
383
+
384
+ .token-string {
385
+ color: #fca5a5;
386
+ }
387
+
388
+ .token-boolean {
389
+ color: #facc15;
390
+ }
391
+
392
+ .token-comment {
393
+ color: #94a3b8;
394
+ }
395
+
396
+ .models {
397
+ grid-template-columns: repeat(3, minmax(0, 1fr));
398
+ }
399
+
400
+ .model-card {
401
+ padding: 16px;
402
+ border-radius: var(--radius-md);
403
+ border: 1px solid var(--border);
404
+ background: rgba(12, 19, 35, 0.75);
405
+ }
406
+
407
+ .model-card h4 {
408
+ margin: 0 0 6px;
409
+ font-size: 1rem;
410
+ }
411
+
412
+ .model-card p {
413
+ margin: 0;
414
+ color: var(--muted);
415
+ font-size: 0.9rem;
416
+ }
417
+
418
+ .tech-stack {
419
+ display: flex;
420
+ flex-wrap: wrap;
421
+ gap: 10px;
422
+ }
423
+
424
+ .tech-pill {
425
+ padding: 6px 12px;
426
+ border-radius: 999px;
427
+ background: rgba(15, 23, 42, 0.8);
428
+ border: 1px solid rgba(148, 163, 184, 0.2);
429
+ color: var(--muted);
430
+ font-size: 0.85rem;
431
+ }
432
+
433
+ .stats {
434
+ margin-top: 48px;
435
+ padding: 16px 20px;
436
+ border-radius: var(--radius-md);
437
+ border: 1px solid var(--border);
438
+ background: rgba(15, 23, 42, 0.7);
439
+ text-align: center;
440
+ color: #cbd5f5;
441
+ font-weight: 600;
442
+ letter-spacing: 0.01em;
443
+ }
444
+
445
+ footer {
446
+ margin-top: 72px;
447
+ padding-top: 24px;
448
+ border-top: 1px solid var(--border);
449
+ display: flex;
450
+ align-items: center;
451
+ justify-content: space-between;
452
+ gap: 12px;
453
+ color: var(--muted);
454
+ flex-wrap: wrap;
455
+ }
456
+
457
+ .fade-in {
458
+ opacity: 0;
459
+ transform: translateY(16px);
460
+ transition: opacity 600ms ease, transform 600ms ease;
461
+ }
462
+
463
+ .fade-in.visible {
464
+ opacity: 1;
465
+ transform: translateY(0);
466
+ }
467
+
468
+ @media (max-width: 900px) {
469
+ .features,
470
+ .api-grid,
471
+ .models {
472
+ grid-template-columns: 1fr;
473
+ }
474
+
475
+ .hero {
476
+ padding: 36px 24px;
477
+ }
478
+
479
+ .nav-inner {
480
+ flex-direction: column;
481
+ align-items: flex-start;
482
+ }
483
+ }
484
+
485
+ @media (max-width: 640px) {
486
+ .hero-actions {
487
+ flex-direction: column;
488
+ align-items: stretch;
489
+ }
490
+
491
+ .pipeline-row {
492
+ flex-direction: column;
493
+ }
494
+
495
+ .connector {
496
+ width: 2px;
497
+ height: 28px;
498
+ }
499
+
500
+ .connector::after {
501
+ right: 50%;
502
+ top: auto;
503
+ bottom: -6px;
504
+ transform: translateX(50%) rotate(135deg);
505
+ }
506
+ }
507
+
508
+
509
+ /* Comparison table */
510
+ .compare-table-wrap {
511
+ overflow-x: auto;
512
+ margin: 2rem 0;
513
+ border-radius: 12px;
514
+ border: 1px solid rgba(255,255,255,0.08);
515
+ }
516
+ .compare-table {
517
+ width: 100%;
518
+ border-collapse: collapse;
519
+ font-size: 0.85rem;
520
+ min-width: 700px;
521
+ }
522
+ .compare-table th,
523
+ .compare-table td {
524
+ padding: 0.75rem 1rem;
525
+ text-align: left;
526
+ border-bottom: 1px solid rgba(255,255,255,0.06);
527
+ }
528
+ .compare-table thead th {
529
+ background: rgba(255,255,255,0.04);
530
+ font-weight: 600;
531
+ font-size: 0.8rem;
532
+ text-transform: uppercase;
533
+ letter-spacing: 0.05em;
534
+ color: #aaa;
535
+ }
536
+ .compare-table th.highlight,
537
+ .compare-table td.highlight {
538
+ background: rgba(99,102,241,0.08);
539
+ color: #a5b4fc;
540
+ font-weight: 500;
541
+ }
542
+ .compare-table thead th.highlight {
543
+ color: #a5b4fc;
544
+ font-weight: 700;
545
+ }
546
+ .compare-table tbody tr:hover {
547
+ background: rgba(255,255,255,0.02);
548
+ }