設計資料・過去の記録

Plugin 互換実装修正案

設計案・過去の実装記録です。本文中の予定、完了数、環境条件は執筆時点のものです。現在の実装や公開版の対応保証として扱わず、最新の対応状況と合わせて読んでください。 対応状況 · 既知の問題

作成日: 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 を解釈する。
  • .plugin bundle は 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 の重複抑止を入れる。

優先順位は以下とする。

  1. install.txt 付き package directory 内の native .plugin
  2. 直置き native .plugin
  3. 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 が実際に生成する。

推奨実装順

  1. SAKNIFE 直置き .plugin の扱いを決め、二重ロードの危険を消す。
  2. PluginMeta.path の意味分離を実装する。
  3. PluginRegistry に同一 ID の優先順位・重複抑止を入れる。
  4. PluginScaffolder を *_mac/ 生成へ更新する。
  5. message.*.txt を UI 表示へ接続する。
  6. tests と docs を同期する。

最小修正セット

まず壊れやすいところだけ直すなら、以下の 3 点を先に行う。

  1. 同一 plugin ID の二重ロード抑止。
  2. PluginMeta に executablePath / packagePath を追加。
  3. 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

ライセンス · 出典一覧 · 資料一覧に戻る