workos 0.0.24 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. package/.claude-plugin/plugin.json +13 -0
  2. package/LICENSE +47 -0
  3. package/README.md +154 -1
  4. package/dist/bin.d.ts +2 -0
  5. package/dist/bin.js +163 -0
  6. package/dist/bin.js.map +1 -0
  7. package/dist/cli.config.d.ts +52 -0
  8. package/dist/cli.config.js +70 -0
  9. package/dist/cli.config.js.map +1 -0
  10. package/dist/package.json +87 -0
  11. package/dist/src/commands/install-skill.d.ts +20 -0
  12. package/dist/src/commands/install-skill.js +130 -0
  13. package/dist/src/commands/install-skill.js.map +1 -0
  14. package/dist/src/commands/install.d.ts +22 -0
  15. package/dist/src/commands/install.js +57 -0
  16. package/dist/src/commands/install.js.map +1 -0
  17. package/dist/src/commands/login.d.ts +1 -0
  18. package/dist/src/commands/login.js +141 -0
  19. package/dist/src/commands/login.js.map +1 -0
  20. package/dist/src/commands/logout.d.ts +1 -0
  21. package/dist/src/commands/logout.js +17 -0
  22. package/dist/src/commands/logout.js.map +1 -0
  23. package/dist/src/dashboard/components/AnimatedLogo.d.ts +8 -0
  24. package/dist/src/dashboard/components/AnimatedLogo.js +16 -0
  25. package/dist/src/dashboard/components/AnimatedLogo.js.map +1 -0
  26. package/dist/src/dashboard/components/CompletionView.d.ts +13 -0
  27. package/dist/src/dashboard/components/CompletionView.js +21 -0
  28. package/dist/src/dashboard/components/CompletionView.js.map +1 -0
  29. package/dist/src/dashboard/components/ConfirmPrompt.d.ts +9 -0
  30. package/dist/src/dashboard/components/ConfirmPrompt.js +25 -0
  31. package/dist/src/dashboard/components/ConfirmPrompt.js.map +1 -0
  32. package/dist/src/dashboard/components/CredentialsForm.d.ts +10 -0
  33. package/dist/src/dashboard/components/CredentialsForm.js +47 -0
  34. package/dist/src/dashboard/components/CredentialsForm.js.map +1 -0
  35. package/dist/src/dashboard/components/Dashboard.d.ts +3 -0
  36. package/dist/src/dashboard/components/Dashboard.js +100 -0
  37. package/dist/src/dashboard/components/Dashboard.js.map +1 -0
  38. package/dist/src/dashboard/components/DashboardLayout.d.ts +24 -0
  39. package/dist/src/dashboard/components/DashboardLayout.js +25 -0
  40. package/dist/src/dashboard/components/DashboardLayout.js.map +1 -0
  41. package/dist/src/dashboard/components/DiffPanel.d.ts +9 -0
  42. package/dist/src/dashboard/components/DiffPanel.js +136 -0
  43. package/dist/src/dashboard/components/DiffPanel.js.map +1 -0
  44. package/dist/src/dashboard/components/InlinePrompt.d.ts +8 -0
  45. package/dist/src/dashboard/components/InlinePrompt.js +19 -0
  46. package/dist/src/dashboard/components/InlinePrompt.js.map +1 -0
  47. package/dist/src/dashboard/components/OutputPanel.d.ts +10 -0
  48. package/dist/src/dashboard/components/OutputPanel.js +100 -0
  49. package/dist/src/dashboard/components/OutputPanel.js.map +1 -0
  50. package/dist/src/dashboard/components/Panel.d.ts +12 -0
  51. package/dist/src/dashboard/components/Panel.js +6 -0
  52. package/dist/src/dashboard/components/Panel.js.map +1 -0
  53. package/dist/src/dashboard/components/TextInput.d.ts +13 -0
  54. package/dist/src/dashboard/components/TextInput.js +57 -0
  55. package/dist/src/dashboard/components/TextInput.js.map +1 -0
  56. package/dist/src/dashboard/components/WelcomeArt.d.ts +2 -0
  57. package/dist/src/dashboard/components/WelcomeArt.js +9 -0
  58. package/dist/src/dashboard/components/WelcomeArt.js.map +1 -0
  59. package/dist/src/dashboard/hooks/useAnimation.d.ts +7 -0
  60. package/dist/src/dashboard/hooks/useAnimation.js +24 -0
  61. package/dist/src/dashboard/hooks/useAnimation.js.map +1 -0
  62. package/dist/src/dashboard/hooks/useKeyboard.d.ts +8 -0
  63. package/dist/src/dashboard/hooks/useKeyboard.js +18 -0
  64. package/dist/src/dashboard/hooks/useKeyboard.js.map +1 -0
  65. package/dist/src/dashboard/hooks/useTerminalSize.d.ts +8 -0
  66. package/dist/src/dashboard/hooks/useTerminalSize.js +23 -0
  67. package/dist/src/dashboard/hooks/useTerminalSize.js.map +1 -0
  68. package/dist/src/dashboard/index.d.ts +6 -0
  69. package/dist/src/dashboard/index.js +36 -0
  70. package/dist/src/dashboard/index.js.map +1 -0
  71. package/dist/src/dashboard/lib/diff-utils.d.ts +21 -0
  72. package/dist/src/dashboard/lib/diff-utils.js +271 -0
  73. package/dist/src/dashboard/lib/diff-utils.js.map +1 -0
  74. package/dist/src/dashboard/lib/logo-frames.d.ts +20 -0
  75. package/dist/src/dashboard/lib/logo-frames.js +109 -0
  76. package/dist/src/dashboard/lib/logo-frames.js.map +1 -0
  77. package/dist/src/dashboard/lib/welcome-art.d.ts +1 -0
  78. package/dist/src/dashboard/lib/welcome-art.js +5 -0
  79. package/dist/src/dashboard/lib/welcome-art.js.map +1 -0
  80. package/dist/src/dashboard/types.d.ts +5 -0
  81. package/dist/src/dashboard/types.js +2 -0
  82. package/dist/src/dashboard/types.js.map +1 -0
  83. package/dist/src/lib/__tests__/test-utils.d.ts +40 -0
  84. package/dist/src/lib/__tests__/test-utils.js +108 -0
  85. package/dist/src/lib/__tests__/test-utils.js.map +1 -0
  86. package/dist/src/lib/adapters/cli-adapter.d.ts +56 -0
  87. package/dist/src/lib/adapters/cli-adapter.js +318 -0
  88. package/dist/src/lib/adapters/cli-adapter.js.map +1 -0
  89. package/dist/src/lib/adapters/dashboard-adapter.d.ts +30 -0
  90. package/dist/src/lib/adapters/dashboard-adapter.js +97 -0
  91. package/dist/src/lib/adapters/dashboard-adapter.js.map +1 -0
  92. package/dist/src/lib/adapters/index.d.ts +3 -0
  93. package/dist/src/lib/adapters/index.js +3 -0
  94. package/dist/src/lib/adapters/index.js.map +1 -0
  95. package/dist/src/lib/adapters/types.d.ts +41 -0
  96. package/dist/src/lib/adapters/types.js +2 -0
  97. package/dist/src/lib/adapters/types.js.map +1 -0
  98. package/dist/src/lib/agent-interface.d.ts +75 -0
  99. package/dist/src/lib/agent-interface.js +563 -0
  100. package/dist/src/lib/agent-interface.js.map +1 -0
  101. package/dist/src/lib/agent-runner.d.ts +9 -0
  102. package/dist/src/lib/agent-runner.js +213 -0
  103. package/dist/src/lib/agent-runner.js.map +1 -0
  104. package/dist/src/lib/api.d.ts +25 -0
  105. package/dist/src/lib/api.js +120 -0
  106. package/dist/src/lib/api.js.map +1 -0
  107. package/dist/src/lib/config.d.ts +60 -0
  108. package/dist/src/lib/config.js +88 -0
  109. package/dist/src/lib/config.js.map +1 -0
  110. package/dist/src/lib/constants.d.ts +32 -0
  111. package/dist/src/lib/constants.js +53 -0
  112. package/dist/src/lib/constants.js.map +1 -0
  113. package/dist/src/lib/credentials.d.ts +19 -0
  114. package/dist/src/lib/credentials.js +55 -0
  115. package/dist/src/lib/credentials.js.map +1 -0
  116. package/dist/src/lib/env-writer.d.ts +14 -0
  117. package/dist/src/lib/env-writer.js +39 -0
  118. package/dist/src/lib/env-writer.js.map +1 -0
  119. package/dist/src/lib/events.d.ts +114 -0
  120. package/dist/src/lib/events.js +19 -0
  121. package/dist/src/lib/events.js.map +1 -0
  122. package/dist/src/lib/framework-config.d.ts +108 -0
  123. package/dist/src/lib/framework-config.js +11 -0
  124. package/dist/src/lib/framework-config.js.map +1 -0
  125. package/dist/src/lib/helper-functions.d.ts +1 -0
  126. package/dist/src/lib/helper-functions.js +2 -0
  127. package/dist/src/lib/helper-functions.js.map +1 -0
  128. package/dist/src/lib/port-detection.d.ts +7 -0
  129. package/dist/src/lib/port-detection.js +112 -0
  130. package/dist/src/lib/port-detection.js.map +1 -0
  131. package/dist/src/lib/progress-tracker.d.ts +22 -0
  132. package/dist/src/lib/progress-tracker.js +47 -0
  133. package/dist/src/lib/progress-tracker.js.map +1 -0
  134. package/dist/src/lib/run-with-core.d.ts +2 -0
  135. package/dist/src/lib/run-with-core.js +266 -0
  136. package/dist/src/lib/run-with-core.js.map +1 -0
  137. package/dist/src/lib/safe-tools.d.ts +2 -0
  138. package/dist/src/lib/safe-tools.js +212 -0
  139. package/dist/src/lib/safe-tools.js.map +1 -0
  140. package/dist/src/lib/settings.d.ts +59 -0
  141. package/dist/src/lib/settings.js +36 -0
  142. package/dist/src/lib/settings.js.map +1 -0
  143. package/dist/src/lib/token-refresh.d.ts +12 -0
  144. package/dist/src/lib/token-refresh.js +26 -0
  145. package/dist/src/lib/token-refresh.js.map +1 -0
  146. package/dist/src/lib/validation/build-validator.d.ts +9 -0
  147. package/dist/src/lib/validation/build-validator.js +118 -0
  148. package/dist/src/lib/validation/build-validator.js.map +1 -0
  149. package/dist/src/lib/validation/index.d.ts +3 -0
  150. package/dist/src/lib/validation/index.js +3 -0
  151. package/dist/src/lib/validation/index.js.map +1 -0
  152. package/dist/src/lib/validation/types.d.ts +41 -0
  153. package/dist/src/lib/validation/types.js +2 -0
  154. package/dist/src/lib/validation/types.js.map +1 -0
  155. package/dist/src/lib/validation/validator.d.ts +6 -0
  156. package/dist/src/lib/validation/validator.js +647 -0
  157. package/dist/src/lib/validation/validator.js.map +1 -0
  158. package/dist/src/lib/wizard-core.d.ts +200 -0
  159. package/dist/src/lib/wizard-core.js +392 -0
  160. package/dist/src/lib/wizard-core.js.map +1 -0
  161. package/dist/src/lib/wizard-core.types.d.ts +73 -0
  162. package/dist/src/lib/wizard-core.types.js +2 -0
  163. package/dist/src/lib/wizard-core.types.js.map +1 -0
  164. package/dist/src/lib/workos-management.d.ts +32 -0
  165. package/dist/src/lib/workos-management.js +142 -0
  166. package/dist/src/lib/workos-management.js.map +1 -0
  167. package/dist/src/nextjs/nextjs-wizard-agent.d.ts +6 -0
  168. package/dist/src/nextjs/nextjs-wizard-agent.js +97 -0
  169. package/dist/src/nextjs/nextjs-wizard-agent.js.map +1 -0
  170. package/dist/src/nextjs/utils.d.ts +8 -0
  171. package/dist/src/nextjs/utils.js +53 -0
  172. package/dist/src/nextjs/utils.js.map +1 -0
  173. package/dist/src/react/react-wizard-agent.d.ts +2 -0
  174. package/dist/src/react/react-wizard-agent.js +47 -0
  175. package/dist/src/react/react-wizard-agent.js.map +1 -0
  176. package/dist/src/react-router/react-router-wizard-agent.d.ts +6 -0
  177. package/dist/src/react-router/react-router-wizard-agent.js +103 -0
  178. package/dist/src/react-router/react-router-wizard-agent.js.map +1 -0
  179. package/dist/src/react-router/utils.d.ts +19 -0
  180. package/dist/src/react-router/utils.js +210 -0
  181. package/dist/src/react-router/utils.js.map +1 -0
  182. package/dist/src/run.d.ts +24 -0
  183. package/dist/src/run.js +48 -0
  184. package/dist/src/run.js.map +1 -0
  185. package/dist/src/steps/add-or-update-environment-variables.d.ts +10 -0
  186. package/dist/src/steps/add-or-update-environment-variables.js +155 -0
  187. package/dist/src/steps/add-or-update-environment-variables.js.map +1 -0
  188. package/dist/src/steps/index.d.ts +3 -0
  189. package/dist/src/steps/index.js +4 -0
  190. package/dist/src/steps/index.js.map +1 -0
  191. package/dist/src/steps/run-prettier.d.ts +5 -0
  192. package/dist/src/steps/run-prettier.js +54 -0
  193. package/dist/src/steps/run-prettier.js.map +1 -0
  194. package/dist/src/steps/upload-environment-variables/EnvironmentProvider.d.ts +8 -0
  195. package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js +7 -0
  196. package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js.map +1 -0
  197. package/dist/src/steps/upload-environment-variables/index.d.ts +6 -0
  198. package/dist/src/steps/upload-environment-variables/index.js +57 -0
  199. package/dist/src/steps/upload-environment-variables/index.js.map +1 -0
  200. package/dist/src/steps/upload-environment-variables/providers/vercel.d.ts +14 -0
  201. package/dist/src/steps/upload-environment-variables/providers/vercel.js +104 -0
  202. package/dist/src/steps/upload-environment-variables/providers/vercel.js.map +1 -0
  203. package/dist/src/tanstack-start/tanstack-start-wizard-agent.d.ts +2 -0
  204. package/dist/src/tanstack-start/tanstack-start-wizard-agent.js +49 -0
  205. package/dist/src/tanstack-start/tanstack-start-wizard-agent.js.map +1 -0
  206. package/dist/src/telemetry.d.ts +2 -0
  207. package/dist/src/telemetry.js +29 -0
  208. package/dist/src/telemetry.js.map +1 -0
  209. package/dist/src/utils/analytics.d.ts +24 -0
  210. package/dist/src/utils/analytics.js +139 -0
  211. package/dist/src/utils/analytics.js.map +1 -0
  212. package/dist/src/utils/bash.d.ts +2 -0
  213. package/dist/src/utils/bash.js +17 -0
  214. package/dist/src/utils/bash.js.map +1 -0
  215. package/dist/src/utils/clack-utils.d.ts +93 -0
  216. package/dist/src/utils/clack-utils.js +397 -0
  217. package/dist/src/utils/clack-utils.js.map +1 -0
  218. package/dist/src/utils/clack.d.ts +5 -0
  219. package/dist/src/utils/clack.js +34 -0
  220. package/dist/src/utils/clack.js.map +1 -0
  221. package/dist/src/utils/cli-symbols.d.ts +32 -0
  222. package/dist/src/utils/cli-symbols.js +46 -0
  223. package/dist/src/utils/cli-symbols.js.map +1 -0
  224. package/dist/src/utils/debug.d.ts +7 -0
  225. package/dist/src/utils/debug.js +88 -0
  226. package/dist/src/utils/debug.js.map +1 -0
  227. package/dist/src/utils/env-parser.d.ts +5 -0
  228. package/dist/src/utils/env-parser.js +18 -0
  229. package/dist/src/utils/env-parser.js.map +1 -0
  230. package/dist/src/utils/environment.d.ts +4 -0
  231. package/dist/src/utils/environment.js +69 -0
  232. package/dist/src/utils/environment.js.map +1 -0
  233. package/dist/src/utils/errors.d.ts +3 -0
  234. package/dist/src/utils/errors.js +7 -0
  235. package/dist/src/utils/errors.js.map +1 -0
  236. package/dist/src/utils/logging.d.ts +9 -0
  237. package/dist/src/utils/logging.js +36 -0
  238. package/dist/src/utils/logging.js.map +1 -0
  239. package/dist/src/utils/package-json.d.ts +25 -0
  240. package/dist/src/utils/package-json.js +21 -0
  241. package/dist/src/utils/package-json.js.map +1 -0
  242. package/dist/src/utils/package-manager.d.ts +21 -0
  243. package/dist/src/utils/package-manager.js +167 -0
  244. package/dist/src/utils/package-manager.js.map +1 -0
  245. package/dist/src/utils/redact.d.ts +5 -0
  246. package/dist/src/utils/redact.js +29 -0
  247. package/dist/src/utils/redact.js.map +1 -0
  248. package/dist/src/utils/semver.d.ts +10 -0
  249. package/dist/src/utils/semver.js +43 -0
  250. package/dist/src/utils/semver.js.map +1 -0
  251. package/dist/src/utils/string.d.ts +1 -0
  252. package/dist/src/utils/string.js +6 -0
  253. package/dist/src/utils/string.js.map +1 -0
  254. package/dist/src/utils/telemetry-client.d.ts +15 -0
  255. package/dist/src/utils/telemetry-client.js +57 -0
  256. package/dist/src/utils/telemetry-client.js.map +1 -0
  257. package/dist/src/utils/telemetry-types.d.ts +51 -0
  258. package/dist/src/utils/telemetry-types.js +6 -0
  259. package/dist/src/utils/telemetry-types.js.map +1 -0
  260. package/dist/src/utils/types.d.ts +80 -0
  261. package/dist/src/utils/types.js +2 -0
  262. package/dist/src/utils/types.js.map +1 -0
  263. package/dist/src/utils/urls.d.ts +7 -0
  264. package/dist/src/utils/urls.js +8 -0
  265. package/dist/src/utils/urls.js.map +1 -0
  266. package/dist/src/utils/vendor/is-unicorn-supported.d.ts +1 -0
  267. package/dist/src/utils/vendor/is-unicorn-supported.js +21 -0
  268. package/dist/src/utils/vendor/is-unicorn-supported.js.map +1 -0
  269. package/dist/src/vanilla-js/vanilla-js-wizard-agent.d.ts +2 -0
  270. package/dist/src/vanilla-js/vanilla-js-wizard-agent.js +47 -0
  271. package/dist/src/vanilla-js/vanilla-js-wizard-agent.js.map +1 -0
  272. package/package.json +76 -84
  273. package/skills/workos-authkit-base/SKILL.md +113 -0
  274. package/skills/workos-authkit-nextjs/SKILL.md +115 -0
  275. package/skills/workos-authkit-react/SKILL.md +91 -0
  276. package/skills/workos-authkit-react-router/SKILL.md +106 -0
  277. package/skills/workos-authkit-tanstack-start/SKILL.md +104 -0
  278. package/skills/workos-authkit-vanilla-js/SKILL.md +81 -0
  279. package/build/apps/index.js +0 -50
  280. package/build/apps/slack.js +0 -151
  281. package/build/cli.js +0 -42
  282. package/build/config.js +0 -34
  283. package/build/dev.js +0 -5
  284. package/build/enable-api-access.png +0 -0
  285. package/build/groups.js +0 -480
  286. package/build/index.js +0 -3
  287. package/build/info.js +0 -69
  288. package/build/login.js +0 -161
  289. package/build/main.js +0 -214
  290. package/build/users.js +0 -402
  291. package/build/util.js +0 -157
  292. package/coverage/clover.xml +0 -66
  293. package/coverage/coverage-final.json +0 -4
  294. package/coverage/lcov-report/base.css +0 -212
  295. package/coverage/lcov-report/cli.ts.html +0 -329
  296. package/coverage/lcov-report/config.ts.html +0 -152
  297. package/coverage/lcov-report/index.html +0 -119
  298. package/coverage/lcov-report/prettify.css +0 -1
  299. package/coverage/lcov-report/prettify.js +0 -1
  300. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  301. package/coverage/lcov-report/sorter.js +0 -158
  302. package/coverage/lcov-report/util.ts.html +0 -350
  303. package/coverage/lcov.info +0 -121
  304. package/package-lock.json +0 -7617
  305. package/tests/util.test.ts +0 -35
@@ -0,0 +1,142 @@
1
+ import { WIZARD_INTERACTION_EVENT_NAME } from './constants.js';
2
+ import { analytics } from '../utils/analytics.js';
3
+ import clack from '../utils/clack.js';
4
+ import { getCallbackPath } from './port-detection.js';
5
+ const WORKOS_API_BASE = 'https://api.workos.com';
6
+ async function workosRequest(method, endpoint, apiKey, body) {
7
+ return fetch(`${WORKOS_API_BASE}${endpoint}`, {
8
+ method,
9
+ headers: {
10
+ Authorization: `Bearer ${apiKey}`,
11
+ 'Content-Type': 'application/json',
12
+ },
13
+ body: JSON.stringify(body),
14
+ });
15
+ }
16
+ async function parseFetchError(response) {
17
+ let data;
18
+ try {
19
+ data = await response.json();
20
+ }
21
+ catch {
22
+ // Response wasn't JSON
23
+ }
24
+ return {
25
+ status: response.status,
26
+ message: typeof data === 'object' && data && 'message' in data ? String(data.message) : '',
27
+ data,
28
+ };
29
+ }
30
+ /**
31
+ * Create a redirect URI in WorkOS.
32
+ * Returns success on 201 or 409 (already exists).
33
+ */
34
+ async function createRedirectUri(apiKey, uri) {
35
+ const response = await workosRequest('POST', '/user_management/redirect_uris', apiKey, { uri });
36
+ if (response.ok) {
37
+ return { success: true, alreadyExists: false };
38
+ }
39
+ const error = await parseFetchError(response);
40
+ // WorkOS returns 422 (not 409) when URI already exists
41
+ if (error.status === 409 || (error.status === 422 && error.message.includes('already exists'))) {
42
+ return { success: true, alreadyExists: true };
43
+ }
44
+ throw new Error(error.message || `HTTP ${error.status}`);
45
+ }
46
+ /**
47
+ * Create a CORS origin in WorkOS.
48
+ * Returns success on 201 or 409 (already exists).
49
+ */
50
+ async function createCorsOrigin(apiKey, origin) {
51
+ const response = await workosRequest('POST', '/user_management/cors_origins', apiKey, { origin });
52
+ if (response.ok) {
53
+ return { success: true, alreadyExists: false };
54
+ }
55
+ const error = await parseFetchError(response);
56
+ // WorkOS returns 422 (not 409) when origin already exists
57
+ if (error.status === 409 || (error.status === 422 && error.message.includes('already exists'))) {
58
+ return { success: true, alreadyExists: true };
59
+ }
60
+ throw new Error(error.message || `HTTP ${error.status}`);
61
+ }
62
+ /**
63
+ * Set the app homepage URL in WorkOS.
64
+ */
65
+ async function setHomepageUrl(apiKey, url) {
66
+ const response = await workosRequest('PUT', '/user_management/app_homepage_url', apiKey, { url });
67
+ if (!response.ok) {
68
+ const error = await parseFetchError(response);
69
+ throw new Error(error.message || `HTTP ${error.status}`);
70
+ }
71
+ return { success: true };
72
+ }
73
+ /**
74
+ * Auto-configure WorkOS dashboard settings for local development.
75
+ * Sets redirect URI, CORS origin, and homepage URL via the WorkOS API.
76
+ *
77
+ * @param apiKey - WorkOS API key (sk_xxx)
78
+ * @param integration - Framework integration type
79
+ * @param port - Detected or default dev server port
80
+ * @param options - Optional overrides for homepage URL and redirect URI
81
+ *
82
+ * Non-blocking: failures are logged but don't stop the wizard.
83
+ */
84
+ export async function autoConfigureWorkOSEnvironment(apiKey, integration, port, options = {}) {
85
+ const baseUrl = `http://localhost:${port}`;
86
+ const callbackPath = getCallbackPath(integration);
87
+ const callbackUrl = options.redirectUri || `${baseUrl}${callbackPath}`;
88
+ const homepageUrlValue = options.homepageUrl || baseUrl;
89
+ clack.log.step('Configuring WorkOS dashboard settings via API...');
90
+ clack.log.info(` Redirect URI: ${callbackUrl}`);
91
+ clack.log.info(` CORS origin: ${baseUrl}`);
92
+ clack.log.info(` Homepage URL: ${homepageUrlValue}`);
93
+ try {
94
+ const [redirectUri, corsOrigin, homepageUrl] = await Promise.all([
95
+ createRedirectUri(apiKey, callbackUrl),
96
+ createCorsOrigin(apiKey, baseUrl),
97
+ setHomepageUrl(apiKey, homepageUrlValue),
98
+ ]);
99
+ const results = { redirectUri, corsOrigin, homepageUrl };
100
+ analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {
101
+ action: 'workos environment auto-configured',
102
+ integration,
103
+ port,
104
+ redirectUri: redirectUri.alreadyExists ? 'existed' : 'created',
105
+ corsOrigin: corsOrigin.alreadyExists ? 'existed' : 'created',
106
+ });
107
+ // Build user feedback
108
+ const messages = [];
109
+ messages.push(redirectUri.alreadyExists
110
+ ? `Redirect URI: ${callbackUrl} (already existed)`
111
+ : `Redirect URI: ${callbackUrl} (created)`);
112
+ messages.push(corsOrigin.alreadyExists ? `CORS origin: ${baseUrl} (already existed)` : `CORS origin: ${baseUrl} (created)`);
113
+ messages.push(`Homepage URL: ${homepageUrlValue} (updated)`);
114
+ clack.log.success('WorkOS dashboard configured:\n ' + messages.join('\n '));
115
+ return results;
116
+ }
117
+ catch (error) {
118
+ const message = error instanceof Error ? error.message : 'Unknown error';
119
+ // Provide specific guidance for common errors
120
+ if (message.includes('401') || message.includes('Invalid API key')) {
121
+ clack.log.warn('Could not configure WorkOS dashboard: Invalid API key');
122
+ }
123
+ else if (message.includes('403') || message.includes('permission')) {
124
+ clack.log.warn('Could not configure WorkOS dashboard: API key lacks permission');
125
+ }
126
+ else if (message.includes('422') || message.includes('Validation')) {
127
+ clack.log.warn(`Could not configure WorkOS dashboard: Validation error`);
128
+ clack.log.info(` Error: ${message}`);
129
+ }
130
+ else {
131
+ clack.log.warn(`Could not configure WorkOS dashboard: ${message}`);
132
+ }
133
+ clack.log.info('You can configure these settings manually in the WorkOS dashboard.');
134
+ analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {
135
+ action: 'workos environment auto-config failed',
136
+ integration,
137
+ error: message,
138
+ });
139
+ return null;
140
+ }
141
+ }
142
+ //# sourceMappingURL=workos-management.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workos-management.js","sourceRoot":"","sources":["../../../src/lib/workos-management.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,MAAM,mBAAmB,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,eAAe,GAAG,wBAAwB,CAAC;AAcjD,KAAK,UAAU,aAAa,CAC1B,MAAsB,EACtB,QAAgB,EAChB,MAAc,EACd,IAA4B;IAE5B,OAAO,KAAK,CAAC,GAAG,eAAe,GAAG,QAAQ,EAAE,EAAE;QAC5C,MAAM;QACN,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,EAAE;YACjC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,QAAkB;IAC/C,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;IACzB,CAAC;IACD,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,OAAO,EAAE,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAE,IAA4B,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;QACnH,IAAI;KACL,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,iBAAiB,CAAC,MAAc,EAAE,GAAW;IAC1D,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,gCAAgC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAEhG,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC9C,uDAAuD;IACvD,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC;QAC/F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,gBAAgB,CAAC,MAAc,EAAE,MAAc;IAC5D,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,+BAA+B,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAElG,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC9C,0DAA0D;IAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC;QAC/F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,MAAc,EAAE,GAAW;IACvD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,mCAAmC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAElG,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AASD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,MAAc,EACd,WAAwB,EACxB,IAAY,EACZ,UAA6B,EAAE;IAE/B,MAAM,OAAO,GAAG,oBAAoB,IAAI,EAAE,CAAC;IAC3C,MAAM,YAAY,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,GAAG,OAAO,GAAG,YAAY,EAAE,CAAC;IACvE,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC;IAExD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACnE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,WAAW,EAAE,CAAC,CAAC;IACjD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;IAC5C,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,gBAAgB,EAAE,CAAC,CAAC;IAEtD,IAAI,CAAC;QACH,MAAM,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC/D,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC;YACtC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC;YACjC,cAAc,CAAC,MAAM,EAAE,gBAAgB,CAAC;SACzC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAqB,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;QAE3E,SAAS,CAAC,OAAO,CAAC,6BAA6B,EAAE;YAC/C,MAAM,EAAE,oCAAoC;YAC5C,WAAW;YACX,IAAI;YACJ,WAAW,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YAC9D,UAAU,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;SAC7D,CAAC,CAAC;QAEH,sBAAsB;QACtB,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CACX,WAAW,CAAC,aAAa;YACvB,CAAC,CAAC,iBAAiB,WAAW,oBAAoB;YAClD,CAAC,CAAC,iBAAiB,WAAW,YAAY,CAC7C,CAAC;QACF,QAAQ,CAAC,IAAI,CACX,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,OAAO,oBAAoB,CAAC,CAAC,CAAC,gBAAgB,OAAO,YAAY,CAC7G,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,iBAAiB,gBAAgB,YAAY,CAAC,CAAC;QAE7D,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,kCAAkC,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAE9E,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAEzE,8CAA8C;QAC9C,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACnE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QAC1E,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACrE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;QACnF,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACrE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YACzE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,yCAAyC,OAAO,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;QAErF,SAAS,CAAC,OAAO,CAAC,6BAA6B,EAAE;YAC/C,MAAM,EAAE,uCAAuC;YAC/C,WAAW;YACX,KAAK,EAAE,OAAO;SACf,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import type { Integration } from './constants.js';\nimport { WIZARD_INTERACTION_EVENT_NAME } from './constants.js';\nimport { analytics } from '../utils/analytics.js';\nimport clack from '../utils/clack.js';\nimport { getCallbackPath } from './port-detection.js';\n\nconst WORKOS_API_BASE = 'https://api.workos.com';\n\nexport interface AutoConfigResult {\n redirectUri: { success: boolean; alreadyExists: boolean };\n corsOrigin: { success: boolean; alreadyExists: boolean };\n homepageUrl: { success: boolean };\n}\n\ninterface FetchError {\n status: number;\n message: string;\n data?: unknown;\n}\n\nasync function workosRequest(\n method: 'POST' | 'PUT',\n endpoint: string,\n apiKey: string,\n body: Record<string, string>,\n): Promise<Response> {\n return fetch(`${WORKOS_API_BASE}${endpoint}`, {\n method,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n}\n\nasync function parseFetchError(response: Response): Promise<FetchError> {\n let data: unknown;\n try {\n data = await response.json();\n } catch {\n // Response wasn't JSON\n }\n return {\n status: response.status,\n message: typeof data === 'object' && data && 'message' in data ? String((data as { message: string }).message) : '',\n data,\n };\n}\n\n/**\n * Create a redirect URI in WorkOS.\n * Returns success on 201 or 409 (already exists).\n */\nasync function createRedirectUri(apiKey: string, uri: string): Promise<{ success: boolean; alreadyExists: boolean }> {\n const response = await workosRequest('POST', '/user_management/redirect_uris', apiKey, { uri });\n\n if (response.ok) {\n return { success: true, alreadyExists: false };\n }\n\n const error = await parseFetchError(response);\n // WorkOS returns 422 (not 409) when URI already exists\n if (error.status === 409 || (error.status === 422 && error.message.includes('already exists'))) {\n return { success: true, alreadyExists: true };\n }\n\n throw new Error(error.message || `HTTP ${error.status}`);\n}\n\n/**\n * Create a CORS origin in WorkOS.\n * Returns success on 201 or 409 (already exists).\n */\nasync function createCorsOrigin(apiKey: string, origin: string): Promise<{ success: boolean; alreadyExists: boolean }> {\n const response = await workosRequest('POST', '/user_management/cors_origins', apiKey, { origin });\n\n if (response.ok) {\n return { success: true, alreadyExists: false };\n }\n\n const error = await parseFetchError(response);\n // WorkOS returns 422 (not 409) when origin already exists\n if (error.status === 409 || (error.status === 422 && error.message.includes('already exists'))) {\n return { success: true, alreadyExists: true };\n }\n\n throw new Error(error.message || `HTTP ${error.status}`);\n}\n\n/**\n * Set the app homepage URL in WorkOS.\n */\nasync function setHomepageUrl(apiKey: string, url: string): Promise<{ success: boolean }> {\n const response = await workosRequest('PUT', '/user_management/app_homepage_url', apiKey, { url });\n\n if (!response.ok) {\n const error = await parseFetchError(response);\n throw new Error(error.message || `HTTP ${error.status}`);\n }\n\n return { success: true };\n}\n\nexport interface AutoConfigOptions {\n /** Custom homepage URL (defaults to http://localhost:{port}) */\n homepageUrl?: string;\n /** Custom redirect URI (defaults to framework convention) */\n redirectUri?: string;\n}\n\n/**\n * Auto-configure WorkOS dashboard settings for local development.\n * Sets redirect URI, CORS origin, and homepage URL via the WorkOS API.\n *\n * @param apiKey - WorkOS API key (sk_xxx)\n * @param integration - Framework integration type\n * @param port - Detected or default dev server port\n * @param options - Optional overrides for homepage URL and redirect URI\n *\n * Non-blocking: failures are logged but don't stop the wizard.\n */\nexport async function autoConfigureWorkOSEnvironment(\n apiKey: string,\n integration: Integration,\n port: number,\n options: AutoConfigOptions = {},\n): Promise<AutoConfigResult | null> {\n const baseUrl = `http://localhost:${port}`;\n const callbackPath = getCallbackPath(integration);\n const callbackUrl = options.redirectUri || `${baseUrl}${callbackPath}`;\n const homepageUrlValue = options.homepageUrl || baseUrl;\n\n clack.log.step('Configuring WorkOS dashboard settings via API...');\n clack.log.info(` Redirect URI: ${callbackUrl}`);\n clack.log.info(` CORS origin: ${baseUrl}`);\n clack.log.info(` Homepage URL: ${homepageUrlValue}`);\n\n try {\n const [redirectUri, corsOrigin, homepageUrl] = await Promise.all([\n createRedirectUri(apiKey, callbackUrl),\n createCorsOrigin(apiKey, baseUrl),\n setHomepageUrl(apiKey, homepageUrlValue),\n ]);\n\n const results: AutoConfigResult = { redirectUri, corsOrigin, homepageUrl };\n\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'workos environment auto-configured',\n integration,\n port,\n redirectUri: redirectUri.alreadyExists ? 'existed' : 'created',\n corsOrigin: corsOrigin.alreadyExists ? 'existed' : 'created',\n });\n\n // Build user feedback\n const messages: string[] = [];\n messages.push(\n redirectUri.alreadyExists\n ? `Redirect URI: ${callbackUrl} (already existed)`\n : `Redirect URI: ${callbackUrl} (created)`,\n );\n messages.push(\n corsOrigin.alreadyExists ? `CORS origin: ${baseUrl} (already existed)` : `CORS origin: ${baseUrl} (created)`,\n );\n messages.push(`Homepage URL: ${homepageUrlValue} (updated)`);\n\n clack.log.success('WorkOS dashboard configured:\\n ' + messages.join('\\n '));\n\n return results;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n\n // Provide specific guidance for common errors\n if (message.includes('401') || message.includes('Invalid API key')) {\n clack.log.warn('Could not configure WorkOS dashboard: Invalid API key');\n } else if (message.includes('403') || message.includes('permission')) {\n clack.log.warn('Could not configure WorkOS dashboard: API key lacks permission');\n } else if (message.includes('422') || message.includes('Validation')) {\n clack.log.warn(`Could not configure WorkOS dashboard: Validation error`);\n clack.log.info(` Error: ${message}`);\n } else {\n clack.log.warn(`Could not configure WorkOS dashboard: ${message}`);\n }\n\n clack.log.info('You can configure these settings manually in the WorkOS dashboard.');\n\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'workos environment auto-config failed',\n integration,\n error: message,\n });\n\n return null;\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { WizardOptions } from '../utils/types.js';
2
+ /**
3
+ * Next.js wizard powered by the universal agent runner.
4
+ * @returns Summary of what was done, or empty string if version check fails
5
+ */
6
+ export declare function runNextjsWizardAgent(options: WizardOptions): Promise<string>;
@@ -0,0 +1,97 @@
1
+ import { enableDebugLogs } from '../utils/debug.js';
2
+ import { runAgentWizard } from '../lib/agent-runner.js';
3
+ import { Integration } from '../lib/constants.js';
4
+ import { getPackageVersion } from '../utils/package-json.js';
5
+ import { getPackageDotJson } from '../utils/clack-utils.js';
6
+ import clack from '../utils/clack.js';
7
+ import chalk from 'chalk';
8
+ import * as semver from 'semver';
9
+ import { getNextJsRouter, getNextJsVersionBucket, getNextJsRouterName, NextJsRouter } from './utils.js';
10
+ /**
11
+ * Next.js framework configuration for the universal agent runner.
12
+ */
13
+ const MINIMUM_NEXTJS_VERSION = '15.3.0';
14
+ const NEXTJS_AGENT_CONFIG = {
15
+ metadata: {
16
+ name: 'Next.js',
17
+ integration: Integration.nextjs,
18
+ docsUrl: 'https://workos.com/docs/user-management/authkit/nextjs',
19
+ unsupportedVersionDocsUrl: 'https://workos.com/docs/user-management/authkit/nextjs',
20
+ skillName: 'workos-authkit-nextjs',
21
+ gatherContext: async (options) => {
22
+ const router = await getNextJsRouter(options);
23
+ return { router };
24
+ },
25
+ },
26
+ detection: {
27
+ packageName: 'next',
28
+ packageDisplayName: 'Next.js',
29
+ getVersion: (packageJson) => getPackageVersion('next', packageJson),
30
+ getVersionBucket: getNextJsVersionBucket,
31
+ },
32
+ environment: {
33
+ uploadToHosting: true,
34
+ requiresApiKey: true, // Server-side framework
35
+ getEnvVars: (apiKey, clientId) => ({
36
+ WORKOS_API_KEY: apiKey,
37
+ WORKOS_CLIENT_ID: clientId,
38
+ }),
39
+ },
40
+ analytics: {
41
+ getTags: (context) => {
42
+ const router = context.router;
43
+ return {
44
+ router: router === NextJsRouter.APP_ROUTER ? 'app' : 'pages',
45
+ };
46
+ },
47
+ },
48
+ prompts: {
49
+ getAdditionalContextLines: (context) => {
50
+ const router = context.router;
51
+ const routerType = router === NextJsRouter.APP_ROUTER ? 'app' : 'pages';
52
+ return [`Router: ${routerType}`];
53
+ },
54
+ },
55
+ ui: {
56
+ successMessage: 'WorkOS AuthKit integration complete',
57
+ getOutroChanges: (context) => {
58
+ const router = context.router;
59
+ const routerName = getNextJsRouterName(router);
60
+ return [
61
+ `Analyzed your Next.js project structure (${routerName})`,
62
+ `Created and configured WorkOS AuthKit`,
63
+ `Integrated authentication into your application`,
64
+ ];
65
+ },
66
+ getOutroNextSteps: () => {
67
+ return [
68
+ 'Start your development server to test authentication',
69
+ 'Visit the WorkOS Dashboard to manage users and settings',
70
+ ];
71
+ },
72
+ },
73
+ };
74
+ /**
75
+ * Next.js wizard powered by the universal agent runner.
76
+ * @returns Summary of what was done, or empty string if version check fails
77
+ */
78
+ export async function runNextjsWizardAgent(options) {
79
+ if (options.debug) {
80
+ enableDebugLogs();
81
+ }
82
+ // Check Next.js version - agent wizard requires >= 15.3.0
83
+ const packageJson = await getPackageDotJson(options);
84
+ const nextVersion = getPackageVersion('next', packageJson);
85
+ if (nextVersion) {
86
+ const coercedVersion = semver.coerce(nextVersion);
87
+ if (coercedVersion && semver.lt(coercedVersion, MINIMUM_NEXTJS_VERSION)) {
88
+ const docsUrl = NEXTJS_AGENT_CONFIG.metadata.unsupportedVersionDocsUrl ?? NEXTJS_AGENT_CONFIG.metadata.docsUrl;
89
+ clack.log.warn(`Sorry: the wizard can't help you with Next.js ${nextVersion}. Upgrade to Next.js ${MINIMUM_NEXTJS_VERSION} or later, or check out the manual setup guide.`);
90
+ clack.log.info(`Setup Next.js manually: ${chalk.cyan(docsUrl)}`);
91
+ clack.outro('WorkOS AuthKit wizard will see you next time!');
92
+ return '';
93
+ }
94
+ }
95
+ return runAgentWizard(NEXTJS_AGENT_CONFIG, options);
96
+ }
97
+ //# sourceMappingURL=nextjs-wizard-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs-wizard-agent.js","sourceRoot":"","sources":["../../../src/nextjs/nextjs-wizard-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/* Simplified Next.js wizard using Claude Agent SDK with WorkOS MCP */\nimport type { WizardOptions } from '../utils/types.js';\nimport { enableDebugLogs } from '../utils/debug.js';\nimport { runAgentWizard } from '../lib/agent-runner.js';\nimport { Integration } from '../lib/constants.js';\nimport { getPackageVersion } from '../utils/package-json.js';\nimport { getPackageDotJson } from '../utils/clack-utils.js';\nimport clack from '../utils/clack.js';\nimport chalk from 'chalk';\nimport * as semver from 'semver';\nimport { getNextJsRouter, getNextJsVersionBucket, getNextJsRouterName, NextJsRouter } from './utils.js';\n\n/**\n * Next.js framework configuration for the universal agent runner.\n */\nconst MINIMUM_NEXTJS_VERSION = '15.3.0';\n\nconst NEXTJS_AGENT_CONFIG = {\n metadata: {\n name: 'Next.js',\n integration: Integration.nextjs,\n docsUrl: 'https://workos.com/docs/user-management/authkit/nextjs',\n unsupportedVersionDocsUrl: 'https://workos.com/docs/user-management/authkit/nextjs',\n skillName: 'workos-authkit-nextjs',\n gatherContext: async (options: WizardOptions) => {\n const router = await getNextJsRouter(options);\n return { router };\n },\n },\n\n detection: {\n packageName: 'next',\n packageDisplayName: 'Next.js',\n getVersion: (packageJson: any) => getPackageVersion('next', packageJson),\n getVersionBucket: getNextJsVersionBucket,\n },\n\n environment: {\n uploadToHosting: true,\n requiresApiKey: true, // Server-side framework\n getEnvVars: (apiKey: string, clientId: string) => ({\n WORKOS_API_KEY: apiKey,\n WORKOS_CLIENT_ID: clientId,\n }),\n },\n\n analytics: {\n getTags: (context: any) => {\n const router = context.router as NextJsRouter;\n return {\n router: router === NextJsRouter.APP_ROUTER ? 'app' : 'pages',\n };\n },\n },\n\n prompts: {\n getAdditionalContextLines: (context: any) => {\n const router = context.router as NextJsRouter;\n const routerType = router === NextJsRouter.APP_ROUTER ? 'app' : 'pages';\n return [`Router: ${routerType}`];\n },\n },\n\n ui: {\n successMessage: 'WorkOS AuthKit integration complete',\n getOutroChanges: (context: any) => {\n const router = context.router as NextJsRouter;\n const routerName = getNextJsRouterName(router);\n return [\n `Analyzed your Next.js project structure (${routerName})`,\n `Created and configured WorkOS AuthKit`,\n `Integrated authentication into your application`,\n ];\n },\n getOutroNextSteps: () => {\n return [\n 'Start your development server to test authentication',\n 'Visit the WorkOS Dashboard to manage users and settings',\n ];\n },\n },\n};\n\n/**\n * Next.js wizard powered by the universal agent runner.\n * @returns Summary of what was done, or empty string if version check fails\n */\nexport async function runNextjsWizardAgent(options: WizardOptions): Promise<string> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n // Check Next.js version - agent wizard requires >= 15.3.0\n const packageJson = await getPackageDotJson(options);\n const nextVersion = getPackageVersion('next', packageJson);\n\n if (nextVersion) {\n const coercedVersion = semver.coerce(nextVersion);\n if (coercedVersion && semver.lt(coercedVersion, MINIMUM_NEXTJS_VERSION)) {\n const docsUrl = NEXTJS_AGENT_CONFIG.metadata.unsupportedVersionDocsUrl ?? NEXTJS_AGENT_CONFIG.metadata.docsUrl;\n\n clack.log.warn(\n `Sorry: the wizard can't help you with Next.js ${nextVersion}. Upgrade to Next.js ${MINIMUM_NEXTJS_VERSION} or later, or check out the manual setup guide.`,\n );\n clack.log.info(`Setup Next.js manually: ${chalk.cyan(docsUrl)}`);\n clack.outro('WorkOS AuthKit wizard will see you next time!');\n return '';\n }\n }\n\n return runAgentWizard(NEXTJS_AGENT_CONFIG, options);\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import type { WizardOptions } from '../utils/types.js';
2
+ export declare function getNextJsVersionBucket(version: string | undefined): string;
3
+ export declare enum NextJsRouter {
4
+ APP_ROUTER = "app-router",
5
+ PAGES_ROUTER = "pages-router"
6
+ }
7
+ export declare function getNextJsRouter({ installDir }: Pick<WizardOptions, 'installDir'>): Promise<NextJsRouter>;
8
+ export declare const getNextJsRouterName: (router: NextJsRouter) => "app router" | "pages router";
@@ -0,0 +1,53 @@
1
+ import fg from 'fast-glob';
2
+ import { abortIfCancelled } from '../utils/clack-utils.js';
3
+ import clack from '../utils/clack.js';
4
+ import { getVersionBucket } from '../utils/semver.js';
5
+ import { IGNORE_PATTERNS, Integration } from '../lib/constants.js';
6
+ export function getNextJsVersionBucket(version) {
7
+ return getVersionBucket(version, 11);
8
+ }
9
+ export var NextJsRouter;
10
+ (function (NextJsRouter) {
11
+ NextJsRouter["APP_ROUTER"] = "app-router";
12
+ NextJsRouter["PAGES_ROUTER"] = "pages-router";
13
+ })(NextJsRouter || (NextJsRouter = {}));
14
+ export async function getNextJsRouter({ installDir }) {
15
+ const pagesMatches = await fg('**/pages/_app.@(ts|tsx|js|jsx)', {
16
+ dot: true,
17
+ cwd: installDir,
18
+ ignore: IGNORE_PATTERNS,
19
+ });
20
+ const hasPagesDir = pagesMatches.length > 0;
21
+ const appMatches = await fg('**/app/**/layout.@(ts|tsx|js|jsx)', {
22
+ dot: true,
23
+ cwd: installDir,
24
+ ignore: IGNORE_PATTERNS,
25
+ });
26
+ const hasAppDir = appMatches.length > 0;
27
+ if (hasPagesDir && !hasAppDir) {
28
+ clack.log.info(`Detected ${getNextJsRouterName(NextJsRouter.PAGES_ROUTER)} 📃`);
29
+ return NextJsRouter.PAGES_ROUTER;
30
+ }
31
+ if (hasAppDir && !hasPagesDir) {
32
+ clack.log.info(`Detected ${getNextJsRouterName(NextJsRouter.APP_ROUTER)} 📱`);
33
+ return NextJsRouter.APP_ROUTER;
34
+ }
35
+ const result = await abortIfCancelled(clack.select({
36
+ message: 'What router are you using?',
37
+ options: [
38
+ {
39
+ label: getNextJsRouterName(NextJsRouter.APP_ROUTER),
40
+ value: NextJsRouter.APP_ROUTER,
41
+ },
42
+ {
43
+ label: getNextJsRouterName(NextJsRouter.PAGES_ROUTER),
44
+ value: NextJsRouter.PAGES_ROUTER,
45
+ },
46
+ ],
47
+ }), Integration.nextjs);
48
+ return result;
49
+ }
50
+ export const getNextJsRouterName = (router) => {
51
+ return router === NextJsRouter.APP_ROUTER ? 'app router' : 'pages router';
52
+ };
53
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/nextjs/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,MAAM,mBAAmB,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEnE,MAAM,UAAU,sBAAsB,CAAC,OAA2B;IAChE,OAAO,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAN,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,yCAAyB,CAAA;IACzB,6CAA6B,CAAA;AAC/B,CAAC,EAHW,YAAY,KAAZ,YAAY,QAGvB;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EAAE,UAAU,EAAqC;IACrF,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,gCAAgC,EAAE;QAC9D,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,eAAe;KACxB,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAE5C,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,mCAAmC,EAAE;QAC/D,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,eAAe;KACxB,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAExC,IAAI,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,mBAAmB,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAChF,OAAO,YAAY,CAAC,YAAY,CAAC;IACnC,CAAC;IAED,IAAI,SAAS,IAAI,CAAC,WAAW,EAAE,CAAC;QAC9B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,mBAAmB,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9E,OAAO,YAAY,CAAC,UAAU,CAAC;IACjC,CAAC;IAED,MAAM,MAAM,GAAiB,MAAM,gBAAgB,CACjD,KAAK,CAAC,MAAM,CAAC;QACX,OAAO,EAAE,4BAA4B;QACrC,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,mBAAmB,CAAC,YAAY,CAAC,UAAU,CAAC;gBACnD,KAAK,EAAE,YAAY,CAAC,UAAU;aAC/B;YACD;gBACE,KAAK,EAAE,mBAAmB,CAAC,YAAY,CAAC,YAAY,CAAC;gBACrD,KAAK,EAAE,YAAY,CAAC,YAAY;aACjC;SACF;KACF,CAAC,EACF,WAAW,CAAC,MAAM,CACnB,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAoB,EAAE,EAAE;IAC1D,OAAO,MAAM,KAAK,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC;AAC5E,CAAC,CAAC","sourcesContent":["import fg from 'fast-glob';\nimport { abortIfCancelled } from '../utils/clack-utils.js';\nimport clack from '../utils/clack.js';\nimport { getVersionBucket } from '../utils/semver.js';\nimport type { WizardOptions } from '../utils/types.js';\nimport { IGNORE_PATTERNS, Integration } from '../lib/constants.js';\n\nexport function getNextJsVersionBucket(version: string | undefined): string {\n return getVersionBucket(version, 11);\n}\n\nexport enum NextJsRouter {\n APP_ROUTER = 'app-router',\n PAGES_ROUTER = 'pages-router',\n}\n\nexport async function getNextJsRouter({ installDir }: Pick<WizardOptions, 'installDir'>): Promise<NextJsRouter> {\n const pagesMatches = await fg('**/pages/_app.@(ts|tsx|js|jsx)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n const hasPagesDir = pagesMatches.length > 0;\n\n const appMatches = await fg('**/app/**/layout.@(ts|tsx|js|jsx)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n const hasAppDir = appMatches.length > 0;\n\n if (hasPagesDir && !hasAppDir) {\n clack.log.info(`Detected ${getNextJsRouterName(NextJsRouter.PAGES_ROUTER)} 📃`);\n return NextJsRouter.PAGES_ROUTER;\n }\n\n if (hasAppDir && !hasPagesDir) {\n clack.log.info(`Detected ${getNextJsRouterName(NextJsRouter.APP_ROUTER)} 📱`);\n return NextJsRouter.APP_ROUTER;\n }\n\n const result: NextJsRouter = await abortIfCancelled(\n clack.select({\n message: 'What router are you using?',\n options: [\n {\n label: getNextJsRouterName(NextJsRouter.APP_ROUTER),\n value: NextJsRouter.APP_ROUTER,\n },\n {\n label: getNextJsRouterName(NextJsRouter.PAGES_ROUTER),\n value: NextJsRouter.PAGES_ROUTER,\n },\n ],\n }),\n Integration.nextjs,\n );\n\n return result;\n}\n\nexport const getNextJsRouterName = (router: NextJsRouter) => {\n return router === NextJsRouter.APP_ROUTER ? 'app router' : 'pages router';\n};\n"]}
@@ -0,0 +1,2 @@
1
+ import type { WizardOptions } from '../utils/types.js';
2
+ export declare function runReactWizardAgent(options: WizardOptions): Promise<string>;
@@ -0,0 +1,47 @@
1
+ import { enableDebugLogs } from '../utils/debug.js';
2
+ import { runAgentWizard } from '../lib/agent-runner.js';
3
+ import { Integration } from '../lib/constants.js';
4
+ const REACT_AGENT_CONFIG = {
5
+ metadata: {
6
+ name: 'React',
7
+ integration: Integration.react,
8
+ docsUrl: 'https://workos.com/docs/user-management/authkit/react',
9
+ unsupportedVersionDocsUrl: 'https://workos.com/docs/user-management/authkit/react',
10
+ skillName: 'workos-authkit-react',
11
+ },
12
+ detection: {
13
+ packageName: 'react',
14
+ packageDisplayName: 'React',
15
+ getVersion: (packageJson) => packageJson.dependencies?.react || packageJson.devDependencies?.react,
16
+ },
17
+ environment: {
18
+ uploadToHosting: false,
19
+ requiresApiKey: false, // Client-only SPA
20
+ getEnvVars: (_apiKey, clientId) => ({
21
+ WORKOS_CLIENT_ID: clientId, // Only client ID needed
22
+ }),
23
+ },
24
+ analytics: {
25
+ getTags: () => ({}),
26
+ },
27
+ prompts: {},
28
+ ui: {
29
+ successMessage: 'WorkOS AuthKit integration complete',
30
+ getOutroChanges: () => [
31
+ 'Analyzed your React project structure',
32
+ 'Created and configured WorkOS AuthKit',
33
+ 'Integrated authentication into your application',
34
+ ],
35
+ getOutroNextSteps: () => [
36
+ 'Start your development server to test authentication',
37
+ 'Visit the WorkOS Dashboard to manage users and settings',
38
+ ],
39
+ },
40
+ };
41
+ export async function runReactWizardAgent(options) {
42
+ if (options.debug) {
43
+ enableDebugLogs();
44
+ }
45
+ return runAgentWizard(REACT_AGENT_CONFIG, options);
46
+ }
47
+ //# sourceMappingURL=react-wizard-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-wizard-agent.js","sourceRoot":"","sources":["../../../src/react/react-wizard-agent.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,kBAAkB,GAAoB;IAC1C,QAAQ,EAAE;QACR,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,WAAW,CAAC,KAAK;QAC9B,OAAO,EAAE,uDAAuD;QAChE,yBAAyB,EAAE,uDAAuD;QAClF,SAAS,EAAE,sBAAsB;KAClC;IAED,SAAS,EAAE;QACT,WAAW,EAAE,OAAO;QACpB,kBAAkB,EAAE,OAAO;QAC3B,UAAU,EAAE,CAAC,WAAgB,EAAE,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,KAAK,IAAI,WAAW,CAAC,eAAe,EAAE,KAAK;KACxG;IAED,WAAW,EAAE;QACX,eAAe,EAAE,KAAK;QACtB,cAAc,EAAE,KAAK,EAAE,kBAAkB;QACzC,UAAU,EAAE,CAAC,OAAe,EAAE,QAAgB,EAAE,EAAE,CAAC,CAAC;YAClD,gBAAgB,EAAE,QAAQ,EAAE,wBAAwB;SACrD,CAAC;KACH;IAED,SAAS,EAAE;QACT,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;KACpB;IAED,OAAO,EAAE,EAAE;IAEX,EAAE,EAAE;QACF,cAAc,EAAE,qCAAqC;QACrD,eAAe,EAAE,GAAG,EAAE,CAAC;YACrB,uCAAuC;YACvC,uCAAuC;YACvC,iDAAiD;SAClD;QACD,iBAAiB,EAAE,GAAG,EAAE,CAAC;YACvB,sDAAsD;YACtD,yDAAyD;SAC1D;KACF;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAsB;IAC9D,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,eAAe,EAAE,CAAC;IACpB,CAAC;IAED,OAAO,cAAc,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC","sourcesContent":["/* React SPA wizard using Claude Agent SDK */\nimport type { WizardOptions } from '../utils/types.js';\nimport type { FrameworkConfig } from '../lib/framework-config.js';\nimport { enableDebugLogs } from '../utils/debug.js';\nimport { runAgentWizard } from '../lib/agent-runner.js';\nimport { Integration } from '../lib/constants.js';\n\nconst REACT_AGENT_CONFIG: FrameworkConfig = {\n metadata: {\n name: 'React',\n integration: Integration.react,\n docsUrl: 'https://workos.com/docs/user-management/authkit/react',\n unsupportedVersionDocsUrl: 'https://workos.com/docs/user-management/authkit/react',\n skillName: 'workos-authkit-react',\n },\n\n detection: {\n packageName: 'react',\n packageDisplayName: 'React',\n getVersion: (packageJson: any) => packageJson.dependencies?.react || packageJson.devDependencies?.react,\n },\n\n environment: {\n uploadToHosting: false,\n requiresApiKey: false, // Client-only SPA\n getEnvVars: (_apiKey: string, clientId: string) => ({\n WORKOS_CLIENT_ID: clientId, // Only client ID needed\n }),\n },\n\n analytics: {\n getTags: () => ({}),\n },\n\n prompts: {},\n\n ui: {\n successMessage: 'WorkOS AuthKit integration complete',\n getOutroChanges: () => [\n 'Analyzed your React project structure',\n 'Created and configured WorkOS AuthKit',\n 'Integrated authentication into your application',\n ],\n getOutroNextSteps: () => [\n 'Start your development server to test authentication',\n 'Visit the WorkOS Dashboard to manage users and settings',\n ],\n },\n};\n\nexport async function runReactWizardAgent(options: WizardOptions): Promise<string> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n return runAgentWizard(REACT_AGENT_CONFIG, options);\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { WizardOptions } from '../utils/types.js';
2
+ /**
3
+ * React Router wizard powered by the universal agent runner.
4
+ * @returns Summary of what was done, or empty string if version check fails
5
+ */
6
+ export declare function runReactRouterWizardAgent(options: WizardOptions): Promise<string>;
@@ -0,0 +1,103 @@
1
+ import { enableDebugLogs } from '../utils/debug.js';
2
+ import { runAgentWizard } from '../lib/agent-runner.js';
3
+ import { Integration } from '../lib/constants.js';
4
+ import { getPackageVersion } from '../utils/package-json.js';
5
+ import { getPackageDotJson } from '../utils/clack-utils.js';
6
+ import clack from '../utils/clack.js';
7
+ import chalk from 'chalk';
8
+ import * as semver from 'semver';
9
+ import { getReactRouterMode, getReactRouterModeName, getReactRouterVersionBucket, ReactRouterMode } from './utils.js';
10
+ /**
11
+ * React Router framework configuration for the universal agent runner.
12
+ */
13
+ const MINIMUM_REACT_ROUTER_VERSION = '6.0.0';
14
+ const REACT_ROUTER_AGENT_CONFIG = {
15
+ metadata: {
16
+ name: 'React Router',
17
+ integration: Integration.reactRouter,
18
+ docsUrl: 'https://workos.com/docs/user-management/authkit/react-router',
19
+ unsupportedVersionDocsUrl: 'https://workos.com/docs/user-management/authkit/react-router',
20
+ skillName: 'workos-authkit-react-router',
21
+ gatherContext: async (options) => {
22
+ const routerMode = await getReactRouterMode(options);
23
+ return { routerMode };
24
+ },
25
+ },
26
+ detection: {
27
+ packageName: 'react-router',
28
+ packageDisplayName: 'React Router',
29
+ getVersion: (packageJson) => getPackageVersion('react-router', packageJson),
30
+ getVersionBucket: getReactRouterVersionBucket,
31
+ },
32
+ environment: {
33
+ uploadToHosting: false,
34
+ requiresApiKey: true, // Can do SSR
35
+ getEnvVars: (apiKey, clientId) => ({
36
+ WORKOS_API_KEY: apiKey,
37
+ WORKOS_CLIENT_ID: clientId,
38
+ }),
39
+ },
40
+ analytics: {
41
+ getTags: (context) => {
42
+ const routerMode = context.routerMode;
43
+ return {
44
+ routerMode: routerMode || 'unknown',
45
+ };
46
+ },
47
+ },
48
+ prompts: {
49
+ getAdditionalContextLines: (context) => {
50
+ const routerMode = context.routerMode;
51
+ const modeName = routerMode ? getReactRouterModeName(routerMode) : 'unknown';
52
+ // Map router mode to framework ID for MCP docs resource
53
+ const frameworkIdMap = {
54
+ [ReactRouterMode.V6]: 'react-react-router-6',
55
+ [ReactRouterMode.V7_FRAMEWORK]: 'react-react-router-7-framework',
56
+ [ReactRouterMode.V7_DATA]: 'react-react-router-7-data',
57
+ [ReactRouterMode.V7_DECLARATIVE]: 'react-react-router-7-declarative',
58
+ };
59
+ const frameworkId = routerMode ? frameworkIdMap[routerMode] : ReactRouterMode.V7_FRAMEWORK;
60
+ return [`Router mode: ${modeName}`, `Framework docs ID: ${frameworkId}`];
61
+ },
62
+ },
63
+ ui: {
64
+ successMessage: 'WorkOS AuthKit integration complete',
65
+ getOutroChanges: (context) => {
66
+ const routerMode = context.routerMode;
67
+ const modeName = routerMode ? getReactRouterModeName(routerMode) : 'React Router';
68
+ return [
69
+ `Analyzed your React Router project structure (${modeName})`,
70
+ `Created and configured WorkOS AuthKit`,
71
+ `Integrated authentication into your application`,
72
+ ];
73
+ },
74
+ getOutroNextSteps: () => [
75
+ 'Start your development server to test authentication',
76
+ 'Visit the WorkOS Dashboard to manage users and settings',
77
+ ],
78
+ },
79
+ };
80
+ /**
81
+ * React Router wizard powered by the universal agent runner.
82
+ * @returns Summary of what was done, or empty string if version check fails
83
+ */
84
+ export async function runReactRouterWizardAgent(options) {
85
+ if (options.debug) {
86
+ enableDebugLogs();
87
+ }
88
+ // Check React Router version - agent wizard requires >= 6.0.0
89
+ const packageJson = await getPackageDotJson(options);
90
+ const reactRouterVersion = getPackageVersion('react-router', packageJson);
91
+ if (reactRouterVersion) {
92
+ const coercedVersion = semver.coerce(reactRouterVersion);
93
+ if (coercedVersion && semver.lt(coercedVersion, MINIMUM_REACT_ROUTER_VERSION)) {
94
+ const docsUrl = REACT_ROUTER_AGENT_CONFIG.metadata.unsupportedVersionDocsUrl ?? REACT_ROUTER_AGENT_CONFIG.metadata.docsUrl;
95
+ clack.log.warn(`Sorry: the wizard can't help you with React Router ${reactRouterVersion}. Upgrade to React Router ${MINIMUM_REACT_ROUTER_VERSION} or later, or check out the manual setup guide.`);
96
+ clack.log.info(`Setup React Router manually: ${chalk.cyan(docsUrl)}`);
97
+ clack.outro('WorkOS AuthKit wizard will see you next time!');
98
+ return '';
99
+ }
100
+ }
101
+ return runAgentWizard(REACT_ROUTER_AGENT_CONFIG, options);
102
+ }
103
+ //# sourceMappingURL=react-router-wizard-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-router-wizard-agent.js","sourceRoot":"","sources":["../../../src/react-router/react-router-wizard-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/* React Router wizard using Claude Agent SDK with WorkOS MCP */\nimport type { WizardOptions } from '../utils/types.js';\nimport type { FrameworkConfig } from '../lib/framework-config.js';\nimport { enableDebugLogs } from '../utils/debug.js';\nimport { runAgentWizard } from '../lib/agent-runner.js';\nimport { Integration } from '../lib/constants.js';\nimport { getPackageVersion } from '../utils/package-json.js';\nimport { getPackageDotJson } from '../utils/clack-utils.js';\nimport clack from '../utils/clack.js';\nimport chalk from 'chalk';\nimport * as semver from 'semver';\nimport { getReactRouterMode, getReactRouterModeName, getReactRouterVersionBucket, ReactRouterMode } from './utils.js';\n\n/**\n * React Router framework configuration for the universal agent runner.\n */\nconst MINIMUM_REACT_ROUTER_VERSION = '6.0.0';\n\nconst REACT_ROUTER_AGENT_CONFIG: FrameworkConfig = {\n metadata: {\n name: 'React Router',\n integration: Integration.reactRouter,\n docsUrl: 'https://workos.com/docs/user-management/authkit/react-router',\n unsupportedVersionDocsUrl: 'https://workos.com/docs/user-management/authkit/react-router',\n skillName: 'workos-authkit-react-router',\n gatherContext: async (options: WizardOptions) => {\n const routerMode = await getReactRouterMode(options);\n return { routerMode };\n },\n },\n\n detection: {\n packageName: 'react-router',\n packageDisplayName: 'React Router',\n getVersion: (packageJson: any) => getPackageVersion('react-router', packageJson),\n getVersionBucket: getReactRouterVersionBucket,\n },\n\n environment: {\n uploadToHosting: false,\n requiresApiKey: true, // Can do SSR\n getEnvVars: (apiKey: string, clientId: string) => ({\n WORKOS_API_KEY: apiKey,\n WORKOS_CLIENT_ID: clientId,\n }),\n },\n\n analytics: {\n getTags: (context: any) => {\n const routerMode = context.routerMode as ReactRouterMode;\n return {\n routerMode: routerMode || 'unknown',\n };\n },\n },\n\n prompts: {\n getAdditionalContextLines: (context: any) => {\n const routerMode = context.routerMode as ReactRouterMode;\n const modeName = routerMode ? getReactRouterModeName(routerMode) : 'unknown';\n\n // Map router mode to framework ID for MCP docs resource\n const frameworkIdMap: Record<ReactRouterMode, string> = {\n [ReactRouterMode.V6]: 'react-react-router-6',\n [ReactRouterMode.V7_FRAMEWORK]: 'react-react-router-7-framework',\n [ReactRouterMode.V7_DATA]: 'react-react-router-7-data',\n [ReactRouterMode.V7_DECLARATIVE]: 'react-react-router-7-declarative',\n };\n\n const frameworkId = routerMode ? frameworkIdMap[routerMode] : ReactRouterMode.V7_FRAMEWORK;\n\n return [`Router mode: ${modeName}`, `Framework docs ID: ${frameworkId}`];\n },\n },\n\n ui: {\n successMessage: 'WorkOS AuthKit integration complete',\n getOutroChanges: (context: any) => {\n const routerMode = context.routerMode as ReactRouterMode;\n const modeName = routerMode ? getReactRouterModeName(routerMode) : 'React Router';\n return [\n `Analyzed your React Router project structure (${modeName})`,\n `Created and configured WorkOS AuthKit`,\n `Integrated authentication into your application`,\n ];\n },\n getOutroNextSteps: () => [\n 'Start your development server to test authentication',\n 'Visit the WorkOS Dashboard to manage users and settings',\n ],\n },\n};\n\n/**\n * React Router wizard powered by the universal agent runner.\n * @returns Summary of what was done, or empty string if version check fails\n */\nexport async function runReactRouterWizardAgent(options: WizardOptions): Promise<string> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n // Check React Router version - agent wizard requires >= 6.0.0\n const packageJson = await getPackageDotJson(options);\n const reactRouterVersion = getPackageVersion('react-router', packageJson);\n\n if (reactRouterVersion) {\n const coercedVersion = semver.coerce(reactRouterVersion);\n if (coercedVersion && semver.lt(coercedVersion, MINIMUM_REACT_ROUTER_VERSION)) {\n const docsUrl =\n REACT_ROUTER_AGENT_CONFIG.metadata.unsupportedVersionDocsUrl ?? REACT_ROUTER_AGENT_CONFIG.metadata.docsUrl;\n\n clack.log.warn(\n `Sorry: the wizard can't help you with React Router ${reactRouterVersion}. Upgrade to React Router ${MINIMUM_REACT_ROUTER_VERSION} or later, or check out the manual setup guide.`,\n );\n clack.log.info(`Setup React Router manually: ${chalk.cyan(docsUrl)}`);\n clack.outro('WorkOS AuthKit wizard will see you next time!');\n return '';\n }\n }\n\n return runAgentWizard(REACT_ROUTER_AGENT_CONFIG, options);\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import type { WizardOptions } from '../utils/types.js';
2
+ export declare enum ReactRouterMode {
3
+ V6 = "v6",// React Router v6
4
+ V7_FRAMEWORK = "v7-framework",// React Router v7 with react-router.config.ts
5
+ V7_DATA = "v7-data",// React Router v7 with createBrowserRouter
6
+ V7_DECLARATIVE = "v7-declarative"
7
+ }
8
+ /**
9
+ * Get React Router version bucket for analytics
10
+ */
11
+ export declare function getReactRouterVersionBucket(version: string | undefined): string;
12
+ /**
13
+ * Detect React Router mode
14
+ */
15
+ export declare function getReactRouterMode(options: WizardOptions): Promise<ReactRouterMode>;
16
+ /**
17
+ * Get human-readable name for React Router mode
18
+ */
19
+ export declare function getReactRouterModeName(mode: ReactRouterMode): string;