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 @@
|
|
|
1
|
+
lark-oapi>=1.0,<2.0
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Feishu Bridge Server — provides HTTP API for ARIS skills to send messages
|
|
4
|
+
to Feishu and poll for user replies.
|
|
5
|
+
|
|
6
|
+
Endpoints:
|
|
7
|
+
POST /send — send a card message to Feishu user, return message_id
|
|
8
|
+
GET /poll — wait for user reply (long-poll with timeout)
|
|
9
|
+
GET /health — health check
|
|
10
|
+
|
|
11
|
+
Requires:
|
|
12
|
+
pip install lark-oapi
|
|
13
|
+
|
|
14
|
+
Environment variables:
|
|
15
|
+
FEISHU_APP_ID — Feishu app ID
|
|
16
|
+
FEISHU_APP_SECRET — Feishu app secret
|
|
17
|
+
FEISHU_USER_ID — Target user's open_id (who receives notifications)
|
|
18
|
+
BRIDGE_PORT — HTTP port (default: 5000)
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import os
|
|
22
|
+
import sys
|
|
23
|
+
import json
|
|
24
|
+
import time
|
|
25
|
+
import threading
|
|
26
|
+
from http.server import HTTPServer, BaseHTTPRequestHandler
|
|
27
|
+
|
|
28
|
+
try:
|
|
29
|
+
import lark_oapi as lark
|
|
30
|
+
from lark_oapi.api.im.v1 import (
|
|
31
|
+
CreateMessageRequest, CreateMessageRequestBody,
|
|
32
|
+
)
|
|
33
|
+
except ImportError:
|
|
34
|
+
print("Error: lark-oapi not installed. Run: pip install lark-oapi", file=sys.stderr)
|
|
35
|
+
sys.exit(1)
|
|
36
|
+
|
|
37
|
+
# --- Configuration ---
|
|
38
|
+
APP_ID = os.environ.get("FEISHU_APP_ID", "")
|
|
39
|
+
APP_SECRET = os.environ.get("FEISHU_APP_SECRET", "")
|
|
40
|
+
USER_ID = os.environ.get("FEISHU_USER_ID", "")
|
|
41
|
+
PORT = int(os.environ.get("BRIDGE_PORT", "5000"))
|
|
42
|
+
|
|
43
|
+
if not APP_ID or not APP_SECRET:
|
|
44
|
+
print("Error: FEISHU_APP_ID and FEISHU_APP_SECRET are required", file=sys.stderr)
|
|
45
|
+
sys.exit(1)
|
|
46
|
+
|
|
47
|
+
if not USER_ID:
|
|
48
|
+
print("Warning: FEISHU_USER_ID not set — /send will require user_id in request body", file=sys.stderr)
|
|
49
|
+
|
|
50
|
+
# --- Lark Client ---
|
|
51
|
+
client = lark.Client.builder().app_id(APP_ID).app_secret(APP_SECRET).build()
|
|
52
|
+
|
|
53
|
+
# --- Reply Store (thread-safe) ---
|
|
54
|
+
reply_store = {}
|
|
55
|
+
reply_lock = threading.Lock()
|
|
56
|
+
reply_events = {}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def send_card(user_id: str, title: str, body: str, color: str = "blue") -> dict:
|
|
60
|
+
"""Send an interactive card to a Feishu user."""
|
|
61
|
+
card = json.dumps({
|
|
62
|
+
"header": {
|
|
63
|
+
"title": {"tag": "plain_text", "content": title},
|
|
64
|
+
"template": color,
|
|
65
|
+
},
|
|
66
|
+
"elements": [
|
|
67
|
+
{"tag": "markdown", "content": body}
|
|
68
|
+
]
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
request = CreateMessageRequest.builder() \
|
|
72
|
+
.receive_id_type("open_id") \
|
|
73
|
+
.request_body(
|
|
74
|
+
CreateMessageRequestBody.builder()
|
|
75
|
+
.receive_id(user_id)
|
|
76
|
+
.msg_type("interactive")
|
|
77
|
+
.content(card)
|
|
78
|
+
.build()
|
|
79
|
+
).build()
|
|
80
|
+
|
|
81
|
+
response = client.im.v1.message.create(request)
|
|
82
|
+
|
|
83
|
+
if not response.success():
|
|
84
|
+
return {"error": response.msg, "code": response.code}
|
|
85
|
+
|
|
86
|
+
msg_id = response.data.message_id
|
|
87
|
+
# Prepare reply event for this message
|
|
88
|
+
with reply_lock:
|
|
89
|
+
reply_events[msg_id] = threading.Event()
|
|
90
|
+
reply_store[msg_id] = None
|
|
91
|
+
|
|
92
|
+
return {"ok": True, "message_id": msg_id}
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def send_text(user_id: str, text: str) -> dict:
|
|
96
|
+
"""Send a plain text message to a Feishu user."""
|
|
97
|
+
request = CreateMessageRequest.builder() \
|
|
98
|
+
.receive_id_type("open_id") \
|
|
99
|
+
.request_body(
|
|
100
|
+
CreateMessageRequestBody.builder()
|
|
101
|
+
.receive_id(user_id)
|
|
102
|
+
.msg_type("text")
|
|
103
|
+
.content(json.dumps({"text": text}))
|
|
104
|
+
.build()
|
|
105
|
+
).build()
|
|
106
|
+
|
|
107
|
+
response = client.im.v1.message.create(request)
|
|
108
|
+
|
|
109
|
+
if not response.success():
|
|
110
|
+
return {"error": response.msg, "code": response.code}
|
|
111
|
+
|
|
112
|
+
return {"ok": True, "message_id": response.data.message_id}
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def poll_reply(message_id: str, timeout: int = 300) -> dict:
|
|
116
|
+
"""Wait for a user reply to a specific message."""
|
|
117
|
+
with reply_lock:
|
|
118
|
+
event = reply_events.get(message_id)
|
|
119
|
+
|
|
120
|
+
if not event:
|
|
121
|
+
return {"error": "unknown message_id"}
|
|
122
|
+
|
|
123
|
+
# Wait for reply or timeout
|
|
124
|
+
got_reply = event.wait(timeout=timeout)
|
|
125
|
+
|
|
126
|
+
with reply_lock:
|
|
127
|
+
reply = reply_store.pop(message_id, None)
|
|
128
|
+
reply_events.pop(message_id, None)
|
|
129
|
+
|
|
130
|
+
if got_reply and reply:
|
|
131
|
+
return {"reply": reply}
|
|
132
|
+
else:
|
|
133
|
+
return {"timeout": True}
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def receive_reply(message_id: str, text: str):
|
|
137
|
+
"""Called when a user replies (webhook or external trigger)."""
|
|
138
|
+
with reply_lock:
|
|
139
|
+
if message_id in reply_store:
|
|
140
|
+
reply_store[message_id] = text
|
|
141
|
+
reply_events[message_id].set()
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
# --- HTTP Handler ---
|
|
145
|
+
class BridgeHandler(BaseHTTPRequestHandler):
|
|
146
|
+
def do_GET(self):
|
|
147
|
+
if self.path == "/health":
|
|
148
|
+
self._json_response({"status": "ok", "port": PORT})
|
|
149
|
+
return
|
|
150
|
+
|
|
151
|
+
if self.path.startswith("/poll"):
|
|
152
|
+
# Parse query params
|
|
153
|
+
params = {}
|
|
154
|
+
if "?" in self.path:
|
|
155
|
+
query = self.path.split("?", 1)[1]
|
|
156
|
+
for pair in query.split("&"):
|
|
157
|
+
if "=" in pair:
|
|
158
|
+
k, v = pair.split("=", 1)
|
|
159
|
+
params[k] = v
|
|
160
|
+
|
|
161
|
+
message_id = params.get("message_id", "")
|
|
162
|
+
timeout = int(params.get("timeout", "300"))
|
|
163
|
+
|
|
164
|
+
if not message_id:
|
|
165
|
+
self._json_response({"error": "message_id required"}, 400)
|
|
166
|
+
return
|
|
167
|
+
|
|
168
|
+
result = poll_reply(message_id, timeout)
|
|
169
|
+
self._json_response(result)
|
|
170
|
+
return
|
|
171
|
+
|
|
172
|
+
self._json_response({"error": "not found"}, 404)
|
|
173
|
+
|
|
174
|
+
def do_POST(self):
|
|
175
|
+
if self.path == "/send":
|
|
176
|
+
content_length = int(self.headers.get("Content-Length", 0))
|
|
177
|
+
body = json.loads(self.rfile.read(content_length)) if content_length else {}
|
|
178
|
+
|
|
179
|
+
user_id = body.get("user_id", USER_ID)
|
|
180
|
+
if not user_id:
|
|
181
|
+
self._json_response({"error": "user_id required (set FEISHU_USER_ID or pass in body)"}, 400)
|
|
182
|
+
return
|
|
183
|
+
|
|
184
|
+
msg_type = body.get("type", "card")
|
|
185
|
+
title = body.get("title", "ARIS Notification")
|
|
186
|
+
content = body.get("body", body.get("content", ""))
|
|
187
|
+
color = body.get("color", "blue")
|
|
188
|
+
|
|
189
|
+
if msg_type == "text":
|
|
190
|
+
result = send_text(user_id, content)
|
|
191
|
+
else:
|
|
192
|
+
result = send_card(user_id, title, content, color)
|
|
193
|
+
|
|
194
|
+
self._json_response(result)
|
|
195
|
+
return
|
|
196
|
+
|
|
197
|
+
if self.path == "/reply":
|
|
198
|
+
# External hook: when user replies, call this endpoint
|
|
199
|
+
content_length = int(self.headers.get("Content-Length", 0))
|
|
200
|
+
body = json.loads(self.rfile.read(content_length)) if content_length else {}
|
|
201
|
+
|
|
202
|
+
message_id = body.get("message_id", "")
|
|
203
|
+
text = body.get("text", "")
|
|
204
|
+
|
|
205
|
+
if message_id:
|
|
206
|
+
receive_reply(message_id, text)
|
|
207
|
+
self._json_response({"ok": True})
|
|
208
|
+
else:
|
|
209
|
+
self._json_response({"error": "message_id required"}, 400)
|
|
210
|
+
return
|
|
211
|
+
|
|
212
|
+
self._json_response({"error": "not found"}, 404)
|
|
213
|
+
|
|
214
|
+
def _json_response(self, data, status=200):
|
|
215
|
+
self.send_response(status)
|
|
216
|
+
self.send_header("Content-Type", "application/json")
|
|
217
|
+
self.end_headers()
|
|
218
|
+
self.wfile.write(json.dumps(data).encode())
|
|
219
|
+
|
|
220
|
+
def log_message(self, format, *args):
|
|
221
|
+
# Quiet logging
|
|
222
|
+
pass
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def main():
|
|
226
|
+
server = HTTPServer(("0.0.0.0", PORT), BridgeHandler)
|
|
227
|
+
print(f"Feishu Bridge Server running on http://0.0.0.0:{PORT}")
|
|
228
|
+
print(f" POST /send — send card/text to Feishu")
|
|
229
|
+
print(f" GET /poll — wait for user reply")
|
|
230
|
+
print(f" POST /reply — receive user reply (webhook)")
|
|
231
|
+
print(f" GET /health — health check")
|
|
232
|
+
try:
|
|
233
|
+
server.serve_forever()
|
|
234
|
+
except KeyboardInterrupt:
|
|
235
|
+
print("\nShutting down.")
|
|
236
|
+
server.server_close()
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
if __name__ == "__main__":
|
|
240
|
+
main()
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# Gemini Review MCP
|
|
2
|
+
|
|
3
|
+
Bridge Codex-first ARIS workflows to Gemini, using the direct Gemini API by default.
|
|
4
|
+
|
|
5
|
+
## What it does
|
|
6
|
+
|
|
7
|
+
- Keeps **Codex** as the executor
|
|
8
|
+
- Uses **Gemini** as the external reviewer
|
|
9
|
+
- Exposes synchronous MCP tools:
|
|
10
|
+
- `review`
|
|
11
|
+
- `review_reply`
|
|
12
|
+
- Exposes asynchronous MCP tools for long reviewer prompts:
|
|
13
|
+
- `review_start`
|
|
14
|
+
- `review_reply_start`
|
|
15
|
+
- `review_status`
|
|
16
|
+
|
|
17
|
+
The synchronous tools return a JSON string containing `threadId` and `response`.
|
|
18
|
+
The asynchronous start tools return a JSON string containing `jobId` and `status`, and `review_status` later returns the final `threadId` and `response`.
|
|
19
|
+
When using the direct API backend, the tools also accept optional `imagePaths` / `image_paths` so Gemini can review local PNG/JPG/WebP files, which is used by the poster visual-review overlay.
|
|
20
|
+
|
|
21
|
+
## Install into Codex
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
mkdir -p ~/.codex/mcp-servers/gemini-review
|
|
25
|
+
cp mcp-servers/gemini-review/server.py ~/.codex/mcp-servers/gemini-review/server.py
|
|
26
|
+
codex mcp add gemini-review --env GEMINI_REVIEW_BACKEND=api -- python3 ~/.codex/mcp-servers/gemini-review/server.py
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Prerequisites
|
|
30
|
+
|
|
31
|
+
Prepare the direct Gemini API path before use:
|
|
32
|
+
|
|
33
|
+
- **Gemini API**: set `GEMINI_API_KEY` or `GOOGLE_API_KEY`
|
|
34
|
+
|
|
35
|
+
Optional fallback only:
|
|
36
|
+
|
|
37
|
+
- **Gemini CLI**: install `gemini` and complete CLI login/auth if you explicitly want `GEMINI_REVIEW_BACKEND=cli`
|
|
38
|
+
- **Antigravity CLI**: install/authenticate `agy` if you explicitly want `GEMINI_REVIEW_BACKEND=agy`
|
|
39
|
+
|
|
40
|
+
The server also auto-loads `~/.gemini/.env` if it exists, so a local file such as:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
export GEMINI_API_KEY=...
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
is enough for API mode without exporting the variable in every shell.
|
|
47
|
+
|
|
48
|
+
## Environment Variables
|
|
49
|
+
|
|
50
|
+
- `GEMINI_BIN`: Gemini CLI path, defaults to `gemini`
|
|
51
|
+
- `AGY_BIN`: Antigravity CLI path, defaults to `agy`
|
|
52
|
+
- `GEMINI_REVIEW_MODEL`: optional reviewer model override used by API/Gemini CLI backends; `agy` model selection is controlled by Antigravity settings, so the bridge reports the actual model recovered from the current log/transcript and records any requested model as provenance only
|
|
53
|
+
- `GEMINI_REVIEW_API_MODEL`: API-only default when `GEMINI_REVIEW_MODEL` is unset, defaults to `gemini-2.5-flash`
|
|
54
|
+
- `GEMINI_REVIEW_SYSTEM`: optional default system prompt
|
|
55
|
+
- `GEMINI_REVIEW_BACKEND`: reviewer backend override, one of `api`, `auto`, `cli`, or `agy`; defaults to `api`
|
|
56
|
+
- `GEMINI_REVIEW_TIMEOUT_SEC`: HTTP / subprocess timeout, defaults to `600`
|
|
57
|
+
- `GEMINI_REVIEW_MAX_STATUS_WAIT_SECONDS`: maximum blocking wait for `review_status`, defaults to `30`
|
|
58
|
+
- `GEMINI_REVIEW_AGY_PRINT_TIMEOUT`: Antigravity `--print-timeout` value, defaults to `${GEMINI_REVIEW_TIMEOUT_SEC}s`
|
|
59
|
+
- `GEMINI_REVIEW_AGY_APP_DATA_DIR`: Antigravity CLI app data directory, defaults to `~/.gemini/antigravity-cli`
|
|
60
|
+
- `GEMINI_REVIEW_AGY_ARTIFACT_MAX_CHARS`: max characters read from an AGY-generated text artifact, defaults to `200000`
|
|
61
|
+
- `GEMINI_REVIEW_WORKSPACE_ROOT`: workspace root for local `imagePaths`, defaults to the server process current working directory
|
|
62
|
+
- `GEMINI_REVIEW_STATE_DIR`: bridge state directory, defaults to `~/.codex/state/gemini-review`
|
|
63
|
+
- `GEMINI_REVIEW_DEBUG_LOG`: debug log path, defaults to `~/.codex/state/gemini-review/debug.log`; custom paths must resolve under `GEMINI_REVIEW_STATE_DIR`
|
|
64
|
+
- `GEMINI_API_KEY`: Gemini API key
|
|
65
|
+
- `GOOGLE_API_KEY`: alternate Gemini API key env var
|
|
66
|
+
|
|
67
|
+
## Notes
|
|
68
|
+
|
|
69
|
+
- The bridge defaults to the direct Gemini API path. This is the intended reviewer backend for the ARIS skill overlay.
|
|
70
|
+
- The server auto-loads only `GEMINI_API_KEY` and `GOOGLE_API_KEY` from `~/.gemini/.env`; the file is ignored if it is a symlink, not owned by the current user, not a regular file, or group/world-writable.
|
|
71
|
+
- `GEMINI_REVIEW_BACKEND=auto` is still supported if you want API-first auto-selection; it uses the API when a Gemini API key is configured and otherwise falls back to the Gemini CLI. Antigravity is never selected by `auto`; use `GEMINI_REVIEW_BACKEND=agy` explicitly.
|
|
72
|
+
- `GEMINI_REVIEW_BACKEND=agy` routes review prompts through `agy --print`, which is useful when you want Codex to keep the MCP contract but use Antigravity CLI authentication/model routing. Because `agy --print` can exit successfully after writing a conversation transcript or generated artifact without printing the final text to stdout, the bridge passes a per-call `--log-file` and can recover from the Antigravity transcript for that same invocation only.
|
|
73
|
+
- The `agy` backend is fail-closed for ARIS's cross-model invariant: the bridge cannot choose the Antigravity model per call, so it treats Antigravity's selected model as external configuration. After each call it must recover an actual Gemini-family model id from the current invocation's log/transcript and returns that id as `model`. If a caller passes a `model` value, the response also includes `requested_model` and a `warning` because the current `agy` CLI does not expose per-call model selection. If Antigravity routes the request to a non-Gemini model, or the log/transcript does not expose a model id, the call fails instead of returning an unauditable `"agy-cli"` placeholder.
|
|
74
|
+
- Antigravity transcript recovery validates conversation ids with `^[0-9A-Za-z_-]+$`, caps ids at 128 characters, requires the per-call invocation nonce, and accepts the nonce only from user/bridge-written transcript events before considering later transcript lines. Generated text artifacts are read only from the final planner response, only as a fallback when that response has no substantive inline text, only if their resolved `file://` path stays under `GEMINI_REVIEW_AGY_APP_DATA_DIR/brain/<conversation>/`, and only if the artifact was updated during the current invocation window.
|
|
75
|
+
- If the default API model is temporarily rate-limited on your current free-tier window, keep the same bridge and set `GEMINI_REVIEW_MODEL=gemini-flash-latest` as a model override.
|
|
76
|
+
- The `tools` argument is accepted for compatibility with existing skills, but is ignored. This matches the original pattern where the external reviewer only sees the prompt context prepared by Codex.
|
|
77
|
+
- `imagePaths` / `image_paths` are supported only by the direct Gemini API backend in this bridge. Paths must resolve under `GEMINI_REVIEW_WORKSPACE_ROOT` and are opened with no-symlink safeguards; platforms where the opened fd cannot be re-verified fail closed. CLI and `agy` fallback paths remain text-only.
|
|
78
|
+
- `threadId` is a bridge-local conversation id persisted under `~/.codex/state/gemini-review/threads/` by default and can be passed to `review_reply`.
|
|
79
|
+
- `jobId` is a bridge-local background task id stored under `~/.codex/state/gemini-review/jobs/` by default, so status can be resumed across MCP server restarts.
|
|
80
|
+
- State files contain review prompts/responses so async jobs and threads can resume. The bridge creates state, thread, job, debug-log, and per-call `agy` log directories with owner-only permissions where possible; `agy` per-call log directories are temporary and are removed after the call. Delete `GEMINI_REVIEW_STATE_DIR` when you no longer need resumability. If you override `GEMINI_REVIEW_STATE_DIR`, choose a private directory rather than a shared `/tmp` path.
|
|
81
|
+
- This is intentionally a narrow, repo-local adapter. We did not directly vendor a generic Gemini MCP server, because the ARIS reviewer-aware skills expect the specific `review` / `review_reply` / `review_start` / `review_reply_start` / `review_status` interface and resumable review-thread semantics.
|
|
82
|
+
|
|
83
|
+
## Validation
|
|
84
|
+
|
|
85
|
+
This bridge was validated against the ARIS reviewer workflow in a privacy-safe way:
|
|
86
|
+
|
|
87
|
+
- direct bridge smoke tests passed for:
|
|
88
|
+
- `review`
|
|
89
|
+
- `review_start` -> `review_status`
|
|
90
|
+
- `review_reply_start` -> `review_status`
|
|
91
|
+
- local-image multimodal review through `imagePaths`
|
|
92
|
+
- the overlayed reviewer-aware Codex skills were checked to ensure all `15` predefined overrides point at this bridge contract
|
|
93
|
+
- representative Codex-side executions on a private, non-public research repository confirmed that real skill runs can enter the `gemini-review` path from research-review, idea-generation, and paper-planning style workflows
|
|
94
|
+
|
|
95
|
+
Important nuance from testing:
|
|
96
|
+
|
|
97
|
+
- Gemini free tier was sufficient for development-style validation, but bursty back-to-back runs could still trigger temporary `429` responses
|
|
98
|
+
- on the same setup, a later retry completed sync review, async `review_start` -> `review_status`, and threaded `review_reply_start` -> `review_status` successfully with `GEMINI_REVIEW_MODEL=gemini-flash-latest`
|
|
99
|
+
- long synchronous reviewer calls can still hit host-side MCP tool timeouts before Gemini responds
|
|
100
|
+
- because of that, the async path is not just an implementation detail; it is the recommended operational path for long reviews
|
|
101
|
+
|
|
102
|
+
## When to use sync vs async
|
|
103
|
+
|
|
104
|
+
- Use `review` / `review_reply` for short prompts that comfortably finish within the host MCP tool timeout.
|
|
105
|
+
- Use `review_start` / `review_reply_start` + `review_status` for long paper or project reviews. This avoids the observed `Codex -> tools/call` timeout around 120 seconds.
|
|
106
|
+
|
|
107
|
+
## Async flow
|
|
108
|
+
|
|
109
|
+
Start a long review:
|
|
110
|
+
|
|
111
|
+
```json
|
|
112
|
+
{
|
|
113
|
+
"name": "review_start",
|
|
114
|
+
"arguments": {
|
|
115
|
+
"prompt": "Review this paper draft..."
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Multimodal example:
|
|
121
|
+
|
|
122
|
+
```json
|
|
123
|
+
{
|
|
124
|
+
"name": "review_start",
|
|
125
|
+
"arguments": {
|
|
126
|
+
"prompt": "Review this poster PNG for readability and clipping.",
|
|
127
|
+
"imagePaths": ["poster/poster_v1.png"]
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Example response:
|
|
133
|
+
|
|
134
|
+
```json
|
|
135
|
+
{
|
|
136
|
+
"jobId": "5d8d0a9c5a2f4f42ae44f6f0c2d73f6f",
|
|
137
|
+
"status": "queued",
|
|
138
|
+
"done": false
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Poll later:
|
|
143
|
+
|
|
144
|
+
```json
|
|
145
|
+
{
|
|
146
|
+
"name": "review_status",
|
|
147
|
+
"arguments": {
|
|
148
|
+
"jobId": "5d8d0a9c5a2f4f42ae44f6f0c2d73f6f",
|
|
149
|
+
"waitSeconds": 20
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
When complete, `review_status` returns the same reviewer payload fields as the synchronous tools, including `threadId`, `response`, `model`, `backend`, and `stop_reason`. For `agy` calls, the payload also includes `model_provenance`; if a model was requested, it also includes `requested_model` and `warning`.
|
|
155
|
+
|
|
156
|
+
## Provenance and References
|
|
157
|
+
|
|
158
|
+
- Upstream interaction pattern: ARIS `claude-review` bridge and `skills-codex-claude-review` in `Auto-claude-code-research-in-sleep`
|
|
159
|
+
- <https://github.com/wanshuiyin/Auto-claude-code-research-in-sleep/tree/main/mcp-servers/claude-review>
|
|
160
|
+
- <https://github.com/wanshuiyin/Auto-claude-code-research-in-sleep/tree/main/skills/skills-codex-claude-review>
|
|
161
|
+
- Gemini backends used by this bridge:
|
|
162
|
+
- Official Gemini API docs: <https://ai.google.dev/api>
|
|
163
|
+
- Official Gemini CLI: <https://github.com/google-gemini/gemini-cli>
|
|
164
|
+
- Gemini API access and pricing:
|
|
165
|
+
- API key / AI Studio entry: <https://aistudio.google.com/apikey>
|
|
166
|
+
- Gemini API pricing: <https://ai.google.dev/gemini-api/docs/pricing>
|
|
167
|
+
- MCP protocol reference:
|
|
168
|
+
- <https://modelcontextprotocol.info/specification/>
|
|
169
|
+
- Related generic Gemini MCP server example:
|
|
170
|
+
- `eLyiN/gemini-bridge`: <https://github.com/eLyiN/gemini-bridge>
|
|
171
|
+
- We inspected this class of generic Gemini MCP servers, but kept a thin compatibility adapter here because their tool schema and session model do not match the ARIS review-only bridge directly.
|