作成日: 2026-06-26
この文書は、Ourin の SSP/PLUGIN 互換方針と現在の実装差分をそろえるための修正案をまとめる。
前提方針
今後の macOS 移植 plugin は、次の責務分離を基本形とする。
SomePlugin_mac/
install.txt
descript.txt
message.japanese.txt
message.english.txt
SomePlugin.plugin/
- Ourin ホスト側が
install.txt、descript.txt、message.*.txtを解釈する。 .pluginbundle は DLL のload/loadu/request/unload/unloadu互換に集中する。- 表示文字列・言語選択は原則として
message.*.txtに寄せる。 - Windows DLL は macOS 上で直接ロードしない。
- 未知 DLL の移行記録は実行体を含めず、実装済みのネイティブ plugin だけをロード対象にする。
修正 1: 未知 DLL の偽実行体を生成しない(対応済み)
旧実装は exit 0 の shell と固定 PLUGIN/2.0M 200 OK を含む .plugin 雛形を生成していた。
これは未実装の動作を実装済みと誤認させ、PluginRegistry のロード失敗やログノイズを生む。
PluginScaffolder は現在、以下の実行体なし移行記録だけを生成する。
ourin/macos/<name>_mac/
descript.txt
message.japanese.txt
message.english.txt
ourin.json (mode: unsupported)
OriginalDocs/
ReadMe.txt
README.md
PluginRegistry は unsupported と旧 scaffold manifest を実行対象から除外する。
元資産は削除せず、元の install.txt は OriginalDocs/ にのみ保存する。
実装完了後の個別ネイティブ plugin は、ourin.json を native-plugin または
native-replacement に更新してからロード対象とする。
修正 2: 同一 plugin ID の二重ロードを防ぐ
問題
[local-path] と SAKNIFE_mac/SAKNIFE.plugin が並ぶと、同じ id の plugin が二重ロードされる可能性がある。
修正案
PluginRegistry.discoverAndLoad にロード済み ID / bundle path の重複抑止を入れる。
優先順位は以下とする。
install.txt付き package directory 内の native.plugin- 直置き native
.plugin - legacy metadata-only directory
同じ ID が複数ある場合は、優先順位が高いものを採用し、低いものは skip してログへ残す。
受け入れ条件
LegacyPluginRegistryTestsに「直置き.pluginと*_macが同一 ID の場合、1 件だけ登録される」テストを追加する。installedpluginとpluginpathlistに重複 ID が出ない。
修正 3: PluginMeta.path の意味を分離する
現状: 2026-06-27 実装済み。PluginMeta.compatibilityPath / executablePath / packagePath と
PluginCompatibilityEntry を追加し、pluginlist.index(n).executablepath /
pluginlist.index(n).packagepath / executionstate / candispatchrequests で参照できる。
問題
package root の descript.txt が元 DLL の filename,SAKNIFE.dll を保持する場合、PluginMeta.path は DLL パスになる。一方、実際にロードされた native bundle は SAKNIFE.plugin であり、pluginpathlist の意味が曖昧になる。
修正案
PluginMeta に互換パスと実行パスを分けて持たせる。
public let compatibilityPath: String // descript.txt の filename 由来。元 DLL 互換。
public let executablePath: String // 実ロード対象。native .plugin / .bundle。
public let packagePath: String? // install.txt 付き package directory。
既存 path は互換性維持のため当面残し、段階的に compatibilityPath の alias として扱う。
受け入れ条件
pluginlist.index(n).pathは従来互換として残る。pluginlist.index(n).executablepathで native.pluginのパスを取得できる。pluginpathlistは仕様上どちらを送るか明記する。推奨は package path、なければ executable path。
修正 4: message.*.txt を実表示へ接続する
問題
Ourin は message.*.txt を PluginMeta.localizedMessages に保持できるが、SAKNIFE の .plugin 実装内にはまだ一部メニュー文言が固定で残っている。
修正案
短期対応:
- Ourin の plugin メニュー UI / DevTools 表示では
PluginMeta.message(for:)を優先する。 pluginlist(...).message.<key>を使った表示例を追加する。
中期対応:
.pluginのloadに package root path を渡している場合、plugin 側が root のmessage.*.txtを読む補助関数を提供する。- ただし方針としては、メニュー構築を Ourin ホスト側へ寄せ、
.pluginは command ID を処理するだけにする。
受け入れ条件
SAKNIFE_mac/message.japanese.txtのmenu.empty_recycle_binを変更すると、Ourin 側表示に反映される。.pluginのソースに固定されたメニュー表示名が最小限になる。
修正 5: install.txt package の reload / rescan を明確化する
問題
Plugin registry が package directory を読むようになったが、更新・再読み込み時の単位が bundle なのか package なのか曖昧。
修正案
- registry の内部 record に
packageURLを持たせる。 unloadAll()は native bundle を unload し、package metadata も消す。discoverAndLoad()は package 単位で再評価する。- DevTools の plugin list は
packageURLとexecutablePathを両方表示できるようにする。
受け入れ条件
SAKNIFE_mac/message.*.txtを変更後、Plugin reload で metadata が更新される。- bundle 直置き plugin と package plugin の表示差が分かる。
修正 6: SAKNIFE の配置を標準形へ一本化する
問題
現在は検証用として SAKNIFE.plugin 直置き版と SAKNIFE_mac/SAKNIFE.plugin が併存している。
修正案
標準は SAKNIFE_mac/ とし、直置き /plugin/SAKNIFE.plugin は検証用または旧成果物として退避する。
推奨配置:
[local-path]
退避候補:
[local-path]
受け入れ条件
- Ourin 起動時に SAKNIFE は 1 件だけ登録される。
installedpluginに SAKNIFE が重複しない。
修正 7: docs と tests の同期
問題
方針が docs に入り始めているが、実装と tests が完全には追従していない。
修正案
SPEC_PLUGIN_2.0M_ja-jp.mdの*_mac方針を正とする。OURIN_MIGRATOR_PLAN.mdとPluginScaffolderの出力を一致させる。PropertySystem_ja-jp/en-us.mdに追加したmessage.<key>のテストを追加する。
受け入れ条件
xcodebuild -project Ourin.xcodeproj -scheme Ourin buildが成功する。- 追加または更新したテストが成功する。
- docs にある標準構成を Migrator が実際に生成する。
推奨実装順
- SAKNIFE 直置き
.pluginの扱いを決め、二重ロードの危険を消す。 PluginMeta.pathの意味分離を実装する。PluginRegistryに同一 ID の優先順位・重複抑止を入れる。PluginScaffolderを*_mac/生成へ更新する。message.*.txtを UI 表示へ接続する。- tests と docs を同期する。
最小修正セット
まず壊れやすいところだけ直すなら、以下の 3 点を先に行う。
- 同一 plugin ID の二重ロード抑止。
PluginMetaにexecutablePath/packagePathを追加。PluginScaffolderの出力を*_mac/に変更。
この 3 点で、現在の方針と実装の大きなズレはほぼ解消できる。
出典と編集について
Ourin / Furin Lab・contributors。文書はCC BY-SA 4.0(第三者の個別表記を除く)。Web版は見出し・リンクの整備とローカルパスの一般化を行っています。更新基準日: 2026-10-30。
元資料: docs/PLUGIN_COMPAT_FIX_PROPOSAL_ja-jp.md
ソース SHA-256: dd13c6e10170169f41cab1be349514568f797486e902996a97f116edcc1ea11e