feat(11-01): add group table DDL and built-in group seeding to skill-registry-db
- Import LibSQLClient type for seedBuiltinGroups parameter typing - Add DDL constants for 5 new tables: skill_groups, skill_group_members, skill_group_inheritance, agent_skill_groups, agent_skills - Add BUILTIN_GROUPS constant with 5 entries (pm-essentials, engineer-core, frontend, backend, creative) - Add seedBuiltinGroups() using INSERT OR IGNORE for idempotent seeding - Extend getSkillRegistryDb() to execute all 5 new DDL statements and seed
This commit is contained in:
parent
3612b3ae66
commit
0294ccdd29
1 changed files with 88 additions and 1 deletions
|
|
@ -1,7 +1,7 @@
|
||||||
import { mkdir } from "node:fs/promises";
|
import { mkdir } from "node:fs/promises";
|
||||||
import { dirname } from "node:path";
|
import { dirname } from "node:path";
|
||||||
import { drizzle } from "drizzle-orm/libsql";
|
import { drizzle } from "drizzle-orm/libsql";
|
||||||
import { createClient } from "@libsql/client";
|
import { createClient, type Client as LibSQLClient } from "@libsql/client";
|
||||||
import * as schema from "./skill-registry-schema.js";
|
import * as schema from "./skill-registry-schema.js";
|
||||||
import { resolveSkillRegistryDbPath } from "../home-paths.js";
|
import { resolveSkillRegistryDbPath } from "../home-paths.js";
|
||||||
|
|
||||||
|
|
@ -50,6 +50,85 @@ CREATE TABLE IF NOT EXISTS community_ratings (
|
||||||
source TEXT
|
source TEXT
|
||||||
)`;
|
)`;
|
||||||
|
|
||||||
|
const CREATE_SKILL_GROUPS_TABLE = `
|
||||||
|
CREATE TABLE IF NOT EXISTS skill_groups (
|
||||||
|
id TEXT PRIMARY KEY,
|
||||||
|
name TEXT NOT NULL,
|
||||||
|
description TEXT,
|
||||||
|
is_builtin INTEGER NOT NULL DEFAULT 0,
|
||||||
|
created_at INTEGER NOT NULL,
|
||||||
|
updated_at INTEGER NOT NULL
|
||||||
|
)`;
|
||||||
|
|
||||||
|
const CREATE_SKILL_GROUP_MEMBERS_TABLE = `
|
||||||
|
CREATE TABLE IF NOT EXISTS skill_group_members (
|
||||||
|
group_id TEXT NOT NULL,
|
||||||
|
skill_id TEXT NOT NULL,
|
||||||
|
added_at INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY (group_id, skill_id)
|
||||||
|
)`;
|
||||||
|
|
||||||
|
const CREATE_SKILL_GROUP_INHERITANCE_TABLE = `
|
||||||
|
CREATE TABLE IF NOT EXISTS skill_group_inheritance (
|
||||||
|
child_group_id TEXT NOT NULL,
|
||||||
|
parent_group_id TEXT NOT NULL,
|
||||||
|
PRIMARY KEY (child_group_id, parent_group_id)
|
||||||
|
)`;
|
||||||
|
|
||||||
|
const CREATE_AGENT_SKILL_GROUPS_TABLE = `
|
||||||
|
CREATE TABLE IF NOT EXISTS agent_skill_groups (
|
||||||
|
agent_id TEXT NOT NULL,
|
||||||
|
group_id TEXT NOT NULL,
|
||||||
|
assigned_at INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY (agent_id, group_id)
|
||||||
|
)`;
|
||||||
|
|
||||||
|
const CREATE_AGENT_SKILLS_TABLE = `
|
||||||
|
CREATE TABLE IF NOT EXISTS agent_skills (
|
||||||
|
agent_id TEXT NOT NULL,
|
||||||
|
skill_id TEXT NOT NULL,
|
||||||
|
installed_at INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY (agent_id, skill_id)
|
||||||
|
)`;
|
||||||
|
|
||||||
|
const BUILTIN_GROUPS = [
|
||||||
|
{
|
||||||
|
id: "builtin/pm-essentials",
|
||||||
|
name: "PM Essentials",
|
||||||
|
description: "Core planning and project-management skills",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "builtin/engineer-core",
|
||||||
|
name: "Engineer Core",
|
||||||
|
description: "Foundational engineering skills",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "builtin/frontend",
|
||||||
|
name: "Frontend",
|
||||||
|
description: "UI and frontend development skills",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "builtin/backend",
|
||||||
|
name: "Backend",
|
||||||
|
description: "API, database, and infrastructure skills",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "builtin/creative",
|
||||||
|
name: "Creative",
|
||||||
|
description: "Writing, branding, and creative production",
|
||||||
|
},
|
||||||
|
] as const;
|
||||||
|
|
||||||
|
async function seedBuiltinGroups(client: LibSQLClient): Promise<void> {
|
||||||
|
const now = Date.now();
|
||||||
|
for (const group of BUILTIN_GROUPS) {
|
||||||
|
await client.execute({
|
||||||
|
sql: `INSERT OR IGNORE INTO skill_groups (id, name, description, is_builtin, created_at, updated_at) VALUES (?, ?, ?, 1, ?, ?)`,
|
||||||
|
args: [group.id, group.name, group.description, now, now],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export async function getSkillRegistryDb(): Promise<SkillRegistryDb> {
|
export async function getSkillRegistryDb(): Promise<SkillRegistryDb> {
|
||||||
if (_db !== null) return _db;
|
if (_db !== null) return _db;
|
||||||
|
|
||||||
|
|
@ -64,6 +143,14 @@ export async function getSkillRegistryDb(): Promise<SkillRegistryDb> {
|
||||||
await client.execute(CREATE_SKILL_FILES_TABLE);
|
await client.execute(CREATE_SKILL_FILES_TABLE);
|
||||||
await client.execute(CREATE_COMMUNITY_RATINGS_TABLE);
|
await client.execute(CREATE_COMMUNITY_RATINGS_TABLE);
|
||||||
|
|
||||||
|
await client.execute(CREATE_SKILL_GROUPS_TABLE);
|
||||||
|
await client.execute(CREATE_SKILL_GROUP_MEMBERS_TABLE);
|
||||||
|
await client.execute(CREATE_SKILL_GROUP_INHERITANCE_TABLE);
|
||||||
|
await client.execute(CREATE_AGENT_SKILL_GROUPS_TABLE);
|
||||||
|
await client.execute(CREATE_AGENT_SKILLS_TABLE);
|
||||||
|
|
||||||
|
await seedBuiltinGroups(client);
|
||||||
|
|
||||||
return _db;
|
return _db;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue