UNPKG

@shirokuma-library/mcp-knowledge-base

Version:

MCP server for AI-powered knowledge management with semantic search, graph analysis, and automatic enrichment

343 lines (342 loc) 10.4 kB
import { Table } from 'typeorm'; export class InitialMigration1736500000000 { async up(queryRunner) { await queryRunner.createTable(new Table({ name: 'statuses', columns: [ { name: 'id', type: 'integer', isPrimary: true, isGenerated: true, generationStrategy: 'increment', }, { name: 'name', type: 'text', isUnique: true, }, { name: 'is_closable', type: 'boolean', default: false, }, { name: 'sort_order', type: 'integer', default: 0, }, { name: 'created_at', type: 'datetime', default: 'CURRENT_TIMESTAMP', }, { name: 'updated_at', type: 'datetime', default: 'CURRENT_TIMESTAMP', }, ], }), true); await queryRunner.createTable(new Table({ name: 'items', columns: [ { name: 'id', type: 'integer', isPrimary: true, isGenerated: true, generationStrategy: 'increment', }, { name: 'type', type: 'varchar', length: '50', }, { name: 'title', type: 'varchar', length: '255', }, { name: 'description', type: 'text', }, { name: 'content', type: 'text', }, { name: 'ai_summary', type: 'text', isNullable: true, }, { name: 'status_id', type: 'integer', }, { name: 'priority', type: 'text', default: "'MEDIUM'", }, { name: 'category', type: 'varchar', length: '100', isNullable: true, }, { name: 'start_date', type: 'datetime', isNullable: true, }, { name: 'end_date', type: 'datetime', isNullable: true, }, { name: 'version', type: 'varchar', length: '50', isNullable: true, }, { name: 'search_index', type: 'text', isNullable: true, }, { name: 'entities', type: 'text', isNullable: true, }, { name: 'embedding', type: 'blob', isNullable: true, }, { name: 'created_at', type: 'datetime', default: 'CURRENT_TIMESTAMP', }, { name: 'updated_at', type: 'datetime', default: 'CURRENT_TIMESTAMP', }, ], }), true); await queryRunner.createTable(new Table({ name: 'tags', columns: [ { name: 'id', type: 'integer', isPrimary: true, isGenerated: true, generationStrategy: 'increment', }, { name: 'name', type: 'text', isUnique: true, }, ], }), true); await queryRunner.createTable(new Table({ name: 'item_tags', columns: [ { name: 'item_id', type: 'integer', isPrimary: true, }, { name: 'tag_id', type: 'integer', isPrimary: true, }, ], }), true); await queryRunner.createTable(new Table({ name: 'item_relations', columns: [ { name: 'source_id', type: 'integer', isPrimary: true, }, { name: 'target_id', type: 'integer', isPrimary: true, }, ], }), true); await queryRunner.createTable(new Table({ name: 'keywords', columns: [ { name: 'id', type: 'integer', isPrimary: true, isGenerated: true, generationStrategy: 'increment', }, { name: 'word', type: 'text', isUnique: true, }, ], }), true); await queryRunner.createTable(new Table({ name: 'item_keywords', columns: [ { name: 'item_id', type: 'integer', isPrimary: true, }, { name: 'keyword_id', type: 'integer', isPrimary: true, }, { name: 'weight', type: 'real', default: 1.0, }, ], }), true); await queryRunner.createTable(new Table({ name: 'concepts', columns: [ { name: 'id', type: 'integer', isPrimary: true, isGenerated: true, generationStrategy: 'increment', }, { name: 'name', type: 'text', isUnique: true, }, ], }), true); await queryRunner.createTable(new Table({ name: 'item_concepts', columns: [ { name: 'item_id', type: 'integer', isPrimary: true, }, { name: 'concept_id', type: 'integer', isPrimary: true, }, { name: 'confidence', type: 'real', default: 1.0, }, ], }), true); await queryRunner.createTable(new Table({ name: 'system_states', columns: [ { name: 'id', type: 'integer', isPrimary: true, isGenerated: true, generationStrategy: 'increment', }, { name: 'version', type: 'text', }, { name: 'content', type: 'text', }, { name: 'summary', type: 'text', isNullable: true, }, { name: 'metrics', type: 'text', isNullable: true, }, { name: 'context', type: 'text', isNullable: true, }, { name: 'checkpoint', type: 'text', isNullable: true, }, { name: 'relatedItems', type: 'text', default: "'[]'", }, { name: 'tags', type: 'text', default: "'[]'", }, { name: 'metadata', type: 'text', isNullable: true, }, { name: 'is_active', type: 'boolean', default: false, }, { name: 'created_at', type: 'datetime', default: 'CURRENT_TIMESTAMP', }, { name: 'updated_at', type: 'datetime', default: 'CURRENT_TIMESTAMP', }, ], }), true); await queryRunner.query(` UPDATE statuses SET is_closable = 1 WHERE name IN ('Completed', 'Closed', 'Canceled', 'Rejected') `); console.log('✅ Fixed is_closable flags for terminal statuses'); } async down(queryRunner) { await queryRunner.dropTable('system_states'); await queryRunner.dropTable('item_concepts'); await queryRunner.dropTable('concepts'); await queryRunner.dropTable('item_keywords'); await queryRunner.dropTable('keywords'); await queryRunner.dropTable('item_relations'); await queryRunner.dropTable('item_tags'); await queryRunner.dropTable('tags'); await queryRunner.dropTable('items'); await queryRunner.dropTable('statuses'); } }