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
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@
},
"metadata": {
"description": "AI-driven development toolkit for TDD and SDD workflows, providing comprehensive command templates and agents to enhance developer productivity with Claude Code",
"version": "1.4.0"
"version": "1.4.1"
},
"plugins": [
{
"name": "tsumiki",
"source": "./",
"description": "AI-driven development toolkit for TDD and SDD workflows, providing comprehensive command templates and agents to enhance developer productivity with Claude Code",
"version": "1.4.0",
"version": "1.4.1",
"author": {
"name": "makoto kuroeda",
"email": "kuroeda.makoto@classmethod.jp"
Expand Down
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "tsumiki",
"version": "1.4.0",
"version": "1.4.1",
"description": "AI-driven development toolkit for TDD and SDD workflows, providing comprehensive command templates and agents to enhance developer productivity with Claude Code",
"author": {
"name": "makoto kuroeda",
Expand Down
113 changes: 113 additions & 0 deletions skills/ipa-security-guide/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
---
name: ipa-security-guide
description: ipa-security-check をはじめとするセキュリティ診断ツールが出力したレポートを読み込み、各検出項目を優先順位付きの dev-debug 依頼リストに変換する。対象プロジェクトの言語・FWを問わず汎用的に使える。コードベースを直接読んでアーキテクチャ判断を行う。
argument-hint: "[レポートファイルパス (省略時: ./ipa-security-report.md)] [-o 出力ファイルパス]"
---

# IPA Security Guide Skill

## このスキルが行うこと

`ipa-security-check` をはじめとするセキュリティ診断ツールが出力したレポートを読み込み、以下を出力する。

1. **対応不要候補リスト** — アーキテクチャや設計上の理由で対応不要と考えられる件と根拠。最終判断はユーザーが行う
2. **優先順位付き依頼リスト** — `tsumiki:dev-debug` にそのままコピペできるフォーマット
3. **まとめテーブル** — 全件を一覧で整理

外部ツールへの依存なし。コードベースを直接読んでアーキテクチャを判断する。

## 起動方法

```
/ipa-security-guide
/ipa-security-guide <レポートファイルパス>
/ipa-security-guide -o <出力ファイルパス>
/ipa-security-guide <レポートファイルパス> -o <出力ファイルパス>
```

- レポートファイルパスを省略した場合はカレントディレクトリの `ipa-security-report.md` を使う
- `-o` を指定した場合は結果をそのパスに Write する。省略した場合は画面出力のみ

## 前提条件

- 入力はセキュリティ診断ツール(`ipa-security-check` 等)が生成した Markdown レポートであること
- 対象プロジェクトの言語・フレームワークは問わない

## ファイル構成

```
ipa-security-guide/
├── SKILL.md ← 本ファイル(Claude が最初に読む)
├── knowledge/
│ ├── triage.md ← 対応不要の判断基準・除外対象の定義
│ └── priority.md ← 優先順位・グループ化の基準
└── lib/
└── output_formatter.md ← 依頼リスト・結果出力のフォーマット定義
```

## 実行手順

### ステップ1: 事前準備(一括読み込み)

以下をすべて Read する。件ごとに読み直さない。

1. 指定された(または `./ipa-security-report.md`)レポートファイル
- 存在しない場合はエラーを報告して終了
- レポートのヘッダーからプロジェクトのルートディレクトリを推定する
2. `knowledge/triage.md`
3. `knowledge/priority.md`
4. `lib/output_formatter.md`

### ステップ2: 検出ファイルを一括で Read する

レポートから全検出項目のファイルパスを一覧化し、**まとめて Read する**。
1件ずつ処理しながら読むのではなく、先にすべて読んでコンテキストに入れる。

- ファイルが見つからない場合はユーザーに正しいパスを確認してから進む
- 無闇に Grep で全ファイルを探さない
- 判断に必要な関連ファイルは「この件を分析した結果、判断できなかった場合のみ」追加で Read する

### ステップ3: 全件を一括で分析する

ステップ1〜2で読んだ内容をもとに、全検出項目を一括で分析する。件ごとにループして都度判断するのではなく、全体像を把握した上でまとめて行う。

**分析対象から除外する finding(`triage.md` の除外対象セクションも参照):**
- `<!-- ipa-triage:begin ... ipa-triage:end -->` ブロックで `status: 問題なし` または `status: 保留` が設定されているもの(ユーザーがトリアージ済み)
- `## 偽陽性候補` セクションに分類されているもの(false-positive-review が偽陽性の疑いありと判定)
- 分析対象は `status: 未対応` と `status: 対応する` の finding のみ

各件について以下を判断する:

#### 3a. ファイルの目的と検出箇所の文脈を把握する

- このファイルが何をしているか
- 検出箇所がどのような文脈にあるか
- 修正が可能か、どう修正すべきか

#### 3b. 対応不要候補の特定

`triage.md`(ステップ1で読済み)の基準で対応不要候補を特定する。

候補が見つかった場合は**必ずユーザーに提示して最終判断を求める**。スキル単独で確定しない。
ユーザーが対応不要と確定した項目については `ipa-skip` コメント追加の依頼を生成する。

#### 3c. グループ化と優先順位付け

`priority.md`(ステップ1で読済み)の基準でグループ化と優先順位を決める。

### ステップ4: 依頼リストを生成・出力する

`output_formatter.md`(ステップ1で読済み)のフォーマットに従って結果を出力する。

`-o` オプションが指定されている場合は、出力内容を指定パスに Write する。
省略されている場合は画面に出力するのみ。

## 重要な原則

- **コードを読む前に対応不要と断定しない** — 判断は必ずコードを確認してから下す
- **対応不要の最終判断はユーザーが行う** — スキルは候補と根拠を提示するだけ。確定はユーザーの承認後
- **不明点はユーザーに確認する** — コードから辿れない場合は推測せず一時停止して聞く。ファイルパスやアーキテクチャの詳細など、ユーザーが把握していることは多い
- **推測で判断しない** — 確認できなかった情報は「確認できず」と明記し、依頼文内に調査を含める
- **アーキテクチャ依存の判断は根拠付きで明示する** — 「なぜ対応しなくてよいか」を省略しない
- **依頼文は tsumiki が迷わず実行できる粒度にする** — 情報が足りない依頼は作らない
- **不要な Read を避ける** — 検出ファイルから判断できる場合は追加の Grep・Read をしない
26 changes: 26 additions & 0 deletions skills/ipa-security-guide/knowledge/priority.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# 優先順位・グループ化の基準

## グループ化

### 1依頼にまとめてよい条件(どちらかを満たす)

- 同一ファイルへの変更で修正パターンが同種(XSS の入力エスケープ追加など)
- 修正が3行以内で副作用なし、かつ同一ファイル内に複数箇所ある

### 分けるべき条件

- ファイルが異なる
- 修正内容が設計判断を含む(認証方式の変更、セッション管理の再設計など)
- 一方の修正結果が他方に影響する可能性がある

## 優先順位

上位ほど先に対応する。

| 優先度 | 条件 |
|---|---|
| 最優先 | Critical 重大度(SQL インジェクション、OS コマンドインジェクション等、直接攻撃可能なもの) |
| 高 | High 重大度、かつ修正が単純(副作用が少ない) |
| 中 | Medium 重大度、または High でも設計判断・構造変更を伴う |
| 低 | Low / Info 重大度 |
| 最後 | `ipa-skip` コメント追加(対応不要と判断した件の再検出防止) |
33 changes: 33 additions & 0 deletions skills/ipa-security-guide/knowledge/triage.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# 対応不要の判断基準

## 分析対象から除外する finding

以下のいずれかに該当する finding は、依頼リストの対象から除外する。

| 除外条件 | 理由 |
|---|---|
| `<!-- ipa-triage:begin ... ipa-triage:end -->` ブロックで `status: 問題なし` または `status: 保留` が設定されている | ユーザーがトリアージ済みと判断した finding |
| `## 偽陽性候補` セクションに分類されている | `false-positive-review` エージェントが偽陽性の疑いありと判定した finding |

## 対応不要候補と判定できる条件

以下のいずれかに該当する場合は「対応不要候補」として特定し、根拠とともにユーザーに提示する。
**最終判断はユーザーが行う。スキル単独で対応不要を確定しない。**

| 判定条件 | 候補とする根拠 |
|---|---|
| Info レベルかつレポート本文に「修正済み」「既に対応」の記載がある | 指摘がすでに解消されている |
| コードを読んで、アーキテクチャ上その脆弱性が成立しないと確認できた | 設計上リスクが存在しない(根拠をコードから示すこと) |

## 要判断として扱う条件

以下は対応不要候補とせず、「要判断」として別枠で提示する。

- コスト発生を伴うインフラ変更(WAF 等)— 費用が発生する旨を明記する
- 設計判断を含む変更(どのポリシー・ロールが適切かなど)

## 注意

- コードを読む前に対応不要候補と断定しない
- 「アーキテクチャ上成立しない」と判断する場合は、必ずコードを読んで根拠を示す
- ユーザーが対応不要と確定した項目は、`ipa-skip` コメント追加の依頼を生成する
55 changes: 55 additions & 0 deletions skills/ipa-security-guide/lib/output_formatter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# 出力フォーマット定義

## 依頼ブロック

各依頼を以下のフォーマットで出力する。

````
#### 依頼 N — [件名]

```
/tsumiki:dev-debug

[問題の説明: 何が問題で、なぜ問題なのか1〜2文]

[対象ファイルと行番号]

[修正の指示: 何をどう変えるか。既存の変数・関数・命名規則を使うこと。
修正に必要な情報(ARN・変数名等)がコードを読めば特定できる場合は「コードを読んで特定すること」と明記する]

参考: ipa-security-report.md [rule-id]
```
````

### 依頼文を書く際の注意

- 「修正してください」などの冗長な文を入れない
- コードを読めば分かる情報(変数名・ARN等)は自分で特定させる指示にする
- 設計判断が必要な箇所は「コードを読んで判断すること」と明記する
- まとめた依頼は「以下X箇所をまとめて修正する」と冒頭に書く

## 結果出力の構成

```
## 事前判断

### 対応不要
[件名 + 根拠]

### 要判断(コスト・設計が絡むもの)
[件名 + 判断ポイント]

---

## 依頼リスト(コピペ用)

[各依頼のブロック]

---

## まとめ

| # | 依頼 | 重大度 | ファイル | 難易度 |
|---|---|---|---|---|
...
```
Loading