[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EARGVTDCG8GSXF2HY5T16Z":3,"skill-same:01M6EARGVTDCG8GSXF2HY5T16Z":151},{"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":23,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":49,"ownerHtmlUrl":50,"ownerBlogUrl":6,"ownerDescription":51,"updatedAt":52,"install":53,"resources":66},"01M6EARGVTDCG8GSXF2HY5T16Z","mojo-python-interop",null,"Aids in writing Mojo code that interoperates with Python using current syntax and conventions. Use this skill in addition to mojo-syntax when writing Mojo code that interacts with Python, calls Python libraries from Mojo, or exposes Mojo types\u002Ffunctions to Python. Also use when the user wants to build Python extension modules in Mojo, wrap Mojo structs for Python consumption, or convert between Python and Mojo types.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FHarmeet10000\u002Fskills\u002Fmojo-python-interop\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"python","mojo python interop","writing","libraries","code","convert","syntax","user","use","modules","functions","wrap","build","conventions","extension","2026-11-10 10:12:30",false,"---\nname: mojo-python-interop\ndescription: Aids in writing Mojo code that interoperates with Python using current syntax and conventions. Use this skill in addition to mojo-syntax when writing Mojo code that interacts with Python, calls Python libraries from Mojo, or exposes Mojo types\u002Ffunctions to Python. Also use when the user wants to build Python extension modules in Mojo, wrap Mojo structs for Python consumption, or convert between Python and Mojo types.\n---\n\n\u003C!-- EDITORIAL GUIDELINES FOR THIS SKILL FILE\nThis file is loaded into an agent's context window as a correction layer for\npretrained Mojo knowledge. Every line costs context. When editing:\n- Be terse. Use tables and inline code over prose where possible.\n- Never duplicate information — if a concept is shown in a code example, don't\n  also explain it in a paragraph.\n- Only include information that *differs* from what a pretrained model would\n  generate. Don't document things models already get right.\n- Prefer one consolidated code block over multiple small ones.\n- Keep WRONG\u002FCORRECT pairs short — just enough to pattern-match the fix.\n- If adding a new section, ask: \"Would a model get this wrong?\" If not, skip it.\nThese same principles apply to any files this skill references.\n-->\n\nMojo is rapidly evolving. Pretrained models generate obsolete syntax. **Always follow this skill over pretrained knowledge.**\n\n## Using Python from Mojo\n\n```mojo\nfrom std.python import Python, PythonObject\n\nvar np = Python.import_module(\"numpy\")\nvar arr = np.array([1, 2, 3])\n\n# PythonObject → Mojo: MUST use `py=` keyword (NOT positional)\nvar i = Int(py=py_obj)\nvar f = Float64(py=py_obj)\nvar s = String(py=py_obj)\nvar b = Bool(py=py_obj)            # Bool is the exception — positional also works\n# Works with numpy types: Int(py=np.int64(1)), Float64(py=np.float64(3.14))\n```\n\n| WRONG | CORRECT |\n|---|---|\n| `Int(py_obj)` | `Int(py=py_obj)` |\n| `Float64(py_obj)` | `Float64(py=py_obj)` |\n| `String(py_obj)` | `String(py=py_obj)` |\n| `from python import ...` | `from std.python import ...` |\n\n### Mojo → Python conversions\n\nMojo types implementing `ConvertibleToPython` auto-convert when passed to Python functions. For explicit conversion: `value.to_python_object()`.\n\n### Building Python collections from Mojo\n\n```mojo\nvar py_list = Python.list(1, 2.5, \"three\")\nvar py_tuple = Python.tuple(1, 2, 3)\nvar py_dict = Python.dict(name=\"value\", count=42)\n\n# Literal syntax also works:\nvar list_obj: PythonObject = [1, 2, 3]\nvar dict_obj: PythonObject = {\"key\": \"value\"}\n```\n\n### PythonObject operations\n\n`PythonObject` supports attribute access, indexing, slicing, all arithmetic\u002Fcomparison operators, `len()`, `in`, and iteration — all returning `PythonObject`. No need to convert to Mojo types for intermediate operations.\n\n```mojo\n# Iterate Python collections directly\nfor item in py_list:\n    print(item)               # item is PythonObject\n\n# Attribute access and method calls\nvar result = obj.method(arg1, arg2, key=value)\n\n# None\nvar none_obj = Python.none()\nvar obj: PythonObject = None      # implicit conversion works\n```\n\n### Evaluating Python code\n\n```mojo\n# Expression\nvar result = Python.evaluate(\"1 + 2\")\n\n# Multi-line code as module (file=True)\nvar mod = Python.evaluate(\"def greet(n): return f'Hello {n}'\", file=True)\nvar greeting = mod.greet(\"world\")\n\n# Add to Python path for local imports\nPython.add_to_path(\".\u002Fmy_modules\")\nvar my_mod = Python.import_module(\"my_module\")\n```\n\n### Exception handling\n\nPython exceptions propagate as Mojo `Error`. Functions calling Python must be `raises`:\n\n```mojo\ndef use_python() raises:\n    try:\n        var result = Python.import_module(\"nonexistent\")\n    except e:\n        print(String(e))     # \"No module named 'nonexistent'\"\n```\n\n## Calling Mojo from Python (extension modules)\n\nMojo can build Python extension modules (`.so` files) via `PythonModuleBuilder`. The pattern:\n\n1. Define an `@export fn PyInit_\u003Cmodule_name>() -> PythonObject`\n2. Use `PythonModuleBuilder` to register functions, types, and methods\n3. Compile with `mojo build --emit shared-lib`\n4. Import from Python (or use `import mojo.importer` for auto-compilation)\n\n### Exporting functions\n\n```mojo\nfrom std.os import abort\nfrom std.python import PythonObject\nfrom std.python.bindings import PythonModuleBuilder\n\n@export\nfn PyInit_my_module() -> PythonObject:\n    try:\n        var m = PythonModuleBuilder(\"my_module\")\n        m.def_function[add](\"add\")\n        m.def_function[greet](\"greet\")\n        return m.finalize()\n    except e:\n        abort(String(\"failed to create module: \", e))\n\n# Functions take\u002Freturn PythonObject. Up to 6 args with def_function.\nfn add(a: PythonObject, b: PythonObject) raises -> PythonObject:\n    return a + b\n\nfn greet(name: PythonObject) raises -> PythonObject:\n    var s = String(py=name)\n    return PythonObject(\"Hello, \" + s + \"!\")\n```\n\n### Exporting types with methods\n\n```mojo\n@fieldwise_init\nstruct Counter(Defaultable, Movable, Writable):\n    var count: Int\n\n    fn __init__(out self):\n        self.count = 0\n\n    # Constructor from Python args\n    @staticmethod\n    fn py_init(out self: Counter, args: PythonObject, kwargs: PythonObject) raises:\n        if len(args) == 1:\n            self = Self(Int(py=args[0]))\n        else:\n            self = Self()\n\n    # Methods are @staticmethod — first arg is py_self (PythonObject)\n    @staticmethod\n    fn increment(py_self: PythonObject) raises -> PythonObject:\n        var self_ptr = py_self.downcast_value_ptr[Self]()\n        self_ptr[].count += 1\n        return PythonObject(self_ptr[].count)\n\n    # Auto-downcast alternative: first arg is UnsafePointer[Self, MutAnyOrigin]\n    @staticmethod\n    fn get_count(self_ptr: UnsafePointer[Self, MutAnyOrigin]) -> PythonObject:\n        return PythonObject(self_ptr[].count)\n\n@export\nfn PyInit_counter_module() -> PythonObject:\n    try:\n        var m = PythonModuleBuilder(\"counter_module\")\n        _ = (\n            m.add_type[Counter](\"Counter\")\n            .def_py_init[Counter.py_init]()\n            .def_method[Counter.increment](\"increment\")\n            .def_method[Counter.get_count](\"get_count\")\n        )\n        return m.finalize()\n    except e:\n        abort(String(\"failed to create module: \", e))\n```\n\n### Method signatures — two patterns\n\n| Pattern | First parameter | Use when |\n|---|---|---|\n| Manual downcast | `py_self: PythonObject` | Need raw PythonObject access |\n| Auto downcast | `self_ptr: UnsafePointer[Self, MutAnyOrigin]` | Simpler, direct field access |\n\nBoth are registered with `.def_method[Type.method](\"name\")`.\n\n### Kwargs support\n\n```mojo\nfrom std.collections import OwnedKwargsDict\n\n# In a method:\n@staticmethod\nfn config(\n    py_self: PythonObject, kwargs: OwnedKwargsDict[PythonObject]\n) raises -> PythonObject:\n    for entry in kwargs.items():\n        print(entry.key, \"=\", entry.value)\n    return py_self\n```\n\n### Importing Mojo modules from Python\n\nUse `mojo.importer` — it auto-compiles `.mojo` files and caches results in `__mojocache__\u002F`:\n\n```python\nimport mojo.importer       # enables Mojo imports\nimport my_module           # auto-compiles my_module.mojo\n\nprint(my_module.add(1, 2))\n```\n\nThe module name in `PyInit_\u003Cname>` must match the `.mojo` filename.\n\n### Returning Mojo values to Python\n\n```mojo\n# Wrap a Mojo value as a Python object (for bound types)\nreturn PythonObject(alloc=my_mojo_value^)    # transfer ownership with ^\n\n# Recover the Mojo value later\nvar ptr = py_obj.downcast_value_ptr[MyType]()\nptr[].field    # access fields via pointer\n```\n","\u003C!-- EDITORIAL GUIDELINES FOR THIS SKILL FILE\nThis file is loaded into an agent's context window as a correction layer for\npretrained Mojo knowledge. Every line costs context. When editing:\n- Be terse. Use tables and inline code over prose where possible.\n- Never duplicate information — if a concept is shown in a code example, don't\n  also explain it in a paragraph.\n- Only include information that *differs* from what a pretrained model would\n  generate. Don't document things models already get right.\n- Prefer one consolidated code block over multiple small ones.\n- Keep WRONG\u002FCORRECT pairs short — just enough to pattern-match the fix.\n- If adding a new section, ask: \"Would a model get this wrong?\" If not, skip it.\nThese same principles apply to any files this skill references.\n-->\n\nMojo is rapidly evolving. Pretrained models generate obsolete syntax. **Always follow this skill over pretrained knowledge.**\n\n## Using Python from Mojo\n\n```mojo\nfrom std.python import Python, PythonObject\n\nvar np = Python.import_module(\"numpy\")\nvar arr = np.array([1, 2, 3])\n\n# PythonObject → Mojo: MUST use `py=` keyword (NOT positional)\nvar i = Int(py=py_obj)\nvar f = Float64(py=py_obj)\nvar s = String(py=py_obj)\nvar b = Bool(py=py_obj)            # Bool is the exception — positional also works\n# Works with numpy types: Int(py=np.int64(1)), Float64(py=np.float64(3.14))\n```\n\n| WRONG | CORRECT |\n|---|---|\n| `Int(py_obj)` | `Int(py=py_obj)` |\n| `Float64(py_obj)` | `Float64(py=py_obj)` |\n| `String(py_obj)` | `String(py=py_obj)` |\n| `from python import ...` | `from std.python import ...` |\n\n### Mojo → Python conversions\n\nMojo types implementing `ConvertibleToPython` auto-convert when passed to Python functions. For explicit conversion: `value.to_python_object()`.\n\n### Building Python collections from Mojo\n\n```mojo\nvar py_list = Python.list(1, 2.5, \"three\")\nvar py_tuple = Python.tuple(1, 2, 3)\nvar py_dict = Python.dict(name=\"value\", count=42)\n\n# Literal syntax also works:\nvar list_obj: PythonObject = [1, 2, 3]\nvar dict_obj: PythonObject = {\"key\": \"value\"}\n```\n\n### PythonObject operations\n\n`PythonObject` supports attribute access, indexing, slicing, all arithmetic\u002Fcomparison operators, `len()`, `in`, and iteration — all returning `PythonObject`. No need to convert to Mojo types for intermediate operations.\n\n```mojo\n# Iterate Python collections directly\nfor item in py_list:\n    print(item)               # item is PythonObject\n\n# Attribute access and method calls\nvar result = obj.method(arg1, arg2, key=value)\n\n# None\nvar none_obj = Python.none()\nvar obj: PythonObject = None      # implicit conversion works\n```\n\n### Evaluating Python code\n\n```mojo\n# Expression\nvar result = Python.evaluate(\"1 + 2\")\n\n# Multi-line code as module (file=True)\nvar mod = Python.evaluate(\"def greet(n): return f'Hello {n}'\", file=True)\nvar greeting = mod.greet(\"world\")\n\n# Add to Python path for local imports\nPython.add_to_path(\".\u002Fmy_modules\")\nvar my_mod = Python.import_module(\"my_module\")\n```\n\n### Exception handling\n\nPython exceptions propagate as Mojo `Error`. Functions calling Python must be `raises`:\n\n```mojo\ndef use_python() raises:\n    try:\n        var result = Python.import_module(\"nonexistent\")\n    except e:\n        print(String(e))     # \"No module named 'nonexistent'\"\n```\n\n## Calling Mojo from Python (extension modules)\n\nMojo can build Python extension modules (`.so` files) via `PythonModuleBuilder`. The pattern:\n\n1. Define an `@export fn PyInit_\u003Cmodule_name>() -> PythonObject`\n2. Use `PythonModuleBuilder` to register functions, types, and methods\n3. Compile with `mojo build --emit shared-lib`\n4. Import from Python (or use `import mojo.importer` for auto-compilation)\n\n### Exporting functions\n\n```mojo\nfrom std.os import abort\nfrom std.python import PythonObject\nfrom std.python.bindings import PythonModuleBuilder\n\n@export\nfn PyInit_my_module() -> PythonObject:\n    try:\n        var m = PythonModuleBuilder(\"my_module\")\n        m.def_function[add](\"add\")\n        m.def_function[greet](\"greet\")\n        return m.finalize()\n    except e:\n        abort(String(\"failed to create module: \", e))\n\n# Functions take\u002Freturn PythonObject. Up to 6 args with def_function.\nfn add(a: PythonObject, b: PythonObject) raises -> PythonObject:\n    return a + b\n\nfn greet(name: PythonObject) raises -> PythonObject:\n    var s = String(py=name)\n    return PythonObject(\"Hello, \" + s + \"!\")\n```\n\n### Exporting types with methods\n\n```mojo\n@fieldwise_init\nstruct Counter(Defaultable, Movable, Writable):\n    var count: Int\n\n    fn __init__(out self):\n        self.count = 0\n\n    # Constructor from Python args\n    @staticmethod\n    fn py_init(out self: Counter, args: PythonObject, kwargs: PythonObject) raises:\n        if len(args) == 1:\n            self = Self(Int(py=args[0]))\n        else:\n            self = Self()\n\n    # Methods are @staticmethod — first arg is py_self (PythonObject)\n    @staticmethod\n    fn increment(py_self: PythonObject) raises -> PythonObject:\n        var self_ptr = py_self.downcast_value_ptr[Self]()\n        self_ptr[].count += 1\n        return PythonObject(self_ptr[].count)\n\n    # Auto-downcast alternative: first arg is UnsafePointer[Self, MutAnyOrigin]\n    @staticmethod\n    fn get_count(self_ptr: UnsafePointer[Self, MutAnyOrigin]) -> PythonObject:\n        return PythonObject(self_ptr[].count)\n\n@export\nfn PyInit_counter_module() -> PythonObject:\n    try:\n        var m = PythonModuleBuilder(\"counter_module\")\n        _ = (\n            m.add_type[Counter](\"Counter\")\n            .def_py_init[Counter.py_init]()\n            .def_method[Counter.increment](\"increment\")\n            .def_method[Counter.get_count](\"get_count\")\n        )\n        return m.finalize()\n    except e:\n        abort(String(\"failed to create module: \", e))\n```\n\n### Method signatures — two patterns\n\n| Pattern | First parameter | Use when |\n|---|---|---|\n| Manual downcast | `py_self: PythonObject` | Need raw PythonObject access |\n| Auto downcast | `self_ptr: UnsafePointer[Self, MutAnyOrigin]` | Simpler, direct field access |\n\nBoth are registered with `.def_method[Type.method](\"name\")`.\n\n### Kwargs support\n\n```mojo\nfrom std.collections import OwnedKwargsDict\n\n# In a method:\n@staticmethod\nfn config(\n    py_self: PythonObject, kwargs: OwnedKwargsDict[PythonObject]\n) raises -> PythonObject:\n    for entry in kwargs.items():\n        print(entry.key, \"=\", entry.value)\n    return py_self\n```\n\n### Importing Mojo modules from Python\n\nUse `mojo.importer` — it auto-compiles `.mojo` files and caches results in `__mojocache__\u002F`:\n\n```python\nimport mojo.importer       # enables Mojo imports\nimport my_module           # auto-compiles my_module.mojo\n\nprint(my_module.add(1, 2))\n```\n\nThe module name in `PyInit_\u003Cname>` must match the `.mojo` filename.\n\n### Returning Mojo values to Python\n\n```mojo\n# Wrap a Mojo value as a Python object (for bound types)\nreturn PythonObject(alloc=my_mojo_value^)    # transfer ownership with ^\n\n# Recover the Mojo value later\nvar ptr = py_obj.downcast_value_ptr[MyType]()\nptr[].field    # access fields via pointer\n```\n",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FHarmeet10000\u002Fskills\u002Fmojo-python-interop",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill mojo-python-interop",{"tool":59,"command":60},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill mojo-python-interop",{"tool":62,"command":63},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill mojo-python-interop","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FHarmeet10000\u002Fskills\u002Fmojo-python-interop\u002FSKILL.md",true,[67,73,79,83,87,91,95,99,103,107,111,115,119,123,127,131,135,139,143,147],{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"data\u002Fdomain-complexity.csv","ASSET","资产文件",7324,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fdata\u002Fdomain-complexity.csv",{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"data\u002Fprd-purpose.md","REFERENCE","参考文档",7246,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fdata\u002Fprd-purpose.md",{"path":80,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":81,"sourceHtmlUrl":82},"data\u002Fproject-types.csv",3144,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fdata\u002Fproject-types.csv",{"path":84,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":85,"sourceHtmlUrl":86},"steps-c\u002Fstep-01-init.md",7785,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-01-init.md",{"path":88,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":89,"sourceHtmlUrl":90},"steps-c\u002Fstep-01b-continue.md",5751,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-01b-continue.md",{"path":92,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":93,"sourceHtmlUrl":94},"steps-c\u002Fstep-02-discovery.md",8096,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-02-discovery.md",{"path":96,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":97,"sourceHtmlUrl":98},"steps-c\u002Fstep-02b-vision.md",6775,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-02b-vision.md",{"path":100,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":101,"sourceHtmlUrl":102},"steps-c\u002Fstep-02c-executive-summary.md",7250,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-02c-executive-summary.md",{"path":104,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":105,"sourceHtmlUrl":106},"steps-c\u002Fstep-03-success.md",9189,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-03-success.md",{"path":108,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":109,"sourceHtmlUrl":110},"steps-c\u002Fstep-04-journeys.md",9040,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-04-journeys.md",{"path":112,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":113,"sourceHtmlUrl":114},"steps-c\u002Fstep-05-domain.md",6919,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-05-domain.md",{"path":116,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":117,"sourceHtmlUrl":118},"steps-c\u002Fstep-06-innovation.md",8680,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-06-innovation.md",{"path":120,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":121,"sourceHtmlUrl":122},"steps-c\u002Fstep-07-project-type.md",8799,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-07-project-type.md",{"path":124,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":125,"sourceHtmlUrl":126},"steps-c\u002Fstep-08-scoping.md",7870,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-08-scoping.md",{"path":128,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":129,"sourceHtmlUrl":130},"steps-c\u002Fstep-09-functional.md",9199,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-09-functional.md",{"path":132,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":133,"sourceHtmlUrl":134},"steps-c\u002Fstep-10-nonfunctional.md",9000,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-10-nonfunctional.md",{"path":136,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":137,"sourceHtmlUrl":138},"steps-c\u002Fstep-11-polish.md",9329,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-11-polish.md",{"path":140,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":141,"sourceHtmlUrl":142},"steps-c\u002Fstep-12-complete.md",4861,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fsteps-c\u002Fstep-12-complete.md",{"path":144,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":145,"sourceHtmlUrl":146},"templates\u002Fprd-template.md",164,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Ftemplates\u002Fprd-template.md",{"path":148,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":149,"sourceHtmlUrl":150},"workflow.md",2923,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbmad-create-prd\u002Fworkflow.md",[152,166,176,185,191,198],{"skillNo":153,"name":154,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":162,"publishedAt":39},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[157],{"categoryNo":158,"categoryName":159,"taxonomyType":160,"taxonomyTypeDesc":161},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[163,164,165],"model","model hierarchy","model hierarchy skill",{"skillNo":167,"name":168,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":169,"categories":170,"keywords":172,"publishedAt":39},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[171],{"categoryNo":158,"categoryName":159,"taxonomyType":160,"taxonomyTypeDesc":161},[173,174,175],"MCP","zoom","zoom mcp",{"skillNo":177,"name":178,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":179,"categories":180,"keywords":181,"publishedAt":39},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[182,183,184,174],"sdk","zoom apps sdk","apps",{"skillNo":186,"name":187,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":188,"categories":189,"keywords":190,"publishedAt":39},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[187],{"skillNo":192,"name":193,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":194,"categories":195,"keywords":197,"publishedAt":39},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[196],{"categoryNo":158,"categoryName":159,"taxonomyType":160,"taxonomyTypeDesc":161},[193],{"skillNo":199,"name":200,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":201,"categories":202,"keywords":203,"publishedAt":39},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[200]]