[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C4NRJSYMS8DRT8341Z5MFW":3,"skill-same:01M6C4NRJSYMS8DRT8341Z5MFW":103},{"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":31,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":54,"commitSha":55,"skillDirectory":56,"forksCount":57,"repositoryHtmlUrl":58,"repositoryHomepageUrl":6,"ownerHtmlUrl":59,"ownerBlogUrl":60,"ownerDescription":61,"updatedAt":62,"install":63,"resources":76},"01M6C4NRJSYMS8DRT8341Z5MFW","chatgpt-app-sdk",null,"WHEN building ChatGPT apps using the OpenAI Apps SDK and MCP; NOT for OpenAI API chat completions, agent frameworks, or MCP servers with no ChatGPT widget; create conversational, composable experiences with proper UX, UI, state management, and server patterns.","mintuz\u002Fskills","mintuz","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F447031?v=4","01M6BVWJYSVR4XQC9AQCEMWQRG","Adam Bulmer","01M6C4DCXKNYZB281YB3PZDJJG",35,"MIT","https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Fchatgpt-app-sdk\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"sdk","chatgpt app sdk","chatgpt","management","MCP","api","server","ui","mcp servers","chatgpt apps","openai api","openai","ux","state","state management","create","composable","2026-11-10 10:12:30",false,"---\nname: chatgpt-app-sdk\ndescription: WHEN building ChatGPT apps using the OpenAI Apps SDK and MCP; NOT for OpenAI API chat completions, agent frameworks, or MCP servers with no ChatGPT widget; create conversational, composable experiences with proper UX, UI, state management, and server patterns.\n---\n\n# ChatGPT Apps SDK Best Practices\n\nBuild ChatGPT apps using the OpenAI Apps SDK, Model Context Protocol (MCP), and component-based UI patterns.\n\n## Quick Reference\n\n| Topic                                           | Guide                                                       |\n| ----------------------------------------------- | ----------------------------------------------------------- |\n| Display modes, visual design, accessibility     | [ui-guidelines.md](.\u002Freferences\u002Fui-guidelines.md)           |\n| MCP architecture, tools, and server patterns    | [mcp-server.md](.\u002Freferences\u002Fmcp-server.md)                 |\n| React patterns and window.openai API            | [ui-components.md](.\u002Freferences\u002Fui-components.md)           |\n| React hooks (useOpenAiGlobal, useWidgetState)   | [react-integration.md](.\u002Freferences\u002Freact-integration.md)   |\n| Three-tier state architecture and best practice | [state-management.md](.\u002Freferences\u002Fstate-management.md)     |\n\n## Critical Setup Requirements\n\n| Issue               | Prevention                                            |\n| ------------------- | ----------------------------------------------------- |\n| CORS blocking       | Enable `https:\u002F\u002Fchatgpt.com` origin on endpoints      |\n| Widget 404s         | Use `ui:\u002F\u002Fwidget\u002F` prefix format for widget resources |\n| Plain text display  | Set MIME type to `text\u002Fhtml+skybridge` for widgets    |\n| Tool not suggested  | Use action-oriented descriptions in tool definitions  |\n| Missing widget data | Pass initial data via `_meta.initialData` field       |\n| CSP script blocking | Reference external scripts from allowed CDN origins   |\n\n## The Payload Boundary Rule\n\nEvery other page in this skill defers to this rule.\n\n`structuredContent`, `content`, `_meta`, and widget state all reach the user's\nbrowser. `_meta` is widget-visible transport, not a private channel: the model\ndoes not read it, but the user can. Authorise and project on the server first,\nthen send only the projection the current view renders.\n\nKeep server-side: credentials, records the signed-in user may not see, internal\nfields the view does not render, raw diagnostics, stack traces, and technical\nlogs. Return safe error content with an opaque correlation ID for support cases.\n\nSend only the page or slice the view renders. To show more, return an opaque\ncursor or page argument and fetch the next page with another tool call.\n\n## Decision Trees\n\n### What display mode should I use?\n\n```\nIs this a multi-step workflow or deep exploration?\n├── Yes → Fullscreen\n└── No → Is this a parallel activity (game, live session)?\n    ├── Yes → Picture-in-Picture (PiP)\n    └── No → Inline\n        ├── Single item with quick action → Inline Card\n        └── 3-8 similar items → Inline Carousel\n```\n\n### Where should state live?\n\n```\nIs this data from your API\u002Fdatabase?\n├── Yes → MCP Server (Business Data)\n│   Return in structuredContent from tool calls\n└── No → Is it user preference\u002Fcross-session data?\n    ├── Yes → Backend Storage (via OAuth)\n    └── No → Widget State (UI-scoped, model-visible)\n        Use window.openai.widgetState \u002F useWidgetState\n```\n\nTreat widget state as model-visible context, not private client storage: ChatGPT\ncarries it into the conversation, where it costs tokens on later turns and the\nuser can read it. Keep only identifiers and view preferences, such as selected\nID, current page, current step, and sort order. Never keep answers, records, file\ncontents, or credentials there; store those on the server and re-fetch them with\na tool call.\n\nA widget runs only while ChatGPT renders it. It cannot run in the background,\nwake up later, or act after the user leaves the conversation. Put scheduled work,\nwaiting, and outbound notifications on the MCP server or another system you\ncontrol, and let the next tool call report the result.\n\n### Should this be a separate tool?\n\n```\nIs this action:\n- Atomic and standalone?\n- Invokable by the model via natural language?\n- Returning structured data?\n├── Yes → Create public tool (model-accessible)\n└── No → Is it only for widget interactions?\n    ├── Yes → Use private tool (\"openai\u002Fvisibility\": \"private\")\n    └── No → Handle within existing tool logic\n```\n\n### What should go in structuredContent vs \\_meta?\n\n```\nDoes the model need this data to:\n- Understand results?\n- Generate follow-ups?\n- Reason about next steps?\n├── Yes → structuredContent (concise, model-readable)\n└── No → _meta (the authorised projection the widget renders)\n```\n\nDisplay-only data (precomputed series, layout hints) belongs in `_meta`; the\nmodel does not reason about it. Apply the payload boundary rule to both halves.\n\n### Should I use custom UI or just text?\n\n```\nDoes this require:\n- User input beyond text?\n- Structured data visualization?\n- Interactive selection\u002Ffiltering?\n├── Yes → Custom UI component\n└── No → Return plain text\u002Fmarkdown in content\n```\n\n# Official Documentation\n\n- MCP Specification: https:\u002F\u002Fmodelcontextprotocol.io\n- TypeScript MCP SDK: https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Ftypescript-sdk\n- OpenAI Apps SDK: https:\u002F\u002Fdevelopers.openai.com\u002Fapps-sdk\n- MCP Apps Extension: http:\u002F\u002Fblog.modelcontextprotocol.io\u002Fposts\u002F2025-11-21-mcp-apps\n- ChatGPT Component Library: https:\u002F\u002Fopenai.github.io\u002Fapps-sdk-ui\n","# ChatGPT Apps SDK Best Practices\n\nBuild ChatGPT apps using the OpenAI Apps SDK, Model Context Protocol (MCP), and component-based UI patterns.\n\n## Quick Reference\n\n| Topic                                           | Guide                                                       |\n| ----------------------------------------------- | ----------------------------------------------------------- |\n| Display modes, visual design, accessibility     | [ui-guidelines.md](.\u002Freferences\u002Fui-guidelines.md)           |\n| MCP architecture, tools, and server patterns    | [mcp-server.md](.\u002Freferences\u002Fmcp-server.md)                 |\n| React patterns and window.openai API            | [ui-components.md](.\u002Freferences\u002Fui-components.md)           |\n| React hooks (useOpenAiGlobal, useWidgetState)   | [react-integration.md](.\u002Freferences\u002Freact-integration.md)   |\n| Three-tier state architecture and best practice | [state-management.md](.\u002Freferences\u002Fstate-management.md)     |\n\n## Critical Setup Requirements\n\n| Issue               | Prevention                                            |\n| ------------------- | ----------------------------------------------------- |\n| CORS blocking       | Enable `https:\u002F\u002Fchatgpt.com` origin on endpoints      |\n| Widget 404s         | Use `ui:\u002F\u002Fwidget\u002F` prefix format for widget resources |\n| Plain text display  | Set MIME type to `text\u002Fhtml+skybridge` for widgets    |\n| Tool not suggested  | Use action-oriented descriptions in tool definitions  |\n| Missing widget data | Pass initial data via `_meta.initialData` field       |\n| CSP script blocking | Reference external scripts from allowed CDN origins   |\n\n## The Payload Boundary Rule\n\nEvery other page in this skill defers to this rule.\n\n`structuredContent`, `content`, `_meta`, and widget state all reach the user's\nbrowser. `_meta` is widget-visible transport, not a private channel: the model\ndoes not read it, but the user can. Authorise and project on the server first,\nthen send only the projection the current view renders.\n\nKeep server-side: credentials, records the signed-in user may not see, internal\nfields the view does not render, raw diagnostics, stack traces, and technical\nlogs. Return safe error content with an opaque correlation ID for support cases.\n\nSend only the page or slice the view renders. To show more, return an opaque\ncursor or page argument and fetch the next page with another tool call.\n\n## Decision Trees\n\n### What display mode should I use?\n\n```\nIs this a multi-step workflow or deep exploration?\n├── Yes → Fullscreen\n└── No → Is this a parallel activity (game, live session)?\n    ├── Yes → Picture-in-Picture (PiP)\n    └── No → Inline\n        ├── Single item with quick action → Inline Card\n        └── 3-8 similar items → Inline Carousel\n```\n\n### Where should state live?\n\n```\nIs this data from your API\u002Fdatabase?\n├── Yes → MCP Server (Business Data)\n│   Return in structuredContent from tool calls\n└── No → Is it user preference\u002Fcross-session data?\n    ├── Yes → Backend Storage (via OAuth)\n    └── No → Widget State (UI-scoped, model-visible)\n        Use window.openai.widgetState \u002F useWidgetState\n```\n\nTreat widget state as model-visible context, not private client storage: ChatGPT\ncarries it into the conversation, where it costs tokens on later turns and the\nuser can read it. Keep only identifiers and view preferences, such as selected\nID, current page, current step, and sort order. Never keep answers, records, file\ncontents, or credentials there; store those on the server and re-fetch them with\na tool call.\n\nA widget runs only while ChatGPT renders it. It cannot run in the background,\nwake up later, or act after the user leaves the conversation. Put scheduled work,\nwaiting, and outbound notifications on the MCP server or another system you\ncontrol, and let the next tool call report the result.\n\n### Should this be a separate tool?\n\n```\nIs this action:\n- Atomic and standalone?\n- Invokable by the model via natural language?\n- Returning structured data?\n├── Yes → Create public tool (model-accessible)\n└── No → Is it only for widget interactions?\n    ├── Yes → Use private tool (\"openai\u002Fvisibility\": \"private\")\n    └── No → Handle within existing tool logic\n```\n\n### What should go in structuredContent vs \\_meta?\n\n```\nDoes the model need this data to:\n- Understand results?\n- Generate follow-ups?\n- Reason about next steps?\n├── Yes → structuredContent (concise, model-readable)\n└── No → _meta (the authorised projection the widget renders)\n```\n\nDisplay-only data (precomputed series, layout hints) belongs in `_meta`; the\nmodel does not reason about it. Apply the payload boundary rule to both halves.\n\n### Should I use custom UI or just text?\n\n```\nDoes this require:\n- User input beyond text?\n- Structured data visualization?\n- Interactive selection\u002Ffiltering?\n├── Yes → Custom UI component\n└── No → Return plain text\u002Fmarkdown in content\n```\n\n# Official Documentation\n\n- MCP Specification: https:\u002F\u002Fmodelcontextprotocol.io\n- TypeScript MCP SDK: https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Ftypescript-sdk\n- OpenAI Apps SDK: https:\u002F\u002Fdevelopers.openai.com\u002Fapps-sdk\n- MCP Apps Extension: http:\u002F\u002Fblog.modelcontextprotocol.io\u002Fposts\u002F2025-11-21-mcp-apps\n- ChatGPT Component Library: https:\u002F\u002Fopenai.github.io\u002Fapps-sdk-ui\n",{"name":5,"description":7},"main","4e0a12b5048eac78a3ace4feee657873cdd530ef","src\u002Fweb\u002Fskills\u002Fchatgpt-app-sdk",7,"https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills","https:\u002F\u002Fgithub.com\u002Fmintuz","http:\u002F\u002Fwww.mintuz.com","Working at @monzo, Previously worked at Moonpig, @booking and @bbc","2026-11-11 15:50:19",{"source":8,"skillName":5,"commands":64,"prompt":74,"zipAvailable":75},[65,68,71],{"tool":66,"command":67},"npx","npx skills add mintuz\u002Fskills --skill chatgpt-app-sdk",{"tool":69,"command":70},"bunx","bunx skills add mintuz\u002Fskills --skill chatgpt-app-sdk",{"tool":72,"command":73},"pnpm","pnpm dlx skills add mintuz\u002Fskills --skill chatgpt-app-sdk","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Fchatgpt-app-sdk\u002FSKILL.md",true,[77,83,87,91,95,99],{"path":78,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":81,"sourceHtmlUrl":82},"references\u002Flocal-tunnel-setup.md","REFERENCE","参考文档",3471,"https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Fchatgpt-app-sdk\u002Freferences\u002Flocal-tunnel-setup.md",{"path":84,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":85,"sourceHtmlUrl":86},"references\u002Fmcp-server.md",6403,"https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Fchatgpt-app-sdk\u002Freferences\u002Fmcp-server.md",{"path":88,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":89,"sourceHtmlUrl":90},"references\u002Freact-integration.md",13012,"https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Fchatgpt-app-sdk\u002Freferences\u002Freact-integration.md",{"path":92,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":93,"sourceHtmlUrl":94},"references\u002Fstate-management.md",4846,"https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Fchatgpt-app-sdk\u002Freferences\u002Fstate-management.md",{"path":96,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":97,"sourceHtmlUrl":98},"references\u002Fui-components.md",4206,"https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Fchatgpt-app-sdk\u002Freferences\u002Fui-components.md",{"path":100,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":101,"sourceHtmlUrl":102},"references\u002Fui-guidelines.md",2691,"https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Fchatgpt-app-sdk\u002Freferences\u002Fui-guidelines.md",[104,124,142,155,176,190],{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":116,"publishedAt":49},"01M6C4PDGB6ZZWBS35N3DF7PZZ","xstate","WHEN React state changes in response to an external answer — async submit, in-flight or loading flags, retries, cancellation, polling, optimistic updates, stale responses — or to an interaction with an interruptible middle, such as a drag or a gesture; or WHEN building, reviewing, testing, or visualising XState 5 actors and @xstate\u002Freact integrations; NOT for a value one event sets completely, such as a text draft, a focus flag, or a plain open and closed toggle; models typed lifecycles and renders legal Mermaid stateDiagram-v2 charts.","https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Fxstate\u002FSKILL.md",[110,113],{"categoryNo":111,"categoryName":112,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":114,"categoryName":115,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[106,117,118,119,120,121,45,122,123],"integrations","react","text","open","Charts","mermaid","testing",{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":134,"publishedAt":49},"01M6C4PB6VVC2X19B63B7YNH0T","web-design","WHEN refining UI layout, typography, color, or polish; NOT code implementation; provides concise principles for intentional, legible design.","https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Fweb-design\u002FSKILL.md",[130,133],{"categoryNo":131,"categoryName":132,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},[135,136,137,138,139,39,140,141],"design","web","web design","code","code implementation","polish","typography",{"skillNo":143,"name":144,"nameZh":6,"description":145,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":149,"publishedAt":49},"01M6C4P8D92GJDA49V7X1CZXEV","tailwind","WHEN building design systems or component libraries with Tailwind CSS; covers design tokens, CVA patterns and dark mode.","https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Ftailwind\u002FSKILL.md",[148],{"categoryNo":131,"categoryName":132,"taxonomyType":21,"taxonomyTypeDesc":22},[150,135,151,152,153,154],"Tailwind","css","component","libraries","design systems",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":164,"publishedAt":49},"01M6C4P5VWQ69Q32DA0634GDJY","refactoring","WHEN you need a plan to refactor, restructure, or clean up working code and the test result is known, either green or a recorded failing set; NOT for new feature delivery or any behavior change; reversible-baseline safety with prioritized improvements.","https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Frefactoring\u002FSKILL.md",[161],{"categoryNo":162,"categoryName":163,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查",[157,165,166,167,168,169,170,171,172,173,174,138,175],"baseline","SET","plan","behavior","new feature","up","Safety","test","change","feature delivery","refactor",{"skillNo":177,"name":118,"nameZh":6,"description":178,"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":183,"publishedAt":49},"01M6C4P345APEFEX00J8T7QMXQ","WHEN building or changing React components, pages, hooks, effects, or apps, including edits to existing components; NOT for test code (react-testing) or styling (css, tailwind); enforces scalable architecture, state management, API layer, performance patterns.","https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Freact\u002FSKILL.md",[181,182],{"categoryNo":111,"categoryName":112,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":114,"categoryName":115,"taxonomyType":21,"taxonomyTypeDesc":22},[118,184,123,151,185,172,186,187,46,138,45,37,150,35,188,189],"react components","performance","components","architecture","hooks","styling",{"skillNo":191,"name":192,"nameZh":6,"description":193,"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":198,"publishedAt":49},"01M6C4P0DK385QBG3B3S86TQV2","react-testing","WHEN testing React components\u002Fhooks\u002Fcontext with React Testing Library; NOT e2e; covers renderHook, providers, forms, and anti-patterns.","https:\u002F\u002Fgithub.com\u002Fmintuz\u002Fskills\u002Fblob\u002Fmain\u002Fsrc\u002Fweb\u002Fskills\u002Freact-testing\u002FSKILL.md",[196,197],{"categoryNo":111,"categoryName":112,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":114,"categoryName":115,"taxonomyType":21,"taxonomyTypeDesc":22},[123,199,118,186,184,200,201,202,203,204,205,188],"react testing","testing library","library","Providers","e2e","context","anti-patterns"]