Na tej stronie

Tworzenie i implementacja wtyczek

Seer oferuje modułową architekturę wtyczek, która pozwala deweloperom rozszerzać możliwości programu w wielu obszarach. Wybierz poniżej rodzaj wtyczki, aby zapoznać się ze specyfikacją jej tworzenia:

Wtyczki przeglądarki (Viewers)

Wtyczki przeglądarki rozszerzają okno podglądu wywoływane spacją. Obsługują dwie architektury implementacji: Wtyczki konwersji (Convert) oraz Wtyczki DLL (SDK v3).

Tworzenie wtyczki przeglądarki za pomocą agenta AI

Zastąp poniższy symbol zastępczy, a następnie przekaż pełną instrukcję swojemu agentowi kodującemu:

Przeczytaj i postępuj zgodnie z przewodnikiem tworzenia wtyczek Seer dostępnym pod adresem https://raw.githubusercontent.com/ccseer/Seer-Plugins/refs/heads/master/plugin_development_guide.md. Traktuj go jako jedyne źródło prawdy w zakresie architektury, plugin.json, implementacji, walidacji i pakowania. Jeśli przewodnik jest niedostępny, zatrzymaj się i zgłoś to przed kontynuowaniem.

Przed rozpoczęciem jakichkolwiek prac sprawdź poniższe Requirement (Wymaganie). Jeśli brakuje go, jest niezmienionym tekstem zastępczym lub jest zbyt niejednoznaczne do zaimplementowania, zadaj jedno pytanie uściślające i poczekaj. Nie domyślaj się brakującego wymagania.

Po wyjaśnieniu wybierz Convert lub DLL i krótko uzasadnij wybór, a następnie zaimplementuj kompletną, możliwą do zainstalowania wtyczkę w bieżącym obszarze roboczym. Nie modyfikuj samego Seera ani nie zatrzymuj się na planie lub fragmentach kodu.

Postępuj zgodnie z każdym mającym zastosowanie krokiem walidacji w przewodniku i zgłoś rzeczywiste wyniki. Uruchom test podglądu w aplikacji Seer, jeśli to możliwe; w przeciwnym razie wyraźnie zaznacz, że weryfikacja w czasie wykonywania nie została przeprowadzona.

Requirement: [ZASTĄP TEN SYMBOL ZASTĘPCZY wymaganiem dotyczącym wtyczki przeglądarki, np. renderowanie diagramów mermaid w podglądzie markdown]

Wtyczki konwersji (Convert)

Seer traktuje wtyczki konwersji jako zewnętrzne programy wiersza poleceń. Gdy użytkownik naciśnie spację na obsługiwanym pliku, Seer uruchamia skonfigurowany program, przekazując ścieżki plików za pomocą symboli zastępczych. Program konwertuje plik na format natywnie obsługiwany przez Seer (HTML, JSON, TXT, obrazy itp.), który Seer ładuje i renderuje po zakończeniu procesu.

Zmienne symboli zastępczych

Symbol Opis Przykład
${output_file} Podstawowa ścieżka pliku wyjściowego; dołącz docelowe rozszerzenie w argumentach. ${output_file}.html
${no_cache} Wyłącza buforowanie konwersji i zapisuje dane wyjściowe w katalogu automatycznego usuwania, który jest czyszczony po zamknięciu okien podglądu. ${no_cache}

Wtyczki konwersji akceptują również uniwersalne symbole zastępcze (${input_file}, ${use_backslash}, ${seer_dir}, ${seer_exe}, ${seerviewer_exe}, ${7z}) i nie używają znaczników dopasowania ${type_*, ponieważ deklarują dopasowania w formats zamiast w extensions. Oba zagadnienia omówiono w sekcji Symbole zastępcze i znaczniki dopasowania poniżej.

Obsługiwane pliki wykonywalne i środowiska uruchomieniowe skryptów

  • Skrypty: Skrypty programu PowerShell (.ps1, obsługiwane bezpośrednio przez program PowerShell). W przypadku języków Python (.py), Node.js (.js) lub skryptów wsadowych (.bat) skompiluj je do autonomicznego pliku .exe (np. za pomocą PyInstaller) lub dołącz interpreter do pakietu.
  • Niestandardowe pliki binarne: Autonomiczne pliki wykonywalne CLI skompilowane w językach C/C++, Rust, Go lub C#.

Przykład plugin.json (Convert)

{
  "name": "ipynb",
  "version": "1.2.0",
  "type": "convert",
  "roles": [
    "viewer"
  ],
  "entry": "ipynb.ps1",
  "args": [
    "-i",
    "${input_file}",
    "-o",
    "${output_file}.html"
  ],
  "formats": [
    "ipynb"
  ],
  "appMinVersion": "4.1.3",
  "author": "ccseer"
}

Wtyczki DLL (SDK v3)

Aby uzyskać maksymalną wydajność renderowania, głęboką interaktywność lub widoki strumieniowe, Seer obsługuje natywne biblioteki dołączane dynamicznie (DLL) C++/Qt, ładowane bezpośrednio do obszaru wyświetlania za pośrednictwem QPluginLoader.

  • Specyfikacja techniczna: C++17, Qt 6.8, MSVC 2022 (x64), CMake 3.22+.
  • Niezbędne interfejsy: Dziedziczenie po ViewerBase (implementacja widżetu) oraz implementacja ViewerPluginInterface (IID "seer.plugin.interface.preview/3").
  • Minimalna wersja aplikacji: Wtyczki SDK v3 muszą deklarować "appMinVersion": "4.2.9".

Projekty referencyjne

Projekt Przeznaczenie
F3DViewer Renderowanie modeli 3D i widok panoramiczny
OfficeViewer Dokumenty biurowe i rysunki CAD
FontViewer Inspekcja glifów i renderowanie czcionek
JsonTreeViewer Wysokowydajne interaktywne drzewo JSON
Collections Wszystkie oficjalne i społecznościowe wtyczki podglądu

Wtyczki kontrolek

Wtyczki kontrolek dodają niestandardowe przyciski akcji po lewej stronie dolnego paska sterowania w oknie podglądu, umożliwiając szybkie operacje i integrację z zewnętrznymi narzędziami dla aktywnego pliku lub folderu.

Tworzenie wtyczki kontrolek za pomocą agenta AI

Zastąp poniższy symbol zastępczy, a następnie przekaż pełną instrukcję swojemu agentowi kodującemu:

Przeczytaj i postępuj zgodnie z przewodnikiem tworzenia wtyczek kontrolek Seer dostępnym pod adresem https://raw.githubusercontent.com/ccseer/Seer-Controls/refs/heads/main/plugin_development_guide.md. Traktuj go jako jedyne źródło prawdy w zakresie architektury, plugin.json, implementacji, walidacji i pakowania. Jeśli przewodnik jest niedostępny, zatrzymaj się i zgłoś to przed kontynuowaniem.

Przed rozpoczęciem jakichkolwiek prac sprawdź poniższe Requirement (Wymaganie). Jeśli brakuje go, jest niezmienionym tekstem zastępczym lub jest zbyt niejednoznaczne do zaimplementowania, zadaj jedno pytanie uściślające i poczekaj. Nie domyślaj się brakującego wymagania.

Po wyjaśnieniu zaimplementuj kompletną, możliwą do zainstalowania wtyczkę kontrolek zgodną z kontraktem procesowym Canonical v1 w bieżącym obszarze roboczym. Nie modyfikuj samego Seera ani nie zatrzymuj się na planie lub fragmentach kodu.

Postępuj zgodnie z każdym mającym zastosowanie krokiem walidacji w przewodniku i zgłoś rzeczywiste wyniki.

Requirement: [ZASTĄP TEN SYMBOL ZASTĘPCZY wymaganiem dotyczącym wtyczki kontrolek, np. otwórz VS Code w bieżącym katalogu lub skopiuj ścieżkę bezwzględną do schowka]

Architektura i kontrakt

  • Model procesu: Implementuje kontrakt procesowy Canonical v1 (backend: "process", capabilities: ["control"]). Seer wykonuje program pomocniczy przez CLI.
  • Status zakończenia i raportowanie błędów:
    • Sukces: Proces kończy się z kodem 0 (lub pasującym do success_exit_codes). Jeśli skonfigurowano "close_after_success": true, Seer automatycznie zamyka okno podglądu po pomyślnym wykonaniu.
    • Błąd: Proces kończy się z kodem różnym od zera. Wszystko zapisane do standardowego strumienia błędów (stderr) jest przechwytywane przez Seer i wyświetlane jako powiadomienie Toast o niepowodzeniu w aplikacji.
  • Interfejs użytkownika i interakcja: Wtyczki kontrolek nie tworzą własnych trwałych okien głównych. Typowe programy pomocnicze uruchamiają zadania w tle, kopiują tekst do schowka lub wywołują natywne okna dialogowe systemu Windows (np. Otwórz za pomocą, Właściwości, Udostępnij).

Symbole zastępcze wiersza poleceń

Program pomocniczy kontrolki otrzymuje wyłącznie ścieżkę docelową — ${input_file} oraz uniwersalne symbole zastępcze (${use_backslash}, ${seer_dir}, ${seer_exe}, ${seerviewer_exe}, ${7z}) wymienione we wspólnej sekcji Symbole zastępcze i znaczniki dopasowania poniżej.

Symbole ${output_dir}, ${output_file} i ${no_cache} są odrzucane w manifeście wtyczki kontrolek. Kontrolka, która wymaga lokalizacji tymczasowej, musi wyznaczyć ją samodzielnie: najpierw własny katalog pliku wykonywalnego, a następnie systemowy katalog tymczasowy.

Przykłady plugin.json (Control)

Przykład 1: Akcja folderu (Terminal Here)

Konfiguracja oficjalnej wtyczki Terminal Here:

{
  "schema_version": 1,
  "id": "io.1218.seer.terminal-here",
  "name": "Terminal Here",
  "description": "Opens a terminal window in the current folder.",
  "version": "1.0.0",
  "appMinVersion": "4.5.10",
  "backend": "process",
  "capabilities": [
    "control"
  ],
  "extensions": [
    "${type_folder}"
  ],
  "command": "terminal_here.exe",
  "arguments": [
    "--input",
    "${input_file}"
  ],
  "close_after_success": false,
  "timeout_ms": 150000,
  "success_exit_codes": [
    0
  ]
}

Przykład 2: Akcja pliku (Explorer Open With)

Konfiguracja oficjalnej wtyczki Explorer Open With:

{
  "schema_version": 1,
  "id": "io.1218.seer.explorer-open-with",
  "name": "Open With",
  "description": "Opens the Windows Open With dialog for the current file.",
  "version": "1.1.0",
  "appMinVersion": "4.5.10",
  "backend": "process",
  "capabilities": [
    "control"
  ],
  "extensions": [
    "${type_file}"
  ],
  "command": "shellopenwith.exe",
  "arguments": [
    "--input",
    "${input_file}",
    "${use_backslash}"
  ],
  "timeout_ms": 30000,
  "success_exit_codes": [
    0
  ]
}

Aby automatycznie zamknąć okno podglądu po pomyślnym wykonaniu, ustaw "close_after_success": true w manifeście.

Kod źródłowy oficjalnych wtyczek kontrolek można znaleźć pod adresem: ccseer/Seer-Controls.

Wtyczki właściwości

Wtyczki właściwości rozszerzają mechanizm inspekcji metadanych Seer. Gdy użytkownik naciśnie Ctrl + I na podglądanym pliku lub folderze (lub otworzy okno Właściwości), pasujące wtyczki właściwości wyodrębniają i wyświetlają ustrukturyzowane metadane oraz graficzne wykresy/oscyloskopy.

Tworzenie wtyczki właściwości za pomocą agenta AI

Zastąp poniższy symbol zastępczy, a następnie przekaż pełną instrukcję swojemu agentowi kodującemu:

Przeczytaj i postępuj zgodnie z przewodnikiem tworzenia wtyczek właściwości Seer dostępnym pod adresem https://raw.githubusercontent.com/ccseer/Seer-Properties/refs/heads/main/plugin_development_guide.md. Traktuj go jako jedyne źródło prawdy w zakresie architektury, plugin.json, implementacji, walidacji i pakowania. Jeśli przewodnik jest niedostępny, zatrzymaj się i zgłoś to przed kontynuowaniem.

Przed rozpoczęciem jakichkolwiek prac sprawdź poniższe Requirement (Wymaganie). Jeśli brakuje go, jest niezmienionym tekstem zastępczym lub jest zbyt niejednoznaczne do zaimplementowania, zadaj jedno pytanie uściślające i poczekaj. Nie domyślaj się brakującego wymagania.

Po wyjaśnieniu zaimplementuj kompletną, możliwą do zainstalowania wtyczkę właściwości zgodną z kontraktem procesowym Canonical v1 i specyfikacją Schema 1 JSON w bieżącym obszarze roboczym. Nie modyfikuj samego Seera ani nie zatrzymuj się na planie lub fragmentach kodu.

Postępuj zgodnie z każdym mającym zastosowanie krokiem walidacji w przewodniku i zgłoś rzeczywiste wyniki.

Requirement: [ZASTĄP TEN SYMBOL ZASTĘPCZY wymaganiem dotyczącym wtyczki właściwości, np. wyodrębnij i wyświetl szczegółowe parametry kodeków audio/wideo oraz szybkość transmisji bitów dla plików MP4]

Architektura i kontrakt

  • Model procesu: Implementuje kontrakt procesowy Canonical v1 (backend: "process", capabilities: ["property"], result_schema: 1).
  • Wywołanie CLI: Host przekazuje: --input "${input_file}" --output "${output_file}" --output-dir "${output_dir}"
  • Publikacja danych wyjściowych:
    • Host rozwija ${output_file} do ścieżki podstawowej bez rozszerzenia (np. <requestDir>/<md5>).
    • Wtyczka musi zapisać swój wynik JSON do <output-base>.json (czyli ${output_file}.json).
    • Załączniki wizualne (wykresy, histogramy, wektroskopy) muszą być zapisywane w ${output_dir}.
    • Ograniczenie: Zmienna ${no_cache} jest zabroniona we wtyczkach właściwości.
  • Zasady dotyczące kodów wyjścia:
    • Oczekiwane wyniki domenowe (np. niepodpisany plik, brak repozytorium git, puste metadane) muszą kończyć się kodem 0 i opisywać status w formacie JSON.
    • Kod różny od zera należy zwracać tylko w przypadku błędów krytycznych lub nieprawidłowych wywołań (zakończenie z kodem niezerowym powoduje usunięcie katalogu żądania przez hosta).

Symbole zastępcze wiersza poleceń

Symbol Opis Przykład
${output_file} Przypisana przez hosta ścieżka podstawowa bez rozszerzenia; wynik musi zostać zapisany do ${output_file}.json. C:\Users\...\request_dir\md5_hash
${output_dir} Przypisany przez hosta katalog żądania dla załączników (wykresy, obrazy). C:\Users\...\request_dir

Oraz uniwersalne symbole zastępcze wymienione we wspólnej sekcji Symbole zastępcze i znaczniki dopasowania poniżej, która obejmuje również znaczniki dopasowania ${type_*}. Symbol ${no_cache} jest odrzucany dla wtyczek właściwości.

Specyfikacja wynikowego formatu JSON (Schema 1)

Plik wynikowy ${output_file}.json musi być poprawnym formatem JSON zakodowanym w UTF-8, zawierającym result_schema: 1 oraz obiekt data:

1. Płaskie wiersze (Flat Rows)

Tylko gdy cały wynik to pojedynczy wiersz (np. SHA-256):

{
  "result_schema": 1,
  "data": {
    "SHA-256": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
  }
}

2. Podgrupa z uporządkowaną tablicą obiektów z jednym kluczem (Domyślnie)

Wynik zawierający więcej niż jeden wiersz musi zostać opublikowany jako dokładnie jedna podgrupa nazwana od wtyczki — luźne wiersze najwyższego poziomu kolidują z wierszami wszystkich innych wtyczek, które Inspektor pokazuje na jednej liście. Kolejność tablicy to kolejność wyświetlania, więc jest to jedyna forma, która pozwala wtyczce zdecydować o kolejności wierszy:

{
  "result_schema": 1,
  "data": {
    "Git": {
      "value": [
        { "Repository": "ccseer/Seer-Properties" },
        { "Branch": "main" },
        { "Status": "Clean" }
      ]
    }
  }
}

3. Podgrupa z obiektem wartości

value może być także zwykłym obiektem, ale jego wiersze są renderowane w kolejności kluczy przetworzonego obiektu, której wtyczka nie może kontrolować. Używaj tylko wtedy, gdy kolejność wierszy nie ma znaczenia:

{
  "result_schema": 1,
  "data": {
    "Git": {
      "value": {
        "Branch": "main",
        "Status": "Working tree clean"
      }
    }
  }
}

4. Wykresy graficzne i oscyloskopy (Załączniki graficzne)

Zapisuj wygenerowane wykresy PNG w katalogu ${output_dir} i deklaruj je jako {"type": "image", "value": "relative_filename.png"}:

{
  "result_schema": 1,
  "data": {
    "Image Scopes": {
      "value": [
        { "RGB Histogram": { "type": "image", "value": "histogram.png" } },
        { "Luma Waveform": { "type": "image", "value": "waveform.png" } }
      ]
    }
  }
}

Przykład plugin.json (Property)

{
  "schema_version": 1,
  "id": "io.1218.seer.git-info",
  "name": "Git Info",
  "description": "Reports repository information for the current folder using Git.",
  "version": "1.0.0",
  "appMinVersion": "4.5.10",
  "backend": "process",
  "capabilities": [
    "property"
  ],
  "extensions": [
    "${type_folder}"
  ],
  "invocations": {
    "property": {
      "command": "git_info.exe",
      "arguments": [
        "--input",
        "${input_file}",
        "--output",
        "${output_file}",
        "--output-dir",
        "${output_dir}"
      ],
      "result_schema": 1,
      "timeout_ms": 30000,
      "success_exit_codes": [
        0
      ]
    }
  }
}

Kod źródłowy oficjalnych wtyczek właściwości można znaleźć pod adresem: ccseer/Seer-Properties.


Symbole zastępcze i znaczniki dopasowania

Seer rozwija te symbole w polu arguments. To, jakich symboli zastępczych może używać dana możliwość wtyczki, jest sprawdzane przez hosta podczas ładowania manifestu — nieobsługiwany symbol jest błędem ładowania manifestu, a nie ostrzeżeniem w czasie działania.

Dostępne dla każdej możliwości

Symbol Opis Przykład
${input_file} Ścieżka bezwzględna do podglądanego pliku lub folderu. C:\Docs\sample.pdf
${use_backslash} Opcjonalna flaga formatująca separatory ścieżek przy użyciu natywnych ukośników odwrotnych Windows (\). ${use_backslash}
${seer_dir} Katalog zawierający Seer.exe. C:\Program Files\Seer
${seer_exe} Ścieżka bezwzględna do Seer.exe. C:\Program Files\Seer\Seer.exe
${seerviewer_exe} Ścieżka bezwzględna do SeerViewer.exe. C:\Program Files\Seer\SeerViewer.exe
${7z} Ścieżka bezwzględna do 7z.exe dołączonego do Seer. C:\Program Files\Seer\plugins\7z.exe
${theme} Bieżący motyw Seer, rozwijany do dark lub light. Jest to symbol zastępczy danych i nie może być używany jako cały command. dark
${lang} Bieżący język Seer, rozwijany w formacie BCP-47 (np. en, zh-CN). Jest to symbol zastępczy danych i nie może być używany jako cały command. en
${screenshot} Ścieżka bezwzględna do tymczasowego zrzutu ekranu PNG bieżącego widoku. C:\Users\Username\AppData\Local\Temp\Seer\screenshot\view_1.png

Symbole zastępcze specyficzne dla możliwości

Symbol Podgląd (Preview) Kontrolka (Control) Właściwość (Property)
${output_file} Podstawowa ścieżka wyjściowa; dołącz docelowe rozszerzenie, np. ${output_file}.html Nieobsługiwane Ścieżka podstawowa bez rozszerzenia; wynik należy zapisać do ${output_file}.json
${output_dir} Nieobsługiwane Nieobsługiwane Katalog żądania dla załączników (wykresy, obrazy)
${no_cache} Wyłącza buforowanie konwersji i zapisuje dane wyjściowe w katalogu automatycznego usuwania Nieobsługiwane Nieobsługiwane

Program pomocniczy kontrolki otrzymuje wyłącznie ścieżkę docelową. Jeśli potrzebuje lokalizacji tymczasowej, musi wyznaczyć ją samodzielnie: najpierw własny katalog pliku wykonywalnego, a następnie systemowy katalog tymczasowy.

Znaczniki dopasowania extensions

Oprócz standardowych rozszerzeń (np. ["png", "zip"]), pole extensions przyjmuje znaczniki pasujące do szerokich kategorii. Dotyczą one wtyczek, które deklarują extensions (kontrolki i właściwości); wtyczki konwersji deklarują formats i nie korzystają z tych znaczników.

Znacznik Opis
${type_folder} Dopasowuje katalogi i foldery.
${type_file} Dopasowuje wszystkie pliki (w tym pliki bez rozszerzenia).
${type_all} Dopasowuje wszystko (zarówno pliki, jak i foldery).
${type_image} Dopasowuje obrazy obsługiwane przez natywną przeglądarkę obrazów Seer.
${type_media} Dopasowuje formaty audio i wideo.
${type_web} Dopasowuje pliki stron internetowych, takie jak HTML i Markdown.
${type_text} Dopasowuje pliki tekstowe, kod źródłowy i pliki konfiguracyjne.
${type_pdf} Dopasowuje dokumenty PDF.
${type_none} Dopasowuje pliki spoza powyższych kategorii (np. archiwa, pliki wykonywalne).

Pakowanie i testowanie w aplikacji

Po zakończeniu tworzenia wtyczka musi zostać spakowana do standardowego archiwum ZIP w celu instalacji. Dotyczy to wszystkich możliwości wtyczek.

Standardy pakowania

  1. Dokumentacja pakietu: Każdy autonomiczny pakiet wtyczki kontrolki lub właściwości powinien zawierać plik PACKAGE_README.md (opis oraz tabelę ## Options & Arguments), umieszczony jako README.md w katalogu głównym pakietu.
  2. Płaska struktura główna: W przypadku pakietów kontrolek i właściwości (Canonical v1) plik plugin.json, plik wykonywalny/skrypt, README.md oraz zależności środowiska uruchomieniowego muszą znajdować się bezpośrednio w katalogu głównym archiwum. Nie umieszczaj ich w dodatkowym podfolderze i nigdy nie mieszaj wpisów płaskich z zagnieżdżonymi — host odrzuci archiwum z niejednoznaczną strukturą główną.

    Starsze wtyczki konwersji instalowane z katalogu online używają odwrotnego układu: folderu najwyższego poziomu <nazwa-archiwum>/, w którym znajdują się pliki pakietu. W takim przypadku postępuj zgodnie z przewodnikiem po wtyczkach konwersji; te dwa układy nie są wymienne.

  3. Maksymalna kompresja: Zaleca się użycie programu 7-Zip z maksymalną kompresją Deflate: powershell 7z a -tzip -mx=9 my-plugin-1.0.0.zip .\*

Lokalne testowanie w aplikacji

  1. Otwórz ustawienia Seer i przejdź do odpowiedniej sekcji:
    • Wtyczki przeglądarki: Ustawienia > Wtyczki -> karta Lokalne
    • Wtyczki kontrolek: Ustawienia > Sterowanie
    • Wtyczki właściwości: Ustawienia > Właściwości
  2. Kliknij + pod listą i wybierz archiwum .zip (lub plik plugin.json z lokalnego folderu deweloperskiego).
  3. Seer automatycznie zweryfikuje i załaduje pakiet. Sprawdź ustawienia i kliknij OK, aby go aktywować.