Files
Projektwissen/.agents/skills/sn-neues-fachplugin/SKILL.md
T
AndreasTharangandClaude Sonnet 5 ab416fb34c Projektwissen: Git-Vorgaben, Ticketzugriff, Tests und Einstieg
Erster Stand des Repositories AG_QGIS/Projektwissen (bisher Arbeitstitel
"Workspace", ADR 0006). Der lokale Ordner heisst weiter AG_QGIS, weil darin
auch die Plugin-Klone liegen.

Git verbindlich (ADR 0007), aus dem bisherigen Wiki-Konzept entwickelt:
- docs/leitfaden/05_git_arbeitsweise.md mit Kanal-Kette, Branch-Namen und
  Gitea-Branch-Schutz.
- Der Einstiegspunkt eines Fixes richtet sich nach dem Kanal, in dem der
  Fehler sitzt; ein Fix an testing oder stable ist erst mit der
  Rueckfuehrung nach unten abgeschlossen. Das fehlte bisher.
- Der stabile Kanal heisst stable, nicht main: der Release-Workflow in
  Repository:hidden/workflows fuehrt git checkout "$CHANNEL" aus, der
  Branchname muss also dem Kanalnamen entsprechen. Er existiert in keinem
  Plugin-Repo und ist vom Maintainer anzulegen.
- Der Mensch drueckt ab: .claude/settings.json sperrt push, merge, tag.
- scripts/hallo.py und /hallo holen den Stand aller Klone, per
  Fast-Forward wo gefahrlos; nie mergen, stashen oder verwerfen.

Ticketzugriff:
- scripts/gitea.py liest Issues, Kommentare und PRs ueber die oeffentliche
  API, ohne Token, nur GET. Schreibendes nur als Entwurf in entwuerfe/.
- Skill sn-ticket.

Tests (ADR 0009):
- docs/leitfaden/06_tests.md: Testebenen, Testpflicht, und wie eine
  Fachperson beurteilt, ob Tests fachlich sinnvoll sind.
- scripts/testkatalog.py erzeugt docs/tests/testkatalog.md per ast-Parsing,
  ohne Import und ohne QGIS. Befund: nur 100 von 332 Tests haben einen
  Docstring, sn_basis keinen einzigen von 87.
- Vorlage und erste Testkonzept-Seite mit Mermaid. Dabei gefunden und gegen
  origin geprueft: _ermittle_gebietstyp_aus_fbschl hat keinen Test, obwohl
  PR #44/#45 genau diese Funktion tolerant gemacht hat.
- docs/konzept/07_qgis_tests_plan.md: Stufenplan fuer Tests gegen echtes
  QGIS. Dabei aufgefallen: QGIS 3.40 ist seit Januar 2026 End of Life,
  qgis_min steht aber noch darauf.

Werkzeuge (ADR 0008):
- 04_werkzeuge_einrichten.md nur noch Claude Code als CLI und in VS Code.
- .vscode/ entfernt, brauchbare Einstellungen als persoenliche Vorlage.

Ausserdem: README als Einstieg neu aufgebaut, Mermaid-Diagramm in
schnittstellen.md repariert (unmaskierte Klammern, rendert seither nicht).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-04 11:57:26 +02:00

2.9 KiB
Raw Blame History

name, description
name description
sn-neues-fachplugin Neues sn_*-Fachplugin oder neuen Tab nach dem Integrationsvertrag von sn_basis anlegen (Registrierung in Menü/Toolbar, DockManager, BaseDockWidget, Tabs, Services, Release-Dateien). Verwenden bei "neues Plugin", "Plugin anlegen", "FLT/Topografie/Widmung ausbauen", "neuen Tab hinzufügen".

Neues Fachplugin anlegen

Vertrag: docs/architektur/schnittstellen.md Abschnitte 1–2. Minimalmuster: Plugin_SN_Widmung/. Vollständiges Muster mit Services: Plugin_SN_Verfahrensgebiet/main.py und ui/dockwidget.py.

Dateien (Paketname sn_<name>, Repo Plugin_SN_<Name>)

__init__.py          classFactory(iface) → Klasse aus main.py
main.py              Klasse <Name>: __init__(iface), initGui(), unload(), run()
ui/dockwidget.py     class DockWidget(BaseDockWidget): tabs = [ArbeitsTab, PrintTab, SettingsTab]
ui/tabs/<tab>.py     class <Tab>(QWidget): tab_title = "…"; optional set_services(...), cleanup()
functions/…          Fachfunktionen (keine Qt-Importe außer über Wrapper)
tests/__init__.py, tests/test_main.py   Mock-Modus (Muster: Plugin_SN_Verfahrensgebiet/tests/test_main.py)
changelog.txt, README.md, .gitignore
.gitea/workflows/release.yaml            Kopie aus einem bestehenden Plugin (unverändert)
.gitea/templates/metadata.template       Name, Beschreibung, Homepage/Tracker/Repository-URLs dieses Repos, qgisMinimumVersion=3.40, supportsQt6=true

main.py – Pflichtverhalten

  • initGui(): basis = plugins.get("sn_basis"); ohne basis.ui nichts tun (Basis ruft später nach). Sonst self.action = basis.ui.add_action(self.plugin_name, self.run, tooltip=…, priority=<frei, 10/20/30 sind vergeben>), dann basis.ui.finalize_menu_and_toolbar().
  • run(): Dock erzeugen, setObjectName("sn_dock_<name klein>"), dock.action = self.action, DockManager.show(dock), basis.ui.set_active_plugin(self.action).
  • unload(): iface.removeDockWidget, deleteLater, basis.ui.remove_action(self.action).
  • Services: Pruefmanager(ui_modus="qgis") und DataGrabber(pruefmanager=…) in __init__ anlegen und an das Dock geben, wenn Prüfungen/Datenabruf gebraucht werden.

Imports

Nur from qgis.utils import plugins (main.py) und sn_basis.functions.*/sn_basis.modules.*/sn_basis.ui.*. Kein qgis.core, kein PyQt*.

Registrieren im Workspace

  • workspace.toml: Eintrag [[repos]] mit paket, rolle, tests.
  • docs/architektur/modulkarte.md und schnittstellen.md (Priorität) ergänzen.
  • Repo-AGENTS.md/CLAUDE.md aus docs/vorlagen/AGENTS.repo.md und CLAUDE.repo.md.
  • Gitea: Repo-Variable ZIP_FOLDER=sn_<name> und Secret/Variablen wie bei den anderen Plugins (Maintainer).

Abnahme

  • python scripts/run_tests.py sn_<name> grün (mindestens test_main.py).
  • In QGIS: Plugin erscheint in Menü/Toolbar „LNO Sachsen“, Dock öffnet, andere Docks schließen, Unload hinterlässt keine Reste.