みてね Tech Blog
🌸

Claude Codeにリポジトリを調べてもらうカスタムスラッシュコマンド

に公開

小ネタです🍣

Claude Codeにはカスタムスラッシュコマンドという機能があり、任意のプロンプトを定義して呼び出すことができます

私は普段SREとして働いており、社内外のリポジトリのソースコードを調査目的で読むことが多く、調査作業のコストを低減したいと思っていました
当初はその都度 claude コマンドで指示を出していましたが、結果の出力先を標準化して過去の調査結果を見やすくしたり、ローカルのソースコードへのリンクを適宜含められると便利であることに気づき、カスタムコマンドにまとめて運用することとしました

コマンドは以下になります
tkhstmp は自由に変えていただけるとよいですが、 .git/info/exclude などで常時ignoreして、リポジトリごとのメモ書きや作業ログ保存の用途で使うとよいでしょう

私の場合、コマンドはdotfilesをGitHubで管理しており、内容を修正した場合でも複数の環境で利用できるようにしています

.claude/commands/custom:analysis.md
引数に指定されたプロンプトの内容について調査を実施し、結果を出力する

コマンド実行時の引数(ARGUMENTS)が空の場合には、ユーザーに対してどのような内容について調査をするか確認する

作業にあたっては以下のルールを遵守する

- 内容は箇条書きにし、平易な日本語を使う
- Markdown形式で記載する
- テキストファイル中に発見した事実のみに基づいて記載を行う。憶測により記載することは避ける
  - curlやその他のWeb検索によってインターネットの情報をベースに調査結果を生成することを禁ずる
- リポジトリ内の実際のソースコードへの相対リンクを細かく記載するのが望ましい
  - 調査結果の格納先を考慮したリンクを作成する。例えば、 `dir/subdir/code.py:123-125` を示すリンクは、 `[dir/subdir/code.py:123-125](../dir/subdir/code.py#L123)` となる
- 必要に応じてMCPサーバーやファイル検索に関するシェルコマンドを実行してよいが、以下のルールを守る
  - 作業ディレクトリより上位のディレクトリを対象にすることは固く禁ずる
  - 絶対パスによる検索も固く禁ずる。
- 調査結果は、現在の作業ディレクトリの `tkhstmp/analysis_${YYYYMMDD}_${調査概要の英語表現}.md` に保存する
  - `tkhstmp/` ディレクトリが存在しない場合は作成する

調査すべき内容を以下に示す

$ARGUMENTS

動作イメージも紹介します
リポジトリルートで claude コマンドを実行し、以下のように呼び出します
(サンプルとして、argoproj/argo-workflowsのリポジトリについて調査しました)

/custom:analysis `argo cron list` コマンドの戻り値を作っている場所を探して。特に、LAST RUN / NEXT RUNをどうやって作ってるかが気になります

コマンドを実行すると、 tkhstmp/analysis_yyyymmdd_argo_cron_list_output.md が出力されます
出力結果はそのまま読むだけでなく、 3行でまとめて とか xxについて深掘りして など追加で質問して使うと効率的なように思います

出力結果
# `argo cron list` コマンドの戻り値を作っている場所の調査結果

## 概要

`argo cron list`コマンドの戻り値(出力)を生成している場所とそのプロセスについて調査した結果を以下に示す。

## 主要なファイルと処理の流れ

### 1. コマンドエントリーポイント

- **メインコマンド定義**: [cmd/argo/commands/root.go:118](../cmd/argo/commands/root.go#L118)
  - `cron.NewCronWorkflowCommand()`を呼び出してcronコマンドをルートコマンドに追加

- **cronサブコマンド定義**: [cmd/argo/commands/cron/root.go:18](../cmd/argo/commands/cron/root.go#L18)
  - `NewListCommand()`を呼び出してlistサブコマンドを追加

### 2. `argo cron list`の実装

- **コマンド実装**: [cmd/argo/commands/cron/list.go](../cmd/argo/commands/cron/list.go)
  - `NewListCommand()`関数(26-72行目)でコマンドを定義
  - 実行ロジックは33-66行目の`RunE`関数内で実装

### 3. データ取得処理

- **API呼び出し**: [cmd/argo/commands/cron/list.go:48-54](../cmd/argo/commands/cron/list.go#L48)
  - `serviceClient.ListCronWorkflows()`を呼び出してCronWorkflowのリストを取得

- **サーバー側実装**: [server/cronworkflow/cron_workflow_server.go:47-58](../server/cronworkflow/cron_workflow_server.go#L47)
  - `ListCronWorkflows`メソッドでKubernetes APIからCronWorkflowリソースを取得

### 4. 出力フォーマット処理

#### 出力モードの分岐

- **出力モード判定**: [cmd/argo/commands/cron/list.go:55-64](../cmd/argo/commands/cron/list.go#L55)
  - `""` または `"wide"`: テーブル形式で出力(`printTable`関数を呼び出し)
  - `"name"`: CronWorkflowの名前のみを出力

#### テーブル形式出力の実装

- **テーブル出力関数**: [cmd/argo/commands/cron/list.go:74-101](../cmd/argo/commands/cron/list.go#L74)
  - `printTable`関数でテーブル形式の出力を生成
  - `tabwriter`を使用してタブ区切りのテーブルをフォーマット

- **テーブルヘッダー**: [cmd/argo/commands/cron/list.go:79](../cmd/argo/commands/cron/list.go#L79)
  \```
  NAME	AGE	LAST RUN	NEXT RUN	SCHEDULES	TIMEZONE	SUSPENDED
  \```

- **各行のデータ**: [cmd/argo/commands/cron/list.go:97](../cmd/argo/commands/cron/list.go#L97)
  - 名前、作成からの経過時間、最終実行時間、次回実行時間、スケジュール、タイムゾーン、停止状態を表示

### 5. 時間表示のフォーマット処理

- **相対時間表示**: [util/humanize/humanize.go:81-86](../util/humanize/humanize.go#L81)
  - `RelativeDurationShort`関数で相対時間を短縮形式で表示(例: "2m", "1h", "3d")

- **時間単位定義**: [util/humanize/humanize.go:68-78](../util/humanize/humanize.go#L68)
  - `shortTimeMagnitudes`配列で短縮形式の時間単位を定義

### 6. 次回実行時間の計算

- **実行時間計算**: [cmd/argo/commands/cron/util.go:23-38](../cmd/argo/commands/cron/util.go#L23)
  - `GetNextRuntime`関数でcronスケジュールから次回実行時間を計算
  - `github.com/robfig/cron/v3`ライブラリを使用してcron式を解析

## 出力の生成プロセス

1. **コマンド解析**: Cobraライブラリがコマンドライン引数を解析
2. **APIクライアント作成**: Kubernetes APIまたはArgo Serverへのクライアントを作成
3. **データ取得**: CronWorkflowリソースのリストをAPIから取得
4. **出力フォーマット選択**: `--output`フラグに基づいて出力形式を決定
5. **テーブル生成**: 各CronWorkflowについて表示データを計算・フォーマット
6. **画面出力**: `tabwriter`を使用してテーブル形式で標準出力に表示

## 重要な依存関係

- **Cobraライブラリ**: コマンドライン処理
- **tabwriter**: テーブル形式の出力フォーマット
- **robfig/cron**: cron式の解析と次回実行時間計算
- **go-humanize**: 人間が読みやすい時間表示

そんだけ😌

みてね Tech Blog
みてね Tech Blog

Discussion