skills
Kickside skills — reusable agent procedures stored as a component plus a versioned markdown body. Owns the skills + skill_versions schema and store, a six-route CRUD/read API, and the Skills agent capability (dual-mode Skill tool + pin-by-context build func) that agents discover via the registry.
Run
wippy run kickside/skillskickside/skills
Reusable agent procedures ("skills") for Kickside.
A skill is a component (identity / access / sharing / discovery) whose thread is its append-only version history. A registered projection folds that history into the current read-model body. Bundle files are upload artifacts referenced by the version event, so the module does not own a parallel skill database schema.
This module owns:
- The skill store (
kickside.skills:skill_create/skill_get/skill_list/skill_list_files/skill_read_file/skill_refine/skill_delete/skill_share) — per-method dispatchers over the thread-backed state reader and writer, each running under the caller's actor so the component service enforces access. - The bundle helpers (
bundle/frontmatter.lua— a bounded SKILL.md frontmatter parser, andbundle/normalize.lua— the SkillBundle normalizer). - The HTTP API:
GET /skills,GET /skills/{id},GET /skills/{id}/versions,POST /skills,PATCH /skills/{id}, andDELETE /skills/{id}. Sharing is exposed through the Skill tool and theskill_sharestore function, not as an HTTP route. - The
skill_runtimecontract (activate / list_files / read_file). - The Skills agent trait (
kickside.skills.traits:skills): a dual-mode trait whose static prompt +Skilltool give on-demand discovery, load, author, and refine of any readable skill (usereturns the body + a compact file manifest); aSkillFiletool reads bundled files on demand; and a build func (init_skills) pins specific skills' bodies + manifests into an agent's prompt when the agent suppliescontext.skill_ids.
Script execution (follow-on, self-contained)
Bundled scripts/ files are stored, not executed in V1. The architecture spot
is reserved entirely inside this module so a follow-on runner can be added without
touching any other package:
skill_files.kind = "script"+ theexecutableflag are persisted; a script's language is inferred from its extension into the file metadata.- A version's
allowed_tools_json/compatibility_jsonare persisted. kickside.skills:skill_runtimeexposes only implemented file-runtime methods:activate,list_files, andread_file.runtime/is the home for a future runner: adocker_runner.lua(a finite job overuserspace.docker:containers, resolved against thekickside.skill_runnerregistry allowlist — not arbitrary images) + astage_bundle.lua(stage a version's scripts/assets to a temp dir, mount/skillread-only +/outread-write). A futureSkillScripttool slots into the trait's tool list alongsideSkill+SkillFile.
Boundary
skills is permission-agnostic. The host router enforces auth + endpoint firewall;
per-skill access is the component service's job (component.validate_access).
skills depends on kickside/component, kickside/contract, kickside/core, and
kickside/uploads. It registers the agent.trait + tool
registry entries the agents module discovers through the registry — there is no
code coupling to the agents module.
Dependency interface
The consuming host wires these via ns.dependency:
api_router— required router the six HTTP routes attach to; must enforce auth + endpoint firewall.ui_server— required HTTP server for the bundled Skills UI.upload_storage— required filesystem for bundle upload artifacts.
Test
make test
Boots the Skills dependency graph and runs the co-located *_test.lua suites
(store CRUD/share, the Skill tool e2e, and skill pinning into a compiled agent).