Communitygithub.com

WebDAVからのWebサイト公開

RDF-Turtle + SHACL + Jinja2パイプライン(例:sites/openlink/rdf/build.py)で生成された静的なHTML/CSS/JSサイトをVirtuoso WebDAVルートに公開し、isql/VHOST_DEFINE経由で公開ルートをマッピングします。

WebDAVからのWebサイト公開 とは?

このスキルは、RDF-Turtle、SHACL、Jinja2パイプライン(例:sites/openlink/rdf/build.py)によって事前に生成された静的なHTML/CSS/JSサイトを、Virtuoso WebDAVルートに公開するために設計されています。公開後、isqlのVHOST_DEFINEを使用して公開ルートをマッピングし、サイトにアクセスできるようにします。主なユースケースは、すでに構築済みのOpenLinkスタイルのポートフォリオサイトをWebDAVターゲットにデプロイまたは更新すること、生成されたコンテンツがライブルートで提供されていることを確認すること、またはライブ認証情報が利用できない場合にデプロイ可能なバンドルを生成することです。「このサイトをWebDAVに公開して」「生成されたサイトをデプロイして」「WebDAVルートから初期OpenLinkサイトを設定して」「このサイトはライブですか」などのフレーズでトリガーされます。このスキルはRDFコンテンツの作成や編集、SHACL/Jinja2パイプラインの内部ロジックの実行、SPARQLからのライブページレンダリングは行いません。これらの境界についてはreferences/rdf-content-mode.mdを参照してください。このスキルはClaude Code、Cursor、CodexなどのAIエージェント向けに設計されており、開発者が静的に生成されたサイトを迅速に本番環境にデプロイできるようにします。

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

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

WebDAVからのWebサイト公開 は何をしますか?

このスキルを使用して、静的に生成済みの HTML/CSS/JSサイト(RDF-Turtle + SHACL + Jinja2パイプライン、例:sites/openlink/rdf/build.pyの出力)をVirtuoso WebDAVルートに公開し、マッピングされた公開ルートを設定します。サイトのコンテンツモデル(オントロジー、SHACLシェイプ、順序付け)はこのスキルの上流で作成および検証されます。このスキルの役割は、「ここに完成したHTMLが入ったgenerated/フォルダがあります。これをライブ公開してください」という段階から始まります。

これはweblog-from-webdavやosdi-inclusion-engineよりも意図的に範囲が狭くなっています。これらのスキルはリクエストごとにコンテンツをライブレンダリングします(カスタムVSP内でのWebDAVコレクション列挙、またはWebDAVソースのHTMLをラップする共有XSLTスキン)。このスキルのコンテンツは到着前に完全にレンダリングされています。公開はプレーンな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/)。
  • IDモード:SQLユーザー名/パスワード、isql WebID-TLS、WebID-TLS + 委任、WebDAVユーザー名/パスワード、WebDAV mTLS、またはWebDAV mTLS + On-Behalf-Of。
  • 初回のルートブートストラップ(isql + deploy-website-route.sqlが必要)か、既存ルートへのコンテンツのみの再公開か(references/webdav-publish-mode.mdのスコープ外の境界により、WebDAV公開のみ — ルート設定には一切触れません)。

ワークフロー

  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をクエリします)。存在しない場合はブートストラップします:実際のDAVパス/ルート/タイトルでtemplates/deploy-website-route.sqlを修正し、isqlで実行します。references/isql-route-mode.mdを参照してください。
  4. 公開前にscripts/validate_generated_website_bundle.pyでバンドルを検証します。これはブロッキングです。
  5. scripts/publish_static_bundle.pyを使用してWebDAV経由で公開します — generated/*.htmlとassets/*を再帰的にPUTし、後続のGET/PROPFIND比較で各書き込みを検証します。references/webdav-publish-mode.mdを参照してください。
  6. 検証:ライブルートをフェッチし、提供されたバイトがローカルのgenerated/ファイルと一致することを確認します(空白/属性順序の違いのみを許可し、パイプラインのフェーズ1検証と同じ許容範囲)。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のルート削除→再定義パターンと同じです。
  • 証明書を持つIDと委任されたプリンシパルは別個の事実として扱ってください:-X/--certは呼び出しエージェントを識別し、-W/On-Behalf-OfはACL権限を評価するWebIDプリンシパルを識別します。
  • 認証情報をスキル、生成されたSQL、ログ、またはコミットされたファイルに決して書き込まないでください。
  • リモートアップロードと削除は、同じHTTP → WebDAV → iSQLの順序とプリンシパルPKCS#12パターン(howto/remote-webdav-upload.ttl、howto/remote-resource-removal.ttl、prefs Steps 215–216)に従います。URIBurnerへの書き込み/削除はポート5443に送信します。PUT後は:5443 GETとパブリック443 GETを別々に報告してください。DELETE後は、ユーザーが指定したURL、スラッシュバリアント、:5443 GET、およびフォルダリストを確認してから削除を主張してください。

安全なVirtuoso ISQLエラー出力

このワークフローがOpenLinkのネイティブVirtuoso isqlクライアントを呼び出すときは常に、ベアクライアントオプション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引数配列を設定します)。これはサーバー診断、シェル履歴、またはプロセス引数からシークレットを編集するものではありませんので、認証情報をSQLテキストやログから遠ざけてください。このVirtuoso固有のオプションをunixODBC/iODBC isqlクライアントに適用しないでください。

関連スキル