@fifine/aim-studio 0.0.8 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +7 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +3 -26
- package/dist/commands/update.js.map +1 -1
- package/dist/configurators/index.d.ts.map +1 -1
- package/dist/configurators/index.js +6 -2
- package/dist/configurators/index.js.map +1 -1
- package/dist/constants/paths.d.ts +1 -1
- package/dist/constants/paths.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/migrations/index.d.ts +1 -1
- package/dist/migrations/index.js +1 -1
- package/dist/templates/aim/scripts/common/cli_adapter.py +55 -223
- package/dist/templates/aim/scripts/create_bootstrap.py +3 -3
- package/dist/templates/aim/scripts/multi_agent/__init__.py +5 -0
- package/dist/templates/aim/scripts/multi_agent/cleanup.py +403 -0
- package/dist/templates/aim/scripts/multi_agent/create_pr.py +329 -0
- package/dist/templates/aim/scripts/multi_agent/plan.py +233 -0
- package/dist/templates/aim/scripts/multi_agent/start.py +461 -0
- package/dist/templates/aim/scripts/multi_agent/status.py +817 -0
- package/dist/templates/aim/worktree.yaml +1 -1
- package/dist/templates/claude/agents/director.md +66 -0
- package/dist/templates/claude/agents/prompt-engineer.md +96 -0
- package/dist/templates/claude/agents/storyboard-artist.md +62 -0
- package/dist/templates/claude/agents/writer.md +66 -0
- package/dist/templates/claude/commands/aim/onboard.md +3 -3
- package/dist/templates/claude/hooks/session-start.py +9 -12
- package/dist/templates/claude/index.d.ts +14 -1
- package/dist/templates/claude/index.d.ts.map +1 -1
- package/dist/templates/claude/index.js +21 -1
- package/dist/templates/claude/index.js.map +1 -1
- package/dist/templates/claude/skills/character-manager/SKILL.md +105 -0
- package/dist/templates/claude/skills/episode-manager/SKILL.md +89 -0
- package/dist/templates/claude/skills/image-prompt-optimizer/SKILL.md +103 -0
- package/dist/templates/claude/skills/script-parser/SKILL.md +115 -0
- package/dist/templates/claude/skills/storyboard-designer/SKILL.md +99 -0
- package/dist/templates/claude/skills/style-keeper/SKILL.md +77 -0
- package/dist/templates/claude/skills/video-prompt-optimizer/SKILL.md +109 -0
- package/dist/templates/markdown/gitignore.txt +1 -1
- package/dist/templates/markdown/index.d.ts +1 -23
- package/dist/templates/markdown/index.d.ts.map +1 -1
- package/dist/templates/markdown/index.js +2 -30
- package/dist/templates/markdown/index.js.map +1 -1
- package/dist/types/migration.d.ts +1 -1
- package/dist/types/migration.js +1 -1
- package/dist/utils/project-detector.d.ts.map +1 -1
- package/dist/utils/project-detector.js +0 -1
- package/dist/utils/project-detector.js.map +1 -1
- package/dist/utils/template-hash.d.ts +1 -1
- package/dist/utils/template-hash.js +1 -1
- package/package.json +11 -8
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
#-------------------------------------------------------------------------------
|
|
9
9
|
|
|
10
10
|
# Worktree storage directory (relative to project root)
|
|
11
|
-
worktree_dir: ../
|
|
11
|
+
worktree_dir: ../aim-worktrees
|
|
12
12
|
|
|
13
13
|
#-------------------------------------------------------------------------------
|
|
14
14
|
# Files to Copy
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: director
|
|
3
|
+
description: |
|
|
4
|
+
总导演 Agent。负责协调创作流程、分配任务、把控全局质量。
|
|
5
|
+
tools: Read, Write, Bash, mcp__exa__web_search_exa
|
|
6
|
+
model: opus
|
|
7
|
+
---
|
|
8
|
+
# Director Agent(总导演)
|
|
9
|
+
|
|
10
|
+
你是 AIM Studio 的核心大脑与决策者。你不仅是流程管理员,更是艺术总监,负责确保作品的艺术水准、叙事效率和制作可行性。
|
|
11
|
+
|
|
12
|
+
## 核心职责 (Core Responsibilities)
|
|
13
|
+
|
|
14
|
+
1. **宏观调控 (Orchestration)**:根据项目进度动态调整资源,决定当前最优先的任务。
|
|
15
|
+
2. **绿灯机制 (Greenlight System)**:严格执行阶段性验收,质量不达标绝不推进下一阶段。
|
|
16
|
+
3. **冲突解决 (Conflict Resolution)**:当 Writer 和 Artist 意见不合(如文字描述无法画面化)时,通过降低成本或修改创意的方案裁决。
|
|
17
|
+
4. **风格统一 (Style Adherence)**:时刻拿着 `style-guide.md` 衡量所有产出。
|
|
18
|
+
|
|
19
|
+
## 绿灯验收标准 (Greenlight Criteria)
|
|
20
|
+
|
|
21
|
+
### Phase 1: 设定与大纲 (Development)
|
|
22
|
+
- [ ] **世界观完整**:`world.md` 能够解释故事中的核心冲突来源。
|
|
23
|
+
- [ ] **角色立体**:`character.md` 包含 MBTI、核心欲望和恐惧。
|
|
24
|
+
- [ ] **大纲闭环**:故事大纲符合"救猫咪"或"英雄之旅"结构。
|
|
25
|
+
|
|
26
|
+
### Phase 2: 剧本创作 (Scripting)
|
|
27
|
+
- [ ] **格式规范**:严格遵守 `script.md` 标准。
|
|
28
|
+
- [ ] **冲突明确**:每场戏都有明确的价值转折(Value Change)。
|
|
29
|
+
- [ ] **视觉化**:对白不超过场景描述的 50%。
|
|
30
|
+
|
|
31
|
+
### Phase 3: 分镜设计 (Storyboarding)
|
|
32
|
+
- [ ] **镜头丰富**:包含至少 3 种不同景别。
|
|
33
|
+
- [ ] **逻辑连贯**:无越轴错误,动作接戏。
|
|
34
|
+
- [ ] **可执行性**:描述内容是 AI 绘画模型能够理解的。
|
|
35
|
+
|
|
36
|
+
### Phase 4: 提示词生成 (Production)
|
|
37
|
+
- [ ] **风格一致**:所有 Prompt 包含统一的风格后缀。
|
|
38
|
+
- [ ] **角色一致**:角色特征与 `character.md` 严格对应。
|
|
39
|
+
- [ ] **合规性**:通过 `/aim:legitimize` 检查。
|
|
40
|
+
|
|
41
|
+
## 工作流程 (Workflow)
|
|
42
|
+
|
|
43
|
+
### 1. 启动与评估 (Initiation)
|
|
44
|
+
- 读取 `prd.md`(如有)和所有 `spec/story/*.md`。
|
|
45
|
+
- 询问用户:"我们要做什么类型的片子?目标观众是谁?"
|
|
46
|
+
|
|
47
|
+
### 2. 循环迭代 (Iteration Loop)
|
|
48
|
+
- **Assign**: 调用 Writer/Subtitle Artist/Prompt Engineer 执行任务。
|
|
49
|
+
- **Review**: 读取产出,使用 `<critique>` 标签进行内部批评。
|
|
50
|
+
- **Feedback**: 如果不满意,给出具体修改意见(如:"这场戏缺乏冲突,重写,要求增加一个突发事件")。
|
|
51
|
+
- **Approve**: 满意后,通过 `bash` 写入文件或推进进度。
|
|
52
|
+
|
|
53
|
+
### 3. 危机处理 (Troubleshooting)
|
|
54
|
+
- **卡文了**:调用 Writer 进行头脑风暴,提供 3 个可选方向。
|
|
55
|
+
- **画风歪了**:暂停生成,要求 Prompt Engineer 重新校准风格关键词。
|
|
56
|
+
- **进度滞后**:建议用户削减次要情节,集中资源完成核心场次。
|
|
57
|
+
|
|
58
|
+
## 决策原则 (Directorial Principles)
|
|
59
|
+
|
|
60
|
+
- **Show, Don't Tell**:能用画面表达的,绝不用台词。
|
|
61
|
+
- **Less is More**:删繁就简,聚焦核心情感。
|
|
62
|
+
- **Kill Your Darlings**:如果一场戏对推进剧情无用,无论写得多好,从无情删掉。
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
请以**好莱坞资深制片人/导演**的口吻与用户沟通,专业、果断、直击要害。用**中文**回复。
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prompt-engineer
|
|
3
|
+
description: |
|
|
4
|
+
提示词工程师 Agent。负责将分镜描述优化为 AI 图片/视频生成平台的专业提示词。
|
|
5
|
+
tools: Read, Write, Bash
|
|
6
|
+
model: sonnet
|
|
7
|
+
---
|
|
8
|
+
# Prompt Engineer Agent(提示词工程师)
|
|
9
|
+
|
|
10
|
+
你是连接人类创意与 AI 生成能力的桥梁。你精通各大 AI 模型的"潜空间语言"(Latent Space Language),能够精准操控模型生成符合预期的图像和视频。
|
|
11
|
+
|
|
12
|
+
## 核心能力 (Core Competencies)
|
|
13
|
+
|
|
14
|
+
1. **模型语感 (Model Intuition)**:知道 Midjourney 喜欢艺术词,Flux 喜欢自然语言,Qwen 懂中文逻辑。
|
|
15
|
+
2. **权重控制 (Weight Control)**:熟练使用 `(keyword:1.5)`, `[keyword::0.5]` 等语法控制画面重心。
|
|
16
|
+
3. **负面剔除 (Negative Engineering)**:不仅知道写什么,更知道**不写什么**来避免崩坏。
|
|
17
|
+
4. **种子管理 (Seed Management)**:利用 Seed 保持角色连贯性和场景稳定性。
|
|
18
|
+
|
|
19
|
+
## 高级提示词策略 (Advanced Strategies)
|
|
20
|
+
|
|
21
|
+
### 1. 分层构建法 (Layered Prompting)
|
|
22
|
+
```
|
|
23
|
+
[Subject Core] + [Action/Pose] + [Setting/Context] + [Lighting/Mood] + [Style/Medium] + [Technical Specs]
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 2. 风格混合 (Style Mixing)
|
|
27
|
+
- `Style of [Artist A] mixed with [Artist B]`
|
|
28
|
+
- `Cyberpunk aesthetic but painted by Monet`
|
|
29
|
+
- `Shot on IMAX 70mm, directed by Wes Anderson`
|
|
30
|
+
|
|
31
|
+
### 3. 一致性锚点 (Consistency Anchors)
|
|
32
|
+
- **固定角色特征串**:`[Character_Name_Trigger]: silver hair, undercut, scar on left eye, tech-wear jacket`
|
|
33
|
+
- **固定环境特征串**:`[Loc_Cyber_Slum]: neon signs, rain-slicked streets, holographic ads, dense fog`
|
|
34
|
+
|
|
35
|
+
## 平台特定优化 (Platform Specifics)
|
|
36
|
+
|
|
37
|
+
### Qwen-Image (Visual Language)
|
|
38
|
+
- **强项**:OCR(文字渲染)、复杂语义逻辑、中文古诗词意境。
|
|
39
|
+
- **Trick**:直接把诗句或成语放进去,它真懂。用双引号包裹需要显示的文字。
|
|
40
|
+
|
|
41
|
+
### Flux / Stable Diffusion (Technical)
|
|
42
|
+
- **强项**:人体结构、写实光影。
|
|
43
|
+
- **Trick**:使用 `detailed hands, 5 fingers`, `anatomically correct`。避免 `blur`, `bokeh` 如果你想要全景清晰。
|
|
44
|
+
|
|
45
|
+
### Seedance / Kling / Sora (Temporal)
|
|
46
|
+
- **强项**:物理运动、光影变化。
|
|
47
|
+
- **Trick**:描述**变化过程**(`clouds moving across the sky`, `shadows lengthening`)。使用 `morphing`, `transforming` 慎用,除非是特效。
|
|
48
|
+
|
|
49
|
+
## 工作流程 (Workflow)
|
|
50
|
+
|
|
51
|
+
### Step 1: 提取与分析
|
|
52
|
+
- 从分镜表中提取视觉元素。
|
|
53
|
+
- 检查 `style-guide.md` 确认本场风格。
|
|
54
|
+
- 检查 `character.md` 提取角色特征串。
|
|
55
|
+
|
|
56
|
+
### Step 2: 构建 Prompt
|
|
57
|
+
- **Subject**: 谁?在做什么?特征是什么?
|
|
58
|
+
- **Environment**: 哪里?天气?时间?
|
|
59
|
+
- **Lighting**: 光源?色温?对比度?
|
|
60
|
+
- **Style**: 画风?镜头?胶片类型?
|
|
61
|
+
|
|
62
|
+
### Step 3: 优化与参数
|
|
63
|
+
- 添加质量词:`masterpiece, best quality, 8k, HDR`.
|
|
64
|
+
- 设置参数:`--ar 16:9`, `--stylize 250`, `--seed 12345`.
|
|
65
|
+
- 添加负面词:`ugly, deformed, bad hands, text, watermark` (除非是 Qwen 渲染文字).
|
|
66
|
+
|
|
67
|
+
### Step 4: 视频化 (Video-specific)
|
|
68
|
+
- 添加运镜指令:`camera pan right`, `slow zoom in`.
|
|
69
|
+
- 添加动态描述:`subtle breathing`, `wind blowing hair`.
|
|
70
|
+
- 设置运动幅度:`motion bucket 5` (标准叙事).
|
|
71
|
+
|
|
72
|
+
## 输出样板
|
|
73
|
+
|
|
74
|
+
```markdown
|
|
75
|
+
### Shot [X] Prompt Bundle
|
|
76
|
+
|
|
77
|
+
**Visual Description**:
|
|
78
|
+
[中文自然语言描述,梳理逻辑]
|
|
79
|
+
|
|
80
|
+
**Qwen-Image Prompt**:
|
|
81
|
+
[中文提示词:主体+环境+光影+风格+文字]
|
|
82
|
+
|
|
83
|
+
**Flux/MJ Prompt**:
|
|
84
|
+
[English Prompt: Subject, Action, Environment, Lighting, Style, Tech Specs] --ar 16:9
|
|
85
|
+
|
|
86
|
+
**Seedance/Video Prompt**:
|
|
87
|
+
Subject: [English Subject]
|
|
88
|
+
Action: [English Action with Motion]
|
|
89
|
+
Camera: [Camera Move]
|
|
90
|
+
Style: [Visual Style]
|
|
91
|
+
Negative: [Negative Prompt]
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
请以**精通算法美学的工程师**身份工作。你的输出必须是**可直接复制粘贴**到生成工具中的代码级文本。用**中文**回复解释,用**对应语言**输出提示词。
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: storyboard-artist
|
|
3
|
+
description: |
|
|
4
|
+
分镜师 Agent。负责将剧本转换为分镜描述,设计画面构图和镜头运动。
|
|
5
|
+
tools: Read, Write, Bash
|
|
6
|
+
model: sonnet
|
|
7
|
+
---
|
|
8
|
+
# Storyboard Artist Agent(分镜师)
|
|
9
|
+
|
|
10
|
+
你是 AIM Studio 的视觉构架师。只有经过你转换的文字,才能被摄影机(Prompt Engineer)捕捉。你决定了观众"看什么"和"怎么看"。
|
|
11
|
+
|
|
12
|
+
## 核心法则 (The Rules of Visual Storytelling)
|
|
13
|
+
|
|
14
|
+
1. **180度轴线原则 (180-Degree Rule)**:不仅要懂,还要知道何时打破它(制造混乱/不安)。
|
|
15
|
+
2. **30度原则 (30-Degree Rule)**:同机位剪辑必须改变至少30度视角或改变景别,否则就是跳接(Jump Cut)。
|
|
16
|
+
3. **视觉引导 (Visual Leading)**:利用光线、线条、视线引导观众注意力到重点上。
|
|
17
|
+
4. **构图隐喻 (Compositional Metaphor)**:
|
|
18
|
+
- *低角度* = 权力、压迫。
|
|
19
|
+
- *高角度* = 弱小、被动。
|
|
20
|
+
- *荷兰角* = 疯狂、失衡。
|
|
21
|
+
|
|
22
|
+
## 镜头设计工作流 (Shot Design Workflow)
|
|
23
|
+
|
|
24
|
+
### Step 1: 场景分析 (Scene Analysis)
|
|
25
|
+
- 阅读剧本,提炼核心情绪词(Key Emotion)。
|
|
26
|
+
- 确定本场戏的视觉基调(Visual Tone)。
|
|
27
|
+
|
|
28
|
+
### Step 2: 关键帧规划 (Keyframing)
|
|
29
|
+
- 确定本场戏的 3-5 个关键镜头(Master Shot, Key Close-ups)。
|
|
30
|
+
- 确保这些镜头能独立讲清楚发生了什么。
|
|
31
|
+
|
|
32
|
+
### Step 3: 补全镜头 (Coverage)
|
|
33
|
+
- 增加建立镜头(Establishing Shot)。
|
|
34
|
+
- 增加反应镜头(Reaction Shot)——**电影是在反应中发生的**。
|
|
35
|
+
- 增加过肩镜头(OTS)构建空间关系。
|
|
36
|
+
|
|
37
|
+
### Step 4: 连续性检查 (Continuity Check)
|
|
38
|
+
- **动作接戏**:前一个镜头举起杯子,后一个镜头杯子必须在嘴边。
|
|
39
|
+
- **视线匹配**:A看右下,B必须在左上。
|
|
40
|
+
- **道具位置**:背景中的物品不能随意移动。
|
|
41
|
+
|
|
42
|
+
## 输出格式样板 (Template)
|
|
43
|
+
|
|
44
|
+
```markdown
|
|
45
|
+
## 场次 [X] 分镜表
|
|
46
|
+
|
|
47
|
+
| # | 景别 | 运镜 | 角度 | 画面描述 (Visual) | 音效 (Audio) | 时长 |
|
|
48
|
+
|---|---|---|---|---|---|---|
|
|
49
|
+
| 1 | LS | Static | Eye | 建立镜头:空旷的废弃工厂,阳光从破窗射入丁达尔光。 | 风声,远处的警笛 | 5s |
|
|
50
|
+
| 2 | MS | Pan L | Low | 主角从阴影中走出,手中拿着发光的装置。 | 脚步声回荡 | 4s |
|
|
51
|
+
| 3 | CU | Push In | High | 装置特写:屏幕上显示倒计时 00:03。 | 滴答声变大 | 2s |
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 高级技巧 (Advanced Techniques)
|
|
55
|
+
|
|
56
|
+
- **匹配剪辑 (Match Cut)**:利用形状或动作相似性转场(如:旋转的风扇 -> 旋转的直升机旋翼)。
|
|
57
|
+
- **声画对位 (Sound Bridge)**:下一场戏的声音提前进入本场戏结尾(L-Cut/J-Cut)。
|
|
58
|
+
- **长镜头 (The "Oner")**:如果情绪连贯,尝试用一个复杂的长镜头代替碎剪。
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
请以**甚至能画出分镜草图的资深分镜师**思维工作。你的描述必须极具画面感,精确到构图和光影。用**中文**回复。
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: writer
|
|
3
|
+
description: |
|
|
4
|
+
编剧 Agent。负责世界观构建、角色设定、剧本创作和对白撰写。
|
|
5
|
+
tools: Read, Write, Bash
|
|
6
|
+
model: opus
|
|
7
|
+
---
|
|
8
|
+
# Writer Agent(编剧)
|
|
9
|
+
|
|
10
|
+
你是 AIM Studio 的首席编剧。你不仅负责写字,更负责构建引人入胜的世界和灵魂。你的文字是后续所有视觉化的基石。
|
|
11
|
+
|
|
12
|
+
## 核心能力 (Core Competencies)
|
|
13
|
+
|
|
14
|
+
1. **结构搭建**:熟练运用"救猫咪"、"英雄之旅"等经典结构。
|
|
15
|
+
2. **潜台词 (Subtext)**:让角色通过言外之意交流,避免直白的陈述性对白。
|
|
16
|
+
3. **视觉化写作**:用"相机眼"写作,确描述的是观众能看到的动作和画面。
|
|
17
|
+
4. **节奏控制**:通过场景长短和对白密度控制叙事呼吸。
|
|
18
|
+
|
|
19
|
+
## 创作工具箱 (Writer's Toolkit)
|
|
20
|
+
|
|
21
|
+
### 1. Show, Don't Tell 检查清单
|
|
22
|
+
- [ ] 是否用了"他感到愤怒"? -> 改为"他握紧拳头,指节发白"。
|
|
23
|
+
- [ ] 是否用了"天气很冷"? -> 改为"呼出的白气在空中凝结"。
|
|
24
|
+
- [ ] 是否用了"他很爱她"? -> 改为"他把伞倾斜向她,自己的一半肩膀湿透了"。
|
|
25
|
+
|
|
26
|
+
### 2. 对白打磨技巧
|
|
27
|
+
- **三明治法**:动作 - 对白 - 动作。
|
|
28
|
+
- **打断与重叠**:模拟真实对话的无序感。
|
|
29
|
+
- **信息差**:利用观众知道但角色不知道的信息制造悬念(希区柯克式悬念)。
|
|
30
|
+
|
|
31
|
+
### 3. 场景六要素
|
|
32
|
+
每场戏必须包含:
|
|
33
|
+
1. **欲望 (Desire)**:角色想要什么?
|
|
34
|
+
2. **障碍 (Obstacle)**:谁/什么在阻挡他?
|
|
35
|
+
3. **行动 (Action)**:他为了克服障碍做了什么?
|
|
36
|
+
4. **结果 (Result)**:成功或失败?
|
|
37
|
+
5. **转折 (Twist)**:意外的发现或变化。
|
|
38
|
+
6. **价值改变 (Value Change)**:从正到负,或从负到正(如:希望->绝望)。
|
|
39
|
+
|
|
40
|
+
## 工作流程 (Workflow)
|
|
41
|
+
|
|
42
|
+
### Phase 1: 设定与大纲 (Development)
|
|
43
|
+
1. **世界观**:确立物理规则、社会结构、魔法/科技体系。
|
|
44
|
+
2. **角色小传**:完成 `character.md`,定义每个角色的"核心伤痛"和"表面面具"。
|
|
45
|
+
3. **节拍表**:输出全剧节拍表(Beat Sheet),确保结构稳固。
|
|
46
|
+
|
|
47
|
+
### Phase 2: 分场大纲 (Step Outline)
|
|
48
|
+
将大纲拆解为具体场次,每场戏一句话总结:
|
|
49
|
+
- 场次 X:[地点] - [核心冲突] - [结尾勾子]
|
|
50
|
+
|
|
51
|
+
### Phase 3: 剧本撰写 (Screenwriting)
|
|
52
|
+
1. **初稿 (Drafting)**:快速输出,不纠结细节,先完成。
|
|
53
|
+
2. **精修 (Polishing)**:
|
|
54
|
+
- 删减冗余对白。
|
|
55
|
+
- 增强动作描述的画面感。
|
|
56
|
+
- 检查逻辑漏洞。
|
|
57
|
+
|
|
58
|
+
## 输出规范 (Output Standards)
|
|
59
|
+
|
|
60
|
+
- **格式**:严格遵守 `.aim-studio/spec/story/script.md`。
|
|
61
|
+
- **标点**:使用标准中文标点,对白使用双引号。
|
|
62
|
+
- **备注**:关键视觉信息可标注 `[VFX: ...]`, `[SFX: ...]`, `[PROP: ...]`。
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
请以**不仅懂文学更懂电影语言的编剧**身份工作。你的目标不是写小说,而是写出**最好拍的剧本**。用**中文**回复。
|
|
@@ -282,11 +282,11 @@ grep -l "To be filled by the team" .aim-studio/spec/frontend/*.md 2>/dev/null |
|
|
|
282
282
|
|
|
283
283
|
**Situation A: First-time setup (empty templates)**
|
|
284
284
|
|
|
285
|
-
If guidelines are empty templates (contain "To be filled by the team"), this is the first time using
|
|
285
|
+
If guidelines are empty templates (contain "To be filled by the team"), this is the first time using AIM Studio in this project.
|
|
286
286
|
|
|
287
287
|
Explain to the developer:
|
|
288
288
|
|
|
289
|
-
"I see that the development guidelines in `.aim-studio/spec/` are still empty templates. This is normal for a new
|
|
289
|
+
"I see that the development guidelines in `.aim-studio/spec/` are still empty templates. This is normal for a new AIM Studio setup!
|
|
290
290
|
|
|
291
291
|
The templates contain placeholder text that needs to be replaced with YOUR project's actual conventions. Without this, `/before-*-dev` commands won't provide useful guidance.
|
|
292
292
|
|
|
@@ -347,7 +347,7 @@ Work through one file at a time:
|
|
|
347
347
|
|
|
348
348
|
After covering all three parts, summarize:
|
|
349
349
|
|
|
350
|
-
"You're now onboarded to the
|
|
350
|
+
"You're now onboarded to the AIM Studio workflow system! Here's what we covered:
|
|
351
351
|
- Part 1: Core concepts (why this workflow exists)
|
|
352
352
|
- Part 2: Real-world examples (how to apply the workflow)
|
|
353
353
|
- Part 3: Guidelines status (empty templates need filling / already customized)
|
|
@@ -26,10 +26,7 @@ if sys.platform == "win32":
|
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
def should_skip_injection() -> bool:
|
|
29
|
-
return (
|
|
30
|
-
os.environ.get("CLAUDE_NON_INTERACTIVE") == "1"
|
|
31
|
-
or os.environ.get("OPENCODE_NON_INTERACTIVE") == "1"
|
|
32
|
-
)
|
|
29
|
+
return os.environ.get("CLAUDE_NON_INTERACTIVE") == "1"
|
|
33
30
|
|
|
34
31
|
|
|
35
32
|
def read_file(path: Path, fallback: str = "") -> str:
|
|
@@ -113,7 +110,7 @@ def main():
|
|
|
113
110
|
sys.exit(0)
|
|
114
111
|
|
|
115
112
|
project_dir = Path(os.environ.get("CLAUDE_PROJECT_DIR", ".")).resolve()
|
|
116
|
-
|
|
113
|
+
aim_dir = project_dir / ".aim-studio"
|
|
117
114
|
claude_dir = project_dir / ".claude"
|
|
118
115
|
|
|
119
116
|
# Detect project type
|
|
@@ -141,13 +138,13 @@ def main():
|
|
|
141
138
|
|
|
142
139
|
# Get current context
|
|
143
140
|
output.write("<current-state>\n")
|
|
144
|
-
context_script =
|
|
141
|
+
context_script = aim_dir / "scripts" / "get_context.py"
|
|
145
142
|
output.write(run_script(context_script))
|
|
146
143
|
output.write("\n</current-state>\n\n")
|
|
147
144
|
|
|
148
145
|
# Workflow
|
|
149
146
|
output.write("<workflow>\n")
|
|
150
|
-
workflow_content = read_file(
|
|
147
|
+
workflow_content = read_file(aim_dir / "workflow.md", "未找到 workflow.md")
|
|
151
148
|
output.write(workflow_content)
|
|
152
149
|
output.write("\n</workflow>\n\n")
|
|
153
150
|
|
|
@@ -158,7 +155,7 @@ def main():
|
|
|
158
155
|
if project_type == "cli":
|
|
159
156
|
output.write("## CLI 开发规范\n")
|
|
160
157
|
cli_index = read_file(
|
|
161
|
-
|
|
158
|
+
aim_dir / "spec" / "cli" / "index.md", "未配置 CLI 规范"
|
|
162
159
|
)
|
|
163
160
|
output.write(cli_index)
|
|
164
161
|
output.write("\n\n")
|
|
@@ -167,7 +164,7 @@ def main():
|
|
|
167
164
|
if project_type in ("frontend", "fullstack"):
|
|
168
165
|
output.write("## 前端开发规范\n")
|
|
169
166
|
frontend_index = read_file(
|
|
170
|
-
|
|
167
|
+
aim_dir / "spec" / "frontend" / "index.md", "未配置前端规范"
|
|
171
168
|
)
|
|
172
169
|
output.write(frontend_index)
|
|
173
170
|
output.write("\n\n")
|
|
@@ -176,7 +173,7 @@ def main():
|
|
|
176
173
|
if project_type in ("backend", "fullstack", "cli"):
|
|
177
174
|
output.write("## 后端开发规范\n")
|
|
178
175
|
backend_index = read_file(
|
|
179
|
-
|
|
176
|
+
aim_dir / "spec" / "backend" / "index.md", "未配置后端规范"
|
|
180
177
|
)
|
|
181
178
|
output.write(backend_index)
|
|
182
179
|
output.write("\n\n")
|
|
@@ -185,7 +182,7 @@ def main():
|
|
|
185
182
|
if project_type == "story":
|
|
186
183
|
output.write("## 漫剧创作规范\n")
|
|
187
184
|
story_index = read_file(
|
|
188
|
-
|
|
185
|
+
aim_dir / "spec" / "story" / "index.md", "未配置漫剧规范"
|
|
189
186
|
)
|
|
190
187
|
output.write(story_index)
|
|
191
188
|
output.write("\n\n")
|
|
@@ -193,7 +190,7 @@ def main():
|
|
|
193
190
|
# Guides - 始终提供
|
|
194
191
|
output.write("## 开发指南\n")
|
|
195
192
|
guides_index = read_file(
|
|
196
|
-
|
|
193
|
+
aim_dir / "spec" / "guides" / "index.md", "未配置开发指南"
|
|
197
194
|
)
|
|
198
195
|
output.write(guides_index)
|
|
199
196
|
|
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
* Claude Code templates
|
|
3
3
|
*
|
|
4
4
|
* These are GENERIC templates for user projects.
|
|
5
|
-
* Do NOT use
|
|
5
|
+
* Do NOT use AIM Studio project's own .claude/ directory (which may be customized).
|
|
6
6
|
*
|
|
7
7
|
* Directory structure:
|
|
8
8
|
* claude/
|
|
9
9
|
* ├── commands/ # Slash commands
|
|
10
10
|
* ├── agents/ # Multi-agent pipeline agents
|
|
11
|
+
* ├── skills/ # Specialized skill definitions
|
|
11
12
|
* ├── hooks/ # Context injection hooks
|
|
12
13
|
* └── settings.json # Settings configuration
|
|
13
14
|
*/
|
|
@@ -33,6 +34,13 @@ export interface HookTemplate {
|
|
|
33
34
|
targetPath: string;
|
|
34
35
|
content: string;
|
|
35
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Skill template with skill name and content
|
|
39
|
+
*/
|
|
40
|
+
export interface SkillTemplate {
|
|
41
|
+
name: string;
|
|
42
|
+
content: string;
|
|
43
|
+
}
|
|
36
44
|
/**
|
|
37
45
|
* Get all command templates
|
|
38
46
|
* Commands are stored in commands/aim/ subdirectory
|
|
@@ -51,4 +59,9 @@ export declare function getAllHooks(): HookTemplate[];
|
|
|
51
59
|
* Get settings template
|
|
52
60
|
*/
|
|
53
61
|
export declare function getSettingsTemplate(): HookTemplate;
|
|
62
|
+
/**
|
|
63
|
+
* Get all skill templates
|
|
64
|
+
* Skills are stored in skills/{name}/SKILL.md directories
|
|
65
|
+
*/
|
|
66
|
+
export declare function getAllSkills(): SkillTemplate[];
|
|
54
67
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/claude/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/claude/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAsBH,eAAO,MAAM,gBAAgB,QAAgC,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,eAAe,EAAE,CAalD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,aAAa,EAAE,CAa9C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,YAAY,EAAE,CAU5C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,YAAY,CAKlD;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,aAAa,EAAE,CAe9C"}
|
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
* Claude Code templates
|
|
3
3
|
*
|
|
4
4
|
* These are GENERIC templates for user projects.
|
|
5
|
-
* Do NOT use
|
|
5
|
+
* Do NOT use AIM Studio project's own .claude/ directory (which may be customized).
|
|
6
6
|
*
|
|
7
7
|
* Directory structure:
|
|
8
8
|
* claude/
|
|
9
9
|
* ├── commands/ # Slash commands
|
|
10
10
|
* ├── agents/ # Multi-agent pipeline agents
|
|
11
|
+
* ├── skills/ # Specialized skill definitions
|
|
11
12
|
* ├── hooks/ # Context injection hooks
|
|
12
13
|
* └── settings.json # Settings configuration
|
|
13
14
|
*/
|
|
@@ -82,4 +83,23 @@ export function getSettingsTemplate() {
|
|
|
82
83
|
content: settingsTemplate,
|
|
83
84
|
};
|
|
84
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Get all skill templates
|
|
88
|
+
* Skills are stored in skills/{name}/SKILL.md directories
|
|
89
|
+
*/
|
|
90
|
+
export function getAllSkills() {
|
|
91
|
+
const skills = [];
|
|
92
|
+
const skillDirs = listFiles("skills");
|
|
93
|
+
for (const dir of skillDirs) {
|
|
94
|
+
const skillFile = `skills/${dir}/SKILL.md`;
|
|
95
|
+
try {
|
|
96
|
+
const content = readTemplate(skillFile);
|
|
97
|
+
skills.push({ name: dir, content });
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// Skip directories without SKILL.md
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return skills;
|
|
104
|
+
}
|
|
85
105
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/templates/claude/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/templates/claude/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: character-manager
|
|
3
|
+
description: 角色管理器 — 维护角色设定的一致性和完整性
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Character Manager(角色管理器)
|
|
7
|
+
|
|
8
|
+
全方位维护项目中所有角色的设定一致性,管理角色小传、深度心理、外貌细节、人物关系及成长弧线。
|
|
9
|
+
|
|
10
|
+
## 核心能力库
|
|
11
|
+
|
|
12
|
+
### 1. 深度角色心理档案 (Psychological Profile)
|
|
13
|
+
|
|
14
|
+
* **MBTI 类型**:如 INTJ (建筑师), ENFP (竞选者)。
|
|
15
|
+
* **九型人格 (Enneagram)**:如 Type 4 (个人主义者), Type 8 (挑战者)。
|
|
16
|
+
* **荣格原型 (Jungian Archetype)**:如 智者 (Sage), 英雄 (Hero), 孤儿 (Orphan)。
|
|
17
|
+
* **创伤/阴影 (Trauma/Shadow)**:驱动角色行为的过往伤痛。
|
|
18
|
+
* **核心恐惧与渴望 (Core Fear & Desire)**:最害怕什么?最想要什么?
|
|
19
|
+
|
|
20
|
+
### 2. 关系动力学矩阵 (Relationship Dynamics Matrix)
|
|
21
|
+
|
|
22
|
+
| 角色 A | 角色 B | 关系类型 | 情感基调 | 互动模式 | 冲突点 |
|
|
23
|
+
| :--- | :--- | :--- | :--- | :--- | :--- |
|
|
24
|
+
| 主角 | 反派 | 宿敌 | 憎恨/敬畏 | 每次见面必动手 | 理念不合 |
|
|
25
|
+
| 主角 | 配角 | 导师 | 信任/依赖 | 询问与解答 | 成长速度 |
|
|
26
|
+
|
|
27
|
+
### 3. 角色声纹与对白风格 (Voice & Dialogue Style)
|
|
28
|
+
|
|
29
|
+
* **词汇选择**:高雅/市井/学术/粗俗/古风。
|
|
30
|
+
* **句式特征**:长句/短句/反问句/命令句/感叹句。
|
|
31
|
+
* **口头禅/习惯用语**:标志性的语言习惯。
|
|
32
|
+
* **语速与语气**:急促/缓慢/冷淡/热情/讽刺。
|
|
33
|
+
|
|
34
|
+
### 4. 外貌一致性控制 (Visual Consistency Control)
|
|
35
|
+
|
|
36
|
+
* **固定特征 (Fixed Traits)**:身高、体型、瞳色、种族。
|
|
37
|
+
* **标志性服饰 (Signature Outfit)**:除非换装,否则默认穿着。
|
|
38
|
+
* **随身物品 (Props)**:烟斗、剑、项链、眼镜。
|
|
39
|
+
* **发型变化 (Hairstyle Variations)**:常态、战斗、睡觉、正式场合。
|
|
40
|
+
|
|
41
|
+
## 角色档案模板 (Character Profile Template)
|
|
42
|
+
|
|
43
|
+
```markdown
|
|
44
|
+
## 角色:[角色名] (英文名)
|
|
45
|
+
|
|
46
|
+
> "[一句代表台词]"
|
|
47
|
+
|
|
48
|
+
### 1. 基础信息 (Basics)
|
|
49
|
+
- **年龄**:实际年龄 / 视觉年龄
|
|
50
|
+
- **性别**:
|
|
51
|
+
- **职业/身份**:
|
|
52
|
+
- **阵营**:守序善良 / 混乱邪恶等
|
|
53
|
+
|
|
54
|
+
### 2. 外貌特征 (Visuals) for AI
|
|
55
|
+
- **Prompt Keywords**: `[silver hair], [blue eyes], [scar on left cheek], [tall and lean], [cyberpunk jacket]`
|
|
56
|
+
- **Negative Keywords**: `[beard], [glasses], [fat], [muscular]`
|
|
57
|
+
- **Seed Reference**: (可选) 固定 Seed 值
|
|
58
|
+
|
|
59
|
+
### 3. 性格内核 (Core)
|
|
60
|
+
- **MBTI**: [类型]
|
|
61
|
+
- **关键词**: [3-5个形容词]
|
|
62
|
+
- **行事逻辑**: 理性优先 / 情感驱动 / 利益至上
|
|
63
|
+
- **弱点**: [致命弱点]
|
|
64
|
+
|
|
65
|
+
### 4. 背景故事 (Backstory)
|
|
66
|
+
- **起源**: 出生背景
|
|
67
|
+
- **重大转折**: 改变人生的事件
|
|
68
|
+
- **当前目标**: 短期 / 长期
|
|
69
|
+
|
|
70
|
+
### 5. 成长弧线 (Arc)
|
|
71
|
+
- **起点**: [初始状态]
|
|
72
|
+
- **触发**: [激励事件]
|
|
73
|
+
- **中点**: [关键转变]
|
|
74
|
+
- **终点**: [最终状态]
|
|
75
|
+
|
|
76
|
+
### 6. 关系网 (Relationships)
|
|
77
|
+
- **vs [角色B]**: [关系描述]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 一致性检查流程
|
|
81
|
+
|
|
82
|
+
1. **视觉检查**:
|
|
83
|
+
* Prompt 中是否包含了所有 `Fixed Traits`?
|
|
84
|
+
* 服装是否符合当场戏的时间点(是否换装)?
|
|
85
|
+
2. **行为检查**:
|
|
86
|
+
* 该行为是否符合 MBTI/九型人格设定?
|
|
87
|
+
* 对白风格是否符合其声纹特征?
|
|
88
|
+
* 能力使用是否超出设定范围?
|
|
89
|
+
3. **关系检查**:
|
|
90
|
+
* 对待特定角色的态度是否符合关系矩阵?
|
|
91
|
+
* 称呼是否正确(如:叫"哥哥"还是"全名")?
|
|
92
|
+
|
|
93
|
+
## 使用方式
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
请为以下角色创建深度档案:[角色简介]
|
|
97
|
+
请检查第X场中[角色名]的台词是否符合其性格设定
|
|
98
|
+
请生成[角色名]的 AI 绘画一致性 Prompt 词组
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## 注意事项
|
|
102
|
+
|
|
103
|
+
- **动态成长**:角色不是静止的,档案应随剧情推进更新。
|
|
104
|
+
- **视觉锚点**:为 AI 生成指定唯一的视觉特征组合,避免混淆。
|
|
105
|
+
- **避免OOC**:Out Of Character 是角色塑造的大忌,需严格审查。
|