iii-directory
v0.5.1Engine introspection (functions / triggers / workers), workers registry proxy, and filesystem-backed skill + prompt reader.
- macOS: arm64 · x64
- Linux: arm64 · armv7 · x64
- Windows: arm64 · x64 · x86
skill doc
Read one skill body by id
how-toWhen to use
Call directory::skills::get whenever you need the body of one
skill — the markdown a worker publishes to teach the agent when and
why to use its functions. It returns the body alongside the same
title, description, and modified_at fields each
directory::skills::list row already carries, so the API mirrors
directory::prompts::get exactly.
Reach for it when:
- You hit an
iii://...link inside another skill and need its contents inlined. - You're building a picker UI that resolved an id from
directory::skills::listand the user selected one row. - You want a deeper sub-skill (
iii://resend/email/send) that wasn't inlined into the system-prompt bootstrap (which loads root skills only).
There is no batching. Call once per id; consumers that need several
bodies issue one get per id.
Inputs
{ "id": "agent-memory/observe" }id is required. It must be the same string directory::skills::list
returned (a path under skills_folder with .md stripped). Each
segment must satisfy [a-z0-9_-]{1,64} and the depth is unbounded.
For ergonomics the legacy iii://{id} link form is also accepted —
the prefix is stripped before validation:
{ "id": "iii://agent-memory/observe" }Any other URI scheme (https://, ftp://, ...) is rejected.
Outputs
{
"id": "agent-memory/observe",
"title": "How to observe",
"description": "Record an event in agent memory.",
"body": "# How to observe\n\n...",
"modified_at": "2026-05-01T12:34:56+00:00"
}idechoes the resolved id (the same string accepted as input, with anyiii://prefix stripped).titleis the first# H1line in the body, falling back toidwhen the file has no H1.descriptionis the first non-heading paragraph, empty when the file has only headings.bodyis the raw markdown post-frontmatter from disk.modified_atis the file mtime as RFC 3339 (empty if the FS doesn't expose it).
The shape is intentionally identical to
directory::prompts::get (with id standing in for that surface's
name) so a single client struct can target either reader.
Worked example
The agent loaded a worker skill that links to a deeper sub-skill at
iii://resend/email/send. To inline the linked body:
{ "id": "resend/email/send" }Same response either way:
{ "id": "resend/email/send", "title": "...", "description": "...", "body": "...", "modified_at": "..." }Related
directory::skills::list— discover the ids that resolve viadirectory::skills::get(already carriestitle+description, so a picker UI doesn't need agetper row).directory::skills::download— populateskills_folderso there's something to fetch.directory::engine::functions::info— for the structured view of one function (schemas + how_guide + related_skills) instead of a raw skill body.