tutor-general
1
总安装量
1
周安装量
#77443
全站排名
安装命令
npx skills add https://github.com/wangyendt/wayne-skills --skill tutor-general
Agent 安装分布
amp
1
cline
1
opencode
1
cursor
1
continue
1
kimi-cli
1
Skill 文档
Tutor General – éç¨ç¥è¯æå¦è§é¢
â ï¸ éè¦å£°æï¼æ¬æè½å tutor-math-geometry å¯åï¼ç¨ Motion Canvas æ¿ä»£ Manimï¼éé æ´å¹¿æ³çç¥è¯ç¹è®²è§£ã
ä¸ tutor-math-geometry çåºå«
| 维度 | tutor-math-geometry | tutor-general |
|---|---|---|
| ä¸»é¢ | æ°å¦å ä½ | ä»»ä½ç¥è¯ç¹ |
| 渲æå¼æ | Manim | Motion Canvas (TypeScript) |
| 代ç 飿 ¼ | Python | TypeScript |
| å¨ç»ç±»å | æ°å¦å ¬å¼/å¾å½¢ | æµç¨å¾/示æå¾/å¨ç» |
æ ¸å¿å·¥ä½æµ
WORKFLOW = [
// æ¥éª¤1: å
容åæ
{
"step": 1,
"name": "analyze_content",
"input": "主é¢/ææ¬/URL",
"output": "content_analysis.md",
"tasks": ["æç¼æ ¸å¿æ¦å¿µ", "ç¡®å®è®²è§£ç»æ", "è§åå¯è§åæ¹å¼"]
},
// æ¥éª¤2: åéèæ¬
{
"step": 2,
"name": "storyboard",
"input": "content_analysis.md",
"output": "{æ¥æ}_{主é¢}_åé.md",
"tasks": ["å®ä¹å¹ç»æ", "设计ç»é¢/åå¹/读ç½", "è§åå¨ç»ç±»å"]
},
// æ¥éª¤3: TTSçæ
{
"step": 3,
"name": "generate_tts",
"input": "åéèæ¬",
"output": "audio/audio_{ä¸ä½å¹å·}_{å¹å}.wav + audio_info.json",
"command": "python scripts/generate_tts.py audio_list.csv ./audio --voice xiaoxiao"
},
// æ¥éª¤4: éªè¯æ´æ°
{
"step": 4,
"name": "validate_audio",
"input": "åé.md + audio/",
"output": "æ´æ°åçåé.md(å¡«å
æ¶é¿) + audio_info.json",
"command": "python scripts/validate_audio.py åé.md ./audio",
"check": ["é³é¢å卿§", "æ¶é¿>0", "æ°éå¹é
"]
},
// æ¥éª¤5: Motion Canvas èææ¶
{
"step": 5,
"name": "scaffold",
"input": "åé.md + audio_info.json",
"output": "src/scene.ts (ä¼ªä»£ç æ¡æ¶)",
"template": "templates/scene_scaffold.ts",
"must_include": [
"createScene() - åºæ¯å建",
"COLORS - é¢è²å®ä¹",
"SCENES[] - å¹ä¿¡æ¯æ°ç»(ä»audio_info.jsonå è½½æ¶é¿)",
"Motion Canvas API è°ç¨"
]
},
// æ¥éª¤6: çæä»£ç
{
"step": 6,
"name": "implement",
"input": "èææ¶ + åé.md + audio_info.json",
"output": "宿´ç Motion Canvas 代ç ",
"rules": [
"æ ¹æ®åéå®ç°æ¯å¹å¨ç»",
"ä½¿ç¨ @motion-canvas/2d åº",
"ç»é¢æ¶é¿ >= é³é¢æ¶é¿",
"TypeScript ç±»åæ£ç¡®"
]
},
// æ¥éª¤7: æ£æ¥ä¸æ¸²æ
{
"step": 7,
"name": "check_and_render",
"input": "Motion Canvas 项ç®",
"output": "è§é¢æä»¶",
"command": "npm run export",
"check": ["TypeScript ç¼è¯", "å¨ç»åæ¥", "å¯¼åºæå"]
}
]
æ¥éª¤1ï¼å 容åæ
ç®æ ï¼ç解主é¢ï¼æç¼æ ¸å¿æ¦å¿µï¼è§åå¯è§åæ¹æ¡ã
è¾åºæ ¼å¼
## å
容åæ
### 主é¢
{主é¢åç§°}
### æ ¸å¿æ¦å¿µï¼3-5个ï¼
1. æ¦å¿µ1ï¼...
2. æ¦å¿µ2ï¼...
3. æ¦å¿µ3ï¼...
### è®²è§£ç»æ
- å¼å
¥ï¼...
- å±å¼ï¼...
- æ»ç»ï¼...
### å¯è§åæ¹æ¡
- æ¦å¿µ1 â æµç¨å¾
- æ¦å¿µ2 â 示æå¾
- æ¦å¿µ3 â å¨ç»æ¼ç¤º
æ¥éª¤2ï¼åéèæ¬
ç®æ ï¼å®ä¹è§é¢ç»æï¼ç»å°¾é¢çé³é¢æä»¶åï¼æ¶é¿ä¸ºç©ºï¼ã
æä»¶å½å
{æ¥æ}_{主é¢}_åé.md
åéèæ¬ç»æ
# åéèæ¬ - {主é¢åç§°}
## åé设计
### 第1å¹ï¼{å¹å}
**ç»é¢**: ...
**åå¹**: ...ï¼ç®æ´ï¼â¤20åï¼
**读ç½**: ...ï¼è¯¦ç»ï¼å£è¯åï¼
**å¨ç»ç±»å**: æ·¡å
¥/ç§»å¨/缩æ¾/é«äº®
**æ¶é¿**: {é³é¢æ¶é¿}
---
### 第2å¹ï¼{å¹å}
...
## é³é¢çææ¸
å
| å¹å· | æä»¶å | è¯»ç½ææ¬ | æ¶é¿ | 说è¯äºº | æ
æ |
|------|--------|----------|------|--------|------|
| 1 | audio_001_{å¹å}.wav | "è¯»ç½ææ¬" | | xiaoxiao | çæ
|
| 2 | audio_002_{å¹å}.wav | "è¯»ç½ææ¬" | | xiaoxiao | å¹³å |
Motion Canvas å¨ç»ç±»å
fade-in– æ·¡å ¥fade-out– æ·¡åºmove– ç§»å¨scale– 缩æ¾rotate– æè½¬highlight– é«äº®draw– ç»å¶ï¼ç¨äºæµç¨å¾ï¼
æ¥éª¤3ï¼TTSçæ
å½ä»¤ï¼
python scripts/generate_tts.py audio_list.csv ./audio --voice xiaoxiao
è¾åºï¼
audio/audio_001_{å¹å}.wavaudio_info.json
æ¥éª¤4ï¼éªè¯æ´æ°
å½ä»¤ï¼
python scripts/validate_audio.py åé.md ./audio
æ£æ¥é¡¹ï¼
- é³é¢æä»¶åå¨
- æ¶é¿ > 0
- æ°éå¹é
æ¥éª¤5ï¼Motion Canvas èææ¶
模æ¿ï¼templates/scene_scaffold.ts
å¿ é¡»å å«ï¼
// é¢è²å®ä¹
const COLORS = {
background: '#0f172a',
primary: '#4ecca3',
secondary: '#e94560',
highlight: '#ffc107',
text: '#ffffff',
};
// å¹ä¿¡æ¯ï¼ä» audio_info.json å è½½ï¼
const SCENES = [
{ id: 1, name: 'å¼åº', duration: 5.0 },
{ id: 2, name: 'æ¦å¿µ', duration: 10.0 },
// ...
];
// åºæ¯å建
export function createScene() {
// ...
}
æ¥éª¤6ï¼Motion Canvas 代ç å®ç°
æ ¸å¿ API
import {
Scene,
Circle,
Rect,
Line,
Text,
VGroup,
layout,
fadeIn,
any,
all,
waitFor
} from '@motion-canvas/2d';
// å建åå½¢
const circle = new Circle({ radius: 50, fill: '#4ecca3' });
// å建æå
const text = new Text({
text: 'Hello',
fontSize: 32,
fill: 'white'
});
// å¨ç»åºå
circle.fill('red', 1);
// çå¾
é³é¢
yield* waitFor(audioDuration);
常ç¨å¨ç»æ¨¡å¼
// æ·¡å
¥
new Rect().opacity(0).fadeIn(1);
// ç§»å¨
new Circle().position([100, 0]).move([200, 0], 1);
// é«äº®
new Circle().stroke('#ffff00', 0.5).back(0.5);
// æµç¨å¾
new Layout({ direction: 'row', spacing: 50 })
.add(new Rect())
.add(new Arrow())
.add(new Rect());
æ¥éª¤7ï¼æ¸²æ
å¼å模å¼ï¼å®æ¶é¢è§ï¼
npm run serve
导åºè§é¢
npm run export
Motion Canvas ä¼å¿
- â 宿¶é¢è§ï¼è°è¯å¿«
- â TypeScript ç±»åå®å ¨
- â å¯äº¤äºé¢è§
- â éåæµç¨å¾/示æå¾
å¯¹æ¯ Manim
| 维度 | Manim | Motion Canvas |
|---|---|---|
| è¯è¨ | Python | TypeScript |
| 宿¶é¢è§ | 鿏²æ | 峿¶é¢è§ |
| éå | æ°å¦å¾å½¢ | æµç¨/æ¼ç¤º |
| è¾åº | è§é¢ | è§é¢/å¯äº¤äº |
ä¾èµ
- Node.js 16+
- npm
- @motion-canvas/core
- @motion-canvas/2d
- @motion-canvas/ui
- edge-tts (ç¨äºTTS)
- ffmpeg (ç¨äºè§é¢å¯¼åº)
å®è£
npm install
使ç¨ç¤ºä¾
# 1. å¤å¶æ¨¡æ¿
cp -r templates/* ./my-project/
# 2. çæåéèæ¬
# ç¼è¾ {主é¢}_åé.md
# 3. çæ TTS
python scripts/generate_tts.py audio_list.csv ./audio
# 4. éªè¯é³é¢
python scripts/validate_audio.py åé.md ./audio
# 5. å®ç°å¨ç»
# ç¼è¾ src/scene.ts
# 6. å¼åé¢è§
npm run serve
# 7. 导åº
npm run export
ç®å½ç»æ
tutor-general/
âââ SKILL.md # æ¬æä»¶
âââ README.md # è¯´æææ¡£
âââ scripts/
â âââ generate_tts.py # TTSçæèæ¬
â âââ validate_audio.py # é³é¢éªè¯èæ¬
â âââ audio_list.example.csv # 示ä¾
âââ templates/
â âââ scene_scaffold.ts # èææ¶æ¨¡æ¿
â âââ package.json # é¡¹ç®æ¨¡æ¿
âââ references/
â âââ storyboard_sample.md # åé示ä¾
âââ assets/
âââ (éæèµæº)
注æäºé¡¹
- å¨ç»åæ¥ï¼ç»é¢æ¶é¿å¿ é¡» >= 对åºé³é¢æ¶é¿
- TypeScriptï¼ç¡®ä¿ç±»åæ£ç¡®ï¼Motion Canvas éè¦ç¼è¯
- 宿¶é¢è§ï¼å¼åæ¶ç¨
npm run serve宿¶æ¥çææ - å¯¼åºæ¶é´ï¼è§é¢å¯¼åºéè¦è¾é¿æ¶é´ï¼è¯·èå¿çå¾