@shadowob/shared 1.1.1 → 1.1.3-dev.261

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,457 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/play-catalog/index.ts
21
+ var play_catalog_exports = {};
22
+ __export(play_catalog_exports, {
23
+ DEFAULT_HOMEPLAY_CATALOG: () => DEFAULT_HOMEPLAY_CATALOG,
24
+ SHADOW_PLAY_SERVER_TEMPLATE: () => SHADOW_PLAY_SERVER_TEMPLATE,
25
+ getDefaultHomePlay: () => getDefaultHomePlay,
26
+ getPlayBuddyEmail: () => getPlayBuddyEmail,
27
+ getPlayBuddyUsername: () => getPlayBuddyUsername
28
+ });
29
+ module.exports = __toCommonJS(play_catalog_exports);
30
+ var playCover = (id) => `/home-assets/plays/${id}.jpg`;
31
+ var playTemplate = (id) => ({
32
+ template: {
33
+ kind: "cloud",
34
+ slug: id,
35
+ path: `apps/cloud/templates/${id}.template.json`
36
+ },
37
+ materials: { cover: playCover(id) }
38
+ });
39
+ var communityAction = (channelName, greeting) => ({
40
+ kind: "public_channel",
41
+ channelName,
42
+ buddyTemplateSlug: channelName,
43
+ ...greeting ? { greeting } : {}
44
+ });
45
+ var roomAction = (namePrefix, greeting) => ({
46
+ kind: "private_room",
47
+ namePrefix,
48
+ buddyTemplateSlug: namePrefix,
49
+ ...greeting ? { greeting } : {}
50
+ });
51
+ var cloudAction = (templateSlug, resourceTier = "lightweight", defaultChannelName) => ({
52
+ kind: "cloud_deploy",
53
+ templateSlug,
54
+ buddyTemplateSlug: templateSlug,
55
+ resourceTier,
56
+ ...defaultChannelName ? { defaultChannelName } : {}
57
+ });
58
+ function getPlayBuddyUsername(templateSlug) {
59
+ const normalized = templateSlug.trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "").slice(0, 27) || "play";
60
+ return `play_${normalized}`.slice(0, 32);
61
+ }
62
+ function getPlayBuddyEmail(templateSlug) {
63
+ return `${getPlayBuddyUsername(templateSlug)}@shadowob.bot`;
64
+ }
65
+ var SHADOW_PLAY_SERVER_TEMPLATE = {
66
+ slug: "shadow-plays",
67
+ name: "Shadow Plays",
68
+ description: "Default public community space for launchable homepage plays.",
69
+ channels: [
70
+ {
71
+ name: "general",
72
+ topic: "General discussion for new players and Shadow community members."
73
+ },
74
+ {
75
+ name: "world-pulse",
76
+ topic: "A public room for real-time global events and daily signal."
77
+ },
78
+ {
79
+ name: "financial-freedom",
80
+ topic: "A public room for lightweight financial freedom simulations and planning prompts."
81
+ },
82
+ {
83
+ name: "ai-werewolf",
84
+ topic: "A public room for AI-hosted social deduction sessions."
85
+ },
86
+ {
87
+ name: "code-arena",
88
+ topic: "A public room for coding challenges and real-time battles."
89
+ },
90
+ {
91
+ name: "brain-fix",
92
+ topic: "A calm public room for one-minute focus resets and reflection."
93
+ },
94
+ {
95
+ name: "gitstory",
96
+ topic: "A public room for turning software history into stories and retrospectives."
97
+ },
98
+ {
99
+ name: "gstack",
100
+ topic: "A public room for founder strategy, product stress tests, and launch planning."
101
+ }
102
+ ]
103
+ };
104
+ function cloudPlay(id, input) {
105
+ const { defaultChannelName, ...content } = input;
106
+ return {
107
+ id,
108
+ image: playCover(id),
109
+ status: "gated",
110
+ action: cloudAction(id, "lightweight", defaultChannelName),
111
+ gates: { auth: "required", membership: "required", profile: "optional" },
112
+ ...playTemplate(id),
113
+ ...content
114
+ };
115
+ }
116
+ var DEFAULT_HOMEPLAY_CATALOG = [
117
+ {
118
+ id: "retire-buddy",
119
+ image: playCover("retire-buddy"),
120
+ title: "\u9000\u4F11\u52A9\u624B",
121
+ titleEn: "RetireBuddy",
122
+ desc: "\u5E2E\u4F60\u89C4\u5212\u9000\u4F11\u751F\u6D3B\u3001\u8D22\u52A1\u81EA\u7531\u8DEF\u5F84\uFF0C24\u5C0F\u65F6\u6E29\u6696\u966A\u4F34\uFF0C\u8BA9\u544A\u522B\u804C\u573A\u53D8\u6210\u4EBA\u751F\u65B0\u7AE0\u8282\u3002",
123
+ descEn: "Plan your retirement and path to financial freedom with a warm 24/7 companion.",
124
+ category: "\u5FC3\u7406\u7597\u6108",
125
+ categoryEn: "Healing",
126
+ starts: "24.5k",
127
+ accentColor: "var(--shadow-accent)",
128
+ hot: true,
129
+ status: "available",
130
+ action: roomAction("retire-buddy"),
131
+ gates: { auth: "required", membership: "none", profile: "optional" },
132
+ ...playTemplate("retire-buddy")
133
+ },
134
+ {
135
+ id: "financial-freedom",
136
+ image: playCover("financial-freedom"),
137
+ title: "\u6211\u8D22\u5BCC\u81EA\u7531\u4E86\u5417\uFF1F",
138
+ titleEn: "Am I Free?",
139
+ desc: "\u8F93\u5165\u4F60\u7684\u8D44\u4EA7\u4E0E\u652F\u51FA\uFF0CAI \u4E3A\u4F60\u8BA1\u7B97\u8D22\u52A1\u81EA\u7531\u8DDD\u79BB\uFF0C\u7ED9\u51FA\u6E05\u6670\u7684\u8FBE\u6210\u8DEF\u7EBF\u56FE\u3002",
140
+ descEn: "Input your assets and expenses \u2014 get your financial freedom score and roadmap.",
141
+ category: "\u5FC3\u7406\u7597\u6108",
142
+ categoryEn: "Healing",
143
+ starts: "18.2k",
144
+ accentColor: "#f8e71c",
145
+ status: "available",
146
+ action: communityAction("financial-freedom"),
147
+ gates: { auth: "required", membership: "none", profile: "optional" },
148
+ ...playTemplate("financial-freedom")
149
+ },
150
+ {
151
+ id: "brain-fix",
152
+ image: playCover("brain-fix"),
153
+ title: "\u4E00\u5206\u949F\u4FEE\u590D\u4F60\u7684\u5927\u8111\uFF01",
154
+ titleEn: "1-Min Brain Fix",
155
+ desc: "\u79D1\u5B66\u51A5\u60F3 + \u5FAE\u547C\u5438\u7EC3\u4E60\uFF0C60\u79D2\u5185\u4ECE\u7126\u8651\u6A21\u5F0F\u5207\u6362\u5230\u4E13\u6CE8\u72B6\u6001\uFF0C\u5C61\u8BD5\u4E0D\u723D\u3002",
156
+ descEn: "Science-backed micro-meditation. Switch from anxious to focused in 60 seconds.",
157
+ category: "\u5FC3\u7406\u7597\u6108",
158
+ categoryEn: "Healing",
159
+ starts: "15.9k",
160
+ accentColor: "#a78bfa",
161
+ status: "available",
162
+ action: communityAction("brain-fix"),
163
+ gates: { auth: "required", membership: "none", profile: "optional" },
164
+ ...playTemplate("brain-fix")
165
+ },
166
+ {
167
+ id: "world-pulse",
168
+ image: playCover("world-pulse"),
169
+ title: "\u5730\u7403\u8109\u640F",
170
+ titleEn: "World Pulse",
171
+ desc: "\u5B9E\u65F6\u6293\u53D6\u5168\u7403\u91CD\u5927\u4E8B\u4EF6\uFF0C\u7528\u4E09\u53E5\u8BDD\u544A\u8BC9\u4F60\u4ECA\u5929\u771F\u6B63\u53D1\u751F\u4E86\u4EC0\u4E48\uFF0C\u65E0\u5E9F\u8BDD\u3002",
172
+ descEn: "Real-time global events in 3 sentences. No filler, just signal.",
173
+ category: "\u4E16\u754C\u8D44\u8BAF",
174
+ categoryEn: "World News",
175
+ starts: "14.1k",
176
+ accentColor: "#38bdf8",
177
+ status: "available",
178
+ action: communityAction("world-pulse"),
179
+ gates: { auth: "required", membership: "none", profile: "optional" },
180
+ ...playTemplate("world-pulse")
181
+ },
182
+ {
183
+ id: "daily-brief",
184
+ image: playCover("daily-brief"),
185
+ title: "\u6668\u95F4\u7B80\u62A5",
186
+ titleEn: "Morning Brief",
187
+ desc: "\u6BCF\u5929 7:00 \u63A8\u9001\u4E00\u4EFD\u5B9A\u5236\u65E9\u62A5\uFF1A\u56FD\u9645\u3001\u79D1\u6280\u3001\u5E02\u573A\u4E09\u5927\u677F\u5757\uFF0C\u8BFB\u5B8C\u53EA\u9700 3 \u5206\u949F\u3002",
188
+ descEn: "Custom morning digest at 7am \u2014 global news, tech, markets. 3-minute read.",
189
+ category: "\u4E16\u754C\u8D44\u8BAF",
190
+ categoryEn: "World News",
191
+ starts: "11.3k",
192
+ accentColor: "#fb923c",
193
+ status: "available",
194
+ action: roomAction("daily-brief"),
195
+ gates: { auth: "required", membership: "none", profile: "optional" },
196
+ ...playTemplate("daily-brief")
197
+ },
198
+ {
199
+ id: "ai-werewolf",
200
+ image: playCover("ai-werewolf"),
201
+ title: "AI \u72FC\u4EBA\u6740",
202
+ titleEn: "AI Werewolf",
203
+ desc: "AI \u62C5\u4EFB\u4E3B\u6301\uFF0C\u968F\u673A\u5206\u914D\u8EAB\u4EFD\uFF0C\u5728\u804A\u5929\u4E2D\u5C55\u5F00\u63A8\u7406\u4E0E\u535A\u5F08\uFF0C3 \u4EBA\u5373\u53EF\u5F00\u5C40\u3002",
204
+ descEn: "AI-hosted werewolf \u2014 roles assigned randomly, deduce, bluff, and vote. 3+ players.",
205
+ category: "\u4E92\u52A8\u6E38\u620F",
206
+ categoryEn: "Games",
207
+ starts: "20.8k",
208
+ accentColor: "#f87171",
209
+ hot: true,
210
+ status: "available",
211
+ action: communityAction("ai-werewolf"),
212
+ gates: { auth: "required", membership: "none", profile: "optional" },
213
+ ...playTemplate("ai-werewolf")
214
+ },
215
+ {
216
+ id: "code-arena",
217
+ image: playCover("code-arena"),
218
+ title: "\u4EE3\u7801\u64C2\u53F0",
219
+ titleEn: "Code Arena",
220
+ desc: "\u5B9E\u65F6\u7F16\u7A0B\u5BF9\u6218\uFF0CAI \u51FA\u9898\u3001\u8BA1\u65F6\u3001\u81EA\u52A8\u8BC4\u6D4B\uFF0C\u6311\u6218\u597D\u53CB\u6216\u5339\u914D\u964C\u751F\u5BF9\u624B\u3002",
221
+ descEn: "Real-time coding battles \u2014 AI generates problems, auto-judges, ranks you live.",
222
+ category: "\u4E92\u52A8\u6E38\u620F",
223
+ categoryEn: "Games",
224
+ starts: "8.6k",
225
+ accentColor: "#fbbf24",
226
+ status: "available",
227
+ action: communityAction("code-arena"),
228
+ gates: { auth: "required", membership: "none", profile: "optional" },
229
+ ...playTemplate("code-arena")
230
+ },
231
+ {
232
+ id: "gitstory",
233
+ image: playCover("gitstory"),
234
+ title: "GitStory",
235
+ titleEn: "GitStory",
236
+ desc: "\u628A\u4F60\u7684 GitHub \u63D0\u4EA4\u5386\u53F2\u53D8\u6210\u4E00\u672C\u81EA\u4F20\u5C0F\u8BF4\u2014\u2014AI \u5E2E\u4F60\u56DE\u987E\u6BCF\u4E00\u6BB5\u4EE3\u7801\u80CC\u540E\u7684\u6545\u4E8B\u3002",
237
+ descEn: "Turn your GitHub commits into an autobiography. Every line of code has a story.",
238
+ category: "\u9ED1\u5BA2\u4E0E\u753B\u5BB6",
239
+ categoryEn: "Hacker & Painter",
240
+ starts: "12.1k",
241
+ accentColor: "#34d399",
242
+ hot: true,
243
+ status: "available",
244
+ action: communityAction("gitstory"),
245
+ gates: { auth: "required", membership: "none", profile: "optional" },
246
+ ...playTemplate("gitstory")
247
+ },
248
+ {
249
+ id: "gstack",
250
+ image: playCover("gstack"),
251
+ title: "gstack",
252
+ titleEn: "gstack",
253
+ desc: "\u521B\u4E1A\u8005\u7684 AI \u53C2\u8C0B\uFF0C\u5E2E\u4F60\u5FEB\u901F\u9A8C\u8BC1\u5546\u4E1A\u60F3\u6CD5\u3001\u5206\u6790\u7ADE\u4E89\u683C\u5C40\u3001\u751F\u6210\u878D\u8D44\u6587\u4EF6\u3002",
254
+ descEn: "AI co-founder for founders. Validate ideas, map competitors, generate pitch decks.",
255
+ category: "\u9ED1\u5BA2\u4E0E\u753B\u5BB6",
256
+ categoryEn: "Hacker & Painter",
257
+ starts: "9.3k",
258
+ accentColor: "#f97316",
259
+ status: "available",
260
+ action: communityAction("gstack"),
261
+ gates: { auth: "required", membership: "none", profile: "optional" },
262
+ ...playTemplate("gstack")
263
+ },
264
+ {
265
+ id: "little-match-girl",
266
+ image: "/home-assets/topics/night-radio.jpg",
267
+ title: "\u5356\u706B\u67F4\u7684\u5C0F\u5973\u5B69",
268
+ titleEn: "Little Match Girl",
269
+ desc: "\u90E8\u7F72\u4E00\u4E2A\u4F1A\u63A8\u9500\u706B\u67F4\u7684\u7AE5\u8BDD Buddy\uFF0C\u8D2D\u4E70\u540E\u5728\u804A\u5929\u53F3\u4FA7\u6253\u5F00\u706B\u67F4\u52A8\u753B\u4ED8\u8D39\u6587\u4EF6\u3002",
270
+ descEn: "Deploy a fairy-tale Buddy who sells glowing matches and unlocks a paid HTML flame animation.",
271
+ category: "MVP \u5B9E\u9A8C",
272
+ categoryEn: "MVP Labs",
273
+ starts: "1.2k",
274
+ accentColor: "#f59e0b",
275
+ hot: true,
276
+ status: "gated",
277
+ action: cloudAction("little-match-girl", "lightweight", "match-street"),
278
+ gates: { auth: "required", membership: "required", profile: "optional" },
279
+ ...playTemplate("little-match-girl"),
280
+ materials: { cover: "/home-assets/topics/night-radio.jpg" }
281
+ },
282
+ cloudPlay("agent-marketplace-buddy", {
283
+ title: "Agent Marketplace Buddy",
284
+ titleEn: "Agent Marketplace Buddy",
285
+ desc: "\u53EF\u7EC4\u5408\u4E13\u5BB6 agent \u5E02\u573A\uFF0C\u8986\u76D6\u5F00\u53D1\u3001\u5B89\u5168\u3001\u57FA\u7840\u8BBE\u65BD\u3001\u6570\u636E\u3001\u6587\u6863\u3001SEO \u548C workflow \u7F16\u6392\u3002",
286
+ descEn: "A composable specialist-agent marketplace for development, security, infra, data, docs, SEO, and workflow orchestration.",
287
+ category: "Buddy \u56E2\u961F",
288
+ categoryEn: "Buddy Teams",
289
+ starts: "16.4k",
290
+ accentColor: "#22d3ee",
291
+ hot: true,
292
+ defaultChannelName: "choose"
293
+ }),
294
+ cloudPlay("bmad-method-buddy", {
295
+ title: "BMAD \u65B9\u6CD5 Buddy",
296
+ titleEn: "BMAD Method Buddy",
297
+ desc: "\u5B8C\u6574 BMAD \u65B9\u6CD5\u8BBA\u56E2\u961F\uFF1A\u5206\u6790\u5E08\u3001PM\u3001\u67B6\u6784\u5E08\u3001Scrum Master\u3001\u5F00\u53D1\u3001QA\uFF0C\u8D2F\u7A7F\u89C4\u5212\u5230\u4EA4\u4ED8\u3002",
298
+ descEn: "A full BMAD method team: analyst, PM, architect, scrum master, dev, and QA from planning to delivery.",
299
+ category: "Buddy \u56E2\u961F",
300
+ categoryEn: "Buddy Teams",
301
+ starts: "13.7k",
302
+ accentColor: "#60a5fa",
303
+ defaultChannelName: "delivery"
304
+ }),
305
+ cloudPlay("claude-ads-buddy", {
306
+ title: "Claude Ads Buddy",
307
+ titleEn: "Claude Ads Buddy",
308
+ desc: "\u4ED8\u8D39\u6295\u653E\u8BCA\u65AD\u3001\u9884\u7B97\u5EFA\u6A21\u3001\u521B\u610F\u5BA1\u67E5\u3001\u8FFD\u8E2A\u95EE\u9898\u548C\u843D\u5730\u9875\u74F6\u9888\u5206\u6790\u3002",
309
+ descEn: "Paid ads audits, budget models, creative review, tracking issues, and landing-page bottlenecks.",
310
+ category: "\u8425\u9500\u6280\u80FD",
311
+ categoryEn: "Marketing Skills",
312
+ starts: "10.8k",
313
+ accentColor: "#fb7185"
314
+ }),
315
+ cloudPlay("claude-seo-buddy", {
316
+ title: "Claude SEO Buddy",
317
+ titleEn: "Claude SEO Buddy",
318
+ desc: "SEO \u5185\u5BB9\u548C\u6280\u672F\u5BA1\u67E5\u56E2\u961F\uFF0C\u8986\u76D6\u5173\u952E\u8BCD\u3001\u5185\u94FE\u3001\u7ED3\u6784\u5316\u6570\u636E\u3001\u9875\u9762\u8D28\u91CF\u548C\u589E\u957F\u8BA1\u5212\u3002",
319
+ descEn: "SEO content and technical review for keywords, links, schema, quality, and growth plans.",
320
+ category: "\u8425\u9500\u6280\u80FD",
321
+ categoryEn: "Marketing Skills",
322
+ starts: "12.6k",
323
+ accentColor: "#84cc16"
324
+ }),
325
+ cloudPlay("everything-claude-code-buddy", {
326
+ title: "Everything Claude Code Buddy",
327
+ titleEn: "Everything Claude Code Buddy",
328
+ desc: "Claude Code \u5DE5\u4F5C\u6D41\u3001\u547D\u4EE4\u548C\u5DE5\u7A0B\u5B9E\u8DF5\u5408\u96C6\uFF0C\u9002\u5408\u7814\u53D1\u56E2\u961F\u6C89\u6DC0\u81EA\u52A8\u5316\u80FD\u529B\u3002",
329
+ descEn: "Claude Code workflows, commands, and engineering practices for automation-heavy teams.",
330
+ category: "\u5F00\u53D1\u6280\u80FD",
331
+ categoryEn: "Developer Skills",
332
+ starts: "19.2k",
333
+ accentColor: "#c084fc",
334
+ hot: true
335
+ }),
336
+ cloudPlay("google-workspace-buddy", {
337
+ title: "Google Workspace Buddy",
338
+ titleEn: "Google Workspace Buddy",
339
+ desc: "\u628A Docs\u3001Sheets\u3001Drive\u3001\u65E5\u5386\u548C\u90AE\u4EF6\u534F\u4F5C\u7F16\u6392\u5230 Buddy \u5DE5\u4F5C\u6D41\u91CC\u3002",
340
+ descEn: "Coordinate Docs, Sheets, Drive, Calendar, and email collaboration through Buddy workflows.",
341
+ category: "\u6548\u7387\u5DE5\u5177",
342
+ categoryEn: "Productivity",
343
+ starts: "9.9k",
344
+ accentColor: "#34d399"
345
+ }),
346
+ cloudPlay("gsd-buddy", {
347
+ title: "GSD Buddy",
348
+ titleEn: "GSD Buddy",
349
+ desc: "\u6267\u884C\u529B\u56E2\u961F\uFF1A\u62C6\u89E3\u4EFB\u52A1\u3001\u6392\u4F18\u5148\u7EA7\u3001\u63A8\u52A8\u51B3\u7B56\u3001\u8FFD\u8E2A\u963B\u585E\uFF0C\u5E2E\u56E2\u961F\u6301\u7EED get stuff done\u3002",
350
+ descEn: "Execution team for task breakdown, priority, decisions, blockers, and getting stuff done.",
351
+ category: "\u6548\u7387\u5DE5\u5177",
352
+ categoryEn: "Productivity",
353
+ starts: "17.5k",
354
+ accentColor: "#facc15",
355
+ hot: true
356
+ }),
357
+ cloudPlay("gstack-buddy", {
358
+ title: "gstack \u6218\u7565 Buddy",
359
+ titleEn: "gstack Strategy Buddy",
360
+ desc: "YC \u98CE\u683C\u4EA7\u54C1\u538B\u529B\u6D4B\u8BD5\u3001CEO \u89C6\u89D2\u8303\u56F4\u8BC4\u5BA1\u3001\u8C03\u67E5\u7EAA\u5F8B\u3001\u5468\u590D\u76D8\u548C gstack \u811A\u672C\u5DE5\u5177\u3002",
361
+ descEn: "YC-style product pressure testing, CEO scope review, investigation discipline, retros, and gstack scripts.",
362
+ category: "\u9ED1\u5BA2\u4E0E\u753B\u5BB6",
363
+ categoryEn: "Hacker & Painter",
364
+ starts: "15.1k",
365
+ accentColor: "#fb923c",
366
+ hot: true,
367
+ defaultChannelName: "office-hours"
368
+ }),
369
+ cloudPlay("marketingskills-buddy", {
370
+ title: "\u8425\u9500\u6280\u80FD Buddy",
371
+ titleEn: "MarketingSkills Buddy",
372
+ desc: "\u589E\u957F\u56E2\u961F\u7684\u8425\u9500\u534F\u4F5C\u667A\u80FD\u4F53\uFF0C\u8986\u76D6 CRO\u3001\u6587\u6848\u3001SEO\u3001\u4ED8\u8D39\u3001\u90AE\u4EF6\u548C\u589E\u957F\u51B3\u7B56\u3002",
373
+ descEn: "Marketing collaboration agents for CRO, copy, SEO, paid, email, and growth decisions.",
374
+ category: "\u8425\u9500\u6280\u80FD",
375
+ categoryEn: "Marketing Skills",
376
+ starts: "11.7k",
377
+ accentColor: "#f472b6"
378
+ }),
379
+ cloudPlay("scientific-skills-buddy", {
380
+ title: "\u79D1\u7814\u6280\u80FD Buddy",
381
+ titleEn: "Scientific Skills Buddy",
382
+ desc: "\u7814\u7A76\u9605\u8BFB\u3001\u5B9E\u9A8C\u8BBE\u8BA1\u3001\u8BBA\u6587\u7ED3\u6784\u3001\u6570\u636E\u5206\u6790\u548C\u5B66\u672F\u5199\u4F5C\u534F\u4F5C\u56E2\u961F\u3002",
383
+ descEn: "Research reading, experiment design, paper structure, data analysis, and academic writing workflows.",
384
+ category: "\u79D1\u7814\u6280\u80FD",
385
+ categoryEn: "Research Skills",
386
+ starts: "7.8k",
387
+ accentColor: "#38bdf8"
388
+ }),
389
+ cloudPlay("seomachine-buddy", {
390
+ title: "SEO Machine Buddy",
391
+ titleEn: "SEO Machine Buddy",
392
+ desc: "\u6301\u7EED\u8FD0\u884C\u7684 SEO \u673A\u5668\uFF1A\u9009\u9898\u3001brief\u3001\u5185\u5BB9\u5BA1\u67E5\u3001\u6280\u672F\u68C0\u67E5\u548C\u6392\u540D\u590D\u76D8\u3002",
393
+ descEn: "An always-on SEO machine for topics, briefs, review, technical checks, and ranking retros.",
394
+ category: "\u8425\u9500\u6280\u80FD",
395
+ categoryEn: "Marketing Skills",
396
+ starts: "10.2k",
397
+ accentColor: "#a3e635"
398
+ }),
399
+ cloudPlay("slavingia-skills-buddy", {
400
+ title: "Slavingia Skills Buddy",
401
+ titleEn: "Slavingia Skills Buddy",
402
+ desc: "\u521B\u4F5C\u8005\u548C\u72EC\u7ACB\u5F00\u53D1\u8005\u7684\u6280\u80FD\u5E93\uFF0C\u8986\u76D6\u5199\u4F5C\u3001\u4EA7\u54C1\u3001\u589E\u957F\u3001\u793E\u533A\u548C\u53D1\u5E03\u8282\u594F\u3002",
403
+ descEn: "A creator and indie-builder skill stack for writing, product, growth, community, and shipping rhythm.",
404
+ category: "\u521B\u4F5C\u8005\u6280\u80FD",
405
+ categoryEn: "Creator Skills",
406
+ starts: "8.4k",
407
+ accentColor: "#f97316"
408
+ }),
409
+ cloudPlay("superclaude-buddy", {
410
+ title: "SuperClaude Buddy",
411
+ titleEn: "SuperClaude Buddy",
412
+ desc: "SuperClaude \u6307\u4EE4\u3001\u89D2\u8272\u548C\u5DE5\u4F5C\u6D41\u80FD\u529B\uFF0C\u5E2E\u52A9\u56E2\u961F\u628A Claude \u7528\u6210\u7ED3\u6784\u5316\u5DE5\u7A0B\u4F19\u4F34\u3002",
413
+ descEn: "SuperClaude commands, personas, and workflows for structured engineering collaboration.",
414
+ category: "\u5F00\u53D1\u6280\u80FD",
415
+ categoryEn: "Developer Skills",
416
+ starts: "18.9k",
417
+ accentColor: "#818cf8",
418
+ hot: true
419
+ }),
420
+ cloudPlay("superpowers-buddy", {
421
+ title: "Superpowers Buddy",
422
+ titleEn: "Superpowers Buddy",
423
+ desc: "\u4E2A\u4EBA\u751F\u4EA7\u529B\u8D85\u80FD\u529B\u7EC4\u5408\uFF1A\u9605\u8BFB\u3001\u5199\u4F5C\u3001\u4EFB\u52A1\u3001\u7814\u7A76\u3001\u81EA\u52A8\u5316\u548C\u590D\u76D8\u3002",
424
+ descEn: "Personal productivity superpowers for reading, writing, tasks, research, automation, and retros.",
425
+ category: "\u6548\u7387\u5DE5\u5177",
426
+ categoryEn: "Productivity",
427
+ starts: "12.4k",
428
+ accentColor: "#2dd4bf"
429
+ }),
430
+ {
431
+ id: "e-wife",
432
+ image: playCover("e-wife"),
433
+ title: "\u7535\u5B50\u8001\u5A46",
434
+ titleEn: "E-Wife",
435
+ desc: "\u4E00\u4E2A\u5E26\u6709\u966A\u4F34\u611F\u7684\u865A\u62DF\u751F\u6D3B\u4F19\u4F34\u73A9\u6CD5\uFF0C\u540E\u7EED\u4F1A\u63A5\u5165\u4E2A\u6027\u5316\u8BB0\u5FC6\u548C\u79C1\u6709\u623F\u95F4\u3002",
436
+ descEn: "A companion-style virtual life partner play, later connected to memory and private rooms.",
437
+ category: "\u5FC3\u7406\u7597\u6108",
438
+ categoryEn: "Healing",
439
+ starts: "22.0k",
440
+ accentColor: "#f0abfc",
441
+ status: "available",
442
+ action: roomAction("e-wife"),
443
+ gates: { auth: "required", membership: "none", profile: "optional" },
444
+ ...playTemplate("e-wife")
445
+ }
446
+ ];
447
+ function getDefaultHomePlay(playId) {
448
+ return DEFAULT_HOMEPLAY_CATALOG.find((play) => play.id === playId) ?? null;
449
+ }
450
+ // Annotate the CommonJS export names for ESM import in node:
451
+ 0 && (module.exports = {
452
+ DEFAULT_HOMEPLAY_CATALOG,
453
+ SHADOW_PLAY_SERVER_TEMPLATE,
454
+ getDefaultHomePlay,
455
+ getPlayBuddyEmail,
456
+ getPlayBuddyUsername
457
+ });
@@ -0,0 +1,77 @@
1
+ type ShadowPlayAvailability = 'available' | 'gated' | 'coming_soon' | 'misconfigured';
2
+ type PlayActionBase = {
3
+ buddyUserIds?: string[];
4
+ buddyTemplateSlug?: string;
5
+ greeting?: string;
6
+ };
7
+ type ShadowPlayAction = (PlayActionBase & {
8
+ kind: 'public_channel';
9
+ serverId?: string;
10
+ serverSlug?: string;
11
+ channelId?: string;
12
+ channelName?: string;
13
+ inviteCode?: string;
14
+ }) | (PlayActionBase & {
15
+ kind: 'private_room';
16
+ serverId?: string;
17
+ serverSlug?: string;
18
+ namePrefix?: string;
19
+ }) | (PlayActionBase & {
20
+ kind: 'cloud_deploy';
21
+ templateSlug: string;
22
+ resourceTier?: 'lightweight' | 'standard' | 'pro';
23
+ defaultChannelName?: string;
24
+ }) | {
25
+ kind: 'external_oauth_app';
26
+ clientId: string;
27
+ redirectUri: string;
28
+ scopes?: string[];
29
+ state?: string;
30
+ } | {
31
+ kind: 'landing_page';
32
+ url: string;
33
+ };
34
+ interface ShadowHomePlayCatalogItem {
35
+ id: string;
36
+ image: string;
37
+ title: string;
38
+ titleEn: string;
39
+ desc: string;
40
+ descEn: string;
41
+ category: string;
42
+ categoryEn: string;
43
+ starts: string;
44
+ accentColor: string;
45
+ hot?: boolean;
46
+ status: ShadowPlayAvailability;
47
+ action?: ShadowPlayAction;
48
+ gates?: {
49
+ auth?: 'optional' | 'required';
50
+ membership?: 'none' | 'required';
51
+ profile?: 'optional' | 'required';
52
+ };
53
+ template?: {
54
+ kind: 'cloud';
55
+ slug: string;
56
+ path: string;
57
+ };
58
+ materials?: {
59
+ cover: string;
60
+ };
61
+ }
62
+ interface ShadowPlayServerTemplate {
63
+ slug: string;
64
+ name: string;
65
+ description: string;
66
+ channels: Array<{
67
+ name: string;
68
+ topic: string;
69
+ }>;
70
+ }
71
+ declare function getPlayBuddyUsername(templateSlug: string): string;
72
+ declare function getPlayBuddyEmail(templateSlug: string): string;
73
+ declare const SHADOW_PLAY_SERVER_TEMPLATE: ShadowPlayServerTemplate;
74
+ declare const DEFAULT_HOMEPLAY_CATALOG: ShadowHomePlayCatalogItem[];
75
+ declare function getDefaultHomePlay(playId: string): ShadowHomePlayCatalogItem | null;
76
+
77
+ export { DEFAULT_HOMEPLAY_CATALOG, SHADOW_PLAY_SERVER_TEMPLATE, type ShadowHomePlayCatalogItem, type ShadowPlayAction, type ShadowPlayAvailability, type ShadowPlayServerTemplate, getDefaultHomePlay, getPlayBuddyEmail, getPlayBuddyUsername };
@@ -0,0 +1,77 @@
1
+ type ShadowPlayAvailability = 'available' | 'gated' | 'coming_soon' | 'misconfigured';
2
+ type PlayActionBase = {
3
+ buddyUserIds?: string[];
4
+ buddyTemplateSlug?: string;
5
+ greeting?: string;
6
+ };
7
+ type ShadowPlayAction = (PlayActionBase & {
8
+ kind: 'public_channel';
9
+ serverId?: string;
10
+ serverSlug?: string;
11
+ channelId?: string;
12
+ channelName?: string;
13
+ inviteCode?: string;
14
+ }) | (PlayActionBase & {
15
+ kind: 'private_room';
16
+ serverId?: string;
17
+ serverSlug?: string;
18
+ namePrefix?: string;
19
+ }) | (PlayActionBase & {
20
+ kind: 'cloud_deploy';
21
+ templateSlug: string;
22
+ resourceTier?: 'lightweight' | 'standard' | 'pro';
23
+ defaultChannelName?: string;
24
+ }) | {
25
+ kind: 'external_oauth_app';
26
+ clientId: string;
27
+ redirectUri: string;
28
+ scopes?: string[];
29
+ state?: string;
30
+ } | {
31
+ kind: 'landing_page';
32
+ url: string;
33
+ };
34
+ interface ShadowHomePlayCatalogItem {
35
+ id: string;
36
+ image: string;
37
+ title: string;
38
+ titleEn: string;
39
+ desc: string;
40
+ descEn: string;
41
+ category: string;
42
+ categoryEn: string;
43
+ starts: string;
44
+ accentColor: string;
45
+ hot?: boolean;
46
+ status: ShadowPlayAvailability;
47
+ action?: ShadowPlayAction;
48
+ gates?: {
49
+ auth?: 'optional' | 'required';
50
+ membership?: 'none' | 'required';
51
+ profile?: 'optional' | 'required';
52
+ };
53
+ template?: {
54
+ kind: 'cloud';
55
+ slug: string;
56
+ path: string;
57
+ };
58
+ materials?: {
59
+ cover: string;
60
+ };
61
+ }
62
+ interface ShadowPlayServerTemplate {
63
+ slug: string;
64
+ name: string;
65
+ description: string;
66
+ channels: Array<{
67
+ name: string;
68
+ topic: string;
69
+ }>;
70
+ }
71
+ declare function getPlayBuddyUsername(templateSlug: string): string;
72
+ declare function getPlayBuddyEmail(templateSlug: string): string;
73
+ declare const SHADOW_PLAY_SERVER_TEMPLATE: ShadowPlayServerTemplate;
74
+ declare const DEFAULT_HOMEPLAY_CATALOG: ShadowHomePlayCatalogItem[];
75
+ declare function getDefaultHomePlay(playId: string): ShadowHomePlayCatalogItem | null;
76
+
77
+ export { DEFAULT_HOMEPLAY_CATALOG, SHADOW_PLAY_SERVER_TEMPLATE, type ShadowHomePlayCatalogItem, type ShadowPlayAction, type ShadowPlayAvailability, type ShadowPlayServerTemplate, getDefaultHomePlay, getPlayBuddyEmail, getPlayBuddyUsername };
@@ -0,0 +1,14 @@
1
+ import {
2
+ DEFAULT_HOMEPLAY_CATALOG,
3
+ SHADOW_PLAY_SERVER_TEMPLATE,
4
+ getDefaultHomePlay,
5
+ getPlayBuddyEmail,
6
+ getPlayBuddyUsername
7
+ } from "../chunk-EXZEQO5X.js";
8
+ export {
9
+ DEFAULT_HOMEPLAY_CATALOG,
10
+ SHADOW_PLAY_SERVER_TEMPLATE,
11
+ getDefaultHomePlay,
12
+ getPlayBuddyEmail,
13
+ getPlayBuddyUsername
14
+ };