[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-microsoft-creating-amplifier-modules":3,"mdc-y2gtin-key":30,"related-repo-microsoft-creating-amplifier-modules":2395,"related-org-microsoft-creating-amplifier-modules":2415},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":19,"repoUrl":20,"updatedAt":21,"license":22,"forks":23,"topics":24,"repo":25,"sourceUrl":28,"mdContent":29},"creating-amplifier-modules","create Amplifier modules","Use when creating a new Amplifier module (tool, hook, orchestrator, context, or provider). Covers the mount() contract, protocol compliance validation, placeholder patterns, and the module directory structure. Prevents the common mistake of creating no-op mount() stubs that fail protocol_compliance validation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"microsoft","Microsoft","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmicrosoft.png",[12,16],{"name":13,"slug":14,"type":15},"Agent Context","agent-context","tag",{"name":17,"slug":18,"type":15},"Plugin Development","plugin-development",16,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-foundation","2026-04-06T18:37:44.170027",null,17,[],{"repoUrl":20,"stars":19,"forks":23,"topics":26,"description":27},[],"Foundation library for the Amplifier project","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-foundation\u002Ftree\u002FHEAD\u002Fskills\u002Fcreating-amplifier-modules","---\nname: creating-amplifier-modules\ndescription: \"Use when creating a new Amplifier module (tool, hook, orchestrator, context, or provider). Covers the mount() contract, protocol compliance validation, placeholder patterns, and the module directory structure. Prevents the common mistake of creating no-op mount() stubs that fail protocol_compliance validation.\"\n---\n\n# Creating Amplifier Modules\n\n## Overview\n\nAmplifier modules are Python packages that extend the runtime with tools, hooks, providers, and other capabilities. Every module has a `mount()` function that runs at session startup.\n\n**Core principle:** `mount()` must register something with the coordinator. A `mount()` that logs and returns `None` WILL fail validation.\n\n**This matters immediately.** Module validation runs every time a session loads. A broken `mount()` prevents any agent using the behavior from spawning — not just future agents, not \"when Phase 2 is done\" — right now, on every invocation.\n\n---\n\n## The Iron Law\n\n```\nmount() MUST call coordinator.mount() or return a Tool instance.\nA mount() that returns None and calls nothing WILL FAIL with:\n\"protocol_compliance: No tool was mounted and mount() did not return a Tool instance\"\n```\n\n\"Stub\" means **placeholder that satisfies the protocol** — not empty function that does nothing.\n\n---\n\n## Module Directory Structure\n\n```\nmodules\u002Ftool-{name}\u002F\n├── pyproject.toml                        # name = \"amplifier-module-tool-{name}\", hatchling\n└── amplifier_module_tool_{name}\u002F\n    └── __init__.py                       # async mount(coordinator, config)\n```\n\nThe `pyproject.toml` entry point wires the module name to `mount()`:\n\n```toml\n[project]\nname = \"amplifier-module-tool-{name}\"\nversion = \"0.1.0\"\ndescription = \"Description of what this tool does\"\nrequires-python = \">=3.11\"\nlicense = { text = \"MIT\" }\ndependencies = []   # amplifier-core is a peer dependency — do NOT declare it here\n\n[project.entry-points.\"amplifier.modules\"]\ntool-{name} = \"amplifier_module_tool_{name}:mount\"\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.build.targets.wheel]\npackages = [\"amplifier_module_tool_{name}\"]\n\n[tool.pytest.ini_options]\ntestpaths = [\"tests\"]\nasyncio_mode = \"auto\"\nasyncio_default_fixture_loop_scope = \"function\"\n```\n\n---\n\n## The mount() Contract\n\nEvery `mount()` must:\n1. Instantiate a tool class\n2. Call `await coordinator.mount(\"tools\", tool, name=tool.name)`\n3. Return a metadata dict (not None)\n\n**Complete working example:**\n\n```python\n\"\"\"Amplifier tool module for {name}.\"\"\"\n\nimport logging\nfrom typing import Any\n\nfrom amplifier_core import ToolResult\n\nlogger = logging.getLogger(__name__)\n\n\nclass MyTool:\n    \"\"\"Tool class — the actual capability being registered.\"\"\"\n\n    @property\n    def name(self) -> str:\n        return \"my_tool\"\n\n    @property\n    def description(self) -> str:\n        return \"Description of what this tool does and when to use it.\"\n\n    @property\n    def input_schema(self) -> dict:\n        return {\n            \"type\": \"object\",\n            \"properties\": {\n                \"param\": {\n                    \"type\": \"string\",\n                    \"description\": \"What this parameter does\",\n                },\n            },\n            \"required\": [\"param\"],\n        }\n\n    async def execute(self, input_data: dict[str, Any]) -> ToolResult:\n        \"\"\"Execute the tool operation.\"\"\"\n        result = do_the_work(input_data[\"param\"])\n        return ToolResult(success=True, output=result)\n\n\nasync def mount(coordinator: Any, config: dict[str, Any] | None = None) -> dict[str, Any]:\n    \"\"\"Mount the tool into the coordinator.\"\"\"\n    tool = MyTool()\n    await coordinator.mount(\"tools\", tool, name=tool.name)\n    logger.info(\"tool-my-tool mounted: registered 'my_tool'\")\n    return {\n        \"name\": \"tool-my-tool\",\n        \"version\": \"0.1.0\",\n        \"provides\": [\"my_tool\"],\n    }\n```\n\n---\n\n## The Placeholder Pattern\n\nWhen Phase 1 needs a module skeleton before full implementation, create a **real tool class** that returns a \"not yet implemented\" message. The tool still has all required properties and registers with the coordinator.\n\n```python\n\"\"\"Amplifier tool module for {name} — Phase 1 placeholder.\"\"\"\n\nimport logging\nfrom typing import Any\n\nfrom amplifier_core import ToolResult\n\nlogger = logging.getLogger(__name__)\n\n\nclass MyToolPlaceholder:\n    \"\"\"Placeholder tool — registers to satisfy protocol compliance (Phase 1).\n\n    Phase 2 will replace this with full implementation.\n    \"\"\"\n\n    @property\n    def name(self) -> str:\n        return \"my_tool\"\n\n    @property\n    def description(self) -> str:\n        return \"Description of what this tool will do. Phase 2 implementation pending.\"\n\n    @property\n    def input_schema(self) -> dict:\n        return {\n            \"type\": \"object\",\n            \"properties\": {\n                \"operation\": {\n                    \"type\": \"string\",\n                    \"description\": \"Operation to perform\",\n                },\n            },\n            \"required\": [\"operation\"],\n        }\n\n    async def execute(self, input_data: dict[str, Any]) -> ToolResult:\n        \"\"\"Return not-yet-implemented message.\"\"\"\n        return ToolResult(\n            success=False,\n            output=(\n                \"Tool not yet implemented. Phase 2 will add full functionality. \"\n                \"Use the shell scripts in the bundle for now.\"\n            ),\n        )\n\n\nasync def mount(coordinator: Any, config: dict[str, Any] | None = None) -> dict[str, Any]:\n    \"\"\"Mount placeholder tool — satisfies protocol compliance during Phase 1.\"\"\"\n    tool = MyToolPlaceholder()\n    await coordinator.mount(\"tools\", tool, name=tool.name)\n    logger.info(\"tool-my-tool mounted: registered placeholder 'my_tool' (Phase 2 pending)\")\n    return {\n        \"name\": \"tool-my-tool\",\n        \"version\": \"0.1.0\",\n        \"provides\": [\"my_tool\"],\n    }\n```\n\n**A placeholder tool IS a real tool.** It has `name`, `description`, `input_schema`, and `execute()`. It registers with `coordinator.mount()`. It just tells callers it's not implemented yet.\n\n---\n\n## Behavior YAML Reference\n\nHow the module is referenced in a behavior YAML:\n\n```yaml\ntools:\n  - module: tool-{name}\n    source: git+https:\u002F\u002Fgithub.com\u002Forg\u002Frepo@main#subdirectory=modules\u002Ftool-{name}\n```\n\nFor local development (relative path from bundle root):\n\n```yaml\ntools:\n  - module: tool-{name}\n    source: .\u002Fmodules\u002Ftool-{name}\n```\n\n---\n\n## Writing Tests\n\nTest that `mount()` registers the tool — not that it returns `None`:\n\n```python\nimport pytest\nfrom unittest.mock import AsyncMock, MagicMock\nfrom amplifier_module_tool_my_tool import mount\n\n\n@pytest.mark.asyncio\nasync def test_mount_registers_tool():\n    \"\"\"mount() must register a tool via coordinator.mount().\"\"\"\n    coordinator = MagicMock()\n    coordinator.mount = AsyncMock()\n\n    result = await mount(coordinator)\n\n    # Verify coordinator.mount was called (the Iron Law)\n    coordinator.mount.assert_called_once()\n    call_args = coordinator.mount.call_args\n    assert call_args[0][0] == \"tools\"  # first positional arg is \"tools\"\n\n    # Verify return value is metadata dict, not None\n    assert result is not None\n    assert \"name\" in result\n    assert \"provides\" in result\n\n\n@pytest.mark.asyncio\nasync def test_tool_has_required_properties():\n    \"\"\"Tool class must have name, description, input_schema, execute.\"\"\"\n    coordinator = MagicMock()\n    coordinator.mount = AsyncMock()\n\n    await mount(coordinator)\n\n    # Get the tool that was registered\n    tool = coordinator.mount.call_args[0][1]\n    assert isinstance(tool.name, str) and tool.name\n    assert isinstance(tool.description, str) and tool.description\n    assert isinstance(tool.input_schema, dict)\n    assert callable(tool.execute)\n```\n\n---\n\n## Anti-Rationalization Table\n\n| Excuse | Reality |\n|--------|---------|\n| \"It's just a stub, it doesn't need to register anything\" | Protocol validation runs on every module load. No-op stubs fail immediately. |\n| \"Phase 2 will fill it in\" | Phase 2 may be weeks away. The module loads NOW and fails NOW. |\n| \"I'll add a TODO comment\" | The validator doesn't read comments. It checks `coordinator.mount()` calls. |\n| \"The tests pass with `result is None`\" | Tests that assert `result is None` are testing the bug, not the behavior. |\n| \"The mount() signature is all that matters\" | The signature is necessary but not sufficient. Registration is also required. |\n| \"It works locally without registering\" | It silently fails the protocol check. You won't see the error until an agent spawns. |\n\n---\n\n## Red Flags — STOP and Use the Placeholder Pattern\n\nIf you find yourself thinking any of these, STOP:\n\n- \"mount() can just log and return None\" → **NO.** It must register a tool.\n- \"I'll skip the tool class since there's nothing to implement yet\" → **NO.** Create a placeholder class.\n- \"The test should assert `result is None`\" → **NO.** The test should verify `coordinator.mount()` was called.\n- \"It's a stub so it should be empty\" → **NO.** Use the placeholder pattern above.\n- \"Phase 2 will make it real, for now I'll just return None\" → **NO.** Phase 2 doesn't exist yet. The module loads today.\n\n---\n\n## Validation Checklist\n\nAfter creating a module, verify it will pass protocol compliance:\n\n- [ ] Does `mount()` call `await coordinator.mount(\"tools\", tool, name=tool.name)`?\n- [ ] Does the tool class have a `name` property (string)?\n- [ ] Does the tool class have a `description` property (string)?\n- [ ] Does the tool class have an `input_schema` property (dict)?\n- [ ] Does the tool class have a callable `execute()` method?\n- [ ] Does `mount()` return a metadata dict (not `None`)?\n- [ ] Does `pyproject.toml` declare the `amplifier.modules` entry point?\n- [ ] Do tests verify `coordinator.mount()` was called (not that result is `None`)?\n\nAll eight boxes must be checked before committing.\n\n---\n\n## Quick Reference\n\n**Minimum viable module `__init__.py`:**\n\n```python\nfrom amplifier_core import ToolResult\n\nclass MyTool:\n    name = \"my_tool\"\n    description = \"What this tool does\"\n    input_schema = {\"type\": \"object\", \"properties\": {}}\n\n    async def execute(self, input_data):\n        return ToolResult(success=False, output=\"Not yet implemented\")\n\nasync def mount(coordinator, config=None):\n    tool = MyTool()\n    await coordinator.mount(\"tools\", tool, name=tool.name)\n    return {\"name\": \"tool-my-tool\", \"version\": \"0.1.0\", \"provides\": [\"my_tool\"]}\n```\n\nThis is the minimum. Every line is required. Nothing can be removed.\n",{"data":31,"body":32},{"name":4,"description":6},{"type":33,"children":34},"root",[35,43,50,65,98,115,119,125,137,149,152,158,167,187,392,395,401,413,439,447,871,874,880,892,1333,1382,1385,1391,1396,1460,1465,1518,1521,1527,1545,1844,1847,1853,1981,1984,1990,1995,2069,2072,2078,2083,2243,2248,2251,2257,2272,2384,2389],{"type":36,"tag":37,"props":38,"children":39},"element","h1",{"id":4},[40],{"type":41,"value":42},"text","Creating Amplifier Modules",{"type":36,"tag":44,"props":45,"children":47},"h2",{"id":46},"overview",[48],{"type":41,"value":49},"Overview",{"type":36,"tag":51,"props":52,"children":53},"p",{},[54,56,63],{"type":41,"value":55},"Amplifier modules are Python packages that extend the runtime with tools, hooks, providers, and other capabilities. Every module has a ",{"type":36,"tag":57,"props":58,"children":60},"code",{"className":59},[],[61],{"type":41,"value":62},"mount()",{"type":41,"value":64}," function that runs at session startup.",{"type":36,"tag":51,"props":66,"children":67},{},[68,74,76,81,83,88,90,96],{"type":36,"tag":69,"props":70,"children":71},"strong",{},[72],{"type":41,"value":73},"Core principle:",{"type":41,"value":75}," ",{"type":36,"tag":57,"props":77,"children":79},{"className":78},[],[80],{"type":41,"value":62},{"type":41,"value":82}," must register something with the coordinator. A ",{"type":36,"tag":57,"props":84,"children":86},{"className":85},[],[87],{"type":41,"value":62},{"type":41,"value":89}," that logs and returns ",{"type":36,"tag":57,"props":91,"children":93},{"className":92},[],[94],{"type":41,"value":95},"None",{"type":41,"value":97}," WILL fail validation.",{"type":36,"tag":51,"props":99,"children":100},{},[101,106,108,113],{"type":36,"tag":69,"props":102,"children":103},{},[104],{"type":41,"value":105},"This matters immediately.",{"type":41,"value":107}," Module validation runs every time a session loads. A broken ",{"type":36,"tag":57,"props":109,"children":111},{"className":110},[],[112],{"type":41,"value":62},{"type":41,"value":114}," prevents any agent using the behavior from spawning — not just future agents, not \"when Phase 2 is done\" — right now, on every invocation.",{"type":36,"tag":116,"props":117,"children":118},"hr",{},[],{"type":36,"tag":44,"props":120,"children":122},{"id":121},"the-iron-law",[123],{"type":41,"value":124},"The Iron Law",{"type":36,"tag":126,"props":127,"children":131},"pre",{"className":128,"code":130,"language":41},[129],"language-text","mount() MUST call coordinator.mount() or return a Tool instance.\nA mount() that returns None and calls nothing WILL FAIL with:\n\"protocol_compliance: No tool was mounted and mount() did not return a Tool instance\"\n",[132],{"type":36,"tag":57,"props":133,"children":135},{"__ignoreMap":134},"",[136],{"type":41,"value":130},{"type":36,"tag":51,"props":138,"children":139},{},[140,142,147],{"type":41,"value":141},"\"Stub\" means ",{"type":36,"tag":69,"props":143,"children":144},{},[145],{"type":41,"value":146},"placeholder that satisfies the protocol",{"type":41,"value":148}," — not empty function that does nothing.",{"type":36,"tag":116,"props":150,"children":151},{},[],{"type":36,"tag":44,"props":153,"children":155},{"id":154},"module-directory-structure",[156],{"type":41,"value":157},"Module Directory Structure",{"type":36,"tag":126,"props":159,"children":162},{"className":160,"code":161,"language":41},[129],"modules\u002Ftool-{name}\u002F\n├── pyproject.toml                        # name = \"amplifier-module-tool-{name}\", hatchling\n└── amplifier_module_tool_{name}\u002F\n    └── __init__.py                       # async mount(coordinator, config)\n",[163],{"type":36,"tag":57,"props":164,"children":165},{"__ignoreMap":134},[166],{"type":41,"value":161},{"type":36,"tag":51,"props":168,"children":169},{},[170,172,178,180,185],{"type":41,"value":171},"The ",{"type":36,"tag":57,"props":173,"children":175},{"className":174},[],[176],{"type":41,"value":177},"pyproject.toml",{"type":41,"value":179}," entry point wires the module name to ",{"type":36,"tag":57,"props":181,"children":183},{"className":182},[],[184],{"type":41,"value":62},{"type":41,"value":186},":",{"type":36,"tag":126,"props":188,"children":192},{"className":189,"code":190,"language":191,"meta":134,"style":134},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[project]\nname = \"amplifier-module-tool-{name}\"\nversion = \"0.1.0\"\ndescription = \"Description of what this tool does\"\nrequires-python = \">=3.11\"\nlicense = { text = \"MIT\" }\ndependencies = []   # amplifier-core is a peer dependency — do NOT declare it here\n\n[project.entry-points.\"amplifier.modules\"]\ntool-{name} = \"amplifier_module_tool_{name}:mount\"\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.build.targets.wheel]\npackages = [\"amplifier_module_tool_{name}\"]\n\n[tool.pytest.ini_options]\ntestpaths = [\"tests\"]\nasyncio_mode = \"auto\"\nasyncio_default_fixture_loop_scope = \"function\"\n","toml",[193],{"type":36,"tag":57,"props":194,"children":195},{"__ignoreMap":134},[196,207,216,225,234,243,252,261,271,280,289,297,306,315,324,332,340,348,356,365,374,383],{"type":36,"tag":197,"props":198,"children":201},"span",{"class":199,"line":200},"line",1,[202],{"type":36,"tag":197,"props":203,"children":204},{},[205],{"type":41,"value":206},"[project]\n",{"type":36,"tag":197,"props":208,"children":210},{"class":199,"line":209},2,[211],{"type":36,"tag":197,"props":212,"children":213},{},[214],{"type":41,"value":215},"name = \"amplifier-module-tool-{name}\"\n",{"type":36,"tag":197,"props":217,"children":219},{"class":199,"line":218},3,[220],{"type":36,"tag":197,"props":221,"children":222},{},[223],{"type":41,"value":224},"version = \"0.1.0\"\n",{"type":36,"tag":197,"props":226,"children":228},{"class":199,"line":227},4,[229],{"type":36,"tag":197,"props":230,"children":231},{},[232],{"type":41,"value":233},"description = \"Description of what this tool does\"\n",{"type":36,"tag":197,"props":235,"children":237},{"class":199,"line":236},5,[238],{"type":36,"tag":197,"props":239,"children":240},{},[241],{"type":41,"value":242},"requires-python = \">=3.11\"\n",{"type":36,"tag":197,"props":244,"children":246},{"class":199,"line":245},6,[247],{"type":36,"tag":197,"props":248,"children":249},{},[250],{"type":41,"value":251},"license = { text = \"MIT\" }\n",{"type":36,"tag":197,"props":253,"children":255},{"class":199,"line":254},7,[256],{"type":36,"tag":197,"props":257,"children":258},{},[259],{"type":41,"value":260},"dependencies = []   # amplifier-core is a peer dependency — do NOT declare it here\n",{"type":36,"tag":197,"props":262,"children":264},{"class":199,"line":263},8,[265],{"type":36,"tag":197,"props":266,"children":268},{"emptyLinePlaceholder":267},true,[269],{"type":41,"value":270},"\n",{"type":36,"tag":197,"props":272,"children":274},{"class":199,"line":273},9,[275],{"type":36,"tag":197,"props":276,"children":277},{},[278],{"type":41,"value":279},"[project.entry-points.\"amplifier.modules\"]\n",{"type":36,"tag":197,"props":281,"children":283},{"class":199,"line":282},10,[284],{"type":36,"tag":197,"props":285,"children":286},{},[287],{"type":41,"value":288},"tool-{name} = \"amplifier_module_tool_{name}:mount\"\n",{"type":36,"tag":197,"props":290,"children":292},{"class":199,"line":291},11,[293],{"type":36,"tag":197,"props":294,"children":295},{"emptyLinePlaceholder":267},[296],{"type":41,"value":270},{"type":36,"tag":197,"props":298,"children":300},{"class":199,"line":299},12,[301],{"type":36,"tag":197,"props":302,"children":303},{},[304],{"type":41,"value":305},"[build-system]\n",{"type":36,"tag":197,"props":307,"children":309},{"class":199,"line":308},13,[310],{"type":36,"tag":197,"props":311,"children":312},{},[313],{"type":41,"value":314},"requires = [\"hatchling\"]\n",{"type":36,"tag":197,"props":316,"children":318},{"class":199,"line":317},14,[319],{"type":36,"tag":197,"props":320,"children":321},{},[322],{"type":41,"value":323},"build-backend = \"hatchling.build\"\n",{"type":36,"tag":197,"props":325,"children":327},{"class":199,"line":326},15,[328],{"type":36,"tag":197,"props":329,"children":330},{"emptyLinePlaceholder":267},[331],{"type":41,"value":270},{"type":36,"tag":197,"props":333,"children":334},{"class":199,"line":19},[335],{"type":36,"tag":197,"props":336,"children":337},{},[338],{"type":41,"value":339},"[tool.hatch.build.targets.wheel]\n",{"type":36,"tag":197,"props":341,"children":342},{"class":199,"line":23},[343],{"type":36,"tag":197,"props":344,"children":345},{},[346],{"type":41,"value":347},"packages = [\"amplifier_module_tool_{name}\"]\n",{"type":36,"tag":197,"props":349,"children":351},{"class":199,"line":350},18,[352],{"type":36,"tag":197,"props":353,"children":354},{"emptyLinePlaceholder":267},[355],{"type":41,"value":270},{"type":36,"tag":197,"props":357,"children":359},{"class":199,"line":358},19,[360],{"type":36,"tag":197,"props":361,"children":362},{},[363],{"type":41,"value":364},"[tool.pytest.ini_options]\n",{"type":36,"tag":197,"props":366,"children":368},{"class":199,"line":367},20,[369],{"type":36,"tag":197,"props":370,"children":371},{},[372],{"type":41,"value":373},"testpaths = [\"tests\"]\n",{"type":36,"tag":197,"props":375,"children":377},{"class":199,"line":376},21,[378],{"type":36,"tag":197,"props":379,"children":380},{},[381],{"type":41,"value":382},"asyncio_mode = \"auto\"\n",{"type":36,"tag":197,"props":384,"children":386},{"class":199,"line":385},22,[387],{"type":36,"tag":197,"props":388,"children":389},{},[390],{"type":41,"value":391},"asyncio_default_fixture_loop_scope = \"function\"\n",{"type":36,"tag":116,"props":393,"children":394},{},[],{"type":36,"tag":44,"props":396,"children":398},{"id":397},"the-mount-contract",[399],{"type":41,"value":400},"The mount() Contract",{"type":36,"tag":51,"props":402,"children":403},{},[404,406,411],{"type":41,"value":405},"Every ",{"type":36,"tag":57,"props":407,"children":409},{"className":408},[],[410],{"type":41,"value":62},{"type":41,"value":412}," must:",{"type":36,"tag":414,"props":415,"children":416},"ol",{},[417,423,434],{"type":36,"tag":418,"props":419,"children":420},"li",{},[421],{"type":41,"value":422},"Instantiate a tool class",{"type":36,"tag":418,"props":424,"children":425},{},[426,428],{"type":41,"value":427},"Call ",{"type":36,"tag":57,"props":429,"children":431},{"className":430},[],[432],{"type":41,"value":433},"await coordinator.mount(\"tools\", tool, name=tool.name)",{"type":36,"tag":418,"props":435,"children":436},{},[437],{"type":41,"value":438},"Return a metadata dict (not None)",{"type":36,"tag":51,"props":440,"children":441},{},[442],{"type":36,"tag":69,"props":443,"children":444},{},[445],{"type":41,"value":446},"Complete working example:",{"type":36,"tag":126,"props":448,"children":452},{"className":449,"code":450,"language":451,"meta":134,"style":134},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"\"\"Amplifier tool module for {name}.\"\"\"\n\nimport logging\nfrom typing import Any\n\nfrom amplifier_core import ToolResult\n\nlogger = logging.getLogger(__name__)\n\n\nclass MyTool:\n    \"\"\"Tool class — the actual capability being registered.\"\"\"\n\n    @property\n    def name(self) -> str:\n        return \"my_tool\"\n\n    @property\n    def description(self) -> str:\n        return \"Description of what this tool does and when to use it.\"\n\n    @property\n    def input_schema(self) -> dict:\n        return {\n            \"type\": \"object\",\n            \"properties\": {\n                \"param\": {\n                    \"type\": \"string\",\n                    \"description\": \"What this parameter does\",\n                },\n            },\n            \"required\": [\"param\"],\n        }\n\n    async def execute(self, input_data: dict[str, Any]) -> ToolResult:\n        \"\"\"Execute the tool operation.\"\"\"\n        result = do_the_work(input_data[\"param\"])\n        return ToolResult(success=True, output=result)\n\n\nasync def mount(coordinator: Any, config: dict[str, Any] | None = None) -> dict[str, Any]:\n    \"\"\"Mount the tool into the coordinator.\"\"\"\n    tool = MyTool()\n    await coordinator.mount(\"tools\", tool, name=tool.name)\n    logger.info(\"tool-my-tool mounted: registered 'my_tool'\")\n    return {\n        \"name\": \"tool-my-tool\",\n        \"version\": \"0.1.0\",\n        \"provides\": [\"my_tool\"],\n    }\n","python",[453],{"type":36,"tag":57,"props":454,"children":455},{"__ignoreMap":134},[456,464,471,479,487,494,502,509,517,524,531,539,547,554,562,570,578,585,592,600,608,615,622,631,640,649,658,667,676,685,694,703,712,721,729,738,747,756,765,773,781,790,799,808,817,826,835,844,853,862],{"type":36,"tag":197,"props":457,"children":458},{"class":199,"line":200},[459],{"type":36,"tag":197,"props":460,"children":461},{},[462],{"type":41,"value":463},"\"\"\"Amplifier tool module for {name}.\"\"\"\n",{"type":36,"tag":197,"props":465,"children":466},{"class":199,"line":209},[467],{"type":36,"tag":197,"props":468,"children":469},{"emptyLinePlaceholder":267},[470],{"type":41,"value":270},{"type":36,"tag":197,"props":472,"children":473},{"class":199,"line":218},[474],{"type":36,"tag":197,"props":475,"children":476},{},[477],{"type":41,"value":478},"import logging\n",{"type":36,"tag":197,"props":480,"children":481},{"class":199,"line":227},[482],{"type":36,"tag":197,"props":483,"children":484},{},[485],{"type":41,"value":486},"from typing import Any\n",{"type":36,"tag":197,"props":488,"children":489},{"class":199,"line":236},[490],{"type":36,"tag":197,"props":491,"children":492},{"emptyLinePlaceholder":267},[493],{"type":41,"value":270},{"type":36,"tag":197,"props":495,"children":496},{"class":199,"line":245},[497],{"type":36,"tag":197,"props":498,"children":499},{},[500],{"type":41,"value":501},"from amplifier_core import ToolResult\n",{"type":36,"tag":197,"props":503,"children":504},{"class":199,"line":254},[505],{"type":36,"tag":197,"props":506,"children":507},{"emptyLinePlaceholder":267},[508],{"type":41,"value":270},{"type":36,"tag":197,"props":510,"children":511},{"class":199,"line":263},[512],{"type":36,"tag":197,"props":513,"children":514},{},[515],{"type":41,"value":516},"logger = logging.getLogger(__name__)\n",{"type":36,"tag":197,"props":518,"children":519},{"class":199,"line":273},[520],{"type":36,"tag":197,"props":521,"children":522},{"emptyLinePlaceholder":267},[523],{"type":41,"value":270},{"type":36,"tag":197,"props":525,"children":526},{"class":199,"line":282},[527],{"type":36,"tag":197,"props":528,"children":529},{"emptyLinePlaceholder":267},[530],{"type":41,"value":270},{"type":36,"tag":197,"props":532,"children":533},{"class":199,"line":291},[534],{"type":36,"tag":197,"props":535,"children":536},{},[537],{"type":41,"value":538},"class MyTool:\n",{"type":36,"tag":197,"props":540,"children":541},{"class":199,"line":299},[542],{"type":36,"tag":197,"props":543,"children":544},{},[545],{"type":41,"value":546},"    \"\"\"Tool class — the actual capability being registered.\"\"\"\n",{"type":36,"tag":197,"props":548,"children":549},{"class":199,"line":308},[550],{"type":36,"tag":197,"props":551,"children":552},{"emptyLinePlaceholder":267},[553],{"type":41,"value":270},{"type":36,"tag":197,"props":555,"children":556},{"class":199,"line":317},[557],{"type":36,"tag":197,"props":558,"children":559},{},[560],{"type":41,"value":561},"    @property\n",{"type":36,"tag":197,"props":563,"children":564},{"class":199,"line":326},[565],{"type":36,"tag":197,"props":566,"children":567},{},[568],{"type":41,"value":569},"    def name(self) -> str:\n",{"type":36,"tag":197,"props":571,"children":572},{"class":199,"line":19},[573],{"type":36,"tag":197,"props":574,"children":575},{},[576],{"type":41,"value":577},"        return \"my_tool\"\n",{"type":36,"tag":197,"props":579,"children":580},{"class":199,"line":23},[581],{"type":36,"tag":197,"props":582,"children":583},{"emptyLinePlaceholder":267},[584],{"type":41,"value":270},{"type":36,"tag":197,"props":586,"children":587},{"class":199,"line":350},[588],{"type":36,"tag":197,"props":589,"children":590},{},[591],{"type":41,"value":561},{"type":36,"tag":197,"props":593,"children":594},{"class":199,"line":358},[595],{"type":36,"tag":197,"props":596,"children":597},{},[598],{"type":41,"value":599},"    def description(self) -> str:\n",{"type":36,"tag":197,"props":601,"children":602},{"class":199,"line":367},[603],{"type":36,"tag":197,"props":604,"children":605},{},[606],{"type":41,"value":607},"        return \"Description of what this tool does and when to use it.\"\n",{"type":36,"tag":197,"props":609,"children":610},{"class":199,"line":376},[611],{"type":36,"tag":197,"props":612,"children":613},{"emptyLinePlaceholder":267},[614],{"type":41,"value":270},{"type":36,"tag":197,"props":616,"children":617},{"class":199,"line":385},[618],{"type":36,"tag":197,"props":619,"children":620},{},[621],{"type":41,"value":561},{"type":36,"tag":197,"props":623,"children":625},{"class":199,"line":624},23,[626],{"type":36,"tag":197,"props":627,"children":628},{},[629],{"type":41,"value":630},"    def input_schema(self) -> dict:\n",{"type":36,"tag":197,"props":632,"children":634},{"class":199,"line":633},24,[635],{"type":36,"tag":197,"props":636,"children":637},{},[638],{"type":41,"value":639},"        return {\n",{"type":36,"tag":197,"props":641,"children":643},{"class":199,"line":642},25,[644],{"type":36,"tag":197,"props":645,"children":646},{},[647],{"type":41,"value":648},"            \"type\": \"object\",\n",{"type":36,"tag":197,"props":650,"children":652},{"class":199,"line":651},26,[653],{"type":36,"tag":197,"props":654,"children":655},{},[656],{"type":41,"value":657},"            \"properties\": {\n",{"type":36,"tag":197,"props":659,"children":661},{"class":199,"line":660},27,[662],{"type":36,"tag":197,"props":663,"children":664},{},[665],{"type":41,"value":666},"                \"param\": {\n",{"type":36,"tag":197,"props":668,"children":670},{"class":199,"line":669},28,[671],{"type":36,"tag":197,"props":672,"children":673},{},[674],{"type":41,"value":675},"                    \"type\": \"string\",\n",{"type":36,"tag":197,"props":677,"children":679},{"class":199,"line":678},29,[680],{"type":36,"tag":197,"props":681,"children":682},{},[683],{"type":41,"value":684},"                    \"description\": \"What this parameter does\",\n",{"type":36,"tag":197,"props":686,"children":688},{"class":199,"line":687},30,[689],{"type":36,"tag":197,"props":690,"children":691},{},[692],{"type":41,"value":693},"                },\n",{"type":36,"tag":197,"props":695,"children":697},{"class":199,"line":696},31,[698],{"type":36,"tag":197,"props":699,"children":700},{},[701],{"type":41,"value":702},"            },\n",{"type":36,"tag":197,"props":704,"children":706},{"class":199,"line":705},32,[707],{"type":36,"tag":197,"props":708,"children":709},{},[710],{"type":41,"value":711},"            \"required\": [\"param\"],\n",{"type":36,"tag":197,"props":713,"children":715},{"class":199,"line":714},33,[716],{"type":36,"tag":197,"props":717,"children":718},{},[719],{"type":41,"value":720},"        }\n",{"type":36,"tag":197,"props":722,"children":724},{"class":199,"line":723},34,[725],{"type":36,"tag":197,"props":726,"children":727},{"emptyLinePlaceholder":267},[728],{"type":41,"value":270},{"type":36,"tag":197,"props":730,"children":732},{"class":199,"line":731},35,[733],{"type":36,"tag":197,"props":734,"children":735},{},[736],{"type":41,"value":737},"    async def execute(self, input_data: dict[str, Any]) -> ToolResult:\n",{"type":36,"tag":197,"props":739,"children":741},{"class":199,"line":740},36,[742],{"type":36,"tag":197,"props":743,"children":744},{},[745],{"type":41,"value":746},"        \"\"\"Execute the tool operation.\"\"\"\n",{"type":36,"tag":197,"props":748,"children":750},{"class":199,"line":749},37,[751],{"type":36,"tag":197,"props":752,"children":753},{},[754],{"type":41,"value":755},"        result = do_the_work(input_data[\"param\"])\n",{"type":36,"tag":197,"props":757,"children":759},{"class":199,"line":758},38,[760],{"type":36,"tag":197,"props":761,"children":762},{},[763],{"type":41,"value":764},"        return ToolResult(success=True, output=result)\n",{"type":36,"tag":197,"props":766,"children":768},{"class":199,"line":767},39,[769],{"type":36,"tag":197,"props":770,"children":771},{"emptyLinePlaceholder":267},[772],{"type":41,"value":270},{"type":36,"tag":197,"props":774,"children":776},{"class":199,"line":775},40,[777],{"type":36,"tag":197,"props":778,"children":779},{"emptyLinePlaceholder":267},[780],{"type":41,"value":270},{"type":36,"tag":197,"props":782,"children":784},{"class":199,"line":783},41,[785],{"type":36,"tag":197,"props":786,"children":787},{},[788],{"type":41,"value":789},"async def mount(coordinator: Any, config: dict[str, Any] | None = None) -> dict[str, Any]:\n",{"type":36,"tag":197,"props":791,"children":793},{"class":199,"line":792},42,[794],{"type":36,"tag":197,"props":795,"children":796},{},[797],{"type":41,"value":798},"    \"\"\"Mount the tool into the coordinator.\"\"\"\n",{"type":36,"tag":197,"props":800,"children":802},{"class":199,"line":801},43,[803],{"type":36,"tag":197,"props":804,"children":805},{},[806],{"type":41,"value":807},"    tool = MyTool()\n",{"type":36,"tag":197,"props":809,"children":811},{"class":199,"line":810},44,[812],{"type":36,"tag":197,"props":813,"children":814},{},[815],{"type":41,"value":816},"    await coordinator.mount(\"tools\", tool, name=tool.name)\n",{"type":36,"tag":197,"props":818,"children":820},{"class":199,"line":819},45,[821],{"type":36,"tag":197,"props":822,"children":823},{},[824],{"type":41,"value":825},"    logger.info(\"tool-my-tool mounted: registered 'my_tool'\")\n",{"type":36,"tag":197,"props":827,"children":829},{"class":199,"line":828},46,[830],{"type":36,"tag":197,"props":831,"children":832},{},[833],{"type":41,"value":834},"    return {\n",{"type":36,"tag":197,"props":836,"children":838},{"class":199,"line":837},47,[839],{"type":36,"tag":197,"props":840,"children":841},{},[842],{"type":41,"value":843},"        \"name\": \"tool-my-tool\",\n",{"type":36,"tag":197,"props":845,"children":847},{"class":199,"line":846},48,[848],{"type":36,"tag":197,"props":849,"children":850},{},[851],{"type":41,"value":852},"        \"version\": \"0.1.0\",\n",{"type":36,"tag":197,"props":854,"children":856},{"class":199,"line":855},49,[857],{"type":36,"tag":197,"props":858,"children":859},{},[860],{"type":41,"value":861},"        \"provides\": [\"my_tool\"],\n",{"type":36,"tag":197,"props":863,"children":865},{"class":199,"line":864},50,[866],{"type":36,"tag":197,"props":867,"children":868},{},[869],{"type":41,"value":870},"    }\n",{"type":36,"tag":116,"props":872,"children":873},{},[],{"type":36,"tag":44,"props":875,"children":877},{"id":876},"the-placeholder-pattern",[878],{"type":41,"value":879},"The Placeholder Pattern",{"type":36,"tag":51,"props":881,"children":882},{},[883,885,890],{"type":41,"value":884},"When Phase 1 needs a module skeleton before full implementation, create a ",{"type":36,"tag":69,"props":886,"children":887},{},[888],{"type":41,"value":889},"real tool class",{"type":41,"value":891}," that returns a \"not yet implemented\" message. The tool still has all required properties and registers with the coordinator.",{"type":36,"tag":126,"props":893,"children":895},{"className":449,"code":894,"language":451,"meta":134,"style":134},"\"\"\"Amplifier tool module for {name} — Phase 1 placeholder.\"\"\"\n\nimport logging\nfrom typing import Any\n\nfrom amplifier_core import ToolResult\n\nlogger = logging.getLogger(__name__)\n\n\nclass MyToolPlaceholder:\n    \"\"\"Placeholder tool — registers to satisfy protocol compliance (Phase 1).\n\n    Phase 2 will replace this with full implementation.\n    \"\"\"\n\n    @property\n    def name(self) -> str:\n        return \"my_tool\"\n\n    @property\n    def description(self) -> str:\n        return \"Description of what this tool will do. Phase 2 implementation pending.\"\n\n    @property\n    def input_schema(self) -> dict:\n        return {\n            \"type\": \"object\",\n            \"properties\": {\n                \"operation\": {\n                    \"type\": \"string\",\n                    \"description\": \"Operation to perform\",\n                },\n            },\n            \"required\": [\"operation\"],\n        }\n\n    async def execute(self, input_data: dict[str, Any]) -> ToolResult:\n        \"\"\"Return not-yet-implemented message.\"\"\"\n        return ToolResult(\n            success=False,\n            output=(\n                \"Tool not yet implemented. Phase 2 will add full functionality. \"\n                \"Use the shell scripts in the bundle for now.\"\n            ),\n        )\n\n\nasync def mount(coordinator: Any, config: dict[str, Any] | None = None) -> dict[str, Any]:\n    \"\"\"Mount placeholder tool — satisfies protocol compliance during Phase 1.\"\"\"\n    tool = MyToolPlaceholder()\n    await coordinator.mount(\"tools\", tool, name=tool.name)\n    logger.info(\"tool-my-tool mounted: registered placeholder 'my_tool' (Phase 2 pending)\")\n    return {\n        \"name\": \"tool-my-tool\",\n        \"version\": \"0.1.0\",\n        \"provides\": [\"my_tool\"],\n    }\n",[896],{"type":36,"tag":57,"props":897,"children":898},{"__ignoreMap":134},[899,907,914,921,928,935,942,949,956,963,970,978,986,993,1001,1009,1016,1023,1030,1037,1044,1051,1058,1066,1073,1080,1087,1094,1101,1108,1116,1123,1131,1138,1145,1153,1160,1167,1174,1182,1190,1198,1206,1214,1222,1230,1238,1245,1252,1259,1267,1276,1284,1293,1301,1309,1317,1325],{"type":36,"tag":197,"props":900,"children":901},{"class":199,"line":200},[902],{"type":36,"tag":197,"props":903,"children":904},{},[905],{"type":41,"value":906},"\"\"\"Amplifier tool module for {name} — Phase 1 placeholder.\"\"\"\n",{"type":36,"tag":197,"props":908,"children":909},{"class":199,"line":209},[910],{"type":36,"tag":197,"props":911,"children":912},{"emptyLinePlaceholder":267},[913],{"type":41,"value":270},{"type":36,"tag":197,"props":915,"children":916},{"class":199,"line":218},[917],{"type":36,"tag":197,"props":918,"children":919},{},[920],{"type":41,"value":478},{"type":36,"tag":197,"props":922,"children":923},{"class":199,"line":227},[924],{"type":36,"tag":197,"props":925,"children":926},{},[927],{"type":41,"value":486},{"type":36,"tag":197,"props":929,"children":930},{"class":199,"line":236},[931],{"type":36,"tag":197,"props":932,"children":933},{"emptyLinePlaceholder":267},[934],{"type":41,"value":270},{"type":36,"tag":197,"props":936,"children":937},{"class":199,"line":245},[938],{"type":36,"tag":197,"props":939,"children":940},{},[941],{"type":41,"value":501},{"type":36,"tag":197,"props":943,"children":944},{"class":199,"line":254},[945],{"type":36,"tag":197,"props":946,"children":947},{"emptyLinePlaceholder":267},[948],{"type":41,"value":270},{"type":36,"tag":197,"props":950,"children":951},{"class":199,"line":263},[952],{"type":36,"tag":197,"props":953,"children":954},{},[955],{"type":41,"value":516},{"type":36,"tag":197,"props":957,"children":958},{"class":199,"line":273},[959],{"type":36,"tag":197,"props":960,"children":961},{"emptyLinePlaceholder":267},[962],{"type":41,"value":270},{"type":36,"tag":197,"props":964,"children":965},{"class":199,"line":282},[966],{"type":36,"tag":197,"props":967,"children":968},{"emptyLinePlaceholder":267},[969],{"type":41,"value":270},{"type":36,"tag":197,"props":971,"children":972},{"class":199,"line":291},[973],{"type":36,"tag":197,"props":974,"children":975},{},[976],{"type":41,"value":977},"class MyToolPlaceholder:\n",{"type":36,"tag":197,"props":979,"children":980},{"class":199,"line":299},[981],{"type":36,"tag":197,"props":982,"children":983},{},[984],{"type":41,"value":985},"    \"\"\"Placeholder tool — registers to satisfy protocol compliance (Phase 1).\n",{"type":36,"tag":197,"props":987,"children":988},{"class":199,"line":308},[989],{"type":36,"tag":197,"props":990,"children":991},{"emptyLinePlaceholder":267},[992],{"type":41,"value":270},{"type":36,"tag":197,"props":994,"children":995},{"class":199,"line":317},[996],{"type":36,"tag":197,"props":997,"children":998},{},[999],{"type":41,"value":1000},"    Phase 2 will replace this with full implementation.\n",{"type":36,"tag":197,"props":1002,"children":1003},{"class":199,"line":326},[1004],{"type":36,"tag":197,"props":1005,"children":1006},{},[1007],{"type":41,"value":1008},"    \"\"\"\n",{"type":36,"tag":197,"props":1010,"children":1011},{"class":199,"line":19},[1012],{"type":36,"tag":197,"props":1013,"children":1014},{"emptyLinePlaceholder":267},[1015],{"type":41,"value":270},{"type":36,"tag":197,"props":1017,"children":1018},{"class":199,"line":23},[1019],{"type":36,"tag":197,"props":1020,"children":1021},{},[1022],{"type":41,"value":561},{"type":36,"tag":197,"props":1024,"children":1025},{"class":199,"line":350},[1026],{"type":36,"tag":197,"props":1027,"children":1028},{},[1029],{"type":41,"value":569},{"type":36,"tag":197,"props":1031,"children":1032},{"class":199,"line":358},[1033],{"type":36,"tag":197,"props":1034,"children":1035},{},[1036],{"type":41,"value":577},{"type":36,"tag":197,"props":1038,"children":1039},{"class":199,"line":367},[1040],{"type":36,"tag":197,"props":1041,"children":1042},{"emptyLinePlaceholder":267},[1043],{"type":41,"value":270},{"type":36,"tag":197,"props":1045,"children":1046},{"class":199,"line":376},[1047],{"type":36,"tag":197,"props":1048,"children":1049},{},[1050],{"type":41,"value":561},{"type":36,"tag":197,"props":1052,"children":1053},{"class":199,"line":385},[1054],{"type":36,"tag":197,"props":1055,"children":1056},{},[1057],{"type":41,"value":599},{"type":36,"tag":197,"props":1059,"children":1060},{"class":199,"line":624},[1061],{"type":36,"tag":197,"props":1062,"children":1063},{},[1064],{"type":41,"value":1065},"        return \"Description of what this tool will do. Phase 2 implementation pending.\"\n",{"type":36,"tag":197,"props":1067,"children":1068},{"class":199,"line":633},[1069],{"type":36,"tag":197,"props":1070,"children":1071},{"emptyLinePlaceholder":267},[1072],{"type":41,"value":270},{"type":36,"tag":197,"props":1074,"children":1075},{"class":199,"line":642},[1076],{"type":36,"tag":197,"props":1077,"children":1078},{},[1079],{"type":41,"value":561},{"type":36,"tag":197,"props":1081,"children":1082},{"class":199,"line":651},[1083],{"type":36,"tag":197,"props":1084,"children":1085},{},[1086],{"type":41,"value":630},{"type":36,"tag":197,"props":1088,"children":1089},{"class":199,"line":660},[1090],{"type":36,"tag":197,"props":1091,"children":1092},{},[1093],{"type":41,"value":639},{"type":36,"tag":197,"props":1095,"children":1096},{"class":199,"line":669},[1097],{"type":36,"tag":197,"props":1098,"children":1099},{},[1100],{"type":41,"value":648},{"type":36,"tag":197,"props":1102,"children":1103},{"class":199,"line":678},[1104],{"type":36,"tag":197,"props":1105,"children":1106},{},[1107],{"type":41,"value":657},{"type":36,"tag":197,"props":1109,"children":1110},{"class":199,"line":687},[1111],{"type":36,"tag":197,"props":1112,"children":1113},{},[1114],{"type":41,"value":1115},"                \"operation\": {\n",{"type":36,"tag":197,"props":1117,"children":1118},{"class":199,"line":696},[1119],{"type":36,"tag":197,"props":1120,"children":1121},{},[1122],{"type":41,"value":675},{"type":36,"tag":197,"props":1124,"children":1125},{"class":199,"line":705},[1126],{"type":36,"tag":197,"props":1127,"children":1128},{},[1129],{"type":41,"value":1130},"                    \"description\": \"Operation to perform\",\n",{"type":36,"tag":197,"props":1132,"children":1133},{"class":199,"line":714},[1134],{"type":36,"tag":197,"props":1135,"children":1136},{},[1137],{"type":41,"value":693},{"type":36,"tag":197,"props":1139,"children":1140},{"class":199,"line":723},[1141],{"type":36,"tag":197,"props":1142,"children":1143},{},[1144],{"type":41,"value":702},{"type":36,"tag":197,"props":1146,"children":1147},{"class":199,"line":731},[1148],{"type":36,"tag":197,"props":1149,"children":1150},{},[1151],{"type":41,"value":1152},"            \"required\": [\"operation\"],\n",{"type":36,"tag":197,"props":1154,"children":1155},{"class":199,"line":740},[1156],{"type":36,"tag":197,"props":1157,"children":1158},{},[1159],{"type":41,"value":720},{"type":36,"tag":197,"props":1161,"children":1162},{"class":199,"line":749},[1163],{"type":36,"tag":197,"props":1164,"children":1165},{"emptyLinePlaceholder":267},[1166],{"type":41,"value":270},{"type":36,"tag":197,"props":1168,"children":1169},{"class":199,"line":758},[1170],{"type":36,"tag":197,"props":1171,"children":1172},{},[1173],{"type":41,"value":737},{"type":36,"tag":197,"props":1175,"children":1176},{"class":199,"line":767},[1177],{"type":36,"tag":197,"props":1178,"children":1179},{},[1180],{"type":41,"value":1181},"        \"\"\"Return not-yet-implemented message.\"\"\"\n",{"type":36,"tag":197,"props":1183,"children":1184},{"class":199,"line":775},[1185],{"type":36,"tag":197,"props":1186,"children":1187},{},[1188],{"type":41,"value":1189},"        return ToolResult(\n",{"type":36,"tag":197,"props":1191,"children":1192},{"class":199,"line":783},[1193],{"type":36,"tag":197,"props":1194,"children":1195},{},[1196],{"type":41,"value":1197},"            success=False,\n",{"type":36,"tag":197,"props":1199,"children":1200},{"class":199,"line":792},[1201],{"type":36,"tag":197,"props":1202,"children":1203},{},[1204],{"type":41,"value":1205},"            output=(\n",{"type":36,"tag":197,"props":1207,"children":1208},{"class":199,"line":801},[1209],{"type":36,"tag":197,"props":1210,"children":1211},{},[1212],{"type":41,"value":1213},"                \"Tool not yet implemented. Phase 2 will add full functionality. \"\n",{"type":36,"tag":197,"props":1215,"children":1216},{"class":199,"line":810},[1217],{"type":36,"tag":197,"props":1218,"children":1219},{},[1220],{"type":41,"value":1221},"                \"Use the shell scripts in the bundle for now.\"\n",{"type":36,"tag":197,"props":1223,"children":1224},{"class":199,"line":819},[1225],{"type":36,"tag":197,"props":1226,"children":1227},{},[1228],{"type":41,"value":1229},"            ),\n",{"type":36,"tag":197,"props":1231,"children":1232},{"class":199,"line":828},[1233],{"type":36,"tag":197,"props":1234,"children":1235},{},[1236],{"type":41,"value":1237},"        )\n",{"type":36,"tag":197,"props":1239,"children":1240},{"class":199,"line":837},[1241],{"type":36,"tag":197,"props":1242,"children":1243},{"emptyLinePlaceholder":267},[1244],{"type":41,"value":270},{"type":36,"tag":197,"props":1246,"children":1247},{"class":199,"line":846},[1248],{"type":36,"tag":197,"props":1249,"children":1250},{"emptyLinePlaceholder":267},[1251],{"type":41,"value":270},{"type":36,"tag":197,"props":1253,"children":1254},{"class":199,"line":855},[1255],{"type":36,"tag":197,"props":1256,"children":1257},{},[1258],{"type":41,"value":789},{"type":36,"tag":197,"props":1260,"children":1261},{"class":199,"line":864},[1262],{"type":36,"tag":197,"props":1263,"children":1264},{},[1265],{"type":41,"value":1266},"    \"\"\"Mount placeholder tool — satisfies protocol compliance during Phase 1.\"\"\"\n",{"type":36,"tag":197,"props":1268,"children":1270},{"class":199,"line":1269},51,[1271],{"type":36,"tag":197,"props":1272,"children":1273},{},[1274],{"type":41,"value":1275},"    tool = MyToolPlaceholder()\n",{"type":36,"tag":197,"props":1277,"children":1279},{"class":199,"line":1278},52,[1280],{"type":36,"tag":197,"props":1281,"children":1282},{},[1283],{"type":41,"value":816},{"type":36,"tag":197,"props":1285,"children":1287},{"class":199,"line":1286},53,[1288],{"type":36,"tag":197,"props":1289,"children":1290},{},[1291],{"type":41,"value":1292},"    logger.info(\"tool-my-tool mounted: registered placeholder 'my_tool' (Phase 2 pending)\")\n",{"type":36,"tag":197,"props":1294,"children":1296},{"class":199,"line":1295},54,[1297],{"type":36,"tag":197,"props":1298,"children":1299},{},[1300],{"type":41,"value":834},{"type":36,"tag":197,"props":1302,"children":1304},{"class":199,"line":1303},55,[1305],{"type":36,"tag":197,"props":1306,"children":1307},{},[1308],{"type":41,"value":843},{"type":36,"tag":197,"props":1310,"children":1312},{"class":199,"line":1311},56,[1313],{"type":36,"tag":197,"props":1314,"children":1315},{},[1316],{"type":41,"value":852},{"type":36,"tag":197,"props":1318,"children":1320},{"class":199,"line":1319},57,[1321],{"type":36,"tag":197,"props":1322,"children":1323},{},[1324],{"type":41,"value":861},{"type":36,"tag":197,"props":1326,"children":1328},{"class":199,"line":1327},58,[1329],{"type":36,"tag":197,"props":1330,"children":1331},{},[1332],{"type":41,"value":870},{"type":36,"tag":51,"props":1334,"children":1335},{},[1336,1341,1343,1349,1351,1357,1358,1364,1366,1372,1374,1380],{"type":36,"tag":69,"props":1337,"children":1338},{},[1339],{"type":41,"value":1340},"A placeholder tool IS a real tool.",{"type":41,"value":1342}," It has ",{"type":36,"tag":57,"props":1344,"children":1346},{"className":1345},[],[1347],{"type":41,"value":1348},"name",{"type":41,"value":1350},", ",{"type":36,"tag":57,"props":1352,"children":1354},{"className":1353},[],[1355],{"type":41,"value":1356},"description",{"type":41,"value":1350},{"type":36,"tag":57,"props":1359,"children":1361},{"className":1360},[],[1362],{"type":41,"value":1363},"input_schema",{"type":41,"value":1365},", and ",{"type":36,"tag":57,"props":1367,"children":1369},{"className":1368},[],[1370],{"type":41,"value":1371},"execute()",{"type":41,"value":1373},". It registers with ",{"type":36,"tag":57,"props":1375,"children":1377},{"className":1376},[],[1378],{"type":41,"value":1379},"coordinator.mount()",{"type":41,"value":1381},". It just tells callers it's not implemented yet.",{"type":36,"tag":116,"props":1383,"children":1384},{},[],{"type":36,"tag":44,"props":1386,"children":1388},{"id":1387},"behavior-yaml-reference",[1389],{"type":41,"value":1390},"Behavior YAML Reference",{"type":36,"tag":51,"props":1392,"children":1393},{},[1394],{"type":41,"value":1395},"How the module is referenced in a behavior YAML:",{"type":36,"tag":126,"props":1397,"children":1401},{"className":1398,"code":1399,"language":1400,"meta":134,"style":134},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","tools:\n  - module: tool-{name}\n    source: git+https:\u002F\u002Fgithub.com\u002Forg\u002Frepo@main#subdirectory=modules\u002Ftool-{name}\n","yaml",[1402],{"type":36,"tag":57,"props":1403,"children":1404},{"__ignoreMap":134},[1405,1420,1443],{"type":36,"tag":197,"props":1406,"children":1407},{"class":199,"line":200},[1408,1414],{"type":36,"tag":197,"props":1409,"children":1411},{"style":1410},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[1412],{"type":41,"value":1413},"tools",{"type":36,"tag":197,"props":1415,"children":1417},{"style":1416},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[1418],{"type":41,"value":1419},":\n",{"type":36,"tag":197,"props":1421,"children":1422},{"class":199,"line":209},[1423,1428,1433,1437],{"type":36,"tag":197,"props":1424,"children":1425},{"style":1416},[1426],{"type":41,"value":1427},"  -",{"type":36,"tag":197,"props":1429,"children":1430},{"style":1410},[1431],{"type":41,"value":1432}," module",{"type":36,"tag":197,"props":1434,"children":1435},{"style":1416},[1436],{"type":41,"value":186},{"type":36,"tag":197,"props":1438,"children":1440},{"style":1439},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[1441],{"type":41,"value":1442}," tool-{name}\n",{"type":36,"tag":197,"props":1444,"children":1445},{"class":199,"line":218},[1446,1451,1455],{"type":36,"tag":197,"props":1447,"children":1448},{"style":1410},[1449],{"type":41,"value":1450},"    source",{"type":36,"tag":197,"props":1452,"children":1453},{"style":1416},[1454],{"type":41,"value":186},{"type":36,"tag":197,"props":1456,"children":1457},{"style":1439},[1458],{"type":41,"value":1459}," git+https:\u002F\u002Fgithub.com\u002Forg\u002Frepo@main#subdirectory=modules\u002Ftool-{name}\n",{"type":36,"tag":51,"props":1461,"children":1462},{},[1463],{"type":41,"value":1464},"For local development (relative path from bundle root):",{"type":36,"tag":126,"props":1466,"children":1468},{"className":1398,"code":1467,"language":1400,"meta":134,"style":134},"tools:\n  - module: tool-{name}\n    source: .\u002Fmodules\u002Ftool-{name}\n",[1469],{"type":36,"tag":57,"props":1470,"children":1471},{"__ignoreMap":134},[1472,1483,1502],{"type":36,"tag":197,"props":1473,"children":1474},{"class":199,"line":200},[1475,1479],{"type":36,"tag":197,"props":1476,"children":1477},{"style":1410},[1478],{"type":41,"value":1413},{"type":36,"tag":197,"props":1480,"children":1481},{"style":1416},[1482],{"type":41,"value":1419},{"type":36,"tag":197,"props":1484,"children":1485},{"class":199,"line":209},[1486,1490,1494,1498],{"type":36,"tag":197,"props":1487,"children":1488},{"style":1416},[1489],{"type":41,"value":1427},{"type":36,"tag":197,"props":1491,"children":1492},{"style":1410},[1493],{"type":41,"value":1432},{"type":36,"tag":197,"props":1495,"children":1496},{"style":1416},[1497],{"type":41,"value":186},{"type":36,"tag":197,"props":1499,"children":1500},{"style":1439},[1501],{"type":41,"value":1442},{"type":36,"tag":197,"props":1503,"children":1504},{"class":199,"line":218},[1505,1509,1513],{"type":36,"tag":197,"props":1506,"children":1507},{"style":1410},[1508],{"type":41,"value":1450},{"type":36,"tag":197,"props":1510,"children":1511},{"style":1416},[1512],{"type":41,"value":186},{"type":36,"tag":197,"props":1514,"children":1515},{"style":1439},[1516],{"type":41,"value":1517}," .\u002Fmodules\u002Ftool-{name}\n",{"type":36,"tag":116,"props":1519,"children":1520},{},[],{"type":36,"tag":44,"props":1522,"children":1524},{"id":1523},"writing-tests",[1525],{"type":41,"value":1526},"Writing Tests",{"type":36,"tag":51,"props":1528,"children":1529},{},[1530,1532,1537,1539,1544],{"type":41,"value":1531},"Test that ",{"type":36,"tag":57,"props":1533,"children":1535},{"className":1534},[],[1536],{"type":41,"value":62},{"type":41,"value":1538}," registers the tool — not that it returns ",{"type":36,"tag":57,"props":1540,"children":1542},{"className":1541},[],[1543],{"type":41,"value":95},{"type":41,"value":186},{"type":36,"tag":126,"props":1546,"children":1548},{"className":449,"code":1547,"language":451,"meta":134,"style":134},"import pytest\nfrom unittest.mock import AsyncMock, MagicMock\nfrom amplifier_module_tool_my_tool import mount\n\n\n@pytest.mark.asyncio\nasync def test_mount_registers_tool():\n    \"\"\"mount() must register a tool via coordinator.mount().\"\"\"\n    coordinator = MagicMock()\n    coordinator.mount = AsyncMock()\n\n    result = await mount(coordinator)\n\n    # Verify coordinator.mount was called (the Iron Law)\n    coordinator.mount.assert_called_once()\n    call_args = coordinator.mount.call_args\n    assert call_args[0][0] == \"tools\"  # first positional arg is \"tools\"\n\n    # Verify return value is metadata dict, not None\n    assert result is not None\n    assert \"name\" in result\n    assert \"provides\" in result\n\n\n@pytest.mark.asyncio\nasync def test_tool_has_required_properties():\n    \"\"\"Tool class must have name, description, input_schema, execute.\"\"\"\n    coordinator = MagicMock()\n    coordinator.mount = AsyncMock()\n\n    await mount(coordinator)\n\n    # Get the tool that was registered\n    tool = coordinator.mount.call_args[0][1]\n    assert isinstance(tool.name, str) and tool.name\n    assert isinstance(tool.description, str) and tool.description\n    assert isinstance(tool.input_schema, dict)\n    assert callable(tool.execute)\n",[1549],{"type":36,"tag":57,"props":1550,"children":1551},{"__ignoreMap":134},[1552,1560,1568,1576,1583,1590,1598,1606,1614,1622,1630,1637,1645,1652,1660,1668,1676,1684,1691,1699,1707,1715,1723,1730,1737,1744,1752,1760,1767,1774,1781,1789,1796,1804,1812,1820,1828,1836],{"type":36,"tag":197,"props":1553,"children":1554},{"class":199,"line":200},[1555],{"type":36,"tag":197,"props":1556,"children":1557},{},[1558],{"type":41,"value":1559},"import pytest\n",{"type":36,"tag":197,"props":1561,"children":1562},{"class":199,"line":209},[1563],{"type":36,"tag":197,"props":1564,"children":1565},{},[1566],{"type":41,"value":1567},"from unittest.mock import AsyncMock, MagicMock\n",{"type":36,"tag":197,"props":1569,"children":1570},{"class":199,"line":218},[1571],{"type":36,"tag":197,"props":1572,"children":1573},{},[1574],{"type":41,"value":1575},"from amplifier_module_tool_my_tool import mount\n",{"type":36,"tag":197,"props":1577,"children":1578},{"class":199,"line":227},[1579],{"type":36,"tag":197,"props":1580,"children":1581},{"emptyLinePlaceholder":267},[1582],{"type":41,"value":270},{"type":36,"tag":197,"props":1584,"children":1585},{"class":199,"line":236},[1586],{"type":36,"tag":197,"props":1587,"children":1588},{"emptyLinePlaceholder":267},[1589],{"type":41,"value":270},{"type":36,"tag":197,"props":1591,"children":1592},{"class":199,"line":245},[1593],{"type":36,"tag":197,"props":1594,"children":1595},{},[1596],{"type":41,"value":1597},"@pytest.mark.asyncio\n",{"type":36,"tag":197,"props":1599,"children":1600},{"class":199,"line":254},[1601],{"type":36,"tag":197,"props":1602,"children":1603},{},[1604],{"type":41,"value":1605},"async def test_mount_registers_tool():\n",{"type":36,"tag":197,"props":1607,"children":1608},{"class":199,"line":263},[1609],{"type":36,"tag":197,"props":1610,"children":1611},{},[1612],{"type":41,"value":1613},"    \"\"\"mount() must register a tool via coordinator.mount().\"\"\"\n",{"type":36,"tag":197,"props":1615,"children":1616},{"class":199,"line":273},[1617],{"type":36,"tag":197,"props":1618,"children":1619},{},[1620],{"type":41,"value":1621},"    coordinator = MagicMock()\n",{"type":36,"tag":197,"props":1623,"children":1624},{"class":199,"line":282},[1625],{"type":36,"tag":197,"props":1626,"children":1627},{},[1628],{"type":41,"value":1629},"    coordinator.mount = AsyncMock()\n",{"type":36,"tag":197,"props":1631,"children":1632},{"class":199,"line":291},[1633],{"type":36,"tag":197,"props":1634,"children":1635},{"emptyLinePlaceholder":267},[1636],{"type":41,"value":270},{"type":36,"tag":197,"props":1638,"children":1639},{"class":199,"line":299},[1640],{"type":36,"tag":197,"props":1641,"children":1642},{},[1643],{"type":41,"value":1644},"    result = await mount(coordinator)\n",{"type":36,"tag":197,"props":1646,"children":1647},{"class":199,"line":308},[1648],{"type":36,"tag":197,"props":1649,"children":1650},{"emptyLinePlaceholder":267},[1651],{"type":41,"value":270},{"type":36,"tag":197,"props":1653,"children":1654},{"class":199,"line":317},[1655],{"type":36,"tag":197,"props":1656,"children":1657},{},[1658],{"type":41,"value":1659},"    # Verify coordinator.mount was called (the Iron Law)\n",{"type":36,"tag":197,"props":1661,"children":1662},{"class":199,"line":326},[1663],{"type":36,"tag":197,"props":1664,"children":1665},{},[1666],{"type":41,"value":1667},"    coordinator.mount.assert_called_once()\n",{"type":36,"tag":197,"props":1669,"children":1670},{"class":199,"line":19},[1671],{"type":36,"tag":197,"props":1672,"children":1673},{},[1674],{"type":41,"value":1675},"    call_args = coordinator.mount.call_args\n",{"type":36,"tag":197,"props":1677,"children":1678},{"class":199,"line":23},[1679],{"type":36,"tag":197,"props":1680,"children":1681},{},[1682],{"type":41,"value":1683},"    assert call_args[0][0] == \"tools\"  # first positional arg is \"tools\"\n",{"type":36,"tag":197,"props":1685,"children":1686},{"class":199,"line":350},[1687],{"type":36,"tag":197,"props":1688,"children":1689},{"emptyLinePlaceholder":267},[1690],{"type":41,"value":270},{"type":36,"tag":197,"props":1692,"children":1693},{"class":199,"line":358},[1694],{"type":36,"tag":197,"props":1695,"children":1696},{},[1697],{"type":41,"value":1698},"    # Verify return value is metadata dict, not None\n",{"type":36,"tag":197,"props":1700,"children":1701},{"class":199,"line":367},[1702],{"type":36,"tag":197,"props":1703,"children":1704},{},[1705],{"type":41,"value":1706},"    assert result is not None\n",{"type":36,"tag":197,"props":1708,"children":1709},{"class":199,"line":376},[1710],{"type":36,"tag":197,"props":1711,"children":1712},{},[1713],{"type":41,"value":1714},"    assert \"name\" in result\n",{"type":36,"tag":197,"props":1716,"children":1717},{"class":199,"line":385},[1718],{"type":36,"tag":197,"props":1719,"children":1720},{},[1721],{"type":41,"value":1722},"    assert \"provides\" in result\n",{"type":36,"tag":197,"props":1724,"children":1725},{"class":199,"line":624},[1726],{"type":36,"tag":197,"props":1727,"children":1728},{"emptyLinePlaceholder":267},[1729],{"type":41,"value":270},{"type":36,"tag":197,"props":1731,"children":1732},{"class":199,"line":633},[1733],{"type":36,"tag":197,"props":1734,"children":1735},{"emptyLinePlaceholder":267},[1736],{"type":41,"value":270},{"type":36,"tag":197,"props":1738,"children":1739},{"class":199,"line":642},[1740],{"type":36,"tag":197,"props":1741,"children":1742},{},[1743],{"type":41,"value":1597},{"type":36,"tag":197,"props":1745,"children":1746},{"class":199,"line":651},[1747],{"type":36,"tag":197,"props":1748,"children":1749},{},[1750],{"type":41,"value":1751},"async def test_tool_has_required_properties():\n",{"type":36,"tag":197,"props":1753,"children":1754},{"class":199,"line":660},[1755],{"type":36,"tag":197,"props":1756,"children":1757},{},[1758],{"type":41,"value":1759},"    \"\"\"Tool class must have name, description, input_schema, execute.\"\"\"\n",{"type":36,"tag":197,"props":1761,"children":1762},{"class":199,"line":669},[1763],{"type":36,"tag":197,"props":1764,"children":1765},{},[1766],{"type":41,"value":1621},{"type":36,"tag":197,"props":1768,"children":1769},{"class":199,"line":678},[1770],{"type":36,"tag":197,"props":1771,"children":1772},{},[1773],{"type":41,"value":1629},{"type":36,"tag":197,"props":1775,"children":1776},{"class":199,"line":687},[1777],{"type":36,"tag":197,"props":1778,"children":1779},{"emptyLinePlaceholder":267},[1780],{"type":41,"value":270},{"type":36,"tag":197,"props":1782,"children":1783},{"class":199,"line":696},[1784],{"type":36,"tag":197,"props":1785,"children":1786},{},[1787],{"type":41,"value":1788},"    await mount(coordinator)\n",{"type":36,"tag":197,"props":1790,"children":1791},{"class":199,"line":705},[1792],{"type":36,"tag":197,"props":1793,"children":1794},{"emptyLinePlaceholder":267},[1795],{"type":41,"value":270},{"type":36,"tag":197,"props":1797,"children":1798},{"class":199,"line":714},[1799],{"type":36,"tag":197,"props":1800,"children":1801},{},[1802],{"type":41,"value":1803},"    # Get the tool that was registered\n",{"type":36,"tag":197,"props":1805,"children":1806},{"class":199,"line":723},[1807],{"type":36,"tag":197,"props":1808,"children":1809},{},[1810],{"type":41,"value":1811},"    tool = coordinator.mount.call_args[0][1]\n",{"type":36,"tag":197,"props":1813,"children":1814},{"class":199,"line":731},[1815],{"type":36,"tag":197,"props":1816,"children":1817},{},[1818],{"type":41,"value":1819},"    assert isinstance(tool.name, str) and tool.name\n",{"type":36,"tag":197,"props":1821,"children":1822},{"class":199,"line":740},[1823],{"type":36,"tag":197,"props":1824,"children":1825},{},[1826],{"type":41,"value":1827},"    assert isinstance(tool.description, str) and tool.description\n",{"type":36,"tag":197,"props":1829,"children":1830},{"class":199,"line":749},[1831],{"type":36,"tag":197,"props":1832,"children":1833},{},[1834],{"type":41,"value":1835},"    assert isinstance(tool.input_schema, dict)\n",{"type":36,"tag":197,"props":1837,"children":1838},{"class":199,"line":758},[1839],{"type":36,"tag":197,"props":1840,"children":1841},{},[1842],{"type":41,"value":1843},"    assert callable(tool.execute)\n",{"type":36,"tag":116,"props":1845,"children":1846},{},[],{"type":36,"tag":44,"props":1848,"children":1850},{"id":1849},"anti-rationalization-table",[1851],{"type":41,"value":1852},"Anti-Rationalization Table",{"type":36,"tag":1854,"props":1855,"children":1856},"table",{},[1857,1876],{"type":36,"tag":1858,"props":1859,"children":1860},"thead",{},[1861],{"type":36,"tag":1862,"props":1863,"children":1864},"tr",{},[1865,1871],{"type":36,"tag":1866,"props":1867,"children":1868},"th",{},[1869],{"type":41,"value":1870},"Excuse",{"type":36,"tag":1866,"props":1872,"children":1873},{},[1874],{"type":41,"value":1875},"Reality",{"type":36,"tag":1877,"props":1878,"children":1879},"tbody",{},[1880,1894,1907,1927,1955,1968],{"type":36,"tag":1862,"props":1881,"children":1882},{},[1883,1889],{"type":36,"tag":1884,"props":1885,"children":1886},"td",{},[1887],{"type":41,"value":1888},"\"It's just a stub, it doesn't need to register anything\"",{"type":36,"tag":1884,"props":1890,"children":1891},{},[1892],{"type":41,"value":1893},"Protocol validation runs on every module load. No-op stubs fail immediately.",{"type":36,"tag":1862,"props":1895,"children":1896},{},[1897,1902],{"type":36,"tag":1884,"props":1898,"children":1899},{},[1900],{"type":41,"value":1901},"\"Phase 2 will fill it in\"",{"type":36,"tag":1884,"props":1903,"children":1904},{},[1905],{"type":41,"value":1906},"Phase 2 may be weeks away. The module loads NOW and fails NOW.",{"type":36,"tag":1862,"props":1908,"children":1909},{},[1910,1915],{"type":36,"tag":1884,"props":1911,"children":1912},{},[1913],{"type":41,"value":1914},"\"I'll add a TODO comment\"",{"type":36,"tag":1884,"props":1916,"children":1917},{},[1918,1920,1925],{"type":41,"value":1919},"The validator doesn't read comments. It checks ",{"type":36,"tag":57,"props":1921,"children":1923},{"className":1922},[],[1924],{"type":41,"value":1379},{"type":41,"value":1926}," calls.",{"type":36,"tag":1862,"props":1928,"children":1929},{},[1930,1943],{"type":36,"tag":1884,"props":1931,"children":1932},{},[1933,1935,1941],{"type":41,"value":1934},"\"The tests pass with ",{"type":36,"tag":57,"props":1936,"children":1938},{"className":1937},[],[1939],{"type":41,"value":1940},"result is None",{"type":41,"value":1942},"\"",{"type":36,"tag":1884,"props":1944,"children":1945},{},[1946,1948,1953],{"type":41,"value":1947},"Tests that assert ",{"type":36,"tag":57,"props":1949,"children":1951},{"className":1950},[],[1952],{"type":41,"value":1940},{"type":41,"value":1954}," are testing the bug, not the behavior.",{"type":36,"tag":1862,"props":1956,"children":1957},{},[1958,1963],{"type":36,"tag":1884,"props":1959,"children":1960},{},[1961],{"type":41,"value":1962},"\"The mount() signature is all that matters\"",{"type":36,"tag":1884,"props":1964,"children":1965},{},[1966],{"type":41,"value":1967},"The signature is necessary but not sufficient. Registration is also required.",{"type":36,"tag":1862,"props":1969,"children":1970},{},[1971,1976],{"type":36,"tag":1884,"props":1972,"children":1973},{},[1974],{"type":41,"value":1975},"\"It works locally without registering\"",{"type":36,"tag":1884,"props":1977,"children":1978},{},[1979],{"type":41,"value":1980},"It silently fails the protocol check. You won't see the error until an agent spawns.",{"type":36,"tag":116,"props":1982,"children":1983},{},[],{"type":36,"tag":44,"props":1985,"children":1987},{"id":1986},"red-flags-stop-and-use-the-placeholder-pattern",[1988],{"type":41,"value":1989},"Red Flags — STOP and Use the Placeholder Pattern",{"type":36,"tag":51,"props":1991,"children":1992},{},[1993],{"type":41,"value":1994},"If you find yourself thinking any of these, STOP:",{"type":36,"tag":1996,"props":1997,"children":1998},"ul",{},[1999,2011,2022,2047,2058],{"type":36,"tag":418,"props":2000,"children":2001},{},[2002,2004,2009],{"type":41,"value":2003},"\"mount() can just log and return None\" → ",{"type":36,"tag":69,"props":2005,"children":2006},{},[2007],{"type":41,"value":2008},"NO.",{"type":41,"value":2010}," It must register a tool.",{"type":36,"tag":418,"props":2012,"children":2013},{},[2014,2016,2020],{"type":41,"value":2015},"\"I'll skip the tool class since there's nothing to implement yet\" → ",{"type":36,"tag":69,"props":2017,"children":2018},{},[2019],{"type":41,"value":2008},{"type":41,"value":2021}," Create a placeholder class.",{"type":36,"tag":418,"props":2023,"children":2024},{},[2025,2027,2032,2034,2038,2040,2045],{"type":41,"value":2026},"\"The test should assert ",{"type":36,"tag":57,"props":2028,"children":2030},{"className":2029},[],[2031],{"type":41,"value":1940},{"type":41,"value":2033},"\" → ",{"type":36,"tag":69,"props":2035,"children":2036},{},[2037],{"type":41,"value":2008},{"type":41,"value":2039}," The test should verify ",{"type":36,"tag":57,"props":2041,"children":2043},{"className":2042},[],[2044],{"type":41,"value":1379},{"type":41,"value":2046}," was called.",{"type":36,"tag":418,"props":2048,"children":2049},{},[2050,2052,2056],{"type":41,"value":2051},"\"It's a stub so it should be empty\" → ",{"type":36,"tag":69,"props":2053,"children":2054},{},[2055],{"type":41,"value":2008},{"type":41,"value":2057}," Use the placeholder pattern above.",{"type":36,"tag":418,"props":2059,"children":2060},{},[2061,2063,2067],{"type":41,"value":2062},"\"Phase 2 will make it real, for now I'll just return None\" → ",{"type":36,"tag":69,"props":2064,"children":2065},{},[2066],{"type":41,"value":2008},{"type":41,"value":2068}," Phase 2 doesn't exist yet. The module loads today.",{"type":36,"tag":116,"props":2070,"children":2071},{},[],{"type":36,"tag":44,"props":2073,"children":2075},{"id":2074},"validation-checklist",[2076],{"type":41,"value":2077},"Validation Checklist",{"type":36,"tag":51,"props":2079,"children":2080},{},[2081],{"type":41,"value":2082},"After creating a module, verify it will pass protocol compliance:",{"type":36,"tag":1996,"props":2084,"children":2087},{"className":2085},[2086],"contains-task-list",[2088,2114,2130,2144,2160,2176,2198,2221],{"type":36,"tag":418,"props":2089,"children":2092},{"className":2090},[2091],"task-list-item",[2093,2098,2100,2105,2107,2112],{"type":36,"tag":2094,"props":2095,"children":2097},"input",{"disabled":267,"type":2096},"checkbox",[],{"type":41,"value":2099}," Does ",{"type":36,"tag":57,"props":2101,"children":2103},{"className":2102},[],[2104],{"type":41,"value":62},{"type":41,"value":2106}," call ",{"type":36,"tag":57,"props":2108,"children":2110},{"className":2109},[],[2111],{"type":41,"value":433},{"type":41,"value":2113},"?",{"type":36,"tag":418,"props":2115,"children":2117},{"className":2116},[2091],[2118,2121,2123,2128],{"type":36,"tag":2094,"props":2119,"children":2120},{"disabled":267,"type":2096},[],{"type":41,"value":2122}," Does the tool class have a ",{"type":36,"tag":57,"props":2124,"children":2126},{"className":2125},[],[2127],{"type":41,"value":1348},{"type":41,"value":2129}," property (string)?",{"type":36,"tag":418,"props":2131,"children":2133},{"className":2132},[2091],[2134,2137,2138,2143],{"type":36,"tag":2094,"props":2135,"children":2136},{"disabled":267,"type":2096},[],{"type":41,"value":2122},{"type":36,"tag":57,"props":2139,"children":2141},{"className":2140},[],[2142],{"type":41,"value":1356},{"type":41,"value":2129},{"type":36,"tag":418,"props":2145,"children":2147},{"className":2146},[2091],[2148,2151,2153,2158],{"type":36,"tag":2094,"props":2149,"children":2150},{"disabled":267,"type":2096},[],{"type":41,"value":2152}," Does the tool class have an ",{"type":36,"tag":57,"props":2154,"children":2156},{"className":2155},[],[2157],{"type":41,"value":1363},{"type":41,"value":2159}," property (dict)?",{"type":36,"tag":418,"props":2161,"children":2163},{"className":2162},[2091],[2164,2167,2169,2174],{"type":36,"tag":2094,"props":2165,"children":2166},{"disabled":267,"type":2096},[],{"type":41,"value":2168}," Does the tool class have a callable ",{"type":36,"tag":57,"props":2170,"children":2172},{"className":2171},[],[2173],{"type":41,"value":1371},{"type":41,"value":2175}," method?",{"type":36,"tag":418,"props":2177,"children":2179},{"className":2178},[2091],[2180,2183,2184,2189,2191,2196],{"type":36,"tag":2094,"props":2181,"children":2182},{"disabled":267,"type":2096},[],{"type":41,"value":2099},{"type":36,"tag":57,"props":2185,"children":2187},{"className":2186},[],[2188],{"type":41,"value":62},{"type":41,"value":2190}," return a metadata dict (not ",{"type":36,"tag":57,"props":2192,"children":2194},{"className":2193},[],[2195],{"type":41,"value":95},{"type":41,"value":2197},")?",{"type":36,"tag":418,"props":2199,"children":2201},{"className":2200},[2091],[2202,2205,2206,2211,2213,2219],{"type":36,"tag":2094,"props":2203,"children":2204},{"disabled":267,"type":2096},[],{"type":41,"value":2099},{"type":36,"tag":57,"props":2207,"children":2209},{"className":2208},[],[2210],{"type":41,"value":177},{"type":41,"value":2212}," declare the ",{"type":36,"tag":57,"props":2214,"children":2216},{"className":2215},[],[2217],{"type":41,"value":2218},"amplifier.modules",{"type":41,"value":2220}," entry point?",{"type":36,"tag":418,"props":2222,"children":2224},{"className":2223},[2091],[2225,2228,2230,2235,2237,2242],{"type":36,"tag":2094,"props":2226,"children":2227},{"disabled":267,"type":2096},[],{"type":41,"value":2229}," Do tests verify ",{"type":36,"tag":57,"props":2231,"children":2233},{"className":2232},[],[2234],{"type":41,"value":1379},{"type":41,"value":2236}," was called (not that result is ",{"type":36,"tag":57,"props":2238,"children":2240},{"className":2239},[],[2241],{"type":41,"value":95},{"type":41,"value":2197},{"type":36,"tag":51,"props":2244,"children":2245},{},[2246],{"type":41,"value":2247},"All eight boxes must be checked before committing.",{"type":36,"tag":116,"props":2249,"children":2250},{},[],{"type":36,"tag":44,"props":2252,"children":2254},{"id":2253},"quick-reference",[2255],{"type":41,"value":2256},"Quick Reference",{"type":36,"tag":51,"props":2258,"children":2259},{},[2260],{"type":36,"tag":69,"props":2261,"children":2262},{},[2263,2265,2271],{"type":41,"value":2264},"Minimum viable module ",{"type":36,"tag":57,"props":2266,"children":2268},{"className":2267},[],[2269],{"type":41,"value":2270},"__init__.py",{"type":41,"value":186},{"type":36,"tag":126,"props":2273,"children":2275},{"className":449,"code":2274,"language":451,"meta":134,"style":134},"from amplifier_core import ToolResult\n\nclass MyTool:\n    name = \"my_tool\"\n    description = \"What this tool does\"\n    input_schema = {\"type\": \"object\", \"properties\": {}}\n\n    async def execute(self, input_data):\n        return ToolResult(success=False, output=\"Not yet implemented\")\n\nasync def mount(coordinator, config=None):\n    tool = MyTool()\n    await coordinator.mount(\"tools\", tool, name=tool.name)\n    return {\"name\": \"tool-my-tool\", \"version\": \"0.1.0\", \"provides\": [\"my_tool\"]}\n",[2276],{"type":36,"tag":57,"props":2277,"children":2278},{"__ignoreMap":134},[2279,2286,2293,2300,2308,2316,2324,2331,2339,2347,2354,2362,2369,2376],{"type":36,"tag":197,"props":2280,"children":2281},{"class":199,"line":200},[2282],{"type":36,"tag":197,"props":2283,"children":2284},{},[2285],{"type":41,"value":501},{"type":36,"tag":197,"props":2287,"children":2288},{"class":199,"line":209},[2289],{"type":36,"tag":197,"props":2290,"children":2291},{"emptyLinePlaceholder":267},[2292],{"type":41,"value":270},{"type":36,"tag":197,"props":2294,"children":2295},{"class":199,"line":218},[2296],{"type":36,"tag":197,"props":2297,"children":2298},{},[2299],{"type":41,"value":538},{"type":36,"tag":197,"props":2301,"children":2302},{"class":199,"line":227},[2303],{"type":36,"tag":197,"props":2304,"children":2305},{},[2306],{"type":41,"value":2307},"    name = \"my_tool\"\n",{"type":36,"tag":197,"props":2309,"children":2310},{"class":199,"line":236},[2311],{"type":36,"tag":197,"props":2312,"children":2313},{},[2314],{"type":41,"value":2315},"    description = \"What this tool does\"\n",{"type":36,"tag":197,"props":2317,"children":2318},{"class":199,"line":245},[2319],{"type":36,"tag":197,"props":2320,"children":2321},{},[2322],{"type":41,"value":2323},"    input_schema = {\"type\": \"object\", \"properties\": {}}\n",{"type":36,"tag":197,"props":2325,"children":2326},{"class":199,"line":254},[2327],{"type":36,"tag":197,"props":2328,"children":2329},{"emptyLinePlaceholder":267},[2330],{"type":41,"value":270},{"type":36,"tag":197,"props":2332,"children":2333},{"class":199,"line":263},[2334],{"type":36,"tag":197,"props":2335,"children":2336},{},[2337],{"type":41,"value":2338},"    async def execute(self, input_data):\n",{"type":36,"tag":197,"props":2340,"children":2341},{"class":199,"line":273},[2342],{"type":36,"tag":197,"props":2343,"children":2344},{},[2345],{"type":41,"value":2346},"        return ToolResult(success=False, output=\"Not yet implemented\")\n",{"type":36,"tag":197,"props":2348,"children":2349},{"class":199,"line":282},[2350],{"type":36,"tag":197,"props":2351,"children":2352},{"emptyLinePlaceholder":267},[2353],{"type":41,"value":270},{"type":36,"tag":197,"props":2355,"children":2356},{"class":199,"line":291},[2357],{"type":36,"tag":197,"props":2358,"children":2359},{},[2360],{"type":41,"value":2361},"async def mount(coordinator, config=None):\n",{"type":36,"tag":197,"props":2363,"children":2364},{"class":199,"line":299},[2365],{"type":36,"tag":197,"props":2366,"children":2367},{},[2368],{"type":41,"value":807},{"type":36,"tag":197,"props":2370,"children":2371},{"class":199,"line":308},[2372],{"type":36,"tag":197,"props":2373,"children":2374},{},[2375],{"type":41,"value":816},{"type":36,"tag":197,"props":2377,"children":2378},{"class":199,"line":317},[2379],{"type":36,"tag":197,"props":2380,"children":2381},{},[2382],{"type":41,"value":2383},"    return {\"name\": \"tool-my-tool\", \"version\": \"0.1.0\", \"provides\": [\"my_tool\"]}\n",{"type":36,"tag":51,"props":2385,"children":2386},{},[2387],{"type":41,"value":2388},"This is the minimum. Every line is required. Nothing can be removed.",{"type":36,"tag":2390,"props":2391,"children":2392},"style",{},[2393],{"type":41,"value":2394},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2396,"total":209},[2397,2410],{"slug":2398,"name":2398,"fn":2399,"description":2400,"org":2401,"tags":2402,"stars":19,"repoUrl":20,"updatedAt":2409},"bundle-to-dot","generate bundle.dot repo documentation","Convention for the v3 bundle documentation system: a single bundle.dot + bundle.png per repo, generated by bundle_repo_dot(). Use when generating, validating, or interpreting bundle documentation files. Covers 7-cluster DOT structure, token cost model, color conventions, external reference distinction, freshness tracking via source_hash, generation recipes, and the lifecycle model.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2403,2406],{"name":2404,"slug":2405,"type":15},"Code Analysis","code-analysis",{"name":2407,"slug":2408,"type":15},"Documentation","documentation","2026-04-06T18:37:45.463328",{"slug":4,"name":4,"fn":5,"description":6,"org":2411,"tags":2412,"stars":19,"repoUrl":20,"updatedAt":21},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2413,2414],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"items":2416,"total":2610},[2417,2439,2460,2481,2496,2512,2523,2536,2551,2566,2585,2598],{"slug":2418,"name":2418,"fn":2419,"description":2420,"org":2421,"tags":2422,"stars":2436,"repoUrl":2437,"updatedAt":2438},"rushstack-best-practices","manage Rush monorepos with best practices","Provides best practices and guidance for working with Rush monorepos. Use when the user is working in a Rush-based repository, asks about Rush commands (install, update, build, rebuild), needs help with project selection, dependency management, build caching, subspace configuration, or troubleshooting Rush-specific issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2423,2426,2429,2430,2433],{"name":2424,"slug":2425,"type":15},"Engineering","engineering",{"name":2427,"slug":2428,"type":15},"Local Development","local-development",{"name":9,"slug":8,"type":15},{"name":2431,"slug":2432,"type":15},"Project Management","project-management",{"name":2434,"slug":2435,"type":15},"Rush","rush",6484,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frushstack","2026-04-06T18:34:44.965032",{"slug":2440,"name":2440,"fn":2441,"description":2442,"org":2443,"tags":2444,"stars":2457,"repoUrl":2458,"updatedAt":2459},"azure-ai-agents-persistent-dotnet","build AI agents with Azure .NET SDK","Azure AI Agents Persistent SDK for .NET. Low-level SDK for creating and managing AI agents with threads, messages, runs, and tools. Use for agent CRUD, conversation threads, streaming responses, function calling, file search, and code interpreter. Triggers: \"PersistentAgentsClient\", \"persistent agents\", \"agent threads\", \"agent runs\", \"streaming agents\", \"function calling agents .NET\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2445,2448,2451,2454],{"name":2446,"slug":2447,"type":15},".NET","net",{"name":2449,"slug":2450,"type":15},"Agents","agents",{"name":2452,"slug":2453,"type":15},"Azure","azure",{"name":2455,"slug":2456,"type":15},"LLM","llm",2804,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills","2026-07-03T16:32:10.297433",{"slug":2461,"name":2461,"fn":2462,"description":2463,"org":2464,"tags":2465,"stars":2457,"repoUrl":2458,"updatedAt":2480},"azure-ai-anomalydetector-java","build anomaly detection applications with Java","Build anomaly detection applications with Azure AI Anomaly Detector SDK for Java. Use when implementing univariate\u002Fmultivariate anomaly detection, time-series analysis, or AI-powered monitoring.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2466,2469,2470,2473,2476,2477],{"name":2467,"slug":2468,"type":15},"Analytics","analytics",{"name":2452,"slug":2453,"type":15},{"name":2471,"slug":2472,"type":15},"Data Analysis","data-analysis",{"name":2474,"slug":2475,"type":15},"Java","java",{"name":9,"slug":8,"type":15},{"name":2478,"slug":2479,"type":15},"Monitoring","monitoring","2026-05-13T06:14:16.261754",{"slug":2482,"name":2482,"fn":2483,"description":2484,"org":2485,"tags":2486,"stars":2457,"repoUrl":2458,"updatedAt":2495},"azure-ai-contentsafety-java","build content moderation applications with Azure AI","Build content moderation applications with Azure AI Content Safety SDK for Java. Use when implementing text\u002Fimage analysis, blocklist management, or harm detection for hate, violence, sexual content, and self-harm.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2487,2490,2491,2492],{"name":2488,"slug":2489,"type":15},"AI Infrastructure","ai-infrastructure",{"name":2452,"slug":2453,"type":15},{"name":2474,"slug":2475,"type":15},{"name":2493,"slug":2494,"type":15},"Security","security","2026-07-07T06:53:31.293235",{"slug":2497,"name":2497,"fn":2498,"description":2499,"org":2500,"tags":2501,"stars":2457,"repoUrl":2458,"updatedAt":2511},"azure-ai-contentsafety-py","detect harmful content with Azure AI Content Safety","Azure AI Content Safety SDK for Python. Use for detecting harmful content in text and images with multi-severity classification.\nTriggers: \"azure-ai-contentsafety\", \"ContentSafetyClient\", \"content moderation\", \"harmful content\", \"text analysis\", \"image analysis\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2502,2503,2506,2507,2508,2510],{"name":2452,"slug":2453,"type":15},{"name":2504,"slug":2505,"type":15},"Compliance","compliance",{"name":2455,"slug":2456,"type":15},{"name":9,"slug":8,"type":15},{"name":2509,"slug":451,"type":15},"Python",{"name":2493,"slug":2494,"type":15},"2026-07-18T05:14:23.017504",{"slug":2513,"name":2513,"fn":2514,"description":2515,"org":2516,"tags":2517,"stars":2457,"repoUrl":2458,"updatedAt":2522},"azure-ai-language-conversations-py","implement conversational language understanding with Python","Implement Conversational Language Understanding (CLU) using the azure-ai-language-conversations Python SDK. Use when working with ConversationAnalysisClient to analyze conversation intent and entities, building NLP features, or integrating language understanding into applications.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2518,2519,2520,2521],{"name":2467,"slug":2468,"type":15},{"name":2452,"slug":2453,"type":15},{"name":2455,"slug":2456,"type":15},{"name":2509,"slug":451,"type":15},"2026-07-31T05:54:29.068751",{"slug":2524,"name":2524,"fn":2525,"description":2526,"org":2527,"tags":2528,"stars":2457,"repoUrl":2458,"updatedAt":2535},"azure-ai-translation-text-py","translate text using Azure AI services","Azure AI Text Translation SDK for real-time text translation, transliteration, language detection, and dictionary lookup. Use for translating text content in applications.\nTriggers: \"text translation\", \"translator\", \"translate text\", \"transliterate\", \"TextTranslationClient\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2529,2532,2533,2534],{"name":2530,"slug":2531,"type":15},"API Development","api-development",{"name":2452,"slug":2453,"type":15},{"name":9,"slug":8,"type":15},{"name":2509,"slug":451,"type":15},"2026-07-18T05:14:16.988376",{"slug":2537,"name":2537,"fn":2538,"description":2539,"org":2540,"tags":2541,"stars":2457,"repoUrl":2458,"updatedAt":2550},"azure-ai-vision-imageanalysis-py","analyze images with Azure AI Vision","Azure AI Vision Image Analysis SDK for captions, tags, objects, OCR, people detection, and smart cropping. Use for computer vision and image understanding tasks.\nTriggers: \"image analysis\", \"computer vision\", \"OCR\", \"object detection\", \"ImageAnalysisClient\", \"image caption\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2542,2543,2546,2549],{"name":2452,"slug":2453,"type":15},{"name":2544,"slug":2545,"type":15},"Computer Vision","computer-vision",{"name":2547,"slug":2548,"type":15},"Images","images",{"name":2509,"slug":451,"type":15},"2026-07-18T05:14:18.007737",{"slug":2552,"name":2552,"fn":2553,"description":2554,"org":2555,"tags":2556,"stars":2457,"repoUrl":2458,"updatedAt":2565},"azure-appconfiguration-java","manage configuration with Azure App Configuration","Azure App Configuration SDK for Java. Centralized application configuration management with key-value settings, feature flags, and snapshots.\nTriggers: \"ConfigurationClient java\", \"app configuration java\", \"feature flag java\", \"configuration setting java\", \"azure config java\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2557,2558,2561,2564],{"name":2452,"slug":2453,"type":15},{"name":2559,"slug":2560,"type":15},"Configuration","configuration",{"name":2562,"slug":2563,"type":15},"Feature Flags","feature-flags",{"name":2474,"slug":2475,"type":15},"2026-07-03T16:32:01.278468",{"slug":2567,"name":2567,"fn":2568,"description":2569,"org":2570,"tags":2571,"stars":2457,"repoUrl":2458,"updatedAt":2584},"azure-cosmos-rust","build applications with Azure Cosmos DB","Azure Cosmos DB library for Rust (NoSQL API). Document CRUD, containers, and globally distributed data.\nTriggers: \"cosmos db rust\", \"CosmosClient rust\", \"document crud rust\", \"NoSQL rust\", \"partition key rust\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2572,2575,2578,2581],{"name":2573,"slug":2574,"type":15},"Cosmos DB","cosmos-db",{"name":2576,"slug":2577,"type":15},"Database","database",{"name":2579,"slug":2580,"type":15},"NoSQL","nosql",{"name":2582,"slug":2583,"type":15},"Rust","rust","2026-07-31T05:54:27.021432",{"slug":2586,"name":2586,"fn":2568,"description":2587,"org":2588,"tags":2589,"stars":2457,"repoUrl":2458,"updatedAt":2597},"azure-cosmos-ts","Azure Cosmos DB JavaScript\u002FTypeScript SDK (@azure\u002Fcosmos) for data plane operations. Use for CRUD operations on documents, queries, bulk operations, and container management. Triggers: \"Cosmos DB\", \"@azure\u002Fcosmos\", \"CosmosClient\", \"document CRUD\", \"NoSQL queries\", \"bulk operations\", \"partition key\", \"container.items\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2590,2591,2592,2593,2594],{"name":2573,"slug":2574,"type":15},{"name":2576,"slug":2577,"type":15},{"name":9,"slug":8,"type":15},{"name":2579,"slug":2580,"type":15},{"name":2595,"slug":2596,"type":15},"TypeScript","typescript","2026-07-03T16:31:19.368382",{"slug":2599,"name":2599,"fn":2600,"description":2601,"org":2602,"tags":2603,"stars":2457,"repoUrl":2458,"updatedAt":2609},"azure-data-tables-java","build table storage applications with Java","Build table storage applications with Azure Tables SDK for Java. Use when working with Azure Table Storage or Cosmos DB Table API for NoSQL key-value data, schemaless storage, or structured data at scale.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2604,2605,2606,2607,2608],{"name":2452,"slug":2453,"type":15},{"name":2573,"slug":2574,"type":15},{"name":2576,"slug":2577,"type":15},{"name":2474,"slug":2475,"type":15},{"name":2579,"slug":2580,"type":15},"2026-05-13T06:14:17.582229",267]