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,44 @@
1
+ # ARIS bundle layer for DeepSeek Harness.
2
+ #
3
+ # Applied after the profile's surface bundle. Patch config replacement is
4
+ # whole-value, so rows that adjust shipped configuration restate every field
5
+ # they need.
6
+
7
+ # ARIS review runs on the stronger executor.
8
+ - id: agent-default-model
9
+ config:
10
+ provider: deepseek-official
11
+ model: deepseek-v4-pro
12
+
13
+ - insert:
14
+ # Skill corpus, ARIS_REPO, and the Codex threadId projection.
15
+ - id: aris-skills
16
+ name: 'dsh-aris'
17
+
18
+ # Optional: apply ARIS's scope limits to the executor as well as the
19
+ # reviewer. Off by default — it spends tokens on every request, and the
20
+ # reviewer side is already covered by the skills. Flip to enable.
21
+ - id: aris-scope-limits
22
+ name: 'dsh-aris/scope-limits'
23
+ disabled: true
24
+
25
+ # The independent reviewer. Model and reasoning effort come from the host
26
+ # Codex installation (~/.codex/config.toml) — that file is the reviewer
27
+ # posture contract, and dsh deliberately does not override it.
28
+ - id: aris-codex
29
+ name: '@deepseek-ai/dsh-mcp-client'
30
+ config:
31
+ transport: stdio
32
+ serverName: codex
33
+ command: codex
34
+ args: [mcp-server]
35
+ # Pinned to a directory that outlives the run. Inheriting the Harness's
36
+ # launch directory makes every review depend on it still existing:
37
+ # remove or rename it and Codex fails to load its own configuration,
38
+ # which ARIS survives by degrading to a transport that cannot attest
39
+ # reviewer identity. Review prompts address artifacts absolutely.
40
+ cwd: !!js process.env.HOME
41
+ # dsh defaults to 60s and Codex's progress notifications do not extend it.
42
+ # 20 minutes is ARIS's own threshold for calling a review hung.
43
+ toolCallTimeoutMs: 1200000
44
+ failOnStartupError: true
package/dsh/index.mjs ADDED
@@ -0,0 +1,76 @@
1
+ /**
2
+ * ARIS bundle adapter for DeepSeek Harness.
3
+ *
4
+ * Four effects, none of which the declarative layer can express:
5
+ * 1. mount the packaged skill corpus from a path only this module can resolve
6
+ * 2. publish the package root as ARIS_REPO so skills reach their helper scripts
7
+ * 3. project Codex's threadId into model-visible content so codex-reply works
8
+ * 4. serve the run-status view its read-only projection of the loop artifacts
9
+ */
10
+
11
+ import { fileURLToPath } from 'node:url'
12
+ import * as skillFilesystem from '@deepseek-ai/dsh-skill-filesystem'
13
+ import { registerRunStatus } from './run-status.mjs'
14
+ import { registerWorkbench } from './workbench.mjs'
15
+
16
+ export const name = 'aris-skills'
17
+ export const inject = ['skills', 'tools']
18
+
19
+ /** Package root; identical in a git checkout and under node_modules. */
20
+ const PACKAGE_ROOT = fileURLToPath(new URL('../', import.meta.url))
21
+ const SKILL_ROOT = fileURLToPath(new URL('../skills/', import.meta.url))
22
+
23
+ /** Codex MCP tools whose reply carries a continuation threadId. */
24
+ const CODEX_TOOLS = new Set(['mcp__codex__codex', 'mcp__codex__codex-reply'])
25
+
26
+ export async function apply(ctx) {
27
+ // ARIS skills resolve shared helpers through $ARIS_REPO/tools
28
+ // (skills/shared-references/integration-contract.md). An operator-set value wins.
29
+ ctx.effect(() => {
30
+ const inherited = process.env.ARIS_REPO
31
+ if (inherited === undefined) process.env.ARIS_REPO = PACKAGE_ROOT
32
+ return () => {
33
+ if (inherited === undefined && process.env.ARIS_REPO === PACKAGE_ROOT) {
34
+ delete process.env.ARIS_REPO
35
+ }
36
+ }
37
+ }, 'ARIS package root')
38
+
39
+ // Rank 600 (bundledSkillDir): a project or user skill of the same name wins.
40
+ await ctx.plugin(skillFilesystem, {
41
+ providerName: 'aris',
42
+ includeDefaultRoots: false,
43
+ bundledSkillDir: SKILL_ROOT,
44
+ watch: false,
45
+ })
46
+
47
+ registerRunStatus(ctx)
48
+ registerWorkbench(ctx)
49
+
50
+ // dsh renders only an MCP result's `content` to the model, while Codex returns
51
+ // threadId solely in `structuredContent`. Without this the model cannot continue
52
+ // a review thread, which the hard-tier Debate Protocol requires.
53
+ ctx.on('tools/post-execute', async (exec, result, next) => {
54
+ const decision = await next()
55
+ if (!CODEX_TOOLS.has(exec.name)) return decision
56
+ if (result.isError || decision.kind !== 'accept') return decision
57
+ if (Object.hasOwn(decision, 'value')) return decision
58
+
59
+ const threadId = result.value?.structuredContent?.threadId
60
+ if (typeof threadId !== 'string') return decision
61
+
62
+ // Prefixed and labelled: a spilled or pruned result keeps its head, and the
63
+ // reviewer's own prose is never mistaken for harness metadata. The trailing
64
+ // blank line matters — text blocks reach the model joined with no separator.
65
+ return {
66
+ ...decision,
67
+ content: [
68
+ {
69
+ type: 'text',
70
+ text: `Codex continuation metadata (not part of the reviewer response): threadId=${threadId}\n\n`,
71
+ },
72
+ ...decision.content ?? result.content,
73
+ ],
74
+ }
75
+ })
76
+ }
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Host half of the ARIS run-status view: one read-only RPC that projects the
3
+ * loop's durable artifacts for the browser tab.
4
+ *
5
+ * The artifacts stay canonical. Nothing here caches, writes, or interprets
6
+ * them beyond parsing REVIEW_STATE.json and stat-ing the files ARIS maintains.
7
+ */
8
+
9
+ import { readdir, readFile, stat } from 'node:fs/promises'
10
+ import { isAbsolute, join } from 'node:path'
11
+
12
+ /** Channel the browser half calls. */
13
+ export const ARIS_RPC_CHANNEL = '/aris'
14
+
15
+ /**
16
+ * Artifacts every auto-review-loop run maintains, relative to the workspace.
17
+ * Stage outputs (plan, draft) vary by workflow and are deliberately absent.
18
+ */
19
+ const ARTIFACTS = [
20
+ 'review-stage/REVIEW_STATE.json',
21
+ 'review-stage/AUTO_REVIEW.md',
22
+ 'review-stage/REVIEWER_MEMORY.md',
23
+ 'review-stage/ACQUITTAL_LOG.jsonl',
24
+ ]
25
+
26
+ /** Fields the view reads; anything else in the state file is passed through untouched. */
27
+ const STATE_FILE = 'review-stage/REVIEW_STATE.json'
28
+ const REVIEW_LOG = 'review-stage/AUTO_REVIEW.md'
29
+
30
+ /**
31
+ * The latest round's ranked criticisms, verbatim.
32
+ *
33
+ * Score and verdict already come from the state file, so only the criticisms
34
+ * are lifted — they are what explains why the loop continued or stopped.
35
+ * A log that does not carry the block yields nothing rather than a guess.
36
+ *
37
+ * @returns the criticism lines without their numbering, or undefined.
38
+ */
39
+ async function readCriticisms(workspace) {
40
+ let text
41
+ try {
42
+ text = await readFile(join(workspace, REVIEW_LOG), 'utf8')
43
+ } catch {
44
+ return undefined
45
+ }
46
+ const lines = text.split('\n')
47
+ let start = -1
48
+ for (const [index, line] of lines.entries()) {
49
+ if (/^\s*-\s*Key criticisms/i.test(line)) start = index
50
+ }
51
+ if (start === -1) return undefined
52
+ const items = []
53
+ for (const line of lines.slice(start + 1)) {
54
+ const item = /^\s+\d+\.\s+(.*\S)\s*$/.exec(line)
55
+ if (item === null) break
56
+ items.push(item[1])
57
+ }
58
+ return items.length > 0 ? items : undefined
59
+ }
60
+
61
+ /** @returns `{exists, mtime, size}` for one workspace-relative path. */
62
+ async function describe(workspace, relative) {
63
+ try {
64
+ const info = await stat(join(workspace, relative))
65
+ return { path: relative, exists: true, mtime: info.mtimeMs, size: info.size }
66
+ } catch {
67
+ return { path: relative, exists: false }
68
+ }
69
+ }
70
+
71
+ /** @returns the parsed state file, or an error string the view shows verbatim. */
72
+ async function readState(workspace) {
73
+ let text
74
+ try {
75
+ text = await readFile(join(workspace, STATE_FILE), 'utf8')
76
+ } catch {
77
+ return { state: undefined, stateError: undefined }
78
+ }
79
+ try {
80
+ const parsed = JSON.parse(text)
81
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
82
+ return { state: undefined, stateError: `${STATE_FILE} is not a JSON object` }
83
+ }
84
+ return { state: parsed, stateError: undefined }
85
+ } catch (error) {
86
+ return { state: undefined, stateError: `${STATE_FILE} is not valid JSON: ${error.message}` }
87
+ }
88
+ }
89
+
90
+ /** Where `tools/run_state.py` persists a resumable pipeline run. */
91
+ const RUNS_DIR = '.aris/runs'
92
+
93
+ /**
94
+ * Read the most recently updated pipeline run, if any.
95
+ *
96
+ * A phase's `status` separates what the executor claims from what an
97
+ * independent reviewer accepted: only `accept()` writes `accepted`, and only
98
+ * with a recorded reviewer and verdict id. A `done` phase that never reached
99
+ * `accepted` is an unmet acceptance obligation, and the view says so.
100
+ *
101
+ * @returns the run, or undefined when this workspace has no resumable run.
102
+ */
103
+ async function readPipeline(workspace) {
104
+ let names
105
+ try {
106
+ names = await readdir(join(workspace, RUNS_DIR))
107
+ } catch {
108
+ return undefined
109
+ }
110
+ let newest
111
+ for (const name of names) {
112
+ if (!name.endsWith('.json')) continue
113
+ const path = join(workspace, RUNS_DIR, name)
114
+ let run
115
+ try {
116
+ run = JSON.parse(await readFile(path, 'utf8'))
117
+ } catch {
118
+ continue
119
+ }
120
+ if (typeof run !== 'object' || run === null || !Array.isArray(run.phases)) continue
121
+ if (newest === undefined || String(run.updated ?? '') > String(newest.updated ?? '')) newest = run
122
+ }
123
+ if (newest === undefined) return undefined
124
+ return {
125
+ runId: newest.run_id,
126
+ updated: newest.updated,
127
+ executor: newest.executor_model,
128
+ executorFamily: newest.executor_family,
129
+ phases: newest.phases.map(entry => ({
130
+ phase: entry.phase,
131
+ status: entry.status,
132
+ artifact: entry.artifact ?? undefined,
133
+ reviewer: entry.reviewer ?? undefined,
134
+ reviewerFamily: entry.reviewer_family ?? undefined,
135
+ independence: entry.review_independence ?? undefined,
136
+ verdictId: entry.verdict_id ?? undefined,
137
+ })),
138
+ }
139
+ }
140
+
141
+ /**
142
+ * Register the run-status RPC when a browser connection exists.
143
+ * Headless compositions have no `connection`, so the channel never mounts.
144
+ * @param ctx - the ARIS plugin's context.
145
+ */
146
+ export function registerRunStatus(ctx) {
147
+ ctx.inject(['connection', 'sessions'], (scoped) => {
148
+ scoped.effect(() => scoped.connection.rpc.handle(
149
+ ARIS_RPC_CHANNEL,
150
+ async (endpoint, payload) => {
151
+ if (endpoint !== 'state') {
152
+ return { ok: false, error: { code: 'UNKNOWN_ENDPOINT', message: `unknown ARIS endpoint "${endpoint}"` } }
153
+ }
154
+ const sessionId = typeof payload === 'object' && payload !== null ? payload.sessionId : undefined
155
+ if (typeof sessionId !== 'string') {
156
+ return { ok: false, error: { code: 'BAD_REQUEST', message: 'sessionId is required' } }
157
+ }
158
+ const workspace = scoped.sessions.get(sessionId)?.header?.cwd
159
+ if (typeof workspace !== 'string' || !isAbsolute(workspace)) {
160
+ return { ok: true, value: { workspace: undefined, artifacts: [] } }
161
+ }
162
+ const { state, stateError } = await readState(workspace)
163
+ const pipeline = await readPipeline(workspace)
164
+ const criticisms = await readCriticisms(workspace)
165
+ const artifacts = await Promise.all(ARTIFACTS.map(relative => describe(workspace, relative)))
166
+ return {
167
+ ok: true,
168
+ value: {
169
+ workspace,
170
+ ...state !== undefined ? { state } : {},
171
+ ...stateError !== undefined ? { stateError } : {},
172
+ ...pipeline !== undefined ? { pipeline } : {},
173
+ ...criticisms !== undefined ? { criticisms } : {},
174
+ artifacts,
175
+ readAt: Date.now(),
176
+ },
177
+ }
178
+ },
179
+ { authority: 'loopback' },
180
+ ), 'ARIS run-status RPC')
181
+ })
182
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Optional executor-side scope limits.
3
+ *
4
+ * ARIS's reviewers already carry these limits — the block is embedded in the
5
+ * skills that produce review prompts. Nothing bounds the executor the same way,
6
+ * so this row offers the same contract as a system-prompt section. It is
7
+ * disabled by default: it costs tokens on every request, and whether an
8
+ * executor should be bound is a per-deployment choice.
9
+ *
10
+ * The text is read from the packaged `skills/shared-references/review-scope-limits.md`
11
+ * rather than copied here, so the reviewer path and this one cannot drift apart.
12
+ */
13
+
14
+ import { readFile } from 'node:fs/promises'
15
+ import { fileURLToPath } from 'node:url'
16
+
17
+ export const name = 'aris-scope-limits'
18
+ export const inject = ['systemPrompt']
19
+
20
+ const DOCTRINE = fileURLToPath(
21
+ new URL('../skills/shared-references/review-scope-limits.md', import.meta.url),
22
+ )
23
+
24
+ /** Prompt order: after the harness identity and persona, with tool guidance. */
25
+ const ORDER = 120
26
+
27
+ /** Reviewer-facing framing replaced by executor-facing framing, verbatim otherwise. */
28
+ const PREAMBLE = 'These limits bound what you PROPOSE and build, never what you look for.'
29
+
30
+ /**
31
+ * Lift the canonical block out of the doctrine document.
32
+ * @returns the fenced block's body, or undefined when the document has none.
33
+ */
34
+ function extractBlock(markdown) {
35
+ const fence = /```\n(=== SCOPE LIMITS[\s\S]*?)```/.exec(markdown)
36
+ return fence === null ? undefined : fence[1].trim()
37
+ }
38
+
39
+ export async function apply(ctx) {
40
+ const markdown = await readFile(DOCTRINE, 'utf8')
41
+ const block = extractBlock(markdown)
42
+ if (block === undefined) {
43
+ throw new Error(`aris-scope-limits: no SCOPE LIMITS block in ${DOCTRINE}`)
44
+ }
45
+ ctx.effect(() => ctx.systemPrompt.section({
46
+ name: 'aris:scope-limits',
47
+ order: ORDER,
48
+ text: `${PREAMBLE}\n\n${block}`,
49
+ }), 'ARIS executor scope limits')
50
+ }
@@ -0,0 +1,291 @@
1
+ /**
2
+ * ARIS workbench — host half.
3
+ *
4
+ * Read-only RPC projections over the ARIS artifacts for the workbench view:
5
+ * pipeline/review state, idea board, experiment runs, research-wiki graph,
6
+ * plus the packaged skill corpus and a best-effort launch (inject a prompt
7
+ * into a live session and wake its driver).
8
+ */
9
+
10
+ import { readdir, readFile, stat } from 'node:fs/promises'
11
+ import { isAbsolute, join } from 'node:path'
12
+
13
+ export const WORKBENCH_RPC_CHANNEL = '/aris-wb'
14
+
15
+ const WIKI_DIRS = ['papers', 'ideas', 'experiments', 'claims']
16
+ const SKILL_ROOT = new URL('../skills/', import.meta.url)
17
+ const TICK = String.fromCharCode(96)
18
+
19
+ async function readText(workspace, rel) {
20
+ try { return await readFile(join(workspace, rel), 'utf8') } catch { return undefined }
21
+ }
22
+
23
+ async function readJson(workspace, rel) {
24
+ try { return JSON.parse(await readFile(join(workspace, rel), 'utf8')) } catch { return undefined }
25
+ }
26
+
27
+ async function statFile(workspace, rel) {
28
+ try {
29
+ const info = await stat(join(workspace, rel))
30
+ return { exists: true, mtime: info.mtimeMs, size: info.size }
31
+ } catch {
32
+ return { exists: false }
33
+ }
34
+ }
35
+
36
+ async function listDir(workspace, rel) {
37
+ try { return (await readdir(join(workspace, rel))).sort() } catch { return undefined }
38
+ }
39
+
40
+ function summarizeMarkdown(text, maxLines) {
41
+ if (text === undefined) return undefined
42
+ const lines = text.split(String.fromCharCode(10))
43
+ return { totalLines: lines.length, head: lines.slice(0, maxLines) }
44
+ }
45
+
46
+ async function readPipeline(workspace) {
47
+ const names = await listDir(workspace, '.aris/runs')
48
+ if (names === undefined) return undefined
49
+ let newest
50
+ for (const name of names) {
51
+ if (!name.endsWith('.json')) continue
52
+ const run = await readJson(workspace, '.aris/runs/' + name)
53
+ if (run === undefined || typeof run !== 'object' || !Array.isArray(run.phases)) continue
54
+ if (newest === undefined || String(run.updated ?? '') > String(newest.updated ?? '')) newest = run
55
+ }
56
+ if (newest === undefined) return undefined
57
+ return {
58
+ runId: newest.run_id,
59
+ updated: newest.updated,
60
+ executor: newest.executor_model,
61
+ executorFamily: newest.executor_family,
62
+ phases: newest.phases.map(entry => ({
63
+ phase: entry.phase,
64
+ status: entry.status,
65
+ artifact: entry.artifact ?? undefined,
66
+ reviewer: entry.reviewer ?? undefined,
67
+ reviewerFamily: entry.reviewer_family ?? undefined,
68
+ independence: entry.review_independence ?? undefined,
69
+ })),
70
+ }
71
+ }
72
+
73
+ async function readWiki(workspace) {
74
+ const entities = {}
75
+ for (const kind of WIKI_DIRS) {
76
+ const names = await listDir(workspace, 'research-wiki/' + kind)
77
+ if (names === undefined) continue
78
+ const files = []
79
+ for (const name of names) {
80
+ if (!name.endsWith('.md')) continue
81
+ const text = await readText(workspace, 'research-wiki/' + kind + '/' + name)
82
+ files.push({
83
+ name,
84
+ lines: text === undefined ? 0 : text.split(String.fromCharCode(10)).length,
85
+ head: text === undefined ? undefined : text.split(String.fromCharCode(10)).slice(0, 8),
86
+ })
87
+ }
88
+ entities[kind] = files
89
+ }
90
+ const edgesText = await readText(workspace, 'research-wiki/graph/edges.jsonl')
91
+ const edges = []
92
+ if (edgesText !== undefined) {
93
+ for (const line of edgesText.split(String.fromCharCode(10))) {
94
+ const trimmed = line.trim()
95
+ if (trimmed === '') continue
96
+ try { edges.push(JSON.parse(trimmed)) } catch { edges.push({ raw: trimmed }) }
97
+ }
98
+ }
99
+ const extras = {}
100
+ for (const rel of ['index.md', 'query_pack.md', 'gap_map.md', 'log.md']) {
101
+ extras[rel] = await statFile(workspace, 'research-wiki/' + rel)
102
+ }
103
+ return { entities, edges: edges.slice(0, 300), edgeCount: edges.length, extras }
104
+ }
105
+
106
+ async function readIdeaBoard(workspace) {
107
+ const board = {}
108
+ for (const rel of ['IDEA_REPORT.md', 'idea-stage/IDEA_REPORT.md']) {
109
+ const text = await readText(workspace, rel)
110
+ if (text !== undefined) board[rel] = summarizeMarkdown(text, 40)
111
+ }
112
+ for (const rel of ['refine-logs/FINAL_PROPOSAL.md', 'refine-logs/EXPERIMENT_PLAN.md', 'refine-logs/REFINE_LOOP.md']) {
113
+ const text = await readText(workspace, rel)
114
+ if (text !== undefined) board[rel] = summarizeMarkdown(text, 30)
115
+ }
116
+ board.refineLogsDir = await listDir(workspace, 'refine-logs')
117
+ return board
118
+ }
119
+
120
+ async function readExperiments(workspace) {
121
+ const runs = []
122
+ const names = await listDir(workspace, '.aris/runs')
123
+ if (names !== undefined) {
124
+ for (const name of names) {
125
+ if (!name.endsWith('.json')) continue
126
+ const run = await readJson(workspace, '.aris/runs/' + name)
127
+ if (run === undefined) continue
128
+ runs.push({
129
+ name,
130
+ runId: run.run_id,
131
+ updated: run.updated,
132
+ executor: run.executor_model,
133
+ phases: Array.isArray(run.phases) ? run.phases.map(p => ({ phase: p.phase, status: p.status })) : undefined,
134
+ })
135
+ }
136
+ }
137
+ const wikiExps = []
138
+ const expNames = await listDir(workspace, 'research-wiki/experiments')
139
+ if (expNames !== undefined) {
140
+ for (const n of expNames) if (n.endsWith('.md')) wikiExps.push(n)
141
+ }
142
+ return { runs: runs.slice(0, 20), wikiExperiments: wikiExps }
143
+ }
144
+
145
+ async function readSkillMeta(name) {
146
+ try {
147
+ const text = await readFile(new URL(name + '/SKILL.md', SKILL_ROOT), 'utf8')
148
+ const m = /^---\n([\s\S]*?)\n---/.exec(text)
149
+ if (!m) return { name }
150
+ const out = { name }
151
+ for (const line of m[1].split(String.fromCharCode(10))) {
152
+ const mm = /^([a-zA-Z0-9-]+):\s*(.*)$/.exec(line)
153
+ if (!mm) continue
154
+ const key = mm[1] === 'argument-hint' ? 'argumentHint' : mm[1]
155
+ out[key] = mm[2].trim().replace(/^\"|\"$/g, '')
156
+ }
157
+ return out
158
+ } catch {
159
+ return { name }
160
+ }
161
+ }
162
+
163
+ async function readSkills() {
164
+ const names = []
165
+ try {
166
+ const entries = await readdir(SKILL_ROOT)
167
+ for (const name of entries) {
168
+ if (name.startsWith('.')) continue
169
+ try {
170
+ const info = await stat(new URL(name + '/SKILL.md', SKILL_ROOT))
171
+ if (info.isFile()) names.push(name)
172
+ } catch { /* not a skill dir */ }
173
+ }
174
+ } catch { /* no skills */ }
175
+ names.sort()
176
+ const skills = []
177
+ for (const name of names) skills.push(await readSkillMeta(name))
178
+ return skills
179
+ }
180
+
181
+ export function registerWorkbench(ctx) {
182
+ ctx.inject(['connection', 'sessions', 'agents'], (scoped) => {
183
+ scoped.effect(() => scoped.connection.rpc.handle(
184
+ WORKBENCH_RPC_CHANNEL,
185
+ async (endpoint, payload) => {
186
+ if (endpoint === 'sessions') {
187
+ try {
188
+ const list = scoped.sessions.list().map(s => ({ id: s.id, cwd: s.header?.cwd ?? undefined }))
189
+ return { ok: true, value: { sessions: list } }
190
+ } catch (error) {
191
+ return { ok: false, error: { code: 'internal', message: String(error && error.message || error), details: {} } }
192
+ }
193
+ }
194
+ if (endpoint === 'skills') {
195
+ try {
196
+ const skills = await readSkills()
197
+ return { ok: true, value: { skills: skills } }
198
+ } catch (error) {
199
+ console.error('[aris-wb] skills failed:', error)
200
+ return { ok: false, error: { code: 'internal', message: String(error && error.message || error), details: {} } }
201
+ }
202
+ }
203
+ const sessionId = typeof payload === 'object' && payload !== null ? payload.sessionId : undefined
204
+ if (typeof sessionId !== 'string') {
205
+ return { ok: false, error: { code: 'bad-request', message: 'sessionId is required', details: {} } }
206
+ }
207
+ const workspace = scoped.sessions.get(sessionId)?.header?.cwd
208
+ if (typeof workspace !== 'string' || !isAbsolute(workspace)) {
209
+ return { ok: true, value: { workspace: undefined } }
210
+ }
211
+ try {
212
+ switch (endpoint) {
213
+ case 'overview': {
214
+ const state = await readJson(workspace, 'review-stage/REVIEW_STATE.json')
215
+ const pipeline = await readPipeline(workspace)
216
+ const artifacts = {}
217
+ for (const rel of [
218
+ 'review-stage/REVIEW_STATE.json',
219
+ 'review-stage/AUTO_REVIEW.md',
220
+ 'review-stage/REVIEWER_MEMORY.md',
221
+ 'review-stage/ACQUITTAL_LOG.jsonl',
222
+ 'IDEA_REPORT.md',
223
+ 'idea-stage/IDEA_REPORT.md',
224
+ 'refine-logs/FINAL_PROPOSAL.md',
225
+ 'refine-logs/EXPERIMENT_PLAN.md',
226
+ 'research-wiki/index.md',
227
+ 'research-wiki/query_pack.md',
228
+ ]) {
229
+ artifacts[rel] = await statFile(workspace, rel)
230
+ }
231
+ return { ok: true, value: { workspace, state, pipeline, artifacts } }
232
+ }
233
+ case 'wiki': {
234
+ return { ok: true, value: await readWiki(workspace) }
235
+ }
236
+ case 'ideas': {
237
+ return { ok: true, value: await readIdeaBoard(workspace) }
238
+ }
239
+ case 'experiments': {
240
+ return { ok: true, value: await readExperiments(workspace) }
241
+ }
242
+ case 'launch': {
243
+ const skill = typeof payload === 'object' && payload !== null ? payload.skill : undefined
244
+ const args = typeof payload === 'object' && payload !== null ? payload.args : undefined
245
+ if (typeof skill !== 'string' || skill === '') {
246
+ return { ok: false, error: { code: 'bad-request', message: 'skill is required', details: {} } }
247
+ }
248
+ const argText = typeof args === 'string' && args.trim() !== '' ? ' 参数/方向:' + args.trim() : ''
249
+ const prompt = '请使用 ARIS 技能 ' + TICK + skill + TICK + ' 完成对应工作流。' + argText
250
+ const messageId = 'aris-launch-' + Date.now() + '-' + Math.random().toString(36).slice(2, 8)
251
+ const message = {
252
+ id: messageId,
253
+ role: 'user',
254
+ content: [{ type: 'text', text: prompt }],
255
+ source: { kind: 'plugin', plugin: 'dsh-aris' },
256
+ }
257
+ let injected = false
258
+ let method = 'none'
259
+ try {
260
+ const agent = scoped.agents && typeof scoped.agents.get === 'function' ? scoped.agents.get(sessionId) : undefined
261
+ if (agent && typeof agent.send === 'function') {
262
+ agent.send(message, 'next-turn', true)
263
+ injected = true
264
+ method = 'agent.send'
265
+ }
266
+ } catch (e) { /* fall through to session.append */ }
267
+ if (!injected) {
268
+ try {
269
+ const session = scoped.sessions.get(sessionId)
270
+ if (session && typeof session.append === 'function') {
271
+ session.append('user/message', message)
272
+ injected = true
273
+ method = 'session.append'
274
+ }
275
+ } catch (e) {
276
+ return { ok: false, error: { code: 'internal', message: String(e && e.message || e), details: {} } }
277
+ }
278
+ }
279
+ return { ok: true, value: { injected, method, prompt, sessionId, messageId } }
280
+ }
281
+ default:
282
+ return { ok: false, error: { code: 'internal', message: 'unknown ARIS workbench endpoint \"' + endpoint + '\"' } }
283
+ }
284
+ } catch (error) {
285
+ return { ok: false, error: { code: 'internal', message: String(error && error.message || error), details: {} } }
286
+ }
287
+ },
288
+ { authority: 'loopback' },
289
+ ), 'ARIS workbench RPC')
290
+ })
291
+ }