Communitygithub.com

OpenLinkSoftware/ai-agent-skills

將靜態 HTML/CSS/JS 網站(由 RDF-Turtle + SHACL + Jinja2 管線產生,例如 sites/openlink/rdf/build.py)發佈到 Virtuoso WebDAV 根目錄,並透過 isql/VHOST_DEFINE 映射公開路由。

ai-agent-skills 是什麼?

此技能專門用於將已完全產生的靜態網站(HTML/CSS/JS)部署到 Virtuoso WebDAV 伺服器並建立公開路由。它接手管線產生的 `generated/` 資料夾,負責 WebDAV PUT 上傳與 VHOST_DEFINE 靜態檔案路由設定,不涉及 VSP 執行或即時 SPARQL 查詢。支援多種驗證模式(SQL 帳號、WebID-TLS、mTLS 等),並包含完整性驗證指令碼與詳細的錯誤處理機制。適用於支援 Virtuoso 的 AI 代理工具(如 Claude Code、Cursor),觸發語句包括「發佈此站點到 WebDAV」、「部署產生的網站」、「確認站點是否已上線」等。

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

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Website From WebDAV

使用此技能將一個靜態、已產生的 HTML/CSS/JS 網站——即 RDF-Turtle + SHACL + Jinja2 管線(例如 sites/openlink/rdf/build.py)的輸出——發佈到 Virtuoso WebDAV 根目錄,並映射一條公開路由。該網站的內容模型(本體、SHACL 形狀、排序)是在此技能上游編寫和驗證的;此技能的工作從「這裡有一個 generated/ 資料夾,裡面是完成好的 HTML,讓它上線」開始。

此技能的範圍刻意比 weblog-from-webdav 或 osdi-inclusion-engine 更窄:那些技能每次請求都會即時渲染內容(在自訂 VSP 內列舉 WebDAV 集合,或使用共享 XSLT 樣式表包裹 WebDAV 來源的 HTML)。此技能的內容在到達之前已完全渲染——將其發佈僅是純粹的 WebDAV PUT 加上靜態檔案 VHOST_DEFINE,不涉及 VSP 執行或即時 SPARQL 查詢。請參閱 references/webdav-website-engine-gate.md 以了解為何做出此選擇以及何時會改變。

阻斷門檻——僅有本機檔案不是有效的完成

當使用者要求發佈、部署或「上線」一個已產生的網站時,描述將會發生什麼事,或聲明檔案存在於本機,不是有效的完成,除非使用者明確只要求本機/預覽檢查。預設的可交付成果是:

  • 一個已上線、已驗證的已發佈網站:目標路由回傳的內容與本機 generated/ 輸出相同,或者
  • 一個完整的可部署套件:generated/*.html、網站的 assets/(site.css、theme.js)、路徑代換後的 templates/deploy-website-route.sql 以及一份 README/執行說明檔案——並通過 scripts/validate_generated_website_bundle.py 驗證。

在聲明上述任一項之前,請先閱讀 references/webdav-website-engine-gate.md。如果無法取得部署憑證(WebDAV 和/或 isql),請在可部署套件處停止,並明確表示即時發佈因缺少經過驗證的存取而受阻——不要描述假設的成功。

首要決定

在發佈任何內容之前,先確定以下事項:

  • 來源管線目錄(例如 {LLM_ROOT}/Claude Generated/sites/openlink/)以及 rdf/build.py 是否需要先(重新)執行,還是 generated/ 已經是最新的。
  • 目標 DAV 集合,例如 /DAV/home/kidehen/sites/openlink/。
  • 公開路由,例如 https://linkeddata.uriburner.com/sites/openlink/。
  • 身分模式:SQL 使用者名稱/密碼、isql WebID-TLS、WebID-TLS 加上委派、WebDAV 使用者名稱/密碼、WebDAV mTLS、或 WebDAV mTLS 加上 On-Behalf-Of。
  • 這是首次路由引導(需要 isql + deploy-website-route.sql)還是僅對現有路由進行內容重新發佈(僅 WebDAV 發佈,依據 references/webdav-publish-mode.md 的範圍邊界——它從不觸碰路由設定)。

工作流程

  1. 確認來源 generated/ 輸出是最新的:如果要求(重新)建置,請按原樣執行管線自己的 rdf/validate_shacl.py 然後 rdf/build.py——此技能不會重新實作或繞過該驗證。請參閱 references/rdf-content-mode.md。
  2. 在寫入任何內容之前,先搜尋先前的記憶/工作中是否有 validate_generated_weblog_bundle、VHOST_DEFINE、DAV_RES_UPLOAD_STRSES_INT、website-from-webdav;重用已驗證的修復方法,而不是重新發現它們。
  3. 確定目標路由是否已存在(透過 isql 查詢 DB.DBA.HTTP_PATH 和 WS.WS.SYS_DAV_RES 的目標路徑)。如果不存在,則引導它:將 templates/deploy-website-route.sql 中的 DAV 路徑/路由/標題替換為實際值,然後使用 isql 執行它。請參閱 references/isql-route-mode.md。
  4. 在任何發佈之前,使用 scripts/validate_generated_website_bundle.py 驗證套件。這是阻塞性的。
  5. 使用 scripts/publish_static_bundle.py 透過 WebDAV 發佈——PUT 上傳 generated/*.html 和 assets/*,並對每次寫入進行後續 GET/PROPFIND 比較以驗證。請參閱 references/webdav-publish-mode.md。
  6. 驗證:提取即時路由,確認服務的位元組與本機 generated/ 檔案相符(僅允許空白/屬性順序差異,與管線自身的第一階段驗證使用相同的容差),確認 assets/site.css/theme.js 以正確的 MIME 類型載入。
  7. 報告確切發生的事:路由是引導的還是重複使用的、已發佈的檔案及其 DAV 路徑、驗證結果——或者,如果缺少憑證,則報告可部署套件的位置以及明確聲明即時發佈未發生。

模式參考

  • 對於路由引導和 isql TLS/WebID 語法,請閱讀 references/isql-route-mode.md。
  • 對於 WebDAV 發佈及其範圍邊界,請閱讀 references/webdav-publish-mode.md。
  • 對於管線邊界(此技能在 rdf/ 中觸碰和不觸碰的內容),請閱讀 references/rdf-content-mode.md。
  • 對於為何未選擇即時 SPARQL/VSP 渲染,請閱讀 references/webdav-website-engine-gate.md。
  • 對於可由代理呼叫的操作,請閱讀 references/opal-tool-mode.md——尚未在 v1 中實作;已記錄為擴充點。

實務護欄

  • 切勿在抑制警告或使用 --skip-validate 風格的捷徑下執行 rdf/build.py 的 SHACL 驗證;失敗的門檻意味著內容尚未準備好發佈,而不是需要繞過的障礙。
  • DB.DBA.DAV_RES_UPLOAD_STRSES_INT(如果用於任何非靜態檔案步驟)需要透過 http(content, stream) 填充的 string_output() 串流,而不是純字串。
  • 避免在透過 isql 載入的任何 SQL 中使用 $1、$2 和類似的符號;它們可能觸發巨集代換。
  • 靜態檔案 VHOST_DEFINE 使用 is_dav=>1、is_brws=>0、def_page=>'index.html'——除非真的存在 VSP 入口點,否則不要設定 def_page=>'index.vsp';指向不存在 VSP 資源的 def_page 將提供原始原始碼或 404,而不是網站。
  • 在重新定義之前,刪除同一主機/路徑的任何先前的衝突 VHOST_DEFINE,與 weblog-from-webdav 的路由移除-然後-重新定義模式相同。
  • 將持有憑證的身分和受委派的主體視為兩個獨立的事實:-X/--cert 識別呼叫代理,-W/On-Behalf-Of 識別應評估其 ACL 權限的 WebID 主體。
  • 切勿將憑證寫入技能、產生的 SQL、日誌或提交的檔案中。
  • 遠端上傳和移除遵循相同的 HTTP → WebDAV → iSQL 順序和主體 PKCS#12 模式(howto/remote-webdav-upload.ttl、howto/remote-resource-removal.ttl,偏好設定步驟 215–216)。URIBurner 的寫入/刪除操作前往埠 5443。在 PUT 之後分別報告 :5443 GET 和公開 443 GET;在 DELETE 之後,先驗證使用者命名的 URL、斜線變體、:5443 GET 和資料夾列表,再聲稱移除完成。

安全的 Virtuoso ISQL 錯誤輸出

每當此工作流程呼叫 OpenLink 的原生 Virtuoso isql 用戶端時,請傳遞 bare 用戶端選項 COMMAND_TEXT_ON_ERROR=OFF,例如 isql {host}:{port} {user} {password} COMMAND_TEXT_ON_ERROR=OFF {script.sql}。將其放在 SQL 輸入、腳本參數或 -i 之前。OFF 對應於用戶端內部值 0,可防止用戶端將失敗的完整命令附加到錯誤輸出。用戶端接受 OFF/ON;不接受字面值 0。請勿使用 -u 來設定此選項(-u 會填入 U 引數陣列)。這不會從伺服器診斷、shell 歷史記錄或程序引數中刪除機密資訊,因此請將憑證保留在 SQL 文字和日誌之外。請勿將此 Virtuoso 特有的選項套用於 unixODBC/iODBC isql 用戶端。

相關技能