UNPKG

@shirokuma-library/mcp-knowledge-base

Version:

Shirokuma MCP Server for comprehensive knowledge management including issues, plans, documents, and work sessions. All stored data is structured for AI processing, not human readability.

81 lines (80 loc) 2.98 kB
import * as fs from 'fs/promises'; import * as path from 'path'; export class VersionMismatchError extends Error { programVersion; dbVersion; constructor(params) { const message = params.message || `Database version (${params.dbVersion}) does not match program version (${params.programVersion}).\n` + 'Please rebuild the database using: npm run rebuild:mcp'; super(message); this.name = 'VersionMismatchError'; this.programVersion = params.programVersion; this.dbVersion = params.dbVersion; } } export async function getProgramVersion() { try { const packageJsonPath = path.join(process.cwd(), 'package.json'); const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8')); return packageJson.version; } catch { return '0.7.5'; } } export async function hasDbMetadataTable(db) { try { const result = await db.getAsync("SELECT name FROM sqlite_master WHERE type='table' AND name='db_metadata'"); return !!result; } catch { return false; } } export async function getDbVersion(db) { try { const row = await db.getAsync('SELECT value FROM db_metadata WHERE key = ?', ['schema_version']); return row?.value || null; } catch { return null; } } export async function setDbVersion(db, version) { await db.runAsync('INSERT OR REPLACE INTO db_metadata (key, value, updated_at) VALUES (?, ?, CURRENT_TIMESTAMP)', ['schema_version', version]); } export async function checkDatabaseVersion(db, logger) { const programVersion = await getProgramVersion(); const hasMetadataTable = await hasDbMetadataTable(db); if (!hasMetadataTable) { logger.info('Database version table not found. This appears to be an old database.'); throw new VersionMismatchError({ programVersion, dbVersion: '<0.7.5', message: `This database appears to be from a version older than 0.7.5.\n` + `Current program version is ${programVersion}.\n` + 'Please rebuild the database using: npm run rebuild:mcp' }); } const dbVersion = await getDbVersion(db); logger.info(`Program version: ${programVersion}`); logger.info(`Database version: ${dbVersion || 'not set'}`); if (!dbVersion) { logger.info('Database version not set in db_metadata table.'); throw new VersionMismatchError({ programVersion, dbVersion: 'unknown', message: `Database version is not set.\n` + `Current program version is ${programVersion}.\n` + 'Please rebuild the database using: npm run rebuild:mcp' }); } if (dbVersion !== programVersion) { throw new VersionMismatchError({ programVersion, dbVersion }); } logger.info('Database version check passed'); }