hippo-memory 0.2.0 → 0.3.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.
package/dist/import.js ADDED
@@ -0,0 +1,307 @@
1
+ /**
2
+ * Import memories from external sources.
3
+ *
4
+ * Supported formats:
5
+ * --chatgpt <file> ChatGPT memories.json or plain text
6
+ * --claude <file> CLAUDE.md (skips hippo:start/end blocks)
7
+ * --cursor <file> .cursorrules
8
+ * --file <file> Generic one-memory-per-line
9
+ * --markdown <file> Structured markdown with heading hierarchy as tags
10
+ */
11
+ import * as fs from 'fs';
12
+ import { createMemory, Layer } from './memory.js';
13
+ import { isInitialized, writeEntry, loadAllEntries, updateStats, } from './store.js';
14
+ import { getGlobalRoot, initGlobal } from './shared.js';
15
+ import { isEmbeddingAvailable, embedMemory } from './embeddings.js';
16
+ // ---------------------------------------------------------------------------
17
+ // Normalisation for deduplication
18
+ // ---------------------------------------------------------------------------
19
+ function normalise(text) {
20
+ return text
21
+ .toLowerCase()
22
+ .replace(/[^\w\s]/g, '')
23
+ .replace(/\s+/g, ' ')
24
+ .trim();
25
+ }
26
+ function isDuplicate(content, existing) {
27
+ const norm = normalise(content);
28
+ if (!norm)
29
+ return true; // empty content counts as duplicate
30
+ for (const e of existing) {
31
+ if (normalise(e.content) === norm)
32
+ return true;
33
+ }
34
+ return false;
35
+ }
36
+ // ---------------------------------------------------------------------------
37
+ // Parsers
38
+ // ---------------------------------------------------------------------------
39
+ /** Parse ChatGPT memories.json or plain text file. */
40
+ export function parseChatGPT(raw) {
41
+ const trimmed = raw.trim();
42
+ // Try JSON first
43
+ if (trimmed.startsWith('[') || trimmed.startsWith('{')) {
44
+ try {
45
+ const parsed = JSON.parse(trimmed);
46
+ const arr = Array.isArray(parsed) ? parsed : [parsed];
47
+ return arr
48
+ .map((item) => {
49
+ if (typeof item === 'string')
50
+ return item.trim();
51
+ if (item && typeof item === 'object' && 'content' in item) {
52
+ return String(item.content).trim();
53
+ }
54
+ return '';
55
+ })
56
+ .filter((s) => s.length > 0);
57
+ }
58
+ catch {
59
+ // Fall through to line-based parsing
60
+ }
61
+ }
62
+ // Plain text: one memory per line
63
+ return trimmed
64
+ .split('\n')
65
+ .map((l) => l.trim())
66
+ .filter((l) => l.length > 0);
67
+ }
68
+ /** Parse CLAUDE.md, extracting bullet points and sections. Skips hippo blocks. */
69
+ export function parseClaude(raw) {
70
+ // Remove <!-- hippo:start -->...<!-- hippo:end --> blocks
71
+ const cleaned = raw.replace(/<!--\s*hippo:start\s*-->[\s\S]*?<!--\s*hippo:end\s*-->/g, '');
72
+ const memories = [];
73
+ const lines = cleaned.split('\n');
74
+ for (const line of lines) {
75
+ const trimmed = line.trim();
76
+ // Skip headings, empty lines, code fences, HTML comments
77
+ if (!trimmed)
78
+ continue;
79
+ if (trimmed.startsWith('#'))
80
+ continue;
81
+ if (trimmed.startsWith('```'))
82
+ continue;
83
+ if (trimmed.startsWith('<!--'))
84
+ continue;
85
+ if (trimmed.startsWith('---'))
86
+ continue;
87
+ // Extract bullet point content (-, *, numbered)
88
+ const bulletMatch = trimmed.match(/^[-*]\s+(.+)/) || trimmed.match(/^\d+\.\s+(.+)/);
89
+ if (bulletMatch) {
90
+ const content = bulletMatch[1].trim();
91
+ if (content.length > 3) {
92
+ memories.push(content);
93
+ }
94
+ continue;
95
+ }
96
+ // Plain text paragraphs (non-bullet, non-heading lines that have substance)
97
+ if (trimmed.length > 10 && !trimmed.startsWith('|')) {
98
+ memories.push(trimmed);
99
+ }
100
+ }
101
+ return memories;
102
+ }
103
+ /** Parse .cursorrules, splitting rules into individual memories. */
104
+ export function parseCursor(raw) {
105
+ const memories = [];
106
+ const lines = raw.split('\n');
107
+ // Collect multi-line rules separated by blank lines or comment headers
108
+ let currentRule = [];
109
+ const flushRule = () => {
110
+ const text = currentRule
111
+ .map((l) => l.replace(/^#\s*/, '').trim())
112
+ .filter((l) => l.length > 0)
113
+ .join(' ')
114
+ .trim();
115
+ if (text.length > 5) {
116
+ memories.push(text);
117
+ }
118
+ currentRule = [];
119
+ };
120
+ for (const line of lines) {
121
+ const trimmed = line.trim();
122
+ if (!trimmed) {
123
+ // Blank line: flush the current rule
124
+ if (currentRule.length > 0)
125
+ flushRule();
126
+ continue;
127
+ }
128
+ // Bullet points are individual rules
129
+ const bulletMatch = trimmed.match(/^[-*]\s+(.+)/);
130
+ if (bulletMatch) {
131
+ if (currentRule.length > 0)
132
+ flushRule();
133
+ const content = bulletMatch[1].trim();
134
+ if (content.length > 3) {
135
+ memories.push(content);
136
+ }
137
+ continue;
138
+ }
139
+ // Numbered rules
140
+ const numMatch = trimmed.match(/^\d+\.\s+(.+)/);
141
+ if (numMatch) {
142
+ if (currentRule.length > 0)
143
+ flushRule();
144
+ const content = numMatch[1].trim();
145
+ if (content.length > 3) {
146
+ memories.push(content);
147
+ }
148
+ continue;
149
+ }
150
+ currentRule.push(trimmed);
151
+ }
152
+ if (currentRule.length > 0)
153
+ flushRule();
154
+ return memories;
155
+ }
156
+ /** Parse generic file: one memory per non-empty line. */
157
+ export function parseFile(raw) {
158
+ return raw
159
+ .split('\n')
160
+ .map((l) => l.trim())
161
+ .filter((l) => l.length > 0);
162
+ }
163
+ /** Slugify a heading for use as a tag. */
164
+ function slugify(heading) {
165
+ return heading
166
+ .toLowerCase()
167
+ .replace(/[^\w\s-]/g, '')
168
+ .replace(/\s+/g, '-')
169
+ .replace(/-+/g, '-')
170
+ .replace(/^-|-$/g, '')
171
+ .slice(0, 40);
172
+ }
173
+ /** Parse structured markdown preserving heading hierarchy as tags. */
174
+ export function parseMarkdown(raw) {
175
+ const results = [];
176
+ const lines = raw.split('\n');
177
+ // Track current heading hierarchy
178
+ const headingStack = [];
179
+ const getCurrentTags = () => headingStack.map((h) => h.tag);
180
+ for (const line of lines) {
181
+ const trimmed = line.trim();
182
+ if (!trimmed)
183
+ continue;
184
+ // Check for heading
185
+ const headingMatch = trimmed.match(/^(#{1,6})\s+(.+)/);
186
+ if (headingMatch) {
187
+ const level = headingMatch[1].length;
188
+ const tag = slugify(headingMatch[2]);
189
+ // Pop headings at same or deeper level
190
+ while (headingStack.length > 0 && headingStack[headingStack.length - 1].level >= level) {
191
+ headingStack.pop();
192
+ }
193
+ if (tag) {
194
+ headingStack.push({ level, tag });
195
+ }
196
+ continue;
197
+ }
198
+ // Skip code fences, HTML comments, horizontal rules
199
+ if (trimmed.startsWith('```'))
200
+ continue;
201
+ if (trimmed.startsWith('<!--'))
202
+ continue;
203
+ if (trimmed.startsWith('---'))
204
+ continue;
205
+ // Bullet points
206
+ const bulletMatch = trimmed.match(/^[-*]\s+(.+)/) || trimmed.match(/^\d+\.\s+(.+)/);
207
+ if (bulletMatch) {
208
+ const content = bulletMatch[1].trim();
209
+ if (content.length > 3) {
210
+ results.push({ content, tags: getCurrentTags() });
211
+ }
212
+ continue;
213
+ }
214
+ // Plain text with substance
215
+ if (trimmed.length > 10 && !trimmed.startsWith('|')) {
216
+ results.push({ content: trimmed, tags: getCurrentTags() });
217
+ }
218
+ }
219
+ return results;
220
+ }
221
+ export function cmdImport(hippoRoot, options) {
222
+ const useGlobal = options.global;
223
+ const targetRoot = useGlobal ? getGlobalRoot() : hippoRoot;
224
+ if (useGlobal) {
225
+ initGlobal();
226
+ }
227
+ else {
228
+ if (!isInitialized(hippoRoot)) {
229
+ console.error('No .hippo directory found. Run `hippo init` first.');
230
+ process.exit(1);
231
+ }
232
+ }
233
+ // Read source file
234
+ if (!fs.existsSync(options.filePath)) {
235
+ console.error(`File not found: ${options.filePath}`);
236
+ process.exit(1);
237
+ }
238
+ const raw = fs.readFileSync(options.filePath, 'utf8');
239
+ // Parse based on format
240
+ let items;
241
+ switch (options.format) {
242
+ case 'chatgpt': {
243
+ const memories = parseChatGPT(raw);
244
+ items = memories.map((m) => ({ content: m, tags: ['chatgpt-import'] }));
245
+ break;
246
+ }
247
+ case 'claude': {
248
+ const memories = parseClaude(raw);
249
+ items = memories.map((m) => ({ content: m, tags: ['claude-import'] }));
250
+ break;
251
+ }
252
+ case 'cursor': {
253
+ const memories = parseCursor(raw);
254
+ items = memories.map((m) => ({ content: m, tags: ['cursor-import'] }));
255
+ break;
256
+ }
257
+ case 'file': {
258
+ const memories = parseFile(raw);
259
+ items = memories.map((m) => ({ content: m, tags: ['file-import'] }));
260
+ break;
261
+ }
262
+ case 'markdown': {
263
+ items = parseMarkdown(raw).map((m) => ({
264
+ content: m.content,
265
+ tags: [...m.tags, 'markdown-import'],
266
+ }));
267
+ break;
268
+ }
269
+ }
270
+ // Load existing memories for deduplication
271
+ const existing = loadAllEntries(targetRoot);
272
+ let imported = 0;
273
+ let skipped = 0;
274
+ for (const item of items) {
275
+ if (isDuplicate(item.content, existing)) {
276
+ skipped++;
277
+ if (options.dryRun) {
278
+ console.log(` [skip] ${item.content.slice(0, 80)}...`);
279
+ }
280
+ continue;
281
+ }
282
+ if (options.dryRun) {
283
+ const tagStr = item.tags.length > 0 ? ` [${item.tags.join(', ')}]` : '';
284
+ console.log(` [import] ${item.content.slice(0, 100)}${tagStr}`);
285
+ }
286
+ else {
287
+ const entry = createMemory(item.content, {
288
+ layer: Layer.Episodic,
289
+ tags: item.tags,
290
+ source: `import-${options.format}`,
291
+ confidence: 'inferred',
292
+ });
293
+ writeEntry(targetRoot, entry);
294
+ updateStats(targetRoot, { remembered: 1 });
295
+ // Also add to existing list for within-batch dedup
296
+ existing.push(entry);
297
+ if (isEmbeddingAvailable()) {
298
+ embedMemory(targetRoot, entry).catch(() => { });
299
+ }
300
+ }
301
+ imported++;
302
+ }
303
+ const prefix = options.dryRun ? '[dry-run] ' : '';
304
+ const globalPrefix = useGlobal ? '[global] ' : '';
305
+ console.log(`\n${prefix}${globalPrefix}Imported ${imported} memories (${skipped} skipped as duplicates)`);
306
+ }
307
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../src/import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Memory importers for Hippo.
3
+ * Imports memories from ChatGPT, Claude, Cursor, generic files, and structured markdown.
4
+ */
5
+ import { MemoryEntry } from './memory.js';
6
+ export interface ImportResult {
7
+ total: number;
8
+ imported: number;
9
+ skipped: number;
10
+ entries: MemoryEntry[];
11
+ }
12
+ export interface ImportOptions {
13
+ dryRun?: boolean;
14
+ global?: boolean;
15
+ extraTags?: string[];
16
+ hippoRoot: string;
17
+ }
18
+ /**
19
+ * Given an array of raw text chunks, deduplicate against existing memories,
20
+ * create MemoryEntry objects, write them (unless dry-run), and return a result.
21
+ */
22
+ export declare function importEntries(chunks: string[], source: string, tags: string[], options: ImportOptions): ImportResult;
23
+ export declare function importChatGPT(filePath: string, options: ImportOptions): ImportResult;
24
+ export declare function importClaude(filePath: string, options: ImportOptions): ImportResult;
25
+ export declare function importCursor(filePath: string, options: ImportOptions): ImportResult;
26
+ export declare function importGenericFile(filePath: string, options: ImportOptions): ImportResult;
27
+ export declare function importMarkdown(filePath: string, options: ImportOptions): ImportResult;
28
+ //# sourceMappingURL=importers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importers.d.ts","sourceRoot":"","sources":["../src/importers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAuB,WAAW,EAAE,MAAM,aAAa,CAAC;AAS/D,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,aAAa,GACrB,YAAY,CA4Dd;AA0DD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,YAAY,CAGpF;AA8GD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,YAAY,CAGnF;AA4DD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,YAAY,CAInF;AA2BD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,YAAY,CAGxF;AAyED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,YAAY,CA2BrF"}