diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index b1e20ee..c466ca8 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -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" diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index aa88f31..87febfd 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -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", diff --git a/skills/ipa-security-guide/SKILL.md b/skills/ipa-security-guide/SKILL.md new file mode 100644 index 0000000..46654ae --- /dev/null +++ b/skills/ipa-security-guide/SKILL.md @@ -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` の除外対象セクションも参照):** +- `` ブロックで `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 をしない diff --git a/skills/ipa-security-guide/knowledge/priority.md b/skills/ipa-security-guide/knowledge/priority.md new file mode 100644 index 0000000..c57a610 --- /dev/null +++ b/skills/ipa-security-guide/knowledge/priority.md @@ -0,0 +1,26 @@ +# 優先順位・グループ化の基準 + +## グループ化 + +### 1依頼にまとめてよい条件(どちらかを満たす) + +- 同一ファイルへの変更で修正パターンが同種(XSS の入力エスケープ追加など) +- 修正が3行以内で副作用なし、かつ同一ファイル内に複数箇所ある + +### 分けるべき条件 + +- ファイルが異なる +- 修正内容が設計判断を含む(認証方式の変更、セッション管理の再設計など) +- 一方の修正結果が他方に影響する可能性がある + +## 優先順位 + +上位ほど先に対応する。 + +| 優先度 | 条件 | +|---|---| +| 最優先 | Critical 重大度(SQL インジェクション、OS コマンドインジェクション等、直接攻撃可能なもの) | +| 高 | High 重大度、かつ修正が単純(副作用が少ない) | +| 中 | Medium 重大度、または High でも設計判断・構造変更を伴う | +| 低 | Low / Info 重大度 | +| 最後 | `ipa-skip` コメント追加(対応不要と判断した件の再検出防止) | diff --git a/skills/ipa-security-guide/knowledge/triage.md b/skills/ipa-security-guide/knowledge/triage.md new file mode 100644 index 0000000..e71d210 --- /dev/null +++ b/skills/ipa-security-guide/knowledge/triage.md @@ -0,0 +1,33 @@ +# 対応不要の判断基準 + +## 分析対象から除外する finding + +以下のいずれかに該当する finding は、依頼リストの対象から除外する。 + +| 除外条件 | 理由 | +|---|---| +| `` ブロックで `status: 問題なし` または `status: 保留` が設定されている | ユーザーがトリアージ済みと判断した finding | +| `## 偽陽性候補` セクションに分類されている | `false-positive-review` エージェントが偽陽性の疑いありと判定した finding | + +## 対応不要候補と判定できる条件 + +以下のいずれかに該当する場合は「対応不要候補」として特定し、根拠とともにユーザーに提示する。 +**最終判断はユーザーが行う。スキル単独で対応不要を確定しない。** + +| 判定条件 | 候補とする根拠 | +|---|---| +| Info レベルかつレポート本文に「修正済み」「既に対応」の記載がある | 指摘がすでに解消されている | +| コードを読んで、アーキテクチャ上その脆弱性が成立しないと確認できた | 設計上リスクが存在しない(根拠をコードから示すこと) | + +## 要判断として扱う条件 + +以下は対応不要候補とせず、「要判断」として別枠で提示する。 + +- コスト発生を伴うインフラ変更(WAF 等)— 費用が発生する旨を明記する +- 設計判断を含む変更(どのポリシー・ロールが適切かなど) + +## 注意 + +- コードを読む前に対応不要候補と断定しない +- 「アーキテクチャ上成立しない」と判断する場合は、必ずコードを読んで根拠を示す +- ユーザーが対応不要と確定した項目は、`ipa-skip` コメント追加の依頼を生成する diff --git a/skills/ipa-security-guide/lib/output_formatter.md b/skills/ipa-security-guide/lib/output_formatter.md new file mode 100644 index 0000000..d8d0664 --- /dev/null +++ b/skills/ipa-security-guide/lib/output_formatter.md @@ -0,0 +1,55 @@ +# 出力フォーマット定義 + +## 依頼ブロック + +各依頼を以下のフォーマットで出力する。 + +```` +#### 依頼 N — [件名] + +``` +/tsumiki:dev-debug + +[問題の説明: 何が問題で、なぜ問題なのか1〜2文] + +[対象ファイルと行番号] + +[修正の指示: 何をどう変えるか。既存の変数・関数・命名規則を使うこと。 + 修正に必要な情報(ARN・変数名等)がコードを読めば特定できる場合は「コードを読んで特定すること」と明記する] + +参考: ipa-security-report.md [rule-id] +``` +```` + +### 依頼文を書く際の注意 + +- 「修正してください」などの冗長な文を入れない +- コードを読めば分かる情報(変数名・ARN等)は自分で特定させる指示にする +- 設計判断が必要な箇所は「コードを読んで判断すること」と明記する +- まとめた依頼は「以下X箇所をまとめて修正する」と冒頭に書く + +## 結果出力の構成 + +``` +## 事前判断 + +### 対応不要 +[件名 + 根拠] + +### 要判断(コスト・設計が絡むもの) +[件名 + 判断ポイント] + +--- + +## 依頼リスト(コピペ用) + +[各依頼のブロック] + +--- + +## まとめ + +| # | 依頼 | 重大度 | ファイル | 難易度 | +|---|---|---|---|---| +... +```