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