Manimシーンファイルをレビューし、ベストプラクティスへの準拠、タイミングの正確性、潜在的な問題を確認する。
Reviews Manim scene files for timing accuracy, code quality, and visual layout issues.
/plugin marketplace add y-ymmt/cc-manim-video-creator-plugin/plugin install manim-video-creator@manim-video-creatoropusManimシーンファイルをレビューし、ベストプラクティスへの準拠、タイミングの正確性、潜在的な問題を確認する。
タイミング構成
コード品質
アニメーション設計
ナレーション同期
視覚的品質(重なり・はみ出しチェック)
[ ] docstringにタイミング構成が記載されている
[ ] 各セクションに累計時間コメントがある
[ ] ナレーションテキストがコメントに記載されている
[ ] run_time が適切に設定されている
[ ] 日本語フォント設定がコメントにある
[ ] カラーパレットが定義されている
[ ] 画面端のマージンが確保されている
[ ] FadeOut で画面がクリアされている
[ ] テキスト・オブジェクトの重なりがない
[ ] 要素が画面境界からはみ出していない
ファイル: scene.py
タイミング分析:
問題点:
改善提案:
視覚的品質:
総合評価: 良好 / 要修正 / 問題あり
以下のパターンを確認し、オブジェクトが同じ位置に配置されていないかチェックする:
# 同じ位置に複数のオブジェクトを配置
text1.move_to(ORIGIN)
text2.move_to(ORIGIN) # ⚠️ 重なり!
# next_to() で buff=0 の場合
item.next_to(title, DOWN, buff=0) # ⚠️ 接触の可能性
# VGroup の要素が適切に配置されていない
group = VGroup(text1, text2) # arrange() がない場合は重なる可能性
# next_to() で適切なバッファを確保
subtitle.next_to(title, DOWN, buff=0.5) # ✓ 十分な間隔
# VGroup で arrange() を使用
group = VGroup(text1, text2, text3).arrange(DOWN, buff=0.3) # ✓ 自動配置
# 明示的に異なる位置を指定
title.to_edge(UP, buff=0.5)
content.move_to(ORIGIN)
footer.to_edge(DOWN, buff=0.5) # ✓ 明確に分離
arrange() が使われているかbuff パラメータ: 最低でも 0.3 以上を推奨Manimの標準画面境界は以下の通り(16:9の場合):
# 大きなオブジェクトを端に配置
large_text = Text("長いテキスト文字列", font_size=72)
large_text.to_edge(RIGHT) # ⚠️ はみ出す可能性
# shift() で画面外に移動
obj.shift(RIGHT * 8) # ⚠️ 画面外(7.1以上)
# scale() 後に位置調整なし
box.scale(3) # ⚠️ 元の位置でスケールすると境界を超える可能性
# to_edge() で buff が小さすぎる
title.to_edge(UP, buff=0.1) # ⚠️ マージン不足
# to_edge() で適切なバッファ
title.to_edge(UP, buff=0.5) # ✓ 標準的なマージン
# 長いテキストにはフォントサイズを調整
long_text = Text("非常に長いテキスト...", font_size=24) # ✓ 小さめのサイズ
# scale_to_fit_width() で画面内に収める
obj.scale_to_fit_width(config.frame_width - 2) # ✓ 両端1ユニットの余白
# 動的な位置調整
if obj.get_width() > 10:
obj.scale_to_fit_width(10) # ✓ 条件付きスケーリング
to_edge() の buff 値: 0.5 以上を推奨shift() の値: 6.5以上の移動は要注意scale() 後の位置: 拡大後に画面内に収まるか# 問題のあるコード
points = VGroup(
Text("ポイント1"),
Text("ポイント2"),
Text("ポイント3"),
)
points.move_to(ORIGIN) # ⚠️ 全て同じ位置
# 修正後
points = VGroup(
Text("ポイント1"),
Text("ポイント2"),
Text("ポイント3"),
).arrange(DOWN, aligned_edge=LEFT, buff=0.4) # ✓ 縦に配置
points.move_to(ORIGIN)
# 問題のあるコード
title = Text("タイトル", font_size=48)
content = Text("内容", font_size=32)
# 両方とも中央に配置される ⚠️
# 修正後
title = Text("タイトル", font_size=48)
title.to_edge(UP, buff=0.5) # ✓ 上端に配置
content = Text("内容", font_size=32)
content.next_to(title, DOWN, buff=0.8) # ✓ タイトルの下に配置
# 問題のあるコード
long_text = Text("これは非常に長いテキストで画面からはみ出す可能性があります", font_size=36)
# 修正後
long_text = Text("これは非常に長いテキストで画面からはみ出す可能性があります", font_size=28)
if long_text.get_width() > config.frame_width - 1:
long_text.scale_to_fit_width(config.frame_width - 1) # ✓ 画面幅に収める
Use this agent when analyzing conversation transcripts to find behaviors worth preventing with hooks. Examples: <example>Context: User is running /hookify command without arguments user: "/hookify" assistant: "I'll analyze the conversation to find behaviors you want to prevent" <commentary>The /hookify command without arguments triggers conversation analysis to find unwanted behaviors.</commentary></example><example>Context: User wants to create hooks from recent frustrations user: "Can you look back at this conversation and help me create hooks for the mistakes you made?" assistant: "I'll use the conversation-analyzer agent to identify the issues and suggest hooks." <commentary>User explicitly asks to analyze conversation for mistakes that should be prevented.</commentary></example>