| name | my-refactor |
| description | Scan a codebase for refactoring opportunities, write a SARIF-compatible report, and register each finding as a GitHub issue labelled by severity, effort, and Fowler category. After issue creation, report the created issues and suggested feature names without choosing an implementation workflow. Use when the user asks to "ãªãã¡ã¯ã¿ãªã³ã°åè£æŽãåºã", "æè¡çè² åµãªã¹ãå", "refactor scan", "refactoring issues", or requests surveying a repo for refactor work. Do NOT use for applying refactors, code review of a specific PR (use `my-pr review`), or for fixing a specific bug. |
| argument-hint | [scan] [path] [--dry-run] [--max=N] |
Refactor â æ€åºãš issue ç»é²
ã³ãŒãããŒã¹ãã¹ãã£ã³ããŠãªãã¡ã¯ã¿ãªã³ã°åè£ãæ€åºãã1åè£=1 GitHub issue ãšããŠç»é²ãããç»é²æžã¿ issue ã®å®è£
ã¯ãŒã¯ãããŒã¯ããã®ã¹ãã«ã§ã¯éžã°ãªãã
ãµãã³ãã³ã
å
é ããŒã¯ã³ã§åå²ãããçŸæç¹ã§ã¯ scan ã®ã¿ã
| å
é ããŒã¯ã³ | åäœ |
|---|
çç¥ or scan | scan ãããŒïŒPhase S-1 ã S-5ïŒ |
| ãã®ä»ã®æåå | scan ã®åŒæ°ïŒãã¹ïŒãšããŠæ±ããscan ãå®è¡ |
issue ãæ¶åãã apply çžåœã¯ãã®ã¹ãã«ã®å¯Ÿè±¡å€ãæ€åºã起祚ãŸã§ã§æ¢ããèšç»ãå®è£
ã®é²ãæ¹ã¯å¥ééžã¶ã
SCAN: æ€åºãš issue ç»é²
scan ã®åŒæ°
å
é ã scan ã®ãšã㯠1 ããŒã¯ã³æ¶è²»ããæ®ãã以äžã§è§£éãããå
é ã scan ã§ãªãå Žå㯠$ARGUMENTS å
šäœã以äžã§è§£éãã:
| åŒæ° | åäœ |
|---|
| ïŒçç¥ïŒ | ãªããžããªå
šäœãã¹ãã£ã³ãæ€åºãããå³ issue äœæ |
ãã¹ïŒäŸ src/api/ïŒ | æå®ãã¹é
äžã®ã¿ã¹ãã£ã³ |
--dry-run | issue ãäœæããã¬ããŒãã®ã¿åºåïŒãã¬ãã¥ãŒïŒ |
--max=N | 1åã®ã¹ãã£ã³ã§äœæãã issue æ°ã®äžéïŒæ¢å® 10ïŒ |
ããã©ã«ã㯠å³äœæããã¬ãã¥ãŒããããšã㯠--dry-run ãæç€ºããã
Phase S-1: åææ¡ä»¶ã®ç¢ºèª
S-1-1: ãªããžããªãš gh èªèšŒã確èª
git rev-parse --show-toplevel >/dev/null || { echo "Not a git repo"; exit 1; }
gh auth status >/dev/null 2>&1 || { echo "gh not authenticated"; exit 1; }
REPO_ROOT=$(git rev-parse --show-toplevel)
DEFAULT_BRANCH=$(gh repo view --json defaultBranchRef -q .defaultBranchRef.name)
SCAN_OUT_DIR="$REPO_ROOT/.tmp/refactor"
mkdir -p "$SCAN_OUT_DIR"
S-1-2: ã¹ã³ãŒããæ±ºãã
- åŒæ°ã«ãã¹ãæž¡ãããŠãã â ãã®ãã¹é
äžã察象ã«ããïŒååšããªãå Žåã¯ãšã©ãŒïŒ
- åŒæ°ã«ãã¹ããªã â
$REPO_ROOT å
šäœã察象ã«ãã
巚倧ãªãã®å Žå㯠git ls-files | wc -l ã§ãã¡ã€ã«æ°ãææ¡ãã10,000 ãè¶
ãããšãã¯ãŠãŒã¶ãŒã«ã察象ãçµãããšãæšå¥šããšèŠåããã
S-1-3: ã©ãã«ã®æºå
ä»¥äž 3 系統ã®ã©ãã«ã䜿ããæªäœæãªã gh label create ã§äœæããïŒæ¢åãªãã¹ãããïŒã
| ã©ãã« | å€ã®äŸ |
|---|
| åºå® | refactor |
| severity | severity/critical, severity/high, severity/medium, severity/low |
| category | category/extract-function, category/remove-duplication, category/rename, category/move, category/simplify-conditional, category/dead-code, category/encapsulate, category/replace-primitive, category/other |
category 㯠references/catalog.md ã®äžèЧããéžã¶ã該åœãªãã®ãšãã ã category/otherã
S-1-4: æ¢å issue ãååŸïŒéè€åé¿ïŒ
gh issue list --label refactor --state all --limit 500 \
--json number,title,body,labels,state \
> "$SCAN_OUT_DIR/existing-issues.json"
state all ã«ããã®ã¯ãclosed æžã¿ issue ã® fingerprint ãšç
§åããŠãäžåºŠ close ããææãåææ¡ããªããããã§ãããã
ååŸä»¶æ°ãã¡ããã© 500 ä»¶ã®å Žå㯠--limit ã«ããæã¡åãã®å¯èœæ§ãããããã®å Žåã¯ãæ¢å issue ã®ååŸãäžé 500 ä»¶ã§æã¡åãããéè€å€å®ãäžå®å
šãªå¯èœæ§ãããããšãŠãŒã¶ãŒã«èŠåããã
Phase S-2: ã¹ãã£ã³
èªã¿åãå°çšã§ context ãæ±ããªããããAgent ããŒã«ã§ subagent_type=Explore ãèµ·åããããšãæšå¥šãããããã³ããã«ã¯ä»¥äžãå«ãã: 察象ãã£ã¬ã¯ããªãreferences/catalog.md ãèªãããæç€ºãfindings ãã©ãŒãããïŒreferences/sarif.md ã® results[] ã«å¯Ÿå¿ããé
ç®ïŒã
Explore subagent 㯠Write ã§ããªããsubagent ã¯æèŠãæ§é åããã¹ãïŒruleIdãlocationãææå¯Ÿè±¡è¡ãmessageãseverityãeffortãapproachãrisksïŒã§è¿ãã ãã«ãããè¿ã£ãŠããæèŠã SARIF ã«æŽåœ¢ã findings.sarif.json ã«æžã蟌ãã®ã¯ main agent ã®è²¬åã
æ€åºã®å€æåºæº
references/catalog.md ãèªã¿ã以äžã«è©²åœãããã®ãåæãã:
- éè€ïŒåäžããžãã¯ã®è€æ°å®è£
ïŒ
- é·ã颿°ïŒè¡æ°ããã¹ããæ·±ãïŒ
- 巚倧ã¯ã©ã¹ã»å·šå€§ãã¡ã€ã«ïŒè²¬åãæ··åšïŒ
- åœåã®äžæŽåïŒå€ãååã誀解ãæãååïŒ
- äžèŠã³ãŒãïŒæªäœ¿çšã®é¢æ°ã»importã»å€æ°ãå°éäžèœåå²ïŒ
- è€éãªæ¡ä»¶åŒïŒæ·±ããã¹ããåŠå®ã®åŠå®ãããžãã¯ãã³ããŒïŒ
- é
眮ããïŒäœ¿ãããå Žæããé ãã¢ãžã¥ãŒã«ã«ããïŒ
- ããªããã£ãã®ä¹±çšïŒæå³ãæããªã string/int ã API ã«é²åºïŒ
- é ããã«ãããªã³ã°ïŒå¯äœçšãã°ããŒãã«ç¶æ
ïŒ
é€å€: ææ©çãªãã¡ã¯ã¿ïŒãå°æ¥å¿
èŠãããç³»ïŒãã¹ã¿ã€ã«ã»ãã©ãŒãããã ãã®ææãLLM çæã³ãŒãã®éè€ãç¡èªèŠã«ææ¡ããé¡ã®ãã®ã
SARIF äºæã®åºå
scan çµæã¯ SARIF 2.1.0 äºæã®ãµãã»ãããšã㊠"$SCAN_OUT_DIR/findings.sarif.json" ã«ä¿åãããJSON æ§é ãlevel / properties ã®ãããã³ã°ãfingerprint ã®æ±ºå®çèšç®èŠåãseverity / effort_minutes ã®åºæºã¯ references/sarif.md ãèªãã§åŸããfindings.sarif.json 㯠scan ããšã«äžæžãããïŒrun history 㯠Git ã§è¿œãïŒã
Phase S-3: éè€æé€ãšçµã蟌ã¿
findings.sarif.json ã®å results[] ã«ã€ããŠãpartialFingerprints["refactorFingerprint/v1"] ãåãåºã
existing-issues.json ã®å issue æ¬æãã RefactorFingerprint: è¡ïŒPhase S-5 ã§åã蟌ãïŒãæœåº
- fingerprint ãäžèŽããæ¢å issueïŒopen/closed åããïŒãããã°ãæ°èŠã¹ãã£ã³ããé€å€
- fingerprint ãèŠã€ãããªãæ¢å issue ã«ã€ããŠã¯ location + ruleId ã®äžèŽã§ãã©ãŒã«ããã¯å€å®
level åªå
ïŒerror â warning â noteïŒãåäž level å
㯠properties.severityïŒcritical â high â medium â lowïŒã第 2 ãœãŒãããŒã«ããŠãœãŒã â --max=N ã§äžäœã®ã¿æ®ãïŒæ¢å® 10 ä»¶ïŒãcritical ãš high ã¯ã©ã¡ãã level=error ã«æœ°ããããããã®ç¬¬ 2 ããŒãå¿
é
level=error ã〠properties.severity=critical 㯠--max ãè¶
ããŠãæ®ã
Phase S-4: ã¬ããŒãåºå
issue ãäœãåã«ãå¿
ãæšæºåºåã«äººéå¯èªãªãµããªãåºãã--dry-run ã®ãšãã¯ããã§çµäºã
# Refactor Scan Report
**Scope:** <path or entire repo>
**SARIF output:** `.tmp/refactor/findings.sarif.json` (N results)
**Detected:** N ä»¶ (critical: X, high: Y, medium: Z, low: W)
**Skipped as duplicates:** M ä»¶ïŒfingerprint äžèŽ a / location äžèŽ bïŒ
## äœæäºå®ã® issue
### ðŽ critical
1. [remove-duplication] ã¿ã€ãã« â locations, effort
### ð high
...
--dry-run ããªãå Žå㯠Phase S-5 ã«é²ãïŒãŠãŒã¶ãŒå¯Ÿè©±ã¯æãŸãªãïŒã
Phase S-5: issue äœæ
å SARIF result ã«ã€ã㊠gh issue create ã 1 åãã€å®è¡ããã
issue æ¬æãã³ãã¬ãŒã
## æŠèŠ
<message.text>
## 察象
- `src/api/user.ts:42-58`
- `src/api/admin.ts:61-77`
## ææ¡ããã¢ãããŒã
<properties.suggested_approach>
## æ³å®ãªã¹ã¯
- <properties.risks>
## ã¡ã¿
- Category: remove-duplication
- Severity: high
- Effort estimate: ~30 min
<!-- machine-readable footer â DO NOT EDIT -->
RefactorFingerprint: <sha1>
RefactorRuleId: remove-duplication
RefactorSource: my-refactor/scan@YYYY-MM-DD
---
*Generated by `/my-refactor scan`. SARIF: `.tmp/refactor/findings.sarif.json` result index N.*
RefactorFingerprint: ãå¿
ãå
¥ãããæ¬¡å scan ããã®è¡ãèªã¿ãéè€èµ·ç¥šãé¿ããã
äœæã³ãã³ã
gh issue create \
--title "<properties.suggested_title>" \
--body-file "$SCAN_OUT_DIR/issue-body-<idx>.md" \
--label "refactor" \
--label "severity/<properties.severity>" \
--label "category/<ruleId>"
--assignee ã¯ä»ããªãïŒèª°ãåããæªå®ããŠãŒã¶ãŒåžæãããã° @meïŒ
- rate limit åé¿ã®ãããäœæããšã«
sleep 1 ãæã
- äœæå€±æã§ä»¥éãäžæããäœææžã¿çªå·ããŠãŒã¶ãŒã«å ±åãã
äœæåŸã®ãµããª
issue ãäœã£ããå¿
ãæ¬¡ã®åœ¢åŒã§åºåãããå®è£
ã¯ãã®ã¹ãã«ã§ã¯æ±ããªãã
# Created N refactor issues
- #123 ðŽ [remove-duplication] ã¿ã€ãã« â `refactor/issue-123-extract-auth-header`
- #124 ð [extract-function] ã¿ã€ãã« â `refactor/issue-124-...`
SARIF: `.tmp/refactor/findings.sarif.json`
## 次ã®ã¹ããã
å issue ã®å®è£
ã¯ããã® scan ãšã¯å¥ã®äœæ¥ãšããŠæ±ã£ãŠãã ããã
Issue æ¬æã®ãææ¡ããã¢ãããŒãããæ³å®ãªã¹ã¯ããRefactorFingerprintããå®è£
æã®åç
§ææã«ãããšå¹ççã§ãã
å issue ã«ã€ããŠãã±ããã±ãŒã¹ã® feature-name ã 1 ã€ææ¡ããããšïŒrefactor-issue-<num>-<short-slug> 圢åŒïŒããŠãŒã¶ãŒããã®ãŸãŸã³ããã§ããã
泚æäºé
SARIF åºå
- scan ã®åºåã¯
SCAN_OUT_DIR/findings.sarif.jsonãSARIF 2.1.0 ãµãã»ãããšããŠä»ããŒã«ã«æž¡ããã仿§ã¯ references/sarif.md
- fingerprint ã¯è¡çªå·ãå«ããªããæ£èŠåã¯ç©ºçœã®ã¿ïŒåè¡ã® trim + é£ç¶ç©ºçœã®å§çž®ïŒã倿°åæœè±¡åã¯å®è¡éã§é決å®çã«ãªãããè¡ããªã
issue ãš fingerprint
- scan ãäœã issue ã«ã¯
RefactorFingerprint: / RefactorRuleId: è¡ãåã蟌ãŸããããã® 2 è¡ã¯æç·šéããªã
- 次å scan ã¯ãã®è¡ãèªã¿ãåãæèŠã®éè€èµ·ç¥šãé¿ãã
- æåã§ issue ãæžããå Žå㯠fingerprint å€å®å¯Ÿè±¡å€ïŒlocation + ruleId ãã©ãŒã«ããã¯ã®ã¿ïŒ
ãã®ä»
- ãã¹ãŠã® issue ã¿ã€ãã«ã»æ¬æã¯æ¥æ¬èªãã©ãã«ã»ãã¡ã€ã«åã¯è±èª
references/catalog.md ã å¿
ãèªãã§ category åé¡ã®æ ¹æ ã«ãããcategory/other ã®æ¿«çšãé¿ãã
- 480 åãè¶
ãã effort ã® issue ãæç€ºããåã«ããŠãŒã¶ãŒãžåå²ãææ¡ãã
- ãã®ã¹ãã«ã¯ issue 起祚ãŸã§ã§æ¢ãŸããå®è£
ãããŒã¯å¥ééžã¶ïŒéè€ãããªãïŒ