@synteq/cli 0.1.5 → 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 (387) hide show
  1. package/bin/run.js +61 -2
  2. package/dist/api/client.d.ts +29 -37
  3. package/dist/api/client.js +42 -49
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/api/factory.d.ts +3 -0
  6. package/dist/api/factory.js +1 -1
  7. package/dist/api/factory.js.map +1 -1
  8. package/dist/api/types.d.ts +14 -23
  9. package/dist/auth/scope.d.ts +19 -0
  10. package/dist/auth/scope.js +65 -0
  11. package/dist/auth/scope.js.map +1 -0
  12. package/dist/base/command.d.ts +1 -1
  13. package/dist/base/command.js +49 -0
  14. package/dist/base/command.js.map +1 -1
  15. package/dist/commands/account/index.d.ts +1 -0
  16. package/dist/commands/account/index.js +1 -0
  17. package/dist/commands/account/index.js.map +1 -1
  18. package/dist/commands/account/show.d.ts +1 -0
  19. package/dist/commands/account/show.js +1 -0
  20. package/dist/commands/account/show.js.map +1 -1
  21. package/dist/commands/api.d.ts +1 -0
  22. package/dist/commands/api.js +5 -4
  23. package/dist/commands/api.js.map +1 -1
  24. package/dist/commands/catalog.d.ts +1 -0
  25. package/dist/commands/catalog.js +6 -1
  26. package/dist/commands/catalog.js.map +1 -1
  27. package/dist/commands/config/index.d.ts +1 -0
  28. package/dist/commands/config/index.js +1 -0
  29. package/dist/commands/config/index.js.map +1 -1
  30. package/dist/commands/config/set-api-url.d.ts +1 -0
  31. package/dist/commands/config/set-api-url.js +38 -2
  32. package/dist/commands/config/set-api-url.js.map +1 -1
  33. package/dist/commands/config/show.d.ts +1 -0
  34. package/dist/commands/config/show.js +1 -0
  35. package/dist/commands/config/show.js.map +1 -1
  36. package/dist/commands/credits/add.d.ts +1 -0
  37. package/dist/commands/credits/add.js +1 -0
  38. package/dist/commands/credits/add.js.map +1 -1
  39. package/dist/commands/credits/index.d.ts +1 -0
  40. package/dist/commands/credits/index.js +1 -0
  41. package/dist/commands/credits/index.js.map +1 -1
  42. package/dist/commands/credits/list.d.ts +1 -0
  43. package/dist/commands/credits/list.js +1 -0
  44. package/dist/commands/credits/list.js.map +1 -1
  45. package/dist/commands/gpu/activity.d.ts +2 -0
  46. package/dist/commands/gpu/activity.js +7 -0
  47. package/dist/commands/gpu/activity.js.map +1 -1
  48. package/dist/commands/gpu/bandwidth.d.ts +2 -0
  49. package/dist/commands/gpu/bandwidth.js +5 -0
  50. package/dist/commands/gpu/bandwidth.js.map +1 -1
  51. package/dist/commands/gpu/boot-order.d.ts +2 -0
  52. package/dist/commands/gpu/boot-order.js +6 -0
  53. package/dist/commands/gpu/boot-order.js.map +1 -1
  54. package/dist/commands/gpu/console.d.ts +2 -0
  55. package/dist/commands/gpu/console.js +6 -0
  56. package/dist/commands/gpu/console.js.map +1 -1
  57. package/dist/commands/gpu/details.d.ts +3 -0
  58. package/dist/commands/gpu/details.js +10 -0
  59. package/dist/commands/gpu/details.js.map +1 -1
  60. package/dist/commands/gpu/index.d.ts +1 -0
  61. package/dist/commands/gpu/index.js +1 -0
  62. package/dist/commands/gpu/index.js.map +1 -1
  63. package/dist/commands/gpu/ip/add.d.ts +2 -0
  64. package/dist/commands/gpu/ip/add.js +7 -0
  65. package/dist/commands/gpu/ip/add.js.map +1 -1
  66. package/dist/commands/gpu/ip/list.d.ts +2 -0
  67. package/dist/commands/gpu/ip/list.js +5 -0
  68. package/dist/commands/gpu/ip/list.js.map +1 -1
  69. package/dist/commands/gpu/list.d.ts +1 -0
  70. package/dist/commands/gpu/list.js +1 -0
  71. package/dist/commands/gpu/list.js.map +1 -1
  72. package/dist/commands/gpu/order.d.ts +1 -0
  73. package/dist/commands/gpu/order.js +3 -0
  74. package/dist/commands/gpu/order.js.map +1 -1
  75. package/dist/commands/gpu/power.d.ts +2 -0
  76. package/dist/commands/gpu/power.js +7 -0
  77. package/dist/commands/gpu/power.js.map +1 -1
  78. package/dist/commands/gpu/reinstall.d.ts +2 -0
  79. package/dist/commands/gpu/reinstall.js +8 -0
  80. package/dist/commands/gpu/reinstall.js.map +1 -1
  81. package/dist/commands/gpu/resize.d.ts +2 -0
  82. package/dist/commands/gpu/resize.js +7 -0
  83. package/dist/commands/gpu/resize.js.map +1 -1
  84. package/dist/commands/gpu/stats.d.ts +2 -0
  85. package/dist/commands/gpu/stats.js +6 -0
  86. package/dist/commands/gpu/stats.js.map +1 -1
  87. package/dist/commands/help.d.ts +2 -0
  88. package/dist/commands/help.js +5 -0
  89. package/dist/commands/help.js.map +1 -1
  90. package/dist/commands/instant-metal/activity.d.ts +2 -0
  91. package/dist/commands/instant-metal/activity.js +7 -0
  92. package/dist/commands/instant-metal/activity.js.map +1 -1
  93. package/dist/commands/instant-metal/bandwidth.d.ts +2 -0
  94. package/dist/commands/instant-metal/bandwidth.js +5 -0
  95. package/dist/commands/instant-metal/bandwidth.js.map +1 -1
  96. package/dist/commands/instant-metal/boot-order.d.ts +2 -0
  97. package/dist/commands/instant-metal/boot-order.js +6 -0
  98. package/dist/commands/instant-metal/boot-order.js.map +1 -1
  99. package/dist/commands/instant-metal/console.d.ts +2 -0
  100. package/dist/commands/instant-metal/console.js +6 -0
  101. package/dist/commands/instant-metal/console.js.map +1 -1
  102. package/dist/commands/instant-metal/details.d.ts +3 -0
  103. package/dist/commands/instant-metal/details.js +10 -0
  104. package/dist/commands/instant-metal/details.js.map +1 -1
  105. package/dist/commands/instant-metal/index.d.ts +1 -0
  106. package/dist/commands/instant-metal/index.js +1 -0
  107. package/dist/commands/instant-metal/index.js.map +1 -1
  108. package/dist/commands/instant-metal/ip/add.d.ts +2 -0
  109. package/dist/commands/instant-metal/ip/add.js +7 -0
  110. package/dist/commands/instant-metal/ip/add.js.map +1 -1
  111. package/dist/commands/instant-metal/ip/list.d.ts +2 -0
  112. package/dist/commands/instant-metal/ip/list.js +5 -0
  113. package/dist/commands/instant-metal/ip/list.js.map +1 -1
  114. package/dist/commands/instant-metal/list.d.ts +1 -0
  115. package/dist/commands/instant-metal/list.js +1 -0
  116. package/dist/commands/instant-metal/list.js.map +1 -1
  117. package/dist/commands/instant-metal/order.d.ts +1 -0
  118. package/dist/commands/instant-metal/order.js +3 -0
  119. package/dist/commands/instant-metal/order.js.map +1 -1
  120. package/dist/commands/instant-metal/power.d.ts +2 -0
  121. package/dist/commands/instant-metal/power.js +7 -0
  122. package/dist/commands/instant-metal/power.js.map +1 -1
  123. package/dist/commands/instant-metal/reinstall.d.ts +2 -0
  124. package/dist/commands/instant-metal/reinstall.js +8 -0
  125. package/dist/commands/instant-metal/reinstall.js.map +1 -1
  126. package/dist/commands/instant-metal/resize.d.ts +2 -0
  127. package/dist/commands/instant-metal/resize.js +7 -0
  128. package/dist/commands/instant-metal/resize.js.map +1 -1
  129. package/dist/commands/instant-metal/stats.d.ts +2 -0
  130. package/dist/commands/instant-metal/stats.js +6 -0
  131. package/dist/commands/instant-metal/stats.js.map +1 -1
  132. package/dist/commands/login.d.ts +1 -0
  133. package/dist/commands/login.js +1 -0
  134. package/dist/commands/login.js.map +1 -1
  135. package/dist/commands/logout.d.ts +1 -0
  136. package/dist/commands/logout.js +1 -0
  137. package/dist/commands/logout.js.map +1 -1
  138. package/dist/commands/order/gpu.d.ts +1 -0
  139. package/dist/commands/order/gpu.js +3 -0
  140. package/dist/commands/order/gpu.js.map +1 -1
  141. package/dist/commands/order/instant-metal.d.ts +1 -0
  142. package/dist/commands/order/instant-metal.js +3 -0
  143. package/dist/commands/order/instant-metal.js.map +1 -1
  144. package/dist/commands/order/storage.d.ts +1 -0
  145. package/dist/commands/order/storage.js +2 -1
  146. package/dist/commands/order/storage.js.map +1 -1
  147. package/dist/commands/order/vps.d.ts +1 -0
  148. package/dist/commands/order/vps.js +3 -0
  149. package/dist/commands/order/vps.js.map +1 -1
  150. package/dist/commands/order.d.ts +1 -0
  151. package/dist/commands/order.js +1 -0
  152. package/dist/commands/order.js.map +1 -1
  153. package/dist/commands/os-images.d.ts +1 -0
  154. package/dist/commands/os-images.js +4 -1
  155. package/dist/commands/os-images.js.map +1 -1
  156. package/dist/commands/payments/index.d.ts +1 -0
  157. package/dist/commands/payments/index.js +1 -0
  158. package/dist/commands/payments/index.js.map +1 -1
  159. package/dist/commands/payments/methods/add.d.ts +1 -0
  160. package/dist/commands/payments/methods/add.js +1 -0
  161. package/dist/commands/payments/methods/add.js.map +1 -1
  162. package/dist/commands/payments/methods/delete.d.ts +1 -0
  163. package/dist/commands/payments/methods/delete.js +1 -0
  164. package/dist/commands/payments/methods/delete.js.map +1 -1
  165. package/dist/commands/payments/methods/index.d.ts +1 -0
  166. package/dist/commands/payments/methods/index.js +1 -0
  167. package/dist/commands/payments/methods/index.js.map +1 -1
  168. package/dist/commands/payments/methods/list.d.ts +1 -0
  169. package/dist/commands/payments/methods/list.js +1 -0
  170. package/dist/commands/payments/methods/list.js.map +1 -1
  171. package/dist/commands/payments/methods/set-default.d.ts +1 -0
  172. package/dist/commands/payments/methods/set-default.js +1 -0
  173. package/dist/commands/payments/methods/set-default.js.map +1 -1
  174. package/dist/commands/projects/index.d.ts +1 -0
  175. package/dist/commands/projects/index.js +1 -0
  176. package/dist/commands/projects/index.js.map +1 -1
  177. package/dist/commands/projects/list.d.ts +1 -0
  178. package/dist/commands/projects/list.js +1 -0
  179. package/dist/commands/projects/list.js.map +1 -1
  180. package/dist/commands/resources.d.ts +1 -0
  181. package/dist/commands/resources.js +33 -21
  182. package/dist/commands/resources.js.map +1 -1
  183. package/dist/commands/settings/index.d.ts +1 -0
  184. package/dist/commands/settings/index.js +1 -0
  185. package/dist/commands/settings/index.js.map +1 -1
  186. package/dist/commands/settings/render-mode.d.ts +1 -0
  187. package/dist/commands/settings/render-mode.js +1 -0
  188. package/dist/commands/settings/render-mode.js.map +1 -1
  189. package/dist/commands/ssh-key/add.d.ts +1 -0
  190. package/dist/commands/ssh-key/add.js +1 -0
  191. package/dist/commands/ssh-key/add.js.map +1 -1
  192. package/dist/commands/ssh-key/delete.d.ts +1 -0
  193. package/dist/commands/ssh-key/delete.js +1 -0
  194. package/dist/commands/ssh-key/delete.js.map +1 -1
  195. package/dist/commands/ssh-key/list.d.ts +1 -0
  196. package/dist/commands/ssh-key/list.js +1 -0
  197. package/dist/commands/ssh-key/list.js.map +1 -1
  198. package/dist/commands/storage/attach.d.ts +2 -1
  199. package/dist/commands/storage/attach.js +12 -11
  200. package/dist/commands/storage/attach.js.map +1 -1
  201. package/dist/commands/storage/detach.d.ts +1 -0
  202. package/dist/commands/storage/detach.js +3 -2
  203. package/dist/commands/storage/detach.js.map +1 -1
  204. package/dist/commands/storage/list.d.ts +1 -0
  205. package/dist/commands/storage/list.js +2 -1
  206. package/dist/commands/storage/list.js.map +1 -1
  207. package/dist/commands/storage/order.d.ts +2 -1
  208. package/dist/commands/storage/order.js +11 -10
  209. package/dist/commands/storage/order.js.map +1 -1
  210. package/dist/commands/storage/resize.d.ts +1 -0
  211. package/dist/commands/storage/resize.js +1 -0
  212. package/dist/commands/storage/resize.js.map +1 -1
  213. package/dist/commands/team/details.d.ts +1 -0
  214. package/dist/commands/team/details.js +1 -0
  215. package/dist/commands/team/details.js.map +1 -1
  216. package/dist/commands/team/invite.d.ts +1 -0
  217. package/dist/commands/team/invite.js +1 -0
  218. package/dist/commands/team/invite.js.map +1 -1
  219. package/dist/commands/team.d.ts +1 -0
  220. package/dist/commands/team.js +1 -0
  221. package/dist/commands/team.js.map +1 -1
  222. package/dist/commands/tickets/close.d.ts +1 -0
  223. package/dist/commands/tickets/close.js +1 -0
  224. package/dist/commands/tickets/close.js.map +1 -1
  225. package/dist/commands/tickets/create.d.ts +1 -0
  226. package/dist/commands/tickets/create.js +1 -0
  227. package/dist/commands/tickets/create.js.map +1 -1
  228. package/dist/commands/tickets/departments.d.ts +1 -0
  229. package/dist/commands/tickets/departments.js +1 -0
  230. package/dist/commands/tickets/departments.js.map +1 -1
  231. package/dist/commands/tickets/list.d.ts +1 -0
  232. package/dist/commands/tickets/list.js +1 -0
  233. package/dist/commands/tickets/list.js.map +1 -1
  234. package/dist/commands/tickets/open.d.ts +1 -0
  235. package/dist/commands/tickets/open.js +1 -0
  236. package/dist/commands/tickets/open.js.map +1 -1
  237. package/dist/commands/tickets/reopen.d.ts +11 -0
  238. package/dist/commands/tickets/reopen.js +34 -0
  239. package/dist/commands/tickets/reopen.js.map +1 -0
  240. package/dist/commands/tickets/reply.d.ts +1 -0
  241. package/dist/commands/tickets/reply.js +1 -0
  242. package/dist/commands/tickets/reply.js.map +1 -1
  243. package/dist/commands/transit.d.ts +1 -0
  244. package/dist/commands/transit.js +1 -0
  245. package/dist/commands/transit.js.map +1 -1
  246. package/dist/commands/tui/index.d.ts +1 -0
  247. package/dist/commands/tui/index.js +21 -0
  248. package/dist/commands/tui/index.js.map +1 -1
  249. package/dist/commands/vds/activity.d.ts +2 -0
  250. package/dist/commands/vds/activity.js +7 -0
  251. package/dist/commands/vds/activity.js.map +1 -1
  252. package/dist/commands/vds/bandwidth.d.ts +2 -0
  253. package/dist/commands/vds/bandwidth.js +5 -0
  254. package/dist/commands/vds/bandwidth.js.map +1 -1
  255. package/dist/commands/vds/boot-order.d.ts +2 -0
  256. package/dist/commands/vds/boot-order.js +6 -0
  257. package/dist/commands/vds/boot-order.js.map +1 -1
  258. package/dist/commands/vds/console.d.ts +2 -0
  259. package/dist/commands/vds/console.js +6 -0
  260. package/dist/commands/vds/console.js.map +1 -1
  261. package/dist/commands/vds/details.d.ts +3 -0
  262. package/dist/commands/vds/details.js +10 -0
  263. package/dist/commands/vds/details.js.map +1 -1
  264. package/dist/commands/vds/index.d.ts +1 -0
  265. package/dist/commands/vds/index.js +1 -0
  266. package/dist/commands/vds/index.js.map +1 -1
  267. package/dist/commands/vds/ip/add.d.ts +2 -0
  268. package/dist/commands/vds/ip/add.js +7 -0
  269. package/dist/commands/vds/ip/add.js.map +1 -1
  270. package/dist/commands/vds/ip/list.d.ts +2 -0
  271. package/dist/commands/vds/ip/list.js +5 -0
  272. package/dist/commands/vds/ip/list.js.map +1 -1
  273. package/dist/commands/vds/list.d.ts +1 -0
  274. package/dist/commands/vds/list.js +1 -0
  275. package/dist/commands/vds/list.js.map +1 -1
  276. package/dist/commands/vds/order.d.ts +2 -0
  277. package/dist/commands/vds/order.js +12 -3
  278. package/dist/commands/vds/order.js.map +1 -1
  279. package/dist/commands/vds/power.d.ts +2 -0
  280. package/dist/commands/vds/power.js +7 -0
  281. package/dist/commands/vds/power.js.map +1 -1
  282. package/dist/commands/vds/reinstall.d.ts +2 -0
  283. package/dist/commands/vds/reinstall.js +8 -0
  284. package/dist/commands/vds/reinstall.js.map +1 -1
  285. package/dist/commands/vds/resize.d.ts +2 -0
  286. package/dist/commands/vds/resize.js +7 -0
  287. package/dist/commands/vds/resize.js.map +1 -1
  288. package/dist/commands/vds/stats.d.ts +2 -0
  289. package/dist/commands/vds/stats.js +6 -0
  290. package/dist/commands/vds/stats.js.map +1 -1
  291. package/dist/commands/vps/activity.d.ts +1 -0
  292. package/dist/commands/vps/activity.js +5 -4
  293. package/dist/commands/vps/activity.js.map +1 -1
  294. package/dist/commands/vps/bandwidth.d.ts +1 -0
  295. package/dist/commands/vps/bandwidth.js +6 -5
  296. package/dist/commands/vps/bandwidth.js.map +1 -1
  297. package/dist/commands/vps/boot-order.d.ts +1 -0
  298. package/dist/commands/vps/boot-order.js +6 -5
  299. package/dist/commands/vps/boot-order.js.map +1 -1
  300. package/dist/commands/vps/console.d.ts +1 -0
  301. package/dist/commands/vps/console.js +10 -9
  302. package/dist/commands/vps/console.js.map +1 -1
  303. package/dist/commands/vps/details.d.ts +5 -0
  304. package/dist/commands/vps/details.js +21 -9
  305. package/dist/commands/vps/details.js.map +1 -1
  306. package/dist/commands/vps/ip/add.d.ts +1 -0
  307. package/dist/commands/vps/ip/add.js +11 -9
  308. package/dist/commands/vps/ip/add.js.map +1 -1
  309. package/dist/commands/vps/ip/list.d.ts +1 -0
  310. package/dist/commands/vps/ip/list.js +7 -6
  311. package/dist/commands/vps/ip/list.js.map +1 -1
  312. package/dist/commands/vps/list.d.ts +1 -0
  313. package/dist/commands/vps/list.js +5 -4
  314. package/dist/commands/vps/list.js.map +1 -1
  315. package/dist/commands/vps/order.d.ts +4 -2
  316. package/dist/commands/vps/order.js +26 -16
  317. package/dist/commands/vps/order.js.map +1 -1
  318. package/dist/commands/vps/power.d.ts +1 -0
  319. package/dist/commands/vps/power.js +15 -13
  320. package/dist/commands/vps/power.js.map +1 -1
  321. package/dist/commands/vps/reinstall.d.ts +1 -0
  322. package/dist/commands/vps/reinstall.js +15 -14
  323. package/dist/commands/vps/reinstall.js.map +1 -1
  324. package/dist/commands/vps/resize.d.ts +1 -0
  325. package/dist/commands/vps/resize.js +11 -9
  326. package/dist/commands/vps/resize.js.map +1 -1
  327. package/dist/commands/vps/stats.d.ts +1 -0
  328. package/dist/commands/vps/stats.js +8 -7
  329. package/dist/commands/vps/stats.js.map +1 -1
  330. package/dist/commands/whoami.d.ts +1 -0
  331. package/dist/commands/whoami.js +1 -0
  332. package/dist/commands/whoami.js.map +1 -1
  333. package/dist/help/help-filter.d.ts +10 -0
  334. package/dist/help/help-filter.js +9 -0
  335. package/dist/help/help-filter.js.map +1 -0
  336. package/dist/help/scope-aware-help.d.ts +30 -0
  337. package/dist/help/scope-aware-help.js +71 -0
  338. package/dist/help/scope-aware-help.js.map +1 -0
  339. package/dist/help.js +0 -1
  340. package/dist/help.js.map +1 -1
  341. package/dist/tui/App.js +1 -1
  342. package/dist/tui/App.js.map +1 -1
  343. package/dist/tui/components/NumberInput.js +1 -1
  344. package/dist/tui/components/Sparkline.js +1 -1
  345. package/dist/tui/screens/Billing.js +10 -10
  346. package/dist/tui/screens/Billing.js.map +1 -1
  347. package/dist/tui/screens/Dashboard.js +1 -1
  348. package/dist/tui/screens/Dashboard.js.map +1 -1
  349. package/dist/tui/screens/Order.js +328 -99
  350. package/dist/tui/screens/Order.js.map +1 -1
  351. package/dist/tui/screens/Resources.js +35 -64
  352. package/dist/tui/screens/Resources.js.map +1 -1
  353. package/dist/tui/screens/Tickets.js +31 -22
  354. package/dist/tui/screens/Tickets.js.map +1 -1
  355. package/dist/ui/image-resolve.js +1 -1
  356. package/dist/ui/image-resolve.js.map +1 -1
  357. package/dist/ui/payment.d.ts +1 -1
  358. package/dist/ui/resource-detail.d.ts +3 -0
  359. package/dist/ui/{vps-detail.js → resource-detail.js} +8 -8
  360. package/dist/ui/resource-detail.js.map +1 -0
  361. package/dist/ui/resource-resolve.d.ts +4 -0
  362. package/dist/ui/resource-resolve.js +24 -0
  363. package/dist/ui/resource-resolve.js.map +1 -0
  364. package/dist/ui/wait.d.ts +1 -1
  365. package/dist/ui/wait.js +4 -4
  366. package/dist/ui/wait.js.map +1 -1
  367. package/dist/version-check-bin.d.ts +35 -0
  368. package/dist/version-check-bin.js +123 -0
  369. package/dist/version-check-bin.js.map +1 -0
  370. package/dist/version-check.d.ts +39 -0
  371. package/dist/version-check.js +148 -0
  372. package/dist/version-check.js.map +1 -0
  373. package/package.json +11 -6
  374. package/dist/commands/bare-metal/index.d.ts +0 -4
  375. package/dist/commands/bare-metal/index.js +0 -5
  376. package/dist/commands/bare-metal/index.js.map +0 -1
  377. package/dist/commands/bare-metal/list.d.ts +0 -9
  378. package/dist/commands/bare-metal/list.js +0 -38
  379. package/dist/commands/bare-metal/list.js.map +0 -1
  380. package/dist/commands/bare-metal/order.d.ts +0 -6
  381. package/dist/commands/bare-metal/order.js +0 -27
  382. package/dist/commands/bare-metal/order.js.map +0 -1
  383. package/dist/ui/vps-detail.d.ts +0 -3
  384. package/dist/ui/vps-detail.js.map +0 -1
  385. package/dist/ui/vps-resolve.d.ts +0 -4
  386. package/dist/ui/vps-resolve.js +0 -24
  387. package/dist/ui/vps-resolve.js.map +0 -1
@@ -0,0 +1,123 @@
1
+ // Shared shim consumed by bin/run.js (compiled to dist/version-check-bin.js).
2
+ //
3
+ // bin/run.js needs to answer "is this invocation outdated?" from the
4
+ // cache file alone, synchronously, BEFORE oclif boots — no network call,
5
+ // no command-class introspection. That's a materially different job than
6
+ // version-check.ts's guardCliVersion() (which runs inside a live command
7
+ // with a resolved ApiClient and cmdId). This module exists so the bin-level
8
+ // answer reuses the SAME exempt set, comparator, cache-path resolver, and
9
+ // skip-env check as the module — no second copy to drift out of sync.
10
+ //
11
+ // bin/run.js can safely import from dist/ because package.json's
12
+ // oclif.commands / oclif.helpClass already point at ./dist/*, meaning
13
+ // dist/ must exist for the CLI to run at all in production. The separate
14
+ // bin/dev.js (ts-node) path never touches this file.
15
+ import { existsSync, readFileSync } from "node:fs";
16
+ import { join } from "node:path";
17
+ import * as semver from "semver";
18
+ import { CLI_VERSION } from "./api/client.js";
19
+ import { configDir } from "./config/paths.js";
20
+ import { VERSION_CHECK_EXEMPT, stripControlChars } from "./version-check.js";
21
+ export { VERSION_CHECK_EXEMPT, CLI_VERSION };
22
+ export function minVersionCachePath() {
23
+ return join(configDir(), "min-version.json");
24
+ }
25
+ /** True when SYNTEQ_SKIP_VERSION_CHECK=1 — mirrors the check in
26
+ * version-check.ts's loadOrFetchMinVersion (F2a). */
27
+ export function isSkipEnvSet() {
28
+ return process.env.SYNTEQ_SKIP_VERSION_CHECK === "1";
29
+ }
30
+ /** Does this argv invocation resolve to a VERSION_CHECK_EXEMPT command?
31
+ * (F2b/F2c)
32
+ *
33
+ * Two drift bugs this fixes relative to the old inline bin logic:
34
+ * - F2b (colon form): oclif accepts both `settings render-mode` and
35
+ * `settings:render-mode`. VERSION_CHECK_EXEMPT already lists both the
36
+ * bare topic ("settings") and the colon form ("settings:render-mode"),
37
+ * so testing each token both as-is AND split on ":" (topic-only) covers
38
+ * `settings`, `settings:render-mode`, and `settings render-mode` (two
39
+ * separate tokens, "settings" alone already matches).
40
+ * - F2c (flag-value false match): the old code took "the first non-flag
41
+ * token" as THE command, so `synteq -o json login` saw "json" first and
42
+ * never reached "login". Scanning ALL non-flag tokens for ANY exempt
43
+ * match is simpler and robust — login/logout/settings are commands here,
44
+ * never legitimate flag values in this CLI's grammar, so a false
45
+ * positive would require a flag value that's literally the string
46
+ * "login"/"logout"/"settings" — an acceptable, documented trade-off
47
+ * favoring "recovery command wrongly let through" over "recovery
48
+ * command wrongly blocked".
49
+ */
50
+ export function isExemptFromVersionCheck(argv) {
51
+ for (let i = 2; i < argv.length; i++) {
52
+ const arg = argv[i];
53
+ if (!arg || arg.startsWith("-"))
54
+ continue;
55
+ if (VERSION_CHECK_EXEMPT.has(arg))
56
+ return true;
57
+ const topic = arg.split(":")[0];
58
+ if (topic && VERSION_CHECK_EXEMPT.has(topic))
59
+ return true;
60
+ }
61
+ return false;
62
+ }
63
+ /** Read + validate the on-disk cache. Fails open (returns null) on any
64
+ * parse error, missing/wrong-typed fields, staleness, clock skew, or
65
+ * invalid semver in min_version (F5-cli) — never throws. */
66
+ function readMinVersionCacheForBin(cachePath) {
67
+ if (!existsSync(cachePath))
68
+ return null;
69
+ try {
70
+ const parsed = JSON.parse(readFileSync(cachePath, "utf8"));
71
+ if (typeof parsed?.min_version !== "string" || typeof parsed?.fetched_at !== "number")
72
+ return null;
73
+ if (!semver.valid(parsed.min_version))
74
+ return null; // corrupt/overflowed → fail open
75
+ const now = Date.now();
76
+ if (now - parsed.fetched_at > 6 * 60 * 60 * 1000)
77
+ return null; // stale (6h TTL)
78
+ if (now - parsed.fetched_at < 0)
79
+ return null; // clock went backward
80
+ return {
81
+ min: parsed.min_version,
82
+ msg: typeof parsed.deprecated_message === "string" ? parsed.deprecated_message : null,
83
+ };
84
+ }
85
+ catch {
86
+ return null;
87
+ }
88
+ }
89
+ function buildOutdatedMessage(min, deprecatedMessage) {
90
+ const lines = [
91
+ `synteq: this CLI (v${CLI_VERSION}) is older than the portal's required minimum (v${min}).`,
92
+ `Upgrade with: npm i -g @synteq/cli`,
93
+ ];
94
+ if (deprecatedMessage) {
95
+ lines.push("");
96
+ lines.push(stripControlChars(deprecatedMessage));
97
+ }
98
+ return lines.join("\n");
99
+ }
100
+ /** The single entry point bin/run.js calls. Returns the upgrade message to
101
+ * print (caller writes to stderr + exit 4), or null to proceed normally.
102
+ * Never throws — every failure mode (skip-env, exempt command, missing/
103
+ * corrupt/stale cache, invalid semver) resolves to null, i.e. fail-open,
104
+ * except the one case that's supposed to block: a validly-cached,
105
+ * unexpired min_version that's genuinely newer than CLI_VERSION. */
106
+ export function checkOutdatedFromCacheForBin(argv) {
107
+ if (isSkipEnvSet())
108
+ return null;
109
+ if (isExemptFromVersionCheck(argv))
110
+ return null;
111
+ const cache = readMinVersionCacheForBin(minVersionCachePath());
112
+ if (!cache)
113
+ return null;
114
+ try {
115
+ if (!semver.lt(CLI_VERSION, cache.min))
116
+ return null;
117
+ }
118
+ catch {
119
+ return null; // fail open on any comparator surprise (F5-cli)
120
+ }
121
+ return buildOutdatedMessage(cache.min, cache.msg);
122
+ }
123
+ //# sourceMappingURL=version-check-bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-check-bin.js","sourceRoot":"","sources":["../src/version-check-bin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { ApiClient } from "./api/client.js";
2
+ export declare const VERSION_CHECK_CACHE_TTL_MS: number;
3
+ /** Commands that MUST work even when the local CLI is outdated. Keep tight:
4
+ * login/logout so users can complete a re-auth if upgrade requires it;
5
+ * settings so users can inspect the state they're stuck in. Nothing else. */
6
+ export declare const VERSION_CHECK_EXEMPT: ReadonlySet<string>;
7
+ export interface MinVersionInfo {
8
+ minVersion: string;
9
+ deprecatedMessage: string | null;
10
+ fetchedAt: number;
11
+ }
12
+ /** Fetch the min-version record. Returns null when we couldn't get one AND
13
+ * had no stale cache to fall back on — the caller MUST treat null as
14
+ * "unknown, allow through" per the spec's fail-open error handling. */
15
+ export declare function loadOrFetchMinVersion(api: Pick<ApiClient, "auth"> | {
16
+ auth: {
17
+ minCliVersion: () => Promise<{
18
+ min_cli_version: string;
19
+ deprecated_message: string | null;
20
+ }>;
21
+ };
22
+ }, cacheFilePath?: string): Promise<MinVersionInfo | null>;
23
+ export declare function isCliOutdated(current: string, min: string): boolean;
24
+ /** Strip C0/C1 control characters (except newline) and bidi-override
25
+ * codepoints from a string. Defence-in-depth for `deprecatedMessage`,
26
+ * which originates as unauthenticated, admin-free-text server input
27
+ * (`GET /auth/device/version`) and is printed raw to the user's terminal.
28
+ * The backend sanitizes on write (see `text_sanitize.py`); this is a
29
+ * second, independent line of defence on the print path in case that
30
+ * ever regresses or a stale cache from before the backend fix lingers
31
+ * on disk. Shared by `formatUpgradeMessage` here and the bin-level shim
32
+ * (`version-check-bin.ts`) so both print paths agree. */
33
+ export declare function stripControlChars(s: string): string;
34
+ export declare function formatUpgradeMessage(current: string, min: string, deprecatedMessage: string | null, binName: string): string;
35
+ export interface GuardResult {
36
+ outdated: boolean;
37
+ message?: string;
38
+ }
39
+ export declare function guardCliVersion(api: Pick<ApiClient, "auth">, cmdId: string, binName: string, cacheFilePath?: string): Promise<GuardResult>;
@@ -0,0 +1,148 @@
1
+ import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync, chmodSync } from "node:fs";
2
+ import { randomUUID } from "node:crypto";
3
+ import { dirname, join } from "node:path";
4
+ import * as semver from "semver";
5
+ import { CLI_VERSION } from "./api/client.js";
6
+ import { configDir } from "./config/paths.js";
7
+ export const VERSION_CHECK_CACHE_TTL_MS = 6 * 60 * 60 * 1000;
8
+ /** Commands that MUST work even when the local CLI is outdated. Keep tight:
9
+ * login/logout so users can complete a re-auth if upgrade requires it;
10
+ * settings so users can inspect the state they're stuck in. Nothing else. */
11
+ export const VERSION_CHECK_EXEMPT = new Set([
12
+ "login",
13
+ "logout",
14
+ "settings",
15
+ "settings:render-mode",
16
+ "settings:index", // topic index
17
+ ]);
18
+ function defaultCacheFile() {
19
+ return join(configDir(), "min-version.json");
20
+ }
21
+ function readCache(cacheFilePath) {
22
+ if (!existsSync(cacheFilePath))
23
+ return null;
24
+ try {
25
+ const parsed = JSON.parse(readFileSync(cacheFilePath, "utf8"));
26
+ if (typeof parsed?.min_version !== "string" || typeof parsed?.fetched_at !== "number")
27
+ return null;
28
+ // F5: the backend's regex + max_length historically admitted values
29
+ // semver.lt() throws on (e.g. overflowing MAX_SAFE_INTEGER), and a
30
+ // hand-edited or older-format cache file can carry a non-semver string
31
+ // ("1.0"). Drop the entry rather than let a corrupt/overflowed cache
32
+ // crash the guard later — fail open, same as a missing cache.
33
+ if (!semver.valid(parsed.min_version))
34
+ return null;
35
+ return {
36
+ minVersion: parsed.min_version,
37
+ deprecatedMessage: typeof parsed.deprecated_message === "string" ? parsed.deprecated_message : null,
38
+ fetchedAt: parsed.fetched_at,
39
+ };
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ function writeCacheAtomic(cacheFilePath, info) {
46
+ const dir = dirname(cacheFilePath);
47
+ if (!existsSync(dir))
48
+ mkdirSync(dir, { recursive: true });
49
+ // randomUUID suffix (in addition to pid) avoids a collision if the pid is
50
+ // reused (common in containers) while a prior write's tmp file lingers.
51
+ const tmp = `${cacheFilePath}.tmp.${process.pid}.${randomUUID()}`;
52
+ writeFileSync(tmp, JSON.stringify({
53
+ min_version: info.minVersion,
54
+ deprecated_message: info.deprecatedMessage,
55
+ fetched_at: info.fetchedAt,
56
+ }), { mode: 0o600 });
57
+ // Match TokenStore's belt-and-suspenders pattern (src/auth/tokens.ts) —
58
+ // explicit chmod in case the platform/umask ignored the writeFileSync mode.
59
+ chmodSync(tmp, 0o600);
60
+ renameSync(tmp, cacheFilePath);
61
+ }
62
+ /** Fetch the min-version record. Returns null when we couldn't get one AND
63
+ * had no stale cache to fall back on — the caller MUST treat null as
64
+ * "unknown, allow through" per the spec's fail-open error handling. */
65
+ export async function loadOrFetchMinVersion(api, cacheFilePath = defaultCacheFile()) {
66
+ if (process.env.SYNTEQ_SKIP_VERSION_CHECK === "1")
67
+ return null;
68
+ const cached = readCache(cacheFilePath);
69
+ const now = Date.now();
70
+ if (cached && now - cached.fetchedAt < VERSION_CHECK_CACHE_TTL_MS && now - cached.fetchedAt >= 0) {
71
+ return cached;
72
+ }
73
+ try {
74
+ const resp = await api.auth.minCliVersion();
75
+ const info = {
76
+ minVersion: resp.min_cli_version,
77
+ deprecatedMessage: resp.deprecated_message ?? null,
78
+ fetchedAt: now,
79
+ };
80
+ writeCacheAtomic(cacheFilePath, info);
81
+ return info;
82
+ }
83
+ catch {
84
+ // Network / non-2xx / parse failure. Stale cache beats blocking the user.
85
+ return cached ?? null;
86
+ }
87
+ }
88
+ export function isCliOutdated(current, min) {
89
+ return semver.lt(current, min);
90
+ }
91
+ /** Strip C0/C1 control characters (except newline) and bidi-override
92
+ * codepoints from a string. Defence-in-depth for `deprecatedMessage`,
93
+ * which originates as unauthenticated, admin-free-text server input
94
+ * (`GET /auth/device/version`) and is printed raw to the user's terminal.
95
+ * The backend sanitizes on write (see `text_sanitize.py`); this is a
96
+ * second, independent line of defence on the print path in case that
97
+ * ever regresses or a stale cache from before the backend fix lingers
98
+ * on disk. Shared by `formatUpgradeMessage` here and the bin-level shim
99
+ * (`version-check-bin.ts`) so both print paths agree. */
100
+ export function stripControlChars(s) {
101
+ // C0 controls (\x00-\x1F) except \n (\x0A), plus DEL (\x7F), plus C1
102
+ // controls (\x80-\x9F), plus Unicode bidi override/embedding/isolate
103
+ // control codepoints (U+200E-U+200F, U+202A-U+202E, U+2066-U+2069).
104
+ // eslint-disable-next-line no-control-regex
105
+ return s.replace(/[\x00-\x09\x0B-\x1F\x7F-\x9F\u200e\u200f\u202a-\u202e\u2066-\u2069]/g, "");
106
+ }
107
+ export function formatUpgradeMessage(current, min, deprecatedMessage, binName) {
108
+ const lines = [
109
+ `${binName}: this CLI (v${current}) is older than the portal's required minimum (v${min}).`,
110
+ `Upgrade with: npm i -g @synteq/cli`,
111
+ ];
112
+ if (deprecatedMessage) {
113
+ lines.push("");
114
+ lines.push(stripControlChars(deprecatedMessage));
115
+ }
116
+ // Deliberately NOT advertising SYNTEQ_SKIP_VERSION_CHECK here: telling every
117
+ // blocked user to bypass the gate defeats it and produces broken requests
118
+ // against a portal their CLI no longer matches. The env var still works and
119
+ // is documented for tests/support in cli/CLAUDE.md — it just isn't surfaced
120
+ // in the user-facing block. Keep this in sync with buildOutdatedMessage in
121
+ // version-check-bin.ts (which likewise omits it).
122
+ return lines.join("\n");
123
+ }
124
+ export async function guardCliVersion(api, cmdId, binName, cacheFilePath) {
125
+ if (VERSION_CHECK_EXEMPT.has(cmdId))
126
+ return { outdated: false };
127
+ const info = await loadOrFetchMinVersion(api, cacheFilePath);
128
+ if (!info)
129
+ return { outdated: false }; // fail-open per spec
130
+ let outdated;
131
+ try {
132
+ outdated = isCliOutdated(CLI_VERSION, info.minVersion);
133
+ }
134
+ catch {
135
+ // F5: readCache already drops non-semver min_version values, and the
136
+ // network path's response is a live fetch (not free-form), but this
137
+ // guard is deliberately unconditional — a comparator surprise must
138
+ // never crash the command, only fail open.
139
+ return { outdated: false };
140
+ }
141
+ if (!outdated)
142
+ return { outdated: false };
143
+ return {
144
+ outdated: true,
145
+ message: formatUpgradeMessage(CLI_VERSION, info.minVersion, info.deprecatedMessage, binName),
146
+ };
147
+ }
148
+ //# sourceMappingURL=version-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-check.js","sourceRoot":"","sources":["../src/version-check.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synteq/cli",
3
- "version": "0.1.5",
3
+ "version": "0.2.0",
4
4
  "description": "Synteq Cloud command-line client",
5
5
  "bin": {
6
6
  "synteq": "bin/run.js"
@@ -19,13 +19,17 @@
19
19
  "dev": "node ./bin/dev.js",
20
20
  "test": "vitest run",
21
21
  "test:watch": "vitest",
22
+ "test:scope": "tsx --test test/scope.test.ts",
23
+ "test:help-filter": "tsx --test test/help-filter.test.ts",
24
+ "test:scope-coverage": "tsx --test test/scope-coverage.test.ts",
25
+ "test:version-check": "tsx --test test/version-check.test.ts",
22
26
  "typecheck": "tsc -p tsconfig.json --noEmit"
23
27
  },
24
28
  "oclif": {
25
29
  "bin": "synteq",
26
30
  "dirname": "synteq",
27
31
  "commands": "./dist/commands",
28
- "helpClass": "./dist/help",
32
+ "helpClass": "./dist/help/scope-aware-help.js",
29
33
  "topicSeparator": " ",
30
34
  "topics": {
31
35
  "order": {
@@ -93,12 +97,10 @@
93
97
  },
94
98
  "instant-metal:ip": {
95
99
  "description": "An Instant Metal server's IPs (list, add)."
96
- },
97
- "bare-metal": {
98
- "description": "Bare metal — coming soon. List existing servers; ordering isn't available yet (`bare-metal order`)."
99
100
  }
100
101
  },
101
102
  "exitCodes": {
103
+ "4": "Outdated client — CLI version is below the portal's minimum. Run the update command shown in the error.",
102
104
  "default": 1,
103
105
  "failedFlagParsing": 1,
104
106
  "failedFlagValidation": 1,
@@ -125,14 +127,17 @@
125
127
  "ink-text-input": "^6.0.0",
126
128
  "log-update": "^8.0.0",
127
129
  "open": "^10.1.0",
128
- "react": "^19.2.7"
130
+ "react": "^19.2.7",
131
+ "semver": "^7.8.5"
129
132
  },
130
133
  "optionalDependencies": {
131
134
  "keytar": "^7.9.0"
132
135
  },
133
136
  "devDependencies": {
134
137
  "@types/node": "^20.11.0",
138
+ "@types/semver": "^7.7.1",
135
139
  "ts-node": "^10.9.2",
140
+ "tsx": "^4.23.1",
136
141
  "typescript": "^5.4.0",
137
142
  "vitest": "^1.6.0"
138
143
  },
@@ -1,4 +0,0 @@
1
- import BareMetalList from "./list.js";
2
- export default class BareMetalDefault extends BareMetalList {
3
- static description: string;
4
- }
@@ -1,5 +0,0 @@
1
- import BareMetalList from "./list.js";
2
- export default class BareMetalDefault extends BareMetalList {
3
- static description = "Bare metal (coming soon) — list any existing servers; ordering isn't available yet (`bare-metal order`). Bare `synteq bare-metal` lists them.";
4
- }
5
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/bare-metal/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,WAAW,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,aAAa;IACzD,MAAM,CAAC,WAAW,GAChB,+IAA+I,CAAC"}
@@ -1,9 +0,0 @@
1
- import { BaseCommand } from "../../base/command.js";
2
- export default class BareMetalList extends BaseCommand {
3
- static description: string;
4
- static examples: string[];
5
- static flags: {
6
- project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
- };
8
- run(): Promise<void>;
9
- }
@@ -1,38 +0,0 @@
1
- import { Flags } from "@oclif/core";
2
- import { BaseCommand } from "../../base/command.js";
3
- import { renderTable, shortId } from "../../ui/table.js";
4
- import { statusColor } from "../../ui/glyphs.js";
5
- export default class BareMetalList extends BaseCommand {
6
- static description = "List your physical bare-metal servers. (Bare metal is coming soon — ordering isn't available yet; see `synteq bare-metal order`.)";
7
- static examples = [
8
- "<%= config.bin %> bare-metal list",
9
- "<%= config.bin %> bare-metal list -o json",
10
- ];
11
- static flags = {
12
- project: Flags.string({ description: "Scope to a project id." }),
13
- };
14
- async run() {
15
- await this.initClients();
16
- const { flags } = await this.parse(BareMetalList);
17
- try {
18
- const services = await this.clients.api.baremetal.list(flags.project);
19
- this.emit(services, () => {
20
- if (services.length === 0) {
21
- this.log("No bare-metal servers.");
22
- return;
23
- }
24
- this.log(renderTable(["ID", "HOSTNAME", "STATUS", "IP", "LOCATION"], services.map((s) => [
25
- shortId(s.id),
26
- s.hostname ?? s.reference,
27
- statusColor(s.is_active ? "active" : "inactive"),
28
- s.primary_ipv4 ?? "",
29
- s.location_city ?? s.location_name ?? "",
30
- ])));
31
- });
32
- }
33
- catch (err) {
34
- this.fail(err);
35
- }
36
- }
37
- }
38
- //# sourceMappingURL=list.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/bare-metal/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,MAAM,CAAC,WAAW,GAChB,mIAAmI,CAAC;IACtI,MAAM,CAAC,QAAQ,GAAG;QAChB,mCAAmC;QACnC,2CAA2C;KAC5C,CAAC;IACF,MAAM,CAAC,KAAK,GAAG;QACb,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;KACjE,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACtE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACvB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1B,IAAI,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;oBACnC,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,GAAG,CACN,WAAW,CACT,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,EAC9C,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;oBAClB,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;oBACb,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS;oBACzB,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;oBAChD,CAAC,CAAC,YAAY,IAAI,EAAE;oBACpB,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,aAAa,IAAI,EAAE;iBACzC,CAAC,CACH,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC"}
@@ -1,6 +0,0 @@
1
- import { BaseCommand } from "../../base/command.js";
2
- export default class BareMetalOrder extends BaseCommand {
3
- static description: string;
4
- static examples: string[];
5
- run(): Promise<void>;
6
- }
@@ -1,27 +0,0 @@
1
- import { BaseCommand } from "../../base/command.js";
2
- export default class BareMetalOrder extends BaseCommand {
3
- static description = "Bare metal is coming soon (not yet orderable). Shows how to register interest.";
4
- static examples = [
5
- "<%= config.bin %> bare-metal order",
6
- ];
7
- async run() {
8
- await this.initClients();
9
- const lines = [
10
- "Bare metal is coming soon — it's not available to order yet.",
11
- "",
12
- "Want to be notified when it launches? Register your interest:",
13
- ' synteq ticket create --department sales \\',
14
- ' --subject "Bare metal — notify me at launch" \\',
15
- ' --message "The specs / location / timeline you’re after"',
16
- "",
17
- "Need a dedicated server today? Instant Metal is self-serve and deploys",
18
- "in minutes:",
19
- " synteq instant-metal order",
20
- ];
21
- this.emit({ orderable: false, status: "coming_soon", register_interest: "ticket", department: "sales" }, () => {
22
- for (const l of lines)
23
- this.log(l);
24
- });
25
- }
26
- }
27
- //# sourceMappingURL=order.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"order.js","sourceRoot":"","sources":["../../../src/commands/bare-metal/order.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,WAAW;IACrD,MAAM,CAAC,WAAW,GAChB,gFAAgF,CAAC;IACnF,MAAM,CAAC,QAAQ,GAAG;QAChB,oCAAoC;KACrC,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG;YACZ,8DAA8D;YAC9D,EAAE;YACF,+DAA+D;YAC/D,8CAA8C;YAC9C,qDAAqD;YACrD,8DAA8D;YAC9D,EAAE;YACF,wEAAwE;YACxE,aAAa;YACb,8BAA8B;SAC/B,CAAC;QACF,IAAI,CAAC,IAAI,CACP,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,EAC7F,GAAG,EAAE;YACH,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CACF,CAAC;IACJ,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { Resource } from "../api/types.js";
2
- export declare function resolveVps(vpsList: Resource[], query: string): Resource[];
3
- export declare function formatVpsDetail(v: Resource): string;
@@ -1 +0,0 @@
1
- {"version":3,"file":"vps-detail.js","sourceRoot":"","sources":["../../src/ui/vps-detail.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import type { ApiClient } from "../api/client.js";
2
- import type { Resource } from "../api/types.js";
3
- export declare function resolveVpsRef(api: ApiClient, query: string, projectId?: string): Promise<Resource>;
4
- export declare function resolveVpsId(api: ApiClient, query: string, projectId?: string): Promise<string>;
@@ -1,24 +0,0 @@
1
- import { resolveVps } from "./vps-detail.js";
2
- const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
3
- export async function resolveVpsRef(api, query, projectId) {
4
- const q = query.trim();
5
- if (UUID_RE.test(q)) {
6
- return api.vps.get(q);
7
- }
8
- const list = await api.vps.list(projectId);
9
- const hits = resolveVps(list, q);
10
- if (hits.length === 1)
11
- return hits[0];
12
- if (hits.length === 0) {
13
- throw new Error(`No Resource matches "${query}". Run \`synteq vps list\` to see ids / hostnames.`);
14
- }
15
- const preview = hits
16
- .slice(0, 5)
17
- .map((v) => `${v.id.slice(0, 8)} ${v.hostname}`)
18
- .join(", ");
19
- throw new Error(`"${query}" matches ${hits.length} VPSes (${preview}${hits.length > 5 ? ", …" : ""}). Use a longer id or the full hostname.`);
20
- }
21
- export async function resolveVpsId(api, query, projectId) {
22
- return (await resolveVpsRef(api, query, projectId)).id;
23
- }
24
- //# sourceMappingURL=vps-resolve.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vps-resolve.js","sourceRoot":"","sources":["../../src/ui/vps-resolve.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,OAAO,GACX,iEAAiE,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAc,EACd,KAAa,EACb,SAAkB;IAElB,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAEvB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,wBAAwB,KAAK,oDAAoD,CAClF,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,IAAI;SACjB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;SAC/C,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,IAAI,KAAK,CACb,IAAI,KAAK,aAAa,IAAI,CAAC,MAAM,WAAW,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,0CAA0C,CAC7H,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAc,EACd,KAAa,EACb,SAAkB;IAElB,OAAO,CAAC,MAAM,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AACzD,CAAC"}