2025年趣味で作ったツールを紹介する
はじめに
2025年、趣味で開発した便利なツールを4つ紹介します。どれも日々の開発業務で「もっとこうなったらいいのに」と感じた課題を解決するために作ったものです。
ぜひ試してみてください。
今回紹介する4つのツールは、それぞれ以下のような課題を解決します。
| ツール | 解決する課題 |
|---|---|
| tf-refactoring-block-uncommenter | Terraform リファクタリングブロックの手動コメントアウト作業 |
| repo-file-sync | 複数リポジトリへの共通ファイル配布と同期 |
| kzdiff | Kustomize ビルド結果の確認作業 |
| safe-command | AI エージェントへの安全なコマンド実行権限の付与 |
1. tf-refactoring-block-uncommenter
概要
Terraform のリファクタリングブロック(moved、import、removed)を実行後に自動でコメントアウトして Pull Request を作成する GitHub Actions です。
どういうときに嬉しいか
Terraform でリソースを移動・インポート・削除する際、以下のようなブロックを書きますよね。
moved {
from = aws_instance.old_name
to = aws_instance.new_name
}
import {
to = aws_s3_bucket.example
id = "my-bucket"
}
removed {
from = aws_security_group.unused
lifecycle {
destroy = false
}
}
これらのブロックは terraform apply で一度実行されると、次回以降は不要になります。しかし以下の理由から削除せず、コメントアウトして履歴として残しておきたくなります。
- 実行履歴として残したい
- レビュー時に何が変更されたか追跡しやすい
コメントアウトしておかないと、将来同じ名前のリソースを追加した際に意図せず moved が再実行されるリスクがあります。
毎回手動でコメントアウトするのは面倒ですが、このアクションを使うと自動でコメントアウトして PR を作成してくれます。
# moved {
# from = aws_instance.old_name
# to = aws_instance.new_name
# }
Terraform のリファクタリング作業を頻繁に行うチームには特におすすめです。
背景
弊社では tfmigrate を利用して state のマイグレーション作業を行っていましたが、Terraform が公式に moved/import/removed ブロックをサポートしたため移行を検討していました(move しながら create できる点も魅力的です)。
しかし、再度 moved が実行されるリスクを払拭できないと個人的にはそこがむず痒かったため、このツールを作成しました。
2. repo-file-sync
概要
複数のリポジトリから特定のファイルを同期し、自動的に Pull Request を作成する GitHub Actions です。glob パターンやテキスト置換(正規表現)にも対応しています。
どういうときに嬉しいか
複数のリポジトリで共通の設定ファイルやドキュメントを管理している場合、以下のような課題があります。
- 共通の設定ファイル(
.editorconfig、.prettierrcなど)を全リポジトリに配布したい - 上流リポジトリの変更を自動で同期したい
- テンプレートリポジトリの更新を既存プロジェクトに反映したい
- ドキュメントを中央管理して各リポジトリに配布したい
このツールを使うと、設定ファイル(.github/repo-file-sync.yaml)で同期元とファイルパターンを指定するだけで、定期的に自動同期してくれます。
repos:
company/shared-configs:
files:
- .editorconfig
- .prettierrc
company/documentation:
files:
- docs/API.md
- docs/CONTRIBUTING.md
さらに、テキスト置換機能を使えば、組織名や URL を自動で書き換えながら同期することもできます。
repos:
upstream-org/template-repo:
files:
README.md:
replacements:
- pattern: 'upstream-org'
replacement: 'my-org'
flags: 'g'
モノレポではなくマルチリポジトリで開発している組織には特に便利です。
背景
弊社ではすでに同名のツールを社内で活用しています。
上記で説明した正規表現によるテキスト置換機能が必要になったため、新たに開発しました。
思い立ったタイミングが週末だったため、個人リポジトリで開発しています。
3. kzdiff
概要
Kustomize のビルド結果をブランチ間で比較する CLI ツールです。
どういうときに嬉しいか
Kustomize で Kubernetes マニフェストを管理していると、PR レビュー時にこんな悩みが出てきます。
- Kustomize の設定ファイル(
kustomization.yaml)の diff は見えるけど、実際にどんな Kubernetes リソースが変更されるのか分かりにくい - レビュー時に
kustomize buildを毎回実行するのが面倒 - 変更の影響範囲を把握しづらい
kzdiff を使うと、ブランチ間で Kustomize のビルド結果を自動で比較してくれます。
# main ブランチと比較
kzdiff ./overlays/production
# 特定のブランチと比較
kzdiff ./overlays/production -b develop
# Deployment だけフィルタ
kzdiff ./overlays/production -f kind=Deployment
JSONPath によるフィルタリングも可能なので、特定の条件に合致するリソースだけ確認できます。
# replica が 2 より大きい Deployment のみ表示
kzdiff ./overlays/production -f '$[?(@.spec.replicas>2)]'
Kustomize を使った GitOps 運用では PR レビューの質を大きく向上させることができます。
また、ローカルで実行できる CLI ツールなので、Claude Code のような AI エージェントに使ってもらうこともできます。
背景
Kubernetes を触る機会が多く、変更して push → CI で差分確認 の待ち時間が非常にストレスだったため作りました。
また、CI で動いている差分確認ワークフローは過去に作ったスクリプトなのですが、一部不具合があるため修正したいと思っていたので、いっそツールとして作って公開したかった。
4. safe-command
概要
AI エージェント(Claude Code など)が実行できるコマンドを、パターンベースのホワイトリストで安全に制限するプロキシツールです。
どういうときに嬉しいか
Claude Code は現在 Bash(aws * get-*) のようなパターンマッチングによるコマンド制限ができません。
IAM Role を Read-only な権限にして AWS CLI 全体を許可しても、aws iam delete-policy --profile <write-role> のように profile を切り替えて実行されるリスクがあります。
つまり、AWS CLI などインフラを操作するコマンドを AI に自由に実行させることには懸念があります。
safe-command を使うと、YAML でホワイトリストを定義し、安全なコマンドだけを許可できます。
commands:
aws:
patterns:
# 読み取り専用操作のみ許可
- "* list-*"
- "* get-*"
- "* describe-*"
- "s3 ls*"
- "sts get-caller-identity"
このように設定すると、以下のような動きになります。
# 許可されたコマンド ✅
./safe-command -- aws s3 ls
# ブロックされるコマンド ❌
./safe-command -- aws s3 rm s3://bucket/file.txt
# Error: Command not allowed
dry-run モードもあるので、実行前にテストできます。
./safe-command --dry-run -- aws s3 ls
# [DRY RUN] Would execute: aws s3 ls
AI エージェントに安全にコマンド実行させたい場合に特に有効です。Claude Code の CLAUDE.md で safe-command を組み込むことで、AI による破壊的な操作を防ぎつつ、便利さを享受できます。
技術選定
多くのツールは Bun で書かれています。軽量でなおかつ bun shell を利用して、シェルコマンドを記述できるので、可読性などがよく個人的に非常に気に入っています。
まとめ
どれも実際の開発現場で感じた「ちょっとした不便」を解消するために作ったものです。同じような課題を抱えている方がいれば、ぜひ使ってみてください。
Discussion