@amplitude/wizard 1.0.0-beta.2 → 1.0.0-beta.6

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 (392) hide show
  1. package/LICENSE +25 -1
  2. package/README.md +171 -74
  3. package/dist/bin.js +338 -222
  4. package/dist/src/lib/agent-interface.js +64 -9
  5. package/dist/src/lib/agent-runner.js +1 -10
  6. package/dist/src/lib/api.d.ts +22 -4
  7. package/dist/src/lib/api.js +114 -12
  8. package/dist/src/lib/commandments.js +14 -1
  9. package/dist/src/lib/constants.d.ts +6 -5
  10. package/dist/src/lib/constants.js +13 -13
  11. package/dist/src/lib/credential-resolution.d.ts +45 -0
  12. package/dist/src/lib/credential-resolution.js +311 -0
  13. package/dist/src/lib/exit-codes.d.ts +10 -0
  14. package/dist/src/lib/exit-codes.js +12 -0
  15. package/dist/src/lib/health-checks/statuspage.d.ts +1 -0
  16. package/dist/src/lib/health-checks/statuspage.js +5 -1
  17. package/dist/src/lib/mode-config.d.ts +14 -0
  18. package/dist/src/lib/mode-config.js +14 -0
  19. package/dist/src/lib/session-checkpoint.d.ts +27 -0
  20. package/dist/src/lib/session-checkpoint.js +134 -0
  21. package/dist/src/lib/wizard-session.d.ts +44 -1
  22. package/dist/src/lib/wizard-session.js +70 -14
  23. package/dist/src/lib/wizard-tools.js +19 -4
  24. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +3 -0
  25. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +6 -0
  26. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +3 -1
  27. package/dist/src/ui/agent-ui.d.ts +91 -0
  28. package/dist/src/ui/agent-ui.js +277 -0
  29. package/dist/src/ui/logging-ui.js +1 -1
  30. package/dist/src/ui/tui/App.d.ts +12 -0
  31. package/dist/src/ui/tui/App.js +29 -18
  32. package/dist/src/ui/tui/components/AmplitudeLogo.js +16 -17
  33. package/dist/src/ui/tui/components/AmplitudeTextLogo.d.ts +0 -2
  34. package/dist/src/ui/tui/components/AmplitudeTextLogo.js +53 -18
  35. package/dist/src/ui/tui/components/BrailleSpinner.d.ts +8 -0
  36. package/dist/src/ui/tui/components/BrailleSpinner.js +15 -0
  37. package/dist/src/ui/tui/components/ConsoleView.d.ts +8 -11
  38. package/dist/src/ui/tui/components/ConsoleView.js +51 -34
  39. package/dist/src/ui/tui/components/HeaderBar.d.ts +12 -0
  40. package/dist/src/ui/tui/components/HeaderBar.js +17 -0
  41. package/dist/src/ui/tui/components/JourneyStepper.d.ts +16 -0
  42. package/dist/src/ui/tui/components/JourneyStepper.js +83 -0
  43. package/dist/src/ui/tui/components/KeyHintBar.d.ts +19 -0
  44. package/dist/src/ui/tui/components/KeyHintBar.js +20 -0
  45. package/dist/src/ui/tui/console-commands.d.ts +1 -2
  46. package/dist/src/ui/tui/console-commands.js +48 -7
  47. package/dist/src/ui/tui/flows.d.ts +1 -1
  48. package/dist/src/ui/tui/flows.js +1 -1
  49. package/dist/src/ui/tui/hooks/useAsyncEffect.d.ts +15 -0
  50. package/dist/src/ui/tui/hooks/useAsyncEffect.js +35 -0
  51. package/dist/src/ui/tui/hooks/useWizardStore.d.ts +9 -0
  52. package/dist/src/ui/tui/hooks/useWizardStore.js +11 -0
  53. package/dist/src/ui/tui/ink-ui.js +1 -1
  54. package/dist/src/ui/tui/primitives/DissolveTransition.js +4 -5
  55. package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +3 -1
  56. package/dist/src/ui/tui/primitives/EventPlanViewer.js +8 -3
  57. package/dist/src/ui/tui/primitives/ProgressList.js +1 -1
  58. package/dist/src/ui/tui/primitives/SlashCommandInput.js +19 -4
  59. package/dist/src/ui/tui/primitives/SplitView.d.ts +2 -1
  60. package/dist/src/ui/tui/primitives/SplitView.js +10 -2
  61. package/dist/src/ui/tui/primitives/TabContainer.js +10 -2
  62. package/dist/src/ui/tui/primitives/index.d.ts +0 -1
  63. package/dist/src/ui/tui/primitives/index.js +0 -1
  64. package/dist/src/ui/tui/router.js +1 -1
  65. package/dist/src/ui/tui/screen-registry.d.ts +0 -7
  66. package/dist/src/ui/tui/screen-registry.js +13 -4
  67. package/dist/src/ui/tui/screens/ActivationOptionsScreen.d.ts +2 -2
  68. package/dist/src/ui/tui/screens/ActivationOptionsScreen.js +8 -8
  69. package/dist/src/ui/tui/screens/AuthScreen.js +57 -27
  70. package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +2 -12
  71. package/dist/src/ui/tui/screens/ChecklistScreen.js +22 -33
  72. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +3 -12
  73. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +109 -39
  74. package/dist/src/ui/tui/screens/DataSetupScreen.d.ts +3 -3
  75. package/dist/src/ui/tui/screens/DataSetupScreen.js +17 -10
  76. package/dist/src/ui/tui/screens/IntroScreen.d.ts +5 -3
  77. package/dist/src/ui/tui/screens/IntroScreen.js +132 -41
  78. package/dist/src/ui/tui/screens/LoginScreen.d.ts +1 -1
  79. package/dist/src/ui/tui/screens/LoginScreen.js +4 -4
  80. package/dist/src/ui/tui/screens/LogoutScreen.d.ts +4 -2
  81. package/dist/src/ui/tui/screens/LogoutScreen.js +17 -5
  82. package/dist/src/ui/tui/screens/McpScreen.d.ts +4 -4
  83. package/dist/src/ui/tui/screens/McpScreen.js +25 -17
  84. package/dist/src/ui/tui/screens/OutageScreen.d.ts +1 -1
  85. package/dist/src/ui/tui/screens/OutageScreen.js +5 -5
  86. package/dist/src/ui/tui/screens/OutroScreen.d.ts +5 -0
  87. package/dist/src/ui/tui/screens/OutroScreen.js +21 -14
  88. package/dist/src/ui/tui/screens/RegionSelectScreen.js +15 -13
  89. package/dist/src/ui/tui/screens/RunScreen.d.ts +7 -5
  90. package/dist/src/ui/tui/screens/RunScreen.js +102 -157
  91. package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +1 -1
  92. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +6 -5
  93. package/dist/src/ui/tui/screens/SetupScreen.d.ts +1 -1
  94. package/dist/src/ui/tui/screens/SetupScreen.js +7 -7
  95. package/dist/src/ui/tui/screens/SlackScreen.d.ts +2 -2
  96. package/dist/src/ui/tui/screens/SlackScreen.js +60 -35
  97. package/dist/src/ui/tui/session-constants.d.ts +41 -0
  98. package/dist/src/ui/tui/session-constants.js +38 -0
  99. package/dist/src/ui/tui/start-tui.d.ts +3 -1
  100. package/dist/src/ui/tui/start-tui.js +14 -10
  101. package/dist/src/ui/tui/store.d.ts +2 -1
  102. package/dist/src/ui/tui/store.js +33 -7
  103. package/dist/src/ui/tui/styles.d.ts +75 -19
  104. package/dist/src/ui/tui/styles.js +101 -19
  105. package/dist/src/ui/tui/utils/classify-error.d.ts +14 -0
  106. package/dist/src/ui/tui/utils/classify-error.js +90 -0
  107. package/dist/src/ui/tui/utils/diagnostics.d.ts +21 -0
  108. package/dist/src/ui/tui/utils/diagnostics.js +72 -0
  109. package/dist/src/ui/tui/utils/with-retry.d.ts +12 -0
  110. package/dist/src/ui/tui/utils/with-retry.js +32 -0
  111. package/dist/src/ui/tui/utils/with-timeout.d.ts +10 -0
  112. package/dist/src/ui/tui/utils/with-timeout.js +24 -0
  113. package/dist/src/utils/ampli-settings.d.ts +1 -1
  114. package/dist/src/utils/ampli-settings.js +15 -5
  115. package/dist/src/utils/api-key-store.js +5 -5
  116. package/dist/src/utils/atomic-write.d.ts +15 -0
  117. package/dist/src/utils/atomic-write.js +34 -0
  118. package/dist/src/utils/setup-utils.js +2 -2
  119. package/dist/src/utils/token-refresh.d.ts +22 -0
  120. package/dist/src/utils/token-refresh.js +79 -0
  121. package/dist/src/utils/wizard-abort.js +6 -1
  122. package/package.json +6 -6
  123. package/skills/instrumentation/add-analytics-instrumentation/SKILL.md +142 -0
  124. package/skills/instrumentation/diff-intake/SKILL.md +128 -0
  125. package/skills/instrumentation/discover-analytics-patterns/SKILL.md +185 -0
  126. package/skills/instrumentation/discover-event-surfaces/SKILL.md +322 -0
  127. package/skills/instrumentation/discover-event-surfaces/references/best-practices.md +563 -0
  128. package/skills/instrumentation/instrument-events/SKILL.md +169 -0
  129. package/skills/instrumentation/instrument-events/references/best-practices.md +563 -0
  130. package/skills/integration/integration-android/SKILL.md +49 -0
  131. package/skills/integration/integration-android/references/EXAMPLE.md +1977 -0
  132. package/skills/integration/integration-android/references/amplitude-quickstart.md +1845 -0
  133. package/skills/integration/integration-android/references/analytics.md +1778 -0
  134. package/skills/integration/integration-android/references/basic-integration-1.0-begin.md +43 -0
  135. package/skills/integration/integration-android/references/basic-integration-1.1-edit.md +35 -0
  136. package/skills/integration/integration-android/references/basic-integration-1.2-revise.md +23 -0
  137. package/skills/integration/integration-android/references/basic-integration-1.3-conclude.md +57 -0
  138. package/skills/integration/integration-angular/SKILL.md +49 -0
  139. package/skills/integration/integration-angular/references/EXAMPLE.md +899 -0
  140. package/skills/integration/integration-angular/references/amplitude-quickstart.md +1845 -0
  141. package/skills/integration/integration-angular/references/basic-integration-1.0-begin.md +43 -0
  142. package/skills/integration/integration-angular/references/basic-integration-1.1-edit.md +35 -0
  143. package/skills/integration/integration-angular/references/basic-integration-1.2-revise.md +23 -0
  144. package/skills/integration/integration-angular/references/basic-integration-1.3-conclude.md +57 -0
  145. package/skills/integration/integration-angular/references/browser-sdk-2.md +4680 -0
  146. package/skills/integration/integration-astro-hybrid/SKILL.md +56 -0
  147. package/skills/integration/integration-astro-hybrid/references/EXAMPLE.md +1095 -0
  148. package/skills/integration/integration-astro-hybrid/references/amplitude-quickstart.md +1845 -0
  149. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.0-begin.md +43 -0
  150. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.1-edit.md +35 -0
  151. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.2-revise.md +23 -0
  152. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.3-conclude.md +57 -0
  153. package/skills/integration/integration-astro-hybrid/references/browser-sdk-2.md +4680 -0
  154. package/skills/integration/integration-astro-ssr/SKILL.md +52 -0
  155. package/skills/integration/integration-astro-ssr/references/EXAMPLE.md +1106 -0
  156. package/skills/integration/integration-astro-ssr/references/amplitude-quickstart.md +1845 -0
  157. package/skills/integration/integration-astro-ssr/references/basic-integration-1.0-begin.md +43 -0
  158. package/skills/integration/integration-astro-ssr/references/basic-integration-1.1-edit.md +35 -0
  159. package/skills/integration/integration-astro-ssr/references/basic-integration-1.2-revise.md +23 -0
  160. package/skills/integration/integration-astro-ssr/references/basic-integration-1.3-conclude.md +57 -0
  161. package/skills/integration/integration-astro-ssr/references/browser-sdk-2.md +4680 -0
  162. package/skills/integration/integration-astro-static/SKILL.md +49 -0
  163. package/skills/integration/integration-astro-static/references/EXAMPLE.md +910 -0
  164. package/skills/integration/integration-astro-static/references/amplitude-quickstart.md +1845 -0
  165. package/skills/integration/integration-astro-static/references/basic-integration-1.0-begin.md +43 -0
  166. package/skills/integration/integration-astro-static/references/basic-integration-1.1-edit.md +35 -0
  167. package/skills/integration/integration-astro-static/references/basic-integration-1.2-revise.md +23 -0
  168. package/skills/integration/integration-astro-static/references/basic-integration-1.3-conclude.md +57 -0
  169. package/skills/integration/integration-astro-static/references/browser-sdk-2.md +4680 -0
  170. package/skills/integration/integration-astro-view-transitions/SKILL.md +51 -0
  171. package/skills/integration/integration-astro-view-transitions/references/EXAMPLE.md +979 -0
  172. package/skills/integration/integration-astro-view-transitions/references/amplitude-quickstart.md +1845 -0
  173. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.0-begin.md +43 -0
  174. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.1-edit.md +35 -0
  175. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.2-revise.md +23 -0
  176. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.3-conclude.md +57 -0
  177. package/skills/integration/integration-astro-view-transitions/references/browser-sdk-2.md +4680 -0
  178. package/skills/integration/integration-django/SKILL.md +57 -0
  179. package/skills/integration/integration-django/references/EXAMPLE.md +1005 -0
  180. package/skills/integration/integration-django/references/amplitude-quickstart.md +1845 -0
  181. package/skills/integration/integration-django/references/basic-integration-1.0-begin.md +43 -0
  182. package/skills/integration/integration-django/references/basic-integration-1.1-edit.md +35 -0
  183. package/skills/integration/integration-django/references/basic-integration-1.2-revise.md +23 -0
  184. package/skills/integration/integration-django/references/basic-integration-1.3-conclude.md +57 -0
  185. package/skills/integration/integration-django/references/python.md +1424 -0
  186. package/skills/integration/integration-expo/SKILL.md +53 -0
  187. package/skills/integration/integration-expo/references/EXAMPLE.md +1291 -0
  188. package/skills/integration/integration-expo/references/amplitude-quickstart.md +1845 -0
  189. package/skills/integration/integration-expo/references/basic-integration-1.0-begin.md +43 -0
  190. package/skills/integration/integration-expo/references/basic-integration-1.1-edit.md +35 -0
  191. package/skills/integration/integration-expo/references/basic-integration-1.2-revise.md +23 -0
  192. package/skills/integration/integration-expo/references/basic-integration-1.3-conclude.md +57 -0
  193. package/skills/integration/integration-expo/references/react-native-sdk.md +2819 -0
  194. package/skills/integration/integration-fastapi/SKILL.md +57 -0
  195. package/skills/integration/integration-fastapi/references/EXAMPLE.md +1389 -0
  196. package/skills/integration/integration-fastapi/references/amplitude-quickstart.md +1845 -0
  197. package/skills/integration/integration-fastapi/references/basic-integration-1.0-begin.md +43 -0
  198. package/skills/integration/integration-fastapi/references/basic-integration-1.1-edit.md +35 -0
  199. package/skills/integration/integration-fastapi/references/basic-integration-1.2-revise.md +23 -0
  200. package/skills/integration/integration-fastapi/references/basic-integration-1.3-conclude.md +57 -0
  201. package/skills/integration/integration-fastapi/references/python.md +1424 -0
  202. package/skills/integration/integration-flask/SKILL.md +56 -0
  203. package/skills/integration/integration-flask/references/EXAMPLE.md +1130 -0
  204. package/skills/integration/integration-flask/references/amplitude-quickstart.md +1845 -0
  205. package/skills/integration/integration-flask/references/basic-integration-1.0-begin.md +43 -0
  206. package/skills/integration/integration-flask/references/basic-integration-1.1-edit.md +35 -0
  207. package/skills/integration/integration-flask/references/basic-integration-1.2-revise.md +23 -0
  208. package/skills/integration/integration-flask/references/basic-integration-1.3-conclude.md +57 -0
  209. package/skills/integration/integration-flask/references/python.md +1424 -0
  210. package/skills/integration/integration-javascript_node/SKILL.md +54 -0
  211. package/skills/integration/integration-javascript_node/references/EXAMPLE.md +365 -0
  212. package/skills/integration/integration-javascript_node/references/amplitude-quickstart.md +1845 -0
  213. package/skills/integration/integration-javascript_node/references/analytics.md +1778 -0
  214. package/skills/integration/integration-javascript_node/references/basic-integration-1.0-begin.md +43 -0
  215. package/skills/integration/integration-javascript_node/references/basic-integration-1.1-edit.md +35 -0
  216. package/skills/integration/integration-javascript_node/references/basic-integration-1.2-revise.md +23 -0
  217. package/skills/integration/integration-javascript_node/references/basic-integration-1.3-conclude.md +57 -0
  218. package/skills/integration/integration-javascript_web/SKILL.md +58 -0
  219. package/skills/integration/integration-javascript_web/references/EXAMPLE.md +451 -0
  220. package/skills/integration/integration-javascript_web/references/amplitude-quickstart.md +1845 -0
  221. package/skills/integration/integration-javascript_web/references/basic-integration-1.0-begin.md +43 -0
  222. package/skills/integration/integration-javascript_web/references/basic-integration-1.1-edit.md +35 -0
  223. package/skills/integration/integration-javascript_web/references/basic-integration-1.2-revise.md +23 -0
  224. package/skills/integration/integration-javascript_web/references/basic-integration-1.3-conclude.md +57 -0
  225. package/skills/integration/integration-javascript_web/references/browser-sdk-2.md +4680 -0
  226. package/skills/integration/integration-laravel/SKILL.md +52 -0
  227. package/skills/integration/integration-laravel/references/EXAMPLE.md +2039 -0
  228. package/skills/integration/integration-laravel/references/amplitude-quickstart.md +1845 -0
  229. package/skills/integration/integration-laravel/references/analytics.md +1778 -0
  230. package/skills/integration/integration-laravel/references/basic-integration-1.0-begin.md +43 -0
  231. package/skills/integration/integration-laravel/references/basic-integration-1.1-edit.md +35 -0
  232. package/skills/integration/integration-laravel/references/basic-integration-1.2-revise.md +23 -0
  233. package/skills/integration/integration-laravel/references/basic-integration-1.3-conclude.md +57 -0
  234. package/skills/integration/integration-nextjs-app-router/SKILL.md +54 -0
  235. package/skills/integration/integration-nextjs-app-router/references/EXAMPLE.md +673 -0
  236. package/skills/integration/integration-nextjs-app-router/references/amplitude-quickstart.md +1845 -0
  237. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.0-begin.md +43 -0
  238. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.1-edit.md +35 -0
  239. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.2-revise.md +23 -0
  240. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.3-conclude.md +57 -0
  241. package/skills/integration/integration-nextjs-app-router/references/browser-sdk-2.md +4680 -0
  242. package/skills/integration/integration-nextjs-pages-router/SKILL.md +54 -0
  243. package/skills/integration/integration-nextjs-pages-router/references/EXAMPLE.md +735 -0
  244. package/skills/integration/integration-nextjs-pages-router/references/amplitude-quickstart.md +1845 -0
  245. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.0-begin.md +43 -0
  246. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.1-edit.md +35 -0
  247. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.2-revise.md +23 -0
  248. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.3-conclude.md +57 -0
  249. package/skills/integration/integration-nextjs-pages-router/references/browser-sdk-2.md +4680 -0
  250. package/skills/integration/integration-nuxt-3.6/SKILL.md +46 -0
  251. package/skills/integration/integration-nuxt-3.6/references/EXAMPLE.md +8422 -0
  252. package/skills/integration/integration-nuxt-3.6/references/amplitude-quickstart.md +1845 -0
  253. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.0-begin.md +43 -0
  254. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.1-edit.md +35 -0
  255. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.2-revise.md +23 -0
  256. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.3-conclude.md +57 -0
  257. package/skills/integration/integration-nuxt-3.6/references/browser-sdk-2.md +4680 -0
  258. package/skills/integration/integration-nuxt-4/SKILL.md +46 -0
  259. package/skills/integration/integration-nuxt-4/references/EXAMPLE.md +8670 -0
  260. package/skills/integration/integration-nuxt-4/references/amplitude-quickstart.md +1845 -0
  261. package/skills/integration/integration-nuxt-4/references/basic-integration-1.0-begin.md +43 -0
  262. package/skills/integration/integration-nuxt-4/references/basic-integration-1.1-edit.md +35 -0
  263. package/skills/integration/integration-nuxt-4/references/basic-integration-1.2-revise.md +23 -0
  264. package/skills/integration/integration-nuxt-4/references/basic-integration-1.3-conclude.md +57 -0
  265. package/skills/integration/integration-nuxt-4/references/browser-sdk-2.md +4680 -0
  266. package/skills/integration/integration-python/SKILL.md +53 -0
  267. package/skills/integration/integration-python/references/EXAMPLE.md +445 -0
  268. package/skills/integration/integration-python/references/amplitude-quickstart.md +1845 -0
  269. package/skills/integration/integration-python/references/basic-integration-1.0-begin.md +43 -0
  270. package/skills/integration/integration-python/references/basic-integration-1.1-edit.md +35 -0
  271. package/skills/integration/integration-python/references/basic-integration-1.2-revise.md +23 -0
  272. package/skills/integration/integration-python/references/basic-integration-1.3-conclude.md +57 -0
  273. package/skills/integration/integration-python/references/python.md +1424 -0
  274. package/skills/integration/integration-react-native/SKILL.md +49 -0
  275. package/skills/integration/integration-react-native/references/EXAMPLE.md +2253 -0
  276. package/skills/integration/integration-react-native/references/amplitude-quickstart.md +1845 -0
  277. package/skills/integration/integration-react-native/references/basic-integration-1.0-begin.md +43 -0
  278. package/skills/integration/integration-react-native/references/basic-integration-1.1-edit.md +35 -0
  279. package/skills/integration/integration-react-native/references/basic-integration-1.2-revise.md +23 -0
  280. package/skills/integration/integration-react-native/references/basic-integration-1.3-conclude.md +57 -0
  281. package/skills/integration/integration-react-native/references/react-native-sdk.md +2819 -0
  282. package/skills/integration/integration-react-react-router-6/SKILL.md +53 -0
  283. package/skills/integration/integration-react-react-router-6/references/EXAMPLE.md +570 -0
  284. package/skills/integration/integration-react-react-router-6/references/amplitude-quickstart.md +1845 -0
  285. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.0-begin.md +43 -0
  286. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.1-edit.md +35 -0
  287. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.2-revise.md +23 -0
  288. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.3-conclude.md +57 -0
  289. package/skills/integration/integration-react-react-router-6/references/browser-sdk-2.md +4680 -0
  290. package/skills/integration/integration-react-react-router-7-data/SKILL.md +53 -0
  291. package/skills/integration/integration-react-react-router-7-data/references/EXAMPLE.md +830 -0
  292. package/skills/integration/integration-react-react-router-7-data/references/amplitude-quickstart.md +1845 -0
  293. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.0-begin.md +43 -0
  294. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.1-edit.md +35 -0
  295. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.2-revise.md +23 -0
  296. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.3-conclude.md +57 -0
  297. package/skills/integration/integration-react-react-router-7-data/references/browser-sdk-2.md +4680 -0
  298. package/skills/integration/integration-react-react-router-7-declarative/SKILL.md +53 -0
  299. package/skills/integration/integration-react-react-router-7-declarative/references/EXAMPLE.md +609 -0
  300. package/skills/integration/integration-react-react-router-7-declarative/references/amplitude-quickstart.md +1845 -0
  301. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.0-begin.md +43 -0
  302. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.1-edit.md +35 -0
  303. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.2-revise.md +23 -0
  304. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.3-conclude.md +57 -0
  305. package/skills/integration/integration-react-react-router-7-declarative/references/browser-sdk-2.md +4680 -0
  306. package/skills/integration/integration-react-react-router-7-framework/SKILL.md +53 -0
  307. package/skills/integration/integration-react-react-router-7-framework/references/EXAMPLE.md +1081 -0
  308. package/skills/integration/integration-react-react-router-7-framework/references/amplitude-quickstart.md +1845 -0
  309. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.0-begin.md +43 -0
  310. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.1-edit.md +35 -0
  311. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.2-revise.md +23 -0
  312. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.3-conclude.md +57 -0
  313. package/skills/integration/integration-react-react-router-7-framework/references/browser-sdk-2.md +4680 -0
  314. package/skills/integration/integration-react-tanstack-router-code-based/SKILL.md +57 -0
  315. package/skills/integration/integration-react-tanstack-router-code-based/references/EXAMPLE.md +659 -0
  316. package/skills/integration/integration-react-tanstack-router-code-based/references/amplitude-quickstart.md +1845 -0
  317. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.0-begin.md +43 -0
  318. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.1-edit.md +35 -0
  319. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.2-revise.md +23 -0
  320. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.3-conclude.md +57 -0
  321. package/skills/integration/integration-react-tanstack-router-code-based/references/browser-sdk-2.md +4680 -0
  322. package/skills/integration/integration-react-tanstack-router-file-based/SKILL.md +57 -0
  323. package/skills/integration/integration-react-tanstack-router-file-based/references/EXAMPLE.md +777 -0
  324. package/skills/integration/integration-react-tanstack-router-file-based/references/amplitude-quickstart.md +1845 -0
  325. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.0-begin.md +43 -0
  326. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.1-edit.md +35 -0
  327. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.2-revise.md +23 -0
  328. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.3-conclude.md +57 -0
  329. package/skills/integration/integration-react-tanstack-router-file-based/references/browser-sdk-2.md +4680 -0
  330. package/skills/integration/integration-react-vite/SKILL.md +53 -0
  331. package/skills/integration/integration-react-vite/references/EXAMPLE.md +542 -0
  332. package/skills/integration/integration-react-vite/references/amplitude-quickstart.md +1845 -0
  333. package/skills/integration/integration-react-vite/references/basic-integration-1.0-begin.md +43 -0
  334. package/skills/integration/integration-react-vite/references/basic-integration-1.1-edit.md +35 -0
  335. package/skills/integration/integration-react-vite/references/basic-integration-1.2-revise.md +23 -0
  336. package/skills/integration/integration-react-vite/references/basic-integration-1.3-conclude.md +57 -0
  337. package/skills/integration/integration-react-vite/references/browser-sdk-2.md +4680 -0
  338. package/skills/integration/integration-ruby/SKILL.md +50 -0
  339. package/skills/integration/integration-ruby/references/EXAMPLE.md +420 -0
  340. package/skills/integration/integration-ruby/references/amplitude-quickstart.md +1845 -0
  341. package/skills/integration/integration-ruby/references/analytics.md +1778 -0
  342. package/skills/integration/integration-ruby/references/basic-integration-1.0-begin.md +43 -0
  343. package/skills/integration/integration-ruby/references/basic-integration-1.1-edit.md +35 -0
  344. package/skills/integration/integration-ruby/references/basic-integration-1.2-revise.md +23 -0
  345. package/skills/integration/integration-ruby/references/basic-integration-1.3-conclude.md +57 -0
  346. package/skills/integration/integration-ruby-on-rails/SKILL.md +55 -0
  347. package/skills/integration/integration-ruby-on-rails/references/EXAMPLE.md +1013 -0
  348. package/skills/integration/integration-ruby-on-rails/references/amplitude-quickstart.md +1845 -0
  349. package/skills/integration/integration-ruby-on-rails/references/analytics.md +1778 -0
  350. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.0-begin.md +43 -0
  351. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.1-edit.md +35 -0
  352. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.2-revise.md +23 -0
  353. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.3-conclude.md +57 -0
  354. package/skills/integration/integration-sveltekit/SKILL.md +47 -0
  355. package/skills/integration/integration-sveltekit/references/EXAMPLE.md +14121 -0
  356. package/skills/integration/integration-sveltekit/references/amplitude-quickstart.md +1845 -0
  357. package/skills/integration/integration-sveltekit/references/basic-integration-1.0-begin.md +43 -0
  358. package/skills/integration/integration-sveltekit/references/basic-integration-1.1-edit.md +35 -0
  359. package/skills/integration/integration-sveltekit/references/basic-integration-1.2-revise.md +23 -0
  360. package/skills/integration/integration-sveltekit/references/basic-integration-1.3-conclude.md +57 -0
  361. package/skills/integration/integration-sveltekit/references/browser-sdk-2.md +4680 -0
  362. package/skills/integration/integration-swift/SKILL.md +49 -0
  363. package/skills/integration/integration-swift/references/EXAMPLE.md +660 -0
  364. package/skills/integration/integration-swift/references/amplitude-quickstart.md +1845 -0
  365. package/skills/integration/integration-swift/references/analytics.md +1778 -0
  366. package/skills/integration/integration-swift/references/basic-integration-1.0-begin.md +43 -0
  367. package/skills/integration/integration-swift/references/basic-integration-1.1-edit.md +35 -0
  368. package/skills/integration/integration-swift/references/basic-integration-1.2-revise.md +23 -0
  369. package/skills/integration/integration-swift/references/basic-integration-1.3-conclude.md +57 -0
  370. package/skills/integration/integration-tanstack-start/SKILL.md +58 -0
  371. package/skills/integration/integration-tanstack-start/references/EXAMPLE.md +998 -0
  372. package/skills/integration/integration-tanstack-start/references/amplitude-quickstart.md +1845 -0
  373. package/skills/integration/integration-tanstack-start/references/basic-integration-1.0-begin.md +43 -0
  374. package/skills/integration/integration-tanstack-start/references/basic-integration-1.1-edit.md +35 -0
  375. package/skills/integration/integration-tanstack-start/references/basic-integration-1.2-revise.md +23 -0
  376. package/skills/integration/integration-tanstack-start/references/basic-integration-1.3-conclude.md +57 -0
  377. package/skills/integration/integration-tanstack-start/references/browser-sdk-2.md +4680 -0
  378. package/skills/integration/integration-vue-3/SKILL.md +46 -0
  379. package/skills/integration/integration-vue-3/references/EXAMPLE.md +846 -0
  380. package/skills/integration/integration-vue-3/references/amplitude-quickstart.md +1845 -0
  381. package/skills/integration/integration-vue-3/references/basic-integration-1.0-begin.md +43 -0
  382. package/skills/integration/integration-vue-3/references/basic-integration-1.1-edit.md +35 -0
  383. package/skills/integration/integration-vue-3/references/basic-integration-1.2-revise.md +23 -0
  384. package/skills/integration/integration-vue-3/references/basic-integration-1.3-conclude.md +57 -0
  385. package/skills/integration/integration-vue-3/references/browser-sdk-2.md +4680 -0
  386. package/skills/taxonomy/amplitude-quickstart-taxonomy-agent/SKILL.md +228 -0
  387. package/dist/src/ui/tui/components/TitleBar.d.ts +0 -8
  388. package/dist/src/ui/tui/components/TitleBar.js +0 -27
  389. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.d.ts +0 -7
  390. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.js +0 -101
  391. package/dist/src/utils/anthropic-status.d.ts +0 -17
  392. package/dist/src/utils/anthropic-status.js +0 -51
@@ -0,0 +1,2039 @@
1
+ # Amplitude Laravel Example Project
2
+
3
+ Repository: https://github.com/amplitude/context-hub
4
+ Path: basics/laravel
5
+
6
+ ---
7
+
8
+ ## README.md
9
+
10
+ # Amplitude Laravel Example
11
+
12
+ A Laravel application demonstrating Amplitude integration for analytics and event tracking using Livewire for reactive UI components.
13
+
14
+ ## Features
15
+
16
+ - User registration and authentication with Livewire
17
+ - SQLite database persistence with Eloquent ORM
18
+ - User identification and property tracking
19
+ - Custom event tracking (burrito consideration tracker)
20
+ - Page view tracking (dashboard, profile)
21
+ - Reactive UI components with Livewire
22
+
23
+ ## Tech Stack
24
+
25
+ - **Framework**: Laravel 11.x
26
+ - **Reactive Components**: Livewire 3.x
27
+ - **Database**: SQLite
28
+ - **Analytics**: Amplitude PHP SDK (`zumba/amplitude-php`)
29
+
30
+ ## Quick Start
31
+
32
+ **Note**: This is a minimal implementation demonstrating Amplitude integration. For a production application, you would need to install Laravel via Composer and set up additional dependencies.
33
+
34
+ ### Manual Setup (Demonstration)
35
+
36
+ 1. Install dependencies:
37
+ ```bash
38
+ composer install
39
+ ```
40
+
41
+ 2. Set up environment:
42
+ ```bash
43
+ cp .env.example .env
44
+ # Edit .env with your Amplitude API key
45
+ ```
46
+
47
+ 3. Configure Amplitude in `.env`:
48
+ ```env
49
+ AMPLITUDE_API_KEY=your_amplitude_api_key
50
+ AMPLITUDE_DISABLED=false
51
+ ```
52
+
53
+ 4. Generate application key:
54
+ ```bash
55
+ php artisan key:generate
56
+ ```
57
+
58
+ 5. Create database and run migrations:
59
+ ```bash
60
+ touch database/database.sqlite
61
+ php artisan migrate --seed
62
+ ```
63
+
64
+ 6. Start the development server:
65
+ ```bash
66
+ php artisan serve
67
+ ```
68
+
69
+ 7. Open http://localhost:8000 and either:
70
+ - Login with default credentials: `admin@example.com` / `admin`
71
+ - Or click "Sign up here" to create a new account
72
+
73
+ ## Amplitude Service
74
+
75
+ The `AmplitudeService` class (`app/Services/AmplitudeService.php`) wraps the Amplitude PHP SDK and provides:
76
+
77
+ | Method | Description |
78
+ |--------|-------------|
79
+ | `identify($userId, $properties)` | Identify a user with properties |
80
+ | `capture($userId, $event, $properties)` | Capture custom events |
81
+
82
+ All methods check `config('amplitude.disabled')` and return early if Amplitude is disabled.
83
+
84
+ ## Amplitude Integration Points
85
+
86
+ ### User Registration (`app/Http/Livewire/Auth/Register.php`)
87
+ New users are identified and tracked on signup:
88
+ ```php
89
+ $amplitude->identify($user->email, $user->getAmplitudeProperties());
90
+ $amplitude->capture($user->email, 'User Signed Up', [
91
+ 'signup_method' => 'form',
92
+ ]);
93
+ ```
94
+
95
+ ### User Login (`app/Http/Livewire/Auth/Login.php`)
96
+ Users are identified on login with their properties:
97
+ ```php
98
+ $amplitude->identify($user->email, $user->getAmplitudeProperties());
99
+ $amplitude->capture($user->email, 'User Logged In', [
100
+ 'login_method' => 'password',
101
+ ]);
102
+ ```
103
+
104
+ ### Page View Tracking
105
+ Dashboard and profile views are tracked:
106
+ ```php
107
+ $amplitude->capture($user->email, 'Dashboard Viewed', [
108
+ 'is_staff' => $user->is_staff,
109
+ ]);
110
+
111
+ $amplitude->capture($user->email, 'Profile Viewed');
112
+ ```
113
+
114
+ ### Custom Event Tracking (`app/Http/Livewire/BurritoTracker.php`)
115
+ The burrito tracker demonstrates custom event capture:
116
+ ```php
117
+ $amplitude->identify($user->email, $user->getAmplitudeProperties());
118
+ $amplitude->capture($user->email, 'Burrito Considered', [
119
+ 'total_considerations' => $this->burritoCount,
120
+ ]);
121
+ ```
122
+
123
+ ## Pages
124
+
125
+ | Route | Component | Amplitude Events |
126
+ |-------|-----------|-----------------|
127
+ | `/` | Login | `User Logged In` |
128
+ | `/register` | Register | `User Signed Up` |
129
+ | `/dashboard` | Dashboard | `Dashboard Viewed` |
130
+ | `/burrito` | BurritoTracker | `Burrito Considered` |
131
+ | `/profile` | Profile | `Profile Viewed` |
132
+
133
+ ## Project Structure
134
+
135
+ ```
136
+ basics/laravel/
137
+ ├── app/
138
+ │ ├── Http/
139
+ │ │ ├── Controllers/
140
+ │ │ │ └── Api/
141
+ │ │ │ ├── BurritoController.php # Burrito API endpoint
142
+ │ │ │ └── ErrorTestController.php # Error testing endpoint
143
+ │ │ └── Livewire/
144
+ │ │ ├── Auth/
145
+ │ │ │ ├── Login.php # Login component
146
+ │ │ │ └── Register.php # Registration component
147
+ │ │ ├── BurritoTracker.php # Burrito tracker component
148
+ │ │ ├── Dashboard.php # Dashboard component
149
+ │ │ └── Profile.php # User profile component
150
+ │ ├── Models/
151
+ │ │ └── User.php # User model with Amplitude properties
152
+ │ └── Services/
153
+ │ └── AmplitudeService.php # Amplitude wrapper service
154
+ ├── database/
155
+ │ ├── migrations/ # Database migrations
156
+ │ └── seeders/
157
+ │ └── DatabaseSeeder.php # Seeds admin user
158
+ ├── resources/
159
+ │ └── views/
160
+ │ ├── components/
161
+ │ │ └── layouts/
162
+ │ │ ├── app.blade.php # Authenticated layout
163
+ │ │ └── guest.blade.php # Guest layout
164
+ │ ├── errors/
165
+ │ │ ├── 404.blade.php # Not found page
166
+ │ │ └── 500.blade.php # Server error page
167
+ │ └── livewire/
168
+ │ ├── auth/
169
+ │ │ ├── login.blade.php # Login form
170
+ │ │ └── register.blade.php # Registration form
171
+ │ ├── burrito-tracker.blade.php # Burrito tracker UI
172
+ │ ├── dashboard.blade.php # Dashboard UI
173
+ │ └── profile.blade.php # Profile UI
174
+ ├── routes/
175
+ │ ├── web.php # Web routes (auth, pages)
176
+ │ └── api.php # API routes
177
+ └── config/
178
+ └── amplitude.php # Amplitude configuration
179
+ ```
180
+
181
+ ## Development Commands
182
+
183
+ ```bash
184
+ # Start development server
185
+ php artisan serve
186
+
187
+ # Run migrations
188
+ php artisan migrate
189
+
190
+ # Seed database
191
+ php artisan migrate:fresh --seed
192
+
193
+ # Clear caches
194
+ php artisan optimize:clear
195
+ ```
196
+
197
+ ---
198
+
199
+ ## .env.example
200
+
201
+ ```example
202
+ APP_NAME="Amplitude Laravel Example"
203
+ APP_ENV=local
204
+ APP_KEY=
205
+ APP_DEBUG=true
206
+ APP_URL=http://localhost:8000
207
+
208
+ DB_CONNECTION=sqlite
209
+ # DB_DATABASE will use default database/database.sqlite
210
+
211
+ CACHE_DRIVER=file
212
+ CACHE_STORE=file
213
+
214
+ SESSION_DRIVER=file
215
+ SESSION_LIFETIME=120
216
+
217
+ AMPLITUDE_API_KEY=your_amplitude_api_key_here
218
+ AMPLITUDE_DISABLED=false
219
+
220
+ ```
221
+
222
+ ---
223
+
224
+ ## app/Http/Controllers/Api/BurritoController.php
225
+
226
+ ```php
227
+ <?php
228
+
229
+ namespace App\Http\Controllers\Api;
230
+
231
+ use App\Http\Controllers\Controller;
232
+ use App\Services\AmplitudeService;
233
+ use Illuminate\Http\JsonResponse;
234
+ use Illuminate\Http\Request;
235
+ use Illuminate\Support\Facades\Auth;
236
+
237
+ class BurritoController extends Controller
238
+ {
239
+ public function consider(Request $request, AmplitudeService $amplitude): JsonResponse
240
+ {
241
+ $user = Auth::user();
242
+
243
+ // Increment session counter
244
+ $burritoCount = session('burrito_count', 0) + 1;
245
+ session(['burrito_count' => $burritoCount]);
246
+
247
+ // Amplitude: Track event
248
+ $amplitude->identify($user->email, $user->getAmplitudeProperties());
249
+ $amplitude->capture($user->email, 'Burrito Considered', [
250
+ 'total_considerations' => $burritoCount,
251
+ ]);
252
+
253
+ return response()->json([
254
+ 'success' => true,
255
+ 'count' => $burritoCount,
256
+ ]);
257
+ }
258
+ }
259
+
260
+ ```
261
+
262
+ ---
263
+
264
+ ## app/Http/Controllers/Api/ErrorTestController.php
265
+
266
+ ```php
267
+ <?php
268
+
269
+ namespace App\Http\Controllers\Api;
270
+
271
+ use App\Http\Controllers\Controller;
272
+ use App\Services\AmplitudeService;
273
+ use Illuminate\Http\JsonResponse;
274
+ use Illuminate\Http\Request;
275
+ use Illuminate\Support\Facades\Auth;
276
+
277
+ class ErrorTestController extends Controller
278
+ {
279
+ public function test(Request $request, AmplitudeService $amplitude): JsonResponse
280
+ {
281
+ $shouldCapture = $request->query('capture', 'true') === 'true';
282
+ $user = Auth::user();
283
+
284
+ try {
285
+ throw new \Exception('Test exception from critical operation');
286
+ } catch (\Throwable $e) {
287
+ if ($shouldCapture) {
288
+ // Capture error event in Amplitude
289
+ $amplitude->identify($user->email, $user->getAmplitudeProperties());
290
+ $amplitude->capture($user->email, 'Error Occurred', [
291
+ 'error_message' => $e->getMessage(),
292
+ 'error_type' => get_class($e),
293
+ ]);
294
+
295
+ return response()->json([
296
+ 'error' => 'Operation failed',
297
+ 'message' => 'Error captured in Amplitude: ' . $e->getMessage(),
298
+ ], 500);
299
+ }
300
+
301
+ return response()->json([
302
+ 'error' => $e->getMessage(),
303
+ ], 500);
304
+ }
305
+ }
306
+ }
307
+
308
+ ```
309
+
310
+ ---
311
+
312
+ ## app/Http/Controllers/Controller.php
313
+
314
+ ```php
315
+ <?php
316
+
317
+ namespace App\Http\Controllers;
318
+
319
+ abstract class Controller
320
+ {
321
+ //
322
+ }
323
+
324
+ ```
325
+
326
+ ---
327
+
328
+ ## app/Http/Livewire/Auth/Login.php
329
+
330
+ ```php
331
+ <?php
332
+
333
+ namespace App\Http\Livewire\Auth;
334
+
335
+ use App\Services\AmplitudeService;
336
+ use Illuminate\Support\Facades\Auth;
337
+ use Livewire\Component;
338
+
339
+ class Login extends Component
340
+ {
341
+ public string $email = '';
342
+ public string $password = '';
343
+ public bool $remember = false;
344
+
345
+ protected $rules = [
346
+ 'email' => 'required|email',
347
+ 'password' => 'required',
348
+ ];
349
+
350
+ public function login(AmplitudeService $amplitude)
351
+ {
352
+ $this->validate();
353
+
354
+ if (Auth::attempt(['email' => $this->email, 'password' => $this->password], $this->remember)) {
355
+ $user = Auth::user();
356
+
357
+ // Amplitude: Identify and track login
358
+ $amplitude->identify($user->email, $user->getAmplitudeProperties());
359
+ $amplitude->capture($user->email, 'User Logged In', [
360
+ 'login_method' => 'password',
361
+ ]);
362
+
363
+ session()->regenerate();
364
+
365
+ return redirect()->intended(route('dashboard'));
366
+ }
367
+
368
+ $this->addError('email', 'Invalid credentials');
369
+ }
370
+
371
+ public function render()
372
+ {
373
+ return view('livewire.auth.login')
374
+ ->layout('components.layouts.guest');
375
+ }
376
+ }
377
+
378
+ ```
379
+
380
+ ---
381
+
382
+ ## app/Http/Livewire/Auth/Register.php
383
+
384
+ ```php
385
+ <?php
386
+
387
+ namespace App\Http\Livewire\Auth;
388
+
389
+ use App\Models\User;
390
+ use App\Services\AmplitudeService;
391
+ use Illuminate\Support\Facades\Auth;
392
+ use Livewire\Component;
393
+
394
+ class Register extends Component
395
+ {
396
+ public string $email = '';
397
+ public string $password = '';
398
+ public string $password_confirmation = '';
399
+
400
+ protected $rules = [
401
+ 'email' => 'required|email|unique:users,email',
402
+ 'password' => 'required|min:6|confirmed',
403
+ ];
404
+
405
+ public function register(AmplitudeService $amplitude)
406
+ {
407
+ $validated = $this->validate();
408
+
409
+ $user = User::create([
410
+ 'email' => $validated['email'],
411
+ 'password' => bcrypt($validated['password']),
412
+ 'is_staff' => false,
413
+ ]);
414
+
415
+ // Amplitude: Identify new user and track signup
416
+ $amplitude->identify($user->email, $user->getAmplitudeProperties());
417
+ $amplitude->capture($user->email, 'User Signed Up', [
418
+ 'signup_method' => 'form',
419
+ ]);
420
+
421
+ Auth::login($user);
422
+
423
+ session()->flash('success', 'Account created successfully!');
424
+
425
+ return redirect()->route('dashboard');
426
+ }
427
+
428
+ public function render()
429
+ {
430
+ return view('livewire.auth.register')
431
+ ->layout('components.layouts.guest');
432
+ }
433
+ }
434
+
435
+ ```
436
+
437
+ ---
438
+
439
+ ## app/Http/Livewire/BurritoTracker.php
440
+
441
+ ```php
442
+ <?php
443
+
444
+ namespace App\Http\Livewire;
445
+
446
+ use App\Services\AmplitudeService;
447
+ use Illuminate\Support\Facades\Auth;
448
+ use Livewire\Component;
449
+
450
+ class BurritoTracker extends Component
451
+ {
452
+ public int $burritoCount = 0;
453
+
454
+ public function mount()
455
+ {
456
+ $this->burritoCount = session('burrito_count', 0);
457
+ }
458
+
459
+ public function considerBurrito(AmplitudeService $amplitude)
460
+ {
461
+ $this->burritoCount++;
462
+ session(['burrito_count' => $this->burritoCount]);
463
+
464
+ // Amplitude: Track burrito consideration
465
+ $user = Auth::user();
466
+ $amplitude->identify($user->email, $user->getAmplitudeProperties());
467
+ $amplitude->capture($user->email, 'Burrito Considered', [
468
+ 'total_considerations' => $this->burritoCount,
469
+ ]);
470
+
471
+ $this->dispatch('burrito-considered');
472
+ }
473
+
474
+ public function render()
475
+ {
476
+ return view('livewire.burrito-tracker')
477
+ ->layout('components.layouts.app');
478
+ }
479
+ }
480
+
481
+ ```
482
+
483
+ ---
484
+
485
+ ## app/Http/Livewire/Dashboard.php
486
+
487
+ ```php
488
+ <?php
489
+
490
+ namespace App\Http\Livewire;
491
+
492
+ use App\Services\AmplitudeService;
493
+ use Illuminate\Support\Facades\Auth;
494
+ use Livewire\Component;
495
+
496
+ class Dashboard extends Component
497
+ {
498
+ public function mount(AmplitudeService $amplitude)
499
+ {
500
+ $user = Auth::user();
501
+
502
+ // Amplitude: Track dashboard view
503
+ $amplitude->capture($user->email, 'Dashboard Viewed', [
504
+ 'is_staff' => $user->is_staff,
505
+ ]);
506
+
507
+ // TODO: Use Amplitude Experiment for feature flags
508
+ }
509
+
510
+ public function render()
511
+ {
512
+ return view('livewire.dashboard')
513
+ ->layout('components.layouts.app');
514
+ }
515
+ }
516
+
517
+ ```
518
+
519
+ ---
520
+
521
+ ## app/Http/Livewire/Profile.php
522
+
523
+ ```php
524
+ <?php
525
+
526
+ namespace App\Http\Livewire;
527
+
528
+ use App\Services\AmplitudeService;
529
+ use Illuminate\Support\Facades\Auth;
530
+ use Livewire\Component;
531
+
532
+ class Profile extends Component
533
+ {
534
+ public function mount(AmplitudeService $amplitude)
535
+ {
536
+ $user = Auth::user();
537
+
538
+ // Amplitude: Track profile view
539
+ $amplitude->capture($user->email, 'Profile Viewed');
540
+ }
541
+
542
+ public function render()
543
+ {
544
+ return view('livewire.profile')
545
+ ->layout('components.layouts.app');
546
+ }
547
+ }
548
+
549
+ ```
550
+
551
+ ---
552
+
553
+ ## app/Models/User.php
554
+
555
+ ```php
556
+ <?php
557
+
558
+ namespace App\Models;
559
+
560
+ use Illuminate\Database\Eloquent\Factories\HasFactory;
561
+ use Illuminate\Foundation\Auth\User as Authenticatable;
562
+ use Illuminate\Notifications\Notifiable;
563
+
564
+ class User extends Authenticatable
565
+ {
566
+ use HasFactory, Notifiable;
567
+
568
+ protected $fillable = [
569
+ 'email',
570
+ 'password',
571
+ 'is_staff',
572
+ ];
573
+
574
+ protected $hidden = [
575
+ 'password',
576
+ 'remember_token',
577
+ ];
578
+
579
+ protected function casts(): array
580
+ {
581
+ return [
582
+ 'password' => 'hashed',
583
+ 'is_staff' => 'boolean',
584
+ ];
585
+ }
586
+
587
+ /**
588
+ * Get Amplitude user properties for this user.
589
+ */
590
+ public function getAmplitudeProperties(): array
591
+ {
592
+ return [
593
+ 'email' => $this->email,
594
+ 'is_staff' => $this->is_staff,
595
+ 'date_joined' => $this->created_at->toISOString(),
596
+ ];
597
+ }
598
+ }
599
+
600
+ ```
601
+
602
+ ---
603
+
604
+ ## app/Services/AmplitudeService.php
605
+
606
+ ```php
607
+ <?php
608
+
609
+ namespace App\Services;
610
+
611
+ use Zumba\Amplitude\Amplitude;
612
+
613
+ class AmplitudeService
614
+ {
615
+ protected ?Amplitude $client = null;
616
+
617
+ public function __construct()
618
+ {
619
+ if (config('amplitude.disabled') || !config('amplitude.api_key')) {
620
+ return;
621
+ }
622
+
623
+ $this->client = Amplitude::getInstance();
624
+ $this->client->init(config('amplitude.api_key'));
625
+ }
626
+
627
+ public function identify(string $userId, array $properties = []): void
628
+ {
629
+ if (!$this->client) {
630
+ return;
631
+ }
632
+
633
+ $this->client->setUserId($userId);
634
+
635
+ if (!empty($properties)) {
636
+ $this->client->setUserProperties($properties);
637
+ }
638
+ }
639
+
640
+ public function capture(string $userId, string $event, array $properties = []): void
641
+ {
642
+ if (!$this->client) {
643
+ return;
644
+ }
645
+
646
+ $this->client->setUserId($userId);
647
+ $this->client->queueEvent($event, $properties);
648
+ }
649
+ }
650
+
651
+ ```
652
+
653
+ ---
654
+
655
+ ## artisan
656
+
657
+ ```
658
+ #!/usr/bin/env php
659
+ <?php
660
+
661
+ define('LARAVEL_START', microtime(true));
662
+
663
+ /*
664
+ |--------------------------------------------------------------------------
665
+ | Register The Auto Loader
666
+ |--------------------------------------------------------------------------
667
+ */
668
+
669
+ require __DIR__.'/vendor/autoload.php';
670
+
671
+ $app = require_once __DIR__.'/bootstrap/app.php';
672
+
673
+ /*
674
+ |--------------------------------------------------------------------------
675
+ | Run The Artisan Application
676
+ |--------------------------------------------------------------------------
677
+ */
678
+
679
+ $kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
680
+
681
+ $status = $kernel->handle(
682
+ $input = new Symfony\Component\Console\Input\ArgvInput,
683
+ new Symfony\Component\Console\Output\ConsoleOutput
684
+ );
685
+
686
+ $kernel->terminate($input, $status);
687
+
688
+ exit($status);
689
+
690
+ ```
691
+
692
+ ---
693
+
694
+ ## bootstrap/app.php
695
+
696
+ ```php
697
+ <?php
698
+
699
+ use Illuminate\Foundation\Application;
700
+ use Illuminate\Foundation\Configuration\Exceptions;
701
+ use Illuminate\Foundation\Configuration\Middleware;
702
+
703
+ return Application::configure(basePath: dirname(__DIR__))
704
+ ->withRouting(
705
+ web: __DIR__.'/../routes/web.php',
706
+ api: __DIR__.'/../routes/api.php',
707
+ commands: __DIR__.'/../routes/console.php',
708
+ health: '/up',
709
+ )
710
+ ->withMiddleware(function (Middleware $middleware) {
711
+ //
712
+ })
713
+ ->withExceptions(function (Exceptions $exceptions) {
714
+ //
715
+ })->create();
716
+
717
+ ```
718
+
719
+ ---
720
+
721
+ ## bootstrap/cache/packages.php
722
+
723
+ ```php
724
+ <?php return array (
725
+ 'livewire/livewire' =>
726
+ array (
727
+ 'aliases' =>
728
+ array (
729
+ 'Livewire' => 'Livewire\\Livewire',
730
+ ),
731
+ 'providers' =>
732
+ array (
733
+ 0 => 'Livewire\\LivewireServiceProvider',
734
+ ),
735
+ ),
736
+ 'nesbot/carbon' =>
737
+ array (
738
+ 'providers' =>
739
+ array (
740
+ 0 => 'Carbon\\Laravel\\ServiceProvider',
741
+ ),
742
+ ),
743
+ 'nunomaduro/termwind' =>
744
+ array (
745
+ 'providers' =>
746
+ array (
747
+ 0 => 'Termwind\\Laravel\\TermwindServiceProvider',
748
+ ),
749
+ ),
750
+ );
751
+ ```
752
+
753
+ ---
754
+
755
+ ## bootstrap/cache/services.php
756
+
757
+ ```php
758
+ <?php return array (
759
+ 'providers' =>
760
+ array (
761
+ 0 => 'Illuminate\\Auth\\AuthServiceProvider',
762
+ 1 => 'Illuminate\\Broadcasting\\BroadcastServiceProvider',
763
+ 2 => 'Illuminate\\Bus\\BusServiceProvider',
764
+ 3 => 'Illuminate\\Cache\\CacheServiceProvider',
765
+ 4 => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
766
+ 5 => 'Illuminate\\Cookie\\CookieServiceProvider',
767
+ 6 => 'Illuminate\\Database\\DatabaseServiceProvider',
768
+ 7 => 'Illuminate\\Encryption\\EncryptionServiceProvider',
769
+ 8 => 'Illuminate\\Filesystem\\FilesystemServiceProvider',
770
+ 9 => 'Illuminate\\Foundation\\Providers\\FoundationServiceProvider',
771
+ 10 => 'Illuminate\\Hashing\\HashServiceProvider',
772
+ 11 => 'Illuminate\\Mail\\MailServiceProvider',
773
+ 12 => 'Illuminate\\Notifications\\NotificationServiceProvider',
774
+ 13 => 'Illuminate\\Pagination\\PaginationServiceProvider',
775
+ 14 => 'Illuminate\\Pipeline\\PipelineServiceProvider',
776
+ 15 => 'Illuminate\\Queue\\QueueServiceProvider',
777
+ 16 => 'Illuminate\\Redis\\RedisServiceProvider',
778
+ 17 => 'Illuminate\\Auth\\Passwords\\PasswordResetServiceProvider',
779
+ 18 => 'Illuminate\\Session\\SessionServiceProvider',
780
+ 19 => 'Illuminate\\Translation\\TranslationServiceProvider',
781
+ 20 => 'Illuminate\\Validation\\ValidationServiceProvider',
782
+ 21 => 'Illuminate\\View\\ViewServiceProvider',
783
+ 22 => 'Livewire\\LivewireServiceProvider',
784
+ 23 => 'Carbon\\Laravel\\ServiceProvider',
785
+ 24 => 'Termwind\\Laravel\\TermwindServiceProvider',
786
+ ),
787
+ 'eager' =>
788
+ array (
789
+ 0 => 'Illuminate\\Auth\\AuthServiceProvider',
790
+ 1 => 'Illuminate\\Cookie\\CookieServiceProvider',
791
+ 2 => 'Illuminate\\Database\\DatabaseServiceProvider',
792
+ 3 => 'Illuminate\\Encryption\\EncryptionServiceProvider',
793
+ 4 => 'Illuminate\\Filesystem\\FilesystemServiceProvider',
794
+ 5 => 'Illuminate\\Foundation\\Providers\\FoundationServiceProvider',
795
+ 6 => 'Illuminate\\Notifications\\NotificationServiceProvider',
796
+ 7 => 'Illuminate\\Pagination\\PaginationServiceProvider',
797
+ 8 => 'Illuminate\\Session\\SessionServiceProvider',
798
+ 9 => 'Illuminate\\View\\ViewServiceProvider',
799
+ 10 => 'Livewire\\LivewireServiceProvider',
800
+ 11 => 'Carbon\\Laravel\\ServiceProvider',
801
+ 12 => 'Termwind\\Laravel\\TermwindServiceProvider',
802
+ ),
803
+ 'deferred' =>
804
+ array (
805
+ 'Illuminate\\Broadcasting\\BroadcastManager' => 'Illuminate\\Broadcasting\\BroadcastServiceProvider',
806
+ 'Illuminate\\Contracts\\Broadcasting\\Factory' => 'Illuminate\\Broadcasting\\BroadcastServiceProvider',
807
+ 'Illuminate\\Contracts\\Broadcasting\\Broadcaster' => 'Illuminate\\Broadcasting\\BroadcastServiceProvider',
808
+ 'Illuminate\\Bus\\Dispatcher' => 'Illuminate\\Bus\\BusServiceProvider',
809
+ 'Illuminate\\Contracts\\Bus\\Dispatcher' => 'Illuminate\\Bus\\BusServiceProvider',
810
+ 'Illuminate\\Contracts\\Bus\\QueueingDispatcher' => 'Illuminate\\Bus\\BusServiceProvider',
811
+ 'Illuminate\\Bus\\BatchRepository' => 'Illuminate\\Bus\\BusServiceProvider',
812
+ 'Illuminate\\Bus\\DatabaseBatchRepository' => 'Illuminate\\Bus\\BusServiceProvider',
813
+ 'cache' => 'Illuminate\\Cache\\CacheServiceProvider',
814
+ 'cache.store' => 'Illuminate\\Cache\\CacheServiceProvider',
815
+ 'cache.psr6' => 'Illuminate\\Cache\\CacheServiceProvider',
816
+ 'memcached.connector' => 'Illuminate\\Cache\\CacheServiceProvider',
817
+ 'Illuminate\\Cache\\RateLimiter' => 'Illuminate\\Cache\\CacheServiceProvider',
818
+ 'Illuminate\\Foundation\\Console\\AboutCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
819
+ 'Illuminate\\Cache\\Console\\ClearCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
820
+ 'Illuminate\\Cache\\Console\\ForgetCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
821
+ 'Illuminate\\Foundation\\Console\\ClearCompiledCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
822
+ 'Illuminate\\Auth\\Console\\ClearResetsCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
823
+ 'Illuminate\\Foundation\\Console\\ConfigCacheCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
824
+ 'Illuminate\\Foundation\\Console\\ConfigClearCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
825
+ 'Illuminate\\Foundation\\Console\\ConfigShowCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
826
+ 'Illuminate\\Database\\Console\\DbCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
827
+ 'Illuminate\\Database\\Console\\MonitorCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
828
+ 'Illuminate\\Database\\Console\\PruneCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
829
+ 'Illuminate\\Database\\Console\\ShowCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
830
+ 'Illuminate\\Database\\Console\\TableCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
831
+ 'Illuminate\\Database\\Console\\WipeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
832
+ 'Illuminate\\Foundation\\Console\\DownCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
833
+ 'Illuminate\\Foundation\\Console\\EnvironmentCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
834
+ 'Illuminate\\Foundation\\Console\\EnvironmentDecryptCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
835
+ 'Illuminate\\Foundation\\Console\\EnvironmentEncryptCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
836
+ 'Illuminate\\Foundation\\Console\\EventCacheCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
837
+ 'Illuminate\\Foundation\\Console\\EventClearCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
838
+ 'Illuminate\\Foundation\\Console\\EventListCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
839
+ 'Illuminate\\Concurrency\\Console\\InvokeSerializedClosureCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
840
+ 'Illuminate\\Foundation\\Console\\KeyGenerateCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
841
+ 'Illuminate\\Foundation\\Console\\OptimizeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
842
+ 'Illuminate\\Foundation\\Console\\OptimizeClearCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
843
+ 'Illuminate\\Foundation\\Console\\PackageDiscoverCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
844
+ 'Illuminate\\Cache\\Console\\PruneStaleTagsCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
845
+ 'Illuminate\\Queue\\Console\\ClearCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
846
+ 'Illuminate\\Queue\\Console\\ListFailedCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
847
+ 'Illuminate\\Queue\\Console\\FlushFailedCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
848
+ 'Illuminate\\Queue\\Console\\ForgetFailedCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
849
+ 'Illuminate\\Queue\\Console\\ListenCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
850
+ 'Illuminate\\Queue\\Console\\MonitorCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
851
+ 'Illuminate\\Queue\\Console\\PruneBatchesCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
852
+ 'Illuminate\\Queue\\Console\\PruneFailedJobsCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
853
+ 'Illuminate\\Queue\\Console\\RestartCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
854
+ 'Illuminate\\Queue\\Console\\RetryCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
855
+ 'Illuminate\\Queue\\Console\\RetryBatchCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
856
+ 'Illuminate\\Queue\\Console\\WorkCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
857
+ 'Illuminate\\Foundation\\Console\\RouteCacheCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
858
+ 'Illuminate\\Foundation\\Console\\RouteClearCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
859
+ 'Illuminate\\Foundation\\Console\\RouteListCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
860
+ 'Illuminate\\Database\\Console\\DumpCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
861
+ 'Illuminate\\Database\\Console\\Seeds\\SeedCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
862
+ 'Illuminate\\Console\\Scheduling\\ScheduleFinishCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
863
+ 'Illuminate\\Console\\Scheduling\\ScheduleListCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
864
+ 'Illuminate\\Console\\Scheduling\\ScheduleRunCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
865
+ 'Illuminate\\Console\\Scheduling\\ScheduleClearCacheCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
866
+ 'Illuminate\\Console\\Scheduling\\ScheduleTestCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
867
+ 'Illuminate\\Console\\Scheduling\\ScheduleWorkCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
868
+ 'Illuminate\\Console\\Scheduling\\ScheduleInterruptCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
869
+ 'Illuminate\\Database\\Console\\ShowModelCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
870
+ 'Illuminate\\Foundation\\Console\\StorageLinkCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
871
+ 'Illuminate\\Foundation\\Console\\StorageUnlinkCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
872
+ 'Illuminate\\Foundation\\Console\\UpCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
873
+ 'Illuminate\\Foundation\\Console\\ViewCacheCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
874
+ 'Illuminate\\Foundation\\Console\\ViewClearCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
875
+ 'Illuminate\\Foundation\\Console\\ApiInstallCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
876
+ 'Illuminate\\Foundation\\Console\\BroadcastingInstallCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
877
+ 'Illuminate\\Cache\\Console\\CacheTableCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
878
+ 'Illuminate\\Foundation\\Console\\CastMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
879
+ 'Illuminate\\Foundation\\Console\\ChannelListCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
880
+ 'Illuminate\\Foundation\\Console\\ChannelMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
881
+ 'Illuminate\\Foundation\\Console\\ClassMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
882
+ 'Illuminate\\Foundation\\Console\\ComponentMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
883
+ 'Illuminate\\Foundation\\Console\\ConfigPublishCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
884
+ 'Illuminate\\Foundation\\Console\\ConsoleMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
885
+ 'Illuminate\\Routing\\Console\\ControllerMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
886
+ 'Illuminate\\Foundation\\Console\\DocsCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
887
+ 'Illuminate\\Foundation\\Console\\EnumMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
888
+ 'Illuminate\\Foundation\\Console\\EventGenerateCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
889
+ 'Illuminate\\Foundation\\Console\\EventMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
890
+ 'Illuminate\\Foundation\\Console\\ExceptionMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
891
+ 'Illuminate\\Database\\Console\\Factories\\FactoryMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
892
+ 'Illuminate\\Foundation\\Console\\InterfaceMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
893
+ 'Illuminate\\Foundation\\Console\\JobMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
894
+ 'Illuminate\\Foundation\\Console\\JobMiddlewareMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
895
+ 'Illuminate\\Foundation\\Console\\LangPublishCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
896
+ 'Illuminate\\Foundation\\Console\\ListenerMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
897
+ 'Illuminate\\Foundation\\Console\\MailMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
898
+ 'Illuminate\\Routing\\Console\\MiddlewareMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
899
+ 'Illuminate\\Foundation\\Console\\ModelMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
900
+ 'Illuminate\\Foundation\\Console\\NotificationMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
901
+ 'Illuminate\\Notifications\\Console\\NotificationTableCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
902
+ 'Illuminate\\Foundation\\Console\\ObserverMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
903
+ 'Illuminate\\Foundation\\Console\\PolicyMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
904
+ 'Illuminate\\Foundation\\Console\\ProviderMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
905
+ 'Illuminate\\Queue\\Console\\FailedTableCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
906
+ 'Illuminate\\Queue\\Console\\TableCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
907
+ 'Illuminate\\Queue\\Console\\BatchesTableCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
908
+ 'Illuminate\\Foundation\\Console\\RequestMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
909
+ 'Illuminate\\Foundation\\Console\\ResourceMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
910
+ 'Illuminate\\Foundation\\Console\\RuleMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
911
+ 'Illuminate\\Foundation\\Console\\ScopeMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
912
+ 'Illuminate\\Database\\Console\\Seeds\\SeederMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
913
+ 'Illuminate\\Session\\Console\\SessionTableCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
914
+ 'Illuminate\\Foundation\\Console\\ServeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
915
+ 'Illuminate\\Foundation\\Console\\StubPublishCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
916
+ 'Illuminate\\Foundation\\Console\\TestMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
917
+ 'Illuminate\\Foundation\\Console\\TraitMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
918
+ 'Illuminate\\Foundation\\Console\\VendorPublishCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
919
+ 'Illuminate\\Foundation\\Console\\ViewMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
920
+ 'migrator' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
921
+ 'migration.repository' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
922
+ 'migration.creator' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
923
+ 'Illuminate\\Database\\Console\\Migrations\\MigrateCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
924
+ 'Illuminate\\Database\\Console\\Migrations\\FreshCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
925
+ 'Illuminate\\Database\\Console\\Migrations\\InstallCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
926
+ 'Illuminate\\Database\\Console\\Migrations\\RefreshCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
927
+ 'Illuminate\\Database\\Console\\Migrations\\ResetCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
928
+ 'Illuminate\\Database\\Console\\Migrations\\RollbackCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
929
+ 'Illuminate\\Database\\Console\\Migrations\\StatusCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
930
+ 'Illuminate\\Database\\Console\\Migrations\\MigrateMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
931
+ 'composer' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
932
+ 'hash' => 'Illuminate\\Hashing\\HashServiceProvider',
933
+ 'hash.driver' => 'Illuminate\\Hashing\\HashServiceProvider',
934
+ 'mail.manager' => 'Illuminate\\Mail\\MailServiceProvider',
935
+ 'mailer' => 'Illuminate\\Mail\\MailServiceProvider',
936
+ 'Illuminate\\Mail\\Markdown' => 'Illuminate\\Mail\\MailServiceProvider',
937
+ 'Illuminate\\Contracts\\Pipeline\\Hub' => 'Illuminate\\Pipeline\\PipelineServiceProvider',
938
+ 'pipeline' => 'Illuminate\\Pipeline\\PipelineServiceProvider',
939
+ 'queue' => 'Illuminate\\Queue\\QueueServiceProvider',
940
+ 'queue.connection' => 'Illuminate\\Queue\\QueueServiceProvider',
941
+ 'queue.failer' => 'Illuminate\\Queue\\QueueServiceProvider',
942
+ 'queue.listener' => 'Illuminate\\Queue\\QueueServiceProvider',
943
+ 'queue.worker' => 'Illuminate\\Queue\\QueueServiceProvider',
944
+ 'redis' => 'Illuminate\\Redis\\RedisServiceProvider',
945
+ 'redis.connection' => 'Illuminate\\Redis\\RedisServiceProvider',
946
+ 'auth.password' => 'Illuminate\\Auth\\Passwords\\PasswordResetServiceProvider',
947
+ 'auth.password.broker' => 'Illuminate\\Auth\\Passwords\\PasswordResetServiceProvider',
948
+ 'translator' => 'Illuminate\\Translation\\TranslationServiceProvider',
949
+ 'translation.loader' => 'Illuminate\\Translation\\TranslationServiceProvider',
950
+ 'validator' => 'Illuminate\\Validation\\ValidationServiceProvider',
951
+ 'validation.presence' => 'Illuminate\\Validation\\ValidationServiceProvider',
952
+ 'Illuminate\\Contracts\\Validation\\UncompromisedVerifier' => 'Illuminate\\Validation\\ValidationServiceProvider',
953
+ ),
954
+ 'when' =>
955
+ array (
956
+ 'Illuminate\\Broadcasting\\BroadcastServiceProvider' =>
957
+ array (
958
+ ),
959
+ 'Illuminate\\Bus\\BusServiceProvider' =>
960
+ array (
961
+ ),
962
+ 'Illuminate\\Cache\\CacheServiceProvider' =>
963
+ array (
964
+ ),
965
+ 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider' =>
966
+ array (
967
+ ),
968
+ 'Illuminate\\Hashing\\HashServiceProvider' =>
969
+ array (
970
+ ),
971
+ 'Illuminate\\Mail\\MailServiceProvider' =>
972
+ array (
973
+ ),
974
+ 'Illuminate\\Pipeline\\PipelineServiceProvider' =>
975
+ array (
976
+ ),
977
+ 'Illuminate\\Queue\\QueueServiceProvider' =>
978
+ array (
979
+ ),
980
+ 'Illuminate\\Redis\\RedisServiceProvider' =>
981
+ array (
982
+ ),
983
+ 'Illuminate\\Auth\\Passwords\\PasswordResetServiceProvider' =>
984
+ array (
985
+ ),
986
+ 'Illuminate\\Translation\\TranslationServiceProvider' =>
987
+ array (
988
+ ),
989
+ 'Illuminate\\Validation\\ValidationServiceProvider' =>
990
+ array (
991
+ ),
992
+ ),
993
+ );
994
+ ```
995
+
996
+ ---
997
+
998
+ ## config/amplitude.php
999
+
1000
+ ```php
1001
+ <?php
1002
+
1003
+ return [
1004
+ 'api_key' => env('AMPLITUDE_API_KEY', ''),
1005
+ 'disabled' => env('AMPLITUDE_DISABLED', false),
1006
+ ];
1007
+
1008
+ ```
1009
+
1010
+ ---
1011
+
1012
+ ## config/app.php
1013
+
1014
+ ```php
1015
+ <?php
1016
+
1017
+ return [
1018
+ 'name' => env('APP_NAME', 'Amplitude Laravel Example'),
1019
+ 'env' => env('APP_ENV', 'production'),
1020
+ 'debug' => (bool) env('APP_DEBUG', false),
1021
+ 'url' => env('APP_URL', 'http://localhost'),
1022
+ 'timezone' => 'UTC',
1023
+ 'locale' => 'en',
1024
+ 'fallback_locale' => 'en',
1025
+ 'key' => env('APP_KEY'),
1026
+ 'cipher' => 'AES-256-CBC',
1027
+
1028
+ 'providers' => [
1029
+ // Laravel Framework Service Providers
1030
+ Illuminate\Auth\AuthServiceProvider::class,
1031
+ Illuminate\Broadcasting\BroadcastServiceProvider::class,
1032
+ Illuminate\Bus\BusServiceProvider::class,
1033
+ Illuminate\Cache\CacheServiceProvider::class,
1034
+ Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
1035
+ Illuminate\Cookie\CookieServiceProvider::class,
1036
+ Illuminate\Database\DatabaseServiceProvider::class,
1037
+ Illuminate\Encryption\EncryptionServiceProvider::class,
1038
+ Illuminate\Filesystem\FilesystemServiceProvider::class,
1039
+ Illuminate\Foundation\Providers\FoundationServiceProvider::class,
1040
+ Illuminate\Hashing\HashServiceProvider::class,
1041
+ Illuminate\Mail\MailServiceProvider::class,
1042
+ Illuminate\Notifications\NotificationServiceProvider::class,
1043
+ Illuminate\Pagination\PaginationServiceProvider::class,
1044
+ Illuminate\Pipeline\PipelineServiceProvider::class,
1045
+ Illuminate\Queue\QueueServiceProvider::class,
1046
+ Illuminate\Redis\RedisServiceProvider::class,
1047
+ Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
1048
+ Illuminate\Session\SessionServiceProvider::class,
1049
+ Illuminate\Translation\TranslationServiceProvider::class,
1050
+ Illuminate\Validation\ValidationServiceProvider::class,
1051
+ Illuminate\View\ViewServiceProvider::class,
1052
+ ],
1053
+
1054
+ 'aliases' => [
1055
+ 'App' => Illuminate\Support\Facades\App::class,
1056
+ 'Auth' => Illuminate\Support\Facades\Auth::class,
1057
+ 'Blade' => Illuminate\Support\Facades\Blade::class,
1058
+ 'Cache' => Illuminate\Support\Facades\Cache::class,
1059
+ 'Config' => Illuminate\Support\Facades\Config::class,
1060
+ 'DB' => Illuminate\Support\Facades\DB::class,
1061
+ 'Hash' => Illuminate\Support\Facades\Hash::class,
1062
+ 'Request' => Illuminate\Support\Facades\Request::class,
1063
+ 'Route' => Illuminate\Support\Facades\Route::class,
1064
+ 'Schema' => Illuminate\Support\Facades\Schema::class,
1065
+ 'Session' => Illuminate\Support\Facades\Session::class,
1066
+ 'View' => Illuminate\Support\Facades\View::class,
1067
+ ],
1068
+ ];
1069
+
1070
+ ```
1071
+
1072
+ ---
1073
+
1074
+ ## config/auth.php
1075
+
1076
+ ```php
1077
+ <?php
1078
+
1079
+ return [
1080
+ 'defaults' => [
1081
+ 'guard' => 'web',
1082
+ 'passwords' => 'users',
1083
+ ],
1084
+
1085
+ 'guards' => [
1086
+ 'web' => [
1087
+ 'driver' => 'session',
1088
+ 'provider' => 'users',
1089
+ ],
1090
+ ],
1091
+
1092
+ 'providers' => [
1093
+ 'users' => [
1094
+ 'driver' => 'eloquent',
1095
+ 'model' => App\Models\User::class,
1096
+ ],
1097
+ ],
1098
+
1099
+ 'passwords' => [
1100
+ 'users' => [
1101
+ 'provider' => 'users',
1102
+ 'table' => 'password_reset_tokens',
1103
+ 'expire' => 60,
1104
+ 'throttle' => 60,
1105
+ ],
1106
+ ],
1107
+
1108
+ 'password_timeout' => 10800,
1109
+ ];
1110
+
1111
+ ```
1112
+
1113
+ ---
1114
+
1115
+ ## config/database.php
1116
+
1117
+ ```php
1118
+ <?php
1119
+
1120
+ return [
1121
+ 'default' => env('DB_CONNECTION', 'sqlite'),
1122
+
1123
+ 'connections' => [
1124
+ 'sqlite' => [
1125
+ 'driver' => 'sqlite',
1126
+ 'url' => env('DATABASE_URL'),
1127
+ 'database' => env('DB_DATABASE', database_path('database.sqlite')),
1128
+ 'prefix' => '',
1129
+ 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
1130
+ ],
1131
+
1132
+ 'mysql' => [
1133
+ 'driver' => 'mysql',
1134
+ 'url' => env('DATABASE_URL'),
1135
+ 'host' => env('DB_HOST', '127.0.0.1'),
1136
+ 'port' => env('DB_PORT', '3306'),
1137
+ 'database' => env('DB_DATABASE', 'forge'),
1138
+ 'username' => env('DB_USERNAME', 'forge'),
1139
+ 'password' => env('DB_PASSWORD', ''),
1140
+ 'charset' => 'utf8mb4',
1141
+ 'collation' => 'utf8mb4_unicode_ci',
1142
+ 'prefix' => '',
1143
+ 'strict' => true,
1144
+ 'engine' => null,
1145
+ ],
1146
+ ],
1147
+
1148
+ 'migrations' => 'migrations',
1149
+ ];
1150
+
1151
+ ```
1152
+
1153
+ ---
1154
+
1155
+ ## config/session.php
1156
+
1157
+ ```php
1158
+ <?php
1159
+
1160
+ return [
1161
+ 'driver' => env('SESSION_DRIVER', 'file'),
1162
+ 'lifetime' => env('SESSION_LIFETIME', 120),
1163
+ 'expire_on_close' => false,
1164
+ 'encrypt' => false,
1165
+ 'files' => storage_path('framework/sessions'),
1166
+ 'connection' => null,
1167
+ 'table' => 'sessions',
1168
+ 'store' => null,
1169
+ 'lottery' => [2, 100],
1170
+ 'cookie' => env('SESSION_COOKIE', 'laravel_session'),
1171
+ 'path' => '/',
1172
+ 'domain' => env('SESSION_DOMAIN'),
1173
+ 'secure' => env('SESSION_SECURE_COOKIE'),
1174
+ 'http_only' => true,
1175
+ 'same_site' => 'lax',
1176
+ ];
1177
+
1178
+ ```
1179
+
1180
+ ---
1181
+
1182
+ ## database/migrations/2024_01_01_000000_create_users_table.php
1183
+
1184
+ ```php
1185
+ <?php
1186
+
1187
+ use Illuminate\Database\Migrations\Migration;
1188
+ use Illuminate\Database\Schema\Blueprint;
1189
+ use Illuminate\Support\Facades\Schema;
1190
+
1191
+ return new class extends Migration
1192
+ {
1193
+ public function up(): void
1194
+ {
1195
+ Schema::create('users', function (Blueprint $table) {
1196
+ $table->id();
1197
+ $table->string('email')->unique();
1198
+ $table->string('password');
1199
+ $table->boolean('is_staff')->default(false);
1200
+ $table->rememberToken();
1201
+ $table->timestamps();
1202
+ });
1203
+ }
1204
+
1205
+ public function down(): void
1206
+ {
1207
+ Schema::dropIfExists('users');
1208
+ }
1209
+ };
1210
+
1211
+ ```
1212
+
1213
+ ---
1214
+
1215
+ ## database/seeders/DatabaseSeeder.php
1216
+
1217
+ ```php
1218
+ <?php
1219
+
1220
+ namespace Database\Seeders;
1221
+
1222
+ use App\Models\User;
1223
+ use Illuminate\Database\Seeder;
1224
+
1225
+ class DatabaseSeeder extends Seeder
1226
+ {
1227
+ public function run(): void
1228
+ {
1229
+ User::firstOrCreate(
1230
+ ['email' => 'admin@example.com'],
1231
+ [
1232
+ 'password' => bcrypt('admin'),
1233
+ 'is_staff' => true,
1234
+ ]
1235
+ );
1236
+ }
1237
+ }
1238
+
1239
+ ```
1240
+
1241
+ ---
1242
+
1243
+ ## public/index.php
1244
+
1245
+ ```php
1246
+ <?php
1247
+
1248
+ use Illuminate\Http\Request;
1249
+
1250
+ define('LARAVEL_START', microtime(true));
1251
+
1252
+ // Suppress PHP 8.5 deprecation warnings for development
1253
+ error_reporting(E_ALL & ~E_DEPRECATED);
1254
+
1255
+ // Determine if the application is in maintenance mode...
1256
+ if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
1257
+ require $maintenance;
1258
+ }
1259
+
1260
+ // Register the Composer autoloader...
1261
+ require __DIR__.'/../vendor/autoload.php';
1262
+
1263
+ // Bootstrap Laravel and handle the request...
1264
+ (require_once __DIR__.'/../bootstrap/app.php')
1265
+ ->handleRequest(Request::capture());
1266
+
1267
+ ```
1268
+
1269
+ ---
1270
+
1271
+ ## resources/views/components/layouts/app.blade.php
1272
+
1273
+ ```php
1274
+ <!DOCTYPE html>
1275
+ <html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
1276
+ <head>
1277
+ <meta charset="utf-8">
1278
+ <meta name="viewport" content="width=device-width, initial-scale=1">
1279
+ <meta name="csrf-token" content="{{ csrf_token() }}">
1280
+
1281
+ <title>{{ $title ?? 'Amplitude Laravel Example' }}</title>
1282
+
1283
+ <style>
1284
+ * {
1285
+ box-sizing: border-box;
1286
+ margin: 0;
1287
+ padding: 0;
1288
+ }
1289
+ body {
1290
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
1291
+ line-height: 1.6;
1292
+ background-color: #f5f5f5;
1293
+ color: #333;
1294
+ }
1295
+ .container {
1296
+ max-width: 800px;
1297
+ margin: 0 auto;
1298
+ padding: 20px;
1299
+ }
1300
+ nav {
1301
+ background: #1d4ed8;
1302
+ padding: 15px 20px;
1303
+ margin-bottom: 30px;
1304
+ }
1305
+ nav a {
1306
+ color: white;
1307
+ text-decoration: none;
1308
+ margin-right: 20px;
1309
+ }
1310
+ nav a:hover {
1311
+ text-decoration: underline;
1312
+ }
1313
+ .nav-right {
1314
+ float: right;
1315
+ }
1316
+ .card {
1317
+ background: white;
1318
+ border-radius: 8px;
1319
+ padding: 20px;
1320
+ margin-bottom: 20px;
1321
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
1322
+ }
1323
+ h1, h2, h3 {
1324
+ margin-bottom: 15px;
1325
+ color: #1d4ed8;
1326
+ }
1327
+ button, .btn {
1328
+ background: #1d4ed8;
1329
+ color: white;
1330
+ border: none;
1331
+ padding: 10px 20px;
1332
+ border-radius: 5px;
1333
+ cursor: pointer;
1334
+ font-size: 14px;
1335
+ display: inline-block;
1336
+ text-decoration: none;
1337
+ }
1338
+ button:hover, .btn:hover {
1339
+ background: #1e40af;
1340
+ }
1341
+ button:disabled {
1342
+ opacity: 0.5;
1343
+ cursor: not-allowed;
1344
+ }
1345
+ button.danger, .btn-danger {
1346
+ background: #dc2626;
1347
+ }
1348
+ button.danger:hover, .btn-danger:hover {
1349
+ background: #b91c1c;
1350
+ }
1351
+ input {
1352
+ width: 100%;
1353
+ padding: 10px;
1354
+ margin-bottom: 15px;
1355
+ border: 1px solid #ddd;
1356
+ border-radius: 5px;
1357
+ font-size: 14px;
1358
+ }
1359
+ .message-error {
1360
+ background: #fee2e2;
1361
+ color: #dc2626;
1362
+ padding: 10px 15px;
1363
+ border-radius: 5px;
1364
+ margin-bottom: 15px;
1365
+ }
1366
+ .message-success {
1367
+ background: #d1fae5;
1368
+ color: #059669;
1369
+ padding: 10px 15px;
1370
+ border-radius: 5px;
1371
+ margin-bottom: 15px;
1372
+ }
1373
+ .feature-flag {
1374
+ background: #fef3c7;
1375
+ border: 2px dashed #f59e0b;
1376
+ padding: 15px;
1377
+ border-radius: 8px;
1378
+ margin: 20px 0;
1379
+ }
1380
+ code {
1381
+ background: #f3f4f6;
1382
+ padding: 2px 6px;
1383
+ border-radius: 3px;
1384
+ font-family: monospace;
1385
+ }
1386
+ pre {
1387
+ background: #1e293b;
1388
+ color: #e2e8f0;
1389
+ padding: 16px;
1390
+ border-radius: 8px;
1391
+ overflow-x: auto;
1392
+ font-size: 13px;
1393
+ }
1394
+ .count {
1395
+ font-size: 48px;
1396
+ font-weight: bold;
1397
+ color: #1d4ed8;
1398
+ text-align: center;
1399
+ padding: 20px;
1400
+ }
1401
+ table {
1402
+ width: 100%;
1403
+ border-collapse: collapse;
1404
+ margin: 16px 0;
1405
+ }
1406
+ th, td {
1407
+ padding: 12px;
1408
+ text-align: left;
1409
+ border-bottom: 1px solid #eee;
1410
+ }
1411
+ th {
1412
+ background: #f8fafc;
1413
+ font-weight: 600;
1414
+ }
1415
+ label {
1416
+ display: block;
1417
+ margin-bottom: 5px;
1418
+ font-weight: 500;
1419
+ }
1420
+ .text-sm {
1421
+ font-size: 14px;
1422
+ }
1423
+ .text-gray {
1424
+ color: #666;
1425
+ }
1426
+ .mb-4 {
1427
+ margin-bottom: 16px;
1428
+ }
1429
+ </style>
1430
+ @livewireStyles
1431
+ </head>
1432
+ <body>
1433
+ @auth
1434
+ <nav>
1435
+ <a href="{{ route('dashboard') }}">Dashboard</a>
1436
+ <a href="{{ route('burrito') }}">Burrito</a>
1437
+ <a href="{{ route('profile') }}">Profile</a>
1438
+ <span class="nav-right">
1439
+ <span style="margin-right: 15px;">{{ auth()->user()->email }}</span>
1440
+ <form method="POST" action="{{ route('logout') }}" style="display: inline;">
1441
+ @csrf
1442
+ <button type="submit" style="background: none; padding: 0; color: white; text-decoration: underline;">Logout</button>
1443
+ </form>
1444
+ </span>
1445
+ </nav>
1446
+ @endauth
1447
+
1448
+ <div class="container">
1449
+ @if (session('success'))
1450
+ <div class="message-success">
1451
+ {{ session('success') }}
1452
+ </div>
1453
+ @endif
1454
+
1455
+ @if (session('error'))
1456
+ <div class="message-error">
1457
+ {{ session('error') }}
1458
+ </div>
1459
+ @endif
1460
+
1461
+ {{ $slot }}
1462
+ </div>
1463
+
1464
+ @livewireScripts
1465
+ </body>
1466
+ </html>
1467
+
1468
+ ```
1469
+
1470
+ ---
1471
+
1472
+ ## resources/views/components/layouts/guest.blade.php
1473
+
1474
+ ```php
1475
+ <!DOCTYPE html>
1476
+ <html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
1477
+ <head>
1478
+ <meta charset="utf-8">
1479
+ <meta name="viewport" content="width=device-width, initial-scale=1">
1480
+ <meta name="csrf-token" content="{{ csrf_token() }}">
1481
+
1482
+ <title>{{ $title ?? 'Amplitude Laravel Example' }}</title>
1483
+
1484
+ <style>
1485
+ * {
1486
+ box-sizing: border-box;
1487
+ margin: 0;
1488
+ padding: 0;
1489
+ }
1490
+ body {
1491
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
1492
+ line-height: 1.6;
1493
+ background-color: #f5f5f5;
1494
+ color: #333;
1495
+ }
1496
+ .container {
1497
+ max-width: 800px;
1498
+ margin: 0 auto;
1499
+ padding: 20px;
1500
+ }
1501
+ .card {
1502
+ background: white;
1503
+ border-radius: 8px;
1504
+ padding: 20px;
1505
+ margin-bottom: 20px;
1506
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
1507
+ }
1508
+ h1, h2, h3 {
1509
+ margin-bottom: 15px;
1510
+ color: #1d4ed8;
1511
+ }
1512
+ button, .btn {
1513
+ background: #1d4ed8;
1514
+ color: white;
1515
+ border: none;
1516
+ padding: 10px 20px;
1517
+ border-radius: 5px;
1518
+ cursor: pointer;
1519
+ font-size: 14px;
1520
+ display: inline-block;
1521
+ text-decoration: none;
1522
+ width: 100%;
1523
+ }
1524
+ button:hover, .btn:hover {
1525
+ background: #1e40af;
1526
+ }
1527
+ input {
1528
+ width: 100%;
1529
+ padding: 10px;
1530
+ margin-bottom: 15px;
1531
+ border: 1px solid #ddd;
1532
+ border-radius: 5px;
1533
+ font-size: 14px;
1534
+ }
1535
+ label {
1536
+ display: block;
1537
+ margin-bottom: 5px;
1538
+ font-weight: 500;
1539
+ }
1540
+ .error {
1541
+ color: #dc2626;
1542
+ font-size: 13px;
1543
+ margin-top: -10px;
1544
+ margin-bottom: 10px;
1545
+ }
1546
+ .text-sm {
1547
+ font-size: 14px;
1548
+ }
1549
+ .text-gray {
1550
+ color: #666;
1551
+ }
1552
+ a {
1553
+ color: #1d4ed8;
1554
+ }
1555
+ code {
1556
+ background: #f3f4f6;
1557
+ padding: 2px 6px;
1558
+ border-radius: 3px;
1559
+ font-family: monospace;
1560
+ font-size: 13px;
1561
+ }
1562
+ pre {
1563
+ background: #1e293b;
1564
+ color: #e2e8f0;
1565
+ padding: 16px;
1566
+ border-radius: 8px;
1567
+ overflow-x: auto;
1568
+ font-size: 13px;
1569
+ margin-top: 10px;
1570
+ }
1571
+ ul {
1572
+ margin-left: 20px;
1573
+ }
1574
+ </style>
1575
+ @livewireStyles
1576
+ </head>
1577
+ <body>
1578
+ <div class="container">
1579
+ {{ $slot }}
1580
+ </div>
1581
+
1582
+ @livewireScripts
1583
+ </body>
1584
+ </html>
1585
+
1586
+ ```
1587
+
1588
+ ---
1589
+
1590
+ ## resources/views/errors/404.blade.php
1591
+
1592
+ ```php
1593
+ <!DOCTYPE html>
1594
+ <html lang="en">
1595
+ <head>
1596
+ <meta charset="UTF-8">
1597
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
1598
+ <title>Page Not Found - Amplitude Laravel Example</title>
1599
+ <style>
1600
+ * {
1601
+ box-sizing: border-box;
1602
+ margin: 0;
1603
+ padding: 0;
1604
+ }
1605
+ body {
1606
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
1607
+ line-height: 1.6;
1608
+ background-color: #f5f5f5;
1609
+ color: #333;
1610
+ }
1611
+ .container {
1612
+ max-width: 800px;
1613
+ margin: 0 auto;
1614
+ padding: 20px;
1615
+ }
1616
+ .card {
1617
+ background: white;
1618
+ border-radius: 8px;
1619
+ padding: 40px;
1620
+ margin-top: 50px;
1621
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
1622
+ text-align: center;
1623
+ }
1624
+ h1 {
1625
+ font-size: 72px;
1626
+ color: #1d4ed8;
1627
+ margin-bottom: 15px;
1628
+ }
1629
+ h2 {
1630
+ font-size: 24px;
1631
+ color: #333;
1632
+ margin-bottom: 15px;
1633
+ }
1634
+ p {
1635
+ color: #666;
1636
+ margin-bottom: 25px;
1637
+ }
1638
+ .btn {
1639
+ background: #1d4ed8;
1640
+ color: white;
1641
+ border: none;
1642
+ padding: 12px 24px;
1643
+ border-radius: 5px;
1644
+ cursor: pointer;
1645
+ font-size: 14px;
1646
+ text-decoration: none;
1647
+ display: inline-block;
1648
+ }
1649
+ .btn:hover {
1650
+ background: #1e40af;
1651
+ }
1652
+ </style>
1653
+ </head>
1654
+ <body>
1655
+ <div class="container">
1656
+ <div class="card">
1657
+ <h1>404</h1>
1658
+ <h2>Page Not Found</h2>
1659
+ <p>The page you're looking for doesn't exist.</p>
1660
+ <a href="/" class="btn">Go Home</a>
1661
+ </div>
1662
+ </div>
1663
+ </body>
1664
+ </html>
1665
+
1666
+ ```
1667
+
1668
+ ---
1669
+
1670
+ ## resources/views/errors/500.blade.php
1671
+
1672
+ ```php
1673
+ <!DOCTYPE html>
1674
+ <html lang="en">
1675
+ <head>
1676
+ <meta charset="UTF-8">
1677
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
1678
+ <title>Server Error - Amplitude Laravel Example</title>
1679
+ <style>
1680
+ * {
1681
+ box-sizing: border-box;
1682
+ margin: 0;
1683
+ padding: 0;
1684
+ }
1685
+ body {
1686
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
1687
+ line-height: 1.6;
1688
+ background-color: #f5f5f5;
1689
+ color: #333;
1690
+ }
1691
+ .container {
1692
+ max-width: 800px;
1693
+ margin: 0 auto;
1694
+ padding: 20px;
1695
+ }
1696
+ .card {
1697
+ background: white;
1698
+ border-radius: 8px;
1699
+ padding: 40px;
1700
+ margin-top: 50px;
1701
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
1702
+ text-align: center;
1703
+ }
1704
+ h1 {
1705
+ font-size: 72px;
1706
+ color: #dc2626;
1707
+ margin-bottom: 15px;
1708
+ }
1709
+ h2 {
1710
+ font-size: 24px;
1711
+ color: #333;
1712
+ margin-bottom: 15px;
1713
+ }
1714
+ p {
1715
+ color: #666;
1716
+ margin-bottom: 25px;
1717
+ }
1718
+ .btn {
1719
+ background: #1d4ed8;
1720
+ color: white;
1721
+ border: none;
1722
+ padding: 12px 24px;
1723
+ border-radius: 5px;
1724
+ cursor: pointer;
1725
+ font-size: 14px;
1726
+ text-decoration: none;
1727
+ display: inline-block;
1728
+ }
1729
+ .btn:hover {
1730
+ background: #1e40af;
1731
+ }
1732
+ </style>
1733
+ </head>
1734
+ <body>
1735
+ <div class="container">
1736
+ <div class="card">
1737
+ <h1>500</h1>
1738
+ <h2>Internal Server Error</h2>
1739
+ <p>Something went wrong on our end.</p>
1740
+ <a href="/" class="btn">Go Home</a>
1741
+ </div>
1742
+ </div>
1743
+ </body>
1744
+ </html>
1745
+
1746
+ ```
1747
+
1748
+ ---
1749
+
1750
+ ## resources/views/livewire/auth/login.blade.php
1751
+
1752
+ ```php
1753
+ <div>
1754
+ <div class="card">
1755
+ <h1>Welcome to Amplitude Laravel Example</h1>
1756
+ <p class="text-gray mb-4">This example demonstrates how to integrate Amplitude with a Laravel application.</p>
1757
+
1758
+ <form wire:submit="login">
1759
+ <label for="email">Email</label>
1760
+ <input
1761
+ type="email"
1762
+ id="email"
1763
+ wire:model="email"
1764
+ required
1765
+ >
1766
+ @error('email') <div class="error">{{ $message }}</div> @enderror
1767
+
1768
+ <label for="password">Password</label>
1769
+ <input
1770
+ type="password"
1771
+ id="password"
1772
+ wire:model="password"
1773
+ required
1774
+ >
1775
+ @error('password') <div class="error">{{ $message }}</div> @enderror
1776
+
1777
+ <div style="margin-bottom: 15px;">
1778
+ <label style="display: inline; font-weight: normal;">
1779
+ <input type="checkbox" wire:model="remember" style="width: auto; margin-right: 5px;">
1780
+ Remember me
1781
+ </label>
1782
+ </div>
1783
+
1784
+ <button type="submit">Login</button>
1785
+ </form>
1786
+
1787
+ <p style="margin-top: 16px;" class="text-sm text-gray">
1788
+ Don't have an account? <a href="{{ route('register') }}">Sign up here</a>
1789
+ </p>
1790
+ <p class="text-sm text-gray">
1791
+ <strong>Tip:</strong> Default credentials are admin@example.com/admin
1792
+ </p>
1793
+ </div>
1794
+
1795
+ <div class="card">
1796
+ <h2>Features Demonstrated</h2>
1797
+ <ul class="text-gray">
1798
+ <li>User registration and identification</li>
1799
+ <li>Event tracking</li>
1800
+ <li>User properties</li>
1801
+ </ul>
1802
+ </div>
1803
+ </div>
1804
+
1805
+ ```
1806
+
1807
+ ---
1808
+
1809
+ ## resources/views/livewire/auth/register.blade.php
1810
+
1811
+ ```php
1812
+ <div>
1813
+ <div class="card">
1814
+ <h1>Create an Account</h1>
1815
+ <p class="text-gray mb-4">Sign up to explore the Amplitude Laravel integration example.</p>
1816
+
1817
+ <form wire:submit="register">
1818
+ <label for="email">Email *</label>
1819
+ <input
1820
+ type="email"
1821
+ id="email"
1822
+ wire:model="email"
1823
+ required
1824
+ >
1825
+ @error('email') <div class="error">{{ $message }}</div> @enderror
1826
+
1827
+ <label for="password">Password *</label>
1828
+ <input
1829
+ type="password"
1830
+ id="password"
1831
+ wire:model="password"
1832
+ required
1833
+ >
1834
+ @error('password') <div class="error">{{ $message }}</div> @enderror
1835
+
1836
+ <label for="password_confirmation">Confirm Password *</label>
1837
+ <input
1838
+ type="password"
1839
+ id="password_confirmation"
1840
+ wire:model="password_confirmation"
1841
+ required
1842
+ >
1843
+
1844
+ <button type="submit">Sign Up</button>
1845
+ </form>
1846
+
1847
+ <p style="margin-top: 16px;" class="text-sm text-gray">
1848
+ Already have an account? <a href="{{ route('login') }}">Login here</a>
1849
+ </p>
1850
+ </div>
1851
+
1852
+ <div class="card">
1853
+ <h2>Amplitude Integration</h2>
1854
+ <p class="text-gray">When you sign up, the following Amplitude events are captured:</p>
1855
+ <ul class="text-gray" style="margin-top: 10px;">
1856
+ <li><code>identify()</code> - Associates your email with the user and sets properties</li>
1857
+ <li><code>User Signed Up</code> event - Tracks the signup action</li>
1858
+ </ul>
1859
+
1860
+ <h3 style="margin-top: 20px;">Code Example</h3>
1861
+ <pre>// After creating the user
1862
+ $amplitude->identify($user->email, $user->getAmplitudeProperties());
1863
+ $amplitude->capture($user->email, 'User Signed Up', [
1864
+ 'signup_method' => 'form'
1865
+ ]);</pre>
1866
+ </div>
1867
+ </div>
1868
+
1869
+ ```
1870
+
1871
+ ---
1872
+
1873
+ ## resources/views/livewire/burrito-tracker.blade.php
1874
+
1875
+ ```php
1876
+ <div>
1877
+ <div class="card">
1878
+ <h1>Burrito Consideration Tracker</h1>
1879
+ <p class="text-gray mb-4">This page demonstrates custom event tracking with Amplitude.</p>
1880
+
1881
+ <div class="count">{{ $burritoCount }}</div>
1882
+ <p style="text-align: center; color: #666; margin-bottom: 20px;">Times you've considered a burrito</p>
1883
+
1884
+ <div style="text-align: center;">
1885
+ <button
1886
+ wire:click="considerBurrito"
1887
+ wire:loading.attr="disabled"
1888
+ >
1889
+ <span wire:loading.remove>Consider a Burrito</span>
1890
+ <span wire:loading>Considering...</span>
1891
+ </button>
1892
+ </div>
1893
+ </div>
1894
+
1895
+ <div class="card">
1896
+ <h3>Code Example</h3>
1897
+ <pre>// Livewire component method
1898
+ public function considerBurrito(AmplitudeService $amplitude)
1899
+ {
1900
+ $this->burritoCount++;
1901
+ session(['burrito_count' => $this->burritoCount]);
1902
+
1903
+ $user = Auth::user();
1904
+ $amplitude->identify($user->email, $user->getAmplitudeProperties());
1905
+ $amplitude->capture($user->email, 'Burrito Considered', [
1906
+ 'total_considerations' => $this->burritoCount,
1907
+ ]);
1908
+ }</pre>
1909
+ </div>
1910
+ </div>
1911
+
1912
+ ```
1913
+
1914
+ ---
1915
+
1916
+ ## resources/views/livewire/dashboard.blade.php
1917
+
1918
+ ```php
1919
+ <div>
1920
+ <div class="card">
1921
+ <h1>Dashboard</h1>
1922
+ <p class="text-gray">Welcome back, {{ auth()->user()->email }}!</p>
1923
+ </div>
1924
+
1925
+ <div class="card">
1926
+ <h2>Amplitude Event Tracking</h2>
1927
+ <p class="text-gray">This page is tracked with Amplitude on every visit.</p>
1928
+
1929
+ <h3 style="margin-top: 20px;">Code Example</h3>
1930
+ <pre>// Track dashboard view
1931
+ $amplitude->capture($user->email, 'Dashboard Viewed', [
1932
+ 'is_staff' => $user->is_staff,
1933
+ ]);
1934
+
1935
+ // TODO: Use Amplitude Experiment for feature flags</pre>
1936
+ </div>
1937
+ </div>
1938
+
1939
+ ```
1940
+
1941
+ ---
1942
+
1943
+ ## resources/views/livewire/profile.blade.php
1944
+
1945
+ ```php
1946
+ <div>
1947
+ <div class="card">
1948
+ <h1>Your Profile</h1>
1949
+ <p class="text-gray mb-4">This page demonstrates event tracking with Amplitude.</p>
1950
+
1951
+ <table>
1952
+ <tr>
1953
+ <th>Email</th>
1954
+ <td>{{ auth()->user()->email }}</td>
1955
+ </tr>
1956
+ <tr>
1957
+ <th>Date Joined</th>
1958
+ <td>{{ auth()->user()->created_at->format('Y-m-d H:i') }}</td>
1959
+ </tr>
1960
+ <tr>
1961
+ <th>Staff Status</th>
1962
+ <td>{{ auth()->user()->is_staff ? 'Yes' : 'No' }}</td>
1963
+ </tr>
1964
+ </table>
1965
+ </div>
1966
+
1967
+ <div class="card">
1968
+ <h3>Code Example</h3>
1969
+ <pre>// Track profile view
1970
+ $amplitude->capture($user->email, 'Profile Viewed');</pre>
1971
+ </div>
1972
+ </div>
1973
+
1974
+ ```
1975
+
1976
+ ---
1977
+
1978
+ ## routes/api.php
1979
+
1980
+ ```php
1981
+ <?php
1982
+
1983
+ use App\Http\Controllers\Api\BurritoController;
1984
+ use App\Http\Controllers\Api\ErrorTestController;
1985
+ use Illuminate\Support\Facades\Route;
1986
+
1987
+ Route::middleware('auth:sanctum')->group(function () {
1988
+ Route::post('/burrito/consider', [BurritoController::class, 'consider']);
1989
+ Route::post('/test-error', [ErrorTestController::class, 'test']);
1990
+ });
1991
+
1992
+ ```
1993
+
1994
+ ---
1995
+
1996
+ ## routes/web.php
1997
+
1998
+ ```php
1999
+ <?php
2000
+
2001
+ use App\Http\Livewire\Auth\Login;
2002
+ use App\Http\Livewire\Auth\Register;
2003
+ use App\Http\Livewire\BurritoTracker;
2004
+ use App\Http\Livewire\Dashboard;
2005
+ use App\Http\Livewire\Profile;
2006
+ use App\Services\AmplitudeService;
2007
+ use Illuminate\Support\Facades\Auth;
2008
+ use Illuminate\Support\Facades\Route;
2009
+
2010
+ // Guest routes
2011
+ Route::middleware('guest')->group(function () {
2012
+ Route::get('/', Login::class)->name('login');
2013
+ Route::get('/register', Register::class)->name('register');
2014
+ });
2015
+
2016
+ // Authenticated routes
2017
+ Route::middleware('auth')->group(function () {
2018
+ Route::get('/dashboard', Dashboard::class)->name('dashboard');
2019
+ Route::get('/burrito', BurritoTracker::class)->name('burrito');
2020
+ Route::get('/profile', Profile::class)->name('profile');
2021
+
2022
+ Route::post('/logout', function (AmplitudeService $amplitude) {
2023
+ $user = Auth::user();
2024
+
2025
+ // Amplitude: Track logout
2026
+ $amplitude->capture($user->email, 'User Logged Out');
2027
+
2028
+ Auth::logout();
2029
+ request()->session()->invalidate();
2030
+ request()->session()->regenerateToken();
2031
+
2032
+ return redirect('/');
2033
+ })->name('logout');
2034
+ });
2035
+
2036
+ ```
2037
+
2038
+ ---
2039
+