Not in the top 1,000 by GitHub stars
imraywang/rayskills
Ray 制作的中文 AI Skills:写长文和口播稿、做封面和解说视频、存公众号和 X 草稿。支持 Claude Code、Codex、WorkBuddy。
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
docs/archive/2026-09-22-风格规则旧版/ray-kb/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Local scripts
d2982dd08bca → b57a106e5263
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → d2982dd08bca
No earlier version was observed for comparison.
docs/archive/2026-09-22-风格规则旧版/ray-writer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Local scripts
d2982dd08bca → b57a106e5263
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → d2982dd08bca
No earlier version was observed for comparison.
skills/ray/SKILL.md
Week of Nov 2, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
d2982dd08bca → b57a106e5263
A local comparison is unavailable. You can inspect the recorded versions on GitHub.
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → d2982dd08bca
No earlier version was observed for comparison.
skills/ray-cover/SKILL.md
Week of Nov 2, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
d2982dd08bca → b57a106e5263
A local comparison is unavailable. You can inspect the recorded versions on GitHub.
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → d2982dd08bca
No earlier version was observed for comparison.
skills/ray-explainer/SKILL.md
Week of Nov 2, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
d2982dd08bca → b57a106e5263
A local comparison is unavailable. You can inspect the recorded versions on GitHub.
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → d2982dd08bca
No earlier version was observed for comparison.
skills/ray-kb/SKILL.md
Week of Nov 2, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
d2982dd08bca → b57a106e5263
A local comparison is unavailable. You can inspect the recorded versions on GitHub.
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → d2982dd08bca
No earlier version was observed for comparison.
skills/ray-kepu/SKILL.md
Week of Nov 2, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → b57a106e5263
No earlier version was observed for comparison.
skills/ray-obsidian/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Local scripts
d2982dd08bca → b57a106e5263
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → d2982dd08bca
No earlier version was observed for comparison.
skills/ray-wechat/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Network or broad shell
d2982dd08bca → b57a106e5263
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → d2982dd08bca
No earlier version was observed for comparison.
skills/ray-writer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Local scripts
d2982dd08bca → b57a106e5263
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → d2982dd08bca
No earlier version was observed for comparison.
skills/ray-x-article/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Not checked yet → After Local scripts
d2982dd08bca → b57a106e5263
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Not checked yet
First observation → d2982dd08bca
No earlier version was observed for comparison.
Heat
6.7- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
- ray-kb
docs/archive/2026-09-22-风格规则旧版/ray-kb - ray-writer
docs/archive/2026-09-22-风格规则旧版/ray-writer - ray
skills/ray - ray-cover
skills/ray-cover - ray-explainer
skills/ray-explainer - ray-kb
skills/ray-kb - ray-kepu
skills/ray-kepu - ray-obsidian
skills/ray-obsidian - ray-wechat
skills/ray-wechat - ray-writer
skills/ray-writer - ray-x-article
skills/ray-x-article
How it works
ray-kb
When your agent uses it
把灵感、现场观察或已核验长文变成可直接录制的中文口播:原生快速口播只保留一份母稿,先检索本地知识、再核对近期事实;长文再分发则绑定母稿路径与内容指纹并生成完整口播内容包。也按“停下、听下去、记住、传播”四关审读口播,或对照生成稿与 Ray 的实际录制稿,把稳定差异回写到下一次。用于“这个想法直接做成口播”“把这篇文章改成口播”“审一下这篇口播稿”“对比我录的和你写的”时;不自行增加事实,不自动发布。
What it loads into context
Frontmatter
172 tokensAlways available to the agent
SKILL.md
3,330 tokensWhen the skill is activated
Reference documents
3,800 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 固定原则
- 选择工作模式
- 长文再分发输入门
- 先选视频角度
- 重写为口播
- 口播语气
- 长文再分发输出文件
- 图片长文接口
- 验证与交接
- 口播稿审读
- 录后对照与学习
- 交付要求
Scripts executed separately
oral_script_check.py
Files
SKILL.mdcore12,084 bytesSKILL.mdcore12,084 bytesSKILL.mdcore12,084 bytesfast-oral.mddoc4,560 bytesoral_script_check.pyruns8,876 bytesrecording-feedback.mddoc9,717 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubray-writer
When your agent uses it
把灵感、剪藏审核卡、调研包或已有草稿装配成有事实、有情绪、有网感和传播力的中文长文,接入本地 Obsidian 知识库的成稿、发布与复盘流程;也把外文/他人文章做成带授权署名的译介稿。用于“把这个 idea 写成文章”“写一篇公众号或 X 长文”“检查或重写这篇文章”“翻译/转载这篇文章”时。找不到兼容知识库先转交 ray-obsidian;定稿改口播稿转交 ray-kb;不虚构用户经历,不自动发布,也不使用 WeWrite。
What it loads into context
Frontmatter
160 tokensAlways available to the agent
SKILL.md
4,002 tokensWhen the skill is activated
Reference documents
5,253 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 固定原则
- 先判断任务状态
- 译介模式
- 写作流程
- 参考资料路由
- 交付要求
Scripts executed separately
article_check.py
Files
SKILL.mdcore15,055 bytesSKILL.mdcore15,055 bytesapproved-examples.mddoc5,688 bytesarticle-prototypes.mddoc3,157 bytesarticle_check.pyruns10,476 bytesquality-gates.mddoc4,730 bytesvoice.mddoc6,656 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubray
When your agent uses it
rayskills 总入口:不确定该用哪个 ray-* skill、只丢来一个真实任务,或要把内容从 idea 一路做到草稿箱或口播稿时使用,判断下一步或执行已确认的生产链。“推送”“走完整流程”不等于发布授权。触发:/ray。
What it loads into context
Frontmatter
77 tokensAlways available to the agent
SKILL.md
2,492 tokensWhen the skill is activated
Reference documents
3,130 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 怎么分发
- 工作台任务队列
- 平台动作先分级
- 路由表
- 常见衔接(供判断下一步)
- 边界与纪律
Files
SKILL.mdcore8,878 bytesevals/evals.jsonasset4,983 bytesreferences/content-pipeline.mddoc11,616 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubray-cover
When your agent uses it
给定稿的文章或视频做带中文标题的封面:文章封面分公众号、X、X Article 尺寸出图;视频封面用 Ray 真人照片配大标题,默认 3:4,可出 9:16 和 16:9。能只改局部。用于“做封面”“视频封面”“竖屏封面”“横屏封面”“换个风格再出一版”“封面标题改一下”。不做正文配图和视频画面。
What it loads into context
Frontmatter
118 tokensAlways available to the agent
SKILL.md
2,120 tokensWhen the skill is activated
Reference documents
79,591 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. 读内容
- 2. 写封面文案
- 3. 选风格
- 4. 编译提示词
- 5. 生成
- 6. 验收
- 7. 交付
- 边界
Scripts executed separately
scripts/erase_text.pyscripts/gen_cover.py
Files
SKILL.mdcore7,054 bytesSKILL.mdcore7,054 bytesagents/openai.yamlasset403 bytesassets/punk/LICENSEasset1,067 bytesassets/punk/NOTICE.mddoc1,669 bytesassets/punk/punk-cover/PUNK-COVER.mddoc15,600 bytesassets/punk/punk-cover/references/cover-prompt-blueprint.mddoc6,299 bytesassets/punk/punk-cover/references/style-catalog.mddoc13,143 bytesassets/punk/styles/anthropic-research-style/META.mddoc2,775 bytesassets/punk/styles/anthropic-research-style/STYLE.mddoc4,538 bytesassets/punk/styles/avant-retro-architecture-poster/META.mddoc2,980 bytesassets/punk/styles/avant-retro-architecture-poster/STYLE.mddoc6,358 bytesassets/punk/styles/black-midcentury-modernist-cover/META.mddoc3,348 bytesassets/punk/styles/black-midcentury-modernist-cover/STYLE.mddoc4,078 bytesassets/punk/styles/black-red-silhouette/META.mddoc2,508 bytesassets/punk/styles/black-red-silhouette/STYLE.mddoc3,478 bytesassets/punk/styles/black-white-etching-editorial-cover/META.mddoc7,887 bytesassets/punk/styles/black-white-etching-editorial-cover/STYLE.mddoc6,758 bytesassets/punk/styles/black-white-gray-avant-geometry/META.mddoc1,953 bytesassets/punk/styles/black-white-gray-avant-geometry/STYLE.mddoc1,990 bytesassets/punk/styles/black-white-minimal-concept/META.mddoc1,865 bytesassets/punk/styles/black-white-minimal-concept/STYLE.mddoc1,806 bytesassets/punk/styles/block-world/META.mddoc2,024 bytesassets/punk/styles/block-world/STYLE.mddoc1,652 bytesassets/punk/styles/brand-collaboration-connection/META.mddoc3,016 bytesassets/punk/styles/brand-collaboration-connection/STYLE.mddoc4,405 bytesassets/punk/styles/brick-world/META.mddoc1,853 bytesassets/punk/styles/brick-world/STYLE.mddoc1,686 bytesassets/punk/styles/business-magazine-front-page/META.mddoc2,033 bytesassets/punk/styles/business-magazine-front-page/STYLE.mddoc1,885 bytesassets/punk/styles/color-neo-constructivist-megastructure-poster/META.mddoc2,741 bytesassets/punk/styles/color-neo-constructivist-megastructure-poster/STYLE.mddoc3,991 bytesassets/punk/styles/consulting-report-visual/META.mddoc4,837 bytesassets/punk/styles/consulting-report-visual/STYLE.mddoc7,366 bytesassets/punk/styles/french-minimal-ink-poster/META.mddoc3,367 bytesassets/punk/styles/french-minimal-ink-poster/STYLE.mddoc5,418 bytesassets/punk/styles/giant-perspective-chinese-title/META.mddoc1,929 bytesassets/punk/styles/giant-perspective-chinese-title/STYLE.mddoc1,608 bytesassets/punk/styles/godot-2d-pixel-metaphor-poster/META.mddoc3,710 bytesassets/punk/styles/godot-2d-pixel-metaphor-poster/STYLE.mddoc6,814 bytesassets/punk/styles/interleaved-title-editorial-poster/META.mddoc3,764 bytesassets/punk/styles/interleaved-title-editorial-poster/STYLE.mddoc8,085 bytesassets/punk/styles/kimi-stlye/META.mddoc2,875 bytesassets/punk/styles/kimi-stlye/STYLE.mddoc4,402 bytesassets/punk/styles/layered-paper-cut-concept-poster/META.mddoc3,501 bytesassets/punk/styles/layered-paper-cut-concept-poster/STYLE.mddoc6,645 bytesassets/punk/styles/midcentury-surreal-editorial-cover/META.mddoc3,596 bytesassets/punk/styles/midcentury-surreal-editorial-cover/STYLE.mddoc7,272 bytesassets/punk/styles/minimal-public-space-photography/META.mddoc2,947 bytesassets/punk/styles/minimal-public-space-photography/STYLE.mddoc3,033 bytesassets/punk/styles/minimal-visual-metaphor/META.mddoc3,529 bytesassets/punk/styles/minimal-visual-metaphor/STYLE.mddoc5,899 bytesassets/punk/styles/osb-industrial-blue-line-metaphor/META.mddoc3,662 bytesassets/punk/styles/osb-industrial-blue-line-metaphor/STYLE.mddoc6,301 bytesassets/punk/styles/paper-emboss-deboss-cover/META.mddoc3,455 bytesassets/punk/styles/paper-emboss-deboss-cover/STYLE.mddoc9,364 bytesassets/punk/styles/research-journal-concept/META.mddoc1,971 bytesassets/punk/styles/research-journal-concept/STYLE.mddoc1,931 bytesassets/punk/styles/retro-diffuse-gradient/META.mddoc2,017 bytesassets/punk/styles/retro-diffuse-gradient/STYLE.mddoc1,714 bytesassets/punk/styles/retro-ink-dot-matrix-metaphor/META.mddoc2,933 bytesassets/punk/styles/retro-ink-dot-matrix-metaphor/STYLE.mddoc4,819 bytesassets/punk/styles/retro-japanese-sci-fi-anime-cover/META.mddoc3,113 bytesassets/punk/styles/retro-japanese-sci-fi-anime-cover/STYLE.mddoc4,528 bytesassets/punk/styles/retro-torn-collage/META.mddoc2,019 bytesassets/punk/styles/retro-torn-collage/STYLE.mddoc1,719 bytesassets/punk/styles/semantic-minimal-translation/META.mddoc2,008 bytesassets/punk/styles/semantic-minimal-translation/STYLE.mddoc1,906 bytesassets/punk/styles/silver-foil-blue-minimal/META.mddoc2,801 bytesassets/punk/styles/silver-foil-blue-minimal/STYLE.mddoc4,195 bytesevals/evals.jsonasset3,935 bytesreferences/cover-copy.mddoc2,659 bytesreferences/ip.mddoc1,770 bytesreferences/platform-output.mddoc2,587 bytesreferences/styles.mddoc1,598 bytesreferences/video-cover.mddoc20,742 bytesscripts/erase_text.pyruns1,535 bytesscripts/gen_cover.pyruns12,904 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubray-explainer
When your agent uses it
把文章、观点或录好的口播做成知识解说视频,也把真人口播按风格库剪成片。用于“做成解说视频”“做一期科普视频”“用我的声音配音”“这条口播按某某风格做”,优先于 hyperframes 和 faceless-explainer。只要口播稿转 ray-kb,要封面转 ray-cover;只加字幕或图卡转 embedded-captions / talking-head-recut。
What it loads into context
Frontmatter
114 tokensAlways available to the agent
SKILL.md
3,039 tokensWhen the skill is activated
Reference documents
62,485 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 先选路线
- 链路
- 0. 环境自检
- 1. 读素材,写解说稿
- 2. 配音
- 3. Whisper 校对
- 4. 每一幕的画面
- 5–6. 检查与出片
- 7. 交付说明
- 8–9. 发布包与回流
- 边界
Scripts executed separately
assets/hf-template/build.pyassets/hf-template/host_build.pyassets/hf-template/make_beats.pyassets/huashu/clip.jsassets/huashu/clips/t1_3b1b.jsassets/huashu/clips/t2_keynote_ui.jsassets/huashu/clips/t3_finance_chart.jsassets/huashu/clips/y1_kurzgesagt.jsassets/huashu/clips/y2_vox.jsassets/huashu/clips/y3_whiteboard.jsassets/huashu/clips/y4_storytime.jsassets/huashu/clips/y5_kinetic_type.jsassets/huashu/lib/camera.jsassets/huashu/lib/chart.jsassets/huashu/lib/collage.jsassets/huashu/lib/diagram.jsassets/huashu/lib/fonts.jsassets/huashu/lib/kit.jsassets/huashu/lib/media.jsassets/huashu/lib/motion.jsassets/huashu/lib/paint.jsassets/huashu/lib/palettes.jsassets/huashu/lib/toon.jsassets/huashu/lib/typo.jsassets/huashu/lib/ui.jsassets/huashu/lib/util.jsassets/styles/ali/build.pyassets/styles/ali/make_fonts.shassets/styles/fenping/build.pyassets/styles/fenping/build_scenes.pyassets/styles/fenping/lib/perc.jsassets/styles/fenping/package.jsonassets/styles/fenping/prep.pyassets/styles/guandian/build.pyassets/styles/guandian/package.jsonassets/styles/guandian/prep.pyassets/styles/qingdan/build.pyassets/styles/qingdan/package.jsonassets/styles/qingdan/prep.pyassets/styles/xiaolin/build.pyassets/styles/xiaolin/cut.shassets/styles/xiaolin/make_bg.pyassets/styles/xiaolin/make_fonts.shassets/styles/xiaolin/make_stamps.pyassets/template/kit.jsassets/template/overlay.jsassets/template/patterns.jsassets/template/scenes.example.jsscripts/audio_check.pyscripts/cap_sheet.pyscripts/capture_page.pyscripts/check_clip_slots.pyscripts/check_numbers.pyscripts/check_setup.shscripts/clone_voice.pyscripts/cost.pyscripts/cut_clips.pyscripts/cut_retakes.pyscripts/gate_breaths.pyscripts/gen_bgm.pyscripts/heygen_host.pyscripts/host.pyscripts/lint_readings.pyscripts/make_avatar.pyscripts/minimax_api.pyscripts/mix_bgm.pyscripts/new_project.shscripts/phone_export.pyscripts/publish.pyscripts/qa_tts.pyscripts/qa_video.pyscripts/record_clip.mjsscripts/ref_frames.pyscripts/render.jsscripts/review.pyscripts/review_page.pyscripts/screen_text_check.pyscripts/splice_clips.pyscripts/storyboard.pyscripts/test_hf_anchors.pyscripts/test_hf_template.pyscripts/tts.pyscripts/video_frames.shscripts/voxcpm_worker.pyscripts/web_clip.pyscripts/whole_tts.py
Files
SKILL.mdcore10,004 bytesSKILL.mdcore10,004 bytesSKILL.mdcore10,004 bytesSKILL.mdcore10,004 bytesSKILL.mdcore10,004 bytesSKILL.mdcore10,004 bytesSKILL.mdcore10,004 bytesSKILL.mdcore10,004 bytesSKILL.mdcore10,004 bytesSKILL.mdcore10,004 bytesSKILL.mdcore10,004 bytesSKILL.mdcore10,004 bytesSKILL.mdcore10,004 bytesSKILL.mdcore10,004 bytesSKILL.mdcore10,004 bytesagents/openai.yamlasset324 bytesassets/canvas.jsonasset2,736 bytesassets/hf-template/WORKER.mddoc14,988 bytesassets/hf-template/build.pyruns21,360 bytesassets/hf-template/figures/README.mddoc881 bytesassets/hf-template/figures/designer.svgasset3,609 bytesassets/hf-template/figures/engineer.svgasset2,958 bytesassets/hf-template/figures/hand.svgasset3,265 bytesassets/hf-template/host_build.pyruns12,334 bytesassets/hf-template/make_beats.pyruns6,184 bytesassets/hf-template/style.example.cssasset5,845 bytesassets/huashu/LICENSEasset1,086 bytesassets/huashu/NOTICE.mddoc2,737 bytesassets/huashu/clip.htmlasset1,261 bytesassets/huashu/clip.jsruns11,886 bytesassets/huashu/clips/t1_3b1b.jsruns21,065 bytesassets/huashu/clips/t2_keynote_ui.jsruns36,229 bytesassets/huashu/clips/t3_finance_chart.jsruns21,116 bytesassets/huashu/clips/y1_kurzgesagt.jsruns18,633 bytesassets/huashu/clips/y2_vox.jsruns14,618 bytesassets/huashu/clips/y3_whiteboard.jsruns25,692 bytesassets/huashu/clips/y4_storytime.jsruns22,039 bytesassets/huashu/clips/y5_kinetic_type.jsruns13,745 bytesassets/huashu/lib/camera.jsruns9,762 bytesassets/huashu/lib/chart.jsruns10,870 bytesassets/huashu/lib/collage.jsruns8,972 bytesassets/huashu/lib/diagram.jsruns20,080 bytesassets/huashu/lib/fonts.jsruns2,284 bytesassets/huashu/lib/fonts/EBGaramond-400.woffasset162,740 bytesassets/huashu/lib/fonts/EBGaramond-400i.woffasset151,904 bytesassets/huashu/lib/fonts/Inter-var.woffasset126,688 bytesassets/huashu/lib/fonts/LICENSES.mddoc4,498 bytesassets/huashu/lib/fonts/LXGWWenKai-500.woffasset2,098,296 bytesassets/huashu/lib/fonts/NotoSansSC-500.woffasset1,416,188 bytesassets/huashu/lib/fonts/NotoSansSC-700.woffasset1,425,340 bytesassets/huashu/lib/fonts/NotoSansSC-800.woffasset1,426,988 bytesassets/huashu/lib/fonts/NotoSansSC-900.woffasset1,394,104 bytesassets/huashu/lib/fonts/NotoSansSC-sub.woffasset331,188 bytesassets/huashu/lib/fonts/NotoSerifSC-sub.woffasset435,560 bytesassets/huashu/lib/fonts/RobotoCondensed-var.woffasset94,036 bytesassets/huashu/lib/fonts/cmunrm.woffasset123,340 bytesassets/huashu/lib/fonts/cmunti.woffasset158,668 bytesassets/huashu/lib/kit.jsruns6,639 bytesassets/huashu/lib/media.jsruns8,855 bytesassets/huashu/lib/motion.jsruns9,402 bytesassets/huashu/lib/paint.jsruns15,436 bytesassets/huashu/lib/palettes.jsruns4,876 bytesassets/huashu/lib/toon.jsruns16,043 bytesassets/huashu/lib/typo.jsruns9,998 bytesassets/huashu/lib/ui.jsruns10,548 bytesassets/huashu/lib/util.jsruns7,402 bytesassets/styles/ali/build.pyruns10,657 bytesassets/styles/ali/make_fonts.shruns658 bytesassets/styles/ali/src/template.htmlasset49,116 bytesassets/styles/fenping/assets/audio/click.wavasset9,678 bytesassets/styles/fenping/assets/audio/ding.wavasset134,478 bytesassets/styles/fenping/assets/audio/swell.wavasset499,278 bytesassets/styles/fenping/assets/audio/whoosh.wavasset134,478 bytesassets/styles/fenping/build.pyruns11,014 bytesassets/styles/fenping/build_scenes.pyruns494 bytesassets/styles/fenping/compositions/captions.htmlasset17,668 bytesassets/styles/fenping/compositions/s-curve.htmlasset2,809 bytesassets/styles/fenping/compositions/s-david.htmlasset2,376 bytesassets/styles/fenping/compositions/s-ent.htmlasset5,762 bytesassets/styles/fenping/compositions/s-forty.htmlasset3,042 bytesassets/styles/fenping/compositions/s-grid1.htmlasset6,763 bytesassets/styles/fenping/compositions/s-hero.htmlasset6,029 bytesassets/styles/fenping/compositions/s-mask.htmlasset4,479 bytesassets/styles/fenping/compositions/s-model.htmlasset7,390 bytesassets/styles/fenping/compositions/s-shaft.htmlasset5,786 bytesassets/styles/fenping/compositions/s-share.htmlasset3,528 bytesassets/styles/fenping/compositions/s-stat.htmlasset4,584 bytesassets/styles/fenping/compositions/s-stuck.htmlasset6,231 bytesassets/styles/fenping/compositions/s-term.htmlasset4,692 bytesassets/styles/fenping/compositions/s-unit.htmlasset5,490 bytesassets/styles/fenping/compositions/s-years.htmlasset2,525 bytesassets/styles/fenping/hyperframes.jsonasset318 bytesassets/styles/fenping/index.htmlasset11,251 bytesassets/styles/fenping/lib/perc.jsruns3,292 bytesassets/styles/fenping/meta.jsonasset75 bytesassets/styles/fenping/package.jsonruns291 bytesassets/styles/fenping/prep.pyruns4,981 bytesassets/styles/fenping/scenes_src/s-ent.htmlasset2,483 bytesassets/styles/fenping/scenes_src/s-grid1.htmlasset3,484 bytesassets/styles/fenping/scenes_src/s-hero.htmlasset2,750 bytesassets/styles/fenping/scenes_src/s-stuck.htmlasset2,952 bytesassets/styles/fenping/scenes_src/s-term.htmlasset1,413 bytesassets/styles/fenping/script.jsonasset341 bytesassets/styles/guandian/assets/audio/click.wavasset9,678 bytesassets/styles/guandian/assets/audio/ding.wavasset134,478 bytesassets/styles/guandian/assets/audio/swell.wavasset499,278 bytesassets/styles/guandian/assets/audio/whoosh.wavasset134,478 bytesassets/styles/guandian/build.pyruns47,864 bytesassets/styles/guandian/compositions/captions.htmlasset41,211 bytesassets/styles/guandian/compositions/cta.htmlasset10,998 bytesassets/styles/guandian/compositions/hook.htmlasset11,050 bytesassets/styles/guandian/compositions/l1.htmlasset12,740 bytesassets/styles/guandian/compositions/l2.htmlasset13,506 bytesassets/styles/guandian/compositions/l3.htmlasset13,111 bytesassets/styles/guandian/compositions/l4.htmlasset13,911 bytesassets/styles/guandian/compositions/l5.htmlasset14,778 bytesassets/styles/guandian/hyperframes.jsonasset318 bytesassets/styles/guandian/index.htmlasset12,918 bytesassets/styles/guandian/meta.jsonasset75 bytesassets/styles/guandian/package.jsonruns291 bytesassets/styles/guandian/prep.pyruns6,428 bytesassets/styles/guandian/script.jsonasset507 bytesassets/styles/qingdan/assets/audio/click.wavasset9,678 bytesassets/styles/qingdan/assets/audio/ding.wavasset134,478 bytesassets/styles/qingdan/assets/audio/swell.wavasset499,278 bytesassets/styles/qingdan/assets/audio/whoosh.wavasset134,478 bytesassets/styles/qingdan/assets/img/.gitkeepasset0 bytesassets/styles/qingdan/build.pyruns33,251 bytesassets/styles/qingdan/compositions/captions.htmlasset13,226 bytesassets/styles/qingdan/compositions/cta.htmlasset2,003 bytesassets/styles/qingdan/compositions/hook.htmlasset4,635 bytesassets/styles/qingdan/compositions/n1.htmlasset2,127 bytesassets/styles/qingdan/compositions/n2.htmlasset2,077 bytesassets/styles/qingdan/compositions/n3.htmlasset2,201 bytesassets/styles/qingdan/compositions/n4.htmlasset2,151 bytesassets/styles/qingdan/compositions/p1.htmlasset4,102 bytesassets/styles/qingdan/compositions/p2.htmlasset3,515 bytesassets/styles/qingdan/compositions/p3.htmlasset3,481 bytesassets/styles/qingdan/compositions/p4.htmlasset2,827 bytesassets/styles/qingdan/compositions/recap.htmlasset3,934 bytesassets/styles/qingdan/hyperframes.jsonasset318 bytesassets/styles/qingdan/index.htmlasset12,414 bytesassets/styles/qingdan/meta.jsonasset75 bytesassets/styles/qingdan/package.jsonruns291 bytesassets/styles/qingdan/prep.pyruns6,370 bytesassets/styles/qingdan/script.jsonasset478 bytesassets/styles/xiaolin/build.pyruns7,033 bytesassets/styles/xiaolin/cut.shruns1,858 bytesassets/styles/xiaolin/make_bg.pyruns908 bytesassets/styles/xiaolin/make_fonts.shruns1,106 bytesassets/styles/xiaolin/make_stamps.pyruns2,976 bytesassets/styles/xiaolin/src/template.htmlasset47,298 bytesassets/template/kit.jsruns16,378 bytesassets/template/overlay.jsruns13,668 bytesassets/template/patterns.jsruns31,597 bytesassets/template/scenes.example.jsruns19,294 bytesassets/template/script.example.jsonasset9,653 bytesassets/template/script.patterns.example.jsonasset18,369 bytesassets/template/script.template.jsonasset557 bytesassets/template/video.htmlasset401 bytesevals/evals.jsonasset8,376 bytesreferences/grammars.mddoc11,385 bytesreferences/host.mddoc11,293 bytesreferences/hyperframes.mddoc24,794 bytesreferences/ip-style.mddoc5,372 bytesreferences/kit-api.mddoc4,290 bytesreferences/patterns.mddoc7,166 bytesreferences/publish.mddoc3,477 bytesreferences/qa.mddoc3,720 bytesreferences/real-footage.mddoc2,611 bytesreferences/recorded-footage.mddoc3,377 bytesreferences/script-rules.mddoc8,066 bytesreferences/storyboard.mddoc5,688 bytesreferences/style-refs.mddoc14,108 bytesreferences/styles/README.mddoc3,828 bytesreferences/styles/ali.mddoc10,828 bytesreferences/styles/fenping.mddoc9,721 bytesreferences/styles/guandian.mddoc11,497 bytesreferences/styles/qingdan.mddoc9,205 bytesreferences/styles/xiaolin.mddoc15,891 bytesreferences/voice.mddoc6,694 bytesscripts/NOTICE-video-short.mddoc1,567 bytesscripts/audio_check.pyruns3,634 bytesscripts/cap_sheet.pyruns3,083 bytesscripts/capture_page.pyruns2,539 bytesscripts/check_clip_slots.pyruns1,595 bytesscripts/check_numbers.pyruns4,648 bytesscripts/check_setup.shruns4,732 bytesscripts/clone_voice.pyruns4,105 bytesscripts/cost.pyruns2,840 bytesscripts/cut_clips.pyruns4,425 bytesscripts/cut_retakes.pyruns14,499 bytesscripts/gate_breaths.pyruns4,922 bytesscripts/gen_bgm.pyruns3,832 bytesscripts/heygen_host.pyruns4,375 bytesscripts/host.pyruns19,804 bytesscripts/lint_readings.pyruns6,727 bytesscripts/make_avatar.pyruns7,220 bytesscripts/minimax_api.pyruns3,360 bytesscripts/mix_bgm.pyruns5,011 bytesscripts/new_project.shruns1,551 bytesscripts/phone_export.pyruns2,089 bytesscripts/publish.pyruns9,400 bytesscripts/qa_tts.pyruns7,143 bytesscripts/qa_video.pyruns10,665 bytesscripts/record_clip.mjsruns8,097 bytesscripts/ref_frames.pyruns3,680 bytesscripts/render.jsruns17,934 bytesscripts/review.pyruns4,082 bytesscripts/review_page.pyruns26,822 bytesscripts/screen_text_check.pyruns2,583 bytesscripts/splice_clips.pyruns4,926 bytesscripts/storyboard.pyruns8,333 bytesscripts/test_hf_anchors.pyruns5,808 bytesscripts/test_hf_template.pyruns4,479 bytesscripts/tts.pyruns13,808 bytesscripts/video_frames.shruns756 bytesscripts/voxcpm_worker.pyruns4,067 bytesscripts/web_clip.pyruns10,316 bytesscripts/whole_tts.pyruns8,105 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubray-kb
When your agent uses it
把灵感、观察或长文写成 Ray 能直接开机录的中文口播稿(Ray 口吻、观点说满,存疑处列进「待确认」);也审读口播稿,或对照录制稿学习 Ray 的真实表达。用于“做成口播”“改成口播”“审一下口播稿”“对比我录的”。讲清一件事、以讲解为主的科普视频稿不在这里(装了 ray-kepu 时转它)。不发布。
What it loads into context
Frontmatter
126 tokensAlways available to the agent
SKILL.md
1,760 tokensWhen the skill is activated
Reference documents
7,453 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 唯一的风格约束
- 固定原则
- 选择工作模式
- 长文再分发
- 验证与交接
- 口播稿审读
- 录后对照与学习
- 交付要求
Scripts executed separately
scripts/oral_script_check.pyscripts/test_oral_script_check.py
Files
SKILL.mdcore6,292 bytesSKILL.mdcore6,292 bytesagents/openai.yamlasset247 bytesevals/evals.jsonasset11,120 bytesreferences/fast-oral.mddoc6,504 bytesreferences/recording-feedback.mddoc3,532 bytesreferences/script-review.mddoc6,892 bytesreferences/voice.mddoc8,807 bytesscripts/oral_script_check.pyruns5,824 bytesscripts/test_oral_script_check.pyruns7,555 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubray-kepu
When your agent uses it
把一件事、一个原理、一份新数据写成科普讲解视频的旁白稿:站在讲解者的位置让观众看懂、学到一个带得走的东西、觉得值得收藏转发,而不是 Ray 下判断。用于“做一期科普”“讲清楚这个原理”“科普视频的稿子”“讲解向”“改成科普版”。Ray 本人出镜说观点转 ray-kb;稿子定了做成视频转 ray-explainer。不发布。
What it loads into context
Frontmatter
124 tokensAlways available to the agent
SKILL.md
1,899 tokensWhen the skill is activated
Reference documents
10,374 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 动笔前
- 写成什么
- 检查与交接
Scripts executed separately
../ray-kb/scripts/oral_script_check.py
Files
../ray-explainer/references/script-rules.mddoc8,066 bytes../ray-kb/references/fast-oral.mddoc6,504 bytes../ray-kb/scripts/oral_script_check.pyruns5,824 bytesSKILL.mdcore6,557 bytesSKILL.mdcore6,557 bytesagents/openai.yamlasset300 bytesevals/evals.jsonasset3,408 bytesreferences/style.mddoc20,940 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubray-obsidian
When your agent uses it
新建、检查或适配面向内容生产的 Obsidian 知识库结构(资料、知识、选题、写作、发布、回流)。用于“搭一个 Obsidian 知识库”“把 vault 接入内容管线”“检查知识库结构”,或 ray-writer 找不到知识库时。只补缺失结构,不动已有笔记。
What it loads into context
Frontmatter
91 tokensAlways available to the agent
SKILL.md
1,327 tokensWhen the skill is activated
Reference documents
8,795 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 固定原则
- 1. 确定知识库根目录
- 2. 先检查,后初始化
- 3. 安全初始化
- 4. 复核真实结果
- 5. 交接内容生产
- 完成标准
Scripts executed separately
scripts/test_vault_setup.pyscripts/vault_setup.py
Files
SKILL.mdcore4,825 bytesSKILL.mdcore4,825 bytesSKILL.mdcore4,825 bytesSKILL.mdcore4,825 bytesagents/openai.yamlasset255 bytesassets/vault-template/00-入口/10-工作台/创作工作台.mddoc862 bytesassets/vault-template/00-入口/10-工作台/知识工作台.mddoc543 bytesassets/vault-template/10-创作/10-灵感/inbox.mddoc128 bytesassets/vault-template/20-知识/README.mddoc751 bytesassets/vault-template/30-资料/00-待抓取/链接收件箱.mddoc190 bytesassets/vault-template/50-系统/10-文档/知识库设计说明.mddoc643 bytesassets/vault-template/50-系统/20-流程/个人知识库工作流.mddoc2,417 bytesassets/vault-template/50-系统/30-模板/内容反馈.mddoc722 bytesassets/vault-template/50-系统/30-模板/内容成稿包.mddoc1,897 bytesassets/vault-template/50-系统/30-模板/内容生产最小包/00-使用说明.mddoc4,519 bytesassets/vault-template/50-系统/30-模板/内容生产最小包/10-原始素材.mddoc841 bytesassets/vault-template/50-系统/30-模板/内容生产最小包/20-审核卡.mddoc796 bytesassets/vault-template/50-系统/30-模板/内容生产最小包/30-候选角度.mddoc816 bytesassets/vault-template/50-系统/30-模板/内容生产最小包/40-写作任务.mddoc1,266 bytesassets/vault-template/50-系统/30-模板/内容生产最小包/50-母稿.mddoc743 bytesassets/vault-template/50-系统/30-模板/内容生产最小包/60-发布反馈.mddoc683 bytesassets/vault-template/50-系统/30-模板/口播视频反馈.mddoc2,587 bytesassets/vault-template/50-系统/30-模板/当前关注.mddoc986 bytesassets/vault-template/50-系统/30-模板/快速口播母稿.mddoc1,621 bytesassets/vault-template/HOME.mddoc630 bytesevals/evals.jsonasset2,686 bytesreferences/migration.mddoc2,137 bytesreferences/vault-schema.mddoc4,836 bytesscripts/test_vault_setup.pyruns3,515 bytesscripts/vault_setup.pyruns7,273 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubray-wechat
When your agent uses it
把定稿长文排成手机友好的公众号富文本并生成预览;Ray 明确同意后写入或更新公众号草稿箱并回读核对。用于“公众号排版”“推到公众号草稿箱”“更新微信草稿”。含糊说法先只做预览;不发布、不群发。
What it loads into context
Frontmatter
82 tokensAlways available to the agent
SKILL.md
3,577 tokensWhen the skill is activated
Reference documents
3,373 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 固定边界
- 0. 先判定授权
- 1. 读取当前状态
- 2. 生成排版与预览
- 3. 本地交付门
- 4. 创建或更新草稿
- 5. 最终验收
- 参考资料路由
- 交付要求
Scripts executed separately
scripts/prepare_article.pyscripts/render_article.pyscripts/wechat_draft.pyscripts/wechat_egress.pyscripts/wechat_images.py
Files
SKILL.mdcore13,491 bytesSKILL.mdcore13,491 bytesSKILL.mdcore13,491 bytesSKILL.mdcore13,491 bytesSKILL.mdcore13,491 bytesSKILL.mdcore13,491 bytesSKILL.mdcore13,491 bytesagents/openai.yamlasset339 bytesevals/evals.jsonasset9,241 bytesreferences/layout-contract.mddoc2,560 bytesreferences/ray-themes.jsonasset7,552 bytesreferences/recovery-runbook.mddoc4,582 bytesreferences/theme-library.mddoc1,946 bytesreferences/wechat-api.mddoc2,885 bytesscripts/prepare_article.pyruns15,952 bytesscripts/render_article.pyruns14,820 bytesscripts/wechat_draft.pyruns18,701 bytesscripts/wechat_egress.pyruns8,189 bytesscripts/wechat_images.pyruns6,708 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubray-writer
When your agent uses it
把灵感、剪藏、调研或草稿写成有 Ray 态度的中文长文(公众号 / X 长文),接入知识库的成稿与发布流程;也做带授权署名的译介稿。用于“写成文章”“写一篇公众号或 X 长文”“重写这篇”“翻译转载”。改口播转 ray-kb;不发布。
What it loads into context
Frontmatter
96 tokensAlways available to the agent
SKILL.md
2,232 tokensWhen the skill is activated
Reference documents
4,084 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 唯一的风格约束
- 固定原则
- 先判断任务状态
- 译介模式
- 写作流程
- 参考资料路由
- 交付要求
Scripts executed separately
scripts/article_check.py
Files
SKILL.mdcore8,085 bytesSKILL.mdcore8,085 bytesagents/openai.yamlasset219 bytesevals/evals.jsonasset7,159 bytesreferences/knowledge-pipeline.mddoc3,359 bytesreferences/quality-gates.mddoc1,474 bytesreferences/translation.mddoc6,305 bytesreferences/voice.mddoc3,598 bytesscripts/article_check.pyruns9,173 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubray-x-article
When your agent uses it
把完成的长文和 5:2 封面写进已登录的 X Articles 后台存为草稿,核对预览并把草稿地址回写知识库。用于“放进 X 后台”“存为 X Article 草稿”“推送到 X”。只存草稿:不点 Publish,不重复建同题草稿。
What it loads into context
Frontmatter
87 tokensAlways available to the agent
SKILL.md
3,473 tokensWhen the skill is activated
Reference documents
4,259 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 固定边界
- 0. 先判定授权
- 1. 准备交付包
- 2. 进入 X Articles
- 3. 写入草稿
- 4. 验证草稿
- 5. 回写知识库
- 交付要求
Scripts executed separately
scripts/prepare_article.pyscripts/record_draft.pytests/test_prepare_article_tables.py
Files
SKILL.mdcore12,667 bytesSKILL.mdcore12,667 bytesSKILL.mdcore12,667 bytesagents/openai.yamlasset245 bytesevals/evals.jsonasset6,537 bytesreferences/browser-capability.mddoc2,783 bytesreferences/recovery-runbook.mddoc5,189 bytesreferences/x-editor-contract.mddoc7,589 bytesscripts/prepare_article.pyruns17,419 bytesscripts/record_draft.pyruns2,293 bytestests/test_prepare_article_tables.pyruns2,215 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubSkills included
- ray-kb
- ray-writer
- ray
- ray-cover
- ray-explainer
- ray-kb
- ray-kepu
- ray-obsidian
- ray-wechat
- ray-writer
- ray-x-article
Repository facts
- License
- No license detected
- Created
- Jul 13, 2026
- Last pushed
- Nov 5, 2026
- Forks
- 50
- Open issues
- 0
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 5, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 45 notes
docs/archive/2026-09-22-风格规则旧版/ray-kb/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddocs/archive/2026-09-22-风格规则旧版/ray-kb/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzeddocs/archive/2026-09-22-风格规则旧版/ray-writer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/ray-cover/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/ray-explainer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/ray-explainer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/ray-explainer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/ray-explainer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/ray-explainer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/ray-explainer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/ray-explainer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/ray-explainer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/ray-explainer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/ray-explainer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/ray-explainer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/ray-explainer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/ray-explainer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/ray-explainer/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/ray-explainer/assets/styles/guandian/compositions/cta.html:28Analysis incomplete: physical or joined line exceeds character limitskills/ray-explainer/assets/styles/guandian/compositions/cta.html:29Analysis incomplete: physical or joined line exceeds character limit
- No broad tool permissions
- 4 dangerous shell commandsin 2 files: ray-explainer/scripts/check_setup.sh:25 ray-explainer/scripts/video_frames.sh:10
- 256 network referencesin 66 files: ray-explainer/scripts/review_page.py:1 ray-explainer/scripts/web_clip.py:45 ray-explainer/references/hyperframes.md:31 and 63 more
- 4 obfuscation signalsin 4 files: ray-cover/scripts/gen_cover.py:82 ray-explainer/assets/styles/guandian/build.py:458 ray-explainer/scripts/tts.py:103 and 1 more
- No instruction overrides
- 104 executable scriptsin 103 files: ray-kb/scripts/oral_script_check.py:1 ray-kb/oral_script_check.py:1 ray-writer/article_check.py:1 and 100 more
- 72 references to secretsin 22 files: ray-wechat/scripts/wechat_draft.py:41 ray-explainer/scripts/check_setup.sh:25 ray-cover/scripts/gen_cover.py:7 and 19 more
- No requests to vote in Hot
Show all 440 signals by file
docs/archive/2026-09-22-风格规则旧版/ray-kb/oral_script_check.py
- Executable scriptline 1
#!/usr/bin/env python3
docs/archive/2026-09-22-风格规则旧版/ray-writer/article_check.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/ray-cover/SKILL.md
- Access to secretsline 53
[Credential-related source omitted]
skills/ray-cover/assets/punk/NOTICE.md
- Network accessline 3
本目录取自 [adrianpunk/Punk-Skill](https://github.com/adrianpunk/Punk-Skill) 的 `v1.0.0-mit` 标签(commit `0380629`,2026-09-07),遵循 MIT 许可,原文见同目录 `LICENSE`。提示词设计与风格方向:Adrian Punk([@AdrianPunk115](https://x.com/AdrianPunk115))。
skills/ray-cover/scripts/erase_text.py
- Executable scriptline 1
Executable file
skills/ray-cover/scripts/gen_cover.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 7
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 53
[Credential-related source omitted] - Network accessline 61
[Credential-related source omitted] - Access to secretsline 61
[Credential-related source omitted] - Network accessline 62
[Credential-related source omitted] - Access to secretsline 62
[Credential-related source omitted] - Network accessline 63
[Credential-related source omitted] - Possible obfuscationline 82
open(os.path.join(cover_dir, f"raw-{plat}.png"), "wb").write(base64.b64decode(d["data"][0]["b64_json"])) - Access to secretsline 167
[Credential-related source omitted] - Access to secretsline 170
[Credential-related source omitted]
skills/ray-explainer/SKILL.md
- Access to secretsline 47
[Credential-related source omitted]
skills/ray-explainer/assets/hf-template/build.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 20
[Credential-related source omitted] - Network accessline 209
<meta charset="UTF-8" /> <meta name="viewport" content="width={CW}, height={CH}" /> <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script> - Network accessline 210
<meta name="viewport" content="width={CW}, height={CH}" /> <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script> <script src="assets/beats.js"></script> - Network accessline 211
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
skills/ray-explainer/assets/hf-template/figures/designer.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 420">
skills/ray-explainer/assets/hf-template/figures/engineer.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 420">
skills/ray-explainer/assets/hf-template/figures/hand.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 180 270">
skills/ray-explainer/assets/hf-template/host_build.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/ray-explainer/assets/hf-template/make_beats.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/ray-explainer/assets/huashu/NOTICE.md
- Network accessline 3
本目录是 [alchaincyf/huashu-art-motion](https://github.com/alchaincyf/huashu-art-motion) 中“参数化解说片段”部分的拷贝,取自 commit `64cb272`(2026-10-13,上游 v1.0.0;上一次同步是 `f178bd7`,2026-10-08),遵循 MIT 许可,原文见同目录 `LICENSE`。字体各自遵循 SIL OFL 1.1,清单见 `lib/fonts/LICENSES
skills/ray-explainer/assets/huashu/clip.js
- Executable scriptline 1
Executable file - Network accessline 33
const u = new URLSearchParams(location.search).get('spec'); if (!u) return fail('没有 spec:render.py --spec 会注入 window.CLIP_SPEC;预览用 clip.html?spec=examples/<名>.json'); spec = await (await fetch(u)).json(); - Network accessline 34
if (!u) return fail('没有 spec:render.py --spec 会注入 window.CLIP_SPEC;预览用 clip.html?spec=examples/<名>.json'); spec = await (await fetch(u)).json(); const base = u.replace(/[^/]*$/, ''); - Network accessline 35
spec = await (await fetch(u)).json();
skills/ray-explainer/assets/huashu/clips/t1_3b1b.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/clips/t2_keynote_ui.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/clips/t3_finance_chart.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/clips/y1_kurzgesagt.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/clips/y2_vox.js
- Executable scriptline 1
Executable file - Network accessline 50
items.forEach((it, i) => { if (it.kind === 'image') { it.done = it.q.at + 0.6; return; } const nC = [...(it.q.text || '')].length, next = items[i + 1] ? items[i + 1].q.at : ctx.dur; - Network accessline 51
if (it.kind === 'image') { it.done = it.q.at + 0.6; return; } const nC = [...(it.q.text || '')].length, next = items[i + 1] ? items[i + 1].q.at : ctx.dur; it.cps = clamp(nC / Math.max(0.3, next - it.q.at - 0.95 - 0.5), 13, 40); - Network accessline 52
const nC = [...(it.q.text || '')].length, next = items[i + 1] ? items[i + 1].q.at : ctx.dur; - Network accessline 53
it.cps = clamp(nC / Math.max(0.3, next - it.q.at - 0.95 - 0.5), 13, 40); - Network accessline 54
it.done = it.q.at + nC / it.cps + 0.5;
skills/ray-explainer/assets/huashu/clips/y3_whiteboard.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/clips/y4_storytime.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/clips/y5_kinetic_type.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/lib/camera.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/lib/chart.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/lib/collage.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/lib/diagram.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/lib/fonts.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/lib/kit.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/lib/media.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/lib/motion.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/lib/paint.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/lib/palettes.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/lib/toon.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/lib/typo.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/lib/ui.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/huashu/lib/util.js
- Executable scriptline 1
Executable file - Network accessline 46
const inflate = async (buf) => new Uint8Array(await new Response(new Blob([buf]).stream().pipeThrough(new DecompressionStream('deflate'))).arrayBuffer()); async function readCmap(url) { const ab = await (await fetch(url)).arrayBuffer(), d - Network accessline 47
async function readCmap(url) { const ab = await (await fetch(url)).arrayBuffer(), dv = new DataView(ab), sig = dv.getUint32(0); let tab = null; - Network accessline 48
const ab = await (await fetch(url)).arrayBuffer(), dv = new DataView(ab), sig = dv.getUint32(0);
skills/ray-explainer/assets/styles/ali/build.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/ray-explainer/assets/styles/ali/make_fonts.sh
- Executable scriptline 1
#!/usr/bin/env bash - Network accessline 2
# Subset Noto Sans SC Bold / Medium to the glyphs build.py wrote into chars.txt. # usage: bash make_fonts.sh <dir holding NotoSansSC-Bold.otf and NotoSansSC-Medium.otf> # Fonts (OFL): https://github.com/notofonts/noto-cjk/tree/main/Sans/Sub - Network accessline 4
# Fonts (OFL): https://github.com/notofonts/noto-cjk/tree/main/Sans/SubsetOTF/SC
skills/ray-explainer/assets/styles/fenping/build.py
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/styles/fenping/build_scenes.py
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/styles/fenping/compositions/s-ent.html
- Network accessline 20
function mulberry32(a) { return function () { a |= 0; a = a + 0x6D2B79F5 | 0; let t = Math.imul(a ^ a >>> 15, 1 | a); t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t; return ((t ^ t >>> 14) >>> 0) / 4294967296; }; } function makeGrid(svgId, - Network accessline 21
function makeGrid(svgId, C, R, seed, x0, y0, gap) { const NS = "http://www.w3.org/2000/svg", svg = document.getElementById(svgId), rnd = mulberry32(seed); const gE = document.createElementNS(NS, "g"), gN = document.createElement - Network accessline 22
const NS = "http://www.w3.org/2000/svg", svg = document.getElementById(svgId), rnd = mulberry32(seed);
skills/ray-explainer/assets/styles/fenping/compositions/s-grid1.html
- Network accessline 35
function mulberry32(a) { return function () { a |= 0; a = a + 0x6D2B79F5 | 0; let t = Math.imul(a ^ a >>> 15, 1 | a); t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t; return ((t ^ t >>> 14) >>> 0) / 4294967296; }; } function makeGrid(svgId, - Network accessline 36
function makeGrid(svgId, C, R, seed, x0, y0, gap) { const NS = "http://www.w3.org/2000/svg", svg = document.getElementById(svgId), rnd = mulberry32(seed); const gE = document.createElementNS(NS, "g"), gN = document.createElement - Network accessline 37
const NS = "http://www.w3.org/2000/svg", svg = document.getElementById(svgId), rnd = mulberry32(seed);
skills/ray-explainer/assets/styles/fenping/compositions/s-hero.html
- Network accessline 21
function mulberry32(a) { return function () { a |= 0; a = a + 0x6D2B79F5 | 0; let t = Math.imul(a ^ a >>> 15, 1 | a); t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t; return ((t ^ t >>> 14) >>> 0) / 4294967296; }; } function makeGrid(svgId, - Network accessline 22
function makeGrid(svgId, C, R, seed, x0, y0, gap) { const NS = "http://www.w3.org/2000/svg", svg = document.getElementById(svgId), rnd = mulberry32(seed); const gE = document.createElementNS(NS, "g"), gN = document.createElement - Network accessline 23
const NS = "http://www.w3.org/2000/svg", svg = document.getElementById(svgId), rnd = mulberry32(seed);
skills/ray-explainer/assets/styles/fenping/compositions/s-mask.html
- Network accessline 30
<script> // 场景从 70.1 秒开始。九条弯曲细管代表滤芯里的通道,固定几条中途被堵 const NS = "http://www.w3.org/2000/svg"; - Network accessline 31
// 场景从 70.1 秒开始。九条弯曲细管代表滤芯里的通道,固定几条中途被堵 const NS = "http://www.w3.org/2000/svg"; const paths = document.getElementById("mk-paths"); - Network accessline 32
const NS = "http://www.w3.org/2000/svg";
skills/ray-explainer/assets/styles/fenping/compositions/s-stuck.html
- Network accessline 22
function mulberry32(a) { return function () { a |= 0; a = a + 0x6D2B79F5 | 0; let t = Math.imul(a ^ a >>> 15, 1 | a); t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t; return ((t ^ t >>> 14) >>> 0) / 4294967296; }; } function makeGrid(svgId, - Network accessline 23
function makeGrid(svgId, C, R, seed, x0, y0, gap) { const NS = "http://www.w3.org/2000/svg", svg = document.getElementById(svgId), rnd = mulberry32(seed); const gE = document.createElementNS(NS, "g"), gN = document.createElement - Network accessline 24
const NS = "http://www.w3.org/2000/svg", svg = document.getElementById(svgId), rnd = mulberry32(seed);
skills/ray-explainer/assets/styles/fenping/compositions/s-term.html
- Network accessline 13
function mulberry32(a) { return function () { a |= 0; a = a + 0x6D2B79F5 | 0; let t = Math.imul(a ^ a >>> 15, 1 | a); t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t; return ((t ^ t >>> 14) >>> 0) / 4294967296; }; } function makeGrid(svgId, - Network accessline 14
function makeGrid(svgId, C, R, seed, x0, y0, gap) { const NS = "http://www.w3.org/2000/svg", svg = document.getElementById(svgId), rnd = mulberry32(seed); const gE = document.createElementNS(NS, "g"), gN = document.createElement - Network accessline 15
const NS = "http://www.w3.org/2000/svg", svg = document.getElementById(svgId), rnd = mulberry32(seed);
skills/ray-explainer/assets/styles/fenping/hyperframes.json
skills/ray-explainer/assets/styles/fenping/index.html
- Network accessline 4
<meta charset="UTF-8" /> <meta name="viewport" content="width=1080, height=1920" /> <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script> - Network accessline 5
<meta name="viewport" content="width=1080, height=1920" /> <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script> <style> - Network accessline 6
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
skills/ray-explainer/assets/styles/fenping/lib/perc.js
- Executable scriptline 1
Executable file - Network accessline 2
function mulberry32(a) { return function () { a |= 0; a = a + 0x6D2B79F5 | 0; let t = Math.imul(a ^ a >>> 15, 1 | a); t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t; return ((t ^ t >>> 14) >>> 0) / 4294967296; }; } function makeGrid(svgId, - Network accessline 3
function makeGrid(svgId, C, R, seed, x0, y0, gap) { const NS = "http://www.w3.org/2000/svg", svg = document.getElementById(svgId), rnd = mulberry32(seed); const gE = document.createElementNS(NS, "g"), gN = document.createElement - Network accessline 4
const NS = "http://www.w3.org/2000/svg", svg = document.getElementById(svgId), rnd = mulberry32(seed);
skills/ray-explainer/assets/styles/fenping/package.json
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/styles/fenping/prep.py
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/styles/guandian/build.py
- Executable scriptline 1
Executable file - Possible obfuscationline 458
body = f""" <svg id="cta-burst" class="burst" viewBox="0 0 800 800" opacity="0"><line x1="400" y1="250" x2="400" y2="10" stroke="{GREEN}" stroke-width="10" stroke-linecap="round" transform="rotate(0 400 400)"/><line x1="400" y1="250" x2= - Network accessline 541
<meta charset="UTF-8" /> <meta name="viewport" content="width=1080, height=1920" /> <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script> - Network accessline 542
<meta name="viewport" content="width=1080, height=1920" /> <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script> <style> - Network accessline 543
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
skills/ray-explainer/assets/styles/guandian/hyperframes.json
skills/ray-explainer/assets/styles/guandian/index.html
- Network accessline 4
<meta charset="UTF-8" /> <meta name="viewport" content="width=1080, height=1920" /> <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script> - Network accessline 5
<meta name="viewport" content="width=1080, height=1920" /> <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script> <style> - Network accessline 6
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
skills/ray-explainer/assets/styles/guandian/package.json
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/styles/guandian/prep.py
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/styles/qingdan/build.py
- Executable scriptline 1
Executable file - Network accessline 420
<meta charset="UTF-8" /> <meta name="viewport" content="width=1080, height=1920" /> <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script> - Network accessline 421
<meta name="viewport" content="width=1080, height=1920" /> <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script> <style> - Network accessline 422
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
skills/ray-explainer/assets/styles/qingdan/hyperframes.json
skills/ray-explainer/assets/styles/qingdan/index.html
- Network accessline 4
<meta charset="UTF-8" /> <meta name="viewport" content="width=1080, height=1920" /> <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script> - Network accessline 5
<meta name="viewport" content="width=1080, height=1920" /> <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script> <style> - Network accessline 6
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
skills/ray-explainer/assets/styles/qingdan/package.json
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/styles/qingdan/prep.py
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/styles/xiaolin/build.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/ray-explainer/assets/styles/xiaolin/cut.sh
- Executable scriptline 1
#!/bin/bash
skills/ray-explainer/assets/styles/xiaolin/make_bg.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/ray-explainer/assets/styles/xiaolin/make_fonts.sh
- Executable scriptline 1
#!/usr/bin/env bash - Network accessline 4
set -euo pipefail mkdir -p fontdl assets/fonts B=https://raw.githubusercontent.com - Network accessline 5
mkdir -p fontdl assets/fonts B=https://raw.githubusercontent.com [ -f fontdl/NotoSansSC-Black.otf ] || curl -sL -o fontdl/NotoSansSC-Black.otf $B/notofonts/noto-cjk/main/Sans/SubsetOTF/SC/NotoSansSC-Black.otf - Network accessline 6
B=https://raw.githubusercontent.com [ -f fontdl/NotoSansSC-Black.otf ] || curl -sL -o fontdl/NotoSansSC-Black.otf $B/notofonts/noto-cjk/main/Sans/SubsetOTF/SC/NotoSansSC-Black.otf [ -f fontdl/MaShanZheng-Regular.ttf ] || curl -sL -o fontdl/ - Network accessline 7
[ -f fontdl/NotoSansSC-Black.otf ] || curl -sL -o fontdl/NotoSansSC-Black.otf $B/notofonts/noto-cjk/main/Sans/SubsetOTF/SC/NotoSansSC-Black.otf - Network accessline 8
[ -f fontdl/MaShanZheng-Regular.ttf ] || curl -sL -o fontdl/MaShanZheng-Regular.ttf $B/google/fonts/main/ofl/mashanzheng/MaShanZheng-Regular.ttf - Network accessline 9
for w in Medium:500 Bold:700 Black:900; do f=fontdl/NotoSansSC-${w%%:*}.otf [ -f $f ] || curl -sL -o $f $B/notofonts/noto-cjk/main/Sans/SubsetOTF/SC/NotoSansSC-${w%%:*}.otf - Network accessline 10
f=fontdl/NotoSansSC-${w%%:*}.otf [ -f $f ] || curl -sL -o $f $B/notofonts/noto-cjk/main/Sans/SubsetOTF/SC/NotoSansSC-${w%%:*}.otf [ -f assets/fonts/NotoSansSC-${w##*:}.woff ] || pyftsubset $f --unicodes="*" --flavor=woff --output-file=a - Network accessline 11
[ -f $f ] || curl -sL -o $f $B/notofonts/noto-cjk/main/Sans/SubsetOTF/SC/NotoSansSC-${w%%:*}.otf
skills/ray-explainer/assets/styles/xiaolin/make_stamps.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/ray-explainer/assets/template/kit.js
- Executable scriptline 1
Executable file - Network accessline 224
await Promise.all(['bold 60px "Hannotate SC"', '60px "Hannotate SC"', 'bold 60px "HanziPen SC"'].map(f => document.fonts.load(f, '测试中文'))); if (window.RXO) await RXO.ready; if (!window.SCRIPT) { try { window.SCRIPT = await (await fetch( - Network accessline 225
if (window.RXO) await RXO.ready; if (!window.SCRIPT) { try { window.SCRIPT = await (await fetch('script.json')).json(); } catch (e) { /* file:// preview: patterns need the http server (render.js serve) */ } } paperTex = makePaper(); - Network accessline 226
if (!window.SCRIPT) { try { window.SCRIPT = await (await fetch('script.json')).json(); } catch (e) { /* file:// preview: patterns need the http server (render.js serve) */ } }
skills/ray-explainer/assets/template/overlay.js
- Executable scriptline 1
Executable file - Network accessline 55
const loadImg = u => new Promise((res, rej) => { const im = new Image(); im.onload = () => res(im); im.onerror = () => rej(u); im.src = u; }); async function hostInit() { try { const r = await fetch('/host/plan.json'); if (!r.ok) retu - Network accessline 56
async function hostInit() { try { const r = await fetch('/host/plan.json'); if (!r.ok) return; HOST = await r.json(); } catch (e) { return; } const A = HOST.avatar; HIMG.base = await loadImg(A.dir + 'base.png'); - Network accessline 57
try { const r = await fetch('/host/plan.json'); if (!r.ok) return; HOST = await r.json(); } catch (e) { return; }
skills/ray-explainer/assets/template/patterns.js
- Executable scriptline 1
Executable file
skills/ray-explainer/assets/template/scenes.example.js
- Executable scriptline 1
Executable file
skills/ray-explainer/references/host.md
- Access to secretsline 24
[Credential-related source omitted] - Network accessline 59
- **前提**:`heygen` CLI(官方安装脚本 `https://static.heygen.ai/cli/install.sh`,装到 `~/.local/bin`,脚本自带校验和),Ray 自己 `heygen auth login --oauth` 登录(订阅里的 premium credits,Creator 档每月 600)。账号里的头像组「Ray」:Digital Twin look `ce23779e68024ae2bec3482eba810404`(
skills/ray-explainer/references/hyperframes.md
- Network accessline 31
- **先列真实素材清单,再写画面**:分镜关之前,按[真实画面优先](real-footage.md)给每一幕找素材,写进 `footage`。找的顺序: 1. **动态**:Ray 自己的录屏 / 口播 / 已发视频;本机实跑(终端、网页操作用 `record_clip.mjs` 或 puppeteer 录屏);产品官方演示和发布会片段;新闻画面;被讨论的那条视频本身的片段。B 站视频 `yt-dlp` 不登录就能下到 1080p,**前提是版本够新**:报 HTTP - Network accessline 32
1. **动态**:Ray 自己的录屏 / 口播 / 已发视频;本机实跑(终端、网页操作用 `record_clip.mjs` 或 puppeteer 录屏);产品官方演示和发布会片段;新闻画面;被讨论的那条视频本身的片段。B 站视频 `yt-dlp` 不登录就能下到 1080p,**前提是版本够新**:报 HTTP 412 就是 yt-dlp 太旧、被风控拦了,不是要登录(2026-10-15、10-17 旧版 2026.02.21 全部 412,2026.08.19 正常 - Network accessline 39
素材一律下到 `~/Movies/ray-explainer/<项目>/hf/assets/`(视频工程里),不进 Obsidian vault;来源(链接、作者、日期、授权)记进 `credits.json`;画面里标「来源 · 日期」。缺的素材在分镜表里写明,问 Ray 要(他手机里的截图、录屏常常就有)。 - **股价走势用真实日收盘价**:A 股、港股用东方财富 kline 接口(`push2his.eastmoney.com/api/qt/stock/kline/g - Network accessline 40
- **股价走势用真实日收盘价**:A 股、港股用东方财富 kline 接口(`push2his.eastmoney.com/api/qt/stock/kline/get`,`secid` 沪市 `1.`、深市 `0.`、港股 `116.`),美股用 Yahoo `query1.finance.yahoo.com/v8/finance/chart/<代码>`,存成 `data/<公司>.csv`(`date,close`),抽两三天和另一家对一下。片中写「截至某日收盘」;稿子 - Network accessline 41
- **标题和钩子里的数字先核一手数据**:GitHub 星数用 OSS Insight `https://api.ossinsight.io/v1/repos/<owner>/<repo>/stargazers/history?per=day&from=YYYY-MM-DD&to=YYYY-MM-DD`(累计值,末日和 GitHub 实时值对得上就可信)。核出来和 Ray 的标题不一样(“三天 3w”实际是 8 万),在对话里提出并给替代标题,由 Ray 定。 - Network accessline 45
- **取材失败按固定顺序兜底**,不要每次现查(2026-10-15《AI 游客》一期四处卡住都是这几类): - **视频**:先确认 yt-dlp 是新版(`yt-dlp --version` ≥ 2026.08,或直接 `uvx --from yt-dlp@latest yt-dlp`)→ 失败(412 / 403 / 要登录):B 站用 `web_clip.py --bili` 整段取流,其他站用 `web_clip.py --js` 在 Ray 的 Chrome - Network accessline 46
[Credential-related source omitted] - Access to secretsline 46
[Credential-related source omitted] - Network accessline 47
- **书封**:先按 ISBN 取 Amazon 图片 CDN `https://images-na.ssl-images-amazon.com/images/P/<ISBN-10>.01.L.jpg`(要 ISBN-10;拿到 1×1 的空图说明这一版没有,换版次的 ISBN)→ 再试出版社官网 → 最后 Open Library。archive.org、covers.openlibrary.org 在本机常被代理规则走直连后断开(`SSL_ERROR_SYSCALL`) - Network accessline 49
- **带弹窗的新闻页**(广告拦截提示、订阅墙、Cookie 横幅):不要整页截图,改成对正文段落、图表的元素截图(`el.screenshot()`);只隐藏弹窗本身和 `body` 的滚动锁,不要按 class 批量隐藏,a16z 页面就因为隐藏过头把正文也藏没了。 - **每张截图存下来立刻用 Read 看一眼**:空白、只剩弹窗、被裁到半句的当场重截,别等到草图或成片才发现。 - **Wikimedia Commons**:用 API 查 `imageinfo& - Network accessline 50
- **每张截图存下来立刻用 Read 看一眼**:空白、只剩弹窗、被裁到半句的当场重截,别等到草图或成片才发现。 - **Wikimedia Commons**:用 API 查 `imageinfo&iiurlwidth=1920` 拿 `thumburl`(只有标准尺寸能下),curl 必须带 User-Agent,否则返回 HTML 报错页。授权和作者写进项目的 `credits.json`,CC BY-SA 的发布时在简介里署名。 - **会动的网页(交互图解、Web - Network accessline 51
- **Wikimedia Commons**:用 API 查 `imageinfo&iiurlwidth=1920` 拿 `thumburl`(只有标准尺寸能下),curl 必须带 User-Agent,否则返回 HTML 报错页。授权和作者写进项目的 `credits.json`,CC BY-SA 的发布时在简介里署名。 - Network accessline 54
- **原声**(采访、任务录音、档案音频):先 `python3 $SK/scripts/cut_clips.py --words <录音> --from <h:m:s> --to <h:m:s>` 拿词级时间戳找准起止,把来源文件和片段写进 `clips[].cut`(`file`、`base`、`segs`,见脚本文件头),再 `cut_clips.py <project>` 一次切好全部 `clips/<id>.wav`(淡入淡出、拼接、响度统一);改片段只改 `se - Network accessline 56
- **配乐(ElevenLabs Music,2026-10-24 起 Ray 更偏好)**:本地配乐被 Ray 说过「盖过人声、节奏不对」,Lex 那期起改用 ElevenLabs Music 按章节作曲。`POST https://api.elevenlabs.io/v1/music`,`model_id: music_v1`,`composition_plan` 里写全片风格(`positive_global_styles` / `negative_global_st
skills/ray-explainer/references/style-refs.md
- Network accessline 29
- 来源:《AI巨头们之间的资本混战,到底是个什么情况?》https://www.youtube.com/watch?v=OcKl98ZQbMQ (2026-07,19:28)。抽帧 2026-10-14,12 帧,720p。 - Network accessline 37
- 来源:《收割世界20年后,英伟达的护城河没了》https://www.bilibili.com/video/BV1irhB6mEuX (2026-09,13:21)。抽帧 2026-10-14,12 帧,1080p。 - Network accessline 45
- 来源:《为什么AI生成视频的运动这么离谱?》https://www.bilibili.com/video/BV1PpkmYQE5b (2024-12,12:23);《AI怎么让NS方程爆炸的?》https://www.bilibili.com/video/BV1jWhD6mEwH (2026-09,41:00,帧文件名 `ns-` 开头)。抽帧 2026-10-14,1080p。 - Network accessline 53
- 来源:《Large Language Models explained briefly》https://www.youtube.com/watch?v=LPZh9BOjkQs 。抽帧 2026-10-14,12 帧,720p。 - Network accessline 61
- 来源:《The moment we stopped understanding AI [AlexNet]》https://www.youtube.com/watch?v=UZDiGooFs54 (2024-07,17:38)。抽帧 2026-10-14,12 帧,720p。 - Network accessline 69
- 来源:《Tragic mistake... Anthropic leaks Claude's source code》https://www.youtube.com/watch?v=mBHRPeg8zPU (2026-04,7:22)。抽帧 2026-10-14,12 帧,720p。 - Network accessline 77
- 来源:《連億萬富翁都在聽!他花 9 年讀 400 本傳記,把一人 Podcast 做到極致》 https://youtu.be/OVYhO19IThc (2026-10-19,9:54)。抽帧 2026-10-23,每 10 秒一帧共 57 帧,选 12 帧存档,720p。 - Network accessline 97
- `kurzgesagt` · Kurzgesagt《AI Slop Is Destroying The Internet》https://www.youtube.com/watch?v=_zfN9wnPvU0 :高饱和蓝紫扁平插画、一个视觉隐喻撑一镜。构图可学,配色和 IP 相反(成片检查 `qa_video.py` 也会对蓝紫报警)。 - Network accessline 98
- `polymatter` · PolyMatter《Why "Learn to Code" Failed》https://www.youtube.com/watch?v=bThPluSzlDU :以实拍素材为主;图表只用一种底色 + 白线,品牌 logo 直接当数据点。 - Network accessline 99
- `vox` · Vox《AI can do your homework. Now what?》https://www.youtube.com/watch?v=bEJ0_TVXh-I :拼贴、圆形抠像头像、人名小标签、右上角台标。
skills/ray-explainer/references/styles/ali.md
skills/ray-explainer/references/styles/fenping.md
- Network accessline 3
学的是 Instagram reel https://www.instagram.com/reel/DPoXbzZjb8J/。做法是真人口播打底,按说的内容在三种版式之间切换,配逐词组字幕。
skills/ray-explainer/references/styles/qingdan.md
- Network accessline 3
学的是 Brock Mesarich 的 YouTube Shorts《5 个 GitHub 仓库》,https://www.youtube.com/shorts/rxOcBowQcS0 。拆解在知识库 `50-系统/10-文档/清单口播包装拆解.md`。
skills/ray-explainer/references/styles/xiaolin.md
- Network accessline 3
学的是小Lin说 2026-09 到 10 月的三期: - 史上最大现金收购案:https://www.youtube.com/watch?v=wu0zS1AuI_E - Network accessline 4
- 史上最大现金收购案:https://www.youtube.com/watch?v=wu0zS1AuI_E - Network accessline 5
- 俄乌打了四年多谁在买单:https://www.youtube.com/watch?v=R1-j8TFlqCo - Network accessline 6
- 特朗普关税被判违法:https://www.youtube.com/watch?v=T7z71yENz94
skills/ray-explainer/references/voice.md
- Network accessline 25
| 值 | 是什么 | 要点 | |---|---|---| | `voices.json` 里注册过的名字,例如 `"ray"` | Ray 的复刻音色,直接调 MiniMax API 的 `speech-2.8-hd`(`scripts/minimax_api.py`) | 新项目模板的默认值,语速 1.1(Ray 2026-10-13 定)。需要 `MINIMAX_API_KEY`;国内平台的 key 另设 `MINIMAX_API_HOST=https://api.m - Network accessline 26
|---|---|---| | `voices.json` 里注册过的名字,例如 `"ray"` | Ray 的复刻音色,直接调 MiniMax API 的 `speech-2.8-hd`(`scripts/minimax_api.py`) | 新项目模板的默认值,语速 1.1(Ray 2026-10-13 定)。需要 `MINIMAX_API_KEY`;国内平台的 key 另设 `MINIMAX_API_HOST=https://api.minimax.cn`。国内账号偶尔 - Network accessline 27
[Credential-related source omitted] - Access to secretsline 27
[Credential-related source omitted]
skills/ray-explainer/scripts/NOTICE-video-short.md
- Network accessline 3
`review_page.py` and `review.py` (review page), `qa_video.py` (render checks), `cut_retakes.py` (retake / dead-air cutting rules) and `capture_page.py` (page capture) adapt code and ideas from https://github.com/petergyang/video-short - Network accessline 4
cutting rules) and `capture_page.py` (page capture) adapt code and ideas from https://github.com/petergyang/video-short
skills/ray-explainer/scripts/audio_check.py
- Executable scriptline 1
Executable file
skills/ray-explainer/scripts/cap_sheet.py
- Executable scriptline 1
Executable file
skills/ray-explainer/scripts/capture_page.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 2
"""Capture a web page as one tall PNG at the video's width, so its text reflows to fit and no line is cut off at the frame edge; the video then drifts slowly down one complete section of it (never a still screenshot cropped by hand). From P - Network accessline 4
From Peter Yang's video-short capture.py (MIT, https://github.com/petergyang/video-short), with a landscape width.
skills/ray-explainer/scripts/check_clip_slots.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/ray-explainer/scripts/check_numbers.py
- Executable scriptline 1
Executable file - Access to secretsline 3
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 35
[Credential-related source omitted] - Access to secretsline 36
[Credential-related source omitted] - Network accessline 42
subprocess.run(["ffmpeg", "-loglevel", "error", "-y", "-ss", str(t_from), "-t", str(dur), "-i", WAV, f.name], check=True) body = {"contents": [{"parts": [{"inline_data": {"mime_type": "audio/mp3", "data": base64.b64encode(open(f.nam - Network accessline 43
body = {"contents": [{"parts": [{"inline_data": {"mime_type": "audio/mp3", "data": base64.b64encode(open(f.name, "rb").read()).decode()}}, {"text": ASK}]}]} req = urllib.request.Request(f"https://generativelanguage.googleapis.com/v1beta - Network accessline 44
req = urllib.request.Request(f"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key={key}", - Network accessline 46
return json.load(urllib.request.urlopen(req, timeout=60))["candidates"][0]["content"]["parts"][0]["text"].strip()
skills/ray-explainer/scripts/check_setup.sh
- Executable scriptline 1
#!/usr/bin/env bash - Dangerous shell operationline 25
[Credential-related source omitted] - Access to secretsline 25
[Credential-related source omitted] - Dangerous shell operationline 27
[Credential-related source omitted] - Access to secretsline 27
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Dangerous shell operationline 31
[Credential-related source omitted] - Network accessline 31
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Network accessline 32
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Network accessline 33
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 35
[Credential-related source omitted]
skills/ray-explainer/scripts/clone_voice.py
- Executable scriptline 1
Executable file - Access to secretsline 18
[Credential-related source omitted] - Network accessline 48
demo = minimax_api.clone(fid, vid, TEST, TTS_MODEL) print("voice_id", vid) if demo: urllib.request.urlretrieve(demo, os.path.join(SAMPLES, f"{a.name}_preview.mp3")) - Network accessline 50
if demo: urllib.request.urlretrieve(demo, os.path.join(SAMPLES, f"{a.name}_preview.mp3"))
skills/ray-explainer/scripts/cost.py
- Executable scriptline 1
Executable file
skills/ray-explainer/scripts/cut_clips.py
- Executable scriptline 1
Executable file
skills/ray-explainer/scripts/cut_retakes.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 2
"""Tighten Ray's raw talking-head recording: drop retakes, false starts and dead air, cutting only between words. Approach from Peter Yang's video-short (MIT, https://github.com/petergyang/video-short): keep the last complete take of - Network accessline 3
Approach from Peter Yang's video-short (MIT, https://github.com/petergyang/video-short): keep the last complete take of
skills/ray-explainer/scripts/gate_breaths.py
- Executable scriptline 1
Executable file
skills/ray-explainer/scripts/gen_bgm.py
- Executable scriptline 1
Executable file - Network accessline 8
(timeline.json duration + 6 s, so the tail can fade). Instrumental only. - Writes <project>/bgm/<name>_<seed>.wav plus listen/<...>.m4a for Ray to audition. ~4 min for 3 × 3-minute tracks on an M4 Pro. Install once: git clone https://github - Network accessline 9
- Writes <project>/bgm/<name>_<seed>.wav plus listen/<...>.m4a for Ray to audition. ~4 min for 3 × 3-minute tracks on an M4 Pro. Install once: git clone https://github.com/ACE-Step/ACE-Step-1.5 ~/projects/ACE-Step-1.5 && cd there && uv sync - Network accessline 10
Install once: git clone https://github.com/ACE-Step/ACE-Step-1.5 ~/projects/ACE-Step-1.5 && cd there && uv sync; - Access to secretsline 15
[Credential-related source omitted] - Access to secretsline 37
[Credential-related source omitted]
skills/ray-explainer/scripts/heygen_host.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 53
while (r := heygen("background-removal", "get", job_id)["data"])["status"] not in ("completed", "failed"): time.sleep(10) url = r["layers"]["foreground"]; url = url if isinstance(url, str) else url.get("url") subprocess.run( - Network accessline 54
url = r["layers"]["foreground"]; url = url if isinstance(url, str) else url.get("url") subprocess.run(["curl", "-sL", "-o", os.path.join(H, f"{name}-foreground.webm"), url], check=True) return name, s, e - Network accessline 55
subprocess.run(["curl", "-sL", "-o", os.path.join(H, f"{name}-foreground.webm"), url], check=True)
skills/ray-explainer/scripts/host.py
- Executable scriptline 1
Executable file - Access to secretsline 12
[Credential-related source omitted] - Access to secretsline 36
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Network accessline 108
def h3_call(method, path, body=None): sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))); import minimax_api as mm req = urllib.request.Request(mm.HOST + path, json.dumps(body).encode() if body else None, method=method, - Network accessline 109
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))); import minimax_api as mm req = urllib.request.Request(mm.HOST + path, json.dumps(body).encode() if body else None, method=method, headers={ - Network accessline 110
req = urllib.request.Request(mm.HOST + path, json.dumps(body).encode() if body else None, method=method, - Network accessline 111
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Network accessline 112
try: return json.load(urllib.request.urlopen(req, timeout=120)) - Network accessline 120
for _ in range(240): time.sleep(10); t = h3_call("GET", f"/v2/query/video_generation/{tid}")["task"] if t["status"] == "succeeded": urllib.request.urlretrieve(t["content"]["url"], out); return t.get("usage", {}) - Network accessline 121
time.sleep(10); t = h3_call("GET", f"/v2/query/video_generation/{tid}")["task"] if t["status"] == "succeeded": urllib.request.urlretrieve(t["content"]["url"], out); return t.get("usage", {}) if t["status"] == "failed": sys.e - Network accessline 122
if t["status"] == "succeeded": urllib.request.urlretrieve(t["content"]["url"], out); return t.get("usage", {}) - Access to secretsline 154
[Credential-related source omitted] - Network accessline 155
print(f"Kling 生成段落 {i}({L:.1f}s)…", flush=True) r = fal_client.subscribe(MODEL, arguments={"image_url": fal_client.upload_file(flat), "audio_url": fal_client.upload_file(wav), "prompt": PROMPT}) urllib.request.urlret - Network accessline 156
r = fal_client.subscribe(MODEL, arguments={"image_url": fal_client.upload_file(flat), "audio_url": fal_client.upload_file(wav), "prompt": PROMPT}) urllib.request.urlretrieve(r["video"]["url"], mp4) usage[key] = {"mod - Network accessline 157
urllib.request.urlretrieve(r["video"]["url"], mp4)
skills/ray-explainer/scripts/lint_readings.py
- Executable scriptline 1
Executable file
skills/ray-explainer/scripts/make_avatar.py
- Executable scriptline 1
Executable file - Access to secretsline 31
[Credential-related source omitted] - Network accessline 40
paths = [] for i, im in enumerate(r["images"]): p = out.format(i=i); urllib.request.urlretrieve(im["url"], p); paths.append(p) - Network accessline 41
for i, im in enumerate(r["images"]): p = out.format(i=i); urllib.request.urlretrieve(im["url"], p); paths.append(p) return paths - Network accessline 42
p = out.format(i=i); urllib.request.urlretrieve(im["url"], p); paths.append(p) - Access to secretsline 47
[Credential-related source omitted] - Access to secretsline 49
[Credential-related source omitted]
skills/ray-explainer/scripts/minimax_api.py
- Executable scriptline 1
Executable file - Network accessline 3
[Credential-related source omitted] - Access to secretsline 3
[Credential-related source omitted] - Network accessline 4
Host: MINIMAX_API_HOST (env or ~/.zshrc), default https://api.minimax.io (international). Keys from the - Network accessline 5
mainland-China platform (platform.minimax.cn) only work on https://api.minimax.cn — same paths and fields. - Access to secretsline 12
[Credential-related source omitted] - Network accessline 22
HOST = _env("MINIMAX_API_HOST", "https://api.minimax.io").rstrip("/") - Network accessline 25
def _call(path, body=None, data=None, ctype="application/json", timeout=180): req = urllib.request.Request(HOST + path, data if data is not None else json.dumps(body).encode(), - Network accessline 26
req = urllib.request.Request(HOST + path, data if data is not None else json.dumps(body).encode(), - Network accessline 27
[Credential-related source omitted] - Access to secretsline 27
[Credential-related source omitted] - Network accessline 28
r = json.load(urllib.request.urlopen(req, timeout=timeout))
skills/ray-explainer/scripts/mix_bgm.py
skills/ray-explainer/scripts/new_project.sh
- Executable scriptline 1
#!/usr/bin/env bash
skills/ray-explainer/scripts/phone_export.py
- Executable scriptline 1
Executable file
skills/ray-explainer/scripts/publish.py
skills/ray-explainer/scripts/qa_tts.py
- Executable scriptline 1
Executable file
skills/ray-explainer/scripts/qa_video.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 2
"""Measure a finished render and export frames to look at, before Ray sees it. One command after every render. Idea and the frame exports from Peter Yang's video-short qa.py (MIT, https://github.com/petergyang/video-short); the - Network accessline 3
Idea and the frame exports from Peter Yang's video-short qa.py (MIT, https://github.com/petergyang/video-short); the
skills/ray-explainer/scripts/record_clip.mjs
- Executable scriptline 1
Executable file
skills/ray-explainer/scripts/ref_frames.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 17
[Credential-related source omitted] - Network accessline 25
const c=document.createElement('canvas');c.width=960;c.height=Math.round(960*v.videoHeight/v.videoWidth);c.getContext('2d').drawImage(v,0,0,c.width,c.height); const b=await new Promise(r=>c.toBlob(r,'image/jpeg',.85)); o.push(t.toFixed(0)+' - Network accessline 26
const b=await new Promise(r=>c.toBlob(r,'image/jpeg',.85)); o.push(t.toFixed(0)+'s '+v.videoWidth+'x'+v.videoHeight+' '+await fetch('http://127.0.0.1:%d/save?name='+p+'-'+String(k).padStart(2,'0')+'.jpg',{method:'POST',body:b}).then(r=>r.te - Network accessline 27
o.push(t.toFixed(0)+'s '+v.videoWidth+'x'+v.videoHeight+' '+await fetch('http://127.0.0.1:%d/save?name='+p+'-'+String(k).padStart(2,'0')+'.jpg',{method:'POST',body:b}).then(r=>r.text()).catch(e=>'ERR '+e.message))}return o}; - Access to secretsline 35
[Credential-related source omitted]
skills/ray-explainer/scripts/render.js
- Executable scriptline 1
Executable file - Network accessline 143
if (mode === 'gate') return gate(path.join(PROJ, arg || 'out.mp4')); for (const s of SCRIPT.scenes) if (s.grammar && !fs.existsSync(path.join(HUASHU, 'clips', s.grammar + '.js'))) throw new Error(`scene ${s.id}: unknown grammar ${s.gramma - Network accessline 144
for (const s of SCRIPT.scenes) if (s.grammar && !fs.existsSync(path.join(HUASHU, 'clips', s.grammar + '.js'))) throw new Error(`scene ${s.id}: unknown grammar ${s.grammar}`); const srv = await serve(), port = srv.address().port, base = `h - Network accessline 145
const srv = await serve(), port = srv.address().port, base = `http://127.0.0.1:${port}`;
skills/ray-explainer/scripts/review.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/ray-explainer/scripts/review_page.py
- Network accessline 1
"""Review page: one player with a scene timeline. Ray pauses (or keeps playing), comments on any frame and clicks 发送. serve() saves the notes as markdown with a still of each commented frame, prints them, and exits. Adapted from Peter Yang' - Executable scriptline 1
Executable file - Network accessline 2
serve() saves the notes as markdown with a still of each commented frame, prints them, and exits. Adapted from Peter Yang's video-short (MIT, https://github.com/petergyang/video-short, scripts/review_page.py): Chinese UI, optional Tailscale - Network accessline 3
Adapted from Peter Yang's video-short (MIT, https://github.com/petergyang/video-short, scripts/review_page.py): - Network accessline 49
.icon-btn:hover { border-color: var(--strong-border); color: var(--strong-txt); } .push { margin-left: auto; } .speed { padding: 3px 22px 3px 10px; border: 1px solid var(--strong-border); border-radius: 999px; background: var(--card) url("d - Network accessline 50
.push { margin-left: auto; } .speed { padding: 3px 22px 3px 10px; border: 1px solid var(--strong-border); border-radius: 999px; background: var(--card) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5'%3 - Network accessline 51
.speed { padding: 3px 22px 3px 10px; border: 1px solid var(--strong-border); border-radius: 999px; background: var(--card) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5'%3E%3Cpath d='M0 0l4 5 4-5z' fi - Network accessline 203
$("send").disabled = true; $("status").textContent = "发送中…"; try { const r = await fetch("/api/feedback", { method: "POST", headers: { "Content-Type": "application/json" }, - Network accessline 204
try { const r = await fetch("/api/feedback", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ video: v.getAttribute("src").split("?")[0], comments: state.comments, overall: state.overall.tr - Network accessline 205
const r = await fetch("/api/feedback", { method: "POST", headers: { "Content-Type": "application/json" }, - Network accessline 217
setInterval(async () => { try { const { version: now } = await (await fetch("/api/version")).json(); - Network accessline 218
try { const { version: now } = await (await fetch("/api/version")).json(); if (version === null) version = now; - Network accessline 219
const { version: now } = await (await fetch("/api/version")).json(); - Network accessline 372
server, open_browser = ThreadingHTTPServer(("127.0.0.1", 0), Handler), True rel = os.path.relpath(page, root) url = f"http://127.0.0.1:{server.server_port}/" + rel - Network accessline 373
rel = os.path.relpath(page, root) url = f"http://127.0.0.1:{server.server_port}/" + rel threading.Thread(target=server.serve_forever, daemon=True).start() - Network accessline 374
url = f"http://127.0.0.1:{server.server_port}/" + rel - Network accessline 382
threading.Thread(target=ts.serve_forever, daemon=True).start() servers.append(ts) print(f"手机审片(需连着 Tailscale):http://{ip}:{server.server_port}/{rel}", flush=True) - Network accessline 383
servers.append(ts) print(f"手机审片(需连着 Tailscale):http://{ip}:{server.server_port}/{rel}", flush=True) except OSError as e: - Network accessline 384
print(f"手机审片(需连着 Tailscale):http://{ip}:{server.server_port}/{rel}", flush=True)
skills/ray-explainer/scripts/screen_text_check.py
- Executable scriptline 1
Executable file
skills/ray-explainer/scripts/splice_clips.py
- Executable scriptline 1
Executable file
skills/ray-explainer/scripts/storyboard.py
- Executable scriptline 1
Executable file
skills/ray-explainer/scripts/test_hf_anchors.py
- Executable scriptline 1
Executable file
skills/ray-explainer/scripts/test_hf_template.py
- Executable scriptline 1
Executable file
skills/ray-explainer/scripts/tts.py
- Executable scriptline 1
Executable file - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Access to secretsline 97
[Credential-related source omitted] - Network accessline 99
"generationConfig": {"responseModalities": ["AUDIO"], "speechConfig": { "voiceConfig": {"prebuiltVoiceConfig": {"voiceName": VOICE_ID}}}}}).encode() url = f"https://generativelanguage.googleapis.com/v1beta/mod - Network accessline 100
"voiceConfig": {"prebuiltVoiceConfig": {"voiceName": VOICE_ID}}}}}).encode() url = f"https://generativelanguage.googleapis.com/v1beta/models/{MODEL}:generateContent?key={key}" d = json.load(urllib.request.urlopen(urllib.request.Requ - Network accessline 101
url = f"https://generativelanguage.googleapis.com/v1beta/models/{MODEL}:generateContent?key={key}" d = json.load(urllib.request.urlopen(urllib.request.Request(url, body, {"Content-Type": "application/json"}), timeout=120)) to_wav24k - Network accessline 102
d = json.load(urllib.request.urlopen(urllib.request.Request(url, body, {"Content-Type": "application/json"}), timeout=120)) - Possible obfuscationline 103
to_wav24k(base64.b64decode(d["candidates"][0]["content"]["parts"][0]["inlineData"]["data"]), out) - Access to secretsline 116
[Credential-related source omitted] - Network accessline 120
r = fal_client.subscribe(MODEL, arguments={"prompt": text, "voice_setting": vs, "language_boost": "Chinese", "audio_setting": {"format": "mp3", "sample_rate": 32000, "channel": 1}, "output_form - Network accessline 121
"audio_setting": {"format": "mp3", "sample_rate": 32000, "channel": 1}, "output_format": "url"}) to_wav24k(urllib.request.urlopen(r["audio"]["url"], timeout=120).read(), out) return {"chars": len(text), "ms": r.get("duration_ms", 0) - Network accessline 122
to_wav24k(urllib.request.urlopen(r["audio"]["url"], timeout=120).read(), out)
skills/ray-explainer/scripts/video_frames.sh
skills/ray-explainer/scripts/voxcpm_worker.py
- Executable scriptline 1
Executable file
skills/ray-explainer/scripts/web_clip.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 45
rec.stop();v.pause();await done;const t1=v.currentTime; const meta={url:location.href,title:document.title,start,duration:dur,recorded_from:t0,recorded_to:t1,size:[v.videoWidth,v.videoHeight],mime:mt}; const q='http://127.0.0.1:%d/save?name - Network accessline 46
const meta={url:location.href,title:document.title,start,duration:dur,recorded_from:t0,recorded_to:t1,size:[v.videoWidth,v.videoHeight],mime:mt}; const q='http://127.0.0.1:%d/save?name='+encodeURIComponent(name)+'&meta='+encodeURIComponent( - Network accessline 47
const q='http://127.0.0.1:%d/save?name='+encodeURIComponent(name)+'&meta='+encodeURIComponent(JSON.stringify(meta)); S('upload');return await fetch(q,{method:'POST',body:new Blob(ch,{type:mt})}).then(r=>r.text()).catch(e=>'ERR '+e.message)} - Network accessline 48
S('upload');return await fetch(q,{method:'POST',body:new Blob(ch,{type:mt})}).then(r=>r.text()).catch(e=>'ERR '+e.message)}; - Network accessline 51
BILI_JS = r"""window.__clip={state:'wait'};(async()=>{const S=x=>window.__clip.state=x,name='%s',bv='%s',part=%d; const j=async u=>(await fetch(u,{credentials:'include'})).json(); - Network accessline 52
const j=async u=>(await fetch(u,{credentials:'include'})).json(); - Network accessline 53
const info=(await j('https://api.bilibili.com/x/web-interface/view?bvid='+bv)).data;const cid=(info.pages[part-1]||info.pages[0]).cid; - Network accessline 54
const d=(await j(`https://api.bilibili.com/x/player/playurl?bvid=${bv}&cid=${cid}&qn=80&fnval=16`)).data.dash; - Network accessline 55
const v=d.video.filter(x=>x.codecs.startsWith('avc')).sort((a,b)=>b.height-a.height||b.bandwidth-a.bandwidth)[0]; const a=d.audio.slice().sort((x,y)=>y.bandwidth-x.bandwidth)[0]; for(const [k,s] of [['v',v],['a',a]]){S('download '+k);const - Network accessline 56
const a=d.audio.slice().sort((x,y)=>y.bandwidth-x.bandwidth)[0]; for(const [k,s] of [['v',v],['a',a]]){S('download '+k);const r=await fetch(s.baseUrl||s.base_url);if(!r.ok)throw new Error(k+' HTTP '+r.status); const tot=+r.headers.get('con - Network accessline 57
for(const [k,s] of [['v',v],['a',a]]){S('download '+k);const r=await fetch(s.baseUrl||s.base_url);if(!r.ok)throw new Error(k+' HTTP '+r.status); - Network accessline 58
const tot=+r.headers.get('content-length')||0,rd=r.body.getReader(),ch=[];let n=0; for(;;){const {done,value}=await rd.read();if(done)break;ch.push(value);n+=value.length;window.__clip.progress=k+' '+(n/1048576).toFixed(1)+(tot?'/'+(tot/10 - Network accessline 59
for(;;){const {done,value}=await rd.read();if(done)break;ch.push(value);n+=value.length;window.__clip.progress=k+' '+(n/1048576).toFixed(1)+(tot?'/'+(tot/1048576).toFixed(1):'')+' MB'} S('upload '+k);const t=await (await fetch('http://127. - Network accessline 60
S('upload '+k);const t=await (await fetch('http://127.0.0.1:%d/part?name='+name+'&k='+k,{method:'POST',body:new Blob(ch)})).text();if(!t.startsWith('ok'))throw new Error(t)} - Network accessline 61
const meta={url:'https://www.bilibili.com/video/'+bv+(part>1?'?p='+part:''),title:info.title,owner:info.owner.name,pubdate:new Date(info.pubdate*1000).toISOString().slice(0,10), size:[v.width,v.height],codecs:[v.codecs,a.codecs],duration:d - Network accessline 62
size:[v.width,v.height],codecs:[v.codecs,a.codecs],duration:d.duration}; S('mux');return (await fetch('http://127.0.0.1:%d/mux?name='+name+'&meta='+encodeURIComponent(JSON.stringify(meta)),{method:'POST'})).text()})() .then(r=>{window.__cli - Network accessline 63
S('mux');return (await fetch('http://127.0.0.1:%d/mux?name='+name+'&meta='+encodeURIComponent(JSON.stringify(meta)),{method:'POST'})).text()})()
skills/ray-explainer/scripts/whole_tts.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 50
import urllib.request key = os.environ["ELEVENLABS_API_KEY"] url = f"https://api.elevenlabs.io/v1/text-to-speech/{ELEVEN[0]}?output_format=mp3_44100_128" - Network accessline 51
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Network accessline 52
url = f"https://api.elevenlabs.io/v1/text-to-speech/{ELEVEN[0]}?output_format=mp3_44100_128" req = urllib.request.Request(url, data=json.dumps({"text": (TAG + " " + text) if TAG else text, "model_id": ELEVEN[1]}).encode(), - Network accessline 53
req = urllib.request.Request(url, data=json.dumps({"text": (TAG + " " + text) if TAG else text, "model_id": ELEVEN[1]}).encode(), - Network accessline 54
[Credential-related source omitted] - Network accessline 55
for k in range(4): try: return urllib.request.urlopen(req, timeout=300).read() except Exception as e: - Network accessline 56
try: return urllib.request.urlopen(req, timeout=300).read()
skills/ray-kb/references/voice.md
- Network accessline 17
(Ray 2026-10-20 定。来源:Kane Kallaway 2026-10-21(UTC)发在 X 上的竖屏口播《现代故事弧》,https://x.com/kanekallaway/status/2112720461453013095 ;拆解时只取结构,不搬他的话。)
skills/ray-kb/scripts/oral_script_check.py
skills/ray-kb/scripts/test_oral_script_check.py
- Executable scriptline 1
Executable file - Network accessline 137
f"## 逐字稿\n\n{SPOKEN}\n\n" "## 待确认\n\n无\n\n" "## 素材与来源\n\n- https://example.com/source\n" - Network accessline 138
"## 待确认\n\n无\n\n" "## 素材与来源\n\n- https://example.com/source\n" ) - Network accessline 139
"## 素材与来源\n\n- https://example.com/source\n"
skills/ray-obsidian/assets/vault-template/30-资料/00-待抓取/链接收件箱.md
- Network accessline 10
- [ ] https://example.com 可选备注
skills/ray-obsidian/scripts/test_vault_setup.py
- Executable scriptline 1
Executable file
skills/ray-obsidian/scripts/vault_setup.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/ray-wechat/scripts/prepare_article.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/ray-wechat/scripts/render_article.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/ray-wechat/scripts/wechat_draft.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 33
DEFAULT_API_BASE = "https://api.weixin.qq.com/cgi-bin" - Access to secretsline 41
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted] - Access to secretsline 105
[Credential-related source omitted] - Access to secretsline 106
[Credential-related source omitted] - Access to secretsline 142
[Credential-related source omitted] - Access to secretsline 148
[Credential-related source omitted] - Access to secretsline 150
[Credential-related source omitted] - Access to secretsline 158
[Credential-related source omitted] - Access to secretsline 190
[Credential-related source omitted] - Access to secretsline 409
[Credential-related source omitted] - Access to secretsline 454
[Credential-related source omitted] - Access to secretsline 461
[Credential-related source omitted] - Access to secretsline 527
[Credential-related source omitted]
skills/ray-wechat/scripts/wechat_egress.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 11
import time from contextlib import contextmanager from http.client import HTTPSConnection - Network accessline 12
from contextlib import contextmanager from http.client import HTTPSConnection from pathlib import Path - Network accessline 13
from http.client import HTTPSConnection - Network accessline 48
timeout: float, ) -> socket.socket: sock = socket.create_connection((proxy_host, proxy_port), timeout=timeout) - Network accessline 49
) -> socket.socket: sock = socket.create_connection((proxy_host, proxy_port), timeout=timeout) try: - Network accessline 50
sock = socket.create_connection((proxy_host, proxy_port), timeout=timeout) - Possible obfuscationline 60
b"\x05\x01\x00\x03" - Network accessline 145
def _free_local_port() -> int: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: - Network accessline 146
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: - Network accessline 155
raise EgressError("fixed egress SSH tunnel exited before it was ready") try: with socket.create_connection(("127.0.0.1", port), timeout=0.2): - Network accessline 156
try: with socket.create_connection(("127.0.0.1", port), timeout=0.2): return - Network accessline 157
with socket.create_connection(("127.0.0.1", port), timeout=0.2): - Access to secretsline 165
[Credential-related source omitted] - Network accessline 177
def _verify_public_ip(expected_ip: str, context: ssl.SSLContext) -> str: request = Request("https://api.ipify.org", method="GET") - Network accessline 178
request = Request("https://api.ipify.org", method="GET") - Access to secretsline 194
[Credential-related source omitted]
skills/ray-wechat/scripts/wechat_images.py
skills/ray-writer/references/translation.md
- Network accessline 37
source_title: "原文标题" source_author: "原作者署名" source_url: "https://原文地址" - Network accessline 38
source_author: "原作者署名" source_url: "https://原文地址" source_published: 2026-06-30 # 原文发表日期 - Network accessline 39
source_url: "https://原文地址" - Network accessline 54
> 本文译自《原文标题》,作者 原作者署名,发表于 2026-06-30。 > 原文地址:https://原文地址 - Network accessline 55
> 原文地址:https://原文地址
skills/ray-writer/scripts/article_check.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/ray-x-article/SKILL.md
- Network accessline 66
- 状态为 `draft-needs-cover` 时,只补封面并重新验证;不要重写正文或建立第二份草稿。 - 状态已经是 `draft`、但用户提到过去失败时,以当前后台可见状态为准:先核验原草稿,封面确实缺失才补传,不能按旧叙述直接覆盖。 - 没有草稿 URL 时才打开 `https://x.com/compose/articles`,并确认页面存在 `Articles`、`Drafts`、`Published`,当前账号已登录且有 `Write` 入口;再检查 Draf - Network accessline 68
- 没有草稿 URL 时才打开 `https://x.com/compose/articles`,并确认页面存在 `Articles`、`Drafts`、`Published`,当前账号已登录且有 `Write` 入口;再检查 Drafts 中是否有同名文章,有则打开原草稿,不新建。
skills/ray-x-article/references/x-editor-contract.md
skills/ray-x-article/scripts/prepare_article.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/ray-x-article/scripts/record_draft.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 30
article = Path(args.article).expanduser().resolve() cover = Path(args.cover).expanduser().resolve() if not re.fullmatch(r"https://x\.com/compose/articles/edit/\d+", args.url): - Network accessline 31
cover = Path(args.cover).expanduser().resolve() if not re.fullmatch(r"https://x\.com/compose/articles/edit/\d+", args.url): raise ValueError("draft URL must match https://x.com/compose/articles/edit/<id>") - Network accessline 32
if not re.fullmatch(r"https://x\.com/compose/articles/edit/\d+", args.url): - Network accessline 33
raise ValueError("draft URL must match https://x.com/compose/articles/edit/<id>")
skills/ray-x-article/tests/test_prepare_article_tables.py
- Executable scriptline 1
Executable file
skills/ray/SKILL.md
- Network accessline 21
知识工作台(ray-dashboard,随 [rays-brain-kit](https://github.com/imraywang/rays-brain-kit) 安装,不在本仓库)会把用户排队的 AI 协作请求写进 vault 的 `50-系统/40-自动化/AI任务队列.md`(frontmatter `kind: ai-task-queue`,「## 待处理」下每行 `- [ ] 时间 · 动作 · [[目标笔记]]`)。`/ray` 读上下文时顺手看一眼这个文件; - Network accessline 64
### 独立仓库成员(ray-skills,装了才路由) 咨询、多模型协作、趋势调研和拼贴 B-roll 已按使用频率移到 [ray-skills](https://github.com/imraywang/ray-skills)。本机装了对应 skill 时照常分发;没装就直接说明并按普通任务处理,不假装调用。 - Network accessline 65
咨询、多模型协作、趋势调研和拼贴 B-roll 已按使用频率移到 [ray-skills](https://github.com/imraywang/ray-skills)。本机装了对应 skill 时照常分发;没装就直接说明并按普通任务处理,不假装调用。
skills/ray/references/content-pipeline.md
- Network accessline 145
它拒绝几类会让健康检查失明的写法:草稿编辑器地址 `https://x.com/compose/articles/edit/…` 不能当公开链接;没有时区的时间算不出 24 小时到期时间;同一篇稿子在同一平台已经记过另一个公开地址时报错停下,不覆盖。反馈卡只填空不覆盖,已完成的复盘不会被打回 `pending`。
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 16 facts
- Contacts api.openai.com, which SKILL.md, the README and the plugin manifest do not mentionray-cover/scripts/gen_cover.py:63High confidence
- Contacts cdn.jsdelivr.net, which SKILL.md, the README and the plugin manifest do not mentionray-explainer/assets/hf-template/build.py:211High confidence
- Contacts www.w3.org, which SKILL.md, the README and the plugin manifest do not mentionray-explainer/assets/styles/fenping/lib/perc.js:4High confidence
- Contacts cdn.jsdelivr.net, which SKILL.md, the README and the plugin manifest do not mentionray-explainer/assets/styles/guandian/build.py:543High confidence
- Contacts cdn.jsdelivr.net, which SKILL.md, the README and the plugin manifest do not mentionray-explainer/assets/styles/qingdan/build.py:422High confidence
- Contacts raw.githubusercontent.com, which SKILL.md, the README and the plugin manifest do not mentionray-explainer/assets/styles/xiaolin/make_fonts.sh:6High confidence
- Contacts generativelanguage.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentionray-explainer/scripts/check_numbers.py:44High confidence
- Contacts generativelanguage.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentionray-explainer/scripts/check_setup.sh:33High confidence
- Contacts api.minimax.io, which SKILL.md, the README and the plugin manifest do not mentionray-explainer/scripts/minimax_api.py:22High confidence
- Contacts www.w3.org, which SKILL.md, the README and the plugin manifest do not mentionray-explainer/scripts/review_page.py:51High confidence
- Contacts generativelanguage.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentionray-explainer/scripts/tts.py:101High confidence
- Contacts api.bilibili.com, which SKILL.md, the README and the plugin manifest do not mentionray-explainer/scripts/web_clip.py:53High confidence
- Contacts www.bilibili.com, which SKILL.md, the README and the plugin manifest do not mentionray-explainer/scripts/web_clip.py:61High confidence
- Contacts api.elevenlabs.io, which SKILL.md, the README and the plugin manifest do not mentionray-explainer/scripts/whole_tts.py:52High confidence
- Contacts api.weixin.qq.com, which SKILL.md, the README and the plugin manifest do not mentionray-wechat/scripts/wechat_draft.py:33High confidence
- Contacts api.ipify.org, which SKILL.md, the README and the plugin manifest do not mentionray-wechat/scripts/wechat_egress.py:178High confidence
Signal confidence: 401 facts
- Executable script in code of a file that runsray-kb/oral_script_check.py:1High confidence
- Executable script in code of a file that runsray-writer/article_check.py:1High confidence
- Access to secrets in prose of the SKILL.mdray-cover/SKILL.md:53Low confidence
- Network access in prose of documentationray-cover/assets/punk/NOTICE.md:3Low confidence
- Executable script in prose of a file that runsray-cover/scripts/erase_text.py:1Low confidence
- Executable script in code of a file that runsray-cover/scripts/gen_cover.py:1High confidence
- Access to secrets in prose of a file that runs: a variable, placeholder or call, not a stored valueray-cover/scripts/gen_cover.py:7Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueray-cover/scripts/gen_cover.py:50Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueray-cover/scripts/gen_cover.py:51Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueray-cover/scripts/gen_cover.py:53Low confidence
- Network access in code of a file that runsray-cover/scripts/gen_cover.py:61High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueray-cover/scripts/gen_cover.py:61Low confidence
- Network access in code of a file that runsray-cover/scripts/gen_cover.py:62High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueray-cover/scripts/gen_cover.py:62Low confidence
- Network access in code of a file that runsray-cover/scripts/gen_cover.py:63High confidence
- Possible obfuscation in code of a file that runsray-cover/scripts/gen_cover.py:82High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueray-cover/scripts/gen_cover.py:167Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueray-cover/scripts/gen_cover.py:170Low confidence
- Access to secrets in prose of the SKILL.mdray-explainer/SKILL.md:47Low confidence
- Executable script in code of a file that runsray-explainer/assets/hf-template/build.py:1High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valueray-explainer/assets/hf-template/build.py:20Low confidence
- Network access in code of a file that runsray-explainer/assets/hf-template/build.py:209High confidence
- Network access in code of a file that runsray-explainer/assets/hf-template/build.py:210High confidence
- Network access in code of a file that runsray-explainer/assets/hf-template/build.py:211High confidence
- Executable script in code of a file that runsray-explainer/assets/hf-template/host_build.py:1High confidence
- Executable script in code of a file that runsray-explainer/assets/hf-template/make_beats.py:1High confidence
- Network access in prose of documentationray-explainer/assets/huashu/NOTICE.md:3Low confidence
- Executable script in a comment of a file that runsray-explainer/assets/huashu/clip.js:1Low confidence
- Network access in code of a file that runsray-explainer/assets/huashu/clip.js:33High confidence
- Network access in code of a file that runsray-explainer/assets/huashu/clip.js:34High confidence
- Network access in code of a file that runsray-explainer/assets/huashu/clip.js:35High confidence
- Executable script in a comment of a file that runsray-explainer/assets/huashu/clips/t1_3b1b.js:1Low confidence
- Executable script in a comment of a file that runsray-explainer/assets/huashu/clips/t2_keynote_ui.js:1Low confidence
- Executable script in a comment of a file that runsray-explainer/assets/huashu/clips/t3_finance_chart.js:1Low confidence
- Executable script in a comment of a file that runsray-explainer/assets/huashu/clips/y1_kurzgesagt.js:1Low confidence
- Executable script in a comment of a file that runsray-explainer/assets/huashu/clips/y2_vox.js:1Low confidence
- Network access in code of a file that runsray-explainer/assets/huashu/clips/y2_vox.js:50High confidence
- Network access in code of a file that runsray-explainer/assets/huashu/clips/y2_vox.js:51High confidence
- Network access in code of a file that runsray-explainer/assets/huashu/clips/y2_vox.js:52High confidence
- Network access in code of a file that runsray-explainer/assets/huashu/clips/y2_vox.js:53High confidence
- Network access in code of a file that runsray-explainer/assets/huashu/clips/y2_vox.js:54High confidence
- Executable script in a comment of a file that runsray-explainer/assets/huashu/clips/y3_whiteboard.js:1Low confidence
- Executable script in a comment of a file that runsray-explainer/assets/huashu/clips/y4_storytime.js:1Low confidence
- Executable script in a comment of a file that runsray-explainer/assets/huashu/clips/y5_kinetic_type.js:1Low confidence
- Executable script in a comment of a file that runsray-explainer/assets/huashu/lib/camera.js:1Low confidence
- Executable script in a comment of a file that runsray-explainer/assets/huashu/lib/chart.js:1Low confidence
- Executable script in a comment of a file that runsray-explainer/assets/huashu/lib/collage.js:1Low confidence
- Executable script in a comment of a file that runsray-explainer/assets/huashu/lib/diagram.js:1Low confidence
- Executable script in a comment of a file that runsray-explainer/assets/huashu/lib/fonts.js:1Low confidence
- Executable script in a comment of a file that runsray-explainer/assets/huashu/lib/kit.js:1Low confidence
and 351 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md docs/archive/2026-09-22-风格规则旧版/ray-kb/SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md docs/archive/2026-09-22-风格规则旧版/ray-kb/SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md docs/archive/2026-09-22-风格规则旧版/ray-kb/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md docs/archive/2026-09-22-风格规则旧版/ray-kb/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md docs/archive/2026-09-22-风格规则旧版/ray-kb/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md docs/archive/2026-09-22-风格规则旧版/ray-kb/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.