[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69A6N72A29XSWBW14N7HDTS":3,"skill-same:01M69A6N72A29XSWBW14N7HDTS":80},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":22,"linkOnly":23,"markdownContent":24,"markdownBody":25,"frontMatter":26,"refName":31,"commitSha":32,"skillDirectory":33,"forksCount":34,"repositoryHtmlUrl":35,"repositoryHomepageUrl":6,"ownerHtmlUrl":36,"ownerBlogUrl":37,"ownerDescription":38,"updatedAt":39,"install":40,"resources":53},"01M69A6N72A29XSWBW14N7HDTS","python-standards",null,"Python coding standards for Amplifier including type hints, async patterns, error handling, and formatting. Use when writing Python code for Amplifier modules.","microsoft\u002Famplifier-module-tool-skills","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M69A6DNFJARAYQ4ZST0XE362",8,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-module-tool-skills\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Fpython-standards\u002FSKILL.md",[],[19,20,21],"python","python standards","writing","2026-11-10 10:12:30",false,"---\nname: python-standards\ndescription: Python coding standards for Amplifier including type hints, async patterns, error handling, and formatting. Use when writing Python code for Amplifier modules.\nversion: 1.0.0\nlicense: MIT\nmetadata:\n  category: development\n  complexity: low\n---\n\n# Python Coding Standards\n\n## Type Hints\n\n**ALL functions must have complete type hints:**\n\n```python\nfrom typing import Any\n\nasync def process_data(items: list[str], config: dict[str, Any]) -> dict[str, Any]:\n    \"\"\"Process data items with configuration.\"\"\"\n    results = {}\n    for item in items:\n        results[item] = await transform(item, config)\n    return results\n```\n\n**Include type hints for self:**\n\n```python\nclass MyClass:\n    def __init__(self: \"MyClass\", name: str) -> None:\n        self.name = name\n\n    async def process(self: \"MyClass\") -> str:\n        return f\"Processing {self.name}\"\n```\n\n## Async Patterns\n\n**All I\u002FO operations must be async:**\n\n```python\n# Good\nasync def read_file(path: Path) -> str:\n    content = path.read_text()  # For now, sync is OK\n    return content\n\n# Better (when using async libraries)\nasync def read_file(path: Path) -> str:\n    async with aiofiles.open(path) as f:\n        return await f.read()\n```\n\n**Use asyncio.gather for parallel operations:**\n\n```python\nasync def process_files(files: list[Path]) -> list[dict]:\n    tasks = [process_file(f) for f in files]\n    return await asyncio.gather(*tasks)\n```\n\n## Error Handling\n\n**Return errors, don't raise:**\n\n```python\nfrom amplifier_core import ToolResult\n\nasync def execute(self: \"MyTool\", input: dict[str, Any]) -> ToolResult:\n    \"\"\"Execute tool operation.\"\"\"\n    try:\n        result = await self._process(input)\n        return ToolResult(success=True, output=result)\n    except ValueError as e:\n        logger.error(f\"Validation error: {e}\")\n        return ToolResult(success=False, error={\"message\": str(e)})\n```\n\n**Provide clear error messages:**\n\n```python\n# Good\nreturn ToolResult(\n    success=False,\n    error={\"message\": f\"File not found: {path}\"}\n)\n\n# Bad\nreturn ToolResult(\n    success=False,\n    error={\"message\": \"Error\"}\n)\n```\n\n## Formatting\n\n**Line length: 120 characters**\n\n**Import organization:**\n\n```python\n# Standard library\nimport asyncio\nimport logging\nfrom pathlib import Path\nfrom typing import Any\n\n# Third-party\nimport yaml\nfrom pydantic import BaseModel\n\n# Local\u002FAmplifier\nfrom amplifier_core import ModuleCoordinator, ToolResult\n```\n\n**Files must end with newline** - Add blank line at EOF\n\n**Use ruff for formatting:**\n\n```bash\nuv run ruff format .\nuv run ruff check . --fix\n```\n\n## Dependencies\n\n**Use uv for dependency management:**\n\n```bash\n# Add dependency\ncd amplifier-module-tool-mytool\nuv add package-name\n\n# Add dev dependency\nuv add --dev pytest ruff pyright\n```\n\n**Never manually edit pyproject.toml dependencies** - Use `uv add`\n\n## Testing\n\n**Test behavior at protocol level:**\n\n```python\nimport pytest\nfrom amplifier_core.testing import TestCoordinator\n\n@pytest.mark.asyncio\nasync def test_tool_basic():\n    \"\"\"Test basic tool functionality.\"\"\"\n    coordinator = TestCoordinator()\n\n    # Mount module\n    await mount(coordinator, {\"timeout\": 10})\n\n    # Get and test\n    tool = coordinator.get(\"tools\", \"my-tool\")\n    result = await tool.execute({\"param\": \"value\"})\n\n    assert result.success\n    assert \"expected\" in result.output\n```\n\n**Test pyramid: 60% unit, 30% integration, 10% end-to-end**\n\n## Common Pitfalls\n\n### Don't use blocking I\u002FO\n\n```python\n# Bad\ncontent = requests.get(url).text\n\n# Good\nasync with aiohttp.ClientSession() as session:\n    async with session.get(url) as response:\n        content = await response.text()\n```\n\n### Don't modify module internals from outside\n\n```python\n# Bad\ntool._internal_state = new_value\n\n# Good\nawait tool.execute({\"operation\": \"update\", \"value\": new_value})\n```\n\n### Don't put logic in mount()\n\n```python\n# Bad\nasync def mount(coordinator, config):\n    tool = MyTool()\n    await tool.initialize_database()  # Heavy logic\n    await coordinator.mount(\"tools\", tool)\n\n# Good\nasync def mount(coordinator, config):\n    tool = MyTool(config)  # Light initialization only\n    await coordinator.mount(\"tools\", tool)\n    # Heavy logic happens in execute(), not mount()\n```\n\n## Remember\n\n- Run `make check` before committing\n- Keep modules focused and simple\n- Document public interfaces\n- Test at the protocol level\n","# Python Coding Standards\n\n## Type Hints\n\n**ALL functions must have complete type hints:**\n\n```python\nfrom typing import Any\n\nasync def process_data(items: list[str], config: dict[str, Any]) -> dict[str, Any]:\n    \"\"\"Process data items with configuration.\"\"\"\n    results = {}\n    for item in items:\n        results[item] = await transform(item, config)\n    return results\n```\n\n**Include type hints for self:**\n\n```python\nclass MyClass:\n    def __init__(self: \"MyClass\", name: str) -> None:\n        self.name = name\n\n    async def process(self: \"MyClass\") -> str:\n        return f\"Processing {self.name}\"\n```\n\n## Async Patterns\n\n**All I\u002FO operations must be async:**\n\n```python\n# Good\nasync def read_file(path: Path) -> str:\n    content = path.read_text()  # For now, sync is OK\n    return content\n\n# Better (when using async libraries)\nasync def read_file(path: Path) -> str:\n    async with aiofiles.open(path) as f:\n        return await f.read()\n```\n\n**Use asyncio.gather for parallel operations:**\n\n```python\nasync def process_files(files: list[Path]) -> list[dict]:\n    tasks = [process_file(f) for f in files]\n    return await asyncio.gather(*tasks)\n```\n\n## Error Handling\n\n**Return errors, don't raise:**\n\n```python\nfrom amplifier_core import ToolResult\n\nasync def execute(self: \"MyTool\", input: dict[str, Any]) -> ToolResult:\n    \"\"\"Execute tool operation.\"\"\"\n    try:\n        result = await self._process(input)\n        return ToolResult(success=True, output=result)\n    except ValueError as e:\n        logger.error(f\"Validation error: {e}\")\n        return ToolResult(success=False, error={\"message\": str(e)})\n```\n\n**Provide clear error messages:**\n\n```python\n# Good\nreturn ToolResult(\n    success=False,\n    error={\"message\": f\"File not found: {path}\"}\n)\n\n# Bad\nreturn ToolResult(\n    success=False,\n    error={\"message\": \"Error\"}\n)\n```\n\n## Formatting\n\n**Line length: 120 characters**\n\n**Import organization:**\n\n```python\n# Standard library\nimport asyncio\nimport logging\nfrom pathlib import Path\nfrom typing import Any\n\n# Third-party\nimport yaml\nfrom pydantic import BaseModel\n\n# Local\u002FAmplifier\nfrom amplifier_core import ModuleCoordinator, ToolResult\n```\n\n**Files must end with newline** - Add blank line at EOF\n\n**Use ruff for formatting:**\n\n```bash\nuv run ruff format .\nuv run ruff check . --fix\n```\n\n## Dependencies\n\n**Use uv for dependency management:**\n\n```bash\n# Add dependency\ncd amplifier-module-tool-mytool\nuv add package-name\n\n# Add dev dependency\nuv add --dev pytest ruff pyright\n```\n\n**Never manually edit pyproject.toml dependencies** - Use `uv add`\n\n## Testing\n\n**Test behavior at protocol level:**\n\n```python\nimport pytest\nfrom amplifier_core.testing import TestCoordinator\n\n@pytest.mark.asyncio\nasync def test_tool_basic():\n    \"\"\"Test basic tool functionality.\"\"\"\n    coordinator = TestCoordinator()\n\n    # Mount module\n    await mount(coordinator, {\"timeout\": 10})\n\n    # Get and test\n    tool = coordinator.get(\"tools\", \"my-tool\")\n    result = await tool.execute({\"param\": \"value\"})\n\n    assert result.success\n    assert \"expected\" in result.output\n```\n\n**Test pyramid: 60% unit, 30% integration, 10% end-to-end**\n\n## Common Pitfalls\n\n### Don't use blocking I\u002FO\n\n```python\n# Bad\ncontent = requests.get(url).text\n\n# Good\nasync with aiohttp.ClientSession() as session:\n    async with session.get(url) as response:\n        content = await response.text()\n```\n\n### Don't modify module internals from outside\n\n```python\n# Bad\ntool._internal_state = new_value\n\n# Good\nawait tool.execute({\"operation\": \"update\", \"value\": new_value})\n```\n\n### Don't put logic in mount()\n\n```python\n# Bad\nasync def mount(coordinator, config):\n    tool = MyTool()\n    await tool.initialize_database()  # Heavy logic\n    await coordinator.mount(\"tools\", tool)\n\n# Good\nasync def mount(coordinator, config):\n    tool = MyTool(config)  # Light initialization only\n    await coordinator.mount(\"tools\", tool)\n    # Heavy logic happens in execute(), not mount()\n```\n\n## Remember\n\n- Run `make check` before committing\n- Keep modules focused and simple\n- Document public interfaces\n- Test at the protocol level\n",{"name":5,"license":15,"version":27,"metadata":28,"description":7},"1.0.0",{"category":29,"complexity":30},"development","low","main","8a097b3766c1bb81d60350774f768a6fe59e106f","tests\u002Ffixtures\u002Fskills\u002Fpython-standards",9,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-module-tool-skills","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-07-14 02:27:44",{"source":8,"skillName":5,"commands":41,"prompt":51,"zipAvailable":52},[42,45,48],{"tool":43,"command":44},"npx","npx skills add microsoft\u002Famplifier-module-tool-skills --skill python-standards",{"tool":46,"command":47},"bunx","bunx skills add microsoft\u002Famplifier-module-tool-skills --skill python-standards",{"tool":49,"command":50},"pnpm","pnpm dlx skills add microsoft\u002Famplifier-module-tool-skills --skill python-standards","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-module-tool-skills\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Fpython-standards\u002FSKILL.md",true,[54,60,64,68,72,76],{"path":55,"resourceType":56,"resourceTypeDesc":57,"sizeBytes":58,"sourceHtmlUrl":59},"references\u002Fattribution.md","REFERENCE","参考文档",5115,"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcloud\u002Fapplication-integration-troubleshooting\u002Freferences\u002Fattribution.md",{"path":61,"resourceType":56,"resourceTypeDesc":57,"sizeBytes":62,"sourceHtmlUrl":63},"references\u002Fcommon-errors.md",17106,"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcloud\u002Fapplication-integration-troubleshooting\u002Freferences\u002Fcommon-errors.md",{"path":65,"resourceType":56,"resourceTypeDesc":57,"sizeBytes":66,"sourceHtmlUrl":67},"references\u002Fconnectors-health.md",10619,"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcloud\u002Fapplication-integration-troubleshooting\u002Freferences\u002Fconnectors-health.md",{"path":69,"resourceType":56,"resourceTypeDesc":57,"sizeBytes":70,"sourceHtmlUrl":71},"references\u002Fexecution-states.md",14724,"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcloud\u002Fapplication-integration-troubleshooting\u002Freferences\u002Fexecution-states.md",{"path":73,"resourceType":56,"resourceTypeDesc":57,"sizeBytes":74,"sourceHtmlUrl":75},"references\u002Flogging-and-monitoring.md",10098,"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcloud\u002Fapplication-integration-troubleshooting\u002Freferences\u002Flogging-and-monitoring.md",{"path":77,"resourceType":56,"resourceTypeDesc":57,"sizeBytes":78,"sourceHtmlUrl":79},"references\u002Fsuspensions.md",10815,"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fcloud\u002Fapplication-integration-troubleshooting\u002Freferences\u002Fsuspensions.md",[81,96,112],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":92,"publishedAt":22},"01M69A6KR5B3H31XWGAYJRB437","module-development","Guide for creating new Amplifier modules including protocol implementation, entry points, mount functions, and testing patterns. Use when creating new modules or understanding module architecture.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-module-tool-skills\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Fmodule-development\u002FSKILL.md",[87],{"categoryNo":88,"categoryName":89,"taxonomyType":90,"taxonomyTypeDesc":91},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[93,94,95],"module development","testing","architecture",{"skillNo":97,"name":98,"nameZh":6,"description":99,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":105,"publishedAt":22},"01M69A6HZHJ1F0YSBA17XR800M","amplifier-philosophy","Amplifier design philosophy using Linux kernel metaphor. Covers mechanism vs policy, module architecture, event-driven design, and kernel principles. Use when designing new modules or making architectural decisions.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-module-tool-skills\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Famplifier-philosophy\u002FSKILL.md",[102],{"categoryNo":103,"categoryName":104,"taxonomyType":90,"taxonomyTypeDesc":91},"01JBSEEDCAT000000000000015","视觉设计",[106,107,108,109,110,111,95],"amplifier philosophy","design","kernel","linux","policy","design philosophy",{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":121,"publishedAt":22},"01M69A6G81NXDMGRDEW1YH46QW","skill-with-hooks","Example skill demonstrating embedded hooks for validation and logging","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-module-tool-skills\u002Fblob\u002Fmain\u002Fexamples\u002Fskill-with-hooks\u002FSKILL.md",[118],{"categoryNo":119,"categoryName":120,"taxonomyType":90,"taxonomyTypeDesc":91},"01JBSEEDCAT000000000000023","Skill与智能体开发",[122,123,124],"skill with hooks","validate","example skill"]