Skip to content
Merged
Show file tree
Hide file tree
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
306 changes: 306 additions & 0 deletions docs/plans/2026-04-01-batch-create-plan.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,306 @@
# 一括チケット作成スキル 実装計画

**Goal:** フリーフォーマットのファイルからチケット情報を解釈し、`redmine-cli create-issue` をループ実行して一括作成するスキルを追加する

**Architecture:** `redmine/skills/batch-create/SKILL.md` に新スキルを定義。Claude がファイルを意味解釈してチケット情報を抽出し、名前→ID解決・確認表示・ループ実行のオーケストレーションを担う。親子チケットは親を先に作成してIDを子に伝播。エラー時はスキップして続行。

**Tech Stack:** Markdown (SKILL.md) — Claude Code plugin skill format

**Design Document:** GitHub Issue #11

**GitHub Issue:** https://github.com/chippy-ao/claude-code/issues/11

**Recommended Execution:** Sequential — 2 tasks, simple dependencies

---

### Task 1: `redmine/skills/batch-create/SKILL.md` を作成

**Files:**

- Create: `redmine/skills/batch-create/SKILL.md`

**Step 1: SKILL.md を作成**

```markdown
---
description: Redmineチケット一括作成スキル。ファイルからチケット情報を読み込み、redmine-cli で一括作成する。「redmine:batch-create」「一括作成」「チケットをまとめて作って」「ファイルからチケット作成」で起動。
---

# Redmine チケット一括作成

ファイル(txt/md/yaml 等)に記載されたチケット情報を読み込み、redmine-cli を使って一括作成する。

## 利用する CLI コマンド

すべてのコマンドは JSON を stdout に出力する。Bash ツールで実行し、出力をパースして整形表示する。

- `redmine-cli create-issue` — チケット作成
- `redmine-cli projects` — プロジェクト一覧取得
- `redmine-cli trackers` — トラッカー一覧取得(名称→ID解決)
- `redmine-cli statuses` — ステータス一覧取得(名称→ID解決)
- `redmine-cli categories --project <id>` — カテゴリ一覧取得
- `redmine-cli versions --project <id>` — バージョン一覧取得
- `redmine-cli config list` — プロファイル一覧取得

すべてのコマンドに `--profile <name>` を付与してプロファイルを指定する(デフォルトプロファイル使用時は省略可)。

## 大前提

- **一括作成専用**: 1件ずつの作成は `redmine:create` スキルを使う
- **フリーフォーマット対応**: 入力ファイルは txt/md/yaml 等の形式を問わない。Claude が意味解釈してチケット情報を抽出する
- **未指定項目はデフォルト**: ファイルに書かれている情報のみ使用し、書かれていない項目は Redmine のデフォルトに任せる
- **確認必須**: チケット作成前に必ず解釈結果の一覧を表示し、ユーザーの承認を得る
- **スキップ&続行**: 個別チケットの作成でエラーが発生した場合はスキップして残りを続行する
- チケット情報は参考であり、最新の状態は Redmine 本体で確認するよう補足する

## フロー

### -1. 前提チェック

1. `which redmine-cli` で CLI がインストールされているか確認する
2. **未インストールの場合**、以下を案内して終了する:
- macOS: `brew install chippy-ao/tap/redmine-cli`
- Windows: [README の Windows セクション](../../README.md) を参照(ZIP 展開 → PATH 設定 → ターミナル再起動)
- その他: `go install github.com/chippy-ao/redmine-cli@latest`

### 0. プロファイル選択

`redmine-cli config list` を実行してプロファイルを確認する。

- **0件**: 「プロファイルが未設定です。今から設定しましょう」と伝え、AskUserQuestion でプロファイル名・URL・API キーを順に聞いて `redmine-cli config add` を実行する。設定完了後、そのまま作成フローに継続する
- **1件**: そのプロファイルを使用する旨を伝え、次のステップに進む
- **複数**: AskUserQuestion で使用するプロファイルを選択

### 1. ファイル読み込み・解釈

ユーザーが指定したファイルを Read ツールで読み込み、内容を意味解釈してチケット情報を抽出する。

#### 1.1. ファイルの特定

- ユーザーの入力にファイルパスが含まれていればそれを使用
- パスが指定されていなければ AskUserQuestion でファイルパスを質問

#### 1.2. 解釈ガイドライン

ファイル形式を問わず、以下のルールで解釈する:

- **チケットの区切り**: 見出し(`#`、`##` 等)、空行区切りのブロック、YAML のリスト項目、箇条書きの各項目などをチケットの区切りとみなす
- **件名**: 各チケットの最初の行、見出しテキスト、または `subject:` キーの値
- **説明**: 件名の次に続くテキスト、または `description:` キーの値
- **属性**: `トラッカー:`, `tracker:`, `担当:`, `assigned_to:`, `優先度:`, `priority:` 等のキーワードが見つかればその値を抽出
- **親子関係**: インデント、ネスト構造(YAML の `children:`)、または見出しレベルの差で親子関係を判断
- **全体設定**: ファイル冒頭に `project:`, `profile:`, `tracker:` 等があれば全チケット共通のデフォルトとして適用

**解釈の原則:**
- 書かれていない項目は抽出しない(推測で補完しない)
- 曖昧な場合は Step 3 の確認で「解釈に自信がない」旨を付記する
- 1行だけのテキストは「件名のみのチケット」として扱う

#### 1.3. プロジェクトの特定

- ファイル内に `project:` 指定があればそれを使用
- なければ AskUserQuestion で `redmine-cli projects --profile <p> --limit 100` の結果からプロジェクトを選択

### 2. 名前→ID解決

ファイルから抽出した名称をRedmineのIDに解決する。**名称指定がないチケットはこのステップをスキップ**する。

1. **トラッカー**: `redmine-cli trackers --profile <p>` で一覧取得し、名称→ID解決
2. **バージョン**: `redmine-cli versions --project <proj> --profile <p>` で一覧取得し、名称→ID解決
3. **カテゴリ**: `redmine-cli categories --project <proj> --profile <p>` で一覧取得し、名称→ID解決(権限エラー時はスキップ)

- 解決できない名称があった場合、該当チケットに警告マークを付けて Step 3 の確認で表示する
- 優先度・担当者は ID 直接指定のみ対応(名前→ID解決のコマンドが未実装のため)

### 3. 確認表示

解釈結果を一覧テーブルで表示し、ユーザーの承認を得る。

```
以下のチケットを作成します(プロジェクト: <project名>):

| # | 件名 | トラッカー | 担当者 | 説明(要約) | 親 | 備考 |
|---|------|-----------|--------|------------|---|------|
| 1 | ログイン機能の実装 | (デフォルト) | (なし) | SSO連携も含む... | - | |
| 2 | ├ 画面デザイン | タスク | (なし) | - | #1 | |
| 3 | └ API実装 | タスク | (なし) | - | #1 | |
| 4 | CSV出力対応 | バグ | (なし) | 文字化け修正 | - | ⚠️ トラッカー名未解決 |
```

AskUserQuestion で以下を提示:
- **「作成する」** → Step 4 に進む
- **「修正する」** → ユーザーの指示に従って解釈結果を修正し、再表示
- **「キャンセル」** → フロー終了

### 4. ループ実行

承認後、チケットを順番に作成する。**親チケットを先に作成し、返されたIDを子チケットの `--parent-issue-id` に設定する。**

#### 4.1. 作成順序

1. 親チケット(ルートレベル)を上から順に作成
2. 各親チケットの作成直後に、その子チケットを作成(親の返却IDを `--parent-issue-id` に設定)
3. 深いネストがある場合も同様に再帰的に処理

#### 4.2. 実行

各チケットについて以下を実行:

```bash
redmine-cli create-issue --profile <p> --project <proj> --subject "件名" [--description "説明"] [--tracker-id N] [--priority-id N] [--assigned-to-id N] [--version-id N] [--category-id N] [--parent-issue-id N] [--estimated-hours N] [--private]
```

- 作成ごとに進捗を表示: 「(3/10) #1234 ログイン機能の実装 ✅」
- 説明文に改行が含まれる場合は適切にエスケープする

#### 4.3. エラー時の挙動

- **作成失敗**: エラーメッセージを記録し、そのチケットをスキップして次に進む
- **親チケットが失敗した場合**: その子チケットも全てスキップする(親IDが不明のため)
- **接続エラー・認証エラー**: 一時的な問題の可能性があるため、1回だけリトライ。2回目も失敗したら全体を停止しユーザーに通知

### 5. 結果サマリーと次のアクション

#### 5.1. サマリー表示

```
一括作成が完了しました:

✅ 成功: 8件
❌ 失敗: 2件

| # | 結果 | ID | 件名 | エラー |
|---|------|-----|------|-------|
| 1 | ✅ | #1234 | ログイン機能の実装 | - |
| 2 | ✅ | #1235 | ├ 画面デザイン | - |
| 3 | ✅ | #1236 | └ API実装 | - |
| 4 | ❌ | - | CSV出力対応 | トラッカー「バグ修正」が見つかりません |
...
```

#### 5.2. 次のアクション提案

次のアクションを**平易な言葉**で提案する:

- **失敗したチケットを修正して再作成**: 失敗原因を修正し、失敗分だけ `redmine:create` で個別作成
- **関連チケットを追加する**: `redmine:relation` スキルへ案内
- **別のファイルから一括作成する**: 同じスキルで別ファイルを指定
- **検索に戻る**: `redmine:search` スキルへ案内

## エラーハンドリング

- **CLI 未インストール**: `which redmine-cli` で検出。OS に応じたインストール方法を案内
- **プロファイル未設定**: `redmine-cli config list` で空を検出。インラインで config add フローを実行し、設定完了後に元のフローに継続
- **認証エラー・接続エラー**: 「Redmine への接続でエラーが発生しました。以下を確認してください: (1) プロファイルの URL が正しいか (2) API キーが有効か (3) Redmine サーバーが稼働しているか。`redmine-cli config list` でプロファイル設定を確認できます」と案内する
- **ファイル読み込みエラー**: ファイルが存在しない、読み取り権限がない場合はパスの確認を促す
- **解釈結果が0件**: 「チケット情報を抽出できませんでした。ファイルの内容を確認してください」と表示し、ファイル内容の一部を表示して解釈のヒントを提案する
- **バリデーションエラー (422)**: エラーメッセージを記録してスキップ。サマリーで表示
- **親チケット作成失敗**: 子チケットも全てスキップし、サマリーで「親チケット失敗のためスキップ」と明記
```

**Step 2: 変更の検証**

SKILL.md を通読し、以下を確認する:
- frontmatter の description がトリガーワードを含んでいる
- 利用する CLI コマンドが既存スキルと整合している
- フロー全体が Issue #11 の想定フロー(6ステップ)をカバーしている
- 検討事項3点(フォーマット・エラー挙動・親子)すべて反映されている
- 既存スキル(create, relation 等)との参照関係が適切
- Markdown の見出しレベル・スタイルが既存スキルと統一されている

Expected: 全チェック項目が OK

**Step 3: Commit**

```bash
git add redmine/skills/batch-create/SKILL.md
git commit -m "feat(redmine): ファイルからチケットを一括作成するスキルを追加

フリーフォーマットのファイル(txt/md/yaml等)からチケット情報をClaude が
意味解釈し、redmine-cli create-issue をループ実行して一括作成する。
親子チケットの階層構造にも対応し、エラー時はスキップして続行する。

Closes #11"
```

---

### Task 2: README.md と plugin.json を更新

**依存:** Task 1

**Files:**

- Modify: `redmine/README.md`
- Modify: `redmine/.claude-plugin/plugin.json`

**Step 1: README.md の機能一覧テーブルに `batch-create` を追加**

`redmine/README.md` の機能一覧テーブル(`| redmine:update |` の行の後)に以下を追加:

```markdown
| `redmine:batch-create` | ファイルからチケット情報を読み込み一括作成(フリーフォーマット対応・親子階層対応) |
```

また、「## 使い方」セクションに以下を追加(「### チケット更新・削除・コメント」の後):

```markdown
### チケット一括作成

```text
redmine:batch-create
```

または具体的に:

```text
redmine:batch-create tickets.yml からチケットを一括作成して
```

フリーフォーマット(txt/md/yaml等)のファイルからチケット情報を読み取り、一括作成する。親子チケットの階層構造にも対応。
```

**Step 2: plugin.json のバージョンと description を更新**

`redmine/.claude-plugin/plugin.json` の変更:
- `version`: `"2.3.0"` → `"2.4.0"`
- `description`: 末尾に `一括作成` を追加

```json
{
"name": "redmine",
"version": "2.4.0",
"description": "redmine-cli を活用したチケット検索・閲覧・分析・作成・更新・削除・関連付け・一括作成支援プラグイン。プロファイル管理で複数の Redmine サーバーを横断操作。",
"author": {
"name": "chippy-ao"
},
"license": "MIT",
"keywords": [
"redmine",
"ticket",
"issue-tracking",
"project-management",
"cli"
]
}
```

**Step 3: 変更の検証**

- README.md の機能一覧テーブルに `batch-create` が含まれている
- README.md の使い方セクションに一括作成の説明がある
- plugin.json のバージョンが 2.4.0 に更新されている
- Markdown のフォーマットが既存と統一されている

Expected: 全チェック項目が OK

**Step 4: Commit**

```bash
git add redmine/README.md redmine/.claude-plugin/plugin.json
git commit -m "docs(redmine): README と plugin.json に batch-create スキルを追加

機能一覧テーブルと使い方セクションに一括作成スキルの説明を追記。
プラグインバージョンを 2.4.0 に更新。"
```
4 changes: 2 additions & 2 deletions redmine/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "redmine",
"version": "2.3.0",
"description": "redmine-cli を活用したチケット検索・閲覧・分析・作成・更新・削除・関連付け支援プラグイン。プロファイル管理で複数の Redmine サーバーを横断操作。",
"version": "2.4.0",
"description": "redmine-cli を活用したチケット検索・閲覧・分析・作成・更新・削除・関連付け・一括作成支援プラグイン。プロファイル管理で複数の Redmine サーバーを横断操作。",
"author": {
"name": "chippy-ao"
},
Expand Down
35 changes: 27 additions & 8 deletions redmine/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,22 @@ brew install chippy-ao/tap/redmine-cli
**Windows:**

1. [GitHub Releases](https://github.com/chippy-ao/redmine-cli/releases) から ZIP をダウンロード
2. ZIP を展開し、`redmine-cli.exe` を取得
3. コマンドプロンプトか PowerShell で `redmine-cli.exe` があるフォルダから実行:
2. ZIP を展開し、`redmine-cli.exe` を任意のフォルダに配置(例: `C:\tools\redmine-cli\`)
3. PATH を設定して、どこからでも `redmine-cli` コマンドを実行できるようにする:
- `Win + R` →「`sysdm.cpl`」を実行 →「詳細設定」タブ →「環境変数」
- ユーザー環境変数の `Path` を選んで「編集」→「新規」
- `redmine-cli.exe` を配置したフォルダのパスを追加(例: `C:\tools\redmine-cli`)
- 「OK」で閉じる
4. **ターミナルを再起動**して PATH を反映:
- コマンドプロンプトや PowerShell を**一度閉じて開き直す**
- Claude Code を使っている場合は、**Claude Code を起動しているターミナルも再起動**が必要(Claude Code はターミナルの環境変数を継承するため)
5. 動作確認:

```powershell
.\redmine-cli.exe config add work --url https://redmine.example.com --api-key YOUR_API_KEY
.\redmine-cli.exe search --keyword "バグ" --status open
redmine-cli --version
```

4. (任意)PATH を通すとどこからでも実行可能:
- Win + X →「システム」→「システムの詳細設定」→「環境変数」
- `Path` を選んで「編集」→「新規」で `redmine-cli.exe` があるフォルダのパスを追加
- コマンドプロンプトを再起動
バージョンが表示されれば OK。Claude Code 上でも同様に認識される。

**go install:**

Expand Down Expand Up @@ -109,6 +113,20 @@ redmine:update チケット#456にコメントを追加
redmine:update チケット#789を削除
```

### チケット一括作成

```text
redmine:batch-create
```

または具体的に:

```text
redmine:batch-create tickets.yml からチケットを一括作成して
```

フリーフォーマット(txt/md/yaml等)のファイルからチケット情報を読み取り、一括作成する。親子チケットの階層構造にも対応。

### プロジェクト状況分析

```text
Expand All @@ -128,6 +146,7 @@ redmine:config
| `redmine:config` | プロファイルの追加・一覧・デフォルト変更・削除 |
| `redmine:search` | キーワード・プロジェクト・ステータス・担当者等でチケット検索、詳細表示 |
| `redmine:create` | 対話的にチケットを作成(プロジェクト選択・名称→ID解決・重複チェック付き) |
| `redmine:batch-create` | ファイルからチケット情報を読み込み一括作成(フリーフォーマット対応・親子階層対応) |
| `redmine:relation` | チケット間のリレーション追加・削除(6種の関連タイプ対応) |
| `redmine:update` | チケットの更新・削除・コメント記入(名称→ID解決・確認フロー付き) |
| `redmine:analyze` | ステータス別集計、担当者負荷、期限切れ警告、優先度分布 |
Expand Down
2 changes: 1 addition & 1 deletion redmine/skills/analyze/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ redmine-cli を使ってチケット群を取得し、プロジェクトの状
1. `which redmine-cli` で CLI がインストールされているか確認する
2. **未インストールの場合**、以下を案内して終了する:
- macOS: `brew install chippy-ao/tap/redmine-cli`
- Windows: GitHub Releases (https://github.com/chippy-ao/redmine-cli/releases) から ZIP をダウンロードし、展開して `redmine-cli.exe` を取得。PATH に追加すると便利
- Windows: [README の Windows セクション](../../README.md) を参照(ZIP 展開 → PATH 設定 → ターミナル再起動)
- その他: `go install github.com/chippy-ao/redmine-cli@latest`

### 1. プロファイル選択
Expand Down
Loading
Loading