Skip to content

Commit 032f202

Browse files
authored
feat(redmine): ファイルからチケットを一括作成するスキルを追加 (#19)
* docs(redmine): Windows向けPATH設定ガイドを充実 - README の Windows セクションに sysdm.cpl での PATH 設定手順を追加 - Claude Code でのターミナル再起動の注意点を明記 - 全6スキルの Windows 案内を README への参照に統一(DRY) * feat(redmine): ファイルからチケットを一括作成するスキルを追加 フリーフォーマットのファイル(txt/md/yaml等)からチケット情報を Claude が 意味解釈し、redmine-cli create-issue をループ実行して一括作成する。 親子チケットの階層構造にも対応し、エラー時はスキップして続行する。 Closes #11 * docs(redmine): README と plugin.json に batch-create スキルを追加 - 機能一覧テーブルと使い方セクションに一括作成スキルの説明を追記 - プラグインバージョンを 2.4.0 に更新 * style(redmine): 機能一覧テーブルで batch-create を create の直後に配置
1 parent 66bfdfd commit 032f202

4 files changed

Lines changed: 497 additions & 2 deletions

File tree

Lines changed: 306 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,306 @@
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+
```

redmine/.claude-plugin/plugin.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "redmine",
3-
"version": "2.3.0",
4-
"description": "redmine-cli を活用したチケット検索・閲覧・分析・作成・更新・削除・関連付け支援プラグイン。プロファイル管理で複数の Redmine サーバーを横断操作。",
3+
"version": "2.4.0",
4+
"description": "redmine-cli を活用したチケット検索・閲覧・分析・作成・更新・削除・関連付け・一括作成支援プラグイン。プロファイル管理で複数の Redmine サーバーを横断操作。",
55
"author": {
66
"name": "chippy-ao"
77
},

redmine/README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,20 @@ redmine:update チケット#456にコメントを追加
113113
redmine:update チケット#789を削除
114114
```
115115

116+
### チケット一括作成
117+
118+
```text
119+
redmine:batch-create
120+
```
121+
122+
または具体的に:
123+
124+
```text
125+
redmine:batch-create tickets.yml からチケットを一括作成して
126+
```
127+
128+
フリーフォーマット(txt/md/yaml等)のファイルからチケット情報を読み取り、一括作成する。親子チケットの階層構造にも対応。
129+
116130
### プロジェクト状況分析
117131

118132
```text
@@ -132,6 +146,7 @@ redmine:config
132146
| `redmine:config` | プロファイルの追加・一覧・デフォルト変更・削除 |
133147
| `redmine:search` | キーワード・プロジェクト・ステータス・担当者等でチケット検索、詳細表示 |
134148
| `redmine:create` | 対話的にチケットを作成(プロジェクト選択・名称→ID解決・重複チェック付き) |
149+
| `redmine:batch-create` | ファイルからチケット情報を読み込み一括作成(フリーフォーマット対応・親子階層対応) |
135150
| `redmine:relation` | チケット間のリレーション追加・削除(6種の関連タイプ対応) |
136151
| `redmine:update` | チケットの更新・削除・コメント記入(名称→ID解決・確認フロー付き) |
137152
| `redmine:analyze` | ステータス別集計、担当者負荷、期限切れ警告、優先度分布 |

0 commit comments

Comments
 (0)