.claude/skills/sonarqube-issues/SKILL.md
SonarQube CloudからIssue・Security Hotspot・コード重複(Duplications)・カバレッジを取得して一覧表示する。コード品質・セキュリティの確認やIssue対応時に使う。
npx skillsauth add konabe/classical-music-lake sonarqube-issuesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
SonarQube Cloud の API を使って、プロジェクトの Issue・Security Hotspot・コード重複を取得・分析する。
konabe_classical-music-lakehttps://sonarcloud.io/api/issues/searchhttps://sonarcloud.io/api/hotspots/searchhttps://sonarcloud.io/api/measures/componentまず、ファセット付きでサマリー情報を取得する:
https://sonarcloud.io/api/issues/search?projects=konabe_classical-music-lake&ps=1&facets=severities,types,statuses
WebFetch で上記 URL を呼び出し、以下の情報を抽出する:
paging.total)facets の severities): BLOCKER, CRITICAL, MAJOR, MINOR, INFOfacets の types): BUG, VULNERABILITY, CODE_SMELLfacets の statuses): OPEN, CONFIRMED, REOPENED, RESOLVED, CLOSEDIssue サマリーと同時に以下の URL を WebFetch で呼び出す:
https://sonarcloud.io/api/hotspots/search?projectKey=konabe_classical-music-lake&ps=1
以下の情報を抽出する:
paging.total)続いて、ステータス別件数を取得するため以下も呼び出す:
https://sonarcloud.io/api/hotspots/search?projectKey=konabe_classical-music-lake&ps=1&status=TO_REVIEW
https://sonarcloud.io/api/hotspots/search?projectKey=konabe_classical-music-lake&ps=1&status=REVIEWED
各レスポンスの paging.total を TO_REVIEW / REVIEWED の件数として記録する。
Issue サマリーと同時に以下の URL を WebFetch で呼び出す:
https://sonarcloud.io/api/measures/component?component=konabe_classical-music-lake&metricKeys=duplicated_lines_density,duplicated_lines,duplicated_blocks,duplicated_files
レスポンスの component.measures 配列から以下を抽出する:
| metricKey | 意味 |
|-----------|------|
| duplicated_lines_density | 重複行の割合(%) |
| duplicated_lines | 重複している行数 |
| duplicated_blocks | 重複ブロック数 |
| duplicated_files | 重複を含むファイル数 |
Issue サマリーと同時に以下の URL を WebFetch で呼び出す:
https://sonarcloud.io/api/measures/component?component=konabe_classical-music-lake&metricKeys=coverage,line_coverage,branch_coverage,lines_to_cover,uncovered_lines,conditions_to_cover,uncovered_conditions
レスポンスの component.measures 配列から以下を抽出する:
| metricKey | 意味 |
|-----------|------|
| coverage | 総合カバレッジ(%) |
| line_coverage | ライン カバレッジ(%) |
| branch_coverage | ブランチ カバレッジ(%) |
| lines_to_cover | カバレッジ対象の総行数 |
| uncovered_lines | カバーされていない行数 |
| conditions_to_cover | カバレッジ対象の総条件数 |
| uncovered_conditions | カバーされていない条件数 |
値が存在しない場合は "N/A" と表示する。
以下のフォーマットで表示する:
## SonarQube Issue サマリー
**総数**: N 件
### 深刻度別
| 深刻度 | 件数 |
|--------|------|
| BLOCKER | N |
| CRITICAL | N |
| MAJOR | N |
| MINOR | N |
| INFO | N |
### 種別
| 種別 | 件数 |
|------|------|
| BUG | N |
| VULNERABILITY | N |
| CODE_SMELL | N |
### ステータス別
| ステータス | 件数 |
|------------|------|
| OPEN | N |
| CONFIRMED | N |
| ... | ... |
## Security Hotspot サマリー
**総数**: N 件
| ステータス | 件数 |
|------------|------|
| TO_REVIEW(要確認) | N |
| REVIEWED(確認済み) | N |
## Duplications サマリー
| 指標 | 値 |
|------|----|
| 重複行の割合 | N.N% |
| 重複行数 | N 行 |
| 重複ブロック数 | N |
| 重複を含むファイル数 | N |
## Coverage サマリー
| 指標 | 値 |
|------|----|
| 総合カバレッジ | N.N% |
| ライン カバレッジ | N.N% |
| ブランチ カバレッジ | N.N% |
| カバレッジ対象行数 | N 行 |
| 未カバー行数 | N 行 |
| カバレッジ対象条件数 | N |
| 未カバー条件数 | N |
サマリー表示後、フィルタに応じた Issue 一覧を取得する。
ベース URL に以下のパラメータを付与する:
projects=konabe_classical-music-lake(固定)ps=100(1ページあたりの取得件数)p=1(ページ番号)statuses=OPEN,CONFIRMED,REOPENED(デフォルト: オープンな Issue のみ)引数 $ARGUMENTS に hotspots 系以外のフィルタが指定されている場合、以下のフィルタを追加する:
| 引数形式 | API パラメータ | 値の例 |
|----------|---------------|--------|
| severities:値 | severities | BLOCKER, CRITICAL,MAJOR |
| types:値 | types | BUG, CODE_SMELL, VULNERABILITY |
| statuses:値 | statuses | OPEN, CONFIRMED,REOPENED |
例:
?projects=konabe_classical-music-lake&ps=100&statuses=OPEN,CONFIRMED,REOPENEDseverities:CRITICAL,MAJOR → ?projects=konabe_classical-music-lake&ps=100&statuses=OPEN,CONFIRMED,REOPENED&severities=CRITICAL,MAJORtypes:BUG severities:BLOCKER → ?projects=konabe_classical-music-lake&ps=100&statuses=OPEN,CONFIRMED,REOPENED&types=BUG&severities=BLOCKERstatuses:OPEN → ?projects=konabe_classical-music-lake&ps=100&statuses=OPEN組み立てた URL を WebFetch で呼び出し、レスポンスの JSON から以下を抽出するよう prompt に指示する:
message(Issue の説明)component(ファイルパス。プロジェクトキーのプレフィックスを除去する)line(行番号)severity(深刻度)type(種別)rule(ルール名)effort(修正工数の目安)paging.total, paging.pageIndex, paging.pageSize)Issue 一覧と並行して以下の URL を WebFetch で呼び出す。
https://sonarcloud.io/api/hotspots/search?projectKey=konabe_classical-music-lake&ps=100&p=1$ARGUMENTS に hotspots:TO_REVIEW が含まれる場合: &status=TO_REVIEW を追加$ARGUMENTS に hotspots:REVIEWED が含まれる場合: &status=REVIEWED を追加WebFetch の prompt には以下を指定する:
message(説明)component(ファイルパス。プロジェクトキーのプレフィックスを除去する)line(行番号)vulnerabilityProbability(リスクレベル: HIGH / MEDIUM / LOW)status(TO_REVIEW / REVIEWED)securityCategory(セキュリティカテゴリ)ruleKey(ルール名)paging.total, paging.pageIndex, paging.pageSize)Issue 一覧と Security Hotspot 一覧を別セクションで表示する:
## Issue 一覧(N 件中 1-100 件)
| # | 深刻度 | 種別 | ファイル | 行 | メッセージ | ルール | 工数 |
|---|--------|------|----------|-----|-----------|--------|------|
| 1 | MAJOR | CODE_SMELL | composables/useAuth.ts | 42 | ... | typescript:S1234 | 5min |
| 2 | MINOR | CODE_SMELL | pages/index.vue | 10 | ... | typescript:S5678 | 2min |
## Security Hotspot 一覧(N 件中 1-100 件)
| # | リスク | ステータス | ファイル | 行 | メッセージ | カテゴリ | ルール |
|---|--------|------------|----------|-----|-----------|----------|--------|
| 1 | HIGH | TO_REVIEW | backend/src/auth/login.ts | 12 | ... | sql-injection | typescript:S3649 |
| 2 | MEDIUM | REVIEWED | app/utils/video.ts | 5 | ... | xss | typescript:S5247 |
Issue または Hotspot が 0 件の場合は「該当する Issue/Hotspot はありません」と報告する。
100件を超える場合は「残り N 件あります。/sonarqube-issues で追加フィルタを指定して絞り込んでください」と案内する。
projectKey パラメータを使う(projects ではない)tools
ワークの検収・SPEC.md/ARCHITECTURE.md更新を行う開発フローのStep 4(最終)。実装のPRがマージされた後にドキュメントを更新するときに使う。
tools
ワークのコーディング・テスト・リファクタリング・PR発行を行う開発フローのStep 3。設計完了後に実装フェーズを開始するときに使う。
content-media
ワークの設計・design.md作成・レビュー反映を行う開発フローのStep 2。要件定義完了後に設計フェーズを開始するときに使う。
tools
新機能の要件定義・ワーク分割・requirement.md作成を行う開発フローのStep 1。新機能・新しい開発を始めるときに使う。