[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F53D5M3P6MZWGXHEMAS9ST":3,"skill-same:01M6F53D5M3P6MZWGXHEMAS9ST":69},{"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":28,"publishedAt":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":49,"repositoryHtmlUrl":50,"repositoryHomepageUrl":51,"ownerHtmlUrl":52,"ownerBlogUrl":6,"ownerDescription":53,"updatedAt":54,"install":55,"resources":68},"01M6F53D5M3P6MZWGXHEMAS9ST","typespec-api-operations",null,"Add GET, POST, PATCH, and DELETE operations to a TypeSpec API plugin with proper routing, parameters, and adaptive cards","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\u002Fgithub\u002Fawesome-copilot\u002Ftypespec-api-operations\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40],"typespec","typespec api operations","api","operations","plugin","delete","routing","patch","get","add","post","with","2026-11-10 10:12:30",false,"---\nname: typespec-api-operations\ndescription: 'Add GET, POST, PATCH, and DELETE operations to a TypeSpec API plugin with proper routing, parameters, and adaptive cards'\n---\n\n# Add TypeSpec API Operations\n\nAdd RESTful operations to an existing TypeSpec API plugin for Microsoft 365 Copilot.\n\n## Adding GET Operations\n\n### Simple GET - List All Items\n```typescript\n\u002F**\n * List all items.\n *\u002F\n@route(\"\u002Fitems\")\n@get op listItems(): Item[];\n```\n\n### GET with Query Parameter - Filter Results\n```typescript\n\u002F**\n * List items filtered by criteria.\n * @param userId Optional user ID to filter items\n *\u002F\n@route(\"\u002Fitems\")\n@get op listItems(@query userId?: integer): Item[];\n```\n\n### GET with Path Parameter - Get Single Item\n```typescript\n\u002F**\n * Get a specific item by ID.\n * @param id The ID of the item to retrieve\n *\u002F\n@route(\"\u002Fitems\u002F{id}\")\n@get op getItem(@path id: integer): Item;\n```\n\n### GET with Adaptive Card\n```typescript\n\u002F**\n * List items with adaptive card visualization.\n *\u002F\n@route(\"\u002Fitems\")\n@card(#{\n  dataPath: \"$\",\n  title: \"$.title\",\n  file: \"item-card.json\"\n})\n@get op listItems(): Item[];\n```\n\n**Create the Adaptive Card** (`appPackage\u002Fitem-card.json`):\n```json\n{\n  \"type\": \"AdaptiveCard\",\n  \"$schema\": \"http:\u002F\u002Fadaptivecards.io\u002Fschemas\u002Fadaptive-card.json\",\n  \"version\": \"1.5\",\n  \"body\": [\n    {\n      \"type\": \"Container\",\n      \"$data\": \"${$root}\",\n      \"items\": [\n        {\n          \"type\": \"TextBlock\",\n          \"text\": \"**${if(title, title, 'N\u002FA')}**\",\n          \"wrap\": true\n        },\n        {\n          \"type\": \"TextBlock\",\n          \"text\": \"${if(description, description, 'N\u002FA')}\",\n          \"wrap\": true\n        }\n      ]\n    }\n  ],\n  \"actions\": [\n    {\n      \"type\": \"Action.OpenUrl\",\n      \"title\": \"View Details\",\n      \"url\": \"https:\u002F\u002Fexample.com\u002Fitems\u002F${id}\"\n    }\n  ]\n}\n```\n\n## Adding POST Operations\n\n### Simple POST - Create Item\n```typescript\n\u002F**\n * Create a new item.\n * @param item The item to create\n *\u002F\n@route(\"\u002Fitems\")\n@post op createItem(@body item: CreateItemRequest): Item;\n\nmodel CreateItemRequest {\n  title: string;\n  description?: string;\n  userId: integer;\n}\n```\n\n### POST with Confirmation\n```typescript\n\u002F**\n * Create a new item with confirmation.\n *\u002F\n@route(\"\u002Fitems\")\n@post\n@capabilities(#{\n  confirmation: #{\n    type: \"AdaptiveCard\",\n    title: \"Create Item\",\n    body: \"\"\"\n    Are you sure you want to create this item?\n      * **Title**: {{ function.parameters.item.title }}\n      * **User ID**: {{ function.parameters.item.userId }}\n    \"\"\"\n  }\n})\nop createItem(@body item: CreateItemRequest): Item;\n```\n\n## Adding PATCH Operations\n\n### Simple PATCH - Update Item\n```typescript\n\u002F**\n * Update an existing item.\n * @param id The ID of the item to update\n * @param item The updated item data\n *\u002F\n@route(\"\u002Fitems\u002F{id}\")\n@patch op updateItem(\n  @path id: integer,\n  @body item: UpdateItemRequest\n): Item;\n\nmodel UpdateItemRequest {\n  title?: string;\n  description?: string;\n  status?: \"active\" | \"completed\" | \"archived\";\n}\n```\n\n### PATCH with Confirmation\n```typescript\n\u002F**\n * Update an item with confirmation.\n *\u002F\n@route(\"\u002Fitems\u002F{id}\")\n@patch\n@capabilities(#{\n  confirmation: #{\n    type: \"AdaptiveCard\",\n    title: \"Update Item\",\n    body: \"\"\"\n    Updating item #{{ function.parameters.id }}:\n      * **Title**: {{ function.parameters.item.title }}\n      * **Status**: {{ function.parameters.item.status }}\n    \"\"\"\n  }\n})\nop updateItem(\n  @path id: integer,\n  @body item: UpdateItemRequest\n): Item;\n```\n\n## Adding DELETE Operations\n\n### Simple DELETE\n```typescript\n\u002F**\n * Delete an item.\n * @param id The ID of the item to delete\n *\u002F\n@route(\"\u002Fitems\u002F{id}\")\n@delete op deleteItem(@path id: integer): void;\n```\n\n### DELETE with Confirmation\n```typescript\n\u002F**\n * Delete an item with confirmation.\n *\u002F\n@route(\"\u002Fitems\u002F{id}\")\n@delete\n@capabilities(#{\n  confirmation: #{\n    type: \"AdaptiveCard\",\n    title: \"Delete Item\",\n    body: \"\"\"\n    ⚠️ Are you sure you want to delete item #{{ function.parameters.id }}?\n    This action cannot be undone.\n    \"\"\"\n  }\n})\nop deleteItem(@path id: integer): void;\n```\n\n## Complete CRUD Example\n\n### Define the Service and Models\n```typescript\n@service\n@server(\"https:\u002F\u002Fapi.example.com\")\n@actions(#{\n  nameForHuman: \"Items API\",\n  descriptionForHuman: \"Manage items\",\n  descriptionForModel: \"Read, create, update, and delete items\"\n})\nnamespace ItemsAPI {\n  \n  \u002F\u002F Models\n  model Item {\n    @visibility(Lifecycle.Read)\n    id: integer;\n    \n    userId: integer;\n    title: string;\n    description?: string;\n    status: \"active\" | \"completed\" | \"archived\";\n    \n    @format(\"date-time\")\n    createdAt: utcDateTime;\n    \n    @format(\"date-time\")\n    updatedAt?: utcDateTime;\n  }\n\n  model CreateItemRequest {\n    userId: integer;\n    title: string;\n    description?: string;\n  }\n\n  model UpdateItemRequest {\n    title?: string;\n    description?: string;\n    status?: \"active\" | \"completed\" | \"archived\";\n  }\n\n  \u002F\u002F Operations\n  @route(\"\u002Fitems\")\n  @card(#{ dataPath: \"$\", title: \"$.title\", file: \"item-card.json\" })\n  @get op listItems(@query userId?: integer): Item[];\n\n  @route(\"\u002Fitems\u002F{id}\")\n  @card(#{ dataPath: \"$\", title: \"$.title\", file: \"item-card.json\" })\n  @get op getItem(@path id: integer): Item;\n\n  @route(\"\u002Fitems\")\n  @post\n  @capabilities(#{\n    confirmation: #{\n      type: \"AdaptiveCard\",\n      title: \"Create Item\",\n      body: \"Creating: **{{ function.parameters.item.title }}**\"\n    }\n  })\n  op createItem(@body item: CreateItemRequest): Item;\n\n  @route(\"\u002Fitems\u002F{id}\")\n  @patch\n  @capabilities(#{\n    confirmation: #{\n      type: \"AdaptiveCard\",\n      title: \"Update Item\",\n      body: \"Updating item #{{ function.parameters.id }}\"\n    }\n  })\n  op updateItem(@path id: integer, @body item: UpdateItemRequest): Item;\n\n  @route(\"\u002Fitems\u002F{id}\")\n  @delete\n  @capabilities(#{\n    confirmation: #{\n      type: \"AdaptiveCard\",\n      title: \"Delete Item\",\n      body: \"⚠️ Delete item #{{ function.parameters.id }}?\"\n    }\n  })\n  op deleteItem(@path id: integer): void;\n}\n```\n\n## Advanced Features\n\n### Multiple Query Parameters\n```typescript\n@route(\"\u002Fitems\")\n@get op listItems(\n  @query userId?: integer,\n  @query status?: \"active\" | \"completed\" | \"archived\",\n  @query limit?: integer,\n  @query offset?: integer\n): ItemList;\n\nmodel ItemList {\n  items: Item[];\n  total: integer;\n  hasMore: boolean;\n}\n```\n\n### Header Parameters\n```typescript\n@route(\"\u002Fitems\")\n@get op listItems(\n  @header(\"X-API-Version\") apiVersion?: string,\n  @query userId?: integer\n): Item[];\n```\n\n### Custom Response Models\n```typescript\n@route(\"\u002Fitems\u002F{id}\")\n@delete op deleteItem(@path id: integer): DeleteResponse;\n\nmodel DeleteResponse {\n  success: boolean;\n  message: string;\n  deletedId: integer;\n}\n```\n\n### Error Responses\n```typescript\nmodel ErrorResponse {\n  error: {\n    code: string;\n    message: string;\n    details?: string[];\n  };\n}\n\n@route(\"\u002Fitems\u002F{id}\")\n@get op getItem(@path id: integer): Item | ErrorResponse;\n```\n\n## Testing Prompts\n\nAfter adding operations, test with these prompts:\n\n**GET Operations:**\n- \"List all items and show them in a table\"\n- \"Show me items for user ID 1\"\n- \"Get the details of item 42\"\n\n**POST Operations:**\n- \"Create a new item with title 'My Task' for user 1\"\n- \"Add an item: title 'New Feature', description 'Add login'\"\n\n**PATCH Operations:**\n- \"Update item 10 with title 'Updated Title'\"\n- \"Change the status of item 5 to completed\"\n\n**DELETE Operations:**\n- \"Delete item 99\"\n- \"Remove the item with ID 15\"\n\n## Best Practices\n\n### Parameter Naming\n- Use descriptive parameter names: `userId` not `uid`\n- Be consistent across operations\n- Use optional parameters (`?`) for filters\n\n### Documentation\n- Add JSDoc comments to all operations\n- Describe what each parameter does\n- Document expected responses\n\n### Models\n- Use `@visibility(Lifecycle.Read)` for read-only fields like `id`\n- Use `@format(\"date-time\")` for date fields\n- Use union types for enums: `\"active\" | \"completed\"`\n- Make optional fields explicit with `?`\n\n### Confirmations\n- Always add confirmations to destructive operations (DELETE, PATCH)\n- Show key details in confirmation body\n- Use warning emoji (⚠️) for irreversible actions\n\n### Adaptive Cards\n- Keep cards simple and focused\n- Use conditional rendering with `${if(..., ..., 'N\u002FA')}`\n- Include action buttons for common next steps\n- Test data binding with actual API responses\n\n### Routing\n- Use RESTful conventions:\n  - `GET \u002Fitems` - List\n  - `GET \u002Fitems\u002F{id}` - Get one\n  - `POST \u002Fitems` - Create\n  - `PATCH \u002Fitems\u002F{id}` - Update\n  - `DELETE \u002Fitems\u002F{id}` - Delete\n- Group related operations in the same namespace\n- Use nested routes for hierarchical resources\n\n## Common Issues\n\n### Issue: Parameter not showing in Copilot\n**Solution**: Check parameter is properly decorated with `@query`, `@path`, or `@body`\n\n### Issue: Adaptive card not rendering\n**Solution**: Verify file path in `@card` decorator and check JSON syntax\n\n### Issue: Confirmation not appearing\n**Solution**: Ensure `@capabilities` decorator is properly formatted with confirmation object\n\n### Issue: Model property not appearing in response\n**Solution**: Check if property needs `@visibility(Lifecycle.Read)` or remove it if it should be writable\n\n","# Add TypeSpec API Operations\n\nAdd RESTful operations to an existing TypeSpec API plugin for Microsoft 365 Copilot.\n\n## Adding GET Operations\n\n### Simple GET - List All Items\n```typescript\n\u002F**\n * List all items.\n *\u002F\n@route(\"\u002Fitems\")\n@get op listItems(): Item[];\n```\n\n### GET with Query Parameter - Filter Results\n```typescript\n\u002F**\n * List items filtered by criteria.\n * @param userId Optional user ID to filter items\n *\u002F\n@route(\"\u002Fitems\")\n@get op listItems(@query userId?: integer): Item[];\n```\n\n### GET with Path Parameter - Get Single Item\n```typescript\n\u002F**\n * Get a specific item by ID.\n * @param id The ID of the item to retrieve\n *\u002F\n@route(\"\u002Fitems\u002F{id}\")\n@get op getItem(@path id: integer): Item;\n```\n\n### GET with Adaptive Card\n```typescript\n\u002F**\n * List items with adaptive card visualization.\n *\u002F\n@route(\"\u002Fitems\")\n@card(#{\n  dataPath: \"$\",\n  title: \"$.title\",\n  file: \"item-card.json\"\n})\n@get op listItems(): Item[];\n```\n\n**Create the Adaptive Card** (`appPackage\u002Fitem-card.json`):\n```json\n{\n  \"type\": \"AdaptiveCard\",\n  \"$schema\": \"http:\u002F\u002Fadaptivecards.io\u002Fschemas\u002Fadaptive-card.json\",\n  \"version\": \"1.5\",\n  \"body\": [\n    {\n      \"type\": \"Container\",\n      \"$data\": \"${$root}\",\n      \"items\": [\n        {\n          \"type\": \"TextBlock\",\n          \"text\": \"**${if(title, title, 'N\u002FA')}**\",\n          \"wrap\": true\n        },\n        {\n          \"type\": \"TextBlock\",\n          \"text\": \"${if(description, description, 'N\u002FA')}\",\n          \"wrap\": true\n        }\n      ]\n    }\n  ],\n  \"actions\": [\n    {\n      \"type\": \"Action.OpenUrl\",\n      \"title\": \"View Details\",\n      \"url\": \"https:\u002F\u002Fexample.com\u002Fitems\u002F${id}\"\n    }\n  ]\n}\n```\n\n## Adding POST Operations\n\n### Simple POST - Create Item\n```typescript\n\u002F**\n * Create a new item.\n * @param item The item to create\n *\u002F\n@route(\"\u002Fitems\")\n@post op createItem(@body item: CreateItemRequest): Item;\n\nmodel CreateItemRequest {\n  title: string;\n  description?: string;\n  userId: integer;\n}\n```\n\n### POST with Confirmation\n```typescript\n\u002F**\n * Create a new item with confirmation.\n *\u002F\n@route(\"\u002Fitems\")\n@post\n@capabilities(#{\n  confirmation: #{\n    type: \"AdaptiveCard\",\n    title: \"Create Item\",\n    body: \"\"\"\n    Are you sure you want to create this item?\n      * **Title**: {{ function.parameters.item.title }}\n      * **User ID**: {{ function.parameters.item.userId }}\n    \"\"\"\n  }\n})\nop createItem(@body item: CreateItemRequest): Item;\n```\n\n## Adding PATCH Operations\n\n### Simple PATCH - Update Item\n```typescript\n\u002F**\n * Update an existing item.\n * @param id The ID of the item to update\n * @param item The updated item data\n *\u002F\n@route(\"\u002Fitems\u002F{id}\")\n@patch op updateItem(\n  @path id: integer,\n  @body item: UpdateItemRequest\n): Item;\n\nmodel UpdateItemRequest {\n  title?: string;\n  description?: string;\n  status?: \"active\" | \"completed\" | \"archived\";\n}\n```\n\n### PATCH with Confirmation\n```typescript\n\u002F**\n * Update an item with confirmation.\n *\u002F\n@route(\"\u002Fitems\u002F{id}\")\n@patch\n@capabilities(#{\n  confirmation: #{\n    type: \"AdaptiveCard\",\n    title: \"Update Item\",\n    body: \"\"\"\n    Updating item #{{ function.parameters.id }}:\n      * **Title**: {{ function.parameters.item.title }}\n      * **Status**: {{ function.parameters.item.status }}\n    \"\"\"\n  }\n})\nop updateItem(\n  @path id: integer,\n  @body item: UpdateItemRequest\n): Item;\n```\n\n## Adding DELETE Operations\n\n### Simple DELETE\n```typescript\n\u002F**\n * Delete an item.\n * @param id The ID of the item to delete\n *\u002F\n@route(\"\u002Fitems\u002F{id}\")\n@delete op deleteItem(@path id: integer): void;\n```\n\n### DELETE with Confirmation\n```typescript\n\u002F**\n * Delete an item with confirmation.\n *\u002F\n@route(\"\u002Fitems\u002F{id}\")\n@delete\n@capabilities(#{\n  confirmation: #{\n    type: \"AdaptiveCard\",\n    title: \"Delete Item\",\n    body: \"\"\"\n    ⚠️ Are you sure you want to delete item #{{ function.parameters.id }}?\n    This action cannot be undone.\n    \"\"\"\n  }\n})\nop deleteItem(@path id: integer): void;\n```\n\n## Complete CRUD Example\n\n### Define the Service and Models\n```typescript\n@service\n@server(\"https:\u002F\u002Fapi.example.com\")\n@actions(#{\n  nameForHuman: \"Items API\",\n  descriptionForHuman: \"Manage items\",\n  descriptionForModel: \"Read, create, update, and delete items\"\n})\nnamespace ItemsAPI {\n  \n  \u002F\u002F Models\n  model Item {\n    @visibility(Lifecycle.Read)\n    id: integer;\n    \n    userId: integer;\n    title: string;\n    description?: string;\n    status: \"active\" | \"completed\" | \"archived\";\n    \n    @format(\"date-time\")\n    createdAt: utcDateTime;\n    \n    @format(\"date-time\")\n    updatedAt?: utcDateTime;\n  }\n\n  model CreateItemRequest {\n    userId: integer;\n    title: string;\n    description?: string;\n  }\n\n  model UpdateItemRequest {\n    title?: string;\n    description?: string;\n    status?: \"active\" | \"completed\" | \"archived\";\n  }\n\n  \u002F\u002F Operations\n  @route(\"\u002Fitems\")\n  @card(#{ dataPath: \"$\", title: \"$.title\", file: \"item-card.json\" })\n  @get op listItems(@query userId?: integer): Item[];\n\n  @route(\"\u002Fitems\u002F{id}\")\n  @card(#{ dataPath: \"$\", title: \"$.title\", file: \"item-card.json\" })\n  @get op getItem(@path id: integer): Item;\n\n  @route(\"\u002Fitems\")\n  @post\n  @capabilities(#{\n    confirmation: #{\n      type: \"AdaptiveCard\",\n      title: \"Create Item\",\n      body: \"Creating: **{{ function.parameters.item.title }}**\"\n    }\n  })\n  op createItem(@body item: CreateItemRequest): Item;\n\n  @route(\"\u002Fitems\u002F{id}\")\n  @patch\n  @capabilities(#{\n    confirmation: #{\n      type: \"AdaptiveCard\",\n      title: \"Update Item\",\n      body: \"Updating item #{{ function.parameters.id }}\"\n    }\n  })\n  op updateItem(@path id: integer, @body item: UpdateItemRequest): Item;\n\n  @route(\"\u002Fitems\u002F{id}\")\n  @delete\n  @capabilities(#{\n    confirmation: #{\n      type: \"AdaptiveCard\",\n      title: \"Delete Item\",\n      body: \"⚠️ Delete item #{{ function.parameters.id }}?\"\n    }\n  })\n  op deleteItem(@path id: integer): void;\n}\n```\n\n## Advanced Features\n\n### Multiple Query Parameters\n```typescript\n@route(\"\u002Fitems\")\n@get op listItems(\n  @query userId?: integer,\n  @query status?: \"active\" | \"completed\" | \"archived\",\n  @query limit?: integer,\n  @query offset?: integer\n): ItemList;\n\nmodel ItemList {\n  items: Item[];\n  total: integer;\n  hasMore: boolean;\n}\n```\n\n### Header Parameters\n```typescript\n@route(\"\u002Fitems\")\n@get op listItems(\n  @header(\"X-API-Version\") apiVersion?: string,\n  @query userId?: integer\n): Item[];\n```\n\n### Custom Response Models\n```typescript\n@route(\"\u002Fitems\u002F{id}\")\n@delete op deleteItem(@path id: integer): DeleteResponse;\n\nmodel DeleteResponse {\n  success: boolean;\n  message: string;\n  deletedId: integer;\n}\n```\n\n### Error Responses\n```typescript\nmodel ErrorResponse {\n  error: {\n    code: string;\n    message: string;\n    details?: string[];\n  };\n}\n\n@route(\"\u002Fitems\u002F{id}\")\n@get op getItem(@path id: integer): Item | ErrorResponse;\n```\n\n## Testing Prompts\n\nAfter adding operations, test with these prompts:\n\n**GET Operations:**\n- \"List all items and show them in a table\"\n- \"Show me items for user ID 1\"\n- \"Get the details of item 42\"\n\n**POST Operations:**\n- \"Create a new item with title 'My Task' for user 1\"\n- \"Add an item: title 'New Feature', description 'Add login'\"\n\n**PATCH Operations:**\n- \"Update item 10 with title 'Updated Title'\"\n- \"Change the status of item 5 to completed\"\n\n**DELETE Operations:**\n- \"Delete item 99\"\n- \"Remove the item with ID 15\"\n\n## Best Practices\n\n### Parameter Naming\n- Use descriptive parameter names: `userId` not `uid`\n- Be consistent across operations\n- Use optional parameters (`?`) for filters\n\n### Documentation\n- Add JSDoc comments to all operations\n- Describe what each parameter does\n- Document expected responses\n\n### Models\n- Use `@visibility(Lifecycle.Read)` for read-only fields like `id`\n- Use `@format(\"date-time\")` for date fields\n- Use union types for enums: `\"active\" | \"completed\"`\n- Make optional fields explicit with `?`\n\n### Confirmations\n- Always add confirmations to destructive operations (DELETE, PATCH)\n- Show key details in confirmation body\n- Use warning emoji (⚠️) for irreversible actions\n\n### Adaptive Cards\n- Keep cards simple and focused\n- Use conditional rendering with `${if(..., ..., 'N\u002FA')}`\n- Include action buttons for common next steps\n- Test data binding with actual API responses\n\n### Routing\n- Use RESTful conventions:\n  - `GET \u002Fitems` - List\n  - `GET \u002Fitems\u002F{id}` - Get one\n  - `POST \u002Fitems` - Create\n  - `PATCH \u002Fitems\u002F{id}` - Update\n  - `DELETE \u002Fitems\u002F{id}` - Delete\n- Group related operations in the same namespace\n- Use nested routes for hierarchical resources\n\n## Common Issues\n\n### Issue: Parameter not showing in Copilot\n**Solution**: Check parameter is properly decorated with `@query`, `@path`, or `@body`\n\n### Issue: Adaptive card not rendering\n**Solution**: Verify file path in `@card` decorator and check JSON syntax\n\n### Issue: Confirmation not appearing\n**Solution**: Ensure `@capabilities` decorator is properly formatted with confirmation object\n\n### Issue: Model property not appearing in response\n**Solution**: Check if property needs `@visibility(Lifecycle.Read)` or remove it if it should be writable\n\n",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fgithub\u002Fawesome-copilot\u002Ftypespec-api-operations",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":56,"prompt":66,"zipAvailable":67},[57,60,63],{"tool":58,"command":59},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill typespec-api-operations",{"tool":61,"command":62},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill typespec-api-operations",{"tool":64,"command":65},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill typespec-api-operations","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fgithub\u002Fawesome-copilot\u002Ftypespec-api-operations\u002FSKILL.md",true,[],[70,82,92,101,107,114],{"skillNo":71,"name":72,"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":73,"categories":74,"keywords":78,"publishedAt":41},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[75],{"categoryNo":76,"categoryName":77,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[79,80,81],"model","model hierarchy","model hierarchy skill",{"skillNo":83,"name":84,"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":85,"categories":86,"keywords":88,"publishedAt":41},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[87],{"categoryNo":76,"categoryName":77,"taxonomyType":21,"taxonomyTypeDesc":22},[89,90,91],"MCP","zoom","zoom mcp",{"skillNo":93,"name":94,"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":95,"categories":96,"keywords":97,"publishedAt":41},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[98,99,100,90],"sdk","zoom apps sdk","apps",{"skillNo":102,"name":103,"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":104,"categories":105,"keywords":106,"publishedAt":41},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[103],{"skillNo":108,"name":109,"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":110,"categories":111,"keywords":113,"publishedAt":41},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[112],{"categoryNo":76,"categoryName":77,"taxonomyType":21,"taxonomyTypeDesc":22},[109],{"skillNo":115,"name":116,"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":117,"categories":118,"keywords":119,"publishedAt":41},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[116]]