patchdrill 0.1.0 → 0.1.2

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 CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.2
4
+
5
+ - Published the package to npm and switched README install/quickstart guidance to `npx --yes patchdrill` and `npm install -g patchdrill` (the `github:` path remains for running unreleased builds from source).
6
+ - Added Korean, Japanese, and Simplified Chinese README translations with a language switcher.
7
+ - Redesigned the HTML dashboard with a cleaner developer-docs aesthetic: refined typography, clearer hairline dividers, and full-width Project Signals and Review Context sections.
8
+ - Regenerated the demo dashboard still and re-recorded the animated demo GIF as a slower, constant-speed scroll that is easier on the eyes.
9
+ - Upgraded npm in the release workflow so OIDC trusted publishing (provenance) authenticates correctly.
10
+
3
11
  ## 0.1.0
4
12
 
5
13
  - Initial CLI with diff scanning, project detection, risk findings, verification planning, optional command execution, Markdown reports, JSON reports, and GitHub workflow generation.
package/README.ja.md ADDED
@@ -0,0 +1,597 @@
1
+ # PatchDrill
2
+
3
+ [English](README.md) · [한국어](README.ko.md) · **日本語** · [中文](README.zh.md)
4
+
5
+ [![CI](https://github.com/seungdori/patchdrill/actions/workflows/ci.yml/badge.svg)](https://github.com/seungdori/patchdrill/actions/workflows/ci.yml)
6
+ ![deterministic](https://img.shields.io/badge/deterministic-yes-2ea44f)
7
+ ![runs offline](https://img.shields.io/badge/runs-offline-2ea44f)
8
+ ![no model call](https://img.shields.io/badge/no%20model%20call-%E2%9C%93-2ea44f)
9
+ ![no telemetry](https://img.shields.io/badge/no%20telemetry-%E2%9C%93-2ea44f)
10
+ ![read-only by default](https://img.shields.io/badge/read--only-by%20default-2ea44f)
11
+ ![license MIT](https://img.shields.io/badge/license-MIT-blue)
12
+
13
+ ## AI レビュアーは LGTM と言い、CI もグリーン。それでもこの PR はマージすべきではありません。
14
+
15
+ PatchDrill は、AI が生成したパッチと人間が書いたパッチのどちらにも使える、**コードレビューと CI のあいだに立つ決定論的な証明レイヤー**です。git の差分を読み取り、マージ前にどんな証跡をそろえておくべきかをはっきり示します。**モデル呼び出しなし、ネットワークなし、毎回まったく同じ答えを返します。**
16
+
17
+ **Linter でも、SAST でも、AI レビュアーでもありません。** これらのツールが決して問わない、たった一つの問いに答えます。すなわち、*この差分に対してマージ前にどんな証跡があるべきで、いま何が欠けているのか?* です。
18
+
19
+ [![リスクの高い AI エージェントの PR に対する PatchDrill Proof Pack — FAIL、リスク 94/100](docs/media/patchdrill-demo.gif)](docs/media/patchdrill-dashboard.png)
20
+
21
+ *ある AI エージェントが作成した PR です。PatchDrill はこれを **FAIL · 94/100** と評価しました。権限付き `pull_request_target` ワークフローのチェックアウト、漏洩したシークレット、無効化されたテストスクリプトを、オフラインで決定論的な一つのコマンドが検出しています。モデル呼び出しはありません。(クリックで完全な静止画レポート(スクリーンショット)を表示。GIF は `vhs demo/patchdrill.tape` で再生成できます。)*
22
+
23
+ **差分の中で検出する内容:**
24
+
25
+ - **漏洩したシークレット** — パッチで追加された `.env` ファイル、秘密鍵、トークン形式の文字列
26
+ - **プロンプトインジェクション** — エージェントが読み込む `AGENTS.md`・Issue テンプレート・ドキュメントに仕込まれた指示
27
+ - **ワークフローの権限昇格** — 広範なトークン書き込み、`pull_request_target`、OIDC 交換、`secrets: inherit`、ピン留めされていないアクション、リモートスクリプトのパイプ
28
+ - **欠けている証跡** — ソースを変更したのにテストは変えていない、必須チェックを計画したのに一度も実行していない
29
+ - **依存関係のドリフト** — マニフェストを変更したのに対応するロックファイルがない(逆に、マニフェストの意図がないロックファイルのドリフトも)
30
+ - **その差分が示唆する検証** — *変更した* パッケージと、約 25 のエコシステムにまたがる下流の依存パッケージに対する実際のコマンド。ルートレベルのデフォルトだけでは終わりません
31
+
32
+ > **AI やエージェントが書いた PR を、差分を一つずつ目視しきれない速さでマージしているチームのために作りました。** 設定も CI の変更も API キーも不要。ローカルで 30 秒です。
33
+ >
34
+ > ```bash
35
+ > npx --yes patchdrill demo --scenario risky-agent-pr
36
+ > ```
37
+
38
+ 出力は、ポータブルな **Proof Pack(証跡パック)** です。Markdown、JSON、SARIF、自己完結型の HTML ダッシュボード、ハッシュで刻印した証跡マニフェストからなり、人間も CI ゲートも監査人もフロンティアモデルも、誰もが検査できます。`--locale ko|ja|zh` で好きな言語で実行できます。
39
+
40
+ ## 30 秒デモ
41
+
42
+ git リポジトリがなくても、リスクの高い AI エージェントの PR シナリオを生成できます。
43
+
44
+ ```bash
45
+ npx --yes patchdrill demo --scenario risky-agent-pr --output patchdrill-risky-demo
46
+ ```
47
+
48
+ 次に、レビュアー向けの成果物を確認します。
49
+
50
+ ```bash
51
+ cat patchdrill-risky-demo/patchdrill-demo-summary.md
52
+ open patchdrill-risky-demo/patchdrill-demo.html
53
+ ```
54
+
55
+ PatchDrill は、権限付きワークフローの境界、シークレットらしき内容、パッケージのライフサイクルスクリプトのリスク、そしてマージ前にレビュアーが求めるべき検証計画を示します。
56
+
57
+ ```bash
58
+ npx --yes patchdrill scan --base origin/main --run \
59
+ --evidence patchdrill-evidence.json \
60
+ --summary-markdown patchdrill-summary.md \
61
+ --markdown patchdrill-report.md \
62
+ --json patchdrill-report.json \
63
+ --sarif patchdrill.sarif \
64
+ --html patchdrill-dashboard.html \
65
+ --fail-on high \
66
+ --max-risk 69
67
+ npx --yes patchdrill verify --evidence patchdrill-evidence.json
68
+ ```
69
+
70
+ ## PatchDrill を選ぶ理由
71
+
72
+ - 別のモデルに最終判断を委ねなくても、AI 時代の PR をレビューできるようにします。
73
+ - パッチごとに Proof Pack を組み立てます。人間向けの Markdown、必須の構造化された検証ステータスを備えたボット向けの JSON、GitHub コードスキャン向けの SARIF、自己完結型の HTML ダッシュボード、コンパクトな PR サマリー、そしてレポート・成果物・コマンド出力のハッシュを含む、後から検証できる監査マニフェストです。
74
+ - まずローカルで、続いて CI で動きます。`scan` はリポジトリを一切変更せず、コマンドは `--run` を指定したときだけ実行します。
75
+ - 回帰がよく潜むレビュー領域にフラグを立てます。認証、課金、マイグレーション、シークレット、CI ワークフローのサプライチェーン、パッケージ自動化スクリプト、インフラ、ロックファイル、大きな差分、プロンプトインジェクションの内容、欠けたテスト変更、そして計画したのに実行されなかった必須チェックです。
76
+ - ルートレベルのデフォルトを流すだけでなく、パッチそのものから実行すべきコマンドを推論します。
77
+ - すでに手元にあるツールと連携します。git、npm、pnpm、yarn、bun、pytest、Django、FastAPI、cargo、Go、Maven、Gradle、Spring Boot、Android Gradle、Ruby、Rails、RSpec、PHP、Composer、Laravel、dotnet、ASP.NET Core、Swift、Xcode、Terraform、Docker、Kubernetes、Helm、Bazel、Buck2 です。
78
+ - `.patchdrill.yml` でポリシー・アズ・コードに対応します。default、regulated、agentic のスターターパックを同梱します。
79
+ - 本格的なオープンソースのセキュリティ姿勢を備えています。CodeQL、OpenSSF Scorecard、Dependabot、厳格なテスト、パッケージの dry-run 検証です。
80
+ - Node、Cargo、Go、Pants のワークスペースに加え、ネストした Python プロジェクト、ネストした Cargo・Go のワークスペース、Turborepo、Nx も理解します。ルートレベルのコマンドを闇雲に流すのではなく、実際に変更したパッケージと、それに依存する下流パッケージを狙い撃ちします。
81
+ - Node/Turborepo、Next.js、Python、uv 管理の Python、Django、FastAPI、Rails、PHP/Composer、Terraform、Docker/Compose、Kubernetes/Helm/Kustomize、Java/Maven/Gradle、Spring Boot Maven/Gradle、Android Gradle、.NET、ASP.NET Core、SwiftPM、Xcode、Bazel、Buck2、Pants、Cargo、Go の各リポジトリ形態向けに、ファーストパーティのスタックフィクスチャを同梱しています。
82
+ - 依存関係のマニフェストとロックファイルの変更を、ただ「ロックファイルが変わった」で済ませません。package.json・go.mod・Cargo.toml・pyproject.toml など十数種類の形式について、何が追加・削除・バージョン更新されたかを具体的に説明します。(全ファイルの一覧は[依存関係のレビュー](#依存関係のレビュー)を参照してください。)
83
+ - マニフェストだけの依存変更や、ロックファイルだけの解決ドリフトといった、依存関係の証跡ギャップにフラグを立てます。
84
+ - 変更したファイルに CODEOWNERS の所有者ヒントを添え、レビュアーが担当チームを把握できるようにします。
85
+ - ローンチ向けのケーススタディ、公開のスタックカバレッジマトリクス、コマンドごとの検証ステータスを同梱し、PatchDrill が実際にどんな証跡を出すのかをチームが見極められるようにします。
86
+
87
+ ## 何をするか
88
+
89
+ PatchDrill は、どんなレビュアーも必ず問う 4 つの質問に答えます。
90
+
91
+ 1. 何が変わったか?
92
+ 2. スタックのどの部分に影響するか?
93
+ 3. このパッチを証明するには何を実行すべきか?
94
+ 4. ドリルを終えた後、どんなリスクが残るか?
95
+
96
+ PatchDrill は、ありがちな AI コードレビュアーではありません。差分が「問題なさそうか」をモデルに尋ねたりはせず、決定論的な証跡を組み立てます。
97
+
98
+ | レイヤー | 主な問い | 決定論的か? | コマンドを実行するか? | 出力 |
99
+ | --- | --- | --- | --- | --- |
100
+ | AI PR レビュアー | この差分は正しそうか? | いいえ | 通常は実行しない | コメント、提案、設計フィードバック |
101
+ | 従来の CI | 設定済みのチェックが通ったか? | はい | はい | ログと合否ステータス |
102
+ | SAST/SCA スキャナー | 既知のセキュリティ・依存関係ルールに一致するか? | はい | 場合による | アラートと脆弱性の検出結果 |
103
+ | レビュー自動化 | 設定したレビュー自動化が発火したか? | はい | 場合による | PR コメントとアノテーション |
104
+ | PatchDrill | この差分にどんな証跡があるべきか? | はい | `--run` 指定時のみ | Proof Pack、リスク検出結果、コマンド計画、ポリシーゲート |
105
+
106
+ この境界は意図的なものです。判断はモデルが得意とし、同じパッチから毎回同じ、レビュー可能な安全性の証跡を出すのは PatchDrill が得意とします。まず PatchDrill を実行し、その Proof Pack を人間のレビュアー、CI ゲート、監査証跡、あるいはフロンティアモデルに渡してください。
107
+
108
+ ## Proof Pack
109
+
110
+ Proof Pack は、パッチごとに生成するポータブルな証跡バンドルです。
111
+
112
+ - PR コメントやステップサマリー向けのコンパクトな Markdown サマリー。
113
+ - 人間がレビューするための完全な Markdown レポート。
114
+ - ボット、ダッシュボード、ポリシーゲート向けの JSON レポート。
115
+ - GitHub コードスキャン向けの SARIF レポート。
116
+ - トレンド履歴も載せられる、自己完結型の HTML ダッシュボード。
117
+ - レポート・成果物・コマンド出力のダイジェストを記録した証跡マニフェスト。
118
+
119
+ マニフェストの検証は [docs/EVIDENCE.md](docs/EVIDENCE.md) を、レビューワークフローでの Proof Pack の使い方は [docs/PROOF_PACKS.md](docs/PROOF_PACKS.md) を参照してください。
120
+
121
+ 境界と、最初に試すべきコマンドは CLI から表示できます。
122
+
123
+ ```bash
124
+ patchdrill explain
125
+ ```
126
+
127
+ サマリーの例:
128
+
129
+ ```text
130
+ PatchDrill Gate PASS - assessment WARN, risk 42/100, confidence 58/100
131
+ Gate policy: fail-on critical, max-risk 69
132
+ Changed files: 4, +121/-18
133
+ Required commands: 3, optional commands: 1
134
+ Verification evidence: 0 run, 0 passed, 0 failed, 0 timed out, 3 missing required, 1 optional skipped
135
+ Added lines inspected: 121
136
+ Top findings:
137
+ - [high] High-impact product area changed (src/auth/session.ts)
138
+ - [medium] Source changed without test changes
139
+ Run with --run to execute required verification commands. Add --run-optional to include optional checks.
140
+ ```
141
+
142
+ ## インストール
143
+
144
+ インストール不要で、すぐに実行できます。[npm](https://www.npmjs.com/package/patchdrill) で公開しています。
145
+
146
+ ```bash
147
+ npx --yes patchdrill scan --base origin/main
148
+ ```
149
+
150
+ あるいはグローバルにインストールします。
151
+
152
+ ```bash
153
+ npm install -g patchdrill
154
+ patchdrill scan --base origin/main
155
+ ```
156
+
157
+ 未リリースの最新ビルドをソースから直接実行するには、`github:` プレフィックスを使います。
158
+
159
+ ```bash
160
+ npx --yes github:seungdori/patchdrill scan --base origin/main
161
+ ```
162
+
163
+ 以下の例では、読みやすさのために `patchdrill` と表記します。
164
+
165
+ ## クイックスタート
166
+
167
+ git リポジトリなしで出力を試せます。
168
+
169
+ ```bash
170
+ patchdrill demo --output patchdrill-demo
171
+ ```
172
+
173
+ エージェントが書いた PR で PatchDrill が何を検出するか、その失敗ケースを試せます。
174
+
175
+ ```bash
176
+ patchdrill demo --scenario risky-agent-pr --output patchdrill-risky-demo
177
+ ```
178
+
179
+ CI を変える前に、PatchDrill がリポジトリから何を推論できるかを確かめます。
180
+
181
+ ```bash
182
+ patchdrill doctor
183
+ ```
184
+
185
+ 自動化のために:
186
+
187
+ ```bash
188
+ patchdrill doctor --format json
189
+ ```
190
+
191
+ 未コミットの作業を解析します。
192
+
193
+ ```bash
194
+ patchdrill scan
195
+ ```
196
+
197
+ ブランチを `main` と比較して解析します。
198
+
199
+ ```bash
200
+ patchdrill scan --base origin/main
201
+ ```
202
+
203
+ 推論した必須コマンドを実行します。
204
+
205
+ ```bash
206
+ patchdrill scan --base origin/main --run
207
+ ```
208
+
209
+ ブラウザ/e2e や静的解析の計画といった任意チェックも含めます。
210
+
211
+ ```bash
212
+ patchdrill scan --base origin/main --run --run-optional
213
+ ```
214
+
215
+ Proof Pack を書き出し、検証します。
216
+
217
+ ```bash
218
+ patchdrill scan --base origin/main --run \
219
+ --evidence patchdrill-evidence.json \
220
+ --summary-markdown patchdrill-summary.md \
221
+ --markdown patchdrill-report.md \
222
+ --json patchdrill-report.json \
223
+ --sarif patchdrill.sarif \
224
+ --html patchdrill-dashboard.html
225
+ patchdrill verify --evidence patchdrill-evidence.json
226
+ ```
227
+
228
+ 保存済みの JSON レポートから静的なダッシュボードを作ります。
229
+
230
+ ```bash
231
+ patchdrill dashboard --json patchdrill-report.json --output patchdrill-dashboard.html
232
+ ```
233
+
234
+ `patchdrill dashboard` はレンダリング前に保存済み JSON レポートの契約を一つずつ検証します。そのため、古かったり不完全だったりするレポートから、見栄えだけ整ったダッシュボードができてしまうことはありません。
235
+
236
+ 証跡マニフェストを、生成元の成果物と突き合わせて検証します。
237
+
238
+ ```bash
239
+ patchdrill verify --evidence patchdrill-evidence.json
240
+ ```
241
+
242
+ このリポジトリが npm/GitHub Action のリリースに耐えるかを確認します。
243
+
244
+ ```bash
245
+ patchdrill release-check
246
+ patchdrill release-check --format json
247
+ ```
248
+
249
+ リリースワークフローは必須の PatchDrill 検証も実行し、ローカルの Proof Pack スモークバンドルを生成して、`npm pack --dry-run` の前にその証跡マニフェストを検証します。
250
+
251
+ 成果物を最終的に後処理した後で、証跡マニフェストを再生成します。
252
+
253
+ ```bash
254
+ patchdrill evidence --json patchdrill-report.json --evidence patchdrill-evidence.json \
255
+ --summary-markdown patchdrill-summary.md \
256
+ --markdown patchdrill-report.md \
257
+ --sarif patchdrill.sarif \
258
+ --html patchdrill-dashboard.html
259
+ ```
260
+
261
+ `patchdrill evidence` は、マニフェストを書き出す前に、必須の構造化された検証ステータスを含め、保存済みの JSON レポート契約をまず検証します。
262
+
263
+ コミット済みのデモ出力は [examples/demo](examples/demo) で確認できます。PR コメントのプレビュー用に `patchdrill-demo-summary.md` も入っています。
264
+
265
+ ローンチ向けのケーススタディは [docs/CASE_STUDIES.md](docs/CASE_STUDIES.md)、フィクスチャに裏付けられたサポートマトリクスは [docs/STACK_COVERAGE.md](docs/STACK_COVERAGE.md) で読めます。
266
+
267
+ 実行トレンドを表示するには、古いものから新しいものの順に JSON レポートを複数並べます。
268
+
269
+ ```bash
270
+ patchdrill dashboard --json previous-report.json --json patchdrill-report.json --output patchdrill-dashboard.html
271
+ ```
272
+
273
+ PR コメント付きで GitHub Action を使います。
274
+
275
+ ```yaml
276
+ - uses: seungdori/patchdrill@v0
277
+ with:
278
+ base: origin/${{ github.base_ref }}
279
+ pr-comment: "true"
280
+ ```
281
+
282
+ Action はデフォルトで GitHub Checks のアノテーションを発行します。[docs/ANNOTATIONS.md](docs/ANNOTATIONS.md) を参照してください。
283
+
284
+ ポリシー・アズ・コードを使います。
285
+
286
+ ```bash
287
+ patchdrill scan --config .patchdrill.yml
288
+ ```
289
+
290
+ エディターやボット向けに JSON スキーマを書き出します。
291
+
292
+ ```bash
293
+ patchdrill schema policy > patchdrill-policy.schema.json
294
+ patchdrill schema report > patchdrill-report.schema.json
295
+ patchdrill schema evidence > patchdrill-evidence.schema.json
296
+ patchdrill schema doctor > patchdrill-doctor.schema.json
297
+ patchdrill schema release-check > patchdrill-release-check.schema.json
298
+ ```
299
+
300
+ 以前のレポートと比較します。
301
+
302
+ ```bash
303
+ patchdrill scan --baseline previous-patchdrill-report.json --max-risk-delta 0 --json patchdrill-report.json
304
+ ```
305
+
306
+ GitHub Actions ワークフローを追加します。
307
+
308
+ ```bash
309
+ patchdrill init
310
+ ```
311
+
312
+ ワークフローとスターターポリシーを追加します。
313
+
314
+ ```bash
315
+ patchdrill init --policy
316
+ ```
317
+
318
+ より厳格なスターターポリシーパックを使います。
319
+
320
+ ```bash
321
+ patchdrill init --policy-pack regulated
322
+ ```
323
+
324
+ ## CLI
325
+
326
+ ```text
327
+ patchdrill scan [options]
328
+ patchdrill dashboard --json <report.json> [--json <report.json>...] [--output <dashboard.html>]
329
+ patchdrill demo [--scenario <name>] [--output <directory>]
330
+ patchdrill doctor [--format text|json]
331
+ patchdrill evidence --json <report.json> --evidence <evidence.json> [artifact options]
332
+ patchdrill init [--force] [--policy] [--policy-pack <name>]
333
+ patchdrill explain
334
+ patchdrill release-check [--format text|json]
335
+ patchdrill schema [policy|report|evidence|doctor|release-check] [--output <path>]
336
+ patchdrill verify --evidence <patchdrill-evidence.json>
337
+ ```
338
+
339
+ オプション:
340
+
341
+ | オプション | 説明 |
342
+ | --- | --- |
343
+ | `--base <ref>` | ベース ref と比較します。例: `origin/main`。 |
344
+ | `--head <ref>` | `--base` 使用時の Head ref。デフォルトは `HEAD`。 |
345
+ | `--config <path>` | `.patchdrill.yml/json` または指定したパスからポリシーを読み込みます。 |
346
+ | `--baseline <path>` | 以前の PatchDrill JSON レポートと比較します。 |
347
+ | `--evidence <path>` | `scan`/`evidence` の実行中に Proof Pack の証跡マニフェストを書き出すか、`verify` 用に一つ選びます。`scan --evidence` は、マニフェストがレポート契約を検証できるよう `--json` が必要です。 |
348
+ | `--run` | 推論した必須の検証コマンドを実行します。 |
349
+ | `--run-optional` | `--run` と併用し、任意の検証コマンドも実行します。 |
350
+ | `--github-annotations` | 検出結果を GitHub Actions のログアノテーションとして発行します。 |
351
+ | `--summary-markdown <path>` | PR コメントやステップサマリー向けのコンパクトな Markdown サマリーを書き出します。 |
352
+ | `--markdown <path>` | Markdown レポートを書き出します。 |
353
+ | `--json <path>` | JSON レポートを書き出します。 |
354
+ | `--sarif <path>` | GitHub コードスキャン向けの SARIF レポートを書き出します。 |
355
+ | `--html <path>` | 自己完結型の静的 HTML ダッシュボードを書き出します。 |
356
+ | `--fail-on <level>` | 検出結果が次の重大度に達したら失敗します: `info`、`low`、`medium`、`high`、`critical`。 |
357
+ | `--max-risk <score>` | リスクスコアが 0〜100 のしきい値を超えたら失敗します。デフォルトは `69`。 |
358
+ | `--max-risk-delta <score>` | ベースラインからのリスク増加が 0〜100 のしきい値を超えたら失敗します。`--baseline` が必要です。 |
359
+ | `--max-output-chars <n>` | 各コマンド出力ストリームの末尾 `n` 文字を残します。デフォルトは `20000`。 |
360
+ | `--command-timeout-ms <n>` | 各検証コマンドを `n` ミリ秒で打ち切ります。 |
361
+ | `--quiet` | 終了コードだけを使います。 |
362
+ | `--locale <lang>` | 人間向けレポート(markdown、サマリー、HTML、コンソール)の言語: `en`、`ko`、`ja`、`zh`。デフォルトはシステムロケール(`LC_ALL`/`LANG`)、なければ英語です。JSON と SARIF は英語のままです。 |
363
+ | `--policy` | `patchdrill init` と併用したとき `.patchdrill.yml` を作成します。 |
364
+ | `--policy-pack <name>` | `patchdrill init` 用のスターターポリシーパック: `default`、`regulated`、`agentic`。 |
365
+ | `--scenario <name>` | `patchdrill demo` 用のデモシナリオ: `review-ready`、`risky-agent-pr`。 |
366
+ | `--format <format>` | `doctor` と `release-check` の出力形式: `text`、`json`。 |
367
+ | `--list` | `patchdrill schema` と併用したとき、使えるスキーマを一覧表示します。 |
368
+ | `--output <path>` | スキーマ/ダッシュボードファイル、またはデモ成果物ディレクトリを書き出します。 |
369
+
370
+ ブール型フラグは、`--run=false`、`--quiet=true`、`--github-annotations=off` のように明示的な値も受け付けます。
371
+
372
+ ## サポートするシグナル
373
+
374
+ PatchDrill はリポジトリのマニフェストからプロジェクトの形態を見分けます。
375
+
376
+ | エコシステム | シグナル | 典型的なコマンド |
377
+ | --- | --- | --- |
378
+ | Node | `package.json`、ロックファイル、スクリプト | `npm run typecheck`、`npm run check:types`、`npm run lint`、`npm run test`、`npm run test:unit`、`npm run build`、任意で `npm run test:e2e` |
379
+ | Python | `pyproject.toml`、`uv.lock`、`requirements.txt`、`setup.py`、`manage.py`、ネストされた Python パッケージルート、`FastAPI()`、FastAPI のルーター/依存性、Ruff/mypy/Pyright の設定 | `uv run pytest tests/test_module.py`、`cd packages/api && uv run pytest`、`python -m pytest`、`python manage.py test`、`python -m compileall .`、任意で `uv run ruff check .`、任意で `uv run mypy .`、任意で `uv run pyright`、FastAPI アプリと変更モジュールのインポートのスモーク |
380
+ | Rust | `Cargo.toml`、ルートおよびネストされた Cargo ワークスペース | `cargo test --all-targets`、`cargo test -p crate --all-targets`、`cargo test --manifest-path packages/wasm/Cargo.toml -p crate --all-targets`、`cargo clippy -p crate --all-targets -- -D warnings` |
381
+ | Go | `go.mod`、`go.work`、ネストされた Go モジュールおよびワークスペースルート | `go test ./...`、`cd services/api && go test ./...`、`go test ./module/...`、`cd services/go && go test ./module/...`、`go vet ./module/...` |
382
+ | Java/Kotlin | `pom.xml`、`build.gradle`、ラッパー | `mvn test`、`gradle test`、`./gradlew test`、`./gradlew bootJar` |
383
+ | Android | `com.android.application`、`com.android.library`、`AndroidManifest.xml`、ビルドタイプ、プロダクトフレーバー、`variantFilter`、バリアントのソースセット、生成されたソースのパス | `./gradlew testDebugUnitTest`、`./gradlew testReleaseUnitTest`、`./gradlew testFreeDebugUnitTest`、`./gradlew testMinApi24DemoDebugUnitTest`、`./gradlew assemble<Variant>`、`./gradlew lint<Variant>` |
384
+ | Ruby/Rails | `Gemfile`、`Gemfile.lock`、`config/application.rb`、RSpec メタデータ | `bin/rails test`、`bundle exec rails test`、`bundle exec rspec`、`bundle exec rake test` |
385
+ | PHP/Laravel | `composer.json`、`composer.lock`、`artisan`、`phpunit.xml` | `composer validate --strict`、`composer test`、`php artisan test`、`vendor/bin/phpunit`、PHP 構文 lint のフォールバック |
386
+ | .NET | `global.json`、`.slnf`、`.sln`、`.csproj`、`ProjectReference` | `dotnet test App.slnf`、`dotnet test tests/Api.Tests/Api.Tests.csproj`、`dotnet build src/Api/Api.csproj --no-restore`、`dotnet publish src/Api/Api.csproj --no-restore` |
387
+ | Swift | `Package.swift`、`Package.resolved`、`*.swift` | `swift test`、`swift build` |
388
+ | Xcode | `.xcworkspace`、`.xcodeproj`、共有 `.xcscheme`、`.xctestplan`、Apple アプリのソース/リソース、スキームのターゲットプラットフォーム | `xcodebuild -workspace App.xcworkspace -scheme App -testPlan AppTests test`、`xcodebuild -project App.xcodeproj -scheme App -destination generic/platform=iOS build`、`xcodebuild -project App.xcodeproj -scheme App -showdestinations` |
389
+ | Terraform | `*.tf`、`*.tfvars` | `terraform fmt -check && terraform validate` |
390
+ | Docker | `Dockerfile`、Compose ファイル | `docker build .`、`docker compose -f compose.yaml config` |
391
+ | Kubernetes | `Chart.yaml`、`kustomization.yaml`、`k8s/`、`kubernetes/`、`manifests/` | `helm lint .`、`kubectl kustomize .`、`kubectl apply --dry-run=client -f k8s` |
392
+ | Bazel | `MODULE.bazel`、`WORKSPACE`、`BUILD.bazel`、`.bazelrc` | `bazel test //path/...`、`bazel build //path/...`、`bazel query 'rdeps(//..., set(//path/...))'`、任意で下流の `tests(rdeps(...))` への昇格、ルートメタデータにはグラフ全体へのフォールバック |
393
+ | Buck2 | `.buckconfig`、`BUCK`、`BUCK.v2` | `buck2 test //path/...`、`buck2 build //path/...`、`buck2 uquery 'rdeps(//..., set(//path/...))'`、任意で下流の `testsof(rdeps(...))` への昇格、ルートメタデータにはグラフ全体へのフォールバック |
394
+ | Pants | `pants.toml` | `pants --changed-since=HEAD --changed-dependents=transitive test` |
395
+ | GitHub Actions | `.github/workflows/*` | ワークフロー差分のレビュー |
396
+
397
+ Node ワークスペースでは、PatchDrill が `package.json` の workspaces と `pnpm-workspace.yaml` を検出し、直接変更したパッケージと下流の依存パッケージに対して `pnpm --filter @acme/api run test` や `npm --workspace @acme/api run build` といったパッケージスコープのコマンドを発行します。`turbo.json` や `nx.json` があれば、`pnpm exec turbo run test --filter=@acme/api` や `npx nx run api:test` のようなネイティブのタスクランナーコマンドを計画します。[docs/MONOREPOS.md](docs/MONOREPOS.md) を参照してください。
398
+
399
+ ネストした Python プロジェクトでは、検出した `pyproject.toml`、`uv.lock`、`requirements.txt`、`manage.py` の各パッケージルートを、それぞれ独立した検証スコープとして扱います。そのためモノレポでも、すべての Python 変更を誤ってルートコマンドにまとめず、`cd packages/pine-engine && uv run pytest` を計画できます。
400
+
401
+ Cargo ワークスペースでは、JavaScript やポリグロットのモノレポルートの下にネストしたものも含め、`[workspace].members`、crate 名、ワークスペース内部の依存関係を読み取ります。そして変更した crate と下流の依存 crate に対して `cargo test -p crate --all-targets` や `cargo test --manifest-path packages/wasm/Cargo.toml -p crate --all-targets`、さらに任意で clippy 計画を発行します。
402
+
403
+ ネストした Go モジュールと Go ワークスペースでは、検出した `go.mod` または `go.work` の各ルートを、それぞれ独立した検証スコープとして扱います。Go ワークスペースなら `go.work` の `use` エントリ、モジュール名、ワークスペース内部の `require` 依存関係を読み取り、変更したモジュールと下流の依存モジュールに対して `go test ./module/...` や `cd services/go && go test ./module/...`、さらに任意で `go vet` 計画を発行します。
404
+
405
+ Pants リポジトリでは、`--changed-since` と `--changed-dependents=transitive` を用いた Pants ネイティブの Git 対応な変更ターゲット選択を使います。これにより、言語をまたいだターゲットグラフの展開は Pants が引き続き受け持ちます。
406
+
407
+ ## リスクモデル
408
+
409
+ PatchDrill はパッチを 0 から 100 で採点します。高いほどリスクが大きいということです。
410
+
411
+ 現在の決定論的なルールが探すのは、次のものです。
412
+
413
+ - レビューと検証の証跡を必要とする、変更されたファイル。
414
+ - `.env` や秘密鍵など、シークレットを含むファイル。
415
+ - 差分の中に追加された、秘密鍵や一般的なトークン形式といったシークレットらしき値。
416
+ - `AGENTS.md`、Issue テンプレート、Markdown ドキュメントなど、エージェントが目にするファイルに加えられたプロンプトインジェクションの指示。
417
+ - 影響度の高いパス: 認証、課金、セッション、マイグレーション、セキュリティ、暗号、権限。
418
+ - インフラとリリースの挙動: Docker、Terraform、Kubernetes、GitHub Actions。
419
+ - ワークフローのサプライチェーンリスク: 広範なトークン書き込み、`pull_request_target`、継承されたシークレット、ローカルの再利用可能ワークフローから可変なリモート再利用可能ワークフローへのファンアウト、継承されたシークレットや呼び出し元の OIDC 権限を受け取る可変な再利用可能ワークフロー、環境スコープの OIDC デプロイジョブ、環境保護のないクラウド OIDC 認証情報の交換、ピン留めされていないアクション、可変な `docker://` アクションイメージ、リモートスクリプトのパイプ、信頼できない PR メタデータの埋め込み、権限付き PR-head チェックアウトの組み合わせ。
420
+ - パッケージ自動化スクリプトのリスク: install/prepare/pack/publish のライフサイクルスクリプト、削除されたり no-op コマンドに置き換えられたりした検証スクリプト、リモートダウンロードをインタープリターにパイプするパッケージスクリプト。
421
+ - 依存関係のマニフェストとロックファイルの変更。
422
+ - package.json、pyproject.toml、requirements.txt、NuGet の PackageReference および集中管理の PackageVersion ファイル、Maven の pom.xml、Gradle のビルドファイルおよびバージョンカタログ、Gemfile、composer.json、go.mod、Cargo.toml、npm の package-lock、pnpm-lock、yarn.lock、bun.lock、go.sum、Cargo.lock、poetry.lock、uv.lock、Pipfile.lock、Gemfile.lock、composer.lock における依存関係の追加・削除・更新。
423
+ - 依存関係の証跡ギャップ: 対応するロックファイルの証跡を伴わない直接的な依存マニフェストの変更、および対応するマニフェストの依存意図を伴わないロックファイルの解決変更。
424
+ - レガシーバイナリ `bun.lockb` の変更(テキスト形式の `bun.lock` への移行を促すガイダンス付き)。
425
+ - 近接・ミラー・フレームワーク規約のいずれかに一致するテスト変更を伴わないソース変更。
426
+ - 大きな行差分とバイナリファイル。
427
+ - 推論または設定されたものの実行されなかった必須の検証コマンド。
428
+ - 失敗した検証コマンド。
429
+ - `.patchdrill.yml` のカスタムポリシールール。
430
+
431
+ リスクモデルは、あえて説明可能にしてあります。スコアが上がる理由は、すべてレポート内の検出結果として表れます。
432
+
433
+ 組み込みのルール ID と各ルールの意味は [docs/RULE_CATALOG.md](docs/RULE_CATALOG.md) を参照してください。
434
+
435
+ ## ポリシー・アズ・コード
436
+
437
+ PatchDrill はリポジトリのルートにある `.patchdrill.yml`、`.patchdrill.yaml`、`.patchdrill.json` を読み込みます。
438
+
439
+ ```yaml
440
+ failOn: high
441
+ maxRisk: 69
442
+
443
+ ignoredPaths:
444
+ - generated/**
445
+
446
+ requiredCommands:
447
+ - id: contract-tests
448
+ command: npm run test:contracts
449
+ reason: API surfaces changed.
450
+
451
+ rules:
452
+ - id: payments-owner-review
453
+ title: Payments owner review required
454
+ severity: critical
455
+ path: src/payments/**
456
+ ```
457
+
458
+ [docs/POLICY.md](docs/POLICY.md) を参照してください。
459
+
460
+ ## GitHub Actions
461
+
462
+ ワークフローを生成します。
463
+
464
+ ```bash
465
+ patchdrill init
466
+ ```
467
+
468
+ あるいは手動で追加します。
469
+
470
+ ```yaml
471
+ name: PatchDrill
472
+
473
+ on:
474
+ pull_request:
475
+
476
+ permissions:
477
+ contents: read
478
+ pull-requests: write
479
+ security-events: write
480
+
481
+ jobs:
482
+ patchdrill:
483
+ runs-on: ubuntu-latest
484
+ steps:
485
+ - uses: actions/checkout@v6
486
+ with:
487
+ fetch-depth: 0
488
+ - uses: seungdori/patchdrill@v0
489
+ id: patchdrill
490
+ with:
491
+ base: origin/${{ github.base_ref }}
492
+ evidence: patchdrill-evidence.json
493
+ summary: patchdrill-summary.md
494
+ markdown: patchdrill-report.md
495
+ json: patchdrill-report.json
496
+ sarif: patchdrill.sarif
497
+ html: patchdrill-dashboard.html
498
+ fail-on: high
499
+ max-risk: "69"
500
+ run: "true"
501
+ command-timeout-ms: "600000"
502
+ annotations: "true"
503
+ step-summary: "true"
504
+ pr-comment: "true"
505
+ # Optional: newline-separated previous JSON reports downloaded from earlier artifacts.
506
+ # dashboard-history: |
507
+ # reports/patchdrill-previous.json
508
+ - uses: github/codeql-action/upload-sarif@v4
509
+ if: always()
510
+ with:
511
+ sarif_file: ${{ steps.patchdrill.outputs.report-sarif }}
512
+ - uses: actions/upload-artifact@v7
513
+ if: always()
514
+ with:
515
+ name: patchdrill-report
516
+ path: |
517
+ ${{ steps.patchdrill.outputs.report-evidence }}
518
+ ${{ steps.patchdrill.outputs.report-markdown }}
519
+ ${{ steps.patchdrill.outputs.report-summary }}
520
+ ${{ steps.patchdrill.outputs.report-json }}
521
+ ${{ steps.patchdrill.outputs.report-html }}
522
+ ${{ steps.patchdrill.outputs.report-sarif }}
523
+ ```
524
+
525
+ Action のブール型入力は、明示的な値を受け付けます: `"true"`、`"false"`、`"1"`、`"0"`、`"yes"`、`"no"`、`"on"`、`"off"`。実行とアノテーションのトグルは同じ CLI のブールパーサーを通すので、`run: "false"` がリポジトリのコマンドを実行することは決してありません。
526
+
527
+ ## レポートの例
528
+
529
+ [examples/report.md](examples/report.md) を参照してください。
530
+ Proof Pack のレビューワークフローについては [docs/PROOF_PACKS.md](docs/PROOF_PACKS.md) を参照してください。
531
+ コードスキャンの統合については [docs/SARIF.md](docs/SARIF.md) を参照してください。
532
+ リポジトリのセキュリティ姿勢については [docs/SECURITY_POSTURE.md](docs/SECURITY_POSTURE.md) を参照してください。
533
+ プルリクエストのコメントについては [docs/PR_COMMENTS.md](docs/PR_COMMENTS.md) を参照してください。
534
+ 静的 HTML ダッシュボードについては [docs/DASHBOARD.md](docs/DASHBOARD.md) を参照してください。
535
+ 証跡マニフェストの検証については [docs/EVIDENCE.md](docs/EVIDENCE.md) を参照してください。
536
+ 機械可読なスキーマについては [docs/SCHEMAS.md](docs/SCHEMAS.md) を参照してください。
537
+ 所有者ヒントについては [docs/CODEOWNERS.md](docs/CODEOWNERS.md) を参照してください。
538
+ リスクデルタについては [docs/BASELINES.md](docs/BASELINES.md) を参照してください。
539
+ 組み込みのリスクルールについては [docs/RULE_CATALOG.md](docs/RULE_CATALOG.md) を参照してください。
540
+
541
+ ## リリースのプロベナンス
542
+
543
+ PatchDrill には、npm の信頼された公開とプロベナンスのためのリリースワークフローが付属します。npm でパッケージを信頼された公開者として設定し、GitHub Release から公開してください。[docs/RELEASE.md](docs/RELEASE.md) を参照してください。
544
+
545
+ 公開前に、次を実行します。
546
+
547
+ ```bash
548
+ patchdrill release-check
549
+ ```
550
+
551
+ ## 依存関係のレビュー
552
+
553
+ PatchDrill は、変更された `package.json`、`pyproject.toml`、`requirements.txt`、NuGet の `PackageReference` / `PackageVersion` マニフェスト、Maven の `pom.xml`、Gradle の `build.gradle` / `build.gradle.kts` / `libs.versions.toml`、`Gemfile`、`composer.json`、`go.mod`、`Cargo.toml`、npm の `package-lock.json`、`pnpm-lock.yaml`、`yarn.lock`、`bun.lock`、`go.sum`、`Cargo.lock`、`poetry.lock`、`uv.lock`、`Pipfile.lock`、`Gemfile.lock`、`composer.lock` から依存関係の変更を要約します。パッケージ、依存関係セクションまたはロックファイルのパス、変更種別、変更前のバージョン、変更後のバージョンを、Markdown と JSON のレポートに一覧表示します。対応するロックファイルの証跡を伴わない直接的なマニフェスト変更や、マニフェストの意図を伴わないロックファイルだけの解決ドリフトといった、依存関係の証跡ギャップにもフラグを立てます。レビュアーに見える形で依存関係の意図を明示し、より重量級の SCA ツールを補完します。
554
+
555
+ ## パッケージスクリプトのレビュー
556
+
557
+ PatchDrill は、`package.json` のスクリプトの追加・削除・更新も Markdown、JSON、HTML のレポートに要約します。リスク検出結果は、install/prepare/pack/publish のライフサイクルフック、no-op の検証スクリプト、削除された test/lint/build スクリプト、リモートダウンロードをインタープリターにパイプするパッケージスクリプトを指摘します。
558
+
559
+ ## 設計原則
560
+
561
+ - まず決定論的であること。有用な答えを得るのにモデル呼び出しは要りません。検出結果、リスクスコア、コマンド計画は、同じ差分なら再現できます。意図的に可変なのはレポートの `generatedAt` タイムスタンプだけで、これも `SOURCE_DATE_EPOCH` を尊重します。だからキャッシュ、スナップショット、再現可能な監査のために、レポートをバイト単位で同一にできます。
562
+ - 感覚頼みより Proof Pack。レビュアーは、正確なコマンド、検出結果、成果物、ダイジェストを見られるべきです。
563
+ - デフォルトでローカル。ソースコードは手元のチェックアウトから出ません。
564
+ - 保守的な採点。PatchDrill は、リスクのあるパッチを黙って承認するくらいなら、証跡を求めます。
565
+ - 後から拡張できる。ルールエンジンは、コントリビューターがエコシステムやポリシーを追加できる程度に小さく保っています。
566
+ - 信頼できる配布。CI がビルド、テスト、SARIF 生成、npm パッケージの内容を検証します。
567
+
568
+ ## ロードマップ
569
+
570
+ - 一般的なオープンソーススタックに対する、より広いファーストパーティのフィクスチャカバレッジ。
571
+ - Turborepo、Nx、Pants、Cargo、Go、Bazel、Buck の各ワークスペースにとどまらない、より多くのネイティブな影響タスク統合。
572
+ - 推論した検証コマンドをインタラクティブに採否できるローカル TUI。
573
+ - 決定論的な検出結果を決して置き換えない、任意の LLM サマリーモード。
574
+
575
+ ## FAQ
576
+
577
+ **これは AI ツールですか?** いいえ。PatchDrill は **モデル呼び出しをゼロ回** しか行わず、API キーも要らず、完全にオフラインで動きます。同じ差分を入力すれば、バイト単位で同一の Proof Pack が返ります(`SOURCE_DATE_EPOCH` を尊重します)。いまや AI がコードを書く *からこそ* 存在する決定論的なレイヤーであって、AI を一つ増やすものではありません。
578
+
579
+ **結局のところ Linter や SAST では?** いいえ。Linter は固定されたルールでコードをチェックし、SAST は既知の脆弱性パターンに一致させます。PatchDrill は、*この特定の差分* がどんな検証を意味するかを推論し、*あるべきなのに* ない証跡を報告します。計画したのに一度も実行されなかった必須チェックも含みます。そのギャップを追える Linter も SAST もありません。
580
+
581
+ **結局また CI ゲートを一つ増やすのでは?** その必要はありません。設定なしで(`npx --yes patchdrill demo`)、ローカルで 30 秒で実行できます。差分に対して、既存のレビューと CI がそれぞれ何をカバーすべきかを示すツールです。`scan` はリポジトリを一切変更せず、コマンドは `--run` 指定時だけ実行します。
582
+
583
+ **勝手に外部と通信しませんか?** ネットワーク呼び出しも、テレメトリも、アカウントもありません。ソースが手元のチェックアウトから外に出ることはありません。
584
+
585
+ **この新しいプロジェクトを、なぜ信頼できるのですか?** メンテナーもスター数も信頼する必要はありません。どの Proof Pack も再実行すればバイト単位で同一の出力が得られ、すべての成果物のハッシュを自分の手で検証できます。CI は、約 25 のスタック形態のファーストパーティフィクスチャに対してツールを証明します。
586
+
587
+ ## コントリビューション
588
+
589
+ [CONTRIBUTING.md](CONTRIBUTING.md) をお読みください。最初のコントリビューションには、新しいエコシステム検出器、リスクルール、実世界のレポートフィクスチャが向いています。
590
+
591
+ ## セキュリティ
592
+
593
+ PatchDrill は、`--run` を渡したときだけコマンドを実行します。推論した必須コマンドをリポジトリのシェルで実行し、任意コマンドには `--run` と `--run-optional` の両方が必要です。必須チェックを計画したのに実行しなかった場合、PatchDrill は黙ってパッチを証明済み扱いせず、検証の証跡が欠けていると報告します。Markdown、コンパクトなサマリー、HTML ダッシュボード、コンソール出力は、計画した各コマンドに passed、failed、timed out、not run、skipped optional のいずれかのラベルを付けます。`patchdrill init` が書き出す CI ワークフローには `run: "true"` とコマンドごとのタイムアウトが入っているので、プルリクエストはデフォルトでコマンドの証跡を残します。信頼できないリポジトリをスキャンするときは、まず検証計画を確認してください。[SECURITY.md](SECURITY.md) を参照してください。
594
+
595
+ ## ライセンス
596
+
597
+ MIT