tabwright 1.0.0 → 2.0.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 (568) hide show
  1. package/dist/agent-skills/tabwright/SKILL.md +3 -0
  2. package/dist/aria-snapshot.d.ts +0 -1
  3. package/dist/aria-snapshot.js +9 -1
  4. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts +0 -1
  5. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js +0 -1
  6. package/dist/bippy.js +5 -5
  7. package/dist/browser-config.d.ts +0 -1
  8. package/dist/browser-config.js +0 -1
  9. package/dist/browser-install.d.ts +0 -1
  10. package/dist/browser-install.js +0 -1
  11. package/dist/browser-launch.d.ts +0 -1
  12. package/dist/browser-launch.js +0 -1
  13. package/dist/capability-agent-skill.d.ts +0 -1
  14. package/dist/capability-agent-skill.js +0 -1
  15. package/dist/capability-auth-state.d.ts +0 -1
  16. package/dist/capability-auth-state.js +0 -1
  17. package/dist/capability-auth.d.ts +0 -1
  18. package/dist/capability-auth.js +0 -1
  19. package/dist/capability-options.d.ts +0 -1
  20. package/dist/capability-options.js +0 -1
  21. package/dist/capability-package.d.ts +0 -1
  22. package/dist/capability-package.js +47 -2
  23. package/dist/capability-registry.d.ts +0 -1
  24. package/dist/capability-registry.js +0 -1
  25. package/dist/capability-runner.d.ts +0 -1
  26. package/dist/capability-runner.js +0 -1
  27. package/dist/capability-studio.d.ts +0 -1
  28. package/dist/capability-studio.js +0 -1
  29. package/dist/cdp-log.d.ts +0 -1
  30. package/dist/cdp-log.js +0 -1
  31. package/dist/cdp-relay.d.ts +0 -1
  32. package/dist/cdp-relay.js +0 -1
  33. package/dist/cdp-session.d.ts +0 -1
  34. package/dist/cdp-session.js +0 -1
  35. package/dist/cdp-types.d.ts +0 -1
  36. package/dist/cdp-types.js +0 -1
  37. package/dist/chrome-discovery.d.ts +0 -1
  38. package/dist/chrome-discovery.js +0 -1
  39. package/dist/clean-html.d.ts +0 -1
  40. package/dist/clean-html.js +0 -1
  41. package/dist/cli.d.ts +0 -1
  42. package/dist/cli.js +10 -56
  43. package/dist/cloud-client.d.ts +0 -1
  44. package/dist/cloud-client.js +0 -1
  45. package/dist/create-logger.d.ts +0 -1
  46. package/dist/create-logger.js +0 -1
  47. package/dist/debugger-examples-types.d.ts +0 -1
  48. package/dist/debugger-examples-types.js +0 -1
  49. package/dist/debugger-examples.d.ts +0 -1
  50. package/dist/debugger-examples.js +0 -1
  51. package/dist/debugger.d.ts +0 -1
  52. package/dist/debugger.js +0 -1
  53. package/dist/diff-utils.d.ts +0 -1
  54. package/dist/diff-utils.js +0 -1
  55. package/dist/doctor.d.ts +0 -1
  56. package/dist/doctor.js +5 -7
  57. package/dist/editor-examples.d.ts +0 -1
  58. package/dist/editor-examples.js +0 -1
  59. package/dist/editor.d.ts +0 -1
  60. package/dist/editor.js +0 -1
  61. package/dist/env-compat.d.ts +0 -1
  62. package/dist/env-compat.js +0 -1
  63. package/dist/executor.d.ts +0 -1
  64. package/dist/executor.js +1 -2
  65. package/dist/extension/background.js +10 -6
  66. package/dist/extension/manifest.json +1 -1
  67. package/dist/extension/options.js +1 -1
  68. package/dist/extension/rrweb-recorder.js +1 -1
  69. package/dist/ghost-browser.d.ts +0 -1
  70. package/dist/ghost-browser.js +0 -1
  71. package/dist/ghost-cursor-controller.d.ts +0 -1
  72. package/dist/ghost-cursor-controller.js +0 -1
  73. package/dist/ghost-cursor.d.ts +0 -1
  74. package/dist/ghost-cursor.js +0 -1
  75. package/dist/htmlrewrite.d.ts +0 -1
  76. package/dist/htmlrewrite.js +0 -1
  77. package/dist/index.d.ts +0 -1
  78. package/dist/index.js +0 -1
  79. package/dist/kill-port.d.ts +0 -1
  80. package/dist/kill-port.js +0 -1
  81. package/dist/kitty-graphics.d.ts +0 -1
  82. package/dist/kitty-graphics.js +0 -1
  83. package/dist/mcp.d.ts +0 -1
  84. package/dist/mcp.js +0 -1
  85. package/dist/package-paths.d.ts +0 -1
  86. package/dist/package-paths.js +0 -1
  87. package/dist/page-markdown.d.ts +0 -1
  88. package/dist/page-markdown.js +0 -1
  89. package/dist/performance-examples.d.ts +0 -1
  90. package/dist/performance-examples.js +0 -1
  91. package/dist/playwright-import.d.ts +0 -1
  92. package/dist/playwright-import.js +0 -1
  93. package/dist/product-paths.d.ts +0 -1
  94. package/dist/product-paths.js +0 -1
  95. package/dist/protocol.d.ts +0 -1
  96. package/dist/protocol.js +0 -1
  97. package/dist/react-source.d.ts +0 -1
  98. package/dist/react-source.js +0 -1
  99. package/dist/readability.js +4 -4
  100. package/dist/relay-client.d.ts +0 -1
  101. package/dist/relay-client.js +0 -1
  102. package/dist/relay-state.d.ts +0 -1
  103. package/dist/relay-state.js +0 -1
  104. package/dist/replay-ai-index.d.ts +0 -1
  105. package/dist/replay-ai-index.js +0 -1
  106. package/dist/replay-eval.d.ts +0 -1
  107. package/dist/replay-eval.js +0 -1
  108. package/dist/replay-handoff.d.ts +0 -1
  109. package/dist/replay-handoff.js +0 -1
  110. package/dist/replay-workflow-compiler.d.ts +0 -1
  111. package/dist/replay-workflow-compiler.js +0 -1
  112. package/dist/rrweb-recording-relay.d.ts +0 -1
  113. package/dist/rrweb-recording-relay.js +0 -1
  114. package/dist/rrweb-recording.d.ts +0 -1
  115. package/dist/rrweb-recording.js +0 -1
  116. package/dist/scoped-fs.d.ts +0 -1
  117. package/dist/scoped-fs.js +0 -1
  118. package/dist/selector-generator.js +2 -2
  119. package/dist/start-relay-server.d.ts +0 -1
  120. package/dist/start-relay-server.js +0 -1
  121. package/dist/styles-examples.d.ts +0 -1
  122. package/dist/styles-examples.js +0 -1
  123. package/dist/styles.d.ts +0 -1
  124. package/dist/styles.js +0 -1
  125. package/dist/tabwright-agent-skill.d.ts +0 -1
  126. package/dist/tabwright-agent-skill.js +0 -1
  127. package/dist/test-declarations.d.ts +0 -1
  128. package/dist/test-declarations.js +0 -1
  129. package/dist/utils.d.ts +0 -1
  130. package/dist/utils.js +2 -2
  131. package/dist/wait-for-page-load.d.ts +0 -1
  132. package/dist/wait-for-page-load.js +0 -1
  133. package/dist/workflow-capability.d.ts +0 -1
  134. package/dist/workflow-capability.js +0 -1
  135. package/package.json +8 -4
  136. package/readme.md +43 -0
  137. package/src/skill.md +5 -2
  138. package/dist/aria-snapshot.d.ts.map +0 -1
  139. package/dist/aria-snapshot.js.map +0 -1
  140. package/dist/aria-snapshot.test.d.ts +0 -2
  141. package/dist/aria-snapshot.test.d.ts.map +0 -1
  142. package/dist/aria-snapshot.test.js +0 -270
  143. package/dist/aria-snapshot.test.js.map +0 -1
  144. package/dist/aria-snapshot.unit.test.d.ts +0 -2
  145. package/dist/aria-snapshot.unit.test.d.ts.map +0 -1
  146. package/dist/aria-snapshot.unit.test.js +0 -542
  147. package/dist/aria-snapshot.unit.test.js.map +0 -1
  148. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts.map +0 -1
  149. package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js.map +0 -1
  150. package/dist/browser-config.d.ts.map +0 -1
  151. package/dist/browser-config.js.map +0 -1
  152. package/dist/browser-install.d.ts.map +0 -1
  153. package/dist/browser-install.js.map +0 -1
  154. package/dist/browser-launch.d.ts.map +0 -1
  155. package/dist/browser-launch.js.map +0 -1
  156. package/dist/builtin-capabilities.d.ts +0 -28
  157. package/dist/builtin-capabilities.d.ts.map +0 -1
  158. package/dist/builtin-capabilities.js +0 -2673
  159. package/dist/builtin-capabilities.js.map +0 -1
  160. package/dist/capability-agent-skill.d.ts.map +0 -1
  161. package/dist/capability-agent-skill.js.map +0 -1
  162. package/dist/capability-auth-state.d.ts.map +0 -1
  163. package/dist/capability-auth-state.js.map +0 -1
  164. package/dist/capability-auth.d.ts.map +0 -1
  165. package/dist/capability-auth.js.map +0 -1
  166. package/dist/capability-cli-confirmation.test.d.ts +0 -2
  167. package/dist/capability-cli-confirmation.test.d.ts.map +0 -1
  168. package/dist/capability-cli-confirmation.test.js +0 -79
  169. package/dist/capability-cli-confirmation.test.js.map +0 -1
  170. package/dist/capability-options.d.ts.map +0 -1
  171. package/dist/capability-options.js.map +0 -1
  172. package/dist/capability-options.test.d.ts +0 -2
  173. package/dist/capability-options.test.d.ts.map +0 -1
  174. package/dist/capability-options.test.js +0 -81
  175. package/dist/capability-options.test.js.map +0 -1
  176. package/dist/capability-package.d.ts.map +0 -1
  177. package/dist/capability-package.js.map +0 -1
  178. package/dist/capability-package.test.d.ts +0 -2
  179. package/dist/capability-package.test.d.ts.map +0 -1
  180. package/dist/capability-package.test.js +0 -179
  181. package/dist/capability-package.test.js.map +0 -1
  182. package/dist/capability-registry.d.ts.map +0 -1
  183. package/dist/capability-registry.js.map +0 -1
  184. package/dist/capability-registry.test.d.ts +0 -2
  185. package/dist/capability-registry.test.d.ts.map +0 -1
  186. package/dist/capability-registry.test.js +0 -1683
  187. package/dist/capability-registry.test.js.map +0 -1
  188. package/dist/capability-runner.d.ts.map +0 -1
  189. package/dist/capability-runner.js.map +0 -1
  190. package/dist/capability-search-relevance.test.d.ts +0 -2
  191. package/dist/capability-search-relevance.test.d.ts.map +0 -1
  192. package/dist/capability-search-relevance.test.js +0 -67
  193. package/dist/capability-search-relevance.test.js.map +0 -1
  194. package/dist/capability-studio.d.ts.map +0 -1
  195. package/dist/capability-studio.js.map +0 -1
  196. package/dist/capability-studio.test.d.ts +0 -2
  197. package/dist/capability-studio.test.d.ts.map +0 -1
  198. package/dist/capability-studio.test.js +0 -41
  199. package/dist/capability-studio.test.js.map +0 -1
  200. package/dist/cdp-log.d.ts.map +0 -1
  201. package/dist/cdp-log.js.map +0 -1
  202. package/dist/cdp-log.test.d.ts +0 -2
  203. package/dist/cdp-log.test.d.ts.map +0 -1
  204. package/dist/cdp-log.test.js +0 -109
  205. package/dist/cdp-log.test.js.map +0 -1
  206. package/dist/cdp-relay.d.ts.map +0 -1
  207. package/dist/cdp-relay.js.map +0 -1
  208. package/dist/cdp-session.d.ts.map +0 -1
  209. package/dist/cdp-session.js.map +0 -1
  210. package/dist/cdp-types.d.ts.map +0 -1
  211. package/dist/cdp-types.js.map +0 -1
  212. package/dist/channel-owner-inspect.test.d.ts +0 -2
  213. package/dist/channel-owner-inspect.test.d.ts.map +0 -1
  214. package/dist/channel-owner-inspect.test.js +0 -75
  215. package/dist/channel-owner-inspect.test.js.map +0 -1
  216. package/dist/chrome-discovery.d.ts.map +0 -1
  217. package/dist/chrome-discovery.js.map +0 -1
  218. package/dist/chrome-discovery.test.d.ts +0 -2
  219. package/dist/chrome-discovery.test.d.ts.map +0 -1
  220. package/dist/chrome-discovery.test.js +0 -41
  221. package/dist/chrome-discovery.test.js.map +0 -1
  222. package/dist/clean-html.d.ts.map +0 -1
  223. package/dist/clean-html.js.map +0 -1
  224. package/dist/cli-help.test.d.ts +0 -2
  225. package/dist/cli-help.test.d.ts.map +0 -1
  226. package/dist/cli-help.test.js +0 -98
  227. package/dist/cli-help.test.js.map +0 -1
  228. package/dist/cli.d.ts.map +0 -1
  229. package/dist/cli.js.map +0 -1
  230. package/dist/cloud-client.d.ts.map +0 -1
  231. package/dist/cloud-client.js.map +0 -1
  232. package/dist/create-logger.d.ts.map +0 -1
  233. package/dist/create-logger.js.map +0 -1
  234. package/dist/debugger-examples-types.d.ts.map +0 -1
  235. package/dist/debugger-examples-types.js.map +0 -1
  236. package/dist/debugger-examples.d.ts.map +0 -1
  237. package/dist/debugger-examples.js.map +0 -1
  238. package/dist/debugger.d.ts.map +0 -1
  239. package/dist/debugger.js.map +0 -1
  240. package/dist/diff-utils.d.ts.map +0 -1
  241. package/dist/diff-utils.js.map +0 -1
  242. package/dist/diff-utils.test.d.ts +0 -2
  243. package/dist/diff-utils.test.d.ts.map +0 -1
  244. package/dist/diff-utils.test.js +0 -137
  245. package/dist/diff-utils.test.js.map +0 -1
  246. package/dist/doctor.d.ts.map +0 -1
  247. package/dist/doctor.js.map +0 -1
  248. package/dist/doctor.test.d.ts +0 -2
  249. package/dist/doctor.test.d.ts.map +0 -1
  250. package/dist/doctor.test.js +0 -208
  251. package/dist/doctor.test.js.map +0 -1
  252. package/dist/editor-examples.d.ts.map +0 -1
  253. package/dist/editor-examples.js.map +0 -1
  254. package/dist/editor.d.ts.map +0 -1
  255. package/dist/editor.js.map +0 -1
  256. package/dist/env-compat.d.ts.map +0 -1
  257. package/dist/env-compat.js.map +0 -1
  258. package/dist/executor.d.ts.map +0 -1
  259. package/dist/executor.js.map +0 -1
  260. package/dist/executor.unit.test.d.ts +0 -2
  261. package/dist/executor.unit.test.d.ts.map +0 -1
  262. package/dist/executor.unit.test.js +0 -143
  263. package/dist/executor.unit.test.js.map +0 -1
  264. package/dist/extension-connection.test.d.ts +0 -2
  265. package/dist/extension-connection.test.d.ts.map +0 -1
  266. package/dist/extension-connection.test.js +0 -708
  267. package/dist/extension-connection.test.js.map +0 -1
  268. package/dist/extension-icon-warning.test.d.ts +0 -2
  269. package/dist/extension-icon-warning.test.d.ts.map +0 -1
  270. package/dist/extension-icon-warning.test.js +0 -33
  271. package/dist/extension-icon-warning.test.js.map +0 -1
  272. package/dist/ghost-browser.d.ts.map +0 -1
  273. package/dist/ghost-browser.js.map +0 -1
  274. package/dist/ghost-cursor-controller.d.ts.map +0 -1
  275. package/dist/ghost-cursor-controller.js.map +0 -1
  276. package/dist/ghost-cursor.d.ts.map +0 -1
  277. package/dist/ghost-cursor.js.map +0 -1
  278. package/dist/htmlrewrite.d.ts.map +0 -1
  279. package/dist/htmlrewrite.js.map +0 -1
  280. package/dist/htmlrewrite.test.d.ts +0 -2
  281. package/dist/htmlrewrite.test.d.ts.map +0 -1
  282. package/dist/htmlrewrite.test.js +0 -7975
  283. package/dist/htmlrewrite.test.js.map +0 -1
  284. package/dist/index.d.ts.map +0 -1
  285. package/dist/index.js.map +0 -1
  286. package/dist/kill-port.d.ts.map +0 -1
  287. package/dist/kill-port.js.map +0 -1
  288. package/dist/kitty-graphics.d.ts.map +0 -1
  289. package/dist/kitty-graphics.js.map +0 -1
  290. package/dist/kitty-graphics.test.d.ts +0 -2
  291. package/dist/kitty-graphics.test.d.ts.map +0 -1
  292. package/dist/kitty-graphics.test.js +0 -125
  293. package/dist/kitty-graphics.test.js.map +0 -1
  294. package/dist/locator-selector.test.d.ts +0 -2
  295. package/dist/locator-selector.test.d.ts.map +0 -1
  296. package/dist/locator-selector.test.js +0 -98
  297. package/dist/locator-selector.test.js.map +0 -1
  298. package/dist/mcp-client.d.ts +0 -20
  299. package/dist/mcp-client.d.ts.map +0 -1
  300. package/dist/mcp-client.js +0 -56
  301. package/dist/mcp-client.js.map +0 -1
  302. package/dist/mcp.d.ts.map +0 -1
  303. package/dist/mcp.js.map +0 -1
  304. package/dist/on-mouse-action.test.d.ts +0 -2
  305. package/dist/on-mouse-action.test.d.ts.map +0 -1
  306. package/dist/on-mouse-action.test.js +0 -180
  307. package/dist/on-mouse-action.test.js.map +0 -1
  308. package/dist/options-page.test.d.ts +0 -2
  309. package/dist/options-page.test.d.ts.map +0 -1
  310. package/dist/options-page.test.js +0 -773
  311. package/dist/options-page.test.js.map +0 -1
  312. package/dist/package-paths.d.ts.map +0 -1
  313. package/dist/package-paths.js.map +0 -1
  314. package/dist/page-markdown.d.ts.map +0 -1
  315. package/dist/page-markdown.js.map +0 -1
  316. package/dist/performance-examples.d.ts.map +0 -1
  317. package/dist/performance-examples.js.map +0 -1
  318. package/dist/playwright-import.d.ts.map +0 -1
  319. package/dist/playwright-import.js.map +0 -1
  320. package/dist/popup-relocation.test.d.ts +0 -7
  321. package/dist/popup-relocation.test.d.ts.map +0 -1
  322. package/dist/popup-relocation.test.js +0 -139
  323. package/dist/popup-relocation.test.js.map +0 -1
  324. package/dist/product-paths.d.ts.map +0 -1
  325. package/dist/product-paths.js.map +0 -1
  326. package/dist/product-paths.test.d.ts +0 -2
  327. package/dist/product-paths.test.d.ts.map +0 -1
  328. package/dist/product-paths.test.js +0 -39
  329. package/dist/product-paths.test.js.map +0 -1
  330. package/dist/protocol.d.ts.map +0 -1
  331. package/dist/protocol.js.map +0 -1
  332. package/dist/protocol.test.d.ts +0 -2
  333. package/dist/protocol.test.d.ts.map +0 -1
  334. package/dist/protocol.test.js +0 -31
  335. package/dist/protocol.test.js.map +0 -1
  336. package/dist/react-source.d.ts.map +0 -1
  337. package/dist/react-source.js.map +0 -1
  338. package/dist/relay-client.d.ts.map +0 -1
  339. package/dist/relay-client.js.map +0 -1
  340. package/dist/relay-client.test.d.ts +0 -2
  341. package/dist/relay-client.test.d.ts.map +0 -1
  342. package/dist/relay-client.test.js +0 -305
  343. package/dist/relay-client.test.js.map +0 -1
  344. package/dist/relay-core.test.d.ts +0 -2
  345. package/dist/relay-core.test.d.ts.map +0 -1
  346. package/dist/relay-core.test.js +0 -1427
  347. package/dist/relay-core.test.js.map +0 -1
  348. package/dist/relay-navigation.test.d.ts +0 -2
  349. package/dist/relay-navigation.test.d.ts.map +0 -1
  350. package/dist/relay-navigation.test.js +0 -661
  351. package/dist/relay-navigation.test.js.map +0 -1
  352. package/dist/relay-session.test.d.ts +0 -2
  353. package/dist/relay-session.test.d.ts.map +0 -1
  354. package/dist/relay-session.test.js +0 -1121
  355. package/dist/relay-session.test.js.map +0 -1
  356. package/dist/relay-state.d.ts.map +0 -1
  357. package/dist/relay-state.js.map +0 -1
  358. package/dist/relay-state.test.d.ts +0 -2
  359. package/dist/relay-state.test.d.ts.map +0 -1
  360. package/dist/relay-state.test.js +0 -594
  361. package/dist/relay-state.test.js.map +0 -1
  362. package/dist/replay-ai-index.d.ts.map +0 -1
  363. package/dist/replay-ai-index.js.map +0 -1
  364. package/dist/replay-ai-index.test.d.ts +0 -2
  365. package/dist/replay-ai-index.test.d.ts.map +0 -1
  366. package/dist/replay-ai-index.test.js +0 -255
  367. package/dist/replay-ai-index.test.js.map +0 -1
  368. package/dist/replay-cli.test.d.ts +0 -2
  369. package/dist/replay-cli.test.d.ts.map +0 -1
  370. package/dist/replay-cli.test.js +0 -275
  371. package/dist/replay-cli.test.js.map +0 -1
  372. package/dist/replay-eval.d.ts.map +0 -1
  373. package/dist/replay-eval.js.map +0 -1
  374. package/dist/replay-handoff.d.ts.map +0 -1
  375. package/dist/replay-handoff.js.map +0 -1
  376. package/dist/replay-handoff.test.d.ts +0 -2
  377. package/dist/replay-handoff.test.d.ts.map +0 -1
  378. package/dist/replay-handoff.test.js +0 -123
  379. package/dist/replay-handoff.test.js.map +0 -1
  380. package/dist/replay-workflow-compiler.d.ts.map +0 -1
  381. package/dist/replay-workflow-compiler.js.map +0 -1
  382. package/dist/replay-workflow-compiler.test.d.ts +0 -2
  383. package/dist/replay-workflow-compiler.test.d.ts.map +0 -1
  384. package/dist/replay-workflow-compiler.test.js +0 -223
  385. package/dist/replay-workflow-compiler.test.js.map +0 -1
  386. package/dist/rrweb-recording-relay.d.ts.map +0 -1
  387. package/dist/rrweb-recording-relay.js.map +0 -1
  388. package/dist/rrweb-recording-relay.test.d.ts +0 -2
  389. package/dist/rrweb-recording-relay.test.d.ts.map +0 -1
  390. package/dist/rrweb-recording-relay.test.js +0 -85
  391. package/dist/rrweb-recording-relay.test.js.map +0 -1
  392. package/dist/rrweb-recording.d.ts.map +0 -1
  393. package/dist/rrweb-recording.js.map +0 -1
  394. package/dist/scoped-fs.d.ts.map +0 -1
  395. package/dist/scoped-fs.js.map +0 -1
  396. package/dist/scoped-fs.test.d.ts +0 -5
  397. package/dist/scoped-fs.test.d.ts.map +0 -1
  398. package/dist/scoped-fs.test.js +0 -73
  399. package/dist/scoped-fs.test.js.map +0 -1
  400. package/dist/skill-stub.test.d.ts +0 -2
  401. package/dist/skill-stub.test.d.ts.map +0 -1
  402. package/dist/skill-stub.test.js +0 -22
  403. package/dist/skill-stub.test.js.map +0 -1
  404. package/dist/snapshot-tools.test.d.ts +0 -2
  405. package/dist/snapshot-tools.test.d.ts.map +0 -1
  406. package/dist/snapshot-tools.test.js +0 -856
  407. package/dist/snapshot-tools.test.js.map +0 -1
  408. package/dist/start-relay-server.d.ts.map +0 -1
  409. package/dist/start-relay-server.js.map +0 -1
  410. package/dist/styles-examples.d.ts.map +0 -1
  411. package/dist/styles-examples.js.map +0 -1
  412. package/dist/styles.d.ts.map +0 -1
  413. package/dist/styles.js.map +0 -1
  414. package/dist/tabwright-agent-skill.d.ts.map +0 -1
  415. package/dist/tabwright-agent-skill.js.map +0 -1
  416. package/dist/tabwright-agent-skill.test.d.ts +0 -2
  417. package/dist/tabwright-agent-skill.test.d.ts.map +0 -1
  418. package/dist/tabwright-agent-skill.test.js +0 -51
  419. package/dist/tabwright-agent-skill.test.js.map +0 -1
  420. package/dist/test-declarations.d.ts.map +0 -1
  421. package/dist/test-declarations.js.map +0 -1
  422. package/dist/test-utils.d.ts +0 -69
  423. package/dist/test-utils.d.ts.map +0 -1
  424. package/dist/test-utils.js +0 -448
  425. package/dist/test-utils.js.map +0 -1
  426. package/dist/test-utils.test.d.ts +0 -2
  427. package/dist/test-utils.test.d.ts.map +0 -1
  428. package/dist/test-utils.test.js +0 -55
  429. package/dist/test-utils.test.js.map +0 -1
  430. package/dist/utils.d.ts.map +0 -1
  431. package/dist/utils.js.map +0 -1
  432. package/dist/wait-for-page-load.d.ts.map +0 -1
  433. package/dist/wait-for-page-load.js.map +0 -1
  434. package/dist/workflow-capability.d.ts.map +0 -1
  435. package/dist/workflow-capability.js.map +0 -1
  436. package/dist/workflow-script-flow.test.d.ts +0 -2
  437. package/dist/workflow-script-flow.test.d.ts.map +0 -1
  438. package/dist/workflow-script-flow.test.js +0 -285
  439. package/dist/workflow-script-flow.test.js.map +0 -1
  440. package/src/__snapshots__/x.com.processed.html +0 -1003
  441. package/src/__snapshots__/x.com.processed.withStyles.html +0 -2720
  442. package/src/a11y-client.ts +0 -241
  443. package/src/agent-skills/conan-config/SKILL.md +0 -141
  444. package/src/agent-skills/conan-config/agents/openai.yaml +0 -4
  445. package/src/aria-snapshot.test.ts +0 -311
  446. package/src/aria-snapshot.ts +0 -1681
  447. package/src/aria-snapshot.unit.test.ts +0 -615
  448. package/src/aria-snapshots/github-interactive.txt +0 -193
  449. package/src/aria-snapshots/github-raw.txt +0 -309
  450. package/src/aria-snapshots/hackernews-interactive.txt +0 -477
  451. package/src/aria-snapshots/hackernews-raw.txt +0 -428
  452. package/src/aria-snapshots/prosemirror-interactive.txt +0 -66
  453. package/src/aria-snapshots/prosemirror-raw.txt +0 -145
  454. package/src/assets/aria-labels-hacker-news.png +0 -0
  455. package/src/assets/aria-labels-old-reddit.png +0 -0
  456. package/src/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.ts +0 -5
  457. package/src/assets/cursors/screen-studio/pointer-macos-tahoe.svg +0 -18
  458. package/src/assets/x.com.html +0 -32946
  459. package/src/browser-config.ts +0 -179
  460. package/src/browser-install.ts +0 -284
  461. package/src/browser-launch.ts +0 -75
  462. package/src/builtin-capabilities.ts +0 -2765
  463. package/src/capability-agent-skill.ts +0 -305
  464. package/src/capability-auth-state.ts +0 -197
  465. package/src/capability-auth.ts +0 -249
  466. package/src/capability-cli-confirmation.test.ts +0 -90
  467. package/src/capability-options.test.ts +0 -89
  468. package/src/capability-options.ts +0 -57
  469. package/src/capability-package.test.ts +0 -204
  470. package/src/capability-package.ts +0 -555
  471. package/src/capability-registry.test.ts +0 -1905
  472. package/src/capability-registry.ts +0 -1234
  473. package/src/capability-runner.ts +0 -801
  474. package/src/capability-search-relevance.test.ts +0 -73
  475. package/src/capability-studio.test.ts +0 -45
  476. package/src/capability-studio.ts +0 -641
  477. package/src/cdp-log.test.ts +0 -131
  478. package/src/cdp-log.ts +0 -112
  479. package/src/cdp-relay.ts +0 -2944
  480. package/src/cdp-session.ts +0 -77
  481. package/src/cdp-types.ts +0 -158
  482. package/src/channel-owner-inspect.test.ts +0 -94
  483. package/src/chrome-discovery.test.ts +0 -50
  484. package/src/chrome-discovery.ts +0 -220
  485. package/src/clean-html.ts +0 -141
  486. package/src/cli-help.test.ts +0 -123
  487. package/src/cli.ts +0 -3181
  488. package/src/cloud-client.ts +0 -179
  489. package/src/create-logger.ts +0 -38
  490. package/src/debugger-examples-types.ts +0 -16
  491. package/src/debugger-examples.ts +0 -66
  492. package/src/debugger.ts +0 -708
  493. package/src/diff-utils.test.ts +0 -152
  494. package/src/diff-utils.ts +0 -70
  495. package/src/doctor.test.ts +0 -244
  496. package/src/doctor.ts +0 -321
  497. package/src/editor-examples.ts +0 -158
  498. package/src/editor.ts +0 -426
  499. package/src/env-compat.ts +0 -28
  500. package/src/executor.ts +0 -1824
  501. package/src/executor.unit.test.ts +0 -168
  502. package/src/extension-connection.test.ts +0 -855
  503. package/src/extension-icon-warning.test.ts +0 -45
  504. package/src/ghost-browser.ts +0 -149
  505. package/src/ghost-cursor-client.ts +0 -494
  506. package/src/ghost-cursor-controller.ts +0 -129
  507. package/src/ghost-cursor.ts +0 -123
  508. package/src/htmlrewrite.test.ts +0 -8008
  509. package/src/htmlrewrite.ts +0 -390
  510. package/src/index.ts +0 -53
  511. package/src/kill-port.ts +0 -219
  512. package/src/kitty-graphics.test.ts +0 -139
  513. package/src/kitty-graphics.ts +0 -79
  514. package/src/locator-selector.test.ts +0 -119
  515. package/src/mcp-client.ts +0 -78
  516. package/src/mcp.ts +0 -629
  517. package/src/on-mouse-action.test.ts +0 -226
  518. package/src/options-page.test.ts +0 -839
  519. package/src/package-paths.ts +0 -38
  520. package/src/page-markdown.ts +0 -240
  521. package/src/performance-examples.ts +0 -186
  522. package/src/playwright-import.ts +0 -59
  523. package/src/popup-relocation.test.ts +0 -163
  524. package/src/product-paths.test.ts +0 -47
  525. package/src/product-paths.ts +0 -28
  526. package/src/protocol.test.ts +0 -52
  527. package/src/protocol.ts +0 -351
  528. package/src/react-source.ts +0 -379
  529. package/src/relay-client.test.ts +0 -375
  530. package/src/relay-client.ts +0 -572
  531. package/src/relay-core.test.ts +0 -1603
  532. package/src/relay-navigation.test.ts +0 -790
  533. package/src/relay-session.test.ts +0 -1375
  534. package/src/relay-state.test.ts +0 -729
  535. package/src/relay-state.ts +0 -561
  536. package/src/replay-ai-index.test.ts +0 -278
  537. package/src/replay-ai-index.ts +0 -872
  538. package/src/replay-cli.test.ts +0 -325
  539. package/src/replay-eval.ts +0 -1039
  540. package/src/replay-handoff.test.ts +0 -163
  541. package/src/replay-handoff.ts +0 -109
  542. package/src/replay-workflow-compiler.test.ts +0 -250
  543. package/src/replay-workflow-compiler.ts +0 -700
  544. package/src/resource.md +0 -409
  545. package/src/rrweb-recording-relay.test.ts +0 -99
  546. package/src/rrweb-recording-relay.ts +0 -400
  547. package/src/rrweb-recording.ts +0 -322
  548. package/src/scoped-fs.test.ts +0 -80
  549. package/src/scoped-fs.ts +0 -420
  550. package/src/skill-stub.test.ts +0 -24
  551. package/src/snapshot-tools.test.ts +0 -1017
  552. package/src/snapshots/hacker-news-accessibility-full.md +0 -81
  553. package/src/snapshots/hacker-news-accessibility-interactive.md +0 -43
  554. package/src/snapshots/page-markdown-output.txt +0 -16
  555. package/src/snapshots/shadcn-ui-accessibility-full.md +0 -201
  556. package/src/snapshots/shadcn-ui-accessibility-interactive.md +0 -109
  557. package/src/start-relay-server.ts +0 -69
  558. package/src/styles-examples.ts +0 -84
  559. package/src/styles.ts +0 -343
  560. package/src/tabwright-agent-skill.test.ts +0 -61
  561. package/src/tabwright-agent-skill.ts +0 -105
  562. package/src/test-declarations.ts +0 -13
  563. package/src/test-utils.test.ts +0 -70
  564. package/src/test-utils.ts +0 -566
  565. package/src/utils.ts +0 -78
  566. package/src/wait-for-page-load.ts +0 -198
  567. package/src/workflow-capability.ts +0 -417
  568. package/src/workflow-script-flow.test.ts +0 -388
@@ -1,249 +0,0 @@
1
- import path from 'node:path'
2
- import {
3
- readCapabilitySecrets,
4
- requireCapability,
5
- writeCapabilitySecrets,
6
- type CapabilityRecord,
7
- } from './capability-registry.js'
8
- import { writeStoredCapabilityAuthState } from './capability-auth-state.js'
9
- import type { ExecuteResult } from './executor.js'
10
-
11
- export interface CapabilityAuthExecutor {
12
- execute(
13
- code: string,
14
- timeout?: number,
15
- options?: { includeStructuredResult?: boolean },
16
- ): Promise<ExecuteResult>
17
- }
18
-
19
- export interface CapabilityAuthRefreshResult {
20
- capability: CapabilityRecord
21
- saved: boolean
22
- secretKey: string
23
- cookieCount: number
24
- cookieNames: string[]
25
- urls: string[]
26
- expiresAt?: string
27
- path: string
28
- }
29
-
30
- export interface CapabilityAuthCookie {
31
- name: string
32
- value: string
33
- expires?: number
34
- }
35
-
36
- export async function refreshCapabilityAuthWithExecutor(options: {
37
- executor: CapabilityAuthExecutor
38
- id: string
39
- cwd?: string
40
- timeout?: number
41
- browserKey?: string
42
- }): Promise<CapabilityAuthRefreshResult> {
43
- const capability = requireCapability({ id: options.id, cwd: options.cwd })
44
- if (capability.manifest.auth.type !== 'cookie' || capability.manifest.auth.refresh !== 'from-browser') {
45
- throw new Error(`Capability ${options.id} does not declare browser-refreshable cookie auth`)
46
- }
47
- if (capability.manifest.auth.browserUrls.length === 0) {
48
- throw new Error(`Capability ${options.id} auth.browserUrls is required for cookie refresh`)
49
- }
50
-
51
- const executeResult = await options.executor.execute(buildCookieRefreshCode({ capability }), options.timeout || 10000, {
52
- includeStructuredResult: true,
53
- })
54
- if (executeResult.isError) {
55
- throw new Error(`Failed to refresh capability auth: ${executeResult.text}`)
56
- }
57
- const parsed = parseRefreshResult(executeResult.structuredResult)
58
- writeStoredCapabilityAuthState({
59
- capability,
60
- state: {
61
- schemaVersion: 1,
62
- refreshedAt: new Date().toISOString(),
63
- expiresAt: parsed.expiresAt,
64
- cookieNames: parsed.cookieNames,
65
- browserKey: options.browserKey,
66
- },
67
- })
68
- return {
69
- capability,
70
- ...parsed,
71
- }
72
- }
73
-
74
- function buildCookieRefreshCode(options: { capability: CapabilityRecord }): string {
75
- const secretKey = options.capability.manifest.auth.secretKey || 'cookieHeader'
76
- const secretsPath = path.join(options.capability.dir, 'secrets.json')
77
- return [
78
- 'const fs = await globalThis.import("node:fs")',
79
- `const urls = ${JSON.stringify(options.capability.manifest.auth.browserUrls)};`,
80
- `const requiredCookieNames = ${JSON.stringify(options.capability.manifest.auth.requiredCookieNames)};`,
81
- `const secretKey = ${JSON.stringify(secretKey)};`,
82
- `const secretsPath = ${JSON.stringify(secretsPath)};`,
83
- `const secretsDir = ${JSON.stringify(options.capability.dir)};`,
84
- 'const cdp = await getCDPSession({ page });',
85
- 'const result = await cdp.send("Network.getCookies", { urls });',
86
- 'const cookies = Array.isArray(result.cookies) ? result.cookies : [];',
87
- 'const cookieNames = cookies.map((cookie) => cookie.name).filter((name) => typeof name === "string");',
88
- 'const missingCookieNames = requiredCookieNames.filter((name) => !cookieNames.includes(name));',
89
- 'if (missingCookieNames.length > 0) {',
90
- ' throw new Error(`Missing required cookies: ${missingCookieNames.join(", ")}`);',
91
- '}',
92
- 'const cookieHeader = cookies.map((cookie) => `${cookie.name}=${cookie.value}`).join("; ");',
93
- 'if (!cookieHeader) {',
94
- ' throw new Error("No cookies were available for capability auth refresh");',
95
- '}',
96
- 'const existingSecrets = fs.existsSync(secretsPath) ? JSON.parse(fs.readFileSync(secretsPath, "utf-8")) : {};',
97
- 'const nextSecrets = {',
98
- ' ...existingSecrets,',
99
- ' [secretKey]: cookieHeader,',
100
- ' updatedAt: new Date().toISOString(),',
101
- '};',
102
- 'fs.mkdirSync(secretsDir, { recursive: true });',
103
- 'fs.writeFileSync(secretsPath, JSON.stringify(nextSecrets, null, 2), { mode: 0o600 });',
104
- 'if (process.platform !== "win32") {',
105
- ' fs.chmodSync(secretsPath, 0o600);',
106
- '}',
107
- 'const expiryCookies = requiredCookieNames.length > 0',
108
- ' ? cookies.filter((cookie) => requiredCookieNames.includes(cookie.name))',
109
- ' : [];',
110
- 'const expiryValues = expiryCookies.map((cookie) => cookie.expires).filter((expires) => typeof expires === "number" && expires > 0);',
111
- 'const expiresAt = expiryCookies.length > 0 && expiryValues.length === expiryCookies.length',
112
- ' ? new Date(Math.min(...expiryValues) * 1000).toISOString()',
113
- ' : undefined;',
114
- 'return {',
115
- ' saved: true,',
116
- ' secretKey,',
117
- ' cookieCount: cookies.length,',
118
- ' cookieNames,',
119
- ' urls,',
120
- ' expiresAt,',
121
- ' path: secretsPath,',
122
- '};',
123
- `//# sourceURL=tabwright-capability-auth://${options.capability.manifest.id}`,
124
- '',
125
- ].join('\n')
126
- }
127
-
128
- export function refreshCapabilityAuthFromCookies(options: {
129
- id: string
130
- cookies: CapabilityAuthCookie[]
131
- cwd?: string
132
- browserKey?: string
133
- }): CapabilityAuthRefreshResult {
134
- const capability = requireBrowserRefreshableCookieCapability({ id: options.id, cwd: options.cwd })
135
- const cookieNames = options.cookies.map((cookie) => {
136
- return cookie.name
137
- })
138
- const missingCookieNames = capability.manifest.auth.requiredCookieNames.filter((name) => {
139
- return !cookieNames.includes(name)
140
- })
141
- if (missingCookieNames.length > 0) {
142
- throw new Error(`Missing required cookies: ${missingCookieNames.join(', ')}`)
143
- }
144
- const cookieHeader = options.cookies
145
- .map((cookie) => {
146
- return `${cookie.name}=${cookie.value}`
147
- })
148
- .join('; ')
149
- if (!cookieHeader) {
150
- throw new Error('No cookies were available for capability auth refresh')
151
- }
152
-
153
- const secretKey = capability.manifest.auth.secretKey || 'cookieHeader'
154
- const existingSecrets = readCapabilitySecrets({ capability })
155
- writeCapabilitySecrets({
156
- capability,
157
- secrets: {
158
- ...existingSecrets,
159
- [secretKey]: cookieHeader,
160
- updatedAt: new Date().toISOString(),
161
- },
162
- })
163
-
164
- const requiredCookies = capability.manifest.auth.requiredCookieNames.map((name) => {
165
- return options.cookies.find((cookie) => {
166
- return cookie.name === name
167
- })
168
- })
169
- const expiryValues = requiredCookies
170
- .map((cookie) => {
171
- return cookie?.expires
172
- })
173
- .filter((expires): expires is number => {
174
- return typeof expires === 'number' && expires > 0
175
- })
176
- // Do not invent an expiry for session cookies: only all timestamped required cookies produce a deadline.
177
- const expiresAt =
178
- requiredCookies.length > 0 && expiryValues.length === requiredCookies.length
179
- ? new Date(Math.min(...expiryValues) * 1000).toISOString()
180
- : undefined
181
- writeStoredCapabilityAuthState({
182
- capability,
183
- state: {
184
- schemaVersion: 1,
185
- refreshedAt: new Date().toISOString(),
186
- expiresAt,
187
- cookieNames,
188
- browserKey: options.browserKey,
189
- },
190
- })
191
- return {
192
- capability,
193
- saved: true,
194
- secretKey,
195
- cookieCount: options.cookies.length,
196
- cookieNames,
197
- urls: capability.manifest.auth.browserUrls,
198
- expiresAt,
199
- path: path.join(capability.dir, 'secrets.json'),
200
- }
201
- }
202
-
203
- function parseRefreshResult(value: unknown): Omit<CapabilityAuthRefreshResult, 'capability'> {
204
- if (!isRecord(value)) {
205
- throw new Error('Capability auth refresh did not return an object')
206
- }
207
- const saved = value.saved === true
208
- const secretKey = typeof value.secretKey === 'string' ? value.secretKey : ''
209
- const cookieCount = typeof value.cookieCount === 'number' ? value.cookieCount : 0
210
- const cookieNames = Array.isArray(value.cookieNames)
211
- ? value.cookieNames.filter((item): item is string => {
212
- return typeof item === 'string'
213
- })
214
- : []
215
- const urls = Array.isArray(value.urls)
216
- ? value.urls.filter((item): item is string => {
217
- return typeof item === 'string'
218
- })
219
- : []
220
- const expiresAt = typeof value.expiresAt === 'string' ? value.expiresAt : undefined
221
- const secretsPath = typeof value.path === 'string' ? value.path : ''
222
- if (!saved || !secretKey || !secretsPath) {
223
- throw new Error('Capability auth refresh returned an incomplete result')
224
- }
225
- return {
226
- saved,
227
- secretKey,
228
- cookieCount,
229
- cookieNames,
230
- urls,
231
- expiresAt,
232
- path: secretsPath,
233
- }
234
- }
235
-
236
- function requireBrowserRefreshableCookieCapability(options: { id: string; cwd?: string }): CapabilityRecord {
237
- const capability = requireCapability({ id: options.id, cwd: options.cwd })
238
- if (capability.manifest.auth.type !== 'cookie' || capability.manifest.auth.refresh !== 'from-browser') {
239
- throw new Error(`Capability ${options.id} does not declare browser-refreshable cookie auth`)
240
- }
241
- if (capability.manifest.auth.browserUrls.length === 0) {
242
- throw new Error(`Capability ${options.id} auth.browserUrls is required for cookie refresh`)
243
- }
244
- return capability
245
- }
246
-
247
- function isRecord(value: unknown): value is Record<string, unknown> {
248
- return typeof value === 'object' && value !== null && !Array.isArray(value)
249
- }
@@ -1,90 +0,0 @@
1
- import fs from 'node:fs'
2
- import path from 'node:path'
3
- import { execFile } from 'node:child_process'
4
- import { promisify } from 'node:util'
5
- import { fileURLToPath } from 'node:url'
6
- import { describe, expect, test } from 'vitest'
7
- import { createCapability, updateCapabilityManifest, updateCapabilityScript } from './capability-registry.js'
8
-
9
- const execFileAsync = promisify(execFile)
10
- const currentDir = path.dirname(fileURLToPath(import.meta.url))
11
- const tabwrightDir = path.resolve(currentDir, '..')
12
- const viteNodeBinary = path.join(
13
- tabwrightDir,
14
- 'node_modules',
15
- '.bin',
16
- process.platform === 'win32' ? 'vite-node.cmd' : 'vite-node',
17
- )
18
- const cliPath = path.join(currentDir, 'cli.ts')
19
-
20
- function createTempDir(prefix: string): string {
21
- const tempRoot = path.join(tabwrightDir, 'tmp')
22
- fs.mkdirSync(tempRoot, { recursive: true })
23
- return fs.mkdtempSync(path.join(tempRoot, prefix))
24
- }
25
-
26
- function runCli(options: { cwd: string; args: string[] }): Promise<{ stdout: string; stderr: string }> {
27
- return execFileAsync(viteNodeBinary, [cliPath, ...options.args], {
28
- cwd: options.cwd,
29
- env: process.env,
30
- })
31
- }
32
-
33
- describe('capability CLI confirmation', () => {
34
- test('force cannot execute a confirmation-required script without the exact id', async () => {
35
- const cwd = createTempDir('capability-cli-confirmation-')
36
- try {
37
- const capability = createCapability({
38
- id: 'confirmed-cli-write',
39
- location: 'project',
40
- cwd,
41
- runtime: 'node',
42
- })
43
- updateCapabilityScript({
44
- id: capability.manifest.id,
45
- cwd,
46
- source: 'artifacts.writeText({ filename: "executed.txt", text: "yes" }); return { ok: true };',
47
- })
48
- updateCapabilityManifest({
49
- id: capability.manifest.id,
50
- cwd,
51
- allowUnvalidatedTrust: true,
52
- patch: { status: 'trusted', sideEffect: 'write', requiresConfirmation: true },
53
- })
54
- const markerPath = path.join(capability.dir, 'artifacts', 'executed.txt')
55
-
56
- await expect(
57
- runCli({
58
- cwd,
59
- args: ['capability', 'run', capability.manifest.id, '--force', '--input-json', '{}', '--json'],
60
- }),
61
- ).rejects.toMatchObject({
62
- code: 1,
63
- stderr: expect.stringContaining('requires explicit user confirmation'),
64
- })
65
- expect(fs.existsSync(markerPath)).toBe(false)
66
-
67
- const runStartedAt = Date.now()
68
- const { stdout, stderr } = await runCli({
69
- cwd,
70
- args: [
71
- 'capability',
72
- 'run',
73
- capability.manifest.id,
74
- '--force',
75
- '--confirm',
76
- capability.manifest.id,
77
- '--input-json',
78
- '{}',
79
- '--json',
80
- ],
81
- })
82
- expect(JSON.parse(stdout)).toMatchObject({ capability: capability.manifest.id, output: { ok: true } })
83
- expect(stderr).toBe('')
84
- expect(fs.readFileSync(markerPath, 'utf-8')).toBe('yes')
85
- expect(Date.now() - runStartedAt).toBeLessThan(5000)
86
- } finally {
87
- fs.rmSync(cwd, { recursive: true, force: true })
88
- }
89
- }, 30000)
90
- })
@@ -1,89 +0,0 @@
1
- import fs from 'node:fs'
2
- import path from 'node:path'
3
- import { describe, expect, test } from 'vitest'
4
- import { createCapability } from './capability-registry.js'
5
- import { listCapabilityOptions } from './capability-options.js'
6
-
7
- function createTempDir(prefix: string): string {
8
- const tempRoot = path.join(process.cwd(), 'tmp')
9
- fs.mkdirSync(tempRoot, { recursive: true })
10
- return fs.mkdtempSync(path.join(tempRoot, prefix))
11
- }
12
-
13
- describe('capability options view', () => {
14
- test('lists capabilities with read-only agent skill status', () => {
15
- const cwd = createTempDir('capability-options-')
16
- try {
17
- const capability = createCapability({
18
- id: 'options-tool',
19
- title: 'Options Tool',
20
- location: 'project',
21
- cwd,
22
- })
23
- const skillPath = path.join(capability.dir, 'agent-skills', 'codex', 'SKILL.md')
24
- fs.mkdirSync(path.dirname(skillPath), { recursive: true })
25
- fs.writeFileSync(skillPath, '---\nname: options-tool\n---\n')
26
-
27
- const response = listCapabilityOptions({ cwd })
28
- expect(response.cwd).toBe(cwd)
29
- expect(response.capabilities).toEqual(
30
- expect.arrayContaining([
31
- expect.objectContaining({
32
- id: 'options-tool',
33
- title: 'Options Tool',
34
- agentSkill: expect.objectContaining({
35
- draftExists: true,
36
- initCommand: 'tabwright capability skill init options-tool',
37
- installCommand: 'tabwright capability skill install options-tool',
38
- }),
39
- }),
40
- ]),
41
- )
42
- } finally {
43
- fs.rmSync(cwd, { recursive: true, force: true })
44
- }
45
- })
46
-
47
- test('keeps the capability list available when run logs or entry scripts are damaged', () => {
48
- const cwd = createTempDir('capability-options-damaged-')
49
- try {
50
- const damagedRuns = createCapability({
51
- id: 'damaged-runs',
52
- title: 'Damaged Runs',
53
- location: 'project',
54
- cwd,
55
- })
56
- fs.writeFileSync(path.join(damagedRuns.dir, 'runs.jsonl'), '{"id":\n')
57
-
58
- const missingScript = createCapability({
59
- id: 'missing-script',
60
- title: 'Missing Script',
61
- location: 'project',
62
- cwd,
63
- })
64
- fs.rmSync(missingScript.scriptPath)
65
-
66
- const response = listCapabilityOptions({ cwd })
67
- const damagedRunsItem = response.capabilities.find((capability) => capability.id === 'damaged-runs')
68
- const missingScriptItem = response.capabilities.find((capability) => capability.id === 'missing-script')
69
-
70
- expect(damagedRunsItem).toEqual(expect.objectContaining({ recentRuns: [] }))
71
- expect(missingScriptItem).toEqual(
72
- expect.objectContaining({
73
- lifecycle: expect.objectContaining({
74
- stage: 'drifted',
75
- contractHealth: expect.objectContaining({
76
- state: 'drifted',
77
- reasons: expect.arrayContaining([expect.stringContaining('Cannot validate the capability entry script')]),
78
- }),
79
- }),
80
- autonomousInvocation: expect.objectContaining({
81
- allowed: false,
82
- }),
83
- }),
84
- )
85
- } finally {
86
- fs.rmSync(cwd, { recursive: true, force: true })
87
- }
88
- })
89
- })
@@ -1,57 +0,0 @@
1
- import {
2
- listCapabilities,
3
- toCapabilityContract,
4
- type CapabilityRecord,
5
- } from './capability-registry.js'
6
- import {
7
- getCapabilityAgentSkillStatus,
8
- type CapabilityAgentSkillStatus,
9
- } from './capability-agent-skill.js'
10
- import { getCapabilityAuthState } from './capability-auth-state.js'
11
-
12
- export interface CapabilityOptionsItem extends Record<string, unknown> {
13
- agentSkill: CapabilityAgentSkillStatus
14
- }
15
-
16
- export interface CapabilityOptionsListResponse {
17
- cwd: string
18
- capabilities: CapabilityOptionsItem[]
19
- }
20
-
21
- export interface CapabilityOptionsDetailResponse {
22
- cwd: string
23
- capability: CapabilityOptionsItem
24
- }
25
-
26
- export function listCapabilityOptions(options: { cwd: string }): CapabilityOptionsListResponse {
27
- return {
28
- cwd: options.cwd,
29
- capabilities: listCapabilities({ cwd: options.cwd }).map((capability) => {
30
- return toCapabilityOptionsItem(capability)
31
- }),
32
- }
33
- }
34
-
35
- export function getCapabilityOptionsDetail(options: {
36
- cwd: string
37
- id: string
38
- }): CapabilityOptionsDetailResponse | null {
39
- const capability = listCapabilities({ cwd: options.cwd }).find((candidate) => {
40
- return candidate.manifest.id === options.id
41
- })
42
- if (!capability) {
43
- return null
44
- }
45
- return {
46
- cwd: options.cwd,
47
- capability: toCapabilityOptionsItem(capability),
48
- }
49
- }
50
-
51
- function toCapabilityOptionsItem(capability: CapabilityRecord): CapabilityOptionsItem {
52
- return {
53
- ...toCapabilityContract(capability),
54
- authState: getCapabilityAuthState({ capability }),
55
- agentSkill: getCapabilityAgentSkillStatus({ capability }),
56
- }
57
- }
@@ -1,204 +0,0 @@
1
- import fs from 'node:fs'
2
- import path from 'node:path'
3
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
4
- import { installCapabilityPackage, packCapability } from './capability-package.js'
5
- import { createCapability, updateCapabilityManifest, updateCapabilityScript, writeCapabilitySecrets } from './capability-registry.js'
6
-
7
- describe('capability package sharing', () => {
8
- let testRoot: string
9
- let sourceCwd: string
10
- let recipientCwd: string
11
-
12
- beforeEach(() => {
13
- const tmpRoot = path.join(process.cwd(), 'tmp')
14
- fs.mkdirSync(tmpRoot, { recursive: true })
15
- testRoot = fs.mkdtempSync(path.join(tmpRoot, 'capability-package-'))
16
- sourceCwd = path.join(testRoot, 'source')
17
- recipientCwd = path.join(testRoot, 'recipient')
18
- fs.mkdirSync(sourceCwd, { recursive: true })
19
- fs.mkdirSync(recipientCwd, { recursive: true })
20
- })
21
-
22
- afterEach(() => {
23
- vi.unstubAllGlobals()
24
- fs.rmSync(testRoot, { recursive: true, force: true })
25
- })
26
-
27
- it('packs only shareable files and installs the recipient copy as draft', async () => {
28
- const source = createCapability({
29
- id: 'shared-query',
30
- title: 'Shared query',
31
- description: 'Queries shared data.',
32
- location: 'project',
33
- cwd: sourceCwd,
34
- runtime: 'node',
35
- })
36
- updateCapabilityScript({
37
- id: source.manifest.id,
38
- cwd: sourceCwd,
39
- source: 'return { ok: true }\n',
40
- })
41
- updateCapabilityManifest({
42
- id: source.manifest.id,
43
- cwd: sourceCwd,
44
- allowUnvalidatedTrust: true,
45
- patch: {
46
- status: 'trusted',
47
- auth: {
48
- type: 'cookie',
49
- refresh: 'from-browser',
50
- browserUrls: ['https://example.com'],
51
- requiredCookieNames: ['session'],
52
- failureSignals: ['unauthorized'],
53
- },
54
- },
55
- })
56
- const capabilityDir = source.dir
57
- writeCapabilitySecrets({ capability: source, secrets: { cookieHeader: 'secret-value' } })
58
- fs.writeFileSync(path.join(capabilityDir, 'runs.jsonl'), '{"private":"run"}\n')
59
- fs.mkdirSync(path.join(capabilityDir, 'artifacts'), { recursive: true })
60
- fs.writeFileSync(path.join(capabilityDir, 'artifacts', 'private.json'), '{}\n')
61
- fs.mkdirSync(path.join(capabilityDir, 'agent-skills', 'codex', 'agents'), { recursive: true })
62
- fs.writeFileSync(
63
- path.join(capabilityDir, 'agent-skills', 'codex', 'SKILL.md'),
64
- '---\nname: shared-query\ndescription: Use shared query.\n---\n',
65
- )
66
- fs.writeFileSync(path.join(capabilityDir, 'agent-skills', 'codex', 'agents', 'openai.yaml'), 'name: Shared query\n')
67
-
68
- const archivePath = path.join(testRoot, 'shared-query.tgz')
69
- const packed = await packCapability({ id: source.manifest.id, cwd: sourceCwd, output: archivePath })
70
- const installed = await installCapabilityPackage({
71
- source: packed.path,
72
- cwd: recipientCwd,
73
- location: 'project',
74
- })
75
-
76
- expect(packed.files).toEqual([
77
- 'README.md',
78
- 'agent-skills/codex/SKILL.md',
79
- 'agent-skills/codex/agents/openai.yaml',
80
- 'capability.json',
81
- 'script.js',
82
- ])
83
- expect(installed.capability.manifest.status).toBe('draft')
84
- expect(fs.readFileSync(installed.capability.scriptPath, 'utf-8')).toBe('return { ok: true }\n')
85
- expect(installed.agentSkillAvailable).toBe(true)
86
- expect(fs.existsSync(path.join(installed.capability.dir, 'secrets.json'))).toBe(false)
87
- expect(fs.existsSync(path.join(installed.capability.dir, 'runs.jsonl'))).toBe(false)
88
- expect(fs.existsSync(path.join(installed.capability.dir, 'artifacts'))).toBe(false)
89
- expect(installed.integrity).toBe(packed.integrity)
90
- })
91
-
92
- it('installs directly from a capability directory without copying local state', async () => {
93
- const source = createCapability({
94
- id: 'directory-query',
95
- location: 'project',
96
- cwd: sourceCwd,
97
- runtime: 'node',
98
- })
99
- updateCapabilityScript({ id: source.manifest.id, cwd: sourceCwd, source: 'return input\n' })
100
- writeCapabilitySecrets({ capability: source, secrets: { token: 'do-not-copy' } })
101
-
102
- const installed = await installCapabilityPackage({
103
- source: source.dir,
104
- cwd: recipientCwd,
105
- location: 'project',
106
- })
107
-
108
- expect(installed.capability.manifest.status).toBe('draft')
109
- expect(fs.existsSync(path.join(installed.capability.dir, 'secrets.json'))).toBe(false)
110
- expect(installed.files).toEqual(['README.md', 'capability.json', 'script.js'])
111
- })
112
-
113
- it('requires force before replacing package files and clears recipient authentication', async () => {
114
- const source = createCapability({
115
- id: 'replace-query',
116
- location: 'project',
117
- cwd: sourceCwd,
118
- runtime: 'node',
119
- })
120
- updateCapabilityScript({ id: source.manifest.id, cwd: sourceCwd, source: 'return { version: 2 }\n' })
121
- const archive = await packCapability({
122
- id: source.manifest.id,
123
- cwd: sourceCwd,
124
- output: path.join(testRoot, 'replace-query.tgz'),
125
- })
126
- const existing = createCapability({
127
- id: source.manifest.id,
128
- location: 'project',
129
- cwd: recipientCwd,
130
- runtime: 'node',
131
- })
132
- writeCapabilitySecrets({ capability: existing, secrets: { token: 'recipient-only' } })
133
- fs.writeFileSync(path.join(existing.dir, 'auth-state.json'), '{"schemaVersion":1}\n')
134
-
135
- await expect(
136
- installCapabilityPackage({ source: archive.path, cwd: recipientCwd, location: 'project' }),
137
- ).rejects.toThrow('Use --force')
138
-
139
- const installed = await installCapabilityPackage({
140
- source: archive.path,
141
- cwd: recipientCwd,
142
- location: 'project',
143
- overwrite: true,
144
- })
145
- expect(fs.readFileSync(installed.capability.scriptPath, 'utf-8')).toBe('return { version: 2 }\n')
146
- expect(fs.existsSync(path.join(installed.capability.dir, 'secrets.json'))).toBe(false)
147
- expect(fs.existsSync(path.join(installed.capability.dir, 'auth-state.json'))).toBe(false)
148
- })
149
-
150
- it('installs a package downloaded from an HTTPS URL', async () => {
151
- const source = createCapability({
152
- id: 'remote-query',
153
- location: 'project',
154
- cwd: sourceCwd,
155
- runtime: 'node',
156
- })
157
- const packed = await packCapability({
158
- id: source.manifest.id,
159
- cwd: sourceCwd,
160
- output: path.join(testRoot, 'remote-query.tgz'),
161
- })
162
- const archive = fs.readFileSync(packed.path)
163
- vi.stubGlobal(
164
- 'fetch',
165
- vi.fn(async () => {
166
- return new Response(archive, {
167
- status: 200,
168
- headers: { 'content-length': String(archive.length) },
169
- })
170
- }),
171
- )
172
-
173
- const installed = await installCapabilityPackage({
174
- source: 'https://example.com/remote-query.tgz',
175
- cwd: recipientCwd,
176
- location: 'project',
177
- })
178
-
179
- expect(installed.source).toBe('https://example.com/remote-query.tgz')
180
- expect(installed.capability.manifest.id).toBe('remote-query')
181
- expect(installed.capability.manifest.status).toBe('draft')
182
- })
183
-
184
- it('requires force before overwriting an existing package archive', async () => {
185
- const source = createCapability({
186
- id: 'archive-overwrite',
187
- location: 'project',
188
- cwd: sourceCwd,
189
- runtime: 'node',
190
- })
191
- const output = path.join(testRoot, 'archive-overwrite.tgz')
192
- await packCapability({ id: source.manifest.id, cwd: sourceCwd, output })
193
-
194
- await expect(packCapability({ id: source.manifest.id, cwd: sourceCwd, output })).rejects.toThrow('Use --force')
195
-
196
- const overwritten = await packCapability({
197
- id: source.manifest.id,
198
- cwd: sourceCwd,
199
- output,
200
- overwrite: true,
201
- })
202
- expect(fs.existsSync(overwritten.path)).toBe(true)
203
- })
204
- })