@hivehub/rulebook 2.0.0 → 3.0.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 (188) hide show
  1. package/README.md +779 -654
  2. package/dist/cli/commands.d.ts +22 -0
  3. package/dist/cli/commands.d.ts.map +1 -1
  4. package/dist/cli/commands.js +291 -8
  5. package/dist/cli/commands.js.map +1 -1
  6. package/dist/core/claude-mcp.d.ts +32 -0
  7. package/dist/core/claude-mcp.d.ts.map +1 -0
  8. package/dist/core/claude-mcp.js +92 -0
  9. package/dist/core/claude-mcp.js.map +1 -0
  10. package/dist/core/config-manager.d.ts.map +1 -1
  11. package/dist/core/config-manager.js +27 -6
  12. package/dist/core/config-manager.js.map +1 -1
  13. package/dist/core/generator.d.ts.map +1 -1
  14. package/dist/core/generator.js +98 -49
  15. package/dist/core/generator.js.map +1 -1
  16. package/dist/core/migrator.d.ts +13 -0
  17. package/dist/core/migrator.d.ts.map +1 -1
  18. package/dist/core/migrator.js +76 -9
  19. package/dist/core/migrator.js.map +1 -1
  20. package/dist/core/openspec-migrator.d.ts +1 -1
  21. package/dist/core/openspec-migrator.d.ts.map +1 -1
  22. package/dist/core/openspec-migrator.js +14 -7
  23. package/dist/core/openspec-migrator.js.map +1 -1
  24. package/dist/core/workflow-generator.js +297 -176
  25. package/dist/core/workflow-generator.js.map +1 -1
  26. package/dist/index.js +40 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/mcp/rulebook-server.d.ts.map +1 -1
  29. package/dist/mcp/rulebook-server.js +255 -74
  30. package/dist/mcp/rulebook-server.js.map +1 -1
  31. package/dist/memory/hnsw-index.d.ts +63 -0
  32. package/dist/memory/hnsw-index.d.ts.map +1 -0
  33. package/dist/memory/hnsw-index.js +421 -0
  34. package/dist/memory/hnsw-index.js.map +1 -0
  35. package/dist/memory/memory-cache.d.ts +33 -0
  36. package/dist/memory/memory-cache.d.ts.map +1 -0
  37. package/dist/memory/memory-cache.js +85 -0
  38. package/dist/memory/memory-cache.js.map +1 -0
  39. package/dist/memory/memory-hooks.d.ts +42 -0
  40. package/dist/memory/memory-hooks.d.ts.map +1 -0
  41. package/dist/memory/memory-hooks.js +193 -0
  42. package/dist/memory/memory-hooks.js.map +1 -0
  43. package/dist/memory/memory-manager.d.ts +55 -0
  44. package/dist/memory/memory-manager.d.ts.map +1 -0
  45. package/dist/memory/memory-manager.js +209 -0
  46. package/dist/memory/memory-manager.js.map +1 -0
  47. package/dist/memory/memory-search.d.ts +42 -0
  48. package/dist/memory/memory-search.d.ts.map +1 -0
  49. package/dist/memory/memory-search.js +166 -0
  50. package/dist/memory/memory-search.js.map +1 -0
  51. package/dist/memory/memory-store.d.ts +59 -0
  52. package/dist/memory/memory-store.d.ts.map +1 -0
  53. package/dist/memory/memory-store.js +394 -0
  54. package/dist/memory/memory-store.js.map +1 -0
  55. package/dist/memory/memory-types.d.ts +69 -0
  56. package/dist/memory/memory-types.d.ts.map +1 -0
  57. package/dist/memory/memory-types.js +7 -0
  58. package/dist/memory/memory-types.js.map +1 -0
  59. package/dist/memory/memory-vectorizer.d.ts +29 -0
  60. package/dist/memory/memory-vectorizer.d.ts.map +1 -0
  61. package/dist/memory/memory-vectorizer.js +104 -0
  62. package/dist/memory/memory-vectorizer.js.map +1 -0
  63. package/dist/types.d.ts +7 -0
  64. package/dist/types.d.ts.map +1 -1
  65. package/package.json +107 -106
  66. package/templates/cli/CLAUDE_CODE.md +114 -13
  67. package/templates/commands/rulebook-memory-save.md +48 -0
  68. package/templates/commands/rulebook-memory-search.md +47 -0
  69. package/templates/commands/rulebook-task-apply.md +2 -2
  70. package/templates/commands/rulebook-task-archive.md +2 -2
  71. package/templates/commands/rulebook-task-create.md +2 -2
  72. package/templates/commands/rulebook-task-list.md +2 -2
  73. package/templates/commands/rulebook-task-show.md +2 -2
  74. package/templates/commands/rulebook-task-validate.md +2 -2
  75. package/templates/git/CI_CD_PATTERNS.md +4 -4
  76. package/templates/git/GITHUB_ACTIONS.md +3 -3
  77. package/templates/git/GITLAB_CI.md +4 -4
  78. package/templates/git/SECRETS_MANAGEMENT.md +4 -4
  79. package/templates/hooks/COMMIT_MSG.md +4 -4
  80. package/templates/hooks/POST_CHECKOUT.md +3 -3
  81. package/templates/hooks/PREPARE_COMMIT_MSG.md +3 -3
  82. package/templates/hooks/PRE_COMMIT.md +4 -4
  83. package/templates/hooks/PRE_PUSH.md +4 -4
  84. package/templates/modules/MEMORY.md +63 -0
  85. package/templates/skills/cli/aider/SKILL.md +59 -0
  86. package/templates/skills/cli/amazon-q/SKILL.md +35 -0
  87. package/templates/skills/cli/auggie/SKILL.md +42 -0
  88. package/templates/skills/cli/claude/SKILL.md +42 -0
  89. package/templates/skills/cli/claude-code/SKILL.md +146 -0
  90. package/templates/skills/cli/cline/SKILL.md +42 -0
  91. package/templates/skills/cli/codebuddy/SKILL.md +30 -0
  92. package/templates/skills/cli/codeium/SKILL.md +30 -0
  93. package/templates/skills/cli/codex/SKILL.md +31 -0
  94. package/templates/skills/cli/continue/SKILL.md +44 -0
  95. package/templates/skills/cli/cursor-cli/SKILL.md +38 -0
  96. package/templates/skills/cli/factory/SKILL.md +28 -0
  97. package/templates/skills/cli/gemini/SKILL.md +45 -0
  98. package/templates/skills/cli/kilocode/SKILL.md +28 -0
  99. package/templates/skills/cli/opencode/SKILL.md +28 -0
  100. package/templates/skills/core/agent-automation/SKILL.md +194 -0
  101. package/templates/skills/core/dag/SKILL.md +314 -0
  102. package/templates/skills/core/documentation-rules/SKILL.md +47 -0
  103. package/templates/skills/core/quality-enforcement/SKILL.md +78 -0
  104. package/templates/skills/frameworks/angular/SKILL.md +46 -0
  105. package/templates/skills/frameworks/django/SKILL.md +93 -0
  106. package/templates/skills/frameworks/electron/SKILL.md +157 -0
  107. package/templates/skills/frameworks/flask/SKILL.md +48 -0
  108. package/templates/skills/frameworks/flutter/SKILL.md +65 -0
  109. package/templates/skills/frameworks/jquery/SKILL.md +42 -0
  110. package/templates/skills/frameworks/laravel/SKILL.md +48 -0
  111. package/templates/skills/frameworks/nestjs/SKILL.md +53 -0
  112. package/templates/skills/frameworks/nextjs/SKILL.md +137 -0
  113. package/templates/skills/frameworks/nuxt/SKILL.md +50 -0
  114. package/templates/skills/frameworks/rails/SKILL.md +76 -0
  115. package/templates/skills/frameworks/react/SKILL.md +48 -0
  116. package/templates/skills/frameworks/react-native/SKILL.md +57 -0
  117. package/templates/skills/frameworks/spring/SKILL.md +49 -0
  118. package/templates/skills/frameworks/symfony/SKILL.md +46 -0
  119. package/templates/skills/frameworks/vue/SKILL.md +46 -0
  120. package/templates/skills/frameworks/zend/SKILL.md +45 -0
  121. package/templates/skills/ides/copilot/SKILL.md +47 -0
  122. package/templates/skills/ides/cursor/SKILL.md +53 -0
  123. package/templates/skills/ides/jetbrains-ai/SKILL.md +45 -0
  124. package/templates/skills/ides/replit/SKILL.md +46 -0
  125. package/templates/skills/ides/tabnine/SKILL.md +39 -0
  126. package/templates/skills/ides/vscode/SKILL.md +50 -0
  127. package/templates/skills/ides/windsurf/SKILL.md +46 -0
  128. package/templates/skills/ides/zed/SKILL.md +42 -0
  129. package/templates/skills/languages/ada/SKILL.md +68 -0
  130. package/templates/skills/languages/c/SKILL.md +343 -0
  131. package/templates/skills/languages/cpp/SKILL.md +753 -0
  132. package/templates/skills/languages/csharp/SKILL.md +427 -0
  133. package/templates/skills/languages/dart/SKILL.md +342 -0
  134. package/templates/skills/languages/elixir/SKILL.md +464 -0
  135. package/templates/skills/languages/erlang/SKILL.md +371 -0
  136. package/templates/skills/languages/go/SKILL.md +655 -0
  137. package/templates/skills/languages/haskell/SKILL.md +187 -0
  138. package/templates/skills/languages/java/SKILL.md +617 -0
  139. package/templates/skills/languages/javascript/SKILL.md +641 -0
  140. package/templates/skills/languages/julia/SKILL.md +107 -0
  141. package/templates/skills/languages/kotlin/SKILL.md +521 -0
  142. package/templates/skills/languages/lisp/SKILL.md +110 -0
  143. package/templates/skills/languages/lua/SKILL.md +84 -0
  144. package/templates/skills/languages/objectivec/SKILL.md +100 -0
  145. package/templates/skills/languages/php/SKILL.md +426 -0
  146. package/templates/skills/languages/python/SKILL.md +692 -0
  147. package/templates/skills/languages/r/SKILL.md +360 -0
  148. package/templates/skills/languages/ruby/SKILL.md +431 -0
  149. package/templates/skills/languages/rust/SKILL.md +487 -0
  150. package/templates/skills/languages/sas/SKILL.md +83 -0
  151. package/templates/skills/languages/scala/SKILL.md +358 -0
  152. package/templates/skills/languages/solidity/SKILL.md +590 -0
  153. package/templates/skills/languages/sql/SKILL.md +147 -0
  154. package/templates/skills/languages/swift/SKILL.md +476 -0
  155. package/templates/skills/languages/zig/SKILL.md +275 -0
  156. package/templates/skills/modules/atlassian/SKILL.md +265 -0
  157. package/templates/skills/modules/context7/SKILL.md +64 -0
  158. package/templates/skills/modules/figma/SKILL.md +277 -0
  159. package/templates/skills/modules/github-mcp/SKILL.md +74 -0
  160. package/templates/skills/modules/grafana/SKILL.md +338 -0
  161. package/templates/skills/modules/memory/SKILL.md +73 -0
  162. package/templates/skills/modules/notion/SKILL.md +257 -0
  163. package/templates/skills/modules/playwright/SKILL.md +100 -0
  164. package/templates/skills/modules/rulebook-mcp/SKILL.md +166 -0
  165. package/templates/skills/modules/serena/SKILL.md +347 -0
  166. package/templates/skills/modules/supabase/SKILL.md +233 -0
  167. package/templates/skills/modules/synap/SKILL.md +79 -0
  168. package/templates/skills/modules/vectorizer/SKILL.md +73 -0
  169. package/templates/skills/services/azure-blob/SKILL.md +194 -0
  170. package/templates/skills/services/cassandra/SKILL.md +249 -0
  171. package/templates/skills/services/dynamodb/SKILL.md +318 -0
  172. package/templates/skills/services/elasticsearch/SKILL.md +357 -0
  173. package/templates/skills/services/gcs/SKILL.md +188 -0
  174. package/templates/skills/services/influxdb/SKILL.md +275 -0
  175. package/templates/skills/services/kafka/SKILL.md +351 -0
  176. package/templates/skills/services/mariadb/SKILL.md +193 -0
  177. package/templates/skills/services/memcached/SKILL.md +252 -0
  178. package/templates/skills/services/minio/SKILL.md +211 -0
  179. package/templates/skills/services/mongodb/SKILL.md +278 -0
  180. package/templates/skills/services/mysql/SKILL.md +368 -0
  181. package/templates/skills/services/neo4j/SKILL.md +257 -0
  182. package/templates/skills/services/oracle/SKILL.md +300 -0
  183. package/templates/skills/services/postgresql/SKILL.md +336 -0
  184. package/templates/skills/services/rabbitmq/SKILL.md +296 -0
  185. package/templates/skills/services/redis/SKILL.md +302 -0
  186. package/templates/skills/services/s3/SKILL.md +308 -0
  187. package/templates/skills/services/sqlite/SKILL.md +304 -0
  188. package/templates/skills/services/sqlserver/SKILL.md +304 -0
@@ -0,0 +1,421 @@
1
+ /**
2
+ * Pure TypeScript HNSW (Hierarchical Navigable Small World) Index
3
+ *
4
+ * Approximate nearest neighbor search using cosine distance.
5
+ * Zero native dependencies. Designed for <50K vectors.
6
+ */
7
+ const MAGIC_NUMBER = 0x484e5357; // 'HNSW'
8
+ const FORMAT_VERSION = 1;
9
+ export class HNSWIndex {
10
+ M;
11
+ efConstruction;
12
+ dimensions;
13
+ mL; // normalization factor for layer assignment
14
+ nodes = new Map();
15
+ entryPoint = null;
16
+ maxLayer = 0;
17
+ constructor(config) {
18
+ this.M = config.M ?? 16;
19
+ this.efConstruction = config.efConstruction ?? 200;
20
+ this.dimensions = config.dimensions;
21
+ this.mL = 1 / Math.log(this.M);
22
+ }
23
+ get size() {
24
+ return this.nodes.size;
25
+ }
26
+ /**
27
+ * Cosine distance: 1 - cosine_similarity (0 = identical, 2 = opposite)
28
+ */
29
+ cosineDistance(a, b) {
30
+ let dot = 0;
31
+ let magA = 0;
32
+ let magB = 0;
33
+ for (let i = 0; i < a.length; i++) {
34
+ dot += a[i] * b[i];
35
+ magA += a[i] * a[i];
36
+ magB += b[i] * b[i];
37
+ }
38
+ const denom = Math.sqrt(magA) * Math.sqrt(magB);
39
+ if (denom === 0)
40
+ return 1;
41
+ return 1 - dot / denom;
42
+ }
43
+ /**
44
+ * Assign a random layer for a new node
45
+ */
46
+ randomLayer() {
47
+ return Math.floor(-Math.log(Math.random()) * this.mL);
48
+ }
49
+ /**
50
+ * Greedy search at a single layer, returning ef nearest candidates
51
+ */
52
+ searchLayer(query, entryLabel, ef, layer) {
53
+ const visited = new Set();
54
+ const candidates = [];
55
+ const results = [];
56
+ const entryNode = this.nodes.get(entryLabel);
57
+ if (!entryNode)
58
+ return [];
59
+ const entryDist = this.cosineDistance(query, entryNode.vector);
60
+ candidates.push({ label: entryLabel, distance: entryDist });
61
+ results.push({ label: entryLabel, distance: entryDist });
62
+ visited.add(entryLabel);
63
+ while (candidates.length > 0) {
64
+ // Get closest candidate
65
+ candidates.sort((a, b) => a.distance - b.distance);
66
+ const current = candidates.shift();
67
+ // Get farthest result
68
+ results.sort((a, b) => a.distance - b.distance);
69
+ const farthest = results[results.length - 1];
70
+ if (current.distance > farthest.distance)
71
+ break;
72
+ const currentNode = this.nodes.get(current.label);
73
+ if (!currentNode)
74
+ continue;
75
+ const connections = currentNode.connections.get(layer);
76
+ if (!connections)
77
+ continue;
78
+ for (const neighborLabel of connections) {
79
+ if (visited.has(neighborLabel))
80
+ continue;
81
+ visited.add(neighborLabel);
82
+ const neighborNode = this.nodes.get(neighborLabel);
83
+ if (!neighborNode)
84
+ continue;
85
+ const dist = this.cosineDistance(query, neighborNode.vector);
86
+ results.sort((a, b) => a.distance - b.distance);
87
+ const currentFarthest = results[results.length - 1];
88
+ if (results.length < ef || dist < currentFarthest.distance) {
89
+ candidates.push({ label: neighborLabel, distance: dist });
90
+ results.push({ label: neighborLabel, distance: dist });
91
+ if (results.length > ef) {
92
+ results.sort((a, b) => a.distance - b.distance);
93
+ results.pop();
94
+ }
95
+ }
96
+ }
97
+ }
98
+ results.sort((a, b) => a.distance - b.distance);
99
+ return results;
100
+ }
101
+ /**
102
+ * Select M nearest neighbors from candidates, pruning for diversity
103
+ */
104
+ selectNeighbors(candidates, M) {
105
+ candidates.sort((a, b) => a.distance - b.distance);
106
+ return candidates.slice(0, M);
107
+ }
108
+ /**
109
+ * Add a vector to the index
110
+ */
111
+ add(label, vector) {
112
+ if (vector.length !== this.dimensions) {
113
+ throw new Error(`Vector dimensions mismatch: expected ${this.dimensions}, got ${vector.length}`);
114
+ }
115
+ // If label already exists, remove first
116
+ if (this.nodes.has(label)) {
117
+ this.remove(label);
118
+ }
119
+ const nodeLayer = this.randomLayer();
120
+ const node = {
121
+ label,
122
+ vector: new Float32Array(vector),
123
+ connections: new Map(),
124
+ layer: nodeLayer,
125
+ };
126
+ // Initialize connection sets for all layers
127
+ for (let l = 0; l <= nodeLayer; l++) {
128
+ node.connections.set(l, new Set());
129
+ }
130
+ this.nodes.set(label, node);
131
+ if (this.entryPoint === null) {
132
+ this.entryPoint = label;
133
+ this.maxLayer = nodeLayer;
134
+ return;
135
+ }
136
+ let currentLabel = this.entryPoint;
137
+ // Traverse from top layer to nodeLayer + 1 (greedy, single nearest)
138
+ for (let l = this.maxLayer; l > nodeLayer; l--) {
139
+ const results = this.searchLayer(vector, currentLabel, 1, l);
140
+ if (results.length > 0) {
141
+ currentLabel = results[0].label;
142
+ }
143
+ }
144
+ // Insert at layers nodeLayer down to 0
145
+ for (let l = Math.min(nodeLayer, this.maxLayer); l >= 0; l--) {
146
+ const candidates = this.searchLayer(vector, currentLabel, this.efConstruction, l);
147
+ const neighbors = this.selectNeighbors(candidates, this.M);
148
+ for (const neighbor of neighbors) {
149
+ // Bidirectional connections
150
+ node.connections.get(l).add(neighbor.label);
151
+ const neighborNode = this.nodes.get(neighbor.label);
152
+ if (neighborNode) {
153
+ if (!neighborNode.connections.has(l)) {
154
+ neighborNode.connections.set(l, new Set());
155
+ }
156
+ neighborNode.connections.get(l).add(label);
157
+ // Prune neighbor connections if exceeding M
158
+ const neighborConns = neighborNode.connections.get(l);
159
+ if (neighborConns.size > this.M * 2) {
160
+ const allCandidates = [];
161
+ for (const connLabel of neighborConns) {
162
+ if (connLabel === label)
163
+ continue;
164
+ const connNode = this.nodes.get(connLabel);
165
+ if (connNode) {
166
+ allCandidates.push({
167
+ label: connLabel,
168
+ distance: this.cosineDistance(neighborNode.vector, connNode.vector),
169
+ });
170
+ }
171
+ }
172
+ const kept = this.selectNeighbors(allCandidates, this.M * 2);
173
+ neighborConns.clear();
174
+ neighborConns.add(label); // always keep the new connection
175
+ for (const k of kept) {
176
+ neighborConns.add(k.label);
177
+ }
178
+ }
179
+ }
180
+ }
181
+ if (candidates.length > 0) {
182
+ currentLabel = candidates[0].label;
183
+ }
184
+ }
185
+ // Update entry point if new node has higher layer
186
+ if (nodeLayer > this.maxLayer) {
187
+ this.entryPoint = label;
188
+ this.maxLayer = nodeLayer;
189
+ }
190
+ }
191
+ /**
192
+ * Search k nearest neighbors
193
+ */
194
+ search(query, k, ef) {
195
+ if (this.entryPoint === null || this.nodes.size === 0) {
196
+ return [];
197
+ }
198
+ if (query.length !== this.dimensions) {
199
+ throw new Error(`Query dimensions mismatch: expected ${this.dimensions}, got ${query.length}`);
200
+ }
201
+ const searchEf = Math.max(ef ?? 50, k);
202
+ let currentLabel = this.entryPoint;
203
+ // Traverse from top layer to layer 1 (greedy, single nearest)
204
+ for (let l = this.maxLayer; l > 0; l--) {
205
+ const results = this.searchLayer(query, currentLabel, 1, l);
206
+ if (results.length > 0) {
207
+ currentLabel = results[0].label;
208
+ }
209
+ }
210
+ // Search at layer 0 with ef candidates
211
+ const candidates = this.searchLayer(query, currentLabel, searchEf, 0);
212
+ return candidates.slice(0, k);
213
+ }
214
+ /**
215
+ * Remove a vector from the index
216
+ */
217
+ remove(label) {
218
+ const node = this.nodes.get(label);
219
+ if (!node)
220
+ return;
221
+ // Remove all connections to this node
222
+ for (const [layer, connections] of node.connections) {
223
+ for (const neighborLabel of connections) {
224
+ const neighborNode = this.nodes.get(neighborLabel);
225
+ if (neighborNode) {
226
+ const neighborConns = neighborNode.connections.get(layer);
227
+ if (neighborConns) {
228
+ neighborConns.delete(label);
229
+ }
230
+ }
231
+ }
232
+ }
233
+ this.nodes.delete(label);
234
+ // Update entry point if needed
235
+ if (this.entryPoint === label) {
236
+ if (this.nodes.size === 0) {
237
+ this.entryPoint = null;
238
+ this.maxLayer = 0;
239
+ }
240
+ else {
241
+ // Find node with highest layer
242
+ let bestLabel = '';
243
+ let bestLayer = -1;
244
+ for (const [l, n] of this.nodes) {
245
+ if (n.layer > bestLayer) {
246
+ bestLayer = n.layer;
247
+ bestLabel = l;
248
+ }
249
+ }
250
+ this.entryPoint = bestLabel;
251
+ this.maxLayer = bestLayer;
252
+ }
253
+ }
254
+ }
255
+ /**
256
+ * Serialize the index to an ArrayBuffer for disk persistence
257
+ * Format: [magic:u32][version:u8][dimensions:u32][M:u16][nodeCount:u32][...nodes]
258
+ */
259
+ serialize() {
260
+ const nodeEntries = Array.from(this.nodes.entries());
261
+ const labelToIndex = new Map();
262
+ nodeEntries.forEach(([label], i) => labelToIndex.set(label, i));
263
+ // Calculate buffer size
264
+ let size = 4 + 1 + 4 + 2 + 4; // header
265
+ size += 4; // entryPointIndex
266
+ size += 4; // maxLayer
267
+ for (const [, node] of nodeEntries) {
268
+ const labelBytes = new TextEncoder().encode(node.label);
269
+ size += 2 + labelBytes.length; // label length + label
270
+ size += this.dimensions * 4; // vector (float32)
271
+ size += 4; // node layer
272
+ size += 4; // connection layer count
273
+ for (const [, connections] of node.connections) {
274
+ size += 4; // layer number
275
+ size += 4; // connection count
276
+ size += connections.size * 4; // neighbor indices (u32)
277
+ }
278
+ }
279
+ const buffer = new ArrayBuffer(size);
280
+ const view = new DataView(buffer);
281
+ let offset = 0;
282
+ // Header
283
+ view.setUint32(offset, MAGIC_NUMBER, true);
284
+ offset += 4;
285
+ view.setUint8(offset, FORMAT_VERSION);
286
+ offset += 1;
287
+ view.setUint32(offset, this.dimensions, true);
288
+ offset += 4;
289
+ view.setUint16(offset, this.M, true);
290
+ offset += 2;
291
+ view.setUint32(offset, nodeEntries.length, true);
292
+ offset += 4;
293
+ view.setInt32(offset, this.entryPoint ? labelToIndex.get(this.entryPoint) : -1, true);
294
+ offset += 4;
295
+ view.setUint32(offset, this.maxLayer, true);
296
+ offset += 4;
297
+ // Nodes
298
+ const encoder = new TextEncoder();
299
+ for (const [, node] of nodeEntries) {
300
+ const labelBytes = encoder.encode(node.label);
301
+ view.setUint16(offset, labelBytes.length, true);
302
+ offset += 2;
303
+ new Uint8Array(buffer, offset, labelBytes.length).set(labelBytes);
304
+ offset += labelBytes.length;
305
+ // Vector
306
+ for (let i = 0; i < this.dimensions; i++) {
307
+ view.setFloat32(offset, node.vector[i], true);
308
+ offset += 4;
309
+ }
310
+ // Layer
311
+ view.setUint32(offset, node.layer, true);
312
+ offset += 4;
313
+ // Connections
314
+ const layerCount = node.connections.size;
315
+ view.setUint32(offset, layerCount, true);
316
+ offset += 4;
317
+ for (const [layer, connections] of node.connections) {
318
+ view.setUint32(offset, layer, true);
319
+ offset += 4;
320
+ view.setUint32(offset, connections.size, true);
321
+ offset += 4;
322
+ for (const neighborLabel of connections) {
323
+ const idx = labelToIndex.get(neighborLabel);
324
+ view.setUint32(offset, idx ?? 0, true);
325
+ offset += 4;
326
+ }
327
+ }
328
+ }
329
+ return buffer;
330
+ }
331
+ /**
332
+ * Deserialize an index from an ArrayBuffer
333
+ */
334
+ static deserialize(buffer) {
335
+ const view = new DataView(buffer);
336
+ let offset = 0;
337
+ const decoder = new TextDecoder();
338
+ // Header
339
+ const magic = view.getUint32(offset, true);
340
+ offset += 4;
341
+ if (magic !== MAGIC_NUMBER) {
342
+ throw new Error('Invalid HNSW index file');
343
+ }
344
+ const version = view.getUint8(offset);
345
+ offset += 1;
346
+ if (version !== FORMAT_VERSION) {
347
+ throw new Error(`Unsupported HNSW format version: ${version}`);
348
+ }
349
+ const dimensions = view.getUint32(offset, true);
350
+ offset += 4;
351
+ const M = view.getUint16(offset, true);
352
+ offset += 2;
353
+ const nodeCount = view.getUint32(offset, true);
354
+ offset += 4;
355
+ const entryPointIndex = view.getInt32(offset, true);
356
+ offset += 4;
357
+ const maxLayer = view.getUint32(offset, true);
358
+ offset += 4;
359
+ const index = new HNSWIndex({ dimensions, M });
360
+ index.maxLayer = maxLayer;
361
+ // Read all nodes first (labels + vectors + layers)
362
+ const labels = [];
363
+ const nodeData = [];
364
+ for (let n = 0; n < nodeCount; n++) {
365
+ const labelLen = view.getUint16(offset, true);
366
+ offset += 2;
367
+ const labelBytes = new Uint8Array(buffer, offset, labelLen);
368
+ const label = decoder.decode(labelBytes);
369
+ offset += labelLen;
370
+ labels.push(label);
371
+ const vector = new Float32Array(dimensions);
372
+ for (let i = 0; i < dimensions; i++) {
373
+ vector[i] = view.getFloat32(offset, true);
374
+ offset += 4;
375
+ }
376
+ const layer = view.getUint32(offset, true);
377
+ offset += 4;
378
+ const layerCount = view.getUint32(offset, true);
379
+ offset += 4;
380
+ const connectionLayers = [];
381
+ for (let lc = 0; lc < layerCount; lc++) {
382
+ const connLayer = view.getUint32(offset, true);
383
+ offset += 4;
384
+ const connCount = view.getUint32(offset, true);
385
+ offset += 4;
386
+ const neighborIndices = [];
387
+ for (let c = 0; c < connCount; c++) {
388
+ neighborIndices.push(view.getUint32(offset, true));
389
+ offset += 4;
390
+ }
391
+ connectionLayers.push({ layer: connLayer, neighborIndices });
392
+ }
393
+ nodeData.push({ label, vector, layer, connectionLayers });
394
+ }
395
+ // Reconstruct nodes with proper connections
396
+ for (const data of nodeData) {
397
+ const connections = new Map();
398
+ for (const cl of data.connectionLayers) {
399
+ const neighbors = new Set();
400
+ for (const idx of cl.neighborIndices) {
401
+ if (idx < labels.length) {
402
+ neighbors.add(labels[idx]);
403
+ }
404
+ }
405
+ connections.set(cl.layer, neighbors);
406
+ }
407
+ const node = {
408
+ label: data.label,
409
+ vector: data.vector,
410
+ connections,
411
+ layer: data.layer,
412
+ };
413
+ index.nodes.set(data.label, node);
414
+ }
415
+ if (entryPointIndex >= 0 && entryPointIndex < labels.length) {
416
+ index.entryPoint = labels[entryPointIndex];
417
+ }
418
+ return index;
419
+ }
420
+ }
421
+ //# sourceMappingURL=hnsw-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hnsw-index.js","sourceRoot":"","sources":["../../src/memory/hnsw-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Cache Size Limiter with LRU Eviction
3
+ *
4
+ * Enforces configurable max database size (default 500MB)
5
+ * using LRU-based eviction to protect the SSD.
6
+ */
7
+ import type { MemoryStore } from './memory-store.js';
8
+ import type { HNSWIndex } from './hnsw-index.js';
9
+ export interface EvictionResult {
10
+ evictedCount: number;
11
+ freedBytes: number;
12
+ }
13
+ export declare class MemoryCache {
14
+ private store;
15
+ private index;
16
+ private maxSizeBytes;
17
+ constructor(store: MemoryStore, index: HNSWIndex, maxSizeBytes?: number);
18
+ getCurrentSize(): number;
19
+ getUsagePercent(): number;
20
+ isOverLimit(): boolean;
21
+ /**
22
+ * Check and evict if over limit
23
+ * Returns number of evicted memories and freed bytes
24
+ */
25
+ checkAndEvict(activeSessionId?: string): EvictionResult;
26
+ /**
27
+ * Force eviction regardless of current size.
28
+ * Evicts at least one batch of candidates.
29
+ */
30
+ forceEvict(activeSessionId?: string): EvictionResult;
31
+ private evict;
32
+ }
33
+ //# sourceMappingURL=memory-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-cache.d.ts","sourceRoot":"","sources":["../../src/memory/memory-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAMjD,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,WAAW;IAIpB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,KAAK;IAJf,OAAO,CAAC,YAAY,CAAS;gBAGnB,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,SAAS,EACxB,YAAY,CAAC,EAAE,MAAM;IAKvB,cAAc,IAAI,MAAM;IAIxB,eAAe,IAAI,MAAM;IAIzB,WAAW,IAAI,OAAO;IAItB;;;OAGG;IACH,aAAa,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,cAAc;IAQvD;;;OAGG;IACH,UAAU,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,cAAc;IAoCpD,OAAO,CAAC,KAAK;CAuBd"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Cache Size Limiter with LRU Eviction
3
+ *
4
+ * Enforces configurable max database size (default 500MB)
5
+ * using LRU-based eviction to protect the SSD.
6
+ */
7
+ const DEFAULT_MAX_SIZE = 524288000; // 500MB
8
+ const EVICTION_BATCH_SIZE = 100;
9
+ const TARGET_USAGE = 0.85; // 85% — evict until 15% headroom
10
+ export class MemoryCache {
11
+ store;
12
+ index;
13
+ maxSizeBytes;
14
+ constructor(store, index, maxSizeBytes) {
15
+ this.store = store;
16
+ this.index = index;
17
+ this.maxSizeBytes = maxSizeBytes ?? DEFAULT_MAX_SIZE;
18
+ }
19
+ getCurrentSize() {
20
+ return this.store.getDbSizeBytes();
21
+ }
22
+ getUsagePercent() {
23
+ return (this.getCurrentSize() / this.maxSizeBytes) * 100;
24
+ }
25
+ isOverLimit() {
26
+ return this.getCurrentSize() > this.maxSizeBytes;
27
+ }
28
+ /**
29
+ * Check and evict if over limit
30
+ * Returns number of evicted memories and freed bytes
31
+ */
32
+ checkAndEvict(activeSessionId) {
33
+ if (!this.isOverLimit()) {
34
+ return { evictedCount: 0, freedBytes: 0 };
35
+ }
36
+ return this.evict(activeSessionId);
37
+ }
38
+ /**
39
+ * Force eviction regardless of current size.
40
+ * Evicts at least one batch of candidates.
41
+ */
42
+ forceEvict(activeSessionId) {
43
+ const sizeBefore = this.getCurrentSize();
44
+ let evictedCount = 0;
45
+ // Always run at least one batch
46
+ const candidates = this.store.getEvictionCandidates(EVICTION_BATCH_SIZE, activeSessionId);
47
+ for (const candidate of candidates) {
48
+ this.store.deleteMemory(candidate.id);
49
+ this.index.remove(candidate.id);
50
+ evictedCount++;
51
+ }
52
+ // If still over target, keep evicting
53
+ const targetSize = this.maxSizeBytes * TARGET_USAGE;
54
+ while (this.getCurrentSize() > targetSize) {
55
+ const moreCandidates = this.store.getEvictionCandidates(EVICTION_BATCH_SIZE, activeSessionId);
56
+ if (moreCandidates.length === 0)
57
+ break;
58
+ for (const candidate of moreCandidates) {
59
+ this.store.deleteMemory(candidate.id);
60
+ this.index.remove(candidate.id);
61
+ evictedCount++;
62
+ }
63
+ }
64
+ const freedBytes = sizeBefore - this.getCurrentSize();
65
+ return { evictedCount, freedBytes: Math.max(0, freedBytes) };
66
+ }
67
+ evict(activeSessionId) {
68
+ const sizeBefore = this.getCurrentSize();
69
+ const targetSize = this.maxSizeBytes * TARGET_USAGE;
70
+ let evictedCount = 0;
71
+ while (this.getCurrentSize() > targetSize) {
72
+ const candidates = this.store.getEvictionCandidates(EVICTION_BATCH_SIZE, activeSessionId);
73
+ if (candidates.length === 0)
74
+ break;
75
+ for (const candidate of candidates) {
76
+ this.store.deleteMemory(candidate.id);
77
+ this.index.remove(candidate.id);
78
+ evictedCount++;
79
+ }
80
+ }
81
+ const freedBytes = sizeBefore - this.getCurrentSize();
82
+ return { evictedCount, freedBytes: Math.max(0, freedBytes) };
83
+ }
84
+ }
85
+ //# sourceMappingURL=memory-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-cache.js","sourceRoot":"","sources":["../../src/memory/memory-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Agent Capture Hooks
3
+ *
4
+ * Auto-classification heuristics and capture adapters
5
+ * for Claude Code, Cursor, and Gemini agent output.
6
+ *
7
+ * Also provides MCP auto-capture: intercepts tool calls
8
+ * and automatically saves significant interactions to memory.
9
+ */
10
+ import type { MemoryType } from './memory-types.js';
11
+ export interface CapturedMemory {
12
+ type: MemoryType;
13
+ title: string;
14
+ content: string;
15
+ tags?: string[];
16
+ }
17
+ /**
18
+ * Classify memory content by type using keyword heuristics
19
+ */
20
+ export declare function classifyMemory(content: string): MemoryType;
21
+ /**
22
+ * Extract a short title from content (first meaningful line, truncated)
23
+ */
24
+ export declare function extractTitle(content: string, maxLength?: number): string;
25
+ /**
26
+ * Capture memories from Claude Code agent output
27
+ */
28
+ export declare function captureFromClaudeCode(output: string, _sessionId: string): CapturedMemory[];
29
+ /**
30
+ * Capture memories from Cursor agent output
31
+ */
32
+ export declare function captureFromCursor(output: string, _sessionId: string): CapturedMemory[];
33
+ /**
34
+ * Capture memories from Gemini agent output
35
+ */
36
+ export declare function captureFromGemini(output: string, _sessionId: string): CapturedMemory[];
37
+ /**
38
+ * Build a memory from an MCP tool call and its result.
39
+ * Returns null if the interaction is not worth capturing.
40
+ */
41
+ export declare function captureFromToolCall(toolName: string, args: Record<string, unknown>, result: string): CapturedMemory | null;
42
+ //# sourceMappingURL=memory-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-hooks.d.ts","sourceRoot":"","sources":["../../src/memory/memory-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAWD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAO1D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,MAAW,GAAG,MAAM,CAY5E;AAmBD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,cAAc,EAAE,CAOlB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,cAAc,EAAE,CAOlB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,cAAc,EAAE,CAOlB;AAyCD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,MAAM,GACb,cAAc,GAAG,IAAI,CA+BvB"}