コード品質改善サイクル — スイープ → レビュー → Issue化 → 自律実装
/dev-cycle |
ループ起動: bash ~/.claude/scripts/auto-dev/start.sh --auto <repo>
| 項目 | 内容 |
|---|---|
| 実行方法 | CronCreate(20分間隔)または手動 |
| テンプレート | 00_SYSTEM/共通ルール/コード品質スイープ.md |
| 出力先 | 01_DECISIONS/<project>/YYYY-MM-DD_リファクタリング調査_<area>.md |
| いつ使う | 50件超の大規模改善前、または定期健全性確認 |
# Step 0: スコアリング python score-files.py <project_path> --top 20 --json # Step 1: 行数実測 wc -l <file1> <file2> ... # Step 2: Read ツールで実際に読む → GLM / Sonnet で評価
| 項目 | 内容 |
|---|---|
| テンプレート | 00_SYSTEM/プロンプト集/コードレビュー/code-review-v3.md |
| 出力先 | 40_CAREER/キャリア分析/02_コード品質/YYYY-MM-DD_<内容>/_REPORT.md |
| LLM | 🟡 GLM(通常)/ 🔵 Sonnet(許可時) |
| ラベル | 優先度 | 目安工数 |
|---|---|---|
[A] | priority:low | 1h以下 |
[B][C] | priority:medium | 2〜3h |
[D] | priority:high | 4h以上 |
import yaml, json, urllib.request
hosts = yaml.safe_load(open('/home/yn4416/.config/gh/hosts.yml'))
token = hosts['github.com']['oauth_token']
REPO = "fukukei23/<リポ名>"
issues = [
{"title": "test: [A] xxx", "body": "...", "labels": ["type:test","priority:low"]},
]
for issue in issues:
req = urllib.request.Request(
f'https://api.github.com/repos/{REPO}/issues',
data=json.dumps(issue).encode(),
headers={'Authorization': f'token {token}', 'Content-Type': 'application/json'}
)
res = json.load(urllib.request.urlopen(req))
print(f"Created #{res['number']}: {res['title']}")
# Issue番号を指定 bash ~/.claude/scripts/auto-dev/start.sh 76 77 78 # GitHub から自動取得(priority:high → medium → low 順) bash ~/.claude/scripts/auto-dev/start.sh --auto atelier-kyo-manager
# Claude Code 内で実行 CronCreate: schedule="7 * * * *", durable=true, prompt=<ループプロンプト>
| 方式 | 使い分け |
|---|---|
| Stop Hook(start.sh) | 今すぐ連続実行したい |
| CronCreate | 夜間・放置・数日かけて処理 |
cat ~/.claude/scripts/auto-dev/state.json tail -f ~/.claude/scripts/auto-dev/loop.log
python3 -c "
import json; p='/home/yn4416/.claude/scripts/auto-dev/state.json'
s=json.load(open(p)); s['active']=False; json.dump(s,open(p,'w'),indent=2)
print('停止:', s)
"
| ファイル | 役割 |
|---|---|
~/.claude/scripts/auto-dev/state.json | キュー状態(active/pending/current/completed) |
~/.claude/scripts/auto-dev/start.sh | 手動起動(--auto 対応) |
~/.claude/scripts/auto-dev/next-issue.py | Stop Hook 本体・完了通知 |
~/.claude/scripts/auto-dev/run-issue.sh | Issue 実行 wrapper |
~/.claude/scripts/auto-dev/loop.log | 実行ログ |
~/.claude/skills/dev-cycle/SKILL.md | /dev-cycle スキル定義 |
| フェーズ | LLM | 理由 |
|---|---|---|
| 品質スイープ | 🟡 GLM | パターン検出・列挙 |
| コードレビュー v3 | 🟡 GLM / 🔵 Sonnet | 深い読解・主観評価 |
| Issue 化 | 🟡 GLM | テンプレート変換 |
| コード生成(実装) | 🟠 MiniMax | 大量コード処理・無制限 |
| テスト・CI 確認 | Claude 直接 | ツール呼び出し |
| 症状 | 原因 | 対処 |
|---|---|---|
| Stop 後に次が起動しない | active:false | start.sh を再実行 |
| 通知が来ない | PowerShell 非起動 | powershell.exe -c 'echo ok' で確認 |
| CI 失敗で詰まる | テストエラー | loop.log 確認 → 手動対応 → 再 start.sh |
| Issue が自動取得されない | ラベルなし | priority:high/medium/low ラベルを付与 |
| 完走後もcronが発動し続ける | 自動停止未設定 | 下記「自動停止ルール」参照 |
問題: Issue完走後もcronが毎時発動し、トークンが無駄に消費され続ける。
対策: プロンプト末尾に以下の指示を必ず含める。
自動停止条件:
- GitHub API確認の結果、対象ラベルのオープンIssueが0件の場合:
1. CronList でこのループのcron IDを特定
2. CronDelete でcronを削除
3. state.json の active を false に更新
4. SSOT日記に「自律ループ完走・自動停止」を記録
二重安全装置: next-issue.py は pending 空の時点で active: false に設定。次回cron発動でも即終了する。
再開方法: CronCreate 再設定 + state.json の active: true + pending にIssue番号追加。