# pi-purge

[English](README.md) | [中文](README.zh-CN.md) | 日本語

システムプロンプトの実験のための [pi](https://github.com/earendil-works/pi-coding-agent) 拡張機能です。`/purge` は、セッションで使用するシステムプロンプトを切り替えます — pi の標準プロンプト、それを削ったバリアント、またはペルソナプロンプトのみ。

プロンプトエンジニアリング作業を目的としています：ハーネスのプロンプトがある場合・削った場合・ない場合で同じリクエストの挙動がどう変わるかを比較したり、自分の指示のリグレッションテストを行ったり、制御された条件下で指示追従性やプロンプトインジェクションへの耐性を研究したりするためのものです。

オフの状態では何も変わりません — プロンプトの書き換えも、ディスクの読み込みもありません。pi は拡張機能がインストールされていないのとまったく同じように動作します。

## インストール

```bash
pi install git:github.com/ZiChuanLan/pi-purge@ffafeb9
pi install npm:pi-purge
```

その後、セッション内で次を実行します：

```text
/purge
```

これだけです。短いサンプルプロンプトがパッケージに同梱されているため、インストール直後でも追加のファイルなしで動作します。代わりに自分の指示を使うには：

```text
/purge source C:/prompts/my-instructions.md
/purge mode replace
/purge on
```

`/purge source embedded` で同梱のペルソナに戻ります。

## コマンド

| コマンド | 効果 |
| --- | --- |
| `/purge` | このセッションでオン/オフを切り替えます |
| `/purge on` / `off` | 書き換えを有効化または無効化します |
| `/purge status` | モード、プロンプトのソース、読み込んだサイズ、および直前のターンで実際に何が変更されたかを表示します |
| `/purge mode append\|replace\|strict` | 合成モードを切り替えます（デフォルトは `strict`） |
| `/purge source <path\|embedded>` | プロンプトファイルを変更するか、同梱のサンプルに戻します。切り替えに失敗した場合はロールバックされます |
| `/purge reload` | 編集後に外部プロンプトファイルを再読み込みします |

## モード

| モード | モデルに送信されるシステムプロンプト | 使うべき場面 |
| --- | --- | --- |
| `append` | あなたのプロンプトを、pi のプロンプトの前にそのまま追加します。 | 対照実験をしたい場合：ベースラインの挙動に自分の指示を上乗せしたもの。 |
| `replace` | あなたのプロンプトの後に、組み込みのアシスタントの自己定義の行と同梱ドキュメントのセクションを取り除いた pi のプロンプトが続きます。ツール一覧、ガイドライン、プロジェクトのコンテキストは残ります。 | ツールのコンテキストを失わずに、ハーネスによる枠付けの効果を測定したい場合。 |
| `strict` | あなたのプロンプトと `Current working directory: …` のみ。 | 自分の指示を単一の変数として切り分けたい場合。これがデフォルトです。 |

`replace` は、両方のセクションを完全一致の文言で検出します。pi のアップデートで文言が変わった場合は、誤ったテキストを削るのではなくプロンプトをそのまま残します — その場合 `/purge status` は `身份段 未匹配`（自己定義の行が見つからない）と報告し、挙動は `append` にフォールバックします。`strict` は一切マッチングを行わないため、pi のバージョンにかかわらず同じように動作します。pi 固有のこれらのアンカーを持たないプロンプトブロック配列を渡す omp では、`replace` もホスト側プロンプトをそのまま残します — ハーネスの枠組みを消したい場合は `strict` を使ってください。

ツールのスキーマはシステムプロンプトではなく API の `tools` パラメータで渡されるため、`strict` を含むすべてのモードでツールは引き続き動作します。

## セッションのスコープとデフォルト

- スコープはセッションです。すべての `session_start` — 起動、`new`、`resume`、`reload` — は**無効**の状態で始まります。pi を終了すれば、必ず標準の挙動に戻ります。
- ディスクには何も書き込まれません：状態ファイルも、キャッシュも、マーカーもありません。2 つの pi プロセスが互いに影響し合うことはありません。
- デフォルトのプロンプトは、`extensions/pi-purge.ts` に同梱された短いサンプルです。`/purge source <path>` で自分のファイルを指定し、`/purge source embedded` で戻ります。
- 状態を一切書き込まずに、すべてのプロセスを自分のファイルで開始するには、`PI_PURGE_SOURCE` に絶対パスを設定します：

    ```bash
    PI_PURGE_SOURCE=/home/me/persona.md pi          # macOS / Linux
    set PI_PURGE_SOURCE=C:/prompts/persona.md        # Windows cmd
    $env:PI_PURGE_SOURCE='C:/prompts/persona.md'     # Windows PowerShell
    ```

    これは `source` の初期値を与えるだけです：`/purge on` は引き続き必要で、`enabled` はすべての `session_start` で `false` から始まり、セッション内の `/purge source <path>` がこれを上書きします。ファイルが存在しない場合、`/purge on` は同梱のサンプルに黙ってフォールバックするのではなく、エラーを報告します。
- 同梱のテキストは意図的に最小限にしています。公開されるパッケージは不正なプロンプト内容がないかスキャンされるため、完全なカスタムペルソナは公開時に残りません。自分のプロンプトはディスク上に置き、`/purge source` で参照してください。
- デフォルトのモードは `strict` です。

## 0.1.x からのアップグレード

0.2 では `pi-purge.json` の書き込みも読み込みも行わなくなり、プロンプトファイルの自動検出も行わなくなりました — ペルソナは同梱され、モードのデフォルトは `strict` です。

- `<agent dir>/pi-purge.json` を削除してください。今後は無視されます。
- 有効化はセッションごとです：再起動または `/resume` の後は、もう一度 `/purge` を実行してください。
- `append` と `replace` は、必要であれば以前と変わらず使えます。

## 実験に関する注意

- `strict` は、`AGENTS.md` / プロジェクトのコンテキスト、スキル一覧、他の拡張機能が注入したプロンプトテキストも取り除きます。これによりクリーンな単一変数の設定になりますが、同時に `strict` での結果は通常のセッションとは比較できなくなります。
- `append` は最も影響の小さいモードで、通常は最も弱いシグナルになります：ハーネスのプロンプトの後半のセクションが依然として大きな重みを持つため、差は小さくなることがあります。
- `replace` でもハーネスのテキストは残り、この拡張機能の処理後に他の拡張機能が独自のプロンプトセクションを追加することがあります。実際には、ペルソナが他の枠付けと競合しない唯一のモードは `strict` です。
- 拡張機能の読み込み順は、`before_agent_start` が受け取る内容に影響します。保存する結果には、`/purge status` の出力も一緒に記録することをおすすめします。

## 開発

```bash
npm test   # two suites; both run against temporary agent dirs and assert nothing is written
```

この拡張機能は、`before_agent_start` フック 1 つ、`session_start` フック 1 つ、および `/purge` コマンドを登録します。他のフックも、バックグラウンド処理も、ファイルの書き込みもありません。

## クレジット

この仕組みは [YuJunZhiXue/dsh-purge](https://github.com/YuJunZhiXue/dsh-purge) から移植したものです：ハーネスの自己定義の行をかき消すのではなく**取り除く**というアイデア、3 つの合成モード、そして同梱のプロンプトはすべてそのプロジェクトに由来します。作者の要求に従い、ここにクレジットとリンクを記載しています。

## 法令遵守に関する通知

**非営利、学習および研究目的に限ります。** 本ソフトウェアの使用方法については、利用者が全責任を負います。いかなる違法な目的にも使用してはなりません。

**ゼロトレランス。** 作者は、不正なネットワーク攻撃、脆弱性の悪用、データの窃取、情報システムへの侵入、または違法なコンテンツの生成を支持、奨励、支援しません。そのような使用は作者とは無関係であり、それを行った者が単独で全法的責任を負います。

**違法なコンテンツは含まれません。** コード、ドキュメント、同梱のプロンプトは、マルウェア、バックドア、無許可のペネトレーションツール、ランサムウェア、クレデンシャルスタッフィング用スクリプト、または公共・第三者のシステムを狙った攻撃ペイロードではありません。

**自身の pi でのローカル使用に限ります。** プロンプトの置き換えは、利用者自身のマシン上にある公式の pi インストール（`@earendil-works/pi-coding-agent`、ローカルのエージェントディレクトリおよびプロファイル）の内部で完結します。対象はあなた自身のローカルソフトウェアであり、他者のウェブサイト、サーバー、アカウント、または情報システムではありません。

**外部へのネットワーク通信はありません。** この拡張機能は、ローカルプロセス内のシステムプロンプトを書き換えるだけです。ネットワーク接続は一切開かず、公開ホストや無許可のシステムに対してスキャン、探査、侵入、攻撃トラフィックの送信を行いません。外部ネットワークへの踏み台として使用しないでください。

**許可された管理下の範囲に限ります。** これは、あなたが管理権限を持つ公式の pi インストール上で、プロンプトエンジニアリングと堅牢性評価を行うための補助ツールです。書面による許可のない対象、公開されたオンラインシステム、または本番環境に対して実行しないでください。すべてのテストは、許可を得た自身のローカル pi、オフラインの合成フィクスチャ、許可された演習環境、および規則に準拠したラボ環境の範囲内にとどめる必要があります。

**中国本土、香港、マカオは対象外です。** 中国本土、香港、マカオのネットワーク、およびそれらの範囲に解決されるサーバー、サイト、アドレスに対して、アクセス、スキャン、探査、その他の操作を行わないでください。クラウドプロバイダー名を挙げても例外にはなりません。唯一の例外は、利用者が自身のサーバーとして事前に登録した単一の正確な IP アドレス、または単一の完全修飾ホスト名のみです。鍵、パスワード、CIDR ブロック、ワイルドカード、会話中の口頭での申告によって例外が加わることはありません。未登録のものは例外なく禁止です。

**禁止される用途。** 利用者は、本プロジェクトを直接的または間接的に使用して以下のいずれにも違反してはならず、例外なくそれぞれを遵守しなければなりません：

- 中華人民共和国刑法
- 中華人民共和国サイバーセキュリティ法
- 中華人民共和国データセキュリティ法
- 中華人民共和国個人情報保護法
- その他の適用されるすべての法律、行政法規、および規制要件

また、以下も禁止されます：公共または私的な情報システムに対する無許可のペネトレーションや攻撃、恐喝、破壊、クレデンシャルスタッフィング、マルウェアの配布。国家の安全を脅かす、テロリズムや過激な暴力を助長する、わいせつまたは賭博に関わる、詐欺的である、またはプライバシーや知的財産を侵害するコンテンツの作成や拡散。そして、いずれかのモデルプロバイダーの利用規約や不正利用ポリシーへの違反。

**利用者がすべての責任を負います。** 本プロジェクトは MIT License の下で「現状のまま」提供され、完全性、安全性、または特定目的への適合性について、明示または黙示を問わずいかなる保証もありません。本ソフトウェアのダウンロード、デプロイ、実行、改変、配布、およびその結果として生じるすべての入力と出力について、利用者が単独で民事上、行政上、刑事上のすべての責任を負います。作者および貢献者は、誤用から生じる直接的、間接的、または派生的な責任を一切負いません。

**違反時にはライセンスが終了します。** 本プロジェクトを違法な攻撃、悪意のある活動、その他の違反行為に使用した個人または団体は、違反した日をもって、そのオープンソースライセンスが自動的かつ取消不能な形で終了します。当該者は直ちに本プロジェクトの使用を中止し、そのコード、スクリプト、派生データのすべてのコピーを完全に破棄し、適用される法的責任を負わなければなりません。

**第三者からの独立性。** これは完全に独立したオープンソースのセキュリティ研究プロジェクトです。pi またはその関連団体との提携、商業的パートナーシップ、許可、または公式な承認は一切ありません。「公式」という言葉は、評価対象が利用者のマシンにインストールされた公式の pi パッケージであることのみを指しており、pi がこの拡張機能を開発、承認、または保証していることを意味するものではありません。

**帰属表示が必要です。** 本プロジェクトの名前、手法、コード、またはプロンプトを再利用する者は、作者のクレジットを記載し、このリポジトリへのリンクを付けなければなりません。帰属表示を怠った場合は法的措置がとられます。

## ライセンス

MIT

---

[LINUX DO](https://linux.do) コミュニティに感謝します
