kanzaki 0.2.0
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/README.md +310 -0
- package/dist/bin.js +1106 -0
- package/dist/bin.js.map +1 -0
- package/package.json +42 -0
- package/templates/rules.md +21 -0
package/README.md
ADDED
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
# Kanzaki
|
|
2
|
+
|
|
3
|
+
ステージされた変更を、Markdownで書いたチェックリストに照らしてLLMがレビューするCLIツールです。
|
|
4
|
+
|
|
5
|
+
## 概要
|
|
6
|
+
|
|
7
|
+
`kanzaki check` を実行すると、`git diff --staged` の内容を `.kanzaki/rules.md` に書かれたルールと照合し、LLM(OpenAIまたはAnthropic)に判定させます。違反が見つかった場合、重要度に応じてコミットをブロックするか警告を出します。
|
|
8
|
+
|
|
9
|
+
チェック対象はコードに限りません。ドキュメント、リサーチノート、設定ファイルなど、テキストベースの差分であれば利用できます。ルールは自然言語で記述するため、フォーマッターや構文チェッカーでは検出できない「意味的な問題」を拾うことを目的としています。
|
|
10
|
+
|
|
11
|
+
ただし、LLMの判定は100%正確ではありません。誤判定を前提に、重要度を使い分けて運用することを推奨します。
|
|
12
|
+
|
|
13
|
+
## しくみ
|
|
14
|
+
|
|
15
|
+
`kanzaki check` は次の手順で動作します。
|
|
16
|
+
|
|
17
|
+
1. **ステージの確認** — `git diff --staged --name-only` で変更ファイルを取得します。変更がなければ終了します。
|
|
18
|
+
2. **認証情報のロード** — CLIフラグ → 環境変数 → `~/.config/kanzaki/credentials.json` の優先順位で解決します。
|
|
19
|
+
3. **ルール解析** — `.kanzaki/rules.md` から次の3要素を抽出します。
|
|
20
|
+
- `- [ ]` で始まる行 → ルール(重要度とテキスト)
|
|
21
|
+
- `## ヘッダー (*.ts)` の形式 → グループ名とファイルスコープ
|
|
22
|
+
- それ以外のテキスト → LLMに渡す補足コンテキスト
|
|
23
|
+
4. **フォーマット検証** — ルールファイルの書式エラー(空ルール、重複、閉じ括弧忘れなど)を検出します。エラーが1件でもあればLLMを呼ばずに `exit(1)` で中断します。詳細は [ルールファイルのフォーマットチェック](#ルールファイルのフォーマットチェック) を参照してください。
|
|
24
|
+
5. **Git情報の取得** — `git diff --staged` の出力と、変更ファイルの全文(バイナリや100KB超は除外)を取得します。
|
|
25
|
+
6. **ルールのフィルタリング** — 変更ファイルにマッチしないスコープのルールを除外します。ここで適用対象ルールが0件になった場合は警告を出して `exit(0)` します。
|
|
26
|
+
7. **プロンプト構築** — コンテキスト、ルール一覧、diff(最大50KB)、ファイル全文(各最大20KB)を1つのプロンプトにまとめます。
|
|
27
|
+
8. **LLM呼び出し** — OpenAIはJSON mode、AnthropicはテキストレスポンスからJSONを抽出します。各ルールについて `{ rule, passed, reason }` が返されます。
|
|
28
|
+
9. **結果出力** — `!error` ルールが1件でも失敗した場合は `exit(1)` でコミットをブロックします。`!warn` のみの失敗なら警告を表示して `exit(0)` します。
|
|
29
|
+
10. **フィードバック書き出し(任意)** — `--emit-feedback` 指定時、違反があれば `.kanzaki/reviews/<タイムスタンプ>.md` にコーディングエージェント向けの指示ファイルを出力します。詳細は [エージェント向けフィードバック出力](#エージェント向けフィードバック出力) を参照してください。
|
|
30
|
+
|
|
31
|
+
pre-commitフック(Husky等)で実行することを想定していますが、CI/CDや手動実行でも同じように使えます。
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## インストール
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm install -g kanzaki
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Node.js 18以上が必要です。
|
|
42
|
+
|
|
43
|
+
## セットアップ
|
|
44
|
+
|
|
45
|
+
### 1. 認証
|
|
46
|
+
|
|
47
|
+
認証方式は4種類あります。いずれの場合も認証方法の指定が必須です。
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# APIキーを対話入力(入力は ****** でマスク表示)
|
|
51
|
+
kanzaki login --provider openai # OpenAIのAPIキー
|
|
52
|
+
kanzaki login --provider anthropic # AnthropicのAPIキー
|
|
53
|
+
|
|
54
|
+
# ChatGPT Plus/ProサブスクリプションでOAuthログイン
|
|
55
|
+
kanzaki login --use-chatgpt
|
|
56
|
+
|
|
57
|
+
# ローカルのClaude Code CLIをサブプロセスとして利用
|
|
58
|
+
kanzaki login --use-claude
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
引数なしで `kanzaki login` を実行すると、上記の選択肢を案内するエラーメッセージが表示されます。
|
|
62
|
+
|
|
63
|
+
認証情報は `~/.config/kanzaki/credentials.json` に保存されます。一度ログインすれば全プロジェクトで使えます。
|
|
64
|
+
|
|
65
|
+
#### `--use-chatgpt` について
|
|
66
|
+
|
|
67
|
+
OpenAI公式の Codex CLI と同じOAuthフロー(Authorization Code + PKCE)でChatGPTサブスクリプションに紐づくトークンを取得し、`https://chatgpt.com/backend-api/codex/responses` に対してレビューリクエストを送ります。ChatGPT Plus/Proの利用上限が適用されます。
|
|
68
|
+
|
|
69
|
+
#### `--use-claude` について
|
|
70
|
+
|
|
71
|
+
ローカルにインストールされた `claude` コマンドをサブプロセスとして起動する方式です。Claude Code CLI が既にログイン済みである必要があります。kanzakiは `claude -p` にプロンプトをstdin経由で渡し、標準出力をJSONとして解釈します。認証・セッション管理はすべてClaude CLI側が担当します。
|
|
72
|
+
|
|
73
|
+
### 2. プロジェクトの初期化
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
cd your-project
|
|
77
|
+
npx kanzaki init
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
`.kanzaki/rules.md` のテンプレートが作成されます。
|
|
81
|
+
|
|
82
|
+
### 3. Gitフックへの組み込み(任意)
|
|
83
|
+
|
|
84
|
+
コミット時に自動実行したい場合は、Husky等で `kanzaki check` を pre-commit フックに登録します。
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
npm install --save-dev husky
|
|
88
|
+
npx husky init
|
|
89
|
+
echo "npx kanzaki check" > .husky/pre-commit
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
手動実行やCI/CDでの利用も可能です。
|
|
93
|
+
|
|
94
|
+
### 4. ルールのカスタマイズ
|
|
95
|
+
|
|
96
|
+
`.kanzaki/rules.md` をプロジェクトに合わせて編集します(詳細は後述)。
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## ルールの書き方
|
|
101
|
+
|
|
102
|
+
`.kanzaki/rules.md` はMarkdownのチェックリスト形式です。
|
|
103
|
+
|
|
104
|
+
### 基本構文
|
|
105
|
+
|
|
106
|
+
```markdown
|
|
107
|
+
# プロジェクトのレビュールール
|
|
108
|
+
|
|
109
|
+
## グループ名
|
|
110
|
+
- [ ] ルールの内容(デフォルトで !error 扱い)
|
|
111
|
+
- [ ] !error 明示的にエラーとして定義
|
|
112
|
+
- [ ] !warn 警告のみ(コミットはブロックしない)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 重要度
|
|
116
|
+
|
|
117
|
+
| 記法 | 動作 |
|
|
118
|
+
|------|------|
|
|
119
|
+
| `!error`(デフォルト) | 違反時に `exit(1)` でコミットをブロック |
|
|
120
|
+
| `!warn` | 警告表示のみ、コミットは続行 |
|
|
121
|
+
|
|
122
|
+
### 補足コンテキスト
|
|
123
|
+
|
|
124
|
+
チェックリスト以外のテキスト(段落など)はLLMへの補足情報として送信されます。プロジェクトの前提や背景をここに書くことで、判定の精度が変わることがあります。
|
|
125
|
+
|
|
126
|
+
```markdown
|
|
127
|
+
# レビュールール
|
|
128
|
+
|
|
129
|
+
このプロジェクトは医療機器の規制文書を管理しています。
|
|
130
|
+
すべての変更は FDA 21 CFR Part 11 に準拠する必要があります。
|
|
131
|
+
|
|
132
|
+
## コンプライアンス
|
|
133
|
+
- [ ] !error 規制要件への参照が正確であること
|
|
134
|
+
- [ ] !error 変更履歴が適切に記録されていること
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### ファイルスコープ
|
|
138
|
+
|
|
139
|
+
ヘッダー名に続けて括弧で glob パターンを書くと、そのグループのルールは該当ファイルに変更があった場合のみ適用されます。
|
|
140
|
+
|
|
141
|
+
```markdown
|
|
142
|
+
## ドキュメント (*.md, *.txt)
|
|
143
|
+
- [ ] !error リンク切れがないこと
|
|
144
|
+
- [ ] !warn 見出しの階層構造が正しいこと
|
|
145
|
+
|
|
146
|
+
## コード (*.ts, *.js)
|
|
147
|
+
- [ ] !error console.log が本番コードに残っていないこと
|
|
148
|
+
- [ ] !error ハードコードされた秘密情報がないこと
|
|
149
|
+
|
|
150
|
+
## 全ファイル
|
|
151
|
+
- [ ] !warn TODO コメントが残っていないこと
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
パターン未指定のグループは全ファイルに適用されます。
|
|
155
|
+
|
|
156
|
+
### ルール例
|
|
157
|
+
|
|
158
|
+
<details>
|
|
159
|
+
<summary>リサーチ・論文</summary>
|
|
160
|
+
|
|
161
|
+
```markdown
|
|
162
|
+
# リサーチレビュールール
|
|
163
|
+
|
|
164
|
+
再生可能エネルギーに関する調査レポート。
|
|
165
|
+
データに基づいた客観的な分析が求められる。
|
|
166
|
+
|
|
167
|
+
## 正確性
|
|
168
|
+
- [ ] !error 統計データには出典が明記されていること
|
|
169
|
+
- [ ] !error 事実誤認や誤解を招く主張がないこと
|
|
170
|
+
- [ ] !warn 数値の単位が明確に記載されていること
|
|
171
|
+
|
|
172
|
+
## 構成
|
|
173
|
+
- [ ] !error 各セクションに適切な見出しがあること
|
|
174
|
+
- [ ] !warn 論理的な流れが維持されていること
|
|
175
|
+
|
|
176
|
+
## 文体
|
|
177
|
+
- [ ] !warn 用語が文書全体で統一されていること
|
|
178
|
+
- [ ] !warn 受動態の過剰使用を避けていること
|
|
179
|
+
```
|
|
180
|
+
</details>
|
|
181
|
+
|
|
182
|
+
<details>
|
|
183
|
+
<summary>ソフトウェア開発</summary>
|
|
184
|
+
|
|
185
|
+
```markdown
|
|
186
|
+
# コードレビュールール
|
|
187
|
+
|
|
188
|
+
Next.js + TypeScript のフルスタックアプリケーション。
|
|
189
|
+
REST API は全エンドポイントに認証が必要。
|
|
190
|
+
|
|
191
|
+
## セキュリティ (*.ts, *.js)
|
|
192
|
+
- [ ] !error ハードコードされたAPIキー・パスワードがないこと
|
|
193
|
+
- [ ] !error 新しいAPIルートに認証ミドルウェアが適用されていること
|
|
194
|
+
- [ ] !error ユーザー入力のバリデーションがあること
|
|
195
|
+
|
|
196
|
+
## コード品質 (*.ts, *.js)
|
|
197
|
+
- [ ] !error console.log がプロダクションコードに残っていないこと
|
|
198
|
+
- [ ] !error 適切なエラーハンドリングがあること
|
|
199
|
+
- [ ] !warn 変数名・関数名が説明的であること
|
|
200
|
+
|
|
201
|
+
## ドキュメント (*.md)
|
|
202
|
+
- [ ] !warn API変更に伴うドキュメント更新が含まれていること
|
|
203
|
+
```
|
|
204
|
+
</details>
|
|
205
|
+
|
|
206
|
+
<details>
|
|
207
|
+
<summary>プレゼン・レポート</summary>
|
|
208
|
+
|
|
209
|
+
```markdown
|
|
210
|
+
# プレゼンレビュールール
|
|
211
|
+
|
|
212
|
+
Q4 決算報告プレゼンテーション。
|
|
213
|
+
経営陣向け、データドリブンな内容が求められる。
|
|
214
|
+
|
|
215
|
+
## 内容
|
|
216
|
+
- [ ] !error すべてのグラフ・チャートにデータソースが記載されていること
|
|
217
|
+
- [ ] !error 前四半期との比較データが含まれていること
|
|
218
|
+
- [ ] !warn 結論がデータに基づいていること
|
|
219
|
+
|
|
220
|
+
## スタイル
|
|
221
|
+
- [ ] !warn 箇条書きが簡潔であること
|
|
222
|
+
- [ ] !warn フォーマットが全スライドで統一されていること
|
|
223
|
+
```
|
|
224
|
+
</details>
|
|
225
|
+
|
|
226
|
+
### ルールファイルのフォーマットチェック
|
|
227
|
+
|
|
228
|
+
`kanzaki check` はLLMにプロンプトを送る前に、ルールファイルの書式を検証します。以下のいずれかが検出された場合、LLMを呼び出さずに `exit(1)` で中断します。
|
|
229
|
+
|
|
230
|
+
| 検出内容 | 例 |
|
|
231
|
+
|---------|----|
|
|
232
|
+
| ヘッダーの括弧不一致 | `## Security (*.ts` (閉じ括弧なし) |
|
|
233
|
+
| 空の括弧 | `## Foo ()` |
|
|
234
|
+
| 空のチェックリスト項目 | `- [ ]` (本文なし) |
|
|
235
|
+
| severityタグのみで本文なし | `- [ ] !warn` |
|
|
236
|
+
| 不正なseverityタグ | `- [ ] !err foo` (`!error` / `!warn` のみ有効) |
|
|
237
|
+
| 不正なチェックボックス形式 | `* [ ] foo` や `- [x] foo` |
|
|
238
|
+
| 同一グループ内の重複ルール | 同じグループに同一のルールテキストが2回以上 |
|
|
239
|
+
|
|
240
|
+
エラーは行番号とともに表示され、コミット前に気づけるようになっています。
|
|
241
|
+
|
|
242
|
+
また、次の2つのケースはエラーではなく警告として扱われ、LLMを呼ばずに `exit(0)` で終了します。
|
|
243
|
+
|
|
244
|
+
- ルールファイルに有効なルールが1件もない場合
|
|
245
|
+
- 変更ファイルにマッチするルールが1件もない場合(ファイルスコープでフィルタされた結果)
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## エージェント向けフィードバック出力
|
|
250
|
+
|
|
251
|
+
`kanzaki check --emit-feedback`(または `-o`)を指定すると、違反内容をまとめたMarkdownを `.kanzaki/reviews/<タイムスタンプ>.md` に書き出します。Claude Code や Cursor などのコーディングエージェントに「このファイルを読んで修正してください」と渡す用途を想定しています。
|
|
252
|
+
|
|
253
|
+
ファイルには次の内容が含まれます。
|
|
254
|
+
|
|
255
|
+
- ヘッダー(生成日時、エラー数・警告数、変更ファイル一覧)
|
|
256
|
+
- エージェントへの指示文(違反を修正し、`git add` の上で再度 `kanzaki check` を実行する旨)
|
|
257
|
+
- 違反ごとのセクション(重要度タグ、ルールテキスト、グループ、適用スコープ、rules.mdの行番号、LLMが示した違反理由)
|
|
258
|
+
|
|
259
|
+
違反が0件のときはファイルを作成しません。`.kanzaki/reviews/` は `kanzaki init` が生成する `.kanzaki/.gitignore` によってGit管理対象外になります。
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## コマンド一覧
|
|
264
|
+
|
|
265
|
+
| コマンド | 説明 |
|
|
266
|
+
|---------|------|
|
|
267
|
+
| `kanzaki init` | `.kanzaki/rules.md` テンプレートを作成 |
|
|
268
|
+
| `kanzaki check` | ステージ済みの変更をレビュー |
|
|
269
|
+
| `kanzaki login` | 認証情報を保存 |
|
|
270
|
+
| `kanzaki logout` | 保存済み認証情報を削除 |
|
|
271
|
+
| `kanzaki status` | 現在の認証状態を表示 |
|
|
272
|
+
|
|
273
|
+
### `kanzaki login` のオプション
|
|
274
|
+
|
|
275
|
+
| オプション | 説明 |
|
|
276
|
+
|-----------|------|
|
|
277
|
+
| `-p, --provider <名前>` | `openai` または `anthropic`(デフォルト: `openai`) |
|
|
278
|
+
| `--use-chatgpt` | OpenAIのOAuthフロー(ChatGPT Plus/Pro) |
|
|
279
|
+
| `--use-claude` | ローカルのClaude CLIをサブプロセスとして利用 |
|
|
280
|
+
|
|
281
|
+
### `kanzaki check` のオプション
|
|
282
|
+
|
|
283
|
+
| オプション | 説明 |
|
|
284
|
+
|-----------|------|
|
|
285
|
+
| `-p, --provider <名前>` | LLMプロバイダー(`openai` / `anthropic`) |
|
|
286
|
+
| `-m, --model <名前>` | 使用モデル |
|
|
287
|
+
| `-r, --rules <パス>` | ルールファイルのパス(デフォルト: `.kanzaki/rules.md`) |
|
|
288
|
+
| `--api-key <キー>` | APIキーを直接指定(`kanzaki login` の利用を推奨) |
|
|
289
|
+
| `--no-block` | エラーでも `exit(1)` せず、警告のみ |
|
|
290
|
+
| `-o, --emit-feedback` | 違反をまとめたmarkdownを `.kanzaki/reviews/` に書き出す(エージェント向け) |
|
|
291
|
+
| `-v, --verbose` | 詳細出力 |
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## 環境変数
|
|
296
|
+
|
|
297
|
+
| 変数 | 説明 | デフォルト |
|
|
298
|
+
|------|------|-----------|
|
|
299
|
+
| `KANZAKI_API_KEY` | LLM APIキー | — |
|
|
300
|
+
| `KANZAKI_PROVIDER` | `openai` / `anthropic` | `openai` |
|
|
301
|
+
| `KANZAKI_MODEL` | モデル名 | `gpt-5.4`(OpenAI)/ `claude-sonnet-4-20250514`(Anthropic) |
|
|
302
|
+
| `KANZAKI_RULES_PATH` | ルールファイルのパス | `.kanzaki/rules.md` |
|
|
303
|
+
|
|
304
|
+
プロジェクトルートに `.env` があれば自動で読み込まれます。
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## ライセンス
|
|
309
|
+
|
|
310
|
+
MIT
|