H-289: add Captain Skill management API (#46)

* H-289: add Captain Skill management API

* H-289: guard Captain Skill updates with CAS

* H-289: version all Captain Skill updates

---------

Co-authored-by: Rogee <rogee@ipao.vip>
This commit is contained in:
Rogee
2026-08-18 14:29:10 +08:00
committed by GitHub
co-authored by rogee
parent c97097b79f
commit 0f2b8d7857
14 changed files with 1300 additions and 0 deletions
@@ -0,0 +1,3 @@
DROP TABLE IF EXISTS captain_assistant_skills;
DROP TABLE IF EXISTS captain_skill_references;
DROP TABLE IF EXISTS captain_skills;
@@ -0,0 +1,38 @@
CREATE TABLE captain_skills (
id SERIAL PRIMARY KEY,
account_id INTEGER NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
name VARCHAR(255) NOT NULL,
description VARCHAR(1024) NOT NULL,
instructions_md TEXT NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'draft' CHECK (status IN ('draft', 'active', 'archived')),
version INTEGER NOT NULL DEFAULT 1 CHECK (version > 0),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE (account_id, name)
);
CREATE INDEX idx_captain_skills_account_status ON captain_skills(account_id, status);
CREATE TABLE captain_skill_references (
id SERIAL PRIMARY KEY,
skill_id INTEGER NOT NULL REFERENCES captain_skills(id) ON DELETE CASCADE,
reference_key VARCHAR(255) NOT NULL,
content_md TEXT NOT NULL,
position INTEGER NOT NULL CHECK (position >= 0),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE (skill_id, reference_key),
UNIQUE (skill_id, position)
);
CREATE TABLE captain_assistant_skills (
id SERIAL PRIMARY KEY,
account_id INTEGER NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
assistant_id INTEGER NOT NULL REFERENCES captain_assistants(id) ON DELETE CASCADE,
skill_id INTEGER NOT NULL REFERENCES captain_skills(id) ON DELETE CASCADE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
UNIQUE (assistant_id, skill_id)
);
CREATE INDEX idx_captain_assistant_skills_account ON captain_assistant_skills(account_id);
CREATE INDEX idx_captain_assistant_skills_skill ON captain_assistant_skills(skill_id);