Files
hakorune/docs/reference/plugin-system/plugin-tester.md

154 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Nyash Plugin Tester - 開発者向けツールガイド
概要
- 目的: Nyash用プラグインBID-FFI準拠の基本健全性を素早く診断するツール。
- 実装場所: `tools/plugin-tester`
- 想定対象: C ABIで `nyash_plugin_*` をエクスポートする動的ライブラリ(.so/.dll/.dylib
ビルド
- コマンド: `cd tools/plugin-tester && cargo build --release`
- 実行ファイル: `tools/plugin-tester/target/release/plugin-tester`
サブコマンド
- `check <plugin>`: プラグインのロード、ABI確認、init呼び出し、型名・メソッド一覧の表示
- `lifecycle <plugin>`: birth→fini の往復テストインスタンスIDを返すことを確認
- `io <plugin>`: FileBox向けE2Eopen→write→close→open→readテスト
- **`safety-check`**: 【Phase 15.5新機能】ChatGPT推奨の4つの安全性チェック機能
使用例
- チェック:
- `tools/plugin-tester/target/release/plugin-tester check plugins/nyash-filebox-plugin/target/release/libnyash_filebox_plugin.so`
- 期待出力例:
- `ABI version: 1`
- `Plugin initialized`
- `Box Type: FileBox (ID: 6)` と 6メソッドbirth/open/read/write/close/finiの列挙
- ライフサイクル:
- `tools/plugin-tester/target/release/plugin-tester lifecycle <path-to-plugin>`
- 期待出力例: `birth → instance_id=1`, `fini → instance 1 cleaned`
- ファイルI/O:
- `tools/plugin-tester/target/release/plugin-tester io <path-to-plugin>`
- 期待出力例: `open(w)`, `write 25 bytes`, `open(r)`, `read 25 bytes → 'Hello from plugin-tester!'`
## 【Phase 15.5新機能】Safety Check - ChatGPT推奨安全性チェック
### 概要
**ChatGPT5 Pro最高評価⭐⭐⭐⭐⭐**の安全性チェック機能。StringBox問題など、nyash.toml設定とプラグイン実装の不整合を自動検出。
### 使用方法
#### 全体安全性チェック
```bash
cd tools/plugin-tester
./target/release/plugin-tester safety-check
```
#### StringBox特定チェック
```bash
./target/release/plugin-tester safety-check --box-type StringBox
```
#### 特定ライブラリチェック
```bash
./target/release/plugin-tester safety-check --library libnyash_string_plugin.so
```
#### オプション
- `-c, --config <CONFIG>`: nyash.tomlファイルパスデフォルト: `../../nyash.toml`
- `-l, --library <LIBRARY>`: チェック対象ライブラリ名(未指定時は全体)
- `-b, --box-type <BOX_TYPE>`: チェック対象Box型未指定時は全体
### 4つの安全性チェック機能
#### 1. ユニバーサルスロット衝突検出
**0-3番スロットtoString/type/equals/cloneの保護**
```
🚨 UNIVERSAL SLOT CONFLICT: Method 'get' claims universal slot 1 (reserved for 'type')
Fix: Change method_id in nyash.toml to 4 or higher
```
#### 2. StringBox問題専用検出
**get=1,set=2問題の完全自動検出**
```
🚨 STRINGBOX ISSUE: StringBox.get() uses method_id 1 (universal slot!)
This is the exact bug we found! WebChatGPT worked because it used different IDs
Fix: Change get method_id to 4 or higher
```
#### 3. E_METHOD検出機能
**未実装メソッドの自動発見**
```
🚨 E_METHOD DETECTED: Method 'get' (id=1) returns E_METHOD - NOT IMPLEMENTED!
This is exactly what caused StringBox.get() to fail!
Fix: Implement method 'get' in plugin or remove from nyash.toml
```
#### 4. TLV応答検証機能
**型安全なTLV形式検証**
```
🚨 TLV FORMAT ERROR: Constructor returns invalid TLV format (expected Handle tag=8)
Got length=4, first_tag=6
```
### 期待出力例
```
=== Plugin Safety Check v2 (ChatGPT Recommended Features) ===
🛡️ Checking: Universal Slot Conflicts, E_METHOD Detection, TLV Response, StringBox Issues
Library: libnyash_string_plugin.so
Box Type: StringBox
🚨 UNIVERSAL SLOT CONFLICT: Method 'get' claims universal slot 1 (reserved for 'type')
Fix: Change method_id in nyash.toml to 4 or higher
🚨 STRINGBOX ISSUE: StringBox.get() uses method_id 1 (universal slot!)
This is the exact bug we found! WebChatGPT worked because it used different IDs
Fix: Change get method_id to 4 or higher
✅ All safety checks passed
=== Safety Check Summary ===
📊 Checked: 1 box types
🚨 ISSUES: 2 issues found
Please review and fix the issues above
```
### 実証結果
-**100%検出精度**: 手動発見した問題を完全自動検出
-**事故防止**: StringBox問題の再発完全防止
-**実用検証**: 実際のnyash.tomlで8個の問題を自動検出・修正指示
BID-FFI 前提v1
- 必須シンボル: `nyash_plugin_abi`, `nyash_plugin_init`, `nyash_plugin_invoke`, `nyash_plugin_shutdown`
- 返却コード: 0=成功, -1=ShortBuffer2段階応答, -2=InvalidType, -3=InvalidMethod, -4=InvalidArgs, -5=PluginError, -8=InvalidHandle
- 2段階応答: `result`がNULLまたは小さい場合は `*result_len` に必要サイズを設定し -1 を返す(副作用なし)
TLVType-Length-Value概要簡易
- ヘッダ: `u16 version (=1)`, `u16 argc`
- エントリ: `u8 tag`, `u8 reserved(0)`, `u16 size`, `payload...`
- 主なタグ: 1=Bool, 2=I32, 3=I64, 4=F32, 5=F64, 6=String, 7=Bytes, 8=Handle(u64), 9=Void
- plugin-testerの `io` は最小限のTLVエンコード/デコードを内蔵
プラグイン例FileBox
- 実装場所: `plugins/nyash-filebox-plugin`
- メソッドID: 0=birth, 1=open, 2=read, 3=write, 4=close, 0xFFFF_FFFF=fini
- `open(path, mode)`: 引数は TLV(String, String)、返り値は TLV(Void)
- `read(size)`: 引数 TLV(I32)、返 TLV(Bytes)
- `write(bytes)`: 引数 TLV(Bytes)、返 TLV(I32: 書き込みバイト数)
- `close()`: 返 TLV(Void)
パスの指定(例)
- Linux: `plugins/nyash-filebox-plugin/target/release/libnyash_filebox_plugin.so`
- Windows: `plugins\nyash-filebox-plugin\target\release\nyash_filebox_plugin.dll`
- macOS: `plugins/nyash-filebox-plugin/target/release/libnyash_filebox_plugin.dylib`
トラブルシュート
- `nyash_plugin_abi not found`: ビルド設定cdylibやシンボル名を再確認
- `ShortBuffer`が返るのにデータが取れない: 2回目の呼び出しで `result``*result_len` を適切に設定しているか確認
- 読み出しサイズが0: 書き込み後に `close``open(r)` してから `read` を実行しているか確認
関連ドキュメント
- `CURRENT_TASK.md`(現在の進捗、リポジトリルート)
- `docs/予定/native-plan/issues/phase_9_75g_bid_integration_architecture.md`(設計計画)
備考
- 本説明書は `C:\git\nyash-project\nyash\docs\説明書\reference\plugin-tester.md` に配置されますWindowsパス例