Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 42 additions & 57 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,37 @@ ros run --eval "(push #p\"./\" asdf:*central-registry*)" \

## 開発ガイドライン

### ブランチ運用とワークフロー

#### mainブランチ保護
- **mainブランチは保護されており、直接コミットできません**
- すべての作業は専用のfeatureブランチで行う必要があります
- 変更はPull Request経由でのみmainにマージ可能です

#### 推奨ワークフロー
```bash
# 1. mainから最新を取得
git checkout main && git pull origin main

# 2. 作業用ブランチを作成(命名規則例)
git checkout -b feature/新機能名
git checkout -b fix/バグ修正名
git checkout -b docs/ドキュメント更新名
git checkout -b refactor/リファクタリング内容

# 3. 作業・コミット・プッシュ
git add . && git commit -m "適切なコミットメッセージ"
git push -u origin ブランチ名

# 4. GitHub でPull Request作成
gh pr create --title "タイトル" --body "説明"
```

#### 段階的開発の原則
- **小さな変更を積み重ねる**: 大きな変更は複数のPRに分割
- **各PR毎にテスト実行**: `make test`で既存機能への影響を確認
- **バイナリビルド確認**: `ros build visp.ros`で実行可能性を検証

### 関数名の重複チェック

新しい関数を定義する際は、既存の関数名との重複を避けるため以下を確認してください:
Expand All @@ -99,51 +130,8 @@ Common Lispでは同じパッケージ内で同名関数を再定義すると警

### 高優先度

#### 出力ファイル名生成関数の引数統一 ✅ **完了**
出力ファイル名生成関数の引数を統一し、APIの一貫性を向上:

**実施内容:**
- `generate-gif-output-filename`の引数を`(input &optional opts)`から`(opts)`に変更
- `main.lisp`のGIFモードでの呼び出し方法を修正
- 関連するテストケースを更新
- パッケージエクスポートの追加(`visp-options-output`, `safe-parse-float`)

**結果:**
すべての出力ファイル名生成関数が`opts`を第一引数として受け取るAPIに統一され、
テストスイートでの検証とバイナリビルドでの動作確認も完了。

#### GIFモードのオプション制限強化 ✅ **完了**
GIFモードで`--input`オプションとの組み合わせエラーが適切に処理されていない問題を修正:

**問題:**
- `visp --input test.mp4 --gif --dry-run`でオプション解析が競合し、入力ファイルが空文字列になる
- GIFモードは`visp --gif <file>`の構文のみを受け付けるべきだが、`--input`オプションが禁止リストに含まれていない

**解決策:**
1. `validate-gif-mode`関数の禁止オプションリストに`visp-options-input`を追加
2. GIFモードでは`--gif <file> [--output <filename>] [--dry-run]`の構文のみを許可
3. 不正な構文でのエラーメッセージを改善

**影響範囲:**
- `src/validate.lisp`: GIFモードバリデーションの強化
- `t/test-validate.lisp`: 関連テストケースの追加

#### 関数名重複問題の解決
`util.lisp`と`validate.lisp`で類似のパース関数が重複している問題を統合する:

**問題:**
- `util.lisp:3-10`: `parse-float`関数
- `util.lisp:12-18`: `safe-parse-float`関数(parse-floatのラッパー)
- `validate.lisp:284-288`: `parse-speed-float`関数(独自実装)
- `video.lisp:28`: `safe-parse-float`を参照しているが定義場所が曖昧

**解決策:**
1. 共通のパース関数を`util.lisp`に統合
2. エラーハンドリングを統一
3. 全ての呼び出し箇所を統一された関数に修正

#### ffmpeg実行エラーハンドリング強化
`ffmpeg.lisp:14`の`run-cmd`関数でエラーハンドリングが不十分:
`ffmpeg.lisp:3`の`run-cmd`関数でエラーハンドリングが不十分:

**現在の問題:**
- ffmpeg実行失敗時のエラー情報が不十分
Expand Down Expand Up @@ -175,7 +163,7 @@ visp --input video.mp4 --quality low # 高圧縮(ファイルサイズ優
```

#### コード品質改善
- `validate.lisp`の`validate-merge-files`関数(110行)を小さな関数に分割
- `validate.lisp`の`validate-merge-files`関数(41行目、約70行)を小さな関数に分割
- マジックナンバーの定数化(`ffmpeg.lisp:20`のGIF fps計算など)
- エラーメッセージの日英統一
- 関数レベルdocstringの追加
Expand All @@ -185,25 +173,21 @@ visp --input video.mp4 --quality low # 高圧縮(ファイルサイズ優
- エラーケースの異常系テスト
- バッチ処理でのファイル競合テスト

#### テストコード全体の改修とエラーケーステストの追加
#### エラーケーステストの改善
現在のテストスイートは成功ケースのみをカバーしており、`(uiop:quit 1)`を呼ぶエラーケースがテストできない問題がある:

**現在の問題:**
- validate系関数のエラーケースがテストされていない
- `(uiop:quit 1)`によるプロセス終了がテストフレームワークと非互換
- テストカバレッジが不十分で潜在的バグの発見が困難

**改善策:**
1. バリデーション関数のアーキテクチャを例外ベースに変更
2. カスタム例外クラス(`visp-validation-error`)の導入
3. main.lispでの例外ハンドリングと適切なプロセス終了
4. 全validate系関数のエラーケーステストを追加
5. テストカバレッジの向上とリグレッション防止の強化
**改善アプローチ(段階的実装推奨):**
1. 1つの関数から例外ベースに段階的変更
2. 各段階でのバイナリビルド動作確認
3. エラーケーステストの段階的追加
4. リグレッション防止の強化

**影響範囲:**
- `src/validate.lisp`: 全validation関数の例外ベース化
- `src/main.lisp`: 例外ハンドリングロジック追加
- `t/test-validate.lisp`: 包括的なエラーケーステスト追加
**注意:** 大規模な一括変更は避け、小さな改善を積み重ねる方式を採用する。

### 低優先度

Expand Down Expand Up @@ -254,6 +238,7 @@ visp --input video.mp4 --filters "blur=3,sharpen=1,fade=in:0:30"
- 変数名の統一(キャメルケース vs ケバブケース)

#### 国際化対応

- 日本語コメントの英語化
- エラーメッセージの多言語対応
- ヘルプメッセージの国際化
- ヘルプメッセージの国際化