@sfmc-bds/cli 0.6.1 → 0.8.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.
Files changed (39) hide show
  1. package/dist/logs.d.ts +21 -0
  2. package/dist/logs.d.ts.map +1 -1
  3. package/dist/logs.js +67 -1
  4. package/dist/logs.js.map +2 -2
  5. package/dist/management/config.d.ts.map +1 -1
  6. package/dist/management/config.js +5 -1
  7. package/dist/management/config.js.map +2 -2
  8. package/dist/management/domain.d.ts +46 -2
  9. package/dist/management/domain.d.ts.map +1 -1
  10. package/dist/management/domain.js +112 -26
  11. package/dist/management/domain.js.map +2 -2
  12. package/dist/management/maintenance.d.ts +8 -0
  13. package/dist/management/maintenance.d.ts.map +1 -1
  14. package/dist/management/maintenance.js +18 -0
  15. package/dist/management/maintenance.js.map +2 -2
  16. package/dist/management/pack-import.d.ts +29 -0
  17. package/dist/management/pack-import.d.ts.map +1 -0
  18. package/dist/management/pack-import.js +108 -0
  19. package/dist/management/pack-import.js.map +7 -0
  20. package/dist/management/server.d.ts.map +1 -1
  21. package/dist/management/server.js +67 -10
  22. package/dist/management/server.js.map +2 -2
  23. package/dist/module-sidecars.d.ts.map +1 -1
  24. package/dist/module-sidecars.js +23 -0
  25. package/dist/module-sidecars.js.map +2 -2
  26. package/dist/registry.d.ts +11 -5
  27. package/dist/registry.d.ts.map +1 -1
  28. package/dist/registry.js +35 -11
  29. package/dist/registry.js.map +2 -2
  30. package/dist/services.d.ts.map +1 -1
  31. package/dist/services.js +14 -0
  32. package/dist/services.js.map +2 -2
  33. package/dist/world-packs.d.ts +47 -0
  34. package/dist/world-packs.d.ts.map +1 -1
  35. package/dist/world-packs.js +38 -11
  36. package/dist/world-packs.js.map +2 -2
  37. package/package.json +7 -7
  38. package/scripts/module-install/.sfmc-registry-cache.json +151 -28
  39. package/scripts/module-install/lib/registry-index.mjs +50 -13
@@ -1,95 +1,218 @@
1
1
  {
2
- "fetchedAt": 1790867366873,
2
+ "fetchedAt": 1792926615467,
3
3
  "index": {
4
4
  "activity-log": {
5
5
  "npm": "@sfmc-bds/module-activity-log",
6
- "version": "0.2.2",
7
- "sdk": ">=0.2.0"
6
+ "version": "0.3.0",
7
+ "sdk": ">=0.2.0",
8
+ "repo": "https://github.com/DogeLakeDev/sfmc-module-activity-log",
9
+ "name": "行为日志",
10
+ "category": "system",
11
+ "license": "ISC",
12
+ "official": true,
13
+ "requires": []
8
14
  },
9
15
  "afk": {
10
16
  "npm": "@sfmc-bds/module-afk",
11
- "version": "0.2.1",
12
- "sdk": ">=0.2.0"
17
+ "version": "0.3.0",
18
+ "sdk": ">=0.2.0",
19
+ "repo": "https://github.com/DogeLakeDev/sfmc-module-afk",
20
+ "name": "afk",
21
+ "category": "utility",
22
+ "license": "ISC",
23
+ "official": true,
24
+ "requires": []
13
25
  },
14
26
  "area": {
15
27
  "npm": "@sfmc-bds/module-area",
16
28
  "version": "0.2.1",
17
- "sdk": ">=0.2.0"
29
+ "sdk": ">=0.2.0",
30
+ "repo": "https://github.com/Tanya7z/sfmc-module-area",
31
+ "name": "area",
32
+ "description": "区域特性调度引擎",
33
+ "category": "system",
34
+ "license": "ISC",
35
+ "official": true,
36
+ "requires": []
18
37
  },
19
38
  "chat": {
20
39
  "npm": "@sfmc-bds/module-chat",
21
- "version": "0.2.2",
22
- "sdk": ">=0.2.2"
40
+ "version": "0.2.1",
41
+ "sdk": ">=0.2.0-beta.17",
42
+ "repo": "https://github.com/Tanya7z/sfmc-module-chat",
43
+ "name": "chat",
44
+ "category": "social",
45
+ "license": "ISC",
46
+ "official": true,
47
+ "requires": []
23
48
  },
24
49
  "chat-sounds": {
25
50
  "npm": "@sfmc-bds/module-chat-sounds",
26
51
  "version": "0.2.1",
27
- "sdk": ">=0.2.0"
52
+ "sdk": ">=0.2.0",
53
+ "repo": "https://github.com/Tanya7z/sfmc-module-chat-sounds",
54
+ "name": "chat-sounds",
55
+ "category": "social",
56
+ "license": "ISC",
57
+ "official": true,
58
+ "requires": [
59
+ "chat"
60
+ ]
28
61
  },
29
62
  "clean": {
30
63
  "npm": "@sfmc-bds/module-clean",
31
64
  "version": "0.2.1",
32
- "sdk": ">=0.2.0"
65
+ "sdk": ">=0.2.0",
66
+ "repo": "https://github.com/Tanya7z/sfmc-module-clean",
67
+ "name": "掉落物清理",
68
+ "description": "区域与全服掉落物预警、倒计时广播与物理回收箱清理",
69
+ "category": "utility",
70
+ "license": "ISC",
71
+ "official": true,
72
+ "requires": [
73
+ "area"
74
+ ]
33
75
  },
34
76
  "coop": {
35
77
  "npm": "@sfmc-bds/module-coop",
36
78
  "version": "0.2.2",
37
- "sdk": ">=0.2.0"
79
+ "sdk": ">=0.2.0-beta.17",
80
+ "repo": "https://github.com/Tanya7z/sfmc-module-coop",
81
+ "name": "合作社",
82
+ "category": "social",
83
+ "license": "ISC",
84
+ "official": true,
85
+ "requires": [
86
+ "economy",
87
+ "activity-log"
88
+ ]
38
89
  },
39
90
  "data-backup": {
40
91
  "npm": "@sfmc-bds/module-data-backup",
41
92
  "version": "0.2.2",
42
- "sdk": ">=0.2.0"
93
+ "sdk": ">=0.2.0",
94
+ "repo": "https://github.com/Tanya7z/sfmc-module-data-backup",
95
+ "name": "数据备份",
96
+ "category": "system",
97
+ "license": "ISC",
98
+ "official": true,
99
+ "requires": []
43
100
  },
44
101
  "economy": {
45
102
  "npm": "@sfmc-bds/module-economy",
46
103
  "version": "0.2.1",
47
- "sdk": ">=0.2.0"
104
+ "sdk": ">=0.2.0",
105
+ "repo": "https://github.com/Tanya7z/sfmc-module-economy",
106
+ "name": "经济系统",
107
+ "category": "economy",
108
+ "license": "ISC",
109
+ "official": true,
110
+ "requires": []
48
111
  },
49
112
  "fly-area": {
50
113
  "npm": "@sfmc-bds/module-fly-area",
51
114
  "version": "0.2.1",
52
- "sdk": ">=0.2.0"
115
+ "sdk": ">=0.2.0",
116
+ "repo": "https://github.com/Tanya7z/sfmc-module-fly-area",
117
+ "name": "区域飞行",
118
+ "category": "gameplay",
119
+ "license": "ISC",
120
+ "official": true,
121
+ "requires": [
122
+ "area"
123
+ ]
53
124
  },
54
125
  "gamemode-area": {
55
126
  "npm": "@sfmc-bds/module-gamemode-area",
56
127
  "version": "0.2.1",
57
- "sdk": ">=0.2.0"
128
+ "sdk": ">=0.2.0",
129
+ "repo": "https://github.com/Tanya7z/sfmc-module-gamemode-area",
130
+ "name": "区域游戏模式",
131
+ "description": "区域游戏模式切换与背包隔离置换",
132
+ "category": "gameplay",
133
+ "license": "ISC",
134
+ "official": true,
135
+ "requires": [
136
+ "area",
137
+ "inventory-switcher"
138
+ ]
58
139
  },
59
140
  "inventory-switcher": {
60
141
  "npm": "@sfmc-bds/module-inventory-switcher",
61
142
  "version": "0.2.1",
62
- "sdk": ">=0.2.0"
143
+ "sdk": ">=0.2.0",
144
+ "repo": "https://github.com/Tanya7z/sfmc-module-inventory-switcher",
145
+ "name": "背包切换",
146
+ "description": "通用背包多槽位快照持久化与原子置换服务",
147
+ "category": "system",
148
+ "license": "ISC",
149
+ "official": true,
150
+ "requires": []
63
151
  },
64
152
  "land": {
65
153
  "npm": "@sfmc-bds/module-land",
66
- "version": "0.2.2",
67
- "sdk": ">=0.2.0"
68
- },
69
- "monitor": {
70
- "npm": "@sfmc-bds/module-monitor",
71
- "version": "0.2.1",
72
- "sdk": ">=0.2.0"
154
+ "version": "1.0.0",
155
+ "sdk": ">=0.5.0",
156
+ "repo": "https://github.com/DogeLakeDev/sfmc-module-land",
157
+ "name": "领地",
158
+ "category": "gameplay",
159
+ "license": "ISC",
160
+ "official": true,
161
+ "requires": [
162
+ "economy",
163
+ "activity-log"
164
+ ]
73
165
  },
74
166
  "online-time": {
75
167
  "npm": "@sfmc-bds/module-online-time",
76
168
  "version": "0.2.2",
77
- "sdk": ">=0.2.0"
169
+ "sdk": ">=0.2.0-beta.17",
170
+ "repo": "https://github.com/Tanya7z/sfmc-module-online-time",
171
+ "name": "在线时长统计",
172
+ "description": "进服打点与心跳增量结转在线统计",
173
+ "category": "utility",
174
+ "license": "ISC",
175
+ "official": true,
176
+ "requires": []
78
177
  },
79
178
  "peace-area": {
80
179
  "npm": "@sfmc-bds/module-peace-area",
81
- "version": "0.2.1",
82
- "sdk": ">=0.2.0"
180
+ "version": "1.0.0",
181
+ "sdk": ">=0.2.0",
182
+ "repo": "https://github.com/DogeLakeDev/sfmc-module-peace-area",
183
+ "name": "和平区域",
184
+ "description": "区域怪物生成拦截",
185
+ "category": "gameplay",
186
+ "license": "ISC",
187
+ "official": true,
188
+ "requires": [
189
+ "area"
190
+ ]
83
191
  },
84
192
  "qa": {
85
193
  "npm": "@sfmc-bds/module-qa",
86
194
  "version": "0.2.1",
87
- "sdk": ">=0.2.0"
195
+ "sdk": ">=0.2.0-beta.17",
196
+ "repo": "https://github.com/Tanya7z/sfmc-module-qa",
197
+ "name": "QA",
198
+ "category": "gameplay",
199
+ "license": "ISC",
200
+ "official": true,
201
+ "requires": [
202
+ "economy",
203
+ "chat"
204
+ ]
88
205
  },
89
206
  "spawn-protect": {
90
207
  "npm": "@sfmc-bds/module-spawn-protect",
91
208
  "version": "0.2.1",
92
- "sdk": ">=0.2.0"
209
+ "sdk": ">=0.2.0",
210
+ "repo": "https://github.com/Tanya7z/sfmc-module-spawn-protect",
211
+ "name": "出生保护",
212
+ "category": "utility",
213
+ "license": "ISC",
214
+ "official": true,
215
+ "requires": []
93
216
  }
94
217
  }
95
218
  }
@@ -3,15 +3,40 @@
3
3
  * 解析 Tanya7z/sfmc-modules index.json
4
4
  *
5
5
  * 契约(与 sfmc/src/registry.ts#parseRegistryIndex 保持一致):
6
- * { modules: { <id>: { npm?, version?, sdk?, repo?, tag? } } }
6
+ * { modules: { <id>: { npm?, version?, sdk?, repo?, tag?, name?, description?, category?, license?, official?, requires? } } }
7
7
  * 条目至少具备 npm 或 repo+tag。`_` 前缀键视为元数据并忽略。
8
+ * requires 只有在全部是非空字符串时才保留;空数组表示没有额外依赖。缺字段表示索引没有声明依赖。
8
9
  */
9
10
 
10
11
  /**
11
- * @typedef {{ npm?: string, version?: string, sdk?: string, repo?: string, tag?: string }} RegistryEntry
12
+ * @typedef {{ npm?: string, version?: string, sdk?: string, repo?: string, tag?: string, name?: string, description?: string, category?: string, license?: string, official?: boolean, requires?: string[] }} RegistryEntry
12
13
  * @typedef {Record<string, RegistryEntry>} RegistryIndex
13
14
  */
14
15
 
16
+ /**
17
+ * @param {unknown} value
18
+ * @returns {string | undefined}
19
+ */
20
+ function optionalText(value) {
21
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
22
+ }
23
+
24
+ /**
25
+ * 索引 requires。格式不对时返回 undefined,让安装方拒绝,而不是当成没有依赖。
26
+ * @param {unknown} value
27
+ * @returns {string[] | undefined}
28
+ */
29
+ function optionalRequires(value) {
30
+ if (!Array.isArray(value)) return undefined;
31
+ /** @type {string[]} */
32
+ const items = [];
33
+ for (const item of value) {
34
+ if (typeof item !== "string" || !item.trim()) return undefined;
35
+ items.push(item.trim());
36
+ }
37
+ return items;
38
+ }
39
+
15
40
  /**
16
41
  * @param {unknown} json
17
42
  * @returns {RegistryIndex}
@@ -30,20 +55,32 @@ export function parseRegistryIndex(json) {
30
55
  if (k.startsWith("_")) continue;
31
56
  if (typeof v !== "object" || v === null || Array.isArray(v)) continue;
32
57
  const entry = /** @type {Record<string, unknown>} */ (v);
33
- const hasNpm = typeof entry.npm === "string" && entry.npm.length > 0;
34
- const hasGh = typeof entry.repo === "string" && typeof entry.tag === "string";
58
+ const npm = optionalText(entry.npm);
59
+ const repo = optionalText(entry.repo);
60
+ const tag = optionalText(entry.tag);
61
+ const hasNpm = Boolean(npm);
62
+ const hasGh = Boolean(repo && tag);
35
63
  if (!hasNpm && !hasGh) continue;
36
64
  /** @type {RegistryEntry} */
37
65
  const out = {};
38
- if (hasNpm) {
39
- out.npm = /** @type {string} */ (entry.npm);
40
- if (typeof entry.version === "string") out.version = entry.version;
41
- if (typeof entry.sdk === "string") out.sdk = entry.sdk;
42
- }
43
- if (hasGh) {
44
- out.repo = /** @type {string} */ (entry.repo);
45
- out.tag = /** @type {string} */ (entry.tag);
46
- }
66
+ if (npm) out.npm = npm;
67
+ const version = optionalText(entry.version);
68
+ const sdk = optionalText(entry.sdk);
69
+ const name = optionalText(entry.name);
70
+ const description = optionalText(entry.description);
71
+ const category = optionalText(entry.category);
72
+ const license = optionalText(entry.license);
73
+ const requires = optionalRequires(entry.requires);
74
+ if (version) out.version = version;
75
+ if (sdk) out.sdk = sdk;
76
+ if (repo) out.repo = repo;
77
+ if (repo && tag) out.tag = tag;
78
+ if (name) out.name = name;
79
+ if (description) out.description = description;
80
+ if (category) out.category = category;
81
+ if (license) out.license = license;
82
+ if (typeof entry.official === "boolean") out.official = entry.official;
83
+ if (requires !== undefined) out.requires = requires;
47
84
  filtered[k] = out;
48
85
  }
49
86
  return filtered;