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,279 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Manual Review — ARIS</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root { --bg: #f8f9fa; --fg: #1a1a2e; --panel: #fff; --border: #dee2e6; --accent: #4361ee; --accent-hover: #3a56d4; --success: #2ecc71; --muted: #6c757d; }
|
|
9
|
+
@media (prefers-color-scheme: dark) { :root { --bg: #1a1a2e; --fg: #e8e8e8; --panel: #16213e; --border: #2a2a4a; --accent: #4cc9f0; --accent-hover: #3db8dd; --success: #2ecc71; --muted: #8892a4; } }
|
|
10
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
11
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg); color: var(--fg); min-height: 100vh; display: flex; flex-direction: column; }
|
|
12
|
+
header { display: flex; align-items: center; justify-content: space-between; padding: 12px 24px; border-bottom: 1px solid var(--border); background: var(--panel); }
|
|
13
|
+
header h1 { font-size: 1.2rem; font-weight: 600; }
|
|
14
|
+
.lang-switch { padding: 4px 12px; border: 1px solid var(--border); border-radius: 4px; background: var(--panel); color: var(--fg); cursor: pointer; font-size: 0.85rem; }
|
|
15
|
+
.tutorial { padding: 12px 24px; background: var(--panel); border-bottom: 1px solid var(--border); font-size: 0.9rem; color: var(--muted); cursor: pointer; }
|
|
16
|
+
.tutorial summary { font-weight: 500; color: var(--fg); }
|
|
17
|
+
.tutorial ol { margin-top: 8px; padding-left: 20px; line-height: 1.6; }
|
|
18
|
+
.main { display: flex; flex: 1; min-height: 0; }
|
|
19
|
+
.panel { flex: 1; display: flex; flex-direction: column; padding: 16px; }
|
|
20
|
+
.panel:first-child { border-right: 1px solid var(--border); }
|
|
21
|
+
.panel-label { font-size: 0.8rem; font-weight: 600; text-transform: uppercase; color: var(--muted); margin-bottom: 8px; }
|
|
22
|
+
textarea { flex: 1; width: 100%; resize: none; border: 1px solid var(--border); border-radius: 6px; padding: 12px; font-family: 'JetBrains Mono', 'Fira Code', monospace; font-size: 0.85rem; line-height: 1.5; background: var(--panel); color: var(--fg); }
|
|
23
|
+
textarea:focus { outline: 2px solid var(--accent); border-color: transparent; }
|
|
24
|
+
textarea[readonly] { background: var(--bg); cursor: default; }
|
|
25
|
+
.btn-row { margin-top: 10px; display: flex; gap: 8px; }
|
|
26
|
+
.btn { padding: 8px 16px; border: none; border-radius: 6px; font-size: 0.9rem; font-weight: 500; cursor: pointer; transition: background 0.2s; }
|
|
27
|
+
.btn-primary { background: var(--accent); color: #fff; }
|
|
28
|
+
.btn-primary:hover { background: var(--accent-hover); }
|
|
29
|
+
.btn-primary:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
30
|
+
.btn-secondary { background: var(--border); color: var(--fg); }
|
|
31
|
+
.btn-secondary:hover { background: var(--muted); color: #fff; }
|
|
32
|
+
footer { padding: 10px 24px; border-top: 1px solid var(--border); background: var(--panel); font-size: 0.8rem; color: var(--muted); display: flex; gap: 16px; flex-wrap: wrap; }
|
|
33
|
+
.history { padding: 0 24px 12px; background: var(--panel); border-top: 1px solid var(--border); font-size: 0.85rem; max-height: 200px; overflow-y: auto; }
|
|
34
|
+
.history summary { padding: 8px 0; font-weight: 500; cursor: pointer; }
|
|
35
|
+
.history-item { margin: 8px 0; padding: 8px; background: var(--bg); border-radius: 4px; white-space: pre-wrap; word-break: break-word; max-height: 100px; overflow-y: auto; }
|
|
36
|
+
.success-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.6); display: flex; align-items: center; justify-content: center; z-index: 999; }
|
|
37
|
+
.success-box { background: var(--panel); padding: 32px; border-radius: 12px; text-align: center; }
|
|
38
|
+
.success-box h2 { color: var(--success); margin-bottom: 8px; }
|
|
39
|
+
.hidden { display: none; }
|
|
40
|
+
.warning-banner { padding: 12px 24px; background: #fff3cd; border-bottom: 2px solid #ffc107; color: #856404; font-size: 0.9rem; line-height: 1.5; }
|
|
41
|
+
@media (prefers-color-scheme: dark) { .warning-banner { background: #4a3800; border-color: #ffc107; color: #ffe08a; } }
|
|
42
|
+
.warning-banner strong { display: block; margin-bottom: 4px; }
|
|
43
|
+
</style>
|
|
44
|
+
</head>
|
|
45
|
+
<body>
|
|
46
|
+
<header>
|
|
47
|
+
<h1 id="title">Manual Review — ARIS</h1>
|
|
48
|
+
<select class="lang-switch" id="langSwitch" onchange="switchLang(this.value)">
|
|
49
|
+
<option value="en">English</option>
|
|
50
|
+
<option value="zh">中文</option>
|
|
51
|
+
</select>
|
|
52
|
+
</header>
|
|
53
|
+
|
|
54
|
+
<div class="warning-banner" id="warningBanner">
|
|
55
|
+
<strong id="warningTitle">Cross-Model Review Required</strong>
|
|
56
|
+
<span id="warningText">Use a reviewer from a DIFFERENT model family than the executor. Same-family review cannot satisfy an ARIS acceptance gate.</span>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
<details class="tutorial" id="tutorial">
|
|
60
|
+
<summary id="tutorialTitle">How to use</summary>
|
|
61
|
+
<ol>
|
|
62
|
+
<li id="step1">Copy the prompt from the left panel</li>
|
|
63
|
+
<li id="step2">Paste it into a model from a DIFFERENT family than the executor shown above</li>
|
|
64
|
+
<li id="step3">Copy the model's full response</li>
|
|
65
|
+
<li id="step4">Paste it into the right panel and click Submit</li>
|
|
66
|
+
</ol>
|
|
67
|
+
</details>
|
|
68
|
+
|
|
69
|
+
<div class="main">
|
|
70
|
+
<div class="panel">
|
|
71
|
+
<div class="panel-label" id="promptLabel">Review Prompt</div>
|
|
72
|
+
<textarea id="promptArea" readonly></textarea>
|
|
73
|
+
<div class="btn-row">
|
|
74
|
+
<button class="btn btn-secondary" id="copyBtn" onclick="copyPrompt()">📋 Copy Prompt</button>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
<div class="panel">
|
|
78
|
+
<div class="panel-label" id="responseLabel">Paste Response</div>
|
|
79
|
+
<textarea id="responseArea" placeholder="Paste the model's response here..."></textarea>
|
|
80
|
+
<div class="btn-row">
|
|
81
|
+
<button class="btn btn-primary" id="submitBtn" onclick="submitResponse()" disabled>✓ Submit</button>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
|
|
86
|
+
<div id="historySection" class="history hidden">
|
|
87
|
+
<details>
|
|
88
|
+
<summary id="historyTitle">Previous Exchanges</summary>
|
|
89
|
+
<div id="historyContent"></div>
|
|
90
|
+
</details>
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
<footer>
|
|
94
|
+
<span id="configHint"></span>
|
|
95
|
+
<span id="threadInfo"></span>
|
|
96
|
+
</footer>
|
|
97
|
+
|
|
98
|
+
<div id="successOverlay" class="success-overlay hidden">
|
|
99
|
+
<div class="success-box">
|
|
100
|
+
<h2>✓</h2>
|
|
101
|
+
<p id="successMsg">Response submitted! You can close this tab.</p>
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
<script>
|
|
106
|
+
const i18n = {
|
|
107
|
+
en: {
|
|
108
|
+
title: "Manual Review — ARIS",
|
|
109
|
+
warningTitle: "Cross-Model Review Required",
|
|
110
|
+
warningText: "Use a reviewer from a DIFFERENT model family than the executor. Same-family review cannot satisfy an ARIS acceptance gate.",
|
|
111
|
+
warningStrict: "Executor {model} has family {family}. Use a different family, and begin the response with: Reviewer-Model: <exact-model-id>",
|
|
112
|
+
tutorialTitle: "How to use",
|
|
113
|
+
step1: "Copy the prompt from the left panel",
|
|
114
|
+
step2: "Paste it into a model from a DIFFERENT family than the executor shown above",
|
|
115
|
+
step3: "Copy the model's full response",
|
|
116
|
+
step4: "Paste it into the right panel and click Submit",
|
|
117
|
+
promptLabel: "Review Prompt",
|
|
118
|
+
responseLabel: "Paste Response",
|
|
119
|
+
copyBtn: "Copy Prompt",
|
|
120
|
+
submitBtn: "Submit",
|
|
121
|
+
placeholder: "Paste the model's response here...",
|
|
122
|
+
configHint: "Recommended: reasoning_effort = ",
|
|
123
|
+
threadInfo: "Thread: ",
|
|
124
|
+
historyTitle: "Previous Exchanges",
|
|
125
|
+
successMsg: "Response submitted! You can close this tab.",
|
|
126
|
+
copied: "Copied!",
|
|
127
|
+
round: "Round",
|
|
128
|
+
prompt: "Prompt",
|
|
129
|
+
response: "Response",
|
|
130
|
+
},
|
|
131
|
+
zh: {
|
|
132
|
+
title: "手动评审 — ARIS",
|
|
133
|
+
warningTitle: "必须使用不同模型家族",
|
|
134
|
+
warningText: "请使用与执行器不同模型家族的评审模型;同家族评审不能通过 ARIS 验收门。",
|
|
135
|
+
warningStrict: "执行器 {model} 属于 {family} 家族。请使用其他家族,并让回复第一行为:Reviewer-Model: <准确模型 ID>",
|
|
136
|
+
tutorialTitle: "使用方法",
|
|
137
|
+
step1: "从左侧面板复制提示词",
|
|
138
|
+
step2: "粘贴到与上方所示执行器不同家族的模型",
|
|
139
|
+
step3: "复制模型的完整回复",
|
|
140
|
+
step4: "粘贴到右侧面板并点击提交",
|
|
141
|
+
promptLabel: "评审提示词",
|
|
142
|
+
responseLabel: "粘贴回复",
|
|
143
|
+
copyBtn: "复制提示词",
|
|
144
|
+
submitBtn: "提交",
|
|
145
|
+
placeholder: "在此粘贴模型的回复...",
|
|
146
|
+
configHint: "建议推理强度: reasoning_effort = ",
|
|
147
|
+
threadInfo: "线程: ",
|
|
148
|
+
historyTitle: "历史对话",
|
|
149
|
+
successMsg: "回复已提交!可以关闭此标签页。",
|
|
150
|
+
copied: "已复制!",
|
|
151
|
+
round: "第 {n} 轮",
|
|
152
|
+
prompt: "提示词",
|
|
153
|
+
response: "回复",
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
let lang = navigator.language.startsWith("zh") ? "zh" : "en";
|
|
158
|
+
let ctx = {};
|
|
159
|
+
let token = new URLSearchParams(window.location.search).get("token") || "";
|
|
160
|
+
|
|
161
|
+
function modelFamily(model) {
|
|
162
|
+
const name = String(model || "").toLowerCase();
|
|
163
|
+
const families = new Set();
|
|
164
|
+
if (/(^|[^a-z0-9])(gpt|chatgpt|codex|oracle|o1|o3|o4)([^a-z0-9]|$)/.test(name)) families.add("openai");
|
|
165
|
+
if (/(^|[^a-z0-9])(claude|sonnet|opus|haiku|anthropic)([^a-z0-9]|$)/.test(name)) families.add("anthropic");
|
|
166
|
+
if (/(^|[^a-z0-9])(gemini|google)([^a-z0-9]|$)/.test(name)) families.add("google");
|
|
167
|
+
if (/(^|[^a-z0-9])(deepseek)[0-9.]*([^a-z0-9]|$)/.test(name)) families.add("deepseek");
|
|
168
|
+
if (/(^|[^a-z0-9])(kimi|moonshot)[0-9.]*([^a-z0-9]|$)/.test(name)) families.add("moonshot");
|
|
169
|
+
if (/(^|[^a-z0-9])(qwen|tongyi)[0-9.]*([^a-z0-9]|$)/.test(name)) families.add("qwen");
|
|
170
|
+
return families.size === 1 ? Array.from(families)[0] : "unknown";
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
async function init() {
|
|
174
|
+
const res = await fetch("/api/context?token=" + token);
|
|
175
|
+
ctx = await res.json();
|
|
176
|
+
document.getElementById("promptArea").value = ctx.prompt || "";
|
|
177
|
+
const effort = (ctx.config || {}).model_reasoning_effort || "xhigh";
|
|
178
|
+
document.getElementById("configHint").textContent = i18n[lang].configHint + effort;
|
|
179
|
+
document.getElementById("threadInfo").textContent = i18n[lang].threadInfo + (ctx.threadId || "—");
|
|
180
|
+
if (ctx.history && ctx.history.length > 0) {
|
|
181
|
+
document.getElementById("historySection").classList.remove("hidden");
|
|
182
|
+
renderHistory(ctx.history);
|
|
183
|
+
}
|
|
184
|
+
applyLang();
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function renderHistory(history) {
|
|
188
|
+
const container = document.getElementById("historyContent");
|
|
189
|
+
container.innerHTML = "";
|
|
190
|
+
for (let i = 0; i < history.length; i += 2) {
|
|
191
|
+
const roundNum = Math.floor(i / 2) + 1;
|
|
192
|
+
const label = lang === "zh" ? `第 ${roundNum} 轮` : `Round ${roundNum}`;
|
|
193
|
+
const promptText = history[i] ? history[i].content.substring(0, 300) + (history[i].content.length > 300 ? "..." : "") : "";
|
|
194
|
+
const responseText = history[i+1] ? history[i+1].content.substring(0, 300) + (history[i+1].content.length > 300 ? "..." : "") : "";
|
|
195
|
+
container.innerHTML += `<div><strong>${label}</strong></div><div class="history-item">${escapeHtml(promptText)}</div>`;
|
|
196
|
+
if (responseText) container.innerHTML += `<div class="history-item">${escapeHtml(responseText)}</div>`;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function escapeHtml(text) {
|
|
201
|
+
const d = document.createElement("div");
|
|
202
|
+
d.textContent = text;
|
|
203
|
+
return d.innerHTML;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function switchLang(newLang) {
|
|
207
|
+
lang = newLang;
|
|
208
|
+
applyLang();
|
|
209
|
+
if (ctx.history && ctx.history.length > 0) renderHistory(ctx.history);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function applyLang() {
|
|
213
|
+
const t = i18n[lang];
|
|
214
|
+
document.getElementById("title").textContent = t.title;
|
|
215
|
+
document.getElementById("warningTitle").textContent = t.warningTitle;
|
|
216
|
+
const cfg = ctx.config || {};
|
|
217
|
+
const executorModel = cfg.executor_model || "unknown";
|
|
218
|
+
document.getElementById("warningText").textContent = cfg.require_reviewer_model
|
|
219
|
+
? t.warningStrict.replace("{model}", executorModel).replace("{family}", modelFamily(executorModel))
|
|
220
|
+
: t.warningText;
|
|
221
|
+
document.getElementById("tutorialTitle").textContent = t.tutorialTitle;
|
|
222
|
+
document.getElementById("step1").textContent = t.step1;
|
|
223
|
+
document.getElementById("step2").textContent = t.step2;
|
|
224
|
+
document.getElementById("step3").textContent = t.step3;
|
|
225
|
+
document.getElementById("step4").textContent = t.step4;
|
|
226
|
+
document.getElementById("promptLabel").textContent = t.promptLabel;
|
|
227
|
+
document.getElementById("responseLabel").textContent = t.responseLabel;
|
|
228
|
+
document.getElementById("copyBtn").textContent = t.copyBtn;
|
|
229
|
+
document.getElementById("submitBtn").textContent = t.submitBtn;
|
|
230
|
+
document.getElementById("responseArea").placeholder = cfg.require_reviewer_model
|
|
231
|
+
? "Reviewer-Model: <exact-model-id>\n\n" + t.placeholder
|
|
232
|
+
: t.placeholder;
|
|
233
|
+
document.getElementById("historyTitle").textContent = t.historyTitle;
|
|
234
|
+
document.getElementById("successMsg").textContent = t.successMsg;
|
|
235
|
+
const effort = (ctx.config || {}).model_reasoning_effort || "xhigh";
|
|
236
|
+
document.getElementById("configHint").textContent = t.configHint + effort;
|
|
237
|
+
document.getElementById("threadInfo").textContent = t.threadInfo + (ctx.threadId || "—");
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
async function copyPrompt() {
|
|
241
|
+
const text = document.getElementById("promptArea").value;
|
|
242
|
+
try {
|
|
243
|
+
await navigator.clipboard.writeText(text);
|
|
244
|
+
const btn = document.getElementById("copyBtn");
|
|
245
|
+
const orig = btn.textContent;
|
|
246
|
+
btn.textContent = i18n[lang].copied;
|
|
247
|
+
setTimeout(() => btn.textContent = orig, 1500);
|
|
248
|
+
} catch { document.getElementById("promptArea").select(); document.execCommand("copy"); }
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
async function submitResponse() {
|
|
252
|
+
const text = document.getElementById("responseArea").value.trim();
|
|
253
|
+
if (!text) return;
|
|
254
|
+
document.getElementById("submitBtn").disabled = true;
|
|
255
|
+
const res = await fetch("/api/submit?token=" + token, {
|
|
256
|
+
method: "POST",
|
|
257
|
+
headers: {"Content-Type": "application/json"},
|
|
258
|
+
body: JSON.stringify({response: text}),
|
|
259
|
+
});
|
|
260
|
+
if (res.ok) document.getElementById("successOverlay").classList.remove("hidden");
|
|
261
|
+
else {
|
|
262
|
+
document.getElementById("submitBtn").disabled = false;
|
|
263
|
+
// The server explains WHY (e.g. a missing Reviewer-Model: line). Show it —
|
|
264
|
+
// a generic retry prompt makes an identity rejection undiagnosable.
|
|
265
|
+
let why = "";
|
|
266
|
+
try { why = (await res.json()).error || ""; } catch (e) { why = await res.text().catch(() => ""); }
|
|
267
|
+
alert(why ? "Submit rejected: " + why : "Submit failed. Please try again.");
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
document.getElementById("responseArea").addEventListener("input", function() {
|
|
272
|
+
document.getElementById("submitBtn").disabled = !this.value.trim();
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
document.getElementById("langSwitch").value = lang;
|
|
276
|
+
init();
|
|
277
|
+
</script>
|
|
278
|
+
</body>
|
|
279
|
+
</html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
httpx>=0.27,<1.0
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""MiniMax Chat MCP Server - A robust MCP server that calls MiniMax Chat Completions API"""
|
|
3
|
+
|
|
4
|
+
import datetime
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
import tempfile
|
|
9
|
+
import httpx
|
|
10
|
+
|
|
11
|
+
_stdio_initialized = False
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _init_stdio():
|
|
15
|
+
"""Rebind stdio to raw unbuffered binary streams for MCP framing.
|
|
16
|
+
|
|
17
|
+
Deferred into a function (called at the top of main()) so that merely
|
|
18
|
+
IMPORTING this module has no stdio side effects. os.fdopen(fileno) defaults
|
|
19
|
+
to closefd=True and thus seizes ownership of the fd; doing that at import
|
|
20
|
+
time under a test harness that captures stdio (pytest fd-capture) closes the
|
|
21
|
+
harness's capture fd and corrupts capture for every subsequent test. Real
|
|
22
|
+
server launch (python server.py) still calls this first via main(), so
|
|
23
|
+
runtime behavior is unchanged. Idempotent."""
|
|
24
|
+
global _stdio_initialized
|
|
25
|
+
if _stdio_initialized:
|
|
26
|
+
return
|
|
27
|
+
# Force unbuffered stdout/stdin
|
|
28
|
+
sys.stdout = os.fdopen(sys.stdout.fileno(), 'wb', buffering=0)
|
|
29
|
+
sys.stdin = os.fdopen(sys.stdin.fileno(), 'rb', buffering=0)
|
|
30
|
+
_stdio_initialized = True
|
|
31
|
+
|
|
32
|
+
# Debug logging
|
|
33
|
+
DEBUG_LOG = os.path.join(tempfile.gettempdir(), "minimax-mcp-debug.log")
|
|
34
|
+
|
|
35
|
+
def debug_log(msg):
|
|
36
|
+
"""Write debug message to log file"""
|
|
37
|
+
try:
|
|
38
|
+
with open(DEBUG_LOG, "a") as f:
|
|
39
|
+
f.write(f"{datetime.datetime.now()}: {msg}\n")
|
|
40
|
+
f.flush()
|
|
41
|
+
except Exception:
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
debug_log("=== MCP Server Starting (v2.1) ===")
|
|
45
|
+
debug_log(f"MINIMAX_API_KEY set: {bool(os.environ.get('MINIMAX_API_KEY'))}")
|
|
46
|
+
debug_log(f"MINIMAX_BASE_URL: {os.environ.get('MINIMAX_BASE_URL', 'not set')}")
|
|
47
|
+
debug_log(f"MINIMAX_MODEL: {os.environ.get('MINIMAX_MODEL', 'not set')}")
|
|
48
|
+
|
|
49
|
+
MINIMAX_API_KEY = os.environ.get("MINIMAX_API_KEY", "")
|
|
50
|
+
MINIMAX_BASE_URL = os.environ.get("MINIMAX_BASE_URL", "https://api.minimax.io/v1")
|
|
51
|
+
DEFAULT_MODEL = os.environ.get("MINIMAX_MODEL", "MiniMax-M3")
|
|
52
|
+
|
|
53
|
+
# MiniMax requires temperature in (0.0, 1.0]
|
|
54
|
+
def clamp_temperature(temp):
|
|
55
|
+
"""Clamp temperature to MiniMax's allowed range (0.0, 1.0].
|
|
56
|
+
|
|
57
|
+
Raises ValueError on non-numeric input — caller should catch and surface
|
|
58
|
+
a clear "Invalid temperature: ..." error instead of letting the raw
|
|
59
|
+
float() exception bubble up through the JSON-RPC layer.
|
|
60
|
+
"""
|
|
61
|
+
if temp is None:
|
|
62
|
+
return None
|
|
63
|
+
try:
|
|
64
|
+
temp = float(temp)
|
|
65
|
+
except (TypeError, ValueError) as e:
|
|
66
|
+
raise ValueError(f"Invalid temperature: {temp!r} ({e})")
|
|
67
|
+
if temp <= 0.0:
|
|
68
|
+
return 0.01
|
|
69
|
+
if temp > 1.0:
|
|
70
|
+
return 1.0
|
|
71
|
+
return temp
|
|
72
|
+
|
|
73
|
+
def log_error(msg):
|
|
74
|
+
try:
|
|
75
|
+
with open(DEBUG_LOG, "a") as f:
|
|
76
|
+
f.write(f"{datetime.datetime.now()}: ERROR: {msg}\n")
|
|
77
|
+
except Exception:
|
|
78
|
+
pass
|
|
79
|
+
|
|
80
|
+
# Global flag for output format
|
|
81
|
+
_use_ndjson = False
|
|
82
|
+
|
|
83
|
+
def send_response(response):
|
|
84
|
+
"""Send a JSON-RPC response using binary stdout"""
|
|
85
|
+
global _use_ndjson
|
|
86
|
+
json_str = json.dumps(response, separators=(',', ':'))
|
|
87
|
+
json_bytes = json_str.encode('utf-8')
|
|
88
|
+
|
|
89
|
+
if _use_ndjson:
|
|
90
|
+
# NDJSON format: just the JSON followed by newline
|
|
91
|
+
output = json_bytes + b'\n'
|
|
92
|
+
else:
|
|
93
|
+
# Standard MCP format: Content-Length header + body
|
|
94
|
+
header = f"Content-Length: {len(json_bytes)}\r\n\r\n".encode('utf-8')
|
|
95
|
+
output = header + json_bytes
|
|
96
|
+
|
|
97
|
+
sys.stdout.write(output)
|
|
98
|
+
sys.stdout.flush()
|
|
99
|
+
debug_log(f"Sent response ({'NDJSON' if _use_ndjson else 'MCP'}): {json_str[:200]}...")
|
|
100
|
+
|
|
101
|
+
def send_notification(method, params=None):
|
|
102
|
+
"""Send a JSON-RPC notification"""
|
|
103
|
+
notification = {
|
|
104
|
+
"jsonrpc": "2.0",
|
|
105
|
+
"method": method
|
|
106
|
+
}
|
|
107
|
+
if params:
|
|
108
|
+
notification["params"] = params
|
|
109
|
+
send_response(notification)
|
|
110
|
+
|
|
111
|
+
def call_minimax(messages, model=None, temperature=0.7):
|
|
112
|
+
"""Call MiniMax Chat Completions API"""
|
|
113
|
+
if not MINIMAX_API_KEY:
|
|
114
|
+
return None, "MINIMAX_API_KEY environment variable not set"
|
|
115
|
+
|
|
116
|
+
url = f"{MINIMAX_BASE_URL}/chat/completions"
|
|
117
|
+
headers = {
|
|
118
|
+
"Content-Type": "application/json",
|
|
119
|
+
"Authorization": f"Bearer {MINIMAX_API_KEY}"
|
|
120
|
+
}
|
|
121
|
+
clamped_temp = clamp_temperature(temperature)
|
|
122
|
+
payload = {
|
|
123
|
+
"model": model or DEFAULT_MODEL,
|
|
124
|
+
"messages": messages,
|
|
125
|
+
"max_tokens": 4096,
|
|
126
|
+
"temperature": clamped_temp
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
debug_log(f"Calling MiniMax API: {url}")
|
|
130
|
+
|
|
131
|
+
try:
|
|
132
|
+
with httpx.Client(timeout=120.0) as client:
|
|
133
|
+
response = client.post(url, headers=headers, json=payload)
|
|
134
|
+
if response.status_code != 200:
|
|
135
|
+
error_msg = f"API error {response.status_code}: {response.text[:500]}"
|
|
136
|
+
debug_log(f"API error: {error_msg}")
|
|
137
|
+
return None, error_msg
|
|
138
|
+
data = response.json()
|
|
139
|
+
try:
|
|
140
|
+
content = data["choices"][0]["message"]["content"]
|
|
141
|
+
except (KeyError, IndexError, TypeError) as e:
|
|
142
|
+
return None, f"Unexpected API response structure: {e}"
|
|
143
|
+
debug_log(f"API success, response length: {len(content)}")
|
|
144
|
+
return content, None
|
|
145
|
+
except Exception as e:
|
|
146
|
+
debug_log(f"API exception: {str(e)}")
|
|
147
|
+
return None, str(e)
|
|
148
|
+
|
|
149
|
+
def handle_request(request):
|
|
150
|
+
"""Handle a JSON-RPC request"""
|
|
151
|
+
method = request.get("method", "")
|
|
152
|
+
params = request.get("params", {})
|
|
153
|
+
request_id = request.get("id")
|
|
154
|
+
|
|
155
|
+
debug_log(f"Handling method: {method}, id: {request_id}")
|
|
156
|
+
|
|
157
|
+
# Handle notifications (no id, no response needed)
|
|
158
|
+
if request_id is None:
|
|
159
|
+
debug_log(f"Notification received: {method}")
|
|
160
|
+
if method == "notifications/initialized":
|
|
161
|
+
debug_log("Client initialized successfully")
|
|
162
|
+
return None
|
|
163
|
+
|
|
164
|
+
if method == "initialize":
|
|
165
|
+
return {
|
|
166
|
+
"jsonrpc": "2.0",
|
|
167
|
+
"id": request_id,
|
|
168
|
+
"result": {
|
|
169
|
+
"protocolVersion": "2024-11-05",
|
|
170
|
+
"capabilities": {
|
|
171
|
+
"tools": {}
|
|
172
|
+
},
|
|
173
|
+
"serverInfo": {
|
|
174
|
+
"name": "minimax-chat",
|
|
175
|
+
"version": "2.0.0"
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
elif method == "ping":
|
|
181
|
+
return {
|
|
182
|
+
"jsonrpc": "2.0",
|
|
183
|
+
"id": request_id,
|
|
184
|
+
"result": {}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
elif method == "tools/list":
|
|
188
|
+
return {
|
|
189
|
+
"jsonrpc": "2.0",
|
|
190
|
+
"id": request_id,
|
|
191
|
+
"result": {
|
|
192
|
+
"tools": [{
|
|
193
|
+
"name": "minimax_chat",
|
|
194
|
+
"description": "Send a message to MiniMax model and get a response. Use this for research reviews, code analysis, and general AI tasks. Supports MiniMax-M3 (default, 512K context), MiniMax-M2.7 (204K context) and MiniMax-M2.7-highspeed.",
|
|
195
|
+
"inputSchema": {
|
|
196
|
+
"type": "object",
|
|
197
|
+
"properties": {
|
|
198
|
+
"prompt": {
|
|
199
|
+
"type": "string",
|
|
200
|
+
"description": "The prompt to send to MiniMax"
|
|
201
|
+
},
|
|
202
|
+
"model": {
|
|
203
|
+
"type": "string",
|
|
204
|
+
"description": "Model to use: MiniMax-M3 (default, 512K context), MiniMax-M2.7 (204K context) or MiniMax-M2.7-highspeed (faster, 204K context)",
|
|
205
|
+
"default": "MiniMax-M3",
|
|
206
|
+
"enum": ["MiniMax-M3", "MiniMax-M2.7", "MiniMax-M2.7-highspeed"]
|
|
207
|
+
},
|
|
208
|
+
"system": {
|
|
209
|
+
"type": "string",
|
|
210
|
+
"description": "Optional system prompt"
|
|
211
|
+
},
|
|
212
|
+
"temperature": {
|
|
213
|
+
"type": "number",
|
|
214
|
+
"description": "Sampling temperature (0.01-1.0). Default: 0.7",
|
|
215
|
+
"default": 0.7
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
"required": ["prompt"]
|
|
219
|
+
}
|
|
220
|
+
}]
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
elif method == "tools/call":
|
|
225
|
+
tool_name = params.get("name", "")
|
|
226
|
+
arguments = params.get("arguments", {})
|
|
227
|
+
|
|
228
|
+
if tool_name == "minimax_chat":
|
|
229
|
+
prompt = arguments.get("prompt", "")
|
|
230
|
+
model = arguments.get("model", DEFAULT_MODEL)
|
|
231
|
+
system = arguments.get("system", "")
|
|
232
|
+
temperature = arguments.get("temperature", 0.7)
|
|
233
|
+
|
|
234
|
+
messages = []
|
|
235
|
+
if system:
|
|
236
|
+
messages.append({"role": "system", "content": system})
|
|
237
|
+
messages.append({"role": "user", "content": prompt})
|
|
238
|
+
|
|
239
|
+
debug_log(f"Tool call: minimax_chat, prompt length: {len(prompt)}")
|
|
240
|
+
content, error = call_minimax(messages, model, temperature)
|
|
241
|
+
|
|
242
|
+
if error:
|
|
243
|
+
return {
|
|
244
|
+
"jsonrpc": "2.0",
|
|
245
|
+
"id": request_id,
|
|
246
|
+
"result": {
|
|
247
|
+
"content": [{"type": "text", "text": f"Error: {error}"}],
|
|
248
|
+
"isError": True
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return {
|
|
253
|
+
"jsonrpc": "2.0",
|
|
254
|
+
"id": request_id,
|
|
255
|
+
"result": {
|
|
256
|
+
"content": [{"type": "text", "text": content}]
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return {
|
|
261
|
+
"jsonrpc": "2.0",
|
|
262
|
+
"id": request_id,
|
|
263
|
+
"error": {"code": -32601, "message": f"Unknown tool: {tool_name}"}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
else:
|
|
267
|
+
debug_log(f"Unknown method: {method}")
|
|
268
|
+
return {
|
|
269
|
+
"jsonrpc": "2.0",
|
|
270
|
+
"id": request_id,
|
|
271
|
+
"error": {"code": -32601, "message": f"Unknown method: {method}"}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
def read_message():
|
|
275
|
+
"""Read a single JSON-RPC message from stdin. Returns None on EOF.
|
|
276
|
+
|
|
277
|
+
Supports two formats:
|
|
278
|
+
1. Standard MCP: Content-Length: N\\r\\n\\r\\n{json}
|
|
279
|
+
2. NDJSON/Line-delimited: {json}\\n
|
|
280
|
+
"""
|
|
281
|
+
content_length = None
|
|
282
|
+
first_line = None
|
|
283
|
+
|
|
284
|
+
# Read first line to determine format
|
|
285
|
+
line = sys.stdin.readline()
|
|
286
|
+
if not line: # EOF
|
|
287
|
+
return None
|
|
288
|
+
|
|
289
|
+
line = line.decode('utf-8').rstrip('\r\n')
|
|
290
|
+
debug_log(f"First line: '{line[:100]}...'")
|
|
291
|
+
|
|
292
|
+
# Check if it's a Content-Length header or direct JSON
|
|
293
|
+
if line.lower().startswith("content-length:"):
|
|
294
|
+
# Standard MCP format
|
|
295
|
+
try:
|
|
296
|
+
content_length = int(line.split(":", 1)[1].strip())
|
|
297
|
+
debug_log(f"Content-Length: {content_length}")
|
|
298
|
+
except ValueError:
|
|
299
|
+
log_error(f"Invalid Content-Length: {line}")
|
|
300
|
+
return None
|
|
301
|
+
|
|
302
|
+
# Read remaining headers until blank line
|
|
303
|
+
while True:
|
|
304
|
+
hdr = sys.stdin.readline()
|
|
305
|
+
if not hdr:
|
|
306
|
+
return None
|
|
307
|
+
hdr = hdr.decode('utf-8').rstrip('\r\n')
|
|
308
|
+
if hdr == "":
|
|
309
|
+
break
|
|
310
|
+
debug_log(f"Header: '{hdr}'")
|
|
311
|
+
|
|
312
|
+
elif line.startswith("{") or line.startswith("["):
|
|
313
|
+
# NDJSON format - the line IS the JSON
|
|
314
|
+
global _use_ndjson
|
|
315
|
+
_use_ndjson = True
|
|
316
|
+
debug_log("Detected NDJSON format (line-delimited JSON)")
|
|
317
|
+
try:
|
|
318
|
+
request = json.loads(line)
|
|
319
|
+
debug_log(f"Parsed NDJSON request: {json.dumps(request)[:200]}")
|
|
320
|
+
return request
|
|
321
|
+
except json.JSONDecodeError as e:
|
|
322
|
+
log_error(f"JSON decode error in NDJSON: {e}")
|
|
323
|
+
return None
|
|
324
|
+
|
|
325
|
+
else:
|
|
326
|
+
log_error(f"Unexpected line format: {line[:100]}")
|
|
327
|
+
return None
|
|
328
|
+
|
|
329
|
+
if content_length is None:
|
|
330
|
+
log_error("Missing Content-Length header")
|
|
331
|
+
return None
|
|
332
|
+
|
|
333
|
+
# Read the body (for standard MCP format)
|
|
334
|
+
body = sys.stdin.read(content_length)
|
|
335
|
+
if len(body) < content_length:
|
|
336
|
+
log_error(f"Incomplete body: expected {content_length}, got {len(body)}")
|
|
337
|
+
return None
|
|
338
|
+
|
|
339
|
+
try:
|
|
340
|
+
request = json.loads(body.decode('utf-8'))
|
|
341
|
+
debug_log(f"Parsed request: {json.dumps(request)[:200]}")
|
|
342
|
+
return request
|
|
343
|
+
except json.JSONDecodeError as e:
|
|
344
|
+
log_error(f"JSON decode error: {e}")
|
|
345
|
+
return None
|
|
346
|
+
|
|
347
|
+
def main():
|
|
348
|
+
"""Main loop - read JSON-RPC messages from stdin"""
|
|
349
|
+
_init_stdio()
|
|
350
|
+
debug_log("Entering main loop")
|
|
351
|
+
|
|
352
|
+
while True:
|
|
353
|
+
try:
|
|
354
|
+
request = read_message()
|
|
355
|
+
if request is None:
|
|
356
|
+
debug_log("Received EOF, exiting gracefully")
|
|
357
|
+
break
|
|
358
|
+
|
|
359
|
+
debug_log(f"Processing: {request.get('method', 'unknown')}")
|
|
360
|
+
|
|
361
|
+
response = handle_request(request)
|
|
362
|
+
if response:
|
|
363
|
+
send_response(response)
|
|
364
|
+
|
|
365
|
+
except Exception as e:
|
|
366
|
+
log_error(f"Exception in main loop: {e}")
|
|
367
|
+
debug_log(f"Exception: {e}")
|
|
368
|
+
# Try to send error response
|
|
369
|
+
try:
|
|
370
|
+
send_response({
|
|
371
|
+
"jsonrpc": "2.0",
|
|
372
|
+
"id": None,
|
|
373
|
+
"error": {"code": -32603, "message": f"Internal error: {e}"}
|
|
374
|
+
})
|
|
375
|
+
except Exception:
|
|
376
|
+
pass
|
|
377
|
+
|
|
378
|
+
debug_log("=== MCP Server Exiting ===")
|
|
379
|
+
|
|
380
|
+
if __name__ == "__main__":
|
|
381
|
+
main()
|