twskin 0.5.4 → 0.5.6

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.
@@ -0,0 +1,324 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { CliError } from "./errors.js";
4
+ import { withLock } from "./lock.js";
5
+ import { compareVersionStrings, isCompatibleRange, isVersion, satisfiesRange } from "./semver.js";
6
+ import { atomicWrite } from "./system.js";
7
+ import { downloadThemes } from "./theme-download.js";
8
+ import { listThemes } from "./themes.js";
9
+ const DEFAULT_RELEASE_ASSET_BASE_URL = "https://github.com/Fullstop000/trae-work-dream-skin/releases/latest/download";
10
+ const DEFAULT_RELEASE_DOWNLOAD_BASE_URL = "https://github.com/Fullstop000/trae-work-dream-skin/releases/download";
11
+ const CATALOG_MAX_BYTES = 512 * 1024;
12
+ const CATALOG_TIMEOUT_MS = 10_000;
13
+ const DEFAULT_CHECK_INTERVAL_MS = 6 * 60 * 60 * 1000;
14
+ const RETRY_INTERVAL_MS = 15 * 60 * 1000;
15
+ const THEME_ID = /^[a-z0-9][a-z0-9._-]{0,63}$/;
16
+ const SHA256 = /^[a-f0-9]{64}$/i;
17
+ function assetBaseUrl(context) {
18
+ return (context.env.TWSKIN_RELEASE_ASSET_BASE_URL || DEFAULT_RELEASE_ASSET_BASE_URL).replace(/\/+$/, "");
19
+ }
20
+ function catalogUrl(context) {
21
+ return context.env.TWSKIN_THEME_CATALOG_URL || `${assetBaseUrl(context)}/twskin-catalog-v1.json`;
22
+ }
23
+ function catalogAssetUrl(context, catalog, asset) {
24
+ const configuredBase = context.env.TWSKIN_RELEASE_ASSET_BASE_URL;
25
+ if (configuredBase)
26
+ return `${configuredBase.replace(/\/+$/, "")}/${asset}`;
27
+ return `${DEFAULT_RELEASE_DOWNLOAD_BASE_URL}/${encodeURIComponent(catalog.releaseTag)}/${asset}`;
28
+ }
29
+ function downloadHeaders(context, url) {
30
+ const headers = { Accept: "application/json", "User-Agent": "twskin-cli" };
31
+ const token = context.env.TWSKIN_GITHUB_TOKEN || context.env.GH_TOKEN || context.env.GITHUB_TOKEN;
32
+ try {
33
+ const parsed = new URL(url);
34
+ if (token && parsed.protocol === "https:" && (parsed.hostname === "api.github.com" || parsed.hostname === "github.com")) {
35
+ headers.Authorization = `Bearer ${token}`;
36
+ }
37
+ }
38
+ catch { }
39
+ return headers;
40
+ }
41
+ function readJson(file) {
42
+ try {
43
+ return JSON.parse(fs.readFileSync(file, "utf8"));
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ }
49
+ function readCatalogState(context) {
50
+ const value = readJson(context.paths.catalogState);
51
+ return value?.schemaVersion === 1 ? { ...value, schemaVersion: 1 } : { schemaVersion: 1 };
52
+ }
53
+ function writeCatalogState(context, state) {
54
+ atomicWrite(context.paths.catalogState, `${JSON.stringify(state, null, 2)}\n`);
55
+ }
56
+ export function readThemeUpdateSettings(context) {
57
+ const value = readJson(context.paths.themeUpdateSettings);
58
+ return {
59
+ schemaVersion: 1,
60
+ autoUpdateThemes: typeof value?.autoUpdateThemes === "boolean" ? value.autoUpdateThemes : true,
61
+ };
62
+ }
63
+ export function setThemeAutoUpdate(context, autoUpdateThemes) {
64
+ const settings = { schemaVersion: 1, autoUpdateThemes };
65
+ atomicWrite(context.paths.themeUpdateSettings, `${JSON.stringify(settings, null, 2)}\n`);
66
+ const state = readThemeSyncState(context);
67
+ writeThemeSyncState(context, { ...state, autoUpdateThemes });
68
+ return settings;
69
+ }
70
+ export function readThemeSyncState(context) {
71
+ const value = readJson(context.paths.themeSyncState);
72
+ const settings = readThemeUpdateSettings(context);
73
+ if (value?.schemaVersion === 1 && typeof value.phase === "string") {
74
+ return {
75
+ schemaVersion: 1,
76
+ phase: value.phase,
77
+ autoUpdateThemes: settings.autoUpdateThemes,
78
+ updateCount: Number(value.updateCount || 0),
79
+ newThemes: Number(value.newThemes || 0),
80
+ updatedThemes: Number(value.updatedThemes || 0),
81
+ incompatibleThemes: Number(value.incompatibleThemes || 0),
82
+ ...(typeof value.catalogVersion === "string" ? { catalogVersion: value.catalogVersion } : {}),
83
+ ...(typeof value.lastCheckedAt === "string" ? { lastCheckedAt: value.lastCheckedAt } : {}),
84
+ ...(typeof value.lastSuccessfulSyncAt === "string" ? { lastSuccessfulSyncAt: value.lastSuccessfulSyncAt } : {}),
85
+ ...(Array.isArray(value.installed) ? { installed: value.installed.filter((id) => typeof id === "string") } : {}),
86
+ ...(typeof value.message === "string" ? { message: value.message } : {}),
87
+ };
88
+ }
89
+ return { schemaVersion: 1, phase: "idle", autoUpdateThemes: settings.autoUpdateThemes, updateCount: 0, newThemes: 0, updatedThemes: 0, incompatibleThemes: 0 };
90
+ }
91
+ function writeThemeSyncState(context, state) {
92
+ atomicWrite(context.paths.themeSyncState, `${JSON.stringify(state, null, 2)}\n`);
93
+ }
94
+ function validateCatalog(value) {
95
+ if (!value || typeof value !== "object" || Array.isArray(value))
96
+ throw new CliError("CATALOG_INVALID", 4, "主题 Catalog 不是有效对象。");
97
+ const catalog = value;
98
+ if (catalog.schemaVersion !== 1 || !isVersion(catalog.catalogVersion) || typeof catalog.releaseTag !== "string" || !isCompatibleRange(catalog.compatibleCli)) {
99
+ throw new CliError("CATALOG_INVALID", 4, "主题 Catalog 的版本字段不完整或不支持。");
100
+ }
101
+ if (!catalog.pack || typeof catalog.pack !== "object" || !Array.isArray(catalog.themes)) {
102
+ throw new CliError("CATALOG_INVALID", 4, "主题 Catalog 缺少主题包或主题列表。");
103
+ }
104
+ const pack = catalog.pack;
105
+ const packSize = Number(pack.size);
106
+ if (typeof pack.asset !== "string" || !/^[A-Za-z0-9._-]+\.tar\.gz$/.test(pack.asset)
107
+ || typeof pack.checksumAsset !== "string" || !/^[A-Za-z0-9._-]+\.sha256$/.test(pack.checksumAsset)
108
+ || !Number.isInteger(packSize) || packSize < 1 || packSize > 128 * 1024 * 1024
109
+ || typeof pack.sha256 !== "string" || !SHA256.test(pack.sha256))
110
+ throw new CliError("CATALOG_INVALID", 4, "主题 Catalog 的主题包信息无效。");
111
+ const ids = new Set();
112
+ for (const theme of catalog.themes) {
113
+ if (!theme || typeof theme !== "object")
114
+ throw new CliError("CATALOG_INVALID", 4, "主题 Catalog 包含无效主题。");
115
+ const entry = theme;
116
+ if (typeof entry.id !== "string" || !THEME_ID.test(entry.id) || ids.has(entry.id)
117
+ || !isVersion(entry.version) || !Number.isInteger(entry.schemaVersion) || Number(entry.schemaVersion) < 1
118
+ || !entry.engines || typeof entry.engines !== "object" || !isCompatibleRange(entry.engines.twskin)
119
+ || typeof entry.name !== "string" || typeof entry.desc !== "string" || typeof entry.category !== "string")
120
+ throw new CliError("CATALOG_INVALID", 4, "主题 Catalog 包含无效主题元数据。");
121
+ ids.add(entry.id);
122
+ }
123
+ return catalog;
124
+ }
125
+ function cachedCatalog(context) {
126
+ const catalog = readJson(context.paths.catalogCache);
127
+ try {
128
+ return validateCatalog(catalog);
129
+ }
130
+ catch {
131
+ return null;
132
+ }
133
+ }
134
+ function checkInterval(context) {
135
+ const configured = Number(context.env.TWSKIN_CATALOG_CHECK_INTERVAL_MS || DEFAULT_CHECK_INTERVAL_MS);
136
+ return Number.isFinite(configured) && configured >= 0 ? configured : DEFAULT_CHECK_INTERVAL_MS;
137
+ }
138
+ function canUseCache(context, state, cached, force) {
139
+ if (force || !cached)
140
+ return false;
141
+ const now = Date.now();
142
+ const successful = Date.parse(state.lastCheckedAt || "");
143
+ if (Number.isFinite(successful) && now - successful < checkInterval(context))
144
+ return true;
145
+ const attempted = Date.parse(state.lastAttemptAt || "");
146
+ return Boolean(state.lastError && Number.isFinite(attempted) && now - attempted < RETRY_INTERVAL_MS);
147
+ }
148
+ async function fetchCatalog(context, force = false) {
149
+ const state = readCatalogState(context);
150
+ const cached = cachedCatalog(context);
151
+ if (canUseCache(context, state, cached, force)) {
152
+ return { catalog: cached, source: "cache", ...(state.lastCheckedAt ? { lastCheckedAt: state.lastCheckedAt } : {}) };
153
+ }
154
+ const controller = new AbortController();
155
+ const timeout = setTimeout(() => controller.abort(), CATALOG_TIMEOUT_MS);
156
+ const url = catalogUrl(context);
157
+ try {
158
+ const headers = downloadHeaders(context, url);
159
+ if (state.etag)
160
+ headers["If-None-Match"] = state.etag;
161
+ let response = await fetch(url, { headers, redirect: "follow", signal: controller.signal });
162
+ if (response.status === 304 && !cached) {
163
+ // An ETag without a valid cache can survive manual cleanup or a stricter
164
+ // validator after a CLI upgrade. Refetch without it to self-heal.
165
+ delete state.etag;
166
+ response = await fetch(url, { headers: downloadHeaders(context, url), redirect: "follow", signal: controller.signal });
167
+ }
168
+ if (response.status === 304 && cached) {
169
+ const checkedAt = new Date().toISOString();
170
+ const nextState = { ...state, lastAttemptAt: checkedAt, lastCheckedAt: checkedAt };
171
+ delete nextState.lastError;
172
+ writeCatalogState(context, nextState);
173
+ return { catalog: cached, source: "cache", lastCheckedAt: checkedAt };
174
+ }
175
+ if (!response.ok)
176
+ throw new CliError("CATALOG_DOWNLOAD_FAILED", 4, `下载主题 Catalog 失败:HTTP ${response.status}`, "稍后重试,或检查 GitHub 网络连接。");
177
+ const length = Number(response.headers.get("content-length") || 0);
178
+ if (length > CATALOG_MAX_BYTES)
179
+ throw new CliError("CATALOG_TOO_LARGE", 4, "主题 Catalog 超过安全大小限制。");
180
+ const bytes = new Uint8Array(await response.arrayBuffer());
181
+ if (bytes.byteLength > CATALOG_MAX_BYTES)
182
+ throw new CliError("CATALOG_TOO_LARGE", 4, "主题 Catalog 超过安全大小限制。");
183
+ let catalog;
184
+ try {
185
+ catalog = validateCatalog(JSON.parse(Buffer.from(bytes).toString("utf8")));
186
+ }
187
+ catch (error) {
188
+ if (error instanceof CliError)
189
+ throw error;
190
+ throw new CliError("CATALOG_INVALID", 4, "主题 Catalog 无法解析。", "稍后重试。", error instanceof Error ? error.message : String(error));
191
+ }
192
+ const checkedAt = new Date().toISOString();
193
+ atomicWrite(context.paths.catalogCache, `${JSON.stringify(catalog, null, 2)}\n`);
194
+ writeCatalogState(context, {
195
+ schemaVersion: 1,
196
+ ...(response.headers.get("etag") ? { etag: response.headers.get("etag") } : {}),
197
+ lastAttemptAt: checkedAt,
198
+ lastCheckedAt: checkedAt,
199
+ catalogVersion: catalog.catalogVersion,
200
+ });
201
+ return { catalog, source: "network", lastCheckedAt: checkedAt };
202
+ }
203
+ catch (error) {
204
+ const message = error instanceof CliError ? error.message : error instanceof Error && error.name === "AbortError" ? "下载主题 Catalog 超时。" : `下载主题 Catalog 失败:${error instanceof Error ? error.message : String(error)}`;
205
+ writeCatalogState(context, { ...state, lastAttemptAt: new Date().toISOString(), lastError: message });
206
+ throw error instanceof CliError ? error : new CliError("CATALOG_DOWNLOAD_FAILED", 4, message, "稍后重试,或检查 GitHub 网络连接。");
207
+ }
208
+ finally {
209
+ clearTimeout(timeout);
210
+ }
211
+ }
212
+ export async function checkThemeUpdates(context, { force = false } = {}) {
213
+ const fetched = await fetchCatalog(context, force);
214
+ if (!satisfiesRange(fetched.catalog.compatibleCli, context.packageVersion)) {
215
+ throw new CliError("CATALOG_INCOMPATIBLE", 4, `主题 Catalog ${fetched.catalog.catalogVersion} 不兼容当前 CLI ${context.packageVersion}。`, `需要 CLI ${fetched.catalog.compatibleCli}。`);
216
+ }
217
+ const installed = new Map(listThemes(context).filter((theme) => !theme.invalid).map((theme) => [theme.id, theme]));
218
+ const updates = [];
219
+ let newThemes = 0;
220
+ let updatedThemes = 0;
221
+ let incompatibleThemes = 0;
222
+ for (const theme of fetched.catalog.themes) {
223
+ if (!satisfiesRange(theme.engines.twskin, context.packageVersion)) {
224
+ incompatibleThemes += 1;
225
+ continue;
226
+ }
227
+ const local = installed.get(theme.id);
228
+ if (!local) {
229
+ updates.push({ id: theme.id, name: theme.name, version: theme.version, kind: "new" });
230
+ newThemes += 1;
231
+ continue;
232
+ }
233
+ const comparison = compareVersionStrings(theme.version, local.version);
234
+ if (comparison === null)
235
+ throw new CliError("THEME_VERSION_INVALID", 4, `本地主题版本无效:${theme.id}`);
236
+ if (comparison > 0) {
237
+ updates.push({ id: theme.id, name: theme.name, version: theme.version, kind: "update" });
238
+ updatedThemes += 1;
239
+ }
240
+ }
241
+ return {
242
+ catalog: fetched.catalog,
243
+ updates,
244
+ newThemes,
245
+ updatedThemes,
246
+ incompatibleThemes,
247
+ checkedFrom: fetched.source,
248
+ ...(fetched.lastCheckedAt ? { lastCheckedAt: fetched.lastCheckedAt } : {}),
249
+ };
250
+ }
251
+ function stateForCheck(context, phase, check, extra = {}) {
252
+ const previous = readThemeSyncState(context);
253
+ return {
254
+ schemaVersion: 1,
255
+ phase,
256
+ autoUpdateThemes: readThemeUpdateSettings(context).autoUpdateThemes,
257
+ catalogVersion: check.catalog.catalogVersion,
258
+ ...(check.lastCheckedAt ? { lastCheckedAt: check.lastCheckedAt } : previous.lastCheckedAt ? { lastCheckedAt: previous.lastCheckedAt } : {}),
259
+ ...(previous.lastSuccessfulSyncAt ? { lastSuccessfulSyncAt: previous.lastSuccessfulSyncAt } : {}),
260
+ ...(previous.installed ? { installed: previous.installed } : {}),
261
+ updateCount: check.updates.length,
262
+ newThemes: check.newThemes,
263
+ updatedThemes: check.updatedThemes,
264
+ incompatibleThemes: check.incompatibleThemes,
265
+ ...extra,
266
+ };
267
+ }
268
+ export async function checkThemesAndRecordState(context, { force = false } = {}) {
269
+ writeThemeSyncState(context, { ...readThemeSyncState(context), phase: "checking", message: "正在检查主题更新" });
270
+ try {
271
+ const check = await checkThemeUpdates(context, { force });
272
+ writeThemeSyncState(context, stateForCheck(context, check.updates.length ? "update-available" : "fresh", check));
273
+ return check;
274
+ }
275
+ catch (error) {
276
+ writeThemeSyncState(context, { ...readThemeSyncState(context), phase: "error", message: error instanceof Error ? error.message : String(error) });
277
+ throw error;
278
+ }
279
+ }
280
+ export async function syncThemes(context, { force = false, install } = {}) {
281
+ const check = await checkThemesAndRecordState(context, { force });
282
+ const settings = readThemeUpdateSettings(context);
283
+ const shouldInstall = install ?? settings.autoUpdateThemes;
284
+ if (!check.updates.length || !shouldInstall)
285
+ return readThemeSyncState(context);
286
+ const downloading = stateForCheck(context, "downloading", check, { message: "正在下载并校验主题包" });
287
+ writeThemeSyncState(context, downloading);
288
+ try {
289
+ const result = await downloadThemes(context, undefined, {
290
+ archiveUrl: catalogAssetUrl(context, check.catalog, check.catalog.pack.asset),
291
+ checksumUrl: catalogAssetUrl(context, check.catalog, check.catalog.pack.checksumAsset),
292
+ expectedDigest: check.catalog.pack.sha256,
293
+ tag: check.catalog.releaseTag,
294
+ themeIds: check.updates.map((theme) => theme.id),
295
+ themeVersions: Object.fromEntries(check.updates.map((theme) => [theme.id, theme.version])),
296
+ });
297
+ const installed = result.installed.map((theme) => theme.id);
298
+ const next = stateForCheck(context, "success", check, {
299
+ installed,
300
+ lastSuccessfulSyncAt: new Date().toISOString(),
301
+ updateCount: 0,
302
+ newThemes: 0,
303
+ updatedThemes: 0,
304
+ message: installed.length ? `已更新 ${installed.length} 套主题` : "主题已是最新",
305
+ });
306
+ writeThemeSyncState(context, next);
307
+ return next;
308
+ }
309
+ catch (error) {
310
+ const failed = stateForCheck(context, "error", check, { message: error instanceof Error ? error.message : String(error) });
311
+ writeThemeSyncState(context, failed);
312
+ throw error;
313
+ }
314
+ }
315
+ export async function checkThemesCommandState(context, force = false) {
316
+ return withLock(context, "theme-check", () => checkThemesAndRecordState(context, { force }));
317
+ }
318
+ export async function syncThemesCommandState(context, force = false) {
319
+ return withLock(context, "theme-sync", () => syncThemes(context, { force, install: true }));
320
+ }
321
+ export async function autoSyncThemesCommandState(context, force = false) {
322
+ return withLock(context, "theme-auto-sync", () => syncThemes(context, { force }));
323
+ }
324
+ //# sourceMappingURL=theme-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-catalog.js","sourceRoot":"","sources":["../src/theme-catalog.ts"],"names":[],"mappings":"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"}
@@ -5,5 +5,13 @@ export interface ThemeDownloadResult {
5
5
  installed: InstalledTheme[];
6
6
  directory: string;
7
7
  }
8
- export declare function downloadThemes(context: CliContext, requestedId?: string): Promise<ThemeDownloadResult>;
8
+ export interface ThemeDownloadSource {
9
+ archiveUrl: string;
10
+ checksumUrl?: string;
11
+ expectedDigest?: string;
12
+ tag?: string;
13
+ themeIds?: readonly string[];
14
+ themeVersions?: Readonly<Record<string, string>>;
15
+ }
16
+ export declare function downloadThemes(context: CliContext, requestedId?: string, source?: ThemeDownloadSource): Promise<ThemeDownloadResult>;
9
17
  //# sourceMappingURL=theme-download.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme-download.d.ts","sourceRoot":"","sources":["../src/theme-download.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA0B7D,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAoND,wBAAsB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAoC5G"}
1
+ {"version":3,"file":"theme-download.d.ts","sourceRoot":"","sources":["../src/theme-download.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA0B7D,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAClD;AAmMD,wBAAsB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAgE1I"}
@@ -5,6 +5,7 @@ import path from "node:path";
5
5
  import { spawnSync } from "node:child_process";
6
6
  import { CliError } from "./errors.js";
7
7
  import { discoverThemeDirectories, installThemeDirectory } from "./themes.js";
8
+ import { satisfiesRange } from "./semver.js";
8
9
  const DEFAULT_RELEASE_API = "https://api.github.com/repos/Fullstop000/trae-work-dream-skin/releases/latest";
9
10
  const DEFAULT_RELEASE_ASSET_BASE_URL = "https://github.com/Fullstop000/trae-work-dream-skin/releases/latest/download";
10
11
  const LATEST_ASSET_BASENAME = "twskin-themes";
@@ -152,25 +153,8 @@ function validateArchive(context, archiveFile) {
152
153
  }
153
154
  }
154
155
  }
155
- function versionParts(version) {
156
- const match = String(version).match(/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/);
157
- return match ? [Number(match[1]), Number(match[2]), Number(match[3])] : null;
158
- }
159
- function compareVersions(left, right) {
160
- for (const index of [0, 1, 2]) {
161
- if (left[index] !== right[index])
162
- return left[index] < right[index] ? -1 : 1;
163
- }
164
- return 0;
165
- }
166
156
  function compatibleCli(range, currentVersion) {
167
- const match = String(range).match(/^>=(\d+\.\d+\.\d+)\s+<(\d+\.\d+\.\d+)$/);
168
- const current = versionParts(currentVersion);
169
- if (!match || !current)
170
- return false;
171
- const minimum = versionParts(match[1]);
172
- const maximum = versionParts(match[2]);
173
- return Boolean(minimum && maximum && compareVersions(current, minimum) >= 0 && compareVersions(current, maximum) < 0);
157
+ return satisfiesRange(range, currentVersion);
174
158
  }
175
159
  function parsePackManifest(directory, expectedTag, cliVersion) {
176
160
  const file = path.join(directory, "theme-pack.json");
@@ -205,19 +189,37 @@ function extractArchive(context, archiveFile, directory) {
205
189
  if (result.status !== 0)
206
190
  throw new CliError("ARCHIVE_INVALID", 4, "主题包解压失败。", "重新下载官方 Release 资产。", result.stderr.trim());
207
191
  }
208
- export async function downloadThemes(context, requestedId) {
192
+ export async function downloadThemes(context, requestedId, source) {
209
193
  if (requestedId && !THEME_ID.test(requestedId))
210
194
  throw new CliError("THEME_ID_INVALID", 2, `主题 ID 不合法:${requestedId}`);
211
- const selected = await selectAssets(context);
195
+ if (source?.themeIds?.some((id) => !THEME_ID.test(id)))
196
+ throw new CliError("THEME_ID_INVALID", 2, "Catalog 中包含不合法的主题 ID。");
197
+ const selected = source
198
+ ? {
199
+ tag: source.tag,
200
+ base: "twskin-catalog",
201
+ archive: { name: "theme-pack.tar.gz", browser_download_url: source.archiveUrl },
202
+ checksum: source.checksumUrl ? { name: "theme-pack.sha256", browser_download_url: source.checksumUrl } : undefined,
203
+ }
204
+ : await selectAssets(context);
212
205
  const temporary = fs.mkdtempSync(path.join(os.tmpdir(), "twskin-theme-download-"));
213
206
  try {
214
207
  const [archiveContent, checksumContent] = await Promise.all([
215
208
  downloadBuffer(context, selected.archive.browser_download_url, { maxBytes: MAX_ARCHIVE_BYTES, accept: "application/octet-stream" }),
216
- downloadBuffer(context, selected.checksum.browser_download_url, { maxBytes: MAX_CHECKSUM_BYTES, accept: "text/plain" }),
209
+ selected.checksum
210
+ ? downloadBuffer(context, selected.checksum.browser_download_url, { maxBytes: MAX_CHECKSUM_BYTES, accept: "text/plain" })
211
+ : Promise.resolve(null),
217
212
  ]);
218
- const expectedDigest = checksumContent.toString("utf8").match(/\b([a-f0-9]{64})\b/i)?.[1]?.toLowerCase();
213
+ const checksumDigest = checksumContent?.toString("utf8").match(/\b([a-f0-9]{64})\b/i)?.[1]?.toLowerCase();
214
+ const expectedDigest = source?.expectedDigest?.toLowerCase() || checksumDigest;
219
215
  if (!expectedDigest)
220
216
  throw new CliError("CHECKSUM_INVALID", 4, "主题包 SHA-256 文件格式无效。");
217
+ if (source?.expectedDigest && !/^[a-f0-9]{64}$/i.test(source.expectedDigest)) {
218
+ throw new CliError("CHECKSUM_INVALID", 4, "Catalog 中的主题包 SHA-256 无效。");
219
+ }
220
+ if (source?.expectedDigest && checksumDigest && source.expectedDigest.toLowerCase() !== checksumDigest) {
221
+ throw new CliError("CHECKSUM_MISMATCH", 4, "Catalog 与主题包 SHA-256 文件不一致。", "请稍后重试;不要安装该主题包。");
222
+ }
221
223
  const actualDigest = crypto.createHash("sha256").update(archiveContent).digest("hex");
222
224
  if (actualDigest !== expectedDigest)
223
225
  throw new CliError("CHECKSUM_MISMATCH", 4, "主题包 SHA-256 校验失败。", "请勿使用该文件;稍后重新下载。");
@@ -237,9 +239,20 @@ export async function downloadThemes(context, requestedId) {
237
239
  if (declared.size !== pack.themes.length || declared.size !== found.size || discovered.some((theme) => !declared.has(theme.id))) {
238
240
  throw new CliError("THEME_PACK_INVALID", 4, "主题包内容与 theme-pack.json 不一致。");
239
241
  }
240
- const chosen = requestedId ? discovered.filter((theme) => theme.id === requestedId) : discovered;
242
+ const allowed = source?.themeIds ? new Set(source.themeIds) : null;
243
+ const chosen = requestedId
244
+ ? discovered.filter((theme) => theme.id === requestedId)
245
+ : allowed ? discovered.filter((theme) => allowed.has(theme.id)) : discovered;
241
246
  if (chosen.length === 0)
242
247
  throw new CliError("THEME_NOT_FOUND", 2, `Release ${releaseTag} 中找不到主题:${requestedId}`);
248
+ if (source?.themeVersions) {
249
+ for (const theme of chosen) {
250
+ const expectedVersion = source.themeVersions[theme.id];
251
+ if (!expectedVersion || theme.version !== expectedVersion) {
252
+ throw new CliError("CATALOG_THEME_MISMATCH", 4, `主题 ${theme.id} 的版本与 Catalog 不一致。`, "请稍后重试;不要安装该主题包。");
253
+ }
254
+ }
255
+ }
243
256
  const installed = chosen.map((theme) => installThemeDirectory(context, theme.source));
244
257
  return { tag: releaseTag, digest: actualDigest, installed, directory: context.themesDir };
245
258
  }
@@ -1 +1 @@
1
- {"version":3,"file":"theme-download.js","sourceRoot":"","sources":["../src/theme-download.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAkC9E,MAAM,mBAAmB,GAAG,+EAA+E,CAAC;AAC5G,MAAM,8BAA8B,GAAG,8EAA8E,CAAC;AACtH,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAC9C,MAAM,iBAAiB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAC5C,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AACnC,MAAM,QAAQ,GAAG,6BAA6B,CAAC;AAE/C,SAAS,eAAe,CAAC,OAAmB,EAAE,GAAW,EAAE,MAAc;IACvE,MAAM,OAAO,GAA2B;QACtC,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,YAAY;QAC1B,sBAAsB,EAAE,YAAY;KACrC,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAClG,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,KAAK,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,gBAAgB,IAAI,MAAM,CAAC,QAAQ,KAAK,YAAY,CAAC,EAAE,CAAC;YACxH,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;IACzE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,OAAmB,EAAE,GAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAG,iBAAiB,EAAyB;IAC3I,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAC1E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,OAAO,EAAE,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC;YAC9C,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC,EAAE,0BAA0B,EAAE,wBAAwB,CAAC,CAAC;QACvH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EAAE,aAAa,QAAQ,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC;QACpH,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1E,IAAI,aAAa,GAAG,QAAQ;YAAE,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE,CAAC,EAAE,UAAU,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEtI,IAAI,CAAC,QAAQ,CAAC,IAAI;YAAE,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACnF,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC;YAC1B,IAAI,KAAK,GAAG,QAAQ;gBAAE,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;YACnF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,QAAQ;YAAE,MAAM,KAAK,CAAC;QAC3C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;YACnE,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,QAAQ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAC1E,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAAsB,EAAE,QAAgB;IAC5D,OAAO,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,oBAAoB,KAAK,QAAQ,CAAC,CAAC;AACrH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,OAAmB;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,mBAAmB,CAAC;IACzE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE;QACpD,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;QACzB,MAAM,EAAE,6BAA6B;QACrC,YAAY,EAAE,mBAAmB;KAClC,CAAC,CAAC;IACH,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAAC,CAAC;IACvD,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EAAE,yBAAyB,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAAC,CAAC;IACvJ,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5K,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EAAE,wBAAwB,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,OAAwB,CAAC;AAClC,CAAC;AASD,SAAS,mBAAmB,CAAC,OAAsB;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC7B,MAAM,IAAI,GAAG,iBAAiB,GAAG,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC;IACzD,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,QAAQ,CAChB,uBAAuB,EACvB,CAAC,EACD,WAAW,GAAG,uBAAuB,EACrC,MAAM,IAAI,aAAa,IAAI,UAAU,CACtC,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAAmB;IAC7C,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC;QACvC,OAAO,mBAAmB,CAAC,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,8BAA8B,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClH,OAAO;QACL,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE;YACP,IAAI,EAAE,GAAG,qBAAqB,SAAS;YACvC,oBAAoB,EAAE,GAAG,OAAO,IAAI,qBAAqB,SAAS;SACnE;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,GAAG,qBAAqB,SAAS;YACvC,oBAAoB,EAAE,GAAG,OAAO,IAAI,qBAAqB,SAAS;SACnE;KACF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,OAAmB,EAAE,WAAmB,EAAE,OAAO,GAAG,KAAK;IAC/E,MAAM,MAAM,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE;QAClF,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QAC9B,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9G,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,eAAe,CAAC,OAAmB,EAAE,WAAmB;IAC/D,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACrD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EAAE,wBAAwB,CAAC,CAAC;IAC7G,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/F,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC,EAAE,cAAc,GAAG,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,KAAK,KAAK,iBAAiB,IAAI,KAAK,KAAK,QAAQ;YAAE,SAAS;QAChE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC,EAAE,cAAc,GAAG,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC;QAC9D,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACvC,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC,EAAE,uBAAuB,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/E,CAAC;AAED,SAAS,eAAe,CAAC,IAA8B,EAAE,KAA+B;IACtF,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,cAAsB;IAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IACxC,OAAO,OAAO,CAAC,OAAO,IAAI,OAAO,IAAI,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AACxH,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB,EAAE,WAA+B,EAAE,UAAkB;IAC/F,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IACrD,IAAI,QAAiB,CAAC;IACtB,IAAI,CAAC;QAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAAC,CAAC;IAC7D,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE,CAAC,EAAE,uBAAuB,EAAE,YAAY,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAAC,CAAC;IAC7J,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,eAAe,IAAI,QAAQ,CAAC,IAAI,QAAQ,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9K,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE,CAAC,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,IAAI,GAAG,QAAsC,CAAC;IACpD,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QACtI,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,WAAW,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,KAAK,WAAW,EAAE,CAAC;QACtE,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE,CAAC,EAAE,wBAAwB,IAAI,CAAC,UAAU,MAAM,WAAW,EAAE,CAAC,CAAC;IAC1G,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,QAAQ,CAChB,yBAAyB,EACzB,CAAC,EACD,OAAO,IAAI,CAAC,WAAW,cAAc,UAAU,GAAG,EAClD,UAAU,IAAI,CAAC,aAAa,GAAG,CAChC,CAAC;IACJ,CAAC;IACD,OAAO,IAAyB,CAAC;AACnC,CAAC;AAED,SAAS,cAAc,CAAC,OAAmB,EAAE,WAAmB,EAAE,SAAiB;IACjF,MAAM,MAAM,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE;QAC/E,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QAC9B,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AAC5H,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAmB,EAAE,WAAoB;IAC5E,IAAI,WAAW,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,CAAC,EAAE,aAAa,WAAW,EAAE,CAAC,CAAC;IACtH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,wBAAwB,CAAC,CAAC,CAAC;IACnF,IAAI,CAAC;QACH,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC1D,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;YACnI,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;SACxH,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QACzG,IAAI,CAAC,cAAc;YAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,CAAC,EAAE,qBAAqB,CAAC,CAAC;QACtF,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtF,IAAI,YAAY,KAAK,cAAc;YAAE,MAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE,CAAC,EAAE,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;QAExH,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,CAAC,IAAI,SAAS,CAAC,CAAC;QACpE,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/D,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACpD,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACxB,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;QAChF,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC;QACnD,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE,CAAC,EAAE,qBAAqB,CAAC,CAAC;QACpF,MAAM,UAAU,GAAG,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC5E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3D,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAChI,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE,CAAC,EAAE,6BAA6B,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QACjG,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EAAE,WAAW,UAAU,WAAW,WAAW,EAAE,CAAC,CAAC;QACjH,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACtF,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;IAC5F,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"theme-download.js","sourceRoot":"","sources":["../src/theme-download.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"themes.d.ts","sourceRoot":"","sources":["../src/themes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAiB,YAAY,EAAE,MAAM,YAAY,CAAC;AAmB1G,wBAAgB,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAErD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAEhE;AAkBD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAkCxE;AAED,wBAAgB,wBAAwB,CAAC,eAAe,EAAE,MAAM,GAAG,cAAc,EAAE,CAelF;AAED,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,GAAG,cAAc,CAkBtG;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,GAAG,cAAc,CA2BlG;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,YAAY,EAAE,CAe9D"}
1
+ {"version":3,"file":"themes.d.ts","sourceRoot":"","sources":["../src/themes.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAiB,YAAY,EAAE,MAAM,YAAY,CAAC;AAmB1G,wBAAgB,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAErD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAEhE;AAkBD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAsDxE;AAED,wBAAgB,wBAAwB,CAAC,eAAe,EAAE,MAAM,GAAG,cAAc,EAAE,CAelF;AAED,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,GAAG,cAAc,CAkBtG;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,GAAG,cAAc,CA2BlG;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,YAAY,EAAE,CAe9D"}
package/dist/themes.js CHANGED
@@ -2,6 +2,7 @@ import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { CliError } from "./errors.js";
5
+ import { isCompatibleRange, isVersion } from "./semver.js";
5
6
  import { atomicWrite, readText } from "./system.js";
6
7
  const THEME_ID = /^[a-z0-9][a-z0-9._-]{0,63}$/;
7
8
  const MAX_THEME_BYTES = 64 * 1024 * 1024;
@@ -68,9 +69,28 @@ export function validateThemeDirectory(directory) {
68
69
  if (!manifest || typeof manifest !== "object" || Array.isArray(manifest)) {
69
70
  throw new CliError("THEME_MANIFEST_INVALID", 2, `theme.json 必须是对象:${source}`);
70
71
  }
72
+ if (manifest.schemaVersion != null && (!Number.isInteger(manifest.schemaVersion) || Number(manifest.schemaVersion) < 1)) {
73
+ throw new CliError("THEME_MANIFEST_INVALID", 2, `schemaVersion 必须是正整数:${source}`);
74
+ }
71
75
  const id = typeof manifest.id === "string" && manifest.id ? manifest.id : path.basename(source);
72
76
  if (!THEME_ID.test(id))
73
77
  throw new CliError("THEME_ID_INVALID", 2, `主题 ID 不合法:${id}`, "仅允许小写字母、数字、点、横线和下划线,最长 64 字符。");
78
+ const version = manifest.version == null ? "0.0.0" : manifest.version;
79
+ if (!isVersion(version))
80
+ throw new CliError("THEME_VERSION_INVALID", 2, `主题版本不合法:${String(version)}`, "使用 SemVer,例如 1.0.0。");
81
+ let compatibleCli = null;
82
+ if (manifest.engines != null) {
83
+ if (!manifest.engines || typeof manifest.engines !== "object" || Array.isArray(manifest.engines)) {
84
+ throw new CliError("THEME_MANIFEST_INVALID", 2, `engines 必须是对象:${source}`);
85
+ }
86
+ const declared = manifest.engines.twskin;
87
+ if (declared != null) {
88
+ if (!isCompatibleRange(declared)) {
89
+ throw new CliError("THEME_ENGINE_RANGE_INVALID", 2, `主题兼容范围不合法:${String(declared)}`, "使用形如 >=0.5.4 <1.0.0 的范围。");
90
+ }
91
+ compatibleCli = declared;
92
+ }
93
+ }
74
94
  const background = CANONICAL_ASSETS
75
95
  .filter((filename) => filename.startsWith("background."))
76
96
  .find((filename) => fs.existsSync(path.join(source, filename)));
@@ -78,6 +98,8 @@ export function validateThemeDirectory(directory) {
78
98
  throw new CliError("THEME_BACKGROUND_MISSING", 2, `主题缺少 canonical background:${source}`);
79
99
  return {
80
100
  id,
101
+ version,
102
+ compatibleCli,
81
103
  name: typeof manifest.name === "string" && manifest.name ? manifest.name : id,
82
104
  desc: typeof manifest.desc === "string" ? manifest.desc : "",
83
105
  manifest,
@@ -174,10 +196,10 @@ export function listThemes(context) {
174
196
  continue;
175
197
  try {
176
198
  const theme = validateThemeDirectory(directory);
177
- themes.push({ id: theme.id, name: theme.name, desc: theme.desc });
199
+ themes.push({ id: theme.id, version: theme.version, name: theme.name, desc: theme.desc });
178
200
  }
179
201
  catch (error) {
180
- themes.push({ id: entry.name, name: entry.name, desc: error instanceof Error ? error.message : String(error), invalid: true });
202
+ themes.push({ id: entry.name, version: "?", name: entry.name, desc: error instanceof Error ? error.message : String(error), invalid: true });
181
203
  }
182
204
  }
183
205
  return themes.sort((left, right) => left.id.localeCompare(right.id));