@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,211 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * llms.txt Analyzer Script
5
+ * Parses llms.txt content and categorizes URLs for optimal agent distribution
6
+ */
7
+
8
+ const { loadEnv } = require('./utils/env-loader');
9
+
10
+ // Load environment
11
+ const env = loadEnv();
12
+ const DEBUG = env.DEBUG === 'true';
13
+
14
+ /**
15
+ * URL priority categories
16
+ */
17
+ const PRIORITY_KEYWORDS = {
18
+ critical: [
19
+ 'getting-started', 'quick-start', 'quickstart', 'introduction', 'intro', 'overview',
20
+ 'installation', 'install', 'setup', 'basics', 'core-concepts', 'fundamentals',
21
+ ],
22
+ supplementary: [
23
+ 'advanced', 'internals', 'migration', 'migrate', 'troubleshooting', 'troubleshoot',
24
+ 'faq', 'frequently-asked', 'changelog', 'contributing', 'contribute',
25
+ ],
26
+ important: [
27
+ 'guide', 'tutorial', 'example', 'api-reference', 'api', 'reference',
28
+ 'configuration', 'config', 'routing', 'route', 'data-fetching', 'authentication', 'auth',
29
+ ],
30
+ };
31
+
32
+ /**
33
+ * Categorize URL by priority
34
+ * @param {string} url - Documentation URL
35
+ * @returns {string} Priority level (critical/important/supplementary)
36
+ */
37
+ function categorizeUrl(url) {
38
+ const urlLower = url.toLowerCase();
39
+
40
+ // Check in priority order: critical first, then supplementary, then important
41
+ // This ensures specific keywords (advanced, internals) are caught before generic ones
42
+ const priorities = ['critical', 'supplementary', 'important'];
43
+
44
+ for (const priority of priorities) {
45
+ const keywords = PRIORITY_KEYWORDS[priority];
46
+ for (const keyword of keywords) {
47
+ if (urlLower.includes(keyword)) {
48
+ return priority;
49
+ }
50
+ }
51
+ }
52
+
53
+ return 'important'; // Default
54
+ }
55
+
56
+ /**
57
+ * Parse llms.txt content to extract URLs
58
+ * @param {string} content - llms.txt content
59
+ * @returns {Array<string>} Array of URLs
60
+ */
61
+ function parseUrls(content) {
62
+ if (!content || typeof content !== 'string') {
63
+ return [];
64
+ }
65
+
66
+ const urls = [];
67
+ const lines = content.split('\n');
68
+
69
+ for (const line of lines) {
70
+ const trimmed = line.trim();
71
+
72
+ // Skip comments and empty lines
73
+ if (!trimmed || trimmed.startsWith('#')) continue;
74
+
75
+ // Extract URLs (look for http/https)
76
+ const urlMatch = trimmed.match(/https?:\/\/[^\s<>"]+/i);
77
+ if (urlMatch) {
78
+ urls.push(urlMatch[0]);
79
+ }
80
+ }
81
+
82
+ return urls;
83
+ }
84
+
85
+ /**
86
+ * Group URLs by priority
87
+ * @param {Array<string>} urls - Array of URLs
88
+ * @returns {Object} URLs grouped by priority
89
+ */
90
+ function groupByPriority(urls) {
91
+ const groups = {
92
+ critical: [],
93
+ important: [],
94
+ supplementary: [],
95
+ };
96
+
97
+ for (const url of urls) {
98
+ const priority = categorizeUrl(url);
99
+ groups[priority].push(url);
100
+ }
101
+
102
+ return groups;
103
+ }
104
+
105
+ /**
106
+ * Suggest optimal agent distribution
107
+ * @param {number} urlCount - Total number of URLs
108
+ * @returns {Object} Agent distribution suggestion
109
+ */
110
+ function suggestAgentDistribution(urlCount) {
111
+ if (urlCount <= 3) {
112
+ return {
113
+ agentCount: 1,
114
+ strategy: 'single',
115
+ urlsPerAgent: urlCount,
116
+ description: 'Single agent can handle all URLs',
117
+ };
118
+ } else if (urlCount <= 10) {
119
+ const agents = Math.min(Math.ceil(urlCount / 2), 5);
120
+ return {
121
+ agentCount: agents,
122
+ strategy: 'parallel',
123
+ urlsPerAgent: Math.ceil(urlCount / agents),
124
+ description: `Deploy ${agents} agents in parallel`,
125
+ };
126
+ } else if (urlCount <= 20) {
127
+ return {
128
+ agentCount: 7,
129
+ strategy: 'parallel',
130
+ urlsPerAgent: Math.ceil(urlCount / 7),
131
+ description: 'Deploy 7 agents with balanced workload',
132
+ };
133
+ } else {
134
+ return {
135
+ agentCount: 7,
136
+ strategy: 'phased',
137
+ urlsPerAgent: Math.ceil(urlCount / 7),
138
+ phases: 2,
139
+ description: 'Use two-phase approach: critical first, then important',
140
+ };
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Analyze llms.txt content
146
+ * @param {string} content - llms.txt content
147
+ * @returns {Object} Analysis result
148
+ */
149
+ function analyzeLlmsTxt(content) {
150
+ const urls = parseUrls(content);
151
+ const grouped = groupByPriority(urls);
152
+ const distribution = suggestAgentDistribution(urls.length);
153
+
154
+ return {
155
+ totalUrls: urls.length,
156
+ urls,
157
+ grouped,
158
+ distribution,
159
+ summary: {
160
+ critical: grouped.critical.length,
161
+ important: grouped.important.length,
162
+ supplementary: grouped.supplementary.length,
163
+ },
164
+ };
165
+ }
166
+
167
+ /**
168
+ * CLI entry point
169
+ */
170
+ function main() {
171
+ const args = process.argv.slice(2);
172
+
173
+ if (args.length === 0) {
174
+ console.error('Usage: node analyze-llms-txt.js <content-file-or-stdin>');
175
+ console.error('Or pipe content: cat llms.txt | node analyze-llms-txt.js');
176
+ process.exit(1);
177
+ }
178
+
179
+ const fs = require('fs');
180
+ let content;
181
+
182
+ if (args[0] === '-') {
183
+ // Read from stdin
184
+ content = fs.readFileSync(0, 'utf8');
185
+ } else {
186
+ // Read from file
187
+ const filePath = args[0];
188
+ if (!fs.existsSync(filePath)) {
189
+ console.error(`Error: File not found: ${filePath}`);
190
+ process.exit(1);
191
+ }
192
+ content = fs.readFileSync(filePath, 'utf8');
193
+ }
194
+
195
+ const result = analyzeLlmsTxt(content);
196
+ console.log(JSON.stringify(result, null, 2));
197
+ process.exit(0);
198
+ }
199
+
200
+ // Run if called directly
201
+ if (require.main === module) {
202
+ main();
203
+ }
204
+
205
+ module.exports = {
206
+ analyzeLlmsTxt,
207
+ parseUrls,
208
+ groupByPriority,
209
+ categorizeUrl,
210
+ suggestAgentDistribution,
211
+ };
@@ -0,0 +1,172 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Topic Detection Script
5
+ * Analyzes user queries to extract library name and topic keywords
6
+ * Returns null for general queries, topic info for specific queries
7
+ */
8
+
9
+ const { loadEnv } = require('./utils/env-loader');
10
+
11
+ // Load environment
12
+ const env = loadEnv();
13
+ const DEBUG = env.DEBUG === 'true';
14
+
15
+ /**
16
+ * Topic-specific query patterns
17
+ */
18
+ const TOPIC_PATTERNS = [
19
+ // "How do I use X in Y?"
20
+ /how (?:do i|to|can i) (?:use|implement|add|setup|configure) (?:the )?(.+?) (?:in|with|for) (.+)/i,
21
+
22
+ // "Y X strategies/patterns" - e.g., "Next.js caching strategies"
23
+ /(.+?) (.+?) (?:strategies|patterns|techniques|methods|approaches)/i,
24
+
25
+ // "X Y documentation" or "Y X docs"
26
+ /(.+?) (.+?) (?:documentation|docs|guide|tutorial)/i,
27
+
28
+ // "Using X with Y"
29
+ /using (.+?) (?:with|in|for) (.+)/i,
30
+
31
+ // "Y X guide/implementation/setup"
32
+ /(.+?) (.+?) (?:guide|implementation|setup|configuration)/i,
33
+
34
+ // "Implement X in Y"
35
+ /implement(?:ing)? (.+?) (?:in|with|for|using) (.+)/i,
36
+ ];
37
+
38
+ /**
39
+ * General library query patterns (non-topic specific)
40
+ */
41
+ const GENERAL_PATTERNS = [
42
+ /(?:documentation|docs) for (.+)/i,
43
+ /(.+?) (?:getting started|quick ?start|introduction)/i,
44
+ /(?:how to use|learn) (.+)/i,
45
+ /(.+?) (?:api reference|overview|basics)/i,
46
+ ];
47
+
48
+ /**
49
+ * Normalize topic keyword
50
+ * @param {string} topic - Raw topic string
51
+ * @returns {string} Normalized topic keyword
52
+ */
53
+ function normalizeTopic(topic) {
54
+ return topic
55
+ .toLowerCase()
56
+ .trim()
57
+ .replace(/[^a-z0-9\s-]/g, '') // Remove special chars
58
+ .replace(/\s+/g, '-') // Replace spaces with hyphens
59
+ .split('-')[0] // Take first word for multi-word topics
60
+ .slice(0, 20); // Limit length
61
+ }
62
+
63
+ /**
64
+ * Normalize library name
65
+ * @param {string} library - Raw library string
66
+ * @returns {string} Normalized library name
67
+ */
68
+ function normalizeLibrary(library) {
69
+ return library
70
+ .toLowerCase()
71
+ .trim()
72
+ .replace(/[^a-z0-9\s\-\/\.]/g, '')
73
+ .replace(/\s+/g, '-');
74
+ }
75
+
76
+ /**
77
+ * Detect if query is topic-specific or general
78
+ * @param {string} query - User query
79
+ * @returns {Object|null} Topic info or null for general query
80
+ */
81
+ function detectTopic(query) {
82
+ if (!query || typeof query !== 'string') {
83
+ return null;
84
+ }
85
+
86
+ const trimmedQuery = query.trim();
87
+
88
+ // Check general patterns first
89
+ for (const pattern of GENERAL_PATTERNS) {
90
+ const match = trimmedQuery.match(pattern);
91
+ if (match) {
92
+ if (DEBUG) console.error('[DEBUG] Matched general pattern, no topic');
93
+ return null;
94
+ }
95
+ }
96
+
97
+ // Check topic-specific patterns
98
+ for (let i = 0; i < TOPIC_PATTERNS.length; i++) {
99
+ const pattern = TOPIC_PATTERNS[i];
100
+ const match = trimmedQuery.match(pattern);
101
+ if (match) {
102
+ const [, term1, term2] = match;
103
+
104
+ // Determine which is library and which is topic based on pattern
105
+ let topic, library;
106
+
107
+ // Pattern 0: "How do I use X in Y?" -> X is topic, Y is library
108
+ // Pattern 1: "Y X strategies" -> X is topic, Y is library
109
+ // Pattern 2-5: X is topic, Y is library in most cases
110
+
111
+ // For pattern 1 (strategies/patterns), term1 is library, term2 is topic
112
+ if (i === 1) {
113
+ topic = normalizeTopic(term2);
114
+ library = normalizeLibrary(term1);
115
+ } else {
116
+ // For other patterns, term1 is topic, term2 is library
117
+ topic = normalizeTopic(term1);
118
+ library = normalizeLibrary(term2);
119
+ }
120
+
121
+ if (DEBUG) {
122
+ console.error('[DEBUG] Matched topic pattern');
123
+ console.error('[DEBUG] Topic:', topic);
124
+ console.error('[DEBUG] Library:', library);
125
+ }
126
+
127
+ return {
128
+ query: trimmedQuery,
129
+ topic,
130
+ library,
131
+ isTopicSpecific: true,
132
+ };
133
+ }
134
+ }
135
+
136
+ if (DEBUG) console.error('[DEBUG] No pattern matched, treating as general');
137
+ return null;
138
+ }
139
+
140
+ /**
141
+ * CLI entry point
142
+ */
143
+ function main() {
144
+ const args = process.argv.slice(2);
145
+
146
+ if (args.length === 0) {
147
+ console.error('Usage: node detect-topic.js "<user query>"');
148
+ process.exit(1);
149
+ }
150
+
151
+ const query = args.join(' ');
152
+ const result = detectTopic(query);
153
+
154
+ if (result) {
155
+ console.log(JSON.stringify(result, null, 2));
156
+ process.exit(0);
157
+ } else {
158
+ console.log(JSON.stringify({ isTopicSpecific: false }, null, 2));
159
+ process.exit(0);
160
+ }
161
+ }
162
+
163
+ // Run if called directly
164
+ if (require.main === module) {
165
+ main();
166
+ }
167
+
168
+ module.exports = {
169
+ detectTopic,
170
+ normalizeTopic,
171
+ normalizeLibrary,
172
+ };
@@ -0,0 +1,213 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Documentation Fetcher Script
5
+ * Fetches documentation from context7.com with topic support and fallback chain
6
+ */
7
+
8
+ const https = require('https');
9
+ const { loadEnv } = require('./utils/env-loader');
10
+ const { detectTopic } = require('./detect-topic');
11
+
12
+ // Load environment
13
+ const env = loadEnv();
14
+ const DEBUG = env.DEBUG === 'true';
15
+ const API_KEY = env.CONTEXT7_API_KEY;
16
+
17
+ /**
18
+ * Make HTTPS GET request
19
+ * @param {string} url - URL to fetch
20
+ * @returns {Promise<string>} Response body
21
+ */
22
+ function httpsGet(url) {
23
+ return new Promise((resolve, reject) => {
24
+ const options = {
25
+ headers: API_KEY ? { 'Authorization': `Bearer ${API_KEY}` } : {},
26
+ };
27
+
28
+ https.get(url, options, (res) => {
29
+ let data = '';
30
+
31
+ res.on('data', (chunk) => {
32
+ data += chunk;
33
+ });
34
+
35
+ res.on('end', () => {
36
+ if (res.statusCode === 200) {
37
+ resolve(data);
38
+ } else if (res.statusCode === 404) {
39
+ resolve(null);
40
+ } else {
41
+ reject(new Error(`HTTP ${res.statusCode}: ${data}`));
42
+ }
43
+ });
44
+ }).on('error', reject);
45
+ });
46
+ }
47
+
48
+ /**
49
+ * Construct context7.com URL
50
+ * @param {string} library - Library name (e.g., "next.js", "shadcn/ui")
51
+ * @param {string} topic - Optional topic keyword
52
+ * @returns {string} context7.com URL
53
+ */
54
+ function buildContext7Url(library, topic = null) {
55
+ // Determine if GitHub repo or website
56
+ let basePath;
57
+
58
+ if (library.includes('/')) {
59
+ // GitHub repo format: org/repo
60
+ const [org, repo] = library.split('/');
61
+ basePath = `${org}/${repo}`;
62
+ } else {
63
+ // Try common patterns
64
+ const normalized = library.toLowerCase().replace(/[^a-z0-9-]/g, '');
65
+ basePath = `websites/${normalized}`;
66
+ }
67
+
68
+ const baseUrl = `https://context7.com/${basePath}/llms.txt`;
69
+
70
+ if (topic) {
71
+ return `${baseUrl}?topic=${encodeURIComponent(topic)}`;
72
+ }
73
+
74
+ return baseUrl;
75
+ }
76
+
77
+ /**
78
+ * Try multiple URL variations for a library
79
+ * @param {string} library - Library name
80
+ * @param {string} topic - Optional topic
81
+ * @returns {Promise<Array>} Array of URLs to try
82
+ */
83
+ async function getUrlVariations(library, topic = null) {
84
+ const urls = [];
85
+
86
+ // Known repo mappings
87
+ const knownRepos = {
88
+ 'next.js': 'vercel/next.js',
89
+ 'nextjs': 'vercel/next.js',
90
+ 'remix': 'remix-run/remix',
91
+ 'astro': 'withastro/astro',
92
+ 'shadcn': 'shadcn-ui/ui',
93
+ 'shadcn/ui': 'shadcn-ui/ui',
94
+ 'better-auth': 'better-auth/better-auth',
95
+ };
96
+
97
+ const normalized = library.toLowerCase();
98
+ const repo = knownRepos[normalized] || library;
99
+
100
+ // Primary: Try with topic if available
101
+ if (topic) {
102
+ urls.push(buildContext7Url(repo, topic));
103
+ }
104
+
105
+ // Fallback: Try without topic
106
+ urls.push(buildContext7Url(repo));
107
+
108
+ return urls;
109
+ }
110
+
111
+ /**
112
+ * Fetch documentation from context7.com
113
+ * @param {string} query - User query
114
+ * @returns {Promise<Object>} Documentation result
115
+ */
116
+ async function fetchDocs(query) {
117
+ const topicInfo = detectTopic(query);
118
+
119
+ if (DEBUG) {
120
+ console.error('[DEBUG] Topic detection result:', topicInfo);
121
+ }
122
+
123
+ let urls = [];
124
+
125
+ if (topicInfo && topicInfo.isTopicSpecific) {
126
+ // Topic-specific search
127
+ urls = await getUrlVariations(topicInfo.library, topicInfo.topic);
128
+
129
+ if (DEBUG) {
130
+ console.error('[DEBUG] Topic-specific URLs:', urls);
131
+ }
132
+ } else {
133
+ // Extract library from general query
134
+ const libraryMatch = query.match(/(?:documentation|docs|guide) (?:for )?(.+)/i);
135
+ if (libraryMatch) {
136
+ const library = libraryMatch[1].trim();
137
+ urls = await getUrlVariations(library);
138
+
139
+ if (DEBUG) {
140
+ console.error('[DEBUG] General library URLs:', urls);
141
+ }
142
+ }
143
+ }
144
+
145
+ // Try each URL
146
+ for (const url of urls) {
147
+ if (DEBUG) {
148
+ console.error(`[DEBUG] Trying URL: ${url}`);
149
+ }
150
+
151
+ try {
152
+ const content = await httpsGet(url);
153
+
154
+ if (content) {
155
+ return {
156
+ success: true,
157
+ source: 'context7.com',
158
+ url,
159
+ content,
160
+ topicSpecific: url.includes('?topic='),
161
+ };
162
+ }
163
+ } catch (error) {
164
+ if (DEBUG) {
165
+ console.error(`[DEBUG] Failed to fetch ${url}:`, error.message);
166
+ }
167
+ }
168
+ }
169
+
170
+ // No URL worked
171
+ return {
172
+ success: false,
173
+ source: 'context7.com',
174
+ error: 'Documentation not found on context7.com',
175
+ urls,
176
+ suggestion: 'Try repository analysis or web search',
177
+ };
178
+ }
179
+
180
+ /**
181
+ * CLI entry point
182
+ */
183
+ async function main() {
184
+ const args = process.argv.slice(2);
185
+
186
+ if (args.length === 0) {
187
+ console.error('Usage: node fetch-docs.js "<user query>"');
188
+ process.exit(1);
189
+ }
190
+
191
+ const query = args.join(' ');
192
+
193
+ try {
194
+ const result = await fetchDocs(query);
195
+ console.log(JSON.stringify(result, null, 2));
196
+ process.exit(result.success ? 0 : 1);
197
+ } catch (error) {
198
+ console.error('Error:', error.message);
199
+ process.exit(1);
200
+ }
201
+ }
202
+
203
+ // Run if called directly
204
+ if (require.main === module) {
205
+ main();
206
+ }
207
+
208
+ module.exports = {
209
+ fetchDocs,
210
+ buildContext7Url,
211
+ getUrlVariations,
212
+ httpsGet,
213
+ };
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Environment variable loader for docs-seeker skill
5
+ * Respects order: process.env > skill/.env > skills/.env > %USERPROFILE%/.claude/.env
6
+ */
7
+
8
+ const fs = require('fs');
9
+ const path = require('path');
10
+
11
+ /**
12
+ * Parse .env file content into key-value pairs
13
+ * @param {string} content - .env file content
14
+ * @returns {Object} Parsed environment variables
15
+ */
16
+ function parseEnvFile(content) {
17
+ const env = {};
18
+ const lines = content.split('\n');
19
+
20
+ for (const line of lines) {
21
+ // Skip comments and empty lines
22
+ if (!line || line.trim().startsWith('#')) continue;
23
+
24
+ const match = line.match(/^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/);
25
+ if (match) {
26
+ const key = match[1];
27
+ let value = match[2].trim();
28
+
29
+ // Remove quotes if present
30
+ if ((value.startsWith('"') && value.endsWith('"')) ||
31
+ (value.startsWith("'") && value.endsWith("'"))) {
32
+ value = value.slice(1, -1);
33
+ }
34
+
35
+ env[key] = value;
36
+ }
37
+ }
38
+
39
+ return env;
40
+ }
41
+
42
+ /**
43
+ * Load environment variables from .env files in priority order
44
+ * Priority: process.env > skill/.env > skills/.env > %USERPROFILE%/.claude/.env
45
+ * @returns {Object} Merged environment variables
46
+ */
47
+ function loadEnv() {
48
+ const skillDir = path.resolve(__dirname, '../..');
49
+ const skillsDir = path.resolve(skillDir, '..');
50
+ const claudeDir = path.resolve(skillsDir, '..');
51
+
52
+ const envPaths = [
53
+ path.join(claudeDir, '.env'), // Lowest priority
54
+ path.join(skillsDir, '.env'),
55
+ path.join(skillDir, '.env'), // Highest priority (file)
56
+ ];
57
+
58
+ let mergedEnv = {};
59
+
60
+ // Load .env files in order (lowest to highest priority)
61
+ for (const envPath of envPaths) {
62
+ if (fs.existsSync(envPath)) {
63
+ try {
64
+ const content = fs.readFileSync(envPath, 'utf8');
65
+ const parsed = parseEnvFile(content);
66
+ mergedEnv = { ...mergedEnv, ...parsed };
67
+ } catch (error) {
68
+ // Silently skip unreadable files
69
+ }
70
+ }
71
+ }
72
+
73
+ // process.env has highest priority
74
+ mergedEnv = { ...mergedEnv, ...process.env };
75
+
76
+ return mergedEnv;
77
+ }
78
+
79
+ /**
80
+ * Get environment variable with fallback
81
+ * @param {string} key - Environment variable key
82
+ * @param {string} defaultValue - Default value if not found
83
+ * @returns {string} Environment variable value
84
+ */
85
+ function getEnv(key, defaultValue = '') {
86
+ const env = loadEnv();
87
+ return env[key] || defaultValue;
88
+ }
89
+
90
+ module.exports = {
91
+ loadEnv,
92
+ getEnv,
93
+ parseEnvFile,
94
+ };