diff --git a/lib/db/migrations/007_companion.sql b/lib/db/migrations/007_companion.sql new file mode 100644 index 0000000..7720720 --- /dev/null +++ b/lib/db/migrations/007_companion.sql @@ -0,0 +1,14 @@ +-- lib/db/migrations/007_companion.sql +-- Plan 5: per-Space ambient companion conversation + default companion agent. + +ALTER TABLE conversations + ADD COLUMN space_id uuid REFERENCES spaces(id) ON DELETE CASCADE; + +CREATE INDEX idx_conversations_space ON conversations(space_id, started_at DESC); + +INSERT INTO agents (slug, name, kind, model, capabilities) +VALUES ( + 'companion', 'Companion', 'claude', NULL, + '{"read":true,"suggest":true,"write":false}'::jsonb +) +ON CONFLICT (slug) DO NOTHING; diff --git a/tests/db/migration_007.test.js b/tests/db/migration_007.test.js new file mode 100644 index 0000000..5e752c9 --- /dev/null +++ b/tests/db/migration_007.test.js @@ -0,0 +1,23 @@ +import { describe, it, expect, beforeAll } from 'vitest'; +import { pool } from '../../lib/db/pool.js'; +import { resetDb } from '../helpers/db.js'; +import { migrateUp } from '../../lib/db/migrate.js'; + +beforeAll(async () => { await resetDb(); await migrateUp(); }); + +describe('migration 007', () => { + it('adds conversations.space_id column', async () => { + const { rows } = await pool.query( + `SELECT column_name FROM information_schema.columns + WHERE table_name='conversations' AND column_name='space_id'` + ); + expect(rows).toHaveLength(1); + }); + + it('seeds a default companion agent', async () => { + const { rows } = await pool.query(`SELECT slug, kind, capabilities FROM agents WHERE slug='companion'`); + expect(rows).toHaveLength(1); + expect(rows[0].kind).toBe('claude'); + expect(rows[0].capabilities).toMatchObject({ read: true, suggest: true, write: false }); + }); +});