Skip to content

Command plugins - #5

Merged
adamgracikowski merged 31 commits into
developfrom
feature/command-plugins
Sep 15, 2025
Merged

Command plugins#5
adamgracikowski merged 31 commits into
developfrom
feature/command-plugins

Conversation

@adamgracikowski

Copy link
Copy Markdown
Contributor

Co w PR?:

Na ten moment wrzucam jako draft, ponieważ brakuje jeszcze:

  • komentarzy pod metodami, struct-ami itp.,
  • poprawienia testów, które zdezaktualizowały się przez refaktor,
  • testów jednostkowych dla nowych funkcjonalności,
  • utworzenia handlerów dla istniejących poleceń (ignore, config) w sposób analogiczny jak w pliku init_handler.rs (te polecenia przestały chwilowo działać poprzez zmianę sposobu tworzenia takich obiektów jak layout-y itp., ale to jeszcze oczywiście naprawię przed mergem)
  • posprzątania importów i eksportów.
  • nie ma też jeszcze takich bajerów jak wyłączanie pluginów i zbierania historii wywołań poprzez zmienne w pliku konfiguracyjnym, ale to też raczej godzinka/dwie i powinno śmigać 🔥

Co już można testować?:

  • polecenie init jest już gotowe wraz z obsługą pluginów (co ciekawe pominąłem w specyfikacji dosyć istotny fakt, że nie da się rejestrować pluginów lokalnych dla zdarzenia pre-execute i polecenia init, ponieważ .meva/ jeszcze wtedy nie istnieje xD - o tym dowiedziałem się całkiem późno, więc kilka if-ów musiało się pojawić i opóźnić PR)

Ja sobie wstępnie testowałem tak:

cargo run --bin meva  -- init -b master

potem rejestrujemy plugin na post-execute dla init:

cargo run --bin meva -- plugins register --name print_file --file print_file.py --command init --event post-execute --order 1 --interpreter python --scope global 'C:\Users\AG\Desktop\print_file.py'

tutaj przykładowy skrypcik na którym testowałem (tylko printuje invocation context):

import sys

def main():
    if len(sys.argv) < 2:
        print(f"Użycie: {sys.argv[0]} <ścieżka_do_pliku>", file=sys.stderr)
        sys.exit(1)

    file_path = sys.argv[1]

    try:
        with open(file_path, "r", encoding="utf-8") as f:
            for line in f:
                print(line, end="")
    except FileNotFoundError:
        print(f"Plik '{file_path}' nie istnieje.", file=sys.stderr)
        sys.exit(1)
    except Exception as e:
        print(f"Błąd przy odczycie pliku: {e}", file=sys.stderr)
        sys.exit(1)

if __name__ == "__main__":
    main()

Jutro wieczorem dopracuję brakujące rzeczy, ale wrzucam już dzisiaj jak zapowiadałem 😎
Głównie fajnie jakbyś spojrzał na crate plugins bo to jakby main część pracy.

Z fajnych rzeczy udało się zrobić ten timeout na pluginy - można go umieścić w pliku konfiguracyjnym na przykład.

A jeżeli chodzi o zbieranie informacji o wywołaniach, to uprościłem strukturę do czegoś takiego:

.meva/
└── .plugins/
    └── .invocations/
        └── 20250828-202222/
            ├── invocation.log
            ├── stdout.log
            ├── stderr.log
            ├── post-execute-context.json
            └── pre-execute-context.json

@adamgracikowski

Copy link
Copy Markdown
Contributor Author

Zmiany:

  • Dodałem integrację pluginów z plikami konfiguracyjnymi (można wyłączyć wszystkie pluginy, wyłączyć logowanie do plików, a także zmienić timeout).
  • Dodałem timeout na wykonanie pluginów wraz z obsługą błędów.
  • Zaktualizowałem logikę poleceń związanych z config do nowszej wersji oraz dodałem wykonywanie pluginów dla tych poleceń.
  • Dodałem komentarze w całym crate plugins i w większości kodu zmienionego w engine czy cli.

Spostrzeżenia

Imo nie ma sensu wszystkich poleceń przystosowywać do pisania do nich pluginów, bo niektóre polecenia są mało istotne - tak jak na przykład ustawianie pary klucz : wartość w pliku konfiguracyjnym i ograniczyłbym się do ważniejszych poleceń (i ewentualnie na koniec jak starczy czasu podopisywał te wszystkie payload-y dla mało istotnych).

Co sądzisz?

Dodatkowo pomyślałem, żeby wrzucać sukcesywnie przykładowe skrypty w pythonie czy innym języku, które będą przykładami wykorzystania tych funkcjonalności.

Na przykład testowanie timeout-u można zaprezentować na takim pluginie timeout.py:

import time

for i in range(10):
    print(i, flush=True)
    time.sleep(0.1)

Myślę, że PR jest gotowa do review ✔️

@adamgracikowski
adamgracikowski marked this pull request as ready for review September 13, 2025 17:54
Comment thread engine/src/engine_container.rs Outdated
Comment thread engine/src/engine_container.rs
Comment thread cli/src/commands/ignore/subcommands/add.rs Outdated
Comment thread cli/src/commands/ignore/subcommands/add.rs Outdated
Comment thread cli/src/commands/plugins/subcommands/edit.rs Outdated
Comment thread cli/src/commands/plugins/subcommands/unregister.rs
Comment thread cli/src/commands/plugins/subcommands/unregister.rs Outdated
Comment thread engine/src/config/config_location.rs
Comment thread engine/src/init/handler.rs Outdated
Comment thread plugins/src/models/invocation/invocation_logger.rs

@adamgracikowski adamgracikowski left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jeszcze coś od siebie dodałem

Comment thread cli/src/commands/init.rs Outdated
Comment thread cli/src/commands/plugins/subcommands/edit.rs Outdated
Comment thread cli/src/commands/plugins/subcommands/list.rs Outdated
Comment thread cli/src/extensions/command/with_scope.rs
@adamgracikowski
adamgracikowski merged commit 44c9af9 into develop Sep 15, 2025
1 check passed
@adamgracikowski
adamgracikowski deleted the feature/command-plugins branch September 15, 2025 19:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants