cli-jaw 0.1.7 → 0.1.8

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 (744) hide show
  1. package/README.ko.md +68 -71
  2. package/README.md +65 -79
  3. package/README.zh-CN.md +68 -73
  4. package/dist/bin/cli-claw.js +96 -0
  5. package/dist/bin/cli-claw.js.map +1 -0
  6. package/dist/bin/cli-jaw.js +0 -0
  7. package/dist/bin/commands/init.js +36 -19
  8. package/dist/bin/commands/init.js.map +1 -1
  9. package/dist/bin/postinstall.js +175 -104
  10. package/dist/bin/postinstall.js.map +1 -1
  11. package/dist/lib/mcp-sync.js +43 -4
  12. package/dist/lib/mcp-sync.js.map +1 -1
  13. package/dist/server.js +22 -103
  14. package/dist/server.js.map +1 -1
  15. package/dist/src/cli/acp-client.js +1 -1
  16. package/dist/src/cli/command-context.js +73 -0
  17. package/dist/src/cli/command-context.js.map +1 -0
  18. package/dist/src/core/db.js +1 -1
  19. package/dist/src/memory/heartbeat.js +2 -1
  20. package/dist/src/memory/heartbeat.js.map +1 -1
  21. package/dist/src/orchestrator/collect.js +53 -0
  22. package/dist/src/orchestrator/collect.js.map +1 -0
  23. package/dist/src/orchestrator/gateway.js +49 -0
  24. package/dist/src/orchestrator/gateway.js.map +1 -0
  25. package/dist/src/telegram/bot.js +32 -119
  26. package/dist/src/telegram/bot.js.map +1 -1
  27. package/package.json +7 -7
  28. package/public/css/sidebar.css +14 -0
  29. package/public/dist/bundle.js +21 -21
  30. package/public/dist/bundle.js.map +3 -3
  31. package/public/index.html +2 -2
  32. package/public/js/features/settings.js +1 -2
  33. package/public/js/main.js +0 -1
  34. package/scripts/check-copilot-gap.js +57 -0
  35. package/scripts/check-deps-offline.mjs +75 -0
  36. package/scripts/check-deps-online.sh +26 -0
  37. package/scripts/i18n-registry.py +208 -0
  38. package/scripts/postinstall-guard.cjs +63 -0
  39. package/scripts/release.sh +30 -0
  40. package/skills_ref/1password/SKILL.md +0 -70
  41. package/skills_ref/agents-sdk/SKILL.md +0 -155
  42. package/skills_ref/agents-sdk/references/callable.md +0 -92
  43. package/skills_ref/agents-sdk/references/codemode.md +0 -207
  44. package/skills_ref/agents-sdk/references/email.md +0 -146
  45. package/skills_ref/agents-sdk/references/mcp.md +0 -154
  46. package/skills_ref/agents-sdk/references/state-scheduling.md +0 -164
  47. package/skills_ref/agents-sdk/references/streaming-chat.md +0 -178
  48. package/skills_ref/agents-sdk/references/workflows.md +0 -132
  49. package/skills_ref/algorithmic-art/LICENSE.txt +0 -202
  50. package/skills_ref/algorithmic-art/SKILL.md +0 -405
  51. package/skills_ref/algorithmic-art/templates/generator_template.js +0 -223
  52. package/skills_ref/algorithmic-art/templates/viewer.html +0 -599
  53. package/skills_ref/apple-notes/SKILL.md +0 -77
  54. package/skills_ref/apple-reminders/SKILL.md +0 -118
  55. package/skills_ref/atlas/SKILL.md +0 -99
  56. package/skills_ref/brainstorming/SKILL.md +0 -96
  57. package/skills_ref/browser/SKILL.md +0 -179
  58. package/skills_ref/canvas-design/LICENSE.txt +0 -202
  59. package/skills_ref/canvas-design/SKILL.md +0 -130
  60. package/skills_ref/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
  61. package/skills_ref/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  62. package/skills_ref/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  63. package/skills_ref/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
  64. package/skills_ref/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  65. package/skills_ref/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
  66. package/skills_ref/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  67. package/skills_ref/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  68. package/skills_ref/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
  69. package/skills_ref/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  70. package/skills_ref/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  71. package/skills_ref/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  72. package/skills_ref/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
  73. package/skills_ref/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  74. package/skills_ref/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
  75. package/skills_ref/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  76. package/skills_ref/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
  77. package/skills_ref/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  78. package/skills_ref/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  79. package/skills_ref/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
  80. package/skills_ref/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  81. package/skills_ref/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
  82. package/skills_ref/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  83. package/skills_ref/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  84. package/skills_ref/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
  85. package/skills_ref/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  86. package/skills_ref/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  87. package/skills_ref/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  88. package/skills_ref/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  89. package/skills_ref/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  90. package/skills_ref/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  91. package/skills_ref/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  92. package/skills_ref/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  93. package/skills_ref/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
  94. package/skills_ref/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  95. package/skills_ref/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  96. package/skills_ref/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  97. package/skills_ref/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
  98. package/skills_ref/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  99. package/skills_ref/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  100. package/skills_ref/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
  101. package/skills_ref/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  102. package/skills_ref/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  103. package/skills_ref/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  104. package/skills_ref/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
  105. package/skills_ref/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
  106. package/skills_ref/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  107. package/skills_ref/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  108. package/skills_ref/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  109. package/skills_ref/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  110. package/skills_ref/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
  111. package/skills_ref/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  112. package/skills_ref/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  113. package/skills_ref/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
  114. package/skills_ref/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  115. package/skills_ref/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
  116. package/skills_ref/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  117. package/skills_ref/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  118. package/skills_ref/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
  119. package/skills_ref/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  120. package/skills_ref/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  121. package/skills_ref/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
  122. package/skills_ref/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
  123. package/skills_ref/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  124. package/skills_ref/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  125. package/skills_ref/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
  126. package/skills_ref/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  127. package/skills_ref/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
  128. package/skills_ref/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  129. package/skills_ref/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  130. package/skills_ref/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
  131. package/skills_ref/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  132. package/skills_ref/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
  133. package/skills_ref/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  134. package/skills_ref/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  135. package/skills_ref/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  136. package/skills_ref/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  137. package/skills_ref/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
  138. package/skills_ref/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  139. package/skills_ref/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
  140. package/skills_ref/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  141. package/skills_ref/changelog-generator/SKILL.md +0 -104
  142. package/skills_ref/cloudflare-deploy/SKILL.md +0 -207
  143. package/skills_ref/codebase-orientation/SKILL.md +0 -29
  144. package/skills_ref/config-file-explainer/SKILL.md +0 -26
  145. package/skills_ref/context-compression/SKILL.md +0 -265
  146. package/skills_ref/context-compression/references/evaluation-framework.md +0 -213
  147. package/skills_ref/context-compression/scripts/compression_evaluator.py +0 -658
  148. package/skills_ref/data-structure-chooser/SKILL.md +0 -26
  149. package/skills_ref/debugging-checklist/SKILL.md +0 -26
  150. package/skills_ref/debugging-helpers/CREATION-LOG.md +0 -119
  151. package/skills_ref/debugging-helpers/SKILL.md +0 -296
  152. package/skills_ref/debugging-helpers/condition-based-waiting-example.ts +0 -158
  153. package/skills_ref/debugging-helpers/condition-based-waiting.md +0 -115
  154. package/skills_ref/debugging-helpers/defense-in-depth.md +0 -122
  155. package/skills_ref/debugging-helpers/find-polluter.sh +0 -63
  156. package/skills_ref/debugging-helpers/root-cause-tracing.md +0 -169
  157. package/skills_ref/debugging-helpers/test-academic.md +0 -14
  158. package/skills_ref/debugging-helpers/test-pressure-1.md +0 -58
  159. package/skills_ref/debugging-helpers/test-pressure-2.md +0 -68
  160. package/skills_ref/debugging-helpers/test-pressure-3.md +0 -69
  161. package/skills_ref/deep-research/.env.example +0 -7
  162. package/skills_ref/deep-research/README.md +0 -246
  163. package/skills_ref/deep-research/SKILL.md +0 -106
  164. package/skills_ref/deep-research/requirements.txt +0 -2
  165. package/skills_ref/deep-research/scripts/research.py +0 -692
  166. package/skills_ref/dependency-install-helper/SKILL.md +0 -26
  167. package/skills_ref/dev/SKILL.md +0 -65
  168. package/skills_ref/dev-backend/SKILL.md +0 -61
  169. package/skills_ref/dev-data/SKILL.md +0 -76
  170. package/skills_ref/dev-frontend/LICENSE.txt +0 -177
  171. package/skills_ref/dev-frontend/SKILL.md +0 -42
  172. package/skills_ref/dev-testing/LICENSE.txt +0 -202
  173. package/skills_ref/dev-testing/SKILL.md +0 -96
  174. package/skills_ref/dev-testing/examples/console_logging.py +0 -35
  175. package/skills_ref/dev-testing/examples/element_discovery.py +0 -40
  176. package/skills_ref/dev-testing/examples/static_html_automation.py +0 -33
  177. package/skills_ref/dev-testing/scripts/with_server.py +0 -106
  178. package/skills_ref/develop-web-game/SKILL.md +0 -149
  179. package/skills_ref/differential-review/.claude-plugin/plugin.json +0 -10
  180. package/skills_ref/differential-review/README.md +0 -109
  181. package/skills_ref/differential-review/commands/diff-review.md +0 -21
  182. package/skills_ref/differential-review/skills/differential-review/SKILL.md +0 -220
  183. package/skills_ref/differential-review/skills/differential-review/adversarial.md +0 -203
  184. package/skills_ref/differential-review/skills/differential-review/methodology.md +0 -234
  185. package/skills_ref/differential-review/skills/differential-review/patterns.md +0 -300
  186. package/skills_ref/differential-review/skills/differential-review/reporting.md +0 -369
  187. package/skills_ref/dispatching-parallel-agents/SKILL.md +0 -180
  188. package/skills_ref/doc-coauthoring/SKILL.md +0 -375
  189. package/skills_ref/docx/LICENSE.txt +0 -30
  190. package/skills_ref/docx/SKILL.md +0 -481
  191. package/skills_ref/docx/scripts/__init__.py +0 -1
  192. package/skills_ref/docx/scripts/accept_changes.py +0 -135
  193. package/skills_ref/docx/scripts/comment.py +0 -318
  194. package/skills_ref/docx/scripts/office/helpers/__init__.py +0 -0
  195. package/skills_ref/docx/scripts/office/helpers/merge_runs.py +0 -199
  196. package/skills_ref/docx/scripts/office/helpers/simplify_redlines.py +0 -197
  197. package/skills_ref/docx/scripts/office/pack.py +0 -159
  198. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  199. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  200. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  201. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  202. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  203. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  204. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  205. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  206. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  207. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  208. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  209. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  210. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  211. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  212. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  213. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  214. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  215. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  216. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  217. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  218. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  219. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  220. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  221. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  222. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  223. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  224. package/skills_ref/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  225. package/skills_ref/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  226. package/skills_ref/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  227. package/skills_ref/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  228. package/skills_ref/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  229. package/skills_ref/docx/scripts/office/schemas/mce/mc.xsd +0 -75
  230. package/skills_ref/docx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  231. package/skills_ref/docx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  232. package/skills_ref/docx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  233. package/skills_ref/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  234. package/skills_ref/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  235. package/skills_ref/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  236. package/skills_ref/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  237. package/skills_ref/docx/scripts/office/soffice.py +0 -183
  238. package/skills_ref/docx/scripts/office/unpack.py +0 -132
  239. package/skills_ref/docx/scripts/office/validate.py +0 -111
  240. package/skills_ref/docx/scripts/office/validators/__init__.py +0 -15
  241. package/skills_ref/docx/scripts/office/validators/base.py +0 -847
  242. package/skills_ref/docx/scripts/office/validators/docx.py +0 -446
  243. package/skills_ref/docx/scripts/office/validators/pptx.py +0 -275
  244. package/skills_ref/docx/scripts/office/validators/redlining.py +0 -247
  245. package/skills_ref/docx/scripts/templates/comments.xml +0 -3
  246. package/skills_ref/docx/scripts/templates/commentsExtended.xml +0 -3
  247. package/skills_ref/docx/scripts/templates/commentsExtensible.xml +0 -3
  248. package/skills_ref/docx/scripts/templates/commentsIds.xml +0 -3
  249. package/skills_ref/docx/scripts/templates/people.xml +0 -3
  250. package/skills_ref/durable-objects/SKILL.md +0 -186
  251. package/skills_ref/durable-objects/references/rules.md +0 -286
  252. package/skills_ref/durable-objects/references/testing.md +0 -264
  253. package/skills_ref/durable-objects/references/workers.md +0 -346
  254. package/skills_ref/email-draft-polish/SKILL.md +0 -24
  255. package/skills_ref/error-message-explainer/SKILL.md +0 -27
  256. package/skills_ref/fal-image-edit/SKILL.md +0 -249
  257. package/skills_ref/fal-image-edit/scripts/edit-image.sh +0 -199
  258. package/skills_ref/figma-implement-design/SKILL.md +0 -264
  259. package/skills_ref/git-worktrees/SKILL.md +0 -218
  260. package/skills_ref/github/SKILL.md +0 -210
  261. package/skills_ref/gog/SKILL.md +0 -116
  262. package/skills_ref/goplaces/SKILL.md +0 -52
  263. package/skills_ref/himalaya/SKILL.md +0 -257
  264. package/skills_ref/hugging-face-cli/SKILL.md +0 -186
  265. package/skills_ref/hugging-face-cli/references/commands.md +0 -954
  266. package/skills_ref/hugging-face-cli/references/examples.md +0 -374
  267. package/skills_ref/hugging-face-evaluation/SKILL.md +0 -651
  268. package/skills_ref/hugging-face-evaluation/examples/.env.example +0 -7
  269. package/skills_ref/hugging-face-evaluation/examples/USAGE_EXAMPLES.md +0 -382
  270. package/skills_ref/hugging-face-evaluation/examples/artificial_analysis_to_hub.py +0 -141
  271. package/skills_ref/hugging-face-evaluation/examples/example_readme_tables.md +0 -135
  272. package/skills_ref/hugging-face-evaluation/examples/metric_mapping.json +0 -50
  273. package/skills_ref/hugging-face-evaluation/requirements.txt +0 -20
  274. package/skills_ref/hugging-face-evaluation/scripts/evaluation_manager.py +0 -1374
  275. package/skills_ref/hugging-face-evaluation/scripts/inspect_eval_uv.py +0 -104
  276. package/skills_ref/hugging-face-evaluation/scripts/inspect_vllm_uv.py +0 -317
  277. package/skills_ref/hugging-face-evaluation/scripts/lighteval_vllm_uv.py +0 -303
  278. package/skills_ref/hugging-face-evaluation/scripts/run_eval_job.py +0 -98
  279. package/skills_ref/hugging-face-evaluation/scripts/run_vllm_eval_job.py +0 -331
  280. package/skills_ref/hugging-face-evaluation/scripts/test_extraction.py +0 -206
  281. package/skills_ref/hugging-face-model-trainer/SKILL.md +0 -718
  282. package/skills_ref/hugging-face-model-trainer/references/gguf_conversion.md +0 -296
  283. package/skills_ref/hugging-face-model-trainer/references/hardware_guide.md +0 -283
  284. package/skills_ref/hugging-face-model-trainer/references/hub_saving.md +0 -364
  285. package/skills_ref/hugging-face-model-trainer/references/reliability_principles.md +0 -371
  286. package/skills_ref/hugging-face-model-trainer/references/trackio_guide.md +0 -189
  287. package/skills_ref/hugging-face-model-trainer/references/training_methods.md +0 -150
  288. package/skills_ref/hugging-face-model-trainer/references/training_patterns.md +0 -203
  289. package/skills_ref/hugging-face-model-trainer/references/troubleshooting.md +0 -282
  290. package/skills_ref/hugging-face-model-trainer/references/unsloth.md +0 -313
  291. package/skills_ref/hugging-face-model-trainer/scripts/convert_to_gguf.py +0 -424
  292. package/skills_ref/hugging-face-model-trainer/scripts/dataset_inspector.py +0 -417
  293. package/skills_ref/hugging-face-model-trainer/scripts/estimate_cost.py +0 -150
  294. package/skills_ref/hugging-face-model-trainer/scripts/train_dpo_example.py +0 -106
  295. package/skills_ref/hugging-face-model-trainer/scripts/train_grpo_example.py +0 -89
  296. package/skills_ref/hugging-face-model-trainer/scripts/train_sft_example.py +0 -122
  297. package/skills_ref/hugging-face-model-trainer/scripts/unsloth_sft_example.py +0 -512
  298. package/skills_ref/imagegen/SKILL.md +0 -174
  299. package/skills_ref/insecure-defaults/.claude-plugin/plugin.json +0 -10
  300. package/skills_ref/insecure-defaults/README.md +0 -45
  301. package/skills_ref/insecure-defaults/skills/insecure-defaults/SKILL.md +0 -117
  302. package/skills_ref/insecure-defaults/skills/insecure-defaults/references/examples.md +0 -409
  303. package/skills_ref/jupyter-notebook/SKILL.md +0 -107
  304. package/skills_ref/linear/SKILL.md +0 -87
  305. package/skills_ref/linter-fix-guide/SKILL.md +0 -27
  306. package/skills_ref/log-summarizer/SKILL.md +0 -27
  307. package/skills_ref/mcp-builder/LICENSE.txt +0 -202
  308. package/skills_ref/mcp-builder/SKILL.md +0 -236
  309. package/skills_ref/mcp-builder/reference/evaluation.md +0 -602
  310. package/skills_ref/mcp-builder/reference/mcp_best_practices.md +0 -249
  311. package/skills_ref/mcp-builder/reference/node_mcp_server.md +0 -970
  312. package/skills_ref/mcp-builder/reference/python_mcp_server.md +0 -719
  313. package/skills_ref/mcp-builder/scripts/connections.py +0 -151
  314. package/skills_ref/mcp-builder/scripts/evaluation.py +0 -373
  315. package/skills_ref/mcp-builder/scripts/example_evaluation.xml +0 -22
  316. package/skills_ref/mcp-builder/scripts/requirements.txt +0 -2
  317. package/skills_ref/memory/SKILL.md +0 -129
  318. package/skills_ref/modern-python/.claude-plugin/plugin.json +0 -10
  319. package/skills_ref/modern-python/README.md +0 -66
  320. package/skills_ref/modern-python/hooks/hooks.json +0 -16
  321. package/skills_ref/modern-python/hooks/setup-shims.bats +0 -70
  322. package/skills_ref/modern-python/hooks/setup-shims.sh +0 -24
  323. package/skills_ref/modern-python/hooks/shims/pip +0 -27
  324. package/skills_ref/modern-python/hooks/shims/pip-shim.bats +0 -45
  325. package/skills_ref/modern-python/hooks/shims/pip3 +0 -27
  326. package/skills_ref/modern-python/hooks/shims/pipx +0 -41
  327. package/skills_ref/modern-python/hooks/shims/pipx-shim.bats +0 -64
  328. package/skills_ref/modern-python/hooks/shims/python +0 -26
  329. package/skills_ref/modern-python/hooks/shims/python-shim.bats +0 -53
  330. package/skills_ref/modern-python/hooks/shims/python3 +0 -26
  331. package/skills_ref/modern-python/hooks/shims/uv +0 -27
  332. package/skills_ref/modern-python/hooks/shims/uv-shim.bats +0 -47
  333. package/skills_ref/modern-python/skills/modern-python/SKILL.md +0 -333
  334. package/skills_ref/modern-python/skills/modern-python/references/dependabot.md +0 -43
  335. package/skills_ref/modern-python/skills/modern-python/references/migration-checklist.md +0 -141
  336. package/skills_ref/modern-python/skills/modern-python/references/pep723-scripts.md +0 -259
  337. package/skills_ref/modern-python/skills/modern-python/references/prek.md +0 -211
  338. package/skills_ref/modern-python/skills/modern-python/references/pyproject.md +0 -254
  339. package/skills_ref/modern-python/skills/modern-python/references/ruff-config.md +0 -240
  340. package/skills_ref/modern-python/skills/modern-python/references/security-setup.md +0 -255
  341. package/skills_ref/modern-python/skills/modern-python/references/testing.md +0 -284
  342. package/skills_ref/modern-python/skills/modern-python/references/uv-commands.md +0 -200
  343. package/skills_ref/modern-python/skills/modern-python/templates/dependabot.yml +0 -36
  344. package/skills_ref/modern-python/skills/modern-python/templates/pre-commit-config.yaml +0 -66
  345. package/skills_ref/nano-banana-pro/SKILL.md +0 -58
  346. package/skills_ref/netlify-deploy/SKILL.md +0 -233
  347. package/skills_ref/notion/SKILL.md +0 -304
  348. package/skills_ref/notion-knowledge-capture/SKILL.md +0 -56
  349. package/skills_ref/notion-meeting-intelligence/SKILL.md +0 -60
  350. package/skills_ref/notion-research-documentation/SKILL.md +0 -59
  351. package/skills_ref/notion-spec-to-implementation/SKILL.md +0 -58
  352. package/skills_ref/obsidian/SKILL.md +0 -81
  353. package/skills_ref/openai-docs/SKILL.md +0 -56
  354. package/skills_ref/openhue/SKILL.md +0 -112
  355. package/skills_ref/pdf/SKILL.md +0 -69
  356. package/skills_ref/postgres/README.md +0 -77
  357. package/skills_ref/postgres/SKILL.md +0 -129
  358. package/skills_ref/postgres/connections.example.json +0 -34
  359. package/skills_ref/postgres/requirements.txt +0 -1
  360. package/skills_ref/postgres/scripts/query.py +0 -262
  361. package/skills_ref/pptx/LICENSE.txt +0 -30
  362. package/skills_ref/pptx/SKILL.md +0 -232
  363. package/skills_ref/pptx/editing.md +0 -205
  364. package/skills_ref/pptx/pptxgenjs.md +0 -420
  365. package/skills_ref/pptx/scripts/__init__.py +0 -0
  366. package/skills_ref/pptx/scripts/add_slide.py +0 -195
  367. package/skills_ref/pptx/scripts/clean.py +0 -286
  368. package/skills_ref/pptx/scripts/office/helpers/__init__.py +0 -0
  369. package/skills_ref/pptx/scripts/office/helpers/merge_runs.py +0 -199
  370. package/skills_ref/pptx/scripts/office/helpers/simplify_redlines.py +0 -197
  371. package/skills_ref/pptx/scripts/office/pack.py +0 -159
  372. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  373. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  374. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  375. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  376. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  377. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  378. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  379. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  380. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  381. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  382. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  383. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  384. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  385. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  386. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  387. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  388. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  389. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  390. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  391. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  392. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  393. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  394. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  395. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  396. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  397. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  398. package/skills_ref/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  399. package/skills_ref/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  400. package/skills_ref/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  401. package/skills_ref/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  402. package/skills_ref/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  403. package/skills_ref/pptx/scripts/office/schemas/mce/mc.xsd +0 -75
  404. package/skills_ref/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  405. package/skills_ref/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  406. package/skills_ref/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  407. package/skills_ref/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  408. package/skills_ref/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  409. package/skills_ref/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  410. package/skills_ref/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  411. package/skills_ref/pptx/scripts/office/soffice.py +0 -183
  412. package/skills_ref/pptx/scripts/office/unpack.py +0 -132
  413. package/skills_ref/pptx/scripts/office/validate.py +0 -111
  414. package/skills_ref/pptx/scripts/office/validators/__init__.py +0 -15
  415. package/skills_ref/pptx/scripts/office/validators/base.py +0 -847
  416. package/skills_ref/pptx/scripts/office/validators/docx.py +0 -446
  417. package/skills_ref/pptx/scripts/office/validators/pptx.py +0 -275
  418. package/skills_ref/pptx/scripts/office/validators/redlining.py +0 -247
  419. package/skills_ref/pptx/scripts/thumbnail.py +0 -289
  420. package/skills_ref/property-based-testing/.claude-plugin/plugin.json +0 -9
  421. package/skills_ref/property-based-testing/README.md +0 -47
  422. package/skills_ref/property-based-testing/skills/property-based-testing/README.md +0 -88
  423. package/skills_ref/property-based-testing/skills/property-based-testing/SKILL.md +0 -123
  424. package/skills_ref/property-based-testing/skills/property-based-testing/references/design.md +0 -191
  425. package/skills_ref/property-based-testing/skills/property-based-testing/references/generating.md +0 -204
  426. package/skills_ref/property-based-testing/skills/property-based-testing/references/interpreting-failures.md +0 -239
  427. package/skills_ref/property-based-testing/skills/property-based-testing/references/libraries.md +0 -130
  428. package/skills_ref/property-based-testing/skills/property-based-testing/references/refactoring.md +0 -181
  429. package/skills_ref/property-based-testing/skills/property-based-testing/references/reviewing.md +0 -209
  430. package/skills_ref/property-based-testing/skills/property-based-testing/references/strategies.md +0 -124
  431. package/skills_ref/react-best-practices/AGENTS.md +0 -2934
  432. package/skills_ref/react-best-practices/README.md +0 -123
  433. package/skills_ref/react-best-practices/SKILL.md +0 -136
  434. package/skills_ref/react-best-practices/metadata.json +0 -15
  435. package/skills_ref/react-best-practices/rules/_sections.md +0 -46
  436. package/skills_ref/react-best-practices/rules/_template.md +0 -28
  437. package/skills_ref/react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  438. package/skills_ref/react-best-practices/rules/advanced-init-once.md +0 -42
  439. package/skills_ref/react-best-practices/rules/advanced-use-latest.md +0 -39
  440. package/skills_ref/react-best-practices/rules/async-api-routes.md +0 -38
  441. package/skills_ref/react-best-practices/rules/async-defer-await.md +0 -80
  442. package/skills_ref/react-best-practices/rules/async-dependencies.md +0 -51
  443. package/skills_ref/react-best-practices/rules/async-parallel.md +0 -28
  444. package/skills_ref/react-best-practices/rules/async-suspense-boundaries.md +0 -99
  445. package/skills_ref/react-best-practices/rules/bundle-barrel-imports.md +0 -59
  446. package/skills_ref/react-best-practices/rules/bundle-conditional.md +0 -31
  447. package/skills_ref/react-best-practices/rules/bundle-defer-third-party.md +0 -49
  448. package/skills_ref/react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  449. package/skills_ref/react-best-practices/rules/bundle-preload.md +0 -50
  450. package/skills_ref/react-best-practices/rules/client-event-listeners.md +0 -74
  451. package/skills_ref/react-best-practices/rules/client-localstorage-schema.md +0 -71
  452. package/skills_ref/react-best-practices/rules/client-passive-event-listeners.md +0 -48
  453. package/skills_ref/react-best-practices/rules/client-swr-dedup.md +0 -56
  454. package/skills_ref/react-best-practices/rules/js-batch-dom-css.md +0 -107
  455. package/skills_ref/react-best-practices/rules/js-cache-function-results.md +0 -80
  456. package/skills_ref/react-best-practices/rules/js-cache-property-access.md +0 -28
  457. package/skills_ref/react-best-practices/rules/js-cache-storage.md +0 -70
  458. package/skills_ref/react-best-practices/rules/js-combine-iterations.md +0 -32
  459. package/skills_ref/react-best-practices/rules/js-early-exit.md +0 -50
  460. package/skills_ref/react-best-practices/rules/js-hoist-regexp.md +0 -45
  461. package/skills_ref/react-best-practices/rules/js-index-maps.md +0 -37
  462. package/skills_ref/react-best-practices/rules/js-length-check-first.md +0 -49
  463. package/skills_ref/react-best-practices/rules/js-min-max-loop.md +0 -82
  464. package/skills_ref/react-best-practices/rules/js-set-map-lookups.md +0 -24
  465. package/skills_ref/react-best-practices/rules/js-tosorted-immutable.md +0 -57
  466. package/skills_ref/react-best-practices/rules/rendering-activity.md +0 -26
  467. package/skills_ref/react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  468. package/skills_ref/react-best-practices/rules/rendering-conditional-render.md +0 -40
  469. package/skills_ref/react-best-practices/rules/rendering-content-visibility.md +0 -38
  470. package/skills_ref/react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  471. package/skills_ref/react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  472. package/skills_ref/react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
  473. package/skills_ref/react-best-practices/rules/rendering-svg-precision.md +0 -28
  474. package/skills_ref/react-best-practices/rules/rendering-usetransition-loading.md +0 -75
  475. package/skills_ref/react-best-practices/rules/rerender-defer-reads.md +0 -39
  476. package/skills_ref/react-best-practices/rules/rerender-dependencies.md +0 -45
  477. package/skills_ref/react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
  478. package/skills_ref/react-best-practices/rules/rerender-derived-state.md +0 -29
  479. package/skills_ref/react-best-practices/rules/rerender-functional-setstate.md +0 -74
  480. package/skills_ref/react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  481. package/skills_ref/react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
  482. package/skills_ref/react-best-practices/rules/rerender-memo.md +0 -44
  483. package/skills_ref/react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
  484. package/skills_ref/react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
  485. package/skills_ref/react-best-practices/rules/rerender-transitions.md +0 -40
  486. package/skills_ref/react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
  487. package/skills_ref/react-best-practices/rules/server-after-nonblocking.md +0 -73
  488. package/skills_ref/react-best-practices/rules/server-auth-actions.md +0 -96
  489. package/skills_ref/react-best-practices/rules/server-cache-lru.md +0 -41
  490. package/skills_ref/react-best-practices/rules/server-cache-react.md +0 -76
  491. package/skills_ref/react-best-practices/rules/server-dedup-props.md +0 -65
  492. package/skills_ref/react-best-practices/rules/server-parallel-fetching.md +0 -83
  493. package/skills_ref/react-best-practices/rules/server-serialization.md +0 -38
  494. package/skills_ref/receiving-code-review/SKILL.md +0 -213
  495. package/skills_ref/registry.json +0 -1493
  496. package/skills_ref/render-deploy/SKILL.md +0 -462
  497. package/skills_ref/requesting-code-review/SKILL.md +0 -105
  498. package/skills_ref/requesting-code-review/code-reviewer.md +0 -146
  499. package/skills_ref/screen-capture/SKILL.md +0 -162
  500. package/skills_ref/security-best-practices/LICENSE.txt +0 -201
  501. package/skills_ref/security-best-practices/SKILL.md +0 -86
  502. package/skills_ref/security-best-practices/agents/openai.yaml +0 -4
  503. package/skills_ref/security-best-practices/references/golang-general-backend-security.md +0 -826
  504. package/skills_ref/security-best-practices/references/javascript-express-web-server-security.md +0 -1158
  505. package/skills_ref/security-best-practices/references/javascript-general-web-frontend-security.md +0 -747
  506. package/skills_ref/security-best-practices/references/javascript-jquery-web-frontend-security.md +0 -678
  507. package/skills_ref/security-best-practices/references/javascript-typescript-nextjs-web-server-security.md +0 -1144
  508. package/skills_ref/security-best-practices/references/javascript-typescript-react-web-frontend-security.md +0 -990
  509. package/skills_ref/security-best-practices/references/javascript-typescript-vue-web-frontend-security.md +0 -791
  510. package/skills_ref/security-best-practices/references/python-django-web-server-security.md +0 -882
  511. package/skills_ref/security-best-practices/references/python-fastapi-web-server-security.md +0 -1036
  512. package/skills_ref/security-best-practices/references/python-flask-web-server-security.md +0 -705
  513. package/skills_ref/security-ownership-map/LICENSE.txt +0 -201
  514. package/skills_ref/security-ownership-map/SKILL.md +0 -206
  515. package/skills_ref/security-ownership-map/agents/openai.yaml +0 -4
  516. package/skills_ref/security-ownership-map/references/neo4j-import.md +0 -60
  517. package/skills_ref/security-ownership-map/scripts/build_ownership_map.py +0 -956
  518. package/skills_ref/security-ownership-map/scripts/community_maintainers.py +0 -544
  519. package/skills_ref/security-ownership-map/scripts/query_ownership.py +0 -483
  520. package/skills_ref/security-ownership-map/scripts/run_ownership_map.py +0 -200
  521. package/skills_ref/security-threat-model/LICENSE.txt +0 -201
  522. package/skills_ref/security-threat-model/SKILL.md +0 -81
  523. package/skills_ref/security-threat-model/agents/openai.yaml +0 -4
  524. package/skills_ref/security-threat-model/references/prompt-template.md +0 -255
  525. package/skills_ref/security-threat-model/references/security-controls-and-assets.md +0 -32
  526. package/skills_ref/sentry/SKILL.md +0 -123
  527. package/skills_ref/skill-creator/SKILL.md +0 -372
  528. package/skills_ref/sora/SKILL.md +0 -153
  529. package/skills_ref/speech/SKILL.md +0 -144
  530. package/skills_ref/spotify-player/SKILL.md +0 -64
  531. package/skills_ref/static-analysis/.claude-plugin/plugin.json +0 -8
  532. package/skills_ref/static-analysis/README.md +0 -65
  533. package/skills_ref/static-analysis/agents/semgrep-scanner.md +0 -71
  534. package/skills_ref/static-analysis/agents/semgrep-triager.md +0 -107
  535. package/skills_ref/static-analysis/skills/codeql/SKILL.md +0 -119
  536. package/skills_ref/static-analysis/skills/codeql/references/diagnostic-query-templates.md +0 -339
  537. package/skills_ref/static-analysis/skills/codeql/references/language-details.md +0 -207
  538. package/skills_ref/static-analysis/skills/codeql/references/performance-tuning.md +0 -111
  539. package/skills_ref/static-analysis/skills/codeql/references/ruleset-catalog.md +0 -63
  540. package/skills_ref/static-analysis/skills/codeql/references/threat-models.md +0 -44
  541. package/skills_ref/static-analysis/skills/codeql/workflows/build-database.md +0 -669
  542. package/skills_ref/static-analysis/skills/codeql/workflows/create-data-extensions.md +0 -536
  543. package/skills_ref/static-analysis/skills/codeql/workflows/run-analysis.md +0 -436
  544. package/skills_ref/static-analysis/skills/sarif-parsing/SKILL.md +0 -479
  545. package/skills_ref/static-analysis/skills/sarif-parsing/resources/jq-queries.md +0 -162
  546. package/skills_ref/static-analysis/skills/sarif-parsing/resources/sarif_helpers.py +0 -331
  547. package/skills_ref/static-analysis/skills/semgrep/SKILL.md +0 -431
  548. package/skills_ref/static-analysis/skills/semgrep/references/rulesets.md +0 -162
  549. package/skills_ref/static-analysis/skills/semgrep/references/scanner-task-prompt.md +0 -102
  550. package/skills_ref/static-analysis/skills/semgrep/references/triage-task-prompt.md +0 -122
  551. package/skills_ref/static-analysis/skills/semgrep/scripts/merge_triaged_sarif.py +0 -252
  552. package/skills_ref/summarize/SKILL.md +0 -87
  553. package/skills_ref/tdd/SKILL.md +0 -371
  554. package/skills_ref/tdd/testing-anti-patterns.md +0 -299
  555. package/skills_ref/telegram-send/SKILL.md +0 -99
  556. package/skills_ref/terraform/README.md +0 -105
  557. package/skills_ref/terraform/code-generation/.claude-plugin/plugin.json +0 -30
  558. package/skills_ref/terraform/code-generation/skills/azure-verified-modules/SKILL.md +0 -613
  559. package/skills_ref/terraform/code-generation/skills/terraform-style-guide/SKILL.md +0 -353
  560. package/skills_ref/terraform/code-generation/skills/terraform-test/SKILL.md +0 -1669
  561. package/skills_ref/terraform/module-generation/.claude-plugin/plugin.json +0 -30
  562. package/skills_ref/terraform/module-generation/skills/refactor-module/SKILL.md +0 -538
  563. package/skills_ref/terraform/module-generation/skills/terraform-stacks/SKILL.md +0 -468
  564. package/skills_ref/terraform/module-generation/skills/terraform-stacks/references/api-monitoring.md +0 -543
  565. package/skills_ref/terraform/module-generation/skills/terraform-stacks/references/component-blocks.md +0 -476
  566. package/skills_ref/terraform/module-generation/skills/terraform-stacks/references/deployment-blocks.md +0 -391
  567. package/skills_ref/terraform/module-generation/skills/terraform-stacks/references/examples.md +0 -1529
  568. package/skills_ref/terraform/module-generation/skills/terraform-stacks/references/linked-stacks.md +0 -187
  569. package/skills_ref/terraform/module-generation/skills/terraform-stacks/references/troubleshooting.md +0 -671
  570. package/skills_ref/terraform/provider-development/.claude-plugin/plugin.json +0 -13
  571. package/skills_ref/terraform/provider-development/skills/new-terraform-provider/SKILL.md +0 -25
  572. package/skills_ref/terraform/provider-development/skills/new-terraform-provider/assets/main.go +0 -40
  573. package/skills_ref/terraform/provider-development/skills/provider-actions/SKILL.md +0 -478
  574. package/skills_ref/terraform/provider-development/skills/provider-resources/SKILL.md +0 -599
  575. package/skills_ref/terraform/provider-development/skills/run-acceptance-tests/SKILL.md +0 -41
  576. package/skills_ref/theme-factory/LICENSE.txt +0 -202
  577. package/skills_ref/theme-factory/SKILL.md +0 -59
  578. package/skills_ref/theme-factory/theme-showcase.pdf +0 -0
  579. package/skills_ref/theme-factory/themes/arctic-frost.md +0 -19
  580. package/skills_ref/theme-factory/themes/botanical-garden.md +0 -19
  581. package/skills_ref/theme-factory/themes/desert-rose.md +0 -19
  582. package/skills_ref/theme-factory/themes/forest-canopy.md +0 -19
  583. package/skills_ref/theme-factory/themes/golden-hour.md +0 -19
  584. package/skills_ref/theme-factory/themes/midnight-galaxy.md +0 -19
  585. package/skills_ref/theme-factory/themes/modern-minimalist.md +0 -19
  586. package/skills_ref/theme-factory/themes/ocean-depths.md +0 -19
  587. package/skills_ref/theme-factory/themes/sunset-boulevard.md +0 -19
  588. package/skills_ref/theme-factory/themes/tech-innovation.md +0 -19
  589. package/skills_ref/things-mac/SKILL.md +0 -86
  590. package/skills_ref/tmux/SKILL.md +0 -153
  591. package/skills_ref/transcribe/SKILL.md +0 -81
  592. package/skills_ref/trello/SKILL.md +0 -95
  593. package/skills_ref/tts/SKILL.md +0 -99
  594. package/skills_ref/vercel-deploy/SKILL.md +0 -115
  595. package/skills_ref/video-downloader/SKILL.md +0 -99
  596. package/skills_ref/video-downloader/scripts/download_video.py +0 -145
  597. package/skills_ref/video-frames/SKILL.md +0 -46
  598. package/skills_ref/vision-click/SKILL.md +0 -128
  599. package/skills_ref/weather/SKILL.md +0 -112
  600. package/skills_ref/web-artifacts-builder/LICENSE.txt +0 -202
  601. package/skills_ref/web-artifacts-builder/SKILL.md +0 -74
  602. package/skills_ref/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
  603. package/skills_ref/web-artifacts-builder/scripts/init-artifact.sh +0 -322
  604. package/skills_ref/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  605. package/skills_ref/web-perf/SKILL.md +0 -193
  606. package/skills_ref/web-routing/SKILL.md +0 -26
  607. package/skills_ref/whatsapp/SKILL.md +0 -255
  608. package/skills_ref/whatsapp/assets/agent-app-integration-example.json +0 -35
  609. package/skills_ref/whatsapp/assets/databases-example.json +0 -11
  610. package/skills_ref/whatsapp/assets/function-decide-route-interactive-buttons.json +0 -6
  611. package/skills_ref/whatsapp/assets/functions-example.json +0 -5
  612. package/skills_ref/whatsapp/assets/workflow-agent-simple.json +0 -31
  613. package/skills_ref/whatsapp/assets/workflow-api-template-wait-agent.json +0 -59
  614. package/skills_ref/whatsapp/assets/workflow-customer-support-intake-agent.json +0 -56
  615. package/skills_ref/whatsapp/assets/workflow-decision.json +0 -83
  616. package/skills_ref/whatsapp/assets/workflow-interactive-buttons-decide-ai.json +0 -89
  617. package/skills_ref/whatsapp/assets/workflow-interactive-buttons-decide-function.json +0 -88
  618. package/skills_ref/whatsapp/assets/workflow-linear.json +0 -53
  619. package/skills_ref/whatsapp/package.json +0 -10
  620. package/skills_ref/whatsapp/references/app-integrations.md +0 -89
  621. package/skills_ref/whatsapp/references/databases-reference.md +0 -21
  622. package/skills_ref/whatsapp/references/execution-context.md +0 -42
  623. package/skills_ref/whatsapp/references/function-contracts.md +0 -55
  624. package/skills_ref/whatsapp/references/functions-payloads.md +0 -87
  625. package/skills_ref/whatsapp/references/functions-reference.md +0 -133
  626. package/skills_ref/whatsapp/references/graph-contract.md +0 -145
  627. package/skills_ref/whatsapp/references/node-types.md +0 -430
  628. package/skills_ref/whatsapp/references/triggers.md +0 -20
  629. package/skills_ref/whatsapp/references/workflow-overview.md +0 -22
  630. package/skills_ref/whatsapp/references/workflow-reference.md +0 -123
  631. package/skills_ref/whatsapp/scripts/configure-prop.js +0 -113
  632. package/skills_ref/whatsapp/scripts/create-connect-token.js +0 -38
  633. package/skills_ref/whatsapp/scripts/create-function.js +0 -64
  634. package/skills_ref/whatsapp/scripts/create-integration.js +0 -137
  635. package/skills_ref/whatsapp/scripts/create-row.js +0 -47
  636. package/skills_ref/whatsapp/scripts/create-trigger.js +0 -88
  637. package/skills_ref/whatsapp/scripts/create-workflow.js +0 -85
  638. package/skills_ref/whatsapp/scripts/delete-integration.js +0 -44
  639. package/skills_ref/whatsapp/scripts/delete-row.js +0 -49
  640. package/skills_ref/whatsapp/scripts/delete-trigger.js +0 -44
  641. package/skills_ref/whatsapp/scripts/deploy-function.js +0 -47
  642. package/skills_ref/whatsapp/scripts/edit-graph.js +0 -289
  643. package/skills_ref/whatsapp/scripts/get-action-schema.js +0 -44
  644. package/skills_ref/whatsapp/scripts/get-context-value.js +0 -80
  645. package/skills_ref/whatsapp/scripts/get-execution-event.js +0 -55
  646. package/skills_ref/whatsapp/scripts/get-execution.js +0 -44
  647. package/skills_ref/whatsapp/scripts/get-function.js +0 -43
  648. package/skills_ref/whatsapp/scripts/get-graph.js +0 -85
  649. package/skills_ref/whatsapp/scripts/get-table.js +0 -45
  650. package/skills_ref/whatsapp/scripts/get-workflow.js +0 -44
  651. package/skills_ref/whatsapp/scripts/invoke-function.js +0 -60
  652. package/skills_ref/whatsapp/scripts/lib/databases/args.js +0 -87
  653. package/skills_ref/whatsapp/scripts/lib/databases/filters.js +0 -30
  654. package/skills_ref/whatsapp/scripts/lib/databases/kapso-api.js +0 -70
  655. package/skills_ref/whatsapp/scripts/lib/functions/args.js +0 -55
  656. package/skills_ref/whatsapp/scripts/lib/functions/kapso-api.js +0 -70
  657. package/skills_ref/whatsapp/scripts/lib/workflows/args.js +0 -53
  658. package/skills_ref/whatsapp/scripts/lib/workflows/kapso-api.js +0 -123
  659. package/skills_ref/whatsapp/scripts/lib/workflows/result.js +0 -16
  660. package/skills_ref/whatsapp/scripts/list-accounts.js +0 -62
  661. package/skills_ref/whatsapp/scripts/list-apps.js +0 -42
  662. package/skills_ref/whatsapp/scripts/list-execution-events.js +0 -61
  663. package/skills_ref/whatsapp/scripts/list-executions.js +0 -53
  664. package/skills_ref/whatsapp/scripts/list-function-invocations.js +0 -53
  665. package/skills_ref/whatsapp/scripts/list-functions.js +0 -41
  666. package/skills_ref/whatsapp/scripts/list-integrations.js +0 -41
  667. package/skills_ref/whatsapp/scripts/list-provider-models.js +0 -48
  668. package/skills_ref/whatsapp/scripts/list-tables.js +0 -41
  669. package/skills_ref/whatsapp/scripts/list-triggers.js +0 -44
  670. package/skills_ref/whatsapp/scripts/list-whatsapp-phone-numbers.js +0 -56
  671. package/skills_ref/whatsapp/scripts/list-workflows.js +0 -44
  672. package/skills_ref/whatsapp/scripts/openapi-explore.mjs +0 -1273
  673. package/skills_ref/whatsapp/scripts/query-rows.js +0 -71
  674. package/skills_ref/whatsapp/scripts/reload-props.js +0 -110
  675. package/skills_ref/whatsapp/scripts/resume-execution.js +0 -75
  676. package/skills_ref/whatsapp/scripts/search-actions.js +0 -64
  677. package/skills_ref/whatsapp/scripts/update-execution-status.js +0 -51
  678. package/skills_ref/whatsapp/scripts/update-function.js +0 -65
  679. package/skills_ref/whatsapp/scripts/update-graph.js +0 -154
  680. package/skills_ref/whatsapp/scripts/update-integration.js +0 -82
  681. package/skills_ref/whatsapp/scripts/update-row.js +0 -51
  682. package/skills_ref/whatsapp/scripts/update-trigger.js +0 -60
  683. package/skills_ref/whatsapp/scripts/update-workflow-settings.js +0 -67
  684. package/skills_ref/whatsapp/scripts/upsert-row.js +0 -64
  685. package/skills_ref/whatsapp/scripts/validate-graph.js +0 -293
  686. package/skills_ref/whatsapp/scripts/variables-delete.js +0 -37
  687. package/skills_ref/whatsapp/scripts/variables-list.js +0 -55
  688. package/skills_ref/whatsapp/scripts/variables-set.js +0 -39
  689. package/skills_ref/writing-plans/SKILL.md +0 -116
  690. package/skills_ref/xlsx/LICENSE.txt +0 -30
  691. package/skills_ref/xlsx/SKILL.md +0 -292
  692. package/skills_ref/xlsx/scripts/office/helpers/__init__.py +0 -0
  693. package/skills_ref/xlsx/scripts/office/helpers/merge_runs.py +0 -199
  694. package/skills_ref/xlsx/scripts/office/helpers/simplify_redlines.py +0 -197
  695. package/skills_ref/xlsx/scripts/office/pack.py +0 -159
  696. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  697. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  698. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  699. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  700. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  701. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  702. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  703. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  704. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  705. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  706. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  707. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  708. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  709. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  710. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  711. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  712. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  713. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  714. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  715. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  716. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  717. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  718. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  719. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  720. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  721. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  722. package/skills_ref/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  723. package/skills_ref/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  724. package/skills_ref/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  725. package/skills_ref/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  726. package/skills_ref/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  727. package/skills_ref/xlsx/scripts/office/schemas/mce/mc.xsd +0 -75
  728. package/skills_ref/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  729. package/skills_ref/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  730. package/skills_ref/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  731. package/skills_ref/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  732. package/skills_ref/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  733. package/skills_ref/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  734. package/skills_ref/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  735. package/skills_ref/xlsx/scripts/office/soffice.py +0 -183
  736. package/skills_ref/xlsx/scripts/office/unpack.py +0 -132
  737. package/skills_ref/xlsx/scripts/office/validate.py +0 -111
  738. package/skills_ref/xlsx/scripts/office/validators/__init__.py +0 -15
  739. package/skills_ref/xlsx/scripts/office/validators/base.py +0 -847
  740. package/skills_ref/xlsx/scripts/office/validators/docx.py +0 -446
  741. package/skills_ref/xlsx/scripts/office/validators/pptx.py +0 -275
  742. package/skills_ref/xlsx/scripts/office/validators/redlining.py +0 -247
  743. package/skills_ref/xlsx/scripts/recalc.py +0 -184
  744. package/skills_ref/xurl/SKILL.md +0 -461
@@ -1,1374 +0,0 @@
1
- # /// script
2
- # requires-python = ">=3.13"
3
- # dependencies = [
4
- # "huggingface-hub>=1.1.4",
5
- # "markdown-it-py>=3.0.0",
6
- # "python-dotenv>=1.2.1",
7
- # "pyyaml>=6.0.3",
8
- # "requests>=2.32.5",
9
- # ]
10
- # ///
11
-
12
- """
13
- Manage evaluation results in Hugging Face model cards.
14
-
15
- This script provides two methods:
16
- 1. Extract evaluation tables from model README files
17
- 2. Import evaluation scores from Artificial Analysis API
18
-
19
- Both methods update the model-index metadata in model cards.
20
- """
21
-
22
- import argparse
23
- import os
24
- import re
25
- from textwrap import dedent
26
- from typing import Any, Dict, List, Optional, Tuple
27
-
28
-
29
- def load_env() -> None:
30
- """Load .env if python-dotenv is available; keep help usable without it."""
31
- try:
32
- import dotenv # type: ignore
33
- except ModuleNotFoundError:
34
- return
35
- dotenv.load_dotenv()
36
-
37
-
38
- def require_markdown_it():
39
- try:
40
- from markdown_it import MarkdownIt # type: ignore
41
- except ModuleNotFoundError as exc:
42
- raise ModuleNotFoundError(
43
- "markdown-it-py is required for table parsing. "
44
- "Install with `uv add markdown-it-py` or `pip install markdown-it-py`."
45
- ) from exc
46
- return MarkdownIt
47
-
48
-
49
- def require_model_card():
50
- try:
51
- from huggingface_hub import ModelCard # type: ignore
52
- except ModuleNotFoundError as exc:
53
- raise ModuleNotFoundError(
54
- "huggingface-hub is required for model card operations. "
55
- "Install with `uv add huggingface_hub` or `pip install huggingface-hub`."
56
- ) from exc
57
- return ModelCard
58
-
59
-
60
- def require_requests():
61
- try:
62
- import requests # type: ignore
63
- except ModuleNotFoundError as exc:
64
- raise ModuleNotFoundError(
65
- "requests is required for Artificial Analysis import. "
66
- "Install with `uv add requests` or `pip install requests`."
67
- ) from exc
68
- return requests
69
-
70
-
71
- def require_yaml():
72
- try:
73
- import yaml # type: ignore
74
- except ModuleNotFoundError as exc:
75
- raise ModuleNotFoundError(
76
- "PyYAML is required for YAML output. "
77
- "Install with `uv add pyyaml` or `pip install pyyaml`."
78
- ) from exc
79
- return yaml
80
-
81
-
82
- # ============================================================================
83
- # Method 1: Extract Evaluations from README
84
- # ============================================================================
85
-
86
-
87
- def extract_tables_from_markdown(markdown_content: str) -> List[str]:
88
- """Extract all markdown tables from content."""
89
- # Pattern to match markdown tables
90
- table_pattern = r"(\|[^\n]+\|(?:\r?\n\|[^\n]+\|)+)"
91
- tables = re.findall(table_pattern, markdown_content)
92
- return tables
93
-
94
-
95
- def parse_markdown_table(table_str: str) -> Tuple[List[str], List[List[str]]]:
96
- """
97
- Parse a markdown table string into headers and rows.
98
-
99
- Returns:
100
- Tuple of (headers, data_rows)
101
- """
102
- lines = [line.strip() for line in table_str.strip().split("\n")]
103
-
104
- # Remove separator line (the one with dashes)
105
- lines = [line for line in lines if not re.match(r"^\|[\s\-:]+\|$", line)]
106
-
107
- if len(lines) < 2:
108
- return [], []
109
-
110
- # Parse header
111
- header = [cell.strip() for cell in lines[0].split("|")[1:-1]]
112
-
113
- # Parse data rows
114
- data_rows = []
115
- for line in lines[1:]:
116
- cells = [cell.strip() for cell in line.split("|")[1:-1]]
117
- if cells:
118
- data_rows.append(cells)
119
-
120
- return header, data_rows
121
-
122
-
123
- def is_evaluation_table(header: List[str], rows: List[List[str]]) -> bool:
124
- """Determine if a table contains evaluation results."""
125
- if not header or not rows:
126
- return False
127
-
128
- # Check if first column looks like benchmark names
129
- benchmark_keywords = [
130
- "benchmark", "task", "dataset", "eval", "test", "metric",
131
- "mmlu", "humaneval", "gsm", "hellaswag", "arc", "winogrande",
132
- "truthfulqa", "boolq", "piqa", "siqa"
133
- ]
134
-
135
- first_col = header[0].lower()
136
- has_benchmark_header = any(keyword in first_col for keyword in benchmark_keywords)
137
-
138
- # Check if there are numeric values in the table
139
- has_numeric_values = False
140
- for row in rows:
141
- for cell in row:
142
- try:
143
- float(cell.replace("%", "").replace(",", ""))
144
- has_numeric_values = True
145
- break
146
- except ValueError:
147
- continue
148
- if has_numeric_values:
149
- break
150
-
151
- return has_benchmark_header or has_numeric_values
152
-
153
-
154
- def normalize_model_name(name: str) -> tuple[set[str], str]:
155
- """
156
- Normalize a model name for matching.
157
-
158
- Args:
159
- name: Model name to normalize
160
-
161
- Returns:
162
- Tuple of (token_set, normalized_string)
163
- """
164
- # Remove markdown formatting
165
- cleaned = re.sub(r'\[([^\]]+)\]\([^\)]+\)', r'\1', name) # Remove markdown links
166
- cleaned = re.sub(r'\*\*([^\*]+)\*\*', r'\1', cleaned) # Remove bold
167
- cleaned = cleaned.strip()
168
-
169
- # Normalize and tokenize
170
- normalized = cleaned.lower().replace("-", " ").replace("_", " ")
171
- tokens = set(normalized.split())
172
-
173
- return tokens, normalized
174
-
175
-
176
- def find_main_model_column(header: List[str], model_name: str) -> Optional[int]:
177
- """
178
- Identify the column index that corresponds to the main model.
179
-
180
- Only returns a column if there's an exact normalized match with the model name.
181
- This prevents extracting scores from training checkpoints or similar models.
182
-
183
- Args:
184
- header: Table column headers
185
- model_name: Model name from repo_id (e.g., "OLMo-3-32B-Think")
186
-
187
- Returns:
188
- Column index of the main model, or None if no exact match found
189
- """
190
- if not header or not model_name:
191
- return None
192
-
193
- # Normalize model name and extract tokens
194
- model_tokens, _ = normalize_model_name(model_name)
195
-
196
- # Find exact matches only
197
- for i, col_name in enumerate(header):
198
- if not col_name:
199
- continue
200
-
201
- # Skip first column (benchmark names)
202
- if i == 0:
203
- continue
204
-
205
- col_tokens, _ = normalize_model_name(col_name)
206
-
207
- # Check for exact token match
208
- if model_tokens == col_tokens:
209
- return i
210
-
211
- # No exact match found
212
- return None
213
-
214
-
215
- def find_main_model_row(
216
- rows: List[List[str]], model_name: str
217
- ) -> tuple[Optional[int], List[str]]:
218
- """
219
- Identify the row index that corresponds to the main model in a transposed table.
220
-
221
- In transposed tables, each row represents a different model, with the first
222
- column containing the model name.
223
-
224
- Args:
225
- rows: Table data rows
226
- model_name: Model name from repo_id (e.g., "OLMo-3-32B")
227
-
228
- Returns:
229
- Tuple of (row_index, available_models)
230
- - row_index: Index of the main model, or None if no exact match found
231
- - available_models: List of all model names found in the table
232
- """
233
- if not rows or not model_name:
234
- return None, []
235
-
236
- model_tokens, _ = normalize_model_name(model_name)
237
- available_models = []
238
-
239
- for i, row in enumerate(rows):
240
- if not row or not row[0]:
241
- continue
242
-
243
- row_name = row[0].strip()
244
-
245
- # Skip separator/header rows
246
- if not row_name or row_name.startswith('---'):
247
- continue
248
-
249
- row_tokens, _ = normalize_model_name(row_name)
250
-
251
- # Collect all non-empty model names
252
- if row_tokens:
253
- available_models.append(row_name)
254
-
255
- # Check for exact token match
256
- if model_tokens == row_tokens:
257
- return i, available_models
258
-
259
- return None, available_models
260
-
261
-
262
- def is_transposed_table(header: List[str], rows: List[List[str]]) -> bool:
263
- """
264
- Determine if a table is transposed (models as rows, benchmarks as columns).
265
-
266
- A table is considered transposed if:
267
- - The first column contains model-like names (not benchmark names)
268
- - Most other columns contain numeric values
269
- - Header row contains benchmark-like names
270
-
271
- Args:
272
- header: Table column headers
273
- rows: Table data rows
274
-
275
- Returns:
276
- True if table appears to be transposed, False otherwise
277
- """
278
- if not header or not rows or len(header) < 3:
279
- return False
280
-
281
- # Check if first column header suggests model names
282
- first_col = header[0].lower()
283
- model_indicators = ["model", "system", "llm", "name"]
284
- has_model_header = any(indicator in first_col for indicator in model_indicators)
285
-
286
- # Check if remaining headers look like benchmarks
287
- benchmark_keywords = [
288
- "mmlu", "humaneval", "gsm", "hellaswag", "arc", "winogrande",
289
- "eval", "score", "benchmark", "test", "math", "code", "mbpp",
290
- "truthfulqa", "boolq", "piqa", "siqa", "drop", "squad"
291
- ]
292
-
293
- benchmark_header_count = 0
294
- for col_name in header[1:]:
295
- col_lower = col_name.lower()
296
- if any(keyword in col_lower for keyword in benchmark_keywords):
297
- benchmark_header_count += 1
298
-
299
- has_benchmark_headers = benchmark_header_count >= 2
300
-
301
- # Check if data rows have numeric values in most columns (except first)
302
- numeric_count = 0
303
- total_cells = 0
304
-
305
- for row in rows[:5]: # Check first 5 rows
306
- for cell in row[1:]: # Skip first column
307
- total_cells += 1
308
- try:
309
- float(cell.replace("%", "").replace(",", "").strip())
310
- numeric_count += 1
311
- except (ValueError, AttributeError):
312
- continue
313
-
314
- has_numeric_data = total_cells > 0 and (numeric_count / total_cells) > 0.5
315
-
316
- return (has_model_header or has_benchmark_headers) and has_numeric_data
317
-
318
-
319
- def extract_metrics_from_table(
320
- header: List[str],
321
- rows: List[List[str]],
322
- table_format: str = "auto",
323
- model_name: Optional[str] = None,
324
- model_column_index: Optional[int] = None
325
- ) -> List[Dict[str, Any]]:
326
- """
327
- Extract metrics from parsed table data.
328
-
329
- Args:
330
- header: Table column headers
331
- rows: Table data rows
332
- table_format: "rows" (benchmarks as rows), "columns" (benchmarks as columns),
333
- "transposed" (models as rows, benchmarks as columns), or "auto"
334
- model_name: Optional model name to identify the correct column/row
335
-
336
- Returns:
337
- List of metric dictionaries with name, type, and value
338
- """
339
- metrics = []
340
-
341
- if table_format == "auto":
342
- # First check if it's a transposed table (models as rows)
343
- if is_transposed_table(header, rows):
344
- table_format = "transposed"
345
- else:
346
- # Check if first column header is empty/generic (indicates benchmarks in rows)
347
- first_header = header[0].lower().strip() if header else ""
348
- is_first_col_benchmarks = not first_header or first_header in ["", "benchmark", "task", "dataset", "metric", "eval"]
349
-
350
- if is_first_col_benchmarks:
351
- table_format = "rows"
352
- else:
353
- # Heuristic: if first row has mostly numeric values, benchmarks are columns
354
- try:
355
- numeric_count = sum(
356
- 1 for cell in rows[0] if cell and
357
- re.match(r"^\d+\.?\d*%?$", cell.replace(",", "").strip())
358
- )
359
- table_format = "columns" if numeric_count > len(rows[0]) / 2 else "rows"
360
- except (IndexError, ValueError):
361
- table_format = "rows"
362
-
363
- if table_format == "rows":
364
- # Benchmarks are in rows, scores in columns
365
- # Try to identify the main model column if model_name is provided
366
- target_column = model_column_index
367
- if target_column is None and model_name:
368
- target_column = find_main_model_column(header, model_name)
369
-
370
- for row in rows:
371
- if not row:
372
- continue
373
-
374
- benchmark_name = row[0].strip()
375
- if not benchmark_name:
376
- continue
377
-
378
- # If we identified a specific column, use it; otherwise use first numeric value
379
- if target_column is not None and target_column < len(row):
380
- try:
381
- value_str = row[target_column].replace("%", "").replace(",", "").strip()
382
- if value_str:
383
- value = float(value_str)
384
- metrics.append({
385
- "name": benchmark_name,
386
- "type": benchmark_name.lower().replace(" ", "_"),
387
- "value": value
388
- })
389
- except (ValueError, IndexError):
390
- pass
391
- else:
392
- # Extract numeric values from remaining columns (original behavior)
393
- for i, cell in enumerate(row[1:], start=1):
394
- try:
395
- # Remove common suffixes and convert to float
396
- value_str = cell.replace("%", "").replace(",", "").strip()
397
- if not value_str:
398
- continue
399
-
400
- value = float(value_str)
401
-
402
- # Determine metric name
403
- metric_name = benchmark_name
404
- if len(header) > i and header[i].lower() not in ["score", "value", "result"]:
405
- metric_name = f"{benchmark_name} ({header[i]})"
406
-
407
- metrics.append({
408
- "name": metric_name,
409
- "type": benchmark_name.lower().replace(" ", "_"),
410
- "value": value
411
- })
412
- break # Only take first numeric value per row
413
- except (ValueError, IndexError):
414
- continue
415
-
416
- elif table_format == "transposed":
417
- # Models are in rows (first column), benchmarks are in columns (header)
418
- # Find the row that matches the target model
419
- if not model_name:
420
- print("Warning: model_name required for transposed table format")
421
- return metrics
422
-
423
- target_row_idx, available_models = find_main_model_row(rows, model_name)
424
-
425
- if target_row_idx is None:
426
- print(f"\n⚠ Could not find model '{model_name}' in transposed table")
427
- if available_models:
428
- print("\nAvailable models in table:")
429
- for i, model in enumerate(available_models, 1):
430
- print(f" {i}. {model}")
431
- print("\nPlease select the correct model name from the list above.")
432
- print("You can specify it using the --model-name-override flag:")
433
- print(f' --model-name-override "{available_models[0]}"')
434
- return metrics
435
-
436
- target_row = rows[target_row_idx]
437
-
438
- # Extract metrics from each column (skip first column which is model name)
439
- for i in range(1, len(header)):
440
- benchmark_name = header[i].strip()
441
- if not benchmark_name or i >= len(target_row):
442
- continue
443
-
444
- try:
445
- value_str = target_row[i].replace("%", "").replace(",", "").strip()
446
- if not value_str:
447
- continue
448
-
449
- value = float(value_str)
450
-
451
- metrics.append({
452
- "name": benchmark_name,
453
- "type": benchmark_name.lower().replace(" ", "_").replace("-", "_"),
454
- "value": value
455
- })
456
- except (ValueError, AttributeError):
457
- continue
458
-
459
- else: # table_format == "columns"
460
- # Benchmarks are in columns
461
- if not rows:
462
- return metrics
463
-
464
- # Use first data row for values
465
- data_row = rows[0]
466
-
467
- for i, benchmark_name in enumerate(header):
468
- if not benchmark_name or i >= len(data_row):
469
- continue
470
-
471
- try:
472
- value_str = data_row[i].replace("%", "").replace(",", "").strip()
473
- if not value_str:
474
- continue
475
-
476
- value = float(value_str)
477
-
478
- metrics.append({
479
- "name": benchmark_name,
480
- "type": benchmark_name.lower().replace(" ", "_"),
481
- "value": value
482
- })
483
- except ValueError:
484
- continue
485
-
486
- return metrics
487
-
488
-
489
- def extract_evaluations_from_readme(
490
- repo_id: str,
491
- task_type: str = "text-generation",
492
- dataset_name: str = "Benchmarks",
493
- dataset_type: str = "benchmark",
494
- model_name_override: Optional[str] = None,
495
- table_index: Optional[int] = None,
496
- model_column_index: Optional[int] = None
497
- ) -> Optional[List[Dict[str, Any]]]:
498
- """
499
- Extract evaluation results from a model's README.
500
-
501
- Args:
502
- repo_id: Hugging Face model repository ID
503
- task_type: Task type for model-index (e.g., "text-generation")
504
- dataset_name: Name for the benchmark dataset
505
- dataset_type: Type identifier for the dataset
506
- model_name_override: Override model name for matching (column header for comparison tables)
507
- table_index: 1-indexed table number from inspect-tables output
508
-
509
- Returns:
510
- Model-index formatted results or None if no evaluations found
511
- """
512
- try:
513
- load_env()
514
- ModelCard = require_model_card()
515
- hf_token = os.getenv("HF_TOKEN")
516
- card = ModelCard.load(repo_id, token=hf_token)
517
- readme_content = card.content
518
-
519
- if not readme_content:
520
- print(f"No README content found for {repo_id}")
521
- return None
522
-
523
- # Extract model name from repo_id or use override
524
- if model_name_override:
525
- model_name = model_name_override
526
- print(f"Using model name override: '{model_name}'")
527
- else:
528
- model_name = repo_id.split("/")[-1] if "/" in repo_id else repo_id
529
-
530
- # Use markdown-it parser for accurate table extraction
531
- all_tables = extract_tables_with_parser(readme_content)
532
-
533
- if not all_tables:
534
- print(f"No tables found in README for {repo_id}")
535
- return None
536
-
537
- # If table_index specified, use that specific table
538
- if table_index is not None:
539
- if table_index < 1 or table_index > len(all_tables):
540
- print(f"Invalid table index {table_index}. Found {len(all_tables)} tables.")
541
- print("Run inspect-tables to see available tables.")
542
- return None
543
- tables_to_process = [all_tables[table_index - 1]]
544
- else:
545
- # Filter to evaluation tables only
546
- eval_tables = []
547
- for table in all_tables:
548
- header = table.get("headers", [])
549
- rows = table.get("rows", [])
550
- if is_evaluation_table(header, rows):
551
- eval_tables.append(table)
552
-
553
- if len(eval_tables) > 1:
554
- print(f"\n⚠ Found {len(eval_tables)} evaluation tables.")
555
- print("Run inspect-tables first, then use --table to select one:")
556
- print(f' uv run scripts/evaluation_manager.py inspect-tables --repo-id "{repo_id}"')
557
- return None
558
- elif len(eval_tables) == 0:
559
- print(f"No evaluation tables found in README for {repo_id}")
560
- return None
561
-
562
- tables_to_process = eval_tables
563
-
564
- # Extract metrics from selected table(s)
565
- all_metrics = []
566
- for table in tables_to_process:
567
- header = table.get("headers", [])
568
- rows = table.get("rows", [])
569
- metrics = extract_metrics_from_table(
570
- header,
571
- rows,
572
- model_name=model_name,
573
- model_column_index=model_column_index
574
- )
575
- all_metrics.extend(metrics)
576
-
577
- if not all_metrics:
578
- print(f"No metrics extracted from table")
579
- return None
580
-
581
- # Build model-index structure
582
- display_name = repo_id.split("/")[-1] if "/" in repo_id else repo_id
583
-
584
- results = [{
585
- "task": {"type": task_type},
586
- "dataset": {
587
- "name": dataset_name,
588
- "type": dataset_type
589
- },
590
- "metrics": all_metrics,
591
- "source": {
592
- "name": "Model README",
593
- "url": f"https://huggingface.co/{repo_id}"
594
- }
595
- }]
596
-
597
- return results
598
-
599
- except Exception as e:
600
- print(f"Error extracting evaluations from README: {e}")
601
- return None
602
-
603
-
604
- # ============================================================================
605
- # Table Inspection (using markdown-it-py for accurate parsing)
606
- # ============================================================================
607
-
608
-
609
- def extract_tables_with_parser(markdown_content: str) -> List[Dict[str, Any]]:
610
- """
611
- Extract tables from markdown using markdown-it-py parser.
612
- Uses GFM (GitHub Flavored Markdown) which includes table support.
613
- """
614
- MarkdownIt = require_markdown_it()
615
- # Disable linkify to avoid optional dependency errors; not needed for table parsing.
616
- md = MarkdownIt("gfm-like", {"linkify": False})
617
- tokens = md.parse(markdown_content)
618
-
619
- tables = []
620
- i = 0
621
- while i < len(tokens):
622
- token = tokens[i]
623
-
624
- if token.type == "table_open":
625
- table_data = {"headers": [], "rows": []}
626
- current_row = []
627
- in_header = False
628
-
629
- i += 1
630
- while i < len(tokens) and tokens[i].type != "table_close":
631
- t = tokens[i]
632
- if t.type == "thead_open":
633
- in_header = True
634
- elif t.type == "thead_close":
635
- in_header = False
636
- elif t.type == "tr_open":
637
- current_row = []
638
- elif t.type == "tr_close":
639
- if in_header:
640
- table_data["headers"] = current_row
641
- else:
642
- table_data["rows"].append(current_row)
643
- current_row = []
644
- elif t.type == "inline":
645
- current_row.append(t.content.strip())
646
- i += 1
647
-
648
- if table_data["headers"] or table_data["rows"]:
649
- tables.append(table_data)
650
-
651
- i += 1
652
-
653
- return tables
654
-
655
-
656
- def detect_table_format(table: Dict[str, Any], repo_id: str) -> Dict[str, Any]:
657
- """Analyze a table to detect its format and identify model columns."""
658
- headers = table.get("headers", [])
659
- rows = table.get("rows", [])
660
-
661
- if not headers or not rows:
662
- return {"format": "unknown", "columns": headers, "model_columns": [], "row_count": 0, "sample_rows": []}
663
-
664
- first_header = headers[0].lower() if headers else ""
665
- is_first_col_benchmarks = not first_header or first_header in ["", "benchmark", "task", "dataset", "metric", "eval"]
666
-
667
- # Check for numeric columns
668
- numeric_columns = []
669
- for col_idx in range(1, len(headers)):
670
- numeric_count = 0
671
- for row in rows[:5]:
672
- if col_idx < len(row):
673
- try:
674
- val = re.sub(r'\s*\([^)]*\)', '', row[col_idx])
675
- float(val.replace("%", "").replace(",", "").strip())
676
- numeric_count += 1
677
- except (ValueError, AttributeError):
678
- pass
679
- if numeric_count > len(rows[:5]) / 2:
680
- numeric_columns.append(col_idx)
681
-
682
- # Determine format
683
- if is_first_col_benchmarks and len(numeric_columns) > 1:
684
- format_type = "comparison"
685
- elif is_first_col_benchmarks and len(numeric_columns) == 1:
686
- format_type = "simple"
687
- elif len(numeric_columns) > len(headers) / 2:
688
- format_type = "transposed"
689
- else:
690
- format_type = "unknown"
691
-
692
- # Find model columns
693
- model_columns = []
694
- model_name = repo_id.split("/")[-1] if "/" in repo_id else repo_id
695
- model_tokens, _ = normalize_model_name(model_name)
696
-
697
- for idx, header in enumerate(headers):
698
- if idx == 0 and is_first_col_benchmarks:
699
- continue
700
- if header:
701
- header_tokens, _ = normalize_model_name(header)
702
- is_match = model_tokens == header_tokens
703
- is_partial = model_tokens.issubset(header_tokens) or header_tokens.issubset(model_tokens)
704
- model_columns.append({
705
- "index": idx,
706
- "header": header,
707
- "is_exact_match": is_match,
708
- "is_partial_match": is_partial and not is_match
709
- })
710
-
711
- return {
712
- "format": format_type,
713
- "columns": headers,
714
- "model_columns": model_columns,
715
- "row_count": len(rows),
716
- "sample_rows": [row[0] for row in rows[:5] if row]
717
- }
718
-
719
-
720
- def inspect_tables(repo_id: str) -> None:
721
- """Inspect and display all evaluation tables in a model's README."""
722
- try:
723
- load_env()
724
- ModelCard = require_model_card()
725
- hf_token = os.getenv("HF_TOKEN")
726
- card = ModelCard.load(repo_id, token=hf_token)
727
- readme_content = card.content
728
-
729
- if not readme_content:
730
- print(f"No README content found for {repo_id}")
731
- return
732
-
733
- tables = extract_tables_with_parser(readme_content)
734
-
735
- if not tables:
736
- print(f"No tables found in README for {repo_id}")
737
- return
738
-
739
- print(f"\n{'='*70}")
740
- print(f"Tables found in README for: {repo_id}")
741
- print(f"{'='*70}")
742
-
743
- eval_table_count = 0
744
- for table in tables:
745
- analysis = detect_table_format(table, repo_id)
746
-
747
- if analysis["format"] == "unknown" and not analysis.get("sample_rows"):
748
- continue
749
-
750
- eval_table_count += 1
751
- print(f"\n## Table {eval_table_count}")
752
- print(f" Format: {analysis['format']}")
753
- print(f" Rows: {analysis['row_count']}")
754
-
755
- print(f"\n Columns ({len(analysis['columns'])}):")
756
- for col_info in analysis.get("model_columns", []):
757
- idx = col_info["index"]
758
- header = col_info["header"]
759
- if col_info["is_exact_match"]:
760
- print(f" [{idx}] {header} ✓ EXACT MATCH")
761
- elif col_info["is_partial_match"]:
762
- print(f" [{idx}] {header} ~ partial match")
763
- else:
764
- print(f" [{idx}] {header}")
765
-
766
- if analysis.get("sample_rows"):
767
- print(f"\n Sample rows (first column):")
768
- for row_val in analysis["sample_rows"][:5]:
769
- print(f" - {row_val}")
770
-
771
- if eval_table_count == 0:
772
- print("\nNo evaluation tables detected.")
773
- else:
774
- print("\nSuggested next step:")
775
- print(f' uv run scripts/evaluation_manager.py extract-readme --repo-id "{repo_id}" --table <table-number> [--model-column-index <column-index>]')
776
-
777
- print(f"\n{'='*70}\n")
778
-
779
- except Exception as e:
780
- print(f"Error inspecting tables: {e}")
781
-
782
-
783
- # ============================================================================
784
- # Pull Request Management
785
- # ============================================================================
786
-
787
-
788
- def get_open_prs(repo_id: str) -> List[Dict[str, Any]]:
789
- """
790
- Fetch open pull requests for a Hugging Face model repository.
791
-
792
- Args:
793
- repo_id: Hugging Face model repository ID (e.g., "allenai/Olmo-3-32B-Think")
794
-
795
- Returns:
796
- List of open PR dictionaries with num, title, author, and createdAt
797
- """
798
- requests = require_requests()
799
- url = f"https://huggingface.co/api/models/{repo_id}/discussions"
800
-
801
- try:
802
- response = requests.get(url, timeout=30, allow_redirects=True)
803
- response.raise_for_status()
804
-
805
- data = response.json()
806
- discussions = data.get("discussions", [])
807
-
808
- open_prs = [
809
- {
810
- "num": d["num"],
811
- "title": d["title"],
812
- "author": d["author"]["name"],
813
- "createdAt": d.get("createdAt", "unknown"),
814
- }
815
- for d in discussions
816
- if d.get("status") == "open" and d.get("isPullRequest")
817
- ]
818
-
819
- return open_prs
820
-
821
- except requests.RequestException as e:
822
- print(f"Error fetching PRs from Hugging Face: {e}")
823
- return []
824
-
825
-
826
- def list_open_prs(repo_id: str) -> None:
827
- """Display open pull requests for a model repository."""
828
- prs = get_open_prs(repo_id)
829
-
830
- print(f"\n{'='*70}")
831
- print(f"Open Pull Requests for: {repo_id}")
832
- print(f"{'='*70}")
833
-
834
- if not prs:
835
- print("\nNo open pull requests found.")
836
- else:
837
- print(f"\nFound {len(prs)} open PR(s):\n")
838
- for pr in prs:
839
- print(f" PR #{pr['num']} - {pr['title']}")
840
- print(f" Author: {pr['author']}")
841
- print(f" Created: {pr['createdAt']}")
842
- print(f" URL: https://huggingface.co/{repo_id}/discussions/{pr['num']}")
843
- print()
844
-
845
- print(f"{'='*70}\n")
846
-
847
-
848
- # ============================================================================
849
- # Method 2: Import from Artificial Analysis
850
- # ============================================================================
851
-
852
-
853
- def get_aa_model_data(creator_slug: str, model_name: str) -> Optional[Dict[str, Any]]:
854
- """
855
- Fetch model evaluation data from Artificial Analysis API.
856
-
857
- Args:
858
- creator_slug: Creator identifier (e.g., "anthropic", "openai")
859
- model_name: Model slug/identifier
860
-
861
- Returns:
862
- Model data dictionary or None if not found
863
- """
864
- load_env()
865
- AA_API_KEY = os.getenv("AA_API_KEY")
866
- if not AA_API_KEY:
867
- raise ValueError("AA_API_KEY environment variable is not set")
868
-
869
- url = "https://artificialanalysis.ai/api/v2/data/llms/models"
870
- headers = {"x-api-key": AA_API_KEY}
871
-
872
- requests = require_requests()
873
-
874
- try:
875
- response = requests.get(url, headers=headers, timeout=30)
876
- response.raise_for_status()
877
-
878
- data = response.json().get("data", [])
879
-
880
- for model in data:
881
- creator = model.get("model_creator", {})
882
- if creator.get("slug") == creator_slug and model.get("slug") == model_name:
883
- return model
884
-
885
- print(f"Model {creator_slug}/{model_name} not found in Artificial Analysis")
886
- return None
887
-
888
- except requests.RequestException as e:
889
- print(f"Error fetching data from Artificial Analysis: {e}")
890
- return None
891
-
892
-
893
- def aa_data_to_model_index(
894
- model_data: Dict[str, Any],
895
- dataset_name: str = "Artificial Analysis Benchmarks",
896
- dataset_type: str = "artificial_analysis",
897
- task_type: str = "evaluation"
898
- ) -> List[Dict[str, Any]]:
899
- """
900
- Convert Artificial Analysis model data to model-index format.
901
-
902
- Args:
903
- model_data: Raw model data from AA API
904
- dataset_name: Dataset name for model-index
905
- dataset_type: Dataset type identifier
906
- task_type: Task type for model-index
907
-
908
- Returns:
909
- Model-index formatted results
910
- """
911
- model_name = model_data.get("name", model_data.get("slug", "unknown-model"))
912
- evaluations = model_data.get("evaluations", {})
913
-
914
- if not evaluations:
915
- print(f"No evaluations found for model {model_name}")
916
- return []
917
-
918
- metrics = []
919
- for key, value in evaluations.items():
920
- if value is not None:
921
- metrics.append({
922
- "name": key.replace("_", " ").title(),
923
- "type": key,
924
- "value": value
925
- })
926
-
927
- results = [{
928
- "task": {"type": task_type},
929
- "dataset": {
930
- "name": dataset_name,
931
- "type": dataset_type
932
- },
933
- "metrics": metrics,
934
- "source": {
935
- "name": "Artificial Analysis API",
936
- "url": "https://artificialanalysis.ai"
937
- }
938
- }]
939
-
940
- return results
941
-
942
-
943
- def import_aa_evaluations(
944
- creator_slug: str,
945
- model_name: str,
946
- repo_id: str
947
- ) -> Optional[List[Dict[str, Any]]]:
948
- """
949
- Import evaluation results from Artificial Analysis for a model.
950
-
951
- Args:
952
- creator_slug: Creator identifier in AA
953
- model_name: Model identifier in AA
954
- repo_id: Hugging Face repository ID to update
955
-
956
- Returns:
957
- Model-index formatted results or None if import fails
958
- """
959
- model_data = get_aa_model_data(creator_slug, model_name)
960
-
961
- if not model_data:
962
- return None
963
-
964
- results = aa_data_to_model_index(model_data)
965
- return results
966
-
967
-
968
- # ============================================================================
969
- # Model Card Update Functions
970
- # ============================================================================
971
-
972
-
973
- def update_model_card_with_evaluations(
974
- repo_id: str,
975
- results: List[Dict[str, Any]],
976
- create_pr: bool = False,
977
- commit_message: Optional[str] = None
978
- ) -> bool:
979
- """
980
- Update a model card with evaluation results.
981
-
982
- Args:
983
- repo_id: Hugging Face repository ID
984
- results: Model-index formatted results
985
- create_pr: Whether to create a PR instead of direct push
986
- commit_message: Custom commit message
987
-
988
- Returns:
989
- True if successful, False otherwise
990
- """
991
- try:
992
- load_env()
993
- ModelCard = require_model_card()
994
- hf_token = os.getenv("HF_TOKEN")
995
- if not hf_token:
996
- raise ValueError("HF_TOKEN environment variable is not set")
997
-
998
- # Load existing card
999
- card = ModelCard.load(repo_id, token=hf_token)
1000
-
1001
- # Get model name
1002
- model_name = repo_id.split("/")[-1] if "/" in repo_id else repo_id
1003
-
1004
- # Create or update model-index
1005
- model_index = [{
1006
- "name": model_name,
1007
- "results": results
1008
- }]
1009
-
1010
- # Merge with existing model-index if present
1011
- if "model-index" in card.data:
1012
- existing = card.data["model-index"]
1013
- if isinstance(existing, list) and existing:
1014
- # Keep existing name if present
1015
- if "name" in existing[0]:
1016
- model_index[0]["name"] = existing[0]["name"]
1017
-
1018
- # Merge results
1019
- existing_results = existing[0].get("results", [])
1020
- model_index[0]["results"].extend(existing_results)
1021
-
1022
- card.data["model-index"] = model_index
1023
-
1024
- # Prepare commit message
1025
- if not commit_message:
1026
- commit_message = f"Add evaluation results to {model_name}"
1027
-
1028
- commit_description = (
1029
- "This commit adds structured evaluation results to the model card. "
1030
- "The results are formatted using the model-index specification and "
1031
- "will be displayed in the model card's evaluation widget."
1032
- )
1033
-
1034
- # Push update
1035
- card.push_to_hub(
1036
- repo_id,
1037
- token=hf_token,
1038
- commit_message=commit_message,
1039
- commit_description=commit_description,
1040
- create_pr=create_pr
1041
- )
1042
-
1043
- action = "Pull request created" if create_pr else "Model card updated"
1044
- print(f"✓ {action} successfully for {repo_id}")
1045
- return True
1046
-
1047
- except Exception as e:
1048
- print(f"Error updating model card: {e}")
1049
- return False
1050
-
1051
-
1052
- def show_evaluations(repo_id: str) -> None:
1053
- """Display current evaluations in a model card."""
1054
- try:
1055
- load_env()
1056
- ModelCard = require_model_card()
1057
- hf_token = os.getenv("HF_TOKEN")
1058
- card = ModelCard.load(repo_id, token=hf_token)
1059
-
1060
- if "model-index" not in card.data:
1061
- print(f"No model-index found in {repo_id}")
1062
- return
1063
-
1064
- model_index = card.data["model-index"]
1065
-
1066
- print(f"\nEvaluations for {repo_id}:")
1067
- print("=" * 60)
1068
-
1069
- for model_entry in model_index:
1070
- model_name = model_entry.get("name", "Unknown")
1071
- print(f"\nModel: {model_name}")
1072
-
1073
- results = model_entry.get("results", [])
1074
- for i, result in enumerate(results, 1):
1075
- print(f"\n Result Set {i}:")
1076
-
1077
- task = result.get("task", {})
1078
- print(f" Task: {task.get('type', 'unknown')}")
1079
-
1080
- dataset = result.get("dataset", {})
1081
- print(f" Dataset: {dataset.get('name', 'unknown')}")
1082
-
1083
- metrics = result.get("metrics", [])
1084
- print(f" Metrics ({len(metrics)}):")
1085
- for metric in metrics:
1086
- name = metric.get("name", "Unknown")
1087
- value = metric.get("value", "N/A")
1088
- print(f" - {name}: {value}")
1089
-
1090
- source = result.get("source", {})
1091
- if source:
1092
- print(f" Source: {source.get('name', 'Unknown')}")
1093
-
1094
- print("\n" + "=" * 60)
1095
-
1096
- except Exception as e:
1097
- print(f"Error showing evaluations: {e}")
1098
-
1099
-
1100
- def validate_model_index(repo_id: str) -> bool:
1101
- """Validate model-index format in a model card."""
1102
- try:
1103
- load_env()
1104
- ModelCard = require_model_card()
1105
- hf_token = os.getenv("HF_TOKEN")
1106
- card = ModelCard.load(repo_id, token=hf_token)
1107
-
1108
- if "model-index" not in card.data:
1109
- print(f"✗ No model-index found in {repo_id}")
1110
- return False
1111
-
1112
- model_index = card.data["model-index"]
1113
-
1114
- if not isinstance(model_index, list):
1115
- print("✗ model-index must be a list")
1116
- return False
1117
-
1118
- for i, entry in enumerate(model_index):
1119
- if "name" not in entry:
1120
- print(f"✗ Entry {i} missing 'name' field")
1121
- return False
1122
-
1123
- if "results" not in entry:
1124
- print(f"✗ Entry {i} missing 'results' field")
1125
- return False
1126
-
1127
- for j, result in enumerate(entry["results"]):
1128
- if "task" not in result:
1129
- print(f"✗ Result {j} in entry {i} missing 'task' field")
1130
- return False
1131
-
1132
- if "dataset" not in result:
1133
- print(f"✗ Result {j} in entry {i} missing 'dataset' field")
1134
- return False
1135
-
1136
- if "metrics" not in result:
1137
- print(f"✗ Result {j} in entry {i} missing 'metrics' field")
1138
- return False
1139
-
1140
- print(f"✓ Model-index format is valid for {repo_id}")
1141
- return True
1142
-
1143
- except Exception as e:
1144
- print(f"Error validating model-index: {e}")
1145
- return False
1146
-
1147
-
1148
- # ============================================================================
1149
- # CLI Interface
1150
- # ============================================================================
1151
-
1152
-
1153
- def main():
1154
- parser = argparse.ArgumentParser(
1155
- description=(
1156
- "Manage evaluation results in Hugging Face model cards.\n\n"
1157
- "Use standard Python or `uv run scripts/evaluation_manager.py ...` "
1158
- "to auto-resolve dependencies from the PEP 723 header."
1159
- ),
1160
- formatter_class=argparse.RawTextHelpFormatter,
1161
- epilog=dedent(
1162
- """\
1163
- Typical workflows:
1164
- - Inspect tables first:
1165
- uv run scripts/evaluation_manager.py inspect-tables --repo-id <model>
1166
- - Extract from README (prints YAML by default):
1167
- uv run scripts/evaluation_manager.py extract-readme --repo-id <model> --table N
1168
- - Apply changes:
1169
- uv run scripts/evaluation_manager.py extract-readme --repo-id <model> --table N --apply
1170
- - Import from Artificial Analysis:
1171
- AA_API_KEY=... uv run scripts/evaluation_manager.py import-aa --creator-slug org --model-name slug --repo-id <model>
1172
-
1173
- Tips:
1174
- - YAML is printed by default; use --apply or --create-pr to write changes.
1175
- - Set HF_TOKEN (and AA_API_KEY for import-aa); .env is loaded automatically if python-dotenv is installed.
1176
- - When multiple tables exist, run inspect-tables then select with --table N.
1177
- - To apply changes (push or PR), rerun extract-readme with --apply or --create-pr.
1178
- """
1179
- ),
1180
- )
1181
- parser.add_argument("--version", action="version", version="evaluation_manager 1.2.0")
1182
-
1183
- subparsers = parser.add_subparsers(dest="command", help="Command to execute")
1184
-
1185
- # Extract from README command
1186
- extract_parser = subparsers.add_parser(
1187
- "extract-readme",
1188
- help="Extract evaluation tables from model README",
1189
- formatter_class=argparse.RawTextHelpFormatter,
1190
- description="Parse README tables into model-index YAML. Default behavior prints YAML; use --apply/--create-pr to write changes.",
1191
- epilog=dedent(
1192
- """\
1193
- Examples:
1194
- uv run scripts/evaluation_manager.py extract-readme --repo-id username/model
1195
- uv run scripts/evaluation_manager.py extract-readme --repo-id username/model --table 2 --model-column-index 3
1196
- uv run scripts/evaluation_manager.py extract-readme --repo-id username/model --table 2 --model-name-override \"**Model 7B**\" # exact header text
1197
- uv run scripts/evaluation_manager.py extract-readme --repo-id username/model --table 2 --create-pr
1198
-
1199
- Apply changes:
1200
- - Default: prints YAML to stdout (no writes).
1201
- - Add --apply to push directly, or --create-pr to open a PR.
1202
- Model selection:
1203
- - Preferred: --model-column-index <header index shown by inspect-tables>
1204
- - If using --model-name-override, copy the column header text exactly.
1205
- """
1206
- ),
1207
- )
1208
- extract_parser.add_argument("--repo-id", type=str, required=True, help="HF repository ID")
1209
- extract_parser.add_argument("--table", type=int, help="Table number (1-indexed, from inspect-tables output)")
1210
- extract_parser.add_argument("--model-column-index", type=int, help="Preferred: column index from inspect-tables output (exact selection)")
1211
- extract_parser.add_argument("--model-name-override", type=str, help="Exact column header/model name for comparison/transpose tables (when index is not used)")
1212
- extract_parser.add_argument("--task-type", type=str, default="text-generation", help="Sets model-index task.type (e.g., text-generation, summarization)")
1213
- extract_parser.add_argument("--dataset-name", type=str, default="Benchmarks", help="Dataset name")
1214
- extract_parser.add_argument("--dataset-type", type=str, default="benchmark", help="Dataset type")
1215
- extract_parser.add_argument("--create-pr", action="store_true", help="Create PR instead of direct push")
1216
- extract_parser.add_argument("--apply", action="store_true", help="Apply changes (default is to print YAML only)")
1217
- extract_parser.add_argument("--dry-run", action="store_true", help="Preview YAML without updating (default)")
1218
-
1219
- # Import from AA command
1220
- aa_parser = subparsers.add_parser(
1221
- "import-aa",
1222
- help="Import evaluation scores from Artificial Analysis",
1223
- formatter_class=argparse.RawTextHelpFormatter,
1224
- description="Fetch scores from Artificial Analysis API and write them into model-index.",
1225
- epilog=dedent(
1226
- """\
1227
- Examples:
1228
- AA_API_KEY=... uv run scripts/evaluation_manager.py import-aa --creator-slug anthropic --model-name claude-sonnet-4 --repo-id username/model
1229
- uv run scripts/evaluation_manager.py import-aa --creator-slug openai --model-name gpt-4o --repo-id username/model --create-pr
1230
-
1231
- Requires: AA_API_KEY in env (or .env if python-dotenv installed).
1232
- """
1233
- ),
1234
- )
1235
- aa_parser.add_argument("--creator-slug", type=str, required=True, help="AA creator slug")
1236
- aa_parser.add_argument("--model-name", type=str, required=True, help="AA model name")
1237
- aa_parser.add_argument("--repo-id", type=str, required=True, help="HF repository ID")
1238
- aa_parser.add_argument("--create-pr", action="store_true", help="Create PR instead of direct push")
1239
-
1240
- # Show evaluations command
1241
- show_parser = subparsers.add_parser(
1242
- "show",
1243
- help="Display current evaluations in model card",
1244
- formatter_class=argparse.RawTextHelpFormatter,
1245
- description="Print model-index content from the model card (requires HF_TOKEN for private repos).",
1246
- )
1247
- show_parser.add_argument("--repo-id", type=str, required=True, help="HF repository ID")
1248
-
1249
- # Validate command
1250
- validate_parser = subparsers.add_parser(
1251
- "validate",
1252
- help="Validate model-index format",
1253
- formatter_class=argparse.RawTextHelpFormatter,
1254
- description="Schema sanity check for model-index section of the card.",
1255
- )
1256
- validate_parser.add_argument("--repo-id", type=str, required=True, help="HF repository ID")
1257
-
1258
- # Inspect tables command
1259
- inspect_parser = subparsers.add_parser(
1260
- "inspect-tables",
1261
- help="Inspect tables in README → outputs suggested extract-readme command",
1262
- formatter_class=argparse.RawDescriptionHelpFormatter,
1263
- epilog="""
1264
- Workflow:
1265
- 1. inspect-tables → see table structure, columns, and table numbers
1266
- 2. extract-readme → run with --table N (from step 1); YAML prints by default
1267
- 3. apply changes → rerun extract-readme with --apply or --create-pr
1268
-
1269
- Reminder:
1270
- - Preferred: use --model-column-index <index>. If needed, use --model-name-override with the exact column header text.
1271
- """
1272
- )
1273
- inspect_parser.add_argument("--repo-id", type=str, required=True, help="HF repository ID")
1274
-
1275
- # Get PRs command
1276
- prs_parser = subparsers.add_parser(
1277
- "get-prs",
1278
- help="List open pull requests for a model repository",
1279
- formatter_class=argparse.RawTextHelpFormatter,
1280
- description="Check for existing open PRs before creating new ones to avoid duplicates.",
1281
- epilog=dedent(
1282
- """\
1283
- Examples:
1284
- uv run scripts/evaluation_manager.py get-prs --repo-id "allenai/Olmo-3-32B-Think"
1285
-
1286
- IMPORTANT: Always run this before using --create-pr to avoid duplicate PRs.
1287
- """
1288
- ),
1289
- )
1290
- prs_parser.add_argument("--repo-id", type=str, required=True, help="HF repository ID")
1291
-
1292
- args = parser.parse_args()
1293
-
1294
- if not args.command:
1295
- parser.print_help()
1296
- return
1297
-
1298
- try:
1299
- # Execute command
1300
- if args.command == "extract-readme":
1301
- results = extract_evaluations_from_readme(
1302
- repo_id=args.repo_id,
1303
- task_type=args.task_type,
1304
- dataset_name=args.dataset_name,
1305
- dataset_type=args.dataset_type,
1306
- model_name_override=args.model_name_override,
1307
- table_index=args.table,
1308
- model_column_index=args.model_column_index
1309
- )
1310
-
1311
- if not results:
1312
- print("No evaluations extracted")
1313
- return
1314
-
1315
- apply_changes = args.apply or args.create_pr
1316
-
1317
- # Default behavior: print YAML (dry-run)
1318
- yaml = require_yaml()
1319
- print("\nExtracted evaluations (YAML):")
1320
- print(
1321
- yaml.dump(
1322
- {"model-index": [{"name": args.repo_id.split('/')[-1], "results": results}]},
1323
- sort_keys=False
1324
- )
1325
- )
1326
-
1327
- if apply_changes:
1328
- if args.model_name_override and args.model_column_index is not None:
1329
- print("Note: --model-column-index takes precedence over --model-name-override.")
1330
- update_model_card_with_evaluations(
1331
- repo_id=args.repo_id,
1332
- results=results,
1333
- create_pr=args.create_pr,
1334
- commit_message="Extract evaluation results from README"
1335
- )
1336
-
1337
- elif args.command == "import-aa":
1338
- results = import_aa_evaluations(
1339
- creator_slug=args.creator_slug,
1340
- model_name=args.model_name,
1341
- repo_id=args.repo_id
1342
- )
1343
-
1344
- if not results:
1345
- print("No evaluations imported")
1346
- return
1347
-
1348
- update_model_card_with_evaluations(
1349
- repo_id=args.repo_id,
1350
- results=results,
1351
- create_pr=args.create_pr,
1352
- commit_message=f"Add Artificial Analysis evaluations for {args.model_name}"
1353
- )
1354
-
1355
- elif args.command == "show":
1356
- show_evaluations(args.repo_id)
1357
-
1358
- elif args.command == "validate":
1359
- validate_model_index(args.repo_id)
1360
-
1361
- elif args.command == "inspect-tables":
1362
- inspect_tables(args.repo_id)
1363
-
1364
- elif args.command == "get-prs":
1365
- list_open_prs(args.repo_id)
1366
- except ModuleNotFoundError as exc:
1367
- # Surface dependency hints cleanly when user only needs help output
1368
- print(exc)
1369
- except Exception as exc:
1370
- print(f"Error: {exc}")
1371
-
1372
-
1373
- if __name__ == "__main__":
1374
- main()