@thanhvn14/csvibe 0.1.3 → 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 (395) 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 +3 -0
  381. package/dist/config/constants.d.ts.map +1 -1
  382. package/dist/config/constants.js +5 -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/dist/utils/scaffolder.d.ts.map +1 -1
  393. package/dist/utils/scaffolder.js +2 -0
  394. package/dist/utils/scaffolder.js.map +1 -1
  395. package/package.json +3 -1
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "mcp-management",
3
+ "lockfileVersion": 3,
4
+ "requires": true,
5
+ "packages": {}
6
+ }
@@ -0,0 +1,10 @@
1
+ # MCP Management Scripts Environment Variables
2
+
3
+ # Path to MCP configuration file (optional, defaults to .claude/.mcp.json)
4
+ MCP_CONFIG_PATH=.claude/.mcp.json
5
+
6
+ # Logging level (optional, defaults to info)
7
+ LOG_LEVEL=info
8
+
9
+ # Enable debug mode (optional, defaults to false)
10
+ DEBUG=false
@@ -0,0 +1,195 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Management CLI - Command-line interface for MCP operations
4
+ */
5
+
6
+ import { MCPClientManager } from './mcp-client.js';
7
+ import { writeFileSync, mkdirSync } from 'fs';
8
+ import { dirname, join } from 'path';
9
+ import { fileURLToPath } from 'url';
10
+
11
+ const __filename = fileURLToPath(import.meta.url);
12
+ const __dirname = dirname(__filename);
13
+
14
+ const GLOBAL_TIMEOUT_MS = parseInt(process.env.MCP_TIMEOUT || '120000', 10);
15
+ let globalManager: MCPClientManager | null = null;
16
+
17
+ function setupShutdownHandlers() {
18
+ const shutdown = async (signal: string) => {
19
+ console.log(`\nReceived ${signal}, cleaning up...`);
20
+ if (globalManager) {
21
+ await globalManager.cleanup();
22
+ }
23
+ process.exit(0);
24
+ };
25
+
26
+ process.on('SIGINT', () => shutdown('SIGINT'));
27
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
28
+ process.on('SIGHUP', () => shutdown('SIGHUP'));
29
+
30
+ process.on('unhandledRejection', (reason) => {
31
+ console.error('Unhandled rejection:', reason);
32
+ process.exit(1);
33
+ });
34
+ }
35
+
36
+ async function main() {
37
+ const args = process.argv.slice(2);
38
+ const command = args[0];
39
+
40
+ // Setup shutdown handlers
41
+ setupShutdownHandlers();
42
+
43
+ // Check for help flags BEFORE connecting to servers
44
+ if (!command || command === '--help' || command === 'help') {
45
+ printUsage();
46
+ process.exit(0);
47
+ }
48
+
49
+ // Global timeout
50
+ const timeoutHandle = setTimeout(() => {
51
+ console.error('Global timeout exceeded, forcing exit');
52
+ process.exit(1);
53
+ }, GLOBAL_TIMEOUT_MS);
54
+ timeoutHandle.unref();
55
+
56
+ const manager = new MCPClientManager();
57
+ globalManager = manager;
58
+
59
+ try {
60
+ // Load config
61
+ await manager.loadConfig();
62
+ console.log('✓ Config loaded');
63
+
64
+ // Connect to all servers
65
+ await manager.connectAll();
66
+ console.log('✓ Connected to all MCP servers\n');
67
+
68
+ switch (command) {
69
+ case 'list-tools':
70
+ await listTools(manager);
71
+ break;
72
+
73
+ case 'list-prompts':
74
+ await listPrompts(manager);
75
+ break;
76
+
77
+ case 'list-resources':
78
+ await listResources(manager);
79
+ break;
80
+
81
+ case 'call-tool':
82
+ await callTool(manager, args[1], args[2], args[3]);
83
+ break;
84
+
85
+ default:
86
+ printUsage();
87
+ }
88
+
89
+ await manager.cleanup();
90
+ process.exit(0);
91
+ } catch (error) {
92
+ console.error('Error:', error);
93
+ process.exit(1);
94
+ }
95
+ }
96
+
97
+ async function listTools(manager: MCPClientManager) {
98
+ const tools = await manager.getAllTools();
99
+ console.log(`Found ${tools.length} tools:\n`);
100
+
101
+ for (const tool of tools) {
102
+ console.log(`📦 ${tool.serverName} / ${tool.name}`);
103
+ console.log(` ${tool.description}`);
104
+ if (tool.inputSchema?.properties) {
105
+ console.log(` Parameters: ${Object.keys(tool.inputSchema.properties).join(', ')}`);
106
+ }
107
+ console.log('');
108
+ }
109
+
110
+ // Save tools to JSON file
111
+ const assetsDir = join(__dirname, '..', 'assets');
112
+ const toolsPath = join(assetsDir, 'tools.json');
113
+
114
+ try {
115
+ mkdirSync(assetsDir, { recursive: true });
116
+ writeFileSync(toolsPath, JSON.stringify(tools, null, 2));
117
+ console.log(`\n✓ Tools saved to ${toolsPath}`);
118
+ } catch (error) {
119
+ console.error(`\n✗ Failed to save tools: ${error}`);
120
+ }
121
+ }
122
+
123
+ async function listPrompts(manager: MCPClientManager) {
124
+ const prompts = await manager.getAllPrompts();
125
+ console.log(`Found ${prompts.length} prompts:\n`);
126
+
127
+ for (const prompt of prompts) {
128
+ console.log(`💬 ${prompt.serverName} / ${prompt.name}`);
129
+ console.log(` ${prompt.description}`);
130
+ if (prompt.arguments && prompt.arguments.length > 0) {
131
+ console.log(` Arguments: ${prompt.arguments.map((a: any) => a.name).join(', ')}`);
132
+ }
133
+ console.log('');
134
+ }
135
+ }
136
+
137
+ async function listResources(manager: MCPClientManager) {
138
+ const resources = await manager.getAllResources();
139
+ console.log(`Found ${resources.length} resources:\n`);
140
+
141
+ for (const resource of resources) {
142
+ console.log(`📄 ${resource.serverName} / ${resource.name}`);
143
+ console.log(` URI: ${resource.uri}`);
144
+ if (resource.description) {
145
+ console.log(` ${resource.description}`);
146
+ }
147
+ if (resource.mimeType) {
148
+ console.log(` Type: ${resource.mimeType}`);
149
+ }
150
+ console.log('');
151
+ }
152
+ }
153
+
154
+ async function callTool(
155
+ manager: MCPClientManager,
156
+ serverName: string,
157
+ toolName: string,
158
+ argsJson: string
159
+ ) {
160
+ if (!serverName || !toolName || !argsJson) {
161
+ console.error('Usage: cli.ts call-tool <server> <tool> <json-args>');
162
+ process.exit(1);
163
+ }
164
+
165
+ const args = JSON.parse(argsJson);
166
+ console.log(`Calling ${serverName}/${toolName}...`);
167
+
168
+ const result = await manager.callTool(serverName, toolName, args);
169
+ console.log('\nResult:');
170
+ console.log(JSON.stringify(result, null, 2));
171
+ }
172
+
173
+ function printUsage() {
174
+ console.log(`
175
+ MCP Management CLI
176
+
177
+ Usage:
178
+ cli.ts <command> [options]
179
+
180
+ Commands:
181
+ list-tools List all tools and save to assets/tools.json
182
+ list-prompts List all prompts from all MCP servers
183
+ list-resources List all resources from all MCP servers
184
+ call-tool <server> <tool> <json> Call a specific tool
185
+
186
+ Examples:
187
+ cli.ts list-tools
188
+ cli.ts call-tool memory create_entities '{"entities":[{"name":"Alice","entityType":"person"}]}'
189
+ cli.ts call-tool human-mcp playwright_screenshot_fullpage '{"url":"https://example.com"}'
190
+
191
+ Note: Tool analysis is done by the LLM reading assets/tools.json directly.
192
+ `);
193
+ }
194
+
195
+ main();
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Tool Analyzer - Intelligently selects relevant MCP tools for tasks
4
+ */
5
+ /**
6
+ * Analyze tools and return those relevant to the task
7
+ */
8
+ export function analyzeToolsForTask(tools, taskDescription) {
9
+ const keywords = extractKeywords(taskDescription);
10
+ const scoredTools = tools.map(tool => ({
11
+ tool,
12
+ score: calculateRelevanceScore(tool, keywords, taskDescription),
13
+ reasons: explainScore(tool, keywords, taskDescription)
14
+ }));
15
+ // Sort by score descending
16
+ scoredTools.sort((a, b) => b.score - a.score);
17
+ // Filter tools with score above threshold
18
+ const threshold = 0.3;
19
+ const relevant = scoredTools.filter(st => st.score > threshold);
20
+ return {
21
+ relevantTools: relevant.map(st => st.tool),
22
+ reasoning: relevant.map(st => `${st.tool.name} (${st.tool.serverName}): ${st.reasons.join('; ')}`),
23
+ confidence: relevant.length > 0
24
+ ? relevant[0].score
25
+ : 0
26
+ };
27
+ }
28
+ function extractKeywords(text) {
29
+ const stopWords = new Set([
30
+ 'the', 'a', 'an', 'and', 'or', 'but', 'in', 'on', 'at',
31
+ 'to', 'for', 'of', 'with', 'by', 'from', 'as', 'is', 'was', 'are'
32
+ ]);
33
+ return text
34
+ .toLowerCase()
35
+ .split(/\W+/)
36
+ .filter(word => word.length > 2 && !stopWords.has(word));
37
+ }
38
+ function calculateRelevanceScore(tool, keywords, taskDescription) {
39
+ let score = 0;
40
+ const toolText = `${tool.name} ${tool.description}`.toLowerCase();
41
+ // Keyword matching
42
+ for (const keyword of keywords) {
43
+ if (toolText.includes(keyword)) {
44
+ score += 0.2;
45
+ }
46
+ }
47
+ // Exact phrase matching
48
+ const taskLower = taskDescription.toLowerCase();
49
+ if (toolText.includes(taskLower) || taskLower.includes(tool.name.toLowerCase())) {
50
+ score += 0.5;
51
+ }
52
+ // Schema complexity bonus (more params = more specialized)
53
+ if (tool.inputSchema?.properties) {
54
+ const paramCount = Object.keys(tool.inputSchema.properties).length;
55
+ score += Math.min(paramCount * 0.05, 0.3);
56
+ }
57
+ return Math.min(score, 1.0);
58
+ }
59
+ function explainScore(tool, keywords, taskDescription) {
60
+ const reasons = [];
61
+ const toolText = `${tool.name} ${tool.description}`.toLowerCase();
62
+ const matchedKeywords = keywords.filter(k => toolText.includes(k));
63
+ if (matchedKeywords.length > 0) {
64
+ reasons.push(`matches keywords: ${matchedKeywords.join(', ')}`);
65
+ }
66
+ if (tool.description) {
67
+ reasons.push(`description: ${tool.description.slice(0, 100)}`);
68
+ }
69
+ return reasons;
70
+ }
@@ -0,0 +1,160 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Management CLI - Command-line interface for MCP operations
4
+ */
5
+ import { MCPClientManager } from './mcp-client.js';
6
+ import { writeFileSync, mkdirSync } from 'fs';
7
+ import { dirname, join } from 'path';
8
+ import { fileURLToPath } from 'url';
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = dirname(__filename);
11
+ const GLOBAL_TIMEOUT_MS = parseInt(process.env.MCP_TIMEOUT || '120000', 10);
12
+ let globalManager = null;
13
+ function setupShutdownHandlers() {
14
+ const shutdown = async (signal) => {
15
+ console.log(`\nReceived ${signal}, cleaning up...`);
16
+ if (globalManager) {
17
+ await globalManager.cleanup();
18
+ }
19
+ process.exit(0);
20
+ };
21
+ process.on('SIGINT', () => shutdown('SIGINT'));
22
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
23
+ process.on('SIGHUP', () => shutdown('SIGHUP'));
24
+ process.on('unhandledRejection', (reason) => {
25
+ console.error('Unhandled rejection:', reason);
26
+ process.exit(1);
27
+ });
28
+ }
29
+ async function main() {
30
+ const args = process.argv.slice(2);
31
+ const command = args[0];
32
+ // Setup shutdown handlers
33
+ setupShutdownHandlers();
34
+ // Check for help flags BEFORE connecting to servers
35
+ if (!command || command === '--help' || command === 'help') {
36
+ printUsage();
37
+ process.exit(0);
38
+ }
39
+ // Global timeout
40
+ const timeoutHandle = setTimeout(() => {
41
+ console.error('Global timeout exceeded, forcing exit');
42
+ process.exit(1);
43
+ }, GLOBAL_TIMEOUT_MS);
44
+ timeoutHandle.unref();
45
+ const manager = new MCPClientManager();
46
+ globalManager = manager;
47
+ try {
48
+ // Load config
49
+ await manager.loadConfig();
50
+ console.log('✓ Config loaded');
51
+ // Connect to all servers
52
+ await manager.connectAll();
53
+ console.log('✓ Connected to all MCP servers\n');
54
+ switch (command) {
55
+ case 'list-tools':
56
+ await listTools(manager);
57
+ break;
58
+ case 'list-prompts':
59
+ await listPrompts(manager);
60
+ break;
61
+ case 'list-resources':
62
+ await listResources(manager);
63
+ break;
64
+ case 'call-tool':
65
+ await callTool(manager, args[1], args[2], args[3]);
66
+ break;
67
+ default:
68
+ printUsage();
69
+ }
70
+ await manager.cleanup();
71
+ process.exit(0);
72
+ }
73
+ catch (error) {
74
+ console.error('Error:', error);
75
+ process.exit(1);
76
+ }
77
+ }
78
+ async function listTools(manager) {
79
+ const tools = await manager.getAllTools();
80
+ console.log(`Found ${tools.length} tools:\n`);
81
+ for (const tool of tools) {
82
+ console.log(`📦 ${tool.serverName} / ${tool.name}`);
83
+ console.log(` ${tool.description}`);
84
+ if (tool.inputSchema?.properties) {
85
+ console.log(` Parameters: ${Object.keys(tool.inputSchema.properties).join(', ')}`);
86
+ }
87
+ console.log('');
88
+ }
89
+ // Save tools to JSON file
90
+ const assetsDir = join(__dirname, '..', 'assets');
91
+ const toolsPath = join(assetsDir, 'tools.json');
92
+ try {
93
+ mkdirSync(assetsDir, { recursive: true });
94
+ writeFileSync(toolsPath, JSON.stringify(tools, null, 2));
95
+ console.log(`\n✓ Tools saved to ${toolsPath}`);
96
+ }
97
+ catch (error) {
98
+ console.error(`\n✗ Failed to save tools: ${error}`);
99
+ }
100
+ }
101
+ async function listPrompts(manager) {
102
+ const prompts = await manager.getAllPrompts();
103
+ console.log(`Found ${prompts.length} prompts:\n`);
104
+ for (const prompt of prompts) {
105
+ console.log(`💬 ${prompt.serverName} / ${prompt.name}`);
106
+ console.log(` ${prompt.description}`);
107
+ if (prompt.arguments && prompt.arguments.length > 0) {
108
+ console.log(` Arguments: ${prompt.arguments.map((a) => a.name).join(', ')}`);
109
+ }
110
+ console.log('');
111
+ }
112
+ }
113
+ async function listResources(manager) {
114
+ const resources = await manager.getAllResources();
115
+ console.log(`Found ${resources.length} resources:\n`);
116
+ for (const resource of resources) {
117
+ console.log(`📄 ${resource.serverName} / ${resource.name}`);
118
+ console.log(` URI: ${resource.uri}`);
119
+ if (resource.description) {
120
+ console.log(` ${resource.description}`);
121
+ }
122
+ if (resource.mimeType) {
123
+ console.log(` Type: ${resource.mimeType}`);
124
+ }
125
+ console.log('');
126
+ }
127
+ }
128
+ async function callTool(manager, serverName, toolName, argsJson) {
129
+ if (!serverName || !toolName || !argsJson) {
130
+ console.error('Usage: cli.ts call-tool <server> <tool> <json-args>');
131
+ process.exit(1);
132
+ }
133
+ const args = JSON.parse(argsJson);
134
+ console.log(`Calling ${serverName}/${toolName}...`);
135
+ const result = await manager.callTool(serverName, toolName, args);
136
+ console.log('\nResult:');
137
+ console.log(JSON.stringify(result, null, 2));
138
+ }
139
+ function printUsage() {
140
+ console.log(`
141
+ MCP Management CLI
142
+
143
+ Usage:
144
+ cli.ts <command> [options]
145
+
146
+ Commands:
147
+ list-tools List all tools and save to assets/tools.json
148
+ list-prompts List all prompts from all MCP servers
149
+ list-resources List all resources from all MCP servers
150
+ call-tool <server> <tool> <json> Call a specific tool
151
+
152
+ Examples:
153
+ cli.ts list-tools
154
+ cli.ts call-tool memory create_entities '{"entities":[{"name":"Alice","entityType":"person"}]}'
155
+ cli.ts call-tool human-mcp playwright_screenshot_fullpage '{"url":"https://example.com"}'
156
+
157
+ Note: Tool analysis is done by the LLM reading assets/tools.json directly.
158
+ `);
159
+ }
160
+ main();
@@ -0,0 +1,183 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Client - Core client for interacting with MCP servers
4
+ */
5
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
6
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
7
+ import { readFile } from 'fs/promises';
8
+ import { resolve } from 'path';
9
+ export class MCPClientManager {
10
+ config = null;
11
+ clients = new Map();
12
+ transports = new Map();
13
+ async loadConfig(configPath = '%USERPROFILE%/.claude/.mcp.json') {
14
+ const fullPath = resolve(process.cwd(), configPath);
15
+ const content = await readFile(fullPath, 'utf-8');
16
+ const config = JSON.parse(content);
17
+ this.config = config;
18
+ return config;
19
+ }
20
+ async connectToServer(serverName) {
21
+ if (!this.config?.mcpServers[serverName]) {
22
+ throw new Error(`Server ${serverName} not found in config`);
23
+ }
24
+ const serverConfig = this.config.mcpServers[serverName];
25
+ const transport = new StdioClientTransport({
26
+ command: serverConfig.command,
27
+ args: serverConfig.args,
28
+ env: serverConfig.env
29
+ });
30
+ const client = new Client({
31
+ name: `mcp-manager-${serverName}`,
32
+ version: '1.0.0'
33
+ }, { capabilities: {} });
34
+ await client.connect(transport);
35
+ this.clients.set(serverName, client);
36
+ this.transports.set(serverName, transport); // Track transport!
37
+ return client;
38
+ }
39
+ async connectAll() {
40
+ if (!this.config) {
41
+ throw new Error('Config not loaded. Call loadConfig() first.');
42
+ }
43
+ const serverNames = Object.keys(this.config.mcpServers);
44
+ console.log(`Connecting to ${serverNames.length} servers sequentially...`);
45
+ for (const serverName of serverNames) {
46
+ try {
47
+ await this.connectToServer(serverName);
48
+ console.log(`✓ ${serverName} connected`);
49
+ }
50
+ catch (error) {
51
+ console.error(`✗ ${serverName} failed:`, error);
52
+ // Continue with other servers
53
+ }
54
+ }
55
+ }
56
+ async getAllTools() {
57
+ const allTools = [];
58
+ for (const [serverName, client] of this.clients.entries()) {
59
+ try {
60
+ const response = await client.listTools({}, { timeout: 300000 });
61
+ for (const tool of response.tools) {
62
+ allTools.push({
63
+ serverName,
64
+ name: tool.name,
65
+ description: tool.description || '',
66
+ inputSchema: tool.inputSchema,
67
+ outputSchema: tool.outputSchema
68
+ });
69
+ }
70
+ }
71
+ catch (error) {
72
+ if (error?.code === -32601) {
73
+ console.warn(`${serverName} does not support listTools`);
74
+ }
75
+ else {
76
+ console.error(`Error from ${serverName}:`, error);
77
+ }
78
+ // Continue with other servers!
79
+ }
80
+ }
81
+ return allTools;
82
+ }
83
+ async getAllPrompts() {
84
+ const allPrompts = [];
85
+ for (const [serverName, client] of this.clients.entries()) {
86
+ try {
87
+ const response = await client.listPrompts({}, { timeout: 300000 });
88
+ for (const prompt of response.prompts) {
89
+ allPrompts.push({
90
+ serverName,
91
+ name: prompt.name,
92
+ description: prompt.description || '',
93
+ arguments: prompt.arguments
94
+ });
95
+ }
96
+ }
97
+ catch (error) {
98
+ if (error?.code === -32601) {
99
+ console.warn(`${serverName} does not support listPrompts`);
100
+ }
101
+ else {
102
+ console.error(`Error from ${serverName}:`, error);
103
+ }
104
+ // Continue with other servers!
105
+ }
106
+ }
107
+ return allPrompts;
108
+ }
109
+ async getAllResources() {
110
+ const allResources = [];
111
+ for (const [serverName, client] of this.clients.entries()) {
112
+ try {
113
+ const response = await client.listResources({}, { timeout: 300000 });
114
+ for (const resource of response.resources) {
115
+ allResources.push({
116
+ serverName,
117
+ uri: resource.uri,
118
+ name: resource.name,
119
+ description: resource.description,
120
+ mimeType: resource.mimeType
121
+ });
122
+ }
123
+ }
124
+ catch (error) {
125
+ if (error?.code === -32601) {
126
+ console.warn(`${serverName} does not support listResources`);
127
+ }
128
+ else {
129
+ console.error(`Error from ${serverName}:`, error);
130
+ }
131
+ // Continue with other servers!
132
+ }
133
+ }
134
+ return allResources;
135
+ }
136
+ async callTool(serverName, toolName, args) {
137
+ const client = this.clients.get(serverName);
138
+ if (!client)
139
+ throw new Error(`Not connected to server: ${serverName}`);
140
+ return await client.callTool({ name: toolName, arguments: args }, undefined, { timeout: 300000 });
141
+ }
142
+ async getPrompt(serverName, promptName, args) {
143
+ const client = this.clients.get(serverName);
144
+ if (!client)
145
+ throw new Error(`Not connected to server: ${serverName}`);
146
+ return await client.getPrompt({ name: promptName, arguments: args }, { timeout: 300000 });
147
+ }
148
+ async readResource(serverName, uri) {
149
+ const client = this.clients.get(serverName);
150
+ if (!client)
151
+ throw new Error(`Not connected to server: ${serverName}`);
152
+ return await client.readResource({ uri }, { timeout: 300000 });
153
+ }
154
+ async cleanup() {
155
+ // Close clients with timeout
156
+ const cleanupPromises = [];
157
+ for (const [serverName, client] of this.clients.entries()) {
158
+ cleanupPromises.push((async () => {
159
+ try {
160
+ await client.close();
161
+ }
162
+ catch (error) {
163
+ console.warn(`Warning closing ${serverName}:`, error);
164
+ }
165
+ })());
166
+ }
167
+ await Promise.race([
168
+ Promise.all(cleanupPromises),
169
+ new Promise((resolve) => setTimeout(resolve, 5000))
170
+ ]);
171
+ // CRITICAL: Close transports to kill subprocesses
172
+ for (const [serverName, transport] of this.transports.entries()) {
173
+ try {
174
+ await transport.close();
175
+ }
176
+ catch (error) {
177
+ console.warn(`Warning closing ${serverName} transport:`, error);
178
+ }
179
+ }
180
+ this.clients.clear();
181
+ this.transports.clear();
182
+ }
183
+ }