sumulige-claude 1.0.8 → 1.0.11

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 (301) hide show
  1. package/.claude/.version +1 -0
  2. package/.claude/AGENTS.md +9 -9
  3. package/.claude/commands/commit-push-pr.md +23 -3
  4. package/.claude/sessions/active-sessions.json +1 -359
  5. package/.claude/settings.local.json +31 -1
  6. package/.claude/skills/algorithmic-art/LICENSE.txt +202 -0
  7. package/.claude/skills/algorithmic-art/SKILL.md +405 -0
  8. package/.claude/skills/algorithmic-art/templates/generator_template.js +223 -0
  9. package/.claude/skills/algorithmic-art/templates/viewer.html +599 -0
  10. package/.claude/skills/brand-guidelines/LICENSE.txt +202 -0
  11. package/.claude/skills/brand-guidelines/SKILL.md +73 -0
  12. package/.claude/skills/canvas-design/LICENSE.txt +202 -0
  13. package/.claude/skills/canvas-design/SKILL.md +130 -0
  14. package/.claude/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  15. package/.claude/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  16. package/.claude/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  17. package/.claude/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  18. package/.claude/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  19. package/.claude/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  20. package/.claude/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  21. package/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  22. package/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  23. package/.claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  24. package/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  25. package/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  26. package/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  27. package/.claude/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  28. package/.claude/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  29. package/.claude/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  30. package/.claude/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  31. package/.claude/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  32. package/.claude/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  33. package/.claude/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  34. package/.claude/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  35. package/.claude/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  36. package/.claude/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  37. package/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  38. package/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  39. package/.claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  40. package/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  41. package/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  42. package/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  43. package/.claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  44. package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  45. package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  46. package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  47. package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  48. package/.claude/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  49. package/.claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  50. package/.claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  51. package/.claude/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  52. package/.claude/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  53. package/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  54. package/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  55. package/.claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  56. package/.claude/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  57. package/.claude/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  58. package/.claude/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  59. package/.claude/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  60. package/.claude/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  61. package/.claude/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  62. package/.claude/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  63. package/.claude/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  64. package/.claude/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  65. package/.claude/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  66. package/.claude/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  67. package/.claude/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  68. package/.claude/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  69. package/.claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  70. package/.claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  71. package/.claude/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  72. package/.claude/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  73. package/.claude/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  74. package/.claude/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  75. package/.claude/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  76. package/.claude/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  77. package/.claude/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  78. package/.claude/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  79. package/.claude/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  80. package/.claude/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  81. package/.claude/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  82. package/.claude/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  83. package/.claude/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  84. package/.claude/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  85. package/.claude/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  86. package/.claude/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  87. package/.claude/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  88. package/.claude/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  89. package/.claude/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  90. package/.claude/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  91. package/.claude/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  92. package/.claude/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  93. package/.claude/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  94. package/.claude/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  95. package/.claude/skills/doc-coauthoring/SKILL.md +375 -0
  96. package/.claude/skills/docx/LICENSE.txt +30 -0
  97. package/.claude/skills/docx/SKILL.md +197 -0
  98. package/.claude/skills/docx/docx-js.md +350 -0
  99. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  100. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  101. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  102. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  103. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  104. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  105. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  106. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  107. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  108. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  109. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  110. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  111. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  112. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  113. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  114. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  115. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  116. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  117. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  118. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  119. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  120. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  121. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  122. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  123. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  124. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  125. package/.claude/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  126. package/.claude/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  127. package/.claude/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  128. package/.claude/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  129. package/.claude/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  130. package/.claude/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
  131. package/.claude/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  132. package/.claude/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  133. package/.claude/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  134. package/.claude/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  135. package/.claude/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  136. package/.claude/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  137. package/.claude/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  138. package/.claude/skills/docx/ooxml/scripts/pack.py +159 -0
  139. package/.claude/skills/docx/ooxml/scripts/unpack.py +29 -0
  140. package/.claude/skills/docx/ooxml/scripts/validate.py +69 -0
  141. package/.claude/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
  142. package/.claude/skills/docx/ooxml/scripts/validation/base.py +951 -0
  143. package/.claude/skills/docx/ooxml/scripts/validation/docx.py +274 -0
  144. package/.claude/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
  145. package/.claude/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
  146. package/.claude/skills/docx/ooxml.md +610 -0
  147. package/.claude/skills/docx/scripts/__init__.py +1 -0
  148. package/.claude/skills/docx/scripts/document.py +1276 -0
  149. package/.claude/skills/docx/scripts/templates/comments.xml +3 -0
  150. package/.claude/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  151. package/.claude/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  152. package/.claude/skills/docx/scripts/templates/commentsIds.xml +3 -0
  153. package/.claude/skills/docx/scripts/templates/people.xml +3 -0
  154. package/.claude/skills/docx/scripts/utilities.py +374 -0
  155. package/.claude/skills/frontend-design/LICENSE.txt +177 -0
  156. package/.claude/skills/frontend-design/SKILL.md +42 -0
  157. package/.claude/skills/internal-comms/LICENSE.txt +202 -0
  158. package/.claude/skills/internal-comms/SKILL.md +32 -0
  159. package/.claude/skills/internal-comms/examples/3p-updates.md +47 -0
  160. package/.claude/skills/internal-comms/examples/company-newsletter.md +65 -0
  161. package/.claude/skills/internal-comms/examples/faq-answers.md +30 -0
  162. package/.claude/skills/internal-comms/examples/general-comms.md +16 -0
  163. package/.claude/skills/mcp-builder/LICENSE.txt +202 -0
  164. package/.claude/skills/mcp-builder/SKILL.md +236 -0
  165. package/.claude/skills/mcp-builder/reference/evaluation.md +602 -0
  166. package/.claude/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
  167. package/.claude/skills/mcp-builder/reference/node_mcp_server.md +970 -0
  168. package/.claude/skills/mcp-builder/reference/python_mcp_server.md +719 -0
  169. package/.claude/skills/mcp-builder/scripts/connections.py +151 -0
  170. package/.claude/skills/mcp-builder/scripts/evaluation.py +373 -0
  171. package/.claude/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  172. package/.claude/skills/mcp-builder/scripts/requirements.txt +2 -0
  173. package/.claude/skills/pdf/LICENSE.txt +30 -0
  174. package/.claude/skills/pdf/SKILL.md +294 -0
  175. package/.claude/skills/pdf/forms.md +205 -0
  176. package/.claude/skills/pdf/reference.md +612 -0
  177. package/.claude/skills/pdf/scripts/check_bounding_boxes.py +70 -0
  178. package/.claude/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
  179. package/.claude/skills/pdf/scripts/check_fillable_fields.py +12 -0
  180. package/.claude/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
  181. package/.claude/skills/pdf/scripts/create_validation_image.py +41 -0
  182. package/.claude/skills/pdf/scripts/extract_form_field_info.py +152 -0
  183. package/.claude/skills/pdf/scripts/fill_fillable_fields.py +114 -0
  184. package/.claude/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  185. package/.claude/skills/pptx/LICENSE.txt +30 -0
  186. package/.claude/skills/pptx/SKILL.md +484 -0
  187. package/.claude/skills/pptx/html2pptx.md +625 -0
  188. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  189. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  190. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  191. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  192. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  193. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  194. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  195. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  196. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  197. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  198. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  199. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  200. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  201. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  202. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  203. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  204. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  205. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  206. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  207. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  208. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  209. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  210. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  211. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  212. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  213. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  214. package/.claude/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  215. package/.claude/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  216. package/.claude/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  217. package/.claude/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  218. package/.claude/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  219. package/.claude/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  220. package/.claude/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  221. package/.claude/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  222. package/.claude/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  223. package/.claude/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  224. package/.claude/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  225. package/.claude/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  226. package/.claude/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  227. package/.claude/skills/pptx/ooxml/scripts/pack.py +159 -0
  228. package/.claude/skills/pptx/ooxml/scripts/unpack.py +29 -0
  229. package/.claude/skills/pptx/ooxml/scripts/validate.py +69 -0
  230. package/.claude/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
  231. package/.claude/skills/pptx/ooxml/scripts/validation/base.py +951 -0
  232. package/.claude/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
  233. package/.claude/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
  234. package/.claude/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
  235. package/.claude/skills/pptx/ooxml.md +427 -0
  236. package/.claude/skills/pptx/scripts/html2pptx.js +979 -0
  237. package/.claude/skills/pptx/scripts/inventory.py +1020 -0
  238. package/.claude/skills/pptx/scripts/rearrange.py +231 -0
  239. package/.claude/skills/pptx/scripts/replace.py +385 -0
  240. package/.claude/skills/pptx/scripts/thumbnail.py +450 -0
  241. package/.claude/skills/skill-creator/LICENSE.txt +202 -0
  242. package/.claude/skills/skill-creator/SKILL.md +356 -0
  243. package/.claude/skills/skill-creator/references/output-patterns.md +82 -0
  244. package/.claude/skills/skill-creator/references/workflows.md +28 -0
  245. package/.claude/skills/skill-creator/scripts/init_skill.py +303 -0
  246. package/.claude/skills/skill-creator/scripts/package_skill.py +110 -0
  247. package/.claude/skills/skill-creator/scripts/quick_validate.py +95 -0
  248. package/.claude/skills/slack-gif-creator/LICENSE.txt +202 -0
  249. package/.claude/skills/slack-gif-creator/SKILL.md +254 -0
  250. package/.claude/skills/slack-gif-creator/core/easing.py +234 -0
  251. package/.claude/skills/slack-gif-creator/core/frame_composer.py +176 -0
  252. package/.claude/skills/slack-gif-creator/core/gif_builder.py +269 -0
  253. package/.claude/skills/slack-gif-creator/core/validators.py +136 -0
  254. package/.claude/skills/slack-gif-creator/requirements.txt +4 -0
  255. package/.claude/skills/template/SKILL.md +6 -0
  256. package/.claude/skills/theme-factory/LICENSE.txt +202 -0
  257. package/.claude/skills/theme-factory/SKILL.md +59 -0
  258. package/.claude/skills/theme-factory/theme-showcase.pdf +0 -0
  259. package/.claude/skills/theme-factory/themes/arctic-frost.md +19 -0
  260. package/.claude/skills/theme-factory/themes/botanical-garden.md +19 -0
  261. package/.claude/skills/theme-factory/themes/desert-rose.md +19 -0
  262. package/.claude/skills/theme-factory/themes/forest-canopy.md +19 -0
  263. package/.claude/skills/theme-factory/themes/golden-hour.md +19 -0
  264. package/.claude/skills/theme-factory/themes/midnight-galaxy.md +19 -0
  265. package/.claude/skills/theme-factory/themes/modern-minimalist.md +19 -0
  266. package/.claude/skills/theme-factory/themes/ocean-depths.md +19 -0
  267. package/.claude/skills/theme-factory/themes/sunset-boulevard.md +19 -0
  268. package/.claude/skills/theme-factory/themes/tech-innovation.md +19 -0
  269. package/.claude/skills/web-artifacts-builder/LICENSE.txt +202 -0
  270. package/.claude/skills/web-artifacts-builder/SKILL.md +74 -0
  271. package/.claude/skills/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  272. package/.claude/skills/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  273. package/.claude/skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  274. package/.claude/skills/webapp-testing/LICENSE.txt +202 -0
  275. package/.claude/skills/webapp-testing/SKILL.md +96 -0
  276. package/.claude/skills/webapp-testing/examples/console_logging.py +35 -0
  277. package/.claude/skills/webapp-testing/examples/element_discovery.py +40 -0
  278. package/.claude/skills/webapp-testing/examples/static_html_automation.py +33 -0
  279. package/.claude/skills/webapp-testing/scripts/with_server.py +106 -0
  280. package/.claude/skills/xlsx/LICENSE.txt +30 -0
  281. package/.claude/skills/xlsx/SKILL.md +289 -0
  282. package/.claude/skills/xlsx/recalc.py +178 -0
  283. package/.claude-plugin/marketplace.json +2 -2
  284. package/AGENTS.md +165 -86
  285. package/README.md +22 -0
  286. package/cli.js +7 -2
  287. package/development/todos/INDEX.md +10 -1
  288. package/jest.config.js +61 -0
  289. package/lib/commands.js +67 -0
  290. package/lib/migrations.js +154 -0
  291. package/package.json +7 -2
  292. package/scripts/fix-hooks.mjs +97 -0
  293. package/template/.claude/commands/commit-push-pr.md +23 -3
  294. package/template/.claude/hooks/conversation-logger.cjs +222 -0
  295. package/template/.claude/settings.json +114 -45
  296. package/tests/README.md +263 -0
  297. package/tests/commands.test.js +163 -0
  298. package/tests/config.test.js +100 -0
  299. package/tests/marketplace.test.js +304 -0
  300. package/tests/migrations.test.js +187 -0
  301. package/tests/utils.test.js +167 -0
package/lib/commands.js CHANGED
@@ -9,6 +9,7 @@ const path = require('path');
9
9
  const { execSync } = require('child_process');
10
10
  const { loadConfig, CONFIG_DIR, CONFIG_FILE, SKILLS_DIR, ensureDir, saveConfig } = require('./config');
11
11
  const { copyRecursive, toTitleCase } = require('./utils');
12
+ const { runMigrations, TEMPLATE_VERSION } = require('./migrations');
12
13
 
13
14
  const TEMPLATE_DIR = path.join(__dirname, '../template');
14
15
 
@@ -62,6 +63,7 @@ const commands = {
62
63
  // -------------------------------------------------------------------------
63
64
  sync: () => {
64
65
  console.log('🔄 Syncing Sumulige Claude to current project...');
66
+ console.log('');
65
67
 
66
68
  const projectDir = process.cwd();
67
69
  const projectConfigDir = path.join(projectDir, '.claude');
@@ -71,6 +73,17 @@ const commands = {
71
73
 
72
74
  // Create .claude directory
73
75
  ensureDir(projectConfigDir);
76
+
77
+ // Run migrations (version-aware)
78
+ const result = runMigrations(projectDir);
79
+ if (result.migrations.length > 0) {
80
+ console.log(`📦 Migrating project template → v${TEMPLATE_VERSION}`);
81
+ result.migrations.forEach(m => {
82
+ console.log(` ✅ ${m.description}`);
83
+ });
84
+ console.log('');
85
+ }
86
+
74
87
  console.log('✅ Created .claude directory');
75
88
 
76
89
  // Sync config
@@ -118,6 +131,55 @@ const commands = {
118
131
  console.log('✅ Sync complete!');
119
132
  },
120
133
 
134
+ // -------------------------------------------------------------------------
135
+ migrate: () => {
136
+ console.log('🔧 Migrating project to latest format...');
137
+ console.log('');
138
+
139
+ const projectDir = process.cwd();
140
+ const settingsFile = path.join(projectDir, '.claude', 'settings.json');
141
+
142
+ if (!fs.existsSync(settingsFile)) {
143
+ console.log('⚠️ No settings.json found in .claude/');
144
+ console.log(' Run: smc template');
145
+ return;
146
+ }
147
+
148
+ let settings;
149
+ try {
150
+ settings = JSON.parse(fs.readFileSync(settingsFile, 'utf-8'));
151
+ } catch (e) {
152
+ console.log('❌ Invalid JSON in settings.json');
153
+ return;
154
+ }
155
+
156
+ // 检测旧格式
157
+ const isOldFormat = settings.matcher || (settings.hooks && typeof settings.hooks === 'object');
158
+
159
+ if (!isOldFormat) {
160
+ console.log('✅ Already using latest format');
161
+ return;
162
+ }
163
+
164
+ // 读取新模板
165
+ const templateSettings = path.join(TEMPLATE_DIR, '.claude', 'settings.json');
166
+ if (!fs.existsSync(templateSettings)) {
167
+ console.log('❌ Template settings.json not found');
168
+ return;
169
+ }
170
+
171
+ const newSettings = fs.readFileSync(templateSettings, 'utf-8');
172
+ fs.writeFileSync(settingsFile, newSettings);
173
+
174
+ console.log('✅ Migrated settings.json to latest format');
175
+ console.log('');
176
+ console.log('Changes:');
177
+ console.log(' - Old format: {"matcher": "...", "hooks": [...]}');
178
+ console.log(' - New format: {"UserPromptSubmit": [...], "PostToolUse": [...]}');
179
+ console.log('');
180
+ console.log('ℹ️ Hooks will now work correctly!');
181
+ },
182
+
121
183
  // -------------------------------------------------------------------------
122
184
  agent: (task) => {
123
185
  if (!task) {
@@ -565,6 +627,11 @@ const commands = {
565
627
  fs.writeFileSync(path.join(targetClaudeDir, 'ANCHORS.md'), anchorsContent);
566
628
  console.log(' ✅ .claude/ANCHORS.md');
567
629
 
630
+ // Write version file
631
+ const { setProjectVersion } = require('./migrations');
632
+ setProjectVersion(targetDir, TEMPLATE_VERSION);
633
+ console.log(` ✅ .claude/.version (v${TEMPLATE_VERSION})`);
634
+
568
635
  // Initialize Sumulige Claude if installed
569
636
  console.log('');
570
637
  console.log('🤖 Initializing Sumulige Claude...');
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Migrations - Version control for project templates
3
+ *
4
+ * 每个迁移函数:
5
+ * - from: 起始版本
6
+ * - to: 目标版本
7
+ * - migrate: 实际迁移逻辑
8
+ *
9
+ * 迁移链:v1.0.0 → v1.0.2 → v1.0.10 → ...
10
+ */
11
+
12
+ const fs = require('fs');
13
+ const path = require('path');
14
+
15
+ // 当前模板版本
16
+ const TEMPLATE_VERSION = '1.0.10';
17
+
18
+ // 版本文件路径
19
+ const getVersionFile = (projectDir) => path.join(projectDir, '.claude', '.version');
20
+
21
+ // 读取项目版本
22
+ function getProjectVersion(projectDir) {
23
+ const versionFile = getVersionFile(projectDir);
24
+ if (!fs.existsSync(versionFile)) {
25
+ // 没有 version 文件说明是旧版本项目
26
+ return '1.0.0';
27
+ }
28
+ try {
29
+ return fs.readFileSync(versionFile, 'utf-8').trim();
30
+ } catch {
31
+ return '1.0.0';
32
+ }
33
+ }
34
+
35
+ // 写入项目版本
36
+ function setProjectVersion(projectDir, version) {
37
+ const versionFile = getVersionFile(projectDir);
38
+ fs.writeFileSync(versionFile, version + '\n');
39
+ }
40
+
41
+ // 版本比较
42
+ function compareVersions(v1, v2) {
43
+ const parts1 = v1.split('.').map(Number);
44
+ const parts2 = v2.split('.').map(Number);
45
+
46
+ for (let i = 0; i < 3; i++) {
47
+ if (parts1[i] < parts2[i]) return -1;
48
+ if (parts1[i] > parts2[i]) return 1;
49
+ }
50
+ return 0;
51
+ }
52
+
53
+ // 迁移列表
54
+ const migrations = [
55
+ {
56
+ from: '1.0.0',
57
+ to: '1.0.10',
58
+ description: 'Migrate hooks format from old to new',
59
+ migrate: (projectDir) => {
60
+ const settingsFile = path.join(projectDir, '.claude', 'settings.json');
61
+ if (!fs.existsSync(settingsFile)) return;
62
+
63
+ let settings;
64
+ try {
65
+ settings = JSON.parse(fs.readFileSync(settingsFile, 'utf-8'));
66
+ } catch {
67
+ return; // 无效 JSON,跳过
68
+ }
69
+
70
+ // 检测旧格式
71
+ const isOldFormat = settings.matcher || (settings.hooks && typeof settings.hooks === 'object');
72
+ if (!isOldFormat) return;
73
+
74
+ // 读取新模板
75
+ const templateDir = path.join(__dirname, '../template');
76
+ const templateSettings = path.join(templateDir, '.claude', 'settings.json');
77
+
78
+ if (fs.existsSync(templateSettings)) {
79
+ fs.writeFileSync(settingsFile, fs.readFileSync(templateSettings, 'utf-8'));
80
+ }
81
+ }
82
+ }
83
+ ];
84
+
85
+ /**
86
+ * 执行迁移
87
+ * @param {string} projectDir - 项目目录
88
+ * @param {boolean} silent - 是否静默模式
89
+ * @returns {object} { success, migrations, currentVersion }
90
+ */
91
+ function runMigrations(projectDir, silent = false) {
92
+ const currentVersion = getProjectVersion(projectDir);
93
+
94
+ // 已经是最新版本
95
+ if (compareVersions(currentVersion, TEMPLATE_VERSION) >= 0) {
96
+ return {
97
+ success: true,
98
+ migrations: [],
99
+ currentVersion,
100
+ templateVersion: TEMPLATE_VERSION
101
+ };
102
+ }
103
+
104
+ // 找到需要执行的迁移
105
+ const pendingMigrations = migrations.filter(m => {
106
+ const cmp = compareVersions(currentVersion, m.to);
107
+ return cmp < 0; // 只执行版本高于当前版本的迁移
108
+ });
109
+
110
+ // 按版本顺序执行
111
+ pendingMigrations.sort((a, b) => compareVersions(a.to, b.to));
112
+
113
+ const executed = [];
114
+
115
+ for (const migration of pendingMigrations) {
116
+ try {
117
+ if (!silent) {
118
+ console.log(`⬆️ Migrating: ${currentVersion} → ${migration.to}`);
119
+ console.log(` ${migration.description}`);
120
+ }
121
+ migration.migrate(projectDir);
122
+ executed.push(migration);
123
+ setProjectVersion(projectDir, migration.to);
124
+ if (!silent) {
125
+ console.log(` ✅ Done`);
126
+ }
127
+ } catch (error) {
128
+ if (!silent) {
129
+ console.log(` ❌ Failed: ${error.message}`);
130
+ }
131
+ return {
132
+ success: false,
133
+ error: error.message,
134
+ currentVersion,
135
+ executed
136
+ };
137
+ }
138
+ }
139
+
140
+ return {
141
+ success: true,
142
+ migrations: executed,
143
+ currentVersion: TEMPLATE_VERSION,
144
+ templateVersion: TEMPLATE_VERSION
145
+ };
146
+ }
147
+
148
+ module.exports = {
149
+ TEMPLATE_VERSION,
150
+ getProjectVersion,
151
+ setProjectVersion,
152
+ compareVersions,
153
+ runMigrations
154
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sumulige-claude",
3
- "version": "1.0.8",
3
+ "version": "1.0.11",
4
4
  "description": "The Best Agent Harness for Claude Code",
5
5
  "main": "cli.js",
6
6
  "bin": {
@@ -8,7 +8,9 @@
8
8
  "sumulige-claude": "cli.js"
9
9
  },
10
10
  "scripts": {
11
- "test": "echo \"Error: no test specified\" && exit 1",
11
+ "test": "jest",
12
+ "test:coverage": "jest --coverage",
13
+ "test:watch": "jest --watch",
12
14
  "postinstall": "node cli.js init",
13
15
  "sync": "node scripts/sync-external.mjs",
14
16
  "update-registry": "node scripts/update-registry.mjs",
@@ -35,7 +37,10 @@
35
37
  "node": ">=16.0.0"
36
38
  },
37
39
  "devDependencies": {
40
+ "jest": "^30.2.0",
41
+ "mock-fs": "^5.5.0",
38
42
  "prettier": "^3.7.4",
43
+ "sinon": "^21.0.1",
39
44
  "yaml": "^2.8.2"
40
45
  }
41
46
  }
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Fix hooks format from old to new
4
+ * 旧格式:{"matcher": "...", "hooks": [...]}
5
+ * 新格式:{"UserPromptSubmit": [{"matcher": {}, "hooks": [...]}], ...}
6
+ */
7
+
8
+ import fs from 'fs';
9
+ import path from 'path';
10
+
11
+ const NEW_FORMAT = {
12
+ "UserPromptSubmit": [
13
+ {
14
+ "matcher": {},
15
+ "hooks": [
16
+ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/project-kickoff.cjs", "timeout": 1000 },
17
+ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/rag-skill-loader.cjs", "timeout": 1000 },
18
+ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/thinking-silent.cjs", "timeout": 1000 },
19
+ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/multi-session.cjs", "timeout": 1000 },
20
+ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/todo-manager.cjs", "timeout": 1000 }
21
+ ]
22
+ }
23
+ ],
24
+ "PreToolUse": [
25
+ {
26
+ "matcher": {},
27
+ "hooks": [
28
+ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/thinking-silent.cjs", "timeout": 1000 },
29
+ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/multi-session.cjs", "timeout": 1000 },
30
+ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/todo-manager.cjs", "timeout": 1000 }
31
+ ]
32
+ }
33
+ ],
34
+ "PostToolUse": [
35
+ {
36
+ "matcher": {},
37
+ "hooks": [
38
+ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/code-formatter.cjs", "timeout": 5000 },
39
+ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/verify-work.cjs", "timeout": 1000 },
40
+ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/thinking-silent.cjs", "timeout": 1000 },
41
+ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/multi-session.cjs", "timeout": 1000 },
42
+ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/todo-manager.cjs", "timeout": 1000 }
43
+ ]
44
+ }
45
+ ],
46
+ "AgentStop": [
47
+ {
48
+ "matcher": {},
49
+ "hooks": [
50
+ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/verify-work.cjs", "timeout": 1000 },
51
+ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/thinking-silent.cjs", "timeout": 1000 },
52
+ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/multi-session.cjs", "timeout": 1000 },
53
+ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/todo-manager.cjs", "timeout": 1000 }
54
+ ]
55
+ }
56
+ ]
57
+ };
58
+
59
+ function fixProject(projectPath) {
60
+ const settingsFile = path.join(projectPath, '.claude', 'settings.json');
61
+
62
+ if (!fs.existsSync(settingsFile)) {
63
+ console.log(`⚠️ ${projectPath} - no settings.json`);
64
+ return false;
65
+ }
66
+
67
+ let settings;
68
+ try {
69
+ settings = JSON.parse(fs.readFileSync(settingsFile, 'utf-8'));
70
+ } catch (e) {
71
+ console.log(`❌ ${projectPath} - invalid JSON`);
72
+ return false;
73
+ }
74
+
75
+ // 检测旧格式
76
+ const isOldFormat = settings.matcher || (settings.hooks && typeof settings.hooks === 'object');
77
+
78
+ if (!isOldFormat) {
79
+ console.log(`✅ ${projectPath} - already new format`);
80
+ return false;
81
+ }
82
+
83
+ // 写入新格式
84
+ fs.writeFileSync(settingsFile, JSON.stringify(NEW_FORMAT, null, 2) + '\n');
85
+ console.log(`🔧 ${projectPath} - fixed!`);
86
+ return true;
87
+ }
88
+
89
+ // CLI
90
+ const args = process.argv.slice(2);
91
+
92
+ if (args.length === 0) {
93
+ // 当前目录
94
+ fixProject(process.cwd());
95
+ } else {
96
+ args.forEach(fixProject);
97
+ }
@@ -22,7 +22,27 @@ Analyze the changes and:
22
22
  2. Identify the main purpose of the changes
23
23
  3. Check if there are any sensitive files that shouldn't be committed
24
24
 
25
- ## Step 3: Stage and Commit
25
+ ## Step 3: Code Simplification (Before Commit)
26
+
27
+ **IMPORTANT**: Before creating the commit, simplify and refine the code changes:
28
+
29
+ 1. Review the recently modified code sections
30
+ 2. Apply code simplification focusing on:
31
+ - Code clarity and consistency
32
+ - Reducing unnecessary complexity and nesting
33
+ - Eliminating redundant code and abstractions
34
+ - Following project standards (if CLAUDE.md exists)
35
+ - Preserving exact functionality
36
+ 3. Use explicit, readable code over overly compact solutions
37
+
38
+ **Trigger phrases to apply simplification**:
39
+ - "简化此代码" (Simplify this code)
40
+ - "使这更清晰" (Make this clearer)
41
+ - "优化此实现" (Optimize this implementation)
42
+
43
+ Ask the user: "是否需要简化代码?(Need code simplification?)" - if yes, apply code-simplifier agent before proceeding.
44
+
45
+ ## Step 4: Stage and Commit
26
46
 
27
47
  If there are unstaged changes that should be included, ask the user first.
28
48
 
@@ -36,7 +56,7 @@ Then create a commit with a clear message following this format:
36
56
  Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
37
57
  ```
38
58
 
39
- ## Step 4: Push and Create PR
59
+ ## Step 5: Push and Create PR
40
60
 
41
61
  1. Push the changes to remote
42
62
  2. Check if there's an open PR for this branch using:
@@ -51,7 +71,7 @@ Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
51
71
  - Test plan (checklist)
52
72
  - Link to any related issues
53
73
 
54
- ## Step 5: Verify
74
+ ## Step 6: Verify
55
75
 
56
76
  After creating the PR, show the PR URL and check CI status using:
57
77
  ```bash
@@ -0,0 +1,222 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Conversation Logger - 增强版对话记录器
4
+ *
5
+ * 自动记录每次对话到 DAILY_CONVERSATION.md
6
+ * 按日期分组,无需手动触发
7
+ *
8
+ * 功能:
9
+ * - 捕获用户输入和 AI 输出
10
+ * - 记录工具使用
11
+ * - 按日期自动分组
12
+ * - 实时追加到日志
13
+ */
14
+
15
+ const fs = require('fs');
16
+ const path = require('path');
17
+
18
+ const PROJECT_DIR = process.env.CLAUDE_PROJECT_DIR || process.cwd();
19
+ const CONVERSATION_LOG = path.join(PROJECT_DIR, '.claude', 'DAILY_CONVERSATION.md');
20
+ const THINKING_DIR = path.join(PROJECT_DIR, '.claude', 'thinking-routes');
21
+ const FLOW_FILE = path.join(THINKING_DIR, '.conversation-flow.json');
22
+
23
+ // 确保目录存在
24
+ try { fs.mkdirSync(THINKING_DIR, { recursive: true }); } catch (e) {}
25
+
26
+ // 获取当前日期字符串 (YYYY-MM-DD)
27
+ function getDateStr() {
28
+ const now = new Date();
29
+ const year = now.getFullYear();
30
+ const month = String(now.getMonth() + 1).padStart(2, '0');
31
+ const day = String(now.getDate()).padStart(2, '0');
32
+ return `${year}-${month}-${day}`;
33
+ }
34
+
35
+ // 获取当前时间字符串 (HH:MM)
36
+ function getTimeStr() {
37
+ const now = new Date();
38
+ const hours = String(now.getHours()).padStart(2, '0');
39
+ const minutes = String(now.getMinutes()).padStart(2, '0');
40
+ return `${hours}:${minutes}`;
41
+ }
42
+
43
+ // 转义 Markdown 特殊字符
44
+ function escapeMarkdown(text) {
45
+ if (!text) return '';
46
+ return text
47
+ .replace(/\|/g, '\\|')
48
+ .replace(/\n/g, ' ')
49
+ .slice(0, 500); // 限制长度
50
+ }
51
+
52
+ // 初始化日志文件
53
+ function initLogFile() {
54
+ if (!fs.existsSync(CONVERSATION_LOG)) {
55
+ const header = `# 每日对话记录
56
+
57
+ > 此文件由 conversation-logger.cjs 自动生成
58
+ > 记录与 AI 的每次对话
59
+
60
+ ---
61
+ `;
62
+ fs.writeFileSync(CONVERSATION_LOG, header, 'utf-8');
63
+ }
64
+ }
65
+
66
+ // 追加对话到日志
67
+ function appendConversation(role, content, toolInfo = '') {
68
+ initLogFile();
69
+
70
+ const dateStr = getDateStr();
71
+ const timeStr = getTimeStr();
72
+ const roleLabel = role === 'user' ? '👤 用户' : role === 'assistant' ? '🤖 AI' : '🔧 工具';
73
+ const safeContent = escapeMarkdown(content);
74
+
75
+ const entry = `### ${timeStr} - ${roleLabel}
76
+ ${safeContent}${toolInfo ? `\n> ${toolInfo}` : ''}
77
+
78
+ `;
79
+
80
+ // 读取现有内容
81
+ let logContent = fs.readFileSync(CONVERSATION_LOG, 'utf-8');
82
+
83
+ // 检查今天是否已有日期头
84
+ const todayHeader = `## ${dateStr}`;
85
+ const todayIndex = logContent.indexOf(todayHeader);
86
+
87
+ if (todayIndex === -1) {
88
+ // 今天还没有记录,添加新的日期头
89
+ const todaySection = `
90
+ ---
91
+
92
+ ## ${dateStr}
93
+
94
+ ${entry}
95
+ `;
96
+ logContent += todaySection;
97
+ } else {
98
+ // 找到今天的记录位置,在末尾追加
99
+ // 使用正则确保只匹配 ## 开头的日期行,而不是 ### 开头的条目
100
+ const afterToday = logContent.slice(todayIndex + todayHeader.length);
101
+ const dateMatch = afterToday.match(/^## \d{4}-\d{2}-\d{2}/m);
102
+ const nextDateIndex = dateMatch ? todayIndex + todayHeader.length + dateMatch.index : -1;
103
+
104
+ if (nextDateIndex === -1) {
105
+ // 今天是最后一天,直接追加到文件末尾
106
+ logContent += entry;
107
+ } else {
108
+ // 在下一天之前插入
109
+ logContent = logContent.slice(0, nextDateIndex) + entry + logContent.slice(nextDateIndex);
110
+ }
111
+ }
112
+
113
+ // 写回文件
114
+ fs.writeFileSync(CONVERSATION_LOG, logContent, 'utf-8');
115
+ }
116
+
117
+ // 从思维轨迹读取并记录完整对话
118
+ function syncFromFlowFile() {
119
+ if (!fs.existsSync(FLOW_FILE)) {
120
+ return;
121
+ }
122
+
123
+ try {
124
+ const flow = JSON.parse(fs.readFileSync(FLOW_FILE, 'utf-8'));
125
+ const turns = flow.turns || [];
126
+
127
+ if (turns.length === 0) return;
128
+
129
+ // 读取现有日志,记录已处理的 turn
130
+ const logContent = fs.existsSync(CONVERSATION_LOG)
131
+ ? fs.readFileSync(CONVERSATION_LOG, 'utf-8')
132
+ : '';
133
+ initLogFile();
134
+
135
+ // 简单的追踪:只记录最新的几次交互
136
+ const recentTurns = turns.slice(-5);
137
+
138
+ recentTurns.forEach(turn => {
139
+ const time = turn.time ? new Date(turn.time).toISOString() : '';
140
+ const toolName = turn.toolName || '';
141
+ const type = turn.type || '';
142
+
143
+ // 根据 turn 类型记录
144
+ if (type === 'potential-action' && toolName) {
145
+ appendConversation('tool', `[${toolName}]`, turn.description || '');
146
+ }
147
+ });
148
+ } catch (e) {
149
+ // 静默处理错误
150
+ }
151
+ }
152
+
153
+ // 主函数
154
+ function main() {
155
+ try {
156
+ const eventType = process.env.CLAUDE_EVENT_TYPE || '';
157
+ const toolName = process.env.CLAUDE_TOOL_NAME || '';
158
+ const toolInput = process.env.CLAUDE_TOOL_INPUT || '';
159
+ const textOutput = process.env.CLAUDE_TEXT_OUTPUT || '';
160
+
161
+ // 根据事件类型记录
162
+ switch (eventType) {
163
+ case 'UserPromptSubmit':
164
+ // 用户提交输入
165
+ if (toolInput) {
166
+ appendConversation('user', toolInput);
167
+ }
168
+ break;
169
+
170
+ case 'TextOutput':
171
+ // AI 输出文本
172
+ if (textOutput) {
173
+ appendConversation('assistant', textOutput);
174
+ }
175
+ break;
176
+
177
+ case 'PostToolUse':
178
+ // 工具使用后
179
+ if (toolName) {
180
+ appendConversation('tool', toolInput, `使用工具: ${toolName}`);
181
+ }
182
+ break;
183
+
184
+ case 'AgentStop':
185
+ // 会话结束,同步思维轨迹
186
+ syncFromFlowFile();
187
+ break;
188
+ }
189
+
190
+ } catch (e) {
191
+ // 静默处理错误,不干扰正常对话
192
+ }
193
+
194
+ process.exit(0);
195
+ }
196
+
197
+ // 如果直接运行,执行同步
198
+ if (require.main === module) {
199
+ if (process.argv.includes('--sync')) {
200
+ syncFromFlowFile();
201
+ console.log('✅ 已同步对话记录');
202
+ } else if (process.argv.includes('--view')) {
203
+ // 查看今日对话
204
+ if (fs.existsSync(CONVERSATION_LOG)) {
205
+ const content = fs.readFileSync(CONVERSATION_LOG, 'utf-8');
206
+ const today = getDateStr();
207
+ const start = content.indexOf(`## ${today}`);
208
+ if (start !== -1) {
209
+ const end = content.indexOf('## ', start + 10);
210
+ console.log(content.slice(start, end === -1 ? undefined : end));
211
+ } else {
212
+ console.log('📭 今天暂无对话记录');
213
+ }
214
+ } else {
215
+ console.log('📭 暂无对话记录');
216
+ }
217
+ } else {
218
+ main();
219
+ }
220
+ }
221
+
222
+ module.exports = { main, syncFromFlowFile, appendConversation };