実装計画を立てました。コードはまだ書いていません。計画ファイルは `<計画ファイル置き場>/add-vast-pearl.md` です。

## 実装計画

調べたところ、変更が必要なのは `models.py`、`store.py`、`cli.py`、テスト、README の5か所です。

**1. `models.py`**
- `Task` に `repeat: str | None = None` を追加します。`to_dict` と `from_dict` にも反映し、`from_dict` は `d.get("repeat")` にして既存JSONを読めるようにします。
- `next_due(due, repeat)` を追加します。daily は +1日、weekly は +7日、monthly は +1か月です。月末は `calendar.monthrange` で丸めます（例: 1/31 → 2/28）。

**2. `store.py`**
- `add()` に `repeat` を追加します。
- `complete()` を変更します。
  - すでに完了済みのタスクは何もしません。
  - `repeat` があれば、完了日ではなく元の期限日を基準に次回タスクを作ります。
  - 次回タスクは新しいIDを持ち、title、priority、tags、repeat を引き継ぎます。
  - 戻り値は `(task, next_task | None)` にします。呼び出し元は `cli.py` と既存テスト1か所だけです。

**3. `cli.py`**
- `add` に `--repeat {daily,weekly,monthly}` を追加します。
- `--repeat` があって `--due` がなければ、メッセージを出して終了コード1にし、保存しません。
- `done` で次回が作られたら、`次回を追加しました: ID タイトル (期限 …)` を出力します。

**4. テストと README**
- `next_due` の単体テストを追加します（月末、うるう年、年またぎ）。
- Store のテストを追加します。遅れて完了しても元期限基準になること、非繰り返しでは次回が作られないこと、二重 `done` で増えないこと、旧JSONを読めることを確かめます。
- CLI のテストを追加します。`--due` なしで終了コード1になること、`done` の出力に次回情報が出ることを確かめます。
- README に `--repeat` の使用例とルールを追記します。

**検証**: `python -m unittest discover -s tests` を実行し、手動でも `add --repeat weekly` → `done` → `list` を確認します。

## 確認したい点（今のデフォルト案）

- **monthly の月末**: 1/31 → 2/28 になり、次回は 2/28 基準なので 3/28 とずれていきます。31日に戻す案は、開始日を別に保持する必要があるため見送っています。
- **遅れて完了した場合**: 期限10/1の daily を10/15に完了すると、次回は10/2のままで過去日になります。仕様どおり元期限基準とし、追い付き処理はしません。
- **完了済みタスクへの再 `done`**: 何もせず、次回も作りません。

このままでよければ実装に進みます。変えたい点があれば教えてください。

なお、この環境では plan mode の承認用ツール（ExitPlanMode）が使えなかったため、承認の確認はこの文面で行っています。