Skip to content

Commit 6f65124

Browse files
jonathanpeterwuStackMemory Bot (CLI)
andauthored
feat: Obsidian vault adapter with auto-init (#9)
* feat: Obsidian vault adapter for frame serialization - ObsidianVaultAdapter: writes frames as .md files with YAML frontmatter and [[wiki-links]] into a configured Obsidian vault path - Auto-maintained index.md with frame type counts and recent frame links - Web clipper ingest: watches raw/ for new .md files, parses frontmatter, triggers ingest callback for frame creation - Session summaries with frame backlinks - Config: add optional `obsidian.vaultPath` to StackMemoryConfig - Hooks into frameLifecycleHooks (onFrameCreated/onFrameClosed) - Zero Obsidian plugins required — pure file I/O * feat(obsidian): auto-initialize vault adapter from config Wire ObsidianVaultAdapter into both CLI and MCP server startup: - Reads obsidian.vaultPath from .stackmemory/config.yaml - Auto-initializes on session start (CLI) and MCP server init - Singleton pattern — safe to call multiple times - Config passthrough in config-manager.ts Usage: add to .stackmemory/config.yaml: obsidian: vaultPath: /path/to/vault --------- Co-authored-by: StackMemory Bot (CLI) <bot@stackmemory.ai>
1 parent d2b5ce8 commit 6f65124

5 files changed

Lines changed: 578 additions & 0 deletions

File tree

src/cli/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,11 @@ program
262262
await sessionManager.initialize();
263263
await sharedContextLayer.initialize();
264264

265+
// Auto-init Obsidian vault adapter if configured
266+
const { initObsidianVault } =
267+
await import('../core/storage/obsidian-vault-adapter.js');
268+
await initObsidianVault();
269+
265270
const session = await sessionManager.getOrCreateSession({
266271
projectPath: projectRoot,
267272
sessionId: options.session,

src/core/config/config-manager.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ export class ConfigManager {
9898
performance: { ...DEFAULT_CONFIG.performance, ...loaded.performance },
9999
enrichment: { ...DEFAULT_ENRICHMENT, ...loaded.enrichment },
100100
profiles: { ...PRESET_PROFILES, ...loaded.profiles },
101+
obsidian: loaded.obsidian,
101102
};
102103

103104
// Apply active profile if specified

src/core/config/types.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,17 @@ export interface ProfileConfig {
6666
performance?: Partial<PerformanceConfig>;
6767
}
6868

69+
export interface ObsidianConfig {
70+
/** Path to Obsidian vault root directory */
71+
vaultPath: string;
72+
/** Subdirectory within vault for StackMemory data (default: "stackmemory") */
73+
subdir?: string;
74+
/** Watch raw/ for web clipper input (default: true) */
75+
watchRaw?: boolean;
76+
/** Auto-update index.md on frame changes (default: true) */
77+
autoIndex?: boolean;
78+
}
79+
6980
export interface StackMemoryConfig {
7081
version: string;
7182
profile?: string; // Active profile name
@@ -77,6 +88,8 @@ export interface StackMemoryConfig {
7788
performance: PerformanceConfig;
7889
enrichment: EnrichmentConfig;
7990
profiles?: Record<string, ProfileConfig>;
91+
/** Optional Obsidian vault integration */
92+
obsidian?: ObsidianConfig;
8093
}
8194

8295
export const DEFAULT_WEIGHTS: ScoringWeights = {

0 commit comments

Comments
 (0)