vybekiit 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (665) hide show
  1. package/dist/bin.js +840 -296
  2. package/dist/global-skills/add-ai/SKILL.md +53 -0
  3. package/dist/global-skills/add-analytics/SKILL.md +65 -0
  4. package/dist/global-skills/add-app-clip/SKILL.md +280 -0
  5. package/dist/global-skills/add-app-clip/agents/openai.yaml +4 -0
  6. package/dist/global-skills/add-app-clip/references/native-module.md +96 -0
  7. package/dist/global-skills/add-blog/SKILL.md +49 -0
  8. package/dist/global-skills/add-crud/SKILL.md +28 -0
  9. package/dist/global-skills/add-files/SKILL.md +65 -0
  10. package/dist/global-skills/add-images/SKILL.md +64 -0
  11. package/dist/global-skills/add-language/SKILL.md +44 -0
  12. package/dist/global-skills/add-notifications/SKILL.md +61 -0
  13. package/dist/global-skills/add-realtime/SKILL.md +49 -0
  14. package/dist/global-skills/add-route/SKILL.md +28 -0
  15. package/dist/global-skills/add-search/SKILL.md +43 -0
  16. package/dist/global-skills/add-signin/SKILL.md +78 -0
  17. package/dist/global-skills/add-teams/SKILL.md +64 -0
  18. package/dist/global-skills/add-upload/SKILL.md +27 -0
  19. package/dist/global-skills/aws-cdk/SKILL.md +72 -0
  20. package/dist/global-skills/aws-cdk/references/bootstrap-and-project-setup.md +257 -0
  21. package/dist/global-skills/aws-cdk/references/compliance-and-drift.md +193 -0
  22. package/dist/global-skills/aws-cdk/references/construct-patterns.md +315 -0
  23. package/dist/global-skills/aws-cdk/references/import-and-migrate.md +184 -0
  24. package/dist/global-skills/aws-cdk/references/refactor-and-prevent-replacement.md +198 -0
  25. package/dist/global-skills/aws-cdk/references/troubleshooting-credentials.md +183 -0
  26. package/dist/global-skills/aws-cdk/references/troubleshooting-deployment.md +293 -0
  27. package/dist/global-skills/aws-cdk/references/troubleshooting-synth.md +274 -0
  28. package/dist/global-skills/aws-cdk/references/v1-to-v2-migration.md +119 -0
  29. package/dist/global-skills/aws-cloudformation/SKILL.md +88 -0
  30. package/dist/global-skills/aws-cloudformation/references/author-cloudformation-best-practices.script.md +179 -0
  31. package/dist/global-skills/aws-cloudformation/references/check-cloudformation-template-compliance.script.md +159 -0
  32. package/dist/global-skills/aws-cloudformation/references/cloudformation-pre-deploy-validation.script.md +217 -0
  33. package/dist/global-skills/aws-cloudformation/references/deploy-with-express-mode.script.md +271 -0
  34. package/dist/global-skills/aws-cloudformation/references/lookup-resource-properties.script.md +130 -0
  35. package/dist/global-skills/aws-cloudformation/references/troubleshoot-deployment.script.md +200 -0
  36. package/dist/global-skills/aws-cloudformation/references/validate-cloudformation-template.script.md +135 -0
  37. package/dist/global-skills/aws-serverless/SKILL.md +51 -0
  38. package/dist/global-skills/aws-serverless/assets/powertools-handler.py +49 -0
  39. package/dist/global-skills/aws-serverless/references/api-gateway.md +553 -0
  40. package/dist/global-skills/aws-serverless/references/architecture.md +262 -0
  41. package/dist/global-skills/aws-serverless/references/concurrency.md +200 -0
  42. package/dist/global-skills/aws-serverless/references/deployment.md +94 -0
  43. package/dist/global-skills/aws-serverless/references/event-sources.md +484 -0
  44. package/dist/global-skills/aws-serverless/references/lambda.md +548 -0
  45. package/dist/global-skills/aws-serverless/references/orchestration.md +449 -0
  46. package/dist/global-skills/aws-serverless/references/production.md +493 -0
  47. package/dist/global-skills/aws-serverless/references/troubleshooting.md +711 -0
  48. package/dist/global-skills/back-up-my-code/SKILL.md +48 -0
  49. package/dist/global-skills/better-auth-best-practices/SKILL.md +182 -0
  50. package/dist/global-skills/better-auth-security-best-practices/SKILL.md +432 -0
  51. package/dist/global-skills/building-native-ui/SKILL.md +377 -0
  52. package/dist/global-skills/building-native-ui/agents/openai.yaml +4 -0
  53. package/dist/global-skills/building-native-ui/references/animations.md +220 -0
  54. package/dist/global-skills/building-native-ui/references/controls.md +270 -0
  55. package/dist/global-skills/building-native-ui/references/form-sheet.md +253 -0
  56. package/dist/global-skills/building-native-ui/references/gradients.md +106 -0
  57. package/dist/global-skills/building-native-ui/references/icons.md +213 -0
  58. package/dist/global-skills/building-native-ui/references/media.md +198 -0
  59. package/dist/global-skills/building-native-ui/references/route-structure.md +229 -0
  60. package/dist/global-skills/building-native-ui/references/search.md +248 -0
  61. package/dist/global-skills/building-native-ui/references/storage.md +121 -0
  62. package/dist/global-skills/building-native-ui/references/tabs.md +433 -0
  63. package/dist/global-skills/building-native-ui/references/toolbar-and-headers.md +284 -0
  64. package/dist/global-skills/building-native-ui/references/visual-effects.md +197 -0
  65. package/dist/global-skills/building-native-ui/references/webgpu-three.md +605 -0
  66. package/dist/global-skills/building-native-ui/references/zoom-transitions.md +158 -0
  67. package/dist/global-skills/buy-domain/SKILL.md +64 -0
  68. package/dist/global-skills/check-safety/SKILL.md +94 -0
  69. package/dist/global-skills/claimable-postgres/SKILL.md +249 -0
  70. package/dist/global-skills/configure-capabilities/SKILL.md +38 -0
  71. package/dist/global-skills/connect-account/SKILL.md +64 -0
  72. package/dist/global-skills/connect-account-backend/SKILL.md +41 -0
  73. package/dist/global-skills/create-auth-skill/SKILL.md +321 -0
  74. package/dist/global-skills/design-my-data/SKILL.md +48 -0
  75. package/dist/global-skills/doctor/SKILL.md +84 -0
  76. package/dist/global-skills/eas-app-stores/SKILL.md +152 -0
  77. package/dist/global-skills/eas-app-stores/agents/openai.yaml +4 -0
  78. package/dist/global-skills/eas-app-stores/references/app-store-metadata.md +497 -0
  79. package/dist/global-skills/eas-app-stores/references/ios-app-store.md +371 -0
  80. package/dist/global-skills/eas-app-stores/references/play-store.md +246 -0
  81. package/dist/global-skills/eas-app-stores/references/testflight.md +58 -0
  82. package/dist/global-skills/eas-app-stores/references/workflows.md +120 -0
  83. package/dist/global-skills/eas-hosting/SKILL.md +423 -0
  84. package/dist/global-skills/eas-hosting/agents/openai.yaml +4 -0
  85. package/dist/global-skills/eas-observe/SKILL.md +32 -0
  86. package/dist/global-skills/eas-observe/agents/openai.yaml +4 -0
  87. package/dist/global-skills/eas-observe/references/metrics.md +47 -0
  88. package/dist/global-skills/eas-observe/references/queries.md +342 -0
  89. package/dist/global-skills/eas-observe/references/setup.md +317 -0
  90. package/dist/global-skills/eas-simulator/SKILL.md +156 -0
  91. package/dist/global-skills/eas-simulator/agents/openai.yaml +4 -0
  92. package/dist/global-skills/eas-simulator/references/controllers.md +67 -0
  93. package/dist/global-skills/eas-simulator/references/run-your-app.md +185 -0
  94. package/dist/global-skills/eas-simulator/references/troubleshooting.md +38 -0
  95. package/dist/global-skills/eas-update-insights/SKILL.md +230 -0
  96. package/dist/global-skills/eas-update-insights/agents/openai.yaml +4 -0
  97. package/dist/global-skills/eas-update-insights/references/channel-insights-schema.md +47 -0
  98. package/dist/global-skills/eas-update-insights/references/update-insights-schema.md +69 -0
  99. package/dist/global-skills/eas-workflows/SKILL.md +94 -0
  100. package/dist/global-skills/eas-workflows/agents/openai.yaml +4 -0
  101. package/dist/global-skills/eas-workflows/scripts/fetch.js +109 -0
  102. package/dist/global-skills/eas-workflows/scripts/package.json +11 -0
  103. package/dist/global-skills/eas-workflows/scripts/validate.js +84 -0
  104. package/dist/global-skills/email-best-practices/SKILL.md +73 -0
  105. package/dist/global-skills/expo-api-routes/SKILL.md +368 -0
  106. package/dist/global-skills/expo-api-routes/agents/openai.yaml +4 -0
  107. package/dist/global-skills/expo-app-clip/SKILL.md +282 -0
  108. package/dist/global-skills/expo-app-clip/agents/openai.yaml +4 -0
  109. package/dist/global-skills/expo-app-clip/references/native-module.md +96 -0
  110. package/dist/global-skills/expo-brownfield/SKILL.md +54 -0
  111. package/dist/global-skills/expo-brownfield/agents/openai.yaml +4 -0
  112. package/dist/global-skills/expo-brownfield/references/brownfield-integrated.md +526 -0
  113. package/dist/global-skills/expo-brownfield/references/brownfield-isolated.md +402 -0
  114. package/dist/global-skills/expo-brownfield/references/comparison.md +63 -0
  115. package/dist/global-skills/expo-brownfield/references/troubleshooting.md +88 -0
  116. package/dist/global-skills/expo-cicd-workflows/SKILL.md +92 -0
  117. package/dist/global-skills/expo-cicd-workflows/agents/openai.yaml +4 -0
  118. package/dist/global-skills/expo-cicd-workflows/scripts/fetch.js +109 -0
  119. package/dist/global-skills/expo-cicd-workflows/scripts/package.json +11 -0
  120. package/dist/global-skills/expo-cicd-workflows/scripts/validate.js +84 -0
  121. package/dist/global-skills/expo-data-fetching/SKILL.md +449 -0
  122. package/dist/global-skills/expo-data-fetching/agents/openai.yaml +4 -0
  123. package/dist/global-skills/expo-data-fetching/references/expo-router-loaders.md +341 -0
  124. package/dist/global-skills/expo-data-fetching/references/offline-and-cancellation.md +68 -0
  125. package/dist/global-skills/expo-deployment/SKILL.md +167 -0
  126. package/dist/global-skills/expo-deployment/agents/openai.yaml +4 -0
  127. package/dist/global-skills/expo-deployment/references/app-store-metadata.md +497 -0
  128. package/dist/global-skills/expo-deployment/references/ios-app-store.md +371 -0
  129. package/dist/global-skills/expo-deployment/references/play-store.md +246 -0
  130. package/dist/global-skills/expo-deployment/references/testflight.md +58 -0
  131. package/dist/global-skills/expo-deployment/references/workflows.md +160 -0
  132. package/dist/global-skills/expo-dev-client/SKILL.md +174 -0
  133. package/dist/global-skills/expo-dev-client/agents/openai.yaml +4 -0
  134. package/dist/global-skills/expo-dom/SKILL.md +417 -0
  135. package/dist/global-skills/expo-dom/agents/openai.yaml +4 -0
  136. package/dist/global-skills/expo-examples/SKILL.md +99 -0
  137. package/dist/global-skills/expo-examples/agents/openai.yaml +4 -0
  138. package/dist/global-skills/expo-examples/references/catalog.md +105 -0
  139. package/dist/global-skills/expo-module/SKILL.md +141 -0
  140. package/dist/global-skills/expo-module/agents/openai.yaml +4 -0
  141. package/dist/global-skills/expo-module/references/config-plugin.md +90 -0
  142. package/dist/global-skills/expo-module/references/create-expo-module.md +206 -0
  143. package/dist/global-skills/expo-module/references/lifecycle.md +127 -0
  144. package/dist/global-skills/expo-module/references/module-config.md +48 -0
  145. package/dist/global-skills/expo-module/references/native-module.md +286 -0
  146. package/dist/global-skills/expo-module/references/native-view.md +171 -0
  147. package/dist/global-skills/expo-native-ui/SKILL.md +181 -0
  148. package/dist/global-skills/expo-native-ui/agents/openai.yaml +4 -0
  149. package/dist/global-skills/expo-native-ui/references/animations.md +220 -0
  150. package/dist/global-skills/expo-native-ui/references/controls.md +270 -0
  151. package/dist/global-skills/expo-native-ui/references/gradients.md +106 -0
  152. package/dist/global-skills/expo-native-ui/references/icons.md +213 -0
  153. package/dist/global-skills/expo-native-ui/references/media.md +198 -0
  154. package/dist/global-skills/expo-native-ui/references/storage.md +121 -0
  155. package/dist/global-skills/expo-native-ui/references/visual-effects.md +197 -0
  156. package/dist/global-skills/expo-native-ui/references/webgpu-three.md +605 -0
  157. package/dist/global-skills/expo-observe/SKILL.md +30 -0
  158. package/dist/global-skills/expo-observe/references/metrics.md +47 -0
  159. package/dist/global-skills/expo-observe/references/queries.md +342 -0
  160. package/dist/global-skills/expo-observe/references/setup.md +317 -0
  161. package/dist/global-skills/expo-router/SKILL.md +230 -0
  162. package/dist/global-skills/expo-router/agents/openai.yaml +4 -0
  163. package/dist/global-skills/expo-router/references/form-sheet.md +253 -0
  164. package/dist/global-skills/expo-router/references/route-structure.md +229 -0
  165. package/dist/global-skills/expo-router/references/search.md +248 -0
  166. package/dist/global-skills/expo-router/references/tabs.md +433 -0
  167. package/dist/global-skills/expo-router/references/toolbar-and-headers.md +284 -0
  168. package/dist/global-skills/expo-router/references/zoom-transitions.md +158 -0
  169. package/dist/global-skills/expo-skill-eval/SKILL.md +314 -0
  170. package/dist/global-skills/expo-skill-eval/agents/visual-grader.md +52 -0
  171. package/dist/global-skills/expo-skill-eval/references/design-rubric.md +45 -0
  172. package/dist/global-skills/expo-skill-eval/references/runtime-matrix.md +34 -0
  173. package/dist/global-skills/expo-skill-eval/scripts/check-static.sh +64 -0
  174. package/dist/global-skills/expo-skill-eval/scripts/clean-fixture.sh +56 -0
  175. package/dist/global-skills/expo-skill-eval/scripts/generate_viewer.py +450 -0
  176. package/dist/global-skills/expo-skill-eval/scripts/latest-sdk.sh +46 -0
  177. package/dist/global-skills/expo-skill-eval/scripts/make-fixture.sh +95 -0
  178. package/dist/global-skills/expo-skill-eval/scripts/make-workspace.sh +31 -0
  179. package/dist/global-skills/expo-skill-eval/scripts/snapshot-android.sh +284 -0
  180. package/dist/global-skills/expo-skill-eval/scripts/snapshot-ios.sh +132 -0
  181. package/dist/global-skills/expo-skill-eval/scripts/snapshot-web.sh +61 -0
  182. package/dist/global-skills/expo-skill-feedback/SKILL.md +54 -0
  183. package/dist/global-skills/expo-skill-feedback/agents/openai.yaml +4 -0
  184. package/dist/global-skills/expo-skill-feedback/scripts/skill-event.cjs +180 -0
  185. package/dist/global-skills/expo-skill-feedback/scripts/skill-feedback.cjs +118 -0
  186. package/dist/global-skills/expo-skill-feedback/scripts/telemetry.cjs +65 -0
  187. package/dist/global-skills/expo-skill-feedback/scripts/telemetry_common.cjs +171 -0
  188. package/dist/global-skills/expo-tailwind-setup/SKILL.md +480 -0
  189. package/dist/global-skills/expo-tailwind-setup/agents/openai.yaml +4 -0
  190. package/dist/global-skills/expo-ui/SKILL.md +47 -0
  191. package/dist/global-skills/expo-ui/agents/openai.yaml +4 -0
  192. package/dist/global-skills/expo-ui/references/drop-in-replacements.md +27 -0
  193. package/dist/global-skills/expo-ui/references/jetpack-compose.md +73 -0
  194. package/dist/global-skills/expo-ui/references/swift-ui.md +73 -0
  195. package/dist/global-skills/expo-ui/references/universal.md +73 -0
  196. package/dist/global-skills/expo-ui/scripts/list-components.js +193 -0
  197. package/dist/global-skills/expo-upgrade/SKILL.md +134 -0
  198. package/dist/global-skills/expo-upgrade/agents/openai.yaml +4 -0
  199. package/dist/global-skills/expo-upgrade/references/expo-av-to-audio.md +132 -0
  200. package/dist/global-skills/expo-upgrade/references/expo-av-to-video.md +160 -0
  201. package/dist/global-skills/expo-upgrade/references/native-tabs.md +124 -0
  202. package/dist/global-skills/expo-upgrade/references/new-architecture.md +79 -0
  203. package/dist/global-skills/expo-upgrade/references/react-19.md +79 -0
  204. package/dist/global-skills/expo-upgrade/references/react-compiler.md +59 -0
  205. package/dist/global-skills/expo-upgrade/references/react-navigation-to-expo-router.md +61 -0
  206. package/dist/global-skills/expo-web-to-native/SKILL.md +83 -0
  207. package/dist/global-skills/expo-web-to-native/agents/openai.yaml +4 -0
  208. package/dist/global-skills/expo-web-to-native/references/false-friends.md +119 -0
  209. package/dist/global-skills/expo-web-to-native/references/native-patterns.md +39 -0
  210. package/dist/global-skills/expo-web-to-native/references/run-as-goal.md +48 -0
  211. package/dist/global-skills/expo-web-to-native/references/verify-on-device.md +45 -0
  212. package/dist/global-skills/firebase-ai-logic-basics/SKILL.md +165 -0
  213. package/dist/global-skills/firebase-ai-logic-basics/references/flutter_setup.md +95 -0
  214. package/dist/global-skills/firebase-ai-logic-basics/references/ios_setup.md +156 -0
  215. package/dist/global-skills/firebase-ai-logic-basics/references/usage_patterns_android.md +157 -0
  216. package/dist/global-skills/firebase-ai-logic-basics/references/usage_patterns_web.md +186 -0
  217. package/dist/global-skills/firebase-app-hosting-basics/SKILL.md +73 -0
  218. package/dist/global-skills/firebase-app-hosting-basics/references/cli_commands.md +85 -0
  219. package/dist/global-skills/firebase-app-hosting-basics/references/configuration.md +59 -0
  220. package/dist/global-skills/firebase-app-hosting-basics/references/emulation.md +59 -0
  221. package/dist/global-skills/firebase-auth-basics/SKILL.md +118 -0
  222. package/dist/global-skills/firebase-auth-basics/references/client_sdk_android.md +160 -0
  223. package/dist/global-skills/firebase-auth-basics/references/client_sdk_web.md +301 -0
  224. package/dist/global-skills/firebase-auth-basics/references/flutter_setup.md +149 -0
  225. package/dist/global-skills/firebase-auth-basics/references/ios_setup.md +87 -0
  226. package/dist/global-skills/firebase-auth-basics/references/security_rules.md +49 -0
  227. package/dist/global-skills/firebase-basics/SKILL.md +148 -0
  228. package/dist/global-skills/firebase-basics/references/android_setup.md +41 -0
  229. package/dist/global-skills/firebase-basics/references/firebase-cli-guide.md +18 -0
  230. package/dist/global-skills/firebase-basics/references/firebase-service-init.md +20 -0
  231. package/dist/global-skills/firebase-basics/references/flutter_setup.md +143 -0
  232. package/dist/global-skills/firebase-basics/references/ios_setup.md +113 -0
  233. package/dist/global-skills/firebase-basics/references/local-env-setup.md +80 -0
  234. package/dist/global-skills/firebase-basics/references/refresh/android_studio.md +41 -0
  235. package/dist/global-skills/firebase-basics/references/refresh/antigravity.md +64 -0
  236. package/dist/global-skills/firebase-basics/references/refresh/claude.md +12 -0
  237. package/dist/global-skills/firebase-basics/references/refresh/gemini-cli.md +13 -0
  238. package/dist/global-skills/firebase-basics/references/refresh/other-agents.md +67 -0
  239. package/dist/global-skills/firebase-basics/references/setup/android_studio.md +23 -0
  240. package/dist/global-skills/firebase-basics/references/setup/antigravity.md +98 -0
  241. package/dist/global-skills/firebase-basics/references/setup/claude_code.md +45 -0
  242. package/dist/global-skills/firebase-basics/references/setup/cursor.md +93 -0
  243. package/dist/global-skills/firebase-basics/references/setup/gemini_cli.md +53 -0
  244. package/dist/global-skills/firebase-basics/references/setup/github_copilot.md +104 -0
  245. package/dist/global-skills/firebase-basics/references/setup/other_agents.md +99 -0
  246. package/dist/global-skills/firebase-basics/references/web_setup.md +77 -0
  247. package/dist/global-skills/firebase-crashlytics/SKILL.md +42 -0
  248. package/dist/global-skills/firebase-crashlytics/references/android_setup.md +152 -0
  249. package/dist/global-skills/firebase-crashlytics/references/ios_setup.md +115 -0
  250. package/dist/global-skills/firebase-data-connect/SKILL.md +191 -0
  251. package/dist/global-skills/firebase-data-connect/examples.md +638 -0
  252. package/dist/global-skills/firebase-data-connect/reference/cloud_functions.md +184 -0
  253. package/dist/global-skills/firebase-data-connect/reference/config.md +271 -0
  254. package/dist/global-skills/firebase-data-connect/reference/data_seeding.md +185 -0
  255. package/dist/global-skills/firebase-data-connect/reference/native_sql.md +170 -0
  256. package/dist/global-skills/firebase-data-connect/reference/operations.md +385 -0
  257. package/dist/global-skills/firebase-data-connect/reference/realtime.md +210 -0
  258. package/dist/global-skills/firebase-data-connect/reference/schema.md +290 -0
  259. package/dist/global-skills/firebase-data-connect/reference/sdk_admin_node.md +141 -0
  260. package/dist/global-skills/firebase-data-connect/reference/sdk_android.md +126 -0
  261. package/dist/global-skills/firebase-data-connect/reference/sdk_flutter.md +134 -0
  262. package/dist/global-skills/firebase-data-connect/reference/sdk_ios.md +157 -0
  263. package/dist/global-skills/firebase-data-connect/reference/sdk_web.md +146 -0
  264. package/dist/global-skills/firebase-data-connect/reference/search.md +264 -0
  265. package/dist/global-skills/firebase-data-connect/reference/security.md +295 -0
  266. package/dist/global-skills/firebase-data-connect/templates.md +318 -0
  267. package/dist/global-skills/firebase-firestore/SKILL.md +89 -0
  268. package/dist/global-skills/firebase-firestore/references/enterprise/android_sdk_usage.md +230 -0
  269. package/dist/global-skills/firebase-firestore/references/enterprise/data_model.md +66 -0
  270. package/dist/global-skills/firebase-firestore/references/enterprise/flutter_setup.md +180 -0
  271. package/dist/global-skills/firebase-firestore/references/enterprise/indexes.md +135 -0
  272. package/dist/global-skills/firebase-firestore/references/enterprise/ios_setup.md +189 -0
  273. package/dist/global-skills/firebase-firestore/references/enterprise/provisioning.md +118 -0
  274. package/dist/global-skills/firebase-firestore/references/enterprise/python_sdk_usage.md +138 -0
  275. package/dist/global-skills/firebase-firestore/references/enterprise/security_rules.md +577 -0
  276. package/dist/global-skills/firebase-firestore/references/enterprise/web_sdk_usage.md +127 -0
  277. package/dist/global-skills/firebase-firestore/references/standard/android_sdk_usage.md +193 -0
  278. package/dist/global-skills/firebase-firestore/references/standard/flutter_setup.md +176 -0
  279. package/dist/global-skills/firebase-firestore/references/standard/indexes.md +113 -0
  280. package/dist/global-skills/firebase-firestore/references/standard/ios_setup.md +174 -0
  281. package/dist/global-skills/firebase-firestore/references/standard/provisioning.md +110 -0
  282. package/dist/global-skills/firebase-firestore/references/standard/security_rules.md +577 -0
  283. package/dist/global-skills/firebase-firestore/references/standard/web_sdk_usage.md +192 -0
  284. package/dist/global-skills/firebase-hosting-basics/SKILL.md +64 -0
  285. package/dist/global-skills/firebase-hosting-basics/references/configuration.md +115 -0
  286. package/dist/global-skills/firebase-hosting-basics/references/deploying.md +48 -0
  287. package/dist/global-skills/firebase-remote-config-basics/SKILL.md +124 -0
  288. package/dist/global-skills/firebase-remote-config-basics/references/android_setup.md +91 -0
  289. package/dist/global-skills/firebase-remote-config-basics/references/ios_setup.md +89 -0
  290. package/dist/global-skills/firebase-security-rules-auditor/SKILL.md +70 -0
  291. package/dist/global-skills/go-live/SKILL.md +90 -0
  292. package/dist/global-skills/harden/SKILL.md +101 -0
  293. package/dist/global-skills/instrument-feature-flags/SKILL.md +88 -0
  294. package/dist/global-skills/instrument-feature-flags/references/adding-feature-flag-code.md +3578 -0
  295. package/dist/global-skills/instrument-feature-flags/references/android.md +146 -0
  296. package/dist/global-skills/instrument-feature-flags/references/api.md +194 -0
  297. package/dist/global-skills/instrument-feature-flags/references/best-practices.md +231 -0
  298. package/dist/global-skills/instrument-feature-flags/references/django.md +263 -0
  299. package/dist/global-skills/instrument-feature-flags/references/dotnet.md +763 -0
  300. package/dist/global-skills/instrument-feature-flags/references/elixir.md +47 -0
  301. package/dist/global-skills/instrument-feature-flags/references/flask.md +131 -0
  302. package/dist/global-skills/instrument-feature-flags/references/flutter.md +212 -0
  303. package/dist/global-skills/instrument-feature-flags/references/go.md +208 -0
  304. package/dist/global-skills/instrument-feature-flags/references/ios.md +146 -0
  305. package/dist/global-skills/instrument-feature-flags/references/java.md +94 -0
  306. package/dist/global-skills/instrument-feature-flags/references/laravel.md +170 -0
  307. package/dist/global-skills/instrument-feature-flags/references/next-js.md +383 -0
  308. package/dist/global-skills/instrument-feature-flags/references/nodejs.md +216 -0
  309. package/dist/global-skills/instrument-feature-flags/references/php.md +187 -0
  310. package/dist/global-skills/instrument-feature-flags/references/python.md +191 -0
  311. package/dist/global-skills/instrument-feature-flags/references/react-native.md +166 -0
  312. package/dist/global-skills/instrument-feature-flags/references/react.md +302 -0
  313. package/dist/global-skills/instrument-feature-flags/references/ruby-on-rails.md +604 -0
  314. package/dist/global-skills/instrument-feature-flags/references/ruby.md +200 -0
  315. package/dist/global-skills/instrument-feature-flags/references/rust.md +222 -0
  316. package/dist/global-skills/instrument-feature-flags/references/usage.md +600 -0
  317. package/dist/global-skills/instrument-feature-flags/references/web.md +193 -0
  318. package/dist/global-skills/instrument-product-analytics/SKILL.md +139 -0
  319. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-android.md +1639 -0
  320. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-angular.md +944 -0
  321. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-hybrid.md +1001 -0
  322. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-ssr.md +1004 -0
  323. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-static.md +720 -0
  324. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-view-transitions.md +810 -0
  325. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-django.md +1167 -0
  326. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-expo.md +1412 -0
  327. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-fastapi.md +1585 -0
  328. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-flask.md +1208 -0
  329. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-laravel.md +2267 -0
  330. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-next-app-router.md +712 -0
  331. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-next-pages-router.md +767 -0
  332. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-nuxt-3-6.md +939 -0
  333. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-nuxt-4.md +1078 -0
  334. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-php.md +527 -0
  335. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-python.md +481 -0
  336. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-native.md +1823 -0
  337. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-6.md +582 -0
  338. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-7-data.md +892 -0
  339. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-7-declarative.md +649 -0
  340. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-7-framework.md +1218 -0
  341. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-tanstack-router-code-based.md +793 -0
  342. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-tanstack-router-file-based.md +780 -0
  343. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-ruby-on-rails.md +1320 -0
  344. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-ruby.md +452 -0
  345. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-sveltekit.md +854 -0
  346. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-swift.md +665 -0
  347. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-tanstack-start.md +1199 -0
  348. package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-vue-3.md +910 -0
  349. package/dist/global-skills/instrument-product-analytics/references/android.md +811 -0
  350. package/dist/global-skills/instrument-product-analytics/references/angular.md +376 -0
  351. package/dist/global-skills/instrument-product-analytics/references/astro.md +165 -0
  352. package/dist/global-skills/instrument-product-analytics/references/configuration.md +299 -0
  353. package/dist/global-skills/instrument-product-analytics/references/django.md +263 -0
  354. package/dist/global-skills/instrument-product-analytics/references/dotnet.md +763 -0
  355. package/dist/global-skills/instrument-product-analytics/references/elixir.md +414 -0
  356. package/dist/global-skills/instrument-product-analytics/references/flask.md +131 -0
  357. package/dist/global-skills/instrument-product-analytics/references/flutter.md +845 -0
  358. package/dist/global-skills/instrument-product-analytics/references/go.md +567 -0
  359. package/dist/global-skills/instrument-product-analytics/references/identify-users.md +272 -0
  360. package/dist/global-skills/instrument-product-analytics/references/ios.md +154 -0
  361. package/dist/global-skills/instrument-product-analytics/references/laravel.md +170 -0
  362. package/dist/global-skills/instrument-product-analytics/references/next-js.md +383 -0
  363. package/dist/global-skills/instrument-product-analytics/references/nuxt-js-3-6.md +244 -0
  364. package/dist/global-skills/instrument-product-analytics/references/nuxt-js.md +253 -0
  365. package/dist/global-skills/instrument-product-analytics/references/php.md +646 -0
  366. package/dist/global-skills/instrument-product-analytics/references/posthog-python.md +1675 -0
  367. package/dist/global-skills/instrument-product-analytics/references/python.md +898 -0
  368. package/dist/global-skills/instrument-product-analytics/references/react-native.md +1338 -0
  369. package/dist/global-skills/instrument-product-analytics/references/react-router-v6.md +376 -0
  370. package/dist/global-skills/instrument-product-analytics/references/react-router-v7-data-mode.md +364 -0
  371. package/dist/global-skills/instrument-product-analytics/references/react-router-v7-declarative-mode.md +376 -0
  372. package/dist/global-skills/instrument-product-analytics/references/react-router-v7-framework-mode.md +479 -0
  373. package/dist/global-skills/instrument-product-analytics/references/ruby-on-rails.md +604 -0
  374. package/dist/global-skills/instrument-product-analytics/references/ruby.md +759 -0
  375. package/dist/global-skills/instrument-product-analytics/references/svelte.md +234 -0
  376. package/dist/global-skills/instrument-product-analytics/references/tanstack-start.md +193 -0
  377. package/dist/global-skills/instrument-product-analytics/references/usage.md +600 -0
  378. package/dist/global-skills/instrument-product-analytics/references/vue-js.md +306 -0
  379. package/dist/global-skills/manifest.json +125 -0
  380. package/dist/global-skills/mongodb-atlas-stream-processing/SKILL.md +284 -0
  381. package/dist/global-skills/mongodb-atlas-stream-processing/references/connection-configs.md +298 -0
  382. package/dist/global-skills/mongodb-atlas-stream-processing/references/development-workflow.md +304 -0
  383. package/dist/global-skills/mongodb-atlas-stream-processing/references/mcp-troubleshooting.md +55 -0
  384. package/dist/global-skills/mongodb-atlas-stream-processing/references/output-diagnostics.md +150 -0
  385. package/dist/global-skills/mongodb-atlas-stream-processing/references/pipeline-patterns.md +457 -0
  386. package/dist/global-skills/mongodb-atlas-stream-processing/references/sizing-and-parallelism.md +178 -0
  387. package/dist/global-skills/mongodb-connection/SKILL.md +201 -0
  388. package/dist/global-skills/mongodb-connection/references/monitoring-guide.md +191 -0
  389. package/dist/global-skills/mongodb-mcp-setup/SKILL.md +324 -0
  390. package/dist/global-skills/mongodb-natural-language-querying/SKILL.md +195 -0
  391. package/dist/global-skills/mongodb-query-optimizer/SKILL.md +150 -0
  392. package/dist/global-skills/mongodb-query-optimizer/references/aggregation-optimization.md +210 -0
  393. package/dist/global-skills/mongodb-query-optimizer/references/antipattern-examples.md +74 -0
  394. package/dist/global-skills/mongodb-query-optimizer/references/core-indexing-principles.md +134 -0
  395. package/dist/global-skills/mongodb-query-optimizer/references/update-query-examples.md +39 -0
  396. package/dist/global-skills/mongodb-schema-design/SKILL.md +181 -0
  397. package/dist/global-skills/mongodb-schema-design/references/antipattern-excessive-lookups.md +84 -0
  398. package/dist/global-skills/mongodb-schema-design/references/antipattern-unnecessary-collections.md +91 -0
  399. package/dist/global-skills/mongodb-schema-design/references/antipattern-unnecessary-indexes.md +95 -0
  400. package/dist/global-skills/mongodb-schema-design/references/fundamental-document-model.md +91 -0
  401. package/dist/global-skills/mongodb-schema-design/references/fundamental-document-size.md +226 -0
  402. package/dist/global-skills/mongodb-schema-design/references/fundamental-embed-vs-reference.md +418 -0
  403. package/dist/global-skills/mongodb-schema-design/references/fundamental-schema-validation.md +131 -0
  404. package/dist/global-skills/mongodb-schema-design/references/pattern-approximation.md +80 -0
  405. package/dist/global-skills/mongodb-schema-design/references/pattern-archive.md +143 -0
  406. package/dist/global-skills/mongodb-schema-design/references/pattern-attribute.md +77 -0
  407. package/dist/global-skills/mongodb-schema-design/references/pattern-bucket.md +102 -0
  408. package/dist/global-skills/mongodb-schema-design/references/pattern-computed.md +162 -0
  409. package/dist/global-skills/mongodb-schema-design/references/pattern-document-versioning.md +166 -0
  410. package/dist/global-skills/mongodb-schema-design/references/pattern-extended-reference.md +72 -0
  411. package/dist/global-skills/mongodb-schema-design/references/pattern-outlier.md +159 -0
  412. package/dist/global-skills/mongodb-schema-design/references/pattern-polymorphic.md +167 -0
  413. package/dist/global-skills/mongodb-schema-design/references/pattern-schema-versioning.md +273 -0
  414. package/dist/global-skills/mongodb-schema-design/references/pattern-time-series-collections.md +190 -0
  415. package/dist/global-skills/mongodb-schema-design/references/source-query-stats.md +123 -0
  416. package/dist/global-skills/mongodb-schema-design/references/source-slow-query-logs.md +63 -0
  417. package/dist/global-skills/mongodb-search-and-ai/SKILL.md +142 -0
  418. package/dist/global-skills/mongodb-search-and-ai/references/hybrid-search.md +697 -0
  419. package/dist/global-skills/mongodb-search-and-ai/references/lexical-search-indexing.md +584 -0
  420. package/dist/global-skills/mongodb-search-and-ai/references/lexical-search-querying.md +636 -0
  421. package/dist/global-skills/mongodb-search-and-ai/references/vector-search.md +746 -0
  422. package/dist/global-skills/native-data-fetching/SKILL.md +505 -0
  423. package/dist/global-skills/native-data-fetching/agents/openai.yaml +4 -0
  424. package/dist/global-skills/native-data-fetching/references/expo-router-loaders.md +341 -0
  425. package/dist/global-skills/neon/SKILL.md +343 -0
  426. package/dist/global-skills/neon-ai-gateway/SKILL.md +236 -0
  427. package/dist/global-skills/neon-functions/SKILL.md +490 -0
  428. package/dist/global-skills/neon-functions/references/ai-sdk.md +139 -0
  429. package/dist/global-skills/neon-functions/references/hono-websockets.md +145 -0
  430. package/dist/global-skills/neon-functions/references/mastra-studio.md +127 -0
  431. package/dist/global-skills/neon-functions/references/mcp.md +137 -0
  432. package/dist/global-skills/neon-functions/references/sentry.md +131 -0
  433. package/dist/global-skills/neon-functions/references/sse.md +143 -0
  434. package/dist/global-skills/neon-object-storage/SKILL.md +197 -0
  435. package/dist/global-skills/neon-postgres/SKILL.md +376 -0
  436. package/dist/global-skills/neon-postgres-branches/SKILL.md +281 -0
  437. package/dist/global-skills/neon-postgres-egress-optimizer/SKILL.md +247 -0
  438. package/dist/global-skills/onboarding/SKILL.md +101 -0
  439. package/dist/global-skills/plan-my-idea/SKILL.md +67 -0
  440. package/dist/global-skills/publish-app/SKILL.md +72 -0
  441. package/dist/global-skills/publish-extension/SKILL.md +47 -0
  442. package/dist/global-skills/resend/SKILL.md +294 -0
  443. package/dist/global-skills/resend/references/api-keys.md +98 -0
  444. package/dist/global-skills/resend/references/automations.md +228 -0
  445. package/dist/global-skills/resend/references/broadcasts.md +125 -0
  446. package/dist/global-skills/resend/references/contact-properties.md +111 -0
  447. package/dist/global-skills/resend/references/contacts.md +174 -0
  448. package/dist/global-skills/resend/references/domains.md +179 -0
  449. package/dist/global-skills/resend/references/events.md +119 -0
  450. package/dist/global-skills/resend/references/fetch-all-templates.mjs +37 -0
  451. package/dist/global-skills/resend/references/installation.md +142 -0
  452. package/dist/global-skills/resend/references/logs.md +161 -0
  453. package/dist/global-skills/resend/references/receiving.md +287 -0
  454. package/dist/global-skills/resend/references/segments.md +77 -0
  455. package/dist/global-skills/resend/references/sending/batch-email-examples.md +807 -0
  456. package/dist/global-skills/resend/references/sending/best-practices.md +453 -0
  457. package/dist/global-skills/resend/references/sending/email-management.md +135 -0
  458. package/dist/global-skills/resend/references/sending/overview.md +209 -0
  459. package/dist/global-skills/resend/references/sending/single-email-examples.md +470 -0
  460. package/dist/global-skills/resend/references/templates.md +202 -0
  461. package/dist/global-skills/resend/references/topics.md +104 -0
  462. package/dist/global-skills/resend/references/webhooks.md +317 -0
  463. package/dist/global-skills/reset-password/SKILL.md +59 -0
  464. package/dist/global-skills/save-data/SKILL.md +70 -0
  465. package/dist/global-skills/sentry-sdk-setup/SKILL.md +116 -0
  466. package/dist/global-skills/sentry-workflow/SKILL.md +32 -0
  467. package/dist/global-skills/setup-email/SKILL.md +69 -0
  468. package/dist/global-skills/setup-payments/SKILL.md +82 -0
  469. package/dist/global-skills/setup-sms/SKILL.md +51 -0
  470. package/dist/global-skills/sign-in-with-email-link/SKILL.md +53 -0
  471. package/dist/global-skills/sign-in-with-google/SKILL.md +68 -0
  472. package/dist/global-skills/sign-in-with-phone/SKILL.md +53 -0
  473. package/dist/global-skills/stripe-best-practices/SKILL.md +48 -0
  474. package/dist/global-skills/stripe-best-practices/references/billing.md +58 -0
  475. package/dist/global-skills/stripe-best-practices/references/connect.md +173 -0
  476. package/dist/global-skills/stripe-best-practices/references/payments.md +79 -0
  477. package/dist/global-skills/stripe-best-practices/references/security.md +109 -0
  478. package/dist/global-skills/stripe-best-practices/references/tax.md +37 -0
  479. package/dist/global-skills/stripe-best-practices/references/treasury.md +16 -0
  480. package/dist/global-skills/supabase/CHANGELOG.md +53 -0
  481. package/dist/global-skills/supabase/SKILL.md +145 -0
  482. package/dist/global-skills/supabase/assets/feedback-issue-template.md +17 -0
  483. package/dist/global-skills/supabase/references/skill-feedback.md +17 -0
  484. package/dist/global-skills/supabase-postgres-best-practices/CHANGELOG.md +43 -0
  485. package/dist/global-skills/supabase-postgres-best-practices/SKILL.md +64 -0
  486. package/dist/global-skills/supabase-postgres-best-practices/references/_contributing.md +170 -0
  487. package/dist/global-skills/supabase-postgres-best-practices/references/_sections.md +39 -0
  488. package/dist/global-skills/supabase-postgres-best-practices/references/_template.md +34 -0
  489. package/dist/global-skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
  490. package/dist/global-skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
  491. package/dist/global-skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
  492. package/dist/global-skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
  493. package/dist/global-skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
  494. package/dist/global-skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
  495. package/dist/global-skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
  496. package/dist/global-skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
  497. package/dist/global-skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
  498. package/dist/global-skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
  499. package/dist/global-skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
  500. package/dist/global-skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
  501. package/dist/global-skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
  502. package/dist/global-skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
  503. package/dist/global-skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
  504. package/dist/global-skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
  505. package/dist/global-skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
  506. package/dist/global-skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
  507. package/dist/global-skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
  508. package/dist/global-skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
  509. package/dist/global-skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
  510. package/dist/global-skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
  511. package/dist/global-skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
  512. package/dist/global-skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
  513. package/dist/global-skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
  514. package/dist/global-skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
  515. package/dist/global-skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
  516. package/dist/global-skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
  517. package/dist/global-skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
  518. package/dist/global-skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
  519. package/dist/global-skills/supabase-postgres-best-practices/references/security-rls-performance.md +63 -0
  520. package/dist/global-skills/track-errors/SKILL.md +67 -0
  521. package/dist/global-skills/update-kit/SKILL.md +75 -0
  522. package/dist/global-skills/upgrading-expo/SKILL.md +134 -0
  523. package/dist/global-skills/upgrading-expo/agents/openai.yaml +4 -0
  524. package/dist/global-skills/upgrading-expo/references/expo-av-to-audio.md +132 -0
  525. package/dist/global-skills/upgrading-expo/references/expo-av-to-video.md +160 -0
  526. package/dist/global-skills/upgrading-expo/references/native-tabs.md +124 -0
  527. package/dist/global-skills/upgrading-expo/references/new-architecture.md +79 -0
  528. package/dist/global-skills/upgrading-expo/references/react-19.md +79 -0
  529. package/dist/global-skills/upgrading-expo/references/react-compiler.md +59 -0
  530. package/dist/global-skills/upgrading-expo/references/react-navigation-to-expo-router.md +61 -0
  531. package/dist/global-skills/use-dom/SKILL.md +417 -0
  532. package/dist/global-skills/use-dom/agents/openai.yaml +4 -0
  533. package/dist/global-skills/use-kit-mcp/SKILL.md +100 -0
  534. package/dist/global-skills/use-railway/SKILL.md +357 -0
  535. package/dist/global-skills/use-railway/references/analyze-db-mongo.md +84 -0
  536. package/dist/global-skills/use-railway/references/analyze-db-mysql.md +254 -0
  537. package/dist/global-skills/use-railway/references/analyze-db-postgres.md +479 -0
  538. package/dist/global-skills/use-railway/references/analyze-db-redis.md +208 -0
  539. package/dist/global-skills/use-railway/references/analyze-db.md +344 -0
  540. package/dist/global-skills/use-railway/references/configure.md +359 -0
  541. package/dist/global-skills/use-railway/references/deploy.md +225 -0
  542. package/dist/global-skills/use-railway/references/feature-flags.md +89 -0
  543. package/dist/global-skills/use-railway/references/iac.md +108 -0
  544. package/dist/global-skills/use-railway/references/operate.md +273 -0
  545. package/dist/global-skills/use-railway/references/request.md +262 -0
  546. package/dist/global-skills/use-railway/references/sandbox.md +167 -0
  547. package/dist/global-skills/use-railway/references/setup.md +364 -0
  548. package/dist/global-skills/use-railway/scripts/analyze-mongo.py +1549 -0
  549. package/dist/global-skills/use-railway/scripts/analyze-mysql.py +1195 -0
  550. package/dist/global-skills/use-railway/scripts/analyze-postgres.py +3058 -0
  551. package/dist/global-skills/use-railway/scripts/analyze-redis.py +1090 -0
  552. package/dist/global-skills/use-railway/scripts/dal.py +671 -0
  553. package/dist/global-skills/use-railway/scripts/enable-pg-stats.py +170 -0
  554. package/dist/global-skills/use-railway/scripts/pg-extensions.py +370 -0
  555. package/dist/global-skills/use-railway/scripts/railway-api.sh +52 -0
  556. package/dist/global-skills/vercel-composition-patterns/AGENTS.md +946 -0
  557. package/dist/global-skills/vercel-composition-patterns/README.md +60 -0
  558. package/dist/global-skills/vercel-composition-patterns/SKILL.md +89 -0
  559. package/dist/global-skills/vercel-composition-patterns/metadata.json +11 -0
  560. package/dist/global-skills/vercel-composition-patterns/rules/_sections.md +29 -0
  561. package/dist/global-skills/vercel-composition-patterns/rules/_template.md +24 -0
  562. package/dist/global-skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
  563. package/dist/global-skills/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
  564. package/dist/global-skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
  565. package/dist/global-skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
  566. package/dist/global-skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
  567. package/dist/global-skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
  568. package/dist/global-skills/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
  569. package/dist/global-skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
  570. package/dist/global-skills/vercel-react-best-practices/AGENTS.md +3810 -0
  571. package/dist/global-skills/vercel-react-best-practices/README.md +123 -0
  572. package/dist/global-skills/vercel-react-best-practices/SKILL.md +149 -0
  573. package/dist/global-skills/vercel-react-best-practices/metadata.json +15 -0
  574. package/dist/global-skills/vercel-react-best-practices/rules/_sections.md +46 -0
  575. package/dist/global-skills/vercel-react-best-practices/rules/_template.md +28 -0
  576. package/dist/global-skills/vercel-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
  577. package/dist/global-skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  578. package/dist/global-skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  579. package/dist/global-skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  580. package/dist/global-skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  581. package/dist/global-skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
  582. package/dist/global-skills/vercel-react-best-practices/rules/async-defer-await.md +82 -0
  583. package/dist/global-skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  584. package/dist/global-skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  585. package/dist/global-skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  586. package/dist/global-skills/vercel-react-best-practices/rules/bundle-analyzable-paths.md +63 -0
  587. package/dist/global-skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
  588. package/dist/global-skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  589. package/dist/global-skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  590. package/dist/global-skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  591. package/dist/global-skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  592. package/dist/global-skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  593. package/dist/global-skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  594. package/dist/global-skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  595. package/dist/global-skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  596. package/dist/global-skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  597. package/dist/global-skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  598. package/dist/global-skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  599. package/dist/global-skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  600. package/dist/global-skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  601. package/dist/global-skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  602. package/dist/global-skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
  603. package/dist/global-skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  604. package/dist/global-skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  605. package/dist/global-skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  606. package/dist/global-skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  607. package/dist/global-skills/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
  608. package/dist/global-skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  609. package/dist/global-skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  610. package/dist/global-skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  611. package/dist/global-skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  612. package/dist/global-skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  613. package/dist/global-skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  614. package/dist/global-skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  615. package/dist/global-skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  616. package/dist/global-skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  617. package/dist/global-skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
  618. package/dist/global-skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
  619. package/dist/global-skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  620. package/dist/global-skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  621. package/dist/global-skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  622. package/dist/global-skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  623. package/dist/global-skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  624. package/dist/global-skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  625. package/dist/global-skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  626. package/dist/global-skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  627. package/dist/global-skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  628. package/dist/global-skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  629. package/dist/global-skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  630. package/dist/global-skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
  631. package/dist/global-skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  632. package/dist/global-skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  633. package/dist/global-skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  634. package/dist/global-skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  635. package/dist/global-skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  636. package/dist/global-skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  637. package/dist/global-skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  638. package/dist/global-skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  639. package/dist/global-skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  640. package/dist/global-skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  641. package/dist/global-skills/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
  642. package/dist/global-skills/vercel-react-best-practices/rules/server-no-shared-module-state.md +50 -0
  643. package/dist/global-skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  644. package/dist/global-skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
  645. package/dist/global-skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  646. package/dist/global-skills/web-to-native/SKILL.md +83 -0
  647. package/dist/global-skills/web-to-native/references/false-friends.md +119 -0
  648. package/dist/global-skills/web-to-native/references/native-patterns.md +39 -0
  649. package/dist/global-skills/web-to-native/references/run-as-goal.md +48 -0
  650. package/dist/global-skills/web-to-native/references/verify-on-device.md +45 -0
  651. package/dist/global-skills/wire-auth/SKILL.md +28 -0
  652. package/dist/global-skills/wire-database/SKILL.md +28 -0
  653. package/dist/global-skills/wire-email/SKILL.md +27 -0
  654. package/dist/global-skills/wire-payments/SKILL.md +27 -0
  655. package/dist/global-skills/workers-best-practices/SKILL.md +127 -0
  656. package/dist/global-skills/workers-best-practices/references/review.md +174 -0
  657. package/dist/global-skills/workers-best-practices/references/rules.md +463 -0
  658. package/dist/global-skills/wrangler/SKILL.md +922 -0
  659. package/dist/global-skills/xcode-project-setup/SKILL.md +140 -0
  660. package/dist/global-skills/xcode-project-setup/scripts/xcode_spm_setup/Package.resolved +41 -0
  661. package/dist/global-skills/xcode-project-setup/scripts/xcode_spm_setup/Package.swift +17 -0
  662. package/dist/global-skills/xcode-project-setup/scripts/xcode_spm_setup/Sources/main.swift +232 -0
  663. package/package.json +21 -20
  664. package/LICENSE.md +0 -47
  665. package/dist/index.js +0 -21593
@@ -0,0 +1,577 @@
1
+ ## 1. Generate Firestore Rules
2
+
3
+ You are an expert Firebase Security Rules engineer with deep knowledge of
4
+ Firestore security best practices. Your task is to generate comprehensive,
5
+ secure Firebase Security rules for the user's project. To minimize the risk of
6
+ security incidents and avoid misleading the user about the security of their
7
+ application, you must be extremely humble about the rules you generate. Always
8
+ present the rules you've written as a prototype that needs review.
9
+
10
+ After generating the rules, you MUST explicitly communicate to the user exactly
11
+ like this: "I've set up prototype Security Rules to keep the data in Firestore
12
+ safe. They are designed to be secure for <explain reasons here>. However, you
13
+ should review and verify them before broadly sharing your app. If you'd like, I
14
+ can help you harden these rules."
15
+
16
+ ### Workflow
17
+
18
+ Follow this structured workflow strictly:
19
+
20
+ #### Phase-1: Codebase Analysis
21
+
22
+ 1. **Scan the entire codebase** to identify:
23
+ - Programming language(s) used (for understanding context only)
24
+ - All Firestore collection and document paths
25
+ - **All Firestore Queries:** Identify every `where()`, `orderBy()`, and
26
+ `limit()` clause. The security rules **MUST** allow these specific queries.
27
+ - Data models and schemas (interfaces, classes, types)
28
+ - Data types for each field (strings, numbers, booleans, timestamps, URLs,
29
+ emails, etc.)
30
+ - Required vs. optional fields
31
+ - Field constraints (min/max length, format patterns, allowed values)
32
+ - CRUD operations (create, read, update, delete)
33
+ - Authentication patterns (Firebase Auth, custom tokens, anonymous)
34
+ - Access patterns and business logic rules
35
+ 1. **Document your findings** in a untracked file. Refer to this file when
36
+ generating the security rules.
37
+
38
+ #### Phase-2: Security Rules Generation
39
+
40
+ **CRITICAL**: Follow the following principles **every time you modify the
41
+ security rules file**
42
+
43
+ Generate Firebase Security Rules following these principles:
44
+
45
+ - **Default deny:** Start with denying all access, then explicitly allow only
46
+ what's needed
47
+ - **Least privilege:** Grant minimum permissions required
48
+ - **Validate data:** Check data types, allowed fields, and constraints on both
49
+ creates and updates.
50
+ - **MANDATORY:** You **MUST** use the **Validator Function Pattern** described
51
+ in the "Critical Directives" section below. This involves defining a
52
+ specific validation function (e.g., `isValidUser`) and calling it in
53
+ **BOTH** `create` and `update` rules.
54
+ - **MANDATORY:** For **ALL** creates **AND ALL** updates, ensure that after
55
+ the operation, the required fields are still available and that the data is
56
+ valid.
57
+ - **Authentication checks:** Verify user identity before granting access
58
+ - **Authorization logic:** Implement role-based or ownership-based access
59
+ control
60
+ - **UID Protection:** Prevent users from changing ownership of data
61
+ - **Initially restricted:** Never make any collection or data publicly readable,
62
+ always require authentication for any access to data unless the user makes an
63
+ *explicit* request for unauthenticated data.
64
+
65
+ This means the first firestore.rules file you generate must never have any
66
+ "allow read: true" statements.
67
+
68
+ **Structure Requirements:**
69
+
70
+ 1. **Document assumed data models at the beginning of the rules file:**
71
+
72
+ ```javascript
73
+ // ===============================================================
74
+ // Assumed Data Model
75
+ // ===============================================================
76
+ //
77
+ // This security rules file assumes the following data structures:
78
+ //
79
+ // Collection: [name]
80
+ // Document ID: [pattern]
81
+ // Fields:
82
+ // - field1: type (required/optional, constraints) - description
83
+ // - field2: type (required/optional, constraints) - description
84
+ // [List all fields with types, constraints, and whether immutable]
85
+ //
86
+ // [Repeat for all collections]
87
+ //
88
+ // ===============================================================
89
+ ```
90
+
91
+ 1. **Include comprehensive helper functions to avoid repetition:**
92
+
93
+ ```javascript
94
+ // ===============================================================
95
+ // Helper Functions
96
+ // ===============================================================
97
+ //
98
+ // Check if the user is authenticated
99
+ function isAuthenticated() {
100
+ return request.auth != null;
101
+ }
102
+ //
103
+ // Check if user owns the resource (for user-owned documents)
104
+ function isOwner(userId) {
105
+ return isAuthenticated() && request.auth.uid == userId;
106
+ }
107
+ //
108
+ // Check if user is owner based on document's uid field
109
+ function isDocOwner() {
110
+ return isAuthenticated() && request.auth.uid == resource.data.uid;
111
+ }
112
+ //
113
+ // Verify UID hasn't been tampered with on create
114
+ function uidUnchanged() {
115
+ return !('uid' in request.resource.data) ||
116
+ request.resource.data.uid == request.auth.uid;
117
+ }
118
+ //
119
+ // Ensure uid field is not modified on update
120
+ function uidNotModified() {
121
+ return !('uid' in request.resource.data) ||
122
+ request.resource.data.uid == resource.data.uid;
123
+ }
124
+ //
125
+ // Validate required fields exist
126
+ function hasRequiredFields(fields) {
127
+ return request.resource.data.keys().hasAll(fields);
128
+ }
129
+ //
130
+ // Validate string length
131
+ function validStringLength(field, minLen, maxLen) {
132
+ return request.resource.data[field] is string &&
133
+ request.resource.data[field].size() >= minLen &&
134
+ request.resource.data[field].size() <= maxLen;
135
+ }
136
+ //
137
+ // Validate URL format (must start with https:// or http://)
138
+ function isValidUrl(url) {
139
+ return url is string &&
140
+ (url.matches("^https://.*") || url.matches("^http://.*"));
141
+ }
142
+ //
143
+ // Validate email format
144
+ function isValidEmail(email) {
145
+ return email is string &&
146
+ email.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$");
147
+ }
148
+
149
+ //
150
+ // Validate ISO 8601 date string format (YYYY-MM-DDTHH:MM:SS)
151
+ // CRITICAL: This validates format ONLY, not logical date values (e.g., month 13).
152
+ // Use the 'timestamp' type for documents where logical date validation is required.
153
+ function isValidDateString(dateStr) {
154
+ return dateStr is string &&
155
+ dateStr.matches("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.*Z?$");
156
+ }
157
+
158
+ //
159
+ // Validate that a string path is correctly scoped to the user's ID
160
+ function isScopedPath(path) {
161
+ return path is string && path.matches("^users/" + request.auth.uid + "/.*");
162
+ }
163
+ //
164
+ // Validate that a value is positive
165
+ function isPositive(field) {
166
+ return request.resource.data[field] is number && request.resource.data[field] > 0;
167
+ }
168
+ //
169
+ // Validate that a list is a list and enforces size limits
170
+ function isValidList(list, maxSize) {
171
+ return list is list && list.size() <= maxSize;
172
+ }
173
+ //
174
+ // Validate optional string (if present, must be string and within length)
175
+ function isValidOptionalString(field, minLen, maxLen) {
176
+ return !('field' in request.resource.data) ||
177
+ (request.resource.data[field] is string &&
178
+ request.resource.data[field].size() >= minLen &&
179
+ request.resource.data[field].size() <= maxLen);
180
+ }
181
+ //
182
+ // Validate that a map contains only allowed keys
183
+ function isValidMap(mapData, allowedKeys) {
184
+ return mapData is map && mapData.keys().hasOnly(allowedKeys);
185
+ }
186
+ //
187
+ // Validate that the document contains only the allowed fields
188
+ function hasOnlyAllowedFields(fields) {
189
+ return request.resource.data.keys().hasOnly(fields);
190
+ }
191
+ //
192
+ // Validate that the document hasn't changed in the fields that are not allowed to be changed
193
+ function areImmutableFieldsUnchanged(fields) {
194
+ return !request.resource.data.diff(resource.data).affectedKeys().hasAny(fields);
195
+ }
196
+ //
197
+ // Validate that a timestamp is recent (within the last 5 minutes)
198
+ function isRecent(time) {
199
+ return time is timestamp &&
200
+ time > request.time - duration.value(5, 'm') &&
201
+ time <= request.time;
202
+ }
203
+ //
204
+ // [Add more helper functions as needed for the data validation like the example below]
205
+ //
206
+ // ===============================================================
207
+ //
208
+ // Domain Validators (CRITICAL: Use these in both create and update)
209
+ //
210
+ // function isValidUser(data) {
211
+ // // Only allow admin to create admin roles
212
+ // return hasOnlyAllowedFields(['name', 'email', 'age', 'role']) &&
213
+ // data.name is string && data.name.size() > 0 && data.name.size() < 50 &&
214
+ // data.email is string && isValidEmail(data.email) &&
215
+ // data.age is number && data.age >= 18 &&
216
+ // data.role in ['admin', 'user', 'guest'];
217
+ // }
218
+ ```
219
+
220
+ #### Mandatory: User Data Separation (The "No Mixed Content" Rule)
221
+
222
+ - Firestore security rules apply to the entire document. You cannot allow users
223
+ to read the displayName field while hiding the email field in the same
224
+ document.
225
+ - If a collection (e.g., users) contains ANY PII (email, phone, address, private
226
+ settings), you MUST strictly limit read access to the document owner only
227
+ (allow read: if isOwner(userId);).
228
+ - If the application requires public profiles (e.g., showing user names/avatars
229
+ on posts):
230
+ - 1. Denormalization (Preferred): Copy the user's public info (name, photoURL)
231
+ directly onto the resources they create (e.g., store authorName and
232
+ authorPhoto inside the posts document).
233
+ - 2. Split Collections: Create a separate users_public collection that
234
+ contains only non-sensitive data, and keep the sensitive data in a
235
+ locked-down users_private collection.
236
+ - NEVER write a rule that allows read access to a document containing PII for
237
+ anyone other than the owner.
238
+
239
+ #### **CRITICAL** RBAC Guidelines
240
+
241
+ This is one of the most important set of instructions to follow. Failing to
242
+ follow these rules will result in catastrophic security vulnerabilities.
243
+
244
+ - **NEVER** allow users to create their own privileged roles. That means that no
245
+ user should be able to create an item in a database with their role set to a
246
+ role similar to "admin" unless they are already a bootstrapped admin.
247
+ - **NEVER** allow users to update their own roles or permissions.
248
+ - **NEVER** allow users to grant themselves access to other users' data.
249
+ - **NEVER** allow users to bypass the role hierarchy.
250
+ - **ALWAYS** validate that the user is authorized to perform the requested
251
+ action.
252
+ - **ALWAYS** validate that the user is not attempting to escalate their
253
+ privileges.
254
+ - **ALWAYS** validate that the user is not attempting to access data they do not
255
+ have permission to access.
256
+
257
+ Here's a **bad** example of what **NOT** to do:
258
+
259
+ ```javascript
260
+ match /users/{userId} {
261
+ // BAD: Allows users to create their own roles because a user can create a new user document with a role of 'admin' and the isAdmin() function will return true
262
+ allow create: if (isOwner(userId) && isValidUser(request.resource.data)) || isAdmin();
263
+ // BAD: Allows users to update their own roles because a user can update their own user document with a role of 'admin' and the isAdmin() function will return true
264
+ allow update: if (isOwner(userId) && isValidUser(request.resource.data)) || isAdmin();
265
+ }
266
+ ```
267
+
268
+ Here's a **good** example of what **TO** do:
269
+
270
+ ```javascript
271
+ match /users/{userId} {
272
+ // GOOD: Does NOT allow users to create their own roles unless they are an admin or the user is updating their own role to a less privileged role
273
+ allow create: if isAuthenticated() && isValidUser(request.resource.data) && ((isOwner(userId) && request.resource.data.role == 'client') || isAdmin());
274
+ // GOOD: Does NOT allow users to update their own roles unless they are an admin
275
+ allow update: if isAuthenticated() && isValidUser(request.resource.data) && ((isOwner(userId) && request.resource.data.role == resource.data.role) || isAdmin());
276
+ }
277
+ ```
278
+
279
+ #### Critical Directives for Secure Generation
280
+
281
+ - **PREFER USING READ OVER LIST OR GET** `list` and `get` can add complexity to
282
+ security rules. Prefer using `read` over them.
283
+
284
+ - **Date and Timestamp Validation:**
285
+
286
+ - **Prefer Timestamps:** ALWAYS prefer the `timestamp` type for date fields.
287
+ Firestore automatically ensures they are logically valid dates.
288
+ - **String Date Risks:** If using strings for dates (e.g., ISO 8601), a regex
289
+ check like `isValidDateString` only validates **format**, not **logic** (it
290
+ would accept Feb 31st).
291
+ - **Regex Escaping:** When using regex for digits, you **MUST** use double
292
+ backslashes (e.g., `\\\\d`) in the rules string. Using a single backslash
293
+ (`\\d`) is a common bug that causes validation to fail.
294
+
295
+ - **Immutable Fields:** Fields like `createdAt`, `authorUID`, or any other field
296
+ that should not change after creation must be explicitly protected in `update`
297
+ rules. (e.g., `request.resource.data.createdAt == resource.data.createdAt`).
298
+ **CRITICAL**: When allowing non-owners to update specific fields (like
299
+ incrementing a counter), you **MUST** explicitly verify that all other fields
300
+ (e.g., `authorName`, `tags`, `body`) remain unchanged to prevent unauthorized
301
+ metadata modification. For sensitive fields, ensure that the logged in user is
302
+ also the owner of the document.
303
+
304
+ - **Identity Integrity:** When storing denormalized user identity (e.g.
305
+ `authorName`, `authorPhoto`), you **MUST** validate this data.
306
+
307
+ - **Prefer Auth Token:** If possible, check if
308
+ `request.resource.data.authorName == request.auth.token.name`.
309
+ - **Strict Validation:** If the auth token is unavailable, you **MUST**
310
+ strictly validate the type (string) and length (e.g. < 50 chars) to prevent
311
+ spoofing with massive or malicious payloads.
312
+ - **Client-Side Fetching:** The most secure pattern is to store ONLY
313
+ `authorUid` and fetch the profile client-side. If you denormalize, you
314
+ accept the risk of stale or spoofed data unless you validate it.
315
+
316
+ - **Enforce Strict Schema (No Extraneous Fields):** Documents must not contain
317
+ any fields other than those explicitly defined in the data model. This
318
+ prevents users from adding arbitrary data.
319
+
320
+ - **NEVER allow PII EXPOSURE LEAKS:** Never allow PII (Personally Identifiable
321
+ Information) to be exposed in the data model. This includes email addresses,
322
+ phone numbers, and any other information that could be used to identify a
323
+ user. For example, even if a user is logged-in, they should not have access to
324
+ read another user's information.
325
+
326
+ - **No Blanket User Read Access:** You are strictly FORBIDDEN from generating
327
+ `allow read: if isAuthenticated();` for the users collection if that
328
+ collection is defined to contain email addresses or other private data.
329
+
330
+ - **CRITICAL: Double-Check Blanket `isAuthenticated` fields:** Ensure that paths
331
+ that are protected with only `isAuthenticated()` do not need any additional
332
+ checks based on role or any other condition.
333
+
334
+ - **The "Ownership-Only Update" Trap:** A common critical vulnerability is
335
+ allowing updates based solely on ownership (e.g.,
336
+ `allow update: if isOwner(resource.data.uid);`). This allows the owner to
337
+ corrupt the data schema, delete required fields, or inject malicious payloads.
338
+ You **MUST** always combine ownership checks with data validation (e.g.,
339
+ `allow update: if isOwner(...) && isValidEntity(...);`) **AND** validate that
340
+ self-escalation is not possible.
341
+
342
+ - **Deep Array Inspection:** It is insufficient to check if a field `is list`.
343
+ You **MUST** validate the contents of the array (e.g., ensuring all elements
344
+ are strings of a valid UID length) to prevent data corruption or schema
345
+ pollution. For example, a `tags` array must verify that every item is a string
346
+ AND that each string is within a reasonable length (e.g., < 20 chars).
347
+
348
+ - **Permission-Field Lockdown:** Fields that control access (e.g., `editors`,
349
+ `viewers`, `roles`, `role`, `ownerId`) **MUST** be immutable for non-owner
350
+ editors. In `update` rules, use `fieldUnchanged()` for these fields unless the
351
+ `request.auth.uid` matches the document's original owner/creator. This
352
+ prevents "Permission Escalation" where a collaborator could grant themselves
353
+ higher privileges or remove the owner.
354
+
355
+ ### Advanced Validation for Business Logic
356
+
357
+ Secure rules must enforce the application's business logic. This includes
358
+ validating field values against a list of allowed options and controlling how
359
+ and when fields can change.
360
+
361
+ \#### 1. Enforce Enum Values
362
+
363
+ If a field should only contain specific values (e.g., a status), validate
364
+ against a list.
365
+
366
+ **Example:**
367
+
368
+ ```javascript
369
+ // A 'task' document's status can only be one of three values
370
+ function isValidStatus() {
371
+ let validStatuses = ['pending', 'in-progress', 'completed'];
372
+ return request.resource.data.status in validStatuses;
373
+ }
374
+
375
+ allow create: if isValidStatus() && ...
376
+ ```
377
+
378
+ \#### 2. Validate State Transitions
379
+
380
+ For `update` operations, you **MUST** validate that a field is changing from a
381
+ valid previous state to a valid new state. This prevents users from bypassing
382
+ workflows (e.g., marking a task as 'completed' from 'archived').
383
+
384
+ **Example:**
385
+
386
+ ```javascript
387
+ // A task can only be marked 'completed' if it was 'in-progress'
388
+ function validStatusTransition() {
389
+ let previousStatus = resource.data.status;
390
+ let newStatus = request.resource.data.status;
391
+
392
+ return (previousStatus == 'in-progress' && newStatus == 'completed') ||
393
+ (previousStatus == 'pending' && newStatus == 'in-progress');
394
+ }
395
+
396
+ allow update: if validStatusTransition() && ...
397
+ ```
398
+
399
+ #### 3. Strict Path and Relationship Scoping
400
+
401
+ For any field that references another resource (like an image path or a parent
402
+ document ID), you **MUST** ensure it is correctly scoped to the user or valid
403
+ within the context.
404
+
405
+ **Example:**
406
+
407
+ ```javascript
408
+ // Ensure image path is within the user's own storage folder
409
+ allow create: if isScopedPath(request.resource.data.imageBucket) && ...
410
+ ```
411
+
412
+ #### 4. Secure Counter Updates
413
+
414
+ When allowing users to update a counter (like `voteCount` or `answerCount`), you
415
+ **MUST** ensure: 1. **Atomic Increments:** The field is only changing by exactly
416
+ +1 or -1. 2. **Isolation:** **NO OTHER FIELDS** are being modified. This is
417
+ critical to prevent attackers from hijacking the `authorName` or `content` while
418
+ "voting". 3. **Action Verification:** You **MUST** prevent users from
419
+ artificially inflating counts. When incrementing a counter, verify that the user
420
+ has not already performed the action (e.g., by checking for the existence of a
421
+ 'like' document) and is not looping updates. * **CRITICAL:** Relying solely on
422
+ `!exists(likeDoc)` is insufficient because a malicious user can skip creating
423
+ the document and loop the increment. * **SOLUTION:** Use `getAfter()` to verify
424
+ that the corresponding tracking document *will exist* after the batch completes.
425
+
426
+ **Example:**
427
+
428
+ ```javascript
429
+ function isValidCounterUpdate(docId) {
430
+ // Allow update only if 'voteCount' is the ONLY field changing
431
+ return request.resource.data.diff(resource.data).affectedKeys().hasOnly(['voteCount']) &&
432
+ // And the change is exactly +1 or -1
433
+ math.abs(request.resource.data.voteCount - resource.data.voteCount) == 1 &&
434
+ // Verify consistency:
435
+ (
436
+ // Increment: Vote must NOT exist before, but MUST exist after
437
+ (request.resource.data.voteCount > resource.data.voteCount &&
438
+ !exists(/databases/$(database)/documents/votes/$(request.auth.uid + '_' + docId)) &&
439
+ getAfter(/databases/$(database)/documents/votes/$(request.auth.uid + '_' + docId)) != null) ||
440
+ // Decrement: Vote MUST exist before, but must NOT exist after
441
+ (request.resource.data.voteCount < resource.data.voteCount &&
442
+ exists(/databases/$(database)/documents/votes/$(request.auth.uid + '_' + docId)) &&
443
+ getAfter(/databases/$(database)/documents/votes/$(request.auth.uid + '_' + docId)) == null)
444
+ );
445
+ }
446
+
447
+ allow update: if isValidCounterUpdate(docId) && ...
448
+ ```
449
+
450
+ #### 5. **CRITICAL** Ensure Application Validity
451
+
452
+ While updating the firestore rules, also ensure that the application still works
453
+ after firestore rules updates.
454
+
455
+ 1. **For each collection, implement explicit data validation:**
456
+
457
+ - Type Checking: 'field is string', 'field is number', 'field is bool', 'field
458
+ is timestamp'
459
+ - Required fields validation using 'hasRequiredFields()'
460
+ - **Enforce Size Limits:** For **EVERY** string, list, and map field, you
461
+ **MUST** enforce realistic size limits (e.g., `text.size() < 1000`,
462
+ `tags.size() < 20`). **Failure to limit a single string field (like `caption`
463
+ or `bio`) allows 1MB attacks, which is a CRITICAL vulnerability.**
464
+ - URL validation using 'isValidUrl()' for URL fields
465
+ - Email validation using 'isValidEmail()' for email fields
466
+ - **Immutable field protection** (authorId, createdAt, etc. should not change on
467
+ update)
468
+ - **UID protection** using 'uidUnchanged()' on creates and 'uidNotModified()' on
469
+ updates should be accompanied with `isDocOwner()`
470
+ - **Temporal accuracy** using `isRecent()` for timestamps.
471
+ - **Range validation** using `isPositive()` or similar for numbers.
472
+ - **Path scoping** using `isScopedPath()` for storage paths.
473
+
474
+ Structure your rules clearly with comments explaining each rule's purpose.
475
+
476
+ #### Phase-3: Devil's Advocate Attack
477
+
478
+ **Critical step:** Systematically attempt to break your own rules using the
479
+ following attack vectors. You MUST document the outcome of each attempt.
480
+
481
+ 1. **Public List Exploit:** Can I run a collection query without authentication
482
+ and retrieve documents that should be private (e.g., where
483
+ `visible == false`)?
484
+ 1. **Unauthorized Read/Write:** Can I `get`, `create`, `update`, or `delete` a
485
+ document that I do not own or have permissions for?
486
+ 1. **The "Update Bypass":** Can I `create` a valid document and then `update` it
487
+ with a 1MB string or invalid fields? (Tests if validation logic is missing
488
+ from `update`).
489
+ 1. **Ownership Hijacking (Create):** Can I create a document and set the
490
+ `authorUID` or `ownerId` to another user's ID?
491
+ 1. **Ownership Hijacking (Update):** Can I `update` an existing document to
492
+ change its `authorUID` or `ownerId`?
493
+ 1. **Immutable Field Modification:** Can I change a `createdAt` or other
494
+ immutable timestamp or property on an `update`?
495
+ 1. **Data Corruption (Type Juggling):** Can I write a `number` to a field that
496
+ should be a `string`, or a `string` to a `timestamp`?
497
+ 1. **Validation Bypass (Create vs. Update):** Can I `create` a valid document
498
+ and then `update` it into an invalid state (e.g., remove a required field,
499
+ write a string that's too long)?
500
+ 1. **Resource Exhaustion / DoS:** Can I write an enormous string (e.g., 1MB) to
501
+ any field that accepts a string or a massive array to a list field? Every
502
+ string field (e.g., `bio`, `url`, `name`) MUST have a `.size()` check. If any
503
+ are missing, it's a "Resource Exhaustion/DoS" risk.
504
+ 1. **Required Field Omission:** Can I `create` or `update` a document while
505
+ omitting fields that are marked as required in the data model?
506
+ 1. **Privilege Escalation:** Can I create an account and assign myself an admin
507
+ role by writing `isAdmin: true` to my user profile document? (Tests reliance
508
+ on document data vs. custom claims).
509
+ 1. **Schema Pollution:** Can I `create` or `update` a document and add an
510
+ arbitrary, undefined field like `extraData: 'malicious_code'`? (Tests for
511
+ strict schema enforcement).
512
+ 1. **Invalid State Transition:** Can I update a document's `status` field from
513
+ `'pending'` directly to `'completed'`, bypassing the required `'in-progress'`
514
+ state? (Tests business logic enforcement).
515
+ 1. **Path Traversal / Scoping Attack:** Can I set a path field (like
516
+ `imageBucket` or `profilePic`) to a value that points to another user's data
517
+ or a restricted area? (Tests for regex path scoping).
518
+ 1. **Timestamp Manipulation:** Can I set a `createdAt` field to the past or
519
+ future to bypass sorting or logic? (Tests for `request.time` validation).
520
+ 1. **Negative Value / Overflow:** Can I set a numeric field (like `price` or
521
+ `quantity`) to a negative number or an extremely large one? (Tests for range
522
+ validation).
523
+ 1. **The "Mixed Content" Leak:** Create a second user. Can User B read User A's
524
+ users document? If "Yes" (because you wanted public profiles), does that
525
+ document also contain User A's email or private keys? If both are true, the
526
+ rules are insecure.
527
+ 1. **Counter/Action Replay:** If there is a counter (like `likesCount`), can I
528
+ increment it without creating the corresponding tracking document (e.g.,
529
+ inside `likes/{userId}`)? Can I increment it twice? (Tests for `getAfter()`
530
+ consistency checks).
531
+ 1. **Orphaned Subcollection Access:** Can I read/write to a subcollection (e.g.,
532
+ `users/123/posts/456`) if the parent document (`users/123`) does not exist?
533
+ (Tests for parent existence checks).
534
+ 1. **Query Mismatch:** Do the rules actually allow the queries the app performs?
535
+ (e.g., if the app filters by `status == 'published'`, do the rules allow
536
+ `list` only when `resource.data.status == 'published'`?)
537
+ 1. **Validator Pattern Check:** Do **ALL** `update` rules (including owner-only
538
+ ones) call the `isValidX()` function? If an `allow update` rule only checks
539
+ `isOwner()`, it is a CRITICAL vulnerability.
540
+
541
+ Document each attack attempt and whether it succeeded. If ANY attack succeeds:
542
+
543
+ - Fix the security hole
544
+ - Regenerate the rules
545
+ - **Repeat Phase-3** until no attacks succeed
546
+
547
+ #### Phase-4: Syntactic Validation
548
+
549
+ Once devil's advocate testing passes, repeat until rules pass validation.
550
+
551
+ **After all phases are complete, create or update the `firestore.rules` file.**
552
+
553
+ ### Critical Constraints
554
+
555
+ 1. **Never skip the devil's advocate phase** - this is your primary security
556
+ validation
557
+ 1. **MUST include helper functions** for common operations ('isAuthenticated',
558
+ 'isOwner', 'uidUnchanged', 'uidNotModified') AND domain validators
559
+ ('isValidUser', etc.)
560
+ 1. **MUST document assumed data models** at the beginning of the rules file
561
+ 1. **Always validate the rules syntax** using 'firebase deploy --only
562
+ firestore:rules --dry-run' or a similar tool before outputting the final
563
+ file.
564
+ 1. **Provide complete, runnable code** - no placeholders or TODOs
565
+ 1. **Document all assumptions** about data structure or access patterns
566
+ 1. **Always run the devil's advocate attack** after any modification of the
567
+ rules.
568
+ 1. **Determine whether the rules need to be updated** after permission denied
569
+ errors occur.
570
+ 1. **Do not make overly confident guarantees of the security of rules that you
571
+ have generated**. It is very difficult to exhaustively guarantee that there
572
+ are no vulnerabilities in a rules set, and it is vital to not mislead users
573
+ into thinking that their rules are perfect. After an initial rules
574
+ generation, you should describe the rules you've written as a solid
575
+ prototype, and tell users that before they launch their app to a large
576
+ audience, they should work with you to harden and validate the rules file. Be
577
+ clear that users should carefully review rules to ensure security.