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,28 @@
1
+ {
2
+ "_README": "Query set for trigger_eval.py. Keys are skill names; values are user-intent queries that SHOULD trigger that skill. RULE: paraphrase intent, never quote the skill's own trigger phrases verbatim β€” a query containing the literal description trigger string is trivially positive and measures nothing. Prefix a skill key with '_' to comment it out. For negative testing (measuring FALSE triggering), add queries under a skill that should NOT fire and read the confusion matrix in the report. This sample covers a few well-scoped skills; extend per the skill you're tuning.",
3
+ "check-gpu": [
4
+ "is anything running on the servers right now?",
5
+ "how busy are my remote machines?",
6
+ "which cards are free before I launch a job"
7
+ ],
8
+ "research-lit": [
9
+ "find me recent papers on this topic",
10
+ "what has been published about diffusion language models lately",
11
+ "pull together related work for my intro section"
12
+ ],
13
+ "novelty-check": [
14
+ "has anyone already done this idea?",
15
+ "is my approach actually new or is it in the literature already",
16
+ "check if this contribution is novel before I build it"
17
+ ],
18
+ "citation-audit": [
19
+ "make sure every reference in my paper is real and correctly attributed",
20
+ "verify the bibliography before submission",
21
+ "did I hallucinate any citations in this draft"
22
+ ],
23
+ "kill-argument": [
24
+ "what is the single strongest reason a reviewer would reject this paper",
25
+ "give me the harshest rebuttal my theory paper would face",
26
+ "simulate reviewer 2's most damaging objection"
27
+ ]
28
+ }
@@ -0,0 +1,326 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ OpenAlex API client for academic paper search.
4
+ Documentation: https://developers.openalex.org/
5
+ """
6
+
7
+ import argparse
8
+ import json
9
+ import sys
10
+ import os
11
+ from typing import List, Dict, Optional
12
+
13
+ try:
14
+ import requests
15
+ except ImportError:
16
+ print(
17
+ "OpenAlex requires the 'requests' package. "
18
+ "Install with: pip install requests",
19
+ file=sys.stderr,
20
+ )
21
+ # Exit code 2 signals "skip this source" to the calling skill,
22
+ # distinct from exit 1 used for runtime errors below.
23
+ sys.exit(2)
24
+
25
+
26
+ class OpenAlexClient:
27
+ BASE_URL = "https://api.openalex.org"
28
+
29
+ def __init__(self, api_key: Optional[str] = None, email: Optional[str] = None):
30
+ """
31
+ Initialize OpenAlex client.
32
+
33
+ Args:
34
+ api_key: Optional API key for higher rate limits
35
+ email: Optional email for polite pool (faster response)
36
+ """
37
+ self.api_key = api_key or os.environ.get("OPENALEX_API_KEY")
38
+ self.email = email or os.environ.get("OPENALEX_EMAIL")
39
+ self.session = requests.Session()
40
+
41
+ # Set user agent with email for polite pool
42
+ if self.email:
43
+ self.session.headers.update({
44
+ "User-Agent": f"mailto:{self.email}"
45
+ })
46
+
47
+ def search_works(
48
+ self,
49
+ query: str,
50
+ max_results: int = 10,
51
+ publication_year: Optional[str] = None,
52
+ work_type: Optional[str] = None,
53
+ open_access: Optional[bool] = None,
54
+ min_citations: Optional[int] = None,
55
+ sort: str = "relevance_score:desc",
56
+ fields: Optional[List[str]] = None
57
+ ) -> List[Dict]:
58
+ """
59
+ Search for academic works.
60
+
61
+ Args:
62
+ query: Search query string
63
+ max_results: Maximum number of results (default: 10)
64
+ publication_year: Year filter, e.g., "2023" or "2020-2023"
65
+ work_type: Type filter, e.g., "article", "preprint", "book"
66
+ open_access: Filter by open access status
67
+ min_citations: Minimum citation count
68
+ sort: Sort order (default: relevance_score:desc)
69
+ fields: Specific fields to return (default: all)
70
+
71
+ Returns:
72
+ List of work dictionaries
73
+ """
74
+ url = f"{self.BASE_URL}/works"
75
+
76
+ # Build filter string
77
+ filters = []
78
+ if publication_year:
79
+ filters.append(f"publication_year:{publication_year}")
80
+ if work_type:
81
+ filters.append(f"type:{work_type}")
82
+ if open_access is not None:
83
+ filters.append(f"is_oa:{str(open_access).lower()}")
84
+ if min_citations:
85
+ filters.append(f"cited_by_count:>{min_citations}")
86
+
87
+ params = {
88
+ "search": query,
89
+ "per_page": min(max_results, 200), # API max is 200
90
+ "sort": sort
91
+ }
92
+
93
+ if filters:
94
+ params["filter"] = ",".join(filters)
95
+
96
+ if self.api_key:
97
+ params["api_key"] = self.api_key
98
+
99
+ try:
100
+ response = self.session.get(url, params=params, timeout=30)
101
+ response.raise_for_status()
102
+ data = response.json()
103
+
104
+ results = []
105
+ for work in data.get("results", []):
106
+ results.append(self._parse_work(work))
107
+
108
+ return results[:max_results]
109
+
110
+ except requests.exceptions.HTTPError as e:
111
+ if e.response.status_code == 429:
112
+ print("Rate limit exceeded. Consider using an API key or reducing request frequency.", file=sys.stderr)
113
+ raise
114
+ except Exception as e:
115
+ print(f"Error fetching from OpenAlex: {e}", file=sys.stderr)
116
+ raise
117
+
118
+ def get_work(self, work_id: str) -> Dict:
119
+ """
120
+ Get a specific work by ID, DOI, or OpenAlex ID.
121
+
122
+ Args:
123
+ work_id: Work identifier (DOI, OpenAlex ID, etc.)
124
+
125
+ Returns:
126
+ Work dictionary
127
+ """
128
+ # Handle different ID formats
129
+ if work_id.startswith("10."): # DOI
130
+ url = f"{self.BASE_URL}/works/doi:{work_id}"
131
+ elif work_id.startswith("W"): # OpenAlex ID
132
+ url = f"{self.BASE_URL}/works/{work_id}"
133
+ else:
134
+ url = f"{self.BASE_URL}/works/{work_id}"
135
+
136
+ params = {}
137
+ if self.api_key:
138
+ params["api_key"] = self.api_key
139
+
140
+ response = self.session.get(url, params=params, timeout=30)
141
+ response.raise_for_status()
142
+
143
+ return self._parse_work(response.json())
144
+
145
+ def _parse_work(self, work: Dict) -> Dict:
146
+ """Parse OpenAlex work object into simplified format."""
147
+ # Extract authors
148
+ authors = []
149
+ for authorship in work.get("authorships", []):
150
+ author = authorship.get("author", {})
151
+ author_name = author.get("display_name", "Unknown")
152
+ authors.append(author_name)
153
+
154
+ # Extract venue/source β€” `or {}` because OpenAlex returns explicit null (not missing key) for some works
155
+ primary_location = work.get("primary_location") or {}
156
+ source = primary_location.get("source") or {}
157
+ venue = source.get("display_name", "Unknown")
158
+
159
+ # Extract open access info
160
+ oa_info = work.get("open_access") or {}
161
+ oa_status = oa_info.get("oa_status", "closed")
162
+ oa_url = oa_info.get("oa_url")
163
+
164
+ # Extract abstract (inverted index format)
165
+ abstract_inverted = work.get("abstract_inverted_index")
166
+ abstract = self._reconstruct_abstract(abstract_inverted) if abstract_inverted else None
167
+
168
+ # Extract topics/keywords
169
+ topics = [t.get("display_name") for t in work.get("topics", [])[:3]]
170
+ keywords = [k.get("display_name") for k in work.get("keywords", [])[:5]]
171
+
172
+ return {
173
+ "id": work.get("id"),
174
+ "openalex_id": work.get("id", "").split("/")[-1],
175
+ "doi": work.get("doi", "").replace("https://doi.org/", "") if work.get("doi") else None,
176
+ "title": work.get("display_name") or work.get("title", "Untitled"),
177
+ "authors": authors,
178
+ "author_count": len(authors),
179
+ "publication_year": work.get("publication_year"),
180
+ "publication_date": work.get("publication_date"),
181
+ "venue": venue,
182
+ "venue_type": source.get("type"),
183
+ "cited_by_count": work.get("cited_by_count", 0),
184
+ "is_oa": work.get("is_oa", False),
185
+ "oa_status": oa_status,
186
+ "oa_url": oa_url,
187
+ "abstract": abstract,
188
+ "topics": topics,
189
+ "keywords": keywords,
190
+ "type": work.get("type"),
191
+ "language": work.get("language"),
192
+ "referenced_works_count": work.get("referenced_works_count", 0),
193
+ "url": work.get("id")
194
+ }
195
+
196
+ def _reconstruct_abstract(self, inverted_index: Dict) -> str:
197
+ """Reconstruct abstract from inverted index format."""
198
+ if not inverted_index:
199
+ return None
200
+
201
+ # Create list of (position, word) tuples
202
+ words = []
203
+ for word, positions in inverted_index.items():
204
+ for pos in positions:
205
+ words.append((pos, word))
206
+
207
+ # Sort by position and join
208
+ words.sort(key=lambda x: x[0])
209
+ return " ".join(word for _, word in words)
210
+
211
+
212
+ def main():
213
+ parser = argparse.ArgumentParser(
214
+ description="Search OpenAlex for academic papers",
215
+ formatter_class=argparse.RawDescriptionHelpFormatter,
216
+ epilog="""
217
+ Examples:
218
+ # Basic search
219
+ %(prog)s search "semantic communication" --max 10
220
+
221
+ # Filter by year and type
222
+ %(prog)s search "diffusion models" --year 2023- --type article --max 20
223
+
224
+ # Open access papers only
225
+ %(prog)s search "machine learning" --open-access --min-citations 50
226
+
227
+ # Get specific work by DOI
228
+ %(prog)s work "10.1109/TWC.2024.1234567"
229
+
230
+ # Sort by citations
231
+ %(prog)s search "neural networks" --sort citations --max 10
232
+ """
233
+ )
234
+
235
+ subparsers = parser.add_subparsers(dest="command", help="Command to execute")
236
+
237
+ # Search command
238
+ search_parser = subparsers.add_parser("search", help="Search for works")
239
+ search_parser.add_argument("query", help="Search query")
240
+ search_parser.add_argument("--max", type=int, default=10, help="Maximum results (default: 10)")
241
+ search_parser.add_argument("--year", help="Publication year filter (e.g., '2023' or '2020-2023')")
242
+ search_parser.add_argument("--type", choices=["article", "preprint", "book", "book-chapter", "dataset", "dissertation"],
243
+ help="Work type filter")
244
+ search_parser.add_argument("--open-access", action="store_true", help="Only open access papers")
245
+ search_parser.add_argument("--min-citations", type=int, help="Minimum citation count")
246
+ search_parser.add_argument("--sort", choices=["relevance", "citations", "date"],
247
+ default="relevance", help="Sort order (default: relevance)")
248
+ search_parser.add_argument("--json", action="store_true", help="Output as JSON")
249
+
250
+ # Work command
251
+ work_parser = subparsers.add_parser("work", help="Get specific work by ID/DOI")
252
+ work_parser.add_argument("work_id", help="Work ID (DOI, OpenAlex ID, etc.)")
253
+ work_parser.add_argument("--json", action="store_true", help="Output as JSON")
254
+
255
+ args = parser.parse_args()
256
+
257
+ if not args.command:
258
+ parser.print_help()
259
+ sys.exit(1)
260
+
261
+ # Initialize client
262
+ client = OpenAlexClient()
263
+
264
+ try:
265
+ if args.command == "search":
266
+ # Map sort option to API format
267
+ sort_map = {
268
+ "relevance": "relevance_score:desc",
269
+ "citations": "cited_by_count:desc",
270
+ "date": "publication_date:desc"
271
+ }
272
+
273
+ results = client.search_works(
274
+ query=args.query,
275
+ max_results=args.max,
276
+ publication_year=args.year,
277
+ work_type=args.type,
278
+ open_access=args.open_access if args.open_access else None,
279
+ min_citations=args.min_citations,
280
+ sort=sort_map[args.sort]
281
+ )
282
+
283
+ if args.json:
284
+ print(json.dumps(results, indent=2))
285
+ else:
286
+ print(f"Found {len(results)} papers:\n")
287
+ for i, work in enumerate(results, 1):
288
+ print(f"{i}. {work['title']}")
289
+ print(f" Authors: {', '.join(work['authors'][:3])}{' et al.' if len(work['authors']) > 3 else ''}")
290
+ print(f" Year: {work['publication_year']} | Venue: {work['venue']}")
291
+ print(f" Citations: {work['cited_by_count']} | OA: {'Yes' if work['is_oa'] else 'No'}")
292
+ if work['doi']:
293
+ print(f" DOI: {work['doi']}")
294
+ if work['oa_url']:
295
+ print(f" PDF: {work['oa_url']}")
296
+ if work['abstract']:
297
+ abstract_preview = work['abstract'][:200] + "..." if len(work['abstract']) > 200 else work['abstract']
298
+ print(f" Abstract: {abstract_preview}")
299
+ print()
300
+
301
+ elif args.command == "work":
302
+ work = client.get_work(args.work_id)
303
+
304
+ if args.json:
305
+ print(json.dumps(work, indent=2))
306
+ else:
307
+ print(f"Title: {work['title']}")
308
+ print(f"Authors: {', '.join(work['authors'])}")
309
+ print(f"Year: {work['publication_year']} | Venue: {work['venue']}")
310
+ print(f"Citations: {work['cited_by_count']} | OA: {'Yes' if work['is_oa'] else 'No'}")
311
+ if work['doi']:
312
+ print(f"DOI: {work['doi']}")
313
+ if work['oa_url']:
314
+ print(f"PDF: {work['oa_url']}")
315
+ if work['topics']:
316
+ print(f"Topics: {', '.join(work['topics'])}")
317
+ if work['abstract']:
318
+ print(f"\nAbstract:\n{work['abstract']}")
319
+
320
+ except Exception as e:
321
+ print(f"Error: {e}", file=sys.stderr)
322
+ sys.exit(1)
323
+
324
+
325
+ if __name__ == "__main__":
326
+ main()
@@ -0,0 +1,104 @@
1
+ #!/usr/bin/env bash
2
+ # overleaf_audit.sh β€” Scan a repo for accidental Overleaf token leaks.
3
+ #
4
+ # Run this any time you suspect a token may have been written somewhere:
5
+ # bash tools/overleaf_audit.sh [repo-root]
6
+ #
7
+ # Exits non-zero if any token-pattern leak is found.
8
+ # Token pattern: 'olp_' followed by 20+ alphanumerics.
9
+
10
+ set -o pipefail
11
+
12
+ ROOT="${1:-.}"
13
+ PATTERN='olp_[A-Za-z0-9]{20,}'
14
+ FOUND=0
15
+
16
+ echo "Scanning $ROOT for Overleaf token patterns…"
17
+ echo ""
18
+
19
+ # 1. Working tree (excluding .git/ and node_modules/) ─────────────────────────
20
+ echo "[1/4] Working tree files…"
21
+ if command -v rg >/dev/null 2>&1; then
22
+ LEAKS=$(rg -n --no-heading -e "$PATTERN" \
23
+ --glob '!**/.git/**' --glob '!**/node_modules/**' \
24
+ --glob '!**/paper-overleaf/.git/**' \
25
+ "$ROOT" 2>/dev/null || true)
26
+ else
27
+ LEAKS=$(grep -rEn "$PATTERN" \
28
+ --exclude-dir=.git --exclude-dir=node_modules \
29
+ "$ROOT" 2>/dev/null || true)
30
+ fi
31
+ if [ -n "$LEAKS" ]; then
32
+ echo "❌ Token pattern in working tree:"
33
+ echo "$LEAKS"
34
+ FOUND=1
35
+ else
36
+ echo " βœ“ none"
37
+ fi
38
+
39
+ # 2. Git remote URLs of all sub-repos ─────────────────────────────────────────
40
+ echo "[2/4] Git remote URLs…"
41
+ LEAKS=""
42
+ while IFS= read -r -d '' gitdir; do
43
+ REPO=$(dirname "$gitdir")
44
+ if URL=$(cd "$REPO" && git remote -v 2>/dev/null); then
45
+ if echo "$URL" | grep -qE "$PATTERN"; then
46
+ LEAKS+="$REPO:"$'\n'"$URL"$'\n'
47
+ fi
48
+ fi
49
+ done < <(find "$ROOT" -name '.git' -type d -print0 2>/dev/null)
50
+ if [ -n "$LEAKS" ]; then
51
+ echo "❌ Token in remote URL:"
52
+ echo "$LEAKS"
53
+ FOUND=1
54
+ else
55
+ echo " βœ“ none"
56
+ fi
57
+
58
+ # 3. Git history (current repo only β€” full --all scan can be expensive) ───────
59
+ echo "[3/4] Git history of repo at $ROOT ..."
60
+ if [ -d "$ROOT/.git" ]; then
61
+ LEAKS=$(cd "$ROOT" && git log -p --all 2>/dev/null | grep -E "$PATTERN" | head -5 || true)
62
+ if [ -n "$LEAKS" ]; then
63
+ echo "❌ Token pattern in git history (showing first 5 matches):"
64
+ echo "$LEAKS"
65
+ echo ""
66
+ echo " Token may already be public if pushed. Revoke immediately:"
67
+ echo " https://www.overleaf.com/user/settings"
68
+ FOUND=1
69
+ else
70
+ echo " βœ“ none"
71
+ fi
72
+ else
73
+ echo " (skipped β€” $ROOT is not a git repo)"
74
+ fi
75
+
76
+ # 4. Common credential-storage files ──────────────────────────────────────────
77
+ echo "[4/4] Credential files (.netrc, .env, *credentials*)…"
78
+ LEAKS=""
79
+ for f in ~/.netrc ~/.git-credentials "$ROOT/.env" "$ROOT/.envrc"; do
80
+ if [ -f "$f" ] && grep -qE "$PATTERN" "$f" 2>/dev/null; then
81
+ LEAKS+="$f"$'\n'
82
+ fi
83
+ done
84
+ if [ -n "$LEAKS" ]; then
85
+ echo "⚠️ Token in credential file (intentional? confirm not in repo):"
86
+ echo "$LEAKS"
87
+ else
88
+ echo " βœ“ none"
89
+ fi
90
+
91
+ echo ""
92
+ if [ $FOUND -eq 0 ]; then
93
+ echo "βœ… Audit clean β€” no Overleaf token leaks found."
94
+ exit 0
95
+ else
96
+ echo "❌ Audit FAILED β€” see leaks above."
97
+ echo ""
98
+ echo "Action items:"
99
+ echo " 1. Revoke the leaked token at https://www.overleaf.com/user/settings"
100
+ echo " 2. Generate a new token"
101
+ echo " 3. Remove the leak (working tree: edit; remote URL: git remote set-url; history: git filter-repo)"
102
+ echo " 4. Re-run overleaf_setup.sh with the new token"
103
+ exit 1
104
+ fi
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env bash
2
+ # overleaf_setup.sh β€” One-time Overleaf Git bridge setup.
3
+ #
4
+ # CRITICAL: this script is meant to be run by the USER directly in their terminal,
5
+ # NEVER through an LLM agent. The user types the token into a hidden prompt; the
6
+ # script wires it into the OS keychain and immediately strips it from the git
7
+ # remote URL so no agent or file ever sees the cleartext token.
8
+ #
9
+ # Usage:
10
+ # bash tools/overleaf_setup.sh <project-id-or-url> [clone-dir]
11
+ #
12
+ # Example:
13
+ # bash tools/overleaf_setup.sh https://www.overleaf.com/project/69e478... paper-overleaf
14
+
15
+ set -euo pipefail
16
+
17
+ # ── Refuse to run from a non-interactive context (i.e. inside an agent) ────────
18
+ if [ ! -t 0 ] || [ ! -t 1 ]; then
19
+ echo "ERROR: overleaf_setup.sh requires an interactive terminal."
20
+ echo " Do NOT run this through an LLM agent β€” run it yourself in a terminal."
21
+ echo " The token must be typed into a hidden prompt, not pasted into chat."
22
+ exit 1
23
+ fi
24
+
25
+ # ── Args ──────────────────────────────────────────────────────────────────────
26
+ if [ $# -lt 1 ]; then
27
+ echo "Usage: $0 <project-id-or-url> [clone-dir]"
28
+ echo ""
29
+ echo " project-id-or-url: e.g. 'abc123def456' or 'https://www.overleaf.com/project/abc123def456'"
30
+ echo " clone-dir: defaults to 'paper-overleaf'"
31
+ exit 1
32
+ fi
33
+
34
+ RAW_INPUT="$1"
35
+ CLONE_DIR="${2:-paper-overleaf}"
36
+
37
+ # Strip URL down to project ID
38
+ PROJECT_ID="${RAW_INPUT##*/}"
39
+ PROJECT_ID="${PROJECT_ID%%\?*}"
40
+ if ! [[ "$PROJECT_ID" =~ ^[a-f0-9]{20,}$ ]]; then
41
+ echo "ERROR: project ID '$PROJECT_ID' does not look like an Overleaf project ID."
42
+ echo " Expected a hex string of 20+ characters."
43
+ exit 1
44
+ fi
45
+
46
+ if [ -e "$CLONE_DIR" ]; then
47
+ echo "ERROR: '$CLONE_DIR' already exists. Remove it first or choose a different dir."
48
+ exit 1
49
+ fi
50
+
51
+ # ── Read token securely (no echo, never enters shell history) ─────────────────
52
+ echo "Setting up Overleaf bridge for project $PROJECT_ID β†’ ./$CLONE_DIR/"
53
+ echo ""
54
+ echo "Get a token at: https://www.overleaf.com/user/settings β†’ Git Integration β†’ Create Token"
55
+ echo ""
56
+ read -r -s -p "Paste Overleaf token (input hidden): " OL_TOKEN
57
+ echo ""
58
+
59
+ if [ -z "$OL_TOKEN" ]; then
60
+ echo "ERROR: empty token"
61
+ exit 1
62
+ fi
63
+ if [[ ! "$OL_TOKEN" =~ ^olp_[A-Za-z0-9]+$ ]]; then
64
+ echo "WARNING: token does not start with 'olp_' β€” proceeding but verify it's correct."
65
+ fi
66
+
67
+ # ── Clone with token in URL (transient) ───────────────────────────────────────
68
+ echo "Cloning…"
69
+ if ! git clone "https://git:${OL_TOKEN}@git.overleaf.com/${PROJECT_ID}" "$CLONE_DIR" 2>&1 \
70
+ | sed "s|${OL_TOKEN}|<TOKEN>|g"; then
71
+ unset OL_TOKEN
72
+ echo "ERROR: clone failed"
73
+ exit 1
74
+ fi
75
+
76
+ # ── Immediately strip token from remote URL ───────────────────────────────────
77
+ cd "$CLONE_DIR"
78
+ git remote set-url origin "https://git.overleaf.com/${PROJECT_ID}"
79
+
80
+ # ── Configure credential helper ───────────────────────────────────────────────
81
+ case "$(uname -s)" in
82
+ Darwin) HELPER=osxkeychain ;;
83
+ Linux) HELPER=cache ;;
84
+ MINGW*|MSYS*|CYGWIN*) HELPER=manager ;;
85
+ *) HELPER=store ;;
86
+ esac
87
+ git config --global credential.helper "$HELPER" 2>/dev/null || \
88
+ git config credential.helper "$HELPER"
89
+
90
+ # ── Prime credential storage so future pull/push is auth-free ─────────────────
91
+ git credential approve <<EOF
92
+ protocol=https
93
+ host=git.overleaf.com
94
+ username=git
95
+ password=${OL_TOKEN}
96
+
97
+ EOF
98
+
99
+ # ── Clear token from memory ───────────────────────────────────────────────────
100
+ unset OL_TOKEN
101
+
102
+ # ── Install hard-block pre-commit hook ────────────────────────────────────────
103
+ HOOK_DIR=".git/hooks"
104
+ mkdir -p "$HOOK_DIR"
105
+ cat > "$HOOK_DIR/pre-commit" <<'HOOK'
106
+ #!/usr/bin/env bash
107
+ # Auto-installed by overleaf_setup.sh. Refuses to commit anything containing
108
+ # what looks like an Overleaf token pattern. Cannot be bypassed by any agent
109
+ # without --no-verify (which the ARIS protocol forbids without explicit user OK).
110
+ set -e
111
+ if git diff --cached | grep -qE 'olp_[A-Za-z0-9]{20,}'; then
112
+ echo "ERROR: Overleaf token pattern (olp_…) detected in staged changes."
113
+ echo " Refusing to commit. Remove the token before committing."
114
+ echo " Also revoke it at https://www.overleaf.com/user/settings"
115
+ exit 1
116
+ fi
117
+ HOOK
118
+ chmod +x "$HOOK_DIR/pre-commit"
119
+
120
+ # ── Verify token was actually stripped from remote ────────────────────────────
121
+ if git remote -v | grep -qE 'olp_'; then
122
+ echo ""
123
+ echo "FATAL: token still present in remote URL after strip. Aborting."
124
+ cd .. && rm -rf "$CLONE_DIR"
125
+ exit 1
126
+ fi
127
+
128
+ # ── Set local commit identity (best-effort) ───────────────────────────────────
129
+ if [ -z "$(git config user.email 2>/dev/null)" ]; then
130
+ GLOBAL_EMAIL="$(git config --global user.email 2>/dev/null || true)"
131
+ if [ -n "$GLOBAL_EMAIL" ]; then
132
+ git config user.email "$GLOBAL_EMAIL"
133
+ else
134
+ echo "NOTE: no git user.email set. Run:"
135
+ echo " cd $CLONE_DIR && git config user.email <your-email>"
136
+ fi
137
+ fi
138
+
139
+ # ── Final report ──────────────────────────────────────────────────────────────
140
+ cd ..
141
+ echo ""
142
+ echo "βœ… Setup complete."
143
+ echo ""
144
+ echo " Clone: ./$CLONE_DIR/"
145
+ echo " Remote URL: $(cd "$CLONE_DIR" && git remote get-url origin) ← no token"
146
+ echo " Credential: stored in $HELPER"
147
+ echo " Pre-commit: installed (blocks olp_… patterns)"
148
+ echo ""
149
+ echo "From here on, agents can run pull/push against $CLONE_DIR/ without seeing a token."
150
+ echo "If pull/push ever fails with 401, your token expired β€” re-run this script."
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env python3
2
+ """Legacy entry point β€” forwards to the canonical paper_illustration_image2.
3
+
4
+ The canonical implementation now lives at
5
+ skills/paper-illustration-image2/scripts/paper_illustration_image2.py
6
+ (Phase 3.2 β€” Arch C β€” self-contained single-owner helper).
7
+
8
+ This shim keeps the four legacy resolver layers working without a
9
+ re-install:
10
+
11
+ .aris/tools/paper_illustration_image2.py
12
+ β†’ $ARIS_REPO/tools/paper_illustration_image2.py (this shim)
13
+ β†’ $ARIS_REPO/skills/paper-illustration-image2/scripts/paper_illustration_image2.py
14
+
15
+ tools/paper_illustration_image2.py (in-repo run)
16
+ β†’ this shim β†’ canonical
17
+
18
+ $ARIS_REPO/tools/paper_illustration_image2.py (env-var)
19
+ β†’ this shim β†’ canonical
20
+
21
+ Manual <project>/tools/paper_illustration_image2.py copies of the
22
+ pre-Phase-3.2 file continue to work standalone (no shim semantics
23
+ needed; the canonical script is self-contained).
24
+
25
+ `os.execv` replaces the current Python process so the canonical
26
+ helper sees its own `__file__` and computes paths relative to itself,
27
+ not relative to this shim.
28
+ """
29
+
30
+ from __future__ import annotations
31
+
32
+ import os
33
+ import sys
34
+ from pathlib import Path
35
+
36
+ HERE = Path(__file__).resolve().parent
37
+ REPO_ROOT = HERE.parent
38
+ REAL = REPO_ROOT / "skills" / "paper-illustration-image2" / "scripts" / "paper_illustration_image2.py"
39
+
40
+
41
+ def _fail(msg: str) -> int:
42
+ sys.stderr.write(msg + "\n")
43
+ return 1
44
+
45
+
46
+ def main() -> int:
47
+ if not REAL.is_file():
48
+ return _fail(
49
+ f"ERROR: canonical paper_illustration_image2.py not found at {REAL}.\n"
50
+ " The Phase 3.2 migration moved this helper into the\n"
51
+ " /paper-illustration-image2 SKILL\n"
52
+ " ('skills/paper-illustration-image2/scripts/'). Your\n"
53
+ " local checkout may be incomplete β€” try `git pull` from the\n"
54
+ " ARIS repo, or rerun `bash tools/install_aris.sh` to refresh\n"
55
+ " the project-local symlink chain."
56
+ )
57
+ os.execv(sys.executable, [sys.executable, str(REAL), *sys.argv[1:]])
58
+ return 0 # unreachable; os.execv does not return on success
59
+
60
+
61
+ if __name__ == "__main__":
62
+ sys.exit(main())