@nio-cli/cli 0.1.0 → 0.2.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 (382) hide show
  1. package/README.md +332 -139
  2. package/dist/adapters/docker/docker-gateway.js +100 -0
  3. package/dist/adapters/docker/docker-gateway.js.map +1 -0
  4. package/dist/adapters/ide/ide-gateway.js +50 -0
  5. package/dist/adapters/ide/ide-gateway.js.map +1 -0
  6. package/dist/adapters/lang/knowledge-store.js +97 -0
  7. package/dist/adapters/lang/knowledge-store.js.map +1 -0
  8. package/dist/adapters/lang/language-catalog.js +86 -0
  9. package/dist/adapters/lang/language-catalog.js.map +1 -0
  10. package/dist/adapters/lang/package-map.js +98 -0
  11. package/dist/adapters/lang/package-map.js.map +1 -0
  12. package/dist/adapters/lang/project-detector.js +40 -0
  13. package/dist/adapters/lang/project-detector.js.map +1 -0
  14. package/dist/adapters/lang/repos.js +8 -0
  15. package/dist/adapters/lang/repos.js.map +1 -0
  16. package/dist/adapters/lang/scaffold-gateway.js +135 -0
  17. package/dist/adapters/lang/scaffold-gateway.js.map +1 -0
  18. package/dist/adapters/lang/vendor.js +52 -0
  19. package/dist/adapters/lang/vendor.js.map +1 -0
  20. package/dist/adapters/pg/auth-session-repository.js +41 -0
  21. package/dist/adapters/pg/auth-session-repository.js.map +1 -0
  22. package/dist/adapters/pg/client.js +74 -0
  23. package/dist/adapters/pg/client.js.map +1 -0
  24. package/dist/adapters/pg/dependency-event-repository.js +40 -0
  25. package/dist/adapters/pg/dependency-event-repository.js.map +1 -0
  26. package/dist/adapters/pg/login-challenge-repository.js +54 -0
  27. package/dist/adapters/pg/login-challenge-repository.js.map +1 -0
  28. package/dist/adapters/pg/session-repository.js +70 -0
  29. package/dist/adapters/pg/session-repository.js.map +1 -0
  30. package/dist/adapters/pg/user-repository.js +71 -0
  31. package/dist/adapters/pg/user-repository.js.map +1 -0
  32. package/dist/adapters/pkg/toolchain-gateway.js +35 -0
  33. package/dist/adapters/pkg/toolchain-gateway.js.map +1 -0
  34. package/dist/adapters/skills/recipe-catalog.js +84 -0
  35. package/dist/adapters/skills/recipe-catalog.js.map +1 -0
  36. package/dist/adapters/sms/http-generic.js +50 -0
  37. package/dist/adapters/sms/http-generic.js.map +1 -0
  38. package/dist/app/dependency-watcher.js +87 -0
  39. package/dist/app/dependency-watcher.js.map +1 -0
  40. package/dist/app/docker-manager.js +110 -0
  41. package/dist/app/docker-manager.js.map +1 -0
  42. package/dist/app/environment-builder.js +73 -0
  43. package/dist/app/environment-builder.js.map +1 -0
  44. package/dist/app/language-configurator.js +30 -0
  45. package/dist/app/language-configurator.js.map +1 -0
  46. package/dist/app/session-manager.js +124 -0
  47. package/dist/app/session-manager.js.map +1 -0
  48. package/dist/brand.js +3 -61
  49. package/dist/brand.js.map +1 -1
  50. package/dist/cli/commands/agents.js +30 -0
  51. package/dist/cli/commands/agents.js.map +1 -0
  52. package/dist/cli/commands/auth.js +122 -90
  53. package/dist/cli/commands/auth.js.map +1 -1
  54. package/dist/cli/commands/clean.js +1 -13
  55. package/dist/cli/commands/clean.js.map +1 -1
  56. package/dist/cli/commands/command.js +58 -0
  57. package/dist/cli/commands/command.js.map +1 -0
  58. package/dist/cli/commands/completion.js +0 -3
  59. package/dist/cli/commands/completion.js.map +1 -1
  60. package/dist/cli/commands/config.js +41 -0
  61. package/dist/cli/commands/config.js.map +1 -0
  62. package/dist/cli/commands/debug.js +93 -0
  63. package/dist/cli/commands/debug.js.map +1 -0
  64. package/dist/cli/commands/deps.js +94 -0
  65. package/dist/cli/commands/deps.js.map +1 -0
  66. package/dist/cli/commands/docker.js +360 -0
  67. package/dist/cli/commands/docker.js.map +1 -0
  68. package/dist/cli/commands/docs/content.js +199 -0
  69. package/dist/cli/commands/docs/content.js.map +1 -0
  70. package/dist/cli/commands/docs/dynamic.js +42 -0
  71. package/dist/cli/commands/docs/dynamic.js.map +1 -0
  72. package/dist/cli/commands/docs/html.js +108 -0
  73. package/dist/cli/commands/docs/html.js.map +1 -0
  74. package/dist/cli/commands/docs/terminal.js +42 -0
  75. package/dist/cli/commands/docs/terminal.js.map +1 -0
  76. package/dist/cli/commands/docs.js +34 -0
  77. package/dist/cli/commands/docs.js.map +1 -0
  78. package/dist/cli/commands/exec.js +2 -7
  79. package/dist/cli/commands/exec.js.map +1 -1
  80. package/dist/cli/commands/init/auth-step.js +9 -45
  81. package/dist/cli/commands/init/auth-step.js.map +1 -1
  82. package/dist/cli/commands/init/clients-step.js +12 -39
  83. package/dist/cli/commands/init/clients-step.js.map +1 -1
  84. package/dist/cli/commands/init/context-step.js +7 -33
  85. package/dist/cli/commands/init/context-step.js.map +1 -1
  86. package/dist/cli/commands/init/index.js +177 -33
  87. package/dist/cli/commands/init/index.js.map +1 -1
  88. package/dist/cli/commands/init/lang-step.js +40 -0
  89. package/dist/cli/commands/init/lang-step.js.map +1 -0
  90. package/dist/cli/commands/init/profile-step.js +43 -0
  91. package/dist/cli/commands/init/profile-step.js.map +1 -0
  92. package/dist/cli/commands/init/provision-step.js +8 -23
  93. package/dist/cli/commands/init/provision-step.js.map +1 -1
  94. package/dist/cli/commands/init/recipe-step.js +18 -0
  95. package/dist/cli/commands/init/recipe-step.js.map +1 -0
  96. package/dist/cli/commands/lang.js +27 -0
  97. package/dist/cli/commands/lang.js.map +1 -0
  98. package/dist/cli/commands/open.js +51 -0
  99. package/dist/cli/commands/open.js.map +1 -0
  100. package/dist/cli/commands/plan.js +2 -6
  101. package/dist/cli/commands/plan.js.map +1 -1
  102. package/dist/cli/commands/security.js +143 -0
  103. package/dist/cli/commands/security.js.map +1 -0
  104. package/dist/cli/commands/sessions.js +92 -0
  105. package/dist/cli/commands/sessions.js.map +1 -0
  106. package/dist/cli/commands/skills.js +1 -1
  107. package/dist/cli/commands/skills.js.map +1 -1
  108. package/dist/cli/commands/sync.js +52 -58
  109. package/dist/cli/commands/sync.js.map +1 -1
  110. package/dist/cli/commands/validate-plan.js +2 -6
  111. package/dist/cli/commands/validate-plan.js.map +1 -1
  112. package/dist/cli/copy/auth.json +9 -2
  113. package/dist/cli/copy/init.json +2 -6
  114. package/dist/cli/copy.js +0 -8
  115. package/dist/cli/copy.js.map +1 -1
  116. package/dist/cli/flows/clients.js +3 -94
  117. package/dist/cli/flows/clients.js.map +1 -1
  118. package/dist/cli/flows/completion.js +1 -6
  119. package/dist/cli/flows/completion.js.map +1 -1
  120. package/dist/cli/flows/dependencies.js +1 -18
  121. package/dist/cli/flows/dependencies.js.map +1 -1
  122. package/dist/cli/flows/sections.js +2 -10
  123. package/dist/cli/flows/sections.js.map +1 -1
  124. package/dist/cli/flows/user-config.js +5 -10
  125. package/dist/cli/flows/user-config.js.map +1 -1
  126. package/dist/cli/ui/render.js +2 -53
  127. package/dist/cli/ui/render.js.map +1 -1
  128. package/dist/cli/ui/report.js +0 -13
  129. package/dist/cli/ui/report.js.map +1 -1
  130. package/dist/cli.js +23 -0
  131. package/dist/cli.js.map +1 -1
  132. package/dist/config.js +27 -56
  133. package/dist/config.js.map +1 -1
  134. package/dist/core/docker.js +2 -0
  135. package/dist/core/docker.js.map +1 -0
  136. package/dist/core/environment.js +2 -0
  137. package/dist/core/environment.js.map +1 -0
  138. package/dist/core/lang.js +11 -0
  139. package/dist/core/lang.js.map +1 -0
  140. package/dist/core/messaging.js +2 -0
  141. package/dist/core/messaging.js.map +1 -0
  142. package/dist/core/repositories.js +2 -0
  143. package/dist/core/repositories.js.map +1 -0
  144. package/dist/core/types.js +0 -5
  145. package/dist/core/types.js.map +1 -1
  146. package/dist/gateway/config.js +14 -0
  147. package/dist/gateway/config.js.map +1 -0
  148. package/dist/gateway/edge-filter.js +55 -0
  149. package/dist/gateway/edge-filter.js.map +1 -0
  150. package/dist/gateway/index.js +176 -0
  151. package/dist/gateway/index.js.map +1 -0
  152. package/dist/gateway/middleware/auth.js +34 -0
  153. package/dist/gateway/middleware/auth.js.map +1 -0
  154. package/dist/gateway/services/login.js +112 -0
  155. package/dist/gateway/services/login.js.map +1 -0
  156. package/dist/gateway/services/security.js +99 -0
  157. package/dist/gateway/services/security.js.map +1 -0
  158. package/dist/lib/auth/backup-codes.js +46 -0
  159. package/dist/lib/auth/backup-codes.js.map +1 -0
  160. package/dist/lib/auth/gateway-client.js +106 -0
  161. package/dist/lib/auth/gateway-client.js.map +1 -0
  162. package/dist/lib/auth/gateway-token.js +26 -0
  163. package/dist/lib/auth/gateway-token.js.map +1 -0
  164. package/dist/lib/auth/nio-config.js +138 -0
  165. package/dist/lib/auth/nio-config.js.map +1 -0
  166. package/dist/lib/auth/otp.js +23 -0
  167. package/dist/lib/auth/otp.js.map +1 -0
  168. package/dist/lib/auth/password.js +23 -0
  169. package/dist/lib/auth/password.js.map +1 -0
  170. package/dist/lib/auth/session-store.js +49 -0
  171. package/dist/lib/auth/session-store.js.map +1 -0
  172. package/dist/lib/clients/autopull.js +8 -0
  173. package/dist/lib/clients/autopull.js.map +1 -0
  174. package/dist/lib/{client-configs.js → clients/client-configs.js} +99 -34
  175. package/dist/lib/clients/client-configs.js.map +1 -0
  176. package/dist/lib/clients/client-install.js +20 -0
  177. package/dist/lib/clients/client-install.js.map +1 -0
  178. package/dist/lib/{harness.js → clients/harness.js} +1 -16
  179. package/dist/lib/clients/harness.js.map +1 -0
  180. package/dist/lib/{hooks.js → clients/hooks.js} +5 -31
  181. package/dist/lib/clients/hooks.js.map +1 -0
  182. package/dist/lib/{targets.js → clients/targets.js} +17 -53
  183. package/dist/lib/clients/targets.js.map +1 -0
  184. package/dist/lib/colors.js +0 -24
  185. package/dist/lib/colors.js.map +1 -1
  186. package/dist/lib/cowork-extension.js +2 -25
  187. package/dist/lib/cowork-extension.js.map +1 -1
  188. package/dist/lib/{dependencies.js → deps/dependencies.js} +1 -26
  189. package/dist/lib/deps/dependencies.js.map +1 -0
  190. package/dist/lib/deps/dependency-install-project.js +27 -0
  191. package/dist/lib/deps/dependency-install-project.js.map +1 -0
  192. package/dist/lib/{dependency-install.js → deps/dependency-install.js} +10 -35
  193. package/dist/lib/deps/dependency-install.js.map +1 -0
  194. package/dist/lib/deps/dependency-installed.js +64 -0
  195. package/dist/lib/deps/dependency-installed.js.map +1 -0
  196. package/dist/lib/deps/dependency-scan.js +100 -0
  197. package/dist/lib/deps/dependency-scan.js.map +1 -0
  198. package/dist/lib/docker.js +50 -0
  199. package/dist/lib/docker.js.map +1 -0
  200. package/dist/lib/dotfiles.js +57 -0
  201. package/dist/lib/dotfiles.js.map +1 -0
  202. package/dist/lib/{exec-delegate.js → exec/exec-delegate.js} +4 -13
  203. package/dist/lib/exec/exec-delegate.js.map +1 -0
  204. package/dist/lib/{exec-engines.js → exec/exec-engines.js} +1 -10
  205. package/dist/lib/exec/exec-engines.js.map +1 -0
  206. package/dist/lib/{plan-delegate.js → exec/plan-delegate.js} +1 -7
  207. package/dist/lib/exec/plan-delegate.js.map +1 -0
  208. package/dist/lib/{validate-plan-delegate.js → exec/validate-plan-delegate.js} +2 -7
  209. package/dist/lib/exec/validate-plan-delegate.js.map +1 -0
  210. package/dist/lib/load-env.js +15 -0
  211. package/dist/lib/load-env.js.map +1 -0
  212. package/dist/lib/open-url.js +9 -0
  213. package/dist/lib/open-url.js.map +1 -0
  214. package/dist/lib/prompts.js +0 -13
  215. package/dist/lib/prompts.js.map +1 -1
  216. package/dist/lib/{provision-apply.js → provision/provision-apply.js} +4 -30
  217. package/dist/lib/provision/provision-apply.js.map +1 -0
  218. package/dist/lib/{provision-collect.js → provision/provision-collect.js} +0 -9
  219. package/dist/lib/provision/provision-collect.js.map +1 -0
  220. package/dist/lib/{provision.js → provision/provision.js} +4 -17
  221. package/dist/lib/provision/provision.js.map +1 -0
  222. package/dist/lib/{patterns.js → skills/patterns.js} +0 -13
  223. package/dist/lib/skills/patterns.js.map +1 -0
  224. package/dist/lib/{rules.js → skills/rules.js} +0 -22
  225. package/dist/lib/skills/rules.js.map +1 -0
  226. package/dist/lib/skills/sections.js +58 -0
  227. package/dist/lib/skills/sections.js.map +1 -0
  228. package/dist/lib/{skill-serve.js → skills/skill-serve.js} +1 -26
  229. package/dist/lib/skills/skill-serve.js.map +1 -0
  230. package/dist/lib/{skills-cache.js → skills/skills-cache.js} +15 -21
  231. package/dist/lib/skills/skills-cache.js.map +1 -0
  232. package/dist/lib/{skills.js → skills/skills.js} +3 -49
  233. package/dist/lib/skills/skills.js.map +1 -0
  234. package/dist/lib/spinner.js.map +1 -0
  235. package/dist/lib/telemetry.js +3 -20
  236. package/dist/lib/telemetry.js.map +1 -1
  237. package/dist/lib/version-check.js +0 -20
  238. package/dist/lib/version-check.js.map +1 -1
  239. package/dist/matrix-logo.js +0 -10
  240. package/dist/matrix-logo.js.map +1 -1
  241. package/dist/mcp-server-lang.js +39 -0
  242. package/dist/mcp-server-lang.js.map +1 -0
  243. package/dist/mcp-server.js +37 -41
  244. package/dist/mcp-server.js.map +1 -1
  245. package/dist/profiles/analyst.js +10 -0
  246. package/dist/profiles/analyst.js.map +1 -0
  247. package/dist/profiles/bi.js +9 -0
  248. package/dist/profiles/bi.js.map +1 -0
  249. package/dist/profiles/dba.js +21 -0
  250. package/dist/profiles/dba.js.map +1 -0
  251. package/dist/profiles/fullstack.js +9 -0
  252. package/dist/profiles/fullstack.js.map +1 -0
  253. package/dist/profiles/index.js +39 -0
  254. package/dist/profiles/index.js.map +1 -0
  255. package/dist/profiles/mcps.js +23 -0
  256. package/dist/profiles/mcps.js.map +1 -0
  257. package/dist/profiles/qa.js +10 -0
  258. package/dist/profiles/qa.js.map +1 -0
  259. package/dist/profiles/scientist.js +9 -0
  260. package/dist/profiles/scientist.js.map +1 -0
  261. package/dist/profiles/toolchains.js +9 -0
  262. package/dist/profiles/toolchains.js.map +1 -0
  263. package/dist/tools/delegate-exec.js +2 -2
  264. package/dist/tools/delegate-exec.js.map +1 -1
  265. package/dist/tools/env-detect-deps.js +54 -0
  266. package/dist/tools/env-detect-deps.js.map +1 -0
  267. package/dist/tools/env-materialize.js +43 -0
  268. package/dist/tools/env-materialize.js.map +1 -0
  269. package/dist/tools/exec-status.js +1 -1
  270. package/dist/tools/exec-status.js.map +1 -1
  271. package/dist/tools/index.js +12 -32
  272. package/dist/tools/index.js.map +1 -1
  273. package/dist/tools/lang-recipe.js +31 -0
  274. package/dist/tools/lang-recipe.js.map +1 -0
  275. package/dist/tools/lang-reference.js +34 -0
  276. package/dist/tools/lang-reference.js.map +1 -0
  277. package/dist/tools/plan.js +2 -2
  278. package/dist/tools/plan.js.map +1 -1
  279. package/dist/tools/profile-get.js +57 -0
  280. package/dist/tools/profile-get.js.map +1 -0
  281. package/dist/tools/session-activate.js +35 -0
  282. package/dist/tools/session-activate.js.map +1 -0
  283. package/dist/tools/session-create.js +83 -0
  284. package/dist/tools/session-create.js.map +1 -0
  285. package/dist/tools/session-list.js +29 -0
  286. package/dist/tools/session-list.js.map +1 -0
  287. package/dist/tools/session-shared.js +25 -0
  288. package/dist/tools/session-shared.js.map +1 -0
  289. package/dist/tools/validate-plan.js +2 -2
  290. package/dist/tools/validate-plan.js.map +1 -1
  291. package/docker/docker-compose.yml +44 -0
  292. package/package.json +30 -16
  293. package/dist/adapters/supabase/allocation-gateway.js +0 -236
  294. package/dist/adapters/supabase/allocation-gateway.js.map +0 -1
  295. package/dist/adapters/supabase/analytics-gateway.js +0 -18
  296. package/dist/adapters/supabase/analytics-gateway.js.map +0 -1
  297. package/dist/adapters/supabase/client.js +0 -96
  298. package/dist/adapters/supabase/client.js.map +0 -1
  299. package/dist/adapters/supabase/context-gateway.js +0 -23
  300. package/dist/adapters/supabase/context-gateway.js.map +0 -1
  301. package/dist/adapters/supabase/gateway.js +0 -18
  302. package/dist/adapters/supabase/gateway.js.map +0 -1
  303. package/dist/adapters/supabase/task-gateway.js +0 -450
  304. package/dist/adapters/supabase/task-gateway.js.map +0 -1
  305. package/dist/auth.js +0 -118
  306. package/dist/auth.js.map +0 -1
  307. package/dist/cli/commands/init/project-step.js +0 -105
  308. package/dist/cli/commands/init/project-step.js.map +0 -1
  309. package/dist/constants.js +0 -9
  310. package/dist/constants.js.map +0 -1
  311. package/dist/core/ports.js +0 -2
  312. package/dist/core/ports.js.map +0 -1
  313. package/dist/database.types.js +0 -11
  314. package/dist/database.types.js.map +0 -1
  315. package/dist/lib/active-project.js +0 -28
  316. package/dist/lib/active-project.js.map +0 -1
  317. package/dist/lib/autopull.js +0 -13
  318. package/dist/lib/autopull.js.map +0 -1
  319. package/dist/lib/client-configs.js.map +0 -1
  320. package/dist/lib/client-install.js +0 -40
  321. package/dist/lib/client-install.js.map +0 -1
  322. package/dist/lib/dependencies.js.map +0 -1
  323. package/dist/lib/dependency-install.js.map +0 -1
  324. package/dist/lib/exec-delegate.js.map +0 -1
  325. package/dist/lib/exec-engines.js.map +0 -1
  326. package/dist/lib/harness.js.map +0 -1
  327. package/dist/lib/hooks.js.map +0 -1
  328. package/dist/lib/patterns.js.map +0 -1
  329. package/dist/lib/plan-delegate.js.map +0 -1
  330. package/dist/lib/project-context.js +0 -151
  331. package/dist/lib/project-context.js.map +0 -1
  332. package/dist/lib/provision-apply.js.map +0 -1
  333. package/dist/lib/provision-collect.js.map +0 -1
  334. package/dist/lib/provision.js.map +0 -1
  335. package/dist/lib/require-config.js +0 -32
  336. package/dist/lib/require-config.js.map +0 -1
  337. package/dist/lib/rules.js.map +0 -1
  338. package/dist/lib/sections.js +0 -89
  339. package/dist/lib/sections.js.map +0 -1
  340. package/dist/lib/skill-serve.js.map +0 -1
  341. package/dist/lib/skills-cache.js.map +0 -1
  342. package/dist/lib/skills.js.map +0 -1
  343. package/dist/lib/targets.js.map +0 -1
  344. package/dist/lib/task-history.js +0 -15
  345. package/dist/lib/task-history.js.map +0 -1
  346. package/dist/lib/validate-plan-delegate.js.map +0 -1
  347. package/dist/session-factory.js +0 -19
  348. package/dist/session-factory.js.map +0 -1
  349. package/dist/spinner.js.map +0 -1
  350. package/dist/tools/comment-task.js +0 -72
  351. package/dist/tools/comment-task.js.map +0 -1
  352. package/dist/tools/create-task.js +0 -129
  353. package/dist/tools/create-task.js.map +0 -1
  354. package/dist/tools/end-allocation.js +0 -38
  355. package/dist/tools/end-allocation.js.map +0 -1
  356. package/dist/tools/end-task-allocation.js +0 -37
  357. package/dist/tools/end-task-allocation.js.map +0 -1
  358. package/dist/tools/get-active-allocation.js +0 -69
  359. package/dist/tools/get-active-allocation.js.map +0 -1
  360. package/dist/tools/get-context.js +0 -48
  361. package/dist/tools/get-context.js.map +0 -1
  362. package/dist/tools/get-task.js +0 -137
  363. package/dist/tools/get-task.js.map +0 -1
  364. package/dist/tools/list-my-allocations.js +0 -71
  365. package/dist/tools/list-my-allocations.js.map +0 -1
  366. package/dist/tools/list-projects.js +0 -38
  367. package/dist/tools/list-projects.js.map +0 -1
  368. package/dist/tools/list-tasks.js +0 -93
  369. package/dist/tools/list-tasks.js.map +0 -1
  370. package/dist/tools/move-task.js +0 -82
  371. package/dist/tools/move-task.js.map +0 -1
  372. package/dist/tools/record-delivery.js +0 -71
  373. package/dist/tools/record-delivery.js.map +0 -1
  374. package/dist/tools/set-project.js +0 -52
  375. package/dist/tools/set-project.js.map +0 -1
  376. package/dist/tools/start-allocation.js +0 -32
  377. package/dist/tools/start-allocation.js.map +0 -1
  378. package/dist/tools/start-task-allocation.js +0 -75
  379. package/dist/tools/start-task-allocation.js.map +0 -1
  380. package/dist/tools/update-task.js +0 -139
  381. package/dist/tools/update-task.js.map +0 -1
  382. /package/dist/{spinner.js → lib/spinner.js} +0 -0
@@ -0,0 +1,135 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { mkdirSync, writeFileSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { createProjectDetector } from './project-detector.js';
5
+ import { createPackageMap } from './package-map.js';
6
+ const INIT = {
7
+ npm: { program: 'npm', args: ['init', '-y'] },
8
+ pnpm: { program: 'pnpm', args: ['init'] },
9
+ yarn: { program: 'yarn', args: ['init', '-y'] },
10
+ uv: { program: 'uv', args: ['init'] },
11
+ pip: { program: 'python', args: ['-m', 'venv', '.venv'] },
12
+ nuget: { program: 'dotnet', args: ['new', 'console'] },
13
+ };
14
+ const NODE_ADD = { npm: 'install', pnpm: 'add', yarn: 'add' };
15
+ function addCommand(pm, pkg) {
16
+ switch (pm) {
17
+ case 'npm':
18
+ return { program: 'npm', args: ['install', pkg] };
19
+ case 'pnpm':
20
+ return { program: 'pnpm', args: ['add', pkg] };
21
+ case 'yarn':
22
+ return { program: 'yarn', args: ['add', pkg] };
23
+ case 'pip':
24
+ return { program: 'pip', args: ['install', pkg] };
25
+ case 'uv':
26
+ return { program: 'uv', args: ['add', pkg] };
27
+ case 'pipenv':
28
+ return { program: 'pipenv', args: ['install', pkg] };
29
+ case 'poetry':
30
+ return { program: 'poetry', args: ['add', pkg] };
31
+ case 'conda':
32
+ return { program: 'conda', args: ['install', '-y', pkg] };
33
+ case 'nuget':
34
+ return { program: 'dotnet', args: ['add', 'package', pkg] };
35
+ default:
36
+ return null;
37
+ }
38
+ }
39
+ function fitsEcosystem(recipe, ctx) {
40
+ if (ctx.empty)
41
+ return true;
42
+ switch (recipe.runtime) {
43
+ case 'node':
44
+ return ctx.hasPackageJson;
45
+ case 'python':
46
+ return ctx.hasPyproject || ctx.hasRequirements;
47
+ case 'dotnet':
48
+ return ctx.hasCsproj;
49
+ default:
50
+ return false;
51
+ }
52
+ }
53
+ function buildPlanWith(detector, packageMap, recipe, choices, targetDir) {
54
+ const ctx = detector.detect(targetDir);
55
+ const pm = choices.packageManager ?? ctx.nodePackageManager ?? recipe.packageManagers[0];
56
+ const fits = fitsEcosystem(recipe, ctx);
57
+ const steps = [];
58
+ if (ctx.empty) {
59
+ const init = INIT[pm];
60
+ if (init) {
61
+ steps.push({ kind: 'run', program: init.program, args: init.args, cwd: targetDir, label: `inicializa (${pm})` });
62
+ }
63
+ const nodeAdd = NODE_ADD[pm];
64
+ if (nodeAdd && recipe.typings.length > 0) {
65
+ steps.push({ kind: 'run', program: pm, args: [nodeAdd, '-D', ...recipe.typings], cwd: targetDir, label: 'instala tipagens' });
66
+ }
67
+ }
68
+ const installed = [];
69
+ const skipped = [];
70
+ for (const displayName of [choices.framework, choices.orm]) {
71
+ if (!displayName)
72
+ continue;
73
+ const pkg = packageMap.resolve(recipe.language, displayName);
74
+ const cmd = pkg && fits ? addCommand(pm, pkg) : null;
75
+ if (pkg && fits && cmd) {
76
+ installed.push(pkg);
77
+ steps.push({ kind: 'run', program: cmd.program, args: cmd.args, cwd: targetDir, label: `instala ${displayName} (${pkg})` });
78
+ }
79
+ else {
80
+ skipped.push(displayName);
81
+ }
82
+ }
83
+ const marker = {
84
+ language: recipe.language,
85
+ packageManager: pm,
86
+ framework: choices.framework ?? null,
87
+ orm: choices.orm ?? null,
88
+ greenfield: ctx.empty,
89
+ ecosystemFits: fits,
90
+ installed,
91
+ skipped,
92
+ };
93
+ steps.push({
94
+ kind: 'write',
95
+ path: join(targetDir, '.nio-lang.json'),
96
+ content: JSON.stringify(marker, null, 2) + '\n',
97
+ label: 'registra escolhas/contexto (.nio-lang.json)',
98
+ });
99
+ return { language: recipe.language, targetDir, steps };
100
+ }
101
+ function runStep(step) {
102
+ try {
103
+ if (step.kind === 'run') {
104
+ const res = spawnSync(step.program, step.args, { cwd: step.cwd, stdio: 'inherit' });
105
+ if (res.error)
106
+ return { step, status: 'failed', error: res.error.message };
107
+ if (res.status !== 0)
108
+ return { step, status: 'failed', error: `código ${res.status}` };
109
+ }
110
+ else {
111
+ mkdirSync(dirname(step.path), { recursive: true });
112
+ writeFileSync(step.path, step.content);
113
+ }
114
+ return { step, status: 'done' };
115
+ }
116
+ catch (err) {
117
+ return { step, status: 'failed', error: err.message };
118
+ }
119
+ }
120
+ export function createScaffoldGateway(deps = {}) {
121
+ const detector = deps.detector ?? createProjectDetector();
122
+ const packageMap = deps.packageMap ?? createPackageMap();
123
+ return {
124
+ plan(recipe, choices, targetDir) {
125
+ return buildPlanWith(detector, packageMap, recipe, choices, targetDir);
126
+ },
127
+ apply(plan, opts) {
128
+ const dryRun = opts?.dryRun ?? false;
129
+ if (dryRun)
130
+ return plan.steps.map((step) => ({ step, status: 'planned' }));
131
+ return plan.steps.map(runStep);
132
+ },
133
+ };
134
+ }
135
+ //# sourceMappingURL=scaffold-gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-gateway.js","sourceRoot":"","sources":["../../../src/adapters/lang/scaffold-gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { existsSync, mkdirSync, rmSync, cpSync, readdirSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import AdmZip from 'adm-zip';
5
+ import { homePath } from '../../brand.js';
6
+ import { LANG_REPOS } from './repos.js';
7
+ const DEFAULT_TIMEOUT_MS = 30_000;
8
+ async function downloadRepo(spec, baseDir, opts) {
9
+ const dest = join(baseDir, spec.dir);
10
+ const base = { dir: spec.dir, repo: spec.repo, ref: spec.ref };
11
+ if (!opts.force && existsSync(dest)) {
12
+ return { ...base, status: 'cached' };
13
+ }
14
+ const url = `https://codeload.github.com/${spec.repo}/zip/refs/heads/${spec.ref}`;
15
+ const staging = join(tmpdir(), `nio-lang-${spec.dir}-${process.pid}-${Date.now()}`);
16
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
17
+ const ac = new AbortController();
18
+ const timer = setTimeout(() => ac.abort(), timeoutMs);
19
+ try {
20
+ const res = await fetch(url, { signal: ac.signal });
21
+ if (!res.ok)
22
+ throw new Error(`HTTP ${res.status} ao baixar ${url}`);
23
+ const buf = Buffer.from(await res.arrayBuffer());
24
+ rmSync(staging, { recursive: true, force: true });
25
+ mkdirSync(staging, { recursive: true });
26
+ new AdmZip(buf).extractAllTo(staging, true);
27
+ const dirs = readdirSync(staging, { withFileTypes: true }).filter((e) => e.isDirectory());
28
+ const root = dirs.length === 1 ? join(staging, dirs[0].name) : staging;
29
+ rmSync(dest, { recursive: true, force: true });
30
+ mkdirSync(dest, { recursive: true });
31
+ cpSync(root, dest, { recursive: true });
32
+ return { ...base, status: 'fetched' };
33
+ }
34
+ catch (err) {
35
+ const msg = ac.signal.aborted ? `timeout após ${timeoutMs}ms` : err.message;
36
+ return { ...base, status: existsSync(dest) ? 'cached' : 'failed', error: msg };
37
+ }
38
+ finally {
39
+ clearTimeout(timer);
40
+ rmSync(staging, { recursive: true, force: true });
41
+ }
42
+ }
43
+ export async function syncLangRepos(opts = {}) {
44
+ const baseDir = opts.dir ?? homePath('lang');
45
+ mkdirSync(baseDir, { recursive: true });
46
+ const results = [];
47
+ for (const spec of Object.values(LANG_REPOS)) {
48
+ results.push(await downloadRepo(spec, baseDir, opts));
49
+ }
50
+ return results;
51
+ }
52
+ //# sourceMappingURL=vendor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vendor.js","sourceRoot":"","sources":["../../../src/adapters/lang/vendor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { query, isUuid } from './client.js';
2
+ const COLS = 'id, user_id, expires_at, revoked_at, created_at';
3
+ export function mapAuthSessionRow(row) {
4
+ return {
5
+ id: row.id,
6
+ userId: Number(row.user_id),
7
+ expiresAt: row.expires_at,
8
+ revokedAt: row.revoked_at,
9
+ createdAt: row.created_at,
10
+ };
11
+ }
12
+ export function createAuthSessionRepository() {
13
+ return {
14
+ async create(input) {
15
+ const res = await query(`INSERT INTO auth_sessions (user_id, expires_at) VALUES ($1, $2) RETURNING ${COLS}`, [input.userId, input.expiresAt]);
16
+ return mapAuthSessionRow(res.rows[0]);
17
+ },
18
+ async findById(id) {
19
+ if (!isUuid(id))
20
+ return null;
21
+ const res = await query(`SELECT ${COLS} FROM auth_sessions WHERE id = $1`, [id]);
22
+ const row = res.rows[0];
23
+ return row ? mapAuthSessionRow(row) : null;
24
+ },
25
+ async revoke(id) {
26
+ if (!isUuid(id))
27
+ return;
28
+ await query(`UPDATE auth_sessions SET revoked_at = NOW() WHERE id = $1 AND revoked_at IS NULL`, [id]);
29
+ },
30
+ async listActiveByUser(userId) {
31
+ const res = await query(`SELECT ${COLS} FROM auth_sessions
32
+ WHERE user_id = $1 AND revoked_at IS NULL AND expires_at > NOW()
33
+ ORDER BY created_at DESC`, [userId]);
34
+ return res.rows.map(mapAuthSessionRow);
35
+ },
36
+ async revokeAllByUser(userId) {
37
+ await query(`UPDATE auth_sessions SET revoked_at = NOW() WHERE user_id = $1 AND revoked_at IS NULL`, [userId]);
38
+ },
39
+ };
40
+ }
41
+ //# sourceMappingURL=auth-session-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-session-repository.js","sourceRoot":"","sources":["../../../src/adapters/pg/auth-session-repository.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAW5C,MAAM,IAAI,GAAG,iDAAiD,CAAC;AAG/D,MAAM,UAAU,iBAAiB,CAAC,GAAmB;IACnD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC3B,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,KAA0B;YACrC,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,6EAA6E,IAAI,EAAE,EACnF,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAChC,CAAC;YACF,OAAO,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC;QACzC,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,EAAE;YACf,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC7B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAiB,UAAU,IAAI,mCAAmC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACjG,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACxB,OAAO,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7C,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,EAAE;YACb,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAAE,OAAO;YACxB,MAAM,KAAK,CACT,kFAAkF,EAClF,CAAC,EAAE,CAAC,CACL,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,gBAAgB,CAAC,MAAM;YAC3B,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,UAAU,IAAI;;kCAEY,EAC1B,CAAC,MAAM,CAAC,CACT,CAAC;YACF,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACzC,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,MAAM;YAC1B,MAAM,KAAK,CACT,uFAAuF,EACvF,CAAC,MAAM,CAAC,CACT,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { Pool } from 'pg';
2
+ function readDatabaseUrl() {
3
+ const url = process.env.NIO_DATABASE_URL?.trim();
4
+ if (!url) {
5
+ throw new Error('NIO_DATABASE_URL não definida. Configure a conexão do Postgres, ex.: ' +
6
+ 'NIO_DATABASE_URL="postgres://user:pass@host:5432/nio_cli".');
7
+ }
8
+ if (!/^postgres(ql)?:\/\//i.test(url)) {
9
+ throw new Error(`NIO_DATABASE_URL inválida: esperado "postgres://..." e veio "${url.slice(0, 16)}…".`);
10
+ }
11
+ return url;
12
+ }
13
+ function readSslOption() {
14
+ const flag = process.env.NIO_DATABASE_SSL?.trim().toLowerCase();
15
+ if (flag === 'true' || flag === '1')
16
+ return { rejectUnauthorized: false };
17
+ return undefined;
18
+ }
19
+ let pool = null;
20
+ export function getPool() {
21
+ if (pool)
22
+ return pool;
23
+ pool = new Pool({
24
+ connectionString: readDatabaseUrl(),
25
+ ssl: readSslOption(),
26
+ max: 10,
27
+ idleTimeoutMillis: 30_000,
28
+ connectionTimeoutMillis: 10_000,
29
+ });
30
+ pool.on('error', (err) => {
31
+ console.error('[pg] erro em client ocioso do pool:', err.message);
32
+ });
33
+ return pool;
34
+ }
35
+ export async function query(text, params) {
36
+ return getPool().query(text, params ? [...params] : undefined);
37
+ }
38
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
39
+ export function isUuid(s) {
40
+ return UUID_RE.test(s);
41
+ }
42
+ export async function withTransaction(fn) {
43
+ const client = await getPool().connect();
44
+ try {
45
+ await client.query('BEGIN');
46
+ const result = await fn(client);
47
+ await client.query('COMMIT');
48
+ return result;
49
+ }
50
+ catch (err) {
51
+ await client.query('ROLLBACK').catch(() => { });
52
+ throw err;
53
+ }
54
+ finally {
55
+ client.release();
56
+ }
57
+ }
58
+ export async function ping() {
59
+ try {
60
+ const res = await query('SELECT 1 AS ok');
61
+ return res.rows[0]?.ok === 1;
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ export async function closePool() {
68
+ if (!pool)
69
+ return;
70
+ const p = pool;
71
+ pool = null;
72
+ await p.end();
73
+ }
74
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/adapters/pg/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { query, withTransaction } from './client.js';
2
+ const COLS = 'id, session_id, file_path, dependency_name, dependency_type, detected_at, installed, installed_at';
3
+ export function mapDependencyEventRow(row) {
4
+ return {
5
+ id: row.id,
6
+ sessionId: row.session_id,
7
+ filePath: row.file_path,
8
+ dependencyName: row.dependency_name,
9
+ dependencyType: row.dependency_type,
10
+ detectedAt: row.detected_at,
11
+ installed: row.installed,
12
+ installedAt: row.installed_at,
13
+ };
14
+ }
15
+ export function createDependencyEventRepository() {
16
+ return {
17
+ async recordIfNew(input) {
18
+ return withTransaction(async (tx) => {
19
+ const existing = await tx.query(`SELECT ${COLS} FROM dependency_events
20
+ WHERE session_id = $1 AND file_path = $2 AND dependency_name = $3
21
+ ORDER BY detected_at DESC LIMIT 1`, [input.sessionId, input.filePath, input.dependencyName]);
22
+ if (existing.rows[0]) {
23
+ return { event: mapDependencyEventRow(existing.rows[0]), created: false };
24
+ }
25
+ const inserted = await tx.query(`INSERT INTO dependency_events (session_id, file_path, dependency_name, dependency_type)
26
+ VALUES ($1, $2, $3, $4)
27
+ RETURNING ${COLS}`, [input.sessionId, input.filePath, input.dependencyName, input.dependencyType]);
28
+ return { event: mapDependencyEventRow(inserted.rows[0]), created: true };
29
+ });
30
+ },
31
+ async markInstalled(id) {
32
+ await query(`UPDATE dependency_events SET installed = TRUE, installed_at = NOW() WHERE id = $1`, [id]);
33
+ },
34
+ async listBySession(sessionId) {
35
+ const res = await query(`SELECT ${COLS} FROM dependency_events WHERE session_id = $1 ORDER BY detected_at DESC`, [sessionId]);
36
+ return res.rows.map(mapDependencyEventRow);
37
+ },
38
+ };
39
+ }
40
+ //# sourceMappingURL=dependency-event-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-event-repository.js","sourceRoot":"","sources":["../../../src/adapters/pg/dependency-event-repository.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAcrD,MAAM,IAAI,GACR,mGAAmG,CAAC;AAEtG,MAAM,UAAU,qBAAqB,CAAC,GAAuB;IAC3D,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,cAAc,EAAE,GAAG,CAAC,eAAe;QACnC,cAAc,EAAE,GAAG,CAAC,eAAiC;QACrD,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,WAAW,EAAE,GAAG,CAAC,YAAY;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,+BAA+B;IAC7C,OAAO;QACL,KAAK,CAAC,WAAW,CAAC,KAA8B;YAC9C,OAAO,eAAe,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gBAElC,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,KAAK,CAC7B,UAAU,IAAI;;6CAEqB,EACnC,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,CACxD,CAAC;gBACF,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrB,OAAO,EAAE,KAAK,EAAE,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBAC5E,CAAC;gBACD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,KAAK,CAC7B;;uBAEa,IAAI,EAAE,EACnB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,cAAc,CAAC,CAC9E,CAAC;gBACF,OAAO,EAAE,KAAK,EAAE,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC5E,CAAC,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,EAAE;YACpB,MAAM,KAAK,CACT,mFAAmF,EACnF,CAAC,EAAE,CAAC,CACL,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,SAAS;YAC3B,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,UAAU,IAAI,yEAAyE,EACvF,CAAC,SAAS,CAAC,CACZ,CAAC;YACF,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAC7C,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { query, withTransaction, isUuid } from './client.js';
2
+ const COLS = 'id, user_id, purpose, code_hash, channel, attempts, expires_at, consumed_at, created_at';
3
+ export function isChallengeId(id) {
4
+ return isUuid(id);
5
+ }
6
+ export function mapLoginChallengeRow(row) {
7
+ return {
8
+ id: row.id,
9
+ userId: Number(row.user_id),
10
+ purpose: row.purpose,
11
+ codeHash: row.code_hash,
12
+ channel: row.channel,
13
+ attempts: Number(row.attempts),
14
+ expiresAt: row.expires_at,
15
+ consumedAt: row.consumed_at,
16
+ createdAt: row.created_at,
17
+ };
18
+ }
19
+ export function createLoginChallengeRepository() {
20
+ return {
21
+ async create(input) {
22
+ return withTransaction(async (tx) => {
23
+ await tx.query('DELETE FROM login_challenges WHERE expires_at < NOW()');
24
+ await tx.query('DELETE FROM login_challenges WHERE user_id = $1 AND consumed_at IS NULL', [input.userId]);
25
+ const res = await tx.query(`INSERT INTO login_challenges (user_id, purpose, code_hash, channel, expires_at)
26
+ VALUES ($1, $2, $3, $4, $5)
27
+ RETURNING ${COLS}`, [input.userId, input.purpose, input.codeHash, input.channel, input.expiresAt]);
28
+ return mapLoginChallengeRow(res.rows[0]);
29
+ });
30
+ },
31
+ async findById(id) {
32
+ if (!isChallengeId(id))
33
+ return null;
34
+ const res = await query(`SELECT ${COLS} FROM login_challenges WHERE id = $1`, [id]);
35
+ const row = res.rows[0];
36
+ return row ? mapLoginChallengeRow(row) : null;
37
+ },
38
+ async incrementAttempts(id) {
39
+ if (!isChallengeId(id))
40
+ return 0;
41
+ const res = await query('UPDATE login_challenges SET attempts = attempts + 1 WHERE id = $1 RETURNING attempts', [id]);
42
+ return Number(res.rows[0]?.attempts ?? 0);
43
+ },
44
+ async consume(id) {
45
+ if (!isChallengeId(id))
46
+ return;
47
+ await query('UPDATE login_challenges SET consumed_at = NOW() WHERE id = $1 AND consumed_at IS NULL', [id]);
48
+ },
49
+ async deleteExpired() {
50
+ await query('DELETE FROM login_challenges WHERE expires_at < NOW()');
51
+ },
52
+ };
53
+ }
54
+ //# sourceMappingURL=login-challenge-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-challenge-repository.js","sourceRoot":"","sources":["../../../src/adapters/pg/login-challenge-repository.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAe7D,MAAM,IAAI,GACR,yFAAyF,CAAC;AAG5F,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAsB;IACzD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC,OAA2B;QACxC,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,OAAO,EAAE,GAAG,CAAC,OAAgB;QAC7B,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC9B,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B;IAC5C,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,KAA6B;YACxC,OAAO,eAAe,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gBAClC,MAAM,EAAE,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;gBACxE,MAAM,EAAE,CAAC,KAAK,CACZ,yEAAyE,EACzE,CAAC,KAAK,CAAC,MAAM,CAAC,CACf,CAAC;gBACF,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,KAAK,CACxB;;uBAEa,IAAI,EAAE,EACnB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAC9E,CAAC;gBACF,OAAO,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,EAAE;YACf,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAC;YACpC,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,UAAU,IAAI,sCAAsC,EACpD,CAAC,EAAE,CAAC,CACL,CAAC;YACF,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACxB,OAAO,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,CAAC;QAED,KAAK,CAAC,iBAAiB,CAAC,EAAE;YACxB,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBAAE,OAAO,CAAC,CAAC;YACjC,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,sFAAsF,EACtF,CAAC,EAAE,CAAC,CACL,CAAC;YACF,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,EAAE;YACd,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBAAE,OAAO;YAC/B,MAAM,KAAK,CACT,uFAAuF,EACvF,CAAC,EAAE,CAAC,CACL,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,aAAa;YACjB,MAAM,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACvE,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { query, withTransaction } from './client.js';
2
+ const COLS = 'id, user_id, name, profile, status, project_path, ide, config, created_at, updated_at';
3
+ export function mapSessionRow(row) {
4
+ return {
5
+ id: row.id,
6
+ userId: Number(row.user_id),
7
+ name: row.name,
8
+ profile: row.profile,
9
+ status: row.status,
10
+ projectPath: row.project_path,
11
+ ide: row.ide,
12
+ config: (row.config ?? {}),
13
+ createdAt: row.created_at,
14
+ updatedAt: row.updated_at,
15
+ };
16
+ }
17
+ export function createSessionRepository() {
18
+ return {
19
+ async create(input) {
20
+ return withTransaction(async (tx) => {
21
+ await tx.query(`UPDATE sessions SET status = 'archived' WHERE user_id = $1 AND status = 'active'`, [input.userId]);
22
+ const res = await tx.query(`INSERT INTO sessions (user_id, name, profile, status, project_path, ide, config)
23
+ VALUES ($1, $2, $3, 'active', $4, $5, $6)
24
+ RETURNING ${COLS}`, [
25
+ input.userId,
26
+ input.name,
27
+ input.profile,
28
+ input.projectPath,
29
+ input.ide,
30
+ JSON.stringify(input.config ?? {}),
31
+ ]);
32
+ return mapSessionRow(res.rows[0]);
33
+ });
34
+ },
35
+ async findById(id) {
36
+ const res = await query(`SELECT ${COLS} FROM sessions WHERE id = $1`, [id]);
37
+ const row = res.rows[0];
38
+ return row ? mapSessionRow(row) : null;
39
+ },
40
+ async listByUser(userId) {
41
+ const res = await query(`SELECT ${COLS} FROM sessions WHERE user_id = $1 ORDER BY updated_at DESC`, [userId]);
42
+ return res.rows.map(mapSessionRow);
43
+ },
44
+ async findActiveByUser(userId) {
45
+ const res = await query(`SELECT ${COLS} FROM sessions WHERE user_id = $1 AND status = 'active'
46
+ ORDER BY updated_at DESC LIMIT 1`, [userId]);
47
+ const row = res.rows[0];
48
+ return row ? mapSessionRow(row) : null;
49
+ },
50
+ async activate(id, userId) {
51
+ return withTransaction(async (tx) => {
52
+ const found = await tx.query(`UPDATE sessions SET status = 'active' WHERE id = $1 RETURNING ${COLS}`, [id]);
53
+ if (!found.rows[0])
54
+ return null;
55
+ await tx.query(`UPDATE sessions SET status = 'archived' WHERE user_id = $1 AND status = 'active' AND id <> $2`, [userId, id]);
56
+ return mapSessionRow(found.rows[0]);
57
+ });
58
+ },
59
+ async setStatus(id, status) {
60
+ await query('UPDATE sessions SET status = $2 WHERE id = $1', [id, status]);
61
+ },
62
+ async updateConfig(id, config) {
63
+ await query('UPDATE sessions SET config = $2 WHERE id = $1', [id, JSON.stringify(config)]);
64
+ },
65
+ async delete(id) {
66
+ await query('DELETE FROM sessions WHERE id = $1', [id]);
67
+ },
68
+ };
69
+ }
70
+ //# sourceMappingURL=session-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-repository.js","sourceRoot":"","sources":["../../../src/adapters/pg/session-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { hashPassword, verifyPassword } from '../../lib/auth/password.js';
2
+ import { query } from './client.js';
3
+ function parseIps(raw) {
4
+ if (!raw)
5
+ return [];
6
+ try {
7
+ const parsed = JSON.parse(raw);
8
+ return Array.isArray(parsed) ? parsed.filter((x) => typeof x === 'string') : [];
9
+ }
10
+ catch {
11
+ return [];
12
+ }
13
+ }
14
+ export function mapUserRow(row) {
15
+ return {
16
+ id: Number(row.id),
17
+ name: row.name,
18
+ auth2: row.auth_2,
19
+ phone: row.phone,
20
+ ipsUsing: parseIps(row.ips_using),
21
+ timestampCreation: row.timestamp_creation,
22
+ timestampPasswordChange: row.timestamp_password_change,
23
+ timestampLastSession: row.timestamp_last_session,
24
+ };
25
+ }
26
+ const COLS = 'id, name, password, timestamp_creation, timestamp_password_change, ' +
27
+ 'auth_2, phone, backup_codes, timestamp_last_session, ips_using';
28
+ export function createUserRepository() {
29
+ return {
30
+ async findByName(name) {
31
+ const res = await query(`SELECT ${COLS} FROM user_cli WHERE name = $1`, [name]);
32
+ const row = res.rows[0];
33
+ return row ? mapUserRow(row) : null;
34
+ },
35
+ async findById(id) {
36
+ const res = await query(`SELECT ${COLS} FROM user_cli WHERE id = $1`, [id]);
37
+ const row = res.rows[0];
38
+ return row ? mapUserRow(row) : null;
39
+ },
40
+ async create(input) {
41
+ const passwordHash = await hashPassword(input.password);
42
+ const res = await query(`INSERT INTO user_cli (name, password) VALUES ($1, $2) RETURNING ${COLS}`, [input.name, passwordHash]);
43
+ return mapUserRow(res.rows[0]);
44
+ },
45
+ async verifyCredentials(name, password) {
46
+ const res = await query(`SELECT ${COLS} FROM user_cli WHERE name = $1`, [name]);
47
+ const row = res.rows[0];
48
+ if (!row)
49
+ return null;
50
+ const ok = await verifyPassword(row.password, password);
51
+ return ok ? mapUserRow(row) : null;
52
+ },
53
+ async touchLastSession(userId) {
54
+ await query('UPDATE user_cli SET timestamp_last_session = NOW() WHERE id = $1', [userId]);
55
+ },
56
+ async enable2fa(userId, phone, backupCodeHashes) {
57
+ await query('UPDATE user_cli SET auth_2 = TRUE, phone = $2, backup_codes = $3 WHERE id = $1', [userId, phone, backupCodeHashes]);
58
+ },
59
+ async disable2fa(userId) {
60
+ await query('UPDATE user_cli SET auth_2 = FALSE, phone = NULL, backup_codes = NULL WHERE id = $1', [userId]);
61
+ },
62
+ async updateBackupCodes(userId, joined) {
63
+ await query('UPDATE user_cli SET backup_codes = $2 WHERE id = $1', [userId, joined]);
64
+ },
65
+ async getBackupCodes(userId) {
66
+ const res = await query('SELECT backup_codes FROM user_cli WHERE id = $1', [userId]);
67
+ return res.rows[0]?.backup_codes ?? null;
68
+ },
69
+ };
70
+ }
71
+ //# sourceMappingURL=user-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-repository.js","sourceRoot":"","sources":["../../../src/adapters/pg/user-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { globExists } from '../../lib/deps/dependency-install.js';
3
+ function isPresent(spec) {
4
+ return Boolean(spec.detect && spec.detect.some(globExists));
5
+ }
6
+ function ensure(spec) {
7
+ if (isPresent(spec))
8
+ return { id: spec.id, status: 'present' };
9
+ if (!spec.install) {
10
+ return {
11
+ id: spec.id,
12
+ status: 'failed',
13
+ error: 'não detectado e sem plano de instalação automática (instale manualmente)',
14
+ };
15
+ }
16
+ const res = spawnSync(spec.install.program, spec.install.args, { stdio: 'inherit' });
17
+ if (res.error) {
18
+ return { id: spec.id, status: 'failed', error: res.error.message };
19
+ }
20
+ if (res.status !== 0) {
21
+ return { id: spec.id, status: 'failed', error: `instalador saiu com código ${res.status}` };
22
+ }
23
+ if (spec.detect && !isPresent(spec)) {
24
+ return { id: spec.id, status: 'failed', error: 'instalador rodou mas o toolchain não foi detectado' };
25
+ }
26
+ return { id: spec.id, status: 'installed' };
27
+ }
28
+ export function createToolchainGateway() {
29
+ return {
30
+ async ensure(spec) {
31
+ return ensure(spec);
32
+ },
33
+ };
34
+ }
35
+ //# sourceMappingURL=toolchain-gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolchain-gateway.js","sourceRoot":"","sources":["../../../src/adapters/pkg/toolchain-gateway.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAIlE,SAAS,SAAS,CAAC,IAAmB;IACpC,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,MAAM,CAAC,IAAmB;IACjC,IAAI,SAAS,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAE/D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,0EAA0E;SAClF,CAAC;IACJ,CAAC;IAGD,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACrF,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IACrE,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,8BAA8B,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;IAC9F,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,oDAAoD,EAAE,CAAC;IACxG,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,IAAmB;YAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}