@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,1220 @@
1
+ # Skills Installation Script for Windows (PowerShell)
2
+ # Installs all dependencies for Claude Code skills
3
+ #
4
+ # Exit codes (rustup model):
5
+ # 0 = Success (full or partial)
6
+ # 1 = Fatal error (no Python, broken venv)
7
+ # 2 = Partial success (some optional deps failed)
8
+
9
+ param(
10
+ [switch]$SkipChocolatey = $false,
11
+ [switch]$Help = $false,
12
+ [switch]$Y = $false, # Skip all prompts and auto-confirm
13
+ [switch]$WithAdmin = $false, # Use admin-requiring package managers (choco)
14
+ [switch]$Resume = $false, # Resume from previous interrupted installation
15
+ [switch]$RetryFailed = $false # Retry previously failed packages
16
+ )
17
+
18
+ # Configuration
19
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
20
+ $VenvDir = Join-Path $ScriptDir ".venv"
21
+ $StateFile = Join-Path $ScriptDir ".install-state.json"
22
+ $LogDir = Join-Path $VenvDir "logs"
23
+ $ErrorSummaryFile = Join-Path $ScriptDir ".install-error-summary.json"
24
+
25
+ # Check for NON_INTERACTIVE environment variable
26
+ if ($env:NON_INTERACTIVE -eq "1") {
27
+ $Y = $true
28
+ }
29
+
30
+ # ============================================================================
31
+ # Installation Tracking Variables
32
+ # ============================================================================
33
+ $Script:INSTALLED_CRITICAL = [System.Collections.ArrayList]::new()
34
+ $Script:INSTALLED_OPTIONAL = [System.Collections.ArrayList]::new()
35
+ $Script:FAILED_OPTIONAL = [System.Collections.ArrayList]::new()
36
+ $Script:SKIPPED_ADMIN = [System.Collections.ArrayList]::new()
37
+ $Script:FINAL_EXIT_CODE = 0
38
+
39
+ # ============================================================================
40
+ # Tracking Functions
41
+ # ============================================================================
42
+ function Track-Success {
43
+ param(
44
+ [string]$Category, # "critical" or "optional"
45
+ [string]$Name
46
+ )
47
+ if ($Category -eq "critical") {
48
+ [void]$Script:INSTALLED_CRITICAL.Add($Name)
49
+ } else {
50
+ [void]$Script:INSTALLED_OPTIONAL.Add($Name)
51
+ }
52
+ }
53
+
54
+ function Track-Failure {
55
+ param(
56
+ [string]$Category, # "critical" or "optional"
57
+ [string]$Name,
58
+ [string]$Reason
59
+ )
60
+ if ($Category -eq "critical") {
61
+ $Script:FINAL_EXIT_CODE = 1
62
+ } else {
63
+ [void]$Script:FAILED_OPTIONAL.Add("${Name}: ${Reason}")
64
+ if ($Script:FINAL_EXIT_CODE -eq 0) {
65
+ $Script:FINAL_EXIT_CODE = 2
66
+ }
67
+ }
68
+ }
69
+
70
+ function Track-Skipped {
71
+ param(
72
+ [string]$Name,
73
+ [string]$Reason
74
+ )
75
+ [void]$Script:SKIPPED_ADMIN.Add("${Name}: ${Reason}")
76
+ }
77
+
78
+ # ============================================================================
79
+ # State Persistence Functions
80
+ # ============================================================================
81
+ function Initialize-State {
82
+ if ($Resume -and (Test-Path $StateFile)) {
83
+ Write-Info "Resuming from previous installation..."
84
+ return
85
+ }
86
+
87
+ # Create fresh state
88
+ $state = @{
89
+ version = 1
90
+ started_at = (Get-Date -Format "yyyy-MM-ddTHH:mm:ssZ")
91
+ last_updated = (Get-Date -Format "yyyy-MM-ddTHH:mm:ssZ")
92
+ phases = @{
93
+ chocolatey = "pending"
94
+ system_deps = "pending"
95
+ node_deps = "pending"
96
+ python_env = "pending"
97
+ verify = "pending"
98
+ }
99
+ packages = @{
100
+ installed = @()
101
+ failed = @()
102
+ skipped = @()
103
+ }
104
+ }
105
+ $state | ConvertTo-Json -Depth 5 | Set-Content $StateFile -Encoding UTF8
106
+ }
107
+
108
+ function Update-Phase {
109
+ param(
110
+ [string]$Phase,
111
+ [string]$Status
112
+ )
113
+ if (-not (Test-Path $StateFile)) {
114
+ return
115
+ }
116
+
117
+ $state = Get-Content $StateFile -Raw | ConvertFrom-Json
118
+ $state.phases.$Phase = $Status
119
+ $state.last_updated = (Get-Date -Format "yyyy-MM-ddTHH:mm:ssZ")
120
+ $state | ConvertTo-Json -Depth 5 | Set-Content $StateFile -Encoding UTF8
121
+ }
122
+
123
+ function Test-PhaseDone {
124
+ param([string]$Phase)
125
+ if (-not (Test-Path $StateFile)) {
126
+ return $false
127
+ }
128
+ $state = Get-Content $StateFile -Raw | ConvertFrom-Json
129
+ return ($state.phases.$Phase -eq "done")
130
+ }
131
+
132
+ function Remove-StateFile {
133
+ if (Test-Path $StateFile) {
134
+ Remove-Item $StateFile -Force
135
+ Write-Info "Installation state cleaned (success)"
136
+ }
137
+ }
138
+
139
+ # Colors for output
140
+ function Write-Header {
141
+ param([string]$Message)
142
+ Write-Host ""
143
+ Write-Host "===================================================" -ForegroundColor Blue
144
+ Write-Host $Message -ForegroundColor Blue
145
+ Write-Host "===================================================" -ForegroundColor Blue
146
+ Write-Host ""
147
+ }
148
+
149
+ function Write-Success {
150
+ param([string]$Message)
151
+ Write-Host "[OK] $Message" -ForegroundColor Green
152
+ }
153
+
154
+ function Write-Warning {
155
+ param([string]$Message)
156
+ Write-Host "[WARN] $Message" -ForegroundColor Yellow
157
+ }
158
+
159
+ function Write-Error {
160
+ param([string]$Message)
161
+ Write-Host "[ERROR] $Message" -ForegroundColor Red
162
+ }
163
+
164
+ function Write-Info {
165
+ param([string]$Message)
166
+ Write-Host "[INFO] $Message" -ForegroundColor Cyan
167
+ }
168
+
169
+ # Check if running as Administrator
170
+ function Test-Administrator {
171
+ $currentUser = [Security.Principal.WindowsIdentity]::GetCurrent()
172
+ $principal = New-Object Security.Principal.WindowsPrincipal($currentUser)
173
+ return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
174
+ }
175
+
176
+ # Check if command exists
177
+ function Test-Command {
178
+ param([string]$Command)
179
+ try {
180
+ if (Get-Command $Command -ErrorAction SilentlyContinue) {
181
+ return $true
182
+ }
183
+ } catch {
184
+ return $false
185
+ }
186
+ return $false
187
+ }
188
+
189
+ # Check if Visual Studio Build Tools are installed (not just in PATH)
190
+ # Returns $true if VS Build Tools are available for compilation
191
+ function Test-VSBuildTools {
192
+ # Quick check: if cl.exe or gcc is in PATH, we're good
193
+ if ((Test-Command "cl") -or (Test-Command "gcc")) {
194
+ return $true
195
+ }
196
+
197
+ # Check via vswhere.exe (most reliable method for VS detection)
198
+ $vswherePaths = @(
199
+ "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe",
200
+ "${env:ProgramFiles}\Microsoft Visual Studio\Installer\vswhere.exe"
201
+ )
202
+
203
+ foreach ($vswhere in $vswherePaths) {
204
+ if (Test-Path $vswhere) {
205
+ try {
206
+ # Check for any VS installation with C++ build tools
207
+ $vsPath = & $vswhere -latest -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath 2>$null
208
+ if ($vsPath -and (Test-Path $vsPath)) {
209
+ return $true
210
+ }
211
+ # Fallback: check for any VS installation
212
+ $vsPath = & $vswhere -latest -property installationPath 2>$null
213
+ if ($vsPath -and (Test-Path $vsPath)) {
214
+ return $true
215
+ }
216
+ } catch {
217
+ # vswhere failed, continue to fallback checks
218
+ }
219
+ }
220
+ }
221
+
222
+ # Fallback: check common VS Build Tools installation paths
223
+ $commonPaths = @(
224
+ "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2022\BuildTools",
225
+ "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2022\Community",
226
+ "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2022\Professional",
227
+ "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2022\Enterprise",
228
+ "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2019\BuildTools",
229
+ "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2019\Community"
230
+ )
231
+
232
+ foreach ($vsPath in $commonPaths) {
233
+ if (Test-Path $vsPath) {
234
+ # Check if VC tools exist in this installation
235
+ $vcToolsPath = Join-Path $vsPath "VC\Tools\MSVC"
236
+ if (Test-Path $vcToolsPath) {
237
+ return $true
238
+ }
239
+ }
240
+ }
241
+
242
+ return $false
243
+ }
244
+
245
+ # Find Python executable, handling Windows Store aliases
246
+ # Returns: hashtable with 'Path' and 'Version', or $null if not found
247
+ function Find-Python {
248
+ # Priority 1: Check py launcher first (most reliable on Windows)
249
+ $py = Get-Command py -ErrorAction SilentlyContinue
250
+ if ($py) {
251
+ try {
252
+ $version = (& py --version 2>&1)
253
+ if ($LASTEXITCODE -eq 0 -and $version -match 'Python') {
254
+ return @{ Path = $py.Source; Version = $version; Command = "py" }
255
+ }
256
+ } catch { }
257
+ }
258
+
259
+ # Priority 2: Check common Python install paths
260
+ $commonPaths = @(
261
+ "$env:LOCALAPPDATA\Programs\Python\Python3*\python.exe",
262
+ "$env:LOCALAPPDATA\Programs\Python\Python*\python.exe",
263
+ "C:\Python3*\python.exe",
264
+ "C:\Python*\python.exe",
265
+ "$env:ProgramFiles\Python3*\python.exe",
266
+ "$env:ProgramFiles\Python*\python.exe",
267
+ "$env:ProgramFiles(x86)\Python3*\python.exe"
268
+ )
269
+
270
+ foreach ($pathPattern in $commonPaths) {
271
+ $found = Get-Item $pathPattern -ErrorAction SilentlyContinue | Sort-Object Name -Descending | Select-Object -First 1
272
+ if ($found) {
273
+ try {
274
+ $version = (& $found.FullName --version 2>&1)
275
+ if ($LASTEXITCODE -eq 0 -and $version -match 'Python') {
276
+ return @{ Path = $found.FullName; Version = $version; Command = $found.FullName }
277
+ }
278
+ } catch { }
279
+ }
280
+ }
281
+
282
+ # Priority 3: Check PATH but detect Windows Store alias
283
+ $python = Get-Command python -ErrorAction SilentlyContinue
284
+ if ($python) {
285
+ # Detect Windows Store alias (points to WindowsApps)
286
+ if ($python.Source -like "*WindowsApps*") {
287
+ Write-Warning "Windows Store Python alias detected at: $($python.Source)"
288
+ Write-Warning "This alias redirects to Microsoft Store instead of running Python."
289
+ Write-Info "To fix this, either:"
290
+ Write-Info " 1. Install Python from https://www.python.org/downloads/"
291
+ Write-Info " 2. Or disable the alias: Settings > Apps > Advanced app settings > App execution aliases"
292
+ Write-Info " Then turn off 'python.exe' and 'python3.exe'"
293
+ return $null
294
+ }
295
+
296
+ # Valid Python in PATH
297
+ try {
298
+ $version = (& python --version 2>&1)
299
+ if ($LASTEXITCODE -eq 0 -and $version -match 'Python') {
300
+ return @{ Path = $python.Source; Version = $version; Command = "python" }
301
+ }
302
+ } catch { }
303
+ }
304
+
305
+ # Priority 4: Try python3 command
306
+ $python3 = Get-Command python3 -ErrorAction SilentlyContinue
307
+ if ($python3 -and -not ($python3.Source -like "*WindowsApps*")) {
308
+ try {
309
+ $version = (& python3 --version 2>&1)
310
+ if ($LASTEXITCODE -eq 0 -and $version -match 'Python') {
311
+ return @{ Path = $python3.Source; Version = $version; Command = "python3" }
312
+ }
313
+ } catch { }
314
+ }
315
+
316
+ return $null
317
+ }
318
+
319
+ # Get available package manager (priority: winget > scoop > choco)
320
+ function Get-PackageManager {
321
+ if (Test-Command "winget") { return "winget" }
322
+ if (Test-Command "scoop") { return "scoop" }
323
+ if (Test-Command "choco") { return "choco" }
324
+ return $null
325
+ }
326
+
327
+ # Install package using available package manager
328
+ # Returns $true if installed, $false if failed
329
+ # Now with tracking support
330
+ function Install-WithPackageManager {
331
+ param(
332
+ [string]$DisplayName,
333
+ [string]$WingetId,
334
+ [string]$ChocoName,
335
+ [string]$ScoopName,
336
+ [string]$ManualUrl,
337
+ [string]$Category = "optional" # "critical" or "optional"
338
+ )
339
+
340
+ $pm = Get-PackageManager
341
+
342
+ switch ($pm) {
343
+ "winget" {
344
+ Write-Info "Installing $DisplayName via winget..."
345
+ # Try user scope first, fallback to machine scope
346
+ winget install $WingetId --silent --accept-package-agreements --accept-source-agreements --scope user 2>$null
347
+ if ($LASTEXITCODE -ne 0) {
348
+ # Retry without scope restriction (some packages only support machine-wide)
349
+ winget install $WingetId --silent --accept-package-agreements --accept-source-agreements 2>$null
350
+ }
351
+ if ($LASTEXITCODE -eq 0) {
352
+ Write-Success "$DisplayName installed via winget"
353
+ Track-Success -Category $Category -Name $DisplayName
354
+ return $true
355
+ }
356
+ }
357
+ "scoop" {
358
+ Write-Info "Installing $DisplayName via scoop..."
359
+ scoop install $ScoopName 2>$null
360
+ if ($LASTEXITCODE -eq 0) {
361
+ Write-Success "$DisplayName installed via scoop"
362
+ Track-Success -Category $Category -Name $DisplayName
363
+ return $true
364
+ }
365
+ }
366
+ "choco" {
367
+ if ($WithAdmin -and (Test-Administrator)) {
368
+ Write-Info "Installing $DisplayName via chocolatey..."
369
+ choco install $ChocoName -y 2>$null
370
+ if ($LASTEXITCODE -eq 0) {
371
+ Write-Success "$DisplayName installed via chocolatey"
372
+ Track-Success -Category $Category -Name $DisplayName
373
+ return $true
374
+ }
375
+ } elseif (-not $WithAdmin) {
376
+ Write-Info "${DisplayName}: skipped (no -WithAdmin flag)"
377
+ Track-Skipped -Name $DisplayName -Reason "requires admin"
378
+ return $false
379
+ } else {
380
+ Write-Warning "Chocolatey requires admin. Skipping $DisplayName..."
381
+ Track-Skipped -Name $DisplayName -Reason "not running as admin"
382
+ return $false
383
+ }
384
+ }
385
+ }
386
+
387
+ Write-Warning "$DisplayName not installed. Install manually from: $ManualUrl"
388
+ Track-Failure -Category $Category -Name $DisplayName -Reason "installation failed"
389
+ return $false
390
+ }
391
+
392
+ # Get user input with support for redirected stdin
393
+ function Get-UserInput {
394
+ param(
395
+ [string]$Prompt,
396
+ [string]$Default = "N"
397
+ )
398
+
399
+ # Check if stdin is redirected (e.g., from Bash tool or piped input)
400
+ if ([Console]::IsInputRedirected) {
401
+ Write-Host "$Prompt " -NoNewline
402
+
403
+ # Try to read from stdin without blocking
404
+ $inputAvailable = $false
405
+ try {
406
+ $stdin = [Console]::In
407
+ # Peek returns -1 if no data available
408
+ if ($stdin.Peek() -ne -1) {
409
+ $response = $stdin.ReadLine()
410
+ $inputAvailable = $true
411
+ Write-Host $response
412
+ }
413
+ } catch {
414
+ # If peek fails, no input available
415
+ }
416
+
417
+ if ($inputAvailable -and $response) {
418
+ return $response
419
+ } else {
420
+ # No input available, use default
421
+ Write-Host $Default
422
+ Write-Warning "No input detected (stdin redirected), using default: $Default"
423
+ return $Default
424
+ }
425
+ } else {
426
+ # Normal interactive mode - use standard Read-Host
427
+ return Read-Host $Prompt
428
+ }
429
+ }
430
+
431
+ # Install Chocolatey (optional - only if admin and no better PM available)
432
+ function Install-Chocolatey {
433
+ if ($SkipChocolatey) {
434
+ Write-Warning "Skipping Chocolatey installation (--SkipChocolatey flag)"
435
+ return $false
436
+ }
437
+
438
+ if (Test-Command "choco") {
439
+ Write-Success "Chocolatey already installed"
440
+ return $true
441
+ }
442
+
443
+ # Check if we have winget/scoop - no need for choco then
444
+ if ((Test-Command "winget") -or (Test-Command "scoop")) {
445
+ $pm = Get-PackageManager
446
+ Write-Info "Using $pm as package manager (Chocolatey not needed)"
447
+ return $false
448
+ }
449
+
450
+ # Only try to install choco if we're admin and have no other PM
451
+ if (-not (Test-Administrator)) {
452
+ Write-Warning "No package manager found. Options:"
453
+ Write-Info " 1. Run as Administrator to install Chocolatey"
454
+ Write-Info " 2. Install winget (recommended): https://aka.ms/getwinget"
455
+ Write-Info " 3. Install scoop: irm get.scoop.sh | iex"
456
+ return $false
457
+ }
458
+
459
+ Write-Info "Installing Chocolatey package manager..."
460
+
461
+ # Wrap Set-ExecutionPolicy in try-catch (may fail in some PS7 environments)
462
+ try {
463
+ Set-ExecutionPolicy Bypass -Scope Process -Force
464
+ } catch {
465
+ Write-Warning "Could not set execution policy: $($_.Exception.Message)"
466
+ Write-Info "Continuing anyway - Chocolatey install may prompt for confirmation"
467
+ }
468
+
469
+ try {
470
+ [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
471
+ Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
472
+ Write-Success "Chocolatey installed"
473
+ return $true
474
+ } catch {
475
+ Write-Warning "Failed to install Chocolatey: $($_.Exception.Message)"
476
+ return $false
477
+ }
478
+ }
479
+
480
+ # Install system dependencies
481
+ function Install-SystemDeps {
482
+ Write-Header "Installing System Dependencies"
483
+
484
+ $pm = Get-PackageManager
485
+ if ($pm) {
486
+ Write-Info "Using package manager: $pm"
487
+ } else {
488
+ Write-Warning "No package manager found. Will provide manual install instructions."
489
+ }
490
+
491
+ # FFmpeg
492
+ if (Test-Command "ffmpeg") {
493
+ $ffmpegVersion = (ffmpeg -version 2>&1 | Select-Object -First 1)
494
+ Write-Success "FFmpeg already installed ($ffmpegVersion)"
495
+ Track-Success -Category "optional" -Name "FFmpeg"
496
+ } else {
497
+ $null = Install-WithPackageManager `
498
+ -DisplayName "FFmpeg" `
499
+ -WingetId "Gyan.FFmpeg" `
500
+ -ChocoName "ffmpeg" `
501
+ -ScoopName "ffmpeg" `
502
+ -ManualUrl "https://ffmpeg.org/download.html" `
503
+ -Category "optional"
504
+ }
505
+
506
+ # ImageMagick
507
+ if (Test-Command "magick") {
508
+ Write-Success "ImageMagick already installed"
509
+ Track-Success -Category "optional" -Name "ImageMagick"
510
+ } else {
511
+ $null = Install-WithPackageManager `
512
+ -DisplayName "ImageMagick" `
513
+ -WingetId "ImageMagick.ImageMagick" `
514
+ -ChocoName "imagemagick" `
515
+ -ScoopName "imagemagick" `
516
+ -ManualUrl "https://imagemagick.org/script/download.php" `
517
+ -Category "optional"
518
+ }
519
+
520
+ # Docker (optional)
521
+ if (Test-Command "docker") {
522
+ $dockerVersion = (docker --version)
523
+ Write-Success "Docker already installed ($dockerVersion)"
524
+ Track-Success -Category "optional" -Name "Docker"
525
+ } else {
526
+ Write-Warning "Docker not found. Skipping (optional)..."
527
+ Write-Info "Install Docker from: https://docs.docker.com/desktop/install/windows-install/"
528
+ }
529
+ }
530
+
531
+ # Install Node.js and npm packages
532
+ function Install-NodeDeps {
533
+ Write-Header "Installing Node.js Dependencies"
534
+
535
+ # Check Node.js
536
+ if (Test-Command "node") {
537
+ $nodeVersion = (node --version)
538
+ Write-Success "Node.js already installed ($nodeVersion)"
539
+ } else {
540
+ $installed = Install-WithPackageManager `
541
+ -DisplayName "Node.js" `
542
+ -WingetId "OpenJS.NodeJS.LTS" `
543
+ -ChocoName "nodejs-lts" `
544
+ -ScoopName "nodejs-lts" `
545
+ -ManualUrl "https://nodejs.org/"
546
+
547
+ if (-not $installed) {
548
+ Write-Error "Node.js is required but could not be installed"
549
+ Write-Info "Please install Node.js manually and re-run this script"
550
+ exit 1
551
+ }
552
+
553
+ # Refresh PATH after Node.js install
554
+ $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
555
+ }
556
+
557
+ # Install global npm packages
558
+ Write-Info "Installing global npm packages..."
559
+
560
+ $npmPackages = @(
561
+ "rmbg-cli",
562
+ "pnpm",
563
+ "wrangler",
564
+ "repomix"
565
+ )
566
+
567
+ foreach ($package in $npmPackages) {
568
+ try {
569
+ $installed = npm list -g $package 2>&1
570
+ if ($LASTEXITCODE -eq 0) {
571
+ Write-Success "$package already installed"
572
+ } else {
573
+ Write-Info "Installing $package..."
574
+ npm install -g $package
575
+ Write-Success "$package installed"
576
+ }
577
+ } catch {
578
+ Write-Info "Installing $package..."
579
+ npm install -g $package
580
+ Write-Success "$package installed"
581
+ }
582
+ }
583
+
584
+ # Install local npm packages for skills
585
+ Write-Info "Installing local npm packages for skills..."
586
+
587
+ # chrome-devtools
588
+ $chromeDevToolsPath = Join-Path $ScriptDir "chrome-devtools\scripts"
589
+ $chromePackageJson = Join-Path $chromeDevToolsPath "package.json"
590
+ if ((Test-Path $chromeDevToolsPath) -and (Test-Path $chromePackageJson)) {
591
+ Write-Info "Installing chrome-devtools dependencies..."
592
+ Push-Location $chromeDevToolsPath
593
+ npm install --quiet
594
+ Pop-Location
595
+ Write-Success "chrome-devtools dependencies installed"
596
+ }
597
+
598
+ # sequential-thinking
599
+ $seqThinkingPath = Join-Path $ScriptDir "sequential-thinking"
600
+ $seqPackageJson = Join-Path $seqThinkingPath "package.json"
601
+ if ((Test-Path $seqThinkingPath) -and (Test-Path $seqPackageJson)) {
602
+ Write-Info "Installing sequential-thinking dependencies..."
603
+ Push-Location $seqThinkingPath
604
+ npm install --quiet
605
+ Pop-Location
606
+ Write-Success "sequential-thinking dependencies installed"
607
+ }
608
+
609
+ # mcp-management
610
+ $mcpManagementPath = Join-Path $ScriptDir "mcp-management\scripts"
611
+ $mcpPackageJson = Join-Path $mcpManagementPath "package.json"
612
+ if ((Test-Path $mcpManagementPath) -and (Test-Path $mcpPackageJson)) {
613
+ Write-Info "Installing mcp-management dependencies..."
614
+ Push-Location $mcpManagementPath
615
+ npm install --quiet
616
+ Pop-Location
617
+ Write-Success "mcp-management dependencies installed"
618
+ }
619
+
620
+ # markdown-novel-viewer (marked, highlight.js, gray-matter)
621
+ $novelViewerPath = Join-Path $ScriptDir "markdown-novel-viewer"
622
+ $novelViewerPackageJson = Join-Path $novelViewerPath "package.json"
623
+ if ((Test-Path $novelViewerPath) -and (Test-Path $novelViewerPackageJson)) {
624
+ Write-Info "Installing markdown-novel-viewer dependencies..."
625
+ Push-Location $novelViewerPath
626
+ npm install --quiet
627
+ Pop-Location
628
+ Write-Success "markdown-novel-viewer dependencies installed"
629
+ }
630
+
631
+ # plans-kanban (gray-matter)
632
+ $plansKanbanPath = Join-Path $ScriptDir "plans-kanban"
633
+ $plansKanbanPackageJson = Join-Path $plansKanbanPath "package.json"
634
+ if ((Test-Path $plansKanbanPath) -and (Test-Path $plansKanbanPackageJson)) {
635
+ Write-Info "Installing plans-kanban dependencies..."
636
+ Push-Location $plansKanbanPath
637
+ npm install --quiet
638
+ Pop-Location
639
+ Write-Success "plans-kanban dependencies installed"
640
+ }
641
+
642
+ # Optional: Shopify CLI (ask user unless auto-confirming)
643
+ $shopifyPath = Join-Path $ScriptDir "shopify"
644
+ if (Test-Path $shopifyPath) {
645
+ if ($Y) {
646
+ Write-Info "Skipping Shopify CLI installation (optional, use -Y to install all)"
647
+ } else {
648
+ $confirmation = Get-UserInput -Prompt "Install Shopify CLI for Shopify skill? (y/N)" -Default "N"
649
+ if ($confirmation -eq 'y' -or $confirmation -eq 'Y') {
650
+ Write-Info "Installing Shopify CLI..."
651
+ npm install -g @shopify/cli @shopify/theme
652
+ Write-Success "Shopify CLI installed"
653
+ }
654
+ }
655
+ }
656
+ }
657
+
658
+ # Try pip install with wheel-first fallback
659
+ # Returns $true if successful, $false otherwise
660
+ function Try-PipInstall {
661
+ param(
662
+ [string]$PackageSpec,
663
+ [string]$LogFile
664
+ )
665
+
666
+ $packageName = ($PackageSpec -split '[=<>]')[0]
667
+
668
+ # Phase 1: Try with prefer-binary (wheels first)
669
+ $output = pip install $PackageSpec --prefer-binary 2>&1
670
+ $output | Out-File -Append $LogFile -Encoding UTF8
671
+ if ($LASTEXITCODE -eq 0) {
672
+ return $true
673
+ }
674
+
675
+ # Phase 2: Check if we can build from source (uses vswhere for proper VS detection)
676
+ if (-not (Test-VSBuildTools)) {
677
+ Write-Warning "${packageName}: No wheel available, no build tools detected"
678
+ Write-Info "Install Visual Studio Build Tools from: https://visualstudio.microsoft.com/visual-cpp-build-tools/"
679
+ return $false
680
+ }
681
+
682
+ # Phase 3: Try source build
683
+ Write-Info "Trying source build for $packageName..."
684
+ $output = pip install $PackageSpec --no-binary $packageName 2>&1
685
+ $output | Out-File -Append $LogFile -Encoding UTF8
686
+ if ($LASTEXITCODE -eq 0) {
687
+ Write-Success "$packageName installed (source build)"
688
+ return $true
689
+ }
690
+
691
+ Write-Error "${packageName}: Both wheel and source build failed"
692
+ return $false
693
+ }
694
+
695
+ # Setup Python virtual environment
696
+ function Setup-PythonEnv {
697
+ Write-Header "Setting Up Python Environment"
698
+
699
+ # Track successful and failed installations
700
+ $successfulSkills = [System.Collections.ArrayList]::new()
701
+ $failedSkills = [System.Collections.ArrayList]::new()
702
+
703
+ # Find Python using robust detection (handles Windows Store aliases)
704
+ $pythonInfo = Find-Python
705
+ if ($pythonInfo) {
706
+ Write-Success "Python found ($($pythonInfo.Version))"
707
+ Write-Info "Using: $($pythonInfo.Command)"
708
+ $pythonCmd = $pythonInfo.Command
709
+ } else {
710
+ Write-Error "Python not found or only Windows Store alias detected."
711
+ Write-Info "Please install Python 3.7+ from: https://www.python.org/downloads/"
712
+ Write-Info "Make sure to check 'Add Python to PATH' during installation"
713
+ Track-Failure -Category "critical" -Name "Python" -Reason "not installed or Store alias"
714
+ return # Don't exit, return and let final report show
715
+ }
716
+
717
+ # Create virtual environment
718
+ if (Test-Path $VenvDir) {
719
+ # Verify venv is valid
720
+ $activateScript = Join-Path $VenvDir "Scripts\Activate.ps1"
721
+ $pythonExe = Join-Path $VenvDir "Scripts\python.exe"
722
+ if ((Test-Path $activateScript) -and (Test-Path $pythonExe)) {
723
+ Write-Success "Virtual environment already exists at $VenvDir"
724
+ } else {
725
+ Write-Warning "Virtual environment is corrupted. Recreating..."
726
+ Remove-Item -Recurse -Force $VenvDir
727
+ & $pythonCmd -m venv $VenvDir
728
+ Write-Success "Virtual environment recreated"
729
+ }
730
+ } else {
731
+ Write-Info "Creating virtual environment at $VenvDir..."
732
+ & $pythonCmd -m venv $VenvDir
733
+ if ($LASTEXITCODE -eq 0) {
734
+ Write-Success "Virtual environment created"
735
+ } else {
736
+ Write-Error "Failed to create virtual environment"
737
+ Track-Failure -Category "critical" -Name "Python venv" -Reason "venv creation failed"
738
+ return
739
+ }
740
+ }
741
+
742
+ # Create log directory
743
+ if (-not (Test-Path $LogDir)) {
744
+ New-Item -ItemType Directory -Path $LogDir -Force | Out-Null
745
+ }
746
+
747
+ # Activate and install packages
748
+ Write-Info "Activating virtual environment..."
749
+ $activateScript = Join-Path $VenvDir "Scripts\Activate.ps1"
750
+
751
+ if (Test-Path $activateScript) {
752
+ & $activateScript
753
+ } else {
754
+ Write-Error "Failed to find activation script at $activateScript"
755
+ Track-Failure -Category "critical" -Name "Python venv" -Reason "activation failed"
756
+ return
757
+ }
758
+
759
+ # Upgrade pip with prefer-binary
760
+ Write-Info "Upgrading pip..."
761
+ $pipLogFile = Join-Path $LogDir "pip-upgrade.log"
762
+ pip install --upgrade pip --prefer-binary 2>&1 | Tee-Object -FilePath $pipLogFile
763
+ if ($LASTEXITCODE -eq 0) {
764
+ Write-Success "pip upgraded successfully"
765
+ } else {
766
+ Write-Warning "pip upgrade failed (continuing anyway)"
767
+ Write-Info "See log: $pipLogFile"
768
+ }
769
+
770
+ # Install dependencies from all skills' requirements.txt files
771
+ Write-Info "Installing Python dependencies from all skills..."
772
+
773
+ $installedCount = 0
774
+ Get-ChildItem -Path $ScriptDir -Directory | ForEach-Object {
775
+ $skillName = $_.Name
776
+
777
+ # Skip .venv and document-skills
778
+ if ($skillName -eq ".venv" -or $skillName -eq "document-skills") {
779
+ return
780
+ }
781
+
782
+ # Install main requirements.txt with wheel-first approach
783
+ $requirementsPath = Join-Path $_.FullName "scripts\requirements.txt"
784
+ if (Test-Path $requirementsPath) {
785
+ $skillLogFile = Join-Path $LogDir "install-${skillName}.log"
786
+ Write-Info "Installing $skillName dependencies..."
787
+
788
+ # Read requirements and install one-by-one for granular tracking
789
+ $pkgSuccess = 0
790
+ $pkgFail = 0
791
+ Get-Content $requirementsPath | ForEach-Object {
792
+ $line = $_.Trim()
793
+ # Skip comments and empty lines
794
+ if ($line -match '^#' -or [string]::IsNullOrWhiteSpace($line)) {
795
+ return
796
+ }
797
+
798
+ # Strip inline comments (e.g., "package>=1.0 # comment" -> "package>=1.0")
799
+ $line = ($line -split '#')[0].Trim()
800
+ if ([string]::IsNullOrWhiteSpace($line)) {
801
+ return
802
+ }
803
+
804
+ if (Try-PipInstall -PackageSpec $line -LogFile $skillLogFile) {
805
+ $pkgSuccess++
806
+ } else {
807
+ $pkgFail++
808
+ Track-Failure -Category "optional" -Name "${skillName}:${line}" -Reason "Package install failed"
809
+ }
810
+ }
811
+
812
+ if ($pkgFail -eq 0) {
813
+ Write-Success "${skillName}: all $pkgSuccess packages installed"
814
+ Track-Success -Category "optional" -Name $skillName
815
+ [void]$successfulSkills.Add($skillName)
816
+ $installedCount++
817
+ } else {
818
+ Write-Warning "${skillName}: $pkgSuccess installed, $pkgFail failed"
819
+ [void]$failedSkills.Add($skillName)
820
+ }
821
+ }
822
+
823
+ # Install test requirements.txt
824
+ $testRequirementsPath = Join-Path $_.FullName "scripts\tests\requirements.txt"
825
+ if (Test-Path $testRequirementsPath) {
826
+ $testLogFile = Join-Path $LogDir "install-${skillName}-tests.log"
827
+ Write-Info "Installing $skillName test dependencies..."
828
+
829
+ pip install -r $testRequirementsPath --prefer-binary 2>&1 | Tee-Object -FilePath $testLogFile
830
+ if ($LASTEXITCODE -eq 0) {
831
+ Write-Success "$skillName test dependencies installed successfully"
832
+ } else {
833
+ Write-Warning "$skillName test dependencies failed to install"
834
+ }
835
+ }
836
+ }
837
+
838
+ # Install %USERPROFILE%/.claude/scripts requirements (contains pyyaml for generate_catalogs.py)
839
+ $scriptsReqPath = Join-Path $ScriptDir "..\scripts\requirements.txt"
840
+ if (Test-Path $scriptsReqPath) {
841
+ $scriptsLogFile = Join-Path $LogDir "install-scripts.log"
842
+ Write-Info "Installing %USERPROFILE%/.claude/scripts dependencies..."
843
+
844
+ $pkgSuccess = 0
845
+ $pkgFail = 0
846
+ Get-Content $scriptsReqPath | ForEach-Object {
847
+ $line = $_.Trim()
848
+ if ($line -match '^#' -or [string]::IsNullOrWhiteSpace($line)) {
849
+ return
850
+ }
851
+ $line = ($line -split '#')[0].Trim()
852
+ if ([string]::IsNullOrWhiteSpace($line)) {
853
+ return
854
+ }
855
+
856
+ if (Try-PipInstall -PackageSpec $line -LogFile $scriptsLogFile) {
857
+ $pkgSuccess++
858
+ } else {
859
+ $pkgFail++
860
+ Track-Failure -Category "optional" -Name "scripts:${line}" -Reason "Package install failed"
861
+ }
862
+ }
863
+
864
+ if ($pkgFail -eq 0) {
865
+ Write-Success "%USERPROFILE%/.claude/scripts: all $pkgSuccess packages installed"
866
+ Track-Success -Category "optional" -Name "scripts"
867
+ } else {
868
+ Write-Warning "%USERPROFILE%/.claude/scripts: $pkgSuccess installed, $pkgFail failed"
869
+ }
870
+ }
871
+
872
+ # Print installation summary (brief - final report comes later)
873
+ Write-Header "Python Dependencies Installation Summary"
874
+
875
+ if ($successfulSkills.Count -gt 0) {
876
+ Write-Success "Successfully installed $($successfulSkills.Count) skill(s)"
877
+ }
878
+
879
+ if ($failedSkills.Count -gt 0) {
880
+ Write-Warning "$($failedSkills.Count) skill(s) had package failures (see final report)"
881
+ } elseif ($successfulSkills.Count -eq 0) {
882
+ Write-Warning "No skill requirements.txt files found"
883
+ } else {
884
+ Write-Success "All Python dependencies installed successfully"
885
+ }
886
+
887
+ deactivate
888
+ }
889
+
890
+ # Verify installations
891
+ function Test-Installations {
892
+ Write-Header "Verifying Installations"
893
+
894
+ $tools = @{
895
+ "ffmpeg" = "FFmpeg"
896
+ "magick" = "ImageMagick"
897
+ "node" = "Node.js"
898
+ "npm" = "npm"
899
+ }
900
+
901
+ foreach ($tool in $tools.GetEnumerator()) {
902
+ if (Test-Command $tool.Key) {
903
+ Write-Success "$($tool.Value) is available"
904
+ } else {
905
+ Write-Warning "$($tool.Value) is not available"
906
+ }
907
+ }
908
+
909
+ $npmPackages = @("rmbg", "pnpm", "wrangler", "repomix")
910
+ foreach ($package in $npmPackages) {
911
+ if (Test-Command $package) {
912
+ Write-Success "$package CLI is available"
913
+ } else {
914
+ Write-Warning "$package CLI is not available"
915
+ }
916
+ }
917
+
918
+ # Check Python packages
919
+ if (Test-Path $VenvDir) {
920
+ $activateScript = Join-Path $VenvDir "Scripts\Activate.ps1"
921
+ & $activateScript
922
+
923
+ try {
924
+ python -c "import google.genai" 2>$null
925
+ if ($LASTEXITCODE -eq 0) {
926
+ Write-Success "google-genai Python package is available"
927
+ } else {
928
+ Write-Warning "google-genai Python package is not available"
929
+ }
930
+ } catch {
931
+ Write-Warning "google-genai Python package is not available"
932
+ }
933
+
934
+ deactivate
935
+ }
936
+ }
937
+
938
+ # ============================================================================
939
+ # Final Report Functions
940
+ # ============================================================================
941
+
942
+ function Get-RemediationCommands {
943
+ $hasSudoSkipped = $Script:SKIPPED_ADMIN.Count -gt 0
944
+ $hasPythonFailed = $Script:FAILED_OPTIONAL.Count -gt 0
945
+
946
+ if (-not $hasSudoSkipped -and -not $hasPythonFailed) {
947
+ return
948
+ }
949
+
950
+ Write-Host ""
951
+ Write-Host "---------------------------------------------------" -ForegroundColor Blue
952
+ Write-Host "Manual Installation Commands:" -ForegroundColor Blue
953
+ Write-Host "---------------------------------------------------" -ForegroundColor Blue
954
+ Write-Host ""
955
+
956
+ if ($hasSudoSkipped) {
957
+ Write-Host "# System packages (use winget or scoop):"
958
+ foreach ($item in $Script:SKIPPED_ADMIN) {
959
+ $pkg = ($item -split ':')[0]
960
+ switch ($pkg) {
961
+ "FFmpeg" { Write-Host "winget install Gyan.FFmpeg" }
962
+ "ImageMagick" { Write-Host "winget install ImageMagick.ImageMagick" }
963
+ default { Write-Host "# ${pkg}: see documentation" }
964
+ }
965
+ }
966
+ Write-Host ""
967
+ }
968
+
969
+ if ($hasPythonFailed) {
970
+ Write-Host "# Python packages (may require build tools):"
971
+ Write-Host "# Install Visual Studio Build Tools: https://visualstudio.microsoft.com/visual-cpp-build-tools/"
972
+ Write-Host ".\.claude\skills\.venv\Scripts\Activate.ps1"
973
+
974
+ foreach ($item in $Script:FAILED_OPTIONAL) {
975
+ $pkg = ($item -split ':')[0]
976
+ # Extract package name from skill:package format
977
+ if ($pkg -match ':') {
978
+ $pkg = ($pkg -split ':')[1]
979
+ }
980
+ Write-Host "pip install $pkg"
981
+ }
982
+ Write-Host ""
983
+ }
984
+ }
985
+
986
+ function Write-FinalReport {
987
+ Write-Host ""
988
+ Write-Host "===================================================" -ForegroundColor Blue
989
+ Write-Host " Installation Report" -ForegroundColor Blue
990
+ Write-Host "===================================================" -ForegroundColor Blue
991
+ Write-Host ""
992
+
993
+ # Installed section
994
+ $installedCount = $Script:INSTALLED_CRITICAL.Count + $Script:INSTALLED_OPTIONAL.Count
995
+ if ($installedCount -gt 0) {
996
+ Write-Host "Installed ($installedCount):" -ForegroundColor Green
997
+ foreach ($item in $Script:INSTALLED_CRITICAL) {
998
+ Write-Host " [OK] $item" -ForegroundColor Green
999
+ }
1000
+ foreach ($item in $Script:INSTALLED_OPTIONAL) {
1001
+ Write-Host " [OK] $item" -ForegroundColor Green
1002
+ }
1003
+ Write-Host ""
1004
+ }
1005
+
1006
+ # Skipped section
1007
+ if ($Script:SKIPPED_ADMIN.Count -gt 0) {
1008
+ Write-Host "Skipped ($($Script:SKIPPED_ADMIN.Count)):" -ForegroundColor Yellow
1009
+ foreach ($item in $Script:SKIPPED_ADMIN) {
1010
+ $name = ($item -split ':')[0]
1011
+ $reason = ($item -split ':')[1]
1012
+ Write-Host " [~] $name ($reason)" -ForegroundColor Yellow
1013
+ }
1014
+ Write-Host ""
1015
+ }
1016
+
1017
+ # Degraded/Failed section
1018
+ if ($Script:FAILED_OPTIONAL.Count -gt 0) {
1019
+ Write-Host "Degraded ($($Script:FAILED_OPTIONAL.Count)):" -ForegroundColor Red
1020
+ foreach ($item in $Script:FAILED_OPTIONAL) {
1021
+ $name = ($item -split ':')[0]
1022
+ $reason = ($item -split ':')[1]
1023
+ Write-Host " [!] $name ($reason)" -ForegroundColor Red
1024
+ }
1025
+ Write-Host ""
1026
+ }
1027
+
1028
+ # Remediation commands
1029
+ Get-RemediationCommands
1030
+
1031
+ # Exit status line
1032
+ Write-Host "===================================================" -ForegroundColor Blue
1033
+ switch ($Script:FINAL_EXIT_CODE) {
1034
+ 0 { Write-Host " Exit: 0 (success - all dependencies installed)" -ForegroundColor Green }
1035
+ 1 { Write-Host " Exit: 1 (failed - critical dependencies missing)" -ForegroundColor Red }
1036
+ 2 { Write-Host " Exit: 2 (partial - some optional deps failed)" -ForegroundColor Yellow }
1037
+ }
1038
+ Write-Host "===================================================" -ForegroundColor Blue
1039
+ Write-Host ""
1040
+ }
1041
+
1042
+ function Write-ErrorSummary {
1043
+ # Only write if there are failures
1044
+ if ($Script:FINAL_EXIT_CODE -eq 0) {
1045
+ return
1046
+ }
1047
+
1048
+ # Build JSON structure
1049
+ $summary = @{
1050
+ exit_code = $Script:FINAL_EXIT_CODE
1051
+ timestamp = (Get-Date -Format "yyyy-MM-ddTHH:mm:ssZ")
1052
+ critical_failures = @()
1053
+ optional_failures = @($Script:FAILED_OPTIONAL)
1054
+ skipped = @($Script:SKIPPED_ADMIN)
1055
+ remediation = @{
1056
+ winget_packages = "winget install Gyan.FFmpeg ImageMagick.ImageMagick"
1057
+ build_tools = "https://visualstudio.microsoft.com/visual-cpp-build-tools/"
1058
+ pip_retry = ".\.claude\skills\.venv\Scripts\Activate.ps1; pip install <package>"
1059
+ }
1060
+ }
1061
+
1062
+ # Use Out-File with UTF8NoBOM for proper JSON encoding (PS 6+) or UTF8 (PS 5)
1063
+ $jsonContent = $summary | ConvertTo-Json -Depth 5
1064
+ if ($PSVersionTable.PSVersion.Major -ge 6) {
1065
+ $jsonContent | Out-File -FilePath $ErrorSummaryFile -Encoding utf8NoBOM -NoNewline
1066
+ } else {
1067
+ # PowerShell 5.x: Use .NET to write UTF-8 without BOM
1068
+ [System.IO.File]::WriteAllText($ErrorSummaryFile, $jsonContent, [System.Text.UTF8Encoding]::new($false))
1069
+ }
1070
+ Write-Info "Error summary written to: $ErrorSummaryFile"
1071
+ }
1072
+
1073
+ # Print usage instructions (now just brief tips)
1074
+ function Show-Usage {
1075
+ Write-Host "To use the Python virtual environment:" -ForegroundColor Green
1076
+ Write-Host " .\.claude\skills\.venv\Scripts\Activate.ps1"
1077
+ Write-Host ""
1078
+ Write-Host "For more information, see:" -ForegroundColor Blue
1079
+ Write-Host " .claude\skills\INSTALLATION.md"
1080
+ Write-Host ""
1081
+ }
1082
+
1083
+ # Show help
1084
+ function Show-Help {
1085
+ Write-Host "Claude Code Skills Installation Script for Windows"
1086
+ Write-Host ""
1087
+ Write-Host "Usage:"
1088
+ Write-Host " .\install.ps1 [Options]"
1089
+ Write-Host ""
1090
+ Write-Host "Options:"
1091
+ Write-Host " -Y Skip all prompts and auto-confirm installation"
1092
+ Write-Host " -WithAdmin Use admin-requiring package managers (chocolatey)"
1093
+ Write-Host " -Resume Resume from previous interrupted installation"
1094
+ Write-Host " -RetryFailed Retry previously failed packages"
1095
+ Write-Host " -SkipChocolatey Skip Chocolatey installation (uses winget/scoop instead)"
1096
+ Write-Host " -Help Show this help message"
1097
+ Write-Host ""
1098
+ Write-Host "Exit Codes:"
1099
+ Write-Host " 0 Success (all dependencies installed)"
1100
+ Write-Host " 1 Fatal error (critical dependencies missing)"
1101
+ Write-Host " 2 Partial success (some optional deps failed)"
1102
+ Write-Host ""
1103
+ Write-Host "Examples:"
1104
+ Write-Host " .\install.ps1 # Normal install"
1105
+ Write-Host " .\install.ps1 -Y # Non-interactive"
1106
+ Write-Host " .\install.ps1 -WithAdmin # Use chocolatey if admin"
1107
+ Write-Host " .\install.ps1 -Resume # Resume interrupted install"
1108
+ Write-Host ""
1109
+ Write-Host "Package Manager Priority:"
1110
+ Write-Host " 1. winget (recommended, no admin required)"
1111
+ Write-Host " 2. scoop (no admin required)"
1112
+ Write-Host " 3. chocolatey (requires admin + -WithAdmin flag)"
1113
+ Write-Host ""
1114
+ Write-Host "Requirements:"
1115
+ Write-Host " - PowerShell 5.1 or higher"
1116
+ Write-Host " - One of: winget, scoop, or chocolatey (admin)"
1117
+ Write-Host ""
1118
+ }
1119
+
1120
+ # Main installation flow
1121
+ function Main {
1122
+ if ($Help) {
1123
+ Show-Help
1124
+ exit 0
1125
+ }
1126
+
1127
+ Write-Host "" # Just add spacing, don't clear terminal
1128
+ Write-Header "Claude Code Skills Installation (Windows)"
1129
+ Write-Info "Script directory: $ScriptDir"
1130
+
1131
+ # Show detected package manager
1132
+ $pm = Get-PackageManager
1133
+ if ($pm) {
1134
+ Write-Success "Detected package manager: $pm"
1135
+ } else {
1136
+ Write-Warning "No package manager detected (winget, scoop, or choco)"
1137
+ Write-Info "Install winget: https://aka.ms/getwinget"
1138
+ }
1139
+
1140
+ # Show mode info
1141
+ if ($WithAdmin) {
1142
+ Write-Info "Mode: with admin (chocolatey enabled)"
1143
+ } else {
1144
+ Write-Info "Mode: without admin (system packages may be skipped)"
1145
+ }
1146
+ if ($Resume) {
1147
+ Write-Info "Mode: resuming previous installation"
1148
+ }
1149
+ Write-Host ""
1150
+
1151
+ # Confirm installation (skip if -Y flag or NON_INTERACTIVE env is set)
1152
+ if (-not $Y) {
1153
+ $confirmation = Get-UserInput -Prompt "This will install system packages and Node.js dependencies. Continue? (y/N)" -Default "N"
1154
+ if ($confirmation -ne 'y' -and $confirmation -ne 'Y') {
1155
+ Write-Warning "Installation cancelled"
1156
+ exit 0
1157
+ }
1158
+ } else {
1159
+ Write-Info "Auto-confirming installation (-Y flag or NON_INTERACTIVE mode)"
1160
+ }
1161
+
1162
+ # Initialize state tracking
1163
+ Initialize-State
1164
+
1165
+ # Phase 1: Chocolatey (optional)
1166
+ if (-not (Test-PhaseDone "chocolatey")) {
1167
+ Update-Phase "chocolatey" "running"
1168
+ $null = Install-Chocolatey
1169
+ Update-Phase "chocolatey" "done"
1170
+ }
1171
+
1172
+ # Phase 2: System deps
1173
+ if (Test-PhaseDone "system_deps") {
1174
+ Write-Success "System deps: already processed (resume)"
1175
+ } else {
1176
+ Update-Phase "system_deps" "running"
1177
+ Install-SystemDeps
1178
+ Update-Phase "system_deps" "done"
1179
+ }
1180
+
1181
+ # Phase 3: Node deps
1182
+ if (Test-PhaseDone "node_deps") {
1183
+ Write-Success "Node deps: already installed (resume)"
1184
+ } else {
1185
+ Update-Phase "node_deps" "running"
1186
+ Install-NodeDeps
1187
+ Update-Phase "node_deps" "done"
1188
+ }
1189
+
1190
+ # Phase 4: Python env
1191
+ if (Test-PhaseDone "python_env") {
1192
+ Write-Success "Python env: already set up (resume)"
1193
+ } else {
1194
+ Update-Phase "python_env" "running"
1195
+ Setup-PythonEnv
1196
+ Update-Phase "python_env" "done"
1197
+ }
1198
+
1199
+ # Phase 5: Verify
1200
+ Update-Phase "verify" "running"
1201
+ Test-Installations
1202
+ Update-Phase "verify" "done"
1203
+
1204
+ # Print final report with all tracking info
1205
+ Write-FinalReport
1206
+ Show-Usage
1207
+
1208
+ # Write error summary for CLI to parse
1209
+ Write-ErrorSummary
1210
+
1211
+ # Clean state on complete success
1212
+ if ($Script:FINAL_EXIT_CODE -eq 0) {
1213
+ Remove-StateFile
1214
+ }
1215
+
1216
+ exit $Script:FINAL_EXIT_CODE
1217
+ }
1218
+
1219
+ # Run main function
1220
+ Main