@agentuity/cli 2.0.11 → 3.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 (339) hide show
  1. package/dist/cmd/ai/prompt/index.d.ts.map +1 -1
  2. package/dist/cmd/ai/prompt/index.js +2 -7
  3. package/dist/cmd/ai/prompt/index.js.map +1 -1
  4. package/dist/cmd/build/adapters/generic.d.ts +29 -0
  5. package/dist/cmd/build/adapters/generic.d.ts.map +1 -0
  6. package/dist/cmd/build/adapters/generic.js +190 -0
  7. package/dist/cmd/build/adapters/generic.js.map +1 -0
  8. package/dist/cmd/build/adapters/index.d.ts +15 -0
  9. package/dist/cmd/build/adapters/index.d.ts.map +1 -0
  10. package/dist/cmd/build/adapters/index.js +24 -0
  11. package/dist/cmd/build/adapters/index.js.map +1 -0
  12. package/dist/cmd/build/adapters/nextjs.d.ts +11 -0
  13. package/dist/cmd/build/adapters/nextjs.d.ts.map +1 -0
  14. package/dist/cmd/build/adapters/nextjs.js +118 -0
  15. package/dist/cmd/build/adapters/nextjs.js.map +1 -0
  16. package/dist/cmd/build/adapters/static-server.d.ts +23 -0
  17. package/dist/cmd/build/adapters/static-server.d.ts.map +1 -0
  18. package/dist/cmd/build/adapters/static-server.js +137 -0
  19. package/dist/cmd/build/adapters/static-server.js.map +1 -0
  20. package/dist/cmd/build/adapters/types.d.ts +71 -0
  21. package/dist/cmd/build/adapters/types.d.ts.map +1 -0
  22. package/dist/cmd/build/adapters/types.js +8 -0
  23. package/dist/cmd/build/adapters/types.js.map +1 -0
  24. package/dist/cmd/build/detect/engine.d.ts +24 -0
  25. package/dist/cmd/build/detect/engine.d.ts.map +1 -0
  26. package/dist/cmd/build/detect/engine.js +91 -0
  27. package/dist/cmd/build/detect/engine.js.map +1 -0
  28. package/dist/cmd/build/detect/frameworks.d.ts +66 -0
  29. package/dist/cmd/build/detect/frameworks.d.ts.map +1 -0
  30. package/dist/cmd/build/detect/frameworks.js +278 -0
  31. package/dist/cmd/build/detect/frameworks.js.map +1 -0
  32. package/dist/cmd/build/detect/generic.d.ts +13 -0
  33. package/dist/cmd/build/detect/generic.d.ts.map +1 -0
  34. package/dist/cmd/build/detect/generic.js +62 -0
  35. package/dist/cmd/build/detect/generic.js.map +1 -0
  36. package/dist/cmd/build/detect/index.d.ts +27 -0
  37. package/dist/cmd/build/detect/index.d.ts.map +1 -0
  38. package/dist/cmd/build/detect/index.js +76 -0
  39. package/dist/cmd/build/detect/index.js.map +1 -0
  40. package/dist/cmd/build/detect/types.d.ts +91 -0
  41. package/dist/cmd/build/detect/types.d.ts.map +1 -0
  42. package/dist/cmd/build/detect/types.js +9 -0
  43. package/dist/cmd/build/detect/types.js.map +1 -0
  44. package/dist/cmd/build/detect/util.d.ts +41 -0
  45. package/dist/cmd/build/detect/util.d.ts.map +1 -0
  46. package/dist/cmd/build/detect/util.js +101 -0
  47. package/dist/cmd/build/detect/util.js.map +1 -0
  48. package/dist/cmd/build/index.d.ts.map +1 -1
  49. package/dist/cmd/build/index.js +49 -22
  50. package/dist/cmd/build/index.js.map +1 -1
  51. package/dist/cmd/build/package/index.d.ts +30 -0
  52. package/dist/cmd/build/package/index.d.ts.map +1 -0
  53. package/dist/cmd/build/package/index.js +39 -0
  54. package/dist/cmd/build/package/index.js.map +1 -0
  55. package/dist/cmd/build/package/launch.d.ts +56 -0
  56. package/dist/cmd/build/package/launch.d.ts.map +1 -0
  57. package/dist/cmd/build/package/launch.js +56 -0
  58. package/dist/cmd/build/package/launch.js.map +1 -0
  59. package/dist/cmd/build/typecheck.d.ts.map +1 -1
  60. package/dist/cmd/build/typecheck.js +8 -0
  61. package/dist/cmd/build/typecheck.js.map +1 -1
  62. package/dist/cmd/cloud/deploy.d.ts.map +1 -1
  63. package/dist/cmd/cloud/deploy.js +63 -13
  64. package/dist/cmd/cloud/deploy.js.map +1 -1
  65. package/dist/cmd/coder/create.js +7 -7
  66. package/dist/cmd/coder/create.js.map +1 -1
  67. package/dist/cmd/coder/update.js +8 -8
  68. package/dist/cmd/coder/update.js.map +1 -1
  69. package/dist/cmd/coder/workspace/create.js +9 -9
  70. package/dist/cmd/coder/workspace/create.js.map +1 -1
  71. package/dist/cmd/dev/index.d.ts +9 -0
  72. package/dist/cmd/dev/index.d.ts.map +1 -1
  73. package/dist/cmd/dev/index.js +127 -923
  74. package/dist/cmd/dev/index.js.map +1 -1
  75. package/dist/cmd/project/auth/shared.d.ts.map +1 -1
  76. package/dist/cmd/project/auth/shared.js +14 -38
  77. package/dist/cmd/project/auth/shared.js.map +1 -1
  78. package/dist/cmd/project/create.d.ts.map +1 -1
  79. package/dist/cmd/project/create.js +12 -19
  80. package/dist/cmd/project/create.js.map +1 -1
  81. package/dist/cmd/project/frameworks-ai-examples.d.ts +15 -0
  82. package/dist/cmd/project/frameworks-ai-examples.d.ts.map +1 -0
  83. package/dist/cmd/project/frameworks-ai-examples.js +160 -0
  84. package/dist/cmd/project/frameworks-ai-examples.js.map +1 -0
  85. package/dist/cmd/project/frameworks-landing-pages.d.ts +17 -0
  86. package/dist/cmd/project/frameworks-landing-pages.d.ts.map +1 -0
  87. package/dist/cmd/project/frameworks-landing-pages.js +242 -0
  88. package/dist/cmd/project/frameworks-landing-pages.js.map +1 -0
  89. package/dist/cmd/project/frameworks.d.ts +58 -0
  90. package/dist/cmd/project/frameworks.d.ts.map +1 -0
  91. package/dist/cmd/project/frameworks.js +152 -0
  92. package/dist/cmd/project/frameworks.js.map +1 -0
  93. package/dist/cmd/project/reconcile.d.ts.map +1 -1
  94. package/dist/cmd/project/reconcile.js +10 -23
  95. package/dist/cmd/project/reconcile.js.map +1 -1
  96. package/dist/cmd/project/remote-import.js +1 -1
  97. package/dist/cmd/project/scaffold.d.ts +58 -0
  98. package/dist/cmd/project/scaffold.d.ts.map +1 -0
  99. package/dist/cmd/project/scaffold.js +223 -0
  100. package/dist/cmd/project/scaffold.js.map +1 -0
  101. package/dist/cmd/project/template-flow.d.ts +8 -4
  102. package/dist/cmd/project/template-flow.d.ts.map +1 -1
  103. package/dist/cmd/project/template-flow.js +93 -144
  104. package/dist/cmd/project/template-flow.js.map +1 -1
  105. package/dist/deploy-metadata.d.ts +49 -0
  106. package/dist/deploy-metadata.d.ts.map +1 -0
  107. package/dist/deploy-metadata.js +183 -0
  108. package/dist/deploy-metadata.js.map +1 -0
  109. package/dist/index.d.ts +1 -1
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js.map +1 -1
  112. package/dist/types.d.ts +24 -30
  113. package/dist/types.d.ts.map +1 -1
  114. package/dist/types.js.map +1 -1
  115. package/package.json +13 -8
  116. package/src/cmd/ai/prompt/index.ts +2 -7
  117. package/src/cmd/build/adapters/generic.ts +239 -0
  118. package/src/cmd/build/adapters/index.ts +30 -0
  119. package/src/cmd/build/adapters/nextjs.ts +146 -0
  120. package/src/cmd/build/adapters/static-server.ts +143 -0
  121. package/src/cmd/build/adapters/types.ts +93 -0
  122. package/src/cmd/build/detect/engine.ts +111 -0
  123. package/src/cmd/build/detect/frameworks.ts +335 -0
  124. package/src/cmd/build/detect/generic.ts +71 -0
  125. package/src/cmd/build/detect/index.ts +122 -0
  126. package/src/cmd/build/detect/types.ts +109 -0
  127. package/src/cmd/build/detect/util.ts +104 -0
  128. package/src/cmd/build/index.ts +64 -24
  129. package/src/cmd/build/package/index.ts +66 -0
  130. package/src/cmd/build/package/launch.ts +104 -0
  131. package/src/cmd/build/typecheck.ts +9 -0
  132. package/src/cmd/cloud/deploy.ts +86 -13
  133. package/src/cmd/coder/create.ts +8 -8
  134. package/src/cmd/coder/update.ts +7 -7
  135. package/src/cmd/coder/workspace/create.ts +10 -10
  136. package/src/cmd/dev/index.ts +155 -1059
  137. package/src/cmd/project/auth/shared.ts +14 -39
  138. package/src/cmd/project/create.ts +14 -19
  139. package/src/cmd/project/frameworks-ai-examples.ts +166 -0
  140. package/src/cmd/project/frameworks-landing-pages.ts +267 -0
  141. package/src/cmd/project/frameworks.ts +223 -0
  142. package/src/cmd/project/reconcile.ts +10 -22
  143. package/src/cmd/project/remote-import.ts +1 -1
  144. package/src/cmd/project/scaffold.ts +300 -0
  145. package/src/cmd/project/template-flow.ts +102 -156
  146. package/src/deploy-metadata.ts +253 -0
  147. package/src/index.ts +0 -2
  148. package/src/types.ts +0 -31
  149. package/dist/agents-docs.d.ts +0 -23
  150. package/dist/agents-docs.d.ts.map +0 -1
  151. package/dist/agents-docs.js +0 -56
  152. package/dist/agents-docs.js.map +0 -1
  153. package/dist/cmd/ai/prompt/agent.d.ts +0 -10
  154. package/dist/cmd/ai/prompt/agent.d.ts.map +0 -1
  155. package/dist/cmd/ai/prompt/agent.js +0 -28
  156. package/dist/cmd/ai/prompt/agent.js.map +0 -1
  157. package/dist/cmd/build/app-router-detector.d.ts +0 -39
  158. package/dist/cmd/build/app-router-detector.d.ts.map +0 -1
  159. package/dist/cmd/build/app-router-detector.js +0 -229
  160. package/dist/cmd/build/app-router-detector.js.map +0 -1
  161. package/dist/cmd/build/format-schema.d.ts +0 -6
  162. package/dist/cmd/build/format-schema.d.ts.map +0 -1
  163. package/dist/cmd/build/format-schema.js +0 -60
  164. package/dist/cmd/build/format-schema.js.map +0 -1
  165. package/dist/cmd/build/vite/agent-discovery.d.ts +0 -37
  166. package/dist/cmd/build/vite/agent-discovery.d.ts.map +0 -1
  167. package/dist/cmd/build/vite/agent-discovery.js +0 -263
  168. package/dist/cmd/build/vite/agent-discovery.js.map +0 -1
  169. package/dist/cmd/build/vite/beacon-plugin.d.ts +0 -19
  170. package/dist/cmd/build/vite/beacon-plugin.d.ts.map +0 -1
  171. package/dist/cmd/build/vite/beacon-plugin.js +0 -137
  172. package/dist/cmd/build/vite/beacon-plugin.js.map +0 -1
  173. package/dist/cmd/build/vite/browser-env-plugin.d.ts +0 -9
  174. package/dist/cmd/build/vite/browser-env-plugin.d.ts.map +0 -1
  175. package/dist/cmd/build/vite/browser-env-plugin.js +0 -28
  176. package/dist/cmd/build/vite/browser-env-plugin.js.map +0 -1
  177. package/dist/cmd/build/vite/bun-dev-server.d.ts +0 -67
  178. package/dist/cmd/build/vite/bun-dev-server.d.ts.map +0 -1
  179. package/dist/cmd/build/vite/bun-dev-server.js +0 -340
  180. package/dist/cmd/build/vite/bun-dev-server.js.map +0 -1
  181. package/dist/cmd/build/vite/bundle-files.d.ts +0 -12
  182. package/dist/cmd/build/vite/bundle-files.d.ts.map +0 -1
  183. package/dist/cmd/build/vite/bundle-files.js +0 -107
  184. package/dist/cmd/build/vite/bundle-files.js.map +0 -1
  185. package/dist/cmd/build/vite/config-loader.d.ts +0 -29
  186. package/dist/cmd/build/vite/config-loader.d.ts.map +0 -1
  187. package/dist/cmd/build/vite/config-loader.js +0 -57
  188. package/dist/cmd/build/vite/config-loader.js.map +0 -1
  189. package/dist/cmd/build/vite/db-rewrite.d.ts +0 -50
  190. package/dist/cmd/build/vite/db-rewrite.d.ts.map +0 -1
  191. package/dist/cmd/build/vite/db-rewrite.js +0 -169
  192. package/dist/cmd/build/vite/db-rewrite.js.map +0 -1
  193. package/dist/cmd/build/vite/docs-generator.d.ts +0 -13
  194. package/dist/cmd/build/vite/docs-generator.d.ts.map +0 -1
  195. package/dist/cmd/build/vite/docs-generator.js +0 -97
  196. package/dist/cmd/build/vite/docs-generator.js.map +0 -1
  197. package/dist/cmd/build/vite/env-types-generator.d.ts +0 -26
  198. package/dist/cmd/build/vite/env-types-generator.d.ts.map +0 -1
  199. package/dist/cmd/build/vite/env-types-generator.js +0 -110
  200. package/dist/cmd/build/vite/env-types-generator.js.map +0 -1
  201. package/dist/cmd/build/vite/index.d.ts +0 -3
  202. package/dist/cmd/build/vite/index.d.ts.map +0 -1
  203. package/dist/cmd/build/vite/index.js +0 -4
  204. package/dist/cmd/build/vite/index.js.map +0 -1
  205. package/dist/cmd/build/vite/lifecycle-generator.d.ts +0 -19
  206. package/dist/cmd/build/vite/lifecycle-generator.d.ts.map +0 -1
  207. package/dist/cmd/build/vite/lifecycle-generator.js +0 -328
  208. package/dist/cmd/build/vite/lifecycle-generator.js.map +0 -1
  209. package/dist/cmd/build/vite/metadata-generator.d.ts +0 -36
  210. package/dist/cmd/build/vite/metadata-generator.d.ts.map +0 -1
  211. package/dist/cmd/build/vite/metadata-generator.js +0 -575
  212. package/dist/cmd/build/vite/metadata-generator.js.map +0 -1
  213. package/dist/cmd/build/vite/prompt-generator.d.ts +0 -23
  214. package/dist/cmd/build/vite/prompt-generator.d.ts.map +0 -1
  215. package/dist/cmd/build/vite/prompt-generator.js +0 -123
  216. package/dist/cmd/build/vite/prompt-generator.js.map +0 -1
  217. package/dist/cmd/build/vite/public-asset-path-plugin.d.ts +0 -45
  218. package/dist/cmd/build/vite/public-asset-path-plugin.d.ts.map +0 -1
  219. package/dist/cmd/build/vite/public-asset-path-plugin.js +0 -166
  220. package/dist/cmd/build/vite/public-asset-path-plugin.js.map +0 -1
  221. package/dist/cmd/build/vite/route-discovery.d.ts +0 -64
  222. package/dist/cmd/build/vite/route-discovery.d.ts.map +0 -1
  223. package/dist/cmd/build/vite/route-discovery.js +0 -187
  224. package/dist/cmd/build/vite/route-discovery.js.map +0 -1
  225. package/dist/cmd/build/vite/server-bundler.d.ts +0 -20
  226. package/dist/cmd/build/vite/server-bundler.d.ts.map +0 -1
  227. package/dist/cmd/build/vite/server-bundler.js +0 -388
  228. package/dist/cmd/build/vite/server-bundler.js.map +0 -1
  229. package/dist/cmd/build/vite/static-renderer.d.ts +0 -26
  230. package/dist/cmd/build/vite/static-renderer.d.ts.map +0 -1
  231. package/dist/cmd/build/vite/static-renderer.js +0 -188
  232. package/dist/cmd/build/vite/static-renderer.js.map +0 -1
  233. package/dist/cmd/build/vite/tailwind-source-plugin.d.ts +0 -15
  234. package/dist/cmd/build/vite/tailwind-source-plugin.d.ts.map +0 -1
  235. package/dist/cmd/build/vite/tailwind-source-plugin.js +0 -61
  236. package/dist/cmd/build/vite/tailwind-source-plugin.js.map +0 -1
  237. package/dist/cmd/build/vite/vite-asset-server-config.d.ts +0 -24
  238. package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +0 -1
  239. package/dist/cmd/build/vite/vite-asset-server-config.js +0 -285
  240. package/dist/cmd/build/vite/vite-asset-server-config.js.map +0 -1
  241. package/dist/cmd/build/vite/vite-asset-server.d.ts +0 -30
  242. package/dist/cmd/build/vite/vite-asset-server.d.ts.map +0 -1
  243. package/dist/cmd/build/vite/vite-asset-server.js +0 -109
  244. package/dist/cmd/build/vite/vite-asset-server.js.map +0 -1
  245. package/dist/cmd/build/vite/vite-builder.d.ts +0 -59
  246. package/dist/cmd/build/vite/vite-builder.d.ts.map +0 -1
  247. package/dist/cmd/build/vite/vite-builder.js +0 -401
  248. package/dist/cmd/build/vite/vite-builder.js.map +0 -1
  249. package/dist/cmd/build/vite/workbench-generator.d.ts +0 -10
  250. package/dist/cmd/build/vite/workbench-generator.d.ts.map +0 -1
  251. package/dist/cmd/build/vite/workbench-generator.js +0 -135
  252. package/dist/cmd/build/vite/workbench-generator.js.map +0 -1
  253. package/dist/cmd/build/vite/ws-proxy.d.ts +0 -53
  254. package/dist/cmd/build/vite/ws-proxy.d.ts.map +0 -1
  255. package/dist/cmd/build/vite/ws-proxy.js +0 -95
  256. package/dist/cmd/build/vite/ws-proxy.js.map +0 -1
  257. package/dist/cmd/build/vite-bundler.d.ts +0 -29
  258. package/dist/cmd/build/vite-bundler.d.ts.map +0 -1
  259. package/dist/cmd/build/vite-bundler.js +0 -93
  260. package/dist/cmd/build/vite-bundler.js.map +0 -1
  261. package/dist/cmd/dev/agents.d.ts +0 -2
  262. package/dist/cmd/dev/agents.d.ts.map +0 -1
  263. package/dist/cmd/dev/agents.js +0 -123
  264. package/dist/cmd/dev/agents.js.map +0 -1
  265. package/dist/cmd/dev/api.d.ts +0 -20
  266. package/dist/cmd/dev/api.d.ts.map +0 -1
  267. package/dist/cmd/dev/api.js +0 -42
  268. package/dist/cmd/dev/api.js.map +0 -1
  269. package/dist/cmd/dev/dev-lock.d.ts +0 -62
  270. package/dist/cmd/dev/dev-lock.d.ts.map +0 -1
  271. package/dist/cmd/dev/dev-lock.js +0 -250
  272. package/dist/cmd/dev/dev-lock.js.map +0 -1
  273. package/dist/cmd/dev/download.d.ts +0 -11
  274. package/dist/cmd/dev/download.d.ts.map +0 -1
  275. package/dist/cmd/dev/download.js +0 -94
  276. package/dist/cmd/dev/download.js.map +0 -1
  277. package/dist/cmd/dev/file-watcher.d.ts +0 -24
  278. package/dist/cmd/dev/file-watcher.d.ts.map +0 -1
  279. package/dist/cmd/dev/file-watcher.js +0 -349
  280. package/dist/cmd/dev/file-watcher.js.map +0 -1
  281. package/dist/cmd/dev/process-manager.d.ts +0 -104
  282. package/dist/cmd/dev/process-manager.d.ts.map +0 -1
  283. package/dist/cmd/dev/process-manager.js +0 -204
  284. package/dist/cmd/dev/process-manager.js.map +0 -1
  285. package/dist/cmd/dev/sync.d.ts +0 -12
  286. package/dist/cmd/dev/sync.d.ts.map +0 -1
  287. package/dist/cmd/dev/sync.js +0 -227
  288. package/dist/cmd/dev/sync.js.map +0 -1
  289. package/dist/cmd/dev/templates.d.ts +0 -3
  290. package/dist/cmd/dev/templates.d.ts.map +0 -1
  291. package/dist/cmd/dev/templates.js +0 -58
  292. package/dist/cmd/dev/templates.js.map +0 -1
  293. package/dist/cmd/project/download.d.ts +0 -35
  294. package/dist/cmd/project/download.d.ts.map +0 -1
  295. package/dist/cmd/project/download.js +0 -403
  296. package/dist/cmd/project/download.js.map +0 -1
  297. package/dist/cmd/project/templates.d.ts +0 -9
  298. package/dist/cmd/project/templates.d.ts.map +0 -1
  299. package/dist/cmd/project/templates.js +0 -34
  300. package/dist/cmd/project/templates.js.map +0 -1
  301. package/src/agents-docs.ts +0 -86
  302. package/src/cmd/ai/prompt/agent.md +0 -305
  303. package/src/cmd/ai/prompt/agent.ts +0 -31
  304. package/src/cmd/build/app-router-detector.ts +0 -320
  305. package/src/cmd/build/format-schema.ts +0 -66
  306. package/src/cmd/build/vite/agent-discovery.ts +0 -380
  307. package/src/cmd/build/vite/beacon-plugin.ts +0 -164
  308. package/src/cmd/build/vite/browser-env-plugin.ts +0 -34
  309. package/src/cmd/build/vite/bun-dev-server.ts +0 -458
  310. package/src/cmd/build/vite/bundle-files.ts +0 -135
  311. package/src/cmd/build/vite/config-loader.ts +0 -76
  312. package/src/cmd/build/vite/db-rewrite.ts +0 -189
  313. package/src/cmd/build/vite/docs-generator.ts +0 -103
  314. package/src/cmd/build/vite/env-types-generator.ts +0 -145
  315. package/src/cmd/build/vite/index.ts +0 -3
  316. package/src/cmd/build/vite/lifecycle-generator.ts +0 -381
  317. package/src/cmd/build/vite/metadata-generator.ts +0 -713
  318. package/src/cmd/build/vite/prompt-generator.ts +0 -169
  319. package/src/cmd/build/vite/public-asset-path-plugin.ts +0 -209
  320. package/src/cmd/build/vite/route-discovery.ts +0 -271
  321. package/src/cmd/build/vite/server-bundler.ts +0 -481
  322. package/src/cmd/build/vite/static-renderer.ts +0 -239
  323. package/src/cmd/build/vite/tailwind-source-plugin.ts +0 -73
  324. package/src/cmd/build/vite/vite-asset-server-config.ts +0 -349
  325. package/src/cmd/build/vite/vite-asset-server.ts +0 -154
  326. package/src/cmd/build/vite/vite-builder.ts +0 -503
  327. package/src/cmd/build/vite/workbench-generator.ts +0 -152
  328. package/src/cmd/build/vite/ws-proxy.ts +0 -126
  329. package/src/cmd/build/vite-bundler.ts +0 -137
  330. package/src/cmd/dev/agents.ts +0 -140
  331. package/src/cmd/dev/api.ts +0 -65
  332. package/src/cmd/dev/dev-lock.ts +0 -332
  333. package/src/cmd/dev/download.ts +0 -117
  334. package/src/cmd/dev/file-watcher.ts +0 -423
  335. package/src/cmd/dev/process-manager.ts +0 -261
  336. package/src/cmd/dev/sync.ts +0 -411
  337. package/src/cmd/dev/templates.ts +0 -66
  338. package/src/cmd/project/download.ts +0 -505
  339. package/src/cmd/project/templates.ts +0 -56
@@ -1,332 +0,0 @@
1
- /**
2
- * Dev Lock Manager
3
- *
4
- * Manages a lockfile to track the dev server process and its children.
5
- * On startup, detects and cleans up stale processes from previous sessions.
6
- * Ensures proper cleanup on all exit paths.
7
- */
8
-
9
- import { join, dirname } from 'node:path';
10
- import { randomUUID } from 'node:crypto';
11
- import { existsSync, unlinkSync } from 'node:fs';
12
- import { promises as fs } from 'node:fs';
13
-
14
- interface LoggerLike {
15
- debug: (msg: string, ...args: unknown[]) => void;
16
- warn: (msg: string, ...args: unknown[]) => void;
17
- error: (msg: string, ...args: unknown[]) => void;
18
- }
19
-
20
- /**
21
- * Lockfile format for tracking dev server processes
22
- */
23
- export interface DevLockFileV1 {
24
- version: 1;
25
- projectRoot: string;
26
- mainPid: number;
27
- instanceId: string;
28
- createdAt: string;
29
- updatedAt: string;
30
- ports: {
31
- bun?: number;
32
- vite?: number;
33
- gravity?: number;
34
- };
35
- children: Array<{
36
- pid: number;
37
- type: 'gravity' | 'vite' | 'other';
38
- description?: string;
39
- }>;
40
- }
41
-
42
- export interface DevLockManager {
43
- state: DevLockFileV1;
44
- registerChild: (info: {
45
- pid: number;
46
- type: 'gravity' | 'vite' | 'other';
47
- description?: string;
48
- }) => Promise<void>;
49
- updatePorts: (ports: Partial<DevLockFileV1['ports']>) => Promise<void>;
50
- release: () => Promise<void>;
51
- }
52
-
53
- function getLockPath(rootDir: string): string {
54
- return join(rootDir, '.agentuity', 'devserver.lock');
55
- }
56
-
57
- /**
58
- * Check if a process with the given PID exists
59
- */
60
- function pidExists(pid: number): boolean {
61
- if (!Number.isInteger(pid) || pid <= 0) return false;
62
- try {
63
- process.kill(pid, 0);
64
- return true;
65
- } catch (err: unknown) {
66
- const error = err as NodeJS.ErrnoException;
67
- if (error.code === 'ESRCH' || error.code === 'EINVAL') return false;
68
- // EPERM means it exists but we can't signal it
69
- return error.code === 'EPERM';
70
- }
71
- }
72
-
73
- /**
74
- * Kill a process by PID with SIGTERM, then SIGKILL if still alive
75
- */
76
- async function killPid(pid: number, logger: LoggerLike): Promise<void> {
77
- if (!pidExists(pid)) return;
78
-
79
- try {
80
- process.kill(pid, 'SIGTERM');
81
- logger.debug('Sent SIGTERM to pid %d', pid);
82
- } catch (err: unknown) {
83
- const error = err as NodeJS.ErrnoException;
84
- if (error.code === 'ESRCH') return;
85
- logger.debug('Error sending SIGTERM to pid %d: %s', pid, error.message);
86
- }
87
-
88
- // Give it a moment to exit gracefully
89
- await new Promise((r) => setTimeout(r, 500));
90
-
91
- if (!pidExists(pid)) return;
92
-
93
- // Force kill
94
- try {
95
- process.kill(pid, 'SIGKILL');
96
- logger.debug('Sent SIGKILL to pid %d', pid);
97
- } catch (err: unknown) {
98
- const error = err as NodeJS.ErrnoException;
99
- if (error.code !== 'ESRCH') {
100
- logger.debug('Error sending SIGKILL to pid %d: %s', pid, error.message);
101
- }
102
- }
103
-
104
- // Wait for process to fully terminate
105
- await new Promise((r) => setTimeout(r, 100));
106
- }
107
-
108
- /**
109
- * Read an existing lockfile (if any)
110
- */
111
- async function readLock(lockPath: string, logger: LoggerLike): Promise<DevLockFileV1 | null> {
112
- if (!existsSync(lockPath)) return null;
113
- try {
114
- const raw = await fs.readFile(lockPath, 'utf8');
115
- const parsed = JSON.parse(raw);
116
- if (parsed && parsed.version === 1) return parsed as DevLockFileV1;
117
- } catch (err) {
118
- logger.warn('Failed to read/parse devserver.lock: %s', err);
119
- }
120
- return null;
121
- }
122
-
123
- /**
124
- * Remove lockfile if it exists
125
- */
126
- async function removeLock(lockPath: string, logger: LoggerLike): Promise<void> {
127
- try {
128
- await fs.unlink(lockPath);
129
- logger.debug('Removed devserver.lock');
130
- } catch (err: unknown) {
131
- const error = err as NodeJS.ErrnoException;
132
- if (error.code !== 'ENOENT') {
133
- logger.debug('Failed to remove devserver.lock: %s', error.message);
134
- }
135
- }
136
- }
137
-
138
- /**
139
- * Check if a port is in use by attempting to connect to it.
140
- * Uses GET instead of HEAD since some servers return 405 for HEAD requests.
141
- * Any response (including errors like 404, 500) means the port is in use.
142
- */
143
- async function isPortResponding(port: number): Promise<boolean> {
144
- try {
145
- const response = await fetch(`http://127.0.0.1:${port}/`, {
146
- method: 'GET',
147
- signal: AbortSignal.timeout(500),
148
- });
149
- // Consume body to avoid memory leaks
150
- await response.text().catch(() => {});
151
- return true;
152
- } catch (err: unknown) {
153
- // Connection refused (ECONNREFUSED) means nothing is listening
154
- // Other errors (timeout, reset) might indicate a busy port
155
- const error = err as Error & { cause?: { code?: string } };
156
- const code = error.cause?.code;
157
- if (code === 'ECONNREFUSED' || code === 'ECONNRESET') {
158
- return false;
159
- }
160
- // For other errors (like timeout), assume port might be in use but unresponsive
161
- return false;
162
- }
163
- }
164
-
165
- /**
166
- * Kill processes referenced by a stale lock, then remove the lock
167
- */
168
- async function cleanupStaleLock(
169
- rootDir: string,
170
- lock: DevLockFileV1,
171
- logger: LoggerLike
172
- ): Promise<void> {
173
- const lockPath = getLockPath(rootDir);
174
- logger.debug(
175
- 'Cleaning up stale devserver.lock (pid=%d, instance=%s)',
176
- lock.mainPid,
177
- lock.instanceId
178
- );
179
-
180
- // Collect all PIDs to kill (children first, then main)
181
- const childPids: number[] = [];
182
- for (const child of lock.children ?? []) {
183
- if (child.pid && child.pid !== lock.mainPid && child.pid !== process.pid) {
184
- childPids.push(child.pid);
185
- }
186
- }
187
-
188
- // Kill children first
189
- for (const pid of childPids) {
190
- await killPid(pid, logger);
191
- }
192
-
193
- // Kill main process if it's not us
194
- if (lock.mainPid !== process.pid) {
195
- await killPid(lock.mainPid, logger);
196
- }
197
-
198
- // Remove the stale lockfile
199
- await removeLock(lockPath, logger);
200
- }
201
-
202
- /**
203
- * Ensure there is no conflicting dev server for this project
204
- * Always cleans up any existing lock and kills associated processes
205
- */
206
- async function ensureNoActiveDevForProject(
207
- rootDir: string,
208
- _port: number,
209
- logger: LoggerLike
210
- ): Promise<void> {
211
- const lockPath = getLockPath(rootDir);
212
- const existing = await readLock(lockPath, logger);
213
- if (!existing) return;
214
-
215
- const now = Date.now();
216
- const createdAt = Date.parse(existing.createdAt || '');
217
- const ageMs = Number.isFinite(createdAt) ? now - createdAt : Infinity;
218
-
219
- const mainAlive = pidExists(existing.mainPid);
220
-
221
- // Check if the recorded Bun port is still responding
222
- let bunPortInUse = false;
223
- if (existing.ports?.bun) {
224
- bunPortInUse = await isPortResponding(existing.ports.bun);
225
- }
226
-
227
- logger.debug(
228
- 'Found existing lock (pid=%d, mainAlive=%s, bunPortInUse=%s, age=%dms) - cleaning up',
229
- existing.mainPid,
230
- mainAlive,
231
- bunPortInUse,
232
- ageMs
233
- );
234
-
235
- await cleanupStaleLock(rootDir, existing, logger);
236
- }
237
-
238
- /**
239
- * Initialize a new lock for the current dev run
240
- * This should be called after ensureNoActiveDevForProject has possibly cleaned stale state
241
- */
242
- async function initDevLock(
243
- rootDir: string,
244
- port: number,
245
- logger: LoggerLike
246
- ): Promise<DevLockManager> {
247
- const lockPath = getLockPath(rootDir);
248
- await fs.mkdir(dirname(lockPath), { recursive: true });
249
-
250
- const state: DevLockFileV1 = {
251
- version: 1,
252
- projectRoot: rootDir,
253
- mainPid: process.pid,
254
- instanceId: randomUUID(),
255
- createdAt: new Date().toISOString(),
256
- updatedAt: new Date().toISOString(),
257
- ports: { bun: port },
258
- children: [],
259
- };
260
-
261
- const writeLock = async () => {
262
- state.updatedAt = new Date().toISOString();
263
- await fs.writeFile(lockPath, JSON.stringify(state, null, 2), { encoding: 'utf8' });
264
- };
265
-
266
- await writeLock();
267
- logger.debug('Created devserver.lock (pid=%d, instance=%s)', state.mainPid, state.instanceId);
268
-
269
- const manager: DevLockManager = {
270
- state,
271
-
272
- async registerChild(child) {
273
- if (!child.pid) return;
274
- // Avoid duplicates
275
- if (state.children.some((c) => c.pid === child.pid)) return;
276
- state.children.push(child);
277
- await writeLock();
278
- logger.debug('Registered child process (pid=%d, type=%s)', child.pid, child.type);
279
- },
280
-
281
- async updatePorts(ports) {
282
- state.ports = { ...state.ports, ...ports };
283
- await writeLock();
284
- },
285
-
286
- async release() {
287
- await removeLock(lockPath, logger);
288
- },
289
- };
290
-
291
- return manager;
292
- }
293
-
294
- /**
295
- * Main entry point for dev lock management
296
- * Call this early in the dev command to:
297
- * 1. Clean up any stale processes from previous sessions
298
- * 2. Create a new lockfile for this session
299
- */
300
- export async function prepareDevLock(
301
- rootDir: string,
302
- port: number,
303
- logger: LoggerLike
304
- ): Promise<DevLockManager> {
305
- await ensureNoActiveDevForProject(rootDir, port, logger);
306
- return initDevLock(rootDir, port, logger);
307
- }
308
-
309
- /**
310
- * Utility to kill all processes in a lockfile by path
311
- * Useful for emergency cleanup without creating a new lock
312
- */
313
- export async function cleanupLockfile(rootDir: string, logger: LoggerLike): Promise<void> {
314
- const lockPath = getLockPath(rootDir);
315
- const existing = await readLock(lockPath, logger);
316
- if (existing) {
317
- await cleanupStaleLock(rootDir, existing, logger);
318
- }
319
- }
320
-
321
- /**
322
- * Synchronous lockfile removal for use in process.on('exit') handlers
323
- * Does not kill processes - just removes the file
324
- */
325
- export function releaseLockSync(rootDir: string): void {
326
- const lockPath = getLockPath(rootDir);
327
- try {
328
- unlinkSync(lockPath);
329
- } catch {
330
- // Ignore errors - file may already be gone
331
- }
332
- }
@@ -1,117 +0,0 @@
1
- import { randomUUID } from 'node:crypto';
2
- import { mkdirSync, rmSync, writeFileSync } from 'node:fs';
3
- import { tmpdir, platform } from 'node:os';
4
- import { join, dirname } from 'node:path';
5
- import * as tar from 'tar';
6
- import { StructuredError } from '@agentuity/core';
7
- import { spinner } from '../../tui';
8
-
9
- interface GravityClient {
10
- filename: string;
11
- version: string;
12
- }
13
-
14
- const GravityVersionError = StructuredError('GravityVersionError')<{
15
- status: number;
16
- statusText: string;
17
- }>();
18
- const GravityDownloadError = StructuredError('GravityDownloadError')<{
19
- status: number;
20
- statusText: string;
21
- }>();
22
- const GravityExtractionError = StructuredError('GravityExtractionError')<{
23
- path: string;
24
- }>();
25
-
26
- function getBaseURL(): string {
27
- return process.env.AGENTUITY_SH_URL || 'https://agentuity.sh';
28
- }
29
-
30
- /**
31
- *
32
- * @returns full path to the downloaded file
33
- */
34
- export async function download(gravityDir: string): Promise<GravityClient> {
35
- const baseURL = getBaseURL();
36
-
37
- // Step 1: Get the latest version from agentuity.sh
38
- const tag = (await spinner({
39
- message: 'Checking Agentuity Gravity',
40
- callback: async () => {
41
- const resp = await fetch(`${baseURL}/release/gravity/version`, {
42
- signal: AbortSignal.timeout(10_000),
43
- });
44
- if (!resp.ok) {
45
- throw new GravityVersionError({
46
- status: resp.status,
47
- statusText: resp.statusText,
48
- });
49
- }
50
- const text = (await resp.text()).trim();
51
- return text.startsWith('v') ? text : `v${text}`;
52
- },
53
- clearOnSuccess: true,
54
- })) as string;
55
-
56
- const version = tag.startsWith('v') ? tag.slice(1) : tag;
57
- const releaseFilename = join(gravityDir, version, 'gravity');
58
-
59
- // Step 2: Check if already downloaded
60
- if (await Bun.file(releaseFilename).exists()) {
61
- return { filename: releaseFilename, version };
62
- }
63
-
64
- // Step 3: Download the binary from agentuity.sh
65
- const os = platform();
66
- let arch: string = process.arch;
67
- if (arch === 'x64') {
68
- arch = 'x86_64';
69
- }
70
-
71
- const tmpFile = join(tmpdir(), `${randomUUID()}.tar.gz`);
72
-
73
- try {
74
- await spinner({
75
- message: `Downloading Gravity ${version}`,
76
- callback: async () => {
77
- const resp = await fetch(`${baseURL}/release/gravity/${tag}/${os}/${arch}`, {
78
- signal: AbortSignal.timeout(60_000),
79
- });
80
- if (!resp.ok) {
81
- throw new GravityDownloadError({
82
- status: resp.status,
83
- statusText: resp.statusText,
84
- });
85
- }
86
- const buffer = await resp.arrayBuffer();
87
- writeFileSync(tmpFile, Buffer.from(buffer));
88
- },
89
- clearOnSuccess: true,
90
- });
91
-
92
- // Step 4: Extract the tarball
93
- await spinner({
94
- message: 'Extracting release',
95
- callback: async () => {
96
- const downloadDir = dirname(releaseFilename);
97
- if (!(await Bun.file(downloadDir).exists())) {
98
- mkdirSync(downloadDir, { recursive: true });
99
- }
100
- await tar.x({ file: tmpFile, cwd: downloadDir, chmod: true });
101
- },
102
- clearOnSuccess: true,
103
- });
104
- } finally {
105
- // Clean up temp file regardless of success or failure
106
- if (await Bun.file(tmpFile).exists()) {
107
- rmSync(tmpFile);
108
- }
109
- }
110
-
111
- // Step 5: Verify the binary was extracted
112
- if (!(await Bun.file(releaseFilename).exists())) {
113
- throw new GravityExtractionError({ path: releaseFilename });
114
- }
115
-
116
- return { filename: releaseFilename, version };
117
- }