iii / worker
$worker

iii-directory

v0.7.0

Engine introspection (functions / triggers / workers), workers registry proxy, and filesystem-backed skill + prompt reader.

  • macOS: arm64 · x64
  • Linux: arm64 · armv7 · x64
  • Windows: arm64 · x64 · x86

install

install
$iii worker add iii-directory@0.7.0

configuration

iii-config.yaml
- download_timeout_ms: 60000
  registry_url: https://api.workers.iii.dev
  skills_folder: ./skills
README.md

iii-directory

Engine introspection, workers registry proxy, and filesystem-backed skill + prompt reader for the iii engine. Every public function sits under a single directory::* namespace, split into four sub-namespaces (all MCP-agnostic):

Surface What clients see When to use it
Skills (directory::skills::*) Enriched listing via directory::skills::list ({ id, title, type, description, bytes, modified_at } per row), a single-skill reader directory::skills::get { id } returning { id, title, type, description, body, modified_at }, and directory::skills::index which renders a short per-worker overview document (one ## </code> + first paragraph + <code class="readme-inline-code">read more</code> link per <code class="readme-inline-code">type: index</code> skill). <code class="readme-inline-code">title</code> prefers the YAML frontmatter <code class="readme-inline-code">title:</code> over the body H1; <code class="readme-inline-code">type</code> is lifted from frontmatter <code class="readme-inline-code">type:</code> (e.g. <code class="readme-inline-code">index</code>, <code class="readme-inline-code">how-to</code>, <code class="readme-inline-code">reference</code>) and serialised as <code class="readme-inline-code">null</code> when absent.</td> <td>Orientation: "when and why to use my worker's tools"</td> </tr> <tr> <td><strong>Prompts</strong> (<code class="readme-inline-code">directory::prompts::*</code>)</td> <td>Static prompt templates listed by <code class="readme-inline-code">directory::prompts::list</code> and read by <code class="readme-inline-code">directory::prompts::get</code></td> <td>Parametric command templates the <em>user</em> invokes</td> </tr> <tr> <td><strong>Engine</strong> (<code class="readme-inline-code">directory::engine::*</code>)</td> <td>Read-side enrichment over <code class="readme-inline-code">engine::functions::list</code>, <code class="readme-inline-code">engine::workers::list</code>, <code class="readme-inline-code">engine::trigger-types::list</code>, <code class="readme-inline-code">engine::triggers::list</code></td> <td>"What's connected to the engine right now?"</td> </tr> <tr> <td><strong>Registry</strong> (<code class="readme-inline-code">directory::registry::*</code>)</td> <td>HTTP proxy over <code class="readme-inline-code">api.workers.iii.dev</code> with <code class="readme-inline-code">workers::{list,info}</code>. Rows share the core <code class="readme-inline-code">name</code> / <code class="readme-inline-code">description</code> / <code class="readme-inline-code">version</code> fields with <code class="readme-inline-code">directory::engine::workers::*</code> and add publication metadata (<code class="readme-inline-code">type</code>, <code class="readme-inline-code">config</code>, <code class="readme-inline-code">supported_targets</code>, <code class="readme-inline-code">total_downloads</code>, <code class="readme-inline-code">dependencies</code>, optional <code class="readme-inline-code">image</code>). <code class="readme-inline-code">workers::list</code> is cursor-paginated with a server-authored page size.</td> <td>"What's published in the public registry?"</td> </tr> </tbody></table> <p>Skills and prompts are sourced from a single configured folder on disk (<code class="readme-inline-code">skills_folder</code>). The only write path is the <strong><code class="readme-inline-code">directory::skills::download</code></strong> function, which pulls markdown into <code class="readme-inline-code">skills_folder</code> from either the <a href="https://workers.iii.dev">workers registry</a> or a GitHub repo. Once downloaded, files belong to the developer — edit them however you want.</p> <p><code class="readme-inline-code">directory::engine::workers::*</code> and <code class="readme-inline-code">directory::registry::workers::*</code> share the core <code class="readme-inline-code">name</code> / <code class="readme-inline-code">description</code> / <code class="readme-inline-code">version</code> fields so a parser that touches only those keys works against either surface; the registry view also surfaces publication metadata (<code class="readme-inline-code">type</code>, <code class="readme-inline-code">config</code>, <code class="readme-inline-code">supported_targets</code>, <code class="readme-inline-code">total_downloads</code>, <code class="readme-inline-code">dependencies</code>, optional <code class="readme-inline-code">image</code>) and the engine view adds runtime / connection state.</p> <h2 id="table-of-contents" class="scroll-mt-20">Table of contents</h2> <ol> <li><a href="#install">Install</a></li> <li><a href="#configuration">Configuration</a></li> <li><a href="#quickstart-download-some-skills">Quickstart: download some skills</a></li> <li><a href="#on-disk-layout">On-disk layout</a></li> <li><a href="#skill-ids">Skill ids</a></li> <li><a href="#functions">Functions</a></li> <li><a href="#custom-trigger-types">Custom trigger types</a></li> <li><a href="#local-development--testing">Local development & testing</a></li> <li><a href="#migration-from-skills-v02x">Migration from skills v0.2.x</a></li> </ol> <hr> <h2 id="install" class="scroll-mt-20">Install</h2> <pre class="shiki vitesse-light" style="background-color:#ffffff;color:#393a34" tabindex="0"><code><span class="line"><span style="color:#59873A">iii</span><span style="color:#B56959"> worker</span><span style="color:#B56959"> add</span><span style="color:#B56959"> iii-directory</span></span></code></pre><p><code class="readme-inline-code">iii worker add</code> fetches the binary, writes a config block into <code class="readme-inline-code">~/.iii/config.yaml</code>, and the engine starts the worker on the next <code class="readme-inline-code">iii start</code>.</p> <hr> <h2 id="configuration" class="scroll-mt-20">Configuration</h2> <pre class="shiki vitesse-light" style="background-color:#ffffff;color:#393a34" tabindex="0"><code><span class="line"><span style="color:#A0ADA0"># Folder that backs every read (`directory::skills::list`,</span></span> <span class="line"><span style="color:#A0ADA0"># `directory::skills::get`, `directory::prompts::*`) and every write</span></span> <span class="line"><span style="color:#A0ADA0"># from `directory::skills::download`. Relative paths are resolved</span></span> <span class="line"><span style="color:#A0ADA0"># against the process current working directory; absolute paths are</span></span> <span class="line"><span style="color:#A0ADA0"># used as-is.</span></span> <span class="line"><span style="color:#998418">skills_folder</span><span style="color:#999999">:</span><span style="color:#B56959"> ./skills</span></span> <span class="line"></span> <span class="line"><span style="color:#A0ADA0"># Workers registry base URL — used by `directory::skills::download`</span></span> <span class="line"><span style="color:#A0ADA0"># and the `directory::registry::*` proxies when a `worker=` source is</span></span> <span class="line"><span style="color:#A0ADA0"># specified. Override for self-hosted deployments.</span></span> <span class="line"><span style="color:#998418">registry_url</span><span style="color:#999999">:</span><span style="color:#B56959"> https://api.workers.iii.dev</span></span> <span class="line"></span> <span class="line"><span style="color:#A0ADA0"># Timeout for a single download (`git clone` or HTTP request) in ms.</span></span> <span class="line"><span style="color:#998418">download_timeout_ms</span><span style="color:#999999">:</span><span style="color:#2F798A"> 60000</span></span></code></pre><p>The folder is created on first download if it doesn't exist.</p> <hr> <h2 id="quickstart-download-some-skills" class="scroll-mt-20">Quickstart: download some skills</h2> <pre class="shiki vitesse-light" style="background-color:#ffffff;color:#393a34" tabindex="0"><code><span class="line"><span style="color:#A0ADA0"># Pull a specific worker's skills + prompts at a fixed semver from</span></span> <span class="line"><span style="color:#A0ADA0"># the registry. Files land under `<skills_folder>/agent-memory/`.</span></span> <span class="line"><span style="color:#59873A">iii</span><span style="color:#B56959"> trigger</span><span style="color:#A65E2B"> --function-id=directory::skills::download</span><span style="color:#A65E2B"> \</span></span> <span class="line"><span style="color:#A65E2B"> --payload=</span><span style="color:#B5695977">'</span><span style="color:#B56959">{"worker": "agent-memory", "version": "1.2.3"}</span><span style="color:#B5695977">'</span></span> <span class="line"></span> <span class="line"><span style="color:#A0ADA0"># Same, but always fetch whatever's tagged `latest` (also the default</span></span> <span class="line"><span style="color:#A0ADA0"># when neither version nor tag is given).</span></span> <span class="line"><span style="color:#59873A">iii</span><span style="color:#B56959"> trigger</span><span style="color:#A65E2B"> --function-id=directory::skills::download</span><span style="color:#A65E2B"> \</span></span> <span class="line"><span style="color:#A65E2B"> --payload=</span><span style="color:#B5695977">'</span><span style="color:#B56959">{"worker": "agent-memory"}</span><span style="color:#B5695977">'</span></span> <span class="line"></span> <span class="line"><span style="color:#A0ADA0"># Pull a single subfolder out of a public GitHub repo via</span></span> <span class="line"><span style="color:#A0ADA0"># `git clone --depth 1 --branch main`. Files land under</span></span> <span class="line"><span style="color:#A0ADA0"># `<skills_folder>/frontend-design/`. The `branch` field defaults to</span></span> <span class="line"><span style="color:#A0ADA0"># `main`; pass `"master"` for older repos that haven't migrated.</span></span> <span class="line"><span style="color:#59873A">iii</span><span style="color:#B56959"> trigger</span><span style="color:#A65E2B"> --function-id=directory::skills::download</span><span style="color:#A65E2B"> \</span></span> <span class="line"><span style="color:#A65E2B"> --payload=</span><span style="color:#B5695977">'</span><span style="color:#B56959">{</span></span> <span class="line"><span style="color:#B56959"> "repo": "https://github.com/anthropics/skills",</span></span> <span class="line"><span style="color:#B56959"> "skill": "frontend-design"</span></span> <span class="line"><span style="color:#B56959"> }</span><span style="color:#B5695977">'</span></span></code></pre><p>The response is <code class="readme-inline-code">{ namespace, skills_written, prompts_written, source }</code> where <code class="readme-inline-code">skills_written</code> and <code class="readme-inline-code">prompts_written</code> are arrays of relative paths / prompt names that were materialised in this run.</p> <p>After every successful download the worker fires the <code class="readme-inline-code">directory::skills::on-change</code> and/or <code class="readme-inline-code">directory::prompts::on-change</code> trigger types so that subscribers like the <a href="../mcp/"><code class="readme-inline-code">mcp</code></a> worker can forward MCP <code class="readme-inline-code">notifications/list_changed</code> to their clients.</p> <hr> <h2 id="on-disk-layout" class="scroll-mt-20">On-disk layout</h2> <p>The worker assumes a fixed layout under <code class="readme-inline-code">skills_folder</code>:</p> <pre><code>skills_folder/ <namespace>/ # one folder per `directory::skills::download` namespace index.md # → iii://<namespace>/index contacts.md # → iii://<namespace>/contacts emails/send-email.md # → iii://<namespace>/emails/send-email prompts/ # ← magic marker for prompts send-email.md # ← MCP slash-command (needs YAML frontmatter) triage.md</code></pre><p>A few rules:</p> <ul> <li><strong>Skill ids</strong> are the relative path under <code class="readme-inline-code">skills_folder</code> with <code class="readme-inline-code">.md</code> stripped. Each segment must satisfy <code class="readme-inline-code">[a-z0-9_-]{1,64}</code>.</li> <li><strong>Skill frontmatter is optional.</strong> When present, the reader honours two keys: <code class="readme-inline-code">title:</code> (used by <code class="readme-inline-code">directory::skills::list</code> and <code class="readme-inline-code">directory::skills::get</code> in preference to a body <code class="readme-inline-code"># H1</code>) and <code class="readme-inline-code">type:</code> (free-form classifier surfaced verbatim on both responses). Any other YAML keys are ignored.</li> <li><strong>Prompts</strong> live under any <code class="readme-inline-code">*/prompts/*.md</code> path. They must start with a YAML frontmatter block declaring at least <code class="readme-inline-code">description</code>; <code class="readme-inline-code">name</code> is optional and overrides the file-stem default.</li> <li>Files anywhere else (i.e. <em>not</em> in a <code class="readme-inline-code">prompts/</code> segment) are skills.</li> </ul> <p>The download function namespaces by source:</p> <table> <thead> <tr> <th>Source</th> <th>Destination</th> </tr> </thead> <tbody><tr> <td><code class="readme-inline-code">repo=URL skill=NAME branch?=main</code></td> <td><code class="readme-inline-code"><skills_folder>/<NAME>/...</code></td> </tr> <tr> <td><code class="readme-inline-code">worker=NAME version=…</code></td> <td><code class="readme-inline-code"><skills_folder>/<NAME>/...</code></td> </tr> <tr> <td><code class="readme-inline-code">worker=NAME tag=…</code> (default <code class="readme-inline-code">tag=latest</code>)</td> <td><code class="readme-inline-code"><skills_folder>/<NAME>/...</code></td> </tr> </tbody></table> <p>Re-pulling the same source overwrites files <strong>file-by-file</strong> — existing siblings outside the response set are preserved (so hand-edited additions survive a re-pull).</p> <hr> <h2 id="skill-ids" class="scroll-mt-20">Skill ids</h2> <p>Skills are addressed by their relative path under <code class="readme-inline-code">skills_folder</code> with <code class="readme-inline-code">.md</code> stripped — e.g. <code class="readme-inline-code"><skills_folder>/agent-memory/observe.md</code> → id <code class="readme-inline-code">"agent-memory/observe"</code>. The same string is what <code class="readme-inline-code">directory::skills::list</code> returns and what <code class="readme-inline-code">directory::skills::get</code> expects in <code class="readme-inline-code">{ "id": ... }</code>. The legacy <code class="readme-inline-code">iii://{id}</code> link form is still accepted on <code class="readme-inline-code">get</code> (the prefix is auto-stripped), but the worker no longer parses any other <code class="readme-inline-code">iii://</code> URI shape — bodies are read solely by id, and the auto-rendered tree-shaped index that previous releases served at <code class="readme-inline-code">iii://directory/skills</code> is gone. Consumers that want a tree-shaped picker iterate <code class="readme-inline-code">list</code> rows themselves and indent by <code class="readme-inline-code">id.matches('/').count()</code>.</p> <hr> <h2 id="functions" class="scroll-mt-20">Functions</h2> <p>Sixteen functions, all under <code class="readme-inline-code">directory::*</code>. All registrations are namespace-clean; this worker is intentionally agnostic to MCP and any other adapter.</p> <h3 id="directoryskills-filesystem-reader" class="scroll-mt-20"><code class="readme-inline-code">directory::skills::*</code> (filesystem reader)</h3> <table> <thead> <tr> <th>Function ID</th> <th>Description</th> </tr> </thead> <tbody><tr> <td><code class="readme-inline-code">directory::skills::download</code></td> <td>Pull markdown into <code class="readme-inline-code">skills_folder</code>. Either <code class="readme-inline-code">{repo, skill, branch?}</code> (defaults <code class="readme-inline-code">branch=main</code>) or `{worker, version?</td> </tr> <tr> <td><code class="readme-inline-code">directory::skills::list</code></td> <td>Enriched listing of every fs-backed skill: <code class="readme-inline-code">{ id, title, type, description, bytes, modified_at }</code> per row. <code class="readme-inline-code">title</code> prefers the YAML frontmatter <code class="readme-inline-code">title:</code> over the body H1, <code class="readme-inline-code">type</code> is lifted from frontmatter <code class="readme-inline-code">type:</code> (<code class="readme-inline-code">null</code> when absent), and <code class="readme-inline-code">description</code> is the first paragraph of the body — so consumers can render a picker without a follow-up <code class="readme-inline-code">get</code> per row.</td> </tr> <tr> <td><code class="readme-inline-code">directory::skills::get</code></td> <td>Fetch one skill by id. Returns <code class="readme-inline-code">{ id, title, type, description, body, modified_at }</code> — same shape <code class="readme-inline-code">directory::skills::list</code> rows use, plus the raw markdown <code class="readme-inline-code">body</code>. Same title-resolution and <code class="readme-inline-code">type</code> precedence as <code class="readme-inline-code">list</code>. Accepts a bare id or the same id prefixed with <code class="readme-inline-code">iii://</code>.</td> </tr> <tr> <td><code class="readme-inline-code">directory::skills::index</code></td> <td>Render one short markdown entry per installed worker (skills with frontmatter <code class="readme-inline-code">type: index</code>). Returns <code class="readme-inline-code">{ body, workers_count }</code> where <code class="readme-inline-code">body</code> is a ready-to-paste page: <code class="readme-inline-code"># Skills index</code>, then one <code class="readme-inline-code">## <worker title></code> heading + the worker's first overview paragraph + a <code class="readme-inline-code">Read iii://<ns>/index</code> pointer the agent can follow with <code class="readme-inline-code">directory::skills::get</code>. Token-light by design; use <code class="readme-inline-code">directory::skills::list</code> for per-skill rows.</td> </tr> </tbody></table> <h3 id="directoryprompts-filesystem-reader" class="scroll-mt-20"><code class="readme-inline-code">directory::prompts::*</code> (filesystem reader)</h3> <table> <thead> <tr> <th>Function ID</th> <th>Description</th> </tr> </thead> <tbody><tr> <td><code class="readme-inline-code">directory::prompts::list</code></td> <td>Metadata-only listing of every fs-backed prompt.</td> </tr> <tr> <td><code class="readme-inline-code">directory::prompts::get</code></td> <td>Fetch one prompt's body + <code class="readme-inline-code">{name, description, modified_at}</code>. Plain shape, no envelope.</td> </tr> </tbody></table> <h3 id="directoryengine-engine-introspection" class="scroll-mt-20"><code class="readme-inline-code">directory::engine::*</code> (engine introspection)</h3> <table> <thead> <tr> <th>Function ID</th> <th>Description</th> </tr> </thead> <tbody><tr> <td><code class="readme-inline-code">directory::engine::functions::list</code></td> <td>List functions registered with the engine; filter by search/prefix/worker.</td> </tr> <tr> <td><code class="readme-inline-code">directory::engine::functions::info</code></td> <td>Single-function detail: schemas, owning worker, registered triggers, bundled how-to.</td> </tr> <tr> <td><code class="readme-inline-code">directory::engine::triggers::list</code></td> <td>List trigger TYPES registered with the engine; filter by search/prefix/worker.</td> </tr> <tr> <td><code class="readme-inline-code">directory::engine::triggers::info</code></td> <td>Single trigger-type detail: configuration schema, return schema, instance count.</td> </tr> <tr> <td><code class="readme-inline-code">directory::engine::registered-triggers::list</code></td> <td>List registered trigger INSTANCES (subscriber rows).</td> </tr> <tr> <td><code class="readme-inline-code">directory::engine::registered-triggers::info</code></td> <td>Composite: instance + trigger-type detail + function detail.</td> </tr> <tr> <td><code class="readme-inline-code">directory::engine::workers::list</code></td> <td>List workers connected to the engine; shares the core <code class="readme-inline-code">name</code> / <code class="readme-inline-code">description</code> / <code class="readme-inline-code">version</code> fields with <code class="readme-inline-code">directory::registry::workers::list</code>.</td> </tr> <tr> <td><code class="readme-inline-code">directory::engine::workers::info</code></td> <td>One worker's <code class="readme-inline-code">worker</code> envelope + functions + trigger types + registered triggers.</td> </tr> </tbody></table> <h3 id="directoryregistry-workers-registry-http-proxy" class="scroll-mt-20"><code class="readme-inline-code">directory::registry::*</code> (workers registry HTTP proxy)</h3> <table> <thead> <tr> <th>Function ID</th> <th>Description</th> </tr> </thead> <tbody><tr> <td><code class="readme-inline-code">directory::registry::workers::list</code></td> <td>Browse / search published workers in <code class="readme-inline-code">api.workers.iii.dev</code>. Optional free-text <code class="readme-inline-code">search</code> (matched fuzzy by <code class="readme-inline-code">pg_trgm</code>) and opaque <code class="readme-inline-code">cursor</code> for pagination; page size is server-authored. Response is <code class="readme-inline-code">{ workers: [...], pagination: { next_cursor, has_more, page_size } }</code>. Shares the core <code class="readme-inline-code">name</code> / <code class="readme-inline-code">description</code> / <code class="readme-inline-code">version</code> fields with <code class="readme-inline-code">directory::engine::workers::list</code>.</td> </tr> <tr> <td><code class="readme-inline-code">directory::registry::workers::info</code></td> <td>Full registry detail for one worker. Fans out two parallel registry calls — <code class="readme-inline-code">GET /w/{slug}</code> for the worker envelope (publication metadata + readme + functions + triggers) and <code class="readme-inline-code">GET /w/{slug}/skills</code> for the skills/prompts tree — and merges them into <code class="readme-inline-code">{ worker, readme, api_reference, skills_tree }</code>. The user-facing input still accepts <code class="readme-inline-code">version:</code> (semver) or <code class="readme-inline-code">tag:</code> (e.g. <code class="readme-inline-code">latest</code>); both go on the wire as <code class="readme-inline-code">?version=…</code>.</td> </tr> </tbody></table> <p>Both <code class="readme-inline-code">directory::registry::*</code> responses are cached in-process for <code class="readme-inline-code">registry_cache_ttl_ms</code> (default 60s).</p> <p>There is <strong>no</strong> <code class="readme-inline-code">directory::skills::register</code> / <code class="readme-inline-code">directory::prompts::register</code> — see <a href="#migration-from-skills-v02x">Migration</a> below.</p> <hr> <h2 id="custom-trigger-types" class="scroll-mt-20">Custom trigger types</h2> <table> <thead> <tr> <th>Trigger type</th> <th>Fires when</th> <th>Payload to subscribers</th> </tr> </thead> <tbody><tr> <td><code class="readme-inline-code">directory::skills::on-change</code></td> <td>After a <code class="readme-inline-code">directory::skills::download</code> that wrote at least one skill markdown file</td> <td><code class="readme-inline-code">{ "op": "download", "namespace": "<ns>", "source": "repo" | "registry" }</code></td> </tr> <tr> <td><code class="readme-inline-code">directory::prompts::on-change</code></td> <td>After a <code class="readme-inline-code">directory::skills::download</code> that wrote at least one prompt markdown file</td> <td><code class="readme-inline-code">{ "op": "download", "namespace": "<ns>", "source": "repo" | "registry" }</code></td> </tr> </tbody></table> <p>Dispatches are fire-and-forget (Void), so the download path doesn't block on downstream latency.</p> <hr> <h2 id="local-development-testing" class="scroll-mt-20">Local development & testing</h2> <h3 id="run-from-source" class="scroll-mt-20">Run from source</h3> <pre class="shiki vitesse-light" style="background-color:#ffffff;color:#393a34" tabindex="0"><code><span class="line"><span style="color:#59873A">cargo</span><span style="color:#B56959"> run</span><span style="color:#A65E2B"> --release</span><span style="color:#A65E2B"> --</span><span style="color:#A65E2B"> --url</span><span style="color:#B56959"> ws://127.0.0.1:49134</span><span style="color:#A65E2B"> --config</span><span style="color:#B56959"> ./config.yaml</span></span></code></pre><h3 id="tests" class="scroll-mt-20">Tests</h3> <pre class="shiki vitesse-light" style="background-color:#ffffff;color:#393a34" tabindex="0"><code><span class="line"><span style="color:#A0ADA0"># Fast, offline — exercises the pure helpers (markdown / id validators</span></span> <span class="line"><span style="color:#A0ADA0"># / fs source) without needing an iii engine.</span></span> <span class="line"><span style="color:#59873A">cargo</span><span style="color:#B56959"> test</span><span style="color:#A65E2B"> --lib</span></span> <span class="line"></span> <span class="line"><span style="color:#A0ADA0"># Full BDD suite — requires an iii engine on ws://127.0.0.1:49134</span></span> <span class="line"><span style="color:#A0ADA0"># (or III_ENGINE_WS_URL). The git-backed download scenarios spin up</span></span> <span class="line"><span style="color:#A0ADA0"># a local fixture repo via `git init`; the registry-backed scenarios</span></span> <span class="line"><span style="color:#A0ADA0"># point a wiremock server at the worker's `registry_url` config.</span></span> <span class="line"><span style="color:#59873A">cargo</span><span style="color:#B56959"> test</span></span> <span class="line"></span> <span class="line"><span style="color:#A0ADA0"># One feature group at a time. Available tags:</span></span> <span class="line"><span style="color:#A0ADA0"># @engine @read @prompts @download @download_repo @download_registry</span></span> <span class="line"><span style="color:#59873A">cargo</span><span style="color:#B56959"> test</span><span style="color:#A65E2B"> --test</span><span style="color:#B56959"> bdd</span><span style="color:#A65E2B"> --</span><span style="color:#A65E2B"> --tags</span><span style="color:#B56959"> @download</span></span></code></pre><p>The BDD harness lives under <a href="tests/">tests/</a>. Feature files mirror the modules in <a href="src/functions/">src/functions/</a>. Step definitions under <a href="tests/steps/">tests/steps/</a> drive each feature through the same <code class="readme-inline-code">iii.trigger</code> path the production binary uses.</p> </div></div></section></div><aside class="flex flex-col gap-y-4 @4xl:sticky @4xl:top-4 @4xl:self-start @4xl:max-h-[calc(100dvh-2rem)] @4xl:overflow-y-auto"><div class="border border-rule bg-bg"><div class="bg-panel px-3.5 py-2.5 border-b border-rule"><span class="font-mono text-[11px] font-medium uppercase tracking-[0.18em] text-ink-faint">details</span></div><div class="p-4 flex flex-col gap-y-2.5"><div class="flex items-baseline justify-between font-mono text-[13px] gap-x-3"><span class="text-ink-faint shrink-0 uppercase tracking-[0.06em] text-[11px]">version</span><span class="text-ink truncate text-right lowercase tabular-nums">v0.7.0</span></div><div class="flex items-baseline justify-between font-mono text-[13px] gap-x-3"><span class="text-ink-faint shrink-0 uppercase tracking-[0.06em] text-[11px]">type</span><span class="text-ink truncate text-right lowercase ">binary</span></div><div class="flex items-baseline justify-between font-mono text-[13px] gap-x-3 min-w-0"><span class="text-ink-faint shrink-0 uppercase tracking-[0.06em] text-[11px]">repo</span><a href="https://github.com/iii-hq/workers" target="_blank" rel="noreferrer" class="inline-flex items-center gap-x-1 font-mono text-[13px] text-ink lowercase hover:text-accent transition-colors min-w-0 text-right justify-end"><span class="truncate">iii-hq/workers</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link size-3 shrink-0" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></div></div></div><div class="border border-rule bg-bg"><div class="bg-panel px-3.5 py-2.5 border-b border-rule"><span class="font-mono text-[11px] font-medium uppercase tracking-[0.18em] text-ink-faint">api</span></div><div class="p-4 flex flex-col gap-y-4"><div class="flex flex-col gap-y-1.5"><div class="flex items-baseline justify-between"><span class="font-mono text-[10px] uppercase tracking-[0.18em] text-ink-ghost">functions</span><span class="font-mono text-[10px] text-ink-ghost tabular-nums">16</span></div><ul class="flex flex-col"><li><a class="block font-mono text-[12.5px] truncate py-0.5 transition-colors text-ink hover:text-accent" href="/workers/iii-directory?tab=api&version=0.7.0#fn-directory::engine::functions::info">directory::engine::functions::info</a></li><li><a class="block font-mono text-[12.5px] truncate py-0.5 transition-colors text-ink hover:text-accent" href="/workers/iii-directory?tab=api&version=0.7.0#fn-directory::skills::index">directory::skills::index</a></li><li><a class="block font-mono text-[12.5px] truncate py-0.5 transition-colors text-ink hover:text-accent" href="/workers/iii-directory?tab=api&version=0.7.0#fn-directory::engine::registered-triggers::info">directory::engine::registered-triggers::info</a></li><li><a class="block font-mono text-[12.5px] truncate py-0.5 transition-colors text-ink hover:text-accent" href="/workers/iii-directory?tab=api&version=0.7.0#fn-directory::skills::download">directory::skills::download</a></li><li><a class="block font-mono text-[12.5px] truncate py-0.5 transition-colors text-ink hover:text-accent" href="/workers/iii-directory?tab=api&version=0.7.0#fn-directory::engine::registered-triggers::list">directory::engine::registered-triggers::list</a></li><li><a class="block font-mono text-[12.5px] truncate py-0.5 transition-colors text-ink hover:text-accent" href="/workers/iii-directory?tab=api&version=0.7.0#fn-directory::prompts::get">directory::prompts::get</a></li><li><a class="block font-mono text-[12.5px] truncate py-0.5 transition-colors text-ink hover:text-accent" href="/workers/iii-directory?tab=api&version=0.7.0#fn-directory::engine::workers::info">directory::engine::workers::info</a></li><li><a class="block font-mono text-[12.5px] truncate py-0.5 transition-colors text-ink hover:text-accent" href="/workers/iii-directory?tab=api&version=0.7.0#fn-directory::prompts::list">directory::prompts::list</a></li><li><a class="block font-mono text-[12.5px] truncate py-0.5 transition-colors text-ink hover:text-accent" href="/workers/iii-directory?tab=api&version=0.7.0#fn-directory::engine::functions::list">directory::engine::functions::list</a></li><li><a class="block font-mono text-[12.5px] truncate py-0.5 transition-colors text-ink hover:text-accent" href="/workers/iii-directory?tab=api&version=0.7.0#fn-directory::engine::triggers::list">directory::engine::triggers::list</a></li><li><a class="block font-mono text-[12.5px] truncate py-0.5 transition-colors text-ink hover:text-accent" href="/workers/iii-directory?tab=api&version=0.7.0#fn-directory::engine::workers::list">directory::engine::workers::list</a></li><li><a class="block font-mono text-[12.5px] truncate py-0.5 transition-colors text-ink hover:text-accent" href="/workers/iii-directory?tab=api&version=0.7.0#fn-directory::engine::triggers::info">directory::engine::triggers::info</a></li><li><a class="block font-mono text-[12.5px] truncate py-0.5 transition-colors text-ink hover:text-accent" href="/workers/iii-directory?tab=api&version=0.7.0#fn-directory::registry::workers::list">directory::registry::workers::list</a></li><li><a class="block font-mono text-[12.5px] truncate py-0.5 transition-colors text-ink hover:text-accent" href="/workers/iii-directory?tab=api&version=0.7.0#fn-directory::skills::list">directory::skills::list</a></li><li><a class="block font-mono text-[12.5px] truncate py-0.5 transition-colors text-ink hover:text-accent" href="/workers/iii-directory?tab=api&version=0.7.0#fn-directory::registry::workers::info">directory::registry::workers::info</a></li><li><a class="block font-mono text-[12.5px] truncate py-0.5 transition-colors text-ink hover:text-accent" href="/workers/iii-directory?tab=api&version=0.7.0#fn-directory::skills::get">directory::skills::get</a></li></ul></div><div class="flex flex-col gap-y-1.5"><div class="flex items-baseline justify-between"><span class="font-mono text-[10px] uppercase tracking-[0.18em] text-ink-ghost">triggers</span><span class="font-mono text-[10px] text-ink-ghost tabular-nums">2</span></div><ul class="flex flex-col"><li><a class="block font-mono text-[12.5px] truncate py-0.5 transition-colors text-ink hover:text-accent" href="/workers/iii-directory?tab=api&version=0.7.0#trigger-directory::prompts::on-change">directory::prompts::on-change</a></li><li><a class="block font-mono text-[12.5px] truncate py-0.5 transition-colors text-ink hover:text-accent" href="/workers/iii-directory?tab=api&version=0.7.0#trigger-directory::skills::on-change">directory::skills::on-change</a></li></ul></div></div></div><div class="border border-rule bg-bg"><div class="bg-panel px-3.5 py-2.5 border-b border-rule"><span class="font-mono text-[11px] font-medium uppercase tracking-[0.18em] text-ink-faint">author</span></div><div class="p-4 flex flex-col gap-y-2.5"><div class="flex items-center gap-x-2 font-mono text-[13px]"><img src="https://iii.dev/docs/_mintlify/favicons/motiadev/AFkVbz_UcSL_5jsm/_generated/favicon/apple-touch-icon.png" alt="" class="size-5 object-cover"/><span class="text-ink lowercase">iii</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-check size-3.5 text-accent" aria-hidden="true"><path d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z"></path><path d="m9 12 2 2 4-4"></path></svg></div></div></div></aside></div></div></div><!--$--><!--/$--></main><footer class="border-t border-rule bg-bg"><div class="flex items-center justify-between flex-wrap gap-x-6 gap-y-3 px-9 py-4.5"><a aria-label="iii worker — registry home" class="inline-flex items-center gap-x-2 text-ink" href="/"><svg viewBox="0 0 1075.74 1075.69" aria-hidden="true" focusable="false" class="size-[14px]" fill="currentColor"><rect x="0" y="0.05" width="268.94" height="268.94"></rect><rect x="403.4" y="0.05" width="268.94" height="268.94"></rect><rect x="806.81" y="0.05" width="268.94" height="268.94"></rect><rect x="0" y="403.45" width="268.94" height="672.24"></rect><rect x="403.4" y="403.45" width="268.94" height="672.24"></rect><rect x="806.81" y="403.45" width="268.94" height="672.24"></rect></svg><span class="font-mono text-[13px] font-medium tracking-[-0.02em] lowercase">iii / worker</span></a><nav aria-label="footer" class="flex items-center flex-wrap gap-x-6 gap-y-2"><a href="https://iii.dev" target="_blank" rel="noreferrer" class="inline-flex items-center gap-x-1 font-mono text-[13px] text-ink-faint hover:text-ink lowercase transition-colors">iii.dev<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link size-3 shrink-0" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a href="https://iii.dev/docs" target="_blank" rel="noreferrer" class="inline-flex items-center gap-x-1 font-mono text-[13px] text-ink-faint hover:text-ink lowercase transition-colors">docs<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link size-3 shrink-0" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a class="font-mono text-[13px] text-ink-faint hover:text-ink lowercase transition-colors" href="/badge-preview">badge preview</a><a href="https://discord.gg/iiidev" target="_blank" rel="noreferrer" class="inline-flex items-center gap-x-1 font-mono text-[13px] text-ink-faint hover:text-ink lowercase transition-colors">discord<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link size-3 shrink-0" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a href="https://github.com/iii-hq/iii" target="_blank" rel="noreferrer" class="inline-flex items-center gap-x-1 font-mono text-[13px] text-ink-faint hover:text-ink lowercase transition-colors">github<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link size-3 shrink-0" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a></nav></div></footer></div></div><script src="/_next/static/chunks/0b_t-9oq5.7ee.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[40048,[\"/_next/static/chunks/0h16~zfzwpy2_.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/0~_d9nztcm4i3.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\"],\"BootstrapScripts\"]\n4:I[46610,[\"/_next/static/chunks/0h16~zfzwpy2_.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/0~_d9nztcm4i3.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/1654zzt8eb315.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\"],\"\"]\n5:I[8808,[\"/_next/static/chunks/0h16~zfzwpy2_.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/0~_d9nztcm4i3.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\"],\"ThemeToggle\"]\n6:I[90280,[\"/_next/static/chunks/04ylibgf-0e6d.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/0.vqct1a~k736.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\"],\"default\"]\n7:I[69616,[\"/_next/static/chunks/04ylibgf-0e6d.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/0.vqct1a~k736.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\"],\"default\"]\ne:I[50609,[\"/_next/static/chunks/0h16~zfzwpy2_.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/0~_d9nztcm4i3.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/02eqejg_b4k2y.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\"],\"default\"]\n10:I[41074,[\"/_next/static/chunks/0h16~zfzwpy2_.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/0~_d9nztcm4i3.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/1654zzt8eb315.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\"],\"default\"]\n12:I[51557,[\"/_next/static/chunks/04ylibgf-0e6d.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/0.vqct1a~k736.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\"],\"OutletBoundary\"]\n13:\"$Sreact.suspense\"\n16:I[51557,[\"/_next/static/chunks/04ylibgf-0e6d.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/0.vqct1a~k736.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\"],\"ViewportBoundary\"]\n18:I[51557,[\"/_next/static/chunks/04ylibgf-0e6d.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/0.vqct1a~k736.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\"],\"MetadataBoundary\"]\n:HL[\"/_next/static/chunks/0njvmx8~v~~b1.css?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"style\"]\n:HL[\"/_next/static/media/387ee14c0e0fe675-s.p.16njqniuj6huf.woff2?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n3:[\"$\",\"iframe\",null,{\"src\":\"https://www.googletagmanager.com/ns.html?id=GTM-N8DCTFB8\",\"height\":\"0\",\"width\":\"0\",\"style\":{\"display\":\"none\",\"visibility\":\"hidden\"},\"title\":\"Google Tag Manager\"}]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"workers\",\"iii-directory?version=0.7.0\"],\"q\":\"?version=0.7.0\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"workers\",{\"children\":[[\"slug\",\"iii-directory\",\"d\",null],{\"children\":[\"__PAGE__?{\\\"version\\\":\\\"0.7.0\\\"}\",{}]}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0njvmx8~v~~b1.css?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0h16~zfzwpy2_.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0~_d9nztcm4i3.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"chivo_mono_90504305-module__244I6q__variable antialiased\",\"data-theme\":\"light\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"bg-bg text-ink font-sans min-h-full flex flex-col\",\"children\":[[\"$\",\"$L2\",null,{}],[\"$\",\"noscript\",null,{\"children\":\"$3\"}],[\"$\",\"div\",null,{\"className\":\"mx-auto w-full max-w-[1200px] @container border-x border-rule h-screen bg-bg flex flex-col\",\"children\":[[\"$\",\"header\",null,{\"className\":\"sticky top-0 z-30 bg-bg border-b border-rule\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex items-center justify-between px-9 py-4.5\",\"children\":[[\"$\",\"$L4\",null,{\"href\":\"/\",\"aria-label\":\"iii worker — registry home\",\"className\":\"inline-flex items-center gap-x-3 text-ink\",\"children\":[[\"$\",\"svg\",null,{\"viewBox\":\"0 0 1075.74 1075.69\",\"aria-hidden\":\"true\",\"focusable\":\"false\",\"className\":\"size-[18px]\",\"fill\":\"currentColor\",\"children\":[[\"$\",\"rect\",null,{\"x\":\"0\",\"y\":\"0.05\",\"width\":\"268.94\",\"height\":\"268.94\"}],[\"$\",\"rect\",null,{\"x\":\"403.4\",\"y\":\"0.05\",\"width\":\"268.94\",\"height\":\"268.94\"}],[\"$\",\"rect\",null,{\"x\":\"806.81\",\"y\":\"0.05\",\"width\":\"268.94\",\"height\":\"268.94\"}],[\"$\",\"rect\",null,{\"x\":\"0\",\"y\":\"403.45\",\"width\":\"268.94\",\"height\":\"672.24\"}],[\"$\",\"rect\",null,{\"x\":\"403.4\",\"y\":\"403.45\",\"width\":\"268.94\",\"height\":\"672.24\"}],[\"$\",\"rect\",null,{\"x\":\"806.81\",\"y\":\"403.45\",\"width\":\"268.94\",\"height\":\"672.24\"}]]}],[\"$\",\"span\",null,{\"className\":\"font-mono text-[18px] leading-[18px] font-semibold tracking-[-0.02em] lowercase \",\"children\":\"iii / worker\"}]]}],[\"$\",\"$L5\",null,{}]]}]}],[\"$\",\"div\",null,{\"className\":\"flex-1 overflow-y-auto flex flex-col\",\"children\":[[\"$\",\"main\",null,{\"className\":\"flex-1\",\"children\":[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"div\",null,{\"className\":\"page-transition\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex items-end justify-between flex-wrap gap-x-6 gap-y-4 px-9 py-12\",\"children\":[[\"$\",\"div\",null,{\"className\":\"min-w-0\",\"children\":[[\"$\",\"div\",null,{\"className\":\"font-mono text-[11px] uppercase tracking-[0.06em] text-ink-faint mb-3\",\"children\":[\"$\",\"span\",null,{\"className\":\"font-mono text-accent\",\"children\":[\"$$\",[\"$\",\"span\",null,{\"className\":\"text-ink ml-2\",\"children\":\"error\"}]]}]}],[\"$\",\"div\",null,{\"className\":\"flex items-baseline flex-wrap gap-x-3 gap-y-1\",\"children\":[[\"$\",\"h1\",null,{\"className\":\"font-mono text-[28px] font-medium tracking-[-0.01em] text-ink lowercase\",\"children\":[\"$\",\"span\",null,{\"className\":\"inline-flex items-baseline gap-x-2 tabular-nums\",\"children\":[\"404\",[\"$\",\"span\",null,{\"aria-hidden\":true,\"className\":\"blink inline-block w-[6px] h-[13px] bg-ink align-middle translate-y-[1px]\"}]]}]}],null]}],[\"$\",\"p\",null,{\"className\":\"mt-3 font-mono text-[14px] leading-[1.7] text-ink-faint max-w-[60ch] lowercase\",\"children\":\"that worker is not in the registry. it may have been renamed or never published.\"}]]}],[\"$\",\"div\",null,{\"className\":\"flex items-center gap-x-3\",\"children\":[\"$\",\"$L4\",null,{\"href\":\"/\",\"className\":\"inline-flex items-center justify-center gap-x-2 whitespace-nowrap font-mono lowercase rounded-none transition-[background-color,color,border-color] duration-150 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent disabled:pointer-events-none disabled:opacity-40 select-none bg-ink text-bg border border-ink hover:bg-bg hover:text-ink h-9 px-5 text-[13px]\",\"children\":\"back to registry\"}]}]]}]}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],[\"$\",\"footer\",null,{\"className\":\"border-t border-rule bg-bg\",\"children\":\"$L8\"}]]}]]}]]}]}]]}],{\"children\":[\"$L9\",{\"children\":[\"$La\",{\"children\":[\"$Lb\",{},null,false,null]},null,false,\"$@c\"]},null,false,\"$@c\"]},null,false,null],\"$Ld\",false]],\"m\":\"$undefined\",\"G\":[\"$e\",[\"$Lf\"]],\"S\":false,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"8:[\"$\",\"div\",null,{\"className\":\"flex items-center justify-between flex-wrap gap-x-6 gap-y-3 px-9 py-4.5\",\"children\":[[\"$\",\"$L4\",null,{\"href\":\"/\",\"aria-label\":\"iii worker — registry home\",\"className\":\"inline-flex items-center gap-x-2 text-ink\",\"children\":[[\"$\",\"svg\",null,{\"viewBox\":\"0 0 1075.74 1075.69\",\"aria-hidden\":\"true\",\"focusable\":\"false\",\"className\":\"size-[14px]\",\"fill\":\"currentColor\",\"children\":[[\"$\",\"rect\",null,{\"x\":\"0\",\"y\":\"0.05\",\"width\":\"268.94\",\"height\":\"268.94\"}],[\"$\",\"rect\",null,{\"x\":\"403.4\",\"y\":\"0.05\",\"width\":\"268.94\",\"height\":\"268.94\"}],[\"$\",\"rect\",null,{\"x\":\"806.81\",\"y\":\"0.05\",\"width\":\"268.94\",\"height\":\"268.94\"}],[\"$\",\"rect\",null,{\"x\":\"0\",\"y\":\"403.45\",\"width\":\"268.94\",\"height\":\"672.24\"}],[\"$\",\"rect\",null,{\"x\":\"403.4\",\"y\":\"403.45\",\"width\":\"268.94\",\"height\":\"672.24\"}],[\"$\",\"rect\",null,{\"x\":\"806.81\",\"y\":\"403.45\",\"width\":\"268.94\",\"height\":\"672.24\"}]]}],[\"$\",\"span\",null,{\"className\":\"font-mono text-[13px] font-medium tracking-[-0.02em] lowercase\",\"children\":\"iii / worker\"}]]}],[\"$\",\"nav\",null,{\"aria-label\":\"footer\",\"className\":\"flex items-center flex-wrap gap-x-6 gap-y-2\",\"children\":[[\"$\",\"a\",\"https://iii.dev\",{\"href\":\"https://iii.dev\",\"target\":\"_blank\",\"rel\":\"noreferrer\",\"className\":\"inline-flex items-center gap-x-1 font-mono text-[13px] text-ink-faint hover:text-ink lowercase transition-colors\",\"children\":[\"iii.dev\",[\"$\",\"$L10\",null,{\"ref\":\"$undefined\",\"iconNode\":[[\"path\",{\"d\":\"M15 3h6v6\",\"key\":\"1q9fwt\"}],[\"path\",{\"d\":\"M10 14 21 3\",\"key\":\"gplh6r\"}],[\"path\",{\"d\":\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\",\"key\":\"a6xqqp\"}]],\"className\":\"lucide-external-link size-3 shrink-0\",\"aria-hidden\":true}]]}],[\"$\",\"a\",\"https://iii.dev/docs\",{\"href\":\"https://iii.dev/docs\",\"target\":\"_blank\",\"rel\":\"noreferrer\",\"className\":\"inline-flex items-center gap-x-1 font-mono text-[13px] text-ink-faint hover:text-ink lowercase transition-colors\",\"children\":[\"docs\",[\"$\",\"$L10\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$8:props:children:1:props:children:0:props:children:1:props:iconNode\",\"className\":\"lucide-external-link size-3 shrink-0\",\"aria-hidden\":true}]]}],[\"$\",\"$L4\",\"/badge-preview\",{\"href\":\"/badge-preview\",\"className\":\"font-mono text-[13px] text-ink-faint hover:text-ink lowercase transition-colors\",\"children\":\"badge preview\"}],[\"$\",\"a\",\"https://discord.gg/iiidev\",{\"href\":\"https://discord.gg/iiidev\",\"target\":\"_blank\",\"rel\":\"noreferrer\",\"className\":\"inline-flex items-center gap-x-1 font-mono text-[13px] text-ink-faint hover:text-ink lowercase transition-colors\",\"children\":[\"discord\",[\"$\",\"$L10\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$8:props:children:1:props:children:0:props:children:1:props:iconNode\",\"className\":\"lucide-external-link size-3 shrink-0\",\"aria-hidden\":true}]]}],[\"$\",\"a\",\"https://github.com/iii-hq/iii\",{\"href\":\"https://github.com/iii-hq/iii\",\"target\":\"_blank\",\"rel\":\"noreferrer\",\"className\":\"inline-flex items-center gap-x-1 font-mono text-[13px] text-ink-faint hover:text-ink lowercase transition-colors\",\"children\":[\"github\",[\"$\",\"$L10\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$8:props:children:1:props:children:0:props:children:1:props:iconNode\",\"className\":\"lucide-external-link size-3 shrink-0\",\"aria-hidden\":true}]]}]]}]]}]\n"])</script><script>self.__next_f.push([1,"9:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\na:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\nb:[\"$\",\"$1\",\"c\",{\"children\":[\"$L11\",[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/1654zzt8eb315.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L12\",null,{\"children\":[\"$\",\"$13\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@14\"}]}]]}]\n15:[]\nc:\"$W15\"\nd:[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L16\",null,{\"children\":\"$L17\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L18\",null,{\"children\":[\"$\",\"$13\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L19\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]\nf:[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0njvmx8~v~~b1.css?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n17:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"1a:I[18418,[\"/_next/static/chunks/04ylibgf-0e6d.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/0.vqct1a~k736.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\"],\"IconMark\"]\n14:null\n"])</script><script>self.__next_f.push([1,"19:[[\"$\",\"title\",\"0\",{\"children\":\"iii-directory - iii worker\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Engine introspection (functions / triggers / workers), workers registry proxy, and filesystem-backed skill + prompt reader.\"}],[\"$\",\"meta\",\"2\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"link\",\"3\",{\"rel\":\"canonical\",\"href\":\"https://workers.iii.dev/workers/iii-directory\"}],[\"$\",\"meta\",\"4\",{\"property\":\"og:title\",\"content\":\"iii-directory - iii worker\"}],[\"$\",\"meta\",\"5\",{\"property\":\"og:description\",\"content\":\"Engine introspection (functions / triggers / workers), workers registry proxy, and filesystem-backed skill + prompt reader.\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:url\",\"content\":\"https://workers.iii.dev/workers/iii-directory\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:image\",\"content\":\"https://workers.iii.dev/workers/iii-directory/opengraph-image?bced171a25d0f70f\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:image:type\",\"content\":\"image/png\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:image:alt\",\"content\":\"iii worker\"}],[\"$\",\"meta\",\"12\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"13\",{\"name\":\"twitter:title\",\"content\":\"iii-directory - iii worker\"}],[\"$\",\"meta\",\"14\",{\"name\":\"twitter:description\",\"content\":\"Engine introspection (functions / triggers / workers), workers registry proxy, and filesystem-backed skill + prompt reader.\"}],[\"$\",\"meta\",\"15\",{\"name\":\"twitter:image\",\"content\":\"https://workers.iii.dev/workers/iii-directory/opengraph-image?bced171a25d0f70f\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:image:alt\",\"content\":\"iii worker\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:image:type\",\"content\":\"image/png\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:image:height\",\"content\":\"630\"}],[\"$\",\"link\",\"20\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0n6vou73am7b3.ico\",\"sizes\":\"48x48\",\"type\":\"image/x-icon\"}],[\"$\",\"$L1a\",\"21\",{}]]\n"])</script><script>self.__next_f.push([1,"1b:I[33516,[\"/_next/static/chunks/0h16~zfzwpy2_.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/0~_d9nztcm4i3.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/1654zzt8eb315.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\"],\"Image\"]\n"])</script><script>self.__next_f.push([1,"11:[\"$\",\"div\",null,{\"className\":\"page-transition\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-end justify-between flex-wrap gap-x-6 gap-y-4 px-9 py-12\",\"children\":[[\"$\",\"div\",null,{\"className\":\"min-w-0\",\"children\":[[\"$\",\"div\",null,{\"className\":\"font-mono text-[11px] uppercase tracking-[0.06em] text-ink-faint mb-3\",\"children\":[\"$\",\"span\",null,{\"className\":\"font-mono text-accent\",\"children\":[\"$$\",[\"$\",\"span\",null,{\"className\":\"text-ink ml-2\",\"children\":\"worker\"}]]}]}],[\"$\",\"div\",null,{\"className\":\"flex items-baseline flex-wrap gap-x-3 gap-y-1\",\"children\":[[\"$\",\"h1\",null,{\"className\":\"font-mono text-[28px] font-medium tracking-[-0.01em] text-ink lowercase\",\"children\":\"iii-directory\"}],[\"$\",\"span\",null,{\"className\":\"font-mono text-[11px] uppercase tracking-[0.06em] text-ink-ghost tabular-nums\",\"children\":\"v0.7.0\"}]]}],[\"$\",\"p\",null,{\"className\":\"mt-3 font-mono text-[14px] leading-[1.7] text-ink-faint max-w-[60ch] lowercase\",\"children\":\"Engine introspection (functions / triggers / workers), workers registry proxy, and filesystem-backed skill + prompt reader.\"}]]}],null]}],[\"$\",\"div\",null,{\"className\":\"px-9 pb-12 flex flex-col gap-y-6\",\"children\":[[\"$\",\"ul\",null,{\"aria-label\":\"Supported platforms\",\"className\":\"flex flex-wrap items-center font-mono text-[12px] gap-x-2 gap-y-1.5 \",\"children\":[[\"$\",\"li\",\"apple\",{\"title\":\"macOS: arm64, x64\",\"className\":\"inline-flex items-center border border-rule bg-bg gap-x-2 px-2 py-1\",\"children\":[[\"$\",\"$L1b\",null,{\"src\":\"/icons/apple_dark.svg\",\"alt\":\"\",\"aria-hidden\":true,\"width\":209,\"height\":256,\"className\":\"shrink-0 [filter:brightness(0)] dark:[filter:brightness(0)_invert(1)] h-4 w-auto\"}],[\"$\",\"span\",null,{\"className\":\"sr-only\",\"children\":[\"macOS\",\": \"]}],[\"$\",\"span\",null,{\"className\":\"text-ink tabular-nums\",\"children\":\"arm64 · x64\"}]]}],[\"$\",\"li\",\"linux\",{\"title\":\"Linux: arm64, armv7, x64\",\"className\":\"inline-flex items-center border border-rule bg-bg gap-x-2 px-2 py-1\",\"children\":[[\"$\",\"$L1b\",null,{\"src\":\"/icons/linux.svg\",\"alt\":\"\",\"aria-hidden\":true,\"width\":256,\"height\":295,\"className\":\"shrink-0 [filter:brightness(0)] dark:[filter:brightness(0)_invert(1)] h-4 w-auto\"}],[\"$\",\"span\",null,{\"className\":\"sr-only\",\"children\":[\"Linux\",\": \"]}],[\"$\",\"span\",null,{\"className\":\"text-ink tabular-nums\",\"children\":\"arm64 · armv7 · x64\"}]]}],[\"$\",\"li\",\"windows\",{\"title\":\"Windows: arm64, x64, x86\",\"className\":\"inline-flex items-center border border-rule bg-bg gap-x-2 px-2 py-1\",\"children\":[[\"$\",\"$L1b\",null,{\"src\":\"/icons/windows.svg\",\"alt\":\"\",\"aria-hidden\":true,\"width\":88,\"height\":88,\"className\":\"shrink-0 [filter:brightness(0)] dark:[filter:brightness(0)_invert(1)] h-4 w-auto\"}],[\"$\",\"span\",null,{\"className\":\"sr-only\",\"children\":[\"Windows\",\": \"]}],[\"$\",\"span\",null,{\"className\":\"text-ink tabular-nums\",\"children\":\"arm64 · x64 · x86\"}]]}]]}],false,[\"$\",\"div\",null,{\"className\":\"grid grid-cols-1 @4xl:grid-cols-[1fr_280px] gap-x-8 gap-y-8\",\"children\":[[\"$\",\"div\",null,{\"className\":\"min-w-0 flex flex-col gap-y-6\",\"children\":[[\"$\",\"nav\",null,{\"aria-label\":\"sections\",\"className\":\"overflow-x-auto\",\"children\":[\"$\",\"div\",null,{\"role\":\"tablist\",\"className\":\"inline-flex border border-rule p-[2px] min-w-max\",\"children\":[[\"$\",\"$L4\",\"readme\",{\"href\":\"/workers/iii-directory?version=0.7.0\",\"scroll\":false,\"role\":\"tab\",\"aria-selected\":true,\"aria-current\":\"page\",\"className\":\"inline-flex items-center font-mono text-[13px] px-3 py-1 lowercase transition-colors bg-ink text-bg\",\"children\":\"readme\"}],[\"$\",\"$L4\",\"api\",{\"href\":\"/workers/iii-directory?tab=api\u0026version=0.7.0\",\"scroll\":false,\"role\":\"tab\",\"aria-selected\":false,\"aria-current\":\"$undefined\",\"className\":\"inline-flex items-center font-mono text-[13px] px-3 py-1 lowercase transition-colors bg-transparent text-ink-faint hover:text-ink\",\"children\":\"api reference\"}],[\"$\",\"$L4\",\"skills\",{\"href\":\"/workers/iii-directory?tab=skills\u0026version=0.7.0\",\"scroll\":false,\"role\":\"tab\",\"aria-selected\":false,\"aria-current\":\"$undefined\",\"className\":\"inline-flex items-center font-mono text-[13px] px-3 py-1 lowercase transition-colors bg-transparent text-ink-faint hover:text-ink\",\"children\":\"skills\"}],[\"$\",\"$L4\",\"agent-context\",{\"href\":\"/workers/iii-directory?tab=agent-context\u0026version=0.7.0\",\"scroll\":false,\"role\":\"tab\",\"aria-selected\":false,\"aria-current\":\"$undefined\",\"className\":\"inline-flex items-center font-mono text-[13px] px-3 py-1 lowercase transition-colors bg-transparent text-ink-faint hover:text-ink\",\"children\":\"agent context\"}],\"$L1c\",\"$L1d\"]}]}],\"$L1e\",false,false,false,false,false,false]}],\"$L1f\"]}]]}]]}]\n"])</script><script>self.__next_f.push([1,"20:I[15957,[\"/_next/static/chunks/0h16~zfzwpy2_.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/0~_d9nztcm4i3.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/1654zzt8eb315.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\"],\"InstallCommand\"]\n21:I[8192,[\"/_next/static/chunks/0h16~zfzwpy2_.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/0~_d9nztcm4i3.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/1654zzt8eb315.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\"],\"ConfigBlock\"]\n23:I[42794,[\"/_next/static/chunks/0h16~zfzwpy2_.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/0~_d9nztcm4i3.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\",\"/_next/static/chunks/1654zzt8eb315.js?dpl=dpl_Ch9m2BBA2GNsgRwRyc1AaXPiaBuo\"],\"SummaryList\"]\n1c:[\"$\",\"$L4\",\"versions\",{\"href\":\"/workers/iii-directory?tab=versions\u0026version=0.7.0\",\"scroll\":false,\"role\":\"tab\",\"aria-selected\":false,\"aria-current\":\"$undefined\",\"className\":\"inline-flex items-center font-mono text-[13px] px-3 py-1 lowercase transition-colors bg-transparent text-ink-faint hover:text-ink\",\"children\":\"versions\"}]\n1d:[\"$\",\"$L4\",\"deps\",{\"href\":\"/workers/iii-directory?tab=deps\u0026version=0.7.0\",\"scroll\":false,\"role\":\"tab\",\"aria-selected\":false,\"aria-current\":\"$undefined\",\"className\":\"inline-flex items-center font-mono text-[13px] px-3 py-1 lowercase transition-colors bg-transparent text-ink-faint hover:text-ink\",\"children\":\"dependencies\"}]\n"])</script><script>self.__next_f.push([1,"1e:[[\"$\",\"section\",null,{\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center justify-between mb-3\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"font-mono text-[12px] font-medium uppercase tracking-[0.18em] text-ink-faint\",\"children\":\"install\"}],\"$undefined\"]}],[\"$\",\"$L20\",null,{\"workerName\":\"iii-directory\",\"version\":\"0.7.0\"}]]}],[\"$\",\"section\",null,{\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center justify-between mb-3\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"font-mono text-[12px] font-medium uppercase tracking-[0.18em] text-ink-faint\",\"children\":\"configuration\"}],\"$undefined\"]}],[\"$\",\"$L21\",null,{\"config\":{\"download_timeout_ms\":60000,\"registry_url\":\"https://api.workers.iii.dev\",\"skills_folder\":\"./skills\"}}]]}],[\"$\",\"section\",null,{\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center justify-between mb-3\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"font-mono text-[12px] font-medium uppercase tracking-[0.18em] text-ink-faint\",\"children\":\"readme\"}],[\"$\",\"a\",null,{\"href\":\"https://api.workers.iii.dev/w/iii-directory/readme?version=0.7.0\",\"target\":\"_blank\",\"rel\":\"noreferrer\",\"className\":\"inline-flex items-center gap-x-1.5 font-mono text-[11px] uppercase tracking-[0.06em] text-ink-faint hover:text-accent transition-colors\",\"children\":[[\"$\",\"span\",null,{\"children\":\"open as markdown\"}],[\"$\",\"$L10\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$8:props:children:1:props:children:0:props:children:1:props:iconNode\",\"className\":\"lucide-external-link w-3 h-3\",\"aria-hidden\":true}]]}]]}],\"$L22\"]}]]\n"])</script><script>self.__next_f.push([1,"1f:[\"$\",\"aside\",null,{\"className\":\"flex flex-col gap-y-4 @4xl:sticky @4xl:top-4 @4xl:self-start @4xl:max-h-[calc(100dvh-2rem)] @4xl:overflow-y-auto\",\"children\":[[\"$\",\"div\",null,{\"className\":\"border border-rule bg-bg\",\"children\":[[\"$\",\"div\",null,{\"className\":\"bg-panel px-3.5 py-2.5 border-b border-rule\",\"children\":[\"$\",\"span\",null,{\"className\":\"font-mono text-[11px] font-medium uppercase tracking-[0.18em] text-ink-faint\",\"children\":\"details\"}]}],[\"$\",\"div\",null,{\"className\":\"p-4 flex flex-col gap-y-2.5\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-baseline justify-between font-mono text-[13px] gap-x-3\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-ink-faint shrink-0 uppercase tracking-[0.06em] text-[11px]\",\"children\":\"version\"}],[\"$\",\"span\",null,{\"className\":\"text-ink truncate text-right lowercase tabular-nums\",\"children\":\"v0.7.0\"}]]}],[\"$\",\"div\",null,{\"className\":\"flex items-baseline justify-between font-mono text-[13px] gap-x-3\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-ink-faint shrink-0 uppercase tracking-[0.06em] text-[11px]\",\"children\":\"type\"}],[\"$\",\"span\",null,{\"className\":\"text-ink truncate text-right lowercase \",\"children\":\"binary\"}]]}],[\"$\",\"div\",null,{\"className\":\"flex items-baseline justify-between font-mono text-[13px] gap-x-3 min-w-0\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-ink-faint shrink-0 uppercase tracking-[0.06em] text-[11px]\",\"children\":\"repo\"}],[\"$\",\"a\",null,{\"href\":\"https://github.com/iii-hq/workers\",\"target\":\"_blank\",\"rel\":\"noreferrer\",\"className\":\"inline-flex items-center gap-x-1 font-mono text-[13px] text-ink lowercase hover:text-accent transition-colors min-w-0 text-right justify-end\",\"children\":[[\"$\",\"span\",null,{\"className\":\"truncate\",\"children\":\"iii-hq/workers\"}],[\"$\",\"$L10\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$8:props:children:1:props:children:0:props:children:1:props:iconNode\",\"className\":\"lucide-external-link size-3 shrink-0\",\"aria-hidden\":true}]]}]]}],\"$undefined\"]}]]}],[\"$\",\"div\",null,{\"className\":\"border border-rule bg-bg\",\"children\":[[\"$\",\"div\",null,{\"className\":\"bg-panel px-3.5 py-2.5 border-b border-rule\",\"children\":[\"$\",\"span\",null,{\"className\":\"font-mono text-[11px] font-medium uppercase tracking-[0.18em] text-ink-faint\",\"children\":\"api\"}]}],[\"$\",\"$L23\",null,{\"slug\":\"iii-directory\",\"version\":\"0.7.0\",\"functions\":[{\"name\":\"directory::engine::functions::info\",\"anchor\":\"fn-directory::engine::functions::info\"},{\"name\":\"directory::skills::index\",\"anchor\":\"fn-directory::skills::index\"},{\"name\":\"directory::engine::registered-triggers::info\",\"anchor\":\"fn-directory::engine::registered-triggers::info\"},{\"name\":\"directory::skills::download\",\"anchor\":\"fn-directory::skills::download\"},{\"name\":\"directory::engine::registered-triggers::list\",\"anchor\":\"fn-directory::engine::registered-triggers::list\"},{\"name\":\"directory::prompts::get\",\"anchor\":\"fn-directory::prompts::get\"},{\"name\":\"directory::engine::workers::info\",\"anchor\":\"fn-directory::engine::workers::info\"},{\"name\":\"directory::prompts::list\",\"anchor\":\"fn-directory::prompts::list\"},{\"name\":\"directory::engine::functions::list\",\"anchor\":\"fn-directory::engine::functions::list\"},{\"name\":\"directory::engine::triggers::list\",\"anchor\":\"fn-directory::engine::triggers::list\"},{\"name\":\"directory::engine::workers::list\",\"anchor\":\"fn-directory::engine::workers::list\"},{\"name\":\"directory::engine::triggers::info\",\"anchor\":\"fn-directory::engine::triggers::info\"},{\"name\":\"directory::registry::workers::list\",\"anchor\":\"fn-directory::registry::workers::list\"},{\"name\":\"directory::skills::list\",\"anchor\":\"fn-directory::skills::list\"},{\"name\":\"directory::registry::workers::info\",\"anchor\":\"fn-directory::registry::workers::info\"},{\"name\":\"directory::skills::get\",\"anchor\":\"fn-directory::skills::get\"}],\"triggers\":[{\"name\":\"directory::prompts::on-change\",\"anchor\":\"trigger-directory::prompts::on-change\"},{\"name\":\"directory::skills::on-change\",\"anchor\":\"trigger-directory::skills::on-change\"}]}]]}],[\"$\",\"div\",null,{\"className\":\"border border-rule bg-bg\",\"children\":[[\"$\",\"div\",null,{\"className\":\"bg-panel px-3.5 py-2.5 border-b border-rule\",\"children\":\"$L24\"}],\"$L25\"]}]]}]\n"])</script><script>self.__next_f.push([1,":HL[\"https://iii.dev/docs/_mintlify/favicons/motiadev/AFkVbz_UcSL_5jsm/_generated/favicon/apple-touch-icon.png\",\"image\"]\n24:[\"$\",\"span\",null,{\"className\":\"font-mono text-[11px] font-medium uppercase tracking-[0.18em] text-ink-faint\",\"children\":\"author\"}]\n25:[\"$\",\"div\",null,{\"className\":\"p-4 flex flex-col gap-y-2.5\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex items-center gap-x-2 font-mono text-[13px]\",\"children\":[[\"$\",\"img\",null,{\"src\":\"https://iii.dev/docs/_mintlify/favicons/motiadev/AFkVbz_UcSL_5jsm/_generated/favicon/apple-touch-icon.png\",\"alt\":\"\",\"className\":\"size-5 object-cover\"}],[\"$\",\"span\",null,{\"className\":\"text-ink lowercase\",\"children\":\"iii\"}],[\"$\",\"$L10\",null,{\"ref\":\"$undefined\",\"iconNode\":[[\"path\",{\"d\":\"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z\",\"key\":\"3c2336\"}],[\"path\",{\"d\":\"m9 12 2 2 4-4\",\"key\":\"dzmm74\"}]],\"className\":\"lucide-badge-check size-3.5 text-accent\"}]]}]}]\n26:T6b73,"])</script><script>self.__next_f.push([1,"\u003ch1 id=\"iii-directory\" class=\"scroll-mt-20\"\u003eiii-directory\u003c/h1\u003e\n\u003cp\u003eEngine introspection, workers registry proxy, and filesystem-backed\nskill + prompt reader for the \u003ca href=\"https://github.com/iii-hq/iii\"\u003eiii engine\u003c/a\u003e.\nEvery public function sits under a single \u003ccode class=\"readme-inline-code\"\u003edirectory::*\u003c/code\u003e namespace,\nsplit into four sub-namespaces (all MCP-agnostic):\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSurface\u003c/th\u003e\n\u003cth\u003eWhat clients see\u003c/th\u003e\n\u003cth\u003eWhen to use it\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eSkills\u003c/strong\u003e (\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::*\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003eEnriched listing via \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::list\u003c/code\u003e (\u003ccode class=\"readme-inline-code\"\u003e{ id, title, type, description, bytes, modified_at }\u003c/code\u003e per row), a single-skill reader \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::get { id }\u003c/code\u003e returning \u003ccode class=\"readme-inline-code\"\u003e{ id, title, type, description, body, modified_at }\u003c/code\u003e, and \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::index\u003c/code\u003e which renders a short per-worker overview document (one \u003ccode class=\"readme-inline-code\"\u003e## \u003ctitle\u003e\u003c/code\u003e + first paragraph + \u003ccode class=\"readme-inline-code\"\u003eread more\u003c/code\u003e link per \u003ccode class=\"readme-inline-code\"\u003etype: index\u003c/code\u003e skill). \u003ccode class=\"readme-inline-code\"\u003etitle\u003c/code\u003e prefers the YAML frontmatter \u003ccode class=\"readme-inline-code\"\u003etitle:\u003c/code\u003e over the body H1; \u003ccode class=\"readme-inline-code\"\u003etype\u003c/code\u003e is lifted from frontmatter \u003ccode class=\"readme-inline-code\"\u003etype:\u003c/code\u003e (e.g. \u003ccode class=\"readme-inline-code\"\u003eindex\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003ehow-to\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003ereference\u003c/code\u003e) and serialised as \u003ccode class=\"readme-inline-code\"\u003enull\u003c/code\u003e when absent.\u003c/td\u003e\n\u003ctd\u003eOrientation: \u0026quot;when and why to use my worker\u0026#39;s tools\u0026quot;\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003ePrompts\u003c/strong\u003e (\u003ccode class=\"readme-inline-code\"\u003edirectory::prompts::*\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003eStatic prompt templates listed by \u003ccode class=\"readme-inline-code\"\u003edirectory::prompts::list\u003c/code\u003e and read by \u003ccode class=\"readme-inline-code\"\u003edirectory::prompts::get\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eParametric command templates the \u003cem\u003euser\u003c/em\u003e invokes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eEngine\u003c/strong\u003e (\u003ccode class=\"readme-inline-code\"\u003edirectory::engine::*\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003eRead-side enrichment over \u003ccode class=\"readme-inline-code\"\u003eengine::functions::list\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003eengine::workers::list\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003eengine::trigger-types::list\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003eengine::triggers::list\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u0026quot;What\u0026#39;s connected to the engine right now?\u0026quot;\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eRegistry\u003c/strong\u003e (\u003ccode class=\"readme-inline-code\"\u003edirectory::registry::*\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003eHTTP proxy over \u003ccode class=\"readme-inline-code\"\u003eapi.workers.iii.dev\u003c/code\u003e with \u003ccode class=\"readme-inline-code\"\u003eworkers::{list,info}\u003c/code\u003e. Rows share the core \u003ccode class=\"readme-inline-code\"\u003ename\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003edescription\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003eversion\u003c/code\u003e fields with \u003ccode class=\"readme-inline-code\"\u003edirectory::engine::workers::*\u003c/code\u003e and add publication metadata (\u003ccode class=\"readme-inline-code\"\u003etype\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003econfig\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003esupported_targets\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003etotal_downloads\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003edependencies\u003c/code\u003e, optional \u003ccode class=\"readme-inline-code\"\u003eimage\u003c/code\u003e). \u003ccode class=\"readme-inline-code\"\u003eworkers::list\u003c/code\u003e is cursor-paginated with a server-authored page size.\u003c/td\u003e\n\u003ctd\u003e\u0026quot;What\u0026#39;s published in the public registry?\u0026quot;\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eSkills and prompts are sourced from a single configured folder on disk\n(\u003ccode class=\"readme-inline-code\"\u003eskills_folder\u003c/code\u003e). The only write path is the\n\u003cstrong\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::download\u003c/code\u003e\u003c/strong\u003e function, which pulls markdown into\n\u003ccode class=\"readme-inline-code\"\u003eskills_folder\u003c/code\u003e from either the\n\u003ca href=\"https://workers.iii.dev\"\u003eworkers registry\u003c/a\u003e or a GitHub repo. Once\ndownloaded, files belong to the developer — edit them however you want.\u003c/p\u003e\n\u003cp\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::engine::workers::*\u003c/code\u003e and \u003ccode class=\"readme-inline-code\"\u003edirectory::registry::workers::*\u003c/code\u003e\nshare the core \u003ccode class=\"readme-inline-code\"\u003ename\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003edescription\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003eversion\u003c/code\u003e fields so a parser\nthat touches only those keys works against either surface; the\nregistry view also surfaces publication metadata (\u003ccode class=\"readme-inline-code\"\u003etype\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003econfig\u003c/code\u003e,\n\u003ccode class=\"readme-inline-code\"\u003esupported_targets\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003etotal_downloads\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003edependencies\u003c/code\u003e, optional\n\u003ccode class=\"readme-inline-code\"\u003eimage\u003c/code\u003e) and the engine view adds runtime / connection state.\u003c/p\u003e\n\u003ch2 id=\"table-of-contents\" class=\"scroll-mt-20\"\u003eTable of contents\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#install\"\u003eInstall\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#configuration\"\u003eConfiguration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#quickstart-download-some-skills\"\u003eQuickstart: download some skills\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#on-disk-layout\"\u003eOn-disk layout\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#skill-ids\"\u003eSkill ids\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#functions\"\u003eFunctions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#custom-trigger-types\"\u003eCustom trigger types\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#local-development--testing\"\u003eLocal development \u0026amp; testing\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#migration-from-skills-v02x\"\u003eMigration from skills v0.2.x\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"install\" class=\"scroll-mt-20\"\u003eInstall\u003c/h2\u003e\n\u003cpre class=\"shiki vitesse-light\" style=\"background-color:#ffffff;color:#393a34\" tabindex=\"0\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#59873A\"\u003eiii\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e worker\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e add\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e iii-directory\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode class=\"readme-inline-code\"\u003eiii worker add\u003c/code\u003e fetches the binary, writes a config block into\n\u003ccode class=\"readme-inline-code\"\u003e~/.iii/config.yaml\u003c/code\u003e, and the engine starts the worker on the next\n\u003ccode class=\"readme-inline-code\"\u003eiii start\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"configuration\" class=\"scroll-mt-20\"\u003eConfiguration\u003c/h2\u003e\n\u003cpre class=\"shiki vitesse-light\" style=\"background-color:#ffffff;color:#393a34\" tabindex=\"0\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# Folder that backs every read (`directory::skills::list`,\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# `directory::skills::get`, `directory::prompts::*`) and every write\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# from `directory::skills::download`. Relative paths are resolved\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# against the process current working directory; absolute paths are\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# used as-is.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#998418\"\u003eskills_folder\u003c/span\u003e\u003cspan style=\"color:#999999\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e ./skills\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# Workers registry base URL — used by `directory::skills::download`\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# and the `directory::registry::*` proxies when a `worker=` source is\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# specified. Override for self-hosted deployments.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#998418\"\u003eregistry_url\u003c/span\u003e\u003cspan style=\"color:#999999\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e https://api.workers.iii.dev\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# Timeout for a single download (`git clone` or HTTP request) in ms.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#998418\"\u003edownload_timeout_ms\u003c/span\u003e\u003cspan style=\"color:#999999\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#2F798A\"\u003e 60000\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe folder is created on first download if it doesn\u0026#39;t exist.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"quickstart-download-some-skills\" class=\"scroll-mt-20\"\u003eQuickstart: download some skills\u003c/h2\u003e\n\u003cpre class=\"shiki vitesse-light\" style=\"background-color:#ffffff;color:#393a34\" tabindex=\"0\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# Pull a specific worker's skills + prompts at a fixed semver from\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# the registry. Files land under `\u0026#x3C;skills_folder\u003e/agent-memory/`.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#59873A\"\u003eiii\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e trigger\u003c/span\u003e\u003cspan style=\"color:#A65E2B\"\u003e --function-id=directory::skills::download\u003c/span\u003e\u003cspan style=\"color:#A65E2B\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A65E2B\"\u003e --payload=\u003c/span\u003e\u003cspan style=\"color:#B5695977\"\u003e'\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e{\"worker\": \"agent-memory\", \"version\": \"1.2.3\"}\u003c/span\u003e\u003cspan style=\"color:#B5695977\"\u003e'\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# Same, but always fetch whatever's tagged `latest` (also the default\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# when neither version nor tag is given).\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#59873A\"\u003eiii\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e trigger\u003c/span\u003e\u003cspan style=\"color:#A65E2B\"\u003e --function-id=directory::skills::download\u003c/span\u003e\u003cspan style=\"color:#A65E2B\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A65E2B\"\u003e --payload=\u003c/span\u003e\u003cspan style=\"color:#B5695977\"\u003e'\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e{\"worker\": \"agent-memory\"}\u003c/span\u003e\u003cspan style=\"color:#B5695977\"\u003e'\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# Pull a single subfolder out of a public GitHub repo via\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# `git clone --depth 1 --branch main`. Files land under\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# `\u0026#x3C;skills_folder\u003e/frontend-design/`. The `branch` field defaults to\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# `main`; pass `\"master\"` for older repos that haven't migrated.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#59873A\"\u003eiii\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e trigger\u003c/span\u003e\u003cspan style=\"color:#A65E2B\"\u003e --function-id=directory::skills::download\u003c/span\u003e\u003cspan style=\"color:#A65E2B\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A65E2B\"\u003e --payload=\u003c/span\u003e\u003cspan style=\"color:#B5695977\"\u003e'\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#B56959\"\u003e \"repo\": \"https://github.com/anthropics/skills\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#B56959\"\u003e \"skill\": \"frontend-design\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#B56959\"\u003e }\u003c/span\u003e\u003cspan style=\"color:#B5695977\"\u003e'\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe response is \u003ccode class=\"readme-inline-code\"\u003e{ namespace, skills_written, prompts_written, source }\u003c/code\u003e\nwhere \u003ccode class=\"readme-inline-code\"\u003eskills_written\u003c/code\u003e and \u003ccode class=\"readme-inline-code\"\u003eprompts_written\u003c/code\u003e are arrays of relative\npaths / prompt names that were materialised in this run.\u003c/p\u003e\n\u003cp\u003eAfter every successful download the worker fires the\n\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::on-change\u003c/code\u003e and/or \u003ccode class=\"readme-inline-code\"\u003edirectory::prompts::on-change\u003c/code\u003e\ntrigger types so that subscribers like the \u003ca href=\"../mcp/\"\u003e\u003ccode class=\"readme-inline-code\"\u003emcp\u003c/code\u003e\u003c/a\u003e worker can\nforward MCP \u003ccode class=\"readme-inline-code\"\u003enotifications/list_changed\u003c/code\u003e to their clients.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"on-disk-layout\" class=\"scroll-mt-20\"\u003eOn-disk layout\u003c/h2\u003e\n\u003cp\u003eThe worker assumes a fixed layout under \u003ccode class=\"readme-inline-code\"\u003eskills_folder\u003c/code\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eskills_folder/\n \u0026lt;namespace\u0026gt;/ # one folder per `directory::skills::download` namespace\n index.md # → iii://\u0026lt;namespace\u0026gt;/index\n contacts.md # → iii://\u0026lt;namespace\u0026gt;/contacts\n emails/send-email.md # → iii://\u0026lt;namespace\u0026gt;/emails/send-email\n prompts/ # ← magic marker for prompts\n send-email.md # ← MCP slash-command (needs YAML frontmatter)\n triage.md\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eA few rules:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eSkill ids\u003c/strong\u003e are the relative path under \u003ccode class=\"readme-inline-code\"\u003eskills_folder\u003c/code\u003e with \u003ccode class=\"readme-inline-code\"\u003e.md\u003c/code\u003e\nstripped. Each segment must satisfy \u003ccode class=\"readme-inline-code\"\u003e[a-z0-9_-]{1,64}\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSkill frontmatter is optional.\u003c/strong\u003e When present, the reader honours\ntwo keys: \u003ccode class=\"readme-inline-code\"\u003etitle:\u003c/code\u003e (used by \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::list\u003c/code\u003e and\n\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::get\u003c/code\u003e in preference to a body \u003ccode class=\"readme-inline-code\"\u003e# H1\u003c/code\u003e) and\n\u003ccode class=\"readme-inline-code\"\u003etype:\u003c/code\u003e (free-form classifier surfaced verbatim on both responses).\nAny other YAML keys are ignored.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePrompts\u003c/strong\u003e live under any \u003ccode class=\"readme-inline-code\"\u003e*/prompts/*.md\u003c/code\u003e path. They must start with\na YAML frontmatter block declaring at least \u003ccode class=\"readme-inline-code\"\u003edescription\u003c/code\u003e; \u003ccode class=\"readme-inline-code\"\u003ename\u003c/code\u003e\nis optional and overrides the file-stem default.\u003c/li\u003e\n\u003cli\u003eFiles anywhere else (i.e. \u003cem\u003enot\u003c/em\u003e in a \u003ccode class=\"readme-inline-code\"\u003eprompts/\u003c/code\u003e segment) are skills.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe download function namespaces by source:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSource\u003c/th\u003e\n\u003cth\u003eDestination\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003erepo=URL skill=NAME branch?=main\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003e\u003cskills_folder\u003e/\u003cNAME\u003e/...\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003eworker=NAME version=…\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003e\u003cskills_folder\u003e/\u003cNAME\u003e/...\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003eworker=NAME tag=…\u003c/code\u003e (default \u003ccode class=\"readme-inline-code\"\u003etag=latest\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003e\u003cskills_folder\u003e/\u003cNAME\u003e/...\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eRe-pulling the same source overwrites files \u003cstrong\u003efile-by-file\u003c/strong\u003e —\nexisting siblings outside the response set are preserved (so\nhand-edited additions survive a re-pull).\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"skill-ids\" class=\"scroll-mt-20\"\u003eSkill ids\u003c/h2\u003e\n\u003cp\u003eSkills are addressed by their relative path under \u003ccode class=\"readme-inline-code\"\u003eskills_folder\u003c/code\u003e with\n\u003ccode class=\"readme-inline-code\"\u003e.md\u003c/code\u003e stripped — e.g. \u003ccode class=\"readme-inline-code\"\u003e\u003cskills_folder\u003e/agent-memory/observe.md\u003c/code\u003e →\nid \u003ccode class=\"readme-inline-code\"\u003e\"agent-memory/observe\"\u003c/code\u003e. The same string is what\n\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::list\u003c/code\u003e returns and what \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::get\u003c/code\u003e\nexpects in \u003ccode class=\"readme-inline-code\"\u003e{ \"id\": ... }\u003c/code\u003e. The legacy \u003ccode class=\"readme-inline-code\"\u003eiii://{id}\u003c/code\u003e link form is still\naccepted on \u003ccode class=\"readme-inline-code\"\u003eget\u003c/code\u003e (the prefix is auto-stripped), but the worker no\nlonger parses any other \u003ccode class=\"readme-inline-code\"\u003eiii://\u003c/code\u003e URI shape — bodies are read solely by\nid, and the auto-rendered tree-shaped index that previous releases\nserved at \u003ccode class=\"readme-inline-code\"\u003eiii://directory/skills\u003c/code\u003e is gone. Consumers that want a\ntree-shaped picker iterate \u003ccode class=\"readme-inline-code\"\u003elist\u003c/code\u003e rows themselves and indent by\n\u003ccode class=\"readme-inline-code\"\u003eid.matches('/').count()\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"functions\" class=\"scroll-mt-20\"\u003eFunctions\u003c/h2\u003e\n\u003cp\u003eSixteen functions, all under \u003ccode class=\"readme-inline-code\"\u003edirectory::*\u003c/code\u003e. All registrations are\nnamespace-clean; this worker is intentionally agnostic to MCP and any\nother adapter.\u003c/p\u003e\n\u003ch3 id=\"directoryskills-filesystem-reader\" class=\"scroll-mt-20\"\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::*\u003c/code\u003e (filesystem reader)\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFunction ID\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::download\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePull markdown into \u003ccode class=\"readme-inline-code\"\u003eskills_folder\u003c/code\u003e. Either \u003ccode class=\"readme-inline-code\"\u003e{repo, skill, branch?}\u003c/code\u003e (defaults \u003ccode class=\"readme-inline-code\"\u003ebranch=main\u003c/code\u003e) or `{worker, version?\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::list\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnriched listing of every fs-backed skill: \u003ccode class=\"readme-inline-code\"\u003e{ id, title, type, description, bytes, modified_at }\u003c/code\u003e per row. \u003ccode class=\"readme-inline-code\"\u003etitle\u003c/code\u003e prefers the YAML frontmatter \u003ccode class=\"readme-inline-code\"\u003etitle:\u003c/code\u003e over the body H1, \u003ccode class=\"readme-inline-code\"\u003etype\u003c/code\u003e is lifted from frontmatter \u003ccode class=\"readme-inline-code\"\u003etype:\u003c/code\u003e (\u003ccode class=\"readme-inline-code\"\u003enull\u003c/code\u003e when absent), and \u003ccode class=\"readme-inline-code\"\u003edescription\u003c/code\u003e is the first paragraph of the body — so consumers can render a picker without a follow-up \u003ccode class=\"readme-inline-code\"\u003eget\u003c/code\u003e per row.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::get\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFetch one skill by id. Returns \u003ccode class=\"readme-inline-code\"\u003e{ id, title, type, description, body, modified_at }\u003c/code\u003e — same shape \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::list\u003c/code\u003e rows use, plus the raw markdown \u003ccode class=\"readme-inline-code\"\u003ebody\u003c/code\u003e. Same title-resolution and \u003ccode class=\"readme-inline-code\"\u003etype\u003c/code\u003e precedence as \u003ccode class=\"readme-inline-code\"\u003elist\u003c/code\u003e. Accepts a bare id or the same id prefixed with \u003ccode class=\"readme-inline-code\"\u003eiii://\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::index\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRender one short markdown entry per installed worker (skills with frontmatter \u003ccode class=\"readme-inline-code\"\u003etype: index\u003c/code\u003e). Returns \u003ccode class=\"readme-inline-code\"\u003e{ body, workers_count }\u003c/code\u003e where \u003ccode class=\"readme-inline-code\"\u003ebody\u003c/code\u003e is a ready-to-paste page: \u003ccode class=\"readme-inline-code\"\u003e# Skills index\u003c/code\u003e, then one \u003ccode class=\"readme-inline-code\"\u003e## \u003cworker title\u003e\u003c/code\u003e heading + the worker\u0026#39;s first overview paragraph + a \u003ccode class=\"readme-inline-code\"\u003eRead iii://\u003cns\u003e/index\u003c/code\u003e pointer the agent can follow with \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::get\u003c/code\u003e. Token-light by design; use \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::list\u003c/code\u003e for per-skill rows.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003ch3 id=\"directoryprompts-filesystem-reader\" class=\"scroll-mt-20\"\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::prompts::*\u003c/code\u003e (filesystem reader)\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFunction ID\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::prompts::list\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMetadata-only listing of every fs-backed prompt.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::prompts::get\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFetch one prompt\u0026#39;s body + \u003ccode class=\"readme-inline-code\"\u003e{name, description, modified_at}\u003c/code\u003e. Plain shape, no envelope.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003ch3 id=\"directoryengine-engine-introspection\" class=\"scroll-mt-20\"\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::engine::*\u003c/code\u003e (engine introspection)\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFunction ID\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::engine::functions::list\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eList functions registered with the engine; filter by search/prefix/worker.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::engine::functions::info\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSingle-function detail: schemas, owning worker, registered triggers, bundled how-to.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::engine::triggers::list\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eList trigger TYPES registered with the engine; filter by search/prefix/worker.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::engine::triggers::info\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSingle trigger-type detail: configuration schema, return schema, instance count.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::engine::registered-triggers::list\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eList registered trigger INSTANCES (subscriber rows).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::engine::registered-triggers::info\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eComposite: instance + trigger-type detail + function detail.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::engine::workers::list\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eList workers connected to the engine; shares the core \u003ccode class=\"readme-inline-code\"\u003ename\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003edescription\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003eversion\u003c/code\u003e fields with \u003ccode class=\"readme-inline-code\"\u003edirectory::registry::workers::list\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::engine::workers::info\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOne worker\u0026#39;s \u003ccode class=\"readme-inline-code\"\u003eworker\u003c/code\u003e envelope + functions + trigger types + registered triggers.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003ch3 id=\"directoryregistry-workers-registry-http-proxy\" class=\"scroll-mt-20\"\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::registry::*\u003c/code\u003e (workers registry HTTP proxy)\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFunction ID\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::registry::workers::list\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBrowse / search published workers in \u003ccode class=\"readme-inline-code\"\u003eapi.workers.iii.dev\u003c/code\u003e. Optional free-text \u003ccode class=\"readme-inline-code\"\u003esearch\u003c/code\u003e (matched fuzzy by \u003ccode class=\"readme-inline-code\"\u003epg_trgm\u003c/code\u003e) and opaque \u003ccode class=\"readme-inline-code\"\u003ecursor\u003c/code\u003e for pagination; page size is server-authored. Response is \u003ccode class=\"readme-inline-code\"\u003e{ workers: [...], pagination: { next_cursor, has_more, page_size } }\u003c/code\u003e. Shares the core \u003ccode class=\"readme-inline-code\"\u003ename\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003edescription\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003eversion\u003c/code\u003e fields with \u003ccode class=\"readme-inline-code\"\u003edirectory::engine::workers::list\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::registry::workers::info\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFull registry detail for one worker. Fans out two parallel registry calls — \u003ccode class=\"readme-inline-code\"\u003eGET /w/{slug}\u003c/code\u003e for the worker envelope (publication metadata + readme + functions + triggers) and \u003ccode class=\"readme-inline-code\"\u003eGET /w/{slug}/skills\u003c/code\u003e for the skills/prompts tree — and merges them into \u003ccode class=\"readme-inline-code\"\u003e{ worker, readme, api_reference, skills_tree }\u003c/code\u003e. The user-facing input still accepts \u003ccode class=\"readme-inline-code\"\u003eversion:\u003c/code\u003e (semver) or \u003ccode class=\"readme-inline-code\"\u003etag:\u003c/code\u003e (e.g. \u003ccode class=\"readme-inline-code\"\u003elatest\u003c/code\u003e); both go on the wire as \u003ccode class=\"readme-inline-code\"\u003e?version=…\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eBoth \u003ccode class=\"readme-inline-code\"\u003edirectory::registry::*\u003c/code\u003e responses are cached in-process for\n\u003ccode class=\"readme-inline-code\"\u003eregistry_cache_ttl_ms\u003c/code\u003e (default 60s).\u003c/p\u003e\n\u003cp\u003eThere is \u003cstrong\u003eno\u003c/strong\u003e \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::register\u003c/code\u003e /\n\u003ccode class=\"readme-inline-code\"\u003edirectory::prompts::register\u003c/code\u003e — see\n\u003ca href=\"#migration-from-skills-v02x\"\u003eMigration\u003c/a\u003e below.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"custom-trigger-types\" class=\"scroll-mt-20\"\u003eCustom trigger types\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTrigger type\u003c/th\u003e\n\u003cth\u003eFires when\u003c/th\u003e\n\u003cth\u003ePayload to subscribers\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::on-change\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAfter a \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::download\u003c/code\u003e that wrote at least one skill markdown file\u003c/td\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003e{ \"op\": \"download\", \"namespace\": \"\u003cns\u003e\", \"source\": \"repo\" | \"registry\" }\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::prompts::on-change\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAfter a \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::download\u003c/code\u003e that wrote at least one prompt markdown file\u003c/td\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003e{ \"op\": \"download\", \"namespace\": \"\u003cns\u003e\", \"source\": \"repo\" | \"registry\" }\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eDispatches are fire-and-forget (Void), so the download path doesn\u0026#39;t\nblock on downstream latency.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"local-development-testing\" class=\"scroll-mt-20\"\u003eLocal development \u0026amp; testing\u003c/h2\u003e\n\u003ch3 id=\"run-from-source\" class=\"scroll-mt-20\"\u003eRun from source\u003c/h3\u003e\n\u003cpre class=\"shiki vitesse-light\" style=\"background-color:#ffffff;color:#393a34\" tabindex=\"0\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#59873A\"\u003ecargo\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e run\u003c/span\u003e\u003cspan style=\"color:#A65E2B\"\u003e --release\u003c/span\u003e\u003cspan style=\"color:#A65E2B\"\u003e --\u003c/span\u003e\u003cspan style=\"color:#A65E2B\"\u003e --url\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e ws://127.0.0.1:49134\u003c/span\u003e\u003cspan style=\"color:#A65E2B\"\u003e --config\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e ./config.yaml\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"tests\" class=\"scroll-mt-20\"\u003eTests\u003c/h3\u003e\n\u003cpre class=\"shiki vitesse-light\" style=\"background-color:#ffffff;color:#393a34\" tabindex=\"0\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# Fast, offline — exercises the pure helpers (markdown / id validators\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# / fs source) without needing an iii engine.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#59873A\"\u003ecargo\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e test\u003c/span\u003e\u003cspan style=\"color:#A65E2B\"\u003e --lib\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# Full BDD suite — requires an iii engine on ws://127.0.0.1:49134\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# (or III_ENGINE_WS_URL). The git-backed download scenarios spin up\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# a local fixture repo via `git init`; the registry-backed scenarios\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# point a wiremock server at the worker's `registry_url` config.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#59873A\"\u003ecargo\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e test\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# One feature group at a time. Available tags:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#A0ADA0\"\u003e# @engine @read @prompts @download @download_repo @download_registry\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"color:#59873A\"\u003ecargo\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e test\u003c/span\u003e\u003cspan style=\"color:#A65E2B\"\u003e --test\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e bdd\u003c/span\u003e\u003cspan style=\"color:#A65E2B\"\u003e --\u003c/span\u003e\u003cspan style=\"color:#A65E2B\"\u003e --tags\u003c/span\u003e\u003cspan style=\"color:#B56959\"\u003e @download\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe BDD harness lives under \u003ca href=\"tests/\"\u003etests/\u003c/a\u003e. Feature files mirror the\nmodules in \u003ca href=\"src/functions/\"\u003esrc/functions/\u003c/a\u003e. Step definitions under\n\u003ca href=\"tests/steps/\"\u003etests/steps/\u003c/a\u003e drive each feature through the same\n\u003ccode class=\"readme-inline-code\"\u003eiii.trigger\u003c/code\u003e path the production binary uses.\u003c/p\u003e\n"])</script><script>self.__next_f.push([1,"22:[\"$\",\"div\",null,{\"className\":\"border border-rule bg-bg\",\"children\":[[\"$\",\"div\",null,{\"className\":\"bg-panel px-3.5 py-2.5 border-b border-rule flex flex-col gap-y-1\",\"children\":[\"$\",\"span\",null,{\"className\":\"font-mono text-[11px] font-medium uppercase tracking-[0.18em] text-ink-faint\",\"children\":\"README.md\"}]}],[\"$\",\"div\",null,{\"className\":\"px-7 py-6 readme-prose font-mono\",\"dangerouslySetInnerHTML\":{\"__html\":\"$26\"}}]]}]\n"])</script></body></html>