efe8e165cf
按 leo 鐵律(2026-06-14)把插件從「直接 SQL 操作基本盤表」改寫成 「只透過基本盤 arcrun/kbdb HTTP API 讀寫」。零建表、零 migration、零 SQL。 - 新增 src/lib/kbdb-client.ts:唯一對外通道,封裝 entries/templates/records API - 新增 src/lib/templates.ts:triplet/entity template 定義(替代建表) - 改寫 21 個違規 action(triplet/graph/entity/search)→ 走 client,圖在插件層記憶體組裝 - 移除所有 migrations、D1/Vectorize/AI 綁定;embedding/語意搜尋歸基本盤 optional 模組 - index.ts 只掛 triplets/graph/entities/search 路由;基本盤路由歸 arcrun/kbdb - 測試改走 mock client(純 node);裁剪 CLAUDE.md 只留 graph 插件 + 鐵律 - 修正 SDD design.md「讀現狀推翻鐵律」的錯誤判斷(共用 D1 → API-as-Wall) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
32 lines
1.2 KiB
TypeScript
32 lines
1.2 KiB
TypeScript
// entity 正規化 — exact match(語意合併屬基本盤 embed 模組),走 mock client。
|
|
import { describe, it, expect } from 'vitest';
|
|
import { createEntity, findEntityByName, listEntities } from '../src/actions/entity-crud';
|
|
import { normalizeEntity } from '../src/actions/entity-normalize';
|
|
import { mockClient } from './mock-client';
|
|
|
|
describe('entity-crud', () => {
|
|
it('建立後可 exact 查回(大小寫不敏感)', async () => {
|
|
const c = mockClient();
|
|
await createEntity(c, 'InkStone');
|
|
const found = await findEntityByName(c, 'inkstone');
|
|
expect(found?.canonical).toBe('InkStone');
|
|
});
|
|
|
|
it('listEntities 列出', async () => {
|
|
const c = mockClient();
|
|
await createEntity(c, 'A');
|
|
await createEntity(c, 'B');
|
|
const all = await listEntities(c);
|
|
expect(all.map((e) => e.canonical).sort()).toEqual(['A', 'B']);
|
|
});
|
|
});
|
|
|
|
describe('normalizeEntity', () => {
|
|
it('已存在回 canonical,不存在建新回原值', async () => {
|
|
const c = mockClient();
|
|
await createEntity(c, 'InkStone');
|
|
expect(await normalizeEntity(c, 'INKSTONE')).toBe('InkStone');
|
|
expect(await normalizeEntity(c, '新公司')).toBe('新公司');
|
|
});
|
|
});
|