Files
coder/codersdk
Scott Miller 258d6cbb9a feat: serve plugin skills in chatd
Skills pushed by the workspace agent with a plugin_name now reach the chat
as plugin-source skills. The prompt index lists them as
"- <alias> (plugin: <name>): <description>", collisions qualify them as
plugin/<plugin>/<name>, and read_skill and read_skill_file serve them from
the pinned SKILL.md and the skill directory like workspace skills.
The skill tools resolve a name to its pinned row by (source, plugin,
name), so two plugins shipping the same skill name resolve to their own
bodies.

Pinned skill names must match the kebab-case skill grammar; rows that
fail are dropped and logged with their sources. Plugin names are not
re-validated on read, since the Agent API rejects a push carrying an
invalid one.

Plugin skill descriptions reach <available-skills> unmodified, as
workspace skill descriptions do on main; sanitizing descriptions from
every source is tracked in CODAGT-1337.

The chatd architecture document gains a Skill index section covering the
block, bare and qualified aliases, the skill tools and plugin skills.

codersdk.ChatContextResource gains PluginName and the plugin kind. The
listing sets PluginName on non-OK skill and mcp_server rows as well as
OK ones, and copies the agent's Error onto OK rows so spec-mandated
manifest warnings (unknown fields, non-object extensions, an ignored
mcp.json or skills directory) reach the API instead of only the
database.

The frontend gains only a "plugin manifest" label for the new kind; the
composer and context indicator changes ship separately.

An integration test runs a real workspace agent against a scan root with
a plugin skill and a plain skill, and checks the pinned rows, the
GET /chats/{id} context listing, and the system prompt, with the
agent-plugins experiment on and off.
2026-10-15 02:13:14 +00:00
..
2026-10-15 02:13:14 +00:00
…