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,299 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Generate Claude-review overrides for the upstream Codex-native skills."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import ast
|
|
7
|
+
import json
|
|
8
|
+
import re
|
|
9
|
+
import shutil
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
14
|
+
SRC_ROOT = REPO_ROOT / "skills" / "skills-codex"
|
|
15
|
+
DEST_ROOT = REPO_ROOT / "skills" / "skills-codex-claude-review"
|
|
16
|
+
|
|
17
|
+
TARGET_SKILLS = [
|
|
18
|
+
"research-review",
|
|
19
|
+
"novelty-check",
|
|
20
|
+
"research-refine",
|
|
21
|
+
"auto-review-loop",
|
|
22
|
+
"paper-plan",
|
|
23
|
+
"paper-figure",
|
|
24
|
+
"paper-write",
|
|
25
|
+
"auto-paper-improvement-loop",
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
FRONTMATTER_RE = re.compile(r"^---\n(.*?)\n---\n?", re.DOTALL)
|
|
29
|
+
SPAWN_BLOCK_RE = re.compile(r"```(?:yaml|text)?\nspawn_agent:\n([\s\S]*?)```")
|
|
30
|
+
SEND_BLOCK_RE = re.compile(r"```(?:yaml|text)?\nsend_input:\n([\s\S]*?)```")
|
|
31
|
+
|
|
32
|
+
OVERRIDE_NOTE = (
|
|
33
|
+
"> Override for Codex users who want **Claude Code**, not a second Codex agent, "
|
|
34
|
+
"to act as the reviewer. Install this package **after** `skills/skills-codex/*`.\n>\n"
|
|
35
|
+
"> This reviewer is a different model family from the Codex executor. Every "
|
|
36
|
+
"overlay trace/audit records:\n>\n> ```yaml\n> review_independence: cross-family\n"
|
|
37
|
+
"> acceptance_status: accepted\n> ```"
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
REVIEWER_LINE = (
|
|
41
|
+
"- **REVIEWER_MODEL = `claude-review`** — Claude reviewer invoked through the "
|
|
42
|
+
"local `claude-review` MCP bridge. Set `CLAUDE_REVIEW_MODEL` if you need a "
|
|
43
|
+
"specific Claude model override."
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
PREREQ_BLOCK = """## Prerequisites
|
|
47
|
+
|
|
48
|
+
- Install the base Codex-native skills first: copy `skills/skills-codex/*` into `~/.codex/skills/`.
|
|
49
|
+
- Then install this overlay package: copy `skills/skills-codex-claude-review/*` into `~/.codex/skills/` and allow it to overwrite the same skill names.
|
|
50
|
+
- Register the local reviewer bridge:
|
|
51
|
+
```bash
|
|
52
|
+
codex mcp add claude-review -- python3 ~/.codex/mcp-servers/claude-review/server.py
|
|
53
|
+
```
|
|
54
|
+
- This gives Codex access to `mcp__claude-review__review_start`, `mcp__claude-review__review_reply_start`, and `mcp__claude-review__review_status`.
|
|
55
|
+
""".strip()
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def extract_field(frontmatter: str, field: str) -> str:
|
|
59
|
+
pattern = re.compile(rf"^{re.escape(field)}:\s*(.+)$", re.MULTILINE)
|
|
60
|
+
match = pattern.search(frontmatter)
|
|
61
|
+
if not match:
|
|
62
|
+
return ""
|
|
63
|
+
value = match.group(1).strip()
|
|
64
|
+
if (value.startswith('"') and value.endswith('"')) or (value.startswith("'") and value.endswith("'")):
|
|
65
|
+
try:
|
|
66
|
+
value = ast.literal_eval(value)
|
|
67
|
+
except (SyntaxError, ValueError):
|
|
68
|
+
value = value[1:-1]
|
|
69
|
+
return value
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def build_frontmatter(name: str, description: str) -> str:
|
|
73
|
+
# JSON strings are a valid subset of YAML double-quoted scalars. Using a
|
|
74
|
+
# serializer here keeps backslashes and quotes from being escaped twice.
|
|
75
|
+
return (
|
|
76
|
+
f'---\nname: {json.dumps(name, ensure_ascii=False)}\n'
|
|
77
|
+
f'description: {json.dumps(description, ensure_ascii=False)}\n'
|
|
78
|
+
'---\n\n'
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def normalize_description(text: str) -> str:
|
|
83
|
+
text = text or "Claude-review override for a Codex-native ARIS skill."
|
|
84
|
+
# A few legacy Codex-mirror descriptions contain an extra escape layer
|
|
85
|
+
# (the parsed value is `\\\"` instead of `\"`). Remove that layer before
|
|
86
|
+
# serializing the Claude overlay so regeneration stays idempotent.
|
|
87
|
+
text = text.replace('\\\"', '"')
|
|
88
|
+
text = text.replace("GPT using a secondary Codex agent", "Claude via claude-review MCP")
|
|
89
|
+
text = text.replace("using a secondary Codex agent", "using Claude Code via claude-review MCP")
|
|
90
|
+
text = text.replace("via GPT-5.6-Sol xhigh review", "via Claude review through claude-review MCP")
|
|
91
|
+
text = text.replace("(Codex GPT-5.6-Sol ultra)", "(Claude via claude-review MCP)")
|
|
92
|
+
text = text.replace("(Codex GPT-5.6-Sol xhigh)", "(Claude via claude-review MCP)")
|
|
93
|
+
text = text.replace("iterative GPT-5.6-Sol review", "iterative Claude review")
|
|
94
|
+
text = text.replace("GPT-5.6-Sol", "Claude")
|
|
95
|
+
text = text.replace("via GPT-5.6-Sol ultra review", "via Claude review through claude-review MCP")
|
|
96
|
+
text = text.replace("via GPT-5.5 xhigh review", "via Claude review through claude-review MCP")
|
|
97
|
+
text = text.replace("GPT-5.5", "Claude through claude-review MCP")
|
|
98
|
+
return text
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def rewrite_spawn_block(match: re.Match[str]) -> str:
|
|
102
|
+
lines = match.group(1).splitlines()
|
|
103
|
+
out = ["```", "mcp__claude-review__review_start:"]
|
|
104
|
+
for line in lines:
|
|
105
|
+
stripped = line.strip()
|
|
106
|
+
if not stripped:
|
|
107
|
+
out.append(line)
|
|
108
|
+
continue
|
|
109
|
+
if stripped.startswith("model:") or stripped.startswith("reasoning_effort:"):
|
|
110
|
+
continue
|
|
111
|
+
if stripped.startswith("message:"):
|
|
112
|
+
out.append(line.replace("message:", "prompt:", 1))
|
|
113
|
+
continue
|
|
114
|
+
out.append(line)
|
|
115
|
+
out.append("```")
|
|
116
|
+
return "\n".join(out)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def rewrite_send_block(match: re.Match[str]) -> str:
|
|
120
|
+
lines = match.group(1).splitlines()
|
|
121
|
+
out = ["```", "mcp__claude-review__review_reply_start:"]
|
|
122
|
+
for line in lines:
|
|
123
|
+
stripped = line.strip()
|
|
124
|
+
if not stripped:
|
|
125
|
+
out.append(line)
|
|
126
|
+
continue
|
|
127
|
+
if stripped.startswith("model:") or stripped.startswith("reasoning_effort:"):
|
|
128
|
+
continue
|
|
129
|
+
if stripped.startswith("target:"):
|
|
130
|
+
out.append(line.replace("target:", "threadId:", 1))
|
|
131
|
+
continue
|
|
132
|
+
if stripped.startswith("agent_id:"):
|
|
133
|
+
out.append(line.replace("agent_id:", "threadId:", 1))
|
|
134
|
+
continue
|
|
135
|
+
if stripped.startswith("id:"):
|
|
136
|
+
out.append(line.replace("id:", "threadId:", 1))
|
|
137
|
+
continue
|
|
138
|
+
if stripped.startswith("message:"):
|
|
139
|
+
out.append(line.replace("message:", "prompt:", 1))
|
|
140
|
+
continue
|
|
141
|
+
out.append(line)
|
|
142
|
+
out.append("```")
|
|
143
|
+
return "\n".join(out)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def append_async_notes(text: str) -> str:
|
|
147
|
+
note = (
|
|
148
|
+
"After this start call, immediately save the returned `jobId` and poll "
|
|
149
|
+
"`mcp__claude-review__review_status` with a bounded `waitSeconds` until "
|
|
150
|
+
"`done=true`. Treat the completed status payload's `response` as the "
|
|
151
|
+
"reviewer output, and save the completed `threadId` for any follow-up round."
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
def repl(match: re.Match[str]) -> str:
|
|
155
|
+
block = match.group(0)
|
|
156
|
+
if note in block:
|
|
157
|
+
return block
|
|
158
|
+
return f"{block}\n\n{note}"
|
|
159
|
+
|
|
160
|
+
return re.sub(
|
|
161
|
+
r"```(?:yaml|text)?\n(?:mcp__claude-review__review_start:|mcp__claude-review__review_reply_start:)[\s\S]*?```",
|
|
162
|
+
repl,
|
|
163
|
+
text,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def transform_body(text: str) -> str:
|
|
168
|
+
text = re.sub(
|
|
169
|
+
r"> \*\*Codex assurance:\*\*[\s\S]*?(?=\n\n)",
|
|
170
|
+
"> **Claude overlay assurance:** this route is a different model family "
|
|
171
|
+
"from the Codex executor and records `review_independence: cross-family` "
|
|
172
|
+
"plus `acceptance_status: accepted`.",
|
|
173
|
+
text,
|
|
174
|
+
count=1,
|
|
175
|
+
)
|
|
176
|
+
# The acquittal receipt example is a literal the overlay would copy verbatim.
|
|
177
|
+
# This pack's backend is claude-review, so leaving the source's "codex" in it
|
|
178
|
+
# makes every overlay run write a false receipt.
|
|
179
|
+
text = text.replace('"backend":"codex","effort":"xhigh"', '"backend":"claude-review","effort":"high-rigor"')
|
|
180
|
+
text = text.replace('"backend": "codex", "effort": "xhigh"', '"backend": "claude-review", "effort": "high-rigor"')
|
|
181
|
+
text = text.replace('"backend":"codex"', '"backend":"claude-review"')
|
|
182
|
+
text = text.replace("secondary Codex agent", "Claude reviewer via `claude-review` MCP")
|
|
183
|
+
text = text.replace("via a Claude reviewer via `claude-review` MCP (xhigh reasoning)", "via `claude-review` MCP (high-rigor review)")
|
|
184
|
+
text = text.replace("secondary Codex agent (xhigh reasoning)", "Claude reviewer via `claude-review` MCP")
|
|
185
|
+
text = text.replace("GPT-5.6-Sol xhigh", "Claude review")
|
|
186
|
+
text = text.replace("GPT-5.6-Sol ultra", "Claude review")
|
|
187
|
+
text = text.replace("GPT-5.5 xhigh", "Claude review")
|
|
188
|
+
text = text.replace("Send the full paper text to GPT-5.5 xhigh:", "Send the full paper text to Claude through `claude-review`:")
|
|
189
|
+
text = text.replace("Send the complete outline to GPT-5.5 xhigh for feedback:", "Send the complete outline to Claude for feedback:")
|
|
190
|
+
text = text.replace("Call REVIEWER_MODEL via `spawn_agent` (`spawn_agent`) with xhigh reasoning:", "Call REVIEWER_MODEL via `mcp__claude-review__review_start` with high-rigor review:")
|
|
191
|
+
text = text.replace("Send a detailed prompt with xhigh reasoning:", "Send a detailed prompt with high-rigor review:")
|
|
192
|
+
text = text.replace("Use `send_input` with the returned agent id to continue the conversation:", "Use `mcp__claude-review__review_reply_start` with the saved completed `threadId`, then poll `mcp__claude-review__review_status` with the returned `jobId` until `done=true` to continue the conversation:")
|
|
193
|
+
text = text.replace("If this is round 2+, use `send_input` with the saved agent id to maintain continuity.", "If this is round 2+, use `mcp__claude-review__review_reply_start` with the saved completed `threadId`, then poll `mcp__claude-review__review_status` with the returned `jobId` until `done=true` to maintain continuity.")
|
|
194
|
+
text = text.replace("Save the agent id for Round 2.", "Save the returned `jobId`, poll `mcp__claude-review__review_status` until `done=true`, then save the completed `threadId` for Round 2.")
|
|
195
|
+
text = text.replace("Save agent id from first call, use `send_input` for subsequent rounds", "Save the completed `threadId` from the first `mcp__claude-review__review_status` result, then use `mcp__claude-review__review_reply_start` plus `mcp__claude-review__review_status` for subsequent rounds")
|
|
196
|
+
text = text.replace("Document the agent id for potential future resumption", "Document the completed `threadId` for potential future resumption")
|
|
197
|
+
text = text.replace("Use `send_input` with the saved agent id:", "Use `mcp__claude-review__review_reply_start` with the saved completed `threadId`:")
|
|
198
|
+
text = text.replace("use `send_input` for Round 2 to maintain conversation context", "use `mcp__claude-review__review_reply_start` plus `mcp__claude-review__review_status` for Round 2 to maintain conversation context")
|
|
199
|
+
text = text.replace("Save the agent id for Round 2.", "Save the completed `threadId` for Round 2.")
|
|
200
|
+
text = text.replace("**CRITICAL: Save the `agent_id`** from this call for all later rounds.", "**CRITICAL: Save the returned `jobId`**, poll `mcp__claude-review__review_status` until `done=true`, then save the completed `threadId` from the status result for all later rounds.")
|
|
201
|
+
text = text.replace("- **ALWAYS use `reasoning_effort: xhigh`** for all Codex review calls.", "- **Always ask the Claude reviewer for strict, high-rigor feedback** in every review round.")
|
|
202
|
+
text = text.replace("- ALWAYS use `model: gpt-5.6-sol` + `reasoning_effort: ultra` for reviews (deep-audit tier; capability fallback per `reviewer-routing.md`, never below `xhigh`)", "- **Always ask the Claude reviewer for strict, high-rigor feedback** in every review round.")
|
|
203
|
+
text = text.replace("- **Save `agent_id` from Phase 2** and use `send_input` for later rounds.", "- **Save the completed `threadId` from Phase 2** and use `mcp__claude-review__review_reply_start` plus `mcp__claude-review__review_status` for later rounds.")
|
|
204
|
+
text = text.replace("- **Use `send_input`** for Round 2 to maintain conversation context", "- **Use `mcp__claude-review__review_reply_start` plus `mcp__claude-review__review_status`** for Round 2 to maintain conversation context")
|
|
205
|
+
text = text.replace("GPT-5.5 responses", "Claude reviewer responses")
|
|
206
|
+
text = text.replace("same-family provisional review", "cross-family accepted Claude review")
|
|
207
|
+
text = text.replace("same-family provisional", "cross-family accepted")
|
|
208
|
+
text = text.replace("A fresh Codex positive review", "A fresh Claude positive review")
|
|
209
|
+
text = re.sub(
|
|
210
|
+
r"^- \*\*REVIEWER_BACKEND = `codex`\*\*.*$",
|
|
211
|
+
"- **REVIEWER_BACKEND = `claude-review`** — Cross-family Claude reviewer "
|
|
212
|
+
"through the local bridge; positive verdicts record accepted.",
|
|
213
|
+
text,
|
|
214
|
+
flags=re.MULTILINE,
|
|
215
|
+
)
|
|
216
|
+
text = text.replace("`agent_id`", "`thread_id`")
|
|
217
|
+
text = text.replace('"agent_id"', '"thread_id"')
|
|
218
|
+
text = text.replace("ALWAYS use `reasoning_effort: xhigh` for reviews", "Always ask the Claude reviewer for strict, high-rigor feedback.")
|
|
219
|
+
text = text.replace("ALWAYS use `reasoning_effort: xhigh` for maximum reasoning depth", "Always ask the Claude reviewer for strict, high-rigor feedback.")
|
|
220
|
+
text = text.replace("mcp__codex__codex-reply", "mcp__claude-review__review_reply_start")
|
|
221
|
+
text = text.replace("mcp__codex__codex", "mcp__claude-review__review_start")
|
|
222
|
+
text = re.sub(r"^-\s+\*{0,2}REVIEWER_MODEL.*$", REVIEWER_LINE, text, flags=re.MULTILINE)
|
|
223
|
+
text = re.sub(r"^-\s+\*{0,2}REVIEWER_BACKEND.*$",
|
|
224
|
+
"- **REVIEWER_BACKEND = `claude-review`** — reviews route through the claude-review MCP (Claude family; cross-family for a Codex executor).",
|
|
225
|
+
text, flags=re.MULTILINE)
|
|
226
|
+
text = text.replace("GPT-5.6-Sol", "Claude")
|
|
227
|
+
text = text.replace("gpt-5.6-sol", "the claude-review model")
|
|
228
|
+
text = text.replace("uses normal Codex xhigh review through", "uses a normal high-rigor Claude review through")
|
|
229
|
+
text = text.replace("Claude review Review (Round", "Claude Review (Round")
|
|
230
|
+
text = text.replace("Never pass a prior agent_id into", "Never pass a prior threadId into")
|
|
231
|
+
text = text.replace("store the returned agent_id for crash recovery only", "store the returned threadId for crash recovery only")
|
|
232
|
+
text = text.replace("Save the agent_id for Round 2.", "Save the completed threadId for Round 2.")
|
|
233
|
+
text = text.replace("Save the returned agent_id only for recovery bookkeeping.", "Save the returned threadId only for recovery bookkeeping.")
|
|
234
|
+
text = text.replace("via a Claude reviewer via `claude-review` MCP (ultra reasoning)", "via `claude-review` MCP (high-rigor review)")
|
|
235
|
+
text = text.replace("saved agent id", "saved threadId")
|
|
236
|
+
text = text.replace("— Codex Review", "— Claude Review")
|
|
237
|
+
# generic prose mop-up — AFTER all longer specific rows
|
|
238
|
+
text = text.replace("`spawn_agent`", "`mcp__claude-review__review_start`")
|
|
239
|
+
text = text.replace("`send_input`", "`mcp__claude-review__review_reply_start`")
|
|
240
|
+
text = re.sub(
|
|
241
|
+
r"## Prerequisites\n\n(?:- .*\n)+",
|
|
242
|
+
PREREQ_BLOCK + "\n\n",
|
|
243
|
+
text,
|
|
244
|
+
count=1,
|
|
245
|
+
)
|
|
246
|
+
text = SPAWN_BLOCK_RE.sub(rewrite_spawn_block, text)
|
|
247
|
+
text = SEND_BLOCK_RE.sub(rewrite_send_block, text)
|
|
248
|
+
text = text.replace(
|
|
249
|
+
"```\nreasoning_effort: xhigh\n```",
|
|
250
|
+
"```\nmcp__claude-review__review_start:\n prompt: |\n [Full novelty briefing + prior work list + specific novelty questions]\n```",
|
|
251
|
+
)
|
|
252
|
+
# New base-skill prose can mention Codex-native routes outside fenced tool
|
|
253
|
+
# examples. Normalize those residual references after rewriting the blocks so
|
|
254
|
+
# generated overlays never instruct users to mix Codex agents with Claude MCP.
|
|
255
|
+
text = text.replace("Codex xhigh review", "Claude high-rigor review")
|
|
256
|
+
text = text.replace("Codex Review", "Claude Review")
|
|
257
|
+
text = text.replace("Codex/GPT-5.5", "Claude reviewer")
|
|
258
|
+
text = text.replace("GPT-5.5", "the Claude reviewer")
|
|
259
|
+
text = text.replace("spawn_agent", "mcp__claude-review__review_start")
|
|
260
|
+
text = text.replace("send_input", "mcp__claude-review__review_reply_start")
|
|
261
|
+
text = text.replace("agent_id", "threadId")
|
|
262
|
+
text = text.replace("thread_id", "threadId")
|
|
263
|
+
text = text.replace("agent id", "completed threadId")
|
|
264
|
+
text = text.replace("agent ID", "completed threadId")
|
|
265
|
+
text = text.replace("same agent", "same completed threadId")
|
|
266
|
+
return append_async_notes(text)
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def generate_one(skill_name: str) -> None:
|
|
270
|
+
skill_path = SRC_ROOT / skill_name / "SKILL.md"
|
|
271
|
+
content = skill_path.read_text(encoding="utf-8")
|
|
272
|
+
match = FRONTMATTER_RE.match(content)
|
|
273
|
+
if not match:
|
|
274
|
+
raise ValueError(f"Missing frontmatter: {skill_path}")
|
|
275
|
+
|
|
276
|
+
frontmatter = match.group(1)
|
|
277
|
+
body = content[match.end():].lstrip("\n")
|
|
278
|
+
name = extract_field(frontmatter, "name") or skill_name
|
|
279
|
+
description = normalize_description(extract_field(frontmatter, "description"))
|
|
280
|
+
|
|
281
|
+
output = build_frontmatter(name, description)
|
|
282
|
+
output += OVERRIDE_NOTE + "\n\n"
|
|
283
|
+
output += transform_body(body).rstrip() + "\n"
|
|
284
|
+
|
|
285
|
+
target_dir = DEST_ROOT / skill_name
|
|
286
|
+
if target_dir.exists():
|
|
287
|
+
shutil.rmtree(target_dir)
|
|
288
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
289
|
+
(target_dir / "SKILL.md").write_text(output, encoding="utf-8")
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def main() -> None:
|
|
293
|
+
DEST_ROOT.mkdir(parents=True, exist_ok=True)
|
|
294
|
+
for skill_name in TARGET_SKILLS:
|
|
295
|
+
generate_one(skill_name)
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
if __name__ == "__main__":
|
|
299
|
+
main()
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Deterministically gate Idea Discovery reports on recorded stage evidence."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import re
|
|
8
|
+
import sys
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
try:
|
|
13
|
+
import run_state
|
|
14
|
+
except ImportError: # package import: ``from tools import idea_discovery_gate``
|
|
15
|
+
from tools import run_state
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
GATE_NAME = "idea-discovery-evidence"
|
|
19
|
+
REQUIRED_PHASES = (
|
|
20
|
+
"research-lit",
|
|
21
|
+
"idea-creator",
|
|
22
|
+
"novelty-check",
|
|
23
|
+
"research-review",
|
|
24
|
+
"research-refine-pipeline",
|
|
25
|
+
)
|
|
26
|
+
# These phases promise a model review, not merely executor-produced prose. A
|
|
27
|
+
# heading and a ``done`` self-report therefore cannot satisfy their evidence
|
|
28
|
+
# obligation: the run state must contain the receipt written by ``accept`` or
|
|
29
|
+
# ``mark-provisional``.
|
|
30
|
+
REVIEW_REQUIRED_PHASES = frozenset({"novelty-check", "research-review"})
|
|
31
|
+
START_MARKER = "<!-- ARIS_IDEA_DISCOVERY_EVIDENCE_GATE:START -->"
|
|
32
|
+
END_MARKER = "<!-- ARIS_IDEA_DISCOVERY_EVIDENCE_GATE:END -->"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass(frozen=True)
|
|
36
|
+
class GateResult:
|
|
37
|
+
verdict: str
|
|
38
|
+
reasons: tuple[str, ...]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _artifact_target(root: Path, artifact: str) -> tuple[Path, str | None]:
|
|
42
|
+
path_text, separator, anchor = artifact.partition("#")
|
|
43
|
+
if not path_text:
|
|
44
|
+
raise ValueError("artifact path is empty")
|
|
45
|
+
if separator and not anchor.strip():
|
|
46
|
+
raise ValueError(f"artifact anchor is empty: {artifact}")
|
|
47
|
+
candidate = (root / path_text).resolve()
|
|
48
|
+
try:
|
|
49
|
+
candidate.relative_to(root.resolve())
|
|
50
|
+
except ValueError as exc:
|
|
51
|
+
raise ValueError(f"artifact escapes project root: {artifact}") from exc
|
|
52
|
+
return candidate, anchor if separator else None
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _heading_slug(line: str) -> str | None:
|
|
56
|
+
match = re.match(r"^#{1,6}\s+(.+?)\s*#*\s*$", line)
|
|
57
|
+
if not match:
|
|
58
|
+
return None
|
|
59
|
+
text = match.group(1).strip().lower()
|
|
60
|
+
slug = re.sub(r"[^\w\s-]", "", text, flags=re.UNICODE)
|
|
61
|
+
return re.sub(r"[\s-]+", "-", slug).strip("-")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _section_has_content(path: Path, anchor: str) -> tuple[bool, bool]:
|
|
65
|
+
"""Return whether the first matching section exists and has a non-empty body."""
|
|
66
|
+
found = False
|
|
67
|
+
for line in path.read_text(encoding="utf-8").splitlines():
|
|
68
|
+
heading = _heading_slug(line)
|
|
69
|
+
if not found:
|
|
70
|
+
if heading == anchor:
|
|
71
|
+
found = True
|
|
72
|
+
continue
|
|
73
|
+
if heading is not None:
|
|
74
|
+
return True, False
|
|
75
|
+
if line.strip():
|
|
76
|
+
return True, True
|
|
77
|
+
return found, False
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _review_provenance_reason(name: str, phase: dict, state: dict) -> str | None:
|
|
81
|
+
"""Validate a reviewer receipt without granting or repairing acceptance."""
|
|
82
|
+
status = phase.get("status")
|
|
83
|
+
if status not in {"accepted", "provisional"}:
|
|
84
|
+
return f"{name} review evidence missing (status={status or 'unknown'})"
|
|
85
|
+
|
|
86
|
+
verdict_id = phase.get("verdict_id")
|
|
87
|
+
reviewer = phase.get("reviewer")
|
|
88
|
+
if not isinstance(verdict_id, str) or not verdict_id.strip():
|
|
89
|
+
return f"{name} review evidence missing (verdict_id not recorded)"
|
|
90
|
+
if not isinstance(reviewer, str) or not reviewer.strip():
|
|
91
|
+
return f"{name} review evidence missing (reviewer not recorded)"
|
|
92
|
+
|
|
93
|
+
executor = phase.get("executor_model")
|
|
94
|
+
if not isinstance(executor, str) or not executor.strip():
|
|
95
|
+
return f"{name} review provenance invalid (executor_model not recorded)"
|
|
96
|
+
|
|
97
|
+
executor_family = run_state.model_family(executor)
|
|
98
|
+
reviewer_family = run_state.model_family(reviewer)
|
|
99
|
+
if executor_family == "unknown" or reviewer_family in {"unknown", "deterministic"}:
|
|
100
|
+
return (
|
|
101
|
+
f"{name} review provenance invalid (model families cannot establish "
|
|
102
|
+
"a model review)"
|
|
103
|
+
)
|
|
104
|
+
if phase.get("executor_family") != executor_family:
|
|
105
|
+
return f"{name} review provenance invalid (executor_family inconsistent)"
|
|
106
|
+
if phase.get("reviewer_family") != reviewer_family:
|
|
107
|
+
return f"{name} review provenance invalid (reviewer_family inconsistent)"
|
|
108
|
+
|
|
109
|
+
if status == "accepted":
|
|
110
|
+
if phase.get("acceptance_status") != "accepted":
|
|
111
|
+
return f"{name} review provenance invalid (acceptance_status inconsistent)"
|
|
112
|
+
if executor_family == reviewer_family:
|
|
113
|
+
return f"{name} review provenance invalid (accepted review is same-family)"
|
|
114
|
+
if phase.get("review_independence") != "cross-family":
|
|
115
|
+
return f"{name} review provenance invalid (review_independence inconsistent)"
|
|
116
|
+
return None
|
|
117
|
+
|
|
118
|
+
if phase.get("acceptance_status") != "provisional":
|
|
119
|
+
return f"{name} review provenance invalid (acceptance_status inconsistent)"
|
|
120
|
+
if executor_family != reviewer_family:
|
|
121
|
+
return f"{name} review provenance invalid (provisional review is not same-family)"
|
|
122
|
+
if phase.get("review_independence") != "same-family":
|
|
123
|
+
return f"{name} review provenance invalid (review_independence inconsistent)"
|
|
124
|
+
policy = state.get("policy")
|
|
125
|
+
if not isinstance(policy, dict) or policy.get("provisional_advances") is not True:
|
|
126
|
+
return (
|
|
127
|
+
f"{name} review provenance invalid "
|
|
128
|
+
"(provisional review cannot advance this run)"
|
|
129
|
+
)
|
|
130
|
+
return None
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def evaluate(root: str | Path, state: dict) -> GateResult:
|
|
134
|
+
"""Check that every required stage has completed, durable evidence."""
|
|
135
|
+
project_root = Path(root).resolve()
|
|
136
|
+
phases = {phase["phase"]: phase for phase in state.get("phases", [])}
|
|
137
|
+
reasons: list[str] = []
|
|
138
|
+
|
|
139
|
+
for name in REQUIRED_PHASES:
|
|
140
|
+
phase = phases.get(name)
|
|
141
|
+
if phase is None:
|
|
142
|
+
reasons.append(f"{name} evidence missing (phase not recorded)")
|
|
143
|
+
continue
|
|
144
|
+
if phase.get("status") not in {"done", "accepted", "provisional"}:
|
|
145
|
+
reasons.append(
|
|
146
|
+
f"{name} evidence missing (status={phase.get('status', 'unknown')})"
|
|
147
|
+
)
|
|
148
|
+
continue
|
|
149
|
+
if name in REVIEW_REQUIRED_PHASES:
|
|
150
|
+
provenance_reason = _review_provenance_reason(name, phase, state)
|
|
151
|
+
if provenance_reason is not None:
|
|
152
|
+
reasons.append(provenance_reason)
|
|
153
|
+
continue
|
|
154
|
+
artifact = phase.get("artifact")
|
|
155
|
+
if not artifact:
|
|
156
|
+
reasons.append(f"{name} evidence missing (artifact not recorded)")
|
|
157
|
+
continue
|
|
158
|
+
try:
|
|
159
|
+
artifact_path, anchor = _artifact_target(project_root, artifact)
|
|
160
|
+
except ValueError as exc:
|
|
161
|
+
reasons.append(f"{name} evidence missing ({exc})")
|
|
162
|
+
continue
|
|
163
|
+
if not artifact_path.is_file():
|
|
164
|
+
reasons.append(f"{name} evidence missing (artifact absent: {artifact})")
|
|
165
|
+
continue
|
|
166
|
+
if anchor:
|
|
167
|
+
section_exists, section_has_content = _section_has_content(
|
|
168
|
+
artifact_path, anchor
|
|
169
|
+
)
|
|
170
|
+
if not section_exists:
|
|
171
|
+
reasons.append(f"{name} evidence missing (section absent: #{anchor})")
|
|
172
|
+
elif not section_has_content:
|
|
173
|
+
reasons.append(f"{name} evidence missing (section empty: #{anchor})")
|
|
174
|
+
|
|
175
|
+
return GateResult("PASS" if not reasons else "BLOCKED", tuple(reasons))
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def _gate_section(result: GateResult) -> str:
|
|
179
|
+
lines = [START_MARKER, "## Evidence Gate", f"**Status:** {result.verdict}", ""]
|
|
180
|
+
if result.verdict == "PASS":
|
|
181
|
+
lines.append(
|
|
182
|
+
"All required stage records, review receipts, artifacts, and report "
|
|
183
|
+
"sections are present."
|
|
184
|
+
)
|
|
185
|
+
else:
|
|
186
|
+
lines.append("The workflow is not complete. Required stage evidence is missing:")
|
|
187
|
+
lines.extend(f"- BLOCKED: {reason}" for reason in result.reasons)
|
|
188
|
+
lines.extend([END_MARKER, ""])
|
|
189
|
+
return "\n".join(lines)
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def write_report_gate(root: str | Path, report: str | Path, result: GateResult) -> Path:
|
|
193
|
+
project_root = Path(root).resolve()
|
|
194
|
+
report_path = (project_root / report).resolve()
|
|
195
|
+
try:
|
|
196
|
+
report_path.relative_to(project_root)
|
|
197
|
+
except ValueError as exc:
|
|
198
|
+
raise ValueError(f"report escapes project root: {report}") from exc
|
|
199
|
+
|
|
200
|
+
report_path.parent.mkdir(parents=True, exist_ok=True)
|
|
201
|
+
original = report_path.read_text(encoding="utf-8") if report_path.exists() else "# Idea Discovery Report\n"
|
|
202
|
+
section = _gate_section(result)
|
|
203
|
+
pattern = re.compile(
|
|
204
|
+
rf"{re.escape(START_MARKER)}.*?{re.escape(END_MARKER)}\n?",
|
|
205
|
+
flags=re.DOTALL,
|
|
206
|
+
)
|
|
207
|
+
if pattern.search(original):
|
|
208
|
+
updated = pattern.sub(section, original)
|
|
209
|
+
else:
|
|
210
|
+
updated = original.rstrip() + "\n\n" + section
|
|
211
|
+
report_path.write_text(updated, encoding="utf-8")
|
|
212
|
+
return report_path
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def run(root: str | Path, run_id: str, report: str | Path) -> GateResult:
|
|
216
|
+
try:
|
|
217
|
+
state = run_state.load_run(str(root), run_id)
|
|
218
|
+
except FileNotFoundError:
|
|
219
|
+
result = GateResult("BLOCKED", ("run state missing",))
|
|
220
|
+
write_report_gate(root, report, result)
|
|
221
|
+
return result
|
|
222
|
+
|
|
223
|
+
result = evaluate(root, state)
|
|
224
|
+
# The gate's verdict lives ONLY in gates.<GATE_NAME>. It must not mark the
|
|
225
|
+
# semantic phases `accepted`: per resumable-runs.md, file-exists evidence
|
|
226
|
+
# can accept a purely mechanical phase, while these five stages carry
|
|
227
|
+
# quality semantics whose acceptance/provisional receipt belongs to their
|
|
228
|
+
# own reviewer gate — and resume relies on done-but-not-reviewed to know a
|
|
229
|
+
# stage still needs its audit.
|
|
230
|
+
run_state.record_gate_result(str(root), run_id, GATE_NAME, result.verdict, list(result.reasons))
|
|
231
|
+
write_report_gate(root, report, result)
|
|
232
|
+
return result
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def main() -> int:
|
|
236
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
237
|
+
parser.add_argument("root")
|
|
238
|
+
parser.add_argument("run_id")
|
|
239
|
+
parser.add_argument("--report", default="idea-stage/IDEA_REPORT.md")
|
|
240
|
+
args = parser.parse_args()
|
|
241
|
+
|
|
242
|
+
try:
|
|
243
|
+
result = run(args.root, args.run_id, args.report)
|
|
244
|
+
except ValueError as exc:
|
|
245
|
+
print(f"ERROR: {exc}", file=sys.stderr)
|
|
246
|
+
return 2
|
|
247
|
+
for reason in result.reasons:
|
|
248
|
+
print(f"BLOCKED: {reason}")
|
|
249
|
+
if result.verdict == "PASS":
|
|
250
|
+
print("PASS: idea-discovery evidence gate")
|
|
251
|
+
return 0
|
|
252
|
+
return 1
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
if __name__ == "__main__":
|
|
256
|
+
raise SystemExit(main())
|