- File-based memory under .boocode/memory/ (project/user/reference topics) - Hierarchical 4-scope scan: global → home → project → session - Keyword/tag relevance matching for query-based recall - Injected as <boocode-memory> block in system prompt at assembly - v1 recall-only (extract/dream deferred to v2)
36 lines
1.2 KiB
TypeScript
36 lines
1.2 KiB
TypeScript
import { readFile, writeFile, readdir } from 'node:fs/promises';
|
|
import { join } from 'node:path';
|
|
import type { MemoryTopic } from './paths.js';
|
|
import { getTopicDir } from './paths.js';
|
|
|
|
export async function readTopicFiles(root: string, topic: MemoryTopic): Promise<Map<string, string>> {
|
|
const dir = getTopicDir(root, topic);
|
|
const files = new Map<string, string>();
|
|
try {
|
|
const entries = await readdir(dir, { withFileTypes: true });
|
|
for (const entry of entries) {
|
|
if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
const content = await readFile(join(dir, entry.name), 'utf8');
|
|
files.set(entry.name, content);
|
|
}
|
|
}
|
|
} catch {
|
|
// Directory doesn't exist yet
|
|
}
|
|
return files;
|
|
}
|
|
|
|
export async function writeEntry(
|
|
root: string,
|
|
topic: MemoryTopic,
|
|
title: string,
|
|
content: string,
|
|
tags: string[],
|
|
): Promise<void> {
|
|
const dir = getTopicDir(root, topic);
|
|
const tagLine = tags.length > 0 ? `> tags: ${tags.join(', ')}\n\n` : '\n';
|
|
const entry = `## ${topic}: ${title}\n${tagLine}${content}\n`;
|
|
const filename = title.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '') + '.md';
|
|
await writeFile(join(dir, filename), entry, 'utf8');
|
|
}
|