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,425 @@
1
+ #!/usr/bin/env python3
2
+ """CLI helper for AI-powered web search via Exa.
3
+
4
+ Designed to complement arXiv (preprints) and Semantic Scholar (published venues)
5
+ with **broad web search**: blog posts, documentation, company pages, news, and
6
+ research papers — all with built-in content extraction.
7
+
8
+ Requires
9
+ --------
10
+ pip install exa-py
11
+
12
+ Commands
13
+ --------
14
+ search Search the web and optionally retrieve content.
15
+ find-similar Find pages similar to a given URL.
16
+ get-contents Retrieve content for specific URLs.
17
+
18
+ Filter flags (search)
19
+ ---------------------
20
+ --type Search type: auto (default), neural, fast, instant
21
+ --category Focus area: "company", "research paper", "news",
22
+ "personal site", "financial report", "people"
23
+ --include-domains Only include results from these domains (comma-separated)
24
+ --exclude-domains Exclude results from these domains (comma-separated)
25
+ --include-text Required text in page (comma-separated phrases)
26
+ --exclude-text Prohibited text in page (comma-separated phrases)
27
+ --start-date Only results published after this ISO 8601 date
28
+ --end-date Only results published before this ISO 8601 date
29
+ --location Two-letter ISO country code for localized results
30
+
31
+ Content flags (shared)
32
+ ----------------------
33
+ --content Content mode: highlights (default), text, summary, none
34
+ --max-chars Max characters for content extraction (default: 4000)
35
+
36
+ Examples
37
+ --------
38
+ # Basic search with highlights
39
+ python3 tools/exa_search.py search "transformer attention mechanisms" --max 10
40
+
41
+ # Research papers with full text
42
+ python3 tools/exa_search.py search "semantic communication" --category "research paper" \
43
+ --content text --max-chars 8000
44
+
45
+ # Recent news about a topic
46
+ python3 tools/exa_search.py search "foundation models" --category news \
47
+ --start-date 2025-01-01
48
+
49
+ # Domain-restricted search
50
+ python3 tools/exa_search.py search "RAG pipeline" --include-domains "arxiv.org,huggingface.co"
51
+
52
+ # Find similar pages to a URL
53
+ python3 tools/exa_search.py find-similar "https://arxiv.org/abs/2301.07041" --max 5
54
+
55
+ # Get content for specific URLs
56
+ python3 tools/exa_search.py get-contents "https://example.com/page1" "https://example.com/page2"
57
+ """
58
+
59
+ from __future__ import annotations
60
+
61
+ import argparse
62
+ import json
63
+ import os
64
+ import sys
65
+ from typing import Any
66
+
67
+ _INSTALL_MESSAGE = "exa-py not found. Install it with: pip install exa-py"
68
+
69
+
70
+ def _get_client() -> Any:
71
+ """Create and return an Exa client with the integration tracking header."""
72
+ api_key = os.getenv("EXA_API_KEY", "").strip()
73
+ if not api_key:
74
+ raise RuntimeError(
75
+ "EXA_API_KEY environment variable is required. "
76
+ "Get your key from: https://exa.ai"
77
+ )
78
+
79
+ try:
80
+ from exa_py import Exa
81
+ except ImportError:
82
+ raise RuntimeError(_INSTALL_MESSAGE)
83
+
84
+ client = Exa(api_key=api_key)
85
+ client.headers["x-exa-integration"] = "auto-claude-code-research-in-sleep"
86
+ return client
87
+
88
+
89
+ def _parse_list(value: str | None) -> list[str] | None:
90
+ """Split a comma-separated string into a list, or return None."""
91
+ if not value:
92
+ return None
93
+ return [item.strip() for item in value.split(",") if item.strip()]
94
+
95
+
96
+ def _build_content_kwargs(content_mode: str, max_chars: int) -> dict[str, Any]:
97
+ """Build content retrieval kwargs for Exa search_and_contents."""
98
+ if content_mode == "none":
99
+ return {}
100
+ if content_mode == "highlights":
101
+ return {"highlights": {"max_characters": max_chars}}
102
+ if content_mode == "text":
103
+ return {"text": {"max_characters": max_chars}}
104
+ if content_mode == "summary":
105
+ return {"summary": True}
106
+ return {"highlights": {"max_characters": max_chars}}
107
+
108
+
109
+ def _process_result(result: Any, content_mode: str) -> dict[str, Any]:
110
+ """Extract structured fields from a single Exa result object."""
111
+ entry: dict[str, Any] = {
112
+ "title": getattr(result, "title", None) or "No Title",
113
+ "url": getattr(result, "url", None) or "",
114
+ }
115
+
116
+ published_date = getattr(result, "published_date", None)
117
+ if published_date:
118
+ entry["published_date"] = published_date
119
+
120
+ author = getattr(result, "author", None)
121
+ if author:
122
+ entry["author"] = author
123
+
124
+ if content_mode == "highlights":
125
+ highlights = getattr(result, "highlights", None)
126
+ if highlights:
127
+ entry["highlights"] = highlights
128
+ elif content_mode == "text":
129
+ text = getattr(result, "text", None)
130
+ if text:
131
+ entry["text"] = text
132
+ elif content_mode == "summary":
133
+ summary = getattr(result, "summary", None)
134
+ if summary:
135
+ entry["summary"] = summary
136
+
137
+ return entry
138
+
139
+
140
+ def search(
141
+ query: str,
142
+ max_results: int = 10,
143
+ search_type: str = "auto",
144
+ content_mode: str = "highlights",
145
+ max_chars: int = 4000,
146
+ category: str | None = None,
147
+ include_domains: list[str] | None = None,
148
+ exclude_domains: list[str] | None = None,
149
+ include_text: list[str] | None = None,
150
+ exclude_text: list[str] | None = None,
151
+ start_published_date: str | None = None,
152
+ end_published_date: str | None = None,
153
+ user_location: str | None = None,
154
+ ) -> dict[str, Any]:
155
+ """Search the web via Exa and return structured results."""
156
+ client = _get_client()
157
+
158
+ kwargs: dict[str, Any] = {
159
+ "query": query,
160
+ "num_results": max_results,
161
+ "type": search_type,
162
+ }
163
+
164
+ kwargs.update(_build_content_kwargs(content_mode, max_chars))
165
+
166
+ if category:
167
+ kwargs["category"] = category
168
+ if include_domains:
169
+ kwargs["include_domains"] = include_domains
170
+ if exclude_domains:
171
+ kwargs["exclude_domains"] = exclude_domains
172
+ if include_text:
173
+ kwargs["include_text"] = include_text
174
+ if exclude_text:
175
+ kwargs["exclude_text"] = exclude_text
176
+ if start_published_date:
177
+ kwargs["start_published_date"] = start_published_date
178
+ if end_published_date:
179
+ kwargs["end_published_date"] = end_published_date
180
+ if user_location:
181
+ kwargs["user_location"] = user_location
182
+
183
+ response = client.search_and_contents(**kwargs)
184
+
185
+ return {
186
+ "mode": "search",
187
+ "query": query,
188
+ "type": search_type,
189
+ "returned": len(response.results),
190
+ "data": [_process_result(r, content_mode) for r in response.results],
191
+ }
192
+
193
+
194
+ def find_similar(
195
+ url: str,
196
+ max_results: int = 10,
197
+ content_mode: str = "highlights",
198
+ max_chars: int = 4000,
199
+ include_domains: list[str] | None = None,
200
+ exclude_domains: list[str] | None = None,
201
+ start_published_date: str | None = None,
202
+ end_published_date: str | None = None,
203
+ ) -> dict[str, Any]:
204
+ """Find pages similar to a given URL."""
205
+ client = _get_client()
206
+
207
+ kwargs: dict[str, Any] = {
208
+ "url": url,
209
+ "num_results": max_results,
210
+ }
211
+
212
+ kwargs.update(_build_content_kwargs(content_mode, max_chars))
213
+
214
+ if include_domains:
215
+ kwargs["include_domains"] = include_domains
216
+ if exclude_domains:
217
+ kwargs["exclude_domains"] = exclude_domains
218
+ if start_published_date:
219
+ kwargs["start_published_date"] = start_published_date
220
+ if end_published_date:
221
+ kwargs["end_published_date"] = end_published_date
222
+
223
+ response = client.find_similar_and_contents(**kwargs)
224
+
225
+ return {
226
+ "mode": "find-similar",
227
+ "url": url,
228
+ "returned": len(response.results),
229
+ "data": [_process_result(r, content_mode) for r in response.results],
230
+ }
231
+
232
+
233
+ def get_contents(
234
+ urls: list[str],
235
+ content_mode: str = "text",
236
+ max_chars: int = 10000,
237
+ ) -> dict[str, Any]:
238
+ """Retrieve content for specific URLs."""
239
+ client = _get_client()
240
+
241
+ kwargs: dict[str, Any] = {"ids": urls}
242
+ kwargs.update(_build_content_kwargs(content_mode, max_chars))
243
+
244
+ response = client.get_contents(**kwargs)
245
+
246
+ return {
247
+ "mode": "get-contents",
248
+ "returned": len(response.results),
249
+ "data": [_process_result(r, content_mode) for r in response.results],
250
+ }
251
+
252
+
253
+ def _build_parser() -> argparse.ArgumentParser:
254
+ parser = argparse.ArgumentParser(
255
+ description="AI-powered web search via Exa.",
256
+ formatter_class=argparse.RawDescriptionHelpFormatter,
257
+ )
258
+ subparsers = parser.add_subparsers(dest="command", required=True)
259
+
260
+ # --- search ---
261
+ search_parser = subparsers.add_parser("search", help="Search the web via Exa")
262
+ search_parser.add_argument("query", help="Search query")
263
+ search_parser.add_argument(
264
+ "--max", type=int, default=10, metavar="N",
265
+ help="Maximum number of results (default: 10).",
266
+ )
267
+ search_parser.add_argument(
268
+ "--type", default="auto", dest="search_type",
269
+ choices=("auto", "neural", "fast", "instant"),
270
+ help="Search type (default: auto).",
271
+ )
272
+ search_parser.add_argument(
273
+ "--content", default="highlights", dest="content_mode",
274
+ choices=("highlights", "text", "summary", "none"),
275
+ help="Content retrieval mode (default: highlights).",
276
+ )
277
+ search_parser.add_argument(
278
+ "--max-chars", type=int, default=4000, metavar="N",
279
+ help="Max characters for content extraction (default: 4000).",
280
+ )
281
+ search_parser.add_argument(
282
+ "--category", default=None,
283
+ help='Category filter: "company", "research paper", "news", '
284
+ '"personal site", "financial report", "people".',
285
+ )
286
+ search_parser.add_argument(
287
+ "--include-domains", default=None,
288
+ help="Comma-separated domains to include.",
289
+ )
290
+ search_parser.add_argument(
291
+ "--exclude-domains", default=None,
292
+ help="Comma-separated domains to exclude.",
293
+ )
294
+ search_parser.add_argument(
295
+ "--include-text", default=None,
296
+ help="Comma-separated phrases that must appear in page.",
297
+ )
298
+ search_parser.add_argument(
299
+ "--exclude-text", default=None,
300
+ help="Comma-separated phrases to exclude from results.",
301
+ )
302
+ search_parser.add_argument(
303
+ "--start-date", default=None,
304
+ help="Only results published after this date (ISO 8601).",
305
+ )
306
+ search_parser.add_argument(
307
+ "--end-date", default=None,
308
+ help="Only results published before this date (ISO 8601).",
309
+ )
310
+ search_parser.add_argument(
311
+ "--location", default=None,
312
+ help="Two-letter ISO country code for localized results.",
313
+ )
314
+
315
+ # --- find-similar ---
316
+ similar_parser = subparsers.add_parser(
317
+ "find-similar", help="Find pages similar to a URL",
318
+ )
319
+ similar_parser.add_argument("url", help="URL to find similar pages for")
320
+ similar_parser.add_argument(
321
+ "--max", type=int, default=10, metavar="N",
322
+ help="Maximum number of results (default: 10).",
323
+ )
324
+ similar_parser.add_argument(
325
+ "--content", default="highlights", dest="content_mode",
326
+ choices=("highlights", "text", "summary", "none"),
327
+ help="Content retrieval mode (default: highlights).",
328
+ )
329
+ similar_parser.add_argument(
330
+ "--max-chars", type=int, default=4000, metavar="N",
331
+ help="Max characters for content extraction (default: 4000).",
332
+ )
333
+ similar_parser.add_argument(
334
+ "--include-domains", default=None,
335
+ help="Comma-separated domains to include.",
336
+ )
337
+ similar_parser.add_argument(
338
+ "--exclude-domains", default=None,
339
+ help="Comma-separated domains to exclude.",
340
+ )
341
+ similar_parser.add_argument(
342
+ "--start-date", default=None,
343
+ help="Only results published after this date (ISO 8601).",
344
+ )
345
+ similar_parser.add_argument(
346
+ "--end-date", default=None,
347
+ help="Only results published before this date (ISO 8601).",
348
+ )
349
+
350
+ # --- get-contents ---
351
+ contents_parser = subparsers.add_parser(
352
+ "get-contents", help="Retrieve content for specific URLs",
353
+ )
354
+ contents_parser.add_argument("urls", nargs="+", help="URLs to fetch content for")
355
+ contents_parser.add_argument(
356
+ "--content", default="text", dest="content_mode",
357
+ choices=("highlights", "text", "summary", "none"),
358
+ help="Content retrieval mode (default: text).",
359
+ )
360
+ contents_parser.add_argument(
361
+ "--max-chars", type=int, default=10000, metavar="N",
362
+ help="Max characters for content extraction (default: 10000).",
363
+ )
364
+
365
+ return parser
366
+
367
+
368
+ def main(argv: list[str] | None = None) -> int:
369
+ args = _build_parser().parse_args(argv)
370
+
371
+ try:
372
+ if args.command == "search":
373
+ result = search(
374
+ query=args.query,
375
+ max_results=args.max,
376
+ search_type=args.search_type,
377
+ content_mode=args.content_mode,
378
+ max_chars=args.max_chars,
379
+ category=args.category,
380
+ include_domains=_parse_list(args.include_domains),
381
+ exclude_domains=_parse_list(args.exclude_domains),
382
+ include_text=_parse_list(args.include_text),
383
+ exclude_text=_parse_list(args.exclude_text),
384
+ start_published_date=args.start_date,
385
+ end_published_date=args.end_date,
386
+ user_location=args.location,
387
+ )
388
+ print(json.dumps(result, ensure_ascii=False, indent=2))
389
+ return 0
390
+
391
+ if args.command == "find-similar":
392
+ result = find_similar(
393
+ url=args.url,
394
+ max_results=args.max,
395
+ content_mode=args.content_mode,
396
+ max_chars=args.max_chars,
397
+ include_domains=_parse_list(args.include_domains),
398
+ exclude_domains=_parse_list(args.exclude_domains),
399
+ start_published_date=args.start_date,
400
+ end_published_date=args.end_date,
401
+ )
402
+ print(json.dumps(result, ensure_ascii=False, indent=2))
403
+ return 0
404
+
405
+ if args.command == "get-contents":
406
+ result = get_contents(
407
+ urls=args.urls,
408
+ content_mode=args.content_mode,
409
+ max_chars=args.max_chars,
410
+ )
411
+ print(json.dumps(result, ensure_ascii=False, indent=2))
412
+ return 0
413
+
414
+ raise ValueError(f"Unsupported command: {args.command}")
415
+
416
+ except KeyboardInterrupt:
417
+ print("Interrupted.", file=sys.stderr)
418
+ return 130
419
+ except Exception as exc:
420
+ print(f"Error: {exc}", file=sys.stderr)
421
+ return 1
422
+
423
+
424
+ if __name__ == "__main__":
425
+ sys.exit(main())
@@ -0,0 +1,118 @@
1
+ # experiment-queue Tools
2
+
3
+ Scheduler and manifest builder for `/experiment-queue` skill.
4
+
5
+ ## Files
6
+
7
+ - `build_manifest.py` — Expands grid spec (YAML/JSON) into explicit job manifest
8
+ - `queue_manager.py` — Scheduler that runs on the remote host; polls, launches, retries, cleans
9
+
10
+ ## Install on Remote
11
+
12
+ The `/experiment-queue` skill auto-installs these on the SSH host under `~/.aris_queue/` per invocation (idempotent). The skill resolves the local helpers via a fallback chain (`.aris/tools/experiment_queue/` → `tools/experiment_queue/` → `$ARIS_REPO/tools/experiment_queue/` → same, resolved via the global pointer file `~/.aris/repo`, #366) so it works from any project layout.
13
+
14
+ For manual install (run from anywhere; `$ARIS_REPO` points at the cloned ARIS repo root):
15
+
16
+ ```bash
17
+ ssh <server> 'mkdir -p ~/.aris_queue'
18
+ scp "$ARIS_REPO/tools/experiment_queue/queue_manager.py" \
19
+ "$ARIS_REPO/tools/experiment_queue/build_manifest.py" \
20
+ <server>:~/.aris_queue/
21
+ ```
22
+
23
+ ## Example
24
+
25
+ ### 1. Write grid spec (on local or remote)
26
+
27
+ `grid_spec.yaml`:
28
+ ```yaml
29
+ project: my_grid_experiment
30
+ cwd: /home/user/your_project
31
+ conda: my_env
32
+ gpus: [0, 1, 2, 3, 4, 5, 6, 7]
33
+ max_parallel: 8
34
+ oom_retry: {delay: 120, max_attempts: 3}
35
+
36
+ phases:
37
+ - name: distill
38
+ grid:
39
+ N: [64, 128, 256]
40
+ seed: [42, 200, 201]
41
+ n_train_subset: [50000, 150000, 500000, 652000]
42
+ template:
43
+ id: "s${seed}_N${N}_n${n_train_subset}"
44
+ cmd: >
45
+ python run_distill.py --backbone softmax --lam 0.5
46
+ --t_max_distill 0 --K 500 --L 96 --W 16 --n_steps 30000
47
+ --batch_size 128 --lr 1e-4 --seed ${seed} --subset_seed 2024
48
+ --n_hidden ${N} --n_train_subset ${n_train_subset}
49
+ expected_output: "figures/distill_sw_N${N}_*_seed${seed}.json"
50
+ ```
51
+
52
+ ### 2. Build manifest
53
+
54
+ ```bash
55
+ python3 build_manifest.py --config grid_spec.yaml --output manifest.json
56
+ ```
57
+
58
+ ### 3. Launch scheduler
59
+
60
+ Use a per-run directory under `~/.aris_queue/runs/` so concurrent queues don't collide and crash-resume is reproducible. Note that `scp` runs in SFTP mode in modern OpenSSH and does NOT reliably expand `$HOME` in destination paths — use remote-relative paths for `scp` destinations and `$HOME`-prefixed paths only inside `ssh` command strings (where remote bash expands them):
61
+
62
+ ```bash
63
+ RUN_TS=$(date -u +%Y%m%dT%H%M%SZ)
64
+ REMOTE_RUN_REL=".aris_queue/runs/$RUN_TS" # for scp (relative to remote home)
65
+ REMOTE_RUN_DIR="\$HOME/$REMOTE_RUN_REL" # for ssh commands (expanded remotely)
66
+
67
+ ssh <server> "mkdir -p \"$REMOTE_RUN_DIR/logs\" \"\$HOME/.aris_queue\""
68
+ scp manifest.json <server>:"$REMOTE_RUN_REL/manifest.json"
69
+
70
+ ssh <server> "nohup python3 \"\$HOME/.aris_queue/queue_manager.py\" \\
71
+ --manifest \"$REMOTE_RUN_DIR/manifest.json\" \\
72
+ --state \"$REMOTE_RUN_DIR/queue_state.json\" \\
73
+ --log-dir \"$REMOTE_RUN_DIR/logs\" \\
74
+ > \"$REMOTE_RUN_DIR/queue_mgr.log\" 2>&1 &"
75
+ ```
76
+
77
+ > Note: `--log-dir` is the per-job log directory the scheduler reads for OOM detection. The flag `--log` is declared by argparse but unused; do not pass it.
78
+
79
+ ### 4. Monitor
80
+
81
+ ```bash
82
+ ssh <server> "jq '.jobs | group_by(.status) | map({(.[0].status): length}) | add' \"$REMOTE_RUN_DIR/queue_state.json\""
83
+ ```
84
+
85
+ Returns:
86
+ ```json
87
+ {"completed": 30, "running": 6, "pending": 0}
88
+ ```
89
+
90
+ ## State Machine
91
+
92
+ ```
93
+ pending → running → completed
94
+ ↘ failed_oom → pending (after delay, up to max_attempts)
95
+ ↘ stuck (after max_attempts)
96
+ ↘ failed_other → stuck
97
+ ```
98
+
99
+ ## Dependencies
100
+
101
+ - Python 3.8+
102
+ - `nvidia-smi` on remote
103
+ - `screen` on remote
104
+ - Optional: `pyyaml` (only if using YAML grid specs)
105
+
106
+ ## Invariants
107
+
108
+ - **No GPU overlap**: scheduler only assigns GPU with `memory.used < 500 MiB`
109
+ - **State is source of truth**: `queue_state.json` is written atomically every step
110
+ - **Idempotent**: safe to kill and restart the scheduler; picks up from state
111
+ - **Output-based completion**: completion is verified by `expected_output` existing, not just by screen/process exit
112
+
113
+ ## Not Yet Supported
114
+
115
+ - Mid-run GPU reshuffling (if GPU becomes unavailable mid-job)
116
+ - Automatic GPU-per-job count (all jobs assumed single-GPU)
117
+ - Distributed multi-node queues
118
+ - Auto-sync results back to local
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env python3
2
+ """Legacy entry point — forwards to canonical build_manifest.
3
+
4
+ Phase 3.3 (Arch C) moved the implementation to
5
+ skills/experiment-queue/scripts/build_manifest.py
6
+
7
+ This shim keeps the directory-level resolver chain working
8
+ (.aris/tools/experiment_queue/ → tools/experiment_queue/ →
9
+ $ARIS_REPO/tools/experiment_queue/ → same, via the global pointer
10
+ file ~/.aris/repo, #366). Once a SKILL has resolved
11
+ the directory, it runs `python3 $QUEUE_TOOLS/build_manifest.py`,
12
+ which lands here, which os.execv's into the canonical script.
13
+
14
+ See `skills/experiment-queue/SKILL.md` for the resolver block.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import os
20
+ import sys
21
+ from pathlib import Path
22
+
23
+ HERE = Path(__file__).resolve().parent
24
+ REPO_ROOT = HERE.parent.parent
25
+ REAL = REPO_ROOT / "skills" / "experiment-queue" / "scripts" / "build_manifest.py"
26
+
27
+
28
+ def main() -> int:
29
+ if not REAL.is_file():
30
+ sys.stderr.write(
31
+ f"ERROR: canonical build_manifest.py not found at {REAL}.\n"
32
+ " Phase 3.3 moved this helper into the\n"
33
+ " /experiment-queue SKILL ('skills/experiment-queue/scripts/').\n"
34
+ " Your local checkout may be incomplete — try `git pull`\n"
35
+ " or rerun `bash tools/install_aris.sh` to refresh the\n"
36
+ " project-local symlink chain.\n"
37
+ )
38
+ return 1
39
+ os.execv(sys.executable, [sys.executable, str(REAL), *sys.argv[1:]])
40
+ return 0 # unreachable
41
+
42
+
43
+ if __name__ == "__main__":
44
+ sys.exit(main())
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env python3
2
+ """Legacy entry point — forwards to canonical queue_manager.
3
+
4
+ Phase 3.3 (Arch C) moved the implementation to
5
+ skills/experiment-queue/scripts/queue_manager.py
6
+
7
+ This shim keeps the directory-level resolver chain working
8
+ (.aris/tools/experiment_queue/ → tools/experiment_queue/ →
9
+ $ARIS_REPO/tools/experiment_queue/ → same, via the global pointer
10
+ file ~/.aris/repo, #366). Once a SKILL has resolved
11
+ the directory, it runs `python3 $QUEUE_TOOLS/queue_manager.py`,
12
+ which lands here, which os.execv's into the canonical script.
13
+
14
+ See `skills/experiment-queue/SKILL.md` for the resolver block.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import os
20
+ import sys
21
+ from pathlib import Path
22
+
23
+ HERE = Path(__file__).resolve().parent
24
+ REPO_ROOT = HERE.parent.parent
25
+ REAL = REPO_ROOT / "skills" / "experiment-queue" / "scripts" / "queue_manager.py"
26
+
27
+
28
+ def main() -> int:
29
+ if not REAL.is_file():
30
+ sys.stderr.write(
31
+ f"ERROR: canonical queue_manager.py not found at {REAL}.\n"
32
+ " Phase 3.3 moved this helper into the\n"
33
+ " /experiment-queue SKILL ('skills/experiment-queue/scripts/').\n"
34
+ " Your local checkout may be incomplete — try `git pull`\n"
35
+ " or rerun `bash tools/install_aris.sh` to refresh the\n"
36
+ " project-local symlink chain.\n"
37
+ )
38
+ return 1
39
+ os.execv(sys.executable, [sys.executable, str(REAL), *sys.argv[1:]])
40
+ return 0 # unreachable; os.execv does not return on success
41
+
42
+
43
+ if __name__ == "__main__":
44
+ sys.exit(main())