opendevbrowser 0.0.28 → 0.0.30

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 (325) hide show
  1. package/README.md +2 -2
  2. package/dist/accessibility-snapshot-CQ4ZKWKC.js +39 -0
  3. package/dist/accessibility-snapshot-CQ4ZKWKC.js.map +1 -0
  4. package/dist/active-window-TD5HYJ72.js +37 -0
  5. package/dist/active-window-TD5HYJ72.js.map +1 -0
  6. package/dist/annotate-VTLFS2XV.js +205 -0
  7. package/dist/annotate-VTLFS2XV.js.map +1 -0
  8. package/dist/artifacts-KJ6RNDO2.js +120 -0
  9. package/dist/artifacts-KJ6RNDO2.js.map +1 -0
  10. package/dist/attr-BCI5KYCW.js +84 -0
  11. package/dist/attr-BCI5KYCW.js.map +1 -0
  12. package/dist/browser/ops-client.d.ts +1 -0
  13. package/dist/browser/ops-client.d.ts.map +1 -1
  14. package/dist/canvas-5DFEEOKM.js +309 -0
  15. package/dist/canvas-5DFEEOKM.js.map +1 -0
  16. package/dist/capture-desktop-HFTTWY4Z.js +38 -0
  17. package/dist/capture-desktop-HFTTWY4Z.js.map +1 -0
  18. package/dist/capture-window-X63XPIFF.js +40 -0
  19. package/dist/capture-window-X63XPIFF.js.map +1 -0
  20. package/dist/check-LWAUY7GC.js +71 -0
  21. package/dist/check-LWAUY7GC.js.map +1 -0
  22. package/dist/checked-ZSOUKVYT.js +71 -0
  23. package/dist/checked-ZSOUKVYT.js.map +1 -0
  24. package/dist/chunk-2SIMIPLY.js +67 -0
  25. package/dist/chunk-2SIMIPLY.js.map +1 -0
  26. package/dist/chunk-37VSRUW4.js +141 -0
  27. package/dist/chunk-37VSRUW4.js.map +1 -0
  28. package/dist/{chunk-T3VVHJTK.js → chunk-4BEJVZRK.js} +1078 -1458
  29. package/dist/chunk-4BEJVZRK.js.map +1 -0
  30. package/dist/chunk-5SWZDVOW.js +144 -0
  31. package/dist/chunk-5SWZDVOW.js.map +1 -0
  32. package/dist/chunk-6PVZ2ABC.js +429 -0
  33. package/dist/chunk-6PVZ2ABC.js.map +1 -0
  34. package/dist/chunk-7GVOUZMQ.js +64 -0
  35. package/dist/chunk-7GVOUZMQ.js.map +1 -0
  36. package/dist/chunk-7THCPS52.js +84 -0
  37. package/dist/chunk-7THCPS52.js.map +1 -0
  38. package/dist/chunk-AHEWXOKY.js +64 -0
  39. package/dist/chunk-AHEWXOKY.js.map +1 -0
  40. package/dist/chunk-ASMHEEKY.js +10 -0
  41. package/dist/chunk-ASMHEEKY.js.map +1 -0
  42. package/dist/chunk-COAOWH3G.js +3651 -0
  43. package/dist/chunk-COAOWH3G.js.map +1 -0
  44. package/dist/chunk-DBF5OKH3.js +111 -0
  45. package/dist/chunk-DBF5OKH3.js.map +1 -0
  46. package/dist/chunk-DW4TX7MU.js +54 -0
  47. package/dist/chunk-DW4TX7MU.js.map +1 -0
  48. package/dist/chunk-GQJ5S3BL.js +20 -0
  49. package/dist/chunk-GQJ5S3BL.js.map +1 -0
  50. package/dist/chunk-IPE7TF2P.js +54 -0
  51. package/dist/chunk-IPE7TF2P.js.map +1 -0
  52. package/dist/chunk-IQTJHXZJ.js +126 -0
  53. package/dist/chunk-IQTJHXZJ.js.map +1 -0
  54. package/dist/chunk-J47N77VG.js +2969 -0
  55. package/dist/chunk-J47N77VG.js.map +1 -0
  56. package/dist/chunk-JZXD6FWR.js +25 -0
  57. package/dist/chunk-JZXD6FWR.js.map +1 -0
  58. package/dist/{chunk-QVWOPIZJ.js → chunk-KDSNXS6N.js} +75 -149
  59. package/dist/chunk-KDSNXS6N.js.map +1 -0
  60. package/dist/chunk-KZ2IXVQT.js +219 -0
  61. package/dist/chunk-KZ2IXVQT.js.map +1 -0
  62. package/dist/chunk-MD655IPO.js +838 -0
  63. package/dist/chunk-MD655IPO.js.map +1 -0
  64. package/dist/chunk-MX3NFLCE.js +940 -0
  65. package/dist/chunk-MX3NFLCE.js.map +1 -0
  66. package/dist/chunk-OW5HMYMI.js +19 -0
  67. package/dist/chunk-OW5HMYMI.js.map +1 -0
  68. package/dist/chunk-PPUWQKIC.js +26 -0
  69. package/dist/chunk-PPUWQKIC.js.map +1 -0
  70. package/dist/{chunk-I5ZCOZZV.js → chunk-QOMWCRE3.js} +1202 -9561
  71. package/dist/chunk-QOMWCRE3.js.map +1 -0
  72. package/dist/chunk-RCZZGGJS.js +226 -0
  73. package/dist/chunk-RCZZGGJS.js.map +1 -0
  74. package/dist/chunk-RJNI3BHT.js +1 -0
  75. package/dist/chunk-RPXWUCQQ.js +112 -0
  76. package/dist/chunk-RPXWUCQQ.js.map +1 -0
  77. package/dist/chunk-S5KZQJJI.js +107 -0
  78. package/dist/chunk-S5KZQJJI.js.map +1 -0
  79. package/dist/chunk-T4GMCW6Z.js +46 -0
  80. package/dist/chunk-T4GMCW6Z.js.map +1 -0
  81. package/dist/chunk-WHQZBUNY.js +982 -0
  82. package/dist/chunk-WHQZBUNY.js.map +1 -0
  83. package/dist/chunk-WOXBLP7V.js +610 -0
  84. package/dist/chunk-WOXBLP7V.js.map +1 -0
  85. package/dist/cli/commands/inspiredesign.d.ts.map +1 -1
  86. package/dist/cli/commands/macro-resolve.d.ts +4 -1
  87. package/dist/cli/commands/macro-resolve.d.ts.map +1 -1
  88. package/dist/cli/commands/product-video.d.ts.map +1 -1
  89. package/dist/cli/commands/research.d.ts.map +1 -1
  90. package/dist/cli/commands/serve.d.ts.map +1 -1
  91. package/dist/cli/commands/shopping.d.ts.map +1 -1
  92. package/dist/cli/commands/workflow-output.d.ts +2 -0
  93. package/dist/cli/commands/workflow-output.d.ts.map +1 -0
  94. package/dist/cli/daemon-commands.d.ts.map +1 -1
  95. package/dist/cli/daemon.d.ts.map +1 -1
  96. package/dist/cli/index.js +204 -8123
  97. package/dist/cli/index.js.map +1 -1
  98. package/dist/cli/installers/postinstall-skill-sync.js +2 -1
  99. package/dist/cli/installers/postinstall-skill-sync.js.map +1 -1
  100. package/dist/cli/remote-relay.d.ts.map +1 -1
  101. package/dist/click-2AILSEIZ.js +81 -0
  102. package/dist/click-2AILSEIZ.js.map +1 -0
  103. package/dist/clone-component-TPJS3PEG.js +82 -0
  104. package/dist/clone-component-TPJS3PEG.js.map +1 -0
  105. package/dist/clone-page-LE74CIFC.js +69 -0
  106. package/dist/clone-page-LE74CIFC.js.map +1 -0
  107. package/dist/close-HN4YI47K.js +63 -0
  108. package/dist/close-HN4YI47K.js.map +1 -0
  109. package/dist/close-WFERRHX6.js +63 -0
  110. package/dist/close-WFERRHX6.js.map +1 -0
  111. package/dist/connect-RWBV2UCQ.js +107 -0
  112. package/dist/connect-RWBV2UCQ.js.map +1 -0
  113. package/dist/console-poll-PP4YYPDF.js +76 -0
  114. package/dist/console-poll-PP4YYPDF.js.map +1 -0
  115. package/dist/cookie-import-6IP776FC.js +177 -0
  116. package/dist/cookie-import-6IP776FC.js.map +1 -0
  117. package/dist/cookie-list-O2KG6DPU.js +117 -0
  118. package/dist/cookie-list-O2KG6DPU.js.map +1 -0
  119. package/dist/daemon-2BSAZXLT.js +194 -0
  120. package/dist/daemon-2BSAZXLT.js.map +1 -0
  121. package/dist/daemon-fingerprint.json +1 -1
  122. package/dist/debug-trace-snapshot-F3BDVZXS.js +136 -0
  123. package/dist/debug-trace-snapshot-F3BDVZXS.js.map +1 -0
  124. package/dist/dialog-6JQYUWMQ.js +75 -0
  125. package/dist/dialog-6JQYUWMQ.js.map +1 -0
  126. package/dist/disconnect-763TP7GH.js +58 -0
  127. package/dist/disconnect-763TP7GH.js.map +1 -0
  128. package/dist/enabled-DLYQFNIP.js +71 -0
  129. package/dist/enabled-DLYQFNIP.js.map +1 -0
  130. package/dist/extension-extractor-GKWSFHPN.js +11 -0
  131. package/dist/extension-extractor-GKWSFHPN.js.map +1 -0
  132. package/dist/global-D6WLWBXA.js +56 -0
  133. package/dist/global-D6WLWBXA.js.map +1 -0
  134. package/dist/goto-S346TJJH.js +98 -0
  135. package/dist/goto-S346TJJH.js.map +1 -0
  136. package/dist/help-EKKKEDL5.js +491 -0
  137. package/dist/help-EKKKEDL5.js.map +1 -0
  138. package/dist/hover-6JVJFGO7.js +71 -0
  139. package/dist/hover-6JVJFGO7.js.map +1 -0
  140. package/dist/html-EVOSPBIT.js +84 -0
  141. package/dist/html-EVOSPBIT.js.map +1 -0
  142. package/dist/index.d.ts.map +1 -1
  143. package/dist/index.js +87 -38
  144. package/dist/index.js.map +1 -1
  145. package/dist/inspector-H57BVUJP.js +62 -0
  146. package/dist/inspector-H57BVUJP.js.map +1 -0
  147. package/dist/inspector-audit-NQBAJWC7.js +84 -0
  148. package/dist/inspector-audit-NQBAJWC7.js.map +1 -0
  149. package/dist/inspector-plan-ZDIQVND3.js +69 -0
  150. package/dist/inspector-plan-ZDIQVND3.js.map +1 -0
  151. package/dist/inspiredesign-IEUL4PX3.js +234 -0
  152. package/dist/inspiredesign-IEUL4PX3.js.map +1 -0
  153. package/dist/install-autostart-output-5DOMKCQL.js +41 -0
  154. package/dist/install-autostart-output-5DOMKCQL.js.map +1 -0
  155. package/dist/install-autostart-reconciliation-NHKOFYTD.js +73 -0
  156. package/dist/install-autostart-reconciliation-NHKOFYTD.js.map +1 -0
  157. package/dist/launch-EK66VQPF.js +225 -0
  158. package/dist/launch-EK66VQPF.js.map +1 -0
  159. package/dist/list-ADZAQ2IU.js +51 -0
  160. package/dist/list-ADZAQ2IU.js.map +1 -0
  161. package/dist/list-KKUKN467.js +54 -0
  162. package/dist/list-KKUKN467.js.map +1 -0
  163. package/dist/local-HXJLUUNT.js +54 -0
  164. package/dist/local-HXJLUUNT.js.map +1 -0
  165. package/dist/macro-resolve-6DOQJ7CA.js +253 -0
  166. package/dist/macro-resolve-6DOQJ7CA.js.map +1 -0
  167. package/dist/macros/execute-runtime.d.ts +3 -1
  168. package/dist/macros/execute-runtime.d.ts.map +1 -1
  169. package/dist/macros/execute.d.ts +2 -0
  170. package/dist/macros/execute.d.ts.map +1 -1
  171. package/dist/native-UPLVQ2SG.js +22 -0
  172. package/dist/native-UPLVQ2SG.js.map +1 -0
  173. package/dist/network-poll-NUL4PDPY.js +76 -0
  174. package/dist/network-poll-NUL4PDPY.js.map +1 -0
  175. package/dist/new-5NKYPEFT.js +69 -0
  176. package/dist/new-5NKYPEFT.js.map +1 -0
  177. package/dist/onboarding-metadata-7E3KLYSZ.js +27 -0
  178. package/dist/onboarding-metadata-7E3KLYSZ.js.map +1 -0
  179. package/dist/open-NR3BPLXV.js +81 -0
  180. package/dist/open-NR3BPLXV.js.map +1 -0
  181. package/dist/opendevbrowser.d.ts.map +1 -1
  182. package/dist/opendevbrowser.js +87 -38
  183. package/dist/opendevbrowser.js.map +1 -1
  184. package/dist/perf-HJ36ZI6H.js +58 -0
  185. package/dist/perf-HJ36ZI6H.js.map +1 -0
  186. package/dist/pointer-down-IYTTQWXZ.js +55 -0
  187. package/dist/pointer-down-IYTTQWXZ.js.map +1 -0
  188. package/dist/pointer-drag-A2YC5PWI.js +54 -0
  189. package/dist/pointer-drag-A2YC5PWI.js.map +1 -0
  190. package/dist/pointer-move-W5K5FUI4.js +52 -0
  191. package/dist/pointer-move-W5K5FUI4.js.map +1 -0
  192. package/dist/pointer-up-6GWVO64Y.js +55 -0
  193. package/dist/pointer-up-6GWVO64Y.js.map +1 -0
  194. package/dist/press-A3V5WB3S.js +83 -0
  195. package/dist/press-A3V5WB3S.js.map +1 -0
  196. package/dist/product-video-52REKWF3.js +235 -0
  197. package/dist/product-video-52REKWF3.js.map +1 -0
  198. package/dist/providers/artifacts.d.ts +0 -2
  199. package/dist/providers/artifacts.d.ts.map +1 -1
  200. package/dist/providers/blocker.d.ts.map +1 -1
  201. package/dist/providers/bounded-map.d.ts +2 -0
  202. package/dist/providers/bounded-map.d.ts.map +1 -0
  203. package/dist/providers/community/index.d.ts.map +1 -1
  204. package/dist/providers/constraint.d.ts.map +1 -1
  205. package/dist/providers/index.d.ts +1 -0
  206. package/dist/providers/index.d.ts.map +1 -1
  207. package/dist/providers/renderer.d.ts.map +1 -1
  208. package/dist/providers/research-compiler.d.ts +1 -1
  209. package/dist/providers/research-compiler.d.ts.map +1 -1
  210. package/dist/providers/research-executor.d.ts.map +1 -1
  211. package/dist/providers/runtime-factory.d.ts.map +1 -1
  212. package/dist/providers/shared/traversal-url.d.ts +3 -0
  213. package/dist/providers/shared/traversal-url.d.ts.map +1 -1
  214. package/dist/providers/shopping/index.d.ts.map +1 -1
  215. package/dist/providers/social/search-quality.d.ts.map +1 -1
  216. package/dist/providers/workflow-handoff.d.ts +4 -0
  217. package/dist/providers/workflow-handoff.d.ts.map +1 -1
  218. package/dist/providers/workflow-output-root.d.ts +6 -0
  219. package/dist/providers/workflow-output-root.d.ts.map +1 -0
  220. package/dist/providers/workflows.d.ts.map +1 -1
  221. package/dist/{providers-QF2RFB4J.js → providers-IMFYMMHQ.js} +19 -14
  222. package/dist/providers-IMFYMMHQ.js.map +1 -0
  223. package/dist/public-surface/generated-manifest.d.ts +2 -2
  224. package/dist/public-surface/generated-manifest.d.ts.map +1 -1
  225. package/dist/public-surface/source.d.ts +2 -2
  226. package/dist/public-surface/source.d.ts.map +1 -1
  227. package/dist/relay/protocol.d.ts +3 -1
  228. package/dist/relay/protocol.d.ts.map +1 -1
  229. package/dist/relay/relay-server.d.ts +6 -0
  230. package/dist/relay/relay-server.d.ts.map +1 -1
  231. package/dist/research-WB6BBCDD.js +295 -0
  232. package/dist/research-WB6BBCDD.js.map +1 -0
  233. package/dist/review-BGWVY4RA.js +48 -0
  234. package/dist/review-BGWVY4RA.js.map +1 -0
  235. package/dist/review-desktop-LEORC5VS.js +54 -0
  236. package/dist/review-desktop-LEORC5VS.js.map +1 -0
  237. package/dist/rpc-4TSKSFGC.js +159 -0
  238. package/dist/rpc-4TSKSFGC.js.map +1 -0
  239. package/dist/run-3NBLVWXD.js +180 -0
  240. package/dist/run-3NBLVWXD.js.map +1 -0
  241. package/dist/screencast-start-UZVIT3IN.js +67 -0
  242. package/dist/screencast-start-UZVIT3IN.js.map +1 -0
  243. package/dist/screencast-stop-NOSJSIUO.js +59 -0
  244. package/dist/screencast-stop-NOSJSIUO.js.map +1 -0
  245. package/dist/screenshot-LARG4JQG.js +68 -0
  246. package/dist/screenshot-LARG4JQG.js.map +1 -0
  247. package/dist/scroll-VNFMV6TW.js +84 -0
  248. package/dist/scroll-VNFMV6TW.js.map +1 -0
  249. package/dist/scroll-into-view-VYRT3JPT.js +71 -0
  250. package/dist/scroll-into-view-VYRT3JPT.js.map +1 -0
  251. package/dist/select-KJTUZDVO.js +86 -0
  252. package/dist/select-KJTUZDVO.js.map +1 -0
  253. package/dist/serve-EV7K4HKR.js +498 -0
  254. package/dist/serve-EV7K4HKR.js.map +1 -0
  255. package/dist/shopping-DTXHVQ2X.js +273 -0
  256. package/dist/shopping-DTXHVQ2X.js.map +1 -0
  257. package/dist/skill-lifecycle-5UAZGKSN.js +89 -0
  258. package/dist/skill-lifecycle-5UAZGKSN.js.map +1 -0
  259. package/dist/skills-NSXDX6YM.js +26 -0
  260. package/dist/skills-NSXDX6YM.js.map +1 -0
  261. package/dist/snapshot-3XQMCMRJ.js +113 -0
  262. package/dist/snapshot-3XQMCMRJ.js.map +1 -0
  263. package/dist/status-OXSYA5XD.js +35 -0
  264. package/dist/status-OXSYA5XD.js.map +1 -0
  265. package/dist/status-YUMDP5KY.js +132 -0
  266. package/dist/status-YUMDP5KY.js.map +1 -0
  267. package/dist/status-capabilities-P4KDSE2Y.js +57 -0
  268. package/dist/status-capabilities-P4KDSE2Y.js.map +1 -0
  269. package/dist/text-V3B7UVIH.js +84 -0
  270. package/dist/text-V3B7UVIH.js.map +1 -0
  271. package/dist/tools/deps.d.ts +1 -0
  272. package/dist/tools/deps.d.ts.map +1 -1
  273. package/dist/tools/inspiredesign_run.d.ts.map +1 -1
  274. package/dist/tools/macro_resolve.d.ts.map +1 -1
  275. package/dist/tools/product_video_run.d.ts.map +1 -1
  276. package/dist/tools/research_run.d.ts.map +1 -1
  277. package/dist/tools/shopping_run.d.ts.map +1 -1
  278. package/dist/tools/workflow-output.d.ts +3 -0
  279. package/dist/tools/workflow-output.d.ts.map +1 -0
  280. package/dist/type-IYBN3ZLR.js +94 -0
  281. package/dist/type-IYBN3ZLR.js.map +1 -0
  282. package/dist/uncheck-SG737EGI.js +71 -0
  283. package/dist/uncheck-SG737EGI.js.map +1 -0
  284. package/dist/uninstall-KYKGJAX7.js +91 -0
  285. package/dist/uninstall-KYKGJAX7.js.map +1 -0
  286. package/dist/update-SMXPYGXS.js +305 -0
  287. package/dist/update-SMXPYGXS.js.map +1 -0
  288. package/dist/update-skill-modes-BVX7IVMW.js +38 -0
  289. package/dist/update-skill-modes-BVX7IVMW.js.map +1 -0
  290. package/dist/upload-KH6ZABJA.js +56 -0
  291. package/dist/upload-KH6ZABJA.js.map +1 -0
  292. package/dist/use-7YDKO3U4.js +63 -0
  293. package/dist/use-7YDKO3U4.js.map +1 -0
  294. package/dist/value-RZBWSKKM.js +71 -0
  295. package/dist/value-RZBWSKKM.js.map +1 -0
  296. package/dist/visible-BSFTAKXR.js +71 -0
  297. package/dist/visible-BSFTAKXR.js.map +1 -0
  298. package/dist/wait-TMTEAYOP.js +109 -0
  299. package/dist/wait-TMTEAYOP.js.map +1 -0
  300. package/dist/windows-HIZ23OHS.js +37 -0
  301. package/dist/windows-HIZ23OHS.js.map +1 -0
  302. package/extension/dist/background.js +99 -22
  303. package/extension/dist/ops/ops-runtime.js +85 -7
  304. package/extension/dist/ops/ops-session-store.js +3 -0
  305. package/extension/dist/ops/target-session-coordinator.js +3 -0
  306. package/extension/dist/services/CDPRouter.js +9 -0
  307. package/extension/manifest.json +1 -1
  308. package/package.json +1 -1
  309. package/skills/opendevbrowser-best-practices/SKILL.md +8 -6
  310. package/skills/opendevbrowser-best-practices/artifacts/skill-runtime-surface-matrix.md +1 -1
  311. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +3 -2
  312. package/skills/opendevbrowser-best-practices/scripts/validator-fixture-cli.sh +39 -2
  313. package/skills/opendevbrowser-research/SKILL.md +64 -12
  314. package/skills/opendevbrowser-research/artifacts/research-workflows.md +56 -19
  315. package/skills/opendevbrowser-research/assets/templates/compact.md +31 -5
  316. package/skills/opendevbrowser-research/assets/templates/context.json +52 -1
  317. package/skills/opendevbrowser-research/assets/templates/report.md +57 -4
  318. package/skills/opendevbrowser-research/examples/sample-input.json +1 -1
  319. package/skills/opendevbrowser-research/examples/sample-output.md +27 -2
  320. package/skills/opendevbrowser-research/scripts/run-research.sh +2 -6
  321. package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +115 -1
  322. package/dist/chunk-I5ZCOZZV.js.map +0 -1
  323. package/dist/chunk-QVWOPIZJ.js.map +0 -1
  324. package/dist/chunk-T3VVHJTK.js.map +0 -1
  325. /package/dist/{providers-QF2RFB4J.js.map → chunk-RJNI3BHT.js.map} +0 -0
@@ -0,0 +1,226 @@
1
+ import {
2
+ CLI_COMMANDS,
3
+ VALID_EQUALS_FLAGS,
4
+ VALID_FLAGS
5
+ } from "./chunk-J47N77VG.js";
6
+ import {
7
+ createUsageError
8
+ } from "./chunk-IPE7TF2P.js";
9
+
10
+ // src/cli/args.ts
11
+ var CLI_COMMAND_SET = new Set(CLI_COMMANDS);
12
+ var SHORT_FLAGS = {
13
+ "-g": "--global",
14
+ "-l": "--local",
15
+ "-u": "--update",
16
+ "-h": "--help",
17
+ "-v": "--version",
18
+ "-f": "--full"
19
+ };
20
+ function expandShortFlags(args) {
21
+ return args.map((arg) => SHORT_FLAGS[arg] ?? arg);
22
+ }
23
+ function parseSkillsMode(args) {
24
+ const hasLocal = args.includes("--skills-local");
25
+ const hasGlobal = args.includes("--skills-global");
26
+ if (hasLocal && hasGlobal) {
27
+ throw createUsageError("Choose either --skills-local or --skills-global.");
28
+ }
29
+ if (args.includes("--no-skills")) {
30
+ return "none";
31
+ }
32
+ if (hasLocal) {
33
+ return "local";
34
+ }
35
+ if (hasGlobal) {
36
+ return "global";
37
+ }
38
+ return "global";
39
+ }
40
+ function parseOutputFormat(args) {
41
+ const outputFlag = args.find((arg) => arg.startsWith("--output-format"));
42
+ if (!outputFlag) {
43
+ return "text";
44
+ }
45
+ let value;
46
+ if (outputFlag.includes("=")) {
47
+ value = outputFlag.split("=", 2)[1];
48
+ } else {
49
+ const index = args.indexOf(outputFlag);
50
+ value = index >= 0 ? args[index + 1] : void 0;
51
+ }
52
+ if (value === "text" || value === "json" || value === "stream-json") {
53
+ return value;
54
+ }
55
+ throw createUsageError(`Invalid --output-format: ${value ?? "missing"}`);
56
+ }
57
+ function parseTransport(args) {
58
+ const transportFlag = args.find((arg) => arg.startsWith("--transport"));
59
+ if (!transportFlag) {
60
+ return "relay";
61
+ }
62
+ let value;
63
+ if (transportFlag.includes("=")) {
64
+ value = transportFlag.split("=", 2)[1];
65
+ } else {
66
+ const index = args.indexOf(transportFlag);
67
+ value = index >= 0 ? args[index + 1] : void 0;
68
+ }
69
+ if (value === "relay" || value === "native") {
70
+ return value;
71
+ }
72
+ throw createUsageError(`Invalid --transport: ${value ?? "missing"}`);
73
+ }
74
+ var VALID_FLAG_SET = new Set(VALID_FLAGS);
75
+ var VALID_EQUALS_FLAG_SET = new Set(VALID_EQUALS_FLAGS);
76
+ var SIGNED_VALUE_FLAG_SET = /* @__PURE__ */ new Set(["--dy"]);
77
+ var SIGNED_INTEGER_VALUE = /^-\d+$/;
78
+ function shouldSkipValueToken(flag, value) {
79
+ if (!VALID_EQUALS_FLAG_SET.has(flag) || value === void 0) {
80
+ return false;
81
+ }
82
+ if (!value.startsWith("-")) {
83
+ return true;
84
+ }
85
+ return SIGNED_VALUE_FLAG_SET.has(flag) && SIGNED_INTEGER_VALUE.test(value);
86
+ }
87
+ function parseArgs(argv) {
88
+ let args = expandShortFlags(argv.slice(2));
89
+ let commandOverride = null;
90
+ if (args[0] && !args[0].startsWith("-")) {
91
+ const candidate = args[0];
92
+ if (CLI_COMMAND_SET.has(candidate)) {
93
+ commandOverride = candidate;
94
+ args = args.slice(1);
95
+ } else {
96
+ throw createUsageError(`Unknown command: ${candidate}`);
97
+ }
98
+ }
99
+ const hasGlobal = args.includes("--global");
100
+ const hasLocal = args.includes("--local");
101
+ if (hasGlobal && hasLocal) {
102
+ throw createUsageError("Choose either --global or --local.");
103
+ }
104
+ const skillsMode = parseSkillsMode(args);
105
+ const fullInstall = args.includes("--full");
106
+ const outputFormat = parseOutputFormat(args);
107
+ const transport = commandOverride === "annotate" ? "relay" : parseTransport(args);
108
+ if (commandOverride === "help" || args.includes("--help") || args.includes("-h")) {
109
+ return {
110
+ command: "help",
111
+ withConfig: false,
112
+ noPrompt: false,
113
+ noInteractive: false,
114
+ quiet: false,
115
+ outputFormat,
116
+ transport,
117
+ skillsMode,
118
+ fullInstall,
119
+ rawArgs: args
120
+ };
121
+ }
122
+ if (commandOverride === "version" || args.includes("--version") || args.includes("-v")) {
123
+ return {
124
+ command: "version",
125
+ withConfig: false,
126
+ noPrompt: false,
127
+ noInteractive: false,
128
+ quiet: false,
129
+ outputFormat,
130
+ transport,
131
+ skillsMode,
132
+ fullInstall,
133
+ rawArgs: args
134
+ };
135
+ }
136
+ if (commandOverride === "update" || args.includes("--update")) {
137
+ const mode2 = args.includes("--global") ? "global" : args.includes("--local") ? "local" : void 0;
138
+ return {
139
+ command: "update",
140
+ mode: mode2,
141
+ withConfig: false,
142
+ noPrompt: false,
143
+ noInteractive: false,
144
+ quiet: false,
145
+ outputFormat,
146
+ transport,
147
+ skillsMode,
148
+ fullInstall,
149
+ rawArgs: args
150
+ };
151
+ }
152
+ if (commandOverride === "uninstall" || args.includes("--uninstall")) {
153
+ const mode2 = args.includes("--global") ? "global" : args.includes("--local") ? "local" : void 0;
154
+ const noPrompt2 = args.includes("--no-prompt") || args.includes("--no-interactive");
155
+ return {
156
+ command: "uninstall",
157
+ mode: mode2,
158
+ withConfig: false,
159
+ noPrompt: noPrompt2,
160
+ noInteractive: noPrompt2,
161
+ quiet: args.includes("--quiet"),
162
+ outputFormat,
163
+ transport,
164
+ skillsMode,
165
+ fullInstall,
166
+ rawArgs: args
167
+ };
168
+ }
169
+ const withConfig = args.includes("--with-config") || fullInstall;
170
+ const noPrompt = args.includes("--no-prompt") || args.includes("--no-interactive");
171
+ const noInteractive = args.includes("--no-interactive") || noPrompt;
172
+ const quiet = args.includes("--quiet");
173
+ let mode;
174
+ if (args.includes("--global")) {
175
+ mode = "global";
176
+ } else if (args.includes("--local")) {
177
+ mode = "local";
178
+ } else if (noPrompt) {
179
+ mode = "global";
180
+ }
181
+ for (let index = 0; index < args.length; index += 1) {
182
+ const arg = args[index] ?? "";
183
+ if (arg.startsWith("--") && !VALID_FLAG_SET.has(arg)) {
184
+ if (arg.includes("=")) {
185
+ const baseFlag = arg.split("=", 2)[0] ?? "";
186
+ if (VALID_EQUALS_FLAG_SET.has(baseFlag)) {
187
+ continue;
188
+ }
189
+ }
190
+ throw createUsageError(`Unknown flag: ${arg}`);
191
+ }
192
+ if (arg.startsWith("-") && !arg.startsWith("--") && !SHORT_FLAGS[arg]) {
193
+ throw createUsageError(`Unknown flag: ${arg}`);
194
+ }
195
+ if (shouldSkipValueToken(arg, args[index + 1])) {
196
+ index += 1;
197
+ }
198
+ }
199
+ return {
200
+ command: commandOverride ?? "install",
201
+ mode,
202
+ withConfig,
203
+ noPrompt,
204
+ noInteractive,
205
+ quiet,
206
+ outputFormat,
207
+ transport,
208
+ skillsMode,
209
+ fullInstall,
210
+ rawArgs: args
211
+ };
212
+ }
213
+ function detectOutputFormat(argv) {
214
+ const args = expandShortFlags(argv.slice(2));
215
+ try {
216
+ return parseOutputFormat(args);
217
+ } catch {
218
+ return "text";
219
+ }
220
+ }
221
+
222
+ export {
223
+ parseArgs,
224
+ detectOutputFormat
225
+ };
226
+ //# sourceMappingURL=chunk-RCZZGGJS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/args.ts"],"sourcesContent":["import { createUsageError } from \"./errors\";\nimport {\n CLI_COMMANDS,\n VALID_EQUALS_FLAGS,\n VALID_FLAGS\n} from \"../public-surface/generated-manifest\";\nimport type { PublicSurfaceCliCommandName } from \"../public-surface/source\";\n\nconst CLI_COMMAND_SET = new Set<string>(CLI_COMMANDS);\n\nexport { CLI_COMMANDS, VALID_EQUALS_FLAGS, VALID_FLAGS };\n\nexport type CliCommand = PublicSurfaceCliCommandName;\nexport type InstallMode = \"global\" | \"local\";\nexport type SkillsMode = \"global\" | \"local\" | \"none\";\nexport type OutputFormat = \"text\" | \"json\" | \"stream-json\";\nexport type TransportMode = \"relay\" | \"native\";\n\nexport interface ParsedArgs {\n command: CliCommand;\n mode?: InstallMode;\n withConfig: boolean;\n noPrompt: boolean;\n noInteractive: boolean;\n quiet: boolean;\n outputFormat: OutputFormat;\n transport: TransportMode;\n skillsMode: SkillsMode;\n fullInstall: boolean;\n rawArgs: string[];\n}\n\nconst SHORT_FLAGS: Record<string, string> = {\n \"-g\": \"--global\",\n \"-l\": \"--local\",\n \"-u\": \"--update\",\n \"-h\": \"--help\",\n \"-v\": \"--version\",\n \"-f\": \"--full\"\n};\n\nfunction expandShortFlags(args: string[]): string[] {\n return args.map((arg) => SHORT_FLAGS[arg] ?? arg);\n}\n\nfunction parseSkillsMode(args: string[]): SkillsMode {\n const hasLocal = args.includes(\"--skills-local\");\n const hasGlobal = args.includes(\"--skills-global\");\n if (hasLocal && hasGlobal) {\n throw createUsageError(\"Choose either --skills-local or --skills-global.\");\n }\n if (args.includes(\"--no-skills\")) {\n return \"none\";\n }\n if (hasLocal) {\n return \"local\";\n }\n if (hasGlobal) {\n return \"global\";\n }\n return \"global\";\n}\n\nfunction parseOutputFormat(args: string[]): OutputFormat {\n const outputFlag = args.find((arg) => arg.startsWith(\"--output-format\"));\n if (!outputFlag) {\n return \"text\";\n }\n\n let value: string | undefined;\n if (outputFlag.includes(\"=\")) {\n value = outputFlag.split(\"=\", 2)[1];\n } else {\n const index = args.indexOf(outputFlag);\n value = index >= 0 ? args[index + 1] : undefined;\n }\n\n if (value === \"text\" || value === \"json\" || value === \"stream-json\") {\n return value;\n }\n\n throw createUsageError(`Invalid --output-format: ${value ?? \"missing\"}`);\n}\n\nfunction parseTransport(args: string[]): TransportMode {\n const transportFlag = args.find((arg) => arg.startsWith(\"--transport\"));\n if (!transportFlag) {\n return \"relay\";\n }\n\n let value: string | undefined;\n if (transportFlag.includes(\"=\")) {\n value = transportFlag.split(\"=\", 2)[1];\n } else {\n const index = args.indexOf(transportFlag);\n value = index >= 0 ? args[index + 1] : undefined;\n }\n\n if (value === \"relay\" || value === \"native\") {\n return value;\n }\n\n throw createUsageError(`Invalid --transport: ${value ?? \"missing\"}`);\n}\n\nconst VALID_FLAG_SET = new Set<string>(VALID_FLAGS);\nconst VALID_EQUALS_FLAG_SET = new Set<string>(VALID_EQUALS_FLAGS);\nconst SIGNED_VALUE_FLAG_SET = new Set<string>([\"--dy\"]);\nconst SIGNED_INTEGER_VALUE = /^-\\d+$/;\n\nfunction shouldSkipValueToken(flag: string, value: string | undefined): boolean {\n if (!VALID_EQUALS_FLAG_SET.has(flag) || value === undefined) {\n return false;\n }\n if (!value.startsWith(\"-\")) {\n return true;\n }\n return SIGNED_VALUE_FLAG_SET.has(flag) && SIGNED_INTEGER_VALUE.test(value);\n}\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n let args = expandShortFlags(argv.slice(2));\n let commandOverride: CliCommand | null = null;\n\n if (args[0] && !args[0].startsWith(\"-\")) {\n const candidate = args[0];\n if (CLI_COMMAND_SET.has(candidate)) {\n commandOverride = candidate as CliCommand;\n args = args.slice(1);\n } else {\n throw createUsageError(`Unknown command: ${candidate}`);\n }\n }\n const hasGlobal = args.includes(\"--global\");\n const hasLocal = args.includes(\"--local\");\n if (hasGlobal && hasLocal) {\n throw createUsageError(\"Choose either --global or --local.\");\n }\n\n const skillsMode = parseSkillsMode(args);\n const fullInstall = args.includes(\"--full\");\n const outputFormat = parseOutputFormat(args);\n const transport = commandOverride === \"annotate\" ? \"relay\" : parseTransport(args);\n\n if (commandOverride === \"help\" || args.includes(\"--help\") || args.includes(\"-h\")) {\n return {\n command: \"help\",\n withConfig: false,\n noPrompt: false,\n noInteractive: false,\n quiet: false,\n outputFormat,\n transport,\n skillsMode,\n fullInstall,\n rawArgs: args\n };\n }\n\n if (commandOverride === \"version\" || args.includes(\"--version\") || args.includes(\"-v\")) {\n return {\n command: \"version\",\n withConfig: false,\n noPrompt: false,\n noInteractive: false,\n quiet: false,\n outputFormat,\n transport,\n skillsMode,\n fullInstall,\n rawArgs: args\n };\n }\n\n if (commandOverride === \"update\" || args.includes(\"--update\")) {\n const mode = args.includes(\"--global\") ? \"global\" : args.includes(\"--local\") ? \"local\" : undefined;\n return {\n command: \"update\",\n mode,\n withConfig: false,\n noPrompt: false,\n noInteractive: false,\n quiet: false,\n outputFormat,\n transport,\n skillsMode,\n fullInstall,\n rawArgs: args\n };\n }\n\n if (commandOverride === \"uninstall\" || args.includes(\"--uninstall\")) {\n const mode = args.includes(\"--global\") ? \"global\" : args.includes(\"--local\") ? \"local\" : undefined;\n const noPrompt = args.includes(\"--no-prompt\") || args.includes(\"--no-interactive\");\n return {\n command: \"uninstall\",\n mode,\n withConfig: false,\n noPrompt,\n noInteractive: noPrompt,\n quiet: args.includes(\"--quiet\"),\n outputFormat,\n transport,\n skillsMode,\n fullInstall,\n rawArgs: args\n };\n }\n\n const withConfig = args.includes(\"--with-config\") || fullInstall;\n const noPrompt = args.includes(\"--no-prompt\") || args.includes(\"--no-interactive\");\n const noInteractive = args.includes(\"--no-interactive\") || noPrompt;\n const quiet = args.includes(\"--quiet\");\n\n let mode: InstallMode | undefined;\n if (args.includes(\"--global\")) {\n mode = \"global\";\n } else if (args.includes(\"--local\")) {\n mode = \"local\";\n } else if (noPrompt) {\n mode = \"global\";\n }\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index] ?? \"\";\n if (arg.startsWith(\"--\") && !VALID_FLAG_SET.has(arg)) {\n if (arg.includes(\"=\")) {\n const baseFlag = arg.split(\"=\", 2)[0] ?? \"\";\n if (VALID_EQUALS_FLAG_SET.has(baseFlag)) {\n continue;\n }\n }\n throw createUsageError(`Unknown flag: ${arg}`);\n }\n if (arg.startsWith(\"-\") && !arg.startsWith(\"--\") && !SHORT_FLAGS[arg]) {\n throw createUsageError(`Unknown flag: ${arg}`);\n }\n if (shouldSkipValueToken(arg, args[index + 1])) {\n index += 1;\n }\n }\n\n return {\n command: commandOverride ?? \"install\",\n mode,\n withConfig,\n noPrompt,\n noInteractive,\n quiet,\n outputFormat,\n transport,\n skillsMode,\n fullInstall,\n rawArgs: args\n };\n}\n\nexport function detectOutputFormat(argv: string[]): OutputFormat {\n const args = expandShortFlags(argv.slice(2));\n try {\n return parseOutputFormat(args);\n } catch {\n return \"text\";\n }\n}\n\nexport function detectQuiet(argv: string[]): boolean {\n const args = expandShortFlags(argv.slice(2));\n return args.includes(\"--quiet\");\n}\n"],"mappings":"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","names":["mode","noPrompt"]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-RJNI3BHT.js.map
@@ -0,0 +1,112 @@
1
+ import {
2
+ createUsageError
3
+ } from "./chunk-IPE7TF2P.js";
4
+
5
+ // src/cli/utils/parse.ts
6
+ var SIGNED_INTEGER_PATTERN = /^-?\d+$/;
7
+ var UNSIGNED_INTEGER_PATTERN = /^\d+$/;
8
+ var SIGNED_DECIMAL_PATTERN = /^-?(?:\d+|\d+\.\d+|\.\d+)$/;
9
+ var UNSIGNED_DECIMAL_PATTERN = /^(?:\d+|\d+\.\d+|\.\d+)$/;
10
+ function allowsNegative(options) {
11
+ return typeof options.min !== "number" || options.min < 0;
12
+ }
13
+ function decimalPattern(options) {
14
+ const signed = allowsNegative(options);
15
+ if (options.integer ?? true) {
16
+ return signed ? SIGNED_INTEGER_PATTERN : UNSIGNED_INTEGER_PATTERN;
17
+ }
18
+ return signed ? SIGNED_DECIMAL_PATTERN : UNSIGNED_DECIMAL_PATTERN;
19
+ }
20
+ function parseNumberFlag(value, flag, options = {}) {
21
+ if (value.trim() === "" || value !== value.trim() || !decimalPattern(options).test(value)) {
22
+ throw createUsageError(`Invalid ${flag}: ${value}`);
23
+ }
24
+ const parsed = Number(value);
25
+ if (!Number.isFinite(parsed)) {
26
+ throw createUsageError(`Invalid ${flag}: ${value}`);
27
+ }
28
+ const requireInteger = options.integer ?? true;
29
+ if (requireInteger && !Number.isInteger(parsed)) {
30
+ throw createUsageError(`Invalid ${flag}: ${value}`);
31
+ }
32
+ if (typeof options.min === "number" && parsed < options.min) {
33
+ throw createUsageError(`Invalid ${flag}: ${value}`);
34
+ }
35
+ if (typeof options.max === "number" && parsed > options.max) {
36
+ throw createUsageError(`Invalid ${flag}: ${value}`);
37
+ }
38
+ return parsed;
39
+ }
40
+ function parseBooleanFlag(value, flag) {
41
+ const normalized = value.trim().toLowerCase();
42
+ if (normalized === "true" || normalized === "1") {
43
+ return true;
44
+ }
45
+ if (normalized === "false" || normalized === "0") {
46
+ return false;
47
+ }
48
+ throw createUsageError(`Invalid ${flag}: ${value}`);
49
+ }
50
+ function parseOptionalStringFlag(rawArgs, flag) {
51
+ for (let i = 0; i < rawArgs.length; i += 1) {
52
+ const arg = rawArgs[i];
53
+ if (arg === flag) {
54
+ const value = rawArgs[i + 1];
55
+ if (!value) {
56
+ throw createUsageError(`Missing value for ${flag}`);
57
+ }
58
+ return value;
59
+ }
60
+ if (arg?.startsWith(`${flag}=`)) {
61
+ const value = arg.split("=", 2)[1];
62
+ if (!value) {
63
+ throw createUsageError(`Missing value for ${flag}`);
64
+ }
65
+ return value;
66
+ }
67
+ }
68
+ return void 0;
69
+ }
70
+ function parseStringArrayFlag(rawArgs, flag) {
71
+ const value = parseOptionalStringFlag(rawArgs, flag);
72
+ if (typeof value !== "string") {
73
+ return void 0;
74
+ }
75
+ const items = value.split(",").map((item) => item.trim()).filter((item) => item.length > 0);
76
+ if (items.length === 0) {
77
+ throw createUsageError(`Missing value for ${flag}`);
78
+ }
79
+ return items;
80
+ }
81
+ function parseRepeatedStringFlag(rawArgs, flag) {
82
+ const values = [];
83
+ for (let index = 0; index < rawArgs.length; index += 1) {
84
+ const arg = rawArgs[index];
85
+ if (arg === flag) {
86
+ const value = rawArgs[index + 1];
87
+ if (!value) {
88
+ throw createUsageError(`Missing value for ${flag}`);
89
+ }
90
+ values.push(value);
91
+ index += 1;
92
+ continue;
93
+ }
94
+ if (arg?.startsWith(`${flag}=`)) {
95
+ const value = arg.split("=", 2)[1];
96
+ if (!value) {
97
+ throw createUsageError(`Missing value for ${flag}`);
98
+ }
99
+ values.push(value);
100
+ }
101
+ }
102
+ return values.length > 0 ? values : void 0;
103
+ }
104
+
105
+ export {
106
+ parseNumberFlag,
107
+ parseBooleanFlag,
108
+ parseOptionalStringFlag,
109
+ parseStringArrayFlag,
110
+ parseRepeatedStringFlag
111
+ };
112
+ //# sourceMappingURL=chunk-RPXWUCQQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/utils/parse.ts"],"sourcesContent":["import { createUsageError } from \"../errors\";\n\ntype NumberFlagOptions = {\n min?: number;\n max?: number;\n integer?: boolean;\n};\n\nconst SIGNED_INTEGER_PATTERN = /^-?\\d+$/;\nconst UNSIGNED_INTEGER_PATTERN = /^\\d+$/;\nconst SIGNED_DECIMAL_PATTERN = /^-?(?:\\d+|\\d+\\.\\d+|\\.\\d+)$/;\nconst UNSIGNED_DECIMAL_PATTERN = /^(?:\\d+|\\d+\\.\\d+|\\.\\d+)$/;\n\nfunction allowsNegative(options: NumberFlagOptions): boolean {\n return typeof options.min !== \"number\" || options.min < 0;\n}\n\nfunction decimalPattern(options: NumberFlagOptions): RegExp {\n const signed = allowsNegative(options);\n if (options.integer ?? true) {\n return signed ? SIGNED_INTEGER_PATTERN : UNSIGNED_INTEGER_PATTERN;\n }\n return signed ? SIGNED_DECIMAL_PATTERN : UNSIGNED_DECIMAL_PATTERN;\n}\n\nexport function parseNumberFlag(value: string, flag: string, options: NumberFlagOptions = {}): number {\n if (value.trim() === \"\" || value !== value.trim() || !decimalPattern(options).test(value)) {\n throw createUsageError(`Invalid ${flag}: ${value}`);\n }\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) {\n throw createUsageError(`Invalid ${flag}: ${value}`);\n }\n const requireInteger = options.integer ?? true;\n if (requireInteger && !Number.isInteger(parsed)) {\n throw createUsageError(`Invalid ${flag}: ${value}`);\n }\n if (typeof options.min === \"number\" && parsed < options.min) {\n throw createUsageError(`Invalid ${flag}: ${value}`);\n }\n if (typeof options.max === \"number\" && parsed > options.max) {\n throw createUsageError(`Invalid ${flag}: ${value}`);\n }\n return parsed;\n}\n\nexport function parseBooleanFlag(value: string, flag: string): boolean {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"true\" || normalized === \"1\") {\n return true;\n }\n if (normalized === \"false\" || normalized === \"0\") {\n return false;\n }\n throw createUsageError(`Invalid ${flag}: ${value}`);\n}\n\nexport function parseOptionalStringFlag(rawArgs: string[], flag: string): string | undefined {\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === flag) {\n const value = rawArgs[i + 1];\n if (!value) {\n throw createUsageError(`Missing value for ${flag}`);\n }\n return value;\n }\n if (arg?.startsWith(`${flag}=`)) {\n const value = arg.split(\"=\", 2)[1];\n if (!value) {\n throw createUsageError(`Missing value for ${flag}`);\n }\n return value;\n }\n }\n return undefined;\n}\n\nexport function parseStringArrayFlag(rawArgs: string[], flag: string): string[] | undefined {\n const value = parseOptionalStringFlag(rawArgs, flag);\n if (typeof value !== \"string\") {\n return undefined;\n }\n const items = value.split(\",\").map((item) => item.trim()).filter((item) => item.length > 0);\n if (items.length === 0) {\n throw createUsageError(`Missing value for ${flag}`);\n }\n return items;\n}\n\nexport function parseRepeatedStringFlag(rawArgs: string[], flag: string): string[] | undefined {\n const values: string[] = [];\n for (let index = 0; index < rawArgs.length; index += 1) {\n const arg = rawArgs[index];\n if (arg === flag) {\n const value = rawArgs[index + 1];\n if (!value) {\n throw createUsageError(`Missing value for ${flag}`);\n }\n values.push(value);\n index += 1;\n continue;\n }\n if (arg?.startsWith(`${flag}=`)) {\n const value = arg.split(\"=\", 2)[1];\n if (!value) {\n throw createUsageError(`Missing value for ${flag}`);\n }\n values.push(value);\n }\n }\n return values.length > 0 ? values : undefined;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,107 @@
1
+ // src/providers/artifacts.ts
2
+ import { mkdir, readdir, readFile, rm, stat, writeFile } from "fs/promises";
3
+ import { dirname, join, resolve } from "path";
4
+ import { randomUUID } from "crypto";
5
+ import { tmpdir } from "os";
6
+ var DEFAULT_ARTIFACT_TTL_HOURS = 72;
7
+ var MAX_ARTIFACT_TTL_HOURS = 168;
8
+ var clampTtlHours = (value) => {
9
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
10
+ return DEFAULT_ARTIFACT_TTL_HOURS;
11
+ }
12
+ return Math.min(MAX_ARTIFACT_TTL_HOURS, Math.floor(value));
13
+ };
14
+ var serializeContent = (content) => {
15
+ if (typeof content === "string" || Buffer.isBuffer(content)) {
16
+ return content;
17
+ }
18
+ return `${JSON.stringify(content, null, 2)}
19
+ `;
20
+ };
21
+ var createArtifactBundle = async (args) => {
22
+ const runId = randomUUID();
23
+ const now = args.now ?? /* @__PURE__ */ new Date();
24
+ const ttlHours = clampTtlHours(args.ttlHours);
25
+ const expiresAt = new Date(now.getTime() + ttlHours * 60 * 60 * 1e3);
26
+ const root = args.outputDir ? resolve(args.outputDir) : join(tmpdir(), "opendevbrowser");
27
+ const basePath = join(root, args.namespace, runId);
28
+ await mkdir(basePath, { recursive: true, mode: 448 });
29
+ const writtenFiles = [];
30
+ for (const file of args.files) {
31
+ const filePath = join(basePath, file.path);
32
+ const directory = dirname(filePath);
33
+ if (directory && directory !== basePath) {
34
+ await mkdir(directory, { recursive: true, mode: 448 });
35
+ }
36
+ await writeFile(filePath, serializeContent(file.content), { mode: 384 });
37
+ writtenFiles.push(file.path);
38
+ }
39
+ const manifest = {
40
+ run_id: runId,
41
+ created_at: now.toISOString(),
42
+ ttl_hours: ttlHours,
43
+ expires_at: expiresAt.toISOString(),
44
+ files: [...writtenFiles, "bundle-manifest.json"]
45
+ };
46
+ await writeFile(join(basePath, "bundle-manifest.json"), `${JSON.stringify(manifest, null, 2)}
47
+ `, { mode: 384 });
48
+ return {
49
+ runId,
50
+ basePath,
51
+ manifest
52
+ };
53
+ };
54
+ var isExpired = (manifest, now) => {
55
+ const expiry = new Date(manifest.expires_at);
56
+ if (Number.isNaN(expiry.getTime())) return false;
57
+ return expiry.getTime() <= now.getTime();
58
+ };
59
+ var cleanupExpiredArtifacts = async (rootDir, now = /* @__PURE__ */ new Date()) => {
60
+ const removed = [];
61
+ const skipped = [];
62
+ let namespaces = [];
63
+ try {
64
+ namespaces = await readdir(rootDir);
65
+ } catch {
66
+ return { removed, skipped };
67
+ }
68
+ for (const namespace of namespaces) {
69
+ const namespacePath = join(rootDir, namespace);
70
+ let runs = [];
71
+ try {
72
+ runs = await readdir(namespacePath);
73
+ } catch {
74
+ continue;
75
+ }
76
+ for (const run of runs) {
77
+ const runPath = join(namespacePath, run);
78
+ const manifestPath = join(runPath, "bundle-manifest.json");
79
+ try {
80
+ const metadata = await stat(manifestPath);
81
+ if (!metadata.isFile()) {
82
+ skipped.push(runPath);
83
+ continue;
84
+ }
85
+ const manifestRaw = await readFile(manifestPath, "utf8");
86
+ const manifest = JSON.parse(manifestRaw);
87
+ if (isExpired(manifest, now)) {
88
+ await rm(runPath, { recursive: true, force: true });
89
+ removed.push(runPath);
90
+ } else {
91
+ skipped.push(runPath);
92
+ }
93
+ } catch {
94
+ skipped.push(runPath);
95
+ }
96
+ }
97
+ }
98
+ return { removed, skipped };
99
+ };
100
+
101
+ export {
102
+ DEFAULT_ARTIFACT_TTL_HOURS,
103
+ MAX_ARTIFACT_TTL_HOURS,
104
+ createArtifactBundle,
105
+ cleanupExpiredArtifacts
106
+ };
107
+ //# sourceMappingURL=chunk-S5KZQJJI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/artifacts.ts"],"sourcesContent":["import { mkdir, readdir, readFile, rm, stat, writeFile } from \"fs/promises\";\nimport { dirname, join, resolve } from \"path\";\nimport { randomUUID } from \"crypto\";\nimport { tmpdir } from \"os\";\n\nexport const DEFAULT_ARTIFACT_TTL_HOURS = 72;\nexport const MAX_ARTIFACT_TTL_HOURS = 168;\n\ntype ArtifactContent = string | Buffer | Record<string, unknown>;\n\nexport interface ArtifactFile {\n path: string;\n content: ArtifactContent;\n}\n\nexport interface ArtifactManifest {\n run_id: string;\n created_at: string;\n ttl_hours: number;\n expires_at: string;\n files: string[];\n}\n\nexport interface ArtifactBundle {\n runId: string;\n basePath: string;\n manifest: ArtifactManifest;\n}\n\nconst clampTtlHours = (value: number | undefined): number => {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return DEFAULT_ARTIFACT_TTL_HOURS;\n }\n return Math.min(MAX_ARTIFACT_TTL_HOURS, Math.floor(value));\n};\n\nconst serializeContent = (content: ArtifactContent): string | Buffer => {\n if (typeof content === \"string\" || Buffer.isBuffer(content)) {\n return content;\n }\n return `${JSON.stringify(content, null, 2)}\\n`;\n};\n\nexport const createArtifactBundle = async (args: {\n namespace: string;\n files: ArtifactFile[];\n outputDir?: string;\n ttlHours?: number;\n now?: Date;\n}): Promise<ArtifactBundle> => {\n const runId = randomUUID();\n const now = args.now ?? new Date();\n const ttlHours = clampTtlHours(args.ttlHours);\n const expiresAt = new Date(now.getTime() + ttlHours * 60 * 60 * 1000);\n const root = args.outputDir ? resolve(args.outputDir) : join(tmpdir(), \"opendevbrowser\");\n const basePath = join(root, args.namespace, runId);\n\n await mkdir(basePath, { recursive: true, mode: 0o700 });\n\n const writtenFiles: string[] = [];\n for (const file of args.files) {\n const filePath = join(basePath, file.path);\n const directory = dirname(filePath);\n if (directory && directory !== basePath) {\n await mkdir(directory, { recursive: true, mode: 0o700 });\n }\n await writeFile(filePath, serializeContent(file.content), { mode: 0o600 });\n writtenFiles.push(file.path);\n }\n\n const manifest: ArtifactManifest = {\n run_id: runId,\n created_at: now.toISOString(),\n ttl_hours: ttlHours,\n expires_at: expiresAt.toISOString(),\n files: [...writtenFiles, \"bundle-manifest.json\"]\n };\n\n await writeFile(join(basePath, \"bundle-manifest.json\"), `${JSON.stringify(manifest, null, 2)}\\n`, { mode: 0o600 });\n\n return {\n runId,\n basePath,\n manifest\n };\n};\n\nconst isExpired = (manifest: ArtifactManifest, now: Date): boolean => {\n const expiry = new Date(manifest.expires_at);\n if (Number.isNaN(expiry.getTime())) return false;\n return expiry.getTime() <= now.getTime();\n};\n\nexport const cleanupExpiredArtifacts = async (\n rootDir: string,\n now: Date = new Date()\n): Promise<{ removed: string[]; skipped: string[] }> => {\n const removed: string[] = [];\n const skipped: string[] = [];\n\n let namespaces: string[] = [];\n try {\n namespaces = await readdir(rootDir);\n } catch {\n return { removed, skipped };\n }\n\n for (const namespace of namespaces) {\n const namespacePath = join(rootDir, namespace);\n let runs: string[] = [];\n try {\n runs = await readdir(namespacePath);\n } catch {\n continue;\n }\n\n for (const run of runs) {\n const runPath = join(namespacePath, run);\n const manifestPath = join(runPath, \"bundle-manifest.json\");\n try {\n const metadata = await stat(manifestPath);\n if (!metadata.isFile()) {\n skipped.push(runPath);\n continue;\n }\n const manifestRaw = await readFile(manifestPath, \"utf8\");\n const manifest = JSON.parse(manifestRaw) as ArtifactManifest;\n if (isExpired(manifest, now)) {\n await rm(runPath, { recursive: true, force: true });\n removed.push(runPath);\n } else {\n skipped.push(runPath);\n }\n } catch {\n skipped.push(runPath);\n }\n }\n }\n\n return { removed, skipped };\n};\n"],"mappings":"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","names":[]}
@@ -0,0 +1,46 @@
1
+ import {
2
+ parseNumberFlag,
3
+ parseOptionalStringFlag
4
+ } from "./chunk-RPXWUCQQ.js";
5
+ import {
6
+ createUsageError
7
+ } from "./chunk-IPE7TF2P.js";
8
+
9
+ // src/cli/commands/interact/pointer-shared.ts
10
+ var POINTER_BUTTONS = /* @__PURE__ */ new Set(["left", "middle", "right"]);
11
+ function requireFlagValue(rawArgs, flag) {
12
+ const value = parseOptionalStringFlag(rawArgs, flag);
13
+ if (!value) {
14
+ throw createUsageError(`Missing ${flag}`);
15
+ }
16
+ return value;
17
+ }
18
+ function requirePointerCoordinate(rawArgs, flag) {
19
+ return parseNumberFlag(requireFlagValue(rawArgs, flag), flag, { integer: false });
20
+ }
21
+ function parsePointerSteps(rawArgs) {
22
+ const value = parseOptionalStringFlag(rawArgs, "--steps");
23
+ return value ? parseNumberFlag(value, "--steps", { min: 1 }) : void 0;
24
+ }
25
+ function parsePointerClickCount(rawArgs) {
26
+ const value = parseOptionalStringFlag(rawArgs, "--click-count");
27
+ return value ? parseNumberFlag(value, "--click-count", { min: 1 }) : void 0;
28
+ }
29
+ function parsePointerButton(rawArgs) {
30
+ const value = parseOptionalStringFlag(rawArgs, "--button");
31
+ if (!value) {
32
+ return void 0;
33
+ }
34
+ if (!POINTER_BUTTONS.has(value)) {
35
+ throw createUsageError(`Invalid --button: ${value}`);
36
+ }
37
+ return value;
38
+ }
39
+
40
+ export {
41
+ requirePointerCoordinate,
42
+ parsePointerSteps,
43
+ parsePointerClickCount,
44
+ parsePointerButton
45
+ };
46
+ //# sourceMappingURL=chunk-T4GMCW6Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/interact/pointer-shared.ts"],"sourcesContent":["import { createUsageError } from \"../../errors\";\nimport { parseNumberFlag, parseOptionalStringFlag } from \"../../utils/parse\";\n\nexport type PointerButton = \"left\" | \"middle\" | \"right\";\n\nconst POINTER_BUTTONS = new Set<PointerButton>([\"left\", \"middle\", \"right\"]);\n\nfunction requireFlagValue(rawArgs: string[], flag: string): string {\n const value = parseOptionalStringFlag(rawArgs, flag);\n if (!value) {\n throw createUsageError(`Missing ${flag}`);\n }\n return value;\n}\n\nexport function requirePointerCoordinate(rawArgs: string[], flag: string): number {\n return parseNumberFlag(requireFlagValue(rawArgs, flag), flag, { integer: false });\n}\n\nexport function parsePointerSteps(rawArgs: string[]): number | undefined {\n const value = parseOptionalStringFlag(rawArgs, \"--steps\");\n return value ? parseNumberFlag(value, \"--steps\", { min: 1 }) : undefined;\n}\n\nexport function parsePointerClickCount(rawArgs: string[]): number | undefined {\n const value = parseOptionalStringFlag(rawArgs, \"--click-count\");\n return value ? parseNumberFlag(value, \"--click-count\", { min: 1 }) : undefined;\n}\n\nexport function parsePointerButton(rawArgs: string[]): PointerButton | undefined {\n const value = parseOptionalStringFlag(rawArgs, \"--button\");\n if (!value) {\n return undefined;\n }\n if (!POINTER_BUTTONS.has(value as PointerButton)) {\n throw createUsageError(`Invalid --button: ${value}`);\n }\n return value as PointerButton;\n}\n"],"mappings":";;;;;;;;;AAKA,IAAM,kBAAkB,oBAAI,IAAmB,CAAC,QAAQ,UAAU,OAAO,CAAC;AAE1E,SAAS,iBAAiB,SAAmB,MAAsB;AACjE,QAAM,QAAQ,wBAAwB,SAAS,IAAI;AACnD,MAAI,CAAC,OAAO;AACV,UAAM,iBAAiB,WAAW,IAAI,EAAE;AAAA,EAC1C;AACA,SAAO;AACT;AAEO,SAAS,yBAAyB,SAAmB,MAAsB;AAChF,SAAO,gBAAgB,iBAAiB,SAAS,IAAI,GAAG,MAAM,EAAE,SAAS,MAAM,CAAC;AAClF;AAEO,SAAS,kBAAkB,SAAuC;AACvE,QAAM,QAAQ,wBAAwB,SAAS,SAAS;AACxD,SAAO,QAAQ,gBAAgB,OAAO,WAAW,EAAE,KAAK,EAAE,CAAC,IAAI;AACjE;AAEO,SAAS,uBAAuB,SAAuC;AAC5E,QAAM,QAAQ,wBAAwB,SAAS,eAAe;AAC9D,SAAO,QAAQ,gBAAgB,OAAO,iBAAiB,EAAE,KAAK,EAAE,CAAC,IAAI;AACvE;AAEO,SAAS,mBAAmB,SAA8C;AAC/E,QAAM,QAAQ,wBAAwB,SAAS,UAAU;AACzD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,MAAI,CAAC,gBAAgB,IAAI,KAAsB,GAAG;AAChD,UAAM,iBAAiB,qBAAqB,KAAK,EAAE;AAAA,EACrD;AACA,SAAO;AACT;","names":[]}