@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,362 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Get ARIA-based accessibility snapshot with stable element refs
4
+ * Usage: node aria-snapshot.js [--url https://example.com] [--output snapshot.yaml]
5
+ *
6
+ * Returns YAML-formatted accessibility tree with:
7
+ * - Semantic roles (button, link, textbox, heading, etc.)
8
+ * - Accessible names (what screen readers announce)
9
+ * - Element states (checked, disabled, expanded)
10
+ * - Stable refs [ref=eN] that persist for interaction
11
+ *
12
+ * Session behavior:
13
+ * By default, browser stays running for session persistence
14
+ * Use --close true to fully close browser
15
+ */
16
+ import { getBrowser, getPage, closeBrowser, disconnectBrowser, parseArgs, outputJSON, outputError } from './lib/browser.js';
17
+ import fs from 'fs/promises';
18
+ import path from 'path';
19
+ import { fileURLToPath } from 'url';
20
+
21
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
22
+
23
+ /**
24
+ * Get ARIA snapshot script to inject into page
25
+ * Builds YAML-formatted accessibility tree with element references
26
+ */
27
+ function getAriaSnapshotScript() {
28
+ return `
29
+ (function() {
30
+ // Store refs on window for later retrieval via selectRef
31
+ window.__chromeDevToolsRefs = window.__chromeDevToolsRefs || new Map();
32
+ let refCounter = window.__chromeDevToolsRefCounter || 1;
33
+
34
+ // ARIA roles we care about for interaction
35
+ const INTERACTIVE_ROLES = new Set([
36
+ 'button', 'link', 'textbox', 'checkbox', 'radio', 'combobox',
37
+ 'listbox', 'option', 'menuitem', 'menuitemcheckbox', 'menuitemradio',
38
+ 'tab', 'switch', 'slider', 'spinbutton', 'searchbox', 'tree', 'treeitem',
39
+ 'grid', 'gridcell', 'row', 'rowheader', 'columnheader'
40
+ ]);
41
+
42
+ // Landmark roles for structure
43
+ const LANDMARK_ROLES = new Set([
44
+ 'banner', 'navigation', 'main', 'complementary', 'contentinfo',
45
+ 'search', 'form', 'region', 'article', 'dialog', 'alertdialog'
46
+ ]);
47
+
48
+ // Implicit ARIA roles from HTML elements
49
+ const IMPLICIT_ROLES = {
50
+ 'A': (el) => el.href ? 'link' : null,
51
+ 'BUTTON': () => 'button',
52
+ 'INPUT': (el) => {
53
+ const type = el.type?.toLowerCase();
54
+ if (type === 'checkbox') return 'checkbox';
55
+ if (type === 'radio') return 'radio';
56
+ if (type === 'submit' || type === 'button' || type === 'reset') return 'button';
57
+ if (type === 'search') return 'searchbox';
58
+ if (type === 'range') return 'slider';
59
+ if (type === 'number') return 'spinbutton';
60
+ return 'textbox';
61
+ },
62
+ 'TEXTAREA': () => 'textbox',
63
+ 'SELECT': () => 'combobox',
64
+ 'OPTION': () => 'option',
65
+ 'IMG': () => 'img',
66
+ 'NAV': () => 'navigation',
67
+ 'MAIN': () => 'main',
68
+ 'HEADER': () => 'banner',
69
+ 'FOOTER': () => 'contentinfo',
70
+ 'ASIDE': () => 'complementary',
71
+ 'ARTICLE': () => 'article',
72
+ 'SECTION': (el) => el.getAttribute('aria-label') || el.getAttribute('aria-labelledby') ? 'region' : null,
73
+ 'FORM': () => 'form',
74
+ 'UL': () => 'list',
75
+ 'OL': () => 'list',
76
+ 'LI': () => 'listitem',
77
+ 'H1': () => 'heading',
78
+ 'H2': () => 'heading',
79
+ 'H3': () => 'heading',
80
+ 'H4': () => 'heading',
81
+ 'H5': () => 'heading',
82
+ 'H6': () => 'heading',
83
+ 'TABLE': () => 'table',
84
+ 'TR': () => 'row',
85
+ 'TH': () => 'columnheader',
86
+ 'TD': () => 'cell',
87
+ 'DIALOG': () => 'dialog'
88
+ };
89
+
90
+ function getRole(el) {
91
+ // Explicit role takes precedence
92
+ const explicitRole = el.getAttribute('role');
93
+ if (explicitRole) return explicitRole;
94
+
95
+ // Check implicit role
96
+ const implicitFn = IMPLICIT_ROLES[el.tagName];
97
+ if (implicitFn) return implicitFn(el);
98
+
99
+ return null;
100
+ }
101
+
102
+ function getAccessibleName(el) {
103
+ // aria-label takes precedence
104
+ const ariaLabel = el.getAttribute('aria-label');
105
+ if (ariaLabel) return ariaLabel.trim();
106
+
107
+ // aria-labelledby
108
+ const labelledBy = el.getAttribute('aria-labelledby');
109
+ if (labelledBy) {
110
+ const labels = labelledBy.split(' ')
111
+ .map(id => document.getElementById(id)?.textContent?.trim())
112
+ .filter(Boolean)
113
+ .join(' ');
114
+ if (labels) return labels;
115
+ }
116
+
117
+ // Input associated label
118
+ if (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' || el.tagName === 'SELECT') {
119
+ if (el.id) {
120
+ const label = document.querySelector('label[for="' + el.id + '"]');
121
+ if (label) return label.textContent?.trim();
122
+ }
123
+ // Check parent label
124
+ const parentLabel = el.closest('label');
125
+ if (parentLabel) {
126
+ const labelText = parentLabel.textContent?.replace(el.value || '', '')?.trim();
127
+ if (labelText) return labelText;
128
+ }
129
+ }
130
+
131
+ // Button/link content
132
+ if (el.tagName === 'BUTTON' || el.tagName === 'A') {
133
+ const text = el.textContent?.trim();
134
+ if (text) return text.substring(0, 100);
135
+ }
136
+
137
+ // Alt text for images
138
+ if (el.tagName === 'IMG') {
139
+ return el.alt || null;
140
+ }
141
+
142
+ // Title attribute fallback
143
+ if (el.title) return el.title.trim();
144
+
145
+ // Placeholder for inputs
146
+ if (el.placeholder) return null; // Return null, will add as /placeholder
147
+
148
+ return null;
149
+ }
150
+
151
+ function getStateFlags(el) {
152
+ const flags = [];
153
+
154
+ // Checked state
155
+ if (el.checked || el.getAttribute('aria-checked') === 'true') {
156
+ flags.push('checked');
157
+ }
158
+
159
+ // Disabled state
160
+ if (el.disabled || el.getAttribute('aria-disabled') === 'true') {
161
+ flags.push('disabled');
162
+ }
163
+
164
+ // Expanded state
165
+ if (el.getAttribute('aria-expanded') === 'true') {
166
+ flags.push('expanded');
167
+ }
168
+
169
+ // Selected state
170
+ if (el.selected || el.getAttribute('aria-selected') === 'true') {
171
+ flags.push('selected');
172
+ }
173
+
174
+ // Pressed state
175
+ if (el.getAttribute('aria-pressed') === 'true') {
176
+ flags.push('pressed');
177
+ }
178
+
179
+ // Required state
180
+ if (el.required || el.getAttribute('aria-required') === 'true') {
181
+ flags.push('required');
182
+ }
183
+
184
+ return flags;
185
+ }
186
+
187
+ function isVisible(el) {
188
+ const style = window.getComputedStyle(el);
189
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
190
+ const rect = el.getBoundingClientRect();
191
+ return rect.width > 0 && rect.height > 0;
192
+ }
193
+
194
+ function isInteractiveOrLandmark(role) {
195
+ return INTERACTIVE_ROLES.has(role) || LANDMARK_ROLES.has(role);
196
+ }
197
+
198
+ function shouldInclude(el) {
199
+ if (!isVisible(el)) return false;
200
+ const role = getRole(el);
201
+ if (!role) return false;
202
+ // Include interactive, landmarks, and structural elements
203
+ return isInteractiveOrLandmark(role) ||
204
+ role === 'heading' ||
205
+ role === 'img' ||
206
+ role === 'list' ||
207
+ role === 'listitem' ||
208
+ role === 'table' ||
209
+ role === 'row' ||
210
+ role === 'cell' ||
211
+ role === 'columnheader';
212
+ }
213
+
214
+ function assignRef(el, role) {
215
+ // Only assign refs to interactive elements
216
+ if (!INTERACTIVE_ROLES.has(role)) return null;
217
+
218
+ const ref = 'e' + refCounter++;
219
+ window.__chromeDevToolsRefs.set(ref, el);
220
+ return ref;
221
+ }
222
+
223
+ function buildYaml(el, indent = 0) {
224
+ const role = getRole(el);
225
+ if (!role) return '';
226
+
227
+ const prefix = ' '.repeat(indent) + '- ';
228
+ const lines = [];
229
+
230
+ // Build the line: role "name" [flags] [ref=eN]
231
+ let line = prefix + role;
232
+
233
+ const name = getAccessibleName(el);
234
+ if (name) {
235
+ line += ' "' + name.replace(/"/g, '\\\\"') + '"';
236
+ }
237
+
238
+ // Add heading level
239
+ if (role === 'heading') {
240
+ const level = el.tagName.match(/H(\\d)/)?.[1] || el.getAttribute('aria-level');
241
+ if (level) line += ' [level=' + level + ']';
242
+ }
243
+
244
+ // Add state flags
245
+ const flags = getStateFlags(el);
246
+ flags.forEach(flag => {
247
+ line += ' [' + flag + ']';
248
+ });
249
+
250
+ // Add ref for interactive elements
251
+ const ref = assignRef(el, role);
252
+ if (ref) {
253
+ line += ' [ref=' + ref + ']';
254
+ }
255
+
256
+ lines.push(line);
257
+
258
+ // Add metadata on subsequent lines
259
+ if (el.tagName === 'A' && el.href) {
260
+ lines.push(' '.repeat(indent + 1) + '/url: ' + el.href);
261
+ }
262
+ if (el.placeholder) {
263
+ lines.push(' '.repeat(indent + 1) + '/placeholder: "' + el.placeholder + '"');
264
+ }
265
+ if (el.tagName === 'INPUT' && el.value && el.type !== 'password') {
266
+ lines.push(' '.repeat(indent + 1) + '/value: "' + el.value.substring(0, 50) + '"');
267
+ }
268
+
269
+ // Process children
270
+ const children = Array.from(el.children);
271
+ children.forEach(child => {
272
+ const childYaml = buildYaml(child, indent + 1);
273
+ if (childYaml) lines.push(childYaml);
274
+ });
275
+
276
+ return lines.join('\\n');
277
+ }
278
+
279
+ function getSnapshot() {
280
+ const lines = [];
281
+
282
+ // Start from body
283
+ const children = Array.from(document.body.children);
284
+ children.forEach(child => {
285
+ const yaml = buildYaml(child, 0);
286
+ if (yaml) lines.push(yaml);
287
+ });
288
+
289
+ // Save ref counter for next snapshot
290
+ window.__chromeDevToolsRefCounter = refCounter;
291
+
292
+ return lines.join('\\n');
293
+ }
294
+
295
+ return getSnapshot();
296
+ })();
297
+ `;
298
+ }
299
+
300
+ async function ariaSnapshot() {
301
+ const args = parseArgs(process.argv.slice(2));
302
+
303
+ try {
304
+ const browser = await getBrowser({
305
+ headless: args.headless !== 'false'
306
+ });
307
+
308
+ const page = await getPage(browser);
309
+
310
+ // Navigate if URL provided
311
+ if (args.url) {
312
+ await page.goto(args.url, {
313
+ waitUntil: args['wait-until'] || 'networkidle2'
314
+ });
315
+ }
316
+
317
+ // Get ARIA snapshot
318
+ const snapshot = await page.evaluate(getAriaSnapshotScript());
319
+
320
+ // Build result
321
+ const result = {
322
+ success: true,
323
+ url: page.url(),
324
+ title: await page.title(),
325
+ format: 'yaml',
326
+ snapshot: snapshot
327
+ };
328
+
329
+ // Output to file or stdout
330
+ if (args.output) {
331
+ const outputPath = args.output;
332
+
333
+ // Ensure snapshots directory exists
334
+ const outputDir = path.dirname(outputPath);
335
+ await fs.mkdir(outputDir, { recursive: true });
336
+
337
+ // Write YAML snapshot
338
+ await fs.writeFile(outputPath, snapshot, 'utf8');
339
+
340
+ outputJSON({
341
+ success: true,
342
+ output: path.resolve(outputPath),
343
+ url: page.url()
344
+ });
345
+ } else {
346
+ // Output to stdout
347
+ outputJSON(result);
348
+ }
349
+
350
+ // Default: disconnect to keep browser running for session persistence
351
+ // Use --close true to fully close browser
352
+ if (args.close === 'true') {
353
+ await closeBrowser();
354
+ } else {
355
+ await disconnectBrowser();
356
+ }
357
+ } catch (error) {
358
+ outputError(error);
359
+ }
360
+ }
361
+
362
+ ariaSnapshot();
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Click an element
4
+ * Usage: node click.js --selector ".button" [--url https://example.com] [--wait-for ".result"]
5
+ * Supports both CSS and XPath selectors:
6
+ * - CSS: node click.js --selector "button.submit"
7
+ * - XPath: node click.js --selector "//button[contains(text(),'Submit')]"
8
+ */
9
+ import { getBrowser, getPage, closeBrowser, disconnectBrowser, parseArgs, outputJSON, outputError } from './lib/browser.js';
10
+ import { parseSelector, waitForElement, clickElement, enhanceError } from './lib/selector.js';
11
+
12
+ async function click() {
13
+ const args = parseArgs(process.argv.slice(2));
14
+
15
+ if (!args.selector) {
16
+ outputError(new Error('--selector is required'));
17
+ return;
18
+ }
19
+
20
+ try {
21
+ const browser = await getBrowser({
22
+ headless: args.headless !== 'false'
23
+ });
24
+
25
+ const page = await getPage(browser);
26
+
27
+ // Navigate if URL provided
28
+ if (args.url) {
29
+ await page.goto(args.url, {
30
+ waitUntil: args['wait-until'] || 'networkidle2'
31
+ });
32
+ }
33
+
34
+ // Parse and validate selector
35
+ const parsed = parseSelector(args.selector);
36
+
37
+ // Wait for element based on selector type
38
+ await waitForElement(page, parsed, {
39
+ visible: true,
40
+ timeout: parseInt(args.timeout || '5000')
41
+ });
42
+
43
+ // Set up navigation promise BEFORE clicking (in case click triggers immediate navigation)
44
+ const navigationPromise = page.waitForNavigation({
45
+ waitUntil: 'load',
46
+ timeout: 5000
47
+ }).catch(() => null); // Catch timeout - navigation may not occur
48
+
49
+ // Click element
50
+ await clickElement(page, parsed);
51
+
52
+ // Wait for optional selector after click
53
+ if (args['wait-for']) {
54
+ await page.waitForSelector(args['wait-for'], {
55
+ timeout: parseInt(args.timeout || '5000')
56
+ });
57
+ } else {
58
+ // Wait for navigation to complete (or timeout if no navigation)
59
+ await navigationPromise;
60
+ }
61
+
62
+ outputJSON({
63
+ success: true,
64
+ url: page.url(),
65
+ title: await page.title()
66
+ });
67
+
68
+ // Default: disconnect to keep browser running for session persistence
69
+ // Use --close true to fully close browser
70
+ if (args.close === 'true') {
71
+ await closeBrowser();
72
+ } else {
73
+ await disconnectBrowser();
74
+ }
75
+ } catch (error) {
76
+ // Enhance error message with troubleshooting tips
77
+ const enhanced = enhanceError(error, args.selector);
78
+ outputError(enhanced);
79
+ process.exit(1);
80
+ }
81
+ }
82
+
83
+ click();
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Monitor console messages
4
+ * Usage: node console.js --url https://example.com [--types error,warn] [--duration 5000]
5
+ */
6
+ import { getBrowser, getPage, closeBrowser, disconnectBrowser, parseArgs, outputJSON, outputError } from './lib/browser.js';
7
+
8
+ async function monitorConsole() {
9
+ const args = parseArgs(process.argv.slice(2));
10
+
11
+ if (!args.url) {
12
+ outputError(new Error('--url is required'));
13
+ return;
14
+ }
15
+
16
+ try {
17
+ const browser = await getBrowser({
18
+ headless: args.headless !== 'false'
19
+ });
20
+
21
+ const page = await getPage(browser);
22
+
23
+ const messages = [];
24
+ const filterTypes = args.types ? args.types.split(',') : null;
25
+
26
+ // Listen for console messages
27
+ page.on('console', (msg) => {
28
+ const type = msg.type();
29
+
30
+ if (!filterTypes || filterTypes.includes(type)) {
31
+ messages.push({
32
+ type: type,
33
+ text: msg.text(),
34
+ location: msg.location(),
35
+ timestamp: Date.now()
36
+ });
37
+ }
38
+ });
39
+
40
+ // Listen for page errors
41
+ page.on('pageerror', (error) => {
42
+ messages.push({
43
+ type: 'pageerror',
44
+ text: error.message,
45
+ stack: error.stack,
46
+ timestamp: Date.now()
47
+ });
48
+ });
49
+
50
+ // Navigate
51
+ await page.goto(args.url, {
52
+ waitUntil: args['wait-until'] || 'networkidle2'
53
+ });
54
+
55
+ // Wait for additional time if specified
56
+ if (args.duration) {
57
+ await new Promise(resolve => setTimeout(resolve, parseInt(args.duration)));
58
+ }
59
+
60
+ outputJSON({
61
+ success: true,
62
+ url: page.url(),
63
+ messageCount: messages.length,
64
+ messages: messages
65
+ });
66
+
67
+ // Default: disconnect to keep browser running for session persistence
68
+ // Use --close true to fully close browser
69
+ if (args.close === 'true') {
70
+ await closeBrowser();
71
+ } else {
72
+ await disconnectBrowser();
73
+ }
74
+ } catch (error) {
75
+ outputError(error);
76
+ }
77
+ }
78
+
79
+ monitorConsole();
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Execute JavaScript in page context
4
+ * Usage: node evaluate.js --script "document.title" [--url https://example.com]
5
+ */
6
+ import { getBrowser, getPage, closeBrowser, disconnectBrowser, parseArgs, outputJSON, outputError } from './lib/browser.js';
7
+
8
+ async function evaluate() {
9
+ const args = parseArgs(process.argv.slice(2));
10
+
11
+ if (!args.script) {
12
+ outputError(new Error('--script is required'));
13
+ return;
14
+ }
15
+
16
+ try {
17
+ const browser = await getBrowser({
18
+ headless: args.headless !== 'false'
19
+ });
20
+
21
+ const page = await getPage(browser);
22
+
23
+ // Navigate if URL provided
24
+ if (args.url) {
25
+ await page.goto(args.url, {
26
+ waitUntil: args['wait-until'] || 'networkidle2'
27
+ });
28
+ }
29
+
30
+ const result = await page.evaluate((script) => {
31
+ // eslint-disable-next-line no-eval
32
+ return eval(script);
33
+ }, args.script);
34
+
35
+ outputJSON({
36
+ success: true,
37
+ result: result,
38
+ url: page.url()
39
+ });
40
+
41
+ // Default: disconnect to keep browser running for session persistence
42
+ // Use --close true to fully close browser
43
+ if (args.close === 'true') {
44
+ await closeBrowser();
45
+ } else {
46
+ await disconnectBrowser();
47
+ }
48
+ } catch (error) {
49
+ outputError(error);
50
+ }
51
+ }
52
+
53
+ evaluate();
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Fill form fields
4
+ * Usage: node fill.js --selector "#input" --value "text" [--url https://example.com]
5
+ * Supports both CSS and XPath selectors:
6
+ * - CSS: node fill.js --selector "#email" --value "user@example.com"
7
+ * - XPath: node fill.js --selector "//input[@type='email']" --value "user@example.com"
8
+ */
9
+ import { getBrowser, getPage, closeBrowser, disconnectBrowser, parseArgs, outputJSON, outputError } from './lib/browser.js';
10
+ import { parseSelector, waitForElement, typeIntoElement, enhanceError } from './lib/selector.js';
11
+
12
+ async function fill() {
13
+ const args = parseArgs(process.argv.slice(2));
14
+
15
+ if (!args.selector) {
16
+ outputError(new Error('--selector is required'));
17
+ return;
18
+ }
19
+
20
+ if (!args.value) {
21
+ outputError(new Error('--value is required'));
22
+ return;
23
+ }
24
+
25
+ try {
26
+ const browser = await getBrowser({
27
+ headless: args.headless !== 'false'
28
+ });
29
+
30
+ const page = await getPage(browser);
31
+
32
+ // Navigate if URL provided
33
+ if (args.url) {
34
+ await page.goto(args.url, {
35
+ waitUntil: args['wait-until'] || 'networkidle2'
36
+ });
37
+ }
38
+
39
+ // Parse and validate selector
40
+ const parsed = parseSelector(args.selector);
41
+
42
+ // Wait for element based on selector type
43
+ await waitForElement(page, parsed, {
44
+ visible: true,
45
+ timeout: parseInt(args.timeout || '5000')
46
+ });
47
+
48
+ // Type into element
49
+ await typeIntoElement(page, parsed, args.value, {
50
+ clear: args.clear === 'true',
51
+ delay: parseInt(args.delay || '0')
52
+ });
53
+
54
+ outputJSON({
55
+ success: true,
56
+ selector: args.selector,
57
+ value: args.value,
58
+ url: page.url()
59
+ });
60
+
61
+ // Default: disconnect to keep browser running for session persistence
62
+ // Use --close true to fully close browser
63
+ if (args.close === 'true') {
64
+ await closeBrowser();
65
+ } else {
66
+ await disconnectBrowser();
67
+ }
68
+ } catch (error) {
69
+ // Enhance error message with troubleshooting tips
70
+ const enhanced = enhanceError(error, args.selector);
71
+ outputError(enhanced);
72
+ process.exit(1);
73
+ }
74
+ }
75
+
76
+ fill();