From 898fd6a98d45caac4cbe9405f7144f2facd8f775 Mon Sep 17 00:00:00 2001 From: Marcin Wojas Date: Thu, 5 Mar 2026 15:31:31 +0100 Subject: [PATCH] Optymalizacja soneta-form-xml skill --- .../iteration-1/benchmark.json | 187 +++ .../pageform-z-gridem/eval_metadata.json | 15 + .../pageform-z-gridem/with_skill/grading.json | 50 + .../outputs/Zamowienie.Szczegoly.pageform.xml | 45 + .../with_skill/outputs/metrics.json | 4 + .../pageform-z-gridem/with_skill/timing.json | 5 + .../without_skill/grading.json | 50 + .../outputs/Zamowienie.Szczegoly.pageform.xml | 41 + .../without_skill/outputs/metrics.json | 4 + .../without_skill/timing.json | 5 + .../iteration-1/review.html | 1325 +++++++++++++++++ .../viewform-lista/eval_metadata.json | 14 + .../viewform-lista/with_skill/grading.json | 45 + .../outputs/Pracownicy.viewform.xml | 21 + .../with_skill/outputs/metrics.json | 4 + .../viewform-lista/with_skill/timing.json | 5 + .../viewform-lista/without_skill/grading.json | 45 + .../outputs/Pracownicy.viewform.xml | 13 + .../without_skill/outputs/metrics.json | 4 + .../viewform-lista/without_skill/timing.json | 5 + .../warunkowa-widocznosc/eval_metadata.json | 12 + .../with_skill/grading.json | 35 + .../outputs/Kontrahent.Kredyt.pageform.xml | 128 ++ .../with_skill/outputs/metrics.json | 4 + .../with_skill/timing.json | 5 + .../without_skill/grading.json | 35 + .../outputs/Kontrahent.Kredyt.pageform.xml | 167 +++ .../without_skill/outputs/metrics.json | 4 + .../without_skill/timing.json | 5 + soneta-form-xml-workspace/run_loop.log | 57 + .../skill-snapshot/SKILL.md | 734 +++++++++ .../skill-snapshot/assets/Adres.form.xml | 40 + .../Kontrahent.WarunkiHandlowe.pageform.xml | 62 + .../assets/MojObiekt.Ogolne.pageform.xml | 58 + .../skill-snapshot/evals/evals.json | 49 + .../skill-snapshot/references/ELEMENTS.md | 864 +++++++++++ .../skill-snapshot/references/Form.xsd | 1060 +++++++++++++ .../trigger-eval-approved.json | 78 + soneta-form-xml-workspace/trigger-eval.json | 82 + soneta-form-xml/SKILL.md | 698 +++------ soneta-form-xml/assets/Towary.viewform.xml | 64 + soneta-form-xml/evals/evals.json | 49 + soneta-form-xml/references/ELEMENTS.md | 25 + 43 files changed, 5677 insertions(+), 525 deletions(-) create mode 100644 soneta-form-xml-workspace/iteration-1/benchmark.json create mode 100644 soneta-form-xml-workspace/iteration-1/pageform-z-gridem/eval_metadata.json create mode 100644 soneta-form-xml-workspace/iteration-1/pageform-z-gridem/with_skill/grading.json create mode 100644 soneta-form-xml-workspace/iteration-1/pageform-z-gridem/with_skill/outputs/Zamowienie.Szczegoly.pageform.xml create mode 100644 soneta-form-xml-workspace/iteration-1/pageform-z-gridem/with_skill/outputs/metrics.json create mode 100644 soneta-form-xml-workspace/iteration-1/pageform-z-gridem/with_skill/timing.json create mode 100644 soneta-form-xml-workspace/iteration-1/pageform-z-gridem/without_skill/grading.json create mode 100644 soneta-form-xml-workspace/iteration-1/pageform-z-gridem/without_skill/outputs/Zamowienie.Szczegoly.pageform.xml create mode 100644 soneta-form-xml-workspace/iteration-1/pageform-z-gridem/without_skill/outputs/metrics.json create mode 100644 soneta-form-xml-workspace/iteration-1/pageform-z-gridem/without_skill/timing.json create mode 100644 soneta-form-xml-workspace/iteration-1/review.html create mode 100644 soneta-form-xml-workspace/iteration-1/viewform-lista/eval_metadata.json create mode 100644 soneta-form-xml-workspace/iteration-1/viewform-lista/with_skill/grading.json create mode 100644 soneta-form-xml-workspace/iteration-1/viewform-lista/with_skill/outputs/Pracownicy.viewform.xml create mode 100644 soneta-form-xml-workspace/iteration-1/viewform-lista/with_skill/outputs/metrics.json create mode 100644 soneta-form-xml-workspace/iteration-1/viewform-lista/with_skill/timing.json create mode 100644 soneta-form-xml-workspace/iteration-1/viewform-lista/without_skill/grading.json create mode 100644 soneta-form-xml-workspace/iteration-1/viewform-lista/without_skill/outputs/Pracownicy.viewform.xml create mode 100644 soneta-form-xml-workspace/iteration-1/viewform-lista/without_skill/outputs/metrics.json create mode 100644 soneta-form-xml-workspace/iteration-1/viewform-lista/without_skill/timing.json create mode 100644 soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/eval_metadata.json create mode 100644 soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/with_skill/grading.json create mode 100644 soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/with_skill/outputs/Kontrahent.Kredyt.pageform.xml create mode 100644 soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/with_skill/outputs/metrics.json create mode 100644 soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/with_skill/timing.json create mode 100644 soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/without_skill/grading.json create mode 100644 soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/without_skill/outputs/Kontrahent.Kredyt.pageform.xml create mode 100644 soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/without_skill/outputs/metrics.json create mode 100644 soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/without_skill/timing.json create mode 100644 soneta-form-xml-workspace/run_loop.log create mode 100644 soneta-form-xml-workspace/skill-snapshot/SKILL.md create mode 100644 soneta-form-xml-workspace/skill-snapshot/assets/Adres.form.xml create mode 100644 soneta-form-xml-workspace/skill-snapshot/assets/Kontrahent.WarunkiHandlowe.pageform.xml create mode 100644 soneta-form-xml-workspace/skill-snapshot/assets/MojObiekt.Ogolne.pageform.xml create mode 100644 soneta-form-xml-workspace/skill-snapshot/evals/evals.json create mode 100644 soneta-form-xml-workspace/skill-snapshot/references/ELEMENTS.md create mode 100644 soneta-form-xml-workspace/skill-snapshot/references/Form.xsd create mode 100644 soneta-form-xml-workspace/trigger-eval-approved.json create mode 100644 soneta-form-xml-workspace/trigger-eval.json create mode 100644 soneta-form-xml/assets/Towary.viewform.xml create mode 100644 soneta-form-xml/evals/evals.json diff --git a/soneta-form-xml-workspace/iteration-1/benchmark.json b/soneta-form-xml-workspace/iteration-1/benchmark.json new file mode 100644 index 0000000..a4aeab6 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/benchmark.json @@ -0,0 +1,187 @@ +{ + "metadata": { + "skill_name": "soneta-form-xml", + "skill_path": "/Users/marcin/d/Skills/soneta-form-xml", + "executor_model": "claude-sonnet-4-6", + "timestamp": "2026-03-05T12:00:00Z", + "evals_run": ["pageform-z-gridem", "viewform-lista", "warunkowa-widocznosc"], + "runs_per_configuration": 1 + }, + + "runs": [ + { + "eval_id": 1, + "eval_name": "pageform-z-gridem", + "configuration": "with_skill", + "run_number": 1, + "result": { + "pass_rate": 1.0, + "passed": 8, + "failed": 0, + "total": 8, + "time_seconds": 37.8, + "tokens": 32707, + "tool_calls": 9, + "errors": 0 + }, + "expectations": [ + {"text": "Plik zaczyna się od ", "passed": true, "evidence": "Poprawna deklaracja XML"}, + {"text": "DataForm ma Priority=\"10\"", "passed": true, "evidence": "Atrybut w elemencie root"}, + {"text": "Page ma DataContext=\"{DataSource}\"", "passed": true, "evidence": "Linia 8"}, + {"text": "Trzy grupy: Dane podstawowe, Warunki, Pozycje", "passed": true, "evidence": "Linie 10,17,30"}, + {"text": "Układ Row>Stack w grupie Warunki", "passed": true, "evidence": "Linie 18-28"}, + {"text": "Grid: IsToolbarVisible, EditInPlace, NewInPlace", "passed": true, "evidence": "Linie 31-35"}, + {"text": "Footer=Sum na Ilosc i Wartosc", "passed": true, "evidence": "Linie 38,40"}, + {"text": "Binding {NazwaPola}", "passed": true, "evidence": "EditValue we wszystkich polach"} + ] + }, + { + "eval_id": 1, + "eval_name": "pageform-z-gridem", + "configuration": "without_skill", + "run_number": 1, + "result": { + "pass_rate": 0.5, + "passed": 4, + "failed": 4, + "total": 8, + "time_seconds": 17.7, + "tokens": 4263, + "tool_calls": 3, + "errors": 0 + }, + "expectations": [ + {"text": "Plik zaczyna się od ", "passed": true, "evidence": "Poprawna deklaracja"}, + {"text": "DataForm ma Priority=\"10\"", "passed": false, "evidence": "Używa zamiast atrybutu"}, + {"text": "Page ma DataContext=\"{DataSource}\"", "passed": false, "evidence": "Brak Page i DataContext"}, + {"text": "Trzy grupy: Dane podstawowe, Warunki, Pozycje", "passed": false, "evidence": "Grupy z Name= zamiast CaptionHtml="}, + {"text": "Układ Row>Stack w grupie Warunki", "passed": true, "evidence": "Row>Stack obecne"}, + {"text": "Grid: IsToolbarVisible, EditInPlace, NewInPlace", "passed": true, "evidence": "Atrybuty obecne"}, + {"text": "Footer=Sum na Ilosc i Wartosc", "passed": true, "evidence": "Footer=Sum na Column"}, + {"text": "Binding {NazwaPola}", "passed": false, "evidence": "Brak EditValue — używa Name= na Control"} + ] + }, + { + "eval_id": 2, + "eval_name": "viewform-lista", + "configuration": "with_skill", + "run_number": 1, + "result": { + "pass_rate": 1.0, + "passed": 7, + "failed": 0, + "total": 7, + "time_seconds": 38.4, + "tokens": 34304, + "tool_calls": 10, + "errors": 0 + }, + "expectations": [ + {"text": "Poprawna deklaracja XML", "passed": true, "evidence": "Linia 1"}, + {"text": "xmlns='http://www.enova.pl/schema/form.xsd'", "passed": true, "evidence": "Poprawny namespace"}, + {"text": "Element Grid", "passed": true, "evidence": "Grid z ViewType=Folder"}, + {"text": "OrderBy='NazwiskoImie'", "passed": true, "evidence": "Linia 12"}, + {"text": "IsToolbarVisible i IsFilterRowVisible", "passed": true, "evidence": "Linie 10-11"}, + {"text": "6 pól: Kod, NazwiskoImie, NumerPracownika, Dzial, Stanowisko, DataZatrudnienia", "passed": true, "evidence": "Linie 13-18"}, + {"text": "Dzial ma Width='*'", "passed": true, "evidence": "Linia 16"} + ] + }, + { + "eval_id": 2, + "eval_name": "viewform-lista", + "configuration": "without_skill", + "run_number": 1, + "result": { + "pass_rate": 0.43, + "passed": 3, + "failed": 4, + "total": 7, + "time_seconds": 13.9, + "tokens": 3821, + "tool_calls": 3, + "errors": 0 + }, + "expectations": [ + {"text": "Poprawna deklaracja XML", "passed": true, "evidence": "Linia 1"}, + {"text": "xmlns='http://www.enova.pl/schema/form.xsd'", "passed": false, "evidence": "Błędny namespace: http://www.soneta.pl/viewform"}, + {"text": "Element Grid", "passed": false, "evidence": " lowercase — błędna nazwa elementu"}, + {"text": "OrderBy='NazwiskoImie'", "passed": false, "evidence": "defaultsort= zamiast OrderBy="}, + {"text": "IsToolbarVisible i IsFilterRowVisible", "passed": false, "evidence": "Atrybuty lowercase — błędna składnia"}, + {"text": "6 pól: Kod, NazwiskoImie, NumerPracownika, Dzial, Stanowisko, DataZatrudnienia", "passed": true, "evidence": " z właściwymi nazwami"}, + {"text": "Dzial ma Width='*'", "passed": true, "evidence": "width='*' na Dzial"} + ] + }, + { + "eval_id": 3, + "eval_name": "warunkowa-widocznosc", + "configuration": "with_skill", + "run_number": 1, + "result": { + "pass_rate": 1.0, + "passed": 5, + "failed": 0, + "total": 5, + "time_seconds": 72.7, + "tokens": 37262, + "tool_calls": 10, + "errors": 0 + }, + "expectations": [ + {"text": "Visibility='{?Pole=Wartość}'", "passed": true, "evidence": "Linia 30: {?TypKlienta=Korporacyjny}"}, + {"text": "OR: {?Status=Premium or Status=VIP}", "passed": true, "evidence": "Linia 48"}, + {"text": "Negacja: {?!Status=Aktywny}", "passed": true, "evidence": "Linia 65"}, + {"text": "Class='Collapsable' na Group", "passed": true, "evidence": "Linia 109"}, + {"text": "Renderable dla licencji", "passed": true, "evidence": "Linia 110: Renderable='{Licence.HAN}'"} + ] + }, + { + "eval_id": 3, + "eval_name": "warunkowa-widocznosc", + "configuration": "without_skill", + "run_number": 1, + "result": { + "pass_rate": 0.0, + "passed": 0, + "failed": 5, + "total": 5, + "time_seconds": 50.3, + "tokens": 5896, + "tool_calls": 3, + "errors": 0 + }, + "expectations": [ + {"text": "Visibility='{?Pole=Wartość}'", "passed": false, "evidence": "RowCondition= (nie istnieje) zamiast Visibility"}, + {"text": "OR: {?Status=Premium or Status=VIP}", "passed": false, "evidence": "SQL-like OR syntax zamiast {?... or ...}"}, + {"text": "Negacja: {?!Status=Aktywny}", "passed": false, "evidence": "NOT (...) zamiast {?!...}"}, + {"text": "Class='Collapsable' na Group", "passed": false, "evidence": "Collapsable='True' atrybut zamiast Class="}, + {"text": "Renderable dla licencji", "passed": false, "evidence": "Session.Features.IsAvailable() — błędna składnia"} + ] + } + ], + + "run_summary": { + "with_skill": { + "pass_rate": {"mean": 1.0, "stddev": 0.0, "min": 1.0, "max": 1.0}, + "time_seconds": {"mean": 49.6, "stddev": 18.1, "min": 37.8, "max": 72.7}, + "tokens": {"mean": 34758, "stddev": 2284, "min": 32707, "max": 37262} + }, + "without_skill": { + "pass_rate": {"mean": 0.31, "stddev": 0.22, "min": 0.0, "max": 0.5}, + "time_seconds": {"mean": 27.3, "stddev": 19.1, "min": 13.9, "max": 50.3}, + "tokens": {"mean": 4660, "stddev": 1080, "min": 3821, "max": 5896} + }, + "delta": { + "pass_rate": "+0.69", + "time_seconds": "+22.3", + "tokens": "+30098" + } + }, + + "notes": [ + "Skill daje 100% pass rate we wszystkich 3 ewalach vs 31% bez skilla — poprawa o 69 punktów procentowych", + "Bez skilla model halucynuje nieistniejące elementy XML: , , , , RowCondition=", + "Najsłabszy wynik bez skilla: warunkowa-widocznosc (0%) — model zna pojęcia ale ma zupełnie błędną składnię", + "Skill kosztuje więcej tokenów (30k vs 4.7k) i czasu (50s vs 27s) — uzasadnione biorąc pod uwagę czytanie SKILL.md i ELEMENTS.md", + "Asercja 'Poprawna deklaracja XML' zawsze przechodzi — mało dyskryminująca, ale utrzymana dla kompletności" + ] +} diff --git a/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/eval_metadata.json b/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/eval_metadata.json new file mode 100644 index 0000000..f17b477 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/eval_metadata.json @@ -0,0 +1,15 @@ +{ + "eval_id": 1, + "eval_name": "pageform-z-gridem", + "prompt": "Utwórz plik Zamowienie.Szczegoly.pageform.xml dla platformy enova365. Zakładka powinna zawierać:\n- Grupę 'Dane podstawowe' z polami: Numer (szerokość 20), DataZlozenia (szerokość 15), Kontrahent (szerokość *), Status (szerokość 15)\n- Grupę 'Warunki' z układem dwukolumnowym (Row > Stack): lewa kolumna ma SposobDostawy (20) i TerminDostawy (15), prawa kolumna ma SposobZaplaty (20) i TerminZaplaty (15)\n- Grupę 'Pozycje' z Grid (IsToolbarVisible, EditInPlace, NewInPlace) i kolumnami: Lp (5), Towar (*), Ilosc (10) z Footer=Sum, CenaJednostkowa (18), Wartosc (15) z Footer=Sum\nPriority zakładki: 10.", + "assertions": [ + "Plik zaczyna się od ", + "Element DataForm ma atrybut Priority=\"10\"", + "Element Page ma atrybut DataContext=\"{DataSource}\"", + "Są trzy elementy Group: 'Dane podstawowe', 'Warunki', 'Pozycje'", + "Układ dwukolumnowy w grupie Warunki używa Row zawierającego Stack", + "Element Grid ma atrybuty IsToolbarVisible=\"true\", EditInPlace=\"true\", NewInPlace=\"true\"", + "Pola Ilosc i Wartosc w Grid mają atrybut Footer=\"Sum\"", + "Binding pól używa składni {NazwaPola} w cudzysłowie" + ] +} diff --git a/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/with_skill/grading.json b/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/with_skill/grading.json new file mode 100644 index 0000000..2db2980 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/with_skill/grading.json @@ -0,0 +1,50 @@ +{ + "expectations": [ + { + "text": "Plik zaczyna się od ", + "passed": true, + "evidence": "Linia 1: " + }, + { + "text": "Element DataForm ma atrybut Priority=\"10\"", + "passed": true, + "evidence": "Linia 6: Priority=\"10\" w elemencie DataForm" + }, + { + "text": "Element Page ma atrybut DataContext=\"{DataSource}\"", + "passed": true, + "evidence": "Linia 8: " + }, + { + "text": "Są trzy elementy Group: 'Dane podstawowe', 'Warunki', 'Pozycje'", + "passed": true, + "evidence": "Linie 10, 17, 30: Group CaptionHtml=\"Dane podstawowe\", \"Warunki\", \"Pozycje\"" + }, + { + "text": "Układ dwukolumnowy w grupie Warunki używa Row zawierającego Stack", + "passed": true, + "evidence": "Linie 18-28: SposobDostawy, TerminDostawySposobZaplaty, TerminZaplaty" + }, + { + "text": "Element Grid ma atrybuty IsToolbarVisible=\"true\", EditInPlace=\"true\", NewInPlace=\"true\"", + "passed": true, + "evidence": "Linie 31-35: Grid z IsToolbarVisible=\"true\" EditInPlace=\"true\" NewInPlace=\"true\"" + }, + { + "text": "Pola Ilosc i Wartosc w Grid mają atrybut Footer=\"Sum\"", + "passed": true, + "evidence": "Linia 38: Footer=\"Sum\" na Ilosc; Linia 40: Footer=\"Sum\" na Wartosc" + }, + { + "text": "Binding pól używa składni {NazwaPola} w cudzysłowie", + "passed": true, + "evidence": "EditValue=\"{Numer}\", EditValue=\"{DataZlozenia}\" itp. — poprawna składnia" + } + ], + "summary": { + "passed": 8, + "failed": 0, + "total": 8, + "pass_rate": 1.0 + } +} diff --git a/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/with_skill/outputs/Zamowienie.Szczegoly.pageform.xml b/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/with_skill/outputs/Zamowienie.Szczegoly.pageform.xml new file mode 100644 index 0000000..5a41ddd --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/with_skill/outputs/Zamowienie.Szczegoly.pageform.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/with_skill/outputs/metrics.json b/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/with_skill/outputs/metrics.json new file mode 100644 index 0000000..201d1fb --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/with_skill/outputs/metrics.json @@ -0,0 +1,4 @@ +{ + "files_created": ["Zamowienie.Szczegoly.pageform.xml"], + "errors_encountered": 0 +} diff --git a/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/with_skill/timing.json b/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/with_skill/timing.json new file mode 100644 index 0000000..3813cb3 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/with_skill/timing.json @@ -0,0 +1,5 @@ +{ + "total_tokens": 32707, + "duration_ms": 37772, + "total_duration_seconds": 37.8 +} diff --git a/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/without_skill/grading.json b/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/without_skill/grading.json new file mode 100644 index 0000000..e8c67a5 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/without_skill/grading.json @@ -0,0 +1,50 @@ +{ + "expectations": [ + { + "text": "Plik zaczyna się od ", + "passed": true, + "evidence": "Linia 1: " + }, + { + "text": "Element DataForm ma atrybut Priority=\"10\"", + "passed": false, + "evidence": "Użyto zamiast , a Priority jako child element 10 zamiast atrybutu" + }, + { + "text": "Element Page ma atrybut DataContext=\"{DataSource}\"", + "passed": false, + "evidence": "Brak elementu Page i DataContext. Użyto zamiast " + }, + { + "text": "Są trzy elementy Group: 'Dane podstawowe', 'Warunki', 'Pozycje'", + "passed": false, + "evidence": "Grupy istnieją ale z atrybutem Name zamiast CaptionHtml i wewnątrz błędnej struktury " + }, + { + "text": "Układ dwukolumnowy w grupie Warunki używa Row zawierającego Stack", + "passed": true, + "evidence": "Linie 15-25: ...... — poprawny layout" + }, + { + "text": "Element Grid ma atrybuty IsToolbarVisible=\"true\", EditInPlace=\"true\", NewInPlace=\"true\"", + "passed": true, + "evidence": "Linia 29: Grid z IsToolbarVisible=\"true\" EditInPlace=\"true\" NewInPlace=\"true\"" + }, + { + "text": "Pola Ilosc i Wartosc w Grid mają atrybut Footer=\"Sum\"", + "passed": true, + "evidence": "Linie 33, 35: Footer=\"Sum\" na Column Ilosc i Wartosc" + }, + { + "text": "Binding pól używa składni {NazwaPola} w cudzysłowie", + "passed": false, + "evidence": "Brak atrybutu EditValue. Używa bez bindowania danych" + } + ], + "summary": { + "passed": 4, + "failed": 4, + "total": 8, + "pass_rate": 0.5 + } +} diff --git a/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/without_skill/outputs/Zamowienie.Szczegoly.pageform.xml b/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/without_skill/outputs/Zamowienie.Szczegoly.pageform.xml new file mode 100644 index 0000000..739df34 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/without_skill/outputs/Zamowienie.Szczegoly.pageform.xml @@ -0,0 +1,41 @@ + + + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/without_skill/outputs/metrics.json b/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/without_skill/outputs/metrics.json new file mode 100644 index 0000000..201d1fb --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/without_skill/outputs/metrics.json @@ -0,0 +1,4 @@ +{ + "files_created": ["Zamowienie.Szczegoly.pageform.xml"], + "errors_encountered": 0 +} diff --git a/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/without_skill/timing.json b/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/without_skill/timing.json new file mode 100644 index 0000000..9736636 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/pageform-z-gridem/without_skill/timing.json @@ -0,0 +1,5 @@ +{ + "total_tokens": 4263, + "duration_ms": 17660, + "total_duration_seconds": 17.7 +} diff --git a/soneta-form-xml-workspace/iteration-1/review.html b/soneta-form-xml-workspace/iteration-1/review.html new file mode 100644 index 0000000..d245599 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/review.html @@ -0,0 +1,1325 @@ + + + + + + Eval Review + + + + + + + +
+
+
+

Eval Review:

+
Review each output and leave feedback below. Navigate with arrow keys or buttons. When done, copy feedback and paste into Claude Code.
+
+
+
+ + + + + +
+
+ +
+
Prompt
+
+
+
+
+ + +
+
Output
+
+
No output files found
+
+
+ + + + + + + + +
+
Your Feedback
+
+ + + +
+
+
+ + +
+ + +
+
+
No benchmark data available. Run a benchmark to see quantitative results here.
+
+
+
+ + +
+
+

Review Complete

+

Your feedback has been saved. Go back to your Claude Code session and tell Claude you're done reviewing.

+
+ +
+
+
+ + +
+ + + + diff --git a/soneta-form-xml-workspace/iteration-1/viewform-lista/eval_metadata.json b/soneta-form-xml-workspace/iteration-1/viewform-lista/eval_metadata.json new file mode 100644 index 0000000..086a91d --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/viewform-lista/eval_metadata.json @@ -0,0 +1,14 @@ +{ + "eval_id": 2, + "eval_name": "viewform-lista", + "prompt": "Stwórz plik Pracownicy.viewform.xml dla widoku listy pracowników w enova365. Widok listy powinien zawierać kolumny: Kod (8), NazwiskoImie (30), NumerPracownika (20), Dzial (*), Stanowisko (20), DataZatrudnienia (15). Domyślne sortowanie po NazwiskoImie. Dodaj IsToolbarVisible i IsFilterRowVisible. Zachowaj właściwą strukturę pliku viewform.xml.", + "assertions": [ + "Plik ma poprawną deklarację XML", + "Element DataForm ma xmlns=\"http://www.enova.pl/schema/form.xsd\"", + "Jest element Grid z EditValue lub bez (dla widoku listy)", + "Grid ma atrybut OrderBy=\"NazwiskoImie\"", + "Grid ma IsToolbarVisible=\"true\" i IsFilterRowVisible=\"true\"", + "Są kolumny Field dla: Kod, NazwiskoImie, NumerPracownika, Dzial, Stanowisko, DataZatrudnienia", + "Pole Dzial ma Width=\"*\"" + ] +} diff --git a/soneta-form-xml-workspace/iteration-1/viewform-lista/with_skill/grading.json b/soneta-form-xml-workspace/iteration-1/viewform-lista/with_skill/grading.json new file mode 100644 index 0000000..538ca6a --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/viewform-lista/with_skill/grading.json @@ -0,0 +1,45 @@ +{ + "expectations": [ + { + "text": "Plik ma poprawną deklarację XML", + "passed": true, + "evidence": "Linia 1: " + }, + { + "text": "Element DataForm ma xmlns=\"http://www.enova.pl/schema/form.xsd\"", + "passed": true, + "evidence": "Linia 5: xmlns=\"http://www.enova.pl/schema/form.xsd\" — poprawny namespace" + }, + { + "text": "Jest element Grid z EditValue lub bez (dla widoku listy)", + "passed": true, + "evidence": "Linia 9: " + }, + { + "text": "Grid ma atrybut OrderBy=\"NazwiskoImie\"", + "passed": true, + "evidence": "Linia 12: OrderBy=\"NazwiskoImie\"" + }, + { + "text": "Grid ma IsToolbarVisible=\"true\" i IsFilterRowVisible=\"true\"", + "passed": true, + "evidence": "Linie 10-11: IsToolbarVisible=\"true\" IsFilterRowVisible=\"true\"" + }, + { + "text": "Są kolumny Field dla: Kod, NazwiskoImie, NumerPracownika, Dzial, Stanowisko, DataZatrudnienia", + "passed": true, + "evidence": "Linie 13-18: 6 elementów Field z EditValue dla każdego z wymienionych pól" + }, + { + "text": "Pole Dzial ma Width=\"*\"", + "passed": true, + "evidence": "Linia 16: " + } + ], + "summary": { + "passed": 7, + "failed": 0, + "total": 7, + "pass_rate": 1.0 + } +} diff --git a/soneta-form-xml-workspace/iteration-1/viewform-lista/with_skill/outputs/Pracownicy.viewform.xml b/soneta-form-xml-workspace/iteration-1/viewform-lista/with_skill/outputs/Pracownicy.viewform.xml new file mode 100644 index 0000000..73afadc --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/viewform-lista/with_skill/outputs/Pracownicy.viewform.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + diff --git a/soneta-form-xml-workspace/iteration-1/viewform-lista/with_skill/outputs/metrics.json b/soneta-form-xml-workspace/iteration-1/viewform-lista/with_skill/outputs/metrics.json new file mode 100644 index 0000000..4e6e383 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/viewform-lista/with_skill/outputs/metrics.json @@ -0,0 +1,4 @@ +{ + "files_created": ["Pracownicy.viewform.xml"], + "errors_encountered": 0 +} diff --git a/soneta-form-xml-workspace/iteration-1/viewform-lista/with_skill/timing.json b/soneta-form-xml-workspace/iteration-1/viewform-lista/with_skill/timing.json new file mode 100644 index 0000000..bf1ef87 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/viewform-lista/with_skill/timing.json @@ -0,0 +1,5 @@ +{ + "total_tokens": 34304, + "duration_ms": 38406, + "total_duration_seconds": 38.4 +} diff --git a/soneta-form-xml-workspace/iteration-1/viewform-lista/without_skill/grading.json b/soneta-form-xml-workspace/iteration-1/viewform-lista/without_skill/grading.json new file mode 100644 index 0000000..5c18713 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/viewform-lista/without_skill/grading.json @@ -0,0 +1,45 @@ +{ + "expectations": [ + { + "text": "Plik ma poprawną deklarację XML", + "passed": true, + "evidence": "Linia 1: " + }, + { + "text": "Element DataForm ma xmlns=\"http://www.enova.pl/schema/form.xsd\"", + "passed": false, + "evidence": "Użyto zamiast " + }, + { + "text": "Jest element Grid z EditValue lub bez (dla widoku listy)", + "passed": false, + "evidence": "Użyto (lowercase) zamiast . Elementy XML są case-sensitive — to błąd." + }, + { + "text": "Grid ma atrybut OrderBy=\"NazwiskoImie\"", + "passed": false, + "evidence": "Użyto defaultsort=\"NazwiskoImie\" zamiast OrderBy=\"NazwiskoImie\"" + }, + { + "text": "Grid ma IsToolbarVisible=\"true\" i IsFilterRowVisible=\"true\"", + "passed": false, + "evidence": "Użyto istoolbarvisible=\"true\" isfilterrowvisible=\"true\" (lowercase) zamiast PascalCase" + }, + { + "text": "Są kolumny Field dla: Kod, NazwiskoImie, NumerPracownika, Dzial, Stanowisko, DataZatrudnienia", + "passed": true, + "evidence": "6 elementów z właściwymi nazwami — poprawne pola, choć element to nie " + }, + { + "text": "Pole Dzial ma Width=\"*\"", + "passed": true, + "evidence": "Linia 8: — prawidłowe *" + } + ], + "summary": { + "passed": 3, + "failed": 4, + "total": 7, + "pass_rate": 0.43 + } +} diff --git a/soneta-form-xml-workspace/iteration-1/viewform-lista/without_skill/outputs/Pracownicy.viewform.xml b/soneta-form-xml-workspace/iteration-1/viewform-lista/without_skill/outputs/Pracownicy.viewform.xml new file mode 100644 index 0000000..f3bcbc4 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/viewform-lista/without_skill/outputs/Pracownicy.viewform.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/soneta-form-xml-workspace/iteration-1/viewform-lista/without_skill/outputs/metrics.json b/soneta-form-xml-workspace/iteration-1/viewform-lista/without_skill/outputs/metrics.json new file mode 100644 index 0000000..4e6e383 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/viewform-lista/without_skill/outputs/metrics.json @@ -0,0 +1,4 @@ +{ + "files_created": ["Pracownicy.viewform.xml"], + "errors_encountered": 0 +} diff --git a/soneta-form-xml-workspace/iteration-1/viewform-lista/without_skill/timing.json b/soneta-form-xml-workspace/iteration-1/viewform-lista/without_skill/timing.json new file mode 100644 index 0000000..a141e4c --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/viewform-lista/without_skill/timing.json @@ -0,0 +1,5 @@ +{ + "total_tokens": 3821, + "duration_ms": 13888, + "total_duration_seconds": 13.9 +} diff --git a/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/eval_metadata.json b/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/eval_metadata.json new file mode 100644 index 0000000..6453235 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/eval_metadata.json @@ -0,0 +1,12 @@ +{ + "eval_id": 3, + "eval_name": "warunkowa-widocznosc", + "prompt": "Pokaż jak w pageform.xml enova365 zastosować warunkową widoczność pól używając wyrażeń RowCondition. Stwórz przykładowy plik Kontrahent.Kredyt.pageform.xml z następującymi wzorcami:\n1. Pole 'LimitKredytu' widoczne tylko gdy TypKlienta='Korporacyjny'\n2. Pole 'WarunkiSpecjalne' widoczne gdy Status='Premium' LUB Status='VIP'\n3. Pole 'OstrzezenieBranze' widoczne gdy NIE Status='Aktywny'\n4. Przycisk Command widoczny gdy ObrotyRoczne > 0 (użyj WorkCondition lub własność bool)\n5. Cała Grupa 'Dane zaawansowane' zwijalna (Collapsable) z Renderable uzależnionym od licencji", + "assertions": [ + "Użyto składni Visibility=\"{?Pole=Wartość}\" dla warunku równości", + "Użyto składni OR dla wielu wartości: {?Status=Premium or Status=VIP}", + "Użyto negacji: {?!Status=Aktywny}", + "Klasa Collapsable jest zastosowana do grupy", + "Atrybut Renderable jest użyty dla warunku licencji" + ] +} diff --git a/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/with_skill/grading.json b/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/with_skill/grading.json new file mode 100644 index 0000000..f73b269 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/with_skill/grading.json @@ -0,0 +1,35 @@ +{ + "expectations": [ + { + "text": "Użyto składni Visibility=\"{?Pole=Wartość}\" dla warunku równości", + "passed": true, + "evidence": "Linia 30: Visibility=\"{?TypKlienta=Korporacyjny}\" — poprawna składnia RowCondition" + }, + { + "text": "Użyto składni OR dla wielu wartości: {?Status=Premium or Status=VIP}", + "passed": true, + "evidence": "Linia 48: Visibility=\"{?Status=Premium or Status=VIP}\" — poprawny operator or" + }, + { + "text": "Użyto negacji: {?!Status=Aktywny}", + "passed": true, + "evidence": "Linia 65: Visibility=\"{?!Status=Aktywny}\" — poprawna negacja z !" + }, + { + "text": "Klasa Collapsable jest zastosowana do grupy", + "passed": true, + "evidence": "Linia 109: " + }, + { + "text": "Atrybut Renderable jest użyty dla warunku licencji", + "passed": true, + "evidence": "Linia 110: Renderable=\"{Licence.HAN}\" — licencja HAN jako warunek renderowania" + } + ], + "summary": { + "passed": 5, + "failed": 0, + "total": 5, + "pass_rate": 1.0 + } +} diff --git a/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/with_skill/outputs/Kontrahent.Kredyt.pageform.xml b/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/with_skill/outputs/Kontrahent.Kredyt.pageform.xml new file mode 100644 index 0000000..28799bf --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/with_skill/outputs/Kontrahent.Kredyt.pageform.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/with_skill/outputs/metrics.json b/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/with_skill/outputs/metrics.json new file mode 100644 index 0000000..a6b3d43 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/with_skill/outputs/metrics.json @@ -0,0 +1,4 @@ +{ + "files_created": ["Kontrahent.Kredyt.pageform.xml"], + "errors_encountered": 0 +} diff --git a/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/with_skill/timing.json b/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/with_skill/timing.json new file mode 100644 index 0000000..cdebad0 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/with_skill/timing.json @@ -0,0 +1,5 @@ +{ + "total_tokens": 37262, + "duration_ms": 72689, + "total_duration_seconds": 72.7 +} diff --git a/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/without_skill/grading.json b/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/without_skill/grading.json new file mode 100644 index 0000000..2ce6a9e --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/without_skill/grading.json @@ -0,0 +1,35 @@ +{ + "expectations": [ + { + "text": "Użyto składni Visibility=\"{?Pole=Wartość}\" dla warunku równości", + "passed": false, + "evidence": "Użyto RowCondition=\"Kontrahent.TypKlienta = 'Korporacyjny'\" (nie istniejący atrybut) zamiast Visibility=\"{?...}\"" + }, + { + "text": "Użyto składni OR dla wielu wartości: {?Status=Premium or Status=VIP}", + "passed": false, + "evidence": "Użyto RowCondition=\"... OR ...\" (SQL-like syntax) zamiast Visibility=\"{?... or ...}\"" + }, + { + "text": "Użyto negacji: {?!Status=Aktywny}", + "passed": false, + "evidence": "Użyto RowCondition=\"NOT (...)\" zamiast Visibility=\"{?!...}\"" + }, + { + "text": "Klasa Collapsable jest zastosowana do grupy", + "passed": false, + "evidence": "Użyto Collapsable=\"True\" jako atrybut zamiast Class=\"Collapsable\"" + }, + { + "text": "Atrybut Renderable jest użyty dla warunku licencji", + "passed": false, + "evidence": "Użyto Renderable=\"Session.Features.IsAvailable(...)\" — błędna składnia wyrażenia, nie jest to format {Licence.X}" + } + ], + "summary": { + "passed": 0, + "failed": 5, + "total": 5, + "pass_rate": 0.0 + } +} diff --git a/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/without_skill/outputs/Kontrahent.Kredyt.pageform.xml b/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/without_skill/outputs/Kontrahent.Kredyt.pageform.xml new file mode 100644 index 0000000..ffc1f16 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/without_skill/outputs/Kontrahent.Kredyt.pageform.xml @@ -0,0 +1,167 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/without_skill/outputs/metrics.json b/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/without_skill/outputs/metrics.json new file mode 100644 index 0000000..a6b3d43 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/without_skill/outputs/metrics.json @@ -0,0 +1,4 @@ +{ + "files_created": ["Kontrahent.Kredyt.pageform.xml"], + "errors_encountered": 0 +} diff --git a/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/without_skill/timing.json b/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/without_skill/timing.json new file mode 100644 index 0000000..bc75e84 --- /dev/null +++ b/soneta-form-xml-workspace/iteration-1/warunkowa-widocznosc/without_skill/timing.json @@ -0,0 +1,5 @@ +{ + "total_tokens": 5896, + "duration_ms": 50293, + "total_duration_seconds": 50.3 +} diff --git a/soneta-form-xml-workspace/run_loop.log b/soneta-form-xml-workspace/run_loop.log new file mode 100644 index 0000000..2c7e8ef --- /dev/null +++ b/soneta-form-xml-workspace/run_loop.log @@ -0,0 +1,57 @@ +Split: 13 train, 6 test (holdout=0.4) + +============================================================ +Iteration 1/5 +Description: Tworzenie plików form.xml opisujących formularze, zakładki i widoki UI dla platformy enova365/Soneta Enterprise. Używaj gdy użytkownik prosi o utworzenie zakładki formularza (pageform.xml), widoku listy (viewform.xml), gridform.xml, lookupform.xml lub form.xml — albo gdy pyta o składnię, elementy, bindowanie, warunkową widoczność, Appearance lub układ UI enova365. Trigger także gdy użytkownik pokazuje lub pyta o pliki XML z elementami DataForm, Page, Group, Grid, Field, Row, Stack, Flow, Command, Include dla enova365. +============================================================ +Train: 15/39 correct, precision=100% recall=0% accuracy=38% (38.7s) + [FAIL] rate=0/3 expected=True: chcę zrobić Appearance warunkowe formatowanie wierszy w Grid + [FAIL] rate=0/3 expected=True: potrzebuję lookupform.xml dla wyboru Towaru z kolumnami Kod + [FAIL] rate=0/3 expected=True: jak używać DataContext i EditValue żeby wyświetlić pola zagn + [FAIL] rate=0/3 expected=True: jak ukryć pole w form.xml enova365 gdy Status nie jest równy + [FAIL] rate=0/3 expected=True: zrób mi zakładkę Towar.Ogolne.pageform.xml z grupą 'Dane pod + [FAIL] rate=0/3 expected=True: utwórz zakładkę pageform.xml dla obiektu Dokument z polami N + [FAIL] rate=0/3 expected=True: jak zrobić widok listy viewform.xml dla Kontrahentów z kolum + [FAIL] rate=0/3 expected=True: jak zmodyfikować istniejący pageform.xml — chcę dodać nowe p + [PASS] rate=0/3 expected=False: jak skonfigurować business.xml dla nowego modułu? potrzebuję + [PASS] rate=0/3 expected=False: zrób mi worker C# który liczy saldo kontrahenta i eksponuje + [PASS] rate=0/3 expected=False: jak skonfigurować uprawnienia RightName i RightContext dla m + [PASS] rate=0/3 expected=False: napisz mi metodę w C# która oblicza VAT dla pozycji faktury + [PASS] rate=0/3 expected=False: jak zbudować API REST w ASP.NET Core do pobierania danych ko +Test : 6/18 correct, precision=100% recall=0% accuracy=33% (0.0s) + [FAIL] rate=0/3 expected=True: co to Class Collapsable w enova365? chcę zwinąć grupę filtró + [FAIL] rate=0/3 expected=True: jak dodać Grid z IsToolbarVisible EditInPlace NewInPlace i F + [FAIL] rate=0/3 expected=True: potrzebuję plik Adres.form.xml jako współdzielony fragment z + [FAIL] rate=0/3 expected=True: jak w viewform.xml dodać Flow jako panel filtrów nad gridem? + [PASS] rate=0/3 expected=False: jak zarejestrować FolderViewAttribute i WorkerAttribute w en + [PASS] rate=0/3 expected=False: zrób raport RDLC pokazujący listę faktur z podsumowaniem + +Improving description... +Traceback (most recent call last): + File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/runpy.py", line 196, in _run_module_as_main + return _run_code(code, main_globals, None, + File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/runpy.py", line 86, in _run_code + exec(code, run_globals) + File "/Users/marcin/.claude/skills/skill-creator/scripts/run_loop.py", line 332, in + main() + File "/Users/marcin/.claude/skills/skill-creator/scripts/run_loop.py", line 297, in main + output = run_loop( + File "/Users/marcin/.claude/skills/skill-creator/scripts/run_loop.py", line 202, in run_loop + new_description = improve_description( + File "/Users/marcin/.claude/skills/skill-creator/scripts/improve_description.py", line 114, in improve_description + response = client.messages.create( + File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/anthropic/_utils/_utils.py", line 282, in wrapper + return func(*args, **kwargs) + File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/anthropic/resources/messages/messages.py", line 996, in create + return self._post( + File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/anthropic/_base_client.py", line 1364, in post + return cast(ResponseT, self.request(cast_to, opts, stream=stream, stream_cls=stream_cls)) + File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/anthropic/_base_client.py", line 1058, in request + request = self._build_request(options, retries_taken=retries_taken) + File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/anthropic/_base_client.py", line 521, in _build_request + headers = self._build_headers(options, retries_taken=retries_taken) + File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/anthropic/_base_client.py", line 451, in _build_headers + self._validate_headers(headers_dict, custom_headers) + File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/anthropic/_client.py", line 196, in _validate_headers + raise TypeError( +TypeError: "Could not resolve authentication method. Expected either api_key or auth_token to be set. Or for one of the `X-Api-Key` or `Authorization` headers to be explicitly omitted" diff --git a/soneta-form-xml-workspace/skill-snapshot/SKILL.md b/soneta-form-xml-workspace/skill-snapshot/SKILL.md new file mode 100644 index 0000000..f783f30 --- /dev/null +++ b/soneta-form-xml-workspace/skill-snapshot/SKILL.md @@ -0,0 +1,734 @@ +--- +name: soneta-form-xml +description: Tworzenie plików form.xml opisujących formularze, zakładki i widoki UI dla platformy enova365/Soneta Enterprise. Używaj gdy użytkownik prosi o utworzenie zakładki formularza (pageform.xml), widoku listy (viewform.xml), formularza (form.xml), lookupu (lookupform.xml), lub gdy pyta o strukturę i składnię plików form.xml dla enova365. +--- + +# Soneta Form XML - Formularze UI + +Skill do tworzenia plików XML definiujących interfejs użytkownika w systemie enova365/Soneta Enterprise. + +## Typy plików formularzy + +| Typ pliku | Wzorzec nazwy | Przeznaczenie | +|-----------|---------------|---------------| +| **pageform.xml** | `{DataType}.{PageName}.pageform.xml` | Zakładka formularza edycji obiektu | +| **viewform.xml** | `{NazwaWidoku}.viewform.xml` | Widok listy zarejestrowanej jako folder (listy główne) | +| **gridform.xml** | `{IdentyfikatorListy}.gridform.xml` | Indywidualne ustawienia listy na formularzu | +| **lookupform.xml** | `{NazwaPodpowiedzi}.lookupform.xml` | Lista wyboru (lookup) | +| **form.xml** | `{Nazwa}.form.xml` | Współdzielony fragment UI (include) | + +### Format nazwy pageform.xml + +Nazwa pliku składa się z 4 części rozdzielonych kropkami: + +``` +{DataType}.{PageName}.pageform.xml +``` + +- **DataType** - typ danych, dla którego definiowana jest zakładka (np. `Towar`, `Kontrahent`, `DokumentHandlowy`) +- **PageName** - nazwa zakładki (np. `Ogolne`, `Dodatkowe`, `Adresy`) +- **pageform.xml** - stały sufiks + +**Przykłady:** +- `Towar.Ogolne.pageform.xml` +- `Towar.Dodatkowe.pageform.xml` +- `Kontrahent.Adresy.pageform.xml` +- `DokumentHandlowy.Pozycje.pageform.xml` + +### Format nazwy viewform.xml + +Nazwa pliku składa się z 3 części rozdzielonych kropkami: + +``` +{NazwaWidoku}.viewform.xml +``` + +**Przykłady:** +- `Towary.viewform.xml` +- `Kontrahenci.viewform.xml` +- `DokumentyHandlowe.viewform.xml` + +### Format nazwy gridform.xml + +Nazwa pliku składa się z 3 części rozdzielonych kropkami: + +``` +{IdentyfikatorListy}.gridform.xml +``` + +**Przykłady:** +- `PozycjeDokumentu.gridform.xml` +- `RachunkiBankowe.gridform.xml` + +### Format nazwy lookupform.xml + +Nazwa pliku składa się z 3 części rozdzielonych kropkami: + +``` +{NazwaPodpowiedzi}.lookupform.xml +``` + +**Przykłady:** +- `Towary.lookupform.xml` +- `Kontrahenci.lookupform.xml` + +## Hierarchia elementów XML + +Elementy XML dzielą się na trzy grupy dziedziczące po `uiElement`: + +1. **Elementy proste** - Field, Label, Command, Gap, Html, GroupBy, Axis +2. **Kontenery elementów** - Group, Stack, Row, Flow, Bar, Dashboard, Include, Page (dziedziczą po `ContainerElement`) +3. **Kolekcje** - Grid, Cards, Scheduler, Chart, Diagram, Pivot (dziedziczą po `CollectionElement`) + +## Struktura dokumentu + +Każdy plik formularza zaczyna się od deklaracji XML i elementu głównego `DataForm`: + +```xml + + + + +``` + +### Atrybuty DataForm + +| Atrybut | Opis | +|---------|------| +| `Priority` | Kolejność zakładek (domyślnie 100, niższa = wcześniej) | +| `RightName` | Opcjonalny. Nazwa uprawnienia do zakładki (tylko gdy inna niż standardowa) | +| `Contexts` | Warunki licencyjne, np. `"Licence.HAN \| Licence.FA"` (nie bindowane) | +| `ViewType` | Typ widoku: `None`, `Dialog`, `Form`, `Folder` | +| `Mode` | Tryb: `None`, `Form`, `Folder`, `Wizard`, `Modal`, `Popup`, `Frame` | +| `DataType` | Opcjonalny. Pełne określenie typu danych (wymagany tylko gdy nazwa pliku nie określa jednoznacznie typu), np. `"Soneta.Handel.DokumentHandlowy,Soneta.Handel"` | + +## Wspólne atrybuty elementów + +Następujące atrybuty mogą być użyte w **dowolnym** elemencie form.xml: + +| Atrybut | Opis | +|---------|------| +| `Name` | Identyfikator elementu, który można wykorzystać w kodzie C# | +| `Class` | Klasy stylów (lista wartości oddzielonych spacją) | +| `DataContext` | Zmienia kontekst danych dla elementu i wszystkich jego elementów podrzędnych | +| `Visibility` | Warunek widoczności (bindowalne z logiką biznesową) | +| `Renderable` | Czy element ma być dostępny. Wyrażenie liczone **raz** przy logowaniu operatora - optymalne dla warunków zależnych od środowiska, licencji i innych parametrów niezmiennych w trakcie sesji | + +### Atrybut CaptionHtml + +Atrybut `CaptionHtml` występuje w elementach: `Label`, `Field`, `Group`, `Page`, `Command` i innych. + +Może zawierać: +- Tekst etykiety (w formacie HTML) +- Wyrażenia bindowane w klamrach: `{wyrażenie}` - wartość tekstowa jest automatycznie kodowana do HTML +- Wyrażenia zwracające kod HTML: `{WłaściwośćHtml}` - nazwa musi mieć sufiks `Html`, wtedy wartość nie jest kodowana +- Podwójne klamry dla literalnych znaków: `{{` → `{`, `}}` → `}` + +**Specjalne przypadki w `Field`:** +- Brak atrybutu → automatyczna etykieta wyliczana na podstawie danych +- `CaptionHtml=" "` (spacja) → pusta etykieta (miejsce na etykietę zostaje zachowane) +- `CaptionHtml=""` (pusty) → brak etykiety (pole bez miejsca na etykietę) + +**Alternatywa:** Zamiast `CaptionHtml` można użyć `CaptionMarkdown` dla etykiet w formacie Markdown. + +## Elementy kontenerowe + +### Page - Zakładka + +Główny kontener dla zawartości zakładki: + +```xml + + + +``` + +| Atrybut | Opis | +|---------|------| +| `Name` | Opcjonalny. Unikalny identyfikator zakładki | +| `CaptionHtml` | Tytuł zakładki. Może zawierać `/` do grupowania zakładek (np. `"Dokumenty/Faktury"`) | +| `DataContext` | Źródło danych. `{DataSource}` oznacza obiekt edytowany na zakładce, ale można wskazać inne dane | +| `Visibility` | Wyrażenie warunkowe widoczności (bindowalne) | +| `Renderable` | Czy zakładka ma być dostępna. Wyrażenie liczone raz przy logowaniu - optymalne dla warunków zależnych od środowiska, licencji itp. | +| `Key` | Skrót klawiaturowy wywołujący zakładkę formularza | +| `GroupIcon` | Ikona grupy zakładek | + +### Zasada budowania zakładki formularza + +Zakładka składa się z elementów ``. Każda grupa może zawierać: + +1. **Listę pól w kolumnie** - pola ułożone pionowo jedno pod drugim +2. **Układ wielokolumnowy** - `` zawierający kilka `` z polami +3. **Listę elementów podrzędnych** - np. Grid, ewentualnie poprzedzony polami filtrującymi + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +### Group - Grupa pól + +Wizualna ramka grupująca powiązane pola: + +```xml + + + + +``` + +| Atrybut | Opis | +|---------|------| +| `CaptionHtml` | Tytuł grupy | +| `LabelWidth` | Opcjonalny. Szerokość etykiet dla wszystkich pól w kontenerze | +| `Visibility` | Warunek widoczności (bindowalne z logiką biznesową) | +| `Renderable` | Czy grupa ma być dostępna (liczone raz przy logowaniu) | + +### Stack - Układ pionowy + +Układa elementy jeden pod drugim: + +```xml + + + + +``` + +### Row - Układ poziomy + +Układa elementy obok siebie w wierszu: + +```xml + + + + +``` + +**Pole na całą szerokość:** użyj `Width="*"` + +**Pola dosunięte do prawej:** umieść `` na początku: + +```xml + + + + + +``` + +### Flow - Układ płynny + +Elementy umieszczane są od lewej do prawej. Gdy nie mieszczą się na formularzu, przenoszone są do nowego wiersza: + +```xml + + + + + +``` + +## Elementy pól i kontrolek + +### Field - Pole edycyjne + +Podstawowy element do wyświetlania i edycji danych. Jest generowany **dynamicznie** - w zależności od typu właściwości wyświetla odpowiednią kontrolkę (int → pole numeryczne, bool → checkbox, double → pole z kalkulatorem, typ Sonety → lookup z listą wyboru). + +Minimalny `` powinien zawierać: +- `EditValue` - **wymagany**, binding do właściwości +- `CaptionHtml` - etykieta pola +- `Width` - szerokość pola + +```xml + +``` + +| Atrybut | Opis | +|---------|------| +| `EditValue` | **Wymagany**. Binding do właściwości: `{Właściwość}` lub `{new Extender.Właściwość}` | +| `CaptionHtml` | Etykieta pola (patrz sekcja "Atrybut CaptionHtml") | +| `Width` | Szerokość pola w znakach lub px (`*` = wypełnij) | +| `OuterWidth` | Całkowita szerokość z etykietą (do wyrównywania w pionie) | +| `LabelWidth` | Szerokość etykiety | +| `Height` | Wysokość w wierszach lub px (dla pól wieloliniowych) | +| `IsReadOnly` | Warunek tylko do odczytu (bindowalne z logiką biznesową). Logika biznesowa ma wyższy priorytet | +| `Visibility` | Warunek widoczności (bindowalne z logiką biznesową): `true`/`false`/`Visible`/`Hidden`/`Collapsed` | +| `Renderable` | Czy pole ma być dostępne (liczone raz przy logowaniu) | +| `Format` | Formatowanie wartości w standardzie .NET `string.Format`. Pole `{0}` to wartość edytowana | +| `Footer` | Agregacja w stopce **tylko na listach**: `Sum`, `Count`, `Average`, `Min`, `Max` | +| `CheckedValue` | Wartość dla **RadioButton** | +| `Class` | Klasy stylów (patrz sekcja Class) | +| `DataContext` | Zmienia kontekst danych dla tego pola i elementów podrzędnych | + +#### RadioButton + +Aby utworzyć RadioButton, dodaj parametr `CheckedValue`: + +```xml + + + +``` + +Pola z tym samym `EditValue` i różnymi `CheckedValue` tworzą grupę RadioButton. + +### Label - Etykieta + +Tekst bez możliwości edycji: + +```xml +