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,44 @@
|
|
|
1
|
+
# ARIS bundle layer for DeepSeek Harness.
|
|
2
|
+
#
|
|
3
|
+
# Applied after the profile's surface bundle. Patch config replacement is
|
|
4
|
+
# whole-value, so rows that adjust shipped configuration restate every field
|
|
5
|
+
# they need.
|
|
6
|
+
|
|
7
|
+
# ARIS review runs on the stronger executor.
|
|
8
|
+
- id: agent-default-model
|
|
9
|
+
config:
|
|
10
|
+
provider: deepseek-official
|
|
11
|
+
model: deepseek-v4-pro
|
|
12
|
+
|
|
13
|
+
- insert:
|
|
14
|
+
# Skill corpus, ARIS_REPO, and the Codex threadId projection.
|
|
15
|
+
- id: aris-skills
|
|
16
|
+
name: 'dsh-aris'
|
|
17
|
+
|
|
18
|
+
# Optional: apply ARIS's scope limits to the executor as well as the
|
|
19
|
+
# reviewer. Off by default — it spends tokens on every request, and the
|
|
20
|
+
# reviewer side is already covered by the skills. Flip to enable.
|
|
21
|
+
- id: aris-scope-limits
|
|
22
|
+
name: 'dsh-aris/scope-limits'
|
|
23
|
+
disabled: true
|
|
24
|
+
|
|
25
|
+
# The independent reviewer. Model and reasoning effort come from the host
|
|
26
|
+
# Codex installation (~/.codex/config.toml) — that file is the reviewer
|
|
27
|
+
# posture contract, and dsh deliberately does not override it.
|
|
28
|
+
- id: aris-codex
|
|
29
|
+
name: '@deepseek-ai/dsh-mcp-client'
|
|
30
|
+
config:
|
|
31
|
+
transport: stdio
|
|
32
|
+
serverName: codex
|
|
33
|
+
command: codex
|
|
34
|
+
args: [mcp-server]
|
|
35
|
+
# Pinned to a directory that outlives the run. Inheriting the Harness's
|
|
36
|
+
# launch directory makes every review depend on it still existing:
|
|
37
|
+
# remove or rename it and Codex fails to load its own configuration,
|
|
38
|
+
# which ARIS survives by degrading to a transport that cannot attest
|
|
39
|
+
# reviewer identity. Review prompts address artifacts absolutely.
|
|
40
|
+
cwd: !!js process.env.HOME
|
|
41
|
+
# dsh defaults to 60s and Codex's progress notifications do not extend it.
|
|
42
|
+
# 20 minutes is ARIS's own threshold for calling a review hung.
|
|
43
|
+
toolCallTimeoutMs: 1200000
|
|
44
|
+
failOnStartupError: true
|
package/dsh/index.mjs
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ARIS bundle adapter for DeepSeek Harness.
|
|
3
|
+
*
|
|
4
|
+
* Four effects, none of which the declarative layer can express:
|
|
5
|
+
* 1. mount the packaged skill corpus from a path only this module can resolve
|
|
6
|
+
* 2. publish the package root as ARIS_REPO so skills reach their helper scripts
|
|
7
|
+
* 3. project Codex's threadId into model-visible content so codex-reply works
|
|
8
|
+
* 4. serve the run-status view its read-only projection of the loop artifacts
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { fileURLToPath } from 'node:url'
|
|
12
|
+
import * as skillFilesystem from '@deepseek-ai/dsh-skill-filesystem'
|
|
13
|
+
import { registerRunStatus } from './run-status.mjs'
|
|
14
|
+
import { registerWorkbench } from './workbench.mjs'
|
|
15
|
+
|
|
16
|
+
export const name = 'aris-skills'
|
|
17
|
+
export const inject = ['skills', 'tools']
|
|
18
|
+
|
|
19
|
+
/** Package root; identical in a git checkout and under node_modules. */
|
|
20
|
+
const PACKAGE_ROOT = fileURLToPath(new URL('../', import.meta.url))
|
|
21
|
+
const SKILL_ROOT = fileURLToPath(new URL('../skills/', import.meta.url))
|
|
22
|
+
|
|
23
|
+
/** Codex MCP tools whose reply carries a continuation threadId. */
|
|
24
|
+
const CODEX_TOOLS = new Set(['mcp__codex__codex', 'mcp__codex__codex-reply'])
|
|
25
|
+
|
|
26
|
+
export async function apply(ctx) {
|
|
27
|
+
// ARIS skills resolve shared helpers through $ARIS_REPO/tools
|
|
28
|
+
// (skills/shared-references/integration-contract.md). An operator-set value wins.
|
|
29
|
+
ctx.effect(() => {
|
|
30
|
+
const inherited = process.env.ARIS_REPO
|
|
31
|
+
if (inherited === undefined) process.env.ARIS_REPO = PACKAGE_ROOT
|
|
32
|
+
return () => {
|
|
33
|
+
if (inherited === undefined && process.env.ARIS_REPO === PACKAGE_ROOT) {
|
|
34
|
+
delete process.env.ARIS_REPO
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}, 'ARIS package root')
|
|
38
|
+
|
|
39
|
+
// Rank 600 (bundledSkillDir): a project or user skill of the same name wins.
|
|
40
|
+
await ctx.plugin(skillFilesystem, {
|
|
41
|
+
providerName: 'aris',
|
|
42
|
+
includeDefaultRoots: false,
|
|
43
|
+
bundledSkillDir: SKILL_ROOT,
|
|
44
|
+
watch: false,
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
registerRunStatus(ctx)
|
|
48
|
+
registerWorkbench(ctx)
|
|
49
|
+
|
|
50
|
+
// dsh renders only an MCP result's `content` to the model, while Codex returns
|
|
51
|
+
// threadId solely in `structuredContent`. Without this the model cannot continue
|
|
52
|
+
// a review thread, which the hard-tier Debate Protocol requires.
|
|
53
|
+
ctx.on('tools/post-execute', async (exec, result, next) => {
|
|
54
|
+
const decision = await next()
|
|
55
|
+
if (!CODEX_TOOLS.has(exec.name)) return decision
|
|
56
|
+
if (result.isError || decision.kind !== 'accept') return decision
|
|
57
|
+
if (Object.hasOwn(decision, 'value')) return decision
|
|
58
|
+
|
|
59
|
+
const threadId = result.value?.structuredContent?.threadId
|
|
60
|
+
if (typeof threadId !== 'string') return decision
|
|
61
|
+
|
|
62
|
+
// Prefixed and labelled: a spilled or pruned result keeps its head, and the
|
|
63
|
+
// reviewer's own prose is never mistaken for harness metadata. The trailing
|
|
64
|
+
// blank line matters — text blocks reach the model joined with no separator.
|
|
65
|
+
return {
|
|
66
|
+
...decision,
|
|
67
|
+
content: [
|
|
68
|
+
{
|
|
69
|
+
type: 'text',
|
|
70
|
+
text: `Codex continuation metadata (not part of the reviewer response): threadId=${threadId}\n\n`,
|
|
71
|
+
},
|
|
72
|
+
...decision.content ?? result.content,
|
|
73
|
+
],
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host half of the ARIS run-status view: one read-only RPC that projects the
|
|
3
|
+
* loop's durable artifacts for the browser tab.
|
|
4
|
+
*
|
|
5
|
+
* The artifacts stay canonical. Nothing here caches, writes, or interprets
|
|
6
|
+
* them beyond parsing REVIEW_STATE.json and stat-ing the files ARIS maintains.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { readdir, readFile, stat } from 'node:fs/promises'
|
|
10
|
+
import { isAbsolute, join } from 'node:path'
|
|
11
|
+
|
|
12
|
+
/** Channel the browser half calls. */
|
|
13
|
+
export const ARIS_RPC_CHANNEL = '/aris'
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Artifacts every auto-review-loop run maintains, relative to the workspace.
|
|
17
|
+
* Stage outputs (plan, draft) vary by workflow and are deliberately absent.
|
|
18
|
+
*/
|
|
19
|
+
const ARTIFACTS = [
|
|
20
|
+
'review-stage/REVIEW_STATE.json',
|
|
21
|
+
'review-stage/AUTO_REVIEW.md',
|
|
22
|
+
'review-stage/REVIEWER_MEMORY.md',
|
|
23
|
+
'review-stage/ACQUITTAL_LOG.jsonl',
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
/** Fields the view reads; anything else in the state file is passed through untouched. */
|
|
27
|
+
const STATE_FILE = 'review-stage/REVIEW_STATE.json'
|
|
28
|
+
const REVIEW_LOG = 'review-stage/AUTO_REVIEW.md'
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The latest round's ranked criticisms, verbatim.
|
|
32
|
+
*
|
|
33
|
+
* Score and verdict already come from the state file, so only the criticisms
|
|
34
|
+
* are lifted — they are what explains why the loop continued or stopped.
|
|
35
|
+
* A log that does not carry the block yields nothing rather than a guess.
|
|
36
|
+
*
|
|
37
|
+
* @returns the criticism lines without their numbering, or undefined.
|
|
38
|
+
*/
|
|
39
|
+
async function readCriticisms(workspace) {
|
|
40
|
+
let text
|
|
41
|
+
try {
|
|
42
|
+
text = await readFile(join(workspace, REVIEW_LOG), 'utf8')
|
|
43
|
+
} catch {
|
|
44
|
+
return undefined
|
|
45
|
+
}
|
|
46
|
+
const lines = text.split('\n')
|
|
47
|
+
let start = -1
|
|
48
|
+
for (const [index, line] of lines.entries()) {
|
|
49
|
+
if (/^\s*-\s*Key criticisms/i.test(line)) start = index
|
|
50
|
+
}
|
|
51
|
+
if (start === -1) return undefined
|
|
52
|
+
const items = []
|
|
53
|
+
for (const line of lines.slice(start + 1)) {
|
|
54
|
+
const item = /^\s+\d+\.\s+(.*\S)\s*$/.exec(line)
|
|
55
|
+
if (item === null) break
|
|
56
|
+
items.push(item[1])
|
|
57
|
+
}
|
|
58
|
+
return items.length > 0 ? items : undefined
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** @returns `{exists, mtime, size}` for one workspace-relative path. */
|
|
62
|
+
async function describe(workspace, relative) {
|
|
63
|
+
try {
|
|
64
|
+
const info = await stat(join(workspace, relative))
|
|
65
|
+
return { path: relative, exists: true, mtime: info.mtimeMs, size: info.size }
|
|
66
|
+
} catch {
|
|
67
|
+
return { path: relative, exists: false }
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** @returns the parsed state file, or an error string the view shows verbatim. */
|
|
72
|
+
async function readState(workspace) {
|
|
73
|
+
let text
|
|
74
|
+
try {
|
|
75
|
+
text = await readFile(join(workspace, STATE_FILE), 'utf8')
|
|
76
|
+
} catch {
|
|
77
|
+
return { state: undefined, stateError: undefined }
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const parsed = JSON.parse(text)
|
|
81
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
82
|
+
return { state: undefined, stateError: `${STATE_FILE} is not a JSON object` }
|
|
83
|
+
}
|
|
84
|
+
return { state: parsed, stateError: undefined }
|
|
85
|
+
} catch (error) {
|
|
86
|
+
return { state: undefined, stateError: `${STATE_FILE} is not valid JSON: ${error.message}` }
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Where `tools/run_state.py` persists a resumable pipeline run. */
|
|
91
|
+
const RUNS_DIR = '.aris/runs'
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Read the most recently updated pipeline run, if any.
|
|
95
|
+
*
|
|
96
|
+
* A phase's `status` separates what the executor claims from what an
|
|
97
|
+
* independent reviewer accepted: only `accept()` writes `accepted`, and only
|
|
98
|
+
* with a recorded reviewer and verdict id. A `done` phase that never reached
|
|
99
|
+
* `accepted` is an unmet acceptance obligation, and the view says so.
|
|
100
|
+
*
|
|
101
|
+
* @returns the run, or undefined when this workspace has no resumable run.
|
|
102
|
+
*/
|
|
103
|
+
async function readPipeline(workspace) {
|
|
104
|
+
let names
|
|
105
|
+
try {
|
|
106
|
+
names = await readdir(join(workspace, RUNS_DIR))
|
|
107
|
+
} catch {
|
|
108
|
+
return undefined
|
|
109
|
+
}
|
|
110
|
+
let newest
|
|
111
|
+
for (const name of names) {
|
|
112
|
+
if (!name.endsWith('.json')) continue
|
|
113
|
+
const path = join(workspace, RUNS_DIR, name)
|
|
114
|
+
let run
|
|
115
|
+
try {
|
|
116
|
+
run = JSON.parse(await readFile(path, 'utf8'))
|
|
117
|
+
} catch {
|
|
118
|
+
continue
|
|
119
|
+
}
|
|
120
|
+
if (typeof run !== 'object' || run === null || !Array.isArray(run.phases)) continue
|
|
121
|
+
if (newest === undefined || String(run.updated ?? '') > String(newest.updated ?? '')) newest = run
|
|
122
|
+
}
|
|
123
|
+
if (newest === undefined) return undefined
|
|
124
|
+
return {
|
|
125
|
+
runId: newest.run_id,
|
|
126
|
+
updated: newest.updated,
|
|
127
|
+
executor: newest.executor_model,
|
|
128
|
+
executorFamily: newest.executor_family,
|
|
129
|
+
phases: newest.phases.map(entry => ({
|
|
130
|
+
phase: entry.phase,
|
|
131
|
+
status: entry.status,
|
|
132
|
+
artifact: entry.artifact ?? undefined,
|
|
133
|
+
reviewer: entry.reviewer ?? undefined,
|
|
134
|
+
reviewerFamily: entry.reviewer_family ?? undefined,
|
|
135
|
+
independence: entry.review_independence ?? undefined,
|
|
136
|
+
verdictId: entry.verdict_id ?? undefined,
|
|
137
|
+
})),
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Register the run-status RPC when a browser connection exists.
|
|
143
|
+
* Headless compositions have no `connection`, so the channel never mounts.
|
|
144
|
+
* @param ctx - the ARIS plugin's context.
|
|
145
|
+
*/
|
|
146
|
+
export function registerRunStatus(ctx) {
|
|
147
|
+
ctx.inject(['connection', 'sessions'], (scoped) => {
|
|
148
|
+
scoped.effect(() => scoped.connection.rpc.handle(
|
|
149
|
+
ARIS_RPC_CHANNEL,
|
|
150
|
+
async (endpoint, payload) => {
|
|
151
|
+
if (endpoint !== 'state') {
|
|
152
|
+
return { ok: false, error: { code: 'UNKNOWN_ENDPOINT', message: `unknown ARIS endpoint "${endpoint}"` } }
|
|
153
|
+
}
|
|
154
|
+
const sessionId = typeof payload === 'object' && payload !== null ? payload.sessionId : undefined
|
|
155
|
+
if (typeof sessionId !== 'string') {
|
|
156
|
+
return { ok: false, error: { code: 'BAD_REQUEST', message: 'sessionId is required' } }
|
|
157
|
+
}
|
|
158
|
+
const workspace = scoped.sessions.get(sessionId)?.header?.cwd
|
|
159
|
+
if (typeof workspace !== 'string' || !isAbsolute(workspace)) {
|
|
160
|
+
return { ok: true, value: { workspace: undefined, artifacts: [] } }
|
|
161
|
+
}
|
|
162
|
+
const { state, stateError } = await readState(workspace)
|
|
163
|
+
const pipeline = await readPipeline(workspace)
|
|
164
|
+
const criticisms = await readCriticisms(workspace)
|
|
165
|
+
const artifacts = await Promise.all(ARTIFACTS.map(relative => describe(workspace, relative)))
|
|
166
|
+
return {
|
|
167
|
+
ok: true,
|
|
168
|
+
value: {
|
|
169
|
+
workspace,
|
|
170
|
+
...state !== undefined ? { state } : {},
|
|
171
|
+
...stateError !== undefined ? { stateError } : {},
|
|
172
|
+
...pipeline !== undefined ? { pipeline } : {},
|
|
173
|
+
...criticisms !== undefined ? { criticisms } : {},
|
|
174
|
+
artifacts,
|
|
175
|
+
readAt: Date.now(),
|
|
176
|
+
},
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
{ authority: 'loopback' },
|
|
180
|
+
), 'ARIS run-status RPC')
|
|
181
|
+
})
|
|
182
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional executor-side scope limits.
|
|
3
|
+
*
|
|
4
|
+
* ARIS's reviewers already carry these limits — the block is embedded in the
|
|
5
|
+
* skills that produce review prompts. Nothing bounds the executor the same way,
|
|
6
|
+
* so this row offers the same contract as a system-prompt section. It is
|
|
7
|
+
* disabled by default: it costs tokens on every request, and whether an
|
|
8
|
+
* executor should be bound is a per-deployment choice.
|
|
9
|
+
*
|
|
10
|
+
* The text is read from the packaged `skills/shared-references/review-scope-limits.md`
|
|
11
|
+
* rather than copied here, so the reviewer path and this one cannot drift apart.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { readFile } from 'node:fs/promises'
|
|
15
|
+
import { fileURLToPath } from 'node:url'
|
|
16
|
+
|
|
17
|
+
export const name = 'aris-scope-limits'
|
|
18
|
+
export const inject = ['systemPrompt']
|
|
19
|
+
|
|
20
|
+
const DOCTRINE = fileURLToPath(
|
|
21
|
+
new URL('../skills/shared-references/review-scope-limits.md', import.meta.url),
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
/** Prompt order: after the harness identity and persona, with tool guidance. */
|
|
25
|
+
const ORDER = 120
|
|
26
|
+
|
|
27
|
+
/** Reviewer-facing framing replaced by executor-facing framing, verbatim otherwise. */
|
|
28
|
+
const PREAMBLE = 'These limits bound what you PROPOSE and build, never what you look for.'
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Lift the canonical block out of the doctrine document.
|
|
32
|
+
* @returns the fenced block's body, or undefined when the document has none.
|
|
33
|
+
*/
|
|
34
|
+
function extractBlock(markdown) {
|
|
35
|
+
const fence = /```\n(=== SCOPE LIMITS[\s\S]*?)```/.exec(markdown)
|
|
36
|
+
return fence === null ? undefined : fence[1].trim()
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export async function apply(ctx) {
|
|
40
|
+
const markdown = await readFile(DOCTRINE, 'utf8')
|
|
41
|
+
const block = extractBlock(markdown)
|
|
42
|
+
if (block === undefined) {
|
|
43
|
+
throw new Error(`aris-scope-limits: no SCOPE LIMITS block in ${DOCTRINE}`)
|
|
44
|
+
}
|
|
45
|
+
ctx.effect(() => ctx.systemPrompt.section({
|
|
46
|
+
name: 'aris:scope-limits',
|
|
47
|
+
order: ORDER,
|
|
48
|
+
text: `${PREAMBLE}\n\n${block}`,
|
|
49
|
+
}), 'ARIS executor scope limits')
|
|
50
|
+
}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ARIS workbench — host half.
|
|
3
|
+
*
|
|
4
|
+
* Read-only RPC projections over the ARIS artifacts for the workbench view:
|
|
5
|
+
* pipeline/review state, idea board, experiment runs, research-wiki graph,
|
|
6
|
+
* plus the packaged skill corpus and a best-effort launch (inject a prompt
|
|
7
|
+
* into a live session and wake its driver).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { readdir, readFile, stat } from 'node:fs/promises'
|
|
11
|
+
import { isAbsolute, join } from 'node:path'
|
|
12
|
+
|
|
13
|
+
export const WORKBENCH_RPC_CHANNEL = '/aris-wb'
|
|
14
|
+
|
|
15
|
+
const WIKI_DIRS = ['papers', 'ideas', 'experiments', 'claims']
|
|
16
|
+
const SKILL_ROOT = new URL('../skills/', import.meta.url)
|
|
17
|
+
const TICK = String.fromCharCode(96)
|
|
18
|
+
|
|
19
|
+
async function readText(workspace, rel) {
|
|
20
|
+
try { return await readFile(join(workspace, rel), 'utf8') } catch { return undefined }
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async function readJson(workspace, rel) {
|
|
24
|
+
try { return JSON.parse(await readFile(join(workspace, rel), 'utf8')) } catch { return undefined }
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function statFile(workspace, rel) {
|
|
28
|
+
try {
|
|
29
|
+
const info = await stat(join(workspace, rel))
|
|
30
|
+
return { exists: true, mtime: info.mtimeMs, size: info.size }
|
|
31
|
+
} catch {
|
|
32
|
+
return { exists: false }
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function listDir(workspace, rel) {
|
|
37
|
+
try { return (await readdir(join(workspace, rel))).sort() } catch { return undefined }
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function summarizeMarkdown(text, maxLines) {
|
|
41
|
+
if (text === undefined) return undefined
|
|
42
|
+
const lines = text.split(String.fromCharCode(10))
|
|
43
|
+
return { totalLines: lines.length, head: lines.slice(0, maxLines) }
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function readPipeline(workspace) {
|
|
47
|
+
const names = await listDir(workspace, '.aris/runs')
|
|
48
|
+
if (names === undefined) return undefined
|
|
49
|
+
let newest
|
|
50
|
+
for (const name of names) {
|
|
51
|
+
if (!name.endsWith('.json')) continue
|
|
52
|
+
const run = await readJson(workspace, '.aris/runs/' + name)
|
|
53
|
+
if (run === undefined || typeof run !== 'object' || !Array.isArray(run.phases)) continue
|
|
54
|
+
if (newest === undefined || String(run.updated ?? '') > String(newest.updated ?? '')) newest = run
|
|
55
|
+
}
|
|
56
|
+
if (newest === undefined) return undefined
|
|
57
|
+
return {
|
|
58
|
+
runId: newest.run_id,
|
|
59
|
+
updated: newest.updated,
|
|
60
|
+
executor: newest.executor_model,
|
|
61
|
+
executorFamily: newest.executor_family,
|
|
62
|
+
phases: newest.phases.map(entry => ({
|
|
63
|
+
phase: entry.phase,
|
|
64
|
+
status: entry.status,
|
|
65
|
+
artifact: entry.artifact ?? undefined,
|
|
66
|
+
reviewer: entry.reviewer ?? undefined,
|
|
67
|
+
reviewerFamily: entry.reviewer_family ?? undefined,
|
|
68
|
+
independence: entry.review_independence ?? undefined,
|
|
69
|
+
})),
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function readWiki(workspace) {
|
|
74
|
+
const entities = {}
|
|
75
|
+
for (const kind of WIKI_DIRS) {
|
|
76
|
+
const names = await listDir(workspace, 'research-wiki/' + kind)
|
|
77
|
+
if (names === undefined) continue
|
|
78
|
+
const files = []
|
|
79
|
+
for (const name of names) {
|
|
80
|
+
if (!name.endsWith('.md')) continue
|
|
81
|
+
const text = await readText(workspace, 'research-wiki/' + kind + '/' + name)
|
|
82
|
+
files.push({
|
|
83
|
+
name,
|
|
84
|
+
lines: text === undefined ? 0 : text.split(String.fromCharCode(10)).length,
|
|
85
|
+
head: text === undefined ? undefined : text.split(String.fromCharCode(10)).slice(0, 8),
|
|
86
|
+
})
|
|
87
|
+
}
|
|
88
|
+
entities[kind] = files
|
|
89
|
+
}
|
|
90
|
+
const edgesText = await readText(workspace, 'research-wiki/graph/edges.jsonl')
|
|
91
|
+
const edges = []
|
|
92
|
+
if (edgesText !== undefined) {
|
|
93
|
+
for (const line of edgesText.split(String.fromCharCode(10))) {
|
|
94
|
+
const trimmed = line.trim()
|
|
95
|
+
if (trimmed === '') continue
|
|
96
|
+
try { edges.push(JSON.parse(trimmed)) } catch { edges.push({ raw: trimmed }) }
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const extras = {}
|
|
100
|
+
for (const rel of ['index.md', 'query_pack.md', 'gap_map.md', 'log.md']) {
|
|
101
|
+
extras[rel] = await statFile(workspace, 'research-wiki/' + rel)
|
|
102
|
+
}
|
|
103
|
+
return { entities, edges: edges.slice(0, 300), edgeCount: edges.length, extras }
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async function readIdeaBoard(workspace) {
|
|
107
|
+
const board = {}
|
|
108
|
+
for (const rel of ['IDEA_REPORT.md', 'idea-stage/IDEA_REPORT.md']) {
|
|
109
|
+
const text = await readText(workspace, rel)
|
|
110
|
+
if (text !== undefined) board[rel] = summarizeMarkdown(text, 40)
|
|
111
|
+
}
|
|
112
|
+
for (const rel of ['refine-logs/FINAL_PROPOSAL.md', 'refine-logs/EXPERIMENT_PLAN.md', 'refine-logs/REFINE_LOOP.md']) {
|
|
113
|
+
const text = await readText(workspace, rel)
|
|
114
|
+
if (text !== undefined) board[rel] = summarizeMarkdown(text, 30)
|
|
115
|
+
}
|
|
116
|
+
board.refineLogsDir = await listDir(workspace, 'refine-logs')
|
|
117
|
+
return board
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
async function readExperiments(workspace) {
|
|
121
|
+
const runs = []
|
|
122
|
+
const names = await listDir(workspace, '.aris/runs')
|
|
123
|
+
if (names !== undefined) {
|
|
124
|
+
for (const name of names) {
|
|
125
|
+
if (!name.endsWith('.json')) continue
|
|
126
|
+
const run = await readJson(workspace, '.aris/runs/' + name)
|
|
127
|
+
if (run === undefined) continue
|
|
128
|
+
runs.push({
|
|
129
|
+
name,
|
|
130
|
+
runId: run.run_id,
|
|
131
|
+
updated: run.updated,
|
|
132
|
+
executor: run.executor_model,
|
|
133
|
+
phases: Array.isArray(run.phases) ? run.phases.map(p => ({ phase: p.phase, status: p.status })) : undefined,
|
|
134
|
+
})
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const wikiExps = []
|
|
138
|
+
const expNames = await listDir(workspace, 'research-wiki/experiments')
|
|
139
|
+
if (expNames !== undefined) {
|
|
140
|
+
for (const n of expNames) if (n.endsWith('.md')) wikiExps.push(n)
|
|
141
|
+
}
|
|
142
|
+
return { runs: runs.slice(0, 20), wikiExperiments: wikiExps }
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async function readSkillMeta(name) {
|
|
146
|
+
try {
|
|
147
|
+
const text = await readFile(new URL(name + '/SKILL.md', SKILL_ROOT), 'utf8')
|
|
148
|
+
const m = /^---\n([\s\S]*?)\n---/.exec(text)
|
|
149
|
+
if (!m) return { name }
|
|
150
|
+
const out = { name }
|
|
151
|
+
for (const line of m[1].split(String.fromCharCode(10))) {
|
|
152
|
+
const mm = /^([a-zA-Z0-9-]+):\s*(.*)$/.exec(line)
|
|
153
|
+
if (!mm) continue
|
|
154
|
+
const key = mm[1] === 'argument-hint' ? 'argumentHint' : mm[1]
|
|
155
|
+
out[key] = mm[2].trim().replace(/^\"|\"$/g, '')
|
|
156
|
+
}
|
|
157
|
+
return out
|
|
158
|
+
} catch {
|
|
159
|
+
return { name }
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
async function readSkills() {
|
|
164
|
+
const names = []
|
|
165
|
+
try {
|
|
166
|
+
const entries = await readdir(SKILL_ROOT)
|
|
167
|
+
for (const name of entries) {
|
|
168
|
+
if (name.startsWith('.')) continue
|
|
169
|
+
try {
|
|
170
|
+
const info = await stat(new URL(name + '/SKILL.md', SKILL_ROOT))
|
|
171
|
+
if (info.isFile()) names.push(name)
|
|
172
|
+
} catch { /* not a skill dir */ }
|
|
173
|
+
}
|
|
174
|
+
} catch { /* no skills */ }
|
|
175
|
+
names.sort()
|
|
176
|
+
const skills = []
|
|
177
|
+
for (const name of names) skills.push(await readSkillMeta(name))
|
|
178
|
+
return skills
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export function registerWorkbench(ctx) {
|
|
182
|
+
ctx.inject(['connection', 'sessions', 'agents'], (scoped) => {
|
|
183
|
+
scoped.effect(() => scoped.connection.rpc.handle(
|
|
184
|
+
WORKBENCH_RPC_CHANNEL,
|
|
185
|
+
async (endpoint, payload) => {
|
|
186
|
+
if (endpoint === 'sessions') {
|
|
187
|
+
try {
|
|
188
|
+
const list = scoped.sessions.list().map(s => ({ id: s.id, cwd: s.header?.cwd ?? undefined }))
|
|
189
|
+
return { ok: true, value: { sessions: list } }
|
|
190
|
+
} catch (error) {
|
|
191
|
+
return { ok: false, error: { code: 'internal', message: String(error && error.message || error), details: {} } }
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (endpoint === 'skills') {
|
|
195
|
+
try {
|
|
196
|
+
const skills = await readSkills()
|
|
197
|
+
return { ok: true, value: { skills: skills } }
|
|
198
|
+
} catch (error) {
|
|
199
|
+
console.error('[aris-wb] skills failed:', error)
|
|
200
|
+
return { ok: false, error: { code: 'internal', message: String(error && error.message || error), details: {} } }
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const sessionId = typeof payload === 'object' && payload !== null ? payload.sessionId : undefined
|
|
204
|
+
if (typeof sessionId !== 'string') {
|
|
205
|
+
return { ok: false, error: { code: 'bad-request', message: 'sessionId is required', details: {} } }
|
|
206
|
+
}
|
|
207
|
+
const workspace = scoped.sessions.get(sessionId)?.header?.cwd
|
|
208
|
+
if (typeof workspace !== 'string' || !isAbsolute(workspace)) {
|
|
209
|
+
return { ok: true, value: { workspace: undefined } }
|
|
210
|
+
}
|
|
211
|
+
try {
|
|
212
|
+
switch (endpoint) {
|
|
213
|
+
case 'overview': {
|
|
214
|
+
const state = await readJson(workspace, 'review-stage/REVIEW_STATE.json')
|
|
215
|
+
const pipeline = await readPipeline(workspace)
|
|
216
|
+
const artifacts = {}
|
|
217
|
+
for (const rel of [
|
|
218
|
+
'review-stage/REVIEW_STATE.json',
|
|
219
|
+
'review-stage/AUTO_REVIEW.md',
|
|
220
|
+
'review-stage/REVIEWER_MEMORY.md',
|
|
221
|
+
'review-stage/ACQUITTAL_LOG.jsonl',
|
|
222
|
+
'IDEA_REPORT.md',
|
|
223
|
+
'idea-stage/IDEA_REPORT.md',
|
|
224
|
+
'refine-logs/FINAL_PROPOSAL.md',
|
|
225
|
+
'refine-logs/EXPERIMENT_PLAN.md',
|
|
226
|
+
'research-wiki/index.md',
|
|
227
|
+
'research-wiki/query_pack.md',
|
|
228
|
+
]) {
|
|
229
|
+
artifacts[rel] = await statFile(workspace, rel)
|
|
230
|
+
}
|
|
231
|
+
return { ok: true, value: { workspace, state, pipeline, artifacts } }
|
|
232
|
+
}
|
|
233
|
+
case 'wiki': {
|
|
234
|
+
return { ok: true, value: await readWiki(workspace) }
|
|
235
|
+
}
|
|
236
|
+
case 'ideas': {
|
|
237
|
+
return { ok: true, value: await readIdeaBoard(workspace) }
|
|
238
|
+
}
|
|
239
|
+
case 'experiments': {
|
|
240
|
+
return { ok: true, value: await readExperiments(workspace) }
|
|
241
|
+
}
|
|
242
|
+
case 'launch': {
|
|
243
|
+
const skill = typeof payload === 'object' && payload !== null ? payload.skill : undefined
|
|
244
|
+
const args = typeof payload === 'object' && payload !== null ? payload.args : undefined
|
|
245
|
+
if (typeof skill !== 'string' || skill === '') {
|
|
246
|
+
return { ok: false, error: { code: 'bad-request', message: 'skill is required', details: {} } }
|
|
247
|
+
}
|
|
248
|
+
const argText = typeof args === 'string' && args.trim() !== '' ? ' 参数/方向:' + args.trim() : ''
|
|
249
|
+
const prompt = '请使用 ARIS 技能 ' + TICK + skill + TICK + ' 完成对应工作流。' + argText
|
|
250
|
+
const messageId = 'aris-launch-' + Date.now() + '-' + Math.random().toString(36).slice(2, 8)
|
|
251
|
+
const message = {
|
|
252
|
+
id: messageId,
|
|
253
|
+
role: 'user',
|
|
254
|
+
content: [{ type: 'text', text: prompt }],
|
|
255
|
+
source: { kind: 'plugin', plugin: 'dsh-aris' },
|
|
256
|
+
}
|
|
257
|
+
let injected = false
|
|
258
|
+
let method = 'none'
|
|
259
|
+
try {
|
|
260
|
+
const agent = scoped.agents && typeof scoped.agents.get === 'function' ? scoped.agents.get(sessionId) : undefined
|
|
261
|
+
if (agent && typeof agent.send === 'function') {
|
|
262
|
+
agent.send(message, 'next-turn', true)
|
|
263
|
+
injected = true
|
|
264
|
+
method = 'agent.send'
|
|
265
|
+
}
|
|
266
|
+
} catch (e) { /* fall through to session.append */ }
|
|
267
|
+
if (!injected) {
|
|
268
|
+
try {
|
|
269
|
+
const session = scoped.sessions.get(sessionId)
|
|
270
|
+
if (session && typeof session.append === 'function') {
|
|
271
|
+
session.append('user/message', message)
|
|
272
|
+
injected = true
|
|
273
|
+
method = 'session.append'
|
|
274
|
+
}
|
|
275
|
+
} catch (e) {
|
|
276
|
+
return { ok: false, error: { code: 'internal', message: String(e && e.message || e), details: {} } }
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return { ok: true, value: { injected, method, prompt, sessionId, messageId } }
|
|
280
|
+
}
|
|
281
|
+
default:
|
|
282
|
+
return { ok: false, error: { code: 'internal', message: 'unknown ARIS workbench endpoint \"' + endpoint + '\"' } }
|
|
283
|
+
}
|
|
284
|
+
} catch (error) {
|
|
285
|
+
return { ok: false, error: { code: 'internal', message: String(error && error.message || error), details: {} } }
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
{ authority: 'loopback' },
|
|
289
|
+
), 'ARIS workbench RPC')
|
|
290
|
+
})
|
|
291
|
+
}
|