@getpara/cli 2.15.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 (331) hide show
  1. package/README.md +97 -0
  2. package/dist/api/client.d.ts +49 -0
  3. package/dist/api/client.d.ts.map +1 -0
  4. package/dist/api/client.js +247 -0
  5. package/dist/api/errors.d.ts +9 -0
  6. package/dist/api/errors.d.ts.map +1 -0
  7. package/dist/api/errors.js +29 -0
  8. package/dist/api/types.d.ts +155 -0
  9. package/dist/api/types.d.ts.map +1 -0
  10. package/dist/api/types.js +58 -0
  11. package/dist/auth/polling-flow.d.ts +7 -0
  12. package/dist/auth/polling-flow.d.ts.map +1 -0
  13. package/dist/auth/polling-flow.js +94 -0
  14. package/dist/auth/session-manager.d.ts +7 -0
  15. package/dist/auth/session-manager.d.ts.map +1 -0
  16. package/dist/auth/session-manager.js +42 -0
  17. package/dist/cli.d.ts +16 -0
  18. package/dist/cli.d.ts.map +1 -0
  19. package/dist/cli.js +151 -0
  20. package/dist/commands/auth/index.d.ts +3 -0
  21. package/dist/commands/auth/index.d.ts.map +1 -0
  22. package/dist/commands/auth/index.js +18 -0
  23. package/dist/commands/auth/login.d.ts +3 -0
  24. package/dist/commands/auth/login.d.ts.map +1 -0
  25. package/dist/commands/auth/login.js +70 -0
  26. package/dist/commands/auth/logout.d.ts +3 -0
  27. package/dist/commands/auth/logout.d.ts.map +1 -0
  28. package/dist/commands/auth/logout.js +45 -0
  29. package/dist/commands/auth/status.d.ts +3 -0
  30. package/dist/commands/auth/status.d.ts.map +1 -0
  31. package/dist/commands/auth/status.js +54 -0
  32. package/dist/commands/config.d.ts +3 -0
  33. package/dist/commands/config.d.ts.map +1 -0
  34. package/dist/commands/config.js +122 -0
  35. package/dist/commands/create.d.ts +3 -0
  36. package/dist/commands/create.d.ts.map +1 -0
  37. package/dist/commands/create.js +587 -0
  38. package/dist/commands/doctor.d.ts +3 -0
  39. package/dist/commands/doctor.d.ts.map +1 -0
  40. package/dist/commands/doctor.js +67 -0
  41. package/dist/commands/init.d.ts +3 -0
  42. package/dist/commands/init.d.ts.map +1 -0
  43. package/dist/commands/init.js +45 -0
  44. package/dist/commands/keys/archive.d.ts +3 -0
  45. package/dist/commands/keys/archive.d.ts.map +1 -0
  46. package/dist/commands/keys/archive.js +49 -0
  47. package/dist/commands/keys/config/branding.d.ts +23 -0
  48. package/dist/commands/keys/config/branding.d.ts.map +1 -0
  49. package/dist/commands/keys/config/branding.js +246 -0
  50. package/dist/commands/keys/config/categories.d.ts +15 -0
  51. package/dist/commands/keys/config/categories.d.ts.map +1 -0
  52. package/dist/commands/keys/config/categories.js +67 -0
  53. package/dist/commands/keys/config/index.d.ts +3 -0
  54. package/dist/commands/keys/config/index.d.ts.map +1 -0
  55. package/dist/commands/keys/config/index.js +56 -0
  56. package/dist/commands/keys/config/ramps.d.ts +18 -0
  57. package/dist/commands/keys/config/ramps.d.ts.map +1 -0
  58. package/dist/commands/keys/config/ramps.js +185 -0
  59. package/dist/commands/keys/config/security.d.ts +15 -0
  60. package/dist/commands/keys/config/security.d.ts.map +1 -0
  61. package/dist/commands/keys/config/security.js +212 -0
  62. package/dist/commands/keys/config/setup.d.ts +16 -0
  63. package/dist/commands/keys/config/setup.d.ts.map +1 -0
  64. package/dist/commands/keys/config/setup.js +235 -0
  65. package/dist/commands/keys/config/webhooks.d.ts +18 -0
  66. package/dist/commands/keys/config/webhooks.d.ts.map +1 -0
  67. package/dist/commands/keys/config/webhooks.js +279 -0
  68. package/dist/commands/keys/create.d.ts +3 -0
  69. package/dist/commands/keys/create.d.ts.map +1 -0
  70. package/dist/commands/keys/create.js +64 -0
  71. package/dist/commands/keys/get.d.ts +3 -0
  72. package/dist/commands/keys/get.d.ts.map +1 -0
  73. package/dist/commands/keys/get.js +91 -0
  74. package/dist/commands/keys/index.d.ts +3 -0
  75. package/dist/commands/keys/index.d.ts.map +1 -0
  76. package/dist/commands/keys/index.js +22 -0
  77. package/dist/commands/keys/list.d.ts +3 -0
  78. package/dist/commands/keys/list.d.ts.map +1 -0
  79. package/dist/commands/keys/list.js +66 -0
  80. package/dist/commands/keys/rotate.d.ts +3 -0
  81. package/dist/commands/keys/rotate.d.ts.map +1 -0
  82. package/dist/commands/keys/rotate.js +59 -0
  83. package/dist/commands/orgs/index.d.ts +3 -0
  84. package/dist/commands/orgs/index.d.ts.map +1 -0
  85. package/dist/commands/orgs/index.js +15 -0
  86. package/dist/commands/orgs/list.d.ts +3 -0
  87. package/dist/commands/orgs/list.d.ts.map +1 -0
  88. package/dist/commands/orgs/list.js +53 -0
  89. package/dist/commands/orgs/switch.d.ts +3 -0
  90. package/dist/commands/orgs/switch.d.ts.map +1 -0
  91. package/dist/commands/orgs/switch.js +61 -0
  92. package/dist/commands/projects/archive.d.ts +3 -0
  93. package/dist/commands/projects/archive.d.ts.map +1 -0
  94. package/dist/commands/projects/archive.js +51 -0
  95. package/dist/commands/projects/create.d.ts +3 -0
  96. package/dist/commands/projects/create.d.ts.map +1 -0
  97. package/dist/commands/projects/create.js +48 -0
  98. package/dist/commands/projects/index.d.ts +3 -0
  99. package/dist/commands/projects/index.d.ts.map +1 -0
  100. package/dist/commands/projects/index.js +25 -0
  101. package/dist/commands/projects/list.d.ts +3 -0
  102. package/dist/commands/projects/list.d.ts.map +1 -0
  103. package/dist/commands/projects/list.js +52 -0
  104. package/dist/commands/projects/restore.d.ts +3 -0
  105. package/dist/commands/projects/restore.d.ts.map +1 -0
  106. package/dist/commands/projects/restore.js +36 -0
  107. package/dist/commands/projects/switch.d.ts +3 -0
  108. package/dist/commands/projects/switch.d.ts.map +1 -0
  109. package/dist/commands/projects/switch.js +57 -0
  110. package/dist/commands/projects/update.d.ts +3 -0
  111. package/dist/commands/projects/update.d.ts.map +1 -0
  112. package/dist/commands/projects/update.js +67 -0
  113. package/dist/commands/whoami.d.ts +3 -0
  114. package/dist/commands/whoami.d.ts.map +1 -0
  115. package/dist/commands/whoami.js +61 -0
  116. package/dist/config/config-manager.d.ts +3 -0
  117. package/dist/config/config-manager.d.ts.map +1 -0
  118. package/dist/config/config-manager.js +32 -0
  119. package/dist/config/config-store.d.ts +10 -0
  120. package/dist/config/config-store.d.ts.map +1 -0
  121. package/dist/config/config-store.js +37 -0
  122. package/dist/config/credential-store.d.ts +12 -0
  123. package/dist/config/credential-store.d.ts.map +1 -0
  124. package/dist/config/credential-store.js +94 -0
  125. package/dist/config/paths.d.ts +5 -0
  126. package/dist/config/paths.d.ts.map +1 -0
  127. package/dist/config/paths.js +29 -0
  128. package/dist/config/project-config.d.ts +8 -0
  129. package/dist/config/project-config.d.ts.map +1 -0
  130. package/dist/config/project-config.js +41 -0
  131. package/dist/core/constants.d.ts +27 -0
  132. package/dist/core/constants.d.ts.map +1 -0
  133. package/dist/core/constants.js +60 -0
  134. package/dist/core/error-handler.d.ts +24 -0
  135. package/dist/core/error-handler.d.ts.map +1 -0
  136. package/dist/core/error-handler.js +83 -0
  137. package/dist/core/types.d.ts +21 -0
  138. package/dist/core/types.d.ts.map +1 -0
  139. package/dist/core/types.js +0 -0
  140. package/dist/core/update-check.d.ts +6 -0
  141. package/dist/core/update-check.d.ts.map +1 -0
  142. package/dist/core/update-check.js +78 -0
  143. package/dist/diagnostics/checks/chain-dependencies.d.ts +2 -0
  144. package/dist/diagnostics/checks/chain-dependencies.d.ts.map +1 -0
  145. package/dist/diagnostics/checks/chain-dependencies.js +130 -0
  146. package/dist/diagnostics/checks/css-import.d.ts +2 -0
  147. package/dist/diagnostics/checks/css-import.d.ts.map +1 -0
  148. package/dist/diagnostics/checks/css-import.js +57 -0
  149. package/dist/diagnostics/checks/deprecated-packages.d.ts +2 -0
  150. package/dist/diagnostics/checks/deprecated-packages.d.ts.map +1 -0
  151. package/dist/diagnostics/checks/deprecated-packages.js +93 -0
  152. package/dist/diagnostics/checks/env-api-key.d.ts +2 -0
  153. package/dist/diagnostics/checks/env-api-key.d.ts.map +1 -0
  154. package/dist/diagnostics/checks/env-api-key.js +75 -0
  155. package/dist/diagnostics/checks/env-var-prefix.d.ts +2 -0
  156. package/dist/diagnostics/checks/env-var-prefix.d.ts.map +1 -0
  157. package/dist/diagnostics/checks/env-var-prefix.js +52 -0
  158. package/dist/diagnostics/checks/index.d.ts +13 -0
  159. package/dist/diagnostics/checks/index.d.ts.map +1 -0
  160. package/dist/diagnostics/checks/index.js +32 -0
  161. package/dist/diagnostics/checks/para-provider.d.ts +2 -0
  162. package/dist/diagnostics/checks/para-provider.d.ts.map +1 -0
  163. package/dist/diagnostics/checks/para-provider.js +42 -0
  164. package/dist/diagnostics/checks/query-client.d.ts +2 -0
  165. package/dist/diagnostics/checks/query-client.d.ts.map +1 -0
  166. package/dist/diagnostics/checks/query-client.js +58 -0
  167. package/dist/diagnostics/checks/use-client-directive.d.ts +2 -0
  168. package/dist/diagnostics/checks/use-client-directive.d.ts.map +1 -0
  169. package/dist/diagnostics/checks/use-client-directive.js +81 -0
  170. package/dist/diagnostics/checks/version-consistency.d.ts +2 -0
  171. package/dist/diagnostics/checks/version-consistency.d.ts.map +1 -0
  172. package/dist/diagnostics/checks/version-consistency.js +93 -0
  173. package/dist/diagnostics/context.d.ts +3 -0
  174. package/dist/diagnostics/context.d.ts.map +1 -0
  175. package/dist/diagnostics/context.js +56 -0
  176. package/dist/diagnostics/detectors/framework.d.ts +5 -0
  177. package/dist/diagnostics/detectors/framework.d.ts.map +1 -0
  178. package/dist/diagnostics/detectors/framework.js +73 -0
  179. package/dist/diagnostics/detectors/package-manager.d.ts +3 -0
  180. package/dist/diagnostics/detectors/package-manager.d.ts.map +1 -0
  181. package/dist/diagnostics/detectors/package-manager.js +17 -0
  182. package/dist/diagnostics/detectors/sdk.d.ts +7 -0
  183. package/dist/diagnostics/detectors/sdk.d.ts.map +1 -0
  184. package/dist/diagnostics/detectors/sdk.js +48 -0
  185. package/dist/diagnostics/runner.d.ts +3 -0
  186. package/dist/diagnostics/runner.d.ts.map +1 -0
  187. package/dist/diagnostics/runner.js +44 -0
  188. package/dist/diagnostics/types.d.ts +70 -0
  189. package/dist/diagnostics/types.d.ts.map +1 -0
  190. package/dist/diagnostics/types.js +14 -0
  191. package/dist/diagnostics/utils/code-search.d.ts +10 -0
  192. package/dist/diagnostics/utils/code-search.d.ts.map +1 -0
  193. package/dist/diagnostics/utils/code-search.js +98 -0
  194. package/dist/diagnostics/utils/file-system.d.ts +7 -0
  195. package/dist/diagnostics/utils/file-system.d.ts.map +1 -0
  196. package/dist/diagnostics/utils/file-system.js +72 -0
  197. package/dist/diagnostics/utils/package-json.d.ts +12 -0
  198. package/dist/diagnostics/utils/package-json.d.ts.map +1 -0
  199. package/dist/diagnostics/utils/package-json.js +51 -0
  200. package/dist/index.d.ts +2 -0
  201. package/dist/index.d.ts.map +1 -0
  202. package/dist/index.js +20 -0
  203. package/dist/output/formatter.d.ts +25 -0
  204. package/dist/output/formatter.d.ts.map +1 -0
  205. package/dist/output/formatter.js +76 -0
  206. package/dist/output/mask.d.ts +2 -0
  207. package/dist/output/mask.d.ts.map +1 -0
  208. package/dist/output/mask.js +15 -0
  209. package/dist/output/prompts.d.ts +25 -0
  210. package/dist/output/prompts.d.ts.map +1 -0
  211. package/dist/output/prompts.js +86 -0
  212. package/dist/output/spinner.d.ts +6 -0
  213. package/dist/output/spinner.d.ts.map +1 -0
  214. package/dist/output/spinner.js +7 -0
  215. package/dist/output/table.d.ts +9 -0
  216. package/dist/output/table.d.ts.map +1 -0
  217. package/dist/output/table.js +21 -0
  218. package/dist/scaffolding/scaffolder.d.ts +3 -0
  219. package/dist/scaffolding/scaffolder.d.ts.map +1 -0
  220. package/dist/scaffolding/scaffolder.js +78 -0
  221. package/dist/scaffolding/strategies/expo-template.d.ts +16 -0
  222. package/dist/scaffolding/strategies/expo-template.d.ts.map +1 -0
  223. package/dist/scaffolding/strategies/expo-template.js +160 -0
  224. package/dist/scaffolding/strategies/index.d.ts +5 -0
  225. package/dist/scaffolding/strategies/index.d.ts.map +1 -0
  226. package/dist/scaffolding/strategies/index.js +25 -0
  227. package/dist/scaffolding/strategies/nextjs-template.d.ts +12 -0
  228. package/dist/scaffolding/strategies/nextjs-template.d.ts.map +1 -0
  229. package/dist/scaffolding/strategies/nextjs-template.js +122 -0
  230. package/dist/scaffolding/template-renderer.d.ts +11 -0
  231. package/dist/scaffolding/template-renderer.d.ts.map +1 -0
  232. package/dist/scaffolding/template-renderer.js +99 -0
  233. package/dist/scaffolding/types.d.ts +69 -0
  234. package/dist/scaffolding/types.d.ts.map +1 -0
  235. package/dist/scaffolding/types.js +21 -0
  236. package/dist/scaffolding/utils/detect-package-manager.d.ts +23 -0
  237. package/dist/scaffolding/utils/detect-package-manager.d.ts.map +1 -0
  238. package/dist/scaffolding/utils/detect-package-manager.js +57 -0
  239. package/dist/scaffolding/utils/fs.d.ts +11 -0
  240. package/dist/scaffolding/utils/fs.d.ts.map +1 -0
  241. package/dist/scaffolding/utils/fs.js +45 -0
  242. package/dist/scaffolding/utils/resolve-para-version.d.ts +7 -0
  243. package/dist/scaffolding/utils/resolve-para-version.d.ts.map +1 -0
  244. package/dist/scaffolding/utils/resolve-para-version.js +21 -0
  245. package/dist/validation/auth-methods.d.ts +14 -0
  246. package/dist/validation/auth-methods.d.ts.map +1 -0
  247. package/dist/validation/auth-methods.js +23 -0
  248. package/dist/validation/cidr.d.ts +11 -0
  249. package/dist/validation/cidr.d.ts.map +1 -0
  250. package/dist/validation/cidr.js +35 -0
  251. package/dist/validation/hex-color.d.ts +7 -0
  252. package/dist/validation/hex-color.d.ts.map +1 -0
  253. package/dist/validation/hex-color.js +10 -0
  254. package/dist/validation/index.d.ts +9 -0
  255. package/dist/validation/index.d.ts.map +1 -0
  256. package/dist/validation/index.js +49 -0
  257. package/dist/validation/native-passkey.d.ts +31 -0
  258. package/dist/validation/native-passkey.d.ts.map +1 -0
  259. package/dist/validation/native-passkey.js +45 -0
  260. package/dist/validation/session-length.d.ts +18 -0
  261. package/dist/validation/session-length.d.ts.map +1 -0
  262. package/dist/validation/session-length.js +30 -0
  263. package/dist/validation/url.d.ts +26 -0
  264. package/dist/validation/url.d.ts.map +1 -0
  265. package/dist/validation/url.js +50 -0
  266. package/dist/validation/wallet-types.d.ts +14 -0
  267. package/dist/validation/wallet-types.d.ts.map +1 -0
  268. package/dist/validation/wallet-types.js +22 -0
  269. package/dist/validation/webhook.d.ts +4 -0
  270. package/dist/validation/webhook.d.ts.map +1 -0
  271. package/dist/validation/webhook.js +33 -0
  272. package/package.json +60 -0
  273. package/templates/expo/_env.example +3 -0
  274. package/templates/expo/_gitignore +48 -0
  275. package/templates/expo/_yarnrc.yml +1 -0
  276. package/templates/expo/app/(auth)/_layout.tsx +12 -0
  277. package/templates/expo/app/(auth)/index.tsx.template +86 -0
  278. package/templates/expo/app/(tabs)/_layout.tsx +16 -0
  279. package/templates/expo/app/(tabs)/index.tsx +112 -0
  280. package/templates/expo/app/(tabs)/send.tsx +111 -0
  281. package/templates/expo/app/_layout.tsx +17 -0
  282. package/templates/expo/app/index.tsx +22 -0
  283. package/templates/expo/app.json.template +32 -0
  284. package/templates/expo/assets/adaptive-icon.png +0 -0
  285. package/templates/expo/assets/favicon.png +0 -0
  286. package/templates/expo/assets/icon.png +0 -0
  287. package/templates/expo/assets/splash.png +0 -0
  288. package/templates/expo/babel.config.cjs +12 -0
  289. package/templates/expo/components/features/AuthForm.tsx.template +138 -0
  290. package/templates/expo/components/features/OAuthButtons.tsx.template +27 -0
  291. package/templates/expo/components/features/index.ts.template +4 -0
  292. package/templates/expo/components/ui/Button.tsx +58 -0
  293. package/templates/expo/components/ui/Card.tsx +11 -0
  294. package/templates/expo/components/ui/Divider.tsx +19 -0
  295. package/templates/expo/components/ui/Input.tsx +23 -0
  296. package/templates/expo/components/ui/WalletCard.tsx +44 -0
  297. package/templates/expo/components/ui/index.ts +5 -0
  298. package/templates/expo/eslint.config.cjs +15 -0
  299. package/templates/expo/global.css +3 -0
  300. package/templates/expo/hooks/useOneClickLogin.ts.template +161 -0
  301. package/templates/expo/hooks/useViemClient.ts +118 -0
  302. package/templates/expo/hooks/useWallets.ts +52 -0
  303. package/templates/expo/index.js +2 -0
  304. package/templates/expo/lib/auth.ts +54 -0
  305. package/templates/expo/lib/constants.ts.template +2 -0
  306. package/templates/expo/lib/para.ts +14 -0
  307. package/templates/expo/metro.config.cjs +14 -0
  308. package/templates/expo/nativewind-env.d.ts +2 -0
  309. package/templates/expo/prettier.config.cjs +10 -0
  310. package/templates/expo/providers/ParaProvider.tsx +140 -0
  311. package/templates/expo/tailwind.config.cjs +23 -0
  312. package/templates/expo/tsconfig.json +11 -0
  313. package/templates/expo/types/index.ts +28 -0
  314. package/templates/nextjs/README.md +69 -0
  315. package/templates/nextjs/_env.example +8 -0
  316. package/templates/nextjs/_gitignore +36 -0
  317. package/templates/nextjs/_yarnrc.yml +1 -0
  318. package/templates/nextjs/eslint.config.mjs +10 -0
  319. package/templates/nextjs/next.config.ts +5 -0
  320. package/templates/nextjs/postcss.config.mjs +7 -0
  321. package/templates/nextjs/public/para.svg +3 -0
  322. package/templates/nextjs/src/app/layout.tsx +30 -0
  323. package/templates/nextjs/src/app/page.tsx +40 -0
  324. package/templates/nextjs/src/components/ParaProvider.tsx +116 -0
  325. package/templates/nextjs/src/components/layout/Header.tsx +44 -0
  326. package/templates/nextjs/src/components/ui/ConnectCard.tsx +24 -0
  327. package/templates/nextjs/src/components/ui/SignMessage.tsx +53 -0
  328. package/templates/nextjs/src/components/ui/WalletInfo.tsx +22 -0
  329. package/templates/nextjs/src/hooks/useSignHelloWorld.ts +23 -0
  330. package/templates/nextjs/src/styles/globals.css +1 -0
  331. package/templates/nextjs/tsconfig.json +27 -0
@@ -0,0 +1,587 @@
1
+ import path from "node:path";
2
+ import { spawn } from "node:child_process";
3
+ import pc from "picocolors";
4
+ import { getGlobalOptions, createFormatter, helpText } from "../cli.js";
5
+ import { scaffold } from "../scaffolding/scaffolder.js";
6
+ import { getStrategy, getAvailableTemplates, hasTemplate } from "../scaffolding/strategies/index.js";
7
+ import { pathExists, removeDir, readFile, writeFile } from "../scaffolding/utils/fs.js";
8
+ import { getWalletsForNetwork, EVM_WALLETS, SOLANA_WALLETS, COSMOS_WALLETS } from "../scaffolding/types.js";
9
+ const ALL_VALID_WALLETS = /* @__PURE__ */ new Set([...EVM_WALLETS, ...SOLANA_WALLETS, ...COSMOS_WALLETS]);
10
+ import {
11
+ detectPackageManager,
12
+ isValidPackageManager,
13
+ getInstallCommand,
14
+ getRunCommand
15
+ } from "../scaffolding/utils/detect-package-manager.js";
16
+ import { confirm, text, select, multiselect, p } from "../output/prompts.js";
17
+ import { ensureAuthenticated } from "../auth/session-manager.js";
18
+ import { resolveConfig } from "../config/config-manager.js";
19
+ import { ParaApiClient } from "../api/client.js";
20
+ import { maskSecret } from "../output/mask.js";
21
+ function validateAppName(value) {
22
+ if (!value) {
23
+ return "App name is required";
24
+ }
25
+ if (!/^[a-z0-9-]+$/.test(value)) {
26
+ return "App name must be lowercase letters, numbers, and hyphens only";
27
+ }
28
+ if (value.startsWith("-") || value.endsWith("-")) {
29
+ return "App name cannot start or end with a hyphen";
30
+ }
31
+ return void 0;
32
+ }
33
+ function formatWalletName(wallet) {
34
+ const names = {
35
+ METAMASK: "MetaMask",
36
+ COINBASE: "Coinbase Wallet",
37
+ WALLETCONNECT: "WalletConnect",
38
+ RAINBOW: "Rainbow",
39
+ ZERION: "Zerion",
40
+ RABBY: "Rabby",
41
+ PHANTOM: "Phantom",
42
+ BACKPACK: "Backpack",
43
+ SOLFLARE: "Solflare",
44
+ GLOW: "Glow",
45
+ KEPLR: "Keplr",
46
+ LEAP: "Leap"
47
+ };
48
+ return names[wallet] || wallet;
49
+ }
50
+ async function runPrompts(providedName, providedTemplate, packageManager = "npm") {
51
+ let appName;
52
+ if (providedName) {
53
+ const err = validateAppName(providedName);
54
+ if (!err) {
55
+ appName = providedName;
56
+ } else {
57
+ appName = await text("What is your app name?", {
58
+ placeholder: "my-para-app",
59
+ initialValue: providedName,
60
+ validate: validateAppName
61
+ });
62
+ }
63
+ } else {
64
+ appName = await text("What is your app name?", {
65
+ placeholder: "my-para-app",
66
+ validate: validateAppName
67
+ });
68
+ }
69
+ let templateId;
70
+ if (providedTemplate && hasTemplate(providedTemplate)) {
71
+ templateId = providedTemplate;
72
+ } else {
73
+ const templates = getAvailableTemplates();
74
+ templateId = await select(
75
+ "Which framework?",
76
+ templates.map((t) => ({
77
+ value: t.id,
78
+ label: t.name,
79
+ hint: t.hint
80
+ }))
81
+ );
82
+ }
83
+ const networks = templateId === "expo" ? ["evm"] : await multiselect(
84
+ "Which networks do you want to support?",
85
+ [
86
+ { value: "evm", label: "EVM", hint: "Ethereum, Polygon, Base, etc." },
87
+ { value: "solana", label: "Solana" },
88
+ { value: "cosmos", label: "Cosmos", hint: "CosmosHub, Osmosis, etc." }
89
+ ],
90
+ { required: true, initialValues: ["evm"] }
91
+ );
92
+ const authMethodValues = await multiselect(
93
+ "Which authentication methods?",
94
+ [
95
+ { value: "email", label: "Email", hint: "recommended" },
96
+ { value: "phone", label: "Phone / SMS" },
97
+ { value: "oauth", label: "OAuth", hint: "Google, Apple, Twitter, etc." }
98
+ ],
99
+ { required: true, initialValues: ["email"] }
100
+ );
101
+ const authMethods = {
102
+ email: authMethodValues.includes("email"),
103
+ phone: authMethodValues.includes("phone"),
104
+ oauth: authMethodValues.includes("oauth")
105
+ };
106
+ const allOAuthOptions = [
107
+ { value: "GOOGLE", label: "Google", hint: "recommended" },
108
+ { value: "APPLE", label: "Apple" },
109
+ { value: "TWITTER", label: "Twitter / X" },
110
+ { value: "DISCORD", label: "Discord" },
111
+ { value: "FACEBOOK", label: "Facebook" },
112
+ { value: "FARCASTER", label: "Farcaster" }
113
+ ];
114
+ const expoOAuthProviders = /* @__PURE__ */ new Set(["GOOGLE", "APPLE"]);
115
+ const oauthOptions = templateId === "expo" ? allOAuthOptions.filter((o) => expoOAuthProviders.has(o.value)) : allOAuthOptions;
116
+ const oauthProviders = authMethods.oauth ? await multiselect("Which OAuth providers?", oauthOptions, { required: true, initialValues: ["GOOGLE"] }) : [];
117
+ let externalWallets = [];
118
+ if (templateId !== "expo") {
119
+ const availableWallets = networks.flatMap(getWalletsForNetwork);
120
+ if (availableWallets.length > 0) {
121
+ const walletOptions = availableWallets.map((wallet) => {
122
+ let hint = "";
123
+ if (["METAMASK", "COINBASE", "WALLETCONNECT", "RAINBOW", "ZERION", "RABBY"].includes(wallet)) {
124
+ hint = "EVM";
125
+ } else if (["PHANTOM", "BACKPACK", "SOLFLARE", "GLOW"].includes(wallet)) {
126
+ hint = "Solana";
127
+ } else if (["KEPLR", "LEAP"].includes(wallet)) {
128
+ hint = "Cosmos";
129
+ }
130
+ return { value: wallet, label: formatWalletName(wallet), hint };
131
+ });
132
+ externalWallets = await multiselect("Which external wallets? (optional)", walletOptions);
133
+ }
134
+ }
135
+ let templateSpecificConfig = {};
136
+ if (templateId === "expo") {
137
+ const sanitized = appName.toLowerCase().replace(/[^a-z0-9]/g, "");
138
+ const suggested = `com.mycompany.${sanitized}`;
139
+ const expoStrategy = getStrategy("expo");
140
+ const bundleId = await text("Bundle identifier (iOS & Android)?", {
141
+ placeholder: suggested,
142
+ initialValue: suggested,
143
+ validate: (v) => expoStrategy.validateBundleId(v)
144
+ });
145
+ templateSpecificConfig = { bundleId };
146
+ }
147
+ const baseConfig = {
148
+ appName,
149
+ template: templateId,
150
+ networks,
151
+ authMethods: {
152
+ ...authMethods,
153
+ oauthProviders
154
+ },
155
+ externalWallets,
156
+ packageManager
157
+ };
158
+ const config = { ...baseConfig, ...templateSpecificConfig };
159
+ const strategy = getStrategy(templateId);
160
+ const validationError = strategy.validateConfig(config);
161
+ if (validationError) {
162
+ throw new Error(`Configuration validation failed: ${validationError}`);
163
+ }
164
+ return config;
165
+ }
166
+ function buildConfigFromArgs(appName, opts, packageManager) {
167
+ const template = opts.template ?? "nextjs";
168
+ if (!hasTemplate(template)) {
169
+ throw new Error(`Unknown template: ${template}. Available: nextjs, expo`);
170
+ }
171
+ if (template === "expo") {
172
+ if (!opts.bundleId) {
173
+ throw new Error("--bundle-id is required for Expo template");
174
+ }
175
+ const expoStrategy = getStrategy("expo");
176
+ const bundleIdError = expoStrategy.validateBundleId(opts.bundleId);
177
+ if (bundleIdError) {
178
+ throw new Error(`Invalid bundle ID: ${bundleIdError}`);
179
+ }
180
+ if (opts.networks && opts.networks.split(",").some((n) => n !== "evm")) {
181
+ console.log(pc.yellow("Warning: Expo template only supports EVM. Other networks will be ignored."));
182
+ }
183
+ if (opts.wallets) {
184
+ console.log(pc.yellow("Warning: Expo template does not support external wallets. --wallets will be ignored."));
185
+ }
186
+ } else {
187
+ if (!opts.networks) {
188
+ throw new Error("--networks is required in non-interactive mode");
189
+ }
190
+ }
191
+ const parsedNetworks = template === "expo" ? ["evm"] : opts.networks?.split(",") ?? [];
192
+ const parsedOAuth = opts.oauth ? opts.oauth.split(",") : [];
193
+ let parsedWallets = [];
194
+ if (template !== "expo" && opts.wallets) {
195
+ const raw = opts.wallets.split(",").map((w) => w.trim().toUpperCase());
196
+ const invalid = raw.filter((w) => !ALL_VALID_WALLETS.has(w));
197
+ if (invalid.length > 0) {
198
+ throw new Error(`Invalid wallet(s): ${invalid.join(", ")}. Valid values: ${[...ALL_VALID_WALLETS].join(", ")}`);
199
+ }
200
+ parsedWallets = raw;
201
+ }
202
+ const hasEmail = opts.email ?? (!opts.phone && parsedOAuth.length === 0);
203
+ const hasPhone = opts.phone ?? false;
204
+ const hasOAuth = parsedOAuth.length > 0;
205
+ const baseConfig = {
206
+ appName,
207
+ template,
208
+ networks: parsedNetworks,
209
+ authMethods: {
210
+ email: hasEmail,
211
+ phone: hasPhone,
212
+ oauth: hasOAuth,
213
+ oauthProviders: parsedOAuth
214
+ },
215
+ externalWallets: parsedWallets,
216
+ packageManager
217
+ };
218
+ if (template === "expo") {
219
+ return {
220
+ ...baseConfig,
221
+ template: "expo",
222
+ bundleId: opts.bundleId
223
+ };
224
+ }
225
+ return {
226
+ ...baseConfig,
227
+ template: "nextjs"
228
+ };
229
+ }
230
+ function runCommand(command, args, cwd) {
231
+ return new Promise((resolve, reject) => {
232
+ const child = spawn(command, args, {
233
+ cwd,
234
+ stdio: "pipe",
235
+ shell: false
236
+ });
237
+ let stderr = "";
238
+ child.stderr?.on("data", (data) => {
239
+ stderr += data.toString();
240
+ });
241
+ child.on("close", (code) => {
242
+ if (code === 0) {
243
+ resolve();
244
+ } else {
245
+ reject(new Error(`Command failed with code ${code}: ${stderr}`));
246
+ }
247
+ });
248
+ child.on("error", (error) => {
249
+ reject(error);
250
+ });
251
+ });
252
+ }
253
+ async function runPostScaffold(config, silent) {
254
+ const projectDir = path.join(process.cwd(), config.appName);
255
+ const pm = config.packageManager;
256
+ const [installCmd, installArgs] = getInstallCommand(pm);
257
+ if (silent) {
258
+ console.log(pc.cyan("Installing dependencies..."));
259
+ try {
260
+ await runCommand(installCmd, installArgs, projectDir);
261
+ console.log(pc.green("\u2713"), "Dependencies installed!");
262
+ } catch {
263
+ console.log(pc.yellow("\u26A0"), `Could not install dependencies. Run \`${pm} install\` manually.`);
264
+ }
265
+ return;
266
+ }
267
+ const shouldInstall = await confirm("Install dependencies now?");
268
+ if (shouldInstall) {
269
+ const s = p.spinner();
270
+ s.start(`Installing dependencies with ${pm}...`);
271
+ try {
272
+ await runCommand(installCmd, installArgs, projectDir);
273
+ s.stop("Dependencies installed!");
274
+ } catch {
275
+ s.stop("Failed to install dependencies");
276
+ p.log.warn(`Could not install dependencies automatically. Please run \`${pm} install\` manually.`);
277
+ }
278
+ }
279
+ }
280
+ function getStartCommand(config) {
281
+ const script = config.template === "expo" ? "start" : "dev";
282
+ return getRunCommand(config.packageManager, script);
283
+ }
284
+ function getEnvVarName(config) {
285
+ return config.template === "expo" ? "EXPO_PUBLIC_PARA_API_KEY" : "NEXT_PUBLIC_PARA_API_KEY";
286
+ }
287
+ function isNonInteractive(appName, opts) {
288
+ if (!appName) return false;
289
+ const template = opts.template ?? "nextjs";
290
+ if (template === "expo") {
291
+ return !!opts.bundleId;
292
+ }
293
+ return !!opts.networks;
294
+ }
295
+ const CREATE_NEW = "__create_new__";
296
+ async function connectProjectApiKey(targetDir, scaffoldConfig, opts, silent) {
297
+ try {
298
+ const session = await ensureAuthenticated(opts.environment);
299
+ if (!silent) {
300
+ const shouldConnect = await confirm(
301
+ `Signed in as ${session.email || session.userId}. Connect to a Para project to auto-configure your API key?`
302
+ );
303
+ if (!shouldConnect) return false;
304
+ }
305
+ const client = new ParaApiClient({
306
+ environment: opts.environment,
307
+ sessionId: session.sessionId
308
+ });
309
+ const config = await resolveConfig(opts);
310
+ let userId = session.userId;
311
+ if (!userId) {
312
+ const status = await client.getAuthStatus();
313
+ if (!status.userId) return false;
314
+ userId = status.userId;
315
+ }
316
+ const orgs = await client.getOrganizations(userId);
317
+ if (orgs.length === 0) return false;
318
+ let orgId;
319
+ if (orgs.length === 1) {
320
+ orgId = orgs[0].id;
321
+ if (!silent) p.log.info(`Using organization ${orgs[0].name}`);
322
+ } else if (silent) {
323
+ orgId = config.organizationId || orgs[0].id;
324
+ } else {
325
+ orgId = await select(
326
+ "Select organization:",
327
+ orgs.map((o) => ({
328
+ value: o.id,
329
+ label: o.name,
330
+ hint: o.id === config.organizationId ? "(active)" : void 0
331
+ }))
332
+ );
333
+ }
334
+ const projects = await client.getProjects(orgId);
335
+ const activeProjects = projects.filter((proj) => !proj.archived);
336
+ let projectId;
337
+ if (silent) {
338
+ projectId = config.projectId || activeProjects[0]?.id || "";
339
+ if (!projectId) return false;
340
+ } else {
341
+ const projectOptions = [
342
+ ...activeProjects.map((proj) => ({
343
+ value: proj.id,
344
+ label: proj.name,
345
+ hint: proj.id === config.projectId ? "(active)" : void 0
346
+ })),
347
+ { value: CREATE_NEW, label: "+ Create a new project", hint: void 0 }
348
+ ];
349
+ if (activeProjects.length === 0) {
350
+ projectId = CREATE_NEW;
351
+ } else if (activeProjects.length === 1) {
352
+ projectId = activeProjects[0].id;
353
+ p.log.info(`Using project ${activeProjects[0].name}`);
354
+ } else {
355
+ projectId = await select("Select project:", projectOptions);
356
+ }
357
+ if (projectId === CREATE_NEW) {
358
+ const projectName = await text("Project name:", {
359
+ placeholder: scaffoldConfig.appName,
360
+ initialValue: scaffoldConfig.appName,
361
+ validate: (v) => {
362
+ if (!v.trim()) return "Name is required.";
363
+ }
364
+ });
365
+ const newProject = await client.createProject(orgId, {
366
+ name: projectName,
367
+ framework: scaffoldConfig.template
368
+ });
369
+ projectId = newProject.id;
370
+ p.log.success(`Created project "${newProject.name}"`);
371
+ }
372
+ }
373
+ const keys = await client.getApiKeys(orgId, projectId, opts.environment);
374
+ const activeKeys = keys.filter((k) => !k.archived);
375
+ let apiKeyValue;
376
+ if (silent) {
377
+ if (activeKeys.length === 0) return false;
378
+ apiKeyValue = activeKeys[0].apiKey;
379
+ } else {
380
+ const keyOptions = [
381
+ ...activeKeys.map((k) => ({
382
+ value: k.apiKey,
383
+ label: k.displayName || k.name,
384
+ hint: maskSecret(k.apiKey)
385
+ })),
386
+ { value: CREATE_NEW, label: "+ Create a new key", hint: void 0 }
387
+ ];
388
+ if (activeKeys.length === 0) {
389
+ apiKeyValue = CREATE_NEW;
390
+ } else if (activeKeys.length === 1) {
391
+ apiKeyValue = activeKeys[0].apiKey;
392
+ p.log.info(`Using API key ${activeKeys[0].displayName || activeKeys[0].name}`);
393
+ } else {
394
+ apiKeyValue = await select("Select API key:", keyOptions);
395
+ }
396
+ if (apiKeyValue === CREATE_NEW) {
397
+ const keyName = await text("Key name:", {
398
+ placeholder: `${scaffoldConfig.appName}-key`,
399
+ initialValue: `${scaffoldConfig.appName}-key`,
400
+ validate: (v) => {
401
+ if (!v.trim()) return "Name is required.";
402
+ }
403
+ });
404
+ const newKey = await client.createApiKey(orgId, projectId, opts.environment, { name: keyName });
405
+ apiKeyValue = newKey.apiKey;
406
+ p.log.success(`Created API key "${keyName}"`);
407
+ }
408
+ }
409
+ const envExamplePath = path.join(targetDir, ".env.example");
410
+ const envPath = path.join(targetDir, ".env");
411
+ const envContent = await readFile(envExamplePath);
412
+ const envWithKey = envContent.replaceAll("your_api_key_here", apiKeyValue).replace(/PARA_ENVIRONMENT=\w+/, `PARA_ENVIRONMENT=${opts.environment}`);
413
+ await writeFile(envPath, envWithKey);
414
+ if (silent) {
415
+ console.log(pc.green("\u2713"), "API key written to .env");
416
+ } else {
417
+ p.log.success("API key written to .env");
418
+ }
419
+ return true;
420
+ } catch {
421
+ if (!silent) {
422
+ p.log.warn("Could not connect API key. You can add it manually to .env.");
423
+ }
424
+ return false;
425
+ }
426
+ }
427
+ function registerCreateCommand(program) {
428
+ program.command("create").description("Scaffold a new Para-powered application").argument("[app-name]", "Name of the application").option("-t, --template <template>", "Template to use (nextjs, expo)").option("--networks <networks>", "Comma-separated networks (evm, solana, cosmos)").option("--email", "Enable email authentication").option("--phone", "Enable phone authentication").option("--oauth <providers>", "Comma-separated OAuth providers").option("--wallets <wallets>", "Comma-separated wallet types").option("--bundle-id <id>", "Bundle ID (for Expo)").option("--package-manager <pm>", "Package manager to use (npm, yarn, pnpm, bun)").option("--skip-install", "Skip dependency installation").option("-y, --yes", "Accept all defaults (non-interactive)").addHelpText(
429
+ "after",
430
+ helpText(`Examples:
431
+ $ para create Walks you through template, networks, auth, and wallets
432
+ $ para create my-app Start interactive with a name pre-filled
433
+ $ para create my-app -t nextjs --networks evm --email Fully non-interactive
434
+ $ para create my-app -t expo --bundle-id com.co.app Expo app (bundle ID required)
435
+
436
+ Generates a ready-to-run project with Para SDK, auth, and wallet support wired up.`)
437
+ ).action(async (appName, cmdOpts, cmd) => {
438
+ const opts = await getGlobalOptions(cmd);
439
+ const formatter = createFormatter(opts);
440
+ if (cmdOpts.packageManager && !isValidPackageManager(cmdOpts.packageManager)) {
441
+ formatter.error(`Invalid package manager: "${cmdOpts.packageManager}". Must be one of: npm, yarn, pnpm, bun`);
442
+ process.exit(1);
443
+ }
444
+ const packageManager = detectPackageManager(cmdOpts.packageManager);
445
+ let config;
446
+ if (isNonInteractive(appName, cmdOpts)) {
447
+ console.log(pc.cyan("@getpara/cli create"), pc.dim("(non-interactive mode)"));
448
+ console.log();
449
+ try {
450
+ config = buildConfigFromArgs(appName, cmdOpts, packageManager);
451
+ } catch (error) {
452
+ formatter.error(error.message);
453
+ console.log(pc.dim("Run with --help for usage information."));
454
+ process.exit(1);
455
+ }
456
+ console.log(pc.dim("Configuration:"));
457
+ console.log(pc.dim(` Template: ${config.template}`));
458
+ console.log(pc.dim(` App name: ${config.appName}`));
459
+ console.log(pc.dim(` Package manager: ${config.packageManager}`));
460
+ if (config.template === "expo") {
461
+ console.log(pc.dim(` Bundle ID: ${config.bundleId}`));
462
+ }
463
+ console.log(pc.dim(` Networks: ${config.networks.join(", ")}`));
464
+ console.log(
465
+ pc.dim(
466
+ ` Auth: ${[
467
+ config.authMethods.email && "email",
468
+ config.authMethods.phone && "phone",
469
+ config.authMethods.oauth && `oauth(${config.authMethods.oauthProviders.join(",")})`
470
+ ].filter(Boolean).join(", ")}`
471
+ )
472
+ );
473
+ if (config.externalWallets.length > 0) {
474
+ console.log(pc.dim(` Wallets: ${config.externalWallets.join(", ")}`));
475
+ }
476
+ console.log();
477
+ } else {
478
+ console.log();
479
+ p.intro(pc.bgCyan(pc.black(" @getpara/cli create ")));
480
+ try {
481
+ p.log.info(`Using ${pc.cyan(packageManager)} as package manager`);
482
+ config = await runPrompts(appName, cmdOpts.template, packageManager);
483
+ } catch (error) {
484
+ if (error instanceof Error && error.message === "cancelled") {
485
+ p.cancel("Operation cancelled.");
486
+ process.exit(0);
487
+ }
488
+ throw error;
489
+ }
490
+ }
491
+ const targetDir = path.join(process.cwd(), config.appName);
492
+ if (await pathExists(targetDir)) {
493
+ if (isNonInteractive(appName, cmdOpts)) {
494
+ if (cmdOpts.yes) {
495
+ console.log(pc.yellow(`Overwriting existing directory: ${config.appName}`));
496
+ await removeDir(targetDir);
497
+ } else {
498
+ formatter.error(`Directory ${config.appName} already exists.`);
499
+ console.log(pc.dim("Use --yes to overwrite."));
500
+ process.exit(1);
501
+ }
502
+ } else {
503
+ const shouldOverwrite = await confirm(`Directory ${pc.cyan(config.appName)} already exists. Overwrite?`);
504
+ if (!shouldOverwrite) {
505
+ p.cancel("Operation cancelled.");
506
+ process.exit(0);
507
+ }
508
+ const s = p.spinner();
509
+ s.start("Removing existing directory...");
510
+ await removeDir(targetDir);
511
+ s.stop("Removed existing directory");
512
+ }
513
+ }
514
+ if (isNonInteractive(appName, cmdOpts)) {
515
+ console.log(pc.cyan("Creating project..."));
516
+ await scaffold(config);
517
+ console.log(pc.green("\u2713"), "Project created!");
518
+ const envWritten = await connectProjectApiKey(targetDir, config, opts, true);
519
+ if (!cmdOpts.skipInstall) {
520
+ await runPostScaffold(config, true);
521
+ }
522
+ console.log();
523
+ console.log(pc.green("Done!"), `Your Para app is ready at ${pc.cyan(config.appName)}`);
524
+ console.log();
525
+ console.log(pc.dim("Next steps:"));
526
+ console.log(` cd ${config.appName}`);
527
+ if (!envWritten) {
528
+ console.log(" cp .env.example .env");
529
+ console.log(` # Add your ${getEnvVarName(config)} to .env`);
530
+ }
531
+ if (cmdOpts.skipInstall) {
532
+ console.log(` ${config.packageManager} install`);
533
+ }
534
+ if (config.template === "expo") {
535
+ console.log(" npx expo prebuild");
536
+ console.log(
537
+ ` ${getRunCommand(config.packageManager, "ios")} # or ${getRunCommand(config.packageManager, "android")}`
538
+ );
539
+ } else {
540
+ console.log(` ${getStartCommand(config)}`);
541
+ }
542
+ console.log();
543
+ } else {
544
+ const s = p.spinner();
545
+ s.start("Creating your Para app...");
546
+ try {
547
+ await scaffold(config);
548
+ s.stop("Project created!");
549
+ const envWritten = await connectProjectApiKey(targetDir, config, opts, false);
550
+ if (!cmdOpts.skipInstall) {
551
+ await runPostScaffold(config, false);
552
+ }
553
+ console.log();
554
+ p.outro(pc.green("Your Para app is ready!"));
555
+ console.log();
556
+ console.log(pc.dim(" Next steps:"));
557
+ console.log();
558
+ console.log(` ${pc.cyan("cd")} ${config.appName}`);
559
+ if (!envWritten) {
560
+ console.log(` ${pc.cyan("cp")} .env.example .env`);
561
+ console.log(` ${pc.dim(`# Add your ${getEnvVarName(config)} to .env`)}`);
562
+ }
563
+ if (config.template === "expo") {
564
+ console.log(` ${pc.cyan("npx")} expo prebuild`);
565
+ const iosCmd = getRunCommand(config.packageManager, "ios");
566
+ const androidCmd = getRunCommand(config.packageManager, "android");
567
+ const iosParts = iosCmd.split(" ");
568
+ console.log(` ${pc.cyan(iosParts[0])} ${iosParts.slice(1).join(" ")} ${pc.dim(`# or ${androidCmd}`)}`);
569
+ } else {
570
+ const parts = getStartCommand(config).split(" ");
571
+ console.log(` ${pc.cyan(parts[0])} ${parts.slice(1).join(" ")}`);
572
+ }
573
+ if (!envWritten) {
574
+ console.log();
575
+ console.log(pc.dim(` Get your API key at ${pc.underline("https://developer.getpara.com")}`));
576
+ }
577
+ console.log();
578
+ } catch (error) {
579
+ s.stop("Failed to create project");
580
+ throw error;
581
+ }
582
+ }
583
+ });
584
+ }
585
+ export {
586
+ registerCreateCommand
587
+ };
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerDoctorCommand(program: Command): void;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6E5D"}
@@ -0,0 +1,67 @@
1
+ import { resolve } from "node:path";
2
+ import pc from "picocolors";
3
+ import { getGlobalOptions, createFormatter, helpText } from "../cli.js";
4
+ import { createContext } from "../diagnostics/context.js";
5
+ import { runChecks } from "../diagnostics/runner.js";
6
+ import { allChecks } from "../diagnostics/checks/index.js";
7
+ function registerDoctorCommand(program) {
8
+ program.command("doctor").description("Diagnose common Para SDK integration issues").argument("[path]", "Project path to diagnose", ".").option("--category <category>", "Filter checks by category").option("--severity <severity>", "Minimum severity (error, warning, info)").addHelpText(
9
+ "after",
10
+ helpText(`Examples:
11
+ $ para doctor Diagnose current directory
12
+ $ para doctor ./my-app Diagnose a specific project
13
+ $ para doctor --category auth Only run auth-related checks
14
+ $ para doctor --severity error Only show errors`)
15
+ ).action(async (projectPath, cmdOpts, cmd) => {
16
+ const opts = await getGlobalOptions(cmd);
17
+ const formatter = createFormatter(opts);
18
+ const absolutePath = resolve(projectPath);
19
+ const context = await createContext(absolutePath);
20
+ const checkOptions = {};
21
+ if (cmdOpts.category) {
22
+ checkOptions.categories = [cmdOpts.category];
23
+ }
24
+ if (cmdOpts.severity) {
25
+ checkOptions.severity = cmdOpts.severity;
26
+ }
27
+ const runResult = await runChecks(allChecks, context, checkOptions);
28
+ if (opts.json) {
29
+ formatter.json({
30
+ projectInfo: {
31
+ framework: context.framework,
32
+ sdkType: context.sdkType,
33
+ sdkVersion: context.sdkVersion || "unknown",
34
+ packageManager: context.packageManager
35
+ },
36
+ results: runResult.results,
37
+ summary: {
38
+ total: runResult.total,
39
+ passed: runResult.passed,
40
+ failed: runResult.failed,
41
+ warnings: runResult.warnings
42
+ }
43
+ });
44
+ formatter.flush();
45
+ } else {
46
+ console.log("");
47
+ console.log(`Project: ${context.framework} + ${context.sdkType}`);
48
+ console.log("");
49
+ for (const result of runResult.results) {
50
+ const icon = result.passed ? pc.green("\u2713") : result.severity === "error" ? pc.red("\u2717") : pc.yellow("\u26A0");
51
+ console.log(` ${icon} ${result.message}`);
52
+ if (!result.passed && result.recommendation) {
53
+ console.log(pc.dim(` \u2192 ${result.recommendation}`));
54
+ }
55
+ }
56
+ console.log("");
57
+ console.log(
58
+ `${runResult.passed}/${runResult.total} checks passed` + (runResult.failed ? `, ${pc.red(`${runResult.failed} errors`)}` : "") + (runResult.warnings ? `, ${pc.yellow(`${runResult.warnings} warnings`)}` : "")
59
+ );
60
+ }
61
+ const hasFailures = runResult.results.some((r) => !r.passed && r.severity === "error");
62
+ if (hasFailures) process.exit(1);
63
+ });
64
+ }
65
+ export {
66
+ registerDoctorCommand
67
+ };
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerInitCommand(program: Command): void;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+C1D"}