Skip to main content

Skills API

Reusable, versioned Markdown-with-frontmatter instructions Agents pull in when relevant. Shipped as a plugin capability per ADR-012; the first-party Ever Works Skills plugin sources the curated catalog from the ever-works/skills GitHub repo.

All routes are @CurrentUser()-scoped. Cross-user reads return 404.

Catalog (read-only union across enabled skills-provider plugins)

MethodPathDescription
GET/api/skills/catalogPaginated catalog union. Query: limit, offset, search, tags=a,b. (global throttle)
GET/api/skills/catalog/:slugOne catalog entry by slug.

Installed Skills (per-user)

MethodPathDescription
GET/api/skillsList my Skills (filter: ownerType / ownerId / search).
GET/api/skills/:idGet one.
POST/api/skillsCreate a custom Skill. (30/min)
PATCH/api/skills/:idUpdate body / frontmatter. (60/min — autosave-friendly)
DELETE/api/skills/:idDelete (cascades to bindings). (30/min)
POST/api/skills/installInstall a catalog skill at the requested scope. Body: {slug, ownerType, ownerId}. (60/min)

Bindings

Many-to-many between Skills and targets (Agent / Work / Mission / Idea / Tenant). Resolution priority: lower number wins. Bindings with injectIntoAgent=false are excluded from AI-run prompt assembly; injectIntoGenerator=true surfaces them on Work generator runs.

MethodPathDescription
GET/api/skills/:id/bindingsList all bindings of one Skill.
POST/api/skills/:id/bindingsCreate a binding. Body: {targetType, targetId, priority?, injectIntoAgent?, injectIntoGenerator?}. (60/min)
DELETE/api/skill-bindings/:idRemove one binding by id. (60/min)

Notes

  • SkillBindingRepository.resolveActive() is the single source of truth for "which skills apply to this AI run?". Used by AgentRunService (Phase 10) and AiFacadeService.assembleSystemMessage() (Phase 10).
  • Activity-log rows: SKILL_INSTALLED, SKILL_ATTACHED_TO_AGENT, SKILL_INVOKED, SKILL_FILE_EDITED.
  • All body writes are secret-scanned (hard-reject) and capped at 64 KB (mirrors Agent files).