{"owner":"iii-hq","repo":"iii","hasSkills":true,"totalSkillsCount":4,"totalTokensCount":2923,"categories":["root-instruction","mcp-config","marketplace","plugin-manifest"],"hasMcp":true,"mcpConfig":{"mcpServers":{"iii":{"command":"npx","args":["-y","@modelcontextprotocol/server-iii"]}}},"found":["AGENTS.md",".cursor/mcp.json",".claude-plugin/marketplace.json",".claude-plugin/plugin.json"],"skills":{"AGENTS.md":"# AGENTS.md\n\nYou are working in the iii monorepo — a backend unification engine with three primitives: **Function**, **Trigger**, **Worker**. The engine is Rust. SDKs exist for TypeScript, Python, and Rust. All communicate over WebSocket.\n\n## Commands\n\n```bash\n# Setup\npnpm install                     # JS/TS dependencies\ncargo build --release            # Rust workspace\n\n# Build\npnpm build                       # all JS/TS packages (Turborepo)\ncargo build --release             # engine + Rust SDK\n\n# Test\npnpm test                        # all JS/TS tests\ncargo test                       # all Rust tests\ncargo test -p iii                 # engine only\ncargo test -p iii-sdk             # Rust SDK only\ncd sdk/packages/python/iii && uv sync --extra dev && uv run pytest  # Python SDK\n\n# Lint & Format\npnpm fmt                         # format JS/TS (Biome)\npnpm fmt:check                   # check without changes\npnpm lint                        # lint JS/TS\ncargo fmt --all                   # format Rust\ncargo clippy --workspace          # lint Rust\n\n# Run\ncargo run --release               # start engine (reads engine/config.yaml)\npnpm dev:docs                     # docs dev server (Mintlify)\npnpm dev:website                  # website dev server\n\n# Cloud\niii cloud deploy --config <path>  # deploy to iii Cloud\niii cloud list                    # list deployments\niii cloud update <deployment-id>  # update a deployment\niii cloud delete <deployment-id>  # delete a deployment\n```\n\n## Project Map\n\n```\nengine/                          Rust engine — runtime, modules, protocol, CLI\nsdk/packages/node/iii/           TypeScript SDK (npm: iii-sdk)\nsdk/packages/node/iii-browser/   Browser SDK (npm: iii-browser-sdk)\nsdk/packages/python/iii/         Python SDK (PyPI: iii-sdk)\nsdk/packages/rust/iii/           Rust SDK (crates.io: iii-sdk)\nskills/                          8 agent skills (auto-discovered by SkillKit)\ndocs/                            Documentation site (Mintlify/MDX)\nwebsite/                         iii.dev website\nwebsite/presentations/           Tech-spec presentations site (iii.dev/tech-specs/) — SOP in its README\ntech-specs/                      Markdown-only specs; frontmatter in each README.md lists it on the site\nscripts/                         Build and CI scripts\n```\n\n**Workspaces:** `Cargo.toml` (Rust), `pnpm-workspace.yaml` (JS/TS), `turbo.json` (build orchestration).\n\n## Docs (Mintlify/MDX)\n\n- **`--` renders as an em dash.** Mintlify's smart typography turns a double\n  hyphen into `—` in rendered text. Any command with a `--flag` (`--up`,\n  `--template`, `--api-key`) shown outside a Markdown code span — for example in\n  a JSX `<span>` — must be wrapped in a JSX string expression so it renders\n  verbatim: `<span>{'iii compose --up'}</span>`. Inside plain Markdown backticks\n  it is already safe.\n- Vale bans em dashes (`Terminology.EmDash`) and phrases like \"out of the box\"\n  (`Terminology.SlopMagic`) in prose. Rewrite with commas, parentheses, periods,\n  or colons, and name the explicit default.\n- After editing a `docs/next/*.mdx`, regenerate its skill artifact with\n  `iii-skill-render --write docs/next/<page>.mdx`. Versioned copies under\n  `docs/<version>/` are out of skill-render scope, so bring changes forward to\n  them (and their `.skill.md`) by hand.\n\n## Boundaries\n\n### Always\n\n- Use `pnpm` (never `npm`) for JS/TS packages\n- Use `cargo fmt --all` before committing Rust changes\n- Use `pnpm fmt` before committing JS/TS changes\n- Use leading slashes for HTTP `api_path` values: `/orders`, `/users/:id`\n- Use `expression` (not `cron`) for cron trigger config fields\n- Use `::` separator for function IDs: `orders::validate`, `reports::daily-summary`\n- Use `workspace:*` for internal pnpm package references\n- Include `## When to Use` and `## Boundaries` sections in every SKILL.md\n- Match SKILL.md `name` field to its directory name exactly\n\n### Ask First\n\n- Changes to public SDK APIs (npm/PyPI/crates.io surface)\n- Changes to engine config schema (`engine/config.yaml`)\n- Changes to CI/CD workflows (`.github/`)\n- Adding new engine modules\n- Modifying the WebSocket protocol between SDK and engine\n\n### Never\n\n- Commit secrets, API keys, or credentials\n- Use `npm` instead of `pnpm`\n- Push directly to `main`\n- Change engine licensing (ELv2) or SDK licensing (Apache-2.0)\n- Remove \"When to Use\" / \"Boundaries\" from SKILL.md files (SkillKit validates these)\n- Use `cron` as a config key — the engine uses `expression`\n- Omit leading slashes on `api_path` — the engine standard is `/path`\n\n## Code Style\n\n`registerTrigger` / `register_trigger` and `registerTriggerType` are deprecated since 0.25 (they\nstill work, and remain the way to bind the http, cron, queue, state, stream, pubsub, and database\nworkers); observe functions and engine events with `iii.observe(source, target)`.\n\n**Rust (engine + SDK):**\n```rust\n// Function IDs use :: separator\niii.register_function(\n    \"orders::validate\",\n    RegisterFunction::new(validate_order).description(\"Validate an incoming order\"),\n);\n\n// HTTP triggers use leading slash\niii.register_trigger(\n    IIITrigger::Http(HttpTriggerConfig::new(\"/orders/validate\").method(HttpMethod::Post))\n        .for_function(\"orders::validate\"),\n);\n\n// Cron triggers use `expression` field (7-field: sec min hour dom month dow year)\niii.register_trigger(\n    IIITrigger::Cron(CronTriggerConfig::new(\"0 0 9 * * * *\"))\n        .for_function(\"reports::daily-summary\"),\n);\n\n// Observe a function: filters use explicit operators; the target is a registered function\niii.observe(\n    Source::function(\"orders::create\").filters(json!({ \"input.total\": { \"$gte\": 500 } })),\n    \"alerts::big-order\",\n);\n```\n\n**TypeScript (SDK):**\n```typescript\n// HTTP trigger with leading slash\niii.registerTrigger({\n  type: 'http',\n  function_id: 'orders::validate',\n  config: { api_path: '/orders/validate', http_method: 'POST' },\n});\n\n// HTTP trigger with middleware chain\niii.registerTrigger({\n  type: 'http',\n  function_id: 'orders::validate',\n  config: {\n    api_path: '/orders/validate',\n    http_method: 'POST',\n    middleware_function_ids: ['middleware::auth', 'middleware::rate-limit'],\n  },\n});\n\n// Cron trigger with `expression` (not `cron`)\niii.registerTrigger({\n  type: 'cron',\n  function_id: 'reports::daily-summary',\n  config: { expression: '0 0 9 * * * *' },\n});\n\n// Trigger with metadata (optional, stored with the trigger)\niii.registerTrigger({\n  type: 'cron',\n  function_id: 'reports::daily-summary',\n  config: { expression: '0 0 9 * * * *' },\n  metadata: { owner: 'billing-team', priority: 'high' },\n});\n\n// Observe a function (or an engine event such as engine::on-functions-changed)\niii.observe(\n  { function_id: 'orders::create', filters: { 'input.total': { $gte: 500 } } },\n  'alerts::big-order',\n  { metadata: { owner: 'billing-team' } },\n);\n```\n\n**Python (SDK):**\n```python\n# Same patterns — leading slash, expression field\niii.register_trigger({\n    \"type\": \"http\",\n    \"function_id\": \"orders::validate\",\n    \"config\": {\"api_path\": \"/orders/validate\", \"http_method\": \"POST\"},\n})\n\n# Observe a function\niii.observe(\n    {\"function_id\": \"orders::create\", \"filters\": {\"input.total\": {\"$gte\": 500}}},\n    \"alerts::big-order\",\n)\n```\n\n## Skills\n\nThe `skills/` directory contains 8 agent skills auto-discovered by `npx skills add iii-hq/iii` and `npx skillkit install iii-hq/iii`: 7 iii-prefixed knowledge skills (catalog in `skills/SKILLS.md`) and the `presentation` tool skill. Code examples live in each `SKILL.md`, in TypeScript, Python, Rust, and Go where the concept is language-specific.\n\n## Blog (agent knowledge base)\n\nPublished at https://iii.dev/blog/ — architecture posts and worked examples for coding agents. Each post is available as markdown:\n\n- Index: https://iii.dev/blog/index.md\n- Posts: https://iii.dev/blog/<slug>.md (every slug listed in the index)\n\nSource lives in `website/src/content/blog/`. Also indexed in https://iii.dev/llms.txt and https://iii.dev/AGENTS.md.\n\n## Licensing\n\n- `engine/` — Elastic License v2 (ELv2)\n- Everything else — Apache-2.0\n",".cursor/mcp.json":"# Model Context Protocol (MCP) Configuration\n\nPath: `.cursor/mcp.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/iii-hq/iii/HEAD/.cursor/mcp.json)",".claude-plugin/marketplace.json":"# Claude Plugin Marketplace Catalog\n\nPath: `.claude-plugin/marketplace.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/iii-hq/iii/HEAD/.claude-plugin/marketplace.json)",".claude-plugin/plugin.json":"# claude-plugin Plugin Manifest\n\nPath: `.claude-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/iii-hq/iii/HEAD/.claude-plugin/plugin.json)"},"files":{"AGENTS.md":"# AGENTS.md\n\nYou are working in the iii monorepo — a backend unification engine with three primitives: **Function**, **Trigger**, **Worker**. The engine is Rust. SDKs exist for TypeScript, Python, and Rust. All communicate over WebSocket.\n\n## Commands\n\n```bash\n# Setup\npnpm install                     # JS/TS dependencies\ncargo build --release            # Rust workspace\n\n# Build\npnpm build                       # all JS/TS packages (Turborepo)\ncargo build --release             # engine + Rust SDK\n\n# Test\npnpm test                        # all JS/TS tests\ncargo test                       # all Rust tests\ncargo test -p iii                 # engine only\ncargo test -p iii-sdk             # Rust SDK only\ncd sdk/packages/python/iii && uv sync --extra dev && uv run pytest  # Python SDK\n\n# Lint & Format\npnpm fmt                         # format JS/TS (Biome)\npnpm fmt:check                   # check without changes\npnpm lint                        # lint JS/TS\ncargo fmt --all                   # format Rust\ncargo clippy --workspace          # lint Rust\n\n# Run\ncargo run --release               # start engine (reads engine/config.yaml)\npnpm dev:docs                     # docs dev server (Mintlify)\npnpm dev:website                  # website dev server\n\n# Cloud\niii cloud deploy --config <path>  # deploy to iii Cloud\niii cloud list                    # list deployments\niii cloud update <deployment-id>  # update a deployment\niii cloud delete <deployment-id>  # delete a deployment\n```\n\n## Project Map\n\n```\nengine/                          Rust engine — runtime, modules, protocol, CLI\nsdk/packages/node/iii/           TypeScript SDK (npm: iii-sdk)\nsdk/packages/node/iii-browser/   Browser SDK (npm: iii-browser-sdk)\nsdk/packages/python/iii/         Python SDK (PyPI: iii-sdk)\nsdk/packages/rust/iii/           Rust SDK (crates.io: iii-sdk)\nskills/                          8 agent skills (auto-discovered by SkillKit)\ndocs/                            Documentation site (Mintlify/MDX)\nwebsite/                         iii.dev website\nwebsite/presentations/           Tech-spec presentations site (iii.dev/tech-specs/) — SOP in its README\ntech-specs/                      Markdown-only specs; frontmatter in each README.md lists it on the site\nscripts/                         Build and CI scripts\n```\n\n**Workspaces:** `Cargo.toml` (Rust), `pnpm-workspace.yaml` (JS/TS), `turbo.json` (build orchestration).\n\n## Docs (Mintlify/MDX)\n\n- **`--` renders as an em dash.** Mintlify's smart typography turns a double\n  hyphen into `—` in rendered text. Any command with a `--flag` (`--up`,\n  `--template`, `--api-key`) shown outside a Markdown code span — for example in\n  a JSX `<span>` — must be wrapped in a JSX string expression so it renders\n  verbatim: `<span>{'iii compose --up'}</span>`. Inside plain Markdown backticks\n  it is already safe.\n- Vale bans em dashes (`Terminology.EmDash`) and phrases like \"out of the box\"\n  (`Terminology.SlopMagic`) in prose. Rewrite with commas, parentheses, periods,\n  or colons, and name the explicit default.\n- After editing a `docs/next/*.mdx`, regenerate its skill artifact with\n  `iii-skill-render --write docs/next/<page>.mdx`. Versioned copies under\n  `docs/<version>/` are out of skill-render scope, so bring changes forward to\n  them (and their `.skill.md`) by hand.\n\n## Boundaries\n\n### Always\n\n- Use `pnpm` (never `npm`) for JS/TS packages\n- Use `cargo fmt --all` before committing Rust changes\n- Use `pnpm fmt` before committing JS/TS changes\n- Use leading slashes for HTTP `api_path` values: `/orders`, `/users/:id`\n- Use `expression` (not `cron`) for cron trigger config fields\n- Use `::` separator for function IDs: `orders::validate`, `reports::daily-summary`\n- Use `workspace:*` for internal pnpm package references\n- Include `## When to Use` and `## Boundaries` sections in every SKILL.md\n- Match SKILL.md `name` field to its directory name exactly\n\n### Ask First\n\n- Changes to public SDK APIs (npm/PyPI/crates.io surface)\n- Changes to engine config schema (`engine/config.yaml`)\n- Changes to CI/CD workflows (`.github/`)\n- Adding new engine modules\n- Modifying the WebSocket protocol between SDK and engine\n\n### Never\n\n- Commit secrets, API keys, or credentials\n- Use `npm` instead of `pnpm`\n- Push directly to `main`\n- Change engine licensing (ELv2) or SDK licensing (Apache-2.0)\n- Remove \"When to Use\" / \"Boundaries\" from SKILL.md files (SkillKit validates these)\n- Use `cron` as a config key — the engine uses `expression`\n- Omit leading slashes on `api_path` — the engine standard is `/path`\n\n## Code Style\n\n`registerTrigger` / `register_trigger` and `registerTriggerType` are deprecated since 0.25 (they\nstill work, and remain the way to bind the http, cron, queue, state, stream, pubsub, and database\nworkers); observe functions and engine events with `iii.observe(source, target)`.\n\n**Rust (engine + SDK):**\n```rust\n// Function IDs use :: separator\niii.register_function(\n    \"orders::validate\",\n    RegisterFunction::new(validate_order).description(\"Validate an incoming order\"),\n);\n\n// HTTP triggers use leading slash\niii.register_trigger(\n    IIITrigger::Http(HttpTriggerConfig::new(\"/orders/validate\").method(HttpMethod::Post))\n        .for_function(\"orders::validate\"),\n);\n\n// Cron triggers use `expression` field (7-field: sec min hour dom month dow year)\niii.register_trigger(\n    IIITrigger::Cron(CronTriggerConfig::new(\"0 0 9 * * * *\"))\n        .for_function(\"reports::daily-summary\"),\n);\n\n// Observe a function: filters use explicit operators; the target is a registered function\niii.observe(\n    Source::function(\"orders::create\").filters(json!({ \"input.total\": { \"$gte\": 500 } })),\n    \"alerts::big-order\",\n);\n```\n\n**TypeScript (SDK):**\n```typescript\n// HTTP trigger with leading slash\niii.registerTrigger({\n  type: 'http',\n  function_id: 'orders::validate',\n  config: { api_path: '/orders/validate', http_method: 'POST' },\n});\n\n// HTTP trigger with middleware chain\niii.registerTrigger({\n  type: 'http',\n  function_id: 'orders::validate',\n  config: {\n    api_path: '/orders/validate',\n    http_method: 'POST',\n    middleware_function_ids: ['middleware::auth', 'middleware::rate-limit'],\n  },\n});\n\n// Cron trigger with `expression` (not `cron`)\niii.registerTrigger({\n  type: 'cron',\n  function_id: 'reports::daily-summary',\n  config: { expression: '0 0 9 * * * *' },\n});\n\n// Trigger with metadata (optional, stored with the trigger)\niii.registerTrigger({\n  type: 'cron',\n  function_id: 'reports::daily-summary',\n  config: { expression: '0 0 9 * * * *' },\n  metadata: { owner: 'billing-team', priority: 'high' },\n});\n\n// Observe a function (or an engine event such as engine::on-functions-changed)\niii.observe(\n  { function_id: 'orders::create', filters: { 'input.total': { $gte: 500 } } },\n  'alerts::big-order',\n  { metadata: { owner: 'billing-team' } },\n);\n```\n\n**Python (SDK):**\n```python\n# Same patterns — leading slash, expression field\niii.register_trigger({\n    \"type\": \"http\",\n    \"function_id\": \"orders::validate\",\n    \"config\": {\"api_path\": \"/orders/validate\", \"http_method\": \"POST\"},\n})\n\n# Observe a function\niii.observe(\n    {\"function_id\": \"orders::create\", \"filters\": {\"input.total\": {\"$gte\": 500}}},\n    \"alerts::big-order\",\n)\n```\n\n## Skills\n\nThe `skills/` directory contains 8 agent skills auto-discovered by `npx skills add iii-hq/iii` and `npx skillkit install iii-hq/iii`: 7 iii-prefixed knowledge skills (catalog in `skills/SKILLS.md`) and the `presentation` tool skill. Code examples live in each `SKILL.md`, in TypeScript, Python, Rust, and Go where the concept is language-specific.\n\n## Blog (agent knowledge base)\n\nPublished at https://iii.dev/blog/ — architecture posts and worked examples for coding agents. Each post is available as markdown:\n\n- Index: https://iii.dev/blog/index.md\n- Posts: https://iii.dev/blog/<slug>.md (every slug listed in the index)\n\nSource lives in `website/src/content/blog/`. Also indexed in https://iii.dev/llms.txt and https://iii.dev/AGENTS.md.\n\n## Licensing\n\n- `engine/` — Elastic License v2 (ELv2)\n- Everything else — Apache-2.0\n",".cursor/mcp.json":"# Model Context Protocol (MCP) Configuration\n\nPath: `.cursor/mcp.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/iii-hq/iii/HEAD/.cursor/mcp.json)",".claude-plugin/marketplace.json":"# Claude Plugin Marketplace Catalog\n\nPath: `.claude-plugin/marketplace.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/iii-hq/iii/HEAD/.claude-plugin/marketplace.json)",".claude-plugin/plugin.json":"# claude-plugin Plugin Manifest\n\nPath: `.claude-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/iii-hq/iii/HEAD/.claude-plugin/plugin.json)"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/iii-hq/iii/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# AGENTS.md\n\nYou are working in the iii monorepo — a backend unification engine with three primitives: **Function**, **Trigger**, **Worker**. The engine is Rust. SDKs exist for TypeScript, Python, and Rust. All communicate over WebSocket.\n\n## Commands\n\n```bash\n# Setup\npnpm install                     # JS/TS dependencies\ncargo build --release            # Rust workspace\n\n# Build\npnpm build                       # all JS/TS packages (Turborepo)\ncargo build --release             # engine + Rust SDK\n\n# Test\npnpm test                        # all JS/TS tests\ncargo test                       # all Rust tests\ncargo test -p iii                 # engine only\ncargo test -p iii-sdk             # Rust SDK only\ncd sdk/packages/python/iii && uv sync --extra dev && uv run pytest  # Python SDK\n\n# Lint & Format\npnpm fmt                         # format JS/TS (Biome)\npnpm fmt:check                   # check without changes\npnpm lint                        # lint JS/TS\ncargo fmt --all                   # format Rust\ncargo clippy --workspace          # lint Rust\n\n# Run\ncargo run --release               # start engine (reads engine/config.yaml)\npnpm dev:docs                     # docs dev server (Mintlify)\npnpm dev:website                  # website dev server\n\n# Cloud\niii cloud deploy --config <path>  # deploy to iii Cloud\niii cloud list                    # list deployments\niii cloud update <deployment-id>  # update a deployment\niii cloud delete <deployment-id>  # delete a deployment\n```\n\n## Project Map\n\n```\nengine/                          Rust engine — runtime, modules, protocol, CLI\nsdk/packages/node/iii/           TypeScript SDK (npm: iii-sdk)\nsdk/packages/node/iii-browser/   Browser SDK (npm: iii-browser-sdk)\nsdk/packages/python/iii/         Python SDK (PyPI: iii-sdk)\nsdk/packages/rust/iii/           Rust SDK (crates.io: iii-sdk)\nskills/                          8 agent skills (auto-discovered by SkillKit)\ndocs/                            Documentation site (Mintlify/MDX)\nwebsite/                         iii.dev website\nwebsite/presentations/           Tech-spec presentations site (iii.dev/tech-specs/) — SOP in its README\ntech-specs/                      Markdown-only specs; frontmatter in each README.md lists it on the site\nscripts/                         Build and CI scripts\n```\n\n**Workspaces:** `Cargo.toml` (Rust), `pnpm-workspace.yaml` (JS/TS), `turbo.json` (build orchestration).\n\n## Docs (Mintlify/MDX)\n\n- **`--` renders as an em dash.** Mintlify's smart typography turns a double\n  hyphen into `—` in rendered text. Any command with a `--flag` (`--up`,\n  `--template`, `--api-key`) shown outside a Markdown code span — for example in\n  a JSX `<span>` — must be wrapped in a JSX string expression so it renders\n  verbatim: `<span>{'iii compose --up'}</span>`. Inside plain Markdown backticks\n  it is already safe.\n- Vale bans em dashes (`Terminology.EmDash`) and phrases like \"out of the box\"\n  (`Terminology.SlopMagic`) in prose. Rewrite with commas, parentheses, periods,\n  or colons, and name the explicit default.\n- After editing a `docs/next/*.mdx`, regenerate its skill artifact with\n  `iii-skill-render --write docs/next/<page>.mdx`. Versioned copies under\n  `docs/<version>/` are out of skill-render scope, so bring changes forward to\n  them (and their `.skill.md`) by hand.\n\n## Boundaries\n\n### Always\n\n- Use `pnpm` (never `npm`) for JS/TS packages\n- Use `cargo fmt --all` before committing Rust changes\n- Use `pnpm fmt` before committing JS/TS changes\n- Use leading slashes for HTTP `api_path` values: `/orders`, `/users/:id`\n- Use `expression` (not `cron`) for cron trigger config fields\n- Use `::` separator for function IDs: `orders::validate`, `reports::daily-summary`\n- Use `workspace:*` for internal pnpm package references\n- Include `## When to Use` and `## Boundaries` sections in every SKILL.md\n- Match SKILL.md `name` field to its directory name exactly\n\n### Ask First\n\n- Changes to public SDK APIs (npm/PyPI/crates.io surface)\n- Changes to engine config schema (`engine/config.yaml`)\n- Changes to CI/CD workflows (`.github/`)\n- Adding new engine modules\n- Modifying the WebSocket protocol between SDK and engine\n\n### Never\n\n- Commit secrets, API keys, or credentials\n- Use `npm` instead of `pnpm`\n- Push directly to `main`\n- Change engine licensing (ELv2) or SDK licensing (Apache-2.0)\n- Remove \"When to Use\" / \"Boundaries\" from SKILL.md files (SkillKit validates these)\n- Use `cron` as a config key — the engine uses `expression`\n- Omit leading slashes on `api_path` — the engine standard is `/path`\n\n## Code Style\n\n`registerTrigger` / `register_trigger` and `registerTriggerType` are deprecated since 0.25 (they\nstill work, and remain the way to bind the http, cron, queue, state, stream, pubsub, and database\nworkers); observe functions and engine events with `iii.observe(source, target)`.\n\n**Rust (engine + SDK):**\n```rust\n// Function IDs use :: separator\niii.register_function(\n    \"orders::validate\",\n    RegisterFunction::new(validate_order).description(\"Validate an incoming order\"),\n);\n\n// HTTP triggers use leading slash\niii.register_trigger(\n    IIITrigger::Http(HttpTriggerConfig::new(\"/orders/validate\").method(HttpMethod::Post))\n        .for_function(\"orders::validate\"),\n);\n\n// Cron triggers use `expression` field (7-field: sec min hour dom month dow year)\niii.register_trigger(\n    IIITrigger::Cron(CronTriggerConfig::new(\"0 0 9 * * * *\"))\n        .for_function(\"reports::daily-summary\"),\n);\n\n// Observe a function: filters use explicit operators; the target is a registered function\niii.observe(\n    Source::function(\"orders::create\").filters(json!({ \"input.total\": { \"$gte\": 500 } })),\n    \"alerts::big-order\",\n);\n```\n\n**TypeScript (SDK):**\n```typescript\n// HTTP trigger with leading slash\niii.registerTrigger({\n  type: 'http',\n  function_id: 'orders::validate',\n  config: { api_path: '/orders/validate', http_method: 'POST' },\n});\n\n// HTTP trigger with middleware chain\niii.registerTrigger({\n  type: 'http',\n  function_id: 'orders::validate',\n  config: {\n    api_path: '/orders/validate',\n    http_method: 'POST',\n    middleware_function_ids: ['middleware::auth', 'middleware::rate-limit'],\n  },\n});\n\n// Cron trigger with `expression` (not `cron`)\niii.registerTrigger({\n  type: 'cron',\n  function_id: 'reports::daily-summary',\n  config: { expression: '0 0 9 * * * *' },\n});\n\n// Trigger with metadata (optional, stored with the trigger)\niii.registerTrigger({\n  type: 'cron',\n  function_id: 'reports::daily-summary',\n  config: { expression: '0 0 9 * * * *' },\n  metadata: { owner: 'billing-team', priority: 'high' },\n});\n\n// Observe a function (or an engine event such as engine::on-functions-changed)\niii.observe(\n  { function_id: 'orders::create', filters: { 'input.total': { $gte: 500 } } },\n  'alerts::big-order',\n  { metadata: { owner: 'billing-team' } },\n);\n```\n\n**Python (SDK):**\n```python\n# Same patterns — leading slash, expression field\niii.register_trigger({\n    \"type\": \"http\",\n    \"function_id\": \"orders::validate\",\n    \"config\": {\"api_path\": \"/orders/validate\", \"http_method\": \"POST\"},\n})\n\n# Observe a function\niii.observe(\n    {\"function_id\": \"orders::create\", \"filters\": {\"input.total\": {\"$gte\": 500}}},\n    \"alerts::big-order\",\n)\n```\n\n## Skills\n\nThe `skills/` directory contains 8 agent skills auto-discovered by `npx skills add iii-hq/iii` and `npx skillkit install iii-hq/iii`: 7 iii-prefixed knowledge skills (catalog in `skills/SKILLS.md`) and the `presentation` tool skill. Code examples live in each `SKILL.md`, in TypeScript, Python, Rust, and Go where the concept is language-specific.\n\n## Blog (agent knowledge base)\n\nPublished at https://iii.dev/blog/ — architecture posts and worked examples for coding agents. Each post is available as markdown:\n\n- Index: https://iii.dev/blog/index.md\n- Posts: https://iii.dev/blog/<slug>.md (every slug listed in the index)\n\nSource lives in `website/src/content/blog/`. Also indexed in https://iii.dev/llms.txt and https://iii.dev/AGENTS.md.\n\n## Licensing\n\n- `engine/` — Elastic License v2 (ELv2)\n- Everything else — Apache-2.0\n","isInternal":false,"tokens":2023,"sizeBytes":8091},{"name":"marketplace.json","path":".claude-plugin/marketplace.json","rawUrl":"https://raw.githubusercontent.com/iii-hq/iii/HEAD/.claude-plugin/marketplace.json","title":"Claude Plugin Marketplace Catalog","category":"marketplace","format":"json","content":"# Claude Plugin Marketplace Catalog\n\nPath: `.claude-plugin/marketplace.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/iii-hq/iii/HEAD/.claude-plugin/marketplace.json)","tokens":300,"sizeBytes":189},{"name":"plugin.json","path":".claude-plugin/plugin.json","rawUrl":"https://raw.githubusercontent.com/iii-hq/iii/HEAD/.claude-plugin/plugin.json","title":"claude-plugin Plugin Manifest","category":"plugin-manifest","format":"json","content":"# claude-plugin Plugin Manifest\n\nPath: `.claude-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/iii-hq/iii/HEAD/.claude-plugin/plugin.json)","tokens":300,"sizeBytes":175},{"name":"mcp.json","path":".cursor/mcp.json","rawUrl":"https://raw.githubusercontent.com/iii-hq/iii/HEAD/.cursor/mcp.json","title":"Model Context Protocol (MCP) Configuration","category":"mcp-config","format":"json","content":"# Model Context Protocol (MCP) Configuration\n\nPath: `.cursor/mcp.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/iii-hq/iii/HEAD/.cursor/mcp.json)","tokens":300,"sizeBytes":168}],"systemPromptSnippet":"<yakaai_skills repo=\"iii-hq/iii\">\n<!-- File: AGENTS.md (Tokens: ~2023 | Category: root-instruction) -->\n# AGENTS.md\n\nYou are working in the iii monorepo — a backend unification engine with three primitives: **Function**, **Trigger**, **Worker**. The engine is Rust. SDKs exist for TypeScript, Python, and Rust. All communicate over WebSocket.\n\n## Commands\n\n```bash\n# Setup\npnpm install                     # JS/TS dependencies\ncargo build --release            # Rust workspace\n\n# Build\npnpm build                       # all JS/TS packages (Turborepo)\ncargo build --release             # engine + Rust SDK\n\n# Test\npnpm test                        # all JS/TS tests\ncargo test                       # all Rust tests\ncargo test -p iii                 # engine only\ncargo test -p iii-sdk             # Rust SDK only\ncd sdk/packages/python/iii && uv sync --extra dev && uv run pytest  # Python SDK\n\n# Lint & Format\npnpm fmt                         # format JS/TS (Biome)\npnpm fmt:check                   # check without changes\npnpm lint                        # lint JS/TS\ncargo fmt --all                   # format Rust\ncargo clippy --workspace          # lint Rust\n\n# Run\ncargo run --release               # start engine (reads engine/config.yaml)\npnpm dev:docs                     # docs dev server (Mintlify)\npnpm dev:website                  # website dev server\n\n# Cloud\niii cloud deploy --config <path>  # deploy to iii Cloud\niii cloud list                    # list deployments\niii cloud update <deployment-id>  # update a deployment\niii cloud delete <deployment-id>  # delete a deployment\n```\n\n## Project Map\n\n```\nengine/                          Rust engine — runtime, modules, protocol, CLI\nsdk/packages/node/iii/           TypeScript SDK (npm: iii-sdk)\nsdk/packages/node/iii-browser/   Browser SDK (npm: iii-browser-sdk)\nsdk/packages/python/iii/         Python SDK (PyPI: iii-sdk)\nsdk/packages/rust/iii/           Rust SDK (crates.io: iii-sdk)\nskills/                          8 agent skills (auto-discovered by SkillKit)\ndocs/                            Documentation site (Mintlify/MDX)\nwebsite/                         iii.dev website\nwebsite/presentations/           Tech-spec presentations site (iii.dev/tech-specs/) — SOP in its README\ntech-specs/                      Markdown-only specs; frontmatter in each README.md lists it on the site\nscripts/                         Build and CI scripts\n```\n\n**Workspaces:** `Cargo.toml` (Rust), `pnpm-workspace.yaml` (JS/TS), `turbo.json` (build orchestration).\n\n## Docs (Mintlify/MDX)\n\n- **`--` renders as an em dash.** Mintlify's smart typography turns a double\n  hyphen into `—` in rendered text. Any command with a `--flag` (`--up`,\n  `--template`, `--api-key`) shown outside a Markdown code span — for example in\n  a JSX `<span>` — must be wrapped in a JSX string expression so it renders\n  verbatim: `<span>{'iii compose --up'}</span>`. Inside plain Markdown backticks\n  it is already safe.\n- Vale bans em dashes (`Terminology.EmDash`) and phrases like \"out of the box\"\n  (`Terminology.SlopMagic`) in prose. Rewrite with commas, parentheses, periods,\n  or colons, and name the explicit default.\n- After editing a `docs/next/*.mdx`, regenerate its skill artifact with\n  `iii-skill-render --write docs/next/<page>.mdx`. Versioned copies under\n  `docs/<version>/` are out of skill-render scope, so bring changes forward to\n  them (and their `.skill.md`) by hand.\n\n## Boundaries\n\n### Always\n\n- Use `pnpm` (never `npm`) for JS/TS packages\n- Use `cargo fmt --all` before committing Rust changes\n- Use `pnpm fmt` before committing JS/TS changes\n- Use leading slashes for HTTP `api_path` values: `/orders`, `/users/:id`\n- Use `expression` (not `cron`) for cron trigger config fields\n- Use `::` separator for function IDs: `orders::validate`, `reports::daily-summary`\n- Use `workspace:*` for internal pnpm package references\n- Include `## When to Use` and `## Boundaries` sections in every SKILL.md\n- Match SKILL.md `name` field to its directory name exactly\n\n### Ask First\n\n- Changes to public SDK APIs (npm/PyPI/crates.io surface)\n- Changes to engine config schema (`engine/config.yaml`)\n- Changes to CI/CD workflows (`.github/`)\n- Adding new engine modules\n- Modifying the WebSocket protocol between SDK and engine\n\n### Never\n\n- Commit secrets, API keys, or credentials\n- Use `npm` instead of `pnpm`\n- Push directly to `main`\n- Change engine licensing (ELv2) or SDK licensing (Apache-2.0)\n- Remove \"When to Use\" / \"Boundaries\" from SKILL.md files (SkillKit validates these)\n- Use `cron` as a config key — the engine uses `expression`\n- Omit leading slashes on `api_path` — the engine standard is `/path`\n\n## Code Style\n\n`registerTrigger` / `register_trigger` and `registerTriggerType` are deprecated since 0.25 (they\nstill work, and remain the way to bind the http, cron, queue, state, stream, pubsub, and database\nworkers); observe functions and engine events with `iii.observe(source, target)`.\n\n**Rust (engine + SDK):**\n```rust\n// Function IDs use :: separator\niii.register_function(\n    \"orders::validate\",\n    RegisterFunction::new(validate_order).description(\"Validate an incoming order\"),\n);\n\n// HTTP triggers use leading slash\niii.register_trigger(\n    IIITrigger::Http(HttpTriggerConfig::new(\"/orders/validate\").method(HttpMethod::Post))\n        .for_function(\"orders::validate\"),\n);\n\n// Cron triggers use `expression` field (7-field: sec min hour dom month dow year)\niii.register_trigger(\n    IIITrigger::Cron(CronTriggerConfig::new(\"0 0 9 * * * *\"))\n        .for_function(\"reports::daily-summary\"),\n);\n\n// Observe a function: filters use explicit operators; the target is a registered function\niii.observe(\n    Source::function(\"orders::create\").filters(json!({ \"input.total\": { \"$gte\": 500 } })),\n    \"alerts::big-order\",\n);\n```\n\n**TypeScript (SDK):**\n```typescript\n// HTTP trigger with leading slash\niii.registerTrigger({\n  type: 'http',\n  function_id: 'orders::validate',\n  config: { api_path: '/orders/validate', http_method: 'POST' },\n});\n\n// HTTP trigger with middleware chain\niii.registerTrigger({\n  type: 'http',\n  function_id: 'orders::validate',\n  config: {\n    api_path: '/orders/validate',\n    http_method: 'POST',\n    middleware_function_ids: ['middleware::auth', 'middleware::rate-limit'],\n  },\n});\n\n// Cron trigger with `expression` (not `cron`)\niii.registerTrigger({\n  type: 'cron',\n  function_id: 'reports::daily-summary',\n  config: { expression: '0 0 9 * * * *' },\n});\n\n// Trigger with metadata (optional, stored with the trigger)\niii.registerTrigger({\n  type: 'cron',\n  function_id: 'reports::daily-summary',\n  config: { expression: '0 0 9 * * * *' },\n  metadata: { owner: 'billing-team', priority: 'high' },\n});\n\n// Observe a function (or an engine event such as engine::on-functions-changed)\niii.observe(\n  { function_id: 'orders::create', filters: { 'input.total': { $gte: 500 } } },\n  'alerts::big-order',\n  { metadata: { owner: 'billing-team' } },\n);\n```\n\n**Python (SDK):**\n```python\n# Same patterns — leading slash, expression field\niii.register_trigger({\n    \"type\": \"http\",\n    \"function_id\": \"orders::validate\",\n    \"config\": {\"api_path\": \"/orders/validate\", \"http_method\": \"POST\"},\n})\n\n# Observe a function\niii.observe(\n    {\"function_id\": \"orders::create\", \"filters\": {\"input.total\": {\"$gte\": 500}}},\n    \"alerts::big-order\",\n)\n```\n\n## Skills\n\nThe `skills/` directory contains 8 agent skills auto-discovered by `npx skills add iii-hq/iii` and `npx skillkit install iii-hq/iii`: 7 iii-prefixed knowledge skills (catalog in `skills/SKILLS.md`) and the `presentation` tool skill. Code examples live in each `SKILL.md`, in TypeScript, Python, Rust, and Go where the concept is language-specific.\n\n## Blog (agent knowledge base)\n\nPublished at https://iii.dev/blog/ — architecture posts and worked examples for coding agents. Each post is available as markdown:\n\n- Index: https://iii.dev/blog/index.md\n- Posts: https://iii.dev/blog/<slug>.md (every slug listed in the index)\n\nSource lives in `website/src/content/blog/`. Also indexed in https://iii.dev/llms.txt and https://iii.dev/AGENTS.md.\n\n## Licensing\n\n- `engine/` — Elastic License v2 (ELv2)\n- Everything else — Apache-2.0\n\n<!-- File: .claude-plugin/marketplace.json (Tokens: ~300 | Category: marketplace) -->\n# Claude Plugin Marketplace Catalog\n\nPath: `.claude-plugin/marketplace.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/iii-hq/iii/HEAD/.claude-plugin/marketplace.json)\n\n<!-- File: .claude-plugin/plugin.json (Tokens: ~300 | Category: plugin-manifest) -->\n# claude-plugin Plugin Manifest\n\nPath: `.claude-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/iii-hq/iii/HEAD/.claude-plugin/plugin.json)\n\n<!-- File: .cursor/mcp.json (Tokens: ~300 | Category: mcp-config) -->\n# Model Context Protocol (MCP) Configuration\n\nPath: `.cursor/mcp.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/iii-hq/iii/HEAD/.cursor/mcp.json)\n</yakaai_skills>"}