soneta-mcp-skill-guide
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
# Skill zarządzania programem Soneta (enova365) przez MCP
|
||||
|
||||
## 1. Przepływ pracy (workflow MCP)
|
||||
|
||||
Narzędzia MCP `soneta_ui` są **zależne od siebie** — muszą być wywoływane w określonej sekwencji:
|
||||
|
||||
```
|
||||
get_modules → get_folders → navigate_to_folder → retrieve_list → focus_row / open_form → switch_form_page → update_field_value
|
||||
↓
|
||||
add_object → update_field_value
|
||||
```
|
||||
|
||||
### Zasady sekwencji
|
||||
|
||||
- `retrieve_list` wymaga wcześniejszego `navigate_to_folder`
|
||||
- `open_form(objectID)` wymaga `objectID` z odpowiedzi `retrieve_list`
|
||||
- `switch_form_page(pageID)` wymaga `pageID` z odpowiedzi `open_form`
|
||||
- `update_field_value` działa tylko na polach oznaczonych jako `edytowany`
|
||||
- `add_object` tworzy nowy obiekt w aktualnie nawigowanym folderze
|
||||
- `focus_row(objectID)` zaznacza wiersz na liście bez otwierania formularza
|
||||
|
||||
### Narzędzia eksploracyjne (niezależne)
|
||||
|
||||
- `get_modules` — lista modułów (punkt startowy)
|
||||
- `get_folders(programFolder)` — podfoldery danego modułu/folderu
|
||||
|
||||
## 2. Formaty danych (CultureInfo.InvariantCulture)
|
||||
|
||||
Wszystkie wartości przesyłane z/do programu muszą używać formatu InvariantCulture:
|
||||
|
||||
| Typ | Format | Przykład |
|
||||
|-----|--------|----------|
|
||||
| Date | `yyyy-MM-dd` | `2026-03-25` |
|
||||
| FromTo | `yyyy-MM-dd..yyyy-MM-dd` | `2026-01-01..2026-03-31` |
|
||||
| Bool | `Tak` / `Nie` | `Tak` |
|
||||
| Number | kropka dziesiętna | `1234.56` |
|
||||
| Filter | `["filterID=Wartość"]` | `["_Status=Aktywny", "_DataListy=2026-01-01.."]` |
|
||||
|
||||
|
||||
## Foldery w programie
|
||||
|
||||
| Intencja użytkownika | programFolder |
|
||||
|---|---|
|
||||
| terminarz, zadania do wykonania | `Terminarz` |
|
||||
| zarządzanie dokumentami, DMS | `DMS` |
|
||||
| procesy workflow | `Workflow` |
|
||||
|
||||
## 4. Typowe scenariusze krok po kroku
|
||||
|
||||
### Scenariusz A — Odczyt danych z listy
|
||||
|
||||
```
|
||||
1. navigate_to_folder(programFolder) — otwórz folder
|
||||
2. retrieve_list(filters?, pageNumber?) — pobierz dane (opcjonalnie z filtrami)
|
||||
3. Prezentuj wyniki użytkownikowi
|
||||
```
|
||||
|
||||
### Scenariusz B — Podgląd szczegółów obiektu
|
||||
|
||||
```
|
||||
1. navigate_to_folder(programFolder) — otwórz folder
|
||||
2. retrieve_list() — pobierz listę, znajdź objectID
|
||||
3. open_form(objectID) — otwórz formularz
|
||||
4. switch_form_page(pageID) — przełącz zakładkę jeśli potrzeba
|
||||
```
|
||||
|
||||
### Scenariusz C — Edycja istniejącego obiektu
|
||||
|
||||
```
|
||||
1. navigate_to_folder(programFolder) — otwórz folder
|
||||
2. retrieve_list() — znajdź obiekt
|
||||
3. open_form(objectID) — otwórz formularz
|
||||
4. switch_form_page(pageID) — przejdź do zakładki z polem (jeśli trzeba)
|
||||
5. update_field_value(["fieldID=value"]) — zmień wartość pola oznaczonego 'edytowany'
|
||||
```
|
||||
|
||||
### Scenariusz D — Dodawanie nowego obiektu
|
||||
|
||||
```
|
||||
1. navigate_to_folder(programFolder) — otwórz odpowiedni folder
|
||||
2. add_object() — utwórz nowy obiekt
|
||||
3. update_field_value(["fieldID=value"]) — wypełnij wymagane pola
|
||||
```
|
||||
|
||||
### Scenariusz E — Przeglądanie dużej listy (stronicowanie)
|
||||
|
||||
```
|
||||
1. navigate_to_folder(programFolder)
|
||||
2. retrieve_list(pageNumber=0) — pierwsza strona
|
||||
3. retrieve_list(pageNumber=1) — kolejna strona
|
||||
4. ... kontynuuj aż dane się wyczerpią
|
||||
```
|
||||
|
||||
### Scenariusz F — Nawigacja eksploracyjna (nieznany folder)
|
||||
|
||||
```
|
||||
1. get_modules() — lista modułów
|
||||
2. get_folders(moduł) — foldery w module
|
||||
3. get_folders(moduł/podfolder) — dalsze podfoldery (jeśli type=folders)
|
||||
4. navigate_to_folder(znaleziony_folder) — otwórz właściwy folder
|
||||
```
|
||||
|
||||
## 5. Zasady bezpieczeństwa
|
||||
|
||||
|
||||
- **Edytuj tylko pola** oznaczone jako `edytowany` — nie próbuj wymuszać zmian na polach tylko do odczytu
|
||||
- **Nie zakładaj filterID filtrów** — odczytaj je z odpowiedzi `retrieve_list`
|
||||
- **Nie zakładaj fieldID zmienianych pól** — odczytaj je z odpowiedzi `open_form`, `switch_form_page`, `add_object`
|
||||
- **Edytuj tylko pola na aktualnej zakładce** — odczytaj je z odpowiedzi `open_form`, `switch_form_page`, `add_object`. Żeby zmienić pole na innej zakładce użyj `switch_form_page`
|
||||
- **Stronicowanie** — używaj `pageNumber` do iteracji po dużych listach, nie próbuj pobrać wszystkiego naraz
|
||||
|
||||
## 6. Obsługa błędów
|
||||
|
||||
| Problem | Rozwiązanie |
|
||||
|---|---|
|
||||
| `navigate_to_folder` zwraca błąd | Sprawdź ścieżkę przez `get_folders` — ścieżka może być nieprawidłowa |
|
||||
| Lista jest pusta | Zasugeruj zmianę lub usunięcie filtrów |
|
||||
| Pole nie jest `edytowany` | Poinformuj użytkownika — pole jest tylko do odczytu |
|
||||
| Brak `objectID` | Najpierw wykonaj `retrieve_list` aby uzyskać identyfikatory |
|
||||
| Brak `pageID` | Najpierw wykonaj `open_form` aby uzyskać listę zakładek |
|
||||
| Nieznany folder | Użyj `get_modules` → `get_folders` do eksploracji struktury |
|
||||
|
||||
## 7. Parametr navigate_to_folder — newTab
|
||||
|
||||
- `newTab: true` — otwiera folder w nowej karcie (nie zamyka aktualnego widoku)
|
||||
- `newTab: false` (domyślnie) — zastępuje aktualny widok
|
||||
- Używaj `newTab: true` gdy użytkownik chce porównać dane z dwóch folderów
|
||||
Reference in New Issue
Block a user