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,591 @@
1
+ #!/usr/bin/env bash
2
+ # ARIS Smart Skill Update
3
+ # Intelligently compares local skills with upstream, detects personal
4
+ # customizations, and recommends safe update strategy per skill.
5
+ #
6
+ # Usage:
7
+ # Global (default):
8
+ # bash tools/smart_update.sh [--apply]
9
+ # Project-level (Claude Code):
10
+ # bash tools/smart_update.sh --project <path> [--apply]
11
+ # Project-level (Codex CLI):
12
+ # bash tools/smart_update.sh --project <path> --target-subdir .agents/skills/aris [--apply]
13
+ # Custom paths:
14
+ # bash tools/smart_update.sh --upstream <path> --local <path> [--apply]
15
+ #
16
+ # --apply: actually perform the updates (default: dry-run analysis only)
17
+ # --project <path>: project root — upstream from repo, local from <path>/<target-subdir>
18
+ # --target-subdir <relative>: project-mode skill subdirectory (default: .claude/skills)
19
+ # common values: .claude/skills, .claude/skills/aris,
20
+ # .agents/skills, .agents/skills/aris
21
+ # must be a relative path
22
+ # --upstream <path>: explicit upstream skills directory
23
+ # --local <path>: explicit local skills directory
24
+ #
25
+ # New-skill policy (--apply only; dry-run always just reports):
26
+ # default (TTY, no policy flag): each new upstream skill is confirmed one by
27
+ # one [y/N]; a decline is remembered in
28
+ # <local>/.aris-declined.txt and never re-asked
29
+ # --add-new: install every new skill (does NOT un-decline previously
30
+ # declined skills — edit/clear .aris-declined.txt for that)
31
+ # --skip-new: skip every new skill without recording a decline (same as the
32
+ # automatic behavior when there is no TTY)
33
+ #
34
+ # On successful --apply, writes $HOME/.aris/repo <- this repo's root (helper
35
+ # resolution chain layer 4, #366) so copy-installed skills can find tools/.
36
+
37
+ set -euo pipefail
38
+
39
+ # ─── Parse arguments ───────────────────────────────────────────────────────────
40
+ APPLY=false
41
+ MODE="global"
42
+ PROJECT_PATH=""
43
+ TARGET_SUBDIR=".claude/skills"
44
+ CUSTOM_UPSTREAM=""
45
+ CUSTOM_LOCAL=""
46
+ NEW_POLICY="" # "" (prompt) | add | skip
47
+
48
+ while [[ $# -gt 0 ]]; do
49
+ case "$1" in
50
+ --apply)
51
+ APPLY=true
52
+ shift
53
+ ;;
54
+ --add-new)
55
+ NEW_POLICY="add"
56
+ shift
57
+ ;;
58
+ --skip-new)
59
+ NEW_POLICY="skip"
60
+ shift
61
+ ;;
62
+ --project)
63
+ MODE="project"
64
+ PROJECT_PATH="${2:?--project requires a path argument}"
65
+ shift 2
66
+ ;;
67
+ --target-subdir)
68
+ TARGET_SUBDIR="${2:?--target-subdir requires a relative path argument}"
69
+ if [[ "$TARGET_SUBDIR" == /* ]]; then
70
+ echo "Error: --target-subdir must be a relative path (got: $TARGET_SUBDIR)" >&2
71
+ echo "Hint: use --local for absolute paths" >&2
72
+ exit 1
73
+ fi
74
+ shift 2
75
+ ;;
76
+ --upstream)
77
+ MODE="explicit"
78
+ CUSTOM_UPSTREAM="${2:?--upstream requires a path argument}"
79
+ shift 2
80
+ ;;
81
+ --local)
82
+ MODE="explicit"
83
+ CUSTOM_LOCAL="${2:?--local requires a path argument}"
84
+ shift 2
85
+ ;;
86
+ *)
87
+ echo "Unknown argument: $1"
88
+ echo "Usage: bash tools/smart_update.sh [--apply] [--add-new|--skip-new] [--project <path> [--target-subdir <rel>]] [--upstream <path> --local <path>]"
89
+ exit 1
90
+ ;;
91
+ esac
92
+ done
93
+
94
+ # ─── Resolve paths ─────────────────────────────────────────────────────────────
95
+ REPO_SKILLS_DIR="$(cd "$(dirname "$0")/.." && pwd)/skills"
96
+
97
+ case "$MODE" in
98
+ project)
99
+ # Resolve project path
100
+ if [[ "$PROJECT_PATH" == /* ]]; then
101
+ PROJECT_ROOT="$PROJECT_PATH"
102
+ else
103
+ PROJECT_ROOT="$(cd "$PROJECT_PATH" && pwd)"
104
+ fi
105
+ # Upstream always from repo
106
+ UPSTREAM_DIR="$REPO_SKILLS_DIR"
107
+ LOCAL_DIR="$PROJECT_ROOT/$TARGET_SUBDIR"
108
+ SCOPE="Project: $PROJECT_ROOT (subdir: $TARGET_SUBDIR)"
109
+
110
+ # Platform marker auto-detect: warn on mismatch (never silently switch)
111
+ HAS_CLAUDE_MARKERS=false
112
+ HAS_CODEX_MARKERS=false
113
+ [[ -e "$PROJECT_ROOT/CLAUDE.md" || -e "$PROJECT_ROOT/.claude/skills" || -e "$PROJECT_ROOT/.claude/settings.json" ]] && HAS_CLAUDE_MARKERS=true
114
+ [[ -e "$PROJECT_ROOT/AGENTS.md" || -e "$PROJECT_ROOT/.agents/skills" || -e "$PROJECT_ROOT/.codex/config.toml" ]] && HAS_CODEX_MARKERS=true
115
+ if $HAS_CLAUDE_MARKERS && ! $HAS_CODEX_MARKERS && [[ "$TARGET_SUBDIR" == .agents/* ]]; then
116
+ echo -e "\033[1;33m⚠️ Warning: project has Claude markers but --target-subdir points to Codex path ($TARGET_SUBDIR)\033[0m" >&2
117
+ fi
118
+ if $HAS_CODEX_MARKERS && ! $HAS_CLAUDE_MARKERS && [[ "$TARGET_SUBDIR" == .claude/* ]]; then
119
+ echo -e "\033[1;33m⚠️ Warning: project has Codex markers but --target-subdir points to Claude path ($TARGET_SUBDIR)\033[0m" >&2
120
+ fi
121
+ ;;
122
+ explicit)
123
+ if [[ -z "$CUSTOM_UPSTREAM" ]] || [[ -z "$CUSTOM_LOCAL" ]]; then
124
+ echo "Error: --upstream and --local must both be specified"
125
+ exit 1
126
+ fi
127
+ UPSTREAM_DIR="$CUSTOM_UPSTREAM"
128
+ LOCAL_DIR="$CUSTOM_LOCAL"
129
+ SCOPE="Custom"
130
+ ;;
131
+ *)
132
+ # Global default
133
+ UPSTREAM_DIR="$REPO_SKILLS_DIR"
134
+ LOCAL_DIR="${HOME}/.claude/skills"
135
+ SCOPE="Global"
136
+ ;;
137
+ esac
138
+
139
+ # ─── Deprecate nested --target-subdir (.claude/skills/aris, .agents/skills/aris) ──
140
+ # Nested install hides skills from Claude Code's slash-command discovery (it scans
141
+ # only one level deep). The replacement is the flat install via install_aris.sh.
142
+ if [[ "$TARGET_SUBDIR" == ".claude/skills/aris" || "$TARGET_SUBDIR" == ".agents/skills/aris" ]]; then
143
+ REPO_ROOT_FOR_HINT="$(cd "$(dirname "$0")/.." && pwd)"
144
+ echo "" >&2
145
+ echo -e "\033[1;33m⚠️ --target-subdir $TARGET_SUBDIR is DEPRECATED\033[0m" >&2
146
+ echo "" >&2
147
+ echo " Reason: the nested 'aris/' subdirectory hides skills from Claude Code's" >&2
148
+ echo " slash-command discovery (which only scans .claude/skills/ one level deep)." >&2
149
+ echo "" >&2
150
+ echo " Switch to the flat install (auto-reconciles new/removed skills on re-run):" >&2
151
+ echo " bash $REPO_ROOT_FOR_HINT/tools/install_aris.sh \"${PROJECT_PATH:-<project>}\"" >&2
152
+ echo "" >&2
153
+ echo " To migrate an existing nested install:" >&2
154
+ echo " bash $REPO_ROOT_FOR_HINT/tools/install_aris.sh \"${PROJECT_PATH:-<project>}\" --from-old" >&2
155
+ echo " (for COPY-style installs, also pass --migrate-copy keep-user|prefer-upstream)" >&2
156
+ echo "" >&2
157
+ if $APPLY; then
158
+ echo -e "\033[0;31mRefusing to --apply with deprecated nested target. Use install_aris.sh instead.\033[0m" >&2
159
+ exit 2
160
+ fi
161
+ echo "(continuing dry-run analysis for backward compatibility — no changes will be made)" >&2
162
+ echo "" >&2
163
+ fi
164
+
165
+ # ─── Refuse to operate on symlinked installs (those use install_aris.sh, not smart_update) ──
166
+ if [[ -L "$LOCAL_DIR" ]]; then
167
+ LINK_TARGET="$(readlink "$LOCAL_DIR")"
168
+ REPO_ROOT_FOR_HINT="$(cd "$(dirname "$0")/.." && pwd)"
169
+ echo "" >&2
170
+ echo -e "\033[0;31m✗ Local skill directory is a symlink: $LOCAL_DIR\033[0m" >&2
171
+ echo " → $LINK_TARGET" >&2
172
+ echo "" >&2
173
+ echo "smart_update is for COPIED installs. Symlinked installs are managed by install_aris.sh:" >&2
174
+ echo " cd <aris-repo> && git pull # updates content of existing skills" >&2
175
+ echo " bash $REPO_ROOT_FOR_HINT/tools/install_aris.sh <project> # reconciles new/removed skills" >&2
176
+ echo "" >&2
177
+ exit 2
178
+ fi
179
+
180
+ # install_aris.sh creates flat PER-SKILL symlinks (the root dir is real), so
181
+ # the root-symlink check above can't see a managed flat install. The manifest
182
+ # is the authoritative marker — refuse project-mode updates when one exists.
183
+ if [[ "$MODE" == "project" && -f "$PROJECT_ROOT/.aris/installed-skills.txt" ]]; then
184
+ REPO_ROOT_FOR_HINT="$(cd "$(dirname "$0")/.." && pwd)"
185
+ echo "" >&2
186
+ echo -e "\033[0;31m✗ Managed symlink install detected (manifest: $PROJECT_ROOT/.aris/installed-skills.txt)\033[0m" >&2
187
+ echo "" >&2
188
+ echo "smart_update is for COPIED installs. This project is managed by install_aris.sh:" >&2
189
+ echo " cd <aris-repo> && git pull # updates content of existing skills" >&2
190
+ echo " bash $REPO_ROOT_FOR_HINT/tools/install_aris.sh \"$PROJECT_ROOT\" # reconciles new/removed skills" >&2
191
+ echo "" >&2
192
+ exit 2
193
+ fi
194
+
195
+ # Colors
196
+ RED='\033[0;31m'
197
+ GREEN='\033[0;32m'
198
+ YELLOW='\033[1;33m'
199
+ BLUE='\033[0;34m'
200
+ NC='\033[0m'
201
+
202
+ # Personal info patterns (paths, IPs, API keys, usernames, server configs)
203
+ PERSONAL_PATTERNS=(
204
+ 'ssh '
205
+ 'SJTUServer'
206
+ 'rfyang'
207
+ 'yangruofeng'
208
+ 'api_key'
209
+ 'API_KEY'
210
+ 'sk-'
211
+ 'token'
212
+ '@sjtu'
213
+ '@gmail'
214
+ '/home/'
215
+ '/Users/'
216
+ 'CUDA_VISIBLE'
217
+ 'wandb_project'
218
+ 'server_ip'
219
+ 'gpu_server'
220
+ 'screen -'
221
+ 'conda activate'
222
+ '192\.168\.'
223
+ '10\.\d+\.'
224
+ '122\.'
225
+ )
226
+
227
+ # ─── Stale-pristine detection ──────────────────────────────────────────────────
228
+ # A local SKILL.md that is byte-identical to SOME older committed upstream
229
+ # version is NOT a user customization — it is just a stale install. This matters
230
+ # because old releases occasionally contained lines (since redacted upstream)
231
+ # that trip PERSONAL_PATTERNS; without this check such installs get stuck in
232
+ # "needs manual merge" forever even though a plain overwrite is exactly right.
233
+ # Requires the upstream dir to live inside a git clone; otherwise we skip the
234
+ # check and keep the conservative needs-merge classification.
235
+ REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
236
+ GIT_HISTORY_OK=false
237
+ if git -C "$REPO_ROOT" rev-parse --git-dir >/dev/null 2>&1; then
238
+ GIT_HISTORY_OK=true
239
+ fi
240
+
241
+ # ─── New-skill confirmation state (declined list + group catalog lookup) ──────
242
+ CATALOG_PATH="$REPO_ROOT/tools/skill-groups.tsv"
243
+ DECLINED_FILE="$LOCAL_DIR/.aris-declined.txt"
244
+
245
+ is_declined() { # $1 = skill name
246
+ [[ -f "$DECLINED_FILE" ]] && grep -qxF "$1" "$DECLINED_FILE"
247
+ }
248
+
249
+ catalog_group_of() { # $1 = skill name -> group id, or "?" if unknown
250
+ local g=""
251
+ [[ -f "$CATALOG_PATH" ]] && g=$(awk -F'\t' -v s="$1" '$1=="skill" && $2==s {print $3; exit}' "$CATALOG_PATH")
252
+ echo "${g:-?}"
253
+ }
254
+
255
+ # Layer-4 helper resolution (#366): a global pointer file lets globally/copy-
256
+ # installed skills find $ARIS_REPO/tools without a per-project install.
257
+ ensure_global_pointer() {
258
+ local pointer="$HOME/.aris/repo"
259
+ mkdir -p "$(dirname "$pointer")" 2>/dev/null || return 0
260
+ local cur=""
261
+ [[ -f "$pointer" ]] && cur="$(cat "$pointer" 2>/dev/null || true)"
262
+ [[ "$cur" == "$REPO_ROOT" ]] && return 0
263
+ printf '%s\n' "$REPO_ROOT" > "$pointer.tmp.$$" && mv -f "$pointer.tmp.$$" "$pointer"
264
+ }
265
+
266
+ is_pristine_historical_copy() {
267
+ # $1 = local file, $2 = repo-relative path of its upstream counterpart
268
+ $GIT_HISTORY_OK || return 1
269
+ local lf="$1" rel="$2" local_hash commits c blob
270
+ local_hash=$(git -C "$REPO_ROOT" hash-object "$lf" 2>/dev/null) || return 1
271
+ commits=$(git -C "$REPO_ROOT" log --format='%H' -n 200 -- "$rel" 2>/dev/null) || return 1
272
+ for c in $commits; do
273
+ blob=$(git -C "$REPO_ROOT" rev-parse -q --verify "$c:$rel" 2>/dev/null) || continue
274
+ if [[ "$blob" == "$local_hash" ]]; then
275
+ return 0
276
+ fi
277
+ done
278
+ return 1
279
+ }
280
+
281
+ echo -e "${BLUE}━━━ ARIS Smart Skill Update ━━━${NC}"
282
+ echo -e "Scope: ${SCOPE}"
283
+ echo -e "Upstream: ${UPSTREAM_DIR}"
284
+ echo -e "Local: ${LOCAL_DIR}"
285
+ echo ""
286
+
287
+ if [[ ! -d "$UPSTREAM_DIR" ]]; then
288
+ echo -e "${RED}Upstream skills directory not found: ${UPSTREAM_DIR}${NC}"
289
+ exit 1
290
+ fi
291
+
292
+ if [[ ! -d "$LOCAL_DIR" ]]; then
293
+ echo -e "${RED}Local skills directory not found: ${LOCAL_DIR}${NC}"
294
+ exit 1
295
+ fi
296
+
297
+ # Counters
298
+ NEW=0
299
+ IDENTICAL=0
300
+ SAFE_UPDATE=0
301
+ NEEDS_MERGE=0
302
+ LOCAL_ONLY=0
303
+
304
+ # Results arrays
305
+ declare -a NEW_SKILLS=()
306
+ declare -a IDENTICAL_SKILLS=()
307
+ declare -a SAFE_SKILLS=()
308
+ declare -a MERGE_SKILLS=()
309
+ declare -a LOCAL_SKILLS=()
310
+ declare -a STALE_PRISTINE_SKILLS=()
311
+
312
+ # Track upstream skill names for local-only detection
313
+ declare -a UPSTREAM_NAMES=()
314
+
315
+ # Check each upstream skill
316
+ for skill_dir in "$UPSTREAM_DIR"/*/; do
317
+ skill_name=$(basename "$skill_dir")
318
+ [[ "$skill_name" == "skills-codex" ]] && continue # skip codex mirror
319
+ [[ "$skill_name" == "shared-references" ]] && continue # handled separately
320
+
321
+ UPSTREAM_NAMES+=("$skill_name")
322
+
323
+ local_skill="$LOCAL_DIR/$skill_name"
324
+ upstream_file="$skill_dir/SKILL.md"
325
+
326
+ if [[ ! -f "$upstream_file" ]]; then
327
+ continue
328
+ fi
329
+
330
+ if [[ ! -d "$local_skill" ]]; then
331
+ # New skill — doesn't exist locally
332
+ NEW=$((NEW + 1))
333
+ NEW_SKILLS+=("$skill_name")
334
+ continue
335
+ fi
336
+
337
+ local_file="$local_skill/SKILL.md"
338
+ if [[ ! -f "$local_file" ]]; then
339
+ NEW=$((NEW + 1))
340
+ NEW_SKILLS+=("$skill_name")
341
+ continue
342
+ fi
343
+
344
+ # Compare
345
+ if diff -q "$upstream_file" "$local_file" > /dev/null 2>&1; then
346
+ # Identical
347
+ IDENTICAL=$((IDENTICAL + 1))
348
+ IDENTICAL_SKILLS+=("$skill_name")
349
+ continue
350
+ fi
351
+
352
+ # Different — check if local has personal info
353
+ has_personal=false
354
+ for pattern in "${PERSONAL_PATTERNS[@]}"; do
355
+ # Check if the LOCAL version has lines matching personal patterns
356
+ # that the UPSTREAM version does NOT have
357
+ local_matches=$(grep -c "$pattern" "$local_file" 2>/dev/null || true)
358
+ local_matches=${local_matches:-0}
359
+ upstream_matches=$(grep -c "$pattern" "$upstream_file" 2>/dev/null || true)
360
+ upstream_matches=${upstream_matches:-0}
361
+ if [[ $local_matches -gt $upstream_matches ]]; then
362
+ has_personal=true
363
+ break
364
+ fi
365
+ done
366
+
367
+ if $has_personal; then
368
+ if is_pristine_historical_copy "$local_file" "skills/$skill_name/SKILL.md"; then
369
+ # Byte-identical to an older committed upstream version — the
370
+ # pattern hits are old upstream content (since redacted), not a
371
+ # user customization. Plain overwrite is the correct resolution.
372
+ SAFE_UPDATE=$((SAFE_UPDATE + 1))
373
+ SAFE_SKILLS+=("$skill_name")
374
+ STALE_PRISTINE_SKILLS+=("$skill_name")
375
+ else
376
+ # Has personal customizations — needs careful merge
377
+ NEEDS_MERGE=$((NEEDS_MERGE + 1))
378
+ MERGE_SKILLS+=("$skill_name")
379
+ fi
380
+ else
381
+ # Changed upstream, no personal info in local — safe to replace
382
+ SAFE_UPDATE=$((SAFE_UPDATE + 1))
383
+ SAFE_SKILLS+=("$skill_name")
384
+ fi
385
+ done
386
+
387
+ # Check for local-only skills (not in upstream)
388
+ for skill_dir in "$LOCAL_DIR"/*/; do
389
+ skill_name=$(basename "$skill_dir")
390
+ [[ "$skill_name" == "shared-references" ]] && continue
391
+ found=false
392
+ for uname in "${UPSTREAM_NAMES[@]:-}"; do
393
+ if [[ "$uname" == "$skill_name" ]]; then
394
+ found=true
395
+ break
396
+ fi
397
+ done
398
+ if ! $found; then
399
+ LOCAL_ONLY=$((LOCAL_ONLY + 1))
400
+ LOCAL_SKILLS+=("$skill_name")
401
+ fi
402
+ done
403
+
404
+ # Report
405
+ echo -e "${GREEN}✅ Identical (no action needed): ${IDENTICAL}${NC}"
406
+ for s in "${IDENTICAL_SKILLS[@]:-}"; do [[ -n "$s" ]] && echo " $s"; done
407
+ echo ""
408
+
409
+ # Pre-declined subset of NEW_SKILLS (informational only in dry-run — the
410
+ # decision of what to install/skip/prompt is only made inside the --apply block).
411
+ declare -a NEW_PREDECLINED_SKILLS=()
412
+ for s in "${NEW_SKILLS[@]:-}"; do
413
+ [[ -n "$s" ]] || continue
414
+ is_declined "$s" && NEW_PREDECLINED_SKILLS+=("$s")
415
+ done
416
+
417
+ echo -e "${GREEN}🆕 New skills upstream (confirmed one-by-one on --apply, unless --add-new/--skip-new): ${NEW}${NC}"
418
+ for s in "${NEW_SKILLS[@]:-}"; do
419
+ [[ -n "$s" ]] || continue
420
+ if is_declined "$s"; then
421
+ echo -e " $s ${YELLOW}(previously declined — stays skipped unless --add-new)${NC}"
422
+ else
423
+ echo " $s"
424
+ fi
425
+ done
426
+ echo ""
427
+
428
+ echo -e "${BLUE}🔄 Updated upstream, no personal info (safe to replace): ${SAFE_UPDATE}${NC}"
429
+ for s in "${SAFE_SKILLS[@]:-}"; do
430
+ [[ -n "$s" ]] || continue
431
+ is_stale=false
432
+ for sp in "${STALE_PRISTINE_SKILLS[@]:-}"; do
433
+ [[ "$sp" == "$s" ]] && is_stale=true && break
434
+ done
435
+ if $is_stale; then
436
+ echo -e " $s ${BLUE}(stale pristine copy of an older release — old upstream lines trip the personal-info patterns, but it carries no local edits)${NC}"
437
+ else
438
+ echo " $s"
439
+ fi
440
+ done
441
+ echo ""
442
+
443
+ echo -e "${YELLOW}⚠️ Updated upstream + local customizations (needs manual merge): ${NEEDS_MERGE}${NC}"
444
+ for s in "${MERGE_SKILLS[@]:-}"; do
445
+ [[ -n "$s" ]] && echo " $s"
446
+ if [[ -n "$s" ]]; then
447
+ # Show what personal patterns were found
448
+ local_file="$LOCAL_DIR/$s/SKILL.md"
449
+ for pattern in "${PERSONAL_PATTERNS[@]}"; do
450
+ # `|| true`: under `set -euo pipefail` this assignment would otherwise
451
+ # abort the whole script — grep exits 1 on no-match, and even on a match
452
+ # `head -1` closes the pipe early so grep dies with SIGPIPE (141). Either
453
+ # way pipefail propagates the failure and `set -e` kills the run *before*
454
+ # the Summary and the apply block, so `--apply` silently writes nothing
455
+ # whenever a skill is flagged "needs merge".
456
+ match=$(grep -n "$pattern" "$local_file" 2>/dev/null | head -1 || true)
457
+ if [[ -n "$match" ]]; then
458
+ echo -e " ${YELLOW}→ contains: ${match}${NC}"
459
+ break
460
+ fi
461
+ done
462
+ fi
463
+ done
464
+ echo ""
465
+
466
+ echo -e "${NC}📦 Local-only skills (yours, not in upstream): ${LOCAL_ONLY}"
467
+ for s in "${LOCAL_SKILLS[@]:-}"; do [[ -n "$s" ]] && echo " $s"; done
468
+ echo ""
469
+
470
+ # Summary
471
+ TOTAL=$((NEW + IDENTICAL + SAFE_UPDATE + NEEDS_MERGE))
472
+ echo -e "${BLUE}━━━ Summary ━━━${NC}"
473
+ echo -e "Total upstream skills: $TOTAL"
474
+ echo -e " ${GREEN}Up to date: $IDENTICAL${NC}"
475
+ echo -e " ${GREEN}New upstream: $NEW${NC} (requires confirmation on --apply; ${#NEW_PREDECLINED_SKILLS[@]} previously declined)"
476
+ echo -e " ${BLUE}Safe update: $SAFE_UPDATE${NC}"
477
+ echo -e " ${YELLOW}Need merge: $NEEDS_MERGE${NC}"
478
+ echo -e " Local only: $LOCAL_ONLY"
479
+ echo ""
480
+
481
+ if $APPLY; then
482
+ echo -e "${BLUE}Applying safe updates...${NC}"
483
+
484
+ # ── New-skill three-state policy: interactive confirm / --add-new / --skip-new ──
485
+ # A skill already in .aris-declined.txt is never re-asked and never installed —
486
+ # not even by --add-new (only editing/clearing the declined file restores it).
487
+ declare -a TO_INSTALL_NEW=()
488
+ declare -a SKIPPED_NEW=()
489
+ declare -a JUST_DECLINED=()
490
+
491
+ for s in "${NEW_SKILLS[@]:-}"; do
492
+ [[ -n "$s" ]] || continue
493
+ if is_declined "$s"; then
494
+ continue
495
+ fi
496
+ case "$NEW_POLICY" in
497
+ add)
498
+ TO_INSTALL_NEW+=("$s")
499
+ ;;
500
+ skip)
501
+ SKIPPED_NEW+=("$s")
502
+ ;;
503
+ *)
504
+ if [[ -t 0 ]]; then
505
+ grp="$(catalog_group_of "$s")"
506
+ printf " install new skill %-30s (group: %s) [y/N] " "$s" "$grp" >&2
507
+ read -r reply </dev/tty
508
+ if [[ "$reply" =~ ^[yY] ]]; then
509
+ TO_INSTALL_NEW+=("$s")
510
+ else
511
+ JUST_DECLINED+=("$s")
512
+ fi
513
+ else
514
+ SKIPPED_NEW+=("$s")
515
+ fi
516
+ ;;
517
+ esac
518
+ done
519
+
520
+ if [[ ${#JUST_DECLINED[@]} -gt 0 ]]; then
521
+ {
522
+ [[ -f "$DECLINED_FILE" ]] && cat "$DECLINED_FILE"
523
+ printf '%s\n' "${JUST_DECLINED[@]}"
524
+ } | sort -u > "$DECLINED_FILE.tmp.$$" && mv -f "$DECLINED_FILE.tmp.$$" "$DECLINED_FILE"
525
+ fi
526
+
527
+ # Add accepted new skills (no existing dir to clean)
528
+ for s in "${TO_INSTALL_NEW[@]:-}"; do
529
+ if [[ -n "$s" ]]; then
530
+ cp -r "$UPSTREAM_DIR/$s" "$LOCAL_DIR/"
531
+ echo -e " ${GREEN}+ Added: $s${NC}"
532
+ fi
533
+ done
534
+
535
+ # Replace safely updated skills (rm-then-copy to avoid stale-file bug:
536
+ # plain `cp -r` overlays and leaves files that upstream removed)
537
+ for s in "${SAFE_SKILLS[@]:-}"; do
538
+ if [[ -n "$s" ]]; then
539
+ rm -rf "$LOCAL_DIR/$s"
540
+ cp -r "$UPSTREAM_DIR/$s" "$LOCAL_DIR/"
541
+ echo -e " ${BLUE}↑ Updated: $s${NC}"
542
+ fi
543
+ done
544
+
545
+ # Update shared-references (same fix)
546
+ if [[ -d "$UPSTREAM_DIR/shared-references" ]]; then
547
+ rm -rf "$LOCAL_DIR/shared-references"
548
+ cp -r "$UPSTREAM_DIR/shared-references" "$LOCAL_DIR/"
549
+ echo -e " ${BLUE}↑ Updated: shared-references${NC}"
550
+ fi
551
+
552
+ echo ""
553
+ echo -e "${GREEN}Done! ${#TO_INSTALL_NEW[@]} new + $SAFE_UPDATE updated.${NC}"
554
+
555
+ if [[ ${#SKIPPED_NEW[@]} -gt 0 ]]; then
556
+ echo -e "${YELLOW}⚠️ ${#SKIPPED_NEW[@]} new skill(s) skipped, not declined: ${SKIPPED_NEW[*]}${NC}"
557
+ echo -e "${YELLOW} Re-run with --add-new to install them (or re-run interactively on a TTY).${NC}"
558
+ fi
559
+ if [[ ${#JUST_DECLINED[@]} -gt 0 ]]; then
560
+ echo -e " Declined just now (recorded in $DECLINED_FILE, won't be asked again): ${JUST_DECLINED[*]}"
561
+ fi
562
+ if [[ ${#NEW_PREDECLINED_SKILLS[@]} -gt 0 ]]; then
563
+ echo -e " Previously declined, still skipped: ${#NEW_PREDECLINED_SKILLS[@]} (edit $DECLINED_FILE to reconsider)"
564
+ fi
565
+
566
+ if [[ $NEEDS_MERGE -gt 0 ]]; then
567
+ echo -e "${YELLOW}⚠️ $NEEDS_MERGE skills have personal customizations and were NOT updated.${NC}"
568
+ echo -e "${YELLOW} Review manually: ${MERGE_SKILLS[*]}${NC}"
569
+ echo -e "${YELLOW} Tip: diff the local and upstream SKILL.md files to merge changes${NC}"
570
+ fi
571
+
572
+ ensure_global_pointer
573
+ else
574
+ case "$MODE" in
575
+ project)
576
+ if [[ "$TARGET_SUBDIR" == ".claude/skills" ]]; then
577
+ CMD_HINT="bash tools/smart_update.sh --project \"$PROJECT_ROOT\" --apply"
578
+ else
579
+ CMD_HINT="bash tools/smart_update.sh --project \"$PROJECT_ROOT\" --target-subdir \"$TARGET_SUBDIR\" --apply"
580
+ fi
581
+ ;;
582
+ explicit)
583
+ CMD_HINT="bash tools/smart_update.sh --upstream \"$UPSTREAM_DIR\" --local \"$LOCAL_DIR\" --apply"
584
+ ;;
585
+ *)
586
+ CMD_HINT="bash tools/smart_update.sh --apply"
587
+ ;;
588
+ esac
589
+ echo -e "Dry run complete. Run with ${GREEN}--apply${NC} to perform updates:"
590
+ echo -e " ${GREEN}${CMD_HINT}${NC}"
591
+ fi