커스텀 에디터
어떤 업무는 어느 패널에도 없습니다. 오직 여러분만의 업무이기 때문입니다. 공급업체 공식에 따른 자체 가격 재계산, 외부 회계 시스템과의 카탈로그 대조, “한 번에 배치 특성 채우기” 화면 같은 것들입니다. “커스텀 에디터” 섹션에서는 이런 미니 에디터를 직접 작성하거나(또는 주문 제작하거나) 관리자 페이지 내부에서 실행할 수 있습니다. 샌드박스 안에서, 여러분이 허용한 데이터에만 정확히 접근하는 방식으로 말입니다.
열기: 관리자 패널 → 커스텀 에디터 (admin.cenaly.com/custom-editors). 이 섹션은 앱 스토어의 “커스텀 에디터 (SDK)” 카드로 활성화되며, 기본적으로 숨겨져 있습니다. 페이지 자체의 “📌 사이드바에 추가” 버튼을 누르면 자주 필요할 때 측면 메뉴에 표시됩니다.
이 섹션은 무엇인가요#
플러그인은 빌드된 스크립트(index.js)와 그 설명(manifest.json)입니다. 패널은 스크립트를 격리된 프레임에 로드합니다. 이 프레임은 여러분의 세션에도, 관리자 페이지 코드에도, 네트워크에도 접근할 수 없습니다. 데이터와 대화하는 방법은 오직 브리지를 통해서이며, 브리지는 허용된 요청의 집합으로 각 요청은 부여된 권한에 따라 검증됩니다.
페이지는 다음 블록으로 구성됩니다:
| 블록 | 내용 |
|---|---|
| 설치된 에디터 | 플러그인 카드: 이름, “버전”, “권한”, “배치 위치”, “허용된 네트워크 호스트”, “업데이트됨”, 출처(저장소 및 태그 링크). 동작: “열기”, “활성화” / “비활성화”, 업데이트 확인, “삭제” |
| 에디터 설치 | 디스크의 파일에서 설치 |
| GitHub에서 설치 | 공개 저장소 주소와 태그로 설치 |
| 🤖 AI로 개발 (바이브 코딩) | 프로젝트 템플릿, AI 에이전트용 프롬프트, 테스트 데이터로서의 카탈로그 스냅샷 |
| 👩💻 개발자 접근 | 개발자 모드에 대한 하청업체의 임시 권한 |
| 🛠️ 개발자 모드 | 설치 없이 여러분의 컴퓨터에서 직접 플러그인 실행 |
열린 에디터는 전체 화면을 차지하며, 페이지 주소에는 ?app=<식별자> 표시가 붙습니다. 이 링크는 접근 권한이 있는 사람과 공유할 수 있습니다.
실행에 필요한 것#
| 항목 | 이유 |
|---|---|
| 앱 스토어의 “커스텀 에디터 (SDK)” 카드 | 이 섹션은 틈새 기능이며 기본적으로 꺼져 있습니다 |
| 여러분이 계정 소유자여야 함 | 플러그인 설치, 활성화, 삭제 및 권한 부여는 소유자만 할 수 있습니다. 직원은 읽기 전용 목록만 볼 수 있습니다 |
빌드된 플러그인: index.js + manifest.json |
여러분이 만든 것, 개발자가 만든 것, 또는 공개 GitHub 저장소의 릴리스 |
| 개발용 — 개발자를 위한 직원 계정 | 개발자 모드는 해당 개발자의 업무 로그인 이메일로 부여됩니다 |
1단계. 누가 에디터를 작성할지 결정하기#
세 가지 경로가 있으며, 코드를 누가 보유하는지가 다릅니다:
| 경로 | 적합한 대상 | 방법 |
|---|---|---|
| 우리 템플릿을 사용하는 AI 에이전트 | 과제를 말로 설명할 준비가 된 소유자 | “AI로 개발” 블록: 템플릿 + 프롬프트 → 에이전트가 릴리스 빌드 → 여러분이 설치 |
| 자체 또는 고용 개발자 | 하청업체나 팀 내 개발자가 있는 경우 | 개발자 모드 권한을 부여하면 실제 계정에서 작성 및 디버깅하고, 여러분은 완성된 릴리스를 설치 |
| GitHub의 기성 릴리스 | 플러그인이 이미 작성된 경우(여러분 또는 여러분을 위해) | “GitHub에서 설치”: 저장소 주소와 태그 |
세 가지 경우 모두 설치는 소유자의 몫입니다. 권한을 받은 개발자라도 자신의 코드를 개발자 모드에서 실행할 수 있을 뿐, 계정에 설치할 수는 없습니다.
2단계. AI로 개발 (바이브 코딩)#
“🤖 AI로 개발 (바이브 코딩)” 블록은 AI 에이전트(Claude Code, Cursor 등)에게 과제를 넘기고 계약을 처음부터 설명하지 않기 위한 네 가지를 제공합니다:
- “⬇️ 프로젝트 템플릿 다운로드 (zip)” — 플러그인의 기성 골격: 매니페스트, 진입점, 계약 설명(
GUIDE.en.md) 및 에이전트용 지침. 아카이브는 브라우저에서 바로 생성되며, 외부에서 아무것도 다운로드할 필요가 없습니다. - “📋 에이전트용 프롬프트 복사” — 영어로 된 과제 텍스트: 템플릿에서 시작하고, 가이드와 대조하며, 결과를 무엇으로 검증할지.
- 에이전트용 도구 세트 구성 — 이를 통해 에이전트는 플러그인을 빌드하고, 샌드박스의 로컬 스탠드 복사본을 띄우고, 스크린샷과 상태 스냅샷을 찍고, 마지막에 릴리스를 빌드합니다: 수동 설치용 zip 또는 GitHub 릴리스.
- “⬇️ 카탈로그 스냅샷 다운로드 (테스트 픽스처)” — 여러분의 카테고리와 항목을 파일로 제공하여 에이전트가 지어낸 데이터가 아닌 실제 데이터로 테스트할 수 있게 합니다.
⚠️ 스냅샷에서 다른 플러그인의 커스텀 필드는 전부 잘려 나갑니다. 다른 확장 프로그램이 여러분의 카드에 저장한 데이터는 픽스처와 함께 계정을 떠나지 않습니다.
3단계. 에디터 설치#
파일에서. “에디터 설치” 블록: “번들 (index.js)”과 “매니페스트 (manifest.json)”를 선택 → “확인 후 설치”. 패널은 먼저 매니페스트를 검사합니다 — 식별자, 현지화된 이름, 버전, 최소 SDK 버전, 배치 위치, 권한 및 네트워크 호스트 목록 — 그런 다음 동의를 표시합니다: “이 에디터가 요청하는 항목:”과 사람이 읽을 수 있는 권한 목록. “설치”를 누르기 전까지는 아무것도 설치되지 않습니다.
GitHub에서. “GitHub에서 설치” 블록: “저장소 (URL 또는 owner/repo)” 필드, “태그 (비어 있으면 최신 릴리스)” 필드, “저장소 확인” 버튼. 규칙은 간단합니다: 저장소 루트에 manifest.json, 태그에 빌드된 dist/index.js, 태그 형식은 v{버전}. 매니페스트와 번들은 여러분의 브라우저에서 직접 가져옵니다. 두 경우 모두 설치 시 **번들 지문(sha256)**이 계산되고 기억됩니다. 나중에 파일이 바뀌면 실행이 차단되고, 패널은 에디터를 재설치하도록 요청합니다.
권한 및 배치 위치#
권한(스코프라고도 합니다)은 플러그인이 매니페스트에서 요청하고, 설치 시 사용자가 확인합니다. 전체 목록은 다음과 같으며, 브리지는 이 이상 아무것도 할 수 없습니다:
| 권한 | 열리는 항목 |
|---|---|
| 카탈로그 읽기 | 카테고리, 항목, 속성 및 카드의 커스텀 필드 |
| 카탈로그 항목 생성 및 수정 | 항목 생성 및 편집, 배치 가져오기, 자체 필드 및 속성 정의 |
| 지점별 가격, 판매 가능 여부 및 판매 중지 목록 변경 | 지점 메뉴의 패널이 하는 것과 동일 |
| 창고 상품 목록 읽기 | 읽기 전용 창고의 품목 |
| 자체 설정을 사용자의 저장소에 보관 | 사용자 계정에 플러그인 자체 키 저장(키당 최대 1 MB) |
| 확장 프로그램의 서버 측 부분 | 당사 서버에서 플러그인 코드 호출 — 인터넷에 접속하는 유일한 방법 |
목록에 전혀 없는 것은 어떤 설정으로도 플러그인이 받을 수 없습니다: 고객 및 거래처, 주문, 영수증, 재무, 직원, 메시지 및 통화는 브리지가 제공하지 않습니다.
배치 위치(슬롯)는 세 가지입니다:
| 슬롯 | 나타나는 위치 |
|---|---|
| 자체 페이지 | "커스텀 에디터" 섹션 내 항목, 전체 화면으로 열림 |
| 카탈로그 페이지의 버튼 | 항목 카탈로그 옆의 도구 |
| "창고" 섹션 탭 | 플러그인이 창고 탭으로 그려짐 — 당사의 내장 확장 프로그램 "VetIS"가 이렇게 포장되어 있습니다 |
개발자 모드 및 외주 업체 접근#
개발자 모드("🛠️ 개발자 모드" 블록)는 사용자의 컴퓨터에서 실시간으로 플러그인을 마운트합니다: "번들 URL" 필드는 localhost / 127.0.0.1 주소만 허용하며, 옆에 "매니페스트 JSON", "dev 세션 시작" 버튼이 있습니다. 이때 지문은 고정되지 않으며 세션은 탭을 닫을 때까지 유지됩니다; "dev 세션 중지"는 즉시 세션을 끕니다.
개발자 권한 부여("👩💻 개발자 접근" 블록)는 소유자가 아닌 사람이 작성할 때 필요합니다. 개발자에게 일반 직원 계정을 만들고, 소유자가 권한을 부여합니다: "개발자 이메일(해당 staff 로그인)", "허용된 권한", "유효 기간(일)" 및 선택적 메모 → "접근 권한 부여". 언제든지 "회수" 버튼으로 회수할 수 있습니다.
권한 부여가 제공하는 것과 제공하지 않는 것:
- 제공 — 사용자가 체크한 권한으로 개발자 모드만 (기본 기간 14일, 최대 90일);
- 권한은 교집합으로 잘립니다: 매니페스트가 요청한 것 그리고 권한 부여로 부여된 것; 플러그인은 매니페스트에서 요청하더라도 초과분을 받지 못합니다;
- 제공하지 않음 — 플러그인 설치, 활성화 및 삭제: 이는 소유자에게 남습니다.
업데이트, 활성화 및 삭제#
| 작업 | 방법 |
|---|---|
| 열기 | 카드의 "열기" 버튼(또는 ?app=… 링크) |
| 일시적으로 끄기 | "끄기" — 플러그인은 설치된 상태로 남지만 실행되지 않고 해당 위치에 표시되지 않습니다 |
| 업데이트 | GitHub의 플러그인은 "업데이트 확인" 후 "…(으)로 업데이트"; 버전이 최신이면 패널이 "최신 버전이 설치되어 있습니다"라고 표시합니다. 파일에서 설치한 플러그인은 재설치로 업데이트됩니다 |
| 삭제 | 확인과 함께 "삭제": 설정과 항목이 제거되고, 업로드된 릴리스는 저장소에 남습니다 |
자동 업데이트는 의도적으로 없습니다: 타사 코드의 새 버전은 새로운 지문이며, 아마도 새로운 권한이므로 업데이트는 항상 소유자의 의식적인 행동입니다.
내장 확장 프로그램#
당사의 일부 자체 모듈은 동일한 형식으로 포장되어 있습니다 — 동작으로 알 수 있지만, 설치할 필요는 없습니다: 패널과 함께 제공되며 이 섹션이 아니라 앱 스토어의 카드로 활성화됩니다.
현재 이러한 모듈은 하나입니다 — 러시아용 "Mercury/VetIS": 창고 섹션의 탭으로 존재하며, 동일한 샌드박스와 동일한 지문 검사로 실행됩니다. 내장 확장 프로그램은 설치된 에디터 목록에 포함되지 않습니다.
에디터가 할 수 있는 것과 할 수 없는 것#
| 할 수 있음 | 할 수 없음 |
|---|---|
| 부여된 권한 범위 내에서 카탈로그 읽기 및 변경 | 비밀번호를 알아내거나 사용자의 세션을 이용 |
| 자체 인터페이스, 알림 및 확인 요청 표시 | 주변의 관리자 코드나 데이터 열기 |
| 패널의 기본 항목 에디터 열기 | 플러그인 창에서 인터넷에 직접 접속 |
| 사용자 계정에 자체 설정 보관 | 사용자의 카드에서 다른 플러그인의 데이터 보기 |
| 서버 측 부분을 통해 인터넷 접속 — 매니페스트에 나열된 https 주소로만 (최대 8개) | 파일 교체 후 실행: 지문 불일치 시 실행 차단 |
타사 플러그인은 카드에 경고로 표시됩니다: "샌드박스 내 타사 앱 — 비밀번호를 절대 묻지 않습니다." 플러그인이 패널 로그인, 결제 데이터 또는 SMS 코드를 요청하면 이는 확장 프로그램의 작업이 아니라 사기입니다.
제한 사항#
- 이 섹션은 기본적으로 꺼져 있으며 코드를 작성하는 사람(또는 코드 작성을 의뢰하는 사람)을 위한 것입니다. 일반 사업주가 여기서 할 일은 없습니다.
- 조회를 제외한 모든 작업은 계정 소유자만 가능합니다. 직원은 허브를 읽기 전용으로 보며, 개발자 모드는 유효한 권한 부여가 있을 때만 사용할 수 있습니다.
- 비공개 GitHub 리포지토리는 지원되지 않습니다. 리포지토리는 공개여야 하며, 설치는 태그를 기준으로 진행됩니다.
- 자동 업데이트는 없습니다. 플러그인 업데이트는 항상 소유자가 실행합니다.
- 타사 플러그인 스토어는 없습니다. 완성된 확장 기능은 패널을 통해 게시되거나 판매되지 않으며, 소스는 본인의 파일 또는 본인의 리포지토리뿐입니다.
- 슬롯은 세 개(자체 페이지, 카탈로그 버튼, 창고 탭)이며, 플러그인이 패널의 임의 화면에 삽입될 수는 없습니다.
- 브리지는 고객, 주문, 재무, 직원, 메시지를 제공하지 않습니다. 권한으로 이를 우회할 수는 없으며, 그러한 요청 자체가 존재하지 않습니다.
- "플러그인이 무엇을 했다"는 별도의 로그는 없습니다. 권한은 카드에 표시되며, 카탈로그 수정은 일반 항목 이력에 기록됩니다. 통제가 필요하다면 읽기 전용 권한만 부여된 플러그인부터 시작하십시오.
- 기술적 상한: 번들은 최대 4 MB, 매니페스트의 네트워크 주소는 최대 8개, 저장소 키 하나당 최대 1 MB, 서버 실행은 최대 30초이며 한 번에 최대 50건의 인터넷 요청이 가능합니다.
- 플러그인 데이터는 본인 브랜드의 클라우드에 남습니다.
cenaly.ru계정의 경우 서버 측 상태는 러시아 관할 구역에 저장됩니다.
문제 해결#
| 증상 | 확인 사항 |
|---|---|
| 메뉴에 섹션이 없음 | 앱 스토어에서 "커스텀 에디터(SDK)" 카드가 활성화되어 있는지, "📌 사이드바로 보내기" 버튼으로 섹션을 꺼내 두었는지 |
| 직원에게 설치 버튼이 보이지 않음 | 의도된 동작입니다. 설치, 삭제, 권한 부여는 계정 소유자만 가능합니다 |
| "저장소의 번들이 설치된 지문과 일치하지 않습니다. 실행이 차단되었습니다" | 설치 후 플러그인 파일이 교체되었습니다. 새 지문을 기록하려면 에디터를 재설치하십시오 |
| "에디터가 제때 실행되지 않았습니다 (10초 내 connect() 없음)" | 플러그인이 연결되지 않았습니다. 코드에 오류가 있거나 잘못된 파일이 빌드되었습니다 |
| "에디터 번들을 불러오지 못했습니다" | 릴리스에 접근할 수 없거나 파일이 손상되었습니다. 재설치하십시오 |
?app=… 링크로 이동할 때 "에디터를 찾을 수 없거나 꺼져 있습니다" |
플러그인이 삭제되었거나 카드에서 꺼져 있습니다 |
| "GitHub에서 에디터를 가져오지 못했습니다" | 리포지토리가 비공개이거나, 루트에 manifest.json이 없거나, 태그에 dist/index.js가 없거나, 태그가 v{버전} 규칙에 맞지 않게 명명되었습니다 |
| "localhost / 127.0.0.1 주소만 허용됩니다" | 개발자 모드는 의도적으로 외부 주소를 받지 않습니다. 빌드를 로컬에서 실행하십시오 |
| 플러그인이 필요한 데이터를 보지 못함 | 카드의 "권한"을 확인하십시오. 권한 부여를 받은 개발자의 권한은 부여 범위와의 교집합으로 추가로 제한됩니다 |
| 플러그인이 외부 서비스에 접근할 수 없음 | 샌드박스에서는 직접 네트워크 접근이 없습니다. 서버 측에서 요청해야 하며, 주소는 매니페스트에 있어야 합니다 |
| "에디터가 저장되지 않은 변경 사항을 알립니다. 그래도 닫으시겠습니까?" | 플러그인이 초안을 알린 것입니다. 닫기 전에 플러그인 안에서 작업을 저장하십시오 |
자주 묻는 질문#
프로그래밍을 할 줄 알아야 하나요?#
완성된 릴리스를 설치하는 데는 필요하지 않습니다. 릴리스 자체를 만드는 데는 필요합니다. 릴리스는 개발자 또는 "AI로 개발" 블록의 템플릿에 따라 AI 에이전트가 작성합니다. 이 섹션은 코드를 위한 도구이며, "마우스"로 만드는 빌더가 아닙니다.
타사 플러그인이 제 고객이나 매출을 볼 수 있나요?#
아니요. 플러그인은 샌드박스에서 작동하며 브리지를 통해서만 데이터를 받습니다. 브리지가 할 수 있는 일은 정확히 여섯 가지입니다. 카탈로그, 가격 및 판매 중지 목록, 창고 대장, 자체 저장소, 자체 서버 측 호출, 인터페이스 요소. 고객, 주문, 영수증, 재무, 직원, 메시지는 원칙적으로 없습니다. 특정 플러그인에 허용된 내용은 항상 해당 카드의 "권한" 행에서 확인할 수 있습니다.
하청업체에 개발을 맡기면서 계정 전체에 접근하지 못하게 하려면 어떻게 하나요?#
직원 계정을 만들어 준 뒤 "개발자 접근" 블록에서 권한을 부여하십시오. 필요한 권한만 선택하고 기간을 설정하십시오(기본 14일, 최대 90일). 하청업체는 개발자 모드만 얻게 되며 그 외에는 아무것도 없습니다. 플러그인 설치는 여전히 본인이 담당합니다. 권한 부여는 버튼 하나로 취소됩니다.
작성자가 새 버전을 출시하면 플러그인이 자동으로 업데이트되나요?#
아니요. 업데이트는 소유자가 실행합니다. "업데이트 확인" → "…(으)로 업데이트". 이렇게 하면 사람이 모르는 사이에 새 버전이 계정에 나타나지 않습니다. 버전과 함께 요청 권한도 바뀔 수 있기 때문입니다.
플러그인은 설정과 데이터를 어디에 저장하나요?#
본인 계정의, 해당 식별자 아래 별도 저장소에 저장됩니다(키당 최대 1 MB). 또한 플러그인이 사용하는 경우 본인 카드의 커스텀 필드에도 저장됩니다. 각 플러그인은 자신의 공간만 봅니다. cenaly.ru 계정의 경우 서버 측과 그 상태는 러시아 관할 구역에 남습니다.
API 및 MCP와 무엇이 다른가요?#
개발자용 API와 자체 PBX의 MCP는 프로그램이 외부에서 작동할 때 필요합니다. 자체 웹사이트, 타사 계정 시스템, AI 에이전트 등입니다. 반대로 커스텀 에디터는 패널 내부의 인터페이스입니다. 직원이 일반 관리자 페이지처럼 열며 작업 창을 벗어나지 않습니다.
관련 섹션#
- 앱 스토어 — 섹션과 내장 확장 기능을 활성화하는 곳
- 창고 — "VetIS" 같은 확장 기능이 있는 탭과 상품 대장
- 카탈로그 가져오기 — 이것만이 목적일 때 항목을 업로드하는 기본 경로
- 자체 코드로 만드는 쇼케이스 (headless) — 외부 사이트를 위한 공개 데이터 계약
- API 및 자체 PBX의 MCP와 AI 에이전트용 Guest API — 패널 내부가 아닌 외부에서의 작업
- 직원 및 근무 — 개발자용 계정과 역할
- 보안 및 데이터 — 데이터가 저장되는 위치와 접근 권한을 가진 사람
- 지원 — 플러그인이 의심스럽게 동작할 때 문의할 곳