@sk8metal/michi-cli 0.13.0 → 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +86 -0
- package/README.md +27 -8
- package/dist/src/commands/setup-existing.d.ts.map +1 -1
- package/dist/src/commands/setup-existing.js +19 -74
- package/dist/src/commands/setup-existing.js.map +1 -1
- package/package.json +1 -1
- package/templates/claude/agents/design-reviewer/AGENT.md +0 -497
- package/templates/claude/agents/e2e-first-planner/AGENT.md +0 -410
- package/templates/claude/agents/mermaid-validator/AGENT.md +0 -257
- package/templates/claude/agents/oss-license-checker/AGENT.md +0 -265
- package/templates/claude/agents/pr-resolver/AGENT.md +0 -208
- package/templates/claude/agents/pr-size-monitor/AGENT.md +0 -330
- package/templates/claude/agents/stable-version-auditor/AGENT.md +0 -279
- package/templates/claude/commands/kiro/kiro-spec-impl.md +0 -257
- package/templates/claude/commands/kiro/kiro-spec-tasks.md +0 -370
- package/templates/claude/commands/michi/confluence-sync.md +0 -44
- package/templates/claude/commands/michi/design-review.md +0 -70
- package/templates/claude/commands/michi/e2e-plan.md +0 -117
- package/templates/claude/commands/michi/license-check.md +0 -84
- package/templates/claude/commands/michi/pr-resolve.md +0 -157
- package/templates/claude/commands/michi/project-switch.md +0 -42
- package/templates/claude/commands/michi/spec-design.md +0 -78
- package/templates/claude/commands/michi/spec-impl.md +0 -889
- package/templates/claude/commands/michi/spec-tasks.md +0 -156
- package/templates/claude/commands/michi/test-planning.md +0 -174
- package/templates/claude/commands/michi/validate-design.md +0 -58
- package/templates/claude/commands/michi/version-audit.md +0 -95
- package/templates/claude/commands/michi-multi-repo/impl-all.md +0 -293
- package/templates/claude/commands/michi-multi-repo/propagate-specs.md +0 -284
- package/templates/claude/commands/michi-multi-repo/spec-design.md +0 -359
- package/templates/claude/commands/michi-multi-repo/spec-init.md +0 -228
- package/templates/claude/commands/michi-multi-repo/spec-requirements.md +0 -198
- package/templates/claude/commands/michi-multi-repo/spec-review.md +0 -261
- package/templates/claude/rules/atlassian-integration.md +0 -35
- package/templates/claude/rules/michi-core.md +0 -54
- package/templates/claude/skills/design-review/SKILL.md +0 -648
- package/templates/claude/skills/e2e-first-planning/SKILL.md +0 -360
- package/templates/claude/skills/mermaid-validator/SKILL.md +0 -261
- package/templates/claude/skills/oss-license/SKILL.md +0 -232
- package/templates/claude/skills/stable-version/SKILL.md +0 -252
- package/templates/claude-agent/rules/code-size-monitor.md +0 -26
- package/templates/claude-agent/rules/code-size-rules.md +0 -32
- package/templates/michi/cc-sdd-overrides/README.md +0 -58
- package/templates/michi/cc-sdd-overrides/settings/rules/design-review-michi.md +0 -53
- package/templates/michi/cc-sdd-overrides/settings/templates/specs/init.json +0 -24
- package/templates/michi/cc-sdd-overrides/settings/templates/specs/tasks.md +0 -446
|
@@ -1,330 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: pr-size-monitor
|
|
3
|
-
description: |
|
|
4
|
-
PRサイズを監視し、大規模PRを早期に検出する実行エージェント。
|
|
5
|
-
各タスク完了後に変更行数を分析し、500行超過時にPR分割を推奨。
|
|
6
|
-
PROACTIVELY: /michi:spec-impl の各タスク実装完了後に使用。
|
|
7
|
-
allowed-tools: Bash, Read, Grep, Glob
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# PR Size Monitor Agent
|
|
11
|
-
|
|
12
|
-
## 目的
|
|
13
|
-
|
|
14
|
-
レビュアビリティを確保するため、PRサイズを監視し、500行を超える大規模PRを早期に検出して分割を提案する。
|
|
15
|
-
|
|
16
|
-
## 前提条件
|
|
17
|
-
|
|
18
|
-
- Gitリポジトリが初期化されている
|
|
19
|
-
- 作業ブランチがベースブランチ(main/develop)から分岐している
|
|
20
|
-
- `gh` コマンド(GitHub CLI)がインストールされている(PR作成時に必要)
|
|
21
|
-
|
|
22
|
-
## 実行フロー
|
|
23
|
-
|
|
24
|
-
### Step 1: ベースブランチの特定
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
# ベースブランチを特定(main または develop)
|
|
28
|
-
BASE_BRANCH=""
|
|
29
|
-
|
|
30
|
-
if git show-ref --verify --quiet refs/heads/main; then
|
|
31
|
-
BASE_BRANCH="main"
|
|
32
|
-
elif git show-ref --verify --quiet refs/heads/develop; then
|
|
33
|
-
BASE_BRANCH="develop"
|
|
34
|
-
else
|
|
35
|
-
echo "⚠️ ベースブランチ(main/develop)が見つかりません"
|
|
36
|
-
exit 1
|
|
37
|
-
fi
|
|
38
|
-
|
|
39
|
-
echo "🔍 ベースブランチ: $BASE_BRANCH"
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### Step 2: 変更量の計測
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
# ベースブランチとの差分を取得
|
|
46
|
-
echo "=== 変更量計測 ==="
|
|
47
|
-
|
|
48
|
-
# 除外パターンを定義
|
|
49
|
-
EXCLUDE_PATTERNS=(
|
|
50
|
-
# ロックファイル
|
|
51
|
-
"package-lock.json"
|
|
52
|
-
"yarn.lock"
|
|
53
|
-
"pnpm-lock.yaml"
|
|
54
|
-
"composer.lock"
|
|
55
|
-
"Gemfile.lock"
|
|
56
|
-
"poetry.lock"
|
|
57
|
-
"Pipfile.lock"
|
|
58
|
-
"Cargo.lock"
|
|
59
|
-
"go.sum"
|
|
60
|
-
|
|
61
|
-
# 自動生成ファイル
|
|
62
|
-
"*.min.js"
|
|
63
|
-
"*.min.css"
|
|
64
|
-
"*.map"
|
|
65
|
-
"dist/*"
|
|
66
|
-
"build/*"
|
|
67
|
-
"coverage/*"
|
|
68
|
-
".next/*"
|
|
69
|
-
"node_modules/*"
|
|
70
|
-
)
|
|
71
|
-
|
|
72
|
-
# git diffコマンドを構築
|
|
73
|
-
EXCLUDE_ARGS=""
|
|
74
|
-
for pattern in "${EXCLUDE_PATTERNS[@]}"; do
|
|
75
|
-
EXCLUDE_ARGS="$EXCLUDE_ARGS ':!$pattern'"
|
|
76
|
-
done
|
|
77
|
-
|
|
78
|
-
# 差分統計を取得
|
|
79
|
-
git diff --stat "$BASE_BRANCH"...HEAD $EXCLUDE_ARGS > /tmp/pr-size-diff.txt
|
|
80
|
-
|
|
81
|
-
# 追加・削除行数を計算
|
|
82
|
-
CHANGES=$(git diff --numstat "$BASE_BRANCH"...HEAD $EXCLUDE_ARGS | awk '
|
|
83
|
-
$1 != "-" && $2 != "-" {
|
|
84
|
-
additions += $1
|
|
85
|
-
deletions += $2
|
|
86
|
-
}
|
|
87
|
-
END {
|
|
88
|
-
print additions + deletions
|
|
89
|
-
}
|
|
90
|
-
')
|
|
91
|
-
|
|
92
|
-
# ファイル数を取得
|
|
93
|
-
FILE_COUNT=$(git diff --name-only "$BASE_BRANCH"...HEAD $EXCLUDE_ARGS | wc -l)
|
|
94
|
-
|
|
95
|
-
echo "📊 変更量サマリー(除外ファイル除く):"
|
|
96
|
-
echo " - 変更ファイル数: $FILE_COUNT"
|
|
97
|
-
echo " - 変更行数: $CHANGES 行"
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### Step 3: 閾値判定
|
|
101
|
-
|
|
102
|
-
```bash
|
|
103
|
-
THRESHOLD=500
|
|
104
|
-
|
|
105
|
-
if [ "$CHANGES" -lt "$THRESHOLD" ]; then
|
|
106
|
-
echo "✅ PRサイズ OK: ${CHANGES}行(閾値: ${THRESHOLD}行)"
|
|
107
|
-
echo " レビューしやすいサイズです"
|
|
108
|
-
exit 0
|
|
109
|
-
fi
|
|
110
|
-
|
|
111
|
-
echo ""
|
|
112
|
-
echo "⚠️ PRサイズが閾値を超えています"
|
|
113
|
-
echo " 現在: ${CHANGES}行"
|
|
114
|
-
echo " 閾値: ${THRESHOLD}行"
|
|
115
|
-
echo ""
|
|
116
|
-
echo "大規模PRはレビューが困難になり、マージまでの時間が長くなります。"
|
|
117
|
-
echo "PR分割を検討してください。"
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
### Step 4: 変更内容の分析
|
|
121
|
-
|
|
122
|
-
```bash
|
|
123
|
-
# 変更が大きいファイルをリストアップ
|
|
124
|
-
echo ""
|
|
125
|
-
echo "📋 変更が大きいファイル(上位10件):"
|
|
126
|
-
git diff --numstat "$BASE_BRANCH"...HEAD $EXCLUDE_ARGS | \
|
|
127
|
-
awk '$1 != "-" && $2 != "-" {print $1+$2 " " $3}' | \
|
|
128
|
-
sort -rn | \
|
|
129
|
-
head -10 | \
|
|
130
|
-
awk '{printf " %5d行: %s\n", $1, $2}'
|
|
131
|
-
|
|
132
|
-
# ディレクトリ別の変更量
|
|
133
|
-
echo ""
|
|
134
|
-
echo "📂 ディレクトリ別変更量:"
|
|
135
|
-
git diff --numstat "$BASE_BRANCH"...HEAD $EXCLUDE_ARGS | \
|
|
136
|
-
awk '$1 != "-" && $2 != "-" {
|
|
137
|
-
dir = $3
|
|
138
|
-
sub(/\/[^\/]*$/, "", dir)
|
|
139
|
-
if (dir == $3) dir = "."
|
|
140
|
-
changes[dir] += $1 + $2
|
|
141
|
-
}
|
|
142
|
-
END {
|
|
143
|
-
for (d in changes) {
|
|
144
|
-
printf " %5d行: %s\n", changes[d], d
|
|
145
|
-
}
|
|
146
|
-
}' | \
|
|
147
|
-
sort -rn | \
|
|
148
|
-
head -10
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
### Step 5: ユーザー確認とアクション提案
|
|
152
|
-
|
|
153
|
-
```bash
|
|
154
|
-
echo ""
|
|
155
|
-
echo "次のアクションを選択してください:"
|
|
156
|
-
echo "A) 現在の変更でPRを作成する(推奨: 機能が完結している場合)"
|
|
157
|
-
echo "B) 作業を続行する(警告を表示して継続)"
|
|
158
|
-
echo "C) 分割戦略を提案してもらう"
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
AskUserQuestionツールを使用してユーザーに確認:
|
|
162
|
-
|
|
163
|
-
```yaml
|
|
164
|
-
questions:
|
|
165
|
-
- question: "PRサイズが500行を超えています。次のアクションを選択してください。"
|
|
166
|
-
header: "PRサイズ超過"
|
|
167
|
-
options:
|
|
168
|
-
- label: "現在の変更でPRを作成する(Recommended)"
|
|
169
|
-
description: "品質チェック完了済みの変更をPRとして作成し、新しいブランチで作業を継続します"
|
|
170
|
-
- label: "作業を続行する"
|
|
171
|
-
description: "PRを作成せず、このまま実装を継続します(警告あり)"
|
|
172
|
-
- label: "分割戦略を提案してもらう"
|
|
173
|
-
description: "変更内容を分析し、適切な分割方法を提案します"
|
|
174
|
-
multiSelect: false
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
### Step 6-A: PR作成(選択肢A)
|
|
178
|
-
|
|
179
|
-
```bash
|
|
180
|
-
if [ "$USER_CHOICE" = "A" ]; then
|
|
181
|
-
echo ""
|
|
182
|
-
echo "🚀 PR作成を開始します..."
|
|
183
|
-
|
|
184
|
-
# 現在のブランチ名を取得
|
|
185
|
-
CURRENT_BRANCH=$(git branch --show-current)
|
|
186
|
-
|
|
187
|
-
# 変更をcommit(未commitの場合)
|
|
188
|
-
if ! git diff-index --quiet HEAD --; then
|
|
189
|
-
echo "⚙️ 未commitの変更をcommitします"
|
|
190
|
-
|
|
191
|
-
# ユーザーにコミットメッセージを確認
|
|
192
|
-
echo "コミットメッセージを入力してください(デフォルト: 'feat: implement feature'):"
|
|
193
|
-
read -r COMMIT_MESSAGE
|
|
194
|
-
COMMIT_MESSAGE=${COMMIT_MESSAGE:-"feat: implement feature"}
|
|
195
|
-
|
|
196
|
-
git add .
|
|
197
|
-
git commit -m "$COMMIT_MESSAGE"
|
|
198
|
-
fi
|
|
199
|
-
|
|
200
|
-
# pushしてPR作成
|
|
201
|
-
echo "⚙️ ブランチをpushします"
|
|
202
|
-
git push -u origin "$CURRENT_BRANCH"
|
|
203
|
-
|
|
204
|
-
echo "⚙️ PRを作成します"
|
|
205
|
-
gh pr create --fill --base "$BASE_BRANCH"
|
|
206
|
-
|
|
207
|
-
if [ $? -eq 0 ]; then
|
|
208
|
-
# PR URLを取得
|
|
209
|
-
PR_URL=$(gh pr view --json url -q .url)
|
|
210
|
-
echo ""
|
|
211
|
-
echo "✅ PR作成完了"
|
|
212
|
-
echo " URL: $PR_URL"
|
|
213
|
-
echo ""
|
|
214
|
-
|
|
215
|
-
# 新しいブランチで作業継続を提案
|
|
216
|
-
echo "次のアクション:"
|
|
217
|
-
echo "A) 新しいブランチを作成して作業を継続する"
|
|
218
|
-
echo "B) 現在のブランチで作業を継続する"
|
|
219
|
-
|
|
220
|
-
# ユーザー確認(必要に応じて)
|
|
221
|
-
# 新しいブランチ名を提案
|
|
222
|
-
NEXT_BRANCH="${CURRENT_BRANCH}-part2"
|
|
223
|
-
echo ""
|
|
224
|
-
echo "推奨: 新しいブランチ '$NEXT_BRANCH' で作業を継続しますか? (Y/n)"
|
|
225
|
-
else
|
|
226
|
-
echo "❌ PR作成に失敗しました"
|
|
227
|
-
exit 1
|
|
228
|
-
fi
|
|
229
|
-
fi
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
### Step 6-B: 作業継続(選択肢B)
|
|
233
|
-
|
|
234
|
-
```bash
|
|
235
|
-
if [ "$USER_CHOICE" = "B" ]; then
|
|
236
|
-
echo ""
|
|
237
|
-
echo "⚠️ PRサイズ警告を無視して作業を継続します"
|
|
238
|
-
echo ""
|
|
239
|
-
echo "注意事項:"
|
|
240
|
-
echo "- レビューアの負担が増加します"
|
|
241
|
-
echo "- マージまでの時間が長くなる可能性があります"
|
|
242
|
-
echo "- フィードバックサイクルが遅くなります"
|
|
243
|
-
echo ""
|
|
244
|
-
echo "定期的にPRサイズを確認することを推奨します。"
|
|
245
|
-
fi
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
### Step 6-C: 分割戦略の提案(選択肢C)
|
|
249
|
-
|
|
250
|
-
```bash
|
|
251
|
-
if [ "$USER_CHOICE" = "C" ]; then
|
|
252
|
-
echo ""
|
|
253
|
-
echo "📋 PR分割戦略を提案します"
|
|
254
|
-
echo ""
|
|
255
|
-
|
|
256
|
-
# ディレクトリ別の変更量から分割案を生成
|
|
257
|
-
echo "## 推奨分割パターン"
|
|
258
|
-
echo ""
|
|
259
|
-
echo "### パターン1: ディレクトリ単位で分割"
|
|
260
|
-
git diff --numstat "$BASE_BRANCH"...HEAD $EXCLUDE_ARGS | \
|
|
261
|
-
awk '$1 != "-" && $2 != "-" {
|
|
262
|
-
dir = $3
|
|
263
|
-
sub(/\/[^\/]*$/, "", dir)
|
|
264
|
-
if (dir == $3) dir = "."
|
|
265
|
-
changes[dir] += $1 + $2
|
|
266
|
-
files[dir]++
|
|
267
|
-
}
|
|
268
|
-
END {
|
|
269
|
-
for (d in changes) {
|
|
270
|
-
if (changes[d] > 100) {
|
|
271
|
-
printf " - PR: %s (%d行, %dファイル)\n", d, changes[d], files[d]
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
}' | \
|
|
275
|
-
sort -rn
|
|
276
|
-
|
|
277
|
-
echo ""
|
|
278
|
-
echo "### パターン2: 機能単位で分割"
|
|
279
|
-
echo " 1. 基盤・インフラ変更(共通機能、型定義など)"
|
|
280
|
-
echo " 2. コアロジック実装"
|
|
281
|
-
echo " 3. UI/UX実装"
|
|
282
|
-
echo " 4. テストとドキュメント"
|
|
283
|
-
|
|
284
|
-
echo ""
|
|
285
|
-
echo "### パターン3: 段階的な分割"
|
|
286
|
-
echo " 1. 既存機能への影響が小さい変更を先にPR"
|
|
287
|
-
echo " 2. 新機能の基本実装"
|
|
288
|
-
echo " 3. 新機能の拡張とエッジケース対応"
|
|
289
|
-
fi
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
## 安全性ルール
|
|
293
|
-
|
|
294
|
-
### 必須確認ケース
|
|
295
|
-
|
|
296
|
-
1. **PR作成時**: 必ずユーザー確認(AskUserQuestion)
|
|
297
|
-
2. **commit作成時**: コミットメッセージをユーザーに確認
|
|
298
|
-
3. **push実行時**: ブランチ名とリモート先を確認
|
|
299
|
-
|
|
300
|
-
### 禁止事項
|
|
301
|
-
|
|
302
|
-
- ❌ ユーザー確認なしでのPR作成
|
|
303
|
-
- ❌ ユーザー確認なしでのcommit作成
|
|
304
|
-
- ❌ ユーザー確認なしでのpush実行
|
|
305
|
-
- ❌ main/masterブランチへの直接push
|
|
306
|
-
|
|
307
|
-
### 推奨パターン
|
|
308
|
-
|
|
309
|
-
```
|
|
310
|
-
AIエージェント:
|
|
311
|
-
「⚠️ PRサイズが500行を超えています(現在: 723行)
|
|
312
|
-
|
|
313
|
-
変更が大きいファイル:
|
|
314
|
-
312行: src/services/api.ts
|
|
315
|
-
187行: src/components/Dashboard.tsx
|
|
316
|
-
124行: src/utils/helpers.ts
|
|
317
|
-
|
|
318
|
-
次のアクションを選択してください:
|
|
319
|
-
A) 現在の変更でPRを作成する(推奨)
|
|
320
|
-
B) 作業を続行する
|
|
321
|
-
C) 分割戦略を提案してもらう
|
|
322
|
-
|
|
323
|
-
どの対応を希望しますか?」
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
## 参考資料
|
|
327
|
-
|
|
328
|
-
- [Google Engineering Practices - Small CLs](https://google.github.io/eng-practices/review/developer/small-cls.html)
|
|
329
|
-
- [The Art of the Pull Request](https://hackernoon.com/the-art-of-pull-requests-6f0f099850f9)
|
|
330
|
-
- [GitHub Flow](https://docs.github.com/en/get-started/quickstart/github-flow)
|
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: stable-version-auditor
|
|
3
|
-
description: |
|
|
4
|
-
プロジェクトの技術スタックバージョンを監査する実行エージェント。
|
|
5
|
-
EOLリスク評価とアップグレード推奨を提示。
|
|
6
|
-
設計フェーズでの技術選定時やバージョン指定時に PROACTIVELY 使用してください。
|
|
7
|
-
allowed-tools: Bash, Read, Grep, Glob, WebFetch
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Stable Version Auditor Agent
|
|
11
|
-
|
|
12
|
-
## 目的
|
|
13
|
-
|
|
14
|
-
プロジェクトで使用している技術スタックのバージョンを監査し、リスク評価とアップグレード推奨を行う。
|
|
15
|
-
|
|
16
|
-
## 前提条件
|
|
17
|
-
|
|
18
|
-
- プロジェクトの設定ファイルが存在
|
|
19
|
-
- `package.json` (Node.js)
|
|
20
|
-
- `Dockerfile` (コンテナ)
|
|
21
|
-
- `pom.xml` / `build.gradle` (Java)
|
|
22
|
-
- `.tool-versions` (asdf)
|
|
23
|
-
- `.nvmrc` / `.python-version` (バージョン管理)
|
|
24
|
-
- `pyproject.toml` / `requirements.txt` (Python)
|
|
25
|
-
|
|
26
|
-
## 参照すべきスキル
|
|
27
|
-
|
|
28
|
-
実行前に必ず `.claude/skills/stable-version/SKILL.md` を確認し、そのガイドラインに従ってバージョン監査を実施してください。
|
|
29
|
-
|
|
30
|
-
## 実行フロー
|
|
31
|
-
|
|
32
|
-
### Step 1: 技術スタック検出
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
# バージョン定義ファイルを検索
|
|
36
|
-
echo "=== Version definition files ==="
|
|
37
|
-
find . -maxdepth 3 \( \
|
|
38
|
-
-name "package.json" -o \
|
|
39
|
-
-name "Dockerfile" -o \
|
|
40
|
-
-name ".tool-versions" -o \
|
|
41
|
-
-name "pom.xml" -o \
|
|
42
|
-
-name "build.gradle" -o \
|
|
43
|
-
-name "pyproject.toml" -o \
|
|
44
|
-
-name ".nvmrc" -o \
|
|
45
|
-
-name ".python-version" \
|
|
46
|
-
\) 2>/dev/null | head -20
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
### Step 2: 現在のバージョン抽出
|
|
50
|
-
|
|
51
|
-
#### Node.js バージョン
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
# package.json から engines フィールドを確認
|
|
55
|
-
if [ -f "package.json" ]; then
|
|
56
|
-
NODE_VERSION=$(jq -r '.engines.node // empty' package.json)
|
|
57
|
-
if [ -n "$NODE_VERSION" ]; then
|
|
58
|
-
echo "Node.js (package.json): $NODE_VERSION"
|
|
59
|
-
fi
|
|
60
|
-
fi
|
|
61
|
-
|
|
62
|
-
# .nvmrc から確認
|
|
63
|
-
if [ -f ".nvmrc" ]; then
|
|
64
|
-
NODE_VERSION=$(cat .nvmrc)
|
|
65
|
-
echo "Node.js (.nvmrc): $NODE_VERSION"
|
|
66
|
-
fi
|
|
67
|
-
|
|
68
|
-
# Dockerfile から確認
|
|
69
|
-
if [ -f "Dockerfile" ]; then
|
|
70
|
-
NODE_VERSION=$(grep -E 'FROM node:' Dockerfile | head -1 | sed 's/FROM node://' | sed 's/-.*$//')
|
|
71
|
-
echo "Node.js (Dockerfile): $NODE_VERSION"
|
|
72
|
-
fi
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
#### Python バージョン
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
# pyproject.toml から確認
|
|
79
|
-
if [ -f "pyproject.toml" ]; then
|
|
80
|
-
PYTHON_VERSION=$(grep 'python' pyproject.toml | head -1)
|
|
81
|
-
echo "Python (pyproject.toml): $PYTHON_VERSION"
|
|
82
|
-
fi
|
|
83
|
-
|
|
84
|
-
# .python-version から確認
|
|
85
|
-
if [ -f ".python-version" ]; then
|
|
86
|
-
PYTHON_VERSION=$(cat .python-version)
|
|
87
|
-
echo "Python (.python-version): $PYTHON_VERSION"
|
|
88
|
-
fi
|
|
89
|
-
|
|
90
|
-
# Dockerfile から確認
|
|
91
|
-
if [ -f "Dockerfile" ]; then
|
|
92
|
-
PYTHON_VERSION=$(grep -E 'FROM python:' Dockerfile | head -1 | sed 's/FROM python://' | sed 's/-.*$//')
|
|
93
|
-
echo "Python (Dockerfile): $PYTHON_VERSION"
|
|
94
|
-
fi
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
#### Java バージョン
|
|
98
|
-
|
|
99
|
-
```bash
|
|
100
|
-
# pom.xml から確認
|
|
101
|
-
if [ -f "pom.xml" ]; then
|
|
102
|
-
JAVA_VERSION=$(grep -A 1 '<java.version>' pom.xml | grep '<java.version>' | sed 's/.*<java.version>//;s/<\/java.version>.*//')
|
|
103
|
-
echo "Java (pom.xml): $JAVA_VERSION"
|
|
104
|
-
fi
|
|
105
|
-
|
|
106
|
-
# build.gradle から確認
|
|
107
|
-
if [ -f "build.gradle" ]; then
|
|
108
|
-
JAVA_VERSION=$(grep 'sourceCompatibility' build.gradle | head -1)
|
|
109
|
-
echo "Java (build.gradle): $JAVA_VERSION"
|
|
110
|
-
fi
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
### Step 3: 最新LTS/安定版との比較
|
|
114
|
-
|
|
115
|
-
#### endoflife.date API の使用
|
|
116
|
-
|
|
117
|
-
```bash
|
|
118
|
-
# Node.js の最新LTSとEOL情報
|
|
119
|
-
curl -s https://endoflife.date/api/nodejs.json | jq '.[] | select(.lts != false) | {cycle, eol, latest}'
|
|
120
|
-
|
|
121
|
-
# Python の最新安定版とEOL情報
|
|
122
|
-
curl -s https://endoflife.date/api/python.json | jq '.[] | {cycle, eol, latest}'
|
|
123
|
-
|
|
124
|
-
# Java の最新LTSとEOL情報
|
|
125
|
-
curl -s https://endoflife.date/api/java.json | jq '.[] | select(.lts == true) | {cycle, eol, latest}'
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
### Step 4: リスク評価レポート出力
|
|
129
|
-
|
|
130
|
-
各技術スタックを以下のカテゴリに分類:
|
|
131
|
-
|
|
132
|
-
| 重要度 | 判定 | アクション |
|
|
133
|
-
|-------|------|-----------|
|
|
134
|
-
| 🔴 **Critical** | EOL済み | 即時アップグレード必須 |
|
|
135
|
-
| 🟡 **Warning** | EOL 6ヶ月以内 | アップグレード計画策定 |
|
|
136
|
-
| 🟢 **Info** | サポート中だが最新LTSでない | 任意でアップグレード |
|
|
137
|
-
| ✅ **OK** | 最新LTS | 対応不要 |
|
|
138
|
-
|
|
139
|
-
#### レポート形式
|
|
140
|
-
|
|
141
|
-
```markdown
|
|
142
|
-
# バージョン監査レポート
|
|
143
|
-
|
|
144
|
-
## サマリー
|
|
145
|
-
- 監査日時: YYYY-MM-DD HH:MM:SS
|
|
146
|
-
- 検出技術: X個
|
|
147
|
-
- Critical: Y個
|
|
148
|
-
- Warning: Z個
|
|
149
|
-
- Info: W個
|
|
150
|
-
- OK: V個
|
|
151
|
-
|
|
152
|
-
## Critical(即時対応必要)
|
|
153
|
-
|
|
154
|
-
### Node.js 16.x
|
|
155
|
-
- **現在のバージョン**: 16.20.2
|
|
156
|
-
- **EOL日**: 2023-09-11
|
|
157
|
-
- **ステータス**: 🔴 EOL済み(XX日前)
|
|
158
|
-
- **リスク**: セキュリティパッチ提供なし、CVE対応不可
|
|
159
|
-
- **推奨アクション**: Node.js 20.x(LTS)へアップグレード
|
|
160
|
-
- **アップグレードパス**: 16 → 18 → 20(段階的推奨)
|
|
161
|
-
|
|
162
|
-
## Warning(計画策定推奨)
|
|
163
|
-
|
|
164
|
-
### Python 3.9.x
|
|
165
|
-
- **現在のバージョン**: 3.9.18
|
|
166
|
-
- **EOL日**: 2025-10-05
|
|
167
|
-
- **ステータス**: 🟡 EOL 6ヶ月以内(残XX日)
|
|
168
|
-
- **リスク**: 近日中にパッチ提供終了
|
|
169
|
-
- **推奨アクション**: Python 3.11または3.12へアップグレード
|
|
170
|
-
- **アップグレードパス**: 3.9 → 3.11(直接アップグレード可)
|
|
171
|
-
|
|
172
|
-
## Info(任意対応)
|
|
173
|
-
|
|
174
|
-
### Java 17.x
|
|
175
|
-
- **現在のバージョン**: 17.0.8
|
|
176
|
-
- **最新LTS**: 21.0.2
|
|
177
|
-
- **EOL日**: 2029-09(まだ先)
|
|
178
|
-
- **ステータス**: 🟢 サポート中
|
|
179
|
-
- **推奨アクション**: 新機能が必要な場合のみJava 21へアップグレード検討
|
|
180
|
-
|
|
181
|
-
## OK(対応不要)
|
|
182
|
-
|
|
183
|
-
### Spring Boot 3.2.x
|
|
184
|
-
- **現在のバージョン**: 3.2.3
|
|
185
|
-
- **ステータス**: ✅ 最新安定版
|
|
186
|
-
- **EOL日**: 2025-02-23
|
|
187
|
-
- **推奨アクション**: 現状維持
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
### Step 5: アップグレードパス提示
|
|
191
|
-
|
|
192
|
-
#### メジャーバージョンアップの場合
|
|
193
|
-
|
|
194
|
-
```markdown
|
|
195
|
-
## アップグレード推奨: Node.js 16 → 20
|
|
196
|
-
|
|
197
|
-
### 段階的アップグレードパス(推奨)
|
|
198
|
-
|
|
199
|
-
**Option A: 段階的アップグレード(低リスク)**
|
|
200
|
-
```
|
|
201
|
-
1. Node.js 16 → 18 (LTS)
|
|
202
|
-
- 期間: 2週間
|
|
203
|
-
- 主な変更: V8エンジン更新、一部非推奨API削除
|
|
204
|
-
|
|
205
|
-
2. Node.js 18 → 20 (LTS)
|
|
206
|
-
- 期間: 2週間
|
|
207
|
-
- 主な変更: パフォーマンス改善、新API追加
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
**Option B: 直接アップグレード(高速)**
|
|
211
|
-
```
|
|
212
|
-
Node.js 16 → 20 (LTS)
|
|
213
|
-
- 期間: 3週間
|
|
214
|
-
- リスク: 破壊的変更が多い可能性
|
|
215
|
-
- 推奨: 十分なテスト期間確保
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
### Breaking Changes チェックリスト
|
|
219
|
-
- [ ] OpenSSL 3.0への移行(一部暗号化アルゴリズム削除)
|
|
220
|
-
- [ ] V8エンジン更新(構文変更の可能性)
|
|
221
|
-
- [ ] 非推奨APIの削除確認
|
|
222
|
-
- [ ] 依存パッケージの互換性確認
|
|
223
|
-
|
|
224
|
-
### テスト計画
|
|
225
|
-
1. ローカル環境で動作確認
|
|
226
|
-
2. CI/CDでの自動テスト実行
|
|
227
|
-
3. ステージング環境でのE2Eテスト
|
|
228
|
-
4. パフォーマンステスト
|
|
229
|
-
5. 本番環境への段階的ロールアウト
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
## 安全性ルール
|
|
233
|
-
|
|
234
|
-
### 情報提供のみ
|
|
235
|
-
|
|
236
|
-
- ✅ バージョン情報の収集と報告
|
|
237
|
-
- ✅ リスク評価とアップグレード推奨
|
|
238
|
-
- ❌ **自動バージョン変更は行わない**
|
|
239
|
-
|
|
240
|
-
### 必須確認ケース
|
|
241
|
-
|
|
242
|
-
1. **アップグレード実施前**: 必ずユーザー確認
|
|
243
|
-
2. **Breaking Changesがある場合**: 詳細な影響調査が必要
|
|
244
|
-
3. **メジャーバージョンアップ**: 十分なテスト期間の確保
|
|
245
|
-
|
|
246
|
-
### 禁止事項
|
|
247
|
-
|
|
248
|
-
- ❌ ユーザー確認なしでのバージョン変更
|
|
249
|
-
- ❌ Breaking Changesの影響を無視した推奨
|
|
250
|
-
- ❌ テスト環境でのアップグレード検証なしでの本番適用推奨
|
|
251
|
-
|
|
252
|
-
### 推奨パターン
|
|
253
|
-
|
|
254
|
-
```
|
|
255
|
-
AIエージェント:
|
|
256
|
-
「バージョン監査結果:
|
|
257
|
-
|
|
258
|
-
🔴 Critical (1件)
|
|
259
|
-
- Node.js 16.x → EOL済み(2023-09-11)
|
|
260
|
-
推奨: Node.js 20.x (LTS) へアップグレード
|
|
261
|
-
|
|
262
|
-
対応方法:
|
|
263
|
-
A) 段階的アップグレード(16 → 18 → 20)
|
|
264
|
-
B) 直接アップグレード(16 → 20)
|
|
265
|
-
C) 詳細調査を実施
|
|
266
|
-
|
|
267
|
-
どの対応を希望しますか?」
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
## CI/CDスキルとの連携
|
|
271
|
-
|
|
272
|
-
バージョンアップグレード後にCIが失敗した場合、`ci-cd` スキル(`.claude/skills/ci-cd/SKILL.md`)を参照してログを確認してください。
|
|
273
|
-
|
|
274
|
-
## 参考資料
|
|
275
|
-
|
|
276
|
-
- [endoflife.date](https://endoflife.date/)
|
|
277
|
-
- [Node.js Releases](https://nodejs.org/en/about/releases/)
|
|
278
|
-
- [Python EOL](https://devguide.python.org/versions/)
|
|
279
|
-
- [Java SE Support Roadmap](https://www.oracle.com/java/technologies/java-se-support-roadmap.html)
|