📚

Sub Agentsにも最適。Claude Codeから動的にプロンプト実行する CLI Prompt 管理ツール - Climpt

に公開

概要

CLIツールを使った、Agentic Codingのためのプロンプト実行です。
(Vibe用ではありません)

ユースケース

多様なプロンプトを使い分け、望んだプロンプトを1行のコマンドで実行します。
主に、以下のユースケースを想定しています。

  • パターン化したプロンプトの使い分けを、一元管理したい
  • Claude CodeのようなCLIエージェントから、動的に呼び出したい
  • 処理の連鎖に、プロンプトを仲介して加工フローを構築したい
  • 特定の実装領域に、特定の洗練されたプロンプトを使い分けたい
  • Coding Agent にプロンプトを選ばせたい

また、応用ユースケースとしては、次のようなケースが想定されています。

  • Coding Agent が生成するコードを導き、安定化させたい
  • 抽象度の高い実装を、再現性高く実行したい

応用のために、Denoを用います。
Climptを複数Deno実行コマンドとして、最適化して用意します。
用意された実行コマンドは、プロファイルを切り替えることができます。

Climpt

Climptは、事前に用意したプロンプト群を使い分け、望んだプロンプトを1行のコマンドで呼び出し、出力します。
呼び出し時に、プロンプトへ差し込む値を引数で渡すことが可能です。

実行例:

# Bugレポートに基づいた新規テスト構築
cat bug_report.md | climpt-buld new test --input=bug

# 課題からタスクへの詳細なブレークダウン
climpt-breakdown to task --input=issue --from=github_issue_123.md --adaptation=detailed --uv-storypoint=5

このツールはAIコーディングエージェントと連携して動作するよう設計されており、特にCursorやClaude向けに最適化されています。基盤となるAIモデルはClaudeを想定していますが、構文や構造は他のAIモデルでも容易に解釈できるよう設計されています。

インストール

CLIとしてインストール

Climptは主にCLIツールとして使用することを想定しています。公式のDeno/JSR方式でインストールできます:

deno install --allow-read --allow-env --global climpt jsr:@aidevtool/climpt

jsr specifier を使った直接実行

sh から JSRを直接実行する場合は、インストール不要です。
権限に read/env は必要です。write/runは不要です。

exec deno run --allow-read --allow-env --no-config 'jsr:@aidevtool/climpt' --config=build "$@"

使い方

インストールした場合は、climptコマンドを直接使用できます:

climpt --help
climpt init
climpt to project --config=custom

セットアップ

初期設定

Climptは、.agent/climpt/config/default-app.yml を必要とします。
通常は、プロジェクト直下にて climpt init することで生成されます。手動で作成しても構いません。

任意の階層化へインストールすることもできます。例えば tests/ 配下で init することも可能です。
ただし、以下へ示すように、 .deno/bin/* へ複数の実行ファイルを用意するほうが、利便性高く管理できます。

複数インストール設定

プロファイルの切り替えは、--config オプションで行います。
Deno の呼び出し時に、 --config=profilename を付与します。

これにより、以下のような複数インストールを実現します。

まず、.deno/bin 配下に --config 違いの呼び出しを複数用意します。

.deno/bin
├── climpt-arch         # --config=arch
├── climpt-breakdown    # --config=breakdown
├── climpt-build        # --config=build
├── climpt-diagnose     # --config=diagnose
├── climpt-research     # --config=research
├── climpt-setup        # --config=setup
└── climpt-verify       # --config=verify

prefixの climpt- は任意です。他のCLIツールと名称が被らない範囲で、「Claude Codeが自然に使う名称」が好ましいです。コンテキストの中で選定されやすい単語のほうが、適切に実行されやすくなります。

climpt-arch
#!/bin/sh
# Check if help or version is requested
case "$1" in
    -h|--help|-v|--version)
        exec deno run --allow-read --allow-env --no-config 'jsr:@aidevtool/climpt' "$@"
        ;;
    *)
        exec deno run --allow-read  --allow-env 'jsr:@aidevtool/climpt' --config=diagnose "$@"
        ;;
esac

次に、対応する設定を、複数用意します。 *-app.yml の * 部分がプロファイル名です。
プロファイルごとに、受け付けられる引数指定を変えられます。
例えば archclimpt-arch optimize go を実行できるが、climpt-setup optimize go は実行できない状態を作ることが可能です。

.agent/climpt
├── config
│   ├── arch-app.yml
│   ├── arch-user.yml
│   ├── breakdown-app.yml
│   ├── breakdown-user.yml
│   ├── build-app.yml
│   ├── build-user.yml
arch-user.yml
# Breakdown Configuration
params:
  two:
    directiveType:
      pattern: "^(optimize)$"
    layerType:
      pattern: "^(go)$"
setup-user.yml
# Breakdown Configuration
params:
  two:
    directiveType:
      pattern: "^(climpt)$"
    layerType:
      pattern: "^(list)$"

directiveTypelayerType の組み合わせ制御ができないため、増やしすぎないよう留意してください。

最後に、テンプレートプロンプトを用意します。
プロンプトの配置場所は、設定で切り替えられます。そのため、プロファイルごとに保存階層を変更できます。
以下の例では、同じ prompts/ 階層に、プロファイル名で分けて階層化しています。

.agent/climpt
├── prompts
│   ├── arch
│   │   └── optimize
│   │       └── go
│   │           └── f_default.md
│   ├── breakdown
│   │   └── to
│   │       ├── issue
│   │       │   ├── f_default.md
│   │       │   ├── f_detailed.md
│   ├── diagnose
│   │   └── trace
│   │       └── stack
│   │           └── f_test.md
│   ├── setup
│   │   └── climpt
│   │       └── list
│   │           └── f_default.md

運用

よく使うプロンプトファイルを、プロンプト階層へ保存します。
プロジェクトに重要なプロンプトは、Git管理下に置きます。

プロンプトには、置換のためのテンプレート変数を用いることができます。

# エラー対処方針

エラーを種類で分けて、方針を考えます。
その後、エラー種類ごとにファイルを分け、出力先へ保存します。
1つのファイルに記載する行数上限は、{uv-max-line-num} です。

出力先: `{destination_path}`


# エラー内容

`````
{input_text}
`````

上記のテンプレートに対し、以下のコマンドを実行すると、値が置き換わります。

echo "something error" | climpt-diagnose trace stack --input=test -o=./tmp/abc --uv-max-line-num=3
実行結果
# エラー対処方針

エラーを種類で分けて、方針を考えます。
その後、エラー種類ごとにファイルを分け、出力先へ保存します。
1つのファイルに記載する行数上限は、3 です。

出力先: `/*****/.agent/climpt/tmp/abc`


# エラー内容

`````
something error
`````

uv-* は自由に設定できるため、変数定義も必要な数だけ入れられます。

実行可能なコマンド一覧を作成する

運用するなかでプロンプトは増えていきます。変数の組み合わせも、増えると管理ができなくなります。

そこで、一覧表を用意します。

最新の一覧表をメンテナンスするために、以下のプロンプトを用意しました。
これを climpt-setup climpt list で呼び出せるようにしています。

---
title: Climpt combinations
---

# 実施事項

使用可能な Climpt リストを作成する。

## Climpt とは

Deno JSR @https://jsr.io/@aidevtool/climpt である。
CLIでPromptを出力することが目的のツールである。
パラメータで渡した値をもとに、プロンプトテンプレートの変数を置換する。

通常利用時:
```zsh
climpt-* <Directive> <Layer> --*
```

STDIN利用時:
```zsh
echo "something" | climpt-* <Directive> <Layer> --*
```

使用できるプロンプトは、設定ごとにディレクトリが指定されている。
そのため、コマンドおよび設定ファイル、プロンプトファイルの存在を調べると、使用可能なコマンド一覧を作成できる。

実行可能なコマンド: `.deno/bin/climpt-*`
設定: `.agent/climpt/config/*.yml`
プロンプト: `.agent/climpt/prompts/**/f_*.md`

## 手順

1. `.agent/climpt/tools-list.md` を読む
2. 「実行可能なコマンド」を  `.deno/bin/climpt-*` から取得する
3. `.agent/climpt/tools-list.md` の段落に記載する
3-1. すでにあれば記載不要、なければ段落を新説
4. プロンプトディレクトリからファイル一覧を取得する
5. 「プロンプト配置ルール」に従い、段落へコマンドを記載する
6. プロンプトのテンプレート内部を読み、オプションを特定する
6-1. テンプレート内部の {variable} パターンを取得する
6-2. 「オプション一覧」をもとに、利用可能な変数からオプションを判断する
7. コマンドの列に使用可を記載する
8. フロントマターがあれば、説明を添える

## 出力先

`.agent/climpt/tools-list.md`

# プロンプト配置ルール

`.agent/climpt/prompts/<コマンド名>/<Directive>/<Layer>/f_<input>_<adaptation>.md`


# オプション一覧

input_text : STDIN
input_file : --from, -f
destination_path : --destination, -o
uv-* : --uv-*

出力した結果は、以下のようになります。

# How To Use
## options

| option | description |
|--- |---|
-f, --file | ファイルのPATHを出力結果へ記述する(埋め込む)
-i, --input | プロンプトのファイル種類を入力に沿ったものへ切り替える(-fに合わせて選択することが望ましい)
-a, --adaptation | 適合度合いの調整用。プロンプト切り替え。 | 
-o , --destination | 出力ファイル先のPATHを出力結果へ記述する(埋め込む) |

## Usage

`climpt-<cli_name> directive layer --option`

use STDIN for input_text
`cat <some_file> | climpt-<cli_name> directive layer --option`


# Available CLI List
## climpt-research

`climpt-research about src`

|directive| layer | input(-i) | adaptation(-a) | destination(-o) | input_text_file(-f) | input_text (STDIN) |
|--- |---|--- |---|--- |---| ---|
| about | src | src | | | ok | ok |
| to | issue | issue, project, task | | | ok | ok |
| to | project | issue, project, task | | | ok | ok |
| to | task | issue, project, task | strict | | ok | ok |

## climpt-arch

ex. `climpt-arch optimize go -o=docs/development/totality_go.ja.md < docs/development/totality.ja.md`

|directive| layer | input(-i) | adaptation(-a) | destination(-o) | input_text_file(-f) | input_text (STDIN) |
|--- |---|--- |---|--- |---| ---|
| optimize | go | | | ok | | ok |

## climpt-breakdown

`climpt-breakdown to task -i=project`

|directive| layer | input(-i) | adaptation(-a) | destination(-o) | input_text_file(-f) | input_text (STDIN) |
|--- |---|--- |---|--- |---| ---|
| defect | project | project | | | ok | ok |
| defect | task | task | critical | | ok | ok |
| summary | issue | issue | detailed | | ok | ok |
| summary | project | project | | | ok | ok |
| summary | task | task | a, strict | | ok | ok |
| to | issue | issue, project, task | ja, strict | ok | ok | ok |
| to | project | issue, project, task | | | ok | ok |
| to | task | issue, project, task | strict | | ok | ok |

## climpt-diagnose

`make test 2>&1 | tee tmp/output.log && cat tmp/output.log | climpt-diagnose trace stack -i=test`

|directive| layer | input(-i) | adaptation(-a) | destination(-o) | input_text_file(-f) | input_text (STDIN) |
|--- |---|--- |---|--- |---| ---|
| trace | stack | test | | | | ok |

## climpt-setup

`climpt-setup climpt list`

|directive| layer | input(-i) | adaptation(-a) | destination(-o) | input_text_file(-f) | input_text (STDIN) |
|--- |---|--- |---|--- |---| ---|
| climpt | list | | | | | |

## climpt-build

*現在プロンプトファイルが存在しません*

## climpt-verify

*現在プロンプトファイルが存在しません*

Deno 実行ファイルの名称と Coding Agent を合わせる

実行ファイルの差分は、--config=arch 部分の切り替えです。プロファイルを切り替えることで、Claude の Sub Agents にも合わせられます。

.deno/bin
.deno/bin
├── climpt-arch         # sub agents と合う名前にする
├── climpt-build        # --config=build
└── climpt-verify       # --config=verify

Climptは実行時に呼び出しやすい単語にしています。
sub Agents は、実行者を表す名前にしています。

claude code
Project agents (.claude/agents)  
system-architect  #  climpt-arch を選びやすくする
database-specialist  

system-architect のなかで climpt-arch を呼ぶ記載も入れます。

カスタム変数

--uv- をPrefixにした変数を、独自定義できます。
プロンプト中で、例えば最大値指定や、ニュアンスの表現などの差し込みが可能です。

独自変数も、Coding Agent から選ばれやすい単語に統一しておくことが望ましいでしょう。

状況適応

--adaptation により、派生版のテンプレートを呼び出すことができます。
-a=strict を付与すると、ファイルは f_test_strict.md が選ばれます。

diagnose/trace/stack/f_test.md
diagnose/trace/stack/f_test_strict.md

「より厳格に行いたい場合にstrictを指定する」といった指示パターンを、持っておくことができます。

実行例

プロンプト

---
title: エラー診断
usage: 
description: 
---

# エラー対処方針

エラー内容を分析し、共通の種類のエラーを集約し、以下の形式に揃えて出力して。例文は最大 {uv-max-size} 個まで許容。

```
**エラー種類**:
- エラー例1
- エラー例2
```

# 出力先

集約・整形した結果を、下記へ保存する。

出力先: `{destination_path}`

# エラー内容

`````
{input_text_file}
`````

実行コマンド

Go のプロジェクトで make test したあと、エラー解析プロンプトを処理させます。

claude code
次のコマンドは指示書を出力するものである。
実行し、表示された指示に従って。
`make test > tmp/output.log 2>&1 ; climpt-diagnose trace stack -f=tmp/output.log --input=test --destination=tmp/climpted.log --uv-max-size=5`

このコマンド実行がプロンプトを呼び出すため、 make test > tmp/output.log が以下のように処理されます。

集約結果:

tmp/climpted.log
# エラー対処方針

エラー内容を分析し、共通の種類のエラーを集約し、以下の形式に揃えて出力して。例文は最大 5 個まで許容。

**データベース接続エラー**:
- failed to connect to `host=localhost user=*** database=***_**_test`: server error (FATAL: role "***" does not exist (SQLSTATE 28000))
- failed to connect to `host=localhost user=*** database=***`: server error (FATAL: role "***" does not exist (SQLSTATE 28000))
- failed to establish database connection: failed to connect after 3 attempts

**時刻比較エラー**:
- Not equal: expected: time.Date(2025, time.August, 1, 9, 0, 0, 0, time.Local) actual: time.Date(2025, time.August, 1, 9, 0, 0, 0, time.Location(""))

**文字列比較エラー**:
- Not equal: expected: "***-Server/1.0" actual: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"

**数値比較エラー**:
- "0" is not greater than "0"

**レコード未検出エラー**:
- record not found

**テストファイル不在**:
- [no test files]

留意: プロンプトの効力

Climptはプロンプトを表示します。
しかしこれは、ユーザーがインプットしたわけでなく、実行結果がプロンプトになっている状態です。そのため、指示の効力は相対的に弱めです。

一方、入力プロンプトとして送信する仕組みとセットで用いると、入力指示としての強さを持たせられます。例えば claude -p に渡したり、tmuxで別paneへ渡す処理が使えます。

Discussion