- docs/plan.md: Master roadmap with phases and priorities - docs/milestones/01-13: Detailed specs for each feature - Updated CLAUDE.md with plan references and build commands Milestones cover: - Phase 1: Temporal versioning, auto-capture, context injection, codebase indexing - Phase 2: Daily journal, content ingestion, graph visualization, import/export - Phase 3: Multi-graph, smart retrieval, TUI dashboard, browser extension, shell completions
5.7 KiB
5.7 KiB
Milestone 5: Daily Journal
Overview
Quick-capture system for daily notes, thoughts, and todos. Every day gets its own node, making it easy to track what happened when.
Motivation
- Logseq's daily notes are beloved by users
- Low-friction capture encourages consistent use
- Chronological organization aids recall
- Natural integration with auto-capture
Features
5.1 Daily Note Creation
# Open/create today's journal
cortex journal
# Add to today's journal
cortex journal "Fixed the auth bug"
cortex j "Quick thought" # Alias
# View specific day
cortex journal --date 2024-01-15
cortex journal --yesterday
5.2 Quick Capture
Append to today's journal without opening it:
# Quick capture
cortex capture "Remember to update docs"
cortex c "TODO: refactor auth" # Alias
# Capture with tags
cortex capture "API rate limiting idea" --tags api,performance
# Capture from clipboard
cortex capture --clipboard
5.3 Journal Structure
interface JournalNode {
kind: 'memory';
title: string; // "Journal: 2024-01-15"
content: string; // Markdown with entries
tags: ['journal', 'daily', '2024-01', '2024'];
metadata: {
date: string; // "2024-01-15"
entries: JournalEntry[];
};
}
interface JournalEntry {
time: string; // "14:30"
text: string;
tags?: string[];
}
5.4 Journal Linking
Auto-link journals to related nodes:
- Mentioned node IDs →
relates_toedge - Mentioned tags → find and link relevant nodes
- Mentioned files → link to indexed components
5.5 End-of-Day Summary
Optional AI-generated summary:
# Generate summary of today
cortex journal --summarize
# Auto-summarize at end of day (cron/scheduled task)
cortex journal --summarize --auto
5.6 Journal Search
# Search within journals
cortex journal --search "auth bug"
# List recent journals
cortex journal --list
cortex journal --list --month 2024-01
Implementation
Journal Service
// src/core/journal.ts
export async function getOrCreateJournal(date?: string): Promise<Node> {
const targetDate = date || formatDate(new Date());
const title = `Journal: ${targetDate}`;
// Find existing
const existing = await findNodeByTitle(title);
if (existing) return existing;
// Create new
return addNode({
kind: 'memory',
title,
content: `# ${targetDate}\n\n`,
tags: ['journal', 'daily', ...dateTags(targetDate)],
metadata: { date: targetDate, entries: [] },
});
}
export async function appendToJournal(text: string, options?: CaptureOptions): Promise<void> {
const journal = await getOrCreateJournal();
const time = formatTime(new Date());
const entry: JournalEntry = {
time,
text,
tags: options?.tags,
};
// Append to content
const newContent = `${journal.content}\n- **${time}** ${text}`;
// Update metadata
const entries = [...(journal.metadata.entries || []), entry];
await updateNode(journal.id, {
content: newContent,
metadata: { ...journal.metadata, entries },
});
// Auto-link mentioned nodes
await linkMentionedNodes(journal.id, text);
}
Daily Summary Generator
async function generateDailySummary(date: string): Promise<string> {
const journal = await getOrCreateJournal(date);
if (!journal.metadata.entries?.length) return '';
const prompt = `
Summarize this day's journal entries in 2-3 sentences.
Focus on: accomplishments, decisions, blockers.
Entries:
${journal.metadata.entries.map(e => `- ${e.time}: ${e.text}`).join('\n')}
Summary:`;
return generate(prompt);
}
CLI Commands
| Command | Description |
|---|---|
cortex journal |
Open today's journal |
cortex journal <text> |
Add entry to today |
cortex journal --date <date> |
View/edit specific day |
cortex journal --yesterday |
Yesterday's journal |
cortex journal --list |
List recent journals |
cortex journal --search <query> |
Search journals |
cortex journal --summarize |
Generate summary |
cortex capture <text> |
Quick capture alias |
cortex c <text> |
Even shorter alias |
MCP Tools
memory_journal // Get/create today's journal
memory_capture // Quick capture to journal
memory_journal_list // List recent journals
Integration
With Auto-Capture (Milestone 2)
Auto-captured conversations link to that day's journal:
// In auto-capture hook
const journal = await getOrCreateJournal();
addEdge(capturedNode.id, journal.id, 'relates_to', { reason: 'same-day' });
With Context Injection (Milestone 3)
Recent journal entries included in context:
// In context gathering
const recentJournals = await getRecentJournals(3); // Last 3 days
candidates.push(...recentJournals.map(j => ({ node: j, score: 0.6, reason: 'journal' })));
Testing
- Creates journal node for today
- Appends entries with timestamps
--dateflag accesses correct day- Search finds entries across journals
- Summary generation works
- Journal linked to mentioned nodes
Acceptance Criteria
cortex capture "text"takes <100ms- Journals organized by date
- Can search across all journals
- Summary captures key points
- Integrates with auto-capture
- MCP tools work correctly
Estimated Effort
- Journal CRUD: 3 hours
- Quick capture: 2 hours
- Search/list: 2 hours
- Summary generation: 2 hours
- Linking: 2 hours
- CLI polish: 2 hours
- Testing: 2 hours
- Total: ~15 hours
Dependencies
- None (independent milestone)