| { | ||
| "name": "mor", | ||
| "version": "0.18.4", | ||
| "version": "0.18.5", | ||
| "description": "AI-accessible knowledge you actually own — plain markdown on your disk", | ||
@@ -5,0 +5,0 @@ "author": { |
+1
-1
| { | ||
| "name": "mor", | ||
| "version": "0.18.4", | ||
| "version": "0.18.5", | ||
| "description": "AI-accessible knowledge you actually own — plain markdown on your disk", | ||
@@ -5,0 +5,0 @@ "type": "module", |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
| import type { Config, Memory, MemoryType } from './operations.js'; | ||
| export declare function detectRepository(): string | undefined; | ||
| export declare function generateFilename(title: string, id: string): string; | ||
| export declare function createMemory(config: Config, opts: { | ||
| title: string; | ||
| description?: string; | ||
| content: string; | ||
| tags?: string[]; | ||
| type?: MemoryType; | ||
| repository?: string; | ||
| }): { | ||
| mem: Memory; | ||
| raw: string; | ||
| }; | ||
| export declare function readMemory(filePath: string): Memory; | ||
| export declare function tryReadMemory(filePath: string): { | ||
| mem: Memory; | ||
| raw: string; | ||
| } | undefined; | ||
| export declare function serializeMemory(mem: Memory): string; | ||
| export declare function updateMemory(filePath: string, updates: { | ||
| title?: string; | ||
| description?: string; | ||
| content?: string; | ||
| tags?: string[]; | ||
| type?: MemoryType; | ||
| }): { | ||
| mem: Memory; | ||
| raw: string; | ||
| }; | ||
| export declare function deleteMemory(filePath: string): void; | ||
| export declare function listMemoryFiles(config: Config): string[]; |
-154
| import matter from 'gray-matter'; | ||
| import { execSync } from 'node:child_process'; | ||
| import crypto from 'node:crypto'; | ||
| import fs from 'node:fs'; | ||
| import path from 'node:path'; | ||
| import { normalizeGitUrl } from './utils/git.js'; | ||
| let _cachedRepo; | ||
| export function detectRepository() { | ||
| if (_cachedRepo !== undefined) | ||
| return _cachedRepo ?? undefined; | ||
| try { | ||
| const url = execSync('git remote get-url origin', { | ||
| encoding: 'utf-8', | ||
| stdio: ['pipe', 'pipe', 'pipe'], | ||
| }).trim(); | ||
| _cachedRepo = normalizeGitUrl(url) ?? null; | ||
| } | ||
| catch { | ||
| _cachedRepo = null; | ||
| } | ||
| return _cachedRepo ?? undefined; | ||
| } | ||
| export function generateFilename(title, id) { | ||
| const slug = title | ||
| .normalize('NFD') | ||
| .replace(/[\u0300-\u036f]/g, '') | ||
| .replace(/([a-z])([A-Z])/g, '$1-$2') | ||
| .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2') | ||
| .toLowerCase() | ||
| .replace(/[^a-z0-9]+/g, '-') | ||
| .replace(/^-|-$/g, '') || 'memory'; | ||
| const hash = id.slice(0, 4); | ||
| return `${slug}-${hash}.md`; | ||
| } | ||
| function buildFrontmatter(fm) { | ||
| const out = { | ||
| id: fm.id, | ||
| title: fm.title, | ||
| tags: fm.tags, | ||
| type: fm.type, | ||
| created: fm.created, | ||
| updated: fm.updated, | ||
| }; | ||
| if (fm.description) | ||
| out.description = fm.description; | ||
| if (fm.repository) | ||
| out.repository = fm.repository; | ||
| return out; | ||
| } | ||
| export function createMemory(config, opts) { | ||
| const id = crypto.randomUUID(); | ||
| const now = new Date().toISOString(); | ||
| const repo = opts.repository ?? detectRepository(); | ||
| const frontmatter = buildFrontmatter({ | ||
| id, | ||
| title: opts.title, | ||
| description: opts.description, | ||
| tags: opts.tags ?? [], | ||
| type: opts.type ?? 'knowledge', | ||
| repository: repo, | ||
| created: now, | ||
| updated: now, | ||
| }); | ||
| const filename = generateFilename(opts.title, id); | ||
| const filePath = path.join(config.memoryDir, filename); | ||
| const raw = matter.stringify({ content: opts.content }, frontmatter); | ||
| fs.writeFileSync(filePath, raw); | ||
| return { | ||
| mem: { ...frontmatter, content: opts.content, filePath }, | ||
| raw, | ||
| }; | ||
| } | ||
| function readAndParse(filePath) { | ||
| const raw = fs.readFileSync(filePath, 'utf-8'); | ||
| return { mem: parseMemory(raw, filePath), raw }; | ||
| } | ||
| export function readMemory(filePath) { | ||
| return readAndParse(filePath).mem; | ||
| } | ||
| export function tryReadMemory(filePath) { | ||
| try { | ||
| return readAndParse(filePath); | ||
| } | ||
| catch (e) { | ||
| process.stderr.write(`Warning: skipping unreadable memory ${filePath}: ${e instanceof Error ? e.message : e}\n`); | ||
| return undefined; | ||
| } | ||
| } | ||
| function parseMemory(raw, filePath) { | ||
| const { data, content } = matter(raw); | ||
| const fm = data; | ||
| return { | ||
| id: fm.id, | ||
| title: fm.title, | ||
| description: fm.description, | ||
| tags: fm.tags ?? [], | ||
| type: fm.type ?? 'knowledge', | ||
| repository: fm.repository, | ||
| created: fm.created, | ||
| updated: fm.updated, | ||
| content: content.trim(), | ||
| filePath, | ||
| }; | ||
| } | ||
| export function serializeMemory(mem) { | ||
| const frontmatter = buildFrontmatter(mem); | ||
| return matter.stringify({ content: mem.content }, frontmatter); | ||
| } | ||
| export function updateMemory(filePath, updates) { | ||
| const existing = readMemory(filePath); | ||
| const now = new Date().toISOString(); | ||
| const description = updates.description !== undefined | ||
| ? updates.description | ||
| : existing.description; | ||
| const frontmatter = buildFrontmatter({ | ||
| id: existing.id, | ||
| title: updates.title ?? existing.title, | ||
| description, | ||
| tags: updates.tags ?? existing.tags, | ||
| type: updates.type ?? existing.type, | ||
| repository: existing.repository, | ||
| created: existing.created, | ||
| updated: now, | ||
| }); | ||
| const content = updates.content ?? existing.content; | ||
| const raw = matter.stringify({ content }, frontmatter); | ||
| let newPath = filePath; | ||
| if (updates.title && updates.title !== existing.title) { | ||
| const newFilename = generateFilename(updates.title, existing.id); | ||
| newPath = path.join(path.dirname(filePath), newFilename); | ||
| } | ||
| fs.writeFileSync(newPath, raw); | ||
| if (newPath !== filePath) | ||
| fs.unlinkSync(filePath); | ||
| return { | ||
| mem: { ...frontmatter, content, filePath: newPath }, | ||
| raw, | ||
| }; | ||
| } | ||
| export function deleteMemory(filePath) { | ||
| fs.unlinkSync(filePath); | ||
| } | ||
| export function listMemoryFiles(config) { | ||
| try { | ||
| return fs | ||
| .readdirSync(config.memoryDir) | ||
| .filter((f) => f.endsWith('.md')) | ||
| .map((f) => path.join(config.memoryDir, f)); | ||
| } | ||
| catch { | ||
| return []; | ||
| } | ||
| } | ||
| //# sourceMappingURL=memory.js.map |
| {"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"} |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
371761
-96.59%97
-4.9%4717
-95.83%35
2.94%