@aslomon/effectum 0.3.3 → 0.4.0

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 (359) hide show
  1. package/bin/install.js +68 -4
  2. package/bin/lib/cli-tools.js +288 -0
  3. package/bin/lib/specializations.js +11 -1
  4. package/bin/lib/template.js +14 -0
  5. package/bin/lib/ui.js +109 -0
  6. package/package.json +1 -1
  7. package/system/agents/data-engineer.md +268 -0
  8. package/system/agents/mobile-developer.md +257 -0
  9. package/system/hooks/observe.sh +164 -0
  10. package/system/hooks/quick-diff.sh +87 -0
  11. package/system/hooks/save-results.sh +56 -0
  12. package/system/hooks/scan.sh +170 -0
  13. package/system/skills/README.md +86 -0
  14. package/system/skills/SKILL.md +117 -0
  15. package/system/skills/agents/observer.md +137 -0
  16. package/system/skills/agents/start-observer.sh +143 -0
  17. package/system/skills/algorithmic-art/LICENSE.txt +202 -0
  18. package/system/skills/algorithmic-art/SKILL.md +405 -0
  19. package/system/skills/algorithmic-art/templates/generator_template.js +223 -0
  20. package/system/skills/algorithmic-art/templates/viewer.html +599 -0
  21. package/system/skills/api-endpoint/SKILL.md +106 -0
  22. package/system/skills/canvas-design/LICENSE.txt +202 -0
  23. package/system/skills/canvas-design/SKILL.md +130 -0
  24. package/system/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  25. package/system/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  26. package/system/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  27. package/system/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  28. package/system/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  29. package/system/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  30. package/system/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  31. package/system/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  32. package/system/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  33. package/system/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  34. package/system/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  35. package/system/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  36. package/system/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  37. package/system/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  38. package/system/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  39. package/system/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  40. package/system/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  41. package/system/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  42. package/system/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  43. package/system/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  44. package/system/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  45. package/system/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  46. package/system/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  47. package/system/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  48. package/system/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  49. package/system/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  50. package/system/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  51. package/system/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  52. package/system/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  53. package/system/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  54. package/system/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  55. package/system/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  56. package/system/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  57. package/system/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  58. package/system/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  59. package/system/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  60. package/system/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  61. package/system/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  62. package/system/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  63. package/system/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  64. package/system/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  65. package/system/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  66. package/system/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  67. package/system/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  68. package/system/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  69. package/system/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  70. package/system/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  71. package/system/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  72. package/system/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  73. package/system/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  74. package/system/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  75. package/system/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  76. package/system/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  77. package/system/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  78. package/system/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  79. package/system/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  80. package/system/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  81. package/system/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  82. package/system/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  83. package/system/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  84. package/system/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  85. package/system/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  86. package/system/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  87. package/system/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  88. package/system/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  89. package/system/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  90. package/system/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  91. package/system/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  92. package/system/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  93. package/system/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  94. package/system/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  95. package/system/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  96. package/system/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  97. package/system/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  98. package/system/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  99. package/system/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  100. package/system/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  101. package/system/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  102. package/system/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  103. package/system/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  104. package/system/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  105. package/system/skills/component/SKILL.md +103 -0
  106. package/system/skills/config.json +18 -0
  107. package/system/skills/doc-coauthoring/SKILL.md +375 -0
  108. package/system/skills/docx/LICENSE.txt +30 -0
  109. package/system/skills/docx/SKILL.md +590 -0
  110. package/system/skills/docx/scripts/__init__.py +1 -0
  111. package/system/skills/docx/scripts/accept_changes.py +135 -0
  112. package/system/skills/docx/scripts/comment.py +318 -0
  113. package/system/skills/docx/scripts/office/helpers/__init__.py +0 -0
  114. package/system/skills/docx/scripts/office/helpers/merge_runs.py +199 -0
  115. package/system/skills/docx/scripts/office/helpers/simplify_redlines.py +197 -0
  116. package/system/skills/docx/scripts/office/pack.py +159 -0
  117. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  118. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  119. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  120. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  121. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  122. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  123. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  124. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  125. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  126. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  127. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  128. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  129. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  130. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  131. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  132. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  133. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  134. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  135. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  136. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  137. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  138. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  139. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  140. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  141. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  142. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  143. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  144. package/system/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  145. package/system/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  146. package/system/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  147. package/system/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  148. package/system/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
  149. package/system/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  150. package/system/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  151. package/system/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  152. package/system/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  153. package/system/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  154. package/system/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  155. package/system/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  156. package/system/skills/docx/scripts/office/soffice.py +183 -0
  157. package/system/skills/docx/scripts/office/unpack.py +132 -0
  158. package/system/skills/docx/scripts/office/validate.py +111 -0
  159. package/system/skills/docx/scripts/office/validators/__init__.py +15 -0
  160. package/system/skills/docx/scripts/office/validators/base.py +847 -0
  161. package/system/skills/docx/scripts/office/validators/docx.py +446 -0
  162. package/system/skills/docx/scripts/office/validators/pptx.py +275 -0
  163. package/system/skills/docx/scripts/office/validators/redlining.py +247 -0
  164. package/system/skills/docx/scripts/templates/comments.xml +3 -0
  165. package/system/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  166. package/system/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  167. package/system/skills/docx/scripts/templates/commentsIds.xml +3 -0
  168. package/system/skills/docx/scripts/templates/people.xml +3 -0
  169. package/system/skills/evaluate-session.sh +69 -0
  170. package/system/skills/feature/SKILL.md +73 -0
  171. package/system/skills/frontend-design/LICENSE.txt +177 -0
  172. package/system/skills/frontend-design/SKILL.md +52 -0
  173. package/system/skills/hooks/observe.sh +164 -0
  174. package/system/skills/mcp-builder/LICENSE.txt +202 -0
  175. package/system/skills/mcp-builder/SKILL.md +236 -0
  176. package/system/skills/mcp-builder/reference/evaluation.md +602 -0
  177. package/system/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
  178. package/system/skills/mcp-builder/reference/node_mcp_server.md +970 -0
  179. package/system/skills/mcp-builder/reference/python_mcp_server.md +719 -0
  180. package/system/skills/mcp-builder/scripts/connections.py +151 -0
  181. package/system/skills/mcp-builder/scripts/evaluation.py +373 -0
  182. package/system/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  183. package/system/skills/mcp-builder/scripts/requirements.txt +2 -0
  184. package/system/skills/pdf/LICENSE.txt +30 -0
  185. package/system/skills/pdf/SKILL.md +314 -0
  186. package/system/skills/pdf/forms.md +294 -0
  187. package/system/skills/pdf/reference.md +612 -0
  188. package/system/skills/pdf/scripts/check_bounding_boxes.py +65 -0
  189. package/system/skills/pdf/scripts/check_fillable_fields.py +11 -0
  190. package/system/skills/pdf/scripts/convert_pdf_to_images.py +33 -0
  191. package/system/skills/pdf/scripts/create_validation_image.py +37 -0
  192. package/system/skills/pdf/scripts/extract_form_field_info.py +122 -0
  193. package/system/skills/pdf/scripts/extract_form_structure.py +115 -0
  194. package/system/skills/pdf/scripts/fill_fillable_fields.py +98 -0
  195. package/system/skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
  196. package/system/skills/pptx/LICENSE.txt +30 -0
  197. package/system/skills/pptx/SKILL.md +232 -0
  198. package/system/skills/pptx/editing.md +205 -0
  199. package/system/skills/pptx/pptxgenjs.md +420 -0
  200. package/system/skills/pptx/scripts/__init__.py +0 -0
  201. package/system/skills/pptx/scripts/add_slide.py +195 -0
  202. package/system/skills/pptx/scripts/clean.py +286 -0
  203. package/system/skills/pptx/scripts/office/helpers/__init__.py +0 -0
  204. package/system/skills/pptx/scripts/office/helpers/merge_runs.py +199 -0
  205. package/system/skills/pptx/scripts/office/helpers/simplify_redlines.py +197 -0
  206. package/system/skills/pptx/scripts/office/pack.py +159 -0
  207. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  208. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  209. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  210. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  211. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  212. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  213. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  214. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  215. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  216. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  217. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  218. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  219. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  220. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  221. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  222. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  223. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  224. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  225. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  226. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  227. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  228. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  229. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  230. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  231. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  232. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  233. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  234. package/system/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  235. package/system/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  236. package/system/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  237. package/system/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  238. package/system/skills/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
  239. package/system/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  240. package/system/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  241. package/system/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  242. package/system/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  243. package/system/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  244. package/system/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  245. package/system/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  246. package/system/skills/pptx/scripts/office/soffice.py +183 -0
  247. package/system/skills/pptx/scripts/office/unpack.py +132 -0
  248. package/system/skills/pptx/scripts/office/validate.py +111 -0
  249. package/system/skills/pptx/scripts/office/validators/__init__.py +15 -0
  250. package/system/skills/pptx/scripts/office/validators/base.py +847 -0
  251. package/system/skills/pptx/scripts/office/validators/docx.py +446 -0
  252. package/system/skills/pptx/scripts/office/validators/pptx.py +275 -0
  253. package/system/skills/pptx/scripts/office/validators/redlining.py +247 -0
  254. package/system/skills/pptx/scripts/thumbnail.py +289 -0
  255. package/system/skills/scripts/quick-diff.sh +87 -0
  256. package/system/skills/scripts/save-results.sh +56 -0
  257. package/system/skills/scripts/scan.sh +170 -0
  258. package/system/skills/security-check/SKILL.md +70 -0
  259. package/system/skills/skill-creator/LICENSE.txt +202 -0
  260. package/system/skills/skill-creator/SKILL.md +479 -0
  261. package/system/skills/skill-creator/agents/analyzer.md +274 -0
  262. package/system/skills/skill-creator/agents/comparator.md +202 -0
  263. package/system/skills/skill-creator/agents/grader.md +223 -0
  264. package/system/skills/skill-creator/assets/eval_review.html +146 -0
  265. package/system/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  266. package/system/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  267. package/system/skills/skill-creator/references/schemas.md +430 -0
  268. package/system/skills/skill-creator/scripts/__init__.py +0 -0
  269. package/system/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  270. package/system/skills/skill-creator/scripts/generate_report.py +326 -0
  271. package/system/skills/skill-creator/scripts/improve_description.py +248 -0
  272. package/system/skills/skill-creator/scripts/package_skill.py +136 -0
  273. package/system/skills/skill-creator/scripts/quick_validate.py +103 -0
  274. package/system/skills/skill-creator/scripts/run_eval.py +310 -0
  275. package/system/skills/skill-creator/scripts/run_loop.py +332 -0
  276. package/system/skills/skill-creator/scripts/utils.py +47 -0
  277. package/system/skills/suggest-compact.sh +54 -0
  278. package/system/skills/supabase-migration/SKILL.md +59 -0
  279. package/system/skills/theme-factory/LICENSE.txt +202 -0
  280. package/system/skills/theme-factory/SKILL.md +59 -0
  281. package/system/skills/theme-factory/theme-showcase.pdf +0 -0
  282. package/system/skills/theme-factory/themes/arctic-frost.md +19 -0
  283. package/system/skills/theme-factory/themes/botanical-garden.md +19 -0
  284. package/system/skills/theme-factory/themes/desert-rose.md +19 -0
  285. package/system/skills/theme-factory/themes/forest-canopy.md +19 -0
  286. package/system/skills/theme-factory/themes/golden-hour.md +19 -0
  287. package/system/skills/theme-factory/themes/midnight-galaxy.md +19 -0
  288. package/system/skills/theme-factory/themes/modern-minimalist.md +19 -0
  289. package/system/skills/theme-factory/themes/ocean-depths.md +19 -0
  290. package/system/skills/theme-factory/themes/sunset-boulevard.md +19 -0
  291. package/system/skills/theme-factory/themes/tech-innovation.md +19 -0
  292. package/system/skills/web-artifacts-builder/LICENSE.txt +202 -0
  293. package/system/skills/web-artifacts-builder/SKILL.md +74 -0
  294. package/system/skills/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  295. package/system/skills/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  296. package/system/skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  297. package/system/skills/webapp-testing/LICENSE.txt +202 -0
  298. package/system/skills/webapp-testing/SKILL.md +96 -0
  299. package/system/skills/webapp-testing/examples/console_logging.py +35 -0
  300. package/system/skills/webapp-testing/examples/element_discovery.py +40 -0
  301. package/system/skills/webapp-testing/examples/static_html_automation.py +33 -0
  302. package/system/skills/webapp-testing/scripts/with_server.py +106 -0
  303. package/system/skills/xlsx/LICENSE.txt +30 -0
  304. package/system/skills/xlsx/SKILL.md +292 -0
  305. package/system/skills/xlsx/scripts/office/helpers/__init__.py +0 -0
  306. package/system/skills/xlsx/scripts/office/helpers/merge_runs.py +199 -0
  307. package/system/skills/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
  308. package/system/skills/xlsx/scripts/office/pack.py +159 -0
  309. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  310. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  311. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  312. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  313. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  314. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  315. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  316. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  317. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  318. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  319. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  320. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  321. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  322. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  323. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  324. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  325. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  326. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  327. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  328. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  329. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  330. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  331. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  332. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  333. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  334. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  335. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  336. package/system/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  337. package/system/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  338. package/system/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  339. package/system/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  340. package/system/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
  341. package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  342. package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  343. package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  344. package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  345. package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  346. package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  347. package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  348. package/system/skills/xlsx/scripts/office/soffice.py +183 -0
  349. package/system/skills/xlsx/scripts/office/unpack.py +132 -0
  350. package/system/skills/xlsx/scripts/office/validate.py +111 -0
  351. package/system/skills/xlsx/scripts/office/validators/__init__.py +15 -0
  352. package/system/skills/xlsx/scripts/office/validators/base.py +847 -0
  353. package/system/skills/xlsx/scripts/office/validators/docx.py +446 -0
  354. package/system/skills/xlsx/scripts/office/validators/pptx.py +275 -0
  355. package/system/skills/xlsx/scripts/office/validators/redlining.py +247 -0
  356. package/system/skills/xlsx/scripts/recalc.py +184 -0
  357. package/system/teams/profiles.md +76 -0
  358. package/system/templates/CLAUDE.md.tmpl +6 -0
  359. package/system/templates/settings.json.tmpl +11 -0
package/bin/install.js CHANGED
@@ -53,6 +53,7 @@ const {
53
53
  askLanguage,
54
54
  askAutonomy,
55
55
  showRecommendation,
56
+ showCliToolCheck,
56
57
  askSetupMode,
57
58
  askCustomize,
58
59
  askManual,
@@ -61,6 +62,7 @@ const {
61
62
  showSummary,
62
63
  showOutro,
63
64
  } = require("./lib/ui");
65
+ const { checkAllTools, formatToolStatus } = require("./lib/cli-tools");
64
66
 
65
67
  // ─── File helpers ─────────────────────────────────────────────────────────────
66
68
 
@@ -306,6 +308,33 @@ function installBaseFiles(targetDir, repoRoot, isGlobal) {
306
308
  steps.push(...copyDir(agentsSrc, agentsDest, { skipExisting: true }));
307
309
  }
308
310
 
311
+ // 6. Skills
312
+ const skillsSrc = path.join(repoRoot, "system", "skills");
313
+ if (fs.existsSync(skillsSrc)) {
314
+ const skillsDest = isGlobal
315
+ ? path.join(targetDir, "skills")
316
+ : path.join(targetDir, ".claude", "skills");
317
+ steps.push(...copyDir(skillsSrc, skillsDest, { skipExisting: true }));
318
+ }
319
+
320
+ // 7. Teams (profiles for Agent Teams)
321
+ const teamsSrc = path.join(repoRoot, "system", "teams");
322
+ if (fs.existsSync(teamsSrc)) {
323
+ const teamsDest = isGlobal
324
+ ? path.join(targetDir, "teams")
325
+ : path.join(targetDir, ".claude", "teams");
326
+ steps.push(...copyDir(teamsSrc, teamsDest, { skipExisting: true }));
327
+ }
328
+
329
+ // 8. Hook scripts
330
+ const hooksSrc = path.join(repoRoot, "system", "hooks");
331
+ if (fs.existsSync(hooksSrc)) {
332
+ const hooksDest = isGlobal
333
+ ? path.join(targetDir, "hooks")
334
+ : path.join(targetDir, ".claude", "hooks");
335
+ steps.push(...copyDir(hooksSrc, hooksDest, { skipExisting: true }));
336
+ }
337
+
309
338
  return steps;
310
339
  }
311
340
 
@@ -316,7 +345,11 @@ function installRecommendedAgents(targetDir, repoRoot, recommendedAgents) {
316
345
  const agentsDest = path.join(targetDir, ".claude", "agents");
317
346
  const steps = [];
318
347
 
319
- if (!fs.existsSync(agentsSrc) || !recommendedAgents || recommendedAgents.length === 0) {
348
+ if (
349
+ !fs.existsSync(agentsSrc) ||
350
+ !recommendedAgents ||
351
+ recommendedAgents.length === 0
352
+ ) {
320
353
  return steps;
321
354
  }
322
355
 
@@ -565,6 +598,22 @@ Options:
565
598
  process.exit(0);
566
599
  }
567
600
 
601
+ // CLI tool check (report only, no install in non-interactive mode)
602
+ const toolCheck = checkAllTools(config.stack);
603
+ if (toolCheck.missing.length > 0) {
604
+ console.log("\n CLI Tool Check:");
605
+ console.log(formatToolStatus(toolCheck.tools));
606
+ console.log(
607
+ `\n ${toolCheck.missing.length} tool(s) not installed. Run installer interactively to install.`,
608
+ );
609
+ }
610
+
611
+ // Store tool status in config
612
+ config.detectedTools = toolCheck.tools.map((t) => ({
613
+ key: t.key,
614
+ installed: t.installed,
615
+ }));
616
+
568
617
  // Install base files
569
618
  installBaseFiles(targetDir, repoRoot, isGlobal);
570
619
 
@@ -582,9 +631,13 @@ Options:
582
631
  }
583
632
 
584
633
  // MCP servers — always install recommended MCPs (or explicit --with-mcp)
585
- const mcpKeys = config.mcpServers || (config.recommended ? config.recommended.mcps : []) || [];
634
+ const mcpKeys =
635
+ config.mcpServers ||
636
+ (config.recommended ? config.recommended.mcps : []) ||
637
+ [];
586
638
  if (mcpKeys.length > 0 || args.withMcp) {
587
- const keysToInstall = mcpKeys.length > 0 ? mcpKeys : MCP_SERVERS.map((s) => s.key);
639
+ const keysToInstall =
640
+ mcpKeys.length > 0 ? mcpKeys : MCP_SERVERS.map((s) => s.key);
588
641
  const mcpResults = installMcpServers(keysToInstall);
589
642
  const settingsPath = isGlobal
590
643
  ? path.join(homeClaudeDir, "settings.json")
@@ -673,6 +726,9 @@ Options:
673
726
 
674
727
  showRecommendation(rec);
675
728
 
729
+ // ── CLI Tool Check ────────────────────────────────────────────────────────
730
+ const cliToolResult = await showCliToolCheck(stack);
731
+
676
732
  // ── Step 8: Decision ──────────────────────────────────────────────────────
677
733
  const setupMode = await askSetupMode();
678
734
 
@@ -706,6 +762,10 @@ Options:
706
762
  packageManager: detected.packageManager,
707
763
  formatter: formatterDef.name,
708
764
  mcpServers: finalSetup.mcps,
765
+ detectedTools: cliToolResult.tools.map((t) => ({
766
+ key: t.key,
767
+ installed: t.installed,
768
+ })),
709
769
  playwrightBrowsers: wantPlaywright,
710
770
  installScope: "local",
711
771
  recommended: {
@@ -777,7 +837,11 @@ Options:
777
837
  if (recAgents.length > 0) {
778
838
  const sAgents = p.spinner();
779
839
  sAgents.start("Installing agent specializations...");
780
- const agentSteps = installRecommendedAgents(installTargetDir, repoRoot, recAgents);
840
+ const agentSteps = installRecommendedAgents(
841
+ installTargetDir,
842
+ repoRoot,
843
+ recAgents,
844
+ );
781
845
  const agentCount = agentSteps.filter((s) => s.status === "created").length;
782
846
  sAgents.stop(`${agentCount} agent specializations installed`);
783
847
  configSteps.push(...agentSteps);
@@ -0,0 +1,288 @@
1
+ /**
2
+ * CLI tool definitions, detection, installation, and auth checking.
3
+ *
4
+ * Each tool specifies:
5
+ * - key/bin: identifier and binary name
6
+ * - install: platform-specific install commands (darwin/linux/all)
7
+ * - auth/authSetup: commands to check and configure authentication
8
+ * - why: human-readable reason for the tool
9
+ * - foundation: true if always recommended regardless of stack
10
+ * - stacks: array of stack keys where this tool is relevant
11
+ */
12
+ "use strict";
13
+
14
+ const { spawnSync } = require("child_process");
15
+ const os = require("os");
16
+
17
+ // ─── Tool definitions ────────────────────────────────────────────────────────
18
+
19
+ const CLI_TOOLS = [
20
+ // Foundation (always recommended)
21
+ {
22
+ key: "git",
23
+ bin: "git",
24
+ install: {
25
+ darwin: "xcode-select --install",
26
+ linux: "sudo apt install -y git",
27
+ },
28
+ auth: "git config user.name && git config user.email",
29
+ authSetup:
30
+ 'git config --global user.name "Your Name" && git config --global user.email "you@example.com"',
31
+ why: "Version control — required for all projects",
32
+ foundation: true,
33
+ },
34
+ {
35
+ key: "gh",
36
+ bin: "gh",
37
+ install: { darwin: "brew install gh", linux: "sudo apt install -y gh" },
38
+ auth: "gh auth status",
39
+ authSetup: "gh auth login",
40
+ why: "GitHub: Issues, PRs, Code Search, CI status",
41
+ foundation: true,
42
+ },
43
+ // Stack-specific
44
+ {
45
+ key: "supabase",
46
+ bin: "supabase",
47
+ install: {
48
+ darwin: "brew install supabase/tap/supabase",
49
+ linux: "npm i -g supabase",
50
+ },
51
+ auth: "supabase projects list",
52
+ authSetup: "supabase login",
53
+ why: "Database migrations, type generation, edge functions",
54
+ stacks: ["nextjs-supabase"],
55
+ },
56
+ {
57
+ key: "vercel",
58
+ bin: "vercel",
59
+ install: { all: "npm i -g vercel" },
60
+ auth: "vercel whoami",
61
+ authSetup: "vercel login",
62
+ why: "Deployment to Vercel",
63
+ stacks: ["nextjs-supabase"],
64
+ },
65
+ {
66
+ key: "docker",
67
+ bin: "docker",
68
+ install: {
69
+ darwin: "brew install --cask docker",
70
+ linux: "sudo apt install -y docker.io",
71
+ },
72
+ auth: null,
73
+ why: "Container management, local dev environment",
74
+ stacks: ["python-fastapi", "generic"],
75
+ },
76
+ {
77
+ key: "uv",
78
+ bin: "uv",
79
+ install: { all: "curl -LsSf https://astral.sh/uv/install.sh | sh" },
80
+ auth: null,
81
+ why: "Fast Python package management",
82
+ stacks: ["python-fastapi"],
83
+ },
84
+ {
85
+ key: "ruff",
86
+ bin: "ruff",
87
+ install: { all: "pip install ruff" },
88
+ auth: null,
89
+ why: "Python linting and formatting",
90
+ stacks: ["python-fastapi"],
91
+ },
92
+ {
93
+ key: "xcodebuild",
94
+ bin: "xcodebuild",
95
+ install: { darwin: "xcode-select --install" },
96
+ auth: null,
97
+ why: "iOS/macOS build toolchain",
98
+ stacks: ["swift-ios"],
99
+ },
100
+ ];
101
+
102
+ // ─── Tool check ──────────────────────────────────────────────────────────────
103
+
104
+ /**
105
+ * Check if a CLI tool is installed by looking up its binary.
106
+ * @param {string} bin - binary name (e.g. "git", "gh")
107
+ * @returns {boolean}
108
+ */
109
+ function checkTool(bin) {
110
+ try {
111
+ const result = spawnSync("which", [bin], {
112
+ timeout: 5000,
113
+ stdio: "pipe",
114
+ encoding: "utf8",
115
+ });
116
+ return result.status === 0 && result.stdout.trim().length > 0;
117
+ } catch (_) {
118
+ return false;
119
+ }
120
+ }
121
+
122
+ /**
123
+ * Get the relevant tools for a given stack.
124
+ * Foundation tools are always included.
125
+ * @param {string} stack - stack key (e.g. "nextjs-supabase")
126
+ * @returns {Array<object>}
127
+ */
128
+ function getToolsForStack(stack) {
129
+ return CLI_TOOLS.filter(
130
+ (tool) => tool.foundation || (tool.stacks && tool.stacks.includes(stack)),
131
+ );
132
+ }
133
+
134
+ /**
135
+ * Check all relevant tools for a stack and return status.
136
+ * @param {string} stack
137
+ * @returns {{ tools: Array<{ key: string, bin: string, installed: boolean, why: string, install: object, auth: string|null, authSetup: string|null }>, missing: Array<object>, installed: Array<object> }}
138
+ */
139
+ function checkAllTools(stack) {
140
+ const relevant = getToolsForStack(stack);
141
+ const results = relevant.map((tool) => ({
142
+ ...tool,
143
+ installed: checkTool(tool.bin),
144
+ }));
145
+
146
+ return {
147
+ tools: results,
148
+ missing: results.filter((t) => !t.installed),
149
+ installed: results.filter((t) => t.installed),
150
+ };
151
+ }
152
+
153
+ // ─── Tool installation ───────────────────────────────────────────────────────
154
+
155
+ /**
156
+ * Get the platform key for install commands.
157
+ * @returns {"darwin"|"linux"}
158
+ */
159
+ function getPlatform() {
160
+ const p = os.platform();
161
+ return p === "darwin" ? "darwin" : "linux";
162
+ }
163
+
164
+ /**
165
+ * Get the install command for a tool on the current platform.
166
+ * @param {object} tool
167
+ * @returns {string|null}
168
+ */
169
+ function getInstallCommand(tool) {
170
+ if (!tool.install) return null;
171
+ const platform = getPlatform();
172
+ return tool.install[platform] || tool.install.all || null;
173
+ }
174
+
175
+ /**
176
+ * Install a single tool using its platform-appropriate command.
177
+ * @param {object} tool
178
+ * @returns {{ ok: boolean, command: string|null, error?: string }}
179
+ */
180
+ function installTool(tool) {
181
+ const command = getInstallCommand(tool);
182
+ if (!command) {
183
+ return {
184
+ ok: false,
185
+ command: null,
186
+ error: "No install command for this platform",
187
+ };
188
+ }
189
+
190
+ try {
191
+ const result = spawnSync("bash", ["-c", command], {
192
+ timeout: 120000,
193
+ stdio: "pipe",
194
+ encoding: "utf8",
195
+ });
196
+ if (result.status === 0) {
197
+ return { ok: true, command };
198
+ }
199
+ return { ok: false, command, error: result.stderr || "Install failed" };
200
+ } catch (err) {
201
+ return { ok: false, command, error: err.message };
202
+ }
203
+ }
204
+
205
+ // ─── Auth checking ───────────────────────────────────────────────────────────
206
+
207
+ /**
208
+ * Check if a tool is authenticated.
209
+ * @param {object} tool
210
+ * @returns {{ authenticated: boolean, needsAuth: boolean }}
211
+ */
212
+ function checkAuth(tool) {
213
+ if (!tool.auth) {
214
+ return { authenticated: true, needsAuth: false };
215
+ }
216
+
217
+ try {
218
+ const result = spawnSync("bash", ["-c", tool.auth], {
219
+ timeout: 10000,
220
+ stdio: "pipe",
221
+ encoding: "utf8",
222
+ });
223
+ return {
224
+ authenticated: result.status === 0,
225
+ needsAuth: true,
226
+ };
227
+ } catch (_) {
228
+ return { authenticated: false, needsAuth: true };
229
+ }
230
+ }
231
+
232
+ // ─── Formatting helpers ──────────────────────────────────────────────────────
233
+
234
+ /**
235
+ * Generate a human-readable tools status summary.
236
+ * @param {Array<object>} tools - tool check results
237
+ * @returns {string}
238
+ */
239
+ function formatToolStatus(tools) {
240
+ return tools
241
+ .map((t) => {
242
+ const icon = t.installed ? "\u2705" : "\u274C";
243
+ return ` ${icon} ${t.key} — ${t.why}`;
244
+ })
245
+ .join("\n");
246
+ }
247
+
248
+ /**
249
+ * Generate install instructions for missing tools.
250
+ * @param {Array<object>} missing - missing tools
251
+ * @returns {string}
252
+ */
253
+ function formatInstallInstructions(missing) {
254
+ const platform = getPlatform();
255
+ return missing
256
+ .map((t) => {
257
+ const cmd = t.install[platform] || t.install.all || "N/A";
258
+ return ` ${t.key}: ${cmd}`;
259
+ })
260
+ .join("\n");
261
+ }
262
+
263
+ /**
264
+ * Build the AVAILABLE_TOOLS section content for CLAUDE.md.
265
+ * @param {Array<object>} tools - tool check results
266
+ * @returns {string}
267
+ */
268
+ function buildAvailableToolsSection(tools) {
269
+ const lines = tools.map((t) => {
270
+ const status = t.installed ? "installed" : "not installed";
271
+ return `- **${t.key}** (${status}): ${t.why}`;
272
+ });
273
+ return lines.join("\n");
274
+ }
275
+
276
+ module.exports = {
277
+ CLI_TOOLS,
278
+ checkTool,
279
+ getToolsForStack,
280
+ checkAllTools,
281
+ getPlatform,
282
+ getInstallCommand,
283
+ installTool,
284
+ checkAuth,
285
+ formatToolStatus,
286
+ formatInstallInstructions,
287
+ buildAvailableToolsSection,
288
+ };
@@ -94,6 +94,16 @@ const SUBAGENT_SPECS = [
94
94
  label: "Code Reviewer",
95
95
  tags: ["testing-heavy", "docs-needed"],
96
96
  },
97
+ {
98
+ key: "mobile-developer",
99
+ label: "Mobile Developer",
100
+ tags: ["native-ui", "frontend-heavy", "swift"],
101
+ },
102
+ {
103
+ key: "data-engineer",
104
+ label: "Data Engineer",
105
+ tags: ["data-pipeline", "compute-heavy", "analytics"],
106
+ },
97
107
  ];
98
108
 
99
109
  /**
@@ -116,7 +126,7 @@ const STACK_SUBAGENTS = {
116
126
  "test-automator",
117
127
  "api-designer",
118
128
  ],
119
- "swift-ios": ["ui-designer", "test-automator"],
129
+ "swift-ios": ["ui-designer", "test-automator", "mobile-developer"],
120
130
  generic: ["debugger", "test-automator"],
121
131
  };
122
132
 
@@ -9,6 +9,7 @@ const fs = require("fs");
9
9
  const path = require("path");
10
10
  const { FORMATTER_MAP } = require("./constants");
11
11
  const { LANGUAGE_INSTRUCTIONS } = require("./languages");
12
+ const { getToolsForStack, checkTool } = require("./cli-tools");
12
13
 
13
14
  /**
14
15
  * Build a substitution map from user config and parsed stack sections.
@@ -23,6 +24,18 @@ function buildSubstitutionMap(config, stackSections) {
23
24
  config.customLanguage ||
24
25
  LANGUAGE_INSTRUCTIONS.english;
25
26
 
27
+ // Build AVAILABLE_TOOLS section from detected CLI tools
28
+ const tools = getToolsForStack(config.stack);
29
+ const toolLines = tools.map((t) => {
30
+ const installed = checkTool(t.bin);
31
+ const status = installed ? "installed" : "not installed";
32
+ return `- **${t.key}** (${status}): ${t.why}`;
33
+ });
34
+ const availableTools =
35
+ toolLines.length > 0
36
+ ? toolLines.join("\n")
37
+ : "No CLI tools configured. Run the installer to detect and configure tools.";
38
+
26
39
  return {
27
40
  PROJECT_NAME: config.projectName,
28
41
  LANGUAGE: langInstruction,
@@ -39,6 +52,7 @@ function buildSubstitutionMap(config, stackSections) {
39
52
  PACKAGE_MANAGER: config.packageManager,
40
53
  TOOL_SPECIFIC_GUARDRAILS:
41
54
  stackSections.TOOL_SPECIFIC_GUARDRAILS || "[Not configured]",
55
+ AVAILABLE_TOOLS: availableTools,
42
56
  };
43
57
  }
44
58
 
package/bin/lib/ui.js CHANGED
@@ -19,6 +19,13 @@ const {
19
19
  getAllMcps,
20
20
  getAllSubagents,
21
21
  } = require("./recommendation");
22
+ const {
23
+ checkAllTools,
24
+ formatToolStatus,
25
+ formatInstallInstructions,
26
+ installTool,
27
+ checkAuth,
28
+ } = require("./cli-tools");
22
29
 
23
30
  /** @type {import("@clack/prompts")} */
24
31
  let p;
@@ -495,6 +502,106 @@ async function askGitBranch() {
495
502
  return { create: true, name };
496
503
  }
497
504
 
505
+ // ─── CLI Tool Check ─────────────────────────────────────────────────────────
506
+
507
+ /**
508
+ * Run CLI tool check and offer installation/auth for missing tools.
509
+ * @param {string} stack - selected stack key
510
+ * @returns {Promise<{ tools: Array<object>, missing: Array<object>, installed: Array<object> }>}
511
+ */
512
+ async function showCliToolCheck(stack) {
513
+ const result = checkAllTools(stack);
514
+
515
+ p.note(formatToolStatus(result.tools), "CLI Tool Check");
516
+
517
+ if (result.missing.length === 0) {
518
+ p.log.success("All CLI tools are installed.");
519
+ } else {
520
+ p.log.warn(`${result.missing.length} tool(s) not found.`);
521
+
522
+ const action = await p.select({
523
+ message: "How would you like to handle missing tools?",
524
+ options: [
525
+ {
526
+ value: "install",
527
+ label: "Install all missing",
528
+ hint: "Run install commands automatically",
529
+ },
530
+ {
531
+ value: "show",
532
+ label: "Show commands only",
533
+ hint: "Display install commands for manual use",
534
+ },
535
+ {
536
+ value: "skip",
537
+ label: "Skip",
538
+ hint: "Continue without installing",
539
+ },
540
+ ],
541
+ initialValue: "show",
542
+ });
543
+ handleCancel(action);
544
+
545
+ if (action === "install") {
546
+ for (const tool of result.missing) {
547
+ const s = p.spinner();
548
+ s.start(`Installing ${tool.key}...`);
549
+ const installResult = installTool(tool);
550
+ if (installResult.ok) {
551
+ tool.installed = true;
552
+ s.stop(`${tool.key} installed`);
553
+ } else {
554
+ s.stop(
555
+ `${tool.key} failed: ${installResult.error || "unknown error"}`,
556
+ );
557
+ }
558
+ }
559
+ } else if (action === "show") {
560
+ p.note(formatInstallInstructions(result.missing), "Install Commands");
561
+ }
562
+ }
563
+
564
+ // Auth check for installed tools that need auth
565
+ const authTools = result.tools.filter((t) => t.installed && t.auth);
566
+
567
+ if (authTools.length > 0) {
568
+ const authResults = authTools.map((t) => {
569
+ const authStatus = checkAuth(t);
570
+ return { ...t, ...authStatus };
571
+ });
572
+
573
+ const unauthenticated = authResults.filter(
574
+ (t) => t.needsAuth && !t.authenticated,
575
+ );
576
+
577
+ if (unauthenticated.length > 0) {
578
+ const authLines = authResults.map((t) => {
579
+ const icon = t.authenticated ? "\u2705" : "\u274C";
580
+ return ` ${icon} ${t.key}${!t.authenticated ? ` — run: ${t.authSetup}` : ""}`;
581
+ });
582
+ p.note(authLines.join("\n"), "Auth Status");
583
+
584
+ const runAuth = await p.confirm({
585
+ message:
586
+ "Would you like to run auth commands for unauthenticated tools?",
587
+ initialValue: false,
588
+ });
589
+ handleCancel(runAuth);
590
+
591
+ if (runAuth) {
592
+ p.log.info(
593
+ "Auth commands require interactive input. Run these manually:\n" +
594
+ unauthenticated.map((t) => ` ${t.key}: ${t.authSetup}`).join("\n"),
595
+ );
596
+ }
597
+ } else {
598
+ p.log.success("All tools are authenticated.");
599
+ }
600
+ }
601
+
602
+ return result;
603
+ }
604
+
498
605
  // ─── Display helpers ────────────────────────────────────────────────────────
499
606
 
500
607
  /**
@@ -561,6 +668,8 @@ module.exports = {
561
668
  askSetupMode,
562
669
  askCustomize,
563
670
  askManual,
671
+ // CLI tool check
672
+ showCliToolCheck,
564
673
  // Legacy / utility prompts
565
674
  askMcpServers,
566
675
  askPlaywright,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aslomon/effectum",
3
- "version": "0.3.3",
3
+ "version": "0.4.0",
4
4
  "description": "Autonomous development system for Claude Code \u2014 describe what you want, get production-ready code",
5
5
  "bin": {
6
6
  "effectum": "bin/effectum.js"