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.
- package/CHANGELOG.md +22 -0
- package/README.md +12 -0
- package/bootstrap.cjs +19 -0
- package/claude-hooks/bash-call-enforcer.cjs +140 -0
- package/claude-hooks/settings.json +132 -0
- package/claude-hooks/specmem-drilldown-hook.cjs +49 -2
- package/claude-hooks/specmem-drilldown-hook.js +49 -2
- package/claude-hooks/specmem-drilldown-hook.js.bak +495 -0
- package/claude-hooks/specmem-precompact.cjs +13 -36
- package/claude-hooks/specmem-precompact.js +3 -7
- package/claude-hooks/specmem-search-enforcer.cjs +229 -0
- package/claude-hooks/specmem-search-tracker.cjs +71 -0
- package/claude-hooks/specmem-session-start.cjs +38 -50
- package/claude-hooks/specmem-session-start.js +19 -60
- package/dist/config.js +11 -16
- package/dist/db/connectionPoolGoBrrr.js +3 -3
- package/dist/index.js +21 -4
- package/dist/mcp/compactionProxy.js +21 -1
- package/dist/mcp/embeddingServerManager.js +15 -1
- package/dist/mcp/mcpProtocolHandler.js +22 -4
- package/dist/mcp/specMemServer.js +16 -3
- package/dist/mcp/toolRegistry.js +19 -21
- package/dist/tools/goofy/checkSyncStatus.js +14 -7
- package/dist/watcher/fileWatcher.js +57 -20
- package/dist/watcher/index.js +26 -0
- package/dist/watcher/syncChecker.js +11 -7
- package/package.json +1 -1
- package/scripts/global-postinstall.cjs +7 -2
- package/scripts/specmem-init.cjs +5 -0
- package/specmem/model-config.json +26 -6
- package/specmem/supervisord.conf +1 -1
- package/specmem/user-config.json +12 -0
- package/svg-sections/readme-install.svg +35 -29
- 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
|
|
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="
|
|
30
|
-
<rect width="700" height="
|
|
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 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="
|
|
35
|
+
<line x1="50" y1="78" x2="50" y2="168" stroke="#2d333b" stroke-width="2" stroke-dasharray="4,4"/>
|
|
36
36
|
|
|
37
|
-
<!-- Step 1
|
|
38
|
-
<g transform="translate(30,
|
|
39
|
-
<circle cx="20" cy="
|
|
40
|
-
<text x="20" y="
|
|
41
|
-
<rect x="
|
|
42
|
-
<text x="
|
|
43
|
-
<text x="
|
|
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
|
|
54
|
-
<g transform="translate(30,
|
|
55
|
-
<circle cx="20" cy="
|
|
56
|
-
<text x="20" y="
|
|
57
|
-
<rect x="
|
|
58
|
-
<text x="
|
|
59
|
-
<text x="
|
|
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/
|
|
62
|
-
|
|
63
|
-
|
|
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,
|
|
71
|
-
<circle cx="20" cy="
|
|
72
|
-
<path d="M13
|
|
73
|
-
<text x="
|
|
74
|
-
<text x="
|
|
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
|
|
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="
|
|
8
|
-
<stop offset="0%" style="stop-color:#
|
|
9
|
-
<stop offset="
|
|
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="
|
|
12
|
-
<stop offset="0%" style="stop-color:#
|
|
13
|
-
<stop offset="100%" style="stop-color:#
|
|
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="
|
|
16
|
-
<stop offset="0%" style="stop-color:#
|
|
17
|
-
<stop offset="100%" style="stop-color:#
|
|
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
|
-
|
|
22
|
-
<rect width="800" height="
|
|
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
|
-
<!-- Card
|
|
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
|
-
</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>
|