@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
JavaScript
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');
}
}