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.
- package/LICENSE +21 -0
- package/README.md +98 -0
- package/README_CN.md +87 -0
- package/dsh/checkout.patch.yml +38 -0
- package/dsh/client.js +634 -0
- package/dsh/cordis.patch.yml +44 -0
- package/dsh/index.mjs +76 -0
- package/dsh/run-status.mjs +182 -0
- package/dsh/scope-limits.mjs +50 -0
- package/dsh/workbench.mjs +291 -0
- package/mcp-servers/claude-review/README.md +93 -0
- package/mcp-servers/claude-review/run_with_claude_aws.sh +49 -0
- package/mcp-servers/claude-review/server.py +718 -0
- package/mcp-servers/codex-image2/README.md +65 -0
- package/mcp-servers/codex-image2/server.py +893 -0
- package/mcp-servers/feishu-bridge/requirements.txt +1 -0
- package/mcp-servers/feishu-bridge/server.py +240 -0
- package/mcp-servers/gemini-review/README.md +171 -0
- package/mcp-servers/gemini-review/server.py +1856 -0
- package/mcp-servers/llm-chat/requirements.txt +1 -0
- package/mcp-servers/llm-chat/server.py +664 -0
- package/mcp-servers/manual-review/README.md +133 -0
- package/mcp-servers/manual-review/server.py +910 -0
- package/mcp-servers/manual-review/ui.html +279 -0
- package/mcp-servers/minimax-chat/requirements.txt +1 -0
- package/mcp-servers/minimax-chat/server.py +381 -0
- package/package.json +51 -0
- package/skills/ablation-planner/SKILL.md +123 -0
- package/skills/alphaxiv/SKILL.md +196 -0
- package/skills/analyze-results/SKILL.md +46 -0
- package/skills/arxiv/SKILL.md +248 -0
- package/skills/auto-paper-improvement-loop/SKILL.md +651 -0
- package/skills/auto-review-loop/SKILL.md +1137 -0
- package/skills/auto-review-loop-llm/SKILL.md +259 -0
- package/skills/auto-review-loop-minimax/SKILL.md +302 -0
- package/skills/citation-audit/SKILL.md +502 -0
- package/skills/claims-drafting/SKILL.md +227 -0
- package/skills/comm-lit-review/SKILL.md +297 -0
- package/skills/deepxiv/SKILL.md +263 -0
- package/skills/dse-loop/SKILL.md +296 -0
- package/skills/embodiment-description/SKILL.md +129 -0
- package/skills/exa-search/SKILL.md +205 -0
- package/skills/experiment-audit/SKILL.md +311 -0
- package/skills/experiment-bridge/SKILL.md +376 -0
- package/skills/experiment-plan/SKILL.md +249 -0
- package/skills/experiment-queue/SKILL.md +431 -0
- package/skills/experiment-queue/scripts/build_manifest.py +142 -0
- package/skills/experiment-queue/scripts/queue_manager.py +433 -0
- package/skills/feishu-notify/SKILL.md +156 -0
- package/skills/figure-description/SKILL.md +138 -0
- package/skills/figure-spec/SKILL.md +262 -0
- package/skills/figure-spec/scripts/figure_renderer.py +799 -0
- package/skills/formula-derivation/SKILL.md +280 -0
- package/skills/gemini-search/SKILL.md +231 -0
- package/skills/grant-proposal/SKILL.md +698 -0
- package/skills/idea-creator/SKILL.md +542 -0
- package/skills/idea-discovery/SKILL.md +521 -0
- package/skills/idea-discovery-robot/SKILL.md +363 -0
- package/skills/integrity-forensics/SKILL.md +284 -0
- package/skills/interview-cheatsheet/SKILL.md +245 -0
- package/skills/invention-structuring/SKILL.md +188 -0
- package/skills/jurisdiction-format/SKILL.md +192 -0
- package/skills/kill-argument/SKILL.md +437 -0
- package/skills/mermaid-diagram/SKILL.md +419 -0
- package/skills/meta-apply/SKILL.md +141 -0
- package/skills/meta-optimize/SKILL.md +437 -0
- package/skills/monitor-experiment/SKILL.md +140 -0
- package/skills/novelty-check/SKILL.md +101 -0
- package/skills/openalex/SKILL.md +237 -0
- package/skills/overleaf-sync/SKILL.md +220 -0
- package/skills/paper-claim-audit/SKILL.md +348 -0
- package/skills/paper-compile/SKILL.md +266 -0
- package/skills/paper-figure/SKILL.md +312 -0
- package/skills/paper-illustration/SKILL.md +736 -0
- package/skills/paper-illustration-image2/SKILL.md +391 -0
- package/skills/paper-illustration-image2/scripts/paper_illustration_image2.py +255 -0
- package/skills/paper-plan/SKILL.md +386 -0
- package/skills/paper-poster/SKILL.md +19 -0
- package/skills/paper-poster-html/DESIGN_FINAL.md +176 -0
- package/skills/paper-poster-html/IMPLEMENTATION_CONVENTIONS.md +161 -0
- package/skills/paper-poster-html/LICENSES/posterly-MIT.txt +21 -0
- package/skills/paper-poster-html/NOTICE.md +57 -0
- package/skills/paper-poster-html/SKILL.md +323 -0
- package/skills/paper-poster-html/scripts/_posterly/__init__.py +0 -0
- package/skills/paper-poster-html/scripts/_posterly/canvas.py +200 -0
- package/skills/paper-poster-html/scripts/_posterly/measure.py +588 -0
- package/skills/paper-poster-html/scripts/_posterly/polish.py +498 -0
- package/skills/paper-poster-html/scripts/_posterly/preflight.py +489 -0
- package/skills/paper-poster-html/scripts/_posterly/render.py +215 -0
- package/skills/paper-poster-html/scripts/_posterly/textutil.py +16 -0
- package/skills/paper-poster-html/scripts/_posterly/verify_final.py +171 -0
- package/skills/paper-poster-html/scripts/asset_check.py +897 -0
- package/skills/paper-poster-html/scripts/extract_pdf_figures.py +666 -0
- package/skills/paper-poster-html/scripts/poster_check.py +251 -0
- package/skills/paper-poster-html/scripts/preprocess_figures.py +238 -0
- package/skills/paper-poster-html/scripts/render_preview.py +217 -0
- package/skills/paper-poster-html/scripts/run_gates.py +556 -0
- package/skills/paper-poster-html/scripts/style_check.py +1324 -0
- package/skills/paper-poster-html/templates/COMPONENTS.md +462 -0
- package/skills/paper-poster-html/templates/README.md +170 -0
- package/skills/paper-poster-html/templates/landscape_4col.html +1032 -0
- package/skills/paper-poster-html/templates/landscape_hero.html +1046 -0
- package/skills/paper-poster-html/templates/portrait_2col.html +947 -0
- package/skills/paper-poster-html/templates/tokens/acl.json +9 -0
- package/skills/paper-poster-html/templates/tokens/cvpr.json +9 -0
- package/skills/paper-poster-html/templates/tokens/generic.json +9 -0
- package/skills/paper-poster-html/templates/tokens/iclr.json +9 -0
- package/skills/paper-poster-html/templates/tokens/icml.json +9 -0
- package/skills/paper-poster-html/templates/tokens/neurips.json +9 -0
- package/skills/paper-slides/SKILL.md +635 -0
- package/skills/paper-talk/SKILL.md +381 -0
- package/skills/paper-write/SKILL.md +604 -0
- package/skills/paper-write/templates/IEEEtran.bst +2409 -0
- package/skills/paper-write/templates/IEEEtran.cls +6347 -0
- package/skills/paper-write/templates/iclr2026.tex +84 -0
- package/skills/paper-write/templates/icml2025.tex +87 -0
- package/skills/paper-write/templates/ieee_conference.tex +89 -0
- package/skills/paper-write/templates/ieee_journal.tex +93 -0
- package/skills/paper-write/templates/math_commands.tex +48 -0
- package/skills/paper-write/templates/neurips2025.tex +80 -0
- package/skills/paper-writing/SKILL.md +916 -0
- package/skills/patent-novelty-check/SKILL.md +153 -0
- package/skills/patent-pipeline/SKILL.md +344 -0
- package/skills/patent-review/SKILL.md +203 -0
- package/skills/pixel-art/SKILL.md +137 -0
- package/skills/prior-art-search/SKILL.md +146 -0
- package/skills/proof-checker/SKILL.md +866 -0
- package/skills/proof-orchestrator/NOTICE.md +24 -0
- package/skills/proof-orchestrator/SKILL.md +254 -0
- package/skills/proof-orchestrator/references/audit-output-contract.md +126 -0
- package/skills/proof-orchestrator/references/deepseek-routing.md +74 -0
- package/skills/proof-orchestrator/references/dispatch-prompts.md +227 -0
- package/skills/proof-orchestrator/references/notation-audit.md +135 -0
- package/skills/proof-orchestrator/references/proof-audit-rubric.md +70 -0
- package/skills/proof-orchestrator/references/stress-tests.md +38 -0
- package/skills/proof-writer/SKILL.md +223 -0
- package/skills/qzcli/SKILL.md +324 -0
- package/skills/rebuttal/SKILL.md +376 -0
- package/skills/render-html/SKILL.md +316 -0
- package/skills/render-html/scripts/render_html.py +1006 -0
- package/skills/render-html/scripts/templates/academic.html +703 -0
- package/skills/render-html/scripts/templates/dashboard.html +333 -0
- package/skills/research-lit/SKILL.md +756 -0
- package/skills/research-pipeline/SKILL.md +384 -0
- package/skills/research-refine/SKILL.md +770 -0
- package/skills/research-refine-pipeline/SKILL.md +186 -0
- package/skills/research-review/SKILL.md +198 -0
- package/skills/research-wiki/SKILL.md +461 -0
- package/skills/resubmit-pipeline/SKILL.md +447 -0
- package/skills/result-to-claim/SKILL.md +311 -0
- package/skills/run-experiment/SKILL.md +313 -0
- package/skills/semantic-scholar/SKILL.md +236 -0
- package/skills/serverless-modal/SKILL.md +335 -0
- package/skills/shared-references/acceptance-gate.md +324 -0
- package/skills/shared-references/assurance-contract.md +248 -0
- package/skills/shared-references/capture-antipatterns.md +78 -0
- package/skills/shared-references/citation-discipline.md +583 -0
- package/skills/shared-references/compute-env-contract.md +163 -0
- package/skills/shared-references/effort-contract.md +183 -0
- package/skills/shared-references/evidence-precheck.md +65 -0
- package/skills/shared-references/experiment-integrity.md +49 -0
- package/skills/shared-references/external-cadence.md +326 -0
- package/skills/shared-references/fan-out-pattern.md +366 -0
- package/skills/shared-references/injection-hygiene.md +127 -0
- package/skills/shared-references/integration-contract.md +461 -0
- package/skills/shared-references/output-composition.md +93 -0
- package/skills/shared-references/output-language.md +45 -0
- package/skills/shared-references/output-manifest.md +49 -0
- package/skills/shared-references/output-versioning.md +111 -0
- package/skills/shared-references/patent-format-cn.md +199 -0
- package/skills/shared-references/patent-format-ep.md +173 -0
- package/skills/shared-references/patent-format-us.md +161 -0
- package/skills/shared-references/patent-writing-principles.md +197 -0
- package/skills/shared-references/prior-art-databases.md +141 -0
- package/skills/shared-references/resumable-runs.md +109 -0
- package/skills/shared-references/review-scope-limits.md +81 -0
- package/skills/shared-references/review-tracing.md +391 -0
- package/skills/shared-references/reviewer-independence.md +79 -0
- package/skills/shared-references/reviewer-routing.md +852 -0
- package/skills/shared-references/skill-governance.md +104 -0
- package/skills/shared-references/taste-calibration.md +85 -0
- package/skills/shared-references/venue-checklists.md +114 -0
- package/skills/shared-references/wiki-helper-resolution.md +134 -0
- package/skills/shared-references/writing-principles.md +525 -0
- package/skills/skills-codex/README.md +102 -0
- package/skills/skills-codex/README_CN.md +100 -0
- package/skills/skills-codex/ablation-planner/SKILL.md +126 -0
- package/skills/skills-codex/alphaxiv/SKILL.md +186 -0
- package/skills/skills-codex/analyze-results/SKILL.md +45 -0
- package/skills/skills-codex/arxiv/SKILL.md +210 -0
- package/skills/skills-codex/auto-paper-improvement-loop/SKILL.md +574 -0
- package/skills/skills-codex/auto-review-loop/SKILL.md +500 -0
- package/skills/skills-codex/auto-review-loop-llm/SKILL.md +247 -0
- package/skills/skills-codex/auto-review-loop-minimax/SKILL.md +290 -0
- package/skills/skills-codex/citation-audit/SKILL.md +504 -0
- package/skills/skills-codex/claims-drafting/SKILL.md +239 -0
- package/skills/skills-codex/comm-lit-review/SKILL.md +299 -0
- package/skills/skills-codex/comm-lit-review/references/domain-taxonomy.md +57 -0
- package/skills/skills-codex/comm-lit-review/references/output-template.md +37 -0
- package/skills/skills-codex/comm-lit-review/references/source-policy.md +99 -0
- package/skills/skills-codex/comm-lit-review/references/venue-tiering.md +112 -0
- package/skills/skills-codex/deepxiv/SKILL.md +142 -0
- package/skills/skills-codex/dse-loop/SKILL.md +285 -0
- package/skills/skills-codex/embodiment-description/SKILL.md +129 -0
- package/skills/skills-codex/exa-search/SKILL.md +192 -0
- package/skills/skills-codex/experiment-audit/SKILL.md +286 -0
- package/skills/skills-codex/experiment-bridge/SKILL.md +356 -0
- package/skills/skills-codex/experiment-plan/SKILL.md +249 -0
- package/skills/skills-codex/experiment-queue/SKILL.md +401 -0
- package/skills/skills-codex/feishu-notify/SKILL.md +155 -0
- package/skills/skills-codex/figure-description/SKILL.md +138 -0
- package/skills/skills-codex/figure-spec/SKILL.md +252 -0
- package/skills/skills-codex/formula-derivation/SKILL.md +280 -0
- package/skills/skills-codex/gemini-search/SKILL.md +205 -0
- package/skills/skills-codex/grant-proposal/SKILL.md +626 -0
- package/skills/skills-codex/idea-creator/SKILL.md +405 -0
- package/skills/skills-codex/idea-discovery/SKILL.md +475 -0
- package/skills/skills-codex/idea-discovery-robot/SKILL.md +362 -0
- package/skills/skills-codex/integrity-forensics/SKILL.md +106 -0
- package/skills/skills-codex/interview-cheatsheet/SKILL.md +245 -0
- package/skills/skills-codex/invention-structuring/SKILL.md +188 -0
- package/skills/skills-codex/jurisdiction-format/SKILL.md +192 -0
- package/skills/skills-codex/kill-argument/SKILL.md +403 -0
- package/skills/skills-codex/mermaid-diagram/SKILL.md +379 -0
- package/skills/skills-codex/meta-apply/SKILL.md +154 -0
- package/skills/skills-codex/meta-optimize/SKILL.md +348 -0
- package/skills/skills-codex/monitor-experiment/SKILL.md +98 -0
- package/skills/skills-codex/novelty-check/SKILL.md +89 -0
- package/skills/skills-codex/openalex/SKILL.md +228 -0
- package/skills/skills-codex/overleaf-sync/SKILL.md +220 -0
- package/skills/skills-codex/paper-claim-audit/SKILL.md +350 -0
- package/skills/skills-codex/paper-compile/SKILL.md +253 -0
- package/skills/skills-codex/paper-figure/SKILL.md +311 -0
- package/skills/skills-codex/paper-illustration/SKILL.md +690 -0
- package/skills/skills-codex/paper-illustration-image2/SKILL.md +383 -0
- package/skills/skills-codex/paper-illustration-image2/scripts/paper_illustration_image2.py +255 -0
- package/skills/skills-codex/paper-plan/SKILL.md +278 -0
- package/skills/skills-codex/paper-poster/SKILL.md +19 -0
- package/skills/skills-codex/paper-poster-html/SKILL.md +377 -0
- package/skills/skills-codex/paper-slides/SKILL.md +571 -0
- package/skills/skills-codex/paper-talk/SKILL.md +381 -0
- package/skills/skills-codex/paper-write/SKILL.md +411 -0
- package/skills/skills-codex/paper-write/templates/IEEEtran.bst +2409 -0
- package/skills/skills-codex/paper-write/templates/IEEEtran.cls +6347 -0
- package/skills/skills-codex/paper-write/templates/aaai2026.bst +1493 -0
- package/skills/skills-codex/paper-write/templates/aaai2026.sty +315 -0
- package/skills/skills-codex/paper-write/templates/aaai2026.tex +952 -0
- package/skills/skills-codex/paper-write/templates/acl.sty +312 -0
- package/skills/skills-codex/paper-write/templates/acl2026.tex +377 -0
- package/skills/skills-codex/paper-write/templates/acl_natbib.bst +1940 -0
- package/skills/skills-codex/paper-write/templates/acm.bst +3081 -0
- package/skills/skills-codex/paper-write/templates/acm_mm2026.tex +204 -0
- package/skills/skills-codex/paper-write/templates/acmart.cls +3520 -0
- package/skills/skills-codex/paper-write/templates/cvpr.bst +1448 -0
- package/skills/skills-codex/paper-write/templates/cvpr.sty +508 -0
- package/skills/skills-codex/paper-write/templates/cvpr2026.tex +63 -0
- package/skills/skills-codex/paper-write/templates/iclr2026.tex +84 -0
- package/skills/skills-codex/paper-write/templates/iclr2026_conference.bst +1440 -0
- package/skills/skills-codex/paper-write/templates/iclr2026_conference.sty +246 -0
- package/skills/skills-codex/paper-write/templates/icml2026.sty +767 -0
- package/skills/skills-codex/paper-write/templates/icml2026.tex +662 -0
- package/skills/skills-codex/paper-write/templates/ieee_conference.tex +89 -0
- package/skills/skills-codex/paper-write/templates/ieee_journal.tex +93 -0
- package/skills/skills-codex/paper-write/templates/math_commands.tex +48 -0
- package/skills/skills-codex/paper-write/templates/neurips2026.tex +493 -0
- package/skills/skills-codex/paper-write/templates/neurips_2026.sty +437 -0
- package/skills/skills-codex/paper-writing/SKILL.md +731 -0
- package/skills/skills-codex/patent-novelty-check/SKILL.md +153 -0
- package/skills/skills-codex/patent-pipeline/SKILL.md +344 -0
- package/skills/skills-codex/patent-review/SKILL.md +202 -0
- package/skills/skills-codex/pixel-art/SKILL.md +139 -0
- package/skills/skills-codex/prior-art-search/SKILL.md +146 -0
- package/skills/skills-codex/proof-checker/SKILL.md +554 -0
- package/skills/skills-codex/proof-orchestrator/SKILL.md +260 -0
- package/skills/skills-codex/proof-orchestrator/references/audit-output-contract.md +126 -0
- package/skills/skills-codex/proof-orchestrator/references/deepseek-routing.md +76 -0
- package/skills/skills-codex/proof-orchestrator/references/dispatch-prompts.md +227 -0
- package/skills/skills-codex/proof-orchestrator/references/notation-audit.md +135 -0
- package/skills/skills-codex/proof-orchestrator/references/proof-audit-rubric.md +70 -0
- package/skills/skills-codex/proof-orchestrator/references/stress-tests.md +38 -0
- package/skills/skills-codex/proof-writer/SKILL.md +222 -0
- package/skills/skills-codex/qzcli/SKILL.md +324 -0
- package/skills/skills-codex/rebuttal/SKILL.md +305 -0
- package/skills/skills-codex/render-html/SKILL.md +305 -0
- package/skills/skills-codex/render-html/scripts/__pycache__/render_html.cpython-314.pyc +0 -0
- package/skills/skills-codex/render-html/scripts/render_html.py +909 -0
- package/skills/skills-codex/render-html/scripts/templates/academic.html +342 -0
- package/skills/skills-codex/render-html/scripts/templates/dashboard.html +333 -0
- package/skills/skills-codex/research-lit/SKILL.md +464 -0
- package/skills/skills-codex/research-pipeline/SKILL.md +340 -0
- package/skills/skills-codex/research-refine/SKILL.md +721 -0
- package/skills/skills-codex/research-refine-pipeline/SKILL.md +186 -0
- package/skills/skills-codex/research-review/SKILL.md +135 -0
- package/skills/skills-codex/research-wiki/SKILL.md +421 -0
- package/skills/skills-codex/resubmit-pipeline/SKILL.md +444 -0
- package/skills/skills-codex/result-to-claim/SKILL.md +246 -0
- package/skills/skills-codex/run-experiment/SKILL.md +236 -0
- package/skills/skills-codex/semantic-scholar/SKILL.md +219 -0
- package/skills/skills-codex/serverless-modal/SKILL.md +335 -0
- package/skills/skills-codex/shared-references/acceptance-gate.md +336 -0
- package/skills/skills-codex/shared-references/assurance-contract.md +139 -0
- package/skills/skills-codex/shared-references/capture-antipatterns.md +84 -0
- package/skills/skills-codex/shared-references/citation-discipline.md +452 -0
- package/skills/skills-codex/shared-references/compute-env-contract.md +163 -0
- package/skills/skills-codex/shared-references/effort-contract.md +143 -0
- package/skills/skills-codex/shared-references/evidence-precheck.md +73 -0
- package/skills/skills-codex/shared-references/experiment-integrity.md +49 -0
- package/skills/skills-codex/shared-references/external-cadence.md +334 -0
- package/skills/skills-codex/shared-references/fan-out-pattern.md +375 -0
- package/skills/skills-codex/shared-references/injection-hygiene.md +132 -0
- package/skills/skills-codex/shared-references/integration-contract.md +372 -0
- package/skills/skills-codex/shared-references/output-composition.md +98 -0
- package/skills/skills-codex/shared-references/output-language.md +45 -0
- package/skills/skills-codex/shared-references/output-manifest.md +40 -0
- package/skills/skills-codex/shared-references/output-versioning.md +111 -0
- package/skills/skills-codex/shared-references/patent-format-cn.md +199 -0
- package/skills/skills-codex/shared-references/patent-format-ep.md +173 -0
- package/skills/skills-codex/shared-references/patent-format-us.md +161 -0
- package/skills/skills-codex/shared-references/patent-writing-principles.md +197 -0
- package/skills/skills-codex/shared-references/prior-art-databases.md +141 -0
- package/skills/skills-codex/shared-references/resumable-runs.md +125 -0
- package/skills/skills-codex/shared-references/review-scope-limits.md +81 -0
- package/skills/skills-codex/shared-references/review-tracing.md +144 -0
- package/skills/skills-codex/shared-references/reviewer-independence.md +66 -0
- package/skills/skills-codex/shared-references/reviewer-routing.md +128 -0
- package/skills/skills-codex/shared-references/skill-governance.md +119 -0
- package/skills/skills-codex/shared-references/taste-calibration.md +90 -0
- package/skills/skills-codex/shared-references/venue-checklists.md +73 -0
- package/skills/skills-codex/shared-references/wiki-helper-resolution.md +69 -0
- package/skills/skills-codex/shared-references/writing-principles.md +525 -0
- package/skills/skills-codex/slides-polish/SKILL.md +563 -0
- package/skills/skills-codex/specification-writing/SKILL.md +211 -0
- package/skills/skills-codex/system-profile/SKILL.md +103 -0
- package/skills/skills-codex/training-check/SKILL.md +83 -0
- package/skills/skills-codex/vast-gpu/SKILL.md +394 -0
- package/skills/skills-codex/web-debug-search/SKILL.md +334 -0
- package/skills/skills-codex/wiki-enrich/SKILL.md +255 -0
- package/skills/skills-codex/writing-systems-papers/SKILL.md +184 -0
- package/skills/skills-codex-claude-review/README.md +79 -0
- package/skills/skills-codex-claude-review/README_CN.md +78 -0
- package/skills/skills-codex-claude-review/auto-paper-improvement-loop/SKILL.md +581 -0
- package/skills/skills-codex-claude-review/auto-review-loop/SKILL.md +510 -0
- package/skills/skills-codex-claude-review/novelty-check/SKILL.md +102 -0
- package/skills/skills-codex-claude-review/paper-figure/SKILL.md +319 -0
- package/skills/skills-codex-claude-review/paper-plan/SKILL.md +287 -0
- package/skills/skills-codex-claude-review/paper-write/SKILL.md +420 -0
- package/skills/skills-codex-claude-review/research-refine/SKILL.md +732 -0
- package/skills/skills-codex-claude-review/research-review/SKILL.md +149 -0
- package/skills/skills-codex-gemini-review/README.md +176 -0
- package/skills/skills-codex-gemini-review/README_CN.md +175 -0
- package/skills/skills-codex-gemini-review/auto-paper-improvement-loop/SKILL.md +331 -0
- package/skills/skills-codex-gemini-review/auto-review-loop/SKILL.md +304 -0
- package/skills/skills-codex-gemini-review/grant-proposal/SKILL.md +630 -0
- package/skills/skills-codex-gemini-review/idea-creator/SKILL.md +263 -0
- package/skills/skills-codex-gemini-review/idea-discovery/SKILL.md +275 -0
- package/skills/skills-codex-gemini-review/idea-discovery-robot/SKILL.md +365 -0
- package/skills/skills-codex-gemini-review/novelty-check/SKILL.md +92 -0
- package/skills/skills-codex-gemini-review/paper-figure/SKILL.md +289 -0
- package/skills/skills-codex-gemini-review/paper-plan/SKILL.md +265 -0
- package/skills/skills-codex-gemini-review/paper-poster-html/SKILL.md +102 -0
- package/skills/skills-codex-gemini-review/paper-slides/SKILL.md +582 -0
- package/skills/skills-codex-gemini-review/paper-write/SKILL.md +346 -0
- package/skills/skills-codex-gemini-review/paper-writing/SKILL.md +312 -0
- package/skills/skills-codex-gemini-review/research-refine/SKILL.md +674 -0
- package/skills/skills-codex-gemini-review/research-review/SKILL.md +112 -0
- package/skills/slides-polish/SKILL.md +565 -0
- package/skills/specification-writing/SKILL.md +211 -0
- package/skills/system-profile/SKILL.md +103 -0
- package/skills/training-check/SKILL.md +132 -0
- package/skills/vast-gpu/SKILL.md +394 -0
- package/skills/web-debug-search/SKILL.md +334 -0
- package/skills/wiki-enrich/SKILL.md +257 -0
- package/skills/writing-systems-papers/SKILL.md +184 -0
- package/templates/CLAUDE_MD_TEMPLATE.md +29 -0
- package/templates/EXPERIMENT_LOG_TEMPLATE.md +47 -0
- package/templates/EXPERIMENT_PLAN_TEMPLATE.md +51 -0
- package/templates/EXPERIMENT_PLAN_TEMPLATE_CN.md +53 -0
- package/templates/FINDINGS_TEMPLATE.md +52 -0
- package/templates/IDEA_CANDIDATES_TEMPLATE.md +47 -0
- package/templates/IDEA_CANDIDATES_TEMPLATE_CN.md +47 -0
- package/templates/INVENTION_BRIEF_TEMPLATE.md +87 -0
- package/templates/MANIFEST_TEMPLATE.md +7 -0
- package/templates/NARRATIVE_REPORT_TEMPLATE.md +49 -0
- package/templates/PAPER_PLAN_TEMPLATE.md +47 -0
- package/templates/PATENT_CLAIMS_TEMPLATE.md +78 -0
- package/templates/PATENT_SPECIFICATION_TEMPLATE.md +68 -0
- package/templates/README.md +57 -0
- package/templates/RESEARCH_BRIEF_TEMPLATE.md +35 -0
- package/templates/RESEARCH_BRIEF_TEMPLATE_CN.md +41 -0
- package/templates/RESEARCH_CONTRACT_TEMPLATE.md +60 -0
- package/templates/claude-hooks/corpus_write_guard.json +16 -0
- package/templates/claude-hooks/corpus_write_guard.py +85 -0
- package/templates/claude-hooks/meta_logging.json +74 -0
- package/templates/gitignore-trace.txt +3 -0
- package/tools/__pycache__/check_skills_inventory.cpython-314.pyc +0 -0
- package/tools/arxiv_fetch.py +311 -0
- package/tools/capture_filter.py +126 -0
- package/tools/check_skills_inventory.py +273 -0
- package/tools/convert_skills_to_llm_chat.py +282 -0
- package/tools/copilot_native_evidence.py +818 -0
- package/tools/deepxiv_fetch.py +213 -0
- package/tools/evidence_check.py +212 -0
- package/tools/exa_search.py +425 -0
- package/tools/experiment_queue/README.md +118 -0
- package/tools/experiment_queue/build_manifest.py +44 -0
- package/tools/experiment_queue/queue_manager.py +44 -0
- package/tools/extract_paper_style.py +560 -0
- package/tools/figure_renderer.py +69 -0
- package/tools/forensics_gate.py +669 -0
- package/tools/generate_codex_claude_review_overrides.py +299 -0
- package/tools/idea_discovery_gate.py +256 -0
- package/tools/install_aris.ps1 +1372 -0
- package/tools/install_aris.sh +1370 -0
- package/tools/install_aris_codex.sh +1023 -0
- package/tools/install_aris_copilot.sh +1052 -0
- package/tools/iteration_log.py +143 -0
- package/tools/lint_skills_helpers.sh +84 -0
- package/tools/meta_opt/check_ready.sh +80 -0
- package/tools/meta_opt/log_event.sh +91 -0
- package/tools/meta_opt/trigger_eval.py +280 -0
- package/tools/meta_opt/trigger_evals.sample.json +28 -0
- package/tools/openalex_fetch.py +326 -0
- package/tools/overleaf_audit.sh +104 -0
- package/tools/overleaf_setup.sh +150 -0
- package/tools/paper_illustration_image2.py +62 -0
- package/tools/provenance.py +294 -0
- package/tools/research_wiki.py +1720 -0
- package/tools/review_gate.py +502 -0
- package/tools/run_state.py +399 -0
- package/tools/save_trace.sh +477 -0
- package/tools/semantic_scholar_fetch.py +438 -0
- package/tools/skill-groups.tsv +116 -0
- package/tools/skill_picker.py +238 -0
- package/tools/smart_update.ps1 +521 -0
- package/tools/smart_update.sh +591 -0
- package/tools/smart_update_codex.sh +419 -0
- package/tools/smart_update_copilot.sh +605 -0
- package/tools/threat_scan.py +222 -0
- package/tools/verify_paper_audits.sh +487 -0
- package/tools/verify_papers.py +613 -0
- package/tools/verify_wiki_coverage.sh +176 -0
- package/tools/watchdog.py +485 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_README": "Query set for trigger_eval.py. Keys are skill names; values are user-intent queries that SHOULD trigger that skill. RULE: paraphrase intent, never quote the skill's own trigger phrases verbatim β a query containing the literal description trigger string is trivially positive and measures nothing. Prefix a skill key with '_' to comment it out. For negative testing (measuring FALSE triggering), add queries under a skill that should NOT fire and read the confusion matrix in the report. This sample covers a few well-scoped skills; extend per the skill you're tuning.",
|
|
3
|
+
"check-gpu": [
|
|
4
|
+
"is anything running on the servers right now?",
|
|
5
|
+
"how busy are my remote machines?",
|
|
6
|
+
"which cards are free before I launch a job"
|
|
7
|
+
],
|
|
8
|
+
"research-lit": [
|
|
9
|
+
"find me recent papers on this topic",
|
|
10
|
+
"what has been published about diffusion language models lately",
|
|
11
|
+
"pull together related work for my intro section"
|
|
12
|
+
],
|
|
13
|
+
"novelty-check": [
|
|
14
|
+
"has anyone already done this idea?",
|
|
15
|
+
"is my approach actually new or is it in the literature already",
|
|
16
|
+
"check if this contribution is novel before I build it"
|
|
17
|
+
],
|
|
18
|
+
"citation-audit": [
|
|
19
|
+
"make sure every reference in my paper is real and correctly attributed",
|
|
20
|
+
"verify the bibliography before submission",
|
|
21
|
+
"did I hallucinate any citations in this draft"
|
|
22
|
+
],
|
|
23
|
+
"kill-argument": [
|
|
24
|
+
"what is the single strongest reason a reviewer would reject this paper",
|
|
25
|
+
"give me the harshest rebuttal my theory paper would face",
|
|
26
|
+
"simulate reviewer 2's most damaging objection"
|
|
27
|
+
]
|
|
28
|
+
}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
OpenAlex API client for academic paper search.
|
|
4
|
+
Documentation: https://developers.openalex.org/
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import argparse
|
|
8
|
+
import json
|
|
9
|
+
import sys
|
|
10
|
+
import os
|
|
11
|
+
from typing import List, Dict, Optional
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
import requests
|
|
15
|
+
except ImportError:
|
|
16
|
+
print(
|
|
17
|
+
"OpenAlex requires the 'requests' package. "
|
|
18
|
+
"Install with: pip install requests",
|
|
19
|
+
file=sys.stderr,
|
|
20
|
+
)
|
|
21
|
+
# Exit code 2 signals "skip this source" to the calling skill,
|
|
22
|
+
# distinct from exit 1 used for runtime errors below.
|
|
23
|
+
sys.exit(2)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class OpenAlexClient:
|
|
27
|
+
BASE_URL = "https://api.openalex.org"
|
|
28
|
+
|
|
29
|
+
def __init__(self, api_key: Optional[str] = None, email: Optional[str] = None):
|
|
30
|
+
"""
|
|
31
|
+
Initialize OpenAlex client.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
api_key: Optional API key for higher rate limits
|
|
35
|
+
email: Optional email for polite pool (faster response)
|
|
36
|
+
"""
|
|
37
|
+
self.api_key = api_key or os.environ.get("OPENALEX_API_KEY")
|
|
38
|
+
self.email = email or os.environ.get("OPENALEX_EMAIL")
|
|
39
|
+
self.session = requests.Session()
|
|
40
|
+
|
|
41
|
+
# Set user agent with email for polite pool
|
|
42
|
+
if self.email:
|
|
43
|
+
self.session.headers.update({
|
|
44
|
+
"User-Agent": f"mailto:{self.email}"
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
def search_works(
|
|
48
|
+
self,
|
|
49
|
+
query: str,
|
|
50
|
+
max_results: int = 10,
|
|
51
|
+
publication_year: Optional[str] = None,
|
|
52
|
+
work_type: Optional[str] = None,
|
|
53
|
+
open_access: Optional[bool] = None,
|
|
54
|
+
min_citations: Optional[int] = None,
|
|
55
|
+
sort: str = "relevance_score:desc",
|
|
56
|
+
fields: Optional[List[str]] = None
|
|
57
|
+
) -> List[Dict]:
|
|
58
|
+
"""
|
|
59
|
+
Search for academic works.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
query: Search query string
|
|
63
|
+
max_results: Maximum number of results (default: 10)
|
|
64
|
+
publication_year: Year filter, e.g., "2023" or "2020-2023"
|
|
65
|
+
work_type: Type filter, e.g., "article", "preprint", "book"
|
|
66
|
+
open_access: Filter by open access status
|
|
67
|
+
min_citations: Minimum citation count
|
|
68
|
+
sort: Sort order (default: relevance_score:desc)
|
|
69
|
+
fields: Specific fields to return (default: all)
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
List of work dictionaries
|
|
73
|
+
"""
|
|
74
|
+
url = f"{self.BASE_URL}/works"
|
|
75
|
+
|
|
76
|
+
# Build filter string
|
|
77
|
+
filters = []
|
|
78
|
+
if publication_year:
|
|
79
|
+
filters.append(f"publication_year:{publication_year}")
|
|
80
|
+
if work_type:
|
|
81
|
+
filters.append(f"type:{work_type}")
|
|
82
|
+
if open_access is not None:
|
|
83
|
+
filters.append(f"is_oa:{str(open_access).lower()}")
|
|
84
|
+
if min_citations:
|
|
85
|
+
filters.append(f"cited_by_count:>{min_citations}")
|
|
86
|
+
|
|
87
|
+
params = {
|
|
88
|
+
"search": query,
|
|
89
|
+
"per_page": min(max_results, 200), # API max is 200
|
|
90
|
+
"sort": sort
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if filters:
|
|
94
|
+
params["filter"] = ",".join(filters)
|
|
95
|
+
|
|
96
|
+
if self.api_key:
|
|
97
|
+
params["api_key"] = self.api_key
|
|
98
|
+
|
|
99
|
+
try:
|
|
100
|
+
response = self.session.get(url, params=params, timeout=30)
|
|
101
|
+
response.raise_for_status()
|
|
102
|
+
data = response.json()
|
|
103
|
+
|
|
104
|
+
results = []
|
|
105
|
+
for work in data.get("results", []):
|
|
106
|
+
results.append(self._parse_work(work))
|
|
107
|
+
|
|
108
|
+
return results[:max_results]
|
|
109
|
+
|
|
110
|
+
except requests.exceptions.HTTPError as e:
|
|
111
|
+
if e.response.status_code == 429:
|
|
112
|
+
print("Rate limit exceeded. Consider using an API key or reducing request frequency.", file=sys.stderr)
|
|
113
|
+
raise
|
|
114
|
+
except Exception as e:
|
|
115
|
+
print(f"Error fetching from OpenAlex: {e}", file=sys.stderr)
|
|
116
|
+
raise
|
|
117
|
+
|
|
118
|
+
def get_work(self, work_id: str) -> Dict:
|
|
119
|
+
"""
|
|
120
|
+
Get a specific work by ID, DOI, or OpenAlex ID.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
work_id: Work identifier (DOI, OpenAlex ID, etc.)
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
Work dictionary
|
|
127
|
+
"""
|
|
128
|
+
# Handle different ID formats
|
|
129
|
+
if work_id.startswith("10."): # DOI
|
|
130
|
+
url = f"{self.BASE_URL}/works/doi:{work_id}"
|
|
131
|
+
elif work_id.startswith("W"): # OpenAlex ID
|
|
132
|
+
url = f"{self.BASE_URL}/works/{work_id}"
|
|
133
|
+
else:
|
|
134
|
+
url = f"{self.BASE_URL}/works/{work_id}"
|
|
135
|
+
|
|
136
|
+
params = {}
|
|
137
|
+
if self.api_key:
|
|
138
|
+
params["api_key"] = self.api_key
|
|
139
|
+
|
|
140
|
+
response = self.session.get(url, params=params, timeout=30)
|
|
141
|
+
response.raise_for_status()
|
|
142
|
+
|
|
143
|
+
return self._parse_work(response.json())
|
|
144
|
+
|
|
145
|
+
def _parse_work(self, work: Dict) -> Dict:
|
|
146
|
+
"""Parse OpenAlex work object into simplified format."""
|
|
147
|
+
# Extract authors
|
|
148
|
+
authors = []
|
|
149
|
+
for authorship in work.get("authorships", []):
|
|
150
|
+
author = authorship.get("author", {})
|
|
151
|
+
author_name = author.get("display_name", "Unknown")
|
|
152
|
+
authors.append(author_name)
|
|
153
|
+
|
|
154
|
+
# Extract venue/source β `or {}` because OpenAlex returns explicit null (not missing key) for some works
|
|
155
|
+
primary_location = work.get("primary_location") or {}
|
|
156
|
+
source = primary_location.get("source") or {}
|
|
157
|
+
venue = source.get("display_name", "Unknown")
|
|
158
|
+
|
|
159
|
+
# Extract open access info
|
|
160
|
+
oa_info = work.get("open_access") or {}
|
|
161
|
+
oa_status = oa_info.get("oa_status", "closed")
|
|
162
|
+
oa_url = oa_info.get("oa_url")
|
|
163
|
+
|
|
164
|
+
# Extract abstract (inverted index format)
|
|
165
|
+
abstract_inverted = work.get("abstract_inverted_index")
|
|
166
|
+
abstract = self._reconstruct_abstract(abstract_inverted) if abstract_inverted else None
|
|
167
|
+
|
|
168
|
+
# Extract topics/keywords
|
|
169
|
+
topics = [t.get("display_name") for t in work.get("topics", [])[:3]]
|
|
170
|
+
keywords = [k.get("display_name") for k in work.get("keywords", [])[:5]]
|
|
171
|
+
|
|
172
|
+
return {
|
|
173
|
+
"id": work.get("id"),
|
|
174
|
+
"openalex_id": work.get("id", "").split("/")[-1],
|
|
175
|
+
"doi": work.get("doi", "").replace("https://doi.org/", "") if work.get("doi") else None,
|
|
176
|
+
"title": work.get("display_name") or work.get("title", "Untitled"),
|
|
177
|
+
"authors": authors,
|
|
178
|
+
"author_count": len(authors),
|
|
179
|
+
"publication_year": work.get("publication_year"),
|
|
180
|
+
"publication_date": work.get("publication_date"),
|
|
181
|
+
"venue": venue,
|
|
182
|
+
"venue_type": source.get("type"),
|
|
183
|
+
"cited_by_count": work.get("cited_by_count", 0),
|
|
184
|
+
"is_oa": work.get("is_oa", False),
|
|
185
|
+
"oa_status": oa_status,
|
|
186
|
+
"oa_url": oa_url,
|
|
187
|
+
"abstract": abstract,
|
|
188
|
+
"topics": topics,
|
|
189
|
+
"keywords": keywords,
|
|
190
|
+
"type": work.get("type"),
|
|
191
|
+
"language": work.get("language"),
|
|
192
|
+
"referenced_works_count": work.get("referenced_works_count", 0),
|
|
193
|
+
"url": work.get("id")
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
def _reconstruct_abstract(self, inverted_index: Dict) -> str:
|
|
197
|
+
"""Reconstruct abstract from inverted index format."""
|
|
198
|
+
if not inverted_index:
|
|
199
|
+
return None
|
|
200
|
+
|
|
201
|
+
# Create list of (position, word) tuples
|
|
202
|
+
words = []
|
|
203
|
+
for word, positions in inverted_index.items():
|
|
204
|
+
for pos in positions:
|
|
205
|
+
words.append((pos, word))
|
|
206
|
+
|
|
207
|
+
# Sort by position and join
|
|
208
|
+
words.sort(key=lambda x: x[0])
|
|
209
|
+
return " ".join(word for _, word in words)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def main():
|
|
213
|
+
parser = argparse.ArgumentParser(
|
|
214
|
+
description="Search OpenAlex for academic papers",
|
|
215
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
216
|
+
epilog="""
|
|
217
|
+
Examples:
|
|
218
|
+
# Basic search
|
|
219
|
+
%(prog)s search "semantic communication" --max 10
|
|
220
|
+
|
|
221
|
+
# Filter by year and type
|
|
222
|
+
%(prog)s search "diffusion models" --year 2023- --type article --max 20
|
|
223
|
+
|
|
224
|
+
# Open access papers only
|
|
225
|
+
%(prog)s search "machine learning" --open-access --min-citations 50
|
|
226
|
+
|
|
227
|
+
# Get specific work by DOI
|
|
228
|
+
%(prog)s work "10.1109/TWC.2024.1234567"
|
|
229
|
+
|
|
230
|
+
# Sort by citations
|
|
231
|
+
%(prog)s search "neural networks" --sort citations --max 10
|
|
232
|
+
"""
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
subparsers = parser.add_subparsers(dest="command", help="Command to execute")
|
|
236
|
+
|
|
237
|
+
# Search command
|
|
238
|
+
search_parser = subparsers.add_parser("search", help="Search for works")
|
|
239
|
+
search_parser.add_argument("query", help="Search query")
|
|
240
|
+
search_parser.add_argument("--max", type=int, default=10, help="Maximum results (default: 10)")
|
|
241
|
+
search_parser.add_argument("--year", help="Publication year filter (e.g., '2023' or '2020-2023')")
|
|
242
|
+
search_parser.add_argument("--type", choices=["article", "preprint", "book", "book-chapter", "dataset", "dissertation"],
|
|
243
|
+
help="Work type filter")
|
|
244
|
+
search_parser.add_argument("--open-access", action="store_true", help="Only open access papers")
|
|
245
|
+
search_parser.add_argument("--min-citations", type=int, help="Minimum citation count")
|
|
246
|
+
search_parser.add_argument("--sort", choices=["relevance", "citations", "date"],
|
|
247
|
+
default="relevance", help="Sort order (default: relevance)")
|
|
248
|
+
search_parser.add_argument("--json", action="store_true", help="Output as JSON")
|
|
249
|
+
|
|
250
|
+
# Work command
|
|
251
|
+
work_parser = subparsers.add_parser("work", help="Get specific work by ID/DOI")
|
|
252
|
+
work_parser.add_argument("work_id", help="Work ID (DOI, OpenAlex ID, etc.)")
|
|
253
|
+
work_parser.add_argument("--json", action="store_true", help="Output as JSON")
|
|
254
|
+
|
|
255
|
+
args = parser.parse_args()
|
|
256
|
+
|
|
257
|
+
if not args.command:
|
|
258
|
+
parser.print_help()
|
|
259
|
+
sys.exit(1)
|
|
260
|
+
|
|
261
|
+
# Initialize client
|
|
262
|
+
client = OpenAlexClient()
|
|
263
|
+
|
|
264
|
+
try:
|
|
265
|
+
if args.command == "search":
|
|
266
|
+
# Map sort option to API format
|
|
267
|
+
sort_map = {
|
|
268
|
+
"relevance": "relevance_score:desc",
|
|
269
|
+
"citations": "cited_by_count:desc",
|
|
270
|
+
"date": "publication_date:desc"
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
results = client.search_works(
|
|
274
|
+
query=args.query,
|
|
275
|
+
max_results=args.max,
|
|
276
|
+
publication_year=args.year,
|
|
277
|
+
work_type=args.type,
|
|
278
|
+
open_access=args.open_access if args.open_access else None,
|
|
279
|
+
min_citations=args.min_citations,
|
|
280
|
+
sort=sort_map[args.sort]
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
if args.json:
|
|
284
|
+
print(json.dumps(results, indent=2))
|
|
285
|
+
else:
|
|
286
|
+
print(f"Found {len(results)} papers:\n")
|
|
287
|
+
for i, work in enumerate(results, 1):
|
|
288
|
+
print(f"{i}. {work['title']}")
|
|
289
|
+
print(f" Authors: {', '.join(work['authors'][:3])}{' et al.' if len(work['authors']) > 3 else ''}")
|
|
290
|
+
print(f" Year: {work['publication_year']} | Venue: {work['venue']}")
|
|
291
|
+
print(f" Citations: {work['cited_by_count']} | OA: {'Yes' if work['is_oa'] else 'No'}")
|
|
292
|
+
if work['doi']:
|
|
293
|
+
print(f" DOI: {work['doi']}")
|
|
294
|
+
if work['oa_url']:
|
|
295
|
+
print(f" PDF: {work['oa_url']}")
|
|
296
|
+
if work['abstract']:
|
|
297
|
+
abstract_preview = work['abstract'][:200] + "..." if len(work['abstract']) > 200 else work['abstract']
|
|
298
|
+
print(f" Abstract: {abstract_preview}")
|
|
299
|
+
print()
|
|
300
|
+
|
|
301
|
+
elif args.command == "work":
|
|
302
|
+
work = client.get_work(args.work_id)
|
|
303
|
+
|
|
304
|
+
if args.json:
|
|
305
|
+
print(json.dumps(work, indent=2))
|
|
306
|
+
else:
|
|
307
|
+
print(f"Title: {work['title']}")
|
|
308
|
+
print(f"Authors: {', '.join(work['authors'])}")
|
|
309
|
+
print(f"Year: {work['publication_year']} | Venue: {work['venue']}")
|
|
310
|
+
print(f"Citations: {work['cited_by_count']} | OA: {'Yes' if work['is_oa'] else 'No'}")
|
|
311
|
+
if work['doi']:
|
|
312
|
+
print(f"DOI: {work['doi']}")
|
|
313
|
+
if work['oa_url']:
|
|
314
|
+
print(f"PDF: {work['oa_url']}")
|
|
315
|
+
if work['topics']:
|
|
316
|
+
print(f"Topics: {', '.join(work['topics'])}")
|
|
317
|
+
if work['abstract']:
|
|
318
|
+
print(f"\nAbstract:\n{work['abstract']}")
|
|
319
|
+
|
|
320
|
+
except Exception as e:
|
|
321
|
+
print(f"Error: {e}", file=sys.stderr)
|
|
322
|
+
sys.exit(1)
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
if __name__ == "__main__":
|
|
326
|
+
main()
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# overleaf_audit.sh β Scan a repo for accidental Overleaf token leaks.
|
|
3
|
+
#
|
|
4
|
+
# Run this any time you suspect a token may have been written somewhere:
|
|
5
|
+
# bash tools/overleaf_audit.sh [repo-root]
|
|
6
|
+
#
|
|
7
|
+
# Exits non-zero if any token-pattern leak is found.
|
|
8
|
+
# Token pattern: 'olp_' followed by 20+ alphanumerics.
|
|
9
|
+
|
|
10
|
+
set -o pipefail
|
|
11
|
+
|
|
12
|
+
ROOT="${1:-.}"
|
|
13
|
+
PATTERN='olp_[A-Za-z0-9]{20,}'
|
|
14
|
+
FOUND=0
|
|
15
|
+
|
|
16
|
+
echo "Scanning $ROOT for Overleaf token patternsβ¦"
|
|
17
|
+
echo ""
|
|
18
|
+
|
|
19
|
+
# 1. Working tree (excluding .git/ and node_modules/) βββββββββββββββββββββββββ
|
|
20
|
+
echo "[1/4] Working tree filesβ¦"
|
|
21
|
+
if command -v rg >/dev/null 2>&1; then
|
|
22
|
+
LEAKS=$(rg -n --no-heading -e "$PATTERN" \
|
|
23
|
+
--glob '!**/.git/**' --glob '!**/node_modules/**' \
|
|
24
|
+
--glob '!**/paper-overleaf/.git/**' \
|
|
25
|
+
"$ROOT" 2>/dev/null || true)
|
|
26
|
+
else
|
|
27
|
+
LEAKS=$(grep -rEn "$PATTERN" \
|
|
28
|
+
--exclude-dir=.git --exclude-dir=node_modules \
|
|
29
|
+
"$ROOT" 2>/dev/null || true)
|
|
30
|
+
fi
|
|
31
|
+
if [ -n "$LEAKS" ]; then
|
|
32
|
+
echo "β Token pattern in working tree:"
|
|
33
|
+
echo "$LEAKS"
|
|
34
|
+
FOUND=1
|
|
35
|
+
else
|
|
36
|
+
echo " β none"
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
# 2. Git remote URLs of all sub-repos βββββββββββββββββββββββββββββββββββββββββ
|
|
40
|
+
echo "[2/4] Git remote URLsβ¦"
|
|
41
|
+
LEAKS=""
|
|
42
|
+
while IFS= read -r -d '' gitdir; do
|
|
43
|
+
REPO=$(dirname "$gitdir")
|
|
44
|
+
if URL=$(cd "$REPO" && git remote -v 2>/dev/null); then
|
|
45
|
+
if echo "$URL" | grep -qE "$PATTERN"; then
|
|
46
|
+
LEAKS+="$REPO:"$'\n'"$URL"$'\n'
|
|
47
|
+
fi
|
|
48
|
+
fi
|
|
49
|
+
done < <(find "$ROOT" -name '.git' -type d -print0 2>/dev/null)
|
|
50
|
+
if [ -n "$LEAKS" ]; then
|
|
51
|
+
echo "β Token in remote URL:"
|
|
52
|
+
echo "$LEAKS"
|
|
53
|
+
FOUND=1
|
|
54
|
+
else
|
|
55
|
+
echo " β none"
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
# 3. Git history (current repo only β full --all scan can be expensive) βββββββ
|
|
59
|
+
echo "[3/4] Git history of repo at $ROOT ..."
|
|
60
|
+
if [ -d "$ROOT/.git" ]; then
|
|
61
|
+
LEAKS=$(cd "$ROOT" && git log -p --all 2>/dev/null | grep -E "$PATTERN" | head -5 || true)
|
|
62
|
+
if [ -n "$LEAKS" ]; then
|
|
63
|
+
echo "β Token pattern in git history (showing first 5 matches):"
|
|
64
|
+
echo "$LEAKS"
|
|
65
|
+
echo ""
|
|
66
|
+
echo " Token may already be public if pushed. Revoke immediately:"
|
|
67
|
+
echo " https://www.overleaf.com/user/settings"
|
|
68
|
+
FOUND=1
|
|
69
|
+
else
|
|
70
|
+
echo " β none"
|
|
71
|
+
fi
|
|
72
|
+
else
|
|
73
|
+
echo " (skipped β $ROOT is not a git repo)"
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
# 4. Common credential-storage files ββββββββββββββββββββββββββββββββββββββββββ
|
|
77
|
+
echo "[4/4] Credential files (.netrc, .env, *credentials*)β¦"
|
|
78
|
+
LEAKS=""
|
|
79
|
+
for f in ~/.netrc ~/.git-credentials "$ROOT/.env" "$ROOT/.envrc"; do
|
|
80
|
+
if [ -f "$f" ] && grep -qE "$PATTERN" "$f" 2>/dev/null; then
|
|
81
|
+
LEAKS+="$f"$'\n'
|
|
82
|
+
fi
|
|
83
|
+
done
|
|
84
|
+
if [ -n "$LEAKS" ]; then
|
|
85
|
+
echo "β οΈ Token in credential file (intentional? confirm not in repo):"
|
|
86
|
+
echo "$LEAKS"
|
|
87
|
+
else
|
|
88
|
+
echo " β none"
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
echo ""
|
|
92
|
+
if [ $FOUND -eq 0 ]; then
|
|
93
|
+
echo "β
Audit clean β no Overleaf token leaks found."
|
|
94
|
+
exit 0
|
|
95
|
+
else
|
|
96
|
+
echo "β Audit FAILED β see leaks above."
|
|
97
|
+
echo ""
|
|
98
|
+
echo "Action items:"
|
|
99
|
+
echo " 1. Revoke the leaked token at https://www.overleaf.com/user/settings"
|
|
100
|
+
echo " 2. Generate a new token"
|
|
101
|
+
echo " 3. Remove the leak (working tree: edit; remote URL: git remote set-url; history: git filter-repo)"
|
|
102
|
+
echo " 4. Re-run overleaf_setup.sh with the new token"
|
|
103
|
+
exit 1
|
|
104
|
+
fi
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# overleaf_setup.sh β One-time Overleaf Git bridge setup.
|
|
3
|
+
#
|
|
4
|
+
# CRITICAL: this script is meant to be run by the USER directly in their terminal,
|
|
5
|
+
# NEVER through an LLM agent. The user types the token into a hidden prompt; the
|
|
6
|
+
# script wires it into the OS keychain and immediately strips it from the git
|
|
7
|
+
# remote URL so no agent or file ever sees the cleartext token.
|
|
8
|
+
#
|
|
9
|
+
# Usage:
|
|
10
|
+
# bash tools/overleaf_setup.sh <project-id-or-url> [clone-dir]
|
|
11
|
+
#
|
|
12
|
+
# Example:
|
|
13
|
+
# bash tools/overleaf_setup.sh https://www.overleaf.com/project/69e478... paper-overleaf
|
|
14
|
+
|
|
15
|
+
set -euo pipefail
|
|
16
|
+
|
|
17
|
+
# ββ Refuse to run from a non-interactive context (i.e. inside an agent) ββββββββ
|
|
18
|
+
if [ ! -t 0 ] || [ ! -t 1 ]; then
|
|
19
|
+
echo "ERROR: overleaf_setup.sh requires an interactive terminal."
|
|
20
|
+
echo " Do NOT run this through an LLM agent β run it yourself in a terminal."
|
|
21
|
+
echo " The token must be typed into a hidden prompt, not pasted into chat."
|
|
22
|
+
exit 1
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
# ββ Args ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
26
|
+
if [ $# -lt 1 ]; then
|
|
27
|
+
echo "Usage: $0 <project-id-or-url> [clone-dir]"
|
|
28
|
+
echo ""
|
|
29
|
+
echo " project-id-or-url: e.g. 'abc123def456' or 'https://www.overleaf.com/project/abc123def456'"
|
|
30
|
+
echo " clone-dir: defaults to 'paper-overleaf'"
|
|
31
|
+
exit 1
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
RAW_INPUT="$1"
|
|
35
|
+
CLONE_DIR="${2:-paper-overleaf}"
|
|
36
|
+
|
|
37
|
+
# Strip URL down to project ID
|
|
38
|
+
PROJECT_ID="${RAW_INPUT##*/}"
|
|
39
|
+
PROJECT_ID="${PROJECT_ID%%\?*}"
|
|
40
|
+
if ! [[ "$PROJECT_ID" =~ ^[a-f0-9]{20,}$ ]]; then
|
|
41
|
+
echo "ERROR: project ID '$PROJECT_ID' does not look like an Overleaf project ID."
|
|
42
|
+
echo " Expected a hex string of 20+ characters."
|
|
43
|
+
exit 1
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
if [ -e "$CLONE_DIR" ]; then
|
|
47
|
+
echo "ERROR: '$CLONE_DIR' already exists. Remove it first or choose a different dir."
|
|
48
|
+
exit 1
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
# ββ Read token securely (no echo, never enters shell history) βββββββββββββββββ
|
|
52
|
+
echo "Setting up Overleaf bridge for project $PROJECT_ID β ./$CLONE_DIR/"
|
|
53
|
+
echo ""
|
|
54
|
+
echo "Get a token at: https://www.overleaf.com/user/settings β Git Integration β Create Token"
|
|
55
|
+
echo ""
|
|
56
|
+
read -r -s -p "Paste Overleaf token (input hidden): " OL_TOKEN
|
|
57
|
+
echo ""
|
|
58
|
+
|
|
59
|
+
if [ -z "$OL_TOKEN" ]; then
|
|
60
|
+
echo "ERROR: empty token"
|
|
61
|
+
exit 1
|
|
62
|
+
fi
|
|
63
|
+
if [[ ! "$OL_TOKEN" =~ ^olp_[A-Za-z0-9]+$ ]]; then
|
|
64
|
+
echo "WARNING: token does not start with 'olp_' β proceeding but verify it's correct."
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
# ββ Clone with token in URL (transient) βββββββββββββββββββββββββββββββββββββββ
|
|
68
|
+
echo "Cloningβ¦"
|
|
69
|
+
if ! git clone "https://git:${OL_TOKEN}@git.overleaf.com/${PROJECT_ID}" "$CLONE_DIR" 2>&1 \
|
|
70
|
+
| sed "s|${OL_TOKEN}|<TOKEN>|g"; then
|
|
71
|
+
unset OL_TOKEN
|
|
72
|
+
echo "ERROR: clone failed"
|
|
73
|
+
exit 1
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
# ββ Immediately strip token from remote URL βββββββββββββββββββββββββββββββββββ
|
|
77
|
+
cd "$CLONE_DIR"
|
|
78
|
+
git remote set-url origin "https://git.overleaf.com/${PROJECT_ID}"
|
|
79
|
+
|
|
80
|
+
# ββ Configure credential helper βββββββββββββββββββββββββββββββββββββββββββββββ
|
|
81
|
+
case "$(uname -s)" in
|
|
82
|
+
Darwin) HELPER=osxkeychain ;;
|
|
83
|
+
Linux) HELPER=cache ;;
|
|
84
|
+
MINGW*|MSYS*|CYGWIN*) HELPER=manager ;;
|
|
85
|
+
*) HELPER=store ;;
|
|
86
|
+
esac
|
|
87
|
+
git config --global credential.helper "$HELPER" 2>/dev/null || \
|
|
88
|
+
git config credential.helper "$HELPER"
|
|
89
|
+
|
|
90
|
+
# ββ Prime credential storage so future pull/push is auth-free βββββββββββββββββ
|
|
91
|
+
git credential approve <<EOF
|
|
92
|
+
protocol=https
|
|
93
|
+
host=git.overleaf.com
|
|
94
|
+
username=git
|
|
95
|
+
password=${OL_TOKEN}
|
|
96
|
+
|
|
97
|
+
EOF
|
|
98
|
+
|
|
99
|
+
# ββ Clear token from memory βββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
100
|
+
unset OL_TOKEN
|
|
101
|
+
|
|
102
|
+
# ββ Install hard-block pre-commit hook ββββββββββββββββββββββββββββββββββββββββ
|
|
103
|
+
HOOK_DIR=".git/hooks"
|
|
104
|
+
mkdir -p "$HOOK_DIR"
|
|
105
|
+
cat > "$HOOK_DIR/pre-commit" <<'HOOK'
|
|
106
|
+
#!/usr/bin/env bash
|
|
107
|
+
# Auto-installed by overleaf_setup.sh. Refuses to commit anything containing
|
|
108
|
+
# what looks like an Overleaf token pattern. Cannot be bypassed by any agent
|
|
109
|
+
# without --no-verify (which the ARIS protocol forbids without explicit user OK).
|
|
110
|
+
set -e
|
|
111
|
+
if git diff --cached | grep -qE 'olp_[A-Za-z0-9]{20,}'; then
|
|
112
|
+
echo "ERROR: Overleaf token pattern (olp_β¦) detected in staged changes."
|
|
113
|
+
echo " Refusing to commit. Remove the token before committing."
|
|
114
|
+
echo " Also revoke it at https://www.overleaf.com/user/settings"
|
|
115
|
+
exit 1
|
|
116
|
+
fi
|
|
117
|
+
HOOK
|
|
118
|
+
chmod +x "$HOOK_DIR/pre-commit"
|
|
119
|
+
|
|
120
|
+
# ββ Verify token was actually stripped from remote ββββββββββββββββββββββββββββ
|
|
121
|
+
if git remote -v | grep -qE 'olp_'; then
|
|
122
|
+
echo ""
|
|
123
|
+
echo "FATAL: token still present in remote URL after strip. Aborting."
|
|
124
|
+
cd .. && rm -rf "$CLONE_DIR"
|
|
125
|
+
exit 1
|
|
126
|
+
fi
|
|
127
|
+
|
|
128
|
+
# ββ Set local commit identity (best-effort) βββββββββββββββββββββββββββββββββββ
|
|
129
|
+
if [ -z "$(git config user.email 2>/dev/null)" ]; then
|
|
130
|
+
GLOBAL_EMAIL="$(git config --global user.email 2>/dev/null || true)"
|
|
131
|
+
if [ -n "$GLOBAL_EMAIL" ]; then
|
|
132
|
+
git config user.email "$GLOBAL_EMAIL"
|
|
133
|
+
else
|
|
134
|
+
echo "NOTE: no git user.email set. Run:"
|
|
135
|
+
echo " cd $CLONE_DIR && git config user.email <your-email>"
|
|
136
|
+
fi
|
|
137
|
+
fi
|
|
138
|
+
|
|
139
|
+
# ββ Final report ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
140
|
+
cd ..
|
|
141
|
+
echo ""
|
|
142
|
+
echo "β
Setup complete."
|
|
143
|
+
echo ""
|
|
144
|
+
echo " Clone: ./$CLONE_DIR/"
|
|
145
|
+
echo " Remote URL: $(cd "$CLONE_DIR" && git remote get-url origin) β no token"
|
|
146
|
+
echo " Credential: stored in $HELPER"
|
|
147
|
+
echo " Pre-commit: installed (blocks olp_β¦ patterns)"
|
|
148
|
+
echo ""
|
|
149
|
+
echo "From here on, agents can run pull/push against $CLONE_DIR/ without seeing a token."
|
|
150
|
+
echo "If pull/push ever fails with 401, your token expired β re-run this script."
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Legacy entry point β forwards to the canonical paper_illustration_image2.
|
|
3
|
+
|
|
4
|
+
The canonical implementation now lives at
|
|
5
|
+
skills/paper-illustration-image2/scripts/paper_illustration_image2.py
|
|
6
|
+
(Phase 3.2 β Arch C β self-contained single-owner helper).
|
|
7
|
+
|
|
8
|
+
This shim keeps the four legacy resolver layers working without a
|
|
9
|
+
re-install:
|
|
10
|
+
|
|
11
|
+
.aris/tools/paper_illustration_image2.py
|
|
12
|
+
β $ARIS_REPO/tools/paper_illustration_image2.py (this shim)
|
|
13
|
+
β $ARIS_REPO/skills/paper-illustration-image2/scripts/paper_illustration_image2.py
|
|
14
|
+
|
|
15
|
+
tools/paper_illustration_image2.py (in-repo run)
|
|
16
|
+
β this shim β canonical
|
|
17
|
+
|
|
18
|
+
$ARIS_REPO/tools/paper_illustration_image2.py (env-var)
|
|
19
|
+
β this shim β canonical
|
|
20
|
+
|
|
21
|
+
Manual <project>/tools/paper_illustration_image2.py copies of the
|
|
22
|
+
pre-Phase-3.2 file continue to work standalone (no shim semantics
|
|
23
|
+
needed; the canonical script is self-contained).
|
|
24
|
+
|
|
25
|
+
`os.execv` replaces the current Python process so the canonical
|
|
26
|
+
helper sees its own `__file__` and computes paths relative to itself,
|
|
27
|
+
not relative to this shim.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
from __future__ import annotations
|
|
31
|
+
|
|
32
|
+
import os
|
|
33
|
+
import sys
|
|
34
|
+
from pathlib import Path
|
|
35
|
+
|
|
36
|
+
HERE = Path(__file__).resolve().parent
|
|
37
|
+
REPO_ROOT = HERE.parent
|
|
38
|
+
REAL = REPO_ROOT / "skills" / "paper-illustration-image2" / "scripts" / "paper_illustration_image2.py"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _fail(msg: str) -> int:
|
|
42
|
+
sys.stderr.write(msg + "\n")
|
|
43
|
+
return 1
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def main() -> int:
|
|
47
|
+
if not REAL.is_file():
|
|
48
|
+
return _fail(
|
|
49
|
+
f"ERROR: canonical paper_illustration_image2.py not found at {REAL}.\n"
|
|
50
|
+
" The Phase 3.2 migration moved this helper into the\n"
|
|
51
|
+
" /paper-illustration-image2 SKILL\n"
|
|
52
|
+
" ('skills/paper-illustration-image2/scripts/'). Your\n"
|
|
53
|
+
" local checkout may be incomplete β try `git pull` from the\n"
|
|
54
|
+
" ARIS repo, or rerun `bash tools/install_aris.sh` to refresh\n"
|
|
55
|
+
" the project-local symlink chain."
|
|
56
|
+
)
|
|
57
|
+
os.execv(sys.executable, [sys.executable, str(REAL), *sys.argv[1:]])
|
|
58
|
+
return 0 # unreachable; os.execv does not return on success
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
if __name__ == "__main__":
|
|
62
|
+
sys.exit(main())
|