dsh-aris-panel 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (442) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -0
  3. package/README_CN.md +87 -0
  4. package/dsh/checkout.patch.yml +38 -0
  5. package/dsh/client.js +634 -0
  6. package/dsh/cordis.patch.yml +44 -0
  7. package/dsh/index.mjs +76 -0
  8. package/dsh/run-status.mjs +182 -0
  9. package/dsh/scope-limits.mjs +50 -0
  10. package/dsh/workbench.mjs +291 -0
  11. package/mcp-servers/claude-review/README.md +93 -0
  12. package/mcp-servers/claude-review/run_with_claude_aws.sh +49 -0
  13. package/mcp-servers/claude-review/server.py +718 -0
  14. package/mcp-servers/codex-image2/README.md +65 -0
  15. package/mcp-servers/codex-image2/server.py +893 -0
  16. package/mcp-servers/feishu-bridge/requirements.txt +1 -0
  17. package/mcp-servers/feishu-bridge/server.py +240 -0
  18. package/mcp-servers/gemini-review/README.md +171 -0
  19. package/mcp-servers/gemini-review/server.py +1856 -0
  20. package/mcp-servers/llm-chat/requirements.txt +1 -0
  21. package/mcp-servers/llm-chat/server.py +664 -0
  22. package/mcp-servers/manual-review/README.md +133 -0
  23. package/mcp-servers/manual-review/server.py +910 -0
  24. package/mcp-servers/manual-review/ui.html +279 -0
  25. package/mcp-servers/minimax-chat/requirements.txt +1 -0
  26. package/mcp-servers/minimax-chat/server.py +381 -0
  27. package/package.json +51 -0
  28. package/skills/ablation-planner/SKILL.md +123 -0
  29. package/skills/alphaxiv/SKILL.md +196 -0
  30. package/skills/analyze-results/SKILL.md +46 -0
  31. package/skills/arxiv/SKILL.md +248 -0
  32. package/skills/auto-paper-improvement-loop/SKILL.md +651 -0
  33. package/skills/auto-review-loop/SKILL.md +1137 -0
  34. package/skills/auto-review-loop-llm/SKILL.md +259 -0
  35. package/skills/auto-review-loop-minimax/SKILL.md +302 -0
  36. package/skills/citation-audit/SKILL.md +502 -0
  37. package/skills/claims-drafting/SKILL.md +227 -0
  38. package/skills/comm-lit-review/SKILL.md +297 -0
  39. package/skills/deepxiv/SKILL.md +263 -0
  40. package/skills/dse-loop/SKILL.md +296 -0
  41. package/skills/embodiment-description/SKILL.md +129 -0
  42. package/skills/exa-search/SKILL.md +205 -0
  43. package/skills/experiment-audit/SKILL.md +311 -0
  44. package/skills/experiment-bridge/SKILL.md +376 -0
  45. package/skills/experiment-plan/SKILL.md +249 -0
  46. package/skills/experiment-queue/SKILL.md +431 -0
  47. package/skills/experiment-queue/scripts/build_manifest.py +142 -0
  48. package/skills/experiment-queue/scripts/queue_manager.py +433 -0
  49. package/skills/feishu-notify/SKILL.md +156 -0
  50. package/skills/figure-description/SKILL.md +138 -0
  51. package/skills/figure-spec/SKILL.md +262 -0
  52. package/skills/figure-spec/scripts/figure_renderer.py +799 -0
  53. package/skills/formula-derivation/SKILL.md +280 -0
  54. package/skills/gemini-search/SKILL.md +231 -0
  55. package/skills/grant-proposal/SKILL.md +698 -0
  56. package/skills/idea-creator/SKILL.md +542 -0
  57. package/skills/idea-discovery/SKILL.md +521 -0
  58. package/skills/idea-discovery-robot/SKILL.md +363 -0
  59. package/skills/integrity-forensics/SKILL.md +284 -0
  60. package/skills/interview-cheatsheet/SKILL.md +245 -0
  61. package/skills/invention-structuring/SKILL.md +188 -0
  62. package/skills/jurisdiction-format/SKILL.md +192 -0
  63. package/skills/kill-argument/SKILL.md +437 -0
  64. package/skills/mermaid-diagram/SKILL.md +419 -0
  65. package/skills/meta-apply/SKILL.md +141 -0
  66. package/skills/meta-optimize/SKILL.md +437 -0
  67. package/skills/monitor-experiment/SKILL.md +140 -0
  68. package/skills/novelty-check/SKILL.md +101 -0
  69. package/skills/openalex/SKILL.md +237 -0
  70. package/skills/overleaf-sync/SKILL.md +220 -0
  71. package/skills/paper-claim-audit/SKILL.md +348 -0
  72. package/skills/paper-compile/SKILL.md +266 -0
  73. package/skills/paper-figure/SKILL.md +312 -0
  74. package/skills/paper-illustration/SKILL.md +736 -0
  75. package/skills/paper-illustration-image2/SKILL.md +391 -0
  76. package/skills/paper-illustration-image2/scripts/paper_illustration_image2.py +255 -0
  77. package/skills/paper-plan/SKILL.md +386 -0
  78. package/skills/paper-poster/SKILL.md +19 -0
  79. package/skills/paper-poster-html/DESIGN_FINAL.md +176 -0
  80. package/skills/paper-poster-html/IMPLEMENTATION_CONVENTIONS.md +161 -0
  81. package/skills/paper-poster-html/LICENSES/posterly-MIT.txt +21 -0
  82. package/skills/paper-poster-html/NOTICE.md +57 -0
  83. package/skills/paper-poster-html/SKILL.md +323 -0
  84. package/skills/paper-poster-html/scripts/_posterly/__init__.py +0 -0
  85. package/skills/paper-poster-html/scripts/_posterly/canvas.py +200 -0
  86. package/skills/paper-poster-html/scripts/_posterly/measure.py +588 -0
  87. package/skills/paper-poster-html/scripts/_posterly/polish.py +498 -0
  88. package/skills/paper-poster-html/scripts/_posterly/preflight.py +489 -0
  89. package/skills/paper-poster-html/scripts/_posterly/render.py +215 -0
  90. package/skills/paper-poster-html/scripts/_posterly/textutil.py +16 -0
  91. package/skills/paper-poster-html/scripts/_posterly/verify_final.py +171 -0
  92. package/skills/paper-poster-html/scripts/asset_check.py +897 -0
  93. package/skills/paper-poster-html/scripts/extract_pdf_figures.py +666 -0
  94. package/skills/paper-poster-html/scripts/poster_check.py +251 -0
  95. package/skills/paper-poster-html/scripts/preprocess_figures.py +238 -0
  96. package/skills/paper-poster-html/scripts/render_preview.py +217 -0
  97. package/skills/paper-poster-html/scripts/run_gates.py +556 -0
  98. package/skills/paper-poster-html/scripts/style_check.py +1324 -0
  99. package/skills/paper-poster-html/templates/COMPONENTS.md +462 -0
  100. package/skills/paper-poster-html/templates/README.md +170 -0
  101. package/skills/paper-poster-html/templates/landscape_4col.html +1032 -0
  102. package/skills/paper-poster-html/templates/landscape_hero.html +1046 -0
  103. package/skills/paper-poster-html/templates/portrait_2col.html +947 -0
  104. package/skills/paper-poster-html/templates/tokens/acl.json +9 -0
  105. package/skills/paper-poster-html/templates/tokens/cvpr.json +9 -0
  106. package/skills/paper-poster-html/templates/tokens/generic.json +9 -0
  107. package/skills/paper-poster-html/templates/tokens/iclr.json +9 -0
  108. package/skills/paper-poster-html/templates/tokens/icml.json +9 -0
  109. package/skills/paper-poster-html/templates/tokens/neurips.json +9 -0
  110. package/skills/paper-slides/SKILL.md +635 -0
  111. package/skills/paper-talk/SKILL.md +381 -0
  112. package/skills/paper-write/SKILL.md +604 -0
  113. package/skills/paper-write/templates/IEEEtran.bst +2409 -0
  114. package/skills/paper-write/templates/IEEEtran.cls +6347 -0
  115. package/skills/paper-write/templates/iclr2026.tex +84 -0
  116. package/skills/paper-write/templates/icml2025.tex +87 -0
  117. package/skills/paper-write/templates/ieee_conference.tex +89 -0
  118. package/skills/paper-write/templates/ieee_journal.tex +93 -0
  119. package/skills/paper-write/templates/math_commands.tex +48 -0
  120. package/skills/paper-write/templates/neurips2025.tex +80 -0
  121. package/skills/paper-writing/SKILL.md +916 -0
  122. package/skills/patent-novelty-check/SKILL.md +153 -0
  123. package/skills/patent-pipeline/SKILL.md +344 -0
  124. package/skills/patent-review/SKILL.md +203 -0
  125. package/skills/pixel-art/SKILL.md +137 -0
  126. package/skills/prior-art-search/SKILL.md +146 -0
  127. package/skills/proof-checker/SKILL.md +866 -0
  128. package/skills/proof-orchestrator/NOTICE.md +24 -0
  129. package/skills/proof-orchestrator/SKILL.md +254 -0
  130. package/skills/proof-orchestrator/references/audit-output-contract.md +126 -0
  131. package/skills/proof-orchestrator/references/deepseek-routing.md +74 -0
  132. package/skills/proof-orchestrator/references/dispatch-prompts.md +227 -0
  133. package/skills/proof-orchestrator/references/notation-audit.md +135 -0
  134. package/skills/proof-orchestrator/references/proof-audit-rubric.md +70 -0
  135. package/skills/proof-orchestrator/references/stress-tests.md +38 -0
  136. package/skills/proof-writer/SKILL.md +223 -0
  137. package/skills/qzcli/SKILL.md +324 -0
  138. package/skills/rebuttal/SKILL.md +376 -0
  139. package/skills/render-html/SKILL.md +316 -0
  140. package/skills/render-html/scripts/render_html.py +1006 -0
  141. package/skills/render-html/scripts/templates/academic.html +703 -0
  142. package/skills/render-html/scripts/templates/dashboard.html +333 -0
  143. package/skills/research-lit/SKILL.md +756 -0
  144. package/skills/research-pipeline/SKILL.md +384 -0
  145. package/skills/research-refine/SKILL.md +770 -0
  146. package/skills/research-refine-pipeline/SKILL.md +186 -0
  147. package/skills/research-review/SKILL.md +198 -0
  148. package/skills/research-wiki/SKILL.md +461 -0
  149. package/skills/resubmit-pipeline/SKILL.md +447 -0
  150. package/skills/result-to-claim/SKILL.md +311 -0
  151. package/skills/run-experiment/SKILL.md +313 -0
  152. package/skills/semantic-scholar/SKILL.md +236 -0
  153. package/skills/serverless-modal/SKILL.md +335 -0
  154. package/skills/shared-references/acceptance-gate.md +324 -0
  155. package/skills/shared-references/assurance-contract.md +248 -0
  156. package/skills/shared-references/capture-antipatterns.md +78 -0
  157. package/skills/shared-references/citation-discipline.md +583 -0
  158. package/skills/shared-references/compute-env-contract.md +163 -0
  159. package/skills/shared-references/effort-contract.md +183 -0
  160. package/skills/shared-references/evidence-precheck.md +65 -0
  161. package/skills/shared-references/experiment-integrity.md +49 -0
  162. package/skills/shared-references/external-cadence.md +326 -0
  163. package/skills/shared-references/fan-out-pattern.md +366 -0
  164. package/skills/shared-references/injection-hygiene.md +127 -0
  165. package/skills/shared-references/integration-contract.md +461 -0
  166. package/skills/shared-references/output-composition.md +93 -0
  167. package/skills/shared-references/output-language.md +45 -0
  168. package/skills/shared-references/output-manifest.md +49 -0
  169. package/skills/shared-references/output-versioning.md +111 -0
  170. package/skills/shared-references/patent-format-cn.md +199 -0
  171. package/skills/shared-references/patent-format-ep.md +173 -0
  172. package/skills/shared-references/patent-format-us.md +161 -0
  173. package/skills/shared-references/patent-writing-principles.md +197 -0
  174. package/skills/shared-references/prior-art-databases.md +141 -0
  175. package/skills/shared-references/resumable-runs.md +109 -0
  176. package/skills/shared-references/review-scope-limits.md +81 -0
  177. package/skills/shared-references/review-tracing.md +391 -0
  178. package/skills/shared-references/reviewer-independence.md +79 -0
  179. package/skills/shared-references/reviewer-routing.md +852 -0
  180. package/skills/shared-references/skill-governance.md +104 -0
  181. package/skills/shared-references/taste-calibration.md +85 -0
  182. package/skills/shared-references/venue-checklists.md +114 -0
  183. package/skills/shared-references/wiki-helper-resolution.md +134 -0
  184. package/skills/shared-references/writing-principles.md +525 -0
  185. package/skills/skills-codex/README.md +102 -0
  186. package/skills/skills-codex/README_CN.md +100 -0
  187. package/skills/skills-codex/ablation-planner/SKILL.md +126 -0
  188. package/skills/skills-codex/alphaxiv/SKILL.md +186 -0
  189. package/skills/skills-codex/analyze-results/SKILL.md +45 -0
  190. package/skills/skills-codex/arxiv/SKILL.md +210 -0
  191. package/skills/skills-codex/auto-paper-improvement-loop/SKILL.md +574 -0
  192. package/skills/skills-codex/auto-review-loop/SKILL.md +500 -0
  193. package/skills/skills-codex/auto-review-loop-llm/SKILL.md +247 -0
  194. package/skills/skills-codex/auto-review-loop-minimax/SKILL.md +290 -0
  195. package/skills/skills-codex/citation-audit/SKILL.md +504 -0
  196. package/skills/skills-codex/claims-drafting/SKILL.md +239 -0
  197. package/skills/skills-codex/comm-lit-review/SKILL.md +299 -0
  198. package/skills/skills-codex/comm-lit-review/references/domain-taxonomy.md +57 -0
  199. package/skills/skills-codex/comm-lit-review/references/output-template.md +37 -0
  200. package/skills/skills-codex/comm-lit-review/references/source-policy.md +99 -0
  201. package/skills/skills-codex/comm-lit-review/references/venue-tiering.md +112 -0
  202. package/skills/skills-codex/deepxiv/SKILL.md +142 -0
  203. package/skills/skills-codex/dse-loop/SKILL.md +285 -0
  204. package/skills/skills-codex/embodiment-description/SKILL.md +129 -0
  205. package/skills/skills-codex/exa-search/SKILL.md +192 -0
  206. package/skills/skills-codex/experiment-audit/SKILL.md +286 -0
  207. package/skills/skills-codex/experiment-bridge/SKILL.md +356 -0
  208. package/skills/skills-codex/experiment-plan/SKILL.md +249 -0
  209. package/skills/skills-codex/experiment-queue/SKILL.md +401 -0
  210. package/skills/skills-codex/feishu-notify/SKILL.md +155 -0
  211. package/skills/skills-codex/figure-description/SKILL.md +138 -0
  212. package/skills/skills-codex/figure-spec/SKILL.md +252 -0
  213. package/skills/skills-codex/formula-derivation/SKILL.md +280 -0
  214. package/skills/skills-codex/gemini-search/SKILL.md +205 -0
  215. package/skills/skills-codex/grant-proposal/SKILL.md +626 -0
  216. package/skills/skills-codex/idea-creator/SKILL.md +405 -0
  217. package/skills/skills-codex/idea-discovery/SKILL.md +475 -0
  218. package/skills/skills-codex/idea-discovery-robot/SKILL.md +362 -0
  219. package/skills/skills-codex/integrity-forensics/SKILL.md +106 -0
  220. package/skills/skills-codex/interview-cheatsheet/SKILL.md +245 -0
  221. package/skills/skills-codex/invention-structuring/SKILL.md +188 -0
  222. package/skills/skills-codex/jurisdiction-format/SKILL.md +192 -0
  223. package/skills/skills-codex/kill-argument/SKILL.md +403 -0
  224. package/skills/skills-codex/mermaid-diagram/SKILL.md +379 -0
  225. package/skills/skills-codex/meta-apply/SKILL.md +154 -0
  226. package/skills/skills-codex/meta-optimize/SKILL.md +348 -0
  227. package/skills/skills-codex/monitor-experiment/SKILL.md +98 -0
  228. package/skills/skills-codex/novelty-check/SKILL.md +89 -0
  229. package/skills/skills-codex/openalex/SKILL.md +228 -0
  230. package/skills/skills-codex/overleaf-sync/SKILL.md +220 -0
  231. package/skills/skills-codex/paper-claim-audit/SKILL.md +350 -0
  232. package/skills/skills-codex/paper-compile/SKILL.md +253 -0
  233. package/skills/skills-codex/paper-figure/SKILL.md +311 -0
  234. package/skills/skills-codex/paper-illustration/SKILL.md +690 -0
  235. package/skills/skills-codex/paper-illustration-image2/SKILL.md +383 -0
  236. package/skills/skills-codex/paper-illustration-image2/scripts/paper_illustration_image2.py +255 -0
  237. package/skills/skills-codex/paper-plan/SKILL.md +278 -0
  238. package/skills/skills-codex/paper-poster/SKILL.md +19 -0
  239. package/skills/skills-codex/paper-poster-html/SKILL.md +377 -0
  240. package/skills/skills-codex/paper-slides/SKILL.md +571 -0
  241. package/skills/skills-codex/paper-talk/SKILL.md +381 -0
  242. package/skills/skills-codex/paper-write/SKILL.md +411 -0
  243. package/skills/skills-codex/paper-write/templates/IEEEtran.bst +2409 -0
  244. package/skills/skills-codex/paper-write/templates/IEEEtran.cls +6347 -0
  245. package/skills/skills-codex/paper-write/templates/aaai2026.bst +1493 -0
  246. package/skills/skills-codex/paper-write/templates/aaai2026.sty +315 -0
  247. package/skills/skills-codex/paper-write/templates/aaai2026.tex +952 -0
  248. package/skills/skills-codex/paper-write/templates/acl.sty +312 -0
  249. package/skills/skills-codex/paper-write/templates/acl2026.tex +377 -0
  250. package/skills/skills-codex/paper-write/templates/acl_natbib.bst +1940 -0
  251. package/skills/skills-codex/paper-write/templates/acm.bst +3081 -0
  252. package/skills/skills-codex/paper-write/templates/acm_mm2026.tex +204 -0
  253. package/skills/skills-codex/paper-write/templates/acmart.cls +3520 -0
  254. package/skills/skills-codex/paper-write/templates/cvpr.bst +1448 -0
  255. package/skills/skills-codex/paper-write/templates/cvpr.sty +508 -0
  256. package/skills/skills-codex/paper-write/templates/cvpr2026.tex +63 -0
  257. package/skills/skills-codex/paper-write/templates/iclr2026.tex +84 -0
  258. package/skills/skills-codex/paper-write/templates/iclr2026_conference.bst +1440 -0
  259. package/skills/skills-codex/paper-write/templates/iclr2026_conference.sty +246 -0
  260. package/skills/skills-codex/paper-write/templates/icml2026.sty +767 -0
  261. package/skills/skills-codex/paper-write/templates/icml2026.tex +662 -0
  262. package/skills/skills-codex/paper-write/templates/ieee_conference.tex +89 -0
  263. package/skills/skills-codex/paper-write/templates/ieee_journal.tex +93 -0
  264. package/skills/skills-codex/paper-write/templates/math_commands.tex +48 -0
  265. package/skills/skills-codex/paper-write/templates/neurips2026.tex +493 -0
  266. package/skills/skills-codex/paper-write/templates/neurips_2026.sty +437 -0
  267. package/skills/skills-codex/paper-writing/SKILL.md +731 -0
  268. package/skills/skills-codex/patent-novelty-check/SKILL.md +153 -0
  269. package/skills/skills-codex/patent-pipeline/SKILL.md +344 -0
  270. package/skills/skills-codex/patent-review/SKILL.md +202 -0
  271. package/skills/skills-codex/pixel-art/SKILL.md +139 -0
  272. package/skills/skills-codex/prior-art-search/SKILL.md +146 -0
  273. package/skills/skills-codex/proof-checker/SKILL.md +554 -0
  274. package/skills/skills-codex/proof-orchestrator/SKILL.md +260 -0
  275. package/skills/skills-codex/proof-orchestrator/references/audit-output-contract.md +126 -0
  276. package/skills/skills-codex/proof-orchestrator/references/deepseek-routing.md +76 -0
  277. package/skills/skills-codex/proof-orchestrator/references/dispatch-prompts.md +227 -0
  278. package/skills/skills-codex/proof-orchestrator/references/notation-audit.md +135 -0
  279. package/skills/skills-codex/proof-orchestrator/references/proof-audit-rubric.md +70 -0
  280. package/skills/skills-codex/proof-orchestrator/references/stress-tests.md +38 -0
  281. package/skills/skills-codex/proof-writer/SKILL.md +222 -0
  282. package/skills/skills-codex/qzcli/SKILL.md +324 -0
  283. package/skills/skills-codex/rebuttal/SKILL.md +305 -0
  284. package/skills/skills-codex/render-html/SKILL.md +305 -0
  285. package/skills/skills-codex/render-html/scripts/__pycache__/render_html.cpython-314.pyc +0 -0
  286. package/skills/skills-codex/render-html/scripts/render_html.py +909 -0
  287. package/skills/skills-codex/render-html/scripts/templates/academic.html +342 -0
  288. package/skills/skills-codex/render-html/scripts/templates/dashboard.html +333 -0
  289. package/skills/skills-codex/research-lit/SKILL.md +464 -0
  290. package/skills/skills-codex/research-pipeline/SKILL.md +340 -0
  291. package/skills/skills-codex/research-refine/SKILL.md +721 -0
  292. package/skills/skills-codex/research-refine-pipeline/SKILL.md +186 -0
  293. package/skills/skills-codex/research-review/SKILL.md +135 -0
  294. package/skills/skills-codex/research-wiki/SKILL.md +421 -0
  295. package/skills/skills-codex/resubmit-pipeline/SKILL.md +444 -0
  296. package/skills/skills-codex/result-to-claim/SKILL.md +246 -0
  297. package/skills/skills-codex/run-experiment/SKILL.md +236 -0
  298. package/skills/skills-codex/semantic-scholar/SKILL.md +219 -0
  299. package/skills/skills-codex/serverless-modal/SKILL.md +335 -0
  300. package/skills/skills-codex/shared-references/acceptance-gate.md +336 -0
  301. package/skills/skills-codex/shared-references/assurance-contract.md +139 -0
  302. package/skills/skills-codex/shared-references/capture-antipatterns.md +84 -0
  303. package/skills/skills-codex/shared-references/citation-discipline.md +452 -0
  304. package/skills/skills-codex/shared-references/compute-env-contract.md +163 -0
  305. package/skills/skills-codex/shared-references/effort-contract.md +143 -0
  306. package/skills/skills-codex/shared-references/evidence-precheck.md +73 -0
  307. package/skills/skills-codex/shared-references/experiment-integrity.md +49 -0
  308. package/skills/skills-codex/shared-references/external-cadence.md +334 -0
  309. package/skills/skills-codex/shared-references/fan-out-pattern.md +375 -0
  310. package/skills/skills-codex/shared-references/injection-hygiene.md +132 -0
  311. package/skills/skills-codex/shared-references/integration-contract.md +372 -0
  312. package/skills/skills-codex/shared-references/output-composition.md +98 -0
  313. package/skills/skills-codex/shared-references/output-language.md +45 -0
  314. package/skills/skills-codex/shared-references/output-manifest.md +40 -0
  315. package/skills/skills-codex/shared-references/output-versioning.md +111 -0
  316. package/skills/skills-codex/shared-references/patent-format-cn.md +199 -0
  317. package/skills/skills-codex/shared-references/patent-format-ep.md +173 -0
  318. package/skills/skills-codex/shared-references/patent-format-us.md +161 -0
  319. package/skills/skills-codex/shared-references/patent-writing-principles.md +197 -0
  320. package/skills/skills-codex/shared-references/prior-art-databases.md +141 -0
  321. package/skills/skills-codex/shared-references/resumable-runs.md +125 -0
  322. package/skills/skills-codex/shared-references/review-scope-limits.md +81 -0
  323. package/skills/skills-codex/shared-references/review-tracing.md +144 -0
  324. package/skills/skills-codex/shared-references/reviewer-independence.md +66 -0
  325. package/skills/skills-codex/shared-references/reviewer-routing.md +128 -0
  326. package/skills/skills-codex/shared-references/skill-governance.md +119 -0
  327. package/skills/skills-codex/shared-references/taste-calibration.md +90 -0
  328. package/skills/skills-codex/shared-references/venue-checklists.md +73 -0
  329. package/skills/skills-codex/shared-references/wiki-helper-resolution.md +69 -0
  330. package/skills/skills-codex/shared-references/writing-principles.md +525 -0
  331. package/skills/skills-codex/slides-polish/SKILL.md +563 -0
  332. package/skills/skills-codex/specification-writing/SKILL.md +211 -0
  333. package/skills/skills-codex/system-profile/SKILL.md +103 -0
  334. package/skills/skills-codex/training-check/SKILL.md +83 -0
  335. package/skills/skills-codex/vast-gpu/SKILL.md +394 -0
  336. package/skills/skills-codex/web-debug-search/SKILL.md +334 -0
  337. package/skills/skills-codex/wiki-enrich/SKILL.md +255 -0
  338. package/skills/skills-codex/writing-systems-papers/SKILL.md +184 -0
  339. package/skills/skills-codex-claude-review/README.md +79 -0
  340. package/skills/skills-codex-claude-review/README_CN.md +78 -0
  341. package/skills/skills-codex-claude-review/auto-paper-improvement-loop/SKILL.md +581 -0
  342. package/skills/skills-codex-claude-review/auto-review-loop/SKILL.md +510 -0
  343. package/skills/skills-codex-claude-review/novelty-check/SKILL.md +102 -0
  344. package/skills/skills-codex-claude-review/paper-figure/SKILL.md +319 -0
  345. package/skills/skills-codex-claude-review/paper-plan/SKILL.md +287 -0
  346. package/skills/skills-codex-claude-review/paper-write/SKILL.md +420 -0
  347. package/skills/skills-codex-claude-review/research-refine/SKILL.md +732 -0
  348. package/skills/skills-codex-claude-review/research-review/SKILL.md +149 -0
  349. package/skills/skills-codex-gemini-review/README.md +176 -0
  350. package/skills/skills-codex-gemini-review/README_CN.md +175 -0
  351. package/skills/skills-codex-gemini-review/auto-paper-improvement-loop/SKILL.md +331 -0
  352. package/skills/skills-codex-gemini-review/auto-review-loop/SKILL.md +304 -0
  353. package/skills/skills-codex-gemini-review/grant-proposal/SKILL.md +630 -0
  354. package/skills/skills-codex-gemini-review/idea-creator/SKILL.md +263 -0
  355. package/skills/skills-codex-gemini-review/idea-discovery/SKILL.md +275 -0
  356. package/skills/skills-codex-gemini-review/idea-discovery-robot/SKILL.md +365 -0
  357. package/skills/skills-codex-gemini-review/novelty-check/SKILL.md +92 -0
  358. package/skills/skills-codex-gemini-review/paper-figure/SKILL.md +289 -0
  359. package/skills/skills-codex-gemini-review/paper-plan/SKILL.md +265 -0
  360. package/skills/skills-codex-gemini-review/paper-poster-html/SKILL.md +102 -0
  361. package/skills/skills-codex-gemini-review/paper-slides/SKILL.md +582 -0
  362. package/skills/skills-codex-gemini-review/paper-write/SKILL.md +346 -0
  363. package/skills/skills-codex-gemini-review/paper-writing/SKILL.md +312 -0
  364. package/skills/skills-codex-gemini-review/research-refine/SKILL.md +674 -0
  365. package/skills/skills-codex-gemini-review/research-review/SKILL.md +112 -0
  366. package/skills/slides-polish/SKILL.md +565 -0
  367. package/skills/specification-writing/SKILL.md +211 -0
  368. package/skills/system-profile/SKILL.md +103 -0
  369. package/skills/training-check/SKILL.md +132 -0
  370. package/skills/vast-gpu/SKILL.md +394 -0
  371. package/skills/web-debug-search/SKILL.md +334 -0
  372. package/skills/wiki-enrich/SKILL.md +257 -0
  373. package/skills/writing-systems-papers/SKILL.md +184 -0
  374. package/templates/CLAUDE_MD_TEMPLATE.md +29 -0
  375. package/templates/EXPERIMENT_LOG_TEMPLATE.md +47 -0
  376. package/templates/EXPERIMENT_PLAN_TEMPLATE.md +51 -0
  377. package/templates/EXPERIMENT_PLAN_TEMPLATE_CN.md +53 -0
  378. package/templates/FINDINGS_TEMPLATE.md +52 -0
  379. package/templates/IDEA_CANDIDATES_TEMPLATE.md +47 -0
  380. package/templates/IDEA_CANDIDATES_TEMPLATE_CN.md +47 -0
  381. package/templates/INVENTION_BRIEF_TEMPLATE.md +87 -0
  382. package/templates/MANIFEST_TEMPLATE.md +7 -0
  383. package/templates/NARRATIVE_REPORT_TEMPLATE.md +49 -0
  384. package/templates/PAPER_PLAN_TEMPLATE.md +47 -0
  385. package/templates/PATENT_CLAIMS_TEMPLATE.md +78 -0
  386. package/templates/PATENT_SPECIFICATION_TEMPLATE.md +68 -0
  387. package/templates/README.md +57 -0
  388. package/templates/RESEARCH_BRIEF_TEMPLATE.md +35 -0
  389. package/templates/RESEARCH_BRIEF_TEMPLATE_CN.md +41 -0
  390. package/templates/RESEARCH_CONTRACT_TEMPLATE.md +60 -0
  391. package/templates/claude-hooks/corpus_write_guard.json +16 -0
  392. package/templates/claude-hooks/corpus_write_guard.py +85 -0
  393. package/templates/claude-hooks/meta_logging.json +74 -0
  394. package/templates/gitignore-trace.txt +3 -0
  395. package/tools/__pycache__/check_skills_inventory.cpython-314.pyc +0 -0
  396. package/tools/arxiv_fetch.py +311 -0
  397. package/tools/capture_filter.py +126 -0
  398. package/tools/check_skills_inventory.py +273 -0
  399. package/tools/convert_skills_to_llm_chat.py +282 -0
  400. package/tools/copilot_native_evidence.py +818 -0
  401. package/tools/deepxiv_fetch.py +213 -0
  402. package/tools/evidence_check.py +212 -0
  403. package/tools/exa_search.py +425 -0
  404. package/tools/experiment_queue/README.md +118 -0
  405. package/tools/experiment_queue/build_manifest.py +44 -0
  406. package/tools/experiment_queue/queue_manager.py +44 -0
  407. package/tools/extract_paper_style.py +560 -0
  408. package/tools/figure_renderer.py +69 -0
  409. package/tools/forensics_gate.py +669 -0
  410. package/tools/generate_codex_claude_review_overrides.py +299 -0
  411. package/tools/idea_discovery_gate.py +256 -0
  412. package/tools/install_aris.ps1 +1372 -0
  413. package/tools/install_aris.sh +1370 -0
  414. package/tools/install_aris_codex.sh +1023 -0
  415. package/tools/install_aris_copilot.sh +1052 -0
  416. package/tools/iteration_log.py +143 -0
  417. package/tools/lint_skills_helpers.sh +84 -0
  418. package/tools/meta_opt/check_ready.sh +80 -0
  419. package/tools/meta_opt/log_event.sh +91 -0
  420. package/tools/meta_opt/trigger_eval.py +280 -0
  421. package/tools/meta_opt/trigger_evals.sample.json +28 -0
  422. package/tools/openalex_fetch.py +326 -0
  423. package/tools/overleaf_audit.sh +104 -0
  424. package/tools/overleaf_setup.sh +150 -0
  425. package/tools/paper_illustration_image2.py +62 -0
  426. package/tools/provenance.py +294 -0
  427. package/tools/research_wiki.py +1720 -0
  428. package/tools/review_gate.py +502 -0
  429. package/tools/run_state.py +399 -0
  430. package/tools/save_trace.sh +477 -0
  431. package/tools/semantic_scholar_fetch.py +438 -0
  432. package/tools/skill-groups.tsv +116 -0
  433. package/tools/skill_picker.py +238 -0
  434. package/tools/smart_update.ps1 +521 -0
  435. package/tools/smart_update.sh +591 -0
  436. package/tools/smart_update_codex.sh +419 -0
  437. package/tools/smart_update_copilot.sh +605 -0
  438. package/tools/threat_scan.py +222 -0
  439. package/tools/verify_paper_audits.sh +487 -0
  440. package/tools/verify_papers.py +613 -0
  441. package/tools/verify_wiki_coverage.sh +176 -0
  442. package/tools/watchdog.py +485 -0
@@ -0,0 +1,273 @@
1
+ #!/usr/bin/env python3
2
+ """Check ARIS skill inventory drift across mainline, Codex mirror, and docs."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import re
7
+ import sys
8
+ from pathlib import Path
9
+
10
+
11
+ REPO_ROOT = Path(__file__).resolve().parents[1]
12
+ SKILLS_ROOT = REPO_ROOT / "skills"
13
+ CODEX_ROOT = SKILLS_ROOT / "skills-codex"
14
+ CATALOG = REPO_ROOT / "docs" / "SKILLS_CATALOG.md"
15
+ README = REPO_ROOT / "README.md"
16
+ README_CN = REPO_ROOT / "README_CN.md"
17
+ AGENT_GUIDE = REPO_ROOT / "AGENT_GUIDE.md"
18
+ ARIS_INTRO = REPO_ROOT / "docs" / "ARIS_INTRO.md"
19
+ ARIS_INTRO_HTML = REPO_ROOT / "docs" / "ARIS_INTRO.html"
20
+ CODEX_README = CODEX_ROOT / "README.md"
21
+ CODEX_README_CN = CODEX_ROOT / "README_CN.md"
22
+ BOM = b"\xef\xbb\xbf"
23
+
24
+ FORBIDDEN_CODEX_REVIEWER_STRINGS = (
25
+ "mcp__codex__codex",
26
+ "codex-reply",
27
+ "reviewer-continuation",
28
+ "threadId",
29
+ )
30
+
31
+ # Phase A (issue #240): cross-language anchor IDs that MUST exist as
32
+ # explicit `<a id="..."></a>` in both README.md and README_CN.md so that
33
+ # cross-language hyperlinks resolve identically. Adding a new numbered
34
+ # section means adding it to both READMEs AND extending this list.
35
+ REQUIRED_README_ANCHORS = (
36
+ "contents",
37
+ "more-than-just-a-prompt",
38
+ "whats-new",
39
+ "quick-start",
40
+ "features",
41
+ "score-progression",
42
+ "community-showcase",
43
+ "awesome-community-skills",
44
+ "workflows",
45
+ "skills-catalog",
46
+ "setup",
47
+ "customization",
48
+ "alternative-model-combinations",
49
+ "community",
50
+ "citation",
51
+ "star-history",
52
+ "acknowledgements",
53
+ "license",
54
+ "prerequisites",
55
+ "install-skills",
56
+ "gpu-server-setup",
57
+ "alt-a-glm--gpt",
58
+ "-optional-gpt-54-pro-via-oracle",
59
+ "-research-wiki--persistent-research-memory",
60
+ )
61
+
62
+
63
+ def skill_names(root: Path) -> set[str]:
64
+ return {path.parent.name for path in root.glob("*/SKILL.md")}
65
+
66
+
67
+ def allowed_tools(text: str) -> list[str]:
68
+ """Tokens on the frontmatter `allowed-tools:` line (empty if absent)."""
69
+ match = re.search(r"^allowed-tools:\s*(.+)$", text, flags=re.MULTILINE)
70
+ if not match:
71
+ return []
72
+ return [tok.strip() for tok in match.group(1).split(",") if tok.strip()]
73
+
74
+
75
+ def frontmatter_split(text: str) -> str:
76
+ """Return the body after a leading YAML frontmatter block (whole text if
77
+ no frontmatter). Anchors on the opening `---` fence and the first closing
78
+ `---` fence, so `---` horizontal rules later in the body are not mistaken
79
+ for the frontmatter boundary."""
80
+ match = re.match(r"^---\n.*?\n---\n", text, flags=re.DOTALL)
81
+ return text[match.end():] if match else text
82
+
83
+
84
+ def readme_anchors(text: str) -> set[str]:
85
+ return set(re.findall(r'<a id="([^"]+)"></a>', text))
86
+
87
+
88
+ def numbered_h2_count(text: str) -> int:
89
+ return len(re.findall(r"^## \d+\.\s", text, flags=re.MULTILINE))
90
+
91
+
92
+ def read(path: Path) -> str:
93
+ return path.read_text(encoding="utf-8")
94
+
95
+
96
+ def catalog_names() -> set[str]:
97
+ text = read(CATALOG)
98
+ return set(re.findall(r"\[`/([^`]+)`\]\(\.\./skills/[^)]+/SKILL\.md\)", text))
99
+
100
+
101
+ def require(condition: bool, message: str, failures: list[str]) -> None:
102
+ if not condition:
103
+ failures.append(message)
104
+
105
+
106
+ def require_count(path: Path, text: str, pattern: str, expected_count: int, failures: list[str]) -> None:
107
+ match = re.search(pattern, text)
108
+ rel = path.relative_to(REPO_ROOT)
109
+ if match is None:
110
+ failures.append(f"{rel} is missing live count pattern: {pattern}")
111
+ return
112
+ actual = int(match.group("count"))
113
+ if actual != expected_count:
114
+ failures.append(f"{rel} reports {actual} skills; expected {expected_count}")
115
+
116
+
117
+ def check_inventory() -> list[str]:
118
+ failures: list[str] = []
119
+ main = skill_names(SKILLS_ROOT)
120
+ codex = skill_names(CODEX_ROOT)
121
+ catalog = catalog_names()
122
+ main_refs = {path.name for path in (SKILLS_ROOT / "shared-references").glob("*.md")}
123
+ codex_refs = {path.name for path in (CODEX_ROOT / "shared-references").glob("*.md")}
124
+
125
+ missing_codex = sorted(main - codex)
126
+ extra_codex = sorted(codex - main)
127
+ missing_catalog = sorted(main - catalog)
128
+ extra_catalog = sorted(catalog - main)
129
+
130
+ require(not missing_codex, f"missing Codex mirrors: {', '.join(missing_codex)}", failures)
131
+ require(not extra_codex, f"unexpected Codex-only skills: {', '.join(extra_codex)}", failures)
132
+ require(
133
+ not (main_refs - codex_refs),
134
+ f"missing Codex shared references: {', '.join(sorted(main_refs - codex_refs))}",
135
+ failures,
136
+ )
137
+ require(
138
+ not (codex_refs - main_refs),
139
+ f"unexpected Codex-only shared references: {', '.join(sorted(codex_refs - main_refs))}",
140
+ failures,
141
+ )
142
+ require(not missing_catalog, f"missing catalog entries: {', '.join(missing_catalog)}", failures)
143
+ require(not extra_catalog, f"catalog entries without mainline skills: {', '.join(extra_catalog)}", failures)
144
+
145
+ catalog_text = read(CATALOG)
146
+ readme = read(README)
147
+ readme_cn = read(README_CN)
148
+ agent_guide = read(AGENT_GUIDE)
149
+ aris_intro = read(ARIS_INTRO)
150
+ aris_intro_html = read(ARIS_INTRO_HTML)
151
+ codex_readme = read(CODEX_README)
152
+ codex_readme_cn = read(CODEX_README_CN)
153
+
154
+ expected_count = len(main)
155
+ count_checks = [
156
+ (CATALOG, catalog_text, r"\*\*(?P<count>\d+) skills\*\*"),
157
+ (AGENT_GUIDE, agent_guide, r"Full catalog.*?\*\*(?P<count>\d+) skills\*\*"),
158
+ (ARIS_INTRO, aris_intro, r"collection of \*\*(?P<count>\d+) composable Claude Code skills\*\*"),
159
+ (ARIS_INTRO, aris_intro, r"## The (?P<count>\d+) Skills"),
160
+ (ARIS_INTRO, aris_intro, r"一组 (?P<count>\d+) 个可组合的 Claude Code skills"),
161
+ (ARIS_INTRO_HTML, aris_intro_html, r"collection of <strong>(?P<count>\d+) composable Claude Code skills</strong>"),
162
+ (ARIS_INTRO_HTML, aris_intro_html, r'id="the-(?P<count>\d+)-skills"'),
163
+ (ARIS_INTRO_HTML, aris_intro_html, r"一组 (?P<count>\d+) 个可组合的 Claude Code skills"),
164
+ (CODEX_README, codex_readme, r"all `(?P<count>\d+)` mainline skills"),
165
+ (CODEX_README_CN, codex_readme_cn, r"`(?P<count>\d+)`[^\n]*skill"),
166
+ ]
167
+ for path, text, pattern in count_checks:
168
+ require_count(path, text, pattern, expected_count, failures)
169
+
170
+ for skill_file in sorted(CODEX_ROOT.glob("*/SKILL.md")):
171
+ if skill_file.read_bytes().startswith(BOM):
172
+ failures.append(f"{skill_file.relative_to(REPO_ROOT)} starts with UTF-8 BOM before frontmatter")
173
+ text = read(skill_file)
174
+ for forbidden in FORBIDDEN_CODEX_REVIEWER_STRINGS:
175
+ if forbidden in text:
176
+ failures.append(f"{skill_file.relative_to(REPO_ROOT)} contains forbidden reviewer string: {forbidden}")
177
+
178
+ # Root READMEs on this distribution branch are the dsh ones and carry no
179
+ # skill counts, anchors, or numbered sections; the full-ARIS README checks
180
+ # live on main.
181
+
182
+ # Agent-grant hygiene (WB2): `Agent` in allowed-tools is the Tier-2
183
+ # fan-out capability gate. Per shared-references/fan-out-pattern.md it is
184
+ # granted ONLY to skills that actually fan out, and such skills MUST cite
185
+ # the convention doc in their body. A grant without that citation is a
186
+ # vestigial/boilerplate grant and fails the drift check.
187
+ for skill_file in sorted(SKILLS_ROOT.glob("*/SKILL.md")):
188
+ text = read(skill_file)
189
+ if "Agent" not in allowed_tools(text):
190
+ continue
191
+ if "fan-out-pattern.md" not in frontmatter_split(text):
192
+ rel = skill_file.relative_to(REPO_ROOT)
193
+ failures.append(
194
+ f"{rel} grants `Agent` in allowed-tools but its body does not "
195
+ f"cite fan-out-pattern.md — vestigial grant or undocumented "
196
+ f"fan-out (see shared-references/fan-out-pattern.md)"
197
+ )
198
+
199
+ # Watchdog 'loop' task type ⇔ its documented trigger (A2). Mirrors the Agent-grant⇒cite
200
+ # rule above: a feature with no documented trigger is dead weight, a documented trigger
201
+ # for a missing feature is a broken pointer. The loop type is a shipped feature, so BOTH
202
+ # must be present.
203
+ watchdog_py = read(REPO_ROOT / "tools" / "watchdog.py")
204
+ ext_cadence = read(SKILLS_ROOT / "shared-references" / "external-cadence.md")
205
+ tool_loop = bool(re.search(r"def check_loop\b", watchdog_py)) and bool(re.search(r'==\s*"loop"', watchdog_py))
206
+ doc_loop = bool(re.search(r'"type"\s*:\s*"loop"', ext_cadence))
207
+ require(tool_loop, "tools/watchdog.py must implement the loop-liveness check_loop (A2)", failures)
208
+ require(doc_loop, "external-cadence.md must document registering a watchdog 'loop' task — its trigger (A2)", failures)
209
+
210
+ # iteration_log.py (stall→pivot, B) must exist AND be both documented (the ladder with
211
+ # both thresholds) and actually wired into a heartbeat consumer — else it is dead code.
212
+ # Same dead-code guard as the Agent-grant⇒cite rule above.
213
+ extc = read(SKILLS_ROOT / "shared-references" / "external-cadence.md")
214
+ rp = read(SKILLS_ROOT / "research-pipeline" / "SKILL.md")
215
+ tool_stall = (REPO_ROOT / "tools" / "iteration_log.py").is_file()
216
+ doc_ladder = bool(re.search(r"forced structural pivot", extc, re.IGNORECASE)) and \
217
+ bool(re.search(r"stale_count`?\s*>=\s*2", extc)) and bool(re.search(r"stale_count`?\s*>=\s*4", extc))
218
+ # Prove the wiring is real (not a prose mention): resolver chain + note invocation +
219
+ # both pivot branches handled in research-pipeline.
220
+ wired = ('iteration_log.py' in rp and 'ITER_LOG' in rp
221
+ and re.search(r'"\$ITER_LOG"\s+note', rp) is not None
222
+ and 'pivot' in rp and 'structural' in rp and 'human' in rp)
223
+ require(tool_stall, "tools/iteration_log.py (stall→pivot, B) must exist", failures)
224
+ require(doc_ladder, "external-cadence.md must document the stall ladder with both thresholds (>=2 structural, >=4 human) (B)", failures)
225
+ require(wired, "research-pipeline/SKILL.md must actually wire iteration_log.py (resolver + `$ITER_LOG note` + pivot handling) — not just mention it (B)", failures)
226
+
227
+ # research_wiki.py add_claim (claim layer) ⇔ its documented birth trigger in
228
+ # /proof-checker. add_claim is a writer; without a skill that calls it, the claim
229
+ # layer is dead code (the exact orphan-writer trap). Same dead-code guard as above:
230
+ # the writer and its single birth point must BOTH be present.
231
+ rwiki = read(REPO_ROOT / "tools" / "research_wiki.py")
232
+ pchk = read(SKILLS_ROOT / "proof-checker" / "SKILL.md")
233
+ tool_claim = bool(re.search(r"def add_claim\b", rwiki)) and bool(re.search(r'add_parser\("add_claim"', rwiki))
234
+ # Prove the trigger is real (anchored to the actual command line, not a prose
235
+ # mention or comment): proof-checker must literally invoke the resolved helper.
236
+ born = re.search(r'python3\s+"\$WIKI_SCRIPT"\s+add_claim\b', pchk) is not None
237
+ require(tool_claim, "tools/research_wiki.py must implement the add_claim claim-layer writer + its CLI", failures)
238
+ require(born, "proof-checker/SKILL.md must invoke `add_claim` as the claim birth point — not just mention it (else add_claim is an orphan writer)", failures)
239
+
240
+ # research_wiki.py upsert_idea (idea layer) ⇔ its documented write-back in
241
+ # /idea-creator Phase 7. Same orphan-writer guard: the deterministic idea writer
242
+ # and the skill that calls it must BOTH be present, anchored to the real command.
243
+ icreator = read(SKILLS_ROOT / "idea-creator" / "SKILL.md")
244
+ tool_idea = bool(re.search(r"def upsert_idea\b", rwiki)) and bool(re.search(r'add_parser\("upsert_idea"', rwiki))
245
+ idea_written = re.search(r'python3\s+"\$WIKI_SCRIPT"\s+upsert_idea\b', icreator) is not None
246
+ require(tool_idea, "tools/research_wiki.py must implement the upsert_idea idea-layer writer + its CLI", failures)
247
+ require(idea_written, "idea-creator/SKILL.md must invoke `upsert_idea` to record ideas (Phase 7) — not just mention it (else ideas are written freehand and skipped on re-gen)", failures)
248
+
249
+ # research_wiki.py add_experiment (experiment layer) ⇔ its write-back in
250
+ # /result-to-claim Step 5. Same orphan-writer guard; closes the last freehand
251
+ # wiki layer so the supports/invalidates edges never dangle off a missing exp node.
252
+ r2c = read(SKILLS_ROOT / "result-to-claim" / "SKILL.md")
253
+ tool_exp = bool(re.search(r"def add_experiment\b", rwiki)) and bool(re.search(r'add_parser\("add_experiment"', rwiki))
254
+ exp_written = re.search(r'python3\s+"\$WIKI_SCRIPT"\s+add_experiment\b', r2c) is not None
255
+ require(tool_exp, "tools/research_wiki.py must implement the add_experiment experiment-layer writer + its CLI", failures)
256
+ require(exp_written, "result-to-claim/SKILL.md must invoke `add_experiment` to create the experiment node (Step 5) — not just mention it (else exp pages are freehand and supports/invalidates edges dangle)", failures)
257
+
258
+ return failures
259
+
260
+
261
+ def main() -> int:
262
+ failures = check_inventory()
263
+ if failures:
264
+ print("ARIS skill inventory drift detected:", file=sys.stderr)
265
+ for failure in failures:
266
+ print(f"- {failure}", file=sys.stderr)
267
+ return 1
268
+ print("ARIS skill inventory is consistent.")
269
+ return 0
270
+
271
+
272
+ if __name__ == "__main__":
273
+ raise SystemExit(main())
@@ -0,0 +1,282 @@
1
+ #!/usr/bin/env python3
2
+ """Convert Codex-native skills to llm-chat MCP compatible versions.
3
+
4
+ Reads skills from a source directory, replaces all mcp__codex__codex and
5
+ mcp__codex__codex-reply references with mcp__llm-chat__chat, removes
6
+ Codex-specific parameters, and writes the converted files to a target
7
+ directory. Works on Windows, macOS, and Linux.
8
+
9
+ Usage:
10
+ # Convert all skills to ~/.claude/skills/
11
+ python convert_skills_to_llm_chat.py
12
+
13
+ # Custom source and target
14
+ python convert_skills_to_llm_chat.py --source ./skills --target ./skills-llm-chat
15
+
16
+ # Preview changes without writing files
17
+ python convert_skills_to_llm_chat.py --dry-run
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ import argparse
23
+ import re
24
+ import shutil
25
+ import sys
26
+ from pathlib import Path
27
+
28
+
29
+ # ── Codex → llm-chat text replacements ──────────────────────────────────
30
+
31
+ # Tool name replacements
32
+ REPLACEMENTS_TEXT: list[tuple[str, str]] = [
33
+ # Tool names
34
+ ("mcp__codex__codex-reply", "mcp__llm-chat__chat"),
35
+ ("mcp__codex__codex", "mcp__llm-chat__chat"),
36
+ # Description text
37
+ ("Always pin `model: gpt-5.6-sol` + `config: {\"model_reasoning_effort\": \"ultra\"}` (deep-audit tier).",
38
+ "Ask the LLM reviewer for its strictest, deepest review (deep-audit tier)."),
39
+ ("for new review threads\n (`model: gpt-5.6-sol`, `config: {\"model_reasoning_effort\": \"ultra\"}`).",
40
+ "for new review threads."),
41
+ ("`model: gpt-5.6-sol`, `reasoning: ultra`", "the configured `LLM_MODEL`, deepest available reasoning"),
42
+ ("- **ALWAYS use `config: {\"model_reasoning_effort\": \"xhigh\"}`** for all Codex review calls.",
43
+ "- **Always ask the LLM reviewer for strict, high-rigor feedback** in every review round."),
44
+ ("ALWAYS pin `model: gpt-5.6-sol` + `config: {\"model_reasoning_effort\": \"ultra\"}` for reviews (deep-audit tier; capability fallback per `reviewer-routing.md`, never below `xhigh`)",
45
+ "ALWAYS ask the LLM reviewer for strict, maximum-depth review"),
46
+ ("Always use `model_reasoning_effort: \"xhigh\"` for maximum analysis depth.",
47
+ "Always ask the LLM reviewer for maximum analysis depth."),
48
+ ("(`gpt-5.6-sol` via Codex MCP)", "(via llm-chat MCP)"),
49
+ ("override the default reviewer (`gpt-5.6-sol`)", "override the default reviewer"),
50
+ ("via GPT-5.6-Sol xhigh review", "via llm-chat MCP review"),
51
+ ("via GPT-5.6-Sol ultra review", "via llm-chat MCP review"),
52
+ ("GPT-5.6-Sol xhigh", "LLM reviewer"),
53
+ ("GPT-5.6-Sol ultra", "LLM reviewer"),
54
+ ("via GPT-5.5 xhigh review", "via llm-chat MCP review"),
55
+ ("GPT-5.5 xhigh", "LLM reviewer"),
56
+ ("a second Codex agent", "an LLM via llm-chat MCP"),
57
+ ("secondary Codex agent", "LLM reviewer via llm-chat MCP"),
58
+ ("Codex agent", "LLM reviewer"),
59
+ ("- ALWAYS use `config: {\"model_reasoning_effort\": \"xhigh\"}` for maximum reasoning depth",
60
+ "- ALWAYS ask the LLM reviewer for maximum reasoning depth"),
61
+ ("pin `model: gpt-5.6-sol` + `config: {\"model_reasoning_effort\": \"xhigh\"}` per `../shared-references/reviewer-routing.md`",
62
+ "ask for strict, high-rigor review"),
63
+ ("pin `model: gpt-5.6-sol` + `config: {\"model_reasoning_effort\": \"ultra\"}` (deep-audit tier)",
64
+ "ask for strict, maximum-depth review"),
65
+ ("with `model: gpt-5.6-sol`, `config: {model_reasoning_effort: xhigh}`, `sandbox: read-only`, fresh thread",
66
+ "with a fresh thread"),
67
+ ("with `model: gpt-5.6-sol`, `config: {model_reasoning_effort: ultra}`, `sandbox: read-only`, fresh thread",
68
+ "with a fresh thread"),
69
+ ("model_reasoning_effort: \"ultra\"", "# (reasoning effort not supported by llm-chat)"),
70
+ ("model_reasoning_effort: \"xhigh\"", "# (reasoning effort not supported by llm-chat)"),
71
+ ("model_reasoning_effort: ultra", "# (reasoning effort not supported by llm-chat)"),
72
+ ("model_reasoning_effort: xhigh", "# (reasoning effort not supported by llm-chat)"),
73
+ ("reasoning_effort: ultra", "# (reasoning effort not supported by llm-chat)"),
74
+ ("reasoning_effort: xhigh", "# (reasoning effort not supported by llm-chat)"),
75
+ ("reasoning_effort: high", "# (reasoning effort not supported by llm-chat)"),
76
+ ]
77
+
78
+ # Regex patterns for structural changes
79
+ CONFIG_LINE_RE = re.compile(
80
+ r'^(\s*)(?:- )?`?config`?:\s*\{[^}]*model_reasoning_effort[^}]*\}`?\s*$',
81
+ re.MULTILINE,
82
+ )
83
+ MODEL_LINE_RE = re.compile(
84
+ r'^(\s*)(?:- )?`?"?model"?`?:\s*(?:["\'`]?gpt-[^\s"\'`]+["\'`]?|REVIEWER_MODEL)\s*$',
85
+ re.MULTILINE,
86
+ )
87
+ THREAD_ID_LINE_RE = re.compile(
88
+ r'^(\s*)threadId:\s*\S+.*$',
89
+ re.MULTILINE,
90
+ )
91
+ APPROVAL_POLICY_LINE_RE = re.compile(
92
+ r'^(\s*)approval-policy:\s*\S+.*$',
93
+ re.MULTILINE,
94
+ )
95
+ SANDBOX_LINE_RE = re.compile(
96
+ r'^(\s*)sandbox:\s*\S+.*$',
97
+ re.MULTILINE,
98
+ )
99
+ BASE_INSTRUCTIONS_LINE_RE = re.compile(
100
+ r'^(\s*)base-instructions:\s*["\'].*$',
101
+ re.MULTILINE,
102
+ )
103
+ DEVELOPER_INSTRUCTIONS_LINE_RE = re.compile(
104
+ r'^(\s*)developer-instructions:\s*["\'].*$',
105
+ re.MULTILINE,
106
+ )
107
+ # Match "prompt:" as a parameter name under mcp tool blocks
108
+ PROMPT_PARAM_RE = re.compile(
109
+ r'^(\s*)prompt:\s*\|',
110
+ re.MULTILINE,
111
+ )
112
+
113
+
114
+ def convert_content(text: str) -> str:
115
+ """Apply all Codex → llm-chat conversions to skill content."""
116
+
117
+ # 1. Simple text replacements
118
+ for old, new in REPLACEMENTS_TEXT:
119
+ text = text.replace(old, new)
120
+
121
+ # 1b. Deduplicate mcp tool names in allowed-tools / tool references
122
+ text = re.sub(
123
+ r'(mcp__llm-chat__chat),\s*mcp__llm-chat__chat',
124
+ r'\1',
125
+ text,
126
+ )
127
+
128
+ # 2. Remove Codex-specific parameter lines
129
+ for pattern in (
130
+ CONFIG_LINE_RE,
131
+ MODEL_LINE_RE,
132
+ THREAD_ID_LINE_RE,
133
+ APPROVAL_POLICY_LINE_RE,
134
+ SANDBOX_LINE_RE,
135
+ BASE_INSTRUCTIONS_LINE_RE,
136
+ DEVELOPER_INSTRUCTIONS_LINE_RE,
137
+ ):
138
+ text = pattern.sub('', text)
139
+
140
+ # 3. Rename "prompt:" → "prompt:" (llm-chat uses "prompt" too based on auto-review-loop-llm)
141
+ # Actually llm-chat MCP accepts "prompt" as the main parameter, so no rename needed.
142
+ # The auto-review-loop-llm reference skill uses "prompt:" parameter name.
143
+
144
+ # 4. Add conversion note after YAML frontmatter if not already present
145
+ note = (
146
+ "\n> **llm-chat conversion**: This skill has been auto-converted from Codex to "
147
+ "use `mcp__llm-chat__chat`. Multi-turn conversations are handled as single-turn "
148
+ "calls with manual context inclusion.\n"
149
+ )
150
+ if "llm-chat conversion" not in text:
151
+ # Insert after frontmatter
152
+ fm_end = text.find("---", text.find("---") + 3)
153
+ if fm_end != -1:
154
+ fm_end = text.find("\n", fm_end + 3)
155
+ if fm_end != -1:
156
+ text = text[:fm_end + 1] + note + text[fm_end + 1:]
157
+
158
+ # 5. Clean up multiple blank lines from removed lines
159
+ text = re.sub(r'\n{3,}', '\n\n', text)
160
+
161
+ return text
162
+
163
+
164
+ def convert_file(src: Path, dst: Path) -> bool:
165
+ """Convert a single SKILL.md file. Returns True if changes were made."""
166
+ content = src.read_text(encoding="utf-8")
167
+ converted = convert_content(content)
168
+
169
+ if converted == content:
170
+ return False
171
+
172
+ dst.parent.mkdir(parents=True, exist_ok=True)
173
+ dst.write_text(converted, encoding="utf-8")
174
+ return True
175
+
176
+
177
+ def find_skills(source_dir: Path) -> list[Path]:
178
+ """Find all SKILL.md files under source_dir, excluding known variant dirs."""
179
+ skills = []
180
+ exclude_dirs = {
181
+ "skills-codex",
182
+ "skills-codex-claude-review",
183
+ "skills-codex-gemini-review",
184
+ }
185
+ for skill_md in sorted(source_dir.rglob("SKILL.md")):
186
+ # Skip variant skill directories
187
+ parts = skill_md.relative_to(source_dir).parts
188
+ if any(d in parts for d in exclude_dirs):
189
+ continue
190
+ # Skip skills that already use llm-chat
191
+ content = skill_md.read_text(encoding="utf-8")
192
+ if "mcp__llm-chat__chat" in content and "mcp__codex__codex" not in content:
193
+ continue
194
+ # Only include files that reference codex
195
+ if "mcp__codex__codex" not in content:
196
+ continue
197
+ skills.append(skill_md)
198
+ return skills
199
+
200
+
201
+ def main() -> None:
202
+ parser = argparse.ArgumentParser(
203
+ description="Convert Codex-native skills to llm-chat MCP compatible versions."
204
+ )
205
+ parser.add_argument(
206
+ "--source",
207
+ type=Path,
208
+ default=None,
209
+ help="Source directory containing skill folders (default: repo skills/)",
210
+ )
211
+ parser.add_argument(
212
+ "--target",
213
+ type=Path,
214
+ default=None,
215
+ help="Target directory for converted skills (default: source, in-place)",
216
+ )
217
+ parser.add_argument(
218
+ "--force-in-place",
219
+ action="store_true",
220
+ help="Allow in-place conversion of the repo's canonical skills/ tree (dangerous)",
221
+ )
222
+ parser.add_argument(
223
+ "--dry-run",
224
+ action="store_true",
225
+ help="Preview changes without writing files",
226
+ )
227
+ args = parser.parse_args()
228
+
229
+ # Default source: skills/ in the same repo as this script
230
+ repo_root = Path(__file__).resolve().parents[1]
231
+ source_dir = args.source or repo_root / "skills"
232
+ target_dir = args.target or source_dir # in-place by default
233
+
234
+ # Refuse to rewrite the repo's canonical skill tree in place — that destroys
235
+ # the Codex-native sources (this exact accident has happened). Convert INTO
236
+ # a separate --target, or pass --force-in-place if you really mean it.
237
+ canonical = (repo_root / "skills").resolve()
238
+ tgt = target_dir.resolve()
239
+ if (tgt == canonical or canonical in tgt.parents) \
240
+ and not args.dry_run and not args.force_in_place:
241
+ print("Error: refusing to convert the repo's canonical skills/ tree in place.")
242
+ print("Pass --target <dir> (recommended) or --force-in-place to override.")
243
+ sys.exit(1)
244
+
245
+ if not source_dir.exists():
246
+ print(f"Error: source directory not found: {source_dir}")
247
+ sys.exit(1)
248
+
249
+ skills = find_skills(source_dir)
250
+ if not skills:
251
+ print("No Codex-based skills found to convert.")
252
+ return
253
+
254
+ print(f"Found {len(skills)} skill(s) to convert:\n")
255
+
256
+ converted = 0
257
+ for skill_path in skills:
258
+ rel = skill_path.relative_to(source_dir)
259
+ dst = target_dir / rel
260
+
261
+ if args.dry_run:
262
+ content = skill_path.read_text(encoding="utf-8")
263
+ new_content = convert_content(content)
264
+ has_changes = content != new_content
265
+ status = "would convert" if has_changes else "no changes"
266
+ print(f" [DRY-RUN] {rel} — {status}")
267
+ if has_changes:
268
+ converted += 1
269
+ else:
270
+ if convert_file(skill_path, dst):
271
+ print(f" Converted: {rel}")
272
+ converted += 1
273
+ else:
274
+ print(f" No changes: {rel}")
275
+
276
+ print(f"\nDone: {converted}/{len(skills)} skill(s) converted.")
277
+ if args.dry_run:
278
+ print("(dry-run mode — no files were written)")
279
+
280
+
281
+ if __name__ == "__main__":
282
+ main()