@amodalai/amodal 0.1.2

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 (511) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +21 -0
  3. package/README.md +42 -0
  4. package/dist/src/auth/index.d.ts +13 -0
  5. package/dist/src/auth/index.d.ts.map +1 -0
  6. package/dist/src/auth/index.js +10 -0
  7. package/dist/src/auth/index.js.map +1 -0
  8. package/dist/src/auth/oauth2.d.ts +51 -0
  9. package/dist/src/auth/oauth2.d.ts.map +1 -0
  10. package/dist/src/auth/oauth2.js +196 -0
  11. package/dist/src/auth/oauth2.js.map +1 -0
  12. package/dist/src/auth/prompt.d.ts +21 -0
  13. package/dist/src/auth/prompt.d.ts.map +1 -0
  14. package/dist/src/auth/prompt.js +81 -0
  15. package/dist/src/auth/prompt.js.map +1 -0
  16. package/dist/src/auth/test-connection.d.ts +27 -0
  17. package/dist/src/auth/test-connection.d.ts.map +1 -0
  18. package/dist/src/auth/test-connection.js +153 -0
  19. package/dist/src/auth/test-connection.js.map +1 -0
  20. package/dist/src/auth/types.d.ts +32 -0
  21. package/dist/src/auth/types.d.ts.map +1 -0
  22. package/dist/src/auth/types.js +7 -0
  23. package/dist/src/auth/types.js.map +1 -0
  24. package/dist/src/commands/audit.d.ts +18 -0
  25. package/dist/src/commands/audit.d.ts.map +1 -0
  26. package/dist/src/commands/audit.js +86 -0
  27. package/dist/src/commands/audit.js.map +1 -0
  28. package/dist/src/commands/automations.d.ts +28 -0
  29. package/dist/src/commands/automations.d.ts.map +1 -0
  30. package/dist/src/commands/automations.js +179 -0
  31. package/dist/src/commands/automations.js.map +1 -0
  32. package/dist/src/commands/build-manifest-types.d.ts +33 -0
  33. package/dist/src/commands/build-manifest-types.d.ts.map +1 -0
  34. package/dist/src/commands/build-manifest-types.js +30 -0
  35. package/dist/src/commands/build-manifest-types.js.map +1 -0
  36. package/dist/src/commands/build-tools.d.ts +33 -0
  37. package/dist/src/commands/build-tools.d.ts.map +1 -0
  38. package/dist/src/commands/build-tools.js +237 -0
  39. package/dist/src/commands/build-tools.js.map +1 -0
  40. package/dist/src/commands/build.d.ts +23 -0
  41. package/dist/src/commands/build.d.ts.map +1 -0
  42. package/dist/src/commands/build.js +120 -0
  43. package/dist/src/commands/build.js.map +1 -0
  44. package/dist/src/commands/chat.d.ts +26 -0
  45. package/dist/src/commands/chat.d.ts.map +1 -0
  46. package/dist/src/commands/chat.js +123 -0
  47. package/dist/src/commands/chat.js.map +1 -0
  48. package/dist/src/commands/connect.d.ts +18 -0
  49. package/dist/src/commands/connect.d.ts.map +1 -0
  50. package/dist/src/commands/connect.js +198 -0
  51. package/dist/src/commands/connect.js.map +1 -0
  52. package/dist/src/commands/deploy.d.ts +20 -0
  53. package/dist/src/commands/deploy.d.ts.map +1 -0
  54. package/dist/src/commands/deploy.js +137 -0
  55. package/dist/src/commands/deploy.js.map +1 -0
  56. package/dist/src/commands/deployments.d.ts +17 -0
  57. package/dist/src/commands/deployments.d.ts.map +1 -0
  58. package/dist/src/commands/deployments.js +77 -0
  59. package/dist/src/commands/deployments.js.map +1 -0
  60. package/dist/src/commands/dev.d.ts +17 -0
  61. package/dist/src/commands/dev.d.ts.map +1 -0
  62. package/dist/src/commands/dev.js +109 -0
  63. package/dist/src/commands/dev.js.map +1 -0
  64. package/dist/src/commands/diff.d.ts +19 -0
  65. package/dist/src/commands/diff.d.ts.map +1 -0
  66. package/dist/src/commands/diff.js +120 -0
  67. package/dist/src/commands/diff.js.map +1 -0
  68. package/dist/src/commands/docker.d.ts +21 -0
  69. package/dist/src/commands/docker.d.ts.map +1 -0
  70. package/dist/src/commands/docker.js +215 -0
  71. package/dist/src/commands/docker.js.map +1 -0
  72. package/dist/src/commands/eval.d.ts +20 -0
  73. package/dist/src/commands/eval.d.ts.map +1 -0
  74. package/dist/src/commands/eval.js +236 -0
  75. package/dist/src/commands/eval.js.map +1 -0
  76. package/dist/src/commands/experiment.d.ts +21 -0
  77. package/dist/src/commands/experiment.d.ts.map +1 -0
  78. package/dist/src/commands/experiment.js +133 -0
  79. package/dist/src/commands/experiment.js.map +1 -0
  80. package/dist/src/commands/index.d.ts +10 -0
  81. package/dist/src/commands/index.d.ts.map +1 -0
  82. package/dist/src/commands/index.js +75 -0
  83. package/dist/src/commands/index.js.map +1 -0
  84. package/dist/src/commands/init.d.ts +17 -0
  85. package/dist/src/commands/init.d.ts.map +1 -0
  86. package/dist/src/commands/init.js +73 -0
  87. package/dist/src/commands/init.js.map +1 -0
  88. package/dist/src/commands/inspect.d.ts +22 -0
  89. package/dist/src/commands/inspect.d.ts.map +1 -0
  90. package/dist/src/commands/inspect.js +131 -0
  91. package/dist/src/commands/inspect.js.map +1 -0
  92. package/dist/src/commands/install-pkg.d.ts +29 -0
  93. package/dist/src/commands/install-pkg.d.ts.map +1 -0
  94. package/dist/src/commands/install-pkg.js +202 -0
  95. package/dist/src/commands/install-pkg.js.map +1 -0
  96. package/dist/src/commands/link.d.ts +32 -0
  97. package/dist/src/commands/link.d.ts.map +1 -0
  98. package/dist/src/commands/link.js +227 -0
  99. package/dist/src/commands/link.js.map +1 -0
  100. package/dist/src/commands/list.d.ts +19 -0
  101. package/dist/src/commands/list.d.ts.map +1 -0
  102. package/dist/src/commands/list.js +78 -0
  103. package/dist/src/commands/list.js.map +1 -0
  104. package/dist/src/commands/login.d.ts +31 -0
  105. package/dist/src/commands/login.d.ts.map +1 -0
  106. package/dist/src/commands/login.js +205 -0
  107. package/dist/src/commands/login.js.map +1 -0
  108. package/dist/src/commands/promote.d.ts +16 -0
  109. package/dist/src/commands/promote.d.ts.map +1 -0
  110. package/dist/src/commands/promote.js +55 -0
  111. package/dist/src/commands/promote.js.map +1 -0
  112. package/dist/src/commands/publish.d.ts +18 -0
  113. package/dist/src/commands/publish.d.ts.map +1 -0
  114. package/dist/src/commands/publish.js +122 -0
  115. package/dist/src/commands/publish.js.map +1 -0
  116. package/dist/src/commands/rollback.d.ts +17 -0
  117. package/dist/src/commands/rollback.d.ts.map +1 -0
  118. package/dist/src/commands/rollback.js +62 -0
  119. package/dist/src/commands/rollback.js.map +1 -0
  120. package/dist/src/commands/search.d.ts +20 -0
  121. package/dist/src/commands/search.d.ts.map +1 -0
  122. package/dist/src/commands/search.js +133 -0
  123. package/dist/src/commands/search.js.map +1 -0
  124. package/dist/src/commands/secrets.d.ts +20 -0
  125. package/dist/src/commands/secrets.d.ts.map +1 -0
  126. package/dist/src/commands/secrets.js +137 -0
  127. package/dist/src/commands/secrets.js.map +1 -0
  128. package/dist/src/commands/serve.d.ts +23 -0
  129. package/dist/src/commands/serve.d.ts.map +1 -0
  130. package/dist/src/commands/serve.js +144 -0
  131. package/dist/src/commands/serve.js.map +1 -0
  132. package/dist/src/commands/status.d.ts +16 -0
  133. package/dist/src/commands/status.d.ts.map +1 -0
  134. package/dist/src/commands/status.js +83 -0
  135. package/dist/src/commands/status.js.map +1 -0
  136. package/dist/src/commands/sync.d.ts +21 -0
  137. package/dist/src/commands/sync.d.ts.map +1 -0
  138. package/dist/src/commands/sync.js +94 -0
  139. package/dist/src/commands/sync.js.map +1 -0
  140. package/dist/src/commands/test-query.d.ts +19 -0
  141. package/dist/src/commands/test-query.d.ts.map +1 -0
  142. package/dist/src/commands/test-query.js +116 -0
  143. package/dist/src/commands/test-query.js.map +1 -0
  144. package/dist/src/commands/uninstall.d.ts +19 -0
  145. package/dist/src/commands/uninstall.d.ts.map +1 -0
  146. package/dist/src/commands/uninstall.js +84 -0
  147. package/dist/src/commands/uninstall.js.map +1 -0
  148. package/dist/src/commands/update.d.ts +21 -0
  149. package/dist/src/commands/update.d.ts.map +1 -0
  150. package/dist/src/commands/update.js +145 -0
  151. package/dist/src/commands/update.js.map +1 -0
  152. package/dist/src/commands/validate.d.ts +19 -0
  153. package/dist/src/commands/validate.d.ts.map +1 -0
  154. package/dist/src/commands/validate.js +114 -0
  155. package/dist/src/commands/validate.js.map +1 -0
  156. package/dist/src/fixtures/incident-response.d.ts +91 -0
  157. package/dist/src/fixtures/incident-response.d.ts.map +1 -0
  158. package/dist/src/fixtures/incident-response.js +208 -0
  159. package/dist/src/fixtures/incident-response.js.map +1 -0
  160. package/dist/src/main.d.ts +8 -0
  161. package/dist/src/main.d.ts.map +1 -0
  162. package/dist/src/main.js +30 -0
  163. package/dist/src/main.js.map +1 -0
  164. package/dist/src/shared/platform-client.d.ts +92 -0
  165. package/dist/src/shared/platform-client.d.ts.map +1 -0
  166. package/dist/src/shared/platform-client.js +155 -0
  167. package/dist/src/shared/platform-client.js.map +1 -0
  168. package/dist/src/shared/repo-discovery.d.ts +11 -0
  169. package/dist/src/shared/repo-discovery.d.ts.map +1 -0
  170. package/dist/src/shared/repo-discovery.js +33 -0
  171. package/dist/src/shared/repo-discovery.js.map +1 -0
  172. package/dist/src/templates/compose-template.d.ts +10 -0
  173. package/dist/src/templates/compose-template.d.ts.map +1 -0
  174. package/dist/src/templates/compose-template.js +30 -0
  175. package/dist/src/templates/compose-template.js.map +1 -0
  176. package/dist/src/templates/config-template.d.ts +14 -0
  177. package/dist/src/templates/config-template.d.ts.map +1 -0
  178. package/dist/src/templates/config-template.js +35 -0
  179. package/dist/src/templates/config-template.js.map +1 -0
  180. package/dist/src/templates/dockerfile-template.d.ts +10 -0
  181. package/dist/src/templates/dockerfile-template.d.ts.map +1 -0
  182. package/dist/src/templates/dockerfile-template.js +30 -0
  183. package/dist/src/templates/dockerfile-template.js.map +1 -0
  184. package/dist/src/templates/env-template.d.ts +12 -0
  185. package/dist/src/templates/env-template.d.ts.map +1 -0
  186. package/dist/src/templates/env-template.js +24 -0
  187. package/dist/src/templates/env-template.js.map +1 -0
  188. package/dist/src/templates/knowledge-template.d.ts +10 -0
  189. package/dist/src/templates/knowledge-template.d.ts.map +1 -0
  190. package/dist/src/templates/knowledge-template.js +24 -0
  191. package/dist/src/templates/knowledge-template.js.map +1 -0
  192. package/dist/src/templates/skill-template.d.ts +10 -0
  193. package/dist/src/templates/skill-template.d.ts.map +1 -0
  194. package/dist/src/templates/skill-template.js +27 -0
  195. package/dist/src/templates/skill-template.js.map +1 -0
  196. package/dist/src/ui/AskUserPrompt.d.ts +14 -0
  197. package/dist/src/ui/AskUserPrompt.d.ts.map +1 -0
  198. package/dist/src/ui/AskUserPrompt.js +17 -0
  199. package/dist/src/ui/AskUserPrompt.js.map +1 -0
  200. package/dist/src/ui/AssistantMessage.d.ts +14 -0
  201. package/dist/src/ui/AssistantMessage.d.ts.map +1 -0
  202. package/dist/src/ui/AssistantMessage.js +8 -0
  203. package/dist/src/ui/AssistantMessage.js.map +1 -0
  204. package/dist/src/ui/ChatApp.d.ts +15 -0
  205. package/dist/src/ui/ChatApp.d.ts.map +1 -0
  206. package/dist/src/ui/ChatApp.js +144 -0
  207. package/dist/src/ui/ChatApp.js.map +1 -0
  208. package/dist/src/ui/ConfirmationPrompt.d.ts +17 -0
  209. package/dist/src/ui/ConfirmationPrompt.d.ts.map +1 -0
  210. package/dist/src/ui/ConfirmationPrompt.js +21 -0
  211. package/dist/src/ui/ConfirmationPrompt.js.map +1 -0
  212. package/dist/src/ui/DiffRenderer.d.ts +32 -0
  213. package/dist/src/ui/DiffRenderer.d.ts.map +1 -0
  214. package/dist/src/ui/DiffRenderer.js +118 -0
  215. package/dist/src/ui/DiffRenderer.js.map +1 -0
  216. package/dist/src/ui/ExpandableContent.d.ts +15 -0
  217. package/dist/src/ui/ExpandableContent.d.ts.map +1 -0
  218. package/dist/src/ui/ExpandableContent.js +22 -0
  219. package/dist/src/ui/ExpandableContent.js.map +1 -0
  220. package/dist/src/ui/ExploreIndicator.d.ts +13 -0
  221. package/dist/src/ui/ExploreIndicator.d.ts.map +1 -0
  222. package/dist/src/ui/ExploreIndicator.js +14 -0
  223. package/dist/src/ui/ExploreIndicator.js.map +1 -0
  224. package/dist/src/ui/Footer.d.ts +19 -0
  225. package/dist/src/ui/Footer.d.ts.map +1 -0
  226. package/dist/src/ui/Footer.js +57 -0
  227. package/dist/src/ui/Footer.js.map +1 -0
  228. package/dist/src/ui/FullScreenLayout.d.ts +18 -0
  229. package/dist/src/ui/FullScreenLayout.d.ts.map +1 -0
  230. package/dist/src/ui/FullScreenLayout.js +14 -0
  231. package/dist/src/ui/FullScreenLayout.js.map +1 -0
  232. package/dist/src/ui/Header.d.ts +14 -0
  233. package/dist/src/ui/Header.d.ts.map +1 -0
  234. package/dist/src/ui/Header.js +11 -0
  235. package/dist/src/ui/Header.js.map +1 -0
  236. package/dist/src/ui/InputBar.d.ts +17 -0
  237. package/dist/src/ui/InputBar.d.ts.map +1 -0
  238. package/dist/src/ui/InputBar.js +49 -0
  239. package/dist/src/ui/InputBar.js.map +1 -0
  240. package/dist/src/ui/MessageList.d.ts +18 -0
  241. package/dist/src/ui/MessageList.d.ts.map +1 -0
  242. package/dist/src/ui/MessageList.js +9 -0
  243. package/dist/src/ui/MessageList.js.map +1 -0
  244. package/dist/src/ui/NotificationBar.d.ts +14 -0
  245. package/dist/src/ui/NotificationBar.d.ts.map +1 -0
  246. package/dist/src/ui/NotificationBar.js +38 -0
  247. package/dist/src/ui/NotificationBar.js.map +1 -0
  248. package/dist/src/ui/ScrollableMessageList.d.ts +27 -0
  249. package/dist/src/ui/ScrollableMessageList.d.ts.map +1 -0
  250. package/dist/src/ui/ScrollableMessageList.js +16 -0
  251. package/dist/src/ui/ScrollableMessageList.js.map +1 -0
  252. package/dist/src/ui/SessionBrowser.d.ts +20 -0
  253. package/dist/src/ui/SessionBrowser.d.ts.map +1 -0
  254. package/dist/src/ui/SessionBrowser.js +93 -0
  255. package/dist/src/ui/SessionBrowser.js.map +1 -0
  256. package/dist/src/ui/StatusMessage.d.ts +13 -0
  257. package/dist/src/ui/StatusMessage.d.ts.map +1 -0
  258. package/dist/src/ui/StatusMessage.js +17 -0
  259. package/dist/src/ui/StatusMessage.js.map +1 -0
  260. package/dist/src/ui/StreamingView.d.ts +19 -0
  261. package/dist/src/ui/StreamingView.d.ts.map +1 -0
  262. package/dist/src/ui/StreamingView.js +18 -0
  263. package/dist/src/ui/StreamingView.js.map +1 -0
  264. package/dist/src/ui/SubagentDisplay.d.ts +13 -0
  265. package/dist/src/ui/SubagentDisplay.d.ts.map +1 -0
  266. package/dist/src/ui/SubagentDisplay.js +22 -0
  267. package/dist/src/ui/SubagentDisplay.js.map +1 -0
  268. package/dist/src/ui/ThinkingDisplay.d.ts +13 -0
  269. package/dist/src/ui/ThinkingDisplay.d.ts.map +1 -0
  270. package/dist/src/ui/ThinkingDisplay.js +15 -0
  271. package/dist/src/ui/ThinkingDisplay.js.map +1 -0
  272. package/dist/src/ui/ToolCallDisplay.d.ts +16 -0
  273. package/dist/src/ui/ToolCallDisplay.d.ts.map +1 -0
  274. package/dist/src/ui/ToolCallDisplay.js +136 -0
  275. package/dist/src/ui/ToolCallDisplay.js.map +1 -0
  276. package/dist/src/ui/UserMessage.d.ts +12 -0
  277. package/dist/src/ui/UserMessage.d.ts.map +1 -0
  278. package/dist/src/ui/UserMessage.js +5 -0
  279. package/dist/src/ui/UserMessage.js.map +1 -0
  280. package/dist/src/ui/commands/clear.d.ts +7 -0
  281. package/dist/src/ui/commands/clear.d.ts.map +1 -0
  282. package/dist/src/ui/commands/clear.js +13 -0
  283. package/dist/src/ui/commands/clear.js.map +1 -0
  284. package/dist/src/ui/commands/help.d.ts +7 -0
  285. package/dist/src/ui/commands/help.d.ts.map +1 -0
  286. package/dist/src/ui/commands/help.js +26 -0
  287. package/dist/src/ui/commands/help.js.map +1 -0
  288. package/dist/src/ui/commands/index.d.ts +14 -0
  289. package/dist/src/ui/commands/index.d.ts.map +1 -0
  290. package/dist/src/ui/commands/index.js +15 -0
  291. package/dist/src/ui/commands/index.js.map +1 -0
  292. package/dist/src/ui/commands/model.d.ts +7 -0
  293. package/dist/src/ui/commands/model.d.ts.map +1 -0
  294. package/dist/src/ui/commands/model.js +16 -0
  295. package/dist/src/ui/commands/model.js.map +1 -0
  296. package/dist/src/ui/commands/registry.d.ts +30 -0
  297. package/dist/src/ui/commands/registry.d.ts.map +1 -0
  298. package/dist/src/ui/commands/registry.js +45 -0
  299. package/dist/src/ui/commands/registry.js.map +1 -0
  300. package/dist/src/ui/commands/sessions.d.ts +7 -0
  301. package/dist/src/ui/commands/sessions.d.ts.map +1 -0
  302. package/dist/src/ui/commands/sessions.js +13 -0
  303. package/dist/src/ui/commands/sessions.js.map +1 -0
  304. package/dist/src/ui/commands/stats.d.ts +7 -0
  305. package/dist/src/ui/commands/stats.d.ts.map +1 -0
  306. package/dist/src/ui/commands/stats.js +33 -0
  307. package/dist/src/ui/commands/stats.js.map +1 -0
  308. package/dist/src/ui/commands/theme.d.ts +7 -0
  309. package/dist/src/ui/commands/theme.d.ts.map +1 -0
  310. package/dist/src/ui/commands/theme.js +35 -0
  311. package/dist/src/ui/commands/theme.js.map +1 -0
  312. package/dist/src/ui/markdown/CodeBlock.d.ts +14 -0
  313. package/dist/src/ui/markdown/CodeBlock.d.ts.map +1 -0
  314. package/dist/src/ui/markdown/CodeBlock.js +55 -0
  315. package/dist/src/ui/markdown/CodeBlock.js.map +1 -0
  316. package/dist/src/ui/markdown/InlineRenderer.d.ts +12 -0
  317. package/dist/src/ui/markdown/InlineRenderer.d.ts.map +1 -0
  318. package/dist/src/ui/markdown/InlineRenderer.js +70 -0
  319. package/dist/src/ui/markdown/InlineRenderer.js.map +1 -0
  320. package/dist/src/ui/markdown/MarkdownDisplay.d.ts +17 -0
  321. package/dist/src/ui/markdown/MarkdownDisplay.d.ts.map +1 -0
  322. package/dist/src/ui/markdown/MarkdownDisplay.js +142 -0
  323. package/dist/src/ui/markdown/MarkdownDisplay.js.map +1 -0
  324. package/dist/src/ui/markdown/Table.d.ts +14 -0
  325. package/dist/src/ui/markdown/Table.d.ts.map +1 -0
  326. package/dist/src/ui/markdown/Table.js +31 -0
  327. package/dist/src/ui/markdown/Table.js.map +1 -0
  328. package/dist/src/ui/theme.d.ts +39 -0
  329. package/dist/src/ui/theme.d.ts.map +1 -0
  330. package/dist/src/ui/theme.js +39 -0
  331. package/dist/src/ui/theme.js.map +1 -0
  332. package/dist/src/ui/themes/index.d.ts +45 -0
  333. package/dist/src/ui/themes/index.d.ts.map +1 -0
  334. package/dist/src/ui/themes/index.js +73 -0
  335. package/dist/src/ui/themes/index.js.map +1 -0
  336. package/dist/src/ui/themes/light.d.ts +8 -0
  337. package/dist/src/ui/themes/light.d.ts.map +1 -0
  338. package/dist/src/ui/themes/light.js +37 -0
  339. package/dist/src/ui/themes/light.js.map +1 -0
  340. package/dist/src/ui/themes/monochrome.d.ts +8 -0
  341. package/dist/src/ui/themes/monochrome.d.ts.map +1 -0
  342. package/dist/src/ui/themes/monochrome.js +37 -0
  343. package/dist/src/ui/themes/monochrome.js.map +1 -0
  344. package/dist/src/ui/types.d.ts +191 -0
  345. package/dist/src/ui/types.d.ts.map +1 -0
  346. package/dist/src/ui/types.js +7 -0
  347. package/dist/src/ui/types.js.map +1 -0
  348. package/dist/src/ui/useAlternateBuffer.d.ts +11 -0
  349. package/dist/src/ui/useAlternateBuffer.d.ts.map +1 -0
  350. package/dist/src/ui/useAlternateBuffer.js +25 -0
  351. package/dist/src/ui/useAlternateBuffer.js.map +1 -0
  352. package/dist/src/ui/useChat.d.ts +18 -0
  353. package/dist/src/ui/useChat.d.ts.map +1 -0
  354. package/dist/src/ui/useChat.js +599 -0
  355. package/dist/src/ui/useChat.js.map +1 -0
  356. package/dist/src/ui/useElapsedTime.d.ts +11 -0
  357. package/dist/src/ui/useElapsedTime.d.ts.map +1 -0
  358. package/dist/src/ui/useElapsedTime.js +39 -0
  359. package/dist/src/ui/useElapsedTime.js.map +1 -0
  360. package/dist/src/ui/useResponsiveLayout.d.ts +16 -0
  361. package/dist/src/ui/useResponsiveLayout.d.ts.map +1 -0
  362. package/dist/src/ui/useResponsiveLayout.js +24 -0
  363. package/dist/src/ui/useResponsiveLayout.js.map +1 -0
  364. package/dist/src/ui/useScroll.d.ts +20 -0
  365. package/dist/src/ui/useScroll.d.ts.map +1 -0
  366. package/dist/src/ui/useScroll.js +64 -0
  367. package/dist/src/ui/useScroll.js.map +1 -0
  368. package/dist/src/ui/useSessionResume.d.ts +20 -0
  369. package/dist/src/ui/useSessionResume.d.ts.map +1 -0
  370. package/dist/src/ui/useSessionResume.js +77 -0
  371. package/dist/src/ui/useSessionResume.js.map +1 -0
  372. package/dist/tsconfig.tsbuildinfo +1 -0
  373. package/package.json +60 -0
  374. package/src/auth/index.ts +13 -0
  375. package/src/auth/oauth2.test.ts +305 -0
  376. package/src/auth/oauth2.ts +269 -0
  377. package/src/auth/prompt.test.ts +205 -0
  378. package/src/auth/prompt.ts +111 -0
  379. package/src/auth/test-connection.test.ts +224 -0
  380. package/src/auth/test-connection.ts +196 -0
  381. package/src/auth/types.ts +34 -0
  382. package/src/commands/audit.test.ts +92 -0
  383. package/src/commands/audit.ts +113 -0
  384. package/src/commands/automations.test.ts +85 -0
  385. package/src/commands/automations.ts +205 -0
  386. package/src/commands/build-manifest-types.ts +35 -0
  387. package/src/commands/build-tools.ts +281 -0
  388. package/src/commands/build.test.ts +63 -0
  389. package/src/commands/build.ts +135 -0
  390. package/src/commands/chat.ts +147 -0
  391. package/src/commands/command-exports.test.ts +88 -0
  392. package/src/commands/connect.test.ts +343 -0
  393. package/src/commands/connect.ts +237 -0
  394. package/src/commands/deploy.test.ts +124 -0
  395. package/src/commands/deploy.ts +153 -0
  396. package/src/commands/deployments.ts +90 -0
  397. package/src/commands/dev.test.ts +63 -0
  398. package/src/commands/dev.ts +124 -0
  399. package/src/commands/diff.test.ts +183 -0
  400. package/src/commands/diff.ts +143 -0
  401. package/src/commands/docker.ts +232 -0
  402. package/src/commands/eval.test.ts +88 -0
  403. package/src/commands/eval.ts +268 -0
  404. package/src/commands/experiment.test.ts +125 -0
  405. package/src/commands/experiment.ts +153 -0
  406. package/src/commands/index.ts +76 -0
  407. package/src/commands/init.test.ts +109 -0
  408. package/src/commands/init.ts +98 -0
  409. package/src/commands/inspect.test.ts +234 -0
  410. package/src/commands/inspect.ts +157 -0
  411. package/src/commands/install-pkg.test.ts +265 -0
  412. package/src/commands/install-pkg.ts +234 -0
  413. package/src/commands/link.ts +270 -0
  414. package/src/commands/list.test.ts +152 -0
  415. package/src/commands/list.ts +95 -0
  416. package/src/commands/login.test.ts +195 -0
  417. package/src/commands/login.ts +258 -0
  418. package/src/commands/promote.ts +64 -0
  419. package/src/commands/publish.test.ts +203 -0
  420. package/src/commands/publish.ts +142 -0
  421. package/src/commands/rollback.ts +72 -0
  422. package/src/commands/search.test.ts +174 -0
  423. package/src/commands/search.ts +154 -0
  424. package/src/commands/secrets.test.ts +168 -0
  425. package/src/commands/secrets.ts +163 -0
  426. package/src/commands/serve.ts +166 -0
  427. package/src/commands/status.ts +94 -0
  428. package/src/commands/sync.test.ts +130 -0
  429. package/src/commands/sync.ts +119 -0
  430. package/src/commands/test-query.test.ts +42 -0
  431. package/src/commands/test-query.ts +129 -0
  432. package/src/commands/uninstall.test.ts +162 -0
  433. package/src/commands/uninstall.ts +107 -0
  434. package/src/commands/update.test.ts +281 -0
  435. package/src/commands/update.ts +180 -0
  436. package/src/commands/validate.test.ts +260 -0
  437. package/src/commands/validate.ts +139 -0
  438. package/src/e2e-automations.test.ts +305 -0
  439. package/src/e2e-commands.test.ts +587 -0
  440. package/src/e2e-incident-response.test.ts +345 -0
  441. package/src/e2e-plugin-connections.test.ts +415 -0
  442. package/src/e2e-plugins.test.ts +492 -0
  443. package/src/e2e.test.ts +602 -0
  444. package/src/fixtures/incident-response.ts +232 -0
  445. package/src/main.ts +35 -0
  446. package/src/shared/platform-client.test.ts +106 -0
  447. package/src/shared/platform-client.ts +193 -0
  448. package/src/shared/repo-discovery.test.ts +56 -0
  449. package/src/shared/repo-discovery.ts +40 -0
  450. package/src/templates/compose-template.ts +30 -0
  451. package/src/templates/config-template.ts +44 -0
  452. package/src/templates/deployment-templates.test.ts +99 -0
  453. package/src/templates/dockerfile-template.ts +30 -0
  454. package/src/templates/env-template.ts +27 -0
  455. package/src/templates/knowledge-template.ts +24 -0
  456. package/src/templates/skill-template.ts +27 -0
  457. package/src/ui/AskUserPrompt.tsx +58 -0
  458. package/src/ui/AssistantMessage.tsx +51 -0
  459. package/src/ui/ChatApp.tsx +283 -0
  460. package/src/ui/ConfirmationPrompt.tsx +75 -0
  461. package/src/ui/DiffRenderer.test.ts +104 -0
  462. package/src/ui/DiffRenderer.tsx +188 -0
  463. package/src/ui/ExpandableContent.tsx +68 -0
  464. package/src/ui/ExploreIndicator.tsx +44 -0
  465. package/src/ui/Footer.tsx +87 -0
  466. package/src/ui/FullScreenLayout.tsx +45 -0
  467. package/src/ui/Header.tsx +50 -0
  468. package/src/ui/InputBar.tsx +105 -0
  469. package/src/ui/MessageList.tsx +31 -0
  470. package/src/ui/NotificationBar.tsx +64 -0
  471. package/src/ui/ScrollableMessageList.tsx +82 -0
  472. package/src/ui/SessionBrowser.test.ts +49 -0
  473. package/src/ui/SessionBrowser.tsx +179 -0
  474. package/src/ui/StatusMessage.tsx +35 -0
  475. package/src/ui/StreamingView.tsx +87 -0
  476. package/src/ui/SubagentDisplay.tsx +57 -0
  477. package/src/ui/ThinkingDisplay.tsx +45 -0
  478. package/src/ui/ToolCallDisplay.tsx +268 -0
  479. package/src/ui/UserMessage.tsx +22 -0
  480. package/src/ui/chat-e2e.test.ts +581 -0
  481. package/src/ui/commands/clear.ts +15 -0
  482. package/src/ui/commands/help.ts +31 -0
  483. package/src/ui/commands/index.ts +22 -0
  484. package/src/ui/commands/model.ts +19 -0
  485. package/src/ui/commands/registry.test.ts +76 -0
  486. package/src/ui/commands/registry.ts +66 -0
  487. package/src/ui/commands/sessions.ts +16 -0
  488. package/src/ui/commands/stats.ts +35 -0
  489. package/src/ui/commands/theme.ts +41 -0
  490. package/src/ui/markdown/CodeBlock.tsx +118 -0
  491. package/src/ui/markdown/InlineRenderer.tsx +115 -0
  492. package/src/ui/markdown/MarkdownDisplay.tsx +223 -0
  493. package/src/ui/markdown/Table.tsx +75 -0
  494. package/src/ui/theme.ts +39 -0
  495. package/src/ui/themes/index.ts +113 -0
  496. package/src/ui/themes/light.ts +39 -0
  497. package/src/ui/themes/monochrome.ts +39 -0
  498. package/src/ui/types.ts +157 -0
  499. package/src/ui/useAlternateBuffer.ts +27 -0
  500. package/src/ui/useChat.test.ts +492 -0
  501. package/src/ui/useChat.ts +693 -0
  502. package/src/ui/useElapsedTime.test.ts +33 -0
  503. package/src/ui/useElapsedTime.ts +43 -0
  504. package/src/ui/useResponsiveLayout.test.ts +54 -0
  505. package/src/ui/useResponsiveLayout.ts +32 -0
  506. package/src/ui/useScroll.test.ts +99 -0
  507. package/src/ui/useScroll.ts +97 -0
  508. package/src/ui/useSessionResume.test.ts +80 -0
  509. package/src/ui/useSessionResume.ts +102 -0
  510. package/tsconfig.json +17 -0
  511. package/vitest.config.ts +20 -0
@@ -0,0 +1,602 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+
7
+ /**
8
+ * End-to-end tests for the `amodal` CLI commands.
9
+ *
10
+ * Strategy: register each command's CommandModule in yargs, replace
11
+ * the handler with a capture function, parse real argv arrays, and
12
+ * verify the parsed args. This validates the full yargs pipeline:
13
+ * builder options -> positionals -> defaults -> type coercion.
14
+ */
15
+
16
+ import {describe, it, expect} from 'vitest';
17
+ import yargs from 'yargs/yargs';
18
+ import type {ArgumentsCamelCase, CommandModule} from 'yargs';
19
+
20
+ import {connectCommand} from './commands/connect.js';
21
+ import {installPkgCommand, parseInstallArgs} from './commands/install-pkg.js';
22
+ import {uninstallCommand} from './commands/uninstall.js';
23
+ import {listCommand} from './commands/list.js';
24
+ import {updateCommand} from './commands/update.js';
25
+ import {diffCommand} from './commands/diff.js';
26
+ import {searchCommand} from './commands/search.js';
27
+ import {publishCommand} from './commands/publish.js';
28
+ import {loginCommand} from './commands/login.js';
29
+ import {linkCommand} from './commands/link.js';
30
+ import {secretsCommand} from './commands/secrets.js';
31
+ import {validateCommand} from './commands/validate.js';
32
+ import {syncCommand} from './commands/sync.js';
33
+ import {initCommand} from './commands/init.js';
34
+ import {devCommand} from './commands/dev.js';
35
+ import {inspectCommand} from './commands/inspect.js';
36
+ import {deployCommand} from './commands/deploy.js';
37
+ import {buildCommand} from './commands/build.js';
38
+ import {dockerCommand} from './commands/docker.js';
39
+ import {rollbackCommand} from './commands/rollback.js';
40
+ import {deploymentsCommand} from './commands/deployments.js';
41
+ import {promoteCommand} from './commands/promote.js';
42
+ import {serveCommand} from './commands/serve.js';
43
+ import {statusCommand} from './commands/status.js';
44
+ import {auditCommand} from './commands/audit.js';
45
+ import {evalCommand} from './commands/eval.js';
46
+ import {experimentCommand} from './commands/experiment.js';
47
+ import {testQueryCommand} from './commands/test-query.js';
48
+ import {amodalCommands} from './commands/index.js';
49
+
50
+ /**
51
+ * Parse argv through yargs with a command module, capturing the parsed args
52
+ * instead of executing the real handler.
53
+ */
54
+ async function parseArgs(cmd: CommandModule, argv: string[]): Promise<ArgumentsCamelCase> {
55
+ let captured: ArgumentsCamelCase | undefined;
56
+
57
+ // Replace handler with a capture function
58
+ const testCmd: CommandModule = {
59
+ ...cmd,
60
+ handler: (args: ArgumentsCamelCase) => {
61
+ captured = args;
62
+ },
63
+ };
64
+
65
+ const parser = yargs(argv)
66
+ .command(testCmd)
67
+ .fail((msg, err) => {
68
+ if (err) throw err;
69
+ throw new Error(msg);
70
+ })
71
+ .exitProcess(false)
72
+ .strict(false);
73
+
74
+ await parser.parse();
75
+
76
+ if (!captured) {
77
+ throw new Error(`Handler not invoked for argv: ${argv.join(' ')}`);
78
+ }
79
+ return captured;
80
+ }
81
+
82
+ describe('amodal CLI e2e', () => {
83
+ // --- Registration ---
84
+
85
+ describe('command registration', () => {
86
+ it('exports all 30 commands', () => {
87
+ expect(amodalCommands).toHaveLength(30);
88
+ });
89
+
90
+ it('all commands have valid structure', () => {
91
+ for (const cmd of amodalCommands) {
92
+ expect(cmd.command).toBeDefined();
93
+ expect(typeof cmd.handler).toBe('function');
94
+ }
95
+ });
96
+ });
97
+
98
+ // --- connect ---
99
+
100
+ describe('connect', () => {
101
+ it('parses name positional', async () => {
102
+ const args = await parseArgs(connectCommand, ['connect', 'stripe']);
103
+ expect(args['name']).toBe('stripe');
104
+ expect(args['force']).toBe(false);
105
+ });
106
+
107
+ it('parses --force flag', async () => {
108
+ const args = await parseArgs(connectCommand, ['connect', 'stripe', '--force']);
109
+ expect(args['name']).toBe('stripe');
110
+ expect(args['force']).toBe(true);
111
+ });
112
+ });
113
+
114
+ // --- install ---
115
+
116
+ describe('install', () => {
117
+ it('bare install has empty packages array', async () => {
118
+ const args = await parseArgs(installPkgCommand, ['install']);
119
+ expect(args['packages']).toEqual([]);
120
+ });
121
+
122
+ it('variadic positional captures type/name pairs', async () => {
123
+ const args = await parseArgs(installPkgCommand, ['install', 'connection', 'salesforce', 'skill', 'triage']);
124
+ expect(args['packages']).toEqual(['connection', 'salesforce', 'skill', 'triage']);
125
+ });
126
+
127
+ it('parseInstallArgs converts pairs to typed objects', () => {
128
+ const result = parseInstallArgs(['connection', 'salesforce', 'skill', 'triage']);
129
+ expect(result).toEqual([
130
+ {type: 'connection', name: 'salesforce'},
131
+ {type: 'skill', name: 'triage'},
132
+ ]);
133
+ });
134
+
135
+ it('parseInstallArgs rejects invalid types', () => {
136
+ expect(() => parseInstallArgs(['invalid', 'test'])).toThrow('Invalid package type');
137
+ });
138
+
139
+ it('parseInstallArgs rejects incomplete pairs', () => {
140
+ expect(() => parseInstallArgs(['connection'])).toThrow('incomplete pair');
141
+ });
142
+ });
143
+
144
+ // --- uninstall ---
145
+
146
+ describe('uninstall', () => {
147
+ it('parses type and name positionals', async () => {
148
+ const args = await parseArgs(uninstallCommand, ['uninstall', 'connection', 'stripe']);
149
+ expect(args['type']).toBe('connection');
150
+ expect(args['name']).toBe('stripe');
151
+ });
152
+ });
153
+
154
+ // --- list ---
155
+
156
+ describe('list', () => {
157
+ it('defaults to json=false', async () => {
158
+ const args = await parseArgs(listCommand, ['list']);
159
+ expect(args['json']).toBe(false);
160
+ expect(args['type']).toBeUndefined();
161
+ });
162
+
163
+ it('parses --type and --json', async () => {
164
+ const args = await parseArgs(listCommand, ['list', '--type', 'skill', '--json']);
165
+ expect(args['type']).toBe('skill');
166
+ expect(args['json']).toBe(true);
167
+ });
168
+ });
169
+
170
+ // --- update ---
171
+
172
+ describe('update', () => {
173
+ it('optional positionals default to undefined', async () => {
174
+ const args = await parseArgs(updateCommand, ['update']);
175
+ expect(args['type']).toBeUndefined();
176
+ expect(args['name']).toBeUndefined();
177
+ expect(args['latest']).toBe(false);
178
+ expect(args['dryRun']).toBe(false);
179
+ });
180
+
181
+ it('parses type and name', async () => {
182
+ const args = await parseArgs(updateCommand, ['update', 'connection', 'stripe']);
183
+ expect(args['type']).toBe('connection');
184
+ expect(args['name']).toBe('stripe');
185
+ });
186
+
187
+ it('parses --latest and --dry-run', async () => {
188
+ const args = await parseArgs(updateCommand, ['update', '--latest', '--dry-run']);
189
+ expect(args['latest']).toBe(true);
190
+ expect(args['dryRun']).toBe(true);
191
+ });
192
+ });
193
+
194
+ // --- diff ---
195
+
196
+ describe('diff', () => {
197
+ it('parses type and name', async () => {
198
+ const args = await parseArgs(diffCommand, ['diff', 'skill', 'triage']);
199
+ expect(args['type']).toBe('skill');
200
+ expect(args['name']).toBe('triage');
201
+ });
202
+ });
203
+
204
+ // --- search ---
205
+
206
+ describe('search', () => {
207
+ it('optional query defaults to undefined', async () => {
208
+ const args = await parseArgs(searchCommand, ['search']);
209
+ expect(args['query']).toBeUndefined();
210
+ expect(args['json']).toBe(false);
211
+ });
212
+
213
+ it('parses query and --type', async () => {
214
+ const args = await parseArgs(searchCommand, ['search', 'stripe', '--type', 'connection']);
215
+ expect(args['query']).toBe('stripe');
216
+ expect(args['type']).toBe('connection');
217
+ });
218
+
219
+ it('parses --json', async () => {
220
+ const args = await parseArgs(searchCommand, ['search', '--json']);
221
+ expect(args['json']).toBe(true);
222
+ });
223
+ });
224
+
225
+ // --- publish ---
226
+
227
+ describe('publish', () => {
228
+ it('defaults', async () => {
229
+ const args = await parseArgs(publishCommand, ['publish']);
230
+ expect(args['dryRun']).toBe(false);
231
+ expect(args['registry']).toBeUndefined();
232
+ });
233
+
234
+ it('parses --dry-run and --registry', async () => {
235
+ const args = await parseArgs(publishCommand, ['publish', '--dry-run', '--registry', 'https://my-registry.dev']);
236
+ expect(args['dryRun']).toBe(true);
237
+ expect(args['registry']).toBe('https://my-registry.dev');
238
+ });
239
+ });
240
+
241
+ // --- login ---
242
+
243
+ describe('login', () => {
244
+ it('defaults', async () => {
245
+ const args = await parseArgs(loginCommand, ['login']);
246
+ expect(args['platformUrl']).toBeUndefined();
247
+ expect(args['adminUrl']).toBeUndefined();
248
+ });
249
+
250
+ it('parses --platform-url', async () => {
251
+ const args = await parseArgs(loginCommand, ['login', '--platform-url', 'https://custom.dev']);
252
+ expect(args['platformUrl']).toBe('https://custom.dev');
253
+ });
254
+
255
+ it('parses --admin-url', async () => {
256
+ const args = await parseArgs(loginCommand, ['login', '--admin-url', 'https://app.custom.dev']);
257
+ expect(args['adminUrl']).toBe('https://app.custom.dev');
258
+ });
259
+ });
260
+
261
+ // --- link ---
262
+
263
+ describe('link', () => {
264
+ it('defaults', async () => {
265
+ const args = await parseArgs(linkCommand, ['link']);
266
+ expect(args['yes']).toBeUndefined();
267
+ expect(args['orgId']).toBeUndefined();
268
+ expect(args['appId']).toBeUndefined();
269
+ });
270
+
271
+ it('parses --yes', async () => {
272
+ const args = await parseArgs(linkCommand, ['link', '--yes']);
273
+ expect(args['yes']).toBe(true);
274
+ });
275
+
276
+ it('parses --org-id and --app-id', async () => {
277
+ const args = await parseArgs(linkCommand, ['link', '--org-id', 'org-123', '--app-id', 'app-456']);
278
+ expect(args['orgId']).toBe('org-123');
279
+ expect(args['appId']).toBe('app-456');
280
+ });
281
+ });
282
+
283
+ // --- secrets ---
284
+
285
+ describe('secrets', () => {
286
+ it('parses set with key and value', async () => {
287
+ const args = await parseArgs(secretsCommand, ['secrets', 'set', 'API_KEY', 'secret123']);
288
+ expect(args['subcommand']).toBe('set');
289
+ expect(args['key']).toBe('API_KEY');
290
+ expect(args['value']).toBe('secret123');
291
+ });
292
+
293
+ it('parses list', async () => {
294
+ const args = await parseArgs(secretsCommand, ['secrets', 'list']);
295
+ expect(args['subcommand']).toBe('list');
296
+ expect(args['json']).toBe(false);
297
+ });
298
+
299
+ it('parses list --json', async () => {
300
+ const args = await parseArgs(secretsCommand, ['secrets', 'list', '--json']);
301
+ expect(args['subcommand']).toBe('list');
302
+ expect(args['json']).toBe(true);
303
+ });
304
+
305
+ it('parses delete with key', async () => {
306
+ const args = await parseArgs(secretsCommand, ['secrets', 'delete', 'OLD_KEY']);
307
+ expect(args['subcommand']).toBe('delete');
308
+ expect(args['key']).toBe('OLD_KEY');
309
+ });
310
+ });
311
+
312
+ // --- validate ---
313
+
314
+ describe('validate', () => {
315
+ it('defaults to packages=false', async () => {
316
+ const args = await parseArgs(validateCommand, ['validate']);
317
+ expect(args['packages']).toBe(false);
318
+ });
319
+
320
+ it('parses --packages', async () => {
321
+ const args = await parseArgs(validateCommand, ['validate', '--packages']);
322
+ expect(args['packages']).toBe(true);
323
+ });
324
+ });
325
+
326
+ // --- sync ---
327
+
328
+ describe('sync', () => {
329
+ it('defaults', async () => {
330
+ const args = await parseArgs(syncCommand, ['sync']);
331
+ expect(args['check']).toBe(false);
332
+ expect(args['connection']).toBeUndefined();
333
+ });
334
+
335
+ it('parses --check and --connection', async () => {
336
+ const args = await parseArgs(syncCommand, ['sync', '--check', '--connection', 'stripe']);
337
+ expect(args['check']).toBe(true);
338
+ expect(args['connection']).toBe('stripe');
339
+ });
340
+ });
341
+
342
+ // --- init ---
343
+
344
+ describe('init', () => {
345
+ it('defaults', async () => {
346
+ const args = await parseArgs(initCommand, ['init']);
347
+ expect(args['name']).toBeUndefined();
348
+ });
349
+
350
+ it('parses --name', async () => {
351
+ const args = await parseArgs(initCommand, ['init', '--name', 'my-project']);
352
+ expect(args['name']).toBe('my-project');
353
+ });
354
+
355
+ it('parses --provider', async () => {
356
+ const args = await parseArgs(initCommand, ['init', '--provider', 'anthropic']);
357
+ expect(args['provider']).toBe('anthropic');
358
+ });
359
+ });
360
+
361
+ // --- dev ---
362
+
363
+ describe('dev', () => {
364
+ it('defaults', async () => {
365
+ const args = await parseArgs(devCommand, ['dev']);
366
+ expect(args['port']).toBeUndefined();
367
+ expect(args['host']).toBeUndefined();
368
+ });
369
+
370
+ it('parses --port and --host', async () => {
371
+ const args = await parseArgs(devCommand, ['dev', '--port', '4000', '--host', '0.0.0.0']);
372
+ expect(args['port']).toBe(4000);
373
+ expect(args['host']).toBe('0.0.0.0');
374
+ });
375
+ });
376
+
377
+ // --- inspect ---
378
+
379
+ describe('inspect', () => {
380
+ it('all flags default to false', async () => {
381
+ const args = await parseArgs(inspectCommand, ['inspect']);
382
+ expect(args['context']).toBe(false);
383
+ expect(args['explore']).toBe(false);
384
+ expect(args['tools']).toBe(false);
385
+ expect(args['connections']).toBe(false);
386
+ expect(args['resolved']).toBe(false);
387
+ expect(args['scope']).toBeUndefined();
388
+ });
389
+
390
+ it('parses section flags and --scope', async () => {
391
+ const args = await parseArgs(inspectCommand, ['inspect', '--context', '--resolved', '--scope', 'connections/stripe']);
392
+ expect(args['context']).toBe(true);
393
+ expect(args['resolved']).toBe(true);
394
+ expect(args['scope']).toBe('connections/stripe');
395
+ });
396
+ });
397
+
398
+ // --- deploy ---
399
+
400
+ describe('deploy', () => {
401
+ it('parses --message flag', async () => {
402
+ const args = await parseArgs(deployCommand, ['deploy', '--message', 'v1.0 release']);
403
+ expect(args['message']).toBe('v1.0 release');
404
+ });
405
+
406
+ it('parses -m alias', async () => {
407
+ const args = await parseArgs(deployCommand, ['deploy', '-m', 'hotfix']);
408
+ expect(args['message']).toBe('hotfix');
409
+ });
410
+
411
+ it('parses --env flag', async () => {
412
+ const args = await parseArgs(deployCommand, ['deploy', '--env', 'staging']);
413
+ expect(args['env']).toBe('staging');
414
+ });
415
+
416
+ it('parses --dry-run flag', async () => {
417
+ const args = await parseArgs(deployCommand, ['deploy', '--dry-run']);
418
+ expect(args['dryRun']).toBe(true);
419
+ });
420
+
421
+ it('defaults dry-run to false', async () => {
422
+ const args = await parseArgs(deployCommand, ['deploy']);
423
+ expect(args['dryRun']).toBe(false);
424
+ });
425
+ });
426
+
427
+ // --- build ---
428
+
429
+ describe('build', () => {
430
+ it('parses --output flag', async () => {
431
+ const args = await parseArgs(buildCommand, ['build', '--output', '/tmp/out.json']);
432
+ expect(args['output']).toBe('/tmp/out.json');
433
+ });
434
+
435
+ it('parses -o alias', async () => {
436
+ const args = await parseArgs(buildCommand, ['build', '-o', '/tmp/out.json']);
437
+ expect(args['output']).toBe('/tmp/out.json');
438
+ });
439
+ });
440
+
441
+ // --- docker ---
442
+
443
+ describe('docker', () => {
444
+ it('parses subcommand', async () => {
445
+ const args = await parseArgs(dockerCommand, ['docker', 'check']);
446
+ expect(args['subcommand']).toBe('check');
447
+ });
448
+
449
+ it('parses --tag with build', async () => {
450
+ const args = await parseArgs(dockerCommand, ['docker', 'build', '--tag', 'v1.2.3']);
451
+ expect(args['subcommand']).toBe('build');
452
+ expect(args['tag']).toBe('v1.2.3');
453
+ });
454
+
455
+ it('accepts all valid subcommands', async () => {
456
+ for (const sub of ['init', 'check', 'build']) {
457
+ const args = await parseArgs(dockerCommand, ['docker', sub]);
458
+ expect(args['subcommand']).toBe(sub);
459
+ }
460
+ });
461
+ });
462
+
463
+ // --- rollback ---
464
+
465
+ describe('rollback', () => {
466
+ it('parses deploy-id positional', async () => {
467
+ const args = await parseArgs(rollbackCommand, ['rollback', 'deploy-abc1234']);
468
+ expect(args['deployId']).toBe('deploy-abc1234');
469
+ });
470
+
471
+ it('parses --env flag', async () => {
472
+ const args = await parseArgs(rollbackCommand, ['rollback', '--env', 'staging']);
473
+ expect(args['env']).toBe('staging');
474
+ });
475
+ });
476
+
477
+ // --- deployments ---
478
+
479
+ describe('deployments', () => {
480
+ it('parses --limit flag', async () => {
481
+ const args = await parseArgs(deploymentsCommand, ['deployments', '--limit', '5']);
482
+ expect(args['limit']).toBe(5);
483
+ });
484
+
485
+ it('parses --json flag', async () => {
486
+ const args = await parseArgs(deploymentsCommand, ['deployments', '--json']);
487
+ expect(args['json']).toBe(true);
488
+ });
489
+
490
+ it('defaults limit to 10', async () => {
491
+ const args = await parseArgs(deploymentsCommand, ['deployments']);
492
+ expect(args['limit']).toBe(10);
493
+ });
494
+ });
495
+
496
+ // --- promote ---
497
+
498
+ describe('promote', () => {
499
+ it('parses from-env positional', async () => {
500
+ const args = await parseArgs(promoteCommand, ['promote', 'staging']);
501
+ expect(args['fromEnv']).toBe('staging');
502
+ });
503
+
504
+ it('parses --to flag', async () => {
505
+ const args = await parseArgs(promoteCommand, ['promote', 'staging', '--to', 'production']);
506
+ expect(args['to']).toBe('production');
507
+ });
508
+ });
509
+
510
+ // --- serve ---
511
+
512
+ describe('serve', () => {
513
+ it('parses --config flag', async () => {
514
+ const args = await parseArgs(serveCommand, ['serve', '--config', '/tmp/snapshot.json']);
515
+ expect(args['config']).toBe('/tmp/snapshot.json');
516
+ });
517
+
518
+ it('parses --platform flag', async () => {
519
+ const args = await parseArgs(serveCommand, ['serve', '--platform']);
520
+ expect(args['platform']).toBe(true);
521
+ });
522
+ });
523
+
524
+ // --- status ---
525
+
526
+ describe('status', () => {
527
+ it('parses --env flag', async () => {
528
+ const args = await parseArgs(statusCommand, ['status', '--env', 'staging']);
529
+ expect(args['env']).toBe('staging');
530
+ });
531
+
532
+ it('parses --json flag', async () => {
533
+ const args = await parseArgs(statusCommand, ['status', '--json']);
534
+ expect(args['json']).toBe(true);
535
+ });
536
+ });
537
+
538
+ // --- audit ---
539
+
540
+ describe('audit', () => {
541
+ it('parses session-id positional', async () => {
542
+ const args = await parseArgs(auditCommand, ['audit', 'sess-abc123']);
543
+ expect(args['sessionId']).toBe('sess-abc123');
544
+ });
545
+
546
+ it('parses --format', async () => {
547
+ const args = await parseArgs(auditCommand, ['audit', 'sess-abc123', '--format', 'json']);
548
+ expect(args['sessionId']).toBe('sess-abc123');
549
+ expect(args['format']).toBe('json');
550
+ });
551
+ });
552
+
553
+ // --- eval ---
554
+
555
+ describe('eval', () => {
556
+ it('defaults', async () => {
557
+ const args = await parseArgs(evalCommand, ['eval']);
558
+ expect(args['diff']).toBe(false);
559
+ expect(args['ci']).toBe(false);
560
+ });
561
+
562
+ it('parses --filter --diff --ci --port', async () => {
563
+ const args = await parseArgs(evalCommand, ['eval', '--filter', 'stale', '--diff', '--ci', '--port', '5000']);
564
+ expect(args['filter']).toBe('stale');
565
+ expect(args['diff']).toBe(true);
566
+ expect(args['ci']).toBe(true);
567
+ expect(args['port']).toBe(5000);
568
+ });
569
+ });
570
+
571
+ // --- experiment ---
572
+
573
+ describe('experiment', () => {
574
+ it('parses action positional', async () => {
575
+ const args = await parseArgs(experimentCommand, ['experiment', 'list']);
576
+ expect(args['action']).toBe('list');
577
+ });
578
+
579
+ it('parses --name and --id', async () => {
580
+ const args = await parseArgs(experimentCommand, ['experiment', 'watch', '--name', 'test-exp', '--id', 'exp-123']);
581
+ expect(args['action']).toBe('watch');
582
+ expect(args['name']).toBe('test-exp');
583
+ expect(args['id']).toBe('exp-123');
584
+ });
585
+ });
586
+
587
+ // --- test-query ---
588
+
589
+ describe('test-query', () => {
590
+ it('parses message positional', async () => {
591
+ const args = await parseArgs(testQueryCommand, ['test-query', 'What is the status?']);
592
+ expect(args['message']).toBe('What is the status?');
593
+ });
594
+
595
+ it('parses --tenant-id and --port', async () => {
596
+ const args = await parseArgs(testQueryCommand, ['test-query', 'hello', '--tenant-id', 't-123', '--port', '3001']);
597
+ expect(args['message']).toBe('hello');
598
+ expect(args['tenantId']).toBe('t-123');
599
+ expect(args['port']).toBe(3001);
600
+ });
601
+ });
602
+ });