Communitygithub.com

OpenLinkSoftware/ai-agent-skills - 웹사이트 WebDAV 배포

RDF-Turtle + SHACL + Jinja2 파이프라인(예: sites/openlink/rdf/build.py)으로 생성된 정적 HTML/CSS/JS 웹사이트를 Virtuoso WebDAV 루트에 게시하고 isql/VHOST_DEFINE을 통해 공개 경로를 매핑합니다.

ai-agent-skills - 웹사이트 WebDAV 배포란 무엇인가요?

이 스킬은 이미 구축된 정적 웹사이트(HTML/CSS/JS)를 Virtuoso의 WebDAV 저장소에 배포하고 공개 URL 경로를 설정하는 데 사용됩니다. RDF-Turtle + SHACL + Jinja2 파이프라인(예: sites/openlink/rdf/build.py)의 출력물을 `generated/` 폴더에서 가져와 WebDAV PUT과 VHOST_DEFINE을 통해 라이브 서비스에 반영합니다. 이 스킬은 콘텐츠 생성(RDF 편집, SHACL 검증, Jinja2 렌더링)을 수행하지 않으며, 오직 '사전 생성된 정적 파일을 WebDAV에 게시하고 경로를 매핑하는' 작업에 집중합니다. 주요 사용 사례로는 '이 사이트를 WebDAV에 게시', '생성된 사이트를 배포', 'WebDAV 루트에서 초기 OpenLink 사이트 설정', '이 사이트가 라이브인지 확인' 등의 요청이 포함됩니다. 배포 자격 증명이 없으면 라이브 게시 대신 배포 가능한 번들(파일, SQL 스크립트, README)을 생성합니다. Claude Code, Cursor, Codex 등 다양한 AI 에이전트 플랫폼에서 사용할 수 있으며, 참조 문서(references/ 디렉토리)를 통해 세부 모드(WebDAV 게시, iSQL 경로 설정, RDF 콘텐츠 경계)를 안내합니다.

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

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

WebDAV를 통한 웹사이트 배포

이 스킬은 이미 생성된 정적 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 필요)인지, 아니면 기존 경로에 대한 콘텐츠만 재게시하는 것(경로 구성은 건드리지 않고 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를 통해 게시합니다. generated/*.html 및 assets/*를 재귀적으로 PUT하고, 각 쓰기를 후속 GET/PROPFIND 비교로 확인합니다. references/webdav-publish-mode.md를 참조하십시오.
  6. 확인: 라이브 경로를 가져오고, 제공된 바이트가 로컬 generated/ 파일과 일치하는지 확인합니다(공백/속성 순서 차이만 허용, 파이프라인 자체의 Phase 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, 환경설정 단계 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 클라이언트에 적용하지 마십시오.

관련 스킬