[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71QXR7MJD1NSFW62VKT6GKK":3,"skill-same:01M71QXR7MJD1NSFW62VKT6GKK":361},{"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":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":53,"commitSha":54,"skillDirectory":55,"forksCount":14,"repositoryHtmlUrl":56,"repositoryHomepageUrl":6,"ownerHtmlUrl":57,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":58,"install":59,"resources":72},"01M71QXR7MJD1NSFW62VKT6GKK","vercel-react-best-practices",null,"Use for React\u002FNext.js performance optimization. 67 rules across async, bundle, client, render, JS micro-perf. Triggers on React components, Next.js pages, data fetching, perf review, hydration issues.","brunosps\u002Fwinbox-gui","brunosps","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F595279?v=4","01M71QRD207EQMJDG484AS73XS","Bruno Santos","01M71QRD2KPFF4TWM1QRJMFHZP",0,"MIT","https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"react best practices","vercel react best practices","vercel","best practices","react","async","Optimization","for","perf","data","read","next","react components","across","review","data fetching","components","issues","render","performance","2026-11-10 13:02:02",false,"---\nname: vercel-react-best-practices\ndescription: Use for React\u002FNext.js performance optimization. 67 rules across async, bundle, client, render, JS micro-perf. Triggers on React components, Next.js pages, data fetching, perf review, hydration issues.\nallowed-tools:\n  - Read\nlicense: MIT\nmetadata:\n  author: vercel\n  version: \"1.0.0\"\n---\n\n# Vercel React Best Practices\n\nComprehensive performance optimization guide for React and Next.js applications, maintained by Vercel. Contains 67 rules across 8 categories, prioritized by impact to guide automated refactoring and code generation.\n\n## When to Apply\n\nReference these guidelines when:\n- Writing new React components or Next.js pages\n- Implementing data fetching (client or server-side)\n- Reviewing code for performance issues\n- Refactoring existing React\u002FNext.js code\n- Optimizing bundle size or load times\n\n## Rule Categories by Priority\n\n| Priority | Category | Impact | Prefix |\n|----------|----------|--------|--------|\n| 1 | Eliminating Waterfalls | CRITICAL | `async-` |\n| 2 | Bundle Size Optimization | CRITICAL | `bundle-` |\n| 3 | Server-Side Performance | HIGH | `server-` |\n| 4 | Client-Side Data Fetching | MEDIUM-HIGH | `client-` |\n| 5 | Re-render Optimization | MEDIUM | `rerender-` |\n| 6 | Rendering Performance | MEDIUM | `rendering-` |\n| 7 | JavaScript Performance | LOW-MEDIUM | `js-` |\n| 8 | Advanced Patterns | LOW | `advanced-` |\n\n## Quick Reference\n\n### 1. Eliminating Waterfalls (CRITICAL)\n\n- `async-cheap-condition-before-await` - Check cheap sync conditions before awaiting flags or remote values\n- `async-defer-await` - Move await into branches where actually used\n- `async-parallel` - Use Promise.all() for independent operations\n- `async-dependencies` - Use better-all for partial dependencies\n- `async-api-routes` - Start promises early, await late in API routes\n- `async-suspense-boundaries` - Use Suspense to stream content\n\n### 2. Bundle Size Optimization (CRITICAL)\n\n- `bundle-barrel-imports` - Import directly, avoid barrel files\n- `bundle-dynamic-imports` - Use next\u002Fdynamic for heavy components\n- `bundle-defer-third-party` - Load analytics\u002Flogging after hydration\n- `bundle-conditional` - Load modules only when feature is activated\n- `bundle-preload` - Preload on hover\u002Ffocus for perceived speed\n\n### 3. Server-Side Performance (HIGH)\n\n- `server-auth-actions` - Authenticate server actions like API routes\n- `server-cache-react` - Use React.cache() for per-request deduplication\n- `server-cache-lru` - Use LRU cache for cross-request caching\n- `server-dedup-props` - Avoid duplicate serialization in RSC props\n- `server-hoist-static-io` - Hoist static I\u002FO (fonts, logos) to module level\n- `server-serialization` - Minimize data passed to client components\n- `server-parallel-fetching` - Restructure components to parallelize fetches\n- `server-parallel-nested-fetching` - Chain nested fetches per item in Promise.all\n- `server-after-nonblocking` - Use after() for non-blocking operations\n\n### 4. Client-Side Data Fetching (MEDIUM-HIGH)\n\n- `client-swr-dedup` - Use SWR for automatic request deduplication\n- `client-event-listeners` - Deduplicate global event listeners\n- `client-passive-event-listeners` - Use passive listeners for scroll\n- `client-localstorage-schema` - Version and minimize localStorage data\n\n### 5. Re-render Optimization (MEDIUM)\n\n- `rerender-defer-reads` - Don't subscribe to state only used in callbacks\n- `rerender-memo` - Extract expensive work into memoized components\n- `rerender-memo-with-default-value` - Hoist default non-primitive props\n- `rerender-dependencies` - Use primitive dependencies in effects\n- `rerender-derived-state` - Subscribe to derived booleans, not raw values\n- `rerender-derived-state-no-effect` - Derive state during render, not effects\n- `rerender-functional-setstate` - Use functional setState for stable callbacks\n- `rerender-lazy-state-init` - Pass function to useState for expensive values\n- `rerender-simple-expression-in-memo` - Avoid memo for simple primitives\n- `rerender-split-combined-hooks` - Split hooks with independent dependencies\n- `rerender-move-effect-to-event` - Put interaction logic in event handlers\n- `rerender-transitions` - Use startTransition for non-urgent updates\n- `rerender-use-deferred-value` - Defer expensive renders to keep input responsive\n- `rerender-use-ref-transient-values` - Use refs for transient frequent values\n- `rerender-no-inline-components` - Don't define components inside components\n\n### 6. Rendering Performance (MEDIUM)\n\n- `rendering-animate-svg-wrapper` - Animate div wrapper, not SVG element\n- `rendering-content-visibility` - Use content-visibility for long lists\n- `rendering-hoist-jsx` - Extract static JSX outside components\n- `rendering-svg-precision` - Reduce SVG coordinate precision\n- `rendering-hydration-no-flicker` - Use inline script for client-only data\n- `rendering-hydration-suppress-warning` - Suppress expected mismatches\n- `rendering-activity` - Use Activity component for show\u002Fhide\n- `rendering-conditional-render` - Use ternary, not && for conditionals\n- `rendering-usetransition-loading` - Prefer useTransition for loading state\n- `rendering-resource-hints` - Use React DOM resource hints for preloading\n- `rendering-script-defer-async` - Use defer or async on script tags\n\n### 7. JavaScript Performance (LOW-MEDIUM)\n\n- `js-batch-dom-css` - Group CSS changes via classes or cssText\n- `js-index-maps` - Build Map for repeated lookups\n- `js-cache-property-access` - Cache object properties in loops\n- `js-cache-function-results` - Cache function results in module-level Map\n- `js-cache-storage` - Cache localStorage\u002FsessionStorage reads\n- `js-combine-iterations` - Combine multiple filter\u002Fmap into one loop\n- `js-length-check-first` - Check array length before expensive comparison\n- `js-early-exit` - Return early from functions\n- `js-hoist-regexp` - Hoist RegExp creation outside loops\n- `js-min-max-loop` - Use loop for min\u002Fmax instead of sort\n- `js-set-map-lookups` - Use Set\u002FMap for O(1) lookups\n- `js-tosorted-immutable` - Use toSorted() for immutability\n- `js-flatmap-filter` - Use flatMap to map and filter in one pass\n- `js-request-idle-callback` - Defer non-critical work to browser idle time\n\n### 8. Advanced Patterns (LOW)\n\n- `advanced-event-handler-refs` - Store event handlers in refs\n- `advanced-init-once` - Initialize app once per app load\n- `advanced-use-latest` - useLatest for stable callback refs\n\n## How to Use\n\nRead individual rule files for detailed explanations and code examples:\n\n```\nrules\u002Fasync-parallel.md\nrules\u002Fbundle-barrel-imports.md\n```\n\nEach rule file contains:\n- Brief explanation of why it matters\n- Incorrect code example with explanation\n- Correct code example with explanation\n- Additional context and references\n\n## Full Compiled Document\n\nFor the complete guide with all rules expanded: `AGENTS.md`\n\n## References\n\n- `references\u002Fperf-discipline.md` — workflow discipline (measure → identify → fix → verify → guard) that wraps the per-rule recipes above. Use when tackling performance work; cite the metric and tool before applying any rule. Adapted from [`addyosmani\u002Fagent-skills\u002Fperformance-optimization`](https:\u002F\u002Fgithub.com\u002Faddyosmani\u002Fagent-skills\u002Ftree\u002Fmain\u002Fperformance-optimization) (MIT).\n\n## Structured Return\n\nWhen invoked directly or by a harness, return or merge this block:\n\n- **Status:** `PASS` when selected rules are evidence-backed and verified, `FINDINGS` when React\u002FNext.js performance issues remain, `BLOCKED` when baseline metrics or app context are missing, `NOT_APPLICABLE` when no React\u002FNext.js performance surface is in scope.\n- **Scope:** route\u002Fcomponent, framework mode, metric, and selected rule category.\n- **Evidence:** baseline measurement, trace\u002Fprofile\u002Fbuild output, rule references, and affected code paths.\n- **Artifacts:** recommendation, code path, perf log, bundle report, or guard test.\n- **Decisions:** rule selected, metric target, and rejected optimizations.\n- **Risks:** premature optimization, hydration mismatch, cache staleness, bundle bloat, or rerender regressions.\n- **Next Step:** measure, apply rule, verify, or add regression guard.\n","# Vercel React Best Practices\n\nComprehensive performance optimization guide for React and Next.js applications, maintained by Vercel. Contains 67 rules across 8 categories, prioritized by impact to guide automated refactoring and code generation.\n\n## When to Apply\n\nReference these guidelines when:\n- Writing new React components or Next.js pages\n- Implementing data fetching (client or server-side)\n- Reviewing code for performance issues\n- Refactoring existing React\u002FNext.js code\n- Optimizing bundle size or load times\n\n## Rule Categories by Priority\n\n| Priority | Category | Impact | Prefix |\n|----------|----------|--------|--------|\n| 1 | Eliminating Waterfalls | CRITICAL | `async-` |\n| 2 | Bundle Size Optimization | CRITICAL | `bundle-` |\n| 3 | Server-Side Performance | HIGH | `server-` |\n| 4 | Client-Side Data Fetching | MEDIUM-HIGH | `client-` |\n| 5 | Re-render Optimization | MEDIUM | `rerender-` |\n| 6 | Rendering Performance | MEDIUM | `rendering-` |\n| 7 | JavaScript Performance | LOW-MEDIUM | `js-` |\n| 8 | Advanced Patterns | LOW | `advanced-` |\n\n## Quick Reference\n\n### 1. Eliminating Waterfalls (CRITICAL)\n\n- `async-cheap-condition-before-await` - Check cheap sync conditions before awaiting flags or remote values\n- `async-defer-await` - Move await into branches where actually used\n- `async-parallel` - Use Promise.all() for independent operations\n- `async-dependencies` - Use better-all for partial dependencies\n- `async-api-routes` - Start promises early, await late in API routes\n- `async-suspense-boundaries` - Use Suspense to stream content\n\n### 2. Bundle Size Optimization (CRITICAL)\n\n- `bundle-barrel-imports` - Import directly, avoid barrel files\n- `bundle-dynamic-imports` - Use next\u002Fdynamic for heavy components\n- `bundle-defer-third-party` - Load analytics\u002Flogging after hydration\n- `bundle-conditional` - Load modules only when feature is activated\n- `bundle-preload` - Preload on hover\u002Ffocus for perceived speed\n\n### 3. Server-Side Performance (HIGH)\n\n- `server-auth-actions` - Authenticate server actions like API routes\n- `server-cache-react` - Use React.cache() for per-request deduplication\n- `server-cache-lru` - Use LRU cache for cross-request caching\n- `server-dedup-props` - Avoid duplicate serialization in RSC props\n- `server-hoist-static-io` - Hoist static I\u002FO (fonts, logos) to module level\n- `server-serialization` - Minimize data passed to client components\n- `server-parallel-fetching` - Restructure components to parallelize fetches\n- `server-parallel-nested-fetching` - Chain nested fetches per item in Promise.all\n- `server-after-nonblocking` - Use after() for non-blocking operations\n\n### 4. Client-Side Data Fetching (MEDIUM-HIGH)\n\n- `client-swr-dedup` - Use SWR for automatic request deduplication\n- `client-event-listeners` - Deduplicate global event listeners\n- `client-passive-event-listeners` - Use passive listeners for scroll\n- `client-localstorage-schema` - Version and minimize localStorage data\n\n### 5. Re-render Optimization (MEDIUM)\n\n- `rerender-defer-reads` - Don't subscribe to state only used in callbacks\n- `rerender-memo` - Extract expensive work into memoized components\n- `rerender-memo-with-default-value` - Hoist default non-primitive props\n- `rerender-dependencies` - Use primitive dependencies in effects\n- `rerender-derived-state` - Subscribe to derived booleans, not raw values\n- `rerender-derived-state-no-effect` - Derive state during render, not effects\n- `rerender-functional-setstate` - Use functional setState for stable callbacks\n- `rerender-lazy-state-init` - Pass function to useState for expensive values\n- `rerender-simple-expression-in-memo` - Avoid memo for simple primitives\n- `rerender-split-combined-hooks` - Split hooks with independent dependencies\n- `rerender-move-effect-to-event` - Put interaction logic in event handlers\n- `rerender-transitions` - Use startTransition for non-urgent updates\n- `rerender-use-deferred-value` - Defer expensive renders to keep input responsive\n- `rerender-use-ref-transient-values` - Use refs for transient frequent values\n- `rerender-no-inline-components` - Don't define components inside components\n\n### 6. Rendering Performance (MEDIUM)\n\n- `rendering-animate-svg-wrapper` - Animate div wrapper, not SVG element\n- `rendering-content-visibility` - Use content-visibility for long lists\n- `rendering-hoist-jsx` - Extract static JSX outside components\n- `rendering-svg-precision` - Reduce SVG coordinate precision\n- `rendering-hydration-no-flicker` - Use inline script for client-only data\n- `rendering-hydration-suppress-warning` - Suppress expected mismatches\n- `rendering-activity` - Use Activity component for show\u002Fhide\n- `rendering-conditional-render` - Use ternary, not && for conditionals\n- `rendering-usetransition-loading` - Prefer useTransition for loading state\n- `rendering-resource-hints` - Use React DOM resource hints for preloading\n- `rendering-script-defer-async` - Use defer or async on script tags\n\n### 7. JavaScript Performance (LOW-MEDIUM)\n\n- `js-batch-dom-css` - Group CSS changes via classes or cssText\n- `js-index-maps` - Build Map for repeated lookups\n- `js-cache-property-access` - Cache object properties in loops\n- `js-cache-function-results` - Cache function results in module-level Map\n- `js-cache-storage` - Cache localStorage\u002FsessionStorage reads\n- `js-combine-iterations` - Combine multiple filter\u002Fmap into one loop\n- `js-length-check-first` - Check array length before expensive comparison\n- `js-early-exit` - Return early from functions\n- `js-hoist-regexp` - Hoist RegExp creation outside loops\n- `js-min-max-loop` - Use loop for min\u002Fmax instead of sort\n- `js-set-map-lookups` - Use Set\u002FMap for O(1) lookups\n- `js-tosorted-immutable` - Use toSorted() for immutability\n- `js-flatmap-filter` - Use flatMap to map and filter in one pass\n- `js-request-idle-callback` - Defer non-critical work to browser idle time\n\n### 8. Advanced Patterns (LOW)\n\n- `advanced-event-handler-refs` - Store event handlers in refs\n- `advanced-init-once` - Initialize app once per app load\n- `advanced-use-latest` - useLatest for stable callback refs\n\n## How to Use\n\nRead individual rule files for detailed explanations and code examples:\n\n```\nrules\u002Fasync-parallel.md\nrules\u002Fbundle-barrel-imports.md\n```\n\nEach rule file contains:\n- Brief explanation of why it matters\n- Incorrect code example with explanation\n- Correct code example with explanation\n- Additional context and references\n\n## Full Compiled Document\n\nFor the complete guide with all rules expanded: `AGENTS.md`\n\n## References\n\n- `references\u002Fperf-discipline.md` — workflow discipline (measure → identify → fix → verify → guard) that wraps the per-rule recipes above. Use when tackling performance work; cite the metric and tool before applying any rule. Adapted from [`addyosmani\u002Fagent-skills\u002Fperformance-optimization`](https:\u002F\u002Fgithub.com\u002Faddyosmani\u002Fagent-skills\u002Ftree\u002Fmain\u002Fperformance-optimization) (MIT).\n\n## Structured Return\n\nWhen invoked directly or by a harness, return or merge this block:\n\n- **Status:** `PASS` when selected rules are evidence-backed and verified, `FINDINGS` when React\u002FNext.js performance issues remain, `BLOCKED` when baseline metrics or app context are missing, `NOT_APPLICABLE` when no React\u002FNext.js performance surface is in scope.\n- **Scope:** route\u002Fcomponent, framework mode, metric, and selected rule category.\n- **Evidence:** baseline measurement, trace\u002Fprofile\u002Fbuild output, rule references, and affected code paths.\n- **Artifacts:** recommendation, code path, perf log, bundle report, or guard test.\n- **Decisions:** rule selected, metric target, and rejected optimizations.\n- **Risks:** premature optimization, hydration mismatch, cache staleness, bundle bloat, or rerender regressions.\n- **Next Step:** measure, apply rule, verify, or add regression guard.\n",{"name":5,"license":15,"metadata":49,"description":7,"allowed-tools":51},{"author":26,"version":50},"1.0.0",[52],"Read","main","f04e65ab4887e349c14e5cd0af493f599eb159ca",".agents\u002Fskills\u002Fvercel-react-best-practices","https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui","https:\u002F\u002Fgithub.com\u002Fbrunosps","2026-09-08 04:21:13",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add brunosps\u002Fwinbox-gui --skill vercel-react-best-practices",{"tool":65,"command":66},"bunx","bunx skills add brunosps\u002Fwinbox-gui --skill vercel-react-best-practices",{"tool":68,"command":69},"pnpm","pnpm dlx skills add brunosps\u002Fwinbox-gui --skill vercel-react-best-practices","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002FSKILL.md",true,[73,79,83,87,91,95,99,103,107,111,115,119,123,127,131,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191,195,199,203,207,211,215,218,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290,294,298,302,306,310,314,318,322,326,330,334,338,342,346,350,353,357],{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"AGENTS.md","REFERENCE","参考文档",102219,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002FAGENTS.md",{"path":80,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":81,"sourceHtmlUrl":82},"README.md",3360,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002FREADME.md",{"path":84,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":85,"sourceHtmlUrl":86},"references\u002Fperf-discipline.md",6059,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Freferences\u002Fperf-discipline.md",{"path":88,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":89,"sourceHtmlUrl":90},"rules\u002F_sections.md",1554,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002F_sections.md",{"path":92,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":93,"sourceHtmlUrl":94},"rules\u002F_template.md",631,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002F_template.md",{"path":96,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":97,"sourceHtmlUrl":98},"rules\u002Fadvanced-event-handler-refs.md",1483,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fadvanced-event-handler-refs.md",{"path":100,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":101,"sourceHtmlUrl":102},"rules\u002Fadvanced-init-once.md",958,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fadvanced-init-once.md",{"path":104,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":105,"sourceHtmlUrl":106},"rules\u002Fadvanced-use-latest.md",1072,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fadvanced-use-latest.md",{"path":108,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":109,"sourceHtmlUrl":110},"rules\u002Fasync-api-routes.md",1125,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fasync-api-routes.md",{"path":112,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":113,"sourceHtmlUrl":114},"rules\u002Fasync-cheap-condition-before-await.md",1220,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fasync-cheap-condition-before-await.md",{"path":116,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":117,"sourceHtmlUrl":118},"rules\u002Fasync-defer-await.md",2208,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fasync-defer-await.md",{"path":120,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":121,"sourceHtmlUrl":122},"rules\u002Fasync-dependencies.md",1293,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fasync-dependencies.md",{"path":124,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":125,"sourceHtmlUrl":126},"rules\u002Fasync-parallel.md",654,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fasync-parallel.md",{"path":128,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":129,"sourceHtmlUrl":130},"rules\u002Fasync-suspense-boundaries.md",2510,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fasync-suspense-boundaries.md",{"path":132,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":133,"sourceHtmlUrl":134},"rules\u002Fbundle-barrel-imports.md",2795,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fbundle-barrel-imports.md",{"path":136,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":137,"sourceHtmlUrl":138},"rules\u002Fbundle-conditional.md",949,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fbundle-conditional.md",{"path":140,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":141,"sourceHtmlUrl":142},"rules\u002Fbundle-defer-third-party.md",920,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fbundle-defer-third-party.md",{"path":144,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":145,"sourceHtmlUrl":146},"rules\u002Fbundle-dynamic-imports.md",791,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fbundle-dynamic-imports.md",{"path":148,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":149,"sourceHtmlUrl":150},"rules\u002Fbundle-preload.md",1149,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fbundle-preload.md",{"path":152,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":153,"sourceHtmlUrl":154},"rules\u002Fclient-event-listeners.md",1969,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fclient-event-listeners.md",{"path":156,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":157,"sourceHtmlUrl":158},"rules\u002Fclient-localstorage-schema.md",1950,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fclient-localstorage-schema.md",{"path":160,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":161,"sourceHtmlUrl":162},"rules\u002Fclient-passive-event-listeners.md",1644,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fclient-passive-event-listeners.md",{"path":164,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":165,"sourceHtmlUrl":166},"rules\u002Fclient-swr-dedup.md",1159,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fclient-swr-dedup.md",{"path":168,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":169,"sourceHtmlUrl":170},"rules\u002Fjs-batch-dom-css.md",3266,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fjs-batch-dom-css.md",{"path":172,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":173,"sourceHtmlUrl":174},"rules\u002Fjs-cache-function-results.md",1949,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fjs-cache-function-results.md",{"path":176,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":177,"sourceHtmlUrl":178},"rules\u002Fjs-cache-property-access.md",532,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fjs-cache-property-access.md",{"path":180,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":181,"sourceHtmlUrl":182},"rules\u002Fjs-cache-storage.md",1651,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fjs-cache-storage.md",{"path":184,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":185,"sourceHtmlUrl":186},"rules\u002Fjs-combine-iterations.md",753,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fjs-combine-iterations.md",{"path":188,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":189,"sourceHtmlUrl":190},"rules\u002Fjs-early-exit.md",1133,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fjs-early-exit.md",{"path":192,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":193,"sourceHtmlUrl":194},"rules\u002Fjs-flatmap-filter.md",1411,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fjs-flatmap-filter.md",{"path":196,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":197,"sourceHtmlUrl":198},"rules\u002Fjs-hoist-regexp.md",1028,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fjs-hoist-regexp.md",{"path":200,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":201,"sourceHtmlUrl":202},"rules\u002Fjs-index-maps.md",837,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fjs-index-maps.md",{"path":204,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":205,"sourceHtmlUrl":206},"rules\u002Fjs-length-check-first.md",1747,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fjs-length-check-first.md",{"path":208,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":209,"sourceHtmlUrl":210},"rules\u002Fjs-min-max-loop.md",2290,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fjs-min-max-loop.md",{"path":212,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":213,"sourceHtmlUrl":214},"rules\u002Fjs-request-idle-callback.md",2647,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fjs-request-idle-callback.md",{"path":216,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":177,"sourceHtmlUrl":217},"rules\u002Fjs-set-map-lookups.md","https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fjs-set-map-lookups.md",{"path":219,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":220,"sourceHtmlUrl":221},"rules\u002Fjs-tosorted-immutable.md",1782,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fjs-tosorted-immutable.md",{"path":223,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":224,"sourceHtmlUrl":225},"rules\u002Frendering-activity.md",564,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frendering-activity.md",{"path":227,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":228,"sourceHtmlUrl":229},"rules\u002Frendering-animate-svg-wrapper.md",1185,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frendering-animate-svg-wrapper.md",{"path":231,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":232,"sourceHtmlUrl":233},"rules\u002Frendering-conditional-render.md",980,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frendering-conditional-render.md",{"path":235,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":236,"sourceHtmlUrl":237},"rules\u002Frendering-content-visibility.md",815,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frendering-content-visibility.md",{"path":239,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":240,"sourceHtmlUrl":241},"rules\u002Frendering-hoist-jsx.md",1039,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frendering-hoist-jsx.md",{"path":243,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":244,"sourceHtmlUrl":245},"rules\u002Frendering-hydration-no-flicker.md",2308,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frendering-hydration-no-flicker.md",{"path":247,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":248,"sourceHtmlUrl":249},"rules\u002Frendering-hydration-suppress-warning.md",872,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frendering-hydration-suppress-warning.md",{"path":251,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":252,"sourceHtmlUrl":253},"rules\u002Frendering-resource-hints.md",2549,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frendering-resource-hints.md",{"path":255,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":256,"sourceHtmlUrl":257},"rules\u002Frendering-script-defer-async.md",1868,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frendering-script-defer-async.md",{"path":259,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":260,"sourceHtmlUrl":261},"rules\u002Frendering-svg-precision.md",588,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frendering-svg-precision.md",{"path":263,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":264,"sourceHtmlUrl":265},"rules\u002Frendering-usetransition-loading.md",2074,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frendering-usetransition-loading.md",{"path":267,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":268,"sourceHtmlUrl":269},"rules\u002Frerender-defer-reads.md",973,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frerender-defer-reads.md",{"path":271,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":272,"sourceHtmlUrl":273},"rules\u002Frerender-dependencies.md",824,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frerender-dependencies.md",{"path":275,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":276,"sourceHtmlUrl":277},"rules\u002Frerender-derived-state-no-effect.md",1201,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frerender-derived-state-no-effect.md",{"path":279,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":280,"sourceHtmlUrl":281},"rules\u002Frerender-derived-state.md",728,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frerender-derived-state.md",{"path":283,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":284,"sourceHtmlUrl":285},"rules\u002Frerender-functional-setstate.md",2968,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frerender-functional-setstate.md",{"path":287,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":288,"sourceHtmlUrl":289},"rules\u002Frerender-lazy-state-init.md",2016,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frerender-lazy-state-init.md",{"path":291,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":292,"sourceHtmlUrl":293},"rules\u002Frerender-memo-with-default-value.md",1173,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frerender-memo-with-default-value.md",{"path":295,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":296,"sourceHtmlUrl":297},"rules\u002Frerender-memo.md",1148,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frerender-memo.md",{"path":299,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":300,"sourceHtmlUrl":301},"rules\u002Frerender-move-effect-to-event.md",1268,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frerender-move-effect-to-event.md",{"path":303,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":304,"sourceHtmlUrl":305},"rules\u002Frerender-no-inline-components.md",2135,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frerender-no-inline-components.md",{"path":307,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":308,"sourceHtmlUrl":309},"rules\u002Frerender-simple-expression-in-memo.md",1018,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frerender-simple-expression-in-memo.md",{"path":311,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":312,"sourceHtmlUrl":313},"rules\u002Frerender-split-combined-hooks.md",1844,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frerender-split-combined-hooks.md",{"path":315,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":316,"sourceHtmlUrl":317},"rules\u002Frerender-transitions.md",1055,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frerender-transitions.md",{"path":319,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":320,"sourceHtmlUrl":321},"rules\u002Frerender-use-deferred-value.md",1846,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frerender-use-deferred-value.md",{"path":323,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":324,"sourceHtmlUrl":325},"rules\u002Frerender-use-ref-transient-values.md",1742,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Frerender-use-ref-transient-values.md",{"path":327,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":328,"sourceHtmlUrl":329},"rules\u002Fserver-after-nonblocking.md",2012,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fserver-after-nonblocking.md",{"path":331,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":332,"sourceHtmlUrl":333},"rules\u002Fserver-auth-actions.md",2649,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fserver-auth-actions.md",{"path":335,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":336,"sourceHtmlUrl":337},"rules\u002Fserver-cache-lru.md",1353,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fserver-cache-lru.md",{"path":339,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":340,"sourceHtmlUrl":341},"rules\u002Fserver-cache-react.md",2228,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fserver-cache-react.md",{"path":343,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":344,"sourceHtmlUrl":345},"rules\u002Fserver-dedup-props.md",2060,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fserver-dedup-props.md",{"path":347,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":348,"sourceHtmlUrl":349},"rules\u002Fserver-hoist-static-io.md",4423,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fserver-hoist-static-io.md",{"path":351,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":89,"sourceHtmlUrl":352},"rules\u002Fserver-parallel-fetching.md","https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fserver-parallel-fetching.md",{"path":354,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":355,"sourceHtmlUrl":356},"rules\u002Fserver-parallel-nested-fetching.md",992,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fserver-parallel-nested-fetching.md",{"path":358,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":359,"sourceHtmlUrl":360},"rules\u002Fserver-serialization.md",996,"https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvercel-react-best-practices\u002Frules\u002Fserver-serialization.md",[362],{"skillNo":363,"name":364,"nameZh":6,"description":365,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":366,"licenseFileUrl":367,"sourceHtmlUrl":368,"categories":369,"keywords":373,"publishedAt":44},"01M71QXMHMS0FGH0G1XJGRKY5B","security-review","Use for security code review. OWASP patterns (injection, XSS, auth, authz, crypto, SSRF, secrets). Confidence-based reporting. Triggers on 'security review', auth\u002Fpayment code, or \u002Fdw-secure-audit.","CC-BY-SA-4.0","https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fbrunosps\u002Fwinbox-gui\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsecurity-review\u002FSKILL.md",[370],{"categoryNo":371,"categoryName":372,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查",[374,375,38,376,377,31,378,379,380,381,382,383,384,34,385,386,387,388,389,390],"security review","security","use","triggers","ssrf","patterns","owasp","injection","secure","reporting","secrets","audit","xss","code","Bash","code review","auth"]