@l4yercak3/cli 1.3.1 → 2.0.0-alpha.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 (357) hide show
  1. package/README.md +10 -220
  2. package/dist/api/client.d.ts +12 -0
  3. package/dist/api/client.d.ts.map +1 -0
  4. package/dist/api/client.js +37 -0
  5. package/dist/api/client.js.map +1 -0
  6. package/dist/api/platform.d.ts +161 -0
  7. package/dist/api/platform.d.ts.map +1 -0
  8. package/dist/api/platform.js +70 -0
  9. package/dist/api/platform.js.map +1 -0
  10. package/dist/bin/sevenlayers.d.ts +3 -0
  11. package/dist/bin/sevenlayers.d.ts.map +1 -0
  12. package/dist/bin/sevenlayers.js +198 -0
  13. package/dist/bin/sevenlayers.js.map +1 -0
  14. package/dist/commands/agent/catalog.d.ts +5 -0
  15. package/dist/commands/agent/catalog.d.ts.map +1 -0
  16. package/dist/commands/agent/catalog.js +142 -0
  17. package/dist/commands/agent/catalog.js.map +1 -0
  18. package/dist/commands/agent/drift.d.ts +5 -0
  19. package/dist/commands/agent/drift.d.ts.map +1 -0
  20. package/dist/commands/agent/drift.js +113 -0
  21. package/dist/commands/agent/drift.js.map +1 -0
  22. package/dist/commands/agent/init.d.ts +5 -0
  23. package/dist/commands/agent/init.d.ts.map +1 -0
  24. package/dist/commands/agent/init.js +75 -0
  25. package/dist/commands/agent/init.js.map +1 -0
  26. package/dist/commands/agent/permissions.d.ts +5 -0
  27. package/dist/commands/agent/permissions.d.ts.map +1 -0
  28. package/dist/commands/agent/permissions.js +88 -0
  29. package/dist/commands/agent/permissions.js.map +1 -0
  30. package/dist/commands/agent/runner.d.ts +14 -0
  31. package/dist/commands/agent/runner.d.ts.map +1 -0
  32. package/dist/commands/agent/runner.js +59 -0
  33. package/dist/commands/agent/runner.js.map +1 -0
  34. package/dist/commands/agent/shared.d.ts +13 -0
  35. package/dist/commands/agent/shared.d.ts.map +1 -0
  36. package/dist/commands/agent/shared.js +31 -0
  37. package/dist/commands/agent/shared.js.map +1 -0
  38. package/dist/commands/agent/template.d.ts +5 -0
  39. package/dist/commands/agent/template.d.ts.map +1 -0
  40. package/dist/commands/agent/template.js +104 -0
  41. package/dist/commands/agent/template.js.map +1 -0
  42. package/dist/commands/app/connect.d.ts +7 -0
  43. package/dist/commands/app/connect.d.ts.map +1 -0
  44. package/dist/commands/app/connect.js +12 -0
  45. package/dist/commands/app/connect.js.map +1 -0
  46. package/dist/commands/app/init.d.ts +7 -0
  47. package/dist/commands/app/init.d.ts.map +1 -0
  48. package/dist/commands/app/init.js +12 -0
  49. package/dist/commands/app/init.js.map +1 -0
  50. package/dist/commands/app/link.d.ts +3 -0
  51. package/dist/commands/app/link.d.ts.map +1 -0
  52. package/dist/commands/app/link.js +92 -0
  53. package/dist/commands/app/link.js.map +1 -0
  54. package/dist/commands/app/pages.d.ts +15 -0
  55. package/dist/commands/app/pages.d.ts.map +1 -0
  56. package/dist/commands/app/pages.js +180 -0
  57. package/dist/commands/app/pages.js.map +1 -0
  58. package/dist/commands/app/register.d.ts +3 -0
  59. package/dist/commands/app/register.d.ts.map +1 -0
  60. package/dist/commands/app/register.js +120 -0
  61. package/dist/commands/app/register.js.map +1 -0
  62. package/dist/commands/app/remote.d.ts +14 -0
  63. package/dist/commands/app/remote.d.ts.map +1 -0
  64. package/dist/commands/app/remote.js +44 -0
  65. package/dist/commands/app/remote.js.map +1 -0
  66. package/dist/commands/app/setup.d.ts +3 -0
  67. package/dist/commands/app/setup.d.ts.map +1 -0
  68. package/dist/commands/app/setup.js +299 -0
  69. package/dist/commands/app/setup.js.map +1 -0
  70. package/dist/commands/app/shared.d.ts +9 -0
  71. package/dist/commands/app/shared.d.ts.map +1 -0
  72. package/dist/commands/app/shared.js +122 -0
  73. package/dist/commands/app/shared.js.map +1 -0
  74. package/dist/commands/app/sync.d.ts +7 -0
  75. package/dist/commands/app/sync.d.ts.map +1 -0
  76. package/dist/commands/app/sync.js +107 -0
  77. package/dist/commands/app/sync.js.map +1 -0
  78. package/dist/commands/booking/check.d.ts +3 -0
  79. package/dist/commands/booking/check.d.ts.map +1 -0
  80. package/dist/commands/booking/check.js +68 -0
  81. package/dist/commands/booking/check.js.map +1 -0
  82. package/dist/commands/booking/setup.d.ts +3 -0
  83. package/dist/commands/booking/setup.d.ts.map +1 -0
  84. package/dist/commands/booking/setup.js +95 -0
  85. package/dist/commands/booking/setup.js.map +1 -0
  86. package/dist/commands/booking/shared.d.ts +31 -0
  87. package/dist/commands/booking/shared.d.ts.map +1 -0
  88. package/dist/commands/booking/shared.js +112 -0
  89. package/dist/commands/booking/shared.js.map +1 -0
  90. package/dist/commands/booking/smoke.d.ts +3 -0
  91. package/dist/commands/booking/smoke.d.ts.map +1 -0
  92. package/dist/commands/booking/smoke.js +101 -0
  93. package/dist/commands/booking/smoke.js.map +1 -0
  94. package/dist/commands/cms/bind.d.ts +3 -0
  95. package/dist/commands/cms/bind.d.ts.map +1 -0
  96. package/dist/commands/cms/bind.js +212 -0
  97. package/dist/commands/cms/bind.js.map +1 -0
  98. package/dist/commands/cms/content.d.ts +40 -0
  99. package/dist/commands/cms/content.d.ts.map +1 -0
  100. package/dist/commands/cms/content.js +169 -0
  101. package/dist/commands/cms/content.js.map +1 -0
  102. package/dist/commands/cms/doctor.d.ts +3 -0
  103. package/dist/commands/cms/doctor.d.ts.map +1 -0
  104. package/dist/commands/cms/doctor.js +69 -0
  105. package/dist/commands/cms/doctor.js.map +1 -0
  106. package/dist/commands/cms/migrate.d.ts +3 -0
  107. package/dist/commands/cms/migrate.d.ts.map +1 -0
  108. package/dist/commands/cms/migrate.js +78 -0
  109. package/dist/commands/cms/migrate.js.map +1 -0
  110. package/dist/commands/cms/registry.d.ts +3 -0
  111. package/dist/commands/cms/registry.d.ts.map +1 -0
  112. package/dist/commands/cms/registry.js +161 -0
  113. package/dist/commands/cms/registry.js.map +1 -0
  114. package/dist/commands/cms/seed.d.ts +3 -0
  115. package/dist/commands/cms/seed.d.ts.map +1 -0
  116. package/dist/commands/cms/seed.js +102 -0
  117. package/dist/commands/cms/seed.js.map +1 -0
  118. package/dist/commands/cms/shared.d.ts +22 -0
  119. package/dist/commands/cms/shared.d.ts.map +1 -0
  120. package/dist/commands/cms/shared.js +82 -0
  121. package/dist/commands/cms/shared.js.map +1 -0
  122. package/dist/commands/doctor/target.d.ts +3 -0
  123. package/dist/commands/doctor/target.d.ts.map +1 -0
  124. package/dist/commands/doctor/target.js +46 -0
  125. package/dist/commands/doctor/target.js.map +1 -0
  126. package/dist/commands/env/list.d.ts +3 -0
  127. package/dist/commands/env/list.d.ts.map +1 -0
  128. package/dist/commands/env/list.js +28 -0
  129. package/dist/commands/env/list.js.map +1 -0
  130. package/dist/commands/env/set.d.ts +3 -0
  131. package/dist/commands/env/set.d.ts.map +1 -0
  132. package/dist/commands/env/set.js +36 -0
  133. package/dist/commands/env/set.js.map +1 -0
  134. package/dist/commands/env/use.d.ts +3 -0
  135. package/dist/commands/env/use.d.ts.map +1 -0
  136. package/dist/commands/env/use.js +15 -0
  137. package/dist/commands/env/use.js.map +1 -0
  138. package/dist/commands/legacy/connect.d.ts +3 -0
  139. package/dist/commands/legacy/connect.d.ts.map +1 -0
  140. package/dist/commands/legacy/connect.js +8 -0
  141. package/dist/commands/legacy/connect.js.map +1 -0
  142. package/dist/commands/legacy/pages.d.ts +3 -0
  143. package/dist/commands/legacy/pages.d.ts.map +1 -0
  144. package/dist/commands/legacy/pages.js +16 -0
  145. package/dist/commands/legacy/pages.js.map +1 -0
  146. package/dist/commands/legacy/spread.d.ts +3 -0
  147. package/dist/commands/legacy/spread.d.ts.map +1 -0
  148. package/dist/commands/legacy/spread.js +8 -0
  149. package/dist/commands/legacy/spread.js.map +1 -0
  150. package/dist/commands/legacy/sync.d.ts +3 -0
  151. package/dist/commands/legacy/sync.d.ts.map +1 -0
  152. package/dist/commands/legacy/sync.js +8 -0
  153. package/dist/commands/legacy/sync.js.map +1 -0
  154. package/dist/config/env-diff.d.ts +10 -0
  155. package/dist/config/env-diff.d.ts.map +1 -0
  156. package/dist/config/env-diff.js +24 -0
  157. package/dist/config/env-diff.js.map +1 -0
  158. package/dist/config/env-parser.d.ts +20 -0
  159. package/dist/config/env-parser.d.ts.map +1 -0
  160. package/dist/config/env-parser.js +70 -0
  161. package/dist/config/env-parser.js.map +1 -0
  162. package/dist/config/env-writer.d.ts +22 -0
  163. package/dist/config/env-writer.d.ts.map +1 -0
  164. package/dist/config/env-writer.js +172 -0
  165. package/dist/config/env-writer.js.map +1 -0
  166. package/dist/config/profile-store.d.ts +29 -0
  167. package/dist/config/profile-store.d.ts.map +1 -0
  168. package/dist/config/profile-store.js +257 -0
  169. package/dist/config/profile-store.js.map +1 -0
  170. package/dist/core/args.d.ts +11 -0
  171. package/dist/core/args.d.ts.map +1 -0
  172. package/dist/core/args.js +106 -0
  173. package/dist/core/args.js.map +1 -0
  174. package/dist/core/colors.d.ts +6 -0
  175. package/dist/core/colors.d.ts.map +1 -0
  176. package/dist/core/colors.js +29 -0
  177. package/dist/core/colors.js.map +1 -0
  178. package/dist/safety/target-guard.d.ts +16 -0
  179. package/dist/safety/target-guard.d.ts.map +1 -0
  180. package/dist/safety/target-guard.js +55 -0
  181. package/dist/safety/target-guard.js.map +1 -0
  182. package/dist/testing/booking-smoke.d.ts +17 -0
  183. package/dist/testing/booking-smoke.d.ts.map +1 -0
  184. package/dist/testing/booking-smoke.js +43 -0
  185. package/dist/testing/booking-smoke.js.map +1 -0
  186. package/dist/tests/agent-commands.test.d.ts +2 -0
  187. package/dist/tests/agent-commands.test.d.ts.map +1 -0
  188. package/dist/tests/agent-commands.test.js +180 -0
  189. package/dist/tests/agent-commands.test.js.map +1 -0
  190. package/dist/tests/agent-governance.test.d.ts +2 -0
  191. package/dist/tests/agent-governance.test.d.ts.map +1 -0
  192. package/dist/tests/agent-governance.test.js +233 -0
  193. package/dist/tests/agent-governance.test.js.map +1 -0
  194. package/dist/tests/app-commands.test.d.ts +2 -0
  195. package/dist/tests/app-commands.test.d.ts.map +1 -0
  196. package/dist/tests/app-commands.test.js +462 -0
  197. package/dist/tests/app-commands.test.js.map +1 -0
  198. package/dist/tests/booking-commands.test.d.ts +2 -0
  199. package/dist/tests/booking-commands.test.d.ts.map +1 -0
  200. package/dist/tests/booking-commands.test.js +204 -0
  201. package/dist/tests/booking-commands.test.js.map +1 -0
  202. package/dist/tests/booking-smoke.test.d.ts +2 -0
  203. package/dist/tests/booking-smoke.test.d.ts.map +1 -0
  204. package/dist/tests/booking-smoke.test.js +183 -0
  205. package/dist/tests/booking-smoke.test.js.map +1 -0
  206. package/dist/tests/cms-commands.test.d.ts +2 -0
  207. package/dist/tests/cms-commands.test.d.ts.map +1 -0
  208. package/dist/tests/cms-commands.test.js +254 -0
  209. package/dist/tests/cms-commands.test.js.map +1 -0
  210. package/dist/tests/cms-ops.test.d.ts +2 -0
  211. package/dist/tests/cms-ops.test.d.ts.map +1 -0
  212. package/dist/tests/cms-ops.test.js +125 -0
  213. package/dist/tests/cms-ops.test.js.map +1 -0
  214. package/dist/tests/env-writer.test.d.ts +2 -0
  215. package/dist/tests/env-writer.test.d.ts.map +1 -0
  216. package/dist/tests/env-writer.test.js +90 -0
  217. package/dist/tests/env-writer.test.js.map +1 -0
  218. package/dist/tests/profile-store.test.d.ts +2 -0
  219. package/dist/tests/profile-store.test.d.ts.map +1 -0
  220. package/dist/tests/profile-store.test.js +88 -0
  221. package/dist/tests/profile-store.test.js.map +1 -0
  222. package/dist/tests/target-guard.test.d.ts +2 -0
  223. package/dist/tests/target-guard.test.d.ts.map +1 -0
  224. package/dist/tests/target-guard.test.js +132 -0
  225. package/dist/tests/target-guard.test.js.map +1 -0
  226. package/dist/ui/logo.d.ts +2 -0
  227. package/dist/ui/logo.d.ts.map +1 -0
  228. package/dist/ui/logo.js +22 -0
  229. package/dist/ui/logo.js.map +1 -0
  230. package/package.json +17 -53
  231. package/.claude/settings.local.json +0 -36
  232. package/.cursor/rules.md +0 -203
  233. package/.eslintrc.js +0 -31
  234. package/CLAUDE.md +0 -100
  235. package/bin/cli.js +0 -116
  236. package/docs/ADDING_FRAMEWORK_DETECTORS.md +0 -391
  237. package/docs/ADDING_NEW_PROJECT_TYPE.md +0 -156
  238. package/docs/ARCHITECTURE_RELATIONSHIPS.md +0 -411
  239. package/docs/CLI_AUTHENTICATION.md +0 -214
  240. package/docs/CLI_PAGE_DETECTION_REQUIREMENTS.md +0 -519
  241. package/docs/CRM-PIPELINES-SEQUENCES-SPEC.md +0 -429
  242. package/docs/DETECTOR_ARCHITECTURE.md +0 -326
  243. package/docs/DEVELOPMENT.md +0 -194
  244. package/docs/IMPLEMENTATION_PHASES.md +0 -468
  245. package/docs/INTEGRATION_PATHS_ARCHITECTURE.md +0 -1543
  246. package/docs/OAUTH_CLARIFICATION.md +0 -258
  247. package/docs/OAUTH_SETUP_GUIDE_TEMPLATE.md +0 -211
  248. package/docs/PHASE_0_PROGRESS.md +0 -120
  249. package/docs/PHASE_1_COMPLETE.md +0 -366
  250. package/docs/PHASE_SUMMARY.md +0 -149
  251. package/docs/PLAN.md +0 -511
  252. package/docs/README.md +0 -56
  253. package/docs/STRIPE_INTEGRATION.md +0 -447
  254. package/docs/SUMMARY.md +0 -230
  255. package/docs/UPDATED_PLAN.md +0 -447
  256. package/docs/mcp_server/MCP_EXTENSION_GUIDE.md +0 -1313
  257. package/docs/mcp_server/MCP_SERVER_ARCHITECTURE.md +0 -1481
  258. package/docs/mcp_server/applicationOntology.ts +0 -817
  259. package/docs/mcp_server/cliApplications.ts +0 -639
  260. package/docs/mcp_server/crmOntology.ts +0 -1063
  261. package/docs/mcp_server/eventOntology.ts +0 -1183
  262. package/docs/mcp_server/formsOntology.ts +0 -1401
  263. package/docs/mcp_server/ontologySchemas.ts +0 -185
  264. package/docs/mcp_server/schema.ts +0 -250
  265. package/docs/microsass_production_machine/CLI_API_REFERENCE.md +0 -1197
  266. package/docs/microsass_production_machine/CLI_PRODUCT_VISION.md +0 -676
  267. package/docs/microsass_production_machine/CLI_REQUIREMENTS.md +0 -606
  268. package/docs/microsass_production_machine/CONNECTED_APPLICATIONS_SPEC.md +0 -390
  269. package/docs/microsass_production_machine/IMPLEMENTATION_ROADMAP.md +0 -725
  270. package/docs/microsass_production_machine/OBJECT_MAPPINGS.md +0 -808
  271. package/docs/microsass_production_machine/REFERENCE_IMPLEMENTATION.md +0 -532
  272. package/src/api/backend-client.js +0 -449
  273. package/src/commands/api-keys.js +0 -119
  274. package/src/commands/connect.js +0 -243
  275. package/src/commands/login.js +0 -332
  276. package/src/commands/logout.js +0 -30
  277. package/src/commands/mcp-server.js +0 -85
  278. package/src/commands/mcp-setup.js +0 -686
  279. package/src/commands/pages.js +0 -317
  280. package/src/commands/scaffold.js +0 -409
  281. package/src/commands/spread.js +0 -861
  282. package/src/commands/status.js +0 -62
  283. package/src/commands/sync.js +0 -169
  284. package/src/commands/upgrade.js +0 -48
  285. package/src/config/config-manager.js +0 -206
  286. package/src/detectors/api-client-detector.js +0 -85
  287. package/src/detectors/base-detector.js +0 -77
  288. package/src/detectors/database-detector.js +0 -245
  289. package/src/detectors/expo-detector.js +0 -166
  290. package/src/detectors/github-detector.js +0 -74
  291. package/src/detectors/index.js +0 -106
  292. package/src/detectors/mapping-suggestor.js +0 -119
  293. package/src/detectors/model-detector.js +0 -318
  294. package/src/detectors/nextjs-detector.js +0 -139
  295. package/src/detectors/oauth-detector.js +0 -122
  296. package/src/detectors/page-detector.js +0 -480
  297. package/src/detectors/registry.js +0 -121
  298. package/src/generators/api-client-generator.js +0 -223
  299. package/src/generators/api-only/client.js +0 -683
  300. package/src/generators/api-only/index.js +0 -96
  301. package/src/generators/api-only/types.js +0 -618
  302. package/src/generators/api-only/webhooks.js +0 -377
  303. package/src/generators/env-generator.js +0 -191
  304. package/src/generators/expo-auth-generator.js +0 -1009
  305. package/src/generators/gitignore-generator.js +0 -92
  306. package/src/generators/index.js +0 -166
  307. package/src/generators/manifest-generator.js +0 -154
  308. package/src/generators/mcp-guide-generator.js +0 -256
  309. package/src/generators/nextauth-generator.js +0 -247
  310. package/src/generators/oauth-guide-generator.js +0 -277
  311. package/src/generators/quickstart/components/index.js +0 -1699
  312. package/src/generators/quickstart/components-mobile/index.js +0 -1440
  313. package/src/generators/quickstart/database/convex.js +0 -1257
  314. package/src/generators/quickstart/database/index.js +0 -34
  315. package/src/generators/quickstart/database/supabase.js +0 -1132
  316. package/src/generators/quickstart/hooks/index.js +0 -1065
  317. package/src/generators/quickstart/index.js +0 -191
  318. package/src/generators/quickstart/pages/index.js +0 -1466
  319. package/src/generators/quickstart/screens/index.js +0 -1498
  320. package/src/logo.js +0 -116
  321. package/src/mcp/auth.js +0 -127
  322. package/src/mcp/registry/domains/applications.js +0 -516
  323. package/src/mcp/registry/domains/benefits.js +0 -798
  324. package/src/mcp/registry/domains/codegen.js +0 -894
  325. package/src/mcp/registry/domains/core.js +0 -324
  326. package/src/mcp/registry/domains/crm.js +0 -591
  327. package/src/mcp/registry/domains/events.js +0 -649
  328. package/src/mcp/registry/domains/forms.js +0 -696
  329. package/src/mcp/registry/index.js +0 -164
  330. package/src/mcp/server.js +0 -116
  331. package/src/utils/file-utils.js +0 -117
  332. package/src/utils/init-helpers.js +0 -243
  333. package/src/utils/prompt-utils.js +0 -195
  334. package/templates/CLAUDE.md +0 -86
  335. package/tests/api-client-detector.test.js +0 -214
  336. package/tests/api-client-generator.test.js +0 -176
  337. package/tests/backend-client.test.js +0 -640
  338. package/tests/base-detector.test.js +0 -101
  339. package/tests/commands/login.test.js +0 -143
  340. package/tests/commands/logout.test.js +0 -84
  341. package/tests/commands/status.test.js +0 -167
  342. package/tests/config-manager.test.js +0 -321
  343. package/tests/database-detector.test.js +0 -221
  344. package/tests/detector-index.test.js +0 -209
  345. package/tests/detector-registry.test.js +0 -93
  346. package/tests/env-generator.test.js +0 -278
  347. package/tests/expo-detector.test.js +0 -263
  348. package/tests/file-utils.test.js +0 -194
  349. package/tests/generators-index.test.js +0 -454
  350. package/tests/github-detector.test.js +0 -145
  351. package/tests/gitignore-generator.test.js +0 -109
  352. package/tests/logo.test.js +0 -96
  353. package/tests/nextauth-generator.test.js +0 -255
  354. package/tests/nextjs-detector.test.js +0 -235
  355. package/tests/oauth-detector.test.js +0 -264
  356. package/tests/oauth-guide-generator.test.js +0 -273
  357. package/tests/page-detector.test.js +0 -371
@@ -1,449 +0,0 @@
1
- /**
2
- * Backend API Client
3
- * Handles communication with L4YERCAK3 backend API
4
- */
5
-
6
- const crypto = require('crypto');
7
- const fetch = require('node-fetch');
8
- const configManager = require('../config/config-manager');
9
-
10
- // API Base URL - All CLI API endpoints go through Convex HTTP (Production)
11
- const API_BASE_URL = 'https://agreeable-lion-828.convex.site';
12
-
13
- // App URL - Only used for browser login page (Next.js serves the OAuth UI)
14
- const APP_URL = 'https://app.l4yercak3.com';
15
-
16
- class BackendClient {
17
- constructor() {
18
- this.baseUrl = API_BASE_URL;
19
- this.appUrl = APP_URL;
20
- }
21
-
22
- /**
23
- * Generate a cryptographically secure state token for CSRF protection
24
- */
25
- generateState() {
26
- return crypto.randomBytes(32).toString('hex');
27
- }
28
-
29
- /**
30
- * Get headers for API requests
31
- */
32
- getHeaders() {
33
- const session = configManager.getSession();
34
- const headers = {
35
- 'Content-Type': 'application/json',
36
- };
37
-
38
- if (session && session.token) {
39
- headers['Authorization'] = `Bearer ${session.token}`;
40
- }
41
-
42
- return headers;
43
- }
44
-
45
- /**
46
- * Make API request
47
- * All CLI API endpoints go through the Convex HTTP base URL
48
- * Returns response data with error details preserved for specific handling
49
- */
50
- async request(method, endpoint, data = null) {
51
- const url = `${this.baseUrl}${endpoint}`;
52
- const headers = this.getHeaders();
53
- const options = {
54
- method,
55
- headers,
56
- };
57
-
58
- if (data && (method === 'POST' || method === 'PUT' || method === 'PATCH')) {
59
- options.body = JSON.stringify(data);
60
- }
61
-
62
- // Debug logging - enable with L4YERCAK3_DEBUG=1
63
- if (process.env.L4YERCAK3_DEBUG) {
64
- console.log('\n[DEBUG] API Request:');
65
- console.log(` URL: ${url}`);
66
- console.log(` Method: ${method}`);
67
- console.log(` Headers: ${JSON.stringify(headers, null, 2)}`);
68
- if (options.body) {
69
- console.log(` Body: ${options.body}`);
70
- }
71
- }
72
-
73
- try {
74
- const response = await fetch(url, options);
75
-
76
- // Debug: log raw response info
77
- if (process.env.L4YERCAK3_DEBUG) {
78
- console.log('[DEBUG] API Response:');
79
- console.log(` Status: ${response.status} ${response.statusText}`);
80
- console.log(` Headers: ${JSON.stringify(Object.fromEntries(response.headers.entries()), null, 2)}`);
81
- }
82
-
83
- const responseData = await response.json();
84
-
85
- if (process.env.L4YERCAK3_DEBUG) {
86
- console.log(` Body: ${JSON.stringify(responseData, null, 2)}\n`);
87
- }
88
-
89
- if (!response.ok) {
90
- // Create error with additional details from backend
91
- const error = new Error(responseData.message || responseData.error || `API request failed: ${response.status}`);
92
- error.code = responseData.code || 'UNKNOWN_ERROR';
93
- error.suggestion = responseData.suggestion || null;
94
- error.upgradeUrl = responseData.upgradeUrl || null;
95
- error.upgradeCommand = responseData.upgradeCommand || null;
96
- error.status = response.status;
97
- throw error;
98
- }
99
-
100
- return responseData;
101
- } catch (error) {
102
- if (process.env.L4YERCAK3_DEBUG) {
103
- console.log(`[DEBUG] Request error: ${error.message}`);
104
- }
105
- if (error.message.includes('fetch')) {
106
- throw new Error(`Network error: Could not connect to backend at ${this.baseUrl}`);
107
- }
108
- throw error;
109
- }
110
- }
111
-
112
- /**
113
- * Validate CLI session
114
- */
115
- async validateSession() {
116
- try {
117
- return await this.request('GET', '/api/v1/auth/cli/validate');
118
- } catch (error) {
119
- return null;
120
- }
121
- }
122
-
123
- /**
124
- * Refresh CLI session
125
- */
126
- async refreshSession() {
127
- try {
128
- const session = configManager.getSession();
129
- if (!session || !session.token) {
130
- throw new Error('No session to refresh');
131
- }
132
-
133
- const response = await this.request('POST', '/api/v1/auth/cli/refresh', {
134
- token: session.token,
135
- });
136
-
137
- // Update session
138
- configManager.saveSession({
139
- ...session,
140
- token: response.token,
141
- expiresAt: response.expiresAt,
142
- });
143
-
144
- return response;
145
- } catch (error) {
146
- configManager.clearSession();
147
- throw error;
148
- }
149
- }
150
-
151
- /**
152
- * Revoke CLI session (logout on backend)
153
- * This cleans up the session from the database
154
- */
155
- async revokeSession() {
156
- try {
157
- const session = configManager.getSession();
158
- if (!session || !session.token) {
159
- return { success: true }; // Nothing to revoke
160
- }
161
-
162
- return await this.request('POST', '/api/v1/auth/cli/revoke');
163
- } catch (error) {
164
- // Even if revoke fails, we'll clear locally
165
- // Log but don't throw - user still wants to logout
166
- console.error('Warning: Could not revoke session on backend:', error.message);
167
- return { success: false, error: error.message };
168
- }
169
- }
170
-
171
- /**
172
- * Get CLI login URL with state parameter for CSRF protection
173
- * Browser login is served by Next.js at APP_URL (not the Convex API URL)
174
- * @param {string} state - The state token generated by the CLI
175
- * @param {string|null} provider - Optional OAuth provider for direct auth
176
- * @returns {string} The login URL
177
- */
178
- getLoginUrl(state, provider = null) {
179
- // Use port 3333 to avoid conflicts with Next.js dev server (port 3000)
180
- const callbackUrl = 'http://localhost:3333/callback';
181
-
182
- if (provider) {
183
- // Direct OAuth provider URL
184
- return `${this.appUrl}/api/auth/oauth-signup?provider=${provider}&sessionType=cli&state=${state}&callback=${encodeURIComponent(callbackUrl)}`;
185
- } else {
186
- // Provider selection page
187
- return `${this.appUrl}/auth/cli-login?state=${state}&callback=${encodeURIComponent(callbackUrl)}`;
188
- }
189
- }
190
-
191
- /**
192
- * List API keys for an organization
193
- * Returns: { keys, limit, currentCount, canCreateMore, limitDescription }
194
- */
195
- async listApiKeys(organizationId) {
196
- return await this.request('GET', `/api/v1/auth/cli/api-keys?organizationId=${organizationId}`);
197
- }
198
-
199
- /**
200
- * Generate API key for organization
201
- */
202
- async generateApiKey(organizationId, name, scopes = ['*']) {
203
- return await this.request('POST', `/api/v1/auth/cli/api-keys`, {
204
- organizationId,
205
- name,
206
- scopes,
207
- });
208
- }
209
-
210
- /**
211
- * Get organizations for current user
212
- */
213
- async getOrganizations() {
214
- return await this.request('GET', '/api/v1/auth/cli/organizations');
215
- }
216
-
217
- /**
218
- * Create organization
219
- */
220
- async createOrganization(name) {
221
- return await this.request('POST', '/api/v1/auth/cli/organizations', {
222
- name,
223
- });
224
- }
225
-
226
- // ============================================
227
- // Connected Applications API
228
- // ============================================
229
-
230
- /**
231
- * Check if an application already exists for this project path
232
- * @param {string} organizationId - The organization ID
233
- * @param {string} projectPathHash - SHA256 hash of the project path
234
- * @returns {Promise<{found: boolean, application?: object}>}
235
- */
236
- async checkExistingApplication(organizationId, projectPathHash) {
237
- try {
238
- return await this.request(
239
- 'GET',
240
- `/api/v1/cli/applications/by-path?organizationId=${organizationId}&hash=${projectPathHash}`
241
- );
242
- } catch (error) {
243
- // If 404, no existing app found
244
- if (error.status === 404) {
245
- return { found: false };
246
- }
247
- throw error;
248
- }
249
- }
250
-
251
- /**
252
- * Register a new connected application
253
- * @param {object} data - Application registration data
254
- * @returns {Promise<{applicationId: string, apiKey?: object, backendUrl: string}>}
255
- */
256
- async registerApplication(data) {
257
- return await this.request('POST', '/api/v1/cli/applications', data);
258
- }
259
-
260
- /**
261
- * Update an existing connected application
262
- * @param {string} applicationId - The application ID
263
- * @param {object} updates - Fields to update
264
- * @returns {Promise<object>}
265
- */
266
- async updateApplication(applicationId, updates) {
267
- return await this.request('PATCH', `/api/v1/cli/applications/${applicationId}`, updates);
268
- }
269
-
270
- /**
271
- * Get application details
272
- * @param {string} applicationId - The application ID
273
- * @returns {Promise<object>}
274
- */
275
- async getApplication(applicationId) {
276
- return await this.request('GET', `/api/v1/cli/applications/${applicationId}`);
277
- }
278
-
279
- /**
280
- * List all connected applications for an organization
281
- * @param {string} organizationId - The organization ID
282
- * @returns {Promise<{applications: object[]}>}
283
- */
284
- async listApplications(organizationId) {
285
- return await this.request('GET', `/api/v1/cli/applications?organizationId=${organizationId}`);
286
- }
287
-
288
- /**
289
- * Sync application data
290
- * @param {string} applicationId - The application ID
291
- * @param {object} syncData - Sync configuration (direction, models)
292
- * @returns {Promise<object>}
293
- */
294
- async syncApplication(applicationId, syncData) {
295
- return await this.request('POST', `/api/v1/cli/applications/${applicationId}/sync`, syncData);
296
- }
297
-
298
- // ============================================
299
- // Activity Protocol / Page Detection API
300
- // ============================================
301
-
302
- /**
303
- * Bulk register pages for an application
304
- * @param {string} applicationId - The application ID
305
- * @param {Array<{path: string, name: string, pageType?: string}>} pages - Pages to register
306
- * @returns {Promise<{success: boolean, results: Array, total: number, created: number, updated: number}>}
307
- */
308
- async bulkRegisterPages(applicationId, pages) {
309
- return await this.request('POST', '/api/v1/activity/pages/bulk', {
310
- applicationId,
311
- pages,
312
- });
313
- }
314
-
315
- /**
316
- * Register a single page
317
- * @param {string} applicationId - The application ID
318
- * @param {object} pageData - Page data
319
- * @returns {Promise<{success: boolean, pageId: string, created: boolean}>}
320
- */
321
- async registerPage(applicationId, pageData) {
322
- return await this.request('POST', '/api/v1/activity/pages', {
323
- applicationId,
324
- ...pageData,
325
- });
326
- }
327
-
328
- /**
329
- * Get all pages for an application
330
- * @param {string} applicationId - The application ID
331
- * @param {object} options - Query options (status)
332
- * @returns {Promise<{success: boolean, pages: Array, total: number}>}
333
- */
334
- async getApplicationPages(applicationId, options = {}) {
335
- let url = `/api/v1/activity/pages?applicationId=${applicationId}`;
336
- if (options.status) {
337
- url += `&status=${options.status}`;
338
- }
339
- return await this.request('GET', url);
340
- }
341
-
342
- /**
343
- * Log an activity event
344
- * @param {string} applicationId - The application ID
345
- * @param {object} eventData - Event data
346
- * @returns {Promise<{success: boolean, eventId: string, timestamp: number}>}
347
- */
348
- async logActivityEvent(applicationId, eventData) {
349
- return await this.request('POST', '/api/v1/activity/events', {
350
- applicationId,
351
- ...eventData,
352
- });
353
- }
354
-
355
- /**
356
- * Get activity events for an application
357
- * @param {string} applicationId - The application ID
358
- * @param {object} options - Query options (severity, category, limit)
359
- * @returns {Promise<{success: boolean, events: Array, hasMore: boolean, nextCursor: string|null}>}
360
- */
361
- async getActivityEvents(applicationId, options = {}) {
362
- let url = `/api/v1/activity/events?applicationId=${applicationId}`;
363
- if (options.severity) {
364
- url += `&severity=${options.severity}`;
365
- }
366
- if (options.category) {
367
- url += `&category=${options.category}`;
368
- }
369
- if (options.limit) {
370
- url += `&limit=${options.limit}`;
371
- }
372
- return await this.request('GET', url);
373
- }
374
-
375
- /**
376
- * Get activity statistics for an application
377
- * @param {string} applicationId - The application ID
378
- * @param {string} timeRange - Time range ('1h', '24h', '7d')
379
- * @returns {Promise<{success: boolean, stats: object}>}
380
- */
381
- async getActivityStats(applicationId, timeRange = '24h') {
382
- return await this.request(
383
- 'GET',
384
- `/api/v1/activity/stats?applicationId=${applicationId}&timeRange=${timeRange}`
385
- );
386
- }
387
-
388
- /**
389
- * Get activity settings for an application
390
- * @param {string} applicationId - The application ID
391
- * @returns {Promise<object>}
392
- */
393
- async getActivitySettings(applicationId) {
394
- return await this.request('GET', `/api/v1/activity/settings?applicationId=${applicationId}`);
395
- }
396
-
397
- /**
398
- * Update activity settings for an application
399
- * @param {string} applicationId - The application ID
400
- * @param {object} settings - Settings to update
401
- * @returns {Promise<object>}
402
- */
403
- async updateActivitySettings(applicationId, settings) {
404
- return await this.request('PATCH', '/api/v1/activity/settings', {
405
- applicationId,
406
- ...settings,
407
- });
408
- }
409
-
410
- // ============================================
411
- // Repository Connection API
412
- // ============================================
413
-
414
- /**
415
- * Connect a GitHub repository to a connected application
416
- * Triggers repo analysis on the platform side
417
- * @param {string} applicationId - The application ID
418
- * @param {object} repoData - Repository connection data
419
- * @param {string} repoData.repoUrl - Full GitHub repo URL
420
- * @param {string} repoData.branch - Branch to analyze (e.g., 'main')
421
- * @param {string} [repoData.githubConnectionId] - Optional GitHub OAuth connection ID
422
- * @returns {Promise<object>}
423
- */
424
- async connectRepo(applicationId, repoData) {
425
- return await this.request(
426
- 'POST',
427
- `/api/v1/cli/applications/${applicationId}/connect-repo`,
428
- repoData
429
- );
430
- }
431
-
432
- /**
433
- * Sync project manifest data to the platform
434
- * Pushes the .l4yercak3.json content for platform-side analysis
435
- * @param {string} applicationId - The application ID
436
- * @param {object} manifest - The manifest object from .l4yercak3.json
437
- * @returns {Promise<object>}
438
- */
439
- async syncManifest(applicationId, manifest) {
440
- return await this.request(
441
- 'POST',
442
- `/api/v1/cli/applications/${applicationId}/sync-manifest`,
443
- manifest
444
- );
445
- }
446
- }
447
-
448
- module.exports = new BackendClient();
449
-
@@ -1,119 +0,0 @@
1
- /**
2
- * API Keys Command
3
- * List and manage API keys for organizations
4
- */
5
-
6
- const configManager = require('../config/config-manager');
7
- const backendClient = require('../api/backend-client');
8
- const inquirer = require('inquirer');
9
- const chalk = require('chalk');
10
-
11
- /**
12
- * API Keys list command handler
13
- */
14
- async function handleApiKeysList() {
15
- // Check if logged in
16
- if (!configManager.isLoggedIn()) {
17
- console.log(chalk.yellow(' ⚠️ You must be logged in first'));
18
- console.log(chalk.gray('\n Run "l4yercak3 login" to authenticate\n'));
19
- process.exit(1);
20
- }
21
-
22
- console.log(chalk.cyan(' 🔑 API Keys\n'));
23
-
24
- try {
25
- // Get organizations
26
- const orgsResponse = await backendClient.getOrganizations();
27
- const organizations = Array.isArray(orgsResponse)
28
- ? orgsResponse
29
- : orgsResponse.organizations || orgsResponse.data || [];
30
-
31
- if (organizations.length === 0) {
32
- console.log(chalk.yellow(' ⚠️ No organizations found'));
33
- console.log(chalk.gray('\n Run "l4yercak3 spread" to create an organization\n'));
34
- return;
35
- }
36
-
37
- // Select organization if multiple
38
- let organizationId;
39
- let organizationName;
40
-
41
- if (organizations.length === 1) {
42
- organizationId = organizations[0].id;
43
- organizationName = organizations[0].name;
44
- } else {
45
- const { orgChoice } = await inquirer.prompt([
46
- {
47
- type: 'list',
48
- name: 'orgChoice',
49
- message: 'Select organization:',
50
- choices: organizations.map(org => ({
51
- name: `${org.name} (${org.id})`,
52
- value: org.id,
53
- })),
54
- },
55
- ]);
56
- organizationId = orgChoice;
57
- organizationName = organizations.find(org => org.id === orgChoice)?.name;
58
- }
59
-
60
- console.log(chalk.gray(` Organization: ${organizationName}\n`));
61
-
62
- // List API keys
63
- const keysResponse = await backendClient.listApiKeys(organizationId);
64
- const keys = keysResponse.keys || [];
65
-
66
- if (keys.length === 0) {
67
- console.log(chalk.yellow(' No API keys found for this organization'));
68
- console.log(chalk.gray('\n Run "l4yercak3 spread" to generate an API key\n'));
69
- return;
70
- }
71
-
72
- // Display keys
73
- console.log(chalk.green(` Found ${keys.length} API key(s):\n`));
74
-
75
- keys.forEach((key, i) => {
76
- const maskedKey = key.key ? `${key.key.substring(0, 15)}...` : '[hidden]';
77
- const name = key.name || `Key ${i + 1}`;
78
- const created = key.createdAt ? new Date(key.createdAt).toLocaleDateString() : 'Unknown';
79
-
80
- console.log(chalk.white(` ${i + 1}. ${name}`));
81
- console.log(chalk.gray(` Key: ${maskedKey}`));
82
- console.log(chalk.gray(` Created: ${created}`));
83
- if (key.scopes) {
84
- console.log(chalk.gray(` Scopes: ${key.scopes.join(', ')}`));
85
- }
86
- console.log('');
87
- });
88
-
89
- // Show limit info
90
- if (keysResponse.limitDescription) {
91
- console.log(chalk.gray(` Limit: ${keysResponse.limitDescription}`));
92
- }
93
- if (keysResponse.canCreateMore !== undefined) {
94
- if (keysResponse.canCreateMore) {
95
- console.log(chalk.green(` ✅ You can create more API keys`));
96
- } else {
97
- console.log(chalk.yellow(` ⚠️ You've reached your API key limit`));
98
- console.log(chalk.gray(' Upgrade at: https://app.l4yercak3.com?openWindow=store'));
99
- }
100
- }
101
- console.log('');
102
-
103
- } catch (error) {
104
- if (error.code === 'SESSION_EXPIRED') {
105
- console.log(chalk.red(`\n ❌ Session expired. Please run "l4yercak3 login" again.\n`));
106
- } else if (error.code === 'NOT_AUTHORIZED') {
107
- console.log(chalk.red(`\n ❌ You don't have permission to view API keys for this organization.\n`));
108
- } else {
109
- console.error(chalk.red(` ❌ Error listing API keys: ${error.message}\n`));
110
- }
111
- process.exit(1);
112
- }
113
- }
114
-
115
- module.exports = {
116
- command: 'api-keys',
117
- description: 'List API keys for your organizations',
118
- handler: handleApiKeysList,
119
- };