petari
v0.8.0
Published
petari — paste AI chat patches onto your codebase
Readme
petari
petari — paste AI chat patches onto your codebase petari — AIチャットの返答を、コードベースにぺたり。
チャットベース AI (M365 Copilot Chat 等) の返答を、ローカルのコードベースへ安全に一括適用する CLI ツールです。
AI に規約形式の変更指示ファイル (changes.md) を出力させ、petari がパース・検証して適用します。
レビューは Git の未コミット差分として VS Code で行い、適用の履歴 (before/after/指示原本) は
.petari/history/ に自動保存されます。
インストール
pnpm add -g petari # または npx petari使い方
petari init # プロジェクト初回セットアップ (protocol.md / 設定 / repomix 連携 / .gitignore)
repomix # 規約文入りのコンテキストを生成して AI チャットに渡す
# → AI から changes.md をダウンロード
petari # Downloads の changes.md を自動検出して適用
git diff # VS Code で差分レビュー・手修正
petari undo # 直近の適用を巻き戻すslnmix 連携 (レガシー VB.NET プロジェクト)
slnmix v0.7.0 以降は、入力 (.sln / .vbproj) と
同じディレクトリにある protocol.md を出力末尾に自動で連結します (repomix の
instructionFilePath 相当。別の場所に置く場合は --instruction-file <path>)。
npx petari init # protocol.md を生成 (.sln と同じプロジェクト直下に)
npx slnmix # .sln を解析。出力末尾に規約文が自動で付く
# → 出力を M365 Copilot Chat に貼る
petari # 返答 (changes.md) を適用変更を依頼するメッセージには、必ず次の 1 行を添えてください。 貼り付け本文に埋め込まれた規約文は、チャットサービス側の要約・検索処理で モデルに届かなかったり、チャット本文の指示より弱く扱われたりすることがあります (埋め込みだけで確実に認識させる方法はありません)。
変更は、貼り付けた内容の末尾にある規約 (instruction) に従って changes.md として出力してください。
petari の更新で規約文が変わった場合は、petari init を再実行すると protocol.md の
差分を検出して更新を提案します (slnmix 側の更新は不要)。
適用が繰り返し失敗するとき
失敗レポート (自動でクリップボードにコピーされます) をそのまま AI に貼り返すのが 最短です。レポートには実ファイルの該当箇所の抜粋と、どの行がどう違うかの診断が 含まれるため、AI は推測ではなくコピーで SEARCH を直せます。
それでも同じ箇所が失敗を繰り返す場合は、AI に渡したスナップショット (repomix / slnmix の出力) が実ファイルとずれている可能性が高いです。特にチャットサービスは 長い添付を要約・検索処理で部分的にしか読まないことがあり、AI が見えなかった箇所を もっともらしく補って出力することがあります。SEARCH の空白調整や言い換えを繰り返す より、スナップショットを取り直して渡し直すのが確実です (petari 側は空白・インデント・ 空行の位置や数・文字コードの差を吸収して照合するため、それらが原因で失敗することは ありません)。
コマンド
| コマンド | 説明 |
|---|---|
| petari [path] | changes.md を適用。省略時は Downloads とプロジェクト直下から自動検出 (直近 30 分)。--clip でクリップボードから |
| petari undo [ID] | 履歴を巻き戻す (手修正がある場合は警告) |
| petari show [ID] | 履歴の差分を表示 (VS Code、なければブラウザにフォールバック)。--edit で現在のファイルを差分を見ながら手修正、--mine で適用後の手修正分、--changes で変更概要、--browser でブラウザ強制 |
| petari list | 履歴の一覧と合計サイズ |
| petari protocol | AI への規約文を標準出力に出す (slnmix / repomix 連携用) |
| petari init | プロジェクト初回セットアップ (--yes で全提案に同意) |
主なオプション: --dry-run (検証と差分プレビューのみ) / --partial (成功分のみ適用) /
--root <dir> / --yes / --clip-report (失敗レポートをクリップボードへ。v0.5.0 から既定で自動コピーされるため、config で無効化した場合の個別指定用)
特徴
- all-or-nothing: 全ブロックを事前検証し、1 つでも失敗があれば何も書き込まない
- 冪等 (再実行に安全): SEARCH が見つからなくても REPLACE の内容が既にファイルに
存在すれば「適用済み」として成功扱いでスキップ。同じ changes.md を 2 回実行しても
失敗せず、適用済み・未適用が混在していても未適用分だけを適用する。
結果は
適用 / 済み / 失敗の 3 状態で表示 - エンコーディング保全: Shift_JIS / UTF-8 (BOM 有無)・CRLF / LF・末尾改行を完全維持。 変更していない行は元のバイト列をそのまま書き戻す (レガシー VB.NET 資産でも安全)
- 規約逸脱への耐性 (寛容パース): AI がマーカーの記号数・見出しレベルを崩したり 出力全体をコードフェンスで包んでも、厳密パース失敗時に限り安全な範囲で自動補正して 解釈する (補正内容は適用前に全件表示。曖昧さが残る場合は採用せずエラーに戻す)
- 失敗レポート: そのまま AI チャットに貼り返せる形式で出力し、既定でクリップボードへ
自動コピー (失敗した時点で貼り返し 1 ペーストの状態。config の
clipReportOnFailure: falseで無効化可)。構文エラー時のレポートには規約フォーマットの 要点を同梱 (チャット側で規約文が失われていてもレポート 1 枚で再出力を依頼できる) - git / VS Code がない端末でも差分確認・手修正:
showは VS Code がなければ自己完結 HTML レポートをブラウザで開き、show --editは同梱の Monaco Editor (VS Code と同じ 差分エディタ) で現在のファイルを差分を見ながら直接編集・保存できる (もちろんエンコーディング保全つき) - 実行時依存ゼロ: サプライチェーン対策として npm の実行時依存パッケージを持たない (Shift_JIS 変換テーブルも Node 組み込み ICU から自動生成して同梱)。 唯一の同梱サードパーティはブラウザ編集 UI の Monaco Editor (Microsoft 製・MIT) で、 固定バージョンをビルド時にパッケージへ同梱し、実行時のダウンロードは行わない
セキュリティ設計
社内利用の審査 (情報システム部門のレビュー等) を想定した要点です。
通信・依存関係
- 外部へのネットワーク通信は一切行いません。AI との通信機能はなく、入力はローカルファイル
またはクリップボードのみ。テレメトリ・自動更新もありません。
例外は
show --editのブラウザ編集時のみで、127.0.0.1 (ループバック) の一時ポートで 待ち受けます — 128bit 乱数トークン付き URL・Host/Origin 検証・無操作 30 分で自動終了。 実行できるスクリプトは CSP で「同梱した Monaco Editor (script-src 'self') と 自前ブートストラップ (応答ごとの nonce)」に限定し、閲覧レポート等は JS 実行不可。 Monaco 資産の配信は起動時に列挙した同梱ファイルの許可リストへの完全一致のみです。 外部への送信・CDN・外部リソースの読み込みは一切発生しません - 実行時依存パッケージはゼロです。npm のインストールスクリプト (postinstall 等) も 使用しません。Shift_JIS 変換テーブルは Node.js 組み込みの ICU から生成しリポジトリに 同梱しています (外部データの取り込みなし)
- 同梱サードパーティは monaco-editor (Microsoft, MIT) の 1 件のみ。開発時に固定 バージョンを取得し (7 日未満の新規公開バージョンは取得しないポリシー)、ビルド時に パッケージへ同梱します。ライセンス・ThirdPartyNotices も同梱し、実行時に外部から コードを取得することはありません
- 子プロセスの起動はすべて
execFile/spawnの配列引数で行い、シェルを経由しません (コマンドインジェクション不成立)。起動するのはgit/reg/powershell/pbcopy・pbpaste/ VS Code (code) / 既定ブラウザ起動 (open/xdg-open/ PowerShellStart-Process) のみです
入力の取り扱い (信頼境界)
changes.md (AI 出力)・クリップボード・リポジトリに同梱され得る .petari/ 内のファイルは
すべて非信頼入力として扱います。
- 書き込み先パスはプロジェクトルート相対のみ。絶対パス・UNC・ドライブレター・
..・~・:(NTFS 代替データストリーム)・Windows 予約デバイス名 (CON/NUL/COM1 等、末尾ドット・ 空白による偽装を含む) を拒否します - シンボリックリンク自体の書き換えに加え、symlink ディレクトリ経由でルート外へ出るパスも realpath 検証で拒否します
- パス検証は apply だけでなく undo / show (履歴 manifest 由来のパス) にも適用します
- 端末出力は制御文字 (ANSI エスケープ・双方向制御文字 = Trojan Source) を除去してから 表示します (表示偽装対策)
- 差分ビューアのコマンド (
vscodeCommand設定) は PATH 上のコマンド名か絶対パスのみ許可し、 リポジトリ内スクリプトを指せる相対パスと UNC パスを拒否します - ブラウザ編集 (
show --edit) の保存は、トークン検証に加えて保存先パスの再検証・ シンボリックリンク拒否・SHA-256 楽観ロック (ページを開いた後の外部変更を検出し 409) を 通します。編集対象はサーバー起動時に確定し、ブラウザ側からパスは指定できません。 保存も §8 のエンコーディング保全 (無変更行は元バイト維持) を通ります
適用の安全弁と監査性
- 全変更を事前検証してから書き込む all-or-nothing (1 件でも失敗すれば何も書かない)。
--dry-runで書き込みなしの事前確認が可能 - すべての適用は
.petari/history/に 適用前後のファイル・指示原本・SHA-256 付き manifest として記録され、petari undoで巻き戻せます (監査証跡) - Git 作業ツリーに未コミット変更がある場合は警告し、適用前に確認を求めます
既知の検知可能性・残リスク
- Windows でクリップボード機能 (
--clip/--clip-report) を使うとnode.exe → powershell.exe (Get-Clipboard / Set-Clipboard)の親子プロセスが発生し、 EDR がログ・アラート対象にする可能性があります (ユーザー起点の単発実行です。 PowerShell が制限された環境ではクリップボード機能のみ失敗し、ファイル入力は動作します) - 検証と書き込みの間の TOCTOU (ファイル差し替え) は検出しません (単独利用の CLI として許容)
- 履歴には対象ファイルの複製が平文で保存されます。
.petari/は.gitignore推奨 (init が自動提案) で、リポジトリには含まれません - ブラウザ表示用の差分レポート (HTML) はコードの中身を平文で含み、本人のみ読める
一時ディレクトリ (0700) に書き出されます。1 時間より古いものは次回の
show実行時に 自動削除されます (閲覧中かもしれない直近分は残す)
開発
pnpm install
pnpm typecheck # tsc --noEmit
pnpm test # vitest
pnpm build # dist/ へビルド設計方針・規約は CLAUDE.md、仕様の正本は requirements.md を参照。
License
MIT
