@aslomon/effectum 0.3.3 β†’ 0.3.4

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 (351) hide show
  1. package/bin/install.js +27 -0
  2. package/package.json +1 -1
  3. package/system/hooks/observe.sh +164 -0
  4. package/system/hooks/quick-diff.sh +87 -0
  5. package/system/hooks/save-results.sh +56 -0
  6. package/system/hooks/scan.sh +170 -0
  7. package/system/skills/README.md +86 -0
  8. package/system/skills/SKILL.md +117 -0
  9. package/system/skills/agents/observer.md +137 -0
  10. package/system/skills/agents/start-observer.sh +143 -0
  11. package/system/skills/algorithmic-art/LICENSE.txt +202 -0
  12. package/system/skills/algorithmic-art/SKILL.md +405 -0
  13. package/system/skills/algorithmic-art/templates/generator_template.js +223 -0
  14. package/system/skills/algorithmic-art/templates/viewer.html +599 -0
  15. package/system/skills/api-endpoint/SKILL.md +106 -0
  16. package/system/skills/canvas-design/LICENSE.txt +202 -0
  17. package/system/skills/canvas-design/SKILL.md +130 -0
  18. package/system/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  19. package/system/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  20. package/system/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  21. package/system/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  22. package/system/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  23. package/system/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  24. package/system/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  25. package/system/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  26. package/system/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  27. package/system/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  28. package/system/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  29. package/system/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  30. package/system/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  31. package/system/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  32. package/system/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  33. package/system/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  34. package/system/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  35. package/system/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  36. package/system/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  37. package/system/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  38. package/system/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  39. package/system/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  40. package/system/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  41. package/system/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  42. package/system/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  43. package/system/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  44. package/system/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  45. package/system/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  46. package/system/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  47. package/system/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  48. package/system/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  49. package/system/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  50. package/system/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  51. package/system/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  52. package/system/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  53. package/system/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  54. package/system/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  55. package/system/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  56. package/system/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  57. package/system/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  58. package/system/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  59. package/system/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  60. package/system/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  61. package/system/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  62. package/system/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  63. package/system/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  64. package/system/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  65. package/system/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  66. package/system/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  67. package/system/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  68. package/system/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  69. package/system/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  70. package/system/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  71. package/system/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  72. package/system/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  73. package/system/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  74. package/system/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  75. package/system/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  76. package/system/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  77. package/system/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  78. package/system/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  79. package/system/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  80. package/system/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  81. package/system/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  82. package/system/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  83. package/system/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  84. package/system/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  85. package/system/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  86. package/system/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  87. package/system/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  88. package/system/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  89. package/system/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  90. package/system/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  91. package/system/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  92. package/system/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  93. package/system/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  94. package/system/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  95. package/system/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  96. package/system/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  97. package/system/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  98. package/system/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  99. package/system/skills/component/SKILL.md +103 -0
  100. package/system/skills/config.json +18 -0
  101. package/system/skills/doc-coauthoring/SKILL.md +375 -0
  102. package/system/skills/docx/LICENSE.txt +30 -0
  103. package/system/skills/docx/SKILL.md +590 -0
  104. package/system/skills/docx/scripts/__init__.py +1 -0
  105. package/system/skills/docx/scripts/accept_changes.py +135 -0
  106. package/system/skills/docx/scripts/comment.py +318 -0
  107. package/system/skills/docx/scripts/office/helpers/__init__.py +0 -0
  108. package/system/skills/docx/scripts/office/helpers/merge_runs.py +199 -0
  109. package/system/skills/docx/scripts/office/helpers/simplify_redlines.py +197 -0
  110. package/system/skills/docx/scripts/office/pack.py +159 -0
  111. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  112. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  113. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  114. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  115. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  116. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  117. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  118. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  119. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  120. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  121. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  122. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  123. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  124. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  125. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  126. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  127. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  128. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  129. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  130. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  131. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  132. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  133. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  134. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  135. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  136. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  137. package/system/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  138. package/system/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  139. package/system/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  140. package/system/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  141. package/system/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  142. package/system/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
  143. package/system/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  144. package/system/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  145. package/system/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  146. package/system/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  147. package/system/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  148. package/system/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  149. package/system/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  150. package/system/skills/docx/scripts/office/soffice.py +183 -0
  151. package/system/skills/docx/scripts/office/unpack.py +132 -0
  152. package/system/skills/docx/scripts/office/validate.py +111 -0
  153. package/system/skills/docx/scripts/office/validators/__init__.py +15 -0
  154. package/system/skills/docx/scripts/office/validators/base.py +847 -0
  155. package/system/skills/docx/scripts/office/validators/docx.py +446 -0
  156. package/system/skills/docx/scripts/office/validators/pptx.py +275 -0
  157. package/system/skills/docx/scripts/office/validators/redlining.py +247 -0
  158. package/system/skills/docx/scripts/templates/comments.xml +3 -0
  159. package/system/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  160. package/system/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  161. package/system/skills/docx/scripts/templates/commentsIds.xml +3 -0
  162. package/system/skills/docx/scripts/templates/people.xml +3 -0
  163. package/system/skills/evaluate-session.sh +69 -0
  164. package/system/skills/feature/SKILL.md +73 -0
  165. package/system/skills/frontend-design/LICENSE.txt +177 -0
  166. package/system/skills/frontend-design/SKILL.md +52 -0
  167. package/system/skills/hooks/observe.sh +164 -0
  168. package/system/skills/mcp-builder/LICENSE.txt +202 -0
  169. package/system/skills/mcp-builder/SKILL.md +236 -0
  170. package/system/skills/mcp-builder/reference/evaluation.md +602 -0
  171. package/system/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
  172. package/system/skills/mcp-builder/reference/node_mcp_server.md +970 -0
  173. package/system/skills/mcp-builder/reference/python_mcp_server.md +719 -0
  174. package/system/skills/mcp-builder/scripts/connections.py +151 -0
  175. package/system/skills/mcp-builder/scripts/evaluation.py +373 -0
  176. package/system/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  177. package/system/skills/mcp-builder/scripts/requirements.txt +2 -0
  178. package/system/skills/pdf/LICENSE.txt +30 -0
  179. package/system/skills/pdf/SKILL.md +314 -0
  180. package/system/skills/pdf/forms.md +294 -0
  181. package/system/skills/pdf/reference.md +612 -0
  182. package/system/skills/pdf/scripts/check_bounding_boxes.py +65 -0
  183. package/system/skills/pdf/scripts/check_fillable_fields.py +11 -0
  184. package/system/skills/pdf/scripts/convert_pdf_to_images.py +33 -0
  185. package/system/skills/pdf/scripts/create_validation_image.py +37 -0
  186. package/system/skills/pdf/scripts/extract_form_field_info.py +122 -0
  187. package/system/skills/pdf/scripts/extract_form_structure.py +115 -0
  188. package/system/skills/pdf/scripts/fill_fillable_fields.py +98 -0
  189. package/system/skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
  190. package/system/skills/pptx/LICENSE.txt +30 -0
  191. package/system/skills/pptx/SKILL.md +232 -0
  192. package/system/skills/pptx/editing.md +205 -0
  193. package/system/skills/pptx/pptxgenjs.md +420 -0
  194. package/system/skills/pptx/scripts/__init__.py +0 -0
  195. package/system/skills/pptx/scripts/add_slide.py +195 -0
  196. package/system/skills/pptx/scripts/clean.py +286 -0
  197. package/system/skills/pptx/scripts/office/helpers/__init__.py +0 -0
  198. package/system/skills/pptx/scripts/office/helpers/merge_runs.py +199 -0
  199. package/system/skills/pptx/scripts/office/helpers/simplify_redlines.py +197 -0
  200. package/system/skills/pptx/scripts/office/pack.py +159 -0
  201. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  202. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  203. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  204. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  205. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  206. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  207. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  208. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  209. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  210. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  211. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  212. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  213. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  214. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  215. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  216. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  217. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  218. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  219. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  220. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  221. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  222. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  223. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  224. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  225. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  226. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  227. package/system/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  228. package/system/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  229. package/system/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  230. package/system/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  231. package/system/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  232. package/system/skills/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
  233. package/system/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  234. package/system/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  235. package/system/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  236. package/system/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  237. package/system/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  238. package/system/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  239. package/system/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  240. package/system/skills/pptx/scripts/office/soffice.py +183 -0
  241. package/system/skills/pptx/scripts/office/unpack.py +132 -0
  242. package/system/skills/pptx/scripts/office/validate.py +111 -0
  243. package/system/skills/pptx/scripts/office/validators/__init__.py +15 -0
  244. package/system/skills/pptx/scripts/office/validators/base.py +847 -0
  245. package/system/skills/pptx/scripts/office/validators/docx.py +446 -0
  246. package/system/skills/pptx/scripts/office/validators/pptx.py +275 -0
  247. package/system/skills/pptx/scripts/office/validators/redlining.py +247 -0
  248. package/system/skills/pptx/scripts/thumbnail.py +289 -0
  249. package/system/skills/scripts/quick-diff.sh +87 -0
  250. package/system/skills/scripts/save-results.sh +56 -0
  251. package/system/skills/scripts/scan.sh +170 -0
  252. package/system/skills/security-check/SKILL.md +70 -0
  253. package/system/skills/skill-creator/LICENSE.txt +202 -0
  254. package/system/skills/skill-creator/SKILL.md +479 -0
  255. package/system/skills/skill-creator/agents/analyzer.md +274 -0
  256. package/system/skills/skill-creator/agents/comparator.md +202 -0
  257. package/system/skills/skill-creator/agents/grader.md +223 -0
  258. package/system/skills/skill-creator/assets/eval_review.html +146 -0
  259. package/system/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  260. package/system/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  261. package/system/skills/skill-creator/references/schemas.md +430 -0
  262. package/system/skills/skill-creator/scripts/__init__.py +0 -0
  263. package/system/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  264. package/system/skills/skill-creator/scripts/generate_report.py +326 -0
  265. package/system/skills/skill-creator/scripts/improve_description.py +248 -0
  266. package/system/skills/skill-creator/scripts/package_skill.py +136 -0
  267. package/system/skills/skill-creator/scripts/quick_validate.py +103 -0
  268. package/system/skills/skill-creator/scripts/run_eval.py +310 -0
  269. package/system/skills/skill-creator/scripts/run_loop.py +332 -0
  270. package/system/skills/skill-creator/scripts/utils.py +47 -0
  271. package/system/skills/suggest-compact.sh +54 -0
  272. package/system/skills/supabase-migration/SKILL.md +59 -0
  273. package/system/skills/theme-factory/LICENSE.txt +202 -0
  274. package/system/skills/theme-factory/SKILL.md +59 -0
  275. package/system/skills/theme-factory/theme-showcase.pdf +0 -0
  276. package/system/skills/theme-factory/themes/arctic-frost.md +19 -0
  277. package/system/skills/theme-factory/themes/botanical-garden.md +19 -0
  278. package/system/skills/theme-factory/themes/desert-rose.md +19 -0
  279. package/system/skills/theme-factory/themes/forest-canopy.md +19 -0
  280. package/system/skills/theme-factory/themes/golden-hour.md +19 -0
  281. package/system/skills/theme-factory/themes/midnight-galaxy.md +19 -0
  282. package/system/skills/theme-factory/themes/modern-minimalist.md +19 -0
  283. package/system/skills/theme-factory/themes/ocean-depths.md +19 -0
  284. package/system/skills/theme-factory/themes/sunset-boulevard.md +19 -0
  285. package/system/skills/theme-factory/themes/tech-innovation.md +19 -0
  286. package/system/skills/web-artifacts-builder/LICENSE.txt +202 -0
  287. package/system/skills/web-artifacts-builder/SKILL.md +74 -0
  288. package/system/skills/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  289. package/system/skills/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  290. package/system/skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  291. package/system/skills/webapp-testing/LICENSE.txt +202 -0
  292. package/system/skills/webapp-testing/SKILL.md +96 -0
  293. package/system/skills/webapp-testing/examples/console_logging.py +35 -0
  294. package/system/skills/webapp-testing/examples/element_discovery.py +40 -0
  295. package/system/skills/webapp-testing/examples/static_html_automation.py +33 -0
  296. package/system/skills/webapp-testing/scripts/with_server.py +106 -0
  297. package/system/skills/xlsx/LICENSE.txt +30 -0
  298. package/system/skills/xlsx/SKILL.md +292 -0
  299. package/system/skills/xlsx/scripts/office/helpers/__init__.py +0 -0
  300. package/system/skills/xlsx/scripts/office/helpers/merge_runs.py +199 -0
  301. package/system/skills/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
  302. package/system/skills/xlsx/scripts/office/pack.py +159 -0
  303. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  304. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  305. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  306. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  307. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  308. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  309. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  310. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  311. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  312. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  313. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  314. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  315. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  316. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  317. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  318. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  319. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  320. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  321. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  322. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  323. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  324. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  325. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  326. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  327. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  328. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  329. package/system/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  330. package/system/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  331. package/system/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  332. package/system/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  333. package/system/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  334. package/system/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
  335. package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  336. package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  337. package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  338. package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  339. package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  340. package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  341. package/system/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  342. package/system/skills/xlsx/scripts/office/soffice.py +183 -0
  343. package/system/skills/xlsx/scripts/office/unpack.py +132 -0
  344. package/system/skills/xlsx/scripts/office/validate.py +111 -0
  345. package/system/skills/xlsx/scripts/office/validators/__init__.py +15 -0
  346. package/system/skills/xlsx/scripts/office/validators/base.py +847 -0
  347. package/system/skills/xlsx/scripts/office/validators/docx.py +446 -0
  348. package/system/skills/xlsx/scripts/office/validators/pptx.py +275 -0
  349. package/system/skills/xlsx/scripts/office/validators/redlining.py +247 -0
  350. package/system/skills/xlsx/scripts/recalc.py +184 -0
  351. package/system/teams/profiles.md +76 -0
package/bin/install.js CHANGED
@@ -306,6 +306,33 @@ function installBaseFiles(targetDir, repoRoot, isGlobal) {
306
306
  steps.push(...copyDir(agentsSrc, agentsDest, { skipExisting: true }));
307
307
  }
308
308
 
309
+ // 6. Skills
310
+ const skillsSrc = path.join(repoRoot, "system", "skills");
311
+ if (fs.existsSync(skillsSrc)) {
312
+ const skillsDest = isGlobal
313
+ ? path.join(targetDir, "skills")
314
+ : path.join(targetDir, ".claude", "skills");
315
+ steps.push(...copyDir(skillsSrc, skillsDest, { skipExisting: true }));
316
+ }
317
+
318
+ // 7. Teams (profiles for Agent Teams)
319
+ const teamsSrc = path.join(repoRoot, "system", "teams");
320
+ if (fs.existsSync(teamsSrc)) {
321
+ const teamsDest = isGlobal
322
+ ? path.join(targetDir, "teams")
323
+ : path.join(targetDir, ".claude", "teams");
324
+ steps.push(...copyDir(teamsSrc, teamsDest, { skipExisting: true }));
325
+ }
326
+
327
+ // 8. Hook scripts
328
+ const hooksSrc = path.join(repoRoot, "system", "hooks");
329
+ if (fs.existsSync(hooksSrc)) {
330
+ const hooksDest = isGlobal
331
+ ? path.join(targetDir, "hooks")
332
+ : path.join(targetDir, ".claude", "hooks");
333
+ steps.push(...copyDir(hooksSrc, hooksDest, { skipExisting: true }));
334
+ }
335
+
309
336
  return steps;
310
337
  }
311
338
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aslomon/effectum",
3
- "version": "0.3.3",
3
+ "version": "0.3.4",
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"
@@ -0,0 +1,164 @@
1
+ #!/bin/bash
2
+ # Continuous Learning v2 - Observation Hook
3
+ #
4
+ # Captures tool use events for pattern analysis.
5
+ # Claude Code passes hook data via stdin as JSON.
6
+ #
7
+ # Hook config (in ~/.claude/settings.json):
8
+ #
9
+ # If installed as a plugin, use ${CLAUDE_PLUGIN_ROOT}:
10
+ # {
11
+ # "hooks": {
12
+ # "PreToolUse": [{
13
+ # "matcher": "*",
14
+ # "hooks": [{ "type": "command", "command": "${CLAUDE_PLUGIN_ROOT}/skills/continuous-learning-v2/hooks/observe.sh pre" }]
15
+ # }],
16
+ # "PostToolUse": [{
17
+ # "matcher": "*",
18
+ # "hooks": [{ "type": "command", "command": "${CLAUDE_PLUGIN_ROOT}/skills/continuous-learning-v2/hooks/observe.sh post" }]
19
+ # }]
20
+ # }
21
+ # }
22
+ #
23
+ # If installed manually to ~/.claude/skills:
24
+ # {
25
+ # "hooks": {
26
+ # "PreToolUse": [{
27
+ # "matcher": "*",
28
+ # "hooks": [{ "type": "command", "command": "~/.claude/skills/continuous-learning-v2/hooks/observe.sh pre" }]
29
+ # }],
30
+ # "PostToolUse": [{
31
+ # "matcher": "*",
32
+ # "hooks": [{ "type": "command", "command": "~/.claude/skills/continuous-learning-v2/hooks/observe.sh post" }]
33
+ # }]
34
+ # }
35
+ # }
36
+
37
+ set -e
38
+
39
+ # Hook phase from CLI argument: "pre" (PreToolUse) or "post" (PostToolUse)
40
+ HOOK_PHASE="${1:-post}"
41
+
42
+ CONFIG_DIR="${HOME}/.claude/homunculus"
43
+ OBSERVATIONS_FILE="${CONFIG_DIR}/observations.jsonl"
44
+ MAX_FILE_SIZE_MB=10
45
+
46
+ # Ensure directory exists
47
+ mkdir -p "$CONFIG_DIR"
48
+
49
+ # Skip if disabled
50
+ if [ -f "$CONFIG_DIR/disabled" ]; then
51
+ exit 0
52
+ fi
53
+
54
+ # Read JSON from stdin (Claude Code hook format)
55
+ INPUT_JSON=$(cat)
56
+
57
+ # Exit if no input
58
+ if [ -z "$INPUT_JSON" ]; then
59
+ exit 0
60
+ fi
61
+
62
+ # Parse using python via stdin pipe (safe for all JSON payloads)
63
+ # Pass HOOK_PHASE via env var since Claude Code does not include hook type in stdin JSON
64
+ PARSED=$(echo "$INPUT_JSON" | HOOK_PHASE="$HOOK_PHASE" python3 -c '
65
+ import json
66
+ import sys
67
+ import os
68
+
69
+ try:
70
+ data = json.load(sys.stdin)
71
+
72
+ # Determine event type from CLI argument passed via env var.
73
+ # Claude Code does NOT include a "hook_type" field in the stdin JSON,
74
+ # so we rely on the shell argument ("pre" or "post") instead.
75
+ hook_phase = os.environ.get("HOOK_PHASE", "post")
76
+ event = "tool_start" if hook_phase == "pre" else "tool_complete"
77
+
78
+ # Extract fields - Claude Code hook format
79
+ tool_name = data.get("tool_name", data.get("tool", "unknown"))
80
+ tool_input = data.get("tool_input", data.get("input", {}))
81
+ tool_output = data.get("tool_output", data.get("output", ""))
82
+ session_id = data.get("session_id", "unknown")
83
+
84
+ # Truncate large inputs/outputs
85
+ if isinstance(tool_input, dict):
86
+ tool_input_str = json.dumps(tool_input)[:5000]
87
+ else:
88
+ tool_input_str = str(tool_input)[:5000]
89
+
90
+ if isinstance(tool_output, dict):
91
+ tool_output_str = json.dumps(tool_output)[:5000]
92
+ else:
93
+ tool_output_str = str(tool_output)[:5000]
94
+
95
+ print(json.dumps({
96
+ "parsed": True,
97
+ "event": event,
98
+ "tool": tool_name,
99
+ "input": tool_input_str if event == "tool_start" else None,
100
+ "output": tool_output_str if event == "tool_complete" else None,
101
+ "session": session_id
102
+ }))
103
+ except Exception as e:
104
+ print(json.dumps({"parsed": False, "error": str(e)}))
105
+ ')
106
+
107
+ # Check if parsing succeeded
108
+ PARSED_OK=$(echo "$PARSED" | python3 -c "import json,sys; print(json.load(sys.stdin).get('parsed', False))")
109
+
110
+ if [ "$PARSED_OK" != "True" ]; then
111
+ # Fallback: log raw input for debugging
112
+ timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
113
+ export TIMESTAMP="$timestamp"
114
+ echo "$INPUT_JSON" | python3 -c "
115
+ import json, sys, os
116
+ raw = sys.stdin.read()[:2000]
117
+ print(json.dumps({'timestamp': os.environ['TIMESTAMP'], 'event': 'parse_error', 'raw': raw}))
118
+ " >> "$OBSERVATIONS_FILE"
119
+ exit 0
120
+ fi
121
+
122
+ # Archive if file too large
123
+ if [ -f "$OBSERVATIONS_FILE" ]; then
124
+ file_size_mb=$(du -m "$OBSERVATIONS_FILE" 2>/dev/null | cut -f1)
125
+ if [ "${file_size_mb:-0}" -ge "$MAX_FILE_SIZE_MB" ]; then
126
+ archive_dir="${CONFIG_DIR}/observations.archive"
127
+ mkdir -p "$archive_dir"
128
+ mv "$OBSERVATIONS_FILE" "$archive_dir/observations-$(date +%Y%m%d-%H%M%S).jsonl"
129
+ fi
130
+ fi
131
+
132
+ # Build and write observation
133
+ timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
134
+
135
+ export TIMESTAMP="$timestamp"
136
+ echo "$PARSED" | python3 -c "
137
+ import json, sys, os
138
+
139
+ parsed = json.load(sys.stdin)
140
+ observation = {
141
+ 'timestamp': os.environ['TIMESTAMP'],
142
+ 'event': parsed['event'],
143
+ 'tool': parsed['tool'],
144
+ 'session': parsed['session']
145
+ }
146
+
147
+ if parsed['input'] is not None:
148
+ observation['input'] = parsed['input']
149
+ if parsed['output'] is not None:
150
+ observation['output'] = parsed['output']
151
+
152
+ print(json.dumps(observation))
153
+ " >> "$OBSERVATIONS_FILE"
154
+
155
+ # Signal observer if running
156
+ OBSERVER_PID_FILE="${CONFIG_DIR}/.observer.pid"
157
+ if [ -f "$OBSERVER_PID_FILE" ]; then
158
+ observer_pid=$(cat "$OBSERVER_PID_FILE")
159
+ if kill -0 "$observer_pid" 2>/dev/null; then
160
+ kill -USR1 "$observer_pid" 2>/dev/null || true
161
+ fi
162
+ fi
163
+
164
+ exit 0
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env bash
2
+ # quick-diff.sh β€” compare skill file mtimes against results.json evaluated_at
3
+ # Usage: quick-diff.sh RESULTS_JSON [CWD_SKILLS_DIR]
4
+ # Output: JSON array of changed/new files to stdout (empty [] if no changes)
5
+ #
6
+ # When CWD_SKILLS_DIR is omitted, defaults to $PWD/.claude/skills so the
7
+ # script always picks up project-level skills without relying on the caller.
8
+ #
9
+ # Environment:
10
+ # SKILL_STOCKTAKE_GLOBAL_DIR Override ~/.claude/skills (for testing only;
11
+ # do not set in production β€” intended for bats tests)
12
+ # SKILL_STOCKTAKE_PROJECT_DIR Override project dir detection (for testing only)
13
+
14
+ set -euo pipefail
15
+
16
+ RESULTS_JSON="${1:-}"
17
+ CWD_SKILLS_DIR="${SKILL_STOCKTAKE_PROJECT_DIR:-${2:-$PWD/.claude/skills}}"
18
+ GLOBAL_DIR="${SKILL_STOCKTAKE_GLOBAL_DIR:-$HOME/.claude/skills}"
19
+
20
+ if [[ -z "$RESULTS_JSON" || ! -f "$RESULTS_JSON" ]]; then
21
+ echo "Error: RESULTS_JSON not found: ${RESULTS_JSON:-<empty>}" >&2
22
+ exit 1
23
+ fi
24
+
25
+ # Validate CWD_SKILLS_DIR looks like a .claude/skills path (defense-in-depth).
26
+ # Only warn when the path exists β€” a nonexistent path poses no traversal risk.
27
+ if [[ -n "$CWD_SKILLS_DIR" && -d "$CWD_SKILLS_DIR" && "$CWD_SKILLS_DIR" != */.claude/skills* ]]; then
28
+ echo "Warning: CWD_SKILLS_DIR does not look like a .claude/skills path: $CWD_SKILLS_DIR" >&2
29
+ fi
30
+
31
+ evaluated_at=$(jq -r '.evaluated_at' "$RESULTS_JSON")
32
+
33
+ # Fail fast on a missing or malformed evaluated_at rather than producing
34
+ # unpredictable results from ISO 8601 string comparison against "null".
35
+ if [[ ! "$evaluated_at" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$ ]]; then
36
+ echo "Error: invalid or missing evaluated_at in $RESULTS_JSON: $evaluated_at" >&2
37
+ exit 1
38
+ fi
39
+
40
+ # Pre-extract known paths from results.json once (O(1) lookup per file instead of O(n*m))
41
+ known_paths=$(jq -r '.skills[].path' "$RESULTS_JSON" 2>/dev/null)
42
+
43
+ tmpdir=$(mktemp -d)
44
+ # Use a function to avoid embedding $tmpdir in a quoted string (prevents injection
45
+ # if TMPDIR were crafted to contain shell metacharacters).
46
+ _cleanup() { rm -rf "$tmpdir"; }
47
+ trap _cleanup EXIT
48
+
49
+ # Shared counter across process_dir calls β€” intentionally NOT local
50
+ i=0
51
+
52
+ process_dir() {
53
+ local dir="$1"
54
+ while IFS= read -r file; do
55
+ local mtime dp is_new
56
+ mtime=$(date -u -r "$file" +%Y-%m-%dT%H:%M:%SZ)
57
+ dp="${file/#$HOME/~}"
58
+
59
+ # Check if this file is known to results.json (exact whole-line match to
60
+ # avoid substring false-positives, e.g. "python-patterns" matching "python-patterns-v2").
61
+ if echo "$known_paths" | grep -qxF "$dp"; then
62
+ is_new="false"
63
+ # Known file: only emit if mtime changed (ISO 8601 string comparison is safe)
64
+ [[ "$mtime" > "$evaluated_at" ]] || continue
65
+ else
66
+ is_new="true"
67
+ # New file: always emit regardless of mtime
68
+ fi
69
+
70
+ jq -n \
71
+ --arg path "$dp" \
72
+ --arg mtime "$mtime" \
73
+ --argjson is_new "$is_new" \
74
+ '{path:$path,mtime:$mtime,is_new:$is_new}' \
75
+ > "$tmpdir/$i.json"
76
+ i=$((i+1))
77
+ done < <(find "$dir" -name "*.md" -type f 2>/dev/null | sort)
78
+ }
79
+
80
+ [[ -d "$GLOBAL_DIR" ]] && process_dir "$GLOBAL_DIR"
81
+ [[ -n "$CWD_SKILLS_DIR" && -d "$CWD_SKILLS_DIR" ]] && process_dir "$CWD_SKILLS_DIR"
82
+
83
+ if [[ $i -eq 0 ]]; then
84
+ echo "[]"
85
+ else
86
+ jq -s '.' "$tmpdir"/*.json
87
+ fi
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env bash
2
+ # save-results.sh β€” merge evaluated skills into results.json with correct UTC timestamp
3
+ # Usage: save-results.sh RESULTS_JSON <<< "$EVAL_JSON"
4
+ #
5
+ # stdin format:
6
+ # { "skills": {...}, "mode"?: "full"|"quick", "batch_progress"?: {...} }
7
+ #
8
+ # Always sets evaluated_at to current UTC time via `date -u`.
9
+ # Merges stdin .skills into existing results.json (new entries override old).
10
+ # Optionally updates .mode and .batch_progress if present in stdin.
11
+
12
+ set -euo pipefail
13
+
14
+ RESULTS_JSON="${1:-}"
15
+
16
+ if [[ -z "$RESULTS_JSON" ]]; then
17
+ echo "Error: RESULTS_JSON argument required" >&2
18
+ echo "Usage: save-results.sh RESULTS_JSON <<< \"\$EVAL_JSON\"" >&2
19
+ exit 1
20
+ fi
21
+
22
+ EVALUATED_AT=$(date -u +%Y-%m-%dT%H:%M:%SZ)
23
+
24
+ # Read eval results from stdin and validate JSON before touching the results file
25
+ input_json=$(cat)
26
+ if ! echo "$input_json" | jq empty 2>/dev/null; then
27
+ echo "Error: stdin is not valid JSON" >&2
28
+ exit 1
29
+ fi
30
+
31
+ if [[ ! -f "$RESULTS_JSON" ]]; then
32
+ # Bootstrap: create new results.json from stdin JSON + current UTC timestamp
33
+ echo "$input_json" | jq --arg ea "$EVALUATED_AT" \
34
+ '. + { evaluated_at: $ea }' > "$RESULTS_JSON"
35
+ exit 0
36
+ fi
37
+
38
+ # Merge: new .skills override existing ones; old skills not in input_json are kept.
39
+ # Optionally update .mode and .batch_progress if provided.
40
+ #
41
+ # Use mktemp for a collision-safe temp file (concurrent runs on the same RESULTS_JSON
42
+ # would race on a predictable ".tmp" suffix; random suffix prevents silent overwrites).
43
+ tmp=$(mktemp "${RESULTS_JSON}.XXXXXX")
44
+ trap 'rm -f "$tmp"' EXIT
45
+
46
+ jq -s \
47
+ --arg ea "$EVALUATED_AT" \
48
+ '.[0] as $existing | .[1] as $new |
49
+ $existing |
50
+ .evaluated_at = $ea |
51
+ .skills = ($existing.skills + ($new.skills // {})) |
52
+ if ($new | has("mode")) then .mode = $new.mode else . end |
53
+ if ($new | has("batch_progress")) then .batch_progress = $new.batch_progress else . end' \
54
+ "$RESULTS_JSON" <(echo "$input_json") > "$tmp"
55
+
56
+ mv "$tmp" "$RESULTS_JSON"
@@ -0,0 +1,170 @@
1
+ #!/usr/bin/env bash
2
+ # scan.sh β€” enumerate skill files, extract frontmatter and UTC mtime
3
+ # Usage: scan.sh [CWD_SKILLS_DIR]
4
+ # Output: JSON to stdout
5
+ #
6
+ # When CWD_SKILLS_DIR is omitted, defaults to $PWD/.claude/skills so the
7
+ # script always picks up project-level skills without relying on the caller.
8
+ #
9
+ # Environment:
10
+ # SKILL_STOCKTAKE_GLOBAL_DIR Override ~/.claude/skills (for testing only;
11
+ # do not set in production β€” intended for bats tests)
12
+ # SKILL_STOCKTAKE_PROJECT_DIR Override project dir detection (for testing only)
13
+
14
+ set -euo pipefail
15
+
16
+ GLOBAL_DIR="${SKILL_STOCKTAKE_GLOBAL_DIR:-$HOME/.claude/skills}"
17
+ CWD_SKILLS_DIR="${SKILL_STOCKTAKE_PROJECT_DIR:-${1:-$PWD/.claude/skills}}"
18
+ # Path to JSONL file containing tool-use observations (optional; used for usage frequency counts).
19
+ # Override via SKILL_STOCKTAKE_OBSERVATIONS env var if your setup uses a different path.
20
+ OBSERVATIONS="${SKILL_STOCKTAKE_OBSERVATIONS:-$HOME/.claude/observations.jsonl}"
21
+
22
+ # Validate CWD_SKILLS_DIR looks like a .claude/skills path (defense-in-depth).
23
+ # Only warn when the path exists β€” a nonexistent path poses no traversal risk.
24
+ if [[ -n "$CWD_SKILLS_DIR" && -d "$CWD_SKILLS_DIR" && "$CWD_SKILLS_DIR" != */.claude/skills* ]]; then
25
+ echo "Warning: CWD_SKILLS_DIR does not look like a .claude/skills path: $CWD_SKILLS_DIR" >&2
26
+ fi
27
+
28
+ # Extract a frontmatter field (handles both quoted and unquoted single-line values).
29
+ # Does NOT support multi-line YAML blocks (| or >) or nested YAML keys.
30
+ extract_field() {
31
+ local file="$1" field="$2"
32
+ awk -v f="$field" '
33
+ BEGIN { fm=0 }
34
+ /^---$/ { fm++; next }
35
+ fm==1 {
36
+ n = length(f) + 2
37
+ if (substr($0, 1, n) == f ": ") {
38
+ val = substr($0, n+1)
39
+ gsub(/^"/, "", val)
40
+ gsub(/"$/, "", val)
41
+ print val
42
+ exit
43
+ }
44
+ }
45
+ fm>=2 { exit }
46
+ ' "$file"
47
+ }
48
+
49
+ # Get UTC timestamp N days ago (supports both macOS and GNU date)
50
+ date_ago() {
51
+ local n="$1"
52
+ date -u -v-"${n}d" +%Y-%m-%dT%H:%M:%SZ 2>/dev/null ||
53
+ date -u -d "${n} days ago" +%Y-%m-%dT%H:%M:%SZ
54
+ }
55
+
56
+ # Count observations matching a file path since a cutoff timestamp
57
+ count_obs() {
58
+ local file="$1" cutoff="$2"
59
+ if [[ ! -f "$OBSERVATIONS" ]]; then
60
+ echo 0
61
+ return
62
+ fi
63
+ jq -r --arg p "$file" --arg c "$cutoff" \
64
+ 'select(.tool=="Read" and .path==$p and .timestamp>=$c) | 1' \
65
+ "$OBSERVATIONS" 2>/dev/null | wc -l | tr -d ' '
66
+ }
67
+
68
+ # Scan a directory and produce a JSON array of skill objects
69
+ scan_dir_to_json() {
70
+ local dir="$1"
71
+ local c7 c30
72
+ c7=$(date_ago 7)
73
+ c30=$(date_ago 30)
74
+
75
+ local tmpdir
76
+ tmpdir=$(mktemp -d)
77
+ # Use a function to avoid embedding $tmpdir in a quoted string (prevents injection
78
+ # if TMPDIR were crafted to contain shell metacharacters).
79
+ local _scan_tmpdir="$tmpdir"
80
+ _scan_cleanup() { rm -rf "$_scan_tmpdir"; }
81
+ trap _scan_cleanup RETURN
82
+
83
+ # Pre-aggregate observation counts in two passes (one per window) instead of
84
+ # calling jq per-file β€” reduces from O(n*m) to O(n+m) jq invocations.
85
+ local obs_7d_counts obs_30d_counts
86
+ obs_7d_counts=""
87
+ obs_30d_counts=""
88
+ if [[ -f "$OBSERVATIONS" ]]; then
89
+ obs_7d_counts=$(jq -r --arg c "$c7" \
90
+ 'select(.tool=="Read" and .timestamp>=$c) | .path' \
91
+ "$OBSERVATIONS" 2>/dev/null | sort | uniq -c)
92
+ obs_30d_counts=$(jq -r --arg c "$c30" \
93
+ 'select(.tool=="Read" and .timestamp>=$c) | .path' \
94
+ "$OBSERVATIONS" 2>/dev/null | sort | uniq -c)
95
+ fi
96
+
97
+ local i=0
98
+ while IFS= read -r file; do
99
+ local name desc mtime u7 u30 dp
100
+ name=$(extract_field "$file" "name")
101
+ desc=$(extract_field "$file" "description")
102
+ mtime=$(date -u -r "$file" +%Y-%m-%dT%H:%M:%SZ)
103
+ # Use awk exact field match to avoid substring false-positives from grep -F.
104
+ # uniq -c output format: " N /path/to/file" β€” path is always field 2.
105
+ u7=$(echo "$obs_7d_counts" | awk -v f="$file" '$2 == f {print $1}' | head -1)
106
+ u7="${u7:-0}"
107
+ u30=$(echo "$obs_30d_counts" | awk -v f="$file" '$2 == f {print $1}' | head -1)
108
+ u30="${u30:-0}"
109
+ dp="${file/#$HOME/~}"
110
+
111
+ jq -n \
112
+ --arg path "$dp" \
113
+ --arg name "$name" \
114
+ --arg description "$desc" \
115
+ --arg mtime "$mtime" \
116
+ --argjson use_7d "$u7" \
117
+ --argjson use_30d "$u30" \
118
+ '{path:$path,name:$name,description:$description,use_7d:$use_7d,use_30d:$use_30d,mtime:$mtime}' \
119
+ > "$tmpdir/$i.json"
120
+ i=$((i+1))
121
+ done < <(find "$dir" -name "*.md" -type f 2>/dev/null | sort)
122
+
123
+ if [[ $i -eq 0 ]]; then
124
+ echo "[]"
125
+ else
126
+ jq -s '.' "$tmpdir"/*.json
127
+ fi
128
+ }
129
+
130
+ # --- Main ---
131
+
132
+ global_found="false"
133
+ global_count=0
134
+ global_skills="[]"
135
+
136
+ if [[ -d "$GLOBAL_DIR" ]]; then
137
+ global_found="true"
138
+ global_skills=$(scan_dir_to_json "$GLOBAL_DIR")
139
+ global_count=$(echo "$global_skills" | jq 'length')
140
+ fi
141
+
142
+ project_found="false"
143
+ project_path=""
144
+ project_count=0
145
+ project_skills="[]"
146
+
147
+ if [[ -n "$CWD_SKILLS_DIR" && -d "$CWD_SKILLS_DIR" ]]; then
148
+ project_found="true"
149
+ project_path="$CWD_SKILLS_DIR"
150
+ project_skills=$(scan_dir_to_json "$CWD_SKILLS_DIR")
151
+ project_count=$(echo "$project_skills" | jq 'length')
152
+ fi
153
+
154
+ # Merge global + project skills into one array
155
+ all_skills=$(jq -s 'add' <(echo "$global_skills") <(echo "$project_skills"))
156
+
157
+ jq -n \
158
+ --arg global_found "$global_found" \
159
+ --argjson global_count "$global_count" \
160
+ --arg project_found "$project_found" \
161
+ --arg project_path "$project_path" \
162
+ --argjson project_count "$project_count" \
163
+ --argjson skills "$all_skills" \
164
+ '{
165
+ scan_summary: {
166
+ global: { found: ($global_found == "true"), count: $global_count },
167
+ project: { found: ($project_found == "true"), path: $project_path, count: $project_count }
168
+ },
169
+ skills: $skills
170
+ }'
@@ -0,0 +1,86 @@
1
+ # Visa Document Translator
2
+
3
+ Automatically translate visa application documents from images to professional English PDFs.
4
+
5
+ ## Features
6
+
7
+ - πŸ”„ **Automatic OCR**: Tries multiple OCR methods (macOS Vision, EasyOCR, Tesseract)
8
+ - πŸ“„ **Bilingual PDF**: Original image + professional English translation
9
+ - 🌍 **Multi-language**: Supports Chinese, and other languages
10
+ - πŸ“‹ **Professional Format**: Suitable for official visa applications
11
+ - πŸš€ **Fully Automated**: No manual intervention required
12
+
13
+ ## Supported Documents
14
+
15
+ - Bank deposit certificates (存款证明)
16
+ - Employment certificates (在职证明)
17
+ - Retirement certificates (ι€€δΌ‘θ―ζ˜Ž)
18
+ - Income certificates (ζ”Άε…₯证明)
19
+ - Property certificates (房产证明)
20
+ - Business licenses (θ₯δΈšζ‰§η…§)
21
+ - ID cards and passports
22
+
23
+ ## Usage
24
+
25
+ ```bash
26
+ /visa-doc-translate <image-file>
27
+ ```
28
+
29
+ ### Examples
30
+
31
+ ```bash
32
+ /visa-doc-translate RetirementCertificate.PNG
33
+ /visa-doc-translate BankStatement.HEIC
34
+ /visa-doc-translate EmploymentLetter.jpg
35
+ ```
36
+
37
+ ## Output
38
+
39
+ Creates `<filename>_Translated.pdf` with:
40
+ - **Page 1**: Original document image (centered, A4 size)
41
+ - **Page 2**: Professional English translation
42
+
43
+ ## Requirements
44
+
45
+ ### Python Libraries
46
+ ```bash
47
+ pip install pillow reportlab
48
+ ```
49
+
50
+ ### OCR (one of the following)
51
+
52
+ **macOS (recommended)**:
53
+ ```bash
54
+ pip install pyobjc-framework-Vision pyobjc-framework-Quartz
55
+ ```
56
+
57
+ **Cross-platform**:
58
+ ```bash
59
+ pip install easyocr
60
+ ```
61
+
62
+ **Tesseract**:
63
+ ```bash
64
+ brew install tesseract tesseract-lang
65
+ pip install pytesseract
66
+ ```
67
+
68
+ ## How It Works
69
+
70
+ 1. Converts HEIC to PNG if needed
71
+ 2. Checks and applies EXIF rotation
72
+ 3. Extracts text using available OCR method
73
+ 4. Translates to professional English
74
+ 5. Generates bilingual PDF
75
+
76
+ ## Perfect For
77
+
78
+ - πŸ‡¦πŸ‡Ί Australia visa applications
79
+ - πŸ‡ΊπŸ‡Έ USA visa applications
80
+ - πŸ‡¨πŸ‡¦ Canada visa applications
81
+ - πŸ‡¬πŸ‡§ UK visa applications
82
+ - πŸ‡ͺπŸ‡Ί EU visa applications
83
+
84
+ ## License
85
+
86
+ MIT