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>
37 lines
1.4 KiB
TypeScript
37 lines
1.4 KiB
TypeScript
// triplet CRUD — 走 mock KbdbClient(API-as-Wall),零 SQL。
|
||
import { describe, it, expect } from 'vitest';
|
||
import { createTriplet, queryTriplets, getTriplet } from '../src/actions/triplet-crud';
|
||
import { mockClient } from './mock-client';
|
||
|
||
describe('createTriplet → records API', () => {
|
||
it('建立後可由 id 取回', async () => {
|
||
const c = mockClient();
|
||
const r = await createTriplet(c, { subject: 'InkStone', predicate: '是', object: '創業 OS' });
|
||
expect(r.id).toBeDefined();
|
||
expect(r.subject).toBe('InkStone');
|
||
|
||
const got = await getTriplet(c, r.id);
|
||
expect(got?.predicate).toBe('是');
|
||
expect(got?.object).toBe('創業 OS');
|
||
});
|
||
});
|
||
|
||
describe('queryTriplets → 插件層 filter', () => {
|
||
it('by subject 過濾', async () => {
|
||
const c = mockClient();
|
||
await createTriplet(c, { subject: 'KBDB', predicate: '使用', object: 'D1' });
|
||
await createTriplet(c, { subject: 'Other', predicate: '使用', object: 'X' });
|
||
|
||
const { triplets, count } = await queryTriplets(c, { subject: 'KBDB' });
|
||
expect(count).toBe(1);
|
||
expect(triplets[0].object).toBe('D1');
|
||
});
|
||
|
||
it('limit/offset 分頁', async () => {
|
||
const c = mockClient();
|
||
for (let i = 0; i < 5; i++) await createTriplet(c, { subject: `s${i}`, predicate: 'p', object: 'o' });
|
||
const { triplets } = await queryTriplets(c, { limit: 2, offset: 1 });
|
||
expect(triplets.length).toBe(2);
|
||
});
|
||
});
|