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,273 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Check ARIS skill inventory drift across mainline, Codex mirror, and docs."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import re
|
|
7
|
+
import sys
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
12
|
+
SKILLS_ROOT = REPO_ROOT / "skills"
|
|
13
|
+
CODEX_ROOT = SKILLS_ROOT / "skills-codex"
|
|
14
|
+
CATALOG = REPO_ROOT / "docs" / "SKILLS_CATALOG.md"
|
|
15
|
+
README = REPO_ROOT / "README.md"
|
|
16
|
+
README_CN = REPO_ROOT / "README_CN.md"
|
|
17
|
+
AGENT_GUIDE = REPO_ROOT / "AGENT_GUIDE.md"
|
|
18
|
+
ARIS_INTRO = REPO_ROOT / "docs" / "ARIS_INTRO.md"
|
|
19
|
+
ARIS_INTRO_HTML = REPO_ROOT / "docs" / "ARIS_INTRO.html"
|
|
20
|
+
CODEX_README = CODEX_ROOT / "README.md"
|
|
21
|
+
CODEX_README_CN = CODEX_ROOT / "README_CN.md"
|
|
22
|
+
BOM = b"\xef\xbb\xbf"
|
|
23
|
+
|
|
24
|
+
FORBIDDEN_CODEX_REVIEWER_STRINGS = (
|
|
25
|
+
"mcp__codex__codex",
|
|
26
|
+
"codex-reply",
|
|
27
|
+
"reviewer-continuation",
|
|
28
|
+
"threadId",
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
# Phase A (issue #240): cross-language anchor IDs that MUST exist as
|
|
32
|
+
# explicit `<a id="..."></a>` in both README.md and README_CN.md so that
|
|
33
|
+
# cross-language hyperlinks resolve identically. Adding a new numbered
|
|
34
|
+
# section means adding it to both READMEs AND extending this list.
|
|
35
|
+
REQUIRED_README_ANCHORS = (
|
|
36
|
+
"contents",
|
|
37
|
+
"more-than-just-a-prompt",
|
|
38
|
+
"whats-new",
|
|
39
|
+
"quick-start",
|
|
40
|
+
"features",
|
|
41
|
+
"score-progression",
|
|
42
|
+
"community-showcase",
|
|
43
|
+
"awesome-community-skills",
|
|
44
|
+
"workflows",
|
|
45
|
+
"skills-catalog",
|
|
46
|
+
"setup",
|
|
47
|
+
"customization",
|
|
48
|
+
"alternative-model-combinations",
|
|
49
|
+
"community",
|
|
50
|
+
"citation",
|
|
51
|
+
"star-history",
|
|
52
|
+
"acknowledgements",
|
|
53
|
+
"license",
|
|
54
|
+
"prerequisites",
|
|
55
|
+
"install-skills",
|
|
56
|
+
"gpu-server-setup",
|
|
57
|
+
"alt-a-glm--gpt",
|
|
58
|
+
"-optional-gpt-54-pro-via-oracle",
|
|
59
|
+
"-research-wiki--persistent-research-memory",
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def skill_names(root: Path) -> set[str]:
|
|
64
|
+
return {path.parent.name for path in root.glob("*/SKILL.md")}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def allowed_tools(text: str) -> list[str]:
|
|
68
|
+
"""Tokens on the frontmatter `allowed-tools:` line (empty if absent)."""
|
|
69
|
+
match = re.search(r"^allowed-tools:\s*(.+)$", text, flags=re.MULTILINE)
|
|
70
|
+
if not match:
|
|
71
|
+
return []
|
|
72
|
+
return [tok.strip() for tok in match.group(1).split(",") if tok.strip()]
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def frontmatter_split(text: str) -> str:
|
|
76
|
+
"""Return the body after a leading YAML frontmatter block (whole text if
|
|
77
|
+
no frontmatter). Anchors on the opening `---` fence and the first closing
|
|
78
|
+
`---` fence, so `---` horizontal rules later in the body are not mistaken
|
|
79
|
+
for the frontmatter boundary."""
|
|
80
|
+
match = re.match(r"^---\n.*?\n---\n", text, flags=re.DOTALL)
|
|
81
|
+
return text[match.end():] if match else text
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def readme_anchors(text: str) -> set[str]:
|
|
85
|
+
return set(re.findall(r'<a id="([^"]+)"></a>', text))
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def numbered_h2_count(text: str) -> int:
|
|
89
|
+
return len(re.findall(r"^## \d+\.\s", text, flags=re.MULTILINE))
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def read(path: Path) -> str:
|
|
93
|
+
return path.read_text(encoding="utf-8")
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def catalog_names() -> set[str]:
|
|
97
|
+
text = read(CATALOG)
|
|
98
|
+
return set(re.findall(r"\[`/([^`]+)`\]\(\.\./skills/[^)]+/SKILL\.md\)", text))
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def require(condition: bool, message: str, failures: list[str]) -> None:
|
|
102
|
+
if not condition:
|
|
103
|
+
failures.append(message)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def require_count(path: Path, text: str, pattern: str, expected_count: int, failures: list[str]) -> None:
|
|
107
|
+
match = re.search(pattern, text)
|
|
108
|
+
rel = path.relative_to(REPO_ROOT)
|
|
109
|
+
if match is None:
|
|
110
|
+
failures.append(f"{rel} is missing live count pattern: {pattern}")
|
|
111
|
+
return
|
|
112
|
+
actual = int(match.group("count"))
|
|
113
|
+
if actual != expected_count:
|
|
114
|
+
failures.append(f"{rel} reports {actual} skills; expected {expected_count}")
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def check_inventory() -> list[str]:
|
|
118
|
+
failures: list[str] = []
|
|
119
|
+
main = skill_names(SKILLS_ROOT)
|
|
120
|
+
codex = skill_names(CODEX_ROOT)
|
|
121
|
+
catalog = catalog_names()
|
|
122
|
+
main_refs = {path.name for path in (SKILLS_ROOT / "shared-references").glob("*.md")}
|
|
123
|
+
codex_refs = {path.name for path in (CODEX_ROOT / "shared-references").glob("*.md")}
|
|
124
|
+
|
|
125
|
+
missing_codex = sorted(main - codex)
|
|
126
|
+
extra_codex = sorted(codex - main)
|
|
127
|
+
missing_catalog = sorted(main - catalog)
|
|
128
|
+
extra_catalog = sorted(catalog - main)
|
|
129
|
+
|
|
130
|
+
require(not missing_codex, f"missing Codex mirrors: {', '.join(missing_codex)}", failures)
|
|
131
|
+
require(not extra_codex, f"unexpected Codex-only skills: {', '.join(extra_codex)}", failures)
|
|
132
|
+
require(
|
|
133
|
+
not (main_refs - codex_refs),
|
|
134
|
+
f"missing Codex shared references: {', '.join(sorted(main_refs - codex_refs))}",
|
|
135
|
+
failures,
|
|
136
|
+
)
|
|
137
|
+
require(
|
|
138
|
+
not (codex_refs - main_refs),
|
|
139
|
+
f"unexpected Codex-only shared references: {', '.join(sorted(codex_refs - main_refs))}",
|
|
140
|
+
failures,
|
|
141
|
+
)
|
|
142
|
+
require(not missing_catalog, f"missing catalog entries: {', '.join(missing_catalog)}", failures)
|
|
143
|
+
require(not extra_catalog, f"catalog entries without mainline skills: {', '.join(extra_catalog)}", failures)
|
|
144
|
+
|
|
145
|
+
catalog_text = read(CATALOG)
|
|
146
|
+
readme = read(README)
|
|
147
|
+
readme_cn = read(README_CN)
|
|
148
|
+
agent_guide = read(AGENT_GUIDE)
|
|
149
|
+
aris_intro = read(ARIS_INTRO)
|
|
150
|
+
aris_intro_html = read(ARIS_INTRO_HTML)
|
|
151
|
+
codex_readme = read(CODEX_README)
|
|
152
|
+
codex_readme_cn = read(CODEX_README_CN)
|
|
153
|
+
|
|
154
|
+
expected_count = len(main)
|
|
155
|
+
count_checks = [
|
|
156
|
+
(CATALOG, catalog_text, r"\*\*(?P<count>\d+) skills\*\*"),
|
|
157
|
+
(AGENT_GUIDE, agent_guide, r"Full catalog.*?\*\*(?P<count>\d+) skills\*\*"),
|
|
158
|
+
(ARIS_INTRO, aris_intro, r"collection of \*\*(?P<count>\d+) composable Claude Code skills\*\*"),
|
|
159
|
+
(ARIS_INTRO, aris_intro, r"## The (?P<count>\d+) Skills"),
|
|
160
|
+
(ARIS_INTRO, aris_intro, r"一组 (?P<count>\d+) 个可组合的 Claude Code skills"),
|
|
161
|
+
(ARIS_INTRO_HTML, aris_intro_html, r"collection of <strong>(?P<count>\d+) composable Claude Code skills</strong>"),
|
|
162
|
+
(ARIS_INTRO_HTML, aris_intro_html, r'id="the-(?P<count>\d+)-skills"'),
|
|
163
|
+
(ARIS_INTRO_HTML, aris_intro_html, r"一组 (?P<count>\d+) 个可组合的 Claude Code skills"),
|
|
164
|
+
(CODEX_README, codex_readme, r"all `(?P<count>\d+)` mainline skills"),
|
|
165
|
+
(CODEX_README_CN, codex_readme_cn, r"`(?P<count>\d+)`[^\n]*skill"),
|
|
166
|
+
]
|
|
167
|
+
for path, text, pattern in count_checks:
|
|
168
|
+
require_count(path, text, pattern, expected_count, failures)
|
|
169
|
+
|
|
170
|
+
for skill_file in sorted(CODEX_ROOT.glob("*/SKILL.md")):
|
|
171
|
+
if skill_file.read_bytes().startswith(BOM):
|
|
172
|
+
failures.append(f"{skill_file.relative_to(REPO_ROOT)} starts with UTF-8 BOM before frontmatter")
|
|
173
|
+
text = read(skill_file)
|
|
174
|
+
for forbidden in FORBIDDEN_CODEX_REVIEWER_STRINGS:
|
|
175
|
+
if forbidden in text:
|
|
176
|
+
failures.append(f"{skill_file.relative_to(REPO_ROOT)} contains forbidden reviewer string: {forbidden}")
|
|
177
|
+
|
|
178
|
+
# Root READMEs on this distribution branch are the dsh ones and carry no
|
|
179
|
+
# skill counts, anchors, or numbered sections; the full-ARIS README checks
|
|
180
|
+
# live on main.
|
|
181
|
+
|
|
182
|
+
# Agent-grant hygiene (WB2): `Agent` in allowed-tools is the Tier-2
|
|
183
|
+
# fan-out capability gate. Per shared-references/fan-out-pattern.md it is
|
|
184
|
+
# granted ONLY to skills that actually fan out, and such skills MUST cite
|
|
185
|
+
# the convention doc in their body. A grant without that citation is a
|
|
186
|
+
# vestigial/boilerplate grant and fails the drift check.
|
|
187
|
+
for skill_file in sorted(SKILLS_ROOT.glob("*/SKILL.md")):
|
|
188
|
+
text = read(skill_file)
|
|
189
|
+
if "Agent" not in allowed_tools(text):
|
|
190
|
+
continue
|
|
191
|
+
if "fan-out-pattern.md" not in frontmatter_split(text):
|
|
192
|
+
rel = skill_file.relative_to(REPO_ROOT)
|
|
193
|
+
failures.append(
|
|
194
|
+
f"{rel} grants `Agent` in allowed-tools but its body does not "
|
|
195
|
+
f"cite fan-out-pattern.md — vestigial grant or undocumented "
|
|
196
|
+
f"fan-out (see shared-references/fan-out-pattern.md)"
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
# Watchdog 'loop' task type ⇔ its documented trigger (A2). Mirrors the Agent-grant⇒cite
|
|
200
|
+
# rule above: a feature with no documented trigger is dead weight, a documented trigger
|
|
201
|
+
# for a missing feature is a broken pointer. The loop type is a shipped feature, so BOTH
|
|
202
|
+
# must be present.
|
|
203
|
+
watchdog_py = read(REPO_ROOT / "tools" / "watchdog.py")
|
|
204
|
+
ext_cadence = read(SKILLS_ROOT / "shared-references" / "external-cadence.md")
|
|
205
|
+
tool_loop = bool(re.search(r"def check_loop\b", watchdog_py)) and bool(re.search(r'==\s*"loop"', watchdog_py))
|
|
206
|
+
doc_loop = bool(re.search(r'"type"\s*:\s*"loop"', ext_cadence))
|
|
207
|
+
require(tool_loop, "tools/watchdog.py must implement the loop-liveness check_loop (A2)", failures)
|
|
208
|
+
require(doc_loop, "external-cadence.md must document registering a watchdog 'loop' task — its trigger (A2)", failures)
|
|
209
|
+
|
|
210
|
+
# iteration_log.py (stall→pivot, B) must exist AND be both documented (the ladder with
|
|
211
|
+
# both thresholds) and actually wired into a heartbeat consumer — else it is dead code.
|
|
212
|
+
# Same dead-code guard as the Agent-grant⇒cite rule above.
|
|
213
|
+
extc = read(SKILLS_ROOT / "shared-references" / "external-cadence.md")
|
|
214
|
+
rp = read(SKILLS_ROOT / "research-pipeline" / "SKILL.md")
|
|
215
|
+
tool_stall = (REPO_ROOT / "tools" / "iteration_log.py").is_file()
|
|
216
|
+
doc_ladder = bool(re.search(r"forced structural pivot", extc, re.IGNORECASE)) and \
|
|
217
|
+
bool(re.search(r"stale_count`?\s*>=\s*2", extc)) and bool(re.search(r"stale_count`?\s*>=\s*4", extc))
|
|
218
|
+
# Prove the wiring is real (not a prose mention): resolver chain + note invocation +
|
|
219
|
+
# both pivot branches handled in research-pipeline.
|
|
220
|
+
wired = ('iteration_log.py' in rp and 'ITER_LOG' in rp
|
|
221
|
+
and re.search(r'"\$ITER_LOG"\s+note', rp) is not None
|
|
222
|
+
and 'pivot' in rp and 'structural' in rp and 'human' in rp)
|
|
223
|
+
require(tool_stall, "tools/iteration_log.py (stall→pivot, B) must exist", failures)
|
|
224
|
+
require(doc_ladder, "external-cadence.md must document the stall ladder with both thresholds (>=2 structural, >=4 human) (B)", failures)
|
|
225
|
+
require(wired, "research-pipeline/SKILL.md must actually wire iteration_log.py (resolver + `$ITER_LOG note` + pivot handling) — not just mention it (B)", failures)
|
|
226
|
+
|
|
227
|
+
# research_wiki.py add_claim (claim layer) ⇔ its documented birth trigger in
|
|
228
|
+
# /proof-checker. add_claim is a writer; without a skill that calls it, the claim
|
|
229
|
+
# layer is dead code (the exact orphan-writer trap). Same dead-code guard as above:
|
|
230
|
+
# the writer and its single birth point must BOTH be present.
|
|
231
|
+
rwiki = read(REPO_ROOT / "tools" / "research_wiki.py")
|
|
232
|
+
pchk = read(SKILLS_ROOT / "proof-checker" / "SKILL.md")
|
|
233
|
+
tool_claim = bool(re.search(r"def add_claim\b", rwiki)) and bool(re.search(r'add_parser\("add_claim"', rwiki))
|
|
234
|
+
# Prove the trigger is real (anchored to the actual command line, not a prose
|
|
235
|
+
# mention or comment): proof-checker must literally invoke the resolved helper.
|
|
236
|
+
born = re.search(r'python3\s+"\$WIKI_SCRIPT"\s+add_claim\b', pchk) is not None
|
|
237
|
+
require(tool_claim, "tools/research_wiki.py must implement the add_claim claim-layer writer + its CLI", failures)
|
|
238
|
+
require(born, "proof-checker/SKILL.md must invoke `add_claim` as the claim birth point — not just mention it (else add_claim is an orphan writer)", failures)
|
|
239
|
+
|
|
240
|
+
# research_wiki.py upsert_idea (idea layer) ⇔ its documented write-back in
|
|
241
|
+
# /idea-creator Phase 7. Same orphan-writer guard: the deterministic idea writer
|
|
242
|
+
# and the skill that calls it must BOTH be present, anchored to the real command.
|
|
243
|
+
icreator = read(SKILLS_ROOT / "idea-creator" / "SKILL.md")
|
|
244
|
+
tool_idea = bool(re.search(r"def upsert_idea\b", rwiki)) and bool(re.search(r'add_parser\("upsert_idea"', rwiki))
|
|
245
|
+
idea_written = re.search(r'python3\s+"\$WIKI_SCRIPT"\s+upsert_idea\b', icreator) is not None
|
|
246
|
+
require(tool_idea, "tools/research_wiki.py must implement the upsert_idea idea-layer writer + its CLI", failures)
|
|
247
|
+
require(idea_written, "idea-creator/SKILL.md must invoke `upsert_idea` to record ideas (Phase 7) — not just mention it (else ideas are written freehand and skipped on re-gen)", failures)
|
|
248
|
+
|
|
249
|
+
# research_wiki.py add_experiment (experiment layer) ⇔ its write-back in
|
|
250
|
+
# /result-to-claim Step 5. Same orphan-writer guard; closes the last freehand
|
|
251
|
+
# wiki layer so the supports/invalidates edges never dangle off a missing exp node.
|
|
252
|
+
r2c = read(SKILLS_ROOT / "result-to-claim" / "SKILL.md")
|
|
253
|
+
tool_exp = bool(re.search(r"def add_experiment\b", rwiki)) and bool(re.search(r'add_parser\("add_experiment"', rwiki))
|
|
254
|
+
exp_written = re.search(r'python3\s+"\$WIKI_SCRIPT"\s+add_experiment\b', r2c) is not None
|
|
255
|
+
require(tool_exp, "tools/research_wiki.py must implement the add_experiment experiment-layer writer + its CLI", failures)
|
|
256
|
+
require(exp_written, "result-to-claim/SKILL.md must invoke `add_experiment` to create the experiment node (Step 5) — not just mention it (else exp pages are freehand and supports/invalidates edges dangle)", failures)
|
|
257
|
+
|
|
258
|
+
return failures
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def main() -> int:
|
|
262
|
+
failures = check_inventory()
|
|
263
|
+
if failures:
|
|
264
|
+
print("ARIS skill inventory drift detected:", file=sys.stderr)
|
|
265
|
+
for failure in failures:
|
|
266
|
+
print(f"- {failure}", file=sys.stderr)
|
|
267
|
+
return 1
|
|
268
|
+
print("ARIS skill inventory is consistent.")
|
|
269
|
+
return 0
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
if __name__ == "__main__":
|
|
273
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Convert Codex-native skills to llm-chat MCP compatible versions.
|
|
3
|
+
|
|
4
|
+
Reads skills from a source directory, replaces all mcp__codex__codex and
|
|
5
|
+
mcp__codex__codex-reply references with mcp__llm-chat__chat, removes
|
|
6
|
+
Codex-specific parameters, and writes the converted files to a target
|
|
7
|
+
directory. Works on Windows, macOS, and Linux.
|
|
8
|
+
|
|
9
|
+
Usage:
|
|
10
|
+
# Convert all skills to ~/.claude/skills/
|
|
11
|
+
python convert_skills_to_llm_chat.py
|
|
12
|
+
|
|
13
|
+
# Custom source and target
|
|
14
|
+
python convert_skills_to_llm_chat.py --source ./skills --target ./skills-llm-chat
|
|
15
|
+
|
|
16
|
+
# Preview changes without writing files
|
|
17
|
+
python convert_skills_to_llm_chat.py --dry-run
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import argparse
|
|
23
|
+
import re
|
|
24
|
+
import shutil
|
|
25
|
+
import sys
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# ── Codex → llm-chat text replacements ──────────────────────────────────
|
|
30
|
+
|
|
31
|
+
# Tool name replacements
|
|
32
|
+
REPLACEMENTS_TEXT: list[tuple[str, str]] = [
|
|
33
|
+
# Tool names
|
|
34
|
+
("mcp__codex__codex-reply", "mcp__llm-chat__chat"),
|
|
35
|
+
("mcp__codex__codex", "mcp__llm-chat__chat"),
|
|
36
|
+
# Description text
|
|
37
|
+
("Always pin `model: gpt-5.6-sol` + `config: {\"model_reasoning_effort\": \"ultra\"}` (deep-audit tier).",
|
|
38
|
+
"Ask the LLM reviewer for its strictest, deepest review (deep-audit tier)."),
|
|
39
|
+
("for new review threads\n (`model: gpt-5.6-sol`, `config: {\"model_reasoning_effort\": \"ultra\"}`).",
|
|
40
|
+
"for new review threads."),
|
|
41
|
+
("`model: gpt-5.6-sol`, `reasoning: ultra`", "the configured `LLM_MODEL`, deepest available reasoning"),
|
|
42
|
+
("- **ALWAYS use `config: {\"model_reasoning_effort\": \"xhigh\"}`** for all Codex review calls.",
|
|
43
|
+
"- **Always ask the LLM reviewer for strict, high-rigor feedback** in every review round."),
|
|
44
|
+
("ALWAYS pin `model: gpt-5.6-sol` + `config: {\"model_reasoning_effort\": \"ultra\"}` for reviews (deep-audit tier; capability fallback per `reviewer-routing.md`, never below `xhigh`)",
|
|
45
|
+
"ALWAYS ask the LLM reviewer for strict, maximum-depth review"),
|
|
46
|
+
("Always use `model_reasoning_effort: \"xhigh\"` for maximum analysis depth.",
|
|
47
|
+
"Always ask the LLM reviewer for maximum analysis depth."),
|
|
48
|
+
("(`gpt-5.6-sol` via Codex MCP)", "(via llm-chat MCP)"),
|
|
49
|
+
("override the default reviewer (`gpt-5.6-sol`)", "override the default reviewer"),
|
|
50
|
+
("via GPT-5.6-Sol xhigh review", "via llm-chat MCP review"),
|
|
51
|
+
("via GPT-5.6-Sol ultra review", "via llm-chat MCP review"),
|
|
52
|
+
("GPT-5.6-Sol xhigh", "LLM reviewer"),
|
|
53
|
+
("GPT-5.6-Sol ultra", "LLM reviewer"),
|
|
54
|
+
("via GPT-5.5 xhigh review", "via llm-chat MCP review"),
|
|
55
|
+
("GPT-5.5 xhigh", "LLM reviewer"),
|
|
56
|
+
("a second Codex agent", "an LLM via llm-chat MCP"),
|
|
57
|
+
("secondary Codex agent", "LLM reviewer via llm-chat MCP"),
|
|
58
|
+
("Codex agent", "LLM reviewer"),
|
|
59
|
+
("- ALWAYS use `config: {\"model_reasoning_effort\": \"xhigh\"}` for maximum reasoning depth",
|
|
60
|
+
"- ALWAYS ask the LLM reviewer for maximum reasoning depth"),
|
|
61
|
+
("pin `model: gpt-5.6-sol` + `config: {\"model_reasoning_effort\": \"xhigh\"}` per `../shared-references/reviewer-routing.md`",
|
|
62
|
+
"ask for strict, high-rigor review"),
|
|
63
|
+
("pin `model: gpt-5.6-sol` + `config: {\"model_reasoning_effort\": \"ultra\"}` (deep-audit tier)",
|
|
64
|
+
"ask for strict, maximum-depth review"),
|
|
65
|
+
("with `model: gpt-5.6-sol`, `config: {model_reasoning_effort: xhigh}`, `sandbox: read-only`, fresh thread",
|
|
66
|
+
"with a fresh thread"),
|
|
67
|
+
("with `model: gpt-5.6-sol`, `config: {model_reasoning_effort: ultra}`, `sandbox: read-only`, fresh thread",
|
|
68
|
+
"with a fresh thread"),
|
|
69
|
+
("model_reasoning_effort: \"ultra\"", "# (reasoning effort not supported by llm-chat)"),
|
|
70
|
+
("model_reasoning_effort: \"xhigh\"", "# (reasoning effort not supported by llm-chat)"),
|
|
71
|
+
("model_reasoning_effort: ultra", "# (reasoning effort not supported by llm-chat)"),
|
|
72
|
+
("model_reasoning_effort: xhigh", "# (reasoning effort not supported by llm-chat)"),
|
|
73
|
+
("reasoning_effort: ultra", "# (reasoning effort not supported by llm-chat)"),
|
|
74
|
+
("reasoning_effort: xhigh", "# (reasoning effort not supported by llm-chat)"),
|
|
75
|
+
("reasoning_effort: high", "# (reasoning effort not supported by llm-chat)"),
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
# Regex patterns for structural changes
|
|
79
|
+
CONFIG_LINE_RE = re.compile(
|
|
80
|
+
r'^(\s*)(?:- )?`?config`?:\s*\{[^}]*model_reasoning_effort[^}]*\}`?\s*$',
|
|
81
|
+
re.MULTILINE,
|
|
82
|
+
)
|
|
83
|
+
MODEL_LINE_RE = re.compile(
|
|
84
|
+
r'^(\s*)(?:- )?`?"?model"?`?:\s*(?:["\'`]?gpt-[^\s"\'`]+["\'`]?|REVIEWER_MODEL)\s*$',
|
|
85
|
+
re.MULTILINE,
|
|
86
|
+
)
|
|
87
|
+
THREAD_ID_LINE_RE = re.compile(
|
|
88
|
+
r'^(\s*)threadId:\s*\S+.*$',
|
|
89
|
+
re.MULTILINE,
|
|
90
|
+
)
|
|
91
|
+
APPROVAL_POLICY_LINE_RE = re.compile(
|
|
92
|
+
r'^(\s*)approval-policy:\s*\S+.*$',
|
|
93
|
+
re.MULTILINE,
|
|
94
|
+
)
|
|
95
|
+
SANDBOX_LINE_RE = re.compile(
|
|
96
|
+
r'^(\s*)sandbox:\s*\S+.*$',
|
|
97
|
+
re.MULTILINE,
|
|
98
|
+
)
|
|
99
|
+
BASE_INSTRUCTIONS_LINE_RE = re.compile(
|
|
100
|
+
r'^(\s*)base-instructions:\s*["\'].*$',
|
|
101
|
+
re.MULTILINE,
|
|
102
|
+
)
|
|
103
|
+
DEVELOPER_INSTRUCTIONS_LINE_RE = re.compile(
|
|
104
|
+
r'^(\s*)developer-instructions:\s*["\'].*$',
|
|
105
|
+
re.MULTILINE,
|
|
106
|
+
)
|
|
107
|
+
# Match "prompt:" as a parameter name under mcp tool blocks
|
|
108
|
+
PROMPT_PARAM_RE = re.compile(
|
|
109
|
+
r'^(\s*)prompt:\s*\|',
|
|
110
|
+
re.MULTILINE,
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def convert_content(text: str) -> str:
|
|
115
|
+
"""Apply all Codex → llm-chat conversions to skill content."""
|
|
116
|
+
|
|
117
|
+
# 1. Simple text replacements
|
|
118
|
+
for old, new in REPLACEMENTS_TEXT:
|
|
119
|
+
text = text.replace(old, new)
|
|
120
|
+
|
|
121
|
+
# 1b. Deduplicate mcp tool names in allowed-tools / tool references
|
|
122
|
+
text = re.sub(
|
|
123
|
+
r'(mcp__llm-chat__chat),\s*mcp__llm-chat__chat',
|
|
124
|
+
r'\1',
|
|
125
|
+
text,
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
# 2. Remove Codex-specific parameter lines
|
|
129
|
+
for pattern in (
|
|
130
|
+
CONFIG_LINE_RE,
|
|
131
|
+
MODEL_LINE_RE,
|
|
132
|
+
THREAD_ID_LINE_RE,
|
|
133
|
+
APPROVAL_POLICY_LINE_RE,
|
|
134
|
+
SANDBOX_LINE_RE,
|
|
135
|
+
BASE_INSTRUCTIONS_LINE_RE,
|
|
136
|
+
DEVELOPER_INSTRUCTIONS_LINE_RE,
|
|
137
|
+
):
|
|
138
|
+
text = pattern.sub('', text)
|
|
139
|
+
|
|
140
|
+
# 3. Rename "prompt:" → "prompt:" (llm-chat uses "prompt" too based on auto-review-loop-llm)
|
|
141
|
+
# Actually llm-chat MCP accepts "prompt" as the main parameter, so no rename needed.
|
|
142
|
+
# The auto-review-loop-llm reference skill uses "prompt:" parameter name.
|
|
143
|
+
|
|
144
|
+
# 4. Add conversion note after YAML frontmatter if not already present
|
|
145
|
+
note = (
|
|
146
|
+
"\n> **llm-chat conversion**: This skill has been auto-converted from Codex to "
|
|
147
|
+
"use `mcp__llm-chat__chat`. Multi-turn conversations are handled as single-turn "
|
|
148
|
+
"calls with manual context inclusion.\n"
|
|
149
|
+
)
|
|
150
|
+
if "llm-chat conversion" not in text:
|
|
151
|
+
# Insert after frontmatter
|
|
152
|
+
fm_end = text.find("---", text.find("---") + 3)
|
|
153
|
+
if fm_end != -1:
|
|
154
|
+
fm_end = text.find("\n", fm_end + 3)
|
|
155
|
+
if fm_end != -1:
|
|
156
|
+
text = text[:fm_end + 1] + note + text[fm_end + 1:]
|
|
157
|
+
|
|
158
|
+
# 5. Clean up multiple blank lines from removed lines
|
|
159
|
+
text = re.sub(r'\n{3,}', '\n\n', text)
|
|
160
|
+
|
|
161
|
+
return text
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def convert_file(src: Path, dst: Path) -> bool:
|
|
165
|
+
"""Convert a single SKILL.md file. Returns True if changes were made."""
|
|
166
|
+
content = src.read_text(encoding="utf-8")
|
|
167
|
+
converted = convert_content(content)
|
|
168
|
+
|
|
169
|
+
if converted == content:
|
|
170
|
+
return False
|
|
171
|
+
|
|
172
|
+
dst.parent.mkdir(parents=True, exist_ok=True)
|
|
173
|
+
dst.write_text(converted, encoding="utf-8")
|
|
174
|
+
return True
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def find_skills(source_dir: Path) -> list[Path]:
|
|
178
|
+
"""Find all SKILL.md files under source_dir, excluding known variant dirs."""
|
|
179
|
+
skills = []
|
|
180
|
+
exclude_dirs = {
|
|
181
|
+
"skills-codex",
|
|
182
|
+
"skills-codex-claude-review",
|
|
183
|
+
"skills-codex-gemini-review",
|
|
184
|
+
}
|
|
185
|
+
for skill_md in sorted(source_dir.rglob("SKILL.md")):
|
|
186
|
+
# Skip variant skill directories
|
|
187
|
+
parts = skill_md.relative_to(source_dir).parts
|
|
188
|
+
if any(d in parts for d in exclude_dirs):
|
|
189
|
+
continue
|
|
190
|
+
# Skip skills that already use llm-chat
|
|
191
|
+
content = skill_md.read_text(encoding="utf-8")
|
|
192
|
+
if "mcp__llm-chat__chat" in content and "mcp__codex__codex" not in content:
|
|
193
|
+
continue
|
|
194
|
+
# Only include files that reference codex
|
|
195
|
+
if "mcp__codex__codex" not in content:
|
|
196
|
+
continue
|
|
197
|
+
skills.append(skill_md)
|
|
198
|
+
return skills
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def main() -> None:
|
|
202
|
+
parser = argparse.ArgumentParser(
|
|
203
|
+
description="Convert Codex-native skills to llm-chat MCP compatible versions."
|
|
204
|
+
)
|
|
205
|
+
parser.add_argument(
|
|
206
|
+
"--source",
|
|
207
|
+
type=Path,
|
|
208
|
+
default=None,
|
|
209
|
+
help="Source directory containing skill folders (default: repo skills/)",
|
|
210
|
+
)
|
|
211
|
+
parser.add_argument(
|
|
212
|
+
"--target",
|
|
213
|
+
type=Path,
|
|
214
|
+
default=None,
|
|
215
|
+
help="Target directory for converted skills (default: source, in-place)",
|
|
216
|
+
)
|
|
217
|
+
parser.add_argument(
|
|
218
|
+
"--force-in-place",
|
|
219
|
+
action="store_true",
|
|
220
|
+
help="Allow in-place conversion of the repo's canonical skills/ tree (dangerous)",
|
|
221
|
+
)
|
|
222
|
+
parser.add_argument(
|
|
223
|
+
"--dry-run",
|
|
224
|
+
action="store_true",
|
|
225
|
+
help="Preview changes without writing files",
|
|
226
|
+
)
|
|
227
|
+
args = parser.parse_args()
|
|
228
|
+
|
|
229
|
+
# Default source: skills/ in the same repo as this script
|
|
230
|
+
repo_root = Path(__file__).resolve().parents[1]
|
|
231
|
+
source_dir = args.source or repo_root / "skills"
|
|
232
|
+
target_dir = args.target or source_dir # in-place by default
|
|
233
|
+
|
|
234
|
+
# Refuse to rewrite the repo's canonical skill tree in place — that destroys
|
|
235
|
+
# the Codex-native sources (this exact accident has happened). Convert INTO
|
|
236
|
+
# a separate --target, or pass --force-in-place if you really mean it.
|
|
237
|
+
canonical = (repo_root / "skills").resolve()
|
|
238
|
+
tgt = target_dir.resolve()
|
|
239
|
+
if (tgt == canonical or canonical in tgt.parents) \
|
|
240
|
+
and not args.dry_run and not args.force_in_place:
|
|
241
|
+
print("Error: refusing to convert the repo's canonical skills/ tree in place.")
|
|
242
|
+
print("Pass --target <dir> (recommended) or --force-in-place to override.")
|
|
243
|
+
sys.exit(1)
|
|
244
|
+
|
|
245
|
+
if not source_dir.exists():
|
|
246
|
+
print(f"Error: source directory not found: {source_dir}")
|
|
247
|
+
sys.exit(1)
|
|
248
|
+
|
|
249
|
+
skills = find_skills(source_dir)
|
|
250
|
+
if not skills:
|
|
251
|
+
print("No Codex-based skills found to convert.")
|
|
252
|
+
return
|
|
253
|
+
|
|
254
|
+
print(f"Found {len(skills)} skill(s) to convert:\n")
|
|
255
|
+
|
|
256
|
+
converted = 0
|
|
257
|
+
for skill_path in skills:
|
|
258
|
+
rel = skill_path.relative_to(source_dir)
|
|
259
|
+
dst = target_dir / rel
|
|
260
|
+
|
|
261
|
+
if args.dry_run:
|
|
262
|
+
content = skill_path.read_text(encoding="utf-8")
|
|
263
|
+
new_content = convert_content(content)
|
|
264
|
+
has_changes = content != new_content
|
|
265
|
+
status = "would convert" if has_changes else "no changes"
|
|
266
|
+
print(f" [DRY-RUN] {rel} — {status}")
|
|
267
|
+
if has_changes:
|
|
268
|
+
converted += 1
|
|
269
|
+
else:
|
|
270
|
+
if convert_file(skill_path, dst):
|
|
271
|
+
print(f" Converted: {rel}")
|
|
272
|
+
converted += 1
|
|
273
|
+
else:
|
|
274
|
+
print(f" No changes: {rel}")
|
|
275
|
+
|
|
276
|
+
print(f"\nDone: {converted}/{len(skills)} skill(s) converted.")
|
|
277
|
+
if args.dry_run:
|
|
278
|
+
print("(dry-run mode — no files were written)")
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
if __name__ == "__main__":
|
|
282
|
+
main()
|