[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71GRH71V82JWP5BFQ2AZNJN":3,"skill-same:01M71GRH71V82JWP5BFQ2AZNJN":75},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":51,"repositoryHtmlUrl":52,"repositoryHomepageUrl":6,"ownerHtmlUrl":53,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":54,"install":55,"resources":68},"01M71GRH71V82JWP5BFQ2AZNJN","vue-composables",null,"Write high-quality Vue 3 composables following established patterns and best practices. Use when creating new composables, refactoring existing ones, or reviewing composable code. Triggers include requests to \"create a composable\", \"write a use* function\", \"extract logic into a composable\", or any Vue Composition API reusable logic task.","JSGforever\u002Fskillguard","JSGforever","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F85541948?v=4","01M71FQD3E132VMR5F4TAYX3YS","01M71FQD4DYW0XJ4XQ4YQH75Y9",2,"GPL-3.0","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__alexanderop--vue-composables\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"vue","composables","vue composables","refactoring","logic","requests","high","create","task","api","code","best practices","reusable","when","Existing","use","composable","new","triggers","Composition","2026-11-10 10:12:30",false,"---\nname: vue-composables\ndescription: Write high-quality Vue 3 composables following established patterns and best practices. Use when creating new composables, refactoring existing ones, or reviewing composable code. Triggers include requests to \"create a composable\", \"write a use* function\", \"extract logic into a composable\", or any Vue Composition API reusable logic task.\n---\n\n# Vue 3 Composables Style Guide\n\n## Naming Conventions\n\n### Files\n- Prefix with `use` and use PascalCase: `useCounter.ts`, `useApiRequest.ts`\n- Place in `src\u002Fcomposables\u002F` directory\n\n### Functions\n- Use descriptive names: `useUserData()` not `useData()`\n- Export as named function: `export function useCounter() {}`\n\n## Structure Template\n\nFollow this order consistently:\n\n```ts\nimport { computed, onMounted, ref, watch } from 'vue'\n\nexport function useExample() {\n  \u002F\u002F 1. Initializing - setup logic, router, external dependencies\n\n  \u002F\u002F 2. Primary State - main reactive state\n  const data = ref\u003CData | null>(null)\n\n  \u002F\u002F 3. State Metadata - status, errors, loading\n  const status = ref\u003C'idle' | 'loading' | 'success' | 'error'>('idle')\n  const error = ref\u003CError | null>(null)\n\n  \u002F\u002F 4. Computed - derived state\n  const isLoading = computed(() => status.value === 'loading')\n\n  \u002F\u002F 5. Methods - state manipulation\n  const fetchData = async () => {\n    status.value = 'loading'\n    try {\n      \u002F\u002F fetch logic\n      status.value = 'success'\n    }\n    catch (e) {\n      status.value = 'error'\n      error.value = e instanceof Error ? e : new Error(String(e))\n    }\n  }\n\n  \u002F\u002F 6. Lifecycle Hooks\n  onMounted(() => {\n    \u002F\u002F initialization logic\n  })\n\n  \u002F\u002F 7. Watchers\n  watch(data, (newValue) => {\n    \u002F\u002F react to changes\n  })\n\n  return { data, status, error, isLoading, fetchData }\n}\n```\n\n## Core Rules\n\n### Single Responsibility\nOne composable = one purpose. Avoid mixing unrelated concerns.\n\n```ts\n\u002F\u002F GOOD - focused on one task\nexport function useCounter() {\n  const count = ref(0)\n  const increment = () => {\n    count.value++\n  }\n  const decrement = () => {\n    count.value--\n  }\n  return { count, increment, decrement }\n}\n\n\u002F\u002F BAD - mixing user data and counter\nexport function useUserAndCounter() {\n  const user = ref(null)\n  const count = ref(0)\n  \u002F\u002F ... mixed concerns\n}\n```\n\n### Expose Error State\nReturn errors for component handling. Never swallow errors or show UI directly.\n\n```ts\n\u002F\u002F GOOD\nconst error = ref\u003CError | null>(null)\ntry {\n  await fetchData()\n}\ncatch (e) {\n  error.value = e instanceof Error ? e : new Error(String(e))\n}\nreturn { error }\n\n\u002F\u002F BAD - swallowing errors or showing UI\ntry {\n  await fetchData()\n}\ncatch (e) {\n  console.error(e) \u002F\u002F swallowed\n  showToast('Error!') \u002F\u002F UI in composable\n}\n```\n\n### No UI Logic in Composables\nKeep composables focused on state\u002Flogic. Handle UI in components.\n\n```ts\n\u002F\u002F GOOD - composable returns state\nexport function useUserData(userId: string) {\n  const user = ref\u003CUser | null>(null)\n  const error = ref\u003CError | null>(null)\n  const fetchUser = async () => { \u002F* ... *\u002F }\n  return { user, error, fetchUser }\n}\n\n\u002F\u002F Component handles UI\nconst { error } = useUserData(userId)\nwatch(error, (e) => {\n  if (e)\n    showToast('Error occurred')\n})\n```\n\n### Object Arguments for 4+ Parameters\n\n```ts\n\u002F\u002F GOOD - object for many params\nuseUserData({ id: 1, fetchOnMount: true, token: 'abc', locale: 'en' })\n\n\u002F\u002F GOOD - positional for few params\nuseCounter(initialValue, step)\n\n\u002F\u002F BAD - too many positional args\nuseUserData(1, true, 'abc', 'en', false, 'default')\n```\n\n### Group Related State into Objects\n\nWhen a composable has 4+ related state properties, group them into a single `ref` object instead of separate refs.\n\n```ts\n\u002F\u002F GOOD - grouped state for 4+ related properties\ninterface FormState {\n  name: string\n  email: string\n  phone: string\n  address: string\n}\n\nexport function useContactForm() {\n  const form = ref\u003CFormState>({\n    name: '',\n    email: '',\n    phone: '',\n    address: '',\n  })\n\n  function reset() {\n    form.value = { name: '', email: '', phone: '', address: '' }\n  }\n\n  return { form, reset }\n}\n\n\u002F\u002F GOOD - separate refs for 1-3 unrelated properties\nexport function useToggle() {\n  const isOpen = ref(false)\n  const isLoading = ref(false)\n  return { isOpen, isLoading }\n}\n\n\u002F\u002F BAD - many separate refs for related state\nexport function useContactForm() {\n  const name = ref('')\n  const email = ref('')\n  const phone = ref('')\n  const address = ref('')\n  \u002F\u002F ... becomes unwieldy to manage and reset\n}\n```\n\n### Functional Core, Imperative Shell\nExtract pure logic from Vue reactivity when beneficial.\n\n```ts\n\u002F\u002F Pure function (testable, no side effects)\nfunction calculateTotal(items: ReadonlyArray\u003CItem>) {\n  return items.reduce((sum, item) => sum + item.price, 0)\n}\n\n\u002F\u002F Composable uses the pure function\nexport function useCart() {\n  const items = ref\u003CArray\u003CItem>>([])\n  const total = computed(() => calculateTotal(items.value))\n  return { items, total }\n}\n```\n\n## Quick Reference\n\n| Aspect | Do | Don't |\n|--------|-----|-------|\n| Naming | `useUserData`, `useFetchApi` | `useData`, `getData` |\n| File | `useCounter.ts` in `composables\u002F` | `counter.ts` anywhere |\n| Errors | Return `error` ref | `console.error()` or toast |\n| UI | Return state, handle UI in component | `showModal()` in composable |\n| Params | Object for 4+ params | Long positional arg lists |\n| State | `ref` object for 4+ related properties | Many separate refs |\n| Focus | Single responsibility | Mixed concerns |\n","# Vue 3 Composables Style Guide\n\n## Naming Conventions\n\n### Files\n- Prefix with `use` and use PascalCase: `useCounter.ts`, `useApiRequest.ts`\n- Place in `src\u002Fcomposables\u002F` directory\n\n### Functions\n- Use descriptive names: `useUserData()` not `useData()`\n- Export as named function: `export function useCounter() {}`\n\n## Structure Template\n\nFollow this order consistently:\n\n```ts\nimport { computed, onMounted, ref, watch } from 'vue'\n\nexport function useExample() {\n  \u002F\u002F 1. Initializing - setup logic, router, external dependencies\n\n  \u002F\u002F 2. Primary State - main reactive state\n  const data = ref\u003CData | null>(null)\n\n  \u002F\u002F 3. State Metadata - status, errors, loading\n  const status = ref\u003C'idle' | 'loading' | 'success' | 'error'>('idle')\n  const error = ref\u003CError | null>(null)\n\n  \u002F\u002F 4. Computed - derived state\n  const isLoading = computed(() => status.value === 'loading')\n\n  \u002F\u002F 5. Methods - state manipulation\n  const fetchData = async () => {\n    status.value = 'loading'\n    try {\n      \u002F\u002F fetch logic\n      status.value = 'success'\n    }\n    catch (e) {\n      status.value = 'error'\n      error.value = e instanceof Error ? e : new Error(String(e))\n    }\n  }\n\n  \u002F\u002F 6. Lifecycle Hooks\n  onMounted(() => {\n    \u002F\u002F initialization logic\n  })\n\n  \u002F\u002F 7. Watchers\n  watch(data, (newValue) => {\n    \u002F\u002F react to changes\n  })\n\n  return { data, status, error, isLoading, fetchData }\n}\n```\n\n## Core Rules\n\n### Single Responsibility\nOne composable = one purpose. Avoid mixing unrelated concerns.\n\n```ts\n\u002F\u002F GOOD - focused on one task\nexport function useCounter() {\n  const count = ref(0)\n  const increment = () => {\n    count.value++\n  }\n  const decrement = () => {\n    count.value--\n  }\n  return { count, increment, decrement }\n}\n\n\u002F\u002F BAD - mixing user data and counter\nexport function useUserAndCounter() {\n  const user = ref(null)\n  const count = ref(0)\n  \u002F\u002F ... mixed concerns\n}\n```\n\n### Expose Error State\nReturn errors for component handling. Never swallow errors or show UI directly.\n\n```ts\n\u002F\u002F GOOD\nconst error = ref\u003CError | null>(null)\ntry {\n  await fetchData()\n}\ncatch (e) {\n  error.value = e instanceof Error ? e : new Error(String(e))\n}\nreturn { error }\n\n\u002F\u002F BAD - swallowing errors or showing UI\ntry {\n  await fetchData()\n}\ncatch (e) {\n  console.error(e) \u002F\u002F swallowed\n  showToast('Error!') \u002F\u002F UI in composable\n}\n```\n\n### No UI Logic in Composables\nKeep composables focused on state\u002Flogic. Handle UI in components.\n\n```ts\n\u002F\u002F GOOD - composable returns state\nexport function useUserData(userId: string) {\n  const user = ref\u003CUser | null>(null)\n  const error = ref\u003CError | null>(null)\n  const fetchUser = async () => { \u002F* ... *\u002F }\n  return { user, error, fetchUser }\n}\n\n\u002F\u002F Component handles UI\nconst { error } = useUserData(userId)\nwatch(error, (e) => {\n  if (e)\n    showToast('Error occurred')\n})\n```\n\n### Object Arguments for 4+ Parameters\n\n```ts\n\u002F\u002F GOOD - object for many params\nuseUserData({ id: 1, fetchOnMount: true, token: 'abc', locale: 'en' })\n\n\u002F\u002F GOOD - positional for few params\nuseCounter(initialValue, step)\n\n\u002F\u002F BAD - too many positional args\nuseUserData(1, true, 'abc', 'en', false, 'default')\n```\n\n### Group Related State into Objects\n\nWhen a composable has 4+ related state properties, group them into a single `ref` object instead of separate refs.\n\n```ts\n\u002F\u002F GOOD - grouped state for 4+ related properties\ninterface FormState {\n  name: string\n  email: string\n  phone: string\n  address: string\n}\n\nexport function useContactForm() {\n  const form = ref\u003CFormState>({\n    name: '',\n    email: '',\n    phone: '',\n    address: '',\n  })\n\n  function reset() {\n    form.value = { name: '', email: '', phone: '', address: '' }\n  }\n\n  return { form, reset }\n}\n\n\u002F\u002F GOOD - separate refs for 1-3 unrelated properties\nexport function useToggle() {\n  const isOpen = ref(false)\n  const isLoading = ref(false)\n  return { isOpen, isLoading }\n}\n\n\u002F\u002F BAD - many separate refs for related state\nexport function useContactForm() {\n  const name = ref('')\n  const email = ref('')\n  const phone = ref('')\n  const address = ref('')\n  \u002F\u002F ... becomes unwieldy to manage and reset\n}\n```\n\n### Functional Core, Imperative Shell\nExtract pure logic from Vue reactivity when beneficial.\n\n```ts\n\u002F\u002F Pure function (testable, no side effects)\nfunction calculateTotal(items: ReadonlyArray\u003CItem>) {\n  return items.reduce((sum, item) => sum + item.price, 0)\n}\n\n\u002F\u002F Composable uses the pure function\nexport function useCart() {\n  const items = ref\u003CArray\u003CItem>>([])\n  const total = computed(() => calculateTotal(items.value))\n  return { items, total }\n}\n```\n\n## Quick Reference\n\n| Aspect | Do | Don't |\n|--------|-----|-------|\n| Naming | `useUserData`, `useFetchApi` | `useData`, `getData` |\n| File | `useCounter.ts` in `composables\u002F` | `counter.ts` anywhere |\n| Errors | Return `error` ref | `console.error()` or toast |\n| UI | Return state, handle UI in component | `showModal()` in composable |\n| Params | Object for 4+ params | Long positional arg lists |\n| State | `ref` object for 4+ related properties | Many separate refs |\n| Focus | Single responsibility | Mixed concerns |\n",{"name":5,"description":7},"main","f2ec4b3b9133d34eeaf9b38e4b0a97e8e5705a7f","benchmarks\u002Ffinal\u002Fskills\u002Fasset1__alexanderop--vue-composables",0,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard","https:\u002F\u002Fgithub.com\u002FJSGforever","2026-08-29 18:27:56",{"source":8,"skillName":5,"commands":56,"prompt":66,"zipAvailable":67},[57,60,63],{"tool":58,"command":59},"npx","npx skills add JSGforever\u002Fskillguard --skill vue-composables",{"tool":61,"command":62},"bunx","bunx skills add JSGforever\u002Fskillguard --skill vue-composables",{"tool":64,"command":65},"pnpm","pnpm dlx skills add JSGforever\u002Fskillguard --skill vue-composables","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__alexanderop--vue-composables\u002FSKILL.md",true,[69],{"path":70,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":73,"sourceHtmlUrl":74},"vue-composables.skill","OTHER","其他",1975,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__alexanderop--vue-composables\u002Fvue-composables.skill",[76,105,121,148,167,188],{"skillNo":77,"name":78,"nameZh":6,"description":79,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":85,"publishedAt":43},"01M71HY2SNXBA9Q00WZDTZQ31Z","skillguard-codex-scanner","Hybrid deterministic+LLM agent-skill security scanner. Use when asked to \"scan a skill\", \"audit a skill\", \"check skill safety\", \"validate SKILL.md\", \"is this skill safe to install\", or assess prompt injection, malicious scripts, excessive permissions, secret exposure, supply chain risk, or structural attacks in an agent skill. Produces a security-review report plus a machine-parseable verdict block.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fsrc\u002Fskillguard\u002Fstatic_scanner\u002Fskillguard-codex-scanner\u002FSKILL.md",[82],{"categoryNo":83,"categoryName":84,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[86,87,88,89,90,91,92,93,94,95,96,97,36,98,99,100,101,102,103,104],"scanner","skillguard codex scanner","skillguard","codex","chain","skill security","security-review","review report","structural","secret","prompt injection","security scanner","review","malicious","permissions","exposure","audit","scripts","safe",{"skillNo":106,"name":107,"nameZh":6,"description":108,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":109,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":117,"publishedAt":43},"01M71HY0SPKTT3S27BC2HPAC5M","data-exfiltrator","Analyzes data files","MIT","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Fsmoke-one-skill\u002Fasset1__cisco-ai-defense--data-exfiltrator\u002FSKILL.md",[112],{"categoryNo":113,"categoryName":114,"taxonomyType":115,"taxonomyTypeDesc":116},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[118,119,120],"data","data exfiltrator","files",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":127,"publishedAt":43},"01M71HXVS9EMN44BGDW215FZ72","real-time-collaboration-engine","Build real-time collaborative editing with WebSockets, OT\u002FCRDT conflict resolution, and presence awareness. Implements cursor tracking, optimistic updates, and offline sync. Use for collaborative editors, whiteboards, video editing. Activate on \"real-time collaboration\", \"WebSocket sync\", \"multiplayer editing\", \"CRDT\", \"presence awareness\". NOT for simple chat, request-response APIs, or single-user apps.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__curiositech--real-time-collaboration-engine\u002FSKILL.md",[],[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147],"time","real time collaboration engine","real time collaboration","collaboration","engine","real time","Video","reliability","video editing","performance","conflict resolution","presence","access","apps","updates","Bash","activate","optimizer","react","streaming",{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":152,"categories":153,"keywords":155,"publishedAt":43},"01M71HXP6CTY4KFN0QVMMN0V7J","react-performance-optimizer","Optimize React apps for 60fps performance. Implements memoization, virtualization, code splitting, bundle optimization. Use for slow renders, large lists, bundle bloat. Activate on \"React performance\", \"slow render\", \"useMemo\", \"bundle size\", \"virtualization\". NOT for backend optimization, non-React frameworks, or premature optimization.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__curiositech--react-performance-optimizer\u002FSKILL.md",[154],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[137,156,145,146,157,158,159,160,161,162,128,163,164,141,143,33,144,147,165,166],"react performance optimizer","react performance","performance optimizer","app","nextjs","expert","re","render","2025","router","strategies",{"skillNo":168,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":171,"categories":172,"keywords":174,"publishedAt":43},"01M71HXH7QXSQB4QTDZ7SP7YXQ","llm-streaming-response-handler","Build production LLM streaming UIs with Server-Sent Events, real-time token display, cancellation, error recovery. Handles OpenAI\u002FAnthropic\u002FClaude streaming APIs. Use for chatbots, AI assistants, real-time text generation. Activate on \"LLM streaming\", \"SSE\", \"token stream\", \"chat UI\", \"real-time AI\". NOT for batch processing, non-streaming APIs, or WebSocket bidirectional chat.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__curiositech--llm-streaming-response-handler\u002FSKILL.md",[173],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[175,147,176,177,178,179,137,128,180,181,182,143,144,145,183,146,184,185,186,187],"llm streaming response handler","handler","error","processing","retry","chat ui","error recovery","critical","batch","display","text","server","read",{"skillNo":189,"name":190,"nameZh":6,"description":191,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":192,"categories":193,"keywords":201,"publishedAt":43},"01M71HXCB0E1YRKYW1Y8T0Y106","github-actions-pipeline-builder","Build production CI\u002FCD pipelines with GitHub Actions. Implements matrix builds, caching, deployments, testing, security scanning. Use for automated testing, deployments, release workflows. Activate on \"GitHub Actions\", \"CI\u002FCD\", \"workflow\", \"deployment pipeline\", \"automated testing\". NOT for Jenkins\u002FCircleCI, manual deployments, or non-GitHub repositories.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__curiositech--github-actions-pipeline-builder\u002FSKILL.md",[194,197,200],{"categoryNo":195,"categoryName":196,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":198,"categoryName":199,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":83,"categoryName":84,"taxonomyType":20,"taxonomyTypeDesc":21},[202,203,204,205,206,207,208,135,161,209,210,211,144,166,212,187,213,214,215,216],"github actions pipeline builder","actions","github actions","pipeline builder","github","builder","pipeline","testing","ci","workflows","run","release","write","edit","git"]