This commit is contained in:
team3
2026-07-29 15:19:41 +02:00
parent 2e86d682eb
commit 5d42b4cfc5
155 changed files with 14482 additions and 1736 deletions

View File

@@ -0,0 +1,537 @@
{
"abdeckung": {
"einbinden:VariantConfiguratorPlugin": {
"abdruck": "823481507a44729d",
"funktion": "Konfigurationsdaten bereitstellen",
"trug": "5fbc8363b7cffe59"
},
"einbinden:erweitert @Storefront/storefront/component/buy-widget/configurator.html.twig": {
"abdruck": "c6d031d6bc598089",
"funktion": "Konfigurator aktivieren",
"trug": "6cf5a2b08ce2371a"
},
"einbinden:override sw-product-detail-variants": {
"abdruck": "2fcf518e7333458a",
"funktion": "",
"trug": ""
},
"einbinden:register mto-vc-variants-card": {
"abdruck": "c472feadaac5ac71",
"funktion": "",
"trug": ""
},
"hoeren:[data-mto-vc-gallery-next].click": {
"abdruck": "c402ad6f114e8c3d",
"funktion": "Galerie blättern",
"trug": "bacf45ebf9dd77b8"
},
"hoeren:[data-mto-vc-gallery-prev].click": {
"abdruck": "f50d4f7effc60a06",
"funktion": "Galerie blättern",
"trug": "bacf45ebf9dd77b8"
},
"hoeren:[data-mto-vc-lightbox-close].click": {
"abdruck": "89a22850af7694bb",
"funktion": "Galerie blättern",
"trug": "bacf45ebf9dd77b8"
},
"hoeren:document.keydown": {
"abdruck": "7c018ebbfa346bee",
"funktion": "Schritt öffnen",
"trug": "efe9634e3080c073"
},
"hoeren:el.click": {
"abdruck": "6a423a062267755c",
"funktion": "Nächsten Schritt anzeigen",
"trug": "f6b276e3fedf287d"
},
"hoeren:info.click": {
"abdruck": "7a5a70dfb792bf19",
"funktion": "Optionsdetail öffnen",
"trug": "39fed29af6734cd4"
},
"hoeren:info.keydown": {
"abdruck": "409cecf6fb3bbb4a",
"funktion": "Optionsdetail öffnen",
"trug": "39fed29af6734cd4"
},
"hoeren:lightboxSelect.click": {
"abdruck": "9add2d2c77b440b5",
"funktion": "Ansicht schließen",
"trug": "24d52cc6d249d4f5"
},
"hoeren:next.click": {
"abdruck": "d5b0cdcce40afcff",
"funktion": "Konfigurator schließen",
"trug": "1cc1a6b5fc943e03"
},
"hoeren:prev.click": {
"abdruck": "6b8db8d885c0d6f8",
"funktion": "Konfigurator schließen",
"trug": "1cc1a6b5fc943e03"
},
"hoeren:row.click": {
"abdruck": "b4ec6f63c613c35f",
"funktion": "Option wählen",
"trug": "80df89cf0c129387"
},
"hoeren:thumb.click": {
"abdruck": "b4aa2111971f6886",
"funktion": "Bild wählen",
"trug": "0604a0a6875489b8"
},
"hoeren:trigger.click": {
"abdruck": "e219933925adc81a",
"funktion": "Schritt öffnen",
"trug": "efe9634e3080c073"
},
"reaktion:ProductPageLoadedEvent": {
"abdruck": "6f808b91c1a0c4f5",
"funktion": "Konfigurationsdaten bereitstellen",
"trug": "5fbc8363b7cffe59"
},
"route:get /mto-variant-configurator/resolve/{productId}": {
"abdruck": "b14355d6007564a1",
"funktion": "Konfigurationsdaten bereitstellen",
"trug": "5fbc8363b7cffe59"
}
},
"belege": {
"[\"auswahl-anstossen\", \"Gewählte Option anzeigen\"]": {
"abdruck": "626af3ee300b610a",
"beleg": "<span class=\"mto-vc-select-trigger-label\" data-mto-vc-trigger-label>\n {{ mtoVcSelected ? mtoVcSelected.translated.name : 'mto.variantConfigurator.choose'|trans }}\n </span>",
"datei": "src/Resources/views/storefront/component/buy-widget/configurator.html.twig"
},
"[\"auswahl-anstossen\", \"Hinweistext anzeigen\"]": {
"abdruck": "b9baf394ca99d4e6",
"beleg": "{% if mtoVcBubble != mtoVcBubbleKey and mtoVcBubble is not empty %}\n <p class=\"mto-vc-bubble\">{{ mtoVcBubble|sw_sanitize }}</p>\n {% endif %}",
"datei": "src/Resources/views/storefront/component/buy-widget/configurator.html.twig"
},
"[\"auswahl-anstossen\", \"Schrittnummer anzeigen\"]": {
"abdruck": "b9e4deada2c3a6f1",
"beleg": "<span class=\"mto-vc-step-badge\">{{ 'mto.variantConfigurator.step'|trans({ '%step%': mtoVcStep })|sw_sanitize }}</span>",
"datei": "src/Resources/views/storefront/component/buy-widget/configurator.html.twig"
},
"[\"beratung-anbieten\", \"Beratung erreichen\"]": {
"abdruck": "fa513f8d265ad713",
"beleg": "{% if ctaPhone is not empty %}\n <span class=\"mto-vc-support-icon\" aria-hidden=\"true\"></span>\n <a href=\"tel:{{ ctaPhone|replace({' ': '', '/': '', '-': '', '(': '', ')': ''}) }}\"\n class=\"mto-vc-support-phone\">{{ ctaPhone|sw_sanitize }}</a>\n {% endif %}",
"datei": "src/Resources/views/storefront/component/buy-widget/mto-variant-configurator-modal.html.twig"
},
"[\"beratung-anbieten\", \"Optionsübersicht öffnen\"]": {
"abdruck": "8aba7fb9bf50281b",
"beleg": "{% if pdfUrl %}\n <a href=\"{{ pdfUrl }}\" target=\"_blank\" rel=\"noopener\"\n class=\"mto-vc-btn is-outline mto-vc-all-options\">\n {{ 'mto.variantConfigurator.allOptions'|trans|sw_sanitize }}\n </a>\n {% else %}\n <span class=\"mto-vc-actions-spacer\" aria-hidden=\"true\"></span>\n {% endif %}",
"datei": "src/Resources/views/storefront/component/buy-widget/mto-variant-configurator-modal.html.twig"
},
"[\"beratung-anbieten\", \"Vertrauen zeigen\"]": {
"abdruck": "5b204dff7de6f96d",
"beleg": "{% if trustLogo %}\n <img src=\"{{ trustLogo }}\" alt=\"\" class=\"mto-vc-trust-logo\">\n{% endif %}",
"datei": "src/Resources/views/storefront/component/buy-widget/mto-variant-configurator-modal.html.twig"
},
"[\"layout-zuweisen\", \"Konfigurator aktivieren\"]": {
"abdruck": "60a65511f06ae7fe",
"beleg": "<sw-switch-field\n v-model:value=\"configuratorActive\"\n class=\"mto-vc-variants-card__active\"\n :disabled=\"!editable\"\n :label=\"$tc('mto-variant-configurator.card.activeLabel')\"\n :help-text=\"$tc('mto-variant-configurator.card.activeHelp')\"\n />",
"datei": "src/Resources/app/administration/src/component/mto-vc-variants-card/mto-vc-variants-card.html.twig"
},
"[\"layout-zuweisen\", \"Optionsübersicht hinterlegen\"]": {
"abdruck": "97b421cf540a6cc2",
"beleg": "{% if pdfUrl %}\n <a href=\"{{ pdfUrl }}\" target=\"_blank\" rel=\"noopener\"\n class=\"mto-vc-btn is-outline mto-vc-all-options\">\n {{ 'mto.variantConfigurator.allOptions'|trans|sw_sanitize }}\n </a>\n {% else %}\n <span class=\"mto-vc-actions-spacer\" aria-hidden=\"true\"></span>\n {% endif %}",
"datei": "src/Resources/views/storefront/component/buy-widget/mto-variant-configurator-modal.html.twig"
},
"[\"layout-zuweisen\", \"Trust-Logo hinterlegen\"]": {
"abdruck": "1954311a4c3a9cc1",
"beleg": "$mediaId = $this->systemConfigService->get(\n MtoVariantConfigurator::CONFIG_TRUST_LOGO,\n $salesChannelId,\n );",
"datei": "src/Core/Content/Product/VariantResolveService.php"
},
"[\"option-ansehen\", \"Ansicht schließen\"]": {
"abdruck": "6eac493d9a481e30",
"beleg": "if (!this._nodes.lightbox.hidden) {\n this._closeLightbox();\n } else {\n this._close();\n }",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"option-ansehen\", \"Option aus Ansicht wählen\"]": {
"abdruck": "b4223f8cf3e2456e",
"beleg": "this._nodes.lightboxSelect?.addEventListener('click', () => {\n if (this._lightboxOption) {\n this._selectOption(this.options.groups[this._currentStep], this._lightboxOption.id);\n }\n this._closeLightbox();\n });",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"option-ansehen\", \"Optionsdetail öffnen\"]": {
"abdruck": "59faab581e0fac7f",
"beleg": "info.addEventListener('click', open);\n info.addEventListener('keydown', (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n open(event);\n }\n });",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"schritt-zeigen\", \"Eigenschaft benennen\"]": {
"abdruck": "dd54064a67689e2c",
"beleg": "this._nodes.title.textContent = group.name;",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"schritt-zeigen\", \"Optionen auflisten\"]": {
"abdruck": "a71af321f056608d",
"beleg": "if (option.media) {\n const visual = document.createElement('span');\n visual.className = 'mto-vc-option-media';\n const img = document.createElement('img');\n img.src = option.media;\n img.alt = '';\n img.loading = 'lazy';\n visual.appendChild(img);\n row.appendChild(visual);\n } else if (option.color) {\n const visual = document.createElement('span');\n visual.className = 'mto-vc-option-swatch';\n visual.style.backgroundColor = option.color;\n row.appendChild(visual);\n } else {\n row.classList.add('has-no-visual');\n }",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"schritt-zeigen\", \"Schrittstand anzeigen\"]": {
"abdruck": "aa7b8888103f8bd0",
"beleg": "this._nodes.counter.textContent = (this._snippets.stepCount || '__step__ / __total__')\n .replace('__step__', String(step))\n .replace('__total__', String(total));\n this._nodes.progress.style.width = `${(step / total) * 100}%`;",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"varianten-waehlen\", \"Auswahl übernehmen\"]": {
"abdruck": "21ccf5bc0286c95c",
"beleg": "if (optionId && select.value !== optionId) {\n select.value = optionId;\n lastChanged = select;\n }",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"varianten-waehlen\", \"Konfigurationsdaten bereitstellen\"]": {
"abdruck": "e6e5848381fce5aa",
"beleg": "$page->assign([",
"datei": "src/Subscriber/ProductPageSubscriber.php"
},
"[\"varianten-waehlen\", \"Konfigurator schließen\"]": {
"abdruck": "1b7d4aea18cdb896",
"beleg": "_close() {\n this._closeLightbox();\n this._modalEl.hidden = true;\n document.body.classList.remove('mto-vc-modal-open');\n document.removeEventListener('keydown', this._keydownHandler);\n this._lastFocus?.focus();\n }",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"varianten-waehlen\", \"Nächsten Schritt anzeigen\"]": {
"abdruck": "3deee97595984a3e",
"beleg": "const isLast = this._nextUsableStep(this._currentStep + 1, 1) === null;\n this._nodes.next.textContent = isLast\n ? this._nodes.next.dataset.finishLabel\n : this._nodes.next.dataset.nextLabel;",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"varianten-waehlen\", \"Option wählen\"]": {
"abdruck": "4b9f7dc844cf7aac",
"beleg": "this._selected[group.id] = optionId;",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"varianten-waehlen\", \"Schritt öffnen\"]": {
"abdruck": "94b3aa8d50c53fc8",
"beleg": "this._triggers.forEach((trigger) => {\n trigger.addEventListener('click', (event) => {\n event.preventDefault();\n this._open(parseInt(trigger.dataset.mtoVcStepIndex, 10));\n });\n });",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"varianten-waehlen\", \"Vorherigen Schritt anzeigen\"]": {
"abdruck": "df5e60fe148da5e6",
"beleg": "this._nodes.prev.disabled = this._nextUsableStep(this._currentStep - 1, -1) === null;",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"vorschau-zeigen\", \"Bild wählen\"]": {
"abdruck": "ab1e74251036541a",
"beleg": "thumb.className = `mto-vc-thumb${index === this._galleryIndex ? ' is-active' : ''}`;",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"vorschau-zeigen\", \"Galerie blättern\"]": {
"abdruck": "6b28a5866629b878",
"beleg": "_stepGallery(delta) {\n if (this._gallery.length < 2) {\n return;\n }\n const count = this._gallery.length;\n this._galleryIndex = (this._galleryIndex + delta + count) % count;\n this._renderGallery();\n }",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"vorschau-zeigen\", \"Vorschau laden\"]": {
"abdruck": "413024bc244f7770",
"beleg": "return new JsonResponse($this->variantResolveService->resolveVariant($variantId, $context));",
"datei": "src/Storefront/Controller/VariantConfiguratorController.php"
}
},
"ohne_code": {},
"ohne_karte": {},
"paare": {
"[\"[\\\"auswahl-anstossen\\\", \\\"Gewählte Option anzeigen\\\"]\", \"[\\\"auswahl-anstossen\\\", \\\"Hinweistext anzeigen\\\"]\"]": {
"abdruck": "450345e8a27f5695",
"gleich": false
},
"[\"[\\\"auswahl-anstossen\\\", \\\"Gewählte Option anzeigen\\\"]\", \"[\\\"auswahl-anstossen\\\", \\\"Schrittnummer anzeigen\\\"]\"]": {
"abdruck": "60008fdb6d69349b",
"gleich": false
},
"[\"[\\\"auswahl-anstossen\\\", \\\"Hinweistext anzeigen\\\"]\", \"[\\\"auswahl-anstossen\\\", \\\"Schrittnummer anzeigen\\\"]\"]": {
"abdruck": "3eaf19062d6d53a3",
"gleich": false
},
"[\"[\\\"beratung-anbieten\\\", \\\"Beratung erreichen\\\"]\", \"[\\\"beratung-anbieten\\\", \\\"Optionsübersicht öffnen\\\"]\"]": {
"abdruck": "9d3da3bf8c127ae1",
"gleich": false
},
"[\"[\\\"beratung-anbieten\\\", \\\"Beratung erreichen\\\"]\", \"[\\\"beratung-anbieten\\\", \\\"Vertrauen zeigen\\\"]\"]": {
"abdruck": "2c3c62cb4b935c56",
"gleich": false
},
"[\"[\\\"beratung-anbieten\\\", \\\"Optionsübersicht öffnen\\\"]\", \"[\\\"beratung-anbieten\\\", \\\"Vertrauen zeigen\\\"]\"]": {
"abdruck": "bf601d5dc7c6c507",
"gleich": false
},
"[\"[\\\"beratung-anbieten\\\", \\\"Optionsübersicht öffnen\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Optionsübersicht hinterlegen\\\"]\"]": {
"abdruck": "bc9dc09e54b78a75",
"gleich": false
},
"[\"[\\\"layout-zuweisen\\\", \\\"Konfigurator aktivieren\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Optionsbild am Datensatz pflegen\\\"]\"]": {
"abdruck": "5a4d802d668ddd55",
"gleich": false
},
"[\"[\\\"layout-zuweisen\\\", \\\"Konfigurator aktivieren\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Optionsübersicht hinterlegen\\\"]\"]": {
"abdruck": "eeed78a6284711f1",
"gleich": false
},
"[\"[\\\"layout-zuweisen\\\", \\\"Konfigurator aktivieren\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Trust-Logo hinterlegen\\\"]\"]": {
"abdruck": "b4944e5aa4df871a",
"gleich": false
},
"[\"[\\\"layout-zuweisen\\\", \\\"Optionsbild am Datensatz pflegen\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Optionsübersicht hinterlegen\\\"]\"]": {
"abdruck": "b91bdff82a120a8d",
"gleich": false
},
"[\"[\\\"layout-zuweisen\\\", \\\"Optionsbild am Datensatz pflegen\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Trust-Logo hinterlegen\\\"]\"]": {
"abdruck": "97268714e2b5d989",
"gleich": false
},
"[\"[\\\"layout-zuweisen\\\", \\\"Optionsübersicht hinterlegen\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Trust-Logo hinterlegen\\\"]\"]": {
"abdruck": "b52cedd4106ee837",
"gleich": false
},
"[\"[\\\"option-ansehen\\\", \\\"Ansicht schließen\\\"]\", \"[\\\"option-ansehen\\\", \\\"Option aus Ansicht wählen\\\"]\"]": {
"abdruck": "caa5ce4c5ff31774",
"gleich": false
},
"[\"[\\\"option-ansehen\\\", \\\"Ansicht schließen\\\"]\", \"[\\\"option-ansehen\\\", \\\"Optionsdetail öffnen\\\"]\"]": {
"abdruck": "462a46d7a2030874",
"gleich": false
},
"[\"[\\\"option-ansehen\\\", \\\"Option aus Ansicht wählen\\\"]\", \"[\\\"option-ansehen\\\", \\\"Optionsdetail öffnen\\\"]\"]": {
"abdruck": "8f695dfd90060204",
"gleich": false
},
"[\"[\\\"schritt-zeigen\\\", \\\"Eigenschaft benennen\\\"]\", \"[\\\"schritt-zeigen\\\", \\\"Optionen auflisten\\\"]\"]": {
"abdruck": "5372df6b482e9a5c",
"gleich": false
},
"[\"[\\\"schritt-zeigen\\\", \\\"Eigenschaft benennen\\\"]\", \"[\\\"schritt-zeigen\\\", \\\"Schrittstand anzeigen\\\"]\"]": {
"abdruck": "732d371c2135b53f",
"gleich": false
},
"[\"[\\\"schritt-zeigen\\\", \\\"Optionen auflisten\\\"]\", \"[\\\"schritt-zeigen\\\", \\\"Schrittstand anzeigen\\\"]\"]": {
"abdruck": "590d6974e948c69c",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Auswahl übernehmen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Konfigurationsdaten bereitstellen\\\"]\"]": {
"abdruck": "34e23fca918e5dc0",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Auswahl übernehmen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Konfigurator schließen\\\"]\"]": {
"abdruck": "eb521941a5dc979a",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Auswahl übernehmen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Nächsten Schritt anzeigen\\\"]\"]": {
"abdruck": "271109c8b42cf5d5",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Auswahl übernehmen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Option wählen\\\"]\"]": {
"abdruck": "618d3c213492555a",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Auswahl übernehmen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Schritt öffnen\\\"]\"]": {
"abdruck": "b45252ce7cc39ed9",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Auswahl übernehmen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Vorherigen Schritt anzeigen\\\"]\"]": {
"abdruck": "d7ade9bdd7d0c66e",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Konfigurationsdaten bereitstellen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Konfigurator schließen\\\"]\"]": {
"abdruck": "97ceded85ca2035c",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Konfigurationsdaten bereitstellen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Nächsten Schritt anzeigen\\\"]\"]": {
"abdruck": "ba83ab596b72af22",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Konfigurationsdaten bereitstellen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Option wählen\\\"]\"]": {
"abdruck": "6f23248b5fbd7be4",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Konfigurationsdaten bereitstellen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Schritt öffnen\\\"]\"]": {
"abdruck": "7350e93a2a368ac1",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Konfigurationsdaten bereitstellen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Vorherigen Schritt anzeigen\\\"]\"]": {
"abdruck": "50753ef9f3d5c8b5",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Konfigurator schließen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Nächsten Schritt anzeigen\\\"]\"]": {
"abdruck": "b49e65e1c60b5307",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Konfigurator schließen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Option wählen\\\"]\"]": {
"abdruck": "b165f28b36fc3637",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Konfigurator schließen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Schritt öffnen\\\"]\"]": {
"abdruck": "0bf509fed71f1c25",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Konfigurator schließen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Vorherigen Schritt anzeigen\\\"]\"]": {
"abdruck": "de5acdbf92511e14",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Nächsten Schritt anzeigen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Option wählen\\\"]\"]": {
"abdruck": "7c9a06867c701267",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Nächsten Schritt anzeigen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Schritt öffnen\\\"]\"]": {
"abdruck": "f45378da83876bae",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Nächsten Schritt anzeigen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Vorherigen Schritt anzeigen\\\"]\"]": {
"abdruck": "9fc4c9cf8ae1d7fb",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Option wählen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Schritt öffnen\\\"]\"]": {
"abdruck": "a71f8b8b92d1025c",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Option wählen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Vorherigen Schritt anzeigen\\\"]\"]": {
"abdruck": "e3270a7176c63620",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Schritt öffnen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Vorherigen Schritt anzeigen\\\"]\"]": {
"abdruck": "44e775b8e8b106d1",
"gleich": false
},
"[\"[\\\"vorschau-zeigen\\\", \\\"Bild wählen\\\"]\", \"[\\\"vorschau-zeigen\\\", \\\"Galerie blättern\\\"]\"]": {
"abdruck": "19851d2901c309a1",
"gleich": false
},
"[\"[\\\"vorschau-zeigen\\\", \\\"Bild wählen\\\"]\", \"[\\\"vorschau-zeigen\\\", \\\"Vorschau laden\\\"]\"]": {
"abdruck": "508415e6500f9fca",
"gleich": false
},
"[\"[\\\"vorschau-zeigen\\\", \\\"Galerie blättern\\\"]\", \"[\\\"vorschau-zeigen\\\", \\\"Vorschau laden\\\"]\"]": {
"abdruck": "86aa1f412d5a5dcd",
"gleich": false
}
},
"stil": {
"[\"auswahl-anstossen\", \"\"]": {
"abdruck": "aeec25973dafe92f",
"probleme": []
},
"[\"auswahl-anstossen\", \"Gewählte Option anzeigen\"]": {
"abdruck": "59058982f7989af8",
"probleme": []
},
"[\"auswahl-anstossen\", \"Hinweistext anzeigen\"]": {
"abdruck": "b3568e0a2585d71c",
"probleme": []
},
"[\"auswahl-anstossen\", \"Schrittnummer anzeigen\"]": {
"abdruck": "117d58f0d4b21973",
"probleme": []
},
"[\"beratung-anbieten\", \"\"]": {
"abdruck": "4b0267b165360857",
"probleme": []
},
"[\"beratung-anbieten\", \"Beratung erreichen\"]": {
"abdruck": "cfdb65d682c3e068",
"probleme": []
},
"[\"beratung-anbieten\", \"Optionsübersicht öffnen\"]": {
"abdruck": "28d5587c78199c54",
"probleme": []
},
"[\"beratung-anbieten\", \"Vertrauen zeigen\"]": {
"abdruck": "8c00dec8d3ebf751",
"probleme": []
},
"[\"layout-zuweisen\", \"\"]": {
"abdruck": "1e0d2ca5296aabea",
"probleme": []
},
"[\"layout-zuweisen\", \"Konfigurator aktivieren\"]": {
"abdruck": "dca9bbf7361f5520",
"probleme": []
},
"[\"layout-zuweisen\", \"Optionsbild am Datensatz pflegen\"]": {
"abdruck": "cc0701aafd02ac3a",
"probleme": []
},
"[\"layout-zuweisen\", \"Optionsübersicht hinterlegen\"]": {
"abdruck": "de6c0e3e80d47496",
"probleme": []
},
"[\"layout-zuweisen\", \"Trust-Logo hinterlegen\"]": {
"abdruck": "ebd1a72ece157e69",
"probleme": []
},
"[\"option-ansehen\", \"\"]": {
"abdruck": "ace46c77101e26b3",
"probleme": []
},
"[\"option-ansehen\", \"Ansicht schließen\"]": {
"abdruck": "6bdaf5e60fb3baa9",
"probleme": []
},
"[\"option-ansehen\", \"Option aus Ansicht wählen\"]": {
"abdruck": "cc10af5dda4a7857",
"probleme": []
},
"[\"option-ansehen\", \"Optionsdetail öffnen\"]": {
"abdruck": "e00d07ce7b75d8fc",
"probleme": []
},
"[\"schritt-zeigen\", \"\"]": {
"abdruck": "f0d53ef421968759",
"probleme": []
},
"[\"schritt-zeigen\", \"Eigenschaft benennen\"]": {
"abdruck": "ec4828e2e9197083",
"probleme": []
},
"[\"schritt-zeigen\", \"Optionen auflisten\"]": {
"abdruck": "d8e6daed0f36098f",
"probleme": []
},
"[\"schritt-zeigen\", \"Schrittstand anzeigen\"]": {
"abdruck": "42a1c7f94c30f72d",
"probleme": []
},
"[\"varianten-waehlen\", \"\"]": {
"abdruck": "0835908894fa892c",
"probleme": []
},
"[\"varianten-waehlen\", \"Auswahl übernehmen\"]": {
"abdruck": "6683956c63370244",
"probleme": []
},
"[\"varianten-waehlen\", \"Konfigurationsdaten bereitstellen\"]": {
"abdruck": "498f3141e86f8db0",
"probleme": []
},
"[\"varianten-waehlen\", \"Konfigurator schließen\"]": {
"abdruck": "866918b327061449",
"probleme": []
},
"[\"varianten-waehlen\", \"Nächsten Schritt anzeigen\"]": {
"abdruck": "8d810a760dfec037",
"probleme": []
},
"[\"varianten-waehlen\", \"Option wählen\"]": {
"abdruck": "ac4eae399ac3a15e",
"probleme": []
},
"[\"varianten-waehlen\", \"Schritt öffnen\"]": {
"abdruck": "40f795456747214e",
"probleme": []
},
"[\"varianten-waehlen\", \"Vorherigen Schritt anzeigen\"]": {
"abdruck": "a63a26a8baea9c07",
"probleme": []
},
"[\"vorschau-zeigen\", \"\"]": {
"abdruck": "52976631fd09993a",
"probleme": []
},
"[\"vorschau-zeigen\", \"Bild wählen\"]": {
"abdruck": "a3e980ef7678a446",
"probleme": []
},
"[\"vorschau-zeigen\", \"Galerie blättern\"]": {
"abdruck": "47ccb441120c1470",
"probleme": []
},
"[\"vorschau-zeigen\", \"Vorschau laden\"]": {
"abdruck": "29e5951f170dba26",
"probleme": []
}
},
"verworfen": {}
}

View File

@@ -0,0 +1,122 @@
[
{
"titel": "„Lightbox“ geändert",
"dateien": {
"lightbox": "<!-- titel -->\nLightbox\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nZeigt eine vergrößerte Ansicht der Optionsabbildung mit ihrem Namen\n----------------------------------------\n<!-- regeln -->\n- lightboxSelect bestätigt Auswahl und schließt\n- Escape und x-Icon schließen\n- Tab und Shift-Tab zirkulieren im Fokusring\n- Geschlossen kehrt Fokus zum Auslöser zurück\n- hidden-Attribut entfernt aus dem Barrierefreiheitsbaum\n----------------------------------------\n<!-- funktion -->\nAuswahl bestätigen\n<!-- ziel -->\nWählt eine Option im aktuellen Schritt und berechnet die gültigen Folgeschritte neu\n<!-- regeln -->\n- Bleibt im aktuellen Schritt\n- Invalidiert Folgeschritte mit ungültigen Kombinationen\n- Setzt Fokus auf die gewählte Option\n- Aktualisiert Galerie und Preis\n<!-- testen -->\n- Lightbox mit Option öffnen\n- LMB auf Auswahl bestätigen\n- Option ist markiert\n- Lightbox geschlossen\n----------------------------------------\n<!-- funktion -->\nKonfigurator schließen\n<!-- regeln -->\n- Schließt die Lightbox, ohne den Konfigurator zu schließen\n- x-Icon oder Escape beenden die Lightbox\n- Fokus kehrt zum Auslöser in der Optionsliste zurück\n<!-- testen -->\n- Option mit Bildauswahl öffnet die Lightbox\n- Escape drücken\n- Lightbox geschlossen, Modal offen\n----------------------------------------\n<!-- funktion -->\nLightbox schließen\n<!-- ziel -->\nEntfernt die vergrößerte Produktansicht wieder\n<!-- regeln -->\n- x-Icon oder Escape schließt\n- Zurück zum Dialog gibt Focus\n<!-- testen -->\n- Modal öffnen\n- Option mit Bild wählen\n- Leinwand-Icon klicken\n- Lightbox sichtbar\n- Escape drücken\n- Lightbox geschlossen, Dialog fokussiert\n----------------------------------------\n<!-- funktion -->\nLightbox öffnen\n<!-- ziel -->\nZeigt das Produktfoto einer Variante option in Originalgröße\n<!-- regeln -->\n- lightboxImage zeigt option.media\n- lightboxCaption zeigt option.name\n- lightboxSelect erhält Fokus\n<!-- testen -->\n- Modal öffnen\n- Auf Option mit Bild klicken\n- Info-Button der Option klicken\n- Lightbox zeigt das Foto in Originalgröße\n----------------------------------------\n<!-- funktion -->\nTastatur verwenden\n<!-- ziel -->\nBedient Modal und Lightbox per Tastatur\n<!-- regeln -->\n- Escape schließt Lightbox oder Modal\n- Tab zirkuliert im Fokusring vorwärts\n- Shift-Tab zirkuliert im Fokusring rückwärts\n<!-- testen -->\n- Modal öffnen\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen\n- Escape drücken\n- Modal geschlossen\n"
}
},
{
"titel": "„Konfigurator“ geändert",
"dateien": {
"konfigurator": "<!-- titel -->\nKonfigurator\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nFührt durch Variantenkonfiguration in Einzelschritten mit Live-Vorschau\n----------------------------------------\n<!-- regeln -->\n- Aktiv nur wenn Produkt mto_variant_configurator_active gesetzt hat\n- Optionen-Bilder nur bis zwei Schritte\n- Galerie und Preis aktualisieren live ohne Seitenreload\n- Body erhält CSS-Klasse mto-vc-modal-open solange Modal offen\n- Escape schließt Modal\n- Schließen stellt Fokus auf vorheriges Element\n- Registriert als mto-vc-variants-card in swProductDetail\n- Einstellungen in customFields des Produkts gespeichert\n- Falls inaktiv: Fallback auf Standard-Konfigurator von Shopware\n- Natives Select pro Gruppe im DOM\n- Schritte ohne gültige Optionen werden beim Navigieren übersprungen\n- Ungültige Kombinationen für Folgeschritte werden beim Wählen verworfen\n- Unbesuchte Schritte werden beim Bestätigen mit erster gültiger Option aufgefüllt\n- Deaktivierte Optionen sind nicht auswählbar\n- Gallery-Container erhält CSS-Klasse has-no-gallery wenn keine Bilder vorhanden\n- Schließen bei Lightbox: fokus auf Lightbox-Auswahl-Button\n----------------------------------------\n<!-- funktion -->\nGeführte Konfiguration aktivieren\n<!-- ziel -->\nFührt Kunden schrittweise durch die Variantenauswahl mit Hinweisen und Modal\n<!-- regeln -->\n- Aktiviert bei Produkten mit aktivem Konfigurator-Layout\n- Zeigt jeden Konfigurationsschritt mit Beschriftung\n- Blendentext je Gruppe über Modal aus\n- Inkrementelle Variantenauflösung über resolveUrl\n<!-- testen -->\n- Produktseite mit aktivem Konfigurator öffnen\n- LMB auf ersten Konfigurationsschritt\n- Option im Modal wählen\n- Modal schließt und nächster Schritt markiert\n----------------------------------------\n<!-- funktion -->\nKonfigurationsdaten abrufen\n<!-- ziel -->\nLiefert Variantendaten für eine Live-Aktualisierung im Konfigurator.\n<!-- regeln -->\n- GET /mto-variant-configurator/resolve/{productId}\n- Query-Parameter switched enthält die aktuell gewechselte Gruppe\n- Query-Parameter options enthält ein JSON-Array gewählter Optionen\n- Ungültiges JSON führt zu leerem options-Array\n- VariantNotFoundException hält productId als Fallback\n- Rückgabe enthält variantId, gallery media und Preis\n- Kein HTTP-Cache wegen kundenspezifischer Preise\n<!-- testen -->\n- GET /mto-variant-configurator/resolve/STRG-PRODUKT-ID?options=[{\"optionId\":\"farbe\",\"option\":\"rot\"}]\n- Antwort enthält variantId\n- Antwort enthält gallery media\n- Antwort enthält Preis\n----------------------------------------\n<!-- funktion -->\nKonfigurator öffnen\n<!-- ziel -->\nÖffnet den Konfigurator ab einem gewählten Schritt\n<!-- regeln -->\n- Erster Aufruf zeigt das Modal\n- Weiterer Aufruf wechselt den Schritt\n- Fokus vorheriges Element wird gespeichert\n- Body erhält CSS-Klasse mto-vc-modal-open\n- Escape-Schließen wird registriert\n- Galerie und Preis werden aktualisiert\n- Fokus springt auf den Next-Button\n<!-- testen -->\n- LMB auf Konfigurator-Trigger klicken\n- Modal erscheint im gewählten Schritt\n----------------------------------------\n<!-- funktion -->\nKonfigurator-Karte registrieren\n<!-- ziel -->\nMacht die Einstellungen des Varianten-Konfigurators auf der Produktdetail-Seite verfügbar\n<!-- regeln -->\n- Registriert als mto-vc-variants-card\n- Nutzt Produkt aus swProductDetail\n- Speichert Einstellungen in customFields des Produkts\n<!-- testen -->\n- Produktdetail-Seite eines Produkts öffnen\n- Tab Variants aufrufen\n- Registrierte mto-vc-variants-card wird angezeigt\n----------------------------------------\n<!-- funktion -->\nPlugin registrieren\n<!-- ziel -->\nMacht das Plugin für Elemente mit dem Selektor verfügbar\n<!-- regeln -->\n- Registriert unter VariantConfiguratorPlugin\n- Nutzt window.PluginManager\n- Bindet an [data-mto-variant-configurator]\n<!-- testen -->\n- PluginManager.register aufrufen\n- Element mit data-mto-variant-configurator erstellen\n- Plugin auf Element angewendet\n"
}
},
{
"titel": "„Konfigurator“ geändert",
"dateien": {
"konfigurator": "<!-- titel -->\nKonfigurator\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nFührt durch Variantenkonfiguration in Einzelschritten mit Live-Vorschau\n----------------------------------------\n<!-- regeln -->\n- Aktiv nur wenn Produkt mto_variant_configurator_active gesetzt hat\n- Optionen-Bilder nur bis zwei Schritte\n- Galerie und Preis aktualisieren live ohne Seitenreload\n- Body erhält CSS-Klasse mto-vc-modal-open solange Modal offen\n- Escape schließt Modal\n- Schließen stellt Fokus auf vorheriges Element\n- Registriert als mto-vc-variants-card in swProductDetail\n- Einstellungen in customFields des Produkts gespeichert\n- Falls inaktiv: Fallback auf Standard-Konfigurator von Shopware\n- Natives Select pro Gruppe im DOM\n- Schritte ohne gültige Optionen werden beim Navigieren übersprungen\n- Ungültige Kombinationen für Folgeschritte werden beim Wählen verworfen\n- Unbesuchte Schritte werden beim Bestätigen mit erster gültiger Option aufgefüllt\n- Deaktivierte Optionen sind nicht auswählbar\n- Gallery-Container erhält CSS-Klasse has-no-gallery wenn keine Bilder vorhanden\n- Schließen bei Lightbox: fokus auf Lightbox-Auswahl-Button\n----------------------------------------\n<!-- funktion -->\nGeführte Konfiguration aktivieren\n<!-- ziel -->\nFührt Kunden schrittweise durch die Variantenauswahl mit Hinweisen und Modal\n<!-- regeln -->\n- Aktiviert bei Produkten mit aktivem Konfigurator-Layout\n- Zeigt jeden Konfigurationsschritt mit Beschriftung\n- Blendentext je Gruppe über Modal aus\n- Inkrementelle Variantenauflösung über resolveUrl\n<!-- testen -->\n- Produktseite mit aktivem Konfigurator öffnen\n- LMB auf ersten Konfigurationsschritt\n- Option im Modal wählen\n- Modal schließt und nächster Schritt markiert\n----------------------------------------\n<!-- funktion -->\nKonfigurationsdaten abrufen\n<!-- ziel -->\nLiefert Variantendaten für eine Live-Aktualisierung im Konfigurator\n<!-- regeln -->\n- GET /mto-variant-configurator/resolve/{productId}\n- Query-Parameter switched enthält die aktuell gewechselte Gruppe\n- Query-Parameter options enthält ein JSON-Array gewählter Optionen\n- Ungültiges JSON führt zu leerem options-Array\n- VariantNotFoundException hält productId als Fallback\n- Rückgabe enthält variantId, gallery media und Preis\n- Kein HTTP-Cache wegen kundenspezifischer Preise\n<!-- testen -->\n- GET /mto-variant-configurator/resolve/STRG-PRODUKT-ID?options=[{\"optionId\":\"farbe\",\"option\":\"rot\"}]\n- Antwort enthält variantId\n- Antwort enthält gallery media\n- Antwort enthält Preis\n----------------------------------------\n<!-- funktion -->\nKonfigurator öffnen\n<!-- ziel -->\nÖffnet den Konfigurator ab einem gewählten Schritt\n<!-- regeln -->\n- Erster Aufruf zeigt das Modal\n- Weiterer Aufruf wechselt den Schritt\n- Fokus vorheriges Element wird gespeichert\n- Body erhält CSS-Klasse mto-vc-modal-open\n- Escape-Schließen wird registriert\n- Galerie und Preis werden aktualisiert\n- Fokus springt auf den Next-Button\n<!-- testen -->\n- LMB auf Konfigurator-Trigger klicken\n- Modal erscheint im gewählten Schritt\n----------------------------------------\n<!-- funktion -->\nKonfigurator-Karte registrieren\n<!-- ziel -->\nMacht die Einstellungen des Varianten-Konfigurators auf der Produktdetail-Seite verfügbar\n<!-- regeln -->\n- Registriert als mto-vc-variants-card\n- Nutzt Produkt aus swProductDetail\n- Speichert Einstellungen in customFields des Produkts\n<!-- testen -->\n- Produktdetail-Seite eines Produkts öffnen\n- Tab Variants aufrufen\n- Registrierte mto-vc-variants-card wird angezeigt\n----------------------------------------\n<!-- funktion -->\nPlugin registrieren\n<!-- ziel -->\nMacht das Plugin für Elemente mit dem Selektor verfügbar\n<!-- regeln -->\n- Registriert unter VariantConfiguratorPlugin\n- Nutzt window.PluginManager\n- Bindet an [data-mto-variant-configurator]\n<!-- testen -->\n- PluginManager.register aufrufen\n- Element mit data-mto-variant-configurator erstellen\n- Plugin auf Element angewendet\n"
}
},
{
"titel": "„Konfigurator“ geändert",
"dateien": {
"konfigurator": "<!-- titel -->\nKonfigurator\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nFührt durch Variantenkonfiguration in Einzelschritten mit Live-Vorschau\n----------------------------------------\n<!-- regeln -->\n- Aktiv nur wenn Produkt mto_variant_configurator_active gesetzt hat\n- Optionen-Bilder nur bis zwei Schritte\n- Galerie und Preis aktualisieren live ohne Seitenreload\n- Body erhält CSS-Klasse mto-vc-modal-open solange Modal offen\n- Escape schließt Modal\n- Schließen stellt Fokus auf vorheriges Element\n- Registriert als mto-vc-variants-card in swProductDetail\n- Einstellungen in customFields des Produkts gespeichert\n- Falls inaktiv: Fallback auf Standard-Konfigurator von Shopware\n- Natives Select pro Gruppe im DOM\n- Schritte ohne gültige Optionen werden beim Navigieren übersprungen\n- Ungültige Kombinationen für Folgeschritte werden beim Wählen verworfen\n- Unbesuchte Schritte werden beim Bestätigen mit erster gültiger Option aufgefüllt\n- Deaktivierte Optionen sind nicht auswählbar\n- Gallery-Container erhält CSS-Klasse has-no-gallery wenn keine Bilder vorhanden\n- Schließen bei Lightbox: fokus auf Lightbox-Auswahl-Button\n----------------------------------------\n<!-- funktion -->\nGeführte Konfiguration aktivieren\n<!-- ziel -->\nFührt Kunden schrittweise durch die Variantenauswahl mit Hinweisen und Modal\n<!-- regeln -->\n- Aktiviert bei Produkten mit aktivem Konfigurator-Layout\n- Zeigt jeden Konfigurationsschritt mit Beschriftung\n- Blendentext je Gruppe über Modal aus\n- Inkrementelle Variantenauflösung über resolveUrl\n<!-- testen -->\n- Produktseite mit aktivem Konfigurator öffnen\n- LMB auf ersten Konfigurationsschritt\n- Option im Modal wählen\n- Modal schließt und nächster Schritt markiert\n----------------------------------------\n<!-- funktion -->\nKonfigurationsdaten abrufen\n<!-- ziel -->\nLiefert Variantendaten für eine Live-Aktualisierung im Konfigurator\n<!-- regeln -->\n- Endpoint mto-variant-configurator resolve\n- Query-Parameter switched enthält die aktuell gewechselte Gruppe\n- Query-Parameter options enthält ein JSON-Array gewählter Optionen\n- Ungültiges JSON führt zu leerem options-Array\n- VariantNotFoundException hält productId als Fallback\n- Rückgabe enthält variantId, gallery media und Preis\n- Kein HTTP-Cache wegen kundenspezifischer Preise\n<!-- testen -->\n- GET /mto-variant-configurator/resolve/STRG-PRODUKT-ID?options=[{\"optionId\":\"farbe\",\"option\":\"rot\"}]\n- Antwort enthält variantId\n- Antwort enthält gallery media\n- Antwort enthält Preis\n----------------------------------------\n<!-- funktion -->\nKonfigurator öffnen\n<!-- ziel -->\nÖffnet den Konfigurator ab einem gewählten Schritt\n<!-- regeln -->\n- Erster Aufruf zeigt das Modal\n- Weiterer Aufruf wechselt den Schritt\n- Fokus vorheriges Element wird gespeichert\n- Body erhält CSS-Klasse mto-vc-modal-open\n- Escape-Schließen wird registriert\n- Galerie und Preis werden aktualisiert\n- Fokus springt auf den Next-Button\n<!-- testen -->\n- LMB auf Konfigurator-Trigger klicken\n- Modal erscheint im gewählten Schritt\n----------------------------------------\n<!-- funktion -->\nKonfigurator-Karte registrieren\n<!-- ziel -->\nMacht die Einstellungen des Varianten-Konfigurators auf der Produktdetail-Seite verfügbar\n<!-- regeln -->\n- Registriert als mto-vc-variants-card\n- Nutzt Produkt aus swProductDetail\n- Speichert Einstellungen in customFields des Produkts\n<!-- testen -->\n- Produktdetail-Seite eines Produkts öffnen\n- Tab Variants aufrufen\n- Registrierte mto-vc-variants-card wird angezeigt\n----------------------------------------\n<!-- funktion -->\nPlugin registrieren\n<!-- ziel -->\nMacht das Plugin für Elemente mit dem Selektor verfügbar\n<!-- regeln -->\n- Registriert unter VariantConfiguratorPlugin\n- Nutzt window.PluginManager\n- Bindet an [data-mto-variant-configurator]\n<!-- testen -->\n- PluginManager.register aufrufen\n- Element mit data-mto-variant-configurator erstellen\n- Plugin auf Element angewendet\n"
}
},
{
"titel": "„Galerie“ geändert",
"dateien": {
"galerie": "<!-- titel -->\nGalerie\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nErmöglicht das Anzeigen und Durchblättern von Produktbildern im Konfigurator-Modal\n----------------------------------------\n<!-- regeln -->\n- Einzelne Galerie pro Modal\n- Navigiert zyklisch\n- Ein Bild deaktiviert Navigation\n- Hauptbild über thumbnails aktualisierbar\n----------------------------------------\n<!-- funktion -->\nGalerie nächste anzeigen\n<!-- ziel -->\nZeigt das nächste Bild der Galerie\n<!-- regeln -->\n- Mindestens 2 Bilder vorhanden\n- Zyklisch von letztem zu erstem Bild\n<!-- testen -->\n- Auf next-Button klicken\n- Nächstes Bild wird angezeigt\n----------------------------------------\n<!-- funktion -->\nGalerie rückwärts blättern\n<!-- ziel -->\nVorheriges Bild der Galerie anzeigen\n<!-- regeln -->\n- Nur mit mindestens zwei Bildern\n- Springt von erstem zum letzten Bild\n- Aktualisiert Miniaturansicht\n<!-- testen -->\n- Vollmodus öffnen\n- Klick auf Vorheriges-Bild-Icon\n- Erstes Bild zeigt\n----------------------------------------\n<!-- funktion -->\nGalerie vorherige anzeigen\n<!-- ziel -->\nBlendet das vorherige Bild der Galerie ein\n<!-- regeln -->\n- mto-vc-gallery-prev-Icon\n- Bei nur einem Bild keine Wirkung\n<!-- testen -->\n- Galerie mit mindestens zwei Bildern öffnen\n- LMB auf mto-vc-gallery-prev-Icon\n- Vorheriges Bild im Stage-Image angezeigt\n----------------------------------------\n<!-- funktion -->\nGalerie vorwärts blättern\n<!-- ziel -->\nZeigt das nächste Bild der Galerie\n<!-- regeln -->\n- Geht bei weniger als zwei Bildern nicht\n- Springt vom letzten zum ersten Bild\n<!-- testen -->\n- Modal öffnen\n- Klick auf gallery-next\n- Nächstes Bild wird angezeigt\n- Klick erneut bei letztem Bild\n- Erstes Bild wird angezeigt\n----------------------------------------\n<!-- funktion -->\nThumbnail auswählen\n<!-- ziel -->\nGreift direkt auf ein Produktbild zu, ohne durch die Galerie zu blättern\n<!-- regeln -->\n- Aktives Thumbnail zeigt x-Icon\n- Klick aktualisiert Hauptbild und Aktivzustand\n<!-- testen -->\n- Galerie mit mehreren Thumbnails öffnen\n- Klick auf Thumbnail\n- Hauptbild entspricht geklicktem Thumbnail\n"
}
},
{
"titel": "„Lightbox“ geändert",
"dateien": {
"lightbox": "<!-- titel -->\nLightbox\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nZeigt eine vergrößerte Ansicht der Optionsabbildung mit ihrem Namen\n----------------------------------------\n<!-- regeln -->\n- lightboxSelect bestätigt Auswahl und schließt\n- Escape und x-Icon schließen\n- Tab und Shift-Tab zirkulieren im Fokusring\n- Geschlossen kehrt Fokus zum Auslöser zurück\n- hidden-Attribut entfernt aus dem Barrierefreiheitsbaum\n----------------------------------------\n<!-- funktion -->\nAuswahl bestätigen\n<!-- ziel -->\nWählt eine Option im aktuellen Schritt und berechnet die gültigen Folgeschritte neu\n<!-- regeln -->\n- Bleibt im aktuellen Schritt\n- Invalidiert Folgeschritte mit ungültigen Kombinationen\n- Setzt Fokus auf die gewählte Option\n- Aktualisiert Galerie und Preis\n<!-- testen -->\n- Lightbox mit Option öffnen\n- LMB auf Auswahl bestätigen\n- Option markiert\n----------------------------------------\n<!-- funktion -->\nKonfigurator schließen\n<!-- regeln -->\n- Schließt die Lightbox, ohne den Konfigurator zu schließen\n- x-Icon oder Escape beenden die Lightbox\n- Fokus kehrt zum Auslöser in der Optionsliste zurück\n<!-- testen -->\n- Option mit Bildauswahl öffnet die Lightbox\n- Escape drücken\n- Lightbox geschlossen, Modal offen\n----------------------------------------\n<!-- funktion -->\nLightbox schließen\n<!-- ziel -->\nEntfernt die vergrößerte Produktansicht wieder\n<!-- regeln -->\n- x-Icon oder Escape schließt\n- Zurück zum Dialog gibt Focus\n<!-- testen -->\n- Modal öffnen\n- Option mit Bild wählen\n- Leinwand-Icon klicken\n- Lightbox sichtbar\n- Escape drücken\n- Lightbox geschlossen, Dialog fokussiert\n----------------------------------------\n<!-- funktion -->\nLightbox öffnen\n<!-- ziel -->\nZeigt das Produktfoto einer Variante option in Originalgröße\n<!-- regeln -->\n- lightboxImage zeigt option.media\n- lightboxCaption zeigt option.name\n- lightboxSelect erhält Fokus\n<!-- testen -->\n- Modal öffnen\n- Auf Option mit Bild klicken\n- Info-Button der Option klicken\n- Lightbox zeigt das Foto in Originalgröße\n----------------------------------------\n<!-- funktion -->\nTastatur verwenden\n<!-- ziel -->\nBedient Modal und Lightbox per Tastatur\n<!-- regeln -->\n- Escape schließt Lightbox oder Modal\n- Tab zirkuliert im Fokusring vorwärts\n- Shift-Tab zirkuliert im Fokusring rückwärts\n<!-- testen -->\n- Modal öffnen\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen\n- Escape drücken\n- Modal geschlossen\n"
}
},
{
"titel": "„Produkt“ geändert",
"dateien": {
"produkt": "<!-- titel -->\nProdukt\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nStellt dem Produkttemplate Daten des Variantenkonfigurators bereit\n----------------------------------------\n<!-- regeln -->\n- Inaktiver Konfigurator setzt mtoVariantConfiguratorActive auf false\n- Aktiver Konfigurator weist alle Konfigurator-Variablen zu\n- sw-product-detail-variants wird mit eigener Template-Datei überschrieben\n- mtoVariantConfiguratorTrustLogo fehlt in Regeln und Funktion\n- Produktseite laden: Testschritte beschreiben Ergebnis statt Handlung\n- Variantenansicht erweitern: Funktion hat keine Testschritte, nur Regeln\n----------------------------------------\n<!-- funktion -->\nProduktseite laden\n<!-- ziel -->\nBereitet Variant-Konfigurationsdaten für die Produktseite vor\n<!-- regeln -->\n- mtoVariantConfiguratorActive false bei inaktivem Konfigurator\n- Alle Variablen bei aktivem Konfigurator zugewiesen\n- Initial-Variante für vorausgefülltes Modal geladen\n<!-- testen -->\n- Produkt mit aktivem Konfigurator öffnen\n- Seite vollständig laden\n- Template-Variablen prüfen\n- Seite ohne Konfigurator öffnen\n- mtoVariantConfiguratorActive ist false\n----------------------------------------\n<!-- funktion -->\nVariantenansicht erweitern\n<!-- ziel -->\nFügt der Produktdetail-Variantenansicht zusätzliche Felder oder Funktionen hinzu\n<!-- regeln -->\n- Überschreibt sw-product-detail-variants\n- Eigene Template-Datei wird geladen\n<!-- testen -->\n- Produktdetailseite öffnen\n- Varianten-Bereich aufrufen\n- Erweiterte Felder oder Funktionen sichtbar\n"
}
},
{
"titel": "„Lightbox“ geändert",
"dateien": {
"lightbox": "<!-- titel -->\nLightbox\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nZeigt eine vergrößerte Ansicht der Optionsabbildung mit ihrem Namen\n----------------------------------------\n<!-- regeln -->\n- lightboxSelect bestätigt Auswahl und schließt\n- Escape und x-Icon schließen\n- Tab und Shift-Tab zirkulieren im Fokusring\n- Geschlossen kehrt Fokus zum Auslöser zurück\n- hidden-Attribut entfernt aus dem Barrierefreiheitsbaum\n----------------------------------------\n<!-- funktion -->\nAuswahl bestätigen\n<!-- ziel -->\nWählt eine Option im aktuellen Schritt und berechnet die gültigen Folgeschritte neu\n<!-- regeln -->\n- Bleibt im aktuellen Schritt\n- Invalidiert Folgeschritte mit ungültigen Kombinationen\n- Setzt Fokus auf die gewählte Option\n- Aktualisiert Galerie und Preis\n<!-- testen -->\n- Lightbox mit Option öffnen\n- LMB auf Auswahl bestätigen\n- Option markiert\n----------------------------------------\n<!-- funktion -->\nKonfigurator schließen\n<!-- regeln -->\n- Schließt die Lightbox, ohne den Konfigurator zu schließen\n- x-Icon oder Escape beenden die Lightbox\n- Fokus kehrt zum Auslöser in der Optionsliste zurück\n<!-- testen -->\n- Option mit Bildauswahl öffnet die Lightbox\n- Escape drücken\n- Lightbox geschlossen, Modal offen\n----------------------------------------\n<!-- funktion -->\nLightbox schließen\n<!-- ziel -->\nEntfernt die vergrößerte Produktansicht wieder\n<!-- regeln -->\n- x-Icon oder Escape schließt\n- Zurück zum Dialog gibt Focus\n<!-- testen -->\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen, Dialog fokussiert\n----------------------------------------\n<!-- funktion -->\nLightbox öffnen\n<!-- ziel -->\nZeigt das Produktfoto einer Variante option in Originalgröße\n<!-- regeln -->\n- lightboxImage zeigt option.media\n- lightboxCaption zeigt option.name\n- lightboxSelect erhält Fokus\n<!-- testen -->\n- Modal öffnen\n- Auf Option mit Bild klicken\n- Info-Button der Option klicken\n- Lightbox zeigt das Foto in Originalgröße\n----------------------------------------\n<!-- funktion -->\nTastatur verwenden\n<!-- ziel -->\nBedient Modal und Lightbox per Tastatur\n<!-- regeln -->\n- Escape schließt Lightbox oder Modal\n- Tab zirkuliert im Fokusring vorwärts\n- Shift-Tab zirkuliert im Fokusring rückwärts\n<!-- testen -->\n- Modal öffnen\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen\n- Escape drücken\n- Modal geschlossen\n"
}
},
{
"titel": "„Galerie“ geändert",
"dateien": {
"galerie": "<!-- titel -->\nGalerie\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nErmöglicht das Anzeigen und Durchblättern von Produktbildern im Konfigurator-Modal\n----------------------------------------\n<!-- regeln -->\n- Einzelne Galerie pro Modal\n- Navigiert zyklisch\n- Ein Bild deaktiviert Navigation\n- Hauptbild über thumbnails aktualisierbar\n----------------------------------------\n<!-- funktion -->\nGalerie nächste anzeigen\n<!-- ziel -->\nZeigt das nächste Bild der Galerie\n<!-- regeln -->\n- Mindestens 2 Bilder vorhanden\n- Zyklisch von letztem zu erstem Bild\n<!-- testen -->\n- Auf next-Button klicken\n- Nächstes Bild wird angezeigt\n----------------------------------------\n<!-- funktion -->\nGalerie rückwärts blättern\n<!-- ziel -->\nVorheriges Bild der Galerie anzeigen\n<!-- regeln -->\n- Nur mit mindestens zwei Bildern\n- Springt von erstem zum letzten Bild\n- Aktualisiert Miniaturansicht\n<!-- testen -->\n- Vollmodus öffnen\n- Klick auf Vorheriges-Bild-Icon\n- Erstes Bild zeigt\n----------------------------------------\n<!-- funktion -->\nGalerie vorherige anzeigen\n<!-- ziel -->\nBlendet das vorherige Bild der Galerie ein\n<!-- regeln -->\n- mto-vc-gallery-prev-Icon\n- Bei nur einem Bild keine Wirkung\n<!-- testen -->\n- Galerie mit mindestens zwei Bildern öffnen\n- LMB auf mto-vc-gallery-prev-Icon\n- Vorheriges Bild im Stage-Image angezeigt\n----------------------------------------\n<!-- funktion -->\nGalerie vorwärts blättern\n<!-- ziel -->\nZeigt das nächste Bild der Galerie\n<!-- regeln -->\n- Geht bei weniger als zwei Bildern nicht\n- Springt vom letzten zum ersten Bild\n<!-- testen -->\n- Modal öffnen\n- Klick auf gallery-next\n- Nächstes Bild wird angezeigt\n----------------------------------------\n<!-- funktion -->\nThumbnail auswählen\n<!-- ziel -->\nGreift direkt auf ein Produktbild zu, ohne durch die Galerie zu blättern\n<!-- regeln -->\n- Aktives Thumbnail zeigt x-Icon\n- Klick aktualisiert Hauptbild und Aktivzustand\n<!-- testen -->\n- Galerie mit mehreren Thumbnails öffnen\n- Klick auf Thumbnail\n- Hauptbild entspricht geklicktem Thumbnail\n"
}
},
{
"titel": "„Lightbox“ geändert",
"dateien": {
"lightbox": "<!-- titel -->\nLightbox\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nZeigt eine vergrößerte Ansicht der Optionsabbildung mit ihrem Namen\n----------------------------------------\n<!-- regeln -->\n- lightboxSelect bestätigt Auswahl und schließt\n- Escape und x-Icon schließen\n- Tab und Shift-Tab zirkulieren im Fokusring\n- Geschlossen kehrt Fokus zum Auslöser zurück\n- hidden-Attribut entfernt aus dem Barrierefreiheitsbaum\n----------------------------------------\n<!-- funktion -->\nAuswahl bestätigen\n<!-- ziel -->\nWählt eine Option im aktuellen Schritt und berechnet die gültigen Folgeschritte neu\n<!-- regeln -->\n- Bleibt im aktuellen Schritt\n- Invalidiert Folgeschritte mit ungültigen Kombinationen\n- Setzt Fokus auf die gewählte Option\n- Aktualisiert Galerie und Preis\n<!-- testen -->\n- Lightbox mit Option öffnen\n- LMB auf Auswahl bestätigen\n- Option markiert\n----------------------------------------\n<!-- funktion -->\nKonfigurator schließen\n<!-- regeln -->\n- Schließt die Lightbox, ohne den Konfigurator zu schließen\n- x-Icon oder Escape beenden die Lightbox\n- Fokus kehrt zum Auslöser in der Optionsliste zurück\n<!-- testen -->\n- LMB auf Option mit Bildauswahl\n- Escape drücken\n- Lightbox geschlossen, Modal offen\n----------------------------------------\n<!-- funktion -->\nLightbox schließen\n<!-- ziel -->\nEntfernt die vergrößerte Produktansicht wieder\n<!-- regeln -->\n- x-Icon oder Escape schließt\n- Zurück zum Dialog gibt Focus\n<!-- testen -->\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen, Dialog fokussiert\n----------------------------------------\n<!-- funktion -->\nLightbox öffnen\n<!-- ziel -->\nZeigt das Produktfoto einer Variante option in Originalgröße\n<!-- regeln -->\n- lightboxImage zeigt option.media\n- lightboxCaption zeigt option.name\n- lightboxSelect erhält Fokus\n<!-- testen -->\n- Modal öffnen\n- Auf Option mit Bild klicken\n- Info-Button der Option klicken\n- Lightbox zeigt das Foto in Originalgröße\n----------------------------------------\n<!-- funktion -->\nTastatur verwenden\n<!-- ziel -->\nBedient Modal und Lightbox per Tastatur\n<!-- regeln -->\n- Escape schließt Lightbox oder Modal\n- Tab zirkuliert im Fokusring vorwärts\n- Shift-Tab zirkuliert im Fokusring rückwärts\n<!-- testen -->\n- Modal öffnen\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen\n- Escape drücken\n- Modal geschlossen\n"
}
},
{
"titel": "„Lightbox“ geändert",
"dateien": {
"lightbox": "<!-- titel -->\nLightbox\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nZeigt eine vergrößerte Ansicht der Optionsabbildung mit ihrem Namen\n----------------------------------------\n<!-- regeln -->\n- lightboxSelect bestätigt Auswahl\n- lightboxSelect schließt\n- Escape schließt\n- x-Icon schließt\n- Geschlossen kehrt Fokus zum Auslöser zurück\n- hidden-Attribut entfernt aus dem Barrierefreiheitsbaum\n----------------------------------------\n<!-- funktion -->\nAuswahl bestätigen\n<!-- ziel -->\nWählt eine Option im aktuellen Schritt und berechnet die gültigen Folgeschritte neu\n<!-- regeln -->\n- Bleibt im aktuellen Schritt\n- Invalidiert Folgeschritte mit ungültigen Kombinationen\n- Setzt Fokus auf die gewählte Option\n- Aktualisiert Galerie und Preis\n<!-- testen -->\n- Lightbox mit Option öffnen\n- LMB auf Auswahl bestätigen\n- Option markiert\n----------------------------------------\n<!-- funktion -->\nKonfigurator schließen\n<!-- regeln -->\n- Schließt die Lightbox, ohne den Konfigurator zu schließen\n- x-Icon oder Escape beenden die Lightbox\n- Fokus kehrt zum Auslöser in der Optionsliste zurück\n<!-- testen -->\n- LMB auf Option mit Bildauswahl\n- Escape drücken\n- Lightbox geschlossen, Modal offen\n----------------------------------------\n<!-- funktion -->\nLightbox schließen\n<!-- ziel -->\nEntfernt die vergrößerte Produktansicht wieder\n<!-- regeln -->\n- x-Icon oder Escape schließt\n- Zurück zum Dialog gibt Focus\n<!-- testen -->\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen, Dialog fokussiert\n----------------------------------------\n<!-- funktion -->\nLightbox öffnen\n<!-- ziel -->\nZeigt das Produktfoto einer Variante option in Originalgröße\n<!-- regeln -->\n- lightboxImage zeigt option.media\n- lightboxCaption zeigt option.name\n- lightboxSelect erhält Fokus\n<!-- testen -->\n- Modal öffnen\n- Auf Option mit Bild klicken\n- Info-Button der Option klicken\n- Lightbox zeigt das Foto in Originalgröße\n----------------------------------------\n<!-- funktion -->\nTastatur verwenden\n<!-- ziel -->\nBedient Modal und Lightbox per Tastatur\n<!-- regeln -->\n- Escape schließt Lightbox oder Modal\n- Tab zirkuliert im Fokusring vorwärts\n- Shift-Tab zirkuliert im Fokusring rückwärts\n<!-- testen -->\n- Modal öffnen\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen\n- Escape drücken\n- Modal geschlossen\n"
}
},
{
"titel": "„Konfigurator“ geändert",
"dateien": {
"konfigurator": "<!-- titel -->\nKonfigurator\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nFührt durch Variantenkonfiguration in Einzelschritten mit Live-Vorschau\n----------------------------------------\n<!-- regeln -->\n- Aktiv nur wenn Produkt mto_variant_configurator_active gesetzt hat\n- Optionen-Bilder nur bis zwei Schritte\n- Galerie und Preis aktualisieren live ohne Seitenreload\n- Body erhält CSS-Klasse mto-vc-modal-open solange Modal offen\n- Escape schließt Modal\n- Schließen stellt Fokus auf vorheriges Element\n- Registriert als mto-vc-variants-card in swProductDetail\n- Einstellungen in customFields des Produkts gespeichert\n- Falls inaktiv: Fallback auf Standard-Konfigurator von Shopware\n- Natives Select pro Gruppe im DOM\n- Schritte ohne gültige Optionen werden beim Navigieren übersprungen\n- Ungültige Kombinationen für Folgeschritte werden beim Wählen verworfen\n- Unbesuchte Schritte werden beim Bestätigen mit erster gültiger Option aufgefüllt\n- Deaktivierte Optionen sind nicht auswählbar\n- Gallery-Container erhält CSS-Klasse has-no-gallery wenn keine Bilder vorhanden\n- Schließen bei Lightbox: fokus auf Lightbox-Auswahl-Button\n----------------------------------------\n<!-- funktion -->\nGeführte Konfiguration aktivieren\n<!-- ziel -->\nFührt Kunden schrittweise durch die Variantenauswahl mit Hinweisen und Modal\n<!-- regeln -->\n- Aktiviert bei Produkten mit aktivem Konfigurator-Layout\n- Zeigt jeden Konfigurationsschritt mit Beschriftung\n- Blendentext je Gruppe über Modal aus\n- Inkrementelle Variantenauflösung über resolveUrl\n<!-- testen -->\n- Produktseite mit aktivem Konfigurator öffnen\n- LMB auf ersten Konfigurationsschritt\n- Option im Modal wählen\n- Modal schließt und nächster Schritt markiert\n----------------------------------------\n<!-- funktion -->\nKonfigurationsdaten abrufen\n<!-- ziel -->\nLiefert Variantendaten für eine Live-Aktualisierung im Konfigurator\n<!-- regeln -->\n- Endpoint mto-variant-configurator resolve\n- Query-Parameter switched enthält die aktuell gewechselte Gruppe\n- Query-Parameter options enthält ein JSON-Array gewählter Optionen\n- Ungültiges JSON führt zu leerem options-Array\n- VariantNotFoundException hält productId als Fallback\n- Rückgabe enthält variantId, gallery media und Preis\n- Kein HTTP-Cache wegen kundenspezifischer Preise\n<!-- testen -->\n- Resolve-Endpunkt mit Produkt-ID und Option aufrufen\n- Antwort enthält variantId\n- Antwort enthält gallery media\n- Antwort enthält Preis\n----------------------------------------\n<!-- funktion -->\nKonfigurator öffnen\n<!-- ziel -->\nÖffnet den Konfigurator ab einem gewählten Schritt\n<!-- regeln -->\n- Erster Aufruf zeigt das Modal\n- Weiterer Aufruf wechselt den Schritt\n- Fokus vorheriges Element wird gespeichert\n- Body erhält CSS-Klasse mto-vc-modal-open\n- Escape-Schließen wird registriert\n- Galerie und Preis werden aktualisiert\n- Fokus springt auf den Next-Button\n<!-- testen -->\n- LMB auf Konfigurator-Trigger klicken\n- Modal erscheint im gewählten Schritt\n----------------------------------------\n<!-- funktion -->\nKonfigurator-Karte registrieren\n<!-- ziel -->\nMacht die Einstellungen des Varianten-Konfigurators auf der Produktdetail-Seite verfügbar\n<!-- regeln -->\n- Registriert als mto-vc-variants-card\n- Nutzt Produkt aus swProductDetail\n- Speichert Einstellungen in customFields des Produkts\n<!-- testen -->\n- Produktdetail-Seite eines Produkts öffnen\n- Tab Variants aufrufen\n- Registrierte mto-vc-variants-card wird angezeigt\n----------------------------------------\n<!-- funktion -->\nPlugin registrieren\n<!-- ziel -->\nMacht das Plugin für Elemente mit dem Selektor verfügbar\n<!-- regeln -->\n- Registriert unter VariantConfiguratorPlugin\n- Nutzt window.PluginManager\n- Bindet an [data-mto-variant-configurator]\n<!-- testen -->\n- PluginManager.register aufrufen\n- Element mit data-mto-variant-configurator erstellen\n- Plugin auf Element angewendet\n"
}
},
{
"titel": "„Lightbox“ geändert",
"dateien": {
"lightbox": "<!-- titel -->\nLightbox\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nZeigt eine vergrößerte Ansicht der Optionsabbildung mit ihrem Namen\n----------------------------------------\n<!-- regeln -->\n- lightboxSelect bestätigt Auswahl\n- lightboxSelect schließt\n- Escape schließt\n- x-Icon schließt\n- Geschlossen kehrt Fokus zum Auslöser zurück\n- hidden-Attribut entfernt aus dem Barrierefreiheitsbaum\n----------------------------------------\n<!-- funktion -->\nAuswahl bestätigen\n<!-- ziel -->\nWählt eine Option im aktuellen Schritt und berechnet die gültigen Folgeschritte neu\n<!-- regeln -->\n- Bleibt im aktuellen Schritt\n- Invalidiert Folgeschritte mit ungültigen Kombinationen\n- Setzt Fokus auf die gewählte Option\n- Aktualisiert Galerie und Preis\n<!-- testen -->\n- Lightbox mit Option öffnen\n- LMB auf Auswahl bestätigen\n- Option markiert\n----------------------------------------\n<!-- funktion -->\nKonfigurator schließen\n<!-- regeln -->\n- Schließt die Lightbox, ohne den Konfigurator zu schließen\n- x-Icon oder Escape beenden die Lightbox\n- Fokus kehrt zum Auslöser in der Optionsliste zurück\n<!-- testen -->\n- LMB auf Option mit Bildauswahl\n- Escape drücken\n- Lightbox geschlossen, Modal offen\n----------------------------------------\n<!-- funktion -->\nLightbox schließen\n<!-- ziel -->\nEntfernt die vergrößerte Produktansicht wieder\n<!-- regeln -->\n- x-Icon schließt\n- Escape schließt\n- Zurück zum Dialog gibt Focus\n<!-- testen -->\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen, Dialog fokussiert\n----------------------------------------\n<!-- funktion -->\nLightbox öffnen\n<!-- ziel -->\nZeigt das Produktfoto einer Variante option in Originalgröße\n<!-- regeln -->\n- lightboxImage zeigt option.media\n- lightboxCaption zeigt option.name\n- lightboxSelect erhält Fokus\n<!-- testen -->\n- Modal öffnen\n- Auf Option mit Bild klicken\n- Info-Button der Option klicken\n- Lightbox zeigt das Foto in Originalgröße\n----------------------------------------\n<!-- funktion -->\nTastatur verwenden\n<!-- ziel -->\nBedient Modal und Lightbox per Tastatur\n<!-- regeln -->\n- Escape schließt Lightbox oder Modal\n- Tab zirkuliert im Fokusring vorwärts\n- Shift-Tab zirkuliert im Fokusring rückwärts\n<!-- testen -->\n- Modal öffnen\n- Lightbox öffnen\n- Escape drücken\n- Lightbox geschlossen\n- Escape drücken\n- Modal geschlossen\n"
}
},
{
"titel": "„Option ansehen“ geändert",
"dateien": {
"option-ansehen": "<!-- titel -->\nOption ansehen\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nDer Kunde prüft eine Option groß, bevor er sie nimmt\n----------------------------------------\n<!-- regeln -->\n- Nur Optionen mit Bild tragen den Hinweis\n- Optionsbilder erscheinen bis zwei Schritte\n- Ansicht liegt über dem Konfigurator\n----------------------------------------\n<!-- funktion -->\nOptionsdetail öffnen\n<!-- ziel -->\nZeigt Bild und Namen einer Option in voller Größe\n<!-- regeln -->\n- i-Icon öffnet die Ansicht\n- Enter öffnet die Ansicht\n- Leertaste öffnet die Ansicht\n<!-- testen -->\n- Konfigurator öffnen\n- LMB auf i-Icon einer Option\n- Große Ansicht erscheint\n----------------------------------------\n<!-- funktion -->\nOption aus Ansicht wählen\n<!-- ziel -->\nÜbernimmt die betrachtete Option in die Auswahl\n<!-- regeln -->\n- Knopf übernimmt und schließt die Ansicht\n- Schritt bleibt derselbe\n<!-- testen -->\n- Optionsdetail öffnen\n- LMB auf Wählen-Knopf\n- Option ist gewählt\n----------------------------------------\n<!-- funktion -->\nAnsicht schließen\n<!-- ziel -->\nKehrt zur Optionsliste zurück ohne Auswahl\n<!-- regeln -->\n- x-Icon schließt die Ansicht\n- Escape schließt die Ansicht\n- Konfigurator bleibt offen\n<!-- testen -->\n- Optionsdetail öffnen\n- Escape drücken\n- Optionsliste erscheint wieder\n"
}
},
{
"titel": "„Varianten wählen“ geändert",
"dateien": {
"varianten-waehlen": "<!-- titel -->\nVarianten wählen\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nDer Kunde findet Schritt für Schritt eine bestellbare Kombination\n----------------------------------------\n<!-- regeln -->\n- Erster Schritt zeigt alle Optionen seiner Eigenschaft\n- Folgeschritte zeigen nur kombinierbare Optionen\n- Reihenfolge der Schritte kommt aus dem Backend\n- Ohne Auswahl greifen die Standardvarianten des Elternartikels\n- Schritte ohne gültige Option werden übersprungen\n- Eine Auswahl wechselt den Schritt nicht\n- Ungültige Folgeauswahl fällt beim Wechsel weg\n- Escape schließt den Konfigurator\n- Tabulator bleibt im Dialog\n----------------------------------------\n<!-- funktion -->\nSchritt öffnen\n<!-- ziel -->\nÖffnet den Konfigurator beim angeklickten Schritt\n<!-- regeln -->\n- LMB auf einen Schritt öffnet das Modal\n- Offener Konfigurator wechselt nur den Schritt\n- Modal hängt am Seitenkörper\n<!-- testen -->\n- Produktseite öffnen\n- LMB auf zweiten Schritt\n- Modal öffnet bei Schritt 2\n----------------------------------------\n<!-- funktion -->\nOption wählen\n<!-- ziel -->\nÜbernimmt eine Option in die laufende Auswahl\n<!-- regeln -->\n- Gewählte Option ist hervorgehoben\n- Nicht kombinierbare Optionen sind gesperrt\n- Auswahl verwirft ungültige Folgeschritte\n<!-- testen -->\n- Konfigurator öffnen\n- LMB auf eine Option\n- Option ist hervorgehoben\n----------------------------------------\n<!-- funktion -->\nNächsten Schritt anzeigen\n<!-- ziel -->\nFührt zum nächsten Schritt mit gültigen Optionen\n<!-- regeln -->\n- Weiter-Knopf heißt am letzten Schritt Fertig\n- Leere Schritte werden übersprungen\n<!-- testen -->\n- Konfigurator öffnen\n- LMB auf Weiter-Knopf\n- Nächster Schritt erscheint\n----------------------------------------\n<!-- funktion -->\nVorherigen Schritt anzeigen\n<!-- ziel -->\nFührt zurück zum letzten Schritt mit Optionen\n<!-- regeln -->\n- Zurück-Knopf ist am ersten Schritt gesperrt\n- Leere Schritte werden übersprungen\n<!-- testen -->\n- Zum zweiten Schritt gehen\n- LMB auf Zurück-Knopf\n- Erster Schritt erscheint\n----------------------------------------\n<!-- funktion -->\nAuswahl übernehmen\n<!-- ziel -->\nWechselt das Produkt auf die gewählte Variante\n<!-- regeln -->\n- Fertig schreibt die Auswahl in die Auswahlfelder\n- Unbesuchte Schritte bekommen die erste gültige Option\n- Der Variantenwechsel von Shopware führt den Wechsel aus\n<!-- testen -->\n- Alle Schritte durchgehen\n- LMB auf Fertig-Knopf\n- Seite zeigt die gewählte Variante\n----------------------------------------\n<!-- funktion -->\nKonfigurator schließen\n<!-- ziel -->\nBeendet die Auswahl ohne Wechsel der Variante\n<!-- regeln -->\n- x-Icon schließt das Modal\n- Escape schließt das Modal\n- Fokus kehrt zum Auslöser zurück\n<!-- testen -->\n- Konfigurator öffnen\n- Escape drücken\n- Modal ist geschlossen\n"
}
},
{
"titel": "„Vorschau zeigen“ geändert",
"dateien": {
"vorschau-zeigen": "<!-- titel -->\nVorschau zeigen\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nDer Kunde sieht Bild und Preis der gewählten Kombination\n----------------------------------------\n<!-- regeln -->\n- Preis stimmt mit dem Preis der Produktseite überein\n- Antwort wird nicht zwischengespeichert\n- Späte Antworten überholter Anfragen werden verworfen\n- Ohne eigene Bilder greifen die Bilder des Elternartikels\n----------------------------------------\n<!-- funktion -->\nVorschau laden\n<!-- ziel -->\nHolt Bilder und Preis zur laufenden Auswahl\n<!-- regeln -->\n- Jede Auswahl löst eine neue Anfrage aus\n- Ohne Treffer bleibt die Produkt-ID als Rückfall\n- Erstes Bild ist das Titelbild der Variante\n<!-- testen -->\n- Konfigurator öffnen\n- Andere Option wählen\n- Bild und Preis ändern sich\n----------------------------------------\n<!-- funktion -->\nGalerie blättern\n<!-- ziel -->\nZeigt weitere Bilder der gewählten Variante\n<!-- regeln -->\n- Pfeil-Icons blättern vor und zurück\n- Nach dem letzten Bild folgt das erste\n- Bei einem Bild bleibt die Navigation aus\n<!-- testen -->\n- Konfigurator öffnen\n- LMB auf Vor-Icon\n- Nächstes Bild erscheint\n----------------------------------------\n<!-- funktion -->\nBild wählen\n<!-- ziel -->\nWechselt das große Bild über die Vorschaubilder\n<!-- regeln -->\n- Aktives Vorschaubild ist hervorgehoben\n- Großes Bild folgt der Wahl\n<!-- testen -->\n- Konfigurator öffnen\n- LMB auf drittes Vorschaubild\n- Großes Bild zeigt dieses Motiv\n"
}
},
{
"titel": "„Varianten wählen“ geändert",
"dateien": {
"varianten-waehlen": "<!-- titel -->\nVarianten wählen\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nDer Kunde findet Schritt für Schritt eine bestellbare Kombination\n----------------------------------------\n<!-- regeln -->\n- Erster Schritt zeigt alle Optionen seiner Eigenschaft\n- Folgeschritte zeigen nur kombinierbare Optionen\n- Der Ablauf trägt beliebig viele Eigenschaften\n- Reihenfolge der Schritte kommt aus dem Backend\n- Ohne Auswahl greifen die Standardvarianten des Elternartikels\n- Schritte ohne gültige Option werden übersprungen\n- Eine Auswahl wechselt den Schritt nicht\n- Ungültige Folgeauswahl fällt beim Wechsel weg\n- Auf kleinen Bildschirmen bleibt der Ablauf derselbe\n- Escape schließt den Konfigurator\n- Tabulator bleibt im Dialog\n----------------------------------------\n<!-- funktion -->\nSchritt öffnen\n<!-- ziel -->\nÖffnet den Konfigurator beim angeklickten Schritt\n<!-- regeln -->\n- LMB auf einen Schritt öffnet das Modal\n- Offener Konfigurator wechselt nur den Schritt\n- Modal hängt am Seitenkörper\n<!-- testen -->\n- Produktseite öffnen\n- LMB auf zweiten Schritt\n- Modal öffnet bei Schritt 2\n----------------------------------------\n<!-- funktion -->\nOption wählen\n<!-- ziel -->\nÜbernimmt eine Option in die laufende Auswahl\n<!-- regeln -->\n- Gewählte Option ist hervorgehoben\n- Nicht kombinierbare Optionen sind gesperrt\n- Auswahl verwirft ungültige Folgeschritte\n- Schritt bleibt nach der Wahl derselbe\n<!-- testen -->\n- Konfigurator öffnen\n- LMB auf eine Option\n- Option ist hervorgehoben\n----------------------------------------\n<!-- funktion -->\nNächsten Schritt anzeigen\n<!-- ziel -->\nFührt zum nächsten Schritt mit gültigen Optionen\n<!-- regeln -->\n- Weiter-Knopf heißt am letzten Schritt Fertig\n- Leere Schritte werden übersprungen\n<!-- testen -->\n- Konfigurator öffnen\n- LMB auf Weiter-Knopf\n- Nächster Schritt erscheint\n----------------------------------------\n<!-- funktion -->\nVorherigen Schritt anzeigen\n<!-- ziel -->\nFührt zurück zum letzten Schritt mit Optionen\n<!-- regeln -->\n- Zurück-Knopf ist am ersten Schritt gesperrt\n- Leere Schritte werden übersprungen\n<!-- testen -->\n- Zum zweiten Schritt gehen\n- LMB auf Zurück-Knopf\n- Erster Schritt erscheint\n----------------------------------------\n<!-- funktion -->\nAuswahl übernehmen\n<!-- ziel -->\nWechselt das Produkt auf die gewählte Variante\n<!-- regeln -->\n- Fertig schreibt die Auswahl in die Auswahlfelder\n- Unbesuchte Schritte bekommen die erste gültige Option\n- Der Variantenwechsel von Shopware führt den Wechsel aus\n- Die Seite zeigt danach die Adresse der Variante\n<!-- testen -->\n- Alle Schritte durchgehen\n- LMB auf Fertig-Knopf\n- Produktseite zeigt die gewählte Variante\n----------------------------------------\n<!-- funktion -->\nKonfigurator schließen\n<!-- ziel -->\nBeendet die Auswahl ohne Wechsel der Variante\n<!-- regeln -->\n- x-Icon schließt das Modal\n- Escape schließt das Modal\n- Fokus kehrt zum Auslöser zurück\n<!-- testen -->\n- Konfigurator öffnen\n- Escape drücken\n- Modal ist geschlossen\n"
}
},
{
"titel": "„Layout zuweisen“ geändert",
"dateien": {
"layout-zuweisen": "<!-- titel -->\nLayout zuweisen\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nEin Händler entscheidet je Produkt, ob die geführte Auswahl erscheint\n----------------------------------------\n<!-- regeln -->\n- Einstellungen liegen auf dem Varianten-Tab des Produkts\n- Werte stehen in den customFields des Produkts\n- Bearbeiten erfordert das Recht product.editor\n- Ohne Zuweisung bleibt das Standardlayout aktiv\n----------------------------------------\n<!-- funktion -->\nKonfigurator aktivieren\n<!-- ziel -->\nSchaltet die geführte Variantenauswahl für ein Produkt frei\n<!-- regeln -->\n- Schalter steht auf dem Varianten-Tab\n- Aktiv ersetzt die Buybox des Produkts\n- Inaktiv zeigt das Standardlayout von Shopware\n<!-- testen -->\n- Produkt im Admin öffnen\n- Varianten-Tab öffnen\n- Schalter aktivieren und speichern\n- Buybox zeigt die geführte Auswahl\n----------------------------------------\n<!-- funktion -->\nOptionsübersicht hinterlegen\n<!-- ziel -->\nHinterlegt ein PDF mit allen Varianten und Kombinationen\n<!-- regeln -->\n- Medienfeld steht auf dem Varianten-Tab\n- Feld hängt am Hauptartikel\n- Ohne PDF bleibt der Knopf unsichtbar\n<!-- testen -->\n- Varianten-Tab öffnen\n- PDF im Medienfeld wählen\n- Produkt speichern\n- Modal zeigt den Knopf für Optionen\n----------------------------------------\n<!-- funktion -->\nTrust-Logo hinterlegen\n<!-- ziel -->\nZeigt ein Vertrauenssiegel neben dem Gesamtpreis\n<!-- regeln -->\n- Logo steht in der Plugin-Konfiguration\n- Gilt für den ganzen Verkaufskanal\n- Ohne Logo erscheint nur der Text\n<!-- testen -->\n- Plugin-Konfiguration öffnen\n- Logo im Medienfeld wählen\n- Modal zeigt das Logo am Preis\n----------------------------------------\n<!-- funktion -->\nOptionsbild zuordnen\n<!-- stand -->\noffen\n<!-- ziel -->\nHinterlegt je Variante ein Farbbild oder Materialbild\n<!-- regeln -->\n- Zuordnung erfolgt auf Variantenebene\n- Bild erscheint neben der Option im Modal\n<!-- testen -->\n- Variante im Admin öffnen\n- Bild der Variante zuordnen\n- Modal zeigt das Bild an der Option\n"
}
},
{
"titel": "„Varianten wählen“ geändert",
"dateien": {
"varianten-waehlen": "<!-- titel -->\nVarianten wählen\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nDer Kunde findet Schritt für Schritt eine bestellbare Kombination\n----------------------------------------\n<!-- regeln -->\n- Erster Schritt zeigt alle Optionen seiner Eigenschaft\n- Folgeschritte zeigen nur kombinierbare Optionen\n- Der Ablauf trägt beliebig viele Eigenschaften\n- Reihenfolge der Schritte kommt aus dem Backend\n- Ohne Auswahl greifen die Standardvarianten des Elternartikels\n- Schritte ohne gültige Option werden übersprungen\n- Eine Auswahl wechselt den Schritt nicht\n- Ungültige Folgeauswahl fällt beim Wechsel weg\n- Auf kleinen Bildschirmen bleibt der Ablauf derselbe\n- Escape schließt den Konfigurator\n- Tabulator bleibt im Dialog\n----------------------------------------\n<!-- funktion -->\nSchritt öffnen\n<!-- ziel -->\nÖffnet den Konfigurator beim angeklickten Schritt\n<!-- regeln -->\n- LMB auf einen Schritt öffnet das Modal\n- Offener Konfigurator wechselt nur den Schritt\n- Modal hängt am Seitenkörper\n<!-- testen -->\n- Produktseite öffnen\n- LMB auf zweiten Schritt\n- Modal öffnet bei Schritt 2\n----------------------------------------\n<!-- funktion -->\nOption wählen\n<!-- ziel -->\nÜbernimmt eine Option in die laufende Auswahl\n<!-- regeln -->\n- Gewählte Option ist hervorgehoben\n- Nicht kombinierbare Optionen sind gesperrt\n- Auswahl verwirft ungültige Folgeschritte\n- Schritt bleibt nach der Wahl derselbe\n<!-- testen -->\n- Konfigurator öffnen\n- LMB auf eine Option\n- Option ist hervorgehoben\n----------------------------------------\n<!-- funktion -->\nNächsten Schritt anzeigen\n<!-- ziel -->\nFührt zum nächsten Schritt mit gültigen Optionen\n<!-- regeln -->\n- Weiter-Knopf heißt am letzten Schritt Fertig\n- Leere Schritte werden übersprungen\n<!-- testen -->\n- Konfigurator öffnen\n- LMB auf Weiter-Knopf\n- Nächster Schritt erscheint\n----------------------------------------\n<!-- funktion -->\nVorherigen Schritt anzeigen\n<!-- ziel -->\nFührt zurück zum letzten Schritt mit Optionen\n<!-- regeln -->\n- Zurück-Knopf ist am ersten Schritt gesperrt\n- Leere Schritte werden übersprungen\n<!-- testen -->\n- Zum zweiten Schritt gehen\n- LMB auf Zurück-Knopf\n- Erster Schritt erscheint\n----------------------------------------\n<!-- funktion -->\nAuswahl übernehmen\n<!-- ziel -->\nWechselt das Produkt auf die gewählte Variante\n<!-- regeln -->\n- Fertig überträgt die Auswahl in die Auswahlfelder\n- Unbesuchte Schritte bekommen die erste gültige Option\n- Shopware führt den Variantenwechsel aus\n<!-- testen -->\n- Alle Schritte durchgehen\n- LMB auf Fertig-Knopf\n- Produktseite zeigt die gewählte Variante\n----------------------------------------\n<!-- funktion -->\nKonfigurator schließen\n<!-- ziel -->\nBeendet die Auswahl ohne Wechsel der Variante\n<!-- regeln -->\n- x-Icon schließt das Modal\n- Escape schließt das Modal\n- Fokus kehrt zum Auslöser zurück\n<!-- testen -->\n- Konfigurator öffnen\n- Escape drücken\n- Modal ist geschlossen\n"
}
},
{
"titel": "„Schritt zeigen“ geändert",
"dateien": {
"schritt-zeigen": "<!-- titel -->\nSchritt zeigen\n----------------------------------------\n<!-- art -->\nkern\n----------------------------------------\n<!-- ziel -->\nDer Kunde weiß im Modal, wo er steht und was er wählt\n----------------------------------------\n<!-- regeln -->\n- Optionen stehen rechts, die Bilder links\n- Lange Optionslisten lassen sich scrollen\n----------------------------------------\n<!-- funktion -->\nEigenschaft benennen\n<!-- ziel -->\nZeigt den Namen der Eigenschaft des aktuellen Schritts\n<!-- regeln -->\n- Name steht als Überschrift über der Liste\n- Name kommt aus der Eigenschaftsgruppe\n<!-- testen -->\n- Konfigurator öffnen\n- Überschrift nennt die erste Eigenschaft\n----------------------------------------\n<!-- funktion -->\nSchrittstand anzeigen\n<!-- ziel -->\nZeigt den aktuellen Schritt und die Gesamtzahl\n<!-- regeln -->\n- Zähler nennt Schritt und Gesamtzahl\n- Balken wächst mit dem Fortschritt\n- Text kommt aus einem Textbaustein\n<!-- testen -->\n- Konfigurator öffnen\n- Zähler zeigt 1 von 3\n----------------------------------------\n<!-- funktion -->\nOptionen auflisten\n<!-- ziel -->\nZeigt alle Optionen der Eigenschaft mit Namen und Bild\n<!-- regeln -->\n- Jede Option nennt ihren Namen\n- Bild erscheint nur bis zwei Schritte\n- Ohne Bild erscheint der Farbwert\n- Ohne Farbwert bleibt die Zeile ohne Zeichen\n<!-- testen -->\n- Konfigurator öffnen\n- Jede Option zeigt ihren Namen\n"
}
}
]

View File

@@ -0,0 +1,49 @@
<!-- titel -->
Auswahl anstoßen
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Der Kunde erkennt in der Buybox die Reihenfolge der Schritte
----------------------------------------
<!-- regeln -->
- Jede Eigenschaft bildet einen eigenen Schritt
- Natives Auswahlfeld bleibt für den Variantenwechsel erhalten
- Eigene Darstellung gilt unabhängig vom Anzeigetyp der Eigenschaft
- Ohne aktives Layout erscheint die Standard-Buybox
----------------------------------------
<!-- funktion -->
Schrittnummer anzeigen
<!-- ziel -->
Zeigt neben jeder Eigenschaft ihre Position im Ablauf
<!-- regeln -->
- Beschriftung nennt das Wort Schritt und die Nummer
- Nummer folgt der Reihenfolge aus dem Backend
<!-- testen -->
- Produktseite öffnen
- Erste Eigenschaft zeigt Schritt 1
----------------------------------------
<!-- funktion -->
Hinweistext anzeigen
<!-- ziel -->
Erklärt dem Kunden, worauf er im Schritt achtet
<!-- regeln -->
- Text kommt aus einem Textbaustein je Schritt
- Leerer Textbaustein blendet den Hinweis aus
- Hinweis hängt an der Nummer statt an der Eigenschaft
<!-- testen -->
- Textbaustein für Schritt 1 füllen
- Produktseite öffnen
- Hinweis steht unter der Überschrift
----------------------------------------
<!-- funktion -->
Gewählte Option anzeigen
<!-- ziel -->
Zeigt am Schritt, welche Option gerade gilt
<!-- regeln -->
- Ohne Auswahl steht dort Bitte wählen
- Vorbelegung erscheint ohne Zutun des Kunden
<!-- testen -->
- Hauptartikel ohne Variante öffnen
- Jeder Schritt nennt eine Option

View File

@@ -0,0 +1,47 @@
<!-- titel -->
Beratung anbieten
----------------------------------------
<!-- art -->
optional
----------------------------------------
<!-- ziel -->
Der Kunde findet im Konfigurator Vertrauen und einen Kontakt
----------------------------------------
<!-- regeln -->
- Alle Texte kommen aus Textbausteinen
- Leerer Textbaustein blendet den Bereich aus
----------------------------------------
<!-- funktion -->
Vertrauen zeigen
<!-- ziel -->
Zeigt Siegel und Zusage neben dem Gesamtpreis
<!-- regeln -->
- Logo stammt aus der Plugin-Konfiguration
- Ohne Logo bleibt der Text stehen
<!-- testen -->
- Konfigurator öffnen
- Siegel steht neben dem Preis
----------------------------------------
<!-- funktion -->
Beratung erreichen
<!-- ziel -->
Bietet eine Telefonnummer für Fragen zur Konfiguration
<!-- regeln -->
- Nummer ist als Telefonlink klickbar
- Leere Nummer blendet den Bereich aus
<!-- testen -->
- Konfigurator öffnen
- LMB auf die Nummer
- Telefon-App öffnet sich
----------------------------------------
<!-- funktion -->
Optionsübersicht öffnen
<!-- ziel -->
Öffnet das hinterlegte PDF mit allen Optionen
<!-- regeln -->
- Knopf erscheint nur mit hinterlegtem PDF
- PDF öffnet in einem neuen Tab
<!-- testen -->
- Konfigurator öffnen
- LMB auf Optionen-Knopf
- PDF öffnet in neuem Tab

View File

@@ -0,0 +1,69 @@
<!-- titel -->
Layout zuweisen
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Ein Händler entscheidet je Produkt, ob die geführte Auswahl erscheint
----------------------------------------
<!-- regeln -->
- Einstellungen liegen auf dem Varianten-Tab des Produkts
- Werte stehen in den customFields des Produkts
- Bearbeiten erfordert das Recht product.editor
- Ohne Zuweisung bleibt das Standardlayout aktiv
----------------------------------------
<!-- funktion -->
Konfigurator aktivieren
<!-- ziel -->
Schaltet die geführte Variantenauswahl für ein Produkt frei
<!-- regeln -->
- Schalter steht auf dem Varianten-Tab
- Aktiv ersetzt die Buybox des Produkts
- Inaktiv zeigt das Standardlayout von Shopware
<!-- testen -->
- Produkt im Admin öffnen
- Varianten-Tab öffnen
- Schalter aktivieren und speichern
- Buybox zeigt die geführte Auswahl
----------------------------------------
<!-- funktion -->
Optionsübersicht hinterlegen
<!-- ziel -->
Hinterlegt ein PDF mit allen Varianten und Kombinationen
<!-- regeln -->
- Medienfeld steht auf dem Varianten-Tab
- Feld hängt am Hauptartikel
- Ohne PDF bleibt der Knopf unsichtbar
<!-- testen -->
- Varianten-Tab öffnen
- PDF im Medienfeld wählen
- Produkt speichern
- Modal zeigt den Knopf für Optionen
----------------------------------------
<!-- funktion -->
Trust-Logo hinterlegen
<!-- ziel -->
Zeigt ein Vertrauenssiegel neben dem Gesamtpreis
<!-- regeln -->
- Logo steht in der Plugin-Konfiguration
- Gilt für den ganzen Verkaufskanal
- Ohne Logo erscheint nur der Text
<!-- testen -->
- Plugin-Konfiguration öffnen
- Logo im Medienfeld wählen
- Modal zeigt das Logo am Preis
----------------------------------------
<!-- funktion -->
Optionsbild am Datensatz pflegen
<!-- stand -->
offen
<!-- ziel -->
Hinterlegt das Bild einer Option am Datensatz der Variante
<!-- regeln -->
- Feld liegt im Formular der einzelnen Variante
- Heute stammt das Bild aus der Eigenschaftsgruppe
<!-- testen -->
- Variante im Admin öffnen
- Bildfeld der Variante füllen
- Variante speichern

View File

@@ -0,0 +1,51 @@
<!-- titel -->
Option ansehen
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Der Kunde prüft eine Option groß, bevor er sie nimmt
----------------------------------------
<!-- regeln -->
- Nur Optionen mit Bild tragen den Hinweis
- Ansicht liegt über dem Konfigurator
----------------------------------------
<!-- funktion -->
Optionsdetail öffnen
<!-- ziel -->
Zeigt Bild und Namen einer Option in voller Größe
<!-- regeln -->
- i-Icon öffnet die Ansicht
- Enter öffnet die Ansicht
- Leertaste öffnet die Ansicht
<!-- testen -->
- Konfigurator öffnen
- LMB auf i-Icon einer Option
- Große Ansicht erscheint
----------------------------------------
<!-- funktion -->
Option aus Ansicht wählen
<!-- ziel -->
Übernimmt die betrachtete Option in die Auswahl
<!-- regeln -->
- Knopf übernimmt die Option
- Knopf schließt die Ansicht
- Schritt bleibt derselbe
<!-- testen -->
- Optionsdetail öffnen
- LMB auf Wählen-Knopf
- Option ist gewählt
----------------------------------------
<!-- funktion -->
Ansicht schließen
<!-- ziel -->
Kehrt zur Optionsliste zurück ohne Auswahl
<!-- regeln -->
- x-Icon schließt die Ansicht
- Escape schließt die Ansicht
- Konfigurator bleibt offen
<!-- testen -->
- Optionsdetail öffnen
- Escape drücken
- Optionsliste erscheint wieder

View File

@@ -0,0 +1,49 @@
<!-- titel -->
Schritt zeigen
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Der Kunde weiß im Modal, wo er steht und was er wählt
----------------------------------------
<!-- regeln -->
- Optionen stehen rechts
- Bilder links
- Lange Optionslisten lassen sich scrollen
----------------------------------------
<!-- funktion -->
Eigenschaft benennen
<!-- ziel -->
Zeigt den Namen der Eigenschaft des aktuellen Schritts
<!-- regeln -->
- Name steht als Überschrift über der Liste
- Name kommt aus der Eigenschaftsgruppe
<!-- testen -->
- Konfigurator öffnen
- Überschrift nennt die erste Eigenschaft
----------------------------------------
<!-- funktion -->
Schrittstand anzeigen
<!-- ziel -->
Zeigt den aktuellen Schritt und die Gesamtzahl
<!-- regeln -->
- Zähler nennt Schritt und Gesamtzahl
- Balken wächst mit dem Fortschritt
- Text kommt aus einem Textbaustein
<!-- testen -->
- Konfigurator öffnen
- Zähler zeigt 1 von 3
----------------------------------------
<!-- funktion -->
Optionen auflisten
<!-- ziel -->
Zeigt alle Optionen der Eigenschaft mit Namen und Bild
<!-- regeln -->
- Jede Option nennt ihren Namen
- Bild erscheint nur bis zwei Schritte
- Ohne Bild erscheint der Farbwert
- Ohne Farbwert bleibt die Zeile ohne Zeichen
<!-- testen -->
- Konfigurator öffnen
- Jede Option zeigt ihren Namen

View File

@@ -0,0 +1,109 @@
<!-- titel -->
Varianten wählen
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Der Kunde findet Schritt für Schritt eine bestellbare Kombination
----------------------------------------
<!-- regeln -->
- Erster Schritt zeigt alle Optionen seiner Eigenschaft
- Folgeschritte zeigen nur kombinierbare Optionen
- Der Ablauf trägt beliebig viele Eigenschaften
- Reihenfolge der Schritte kommt aus dem Backend
- Ohne Auswahl greifen die Standardvarianten des Elternartikels
- Schritte ohne gültige Option werden übersprungen
- Eine Auswahl wechselt den Schritt nicht
- Ungültige Folgeauswahl fällt beim Wechsel weg
- Auf kleinen Bildschirmen bleibt der Ablauf derselbe
- Escape schließt den Konfigurator
- Tabulator bleibt im Dialog
----------------------------------------
<!-- funktion -->
Schritt öffnen
<!-- ziel -->
Öffnet den Konfigurator beim angeklickten Schritt
<!-- regeln -->
- LMB auf einen Schritt öffnet das Modal
- Offener Konfigurator wechselt nur den Schritt
- Modal hängt am Seitenkörper
<!-- testen -->
- Produktseite öffnen
- LMB auf zweiten Schritt
- Modal öffnet bei Schritt 2
----------------------------------------
<!-- funktion -->
Option wählen
<!-- ziel -->
Übernimmt eine Option in die laufende Auswahl
<!-- regeln -->
- Gewählte Option ist hervorgehoben
- Nicht kombinierbare Optionen sind gesperrt
- Auswahl verwirft ungültige Folgeschritte
- Schritt bleibt nach der Wahl derselbe
<!-- testen -->
- Konfigurator öffnen
- LMB auf eine Option
- Option ist hervorgehoben
----------------------------------------
<!-- funktion -->
Nächsten Schritt anzeigen
<!-- ziel -->
Führt zum nächsten Schritt mit gültigen Optionen
<!-- regeln -->
- Weiter-Knopf heißt am letzten Schritt Fertig
- Leere Schritte werden übersprungen
<!-- testen -->
- Konfigurator öffnen
- LMB auf Weiter-Knopf
- Nächster Schritt erscheint
----------------------------------------
<!-- funktion -->
Vorherigen Schritt anzeigen
<!-- ziel -->
Führt zurück zum letzten Schritt mit Optionen
<!-- regeln -->
- Zurück-Knopf ist am ersten Schritt gesperrt
- Leere Schritte werden übersprungen
<!-- testen -->
- Zum zweiten Schritt gehen
- LMB auf Zurück-Knopf
- Erster Schritt erscheint
----------------------------------------
<!-- funktion -->
Auswahl übernehmen
<!-- ziel -->
Wechselt das Produkt auf die gewählte Variante
<!-- regeln -->
- Fertig überträgt die Auswahl in die Auswahlfelder
- Unbesuchte Schritte bekommen die erste gültige Option
- Shopware führt den Variantenwechsel aus
<!-- testen -->
- Alle Schritte durchgehen
- LMB auf Fertig-Knopf
- Produktseite zeigt die gewählte Variante
----------------------------------------
<!-- funktion -->
Konfigurator schließen
<!-- ziel -->
Beendet die Auswahl ohne Wechsel der Variante
<!-- regeln -->
- x-Icon schließt das Modal
- Escape schließt das Modal
- Fokus kehrt zum Auslöser zurück
<!-- testen -->
- Konfigurator öffnen
- Escape drücken
- Modal ist geschlossen
----------------------------------------
<!-- funktion -->
Konfigurationsdaten bereitstellen
<!-- ziel -->
Legt der Produktseite alles bei, was der Konfigurator braucht
<!-- regeln -->
- Kombinationen stammen vom Hauptartikel
- Ohne aktives Layout bleibt die Beilage aus
<!-- testen -->
- Produktseite mit aktivem Layout öffnen
- Seite trägt Kombinationen und Vorbelegung

View File

@@ -0,0 +1,53 @@
<!-- titel -->
Vorschau zeigen
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Der Kunde sieht Bild und Preis der gewählten Kombination
----------------------------------------
<!-- regeln -->
- Preis stimmt mit dem Preis der Produktseite überein
- Antwort wird nicht zwischengespeichert
- Späte Antworten überholter Anfragen werden verworfen
- Ohne eigene Bilder greifen die Bilder des Elternartikels
----------------------------------------
<!-- funktion -->
Vorschau laden
<!-- ziel -->
Holt Bilder und Preis zur laufenden Auswahl
<!-- regeln -->
- Jede Auswahl löst eine neue Anfrage aus
- Titelbild der Variante steht an erster Stelle
- Ohne Treffer bleibt die Produkt-ID als Rückfall
<!-- testen -->
- Konfigurator öffnen
- Andere Option wählen
- Bild und Preis ändern sich
----------------------------------------
<!-- funktion -->
Galerie blättern
<!-- ziel -->
Zeigt weitere Bilder der gewählten Variante
<!-- regeln -->
- Pfeil-Icons blättern vor
- Pfeil-Icons blättern zurück
- Nach dem letzten Bild folgt das erste
- Bei einem Bild bleibt die Navigation aus
<!-- testen -->
- Konfigurator öffnen
- LMB auf Vor-Icon
- Nächstes Bild erscheint
----------------------------------------
<!-- funktion -->
Bild wählen
<!-- ziel -->
Wechselt das große Bild über die Vorschaubilder
<!-- regeln -->
- Aktives Vorschaubild ist hervorgehoben
- Großes Bild folgt der Wahl
<!-- testen -->
- Konfigurator öffnen
- LMB auf drittes Vorschaubild
- Großes Bild zeigt dieses Motiv

View File

@@ -0,0 +1,537 @@
{
"abdeckung": {
"einbinden:VariantConfiguratorPlugin": {
"abdruck": "823481507a44729d",
"funktion": "Konfigurationsdaten bereitstellen",
"trug": "5fbc8363b7cffe59"
},
"einbinden:erweitert @Storefront/storefront/component/buy-widget/configurator.html.twig": {
"abdruck": "c6d031d6bc598089",
"funktion": "Konfigurator aktivieren",
"trug": "6cf5a2b08ce2371a"
},
"einbinden:override sw-product-detail-variants": {
"abdruck": "2fcf518e7333458a",
"funktion": "",
"trug": ""
},
"einbinden:register mto-vc-variants-card": {
"abdruck": "c472feadaac5ac71",
"funktion": "",
"trug": ""
},
"hoeren:[data-mto-vc-gallery-next].click": {
"abdruck": "c402ad6f114e8c3d",
"funktion": "Galerie blättern",
"trug": "bacf45ebf9dd77b8"
},
"hoeren:[data-mto-vc-gallery-prev].click": {
"abdruck": "f50d4f7effc60a06",
"funktion": "Galerie blättern",
"trug": "bacf45ebf9dd77b8"
},
"hoeren:[data-mto-vc-lightbox-close].click": {
"abdruck": "89a22850af7694bb",
"funktion": "Galerie blättern",
"trug": "bacf45ebf9dd77b8"
},
"hoeren:document.keydown": {
"abdruck": "7c018ebbfa346bee",
"funktion": "Schritt öffnen",
"trug": "efe9634e3080c073"
},
"hoeren:el.click": {
"abdruck": "6a423a062267755c",
"funktion": "Nächsten Schritt anzeigen",
"trug": "f6b276e3fedf287d"
},
"hoeren:info.click": {
"abdruck": "7a5a70dfb792bf19",
"funktion": "Optionsdetail öffnen",
"trug": "39fed29af6734cd4"
},
"hoeren:info.keydown": {
"abdruck": "409cecf6fb3bbb4a",
"funktion": "Optionsdetail öffnen",
"trug": "39fed29af6734cd4"
},
"hoeren:lightboxSelect.click": {
"abdruck": "9add2d2c77b440b5",
"funktion": "Ansicht schließen",
"trug": "24d52cc6d249d4f5"
},
"hoeren:next.click": {
"abdruck": "d5b0cdcce40afcff",
"funktion": "Konfigurator schließen",
"trug": "1cc1a6b5fc943e03"
},
"hoeren:prev.click": {
"abdruck": "6b8db8d885c0d6f8",
"funktion": "Konfigurator schließen",
"trug": "1cc1a6b5fc943e03"
},
"hoeren:row.click": {
"abdruck": "b4ec6f63c613c35f",
"funktion": "Option wählen",
"trug": "80df89cf0c129387"
},
"hoeren:thumb.click": {
"abdruck": "b4aa2111971f6886",
"funktion": "Bild wählen",
"trug": "0604a0a6875489b8"
},
"hoeren:trigger.click": {
"abdruck": "e219933925adc81a",
"funktion": "Schritt öffnen",
"trug": "efe9634e3080c073"
},
"reaktion:ProductPageLoadedEvent": {
"abdruck": "6f808b91c1a0c4f5",
"funktion": "Konfigurationsdaten bereitstellen",
"trug": "5fbc8363b7cffe59"
},
"route:get /mto-variant-configurator/resolve/{productId}": {
"abdruck": "b14355d6007564a1",
"funktion": "Konfigurationsdaten bereitstellen",
"trug": "5fbc8363b7cffe59"
}
},
"belege": {
"[\"auswahl-anstossen\", \"Gewählte Option anzeigen\"]": {
"abdruck": "626af3ee300b610a",
"beleg": "<span class=\"mto-vc-select-trigger-label\" data-mto-vc-trigger-label>\n {{ mtoVcSelected ? mtoVcSelected.translated.name : 'mto.variantConfigurator.choose'|trans }}\n </span>",
"datei": "src/Resources/views/storefront/component/buy-widget/configurator.html.twig"
},
"[\"auswahl-anstossen\", \"Hinweistext anzeigen\"]": {
"abdruck": "b9baf394ca99d4e6",
"beleg": "{% if mtoVcBubble != mtoVcBubbleKey and mtoVcBubble is not empty %}\n <p class=\"mto-vc-bubble\">{{ mtoVcBubble|sw_sanitize }}</p>\n {% endif %}",
"datei": "src/Resources/views/storefront/component/buy-widget/configurator.html.twig"
},
"[\"auswahl-anstossen\", \"Schrittnummer anzeigen\"]": {
"abdruck": "b9e4deada2c3a6f1",
"beleg": "<span class=\"mto-vc-step-badge\">{{ 'mto.variantConfigurator.step'|trans({ '%step%': mtoVcStep })|sw_sanitize }}</span>",
"datei": "src/Resources/views/storefront/component/buy-widget/configurator.html.twig"
},
"[\"beratung-anbieten\", \"Beratung erreichen\"]": {
"abdruck": "fa513f8d265ad713",
"beleg": "{% if ctaPhone is not empty %}\n <span class=\"mto-vc-support-icon\" aria-hidden=\"true\"></span>\n <a href=\"tel:{{ ctaPhone|replace({' ': '', '/': '', '-': '', '(': '', ')': ''}) }}\"\n class=\"mto-vc-support-phone\">{{ ctaPhone|sw_sanitize }}</a>\n {% endif %}",
"datei": "src/Resources/views/storefront/component/buy-widget/mto-variant-configurator-modal.html.twig"
},
"[\"beratung-anbieten\", \"Optionsübersicht öffnen\"]": {
"abdruck": "8aba7fb9bf50281b",
"beleg": "{% if pdfUrl %}\n <a href=\"{{ pdfUrl }}\" target=\"_blank\" rel=\"noopener\"\n class=\"mto-vc-btn is-outline mto-vc-all-options\">\n {{ 'mto.variantConfigurator.allOptions'|trans|sw_sanitize }}\n </a>\n {% else %}\n <span class=\"mto-vc-actions-spacer\" aria-hidden=\"true\"></span>\n {% endif %}",
"datei": "src/Resources/views/storefront/component/buy-widget/mto-variant-configurator-modal.html.twig"
},
"[\"beratung-anbieten\", \"Vertrauen zeigen\"]": {
"abdruck": "5b204dff7de6f96d",
"beleg": "{% if trustLogo %}\n <img src=\"{{ trustLogo }}\" alt=\"\" class=\"mto-vc-trust-logo\">\n{% endif %}",
"datei": "src/Resources/views/storefront/component/buy-widget/mto-variant-configurator-modal.html.twig"
},
"[\"layout-zuweisen\", \"Konfigurator aktivieren\"]": {
"abdruck": "60a65511f06ae7fe",
"beleg": "<sw-switch-field\n v-model:value=\"configuratorActive\"\n class=\"mto-vc-variants-card__active\"\n :disabled=\"!editable\"\n :label=\"$tc('mto-variant-configurator.card.activeLabel')\"\n :help-text=\"$tc('mto-variant-configurator.card.activeHelp')\"\n />",
"datei": "src/Resources/app/administration/src/component/mto-vc-variants-card/mto-vc-variants-card.html.twig"
},
"[\"layout-zuweisen\", \"Optionsübersicht hinterlegen\"]": {
"abdruck": "97b421cf540a6cc2",
"beleg": "{% if pdfUrl %}\n <a href=\"{{ pdfUrl }}\" target=\"_blank\" rel=\"noopener\"\n class=\"mto-vc-btn is-outline mto-vc-all-options\">\n {{ 'mto.variantConfigurator.allOptions'|trans|sw_sanitize }}\n </a>\n {% else %}\n <span class=\"mto-vc-actions-spacer\" aria-hidden=\"true\"></span>\n {% endif %}",
"datei": "src/Resources/views/storefront/component/buy-widget/mto-variant-configurator-modal.html.twig"
},
"[\"layout-zuweisen\", \"Trust-Logo hinterlegen\"]": {
"abdruck": "1954311a4c3a9cc1",
"beleg": "$mediaId = $this->systemConfigService->get(\n MtoVariantConfigurator::CONFIG_TRUST_LOGO,\n $salesChannelId,\n );",
"datei": "src/Core/Content/Product/VariantResolveService.php"
},
"[\"option-ansehen\", \"Ansicht schließen\"]": {
"abdruck": "6eac493d9a481e30",
"beleg": "if (!this._nodes.lightbox.hidden) {\n this._closeLightbox();\n } else {\n this._close();\n }",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"option-ansehen\", \"Option aus Ansicht wählen\"]": {
"abdruck": "b4223f8cf3e2456e",
"beleg": "this._nodes.lightboxSelect?.addEventListener('click', () => {\n if (this._lightboxOption) {\n this._selectOption(this.options.groups[this._currentStep], this._lightboxOption.id);\n }\n this._closeLightbox();\n });",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"option-ansehen\", \"Optionsdetail öffnen\"]": {
"abdruck": "59faab581e0fac7f",
"beleg": "info.addEventListener('click', open);\n info.addEventListener('keydown', (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n open(event);\n }\n });",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"schritt-zeigen\", \"Eigenschaft benennen\"]": {
"abdruck": "dd54064a67689e2c",
"beleg": "this._nodes.title.textContent = group.name;",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"schritt-zeigen\", \"Optionen auflisten\"]": {
"abdruck": "a71af321f056608d",
"beleg": "if (option.media) {\n const visual = document.createElement('span');\n visual.className = 'mto-vc-option-media';\n const img = document.createElement('img');\n img.src = option.media;\n img.alt = '';\n img.loading = 'lazy';\n visual.appendChild(img);\n row.appendChild(visual);\n } else if (option.color) {\n const visual = document.createElement('span');\n visual.className = 'mto-vc-option-swatch';\n visual.style.backgroundColor = option.color;\n row.appendChild(visual);\n } else {\n row.classList.add('has-no-visual');\n }",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"schritt-zeigen\", \"Schrittstand anzeigen\"]": {
"abdruck": "aa7b8888103f8bd0",
"beleg": "this._nodes.counter.textContent = (this._snippets.stepCount || '__step__ / __total__')\n .replace('__step__', String(step))\n .replace('__total__', String(total));\n this._nodes.progress.style.width = `${(step / total) * 100}%`;",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"varianten-waehlen\", \"Auswahl übernehmen\"]": {
"abdruck": "21ccf5bc0286c95c",
"beleg": "if (optionId && select.value !== optionId) {\n select.value = optionId;\n lastChanged = select;\n }",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"varianten-waehlen\", \"Konfigurationsdaten bereitstellen\"]": {
"abdruck": "e6e5848381fce5aa",
"beleg": "$page->assign([",
"datei": "src/Subscriber/ProductPageSubscriber.php"
},
"[\"varianten-waehlen\", \"Konfigurator schließen\"]": {
"abdruck": "1b7d4aea18cdb896",
"beleg": "_close() {\n this._closeLightbox();\n this._modalEl.hidden = true;\n document.body.classList.remove('mto-vc-modal-open');\n document.removeEventListener('keydown', this._keydownHandler);\n this._lastFocus?.focus();\n }",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"varianten-waehlen\", \"Nächsten Schritt anzeigen\"]": {
"abdruck": "3deee97595984a3e",
"beleg": "const isLast = this._nextUsableStep(this._currentStep + 1, 1) === null;\n this._nodes.next.textContent = isLast\n ? this._nodes.next.dataset.finishLabel\n : this._nodes.next.dataset.nextLabel;",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"varianten-waehlen\", \"Option wählen\"]": {
"abdruck": "4b9f7dc844cf7aac",
"beleg": "this._selected[group.id] = optionId;",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"varianten-waehlen\", \"Schritt öffnen\"]": {
"abdruck": "94b3aa8d50c53fc8",
"beleg": "this._triggers.forEach((trigger) => {\n trigger.addEventListener('click', (event) => {\n event.preventDefault();\n this._open(parseInt(trigger.dataset.mtoVcStepIndex, 10));\n });\n });",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"varianten-waehlen\", \"Vorherigen Schritt anzeigen\"]": {
"abdruck": "df5e60fe148da5e6",
"beleg": "this._nodes.prev.disabled = this._nextUsableStep(this._currentStep - 1, -1) === null;",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"vorschau-zeigen\", \"Bild wählen\"]": {
"abdruck": "ab1e74251036541a",
"beleg": "thumb.className = `mto-vc-thumb${index === this._galleryIndex ? ' is-active' : ''}`;",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"vorschau-zeigen\", \"Galerie blättern\"]": {
"abdruck": "6b28a5866629b878",
"beleg": "_stepGallery(delta) {\n if (this._gallery.length < 2) {\n return;\n }\n const count = this._gallery.length;\n this._galleryIndex = (this._galleryIndex + delta + count) % count;\n this._renderGallery();\n }",
"datei": "src/Resources/app/storefront/src/js/variant-configurator.plugin.js"
},
"[\"vorschau-zeigen\", \"Vorschau laden\"]": {
"abdruck": "413024bc244f7770",
"beleg": "return new JsonResponse($this->variantResolveService->resolveVariant($variantId, $context));",
"datei": "src/Storefront/Controller/VariantConfiguratorController.php"
}
},
"ohne_code": {},
"ohne_karte": {},
"paare": {
"[\"[\\\"auswahl-anstossen\\\", \\\"Gewählte Option anzeigen\\\"]\", \"[\\\"auswahl-anstossen\\\", \\\"Hinweistext anzeigen\\\"]\"]": {
"abdruck": "450345e8a27f5695",
"gleich": false
},
"[\"[\\\"auswahl-anstossen\\\", \\\"Gewählte Option anzeigen\\\"]\", \"[\\\"auswahl-anstossen\\\", \\\"Schrittnummer anzeigen\\\"]\"]": {
"abdruck": "60008fdb6d69349b",
"gleich": false
},
"[\"[\\\"auswahl-anstossen\\\", \\\"Hinweistext anzeigen\\\"]\", \"[\\\"auswahl-anstossen\\\", \\\"Schrittnummer anzeigen\\\"]\"]": {
"abdruck": "3eaf19062d6d53a3",
"gleich": false
},
"[\"[\\\"beratung-anbieten\\\", \\\"Beratung erreichen\\\"]\", \"[\\\"beratung-anbieten\\\", \\\"Optionsübersicht öffnen\\\"]\"]": {
"abdruck": "9d3da3bf8c127ae1",
"gleich": false
},
"[\"[\\\"beratung-anbieten\\\", \\\"Beratung erreichen\\\"]\", \"[\\\"beratung-anbieten\\\", \\\"Vertrauen zeigen\\\"]\"]": {
"abdruck": "2c3c62cb4b935c56",
"gleich": false
},
"[\"[\\\"beratung-anbieten\\\", \\\"Optionsübersicht öffnen\\\"]\", \"[\\\"beratung-anbieten\\\", \\\"Vertrauen zeigen\\\"]\"]": {
"abdruck": "bf601d5dc7c6c507",
"gleich": false
},
"[\"[\\\"beratung-anbieten\\\", \\\"Optionsübersicht öffnen\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Optionsübersicht hinterlegen\\\"]\"]": {
"abdruck": "bc9dc09e54b78a75",
"gleich": false
},
"[\"[\\\"layout-zuweisen\\\", \\\"Konfigurator aktivieren\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Optionsbild am Datensatz pflegen\\\"]\"]": {
"abdruck": "5a4d802d668ddd55",
"gleich": false
},
"[\"[\\\"layout-zuweisen\\\", \\\"Konfigurator aktivieren\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Optionsübersicht hinterlegen\\\"]\"]": {
"abdruck": "eeed78a6284711f1",
"gleich": false
},
"[\"[\\\"layout-zuweisen\\\", \\\"Konfigurator aktivieren\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Trust-Logo hinterlegen\\\"]\"]": {
"abdruck": "b4944e5aa4df871a",
"gleich": false
},
"[\"[\\\"layout-zuweisen\\\", \\\"Optionsbild am Datensatz pflegen\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Optionsübersicht hinterlegen\\\"]\"]": {
"abdruck": "b91bdff82a120a8d",
"gleich": false
},
"[\"[\\\"layout-zuweisen\\\", \\\"Optionsbild am Datensatz pflegen\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Trust-Logo hinterlegen\\\"]\"]": {
"abdruck": "97268714e2b5d989",
"gleich": false
},
"[\"[\\\"layout-zuweisen\\\", \\\"Optionsübersicht hinterlegen\\\"]\", \"[\\\"layout-zuweisen\\\", \\\"Trust-Logo hinterlegen\\\"]\"]": {
"abdruck": "b52cedd4106ee837",
"gleich": false
},
"[\"[\\\"option-ansehen\\\", \\\"Ansicht schließen\\\"]\", \"[\\\"option-ansehen\\\", \\\"Option aus Ansicht wählen\\\"]\"]": {
"abdruck": "caa5ce4c5ff31774",
"gleich": false
},
"[\"[\\\"option-ansehen\\\", \\\"Ansicht schließen\\\"]\", \"[\\\"option-ansehen\\\", \\\"Optionsdetail öffnen\\\"]\"]": {
"abdruck": "462a46d7a2030874",
"gleich": false
},
"[\"[\\\"option-ansehen\\\", \\\"Option aus Ansicht wählen\\\"]\", \"[\\\"option-ansehen\\\", \\\"Optionsdetail öffnen\\\"]\"]": {
"abdruck": "8f695dfd90060204",
"gleich": false
},
"[\"[\\\"schritt-zeigen\\\", \\\"Eigenschaft benennen\\\"]\", \"[\\\"schritt-zeigen\\\", \\\"Optionen auflisten\\\"]\"]": {
"abdruck": "5372df6b482e9a5c",
"gleich": false
},
"[\"[\\\"schritt-zeigen\\\", \\\"Eigenschaft benennen\\\"]\", \"[\\\"schritt-zeigen\\\", \\\"Schrittstand anzeigen\\\"]\"]": {
"abdruck": "732d371c2135b53f",
"gleich": false
},
"[\"[\\\"schritt-zeigen\\\", \\\"Optionen auflisten\\\"]\", \"[\\\"schritt-zeigen\\\", \\\"Schrittstand anzeigen\\\"]\"]": {
"abdruck": "590d6974e948c69c",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Auswahl übernehmen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Konfigurationsdaten bereitstellen\\\"]\"]": {
"abdruck": "34e23fca918e5dc0",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Auswahl übernehmen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Konfigurator schließen\\\"]\"]": {
"abdruck": "eb521941a5dc979a",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Auswahl übernehmen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Nächsten Schritt anzeigen\\\"]\"]": {
"abdruck": "271109c8b42cf5d5",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Auswahl übernehmen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Option wählen\\\"]\"]": {
"abdruck": "618d3c213492555a",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Auswahl übernehmen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Schritt öffnen\\\"]\"]": {
"abdruck": "b45252ce7cc39ed9",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Auswahl übernehmen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Vorherigen Schritt anzeigen\\\"]\"]": {
"abdruck": "d7ade9bdd7d0c66e",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Konfigurationsdaten bereitstellen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Konfigurator schließen\\\"]\"]": {
"abdruck": "97ceded85ca2035c",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Konfigurationsdaten bereitstellen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Nächsten Schritt anzeigen\\\"]\"]": {
"abdruck": "ba83ab596b72af22",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Konfigurationsdaten bereitstellen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Option wählen\\\"]\"]": {
"abdruck": "6f23248b5fbd7be4",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Konfigurationsdaten bereitstellen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Schritt öffnen\\\"]\"]": {
"abdruck": "7350e93a2a368ac1",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Konfigurationsdaten bereitstellen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Vorherigen Schritt anzeigen\\\"]\"]": {
"abdruck": "50753ef9f3d5c8b5",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Konfigurator schließen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Nächsten Schritt anzeigen\\\"]\"]": {
"abdruck": "b49e65e1c60b5307",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Konfigurator schließen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Option wählen\\\"]\"]": {
"abdruck": "b165f28b36fc3637",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Konfigurator schließen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Schritt öffnen\\\"]\"]": {
"abdruck": "0bf509fed71f1c25",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Konfigurator schließen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Vorherigen Schritt anzeigen\\\"]\"]": {
"abdruck": "de5acdbf92511e14",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Nächsten Schritt anzeigen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Option wählen\\\"]\"]": {
"abdruck": "7c9a06867c701267",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Nächsten Schritt anzeigen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Schritt öffnen\\\"]\"]": {
"abdruck": "f45378da83876bae",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Nächsten Schritt anzeigen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Vorherigen Schritt anzeigen\\\"]\"]": {
"abdruck": "9fc4c9cf8ae1d7fb",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Option wählen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Schritt öffnen\\\"]\"]": {
"abdruck": "a71f8b8b92d1025c",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Option wählen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Vorherigen Schritt anzeigen\\\"]\"]": {
"abdruck": "e3270a7176c63620",
"gleich": false
},
"[\"[\\\"varianten-waehlen\\\", \\\"Schritt öffnen\\\"]\", \"[\\\"varianten-waehlen\\\", \\\"Vorherigen Schritt anzeigen\\\"]\"]": {
"abdruck": "44e775b8e8b106d1",
"gleich": false
},
"[\"[\\\"vorschau-zeigen\\\", \\\"Bild wählen\\\"]\", \"[\\\"vorschau-zeigen\\\", \\\"Galerie blättern\\\"]\"]": {
"abdruck": "19851d2901c309a1",
"gleich": false
},
"[\"[\\\"vorschau-zeigen\\\", \\\"Bild wählen\\\"]\", \"[\\\"vorschau-zeigen\\\", \\\"Vorschau laden\\\"]\"]": {
"abdruck": "508415e6500f9fca",
"gleich": false
},
"[\"[\\\"vorschau-zeigen\\\", \\\"Galerie blättern\\\"]\", \"[\\\"vorschau-zeigen\\\", \\\"Vorschau laden\\\"]\"]": {
"abdruck": "86aa1f412d5a5dcd",
"gleich": false
}
},
"stil": {
"[\"auswahl-anstossen\", \"\"]": {
"abdruck": "aeec25973dafe92f",
"probleme": []
},
"[\"auswahl-anstossen\", \"Gewählte Option anzeigen\"]": {
"abdruck": "59058982f7989af8",
"probleme": []
},
"[\"auswahl-anstossen\", \"Hinweistext anzeigen\"]": {
"abdruck": "b3568e0a2585d71c",
"probleme": []
},
"[\"auswahl-anstossen\", \"Schrittnummer anzeigen\"]": {
"abdruck": "117d58f0d4b21973",
"probleme": []
},
"[\"beratung-anbieten\", \"\"]": {
"abdruck": "4b0267b165360857",
"probleme": []
},
"[\"beratung-anbieten\", \"Beratung erreichen\"]": {
"abdruck": "cfdb65d682c3e068",
"probleme": []
},
"[\"beratung-anbieten\", \"Optionsübersicht öffnen\"]": {
"abdruck": "28d5587c78199c54",
"probleme": []
},
"[\"beratung-anbieten\", \"Vertrauen zeigen\"]": {
"abdruck": "8c00dec8d3ebf751",
"probleme": []
},
"[\"layout-zuweisen\", \"\"]": {
"abdruck": "1e0d2ca5296aabea",
"probleme": []
},
"[\"layout-zuweisen\", \"Konfigurator aktivieren\"]": {
"abdruck": "dca9bbf7361f5520",
"probleme": []
},
"[\"layout-zuweisen\", \"Optionsbild am Datensatz pflegen\"]": {
"abdruck": "cc0701aafd02ac3a",
"probleme": []
},
"[\"layout-zuweisen\", \"Optionsübersicht hinterlegen\"]": {
"abdruck": "de6c0e3e80d47496",
"probleme": []
},
"[\"layout-zuweisen\", \"Trust-Logo hinterlegen\"]": {
"abdruck": "ebd1a72ece157e69",
"probleme": []
},
"[\"option-ansehen\", \"\"]": {
"abdruck": "ace46c77101e26b3",
"probleme": []
},
"[\"option-ansehen\", \"Ansicht schließen\"]": {
"abdruck": "6bdaf5e60fb3baa9",
"probleme": []
},
"[\"option-ansehen\", \"Option aus Ansicht wählen\"]": {
"abdruck": "cc10af5dda4a7857",
"probleme": []
},
"[\"option-ansehen\", \"Optionsdetail öffnen\"]": {
"abdruck": "e00d07ce7b75d8fc",
"probleme": []
},
"[\"schritt-zeigen\", \"\"]": {
"abdruck": "f0d53ef421968759",
"probleme": []
},
"[\"schritt-zeigen\", \"Eigenschaft benennen\"]": {
"abdruck": "ec4828e2e9197083",
"probleme": []
},
"[\"schritt-zeigen\", \"Optionen auflisten\"]": {
"abdruck": "d8e6daed0f36098f",
"probleme": []
},
"[\"schritt-zeigen\", \"Schrittstand anzeigen\"]": {
"abdruck": "42a1c7f94c30f72d",
"probleme": []
},
"[\"varianten-waehlen\", \"\"]": {
"abdruck": "0835908894fa892c",
"probleme": []
},
"[\"varianten-waehlen\", \"Auswahl übernehmen\"]": {
"abdruck": "6683956c63370244",
"probleme": []
},
"[\"varianten-waehlen\", \"Konfigurationsdaten bereitstellen\"]": {
"abdruck": "498f3141e86f8db0",
"probleme": []
},
"[\"varianten-waehlen\", \"Konfigurator schließen\"]": {
"abdruck": "866918b327061449",
"probleme": []
},
"[\"varianten-waehlen\", \"Nächsten Schritt anzeigen\"]": {
"abdruck": "8d810a760dfec037",
"probleme": []
},
"[\"varianten-waehlen\", \"Option wählen\"]": {
"abdruck": "ac4eae399ac3a15e",
"probleme": []
},
"[\"varianten-waehlen\", \"Schritt öffnen\"]": {
"abdruck": "40f795456747214e",
"probleme": []
},
"[\"varianten-waehlen\", \"Vorherigen Schritt anzeigen\"]": {
"abdruck": "a63a26a8baea9c07",
"probleme": []
},
"[\"vorschau-zeigen\", \"\"]": {
"abdruck": "52976631fd09993a",
"probleme": []
},
"[\"vorschau-zeigen\", \"Bild wählen\"]": {
"abdruck": "a3e980ef7678a446",
"probleme": []
},
"[\"vorschau-zeigen\", \"Galerie blättern\"]": {
"abdruck": "47ccb441120c1470",
"probleme": []
},
"[\"vorschau-zeigen\", \"Vorschau laden\"]": {
"abdruck": "29e5951f170dba26",
"probleme": []
}
},
"verworfen": {}
}

View File

@@ -0,0 +1,49 @@
<!-- titel -->
Auswahl anstoßen
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Der Kunde erkennt in der Buybox die Reihenfolge der Schritte
----------------------------------------
<!-- regeln -->
- Jede Eigenschaft bildet einen eigenen Schritt
- Natives Auswahlfeld bleibt für den Variantenwechsel erhalten
- Eigene Darstellung gilt unabhängig vom Anzeigetyp der Eigenschaft
- Ohne aktives Layout erscheint die Standard-Buybox
----------------------------------------
<!-- funktion -->
Schrittnummer anzeigen
<!-- ziel -->
Zeigt neben jeder Eigenschaft ihre Position im Ablauf
<!-- regeln -->
- Beschriftung nennt das Wort Schritt und die Nummer
- Nummer folgt der Reihenfolge aus dem Backend
<!-- testen -->
- Produktseite öffnen
- Erste Eigenschaft zeigt Schritt 1
----------------------------------------
<!-- funktion -->
Hinweistext anzeigen
<!-- ziel -->
Erklärt dem Kunden, worauf er im Schritt achtet
<!-- regeln -->
- Text kommt aus einem Textbaustein je Schritt
- Leerer Textbaustein blendet den Hinweis aus
- Hinweis hängt an der Nummer statt an der Eigenschaft
<!-- testen -->
- Textbaustein für Schritt 1 füllen
- Produktseite öffnen
- Hinweis steht unter der Überschrift
----------------------------------------
<!-- funktion -->
Gewählte Option anzeigen
<!-- ziel -->
Zeigt am Schritt, welche Option gerade gilt
<!-- regeln -->
- Ohne Auswahl steht dort Bitte wählen
- Vorbelegung erscheint ohne Zutun des Kunden
<!-- testen -->
- Hauptartikel ohne Variante öffnen
- Jeder Schritt nennt eine Option

View File

@@ -0,0 +1,47 @@
<!-- titel -->
Beratung anbieten
----------------------------------------
<!-- art -->
optional
----------------------------------------
<!-- ziel -->
Der Kunde findet im Konfigurator Vertrauen und einen Kontakt
----------------------------------------
<!-- regeln -->
- Alle Texte kommen aus Textbausteinen
- Leerer Textbaustein blendet den Bereich aus
----------------------------------------
<!-- funktion -->
Vertrauen zeigen
<!-- ziel -->
Zeigt Siegel und Zusage neben dem Gesamtpreis
<!-- regeln -->
- Logo stammt aus der Plugin-Konfiguration
- Ohne Logo bleibt der Text stehen
<!-- testen -->
- Konfigurator öffnen
- Siegel steht neben dem Preis
----------------------------------------
<!-- funktion -->
Beratung erreichen
<!-- ziel -->
Bietet eine Telefonnummer für Fragen zur Konfiguration
<!-- regeln -->
- Nummer ist als Telefonlink klickbar
- Leere Nummer blendet den Bereich aus
<!-- testen -->
- Konfigurator öffnen
- LMB auf die Nummer
- Telefon-App öffnet sich
----------------------------------------
<!-- funktion -->
Optionsübersicht öffnen
<!-- ziel -->
Öffnet das hinterlegte PDF mit allen Optionen
<!-- regeln -->
- Knopf erscheint nur mit hinterlegtem PDF
- PDF öffnet in einem neuen Tab
<!-- testen -->
- Konfigurator öffnen
- LMB auf Optionen-Knopf
- PDF öffnet in neuem Tab

View File

@@ -0,0 +1,69 @@
<!-- titel -->
Layout zuweisen
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Ein Händler entscheidet je Produkt, ob die geführte Auswahl erscheint
----------------------------------------
<!-- regeln -->
- Einstellungen liegen auf dem Varianten-Tab des Produkts
- Werte stehen in den customFields des Produkts
- Bearbeiten erfordert das Recht product.editor
- Ohne Zuweisung bleibt das Standardlayout aktiv
----------------------------------------
<!-- funktion -->
Konfigurator aktivieren
<!-- ziel -->
Schaltet die geführte Variantenauswahl für ein Produkt frei
<!-- regeln -->
- Schalter steht auf dem Varianten-Tab
- Aktiv ersetzt die Buybox des Produkts
- Inaktiv zeigt das Standardlayout von Shopware
<!-- testen -->
- Produkt im Admin öffnen
- Varianten-Tab öffnen
- Schalter aktivieren und speichern
- Buybox zeigt die geführte Auswahl
----------------------------------------
<!-- funktion -->
Optionsübersicht hinterlegen
<!-- ziel -->
Hinterlegt ein PDF mit allen Varianten und Kombinationen
<!-- regeln -->
- Medienfeld steht auf dem Varianten-Tab
- Feld hängt am Hauptartikel
- Ohne PDF bleibt der Knopf unsichtbar
<!-- testen -->
- Varianten-Tab öffnen
- PDF im Medienfeld wählen
- Produkt speichern
- Modal zeigt den Knopf für Optionen
----------------------------------------
<!-- funktion -->
Trust-Logo hinterlegen
<!-- ziel -->
Zeigt ein Vertrauenssiegel neben dem Gesamtpreis
<!-- regeln -->
- Logo steht in der Plugin-Konfiguration
- Gilt für den ganzen Verkaufskanal
- Ohne Logo erscheint nur der Text
<!-- testen -->
- Plugin-Konfiguration öffnen
- Logo im Medienfeld wählen
- Modal zeigt das Logo am Preis
----------------------------------------
<!-- funktion -->
Optionsbild am Datensatz pflegen
<!-- stand -->
offen
<!-- ziel -->
Hinterlegt das Bild einer Option am Datensatz der Variante
<!-- regeln -->
- Feld liegt im Formular der einzelnen Variante
- Heute stammt das Bild aus der Eigenschaftsgruppe
<!-- testen -->
- Variante im Admin öffnen
- Bildfeld der Variante füllen
- Variante speichern

View File

@@ -0,0 +1,51 @@
<!-- titel -->
Option ansehen
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Der Kunde prüft eine Option groß, bevor er sie nimmt
----------------------------------------
<!-- regeln -->
- Nur Optionen mit Bild tragen den Hinweis
- Ansicht liegt über dem Konfigurator
----------------------------------------
<!-- funktion -->
Optionsdetail öffnen
<!-- ziel -->
Zeigt Bild und Namen einer Option in voller Größe
<!-- regeln -->
- i-Icon öffnet die Ansicht
- Enter öffnet die Ansicht
- Leertaste öffnet die Ansicht
<!-- testen -->
- Konfigurator öffnen
- LMB auf i-Icon einer Option
- Große Ansicht erscheint
----------------------------------------
<!-- funktion -->
Option aus Ansicht wählen
<!-- ziel -->
Übernimmt die betrachtete Option in die Auswahl
<!-- regeln -->
- Knopf übernimmt die Option
- Knopf schließt die Ansicht
- Schritt bleibt derselbe
<!-- testen -->
- Optionsdetail öffnen
- LMB auf Wählen-Knopf
- Option ist gewählt
----------------------------------------
<!-- funktion -->
Ansicht schließen
<!-- ziel -->
Kehrt zur Optionsliste zurück ohne Auswahl
<!-- regeln -->
- x-Icon schließt die Ansicht
- Escape schließt die Ansicht
- Konfigurator bleibt offen
<!-- testen -->
- Optionsdetail öffnen
- Escape drücken
- Optionsliste erscheint wieder

View File

@@ -0,0 +1,49 @@
<!-- titel -->
Schritt zeigen
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Der Kunde weiß im Modal, wo er steht und was er wählt
----------------------------------------
<!-- regeln -->
- Optionen stehen rechts
- Bilder links
- Lange Optionslisten lassen sich scrollen
----------------------------------------
<!-- funktion -->
Eigenschaft benennen
<!-- ziel -->
Zeigt den Namen der Eigenschaft des aktuellen Schritts
<!-- regeln -->
- Name steht als Überschrift über der Liste
- Name kommt aus der Eigenschaftsgruppe
<!-- testen -->
- Konfigurator öffnen
- Überschrift nennt die erste Eigenschaft
----------------------------------------
<!-- funktion -->
Schrittstand anzeigen
<!-- ziel -->
Zeigt den aktuellen Schritt und die Gesamtzahl
<!-- regeln -->
- Zähler nennt Schritt und Gesamtzahl
- Balken wächst mit dem Fortschritt
- Text kommt aus einem Textbaustein
<!-- testen -->
- Konfigurator öffnen
- Zähler zeigt 1 von 3
----------------------------------------
<!-- funktion -->
Optionen auflisten
<!-- ziel -->
Zeigt alle Optionen der Eigenschaft mit Namen und Bild
<!-- regeln -->
- Jede Option nennt ihren Namen
- Bild erscheint nur bis zwei Schritte
- Ohne Bild erscheint der Farbwert
- Ohne Farbwert bleibt die Zeile ohne Zeichen
<!-- testen -->
- Konfigurator öffnen
- Jede Option zeigt ihren Namen

View File

@@ -0,0 +1,109 @@
<!-- titel -->
Varianten wählen
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Der Kunde findet Schritt für Schritt eine bestellbare Kombination
----------------------------------------
<!-- regeln -->
- Erster Schritt zeigt alle Optionen seiner Eigenschaft
- Folgeschritte zeigen nur kombinierbare Optionen
- Der Ablauf trägt beliebig viele Eigenschaften
- Reihenfolge der Schritte kommt aus dem Backend
- Ohne Auswahl greifen die Standardvarianten des Elternartikels
- Schritte ohne gültige Option werden übersprungen
- Eine Auswahl wechselt den Schritt nicht
- Ungültige Folgeauswahl fällt beim Wechsel weg
- Auf kleinen Bildschirmen bleibt der Ablauf derselbe
- Escape schließt den Konfigurator
- Tabulator bleibt im Dialog
----------------------------------------
<!-- funktion -->
Schritt öffnen
<!-- ziel -->
Öffnet den Konfigurator beim angeklickten Schritt
<!-- regeln -->
- LMB auf einen Schritt öffnet das Modal
- Offener Konfigurator wechselt nur den Schritt
- Modal hängt am Seitenkörper
<!-- testen -->
- Produktseite öffnen
- LMB auf zweiten Schritt
- Modal öffnet bei Schritt 2
----------------------------------------
<!-- funktion -->
Option wählen
<!-- ziel -->
Übernimmt eine Option in die laufende Auswahl
<!-- regeln -->
- Gewählte Option ist hervorgehoben
- Nicht kombinierbare Optionen sind gesperrt
- Auswahl verwirft ungültige Folgeschritte
- Schritt bleibt nach der Wahl derselbe
<!-- testen -->
- Konfigurator öffnen
- LMB auf eine Option
- Option ist hervorgehoben
----------------------------------------
<!-- funktion -->
Nächsten Schritt anzeigen
<!-- ziel -->
Führt zum nächsten Schritt mit gültigen Optionen
<!-- regeln -->
- Weiter-Knopf heißt am letzten Schritt Fertig
- Leere Schritte werden übersprungen
<!-- testen -->
- Konfigurator öffnen
- LMB auf Weiter-Knopf
- Nächster Schritt erscheint
----------------------------------------
<!-- funktion -->
Vorherigen Schritt anzeigen
<!-- ziel -->
Führt zurück zum letzten Schritt mit Optionen
<!-- regeln -->
- Zurück-Knopf ist am ersten Schritt gesperrt
- Leere Schritte werden übersprungen
<!-- testen -->
- Zum zweiten Schritt gehen
- LMB auf Zurück-Knopf
- Erster Schritt erscheint
----------------------------------------
<!-- funktion -->
Auswahl übernehmen
<!-- ziel -->
Wechselt das Produkt auf die gewählte Variante
<!-- regeln -->
- Fertig überträgt die Auswahl in die Auswahlfelder
- Unbesuchte Schritte bekommen die erste gültige Option
- Shopware führt den Variantenwechsel aus
<!-- testen -->
- Alle Schritte durchgehen
- LMB auf Fertig-Knopf
- Produktseite zeigt die gewählte Variante
----------------------------------------
<!-- funktion -->
Konfigurator schließen
<!-- ziel -->
Beendet die Auswahl ohne Wechsel der Variante
<!-- regeln -->
- x-Icon schließt das Modal
- Escape schließt das Modal
- Fokus kehrt zum Auslöser zurück
<!-- testen -->
- Konfigurator öffnen
- Escape drücken
- Modal ist geschlossen
----------------------------------------
<!-- funktion -->
Konfigurationsdaten bereitstellen
<!-- ziel -->
Legt der Produktseite alles bei, was der Konfigurator braucht
<!-- regeln -->
- Kombinationen stammen vom Hauptartikel
- Ohne aktives Layout bleibt die Beilage aus
<!-- testen -->
- Produktseite mit aktivem Layout öffnen
- Seite trägt Kombinationen und Vorbelegung

View File

@@ -0,0 +1,53 @@
<!-- titel -->
Vorschau zeigen
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Der Kunde sieht Bild und Preis der gewählten Kombination
----------------------------------------
<!-- regeln -->
- Preis stimmt mit dem Preis der Produktseite überein
- Antwort wird nicht zwischengespeichert
- Späte Antworten überholter Anfragen werden verworfen
- Ohne eigene Bilder greifen die Bilder des Elternartikels
----------------------------------------
<!-- funktion -->
Vorschau laden
<!-- ziel -->
Holt Bilder und Preis zur laufenden Auswahl
<!-- regeln -->
- Jede Auswahl löst eine neue Anfrage aus
- Titelbild der Variante steht an erster Stelle
- Ohne Treffer bleibt die Produkt-ID als Rückfall
<!-- testen -->
- Konfigurator öffnen
- Andere Option wählen
- Bild und Preis ändern sich
----------------------------------------
<!-- funktion -->
Galerie blättern
<!-- ziel -->
Zeigt weitere Bilder der gewählten Variante
<!-- regeln -->
- Pfeil-Icons blättern vor
- Pfeil-Icons blättern zurück
- Nach dem letzten Bild folgt das erste
- Bei einem Bild bleibt die Navigation aus
<!-- testen -->
- Konfigurator öffnen
- LMB auf Vor-Icon
- Nächstes Bild erscheint
----------------------------------------
<!-- funktion -->
Bild wählen
<!-- ziel -->
Wechselt das große Bild über die Vorschaubilder
<!-- regeln -->
- Aktives Vorschaubild ist hervorgehoben
- Großes Bild folgt der Wahl
<!-- testen -->
- Konfigurator öffnen
- LMB auf drittes Vorschaubild
- Großes Bild zeigt dieses Motiv

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,53 @@
<!-- titel -->
Ansicht
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Umschalten zwischen Ansichtsmodi und Farbschema der Anwendung
----------------------------------------
<!-- regeln -->
- Systemänderungen wirken sofort im Auto-Modus
- Kompaktmodus zeigt Zusammenfassung
- Vollmodus zeigt alle Details
- Panel schließen entfernt es aus dem DOM
- Auge-Icon nur im Vollmodus
- MMB in beiden Modi wechselt die Ansicht
----------------------------------------
<!-- funktion -->
Ansicht wechseln
<!-- testen -->
- MMB auf Karte drücken
- Kompaktmodus wechselt zu Vollmodus
----------------------------------------
<!-- funktion -->
Darkmode umschalten
<!-- ziel -->
Passt die Farbgebung der App an die bevorzugte Umgebung an
<!-- regeln -->
- Zyklus: Auto → Hell → Dunkel → Auto
- Auto folgt der Systemeinstellung
- Auswahl bleibt nach Neuladen erhalten
<!-- testen -->
- Klick auf Darkmode-Icon
- Modus wechselt zum nächsten im Zyklus
- Seite zeigt den gewählten Modus
----------------------------------------
<!-- funktion -->
Panel schließen
<!-- regeln -->
- schliesse entfernt das Panel aus dem DOM
<!-- testen -->
- LMB auf ✕-Icon
- Panel nicht mehr sichtbar
----------------------------------------
<!-- funktion -->
Systemfarben nutzen
<!-- regeln -->
- Nur wirksam wenn Modus auf Auto steht
- Systemänderungen werden sofort übernommen
<!-- testen -->
- Auto-Modus wählen
- Systemfarbschema wechseln
- App-Oberfläche passt sich an

83
daten/PLANER2GEN/chat.md Normal file
View File

@@ -0,0 +1,83 @@
<!-- titel -->
Chat
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Beschreibt ein Projekt im Gespräch und erhält Karten als Vorschlag zurück
----------------------------------------
<!-- regeln -->
- Unbekanntes Projekt gibt 404
- x-Icon schließt Chat
- Prüfung wird geschlossen falls offen
- Chat verwerfen nur bei vorhandenem Verlauf
- Chat verwerfen ohne Backend-Aufruf
- body enthält Pflichtfeld text
----------------------------------------
<!-- funktion -->
Chat leeren
<!-- ziel -->
Entfernt alle Nachrichten aus dem Chatverlauf
<!-- regeln -->
- 404 bei unbekanntem Projekt
- chat.leeren aufgerufen
<!-- testen -->
- Chat öffnen
- Nachricht senden
- Löschanfrage an Chat senden
- Antwort {"ok": true}
- Chatverlauf leer
----------------------------------------
<!-- funktion -->
Chat schließen
<!-- ziel -->
Schließt das Chat-Panel und kehrt zur Projektansicht zurück
<!-- regeln -->
- x-Icon
- Schließen ist immer möglich
<!-- testen -->
- LMB auf x-Icon
- Panel entfernt
----------------------------------------
<!-- funktion -->
Chat öffnen
<!-- ziel -->
Tauscht die rechte Spalte zwischen Chat und Prüfung aus
<!-- regeln -->
- Schließt Prüfung, falls offen
<!-- testen -->
- Prüfung öffnen
- LMB auf Chat-Button
- ChatPanel sichtbar, PrüfPanel geschlossen
----------------------------------------
<!-- funktion -->
Chat-Nachricht senden
<!-- ziel -->
Holt eine Antwort des KI-Agenten zum aktuellen Projekt
<!-- regeln -->
- body enthält Pflichtfeld text
- Leere Nachricht wird abgelehnt
- Projekt nicht gefunden gibt 404
- Agent nicht konfiguriert gibt 400
- Antwort enthält gesamten Verlauf
<!-- testen -->
- POST an Chat-Endpunkt mit Text Frage
- Antwort mit Verlauf enthält Nachricht und Antwort
- POST mit leerem Text gibt 400
----------------------------------------
<!-- funktion -->
Nachricht senden
<!-- ziel -->
Schickt eine Nachricht und zeigt die Antwort der KI
<!-- regeln -->
- Leere Nachrichten nicht senden
- Anfragen werden nacheinander verarbeitet
- Eigene Nachricht erscheint sofort vor der Antwort
- Fehlgeschlagene Nachrichten werden wiederhergestellt
<!-- testen -->
- Text ins Eingabefeld eingeben
- Enter drücken
- Eigene Nachricht erscheint im Verlauf
- Ladeanzeige erscheint
- Antwort der KI erscheint im Verlauf

View File

@@ -0,0 +1,260 @@
<!-- titel -->
Features
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Verwaltet Features und Projekte einer Software, einschließlich Bearbeitung, Suche und Überprüfung
----------------------------------------
<!-- regeln -->
- Seitenleiste zeigt alle Projekte
- Features stehen in Spalten unter dem aktiven Projekt
- MMB oder Augen-Icon wechselt Kompakt- und Vollmodus
- Fehlerhafte Karte öffnet sich im Vollmodus
- Suchergebnis blendet nicht passende Karten aus
- Vorgeschlagene Karte als Umriss dargestellt
- Feature verschieben nur bei mehreren Projekten
- Kontextmenü der Karte nur im Vollmodus
- Problemanzahl als Badge auf der Karte
- Sammelaktion ab drei vorgeschlagenen Karten
- Stand wechselt zwischen offen und gebaut
- Funktionen sind über Kontextmenü nach oben und unten verschiebbar
- Einzelne Felder lassen sich zu einer Funktion hinzufügen
- Verschieben unbekannter Features wirft 404
----------------------------------------
<!-- funktion -->
Badge umschalten
<!-- ziel -->
Markiert ein Feature als kern oder optional
<!-- regeln -->
- Toggelt zwischen kern und optional
- Nur im Vollmodus verfügbar
<!-- testen -->
- Vollmodus öffnen
- LMB auf Badge
- Badge zeigt optional statt kern
----------------------------------------
<!-- funktion -->
Feature anlegen
<!-- ziel -->
Legt ein neues Feature im aktuellen Projekt an
<!-- regeln -->
- Titel ist Pflichtfeld
- Erstellt leere Feature-Datei mit Titel
- Neue Karte öffnet im Vollmodus
- Alphabetisch einsortiert
<!-- testen -->
- RMB auf den Bereich
- Klick auf "+ Feature erstellen"
- Titel eingeben und bestätigen
- Karte im Vollmodus sichtbar
----------------------------------------
<!-- funktion -->
Feature bearbeiten
<!-- ziel -->
Ändert Titel, Ziel, Regeln, Funktion oder Testschritte direkt in der Karte
<!-- regeln -->
- Titel-Klick öffnet ein Eingabefeld
- Nur im Vollmodus verfügbar
- Escape verwirft die Änderung
- Enter oder Klick außerhalb speichert
- Leerer Titel wird verworfen
<!-- testen -->
- Karte im Vollmodus öffnen
- Klick auf Titel
- Titel-Feld ist fokussiert und markiert
- Text ändern und Enter drücken
- Titel aktualisiert
----------------------------------------
<!-- funktion -->
Feature löschen
<!-- ziel -->
Entfernt ein Feature dauerhaft aus dem Projekt
<!-- regeln -->
- Wird über das Kontextmenü der Karte aufgerufen
- Erfragt eine Bestätigung vor dem Entfernen
- Löst das Entfernen über ein Event aus
<!-- testen -->
- RMB auf die Feature-Karte
- Klick auf "Feature entfernen"
- Bestätigung im Dialog
- Feature entfernt
----------------------------------------
<!-- funktion -->
Feature sichern
<!-- ziel -->
Speichert Änderungen an einer Feature-Karte dauerhaft
<!-- regeln -->
- Akzeptiert rohen Kartentext als Text
- Gibt 404 bei unbekanntem Projekt
- Gibt 400 bei ungültigem Kartentext
<!-- testen -->
- PUT api.projekte.name.features.id mit body {"roh": "Neuer Text"}
- Antwort 200 mit aktualisierter Karte
- Karte enthält neuen Text
----------------------------------------
<!-- funktion -->
Feature verschieben
<!-- ziel -->
Verschiebt ein Feature in ein anderes Projekt
<!-- regeln -->
- Nur möglich wenn mehrere Projekte existieren
- Zielprojekt muss existieren
- Feature bleibt unter neuer Projektzugehörigkeit erhalten
<!-- testen -->
- RMB auf Karte
- Klick auf "→ Feature verschieben"
- Zielprojekt auswählen
- Feature im Zielprojekt
----------------------------------------
<!-- funktion -->
Projekt auswählen
<!-- ziel -->
Zeigt die Features eines anderen Projekts an
<!-- regeln -->
- Aktives Projekt ist hervorgehoben
- Klick auf aktives Projekt bleibt aktiv
<!-- testen -->
- Klick auf Projekt in der Liste
- Projekt ist hervorgehoben
- Vorher aktives Projekt ist nicht mehr hervorgehoben
----------------------------------------
<!-- funktion -->
Projekt entfernen
<!-- ziel -->
Löscht ein nicht mehr benötigtes Projekt mitsamt aller seiner Features
<!-- regeln -->
- Fragt zur Bestätigung nach dem Projektnamen
- Löscht das Projekt und alle zugehörigen Features
- x-Icon bricht ab
- Entfernen-Button bestätigt die Löschung
<!-- testen -->
- RMB auf Projekt in der Seitenleiste
- Klick auf ✕ Projekt entfernen
- Klick auf Entfernen
- Projekt nicht mehr in der Liste
----------------------------------------
<!-- funktion -->
Projekt erstellen
<!-- ziel -->
Ermöglicht das Anlegen eines neuen Projekts über die Seitenleiste
<!-- regeln -->
- Projektname ist erforderlich
- Leerzeichen am Rand werden entfernt
- Projektname darf nicht existieren
- Erstelltes Projekt wird automatisch ausgewählt
<!-- testen -->
- Seitenleiste mit RMB öffnen
- Klick auf "+ Projekt"
- Projektname eingeben
- Klick auf "Erstellen"
- Modal geschlossen, Projekt ausgewählt
----------------------------------------
<!-- funktion -->
Projekt löschen
<!-- regeln -->
- 404 bei unbekanntem Projekt
- 400 bei ungültigem Wert
- Erfolg gibt {"ok": true} zurück
<!-- testen -->
- api-projekte name per GET aufrufen
- Antwort pruefen: 404
----------------------------------------
<!-- funktion -->
Projekt umbenennen
<!-- ziel -->
Ermöglicht das Umbenennen bestehender Projekte direkt in der Seitenleiste
<!-- regeln -->
- Umbenennung über Kontextmenü
- Umbenennung über Enter-Taste
- Escape bricht die Umbenennung ab
- Leere Eingabe verwirft die Änderung
- Gleicher Name wie zuvor verwirft die Änderung
- Projekt mit gleichem Namen erzeugt Fehler
<!-- testen -->
- RMB auf Projekt in der Seitenleiste
- Klick auf "Projekt anpassen"
- Neuen Namen eingeben
- Enter-Taste drücken
- Projektname in der Liste aktualisiert
----------------------------------------
<!-- funktion -->
Projekte anzeigen
<!-- testen -->
- Projekte-Endpunkt aufrufen
- Rückgabe prüfen
- Liste aller Projekte zurück
----------------------------------------
<!-- funktion -->
Projektfeatures anzeigen
<!-- ziel -->
Zeigt alle Features eines Projekts im Rohformat
<!-- regeln -->
- Rohformat enthält Karte und Funktionen
- Fehlendes Projekt wirft 404
<!-- testen -->
- GET api projekte MeinProjekt features
- Antwort enthält Liste der Features
- 404 bei unbekanntem Projekt
----------------------------------------
<!-- funktion -->
Projektmenü öffnen
<!-- ziel -->
Bietet Zugriff auf Anpassung, Quelle und Löschung einzelner Projekte
<!-- regeln -->
- RMB auf Projektname
- Drei Optionen verfügbar
<!-- testen -->
- RMB auf Projekt in Seitenleiste
- Menü erscheint mit drei Einträgen
- ✎ Projekt anpassen startet Umbenennung
- ◇ Quelle festlegen öffnet Modal zur Pfadwahl
- ✕ Projekt entfernen öffnet Bestätigungsdialog
----------------------------------------
<!-- funktion -->
Quelldaten laden
<!-- ziel -->
Legt fest, woher ein Projekt seine Daten bezieht
<!-- regeln -->
- GET gibt den aktuellen Pfad zurück
- PUT setzt einen neuen Pfad
- Leerer Pfad löscht die Zuordnung
<!-- testen -->
- PUT quelle mit projektname und pfad data input
- GET quelle mit projektname
- Rueckgabe enthaelt projektname und pfad data input
----------------------------------------
<!-- funktion -->
Vision entfernen
<!-- ziel -->
Ermöglicht das Löschen einer fehlerhaften oder überflüssigen Vision
<!-- regeln -->
- x-Icon
- RMB auf Karte öffnet Menü
- Klick außerhalb schließt Menü
<!-- testen -->
- RMB auf Vision-Karte
- Klick auf "Vision entfernen"
- Vision-Karte entfernt
----------------------------------------
<!-- funktion -->
Vision erstellen
<!-- ziel -->
Erstellt eine einzelne Vision-Karte für das Projekt
<!-- regeln -->
- Nur eine Vision je Projekt
- Vision steht über den Features
- Karte vom Typ vision
<!-- testen -->
- RMB auf den Bereich
- Klick auf + Vision erstellen
- Vision-Karte sichtbar
----------------------------------------
<!-- funktion -->
Doppeltes Projekt verhindern
<!-- testen -->
- Projekt mit Namen erstellen
- Projekt mit gleichem Namen erstellen
- Meldung erscheint
- Projekt nicht erstellt

View File

@@ -0,0 +1,102 @@
<!-- titel -->
Funktionen
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Beschreibt einzelne Schritte einer Feature-Karte
----------------------------------------
<!-- regeln -->
- Leere Titel werden verworfen
- Bearbeiten nur im Vollmodus
- Stand wechselt zwischen offen und gebaut
- Jede Änderung speichert sofort
- Kein Verschieben bei erster oder letzter Funktion
- Kontextmenü schließt bei Klick außerhalb
- Funktionsmenü in Kompaktmodus öffnet Kartenmenü
- Ziel, Regeln und Testen ohne Bearbeitung im Kompaktmodus
----------------------------------------
<!-- funktion -->
Funktion anlegen
<!-- ziel -->
Beschreibt eine neue Funktion der Karte
<!-- regeln -->
- Funktion enthält Ziel, Regeln und Testen
- Neue Funktion beginnt mit Stand gebaut
<!-- testen -->
- RMB auf Feature-Karte
- Klick auf "+ Funktion erstellen"
- Titel im Modal eingeben
- Klick auf "Erstellen"
- Funktion erscheint in der Liste
----------------------------------------
<!-- funktion -->
Funktion löschen
<!-- ziel -->
Entfernt eine nicht mehr benötigte Funktion aus der Liste
<!-- regeln -->
- Nur im Vollmodus verfügbar
- x-Icon im Kontextmenü
- Modale Rückfrage vor dem Entfernen
- Speichert die Änderung
<!-- testen -->
- Vollmodus öffnen
- RMB auf Funktion
- x-Icon betätigen
- Funktion entfernt
----------------------------------------
<!-- funktion -->
Funktion nach oben bewegen
<!-- ziel -->
Ändert die Reihenfolge der Funktionen
<!-- regeln -->
- Nur verfügbar bei nicht erster Funktion
- Vertauscht die Funktionsposition mit der darüberliegenden
- Speichert automatisch
<!-- testen -->
- RMB auf Funktion
- ▲ Nach oben wählen
- Funktion eine Position höher
----------------------------------------
<!-- funktion -->
Funktionsstand wechseln
<!-- ziel -->
Markiert eine Funktion als bestellt oder gebaut
<!-- regeln -->
- Nur im Vollmodus verfügbar
- @click.stop verhindert das Kartenmenü
- Toggle zwischen offen und gebaut
- Speichert sofort
<!-- testen -->
- Vollmodus öffnen
- LMB auf Stand-Button einer Funktion
- Stand wechselt von offen zu ✓ oder zurück
- Änderung gespeichert
----------------------------------------
<!-- funktion -->
Kontextmenü anzeigen
<!-- ziel -->
Bietet Zugriff auf kontextbezogene Aktionen einer Karte oder Funktion
<!-- regeln -->
- Kartenmenü im Kompaktmodus verfügbar
<!-- testen -->
- Vollmodus öffnen
- RMB auf Funktionszeile
- Menü mit Verschieben und Entfernen sichtbar
----------------------------------------
<!-- funktion -->
Kontextmenü verbergen
<!-- ziel -->
Schließt das Kontextmenü, wenn die Person woanders klickt oder Escape drückt
<!-- regeln -->
- Klick außerhalb des Menüs schließt es
- Klick auf Menüeintrag führt Aktion aus
- Escape-Taste schließt das Menü
<!-- testen -->
- Kontextmenü öffnen
- LMB außerhalb des Menüs klicken
- Menü geschlossen
- Kontextmenü erneut öffnen
- Escape-Taste drücken
- Menü geschlossen

View File

@@ -0,0 +1,92 @@
<!-- titel -->
Prüfung
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Prüft Feature-Karten auf formale Fehler und zeigt Stellen mit Problemen an
----------------------------------------
<!-- regeln -->
- Prüfung beenden gibt {"ok": true} zurück
- Fehlerstelle wird 1200ms lang hervorgehoben
- PruefPanel zeigt eine von vier Prüfarten: stil, feature, code, erzeugen
- Leerer Status ohne aktive Prüfung
- Eingabe bestätigen erfordert Bereitschaft des Systems
- Klick auf ✕ schließt das Panel
- Chat öffnen schließt das Prüfungspanel
----------------------------------------
<!-- funktion -->
Eingabe bestätigen
<!-- ziel -->
Ermöglicht schnelle Bestätigung der Eingabe per Tastatur
<!-- regeln -->
- Nur auslösbar wenn bereit true ist
- Emittiert bestaetigt-Event mit getrimmtem Wert
<!-- testen -->
- Eingabefeld fokussieren
- Text eingeben
- Enter drücken
- bestaetigt-Event mit Wert
----------------------------------------
<!-- funktion -->
Fehlerstelle anzeigen
<!-- ziel -->
Navigiert zur Feature-Karte mit dem Problem
<!-- regeln -->
- Scrollt zur Feature-Karte
- Markiert die Karte mit gesucht
- Highlight endet nach 1200ms
<!-- testen -->
- Prüfung mit Problemen öffnen
- LMB auf Problemeintrag
- Karte scrollt in die Ansicht und zeigt Highlight
----------------------------------------
<!-- funktion -->
Prüfung beenden
<!-- ziel -->
Bricht die laufende Prüfung ab, ohne Ergebnisse zu übernehmen
<!-- regeln -->
- Löschaufruf an Endpunkt
- Gibt ok true zurück
- FileNotFoundError als 404 weitergereicht
<!-- testen -->
- Prüfung im Projekt starten
- Warten auf Status running
- Löschaufruf an Prüfungsendpunkt senden
- Prüfung beendet
----------------------------------------
<!-- funktion -->
Prüfung starten
<!-- ziel -->
Prüft das Projekt auf Probleme und zeigt gefundene Stellen
<!-- regeln -->
- Vier Prüfarten verfügbar: erzeugen, stil, feature, code
- Progress in Prozent während der Prüfung
- PruefPanel zeigt Ergebnisse nach Abschluss
<!-- testen -->
- Prüfung starten mit Art "stil"
- Fortschritt in Prozent sichtbar
- PrüfPanel zeigt Ergebnisse
----------------------------------------
<!-- funktion -->
Prüfungsstatus anzeigen
<!-- ziel -->
Zeigt den aktuellen Zustand einer laufenden Prüfung
<!-- regeln -->
- Ohne aktive Prüfung wird ein leerer Status zurückgegeben
<!-- testen -->
- GET-Anfrage an Prüfungsendpunkt senden
- Status der Prüfung im Response
----------------------------------------
<!-- funktion -->
Systemstatus prüfen
<!-- ziel -->
Prüft ob der Backend-Server erreichbar ist
<!-- regeln -->
- GET api health
- Antwortet immer 200 mit {"ok": true}
<!-- testen -->
- GET api health
- Statuscode 200
- {"ok": true} im Body

View File

@@ -0,0 +1,62 @@
<!-- titel -->
Verlauf
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Verfolgt Änderungen und macht sie rückgängig
----------------------------------------
<!-- regeln -->
- ↺-Icon zeigt letzten Schritt als Tooltip
- Leerer Verlauf ist kein Fehlerzustand
- ↩-Icon ist ↺-Icon im Code
----------------------------------------
<!-- funktion -->
Aktion rückgängig machen
<!-- ziel -->
Nimmt den letzten Schritt im aktiven Projekt zurück
<!-- regeln -->
- ↺-Schaltfläche bei fehlendem letzterSchritt deaktiviert
- Strg+Z gilt nicht in Eingabefeldern
- Fehlgeschlagener Aufruf zeigt Meldung
<!-- testen -->
- Projekt mit Verlauf öffnen
- ↺-Schaltfläche anklicken
- Letzter Schritt aus Verlauf entfernt
- Meldung bleibt leer
----------------------------------------
<!-- funktion -->
Chat-Verlauf abrufen
<!-- ziel -->
Ermöglicht das Lesen vergangener Chat-Nachrichten eines Projekts
<!-- regeln -->
- Gibt den gesamten Verlauf als Liste zurück
- 404 bei unbekanntem Projekt
<!-- testen -->
- GET-Anfrage an Chat-Endpunkt senden
- Verlauf als JSON-Array mit Nachrichten
- Unbekanntes Projekt gibt 404
----------------------------------------
<!-- funktion -->
Projektverlauf anzeigen
<!-- ziel -->
Zeigt den letzten Stand im Projektverlauf
<!-- regeln -->
- 404 bei unbekanntem Projekt
- Feld "letzter" enthält letzten Verlaufseintrag
<!-- testen -->
- Endpunkt für Projektverlauf aufrufen
- Antwort mit Feld letzter prüfen
----------------------------------------
<!-- funktion -->
Änderung verwerfen
<!-- regeln -->
- LMB auf ↩-Icon verwirft den letzten Schritt
- Strg+Z außerhalb von Eingabefeldern verwirft
- Ohne vorherigen Schritt ist das Icon deaktiviert
- Nach dem Verwerfen aktualisiert sich die Feature-Liste
<!-- testen -->
- Projekt mit einer Änderung öffnen
- LMB auf ↩-Icon
- Änderung in der Liste zurückgesetzt

View File

@@ -0,0 +1,55 @@
<!-- titel -->
Vorschläge
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Zeigt Katalogprüfungsergebnisse und erlaubt Übernahme oder Verwerfung
----------------------------------------
<!-- regeln -->
- Fehlerhafte Karten öffnen sich im Vollmodus
- Nicht anwendbarer Vorschlag bleibt stehen
- Verwerfen entfernt das Problem dauerhaft
- Vor dem Übernehmen ist der Unterschied sichtbar
----------------------------------------
<!-- funktion -->
Alle Vorschläge annehmen
<!-- ziel -->
Nimmt alle Vorschläge auf einmal an statt einzeln
<!-- regeln -->
- Kartenentfernung hat Priorität
- Nicht anwendbarer Vorschlag wird übersprungen
<!-- testen -->
- Karte mit N Problemen öffnen
- LMB auf Übernehmen-Button
- Vorschläge angewendet
- Karte gespeichert
----------------------------------------
<!-- funktion -->
Vorschlag verwerfen
<!-- ziel -->
Entfernt einen Vorschlag aus der Anzeige, ohne ihn anzuwenden
<!-- regeln -->
- Entfernt das Problem aus der Liste
- Die Karte bleibt unverändert
<!-- testen -->
- Karte mit Vorschlag öffnen
- Klick auf ✕-Icon
- Vorschlag verschwindet, Karte ist unverändert
----------------------------------------
<!-- funktion -->
Vorschlag übernehmen
<!-- ziel -->
Nimmt einen Vorschlag als neue Feature-Karte ins Projekt auf
<!-- testen -->
- Feature mit Vorschlag öffnen
- Klick auf ✓-Icon
- Neue Karte im Gitter
----------------------------------------
<!-- funktion -->
Alle Vorschläge verwerfen
<!-- testen -->
- Vorschläge erstellen
- "Alle verwerfen" betätigen
- Alle Vorschläge verworfen

View File

@@ -0,0 +1,928 @@
{
"abdeckung": {
"bedienen:ablehnen": {
"abdruck": "e9cce25d92b81ff6",
"funktion": "Vorschlag annehmen",
"trug": "089e774256dcce89"
},
"bedienen:alleAblehnen": {
"abdruck": "ac9262c7cafe9537",
"funktion": "Alle Vorschläge verwerfen",
"trug": "6869d68fdbd6d0a7"
},
"bedienen:alleAnnehmen": {
"abdruck": "94f23cae75fdc531",
"funktion": "Alle Vorschläge annehmen",
"trug": "94ebeec7b03abb70"
},
"bedienen:annehmen": {
"abdruck": "2742ad031b3d3cca",
"funktion": "Vorschlag annehmen",
"trug": "089e774256dcce89"
},
"bedienen:auswaehlen": {
"abdruck": "d061bf62466085ce",
"funktion": "Projekt aufrufen",
"trug": "e24c2ab0a27ace24"
},
"bedienen:bereichsMenue": {
"abdruck": "4277536d43c7bcd5",
"funktion": "Projekt aufrufen",
"trug": "e24c2ab0a27ace24"
},
"bedienen:bestaetigen": {
"abdruck": "db1f954b9ad01749",
"funktion": "Eingabe mit Enter bestätigen",
"trug": "43fca3b0e83b3701"
},
"bedienen:erledige": {
"abdruck": "1b80ae13958bb11a",
"funktion": "Vorgeschlagene Karte anlegen",
"trug": "de2b733c447db595"
},
"bedienen:funktionsMenue": {
"abdruck": "bacdd0a7cc9d0f92",
"funktion": "Funktion verschieben",
"trug": "6a33d1b7b5a7f28c"
},
"bedienen:karteAnnehmen": {
"abdruck": "bf348251763e402a",
"funktion": "Vorgeschlagene Karte anlegen",
"trug": "de2b733c447db595"
},
"bedienen:kartenMenue": {
"abdruck": "d3ba136a562eb1e9",
"funktion": "Feature entfernen",
"trug": "f486bf09c64ebb3a"
},
"bedienen:leeren": {
"abdruck": "f2af432a5ae3b255",
"funktion": "Gespräch verwerfen",
"trug": "1f848fba8b2a5e56"
},
"bedienen:leistenMenue": {
"abdruck": "ed951fbeaaa9bc70",
"funktion": "Projekt anlegen",
"trug": "44b8a59e1dcb20d4"
},
"bedienen:oeffneChat": {
"abdruck": "9bf171761edca141",
"funktion": "Gespräch öffnen",
"trug": "c71610a339bb298e"
},
"bedienen:projektMenue": {
"abdruck": "ea73f8c2597c0443",
"funktion": "Projekt umbenennen",
"trug": "40d6954a44fa3240"
},
"bedienen:schliesse": {
"abdruck": "919b104c012c034d",
"funktion": "",
"trug": ""
},
"bedienen:schliessen": {
"abdruck": "1e12f9ae001e93e1",
"funktion": "Gespräch verwerfen",
"trug": "1f848fba8b2a5e56"
},
"bedienen:senden": {
"abdruck": "8df3402ed3373acc",
"funktion": "Nachricht senden",
"trug": "e61022551a98250f"
},
"bedienen:springe": {
"abdruck": "0b134efa50c03bff",
"funktion": "Problemstelle anspringen",
"trug": "7486526f6867c436"
},
"bedienen:starte": {
"abdruck": "761c2f62c917a3db",
"funktion": "Titel anpassen",
"trug": "d0b7a430e96e2599"
},
"bedienen:startePruefung": {
"abdruck": "31c3fef23c6319d8",
"funktion": "Gespräch öffnen",
"trug": "c71610a339bb298e"
},
"bedienen:umbenennen": {
"abdruck": "6185b6b39708bf02",
"funktion": "Projekt umbenennen",
"trug": "40d6954a44fa3240"
},
"bedienen:wechsleAnsicht": {
"abdruck": "e3193fce50eaa58e",
"funktion": "Anzeigemodus umschalten",
"trug": "fccea553715951de"
},
"bedienen:wechsleArt": {
"abdruck": "67250a1e8d82e960",
"funktion": "Feature einstufen",
"trug": "90b6c77ff0c412e6"
},
"bedienen:wechsleDarkMode": {
"abdruck": "b83524eb0e12a7d7",
"funktion": "Darkmode umschalten",
"trug": "4033fc55c753db3e"
},
"bedienen:wechsleStand": {
"abdruck": "8c2e3bf3be58ec00",
"funktion": "Stand umschalten",
"trug": "37a3835d1d2a3e6c"
},
"bedienen:zurueck": {
"abdruck": "e378014fbce96d10",
"funktion": "Schritt zurücknehmen",
"trug": "10e46c458040a5e3"
},
"hoeren:systemDunkel.change": {
"abdruck": "d3ef681b987557dc",
"funktion": "Darkmode umschalten",
"trug": "4033fc55c753db3e"
},
"hoeren:window.click": {
"abdruck": "620812522ed2d900",
"funktion": "Kontextmenü schließen",
"trug": "87216235bbe42a1a"
},
"hoeren:window.keydown": {
"abdruck": "c3e1df2d60fcc067",
"funktion": "Schritt zurücknehmen",
"trug": "10e46c458040a5e3"
},
"menue:+ Feature erstellen": {
"abdruck": "82c40072137d5757",
"funktion": "Feature anlegen",
"trug": "df7a1452a32da410"
},
"menue:+ Funktion erstellen": {
"abdruck": "b44457d64a5ec9d1",
"funktion": "Feature entfernen",
"trug": "f486bf09c64ebb3a"
},
"menue:+ Projekt erstellen": {
"abdruck": "2be770390433a2ce",
"funktion": "Projekt anlegen",
"trug": "44b8a59e1dcb20d4"
},
"menue:+ Vision erstellen": {
"abdruck": "cb22a654070e58b4",
"funktion": "Feature anlegen",
"trug": "df7a1452a32da410"
},
"menue:→ Feature verschieben": {
"abdruck": "38e6b244668ee164",
"funktion": "Feature entfernen",
"trug": "f486bf09c64ebb3a"
},
"menue:▲ Nach oben": {
"abdruck": "4e6fd1617d817357",
"funktion": "Funktion verschieben",
"trug": "6a33d1b7b5a7f28c"
},
"menue:▼ Nach unten": {
"abdruck": "183651450e546c4f",
"funktion": "Funktion entfernen",
"trug": "885e16a93460f706"
},
"menue:◇ Quelle festlegen": {
"abdruck": "e4bb1781bc375d6d",
"funktion": "Projekt umbenennen",
"trug": "40d6954a44fa3240"
},
"menue:✎ Projekt anpassen": {
"abdruck": "ad505addca45b06c",
"funktion": "Projekt umbenennen",
"trug": "40d6954a44fa3240"
},
"menue:✕ Feature entfernen": {
"abdruck": "bc968582260c45b9",
"funktion": "Funktion anlegen",
"trug": "78d0329cf6eacca9"
},
"menue:✕ Funktion entfernen": {
"abdruck": "d29458b150c55777",
"funktion": "Funktion verschieben",
"trug": "6a33d1b7b5a7f28c"
},
"menue:✕ Projekt entfernen": {
"abdruck": "aca25c0b5feaf752",
"funktion": "Projekt umbenennen",
"trug": "40d6954a44fa3240"
},
"menue:✕ Vision entfernen": {
"abdruck": "88520b1f105d3fb5",
"funktion": "Anzeigemodus umschalten",
"trug": "fccea553715951de"
},
"route:delete /projekte/{name}": {
"abdruck": "b4f871be35d10e5f",
"funktion": "Projekt entfernen",
"trug": "e91a89b8d78dbd2e"
},
"route:delete /projekte/{name}/features/{id}": {
"abdruck": "c1db81de98835c39",
"funktion": "Feature entfernen",
"trug": "f486bf09c64ebb3a"
},
"route:delete /projekte/{name}/pruefung": {
"abdruck": "7a480f33ddf55165",
"funktion": "Prüfung beenden",
"trug": "83435eb3e1394e49"
},
"route:get /health": {
"abdruck": "65257319741edf35",
"funktion": "",
"trug": ""
},
"route:get /projekte": {
"abdruck": "276556054437c303",
"funktion": "",
"trug": ""
},
"route:get /projekte/{name}/chat": {
"abdruck": "fd2a22c36ea85545",
"funktion": "Gespräch öffnen",
"trug": "c71610a339bb298e"
},
"route:get /projekte/{name}/features": {
"abdruck": "122f93cbd0d07881",
"funktion": "Projekt aufrufen",
"trug": "e24c2ab0a27ace24"
},
"route:get /projekte/{name}/pruefung": {
"abdruck": "e651ac90b7b2c520",
"funktion": "",
"trug": ""
},
"route:get /projekte/{name}/quelle": {
"abdruck": "834d3af3203ca3a8",
"funktion": "Quelle festlegen",
"trug": "b8b70dd0ff9817cb"
},
"route:get /projekte/{name}/verlauf": {
"abdruck": "5a3dcc678733fad8",
"funktion": "",
"trug": ""
},
"route:post /projekte": {
"abdruck": "fa1628d7e469885d",
"funktion": "Projekt anlegen",
"trug": "44b8a59e1dcb20d4"
},
"route:post /projekte/{name}/chat": {
"abdruck": "c3edc89cec5d2f6f",
"funktion": "Nachricht senden",
"trug": "e61022551a98250f"
},
"route:post /projekte/{name}/features": {
"abdruck": "00eb9c16560bac73",
"funktion": "Feature anlegen",
"trug": "df7a1452a32da410"
},
"route:post /projekte/{name}/pruefung": {
"abdruck": "6d7444a9dfad7d54",
"funktion": "Stil prüfen",
"trug": "d5019cdafd70efb7"
},
"route:post /projekte/{name}/pruefung/verworfen": {
"abdruck": "a43f7221e01c386f",
"funktion": "Alle Vorschläge verwerfen",
"trug": "6869d68fdbd6d0a7"
},
"route:post /projekte/{name}/verlauf/zurueck": {
"abdruck": "308fec6d21b01d60",
"funktion": "Schritt zurücknehmen",
"trug": "10e46c458040a5e3"
},
"route:put /projekte/{name}": {
"abdruck": "75383ac009961cad",
"funktion": "Projekt umbenennen",
"trug": "40d6954a44fa3240"
},
"route:put /projekte/{name}/features/{id}": {
"abdruck": "b24c7000fd2ec94c",
"funktion": "",
"trug": ""
},
"route:put /projekte/{name}/features/{id}/projekt": {
"abdruck": "fafc7a8a1656f93b",
"funktion": "Feature verschieben",
"trug": "cd2cd705298831e0"
},
"route:put /projekte/{name}/quelle": {
"abdruck": "d342055e3163548a",
"funktion": "Quelle festlegen",
"trug": "b8b70dd0ff9817cb"
}
},
"belege": {
"[\"darkmode\", \"Darkmode umschalten\"]": {
"abdruck": "653c08d0647a7f7b",
"beleg": "function wechsleDarkMode() {\n modus.value = MODI[(MODI.indexOf(modus.value) + 1) % MODI.length]\n localStorage.setItem('darkModus', modus.value)\n wendeAn()\n}",
"datei": "frontend/src/App.vue"
},
"[\"design\", \"Eingabe mit Enter bestätigen\"]": {
"abdruck": "3bace3e9c9f16023",
"beleg": "@keydown.enter.exact.prevent=\"senden\"",
"datei": "frontend/src/components/ChatPanel.vue"
},
"[\"design\", \"Kontextmenü schließen\"]": {
"abdruck": "671fa86bccb2c2c6",
"beleg": "export function schliesseMenue() {\n kontextMenue.value = null\n}",
"datei": "frontend/src/composables/kontextmenue.js"
},
"[\"features\", \"Anzeigemodus umschalten\"]": {
"abdruck": "b22ba2dd122887fa",
"beleg": "function wechsleAnsicht() {\n gross.value = !gross.value\n}",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"features\", \"Feature anlegen\"]": {
"abdruck": "d2968bea16a06b65",
"beleg": "async function erstellen(titel) {",
"datei": "frontend/src/components/FeatureListe.vue"
},
"[\"features\", \"Feature durchsuchen\"]": {
"abdruck": "4f249c42d46d25b5",
"beleg": "function passt(f) {\n const wort = suche.value.trim().toLowerCase()\n if (!wort) return true\n const s = f.sektionen\n const text = [s.titel, s.ziel, s.regeln,\n ...s.funktionen.map(x => `${x.text} ${x.ziel} ${x.regeln} ${x.testen}`)]\n return text.join(' ').toLowerCase().includes(wort)\n}",
"datei": "frontend/src/components/FeatureListe.vue"
},
"[\"features\", \"Feature einstufen\"]": {
"abdruck": "a0ee6590c24456bb",
"beleg": "function wechsleArt() {\n s.value.art = s.value.art === 'kern' ? 'optional' : 'kern'\n speichern()\n}",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"features\", \"Feature entfernen\"]": {
"abdruck": "c6f27381a41a63d7",
"beleg": "async function entfernen() {\n const id = modal.value.feature.id\n try {\n await featureLoeschen(props.projekt, id)\n features.value = features.value.filter(f => f.id !== id)\n modal.value = null\n emit('geaendert')\n } catch (e) {\n meldung.value = e.message\n }\n}",
"datei": "frontend/src/components/FeatureListe.vue"
},
"[\"features\", \"Feature verschieben\"]": {
"abdruck": "a82b97e3d4a1b533",
"beleg": "def verschieben(projekt: str, id: str, ziel: str) -> dict:",
"datei": "backend/features.py"
},
"[\"features\", \"Regeln anpassen\"]": {
"abdruck": "0af0e4eadcaae560",
"beleg": "<div v-else-if=\"s.regeln\" class=\"klickbar\" @click=\"starte('regeln')\">",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"features\", \"Titel anpassen\"]": {
"abdruck": "7f727f71dc555492",
"beleg": "<h3 v-else :title=\"gross ? 'Klicken zum Bearbeiten' : null\" @click=\"starte('titel')\">{{ s.titel }}</h3>",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"features\", \"Ziel anpassen\"]": {
"abdruck": "965b52779fa6aa35",
"beleg": "<div v-else-if=\"s.ziel\" class=\"inhalt klickbar\" v-html=\"md(s.ziel)\" @click=\"starte('ziel')\" />",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"funktionen\", \"Funktion anlegen\"]": {
"abdruck": "6250215b920cf0f0",
"beleg": "async function funktionErstellen(titel) {",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"funktionen\", \"Funktion entfernen\"]": {
"abdruck": "20e8d8e507ee6310",
"beleg": "eintraege.push({ text: '✕ Funktion entfernen', aktion: () => (modal.value = { art: 'entfernen', i }) })",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"funktionen\", \"Funktion verschieben\"]": {
"abdruck": "8435119f0dd5b891",
"beleg": "async function schiebe(i, richtung) {",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"funktionen\", \"Regeln anpassen\"]": {
"abdruck": "303d6988603e3d61",
"beleg": "async function starte(feld, i, j) {\n if (!gross.value) return // Bearbeiten nur in der ausführlichen Ansicht\n const original = wert(feld, i, j)\n aktiv.value = { feld, i, j, original }\n entwurf.value = original\n await nextTick()\n const el = Array.isArray(feldRef.value) ? feldRef.value[0] : feldRef.value\n el?.focus()\n if (feld === 'titel') el?.select()\n}",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"funktionen\", \"Stand umschalten\"]": {
"abdruck": "b66ea5f488899d8f",
"beleg": "@click.stop=\"wechsleStand(i)\"",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"funktionen\", \"Testschritte anpassen\"]": {
"abdruck": "e303ebeaece423de",
"beleg": "<div v-else class=\"klickbar\" @click=\"starte('testen', i)\">",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"funktionen\", \"Titel anpassen\"]": {
"abdruck": "3ceaa19290c793b4",
"beleg": "s.value.funktionen[a.i].text = neu",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"funktionen\", \"Ziel anpassen\"]": {
"abdruck": "4cb617031cbf6ef4",
"beleg": "<div v-else class=\"inhalt klickbar\" v-html=\"md(f.ziel)\" @click=\"starte('ziel', i)\" />",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"karten-besprechen\", \"Gespräch schließen\"]": {
"abdruck": "d6de2c46300fef26",
"beleg": "<button class=\"icon-knopf\" title=\"Gespräch schließen\" @click=\"emit('schliessen')\">✕</button>",
"datei": "frontend/src/components/ChatPanel.vue"
},
"[\"karten-besprechen\", \"Gespräch verwerfen\"]": {
"abdruck": "9e74be976a4d0e15",
"beleg": "@router.delete(\"/projekte/{name}/chat\")\nasync def chat_leeren(name: str):\n try:\n chat.leeren(name)\n except FileNotFoundError as e:\n raise HTTPException(404, str(e))\n return {\"ok\": True}",
"datei": "backend/routes.py"
},
"[\"karten-besprechen\", \"Gespräch öffnen\"]": {
"abdruck": "c84f9a14428a019e",
"beleg": "<button\n class=\"icon-knopf\"\n :class=\"{ an: chatOffen }\"\n title=\"Karten im Gespräch entwickeln\"\n @click=\"oeffneChat\"\n >✎</button>",
"datei": "frontend/src/App.vue"
},
"[\"karten-besprechen\", \"Nachricht senden\"]": {
"abdruck": "308218d682fe3dd9",
"beleg": "async def frage(projekt: str, text: str) -> dict:",
"datei": "backend/chat.py"
},
"[\"karten-besprechen\", \"Vorgeschlagene Karte anlegen\"]": {
"abdruck": "15aa862d2e0f6f6e",
"beleg": "async function karteAnnehmen(p) {",
"datei": "frontend/src/components/FeatureListe.vue"
},
"[\"karten-pruefen\", \"Alle Vorschläge annehmen\"]": {
"abdruck": "52fb2acd3d6945fa",
"beleg": "async function alleAnnehmen() {\n props.probleme.forEach(p => { if (anwenden(p)) erledige(p) })\n await speichern()\n}",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"karten-pruefen\", \"Alle Vorschläge verwerfen\"]": {
"abdruck": "f98fd3fc005b9e56",
"beleg": "<button\n class=\"icon-knopf rot\"\n :title=\"`Alle ${probleme.length} Vorschläge verwerfen`\"\n @click=\"alleAblehnen\"\n >✕</button>",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"karten-pruefen\", \"Code in Features prüfen\"]": {
"abdruck": "daf5820ada5ee059",
"beleg": "async def code_im_feature(features: list, punkte: list, stand: dict,",
"datei": "backend/inhalt.py"
},
"[\"karten-pruefen\", \"Features im Code prüfen\"]": {
"abdruck": "acc652c172671790",
"beleg": "ANKLAGE_AB = 4",
"datei": "backend/inhalt.py"
},
"[\"karten-pruefen\", \"Funktion abnehmen\"]": {
"abdruck": "21095461d6190dec",
"beleg": "if beleg:\n stand[\"belege\"][schluessel] = beleg\n if x.get(\"stand\") == parser.OFFEN:\n # Abnahme: die Karte hat es bestellt, jetzt steht es im Code\n return {\"feature\": feature[\"id\"], \"titel\": x[\"text\"], \"art\": \"gebaut\",\n \"grund\": f'{beleg[\"datei\"]}: {beleg[\"beleg\"].strip()}'}",
"datei": "backend/inhalt.py"
},
"[\"karten-pruefen\", \"Problemstelle anspringen\"]": {
"abdruck": "340a32321fd23834",
"beleg": "karte.classList.add('gesucht')",
"datei": "frontend/src/components/PruefPanel.vue"
},
"[\"karten-pruefen\", \"Prüfung beenden\"]": {
"abdruck": "7400070de29ce762",
"beleg": "<button class=\"icon-knopf\" title=\"Schließen\" @click=\"schliesse\">✕</button>",
"datei": "frontend/src/components/PruefPanel.vue"
},
"[\"karten-pruefen\", \"Stil prüfen\"]": {
"abdruck": "86c4530f5dd0bd52",
"beleg": "async def starte(projekt: str, art: str = \"stil\") -> dict:",
"datei": "backend/pruefung.py"
},
"[\"karten-pruefen\", \"Vorschlag annehmen\"]": {
"abdruck": "e4b81d800fd23fec",
"beleg": "async function annehmen(p) {\n if (anwenden(p)) erledige(p)\n await speichern()\n}",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"karten-pruefen\", \"Vorschlag verwerfen\"]": {
"abdruck": "b37b74ea369ed66c",
"beleg": "export function erledige(problem) {\n probleme.value = probleme.value.filter(p => p !== problem)\n}",
"datei": "frontend/src/composables/pruefung.js"
},
"[\"projekte\", \"Projekt anlegen\"]": {
"abdruck": "9b3598c9081155b2",
"beleg": "def anlegen(name: str):",
"datei": "backend/projekte.py"
},
"[\"projekte\", \"Projekt aufrufen\"]": {
"abdruck": "1071109545496535",
"beleg": "@click=\"emit('auswaehlen', p.name)\"",
"datei": "frontend/src/components/SeitenLeiste.vue"
},
"[\"projekte\", \"Projekt entfernen\"]": {
"abdruck": "e413063557fa0f13",
"beleg": "shutil.rmtree(ordner)",
"datei": "backend/projekte.py"
},
"[\"projekte\", \"Projekt umbenennen\"]": {
"abdruck": "d4e71f8ef907393c",
"beleg": "function projektMenue(e, name) {\n oeffneMenue(e, [\n { text: '✎ Projekt anpassen', aktion: () => starteUmbenennen(name) },\n { text: '◇ Quelle festlegen', aktion: () => starteQuelle(name) },\n { text: '✕ Projekt entfernen', aktion: () => oeffneModal({ art: 'entfernen', name }) },\n ])\n}",
"datei": "frontend/src/components/SeitenLeiste.vue"
},
"[\"projekte\", \"Quelle festlegen\"]": {
"abdruck": "fc6c20f4e8d74fa6",
"beleg": "if ziel == Path(ziel.anchor) or ziel == Path.home():",
"datei": "backend/quelle.py"
},
"[\"schritt-zuruecknehmen\", \"Nächsten Rückschritt anzeigen\"]": {
"abdruck": "6768d8a0b83537a2",
"beleg": "letzterSchritt.value = (await fetchVerlauf(aktivesProjekt.value)).letzter",
"datei": "frontend/src/App.vue"
},
"[\"schritt-zuruecknehmen\", \"Schritt zurücknehmen\"]": {
"abdruck": "c49332e7a679dfda",
"beleg": "def zurueck(projekt: str) -> str:\n \"\"\"Den letzten Schritt zurücknehmen. Gibt zurück, was zurückgenommen wurde.\"\"\"\n schritte = lade(projekt)\n if not schritte:\n raise ValueError(\"Nichts zum Zurücknehmen\")\n schritt = schritte.pop()",
"datei": "backend/verlauf.py"
},
"[\"vision-festhalten\", \"Anzeigemodus umschalten\"]": {
"abdruck": "b983b82c02343560",
"beleg": "const gross = ref(false)",
"datei": "frontend/src/components/VisionKarte.vue"
},
"[\"vision-festhalten\", \"Vision anlegen\"]": {
"abdruck": "58ceb9502d1754bf",
"beleg": "<div class=\"bereich\" @contextmenu.prevent=\"bereichsMenue\">",
"datei": "frontend/src/components/FeatureListe.vue"
},
"[\"vision-festhalten\", \"Vision anpassen\"]": {
"abdruck": "dd527b57b4c9685e",
"beleg": "async function fertig() {\n if (!aktiv.value) return\n aktiv.value = false\n const neu = entwurf.value.trim()\n if (neu === text.value) return\n text.value = neu\n await speichern()\n}",
"datei": "frontend/src/components/VisionKarte.vue"
},
"[\"vision-festhalten\", \"Vision entfernen\"]": {
"abdruck": "0aeb156d13b32b7e",
"beleg": "function kartenMenue(e) {\n oeffneMenue(e, [{ text: '✕ Vision entfernen', aktion: () => emit('entfernen') }])\n}",
"datei": "frontend/src/components/VisionKarte.vue"
}
},
"ohne_code": {},
"ohne_karte": {
"route:delete /projekte/{name}/chat": {
"abdruck": "4ba7a240985a83b4",
"beleg": "backend/routes.py:182",
"feature": "karten-besprechen",
"karten": "41f55589fcff4959",
"stelle": "route:delete /projekte/{name}/chat",
"titel": "Chatverlauf leeren"
}
},
"paare": {
"[\"[\\\"features\\\", \\\"Anzeigemodus umschalten\\\"]\", \"[\\\"vision-festhalten\\\", \\\"Anzeigemodus umschalten\\\"]\"]": {
"abdruck": "d23706be97d6369a",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Feature anlegen\\\"]\", \"[\\\"features\\\", \\\"Feature entfernen\\\"]\"]": {
"abdruck": "586059671bbfa75b",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Feature anlegen\\\"]\", \"[\\\"funktionen\\\", \\\"Funktion anlegen\\\"]\"]": {
"abdruck": "3eb9956887005cc4",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Feature anlegen\\\"]\", \"[\\\"projekte\\\", \\\"Projekt anlegen\\\"]\"]": {
"abdruck": "66a7175c58b703c4",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Feature entfernen\\\"]\", \"[\\\"funktionen\\\", \\\"Funktion anlegen\\\"]\"]": {
"abdruck": "97a9dde3e968b1eb",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Feature entfernen\\\"]\", \"[\\\"funktionen\\\", \\\"Funktion entfernen\\\"]\"]": {
"abdruck": "9717a5c6eab69f22",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Feature entfernen\\\"]\", \"[\\\"projekte\\\", \\\"Projekt entfernen\\\"]\"]": {
"abdruck": "65c43ee10d0d8b4a",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Feature entfernen\\\"]\", \"[\\\"vision-festhalten\\\", \\\"Vision entfernen\\\"]\"]": {
"abdruck": "60434d422bbd2ca3",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Regeln anpassen\\\"]\", \"[\\\"features\\\", \\\"Titel anpassen\\\"]\"]": {
"abdruck": "75e90ff6d5453c2d",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Regeln anpassen\\\"]\", \"[\\\"features\\\", \\\"Ziel anpassen\\\"]\"]": {
"abdruck": "a9e849a044a7ee41",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Regeln anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Regeln anpassen\\\"]\"]": {
"abdruck": "827215ea68dcbada",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Regeln anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Titel anpassen\\\"]\"]": {
"abdruck": "ea7185c230fbdd2f",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Regeln anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Ziel anpassen\\\"]\"]": {
"abdruck": "bc79858745a7d262",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Titel anpassen\\\"]\", \"[\\\"features\\\", \\\"Ziel anpassen\\\"]\"]": {
"abdruck": "69360dc1502aa01f",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Titel anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Titel anpassen\\\"]\"]": {
"abdruck": "01fbbfc1ca91d32a",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Titel anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Ziel anpassen\\\"]\"]": {
"abdruck": "414ddf4e7bff9896",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Ziel anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Titel anpassen\\\"]\"]": {
"abdruck": "83a0a87e978c859a",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Ziel anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Ziel anpassen\\\"]\"]": {
"abdruck": "5e97e3c6fe9df287",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Funktion anlegen\\\"]\", \"[\\\"funktionen\\\", \\\"Funktion entfernen\\\"]\"]": {
"abdruck": "3e58148f974b6b34",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Funktion anlegen\\\"]\", \"[\\\"projekte\\\", \\\"Projekt anlegen\\\"]\"]": {
"abdruck": "202f51c53a73b452",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Funktion entfernen\\\"]\", \"[\\\"projekte\\\", \\\"Projekt entfernen\\\"]\"]": {
"abdruck": "a9d2c4dd5e70fa2c",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Funktion entfernen\\\"]\", \"[\\\"vision-festhalten\\\", \\\"Vision entfernen\\\"]\"]": {
"abdruck": "4090ee6826466fa3",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Regeln anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Titel anpassen\\\"]\"]": {
"abdruck": "c8321ad2b769d77f",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Regeln anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Ziel anpassen\\\"]\"]": {
"abdruck": "7ce003da82080259",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Regeln anpassen\\\"]\", \"[\\\"karten-pruefen\\\", \\\"Funktion abnehmen\\\"]\"]": {
"abdruck": "d2f80684e1be6287",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Testschritte anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Titel anpassen\\\"]\"]": {
"abdruck": "7a51922f327ba28b",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Testschritte anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Ziel anpassen\\\"]\"]": {
"abdruck": "97a70c7ecfbb9f30",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Titel anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Ziel anpassen\\\"]\"]": {
"abdruck": "17b00db94f54b62d",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Titel anpassen\\\"]\", \"[\\\"vision-festhalten\\\", \\\"Vision anpassen\\\"]\"]": {
"abdruck": "d17a7b7bad8d947a",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Ziel anpassen\\\"]\", \"[\\\"vision-festhalten\\\", \\\"Vision anpassen\\\"]\"]": {
"abdruck": "e25b21ca4183d372",
"gleich": false
},
"[\"[\\\"karten-pruefen\\\", \\\"Alle Vorschläge annehmen\\\"]\", \"[\\\"karten-pruefen\\\", \\\"Alle Vorschläge verwerfen\\\"]\"]": {
"abdruck": "b9c707879cffb7cd",
"gleich": false
},
"[\"[\\\"karten-pruefen\\\", \\\"Alle Vorschläge verwerfen\\\"]\", \"[\\\"karten-pruefen\\\", \\\"Vorschlag verwerfen\\\"]\"]": {
"abdruck": "aed348a776637c4a",
"gleich": false
},
"[\"[\\\"projekte\\\", \\\"Projekt anlegen\\\"]\", \"[\\\"projekte\\\", \\\"Projekt entfernen\\\"]\"]": {
"abdruck": "957ebec8e3096ce6",
"gleich": false
},
"[\"[\\\"projekte\\\", \\\"Projekt entfernen\\\"]\", \"[\\\"vision-festhalten\\\", \\\"Vision entfernen\\\"]\"]": {
"abdruck": "8757fb8b0f89d5a6",
"gleich": false
}
},
"stil": {
"[\"darkmode\", \"\"]": {
"abdruck": "a5b0fd59f25c55ae",
"probleme": []
},
"[\"darkmode\", \"Darkmode umschalten\"]": {
"abdruck": "0dbcca6954cc4d16",
"probleme": []
},
"[\"design\", \"\"]": {
"abdruck": "1ae7985ebcfe6c6a",
"probleme": []
},
"[\"design\", \"Eingabe mit Enter bestätigen\"]": {
"abdruck": "b961f168017fb01e",
"probleme": []
},
"[\"design\", \"Kontextmenü schließen\"]": {
"abdruck": "a3717ea52a012784",
"probleme": []
},
"[\"features\", \"\"]": {
"abdruck": "b4f6fe4cd065e9e9",
"probleme": []
},
"[\"features\", \"Anzeigemodus umschalten\"]": {
"abdruck": "8d468a73bcec5521",
"probleme": []
},
"[\"features\", \"Feature anlegen\"]": {
"abdruck": "7d4d6e36b4f03318",
"probleme": []
},
"[\"features\", \"Feature durchsuchen\"]": {
"abdruck": "3acde68ab76b942c",
"probleme": []
},
"[\"features\", \"Feature einstufen\"]": {
"abdruck": "10e74d934dafacc9",
"probleme": []
},
"[\"features\", \"Feature entfernen\"]": {
"abdruck": "509a1153b2e6382f",
"probleme": []
},
"[\"features\", \"Feature verschieben\"]": {
"abdruck": "5169bc85a796b6a9",
"probleme": []
},
"[\"features\", \"Regeln anpassen\"]": {
"abdruck": "6b4eeed76c631333",
"probleme": []
},
"[\"features\", \"Titel anpassen\"]": {
"abdruck": "de6e2788e24aa230",
"probleme": []
},
"[\"features\", \"Ziel anpassen\"]": {
"abdruck": "f26e4426663b8265",
"probleme": []
},
"[\"funktionen\", \"\"]": {
"abdruck": "adcc38efdb393cf6",
"probleme": []
},
"[\"funktionen\", \"Funktion anlegen\"]": {
"abdruck": "11c59974712619a0",
"probleme": []
},
"[\"funktionen\", \"Funktion entfernen\"]": {
"abdruck": "e55d43e078f1020e",
"probleme": []
},
"[\"funktionen\", \"Funktion verschieben\"]": {
"abdruck": "1bdf3be9b53fdb99",
"probleme": []
},
"[\"funktionen\", \"Regeln anpassen\"]": {
"abdruck": "e354caf2701ee79c",
"probleme": []
},
"[\"funktionen\", \"Stand umschalten\"]": {
"abdruck": "f39b25d34cc6e4c4",
"probleme": []
},
"[\"funktionen\", \"Testschritte anpassen\"]": {
"abdruck": "8fb282300c19c3c2",
"probleme": []
},
"[\"funktionen\", \"Titel anpassen\"]": {
"abdruck": "63e9a78a02d890fe",
"probleme": []
},
"[\"funktionen\", \"Ziel anpassen\"]": {
"abdruck": "a72ce3656c787475",
"probleme": []
},
"[\"karten-besprechen\", \"\"]": {
"abdruck": "8d330c5a71e25e0c",
"probleme": []
},
"[\"karten-besprechen\", \"Gespräch schließen\"]": {
"abdruck": "d1c043cd26a05d69",
"probleme": []
},
"[\"karten-besprechen\", \"Gespräch verwerfen\"]": {
"abdruck": "e6d601409eb48f7a",
"probleme": []
},
"[\"karten-besprechen\", \"Gespräch öffnen\"]": {
"abdruck": "b9a3f8340aa9e266",
"probleme": []
},
"[\"karten-besprechen\", \"Nachricht senden\"]": {
"abdruck": "c3ec1453a9aff541",
"probleme": []
},
"[\"karten-besprechen\", \"Vorgeschlagene Karte anlegen\"]": {
"abdruck": "ca0a5b02f10bbd1e",
"probleme": []
},
"[\"karten-pruefen\", \"\"]": {
"abdruck": "43f92e591142fa95",
"probleme": []
},
"[\"karten-pruefen\", \"Alle Vorschläge annehmen\"]": {
"abdruck": "5afe1e8ec40d8b82",
"probleme": []
},
"[\"karten-pruefen\", \"Alle Vorschläge verwerfen\"]": {
"abdruck": "c44bbe11908637e9",
"probleme": []
},
"[\"karten-pruefen\", \"Code in Features prüfen\"]": {
"abdruck": "ed5da2461b99ddf3",
"probleme": []
},
"[\"karten-pruefen\", \"Features im Code prüfen\"]": {
"abdruck": "c31fcfa6dbc75232",
"probleme": []
},
"[\"karten-pruefen\", \"Funktion abnehmen\"]": {
"abdruck": "dd3cf177204bcf25",
"probleme": []
},
"[\"karten-pruefen\", \"Problemstelle anspringen\"]": {
"abdruck": "0656bbf0d6554c85",
"probleme": []
},
"[\"karten-pruefen\", \"Prüfung beenden\"]": {
"abdruck": "af40481c06d2fd97",
"probleme": []
},
"[\"karten-pruefen\", \"Stil prüfen\"]": {
"abdruck": "8326e792e8383b53",
"probleme": []
},
"[\"karten-pruefen\", \"Vorschlag annehmen\"]": {
"abdruck": "6f8d17b80787b7aa",
"probleme": []
},
"[\"karten-pruefen\", \"Vorschlag verwerfen\"]": {
"abdruck": "cf5bda968428df9f",
"probleme": []
},
"[\"projekte\", \"\"]": {
"abdruck": "a59f6fdfa58188fa",
"probleme": []
},
"[\"projekte\", \"Projekt anlegen\"]": {
"abdruck": "2c3ab4452996ffaf",
"probleme": []
},
"[\"projekte\", \"Projekt aufrufen\"]": {
"abdruck": "2ca7a3ea9e79fc6e",
"probleme": []
},
"[\"projekte\", \"Projekt entfernen\"]": {
"abdruck": "a0c52ceb9605a805",
"probleme": []
},
"[\"projekte\", \"Projekt umbenennen\"]": {
"abdruck": "d41292ff010e7fd3",
"probleme": []
},
"[\"projekte\", \"Quelle festlegen\"]": {
"abdruck": "990ee354f1aa70fa",
"probleme": []
},
"[\"schritt-zuruecknehmen\", \"\"]": {
"abdruck": "f4ecff18e05ff058",
"probleme": []
},
"[\"schritt-zuruecknehmen\", \"Nächsten Rückschritt anzeigen\"]": {
"abdruck": "2d944c3424b6f851",
"probleme": []
},
"[\"schritt-zuruecknehmen\", \"Schritt zurücknehmen\"]": {
"abdruck": "28825333acb1e107",
"probleme": []
},
"[\"vision-festhalten\", \"\"]": {
"abdruck": "e83e9ad5470aa4b1",
"probleme": []
},
"[\"vision-festhalten\", \"Anzeigemodus umschalten\"]": {
"abdruck": "87c494e1e1b0a7b2",
"probleme": []
},
"[\"vision-festhalten\", \"Vision anlegen\"]": {
"abdruck": "7826b26956ba51d2",
"probleme": []
},
"[\"vision-festhalten\", \"Vision anpassen\"]": {
"abdruck": "378ea30c154f7994",
"probleme": []
},
"[\"vision-festhalten\", \"Vision entfernen\"]": {
"abdruck": "340343e51583e86a",
"probleme": []
}
},
"verworfen": {
"route:delete /projekte/{name}/chat": {
"abdruck": "4ba7a240985a83b4",
"titel": "Gespräch schließen\nChatverlauf leeren"
}
}
}

View File

@@ -0,0 +1,23 @@
<!-- titel -->
Darkmode
----------------------------------------
<!-- art -->
optional
----------------------------------------
<!-- ziel -->
Passt die Anwendung ans Umgebungslicht an
----------------------------------------
<!-- regeln -->
- Auto folgt der Systemeinstellung
- Zustand überlebt das Neuladen
- Kein Flackern beim Laden
----------------------------------------
<!-- funktion -->
Darkmode umschalten
<!-- regeln -->
- Nacht-Icon: ☾
- Tag-Icon: ☀
- Auto-Icon: A
<!-- testen -->
- LMB auf Icon in der Kopfzeile
- Modus gewechselt

View File

@@ -0,0 +1,44 @@
<!-- titel -->
Design
----------------------------------------
<!-- art -->
optional
----------------------------------------
<!-- ziel -->
Hält die Oberfläche lesbar und ruhig
----------------------------------------
<!-- regeln -->
- Karten stapeln sich lückenlos in Spalten
- Lesefeld ist in der Breite gedeckelt
- Leisten scrollen nicht mit
- Schmale Fenster stapeln die Bereiche
- Klickflächen sind mindestens 28 Pixel
- Textkontrast erfüllt die Lesbarkeitsschwelle
- Kontextmenü bleibt im Fenster
- Modal setzt den Fokus ins Eingabefeld
- Escape schließt das Modal
----------------------------------------
<!-- funktion -->
Eingabe mit Enter bestätigen
<!-- ziel -->
Spart den Weg zum Knopf
<!-- regeln -->
- Gilt in einzeiligen Feldern
- Escape verwirft stattdessen
<!-- testen -->
- Modal öffnen
- Text eingeben
- Enter drücken
- Eingabe übernommen
<!-- funktion -->
Kontextmenü schließen
<!-- ziel -->
Räumt ein offenes Menü aus dem Weg
<!-- regeln -->
- Klick daneben schließt es
- Escape schließt es
- Ein neues Menü verdrängt das alte
<!-- testen -->
- RMB auf eine Karte
- LMB daneben
- Menü geschlossen

View File

@@ -0,0 +1,109 @@
<!-- titel -->
Features
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Hält fest, was ein Projekt können soll
----------------------------------------
<!-- regeln -->
- Eine Markdown-Datei je Feature
- Die Datei ist die Wahrheit
- Titel bestimmt den Dateinamen
- Namensgleichheit bekommt eine Nummer
- Fremde Marker bleiben erhalten
- Alphabetisch sortiert
- Anpassen nur im Vollmodus
- Verlassen speichert
- Escape verwirft
----------------------------------------
<!-- funktion -->
Anzeigemodus umschalten
<!-- ziel -->
Kompaktmodus zum Lesen, Vollmodus zum Anpassen
<!-- regeln -->
- Standard ist Kompaktmodus
- Vollmodus zeigt alle Felder
- Augen-Icon rechts oben
<!-- testen -->
- MMB auf Featurecard
- Modus umgeschaltet
<!-- funktion -->
Feature anlegen
<!-- regeln -->
- +-Icon
- Feature öffnet im Vollmodus
<!-- testen -->
- RMB auf Hauptbereich
- Klick auf "Feature erstellen"
- Namen im Modal eingeben
- Bestätigen mit LMB
- Feature angelegt
<!-- funktion -->
Feature einstufen
<!-- ziel -->
Trennt tragende von verzichtbaren Features
<!-- regeln -->
- Kern blau umrandet
- Optional grün umrandet
- Badge zeigt die Einstufung
<!-- testen -->
- Vollmodus öffnen
- LMB auf Badge
- Einstufung gewechselt
<!-- funktion -->
Feature durchsuchen
<!-- ziel -->
Findet die Karte, ohne alle zu lesen
<!-- regeln -->
- Sucht in allen Feldern
- Zählt Ausgeblendete mit
<!-- testen -->
- Suchwort eingeben
- Nur passende Karten bleiben
<!-- funktion -->
Feature entfernen
<!-- regeln -->
- x-Icon
<!-- testen -->
- RMB auf Featurecard
- Klick auf "Feature entfernen"
- Bestätigen im Modal
- Feature entfernt
<!-- funktion -->
Feature verschieben
<!-- ziel -->
Hängt ein Feature in ein anderes Projekt um
<!-- regeln -->
- Datei wandert
- Datei wird nicht kopiert
- Nur bei mehreren Projekten
<!-- testen -->
- RMB auf Featurecard
- Klick auf "Feature verschieben"
- Zielprojekt wählen
- Feature verschoben
<!-- funktion -->
Regeln anpassen
<!-- testen -->
- Vollmodus öffnen
- LMB auf Regeln der Karte
- Text ändern
- Regeln angepasst
<!-- funktion -->
Titel anpassen
<!-- regeln -->
- Aktualisiert den Dateinamen
<!-- testen -->
- Vollmodus öffnen
- LMB auf Titel der Karte
- Text ändern
- Titel angepasst
<!-- funktion -->
Ziel anpassen
<!-- testen -->
- Vollmodus öffnen
- LMB auf Ziel der Karte
- Text ändern
- Ziel angepasst

View File

@@ -0,0 +1,98 @@
<!-- titel -->
Funktionen
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Zerlegt ein Feature in prüfbare Stücke
----------------------------------------
<!-- regeln -->
- Gehört zu genau einem Feature
- Offen heißt bestellt, nicht gebaut
- Neue Funktionen von Hand gelten als gebaut
- Reihenfolge frei wählbar
- Ziel bleibt freiwillig
- Regeln bleiben freiwillig
- Testen bleibt freiwillig
- Anpassen nur im Vollmodus
- Verlassen speichert
- Escape verwirft
----------------------------------------
<!-- funktion -->
Funktion anlegen
<!-- regeln -->
- +-Icon
<!-- testen -->
- Vollmodus öffnen
- RMB auf Featurecard
- Klick auf "Funktion erstellen"
- Namen im Modal eingeben
- Bestätigen mit LMB
- Funktion angelegt
<!-- funktion -->
Funktion entfernen
<!-- regeln -->
- x-Icon
<!-- testen -->
- Vollmodus öffnen
- RMB auf Funktion
- Klick auf "Funktion entfernen"
- Bestätigen im Modal
- Funktion entfernt
<!-- funktion -->
Stand umschalten
<!-- ziel -->
Trennt Bestelltes von Gebautem
<!-- regeln -->
- Marke rechts vom Titel
- Offen ist gelb
- Gebaut ist ein Haken
- Kompakt erscheint nur die offene Marke
<!-- testen -->
- Vollmodus öffnen
- LMB auf die Marke
- Stand gewechselt
<!-- funktion -->
Funktion verschieben
<!-- ziel -->
Bringt die Schritte in ihre natürliche Folge
<!-- regeln -->
- Reihenfolge steht in der Datei
<!-- testen -->
- Vollmodus öffnen
- RMB auf Funktion
- Klick auf "Nach oben"
- Funktion verschoben
<!-- funktion -->
Titel anpassen
<!-- testen -->
- Vollmodus öffnen
- LMB auf Funktionstitel
- Text ändern
- Titel angepasst
<!-- funktion -->
Ziel anpassen
<!-- testen -->
- Vollmodus öffnen
- LMB auf Ziel der Funktion
- Text ändern
- Ziel angepasst
<!-- funktion -->
Regeln anpassen
<!-- regeln -->
- Eine Regel je Zeile
<!-- testen -->
- Vollmodus öffnen
- LMB auf Regeln der Funktion
- Text ändern
- Regeln angepasst
<!-- funktion -->
Testschritte anpassen
<!-- regeln -->
- Ein Schritt je Zeile
<!-- testen -->
- Vollmodus öffnen
- LMB auf Testen der Funktion
- Text ändern
- Testschritte angepasst

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -0,0 +1,61 @@
<!-- titel -->
Karten besprechen
----------------------------------------
<!-- art -->
optional
----------------------------------------
<!-- ziel -->
Entwickelt Karten im Gespräch mit der KI
----------------------------------------
<!-- regeln -->
- Die KI schreibt nie selbst in eine Karte
- Sie beschreibt den Sollzustand
- Was sich ändert, rechnet der Code aus
- Vorschläge sehen aus wie bei der Prüfung
- Neue Funktionen gelten als offen
- Das Gespräch überlebt den Neustart
- Die letzten 30 Wortmeldungen bleiben
- Gespräch und Prüfung teilen eine Spalte
----------------------------------------
<!-- funktion -->
Gespräch öffnen
<!-- regeln -->
- Stift-Icon in der Kopfzeile
- Icon leuchtet bei offenem Gespräch
<!-- testen -->
- LMB auf Stift-Icon
- Gespräch geöffnet
<!-- funktion -->
Nachricht senden
<!-- ziel -->
Sagt der KI, was das Projekt können soll
<!-- regeln -->
- Enter sendet
- Eigene Zeile erscheint sofort
- Text bleibt bei einem Fehler stehen
<!-- testen -->
- Text eingeben
- Enter drücken
- Antwort und Vorschläge erscheinen
<!-- funktion -->
Vorgeschlagene Karte anlegen
<!-- ziel -->
Macht aus einem Umriss eine echte Karte
<!-- regeln -->
- Gestrichelter Rand vor dem Annehmen
<!-- testen -->
- LMB auf Haken am Umriss
- Karte angelegt
<!-- funktion -->
Gespräch verwerfen
<!-- regeln -->
- Löscht nur das Gespräch
- Karten bleiben unberührt
<!-- testen -->
- LMB auf Papierkorb-Icon
- Gespräch geleert
<!-- funktion -->
Gespräch schließen
<!-- testen -->
- LMB auf x-Icon
- Spalte wieder frei

View File

@@ -0,0 +1,82 @@
<!-- titel -->
Karten prüfen
----------------------------------------
<!-- art -->
optional
----------------------------------------
<!-- ziel -->
Meldet, wo eine Karte vom Soll abweicht
----------------------------------------
<!-- regeln -->
- Ein Lauf je Projekt
- Ergebnis überlebt keinen Neustart
- Zugang steht in .env
- Fehlender Zugang bricht sichtbar ab
- Jeder Vorschlag ist für sich anwendbar
- Jeder Vorschlag nennt seinen Beleg
- Eine Katalogdatei je Feld im Ordner stil
- Neue Katalogdatei wirkt ohne Codeänderung
----------------------------------------
<!-- funktion -->
Alle Vorschläge annehmen
<!-- regeln -->
- Haken-Icon oben in der Karte
- Zahl nennt die Menge
<!-- testen -->
- Prüfung durchlaufen lassen
- LMB auf Haken-Icon der Karte
- Alle Vorschläge übernommen
<!-- funktion -->
Alle Vorschläge verwerfen
<!-- regeln -->
- x-Icon oben in der Karte
<!-- testen -->
- Prüfung durchlaufen lassen
- LMB auf x-Icon der Karte
- Alle Vorschläge verworfen
<!-- funktion -->
Problemstelle anspringen
<!-- ziel -->
Führt vom Panel-Eintrag zur betroffenen Karte
<!-- regeln -->
- Karte blitzt kurz auf
<!-- testen -->
- Prüfung durchlaufen lassen
- LMB auf Eintrag im Panel
- Karte im Editor sichtbar
<!-- funktion -->
Prüfung beenden
<!-- regeln -->
- x-Icon oben im Panel
<!-- testen -->
- Prüfung durchlaufen lassen
- LMB auf x-Icon im Panel
- Panel geschlossen
<!-- funktion -->
Stil prüfen
<!-- ziel -->
Prüft die Form gegen den Katalog
<!-- regeln -->
- Prüf-Icon in der Kopfzeile
- Wortzahl und Satzzeichen misst der Code
<!-- testen -->
- LMB auf Prüf-Icon
- Fortschritt unter dem Icon
- Fehlerhafte Karten rot markiert
<!-- funktion -->
Vorschlag annehmen
<!-- regeln -->
- Haken-Icon: ✓
- Übrige Vorschläge bleiben stehen
<!-- testen -->
- Prüfung durchlaufen lassen
- LMB auf Haken-Icon
- Vorschlag in der Datei
<!-- funktion -->
Vorschlag verwerfen
<!-- regeln -->
- x-Icon: ✕
<!-- testen -->
- Prüfung durchlaufen lassen
- LMB auf x-Icon
- Vorschlag verschwunden

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -0,0 +1,53 @@
<!-- titel -->
Projekte
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Gruppiert Features für ein Projekt
----------------------------------------
<!-- regeln -->
- Ordner unter daten ist das Projekt
- Alphabetisch sortiert
- Aktives Projekt ist hervorgehoben
- Auswahl überlebt das Neuladen
- Entfernen nimmt die Features mit
- Verlassen speichert
- Escape bricht ab
----------------------------------------
<!-- funktion -->
Projekt anlegen
<!-- regeln -->
- +-Icon
- Projekt wird direkt aufgerufen
<!-- testen -->
- RMB auf Sidebar
- Klick auf "Projekt erstellen"
- Namen im Modal eingeben
- Bestätigen mit LMB
- Projekt angelegt
<!-- funktion -->
Projekt aufrufen
<!-- testen -->
- LMB auf Projektname
- Features angezeigt
<!-- funktion -->
Projekt umbenennen
<!-- regeln -->
- Stift-Icon
<!-- testen -->
- RMB auf Projektname
- Klick auf "Projekt anpassen"
- Namen ändern
- Außerhalb klicken
- Name angepasst
<!-- funktion -->
Projekt entfernen
<!-- regeln -->
- x-Icon
<!-- testen -->
- RMB auf Projektname
- Klick auf "Projekt entfernen"
- Bestätigen im Modal
- Projekt entfernt

View File

@@ -0,0 +1,53 @@
<!-- titel -->
Vision festhalten
----------------------------------------
<!-- art -->
optional
----------------------------------------
<!-- ziel -->
Hält fest, wie es gedacht ist
----------------------------------------
<!-- regeln -->
- Höchstens eine je Projekt
- Goldener Rand
- Steht als erste Karte
- Nur Titel und ein Textfeld
- Text wird als Markdown gezeigt
- Keine Prüfung ändert sie
----------------------------------------
<!-- funktion -->
Anzeigemodus umschalten
<!-- ziel -->
Kompaktmodus zum Lesen, Vollmodus zum Anpassen
<!-- regeln -->
- Standard ist Kompaktmodus
- Kompakt zeigt nur die obersten Punkte
- Augen-Icon rechts oben
- Vollmodus geht über alle Spalten
<!-- testen -->
- MMB auf die Vision
- Modus umgeschaltet
<!-- funktion -->
Vision anlegen
<!-- testen -->
- RMB auf Hauptbereich
- Klick auf "Vision erstellen"
- Vision angelegt
<!-- funktion -->
Vision anpassen
<!-- regeln -->
- Anpassen nur im Vollmodus
- Verlassen speichert
- Escape verwirft
<!-- testen -->
- Vollmodus öffnen
- LMB auf den Text
- Text ändern
- Vision angepasst
<!-- funktion -->
Vision entfernen
<!-- testen -->
- RMB auf die Vision
- Klick auf "Vision entfernen"
- Bestätigen im Modal
- Vision entfernt

View File

@@ -0,0 +1,19 @@
<!-- titel -->
Vision
----------------------------------------
<!-- art -->
vision
----------------------------------------
<!-- ziel -->
- (Basis) Projekte und ihre Features manuell verwalten
- Mit Hilfe von KI-Chat Live Projekte entwickeln und Features erweitern
- Ich schreibe mit der KI und definiere meine Idee
- Die KI zeigt mir Live wie sich die Features ändern
- Ich verbessere und die KI passt Live an
- Wenn ich zufrieden bin, dann lasse ich die Features von der KI implementieren
- (später) Zu einem ausgewählten Projekt analysiert die KI alle kompakten Informationen dazu
- Ich wähle ein Verzeichnis das als Quelle dient
- Die Quelle wird durch ein System geschickt, dass kompakte Informationen extrahiert
- Die kompakten Informationen enthalten das Wissen zu dem WIE vom Projekt
- Also ich brauche die Funktionen und Regeln zum Projekt, nicht wie es Implementiert wird
- Es werden Features zum Projekt generiert, die es komplett abbilden

View File

@@ -1,172 +1,319 @@
{
"abdeckung": {
"bedienen:ablehnen": {
"abdruck": "61a0e2e5f8a4c439",
"funktion": "Vorschlag annehmen"
"abdruck": "e9cce25d92b81ff6",
"funktion": "Vorschlag annehmen",
"trug": "089e774256dcce89"
},
"bedienen:alleAblehnen": {
"abdruck": "9d613f6b111b9b67",
"funktion": "Alle Vorschläge verwerfen"
"abdruck": "ac9262c7cafe9537",
"funktion": "Alle Vorschläge verwerfen",
"trug": "6869d68fdbd6d0a7"
},
"bedienen:alleAnnehmen": {
"abdruck": "9456d726b83144c9",
"funktion": "Alle Vorschläge annehmen"
"abdruck": "94f23cae75fdc531",
"funktion": "Alle Vorschläge annehmen",
"trug": "94ebeec7b03abb70"
},
"bedienen:annehmen": {
"abdruck": "97dc5220725e77ee",
"funktion": "Vorschlag annehmen"
"abdruck": "2742ad031b3d3cca",
"funktion": "Vorschlag annehmen",
"trug": "089e774256dcce89"
},
"bedienen:auswaehlen": {
"abdruck": "31f34c41cbd1bd93",
"funktion": "Projekt aufrufen"
"abdruck": "d061bf62466085ce",
"funktion": "Projekt aufrufen",
"trug": "e24c2ab0a27ace24"
},
"bedienen:bereichsMenue": {
"abdruck": "421627feeb92867c",
"funktion": "Projekt aufrufen"
"abdruck": "4277536d43c7bcd5",
"funktion": "Projekt aufrufen",
"trug": "e24c2ab0a27ace24"
},
"bedienen:bestaetigen": {
"abdruck": "b1ce0152c68722c9",
"funktion": "Feature anlegen"
"abdruck": "db1f954b9ad01749",
"funktion": "Eingabe mit Enter bestätigen",
"trug": "43fca3b0e83b3701"
},
"bedienen:erledige": {
"abdruck": "1b80ae13958bb11a",
"funktion": "Vorgeschlagene Karte anlegen",
"trug": "de2b733c447db595"
},
"bedienen:funktionsMenue": {
"abdruck": "67bf62e64b2af11f",
"funktion": "Funktion entfernen"
"abdruck": "bacdd0a7cc9d0f92",
"funktion": "Funktion verschieben",
"trug": "6a33d1b7b5a7f28c"
},
"bedienen:karteAnnehmen": {
"abdruck": "bf348251763e402a",
"funktion": "Vorgeschlagene Karte anlegen",
"trug": "de2b733c447db595"
},
"bedienen:kartenMenue": {
"abdruck": "bc47fd3a97b2027c",
"funktion": "Feature entfernen"
"abdruck": "d3ba136a562eb1e9",
"funktion": "Feature entfernen",
"trug": "f486bf09c64ebb3a"
},
"bedienen:leeren": {
"abdruck": "f2af432a5ae3b255",
"funktion": "Gespräch verwerfen",
"trug": "1f848fba8b2a5e56"
},
"bedienen:leistenMenue": {
"abdruck": "90a66ccbe71ddc74",
"funktion": "Projekt anlegen"
"abdruck": "ed951fbeaaa9bc70",
"funktion": "Projekt anlegen",
"trug": "44b8a59e1dcb20d4"
},
"bedienen:oeffneChat": {
"abdruck": "9bf171761edca141",
"funktion": "Gespräch öffnen",
"trug": "c71610a339bb298e"
},
"bedienen:projektMenue": {
"abdruck": "58ca0dac4286c61d",
"funktion": "Projekt umbenennen"
"abdruck": "ea73f8c2597c0443",
"funktion": "Projekt umbenennen",
"trug": "40d6954a44fa3240"
},
"bedienen:schliesse": {
"abdruck": "f78739ce74d876f5",
"funktion": ""
"abdruck": "919b104c012c034d",
"funktion": "",
"trug": ""
},
"bedienen:schliessen": {
"abdruck": "1e12f9ae001e93e1",
"funktion": "Gespräch verwerfen",
"trug": "1f848fba8b2a5e56"
},
"bedienen:senden": {
"abdruck": "8df3402ed3373acc",
"funktion": "Nachricht senden",
"trug": "e61022551a98250f"
},
"bedienen:springe": {
"abdruck": "67b827c9bba0c05a",
"funktion": "Problemstelle anspringen"
"abdruck": "0b134efa50c03bff",
"funktion": "Problemstelle anspringen",
"trug": "7486526f6867c436"
},
"bedienen:starte": {
"abdruck": "06e7ff1e70efc603",
"funktion": "Titel anpassen"
"abdruck": "761c2f62c917a3db",
"funktion": "Titel anpassen",
"trug": "d0b7a430e96e2599"
},
"bedienen:startePruefung": {
"abdruck": "1f9ac6d1bb70cda8",
"funktion": "Stil prüfen"
"abdruck": "31c3fef23c6319d8",
"funktion": "Gespräch öffnen",
"trug": "c71610a339bb298e"
},
"bedienen:umbenennen": {
"abdruck": "af404032e5814872",
"funktion": "Projekt umbenennen"
"abdruck": "6185b6b39708bf02",
"funktion": "Projekt umbenennen",
"trug": "40d6954a44fa3240"
},
"bedienen:wechsleAnsicht": {
"abdruck": "ee50f2dbfa66f779",
"funktion": "Anzeigemodus umschalten"
"abdruck": "e3193fce50eaa58e",
"funktion": "Anzeigemodus umschalten",
"trug": "fccea553715951de"
},
"bedienen:wechsleArt": {
"abdruck": "3fcd27f68677ed3a",
"funktion": "Feature einstufen"
"abdruck": "67250a1e8d82e960",
"funktion": "Feature einstufen",
"trug": "90b6c77ff0c412e6"
},
"bedienen:wechsleDarkMode": {
"abdruck": "51e5efb1e9196f3b",
"funktion": "Darkmode umschalten"
"abdruck": "b83524eb0e12a7d7",
"funktion": "Darkmode umschalten",
"trug": "4033fc55c753db3e"
},
"lauscher:window.click": {
"abdruck": "5dd03db00120c133",
"funktion": "Kontextmenü schließen"
"bedienen:wechsleStand": {
"abdruck": "8c2e3bf3be58ec00",
"funktion": "Stand umschalten",
"trug": "37a3835d1d2a3e6c"
},
"lauscher:window.keydown": {
"abdruck": "70b3f36549535bfc",
"funktion": ""
"bedienen:zurueck": {
"abdruck": "e378014fbce96d10",
"funktion": "Schritt zurücknehmen",
"trug": "10e46c458040a5e3"
},
"hoeren:systemDunkel.change": {
"abdruck": "d3ef681b987557dc",
"funktion": "Darkmode umschalten",
"trug": "4033fc55c753db3e"
},
"hoeren:window.click": {
"abdruck": "620812522ed2d900",
"funktion": "Kontextmenü schließen",
"trug": "87216235bbe42a1a"
},
"hoeren:window.keydown": {
"abdruck": "c3e1df2d60fcc067",
"funktion": "Schritt zurücknehmen",
"trug": "10e46c458040a5e3"
},
"menue:+ Feature erstellen": {
"abdruck": "a9a3fefd653555c7",
"funktion": "Feature anlegen"
"abdruck": "82c40072137d5757",
"funktion": "Feature anlegen",
"trug": "df7a1452a32da410"
},
"menue:+ Funktion erstellen": {
"abdruck": "0f968068851c2f7a",
"funktion": "Feature entfernen"
"abdruck": "b44457d64a5ec9d1",
"funktion": "Feature entfernen",
"trug": "f486bf09c64ebb3a"
},
"menue:+ Projekt erstellen": {
"abdruck": "dbbe1573ebe97251",
"funktion": "Projekt entfernen"
"abdruck": "2be770390433a2ce",
"funktion": "Projekt anlegen",
"trug": "44b8a59e1dcb20d4"
},
"menue:+ Vision erstellen": {
"abdruck": "1d814205e510b035",
"funktion": "Feature anlegen"
"abdruck": "cb22a654070e58b4",
"funktion": "Feature anlegen",
"trug": "df7a1452a32da410"
},
"menue:→ Feature verschieben": {
"abdruck": "38e6b244668ee164",
"funktion": "Feature entfernen",
"trug": "f486bf09c64ebb3a"
},
"menue:▲ Nach oben": {
"abdruck": "4e6fd1617d817357",
"funktion": "Funktion verschieben",
"trug": "6a33d1b7b5a7f28c"
},
"menue:▼ Nach unten": {
"abdruck": "183651450e546c4f",
"funktion": "Funktion entfernen",
"trug": "885e16a93460f706"
},
"menue:◇ Quelle festlegen": {
"abdruck": "e4bb1781bc375d6d",
"funktion": "Projekt umbenennen",
"trug": "40d6954a44fa3240"
},
"menue:✎ Projekt anpassen": {
"abdruck": "cd7390c2f6852257",
"funktion": "Projekt umbenennen"
"abdruck": "ad505addca45b06c",
"funktion": "Projekt umbenennen",
"trug": "40d6954a44fa3240"
},
"menue:✕ Feature entfernen": {
"abdruck": "e773a996f84a8d7b",
"funktion": "Feature entfernen"
"abdruck": "bc968582260c45b9",
"funktion": "Funktion anlegen",
"trug": "78d0329cf6eacca9"
},
"menue:✕ Funktion entfernen": {
"abdruck": "99495f37aa040550",
"funktion": "Funktion entfernen"
"abdruck": "d29458b150c55777",
"funktion": "Funktion verschieben",
"trug": "6a33d1b7b5a7f28c"
},
"menue:✕ Projekt entfernen": {
"abdruck": "bc7b8c360ac3c403",
"funktion": "Projekt anlegen"
"abdruck": "aca25c0b5feaf752",
"funktion": "Projekt umbenennen",
"trug": "40d6954a44fa3240"
},
"menue:✕ Vision entfernen": {
"abdruck": "ec65c57f36ff14d0",
"funktion": "Anzeigemodus umschalten"
"abdruck": "88520b1f105d3fb5",
"funktion": "Anzeigemodus umschalten",
"trug": "fccea553715951de"
},
"route:delete /projekte/{name}": {
"abdruck": "9014a4b884cca27a",
"funktion": "Projekt entfernen"
"abdruck": "b4f871be35d10e5f",
"funktion": "Projekt entfernen",
"trug": "e91a89b8d78dbd2e"
},
"route:delete /projekte/{name}/features/{id}": {
"abdruck": "ff8d0773ef483606",
"funktion": "Feature entfernen"
"abdruck": "c1db81de98835c39",
"funktion": "Feature entfernen",
"trug": "f486bf09c64ebb3a"
},
"route:delete /projekte/{name}/pruefung": {
"abdruck": "79f2bdc0413ea88a",
"funktion": "Prüfung beenden"
"abdruck": "7a480f33ddf55165",
"funktion": "Prüfung beenden",
"trug": "83435eb3e1394e49"
},
"route:get /health": {
"abdruck": "3214361386c64911",
"funktion": ""
"abdruck": "65257319741edf35",
"funktion": "",
"trug": ""
},
"route:get /projekte": {
"abdruck": "2f6756caafbe76b8",
"funktion": ""
"abdruck": "276556054437c303",
"funktion": "",
"trug": ""
},
"route:get /projekte/{name}/chat": {
"abdruck": "fd2a22c36ea85545",
"funktion": "Gespräch öffnen",
"trug": "c71610a339bb298e"
},
"route:get /projekte/{name}/features": {
"abdruck": "509119bcecfd63e6",
"funktion": "Projekt aufrufen"
"abdruck": "122f93cbd0d07881",
"funktion": "Projekt aufrufen",
"trug": "e24c2ab0a27ace24"
},
"route:get /projekte/{name}/pruefung": {
"abdruck": "f7d46d8a5be26212",
"funktion": "Stil prüfen"
"abdruck": "e651ac90b7b2c520",
"funktion": "",
"trug": ""
},
"route:get /projekte/{name}/quelle": {
"abdruck": "834d3af3203ca3a8",
"funktion": "Quelle festlegen",
"trug": "b8b70dd0ff9817cb"
},
"route:get /projekte/{name}/verlauf": {
"abdruck": "5a3dcc678733fad8",
"funktion": "",
"trug": ""
},
"route:post /projekte": {
"abdruck": "c3e70befc5eb772b",
"funktion": "Projekt anlegen"
"abdruck": "fa1628d7e469885d",
"funktion": "Projekt anlegen",
"trug": "44b8a59e1dcb20d4"
},
"route:post /projekte/{name}/chat": {
"abdruck": "c3edc89cec5d2f6f",
"funktion": "Nachricht senden",
"trug": "e61022551a98250f"
},
"route:post /projekte/{name}/features": {
"abdruck": "df08920d8f5e5d4d",
"funktion": "Feature anlegen"
"abdruck": "00eb9c16560bac73",
"funktion": "Feature anlegen",
"trug": "df7a1452a32da410"
},
"route:post /projekte/{name}/pruefung": {
"abdruck": "9fb8d6c9260477c7",
"funktion": "Stil prüfen"
"abdruck": "6d7444a9dfad7d54",
"funktion": "Stil prüfen",
"trug": "d5019cdafd70efb7"
},
"route:post /projekte/{name}/pruefung/verworfen": {
"abdruck": "a43f7221e01c386f",
"funktion": "Alle Vorschläge verwerfen",
"trug": "6869d68fdbd6d0a7"
},
"route:post /projekte/{name}/verlauf/zurueck": {
"abdruck": "308fec6d21b01d60",
"funktion": "Schritt zurücknehmen",
"trug": "10e46c458040a5e3"
},
"route:put /projekte/{name}": {
"abdruck": "6030731add729040",
"funktion": "Projekt umbenennen"
"abdruck": "75383ac009961cad",
"funktion": "Projekt umbenennen",
"trug": "40d6954a44fa3240"
},
"route:put /projekte/{name}/features/{id}": {
"abdruck": "e95aea276bf795cd",
"funktion": ""
"abdruck": "b24c7000fd2ec94c",
"funktion": "",
"trug": ""
},
"route:put /projekte/{name}/features/{id}/projekt": {
"abdruck": "fafc7a8a1656f93b",
"funktion": "Feature verschieben",
"trug": "cd2cd705298831e0"
},
"route:put /projekte/{name}/quelle": {
"abdruck": "d342055e3163548a",
"funktion": "Quelle festlegen",
"trug": "b8b70dd0ff9817cb"
}
},
"belege": {
@@ -175,9 +322,14 @@
"beleg": "function wechsleDarkMode() {\n modus.value = MODI[(MODI.indexOf(modus.value) + 1) % MODI.length]\n localStorage.setItem('darkModus', modus.value)\n wendeAn()\n}",
"datei": "frontend/src/App.vue"
},
"[\"design\", \"Eingabe mit Enter bestätigen\"]": {
"abdruck": "3bace3e9c9f16023",
"beleg": "@keydown.enter.exact.prevent=\"senden\"",
"datei": "frontend/src/components/ChatPanel.vue"
},
"[\"design\", \"Kontextmenü schließen\"]": {
"abdruck": "519c5a56bf4b9810",
"beleg": "schliesseMenue()",
"abdruck": "671fa86bccb2c2c6",
"beleg": "export function schliesseMenue() {\n kontextMenue.value = null\n}",
"datei": "frontend/src/composables/kontextmenue.js"
},
"[\"features\", \"Anzeigemodus umschalten\"]": {
@@ -190,14 +342,24 @@
"beleg": "async function erstellen(titel) {",
"datei": "frontend/src/components/FeatureListe.vue"
},
"[\"features\", \"Feature durchsuchen\"]": {
"abdruck": "4f249c42d46d25b5",
"beleg": "function passt(f) {\n const wort = suche.value.trim().toLowerCase()\n if (!wort) return true\n const s = f.sektionen\n const text = [s.titel, s.ziel, s.regeln,\n ...s.funktionen.map(x => `${x.text} ${x.ziel} ${x.regeln} ${x.testen}`)]\n return text.join(' ').toLowerCase().includes(wort)\n}",
"datei": "frontend/src/components/FeatureListe.vue"
},
"[\"features\", \"Feature einstufen\"]": {
"abdruck": "de473e39c7232637",
"abdruck": "a0ee6590c24456bb",
"beleg": "function wechsleArt() {\n s.value.art = s.value.art === 'kern' ? 'optional' : 'kern'\n speichern()\n}",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"features\", \"Feature entfernen\"]": {
"abdruck": "c6f27381a41a63d7",
"beleg": "def loeschen(projekt: str, id: str):\n _datei(projekt, id).unlink()",
"beleg": "async function entfernen() {\n const id = modal.value.feature.id\n try {\n await featureLoeschen(props.projekt, id)\n features.value = features.value.filter(f => f.id !== id)\n modal.value = null\n emit('geaendert')\n } catch (e) {\n meldung.value = e.message\n }\n}",
"datei": "frontend/src/components/FeatureListe.vue"
},
"[\"features\", \"Feature verschieben\"]": {
"abdruck": "a82b97e3d4a1b533",
"beleg": "def verschieben(projekt: str, id: str, ziel: str) -> dict:",
"datei": "backend/features.py"
},
"[\"features\", \"Regeln anpassen\"]": {
@@ -222,7 +384,12 @@
},
"[\"funktionen\", \"Funktion entfernen\"]": {
"abdruck": "20e8d8e507ee6310",
"beleg": "{ text: '✕ Funktion entfernen', aktion: () => (modal.value = { art: 'entfernen', i }) },",
"beleg": "eintraege.push({ text: '✕ Funktion entfernen', aktion: () => (modal.value = { art: 'entfernen', i }) })",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"funktionen\", \"Funktion verschieben\"]": {
"abdruck": "8435119f0dd5b891",
"beleg": "async function schiebe(i, richtung) {",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"funktionen\", \"Regeln anpassen\"]": {
@@ -230,6 +397,11 @@
"beleg": "async function starte(feld, i, j) {\n if (!gross.value) return // Bearbeiten nur in der ausführlichen Ansicht\n const original = wert(feld, i, j)\n aktiv.value = { feld, i, j, original }\n entwurf.value = original\n await nextTick()\n const el = Array.isArray(feldRef.value) ? feldRef.value[0] : feldRef.value\n el?.focus()\n if (feld === 'titel') el?.select()\n}",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"funktionen\", \"Stand umschalten\"]": {
"abdruck": "b66ea5f488899d8f",
"beleg": "@click.stop=\"wechsleStand(i)\"",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"funktionen\", \"Testschritte anpassen\"]": {
"abdruck": "e303ebeaece423de",
"beleg": "<div v-else class=\"klickbar\" @click=\"starte('testen', i)\">",
@@ -245,6 +417,31 @@
"beleg": "<div v-else class=\"inhalt klickbar\" v-html=\"md(f.ziel)\" @click=\"starte('ziel', i)\" />",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"karten-besprechen\", \"Gespräch schließen\"]": {
"abdruck": "d6de2c46300fef26",
"beleg": "<button class=\"icon-knopf\" title=\"Gespräch schließen\" @click=\"emit('schliessen')\">✕</button>",
"datei": "frontend/src/components/ChatPanel.vue"
},
"[\"karten-besprechen\", \"Gespräch verwerfen\"]": {
"abdruck": "9e74be976a4d0e15",
"beleg": "@router.delete(\"/projekte/{name}/chat\")\nasync def chat_leeren(name: str):\n try:\n chat.leeren(name)\n except FileNotFoundError as e:\n raise HTTPException(404, str(e))\n return {\"ok\": True}",
"datei": "backend/routes.py"
},
"[\"karten-besprechen\", \"Gespräch öffnen\"]": {
"abdruck": "c84f9a14428a019e",
"beleg": "<button\n class=\"icon-knopf\"\n :class=\"{ an: chatOffen }\"\n title=\"Karten im Gespräch entwickeln\"\n @click=\"oeffneChat\"\n >✎</button>",
"datei": "frontend/src/App.vue"
},
"[\"karten-besprechen\", \"Nachricht senden\"]": {
"abdruck": "308218d682fe3dd9",
"beleg": "async def frage(projekt: str, text: str) -> dict:",
"datei": "backend/chat.py"
},
"[\"karten-besprechen\", \"Vorgeschlagene Karte anlegen\"]": {
"abdruck": "15aa862d2e0f6f6e",
"beleg": "async function karteAnnehmen(p) {",
"datei": "frontend/src/components/FeatureListe.vue"
},
"[\"karten-pruefen\", \"Alle Vorschläge annehmen\"]": {
"abdruck": "52fb2acd3d6945fa",
"beleg": "async function alleAnnehmen() {\n props.probleme.forEach(p => { if (anwenden(p)) erledige(p) })\n await speichern()\n}",
@@ -252,7 +449,7 @@
},
"[\"karten-pruefen\", \"Alle Vorschläge verwerfen\"]": {
"abdruck": "f98fd3fc005b9e56",
"beleg": "function alleAblehnen() {\n props.probleme.forEach(erledige)\n}",
"beleg": "<button\n class=\"icon-knopf rot\"\n :title=\"`Alle ${probleme.length} Vorschläge verwerfen`\"\n @click=\"alleAblehnen\"\n >✕</button>",
"datei": "frontend/src/components/FeatureKarte.vue"
},
"[\"karten-pruefen\", \"Code in Features prüfen\"]": {
@@ -265,6 +462,11 @@
"beleg": "ANKLAGE_AB = 4",
"datei": "backend/inhalt.py"
},
"[\"karten-pruefen\", \"Funktion abnehmen\"]": {
"abdruck": "21095461d6190dec",
"beleg": "if beleg:\n stand[\"belege\"][schluessel] = beleg\n if x.get(\"stand\") == parser.OFFEN:\n # Abnahme: die Karte hat es bestellt, jetzt steht es im Code\n return {\"feature\": feature[\"id\"], \"titel\": x[\"text\"], \"art\": \"gebaut\",\n \"grund\": f'{beleg[\"datei\"]}: {beleg[\"beleg\"].strip()}'}",
"datei": "backend/inhalt.py"
},
"[\"karten-pruefen\", \"Problemstelle anspringen\"]": {
"abdruck": "340a32321fd23834",
"beleg": "karte.classList.add('gesucht')",
@@ -307,9 +509,24 @@
},
"[\"projekte\", \"Projekt umbenennen\"]": {
"abdruck": "d4e71f8ef907393c",
"beleg": "function projektMenue(e, name) {\n oeffneMenue(e, [\n { text: '✎ Projekt anpassen', aktion: () => starteUmbenennen(name) },\n { text: '✕ Projekt entfernen', aktion: () => oeffneModal({ art: 'entfernen', name }) },\n ])\n}",
"beleg": "function projektMenue(e, name) {\n oeffneMenue(e, [\n { text: '✎ Projekt anpassen', aktion: () => starteUmbenennen(name) },\n { text: '◇ Quelle festlegen', aktion: () => starteQuelle(name) },\n { text: '✕ Projekt entfernen', aktion: () => oeffneModal({ art: 'entfernen', name }) },\n ])\n}",
"datei": "frontend/src/components/SeitenLeiste.vue"
},
"[\"projekte\", \"Quelle festlegen\"]": {
"abdruck": "fc6c20f4e8d74fa6",
"beleg": "if ziel == Path(ziel.anchor) or ziel == Path.home():",
"datei": "backend/quelle.py"
},
"[\"schritt-zuruecknehmen\", \"Nächsten Rückschritt anzeigen\"]": {
"abdruck": "6768d8a0b83537a2",
"beleg": "letzterSchritt.value = (await fetchVerlauf(aktivesProjekt.value)).letzter",
"datei": "frontend/src/App.vue"
},
"[\"schritt-zuruecknehmen\", \"Schritt zurücknehmen\"]": {
"abdruck": "c49332e7a679dfda",
"beleg": "def zurueck(projekt: str) -> str:\n \"\"\"Den letzten Schritt zurücknehmen. Gibt zurück, was zurückgenommen wurde.\"\"\"\n schritte = lade(projekt)\n if not schritte:\n raise ValueError(\"Nichts zum Zurücknehmen\")\n schritt = schritte.pop()",
"datei": "backend/verlauf.py"
},
"[\"vision-festhalten\", \"Anzeigemodus umschalten\"]": {
"abdruck": "b983b82c02343560",
"beleg": "const gross = ref(false)",
@@ -332,24 +549,69 @@
}
},
"ohne_code": {},
"ohne_karte": {},
"ohne_karte": {
"route:delete /projekte/{name}/chat": {
"abdruck": "4ba7a240985a83b4",
"beleg": "backend/routes.py:182",
"feature": "karten-besprechen",
"karten": "41f55589fcff4959",
"stelle": "route:delete /projekte/{name}/chat",
"titel": "Chatverlauf leeren"
}
},
"paare": {
"[\"[\\\"features\\\", \\\"Anzeigemodus umschalten\\\"]\", \"[\\\"vision-festhalten\\\", \\\"Anzeigemodus umschalten\\\"]\"]": {
"abdruck": "d23706be97d6369a",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Feature anlegen\\\"]\", \"[\\\"features\\\", \\\"Feature entfernen\\\"]\"]": {
"abdruck": "586059671bbfa75b",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Feature anlegen\\\"]\", \"[\\\"funktionen\\\", \\\"Funktion anlegen\\\"]\"]": {
"abdruck": "3eb9956887005cc4",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Feature anlegen\\\"]\", \"[\\\"projekte\\\", \\\"Projekt anlegen\\\"]\"]": {
"abdruck": "66a7175c58b703c4",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Feature entfernen\\\"]\", \"[\\\"funktionen\\\", \\\"Funktion anlegen\\\"]\"]": {
"abdruck": "97a9dde3e968b1eb",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Feature entfernen\\\"]\", \"[\\\"funktionen\\\", \\\"Funktion entfernen\\\"]\"]": {
"abdruck": "9717a5c6eab69f22",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Feature entfernen\\\"]\", \"[\\\"projekte\\\", \\\"Projekt entfernen\\\"]\"]": {
"abdruck": "65c43ee10d0d8b4a",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Feature entfernen\\\"]\", \"[\\\"vision-festhalten\\\", \\\"Vision entfernen\\\"]\"]": {
"abdruck": "60434d422bbd2ca3",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Regeln anpassen\\\"]\", \"[\\\"features\\\", \\\"Titel anpassen\\\"]\"]": {
"abdruck": "75e90ff6d5453c2d",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Regeln anpassen\\\"]\", \"[\\\"features\\\", \\\"Ziel anpassen\\\"]\"]": {
"abdruck": "a9e849a044a7ee41",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Regeln anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Regeln anpassen\\\"]\"]": {
"abdruck": "827215ea68dcbada",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Regeln anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Titel anpassen\\\"]\"]": {
"abdruck": "ea7185c230fbdd2f",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Regeln anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Ziel anpassen\\\"]\"]": {
"abdruck": "bc79858745a7d262",
"gleich": false
},
"[\"[\\\"features\\\", \\\"Titel anpassen\\\"]\", \"[\\\"features\\\", \\\"Ziel anpassen\\\"]\"]": {
"abdruck": "69360dc1502aa01f",
"gleich": false
@@ -370,6 +632,10 @@
"abdruck": "5e97e3c6fe9df287",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Funktion anlegen\\\"]\", \"[\\\"funktionen\\\", \\\"Funktion entfernen\\\"]\"]": {
"abdruck": "3e58148f974b6b34",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Funktion anlegen\\\"]\", \"[\\\"projekte\\\", \\\"Projekt anlegen\\\"]\"]": {
"abdruck": "202f51c53a73b452",
"gleich": false
@@ -382,9 +648,281 @@
"abdruck": "4090ee6826466fa3",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Regeln anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Titel anpassen\\\"]\"]": {
"abdruck": "c8321ad2b769d77f",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Regeln anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Ziel anpassen\\\"]\"]": {
"abdruck": "7ce003da82080259",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Regeln anpassen\\\"]\", \"[\\\"karten-pruefen\\\", \\\"Funktion abnehmen\\\"]\"]": {
"abdruck": "d2f80684e1be6287",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Testschritte anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Titel anpassen\\\"]\"]": {
"abdruck": "7a51922f327ba28b",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Testschritte anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Ziel anpassen\\\"]\"]": {
"abdruck": "97a70c7ecfbb9f30",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Titel anpassen\\\"]\", \"[\\\"funktionen\\\", \\\"Ziel anpassen\\\"]\"]": {
"abdruck": "17b00db94f54b62d",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Titel anpassen\\\"]\", \"[\\\"vision-festhalten\\\", \\\"Vision anpassen\\\"]\"]": {
"abdruck": "d17a7b7bad8d947a",
"gleich": false
},
"[\"[\\\"funktionen\\\", \\\"Ziel anpassen\\\"]\", \"[\\\"vision-festhalten\\\", \\\"Vision anpassen\\\"]\"]": {
"abdruck": "e25b21ca4183d372",
"gleich": false
},
"[\"[\\\"karten-pruefen\\\", \\\"Alle Vorschläge annehmen\\\"]\", \"[\\\"karten-pruefen\\\", \\\"Alle Vorschläge verwerfen\\\"]\"]": {
"abdruck": "b9c707879cffb7cd",
"gleich": false
},
"[\"[\\\"karten-pruefen\\\", \\\"Alle Vorschläge verwerfen\\\"]\", \"[\\\"karten-pruefen\\\", \\\"Vorschlag verwerfen\\\"]\"]": {
"abdruck": "aed348a776637c4a",
"gleich": false
},
"[\"[\\\"projekte\\\", \\\"Projekt anlegen\\\"]\", \"[\\\"projekte\\\", \\\"Projekt entfernen\\\"]\"]": {
"abdruck": "957ebec8e3096ce6",
"gleich": false
},
"[\"[\\\"projekte\\\", \\\"Projekt entfernen\\\"]\", \"[\\\"vision-festhalten\\\", \\\"Vision entfernen\\\"]\"]": {
"abdruck": "8757fb8b0f89d5a6",
"gleich": false
}
},
"stil": {
"[\"darkmode\", \"\"]": {
"abdruck": "a5b0fd59f25c55ae",
"probleme": []
},
"[\"darkmode\", \"Darkmode umschalten\"]": {
"abdruck": "0dbcca6954cc4d16",
"probleme": []
},
"[\"design\", \"\"]": {
"abdruck": "1ae7985ebcfe6c6a",
"probleme": []
},
"[\"design\", \"Eingabe mit Enter bestätigen\"]": {
"abdruck": "b961f168017fb01e",
"probleme": []
},
"[\"design\", \"Kontextmenü schließen\"]": {
"abdruck": "a3717ea52a012784",
"probleme": []
},
"[\"features\", \"\"]": {
"abdruck": "b4f6fe4cd065e9e9",
"probleme": []
},
"[\"features\", \"Anzeigemodus umschalten\"]": {
"abdruck": "8d468a73bcec5521",
"probleme": []
},
"[\"features\", \"Feature anlegen\"]": {
"abdruck": "7d4d6e36b4f03318",
"probleme": []
},
"[\"features\", \"Feature durchsuchen\"]": {
"abdruck": "3acde68ab76b942c",
"probleme": []
},
"[\"features\", \"Feature einstufen\"]": {
"abdruck": "10e74d934dafacc9",
"probleme": []
},
"[\"features\", \"Feature entfernen\"]": {
"abdruck": "509a1153b2e6382f",
"probleme": []
},
"[\"features\", \"Feature verschieben\"]": {
"abdruck": "5169bc85a796b6a9",
"probleme": []
},
"[\"features\", \"Regeln anpassen\"]": {
"abdruck": "6b4eeed76c631333",
"probleme": []
},
"[\"features\", \"Titel anpassen\"]": {
"abdruck": "de6e2788e24aa230",
"probleme": []
},
"[\"features\", \"Ziel anpassen\"]": {
"abdruck": "f26e4426663b8265",
"probleme": []
},
"[\"funktionen\", \"\"]": {
"abdruck": "adcc38efdb393cf6",
"probleme": []
},
"[\"funktionen\", \"Funktion anlegen\"]": {
"abdruck": "11c59974712619a0",
"probleme": []
},
"[\"funktionen\", \"Funktion entfernen\"]": {
"abdruck": "e55d43e078f1020e",
"probleme": []
},
"[\"funktionen\", \"Funktion verschieben\"]": {
"abdruck": "1bdf3be9b53fdb99",
"probleme": []
},
"[\"funktionen\", \"Regeln anpassen\"]": {
"abdruck": "e354caf2701ee79c",
"probleme": []
},
"[\"funktionen\", \"Stand umschalten\"]": {
"abdruck": "f39b25d34cc6e4c4",
"probleme": []
},
"[\"funktionen\", \"Testschritte anpassen\"]": {
"abdruck": "8fb282300c19c3c2",
"probleme": []
},
"[\"funktionen\", \"Titel anpassen\"]": {
"abdruck": "63e9a78a02d890fe",
"probleme": []
},
"[\"funktionen\", \"Ziel anpassen\"]": {
"abdruck": "a72ce3656c787475",
"probleme": []
},
"[\"karten-besprechen\", \"\"]": {
"abdruck": "8d330c5a71e25e0c",
"probleme": []
},
"[\"karten-besprechen\", \"Gespräch schließen\"]": {
"abdruck": "d1c043cd26a05d69",
"probleme": []
},
"[\"karten-besprechen\", \"Gespräch verwerfen\"]": {
"abdruck": "e6d601409eb48f7a",
"probleme": []
},
"[\"karten-besprechen\", \"Gespräch öffnen\"]": {
"abdruck": "b9a3f8340aa9e266",
"probleme": []
},
"[\"karten-besprechen\", \"Nachricht senden\"]": {
"abdruck": "c3ec1453a9aff541",
"probleme": []
},
"[\"karten-besprechen\", \"Vorgeschlagene Karte anlegen\"]": {
"abdruck": "ca0a5b02f10bbd1e",
"probleme": []
},
"[\"karten-pruefen\", \"\"]": {
"abdruck": "43f92e591142fa95",
"probleme": []
},
"[\"karten-pruefen\", \"Alle Vorschläge annehmen\"]": {
"abdruck": "5afe1e8ec40d8b82",
"probleme": []
},
"[\"karten-pruefen\", \"Alle Vorschläge verwerfen\"]": {
"abdruck": "c44bbe11908637e9",
"probleme": []
},
"[\"karten-pruefen\", \"Code in Features prüfen\"]": {
"abdruck": "ed5da2461b99ddf3",
"probleme": []
},
"[\"karten-pruefen\", \"Features im Code prüfen\"]": {
"abdruck": "c31fcfa6dbc75232",
"probleme": []
},
"[\"karten-pruefen\", \"Funktion abnehmen\"]": {
"abdruck": "dd3cf177204bcf25",
"probleme": []
},
"[\"karten-pruefen\", \"Problemstelle anspringen\"]": {
"abdruck": "0656bbf0d6554c85",
"probleme": []
},
"[\"karten-pruefen\", \"Prüfung beenden\"]": {
"abdruck": "af40481c06d2fd97",
"probleme": []
},
"[\"karten-pruefen\", \"Stil prüfen\"]": {
"abdruck": "8326e792e8383b53",
"probleme": []
},
"[\"karten-pruefen\", \"Vorschlag annehmen\"]": {
"abdruck": "6f8d17b80787b7aa",
"probleme": []
},
"[\"karten-pruefen\", \"Vorschlag verwerfen\"]": {
"abdruck": "cf5bda968428df9f",
"probleme": []
},
"[\"projekte\", \"\"]": {
"abdruck": "a59f6fdfa58188fa",
"probleme": []
},
"[\"projekte\", \"Projekt anlegen\"]": {
"abdruck": "2c3ab4452996ffaf",
"probleme": []
},
"[\"projekte\", \"Projekt aufrufen\"]": {
"abdruck": "2ca7a3ea9e79fc6e",
"probleme": []
},
"[\"projekte\", \"Projekt entfernen\"]": {
"abdruck": "a0c52ceb9605a805",
"probleme": []
},
"[\"projekte\", \"Projekt umbenennen\"]": {
"abdruck": "d41292ff010e7fd3",
"probleme": []
},
"[\"projekte\", \"Quelle festlegen\"]": {
"abdruck": "990ee354f1aa70fa",
"probleme": []
},
"[\"schritt-zuruecknehmen\", \"\"]": {
"abdruck": "f4ecff18e05ff058",
"probleme": []
},
"[\"schritt-zuruecknehmen\", \"Nächsten Rückschritt anzeigen\"]": {
"abdruck": "2d944c3424b6f851",
"probleme": []
},
"[\"schritt-zuruecknehmen\", \"Schritt zurücknehmen\"]": {
"abdruck": "28825333acb1e107",
"probleme": []
},
"[\"vision-festhalten\", \"\"]": {
"abdruck": "e83e9ad5470aa4b1",
"probleme": []
},
"[\"vision-festhalten\", \"Anzeigemodus umschalten\"]": {
"abdruck": "87c494e1e1b0a7b2",
"probleme": []
},
"[\"vision-festhalten\", \"Vision anlegen\"]": {
"abdruck": "7826b26956ba51d2",
"probleme": []
},
"[\"vision-festhalten\", \"Vision anpassen\"]": {
"abdruck": "378ea30c154f7994",
"probleme": []
},
"[\"vision-festhalten\", \"Vision entfernen\"]": {
"abdruck": "340343e51583e86a",
"probleme": []
}
},
"verworfen": {
"route:delete /projekte/{name}/chat": {
"abdruck": "4ba7a240985a83b4",
"titel": "Gespräch schließen\nChatverlauf leeren"
}
}
}

View File

@@ -19,5 +19,5 @@ Darkmode umschalten
- Tag-Icon: ☀
- Auto-Icon: A
<!-- testen -->
- LMB auf Sidebar-Icon
- LMB auf Icon in der Kopfzeile
- Modus gewechselt

View File

@@ -19,11 +19,24 @@ Hält die Oberfläche lesbar und ruhig
- Escape schließt das Modal
----------------------------------------
<!-- funktion -->
Eingabe mit Enter bestätigen
<!-- ziel -->
Spart den Weg zum Knopf
<!-- regeln -->
- Gilt in einzeiligen Feldern
- Escape verwirft stattdessen
<!-- testen -->
- Modal öffnen
- Text eingeben
- Enter drücken
- Eingabe übernommen
<!-- funktion -->
Kontextmenü schließen
<!-- ziel -->
Räumt ein offenes Menü aus dem Weg
<!-- regeln -->
- Klick daneben schließt es
- Escape schließt es
- Ein neues Menü verdrängt das alte
<!-- testen -->
- RMB auf eine Karte

View File

@@ -50,9 +50,19 @@ Trennt tragende von verzichtbaren Features
- Badge zeigt die Einstufung
<!-- testen -->
- Vollmodus öffnen
- LMB auf Badge klicken
- LMB auf Badge
- Einstufung gewechselt
<!-- funktion -->
Feature durchsuchen
<!-- ziel -->
Findet die Karte, ohne alle zu lesen
<!-- regeln -->
- Sucht in allen Feldern
- Zählt Ausgeblendete mit
<!-- testen -->
- Suchwort eingeben
- Nur passende Karten bleiben
<!-- funktion -->
Feature entfernen
<!-- regeln -->
- x-Icon
@@ -62,6 +72,19 @@ Feature entfernen
- Bestätigen im Modal
- Feature entfernt
<!-- funktion -->
Feature verschieben
<!-- ziel -->
Hängt ein Feature in ein anderes Projekt um
<!-- regeln -->
- Datei wandert
- Datei wird nicht kopiert
- Nur bei mehreren Projekten
<!-- testen -->
- RMB auf Featurecard
- Klick auf "Feature verschieben"
- Zielprojekt wählen
- Feature verschoben
<!-- funktion -->
Regeln anpassen
<!-- testen -->
- Vollmodus öffnen

View File

@@ -9,7 +9,9 @@ Zerlegt ein Feature in prüfbare Stücke
----------------------------------------
<!-- regeln -->
- Gehört zu genau einem Feature
- Alphabetisch sortiert
- Offen heißt bestellt, nicht gebaut
- Neue Funktionen von Hand gelten als gebaut
- Reihenfolge frei wählbar
- Ziel bleibt freiwillig
- Regeln bleiben freiwillig
- Testen bleibt freiwillig
@@ -39,6 +41,30 @@ Funktion entfernen
- Bestätigen im Modal
- Funktion entfernt
<!-- funktion -->
Stand umschalten
<!-- ziel -->
Trennt Bestelltes von Gebautem
<!-- regeln -->
- Marke rechts vom Titel
- Offen ist gelb
- Gebaut ist ein Haken
- Kompakt erscheint nur die offene Marke
<!-- testen -->
- Vollmodus öffnen
- LMB auf die Marke
- Stand gewechselt
<!-- funktion -->
Funktion verschieben
<!-- ziel -->
Bringt die Schritte in ihre natürliche Folge
<!-- regeln -->
- Reihenfolge steht in der Datei
<!-- testen -->
- Vollmodus öffnen
- RMB auf Funktion
- Klick auf "Nach oben"
- Funktion verschoben
<!-- funktion -->
Titel anpassen
<!-- testen -->
- Vollmodus öffnen

BIN
daten/Planer/k1-1024.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
daten/Planer/k1-1280.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
daten/Planer/k1-1600.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

BIN
daten/Planer/k1-390.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
daten/Planer/k1-640.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
daten/Planer/k1-820.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -0,0 +1,61 @@
<!-- titel -->
Karten besprechen
----------------------------------------
<!-- art -->
optional
----------------------------------------
<!-- ziel -->
Entwickelt Karten im Gespräch mit der KI
----------------------------------------
<!-- regeln -->
- Die KI schreibt nie selbst in eine Karte
- Sie beschreibt den Sollzustand
- Was sich ändert, rechnet der Code aus
- Vorschläge sehen aus wie bei der Prüfung
- Neue Funktionen gelten als offen
- Das Gespräch überlebt den Neustart
- Die letzten 30 Wortmeldungen bleiben
- Gespräch und Prüfung teilen eine Spalte
----------------------------------------
<!-- funktion -->
Gespräch öffnen
<!-- regeln -->
- Stift-Icon in der Kopfzeile
- Icon leuchtet bei offenem Gespräch
<!-- testen -->
- LMB auf Stift-Icon
- Gespräch geöffnet
<!-- funktion -->
Nachricht senden
<!-- ziel -->
Sagt der KI, was das Projekt können soll
<!-- regeln -->
- Enter sendet
- Eigene Zeile erscheint sofort
- Text bleibt bei einem Fehler stehen
<!-- testen -->
- Text eingeben
- Enter drücken
- Antwort und Vorschläge erscheinen
<!-- funktion -->
Vorgeschlagene Karte anlegen
<!-- ziel -->
Macht aus einem Umriss eine echte Karte
<!-- regeln -->
- Gestrichelter Rand vor dem Annehmen
<!-- testen -->
- LMB auf Haken am Umriss
- Karte angelegt
<!-- funktion -->
Gespräch verwerfen
<!-- regeln -->
- Löscht nur das Gespräch
- Karten bleiben unberührt
<!-- testen -->
- LMB auf Papierkorb-Icon
- Gespräch geleert
<!-- funktion -->
Gespräch schließen
<!-- testen -->
- LMB auf x-Icon
- Spalte wieder frei

View File

@@ -35,26 +35,6 @@ Alle Vorschläge verwerfen
- LMB auf x-Icon der Karte
- Alle Vorschläge verworfen
<!-- funktion -->
Code in Features prüfen
<!-- ziel -->
Findet Bedienstellen ohne Funktion auf einer Karte
<!-- regeln -->
- Bedienstellen kommen aus dem Code
- Fünf von sechs Stimmen entscheiden
<!-- testen -->
- LMB auf Aufwärts-Icon
- Fehlende Funktionen gelistet
<!-- funktion -->
Features im Code prüfen
<!-- ziel -->
Findet Funktionen ohne Entsprechung im Code
<!-- regeln -->
- Sechs Stimmen suchen den Beleg
- Ein Fund genügt zum Freispruch
<!-- testen -->
- LMB auf Abwärts-Icon
- Funktionen ohne Code gelistet
<!-- funktion -->
Problemstelle anspringen
<!-- ziel -->
Führt vom Panel-Eintrag zur betroffenen Karte
@@ -77,7 +57,7 @@ Stil prüfen
<!-- ziel -->
Prüft die Form gegen den Katalog
<!-- regeln -->
- Prüf-Icon in der Sidebar
- Prüf-Icon in der Kopfzeile
- Wortzahl und Satzzeichen misst der Code
<!-- testen -->
- LMB auf Prüf-Icon

BIN
daten/Planer/komfort.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
daten/Planer/offen.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -11,7 +11,7 @@ vision
- Die KI zeigt mir Live wie sich die Features ändern
- Ich verbessere und die KI passt Live an
- Wenn ich zufrieden bin, dann lasse ich die Features von der KI implementieren
- Zu einem ausgewählten Projekt analysiert die KI alle kompakten Informationen dazu
- (später) Zu einem ausgewählten Projekt analysiert die KI alle kompakten Informationen dazu
- Ich wähle ein Verzeichnis das als Quelle dient
- Die Quelle wird durch ein System geschickt, dass kompakte Informationen extrahiert
- Die kompakten Informationen enthalten das Wissen zu dem WIE vom Projekt

2735
daten/RAG/.pruefung.json Normal file

File diff suppressed because it is too large Load Diff

93
daten/RAG/admin.md Normal file
View File

@@ -0,0 +1,93 @@
<!-- titel -->
Admin
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Bietet Zugriff auf Enterprise-Betriebsdaten und Systemüberwachung für Administratoren
----------------------------------------
<!-- regeln -->
- POST-Operationen erfordern gültiges CSRF-Token
- Wiederherstellung erfordert ROLE_SUPER_ADMIN
- Ergebnis jeder Operation als Flash-Meldung
- Backup-Download erfordert ROLE_SUPER_ADMIN
----------------------------------------
<!-- funktion -->
Betrieb einsehen
<!-- ziel -->
Verschafft Admins einen Überblick über den Betriebszustand aller Systeme
<!-- regeln -->
- Backup- und Restore-Bereitschaft zeigt Status
- Sicherheit und Datenschutz zeigt Bereitschaft
- Deployment-Scheduler zeigt Bereitschaft
- Backup-Übersicht zeigt vorhandene Sicherungen
- Operator-Prüfprotokoll zeigt letzte 8 Prüfungen
- Übersicht kombiniert alle Berichte
<!-- testen -->
- Admin-Dashboard öffnen
- Backup- und Restore-Bereitschaft anzeigen
- Sicherheit und Datenschutz anzeigen
- Deployment-Scheduler anzeigen
- Backup-Übersicht mit vorhandenen Sicherungen
- Operator-Prüfprotokoll mit letzten 8 Einträgen
- Kombinierte Übersicht aller Berichte
----------------------------------------
<!-- funktion -->
Dashboard anzeigen
<!-- ziel -->
Zeigt Systemzustand und Konfiguration im Admin-Bereich
<!-- regeln -->
- Rendered admin dashboard index html twig
- Enthält Chunk-Zähler und Chunk-Limit
- Enthält Vektor- und Tag-Gesundheitsdaten
- Enthält Reset-Konfiguration
<!-- testen -->
- Admin-Dashboard aufrufen
- HTTP 200 zurückerhalten
- admin-dashboard-index-html-twigt Template prüfen
- Chunk-Zähler im Response vorhanden
- Vektor-Gesundheitsdaten im Response vorhanden
----------------------------------------
<!-- funktion -->
Logout einleiten
<!-- ziel -->
Beendet die aktive Adminsession sicher
<!-- regeln -->
- GET oder POST an Admin-Logout startet Logout
- Wird vom Framework-Sicherheitssystem abgefangen
- Leere Methoden-Signatur
- Löscht Session und Authentifizierungsdaten
<!-- testen -->
- Klick auf Logout-Button im Admin
- Weiterleitung zur Login-Seite
- Session beendet
----------------------------------------
<!-- funktion -->
Wiederherstellung testen
<!-- ziel -->
Prueft ob ein Backup sich vollständig wiederherstellen laesst
<!-- regeln -->
- Benoetigt ROLE_SUPER_ADMIN
- POST-Request mit CSRF-Token
- Prueft angegebene Backup-ID gegen Muster retriex-backup-YYYYMMDD-HHMMSS
- Trockenlauf ohne tatsaechliche Wiederherstellung
- Ergebnis als Flash-Meldung nach Startseite
<!-- testen -->
- Admin-Enterprise-Seite aufrufen
- Dry-Run-Wiederherstellung mit gueltigem CSRF-Token absenden
- Rueckleitung auf Admin-Enterprise mit Flash-Meldung pruefen
- Flash-Meldung zeigt Warnungen und Fehler oder Erfolg
----------------------------------------
<!-- funktion -->
Zum Dashboard weiterleiten
<!-- ziel -->
Leitet admin und admin- auf das Dashboard um
<!-- regeln -->
- Admin leitet zum Dashboard um
- Verhindert doppelten Inhalt
<!-- testen -->
- admin aufrufen
- Weiterleitung zu dashboard prüfen
- admin-Abschluss aufrufen
- Weiterleitung zu dashboard prüfen

286
daten/RAG/agenten.md Normal file
View File

@@ -0,0 +1,286 @@
<!-- titel -->
Agenten
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Steuert Agentenaktivitaet und prueft deren Komponenten automatisiert
----------------------------------------
<!-- regeln -->
- JSON-Ausgabe bei gesetztem --json Flag
- Self-TestsFuehrenKeineMCPTransportAufrufeAus
- AgentenaktivitaetSeiteAusQueryParameterPage
- LimitZwischen1Und200Standardmaessig50
- StreamingGibtJedesTokenSofortAus
- Inspector liefert paths, meta und ndjson
- paths zeigen konfigurierte Agentenlogikdateien
- meta enthält Statistiken zur Agentenaktivität
- ndjson enthält paginierte Aktivitätseinträge
----------------------------------------
<!-- funktion -->
Agentenaktivität anzeigen
<!-- ziel -->
Zeigt eine liste der agentenaktivitäten
<!-- regeln -->
- Seite aus Query-Parameter page
- Limit zwischen 1 und 200
- Standardlimit 50
<!-- testen -->
- Admin-System-Agent abrufen
- Antwort ist 200
- Debug-Count zeigt Itemanzahl
----------------------------------------
<!-- funktion -->
Chat-Auswahl-Guard testen
<!-- ziel -->
Validiert dass der Chat-Auswahl-Guard korrekt funktioniert
<!-- regeln -->
- Command mto:agent:knowledge-space:chat-selection-guard-self-test
- json gibt strukturierte Daten aus
- Exit-Code 0 bei Status OK, sonst 1
<!-- testen -->
- Command mit --json Flag ausführen
- JSON mit status summary cases enthält
- Exit-Code entspricht Status
----------------------------------------
<!-- funktion -->
Fähigkeiten ermitteln
<!-- ziel -->
Listet verfügbare Resources, Tools und Prompts eines Admin-MCP-Servers auf
<!-- regeln -->
- Benötigt gespeicherten Admin-MCP-Server
- read liest Resource-URIs metadaten
- json maschinelles Format
- Status ready bei erfolgreicher Erkennung
- Runtime-Calls gezählt
<!-- testen -->
- Befehl mit gespeichertem Servernamen ausführen
- Ausgabe auf Status ready prüfen
- Resources, Tools und Prompts in Ausgabe
----------------------------------------
<!-- funktion -->
Hybrid-Tool-Auswahl testen
<!-- ziel -->
Stellt sicher, dass LLM-Vorschlag und RetrieX-Validierung bei der Tool-Auswahl zusammenarbeiten
<!-- regeln -->
- Planner besteht eigenen Self-Test
- AgentRunner nutzt LLM für Vorschlag vor RetrieX-Validierung
- Loader zeigt Status beim Tool-Auswählen
- Model-Config enthält dediziertes mcp_tool_selection-Modell
<!-- testen -->
- mto:agent:mcp:hybrid-tool-selection-planner-self-test --json ausführen
- JSON-Ausgabe auf status OK prüfen
- Alle vier Cases mit Status PASS vorhanden
----------------------------------------
<!-- funktion -->
MCP-Gateway trocken ausführen
<!-- ziel -->
Prüft ob eine Resource die Gateway-Policy erfüllt und welches Evidence erzeugt wird
<!-- regeln -->
- Kein MCP-Transport wird geöffnet
- fixture nutzt eingebaute Testdaten
- Exit-Code 0 bei Status ready
- json gibt Ergebnis als JSON aus
<!-- testen -->
- bin console mto agent mcp gateway-dry-run --fixture ausführen
- Ausgabe zeigt status ready
----------------------------------------
<!-- funktion -->
MCP-Laufzeit-Gate prüfen
<!-- ziel -->
Prüft ob ein MCP-Read-Only-Zugriff erlaubt ist, ohne Transport zu öffnen
<!-- regeln -->
- Gate ohne Transport öffnen
- fixture nutzt eingebaute Testdaten
- assume-enabled simuliert aktivierte MCP-Konfiguration
- JSON-Ausgabe verfügbar
<!-- testen -->
- Console-Befehl mit --json ausführen
- Exit-Code auf SUCCESS prüfen
- JSON auf Status ready und Fehler prüfen
----------------------------------------
<!-- funktion -->
MCP-Laufzeitgrenze testen
<!-- ziel -->
Validiert, dass MCP-Server nur Admin-gesteuert und begrenzt in der Antwort-Runtime verwendet werden
<!-- regeln -->
- McpDataRoomStore nur in Admin, CLI, ReadModels referenziert
- Keine externen MCP-Abrufe in Runtime-Boundary
- Keine Chat-, Retrieval- oder Evidence-Beruehrung
- Tool-Nachweise unterscheiden sichtbare Tool-Ausfuehrung
- Tool-first-Inhalts-Fallback bleibt im Statusprotokoll sichtbar
- Live-Inhalts-Fallback buendelt MCP-JSON-RPC-Resource-Reads
<!-- testen -->
- Rueckgabewert pruefen: Exitcode 0 bestaetigt OK
- Rueckgabewert pruefen: Exitcode 1 bestaetigt FAIL
----------------------------------------
<!-- funktion -->
MCP-Quelle prüfen
<!-- ziel -->
Prüft eine gespeicherte Admin-MCP-Quelle als registrierungskompatible Richtlinie
<!-- regeln -->
- Lokale Prüfung ohne MCP-Transport
- server wählt die gespeicherte Quelle
- audit-all prüft alle Quellen
- online führt einen Nur-Lese-Netzwerktest durch
- json gibt nur Metadaten aus
<!-- testen -->
- mto:agent:mcp:admin-source-check --server=my_source
- Ergebnis zeigt Status, Label und Fehler
----------------------------------------
<!-- funktion -->
Mit Agent chatten
<!-- ziel -->
Stellt Fragen an den KI-Agenten und empfängt Antworten in Echtzeit
<!-- regeln -->
- Streaming-Ausgabe jedes Tokens sofort
- Beendet auf Eingabe von exit
- Beendet auf Strg+C
- Leerer Prompt beendet
- user-id Standardwert ist cli
<!-- testen -->
- mto:agent:chat ausführen
- Frage eingeben
- Antwort tokenweise empfangen
- exit eingeben
- CLI beendet
----------------------------------------
<!-- funktion -->
Performance-Cache leeren
<!-- ziel -->
Leert alle RetrieX Runtime-Caches und den Python Vector-Service-Query-Cache
<!-- regeln -->
- Löscht den PHP Runtime-Cache
- Löscht optional den Vector-Service-Query-Cache
- skip-vector-service überspringt den Vector-Service-Cache
- json gibt maschinenlesbare Ausgabe aus
<!-- testen -->
- php bin console mto:agent:performance:cache:clear json
----------------------------------------
<!-- funktion -->
Produktlabel-Formatierer testen
<!-- ziel -->
Validiert die p465-Formatter-Extraktion ohne Laufzeiteffekte
<!-- regeln -->
- Liest nur lokale Quelldateien
- Ruft keine Chat-, Retrieval-, Shop-, MCP- oder LLM-Dienste auf
- Prüft AgentRunner-Delegation an ProductLabelFormatter
- Prüft Formatter-Besitz reiner Anzeige-Methoden
- Prüft Formatter-Besitz reiner Label-Methoden
- Prüft Abwesenheit von Runtime-Dependencies im Formatter
- Prüft Abwesenheit von p465-Methoden im AgentRunner
- Prüft Dokumentationsabdeckung in allen Referenzdateien
<!-- testen -->
- Produktlabel-Formatter-Selbsttest mit --json ausführen
- JSON zeigt status OK und 11 PASS
----------------------------------------
<!-- funktion -->
Release-Selbsttest bereitstellen
<!-- ziel -->
Validiert den v1.10.8 Release-Lock ohne Seiteneffekte im Chat-Pipeline, Agent-Runtime, Retrieval, Ranking, Shop, Followup, Evidence oder Truth Layer.
<!-- regeln -->
- Prüft 22 Release-Artefakte
- Prüft 8 zentrale Produktdokumente auf v1.10.8
- Prüft 16 Required-Release-Phrasen
- Liest nur lokale Dateien
- Führt keine Chat-, LLM- oder MCP-Live-Aufrufe aus
- Führt keine Retrieval-, Shop- oder Netzaufrufe aus
<!-- testen -->
- Ausgabe zeigt Status PASS
- JSON zeigt status OK und runtime_calls 0
----------------------------------------
<!-- funktion -->
Ressource abrufen
<!-- ziel -->
Liest eine erlaubte MCP-Ressource über die CLI ab
<!-- regeln -->
- Nur allowlisted Ressourcen abrufbar
- MIME-Typ geprüft
- Ergebnis enthält Status, Metadaten und Fehler
<!-- testen -->
- Befehl mit Optionen ausführen
- Kurzformat prüfen
- json Flag verwenden
- Status ready und Ressource vorhanden
----------------------------------------
<!-- funktion -->
Ressource validieren
<!-- ziel -->
Ermöglicht das Prüfen, ob eine MCP-Ressource_URI auf der Allowlist steht
<!-- regeln -->
- Prüft URI gegen konfigurierten Allowlist-Eintrag
- Prüft MIME-Type gegen erlaubte Typen des Eintrags
- Gibt Fehler und Warnungen aus
- CLI-Exit-Code spiegelt Entscheidung wider
<!-- testen -->
- CLI-Befehl mit --server und --resource-uri ausführen
- Option --mime-type ergänzen
- Exit-Code zeigt Ergebnis an
----------------------------------------
<!-- funktion -->
Rollencode-Zuweisung prüfen
<!-- ziel -->
Validiert die p465b-Rollencode-Zuweisungs-Grenzen ohne Laufzeiteffekte
<!-- regeln -->
- Prüft statische Artefakte nur
- Keine Chat-, Retrieval- oder LLM-Laufzeit
- Keine Shop-Suche
- Keine MCP-Aufrufe
- ProductLabelFormatter bleibt frei von Shop, Retrieval, Evidence und LLM
- AgentRunner bleibt Orchestrator
<!-- testen -->
- Befehl ausführen: mto:agent:architecture:product-role-code-assignment-guard-self-test
- Ausgabe auf Status OK prüfen
- Ergebnis: status = OK oder FAIL mit Details
----------------------------------------
<!-- funktion -->
Stabilitäts-Selbsttest bereitstellen
<!-- ziel -->
Validierung der Shop- und Follow-up-Ankerwächter vor dem Deployment
<!-- regeln -->
- Prüft REQUIRED_METHODS in AgentRunner.php
- Prüft keine FORBIDDEN_GUARD_MARKERS in Ankerwächter-Methoden
- Liest PATCH_MANIFEST.md und patch_history-Dateien
- Erzeugt Report ohne Runtime-Seiteneffekte
- json gibt maschinenlesbares Format aus
<!-- testen -->
- Binconsole mto:agent:shop-followup-anchor-stability-self-test
- Status OK prüfen
- passed größer 0 prüfen
- failed gleich 0 prüfen
- Binconsole mit --json
- JSON-Status OK prüfen
----------------------------------------
<!-- funktion -->
System rebuild bereitstellen
----------------------------------------
<!-- funktion -->
Vektordienst steuern
<!-- ziel -->
Steuert den Vektorsuchdienst über die Kommandozeile
<!-- regeln -->
- Rufzeit 300 Sekunden
- Standard-Host 0.0.0.0
- Standard-Port 8090
- Ruft Vector-Kontrollskript auf
<!-- testen -->
- Status wird angezeigt
----------------------------------------
<!-- funktion -->
Wissensbatch finalisieren testen
<!-- ziel -->
Prüft die Verknüpfung von Batch-Abschluss und Bericht ohne Seiteneffekte
<!-- regeln -->
- Prüft ohne Import, LLM-Aufruf oder Index-Rebuild
- Neun Prüfungen für Routing, Report und Abhängigkeiten
- Gibt FAIL bei einer einzigen fehlgeschlagenen Prüfung
- JSON-Ausgabe enthält status, scope, checks und failed
<!-- testen -->
- Command ausführen: mto:agent:knowledge:batch-finalize-self-test
- Ausgabe zeigt status OK oder FAIL
- JSON-Flag setzen: --json
- JSON enthält status und failed-Liste
----------------------------------------
<!-- funktion -->
MCP-Allowlist prüfen

43
daten/RAG/anleitungen.md Normal file
View File

@@ -0,0 +1,43 @@
<!-- titel -->
Anleitungen
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Zeigt Anleitungen als gerendertes Markdown im Admin-Bereich
----------------------------------------
<!-- regeln -->
- Erste H1 als Titel
- Ohne H1 wird Slug als Titel verwendet
- H1 erscheint doppelt: als Titel und im gerenderten Inhalt
----------------------------------------
<!-- funktion -->
Anleitung anzeigen
<!-- ziel -->
Liest eine Markdown-Datei und zeigt sie als HTML gerendert an
<!-- regeln -->
- Ungültiger Slug wirft 404
- Fehlende Datei wirft 404
- Titel aus erster H1 oder aus Slug
- Markdown als HTML gerendert
<!-- testen -->
- admin guides beispiel-seite aufrufen
- Titel und HTML-Inhalt sehen
- admin guides ungueltig aufrufen
- 404-Fehlerseite
----------------------------------------
<!-- funktion -->
Anleitungsübersicht öffnen
<!-- ziel -->
Listet alle verfügbaren Anleitungen zur schnellen Auswahl auf
<!-- regeln -->
- Markdown-Dateien aus bestimmtem Ordner
- Erste Überschrift als Titel
- Ohne Ordner wird leere Liste angezeigt
- Alphabetisch nach Titel sortiert
- Ungültige Dateinamen ignoriert
<!-- testen -->
- Admin-Bereich öffnen
- Klick auf Anleitungen
- Anleitungen alphabetisch aufgelistet

94
daten/RAG/auftraege.md Normal file
View File

@@ -0,0 +1,94 @@
<!-- titel -->
Aufträge
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Verarbeitet asynchrone Aufgaben mit Verfolgung von Status und Ereignissen
----------------------------------------
<!-- regeln -->
- ROLE_ADMIN_AREA für Admin-Statusabruf erforderlich
- Admin-Bereich für Ereignisse gilt ohne Events-Endpunkt
- Antwort enthält lastEventId, updatedAt, startedAt, completedAt, runningStaleAfterSeconds
- Vollständiger Kontext muss explizit angefordert werden, Standard ist eingeschränkter Kontext
- Abgeschlossene, fehlgeschlagene und abgebrochene Ingest-Jobs werden mit Exitcode SUCCESS beendet
- Dry-Run gibt im Output einen Hinweis zum Zwischenspeicher-Status aus
- Ingest-Job-Verarbeitung leert PHP-Laufzeit- und Vector-Service-Cache nach Abschluss
----------------------------------------
<!-- funktion -->
Auftrag starten
<!-- ziel -->
Übermittelt einen Prompt zur asynchronen Verarbeitung im Hintergrund
<!-- regeln -->
- Leere Prompts werden abgelehnt
- Prompts über dem Zeichenlimit werden abgelehnt
- Ungültige Upload-IDs werden abgelehnt
- Job-ID besteht aus 48 Hexadezimalzeichen
- Erstellt Job mit Status pending
<!-- testen -->
- POST ask-jobs mit gültigem Prompt
- Antwort enthält jobId
- Statuscode ist 200
- POST ask-jobs mit leerem Prompt
- Statuscode ist 400
- POST ask-jobs mit zu langem Prompt
- Statuscode ist 413
----------------------------------------
<!-- funktion -->
Auftragsereignisse abrufen
<!-- ziel -->
Ermöglicht dem Client, Auftragsereignisse zu pollen
<!-- regeln -->
- Unbekannte Auftrags-ID gibt HTTP 404 zurück
- Veraltete laufende Aufträge werden als fehlgeschlagen markiert
- Ereignisse nach after werden zurückgegeben
<!-- testen -->
- GET ask-jobs jobId events after 0
- Antwort enthält status, events, lastEventId
- Unbekannte jobId gibt HTTP 404
----------------------------------------
<!-- funktion -->
Auftragsstatus anzeigen
<!-- ziel -->
Ermöglicht dem Admin, den aktuellen Status eines Auftrags ohne Seitenreload zu prüfen
<!-- regeln -->
- ROLE_ADMIN_AREA erforderlich
- JSON mit id, type, status, startedAt, finishedAt, errorMessage, logPath
- 404 bei unbekannter Auftrags-ID
<!-- testen -->
- Detailseite eines Auftrags öffnen
- Statusabfrage per AJAX auslösen
- JSON mit status und Zeitstempeln empfangen
----------------------------------------
<!-- funktion -->
Auftragsstatus prüfen
<!-- ziel -->
Ermöglicht das Prüfen des aktuellen Zustands eines Auftrags
<!-- regeln -->
- jobId ist eine 48-stellige Hexadezimalzahl
- Ungültige jobId liefert Status missing
- Abgelaufene Aufträge werden als failed markiert
- Antwort enthält status, message, timestamps und serverTime
<!-- testen -->
- ask-jobs-Endpunkt mit jobId aufrufen
- JSON-Antwort mit Status prüfen
- Status pending, running, completed, interrupted oder failed zurückgegeben
----------------------------------------
<!-- funktion -->
Ingest-Job starten
<!-- ziel -->
Startet einen bereitgestellten Ingest-Job über seine UUID
<!-- regeln -->
- Job-ID als Pflichtargument erforderlich
- Job-Status muss ausführbar sein
- Abgeschlossene Jobs werden nicht erneut ausgeführt
- Dry-Run vermeidet Seiteneffekte
- Fehler führen zu FAILURE-Exitcode
<!-- testen -->
- Befehl mit gültiger Job-ID ausführen
- Job wird verarbeitet
- Erfolgsmeldung erscheint
----------------------------------------
<!-- funktion -->
Ingest-Jobs auflisten

97
daten/RAG/backup.md Normal file
View File

@@ -0,0 +1,97 @@
<!-- titel -->
Backup
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Erstellt, prüft und stellt Backups bereit
----------------------------------------
<!-- regeln -->
- POST-Routen erfordern CSRF-Token
- Super Admin darf Restore-Prüfungen ausführen
- Flash-Meldung zeigt Status nach jeder Aktion
- Alle Prüfungen werden protokolliert
- Backup-IDs folgen dem Muster retriex-backup-Datum-Uhrzeit
- json gibt maschinenlesbare Ausgabe zurück
- Ungueltiges CSRF-Token zeigt Flash-Meldung
- Backup herunterladen mit "Neueste" waehlt aktuelles Backup
- Operator-Report als JSON exportieren
- Deployment-Scheduler-Pruefung mit Beschreibung in Flash-Meldung
- Sicherheit-und-Datenschutz-Pruefung mit Beschreibung in Flash-Meldung
- Backup-Dry-Run erwähnt fehlende Dateischreibweise in Flash-Meldung
----------------------------------------
<!-- funktion -->
Backup herunterladen
<!-- ziel -->
Ermöglicht dem Super Admin das Herunterladen einer Sicherungsdatei
<!-- regeln -->
- Nur Super Admin
- Backup-ID aus Liste oder "Neueste"
- Fehlgeschlagener Download zeigt Flash-Meldung
- Erfolgreicher Download protokolliert OperatorCheckProtocol
<!-- testen -->
- admin_enterprise_operations öffnen
- Backup-ID aus Liste auswählen
- Klick auf Download-Button
- Datei im Browser heruntergeladen
----------------------------------------
<!-- funktion -->
Backup starten
<!-- ziel -->
Erstellt eine Sicherungskopie mit allen konfigurierten Quellen
<!-- regeln -->
- CSRF-Token erforderlich
- Ablauf im Operator-Protokoll
- Flash-Meldung je nach Status
- Database-Dump als Option
<!-- testen -->
- Backup-Endpunkt per POST aufrufen
- _token und include_database_dump senden
- Flash-Meldung zeigt Status
- Backup erstellt
----------------------------------------
<!-- funktion -->
Backup-Tauglichkeit prüfen
<!-- ziel -->
Prüft ob das System alle Voraussetzungen für Backup und Restore erfüllt
<!-- regeln -->
- JSON-Ausgabe mit --json
- Tabelle zeigt alle Testfälle
- Rückgabe SUCCESS bei Status OK
<!-- testen -->
- Befehl mto:agent:enterprise:backup-restore-readiness ausführen
- Tabelle mit Testfällen prüfen
- Rückgabe SUCCESS bei Status OK
----------------------------------------
<!-- funktion -->
Backup-Trockenlauf prüfen
<!-- ziel -->
Prüft die Wiederherstellbarkeit eines Backups ohne tatsächlichen Restore
<!-- regeln -->
- Nur Super-Admin darf Funktion ausführen
- CSRF-Token wird geprüft
- Report wird im Prüfprotokoll aufgezeichnet
- Flash-Nachricht zeigt Status, Backup-ID und Anzahl Warnungen sowie Fehler
<!-- testen -->
- POST an admin enterprise restore dry-run latest
- Erfolg: Redirect zur Übersicht mit Flash-Nachricht
- Fehler: Redirect zur Übersicht mit Fehlermeldung
----------------------------------------
<!-- funktion -->
Backup-Wiederherstellung prüfen
<!-- ziel -->
Prüft ob Backup-Pfad, Restore-Nachweis und Betreiberhinweise vorhanden sind
<!-- regeln -->
- CSRF-Token erforderlich
- Flash-Meldung zeigt Zusammenfassung
- Protokolliert den Check
<!-- testen -->
- POST an /admin/enterprise/check/backup-restore
- ungültiges CSRF-Token senden
- Weiterleitung mit Fehlermeldung
- gültiges CSRF-Token senden
- Weiterleitung mit Zusammenfassung
----------------------------------------
<!-- funktion -->
Operatorbericht als JSON exportieren

89
daten/RAG/benutzer.md Normal file
View File

@@ -0,0 +1,89 @@
<!-- titel -->
Benutzer
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Ermöglicht Super-Admins die Verwaltung aller Benutzer des Systems
----------------------------------------
<!-- regeln -->
- POST-Requests erfordern gültiges CSRF-Token
- Mindestens eine Rolle erforderlich
- Statusfilter akzeptiert nur all, active, inactive
- Statusfilter default bei ungueltigem Wert ist all
- Rollefilter default bei ungueltiger Rolle ist all
- Vorname ist optional
- Abteilung ist optional
- Passwort ist erforderlich
- is_active ist standardmaessig inaktiv
- Rollen werden als Array uebergeben
- Bearbeiten erfordert aktuellen Benutzer
- Benutzer-ID muss UUID-Format haben
----------------------------------------
<!-- funktion -->
Benutzer aktivieren
<!-- ziel -->
Aktiviert oder deaktiviert einen Benutzer sofort
<!-- regeln -->
- Nur ROLE_SUPER_ADMIN hat Zugriff
- POST mit gültigem CSRF-Token nötig
- Umschalten zwischen Aktiv und Inaktiv
- Redirect zur Übersicht nach Umschalten
<!-- testen -->
- Admin-Übersicht öffnen
- LMB auf Toggle-Button eines aktiven Benutzers
- Benutzer ist inaktiv
----------------------------------------
<!-- funktion -->
Benutzer anlegen
<!-- ziel -->
Legt einen Anwendungsbenutzer über die Konsole an
<!-- regeln -->
- E-Mail gültig und einmalig
- Passwort mindestens 8 Zeichen
- Passwort zweimal identisch eingegeben
- Mindestens eine Rolle zugewiesen
<!-- testen -->
- mto-agent-user-create aufrufen
- Ungültige E-Mail eingeben
- Validierungsfehler erwarten
- Gültige E-Mail eingeben
- Zu kurzes Passwort eingeben
- Validierungsfehler erwarten
- Passwort eingeben
- Anderes Passwort wiederholen
- Validierungsfehler erwarten
- Passwort wiederholen
- Rollen auswählen
- Benutzeraktivierung bestätigen
- Ausgabe zeigt E-Mail Rolle Aktiv
----------------------------------------
<!-- funktion -->
Benutzer auflisten
<!-- ziel -->
Zeigt admin-seitig alle Benutzer mit Filteroptionen an
<!-- regeln -->
- Nur Super-Admin darf zugreifen
- Filterung nach Suchbegriff, Status und Rolle
- Standardfilterung ohne Parameter zeigt alle
<!-- testen -->
- Seite /admin/users aufrufen
- Seite zeigt Benutzerliste mit Rollen und Status
- Filter auf Status "aktiv" setzen
- Liste zeigt nur aktive Benutzer
----------------------------------------
<!-- funktion -->
Benutzer bearbeiten
<!-- ziel -->
Änderungen an Benutzerdaten speichern
<!-- regeln -->
- Super Admin erforderlich
- CSRF-Token erforderlich
- E-Mail muss gültig sein
- Neues Passwort optional
<!-- testen -->
- Bearbeitungsseite für Benutzer öffnen
- Formular mit geänderten Daten absenden
- Erfolgsmeldung anzeigen
- Zur Übersicht redirect

90
daten/RAG/berichte.md Normal file
View File

@@ -0,0 +1,90 @@
<!-- titel -->
Berichte
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Berichte aus Enterprise-Diensten generieren, herunterladen und löschen
----------------------------------------
<!-- regeln -->
- Rolle SUPER_ADMIN statt EDITOR für Bericht als JSON herunterladen erforderlich
- Akzeptanzbericht generieren fehlt Ausgabe als Markdown für Nachweisprotokoll
- FAIL-Status: Exitcode 1 nur im JSON-Modus
- Operatorbericht als Markdown herunterladen fehlt als Funktion
----------------------------------------
<!-- funktion -->
Akzeptanzbericht generieren
<!-- ziel -->
Zeigt zusammengefasste Ergebnisse der Operator-Prüfungen im Terminal
<!-- regeln -->
- markdown-Option gibt Markdown aus
- json-Option gibt JSON aus
- Standardausgabe formatiert als Tabelle
<!-- testen -->
- Kommando mit markdown-Option ausführen
- Markdown-Tabelle erscheint
----------------------------------------
<!-- funktion -->
Bericht als JSON herunterladen
<!-- ziel -->
Exportiert einen Batch-Bericht als JSON-Datei zum Speichern
<!-- regeln -->
- Rolle EDITOR erforderlich
- Format muss json oder md sein
- Datei muss existieren
<!-- testen -->
- Batch-Übersicht öffnen
- LMB auf JSON-Download-Link eines Batch-Berichts
- Datei wird heruntergeladen
----------------------------------------
<!-- funktion -->
Bericht löschen
<!-- ziel -->
Entfernt einen nicht mehr benötigten Batch-Bericht dauerhaft
<!-- regeln -->
- POST-Methode erforderlich
- CSRF-Token obligatorisch
- Nur ROLE_EDITOR hat Zugriff
- Erfolgs- oder Warnmeldung als Flash
- Zur Berichte-Übersicht weitergeleitet
<!-- testen -->
- Batch-Bericht öffnen
- Löschen-Schaltfläche klicken
- Bestätigungsdialog bestätigen
- Zur Übersicht weitergeleitet
- Flash-Meldung 'gelöscht' sichtbar
----------------------------------------
<!-- funktion -->
Berichte auflisten
<!-- ziel -->
Zeigt alle Batch-Importe zur Übersicht
<!-- regeln -->
- listReports liefert alle Berichte
- defaultReportDir wird übergeben
<!-- testen -->
- GET admin knowledge-batches aufrufen
- Seite mit Berichtsliste wird angezeigt
----------------------------------------
<!-- funktion -->
Übersicht rendern
<!-- ziel -->
Zeigt den Betriebszustand aller Enterprise-Komponenten auf einen Blick
<!-- regeln -->
- Baut Berichte aller Enterprise-Dienste
- json gibt maschinenlesbares JSON aus
- Ohne Flag formatiert SymfonyStyle-Ausgabe
- FAIL-Status gibt Exitcode 1 zurück
<!-- testen -->
- php bin console mto:agent:enterprise:operations-overview --json
- JSON-Ausgabe enthält Felder status, progress, components, primary_action
- Exitcode ist 1 bei Status FAIL
----------------------------------------
<!-- funktion -->
Operatorbericht als Markdown herunterladen
----------------------------------------
<!-- funktion -->
Batch-Bericht hochladen
----------------------------------------
<!-- funktion -->
Batch-Bericht anzeigen

53
daten/RAG/chat.md Normal file
View File

@@ -0,0 +1,53 @@
<!-- titel -->
Chat
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Ermöglicht authentifizierten Nutzern, Prompts zu senden und Antworten als Event-Stream zu empfangen
----------------------------------------
<!-- regeln -->
- Eigener Login-Bereich
- Upload-IDs werden gegen Client-ID validiert
- CHAT_HANDBOOK.md wird aus Projektverzeichnis gelesen
- Fehlende oder leere CHAT_HANDBOOK.md als nicht verfügbar
- Anonym bei fehlendem Namen
- Handbook maximal 512 KB
----------------------------------------
<!-- funktion -->
Abmelden ermöglichen
<!-- testen -->
- Abmelden wählen
- Anmeldung beendet
----------------------------------------
<!-- funktion -->
Chat streamen
<!-- ziel -->
Liefert eine Chat-Antwort als kontinuierlichen Datenstrom im Browser
<!-- regeln -->
- POST mit Prompt im Body
- Prompt zu lang: Stream mit error-Event
- Prompt leer: Stream mit error-Event
- Upload-IDs werden validiert
- Antwort im Format text event-stream
- retry: 3000 bei Verbindungsproblemen
<!-- testen -->
- Ask-SSE-Endpunkt mit gültigem Prompt ansprechen
- Daten-Chunks aus Stream empfangen
- event: done als Abschluss
----------------------------------------
<!-- funktion -->
Chatseite anzeigen
<!-- ziel -->
Zeigt die Chatseite mit Prompt-Benutzername und Wissensraum-Auswahl
<!-- regeln -->
- Liest CHAT_HANDBOOK.md aus dem Projektverzeichnis
- Fehlende oder leere Datei wird als nicht verfügbar behandelt
- Eigene Vorlage: chat index.html.twig
<!-- testen -->
- GET chat aufrufen
- Seite rendert ohne Fehler
- Prompt-Benutzername ist Anonym
- Wissensraum-Auswahl wird angezeigt
- Handbuch-Verfügbarkeit wird angezeigt

386
daten/RAG/diagnose.md Normal file
View File

@@ -0,0 +1,386 @@
<!-- titel -->
Diagnose
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Ermöglicht Betreibern die Überprüfung von Systemzustand, Konfiguration und Datenqualität ohne produktive Änderungen
----------------------------------------
<!-- regeln -->
- Alle Diagnosekommandos bieten --json-Ausgabe
- Exit-Code 0 spiegelt Status OK wider
- Exit-Code 1 zeigt Fehler oder Befunde an
- Diagnoseoperationen verändern keine Daten
- Kein Diagnosebefehl ruft LLM während der Prüfung auf
- MAX_LINE_BYTES = 2097152
- limit-Option: Standardwert 10
- Diagnostic-only-Hinweis im Footer
- Patchline-Pruefung bei Architecture Release Lock
- Genau ein AgentRunner-Boundary-Call sichtbar
----------------------------------------
<!-- funktion -->
Abdeckung prüfen
<!-- ziel -->
Prüft ob gespeicherte Ingest-Facts eine Anfrage abdecken
<!-- regeln -->
- Query muss nicht leer sein
- index.ndjson muss existieren
- Treffer nach State-Rang und Score sortiert
- json gibt maschinenlesbare Daten zurück
<!-- testen -->
- Command mit Query ausführen
- Diagnoseausgabe mit Abdeckungsdaten prüfen
- Command mit --json ausführen
- JSON-Struktur mit rows und summary prüfen
- Command mit --min-score und --limit ausführen
- Gefilterte Treffer nach Score geordnet
----------------------------------------
<!-- funktion -->
Abrufgrenzen prüfen
<!-- ziel -->
Prüft ob Retrieval-Architekturgrenzen eingehalten werden
<!-- regeln -->
- Required-Dateien sind vorhanden
- AgentRunner besitzt Retrieval-Orchestrierung
- Genau ein Boundary-Call in AgentRunner
- Boundary-Service bleibt dünn
- Flow bleibt trace-only
- ReadModel bleibt beschränkt
- PostCallFocus erweitert keinen Constructor
- RetrieverInterface bleibt minimal
- HybridRetriever bleibt in Retrieval-Layer
- Dokumentation sichert Architecture Release Lock
<!-- testen -->
- Command ausführen mit --json
- Ausgabe zeigt Status OK
----------------------------------------
<!-- funktion -->
Bereitschaftsbericht ausgeben
<!-- ziel -->
Prüft Bereitschaft von Deployment und Scheduler und zeigt Ergebnisse an
<!-- regeln -->
- json-Option gibt maschinenlesbares JSON aus
- Standardausgabe zeigt DefinitionList und Tabelle
- Exit-Code 0 bei Status OK
<!-- testen -->
- Befehl mit --json ausführen
- JSON-Ausgabe validieren
- Befehl ohne Option ausführen
- Tabelle mit Status OK prüfen
----------------------------------------
<!-- funktion -->
Datenqualität prüfen
<!-- ziel -->
Prüft die Qualität von Text-Chunks im Original und nach Markdown-Umsetzung auf Datenverluste
<!-- regeln -->
- Liest ausschließlich ohne Index-Schreibzugriff
- Kein Ranking und keine Antwortlogik
- Argument document-id ist erforderlich
- Option version wählt eine bestimmte Dokumentversion
- Option json liefert maschinenlesbare Ausgabe
<!-- testen -->
- php bin/console mto:agent:ingest:chunk-quality {uuid}
- Ausgabe zeigt Titel und ausgewählte Version
- Abschnitt Original zeigt Chunk-Profil
- Abschnitt Markdown zeigt Chunk-Profil
- Abschnitt Vergleich zeigt Kennzahlen und Delta
- Abschnitt Interpretation zeigt strukturierte Hinweise
----------------------------------------
<!-- funktion -->
Diagnose anzeigen
<!-- ziel -->
Ermöglicht dem Administrator die MCP-Anbindungen und Wissensraum-Inhalte zu prüfen und zu verwalten
<!-- regeln -->
- Nur Super-Administratoren haben Zugriff
- Vier Ansichten: Übersicht, Anbindung, Wissensräume, System
- Vorgangsvarianten werden als Flash-Meldungen zurückgemeldet
- Formularaktionen erfordern gültiges CSRF-Token
- Transienter Zustand wird über POST-GET-Redirect erhalten
<!-- testen -->
- Admin-MCP-Seite aufrufen
- Route antwortet mit Status 200
- Übersicht der Anbindungen sichtbar
----------------------------------------
<!-- funktion -->
Genre-Hotspots prüfen
<!-- ziel -->
Entdeckt genrespezifische Begriffe im Kerncode, die das Sprachmodell beeinflussen können
<!-- regeln -->
- Ergebnis ist schreibgeschützt
- json gibt maschinenlesbare Daten aus
- strict gibt Nicht-Null-Exit-Code bei Befunden aus
- details zeigt alle Ergebniszeilen
<!-- testen -->
- Terminal öffnen
- Befehl ohne Parameter ausführen
- Zusammenfassung mit Befunden erscheint
----------------------------------------
<!-- funktion -->
Guard-Mechanismus prüfen
<!-- ziel -->
Prüft die Guard-Implementierung ohne Seiteneffekte
<!-- regeln -->
- Liest nur lokale Dateien
- Keine Runtime-Aufrufe
- Prüft 8 Testfälle
<!-- testen -->
- Befehl ausführen: mto:agent:proofing:unsupported-tool-term-guard-self-test
- Status OK in JSON-Ausgabe prüfen
- Alle 8 Testfälle bestanden
----------------------------------------
<!-- funktion -->
Hygieneregeln prüfen
<!-- ziel -->
Prüft ob Batch-Hygieneregeln korrekt implementiert und nicht in die Antwortlaufzeit verdrahtet sind
<!-- regeln -->
- source_noise_cleaner_entfernt_PDF_Restzeichen
- validator_entfernt_QUELLSEGMENT_Echo
- directory_cleanup_entfernt_leere_Admin-Upload_Ordner
- directory_cleanup_verschiebt_Legacy_failed_Eintraege
- batch_reports_sind_loeschbar_mit_CSRF_Schutz
- document_delete_bereinigt_physische_Dateien
- failed_skipped_resolvt_ausserhalb_inbox
- keine_Hygiene_Dienste_in_Antwortlaufzeit_verdrahtet
<!-- testen -->
- Befehl `mto:agent:knowledge:batch-hygiene-self-test` ausfuehren
- JSON-Ausgabe pruefen
- Alle Faelle Status OK
----------------------------------------
<!-- funktion -->
Indizierungszustand prüfen
<!-- ziel -->
Prüft automatisch, ob der verzögerte Indizierungsvertrag in allen Dateien korrekt umgesetzt ist
<!-- regeln -->
- Liest Controller, Services, Repositories und Templates ein
- Prüft 19 Vertragsfälle zum verzögerten Indizierungsworkflow
- Gibt Zusammenfassung oder strukturiertes JSON aus
- Gibt Erfolgscode bei allen bestandenen Fällen zurück
<!-- testen -->
- Befehl mit --json ausführen
- Ausgabe auf "OK" oder "FAILED" prüfen
- FEHLGESCHLAGEN: Case entfernt ungültigen startJob-Aufruf in activateVersion
- FEHLGESCHLAGEN: Case entfernt verzögertes setCurrentVersion in documentService
- Alle Cases bestanden: Rückgabewert Command::SUCCESS
----------------------------------------
<!-- funktion -->
Konfiguration prüfen
<!-- ziel -->
Prüft ob alle RetrieX-Einstellungen gültig sind und zeigt Fehler oder Warnungen an
<!-- regeln -->
- mto:agent:config:validate als Konsolenbefehl verfügbar
- Gibt Fehler und Warnungen aus
- json gibt maschinenlesbares Ergebnis aus
- Rückgabewert 0 bei gültiger Konfiguration
- Rückgabewert 1 bei ungültiger Konfiguration
- Regression Guardrails werden geprüft
<!-- testen -->
- php bin/console mto:agent:config:validate ausführen
- Ergebnis auf Fehler und Warnungen prüfen
- Exitcode prüfen
- Konfiguration gültig: Exitcode 0
- php bin/console mto:agent:config:validate --json ausführen
- JSON-Ausgabe enthält status, errors, warnings
----------------------------------------
<!-- funktion -->
Provenienz prüfen
<!-- ziel -->
Prüft ob Provenienzdiagnostik ohne Ranking- oder Antwortwirkung funktioniert
<!-- regeln -->
- Liest Ingest-Service, Admin-Inspektor, Template und Styles
- Prüft Provenienz-Metadaten in NDJSON
- Prüft Diagnostik-Metadaten in NDJSON
- Prüft Sidecar-Lesen ohne LLM-Aufruf
- Prüft Admin-Ansicht mit Provenienz und Heading-Pfad
- Prüft Read-only-Label in UI
- Prüft Kein Antwort-Runtime-Einfluss
- Prüft Genre-Neutralität der Diagnostik
<!-- testen -->
- mto agent ingest markdown-derived-chunk-diagnostics-self-test ausführen
- Kommando endet erfolgreich
- Ausgabe zeigt status OK
- Alle 8 Cases zeigen status OK
----------------------------------------
<!-- funktion -->
Retrieval-Pipeline testen
<!-- ziel -->
Ermöglicht die Überprüfung der Retrieval-Pipeline mit detailliertem Debug-Output
<!-- regeln -->
- Prompt als Argument erforderlich
- Leerer Prompt erzeugt Fehler
- json gibt Rohdaten ohne Formatierung aus
- show-text zeigt ungekürzte Chunk-Texte
<!-- testen -->
- mto:agent:retrieval:test mit Prompt ausführen
- Ausgabe auf Pipeline-Summary prüfen
- mto:agent:retrieval:test --json ausführen
- JSON-Struktur mit duration_ms und results vorhanden
----------------------------------------
<!-- funktion -->
Retrieval-Qualität testen
<!-- ziel -->
Prüft ob die Konfiguration passende Inhalte findet
<!-- regeln -->
- Erfordert ROLE_KNOWLEDGE_ADMIN
- GET zeigt leere Maske
- POST führt TestRetrieval aus
<!-- testen -->
- Seite test-retrieval öffnen
- Prompt eingeben und absenden
- Ergebnisse werden angezeigt
----------------------------------------
<!-- funktion -->
Segmentierung prüfen
<!-- ziel -->
Prüft ob Segmentierung korrekt ausgeführt wird
<!-- regeln -->
- Liest alle relevanten Dateien ein
- Prüft required_files_present
- Prüft execution_uses_complete_segment_plan
- Prüft segment_prompt_is_fragment_only
- Prüft llm_called_per_segment_with_long_transport
- Prüft sidecar_records_segment_processing_without_raw_payloads
- Prüft generated_version_remains_inactive
- Prüft no_index_or_answer_runtime_wiring
- Prüft no_genre_runtime_gate_markers
- Report enthält Status und Zusammenfassung
<!-- testen -->
- mto:agent:ingest:segmented-markdown-normalization-self-test ausführen
- Status OK oder FAIL prüfen
- Testläufe als Zusammenfassung sehen
----------------------------------------
<!-- funktion -->
Shop-Suche testen
<!-- ziel -->
Prüft die Shop-Suche mit detaillierter Ausgabe von Suchvorschau, Ergebnissen und optionalem Repair
<!-- regeln -->
- Standard-Query: 'zeige mir produkte unter 5000 euro'
- repair aktiviert zusätzliche Search-Repair-Suche
- json gibt maschinenlesbare Ausgabe aus
- Primärsuche wird immer ausgeführt
<!-- testen -->
- mto:agent:test:shop-search ausführen
- Suchvorschau und Primärergebnisse prüfen
- mto:agent:test:shop-search laptop --repair ausführen
- Repair-Auswertung mit Ergebnissen prüfen
- mto:agent:test:shop-search laptop --json ausführen
- JSON-Ausgabe mit query, preview und repair prüfen
----------------------------------------
<!-- funktion -->
Sicherheitsstatus prüfen
<!-- ziel -->
Prüft den Security- und Datenschutz-Bereitschaftsgrad ohne Seiteneffekte
<!-- regeln -->
- Kommandoname: mto:agent:enterprise:security-data-protection-readiness
- json gibt maschinenlesbares JSON aus
- Erfolg bei Status OK
- Fehler bei Status nicht OK
<!-- testen -->
- php bin/console mto:agent:enterprise:security-data-protection-readiness
- Tabelle mit Cases wird ausgegeben
- php bin/console mto:agent:enterprise:security-data-protection-readiness --json
- JSON-Objekt wird ausgegeben
----------------------------------------
<!-- funktion -->
Stapel-Upload verifizieren
<!-- ziel -->
Prüft die Integrität des Batch-Upload-Systems ohne Dokumente zu importieren
<!-- regeln -->
- Trockenlauf ohne Dokumentenimport
- Ruft kein LLM auf
- Ändert keine Daten im Wissensspeicher
- Gibt maschinenlesbares JSON aus
- Prüft CSRF-Schutz, Dienstintegration und Fortschrittsanzeige
- Prüft PDF-Schutz, Speichergrenzen und Leerraum-Bereinigung
- Prüft CLI-Progress und keine Agent-Verschaltung
<!-- testen -->
- PHP-Befehl aus src Command KnowledgeBatchAdminUploadSelfTestCommand.php ausführen
- Alle 10 Cases in der Tabelle prüfen
- Jeder Case zeigt Status OK oder FAIL
----------------------------------------
<!-- funktion -->
Systemzustand prüfen
<!-- ziel -->
Prüft NDJSON und FAISS-Konsistenz
<!-- regeln -->
- Gibt JSON aus
- OK-Status gibt SUCCESS zurück
- Fehler-Status gibt FAILURE zurück
<!-- testen -->
- php bin console mto:agent:vector:health
- Konsistente Indices: OK-Status in JSON
- Fehler: FAILURE und Fehlermeldung in JSON
----------------------------------------
<!-- funktion -->
Tag-Index-Gesundheit prüfen
<!-- ziel -->
Prüft die Konsistenz zwischen Tag-Daten und FAISS-Index
<!-- regeln -->
- summary zeigt Zusammenfassung statt JSON
- Exitcode 0 bei Status OK oder OK_EMPTY
- Exitcode 1 bei allen anderen Status
- Prüft tags_ndjson_exists, vector_exists, meta_valid
<!-- testen -->
- bin console mto:agent:tag:health ausführen
- LMB auf --summary
- Zusammenfassung mit Status, Zählern und Gültigkeit
- Befehl mit Exitcode 0 beendet
----------------------------------------
<!-- funktion -->
Tags neu indizieren
<!-- ziel -->
Echtzeitaktualisierung des Neuindizierungsfortschritts im Browser
<!-- regeln -->
- Lädt alle 2 Sekunden neuen Status
- Sendet Ereignis nur bei Hash-Änderung
- Sendet Keepalive alle 10 Sekunden
- Endet bei Verbindungsabbruch
<!-- testen -->
- Stream-Endpunkt aufrufen
- MIME-Typ text event stream prüfen
- Antwortet mit Stream
- Event-Stream antwortet
----------------------------------------
<!-- funktion -->
Verankerung testen
<!-- ziel -->
Diagnostiziert die Verankerung von Nachfolgedialogen in der Historie
<!-- regeln -->
- Kein Laufzeitverhalten geändert
- Report als Text oder JSON ausgebbar
- sample führt integrierten Smoke-Test aus
- Historie aus Datei, STDIN oder Option lesbar
<!-- testen -->
- Sample-Dry-Run ausführen
- Text-Report auf erkennbaren Anker prüfen
- Kernprodukt und Nachfolgedialog identifizieren
----------------------------------------
<!-- funktion -->
Vergleichsgrenzen validieren
<!-- ziel -->
Prueft, ob alle Dateien und Muster fuer die Chunk-Qualitaetsvalidierung vorhanden sind
<!-- regeln -->
- Liest src Service Admin DocumentChunkQualityComparisonService php
- Liest src Command IngestChunkQualityCommand php
- Liest src Controller Admin DocumentController php
- Liest templates admin document show html twig
- Liest public assets styles base css
- Liest DocumentMarkdownSegmentationPlanService php
- Liest AgentRunner php und KnowledgeIngestService php
- Prueft Dateien auf vorhandene Strings mit str_contains
- Prueft Dateien auf abwesende Strings mit !str_contains
- Gibt FAIL zurueck sobald ein Fall fehlschlaegt
- x-Icon
<!-- testen -->
- php bin console mto agent ingest chunk-quality-self-test ausfuehren
- Rueckgabe auf vollstaendige Faelle pruefen
- Status OK bei allen gueltigen Implementierungen
----------------------------------------
<!-- funktion -->
Titelvorschläge-Selbsttest bereitstellen
----------------------------------------
<!-- funktion -->
Konfigurationsquellen prüfen
----------------------------------------
<!-- funktion -->
Batch-Markdown-Normalisierung testen

127
daten/RAG/dokumente.md Normal file
View File

@@ -0,0 +1,127 @@
<!-- titel -->
Dokumente
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Organisiert Dokumente mit Versionierung und prüft deren Bereitschaft für den Wissensindex
----------------------------------------
<!-- regeln -->
- POST-Operationen erfordern CSRF-Token
- Versionen absteigend nach Versionsnummer sortiert
- Fehler bei API-Routen liefern ok=false mit Meldung
- Dateien im konfigurierten Upload-Verzeichnis gespeichert
- Index-Neuaufbau erfordert bewusste Auslösung
- Titelvorschläge erzeugen: Endpunkt fehlt
- Version ableiten: Endpunkt fehlt
- Version aktivieren: Endpunkt fehlt
- Version ingest: Endpunkt fehlt
- Formularansicht GET fehlt
- TagController mit Tag erstellen, Tag entfernen, Tag zuweisen fehlt
----------------------------------------
<!-- funktion -->
Abschnitte laden
<!-- ziel -->
Markiert eine Dokumentversion für den nächsten Index-Neuaufbau
<!-- regeln -->
- Nur aktive Versionen sind zulässig
- CSRF-Token erforderlich
- Editor-Rolle erforderlich
<!-- testen -->
- Abschnitte über Admin-Endpunkt laden mit gültigem Token
- Aktive Version auswählen
- Erfolgsmeldung: Version für Index-Neuaufbau vorgemerkt
----------------------------------------
<!-- funktion -->
Abschnittsqualität laden
<!-- ziel -->
Zeigt Qualitätskennzahlen der Textabschnitte einer Dokumentversion im Admin-Bereich
<!-- regeln -->
- Benötigt ROLE_EDITOR
- Liefert JSON mit Qualitätsdaten
- Fehler liefert ok=false mit Fehlermeldung
<!-- testen -->
- Admin-Endpunkt abrufen
- Valides CSRF und Version vorhanden
- JSON mit ok=true und quality-Daten
----------------------------------------
<!-- funktion -->
Dokument anzeigen
<!-- ziel -->
Zeigt alle Details eines Dokuments mit Versionshistorie und Qualitätsindikatoren
<!-- regeln -->
- Nur Benutzer mit ROLE_EDITOR
- DocumentVersionPreviewService lädt Inhalt
- DocumentChunkInspectionService prüft Segmentierung
- DocumentMarkdownNormalizationInspector analysiert Markdown
- DocumentIndexReadinessService zeigt Indexbereitschaft
<!-- testen -->
- Admin-Dokumentenansicht öffnen
- Seite zeigt Dokument mit Versionen und Qualitätsdaten
- Chunk-Übersicht sichtbar
- Markdown-Normalisierungsstatus sichtbar
- Index-Bereitschaftsanzeige sichtbar
----------------------------------------
<!-- funktion -->
Dokument entfernen
<!-- ziel -->
Entfernt ein Dokument dauerhaft aus dem System
<!-- regeln -->
- Entfernt alle Versionen des Dokuments
- Loescht verknuepfte Ingest-Jobs
- Bereinigt zugeordnete Dateien
<!-- testen -->
- Entfernen-Knopf betaetigen
- Bestaetigung bestaetigen
- Dokument nicht mehr in Uebersicht
----------------------------------------
<!-- funktion -->
Dokument erstellen
<!-- ziel -->
Erstellt ein neues Dokument aus einer hochgeladenen Datei
<!-- regeln -->
- Erfordert Rolle ROLE_EDITOR
- Nur POST-Requests erzeugen ein Dokument
- CSRF-Token Pflicht
- Hochgeladene Datei Pflicht
- Titel Pflicht
- Titel maximal 255 Zeichen
- Dateiname normiert
- Datei gespeichert im konfigurierten Upload-Verzeichnis
<!-- testen -->
- Admin-Dokumente-Neu aufrufen
- Formular mit Datei und Titel absenden
- Erfolgsmeldung und Weiterleitung zur Dokumentdetailseite
----------------------------------------
<!-- funktion -->
Dokumente auflisten
<!-- ziel -->
Zeigt alle Dokumente mit Statistiken und Filtern an
<!-- regeln -->
- Filter werden aus URL-Parametern geladen
- Aktive Filter werden hervorgehoben
- Zeigt Statistiken zur Dokumentenübersicht
- Index-Bereitschaft wird angezeigt
<!-- testen -->
- admin/documents öffnet die Übersicht
- Dokumente werden mit Titeln angezeigt
- LMB auf Filterfeld
- Filterkriterium auswählen
- Ergebnis zeigt gefilterte Dokumente
----------------------------------------
<!-- funktion -->
Markdown bereinigen
<!-- ziel -->
Erstellt eine normalisierte Markdown-Version aus dem Original
<!-- regeln -->
- CSRF-Token erforderlich
- Neue Version ist inaktiv
- Abgeleitet von ausgewaehlter Version
<!-- testen -->
- Seite der Dokumentversion öffnen
- POST an markdown-normalize-Endpunkt senden
- Neue inaktive Version erzeugt
----------------------------------------
<!-- funktion -->
Version-Chunks abrufen

100
daten/RAG/evaluation.md Normal file
View File

@@ -0,0 +1,100 @@
<!-- titel -->
Evaluation
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Führt Testläufe für AI-Agenten aus und liefert strukturierte Berichte
----------------------------------------
<!-- regeln -->
- ROLE_KNOWLEDGE_ADMIN für alle Admin-Funktionen
- CSRF-Token für alle POST-Operationen
- Berichte als JSON-Dateien gespeichert
- Exitcode FAILURE bei einem oder mehr Fehlern
- Standardtyp retrieval ohne explizite Angabe
- Parallele Ausführung als Child-Prozesse
- Reportdateiname ist retrieval-last-run.json
- Meta-Review-Signale werden als PASS+REVIEW angezeigt
- json gibt den vollständigen Bericht als JSON aus
- no-write unterdrückt das Schreiben der Reportdatei
- list-cases listet Eval-Fälle ohne Ausführung
- duration-profile zeigt Laufzeitprofil der langsamsten Fälle
- jobs bestimmt die Anzahl paralleler Child-Prozesse
- Report enthält scheduled_children und max_running_children
- Report enthält wall_duration_ms und summed_case_duration_ms
- Fail-Fast im Parallelmodus ist soft und sammelt laufende Prozesse
----------------------------------------
<!-- funktion -->
Berichte bereinigen
<!-- ziel -->
Entfernt alte oder alle Testläufe aus dem Dateisystem, um Speicherplatz freizugeben
<!-- regeln -->
- Nur Admins mit ROLE_KNOWLEDGE_ADMIN
- POST nur mit gültigem CSRF-Token
- mode=trim löscht alle außer der letzten Konfiguration
- mode=delete_all löscht alle historischen Testläufe
- report_scope=all wirkt auf alle Bereiche
<!-- testen -->
- POST cleanup mit mode trim und CSRF-Token
- Erfolg zeigt gelöschte Anzahl
- POST cleanup mit mode delete_all
- Löschung bestätigt
----------------------------------------
<!-- funktion -->
Eval-Berichte anzeigen
<!-- ziel -->
Ermöglicht das Anzeigen von Eval-Berichten mit Vergleich und Übersicht
<!-- regeln -->
- ROLE_KNOWLEDGE_ADMIN erforderlich
- type-Parameter bestimmt den Berichtstyp
- scope und genre bestimmen den Eval-Kontext
- compare_report zeigt Vergleichsbericht an
<!-- testen -->
- Admin-Bereich öffnen
- GET admin evals aufrufen
- Bericht wird mit Übersicht angezeigt
----------------------------------------
<!-- funktion -->
Eval-Fälle ausführen
<!-- ziel -->
Führt Eval-Fälle für den RetrieX-Agenten aus und meldet Ergebnisse
<!-- regeln -->
- Selector enthält Typ und optional Ziel und Falltyp
- case führt nur den Eval-Fall mit dieser ID aus
- Report wird als JSON-Datei geschrieben
- Exitcode ist FAILURE bei einem oder mehr fehlgeschlagenen Fällen
<!-- testen -->
- mto:agent:eval:run retrieval ausführen
- Passende Eval-Fälle werden geladen
- Jeder Fall zeigt PASS oder FAIL mit Dauer
- Zusammenfassung zeigt total, passed, failed
----------------------------------------
<!-- funktion -->
Eval-Fälle parallelisieren
<!-- ziel -->
Führt Eval-Fälle gleichzeitig in Child-Prozessen aus, um die Wandzeit zu verkürzen
<!-- regeln -->
- Erstellt einen Pool mit maximal --jobs Child-Prozessen
- Terminiert überzählige Child-Prozesse bei Timeout
- Fail-Fast bricht das Scheduling nach dem ersten Fehler ab
- Ergebnisse werden in der ursprünglichen Reihenfolge zurückgegeben
- Child-Prozesse werden nach Abschluss bereinigt
<!-- testen -->
- Kommando mit --jobs 4 ausführen
- Läuft mit der angegebenen Anzahl paralleler Child-Prozesse
- Alle Fälle werden ausgeführt und Ergebnisse gesammelt
- Pool endet mit Ergebnissen in Eingabereihenfolge
----------------------------------------
<!-- funktion -->
Evaluation ausführen
<!-- ziel -->
Führt Testsuite aus und zeigt das Ergebnis
<!-- regeln -->
- Erfordert Rolle ROLE_KNOWLEDGE_ADMIN
- CSRF-Token erforderlich
- Flash zeigt Zusammenfassung mit Bestehensrate
<!-- testen -->
- Als Admin Rolle an AdminEvalController senden
- POST an Admin-Evals-Run mit gültigem _token
- Flash-Meldung zeigt Testergebnis

74
daten/RAG/faelle.md Normal file
View File

@@ -0,0 +1,74 @@
<!-- titel -->
Fälle
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Verwalten von Testfällen für das Evaluationssystem
----------------------------------------
<!-- regeln -->
- Jede POST-Operation erfordert ein gültiges CSRF-Token
- Leerer Entwurf wird bereitgestellt, wenn keine Quelle angegeben ist
- source_type und source_case_id erstellen Entwurf aus Testergebnis
- Erfolgreiches Erstellen leitet auf Indexseite um
- Index zeigt Zusammenfassung aller Fälle nach Typ
- type-Parameter defaultet auf 'retrieval'
- Wizard bietet leeren Entwurf zum Ausfüllen
- Wizard-Erstellung erfordert CSRF-Token
- case_delete erfordert eval_scope als separaten Parameter
----------------------------------------
<!-- funktion -->
Assistent anzeigen
<!-- ziel -->
Führt durch die Erstellung eines Tests mit Hilfestellung
<!-- regeln -->
- Erfordert ROLE_KNOWLEDGE_ADMIN
- Type ist retrieval, wenn nicht unterstützt
- Leerer Entwurf wird bereitgestellt
<!-- testen -->
- Admin-Evals-Cases-Wizard aufrufen
- Seite mit Assistent wird angezeigt
----------------------------------------
<!-- funktion -->
Fall anlegen
<!-- ziel -->
Bereitet ein Formular zum Anlegen eines neuen Testfalls vor
<!-- regeln -->
- Nur ROLE_KNOWLEDGE_ADMIN hat Zugriff
- Erstellt Entwurf aus existierendem Testergebnis bei source_type und source_case_id
- Erstellt leeren Entwurf ohne Quelle
<!-- testen -->
- Seite für neuen Fall aufrufen
- Formular mit Fall-Entwurf wird angezeigt
----------------------------------------
<!-- funktion -->
Fall erstellen
<!-- ziel -->
Legt einen neuen Testfall an
<!-- regeln -->
- CSRF-Token erforderlich
- ROLE_KNOWLEDGE_ADMIN erforderlich
- type, id und prompt sind Pflicht
- evalScope bestimmt core oder genre
- Genre ist kontextabhängig optional
- Erfolg leitet auf Indexseite um
<!-- testen -->
- admin evals cases new öffnen
- Formular ausfüllen und absenden
- Erfolgsmeldung erscheint
- Weiterleitung auf Indexseite
----------------------------------------
<!-- funktion -->
Fälle löschen bereitstellen
<!-- ziel -->
Ermöglicht das Entfernen nicht mehr benötigter Tests
<!-- regeln -->
- Nur Benutzer mit Rolle KNOWLEDGE_ADMIN
- POST mit gültigem CSRF-Token
- Erfordert type, case_id, eval_scope und _token
<!-- testen -->
- Seite mit Fall öffnen
- POST an admin-evals-cases-delete mit korrekten Parametern senden
- Flash-Meldung zeigt Bestätigung
- Weiterleitung zur Fall-Erstellungsseite

128
daten/RAG/feedback.md Normal file
View File

@@ -0,0 +1,128 @@
<!-- titel -->
Feedback
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Ermöglicht Admins das Klassifizieren, Exportieren und Verwalten von Nutzerfeedback zu Chat-Antworten
----------------------------------------
<!-- regeln -->
- ROLE_KNOWLEDGE_ADMIN für Admin-Zugriff
- CSRF-Token für alle POST-Operationen
- Exportformate auf md und jsonl beschränkt
- Feedbackklassifizierung verarbeitet maximal 500 Einträge
- Feedbackklassifizierung begrenzt auf Limit 1–5000
- Feedbackklassifizierung flushet in 100er-Schritten
- Batch-Statusaktualisierung begrenzt auf 5000 Einträge
- Batch-Status gilt für ausgewählte oder aktuell gefilterte Einträge
- Statistiken zeigen Zusammenfassung aller Fälle
- Statistiken zeigen Gesamt Daumen hoch Daumen runter Offen Erledigt
- Statistiken zeigen Fehlerverdacht, Review-Priorität und Referenzwert je Stufe
- Standardfilter zeigt aktive offene Fälle reviewState=active
----------------------------------------
<!-- funktion -->
Chat-Feedback anzeigen
<!-- ziel -->
Zeigt Feedbackfälle mit Statistiken, Filtern und Sammelaktionen
<!-- regeln -->
- Statistiken passen sich an Filter an
- Batch-Aktionen gelten nur für sichtbare Einträge
- Löschen entfernt den Eintrag dauerhaft
- Erledigte Fälle verbleiben als Historie
<!-- testen -->
- Seite über Sidebar öffnen
- Feedback-Tabelle mit Einträgen prüfen
- Filter 'Erledigt' wählen und anwenden
- Tabelle zeigt erledigte Einträge
----------------------------------------
<!-- funktion -->
Feedback exportieren
<!-- ziel -->
Ermöglicht das Herunterladen von Feedback-Daten zur Analyse
<!-- regeln -->
- Zugriff nur mit ROLE_KNOWLEDGE_ADMIN
- Nur md und jsonl erlaubt
- Dateiname enthält Priorität und Zeitstempel
- Streamt Daten zur Schonung des Speichers
- Content-Type passend zum Format
- Content-Disposition als Anhang
<!-- testen -->
- Export als md aufrufen
- Dateianhang mit korrektem Namen
- Inhalt ist Markdown
----------------------------------------
<!-- funktion -->
Feedback klassifizieren
<!-- ziel -->
Wertet Feedback automatisch aus und ordnet es zur Admin-Prüfung ein
<!-- regeln -->
- Batch-Verarbeitung in 100er-Schritten
- Limit zwischen 1 und 5000
- force verarbeitet bereits klassifizierte Einträge
- Setzt type, score, risk, issue_risk, priority, reference, reason
<!-- testen -->
- Console-Befehl mto:agent:feedback:classify ausführen
- Verarbeitungszähler in Ausgabe prüfen
- Zusammenfassung nach Typen in Ausgabe
----------------------------------------
<!-- funktion -->
Feedback löschen
<!-- ziel -->
Entfernt Feedback dauerhaft aus der Verwaltung
<!-- regeln -->
- Nur ROLE_KNOWLEDGE_ADMIN
- CSRF-Token erforderlich
- Feedback muss existieren
<!-- testen -->
- admin_chat_feedback_show öffnen
- POST an admin_chat_feedback_delete mit gültigem Token
- Weiterleitung zur Übersicht
- Feedback nicht mehr in Liste
----------------------------------------
<!-- funktion -->
Feedback-Details anzeigen
<!-- ziel -->
Zeigt alle Details eines Feedback-Falls an
<!-- regeln -->
- Erfordert ROLE_KNOWLEDGE_ADMIN
- Feedback wird anhand der UUID geladen
- 404-Exception bei nicht gefundenem Feedback
<!-- testen -->
- Feedback-Endpunkt mit UUID aufrufen
- Feedback-Detailseite rendert
- Feedback-Objekt in Template verfügbar
----------------------------------------
<!-- funktion -->
Feedback-Status aktualisieren
<!-- ziel -->
Markiert Feedback als erledigt oder öffnet es wieder
<!-- regeln -->
- Status ist entweder erledigt oder offen
- CSRF-Token erforderlich
- Erledigt mit optionalem Review-Notiz
- Aktion endet mit Redirect
<!-- testen -->
- Detailseite öffnen
- Status-Button klicken
- Optional Review-Notiz eingeben
- Formular absenden
- Feedback mit aktualisiertem Status
----------------------------------------
<!-- funktion -->
Feedback-Status prüfen
<!-- ziel -->
Prüft, ob Feedback zu einer Chat-Antwort bereits existiert
<!-- regeln -->
- Ungültige Daten antworten mit HTTP 400
- Fehler beim Abrufen antworten mit stored=false
- stored ist true bei vorhandenem Feedback
- stored ist false bei fehlendem Feedback
<!-- testen -->
- Anfrage an Feedback-Status-Endpunkt mit gültigen Daten senden
- Feedback in der Datenbank prüfen
- stored entspricht dem Ergebnis in der Datenbank
- FeedbackId und rating stimmen überein
----------------------------------------
<!-- funktion -->
Feedback speichern

View File

@@ -0,0 +1,141 @@
<!-- titel -->
Knowledge-Räume
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Stellt Knowledge-Räume bereit und verwaltet deren Inhalte sowie Anbindungen
----------------------------------------
<!-- regeln -->
- CSRF-Token wird bei POST-Anfragen geprüft
- no-report verhindert das Schreiben von Berichtsdateien
- Anbindung Tool-Allowlist aktualisiert separate Anbindung
----------------------------------------
<!-- funktion -->
Batch-Import durchführen
<!-- ziel -->
Importiert Wissensdokumente aus einem Verzeichnis in den Wissensspeicher
<!-- regeln -->
- upload-dir ist Zieldateiverzeichnis
- user-email identifiziert Ersteller
- activate-derived-on-success erfordert normalize-markdown
- dry-run erzeugt keine Dateien oder Versionen
- reindex startet genau einen Indexlauf
- Berichte ohne --no-report in report-dir
<!-- testen -->
- Batch-Import im Dry-Run-Modus ausführen
- PHPUnit-Test KnowledgeBatchImportCommandTest ausführen
- Erfolgsstatus und Reportdateien prüfen
----------------------------------------
<!-- funktion -->
Chat-Freigabe umschalten
<!-- ziel -->
Aktiviert oder deaktiviert den Chat-Zugriff für einen gespeicherten Inhalt
<!-- regeln -->
- Nur POST-Anfragen werden akzeptiert
- CSRF-Token wird geprüft
- Kanditat-ID muss existieren
<!-- testen -->
- Seite mit Anbindungsinhalten öffnen
- POST an Endpunkt senden
- candidate_id senden
- chat_enabled senden
- Übersicht wird angezeigt
----------------------------------------
<!-- funktion -->
Chat-Verfügbarkeit prüfen
<!-- ziel -->
Schaltet den Chat-Zugriff für einen Wissensraum ein oder aus
<!-- regeln -->
- POST-Request erforderlich
- CSRF-Token wird geprüft
- Ungültiges Token zeigt Fehlermeldung
- Unterscheidet Server-Ressource, gespeicherte Ressource und Standard-Raum
- Erfolgreiche Änderung zeigt Bestätigung
<!-- testen -->
- POST an admin_knowledge_spaces_chat_availability_update mit _token und chat_enabled
- Leerer RaumId liefert Flash danger
- Gültiger Toggle liefert Flash success
- Chat-Verfügbarkeit geändert
----------------------------------------
<!-- funktion -->
Facts prüfen
<!-- ziel -->
Prüft die diagnostischen Ingest-Facts im Index auf Vollständigkeit und korrekte Struktur
<!-- regeln -->
- type filtert nach spezifischem Fact-Typ
- query durchsucht Titel, Text und alle Fact-Felder
- Standard-Limit zeigt maximal 10 Chunks
- json gibt maschinenlesbare Ausgabe zurück
- Warnung bei fehlenden oder leeren Fakten
<!-- testen -->
- Befehl ohne Argumente ausführen
- Chunk-Überschriften mit Metriken prüfen
- Warnung bei leerem Ergebnis prüfen
----------------------------------------
<!-- funktion -->
Kandidaten wählen
<!-- ziel -->
Wählt einen Tool- oder Resource-Kandidaten zur Wissensraumnutzung aus
<!-- regeln -->
- CSRF-Token erforderlich
- Nur Tool- oder Resource-Kandidaten verarbeitbar
- Kandidat wird nach Auswahl auf approved gesetzt
- Weiterleitung zur Überblickansicht mit Review-Dialog
<!-- testen -->
- Überblickansicht öffnen
- POST an provider-candidate-select mit source_key, candidate_kind
- Flash-Nachricht über Erfolg oder Warnung
- Redirect zur Überblickansicht mit provider_review_open=1
----------------------------------------
<!-- funktion -->
Knowledge-Räume anzeigen
<!-- ziel -->
Stellt alle Knowledge-Räume mit Status und Anbindungen übersichtlich dar
<!-- regeln -->
- Lädt Verfügbarkeit und Chat-Auswahl
- Lädt Anbindungsinhalte und Kandidaten
- Rendert admin knowledge-spaces index html-twig
<!-- testen -->
- Admin-Seite Knowledge-Räume aufrufen
- Seite mit Wissensraum-Übersicht prüfen
- Knowledge-Räume mit Verfügbarkeit angezeigt
----------------------------------------
<!-- funktion -->
Live-Vorschau laden
<!-- ziel -->
Lädt Ressourceninhalt live zur Prüfung vor Freigabe
<!-- regeln -->
- POST-Request mit gültigem CSRF-Token
- Gibt JSON mit Inhalt und Status zurück
- Nur für Ressourcen vom Typ resource verfügbar
<!-- testen -->
- POST an admin knowledge-spaces provider-resource-live-preview mit candidate_id
- Response enthält JSON mit ok und content
- Im Dialog erscheint der live gelesene Inhalt
----------------------------------------
<!-- funktion -->
Ressourcenprüfung durchführen
----------------------------------------
<!-- funktion -->
Textteile suchen
<!-- ziel -->
Findet Textteile, die einer Suchanfrage semantisch ähneln
<!-- regeln -->
- Gibt Treffer absteigend nach Ähnlichkeit zurück
- Limit wird auf maximal 200 begrenzt
- Optionale doc_ids filtern Treffer nach Dokument
- Ohne doc_ids werden Treffer aus allen Dokumenten zurückgegeben
<!-- testen -->
- POST such-chunks mit query und limit
- Antwort enthält sortierte Treffer mit chunk_id
----------------------------------------
<!-- funktion -->
Wissensräume prüfen
<!-- ziel -->
Prüft die Funktionsfähigkeit aller Wissensraum-Komponenten
<!-- testen -->
- Admin-Übersicht öffnen
- Diagnose starten
- Alle Prüfungen bestanden

129
daten/RAG/konfiguration.md Normal file
View File

@@ -0,0 +1,129 @@
<!-- titel -->
Konfiguration
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Stellt Konfigurationsdaten für Ingest-Profile, Modelle, Chat-Nachrichten und Agent bereit
----------------------------------------
<!-- regeln -->
- ROLE_SUPER_ADMIN darf alle Funktionen aufrufen
- ROLE_KNOWLEDGE_ADMIN darf Konfigurationen lesen
- POST erfordert gültiges CSRF-Token
- Flash-Nachrichten zeigen Erfolg und Fehler
- JsonResponse ohne Browser-Cache-Header
- Default-Ausgabe ist JSON
- Ingest-Profil entfernen fehlt
- Model-Konfiguration löschen fehlt
- Model-Konfiguration Retrieval testen fehlt
----------------------------------------
<!-- funktion -->
Ingest-Profil anlegen
<!-- ziel -->
Legt ein Ingest-Profil an, das Dokument-Importe steuert
<!-- regeln -->
- Nur Super-Admin kann aufrufen
- CSRF-Token erforderlich
- Erfolgsmeldung bei Anlage
<!-- testen -->
- Seite admin-ingest-profiles-create öffnen
- Alle Felder ausfüllen
- Formular absenden
- Erfolgsmeldung bestätigt Anlage
----------------------------------------
<!-- funktion -->
Ingest-Profile anzeigen
<!-- regeln -->
- ROLE_KNOWLEDGE_ADMIN erforderlich
- Tabelle mit Spalten
- Aktives Profil hervorgehoben
<!-- testen -->
- Admin-Bereich öffnen
- Seite "Ingest-Profiles" aufrufen
- Tabelle mit Profilen sichtbar
----------------------------------------
<!-- funktion -->
Konfiguration aktivieren
<!-- ziel -->
Macht eine Konfiguration zur aktiven Konfiguration
<!-- regeln -->
- Nur SUPER_ADMIN darf diese Funktion auslösen
- POST-Request erforderlich
<!-- testen -->
- admin_model_config_list öffnen
- POST-Request an activate-Endpunkt senden
- Weiterleitung zur Liste
- Konfiguration ist aktiv
----------------------------------------
<!-- funktion -->
Konfiguration anzeigen
<!-- ziel -->
Zeigt die aktuelle RetrieX-Konfiguration zur Diagnose
<!-- regeln -->
- Standardausgabe ist JSON
- summary zeigt formatierte Übersicht
- Zeigt alle Konfigurationsbereiche
<!-- testen -->
- Befehl ausführen: mto:agent:config:dump-effective
- JSON-Ausgabe mit Config-Struktur
----------------------------------------
<!-- funktion -->
Konfiguration bereitstellen
<!-- ziel -->
Liefert dem Chatfrontend alle nötigen Konfigurationsdaten in einem Request
<!-- regeln -->
- Keine Browser-Cache-Header
- JsonResponse mit Konfigurationsdaten
- Mischt Konfiguration aus drei Quellen
<!-- testen -->
- GET chat-messages-frontend
- Antwort ist JsonResponse
- Enthält limits.prompt und limits.uploads
- Keine Browser-Cache-Header gesetzt
----------------------------------------
<!-- funktion -->
Konfigurationen anzeigen
<!-- ziel -->
Zeigt alle Model-Generation-Konfigurationen im Admin-Bereich
<!-- regeln -->
- ROLE_KNOWLEDGE_ADMIN erforderlich
<!-- testen -->
- Admin-Endpoint für Model-Konfiguration aufrufen
- LMB auf Konfiguration in der Liste
- Liste der Konfigurationen sichtbar
----------------------------------------
<!-- funktion -->
Konfigurationsmuster prüfen
<!-- ziel -->
Prüft alle PHP-Dateien auf Verwendung von Kernmustern und markierten Token
<!-- regeln -->
- Ohne Option wird eine Zusammenfassung angezeigt
- json gibt das vollständige Ergebnis maschinenlesbar aus
- details zeigt die Warnungen als Tabelle
- all fügt niedrigpriore REVIEW-Befunde hinzu
- Fehlende Dateien werden als skipped_files gezählt
<!-- testen -->
- mto:agent:config:audit-patterns ausführen
- Zusammenfassung mit Zählern prüfen
- json anhängen und JSON-Struktur validieren
- details anhängen und Tabelle prüfen
- all anhängen und REVIEW-Zeilen prüfen
----------------------------------------
<!-- funktion -->
Tool-Freigaben aktualisieren
<!-- ziel -->
Schaltet einzelne Werkzeuge einer Anbindung im Chat frei oder sperrt sie
<!-- regeln -->
- Freigabe toggelt zwischen an und aus
- Ungültiges Token zeigt Fehlermeldung
- Erfolg zeigt Bestätigung
- Fehler zeigt Exception-Nachricht
<!-- testen -->
- Admin-Übersicht öffnen
- POST-Anfrage mit source_key, tool_name und tool_enabled senden
- Flash-Message prüfen
- Zurückleitung zur Übersicht
----------------------------------------
<!-- funktion -->
Ingest-Profil entfernen

46
daten/RAG/logs.md Normal file
View File

@@ -0,0 +1,46 @@
<!-- titel -->
Logs
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Ermöglicht Superadmins das Einsehen und Durchsuchen von Systemprotokollen
----------------------------------------
<!-- regeln -->
- Logdateien liegen im Verzeichnis var log
- Systemlogdateien heißen system-JJJJ-MM-TT.log
- Letzte 1000 Zeilen werden gelesen
- Dateien werden rückwärts gelesen
- Fehlende Systemlogdatei wirft 404
- Logdateien werden neueste zuerst aufgelistet
- AdminVectorLogController liest 500 Zeilen statt 1000
- AdminVectorLogController zeigt Meldung statt 404 bei fehlender Datei
----------------------------------------
<!-- funktion -->
Logdatei anzeigen
<!-- ziel -->
Zeigt den Inhalt einer Systemlogdatei an
<!-- regeln -->
- Erfordert ROLE_SUPER_ADMIN
- Liest die letzten 1000 Zeilen der Datei
- Dateiname folgt dem Muster system-JJJJ-MM-TT.log
- Nicht vorhandene Datei erzeugt 404
- Liest rückwärts vom Dateiende für Speichereffizienz
<!-- testen -->
- Route admin system-logs view 2024-01-15 aufrufen
- Seite mit Loginhalt wird angezeigt
- Datei existiert im Dateisystem unter var log
----------------------------------------
<!-- funktion -->
Logdateien auflisten
<!-- ziel -->
Zeigt alle System-Logdateien zum Download oder zur Einsicht an
<!-- regeln -->
- Nur ROLE_SUPER_ADMIN hat Zugriff
- Listet alle system*.log-Dateien auf
- Neueste Datei zuerst
<!-- testen -->
- Als Super-Admin anmelden
- admin system-logs aufrufen
- Logdateien absteigend nach Datum

64
daten/RAG/sonstiges.md Normal file
View File

@@ -0,0 +1,64 @@
<!-- titel -->
Sonstiges
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Bietet administrative Verwaltungsfunktionen für Profile, Sicherheitsprüfungen und Dokument-Tags
----------------------------------------
<!-- regeln -->
- Super-Admin-Rolle für Profile aktivieren und Sicherheitsprüfung
- Editor-Rolle für Tags speichern
- CSRF-Token für jeden POST-Aufruf geprüft
- Flash-Warnung bei ungültigem Token oder fehlerhafter Eingabe
- Erfolgreiche Prüfung leitet zur Übersicht weiter
- activate wirft AccessDeniedException, kein Flash bei ungültigem Token
- POST admin-enterprise-check-deployment-scheduler bereitstellen
- POST admin-enterprise-check-backup-restore bereitstellen
- POST admin-enterprise-restore-dry-run-latest bereitstellen
- GET admin-enterprise-operator-report-json bereitstellen
- GET IngestProfile-Liste bereitstellen
- GET Dokument-Tags bearbeiten bereitstellen
- GET Tag-Rebuild-Status abfragen bereitstellen
----------------------------------------
<!-- funktion -->
post activate {id} bereitstellen
<!-- ziel -->
Macht ein Ingest-Profil zur aktiven Konfiguration
<!-- regeln -->
- Nur Super-Admins
- CSRF-Token erforderlich
<!-- testen -->
- Admin-Bereich öffnen
- LMB auf "Aktivieren"-Schaltfläche
- Flash-Benachrichtigung zeigt Erfolg
- Profil in Liste als aktiv markiert
----------------------------------------
<!-- funktion -->
Sicherheitsnachweis bereitstellen
<!-- ziel -->
Erfüllt die Nachweispflicht für Sicherheit und Datenschutz
<!-- regeln -->
- CSRF-Token erforderlich
- Report aus lokaler Konfiguration
- Prüfung im Betreiberprotokoll erfasst
- Redirect zur Übersicht
<!-- testen -->
- Enterprise-Operations öffnen
- Prüfung für Sicherheit und Datenschutz auslösen
- Zurückleitung zur Übersicht mit Flash-Meldung
----------------------------------------
<!-- funktion -->
post {id} tags save bereitstellen
<!-- ziel -->
Speichert Tag-Zuordnungen eines Dokuments und startet den Rebuild
<!-- regeln -->
- Erfordert ROLE_EDITOR
- Prüft CSRF-Token
- Fehlerhafte Eingabe zeigt Flash-Warnung
- Erfolg zeigt Flash-Meldung und leitet weiter
<!-- testen -->
- Tags-Editor für Dokument öffnen
- Tag-IDs im Formular absenden
- Flash-Meldung "Tags wurden aktualisiert" sichtbar

304
daten/RAG/system.md Normal file
View File

@@ -0,0 +1,304 @@
<!-- titel -->
System
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Ermöglicht Systemadministration, Betriebsvalidierung und Datenmanagement für Admins
----------------------------------------
<!-- regeln -->
- ROLE_ADMIN_AREA für Adminbereich
- ROLE_SUPER_ADMIN für Super-Admin-Funktionen
- ROLE_EDITOR für Bearbeitungsfunktionen
- Flash-Meldungen zeigen Operationsergebnisse
- Fehlgeschlagene Validierung bricht Operation ab
- Rollenabhängige Startseite nach Anmeldung
- Restore-Vorschau führt kein Restore aus
- Bestätigungsphrase "KNOWLEDGE ENDGÜLTIG LÖSCHEN" ist hardcoded
- Fehlermeldungstext "Die Anfrage konnte nicht verarbeitet" ist nicht dokumentiert
----------------------------------------
<!-- funktion -->
Access-Denied-Fehler bereitstellen
<!-- ziel -->
Zeigt eine informative Fehlerseite mit kontextabhängigen Weiterleitungen an
<!-- regeln -->
- Fehlercode 403 im Titel
- Rollenabhängige Startseite
- Anmeldung für Gäste
- Rolle "Chat" führt zum Chat
- Rolle "Admin" führt zum Dashboard
<!-- testen -->
- Seite ohne Anmeldung aufrufen
- Klick auf geschützte Ressource
- error403-Seite mit Anmelde-Button
----------------------------------------
<!-- funktion -->
Betriebsbereitschaft prüfen
<!-- ziel -->
Validiert die Enterprise-Readiness-Baseline ohne Chat-Runtime-Nebeneffekte
<!-- regeln -->
- Erkennt fehlende Readiness-, Doku-, Boundary-, Backup- und Command-Artefakte
- Prüft Quell-, Konfigurations-, Dokumentations- und Eval-Verzeichnisse
- Validiert alle Services-Imports in Services-Konfiguration
- Prüft Governance-Dokument auf Maintainability-, Readiness- und Genre-Neutralitätsmarker
- Validiert Enterprise-Dokumente auf Betriebsbaseline-Marker
- Prüft Console-Binary auf Vorhandensein
- Prüft Command-Referenz auf alle Enterprise-Commands
- Prüft zentrale Qualitätschecks in der Command-Referenz
- Warnt bei fehlenden oder nicht beschreibbaren Betriebsverzeichnissen
<!-- testen -->
- Command ausführen ohne Option
- Tabelle zeigt Status, Case und Details
- Alle Cases mit PASS erscheinen
- Command mit --json ausführen
- JSON-Objekt mit status, summary und cases erscheint
----------------------------------------
<!-- funktion -->
Cache leeren
<!-- ziel -->
Leert den PHP-Runtime-Cache und den Vector-Service Query-Cache
<!-- regeln -->
- POST erfordert gültiges CSRF-Token
- Erfolgreiches Leeren zeigt success-Flash
- Fehler zeigt danger-Flash und bricht ab
<!-- testen -->
- POST an admin-runtime-cache-clear mit korrektem _token
- Erfolgreicher Flash erscheint
- Redirect zu admin-dashboard
- Cache nach dem Leeren leer
----------------------------------------
<!-- funktion -->
Daten neu laden
<!-- ziel -->
Synchronisiert alle Indizes und das Embedding-Modell mit dem Dateisystem
<!-- regeln -->
- Lädt Chunk-Index neu
- Lädt Tag-Index neu
- Lädt Embedding-Modell neu
- Leert den Query-Cache
- Gibt Service-Stempel zurück
- HTTPException bei Fehler
<!-- testen -->
- POST-Reload-Endpunkt aufrufen
- 200 OK
- status: reloaded
----------------------------------------
<!-- funktion -->
Daten sichern
<!-- ziel -->
Erstellt periodische Sicherungskopien, um Datenverlust zu verhindern
<!-- regeln -->
- Kopiert Dateien ins Sicherungsverzeichnis
- Entfernt Sicherungen jenseits der Aufbewahrungsfrist
- Datenbankdump als optionale Sicherung
- Dry-Run validiert den Plan ohne zu schreiben
- JSON-Ausgabe für maschinelle Verarbeitung
<!-- testen -->
- mto:agent:enterprise:backup-run mit --json ausführen
- JSON-Status auf SUCCESS prüfen
- backup_id und target im JSON vorhanden
----------------------------------------
<!-- funktion -->
Deployment prüfen
<!-- ziel -->
Prüft Deployment-Bereitschaft und protokolliert das Ergebnis
<!-- regeln -->
- CSRF-Token wird geprüft
- DeploymentSchedulerReadinessService liefert Report
- Prüfung wird im OperatorCheckProtocol protokolliert
- Flash-Meldung zeigt Status der Prüfung
<!-- testen -->
- POST an Admin-Endpoint für Deployment-Prüfung senden
- Weiterleitung zu admin_enterprise_operations
- Flash-Meldung zeigt Deployment-Status
----------------------------------------
<!-- funktion -->
Dienststatus melden
<!-- ziel -->
Ermöglicht die Überwachung der Betriebsbereitschaft des Dienstes
<!-- regeln -->
- Gibt JSON zurück
- Enthält immer Status ok
- Enthält alle Komponentenzustände
<!-- testen -->
- GET an health-Endpunkt senden
- Antwort prüfen
- Status ok vorhanden
----------------------------------------
<!-- funktion -->
Flow-Grenze sperren
<!-- ziel -->
Validiert die passive AgentRunner-Flow-Boundary-Linie ohne Runtime-Nebeneffekte
<!-- regeln -->
- Prueft vollstaendige und geordnete Flow-Sections
- Validiert AgentRunContext gegen deklarierte Boundaries
- Prueft Boundary-Vertraege auf trace-only-Grenzen
- Prueft kritische Runtime-Eigner-Token im AgentRunner
- Prueft Flow-Qellen auf verbotene Runtime-Aufrufsignaturen
- Prueft Patchline-Dokumentation auf aktuellen Flow-Lock
<!-- testen -->
- Kommando `mto:agent:architecture:flow-boundary-lock-self-test` ausfuehren
- Alle Pruefungen bestaetigen OK
- Status OK zurueckgemeldet
----------------------------------------
<!-- funktion -->
Neuindizierung starten
<!-- ziel -->
Startet eine vollständige Neuindizierung aller Inhalte als Hintergrundprozess
<!-- regeln -->
- Erfordert ROLE_SUPER_ADMIN
- CSRF-Token wird geprüft
- Fehlgeschlagener Start zeigt Flash-Meldung und Weiterleitung
<!-- testen -->
- POST an Global-Reindex-Endpoint mit gültigem CSRF-Token absenden
- Redirect nach admin_job_show mit neuer Job-ID prüfen
- Flash-Meldung Global Reindex wurde gestartet prüfen
----------------------------------------
<!-- funktion -->
Normalisierung prüfen
<!-- ziel -->
Prüft ob die Normalisierungs-Infrastruktur korrekt aufgebaut ist
<!-- regeln -->
- required_files_present
- prompt_is_versioned_and_markdown_only
- llm_transport_is_fit_for_large_ingest_prompt
- segmented_execution_boundary_present
- foundation_is_not_wired_into_automatic_runtime
- provenance_sidecar_is_safe
- validator_cleans_wrapper_and_common_prose
- validator_sanitizes_segment_code_fence_markers
- validator_blocks_failure_answer
- validator_removes_source_echo_markers
- source_noise_cleaner_removes_binary_pdf_artifact_lines
- no_genre_runtime_gate_markers
<!-- testen -->
- mto:agent:ingest:markdown-normalization-foundation-self-test ausführen
- Alle Testfälle mit OK bestätigt
- Status OK im Report
----------------------------------------
<!-- funktion -->
Preview prüfen
<!-- ziel -->
Validiert die korrekte Verdrahtung der Admin-Markdown-Normalisierung ohne Nebeneffekte
<!-- regeln -->
- Liest Controller, Template und Inspector
- Prüft explizite Admin-Aktion ohne automatische Verdrahtung
- Prüft read-only Provenienz ohne Prompt- oder Raw-Speicherung
- Prüft genreneutrale Verdrahtung
<!-- testen -->
- Bin console mto:agent:ingest:markdown-normalization-preview-self-test ausführen
- Ausgabe auf Status OK prüfen
- Alle Testfälle bestanden
----------------------------------------
<!-- funktion -->
Promptversion aktivieren
<!-- ziel -->
Macht eine gespeicherte Promptversion zur aktiven Version
<!-- regeln -->
- Nur Super-Admins haben Zugriff
- Aktivierung durch POST-Request
- CSRF-Token wird geprüft
- Aktivierte Version wird als aktuell markiert
- Fehler zeigen eine Flash-Meldung
<!-- testen -->
- System-Prompt-Verwaltung öffnen
- LMB auf "Aktivieren" neben einer inaktiven Version
- Flash-Meldung "Version aktiviert" erscheint
- Version zeigt aktivierten Zustand
----------------------------------------
<!-- funktion -->
Promptversion löschen
<!-- ziel -->
Entfernt eine nicht mehr benötigte Promptversion dauerhaft
<!-- regeln -->
- Super Admin erforderlich
- Post-Request erforderlich
<!-- testen -->
- LMB auf Löschen-Button der Version
- Bestätigung bestätigen
- Erfolgsmeldung wird angezeigt
- Version nicht mehr in Liste
----------------------------------------
<!-- funktion -->
Promptversionen verwalten
<!-- ziel -->
Erstellt neue Versionen und listet vorhandene auf
<!-- regeln -->
- POST erstellt neue Version
- GET listet alle Versionen auf
- Aktive Version hervorgehoben
- Neueste Version zuerst sortiert
<!-- testen -->
- POST mit gültigen Daten absenden
- Erfolgsmeldung sichtbar
----------------------------------------
<!-- funktion -->
Restore-Vorschau prüfen
<!-- ziel -->
Zeigt eine Vorschau des letzten Backups ohne Daten wiederherzustellen
<!-- regeln -->
- Nur Super-Admin
- CSRF-Token erforderlich
- Kein Restore wird ausgeführt
- Ergebnis als Flash-Meldung
<!-- testen -->
- Als Super-Admin anmelden
- POST an Admin-Restore-Endpunkt dry-run latest
- Flash-Meldung mit Ergebnis
- Zurück zur Übersicht
----------------------------------------
<!-- funktion -->
Simulation ausführen
<!-- ziel -->
Testet die MCP-Evidence-Sanilisierung ohne AgentRunner
<!-- regeln -->
- JSON und Datei schließen sich gegenseitig aus
- Fehlende Eingabe lädt Fixture
- Rückgabe enthält sanitisiertes Payload und EvidenceItem
<!-- testen -->
- php bin\console mto:agent:mcp:evidence-dry-run --payload-json='{}'
- Befehl zeigt JSON-Ausgabe mit Status
- Status ist OK oder empty
----------------------------------------
<!-- funktion -->
Systemzustand zurücksetzen
<!-- ziel -->
Setzt alle Dokumentversionen und den Wissensindex auf den Ausgangszustand zurück
<!-- regeln -->
- Nur POST-Requests werden akzeptiert
- CSRF-Token wird geprüft
- Benutzer muss ROLE_EDITOR besitzen
- Löscht alle Dokumentversionen
- Setzt alle Ingest-Jobs zurück
- Leert den Wissensindex
- Gibt eine Bestätigungsmeldung aus
<!-- testen -->
- POST an Admin-Endpunkt zum Zurücksetzen senden
- CSRF-Token im Request mitgeben
- Erfolgsmeldung prüfen
- Alle Versionen und Ingest-Jobs entfernt
----------------------------------------
<!-- funktion -->
Verzeichnis bereinigen
<!-- ziel -->
Hält den Eingangsbereich sauber und vermeidet vollaufende Speicher durch verwaiste Dateien
<!-- regeln -->
- Nur POST erlaubt
- CSRF-Token erforderlich
- ROLE_EDITOR erforderlich
- Leere Upload-Ordner werden entfernt
- Alte fehlgeschlagene Ablagen werden verschoben
- Alte übersprungene Ablagen werden verschoben
- Warnungen als Flash-Meldungen ausgegeben
<!-- testen -->
- POST an Admin-Batch-Cleanup senden
- Gültiges CSRF-Token übergeben
- Berichtsübersicht öffnet sich
- Erfolgsmeldung mit Bereinigungszähler
----------------------------------------
<!-- funktion -->
Admin-Login bereitstellen
----------------------------------------
<!-- funktion -->
Fehlerseite anzeigen

63
daten/RAG/tags.md Normal file
View File

@@ -0,0 +1,63 @@
<!-- titel -->
Tags
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Verwaltet verschlagwortbare Tags und stellt sie für die semantische Suche bereit
----------------------------------------
<!-- regeln -->
- Tag erstellen: Formular öffnen, ausfüllen, absenden
- Tag löschen: RMB, Klick auf Tag entfernen
- Tag zuweisen: Formular öffnen, Tag auswählen, speichern
----------------------------------------
<!-- funktion -->
Tag-Rebuild-Auftrag ausführen
<!-- ziel -->
Erstellt Tag-Suchindex-Dateien
<!-- regeln -->
- Lock verhindert gleichzeitige Ausführung
- tags.ndjson existiert nach Export
- Job endet mit Status completed oder failed
- Lock wird immer freigegeben
<!-- testen -->
- CLI-Befehl mit --create ausführen
- Job-Status ist running
- tags.ndjson existiert im Export-Verzeichnis
- vector_tags.index ist erstellt
- Job-Status ist completed
----------------------------------------
<!-- funktion -->
Tags auflisten
<!-- ziel -->
Zeigt alle Tags im Administrationsbereich an
<!-- regeln -->
- Nur für Benutzer mit ROLE_EDITOR sichtbar
- GET-Anfrage auf Admin-Tags-Endpunkt
<!-- testen -->
- GET-Anfrage an Admin-Tags-Endpunkt senden
- Seite mit Tag-Liste wird angezeigt
----------------------------------------
<!-- funktion -->
Tags bearbeiten
<!-- testen -->
- Funktion fehlt
----------------------------------------
<!-- funktion -->
Tags suchen
<!-- regeln -->
- Ergebnisse nach Ähnlichkeit geordnet
- Enthält label und tag_type
- Optionale Filterung nach doc_ids
- Leerer Query führt zu Fehler
<!-- testen -->
- Suchanfrage mit query sales senden
- Antwort enthält Tags mit label
- Jedes Ergebnis hat tag_type
----------------------------------------
<!-- funktion -->
Tag-Zuordnung bearbeiten
----------------------------------------
<!-- funktion -->
Tag-Rebuild-Status abfragen

40
daten/RAG/titel.md Normal file
View File

@@ -0,0 +1,40 @@
<!-- titel -->
Titel
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Ermöglicht das Ändern und Vorschlagen von Dokumenttiteln im Admin-Bereich
----------------------------------------
<!-- regeln -->
- Titeländerung ändert bestehende Versionen nicht
----------------------------------------
<!-- funktion -->
Titel aktualisieren
<!-- ziel -->
Ändert den Titel eines Dokuments manuell
<!-- regeln -->
- CSRF-Token erforderlich
- Titel nicht leer
- Titel maximal 255 Zeichen
- Bestehende Versionen unverändert
<!-- testen -->
- Seite mit Titel-Feld öffnen
- LMB auf Speichern-Button klicken
- Flash-Meldung zeigt Erfolg
- Neuer Titel in der Überschrift
----------------------------------------
<!-- funktion -->
Titelvorschläge laden
<!-- ziel -->
Erhält auf Basis des Dokumentinhalts alternative Titelvorschläge
<!-- regeln -->
- Editoren-Rolle erforderlich
- CSRF-Token wird geprüft
- Ohne Vorschläge wird Fehler zurückgegeben
- Rückgabe als JSON mit ok-Flag
<!-- testen -->
- Dokumentdetailseite öffnen
- LMB auf Titelvorschläge-Schaltfläche
- JSON mit Titelvorschlägen empfangen

75
daten/RAG/uploads.md Normal file
View File

@@ -0,0 +1,75 @@
<!-- titel -->
Uploads
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Verwaltet temporäre Datei-Uploads im Chat und persistente Batch-Uploads im Admin-Bereich
----------------------------------------
<!-- regeln -->
- Upload-Größenlimit liefert Status 413
- Admin-Uploads erfordern Editor-Rolle
- CSRF-Token bei Admin-Upload geprüft
- Temporäre Uploads werden nach Ablauf gelöscht
- Batch-Reports als JSON und Markdown verfügbar
- Upload-Grenzen werden für das Frontend bereitgestellt
- limits enthält erlaubte Dateitypen, Grenzen pro Sitzung, Dateigröße und Ablaufzeit
----------------------------------------
<!-- funktion -->
Berechtigungsmodus ändern
<!-- ziel -->
Ändert den Berechtigungsmodus eines Chat-Uploads auf einen erlaubten Wert
<!-- regeln -->
- PATCH oder POST erforderlich
- clientId aus Request-Cookie ermittelt
- authorityMode aus Body gelesen
- Unbekannter Modus führt zu Fehler
<!-- testen -->
- PATCH auf Chat-Upload-Endpunkt mit authorityMode im Body senden
- Erfolg: status ok und aktualisierter Upload zurück
----------------------------------------
<!-- funktion -->
Datei hochladen
<!-- ziel -->
Speichert eine Datei und gibt den aktuellen Upload-Status zurück
<!-- regeln -->
- Nur eine Datei pro Anfrage erlaubt
- Dateityp und Größe werden geprüft
- Upload wird mit Client-ID verknüpft
- Fehler werden als JSON zurückgegeben
- Größenlimit-Überschreitung liefert Status 413
<!-- testen -->
- POST chat-uploads mit Datei im Feld file
- Antwort enthält status ok und Upload-ID
- Anfrage ohne Datei gibt Fehler zurück
----------------------------------------
<!-- funktion -->
Upload entfernen
<!-- ziel -->
Entfernt einzelne oder alle Uploads aus der Sitzung
<!-- regeln -->
- DELETE entfernt Upload mit ID
- POST entfernt alle Uploads der Sitzung
- Unbekannte ID gibt Status missing
- Antwort enthält aktualisierte Upload-Liste
<!-- testen -->
- DELETE auf Upload-ID
- Status ok in Antwort
- Upload nicht mehr in Liste
- POST auf Leeren-Button
- Uploads-Liste leer
----------------------------------------
<!-- funktion -->
Uploads auflisten
<!-- ziel -->
Zeigt verfügbare Uploads und deren Grenzen an
<!-- regeln -->
- Löscht abgelaufene Uploads des Clients
- Liefert enabled-Flag
- Liefert Uploads des Clients
- Liefert alle Grenzen für das Frontend
<!-- testen -->
- Anfrage an Chat-Uploads senden
- JSON-Antwort prüfen
- enabled, uploads und limits vorhanden

57
daten/RAG/verlauf.md Normal file
View File

@@ -0,0 +1,57 @@
<!-- titel -->
Verlauf
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Bietet Zugriff auf und Löschung von Gesprächsverläufen
----------------------------------------
<!-- regeln -->
- json-Ausgabe als JSON
- Löscht Konversation
- Löscht Commerce-Referenzen
- Löscht Uploads
- Badge fehlt
- sample Option nicht dokumentiert
- Testen für leere Eingabe fehlt
- Regel Nur eine Eingabequelle gleichzeitig nur dokumentiert nicht getestet
----------------------------------------
<!-- funktion -->
Verankerungen extrahieren
<!-- ziel -->
Ermöglicht das Extrahieren strukturierter Verankerungen aus Konversationsverläufen
<!-- regeln -->
- Liest Verlaufstext aus Argument, Datei oder STDIN
- Nur eine Eingabequelle gleichzeitig
- json gibt Ergebnis als JSON aus
- max-turns begrenzt die analysierten Turns
<!-- testen -->
- Befehl mit --sample ausführen
- Extrahierte Verankerungen im Ausgabetext
----------------------------------------
<!-- funktion -->
Verlauf abrufen
<!-- ziel -->
Lädt gespeicherte Konversation zum Wiederherstellen der Chatansicht
<!-- regeln -->
- Identität aus Cookie
- Rohdaten in Benachrichtigungen umgewandelt
- Leere Geschichte gibt leeres Array zurück
<!-- testen -->
- History-Endpunkt aufrufen
- Antwort prüfen
- Array mit role und text pro Nachricht
----------------------------------------
<!-- funktion -->
Verlauf löschen
<!-- ziel -->
Entfernt alle Daten des aktuellen Clients aus dem Verlauf
<!-- regeln -->
- POST-Endpoint
- Löscht Konversation, Commerce-Referenzen und Uploads
- Gibt {"status": "ok"} zurück
<!-- testen -->
- POST an history-delete senden
- Antwort prüfen: HTTP 200
- Antwort enthält {"status": "ok"}

75
daten/RAG/versionen.md Normal file
View File

@@ -0,0 +1,75 @@
<!-- titel -->
Versionen
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Verwaltet Versionen eines Dokuments mit Ablegen, Erstellen, Einlesen und Aktivieren
----------------------------------------
<!-- regeln -->
- Versionen absteigend nach Versionsnummer sortiert
- Preview-Daten als JSON mit ok-Feld
- Version-Aktivierung mit CSRF-Schutz
- Version-Aktivierung zeigt Flash-Nachricht
- Neue Version zeigt Flash-Nachricht
- Ableiten zeigt CSRF-Fehler bei ungültigem Token
- Ableiten zeigt Fehler bei leerem Inhalt
- Neue Version zeigt Fehler bei fehlender Datei
----------------------------------------
<!-- funktion -->
Version ableiten
<!-- ziel -->
Erstellt eine neue Version aus bearbeitbaren Originaldaten
<!-- regeln -->
- Lädt die Originaldaten-Vorschau der Quellversion
- POST erfordert gültiges CSRF-Token
- Neue Version ist nach Erstellung inaktiv
- Leerer Inhalt wird abgelehnt
<!-- testen -->
- Ableiten-Seite der Quellversion öffnen
- Bearbeitbaren Quelltext im Formular anzeigen
- POST mit Quelltext und CSRF-Token absenden
- Neue Dokumentversion erstellt und Redirect zu Dokument
----------------------------------------
<!-- funktion -->
Version einlesen
<!-- regeln -->
- Gibt JSON mit Preview-Daten zurück
- Fehler als JSON mit ok: false
<!-- testen -->
- Dokument-Detailseite öffnen
- LMB auf Version klicken
- Vorschau-Request abwarten
- JSON enthält ok: true und preview
----------------------------------------
<!-- funktion -->
Version erstellen
<!-- ziel -->
Ermöglicht das Hinzufügen einer neuen Dokumentversion
<!-- regeln -->
- GET zeigt Formular mit Dokument-ID
- POST erfordert gültiges CSRF-Token
- POST erfordert hochgeladene Datei
- Hochgeladene Datei wird in Upload-Verzeichnis verschoben
- DocumentService erstellt neue Version
<!-- testen -->
- Admin-URL für neue Dokumentversion aufrufen
- Formular mit Datei und CSRF-Token POSTen
- Erfolgsmeldung Neue Dokumentversion wurde hochgeladen
- Weiterleitung auf Dokumentdetailseite
----------------------------------------
<!-- funktion -->
Versionvorschau anzeigen
<!-- ziel -->
Zeigt den Originaltext einer Dokumentversion in einem ausschnitt an
<!-- regeln -->
- LMB auf Version
- Zeigt Textausschnitt mit Offset und Limit
<!-- testen -->
- Dokumentdetail öffnen
- API version preview abrufen
- preview enthält Textausschnitt
----------------------------------------
<!-- funktion -->
Version aktivieren

317
daten/TFT/.pruefung.json Normal file
View File

@@ -0,0 +1,317 @@
{
"abdeckung": {
"bedienen:act": {
"abdruck": "965eccb9356235b1",
"funktion": "Shop sperren",
"trug": "b6a2ab03493b74c5"
},
"bedienen:buy": {
"abdruck": "63c51977c098cde3",
"funktion": "Item kaufen",
"trug": "f3d6ca24335fa3b1"
},
"bedienen:buyXp": {
"abdruck": "1a0c5247f488c54c",
"funktion": "XP kaufen",
"trug": "45683c6493a79b31"
},
"bedienen:equip": {
"abdruck": "e9e549414ab5a0d1",
"funktion": "Einheit ausrüsten",
"trug": "8c6d6267f598e37d"
},
"bedienen:move": {
"abdruck": "8ce9d559861ca921",
"funktion": "",
"trug": ""
},
"bedienen:next": {
"abdruck": "0b481f13ca9aebf9",
"funktion": "Runde fortsetzen",
"trug": "45149ffb5a41db45"
},
"bedienen:p": {
"abdruck": "88b57fbbc98d450c",
"funktion": "Gegner einblenden",
"trug": "b7192893969b60f4"
},
"bedienen:pickAugment": {
"abdruck": "ba2ea2a567fcde9c",
"funktion": "Augment auswählen",
"trug": "7a76e5f3d13ef6d7"
},
"bedienen:reroll": {
"abdruck": "fd56403509531bb6",
"funktion": "XP kaufen",
"trug": "45683c6493a79b31"
},
"bedienen:start": {
"abdruck": "710cd74615808655",
"funktion": "Spiel starten",
"trug": "84ca0e724728251f"
},
"befehl:autoplay": {
"abdruck": "7b035ff596c12934",
"funktion": "",
"trug": ""
},
"befehl:build-artifact": {
"abdruck": "153fed8ab2aa1f5b",
"funktion": "Statische Daten herunterladen",
"trug": "8390b7b7807ab3f0"
},
"befehl:calibrate": {
"abdruck": "e816c00e7793250b",
"funktion": "Ranglisten-Matches crawlen",
"trug": "a9e766bc343f6751"
},
"befehl:crawl": {
"abdruck": "c9bb4cca017189c1",
"funktion": "Statische Daten herunterladen",
"trug": "8390b7b7807ab3f0"
},
"befehl:extract": {
"abdruck": "9595995ee5598702",
"funktion": "Statische Daten herunterladen",
"trug": "8390b7b7807ab3f0"
},
"befehl:fetch-static": {
"abdruck": "2207bccdebcd9aa4",
"funktion": "",
"trug": ""
},
"befehl:refresh": {
"abdruck": "b8b8e201706f4c19",
"funktion": "Spiele automatisch spielen",
"trug": "3ef945fdc4f98631"
},
"route:get /api/game/{game_id}": {
"abdruck": "7391585929a1342c",
"funktion": "Spielstand abrufen",
"trug": "85b87d6154b2363b"
},
"route:get /health": {
"abdruck": "bf52cace58ae302a",
"funktion": "Systemzustand prüfen",
"trug": "3a72c3a11d536884"
},
"route:post /api/game": {
"abdruck": "fe2b8a04ab08ae82",
"funktion": "Spiel starten",
"trug": "84ca0e724728251f"
},
"route:post /api/game/{game_id}/action": {
"abdruck": "952a1c6a5b3a9372",
"funktion": "Spielaktion ausführen",
"trug": "274b16ec98a7a650"
}
},
"belege": {
"[\"analyse\", \"Analysedaten generieren\"]": {
"abdruck": "6a39ed91dabae20c",
"beleg": "\"learned\": learned or {},",
"datei": "backend/tft/model/artifact.py"
},
"[\"analyse\", \"Endboards erfassen\"]": {
"abdruck": "f8be70adea2b51f5",
"beleg": "def extract_all(conn, static: dict) -> tuple[int, Counter]:",
"datei": "backend/tft/matches/extract.py"
},
"[\"analyse\", \"Platzierungen testen\"]": {
"abdruck": "ed43baf02f00a9f5",
"beleg": "def calibrate(conn, artifact: dict, holdout_only: bool = False, score_fn=None) -> dict:",
"datei": "backend/tft/model/calibrate.py"
},
"[\"einheit\", \"Einheit ausrüsten\"]": {
"abdruck": "dc58e2411954a192",
"beleg": "def equip(p: PlayerState, item_idx: int, board_idx: int, artifact: dict | None = None) -> None:",
"datei": "backend/tft/sim/player.py"
},
"[\"einheit\", \"Einheit verschieben\"]": {
"abdruck": "298448c773048dde",
"beleg": "def move(p: PlayerState, where: str, idx: int) -> None:\n src, dst = (p.bench, p.board) if where == \"bench\" else (p.board, p.bench)\n if not (0 <= idx < len(src)):\n raise InvalidAction(\"no unit there\")\n if dst is p.board and len(p.board) >= p.level:\n raise InvalidAction(\"board full for your level\")\n if dst is p.bench and len(p.bench) >= BENCH_SIZE:\n raise InvalidAction(\"bench full\")\n dst.append(src.pop(idx))",
"datei": "backend/tft/sim/player.py"
},
"[\"pipeline\", \"Pipeline ausführen\"]": {
"abdruck": "55afc728ea543cb6",
"beleg": "for stage in (\"crawl\", \"extract\", \"build-artifact\", \"calibrate\"):",
"datei": "backend/tft/cli.py"
},
"[\"pipeline\", \"Ranglisten-Matches crawlen\"]": {
"abdruck": "d91e117ee0d050a4",
"beleg": "def crawl(set_number: int, limit: int = 200) -> int:",
"datei": "backend/tft/matches/crawl.py"
},
"[\"pipeline\", \"Statische Daten herunterladen\"]": {
"abdruck": "b558c5c5a5f4f2d9",
"beleg": "def fetch_static(set_override: int | None = None) -> dict:",
"datei": "backend/tft/staticdata/fetch.py"
},
"[\"pipeline\", \"Systemzustand prüfen\"]": {
"abdruck": "895ac2187188eb0a",
"beleg": "@app.get(\"/health\")\ndef health() -> dict:\n return {\"status\": \"ok\"}",
"datei": "backend/tft/api/app.py"
},
"[\"shop\", \"Augment auswählen\"]": {
"abdruck": "1e9f76ada85ce074",
"beleg": "def pick_augment(p: PlayerState, choice: int) -> None:\n if not p.augment_offer:\n raise InvalidAction(\"no augment offer\")\n if not (0 <= choice < len(p.augment_offer)):\n raise InvalidAction(\"invalid choice\")\n p.augments.append(p.augment_offer[choice])\n p.augment_offer = []",
"datei": "backend/tft/sim/player.py"
},
"[\"shop\", \"Item kaufen\"]": {
"abdruck": "ab0dc67b859c1205",
"beleg": "def buy(p: PlayerState, slot: int, pool: Pool, artifact: dict) -> None:",
"datei": "backend/tft/sim/player.py"
},
"[\"shop\", \"Shop aktualisieren\"]": {
"abdruck": "191c940daa30b69b",
"beleg": "def reroll(p: PlayerState, pool: Pool, cfg: dict, rng: random.Random) -> None:\n cost = cfg[\"shop\"][\"reroll_cost\"]\n if p.gold < cost:\n raise InvalidAction(\"not enough gold\")\n p.gold -= cost\n refresh_shop(p, pool, cfg, rng)",
"datei": "backend/tft/sim/player.py"
},
"[\"shop\", \"Shop sperren\"]": {
"abdruck": "fe80becbfaa689c5",
"beleg": "def toggle_lock(self) -> None:\n self.player.shop_locked = not self.player.shop_locked",
"datei": "backend/tft/sim/game.py"
},
"[\"shop\", \"XP kaufen\"]": {
"abdruck": "1b2d9644e3c6c09f",
"beleg": "def buy_xp(p: PlayerState, cfg: dict) -> None:\n xp = cfg[\"xp\"]\n if p.level >= xp[\"max_level\"]:\n raise InvalidAction(\"max level\")\n if p.gold < xp[\"buy_cost\"]:\n raise InvalidAction(\"not enough gold\")\n p.gold -= xp[\"buy_cost\"]\n p.level, p.xp = economy.apply_xp(p.level, p.xp, xp[\"buy_amount\"], cfg)",
"datei": "backend/tft/sim/player.py"
},
"[\"spiel\", \"Gegner einblenden\"]": {
"abdruck": "302223719243056a",
"beleg": "@click=\"!p.is_player && (expanded = expanded === p.name ? null : p.name)\"",
"datei": "frontend/src/components/OpponentList.vue"
},
"[\"spiel\", \"Runde fortsetzen\"]": {
"abdruck": "df80063512e078a7",
"beleg": "def step(self) -> None:\n \"\"\"Resolve the current round and advance to the next planning phase.\"\"\"",
"datei": "backend/tft/sim/game.py"
},
"[\"spiel\", \"Spiel starten\"]": {
"abdruck": "1fa645dc09353d68",
"beleg": "@app.post(\"/api/game\")\ndef new_game(seed: int | None = None) -> dict:\n artifact, cfg = _load_game_deps()\n game_id = uuid.uuid4().hex[:8]\n GAMES[game_id] = Game(artifact, cfg, seed=seed)\n return {\"game_id\": game_id, **state(game_id)}",
"datei": "backend/tft/api/app.py"
},
"[\"spiel\", \"Spielaktion ausführen\"]": {
"abdruck": "e113ab7b8e4f225b",
"beleg": "@app.post(\"/api/game/{game_id}/action\")\ndef action(game_id: str, req: ActionRequest) -> dict:",
"datei": "backend/tft/api/app.py"
},
"[\"spiel\", \"Spiele automatisch spielen\"]": {
"abdruck": "e6d88c6931086b25",
"beleg": "def run(artifact: dict, cfg: dict, policy_name: str, n: int, seed: int = 1) -> dict:",
"datei": "backend/tft/sim/autoplay.py"
},
"[\"spiel\", \"Spielstand abrufen\"]": {
"abdruck": "7c267f889cc18e5c",
"beleg": "def state(game_id: str) -> dict:",
"datei": "backend/tft/api/app.py"
}
},
"ohne_code": {},
"ohne_karte": {},
"paare": {},
"stil": {
"[\"analyse\", \"\"]": {
"abdruck": "36a5c535e2b6e294",
"probleme": []
},
"[\"analyse\", \"Analysedaten generieren\"]": {
"abdruck": "6c6136aa1f731cea",
"probleme": []
},
"[\"analyse\", \"Endboards erfassen\"]": {
"abdruck": "46ff85afaea26861",
"probleme": []
},
"[\"analyse\", \"Platzierungen testen\"]": {
"abdruck": "58f4097a7aad42b2",
"probleme": []
},
"[\"einheit\", \"\"]": {
"abdruck": "591f6d834b06521d",
"probleme": []
},
"[\"einheit\", \"Einheit ausrüsten\"]": {
"abdruck": "2b91a8a929caf2ea",
"probleme": []
},
"[\"einheit\", \"Einheit verschieben\"]": {
"abdruck": "0fa02b3c5370a837",
"probleme": []
},
"[\"pipeline\", \"\"]": {
"abdruck": "4c05ea483576379e",
"probleme": []
},
"[\"pipeline\", \"Pipeline ausführen\"]": {
"abdruck": "62c1b0e18d38c93e",
"probleme": []
},
"[\"pipeline\", \"Ranglisten-Matches crawlen\"]": {
"abdruck": "cfbaf9497a9ee888",
"probleme": []
},
"[\"pipeline\", \"Statische Daten herunterladen\"]": {
"abdruck": "a5527bcb3a8a8e95",
"probleme": []
},
"[\"pipeline\", \"Systemzustand prüfen\"]": {
"abdruck": "1bf0e238f72fcf45",
"probleme": []
},
"[\"shop\", \"\"]": {
"abdruck": "75b47d1052ed5c4c",
"probleme": []
},
"[\"shop\", \"Augment auswählen\"]": {
"abdruck": "39156336d367d481",
"probleme": []
},
"[\"shop\", \"Item kaufen\"]": {
"abdruck": "642d23d43adc285f",
"probleme": []
},
"[\"shop\", \"Shop aktualisieren\"]": {
"abdruck": "9a4c846ad728fba7",
"probleme": []
},
"[\"shop\", \"Shop sperren\"]": {
"abdruck": "45037477893cfe1e",
"probleme": []
},
"[\"shop\", \"XP kaufen\"]": {
"abdruck": "f39788167c4cc160",
"probleme": []
},
"[\"spiel\", \"\"]": {
"abdruck": "c9853896271c5be7",
"probleme": []
},
"[\"spiel\", \"Gegner einblenden\"]": {
"abdruck": "63d6fda80dd3b2d4",
"probleme": []
},
"[\"spiel\", \"Runde fortsetzen\"]": {
"abdruck": "cba0db2ace42f096",
"probleme": []
},
"[\"spiel\", \"Spiel starten\"]": {
"abdruck": "06a041341108c024",
"probleme": []
},
"[\"spiel\", \"Spielaktion ausführen\"]": {
"abdruck": "4c72ac35204cb4db",
"probleme": []
},
"[\"spiel\", \"Spiele automatisch spielen\"]": {
"abdruck": "63a5feadb6e87b2f",
"probleme": []
},
"[\"spiel\", \"Spielstand abrufen\"]": {
"abdruck": "3b51dd57c2d1e4e3",
"probleme": []
}
},
"verworfen": {}
}

61
daten/TFT/analyse.md Normal file
View File

@@ -0,0 +1,61 @@
<!-- titel -->
Analyse
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Erzeugt ein trainiertes Modell aus Matchdaten und wertet dessen Vorhersagequalität aus
----------------------------------------
<!-- regeln -->
- Static-Daten sind Grundlage für alle weiteren Schritte
- Spearman-Korrelation misst Vorhersagequalität
- Holdout-Matches werden nicht zum Training genutzt
- Refresh führt alle Schritte sequenziell aus
- fetch-static lädt Community-Dragon-Daten herunter
- crawl lädt bis zu 200 neue Matches pro Lauf
- autoplay führt Spiele mit Policy aus Standard: econ
- autoplay führt 200 Spiele aus Standard
- refresh führt crawl extract build-artifact und calibrate aus
----------------------------------------
<!-- funktion -->
Analysedaten generieren
<!-- ziel -->
Erstellt eine Analysedatei aus gelernten Spieldaten und statischen Daten
<!-- regeln -->
- Ausgabe ist eine einzelne JSON-Datei
- Analyse enthält gelernte Statistiken pro Set
- Dateipfad wird ausgegeben
<!-- testen -->
- tft build-artifact ausführen
- artifact.json prüfen
- boards_learned_from enthält Anzahl
----------------------------------------
<!-- funktion -->
Endboards erfassen
<!-- ziel -->
Extrahiert gespielte Boards aus Rohdaten der Datenbank für die Modellierung
<!-- regeln -->
- Ein Aufruf pro Set
- Unbekannte IDs werden gezählt ausgegeben
- Erfolgsmeldung bei vollständiger Auflösung
- Kenntnis der Datenbankverbindung vorausgesetzt
<!-- testen -->
- tft extract ausführen
- Anzahl extrahierter Endboards prüfen
- Unbekannte IDs: Ausgabe vorhanden
- Alle IDs aufgelöst: Erfolgsmeldung vorhanden
----------------------------------------
<!-- funktion -->
Platzierungen testen
<!-- ziel -->
Validierung der Prognosequalität des Modells anhand realer Platzierungen
<!-- regeln -->
- Nur Holdout-Matches werden ausgewertet
- Vergleicht vorhergesagte Platzierung mit tatsächlicher Platzierung
- Ausgabe: Anzahl Holdout-Matches und Spearman-Korrelation
- Lädt aktuelles Artifact für das aktive Set
<!-- testen -->
- CLI: tft calibrate ausführen
- Ausgabe enthält holdout matches und spearman
- Spearman-Wert zwischen -1 und 1

35
daten/TFT/einheit.md Normal file
View File

@@ -0,0 +1,35 @@
<!-- titel -->
Einheit
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- regeln -->
- Einheit auf Board verkaufen
----------------------------------------
<!-- funktion -->
Einheit ausrüsten
<!-- ziel -->
Weist ein ausgewähltes Item einer Einheit auf dem Board zu
<!-- regeln -->
- Item ist ausgewählt
- Ziel ist eine Board-Einheit
- Item wird von der Itemleiste entfernt
- Unit zeigt das Item nach dem Ausrüsten
<!-- testen -->
- Item in Itemleiste anklicken
- LMB auf Board-Einheit
- Item auf Unitchip sichtbar
----------------------------------------
<!-- funktion -->
Einheit verschieben
<!-- ziel -->
Vertauscht eine Bank-Einheit mit einer Brett-Einheit
<!-- regeln -->
- Bewegt Einheit auf freien Brett-Platz
- Tauscht mit Einheit auf angeklicktem Brett-Platz
<!-- testen -->
- Board mit Einheit öffnen
- Bank mit Einheit öffnen
- LMB auf Bank-Einheit klicken
- Einheit auf Brett verschoben

60
daten/TFT/pipeline.md Normal file
View File

@@ -0,0 +1,60 @@
<!-- titel -->
Pipeline
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- regeln -->
- autoplay mit --policy und --games
----------------------------------------
<!-- funktion -->
Pipeline ausführen
<!-- ziel -->
Führt Crawl, Extraktion, Build und Kalibrierung automatisch hintereinander aus
<!-- regeln -->
- Führt vier Stages sequenziell aus
- Bricht bei Fehler in einer Stage ab
- Druckt Fortschritt für jede Stage
- Gibt den Fehlerort aus
<!-- testen -->
- tft refresh aufrufen
- Console zeigt alle vier Stages
- Alle Stages ohne Fehler
- refresh schließt erfolgreich
----------------------------------------
<!-- funktion -->
Ranglisten-Matches crawlen
<!-- ziel -->
Holt neue Ranglisten-Matches von der Challenger- und GM-Leiter
<!-- regeln -->
- Lädt maximal 200 neue Matches pro Lauf
- Nutzt Challenger- und GM-Spieler als Ausgangspunkt
- Bezieht Spieler-IDs aus der Rangliste
<!-- testen -->
- tft crawl ausführen
- Ausgabe prüfen
- Anzahl neuer Matches ausgegeben
----------------------------------------
<!-- funktion -->
Statische Daten herunterladen
<!-- ziel -->
Lädt Einheiten, Traits, Items und Augments von Community Dragon herunter
<!-- regeln -->
- Lädt Daten von Community Dragon herunter
- Nutzt aktuellen Set wenn kein --set angegeben
- Speichert Daten lokal unter paths.latest_static_pointer
- Gibt Set-Nummer, Patch und Elementanzahlen aus
<!-- testen -->
- Terminal öffnen
- tft fetch-static ausführen
- Ausgabe zeigt Set-Nummer, Patch und Elementanzahlen
- tft fetch-static --set 5 ausführen
- Ausgabe zeigt Set-5-Daten
----------------------------------------
<!-- funktion -->
Systemzustand prüfen
<!-- regeln -->
- Gibt Status "ok" zurück
<!-- testen -->
- GET-Health-Endpunkt aufrufen
- Status ist ok

83
daten/TFT/shop.md Normal file
View File

@@ -0,0 +1,83 @@
<!-- titel -->
Shop
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Bietet zufällige Champions zum Kaufen, Aktualisieren und Festhalten an
----------------------------------------
<!-- regeln -->
- Kostenfarben codieren Champion-Tiers
- Shop zeigt genau 3 Karten
- Kauf reduziert Gold um Kosten
- Kauf entfernt Karte dauerhaft aus dem Angebot
- Refresh kostet reroll_cost Gold
- Refresh zeigt neue zufällige Champions
- Gesperrter Shop behält Angebot zwischen Runden
- 🔒 zeigt gesperrten, 🔓 entsperrten Shop
- Owned Champions zeigen einen Schimmer-Effekt
- Unbezahlbare Karten sind leicht abgedunkelt
- Augment-Bereich zeigt "Augment wählen" als Überschrift
----------------------------------------
<!-- funktion -->
Augment auswählen
<!-- ziel -->
Spieler wählt ein Augment aus den angebotenen Optionen
<!-- regeln -->
- Drei Augmente zur Auswahl
- Augment-Karten nach Tier farblich markiert
- Gewähltes Augment wird sofort aktiviert
<!-- testen -->
- Augment-Auswahl öffnen
- LMB auf Augment-Karte
- Augment ausgewählt, Auswahl verschwunden
----------------------------------------
<!-- funktion -->
Item kaufen
<!-- ziel -->
Fügt ein Item aus dem Shop zum Inventar hinzu
<!-- regeln -->
- Kauf entfernt Item aus dem Shop
- Gold wird um Kosten reduziert
<!-- testen -->
- Karte im Shop anklicken
- Item im Board oder auf der Bank
- Goldbetrag um Kosten verringert
----------------------------------------
<!-- funktion -->
Shop aktualisieren
<!-- ziel -->
Bietet neue Champions zum Kauf an
<!-- regeln -->
- Kostet Shop-Gold aus `reroll_cost`
- Shop-Karten zeigen neue Zufallschampions
<!-- testen -->
- Genug Gold für Refresh bereitstellen
- LMB auf Refresh-Button
- Shop zeigt andere Champions
----------------------------------------
<!-- funktion -->
Shop sperren
<!-- ziel -->
Verhindert das Kaufen und Rerollen im Shop zwischen zwei Runden
<!-- regeln -->
- 🔒 bei gesperrtem Shop
- 🔓 bei entsperrtem Shop
- Gesperrter Shop behält sein Angebot
<!-- testen -->
- Shop-Button mit LMB klicken
- Shop ist gesperrt
----------------------------------------
<!-- funktion -->
XP kaufen
<!-- ziel -->
Gibt XP zum Aufleveln des Spielers
<!-- regeln -->
- Kostet Gold
- Button deaktiviert wenn xp_needed null
- Button deaktiviert wenn Gold < xp_cost
<!-- testen -->
- Anzeige von Gold und xp_cost prüfen
- Klick auf XP kaufen
- Gold reduziert, XP erhöht

98
daten/TFT/spiel.md Normal file
View File

@@ -0,0 +1,98 @@
<!-- titel -->
Spiel
----------------------------------------
<!-- art -->
kern
----------------------------------------
<!-- ziel -->
Simuliert einen vollständigen TFT-Spielzug mit Gegnern, Shop und Kampf
----------------------------------------
<!-- regeln -->
- game_id ist 8-stelliger Hex-String
- Board enthält Einheiten mit Items
- Shop enthält Odds und Kosten
- XP zeigt Fortschritt zum Levelaufstieg
- Augment-Angebot erscheint in passenden Runden
- Kampf endet automatisch mit Zustandsänderungen bei allen Beteiligten
- Spieler HP auf 0
- Letzte Runde vorbei
- buy_xp als Aktion
- pick_augment als Aktion
- lock als Aktion
- next als Aktion
- Augment-Auswahl zeigt gewählte Augmente
- Shop zeigt Upgrade-Hinweis für 2- und 3-Sterneinheit
- Spielstand enthält reroll_cost und xp_cost
- Spielstand enthält shop_locked und shop_odds
- Spielstand enthält xp und xp_needed
- Spielstand enthält streak
- Spielstand enthält Log der letzten 8 Einträge
- Spielstand enthält placement
- autoplay als eigene Funktion
----------------------------------------
<!-- funktion -->
Gegner einblenden
<!-- ziel -->
Blickt in die Board-Aufstellung eines Gegners
<!-- regeln -->
- Nur für Nicht-Spieler
- Gegner muss lebendig sein
- Gegner braucht Einheiten auf dem Board
<!-- testen -->
- LMB auf lebenden Gegner
- Scout-Bereich mit Einheiten-Icon erscheint
- Erneuter Klick blendet Scout aus
----------------------------------------
<!-- funktion -->
Runde fortsetzen
<!-- ziel -->
Wechselt zur nächsten Spielphase oder löst den Kampf aus
<!-- regeln -->
- Nächste Phase einleiten
- Kampf ▶ im PvP-Modus auslösen
<!-- testen -->
- Kampf-Button klicken
- Spielzustand fortgeschritten
----------------------------------------
<!-- funktion -->
Spiel starten
<!-- ziel -->
Beginnt ein neues Spiel mit initialem Spielstand
<!-- regeln -->
- Generiert eindeutige game_id
- Lädt statische Spieldaten
- Initialisiert Spieler und Bots
- Antwortet mit vollständigem Spielstand
<!-- testen -->
- LMB auf "Neues Spiel"
- Anfrage an Backend abwarten
- Splash-Bildschirm verschwindet, Spiel-Layout erscheint
----------------------------------------
<!-- funktion -->
Spielaktion ausführen
<!-- ziel -->
Führt Aktionen wie Kaufen, Verkaufen und Bewegen im Spiel aus
<!-- regeln -->
- 404 bei unbekannter Spiel-ID
- 400 bei unbekannter Aktion
- 400 bei ungültiger Aktion
- 400 bei fehlenden Parametern
<!-- testen -->
- POST an Spielaktion-Endpunkt mit action=buy und slot=0
- 200 miterialisierter Spielstand zurück
- Aktion ungültig → 400 mit Fehlermeldung
----------------------------------------
<!-- funktion -->
Spiele automatisch spielen
----------------------------------------
<!-- funktion -->
Spielstand abrufen
<!-- ziel -->
Gibt den aktuellen Spielstand als JSON zurück
<!-- regeln -->
- Unbekannte game_id wirft HTTP 404
<!-- testen -->
- GET auf ungültige game_id
- HTTP 404 mit Fehlermeldung
- GET auf gültige game_id
- HTTP 200 mit Spielstand