Communitygithub.com

Website aus WebDAV

Veröffentliche eine statische HTML/CSS/JS-Website (generiert durch eine RDF-Turtle + SHACL + Jinja2-Pipeline, z.B. sites/openlink/rdf/build.py) in einem Virtuoso WebDAV-Root und ordne ihr eine öffentliche Route via isql/VHOST_DEFINE zu.

Was ist Website aus WebDAV?

Dieses Skill ist dafür konzipiert, eine **bereits vollständig generierte** statische Website (HTML/CSS/JS) – das Ergebnis einer RDF-Turtle + SHACL + Jinja2-Pipeline wie `sites/openlink/rdf/build.py` – in einem Virtuoso WebDAV-Root zu veröffentlichen und mit Hilfe der `VHOST_DEFINE`-Funktion von Virtuoso eine öffentliche Route zuzuweisen. Es eignet sich ideal für das Deployment oder Update einer bereits erstellten OpenLink-Portfolio-Seite auf einem WebDAV-Ziel. Das Skill stellt sicher, dass die Live-Route den gleichen Inhalt wie das lokale `generated/`-Verzeichnis ausliefert, oder erstellt ein vollständig deploybares Bundle, wenn keine Live-Zugangsdaten verfügbar sind. Es wird durch Phrasen wie "diese Site auf WebDAV veröffentlichen", "die generierte Site deployen", "eine initiale OpenLink-Site von einem WebDAV-Root einrichten" oder "ist diese Site live?" ausgelöst. Das Skill arbeitet bewusst auf der reinen Publikationsebene und nimmt keine Änderungen an RDF-Inhalten vor, führt keine SHACL/Jinja2-Pipeline-internen Logiken aus und rendert keine Seiten live aus SPARQL – die genaue Grenze wird in `references/rdf-content-mode.md` beschrieben.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/OpenLinkSoftware/ai-agent-skills/tree/HEAD/website-from-webdav

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht Website aus WebDAV?

Nutzen Sie dieses Skill, um eine statische, bereits generierte HTML/CSS/JS-Website – das Ergebnis einer RDF-Turtle + SHACL + Jinja2-Pipeline wie sites/openlink/rdf/build.py – in einem Virtuoso WebDAV-Root mit einer zugeordneten öffentlichen Route zu veröffentlichen. Das Inhaltsmodell (Ontologie, SHACL-Shapes, Sortierung) der Site wird vorgelagert erstellt und validiert; die Aufgabe dieses Skills beginnt mit "hier ist ein generated/-Ordner mit fertigem HTML, bringe ihn live."

Dies ist bewusst enger gefasst als weblog-from-webdav oder osdi-inclusion-engine: jene Skills rendern Inhalte bei jeder Anfrage live (WebDAV-Collection-Enumeration innerhalb eines maßgeschneiderten VSP oder ein gemeinsames XSLT-Skin, das WebDAV-quellierte HTML umschließt). Der Inhalt dieses Skills ist bereits vollständig gerendert, bevor er ankommt – die Veröffentlichung ist ein einfaches WebDAV-PUT plus eine VHOST_DEFINE für statische Dateien, ohne VSP-Ausführung und ohne Live-SPARQL-Abfragen. Siehe references/webdav-website-engine-gate.md, warum diese Entscheidung getroffen wurde und wann sie sich ändern würde.

Blockierende Hürde – Eine lokale Datei ist kein gültiger Abschluss

Wenn der Benutzer darum bittet, eine generierte Site zu veröffentlichen, zu deployen oder "live zu schalten", ist eine Beschreibung, was passieren würde, oder eine Behauptung, dass Dateien lokal existieren, kein gültiger Abschluss, es sei denn, der Benutzer bittet explizit nur um eine lokale/Vorschau-Prüfung. Das Standardergebnis ist entweder:

  • eine live, verifizierte veröffentlichte Site: Die Zielroute liefert denselben Inhalt wie die lokale generated/-Ausgabe, oder
  • ein vollständiges deploybares Bundle: generated/*.html, die assets/ der Site (site.css, theme.js), eine pfad-substituierte templates/deploy-website-route.sql und eine README-/Run-Notes-Datei – mit bestandener Prüfung durch scripts/validate_generated_website_bundle.py.

Lesen Sie references/webdav-website-engine-gate.md, bevor Sie eines von beiden beanspruchen. Wenn Berechtigungsnachweise für das Deployment (WebDAV und/oder isql) nicht verfügbar sind, stoppen Sie beim deploybaren Bundle und sagen Sie deutlich, dass die Live-Veröffentlichung aufgrund fehlenden authentifizierten Zugriffs blockiert ist – beschreiben Sie keinen hypothetischen Erfolg.

Erste Entscheidungen

Klären Sie diese Punkte, bevor Sie etwas veröffentlichen:

  • Quell-Pipeline-Verzeichnis (z.B. {LLM_ROOT}/Claude Generated/sites/openlink/) und ob rdf/build.py zuerst (erneut) ausgeführt werden muss oder generated/ bereits aktuell ist.
  • Ziel-DAV-Collection, z.B. /DAV/home/kidehen/sites/openlink/.
  • Öffentliche Route, z.B. https://linkeddata.uriburner.com/sites/openlink/.
  • Identitätsmodus: SQL-Benutzername/Passwort, isql WebID-TLS, WebID-TLS mit Delegation, WebDAV-Benutzername/Passwort, WebDAV mTLS oder WebDAV mTLS plus On-Behalf-Of.
  • Handelt es sich um eine erstmalige Routen-Initialisierung (isql + deploy-website-route.sql erforderlich) oder eine reine Inhalts-Neuveröffentlichung einer bestehenden Route (nur WebDAV-Veröffentlichung, gemäß dem Gültigkeitsbereich von references/webdav-publish-mode.md – es berührt nie die Routenkonfiguration).

Arbeitsablauf

  1. Bestätigen Sie, dass die Quell-generated/-Ausgabe aktuell ist: Wenn Sie gebeten werden, (neu) zu bauen, führen Sie die pipeline-eigene rdf/validate_shacl.py und dann unverändert rdf/build.py aus – dieses Skill implementiert diese Validierung nicht neu und umgeht sie nicht. Siehe references/rdf-content-mode.md.
  2. Durchsuchen Sie vor dem Schreiben die vorherigen Erinnerungen/Arbeiten nach validate_generated_weblog_bundle, VHOST_DEFINE, DAV_RES_UPLOAD_STRSES_INT, website-from-webdav; verwenden Sie bewährte Korrekturen, anstatt sie neu zu entdecken.
  3. Bestimmen Sie, ob die Zielroute bereits existiert (Abfragen von DB.DBA.HTTP_PATH und WS.WS.SYS_DAV_RES für den Zielpfad via isql). Wenn nicht, initialisieren Sie sie: Patchen Sie templates/deploy-website-route.sql mit dem tatsächlichen DAV-Pfad/Route/Titel und führen Sie es dann mit isql aus. Siehe references/isql-route-mode.md.
  4. Validieren Sie das Bundle mit scripts/validate_generated_website_bundle.py vor jeder Veröffentlichung. Dies ist blockierend.
  5. Veröffentlichen Sie via WebDAV mit scripts/publish_static_bundle.py – PUTs generated/*.html und assets/* rekursiv, verifiziert jeden Schreibvorgang mit einem nachfolgenden GET/PROPFIND-Vergleich. Siehe references/webdav-publish-mode.md.
  6. Verifizieren Sie: Holen Sie die Live-Route ab, bestätigen Sie, dass die ausgelieferten Bytes mit der lokalen generated/-Datei übereinstimmen (nur Unterschiede in Leerzeichen/Attributreihenfolge erlaubt, gleiche Toleranz wie die pipeline-eigene Phase-1-Verifikation), bestätigen Sie, dass assets/site.css/theme.js mit korrekten MIME-Typen geladen werden.
  7. Berichten Sie genau, was passiert ist: Route initialisiert oder wiederverwendet, veröffentlichte Dateien mit ihren DAV-Pfaden, Verifikationsergebnis – oder, falls Berechtigungen fehlten, den Ort des deploybaren Bundles und die explizite Aussage, dass keine Live-Veröffentlichung stattgefunden hat.

Modus-Referenzen

  • Für die Routen-Initialisierung und isql TLS/WebID-Syntax lesen Sie references/isql-route-mode.md.
  • Für die WebDAV-Veröffentlichung und ihren Gültigkeitsbereich lesen Sie references/webdav-publish-mode.md.
  • Für die Pipeline-Grenze (was dieses Skill in rdf/ tut und nicht tut) lesen Sie references/rdf-content-mode.md.
  • Warum die Live-SPARQL/VSP-Rendering nicht gewählt wurde, lesen Sie references/webdav-website-engine-gate.md.
  • Für agent-aufrufbare Operationen lesen Sie references/opal-tool-mode.md – in v1 nicht implementiert; als Erweiterungspunkt dokumentiert.

Praktische Schutzmaßnahmen

  • Führen Sie die SHACL-Validierung von rdf/build.py niemals mit unterdrückten Warnungen oder --skip-validate-ähnlichen Abkürzungen aus; eine fehlschlagende Hürde bedeutet, dass der Inhalt nicht bereit zur Veröffentlichung ist, kein Hindernis, das es zu umgehen gilt.
  • DB.DBA.DAV_RES_UPLOAD_STRSES_INT (falls für einen Schritt verwendet, der keine statische Datei ist) benötigt einen string_output()-Stream, der via http(content, stream) befüllt wird, kein einfacher String.
  • Vermeiden Sie $1, $2 und ähnliche Tokens in SQL, das über isql geladen wird; sie können Makrosubstitution auslösen.
  • Eine VHOST_DEFINE für statische Dateien verwendet is_dav=>1, is_brws=>0, def_page=>'index.html' – setzen Sie def_page=>'index.vsp' nur, wenn ein VSP-Einstiegspunkt tatsächlich existiert; ein def_page, das auf eine nicht existierende VSP-Ressource verweist, liefert rohen Quellcode oder einen 404, nicht die Site.
  • Löschen Sie jede vorherige widersprüchliche VHOST_DEFINE für denselben Host/Pfad, bevor Sie sie neu definieren, dasselbe Muster wie weblog-from-webdav's Route-entfernen-dann-neu-definieren.
  • Behandeln Sie die zertifikatsbasierte Identität und den delegierten Prinzipal als separate Fakten: -X/--cert identifiziert den aufrufenden Agenten, -W/On-Behalf-Of identifiziert den WebID-Principal, dessen ACL-Rechte ausgewertet werden sollen.
  • Schreiben Sie niemals Berechtigungsnachweise in das Skill, generiertes SQL, Logs oder committete Dateien.
  • Remote-Uploads und -Löschungen folgen derselben HTTP → WebDAV → iSQL-Reihenfolge und dem Principal-PKCS#12-Muster (howto/remote-webdav-upload.ttl, howto/remote-resource-removal.ttl, Prefs Steps 215–216). URIBurner-Schreib-/Löschvorgänge gehen an Port 5443. Melden Sie :5443 GET und öffentliches 443 GET getrennt nach PUT; nach DELETE verifizieren Sie die vom Benutzer genannte URL, Varianten mit Schrägstrich, :5443 GET und die Ordnerauflistung, bevor Sie die Löschung behaupten.

Sicherer Virtuoso ISQL-Fehlerausgang

Wann immer dieser Workflow den nativen Virtuoso isql-Client von OpenLink aufruft, übergeben Sie die bare-Client-Option COMMAND_TEXT_ON_ERROR=OFF, zum Beispiel isql {host}:{port} {user} {password} COMMAND_TEXT_ON_ERROR=OFF {script.sql}. Platzieren Sie sie vor SQL-Eingabe, Skriptargumenten oder -i. OFF ist dem internen Wert 0 des Clients zugeordnet und verhindert, dass der Client den vollständigen fehlgeschlagenen Befehl an die Fehlerausgabe anhängt. Der Client akzeptiert OFF/ON; das Literal 0 wird zurückgewiesen. Verwenden Sie nicht -u für diese Einstellung (-u befüllt das U-Argument-Array). Dies schwärzt keine Geheimnisse aus Server-Diagnosen, Shell-Verlauf oder Prozessargumenten, daher halten Sie Berechtigungsnachweise aus SQL-Text und Logs heraus. Wenden Sie diese Virtuoso-spezifische Option nicht auf unixODBC/iODBC isql-Clients an.

Verwandte Skills