dsh-aris-panel 0.2.7 → 0.3.1
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/README.md +117 -108
- package/README_CN.md +98 -89
- package/aris/.claude-plugin/marketplace.json +34 -0
- package/aris/.claude-plugin/plugin.json +19 -0
- package/aris/.codex-plugin/plugin.json +18 -0
- package/aris/.env.example +53 -0
- package/aris/.gitattributes +6 -0
- package/aris/.github/agents/aris-reviewer-claude.agent.md +10 -0
- package/aris/.github/agents/aris-reviewer-openai.agent.md +10 -0
- package/aris/.github/workflows/check-skills-inventory.yml +32 -0
- package/aris/.github/workflows/lint-skills-helpers.yml +38 -0
- package/aris/.github/workflows/test-install-aris-ps1.yml +31 -0
- package/aris/.github/workflows/test-suite.yml +59 -0
- package/aris/AGENT_GUIDE.md +222 -0
- package/aris/CONTRIBUTING.md +83 -0
- package/aris/CONTRIBUTING_CN.md +83 -0
- package/aris/LICENSE +21 -0
- package/aris/README.md +1739 -0
- package/aris/README_CN.md +1526 -0
- package/aris/SETUP_GUIDE.md +279 -0
- package/aris/SETUP_GUIDE_CN.md +279 -0
- package/aris/UPSTREAM.txt +2 -0
- package/aris/aris-monitor/README.md +158 -0
- package/aris/aris-monitor/assets/screenshot.png +0 -0
- package/aris/aris-monitor/focus-tty.sh +156 -0
- package/aris/aris-monitor/focus.py +93 -0
- package/aris/aris-monitor/run.sh +49 -0
- package/aris/aris-monitor/scanner.py +445 -0
- package/aris/aris-monitor/ticker.py +81 -0
- package/aris/aris-monitor/widget.py +372 -0
- package/aris/assets/claude-fleet-preview.png +0 -0
- package/aris/assets/community_showcase_7_10_codex.png +0 -0
- package/aris/assets/community_showcase_8_10.png +0 -0
- package/aris/assets/feishu_interactive.jpg +0 -0
- package/aris/assets/feishu_push.png +0 -0
- package/aris/assets/paper_illustration_demo.png +0 -0
- package/aris/commands/setup.md +77 -0
- package/aris/community_papers/UAV-CC.pdf +0 -0
- package/aris/docs/ALI_CODING_PLAN_GUIDE.md +324 -0
- package/aris/docs/ANTIGRAVITY_ADAPTATION.md +409 -0
- package/aris/docs/ANTIGRAVITY_ADAPTATION_CN.md +363 -0
- package/aris/docs/ARIS-Code-README_CN.md +8 -0
- package/aris/docs/ARIS-Code-README_EN.md +8 -0
- package/aris/docs/ARIS_INTRO.html +902 -0
- package/aris/docs/ARIS_INTRO.md +368 -0
- package/aris/docs/ARIS_INTRO.review.json +79 -0
- package/aris/docs/CODEX_CLAUDE_REVIEW_GUIDE.md +116 -0
- package/aris/docs/CODEX_CLAUDE_REVIEW_GUIDE_CN.md +116 -0
- package/aris/docs/CODEX_GEMINI_REVIEW_GUIDE.md +249 -0
- package/aris/docs/CODEX_GEMINI_REVIEW_GUIDE_CN.md +250 -0
- package/aris/docs/COPILOT_CLI_ADAPTATION.md +388 -0
- package/aris/docs/CURSOR_ADAPTATION.md +305 -0
- package/aris/docs/CUSTOMIZATION.md +155 -0
- package/aris/docs/CUSTOMIZATION_CN.md +154 -0
- package/aris/docs/GPU_SETUP.md +57 -0
- package/aris/docs/GPU_SETUP_CN.md +54 -0
- package/aris/docs/LLM_API_MIX_MATCH_GUIDE.md +256 -0
- package/aris/docs/MANUAL_REVIEW_GUIDE.md +128 -0
- package/aris/docs/MANUAL_REVIEW_GUIDE_CN.md +116 -0
- package/aris/docs/MINIMAX_MCP_GUIDE.md +198 -0
- package/aris/docs/MODELSCOPE_GUIDE.md +305 -0
- package/aris/docs/MODEL_COMBINATIONS.md +134 -0
- package/aris/docs/MODEL_COMBINATIONS_CN.md +134 -0
- package/aris/docs/MiniMax-GLM-Configuration.md +195 -0
- package/aris/docs/NARRATIVE_REPORT_EXAMPLE.md +143 -0
- package/aris/docs/OPENCLAW_ADAPTATION.md +59 -0
- package/aris/docs/OPENROUTER_GUIDE.md +255 -0
- package/aris/docs/OPENROUTER_GUIDE_CN.md +255 -0
- package/aris/docs/PROJECT_FILES_GUIDE.md +161 -0
- package/aris/docs/PROJECT_FILES_GUIDE_CN.md +161 -0
- package/aris/docs/RESUBMIT_AND_TALK.md +91 -0
- package/aris/docs/RESUBMIT_AND_TALK_CN.md +91 -0
- package/aris/docs/SESSION_RECOVERY_GUIDE.md +439 -0
- package/aris/docs/SESSION_RECOVERY_GUIDE_CN.md +431 -0
- package/aris/docs/SKILLS_CATALOG.md +204 -0
- package/aris/docs/TRAE_ARIS_RUNBOOK_CN.md +329 -0
- package/aris/docs/TRAE_ARIS_RUNBOOK_EN.md +329 -0
- package/aris/docs/WATCHDOG_GUIDE.md +200 -0
- package/aris/docs/WATCHDOG_GUIDE_CN.md +199 -0
- package/aris/docs/aris-code-banner.png +0 -0
- package/aris/docs/aris-code-screenshot.png +0 -0
- package/aris/docs/aris-movie-director-method.png +0 -0
- package/aris/docs/aris_intro_slides.pdf +0 -0
- package/aris/docs/aris_logo.svg +126 -0
- package/aris/docs/auto_review_score_curve.png +0 -0
- package/aris/docs/blogs/continuous_dlm_2026h1_survey.html +3262 -0
- package/aris/docs/hero_combined.svg +844 -0
- package/aris/docs/hero_idea.svg +158 -0
- package/aris/docs/hero_implement.svg +109 -0
- package/aris/docs/hero_interaction.svg +172 -0
- package/aris/docs/hf_daily_paper_1.svg +19 -0
- package/aris/docs/integrations/FEISHU.md +208 -0
- package/aris/docs/integrations/FEISHU_CN.md +208 -0
- package/aris/docs/integrations/OBSIDIAN.md +65 -0
- package/aris/docs/integrations/OBSIDIAN_CN.md +65 -0
- package/aris/docs/integrations/VAST_GPU_GUIDE.md +96 -0
- package/aris/docs/integrations/VAST_GPU_GUIDE_CN.md +96 -0
- package/aris/docs/integrations/ZOTERO.md +57 -0
- package/aris/docs/integrations/ZOTERO_CN.md +57 -0
- package/aris/docs/tutorials/3d_generation_tutorial.html +1018 -0
- package/aris/docs/tutorials/3d_generation_tutorial.md +1206 -0
- package/aris/docs/tutorials/3d_generation_tutorial.review.json +34 -0
- package/aris/docs/tutorials/3d_generation_tutorial_en.html +1018 -0
- package/aris/docs/tutorials/3d_generation_tutorial_en.md +1206 -0
- package/aris/docs/tutorials/README.md +77 -0
- package/aris/docs/tutorials/agent_foundations_tutorial.html +1081 -0
- package/aris/docs/tutorials/agent_foundations_tutorial.md +1229 -0
- package/aris/docs/tutorials/agent_foundations_tutorial.review.json +146 -0
- package/aris/docs/tutorials/agent_foundations_tutorial_en.html +1081 -0
- package/aris/docs/tutorials/agent_foundations_tutorial_en.md +1229 -0
- package/aris/docs/tutorials/agentic_rl_tutorial.html +1269 -0
- package/aris/docs/tutorials/agentic_rl_tutorial.md +1544 -0
- package/aris/docs/tutorials/agentic_rl_tutorial.review.json +74 -0
- package/aris/docs/tutorials/agentic_rl_tutorial_en.html +1269 -0
- package/aris/docs/tutorials/agentic_rl_tutorial_en.md +1544 -0
- package/aris/docs/tutorials/attention_tutorial.html +774 -0
- package/aris/docs/tutorials/attention_tutorial.md +812 -0
- package/aris/docs/tutorials/attention_tutorial.review.json +51 -0
- package/aris/docs/tutorials/attention_tutorial_en.html +774 -0
- package/aris/docs/tutorials/attention_tutorial_en.md +812 -0
- package/aris/docs/tutorials/diffusion_distillation_tutorial.html +1421 -0
- package/aris/docs/tutorials/diffusion_distillation_tutorial.md +1672 -0
- package/aris/docs/tutorials/diffusion_distillation_tutorial.review.json +114 -0
- package/aris/docs/tutorials/diffusion_distillation_tutorial_en.html +1421 -0
- package/aris/docs/tutorials/diffusion_distillation_tutorial_en.md +1672 -0
- package/aris/docs/tutorials/diffusion_foundations_tutorial.html +1239 -0
- package/aris/docs/tutorials/diffusion_foundations_tutorial.md +1481 -0
- package/aris/docs/tutorials/diffusion_foundations_tutorial.review.json +56 -0
- package/aris/docs/tutorials/diffusion_foundations_tutorial_en.html +1239 -0
- package/aris/docs/tutorials/diffusion_foundations_tutorial_en.md +1481 -0
- package/aris/docs/tutorials/diffusion_post_training_tutorial.html +1135 -0
- package/aris/docs/tutorials/diffusion_post_training_tutorial.md +1322 -0
- package/aris/docs/tutorials/diffusion_post_training_tutorial.review.json +63 -0
- package/aris/docs/tutorials/diffusion_post_training_tutorial_en.html +1138 -0
- package/aris/docs/tutorials/diffusion_post_training_tutorial_en.md +1325 -0
- package/aris/docs/tutorials/distributed_training_tutorial.html +1429 -0
- package/aris/docs/tutorials/distributed_training_tutorial.md +1587 -0
- package/aris/docs/tutorials/distributed_training_tutorial.review.json +98 -0
- package/aris/docs/tutorials/distributed_training_tutorial_en.html +1429 -0
- package/aris/docs/tutorials/distributed_training_tutorial_en.md +1587 -0
- package/aris/docs/tutorials/flow_matching_tutorial.html +755 -0
- package/aris/docs/tutorials/flow_matching_tutorial.md +537 -0
- package/aris/docs/tutorials/flow_matching_tutorial.review.json +37 -0
- package/aris/docs/tutorials/flow_matching_tutorial_en.html +755 -0
- package/aris/docs/tutorials/flow_matching_tutorial_en.md +537 -0
- package/aris/docs/tutorials/image_generation_systems_tutorial.html +1181 -0
- package/aris/docs/tutorials/image_generation_systems_tutorial.md +1448 -0
- package/aris/docs/tutorials/image_generation_systems_tutorial.review.json +49 -0
- package/aris/docs/tutorials/image_generation_systems_tutorial_en.html +1181 -0
- package/aris/docs/tutorials/image_generation_systems_tutorial_en.md +1448 -0
- package/aris/docs/tutorials/kl_divergence_rlhf_tutorial.html +1210 -0
- package/aris/docs/tutorials/kl_divergence_rlhf_tutorial.md +1502 -0
- package/aris/docs/tutorials/kl_divergence_rlhf_tutorial.review.json +55 -0
- package/aris/docs/tutorials/kl_divergence_rlhf_tutorial_en.html +1212 -0
- package/aris/docs/tutorials/kl_divergence_rlhf_tutorial_en.md +1504 -0
- package/aris/docs/tutorials/kv_cache_speculative_decoding_tutorial.html +1118 -0
- package/aris/docs/tutorials/kv_cache_speculative_decoding_tutorial.md +1258 -0
- package/aris/docs/tutorials/kv_cache_speculative_decoding_tutorial.review.json +91 -0
- package/aris/docs/tutorials/kv_cache_speculative_decoding_tutorial_en.html +1118 -0
- package/aris/docs/tutorials/kv_cache_speculative_decoding_tutorial_en.md +1258 -0
- package/aris/docs/tutorials/llm_opd_tutorial.html +1109 -0
- package/aris/docs/tutorials/llm_opd_tutorial.md +1195 -0
- package/aris/docs/tutorials/llm_opd_tutorial.review.json +125 -0
- package/aris/docs/tutorials/llm_opd_tutorial_en.html +1112 -0
- package/aris/docs/tutorials/llm_opd_tutorial_en.md +1198 -0
- package/aris/docs/tutorials/long_context_rope_yarn_mla_tutorial.html +1130 -0
- package/aris/docs/tutorials/long_context_rope_yarn_mla_tutorial.md +1209 -0
- package/aris/docs/tutorials/long_context_rope_yarn_mla_tutorial.review.json +79 -0
- package/aris/docs/tutorials/long_context_rope_yarn_mla_tutorial_en.html +1132 -0
- package/aris/docs/tutorials/long_context_rope_yarn_mla_tutorial_en.md +1211 -0
- package/aris/docs/tutorials/moe_tutorial.html +968 -0
- package/aris/docs/tutorials/moe_tutorial.md +1031 -0
- package/aris/docs/tutorials/moe_tutorial.review.json +54 -0
- package/aris/docs/tutorials/moe_tutorial_en.html +968 -0
- package/aris/docs/tutorials/moe_tutorial_en.md +1031 -0
- package/aris/docs/tutorials/multi_agent_long_horizon_tutorial.html +1409 -0
- package/aris/docs/tutorials/multi_agent_long_horizon_tutorial.md +1803 -0
- package/aris/docs/tutorials/multi_agent_long_horizon_tutorial.review.json +62 -0
- package/aris/docs/tutorials/multi_agent_long_horizon_tutorial_en.html +1413 -0
- package/aris/docs/tutorials/multi_agent_long_horizon_tutorial_en.md +1807 -0
- package/aris/docs/tutorials/quantization_tutorial.html +1117 -0
- package/aris/docs/tutorials/quantization_tutorial.md +1344 -0
- package/aris/docs/tutorials/quantization_tutorial.review.json +56 -0
- package/aris/docs/tutorials/quantization_tutorial_en.html +1117 -0
- package/aris/docs/tutorials/quantization_tutorial_en.md +1344 -0
- package/aris/docs/tutorials/reasoning_models_tutorial.html +1085 -0
- package/aris/docs/tutorials/reasoning_models_tutorial.md +1285 -0
- package/aris/docs/tutorials/reasoning_models_tutorial.review.json +66 -0
- package/aris/docs/tutorials/reasoning_models_tutorial_en.html +1085 -0
- package/aris/docs/tutorials/reasoning_models_tutorial_en.md +1285 -0
- package/aris/docs/tutorials/rlhf_dpo_grpo_ppo_tutorial.html +1015 -0
- package/aris/docs/tutorials/rlhf_dpo_grpo_ppo_tutorial.md +1125 -0
- package/aris/docs/tutorials/rlhf_dpo_grpo_ppo_tutorial.review.json +69 -0
- package/aris/docs/tutorials/rlhf_dpo_grpo_ppo_tutorial_en.html +1014 -0
- package/aris/docs/tutorials/rlhf_dpo_grpo_ppo_tutorial_en.md +1123 -0
- package/aris/docs/tutorials/self_evolving_agents_tutorial.html +1354 -0
- package/aris/docs/tutorials/self_evolving_agents_tutorial.md +1554 -0
- package/aris/docs/tutorials/self_evolving_agents_tutorial.review.json +64 -0
- package/aris/docs/tutorials/self_evolving_agents_tutorial_en.html +1356 -0
- package/aris/docs/tutorials/self_evolving_agents_tutorial_en.md +1556 -0
- package/aris/docs/tutorials/vae_vqvae_vqgan_tutorial.html +1197 -0
- package/aris/docs/tutorials/vae_vqvae_vqgan_tutorial.md +1419 -0
- package/aris/docs/tutorials/vae_vqvae_vqgan_tutorial.review.json +67 -0
- package/aris/docs/tutorials/vae_vqvae_vqgan_tutorial_en.html +1196 -0
- package/aris/docs/tutorials/vae_vqvae_vqgan_tutorial_en.md +1419 -0
- package/aris/docs/tutorials/video_generation_tutorial.html +1169 -0
- package/aris/docs/tutorials/video_generation_tutorial.md +1189 -0
- package/aris/docs/tutorials/video_generation_tutorial.review.json +72 -0
- package/aris/docs/tutorials/video_generation_tutorial_en.html +1170 -0
- package/aris/docs/tutorials/video_generation_tutorial_en.md +1190 -0
- package/aris/docs/tutorials/vlm_multimodal_tutorial.html +1208 -0
- package/aris/docs/tutorials/vlm_multimodal_tutorial.md +1446 -0
- package/aris/docs/tutorials/vlm_multimodal_tutorial.review.json +67 -0
- package/aris/docs/tutorials/vlm_multimodal_tutorial_en.html +1208 -0
- package/aris/docs/tutorials/vlm_multimodal_tutorial_en.md +1446 -0
- package/aris/docs/wechat_group.jpg +0 -0
- package/aris/mcp-servers/claude-review/README.md +96 -0
- package/aris/mcp-servers/claude-review/run_with_claude_aws.sh +49 -0
- package/aris/mcp-servers/claude-review/server.py +718 -0
- package/aris/mcp-servers/codex-exec/README.md +57 -0
- package/aris/mcp-servers/codex-exec/server.py +480 -0
- package/aris/mcp-servers/codex-image2/README.md +65 -0
- package/aris/mcp-servers/codex-image2/server.py +893 -0
- package/aris/mcp-servers/feishu-bridge/requirements.txt +1 -0
- package/aris/mcp-servers/feishu-bridge/server.py +240 -0
- package/aris/mcp-servers/gemini-review/README.md +171 -0
- package/aris/mcp-servers/gemini-review/server.py +1856 -0
- package/aris/mcp-servers/llm-chat/requirements.txt +1 -0
- package/aris/mcp-servers/llm-chat/server.py +664 -0
- package/aris/mcp-servers/manual-review/README.md +133 -0
- package/aris/mcp-servers/manual-review/server.py +910 -0
- package/aris/mcp-servers/manual-review/ui.html +279 -0
- package/aris/mcp-servers/minimax-chat/requirements.txt +1 -0
- package/aris/mcp-servers/minimax-chat/server.py +381 -0
- package/aris/skills/ablation-planner/SKILL.md +123 -0
- package/aris/skills/alphaxiv/SKILL.md +196 -0
- package/aris/skills/analyze-results/SKILL.md +46 -0
- package/aris/skills/arxiv/SKILL.md +248 -0
- package/aris/skills/auto-paper-improvement-loop/SKILL.md +695 -0
- package/aris/skills/auto-review-loop/SKILL.md +1137 -0
- package/aris/skills/auto-review-loop-llm/SKILL.md +259 -0
- package/aris/skills/auto-review-loop-minimax/SKILL.md +302 -0
- package/{skills/citation-audit-claude → aris/skills/citation-audit}/SKILL.md +11 -21
- package/aris/skills/claims-drafting/SKILL.md +227 -0
- package/aris/skills/comm-lit-review/SKILL.md +297 -0
- package/aris/skills/deepxiv/SKILL.md +263 -0
- package/aris/skills/dse-loop/SKILL.md +296 -0
- package/aris/skills/embodiment-description/SKILL.md +129 -0
- package/aris/skills/exa-search/SKILL.md +205 -0
- package/{skills/experiment-audit-claude → aris/skills/experiment-audit}/SKILL.md +16 -26
- package/aris/skills/experiment-bridge/SKILL.md +376 -0
- package/aris/skills/experiment-plan/SKILL.md +249 -0
- package/aris/skills/experiment-queue/SKILL.md +431 -0
- package/aris/skills/experiment-queue/scripts/build_manifest.py +142 -0
- package/aris/skills/experiment-queue/scripts/queue_manager.py +433 -0
- package/aris/skills/feishu-notify/SKILL.md +156 -0
- package/aris/skills/figure-description/SKILL.md +138 -0
- package/aris/skills/figure-spec/SKILL.md +262 -0
- package/aris/skills/figure-spec/scripts/figure_renderer.py +799 -0
- package/aris/skills/formula-derivation/SKILL.md +280 -0
- package/aris/skills/gemini-search/SKILL.md +231 -0
- package/aris/skills/grant-proposal/SKILL.md +698 -0
- package/aris/skills/idea-creator/SKILL.md +584 -0
- package/aris/skills/idea-discovery/SKILL.md +527 -0
- package/aris/skills/idea-discovery-robot/SKILL.md +363 -0
- package/aris/skills/integrity-forensics/SKILL.md +284 -0
- package/aris/skills/interview-cheatsheet/SKILL.md +245 -0
- package/aris/skills/invention-structuring/SKILL.md +188 -0
- package/aris/skills/jurisdiction-format/SKILL.md +192 -0
- package/aris/skills/kill-argument/SKILL.md +437 -0
- package/aris/skills/mermaid-diagram/SKILL.md +419 -0
- package/{skills/meta-apply-claude → aris/skills/meta-apply}/SKILL.md +5 -15
- package/aris/skills/meta-optimize/SKILL.md +437 -0
- package/aris/skills/monitor-experiment/SKILL.md +140 -0
- package/aris/skills/novelty-check/SKILL.md +142 -0
- package/aris/skills/openalex/SKILL.md +237 -0
- package/aris/skills/overleaf-sync/SKILL.md +220 -0
- package/{skills/paper-claim-audit-claude → aris/skills/paper-claim-audit}/SKILL.md +13 -23
- package/aris/skills/paper-compile/SKILL.md +266 -0
- package/aris/skills/paper-figure/SKILL.md +312 -0
- package/aris/skills/paper-illustration/SKILL.md +736 -0
- package/aris/skills/paper-illustration-image2/SKILL.md +391 -0
- package/aris/skills/paper-illustration-image2/scripts/paper_illustration_image2.py +255 -0
- package/aris/skills/paper-plan/SKILL.md +386 -0
- package/aris/skills/paper-poster/SKILL.md +19 -0
- package/aris/skills/paper-poster-html/DESIGN_FINAL.md +176 -0
- package/aris/skills/paper-poster-html/IMPLEMENTATION_CONVENTIONS.md +161 -0
- package/aris/skills/paper-poster-html/LICENSES/posterly-MIT.txt +21 -0
- package/aris/skills/paper-poster-html/NOTICE.md +57 -0
- package/aris/skills/paper-poster-html/SKILL.md +323 -0
- package/aris/skills/paper-poster-html/scripts/_posterly/__init__.py +0 -0
- package/aris/skills/paper-poster-html/scripts/_posterly/canvas.py +200 -0
- package/aris/skills/paper-poster-html/scripts/_posterly/measure.py +588 -0
- package/aris/skills/paper-poster-html/scripts/_posterly/polish.py +498 -0
- package/aris/skills/paper-poster-html/scripts/_posterly/preflight.py +489 -0
- package/aris/skills/paper-poster-html/scripts/_posterly/render.py +215 -0
- package/aris/skills/paper-poster-html/scripts/_posterly/textutil.py +16 -0
- package/aris/skills/paper-poster-html/scripts/_posterly/verify_final.py +171 -0
- package/aris/skills/paper-poster-html/scripts/asset_check.py +897 -0
- package/aris/skills/paper-poster-html/scripts/extract_pdf_figures.py +666 -0
- package/aris/skills/paper-poster-html/scripts/poster_check.py +251 -0
- package/aris/skills/paper-poster-html/scripts/preprocess_figures.py +238 -0
- package/aris/skills/paper-poster-html/scripts/render_preview.py +217 -0
- package/aris/skills/paper-poster-html/scripts/run_gates.py +556 -0
- package/aris/skills/paper-poster-html/scripts/style_check.py +1324 -0
- package/aris/skills/paper-poster-html/templates/COMPONENTS.md +462 -0
- package/aris/skills/paper-poster-html/templates/README.md +170 -0
- package/aris/skills/paper-poster-html/templates/landscape_4col.html +1032 -0
- package/aris/skills/paper-poster-html/templates/landscape_hero.html +1046 -0
- package/aris/skills/paper-poster-html/templates/portrait_2col.html +947 -0
- package/aris/skills/paper-poster-html/templates/tokens/acl.json +9 -0
- package/aris/skills/paper-poster-html/templates/tokens/cvpr.json +9 -0
- package/aris/skills/paper-poster-html/templates/tokens/generic.json +9 -0
- package/aris/skills/paper-poster-html/templates/tokens/iclr.json +9 -0
- package/aris/skills/paper-poster-html/templates/tokens/icml.json +9 -0
- package/aris/skills/paper-poster-html/templates/tokens/neurips.json +9 -0
- package/aris/skills/paper-slides/SKILL.md +635 -0
- package/aris/skills/paper-talk/SKILL.md +381 -0
- package/aris/skills/paper-write/SKILL.md +682 -0
- package/aris/skills/paper-write/templates/IEEEtran.bst +2409 -0
- package/aris/skills/paper-write/templates/IEEEtran.cls +6347 -0
- package/aris/skills/paper-write/templates/iclr2026.tex +84 -0
- package/aris/skills/paper-write/templates/icml2025.tex +87 -0
- package/aris/skills/paper-write/templates/ieee_conference.tex +89 -0
- package/aris/skills/paper-write/templates/ieee_journal.tex +93 -0
- package/aris/skills/paper-write/templates/math_commands.tex +48 -0
- package/aris/skills/paper-write/templates/neurips2025.tex +80 -0
- package/aris/skills/paper-writing/SKILL.md +929 -0
- package/aris/skills/patent-novelty-check/SKILL.md +153 -0
- package/aris/skills/patent-pipeline/SKILL.md +344 -0
- package/aris/skills/patent-review/SKILL.md +203 -0
- package/aris/skills/pixel-art/SKILL.md +137 -0
- package/aris/skills/prior-art-search/SKILL.md +146 -0
- package/aris/skills/proof-checker/SKILL.md +866 -0
- package/aris/skills/proof-orchestrator/NOTICE.md +24 -0
- package/aris/skills/proof-orchestrator/SKILL.md +254 -0
- package/aris/skills/proof-orchestrator/references/audit-output-contract.md +126 -0
- package/aris/skills/proof-orchestrator/references/deepseek-routing.md +74 -0
- package/aris/skills/proof-orchestrator/references/dispatch-prompts.md +227 -0
- package/aris/skills/proof-orchestrator/references/notation-audit.md +135 -0
- package/aris/skills/proof-orchestrator/references/proof-audit-rubric.md +70 -0
- package/aris/skills/proof-orchestrator/references/stress-tests.md +38 -0
- package/aris/skills/proof-writer/SKILL.md +223 -0
- package/aris/skills/qzcli/SKILL.md +324 -0
- package/aris/skills/rebuttal/SKILL.md +376 -0
- package/aris/skills/render-html/SKILL.md +316 -0
- package/aris/skills/render-html/scripts/render_html.py +1006 -0
- package/aris/skills/render-html/scripts/templates/academic.html +703 -0
- package/aris/skills/render-html/scripts/templates/dashboard.html +333 -0
- package/aris/skills/research-implement-feature/SKILL.md +583 -0
- package/aris/skills/research-lit/SKILL.md +756 -0
- package/aris/skills/research-pipeline/SKILL.md +390 -0
- package/aris/skills/research-refine/SKILL.md +770 -0
- package/aris/skills/research-refine-pipeline/SKILL.md +186 -0
- package/aris/skills/research-review/SKILL.md +223 -0
- package/aris/skills/research-wiki/SKILL.md +461 -0
- package/aris/skills/resubmit-pipeline/SKILL.md +447 -0
- package/{skills/result-to-claim-claude → aris/skills/result-to-claim}/SKILL.md +7 -17
- package/aris/skills/run-experiment/SKILL.md +313 -0
- package/aris/skills/semantic-scholar/SKILL.md +236 -0
- package/aris/skills/serverless-modal/SKILL.md +335 -0
- package/aris/skills/shared-references/acceptance-gate.md +324 -0
- package/aris/skills/shared-references/assurance-contract.md +248 -0
- package/aris/skills/shared-references/capture-antipatterns.md +78 -0
- package/aris/skills/shared-references/citation-discipline.md +583 -0
- package/aris/skills/shared-references/compute-env-contract.md +163 -0
- package/aris/skills/shared-references/effort-contract.md +183 -0
- package/aris/skills/shared-references/evidence-precheck.md +65 -0
- package/aris/skills/shared-references/experiment-integrity.md +49 -0
- package/aris/skills/shared-references/external-cadence.md +326 -0
- package/aris/skills/shared-references/fan-out-pattern.md +366 -0
- package/aris/skills/shared-references/injection-hygiene.md +127 -0
- package/aris/skills/shared-references/integration-contract.md +461 -0
- package/aris/skills/shared-references/output-composition.md +93 -0
- package/aris/skills/shared-references/output-language.md +45 -0
- package/aris/skills/shared-references/output-manifest.md +49 -0
- package/aris/skills/shared-references/output-versioning.md +111 -0
- package/aris/skills/shared-references/patent-format-cn.md +199 -0
- package/aris/skills/shared-references/patent-format-ep.md +173 -0
- package/aris/skills/shared-references/patent-format-us.md +161 -0
- package/aris/skills/shared-references/patent-writing-principles.md +197 -0
- package/aris/skills/shared-references/prior-art-databases.md +141 -0
- package/aris/skills/shared-references/resumable-runs.md +109 -0
- package/aris/skills/shared-references/review-scope-limits.md +81 -0
- package/aris/skills/shared-references/review-tracing.md +391 -0
- package/aris/skills/shared-references/reviewer-independence.md +79 -0
- package/aris/skills/shared-references/reviewer-routing.md +852 -0
- package/aris/skills/shared-references/skill-governance.md +104 -0
- package/aris/skills/shared-references/taste-calibration.md +85 -0
- package/aris/skills/shared-references/venue-checklists.md +114 -0
- package/aris/skills/shared-references/wiki-helper-resolution.md +134 -0
- package/aris/skills/shared-references/writing-principles.md +525 -0
- package/aris/skills/skills-codex/README.md +102 -0
- package/aris/skills/skills-codex/README_CN.md +100 -0
- package/aris/skills/skills-codex/ablation-planner/SKILL.md +126 -0
- package/aris/skills/skills-codex/alphaxiv/SKILL.md +186 -0
- package/aris/skills/skills-codex/analyze-results/SKILL.md +45 -0
- package/aris/skills/skills-codex/arxiv/SKILL.md +210 -0
- package/aris/skills/skills-codex/auto-paper-improvement-loop/SKILL.md +618 -0
- package/aris/skills/skills-codex/auto-review-loop/SKILL.md +500 -0
- package/aris/skills/skills-codex/auto-review-loop-llm/SKILL.md +247 -0
- package/aris/skills/skills-codex/auto-review-loop-minimax/SKILL.md +290 -0
- package/aris/skills/skills-codex/citation-audit/SKILL.md +504 -0
- package/aris/skills/skills-codex/claims-drafting/SKILL.md +239 -0
- package/aris/skills/skills-codex/comm-lit-review/SKILL.md +299 -0
- package/aris/skills/skills-codex/comm-lit-review/references/domain-taxonomy.md +57 -0
- package/aris/skills/skills-codex/comm-lit-review/references/output-template.md +37 -0
- package/aris/skills/skills-codex/comm-lit-review/references/source-policy.md +99 -0
- package/aris/skills/skills-codex/comm-lit-review/references/venue-tiering.md +112 -0
- package/aris/skills/skills-codex/deepxiv/SKILL.md +142 -0
- package/aris/skills/skills-codex/dse-loop/SKILL.md +285 -0
- package/aris/skills/skills-codex/embodiment-description/SKILL.md +129 -0
- package/aris/skills/skills-codex/exa-search/SKILL.md +192 -0
- package/aris/skills/skills-codex/experiment-audit/SKILL.md +286 -0
- package/aris/skills/skills-codex/experiment-bridge/SKILL.md +356 -0
- package/aris/skills/skills-codex/experiment-plan/SKILL.md +249 -0
- package/aris/skills/skills-codex/experiment-queue/SKILL.md +401 -0
- package/aris/skills/skills-codex/feishu-notify/SKILL.md +155 -0
- package/aris/skills/skills-codex/figure-description/SKILL.md +138 -0
- package/aris/skills/skills-codex/figure-spec/SKILL.md +252 -0
- package/aris/skills/skills-codex/formula-derivation/SKILL.md +280 -0
- package/aris/skills/skills-codex/gemini-search/SKILL.md +205 -0
- package/aris/skills/skills-codex/grant-proposal/SKILL.md +626 -0
- package/aris/skills/skills-codex/idea-creator/SKILL.md +438 -0
- package/aris/skills/skills-codex/idea-discovery/SKILL.md +477 -0
- package/aris/skills/skills-codex/idea-discovery-robot/SKILL.md +362 -0
- package/aris/skills/skills-codex/integrity-forensics/SKILL.md +108 -0
- package/aris/skills/skills-codex/interview-cheatsheet/SKILL.md +245 -0
- package/aris/skills/skills-codex/invention-structuring/SKILL.md +188 -0
- package/aris/skills/skills-codex/jurisdiction-format/SKILL.md +192 -0
- package/aris/skills/skills-codex/kill-argument/SKILL.md +403 -0
- package/aris/skills/skills-codex/mermaid-diagram/SKILL.md +379 -0
- package/aris/skills/skills-codex/meta-apply/SKILL.md +154 -0
- package/aris/skills/skills-codex/meta-optimize/SKILL.md +348 -0
- package/aris/skills/skills-codex/monitor-experiment/SKILL.md +98 -0
- package/aris/skills/skills-codex/novelty-check/SKILL.md +130 -0
- package/aris/skills/skills-codex/openalex/SKILL.md +228 -0
- package/aris/skills/skills-codex/overleaf-sync/SKILL.md +220 -0
- package/aris/skills/skills-codex/paper-claim-audit/SKILL.md +350 -0
- package/aris/skills/skills-codex/paper-compile/SKILL.md +253 -0
- package/aris/skills/skills-codex/paper-figure/SKILL.md +311 -0
- package/aris/skills/skills-codex/paper-illustration/SKILL.md +690 -0
- package/aris/skills/skills-codex/paper-illustration-image2/SKILL.md +383 -0
- package/aris/skills/skills-codex/paper-illustration-image2/scripts/paper_illustration_image2.py +255 -0
- package/aris/skills/skills-codex/paper-plan/SKILL.md +278 -0
- package/aris/skills/skills-codex/paper-poster/SKILL.md +19 -0
- package/aris/skills/skills-codex/paper-poster-html/SKILL.md +377 -0
- package/aris/skills/skills-codex/paper-slides/SKILL.md +571 -0
- package/aris/skills/skills-codex/paper-talk/SKILL.md +381 -0
- package/aris/skills/skills-codex/paper-write/SKILL.md +487 -0
- package/aris/skills/skills-codex/paper-write/templates/IEEEtran.bst +2409 -0
- package/aris/skills/skills-codex/paper-write/templates/IEEEtran.cls +6347 -0
- package/aris/skills/skills-codex/paper-write/templates/aaai2026.bst +1493 -0
- package/aris/skills/skills-codex/paper-write/templates/aaai2026.sty +315 -0
- package/aris/skills/skills-codex/paper-write/templates/aaai2026.tex +952 -0
- package/aris/skills/skills-codex/paper-write/templates/acl.sty +312 -0
- package/aris/skills/skills-codex/paper-write/templates/acl2026.tex +377 -0
- package/aris/skills/skills-codex/paper-write/templates/acl_natbib.bst +1940 -0
- package/aris/skills/skills-codex/paper-write/templates/acm.bst +3081 -0
- package/aris/skills/skills-codex/paper-write/templates/acm_mm2026.tex +204 -0
- package/aris/skills/skills-codex/paper-write/templates/acmart.cls +3520 -0
- package/aris/skills/skills-codex/paper-write/templates/cvpr.bst +1448 -0
- package/aris/skills/skills-codex/paper-write/templates/cvpr.sty +508 -0
- package/aris/skills/skills-codex/paper-write/templates/cvpr2026.tex +63 -0
- package/aris/skills/skills-codex/paper-write/templates/iclr2026.tex +84 -0
- package/aris/skills/skills-codex/paper-write/templates/iclr2026_conference.bst +1440 -0
- package/aris/skills/skills-codex/paper-write/templates/iclr2026_conference.sty +246 -0
- package/aris/skills/skills-codex/paper-write/templates/icml2026.sty +767 -0
- package/aris/skills/skills-codex/paper-write/templates/icml2026.tex +662 -0
- package/aris/skills/skills-codex/paper-write/templates/ieee_conference.tex +89 -0
- package/aris/skills/skills-codex/paper-write/templates/ieee_journal.tex +93 -0
- package/aris/skills/skills-codex/paper-write/templates/math_commands.tex +48 -0
- package/aris/skills/skills-codex/paper-write/templates/neurips2026.tex +493 -0
- package/aris/skills/skills-codex/paper-write/templates/neurips_2026.sty +437 -0
- package/aris/skills/skills-codex/paper-writing/SKILL.md +744 -0
- package/aris/skills/skills-codex/patent-novelty-check/SKILL.md +153 -0
- package/aris/skills/skills-codex/patent-pipeline/SKILL.md +344 -0
- package/aris/skills/skills-codex/patent-review/SKILL.md +202 -0
- package/aris/skills/skills-codex/pixel-art/SKILL.md +139 -0
- package/aris/skills/skills-codex/prior-art-search/SKILL.md +146 -0
- package/aris/skills/skills-codex/proof-checker/SKILL.md +554 -0
- package/aris/skills/skills-codex/proof-orchestrator/SKILL.md +260 -0
- package/aris/skills/skills-codex/proof-orchestrator/references/audit-output-contract.md +126 -0
- package/aris/skills/skills-codex/proof-orchestrator/references/deepseek-routing.md +76 -0
- package/aris/skills/skills-codex/proof-orchestrator/references/dispatch-prompts.md +227 -0
- package/aris/skills/skills-codex/proof-orchestrator/references/notation-audit.md +135 -0
- package/aris/skills/skills-codex/proof-orchestrator/references/proof-audit-rubric.md +70 -0
- package/aris/skills/skills-codex/proof-orchestrator/references/stress-tests.md +38 -0
- package/aris/skills/skills-codex/proof-writer/SKILL.md +222 -0
- package/aris/skills/skills-codex/qzcli/SKILL.md +324 -0
- package/aris/skills/skills-codex/rebuttal/SKILL.md +305 -0
- package/aris/skills/skills-codex/render-html/SKILL.md +305 -0
- package/aris/skills/skills-codex/render-html/scripts/render_html.py +909 -0
- package/aris/skills/skills-codex/render-html/scripts/templates/academic.html +342 -0
- package/aris/skills/skills-codex/render-html/scripts/templates/dashboard.html +333 -0
- package/aris/skills/skills-codex/research-implement-feature/SKILL.md +406 -0
- package/aris/skills/skills-codex/research-lit/SKILL.md +464 -0
- package/aris/skills/skills-codex/research-pipeline/SKILL.md +346 -0
- package/aris/skills/skills-codex/research-refine/SKILL.md +721 -0
- package/aris/skills/skills-codex/research-refine-pipeline/SKILL.md +186 -0
- package/aris/skills/skills-codex/research-review/SKILL.md +160 -0
- package/aris/skills/skills-codex/research-wiki/SKILL.md +421 -0
- package/aris/skills/skills-codex/resubmit-pipeline/SKILL.md +444 -0
- package/aris/skills/skills-codex/result-to-claim/SKILL.md +246 -0
- package/aris/skills/skills-codex/run-experiment/SKILL.md +236 -0
- package/aris/skills/skills-codex/semantic-scholar/SKILL.md +219 -0
- package/aris/skills/skills-codex/serverless-modal/SKILL.md +335 -0
- package/aris/skills/skills-codex/shared-references/acceptance-gate.md +336 -0
- package/aris/skills/skills-codex/shared-references/assurance-contract.md +139 -0
- package/aris/skills/skills-codex/shared-references/capture-antipatterns.md +84 -0
- package/aris/skills/skills-codex/shared-references/citation-discipline.md +452 -0
- package/aris/skills/skills-codex/shared-references/compute-env-contract.md +163 -0
- package/aris/skills/skills-codex/shared-references/effort-contract.md +143 -0
- package/aris/skills/skills-codex/shared-references/evidence-precheck.md +73 -0
- package/aris/skills/skills-codex/shared-references/experiment-integrity.md +49 -0
- package/aris/skills/skills-codex/shared-references/external-cadence.md +334 -0
- package/aris/skills/skills-codex/shared-references/fan-out-pattern.md +375 -0
- package/aris/skills/skills-codex/shared-references/injection-hygiene.md +132 -0
- package/aris/skills/skills-codex/shared-references/integration-contract.md +372 -0
- package/aris/skills/skills-codex/shared-references/output-composition.md +98 -0
- package/aris/skills/skills-codex/shared-references/output-language.md +45 -0
- package/aris/skills/skills-codex/shared-references/output-manifest.md +40 -0
- package/aris/skills/skills-codex/shared-references/output-versioning.md +111 -0
- package/aris/skills/skills-codex/shared-references/patent-format-cn.md +199 -0
- package/aris/skills/skills-codex/shared-references/patent-format-ep.md +173 -0
- package/aris/skills/skills-codex/shared-references/patent-format-us.md +161 -0
- package/aris/skills/skills-codex/shared-references/patent-writing-principles.md +197 -0
- package/aris/skills/skills-codex/shared-references/prior-art-databases.md +141 -0
- package/aris/skills/skills-codex/shared-references/resumable-runs.md +125 -0
- package/aris/skills/skills-codex/shared-references/review-scope-limits.md +81 -0
- package/aris/skills/skills-codex/shared-references/review-tracing.md +144 -0
- package/aris/skills/skills-codex/shared-references/reviewer-independence.md +66 -0
- package/aris/skills/skills-codex/shared-references/reviewer-routing.md +128 -0
- package/aris/skills/skills-codex/shared-references/skill-governance.md +119 -0
- package/aris/skills/skills-codex/shared-references/taste-calibration.md +90 -0
- package/aris/skills/skills-codex/shared-references/venue-checklists.md +73 -0
- package/aris/skills/skills-codex/shared-references/wiki-helper-resolution.md +69 -0
- package/aris/skills/skills-codex/shared-references/writing-principles.md +525 -0
- package/aris/skills/skills-codex/slides-polish/SKILL.md +563 -0
- package/aris/skills/skills-codex/specification-writing/SKILL.md +211 -0
- package/aris/skills/skills-codex/system-profile/SKILL.md +103 -0
- package/aris/skills/skills-codex/training-check/SKILL.md +83 -0
- package/aris/skills/skills-codex/vast-gpu/SKILL.md +394 -0
- package/aris/skills/skills-codex/web-debug-search/SKILL.md +334 -0
- package/aris/skills/skills-codex/wiki-enrich/SKILL.md +255 -0
- package/aris/skills/skills-codex/writing-systems-papers/SKILL.md +184 -0
- package/aris/skills/skills-codex-claude-review/README.md +79 -0
- package/aris/skills/skills-codex-claude-review/README_CN.md +78 -0
- package/aris/skills/skills-codex-claude-review/auto-paper-improvement-loop/SKILL.md +625 -0
- package/aris/skills/skills-codex-claude-review/auto-review-loop/SKILL.md +516 -0
- package/{skills/novelty-check-claude → aris/skills/skills-codex-claude-review/novelty-check}/SKILL.md +2 -10
- package/aris/skills/skills-codex-claude-review/paper-figure/SKILL.md +319 -0
- package/aris/skills/skills-codex-claude-review/paper-plan/SKILL.md +287 -0
- package/aris/skills/skills-codex-claude-review/paper-write/SKILL.md +496 -0
- package/aris/skills/skills-codex-claude-review/research-refine/SKILL.md +732 -0
- package/aris/skills/skills-codex-claude-review/research-review/SKILL.md +177 -0
- package/aris/skills/skills-codex-gemini-review/README.md +176 -0
- package/aris/skills/skills-codex-gemini-review/README_CN.md +175 -0
- package/aris/skills/skills-codex-gemini-review/auto-paper-improvement-loop/SKILL.md +376 -0
- package/aris/skills/skills-codex-gemini-review/auto-review-loop/SKILL.md +304 -0
- package/aris/skills/skills-codex-gemini-review/grant-proposal/SKILL.md +630 -0
- package/aris/skills/skills-codex-gemini-review/idea-creator/SKILL.md +287 -0
- package/aris/skills/skills-codex-gemini-review/idea-discovery/SKILL.md +275 -0
- package/aris/skills/skills-codex-gemini-review/idea-discovery-robot/SKILL.md +365 -0
- package/aris/skills/skills-codex-gemini-review/novelty-check/SKILL.md +133 -0
- package/aris/skills/skills-codex-gemini-review/paper-figure/SKILL.md +289 -0
- package/aris/skills/skills-codex-gemini-review/paper-plan/SKILL.md +265 -0
- package/aris/skills/skills-codex-gemini-review/paper-poster-html/SKILL.md +102 -0
- package/aris/skills/skills-codex-gemini-review/paper-slides/SKILL.md +582 -0
- package/aris/skills/skills-codex-gemini-review/paper-write/SKILL.md +422 -0
- package/aris/skills/skills-codex-gemini-review/paper-writing/SKILL.md +325 -0
- package/aris/skills/skills-codex-gemini-review/research-refine/SKILL.md +674 -0
- package/aris/skills/skills-codex-gemini-review/research-review/SKILL.md +137 -0
- package/aris/skills/slides-polish/SKILL.md +565 -0
- package/aris/skills/specification-writing/SKILL.md +211 -0
- package/aris/skills/system-profile/SKILL.md +103 -0
- package/aris/skills/training-check/SKILL.md +132 -0
- package/aris/skills/vast-gpu/SKILL.md +394 -0
- package/aris/skills/web-debug-search/SKILL.md +334 -0
- package/aris/skills/wiki-enrich/SKILL.md +257 -0
- package/aris/skills/writing-systems-papers/SKILL.md +184 -0
- package/aris/templates/CLAUDE_MD_TEMPLATE.md +29 -0
- package/aris/templates/EXPERIMENT_LOG_TEMPLATE.md +47 -0
- package/aris/templates/EXPERIMENT_PLAN_TEMPLATE.md +51 -0
- package/aris/templates/EXPERIMENT_PLAN_TEMPLATE_CN.md +53 -0
- package/aris/templates/FINDINGS_TEMPLATE.md +52 -0
- package/aris/templates/IDEA_CANDIDATES_TEMPLATE.md +47 -0
- package/aris/templates/IDEA_CANDIDATES_TEMPLATE_CN.md +47 -0
- package/aris/templates/INVENTION_BRIEF_TEMPLATE.md +87 -0
- package/aris/templates/MANIFEST_TEMPLATE.md +7 -0
- package/aris/templates/NARRATIVE_REPORT_TEMPLATE.md +49 -0
- package/aris/templates/PAPER_PLAN_TEMPLATE.md +47 -0
- package/aris/templates/PATENT_CLAIMS_TEMPLATE.md +78 -0
- package/aris/templates/PATENT_SPECIFICATION_TEMPLATE.md +68 -0
- package/aris/templates/README.md +57 -0
- package/aris/templates/RESEARCH_BRIEF_TEMPLATE.md +35 -0
- package/aris/templates/RESEARCH_BRIEF_TEMPLATE_CN.md +41 -0
- package/aris/templates/RESEARCH_CONTRACT_TEMPLATE.md +60 -0
- package/aris/templates/claude-hooks/corpus_write_guard.json +16 -0
- package/aris/templates/claude-hooks/corpus_write_guard.py +85 -0
- package/aris/templates/claude-hooks/meta_logging.json +74 -0
- package/aris/templates/gitignore-trace.txt +3 -0
- package/aris/tests/__init__.py +0 -0
- package/aris/tests/_feishu_bridge_helpers.py +82 -0
- package/aris/tests/_llm_chat_helpers.py +179 -0
- package/aris/tests/_minimax_helpers.py +189 -0
- package/aris/tests/test_argument_hint_lint.py +183 -0
- package/aris/tests/test_arxiv_fetch.py +266 -0
- package/aris/tests/test_auto_proceed_contract.py +106 -0
- package/aris/tests/test_capture_filter.py +86 -0
- package/aris/tests/test_claude_review_artifact_tools.py +171 -0
- package/aris/tests/test_claude_review_generator.py +51 -0
- package/aris/tests/test_claude_review_overlay.py +64 -0
- package/aris/tests/test_claude_review_parse.py +290 -0
- package/aris/tests/test_codex_exec_bridge.py +306 -0
- package/aris/tests/test_codex_image2_server.py +424 -0
- package/aris/tests/test_codex_install_update.py +511 -0
- package/aris/tests/test_codex_skill_mirror.py +547 -0
- package/aris/tests/test_copilot_install.py +1202 -0
- package/aris/tests/test_copilot_native_evidence.py +562 -0
- package/aris/tests/test_corpus_write_guard.py +76 -0
- package/aris/tests/test_deepxiv_fetch.py +180 -0
- package/aris/tests/test_evidence_check.py +189 -0
- package/aris/tests/test_exa_search.py +220 -0
- package/aris/tests/test_feishu_bridge_server.py +289 -0
- package/aris/tests/test_forensics_gate.py +565 -0
- package/aris/tests/test_http_reviewer_fallback_contract.py +43 -0
- package/aris/tests/test_http_reviewer_provenance_alignment.py +25 -0
- package/aris/tests/test_http_reviewer_review_gate.py +112 -0
- package/aris/tests/test_idea_creator_query_pack_scan.py +238 -0
- package/aris/tests/test_idea_discovery_gate.py +400 -0
- package/aris/tests/test_install_aris_agent_profiles.py +98 -0
- package/aris/tests/test_install_aris_ps1.py +359 -0
- package/aris/tests/test_install_aris_replace_link.py +119 -0
- package/aris/tests/test_install_aris_selective.py +235 -0
- package/aris/tests/test_install_aris_tools_symlink.py +196 -0
- package/aris/tests/test_iteration_log.py +85 -0
- package/aris/tests/test_llm_chat_converter.py +61 -0
- package/aris/tests/test_llm_chat_review_fallback.py +516 -0
- package/aris/tests/test_llm_chat_server.py +414 -0
- package/aris/tests/test_mainline_large_payload_prompts.py +72 -0
- package/aris/tests/test_manual_review.py +804 -0
- package/aris/tests/test_manual_review_integration.py +305 -0
- package/aris/tests/test_minimax_chat_server.py +464 -0
- package/aris/tests/test_minimax_integration.py +241 -0
- package/aris/tests/test_openalex_fetch.py +197 -0
- package/aris/tests/test_plugin_manifest.py +40 -0
- package/aris/tests/test_proof_suite_integration.py +66 -0
- package/aris/tests/test_provenance.py +284 -0
- package/aris/tests/test_research_wiki_claims.py +93 -0
- package/aris/tests/test_research_wiki_encoding.py +74 -0
- package/aris/tests/test_research_wiki_experiments.py +88 -0
- package/aris/tests/test_research_wiki_fetch_arxiv_metadata.py +242 -0
- package/aris/tests/test_research_wiki_helper_resolution.py +253 -0
- package/aris/tests/test_research_wiki_ideas.py +113 -0
- package/aris/tests/test_review_gate.py +358 -0
- package/aris/tests/test_reviewer_pins.py +90 -0
- package/aris/tests/test_run_state.py +313 -0
- package/aris/tests/test_skill_groups.py +111 -0
- package/aris/tests/test_skill_picker.py +207 -0
- package/aris/tests/test_threat_scan.py +139 -0
- package/aris/tests/test_trigger_eval.py +171 -0
- package/aris/tests/test_verify_paper_audits.py +198 -0
- package/aris/tests/test_watchdog.py +496 -0
- package/aris/tests/test_watchdog_loop.py +148 -0
- package/aris/tests/test_web_debug_search.py +157 -0
- package/aris/tools/arxiv_fetch.py +311 -0
- package/aris/tools/capture_filter.py +126 -0
- package/aris/tools/check_skills_inventory.py +287 -0
- package/aris/tools/convert_skills_to_llm_chat.py +282 -0
- package/aris/tools/copilot_native_evidence.py +818 -0
- package/aris/tools/deepxiv_fetch.py +213 -0
- package/aris/tools/evidence_check.py +212 -0
- package/aris/tools/exa_search.py +425 -0
- package/aris/tools/experiment_queue/README.md +118 -0
- package/aris/tools/experiment_queue/build_manifest.py +44 -0
- package/aris/tools/experiment_queue/queue_manager.py +44 -0
- package/aris/tools/extract_paper_style.py +560 -0
- package/aris/tools/figure_renderer.py +69 -0
- package/aris/tools/forensics_gate.py +669 -0
- package/aris/tools/generate_codex_claude_review_overrides.py +355 -0
- package/aris/tools/idea_discovery_gate.py +256 -0
- package/aris/tools/install_aris.ps1 +1372 -0
- package/aris/tools/install_aris.sh +1416 -0
- package/aris/tools/install_aris_codex.sh +1023 -0
- package/aris/tools/install_aris_copilot.sh +1052 -0
- package/aris/tools/iteration_log.py +143 -0
- package/aris/tools/lint_skills_helpers.sh +84 -0
- package/aris/tools/meta_opt/check_ready.sh +80 -0
- package/aris/tools/meta_opt/log_event.sh +91 -0
- package/aris/tools/meta_opt/trigger_eval.py +280 -0
- package/aris/tools/meta_opt/trigger_evals.sample.json +28 -0
- package/aris/tools/openalex_fetch.py +326 -0
- package/aris/tools/overleaf_audit.sh +104 -0
- package/aris/tools/overleaf_setup.sh +150 -0
- package/aris/tools/paper_illustration_image2.py +62 -0
- package/aris/tools/provenance.py +294 -0
- package/aris/tools/research_wiki.py +1720 -0
- package/aris/tools/review_gate.py +502 -0
- package/aris/tools/run_state.py +399 -0
- package/aris/tools/save_trace.sh +477 -0
- package/aris/tools/semantic_scholar_fetch.py +438 -0
- package/aris/tools/skill-groups.tsv +117 -0
- package/aris/tools/skill_picker.py +238 -0
- package/aris/tools/smart_update.ps1 +521 -0
- package/aris/tools/smart_update.sh +591 -0
- package/aris/tools/smart_update_codex.sh +419 -0
- package/aris/tools/smart_update_copilot.sh +605 -0
- package/aris/tools/threat_scan.py +222 -0
- package/aris/tools/verify_paper_audits.sh +487 -0
- package/aris/tools/verify_papers.py +613 -0
- package/aris/tools/verify_wiki_coverage.sh +176 -0
- package/aris/tools/watchdog.py +485 -0
- package/aris/xhs_post.md +125 -0
- package/dsh/client.js +43 -14
- package/dsh/http-rpc.mjs +8 -7
- package/mcp-servers/codex-exec/README.md +4 -4
- package/mcp-servers/codex-exec/server.py +1 -1
- package/package.json +4 -5
- package/skills/ablation-planner/SKILL.md +1 -1
- package/skills/auto-paper-improvement-loop/SKILL.md +10 -10
- package/skills/auto-paper-improvement-loop-claude/SKILL.md +25 -612
- package/skills/auto-review-loop/SKILL.md +4 -4
- package/skills/auto-review-loop-claude/SKILL.md +25 -503
- package/skills/citation-audit/SKILL.md +3 -3
- package/skills/claims-drafting/SKILL.md +2 -2
- package/skills/experiment-audit/SKILL.md +4 -4
- package/skills/experiment-bridge/SKILL.md +14 -12
- package/skills/figure-spec/SKILL.md +1 -1
- package/skills/grant-proposal/SKILL.md +7 -7
- package/skills/human-in-loop-refine/SKILL.md +119 -0
- package/skills/human-in-loop-refine/scripts/refine_round.py +449 -0
- package/skills/human-in-loop-refine/scripts/test_refine_round.py +200 -0
- package/skills/human-in-loop-refine/templates/INPUTS.md +20 -0
- package/skills/human-in-loop-refine/templates/PAPER_NOTE.md +29 -0
- package/skills/human-in-loop-refine/templates/REVISION.md +27 -0
- package/skills/idea-creator/SKILL.md +2 -2
- package/skills/idea-discovery/SKILL.md +15 -13
- package/skills/idea-discovery-robot/SKILL.md +11 -9
- package/skills/integrity-forensics/SKILL.md +1 -1
- package/skills/interview-cheatsheet/SKILL.md +3 -3
- package/skills/invention-structuring/SKILL.md +2 -2
- package/skills/kill-argument/SKILL.md +8 -8
- package/skills/kill-argument-claude/SKILL.md +30 -431
- package/skills/meta-apply/SKILL.md +1 -1
- package/skills/meta-optimize/SKILL.md +2 -2
- package/skills/novelty-check/SKILL.md +2 -2
- package/skills/paper-claim-audit/SKILL.md +5 -5
- package/skills/paper-figure/SKILL.md +4 -3
- package/skills/paper-figure-claude/SKILL.md +24 -305
- package/skills/paper-plan/SKILL.md +3 -3
- package/skills/paper-plan-claude/SKILL.md +24 -273
- package/skills/paper-poster-html/SKILL.md +11 -9
- package/skills/paper-slides/SKILL.md +5 -5
- package/skills/paper-talk/SKILL.md +10 -8
- package/skills/paper-write/SKILL.md +3 -3
- package/skills/paper-write-claude/SKILL.md +24 -482
- package/skills/paper-writing/SKILL.md +19 -17
- package/skills/patent-novelty-check/SKILL.md +3 -3
- package/skills/patent-pipeline/SKILL.md +2 -2
- package/skills/patent-review/SKILL.md +3 -3
- package/skills/proof-checker/SKILL.md +12 -12
- package/skills/proof-checker-claude/SKILL.md +30 -860
- package/skills/rebuttal/SKILL.md +12 -10
- package/skills/render-html/SKILL.md +1 -1
- package/skills/research-implement-feature/SKILL.md +1 -1
- package/skills/research-pipeline/SKILL.md +15 -13
- package/skills/research-refine/SKILL.md +6 -6
- package/skills/research-refine-claude/SKILL.md +24 -719
- package/skills/research-refine-pipeline/SKILL.md +10 -8
- package/skills/research-review/SKILL.md +7 -7
- package/skills/research-review-claude/SKILL.md +25 -164
- package/skills/resubmit-pipeline/SKILL.md +14 -12
- package/skills/result-to-claim/SKILL.md +2 -2
- package/skills/shared-references/assurance-contract.md +1 -1
- package/skills/shared-references/effort-contract.md +1 -1
- package/skills/shared-references/fan-out-pattern.md +4 -4
- package/skills/shared-references/resumable-runs.md +2 -2
- package/skills/shared-references/review-scope-limits.md +1 -1
- package/skills/shared-references/review-tracing.md +2 -2
- package/skills/shared-references/reviewer-routing.md +16 -14
- package/skills/shared-references/skill-governance.md +3 -3
- package/skills/skills-codex/ablation-planner/SKILL.md +1 -1
- package/skills/skills-codex/auto-paper-improvement-loop/SKILL.md +8 -8
- package/skills/skills-codex/auto-review-loop/SKILL.md +2 -2
- package/skills/skills-codex/citation-audit/SKILL.md +4 -4
- package/skills/skills-codex/claims-drafting/SKILL.md +2 -2
- package/skills/skills-codex/experiment-audit/SKILL.md +9 -9
- package/skills/skills-codex/experiment-bridge/SKILL.md +1 -1
- package/skills/skills-codex/figure-spec/SKILL.md +1 -1
- package/skills/skills-codex/grant-proposal/SKILL.md +7 -7
- package/skills/skills-codex/idea-creator/SKILL.md +4 -4
- package/skills/skills-codex/idea-discovery/SKILL.md +6 -6
- package/skills/skills-codex/idea-discovery-robot/SKILL.md +1 -1
- package/skills/skills-codex/integrity-forensics/SKILL.md +4 -2
- package/skills/skills-codex/interview-cheatsheet/SKILL.md +3 -3
- package/skills/skills-codex/invention-structuring/SKILL.md +2 -2
- package/skills/skills-codex/kill-argument/SKILL.md +7 -7
- package/skills/skills-codex/meta-apply/SKILL.md +1 -1
- package/skills/skills-codex/meta-optimize/SKILL.md +2 -2
- package/skills/skills-codex/novelty-check/SKILL.md +1 -1
- package/skills/skills-codex/paper-claim-audit/SKILL.md +6 -6
- package/skills/skills-codex/paper-figure/SKILL.md +3 -3
- package/skills/skills-codex/paper-plan/SKILL.md +3 -3
- package/skills/skills-codex/paper-poster-html/SKILL.md +3 -3
- package/skills/skills-codex/paper-slides/SKILL.md +4 -4
- package/skills/skills-codex/paper-write/SKILL.md +3 -3
- package/skills/skills-codex/paper-writing/SKILL.md +7 -7
- package/skills/skills-codex/patent-novelty-check/SKILL.md +3 -3
- package/skills/skills-codex/patent-pipeline/SKILL.md +2 -2
- package/skills/skills-codex/patent-review/SKILL.md +3 -3
- package/skills/skills-codex/proof-checker/SKILL.md +11 -11
- package/skills/skills-codex/rebuttal/SKILL.md +2 -2
- package/skills/skills-codex/render-html/SKILL.md +1 -1
- package/skills/skills-codex/research-implement-feature/SKILL.md +1 -1
- package/skills/skills-codex/research-pipeline/SKILL.md +5 -5
- package/skills/skills-codex/research-refine/SKILL.md +6 -6
- package/skills/skills-codex/research-review/SKILL.md +6 -6
- package/skills/skills-codex/resubmit-pipeline/SKILL.md +4 -4
- package/skills/skills-codex/result-to-claim/SKILL.md +2 -2
- package/skills/skills-codex/shared-references/assurance-contract.md +2 -2
- package/skills/skills-codex/shared-references/resumable-runs.md +3 -3
- package/skills/skills-codex/shared-references/review-scope-limits.md +1 -1
- package/skills/skills-codex/shared-references/review-tracing.md +3 -3
- package/skills/skills-codex/shared-references/reviewer-independence.md +2 -2
- package/skills/skills-codex/shared-references/reviewer-routing.md +10 -10
- package/skills/skills-codex/slides-polish/SKILL.md +3 -3
- package/skills/skills-codex/specification-writing/SKILL.md +2 -2
- package/skills/slides-polish/SKILL.md +3 -3
- package/skills/specification-writing/SKILL.md +2 -2
- package/skills/training-check/SKILL.md +2 -2
- package/skills/verify-manager/SKILL.md +88 -0
- package/skills/verify-manager/phases/1-specify.md +17 -0
- package/skills/verify-manager/phases/2-plan.md +14 -0
- package/skills/verify-manager/phases/3-tasks.md +19 -0
- package/skills/verify-manager/phases/4-run.md +12 -0
- package/skills/verify-manager/phases/5-analyze.md +21 -0
- package/skills/verify-manager/phases/6-next.md +19 -0
- package/skills/verify-manager/scripts/test_verify_space.py +202 -0
- package/skills/verify-manager/scripts/verify_space.py +451 -0
- package/skills/verify-manager/templates/HYPOTHESIS.md +37 -0
- package/skills/verify-manager/templates/NEXT_IDEAS.md +20 -0
- package/skills/verify-manager/templates/PILOT_PLAN.md +56 -0
- package/skills/verify-manager/templates/PILOT_TASKS.md +28 -0
- package/skills/verify-manager/templates/PROMOTION.md +17 -0
- package/skills/verify-manager/templates/RESULT.md +36 -0
- package/test/client-render-smoke.mjs +143 -0
- package/test/test_claude_overlays.py +99 -0
- package/test/transport-smoke.mjs +16 -4
- package/tools/__pycache__/build_claude_overlays.cpython-314.pyc +0 -0
- package/tools/__pycache__/verify_lane.cpython-314.pyc +0 -0
- package/tools/build_claude_overlays.py +187 -0
- package/tools/check_skills_inventory.py +17 -3
- package/tools/convert_skills_to_llm_chat.py +15 -15
- package/tools/generate_codex_claude_review_overrides.py +12 -12
- package/tools/run_state.py +1 -1
- package/tools/save_trace.sh +2 -2
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""ARIS-Monitor: STRICTLY READ-ONLY session scanner / triage classifier.
|
|
3
|
+
|
|
4
|
+
This module READS files under ~/.claude only. It NEVER writes, kills, signals,
|
|
5
|
+
spawns, runs subprocess/tmux/ps, polls processes, or touches the network.
|
|
6
|
+
|
|
7
|
+
Authoritative needs-approval signal
|
|
8
|
+
------------------------------------
|
|
9
|
+
The core MVP signal -- "this session is blocked waiting for you to approve
|
|
10
|
+
something" -- comes STRAIGHT FROM the live registry file:
|
|
11
|
+
|
|
12
|
+
~/.claude/sessions/<pid>.json -> status == "waiting"
|
|
13
|
+
|
|
14
|
+
The Claude Code app itself sets status=="waiting" (with an optional
|
|
15
|
+
`waitingFor` string like "Bash(npm test) needs approval") while a permission
|
|
16
|
+
prompt is on screen, and rewrites the file the instant the user answers. So:
|
|
17
|
+
* needs_approval is detected with NO transcript parsing at all, and
|
|
18
|
+
* it is inherently TRANSIENT -- you must poll (every ~1-2s) to catch it;
|
|
19
|
+
on a quiescent machine you will only ever see busy/idle.
|
|
20
|
+
|
|
21
|
+
We deliberately do NOT use the "unmatched trailing tool_use" transcript
|
|
22
|
+
heuristic for needs_approval: a bare tool_use stop while status != "waiting"
|
|
23
|
+
means STALLED, not pending-approval, and keying off it false-positives on
|
|
24
|
+
every mid-tool pause.
|
|
25
|
+
|
|
26
|
+
Liveness
|
|
27
|
+
--------
|
|
28
|
+
Liveness is inferred purely from `updatedAt` freshness. We deliberately do NOT
|
|
29
|
+
call os.kill(pid, 0), ps, or anything that interacts with live OS state. A
|
|
30
|
+
registry file untouched within LIVE_WINDOW is treated as stale and hidden.
|
|
31
|
+
|
|
32
|
+
Codex
|
|
33
|
+
-----
|
|
34
|
+
Codex is OUT OF SCOPE for needs_approval: there is no on-disk live-status file
|
|
35
|
+
equivalent to ~/.claude/sessions/*.json, and Codex approval prompts are never
|
|
36
|
+
written to the rollout JSONL. This scanner does NOT scan Codex at all. (If a
|
|
37
|
+
future version shows Codex it must be display-only history and must NEVER claim
|
|
38
|
+
needs_approval.)
|
|
39
|
+
|
|
40
|
+
Public API
|
|
41
|
+
----------
|
|
42
|
+
scan() -> list[Session] # classified, sorted, stale folded to a count
|
|
43
|
+
summary(sessions) -> dict # header counts for the widget
|
|
44
|
+
|
|
45
|
+
Run as a script for a GUI-less smoke test:
|
|
46
|
+
python3 scanner.py # prints the classified session list to stdout
|
|
47
|
+
# (names + triage only; no transcript content)
|
|
48
|
+
"""
|
|
49
|
+
from __future__ import annotations
|
|
50
|
+
|
|
51
|
+
import glob
|
|
52
|
+
import json
|
|
53
|
+
import os
|
|
54
|
+
import time
|
|
55
|
+
from dataclasses import dataclass
|
|
56
|
+
from pathlib import Path
|
|
57
|
+
from typing import List, Optional, Tuple
|
|
58
|
+
|
|
59
|
+
# ---------------------------------------------------------------------------
|
|
60
|
+
# Tunables (top-of-file constants only -- no config UI by design).
|
|
61
|
+
# ---------------------------------------------------------------------------
|
|
62
|
+
IDLE_THRESHOLD = 300 # seconds; "busy & fresh" => working
|
|
63
|
+
LIVE_WINDOW = 1800 # seconds (30 min); updatedAt older than this => stale,
|
|
64
|
+
# folded into the dim "+N stale" line (click to expand)
|
|
65
|
+
TRANSCRIPT_TAIL_BYTES = 262144 # 256 KiB read-only tail of the transcript
|
|
66
|
+
TAIL_LINES = 40 # how many trailing JSONL lines we inspect
|
|
67
|
+
|
|
68
|
+
# ---------------------------------------------------------------------------
|
|
69
|
+
# Paths. CLAUDE_FLOAT_HOME lets tests/demos point at a fixture tree; defaults
|
|
70
|
+
# to the real ~. We ONLY ever read from here.
|
|
71
|
+
# ---------------------------------------------------------------------------
|
|
72
|
+
def _home_base() -> Path:
|
|
73
|
+
env = os.environ.get("CLAUDE_FLOAT_HOME")
|
|
74
|
+
return Path(env).expanduser() if env else Path.home()
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
HOME_BASE = _home_base()
|
|
78
|
+
CLAUDE_HOME = HOME_BASE / ".claude"
|
|
79
|
+
SESSIONS_DIR = CLAUDE_HOME / "sessions"
|
|
80
|
+
PROJECTS_DIR = CLAUDE_HOME / "projects"
|
|
81
|
+
|
|
82
|
+
# ---------------------------------------------------------------------------
|
|
83
|
+
# Triage buckets. The 5 fleet buckets collapse into the 3 visible MVP buckets
|
|
84
|
+
# (+ a low-priority amber for stalled and a hidden stale bucket).
|
|
85
|
+
# The ONLY bucket the MVP must get exactly right is needs_approval, and it
|
|
86
|
+
# comes straight from status == "waiting" -- no transcript parse required.
|
|
87
|
+
# ---------------------------------------------------------------------------
|
|
88
|
+
NEEDS_APPROVAL = "needs_approval" # RED -- blocked on the user to approve
|
|
89
|
+
NEEDS_ATTENTION = "needs_attention" # amber -- stalled mid-tool, may need a nudge
|
|
90
|
+
WORKING = "working" # amber -- actively running
|
|
91
|
+
IDLE_DONE = "idle_done" # green -- finished / awaiting your review
|
|
92
|
+
STALE_HIDDEN = "stale_hidden" # folded into a dim "+N stale" count
|
|
93
|
+
|
|
94
|
+
# Sort priority (lower = more urgent / higher in the list).
|
|
95
|
+
SORT_PRIORITY = {
|
|
96
|
+
NEEDS_APPROVAL: 0,
|
|
97
|
+
NEEDS_ATTENTION: 1,
|
|
98
|
+
IDLE_DONE: 2,
|
|
99
|
+
WORKING: 3,
|
|
100
|
+
STALE_HIDDEN: 9,
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
@dataclass
|
|
105
|
+
class Info:
|
|
106
|
+
stop_reason: Optional[str] = None
|
|
107
|
+
last_tool: str = ""
|
|
108
|
+
has_pending_background: bool = False
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@dataclass
|
|
112
|
+
class Session:
|
|
113
|
+
pid: int
|
|
114
|
+
name: str
|
|
115
|
+
cwd: str
|
|
116
|
+
status: str # raw status from the live JSON (busy|idle|waiting|...)
|
|
117
|
+
triage: str # one of the bucket constants above
|
|
118
|
+
reason: str # human-readable detail
|
|
119
|
+
idle_seconds: int
|
|
120
|
+
updated_at: int # ms epoch from the live JSON
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
# ---------------------------------------------------------------------------
|
|
124
|
+
# Read-only helpers.
|
|
125
|
+
# ---------------------------------------------------------------------------
|
|
126
|
+
def _as_int(value, default: int = 0) -> int:
|
|
127
|
+
"""Coerce a possibly-malformed registry value to int -- never raises.
|
|
128
|
+
|
|
129
|
+
Concurrent partial writes can leave a field like updatedAt=="12.5" or
|
|
130
|
+
pid=="abc" mid-flush. int() would raise ValueError on those; we swallow it
|
|
131
|
+
so ONE half-written field can never blank the whole scan.
|
|
132
|
+
"""
|
|
133
|
+
try:
|
|
134
|
+
return int(value)
|
|
135
|
+
except Exception:
|
|
136
|
+
try:
|
|
137
|
+
return int(float(value))
|
|
138
|
+
except Exception:
|
|
139
|
+
return default
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def _cwd_to_project_slug(cwd: str) -> str:
|
|
143
|
+
"""Mirror Claude Code's project-dir naming: / _ . all become -."""
|
|
144
|
+
return cwd.replace("/", "-").replace("_", "-").replace(".", "-")
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def _load_session_file(path: Path) -> Optional[dict]:
|
|
148
|
+
"""Read one <pid>.json. Returns None on any failure -- never raises.
|
|
149
|
+
|
|
150
|
+
~/.claude/sessions is mode 0700; we run as the user so reads succeed, but
|
|
151
|
+
we still wrap every open() for robustness against truncated/partial writes.
|
|
152
|
+
"""
|
|
153
|
+
try:
|
|
154
|
+
with path.open(encoding="utf-8") as f:
|
|
155
|
+
data = json.load(f)
|
|
156
|
+
except Exception:
|
|
157
|
+
return None
|
|
158
|
+
# Only require a dict. We deliberately do NOT require "pid": a half-written
|
|
159
|
+
# file can have status=="waiting" before pid is flushed, and dropping it
|
|
160
|
+
# here would be a costly miss of the one thing we exist to surface. pid is
|
|
161
|
+
# recovered from the <pid>.json filename in scan() when absent.
|
|
162
|
+
if not isinstance(data, dict):
|
|
163
|
+
return None
|
|
164
|
+
return data
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def _transcript_path(session_id: str, cwd: str) -> Optional[Path]:
|
|
168
|
+
"""Derive the transcript path from the sessionId + cwd slug.
|
|
169
|
+
|
|
170
|
+
The slug derivation can collide for two distinct cwds, so we guard with
|
|
171
|
+
exists() before returning a usable path.
|
|
172
|
+
"""
|
|
173
|
+
if not session_id or not cwd:
|
|
174
|
+
return None
|
|
175
|
+
slug = _cwd_to_project_slug(cwd)
|
|
176
|
+
p = PROJECTS_DIR / slug / f"{session_id}.jsonl"
|
|
177
|
+
try:
|
|
178
|
+
if p.exists():
|
|
179
|
+
return p
|
|
180
|
+
except Exception:
|
|
181
|
+
return None
|
|
182
|
+
return None
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def _last_assistant_info(path: Optional[Path]) -> Optional[Info]:
|
|
186
|
+
"""Read-only tail of the transcript -> stop_reason / last_tool / bg flag.
|
|
187
|
+
|
|
188
|
+
Returns None if the transcript is missing, empty, or unparseable. Reads at
|
|
189
|
+
most the last TRANSCRIPT_TAIL_BYTES so even a 35k-line transcript is cheap.
|
|
190
|
+
Every json.loads is wrapped: the final line may be a half-written record.
|
|
191
|
+
"""
|
|
192
|
+
if path is None:
|
|
193
|
+
return None
|
|
194
|
+
try:
|
|
195
|
+
if not path.exists():
|
|
196
|
+
return None
|
|
197
|
+
size = path.stat().st_size
|
|
198
|
+
seeked = size > TRANSCRIPT_TAIL_BYTES
|
|
199
|
+
with path.open("rb") as fh:
|
|
200
|
+
if seeked:
|
|
201
|
+
fh.seek(size - TRANSCRIPT_TAIL_BYTES)
|
|
202
|
+
tail = fh.read().decode("utf-8", "replace")
|
|
203
|
+
except Exception:
|
|
204
|
+
return None
|
|
205
|
+
|
|
206
|
+
lines = [ln for ln in tail.splitlines() if ln.strip()]
|
|
207
|
+
if not lines:
|
|
208
|
+
return None
|
|
209
|
+
# Only when we actually seeked into the middle of the file is the leading
|
|
210
|
+
# line possibly a half record. On a complete (un-seeked) read every line is
|
|
211
|
+
# whole -- dropping the first there would discard real data and could
|
|
212
|
+
# misreport a short transcript as empty.
|
|
213
|
+
if seeked and len(lines) > 1:
|
|
214
|
+
lines = lines[1:]
|
|
215
|
+
|
|
216
|
+
window = lines[-TAIL_LINES:]
|
|
217
|
+
|
|
218
|
+
# Background-task heuristic: a queue-operation line AFTER the most recent
|
|
219
|
+
# assistant end_turn means there is still unresolved background work.
|
|
220
|
+
has_pending_bg = False
|
|
221
|
+
last_end_turn_idx = -1
|
|
222
|
+
for i, raw in enumerate(window):
|
|
223
|
+
try:
|
|
224
|
+
d = json.loads(raw)
|
|
225
|
+
except Exception:
|
|
226
|
+
continue
|
|
227
|
+
if not isinstance(d, dict):
|
|
228
|
+
continue
|
|
229
|
+
t = d.get("type", "")
|
|
230
|
+
if t == "assistant" and (d.get("message") or {}).get("stop_reason") == "end_turn":
|
|
231
|
+
last_end_turn_idx = i
|
|
232
|
+
has_pending_bg = False
|
|
233
|
+
elif t == "queue-operation" and i > last_end_turn_idx:
|
|
234
|
+
has_pending_bg = True
|
|
235
|
+
|
|
236
|
+
# Find the last assistant message for stop_reason / last tool name.
|
|
237
|
+
last_asst = None
|
|
238
|
+
for raw in reversed(window):
|
|
239
|
+
try:
|
|
240
|
+
d = json.loads(raw)
|
|
241
|
+
except Exception:
|
|
242
|
+
continue
|
|
243
|
+
if isinstance(d, dict) and d.get("type") == "assistant":
|
|
244
|
+
last_asst = d
|
|
245
|
+
break
|
|
246
|
+
if last_asst is None:
|
|
247
|
+
return None
|
|
248
|
+
|
|
249
|
+
msg = last_asst.get("message", {})
|
|
250
|
+
if not isinstance(msg, dict):
|
|
251
|
+
msg = {}
|
|
252
|
+
content = msg.get("content", []) or []
|
|
253
|
+
last_tool = ""
|
|
254
|
+
if isinstance(content, list) and content:
|
|
255
|
+
last_block = content[-1]
|
|
256
|
+
if isinstance(last_block, dict) and last_block.get("type") == "tool_use":
|
|
257
|
+
last_tool = last_block.get("name", "") or ""
|
|
258
|
+
|
|
259
|
+
return Info(
|
|
260
|
+
stop_reason=msg.get("stop_reason"),
|
|
261
|
+
last_tool=last_tool,
|
|
262
|
+
has_pending_background=has_pending_bg,
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
# ---------------------------------------------------------------------------
|
|
267
|
+
# Status decision function. Mirrors claude-fleet patrol.classify() but is
|
|
268
|
+
# strictly file-only (no os.kill / no ps / no subprocess) and collapses the
|
|
269
|
+
# fleet buckets into the MVP's three visible ones.
|
|
270
|
+
# ---------------------------------------------------------------------------
|
|
271
|
+
def _status_for(data: dict, transcript: Optional[Path], now: float) -> Tuple[str, str]:
|
|
272
|
+
"""Return (triage, reason) for one session dict."""
|
|
273
|
+
s = data.get("status", "unknown")
|
|
274
|
+
updated_at = _as_int(data.get("updatedAt", 0))
|
|
275
|
+
idle = max(0, int(now - updated_at / 1000)) if updated_at else 10 ** 9
|
|
276
|
+
|
|
277
|
+
# 1) NEEDS-APPROVAL -- highest priority, straight from the live JSON.
|
|
278
|
+
# THIS is the core MVP signal; no transcript parse needed. It MUST be
|
|
279
|
+
# checked BEFORE the stale-liveness gate: a session genuinely waiting on
|
|
280
|
+
# a permission prompt while the user stepped away may not have its
|
|
281
|
+
# updatedAt refreshed, yet it is precisely the one that must stay RED. A
|
|
282
|
+
# waiting session is therefore never folded into the hidden stale count,
|
|
283
|
+
# regardless of updatedAt age.
|
|
284
|
+
if s == "waiting":
|
|
285
|
+
# str(): waitingFor is external/untrusted -- a half-written value could
|
|
286
|
+
# be a dict/list, which would later crash the widget's reason[:26].
|
|
287
|
+
return (NEEDS_APPROVAL, str(data.get("waitingFor") or "needs approval / 等待授权"))
|
|
288
|
+
|
|
289
|
+
# 2) File-only liveness. No os.kill. A registry file not touched within
|
|
290
|
+
# LIVE_WINDOW is treated as stale and hidden (waiting already handled).
|
|
291
|
+
if idle > LIVE_WINDOW:
|
|
292
|
+
return (STALE_HIDDEN, "")
|
|
293
|
+
|
|
294
|
+
# 3) Actively working -- trust a fresh live JSON.
|
|
295
|
+
if s == "busy" and idle < IDLE_THRESHOLD:
|
|
296
|
+
return (WORKING, "working")
|
|
297
|
+
if s == "shell":
|
|
298
|
+
# A shell process is actively running -- mirror claude-fleet's
|
|
299
|
+
# patrol.classify() which maps status=='shell' to working.
|
|
300
|
+
return (WORKING, "shell process running")
|
|
301
|
+
|
|
302
|
+
# 4) Refine the rest with a read-only transcript tail.
|
|
303
|
+
info = _last_assistant_info(transcript)
|
|
304
|
+
if info is None:
|
|
305
|
+
return (IDLE_DONE, "no/empty transcript")
|
|
306
|
+
if info.has_pending_background:
|
|
307
|
+
return (WORKING, "background task running")
|
|
308
|
+
if info.stop_reason in ("end_turn", "stop_sequence"):
|
|
309
|
+
return (IDLE_DONE, "completed")
|
|
310
|
+
if info.stop_reason == "tool_use":
|
|
311
|
+
# Stopped mid-tool but NOT status==waiting => stalled, NOT pending
|
|
312
|
+
# approval. Never flag this red. A genuinely busy & fresh session was
|
|
313
|
+
# already returned WORKING in step 3; reaching here means it is not
|
|
314
|
+
# fresh, so a mid-tool stop is stalled per the documented spec.
|
|
315
|
+
nudge = f"stalled at {info.last_tool}" if info.last_tool else "stalled mid-tool"
|
|
316
|
+
return (NEEDS_ATTENTION, nudge)
|
|
317
|
+
return (IDLE_DONE if idle >= IDLE_THRESHOLD else WORKING, "")
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
# ---------------------------------------------------------------------------
|
|
321
|
+
# Public API.
|
|
322
|
+
# ---------------------------------------------------------------------------
|
|
323
|
+
def scan() -> List[Session]:
|
|
324
|
+
"""Read ~/.claude/sessions/*.json, classify each, sort.
|
|
325
|
+
|
|
326
|
+
Returns [] on ANY failure (also the natural value when there are zero
|
|
327
|
+
sessions) -- the two are indistinguishable and both safe. Never raises.
|
|
328
|
+
Stale registry files are kept as STALE_HIDDEN entries so the widget can
|
|
329
|
+
show a "+N stale (hidden)" count, but they sort to the bottom.
|
|
330
|
+
"""
|
|
331
|
+
try:
|
|
332
|
+
if not SESSIONS_DIR.exists():
|
|
333
|
+
return []
|
|
334
|
+
now = time.time()
|
|
335
|
+
out: List[Session] = []
|
|
336
|
+
|
|
337
|
+
for f in sorted(glob.glob(str(SESSIONS_DIR / "*.json"))):
|
|
338
|
+
base = os.path.basename(f)
|
|
339
|
+
# Legacy session-<ts>.json files carry no pid/status -- skip them.
|
|
340
|
+
if base.startswith("session-"):
|
|
341
|
+
continue
|
|
342
|
+
data = _load_session_file(Path(f))
|
|
343
|
+
if not data:
|
|
344
|
+
continue
|
|
345
|
+
|
|
346
|
+
# Per-file guard: one malformed/half-written registry file (e.g. a
|
|
347
|
+
# truncated value that slips past _load_session_file but trips a
|
|
348
|
+
# later coercion) must be SKIPPED, not allowed to blank the whole
|
|
349
|
+
# fleet -- otherwise a real needs_approval could vanish.
|
|
350
|
+
try:
|
|
351
|
+
# str(): cwd/sessionId are external; a non-string from a half
|
|
352
|
+
# write would make slug derivation raise and skip the ENTIRE
|
|
353
|
+
# session -- including one that is genuinely waiting.
|
|
354
|
+
session_id = str(data.get("sessionId") or "")
|
|
355
|
+
cwd = str(data.get("cwd") or "")
|
|
356
|
+
transcript = _transcript_path(session_id, cwd)
|
|
357
|
+
triage, reason = _status_for(data, transcript, now)
|
|
358
|
+
|
|
359
|
+
updated_at = _as_int(data.get("updatedAt", 0))
|
|
360
|
+
idle_seconds = max(0, int(now - updated_at / 1000)) if updated_at else 0
|
|
361
|
+
|
|
362
|
+
# Recover pid from the "<pid>.json" filename when the field is
|
|
363
|
+
# absent/half-written (see _load_session_file).
|
|
364
|
+
fname_pid = _as_int(base[:-5]) if base.endswith(".json") else 0
|
|
365
|
+
|
|
366
|
+
out.append(
|
|
367
|
+
Session(
|
|
368
|
+
pid=_as_int(data.get("pid"), fname_pid),
|
|
369
|
+
name=str(data.get("name") or os.path.basename(cwd) or "?"),
|
|
370
|
+
cwd=cwd,
|
|
371
|
+
status=data.get("status", "unknown"),
|
|
372
|
+
triage=triage,
|
|
373
|
+
reason=reason,
|
|
374
|
+
idle_seconds=idle_seconds,
|
|
375
|
+
updated_at=updated_at,
|
|
376
|
+
)
|
|
377
|
+
)
|
|
378
|
+
except Exception:
|
|
379
|
+
# Skip just this file; keep scanning siblings.
|
|
380
|
+
continue
|
|
381
|
+
|
|
382
|
+
out.sort(key=lambda x: (SORT_PRIORITY.get(x.triage, 5), -x.updated_at, x.pid))
|
|
383
|
+
return out
|
|
384
|
+
except Exception:
|
|
385
|
+
# A read-only scan must never raise; degrade to empty.
|
|
386
|
+
return []
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
def summary(sessions: Optional[List[Session]] = None) -> dict:
|
|
390
|
+
"""Header counts for the widget. needs_approval is the headline number."""
|
|
391
|
+
if sessions is None:
|
|
392
|
+
sessions = scan()
|
|
393
|
+
visible = [s for s in sessions if s.triage != STALE_HIDDEN]
|
|
394
|
+
stale = [s for s in sessions if s.triage == STALE_HIDDEN]
|
|
395
|
+
return {
|
|
396
|
+
"needs_approval": sum(1 for s in visible if s.triage == NEEDS_APPROVAL),
|
|
397
|
+
"needs_attention": sum(1 for s in visible if s.triage == NEEDS_ATTENTION),
|
|
398
|
+
"working": sum(1 for s in visible if s.triage == WORKING),
|
|
399
|
+
"idle_done": sum(1 for s in visible if s.triage == IDLE_DONE),
|
|
400
|
+
"visible": len(visible),
|
|
401
|
+
"stale": len(stale),
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
def fmt_age(seconds: int) -> str:
|
|
406
|
+
if seconds < 60:
|
|
407
|
+
return f"{seconds}s"
|
|
408
|
+
if seconds < 3600:
|
|
409
|
+
return f"{seconds // 60}m"
|
|
410
|
+
h = seconds // 3600
|
|
411
|
+
m = (seconds % 3600) // 60
|
|
412
|
+
return f"{h}h{m}m" if m else f"{h}h"
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
def _main() -> None:
|
|
416
|
+
"""GUI-less smoke test: print the classified session list to stdout.
|
|
417
|
+
|
|
418
|
+
Read-only. Prints session NAMEs and triage/reason only -- it does not echo
|
|
419
|
+
transcript content.
|
|
420
|
+
"""
|
|
421
|
+
sessions = scan()
|
|
422
|
+
s = summary(sessions)
|
|
423
|
+
print(
|
|
424
|
+
"ARIS-Monitor scanner -- "
|
|
425
|
+
f"needs_approval={s['needs_approval']} "
|
|
426
|
+
f"working={s['working']} idle_done={s['idle_done']} "
|
|
427
|
+
f"attention={s['needs_attention']} stale={s['stale']}"
|
|
428
|
+
)
|
|
429
|
+
visible = [x for x in sessions if x.triage != STALE_HIDDEN]
|
|
430
|
+
if not visible:
|
|
431
|
+
print(" (all clear -- no active Claude sessions)")
|
|
432
|
+
for x in visible:
|
|
433
|
+
dot = {
|
|
434
|
+
NEEDS_APPROVAL: "[!]",
|
|
435
|
+
NEEDS_ATTENTION: "[~]",
|
|
436
|
+
WORKING: "[*]",
|
|
437
|
+
IDLE_DONE: "[ ]",
|
|
438
|
+
}.get(x.triage, "[?]")
|
|
439
|
+
print(f" {dot} {x.name:<28} {x.triage:<15} {x.reason} ({fmt_age(x.idle_seconds)})")
|
|
440
|
+
if s["stale"]:
|
|
441
|
+
print(f" +{s['stale']} stale (hidden)")
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
if __name__ == "__main__":
|
|
445
|
+
_main()
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""ARIS-Monitor: headless terminal ticker (fallback UI).
|
|
3
|
+
|
|
4
|
+
If Tkinter is unavailable (a minimal custom Python lacking the Tk module),
|
|
5
|
+
this prints the SAME 3-bucket triage to stdout on the SAME ~2s loop, driven by
|
|
6
|
+
the IDENTICAL read-only scanner.py -- zero new dependencies, zero detection
|
|
7
|
+
changes.
|
|
8
|
+
|
|
9
|
+
STRICTLY READ-ONLY: it only reads files via scanner.scan(). It NEVER writes,
|
|
10
|
+
kills, signals, spawns, polls processes, runs subprocess, or touches the
|
|
11
|
+
network. It self-loops (no `watch`, no external sleep beyond time.sleep on its
|
|
12
|
+
own process) and re-clears the screen each tick.
|
|
13
|
+
|
|
14
|
+
Run:
|
|
15
|
+
python3 ticker.py
|
|
16
|
+
Stop with Ctrl-C.
|
|
17
|
+
"""
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import sys
|
|
21
|
+
import time
|
|
22
|
+
|
|
23
|
+
import scanner
|
|
24
|
+
|
|
25
|
+
REFRESH_S = 2.0
|
|
26
|
+
|
|
27
|
+
_DOT = {
|
|
28
|
+
scanner.NEEDS_APPROVAL: "\033[91m●\033[0m", # red
|
|
29
|
+
scanner.NEEDS_ATTENTION: "\033[93m◐\033[0m", # amber
|
|
30
|
+
scanner.WORKING: "\033[93m◐\033[0m", # amber
|
|
31
|
+
scanner.IDLE_DONE: "\033[92m○\033[0m", # green
|
|
32
|
+
}
|
|
33
|
+
_LABEL = {
|
|
34
|
+
scanner.NEEDS_APPROVAL: "NEEDS YOU",
|
|
35
|
+
scanner.NEEDS_ATTENTION: "stalled",
|
|
36
|
+
scanner.WORKING: "working",
|
|
37
|
+
scanner.IDLE_DONE: "done",
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _render_once() -> None:
|
|
42
|
+
sessions = scanner.scan()
|
|
43
|
+
s = scanner.summary(sessions)
|
|
44
|
+
visible = [x for x in sessions if x.triage != scanner.STALE_HIDDEN]
|
|
45
|
+
|
|
46
|
+
sys.stdout.write("\033[2J\033[H") # clear + home
|
|
47
|
+
if s["needs_approval"]:
|
|
48
|
+
head = f"\033[91mARIS-Monitor — ATTENTION {s['needs_approval']} ●\033[0m"
|
|
49
|
+
else:
|
|
50
|
+
head = f"\033[92mARIS-Monitor — all clear ○ 0\033[0m"
|
|
51
|
+
print(head)
|
|
52
|
+
print("-" * 40)
|
|
53
|
+
|
|
54
|
+
if not visible:
|
|
55
|
+
print(" no active Claude sessions")
|
|
56
|
+
for x in visible:
|
|
57
|
+
dot = _DOT.get(x.triage, "?")
|
|
58
|
+
label = _LABEL.get(x.triage, x.triage)
|
|
59
|
+
reason = f" {x.reason}" if (x.triage == scanner.NEEDS_APPROVAL and x.reason) else ""
|
|
60
|
+
print(f" {dot} {x.name[:24]:<24} {label:<10} {scanner.fmt_age(x.idle_seconds):>5}{reason}")
|
|
61
|
+
if s["stale"]:
|
|
62
|
+
print(f" +{s['stale']} stale (hidden)")
|
|
63
|
+
print()
|
|
64
|
+
print("(read-only · refresh 2s · Ctrl-C to quit)")
|
|
65
|
+
sys.stdout.flush()
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def main() -> None:
|
|
69
|
+
try:
|
|
70
|
+
while True:
|
|
71
|
+
try:
|
|
72
|
+
_render_once()
|
|
73
|
+
except Exception:
|
|
74
|
+
pass # a bad scan must never kill the ticker
|
|
75
|
+
time.sleep(REFRESH_S)
|
|
76
|
+
except KeyboardInterrupt:
|
|
77
|
+
print()
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
if __name__ == "__main__":
|
|
81
|
+
main()
|