|
| 1 | +# 一括チケット作成スキル 実装計画 |
| 2 | + |
| 3 | +**Goal:** フリーフォーマットのファイルからチケット情報を解釈し、`redmine-cli create-issue` をループ実行して一括作成するスキルを追加する |
| 4 | + |
| 5 | +**Architecture:** `redmine/skills/batch-create/SKILL.md` に新スキルを定義。Claude がファイルを意味解釈してチケット情報を抽出し、名前→ID解決・確認表示・ループ実行のオーケストレーションを担う。親子チケットは親を先に作成してIDを子に伝播。エラー時はスキップして続行。 |
| 6 | + |
| 7 | +**Tech Stack:** Markdown (SKILL.md) — Claude Code plugin skill format |
| 8 | + |
| 9 | +**Design Document:** GitHub Issue #11 |
| 10 | + |
| 11 | +**GitHub Issue:** https://github.com/chippy-ao/claude-code/issues/11 |
| 12 | + |
| 13 | +**Recommended Execution:** Sequential — 2 tasks, simple dependencies |
| 14 | + |
| 15 | +--- |
| 16 | + |
| 17 | +### Task 1: `redmine/skills/batch-create/SKILL.md` を作成 |
| 18 | + |
| 19 | +**Files:** |
| 20 | + |
| 21 | +- Create: `redmine/skills/batch-create/SKILL.md` |
| 22 | + |
| 23 | +**Step 1: SKILL.md を作成** |
| 24 | + |
| 25 | +```markdown |
| 26 | +--- |
| 27 | +description: Redmineチケット一括作成スキル。ファイルからチケット情報を読み込み、redmine-cli で一括作成する。「redmine:batch-create」「一括作成」「チケットをまとめて作って」「ファイルからチケット作成」で起動。 |
| 28 | +--- |
| 29 | + |
| 30 | +# Redmine チケット一括作成 |
| 31 | + |
| 32 | +ファイル(txt/md/yaml 等)に記載されたチケット情報を読み込み、redmine-cli を使って一括作成する。 |
| 33 | + |
| 34 | +## 利用する CLI コマンド |
| 35 | + |
| 36 | +すべてのコマンドは JSON を stdout に出力する。Bash ツールで実行し、出力をパースして整形表示する。 |
| 37 | + |
| 38 | +- `redmine-cli create-issue` — チケット作成 |
| 39 | +- `redmine-cli projects` — プロジェクト一覧取得 |
| 40 | +- `redmine-cli trackers` — トラッカー一覧取得(名称→ID解決) |
| 41 | +- `redmine-cli statuses` — ステータス一覧取得(名称→ID解決) |
| 42 | +- `redmine-cli categories --project <id>` — カテゴリ一覧取得 |
| 43 | +- `redmine-cli versions --project <id>` — バージョン一覧取得 |
| 44 | +- `redmine-cli config list` — プロファイル一覧取得 |
| 45 | + |
| 46 | +すべてのコマンドに `--profile <name>` を付与してプロファイルを指定する(デフォルトプロファイル使用時は省略可)。 |
| 47 | + |
| 48 | +## 大前提 |
| 49 | + |
| 50 | +- **一括作成専用**: 1件ずつの作成は `redmine:create` スキルを使う |
| 51 | +- **フリーフォーマット対応**: 入力ファイルは txt/md/yaml 等の形式を問わない。Claude が意味解釈してチケット情報を抽出する |
| 52 | +- **未指定項目はデフォルト**: ファイルに書かれている情報のみ使用し、書かれていない項目は Redmine のデフォルトに任せる |
| 53 | +- **確認必須**: チケット作成前に必ず解釈結果の一覧を表示し、ユーザーの承認を得る |
| 54 | +- **スキップ&続行**: 個別チケットの作成でエラーが発生した場合はスキップして残りを続行する |
| 55 | +- チケット情報は参考であり、最新の状態は Redmine 本体で確認するよう補足する |
| 56 | + |
| 57 | +## フロー |
| 58 | + |
| 59 | +### -1. 前提チェック |
| 60 | + |
| 61 | +1. `which redmine-cli` で CLI がインストールされているか確認する |
| 62 | +2. **未インストールの場合**、以下を案内して終了する: |
| 63 | + - macOS: `brew install chippy-ao/tap/redmine-cli` |
| 64 | + - Windows: [README の Windows セクション](../../README.md) を参照(ZIP 展開 → PATH 設定 → ターミナル再起動) |
| 65 | + - その他: `go install github.com/chippy-ao/redmine-cli@latest` |
| 66 | + |
| 67 | +### 0. プロファイル選択 |
| 68 | + |
| 69 | +`redmine-cli config list` を実行してプロファイルを確認する。 |
| 70 | + |
| 71 | +- **0件**: 「プロファイルが未設定です。今から設定しましょう」と伝え、AskUserQuestion でプロファイル名・URL・API キーを順に聞いて `redmine-cli config add` を実行する。設定完了後、そのまま作成フローに継続する |
| 72 | +- **1件**: そのプロファイルを使用する旨を伝え、次のステップに進む |
| 73 | +- **複数**: AskUserQuestion で使用するプロファイルを選択 |
| 74 | + |
| 75 | +### 1. ファイル読み込み・解釈 |
| 76 | + |
| 77 | +ユーザーが指定したファイルを Read ツールで読み込み、内容を意味解釈してチケット情報を抽出する。 |
| 78 | + |
| 79 | +#### 1.1. ファイルの特定 |
| 80 | + |
| 81 | +- ユーザーの入力にファイルパスが含まれていればそれを使用 |
| 82 | +- パスが指定されていなければ AskUserQuestion でファイルパスを質問 |
| 83 | + |
| 84 | +#### 1.2. 解釈ガイドライン |
| 85 | + |
| 86 | +ファイル形式を問わず、以下のルールで解釈する: |
| 87 | + |
| 88 | +- **チケットの区切り**: 見出し(`#`、`##` 等)、空行区切りのブロック、YAML のリスト項目、箇条書きの各項目などをチケットの区切りとみなす |
| 89 | +- **件名**: 各チケットの最初の行、見出しテキスト、または `subject:` キーの値 |
| 90 | +- **説明**: 件名の次に続くテキスト、または `description:` キーの値 |
| 91 | +- **属性**: `トラッカー:`, `tracker:`, `担当:`, `assigned_to:`, `優先度:`, `priority:` 等のキーワードが見つかればその値を抽出 |
| 92 | +- **親子関係**: インデント、ネスト構造(YAML の `children:`)、または見出しレベルの差で親子関係を判断 |
| 93 | +- **全体設定**: ファイル冒頭に `project:`, `profile:`, `tracker:` 等があれば全チケット共通のデフォルトとして適用 |
| 94 | + |
| 95 | +**解釈の原則:** |
| 96 | +- 書かれていない項目は抽出しない(推測で補完しない) |
| 97 | +- 曖昧な場合は Step 3 の確認で「解釈に自信がない」旨を付記する |
| 98 | +- 1行だけのテキストは「件名のみのチケット」として扱う |
| 99 | + |
| 100 | +#### 1.3. プロジェクトの特定 |
| 101 | + |
| 102 | +- ファイル内に `project:` 指定があればそれを使用 |
| 103 | +- なければ AskUserQuestion で `redmine-cli projects --profile <p> --limit 100` の結果からプロジェクトを選択 |
| 104 | + |
| 105 | +### 2. 名前→ID解決 |
| 106 | + |
| 107 | +ファイルから抽出した名称をRedmineのIDに解決する。**名称指定がないチケットはこのステップをスキップ**する。 |
| 108 | + |
| 109 | +1. **トラッカー**: `redmine-cli trackers --profile <p>` で一覧取得し、名称→ID解決 |
| 110 | +2. **バージョン**: `redmine-cli versions --project <proj> --profile <p>` で一覧取得し、名称→ID解決 |
| 111 | +3. **カテゴリ**: `redmine-cli categories --project <proj> --profile <p>` で一覧取得し、名称→ID解決(権限エラー時はスキップ) |
| 112 | + |
| 113 | +- 解決できない名称があった場合、該当チケットに警告マークを付けて Step 3 の確認で表示する |
| 114 | +- 優先度・担当者は ID 直接指定のみ対応(名前→ID解決のコマンドが未実装のため) |
| 115 | + |
| 116 | +### 3. 確認表示 |
| 117 | + |
| 118 | +解釈結果を一覧テーブルで表示し、ユーザーの承認を得る。 |
| 119 | + |
| 120 | +``` |
| 121 | +以下のチケットを作成します(プロジェクト: <project名>): |
| 122 | + |
| 123 | +| # | 件名 | トラッカー | 担当者 | 説明(要約) | 親 | 備考 | |
| 124 | +|---|------|-----------|--------|------------|---|------| |
| 125 | +| 1 | ログイン機能の実装 | (デフォルト) | (なし) | SSO連携も含む... | - | | |
| 126 | +| 2 | ├ 画面デザイン | タスク | (なし) | - | #1 | | |
| 127 | +| 3 | └ API実装 | タスク | (なし) | - | #1 | | |
| 128 | +| 4 | CSV出力対応 | バグ | (なし) | 文字化け修正 | - | ⚠️ トラッカー名未解決 | |
| 129 | +``` |
| 130 | +
|
| 131 | +AskUserQuestion で以下を提示: |
| 132 | +- **「作成する」** → Step 4 に進む |
| 133 | +- **「修正する」** → ユーザーの指示に従って解釈結果を修正し、再表示 |
| 134 | +- **「キャンセル」** → フロー終了 |
| 135 | +
|
| 136 | +### 4. ループ実行 |
| 137 | +
|
| 138 | +承認後、チケットを順番に作成する。**親チケットを先に作成し、返されたIDを子チケットの `--parent-issue-id` に設定する。** |
| 139 | +
|
| 140 | +#### 4.1. 作成順序 |
| 141 | +
|
| 142 | +1. 親チケット(ルートレベル)を上から順に作成 |
| 143 | +2. 各親チケットの作成直後に、その子チケットを作成(親の返却IDを `--parent-issue-id` に設定) |
| 144 | +3. 深いネストがある場合も同様に再帰的に処理 |
| 145 | +
|
| 146 | +#### 4.2. 実行 |
| 147 | +
|
| 148 | +各チケットについて以下を実行: |
| 149 | +
|
| 150 | +```bash |
| 151 | +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] |
| 152 | +``` |
| 153 | + |
| 154 | +- 作成ごとに進捗を表示: 「(3/10) #1234 ログイン機能の実装 ✅」 |
| 155 | +- 説明文に改行が含まれる場合は適切にエスケープする |
| 156 | + |
| 157 | +#### 4.3. エラー時の挙動 |
| 158 | + |
| 159 | +- **作成失敗**: エラーメッセージを記録し、そのチケットをスキップして次に進む |
| 160 | +- **親チケットが失敗した場合**: その子チケットも全てスキップする(親IDが不明のため) |
| 161 | +- **接続エラー・認証エラー**: 一時的な問題の可能性があるため、1回だけリトライ。2回目も失敗したら全体を停止しユーザーに通知 |
| 162 | + |
| 163 | +### 5. 結果サマリーと次のアクション |
| 164 | + |
| 165 | +#### 5.1. サマリー表示 |
| 166 | + |
| 167 | +``` |
| 168 | +一括作成が完了しました: |
| 169 | +
|
| 170 | +✅ 成功: 8件 |
| 171 | +❌ 失敗: 2件 |
| 172 | +
|
| 173 | +| # | 結果 | ID | 件名 | エラー | |
| 174 | +|---|------|-----|------|-------| |
| 175 | +| 1 | ✅ | #1234 | ログイン機能の実装 | - | |
| 176 | +| 2 | ✅ | #1235 | ├ 画面デザイン | - | |
| 177 | +| 3 | ✅ | #1236 | └ API実装 | - | |
| 178 | +| 4 | ❌ | - | CSV出力対応 | トラッカー「バグ修正」が見つかりません | |
| 179 | +... |
| 180 | +``` |
| 181 | + |
| 182 | +#### 5.2. 次のアクション提案 |
| 183 | + |
| 184 | +次のアクションを**平易な言葉**で提案する: |
| 185 | + |
| 186 | +- **失敗したチケットを修正して再作成**: 失敗原因を修正し、失敗分だけ `redmine:create` で個別作成 |
| 187 | +- **関連チケットを追加する**: `redmine:relation` スキルへ案内 |
| 188 | +- **別のファイルから一括作成する**: 同じスキルで別ファイルを指定 |
| 189 | +- **検索に戻る**: `redmine:search` スキルへ案内 |
| 190 | + |
| 191 | +## エラーハンドリング |
| 192 | + |
| 193 | +- **CLI 未インストール**: `which redmine-cli` で検出。OS に応じたインストール方法を案内 |
| 194 | +- **プロファイル未設定**: `redmine-cli config list` で空を検出。インラインで config add フローを実行し、設定完了後に元のフローに継続 |
| 195 | +- **認証エラー・接続エラー**: 「Redmine への接続でエラーが発生しました。以下を確認してください: (1) プロファイルの URL が正しいか (2) API キーが有効か (3) Redmine サーバーが稼働しているか。`redmine-cli config list` でプロファイル設定を確認できます」と案内する |
| 196 | +- **ファイル読み込みエラー**: ファイルが存在しない、読み取り権限がない場合はパスの確認を促す |
| 197 | +- **解釈結果が0件**: 「チケット情報を抽出できませんでした。ファイルの内容を確認してください」と表示し、ファイル内容の一部を表示して解釈のヒントを提案する |
| 198 | +- **バリデーションエラー (422)**: エラーメッセージを記録してスキップ。サマリーで表示 |
| 199 | +- **親チケット作成失敗**: 子チケットも全てスキップし、サマリーで「親チケット失敗のためスキップ」と明記 |
| 200 | +``` |
| 201 | +
|
| 202 | +**Step 2: 変更の検証** |
| 203 | +
|
| 204 | +SKILL.md を通読し、以下を確認する: |
| 205 | +- frontmatter の description がトリガーワードを含んでいる |
| 206 | +- 利用する CLI コマンドが既存スキルと整合している |
| 207 | +- フロー全体が Issue #11 の想定フロー(6ステップ)をカバーしている |
| 208 | +- 検討事項3点(フォーマット・エラー挙動・親子)すべて反映されている |
| 209 | +- 既存スキル(create, relation 等)との参照関係が適切 |
| 210 | +- Markdown の見出しレベル・スタイルが既存スキルと統一されている |
| 211 | +
|
| 212 | +Expected: 全チェック項目が OK |
| 213 | +
|
| 214 | +**Step 3: Commit** |
| 215 | +
|
| 216 | +```bash |
| 217 | +git add redmine/skills/batch-create/SKILL.md |
| 218 | +git commit -m "feat(redmine): ファイルからチケットを一括作成するスキルを追加 |
| 219 | +
|
| 220 | +フリーフォーマットのファイル(txt/md/yaml等)からチケット情報をClaude が |
| 221 | +意味解釈し、redmine-cli create-issue をループ実行して一括作成する。 |
| 222 | +親子チケットの階層構造にも対応し、エラー時はスキップして続行する。 |
| 223 | +
|
| 224 | +Closes #11" |
| 225 | +``` |
| 226 | + |
| 227 | +--- |
| 228 | + |
| 229 | +### Task 2: README.md と plugin.json を更新 |
| 230 | + |
| 231 | +**依存:** Task 1 |
| 232 | + |
| 233 | +**Files:** |
| 234 | + |
| 235 | +- Modify: `redmine/README.md` |
| 236 | +- Modify: `redmine/.claude-plugin/plugin.json` |
| 237 | + |
| 238 | +**Step 1: README.md の機能一覧テーブルに `batch-create` を追加** |
| 239 | + |
| 240 | +`redmine/README.md` の機能一覧テーブル(`| redmine:update |` の行の後)に以下を追加: |
| 241 | + |
| 242 | +```markdown |
| 243 | +| `redmine:batch-create` | ファイルからチケット情報を読み込み一括作成(フリーフォーマット対応・親子階層対応) | |
| 244 | +``` |
| 245 | + |
| 246 | +また、「## 使い方」セクションに以下を追加(「### チケット更新・削除・コメント」の後): |
| 247 | + |
| 248 | +```markdown |
| 249 | +### チケット一括作成 |
| 250 | + |
| 251 | +```text |
| 252 | +redmine:batch-create |
| 253 | +``` |
| 254 | + |
| 255 | +または具体的に: |
| 256 | + |
| 257 | +```text |
| 258 | +redmine:batch-create tickets.yml からチケットを一括作成して |
| 259 | +``` |
| 260 | + |
| 261 | +フリーフォーマット(txt/md/yaml等)のファイルからチケット情報を読み取り、一括作成する。親子チケットの階層構造にも対応。 |
| 262 | +``` |
| 263 | + |
| 264 | +**Step 2: plugin.json のバージョンと description を更新** |
| 265 | + |
| 266 | +`redmine/.claude-plugin/plugin.json` の変更: |
| 267 | +- `version`: `"2.3.0"` → `"2.4.0"` |
| 268 | +- `description`: 末尾に `一括作成` を追加 |
| 269 | + |
| 270 | +```json |
| 271 | +{ |
| 272 | + "name": "redmine", |
| 273 | + "version": "2.4.0", |
| 274 | + "description": "redmine-cli を活用したチケット検索・閲覧・分析・作成・更新・削除・関連付け・一括作成支援プラグイン。プロファイル管理で複数の Redmine サーバーを横断操作。", |
| 275 | + "author": { |
| 276 | + "name": "chippy-ao" |
| 277 | + }, |
| 278 | + "license": "MIT", |
| 279 | + "keywords": [ |
| 280 | + "redmine", |
| 281 | + "ticket", |
| 282 | + "issue-tracking", |
| 283 | + "project-management", |
| 284 | + "cli" |
| 285 | + ] |
| 286 | +} |
| 287 | +``` |
| 288 | + |
| 289 | +**Step 3: 変更の検証** |
| 290 | + |
| 291 | +- README.md の機能一覧テーブルに `batch-create` が含まれている |
| 292 | +- README.md の使い方セクションに一括作成の説明がある |
| 293 | +- plugin.json のバージョンが 2.4.0 に更新されている |
| 294 | +- Markdown のフォーマットが既存と統一されている |
| 295 | + |
| 296 | +Expected: 全チェック項目が OK |
| 297 | + |
| 298 | +**Step 4: Commit** |
| 299 | + |
| 300 | +```bash |
| 301 | +git add redmine/README.md redmine/.claude-plugin/plugin.json |
| 302 | +git commit -m "docs(redmine): README と plugin.json に batch-create スキルを追加 |
| 303 | +
|
| 304 | +機能一覧テーブルと使い方セクションに一括作成スキルの説明を追記。 |
| 305 | +プラグインバージョンを 2.4.0 に更新。" |
| 306 | +``` |
0 commit comments