twskin 0.5.3 → 0.5.5

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.
@@ -1 +1 @@
1
- {"version":3,"file":"themes.js","sourceRoot":"","sources":["../src/themes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGpD,MAAM,QAAQ,GAAG,6BAA6B,CAAC;AAC/C,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACzC,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC;AACnC,MAAM,gBAAgB,GAAG;IACvB,WAAW;IACX,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;IAClB,kBAAkB;IAClB,mBAAmB;IACnB,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;CACnB,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,OAAmB;IAC3C,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAmB,EAAE,EAAU;IACxD,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAiB;IACzC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,KAAK,GAAG,CAAC,OAAe,EAAQ,EAAE;QACtC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,KAAK,CAAC,cAAc,EAAE;gBAAE,MAAM,IAAI,QAAQ,CAAC,eAAe,EAAE,CAAC,EAAE,cAAc,IAAI,EAAE,CAAC,CAAC;YACzF,IAAI,KAAK,CAAC,WAAW,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC;iBAChC,IAAI,KAAK,CAAC,MAAM,EAAE;gBAAE,UAAU,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;QAChE,CAAC;IACH,CAAC,CAAC;IACF,KAAK,CAAC,SAAS,CAAC,CAAC;IACjB,IAAI,UAAU,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EAAE,UAAU,eAAe,GAAG,IAAI,GAAG,IAAI,OAAO,SAAS,EAAE,CAAC,CAAC;IACtG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACjE,MAAM,IAAI,QAAQ,CAAC,wBAAwB,EAAE,CAAC,EAAE,WAAW,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACrD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,wBAAwB,EAAE,CAAC,EAAE,iBAAiB,MAAM,EAAE,CAAC,CAAC;IAC7G,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,GAAG,cAAc;QAAE,MAAM,IAAI,QAAQ,CAAC,0BAA0B,EAAE,CAAC,EAAE,sBAAsB,MAAM,EAAE,CAAC,CAAC;IACvI,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpD,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,GAAG,cAAc,EAAE,CAAC;QACnF,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE,CAAC,EAAE,qBAAqB,MAAM,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,QAAuB,CAAC;IAC5B,IAAI,CAAC;QAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAAC,CAAC;IACrE,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,IAAI,QAAQ,CAAC,wBAAwB,EAAE,CAAC,EAAE,mBAAmB,MAAM,EAAE,EAAE,cAAc,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAAC,CAAC;IACvK,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,QAAQ,CAAC,wBAAwB,EAAE,CAAC,EAAE,oBAAoB,MAAM,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,EAAE,GAAG,OAAO,QAAQ,CAAC,EAAE,KAAK,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,+BAA+B,CAAC,CAAC;IACtH,MAAM,UAAU,GAAG,gBAAgB;SAChC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;SACxD,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,QAAQ,CAAC,0BAA0B,EAAE,CAAC,EAAE,6BAA6B,MAAM,EAAE,CAAC,CAAC;IAC1G,OAAO;QACL,EAAE;QACF,IAAI,EAAE,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;QAC7E,IAAI,EAAE,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;QAC5D,QAAQ;QACR,UAAU;QACV,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,eAAuB;IAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7C,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAAE,OAAO,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5F,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACjE,MAAM,IAAI,QAAQ,CAAC,wBAAwB,EAAE,CAAC,EAAE,WAAW,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACpE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YAAE,SAAS;QACjE,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EAAE,aAAa,MAAM,EAAE,CAAC,CAAC;IACzF,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,eAAuB,EAAE,oBAA4B;IACpF,MAAM,KAAK,GAAG,sBAAsB,CAAC,eAAe,CAAC,CAAC;IACtD,EAAE,CAAC,SAAS,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC,CAAC;IACtG,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACjD,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;QAClE,EAAE,CAAC,SAAS,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YACzE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAmB,EAAE,eAAuB;IAChF,MAAM,KAAK,GAAG,sBAAsB,CAAC,eAAe,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAEvG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,EAAE,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,KAAK,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,kBAAkB,KAAK,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC,CAAC;IACpF,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,CAAC;QACH,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACzC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC9B,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,aAAa;YAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACvE,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC;gBAAC,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACjD,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAmB;IAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,CAAC;IACjD,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/E,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YAAE,SAAS;QACjE,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACjI,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACvE,CAAC"}
1
+ {"version":3,"file":"themes.js","sourceRoot":"","sources":["../src/themes.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -7,6 +7,10 @@ export interface CliPaths {
7
7
  lockFile: string;
8
8
  logFile: string;
9
9
  runtimeManifest: string;
10
+ catalogCache: string;
11
+ catalogState: string;
12
+ themeUpdateSettings: string;
13
+ themeSyncState: string;
10
14
  }
11
15
  export interface AppContext {
12
16
  bundle: string;
@@ -33,12 +37,19 @@ export interface CliOptions {
33
37
  help: boolean;
34
38
  }
35
39
  export interface ThemeManifest extends Record<string, unknown> {
40
+ schemaVersion?: number;
36
41
  id?: string;
42
+ version?: string;
43
+ engines?: {
44
+ twskin?: string;
45
+ };
37
46
  name?: string;
38
47
  desc?: string;
39
48
  }
40
49
  export interface ThemeDirectory {
41
50
  id: string;
51
+ version: string;
52
+ compatibleCli: string | null;
42
53
  name: string;
43
54
  desc: string;
44
55
  manifest: ThemeManifest;
@@ -51,6 +62,7 @@ export interface InstalledTheme extends ThemeDirectory {
51
62
  }
52
63
  export interface ThemeSummary {
53
64
  id: string;
65
+ version: string;
54
66
  name: string;
55
67
  desc: string;
56
68
  invalid?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,KAAK,GAAG,YAAY,GAAG,MAAM,CAAC;AAEzE,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;IAC3B,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1B,GAAG,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,aAAc,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC5D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,KAAK,GAAG,YAAY,GAAG,MAAM,CAAC;AAEzE,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;IAC3B,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1B,GAAG,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,aAAc,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
@@ -20,7 +20,7 @@ This creates the current `twskin` version on npm. Verify it with:
20
20
 
21
21
  ```bash
22
22
  npm view twskin version --registry=https://registry.npmjs.org
23
- npm install --global twskin
23
+ npm install --global twskin@latest --registry=https://registry.npmjs.org
24
24
  ```
25
25
 
26
26
  ## Trusted publishing
@@ -27,6 +27,8 @@ twskin-themes.tar.gz
27
27
  twskin-themes.sha256
28
28
  twskin-themes-v<version>.tar.gz
29
29
  twskin-themes-v<version>.sha256
30
+ twskin-catalog-v1.json
31
+ twskin-catalog-v1-v<version>.json
30
32
  ```
31
33
 
32
34
  `twskin theme download [id]` downloads the fixed-name assets through GitHub's
@@ -35,16 +37,32 @@ API. The versioned copies remain available for archival and manual downloads.
35
37
  With no ID, all themes are installed; with an ID, only that theme is installed.
36
38
  The archive root contains `theme-pack.json` and `themes/<id>/` directories.
37
39
 
40
+ `twskin-catalog-v1.json` is uploaded after all theme assets. It contains the
41
+ release tag, a versioned package filename, size and SHA-256, plus each theme's
42
+ ID, SemVer version, schema version and compatible CLI range. Catalog sync
43
+ downloads the package from `releases/download/<release-tag>/`, never through the
44
+ mutable `latest/download` alias. The CLI caches it locally and uses `ETag`
45
+ conditional requests; the Theme Manager watcher checks at most once every six
46
+ hours. `twskin theme check` only checks the catalog, while
47
+ `twskin theme sync` downloads the pack only when compatible themes are new or
48
+ have a higher version. Automatic official-theme updates can be toggled with
49
+ `twskin theme auto-update on|off`.
50
+
38
51
  The command limits metadata and archive sizes, uses a network timeout, verifies
39
52
  SHA-256 before extraction, rejects absolute/traversal paths and link/special file
40
53
  types, validates every theme manifest and performs an atomic directory swap with
41
54
  rollback. It never changes the active theme implicitly.
42
55
 
43
56
  For testing or an enterprise mirror, `TWSKIN_RELEASE_ASSET_BASE_URL` may point
44
- to a directory containing the fixed-name assets. The legacy
57
+ to a directory containing the versioned asset names declared by the Catalog.
58
+ The legacy
45
59
  `TWSKIN_RELEASE_API_URL` override remains available for a GitHub-compatible
46
60
  latest-release JSON endpoint.
47
61
 
62
+ `TWSKIN_THEME_CATALOG_URL` can override the Catalog URL for tests or an
63
+ enterprise deployment. Its referenced package assets still resolve from
64
+ `TWSKIN_RELEASE_ASSET_BASE_URL`.
65
+
48
66
  When GitHub's anonymous API quota is unavailable, set `TWSKIN_GITHUB_TOKEN`,
49
67
  `GH_TOKEN`, or `GITHUB_TOKEN`. The CLI only sends that token to HTTPS requests
50
68
  for `api.github.com` and `github.com`; it is never forwarded to a configured
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "twskin",
3
- "version": "0.5.3",
3
+ "version": "0.5.5",
4
4
  "description": "An unofficial community theme manager and CLI for TRAE Work on macOS.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -30,7 +30,7 @@
30
30
  "check": "npm run typecheck && node ./scripts/check-package.mjs",
31
31
  "test": "npm run build && node --test \"test/*.test.mjs\"",
32
32
  "build:themes": "npm run build && node ../../scripts/build-theme-pack.mjs",
33
- "prepack": "npm run prepare:runtime && npm run check && npm test",
33
+ "prepack": "npm run prepare:runtime && npm test && npm run check",
34
34
  "pack:dry-run": "npm pack --dry-run"
35
35
  },
36
36
  "engines": {
@@ -12,10 +12,11 @@
12
12
  import fs from "node:fs";
13
13
  import os from "node:os";
14
14
  import path from "node:path";
15
+ import { spawnSync } from "node:child_process";
15
16
  import { fileURLToPath } from "node:url";
16
17
 
17
18
  const ROOT = path.dirname(fileURLToPath(import.meta.url));
18
- const VERSION = "0.5.3";
19
+ const VERSION = "0.5.5";
19
20
  const DATA_DIR = process.env.TWSKIN_DATA_DIR || path.join(os.homedir(), ".trae-work-skin");
20
21
 
21
22
  function parseArgs(argv) {
@@ -61,6 +62,12 @@ const STATE_DIR = process.env.TWSKIN_STATE_DIR || path.join(DATA_DIR, "run");
61
62
  const THEME_CONF = path.join(STATE_DIR, "theme.conf");
62
63
  const PID_FILE = path.join(STATE_DIR, "injector.pid");
63
64
  const MAX_THEME_CSS_BYTES = 1024 * 1024;
65
+ const DEFAULT_CATALOG_CHECK_INTERVAL_MS = 6 * 60 * 60 * 1000;
66
+
67
+ function catalogCheckIntervalMs() {
68
+ const configured = Number(process.env.TWSKIN_CATALOG_CHECK_INTERVAL_MS || DEFAULT_CATALOG_CHECK_INTERVAL_MS);
69
+ return Number.isFinite(configured) && configured >= 0 ? configured : DEFAULT_CATALOG_CHECK_INTERVAL_MS;
70
+ }
64
71
 
65
72
  function buildCatalog(themesDir) {
66
73
  const catalog = [];
@@ -139,6 +146,7 @@ function buildCatalog(themesDir) {
139
146
  }
140
147
  catalog.push({
141
148
  id: String(meta.id),
149
+ version: typeof meta.version === "string" ? meta.version : "0.0.0",
142
150
  name: String(meta.name),
143
151
  desc: String(meta.desc || ""),
144
152
  category: String(meta.category || "其他"),
@@ -154,6 +162,14 @@ function buildCatalog(themesDir) {
154
162
  return catalog;
155
163
  }
156
164
 
165
+ function readThemeSyncState() {
166
+ try {
167
+ const parsed = JSON.parse(fs.readFileSync(path.join(STATE_DIR, "theme-sync-state.json"), "utf8"));
168
+ if (parsed && parsed.schemaVersion === 1 && typeof parsed.phase === "string") return parsed;
169
+ } catch {}
170
+ return { schemaVersion: 1, phase: "idle", autoUpdateThemes: true, updateCount: 0, newThemes: 0, updatedThemes: 0, incompatibleThemes: 0 };
171
+ }
172
+
157
173
  function readThemeConf() {
158
174
  try { return fs.readFileSync(THEME_CONF, "utf8").trim() || null; } catch { return null; }
159
175
  }
@@ -180,6 +196,7 @@ export function buildPayload(args) {
180
196
  .replaceAll("__BASE_CSS__", () => JSON.stringify(baseCss))
181
197
  .replaceAll("__MANAGER_CSS__", () => JSON.stringify(managerCss))
182
198
  .replaceAll("__CATALOG__", () => JSON.stringify(catalog))
199
+ .replaceAll("__THEME_SYNC_STATE__", () => JSON.stringify(readThemeSyncState()))
183
200
  .replaceAll("__DEFAULT_THEME__", () => JSON.stringify(resolveDefaultTheme(catalog, args.defaultTheme)))
184
201
  .replaceAll("__VERSION__", () => JSON.stringify(VERSION));
185
202
  }
@@ -281,6 +298,61 @@ async function getStamp(session) {
281
298
  }
282
299
  }
283
300
 
301
+ async function readPageThemeSyncRequest(session) {
302
+ try {
303
+ const result = await session.send("Runtime.evaluate", {
304
+ expression: "window.__TRAE_DREAM_SKIN_SYNC_REQUEST__ || null",
305
+ returnByValue: true,
306
+ }, 4000);
307
+ const request = result.result?.value;
308
+ return request && typeof request === "object" && typeof request.id === "string" && typeof request.action === "string" ? request : null;
309
+ } catch {
310
+ return null;
311
+ }
312
+ }
313
+
314
+ async function publishThemeSyncState(sessions, state) {
315
+ const expression = `(() => {
316
+ window.__TRAE_DREAM_SKIN_SYNC_STATE__ = ${JSON.stringify(state)};
317
+ window.dispatchEvent(new CustomEvent("trae-dream-skin-sync-state"));
318
+ })()`;
319
+ for (const entry of sessions.values()) {
320
+ if (entry.session.closed) continue;
321
+ await entry.session.send("Runtime.evaluate", { expression, returnByValue: true }, 4000).catch(() => {});
322
+ }
323
+ }
324
+
325
+ function runThemeCli(action, value) {
326
+ const entry = process.env.TWSKIN_CLI_ENTRY;
327
+ if (!entry || !fs.existsSync(entry)) throw new Error("theme sync CLI entry is unavailable");
328
+ const args = action === "check"
329
+ ? [entry, "theme", "check", "--json"]
330
+ : action === "sync"
331
+ ? [entry, "theme", "sync", "--json"]
332
+ : action === "auto-sync"
333
+ ? [entry, "theme", "auto-sync", "--json"]
334
+ : action === "auto-update"
335
+ ? [entry, "theme", "auto-update", value ? "on" : "off", "--json"]
336
+ : null;
337
+ if (!args) throw new Error(`unknown theme sync action: ${action}`);
338
+ const result = spawnSync(process.execPath, args, {
339
+ cwd: path.dirname(entry),
340
+ env: process.env,
341
+ encoding: "utf8",
342
+ stdio: ["ignore", "pipe", "pipe"],
343
+ });
344
+ if (result.status !== 0) {
345
+ try {
346
+ const payload = JSON.parse(result.stdout || "{}");
347
+ throw new Error(payload.error?.message || result.stderr.trim() || "theme sync failed");
348
+ } catch (error) {
349
+ if (error instanceof SyntaxError) throw new Error(result.stderr.trim() || "theme sync failed");
350
+ throw error;
351
+ }
352
+ }
353
+ return readThemeSyncState();
354
+ }
355
+
284
356
  async function cmdList(args) {
285
357
  const targets = await listPageTargets(args.port, args.timeoutMs);
286
358
  for (const t of targets) {
@@ -560,6 +632,9 @@ async function cmdWatch(args, payload) {
560
632
  let enableOnStartup = true;
561
633
  let lastReloadRequest = null;
562
634
  let reloadPrimed = false;
635
+ let lastThemeSyncRequest = null;
636
+ let themeSyncPrimed = false;
637
+ let nextAutomaticThemeSyncAt = Date.now() + 4_000;
563
638
 
564
639
  const injectTarget = async (target) => {
565
640
  const session = await CdpSession.connect(target.webSocketDebuggerUrl, args.timeoutMs);
@@ -584,6 +659,46 @@ async function cmdWatch(args, payload) {
584
659
  log(`injected into ${target.id} (${target.url}) -> ${JSON.stringify(r)}`);
585
660
  };
586
661
 
662
+ const rebuildThemePayload = async (openPanel = false) => {
663
+ payload = buildPayload(args);
664
+ for (const entry of sessions.values()) {
665
+ if (entry.session.closed) continue;
666
+ try {
667
+ await injectInto(entry.session, payload);
668
+ } catch (error) {
669
+ log(`theme catalog re-inject failed ${entry.target.id}: ${error.message}`);
670
+ }
671
+ }
672
+ if (openPanel) {
673
+ const entry = sessions.values().next().value;
674
+ if (entry?.session && !entry.session.closed) {
675
+ await entry.session.send("Runtime.evaluate", {
676
+ expression: "window.__TRAE_DREAM_SKIN_GALLERY__?.open?.()",
677
+ returnByValue: true,
678
+ }, 4000).catch(() => {});
679
+ }
680
+ }
681
+ };
682
+
683
+ const handleThemeSync = async (action, { value = null, openPanel = false, silent = false } = {}) => {
684
+ const current = readThemeSyncState();
685
+ const phase = action === "check" ? "checking" : action === "auto-update" ? "idle" : "downloading";
686
+ if (!silent) {
687
+ await publishThemeSyncState(sessions, { ...current, phase, message: action === "check" ? "正在检查主题更新" : "正在同步官方主题" });
688
+ }
689
+ try {
690
+ const state = runThemeCli(action === "auto-sync" ? "auto-sync" : action, value);
691
+ await publishThemeSyncState(sessions, state);
692
+ log(`theme ${action} completed: ${state.phase}`);
693
+ await rebuildThemePayload(openPanel || state.phase === "success");
694
+ } catch (error) {
695
+ const failed = { ...readThemeSyncState(), phase: "error", message: error instanceof Error ? error.message : String(error) };
696
+ await publishThemeSyncState(sessions, failed);
697
+ log(`theme ${action} failed: ${failed.message}`);
698
+ await rebuildThemePayload(openPanel);
699
+ }
700
+ };
701
+
587
702
  const tick = async () => {
588
703
  // 单实例约定:pid 文件被其它注入器接管时自动退出,
589
704
  // 避免多个守护进程同时注入、互相覆盖(后者启动者胜)
@@ -680,6 +795,23 @@ async function cmdWatch(args, payload) {
680
795
  log(`theme reload failed: ${error.message}`);
681
796
  }
682
797
  }
798
+
799
+ const syncRequest = await readPageThemeSyncRequest(firstEntry.session);
800
+ if (!themeSyncPrimed) {
801
+ themeSyncPrimed = true;
802
+ lastThemeSyncRequest = syncRequest?.id || null;
803
+ } else if (syncRequest && syncRequest.id !== lastThemeSyncRequest) {
804
+ lastThemeSyncRequest = syncRequest.id;
805
+ const action = ["check", "sync", "auto-update"].includes(syncRequest.action) ? syncRequest.action : "check";
806
+ await handleThemeSync(action, {
807
+ value: syncRequest.autoUpdate === true,
808
+ openPanel: true,
809
+ });
810
+ nextAutomaticThemeSyncAt = Date.now() + catalogCheckIntervalMs();
811
+ } else if (Date.now() >= nextAutomaticThemeSyncAt) {
812
+ nextAutomaticThemeSyncAt = Date.now() + catalogCheckIntervalMs();
813
+ await handleThemeSync("auto-sync", { silent: true });
814
+ }
683
815
  }
684
816
  };
685
817
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "packageVersion": "0.5.3",
3
+ "packageVersion": "0.5.5",
4
4
  "themesBundled": false,
5
5
  "files": [
6
6
  {
@@ -10,8 +10,8 @@
10
10
  },
11
11
  {
12
12
  "path": "injector.mjs",
13
- "size": 25662,
14
- "sha256": "10671777cd09c02d49ca6fb0278f0dac5de70f793ad9edd11fcabf7b9ab254dd"
13
+ "size": 31308,
14
+ "sha256": "ed68cba722846616215727222eb8588ac7dcb7fac1b4e7b8b04b27f6146b9db4"
15
15
  },
16
16
  {
17
17
  "path": "restore.sh",
@@ -20,8 +20,8 @@
20
20
  },
21
21
  {
22
22
  "path": "skin.js",
23
- "size": 51083,
24
- "sha256": "1c7440b976f20d1d881e3dfdfd47ecc36a7ab2b3ae19897608d40fca7740399f"
23
+ "size": 56513,
24
+ "sha256": "190e85b43a0c7d901a9b25cde65d19767bf1099901fb8e75f9fce7a40e2c3ea0"
25
25
  },
26
26
  {
27
27
  "path": "start.sh",
@@ -35,8 +35,8 @@
35
35
  },
36
36
  {
37
37
  "path": "styles/manager.css",
38
- "size": 15460,
39
- "sha256": "827be58fe3933a3dafe5edc5bf9184f45e0094af3c9a766a560c54b442a49d1d"
38
+ "size": 17342,
39
+ "sha256": "b765d8ad89324af100794c653a23d64e1e647d78a7e9d815eb912189974d7dfc"
40
40
  },
41
41
  {
42
42
  "path": "token-map.mjs",
package/runtime/skin.js CHANGED
@@ -7,6 +7,7 @@
7
7
  const TOKEN_MAP = self.DREAM_SKIN_TOKEN_MAP;
8
8
  const COMPONENT_MAP = self.DREAM_SKIN_COMPONENT_MAP;
9
9
  const CATALOG = __CATALOG__;
10
+ let themeSyncState = __THEME_SYNC_STATE__;
10
11
  const DEFAULT_THEME = __DEFAULT_THEME__;
11
12
  const VERSION = __VERSION__;
12
13
  const BASE_CSS = __BASE_CSS__;
@@ -666,6 +667,11 @@ ${selector} {
666
667
  configToggle.type = "button";
667
668
  configToggle.textContent = "配置";
668
669
  configToggle.title = "查看当前主题配置";
670
+ const syncButton = document.createElement("button");
671
+ syncButton.className = "ds-sync";
672
+ syncButton.type = "button";
673
+ syncButton.textContent = "更新";
674
+ syncButton.title = "检查官方主题更新";
669
675
  const reloadButton = document.createElement("button");
670
676
  reloadButton.className = "ds-reload";
671
677
  reloadButton.type = "button";
@@ -676,13 +682,15 @@ ${selector} {
676
682
  closeButton.type = "button";
677
683
  closeButton.textContent = "×";
678
684
  closeButton.title = "关闭 (Esc)";
679
- headerActions.append(reloadButton, configToggle, closeButton);
685
+ headerActions.append(syncButton, reloadButton, configToggle, closeButton);
680
686
  header.append(headerText, headerActions);
681
687
  const panelBody = document.createElement("div");
682
688
  panelBody.className = "ds-body";
683
689
 
684
690
  const galleryView = document.createElement("div");
685
691
  galleryView.className = "ds-gallery-view";
692
+ const syncBanner = document.createElement("div");
693
+ syncBanner.className = "ds-sync-banner";
686
694
  const configView = document.createElement("div");
687
695
  configView.className = "ds-config-view";
688
696
  const configHead = document.createElement("div");
@@ -709,6 +717,23 @@ ${selector} {
709
717
  blurSwitch.setAttribute("role", "switch");
710
718
  blurSwitch.setAttribute("aria-label", "面板模糊");
711
719
  blurRow.append(blurCopy, blurSwitch);
720
+ const updateRow = document.createElement("div");
721
+ updateRow.className = "ds-setting-row";
722
+ const updateCopy = document.createElement("div");
723
+ updateCopy.className = "ds-setting-copy";
724
+ const updateLabel = document.createElement("div");
725
+ updateLabel.className = "ds-setting-label";
726
+ updateLabel.textContent = "自动更新官方主题";
727
+ const updateDesc = document.createElement("div");
728
+ updateDesc.className = "ds-setting-desc";
729
+ updateDesc.textContent = "发现兼容的新主题或更新时自动下载安装";
730
+ updateCopy.append(updateLabel, updateDesc);
731
+ const updateSwitch = document.createElement("button");
732
+ updateSwitch.className = "ds-switch";
733
+ updateSwitch.type = "button";
734
+ updateSwitch.setAttribute("role", "switch");
735
+ updateSwitch.setAttribute("aria-label", "自动更新官方主题");
736
+ updateRow.append(updateCopy, updateSwitch);
712
737
  const brightnessRow = document.createElement("div");
713
738
  brightnessRow.className = "ds-setting-row ds-setting-row-slider";
714
739
  const brightnessHead = document.createElement("div");
@@ -769,8 +794,8 @@ ${selector} {
769
794
  resetActions.className = "ds-reset-actions";
770
795
  resetActions.append(resetCancel, resetConfig);
771
796
  configHead.append(configName, copyConfig);
772
- configView.append(configHead, brightnessRow, mainOverlayRow, blurRow, configCode);
773
- panelBody.append(galleryView, configView);
797
+ configView.append(configHead, updateRow, brightnessRow, mainOverlayRow, blurRow, configCode);
798
+ panelBody.append(syncBanner, galleryView, configView);
774
799
 
775
800
  // 分类 Tab(固定在头部下,不随列表滚动;选择持久化)
776
801
  const CATEGORY_LS = `${LS_PREFIX}category`;
@@ -829,7 +854,7 @@ ${selector} {
829
854
  )) => {
830
855
  if (!theme) return;
831
856
  const config = publicThemeConfig(theme);
832
- configName.textContent = `${theme.name} · ${theme.id}`;
857
+ configName.textContent = `${theme.name} · ${theme.id} · v${theme.version || "0.0.0"}`;
833
858
  currentLabel.textContent = `当前:${theme.name}`;
834
859
  configCode.textContent = JSON.stringify(config, null, 2);
835
860
  };
@@ -840,6 +865,67 @@ ${selector} {
840
865
  blurSwitch.setAttribute("aria-checked", String(Boolean(enabled)));
841
866
  blurSwitch.title = enabled ? "关闭毛玻璃效果" : "启用毛玻璃效果";
842
867
  };
868
+ const requestThemeSync = (action, autoUpdate) => {
869
+ const id = `${Date.now()}-${Math.random().toString(36).slice(2)}`;
870
+ window.__TRAE_DREAM_SKIN_SYNC_REQUEST__ = { id, action, ...(typeof autoUpdate === "boolean" ? { autoUpdate } : {}) };
871
+ themeSyncState = {
872
+ ...themeSyncState,
873
+ phase: action === "check" ? "checking" : action === "auto-update" ? "idle" : "downloading",
874
+ message: action === "check" ? "正在检查主题更新" : "正在同步官方主题",
875
+ };
876
+ renderThemeSyncState();
877
+ };
878
+ const syncSummary = () => {
879
+ if (themeSyncState.phase === "checking") return "正在检查主题更新…";
880
+ if (themeSyncState.phase === "downloading" || themeSyncState.phase === "installing") return themeSyncState.message || "正在同步官方主题…";
881
+ if (themeSyncState.phase === "update-available") return `发现 ${themeSyncState.newThemes || 0} 个新主题、${themeSyncState.updatedThemes || 0} 个更新`;
882
+ if (themeSyncState.phase === "success") return themeSyncState.message || "主题同步完成";
883
+ if (themeSyncState.phase === "error") return themeSyncState.message || "主题更新失败";
884
+ return "";
885
+ };
886
+ const renderThemeSyncState = () => {
887
+ const phase = themeSyncState.phase || "idle";
888
+ const summary = syncSummary();
889
+ syncBanner.replaceChildren();
890
+ syncBanner.className = `ds-sync-banner ds-sync-${phase}`;
891
+ if (!summary || phase === "fresh" || phase === "idle") {
892
+ syncBanner.style.display = "none";
893
+ } else {
894
+ syncBanner.style.display = "flex";
895
+ const text = document.createElement("span");
896
+ text.className = "ds-sync-copy";
897
+ text.textContent = summary;
898
+ syncBanner.append(text);
899
+ if (phase === "update-available") {
900
+ const install = document.createElement("button");
901
+ install.type = "button";
902
+ install.className = "ds-sync-action";
903
+ install.textContent = "立即更新";
904
+ install.addEventListener("click", (event) => {
905
+ event.stopPropagation();
906
+ requestThemeSync("sync");
907
+ });
908
+ syncBanner.append(install);
909
+ } else if (phase === "error") {
910
+ const retry = document.createElement("button");
911
+ retry.type = "button";
912
+ retry.className = "ds-sync-action";
913
+ retry.textContent = "重试";
914
+ retry.addEventListener("click", (event) => {
915
+ event.stopPropagation();
916
+ requestThemeSync("check");
917
+ });
918
+ syncBanner.append(retry);
919
+ }
920
+ }
921
+ syncButton.classList.toggle("ds-sync-pending", Number(themeSyncState.updateCount || 0) > 0);
922
+ syncButton.disabled = phase === "checking" || phase === "downloading" || phase === "installing";
923
+ syncButton.title = summary || "检查官方主题更新";
924
+ updateSwitch.setAttribute("aria-checked", String(Boolean(themeSyncState.autoUpdateThemes)));
925
+ updateSwitch.title = themeSyncState.autoUpdateThemes ? "关闭官方主题自动更新" : "开启官方主题自动更新";
926
+ const checkedAt = themeSyncState.lastCheckedAt ? new Date(themeSyncState.lastCheckedAt).toLocaleString() : "尚未检查";
927
+ footerText.textContent = `TRAE Work Skin v${VERSION} · 主题更新:${checkedAt}`;
928
+ };
843
929
  renderBrightnessControl = (theme = findTheme(
844
930
  (() => { try { return localStorage.getItem(LS_KEY); } catch { return null; } })(),
845
931
  ), value = theme ? backgroundBrightness(theme) : 1) => {
@@ -869,6 +955,14 @@ ${selector} {
869
955
  renderCurrentConfig();
870
956
  showConfig(!configOpen);
871
957
  });
958
+ syncButton.addEventListener("click", (event) => {
959
+ event.stopPropagation();
960
+ requestThemeSync("check");
961
+ });
962
+ updateSwitch.addEventListener("click", (event) => {
963
+ event.stopPropagation();
964
+ requestThemeSync("auto-update", !themeSyncState.autoUpdateThemes);
965
+ });
872
966
  copyConfig.addEventListener("click", async (event) => {
873
967
  event.stopPropagation();
874
968
  const original = copyConfig.textContent;
@@ -986,6 +1080,10 @@ ${selector} {
986
1080
  name.className = "ds-name";
987
1081
  name.textContent = theme.name;
988
1082
  meta.appendChild(name);
1083
+ const version = document.createElement("span");
1084
+ version.className = "ds-version";
1085
+ version.textContent = `v${theme.version || "0.0.0"}`;
1086
+ meta.appendChild(version);
989
1087
  if (theme.desc) {
990
1088
  const desc = document.createElement("span");
991
1089
  desc.className = "ds-desc";
@@ -998,6 +1096,7 @@ ${selector} {
998
1096
  galleryView.appendChild(card);
999
1097
  }
1000
1098
  applyCategoryFilter();
1099
+ renderThemeSyncState();
1001
1100
 
1002
1101
  const button = document.createElement("button");
1003
1102
  button.id = BUTTON_ID;
@@ -1031,6 +1130,15 @@ ${selector} {
1031
1130
  window.__TRAE_DREAM_SKIN_RELOAD_REQUEST__ = Date.now();
1032
1131
  setTimeout(() => reloadButton.classList.remove("ds-reload-loading"), 6000);
1033
1132
  });
1133
+ window.__TRAE_DREAM_SKIN_SYNC_LISTENER__ && window.removeEventListener("trae-dream-skin-sync-state", window.__TRAE_DREAM_SKIN_SYNC_LISTENER__);
1134
+ window.__TRAE_DREAM_SKIN_SYNC_LISTENER__ = () => {
1135
+ const next = window.__TRAE_DREAM_SKIN_SYNC_STATE__;
1136
+ if (next && typeof next === "object") {
1137
+ themeSyncState = next;
1138
+ renderThemeSyncState();
1139
+ }
1140
+ };
1141
+ window.addEventListener("trae-dream-skin-sync-state", window.__TRAE_DREAM_SKIN_SYNC_LISTENER__);
1034
1142
  document.addEventListener("click", (e) => {
1035
1143
  if (isPanelOpen() && !panel.contains(e.target)) setPanelOpen(false);
1036
1144
  });