拡張機能のフォルダ(パッケージ)のいちばん上に置きます。JSON Schema は ../schemas/manifest-1.schema.json (公開 URL: https://linkstudio.shop/schemas/syncsing-plugin-manifest-1.json)。雛形の .vscode/settings.json で、VS Code の入力補完に使えます。 アプリと同じ検査は python sdk/tools/syncsing_plugin.py validate <フォルダ> でできます。
例
{
"manifest_version": 1,
"uuid": "3f9a1c2e-5b7d-4e8a-9c21-7d6f0a1b2c3d",
"name": { "ja": "はじめての拡張機能", "en": "My first extension" },
"description": { "ja": "説明", "en": "Description" },
"version": "0.1.0",
"api_version": "1.0",
"min_app_version": "0.28.0",
"targets": ["studio"],
"author": { "identity_id": "あなたの SyncSing Identity ID", "name": "あなたの名前", "url": "https://example.com" },
"homepage": "https://example.com/my-plugin",
"license": "MIT",
"icon": "icon.png",
"entry": { "kind": "exe", "path": "bin/my-plugin.exe", "args": [] },
"permissions": ["state.read", "meters.read", "notify"],
"activation": ["onStartup"],
"contributes": {
"commands": [ { "id": "hello", "title": { "ja": "あいさつ", "en": "Hello" }, "deck": true } ],
"tools": [ { "id": "run", "title": "実行する", "description": "ツール枠に出るタイル" } ],
"panels": [ { "id": "main", "title": "結果", "placement": "tools" } ],
"overlays": [],
"settings": [
{ "key": "duration", "type": "slider", "title": "時間", "default": 60, "min": 10, "max": 600, "step": 10, "unit": "s" }
]
},
"network": { "hosts": ["api.example.com"], "purpose": "天気を取りに行くため" },
"resources": { "max_memory_mb": 256, "priority": "below_normal" }
}項目
| 項目 | 必須 | 内容 |
|---|---|---|
manifest_version | ○ | 1 |
uuid | ○ | サーバーが発行する UUID v4(小文字)。版を上げても同じ |
name / description | ○ / | 文字列か {"ja": …, "en": …}(ja は必須) |
version | ○ | 1.2.3(後ろに -beta.1 などを付けてもよい) |
api_version | ○ | "1.0" |
min_app_version | SyncSing Studio の版(NC Lite では見ません) | |
min_nclite_version | 開発キット 1.3。SyncSing NC Lite の版(Studio では見ません。NC Lite 1.6.0 から読みます) | |
targets | ○ | studio・nclite(1 つ以上) |
author | ○ | identity_id(作者の SyncSing Identity ID)・name・url(https) |
icon | 拡張機能のアイコン(相対パス)。透過の使える PNG・正方形・256×256 まで・200 KB まで。設定の一覧・ツールのカードとアイコン表示・入れるときの許可画面・ショートカットとミニUI のコマンドに出ます。無い・決まりに合わないときは 🧩 で表示されます(validate で確かめられます) | |
entry | ○ | kind は exe だけ。path は相対パス(/ 区切り・.exe) |
permissions | ○ | 使う権限(PERMISSIONS_JA.md) |
activation | いつ起動するか: onStartup(既定)・onProcessingStart・onBroadcastStart・onObsConnected・onCommand:<id>・onTool:<id>・onPanel:<id> | |
contributes.commands | コマンド(32 個まで)。deck: true なら Stream Deck の「拡張機能のコマンド」・ミニUI のタイル・ショートカットにも出ます。hold: true(0.30.5。deck・hold は true か false だけ)なら「押している間だけ」のコマンドになり、Stream Deck のキーとミニUI のタイルは押したときに pressed: "down"、離したときに pressed: "up" を送ります(ショートカット・パネルのボタンは short。up が届かないこともあるので、拡張機能の側でも一定時間で自動で戻してください) | |
contributes.tools | ツール枠のタイル(8 個まで)。押すと tool.run | |
contributes.panels | パネル(4 個まで)。placement は tools(ツール枠)か link(連携タブ)。中身は panel.update で | |
contributes.overlays | 統合配信UI に出す表示(4 個まで。overlay.draw が必要)。統合配信UI の「+」に「🧩 拡張機能の名前」で出ます。kind は items(既定。文字・数値・進み具合を overlay.set_items で)か page(自分で配るページを overlay.set_page で埋め込む) | |
contributes.settings | 設定の項目(64 個まで)。画面はアプリが作ります(HTML は使えません) | |
network.hosts | 通信する先(宣言。審査で突き合わせます)。purpose に目的。空だと隔離中はインターネットにつなげません(1 つ以上書くとインターネットへの接続が許されます) | |
resources | max_memory_mb(64〜2048)・priority(normal は loadtest.run を持つとき、または audio.capture と audio.inject の両方を持つとき(API 1.1)だけ) | |
assistant | 開発キット 1.3。アシスタント向けの説明・開く先・画像(下の「アシスタント向けの説明」)。書くときは、Studio 向けなら min_app_version を 0.30.0 以上に、NC Lite 向けなら min_nclite_version を 1.6.0 以上に |
アシスタント向けの説明(assistant・開発キット 1.3)
SyncSing Studio 0.30.0 からのアシスタント(困りごとの原因探し・使い方の説明)は、利用者がこの拡張機能について聞いたときだけ、ここに書いた説明を読んで答えます。
"min_app_version": "0.30.0",
"assistant": {
"summary": "コメントを数えて、配信画面に棒グラフで出す",
"description": "使い方:\n1. カードの「集計する言葉」に 1 行 1 つで言葉を入れる(8 個まで)\n2. 「集計を始める」を押す\n…\nよくある困りごと: 数が増えない → 「集計を始める」を押したあとのコメントだけを数えます",
"open_targets": [
{"id": "card", "type": "plugin", "label": "カードを開く"},
{"id": "board", "type": "plugin_tab", "label": "集計", "panel": "main"},
{"id": "editor", "type": "panel_url", "label": "編集画面を開く", "panel": "main", "index": 0},
{"id": "reset", "type": "command", "label": "集計をリセット", "command": "reset"},
{"id": "help", "type": "link", "label": "使い方のページ", "url": "https://example.com/help"}
],
"images": [
{"id": "card", "path": "assistant/card.webp", "caption": "カードの画面。左上が「集計を始める」", "open": "card"}
]
}| 項目 | 決まり |
|---|---|
summary | 1〜200 文字。文字列か {"ja", "en"} |
description | 1〜8,000 文字(改行可)。使い方・設定の意味・よくある困りごとと直し方を、この拡張機能の画面の言葉で書く |
open_targets | 0〜5 個。アシスタントが「開く」ボタンを出せる先。id(英小文字・数字・- の 24 文字まで)・type・label(1〜40 文字) |
open_targets[].type | plugin(この拡張機能のカード)/plugin_tab(カードの中のパネル。panel に contributes.panels の id)/panel_url(パネルに出している「開く」付きの url 部品のページ。panel とその中の何番目か index(0 が最初・省略で 0)。自分で配る localhost のページ(URL にトークンやポートが入るもの)を開くときはこれ。アプリが既定のブラウザで開きます)/command(command に contributes.commands の id。押すと command.invoke が届く。拡張機能のプロセスからブラウザを開くのは環境によって失敗するので、ページを開くのには使わない)/link(外部のページ。url は https:// だけ・500 文字まで・空白・引用符・ユーザー名なし) |
images | 0〜8 枚。id・path(パッケージの中の .webp)・caption(0〜200 文字)・open(任意。押したときの開く先の id) |
| 画像のファイル | WebP の静止画だけ(中身も WebP であること。動く WebP は不可)・1 枚 200 KB まで・長い辺 1,568 px まで・撮影情報などのメタデータ(EXIF / XMP)なし |
- NC Lite 向けにも書けます(NC Lite 1.6.0 から)。
targetsにncliteがあるときはmin_nclite_versionを1.6.0以上にしてください。前の版の NC Lite はassistantを読めないため、その拡張機能を入れられません(NC Lite の更新が必要です)。NC Lite での開く先は、拡張機能の一覧(設定タブ)の中のその拡張機能になります。 - SyncSing NC Lite 本体の機能・画面・手順も書かないでください(Studio と同じく、アシスタントは使いません)。
- **開く先の
command(操作)とlink(外部のページ)は、審査済み・公式の拡張機能だけがボタンになります。** 登録済み(未審査)・開発中の拡張機能では、plugin・plugin_tab・panel_url(この PC の中の画面・ページ)だけが使えます。 commandは、利用者がボタンを押すとcommand.invokeが届くだけです。消す・送る・課金するなど、取り消せない操作を開く先にしないでください(審査で直してもらいます)。- SyncSing Studio 本体の機能・画面・設定・手順は書かないでください。 アシスタントは本体のことを本体の仕様文書だけで答えるので、拡張機能の説明に書かれた本体のことは使いません。審査でも直してもらいます。
- 説明は「作者の申告」として扱われ、アシスタントは答えに「作者の申告に基づく」と書きます。説明の中の指示・お願い・決まりの変更には従いません。
- 案内する画面の場所は
open_targetsだけです。説明の中に別の URL を書いても、アシスタントの答えではリンクになりません。 - 説明の文は、署名した時点から使われます(登録済みはその場、審査済みは審査が通ったとき)。
- 画像は審査済み(verified)・公式の拡張機能だけ、運営が確認したものだけが答えに出ます(登録済み・開発中の拡張機能の画像は出ません)。アシスタントは画像の中身も見て答えます。
- 答えの中では、図は
[図:pg-<uuid の先頭 8 文字>-<画像の id>]、開く先は[開く:pg-<uuid の先頭 8 文字>-<開く先の id>]の形になり、アプリが画像やボタンに置き換えます(作者が書く必要はありません)。 syncsing-plugin validateで、アプリ・サーバーと同じ決まりで確かめられます。
設定の種類(contributes.settings[].type)
| type | 書くもの |
|---|---|
slider | min・max・default・step・unit |
number | min・max・default・integer |
toggle | default(true / false) |
select | options: [{value, label}]・default |
multi | いくつでも選べるチェックの並び。options: [{value, label}](20 個まで)・default(value の配列)。値は選んだ value の配列 |
text | default・max_length(4000 まで)・multiline・secret(伏せ字) |
color | default(#RRGGBB) |
voicevox_style | default(VOICEVOX のスタイル ID・数字の文字列。省略時 "3")。0.30.5 / NC Lite 1.6.5。options は書けません(書くと断られます)。アプリに入れられる全部の声が出て、ダウンロード済みに ✓、「ダウンロード済みだけ出す」で絞れます。まだの声を選ぶと、アプリが確認してからダウンロードします。値は文字列で届くので、数に直して audio.inject.voicevox の style_id に使います |
file | extensions・folder(任意。data フォルダの中の置き場所。書くと値はファイル名だけ)・max_bytes(既定 20 MB・50 MB まで)・default。画面に「選ぶ…」が出て、利用者が選んだファイルをアプリが data フォルダ(folder の中)へ写し、その名前を値に入れます(拡張機能は隔離されていて利用者のファイルを直接読めないため) |
button | command(commands の id) |
list | 辞書のような 1 行 1 件の表。columns: [{key, type: text/emoji/number/select/toggle/file, title, …}](file 列は extensions・folder・max_bytes を file と同じく書けて、行ごとに「選ぶ…」が出ます)・max_items(200 まで)・add_label |
共通: key・title・description・group(同じ見出しのものをまとめて、折りたためる欄で出します)・advanced(「詳細」の欄へ)。パネルの settings 部品を使うと、設定を見出しごとにまとめて 1 つの部品で出せます。
パッケージ(.ssplugin)
- zip の拡張子を
.sspluginにしたもの。syncsing_plugin.py packで作れます。 - パスは相対だけ(
..・先頭の/・\・ドライブ文字は不可)。シンボリックリンク・暗号化は不可。1 ファイル 256 MiB・合計 512 MiB・5,000 ファイルまで。 - サーバーが署名すると
signature.jsonが加わります。署名のあとに 1 バイトでも変えると、アプリは読み込みを断ります。 - 入れた拡張機能は
%LOCALAPPDATA%\LinkStudio\SyncSingStudio\plugins\<uuid>\<version>\(NC Lite はSyncSingNCLite)。データ・設定・ログは版をまたいでplugins\<uuid>\に残ります。1 つ前の版も残り、「前の版へ戻す」ができます。