188 lines
4.8 KiB
JavaScript
188 lines
4.8 KiB
JavaScript
|
|
#!/usr/bin/env node
|
||
|
|
|
||
|
|
const fs = require('fs');
|
||
|
|
const path = require('path');
|
||
|
|
|
||
|
|
const TEMPLATES = {
|
||
|
|
'session-state': `# SESSION-STATE.md — Active Working Memory
|
||
|
|
|
||
|
|
This file is the agent's "RAM" — survives compaction, restarts, distractions.
|
||
|
|
Chat history is a BUFFER. This file is STORAGE.
|
||
|
|
|
||
|
|
## Current Task
|
||
|
|
[None]
|
||
|
|
|
||
|
|
## Key Context
|
||
|
|
[None yet]
|
||
|
|
|
||
|
|
## Pending Actions
|
||
|
|
- [ ] None
|
||
|
|
|
||
|
|
## Recent Decisions
|
||
|
|
[None yet]
|
||
|
|
|
||
|
|
---
|
||
|
|
*Last updated: ${new Date().toISOString()}*
|
||
|
|
`,
|
||
|
|
|
||
|
|
'memory-md': `# MEMORY.md — Long-Term Memory
|
||
|
|
|
||
|
|
## About the User
|
||
|
|
[Add user preferences, communication style, etc.]
|
||
|
|
|
||
|
|
## Projects
|
||
|
|
[Active projects and their status]
|
||
|
|
|
||
|
|
## Decisions Log
|
||
|
|
[Important decisions and why they were made]
|
||
|
|
|
||
|
|
## Lessons Learned
|
||
|
|
[Mistakes to avoid, patterns that work]
|
||
|
|
|
||
|
|
## Preferences
|
||
|
|
[Tools, frameworks, workflows the user prefers]
|
||
|
|
|
||
|
|
---
|
||
|
|
*Curated memory — distill insights from daily logs here*
|
||
|
|
`,
|
||
|
|
|
||
|
|
'daily-template': `# {{DATE}} — Daily Log
|
||
|
|
|
||
|
|
## Tasks Completed
|
||
|
|
-
|
||
|
|
|
||
|
|
## Decisions Made
|
||
|
|
-
|
||
|
|
|
||
|
|
## Lessons Learned
|
||
|
|
-
|
||
|
|
|
||
|
|
## Tomorrow
|
||
|
|
-
|
||
|
|
`
|
||
|
|
};
|
||
|
|
|
||
|
|
const commands = {
|
||
|
|
init: () => {
|
||
|
|
console.log('🧠 Initializing Elite Longterm Memory...\n');
|
||
|
|
|
||
|
|
// Create SESSION-STATE.md
|
||
|
|
if (!fs.existsSync('SESSION-STATE.md')) {
|
||
|
|
fs.writeFileSync('SESSION-STATE.md', TEMPLATES['session-state']);
|
||
|
|
console.log('✓ Created SESSION-STATE.md (Hot RAM)');
|
||
|
|
} else {
|
||
|
|
console.log('• SESSION-STATE.md already exists');
|
||
|
|
}
|
||
|
|
|
||
|
|
// Create MEMORY.md
|
||
|
|
if (!fs.existsSync('MEMORY.md')) {
|
||
|
|
fs.writeFileSync('MEMORY.md', TEMPLATES['memory-md']);
|
||
|
|
console.log('✓ Created MEMORY.md (Curated Archive)');
|
||
|
|
} else {
|
||
|
|
console.log('• MEMORY.md already exists');
|
||
|
|
}
|
||
|
|
|
||
|
|
// Create memory directory
|
||
|
|
if (!fs.existsSync('memory')) {
|
||
|
|
fs.mkdirSync('memory', { recursive: true });
|
||
|
|
console.log('✓ Created memory/ directory');
|
||
|
|
} else {
|
||
|
|
console.log('• memory/ directory already exists');
|
||
|
|
}
|
||
|
|
|
||
|
|
// Create today's log
|
||
|
|
const today = new Date().toISOString().split('T')[0];
|
||
|
|
const todayFile = `memory/${today}.md`;
|
||
|
|
if (!fs.existsSync(todayFile)) {
|
||
|
|
const content = TEMPLATES['daily-template'].replace('{{DATE}}', today);
|
||
|
|
fs.writeFileSync(todayFile, content);
|
||
|
|
console.log(`✓ Created ${todayFile}`);
|
||
|
|
}
|
||
|
|
|
||
|
|
console.log('\n🎉 Elite Longterm Memory initialized!');
|
||
|
|
console.log('\nNext steps:');
|
||
|
|
console.log('1. Add SESSION-STATE.md to your agent context');
|
||
|
|
console.log('2. Configure LanceDB plugin in clawdbot.json');
|
||
|
|
console.log('3. Review SKILL.md for full setup guide');
|
||
|
|
},
|
||
|
|
|
||
|
|
today: () => {
|
||
|
|
const today = new Date().toISOString().split('T')[0];
|
||
|
|
const todayFile = `memory/${today}.md`;
|
||
|
|
|
||
|
|
if (!fs.existsSync('memory')) {
|
||
|
|
fs.mkdirSync('memory', { recursive: true });
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!fs.existsSync(todayFile)) {
|
||
|
|
const content = TEMPLATES['daily-template'].replace('{{DATE}}', today);
|
||
|
|
fs.writeFileSync(todayFile, content);
|
||
|
|
console.log(`✓ Created ${todayFile}`);
|
||
|
|
} else {
|
||
|
|
console.log(`• ${todayFile} already exists`);
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
status: () => {
|
||
|
|
console.log('🧠 Elite Longterm Memory Status\n');
|
||
|
|
|
||
|
|
// Check SESSION-STATE.md
|
||
|
|
if (fs.existsSync('SESSION-STATE.md')) {
|
||
|
|
const stat = fs.statSync('SESSION-STATE.md');
|
||
|
|
console.log(`✓ SESSION-STATE.md (${(stat.size / 1024).toFixed(1)}KB, modified ${stat.mtime.toLocaleString()})`);
|
||
|
|
} else {
|
||
|
|
console.log('✗ SESSION-STATE.md missing');
|
||
|
|
}
|
||
|
|
|
||
|
|
// Check MEMORY.md
|
||
|
|
if (fs.existsSync('MEMORY.md')) {
|
||
|
|
const stat = fs.statSync('MEMORY.md');
|
||
|
|
const lines = fs.readFileSync('MEMORY.md', 'utf8').split('\n').length;
|
||
|
|
console.log(`✓ MEMORY.md (${lines} lines, ${(stat.size / 1024).toFixed(1)}KB)`);
|
||
|
|
} else {
|
||
|
|
console.log('✗ MEMORY.md missing');
|
||
|
|
}
|
||
|
|
|
||
|
|
// Check memory directory
|
||
|
|
if (fs.existsSync('memory')) {
|
||
|
|
const files = fs.readdirSync('memory').filter(f => f.endsWith('.md'));
|
||
|
|
console.log(`✓ memory/ (${files.length} daily logs)`);
|
||
|
|
} else {
|
||
|
|
console.log('✗ memory/ directory missing');
|
||
|
|
}
|
||
|
|
|
||
|
|
// Check LanceDB
|
||
|
|
const lancedbPath = path.join(process.env.HOME, '.clawdbot/memory/lancedb');
|
||
|
|
if (fs.existsSync(lancedbPath)) {
|
||
|
|
console.log('✓ LanceDB vectors initialized');
|
||
|
|
} else {
|
||
|
|
console.log('• LanceDB not initialized (optional)');
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
help: () => {
|
||
|
|
console.log(`
|
||
|
|
🧠 Elite Longterm Memory CLI
|
||
|
|
|
||
|
|
Commands:
|
||
|
|
init Initialize memory system in current directory
|
||
|
|
today Create today's daily log file
|
||
|
|
status Check memory system health
|
||
|
|
help Show this help
|
||
|
|
|
||
|
|
Usage:
|
||
|
|
npx elite-longterm-memory init
|
||
|
|
npx elite-longterm-memory status
|
||
|
|
`);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
const command = process.argv[2] || 'help';
|
||
|
|
|
||
|
|
if (commands[command]) {
|
||
|
|
commands[command]();
|
||
|
|
} else {
|
||
|
|
console.log(`Unknown command: ${command}`);
|
||
|
|
commands.help();
|
||
|
|
}
|