UNPKG

@stackmemoryai/stackmemory

Version:

Lossless, project-scoped memory for AI coding tools. Durable context across sessions with 56 MCP tools, FTS5 search, conductor orchestrator, loop/watch monitoring, snapshot capture, pre-flight overlap checks, Claude/Codex/OpenCode wrappers, Linear sync, a

65 lines (64 loc) 1.78 kB
import { fileURLToPath as __fileURLToPath } from 'url'; import { dirname as __pathDirname } from 'path'; const __filename = __fileURLToPath(import.meta.url); const __dirname = __pathDirname(__filename); import { logger } from "../core/monitoring/logger.js"; import { readFileSync, writeFileSync, existsSync } from "fs"; import { join } from "path"; class ConfigService { // Using singleton logger from monitoring config = {}; configPath; constructor() { this.configPath = join(process.cwd(), ".stackmemory", "config.json"); this.loadConfig(); } loadConfig() { try { if (existsSync(this.configPath)) { const content = readFileSync(this.configPath, "utf-8"); this.config = JSON.parse(content); logger.debug("Loaded configuration", this.config); } } catch (error) { logger.warn("Failed to load configuration, using defaults", error); } } saveConfig() { try { writeFileSync(this.configPath, JSON.stringify(this.config, null, 2)); logger.debug("Saved configuration"); } catch (error) { logger.error("Failed to save configuration", error); } } async getConfig() { return this.config; } async updateConfig(updates) { this.config = { ...this.config, ...updates }; this.saveConfig(); } async getLinearConfig() { return this.config.integrations?.linear || {}; } async updateLinearConfig(updates) { if (!this.config.integrations) { this.config.integrations = {}; } if (!this.config.integrations.linear) { this.config.integrations.linear = {}; } this.config.integrations.linear = { ...this.config.integrations.linear, ...updates }; this.saveConfig(); } } export { ConfigService };