specmem-hardwicksoftware 3.7.30 → 3.7.32

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 (34) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +12 -0
  3. package/bootstrap.cjs +19 -0
  4. package/claude-hooks/bash-call-enforcer.cjs +140 -0
  5. package/claude-hooks/settings.json +132 -0
  6. package/claude-hooks/specmem-drilldown-hook.cjs +49 -2
  7. package/claude-hooks/specmem-drilldown-hook.js +49 -2
  8. package/claude-hooks/specmem-drilldown-hook.js.bak +495 -0
  9. package/claude-hooks/specmem-precompact.cjs +13 -36
  10. package/claude-hooks/specmem-precompact.js +3 -7
  11. package/claude-hooks/specmem-search-enforcer.cjs +229 -0
  12. package/claude-hooks/specmem-search-tracker.cjs +71 -0
  13. package/claude-hooks/specmem-session-start.cjs +38 -50
  14. package/claude-hooks/specmem-session-start.js +19 -60
  15. package/dist/config.js +11 -16
  16. package/dist/db/connectionPoolGoBrrr.js +3 -3
  17. package/dist/index.js +21 -4
  18. package/dist/mcp/compactionProxy.js +21 -1
  19. package/dist/mcp/embeddingServerManager.js +15 -1
  20. package/dist/mcp/mcpProtocolHandler.js +22 -4
  21. package/dist/mcp/specMemServer.js +16 -3
  22. package/dist/mcp/toolRegistry.js +19 -21
  23. package/dist/tools/goofy/checkSyncStatus.js +14 -7
  24. package/dist/watcher/fileWatcher.js +57 -20
  25. package/dist/watcher/index.js +26 -0
  26. package/dist/watcher/syncChecker.js +11 -7
  27. package/package.json +1 -1
  28. package/scripts/global-postinstall.cjs +7 -2
  29. package/scripts/specmem-init.cjs +5 -0
  30. package/specmem/model-config.json +26 -6
  31. package/specmem/supervisord.conf +1 -1
  32. package/specmem/user-config.json +12 -0
  33. package/svg-sections/readme-install.svg +35 -29
  34. package/svg-sections/readme-whats-new.svg +120 -114
@@ -1,4 +1,4 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 200" width="700" height="200">
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 240" width="700" height="240">
2
2
  <defs>
3
3
  <linearGradient id="termBg" x1="0%" y1="0%" x2="100%" y2="100%">
4
4
  <stop offset="0%" style="stop-color:#0d1117"/>
@@ -26,23 +26,21 @@
26
26
  </filter>
27
27
  </defs>
28
28
 
29
- <rect width="700" height="200" rx="12" ry="12" fill="url(#termBg)"/>
30
- <rect width="700" height="200" rx="12" ry="12" fill="none" stroke="url(#accentGradient)" stroke-width="1" stroke-opacity="0.3"/>
29
+ <rect width="700" height="240" rx="12" ry="12" fill="url(#termBg)"/>
30
+ <rect width="700" height="240" rx="12" ry="12" fill="none" stroke="url(#accentGradient)" stroke-width="1" stroke-opacity="0.3"/>
31
31
 
32
- <text x="350" y="32" text-anchor="middle" font-family="system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif" font-size="16" font-weight="700" fill="#f5f5f5">Quick Install</text>
32
+ <text x="350" y="30" text-anchor="middle" font-family="system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif" font-size="15" font-weight="700" fill="#f5f5f5">Quick Install</text>
33
33
 
34
34
  <!-- Connecting line -->
35
- <line x1="50" y1="85" x2="50" y2="150" stroke="#2d333b" stroke-width="2" stroke-dasharray="4,4"/>
35
+ <line x1="50" y1="78" x2="50" y2="168" stroke="#2d333b" stroke-width="2" stroke-dasharray="4,4"/>
36
36
 
37
- <!-- Step 1: sudo npm install -->
38
- <g transform="translate(30, 55)">
39
- <circle cx="20" cy="25" r="14" fill="none" stroke="url(#stepGradient)" stroke-width="2" filter="url(#stepGlow)"/>
40
- <text x="20" y="30" text-anchor="middle" font-family="system-ui, sans-serif" font-size="12" font-weight="700" fill="#00bfff">1</text>
41
- <rect x="45" y="5" width="620" height="40" rx="6" ry="6" fill="#1a1f26"/>
42
- <text x="58" y="31" font-family="'SF Mono', 'Cascadia Code', 'Fira Code', Consolas, monospace" font-size="14" fill="#6e7681">$</text>
43
- <text x="75" y="31" font-family="'SF Mono', 'Cascadia Code', 'Fira Code', Consolas, monospace" font-size="14">
44
- <tspan fill="#ff7b72">sudo</tspan>
45
- <tspan fill="#f5f5f5"> </tspan>
37
+ <!-- Step 1 -->
38
+ <g transform="translate(30, 48)">
39
+ <circle cx="20" cy="20" r="13" fill="none" stroke="url(#stepGradient)" stroke-width="2" filter="url(#stepGlow)"/>
40
+ <text x="20" y="25" text-anchor="middle" font-family="system-ui, sans-serif" font-size="11" font-weight="700" fill="#00bfff">1</text>
41
+ <rect x="44" y="3" width="618" height="34" rx="6" ry="6" fill="#1a1f26"/>
42
+ <text x="57" y="25" font-family="'SF Mono', 'Cascadia Code', 'Fira Code', Consolas, monospace" font-size="13" fill="#6e7681">$</text>
43
+ <text x="72" y="25" font-family="'SF Mono', 'Cascadia Code', 'Fira Code', Consolas, monospace" font-size="13">
46
44
  <tspan fill="#ff7b72">npm</tspan>
47
45
  <tspan fill="#f5f5f5"> install </tspan>
48
46
  <tspan fill="#ffa657">-g</tspan>
@@ -50,27 +48,35 @@
50
48
  </text>
51
49
  </g>
52
50
 
53
- <!-- Step 2: cd && specmem init -->
54
- <g transform="translate(30, 100)">
55
- <circle cx="20" cy="25" r="14" fill="none" stroke="url(#stepGradient)" stroke-width="2" filter="url(#stepGlow)"/>
56
- <text x="20" y="30" text-anchor="middle" font-family="system-ui, sans-serif" font-size="12" font-weight="700" fill="#00bfff">2</text>
57
- <rect x="45" y="5" width="580" height="40" rx="6" ry="6" fill="#1a1f26"/>
58
- <text x="58" y="31" font-family="'SF Mono', 'Cascadia Code', 'Fira Code', Consolas, monospace" font-size="14" fill="#6e7681">$</text>
59
- <text x="75" y="31" font-family="'SF Mono', 'Cascadia Code', 'Fira Code', Consolas, monospace" font-size="14">
51
+ <!-- Step 2 -->
52
+ <g transform="translate(30, 96)">
53
+ <circle cx="20" cy="20" r="13" fill="none" stroke="url(#stepGradient)" stroke-width="2" filter="url(#stepGlow)"/>
54
+ <text x="20" y="25" text-anchor="middle" font-family="system-ui, sans-serif" font-size="11" font-weight="700" fill="#00bfff">2</text>
55
+ <rect x="44" y="3" width="618" height="34" rx="6" ry="6" fill="#1a1f26"/>
56
+ <text x="57" y="25" font-family="'SF Mono', 'Cascadia Code', 'Fira Code', Consolas, monospace" font-size="13" fill="#6e7681">$</text>
57
+ <text x="72" y="25" font-family="'SF Mono', 'Cascadia Code', 'Fira Code', Consolas, monospace" font-size="13">
60
58
  <tspan fill="#ff7b72">cd</tspan>
61
- <tspan fill="#f5f5f5"> /your/projects/directory/ </tspan>
62
- <tspan fill="#6e7681">&amp;&amp;</tspan>
63
- <tspan fill="#f5f5f5"> </tspan>
59
+ <tspan fill="#f5f5f5"> /your/project/directory</tspan>
60
+ </text>
61
+ </g>
62
+
63
+ <!-- Step 3 -->
64
+ <g transform="translate(30, 144)">
65
+ <circle cx="20" cy="20" r="13" fill="none" stroke="url(#stepGradient)" stroke-width="2" filter="url(#stepGlow)"/>
66
+ <text x="20" y="25" text-anchor="middle" font-family="system-ui, sans-serif" font-size="11" font-weight="700" fill="#00bfff">3</text>
67
+ <rect x="44" y="3" width="618" height="34" rx="6" ry="6" fill="#1a1f26"/>
68
+ <text x="57" y="25" font-family="'SF Mono', 'Cascadia Code', 'Fira Code', Consolas, monospace" font-size="13" fill="#6e7681">$</text>
69
+ <text x="72" y="25" font-family="'SF Mono', 'Cascadia Code', 'Fira Code', Consolas, monospace" font-size="13">
64
70
  <tspan fill="#ff7b72">specmem</tspan>
65
71
  <tspan fill="#f5f5f5"> init</tspan>
66
72
  </text>
67
73
  </g>
68
74
 
69
75
  <!-- Done -->
70
- <g transform="translate(30, 150)">
71
- <circle cx="20" cy="20" r="14" fill="#22c55e" fill-opacity="0.2" stroke="#22c55e" stroke-width="2" filter="url(#checkGlow)"/>
72
- <path d="M13 20 L18 25 L28 15" fill="none" stroke="#22c55e" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
73
- <text x="55" y="25" font-family="system-ui, sans-serif" font-size="14" font-weight="600" fill="#22c55e">Done.</text>
74
- <text x="105" y="25" font-family="system-ui, sans-serif" font-size="13" fill="#8b949e">Claude now remembers your entire codebase and conversations.</text>
76
+ <g transform="translate(30, 192)">
77
+ <circle cx="20" cy="16" r="13" fill="#22c55e" fill-opacity="0.2" stroke="#22c55e" stroke-width="2" filter="url(#checkGlow)"/>
78
+ <path d="M13 16 L18 21 L28 11" fill="none" stroke="#22c55e" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
79
+ <text x="50" y="21" font-family="system-ui, sans-serif" font-size="13" font-weight="600" fill="#22c55e">Done.</text>
80
+ <text x="98" y="21" font-family="system-ui, sans-serif" font-size="12" fill="#8b949e">Claude now remembers your entire codebase across every session.</text>
75
81
  </g>
76
82
  </svg>
@@ -1,122 +1,128 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 480" width="800" height="480">
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 500" width="800" height="500">
2
2
  <defs>
3
3
  <linearGradient id="bgGrad" x1="0%" y1="0%" x2="100%" y2="100%">
4
- <stop offset="0%" style="stop-color:#0d1117"/>
5
- <stop offset="100%" style="stop-color:#161b22"/>
4
+ <stop offset="0%" style="stop-color:#0d1117;stop-opacity:1"/>
5
+ <stop offset="100%" style="stop-color:#161b22;stop-opacity:1"/>
6
6
  </linearGradient>
7
- <linearGradient id="cardGrad" x1="0%" y1="0%" x2="100%" y2="100%">
8
- <stop offset="0%" style="stop-color:#1c2128;stop-opacity:0.9"/>
9
- <stop offset="100%" style="stop-color:#21262d;stop-opacity:0.85"/>
7
+ <linearGradient id="headerGrad" x1="0%" y1="0%" x2="100%" y2="0%">
8
+ <stop offset="0%" style="stop-color:#238636;stop-opacity:1"/>
9
+ <stop offset="50%" style="stop-color:#2ea043;stop-opacity:1"/>
10
+ <stop offset="100%" style="stop-color:#238636;stop-opacity:1"/>
10
11
  </linearGradient>
11
- <linearGradient id="titleGrad" x1="0%" y1="0%" x2="100%" y2="0%">
12
- <stop offset="0%" style="stop-color:#22c55e"/>
13
- <stop offset="100%" style="stop-color:#00bfff"/>
12
+ <linearGradient id="card1" x1="0%" y1="0%" x2="100%" y2="100%">
13
+ <stop offset="0%" style="stop-color:#1c2a1c;stop-opacity:1"/>
14
+ <stop offset="100%" style="stop-color:#162216;stop-opacity:1"/>
14
15
  </linearGradient>
15
- <linearGradient id="cyanPurple" x1="0%" y1="0%" x2="100%" y2="0%">
16
- <stop offset="0%" style="stop-color:#00bfff"/>
17
- <stop offset="100%" style="stop-color:#a855f7"/>
16
+ <linearGradient id="card2" x1="0%" y1="0%" x2="100%" y2="100%">
17
+ <stop offset="0%" style="stop-color:#1a1f2e;stop-opacity:1"/>
18
+ <stop offset="100%" style="stop-color:#131827;stop-opacity:1"/>
18
19
  </linearGradient>
20
+ <linearGradient id="card3" x1="0%" y1="0%" x2="100%" y2="100%">
21
+ <stop offset="0%" style="stop-color:#2a1c1a;stop-opacity:1"/>
22
+ <stop offset="100%" style="stop-color:#221410;stop-opacity:1"/>
23
+ </linearGradient>
24
+ <filter id="glow">
25
+ <feGaussianBlur stdDeviation="2" result="coloredBlur"/>
26
+ <feMerge><feMergeNode in="coloredBlur"/><feMergeNode in="SourceGraphic"/></feMerge>
27
+ </filter>
19
28
  </defs>
20
29
 
21
- <rect width="800" height="480" rx="16" ry="16" fill="url(#bgGrad)"/>
22
- <rect width="800" height="480" rx="16" ry="16" fill="none" stroke="url(#cyanPurple)" stroke-width="1" stroke-opacity="0.2"/>
23
-
24
- <text x="400" y="36" text-anchor="middle" font-family="system-ui, sans-serif" font-size="20" font-weight="700" fill="url(#titleGrad)">What's New in v3.7.25</text>
25
-
26
- <!-- Card 1: New Languages -->
27
- <g transform="translate(17, 55)">
28
- <rect width="375" height="120" rx="10" fill="url(#cardGrad)" stroke="#22c55e" stroke-width="1"/>
29
- <rect width="375" height="3" rx="1.5" fill="#22c55e"/>
30
- <text x="16" y="30" font-family="system-ui, sans-serif" font-size="14" font-weight="600" fill="#4ade80">New Language Extractors</text>
31
-
32
- <!-- Language pills -->
33
- <rect x="16" y="42" width="45" height="18" rx="4" fill="#3776AB" fill-opacity="0.2" stroke="#3776AB" stroke-width="0.5"/>
34
- <text x="38" y="55" text-anchor="middle" font-family="system-ui, sans-serif" font-size="9" font-weight="600" fill="#3776AB">Java</text>
35
-
36
- <rect x="68" y="42" width="50" height="18" rx="4" fill="#B07219" fill-opacity="0.2" stroke="#B07219" stroke-width="0.5"/>
37
- <text x="93" y="55" text-anchor="middle" font-family="system-ui, sans-serif" font-size="9" font-weight="600" fill="#B07219">Kotlin</text>
38
-
39
- <rect x="125" y="42" width="30" height="18" rx="4" fill="#00599C" fill-opacity="0.2" stroke="#00599C" stroke-width="0.5"/>
40
- <text x="140" y="55" text-anchor="middle" font-family="system-ui, sans-serif" font-size="9" font-weight="600" fill="#00599C">C</text>
41
-
42
- <rect x="162" y="42" width="38" height="18" rx="4" fill="#00599C" fill-opacity="0.2" stroke="#f34b7d" stroke-width="0.5"/>
43
- <text x="181" y="55" text-anchor="middle" font-family="system-ui, sans-serif" font-size="9" font-weight="600" fill="#f34b7d">C++</text>
44
-
45
- <rect x="207" y="42" width="45" height="18" rx="4" fill="#E34C26" fill-opacity="0.2" stroke="#E34C26" stroke-width="0.5"/>
46
- <text x="229" y="55" text-anchor="middle" font-family="system-ui, sans-serif" font-size="9" font-weight="600" fill="#E34C26">HTML</text>
47
-
48
- <text font-family="system-ui, sans-serif" font-size="10.5" fill="#8b949e">
49
- <tspan x="16" y="80">Full extractors, not generic matchers. Constructors,</tspan>
50
- <tspan x="16" dy="14">destructors, operator overloads, macros, annotations,</tspan>
51
- <tspan x="16" dy="14">records, data classes, web components. The works.</tspan>
52
- </text>
53
- </g>
54
-
55
- <!-- Card 2: Dual Scoring + Token Compression -->
56
- <g transform="translate(408, 55)">
57
- <rect width="375" height="120" rx="10" fill="url(#cardGrad)" stroke="#00bfff" stroke-width="1"/>
58
- <rect width="375" height="3" rx="1.5" fill="#00bfff"/>
59
- <text x="16" y="30" font-family="system-ui, sans-serif" font-size="14" font-weight="600" fill="#00bfff">Dual Scoring + Self-Healing Compression</text>
60
-
61
- <rect x="16" y="42" width="80" height="18" rx="4" fill="#00bfff" fill-opacity="0.15"/>
62
- <text x="56" y="55" text-anchor="middle" font-family="system-ui, sans-serif" font-size="9" font-weight="600" fill="#00bfff">ALGO+COT</text>
63
-
64
- <rect x="104" y="42" width="80" height="18" rx="4" fill="#22c55e" fill-opacity="0.15"/>
65
- <text x="144" y="55" text-anchor="middle" font-family="system-ui, sans-serif" font-size="9" font-weight="600" fill="#22c55e">CODEBOOK</text>
66
-
67
- <text font-family="system-ui, sans-serif" font-size="10.5" fill="#8b949e">
68
- <tspan x="16" y="80">Dual ALGO+COT relevance scoring shows both scores.</tspan>
69
- <tspan x="16" dy="14">Token compression with self-healing codebook learning</tspan>
70
- <tspan x="16" dy="14">and neural translation via Argos Translate.</tspan>
71
- </text>
72
- </g>
73
-
74
- <!-- Card 3: Native Swarm Support -->
75
- <g transform="translate(17, 190)">
76
- <rect width="766" height="120" rx="10" fill="url(#cardGrad)" stroke="#a855f7" stroke-width="1"/>
77
- <rect width="766" height="3" rx="1.5" fill="#a855f7"/>
78
- <text x="16" y="30" font-family="system-ui, sans-serif" font-size="14" font-weight="600" fill="#c084fc">Native Swarm Support</text>
79
-
80
- <rect x="16" y="42" width="90" height="18" rx="4" fill="#a855f7" fill-opacity="0.15"/>
81
- <text x="61" y="55" text-anchor="middle" font-family="system-ui, sans-serif" font-size="9" font-weight="600" fill="#c084fc">AGENT TEAMS</text>
82
-
83
- <rect x="114" y="42" width="110" height="18" rx="4" fill="#22c55e" fill-opacity="0.15"/>
84
- <text x="169" y="55" text-anchor="middle" font-family="system-ui, sans-serif" font-size="9" font-weight="600" fill="#22c55e">UNLIMITED SWARMS</text>
85
-
86
- <rect x="232" y="42" width="100" height="18" rx="4" fill="#00bfff" fill-opacity="0.15"/>
87
- <text x="282" y="55" text-anchor="middle" font-family="system-ui, sans-serif" font-size="9" font-weight="600" fill="#00bfff">AUTO-DEPLOY</text>
88
-
89
- <text font-family="system-ui, sans-serif" font-size="10.5" fill="#8b949e">
90
- <tspan x="16" y="80">Claude Code agent teams integration. Dynamic swarm channels,</tspan>
91
- <tspan x="16" dy="14">auto-created on first message. Agents coordinate via MCP team comms</tspan>
92
- <tspan x="16" dy="14">with token-compressed Chinese inter-agent messaging. specmem init auto-enables.</tspan>
93
- </text>
94
- </g>
95
-
96
- <!-- Coming Soon -->
97
- <g transform="translate(17, 330)">
98
- <rect width="766" height="130" rx="10" fill="url(#cardGrad)" stroke="#f59e0b" stroke-width="1"/>
99
- <rect width="766" height="3" rx="1.5" fill="#f59e0b"/>
100
- <text x="383" y="28" text-anchor="middle" font-family="system-ui, sans-serif" font-size="14" font-weight="600" fill="#fbbf24">Coming Soon</text>
101
-
102
- <!-- OCR -->
103
- <rect x="16" y="42" width="360" height="70" rx="8" fill="#1a1f26" stroke="#30363d" stroke-width="1"/>
104
- <!-- PDF icon -->
105
- <text x="30" y="64" font-family="system-ui, sans-serif" font-size="16">📄</text>
106
- <text x="52" y="62" font-family="system-ui, sans-serif" font-size="12" font-weight="600" fill="#f59e0b">OCR for PDFs</text>
107
- <text font-family="system-ui, sans-serif" font-size="10.5" fill="#8b949e">
108
- <tspan x="30" y="80">Index PDF docs in your project. Tech specs, API docs,</tspan>
109
- <tspan x="30" dy="13">architecture diagrams. All searchable by meaning.</tspan>
110
- </text>
111
-
112
- <!-- YOLO -->
113
- <rect x="390" y="42" width="360" height="70" rx="8" fill="#1a1f26" stroke="#30363d" stroke-width="1"/>
114
- <!-- Camera icon -->
115
- <text x="404" y="64" font-family="system-ui, sans-serif" font-size="16">📷</text>
116
- <text x="426" y="62" font-family="system-ui, sans-serif" font-size="12" font-weight="600" fill="#f59e0b">YOLO Image Analysis</text>
117
- <text font-family="system-ui, sans-serif" font-size="10.5" fill="#8b949e">
118
- <tspan x="404" y="80">Understand PNGs, screenshots, diagrams upon reading.</tspan>
119
- <tspan x="404" dy="13">UI mockups and flowcharts indexed and searchable.</tspan>
120
- </text>
121
- </g>
122
- </svg>
30
+ <!-- Background -->
31
+ <rect width="800" height="500" fill="url(#bgGrad)" rx="12"/>
32
+ <rect width="800" height="500" fill="none" stroke="#30363d" stroke-width="1" rx="12"/>
33
+
34
+ <!-- Header bar -->
35
+ <rect x="0" y="0" width="800" height="54" fill="url(#headerGrad)" rx="12"/>
36
+ <rect x="0" y="42" width="800" height="12" fill="url(#headerGrad)"/>
37
+
38
+ <!-- Header text -->
39
+ <text x="400" y="22" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="13" fill="#ffffff" text-anchor="middle" font-weight="700" filter="url(#glow)">WHAT'S NEW IN SPECMEM</text>
40
+ <text x="400" y="40" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="10" fill="#c3e6cb" text-anchor="middle" letter-spacing="3">v 3 . 7 . 3 2</text>
41
+
42
+ <!-- ── ROW 1: 3 cards ── -->
43
+
44
+ <!-- Card 1: Auto Model Download -->
45
+ <rect x="20" y="68" width="236" height="120" fill="url(#card1)" rx="8" stroke="#2ea04340" stroke-width="1"/>
46
+ <text x="36" y="90" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="11" fill="#2ea043" font-weight="700">⬇ AUTO MODEL DOWNLOAD</text>
47
+ <line x1="36" y1="96" x2="240" y2="96" stroke="#2ea04330" stroke-width="1"/>
48
+ <text x="36" y="113" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">Embedding + translation models</text>
49
+ <text x="36" y="128" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">auto-download on first init.</text>
50
+ <text x="36" y="143" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">Fully offline after setup.</text>
51
+ <text x="36" y="162" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="8.5" fill="#3fb950">git-lfs tracked in repo</text>
52
+ <text x="36" y="176" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="8.5" fill="#3fb950">excluded from npm tarball</text>
53
+
54
+ <!-- Card 2: No Root Required -->
55
+ <rect x="282" y="68" width="236" height="120" fill="url(#card2)" rx="8" stroke="#58a6ff40" stroke-width="1"/>
56
+ <text x="298" y="90" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="11" fill="#58a6ff" font-weight="700">🔓 NO ROOT REQUIRED</text>
57
+ <line x1="298" y1="96" x2="502" y2="96" stroke="#58a6ff30" stroke-width="1"/>
58
+ <text x="298" y="113" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">npm install -g just works on</text>
59
+ <text x="298" y="128" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">Debian, Ubuntu, Mint, Kali.</text>
60
+ <text x="298" y="143" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">No sudo. No workarounds.</text>
61
+ <text x="298" y="162" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="8.5" fill="#79c0ff">zero-dep auto-install</text>
62
+ <text x="298" y="176" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="8.5" fill="#79c0ff">streamlined init flow</text>
63
+
64
+ <!-- Card 3: Compaction Proxy -->
65
+ <rect x="544" y="68" width="236" height="120" fill="url(#card3)" rx="8" stroke="#f7853440" stroke-width="1"/>
66
+ <text x="560" y="90" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="11" fill="#f78534" font-weight="700">⚡ COMPACTION PROXY</text>
67
+ <line x1="560" y1="96" x2="764" y2="96" stroke="#f7853430" stroke-width="1"/>
68
+ <text x="560" y="113" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">Daemon intercepts compaction</text>
69
+ <text x="560" y="128" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">events, injects SpecMem</text>
70
+ <text x="560" y="143" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">context before each squeeze.</text>
71
+ <text x="560" y="162" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="8.5" fill="#ffa657">memory survives context resets</text>
72
+ <text x="560" y="176" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="8.5" fill="#ffa657">persistent across sessions</text>
73
+
74
+ <!-- ── ROW 2: 3 cards ── -->
75
+
76
+ <!-- Card 4: Concurrent Tool Calls Fixed -->
77
+ <rect x="20" y="204" width="236" height="120" fill="url(#card2)" rx="8" stroke="#58a6ff40" stroke-width="1"/>
78
+ <text x="36" y="226" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="11" fill="#58a6ff" font-weight="700">🔧 CONCURRENT TOOLS FIX</text>
79
+ <line x1="36" y1="232" x2="240" y2="232" stroke="#58a6ff30" stroke-width="1"/>
80
+ <text x="36" y="249" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">Removed artificial limitation</text>
81
+ <text x="36" y="264" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">on concurrent MCP tool calls.</text>
82
+ <text x="36" y="279" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">Full parallel execution now.</text>
83
+ <text x="36" y="298" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="8.5" fill="#79c0ff">advanced load balancing</text>
84
+ <text x="36" y="312" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="8.5" fill="#79c0ff">connection pool optimized</text>
85
+
86
+ <!-- Card 5: Token Compression -->
87
+ <rect x="282" y="204" width="236" height="120" fill="url(#card1)" rx="8" stroke="#2ea04340" stroke-width="1"/>
88
+ <text x="298" y="226" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="11" fill="#2ea043" font-weight="700">📦 TOKEN COMPRESSION</text>
89
+ <line x1="298" y1="232" x2="502" y2="232" stroke="#2ea04330" stroke-width="1"/>
90
+ <text x="298" y="249" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">Improved compression system</text>
91
+ <text x="298" y="264" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">with self-healing and better</text>
92
+ <text x="298" y="279" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">accuracy across languages.</text>
93
+ <text x="298" y="298" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="8.5" fill="#3fb950">zh/en round-trip verified</text>
94
+ <text x="298" y="312" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="8.5" fill="#3fb950">fixed token usage tracking</text>
95
+
96
+ <!-- Card 6: Sync Rate -->
97
+ <rect x="544" y="204" width="236" height="120" fill="url(#card3)" rx="8" stroke="#f7853440" stroke-width="1"/>
98
+ <text x="560" y="226" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="11" fill="#f78534" font-weight="700">🔄 SYNC INTELLIGENCE</text>
99
+ <line x1="560" y1="232" x2="764" y2="232" stroke="#f7853430" stroke-width="1"/>
100
+ <text x="560" y="249" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">Fixed -100% sync display bug.</text>
101
+ <text x="560" y="264" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">Auto-resync triggers when</text>
102
+ <text x="560" y="279" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">score drops below 85%.</text>
103
+ <text x="560" y="298" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="8.5" fill="#ffa657">debounced resync (15m default)</text>
104
+ <text x="560" y="312" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="8.5" fill="#ffa657">configurable via env vars</text>
105
+
106
+ <!-- ── ROW 3: 2 cards centered ── -->
107
+
108
+ <!-- Card 7: TUI Fixes -->
109
+ <rect x="151" y="340" width="236" height="108" fill="url(#card1)" rx="8" stroke="#2ea04340" stroke-width="1"/>
110
+ <text x="167" y="362" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="11" fill="#2ea043" font-weight="700">🖥 TUI FIXES</text>
111
+ <line x1="167" y1="368" x2="371" y2="368" stroke="#2ea04330" stroke-width="1"/>
112
+ <text x="167" y="385" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">Blessed TUI now stable across</text>
113
+ <text x="167" y="400" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">init flows. Pino/SonicBoom fd</text>
114
+ <text x="167" y="415" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">interception fixed.</text>
115
+ <text x="167" y="434" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="8.5" fill="#3fb950">no more blank screen on boot</text>
116
+
117
+ <!-- Card 8: Performance -->
118
+ <rect x="413" y="340" width="236" height="108" fill="url(#card2)" rx="8" stroke="#58a6ff40" stroke-width="1"/>
119
+ <text x="429" y="362" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="11" fill="#58a6ff" font-weight="700">🚀 PERFORMANCE</text>
120
+ <line x1="429" y1="368" x2="633" y2="368" stroke="#58a6ff30" stroke-width="1"/>
121
+ <text x="429" y="385" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">Connection pool go brrr.</text>
122
+ <text x="429" y="400" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">Reduced permission surface,</text>
123
+ <text x="429" y="415" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="9.5" fill="#8b949e">faster cold-start init.</text>
124
+ <text x="429" y="434" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="8.5" fill="#79c0ff">embed.sock lazy load, no kills</text>
125
+
126
+ <!-- Footer -->
127
+ <text x="400" y="482" font-family="'SF Mono', Monaco, Consolas, monospace" font-size="8" fill="#484f58" text-anchor="middle">specmem-hardwicksoftware • github.com/jonhardwick-spec/specmem</text>
128
+ </svg>