[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6AE3WF2P3DRTF434H3JPV3E":3,"skill-same:01M6AE3WF2P3DRTF434H3JPV3E":92},{"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":29,"publishedAt":53,"linkOnly":54,"markdownContent":55,"markdownBody":56,"frontMatter":57,"refName":58,"commitSha":59,"skillDirectory":60,"forksCount":61,"repositoryHtmlUrl":62,"repositoryHomepageUrl":63,"ownerHtmlUrl":64,"ownerBlogUrl":65,"ownerDescription":66,"updatedAt":67,"install":68,"resources":81},"01M6AE3WF2P3DRTF434H3JPV3E","react18-enzyme-to-rtl",null,"Provides exact Enzyme → React Testing Library migration patterns for React 18 upgrades. Use this skill whenever Enzyme tests need to be rewritten - shallow, mount, wrapper.find(), wrapper.simulate(), wrapper.prop(), wrapper.state(), wrapper.instance(), Enzyme configure\u002FAdapter calls, or any test file that imports from enzyme. This skill covers the full API mapping and the philosophy shift from implementation testing to behavior testing. Always read this skill before rewriting Enzyme tests - do not translate Enzyme APIs 1:1, that produces brittle RTL tests.","github\u002Fawesome-copilot","github","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F9919?v=4","01M6AC83DS133TPXFSP1DHNCC6","GitHub","01M6AD3PBDYPK7NVFJNJ66Y8RS",41046,"MIT","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Freact18-enzyme-to-rtl\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",[30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],"react18 enzyme to rtl","enzyme to rtl","configure","imports","for","react testing library","mapping","full","philosophy","patterns","do","react testing","Wrapper","read","testing","api","file","library","testing library","state","react","test","translate","2026-11-10 10:12:30",false,"---\nname: react18-enzyme-to-rtl\ndescription: 'Provides exact Enzyme → React Testing Library migration patterns for React 18 upgrades. Use this skill whenever Enzyme tests need to be rewritten - shallow, mount, wrapper.find(), wrapper.simulate(), wrapper.prop(), wrapper.state(), wrapper.instance(), Enzyme configure\u002FAdapter calls, or any test file that imports from enzyme. This skill covers the full API mapping and the philosophy shift from implementation testing to behavior testing. Always read this skill before rewriting Enzyme tests - do not translate Enzyme APIs 1:1, that produces brittle RTL tests.'\n---\n\n# React 18 Enzyme → RTL Migration\n\nEnzyme has no React 18 adapter and no React 18 support path. All Enzyme tests must be rewritten using React Testing Library.\n\n## The Philosophy Shift (Read This First)\n\nEnzyme tests implementation. RTL tests behavior.\n\n```jsx\n\u002F\u002F Enzyme: tests that the component has the right internal state\nexpect(wrapper.state('count')).toBe(3);\nexpect(wrapper.instance().handleClick).toBeDefined();\nexpect(wrapper.find('Button').prop('disabled')).toBe(true);\n\n\u002F\u002F RTL: tests what the user actually sees and can do\nexpect(screen.getByText('Count: 3')).toBeInTheDocument();\nexpect(screen.getByRole('button', { name: \u002Fsubmit\u002Fi })).toBeDisabled();\n```\n\nThis is not a 1:1 translation. Enzyme tests that verify internal state or instance methods don't have RTL equivalents - because RTL intentionally doesn't expose internals. **Rewrite the test to assert the visible outcome instead.**\n\n## API Map\n\nFor complete before\u002Fafter code for each Enzyme API, read:\n- **`references\u002Fenzyme-api-map.md`** - full mapping: shallow, mount, find, simulate, prop, state, instance, configure\n- **`references\u002Fasync-patterns.md`** - waitFor, findBy, act(), Apollo MockedProvider, loading states, error states\n\n## Core Rewrite Template\n\n```jsx\n\u002F\u002F Every Enzyme test rewrites to this shape:\nimport { render, screen, fireEvent, waitFor } from '@testing-library\u002Freact';\nimport userEvent from '@testing-library\u002Fuser-event';\nimport MyComponent from '.\u002FMyComponent';\n\ndescribe('MyComponent', () => {\n  it('does the thing', async () => {\n    \u002F\u002F 1. Render (replaces shallow\u002Fmount)\n    render(\u003CMyComponent prop=\"value\" \u002F>);\n\n    \u002F\u002F 2. Query (replaces wrapper.find())\n    const button = screen.getByRole('button', { name: \u002Fsubmit\u002Fi });\n\n    \u002F\u002F 3. Interact (replaces simulate())\n    await userEvent.setup().click(button);\n\n    \u002F\u002F 4. Assert on visible output (replaces wrapper.state() \u002F wrapper.prop())\n    expect(screen.getByText('Submitted!')).toBeInTheDocument();\n  });\n});\n```\n\n## RTL Query Priority (use in this order)\n\n1. `getByRole` - matches accessible roles (button, textbox, heading, checkbox, etc.)\n2. `getByLabelText` - form fields linked to labels\n3. `getByPlaceholderText` - input placeholders\n4. `getByText` - visible text content\n5. `getByDisplayValue` - current value of input\u002Fselect\u002Ftextarea\n6. `getByAltText` - image alt text\n7. `getByTitle` - title attribute\n8. `getByTestId` - `data-testid` attribute (last resort)\n\nPrefer `getByRole` over `getByTestId`. It tests accessibility too.\n\n## Wrapping with Providers\n\n```jsx\n\u002F\u002F Enzyme with context:\nconst wrapper = mount(\n  \u003CApolloProvider client={client}>\n    \u003CThemeProvider theme={theme}>\n      \u003CMyComponent \u002F>\n    \u003C\u002FThemeProvider>\n  \u003C\u002FApolloProvider>\n);\n\n\u002F\u002F RTL equivalent (use your project's customRender or wrap inline):\nimport { render } from '@testing-library\u002Freact';\nrender(\n  \u003CMockedProvider mocks={mocks} addTypename={false}>\n    \u003CThemeProvider theme={theme}>\n      \u003CMyComponent \u002F>\n    \u003C\u002FThemeProvider>\n  \u003C\u002FMockedProvider>\n);\n\u002F\u002F Or use the project's customRender helper if it wraps providers\n```\n","# React 18 Enzyme → RTL Migration\n\nEnzyme has no React 18 adapter and no React 18 support path. All Enzyme tests must be rewritten using React Testing Library.\n\n## The Philosophy Shift (Read This First)\n\nEnzyme tests implementation. RTL tests behavior.\n\n```jsx\n\u002F\u002F Enzyme: tests that the component has the right internal state\nexpect(wrapper.state('count')).toBe(3);\nexpect(wrapper.instance().handleClick).toBeDefined();\nexpect(wrapper.find('Button').prop('disabled')).toBe(true);\n\n\u002F\u002F RTL: tests what the user actually sees and can do\nexpect(screen.getByText('Count: 3')).toBeInTheDocument();\nexpect(screen.getByRole('button', { name: \u002Fsubmit\u002Fi })).toBeDisabled();\n```\n\nThis is not a 1:1 translation. Enzyme tests that verify internal state or instance methods don't have RTL equivalents - because RTL intentionally doesn't expose internals. **Rewrite the test to assert the visible outcome instead.**\n\n## API Map\n\nFor complete before\u002Fafter code for each Enzyme API, read:\n- **`references\u002Fenzyme-api-map.md`** - full mapping: shallow, mount, find, simulate, prop, state, instance, configure\n- **`references\u002Fasync-patterns.md`** - waitFor, findBy, act(), Apollo MockedProvider, loading states, error states\n\n## Core Rewrite Template\n\n```jsx\n\u002F\u002F Every Enzyme test rewrites to this shape:\nimport { render, screen, fireEvent, waitFor } from '@testing-library\u002Freact';\nimport userEvent from '@testing-library\u002Fuser-event';\nimport MyComponent from '.\u002FMyComponent';\n\ndescribe('MyComponent', () => {\n  it('does the thing', async () => {\n    \u002F\u002F 1. Render (replaces shallow\u002Fmount)\n    render(\u003CMyComponent prop=\"value\" \u002F>);\n\n    \u002F\u002F 2. Query (replaces wrapper.find())\n    const button = screen.getByRole('button', { name: \u002Fsubmit\u002Fi });\n\n    \u002F\u002F 3. Interact (replaces simulate())\n    await userEvent.setup().click(button);\n\n    \u002F\u002F 4. Assert on visible output (replaces wrapper.state() \u002F wrapper.prop())\n    expect(screen.getByText('Submitted!')).toBeInTheDocument();\n  });\n});\n```\n\n## RTL Query Priority (use in this order)\n\n1. `getByRole` - matches accessible roles (button, textbox, heading, checkbox, etc.)\n2. `getByLabelText` - form fields linked to labels\n3. `getByPlaceholderText` - input placeholders\n4. `getByText` - visible text content\n5. `getByDisplayValue` - current value of input\u002Fselect\u002Ftextarea\n6. `getByAltText` - image alt text\n7. `getByTitle` - title attribute\n8. `getByTestId` - `data-testid` attribute (last resort)\n\nPrefer `getByRole` over `getByTestId`. It tests accessibility too.\n\n## Wrapping with Providers\n\n```jsx\n\u002F\u002F Enzyme with context:\nconst wrapper = mount(\n  \u003CApolloProvider client={client}>\n    \u003CThemeProvider theme={theme}>\n      \u003CMyComponent \u002F>\n    \u003C\u002FThemeProvider>\n  \u003C\u002FApolloProvider>\n);\n\n\u002F\u002F RTL equivalent (use your project's customRender or wrap inline):\nimport { render } from '@testing-library\u002Freact';\nrender(\n  \u003CMockedProvider mocks={mocks} addTypename={false}>\n    \u003CThemeProvider theme={theme}>\n      \u003CMyComponent \u002F>\n    \u003C\u002FThemeProvider>\n  \u003C\u002FMockedProvider>\n);\n\u002F\u002F Or use the project's customRender helper if it wraps providers\n```\n",{"name":5,"description":7},"main","5269f7ea2d6c3a9bfda5ed878b6726cf509121fd","skills\u002Freact18-enzyme-to-rtl",5340,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot","https:\u002F\u002Fawesome-copilot.github.com\u002F","https:\u002F\u002Fgithub.com\u002Fgithub","https:\u002F\u002Fgithub.com\u002Fabout","How people build software.","2026-11-11 13:41:32",{"source":8,"skillName":5,"commands":69,"prompt":79,"zipAvailable":80},[70,73,76],{"tool":71,"command":72},"npx","npx skills add github\u002Fawesome-copilot --skill react18-enzyme-to-rtl",{"tool":74,"command":75},"bunx","bunx skills add github\u002Fawesome-copilot --skill react18-enzyme-to-rtl",{"tool":77,"command":78},"pnpm","pnpm dlx skills add github\u002Fawesome-copilot --skill react18-enzyme-to-rtl","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Freact18-enzyme-to-rtl\u002FSKILL.md",true,[82,88],{"path":83,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":86,"sourceHtmlUrl":87},"references\u002Fasync-patterns.md","REFERENCE","参考文档",7522,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Freact18-enzyme-to-rtl\u002Freferences\u002Fasync-patterns.md",{"path":89,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":90,"sourceHtmlUrl":91},"references\u002Fenzyme-api-map.md",6294,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Freact18-enzyme-to-rtl\u002Freferences\u002Fenzyme-api-map.md",[93,123,150,180,209,226],{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":103,"publishedAt":53},"01M70KXZNX9ES38N2A8M58ZZMZ","supabase-rls-policies","Write, review, and test Supabase Row Level Security (RLS) policies so that one user cannot read or change another user's rows. Use when creating or changing tables, policies, views, or security definer functions in a Supabase project, when reviewing a migration that touches RLS, or when asked to prove user isolation with pgTAP tests that sign in as two users.","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fsupabase-rls-policies\u002FSKILL.md",[99,100],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":101,"categoryName":102,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[104,105,106,107,108,109,110,111,43,112,113,114,115,116,117,118,119,120,121,122],"supabase","rls","supabase rls","supabase rls policies","project","when","review","change","write","security","isolation","tables","as","tests","prove","use","users","functions","with",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":130,"publishedAt":53},"01M70KWA5YWXDV6V8DZ19E3T2Y","skill-distribution-audit","Audit a skill collection before release or investigate installer omissions, archived\u002Ftemplate leakage, duplicate identities, and manifest drift. Reconcile the intended public source set, distribution manifest, and actual discovery output for a specified consumer version. Includes a deterministic set-comparison helper.","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fskill-distribution-audit\u002FSKILL.md",[129],{"categoryNo":101,"categoryName":102,"taxonomyType":21,"taxonomyTypeDesc":22},[131,132,133,134,135,136,34,137,138,139,140,141,142,143,144,145,146,147,148,149],"distribution","skill distribution audit","audit","SET","deterministic","installer","discovery","comparison","helper","manifest","version","collection","drift","output","investigate","duplicate","template","release","reconcile",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":154,"sourceHtmlUrl":155,"categories":156,"keywords":162,"publishedAt":53},"01M70KCJPFVW7PPQ49CC5R8JGK","logicapps-custom-code-net10-migration","Migrate Azure Logic Apps Standard local-function custom-code projects from .NET 8 to .NET 10. Use for legacy Logic Apps custom-code workspace upgrades, project\u002Fpackage configuration, custom-worker settings, publication, and integrated VS Code debugging. Not for ordinary .NET applications, standalone Azure Functions, Consumption workflows, or cloud deployment.","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Flogicapps-custom-code-net10-migration\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Flogicapps-custom-code-net10-migration\u002FSKILL.md",[157],{"categoryNo":158,"categoryName":159,"taxonomyType":160,"taxonomyTypeDesc":161},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[163,164,165,166,167,168,34,108,169,170,171,172,173,174,175,119,176,177,178,179],"custom","code","logicapps custom code net10 migration","migration","projects","standalone","deployment","applications","local","azure","worker","upgrades","package","apps","Legacy","debugging","workflows",{"skillNo":181,"name":182,"nameZh":6,"description":183,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":184,"sourceHtmlUrl":185,"categories":186,"keywords":189,"publishedAt":53},"01M6AEBN37RQMXJ3298PEY7PG1","winmd-api-search","Find and explore Windows desktop APIs. Use when building features that need platform capabilities — camera, file access, notifications, UI controls, AI\u002FML, sensors, networking, etc. Discovers the right API for a task and retrieves full type details (methods, properties, events, enumeration values).","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fwinmd-api-search\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fwinmd-api-search\u002FSKILL.md",[187,188],{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":158,"categoryName":159,"taxonomyType":160,"taxonomyTypeDesc":161},[190,191,45,192,193,194,195,196,197,46,198,199,200,201,202,109,203,37,204,205,206,34,207,208],"winmd api search","search","windows","desktop","file access","enumeration","ui","ml","networking","capabilities","notifications","explore","access","features","camera","events","platform","methods","controls",{"skillNo":210,"name":211,"nameZh":6,"description":212,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":213,"licenseFileUrl":214,"sourceHtmlUrl":215,"categories":216,"keywords":222,"publishedAt":53},"01M6AE571R3SC1ZGE202B3NB5S","resemble-detect","Deepfake detection and media safety — detect AI-generated audio, images, video, and text, trace synthesis sources, apply watermarks, verify speaker identity, and analyze media intelligence using Resemble AI","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fresemble-detect\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fresemble-detect\u002FSKILL.md",[217,218,221],{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":219,"categoryName":220,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":101,"categoryName":102,"taxonomyType":21,"taxonomyTypeDesc":22},[223,134,46,224,225],"resemble detect","https","identity",{"skillNo":227,"name":228,"nameZh":6,"description":229,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":213,"licenseFileUrl":230,"sourceHtmlUrl":231,"categories":232,"keywords":237,"publishedAt":53},"01M6AE30BSK2HCY4TQQ22Z8JRD","quality-playbook","Run a complete quality engineering audit on any codebase. Derives behavioral requirements from the code, generates spec-traced functional tests, runs a three-pass code review with regression tests, executes a multi-model spec audit (Council of Three), and produces a consolidated bug report with TDD-verified patches. Finds the 35% of real defects that structural code review alone cannot catch. Works with any language. Trigger on 'quality playbook', 'spec audit', 'Council of Three', 'fitness-to-purpose', or 'coverage theater'.","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fquality-playbook\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fquality-playbook\u002FSKILL.md",[233,236],{"categoryNo":234,"categoryName":235,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":101,"categoryName":102,"taxonomyType":21,"taxonomyTypeDesc":22},[238,239,240,241,164,110,9,133,242,243,224,244,245,246,247,248,249,250,251,252,253,254,117,255,256,257,258],"playbook","quality playbook","quality","code review","tdd","run","report","spec","bug report","council","engineering","functional","spec audit","bug","verified","multi-model","three","coverage","model","regression","structural"]