@thanhvn14/csvibe 0.1.4 → 0.1.5

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 (392) hide show
  1. package/.github/agents/schemas/base-output.schema.json +88 -0
  2. package/.github/agents/schemas/brainstorm-output.schema.json +88 -0
  3. package/.github/agents/schemas/scout-output.schema.json +60 -0
  4. package/.github/agents/scripts/fetch-copilot-tools.js +245 -0
  5. package/.github/agents/scripts/lib/parse-agent-file.js +275 -0
  6. package/.github/agents/scripts/package-lock.json +78 -0
  7. package/.github/agents/scripts/package.json +22 -0
  8. package/.github/agents/scripts/schemas/agent-frontmatter.schema.json +83 -0
  9. package/.github/agents/scripts/validate-agent-all.js +157 -0
  10. package/.github/agents/scripts/validate-agent-frontmatter.js +96 -0
  11. package/.github/agents/scripts/validate-agent-handoffs.js +169 -0
  12. package/.github/agents/scripts/validate-agent-output.js +157 -0
  13. package/.github/agents/scripts/validate-agent-tools.js +278 -0
  14. package/.github/skills/.env.example +100 -0
  15. package/.github/skills/.install-state.json +23 -0
  16. package/.github/skills/README.md +149 -0
  17. package/.github/skills/ai-multimodal/.env.example +204 -0
  18. package/.github/skills/ai-multimodal/scripts/.coverage +0 -0
  19. package/.github/skills/ai-multimodal/scripts/check_setup.py +305 -0
  20. package/.github/skills/ai-multimodal/scripts/document_converter.py +395 -0
  21. package/.github/skills/ai-multimodal/scripts/gemini_batch_process.py +1184 -0
  22. package/.github/skills/ai-multimodal/scripts/media_optimizer.py +506 -0
  23. package/.github/skills/ai-multimodal/scripts/requirements.txt +26 -0
  24. package/.github/skills/better-auth/scripts/.coverage +0 -0
  25. package/.github/skills/better-auth/scripts/better_auth_init.py +521 -0
  26. package/.github/skills/better-auth/scripts/requirements.txt +15 -0
  27. package/.github/skills/chrome-devtools/scripts/README.md +272 -0
  28. package/.github/skills/chrome-devtools/scripts/__tests__/selector.test.js +210 -0
  29. package/.github/skills/chrome-devtools/scripts/aria-snapshot.js +362 -0
  30. package/.github/skills/chrome-devtools/scripts/click.js +83 -0
  31. package/.github/skills/chrome-devtools/scripts/console.js +79 -0
  32. package/.github/skills/chrome-devtools/scripts/evaluate.js +53 -0
  33. package/.github/skills/chrome-devtools/scripts/fill.js +76 -0
  34. package/.github/skills/chrome-devtools/scripts/inject-auth.js +229 -0
  35. package/.github/skills/chrome-devtools/scripts/install-deps.sh +181 -0
  36. package/.github/skills/chrome-devtools/scripts/install.sh +83 -0
  37. package/.github/skills/chrome-devtools/scripts/lib/browser.js +318 -0
  38. package/.github/skills/chrome-devtools/scripts/lib/selector.js +178 -0
  39. package/.github/skills/chrome-devtools/scripts/navigate.js +54 -0
  40. package/.github/skills/chrome-devtools/scripts/network.js +106 -0
  41. package/.github/skills/chrome-devtools/scripts/package-lock.json +1589 -0
  42. package/.github/skills/chrome-devtools/scripts/package.json +16 -0
  43. package/.github/skills/chrome-devtools/scripts/performance.js +149 -0
  44. package/.github/skills/chrome-devtools/scripts/screenshot.js +198 -0
  45. package/.github/skills/chrome-devtools/scripts/select-ref.js +131 -0
  46. package/.github/skills/chrome-devtools/scripts/snapshot.js +135 -0
  47. package/.github/skills/common/README.md +120 -0
  48. package/.github/skills/common/api_key_helper.py +411 -0
  49. package/.github/skills/common/api_key_rotator.py +248 -0
  50. package/.github/skills/databases/scripts/.coverage +0 -0
  51. package/.github/skills/databases/scripts/db_backup.py +502 -0
  52. package/.github/skills/databases/scripts/db_migrate.py +425 -0
  53. package/.github/skills/databases/scripts/db_performance_check.py +456 -0
  54. package/.github/skills/databases/scripts/requirements.txt +20 -0
  55. package/.github/skills/debugging/scripts/find-polluter.sh +63 -0
  56. package/.github/skills/devops/.env.example +76 -0
  57. package/.github/skills/devops/scripts/cloudflare_deploy.py +269 -0
  58. package/.github/skills/devops/scripts/docker_optimize.py +331 -0
  59. package/.github/skills/devops/scripts/requirements.txt +20 -0
  60. package/.github/skills/docs-seeker/.env.example +15 -0
  61. package/.github/skills/docs-seeker/package.json +25 -0
  62. package/.github/skills/docs-seeker/scripts/analyze-llms-txt.js +211 -0
  63. package/.github/skills/docs-seeker/scripts/detect-topic.js +172 -0
  64. package/.github/skills/docs-seeker/scripts/fetch-docs.js +213 -0
  65. package/.github/skills/docs-seeker/scripts/utils/env-loader.js +94 -0
  66. package/.github/skills/document-skills/docx/LICENSE.txt +30 -0
  67. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  68. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  69. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  70. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  71. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  72. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  73. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  74. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  75. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  76. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  77. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  78. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  79. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  80. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  81. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  82. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  83. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  84. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  85. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  86. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  87. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  88. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  89. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  90. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  91. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  92. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  93. package/.github/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  94. package/.github/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  95. package/.github/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  96. package/.github/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  97. package/.github/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  98. package/.github/skills/document-skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
  99. package/.github/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  100. package/.github/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  101. package/.github/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  102. package/.github/skills/document-skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  103. package/.github/skills/document-skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  104. package/.github/skills/document-skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  105. package/.github/skills/document-skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  106. package/.github/skills/document-skills/docx/ooxml/scripts/pack.py +159 -0
  107. package/.github/skills/document-skills/docx/ooxml/scripts/unpack.py +29 -0
  108. package/.github/skills/document-skills/docx/ooxml/scripts/validate.py +69 -0
  109. package/.github/skills/document-skills/docx/ooxml/scripts/validation/__init__.py +15 -0
  110. package/.github/skills/document-skills/docx/ooxml/scripts/validation/base.py +951 -0
  111. package/.github/skills/document-skills/docx/ooxml/scripts/validation/docx.py +274 -0
  112. package/.github/skills/document-skills/docx/ooxml/scripts/validation/pptx.py +315 -0
  113. package/.github/skills/document-skills/docx/ooxml/scripts/validation/redlining.py +279 -0
  114. package/.github/skills/document-skills/docx/scripts/__init__.py +1 -0
  115. package/.github/skills/document-skills/docx/scripts/document.py +1276 -0
  116. package/.github/skills/document-skills/docx/scripts/templates/comments.xml +3 -0
  117. package/.github/skills/document-skills/docx/scripts/templates/commentsExtended.xml +3 -0
  118. package/.github/skills/document-skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  119. package/.github/skills/document-skills/docx/scripts/templates/commentsIds.xml +3 -0
  120. package/.github/skills/document-skills/docx/scripts/templates/people.xml +3 -0
  121. package/.github/skills/document-skills/docx/scripts/utilities.py +374 -0
  122. package/.github/skills/document-skills/pdf/LICENSE.txt +30 -0
  123. package/.github/skills/document-skills/pdf/scripts/check_bounding_boxes.py +70 -0
  124. package/.github/skills/document-skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
  125. package/.github/skills/document-skills/pdf/scripts/check_fillable_fields.py +12 -0
  126. package/.github/skills/document-skills/pdf/scripts/convert_pdf_to_images.py +35 -0
  127. package/.github/skills/document-skills/pdf/scripts/create_validation_image.py +41 -0
  128. package/.github/skills/document-skills/pdf/scripts/extract_form_field_info.py +152 -0
  129. package/.github/skills/document-skills/pdf/scripts/fill_fillable_fields.py +114 -0
  130. package/.github/skills/document-skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  131. package/.github/skills/document-skills/pptx/LICENSE.txt +30 -0
  132. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  133. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  134. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  135. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  136. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  137. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  138. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  139. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  140. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  141. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  142. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  143. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  144. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  145. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  146. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  147. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  148. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  149. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  150. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  151. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  152. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  153. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  154. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  155. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  156. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  157. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  158. package/.github/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  159. package/.github/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  160. package/.github/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  161. package/.github/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  162. package/.github/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  163. package/.github/skills/document-skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  164. package/.github/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  165. package/.github/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  166. package/.github/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  167. package/.github/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  168. package/.github/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  169. package/.github/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  170. package/.github/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  171. package/.github/skills/document-skills/pptx/ooxml/scripts/pack.py +159 -0
  172. package/.github/skills/document-skills/pptx/ooxml/scripts/unpack.py +29 -0
  173. package/.github/skills/document-skills/pptx/ooxml/scripts/validate.py +69 -0
  174. package/.github/skills/document-skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
  175. package/.github/skills/document-skills/pptx/ooxml/scripts/validation/base.py +951 -0
  176. package/.github/skills/document-skills/pptx/ooxml/scripts/validation/docx.py +274 -0
  177. package/.github/skills/document-skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
  178. package/.github/skills/document-skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
  179. package/.github/skills/document-skills/pptx/scripts/html2pptx.js +979 -0
  180. package/.github/skills/document-skills/pptx/scripts/inventory.py +1020 -0
  181. package/.github/skills/document-skills/pptx/scripts/rearrange.py +231 -0
  182. package/.github/skills/document-skills/pptx/scripts/replace.py +385 -0
  183. package/.github/skills/document-skills/pptx/scripts/thumbnail.py +450 -0
  184. package/.github/skills/document-skills/xlsx/LICENSE.txt +30 -0
  185. package/.github/skills/document-skills/xlsx/recalc.py +190 -0
  186. package/.github/skills/install.ps1 +1220 -0
  187. package/.github/skills/install.sh +1032 -0
  188. package/.github/skills/markdown-novel-viewer/assets/directory-browser.css +215 -0
  189. package/.github/skills/markdown-novel-viewer/assets/favicon.png +0 -0
  190. package/.github/skills/markdown-novel-viewer/assets/novel-theme.css +818 -0
  191. package/.github/skills/markdown-novel-viewer/assets/reader.js +262 -0
  192. package/.github/skills/markdown-novel-viewer/assets/template.html +80 -0
  193. package/.github/skills/markdown-novel-viewer/package-lock.json +146 -0
  194. package/.github/skills/markdown-novel-viewer/package.json +15 -0
  195. package/.github/skills/markdown-novel-viewer/scripts/lib/http-server.cjs +434 -0
  196. package/.github/skills/markdown-novel-viewer/scripts/lib/markdown-renderer.cjs +272 -0
  197. package/.github/skills/markdown-novel-viewer/scripts/lib/plan-navigator.cjs +509 -0
  198. package/.github/skills/markdown-novel-viewer/scripts/lib/port-finder.cjs +48 -0
  199. package/.github/skills/markdown-novel-viewer/scripts/lib/process-mgr.cjs +150 -0
  200. package/.github/skills/markdown-novel-viewer/scripts/server.cjs +411 -0
  201. package/.github/skills/mcp-builder/LICENSE.txt +202 -0
  202. package/.github/skills/mcp-builder/scripts/connections.py +151 -0
  203. package/.github/skills/mcp-builder/scripts/evaluation.py +373 -0
  204. package/.github/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  205. package/.github/skills/mcp-builder/scripts/requirements.txt +2 -0
  206. package/.github/skills/mcp-management/README.md +219 -0
  207. package/.github/skills/mcp-management/assets/tools.json +3146 -0
  208. package/.github/skills/mcp-management/package-lock.json +6 -0
  209. package/.github/skills/mcp-management/scripts/.env.example +10 -0
  210. package/.github/skills/mcp-management/scripts/cli.ts +195 -0
  211. package/.github/skills/mcp-management/scripts/dist/analyze-tools.js +70 -0
  212. package/.github/skills/mcp-management/scripts/dist/cli.js +160 -0
  213. package/.github/skills/mcp-management/scripts/dist/mcp-client.js +183 -0
  214. package/.github/skills/mcp-management/scripts/mcp-client.ts +230 -0
  215. package/.github/skills/mcp-management/scripts/package.json +20 -0
  216. package/.github/skills/media-processing/scripts/README.md +111 -0
  217. package/.github/skills/media-processing/scripts/batch-remove-background.sh +124 -0
  218. package/.github/skills/media-processing/scripts/batch_resize.py +342 -0
  219. package/.github/skills/media-processing/scripts/media_convert.py +311 -0
  220. package/.github/skills/media-processing/scripts/remove-background.sh +96 -0
  221. package/.github/skills/media-processing/scripts/remove-bg-node.js +158 -0
  222. package/.github/skills/media-processing/scripts/requirements.txt +24 -0
  223. package/.github/skills/media-processing/scripts/video_optimize.py +414 -0
  224. package/.github/skills/payment-integration/README.md +185 -0
  225. package/.github/skills/payment-integration/scripts/.env.example +20 -0
  226. package/.github/skills/payment-integration/scripts/checkout-helper.js +244 -0
  227. package/.github/skills/payment-integration/scripts/package.json +17 -0
  228. package/.github/skills/payment-integration/scripts/polar-webhook-verify.js +202 -0
  229. package/.github/skills/payment-integration/scripts/sepay-webhook-verify.js +193 -0
  230. package/.github/skills/payment-integration/scripts/test-scripts.js +237 -0
  231. package/.github/skills/plans-kanban/assets/dashboard-template.html +119 -0
  232. package/.github/skills/plans-kanban/assets/dashboard.css +1594 -0
  233. package/.github/skills/plans-kanban/assets/dashboard.js +596 -0
  234. package/.github/skills/plans-kanban/assets/favicon.png +0 -0
  235. package/.github/skills/plans-kanban/package-lock.json +123 -0
  236. package/.github/skills/plans-kanban/package.json +13 -0
  237. package/.github/skills/plans-kanban/scripts/lib/dashboard-renderer.cjs +884 -0
  238. package/.github/skills/plans-kanban/scripts/lib/http-server.cjs +310 -0
  239. package/.github/skills/plans-kanban/scripts/lib/plan-metadata-extractor.cjs +489 -0
  240. package/.github/skills/plans-kanban/scripts/lib/plan-parser.cjs +175 -0
  241. package/.github/skills/plans-kanban/scripts/lib/plan-scanner.cjs +272 -0
  242. package/.github/skills/plans-kanban/scripts/lib/port-finder.cjs +48 -0
  243. package/.github/skills/plans-kanban/scripts/lib/process-mgr.cjs +128 -0
  244. package/.github/skills/plans-kanban/scripts/server.cjs +260 -0
  245. package/.github/skills/repomix/scripts/.coverage +0 -0
  246. package/.github/skills/repomix/scripts/README.md +179 -0
  247. package/.github/skills/repomix/scripts/repomix_batch.py +455 -0
  248. package/.github/skills/repomix/scripts/repos.example.json +15 -0
  249. package/.github/skills/repomix/scripts/requirements.txt +15 -0
  250. package/.github/skills/scout-validation/scripts/lib/broad-pattern-detector.cjs +124 -0
  251. package/.github/skills/scout-validation/scripts/lib/path-checker.cjs +66 -0
  252. package/.github/skills/scout-validation/scripts/lib/schema-validator.cjs +45 -0
  253. package/.github/skills/scout-validation/scripts/package.json +11 -0
  254. package/.github/skills/scout-validation/scripts/validate-scout-output.cjs +219 -0
  255. package/.github/skills/scout-validation/test/broad-pattern-output.json +18 -0
  256. package/.github/skills/scout-validation/test/invalid-path-output.json +18 -0
  257. package/.github/skills/scout-validation/test/valid-scout-output.json +26 -0
  258. package/.github/skills/sequential-thinking/.env.example +8 -0
  259. package/.github/skills/sequential-thinking/README.md +183 -0
  260. package/.github/skills/sequential-thinking/package.json +31 -0
  261. package/.github/skills/sequential-thinking/scripts/format-thought.js +159 -0
  262. package/.github/skills/sequential-thinking/scripts/process-thought.js +236 -0
  263. package/.github/skills/shopify/README.md +66 -0
  264. package/.github/skills/shopify/scripts/.coverage +0 -0
  265. package/.github/skills/shopify/scripts/requirements.txt +19 -0
  266. package/.github/skills/shopify/scripts/shopify_init.py +423 -0
  267. package/.github/skills/skill-creator/LICENSE.txt +202 -0
  268. package/.github/skills/skill-creator/scripts/init_skill.py +303 -0
  269. package/.github/skills/skill-creator/scripts/package_skill.py +110 -0
  270. package/.github/skills/skill-creator/scripts/quick_validate.py +65 -0
  271. package/.github/skills/ui-styling/LICENSE.txt +202 -0
  272. package/.github/skills/ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  273. package/.github/skills/ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  274. package/.github/skills/ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  275. package/.github/skills/ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
  276. package/.github/skills/ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  277. package/.github/skills/ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
  278. package/.github/skills/ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
  279. package/.github/skills/ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  280. package/.github/skills/ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  281. package/.github/skills/ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  282. package/.github/skills/ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  283. package/.github/skills/ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  284. package/.github/skills/ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  285. package/.github/skills/ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  286. package/.github/skills/ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
  287. package/.github/skills/ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
  288. package/.github/skills/ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
  289. package/.github/skills/ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
  290. package/.github/skills/ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
  291. package/.github/skills/ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
  292. package/.github/skills/ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
  293. package/.github/skills/ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
  294. package/.github/skills/ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
  295. package/.github/skills/ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  296. package/.github/skills/ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  297. package/.github/skills/ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  298. package/.github/skills/ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  299. package/.github/skills/ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  300. package/.github/skills/ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  301. package/.github/skills/ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  302. package/.github/skills/ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  303. package/.github/skills/ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  304. package/.github/skills/ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  305. package/.github/skills/ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  306. package/.github/skills/ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  307. package/.github/skills/ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  308. package/.github/skills/ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  309. package/.github/skills/ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
  310. package/.github/skills/ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
  311. package/.github/skills/ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  312. package/.github/skills/ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  313. package/.github/skills/ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  314. package/.github/skills/ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
  315. package/.github/skills/ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
  316. package/.github/skills/ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
  317. package/.github/skills/ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  318. package/.github/skills/ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  319. package/.github/skills/ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
  320. package/.github/skills/ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  321. package/.github/skills/ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
  322. package/.github/skills/ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
  323. package/.github/skills/ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
  324. package/.github/skills/ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
  325. package/.github/skills/ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
  326. package/.github/skills/ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
  327. package/.github/skills/ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  328. package/.github/skills/ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  329. package/.github/skills/ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
  330. package/.github/skills/ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
  331. package/.github/skills/ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
  332. package/.github/skills/ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  333. package/.github/skills/ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
  334. package/.github/skills/ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
  335. package/.github/skills/ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  336. package/.github/skills/ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  337. package/.github/skills/ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
  338. package/.github/skills/ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  339. package/.github/skills/ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
  340. package/.github/skills/ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  341. package/.github/skills/ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  342. package/.github/skills/ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
  343. package/.github/skills/ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
  344. package/.github/skills/ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
  345. package/.github/skills/ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
  346. package/.github/skills/ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
  347. package/.github/skills/ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  348. package/.github/skills/ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
  349. package/.github/skills/ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
  350. package/.github/skills/ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
  351. package/.github/skills/ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
  352. package/.github/skills/ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  353. package/.github/skills/ui-styling/scripts/.coverage +0 -0
  354. package/.github/skills/ui-styling/scripts/requirements.txt +17 -0
  355. package/.github/skills/ui-styling/scripts/shadcn_add.py +292 -0
  356. package/.github/skills/ui-styling/scripts/tailwind_config_gen.py +456 -0
  357. package/.github/skills/ui-ux-pro-max/data/charts.csv +26 -0
  358. package/.github/skills/ui-ux-pro-max/data/colors.csv +97 -0
  359. package/.github/skills/ui-ux-pro-max/data/landing.csv +31 -0
  360. package/.github/skills/ui-ux-pro-max/data/products.csv +97 -0
  361. package/.github/skills/ui-ux-pro-max/data/prompts.csv +24 -0
  362. package/.github/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  363. package/.github/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +51 -0
  364. package/.github/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  365. package/.github/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  366. package/.github/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  367. package/.github/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  368. package/.github/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  369. package/.github/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  370. package/.github/skills/ui-ux-pro-max/data/styles.csv +59 -0
  371. package/.github/skills/ui-ux-pro-max/data/typography.csv +58 -0
  372. package/.github/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  373. package/.github/skills/ui-ux-pro-max/scripts/core.py +236 -0
  374. package/.github/skills/ui-ux-pro-max/scripts/search.py +76 -0
  375. package/.github/skills/web-frameworks/scripts/.coverage +0 -0
  376. package/.github/skills/web-frameworks/scripts/__init__.py +0 -0
  377. package/.github/skills/web-frameworks/scripts/nextjs_init.py +547 -0
  378. package/.github/skills/web-frameworks/scripts/requirements.txt +16 -0
  379. package/.github/skills/web-frameworks/scripts/turborepo_migrate.py +394 -0
  380. package/dist/config/constants.d.ts +2 -0
  381. package/dist/config/constants.d.ts.map +1 -1
  382. package/dist/config/constants.js +4 -1
  383. package/dist/config/constants.js.map +1 -1
  384. package/dist/domains/github/github-client.d.ts +5 -0
  385. package/dist/domains/github/github-client.d.ts.map +1 -1
  386. package/dist/domains/github/github-client.js +44 -0
  387. package/dist/domains/github/github-client.js.map +1 -1
  388. package/dist/utils/downloader.d.ts +3 -1
  389. package/dist/utils/downloader.d.ts.map +1 -1
  390. package/dist/utils/downloader.js +48 -11
  391. package/dist/utils/downloader.js.map +1 -1
  392. package/package.json +3 -1
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "chrome-devtools-scripts",
3
+ "version": "1.1.0",
4
+ "description": "Browser automation scripts for Chrome DevTools Agent Skill",
5
+ "type": "module",
6
+ "scripts": {},
7
+ "dependencies": {
8
+ "debug": "^4.4.0",
9
+ "puppeteer": "^24.15.0",
10
+ "sharp": "^0.33.5",
11
+ "yargs": "^17.7.2"
12
+ },
13
+ "engines": {
14
+ "node": ">=18.0.0"
15
+ }
16
+ }
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Measure performance metrics and record trace
4
+ * Usage: node performance.js --url https://example.com [--trace trace.json] [--metrics]
5
+ */
6
+ import { getBrowser, getPage, closeBrowser, disconnectBrowser, parseArgs, outputJSON, outputError } from './lib/browser.js';
7
+ import fs from 'fs/promises';
8
+
9
+ async function measurePerformance() {
10
+ const args = parseArgs(process.argv.slice(2));
11
+
12
+ if (!args.url) {
13
+ outputError(new Error('--url is required'));
14
+ return;
15
+ }
16
+
17
+ try {
18
+ const browser = await getBrowser({
19
+ headless: args.headless !== 'false'
20
+ });
21
+
22
+ const page = await getPage(browser);
23
+
24
+ // Start tracing if requested
25
+ if (args.trace) {
26
+ await page.tracing.start({
27
+ path: args.trace,
28
+ categories: [
29
+ 'devtools.timeline',
30
+ 'disabled-by-default-devtools.timeline',
31
+ 'disabled-by-default-devtools.timeline.frame'
32
+ ]
33
+ });
34
+ }
35
+
36
+ // Navigate
37
+ await page.goto(args.url, {
38
+ waitUntil: 'networkidle2'
39
+ });
40
+
41
+ // Stop tracing
42
+ if (args.trace) {
43
+ await page.tracing.stop();
44
+ }
45
+
46
+ // Get performance metrics
47
+ const metrics = await page.metrics();
48
+
49
+ // Get Core Web Vitals
50
+ const vitals = await page.evaluate(() => {
51
+ return new Promise((resolve) => {
52
+ const vitals = {
53
+ LCP: null,
54
+ FID: null,
55
+ CLS: 0,
56
+ FCP: null,
57
+ TTFB: null
58
+ };
59
+
60
+ // LCP
61
+ try {
62
+ new PerformanceObserver((list) => {
63
+ const entries = list.getEntries();
64
+ if (entries.length > 0) {
65
+ const lastEntry = entries[entries.length - 1];
66
+ vitals.LCP = lastEntry.renderTime || lastEntry.loadTime;
67
+ }
68
+ }).observe({ entryTypes: ['largest-contentful-paint'], buffered: true });
69
+ } catch (e) {}
70
+
71
+ // CLS
72
+ try {
73
+ new PerformanceObserver((list) => {
74
+ list.getEntries().forEach((entry) => {
75
+ if (!entry.hadRecentInput) {
76
+ vitals.CLS += entry.value;
77
+ }
78
+ });
79
+ }).observe({ entryTypes: ['layout-shift'], buffered: true });
80
+ } catch (e) {}
81
+
82
+ // FCP
83
+ try {
84
+ const paintEntries = performance.getEntriesByType('paint');
85
+ const fcpEntry = paintEntries.find(e => e.name === 'first-contentful-paint');
86
+ if (fcpEntry) {
87
+ vitals.FCP = fcpEntry.startTime;
88
+ }
89
+ } catch (e) {}
90
+
91
+ // TTFB
92
+ try {
93
+ const [navigationEntry] = performance.getEntriesByType('navigation');
94
+ if (navigationEntry) {
95
+ vitals.TTFB = navigationEntry.responseStart - navigationEntry.requestStart;
96
+ }
97
+ } catch (e) {}
98
+
99
+ // Wait a bit for metrics to stabilize
100
+ setTimeout(() => resolve(vitals), 1000);
101
+ });
102
+ });
103
+
104
+ // Get resource timing
105
+ const resources = await page.evaluate(() => {
106
+ return performance.getEntriesByType('resource').map(r => ({
107
+ name: r.name,
108
+ type: r.initiatorType,
109
+ duration: r.duration,
110
+ size: r.transferSize,
111
+ startTime: r.startTime
112
+ }));
113
+ });
114
+
115
+ const result = {
116
+ success: true,
117
+ url: page.url(),
118
+ metrics: {
119
+ ...metrics,
120
+ JSHeapUsedSizeMB: (metrics.JSHeapUsedSize / 1024 / 1024).toFixed(2),
121
+ JSHeapTotalSizeMB: (metrics.JSHeapTotalSize / 1024 / 1024).toFixed(2)
122
+ },
123
+ vitals: vitals,
124
+ resources: {
125
+ count: resources.length,
126
+ totalDuration: resources.reduce((sum, r) => sum + r.duration, 0),
127
+ items: args.resources === 'true' ? resources : undefined
128
+ }
129
+ };
130
+
131
+ if (args.trace) {
132
+ result.trace = args.trace;
133
+ }
134
+
135
+ outputJSON(result);
136
+
137
+ // Default: disconnect to keep browser running for session persistence
138
+ // Use --close true to fully close browser
139
+ if (args.close === 'true') {
140
+ await closeBrowser();
141
+ } else {
142
+ await disconnectBrowser();
143
+ }
144
+ } catch (error) {
145
+ outputError(error);
146
+ }
147
+ }
148
+
149
+ measurePerformance();
@@ -0,0 +1,198 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Take a screenshot
4
+ * Usage: node screenshot.js --output screenshot.png [--url https://example.com] [--full-page true] [--selector .element] [--max-size 5] [--no-compress]
5
+ * Supports both CSS and XPath selectors:
6
+ * - CSS: node screenshot.js --selector ".main-content" --output page.png
7
+ * - XPath: node screenshot.js --selector "//div[@class='main-content']" --output page.png
8
+ *
9
+ * Session behavior:
10
+ * By default, browser stays running for session persistence
11
+ * Use --close true to fully close browser
12
+ */
13
+ import { getBrowser, getPage, closeBrowser, disconnectBrowser, parseArgs, outputJSON, outputError } from './lib/browser.js';
14
+ import { parseSelector, getElement, enhanceError } from './lib/selector.js';
15
+ import fs from 'fs/promises';
16
+ import path from 'path';
17
+
18
+ /**
19
+ * Check if Sharp is available
20
+ */
21
+ let sharp = null;
22
+ try {
23
+ sharp = (await import('sharp')).default;
24
+ } catch {
25
+ // Sharp not installed, compression disabled
26
+ }
27
+
28
+ /**
29
+ * Compress image using Sharp if it exceeds max size
30
+ * Sharp is 4-5x faster than ImageMagick with lower memory usage
31
+ * Falls back to no compression if Sharp is not installed
32
+ * @param {string} filePath - Path to the image file
33
+ * @param {number} maxSizeMB - Maximum file size in MB (default: 5)
34
+ * @returns {Promise<{compressed: boolean, originalSize: number, finalSize: number}>}
35
+ */
36
+ async function compressImageIfNeeded(filePath, maxSizeMB = 5) {
37
+ const stats = await fs.stat(filePath);
38
+ const originalSize = stats.size;
39
+ const maxSizeBytes = maxSizeMB * 1024 * 1024;
40
+
41
+ if (originalSize <= maxSizeBytes) {
42
+ return { compressed: false, originalSize, finalSize: originalSize };
43
+ }
44
+
45
+ if (!sharp) {
46
+ console.error('Warning: Sharp not installed. Run npm install to enable automatic compression.');
47
+ return { compressed: false, originalSize, finalSize: originalSize };
48
+ }
49
+
50
+ try {
51
+ const ext = path.extname(filePath).toLowerCase();
52
+ const imageBuffer = await fs.readFile(filePath);
53
+ const metadata = await sharp(imageBuffer).metadata();
54
+
55
+ // First pass: moderate compression
56
+ let outputBuffer;
57
+ if (ext === '.png') {
58
+ // PNG: resize to 90% and compress
59
+ const newWidth = Math.round(metadata.width * 0.9);
60
+ outputBuffer = await sharp(imageBuffer)
61
+ .resize(newWidth)
62
+ .png({ quality: 85, compressionLevel: 9 })
63
+ .toBuffer();
64
+ } else if (ext === '.jpg' || ext === '.jpeg') {
65
+ // JPEG: quality 80 with progressive encoding
66
+ outputBuffer = await sharp(imageBuffer)
67
+ .jpeg({ quality: 80, progressive: true, mozjpeg: true })
68
+ .toBuffer();
69
+ } else if (ext === '.webp') {
70
+ // WebP: quality 80
71
+ outputBuffer = await sharp(imageBuffer)
72
+ .webp({ quality: 80 })
73
+ .toBuffer();
74
+ } else {
75
+ // Other formats: convert to JPEG
76
+ outputBuffer = await sharp(imageBuffer)
77
+ .jpeg({ quality: 80, progressive: true, mozjpeg: true })
78
+ .toBuffer();
79
+ }
80
+
81
+ // Second pass: aggressive compression if still too large
82
+ if (outputBuffer.length > maxSizeBytes) {
83
+ if (ext === '.png') {
84
+ const newWidth = Math.round(metadata.width * 0.75);
85
+ outputBuffer = await sharp(outputBuffer)
86
+ .resize(newWidth)
87
+ .png({ quality: 70, compressionLevel: 9 })
88
+ .toBuffer();
89
+ } else {
90
+ outputBuffer = await sharp(outputBuffer)
91
+ .jpeg({ quality: 60, progressive: true, mozjpeg: true })
92
+ .toBuffer();
93
+ }
94
+ }
95
+
96
+ // Write compressed image back to file
97
+ await fs.writeFile(filePath, outputBuffer);
98
+
99
+ return { compressed: true, originalSize, finalSize: outputBuffer.length };
100
+ } catch (error) {
101
+ console.error('Compression error:', error.message);
102
+ return { compressed: false, originalSize, finalSize: originalSize };
103
+ }
104
+ }
105
+
106
+ async function screenshot() {
107
+ const args = parseArgs(process.argv.slice(2));
108
+
109
+ if (!args.output) {
110
+ outputError(new Error('--output is required'));
111
+ return;
112
+ }
113
+
114
+ try {
115
+ const browser = await getBrowser({
116
+ headless: args.headless !== 'false'
117
+ });
118
+
119
+ const page = await getPage(browser);
120
+
121
+ // Navigate if URL provided
122
+ if (args.url) {
123
+ await page.goto(args.url, {
124
+ waitUntil: args['wait-until'] || 'networkidle2'
125
+ });
126
+ }
127
+
128
+ // Ensure output directory exists
129
+ const outputDir = path.dirname(path.resolve(args.output));
130
+ await fs.mkdir(outputDir, { recursive: true });
131
+
132
+ const screenshotOptions = {
133
+ path: args.output,
134
+ type: args.format || 'png',
135
+ fullPage: args['full-page'] === 'true'
136
+ };
137
+
138
+ if (args.quality) {
139
+ screenshotOptions.quality = parseInt(args.quality);
140
+ }
141
+
142
+ let buffer;
143
+ if (args.selector) {
144
+ // Parse and validate selector
145
+ const parsed = parseSelector(args.selector);
146
+
147
+ // Get element based on selector type
148
+ const element = await getElement(page, parsed);
149
+ if (!element) {
150
+ throw new Error(`Element not found: ${args.selector}`);
151
+ }
152
+ buffer = await element.screenshot(screenshotOptions);
153
+ } else {
154
+ buffer = await page.screenshot(screenshotOptions);
155
+ }
156
+
157
+ const result = {
158
+ success: true,
159
+ output: path.resolve(args.output),
160
+ size: buffer.length,
161
+ url: page.url()
162
+ };
163
+
164
+ // Compress image if needed (unless --no-compress flag is set)
165
+ if (args['no-compress'] !== 'true') {
166
+ const maxSize = args['max-size'] ? parseFloat(args['max-size']) : 5;
167
+ const compressionResult = await compressImageIfNeeded(args.output, maxSize);
168
+
169
+ if (compressionResult.compressed) {
170
+ result.compressed = true;
171
+ result.originalSize = compressionResult.originalSize;
172
+ result.size = compressionResult.finalSize;
173
+ result.compressionRatio = ((1 - compressionResult.finalSize / compressionResult.originalSize) * 100).toFixed(2) + '%';
174
+ }
175
+ }
176
+
177
+ outputJSON(result);
178
+
179
+ // Default: disconnect to keep browser running for session persistence
180
+ // Use --close true to fully close browser
181
+ if (args.close === 'true') {
182
+ await closeBrowser();
183
+ } else {
184
+ await disconnectBrowser();
185
+ }
186
+ } catch (error) {
187
+ // Enhance error message if selector-related
188
+ if (args.selector) {
189
+ const enhanced = enhanceError(error, args.selector);
190
+ outputError(enhanced);
191
+ } else {
192
+ outputError(error);
193
+ }
194
+ process.exit(1);
195
+ }
196
+ }
197
+
198
+ screenshot();
@@ -0,0 +1,131 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Select and interact with elements by ref from ARIA snapshot
4
+ * Usage: node select-ref.js --ref e5 --action click
5
+ * node select-ref.js --ref e10 --action fill --value "text"
6
+ * node select-ref.js --ref e3 --action screenshot --output element.png
7
+ *
8
+ * Actions:
9
+ * click - Click the element
10
+ * fill - Fill input with --value
11
+ * screenshot - Take screenshot of element
12
+ * text - Get text content
13
+ * focus - Focus the element
14
+ * hover - Hover over element
15
+ *
16
+ * Refs are obtained from aria-snapshot.js output (e.g., [ref=e5])
17
+ *
18
+ * Session behavior:
19
+ * By default, browser stays running for session persistence
20
+ * Use --close true to fully close browser
21
+ */
22
+ import { getBrowser, getPage, closeBrowser, disconnectBrowser, parseArgs, outputJSON, outputError } from './lib/browser.js';
23
+ import fs from 'fs/promises';
24
+ import path from 'path';
25
+
26
+ async function selectRef() {
27
+ const args = parseArgs(process.argv.slice(2));
28
+
29
+ if (!args.ref) {
30
+ outputError(new Error('--ref is required (e.g., --ref e5)'));
31
+ return;
32
+ }
33
+
34
+ if (!args.action) {
35
+ outputError(new Error('--action is required (click, fill, screenshot, text, focus, hover)'));
36
+ return;
37
+ }
38
+
39
+ try {
40
+ const browser = await getBrowser({
41
+ headless: args.headless !== 'false'
42
+ });
43
+
44
+ const page = await getPage(browser);
45
+
46
+ // Get element by ref from window.__chromeDevToolsRefs
47
+ const element = await page.evaluateHandle((ref) => {
48
+ const refs = window.__chromeDevToolsRefs;
49
+ if (!refs) {
50
+ throw new Error('No refs available. Run aria-snapshot.js first to generate refs.');
51
+ }
52
+ const el = refs.get(ref);
53
+ if (!el) {
54
+ throw new Error(`Ref "${ref}" not found. Available refs: ${Array.from(refs.keys()).join(', ')}`);
55
+ }
56
+ return el;
57
+ }, args.ref);
58
+
59
+ const elementHandle = element.asElement();
60
+ if (!elementHandle) {
61
+ throw new Error(`Could not get element handle for ref "${args.ref}"`);
62
+ }
63
+
64
+ let result = {
65
+ success: true,
66
+ ref: args.ref,
67
+ action: args.action
68
+ };
69
+
70
+ // Perform action
71
+ switch (args.action) {
72
+ case 'click':
73
+ await elementHandle.click();
74
+ result.message = 'Element clicked';
75
+ break;
76
+
77
+ case 'fill':
78
+ if (!args.value && args.value !== '') {
79
+ throw new Error('--value is required for fill action');
80
+ }
81
+ await elementHandle.click({ clickCount: 3 }); // Select all
82
+ await elementHandle.type(args.value);
83
+ result.message = 'Element filled';
84
+ result.value = args.value;
85
+ break;
86
+
87
+ case 'screenshot':
88
+ if (!args.output) {
89
+ throw new Error('--output is required for screenshot action');
90
+ }
91
+ const outputDir = path.dirname(args.output);
92
+ await fs.mkdir(outputDir, { recursive: true });
93
+ await elementHandle.screenshot({ path: args.output });
94
+ result.output = path.resolve(args.output);
95
+ result.message = 'Screenshot saved';
96
+ break;
97
+
98
+ case 'text':
99
+ const text = await page.evaluate(el => el.textContent?.trim(), elementHandle);
100
+ result.text = text;
101
+ break;
102
+
103
+ case 'focus':
104
+ await elementHandle.focus();
105
+ result.message = 'Element focused';
106
+ break;
107
+
108
+ case 'hover':
109
+ await elementHandle.hover();
110
+ result.message = 'Hovering over element';
111
+ break;
112
+
113
+ default:
114
+ throw new Error(`Unknown action: ${args.action}. Valid actions: click, fill, screenshot, text, focus, hover`);
115
+ }
116
+
117
+ outputJSON(result);
118
+
119
+ // Default: disconnect to keep browser running for session persistence
120
+ // Use --close true to fully close browser
121
+ if (args.close === 'true') {
122
+ await closeBrowser();
123
+ } else {
124
+ await disconnectBrowser();
125
+ }
126
+ } catch (error) {
127
+ outputError(error);
128
+ }
129
+ }
130
+
131
+ selectRef();
@@ -0,0 +1,135 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Get DOM snapshot with selectors
4
+ * Usage: node snapshot.js [--url https://example.com] [--output snapshot.json]
5
+ */
6
+ import { getBrowser, getPage, closeBrowser, disconnectBrowser, parseArgs, outputJSON, outputError } from './lib/browser.js';
7
+ import fs from 'fs/promises';
8
+
9
+ async function snapshot() {
10
+ const args = parseArgs(process.argv.slice(2));
11
+
12
+ try {
13
+ const browser = await getBrowser({
14
+ headless: args.headless !== 'false'
15
+ });
16
+
17
+ const page = await getPage(browser);
18
+
19
+ // Navigate if URL provided
20
+ if (args.url) {
21
+ await page.goto(args.url, {
22
+ waitUntil: args['wait-until'] || 'networkidle2'
23
+ });
24
+ }
25
+
26
+ // Get interactive elements with metadata
27
+ const elements = await page.evaluate(() => {
28
+ const interactiveSelectors = [
29
+ 'a[href]',
30
+ 'button',
31
+ 'input',
32
+ 'textarea',
33
+ 'select',
34
+ '[onclick]',
35
+ '[role="button"]',
36
+ '[role="link"]',
37
+ '[contenteditable]'
38
+ ];
39
+
40
+ const elements = [];
41
+ const selector = interactiveSelectors.join(', ');
42
+ const nodes = document.querySelectorAll(selector);
43
+
44
+ nodes.forEach((el, index) => {
45
+ const rect = el.getBoundingClientRect();
46
+
47
+ // Generate unique selector
48
+ let uniqueSelector = '';
49
+ if (el.id) {
50
+ uniqueSelector = `#${el.id}`;
51
+ } else if (el.className) {
52
+ const classes = Array.from(el.classList).join('.');
53
+ uniqueSelector = `${el.tagName.toLowerCase()}.${classes}`;
54
+ } else {
55
+ uniqueSelector = el.tagName.toLowerCase();
56
+ }
57
+
58
+ elements.push({
59
+ index: index,
60
+ tagName: el.tagName.toLowerCase(),
61
+ type: el.type || null,
62
+ id: el.id || null,
63
+ className: el.className || null,
64
+ name: el.name || null,
65
+ value: el.value || null,
66
+ text: el.textContent?.trim().substring(0, 100) || null,
67
+ href: el.href || null,
68
+ selector: uniqueSelector,
69
+ xpath: getXPath(el),
70
+ visible: rect.width > 0 && rect.height > 0,
71
+ position: {
72
+ x: rect.x,
73
+ y: rect.y,
74
+ width: rect.width,
75
+ height: rect.height
76
+ }
77
+ });
78
+ });
79
+
80
+ function getXPath(element) {
81
+ if (element.id) {
82
+ return `//*[@id="${element.id}"]`;
83
+ }
84
+ if (element === document.body) {
85
+ return '/html/body';
86
+ }
87
+ let ix = 0;
88
+ const siblings = element.parentNode?.childNodes || [];
89
+ for (let i = 0; i < siblings.length; i++) {
90
+ const sibling = siblings[i];
91
+ if (sibling === element) {
92
+ return getXPath(element.parentNode) + '/' + element.tagName.toLowerCase() + '[' + (ix + 1) + ']';
93
+ }
94
+ if (sibling.nodeType === 1 && sibling.tagName === element.tagName) {
95
+ ix++;
96
+ }
97
+ }
98
+ return '';
99
+ }
100
+
101
+ return elements;
102
+ });
103
+
104
+ const result = {
105
+ success: true,
106
+ url: page.url(),
107
+ title: await page.title(),
108
+ elementCount: elements.length,
109
+ elements: elements
110
+ };
111
+
112
+ if (args.output) {
113
+ await fs.writeFile(args.output, JSON.stringify(result, null, 2));
114
+ outputJSON({
115
+ success: true,
116
+ output: args.output,
117
+ elementCount: elements.length
118
+ });
119
+ } else {
120
+ outputJSON(result);
121
+ }
122
+
123
+ // Default: disconnect to keep browser running for session persistence
124
+ // Use --close true to fully close browser
125
+ if (args.close === 'true') {
126
+ await closeBrowser();
127
+ } else {
128
+ await disconnectBrowser();
129
+ }
130
+ } catch (error) {
131
+ outputError(error);
132
+ }
133
+ }
134
+
135
+ snapshot();