{"owner":"iii-hq","repo":"iii","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md"],"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 + console\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:console                  # console frontend dev server\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)\nconsole/                         Developer console (React + Rust)\nskills/                          26 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## 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**Rust (engine + SDK):**\n```rust\n// Function IDs use :: separator\niii.register_function(\n    RegisterFunction::new(\"orders::validate\", validate_order)\n        .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\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\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\n## Skills\n\nThe `skills/` directory contains 26 agent skills (iii-prefixed) auto-discovered by `npx skills add iii-hq/iii` and `npx skillkit install iii-hq/iii`. Reference implementations live in `skills/references/` with TypeScript, Python, and Rust variants.\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"},"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 + console\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:console                  # console frontend dev server\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)\nconsole/                         Developer console (React + Rust)\nskills/                          26 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## 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**Rust (engine + SDK):**\n```rust\n// Function IDs use :: separator\niii.register_function(\n    RegisterFunction::new(\"orders::validate\", validate_order)\n        .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\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\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\n## Skills\n\nThe `skills/` directory contains 26 agent skills (iii-prefixed) auto-discovered by `npx skills add iii-hq/iii` and `npx skillkit install iii-hq/iii`. Reference implementations live in `skills/references/` with TypeScript, Python, and Rust variants.\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"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","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 + console\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:console                  # console frontend dev server\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)\nconsole/                         Developer console (React + Rust)\nskills/                          26 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## 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**Rust (engine + SDK):**\n```rust\n// Function IDs use :: separator\niii.register_function(\n    RegisterFunction::new(\"orders::validate\", validate_order)\n        .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\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\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\n## Skills\n\nThe `skills/` directory contains 26 agent skills (iii-prefixed) auto-discovered by `npx skills add iii-hq/iii` and `npx skillkit install iii-hq/iii`. Reference implementations live in `skills/references/` with TypeScript, Python, and Rust variants.\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","category":"root","tokens":1581}]}