@clack-platform/cli 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -3
- package/dist/cli.js +221 -6
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -63,7 +63,7 @@ clack login --resume --env dev # 발급 당시와 같은 환경이어야 한
|
|
|
63
63
|
| 크리에이터 채널 | `channel get/create/update`, `channel post list/get/create/update/delete`, `channel series list/create/update/delete` |
|
|
64
64
|
| 이미지 | `upload <파일...>` |
|
|
65
65
|
| 설정 | `config get`, `config set <키> <값>` |
|
|
66
|
-
| HTML 콘텐츠 | `content config/list/status/create/upload/complete/preview/submit/withdraw/publish/unpublish` |
|
|
66
|
+
| HTML 콘텐츠 | `content config/list/status/create/update/upload/complete/info-version/preview/submit/withdraw/publish/unpublish` |
|
|
67
67
|
| 에이전트 연결 | `mcp config`, `skills` |
|
|
68
68
|
| 스킬 패키지·관리 | `skill validate`, `skill pack`, `skill editor dev`, `skill push`, `skill complete`, `skill submit`, `skill list`, `skill get`, `skill form`, `skill status`, `skill cancel`, `skill release`, `skill deprecate` |
|
|
69
69
|
| 콘텐츠 서버 키(platform:read/write) | `content server-keys list/revoke` (발급·회전은 크리에이터 센터 전용) |
|
|
@@ -138,7 +138,7 @@ clack skills --json
|
|
|
138
138
|
|
|
139
139
|
환경변수 참조 형식은 [Claude Code MCP 문서](https://code.claude.com/docs/en/mcp#environment-variable-expansion-in-mcp-json)와 [Codex MCP 문서](https://developers.openai.com/codex/mcp/)를 따른다. 다른 클라이언트는 해당 제품의 Streamable HTTP·인증 헤더 지원을 확인한다.
|
|
140
140
|
|
|
141
|
-
원격 MCP는 프로필·상품·게시글·채널 도구 외에 스킬 목록·상세·업로드(`create_skill`→`request_skill_version_upload`→`complete_skill_version`)·심사 제출·공개(`submit_skill_version`, `release_skill_version`, `get_skill_version`), 승인된 HTML 콘텐츠 공개(`publish_creator_content`), 공유 문서 조회·숨김·삭제(`list_shared_documents`, `hide_shared_document`, `delete_shared_document` 등)도 제공한다. 각 도구는 해당 스코프(`skill:*`, `creator-content:publish`, `platform:read`/`platform:write`)를 가진 토큰에만 노출되며, 파괴적 도구는 `confirm:true` 전에는 미리보기만 반환한다. 원격 MCP는 로컬 파일을 읽지 못하므로 스킬 ZIP 전송은 `clack skill push` 또는 로컬 플랫폼 MCP의 `platform_skill_push`를 사용한다.
|
|
141
|
+
원격 MCP는 프로필·상품·게시글·채널 도구 외에 스킬 목록·상세·업로드(`create_skill`→`request_skill_version_upload`→`complete_skill_version`)·심사 제출·공개(`submit_skill_version`, `release_skill_version`, `get_skill_version`), HTML 콘텐츠 정보 수정·정보만 새 버전(`update_creator_content`, `create_creator_info_version`), 승인된 HTML 콘텐츠 공개(`publish_creator_content`), 공유 문서 조회·숨김·삭제(`list_shared_documents`, `hide_shared_document`, `delete_shared_document` 등)도 제공한다. 각 도구는 해당 스코프(`skill:*`, `creator-content:write`·`creator-content:publish`, `platform:read`/`platform:write`)를 가진 토큰에만 노출되며, 파괴적 도구는 `confirm:true` 전에는 미리보기만 반환한다. 원격 MCP는 로컬 파일을 읽지 못하므로 스킬 ZIP 전송은 `clack skill push` 또는 로컬 플랫폼 MCP의 `platform_skill_push`를 사용한다.
|
|
142
142
|
|
|
143
143
|
에이전트 스킬은 별도 공개 저장소 [clack-project/skills](https://github.com/clack-project/skills)에서 `npx skills add clack-project/skills`로 설치한다. 모두 10종으로, 일반 계정 관리용 6종(`clack-setup`·`clack-products`·`clack-content`·`clack-channel`·`clack-profile`·`clack-mcp`)과 크리에이터용 4종(`clack-creator-content`·`clack-page`·`clack-skill-package`·`clack-platform-data`)이다. 스킬에 필요한 CLI는 0.1.1 이상이다(`clack-mcp`는 CLI 없이도 쓸 수 있고, 설정 출력에 CLI를 쓸 때는 0.1.0 이상). `clack skills`는 설치를 실행하지 않고 안내만 출력한다. 스킬 목록과 스킬별 요구 CLI 버전도 함께 보여 준다. 스킬 하나만 선택 설치할 때는 `-s clack-products`, 여러 개는 `--skill clack-setup clack-creator-content clack-page`처럼 나열하고, 전역 설치에는 `-g`를 사용한다.
|
|
144
144
|
|
|
@@ -162,7 +162,7 @@ GitHub Actions는 Linux·macOS·Windows × Node 20·22에서 `pnpm check`와 패
|
|
|
162
162
|
|---|---|
|
|
163
163
|
| `config` | 없음(로그인 불필요) |
|
|
164
164
|
| `list`, `status`, `preview` | `creator-content:read` |
|
|
165
|
-
| `create`, `upload`, `complete`, `withdraw` | `creator-content:write` |
|
|
165
|
+
| `create`, `update`, `upload`, `complete`, `info-version`, `withdraw` | `creator-content:write` |
|
|
166
166
|
| `submit` | `creator-content:write`와 `creator-content:publish` 모두 |
|
|
167
167
|
| `publish`, `unpublish` | `creator-content:publish` |
|
|
168
168
|
|
|
@@ -181,6 +181,15 @@ clack content preview --env dev <콘텐츠-UUID> <버전-UUID>
|
|
|
181
181
|
|
|
182
182
|
ZIP에 `clack.content.json` 또는 `.clack/`가 있으면 업로드 전에 선언·경로·크기와 프로필 파일 대응을 확인하고 표준 오류에 경고합니다. 선언이 없는 기존 정적 ZIP도 계속 업로드할 수 있습니다. 경고는 업로드를 막지 않으며 서버의 최종 검증·심사 결과를 대신하지 않습니다. 전송 없이 확인하려면 `content upload ... --dry-run`을 사용하세요.
|
|
183
183
|
|
|
184
|
+
`content update`는 제목·설명·종류·썸네일·메타데이터·태그를 서버 PATCH와 같은 규칙으로 수정합니다(`--title`, `--description`, `--kind`, `--thumbnail-id <썸네일 작업 ID|none>`, `--metadata-mode single|localized`, `--metadata-lang ko|en|none`, `--localized-metadata '<JSON>'|none`, `--tags 쉼표목록`). 지정한 필드만 바뀌고 `--tags`·`--localized-metadata`는 통째 교체됩니다. 단일 메타데이터 모드에서는 제목을 비우면 「제목 없는 콘텐츠」로 표시되고, 언어별(`localized`) 모드에서는 빈 제목을 서버가 거부합니다(400). 썸네일 작업 ID는 `POST /v4/creator/thumbnails` 등으로 발급하며 CLI에는 썸네일 업로드 명령이 없어 보통 `none`(기본 이미지로 되돌리기)만 씁니다. 언어별 메타데이터·태그는 서버 게이트가 켜진 환경에서만 쓸 수 있습니다. 인트로 저장은 개인 액세스 토큰으로 할 수 없어 크리에이터 센터에서만 합니다.
|
|
185
|
+
|
|
186
|
+
`content info-version <콘텐츠-UUID> <버전-UUID>`는 승인·반려된 버전의 번들을 재사용해 바뀐 콘텐츠 정보만 담은 새 초안 버전을 만듭니다(새로 만들면 201, 이미 있던 초안이면 200이며 응답의 `created`로 구분). 새 버전은 앱 확인과 심사를 다시 받아야 합니다. 서버 게이트가 꺼진 환경에서는 `CONTENT_INFO_VERSION_DISABLED`(409)가 반환되며 `clack content config`의 `info_version.enabled`로 확인할 수 있습니다.
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
clack content update --env dev <콘텐츠-UUID> --title "새 제목" --tags 여행,사진
|
|
190
|
+
clack content info-version --env dev <콘텐츠-UUID> <버전-UUID>
|
|
191
|
+
```
|
|
192
|
+
|
|
184
193
|
심사는 승인됐지만 아직 공개하지 않은 버전(크리에이터 센터 등록·게시 중단 후 재공개 등)은 `creator-content:publish` 권한으로 공개합니다. 승인 이력·심사 해시·현재 계정과 권한을 공개 시점에 다시 검사합니다.
|
|
185
194
|
|
|
186
195
|
```bash
|
package/dist/cli.js
CHANGED
|
@@ -39,6 +39,9 @@ function apiError(status, body, retryAfter) {
|
|
|
39
39
|
if (code === "SKILL_VERSION_MAJOR_REQUIRED") {
|
|
40
40
|
message += " clack.skill.json\xB7SKILL.md\uC758 version\uC744 \uC62C\uB824 \uB2E4\uC2DC push\uD558\uC138\uC694. \uAC19\uC740 \uBC84\uC804\uC744 \uD638\uD658\uB418\uAC8C \uACE0\uCCD0 \uC62C\uB9AC\uB824\uBA74 \uBA3C\uC800 clack skill cancel\uB85C \uC774 \uBC84\uC804\uC744 \uC9C0\uC6B0\uC138\uC694.";
|
|
41
41
|
}
|
|
42
|
+
if (code === "CONTENT_INFO_VERSION_DISABLED") message += " clack content config\uC758 info_version.enabled\uAC00 true\uC778 \uD658\uACBD\uC5D0\uC11C\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.";
|
|
43
|
+
if (code === "CONTENT_INFO_UNCHANGED") message += " \uC815\uBCF4\uB97C \uBA3C\uC800 clack content update\uB85C \uC218\uC815\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.";
|
|
44
|
+
if (code === "CONTENT_METADATA_EXTRAS_DISABLED") message += " \uC774 \uD658\uACBD\uC5D0\uC11C\uB294 \uC5B8\uC5B4\uBCC4 \uBA54\uD0C0\uB370\uC774\uD130\xB7\uD0DC\uADF8\uB97C \uC544\uC9C1 \uC4F8 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.";
|
|
42
45
|
if (status === 423 || code === "USER_BANNED") message += " \uACC4\uC815 \uC81C\uD55C \uC0C1\uD0DC\uB97C \uC571\uC5D0\uC11C \uD655\uC778\uD558\uC138\uC694.";
|
|
43
46
|
if (status === 503 && code.endsWith("DISABLED")) message += " \uD604\uC7AC \uC678\uBD80 \uB3C4\uAD6C \uC811\uADFC\uC774 \uC77C\uC2DC \uC911\uB2E8\uB418\uC5C8\uC2B5\uB2C8\uB2E4.";
|
|
44
47
|
const raw = Number(value2.retry_after ?? retryAfter);
|
|
@@ -150,7 +153,7 @@ function redact(value2) {
|
|
|
150
153
|
// package.json
|
|
151
154
|
var package_default = {
|
|
152
155
|
name: "@clack-platform/cli",
|
|
153
|
-
version: "0.
|
|
156
|
+
version: "0.3.0",
|
|
154
157
|
description: "\uD074\uB799 \uACC4\uC815\uC758 \uC0C1\uD488\xB7\uCF58\uD150\uCE20\xB7\uD504\uB85C\uD544\uC744 \uAD00\uB9AC\uD558\uB294 CLI",
|
|
155
158
|
type: "module",
|
|
156
159
|
bin: {
|
|
@@ -2149,6 +2152,55 @@ var createSchema = z8.object({
|
|
|
2149
2152
|
kind: z8.enum(["html", "gallery", "slideshow", "video"]).default("html"),
|
|
2150
2153
|
policy_version: z8.literal("2026-09-22")
|
|
2151
2154
|
}).strict();
|
|
2155
|
+
var METADATA_LANGS = ["ko", "en"];
|
|
2156
|
+
var TAG_PATTERN = /^[\p{L}\p{M}\p{N}_]{1,30}$/u;
|
|
2157
|
+
var localizedEntry = z8.object({
|
|
2158
|
+
title: z8.string().trim().max(120),
|
|
2159
|
+
description: z8.string().trim().max(2e3).optional()
|
|
2160
|
+
}).strict();
|
|
2161
|
+
var updateSchema = z8.object({
|
|
2162
|
+
title: z8.string().trim().max(120).optional(),
|
|
2163
|
+
description: z8.string().trim().max(2e3).optional(),
|
|
2164
|
+
kind: z8.enum(["html", "gallery", "slideshow", "video"]).optional(),
|
|
2165
|
+
thumbnail_id: z8.uuid().nullable().optional(),
|
|
2166
|
+
metadata_mode: z8.enum(["single", "localized"]).optional(),
|
|
2167
|
+
metadata_lang: z8.enum(METADATA_LANGS).nullable().optional(),
|
|
2168
|
+
localized_metadata: z8.partialRecord(z8.enum(METADATA_LANGS), localizedEntry).nullable().optional(),
|
|
2169
|
+
tags: z8.array(z8.string().max(64)).max(50).optional()
|
|
2170
|
+
}).strict().superRefine((value2, ctx) => {
|
|
2171
|
+
const issue = (message) => ctx.addIssue({ code: "custom", message });
|
|
2172
|
+
if (!Object.values(value2).some((entry) => entry !== void 0)) issue("\uBCC0\uACBD\uD560 \uD544\uB4DC\uB97C \uD558\uB098 \uC774\uC0C1 \uC9C0\uC815\uD558\uC138\uC694.");
|
|
2173
|
+
if (value2.tags) {
|
|
2174
|
+
const seen = /* @__PURE__ */ new Set();
|
|
2175
|
+
for (const raw of value2.tags) {
|
|
2176
|
+
const tag = raw.trim().replace(/^#+/, "").trim().normalize("NFC");
|
|
2177
|
+
if (!TAG_PATTERN.test(tag)) issue("\uD574\uC2DC\uD0DC\uADF8\uB294 \uAE00\uC790\xB7\uC22B\uC790\xB7\uBC11\uC904(_)\uB9CC \uC0AC\uC6A9\uD574 1~30\uC790\uB85C \uC785\uB825\uD558\uC138\uC694.");
|
|
2178
|
+
const key = tag.normalize("NFKC").toLowerCase();
|
|
2179
|
+
if (key.length > 40) issue("\uD574\uC2DC\uD0DC\uADF8\uAC00 \uB108\uBB34 \uAE41\uB2C8\uB2E4. \uB354 \uC9E7\uAC8C \uC785\uB825\uD558\uC138\uC694.");
|
|
2180
|
+
seen.add(key);
|
|
2181
|
+
}
|
|
2182
|
+
if (seen.size > 10) issue("\uD574\uC2DC\uD0DC\uADF8\uB294 \uCD5C\uB300 10\uAC1C\uAE4C\uC9C0 \uB4F1\uB85D\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.");
|
|
2183
|
+
}
|
|
2184
|
+
if (value2.metadata_mode === "localized") {
|
|
2185
|
+
if (!value2.metadata_lang) issue("\uC5B8\uC5B4\uBCC4\uB85C \uC785\uB825\uD558\uB824\uBA74 --metadata-lang\uC73C\uB85C \uB300\uD45C \uC5B8\uC5B4\uB97C \uC9C0\uC815\uD558\uC138\uC694.");
|
|
2186
|
+
if (!value2.localized_metadata) issue("\uC5B8\uC5B4\uBCC4\uB85C \uC785\uB825\uD558\uB824\uBA74 --localized-metadata\uB85C \uB300\uD45C \uC5B8\uC5B4 \uC678 \uC5B8\uC5B4\uB97C 1\uAC1C \uC774\uC0C1 \uC9C0\uC815\uD558\uC138\uC694.");
|
|
2187
|
+
}
|
|
2188
|
+
if (value2.localized_metadata) {
|
|
2189
|
+
for (const [lang, entry] of Object.entries(value2.localized_metadata)) {
|
|
2190
|
+
if (entry && !entry.title.trim()) issue("\uC120\uD0DD\uD55C \uBAA8\uB4E0 \uC5B8\uC5B4\uC758 \uC81C\uBAA9\uC744 \uC785\uB825\uD558\uC138\uC694.");
|
|
2191
|
+
if (lang === value2.metadata_lang) issue("\uB300\uD45C \uC5B8\uC5B4\uB294 --title\xB7--description\uC5D0 \uB123\uACE0, \uC5B8\uC5B4\uBCC4 \uAC12\uC5D0\uB294 \uB2E4\uB978 \uC5B8\uC5B4\uB9CC \uB123\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4.");
|
|
2192
|
+
}
|
|
2193
|
+
if (value2.metadata_mode === "single" && Object.keys(value2.localized_metadata).length) issue("\uD55C \uC5B8\uC5B4(single)\uB85C \uC785\uB825\uD560 \uB54C\uB294 \uC5B8\uC5B4\uBCC4 \uAC12\uC744 \uBCF4\uB0BC \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.");
|
|
2194
|
+
}
|
|
2195
|
+
});
|
|
2196
|
+
function jsonOption(name2, value2) {
|
|
2197
|
+
if (value2 === "none") return null;
|
|
2198
|
+
try {
|
|
2199
|
+
return JSON.parse(value2);
|
|
2200
|
+
} catch {
|
|
2201
|
+
throw new CliError(`${name2} \uAC12\uC740 JSON \uAC1D\uCCB4\uC774\uAC70\uB098 none\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.`);
|
|
2202
|
+
}
|
|
2203
|
+
}
|
|
2152
2204
|
async function prepareContentFile(source) {
|
|
2153
2205
|
const file = resolve6(source);
|
|
2154
2206
|
const extension = extname(file).toLowerCase();
|
|
@@ -2218,6 +2270,19 @@ function registerContentCommands(program2, runtime2) {
|
|
|
2218
2270
|
const body = parse(createSchema, { title: opts.title, description: opts.description, kind: opts.kind, policy_version: opts.policyVersion });
|
|
2219
2271
|
await mutate(ctx, "POST", "/v4/creator/contents", body);
|
|
2220
2272
|
});
|
|
2273
|
+
runtime2.action(content.command("update <id>").description("\uCF58\uD150\uCE20 \uC815\uBCF4(\uC81C\uBAA9\xB7\uC124\uBA85\xB7\uC885\uB958\xB7\uC378\uB124\uC77C\xB7\uBA54\uD0C0\uB370\uC774\uD130\xB7\uD0DC\uADF8) \uC218\uC815 (creator-content:write)").option("--title <text>", "\uC81C\uBAA9 (120\uC790 \uC774\uD558, \uBE48 \uAC12\uC774\uBA74 \uC81C\uBAA9 \uC5C6\uC74C)").option("--description <text>", "\uC124\uBA85 (2000\uC790 \uC774\uD558)").addOption(new Option("--kind <kind>", "\uCF58\uD150\uCE20 \uC885\uB958").choices(["html", "gallery", "slideshow", "video"])).option("--thumbnail-id <uuid|none>", "\uC378\uB124\uC77C \uC791\uC5C5 ID, none\uC774\uBA74 \uAE30\uBCF8 \uC774\uBBF8\uC9C0\uB85C \uB418\uB3CC\uB9BC").addOption(new Option("--metadata-mode <mode>", "\uBA54\uD0C0\uB370\uC774\uD130 \uC785\uB825 \uBC29\uC2DD").choices(["single", "localized"])).option("--metadata-lang <ko|en|none>", "\uB300\uD45C \uC5B8\uC5B4").option("--localized-metadata <json|none>", `\uB300\uD45C \uC5B8\uC5B4 \uC678 \uC5B8\uC5B4\uBCC4 \uC81C\uBAA9\xB7\uC124\uBA85 JSON, \uC608: '{"en":{"title":"Title","description":"About"}}'`).option("--tags <list>", "\uD574\uC2DC\uD0DC\uADF8\uB97C \uC27C\uD45C\uB85C \uAD6C\uBD84\uD574 \uD1B5\uC9F8 \uAD50\uCCB4, \uBE48 \uBB38\uC790\uC5F4\uC774\uBA74 \uBAA8\uB450 \uC0AD\uC81C"), async (ctx, [id2], opts) => {
|
|
2274
|
+
const body = parse(updateSchema, {
|
|
2275
|
+
title: opts.title,
|
|
2276
|
+
description: opts.description,
|
|
2277
|
+
kind: opts.kind,
|
|
2278
|
+
thumbnail_id: opts.thumbnailId === void 0 ? void 0 : opts.thumbnailId === "none" ? null : opts.thumbnailId,
|
|
2279
|
+
metadata_mode: opts.metadataMode,
|
|
2280
|
+
metadata_lang: opts.metadataLang === void 0 ? void 0 : opts.metadataLang === "none" ? null : opts.metadataLang,
|
|
2281
|
+
localized_metadata: opts.localizedMetadata === void 0 ? void 0 : jsonOption("--localized-metadata", opts.localizedMetadata),
|
|
2282
|
+
tags: opts.tags === void 0 ? void 0 : csv(opts.tags)
|
|
2283
|
+
});
|
|
2284
|
+
await mutate(ctx, "PATCH", `/v4/creator/contents/${uuid(id2)}`, body);
|
|
2285
|
+
});
|
|
2221
2286
|
runtime2.action(content.command("upload <id> <file>").description("HTML/ZIP \uC5C5\uB85C\uB4DC\uB85C \uC0C8 \uBE44\uACF5\uAC1C \uBC84\uC804 \uC0DD\uC131 (creator-content:write)").addOption(new Option("--header <mode>", "\uD5E4\uB354 \uD45C\uC2DC").choices(["fixed", "scroll_hide", "translucent_scroll_hide", "floating_close", "floating_close_safe_area"])).addOption(new Option("--color <scheme>", "\uD5E4\uB354 \uC0C9\uC0C1").choices(["light", "dark"])), async (ctx, [id2, file], opts) => {
|
|
2222
2287
|
const path = `/v4/creator/contents/${uuid(id2)}`;
|
|
2223
2288
|
const prepared = await prepareContentFile(file);
|
|
@@ -2238,6 +2303,13 @@ function registerContentCommands(program2, runtime2) {
|
|
|
2238
2303
|
runtime2.action(content.command("preview <id> <version-id>").description("\uC571 \uD655\uC778\uC6A9 \uBBF8\uB9AC\uBCF4\uAE30 \uB9C1\uD06C \uC870\uD68C (creator-content:read)"), async (ctx, [id2, versionId]) => ctx.output(await ctx.api.request("GET", `/v4/creator/contents/${uuid(id2)}/versions/${uuid(versionId)}/preview`)));
|
|
2239
2304
|
runtime2.action(content.command("submit <id> <version-id>").description("\uC571\uC5D0\uC11C \uD655\uC778 \uC644\uB8CC\uD55C \uBC84\uC804\uC758 \uC2EC\uC0AC \uC81C\uCD9C, \uD1B5\uACFC \uC2DC \uACF5\uAC1C (creator-content:write\uC640 creator-content:publish \uB458 \uB2E4 \uD544\uC694)"), async (ctx, [id2, versionId]) => mutate(ctx, "POST", `/v4/creator/contents/${uuid(id2)}/versions/${uuid(versionId)}/submit`, { publish_on_approval: true }, "\uC774 \uBC84\uC804\uC744 \uC2EC\uC0AC\uD558\uACE0 \uD1B5\uACFC\uD558\uBA74 \uACF5\uAC1C\uD560\uAE4C\uC694?"));
|
|
2240
2305
|
runtime2.action(content.command("withdraw <id> <version-id>").description("\uC9C4\uD589 \uC911\uC778 \uC2EC\uC0AC \uCDE8\uC18C (creator-content:write)"), async (ctx, [id2, versionId]) => mutate(ctx, "POST", `/v4/creator/contents/${uuid(id2)}/versions/${uuid(versionId)}/review/cancel`, void 0, "\uC774 \uBC84\uC804\uC758 \uC2EC\uC0AC\uB97C \uCDE8\uC18C\uD560\uAE4C\uC694?"));
|
|
2306
|
+
runtime2.action(content.command("info-version <id> <version-id>").description("\uBC14\uB010 \uCF58\uD150\uCE20 \uC815\uBCF4\uB9CC \uB2F4\uC740 \uC0C8 \uBC84\uC804 \uC0DD\uC131 (creator-content:write)"), async (ctx, [id2, versionId]) => mutate(
|
|
2307
|
+
ctx,
|
|
2308
|
+
"POST",
|
|
2309
|
+
`/v4/creator/contents/${uuid(id2)}/versions/${uuid(versionId)}/info-version`,
|
|
2310
|
+
void 0,
|
|
2311
|
+
"\uD604\uC7AC \uCF58\uD150\uCE20 \uC815\uBCF4\uB85C \uC774 \uBC84\uC804\uC744 \uBCF5\uC81C\uD55C \uC0C8 \uCD08\uC548\uC744 \uB9CC\uB4E4\uAE4C\uC694? \uC0C8 \uBC84\uC804\uC740 \uC571 \uD655\uC778\uACFC \uC2EC\uC0AC\uB97C \uB2E4\uC2DC \uBC1B\uC544\uC57C \uD569\uB2C8\uB2E4."
|
|
2312
|
+
));
|
|
2241
2313
|
runtime2.action(content.command("publish <id> <version-id>").description("\uC2B9\uC778\uB410\uC9C0\uB9CC \uACF5\uAC1C\uD558\uC9C0 \uC54A\uC740 \uBC84\uC804 \uACF5\uAC1C (creator-content:publish)"), async (ctx, [id2, versionId]) => mutate(ctx, "POST", `/v4/creator/contents/${uuid(id2)}/versions/${uuid(versionId)}/publish`, void 0, "\uC2B9\uC778\uB41C \uC774 \uBC84\uC804\uC744 \uACF5\uAC1C\uD560\uAE4C\uC694?"));
|
|
2242
2314
|
runtime2.action(content.command("unpublish <id>").description("\uCF58\uD150\uCE20 \uAC8C\uC2DC \uC911\uB2E8 (creator-content:publish)"), async (ctx, [id2]) => mutate(ctx, "POST", `/v4/creator/contents/${uuid(id2)}/unpublish`, void 0, "\uCF58\uD150\uCE20 \uAC8C\uC2DC\uB97C \uC911\uB2E8\uD560\uAE4C\uC694?"));
|
|
2243
2315
|
const serverKeys = content.command("server-keys").description("\uCF58\uD150\uCE20 \uC11C\uBC84 \uD0A4 \uC870\uD68C\xB7\uD3D0\uAE30 (platform:read\xB7platform:write, \uBC1C\uAE09\xB7\uD68C\uC804\uC740 \uD06C\uB9AC\uC5D0\uC774\uD130 \uC13C\uD130)");
|
|
@@ -2351,9 +2423,15 @@ var INTRO_MAX_IMAGES = 8;
|
|
|
2351
2423
|
var INTRO_CREATOR_COMMENT_MAX = 500;
|
|
2352
2424
|
var INTRO_DESCRIPTION_MAX = 5e3;
|
|
2353
2425
|
var INTRO_TEXT_WIDGETS = /* @__PURE__ */ new Set(["text", "textarea"]);
|
|
2354
|
-
|
|
2355
|
-
|
|
2356
|
-
|
|
2426
|
+
var labelRecord = (value2) => value2 && typeof value2 === "object" && !Array.isArray(value2) ? value2 : null;
|
|
2427
|
+
var introLabelText = (value2) => value2.normalize("NFC").trim();
|
|
2428
|
+
function introFieldLabelMaxLength(name2, field2) {
|
|
2429
|
+
const title = typeof field2?.title === "string" ? introLabelText(field2.title) : "";
|
|
2430
|
+
const lengths = [(title || name2).length];
|
|
2431
|
+
for (const value2 of Object.values(labelRecord(field2?.["x-clack-i18n"]) ?? {})) {
|
|
2432
|
+
if (typeof value2 === "string") lengths.push(introLabelText(value2).length);
|
|
2433
|
+
}
|
|
2434
|
+
return Math.max(...lengths);
|
|
2357
2435
|
}
|
|
2358
2436
|
function inspectIntroSemantics(skill, form, slots, fail2) {
|
|
2359
2437
|
const intro = skill.output?.intro;
|
|
@@ -2388,7 +2466,7 @@ function inspectIntroSemantics(skill, form, slots, fail2) {
|
|
|
2388
2466
|
fail2("/output/intro/description_fallback", "\uBB38\uC790\uC5F4(text\xB7textarea) \uD3FC \uD544\uB4DC\uB9CC \uC790\uB3D9 \uAD6C\uC131\uC5D0 \uC4F8 \uC218 \uC788\uC2B5\uB2C8\uB2E4.");
|
|
2389
2467
|
continue;
|
|
2390
2468
|
}
|
|
2391
|
-
composed +=
|
|
2469
|
+
composed += introFieldLabelMaxLength(name2, field2) + 1 + field2.maxLength;
|
|
2392
2470
|
}
|
|
2393
2471
|
composed += Math.max(0, fallback.length - 1) * 2;
|
|
2394
2472
|
if (composed > INTRO_DESCRIPTION_MAX) fail2("/output/intro/description_fallback", `\uC790\uB3D9 \uAD6C\uC131 \uCD5C\uB300 \uAE38\uC774(\uB77C\uBCA8 \uD3EC\uD568)\uAC00 ${INTRO_DESCRIPTION_MAX}\uC790\uB97C \uB118\uC2B5\uB2C8\uB2E4.`);
|
|
@@ -3068,13 +3146,74 @@ var clack_skill_v1_schema_default = {
|
|
|
3068
3146
|
},
|
|
3069
3147
|
maxItems: 10,
|
|
3070
3148
|
uniqueItems: true
|
|
3149
|
+
},
|
|
3150
|
+
description: {
|
|
3151
|
+
type: "object",
|
|
3152
|
+
properties: {
|
|
3153
|
+
ko: {
|
|
3154
|
+
type: "string",
|
|
3155
|
+
minLength: 1,
|
|
3156
|
+
maxLength: 1e3
|
|
3157
|
+
},
|
|
3158
|
+
en: {
|
|
3159
|
+
type: "string",
|
|
3160
|
+
minLength: 1,
|
|
3161
|
+
maxLength: 1e3
|
|
3162
|
+
}
|
|
3163
|
+
},
|
|
3164
|
+
required: [
|
|
3165
|
+
"ko"
|
|
3166
|
+
],
|
|
3167
|
+
additionalProperties: false
|
|
3168
|
+
},
|
|
3169
|
+
tags_i18n: {
|
|
3170
|
+
type: "object",
|
|
3171
|
+
properties: {
|
|
3172
|
+
en: {
|
|
3173
|
+
type: "array",
|
|
3174
|
+
items: {
|
|
3175
|
+
type: "string",
|
|
3176
|
+
minLength: 1,
|
|
3177
|
+
maxLength: 40
|
|
3178
|
+
},
|
|
3179
|
+
minItems: 1,
|
|
3180
|
+
maxItems: 10,
|
|
3181
|
+
uniqueItems: true
|
|
3182
|
+
}
|
|
3183
|
+
},
|
|
3184
|
+
minProperties: 1,
|
|
3185
|
+
additionalProperties: false
|
|
3186
|
+
},
|
|
3187
|
+
release_notes: {
|
|
3188
|
+
type: "object",
|
|
3189
|
+
properties: {
|
|
3190
|
+
ko: {
|
|
3191
|
+
type: "string",
|
|
3192
|
+
minLength: 1,
|
|
3193
|
+
maxLength: 1e3
|
|
3194
|
+
},
|
|
3195
|
+
en: {
|
|
3196
|
+
type: "string",
|
|
3197
|
+
minLength: 1,
|
|
3198
|
+
maxLength: 1e3
|
|
3199
|
+
}
|
|
3200
|
+
},
|
|
3201
|
+
required: [
|
|
3202
|
+
"ko"
|
|
3203
|
+
],
|
|
3204
|
+
additionalProperties: false
|
|
3071
3205
|
}
|
|
3072
3206
|
},
|
|
3073
3207
|
required: [
|
|
3074
3208
|
"title",
|
|
3075
3209
|
"summary",
|
|
3076
3210
|
"category"
|
|
3077
|
-
]
|
|
3211
|
+
],
|
|
3212
|
+
dependentRequired: {
|
|
3213
|
+
tags_i18n: [
|
|
3214
|
+
"tags"
|
|
3215
|
+
]
|
|
3216
|
+
}
|
|
3078
3217
|
},
|
|
3079
3218
|
authoring: {
|
|
3080
3219
|
type: "object",
|
|
@@ -4236,6 +4375,44 @@ var authoring_form_v1_schema_default = {
|
|
|
4236
4375
|
],
|
|
4237
4376
|
additionalProperties: false
|
|
4238
4377
|
},
|
|
4378
|
+
"x-clack-help-i18n": {
|
|
4379
|
+
type: "object",
|
|
4380
|
+
properties: {
|
|
4381
|
+
ko: {
|
|
4382
|
+
type: "string",
|
|
4383
|
+
minLength: 1,
|
|
4384
|
+
maxLength: 1e3
|
|
4385
|
+
},
|
|
4386
|
+
en: {
|
|
4387
|
+
type: "string",
|
|
4388
|
+
minLength: 1,
|
|
4389
|
+
maxLength: 1e3
|
|
4390
|
+
}
|
|
4391
|
+
},
|
|
4392
|
+
required: [
|
|
4393
|
+
"ko"
|
|
4394
|
+
],
|
|
4395
|
+
additionalProperties: false
|
|
4396
|
+
},
|
|
4397
|
+
"x-clack-placeholder-i18n": {
|
|
4398
|
+
type: "object",
|
|
4399
|
+
properties: {
|
|
4400
|
+
ko: {
|
|
4401
|
+
type: "string",
|
|
4402
|
+
minLength: 1,
|
|
4403
|
+
maxLength: 300
|
|
4404
|
+
},
|
|
4405
|
+
en: {
|
|
4406
|
+
type: "string",
|
|
4407
|
+
minLength: 1,
|
|
4408
|
+
maxLength: 300
|
|
4409
|
+
}
|
|
4410
|
+
},
|
|
4411
|
+
required: [
|
|
4412
|
+
"ko"
|
|
4413
|
+
],
|
|
4414
|
+
additionalProperties: false
|
|
4415
|
+
},
|
|
4239
4416
|
"x-clack-sections": {
|
|
4240
4417
|
type: "array",
|
|
4241
4418
|
items: {
|
|
@@ -4507,6 +4684,44 @@ var authoring_form_v1_schema_default = {
|
|
|
4507
4684
|
],
|
|
4508
4685
|
additionalProperties: false
|
|
4509
4686
|
},
|
|
4687
|
+
"x-clack-help-i18n": {
|
|
4688
|
+
type: "object",
|
|
4689
|
+
properties: {
|
|
4690
|
+
ko: {
|
|
4691
|
+
type: "string",
|
|
4692
|
+
minLength: 1,
|
|
4693
|
+
maxLength: 1e3
|
|
4694
|
+
},
|
|
4695
|
+
en: {
|
|
4696
|
+
type: "string",
|
|
4697
|
+
minLength: 1,
|
|
4698
|
+
maxLength: 1e3
|
|
4699
|
+
}
|
|
4700
|
+
},
|
|
4701
|
+
required: [
|
|
4702
|
+
"ko"
|
|
4703
|
+
],
|
|
4704
|
+
additionalProperties: false
|
|
4705
|
+
},
|
|
4706
|
+
"x-clack-placeholder-i18n": {
|
|
4707
|
+
type: "object",
|
|
4708
|
+
properties: {
|
|
4709
|
+
ko: {
|
|
4710
|
+
type: "string",
|
|
4711
|
+
minLength: 1,
|
|
4712
|
+
maxLength: 300
|
|
4713
|
+
},
|
|
4714
|
+
en: {
|
|
4715
|
+
type: "string",
|
|
4716
|
+
minLength: 1,
|
|
4717
|
+
maxLength: 300
|
|
4718
|
+
}
|
|
4719
|
+
},
|
|
4720
|
+
required: [
|
|
4721
|
+
"ko"
|
|
4722
|
+
],
|
|
4723
|
+
additionalProperties: false
|
|
4724
|
+
},
|
|
4510
4725
|
"x-clack-source": {
|
|
4511
4726
|
type: "object",
|
|
4512
4727
|
additionalProperties: false,
|