# バッチ設計書 33-lint-fix

## 概要

本ドキュメントは、clojure-lspプロジェクトにおけるlint-fixバッチの設計仕様を定義するものです。lint-fixは、clean-nsとformatリンターを実行し、自動修正を適用するタスクです。

### 本バッチの処理概要

lint-fixバッチは、clojure-lspのclean-nsコマンドとformatコマンドを順番に実行し、プロジェクト内のClojureソースコードの名前空間整理とフォーマット修正を自動的に適用するタスクです。

**業務上の目的・背景**：開発者の生産性向上のため、コードスタイルの統一化と名前空間の整理を自動化する仕組みが必要です。手動での修正作業を削減し、一貫したコードベースを維持することで、コードレビューの効率化と品質向上を図ります。

**バッチの実行タイミング**：開発時に手動で実行することが想定されます。コード変更後、コミット前に実行することで、リンターエラーを事前に解消できます。CI/CDでのlintタスク失敗後の修正作業として使用されることもあります。

**主要な処理内容**：
1. clean-nsコマンドを実行（未使用のrequire/refer/importを削除、アルファベット順にソート）
2. formatコマンドを実行（cljfmtによるコードフォーマット適用）
3. 両コマンドとも実際にファイルを変更（ドライモードではない）

**前後の処理との関連**：bb lintタスクで検出された問題を修正するために使用されます。lint-cleanとlint-formatの修正版として機能し、ドライモードではなく実際の変更を適用します。lint-diagnosticsで検出される問題は自動修正の対象外です。

**影響範囲**：プロジェクト内のClojureソースファイルが直接変更されます。変更は破壊的であり、ロールバックにはgitなどのバージョン管理が必要です。

## バッチ種別

リント処理 / コード自動修正

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | - |
| 実行曜日 | - |
| 実行日 | - |
| トリガー | 手動 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Babashka | Babashka (bb) がインストールされていること |
| プロジェクト構造 | clojure-lspプロジェクトのルートディレクトリで実行すること |
| 依存関係 | cli/deps.ednに定義された依存関係が解決可能であること |
| バージョン管理 | 変更をロールバックできるよう、gitで管理されていることを推奨 |

### 実行可否判定

特別な実行可否判定ロジックはありません。Babashkaが利用可能であれば実行可能です。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| --ns-exclude-regex | String | No | `.*sample-test.*` | 除外する名前空間のパターン |
| --project-root | String | No | `../` | プロジェクトルートディレクトリのパス |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| Clojureソースファイル | .clj/.cljs/.cljc | プロジェクト内の全Clojureソースファイル |
| cljfmt設定 | EDN | フォーマット設定（存在する場合） |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| Clojureソースファイル | .clj/.cljs/.cljc | 修正が適用されたソースファイル |
| 標準出力 | テキスト | 処理結果・変更情報 |
| 終了コード | 数値 | 0: 成功、非0: 失敗 |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | 元のソースファイル（上書き） |
| 出力先 | 元のソースファイルと同じ場所 |
| 文字コード | 元のファイルと同じ |
| 変更内容 | 名前空間整理、コードフォーマット |

## 処理フロー

### 処理シーケンス

```
1. Babashkaタスク起動
   └─ bb lint-fix コマンドを実行
2. make/lint-fix関数呼び出し
   └─ make.clj内のlint-fix関数を実行
3. clean-nsコマンド実行
   └─ lint関数に"clean-ns"を渡して実行（ドライモードなし）
4. 名前空間整理適用
   └─ 未使用require/refer/importの削除、ソート
5. formatコマンド実行
   └─ lint関数に"format"を渡して実行（ドライモードなし）
6. フォーマット適用
   └─ cljfmtによるコードフォーマット
7. 完了
   └─ 変更されたファイル情報を出力
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[bb lint-fix 実行]
    B --> C[make/lint-fix 関数呼び出し]
    C --> D[run! で clean-ns と format を順次実行]
    D --> E[lint 関数: clean-ns 実行]
    E --> F[名前空間整理を適用]
    F --> G[lint 関数: format 実行]
    G --> H[コードフォーマットを適用]
    H --> I{処理成功?}
    I -->|成功| J[正常終了]
    I -->|失敗| K[エラー終了]
    J --> L[終了コード 0]
    K --> M[終了コード 非0]
    L --> N[バッチ終了]
    M --> N
```

## データベース操作仕様

### 操作別データベース影響一覧

本バッチはデータベース操作を行いません。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 非0 | 構文エラー | ソースコードに構文エラーがある場合 | ソースコードの構文エラーを手動で修正 |
| 非0 | 実行エラー | Babashkaまたは依存関係の問題 | Babashkaのインストール確認、依存関係の解決 |
| 非0 | ファイルアクセスエラー | ファイルの読み書き権限がない場合 | ファイル権限を確認・修正 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（リトライなし） |
| リトライ間隔 | - |
| リトライ対象エラー | - |

### 障害時対応

1. エラーメッセージを確認し、問題の原因を特定
2. 構文エラーの場合は、ソースコードを手動で修正
3. 変更をロールバックする必要がある場合は、`git checkout -- .`で元に戻す
4. 依存関係の問題の場合は、`clojure -P`で依存関係を再取得

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | ファイル単位（各ファイルを個別に更新） |
| コミットタイミング | 各ファイル処理完了時 |
| ロールバック条件 | gitによる手動ロールバックが必要 |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | プロジェクト内の全Clojureファイル |
| 目標処理時間 | プロジェクトサイズに依存（中規模で数十秒〜数分程度） |
| メモリ使用量上限 | JVMデフォルト設定に準拠 |

## 排他制御

同時実行は推奨されません。複数のlint-fixプロセスが同時に実行されると、ファイルの競合が発生する可能性があります。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | 各コマンド開始時 | 実行するコマンド名 |
| 進捗ログ | 処理中 | 修正対象ファイル情報 |
| 結果ログ | 処理完了時 | 変更されたファイル情報 |
| エラーログ | エラー発生時 | エラー詳細情報 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 終了コード | 非0 | 標準エラー出力 |

## 備考

- lint-fixはファイルを直接変更するため、実行前にgit statusで変更を確認することを推奨
- clean-nsとformatの両方が順次実行される
- diagnosticsで検出される問題は自動修正されない（手動修正が必要）
- sample-testディレクトリは除外対象として設定されている
