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,1001 @@
1
+ # PostHog astro-hybrid Example Project
2
+
3
+ Repository: https://github.com/PostHog/context-mill
4
+ Path: example-apps/astro-hybrid
5
+
6
+ ---
7
+
8
+ ## README.md
9
+
10
+ # PostHog Astro Hybrid Example
11
+
12
+ This is an [Astro](https://astro.build/) hybrid rendering example demonstrating PostHog integration with both static and on-demand rendered pages.
13
+
14
+ Hybrid mode allows you to have most pages prerendered (static) while opting specific pages into server-side rendering (SSR) when needed.
15
+
16
+ It uses:
17
+
18
+ - **Client-side**: PostHog web snippet for browser analytics
19
+ - **Server-side**: `posthog-node` for API route event tracking
20
+
21
+ This shows how to:
22
+
23
+ - Configure Astro for hybrid rendering (static default with per-page SSR opt-in)
24
+ - Opt specific pages into SSR with `export const prerender = false`
25
+ - Keep most pages static for performance
26
+ - Track events from API routes using `posthog-node`
27
+ - Pass session IDs from client to server for unified sessions
28
+
29
+ ## Features
30
+
31
+ - **Hybrid rendering**: Static pages by default, SSR when needed
32
+ - **API routes**: Server-side endpoints for auth and event tracking
33
+ - **Dual tracking**: Events captured on both client and server
34
+ - **Session continuity**: Session ID passed to server via headers
35
+ - **Product analytics**: Track login and burrito consideration events
36
+ - **Error tracking**: Manual error capture sent to PostHog
37
+
38
+ ## Getting started
39
+
40
+ ### 1. Install dependencies
41
+
42
+ ```bash
43
+ npm install
44
+ # or
45
+ pnpm install
46
+ ```
47
+
48
+ ### 2. Configure environment variables
49
+
50
+ Create a `.env` file in the project root:
51
+
52
+ ```bash
53
+ PUBLIC_POSTHOG_PROJECT_TOKEN=your_posthog_project_token
54
+ PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
55
+ ```
56
+
57
+ Get your PostHog project token from your project settings in PostHog.
58
+
59
+ ### 3. Run the development server
60
+
61
+ ```bash
62
+ npm run dev
63
+ # or
64
+ pnpm dev
65
+ ```
66
+
67
+ Open `http://localhost:4321` in your browser.
68
+
69
+ ## Project structure
70
+
71
+ ```text
72
+ src/
73
+ components/
74
+ posthog.astro # PostHog snippet for client-side tracking
75
+ Header.astro # Navigation + logout, calls posthog.reset()
76
+ layouts/
77
+ PostHogLayout.astro # Root layout that includes PostHog + Header
78
+ lib/
79
+ auth.ts # Client-side auth utilities
80
+ posthog-server.ts # Server-side PostHog client singleton
81
+ pages/
82
+ index.astro # Static (prerendered) - login form
83
+ burrito.astro # SSR (prerender=false) - calls API routes
84
+ profile.astro # Static (prerendered) - user profile
85
+ api/
86
+ auth/
87
+ login.ts # Server-side login endpoint with PostHog tracking
88
+ events/
89
+ burrito.ts # Server-side event capture endpoint
90
+ styles/
91
+ global.css # Global styles
92
+ ```
93
+
94
+ ## Key integration points
95
+
96
+ ### Hybrid mode configuration (`astro.config.mjs`)
97
+
98
+ In Astro 5, `output: 'static'` is the default and supports per-page SSR opt-in. You need an adapter for the SSR pages to work:
99
+
100
+ ```javascript
101
+ import { defineConfig } from "astro/config";
102
+ import node from "@astrojs/node";
103
+
104
+ export default defineConfig({
105
+ // 'static' is the default - pages are prerendered unless they opt out
106
+ output: "static",
107
+ adapter: node({ mode: "standalone" }),
108
+ });
109
+ ```
110
+
111
+ ### Opting a page into SSR (`src/pages/burrito.astro`)
112
+
113
+ ```astro
114
+ ---
115
+ // Opt this page into on-demand rendering (SSR)
116
+ // In hybrid mode, pages are static by default
117
+ export const prerender = false;
118
+ ---
119
+ ```
120
+
121
+ ### Server-side PostHog client (`src/lib/posthog-server.ts`)
122
+
123
+ A singleton pattern ensures only one PostHog client is created:
124
+
125
+ ```typescript
126
+ import { PostHog } from "posthog-node";
127
+
128
+ let posthogClient: PostHog | null = null;
129
+
130
+ export function getPostHogServer(): PostHog {
131
+ if (!posthogClient) {
132
+ posthogClient = new PostHog(import.meta.env.PUBLIC_POSTHOG_PROJECT_TOKEN, {
133
+ host: import.meta.env.PUBLIC_POSTHOG_HOST,
134
+ flushAt: 1,
135
+ flushInterval: 0,
136
+ });
137
+ }
138
+ return posthogClient;
139
+ }
140
+ ```
141
+
142
+ ### API route with server-side tracking (`src/pages/api/events/burrito.ts`)
143
+
144
+ ```typescript
145
+ import { getPostHogServer } from "../../../lib/posthog-server";
146
+
147
+ export const POST: APIRoute = async ({ request }) => {
148
+ const body = await request.json();
149
+ const sessionId = request.headers.get("X-PostHog-Session-Id");
150
+
151
+ const posthog = getPostHogServer();
152
+ posthog.capture({
153
+ distinctId: body.username,
154
+ event: "burrito_considered",
155
+ properties: {
156
+ $session_id: sessionId || undefined,
157
+ source: "api",
158
+ },
159
+ });
160
+
161
+ return new Response(JSON.stringify({ success: true }));
162
+ };
163
+ ```
164
+
165
+ ## When to use Hybrid mode
166
+
167
+ Use hybrid mode when you want:
168
+
169
+ - **Performance**: Most pages prerendered as static HTML
170
+ - **Flexibility**: Some pages need server-side logic (auth, personalization)
171
+ - **API routes**: Server-side endpoints for data processing
172
+
173
+ ## Scripts
174
+
175
+ ```bash
176
+ # Run dev server
177
+ npm run dev
178
+
179
+ # Build for production
180
+ npm run build
181
+
182
+ # Preview production build
183
+ npm run preview
184
+ ```
185
+
186
+ ## Learn more
187
+
188
+ - [PostHog documentation](https://posthog.com/docs)
189
+ - [PostHog Astro guide](https://posthog.com/docs/libraries/astro)
190
+ - [PostHog Node.js SDK](https://posthog.com/docs/libraries/node)
191
+ - [Astro Hybrid Rendering](https://docs.astro.build/en/guides/on-demand-rendering/)
192
+
193
+ ---
194
+
195
+ ## .env.example
196
+
197
+ ```example
198
+ PUBLIC_POSTHOG_PROJECT_TOKEN=your_posthog_project_token_here
199
+ PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
200
+
201
+ ```
202
+
203
+ ---
204
+
205
+ ## astro.config.mjs
206
+
207
+ ```mjs
208
+ import { defineConfig } from "astro/config";
209
+ import node from "@astrojs/node";
210
+
211
+ export default defineConfig({
212
+ // In Astro 5, 'static' is the default and supports per-page SSR opt-in
213
+ // Use `export const prerender = false` in pages that need server rendering
214
+ output: "static",
215
+ adapter: node({
216
+ mode: "standalone",
217
+ }),
218
+ image: {
219
+ service: { entrypoint: "astro/assets/services/noop" },
220
+ },
221
+ });
222
+
223
+ ```
224
+
225
+ ---
226
+
227
+ ## src/components/Header.astro
228
+
229
+ ```astro
230
+ ---
231
+ // Header component with navigation and logout functionality
232
+ ---
233
+ <header class="header">
234
+ <div class="header-container">
235
+ <nav>
236
+ <a href="/">Home</a>
237
+ <a href="/burrito" class="auth-link" style="display: none;">Burrito Consideration</a>
238
+ <a href="/profile" class="auth-link" style="display: none;">Profile</a>
239
+ </nav>
240
+ <div class="user-section">
241
+ <span class="welcome-text" style="display: none;">Welcome, <span class="username"></span>!</span>
242
+ <span class="not-logged-in">Not logged in</span>
243
+ <button class="btn-logout" style="display: none;">Logout</button>
244
+ </div>
245
+ </div>
246
+ </header>
247
+
248
+ <script is:inline>
249
+ function updateHeader() {
250
+ const currentUser = localStorage.getItem('currentUser');
251
+ const authLinks = document.querySelectorAll('.auth-link');
252
+ const welcomeText = document.querySelector('.welcome-text');
253
+ const notLoggedIn = document.querySelector('.not-logged-in');
254
+ const logoutBtn = document.querySelector('.btn-logout');
255
+ const usernameSpan = document.querySelector('.username');
256
+
257
+ if (currentUser) {
258
+ authLinks.forEach(link => link.style.display = 'inline');
259
+ welcomeText.style.display = 'inline';
260
+ notLoggedIn.style.display = 'none';
261
+ logoutBtn.style.display = 'inline';
262
+ usernameSpan.textContent = currentUser;
263
+ } else {
264
+ authLinks.forEach(link => link.style.display = 'none');
265
+ welcomeText.style.display = 'none';
266
+ notLoggedIn.style.display = 'inline';
267
+ logoutBtn.style.display = 'none';
268
+ }
269
+ }
270
+
271
+ function handleLogout() {
272
+ const currentUser = localStorage.getItem('currentUser');
273
+ if (currentUser) {
274
+ window.posthog?.capture('user_logged_out');
275
+ }
276
+ localStorage.removeItem('currentUser');
277
+ localStorage.removeItem('burritoConsiderations');
278
+ // IMPORTANT: Reset the PostHog instance to clear the user session
279
+ window.posthog?.reset();
280
+ window.location.href = '/';
281
+ }
282
+
283
+ document.addEventListener('DOMContentLoaded', () => {
284
+ updateHeader();
285
+ document.querySelector('.btn-logout')?.addEventListener('click', handleLogout);
286
+ });
287
+
288
+ // Listen for storage changes (login/logout in other tabs)
289
+ window.addEventListener('storage', updateHeader);
290
+ </script>
291
+
292
+ <style>
293
+ .header {
294
+ background-color: #333;
295
+ color: white;
296
+ padding: 1rem;
297
+ }
298
+
299
+ .header-container {
300
+ max-width: 1200px;
301
+ margin: 0 auto;
302
+ display: flex;
303
+ justify-content: space-between;
304
+ align-items: center;
305
+ }
306
+
307
+ .header nav {
308
+ display: flex;
309
+ gap: 1rem;
310
+ }
311
+
312
+ .header a {
313
+ color: white;
314
+ text-decoration: none;
315
+ padding: 0.5rem 1rem;
316
+ border-radius: 4px;
317
+ transition: background-color 0.2s;
318
+ }
319
+
320
+ .header a:hover {
321
+ background-color: #555;
322
+ text-decoration: none;
323
+ }
324
+
325
+ .user-section {
326
+ display: flex;
327
+ align-items: center;
328
+ gap: 1rem;
329
+ }
330
+
331
+ .btn-logout {
332
+ background-color: #dc3545;
333
+ color: white;
334
+ border: none;
335
+ padding: 0.5rem 1rem;
336
+ border-radius: 4px;
337
+ cursor: pointer;
338
+ font-size: 14px;
339
+ }
340
+
341
+ .btn-logout:hover {
342
+ background-color: #c82333;
343
+ }
344
+ </style>
345
+
346
+ ```
347
+
348
+ ---
349
+
350
+ ## src/components/posthog.astro
351
+
352
+ ```astro
353
+ ---
354
+ // PostHog analytics snippet for client-side tracking
355
+ // Uses is:inline to prevent Astro from processing the script
356
+ ---
357
+ <script is:inline define:vars={{ apiKey: import.meta.env.PUBLIC_POSTHOG_PROJECT_TOKEN, apiHost: import.meta.env.PUBLIC_POSTHOG_HOST }}>
358
+ !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags getFeatureFlag getFeatureFlagPayload reloadFeatureFlags group updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures getActiveMatchingSurveys getSurveys getNextSurveyStep onSessionId".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
359
+ posthog.init(apiKey || '', {
360
+ api_host: apiHost || 'https://us.i.posthog.com',
361
+ defaults: '2026-01-30'
362
+ })
363
+ </script>
364
+
365
+ ```
366
+
367
+ ---
368
+
369
+ ## src/layouts/PostHogLayout.astro
370
+
371
+ ```astro
372
+ ---
373
+ import PostHog from '../components/posthog.astro';
374
+ import Header from '../components/Header.astro';
375
+ import '../styles/global.css';
376
+
377
+ interface Props {
378
+ title: string;
379
+ }
380
+
381
+ const { title } = Astro.props;
382
+ ---
383
+ <!doctype html>
384
+ <html lang="en">
385
+ <head>
386
+ <meta charset="UTF-8" />
387
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
388
+ <meta name="description" content="Astro PostHog SSR Integration Example" />
389
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
390
+ <title>{title}</title>
391
+ <PostHog />
392
+ </head>
393
+ <body>
394
+ <Header />
395
+ <main>
396
+ <slot />
397
+ </main>
398
+ </body>
399
+ </html>
400
+
401
+ ```
402
+
403
+ ---
404
+
405
+ ## src/lib/auth.ts
406
+
407
+ ```ts
408
+ // Client-side auth utilities for localStorage-based authentication
409
+
410
+ export interface User {
411
+ username: string;
412
+ burritoConsiderations: number;
413
+ }
414
+
415
+ export function getCurrentUser(): User | null {
416
+ if (typeof window === "undefined") return null;
417
+
418
+ const username = localStorage.getItem("currentUser");
419
+ if (!username) return null;
420
+
421
+ const considerations = parseInt(
422
+ localStorage.getItem("burritoConsiderations") || "0",
423
+ 10,
424
+ );
425
+
426
+ return {
427
+ username,
428
+ burritoConsiderations: considerations,
429
+ };
430
+ }
431
+
432
+ export function login(username: string, password: string): boolean {
433
+ if (!username || !password) return false;
434
+
435
+ localStorage.setItem("currentUser", username);
436
+ // Initialize burrito considerations if not set
437
+ if (!localStorage.getItem("burritoConsiderations")) {
438
+ localStorage.setItem("burritoConsiderations", "0");
439
+ }
440
+
441
+ return true;
442
+ }
443
+
444
+ export function logout(): void {
445
+ localStorage.removeItem("currentUser");
446
+ localStorage.removeItem("burritoConsiderations");
447
+ }
448
+
449
+ export function incrementBurritoConsiderations(): number {
450
+ const current = parseInt(
451
+ localStorage.getItem("burritoConsiderations") || "0",
452
+ 10,
453
+ );
454
+ const newCount = current + 1;
455
+ localStorage.setItem("burritoConsiderations", newCount.toString());
456
+ return newCount;
457
+ }
458
+
459
+ ```
460
+
461
+ ---
462
+
463
+ ## src/lib/posthog-server.ts
464
+
465
+ ```ts
466
+ import { PostHog } from "posthog-node";
467
+
468
+ let posthogClient: PostHog | null = null;
469
+
470
+ /**
471
+ * Get the PostHog server-side client.
472
+ * Uses a singleton pattern to avoid creating multiple clients.
473
+ */
474
+ export function getPostHogServer(): PostHog {
475
+ if (!posthogClient) {
476
+ posthogClient = new PostHog(import.meta.env.PUBLIC_POSTHOG_PROJECT_TOKEN || "", {
477
+ host: import.meta.env.PUBLIC_POSTHOG_HOST || "https://us.i.posthog.com",
478
+ // Flush immediately for demo purposes
479
+ // In production, you might want to batch events
480
+ flushAt: 1,
481
+ flushInterval: 0,
482
+ });
483
+ }
484
+ return posthogClient;
485
+ }
486
+
487
+ /**
488
+ * Shutdown the PostHog client gracefully.
489
+ * Call this when your server is shutting down.
490
+ */
491
+ export async function shutdownPostHog(): Promise<void> {
492
+ if (posthogClient) {
493
+ await posthogClient.shutdown();
494
+ posthogClient = null;
495
+ }
496
+ }
497
+
498
+ ```
499
+
500
+ ---
501
+
502
+ ## src/pages/api/auth/login.ts
503
+
504
+ ```ts
505
+ import type { APIRoute } from "astro";
506
+ import { getPostHogServer } from "../../../lib/posthog-server";
507
+
508
+ export const prerender = false;
509
+
510
+ // In-memory user store for demo purposes
511
+ const users = new Map<string, { username: string; createdAt: string }>();
512
+
513
+ export const POST: APIRoute = async ({ request }) => {
514
+ try {
515
+ const body = await request.json();
516
+ const { username, password } = body;
517
+
518
+ if (!username || !password) {
519
+ return new Response(
520
+ JSON.stringify({ error: "Username and password are required" }),
521
+ { status: 400, headers: { "Content-Type": "application/json" } },
522
+ );
523
+ }
524
+
525
+ // Check if this is a new user
526
+ const isNewUser = !users.has(username);
527
+
528
+ if (isNewUser) {
529
+ users.set(username, {
530
+ username,
531
+ createdAt: new Date().toISOString(),
532
+ });
533
+ }
534
+
535
+ // Get the PostHog server client
536
+ const posthog = getPostHogServer();
537
+
538
+ // Get session ID from client if available (passed via header)
539
+ const sessionId = request.headers.get("X-PostHog-Session-Id");
540
+
541
+ // Capture server-side login event
542
+ posthog.capture({
543
+ distinctId: username,
544
+ event: "server_login",
545
+ properties: {
546
+ $session_id: sessionId || undefined,
547
+ isNewUser,
548
+ source: "api",
549
+ timestamp: new Date().toISOString(),
550
+ },
551
+ });
552
+
553
+ // Also identify the user server-side
554
+ posthog.identify({
555
+ distinctId: username,
556
+ properties: {
557
+ username,
558
+ createdAt: isNewUser ? new Date().toISOString() : undefined,
559
+ },
560
+ });
561
+
562
+ // This endpoint is short-lived; flush so the enqueued events send before it returns
563
+ await posthog.flush();
564
+
565
+ return new Response(
566
+ JSON.stringify({
567
+ success: true,
568
+ username,
569
+ isNewUser,
570
+ }),
571
+ { status: 200, headers: { "Content-Type": "application/json" } },
572
+ );
573
+ } catch (error) {
574
+ console.error("Login error:", error);
575
+ return new Response(JSON.stringify({ error: "Internal server error" }), {
576
+ status: 500,
577
+ headers: { "Content-Type": "application/json" },
578
+ });
579
+ }
580
+ };
581
+
582
+ ```
583
+
584
+ ---
585
+
586
+ ## src/pages/api/events/burrito.ts
587
+
588
+ ```ts
589
+ import type { APIRoute } from "astro";
590
+ import { getPostHogServer } from "../../../lib/posthog-server";
591
+
592
+ export const prerender = false;
593
+
594
+ export const POST: APIRoute = async ({ request }) => {
595
+ try {
596
+ const body = await request.json();
597
+ const { username, totalConsiderations } = body;
598
+
599
+ if (!username) {
600
+ return new Response(JSON.stringify({ error: "Username is required" }), {
601
+ status: 400,
602
+ headers: { "Content-Type": "application/json" },
603
+ });
604
+ }
605
+
606
+ // Get the PostHog server client
607
+ const posthog = getPostHogServer();
608
+
609
+ // Get session ID from client if available (passed via header)
610
+ const sessionId = request.headers.get("X-PostHog-Session-Id");
611
+
612
+ // Capture server-side burrito consideration event
613
+ posthog.capture({
614
+ distinctId: username,
615
+ event: "burrito_considered",
616
+ properties: {
617
+ $session_id: sessionId || undefined,
618
+ total_considerations: totalConsiderations,
619
+ source: "api",
620
+ timestamp: new Date().toISOString(),
621
+ },
622
+ });
623
+
624
+ // This endpoint is short-lived; flush so the enqueued event sends before it returns
625
+ await posthog.flush();
626
+
627
+ return new Response(
628
+ JSON.stringify({
629
+ success: true,
630
+ totalConsiderations,
631
+ }),
632
+ { status: 200, headers: { "Content-Type": "application/json" } },
633
+ );
634
+ } catch (error) {
635
+ console.error("Burrito event error:", error);
636
+ return new Response(JSON.stringify({ error: "Internal server error" }), {
637
+ status: 500,
638
+ headers: { "Content-Type": "application/json" },
639
+ });
640
+ }
641
+ };
642
+
643
+ ```
644
+
645
+ ---
646
+
647
+ ## src/pages/burrito.astro
648
+
649
+ ```astro
650
+ ---
651
+ import PostHogLayout from '../layouts/PostHogLayout.astro';
652
+
653
+ // Opt this page into on-demand rendering (SSR)
654
+ // In hybrid mode, pages are static by default
655
+ export const prerender = false;
656
+ ---
657
+ <PostHogLayout title="Burrito Consideration - Astro PostHog Hybrid Example">
658
+ <div class="container">
659
+ <h1>Burrito consideration zone</h1>
660
+ <p>Take a moment to truly consider the potential of burritos.</p>
661
+
662
+ <div style="text-align: center;">
663
+ <button id="consider-btn" class="btn-burrito">
664
+ I have considered the burrito potential
665
+ </button>
666
+
667
+ <p id="success-message" class="success" style="display: none;">
668
+ Thank you for your consideration! Count: <span id="consideration-count"></span>
669
+ </p>
670
+ </div>
671
+
672
+ <div class="stats">
673
+ <h3>Consideration stats</h3>
674
+ <p>Total considerations: <span id="total-considerations">0</span></p>
675
+ </div>
676
+
677
+ <p class="note" style="margin-top: 1rem;">
678
+ Events are tracked both client-side and server-side for demonstration.
679
+ </p>
680
+ </div>
681
+ </PostHogLayout>
682
+
683
+ <script is:inline>
684
+ function checkAuth() {
685
+ const currentUser = localStorage.getItem('currentUser');
686
+ if (!currentUser) {
687
+ window.location.href = '/';
688
+ return false;
689
+ }
690
+ return true;
691
+ }
692
+
693
+ function updateStats() {
694
+ const count = localStorage.getItem('burritoConsiderations') || '0';
695
+ document.getElementById('total-considerations').textContent = count;
696
+ }
697
+
698
+ async function handleConsideration() {
699
+ const currentUser = localStorage.getItem('currentUser');
700
+ if (!currentUser) return;
701
+
702
+ // Increment the count
703
+ const currentCount = parseInt(localStorage.getItem('burritoConsiderations') || '0', 10);
704
+ const newCount = currentCount + 1;
705
+ localStorage.setItem('burritoConsiderations', newCount.toString());
706
+
707
+ // Update the UI
708
+ updateStats();
709
+
710
+ const successMessage = document.getElementById('success-message');
711
+ const considerationCount = document.getElementById('consideration-count');
712
+ considerationCount.textContent = newCount;
713
+ successMessage.style.display = 'block';
714
+
715
+ // Hide success message after 2 seconds
716
+ setTimeout(() => {
717
+ successMessage.style.display = 'none';
718
+ }, 2000);
719
+
720
+ // Client-side event tracking
721
+ window.posthog?.capture('burrito_considered', {
722
+ total_considerations: newCount,
723
+ username: currentUser,
724
+ source: 'client'
725
+ });
726
+
727
+ // Also send to server-side API for server tracking
728
+ try {
729
+ const sessionId = window.posthog?.get_session_id?.() || null;
730
+
731
+ await fetch('/api/events/burrito', {
732
+ method: 'POST',
733
+ headers: {
734
+ 'Content-Type': 'application/json',
735
+ 'X-PostHog-Session-Id': sessionId || ''
736
+ },
737
+ body: JSON.stringify({
738
+ username: currentUser,
739
+ totalConsiderations: newCount
740
+ })
741
+ });
742
+ } catch (error) {
743
+ console.error('Failed to send server-side event:', error);
744
+ }
745
+ }
746
+
747
+ document.addEventListener('DOMContentLoaded', () => {
748
+ if (!checkAuth()) return;
749
+
750
+ updateStats();
751
+ document.getElementById('consider-btn')?.addEventListener('click', handleConsideration);
752
+ });
753
+ </script>
754
+
755
+ ```
756
+
757
+ ---
758
+
759
+ ## src/pages/index.astro
760
+
761
+ ```astro
762
+ ---
763
+ import PostHogLayout from '../layouts/PostHogLayout.astro';
764
+
765
+ // This page is prerendered (static) by default in hybrid mode
766
+ // No need to set prerender = true explicitly
767
+ ---
768
+ <PostHogLayout title="Home - Astro PostHog Hybrid Example">
769
+ <div class="container">
770
+ <div id="logged-in-view" style="display: none;">
771
+ <h1>Welcome back, <span id="welcome-username"></span>!</h1>
772
+ <p>You are logged in. Feel free to explore:</p>
773
+ <ul>
774
+ <li>Consider the potential of burritos</li>
775
+ <li>View your profile and statistics</li>
776
+ </ul>
777
+ </div>
778
+
779
+ <div id="logged-out-view">
780
+ <h1>Welcome to Burrito Consideration App</h1>
781
+ <p>Please sign in to begin your burrito journey</p>
782
+
783
+ <form id="login-form" class="form">
784
+ <div class="form-group">
785
+ <label for="username">Username:</label>
786
+ <input
787
+ type="text"
788
+ id="username"
789
+ placeholder="Enter any username"
790
+ required
791
+ />
792
+ </div>
793
+
794
+ <div class="form-group">
795
+ <label for="password">Password:</label>
796
+ <input
797
+ type="password"
798
+ id="password"
799
+ placeholder="Enter any password"
800
+ required
801
+ />
802
+ </div>
803
+
804
+ <p id="error-message" class="error" style="display: none;"></p>
805
+
806
+ <button type="submit" class="btn-primary">Sign In</button>
807
+ </form>
808
+
809
+ <p class="note">
810
+ Note: This is a demo app with server-side tracking. Use any username and password to sign in.
811
+ </p>
812
+ </div>
813
+ </div>
814
+ </PostHogLayout>
815
+
816
+ <script is:inline>
817
+ function updateView() {
818
+ const currentUser = localStorage.getItem('currentUser');
819
+ const loggedInView = document.getElementById('logged-in-view');
820
+ const loggedOutView = document.getElementById('logged-out-view');
821
+ const welcomeUsername = document.getElementById('welcome-username');
822
+
823
+ if (currentUser) {
824
+ loggedInView.style.display = 'block';
825
+ loggedOutView.style.display = 'none';
826
+ welcomeUsername.textContent = currentUser;
827
+ } else {
828
+ loggedInView.style.display = 'none';
829
+ loggedOutView.style.display = 'block';
830
+ }
831
+ }
832
+
833
+ async function handleLogin(event) {
834
+ event.preventDefault();
835
+
836
+ const username = document.getElementById('username').value;
837
+ const password = document.getElementById('password').value;
838
+ const errorMessage = document.getElementById('error-message');
839
+
840
+ if (!username || !password) {
841
+ errorMessage.textContent = 'Please provide both username and password';
842
+ errorMessage.style.display = 'block';
843
+ return;
844
+ }
845
+
846
+ try {
847
+ // Get the session ID from PostHog to pass to the server
848
+ const sessionId = window.posthog?.get_session_id?.() || null;
849
+
850
+ // Call the server-side login API
851
+ const response = await fetch('/api/auth/login', {
852
+ method: 'POST',
853
+ headers: {
854
+ 'Content-Type': 'application/json',
855
+ 'X-PostHog-Session-Id': sessionId || ''
856
+ },
857
+ body: JSON.stringify({ username, password })
858
+ });
859
+
860
+ const data = await response.json();
861
+
862
+ if (!response.ok) {
863
+ throw new Error(data.error || 'Login failed');
864
+ }
865
+
866
+ // Store in localStorage for client-side state
867
+ localStorage.setItem('currentUser', username);
868
+ if (!localStorage.getItem('burritoConsiderations')) {
869
+ localStorage.setItem('burritoConsiderations', '0');
870
+ }
871
+
872
+ // Also identify on the client side (for session continuity)
873
+ window.posthog?.identify(username);
874
+ window.posthog?.capture('user_logged_in');
875
+
876
+ // Clear form
877
+ document.getElementById('username').value = '';
878
+ document.getElementById('password').value = '';
879
+ errorMessage.style.display = 'none';
880
+
881
+ // Update view
882
+ updateView();
883
+
884
+ // Trigger header update
885
+ window.dispatchEvent(new Event('storage'));
886
+ } catch (error) {
887
+ errorMessage.textContent = error.message || 'Login failed';
888
+ errorMessage.style.display = 'block';
889
+ }
890
+ }
891
+
892
+ document.addEventListener('DOMContentLoaded', () => {
893
+ updateView();
894
+ document.getElementById('login-form')?.addEventListener('submit', handleLogin);
895
+ });
896
+
897
+ // Listen for storage changes
898
+ window.addEventListener('storage', updateView);
899
+ </script>
900
+
901
+ ```
902
+
903
+ ---
904
+
905
+ ## src/pages/profile.astro
906
+
907
+ ```astro
908
+ ---
909
+ import PostHogLayout from '../layouts/PostHogLayout.astro';
910
+
911
+ // This page is prerendered (static) by default in hybrid mode
912
+ ---
913
+ <PostHogLayout title="Profile - Astro PostHog Hybrid Example">
914
+ <div class="container">
915
+ <h1>User Profile</h1>
916
+
917
+ <div class="stats">
918
+ <h2>Your Information</h2>
919
+ <p><strong>Username:</strong> <span id="profile-username"></span></p>
920
+ <p><strong>Burrito Considerations:</strong> <span id="profile-considerations">0</span></p>
921
+ </div>
922
+
923
+ <div style="margin-top: 2rem;">
924
+ <h3>Your Burrito Journey</h3>
925
+ <p id="journey-message"></p>
926
+ </div>
927
+
928
+ <div style="margin-top: 2rem;">
929
+ <h3>Error Tracking Demo</h3>
930
+ <p>Click the button below to trigger a test error and send it to PostHog:</p>
931
+ <button id="error-btn" class="btn-error">
932
+ Trigger Test Error
933
+ </button>
934
+ <p id="error-feedback" class="success" style="display: none;">
935
+ Error captured and sent to PostHog!
936
+ </p>
937
+ </div>
938
+ </div>
939
+ </PostHogLayout>
940
+
941
+ <script is:inline>
942
+ function checkAuth() {
943
+ const currentUser = localStorage.getItem('currentUser');
944
+ if (!currentUser) {
945
+ window.location.href = '/';
946
+ return false;
947
+ }
948
+ return true;
949
+ }
950
+
951
+ function updateProfile() {
952
+ const username = localStorage.getItem('currentUser') || '';
953
+ const considerations = parseInt(localStorage.getItem('burritoConsiderations') || '0', 10);
954
+
955
+ document.getElementById('profile-username').textContent = username;
956
+ document.getElementById('profile-considerations').textContent = considerations;
957
+
958
+ // Update journey message based on consideration count
959
+ const journeyMessage = document.getElementById('journey-message');
960
+ if (considerations === 0) {
961
+ journeyMessage.textContent = "You haven't considered any burritos yet. Visit the Burrito Consideration page to start!";
962
+ } else if (considerations === 1) {
963
+ journeyMessage.textContent = "You've considered the burrito potential once. Keep going!";
964
+ } else if (considerations < 5) {
965
+ journeyMessage.textContent = "You're getting the hang of burrito consideration!";
966
+ } else if (considerations < 10) {
967
+ journeyMessage.textContent = "You're becoming a burrito consideration expert!";
968
+ } else {
969
+ journeyMessage.textContent = "You are a true burrito consideration master!";
970
+ }
971
+ }
972
+
973
+ function triggerTestError() {
974
+ try {
975
+ throw new Error('Test error for PostHog error tracking');
976
+ } catch (err) {
977
+ // Capture the error in PostHog
978
+ window.posthog?.captureException(err);
979
+ console.error('Captured error:', err);
980
+
981
+ // Show feedback to user
982
+ const feedback = document.getElementById('error-feedback');
983
+ feedback.style.display = 'block';
984
+ setTimeout(() => {
985
+ feedback.style.display = 'none';
986
+ }, 3000);
987
+ }
988
+ }
989
+
990
+ document.addEventListener('DOMContentLoaded', () => {
991
+ if (!checkAuth()) return;
992
+
993
+ updateProfile();
994
+ document.getElementById('error-btn')?.addEventListener('click', triggerTestError);
995
+ });
996
+ </script>
997
+
998
+ ```
999
+
1000
+ ---
1001
+